diff --git a/agent/assistant/chat.go b/agent/assistant/chat.go index e8166ecd..6a3fa892 100644 --- a/agent/assistant/chat.go +++ b/agent/assistant/chat.go @@ -243,8 +243,14 @@ func (ast *Assistant) InitBuffer(ctx *agentcontext.Context) { requestID = uuid.New().String() } - ctx.Buffer = agentcontext.NewChatBuffer(ctx.ChatID, requestID, ast.ID) - log.Trace("[CHAT] Buffer initialized: chatID=%s, requestID=%s, assistantID=%s", ctx.ChatID, requestID, ast.ID) + // Get connector from options + connector := "" + if ctx.Stack.Options != nil { + connector = ctx.Stack.Options.Connector + } + + ctx.Buffer = agentcontext.NewChatBuffer(ctx.ChatID, requestID, ast.ID, connector) + log.Trace("[CHAT] Buffer initialized: chatID=%s, requestID=%s, assistantID=%s, connector=%s", ctx.ChatID, requestID, ast.ID, connector) } // BufferUserInput adds user input messages to the buffer @@ -335,13 +341,18 @@ func (ast *Assistant) FlushBuffer(ctx *agentcontext.Context, finalStatus string, } } - // 2. Update chat last_message_at + // 2. Update chat last_message_at and last_connector if len(messages) > 0 { now := time.Now() - if updateErr := chatStore.UpdateChat(ctx.ChatID, map[string]interface{}{ + updates := map[string]interface{}{ "last_message_at": now, - }); updateErr != nil { - log.Trace("[CHAT] Failed to update last_message_at: %v", updateErr) + } + // Also update last_connector if available + if connector := ctx.Buffer.Connector(); connector != "" { + updates["last_connector"] = connector + } + if updateErr := chatStore.UpdateChat(ctx.ChatID, updates); updateErr != nil { + log.Trace("[CHAT] Failed to update chat: %v", updateErr) } } @@ -376,6 +387,7 @@ func (ast *Assistant) convertBufferedMessages(buffered []*agentcontext.BufferedM BlockID: msg.BlockID, ThreadID: msg.ThreadID, AssistantID: msg.AssistantID, + Connector: msg.Connector, Sequence: msg.Sequence, Metadata: msg.Metadata, CreatedAt: msg.CreatedAt, @@ -422,6 +434,11 @@ func (ast *Assistant) EnsureChat(ctx *agentcontext.Context) error { return nil // No chat ID, skip } + // Skip if history is disabled + if ctx.Stack != nil && ctx.Stack.Options != nil && ctx.Stack.Options.Skip != nil && ctx.Stack.Options.Skip.History { + return nil // Skip.History is true, don't create chat session + } + chatStore := GetChatStore() if chatStore == nil { return nil // No store, skip @@ -445,6 +462,11 @@ func (ast *Assistant) EnsureChat(ctx *agentcontext.Context) error { UpdatedAt: time.Now(), } + // Set last_connector from options (user selected connector) + if ctx.Stack != nil && ctx.Stack.Options != nil && ctx.Stack.Options.Connector != "" { + chat.LastConnector = ctx.Stack.Options.Connector + } + // Set permission fields from authorized info if ctx.Authorized != nil { chat.CreatedBy = ctx.Authorized.UserID diff --git a/agent/assistant/chat_test.go b/agent/assistant/chat_test.go index d15855d7..1cad5401 100644 --- a/agent/assistant/chat_test.go +++ b/agent/assistant/chat_test.go @@ -799,6 +799,34 @@ func TestEnsureChat(t *testing.T) { t.Logf("✓ Chat created with permission fields: user=%s, team=%s, tenant=%s", chat.CreatedBy, chat.TeamID, chat.TenantID) }) + + t.Run("SkipHistoryEnabled", func(t *testing.T) { + chatID := fmt.Sprintf("test_ensure_skip_%s", uuid.New().String()[:8]) + + // Create context + ctx := agentcontext.New(context.Background(), nil, chatID) + + // Set up stack with Skip.History = true + ctx.Stack = &agentcontext.Stack{ + ID: "test_stack", + AssistantID: ast.ID, + Depth: 0, + Options: &agentcontext.Options{ + Skip: &agentcontext.Skip{ + History: true, + }, + }, + } + + // EnsureChat should NOT create chat when Skip.History is true + err := ast.EnsureChat(ctx) + assert.NoError(t, err) + + // Verify chat was NOT created + _, err = chatStore.GetChat(chatID) + assert.Error(t, err, "Chat should not be created when Skip.History is true") + t.Logf("✓ Chat not created when Skip.History is true") + }) } func TestConvertBufferedTypes(t *testing.T) { diff --git a/agent/context/buffer.go b/agent/context/buffer.go index d095ad6e..d88d874d 100644 --- a/agent/context/buffer.go +++ b/agent/context/buffer.go @@ -18,6 +18,7 @@ type ChatBuffer struct { chatID string requestID string assistantID string + connector string // Current connector ID (for data analysis) // Message buffer messages []*BufferedMessage @@ -45,6 +46,7 @@ type BufferedMessage struct { BlockID string `json:"block_id,omitempty"` ThreadID string `json:"thread_id,omitempty"` AssistantID string `json:"assistant_id,omitempty"` + Connector string `json:"connector,omitempty"` // Connector ID used for this message Sequence int `json:"sequence"` Metadata map[string]interface{} `json:"metadata,omitempty"` CreatedAt time.Time `json:"created_at"` @@ -94,11 +96,12 @@ const ( ) // NewChatBuffer creates a new chat buffer -func NewChatBuffer(chatID, requestID, assistantID string) *ChatBuffer { +func NewChatBuffer(chatID, requestID, assistantID, connector string) *ChatBuffer { return &ChatBuffer{ chatID: chatID, requestID: requestID, assistantID: assistantID, + connector: connector, messages: make([]*BufferedMessage, 0), steps: make([]*BufferedStep, 0), } @@ -170,6 +173,7 @@ func (b *ChatBuffer) AddAssistantMessage(msgType string, props map[string]interf BlockID: blockID, ThreadID: threadID, AssistantID: assistantID, + Connector: b.connector, // Use current connector Metadata: metadata, }) } @@ -342,6 +346,18 @@ func (b *ChatBuffer) SetAssistantID(assistantID string) { b.assistantID = assistantID } +// Connector returns the current connector ID +func (b *ChatBuffer) Connector() string { + return b.connector +} + +// SetConnector updates the connector ID (when user switches connector) +func (b *ChatBuffer) SetConnector(connector string) { + b.mu.Lock() + defer b.mu.Unlock() + b.connector = connector +} + // ============================================================================= // Helper Functions // ============================================================================= diff --git a/agent/context/buffer_test.go b/agent/context/buffer_test.go index af226bbb..f1e8434b 100644 --- a/agent/context/buffer_test.go +++ b/agent/context/buffer_test.go @@ -17,7 +17,7 @@ import ( func TestBufferNewChatBuffer(t *testing.T) { t.Run("CreateWithAllFields", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-123", "req-456", "assistant-789") + buffer := context.NewChatBuffer("chat-123", "req-456", "assistant-789", "") assert.NotNil(t, buffer) assert.Equal(t, "chat-123", buffer.ChatID()) @@ -29,7 +29,7 @@ func TestBufferNewChatBuffer(t *testing.T) { }) t.Run("CreateWithEmptyFields", func(t *testing.T) { - buffer := context.NewChatBuffer("", "", "") + buffer := context.NewChatBuffer("", "", "", "") assert.NotNil(t, buffer) assert.Empty(t, buffer.ChatID()) @@ -44,7 +44,7 @@ func TestBufferNewChatBuffer(t *testing.T) { func TestBufferAddMessage(t *testing.T) { t.Run("AddSingleMessage", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-1", "req-1", "assistant-1") + buffer := context.NewChatBuffer("chat-1", "req-1", "assistant-1", "") msg := &context.BufferedMessage{ Role: "assistant", @@ -65,7 +65,7 @@ func TestBufferAddMessage(t *testing.T) { }) t.Run("AddMultipleMessages", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-2", "req-2", "assistant-2") + buffer := context.NewChatBuffer("chat-2", "req-2", "assistant-2", "") for i := 0; i < 5; i++ { buffer.AddMessage(&context.BufferedMessage{ @@ -85,14 +85,14 @@ func TestBufferAddMessage(t *testing.T) { }) t.Run("AddNilMessage", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-3", "req-3", "assistant-3") + buffer := context.NewChatBuffer("chat-3", "req-3", "assistant-3", "") buffer.AddMessage(nil) assert.Equal(t, 0, buffer.GetMessageCount()) }) t.Run("AddMessageWithExistingID", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-4", "req-4", "assistant-4") + buffer := context.NewChatBuffer("chat-4", "req-4", "assistant-4", "") msg := &context.BufferedMessage{ MessageID: "custom-id-123", @@ -107,7 +107,7 @@ func TestBufferAddMessage(t *testing.T) { }) t.Run("AddMessageWithExistingTimestamp", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-5", "req-5", "assistant-5") + buffer := context.NewChatBuffer("chat-5", "req-5", "assistant-5", "") customTime := time.Date(2024, 1, 1, 12, 0, 0, 0, time.UTC) msg := &context.BufferedMessage{ @@ -125,7 +125,7 @@ func TestBufferAddMessage(t *testing.T) { func TestBufferAddUserInput(t *testing.T) { t.Run("AddStringContent", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-1", "req-1", "assistant-1") + buffer := context.NewChatBuffer("chat-1", "req-1", "assistant-1", "") buffer.AddUserInput("What is the weather?", "") messages := buffer.GetMessages() @@ -137,7 +137,7 @@ func TestBufferAddUserInput(t *testing.T) { }) t.Run("AddUserInputWithName", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-2", "req-2", "assistant-2") + buffer := context.NewChatBuffer("chat-2", "req-2", "assistant-2", "") buffer.AddUserInput("Hello", "John") messages := buffer.GetMessages() @@ -146,7 +146,7 @@ func TestBufferAddUserInput(t *testing.T) { }) t.Run("AddComplexContent", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-3", "req-3", "assistant-3") + buffer := context.NewChatBuffer("chat-3", "req-3", "assistant-3", "") complexContent := []map[string]interface{}{ {"type": "text", "text": "Look at this image"}, {"type": "image_url", "image_url": map[string]string{"url": "https://example.com/image.jpg"}}, @@ -163,7 +163,7 @@ func TestBufferAddUserInput(t *testing.T) { func TestBufferAddAssistantMessage(t *testing.T) { t.Run("AddTextMessage", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-1", "req-1", "assistant-1") + buffer := context.NewChatBuffer("chat-1", "req-1", "assistant-1", "") buffer.AddAssistantMessage( "text", map[string]interface{}{"content": "Hello, how can I help?"}, @@ -184,7 +184,7 @@ func TestBufferAddAssistantMessage(t *testing.T) { }) t.Run("SkipEventMessage", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-2", "req-2", "assistant-2") + buffer := context.NewChatBuffer("chat-2", "req-2", "assistant-2", "") buffer.AddAssistantMessage( "event", map[string]interface{}{"event": "message_start"}, @@ -196,7 +196,7 @@ func TestBufferAddAssistantMessage(t *testing.T) { }) t.Run("AddRetrievalMessage", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-3", "req-3", "assistant-3") + buffer := context.NewChatBuffer("chat-3", "req-3", "assistant-3", "") buffer.AddAssistantMessage( "retrieval", map[string]interface{}{ @@ -214,7 +214,7 @@ func TestBufferAddAssistantMessage(t *testing.T) { }) t.Run("AddToolCallMessage", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-4", "req-4", "assistant-4") + buffer := context.NewChatBuffer("chat-4", "req-4", "assistant-4", "") buffer.AddAssistantMessage( "tool_call", map[string]interface{}{ @@ -231,7 +231,7 @@ func TestBufferAddAssistantMessage(t *testing.T) { }) t.Run("AddCustomTypeMessage", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-5", "req-5", "assistant-5") + buffer := context.NewChatBuffer("chat-5", "req-5", "assistant-5", "") buffer.AddAssistantMessage( "custom_chart", map[string]interface{}{ @@ -249,7 +249,7 @@ func TestBufferAddAssistantMessage(t *testing.T) { func TestBufferGetMessages(t *testing.T) { t.Run("GetMessagesReturnsSliceCopy", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-1", "req-1", "assistant-1") + buffer := context.NewChatBuffer("chat-1", "req-1", "assistant-1", "") buffer.AddUserInput("Hello", "") messages1 := buffer.GetMessages() @@ -262,7 +262,7 @@ func TestBufferGetMessages(t *testing.T) { }) t.Run("GetEmptyMessages", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-2", "req-2", "assistant-2") + buffer := context.NewChatBuffer("chat-2", "req-2", "assistant-2", "") messages := buffer.GetMessages() assert.NotNil(t, messages) @@ -271,7 +271,7 @@ func TestBufferGetMessages(t *testing.T) { } func TestBufferGetMessageCount(t *testing.T) { - buffer := context.NewChatBuffer("chat-1", "req-1", "assistant-1") + buffer := context.NewChatBuffer("chat-1", "req-1", "assistant-1", "") assert.Equal(t, 0, buffer.GetMessageCount()) buffer.AddUserInput("Message 1", "") @@ -287,7 +287,7 @@ func TestBufferGetMessageCount(t *testing.T) { func TestBufferBeginStep(t *testing.T) { t.Run("BeginStepWithStack", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-1", "req-1", "assistant-1") + buffer := context.NewChatBuffer("chat-1", "req-1", "assistant-1", "") stack := &context.Stack{ ID: "stack-123", @@ -313,7 +313,7 @@ func TestBufferBeginStep(t *testing.T) { }) t.Run("BeginStepWithNilStack", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-2", "req-2", "assistant-2") + buffer := context.NewChatBuffer("chat-2", "req-2", "assistant-2", "") step := buffer.BeginStep(context.StepTypeInput, nil, nil) @@ -324,7 +324,7 @@ func TestBufferBeginStep(t *testing.T) { }) t.Run("BeginMultipleSteps", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-3", "req-3", "assistant-3") + buffer := context.NewChatBuffer("chat-3", "req-3", "assistant-3", "") step1 := buffer.BeginStep(context.StepTypeInput, nil, nil) step2 := buffer.BeginStep(context.StepTypeHookCreate, nil, nil) @@ -339,7 +339,7 @@ func TestBufferBeginStep(t *testing.T) { }) t.Run("BeginStepWithSpaceSnapshot", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-4", "req-4", "assistant-4") + buffer := context.NewChatBuffer("chat-4", "req-4", "assistant-4", "") // Set space snapshot before beginning step buffer.SetSpaceSnapshot(map[string]interface{}{ @@ -357,7 +357,7 @@ func TestBufferBeginStep(t *testing.T) { func TestBufferCompleteStep(t *testing.T) { t.Run("CompleteCurrentStep", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-1", "req-1", "assistant-1") + buffer := context.NewChatBuffer("chat-1", "req-1", "assistant-1", "") buffer.BeginStep(context.StepTypeLLM, map[string]interface{}{"prompt": "Hello"}, nil) buffer.CompleteStep(map[string]interface{}{"response": "Hi there!"}) @@ -370,7 +370,7 @@ func TestBufferCompleteStep(t *testing.T) { }) t.Run("CompleteWithNoCurrentStep", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-2", "req-2", "assistant-2") + buffer := context.NewChatBuffer("chat-2", "req-2", "assistant-2", "") // Should not panic buffer.CompleteStep(map[string]interface{}{"response": "test"}) @@ -378,7 +378,7 @@ func TestBufferCompleteStep(t *testing.T) { }) t.Run("CompleteMultipleStepsSequentially", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-3", "req-3", "assistant-3") + buffer := context.NewChatBuffer("chat-3", "req-3", "assistant-3", "") buffer.BeginStep(context.StepTypeInput, nil, nil) buffer.CompleteStep(map[string]interface{}{"done": true}) @@ -399,7 +399,7 @@ func TestBufferCompleteStep(t *testing.T) { func TestBufferFailCurrentStep(t *testing.T) { t.Run("FailWithError", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-1", "req-1", "assistant-1") + buffer := context.NewChatBuffer("chat-1", "req-1", "assistant-1", "") buffer.BeginStep(context.StepTypeLLM, nil, nil) buffer.FailCurrentStep(context.ResumeStatusFailed, fmt.Errorf("API error: rate limit exceeded")) @@ -411,7 +411,7 @@ func TestBufferFailCurrentStep(t *testing.T) { }) t.Run("FailWithInterrupted", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-2", "req-2", "assistant-2") + buffer := context.NewChatBuffer("chat-2", "req-2", "assistant-2", "") buffer.BeginStep(context.StepTypeLLM, nil, nil) buffer.FailCurrentStep(context.ResumeStatusInterrupted, nil) @@ -423,7 +423,7 @@ func TestBufferFailCurrentStep(t *testing.T) { }) t.Run("FailAlreadyCompletedStep", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-3", "req-3", "assistant-3") + buffer := context.NewChatBuffer("chat-3", "req-3", "assistant-3", "") buffer.BeginStep(context.StepTypeLLM, nil, nil) buffer.CompleteStep(map[string]interface{}{"done": true}) @@ -437,7 +437,7 @@ func TestBufferFailCurrentStep(t *testing.T) { }) t.Run("FailWithNoCurrentStep", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-4", "req-4", "assistant-4") + buffer := context.NewChatBuffer("chat-4", "req-4", "assistant-4", "") // Should not panic buffer.FailCurrentStep(context.ResumeStatusFailed, fmt.Errorf("error")) @@ -446,12 +446,12 @@ func TestBufferFailCurrentStep(t *testing.T) { func TestBufferGetCurrentStep(t *testing.T) { t.Run("NoCurrentStep", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-1", "req-1", "assistant-1") + buffer := context.NewChatBuffer("chat-1", "req-1", "assistant-1", "") assert.Nil(t, buffer.GetCurrentStep()) }) t.Run("HasCurrentStep", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-2", "req-2", "assistant-2") + buffer := context.NewChatBuffer("chat-2", "req-2", "assistant-2", "") buffer.BeginStep(context.StepTypeLLM, nil, nil) current := buffer.GetCurrentStep() @@ -460,7 +460,7 @@ func TestBufferGetCurrentStep(t *testing.T) { }) t.Run("CurrentStepClearedAfterComplete", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-3", "req-3", "assistant-3") + buffer := context.NewChatBuffer("chat-3", "req-3", "assistant-3", "") buffer.BeginStep(context.StepTypeLLM, nil, nil) buffer.CompleteStep(nil) @@ -470,7 +470,7 @@ func TestBufferGetCurrentStep(t *testing.T) { func TestBufferGetStepsForResume(t *testing.T) { t.Run("CompletedSuccessfully", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-1", "req-1", "assistant-1") + buffer := context.NewChatBuffer("chat-1", "req-1", "assistant-1", "") buffer.BeginStep(context.StepTypeInput, nil, nil) buffer.CompleteStep(nil) @@ -483,7 +483,7 @@ func TestBufferGetStepsForResume(t *testing.T) { }) t.Run("FailedRequest", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-2", "req-2", "assistant-2") + buffer := context.NewChatBuffer("chat-2", "req-2", "assistant-2", "") buffer.BeginStep(context.StepTypeInput, nil, nil) buffer.CompleteStep(nil) @@ -499,7 +499,7 @@ func TestBufferGetStepsForResume(t *testing.T) { }) t.Run("InterruptedRequest", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-3", "req-3", "assistant-3") + buffer := context.NewChatBuffer("chat-3", "req-3", "assistant-3", "") buffer.BeginStep(context.StepTypeInput, nil, nil) buffer.CompleteStep(nil) @@ -517,7 +517,7 @@ func TestBufferGetStepsForResume(t *testing.T) { func TestBufferGetAllSteps(t *testing.T) { t.Run("GetStepsReturnsSliceCopy", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-1", "req-1", "assistant-1") + buffer := context.NewChatBuffer("chat-1", "req-1", "assistant-1", "") buffer.BeginStep(context.StepTypeLLM, nil, nil) steps1 := buffer.GetAllSteps() @@ -529,7 +529,7 @@ func TestBufferGetAllSteps(t *testing.T) { }) t.Run("GetEmptySteps", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-2", "req-2", "assistant-2") + buffer := context.NewChatBuffer("chat-2", "req-2", "assistant-2", "") steps := buffer.GetAllSteps() assert.NotNil(t, steps) @@ -543,7 +543,7 @@ func TestBufferGetAllSteps(t *testing.T) { func TestBufferSpaceSnapshot(t *testing.T) { t.Run("SetAndGetSnapshot", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-1", "req-1", "assistant-1") + buffer := context.NewChatBuffer("chat-1", "req-1", "assistant-1", "") snapshot := map[string]interface{}{ "user_id": "user-123", @@ -560,7 +560,7 @@ func TestBufferSpaceSnapshot(t *testing.T) { }) t.Run("SnapshotIsCopy", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-2", "req-2", "assistant-2") + buffer := context.NewChatBuffer("chat-2", "req-2", "assistant-2", "") original := map[string]interface{}{"key": "original"} buffer.SetSpaceSnapshot(original) @@ -574,7 +574,7 @@ func TestBufferSpaceSnapshot(t *testing.T) { }) t.Run("GetSnapshotReturnsCopy", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-3", "req-3", "assistant-3") + buffer := context.NewChatBuffer("chat-3", "req-3", "assistant-3", "") buffer.SetSpaceSnapshot(map[string]interface{}{"key": "value"}) retrieved1 := buffer.GetSpaceSnapshot() @@ -585,13 +585,13 @@ func TestBufferSpaceSnapshot(t *testing.T) { }) t.Run("GetNilSnapshot", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-4", "req-4", "assistant-4") + buffer := context.NewChatBuffer("chat-4", "req-4", "assistant-4", "") snapshot := buffer.GetSpaceSnapshot() assert.Nil(t, snapshot) }) t.Run("SetNilSnapshot", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-5", "req-5", "assistant-5") + buffer := context.NewChatBuffer("chat-5", "req-5", "assistant-5", "") buffer.SetSpaceSnapshot(map[string]interface{}{"key": "value"}) buffer.SetSpaceSnapshot(nil) @@ -606,7 +606,7 @@ func TestBufferSpaceSnapshot(t *testing.T) { func TestBufferIdentityMethods(t *testing.T) { t.Run("SetAssistantID", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-1", "req-1", "assistant-original") + buffer := context.NewChatBuffer("chat-1", "req-1", "assistant-original", "") assert.Equal(t, "assistant-original", buffer.AssistantID()) @@ -615,14 +615,111 @@ func TestBufferIdentityMethods(t *testing.T) { }) t.Run("ChatID", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-test", "req-test", "assistant-test") + buffer := context.NewChatBuffer("chat-test", "req-test", "assistant-test", "") assert.Equal(t, "chat-test", buffer.ChatID()) }) t.Run("RequestID", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-test", "req-test", "assistant-test") + buffer := context.NewChatBuffer("chat-test", "req-test", "assistant-test", "") assert.Equal(t, "req-test", buffer.RequestID()) }) + + t.Run("Connector", func(t *testing.T) { + buffer := context.NewChatBuffer("chat-test", "req-test", "assistant-test", "openai") + assert.Equal(t, "openai", buffer.Connector()) + }) + + t.Run("SetConnector", func(t *testing.T) { + buffer := context.NewChatBuffer("chat-1", "req-1", "assistant-1", "openai") + assert.Equal(t, "openai", buffer.Connector()) + + // Simulate user switching connector mid-conversation + buffer.SetConnector("anthropic") + assert.Equal(t, "anthropic", buffer.Connector()) + }) + + t.Run("EmptyConnector", func(t *testing.T) { + buffer := context.NewChatBuffer("chat-test", "req-test", "assistant-test", "") + assert.Equal(t, "", buffer.Connector()) + }) +} + +func TestBufferConnectorInMessages(t *testing.T) { + t.Run("MessageInheritsConnector", func(t *testing.T) { + buffer := context.NewChatBuffer("chat-1", "req-1", "assistant-1", "openai") + + // Add assistant message - should inherit connector from buffer + buffer.AddAssistantMessage( + "text", + map[string]interface{}{"content": "Hello"}, + "block-1", "thread-1", "assistant-1", nil, + ) + + messages := buffer.GetMessages() + require.Len(t, messages, 1) + assert.Equal(t, "openai", messages[0].Connector) + }) + + t.Run("MessageConnectorUpdatesWithBuffer", func(t *testing.T) { + buffer := context.NewChatBuffer("chat-1", "req-1", "assistant-1", "openai") + + // First message with openai + buffer.AddAssistantMessage( + "text", + map[string]interface{}{"content": "Using OpenAI"}, + "", "", "assistant-1", nil, + ) + + // User switches connector + buffer.SetConnector("anthropic") + + // Second message with anthropic + buffer.AddAssistantMessage( + "text", + map[string]interface{}{"content": "Now using Claude"}, + "", "", "assistant-1", nil, + ) + + messages := buffer.GetMessages() + require.Len(t, messages, 2) + assert.Equal(t, "openai", messages[0].Connector, "First message should use openai") + assert.Equal(t, "anthropic", messages[1].Connector, "Second message should use anthropic") + }) + + t.Run("UserInputDoesNotSetConnector", func(t *testing.T) { + buffer := context.NewChatBuffer("chat-1", "req-1", "assistant-1", "openai") + + // User input doesn't have connector (it's set by the system based on which model processes it) + buffer.AddUserInput("Hello", "") + + messages := buffer.GetMessages() + require.Len(t, messages, 1) + // User input messages don't have connector field set by AddUserInput + // Connector is only set for assistant messages + assert.Equal(t, "", messages[0].Connector) + }) + + t.Run("MultipleConnectorSwitches", func(t *testing.T) { + buffer := context.NewChatBuffer("chat-1", "req-1", "assistant-1", "openai") + + // Simulate a conversation with multiple connector switches + connectors := []string{"openai", "anthropic", "openai", "google"} + for i, conn := range connectors { + buffer.SetConnector(conn) + buffer.AddAssistantMessage( + "text", + map[string]interface{}{"content": fmt.Sprintf("Message %d", i+1)}, + "", "", "assistant-1", nil, + ) + } + + messages := buffer.GetMessages() + require.Len(t, messages, 4) + + for i, msg := range messages { + assert.Equal(t, connectors[i], msg.Connector, "Message %d should have connector %s", i+1, connectors[i]) + } + }) } // ============================================================================= @@ -630,7 +727,7 @@ func TestBufferIdentityMethods(t *testing.T) { // ============================================================================= func TestBufferConcurrentMessageOperations(t *testing.T) { - buffer := context.NewChatBuffer("chat-concurrent", "req-concurrent", "assistant-concurrent") + buffer := context.NewChatBuffer("chat-concurrent", "req-concurrent", "assistant-concurrent", "") var wg sync.WaitGroup numGoroutines := 100 @@ -663,7 +760,7 @@ func TestBufferConcurrentMessageOperations(t *testing.T) { } func TestBufferConcurrentStepOperations(t *testing.T) { - buffer := context.NewChatBuffer("chat-concurrent", "req-concurrent", "assistant-concurrent") + buffer := context.NewChatBuffer("chat-concurrent", "req-concurrent", "assistant-concurrent", "") var wg sync.WaitGroup numGoroutines := 50 @@ -687,7 +784,7 @@ func TestBufferConcurrentStepOperations(t *testing.T) { } func TestBufferConcurrentReadWrite(t *testing.T) { - buffer := context.NewChatBuffer("chat-rw", "req-rw", "assistant-rw") + buffer := context.NewChatBuffer("chat-rw", "req-rw", "assistant-rw", "") var wg sync.WaitGroup done := make(chan bool) @@ -761,7 +858,7 @@ func TestBufferStepStatusConstants(t *testing.T) { func TestBufferEdgeCases(t *testing.T) { t.Run("LargeNumberOfMessages", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-large", "req-large", "assistant-large") + buffer := context.NewChatBuffer("chat-large", "req-large", "assistant-large", "") // Add 10000 messages for i := 0; i < 10000; i++ { @@ -778,7 +875,7 @@ func TestBufferEdgeCases(t *testing.T) { }) t.Run("MessageWithEmptyProps", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-empty", "req-empty", "assistant-empty") + buffer := context.NewChatBuffer("chat-empty", "req-empty", "assistant-empty", "") buffer.AddMessage(&context.BufferedMessage{ Role: "assistant", @@ -792,7 +889,7 @@ func TestBufferEdgeCases(t *testing.T) { }) t.Run("StepWithEmptyInput", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-step", "req-step", "assistant-step") + buffer := context.NewChatBuffer("chat-step", "req-step", "assistant-step", "") step := buffer.BeginStep(context.StepTypeLLM, nil, nil) assert.Nil(t, step.Input) @@ -803,7 +900,7 @@ func TestBufferEdgeCases(t *testing.T) { }) t.Run("AllMessageTypes", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-types", "req-types", "assistant-types") + buffer := context.NewChatBuffer("chat-types", "req-types", "assistant-types", "") messageTypes := []string{ "text", "image", "loading", "tool_call", "tool_result", @@ -819,7 +916,7 @@ func TestBufferEdgeCases(t *testing.T) { }) t.Run("AllStepTypes", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-step-types", "req-step-types", "assistant-step-types") + buffer := context.NewChatBuffer("chat-step-types", "req-step-types", "assistant-step-types", "") stepTypes := []string{ context.StepTypeInput, context.StepTypeHookCreate, context.StepTypeLLM, @@ -842,7 +939,7 @@ func TestBufferEdgeCases(t *testing.T) { func TestBufferCompleteWorkflow(t *testing.T) { t.Run("SuccessfulChatFlow", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-workflow", "req-workflow", "assistant-main") + buffer := context.NewChatBuffer("chat-workflow", "req-workflow", "assistant-main", "") // 1. User input buffer.AddUserInput("What's the weather in San Francisco?", "John") @@ -886,7 +983,7 @@ func TestBufferCompleteWorkflow(t *testing.T) { }) t.Run("InterruptedChatFlow", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-interrupted", "req-interrupted", "assistant-main") + buffer := context.NewChatBuffer("chat-interrupted", "req-interrupted", "assistant-main", "") // Set space snapshot buffer.SetSpaceSnapshot(map[string]interface{}{ @@ -917,7 +1014,7 @@ func TestBufferCompleteWorkflow(t *testing.T) { }) t.Run("A2ACallWithDelegation", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-a2a", "req-a2a", "assistant-main") + buffer := context.NewChatBuffer("chat-a2a", "req-a2a", "assistant-main", "") mainStack := &context.Stack{ID: "stack-main", Depth: 0} childStack := &context.Stack{ID: "stack-child", ParentID: "stack-main", Depth: 1} @@ -953,7 +1050,7 @@ func TestBufferCompleteWorkflow(t *testing.T) { }) t.Run("ConcurrentAgentCalls", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-concurrent-a2a", "req-concurrent-a2a", "assistant-main") + buffer := context.NewChatBuffer("chat-concurrent-a2a", "req-concurrent-a2a", "assistant-main", "") // Main assistant spawns multiple concurrent calls buffer.BeginStep(context.StepTypeInput, nil, nil) @@ -997,7 +1094,7 @@ func TestBufferCompleteWorkflow(t *testing.T) { func TestBufferMessageSequence(t *testing.T) { t.Run("SequenceAutoIncrement", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-seq", "req-seq", "assistant-seq") + buffer := context.NewChatBuffer("chat-seq", "req-seq", "assistant-seq", "") for i := 0; i < 10; i++ { buffer.AddMessage(&context.BufferedMessage{ @@ -1013,7 +1110,7 @@ func TestBufferMessageSequence(t *testing.T) { }) t.Run("MixedMessageTypes", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-mixed", "req-mixed", "assistant-mixed") + buffer := context.NewChatBuffer("chat-mixed", "req-mixed", "assistant-mixed", "") buffer.AddUserInput("Hello", "") buffer.AddAssistantMessage("text", nil, "", "", "", nil) @@ -1034,7 +1131,7 @@ func TestBufferMessageSequence(t *testing.T) { func TestBufferStepSequence(t *testing.T) { t.Run("SequenceAutoIncrement", func(t *testing.T) { - buffer := context.NewChatBuffer("chat-step-seq", "req-step-seq", "assistant-step-seq") + buffer := context.NewChatBuffer("chat-step-seq", "req-step-seq", "assistant-step-seq", "") for i := 0; i < 5; i++ { buffer.BeginStep(context.StepTypeLLM, nil, nil) @@ -1055,10 +1152,10 @@ func TestBufferStepSequence(t *testing.T) { func TestBufferMultipleRequests(t *testing.T) { t.Run("NewBufferPerRequest", func(t *testing.T) { // Simulate multiple requests with separate buffers - buffer1 := context.NewChatBuffer("chat-1", "req-1", "assistant-1") + buffer1 := context.NewChatBuffer("chat-1", "req-1", "assistant-1", "") buffer1.AddUserInput("Request 1", "") - buffer2 := context.NewChatBuffer("chat-1", "req-2", "assistant-1") + buffer2 := context.NewChatBuffer("chat-1", "req-2", "assistant-1", "") buffer2.AddUserInput("Request 2", "") // Buffers should be independent diff --git a/agent/context/context.go b/agent/context/context.go index 65948595..b679cdd3 100644 --- a/agent/context/context.go +++ b/agent/context/context.go @@ -399,8 +399,8 @@ func (ctx *Context) GetMessageMetadata(messageID string) *MessageMetadata { // InitBuffer initializes the chat buffer for this context // Should be called at the start of Stream() to begin buffering messages and steps -func (ctx *Context) InitBuffer(assistantID string) *ChatBuffer { - ctx.Buffer = NewChatBuffer(ctx.ChatID, ctx.RequestID(), assistantID) +func (ctx *Context) InitBuffer(assistantID, connector string) *ChatBuffer { + ctx.Buffer = NewChatBuffer(ctx.ChatID, ctx.RequestID(), assistantID, connector) return ctx.Buffer } diff --git a/agent/store/CHAT_STORAGE_DESIGN.md b/agent/store/CHAT_STORAGE_DESIGN.md index b17a70a4..d8c5d401 100644 --- a/agent/store/CHAT_STORAGE_DESIGN.md +++ b/agent/store/CHAT_STORAGE_DESIGN.md @@ -91,6 +91,7 @@ Stores chat metadata and session information. | `chat_id` | string(64) | No | Unique | Unique chat identifier | | `title` | string(500) | Yes | - | Chat title | | `assistant_id` | string(200) | No | Yes | Associated assistant ID | +| `last_connector` | string(200) | Yes | Yes | Last used connector ID | | `mode` | string(50) | No | - | Chat mode (default: "chat") | | `status` | enum | No | Yes | Status: `active`, `archived` | | `public` | boolean | No | - | Whether shared across all teams | @@ -129,6 +130,7 @@ These fields are automatically managed by the framework and used for access cont | Name | Columns | Type | | -------------------- | ----------------- | ----- | | `idx_chat_assistant` | `assistant_id` | index | +| `idx_chat_last_conn` | `last_connector` | index | | `idx_chat_status` | `status` | index | | `idx_chat_share` | `share` | index | | `idx_chat_last_msg` | `last_message_at` | index | @@ -151,6 +153,7 @@ Stores user-visible messages (both user input and assistant responses). | `block_id` | string(64) | Yes | Yes | Block grouping ID | | `thread_id` | string(64) | Yes | Yes | Thread grouping ID | | `assistant_id` | string(200) | Yes | Yes | Assistant ID (join to get name/avatar) | +| `connector` | string(200) | Yes | Yes | Connector ID used for this message | | `sequence` | integer | No | - | Message order within chat (in composite) | | `metadata` | json | Yes | - | Additional metadata | | `created_at` | timestamp | No | Yes | Creation timestamp | @@ -809,6 +812,7 @@ type Chat struct { ChatID string `json:"chat_id"` Title string `json:"title,omitempty"` AssistantID string `json:"assistant_id"` + LastConnector string `json:"last_connector,omitempty"` // Last used connector ID Mode string `json:"mode"` Status string `json:"status"` // "active" or "archived" Public bool `json:"public"` // Whether shared across all teams @@ -831,6 +835,7 @@ type Message struct { BlockID string `json:"block_id,omitempty"` ThreadID string `json:"thread_id,omitempty"` AssistantID string `json:"assistant_id,omitempty"` + Connector string `json:"connector,omitempty"` // Connector ID used for this message Sequence int `json:"sequence"` Metadata map[string]interface{} `json:"metadata,omitempty"` CreatedAt time.Time `json:"created_at"` diff --git a/agent/store/types/types.go b/agent/store/types/types.go index a29b9b2a..bf01251a 100644 --- a/agent/store/types/types.go +++ b/agent/store/types/types.go @@ -29,6 +29,7 @@ type Chat struct { ChatID string `json:"chat_id"` Title string `json:"title,omitempty"` AssistantID string `json:"assistant_id"` + LastConnector string `json:"last_connector,omitempty"` // Last used connector ID (updated on each message) Mode string `json:"mode"` Status string `json:"status"` // "active" or "archived" Public bool `json:"public"` // Whether shared across all teams @@ -107,6 +108,7 @@ type Message struct { BlockID string `json:"block_id,omitempty"` ThreadID string `json:"thread_id,omitempty"` AssistantID string `json:"assistant_id,omitempty"` + Connector string `json:"connector,omitempty"` // Connector ID used for this message Sequence int `json:"sequence"` Metadata map[string]interface{} `json:"metadata,omitempty"` CreatedAt time.Time `json:"created_at"` diff --git a/agent/store/xun/chat.go b/agent/store/xun/chat.go index 07362879..72acaada 100644 --- a/agent/store/xun/chat.go +++ b/agent/store/xun/chat.go @@ -69,6 +69,9 @@ func (store *Xun) CreateChat(chat *types.Chat) error { if chat.Title != "" { data["title"] = chat.Title } + if chat.LastConnector != "" { + data["last_connector"] = chat.LastConnector + } if chat.LastMessageAt != nil { data["last_message_at"] = *chat.LastMessageAt } @@ -330,14 +333,15 @@ func (store *Xun) ListChats(filter types.ChatFilter) (*types.ChatList, error) { // rowToChat converts a database row to a Chat struct func (store *Xun) rowToChat(data map[string]interface{}) (*types.Chat, error) { chat := &types.Chat{ - ChatID: getString(data, "chat_id"), - Title: getString(data, "title"), - AssistantID: getString(data, "assistant_id"), - Mode: getString(data, "mode"), - Status: getString(data, "status"), - Public: getBool(data, "public"), - Share: getString(data, "share"), - Sort: getInt(data, "sort"), + ChatID: getString(data, "chat_id"), + Title: getString(data, "title"), + AssistantID: getString(data, "assistant_id"), + LastConnector: getString(data, "last_connector"), + Mode: getString(data, "mode"), + Status: getString(data, "status"), + Public: getBool(data, "public"), + Share: getString(data, "share"), + Sort: getInt(data, "sort"), } // Handle timestamps diff --git a/agent/store/xun/chat_test.go b/agent/store/xun/chat_test.go index 0b439c02..8f95cd2e 100644 --- a/agent/store/xun/chat_test.go +++ b/agent/store/xun/chat_test.go @@ -53,6 +53,7 @@ func TestCreateChat(t *testing.T) { now := time.Now() chat := &types.Chat{ AssistantID: "test_assistant", + LastConnector: "openai", Title: "Full Chat", Mode: "task", Status: "active", @@ -80,6 +81,9 @@ func TestCreateChat(t *testing.T) { if retrieved.Title != "Full Chat" { t.Errorf("Expected title 'Full Chat', got '%s'", retrieved.Title) } + if retrieved.LastConnector != "openai" { + t.Errorf("Expected last_connector 'openai', got '%s'", retrieved.LastConnector) + } if retrieved.Mode != "task" { t.Errorf("Expected mode 'task', got '%s'", retrieved.Mode) } @@ -313,6 +317,83 @@ func TestUpdateChat(t *testing.T) { _ = store.DeleteChat(chat.ChatID) }) + t.Run("UpdateLastConnector", func(t *testing.T) { + chat := &types.Chat{ + AssistantID: "test_assistant", + LastConnector: "openai", + } + err := store.CreateChat(chat) + if err != nil { + t.Fatalf("Failed to create chat: %v", err) + } + + // Verify initial connector + retrieved, err := store.GetChat(chat.ChatID) + if err != nil { + t.Fatalf("Failed to retrieve chat: %v", err) + } + if retrieved.LastConnector != "openai" { + t.Errorf("Expected last_connector 'openai', got '%s'", retrieved.LastConnector) + } + + // Update to different connector (simulating user switching connector) + err = store.UpdateChat(chat.ChatID, map[string]interface{}{ + "last_connector": "anthropic", + }) + if err != nil { + t.Fatalf("Failed to update chat: %v", err) + } + + // Verify updated connector + retrieved, err = store.GetChat(chat.ChatID) + if err != nil { + t.Fatalf("Failed to retrieve chat: %v", err) + } + if retrieved.LastConnector != "anthropic" { + t.Errorf("Expected last_connector 'anthropic', got '%s'", retrieved.LastConnector) + } + + // Clean up + _ = store.DeleteChat(chat.ChatID) + }) + + t.Run("UpdateLastConnectorAndLastMessageAt", func(t *testing.T) { + // This simulates what FlushBuffer does + chat := &types.Chat{ + AssistantID: "test_assistant", + LastConnector: "openai", + } + err := store.CreateChat(chat) + if err != nil { + t.Fatalf("Failed to create chat: %v", err) + } + + // Update both fields together (like FlushBuffer does) + now := time.Now() + err = store.UpdateChat(chat.ChatID, map[string]interface{}{ + "last_message_at": now, + "last_connector": "claude", + }) + if err != nil { + t.Fatalf("Failed to update chat: %v", err) + } + + retrieved, err := store.GetChat(chat.ChatID) + if err != nil { + t.Fatalf("Failed to retrieve chat: %v", err) + } + + if retrieved.LastConnector != "claude" { + t.Errorf("Expected last_connector 'claude', got '%s'", retrieved.LastConnector) + } + if retrieved.LastMessageAt == nil { + t.Error("Expected last_message_at to be set") + } + + // Clean up + _ = store.DeleteChat(chat.ChatID) + }) + t.Run("UpdateMultipleFields", func(t *testing.T) { chat := &types.Chat{ AssistantID: "test_assistant", diff --git a/agent/store/xun/message.go b/agent/store/xun/message.go index b196a42b..f9d2a2af 100644 --- a/agent/store/xun/message.go +++ b/agent/store/xun/message.go @@ -68,6 +68,7 @@ func (store *Xun) SaveMessages(chatID string, messages []*types.Message) error { "block_id": nil, "thread_id": nil, "assistant_id": nil, + "connector": nil, "metadata": nil, "created_at": now, "updated_at": now, @@ -86,6 +87,9 @@ func (store *Xun) SaveMessages(chatID string, messages []*types.Message) error { if msg.AssistantID != "" { row["assistant_id"] = msg.AssistantID } + if msg.Connector != "" { + row["connector"] = msg.Connector + } if msg.Metadata != nil { metadataJSON, err := jsoniter.MarshalToString(msg.Metadata) if err != nil { @@ -327,6 +331,7 @@ func (store *Xun) rowToMessage(data map[string]interface{}) (*types.Message, err BlockID: getString(data, "block_id"), ThreadID: getString(data, "thread_id"), AssistantID: getString(data, "assistant_id"), + Connector: getString(data, "connector"), Sequence: getInt(data, "sequence"), } diff --git a/agent/store/xun/message_test.go b/agent/store/xun/message_test.go index c589c2fe..2093c512 100644 --- a/agent/store/xun/message_test.go +++ b/agent/store/xun/message_test.go @@ -208,6 +208,121 @@ func TestSaveMessages(t *testing.T) { } }) + t.Run("SaveMessageWithConnector", func(t *testing.T) { + connChat := &types.Chat{ + AssistantID: "test_assistant", + } + err := store.CreateChat(connChat) + if err != nil { + t.Fatalf("Failed to create chat: %v", err) + } + defer store.DeleteChat(connChat.ChatID) + + // Save messages with different connectors + messages := []*types.Message{ + { + Role: "user", + Type: "user_input", + Props: map[string]interface{}{"content": "Hello"}, + Sequence: 1, + Connector: "openai", + AssistantID: "test_assistant", + }, + { + Role: "assistant", + Type: "text", + Props: map[string]interface{}{"content": "Hi there!"}, + Sequence: 2, + Connector: "openai", + AssistantID: "test_assistant", + }, + { + Role: "user", + Type: "user_input", + Props: map[string]interface{}{"content": "Switch to Claude"}, + Sequence: 3, + Connector: "anthropic", + AssistantID: "test_assistant", + }, + { + Role: "assistant", + Type: "text", + Props: map[string]interface{}{"content": "Now using Claude!"}, + Sequence: 4, + Connector: "anthropic", + AssistantID: "test_assistant", + }, + } + + err = store.SaveMessages(connChat.ChatID, messages) + if err != nil { + t.Fatalf("Failed to save messages: %v", err) + } + + // Retrieve and verify connectors + retrieved, err := store.GetMessages(connChat.ChatID, types.MessageFilter{}) + if err != nil { + t.Fatalf("Failed to get messages: %v", err) + } + + if len(retrieved) != 4 { + t.Fatalf("Expected 4 messages, got %d", len(retrieved)) + } + + // Verify each message has correct connector + for _, msg := range retrieved { + if msg.Sequence <= 2 && msg.Connector != "openai" { + t.Errorf("Expected connector 'openai' for sequence %d, got '%s'", msg.Sequence, msg.Connector) + } + if msg.Sequence > 2 && msg.Connector != "anthropic" { + t.Errorf("Expected connector 'anthropic' for sequence %d, got '%s'", msg.Sequence, msg.Connector) + } + } + + t.Logf("Successfully saved and retrieved messages with different connectors") + }) + + t.Run("SaveMessageWithEmptyConnector", func(t *testing.T) { + emptyConnChat := &types.Chat{ + AssistantID: "test_assistant", + } + err := store.CreateChat(emptyConnChat) + if err != nil { + t.Fatalf("Failed to create chat: %v", err) + } + defer store.DeleteChat(emptyConnChat.ChatID) + + // Save message without connector + messages := []*types.Message{ + { + Role: "user", + Type: "text", + Props: map[string]interface{}{"content": "No connector"}, + Sequence: 1, + // Connector is empty + }, + } + + err = store.SaveMessages(emptyConnChat.ChatID, messages) + if err != nil { + t.Fatalf("Failed to save message: %v", err) + } + + retrieved, err := store.GetMessages(emptyConnChat.ChatID, types.MessageFilter{}) + if err != nil { + t.Fatalf("Failed to get messages: %v", err) + } + + if len(retrieved) != 1 { + t.Fatalf("Expected 1 message, got %d", len(retrieved)) + } + + // Empty connector should be stored as empty string + if retrieved[0].Connector != "" { + t.Errorf("Expected empty connector, got '%s'", retrieved[0].Connector) + } + }) + t.Run("SaveEmptyMessages", func(t *testing.T) { err := store.SaveMessages(chat.ChatID, []*types.Message{}) if err != nil { diff --git a/data/bindata.go b/data/bindata.go index bdfe3d34..edb7d073 100644 --- a/data/bindata.go +++ b/data/bindata.go @@ -320,7 +320,7 @@ func cuiSetupIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "cui/setup/index.html", size: 10, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "cui/setup/index.html", size: 10, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -340,7 +340,7 @@ func cuiV09IndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "cui/v0.9/index.html", size: 13, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "cui/v0.9/index.html", size: 13, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -360,7 +360,7 @@ func cuiV10IndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "cui/v1.0/index.html", size: 49, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "cui/v1.0/index.html", size: 49, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -380,7 +380,7 @@ func cuiV10Layouts__indexAsyncJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "cui/v1.0/layouts__index.async.js", size: 71, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "cui/v1.0/layouts__index.async.js", size: 71, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -400,7 +400,7 @@ func cuiV10UmiJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "cui/v1.0/umi.js", size: 71, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "cui/v1.0/umi.js", size: 71, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -420,7 +420,7 @@ func initEnv() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.env", size: 219, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/.env", size: 219, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -440,7 +440,7 @@ func initVscodeSettingsJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/settings.json", size: 4666, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/.vscode/settings.json", size: 4666, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -460,7 +460,7 @@ func initVscodeTypesRuntimeConsoleDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/console.d.ts", size: 221, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/console.d.ts", size: 221, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -480,7 +480,7 @@ func initVscodeTypesRuntimeExceptionDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/exception.d.ts", size: 738, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/exception.d.ts", size: 738, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -500,7 +500,7 @@ func initVscodeTypesRuntimeFsDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/fs.d.ts", size: 8554, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/fs.d.ts", size: 8554, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -520,7 +520,7 @@ func initVscodeTypesRuntimeGlobalDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/global.d.ts", size: 1759, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/global.d.ts", size: 1759, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -540,7 +540,7 @@ func initVscodeTypesRuntimeHttpDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/http.d.ts", size: 6179, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/http.d.ts", size: 6179, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -560,7 +560,7 @@ func initVscodeTypesRuntimeIoDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/io.d.ts", size: 587, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/io.d.ts", size: 587, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -580,7 +580,7 @@ func initVscodeTypesRuntimeLogDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/log.d.ts", size: 1692, mode: os.FileMode(493), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/log.d.ts", size: 1692, mode: os.FileMode(493), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -600,7 +600,7 @@ func initVscodeTypesRuntimeNeoDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/neo.d.ts", size: 3750, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/neo.d.ts", size: 3750, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -620,7 +620,7 @@ func initVscodeTypesRuntimeProcessFsDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/process/fs.d.ts", size: 11133, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/process/fs.d.ts", size: 11133, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -640,7 +640,7 @@ func initVscodeTypesRuntimeProcessHttpDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/process/http.d.ts", size: 5653, mode: os.FileMode(493), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/process/http.d.ts", size: 5653, mode: os.FileMode(493), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -660,7 +660,7 @@ func initVscodeTypesRuntimeProcessModelDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/process/model.d.ts", size: 6656, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/process/model.d.ts", size: 6656, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -680,7 +680,7 @@ func initVscodeTypesRuntimeProcessDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/process.d.ts", size: 23165, mode: os.FileMode(493), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/process.d.ts", size: 23165, mode: os.FileMode(493), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -700,7 +700,7 @@ func initVscodeTypesRuntimeQueryDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/query.d.ts", size: 6124, mode: os.FileMode(493), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/query.d.ts", size: 6124, mode: os.FileMode(493), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -720,7 +720,7 @@ func initVscodeTypesRuntimeStoreDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/store.d.ts", size: 2251, mode: os.FileMode(493), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/store.d.ts", size: 2251, mode: os.FileMode(493), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -740,7 +740,7 @@ func initVscodeTypesRuntimeSuiDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/sui.d.ts", size: 1713, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/sui.d.ts", size: 1713, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -760,7 +760,7 @@ func initVscodeTypesRuntimeTimeDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime/time.d.ts", size: 711, mode: os.FileMode(493), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/time.d.ts", size: 711, mode: os.FileMode(493), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -780,7 +780,7 @@ func initVscodeTypesRuntimeDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/runtime.d.ts", size: 424, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime.d.ts", size: 424, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -800,7 +800,7 @@ func initVscodeTypesSuiDTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/types/sui.d.ts", size: 8931, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/.vscode/types/sui.d.ts", size: 8931, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -820,7 +820,7 @@ func initAppYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/app.yao", size: 3115, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/app.yao", size: 3115, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -840,7 +840,7 @@ func initDataReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/data/README.md", size: 41, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/data/README.md", size: 41, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -860,7 +860,7 @@ func initDataTemplatesDefault__assetsReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/data/templates/default/__assets/README.md", size: 33, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/data/templates/default/__assets/README.md", size: 33, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -880,7 +880,7 @@ func initDataTemplatesDefault__assetsImagesIconsAppPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/data/templates/default/__assets/images/icons/app.png", size: 34558, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/data/templates/default/__assets/images/icons/app.png", size: 34558, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -900,7 +900,7 @@ func initDataTemplatesDefault__assetsImagesLogosLogo_colorSvg() (*asset, error) return nil, err } - info := bindataFileInfo{name: "init/data/templates/default/__assets/images/logos/logo_color.svg", size: 2909, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/data/templates/default/__assets/images/logos/logo_color.svg", size: 2909, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -920,7 +920,7 @@ func initDataTemplatesDefault__assetsImagesLogosWordmarkSvg() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/data/templates/default/__assets/images/logos/wordmark.svg", size: 3615, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/data/templates/default/__assets/images/logos/wordmark.svg", size: 3615, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -940,7 +940,7 @@ func initDataTemplatesDefault__dataJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/data/templates/default/__data.json", size: 30, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/data/templates/default/__data.json", size: 30, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -960,7 +960,7 @@ func initDataTemplatesDefault__documentHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/data/templates/default/__document.html", size: 492, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/data/templates/default/__document.html", size: 492, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -980,7 +980,7 @@ func initDataTemplatesDefaultIndexIndexCss() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/data/templates/default/index/index.css", size: 2896, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/data/templates/default/index/index.css", size: 2896, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1000,7 +1000,7 @@ func initDataTemplatesDefaultIndexIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/data/templates/default/index/index.html", size: 2361, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/data/templates/default/index/index.html", size: 2361, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1020,7 +1020,7 @@ func initDataTemplatesDefaultIndexIndexJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/data/templates/default/index/index.json", size: 31, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/data/templates/default/index/index.json", size: 31, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1040,7 +1040,7 @@ func initDbReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/db/README.md", size: 84, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/db/README.md", size: 84, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1060,7 +1060,7 @@ func initFlowsMenuFlowYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/flows/menu.flow.yao", size: 813, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/flows/menu.flow.yao", size: 813, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1080,7 +1080,7 @@ func initFormsAccountFormYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/forms/account.form.yao", size: 1194, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/forms/account.form.yao", size: 1194, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1100,7 +1100,7 @@ func initIconsAppIcns() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/icons/app.icns", size: 67465, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/icons/app.icns", size: 67465, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1120,7 +1120,7 @@ func initIconsAppIco() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/icons/app.ico", size: 54993, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/icons/app.ico", size: 54993, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1140,7 +1140,7 @@ func initIconsAppPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/icons/app.png", size: 34558, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/icons/app.png", size: 34558, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1160,7 +1160,7 @@ func initLoginsAdminLoginYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/logins/admin.login.yao", size: 302, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/logins/admin.login.yao", size: 302, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1180,7 +1180,7 @@ func initLogsReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/logs/README.md", size: 28, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/logs/README.md", size: 28, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1200,7 +1200,7 @@ func initModelsAdminUserModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/models/admin/user.mod.yao", size: 6416, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/models/admin/user.mod.yao", size: 6416, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1220,7 +1220,7 @@ func initModelsTestsPetModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/models/tests/pet.mod.yao", size: 525, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/models/tests/pet.mod.yao", size: 525, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1240,7 +1240,7 @@ func initNeoNeoYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/neo/neo.yml", size: 724, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/neo/neo.yml", size: 724, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1260,7 +1260,7 @@ func initPublicReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/public/README.md", size: 108, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/public/README.md", size: 108, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1280,7 +1280,7 @@ func initPublicAssetsReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/public/assets/README.md", size: 33, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/public/assets/README.md", size: 33, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1300,7 +1300,7 @@ func initPublicAssetsImagesIconsAppPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/public/assets/images/icons/app.png", size: 34558, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/public/assets/images/icons/app.png", size: 34558, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1320,7 +1320,7 @@ func initPublicAssetsImagesLogosLogo_colorSvg() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/public/assets/images/logos/logo_color.svg", size: 2909, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/public/assets/images/logos/logo_color.svg", size: 2909, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1340,7 +1340,7 @@ func initPublicAssetsImagesLogosWordmarkSvg() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/public/assets/images/logos/wordmark.svg", size: 3615, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/public/assets/images/logos/wordmark.svg", size: 3615, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1360,7 +1360,7 @@ func initPublicAssetsLibsuiMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/public/assets/libsui.min.js", size: 12569, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/public/assets/libsui.min.js", size: 12569, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1380,7 +1380,7 @@ func initPublicAssetsLibsuiMinJsMap() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/public/assets/libsui.min.js.map", size: 38553, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/public/assets/libsui.min.js.map", size: 38553, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1400,7 +1400,7 @@ func initPublicIndexCfg() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/public/index.cfg", size: 85, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/public/index.cfg", size: 85, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1420,7 +1420,7 @@ func initPublicIndexSui() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/public/index.sui", size: 5682, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/public/index.sui", size: 5682, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1440,7 +1440,7 @@ func initScriptsAccountTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/scripts/account.ts", size: 2521, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/scripts/account.ts", size: 2521, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1460,7 +1460,7 @@ func initScriptsAiNeoTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/scripts/ai/neo.ts", size: 375, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/scripts/ai/neo.ts", size: 375, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1480,7 +1480,7 @@ func initScriptsTestsTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/scripts/tests.ts", size: 1044, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/scripts/tests.ts", size: 1044, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1500,7 +1500,7 @@ func initScriptsUtilsTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/scripts/utils.ts", size: 1230, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/scripts/utils.ts", size: 1230, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1520,7 +1520,7 @@ func initSuisWebSuiYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/suis/web.sui.yao", size: 675, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/suis/web.sui.yao", size: 675, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1540,7 +1540,7 @@ func initTablesAccountTabYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/tables/account.tab.yao", size: 5597, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/tables/account.tab.yao", size: 5597, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1560,7 +1560,7 @@ func initTsconfigJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/tsconfig.json", size: 178, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "init/tsconfig.json", size: 178, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1580,7 +1580,7 @@ func libsuiAgentTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "libsui/agent.ts", size: 15267, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "libsui/agent.ts", size: 15267, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1600,7 +1600,7 @@ func libsuiIndexTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "libsui/index.ts", size: 13049, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "libsui/index.ts", size: 13049, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1620,7 +1620,7 @@ func libsuiUtilsTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "libsui/utils.ts", size: 5959, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "libsui/utils.ts", size: 5959, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1640,7 +1640,7 @@ func libsuiYaoTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "libsui/yao.ts", size: 4338, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "libsui/yao.ts", size: 4338, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1660,7 +1660,7 @@ func publicIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "public/index.html", size: 11, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "public/index.html", size: 11, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1680,7 +1680,7 @@ func uiIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "ui/index.html", size: 11, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "ui/index.html", size: 11, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1700,7 +1700,7 @@ func yaoDataIcons404Png() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/icons/404.png", size: 9342, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/data/icons/404.png", size: 9342, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1720,7 +1720,7 @@ func yaoDataIconsIconIcns() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/icons/icon.icns", size: 67465, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/data/icons/icon.icns", size: 67465, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1740,7 +1740,7 @@ func yaoDataIconsIconIco() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/icons/icon.ico", size: 54993, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/data/icons/icon.ico", size: 54993, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1760,7 +1760,7 @@ func yaoDataIconsIconPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/icons/icon.png", size: 34558, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/data/icons/icon.png", size: 34558, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1780,7 +1780,7 @@ func yaoDataIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/index.html", size: 282, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/data/index.html", size: 282, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1800,7 +1800,7 @@ func yaoDataKbProvidersChunkingSemanticEnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/chunking/semantic/en.json", size: 5543, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/chunking/semantic/en.json", size: 5543, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1820,7 +1820,7 @@ func yaoDataKbProvidersChunkingSemanticZhCnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/chunking/semantic/zh-cn.json", size: 5446, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/chunking/semantic/zh-cn.json", size: 5446, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1840,7 +1840,7 @@ func yaoDataKbProvidersChunkingStructuredEnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/chunking/structured/en.json", size: 2423, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/chunking/structured/en.json", size: 2423, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1860,7 +1860,7 @@ func yaoDataKbProvidersChunkingStructuredZhCnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/chunking/structured/zh-cn.json", size: 2321, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/chunking/structured/zh-cn.json", size: 2321, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1880,7 +1880,7 @@ func yaoDataKbProvidersConverterMcpEnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/converter/mcp/en.json", size: 4235, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/mcp/en.json", size: 4235, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1900,7 +1900,7 @@ func yaoDataKbProvidersConverterMcpZhCnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/converter/mcp/zh-cn.json", size: 4060, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/mcp/zh-cn.json", size: 4060, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1920,7 +1920,7 @@ func yaoDataKbProvidersConverterOcrEnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/converter/ocr/en.json", size: 6631, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/ocr/en.json", size: 6631, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1940,7 +1940,7 @@ func yaoDataKbProvidersConverterOcrZhCnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/converter/ocr/zh-cn.json", size: 6501, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/ocr/zh-cn.json", size: 6501, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1960,7 +1960,7 @@ func yaoDataKbProvidersConverterOfficeEnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/converter/office/en.json", size: 5476, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/office/en.json", size: 5476, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1980,7 +1980,7 @@ func yaoDataKbProvidersConverterOfficeZhCnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/converter/office/zh-cn.json", size: 5356, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/office/zh-cn.json", size: 5356, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2000,7 +2000,7 @@ func yaoDataKbProvidersConverterUtf8EnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/converter/utf8/en.json", size: 292, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/utf8/en.json", size: 292, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2020,7 +2020,7 @@ func yaoDataKbProvidersConverterUtf8ZhCnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/converter/utf8/zh-cn.json", size: 281, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/utf8/zh-cn.json", size: 281, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2040,7 +2040,7 @@ func yaoDataKbProvidersConverterVideoEnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/converter/video/en.json", size: 6411, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/video/en.json", size: 6411, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2060,7 +2060,7 @@ func yaoDataKbProvidersConverterVideoZhCnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/converter/video/zh-cn.json", size: 6297, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/video/zh-cn.json", size: 6297, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2080,7 +2080,7 @@ func yaoDataKbProvidersConverterVisionEnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/converter/vision/en.json", size: 4085, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/vision/en.json", size: 4085, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2100,7 +2100,7 @@ func yaoDataKbProvidersConverterVisionZhCnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/converter/vision/zh-cn.json", size: 3949, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/vision/zh-cn.json", size: 3949, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2120,7 +2120,7 @@ func yaoDataKbProvidersConverterWhisperEnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/converter/whisper/en.json", size: 4449, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/whisper/en.json", size: 4449, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2140,7 +2140,7 @@ func yaoDataKbProvidersConverterWhisperZhCnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/converter/whisper/zh-cn.json", size: 4312, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/whisper/zh-cn.json", size: 4312, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2160,7 +2160,7 @@ func yaoDataKbProvidersEmbeddingFastembedEnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/embedding/fastembed/en.json", size: 6865, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/embedding/fastembed/en.json", size: 6865, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2180,7 +2180,7 @@ func yaoDataKbProvidersEmbeddingFastembedZhCnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/embedding/fastembed/zh-cn.json", size: 6685, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/embedding/fastembed/zh-cn.json", size: 6685, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2200,7 +2200,7 @@ func yaoDataKbProvidersEmbeddingOpenaiEnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/embedding/openai/en.json", size: 5636, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/embedding/openai/en.json", size: 5636, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2220,7 +2220,7 @@ func yaoDataKbProvidersEmbeddingOpenaiZhCnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/embedding/openai/zh-cn.json", size: 5463, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/embedding/openai/zh-cn.json", size: 5463, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2240,7 +2240,7 @@ func yaoDataKbProvidersExtractionOpenaiEnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/extraction/openai/en.json", size: 9110, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/extraction/openai/en.json", size: 9110, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2260,7 +2260,7 @@ func yaoDataKbProvidersExtractionOpenaiZhCnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/extraction/openai/zh-cn.json", size: 8827, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/extraction/openai/zh-cn.json", size: 8827, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2280,7 +2280,7 @@ func yaoDataKbProvidersFetcherHttpEnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/fetcher/http/en.json", size: 5885, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/fetcher/http/en.json", size: 5885, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2300,7 +2300,7 @@ func yaoDataKbProvidersFetcherHttpZhCnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/fetcher/http/zh-cn.json", size: 5925, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/fetcher/http/zh-cn.json", size: 5925, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2320,7 +2320,7 @@ func yaoDataKbProvidersFetcherMcpEnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/fetcher/mcp/en.json", size: 6819, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/fetcher/mcp/en.json", size: 6819, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2340,7 +2340,7 @@ func yaoDataKbProvidersFetcherMcpZhCnJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/kb/providers/fetcher/mcp/zh-cn.json", size: 6611, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/fetcher/mcp/zh-cn.json", size: 6611, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2360,7 +2360,7 @@ func yaoFieldsModelTransJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/fields/model.trans.json", size: 14938, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/fields/model.trans.json", size: 14938, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2380,7 +2380,7 @@ func yaoLangsEnUsJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/langs/en-US.json", size: 66, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/langs/en-US.json", size: 66, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2400,7 +2400,7 @@ func yaoLangsZhCnGlobalYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/langs/zh-cn/global.yml", size: 1762, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/langs/zh-cn/global.yml", size: 1762, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2420,7 +2420,7 @@ func yaoLangsZhCnLoginsAdminLoginYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/langs/zh-cn/logins/admin.login.yml", size: 94, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/langs/zh-cn/logins/admin.login.yml", size: 94, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2440,7 +2440,7 @@ func yaoLangsZhCnLoginsUserLoginYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/langs/zh-cn/logins/user.login.yml", size: 90, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/langs/zh-cn/logins/user.login.yml", size: 90, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2460,7 +2460,7 @@ func yaoLangsZhHkGlobalYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/langs/zh-hk/global.yml", size: 1762, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/langs/zh-hk/global.yml", size: 1762, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2480,7 +2480,7 @@ func yaoLangsZhHkLoginsAdminLoginYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/langs/zh-hk/logins/admin.login.yml", size: 94, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/langs/zh-hk/logins/admin.login.yml", size: 94, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2500,7 +2500,7 @@ func yaoLangsZhHkLoginsUserLoginYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/langs/zh-hk/logins/user.login.yml", size: 90, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/langs/zh-hk/logins/user.login.yml", size: 90, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2520,12 +2520,12 @@ func yaoModelsAgentAssistantModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/agent/assistant.mod.yao", size: 6758, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/models/agent/assistant.mod.yao", size: 6758, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } -var _yaoModelsAgentChatModYao = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x96\xdf\x8b\x23\x37\x0c\xc7\xdf\xf3\x57\x08\x3f\xb5\xb0\x3d\x8e\xd2\x16\x36\x6f\x4b\xfb\x52\xe8\xd2\x42\xaf\xf4\xe1\x38\x82\x32\x56\x12\xb7\xfe\x31\xb5\x34\x4b\x87\x65\xff\xf7\xc3\xce\xcc\xc4\x33\xe3\xdd\xbd\x70\xfb\x92\x07\x59\x23\x7f\xbe\x92\x62\xe9\x71\x03\xa0\x3c\x3a\x52\x5b\x50\x3f\x9f\x50\xd4\x4d\xb2\x58\xdc\x93\x9d\x9b\x34\x71\x13\x4d\x2b\x26\xf8\xf1\x00\x98\x98\x4d\xf0\x20\xb8\xb7\x04\x87\x10\x81\x25\x44\xe3\x8f\xd0\xa4\x63\x47\x82\x1a\x05\x01\xbd\x9e\x7c\x8d\x3f\x84\xe8\x30\xc7\xc9\x81\x05\x8f\xac\xb6\xf0\x51\xe1\x91\xbc\xa8\x1b\x50\xdc\xb3\x90\x53\x9f\xf2\xf1\xbe\x33\x56\x4c\xba\x53\x62\x47\xd9\x14\x09\x75\xf0\xb6\x2f\x6d\x1c\xa2\xa8\x2d\xdc\xde\xde\xde\x0e\x51\xf7\x36\x89\x7a\xbc\xc8\xcb\xf1\x77\x4d\x56\x04\xaa\x09\xce\xa5\xfb\xb6\xa0\xee\xd2\xc1\x19\x79\xa6\x48\xc1\x53\x8e\xd5\x04\xdb\x39\x9f\x21\x37\x00\x00\x8f\xf9\xb7\x48\x9c\xd1\x59\x4a\xb6\x49\xdf\x66\xdb\xaf\xbf\x5c\x6c\x53\x3a\x4b\x63\x09\xd0\x49\xf8\xce\xf8\x26\x52\xb2\x40\x1b\x8d\xc3\xd8\xc3\xbf\xd4\xab\xec\xfd\x74\x53\xbf\x37\x21\xef\x6a\x97\xb3\xa4\x2a\x54\x00\x72\xd9\x9e\xa1\xf8\xcb\x9b\xff\x3a\x3a\xe7\xc1\x68\xf2\x62\x0e\x86\x62\x11\x84\xfc\x51\x4e\x6a\x0b\x3f\xfd\x30\xd9\x7c\x67\xed\x90\xe9\x03\x5a\xa6\xe9\xa0\xcb\xc1\x86\x0a\xbd\x28\x42\x8c\x58\xba\x42\xc2\x87\xb9\x7f\x21\x20\x8b\x5b\x84\x9b\xa0\x7f\x7c\xff\xbe\x46\xfd\x2a\x1e\x32\x1b\x16\xf4\x57\x26\xfa\x6e\xfc\xec\xb9\x6c\xdf\x31\x87\xc6\xa0\x90\x06\xac\xfa\x4e\xe4\xdf\xd7\xc9\xe7\xf9\x36\x5e\xd3\xff\x5f\xa2\xc7\x05\x7d\x4d\xb6\xef\x67\xee\xcb\x64\xa7\x60\xf0\x8d\xa6\x03\x76\x56\xb6\xb9\x75\xbe\xad\xe6\xfe\x75\x01\x43\x90\xb1\xad\x5f\x6e\x7c\x16\x94\x8e\xd7\x32\xc8\x77\xae\x22\xe2\xcf\x85\xfb\x52\xc6\x32\x5c\x18\x9f\xb9\x8f\x0a\x1b\x31\x0f\x94\x1e\x0c\x8c\xcd\xc9\x3c\x90\x3e\xbf\x4b\x4b\xe6\xd1\xef\xed\x0a\xd5\x76\x7b\x6b\x9a\xb5\xc6\x7d\x08\x96\xd0\x57\x64\xfe\xb1\xf8\xa2\x90\xf9\xf7\x89\xe4\x44\x11\xf8\x84\x31\x75\x5c\x13\x03\x33\xa0\xb5\x20\x84\xae\x90\x7e\x91\x34\xc7\x5e\xea\x79\xb9\x3c\xe9\x96\x2f\xaf\xce\xdc\xbb\xa0\x4e\x27\x69\x9a\x70\x13\x5a\xaa\x96\xa7\x8d\xe6\x01\x25\xd7\x27\x09\xa9\xd7\x66\x72\x7a\xbb\xe2\xe4\x71\xb3\x12\x68\xbc\xd0\x71\xf6\x64\x4e\x1a\x67\xfe\xa5\xc4\x10\x05\x42\xd4\x14\xf3\xfc\xd4\x86\x5b\x8b\x7d\xad\x1e\x69\xb4\xbd\xc8\x64\x91\x65\xe7\x88\x19\x8f\xb4\xc3\x0a\x9e\x46\x21\x31\x8e\x2a\x7c\xbf\x21\x0b\xdc\x9f\xbf\x85\xbb\x3a\xea\x07\xe3\x88\x05\x5d\x0b\xe1\x00\xe9\x32\x18\x2e\xab\x26\x76\x9c\xcc\xd7\xe5\x75\x5c\x19\xd6\xf0\xff\x70\xa8\xf5\xfc\xfd\xea\x83\xf2\x8d\xd5\xda\xa4\x56\x41\x0b\xeb\xc0\xd5\x21\xb0\x01\xf8\x34\xec\x18\x36\xef\x28\x69\xea\x9f\x29\x2f\x93\x60\x32\x15\x78\x27\xe4\xdf\x7d\x91\x89\xf4\x32\x66\xc0\xdd\xae\xc7\xf0\x2e\xef\x1e\xef\x2e\x11\x26\xbf\x34\xe3\x9f\x9d\x32\x87\x10\xc9\x1c\xfd\xca\xa1\x4c\xa1\x1a\x8a\xc0\xcf\x50\xdd\xa3\xef\x5f\xc1\x5a\x95\x71\x80\x5a\xad\x17\x05\xcf\x78\x36\x43\x89\xc4\x9d\xfb\x1a\x92\x73\x80\xaf\x00\xd9\x0c\x30\x97\x37\xe2\x31\x6d\x18\x43\xe3\xf2\xd8\x97\xe9\x0f\x7c\x90\x9d\x26\x4b\x42\x85\xb5\xa5\xe8\x4c\xde\x00\x07\x1b\x3c\x6d\x9e\x36\x9b\xcf\x01\x00\x00\xff\xff\xcd\xea\x1c\xfe\x26\x0b\x00\x00") +var _yaoModelsAgentChatModYao = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x96\xcd\x8e\x1b\x37\x0c\xc7\xef\x7e\x0a\x42\xa7\x14\xd8\x06\x41\xd1\x14\x58\xdf\x16\xc9\x25\x40\x17\x2d\xd0\x14\x3d\x04\x81\x41\x8f\x68\x5b\xad\x3e\xa6\x22\x67\x51\x63\xb1\xef\x5e\x48\x9e\x19\x6b\x3c\xf2\xae\x9d\xec\x65\x0e\x14\x87\xfa\xff\x48\x89\xe2\xe3\x02\x40\x79\x74\xa4\x96\xa0\x3e\xec\x50\xd4\x4d\xb2\x58\x5c\x93\x9d\x9a\x34\x71\x13\x4d\x2b\x26\xf8\x61\x01\x98\x98\x4d\xf0\x20\xb8\xb6\x04\x9b\x10\x81\x25\x44\xe3\xb7\xd0\xa4\x65\x47\x82\x1a\x05\x01\xbd\x1e\x7d\x8d\xdf\x84\xe8\x30\xc7\xc9\x81\x05\xb7\xac\x96\xf0\x45\xe1\x96\xbc\xa8\x1b\x50\xbc\x67\x21\xa7\xbe\xe6\xe5\x75\x67\xac\x98\xb4\xa7\xc4\x8e\xb2\x29\x12\xea\xe0\xed\xbe\xb4\x71\x88\xa2\x96\x70\x7b\x7b\x7b\xdb\x47\x5d\xdb\x04\xf5\x78\xc4\xcb\xf1\x57\x4d\x26\x02\xd5\x04\xe7\xd2\x7e\x4b\x50\x77\x69\xe1\x20\x79\x42\xa4\xe0\x29\xc7\x6a\x82\xed\x9c\xcf\x22\x17\x00\x00\x8f\xf9\x5b\x24\xce\xe8\x8c\x92\x6d\xb2\x6f\xb3\xed\xd3\xc7\xa3\x6d\x4c\x67\x69\x2c\x05\x74\x12\x7e\x34\xbe\x89\x94\x2c\xd0\x46\xe3\x30\xee\xe1\x1f\xda\xab\xec\xfd\x74\x53\xdf\x37\x49\x5e\xd5\x36\x67\x49\x55\xa8\x08\xc8\x65\x3b\xa3\xe2\x4f\x6f\xfe\xed\xe8\x90\x07\xa3\xc9\x8b\xd9\x18\x8a\x45\x10\xf2\x5b\xd9\xa9\x25\xfc\xf2\xf3\x68\xf3\x9d\xb5\x7d\xa6\x37\x68\x99\xc6\x85\x2e\x07\xeb\x2b\xf4\x2c\x84\x18\xb1\x74\x05\xc2\xe7\xa9\x7f\x01\x90\xe1\x4e\xc2\x8d\xa2\xdf\xbf\x7b\x57\x53\xfd\xa2\x3c\x64\x36\x2c\xe8\xaf\x4c\xf4\xdd\xf0\xdb\xb9\x6c\xdf\x31\x87\xc6\xa0\x90\x06\xac\xfa\x8e\xca\x7f\xaa\x2b\x9f\xe6\xdb\x78\x4d\xff\x5d\xc2\x63\x91\x65\xd5\x04\xef\xa9\x91\x10\xaf\x20\xfa\x15\x59\xe0\xc3\xfc\xc7\x82\x29\xbb\x74\x4c\x1a\xc6\x0d\xe0\xd3\x47\x78\xd3\xb5\x3a\x83\x06\x0f\x84\xcd\x0e\x1c\x31\xe3\x96\x7e\xb8\x1c\x76\xb8\xe7\xd7\xb1\xba\xa0\xaf\x39\x59\xf7\x13\xf7\xd3\x83\x95\x82\xc1\x1b\x4d\x1b\xec\xac\x2c\xf3\x35\xa9\x01\xbc\xbf\xa0\x58\x7d\x90\xe1\x0a\x3f\x7f\xc9\x59\x50\x3a\x9e\x63\x90\xef\x5c\x05\xe2\x8f\x13\xf7\x53\x8c\xd3\x70\x61\x68\xe9\x5f\x14\x36\x62\x1e\x28\x35\x47\x8c\xcd\xce\x3c\x90\x3e\xf4\xe0\x53\xcd\x83\xdf\xeb\x1d\xca\xb6\x5b\x5b\xd3\xcc\x19\xd7\x21\x58\x42\x5f\xc1\xfc\xfd\xe4\x8f\x02\xf3\xaf\x1d\xc9\x8e\x22\xf0\x0e\x63\xba\x5d\x4d\x0c\xcc\x80\xd6\x82\x10\xba\x02\xfd\x88\x34\x95\x7d\xca\xf3\x7c\x79\xd2\x2e\x97\x57\x67\xea\x5d\xa8\x4e\x2b\xe9\xe5\xe4\x26\xb4\x54\x2d\x4f\x1b\xcd\x03\x4a\xae\x4f\x02\xa9\xd7\x66\x74\x7a\xbd\xe2\xe4\xa7\x75\x06\x68\xbc\xd0\x76\xf2\x3c\x8c\x8c\x13\xff\x12\x31\x44\x81\x10\x35\xc5\x3c\x2b\x68\xc3\xad\xc5\x7d\xad\x1e\xe9\x19\x7f\xb9\x8b\xf5\x6d\x64\x85\x15\x79\xa9\xe1\x88\x71\x74\xae\x91\xdd\x1f\xfe\x85\xbb\xba\xd4\xcf\xc6\x11\x0b\xba\x16\xc2\x06\xd2\x66\x43\xcf\xaa\x26\xf6\x1b\xbb\x53\x3f\x1e\xcd\xc5\xff\xcd\xa1\x76\xe6\xef\x67\x3f\x94\xef\x89\xd6\x26\x1d\x15\xb4\x30\x0f\x5c\x7d\xf0\x16\x00\x5f\xfb\x79\xca\xe6\x79\x2c\x4d\x38\x07\x95\xc7\x57\x6f\x34\x15\xf2\x76\xc8\xbf\xf9\x22\x13\xa9\x33\x66\x81\xab\xd5\x1e\xc3\xdb\x3c\x67\xbd\x3d\x46\x18\xfd\xd2\x3c\x73\xf6\x45\xdd\x84\x48\x66\xeb\x67\x0e\x65\x0a\x55\x5f\x04\x3e\xa3\xea\x1e\xfd\xfe\x05\x59\xb3\x32\xf6\xa2\x66\xa3\x54\xa1\x67\x58\x9b\x48\x89\xc4\x9d\xfb\x1e\x25\x87\x00\xdf\x21\x64\xd1\x8b\x39\xf6\x88\xc7\x34\x4d\xf5\x07\x97\x87\x73\x99\x2e\xf0\x46\x56\x9a\x2c\x09\x15\xd6\x96\xa2\x33\x79\xda\xed\x6d\xf0\xb4\x78\x5a\xfc\x1f\x00\x00\xff\xff\xf0\x08\x02\x91\x11\x0c\x00\x00") func yaoModelsAgentChatModYaoBytes() ([]byte, error) { return bindataRead( @@ -2540,12 +2540,12 @@ func yaoModelsAgentChatModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/agent/chat.mod.yao", size: 2854, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/models/agent/chat.mod.yao", size: 3089, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } -var _yaoModelsAgentMessageModYao = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\x56\x4d\x6f\xdb\x38\x10\xbd\xfb\x57\x0c\x78\xf2\x02\x4a\x36\x58\xec\x2e\x60\xdf\xd2\xf6\x92\x43\xd0\xa0\x4d\x4f\x41\x20\xd0\xd2\x58\x66\xc2\x0f\x87\x1c\xa5\x31\x0c\xff\xf7\x82\xb4\x24\x53\x31\x65\x44\x46\x7b\x31\xe0\x99\xd1\xf0\xbd\x99\x79\x43\x6e\x27\x00\x4c\x73\x85\x6c\x0e\xec\x16\x9d\xe3\x15\xb2\xcc\x1b\x25\x5f\xa0\x3c\xb2\x96\xe8\x0a\x2b\xd6\x24\x8c\xf6\xbe\xcf\x2b\x4e\xa0\xf6\x01\x40\x7c\x21\x11\x96\xc6\x82\x23\x63\x85\xae\xa0\x76\x68\x2f\x5e\x85\x13\xde\xd1\x84\xb9\x7d\x22\xe2\x95\x63\x73\x78\x60\xbc\x42\x4d\x2c\x03\xe6\x36\x8e\x50\xb1\xc7\xe0\x5e\xd4\x42\x92\xf0\x67\x90\xad\x31\x98\x2c\xf2\xd2\x68\xb9\x89\x6d\xce\x58\x62\x73\x98\xcd\x66\xb3\x26\xeb\x42\x7a\x2a\xdb\x03\xa9\x90\x3f\x57\x2d\x09\x60\x85\x51\xca\x1f\x39\x07\x76\xed\x7d\x50\x1c\x91\x60\xb0\x0b\xe9\x0a\x23\x6b\xa5\x03\xce\x09\x00\xc0\x36\xfc\x46\x15\x13\x65\x60\x13\x6c\xb4\x59\x07\xdb\xcd\x97\x83\xad\x2b\x62\x6c\x8c\x01\xd4\x64\x2e\x84\x2e\x2c\x7a\x0b\xac\xad\x50\xdc\x6e\xe0\x19\x37\x2c\x44\xef\xb2\xf4\xb9\x0d\xda\x3c\x75\xbe\x23\x5f\xfb\x04\x86\xa6\x91\x30\x80\xe5\x87\x16\x2f\x75\xd7\x26\x10\x25\x6a\x12\x4b\x81\x36\x4a\x85\xba\xa2\x15\x9b\xc3\xff\xff\x76\x36\x5d\x4b\xd9\x54\x7d\xc9\xa5\xc3\xce\x51\x87\x7c\x4d\xb7\x4e\xb2\xf1\x0d\x18\x47\x25\xcc\xdd\x00\x8f\x3b\x6e\xbb\xae\xf6\x7a\x31\x06\xbc\xd0\x25\xbe\x7d\x04\xbb\xc5\x97\x1a\xdd\x48\xf8\xdf\xf6\x1f\x0d\x31\x38\xb8\x83\x9a\x2a\x6b\xea\x75\x3f\xd1\x69\x2a\xad\x3c\x46\x32\x31\x12\x8f\x39\xa0\xae\x55\x8a\x41\x2f\x38\xc2\xde\x0e\x59\x3f\x9b\x69\x37\xc6\x03\xf3\x3b\xc1\xcb\x90\x3b\x27\x1c\x71\x4d\x7b\xc5\xff\xa6\x76\x04\xd8\x1f\x6f\xc4\x7d\x2f\x3c\x41\xc3\x67\x80\x29\xe1\x1b\x65\x20\x14\xaf\x30\x03\x69\x78\x29\x74\x95\x01\x19\x23\xf3\x82\x4b\x99\x81\x45\xb2\x02\x5f\xb9\xcc\x00\xa9\xb8\xfc\x2b\xd1\xaa\xff\xae\x06\x69\x9e\x64\xb4\xb6\x66\xed\x8e\x29\x3d\x39\xa3\x13\x84\xee\xfa\xd1\x09\x46\x3e\x1f\x5a\x12\xe8\x60\x5a\x18\x4d\xa8\x29\x83\xda\x1e\x23\x1f\x85\x72\x21\x4d\xf1\x3c\x4e\x04\x9f\xfc\x27\x43\x12\xd8\x3b\xdb\xc9\x1f\xa3\xe3\xf3\x86\x9f\x56\xfe\x7a\x19\x47\xe0\x3e\x7c\x33\xc4\xa0\xf1\x46\x14\x82\x98\x0b\xa3\x8b\xda\x86\x0d\xe5\xfb\xc0\xbd\x2e\xdc\x1f\x26\xd7\x49\x6d\x1c\xbf\xeb\xf6\xb3\x21\x8a\x71\x00\x4c\x9f\x8c\xd0\x40\x06\x2a\x24\xf0\x27\xff\xcd\x5f\x39\x71\x9b\xd2\xc2\x3f\x57\x49\x31\x9c\xc7\xce\xf9\x6d\xa9\x8b\x84\xec\x85\x26\xac\x7a\xf7\x57\x4b\xed\xfb\xd1\x37\x09\xa5\x18\x5b\xa2\x85\x9f\x82\x56\x42\x87\xeb\xe4\x4c\x6d\x28\x24\x5e\x72\xe2\x1f\x16\xf1\xed\xd1\x07\x71\xd1\xcb\x52\xf8\xa1\xe1\x12\xda\xc4\x30\xed\x56\x51\x2e\xca\x66\x31\xf9\xd3\x4f\x69\xfa\x50\xd7\x09\xc0\x63\xf3\xc2\x92\xcd\x3c\xce\x1b\x16\xe1\x6a\xee\xfe\x45\xc8\x57\xdc\x7d\xd5\x51\xf9\x94\x29\xf7\xd8\xf3\x7c\xc3\xcd\x65\x78\x74\x5d\xf6\x6b\xe6\x1f\x35\xa9\xcb\x7e\x69\x2c\x8a\x4a\xc7\xbe\xb8\x9c\xd1\x45\x71\x2e\x8e\x43\x86\xf7\x60\xd2\xca\x88\x10\xf5\x02\xba\x72\xed\x5f\x87\x61\x42\xf1\xe4\xeb\xf0\x2d\x57\xae\xca\x03\x2d\x87\x2f\x71\x3f\xbb\x87\xe5\xa1\x20\xd1\x28\x3f\x26\x66\xd9\xcb\x21\x35\x10\x37\xde\x13\x76\x8b\x8a\x07\xd7\xef\x9c\x78\x76\xdf\xf5\xba\xbb\x91\xb7\xc0\x48\x28\x74\xc4\xd5\xda\xb5\x22\xf4\x2f\xeb\x25\xe5\x25\x4a\x24\x6c\xad\xb0\x9b\xec\x26\x93\x5f\x01\x00\x00\xff\xff\x44\xb3\x47\xb8\x32\x0c\x00\x00") +var _yaoModelsAgentMessageModYao = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\x57\x4d\x6f\xe3\x38\x0c\xbd\xe7\x57\x10\x3a\x65\x01\xb7\x5b\x2c\x76\x17\x48\x6e\xdd\x9d\x4b\x0f\xc5\x14\x33\x9d\x53\x51\x18\x8a\xcd\x38\x6a\xf5\x91\x4a\x74\xa7\x41\x90\xff\x3e\x90\x62\x3b\x72\xad\x04\x75\x30\xbd\x14\x28\x29\xd1\xef\x91\x7c\x14\xb3\x9d\x00\x30\xcd\x15\xb2\x39\xb0\x5b\x74\x8e\x57\xc8\x32\x6f\x94\x7c\x81\x72\x60\x2d\xd1\x15\x56\xac\x49\x18\xed\x7d\xff\xaf\x38\x81\xda\x1f\x00\xe2\x0b\x89\xb0\x34\x16\x1c\x19\x2b\x74\x05\xb5\x43\x7b\xf1\x2a\x9c\xf0\x8e\xe6\x98\xdb\x07\x22\x5e\x39\x36\x87\x07\xc6\x2b\xd4\xc4\x32\x60\x6e\xe3\x08\x15\x7b\x0c\xee\x45\x2d\x24\x09\xff\x0d\xb2\x35\x06\x93\x45\x5e\x1a\x2d\x37\xb1\xcd\x19\x4b\x6c\x0e\xb3\xd9\x6c\xd6\x44\x5d\x48\x4f\x65\x7b\x20\x15\xe2\xe7\xaa\x25\x01\xac\x30\x4a\xf9\x4f\xce\x81\x5d\x7b\x1f\x14\x03\x12\x0c\x76\x21\x5c\x61\x64\xad\x74\xc0\x39\x01\x00\xd8\x86\xbf\x51\xc6\x44\x19\xd8\x04\x1b\x6d\xd6\xc1\x76\xf3\xe5\x60\xeb\x92\x18\x1b\x63\x00\x35\x99\x0b\xa1\x0b\x8b\xde\x02\x6b\x2b\x14\xb7\x1b\x78\xc6\x0d\x0b\xa7\x77\x59\xfa\xbb\x0d\xda\x3c\xf5\x7d\x47\x3e\xf7\x09\x0c\x4d\x21\xe1\x08\x96\x1f\x5a\xbc\xd4\x5d\x99\x40\x94\xa8\x49\x2c\x05\xda\x28\x14\xea\x8a\x56\x6c\x0e\xff\xfe\xdd\xd9\x74\x2d\x65\x93\xf5\x25\x97\x0e\x3b\x47\x1d\xe2\x35\xd5\x3a\xc9\xc6\x17\x60\x1c\x95\xd0\x77\x47\x78\xdc\x71\xdb\x55\xb5\x57\x8b\x31\xe0\x85\x2e\xf1\xed\x23\xd8\x2d\xbe\xd4\xe8\x46\xc2\xff\xb6\xbf\x74\x8c\xc1\xc1\x1d\xd4\x54\x59\x53\xaf\xfb\x81\x4e\x53\x69\xe5\x31\x92\x89\x91\x38\xe4\x80\xba\x56\x29\x06\xbd\xc3\x11\xf6\xb6\xc9\xfa\xd1\x4c\x3b\x31\x1e\x98\x9f\x09\x5e\x86\xdc\x39\xe1\x88\x6b\xda\x2b\xfe\x37\x95\x23\xc0\xfe\x78\x21\xee\x7b\xc7\x13\x34\x7c\x04\x98\x12\xbe\x51\x06\x42\xf1\x0a\x33\x90\x86\x97\x42\x57\x19\x90\x31\x32\x2f\xb8\x94\x19\x58\x24\x2b\xf0\x95\xcb\x0c\x90\x8a\xcb\x3f\x12\xa5\xfa\xe7\xea\x28\xcd\x93\x8c\xd6\xd6\xac\xdd\x90\xd2\x93\x33\x3a\x41\xe8\xae\x7f\x3a\xc1\xc8\xc7\x43\x4b\x02\x1d\x4c\x0b\xa3\x09\x35\x65\x50\xdb\x21\xf2\x51\x28\x17\xd2\x14\xcf\xe3\x44\xf0\x9f\xbf\x72\x4c\x02\x7b\x67\xdb\xf9\x63\x74\x7c\x5e\xf3\xd3\xca\x3f\x2f\xe3\x08\xdc\x87\x3b\xc7\x18\x34\xde\x88\x42\x10\x73\x61\x74\x51\xdb\x30\xa1\x7c\x1d\xb8\xd7\x85\xfb\x64\x72\x9d\xd4\xc6\xf1\xbb\x6e\xaf\x1d\xa3\x18\x1f\x80\xe9\x93\x11\x1a\xc8\x40\x85\x04\xfe\xcb\x7f\xf2\x57\x4e\xdc\xa6\xb4\xf0\xd7\x55\x52\x0c\xe7\xb1\x2b\x8c\xd6\x58\x90\xb1\x63\xde\x8f\xe1\x9d\x88\x57\xe7\xf5\xbc\x6a\x87\x65\xa8\x1c\xad\x84\x03\x15\x2d\x43\x9f\xc8\xc9\xf9\x17\x40\x17\x89\x51\x26\x34\x61\xd5\x7b\x93\x5b\x4e\xdf\x07\x77\x12\xea\x37\xb6\x44\x0b\x3f\x05\xad\x84\x0e\x4f\xe4\x99\x7a\x57\x48\xbc\xe4\xc4\x3f\x3c\x98\x6e\x07\x17\xe2\x46\x2a\x4b\xe1\x85\xc0\x25\xb4\x81\x61\xda\x8d\xd7\x5c\x94\xcd\xb0\xf5\x5f\x3f\x35\xa7\x0e\x79\x9d\x00\x3c\x36\x5b\xa3\x6c\x34\x36\x6f\x58\x84\x75\xa3\xfb\x2f\x42\xbe\xe2\xee\xab\x8e\xd2\xa7\x4c\xb9\xc7\x9e\xe7\x1b\x6e\x2e\xc3\x22\x79\xd9\xcf\x99\x5f\xd4\x52\x0b\xcc\xd2\x58\x14\x95\x8e\x7d\x71\x3a\xa3\xc7\xef\x5c\x1c\x87\x08\xef\xc1\xa4\xd5\x1e\x21\xea\x1d\xe8\xd2\xb5\xdf\x78\x43\x87\xe2\xc9\x8d\xf7\x2d\x57\xae\xca\x03\x2d\x87\x2f\x71\x3d\xbb\x65\xf9\x90\x90\xa8\x95\x1f\x13\xbd\xec\xe5\x90\x6a\x88\x1b\xef\x09\xaa\x53\x71\xe3\xfa\x39\x1a\xf7\xee\xbb\x5a\x77\x5b\xc6\x16\x18\x09\x85\x8e\xb8\x5a\xbb\x56\x84\xfe\xd7\xc2\x92\xf2\x12\x25\x12\xb6\x56\xd8\x4d\x76\x93\x5f\x01\x00\x00\xff\xff\xe8\xbd\x2d\xa4\x05\x0d\x00\x00") func yaoModelsAgentMessageModYaoBytes() ([]byte, error) { return bindataRead( @@ -2560,7 +2560,7 @@ func yaoModelsAgentMessageModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/agent/message.mod.yao", size: 3122, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/models/agent/message.mod.yao", size: 3333, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2580,7 +2580,7 @@ func yaoModelsAgentResumeModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/agent/resume.mod.yao", size: 3896, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/models/agent/resume.mod.yao", size: 3896, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2600,7 +2600,7 @@ func yaoModelsAttachmentModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/attachment.mod.yao", size: 4687, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/models/attachment.mod.yao", size: 4687, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2620,7 +2620,7 @@ func yaoModelsAuditModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/audit.mod.yao", size: 5588, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/models/audit.mod.yao", size: 5588, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2640,7 +2640,7 @@ func yaoModelsConfigModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/config.mod.yao", size: 1649, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/models/config.mod.yao", size: 1649, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2660,7 +2660,7 @@ func yaoModelsDslModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/dsl.mod.yao", size: 3826, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/models/dsl.mod.yao", size: 3826, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2680,7 +2680,7 @@ func yaoModelsInvitationModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/invitation.mod.yao", size: 6693, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/models/invitation.mod.yao", size: 6693, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2700,7 +2700,7 @@ func yaoModelsJobCategoryModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/job/category.mod.yao", size: 2041, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/models/job/category.mod.yao", size: 2041, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2720,7 +2720,7 @@ func yaoModelsJobExecutionModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/job/execution.mod.yao", size: 7201, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/models/job/execution.mod.yao", size: 7201, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2740,7 +2740,7 @@ func yaoModelsJobJobModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/job/job.mod.yao", size: 6330, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/models/job/job.mod.yao", size: 6330, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2760,7 +2760,7 @@ func yaoModelsJobLogModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/job/log.mod.yao", size: 4711, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/models/job/log.mod.yao", size: 4711, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2780,7 +2780,7 @@ func yaoModelsKbCollectionModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/kb/collection.mod.yao", size: 5390, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/models/kb/collection.mod.yao", size: 5390, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2800,7 +2800,7 @@ func yaoModelsKbDocumentModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/kb/document.mod.yao", size: 9906, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/models/kb/document.mod.yao", size: 9906, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2820,7 +2820,7 @@ func yaoModelsMemberModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/member.mod.yao", size: 14798, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/models/member.mod.yao", size: 14798, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2840,7 +2840,7 @@ func yaoModelsRoleModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/role.mod.yao", size: 6434, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/models/role.mod.yao", size: 6434, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2860,7 +2860,7 @@ func yaoModelsTeamModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/team.mod.yao", size: 15823, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/models/team.mod.yao", size: 15823, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2880,7 +2880,7 @@ func yaoModelsUserOauth_accountModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/user/oauth_account.mod.yao", size: 6928, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/models/user/oauth_account.mod.yao", size: 6928, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2900,7 +2900,7 @@ func yaoModelsUserTypeModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/user/type.mod.yao", size: 7502, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/models/user/type.mod.yao", size: 7502, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2920,7 +2920,7 @@ func yaoModelsUserModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/user.mod.yao", size: 12335, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/models/user.mod.yao", size: 12335, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2940,7 +2940,7 @@ func yaoReleaseAppYaz() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/release/app.yaz", size: 181682, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/release/app.yaz", size: 181682, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2960,7 +2960,7 @@ func yaoStoresAgentCacheLruYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/stores/agent/cache.lru.yao", size: 301, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/stores/agent/cache.lru.yao", size: 301, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2980,7 +2980,7 @@ func yaoStoresAgentMemoryBadgerYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/stores/agent/memory.badger.yao", size: 352, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/stores/agent/memory.badger.yao", size: 352, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3000,7 +3000,7 @@ func yaoStoresCacheLruYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/stores/cache.lru.yao", size: 285, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/stores/cache.lru.yao", size: 285, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3020,7 +3020,7 @@ func yaoStoresKbCacheLruYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/stores/kb/cache.lru.yao", size: 304, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/stores/kb/cache.lru.yao", size: 304, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3040,7 +3040,7 @@ func yaoStoresKbStoreBadgerYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/stores/kb/store.badger.yao", size: 349, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/stores/kb/store.badger.yao", size: 349, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3060,7 +3060,7 @@ func yaoStoresOauthCacheLruYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/stores/oauth/cache.lru.yao", size: 301, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/stores/oauth/cache.lru.yao", size: 301, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3080,7 +3080,7 @@ func yaoStoresOauthClientBadgerYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/stores/oauth/client.badger.yao", size: 352, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/stores/oauth/client.badger.yao", size: 352, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3100,7 +3100,7 @@ func yaoStoresOauthStoreBadgerYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/stores/oauth/store.badger.yao", size: 376, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/stores/oauth/store.badger.yao", size: 376, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3120,7 +3120,7 @@ func yaoStoresStoreBadgerYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/stores/store.badger.yao", size: 341, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/stores/store.badger.yao", size: 341, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3140,7 +3140,7 @@ func yaoUploadersAttachmentLocalYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/uploaders/attachment.local.yao", size: 1163, mode: os.FileMode(420), modTime: time.Unix(1765248590, 0)} + info := bindataFileInfo{name: "yao/uploaders/attachment.local.yao", size: 1163, mode: os.FileMode(420), modTime: time.Unix(1765269967, 0)} a := &asset{bytes: bytes, info: info} return a, nil } diff --git a/yao/models/agent/chat.mod.yao b/yao/models/agent/chat.mod.yao index 19dc00ab..9bae8dd0 100644 --- a/yao/models/agent/chat.mod.yao +++ b/yao/models/agent/chat.mod.yao @@ -40,6 +40,15 @@ "nullable": false, "index": true }, + { + "name": "last_connector", + "type": "string", + "label": "Last Connector", + "comment": "Last used connector ID (updated on each message)", + "length": 200, + "nullable": true, + "index": true + }, { "name": "mode", "type": "string", @@ -122,4 +131,3 @@ }, "option": { "timestamps": true, "soft_deletes": true, "permission": true } } - diff --git a/yao/models/agent/message.mod.yao b/yao/models/agent/message.mod.yao index 938ce0ac..54b4f65f 100644 --- a/yao/models/agent/message.mod.yao +++ b/yao/models/agent/message.mod.yao @@ -92,6 +92,15 @@ "nullable": true, "index": true }, + { + "name": "connector", + "type": "string", + "label": "Connector", + "comment": "Connector ID used for this message", + "length": 200, + "nullable": true, + "index": true + }, { "name": "sequence", "type": "integer",