diff --git a/agent/assistant/agent.go b/agent/assistant/agent.go index bcb3af53..c3d9fa42 100644 --- a/agent/assistant/agent.go +++ b/agent/assistant/agent.go @@ -323,33 +323,56 @@ func (ast *Assistant) GetConnector(ctx *context.Context) (connector.Connector, * } // Get connector capabilities from settings - capabilities := ast.getConnectorCapabilities(connectorID) + capabilities := ast.getConnectorCapabilities(conn) return conn, capabilities, nil } // getConnectorCapabilities get the capabilities of a connector from settings -func (ast *Assistant) getConnectorCapabilities(connectorID string) *openai.Capabilities { - // Get model capabilities from global configuration - modelCaps, exists := modelCapabilities[connectorID] - if !exists { - // Return default capabilities if model not found in configuration - falseVal := false +// Priority: 1. modelCapabilities mapping, 2. connector's Setting()["capabilities"] +func (ast *Assistant) getConnectorCapabilities(conn connector.Connector) *openai.Capabilities { + if conn == nil { return &openai.Capabilities{ - Vision: falseVal, + Vision: false, ToolCalls: false, Audio: false, Reasoning: false, Streaming: false, JSON: false, Multimodal: false, - TemperatureAdjustable: true, // Default to true for non-reasoning models + TemperatureAdjustable: true, } } - // Return capabilities directly - // Note: TemperatureAdjustable is automatically set in connector.Setting() based on Reasoning flag - return &modelCaps + // Get connector ID + connectorID := conn.ID() + + // Priority 1: Check global modelCapabilities mapping + if modelCaps, exists := modelCapabilities[connectorID]; exists { + return &modelCaps + } + + // Priority 2: Get capabilities from connector's Setting() method + // Modern connectors (post-upgrade) provide default capabilities via Setting() + settings := conn.Setting() + if caps, ok := settings["capabilities"]; ok { + if capabilities, ok := caps.(*openai.Capabilities); ok { + return capabilities + } + } + + // Fallback: Return minimal default capabilities + // This should rarely happen with upgraded connectors + return &openai.Capabilities{ + Vision: false, + ToolCalls: false, + Audio: false, + Reasoning: false, + Streaming: false, + JSON: false, + Multimodal: false, + TemperatureAdjustable: true, // Default to true for non-reasoning models + } } // Info get the assistant information diff --git a/agent/assistant/assistant.go b/agent/assistant/assistant.go index b80c221a..46d06eb1 100644 --- a/agent/assistant/assistant.go +++ b/agent/assistant/assistant.go @@ -4,7 +4,6 @@ import ( "fmt" "path" - jsoniter "github.com/json-iterator/go" "github.com/yaoapp/gou/fs" "github.com/yaoapp/yao/agent/i18n" store "github.com/yaoapp/yao/agent/store/types" @@ -105,7 +104,6 @@ func (ast *Assistant) Map() map[string]interface{} { "prompts": ast.Prompts, "kb": ast.KB, "mcp": ast.MCP, - "tools": ast.Tools, "workflow": ast.Workflow, "tags": ast.Tags, "mentionable": ast.Mentionable, @@ -247,20 +245,6 @@ func (ast *Assistant) Clone() *Assistant { copy(clone.Prompts, ast.Prompts) } - // Deep copy tools - if ast.Tools != nil { - clone.Tools = &store.ToolCalls{} - if ast.Tools.Tools != nil { - clone.Tools.Tools = make([]store.Tool, len(ast.Tools.Tools)) - copy(clone.Tools.Tools, ast.Tools.Tools) - } - - if ast.Tools.Prompts != nil { - clone.Tools.Prompts = make([]store.Prompt, len(ast.Tools.Prompts)) - copy(clone.Tools.Prompts, ast.Tools.Prompts) - } - } - // Deep copy workflow if ast.Workflow != nil { clone.Workflow = &store.Workflow{} @@ -328,29 +312,7 @@ func (ast *Assistant) Update(data map[string]interface{}) error { ast.Connector = v } - if v, has := data["tools"]; has { - switch tools := v.(type) { - case []store.Tool: - ast.Tools = &store.ToolCalls{ - Tools: tools, - Prompts: ast.Prompts, - } - - case *store.ToolCalls: - ast.Tools = tools - - default: - raw, err := jsoniter.Marshal(tools) - if err != nil { - return err - } - ast.Tools = &store.ToolCalls{} - err = jsoniter.Unmarshal(raw, &ast.Tools) - if err != nil { - return err - } - } - } + // Note: tools field is deprecated, now handled by MCP if v, ok := data["type"].(string); ok { ast.Type = v diff --git a/agent/assistant/load.go b/agent/assistant/load.go index 718d6303..c46c541c 100644 --- a/agent/assistant/load.go +++ b/agent/assistant/load.go @@ -181,7 +181,8 @@ func LoadStore(id string) (*Assistant, error) { return nil, fmt.Errorf("storage is not set") } - storeModel, err := storage.GetAssistant(id) + // Request all fields when loading assistant from store + storeModel, err := storage.GetAssistant(id, store.AssistantFullFields) if err != nil { return nil, err } @@ -509,32 +510,10 @@ func loadMap(data map[string]interface{}) (*Assistant, error) { } } - // tools - if tools, has := data["tools"]; has { - switch vv := tools.(type) { - case []store.Tool: - assistant.Tools = &store.ToolCalls{ - Tools: vv, - Prompts: assistant.Prompts, - } - - case store.ToolCalls: - assistant.Tools = &vv - - default: - raw, err := jsoniter.Marshal(tools) - if err != nil { - return nil, fmt.Errorf("tools format error %s", err.Error()) - } - - var tools store.ToolCalls - err = jsoniter.Unmarshal(raw, &tools) - if err != nil { - return nil, fmt.Errorf("tools format error %s", err.Error()) - } - assistant.Tools = &tools - } - } + // tools - deprecated, now handled by MCP + // if tools, has := data["tools"]; has { + // ... removed ... + // } // kb if kb, has := data["kb"]; has { diff --git a/agent/store/mongo/mongo.go b/agent/store/mongo/mongo.go index b7f7fda3..9567c762 100644 --- a/agent/store/mongo/mongo.go +++ b/agent/store/mongo/mongo.go @@ -76,7 +76,8 @@ func (m *Mongo) GetAssistants(filter types.AssistantFilter, locale ...string) (* } // GetAssistant retrieves a single assistant by ID -func (m *Mongo) GetAssistant(assistantID string, locale ...string) (*types.AssistantModel, error) { +// fields: Optional list of fields to retrieve. If empty, a default set of fields will be returned. +func (m *Mongo) GetAssistant(assistantID string, fields []string, locale ...string) (*types.AssistantModel, error) { return nil, nil } diff --git a/agent/store/redis/redis.go b/agent/store/redis/redis.go index 36abd48a..cfc52b16 100644 --- a/agent/store/redis/redis.go +++ b/agent/store/redis/redis.go @@ -76,7 +76,8 @@ func (r *Redis) GetAssistants(filter types.AssistantFilter, locale ...string) (* } // GetAssistant retrieves a single assistant by ID -func (r *Redis) GetAssistant(assistantID string, locale ...string) (*types.AssistantModel, error) { +// fields: Optional list of fields to retrieve. If empty, a default set of fields will be returned. +func (r *Redis) GetAssistant(assistantID string, fields []string, locale ...string) (*types.AssistantModel, error) { return nil, nil } diff --git a/agent/store/types/convert.go b/agent/store/types/convert.go index d8ddc59f..d8a59b44 100644 --- a/agent/store/types/convert.go +++ b/agent/store/types/convert.go @@ -217,6 +217,9 @@ func ToAssistantModel(v interface{}) (*AssistantModel, error) { if path, ok := data["path"].(string); ok { model.Path = path } + if source, ok := data["source"].(string); ok { + model.Source = source + } if description, ok := data["description"].(string); ok { model.Description = description } @@ -277,6 +280,28 @@ func ToAssistantModel(v interface{}) (*AssistantModel, error) { } } + // PromptPresets + if promptPresets, ok := data["prompt_presets"]; ok && promptPresets != nil { + raw, err := jsoniter.Marshal(promptPresets) + if err == nil { + var pp map[string][]Prompt + if err := jsoniter.Unmarshal(raw, &pp); err == nil { + model.PromptPresets = pp + } + } + } + + // ConnectorOptions + if connectorOptions, ok := data["connector_options"]; ok && connectorOptions != nil { + raw, err := jsoniter.Marshal(connectorOptions) + if err == nil { + var co ConnectorOptions + if err := jsoniter.Unmarshal(raw, &co); err == nil { + model.ConnectorOptions = &co + } + } + } + // KB if kb, ok := data["kb"]; ok && kb != nil { kbConverted, err := ToKnowledgeBase(kb) @@ -301,17 +326,6 @@ func ToAssistantModel(v interface{}) (*AssistantModel, error) { } } - // Tools - if tools, ok := data["tools"]; ok && tools != nil { - raw, err := jsoniter.Marshal(tools) - if err == nil { - var tc ToolCalls - if err := jsoniter.Unmarshal(raw, &tc); err == nil { - model.Tools = &tc - } - } - } - // Placeholder if placeholder, ok := data["placeholder"]; ok && placeholder != nil { raw, err := jsoniter.Marshal(placeholder) diff --git a/agent/store/types/convert_test.go b/agent/store/types/convert_test.go index ad17acbe..3fbfce1f 100644 --- a/agent/store/types/convert_test.go +++ b/agent/store/types/convert_test.go @@ -428,24 +428,38 @@ func TestToAssistantModel(t *testing.T) { "name": "Test Assistant", "avatar": "https://example.com/avatar.png", "connector": "openai", - "path": "/path/to/assistant", - "description": "Test description", - "share": "team", - "built_in": true, - "readonly": false, - "public": true, - "mentionable": true, - "automated": false, - "sort": 100, - "created_at": int64(1609459200), - "updated_at": int64(1609459300), - "tags": []string{"tag1", "tag2"}, + "connector_options": map[string]interface{}{ + "optional": true, + "connectors": []string{"openai", "anthropic"}, + "filters": []string{"vision", "tool_calls"}, + }, + "path": "/path/to/assistant", + "description": "Test description", + "share": "team", + "built_in": true, + "readonly": false, + "public": true, + "mentionable": true, + "automated": false, + "sort": 100, + "created_at": int64(1609459200), + "updated_at": int64(1609459300), + "tags": []string{"tag1", "tag2"}, "options": map[string]interface{}{ "temperature": 0.7, }, "prompts": []map[string]interface{}{ {"role": "system", "content": "You are helpful"}, }, + "prompt_presets": map[string]interface{}{ + "chat": []map[string]interface{}{ + {"role": "system", "content": "You are a chat assistant"}, + }, + "task": []map[string]interface{}{ + {"role": "system", "content": "You are a task assistant"}, + }, + }, + "source": "function hook() { return 'test'; }", "kb": map[string]interface{}{ "collections": []string{"col1"}, }, @@ -455,9 +469,6 @@ func TestToAssistantModel(t *testing.T) { "workflow": map[string]interface{}{ "workflows": []string{"wf1"}, }, - "tools": map[string]interface{}{ - "calls": []string{"tool1"}, - }, "placeholder": map[string]interface{}{ "title": "Enter message", }, @@ -489,9 +500,25 @@ func TestToAssistantModel(t *testing.T) { if result.Connector != "openai" { t.Errorf("Expected Connector 'openai', got '%s'", result.Connector) } + if result.ConnectorOptions == nil { + t.Error("Expected ConnectorOptions to be set") + } else { + if !result.ConnectorOptions.Optional { + t.Error("Expected ConnectorOptions.Optional to be true") + } + if len(result.ConnectorOptions.Connectors) != 2 { + t.Errorf("Expected 2 connectors in options, got %d", len(result.ConnectorOptions.Connectors)) + } + if len(result.ConnectorOptions.Filters) != 2 { + t.Errorf("Expected 2 filters, got %d", len(result.ConnectorOptions.Filters)) + } + } if result.Path != "/path/to/assistant" { t.Errorf("Expected Path, got '%s'", result.Path) } + if result.Source != "function hook() { return 'test'; }" { + t.Errorf("Expected Source, got '%s'", result.Source) + } if result.Description != "Test description" { t.Errorf("Expected Description, got '%s'", result.Description) } @@ -531,6 +558,23 @@ func TestToAssistantModel(t *testing.T) { if len(result.Prompts) != 1 { t.Errorf("Expected 1 prompt, got %d", len(result.Prompts)) } + if result.PromptPresets == nil { + t.Error("Expected PromptPresets to be set") + } else { + if len(result.PromptPresets) != 2 { + t.Errorf("Expected 2 prompt presets, got %d", len(result.PromptPresets)) + } + if chatPrompts, ok := result.PromptPresets["chat"]; !ok { + t.Error("Expected 'chat' prompt preset") + } else if len(chatPrompts) != 1 { + t.Errorf("Expected 1 chat prompt, got %d", len(chatPrompts)) + } + if taskPrompts, ok := result.PromptPresets["task"]; !ok { + t.Error("Expected 'task' prompt preset") + } else if len(taskPrompts) != 1 { + t.Errorf("Expected 1 task prompt, got %d", len(taskPrompts)) + } + } if result.KB == nil { t.Error("Expected KB to be set") } @@ -540,9 +584,6 @@ func TestToAssistantModel(t *testing.T) { if result.Workflow == nil { t.Error("Expected Workflow to be set") } - if result.Tools == nil { - t.Error("Expected Tools to be set") - } if result.Placeholder == nil { t.Error("Expected Placeholder to be set") } @@ -583,7 +624,6 @@ func TestToAssistantModel(t *testing.T) { "kb": nil, "mcp": nil, "workflow": nil, - "tools": nil, "placeholder": nil, "locales": nil, } @@ -659,6 +699,163 @@ func TestToAssistantModel(t *testing.T) { }) } +// TestToAssistantModelNewFields tests the newly added fields +func TestToAssistantModelNewFields(t *testing.T) { + t.Run("ConnectorOptions", func(t *testing.T) { + data := map[string]interface{}{ + "connector_options": map[string]interface{}{ + "optional": true, + "connectors": []string{"openai", "anthropic", "azure"}, + "filters": []string{"vision", "tool_calls", "audio"}, + }, + } + + result, err := ToAssistantModel(data) + if err != nil { + t.Errorf("Expected no error, got: %v", err) + } + + if result.ConnectorOptions == nil { + t.Fatal("Expected ConnectorOptions to be set") + } + + if !result.ConnectorOptions.Optional { + t.Error("Expected Optional to be true") + } + + if len(result.ConnectorOptions.Connectors) != 3 { + t.Errorf("Expected 3 connectors, got %d", len(result.ConnectorOptions.Connectors)) + } + + if len(result.ConnectorOptions.Filters) != 3 { + t.Errorf("Expected 3 filters, got %d", len(result.ConnectorOptions.Filters)) + } + }) + + t.Run("PromptPresets", func(t *testing.T) { + data := map[string]interface{}{ + "prompt_presets": map[string]interface{}{ + "chat": []map[string]interface{}{ + {"role": "system", "content": "You are a helpful chat assistant"}, + {"role": "user", "content": "Example question"}, + }, + "task": []map[string]interface{}{ + {"role": "system", "content": "You are a task completion assistant"}, + }, + "analyze": []map[string]interface{}{ + {"role": "system", "content": "You are a data analysis assistant"}, + }, + }, + } + + result, err := ToAssistantModel(data) + if err != nil { + t.Errorf("Expected no error, got: %v", err) + } + + if result.PromptPresets == nil { + t.Fatal("Expected PromptPresets to be set") + } + + if len(result.PromptPresets) != 3 { + t.Errorf("Expected 3 prompt preset modes, got %d", len(result.PromptPresets)) + } + + if chatPrompts, ok := result.PromptPresets["chat"]; !ok { + t.Error("Expected 'chat' mode in prompt presets") + } else if len(chatPrompts) != 2 { + t.Errorf("Expected 2 prompts in chat mode, got %d", len(chatPrompts)) + } + + if taskPrompts, ok := result.PromptPresets["task"]; !ok { + t.Error("Expected 'task' mode in prompt presets") + } else if len(taskPrompts) != 1 { + t.Errorf("Expected 1 prompt in task mode, got %d", len(taskPrompts)) + } + + if analyzePrompts, ok := result.PromptPresets["analyze"]; !ok { + t.Error("Expected 'analyze' mode in prompt presets") + } else if len(analyzePrompts) != 1 { + t.Errorf("Expected 1 prompt in analyze mode, got %d", len(analyzePrompts)) + } + }) + + t.Run("Source", func(t *testing.T) { + hookScript := ` +function beforeChat(context) { + console.log('Hook called'); + return context; +} +` + data := map[string]interface{}{ + "source": hookScript, + } + + result, err := ToAssistantModel(data) + if err != nil { + t.Errorf("Expected no error, got: %v", err) + } + + if result.Source != hookScript { + t.Errorf("Expected Source to match, got '%s'", result.Source) + } + }) + + t.Run("AllNewFields", func(t *testing.T) { + data := map[string]interface{}{ + "connector_options": map[string]interface{}{ + "optional": true, + "connectors": []string{"openai"}, + "filters": []string{"vision"}, + }, + "prompt_presets": map[string]interface{}{ + "chat": []map[string]interface{}{ + {"role": "system", "content": "Chat mode"}, + }, + }, + "source": "function test() {}", + } + + result, err := ToAssistantModel(data) + if err != nil { + t.Errorf("Expected no error, got: %v", err) + } + + if result.ConnectorOptions == nil { + t.Error("Expected ConnectorOptions to be set") + } + if result.PromptPresets == nil { + t.Error("Expected PromptPresets to be set") + } + if result.Source == "" { + t.Error("Expected Source to be set") + } + }) + + t.Run("NilNewFields", func(t *testing.T) { + data := map[string]interface{}{ + "connector_options": nil, + "prompt_presets": nil, + "source": nil, + } + + result, err := ToAssistantModel(data) + if err != nil { + t.Errorf("Expected no error, got: %v", err) + } + + if result.ConnectorOptions != nil { + t.Error("Expected ConnectorOptions to be nil") + } + if result.PromptPresets != nil { + t.Error("Expected PromptPresets to be nil") + } + if result.Source != "" { + t.Error("Expected Source to be empty") + } + }) +} + // TestToAssistantModelComplexTypes tests complex type conversions in ToAssistantModel func TestToAssistantModelComplexTypes(t *testing.T) { t.Run("CompleteLocales", func(t *testing.T) { diff --git a/agent/store/types/fields.go b/agent/store/types/fields.go index b6d0ea05..d5c4975d 100644 --- a/agent/store/types/fields.go +++ b/agent/store/types/fields.go @@ -4,39 +4,43 @@ import "github.com/yaoapp/kun/log" // AssistantAllowedFields defines the whitelist of fields that can be selected for assistants var AssistantAllowedFields = map[string]bool{ - "id": true, - "assistant_id": true, - "type": true, - "name": true, - "avatar": true, - "connector": true, - "description": true, - "path": true, - "sort": true, - "built_in": true, - "placeholder": true, - "options": true, - "prompts": true, - "workflow": true, - "kb": true, - "mcp": true, - "tools": true, - "tags": true, - "readonly": true, - "public": true, - "share": true, - "locales": true, - "automated": true, - "mentionable": true, - "created_at": true, - "updated_at": true, - "__yao_created_by": true, - "__yao_updated_by": true, - "__yao_team_id": true, - "__yao_tenant_id": true, + "id": true, + "assistant_id": true, + "type": true, + "name": true, + "avatar": true, + "connector": true, + "connector_options": true, + "description": true, + "path": true, + "sort": true, + "built_in": true, + "placeholder": true, + "options": true, + "prompts": true, + "prompt_presets": true, + "workflow": true, + "kb": true, + "mcp": true, + "source": true, + "tags": true, + "readonly": true, + "public": true, + "share": true, + "locales": true, + "uses": true, + "automated": true, + "mentionable": true, + "created_at": true, + "updated_at": true, + "__yao_created_by": true, + "__yao_updated_by": true, + "__yao_team_id": true, + "__yao_tenant_id": true, } // AssistantDefaultFields defines the default fields to select for assistants when no specific fields are requested +// These are lightweight fields suitable for list views and basic information display var AssistantDefaultFields = []string{ "assistant_id", "type", @@ -44,6 +48,7 @@ var AssistantDefaultFields = []string{ "avatar", "connector", "description", + "tags", // Tags for categorization (lightweight) "sort", "built_in", "readonly", @@ -51,8 +56,51 @@ var AssistantDefaultFields = []string{ "share", "automated", "mentionable", + "kb", // Knowledge base configuration (lightweight) + "mcp", // MCP servers configuration (lightweight) "created_at", "updated_at", + "__yao_created_by", // Permission: creator user ID + "__yao_updated_by", // Permission: updater user ID + "__yao_team_id", // Permission: team ID + "__yao_tenant_id", // Permission: tenant ID +} + +// AssistantFullFields defines all available fields including complex/large fields +// Use this when you need complete assistant data for backend processing +var AssistantFullFields = []string{ + "assistant_id", + "type", + "name", + "avatar", + "connector", + "connector_options", + "description", + "path", + "sort", + "built_in", + "placeholder", + "options", + "prompts", + "prompt_presets", + "workflow", + "kb", + "mcp", + "source", + "tags", + "readonly", + "public", + "share", + "locales", + "uses", + "automated", + "mentionable", + "created_at", + "updated_at", + "__yao_created_by", + "__yao_updated_by", + "__yao_team_id", + "__yao_tenant_id", } // ValidateAssistantFields validates and filters assistant select fields against the whitelist diff --git a/agent/store/types/fields_test.go b/agent/store/types/fields_test.go index 48e12e65..9666e611 100644 --- a/agent/store/types/fields_test.go +++ b/agent/store/types/fields_test.go @@ -118,12 +118,15 @@ func TestAssistantAllowedFields(t *testing.T) { complexFields := []string{ "options", "prompts", + "prompt_presets", "workflow", "kb", "mcp", - "tools", "placeholder", "locales", + "uses", + "connector_options", + "source", } for _, field := range complexFields { if !AssistantAllowedFields[field] { @@ -139,6 +142,12 @@ func TestAssistantDefaultFields(t *testing.T) { "assistant_id", "name", "type", + "kb", // Knowledge base is essential for assistant functionality + "mcp", // MCP servers are essential for assistant functionality + "__yao_created_by", // Permission fields are essential for access control + "__yao_updated_by", + "__yao_team_id", + "__yao_tenant_id", } defaultFieldsMap := make(map[string]bool) @@ -155,15 +164,17 @@ func TestAssistantDefaultFields(t *testing.T) { t.Run("DoesNotContainSensitiveFields", func(t *testing.T) { // Default fields should not include complex/large fields by default + // Note: kb, mcp, and tags are lightweight and included in defaults sensitiveFields := []string{ "options", "prompts", + "prompt_presets", "workflow", - "kb", - "mcp", - "tools", "placeholder", "locales", + "uses", + "connector_options", + "source", } defaultFieldsMap := make(map[string]bool) @@ -178,3 +189,81 @@ func TestAssistantDefaultFields(t *testing.T) { } }) } + +func TestAssistantFullFields(t *testing.T) { + t.Run("ContainsAllAllowedFields", func(t *testing.T) { + // Full fields should contain all fields from allowed fields + fullFieldsMap := make(map[string]bool) + for _, field := range AssistantFullFields { + fullFieldsMap[field] = true + } + + for field := range AssistantAllowedFields { + if field == "id" { + // "id" is an alias for "assistant_id", skip + continue + } + if !fullFieldsMap[field] { + t.Errorf("Allowed field %s is missing from full fields", field) + } + } + }) + + t.Run("AllFieldsAreAllowed", func(t *testing.T) { + // All fields in full list should be in allowed fields + for _, field := range AssistantFullFields { + if !AssistantAllowedFields[field] { + t.Errorf("Full field %s is not in allowed fields", field) + } + } + }) + + t.Run("ContainsComplexFields", func(t *testing.T) { + // Full fields should include all complex/large fields + complexFields := []string{ + "options", + "prompts", + "prompt_presets", + "workflow", + "kb", + "mcp", + "placeholder", + "locales", + "uses", + "connector_options", + "source", + } + + fullFieldsMap := make(map[string]bool) + for _, field := range AssistantFullFields { + fullFieldsMap[field] = true + } + + for _, field := range complexFields { + if !fullFieldsMap[field] { + t.Errorf("Complex field %s is missing from full fields", field) + } + } + }) + + t.Run("ContainsPermissionFields", func(t *testing.T) { + // Full fields should include permission fields + permissionFields := []string{ + "__yao_created_by", + "__yao_updated_by", + "__yao_team_id", + "__yao_tenant_id", + } + + fullFieldsMap := make(map[string]bool) + for _, field := range AssistantFullFields { + fullFieldsMap[field] = true + } + + for _, field := range permissionFields { + if !fullFieldsMap[field] { + t.Errorf("Permission field %s is missing from full fields", field) + } + } + }) +} diff --git a/agent/store/types/store.go b/agent/store/types/store.go index 283e66cd..f1d79648 100644 --- a/agent/store/types/store.go +++ b/agent/store/types/store.go @@ -91,8 +91,10 @@ type Store interface { // GetAssistant retrieves a single assistant by ID // assistantID: Assistant ID + // fields: List of fields to select, empty/nil means default fields (AssistantDefaultFields) + // locale: Optional locale for i18n translations // Returns: Assistant information and potential error - GetAssistant(assistantID string, locale ...string) (*AssistantModel, error) + GetAssistant(assistantID string, fields []string, locale ...string) (*AssistantModel, error) // DeleteAssistants deletes assistants based on filter conditions // filter: Filter conditions diff --git a/agent/store/types/types.go b/agent/store/types/types.go index c145c65f..a4d1ca13 100644 --- a/agent/store/types/types.go +++ b/agent/store/types/types.go @@ -221,34 +221,59 @@ type Placeholder struct { Prompts []string `json:"prompts,omitempty"` } +// ModelCapability defines the available model capability filters +type ModelCapability string + +// Model capability constants for filtering connectors +const ( + CapVision ModelCapability = "vision" + CapAudio ModelCapability = "audio" + CapToolCalls ModelCapability = "tool_calls" + CapReasoning ModelCapability = "reasoning" + CapStreaming ModelCapability = "streaming" + CapJSON ModelCapability = "json" + CapMultimodal ModelCapability = "multimodal" + CapTemperatureAdjustable ModelCapability = "temperature_adjustable" +) + +// ConnectorOptions the connector selection options +// Allows defining optional connector selection with filtering capabilities +type ConnectorOptions struct { + Optional bool `json:"optional,omitempty"` // Whether connector is optional for user selection + Connectors []string `json:"connectors,omitempty"` // List of available connectors, empty means all connectors are available + Filters []ModelCapability `json:"filters,omitempty"` // Filter by model capabilities, conditions can be stacked +} + // AssistantModel the assistant database model type AssistantModel struct { - ID string `json:"assistant_id"` // Assistant ID - Type string `json:"type,omitempty"` // Assistant Type, default is assistant - Name string `json:"name,omitempty"` // Assistant Name - Avatar string `json:"avatar,omitempty"` // Assistant Avatar - Connector string `json:"connector"` // AI Connector - Path string `json:"path,omitempty"` // Assistant Path - BuiltIn bool `json:"built_in,omitempty"` // Whether this is a built-in assistant - Sort int `json:"sort,omitempty"` // Assistant Sort - Description string `json:"description,omitempty"` // Assistant Description - Tags []string `json:"tags,omitempty"` // Assistant Tags - Readonly bool `json:"readonly,omitempty"` // Whether this assistant is readonly - Public bool `json:"public,omitempty"` // Whether this assistant is shared across all teams in the platform - Share string `json:"share,omitempty"` // Assistant sharing scope (private/team) - Mentionable bool `json:"mentionable,omitempty"` // Whether this assistant is mentionable - Automated bool `json:"automated,omitempty"` // Whether this assistant is automated - Options map[string]interface{} `json:"options,omitempty"` // AI Options - Prompts []Prompt `json:"prompts,omitempty"` // AI Prompts - KB *KnowledgeBase `json:"kb,omitempty"` // Knowledge base configuration - MCP *MCPServers `json:"mcp,omitempty"` // MCP servers configuration - Tools *ToolCalls `json:"tools,omitempty"` // Assistant Tools - Workflow *Workflow `json:"workflow,omitempty"` // Workflow configuration - Placeholder *Placeholder `json:"placeholder,omitempty"` // Assistant Placeholder - Locales i18n.Map `json:"locales,omitempty"` // Assistant Locales - Uses *context.Uses `json:"uses,omitempty"` // Assistant-specific wrapper configurations for vision, audio, etc. If not set, use global settings - CreatedAt int64 `json:"created_at"` // Creation timestamp - UpdatedAt int64 `json:"updated_at"` // Last update timestamp + ID string `json:"assistant_id"` // Assistant ID + Type string `json:"type,omitempty"` // Assistant Type, default is assistant + Name string `json:"name,omitempty"` // Assistant Name + Avatar string `json:"avatar,omitempty"` // Assistant Avatar + Connector string `json:"connector"` // AI Connector (default connector) + ConnectorOptions *ConnectorOptions `json:"connector_options,omitempty"` // Connector selection options for user to choose from + Path string `json:"path,omitempty"` // Assistant Path + BuiltIn bool `json:"built_in,omitempty"` // Whether this is a built-in assistant + Sort int `json:"sort,omitempty"` // Assistant Sort + Description string `json:"description,omitempty"` // Assistant Description + Tags []string `json:"tags,omitempty"` // Assistant Tags + Readonly bool `json:"readonly,omitempty"` // Whether this assistant is readonly + Public bool `json:"public,omitempty"` // Whether this assistant is shared across all teams in the platform + Share string `json:"share,omitempty"` // Assistant sharing scope (private/team) + Mentionable bool `json:"mentionable,omitempty"` // Whether this assistant is mentionable + Automated bool `json:"automated,omitempty"` // Whether this assistant is automated + Options map[string]interface{} `json:"options,omitempty"` // AI Options + Prompts []Prompt `json:"prompts,omitempty"` // AI Prompts (default prompts) + PromptPresets map[string][]Prompt `json:"prompt_presets,omitempty"` // Prompt presets organized by mode (e.g., "chat", "task", etc.) + KB *KnowledgeBase `json:"kb,omitempty"` // Knowledge base configuration + MCP *MCPServers `json:"mcp,omitempty"` // MCP servers configuration + Workflow *Workflow `json:"workflow,omitempty"` // Workflow configuration + Placeholder *Placeholder `json:"placeholder,omitempty"` // Assistant Placeholder + Source string `json:"source,omitempty"` // Hook script source code + Locales i18n.Map `json:"locales,omitempty"` // Assistant Locales + Uses *context.Uses `json:"uses,omitempty"` // Assistant-specific wrapper configurations for vision, audio, etc. If not set, use global settings + CreatedAt int64 `json:"created_at"` // Creation timestamp + UpdatedAt int64 `json:"updated_at"` // Last update timestamp // Permission management fields (not exposed in JSON API responses) YaoCreatedBy string `json:"-"` // User who created the assistant (not exposed in JSON) diff --git a/agent/store/xun/assistant.go b/agent/store/xun/assistant.go index d1339bcb..d36bcfc4 100644 --- a/agent/store/xun/assistant.go +++ b/agent/store/xun/assistant.go @@ -102,6 +102,11 @@ func (conv *Xun) SaveAssistant(assistant *types.AssistantModel) (string, error) } else { data["path"] = nil } + if assistant.Source != "" { + data["source"] = assistant.Source + } else { + data["source"] = nil + } // Share field: nullable: false with default "private" // Apply default if empty @@ -152,14 +157,15 @@ func (conv *Xun) SaveAssistant(assistant *types.AssistantModel) (string, error) // Handle interface{} fields - they should already be in the correct format jsonFields := map[string]interface{}{ - "prompts": assistant.Prompts, - "kb": assistant.KB, - "mcp": assistant.MCP, - "workflow": assistant.Workflow, - "tools": assistant.Tools, - "placeholder": assistant.Placeholder, - "locales": assistant.Locales, - "uses": assistant.Uses, + "prompts": assistant.Prompts, + "prompt_presets": assistant.PromptPresets, + "connector_options": assistant.ConnectorOptions, + "kb": assistant.KB, + "mcp": assistant.MCP, + "workflow": assistant.Workflow, + "placeholder": assistant.Placeholder, + "locales": assistant.Locales, + "uses": assistant.Uses, } for field, value := range jsonFields { @@ -218,14 +224,14 @@ func (conv *Xun) UpdateAssistant(assistantID string, updates map[string]interfac data := make(map[string]interface{}) // List of fields that need JSON marshaling - jsonFields := []string{"options", "tags", "prompts", "kb", "mcp", "workflow", "tools", "placeholder", "locales", "uses"} + jsonFields := []string{"options", "tags", "prompts", "prompt_presets", "connector_options", "kb", "mcp", "workflow", "placeholder", "locales", "uses"} jsonFieldSet := make(map[string]bool) for _, field := range jsonFields { jsonFieldSet[field] = true } // List of nullable string fields - nullableStringFields := []string{"name", "avatar", "description", "path", "__yao_created_by", "__yao_updated_by", "__yao_team_id", "__yao_tenant_id"} + nullableStringFields := []string{"name", "avatar", "description", "path", "source", "__yao_created_by", "__yao_updated_by", "__yao_team_id", "__yao_tenant_id"} nullableFieldSet := make(map[string]bool) for _, field := range nullableStringFields { nullableFieldSet[field] = true @@ -418,7 +424,7 @@ func (conv *Xun) GetAssistants(filter types.AssistantFilter, locale ...string) ( // Convert rows to types.AssistantModel slice assistants := make([]*types.AssistantModel, 0, len(rows)) - jsonFields := []string{"tags", "options", "prompts", "workflow", "kb", "mcp", "tools", "placeholder", "locales", "uses"} + jsonFields := []string{"tags", "options", "prompts", "prompt_presets", "connector_options", "workflow", "kb", "mcp", "placeholder", "locales", "uses"} for _, row := range rows { data := row.ToMap() @@ -456,11 +462,27 @@ func (conv *Xun) GetAssistants(filter types.AssistantFilter, locale ...string) ( } // GetAssistant retrieves a single assistant by ID -func (conv *Xun) GetAssistant(assistantID string, locale ...string) (*types.AssistantModel, error) { - row, err := conv.query.New(). +func (conv *Xun) GetAssistant(assistantID string, fields []string, locale ...string) (*types.AssistantModel, error) { + qb := conv.query.New(). Table(conv.getAssistantTable()). - Where("assistant_id", assistantID). - First() + Where("assistant_id", assistantID) + + // Apply select fields with security validation + // If no fields specified, use default fields + fieldsToSelect := fields + if len(fieldsToSelect) == 0 { + fieldsToSelect = types.AssistantDefaultFields + } + + // ValidateAssistantFields will validate fields against whitelist + sanitized := types.ValidateAssistantFields(fieldsToSelect) + selectFields := make([]interface{}, len(sanitized)) + for i, field := range sanitized { + selectFields[i] = field + } + qb.Select(selectFields...) + + row, err := qb.First() if err != nil { return nil, err } @@ -475,7 +497,7 @@ func (conv *Xun) GetAssistant(assistantID string, locale ...string) (*types.Assi } // Parse JSON fields - jsonFields := []string{"tags", "options", "prompts", "workflow", "kb", "mcp", "tools", "placeholder", "locales", "uses"} + jsonFields := []string{"tags", "options", "prompts", "prompt_presets", "connector_options", "workflow", "kb", "mcp", "placeholder", "locales", "uses"} conv.parseJSONFields(data, jsonFields) // Convert map to types.AssistantModel @@ -486,6 +508,7 @@ func (conv *Xun) GetAssistant(assistantID string, locale ...string) (*types.Assi Avatar: getString(data, "avatar"), Connector: getString(data, "connector"), Path: getString(data, "path"), + Source: getString(data, "source"), BuiltIn: getBool(data, "built_in"), Sort: getInt(data, "sort"), Description: getString(data, "description"), @@ -529,6 +552,26 @@ func (conv *Xun) GetAssistant(assistantID string, locale ...string) (*types.Assi } } + if promptPresets, has := data["prompt_presets"]; has && promptPresets != nil { + raw, err := jsoniter.Marshal(promptPresets) + if err == nil { + var pp map[string][]types.Prompt + if err := jsoniter.Unmarshal(raw, &pp); err == nil { + model.PromptPresets = pp + } + } + } + + if connectorOptions, has := data["connector_options"]; has && connectorOptions != nil { + raw, err := jsoniter.Marshal(connectorOptions) + if err == nil { + var co types.ConnectorOptions + if err := jsoniter.Unmarshal(raw, &co); err == nil { + model.ConnectorOptions = &co + } + } + } + if kb, has := data["kb"]; has && kb != nil { kbConverted, err := types.ToKnowledgeBase(kb) if err == nil { @@ -550,16 +593,6 @@ func (conv *Xun) GetAssistant(assistantID string, locale ...string) (*types.Assi } } - if tools, has := data["tools"]; has && tools != nil { - raw, err := jsoniter.Marshal(tools) - if err == nil { - var tc types.ToolCalls - if err := jsoniter.Unmarshal(raw, &tc); err == nil { - model.Tools = &tc - } - } - } - if placeholder, has := data["placeholder"]; has && placeholder != nil { raw, err := jsoniter.Marshal(placeholder) if err == nil { diff --git a/agent/store/xun/assistant_test.go b/agent/store/xun/assistant_test.go index 4ba8e4a2..485cb87e 100644 --- a/agent/store/xun/assistant_test.go +++ b/agent/store/xun/assistant_test.go @@ -103,8 +103,8 @@ func TestSaveAssistant(t *testing.T) { t.Errorf("Expected ID %s, got %s", id, updatedID) } - // Verify update - retrieved, err := store.GetAssistant(id) + // Verify update - request all fields to see the update + retrieved, err := store.GetAssistant(id, types.AssistantFullFields) if err != nil { t.Fatalf("Failed to retrieve updated assistant: %v", err) } @@ -183,8 +183,8 @@ func TestSaveAssistant(t *testing.T) { t.Fatalf("Failed to save complex assistant: %v", err) } - // Retrieve and verify - retrieved, err := store.GetAssistant(id) + // Retrieve and verify - request all fields for complex data + retrieved, err := store.GetAssistant(id, types.AssistantFullFields) if err != nil { t.Fatalf("Failed to retrieve complex assistant: %v", err) } @@ -237,8 +237,8 @@ func TestSaveAssistant(t *testing.T) { t.Fatalf("Failed to save assistant with MCP: %v", err) } - // Retrieve and verify MCP configuration - retrieved, err := store.GetAssistant(id) + // Retrieve and verify MCP configuration - mcp is in default fields + retrieved, err := store.GetAssistant(id, []string{}) if err != nil { t.Fatalf("Failed to retrieve assistant: %v", err) } @@ -316,8 +316,8 @@ func TestSaveAssistant(t *testing.T) { t.Fatalf("Failed to update assistant with MCP: %v", err) } - // Retrieve and verify - retrieved, err := store.GetAssistant(id) + // Retrieve and verify - mcp is in default fields + retrieved, err := store.GetAssistant(id, []string{}) if err != nil { t.Fatalf("Failed to retrieve assistant: %v", err) } @@ -353,8 +353,8 @@ func TestSaveAssistant(t *testing.T) { t.Fatalf("Failed to save assistant with uses: %v", err) } - // Retrieve and verify uses configuration - retrieved, err := store.GetAssistant(id) + // Retrieve and verify uses configuration - uses is NOT in default fields, need to request all + retrieved, err := store.GetAssistant(id, types.AssistantFullFields) if err != nil { t.Fatalf("Failed to retrieve assistant: %v", err) } @@ -396,8 +396,8 @@ func TestSaveAssistant(t *testing.T) { t.Fatalf("Failed to save assistant without uses: %v", err) } - // Retrieve and verify uses is nil - retrieved, err := store.GetAssistant(id) + // Retrieve and verify uses is nil - request all fields to check uses + retrieved, err := store.GetAssistant(id, types.AssistantFullFields) if err != nil { t.Fatalf("Failed to retrieve assistant: %v", err) } @@ -425,8 +425,8 @@ func TestSaveAssistant(t *testing.T) { t.Fatalf("Failed to save assistant with partial uses: %v", err) } - // Retrieve and verify - retrieved, err := store.GetAssistant(id) + // Retrieve and verify - request all fields for uses + retrieved, err := store.GetAssistant(id, types.AssistantFullFields) if err != nil { t.Fatalf("Failed to retrieve assistant: %v", err) } @@ -451,6 +451,194 @@ func TestSaveAssistant(t *testing.T) { t.Errorf("Expected fetch to be empty, got '%s'", retrieved.Uses.Fetch) } }) + + t.Run("ConnectorOptions", func(t *testing.T) { + // Test assistant with connector options + assistant := &types.AssistantModel{ + Name: "Connector Options Test", + Type: "assistant", + Connector: "openai", + Share: "private", + ConnectorOptions: &types.ConnectorOptions{ + Optional: true, + Connectors: []string{"openai", "anthropic"}, + Filters: []types.ModelCapability{types.CapVision, types.CapToolCalls}, + }, + } + + id, err := store.SaveAssistant(assistant) + if err != nil { + t.Fatalf("Failed to save assistant with connector options: %v", err) + } + + // Retrieve and verify - connector_options is NOT in default fields + retrieved, err := store.GetAssistant(id, types.AssistantFullFields) + if err != nil { + t.Fatalf("Failed to retrieve assistant: %v", err) + } + + if retrieved.ConnectorOptions == nil { + t.Fatal("Expected connector options to be set") + } + + if !retrieved.ConnectorOptions.Optional { + t.Error("Expected optional to be true") + } + + if len(retrieved.ConnectorOptions.Connectors) != 2 { + t.Errorf("Expected 2 connectors, got %d", len(retrieved.ConnectorOptions.Connectors)) + } + + if len(retrieved.ConnectorOptions.Filters) != 2 { + t.Errorf("Expected 2 filters, got %d", len(retrieved.ConnectorOptions.Filters)) + } + + if retrieved.ConnectorOptions.Filters[0] != types.CapVision { + t.Errorf("Expected first filter to be vision, got '%s'", retrieved.ConnectorOptions.Filters[0]) + } + + t.Logf("Successfully saved and retrieved connector options for assistant %s", id) + }) + + t.Run("PromptPresets", func(t *testing.T) { + // Test assistant with prompt presets + assistant := &types.AssistantModel{ + Name: "Prompt Presets Test", + Type: "assistant", + Connector: "openai", + Share: "private", + PromptPresets: map[string][]types.Prompt{ + "chat": { + {Role: "system", Content: "You are a friendly chatbot"}, + {Role: "user", Content: "Hello!"}, + }, + "task": { + {Role: "system", Content: "You are a task executor"}, + }, + }, + } + + id, err := store.SaveAssistant(assistant) + if err != nil { + t.Fatalf("Failed to save assistant with prompt presets: %v", err) + } + + // Retrieve and verify - prompt_presets is NOT in default fields + retrieved, err := store.GetAssistant(id, types.AssistantFullFields) + if err != nil { + t.Fatalf("Failed to retrieve assistant: %v", err) + } + + if retrieved.PromptPresets == nil { + t.Fatal("Expected prompt presets to be set") + } + + if len(retrieved.PromptPresets) != 2 { + t.Errorf("Expected 2 preset groups, got %d", len(retrieved.PromptPresets)) + } + + chatPrompts, ok := retrieved.PromptPresets["chat"] + if !ok { + t.Fatal("Expected 'chat' preset to exist") + } + + if len(chatPrompts) != 2 { + t.Errorf("Expected 2 chat prompts, got %d", len(chatPrompts)) + } + + if chatPrompts[0].Role != "system" { + t.Errorf("Expected system role, got '%s'", chatPrompts[0].Role) + } + + taskPrompts, ok := retrieved.PromptPresets["task"] + if !ok { + t.Fatal("Expected 'task' preset to exist") + } + + if len(taskPrompts) != 1 { + t.Errorf("Expected 1 task prompt, got %d", len(taskPrompts)) + } + + t.Logf("Successfully saved and retrieved prompt presets for assistant %s", id) + }) + + t.Run("SourceField", func(t *testing.T) { + // Test assistant with source code + sourceCode := `function onMessage(msg) { + console.log("Received:", msg); + return { status: "ok" }; +}` + assistant := &types.AssistantModel{ + Name: "Source Field Test", + Type: "assistant", + Connector: "openai", + Share: "private", + Source: sourceCode, + } + + id, err := store.SaveAssistant(assistant) + if err != nil { + t.Fatalf("Failed to save assistant with source: %v", err) + } + + // Retrieve and verify - source is NOT in default fields + retrieved, err := store.GetAssistant(id, types.AssistantFullFields) + if err != nil { + t.Fatalf("Failed to retrieve assistant: %v", err) + } + + if retrieved.Source != sourceCode { + t.Errorf("Expected source code to match, got '%s'", retrieved.Source) + } + + t.Logf("Successfully saved and retrieved source code for assistant %s", id) + }) + + t.Run("AllNewFieldsTogether", func(t *testing.T) { + // Test assistant with all new fields together + assistant := &types.AssistantModel{ + Name: "All New Fields Test", + Type: "assistant", + Connector: "openai", + Share: "private", + ConnectorOptions: &types.ConnectorOptions{ + Optional: false, + Connectors: []string{"openai"}, + Filters: []types.ModelCapability{types.CapVision}, + }, + PromptPresets: map[string][]types.Prompt{ + "default": { + {Role: "system", Content: "Default system prompt"}, + }, + }, + Source: "// Hook code here", + } + + id, err := store.SaveAssistant(assistant) + if err != nil { + t.Fatalf("Failed to save assistant with all new fields: %v", err) + } + + // Retrieve and verify all new fields + retrieved, err := store.GetAssistant(id, types.AssistantFullFields) + if err != nil { + t.Fatalf("Failed to retrieve assistant: %v", err) + } + + if retrieved.ConnectorOptions == nil { + t.Error("Expected connector options to be set") + } + + if retrieved.PromptPresets == nil { + t.Error("Expected prompt presets to be set") + } + + if retrieved.Source == "" { + t.Error("Expected source to be set") + } + + t.Logf("Successfully saved and retrieved all new fields for assistant %s", id) + }) } // TestDeleteAssistant tests deleting a single assistant @@ -487,7 +675,7 @@ func TestDeleteAssistant(t *testing.T) { } // Verify deletion - _, err = store.GetAssistant(id) + _, err = store.GetAssistant(id, nil) if err == nil { t.Error("Expected error when getting deleted assistant") } @@ -534,8 +722,8 @@ func TestGetAssistant(t *testing.T) { t.Fatalf("Failed to create assistant: %v", err) } - // Retrieve it - retrieved, err := store.GetAssistant(id) + // Retrieve it with default fields (tags are now in default fields) + retrieved, err := store.GetAssistant(id, nil) if err != nil { t.Fatalf("Failed to get assistant: %v", err) } @@ -562,7 +750,7 @@ func TestGetAssistant(t *testing.T) { }) t.Run("GetNonExistentAssistant", func(t *testing.T) { - _, err := store.GetAssistant("nonexistent-id") + _, err := store.GetAssistant("nonexistent-id", nil) if err == nil { t.Error("Expected error when getting non-existent assistant") } @@ -1313,8 +1501,8 @@ func TestAssistantPermissionFields(t *testing.T) { t.Fatalf("Failed to save assistant with permission fields: %v", err) } - // Retrieve and verify - retrieved, err := store.GetAssistant(id) + // Retrieve and verify - default fields include permission fields + retrieved, err := store.GetAssistant(id, nil) if err != nil { t.Fatalf("Failed to get assistant: %v", err) } @@ -1361,8 +1549,8 @@ func TestAssistantPermissionFields(t *testing.T) { t.Fatalf("Failed to update assistant: %v", err) } - // Verify update - retrieved, err := store.GetAssistant(id) + // Verify update - default fields include permission fields + retrieved, err := store.GetAssistant(id, nil) if err != nil { t.Fatalf("Failed to get updated assistant: %v", err) } @@ -1393,7 +1581,7 @@ func TestAssistantPermissionFields(t *testing.T) { } // Retrieve and verify fields are empty - retrieved, err := store.GetAssistant(id) + retrieved, err := store.GetAssistant(id, nil) if err != nil { t.Fatalf("Failed to get assistant: %v", err) } @@ -1448,7 +1636,7 @@ func TestEmptyStringAsNull(t *testing.T) { } // Retrieve and verify empty strings are returned (not stored as empty strings) - retrieved, err := store.GetAssistant(id) + retrieved, err := store.GetAssistant(id, nil) if err != nil { t.Fatalf("Failed to get assistant: %v", err) } @@ -1493,8 +1681,8 @@ func TestEmptyStringAsNull(t *testing.T) { t.Fatalf("Failed to save assistant: %v", err) } - // Retrieve and verify values are preserved - retrieved, err := store.GetAssistant(id) + // Retrieve and verify values are preserved - path is sensitive, need full fields + retrieved, err := store.GetAssistant(id, types.AssistantFullFields) if err != nil { t.Fatalf("Failed to get assistant: %v", err) } @@ -1576,8 +1764,8 @@ func TestGetAssistantWithLocale(t *testing.T) { }, } - // Test English locale - retrievedEN, err := store.GetAssistant(id, "en") + // Test English locale - request all fields for placeholder + retrievedEN, err := store.GetAssistant(id, types.AssistantFullFields, "en") if err != nil { t.Fatalf("Failed to get assistant with EN locale: %v", err) } @@ -1604,8 +1792,8 @@ func TestGetAssistantWithLocale(t *testing.T) { t.Errorf("Expected first prompt 'How can I help you?', got '%s'", retrievedEN.Placeholder.Prompts[0]) } - // Test Chinese locale - retrievedZH, err := store.GetAssistant(id, "zh-cn") + // Test Chinese locale - request all fields for placeholder + retrievedZH, err := store.GetAssistant(id, types.AssistantFullFields, "zh-cn") if err != nil { t.Fatalf("Failed to get assistant with ZH locale: %v", err) } @@ -1623,8 +1811,8 @@ func TestGetAssistantWithLocale(t *testing.T) { t.Errorf("Expected placeholder title '与我聊天', got '%s'", retrievedZH.Placeholder.Title) } - // Test without locale (should return original {{...}} values) - retrievedNoLocale, err := store.GetAssistant(id) + // Test without locale (should return original {{...}} values) - request all fields for placeholder + retrievedNoLocale, err := store.GetAssistant(id, types.AssistantFullFields) if err != nil { t.Fatalf("Failed to get assistant without locale: %v", err) } @@ -2039,8 +2227,8 @@ func TestUpdateAssistant(t *testing.T) { t.Fatalf("Failed to update assistant: %v", err) } - // Verify update - retrieved, err := store.GetAssistant(id) + // Verify update - need full fields to see tags + retrieved, err := store.GetAssistant(id, types.AssistantFullFields) if err != nil { t.Fatalf("Failed to retrieve assistant: %v", err) } @@ -2087,8 +2275,8 @@ func TestUpdateAssistant(t *testing.T) { t.Fatalf("Failed to update assistant: %v", err) } - // Verify all updates - retrieved, err := store.GetAssistant(id) + // Verify all updates - use default fields (includes name, description, sort, mentionable) + retrieved, err := store.GetAssistant(id, nil) if err != nil { t.Fatalf("Failed to retrieve assistant: %v", err) } @@ -2144,8 +2332,8 @@ func TestUpdateAssistant(t *testing.T) { t.Fatalf("Failed to update JSON fields: %v", err) } - // Verify updates - retrieved, err := store.GetAssistant(id) + // Verify updates - need full fields for tags, options, prompts + retrieved, err := store.GetAssistant(id, types.AssistantFullFields) if err != nil { t.Fatalf("Failed to retrieve assistant: %v", err) } @@ -2193,8 +2381,8 @@ func TestUpdateAssistant(t *testing.T) { t.Fatalf("Failed to update KB and MCP: %v", err) } - // Verify updates - retrieved, err := store.GetAssistant(id) + // Verify updates - KB and MCP are in default fields + retrieved, err := store.GetAssistant(id, nil) if err != nil { t.Fatalf("Failed to retrieve assistant: %v", err) } @@ -2247,8 +2435,8 @@ func TestUpdateAssistant(t *testing.T) { t.Fatalf("Failed to update MCP: %v", err) } - // Verify updates - retrieved, err := store.GetAssistant(id) + // Verify updates - MCP is in default fields + retrieved, err := store.GetAssistant(id, nil) if err != nil { t.Fatalf("Failed to retrieve assistant: %v", err) } @@ -2325,8 +2513,8 @@ func TestUpdateAssistant(t *testing.T) { t.Fatalf("Failed to update uses: %v", err) } - // Verify updates - retrieved, err := store.GetAssistant(id) + // Verify updates - uses is NOT in default fields + retrieved, err := store.GetAssistant(id, types.AssistantFullFields) if err != nil { t.Fatalf("Failed to retrieve assistant: %v", err) } @@ -2361,8 +2549,8 @@ func TestUpdateAssistant(t *testing.T) { t.Fatalf("Failed to update uses again: %v", err) } - // Verify second update - retrieved2, err := store.GetAssistant(id) + // Verify second update - uses is NOT in default fields + retrieved2, err := store.GetAssistant(id, types.AssistantFullFields) if err != nil { t.Fatalf("Failed to retrieve assistant: %v", err) } @@ -2384,8 +2572,8 @@ func TestUpdateAssistant(t *testing.T) { t.Fatalf("Failed to set uses to nil: %v", err) } - // Verify uses is nil - retrieved3, err := store.GetAssistant(id) + // Verify uses is nil - uses is NOT in default fields + retrieved3, err := store.GetAssistant(id, types.AssistantFullFields) if err != nil { t.Fatalf("Failed to retrieve assistant: %v", err) } @@ -2422,8 +2610,8 @@ func TestUpdateAssistant(t *testing.T) { t.Fatalf("Failed to update permission fields: %v", err) } - // Verify updates - retrieved, err := store.GetAssistant(id) + // Verify updates - permission fields are in default fields + retrieved, err := store.GetAssistant(id, nil) if err != nil { t.Fatalf("Failed to retrieve assistant: %v", err) } @@ -2467,8 +2655,8 @@ func TestUpdateAssistant(t *testing.T) { t.Fatalf("Failed to update with empty strings: %v", err) } - // Verify empty strings are stored as NULL - retrieved, err := store.GetAssistant(id) + // Verify empty strings are stored as NULL - default fields include avatar, description + retrieved, err := store.GetAssistant(id, nil) if err != nil { t.Fatalf("Failed to retrieve assistant: %v", err) } @@ -2553,8 +2741,8 @@ func TestUpdateAssistant(t *testing.T) { t.Fatalf("Failed to create assistant: %v", err) } - // Get original updated_at - original, err := store.GetAssistant(id) + // Get original updated_at - default fields include updated_at + original, err := store.GetAssistant(id, nil) if err != nil { t.Fatalf("Failed to retrieve assistant: %v", err) } @@ -2572,8 +2760,8 @@ func TestUpdateAssistant(t *testing.T) { t.Fatalf("Failed to update assistant: %v", err) } - // Get updated assistant - updated, err := store.GetAssistant(id) + // Get updated assistant - default fields include description, updated_at + updated, err := store.GetAssistant(id, nil) if err != nil { t.Fatalf("Failed to retrieve updated assistant: %v", err) } @@ -2607,8 +2795,8 @@ func TestUpdateAssistant(t *testing.T) { t.Fatalf("Failed to create assistant: %v", err) } - // Get original - original, err := store.GetAssistant(id) + // Get original - default fields + original, err := store.GetAssistant(id, nil) if err != nil { t.Fatalf("Failed to retrieve assistant: %v", err) } @@ -2625,8 +2813,8 @@ func TestUpdateAssistant(t *testing.T) { t.Fatalf("Failed to update assistant: %v", err) } - // Verify system fields unchanged, but name updated - retrieved, err := store.GetAssistant(id) + // Verify system fields unchanged, but name updated - default fields + retrieved, err := store.GetAssistant(id, nil) if err != nil { t.Fatalf("Failed to retrieve assistant: %v", err) } @@ -2693,9 +2881,9 @@ func TestAssistantCompleteWorkflow(t *testing.T) { t.Errorf("Expected at least 3 assistants, got %d", len(response.Data)) } - // Step 3: Update one assistant + // Step 3: Update one assistant - need full fields for tags updatedID := assistantIDs[1] - updatedAssistant, err := store.GetAssistant(updatedID) + updatedAssistant, err := store.GetAssistant(updatedID, types.AssistantFullFields) if err != nil { t.Fatalf("Failed to get assistant for update: %v", err) } @@ -2708,8 +2896,8 @@ func TestAssistantCompleteWorkflow(t *testing.T) { t.Fatalf("Failed to update assistant: %v", err) } - // Verify update - verifyAssistant, err := store.GetAssistant(updatedID) + // Verify update - default fields include description + verifyAssistant, err := store.GetAssistant(updatedID, nil) if err != nil { t.Fatalf("Failed to verify update: %v", err) } @@ -2725,7 +2913,7 @@ func TestAssistantCompleteWorkflow(t *testing.T) { } // Verify deletion - _, err = store.GetAssistant(assistantIDs[0]) + _, err = store.GetAssistant(assistantIDs[0], nil) if err == nil { t.Error("Expected error when getting deleted assistant") } diff --git a/data/bindata.go b/data/bindata.go index 4cdba5c9..892300ef 100644 --- a/data/bindata.go +++ b/data/bindata.go @@ -319,7 +319,7 @@ func cuiSetupIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "cui/setup/index.html", size: 10, mode: os.FileMode(420), modTime: time.Unix(1763118620, 0)} + info := bindataFileInfo{name: "cui/setup/index.html", size: 10, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -339,7 +339,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(1763118620, 0)} + info := bindataFileInfo{name: "cui/v0.9/index.html", size: 13, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -359,7 +359,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(1763118620, 0)} + info := bindataFileInfo{name: "cui/v1.0/index.html", size: 49, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -379,7 +379,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(1763118620, 0)} + info := bindataFileInfo{name: "cui/v1.0/layouts__index.async.js", size: 71, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -399,7 +399,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(1763118620, 0)} + info := bindataFileInfo{name: "cui/v1.0/umi.js", size: 71, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -419,7 +419,7 @@ func initEnv() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.env", size: 219, mode: os.FileMode(420), modTime: time.Unix(1763118620, 0)} + info := bindataFileInfo{name: "init/.env", size: 219, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -439,7 +439,7 @@ func initVscodeSettingsJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/settings.json", size: 4666, mode: os.FileMode(420), modTime: time.Unix(1763118620, 0)} + info := bindataFileInfo{name: "init/.vscode/settings.json", size: 4666, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -459,7 +459,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(1763118620, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/console.d.ts", size: 221, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -479,7 +479,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(1763118620, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/exception.d.ts", size: 738, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -499,7 +499,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(1763118620, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/fs.d.ts", size: 8554, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -519,7 +519,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(1763118620, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/global.d.ts", size: 1759, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -539,7 +539,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(1763118620, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/http.d.ts", size: 6179, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -559,7 +559,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(1763118620, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/io.d.ts", size: 587, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -579,7 +579,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(1763118620, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/log.d.ts", size: 1692, mode: os.FileMode(493), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -599,7 +599,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(1763118620, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/neo.d.ts", size: 3750, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -619,7 +619,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(1763118620, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/process/fs.d.ts", size: 11133, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -639,7 +639,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(1763118620, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/process/http.d.ts", size: 5653, mode: os.FileMode(493), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -659,7 +659,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(1763118620, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/process/model.d.ts", size: 6656, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -679,7 +679,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(1763118620, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/process.d.ts", size: 23165, mode: os.FileMode(493), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -699,7 +699,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(1763118620, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/query.d.ts", size: 6124, mode: os.FileMode(493), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -719,7 +719,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(1763118620, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/store.d.ts", size: 2251, mode: os.FileMode(493), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -739,7 +739,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(1763118620, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/sui.d.ts", size: 1713, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -759,7 +759,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(1763118620, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/time.d.ts", size: 711, mode: os.FileMode(493), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -779,7 +779,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(1763118620, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime.d.ts", size: 424, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -799,7 +799,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(1763118620, 0)} + info := bindataFileInfo{name: "init/.vscode/types/sui.d.ts", size: 8931, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -819,7 +819,7 @@ func initAppYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/app.yao", size: 3115, mode: os.FileMode(420), modTime: time.Unix(1763118620, 0)} + info := bindataFileInfo{name: "init/app.yao", size: 3115, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -839,7 +839,7 @@ func initDataReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/data/README.md", size: 41, mode: os.FileMode(420), modTime: time.Unix(1763118620, 0)} + info := bindataFileInfo{name: "init/data/README.md", size: 41, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -859,7 +859,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(1763118620, 0)} + info := bindataFileInfo{name: "init/data/templates/default/__assets/README.md", size: 33, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -879,7 +879,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(1763118620, 0)} + info := bindataFileInfo{name: "init/data/templates/default/__assets/images/icons/app.png", size: 34558, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -899,7 +899,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(1763118620, 0)} + info := bindataFileInfo{name: "init/data/templates/default/__assets/images/logos/logo_color.svg", size: 2909, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -919,7 +919,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(1763118620, 0)} + info := bindataFileInfo{name: "init/data/templates/default/__assets/images/logos/wordmark.svg", size: 3615, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -939,7 +939,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(1763118620, 0)} + info := bindataFileInfo{name: "init/data/templates/default/__data.json", size: 30, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -959,7 +959,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(1763118620, 0)} + info := bindataFileInfo{name: "init/data/templates/default/__document.html", size: 492, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -979,7 +979,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(1763118620, 0)} + info := bindataFileInfo{name: "init/data/templates/default/index/index.css", size: 2896, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -999,7 +999,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(1763118620, 0)} + info := bindataFileInfo{name: "init/data/templates/default/index/index.html", size: 2361, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1019,7 +1019,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(1763118620, 0)} + info := bindataFileInfo{name: "init/data/templates/default/index/index.json", size: 31, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1039,7 +1039,7 @@ func initDbReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/db/README.md", size: 84, mode: os.FileMode(420), modTime: time.Unix(1763118620, 0)} + info := bindataFileInfo{name: "init/db/README.md", size: 84, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1059,7 +1059,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(1763118620, 0)} + info := bindataFileInfo{name: "init/flows/menu.flow.yao", size: 813, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1079,7 +1079,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(1763118620, 0)} + info := bindataFileInfo{name: "init/forms/account.form.yao", size: 1194, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1099,7 +1099,7 @@ func initIconsAppIcns() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/icons/app.icns", size: 67465, mode: os.FileMode(420), modTime: time.Unix(1763118620, 0)} + info := bindataFileInfo{name: "init/icons/app.icns", size: 67465, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1119,7 +1119,7 @@ func initIconsAppIco() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/icons/app.ico", size: 54993, mode: os.FileMode(420), modTime: time.Unix(1763118620, 0)} + info := bindataFileInfo{name: "init/icons/app.ico", size: 54993, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1139,7 +1139,7 @@ func initIconsAppPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/icons/app.png", size: 34558, mode: os.FileMode(420), modTime: time.Unix(1763118620, 0)} + info := bindataFileInfo{name: "init/icons/app.png", size: 34558, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1159,7 +1159,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(1763118620, 0)} + info := bindataFileInfo{name: "init/logins/admin.login.yao", size: 302, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1179,7 +1179,7 @@ func initLogsReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/logs/README.md", size: 28, mode: os.FileMode(420), modTime: time.Unix(1763118620, 0)} + info := bindataFileInfo{name: "init/logs/README.md", size: 28, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1199,7 +1199,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(1763118620, 0)} + info := bindataFileInfo{name: "init/models/admin/user.mod.yao", size: 6416, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1219,7 +1219,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(1763118620, 0)} + info := bindataFileInfo{name: "init/models/tests/pet.mod.yao", size: 525, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1239,7 +1239,7 @@ func initNeoNeoYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/neo/neo.yml", size: 724, mode: os.FileMode(420), modTime: time.Unix(1763118620, 0)} + info := bindataFileInfo{name: "init/neo/neo.yml", size: 724, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1259,7 +1259,7 @@ func initPublicReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/public/README.md", size: 108, mode: os.FileMode(420), modTime: time.Unix(1763118620, 0)} + info := bindataFileInfo{name: "init/public/README.md", size: 108, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1279,7 +1279,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(1763118620, 0)} + info := bindataFileInfo{name: "init/public/assets/README.md", size: 33, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1299,7 +1299,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(1763118620, 0)} + info := bindataFileInfo{name: "init/public/assets/images/icons/app.png", size: 34558, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1319,7 +1319,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(1763118620, 0)} + info := bindataFileInfo{name: "init/public/assets/images/logos/logo_color.svg", size: 2909, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1339,7 +1339,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(1763118620, 0)} + info := bindataFileInfo{name: "init/public/assets/images/logos/wordmark.svg", size: 3615, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1359,7 +1359,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(1763118620, 0)} + info := bindataFileInfo{name: "init/public/assets/libsui.min.js", size: 12569, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1379,7 +1379,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(1763118620, 0)} + info := bindataFileInfo{name: "init/public/assets/libsui.min.js.map", size: 38553, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1399,7 +1399,7 @@ func initPublicIndexCfg() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/public/index.cfg", size: 85, mode: os.FileMode(420), modTime: time.Unix(1763118620, 0)} + info := bindataFileInfo{name: "init/public/index.cfg", size: 85, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1419,7 +1419,7 @@ func initPublicIndexSui() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/public/index.sui", size: 5682, mode: os.FileMode(420), modTime: time.Unix(1763118620, 0)} + info := bindataFileInfo{name: "init/public/index.sui", size: 5682, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1439,7 +1439,7 @@ func initScriptsAccountTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/scripts/account.ts", size: 2521, mode: os.FileMode(420), modTime: time.Unix(1763118620, 0)} + info := bindataFileInfo{name: "init/scripts/account.ts", size: 2521, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1459,7 +1459,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(1763118620, 0)} + info := bindataFileInfo{name: "init/scripts/ai/neo.ts", size: 375, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1479,7 +1479,7 @@ func initScriptsTestsTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/scripts/tests.ts", size: 1044, mode: os.FileMode(420), modTime: time.Unix(1763118620, 0)} + info := bindataFileInfo{name: "init/scripts/tests.ts", size: 1044, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1499,7 +1499,7 @@ func initScriptsUtilsTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/scripts/utils.ts", size: 1230, mode: os.FileMode(420), modTime: time.Unix(1763118620, 0)} + info := bindataFileInfo{name: "init/scripts/utils.ts", size: 1230, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1519,7 +1519,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(1763118620, 0)} + info := bindataFileInfo{name: "init/suis/web.sui.yao", size: 675, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1539,7 +1539,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(1763118620, 0)} + info := bindataFileInfo{name: "init/tables/account.tab.yao", size: 5597, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1559,7 +1559,7 @@ func initTsconfigJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/tsconfig.json", size: 178, mode: os.FileMode(420), modTime: time.Unix(1763118620, 0)} + info := bindataFileInfo{name: "init/tsconfig.json", size: 178, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1579,7 +1579,7 @@ func libsuiAgentTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "libsui/agent.ts", size: 15267, mode: os.FileMode(420), modTime: time.Unix(1763118620, 0)} + info := bindataFileInfo{name: "libsui/agent.ts", size: 15267, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1599,7 +1599,7 @@ func libsuiIndexTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "libsui/index.ts", size: 13049, mode: os.FileMode(420), modTime: time.Unix(1763118620, 0)} + info := bindataFileInfo{name: "libsui/index.ts", size: 13049, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1619,7 +1619,7 @@ func libsuiUtilsTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "libsui/utils.ts", size: 5959, mode: os.FileMode(420), modTime: time.Unix(1763118620, 0)} + info := bindataFileInfo{name: "libsui/utils.ts", size: 5959, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1639,7 +1639,7 @@ func libsuiYaoTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "libsui/yao.ts", size: 4338, mode: os.FileMode(420), modTime: time.Unix(1763118620, 0)} + info := bindataFileInfo{name: "libsui/yao.ts", size: 4338, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1659,7 +1659,7 @@ func publicIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "public/index.html", size: 11, mode: os.FileMode(420), modTime: time.Unix(1763118620, 0)} + info := bindataFileInfo{name: "public/index.html", size: 11, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1679,7 +1679,7 @@ func uiIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "ui/index.html", size: 11, mode: os.FileMode(420), modTime: time.Unix(1763118620, 0)} + info := bindataFileInfo{name: "ui/index.html", size: 11, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1699,7 +1699,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/data/icons/404.png", size: 9342, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1719,7 +1719,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/data/icons/icon.icns", size: 67465, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1739,7 +1739,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/data/icons/icon.ico", size: 54993, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1759,7 +1759,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/data/icons/icon.png", size: 34558, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1779,7 +1779,7 @@ func yaoDataIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/index.html", size: 282, mode: os.FileMode(420), modTime: time.Unix(1763118620, 0)} + info := bindataFileInfo{name: "yao/data/index.html", size: 282, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1799,7 +1799,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/chunking/semantic/en.json", size: 5543, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1819,7 +1819,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/chunking/semantic/zh-cn.json", size: 5446, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1839,7 +1839,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/chunking/structured/en.json", size: 2423, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1859,7 +1859,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/chunking/structured/zh-cn.json", size: 2321, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1879,7 +1879,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/mcp/en.json", size: 4235, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1899,7 +1899,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/mcp/zh-cn.json", size: 4060, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1919,7 +1919,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/ocr/en.json", size: 6631, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1939,7 +1939,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/ocr/zh-cn.json", size: 6501, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1959,7 +1959,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/office/en.json", size: 5476, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1979,7 +1979,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/office/zh-cn.json", size: 5356, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1999,7 +1999,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/utf8/en.json", size: 292, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2019,7 +2019,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/utf8/zh-cn.json", size: 281, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2039,7 +2039,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/video/en.json", size: 6411, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2059,7 +2059,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/video/zh-cn.json", size: 6297, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2079,7 +2079,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/vision/en.json", size: 4085, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2099,7 +2099,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/vision/zh-cn.json", size: 3949, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2119,7 +2119,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/whisper/en.json", size: 4449, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2139,7 +2139,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/whisper/zh-cn.json", size: 4312, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2159,7 +2159,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/embedding/fastembed/en.json", size: 6865, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2179,7 +2179,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/embedding/fastembed/zh-cn.json", size: 6685, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2199,7 +2199,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/embedding/openai/en.json", size: 5636, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2219,7 +2219,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/embedding/openai/zh-cn.json", size: 5463, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2239,7 +2239,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/extraction/openai/en.json", size: 9110, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2259,7 +2259,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/extraction/openai/zh-cn.json", size: 8827, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2279,7 +2279,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/fetcher/http/en.json", size: 5885, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2299,7 +2299,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/fetcher/http/zh-cn.json", size: 5925, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2319,7 +2319,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/fetcher/mcp/en.json", size: 6819, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2339,7 +2339,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/fetcher/mcp/zh-cn.json", size: 6611, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2359,7 +2359,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/fields/model.trans.json", size: 14938, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2379,7 +2379,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/langs/en-US.json", size: 66, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2399,7 +2399,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/langs/zh-cn/global.yml", size: 1762, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2419,7 +2419,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/langs/zh-cn/logins/admin.login.yml", size: 94, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2439,7 +2439,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/langs/zh-cn/logins/user.login.yml", size: 90, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2459,7 +2459,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/langs/zh-hk/global.yml", size: 1762, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2479,7 +2479,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/langs/zh-hk/logins/admin.login.yml", size: 94, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2499,12 +2499,12 @@ 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(1763118620, 0)} + info := bindataFileInfo{name: "yao/langs/zh-hk/logins/user.login.yml", size: 90, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } -var _yaoModelsAgentAssistantModYao = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x98\x5f\x73\xdb\x36\x0c\xc0\xdf\xf3\x29\x70\x7a\x76\xd3\x6e\x0f\xbb\x25\x4f\x4b\xdb\x97\xdc\x9a\x35\xd7\x36\xeb\x43\x2f\xe7\x83\x25\xc8\xe2\x42\x91\x1a\x01\x25\xcd\xe5\xf2\xdd\x77\xa4\x65\xfd\xb1\xe8\x58\x72\xf6\x92\x9c\x49\x00\xfc\x81\x00\x41\x81\x4f\x27\x00\x89\xc1\x92\x92\x73\x48\x2e\x98\x15\x0b\x1a\x49\x16\x7e\x58\xe3\x8a\x74\x64\x3c\x23\x4e\x9d\xaa\x44\x59\x33\x98\x05\xc1\x95\x26\xc8\xad\x03\x16\xeb\x94\x59\xc3\xc5\x25\x60\x3b\x9d\x5a\x93\xab\x75\xed\xd0\x6b\x32\xa0\xc9\xa0\x24\xc1\x0c\x05\x37\x86\x05\xd7\x9c\x9c\xc3\x8f\x04\xd7\xe4\x17\x83\x84\x1f\x59\xa8\x4c\x6e\xc3\xf4\xaa\x56\x5a\x94\x5f\x53\x5c\x4d\x61\xc8\x11\x66\xd6\xe8\xc7\xfe\x18\x5b\x27\xc9\x39\x9c\x9d\x9d\x9d\x35\x56\x57\xda\xbb\xf7\xd4\x39\x1a\xec\x2f\xb1\x73\x0b\x92\xd4\x96\xa5\x5f\xd4\x3b\xe4\x67\x7b\xdc\x1b\x03\xf0\x1c\xac\xa5\x56\xd7\xa5\x09\x98\x27\x00\x00\x4f\xe1\x6f\x6f\x13\x55\x16\x9c\x09\x63\xf2\x58\x85\xb1\xcb\x8f\xdd\xd8\x78\x57\xa1\x3f\xdd\xe3\xb8\x31\xea\xdf\x9a\x7a\x20\x2a\x23\x23\x2a\x57\xe4\x92\x20\xfe\xbc\x88\x23\xb4\x1a\xcb\x18\x0c\x8b\x0f\xcd\x31\x40\x17\x31\x92\xce\x0e\x99\xb5\x14\xc9\x39\xfc\xfa\xee\x5d\x3b\x68\x6a\xad\x9b\xfd\xcf\x51\x33\xb5\x13\x75\x70\xae\x17\xb7\x30\xaa\x4c\x46\x3f\x9b\xc1\x17\x5d\x0c\xce\x4c\x77\xed\xdb\x40\x3c\xea\xd2\xd0\x62\xd4\x99\x8c\x72\xac\xb5\x0c\xb6\x38\x99\xcf\x1e\xfe\x4f\x67\xff\x6b\x20\x1e\x65\x1f\x5a\x3c\x14\x88\x83\x80\x78\x8f\x82\x6e\x4e\xe6\xec\x28\x44\x21\x37\x56\xe1\xe6\xcb\xa7\xff\x11\x35\xb5\xc6\x50\x2a\x76\x0e\xed\x87\xb1\x4e\x14\xb8\x09\x37\xb4\x6b\x2c\x40\xe5\x60\xac\x00\x93\x2c\xa0\x66\x02\x29\x08\xd6\xda\xae\x50\x8f\xa5\x67\x9e\x8c\x17\xdd\xec\x97\xdc\xe9\x8e\x7e\x8c\x69\xed\x71\x35\x22\xd9\x62\xff\xb6\x3f\x38\xf3\xb3\xbf\x42\x29\x66\xf8\x70\x3d\x10\x8f\xc2\xfb\xcb\x06\xd7\x04\x43\xcb\xaf\x4e\xad\x70\x8f\x8c\x40\x95\x11\x5a\x0f\xca\xde\x96\xf4\xeb\x40\x3e\x4e\x6a\x9d\x80\x75\x59\x5f\xbf\x2b\x2a\xdb\x1b\x6b\xde\x7e\x86\x5b\x71\xa9\x22\x79\xb1\xb2\x56\x13\x9a\x08\xea\x7b\xaf\x03\x97\xf1\xac\xf8\x5e\x90\x14\xe4\x40\x0a\xc5\xa0\x18\x10\xc2\x12\x6f\x94\x81\x48\xd5\xeb\xf0\x87\xf5\x7d\x7a\x3e\x68\x4c\xa9\xb0\x7a\xb0\x29\x5b\x17\xfe\x61\x1b\xe3\xbf\x8e\xe9\x44\x77\x3c\x6a\x7d\x4e\x16\xd8\x70\x28\x78\x32\xda\xe7\x5d\xf9\x28\xd6\xc8\xea\x1c\xa4\xca\xd9\xb2\x92\xe9\x48\xd7\xbb\xf2\xf1\x9d\xda\x95\x9a\x83\xf4\x60\xdd\x5d\xae\xed\xc3\x64\xa6\xef\x23\x85\x28\xd4\xd8\xee\x1c\xaa\xbb\xd5\x64\x9e\x3f\x8d\x7d\xd0\x94\xad\x09\xde\x23\x1f\xba\x6e\xef\x5a\xe1\x15\x32\x41\x6a\xb5\xa6\xf4\x15\x01\x2d\xd3\x6a\x32\xe8\xd5\x87\x6b\xf8\x4a\xee\x9e\x5c\x3c\xa0\x7e\x9e\x37\xf3\xfe\xc6\x55\xba\xfd\x26\xf7\x77\x55\xef\xa3\xd6\xfa\x0b\xec\x38\x5e\xb1\x56\x4f\x4f\xbf\x6f\x43\xe9\xf8\xc7\xd7\x50\x66\x16\x8c\x6f\x1a\x26\xb3\x0c\x84\xe3\x28\x03\x91\x39\x24\x6d\x33\x32\xa3\x12\x7f\x19\xe9\x44\xa1\xb6\xa6\x81\x05\xa5\xe6\xe3\xca\xef\x9e\x6a\x52\xaf\xb4\x4a\xe7\x30\x5f\x07\x0d\xb8\x18\x5f\x06\xfb\x6e\x91\x5e\x0b\xc3\xc0\x05\x3a\xca\x00\x53\x67\x99\x01\xb5\x06\x21\x2c\x19\x94\x09\x29\x5a\x69\x94\xdc\xba\xf2\xb0\x8f\xb3\xbe\xa0\xc2\xaa\x63\x2f\xc9\xd4\x65\xec\x2e\x1f\x4a\xc7\x2f\xf3\x02\x43\x8f\xcb\xa9\xed\x77\x0e\x76\xdb\x18\xff\x68\x46\xc0\x57\x6c\x75\x8f\x42\xc9\x02\xde\xbe\x85\xcf\x3e\x8e\xf7\x8a\x95\x3f\x98\x62\x83\xd3\xf6\xc1\x90\xeb\xe4\xfd\x86\x24\x5e\xf6\xef\x4e\x6c\xbb\x51\x50\x52\xb9\x22\xc7\x8d\xf4\x6d\xac\x3b\x69\xd7\xdb\xb7\x55\x47\xe4\x89\xb6\x29\x6a\x9a\x7e\xd4\x3e\xed\xca\xc7\x1b\xc9\x5f\x7e\x37\x30\x32\x3d\xe7\xd4\xd5\x3c\x03\xea\x86\x0f\x11\xbd\xe1\x8a\x52\x95\xab\x14\x1e\x1c\x56\x15\xb9\xdd\x67\x0b\x5f\x4a\x7d\xf4\xac\x59\x00\xd6\x99\xb2\x0b\x20\x49\x4f\xe1\x72\xa7\x35\x68\xda\x02\x26\x11\x65\x8e\x2d\x29\x58\x8b\x2d\x51\x28\xd2\xc6\xef\x3f\x9f\x17\x63\xa5\x78\x43\xb6\x95\x7b\xa1\xaa\x1c\xf7\x8d\xef\xd7\x52\xd6\x04\x2f\x67\x80\x5f\xc5\xd4\x0e\xd7\x94\x14\x0d\xf8\x50\xa1\xf3\x35\xe4\x0f\x68\x56\x07\xad\x38\xfa\xa1\x7a\xc0\xa7\x93\xe6\x50\x25\x8e\xf4\x26\xe6\xc9\x79\xe3\x62\x92\x16\x28\xdd\xcf\x9e\x53\x05\xf2\x15\x9a\x5e\x19\x2f\x6d\xb6\x71\x6a\xb9\x7c\x44\x7b\x1a\x5e\x9c\x4e\xbd\x7a\x27\x72\x47\x8f\xfb\x5f\x6b\x72\xeb\x48\xad\xcd\x48\xa0\x65\xdc\x3c\x47\x05\x7c\x7a\xf1\x39\xea\xe7\x72\xe7\xb9\x6b\xe9\xa1\x97\xdb\xd7\xb4\xde\x46\xb7\x2f\x5b\xcd\xf3\x4a\xaf\xb9\xb8\x8d\x34\x42\x7e\xe3\x62\x61\xba\xf4\x33\xe1\x9c\xe0\xe0\x75\x25\xbc\xf8\xb5\xbd\x44\x93\x73\x2f\xe6\x51\x0c\x9e\x77\xda\xac\x0e\x7a\x33\xd3\x3f\x34\xaf\xa5\xf6\x16\x7d\x89\xf7\xe0\x8d\x55\x5f\xdb\x77\xf2\xa4\xad\xf8\x4f\x90\x88\x2a\x89\x05\xcb\x8a\xb7\x89\xe6\x1b\xc9\x5c\x96\x19\x69\x92\x10\xa8\x4d\x01\x86\xa4\x22\x57\x2a\xe6\x8d\xaa\x17\x85\xe7\x93\xe7\x93\xff\x02\x00\x00\xff\xff\x89\xbf\xed\x86\x91\x15\x00\x00") +var _yaoModelsAgentAssistantModYao = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x58\x4b\x73\xdb\x36\x10\xbe\xfb\x57\xec\xf0\xd4\xce\x28\x4e\xda\x43\xa7\xd6\xa9\x4e\x72\xa8\xa7\x71\xa3\x49\xe2\xe6\x90\xf1\x68\x96\xe4\x92\x42\x05\x02\x2c\xb0\xb4\xad\x7a\xfc\xdf\x3b\x00\x29\x3e\x44\xe8\x41\xa5\x17\x3d\x80\xdd\xc5\xb7\x0f\xec\x62\xf7\xf9\x02\x20\x52\x58\x50\x34\x87\xe8\xda\x5a\x61\x19\x15\x47\x33\xb7\x2c\x31\x26\x19\x58\x4f\xc9\x26\x46\x94\x2c\xb4\x1a\xec\x02\x63\x2c\x09\x32\x6d\xc0\xb2\x36\x42\xe5\x70\x7d\x03\xd8\x6e\x27\x5a\x65\x22\xaf\x0c\x3a\x4e\x0b\xa8\x52\x28\x88\x31\x45\xc6\x5a\x30\x63\x6e\xa3\x39\x7c\x8b\x30\x27\x77\x18\x44\x76\x63\x99\x8a\xe8\xde\x6f\xc7\x95\x90\x2c\xdc\x99\x6c\x2a\xf2\x4b\x86\x30\xd5\x4a\x6e\xfa\x6b\x56\x1b\x8e\xe6\x70\x75\x75\x75\xd5\x48\x8d\xa5\x53\xef\xb9\x53\xd4\xcb\x5f\x62\xa7\x16\x44\x89\x2e\x0a\x77\xa8\x53\xc8\xed\xf6\x70\xd7\x02\xe0\xc5\x4b\x4b\xb4\xac\x0a\xe5\x61\x5e\x00\x00\x3c\xfb\xcf\x9e\x11\x45\xea\x95\xf1\x6b\xbc\x29\xfd\xda\xcd\xfb\x6e\x6d\x6c\x55\xe8\x6f\xf7\x70\xdc\x29\xf1\x4f\x45\x3d\x20\x22\x25\xc5\x22\x13\x64\x22\x4f\xfe\x32\x0b\x43\x68\x39\x96\x21\x30\x96\x9d\x6b\xce\x01\x74\x1d\x42\xd2\xc9\x21\x95\xf3\x2a\x9a\xc3\xcf\x6f\xde\xb4\x8b\xaa\x92\xb2\xb1\x7f\x86\xd2\x52\xbb\x51\x79\xe5\x7a\x7e\xf3\xab\x42\xa5\xf4\xd4\x2c\x1e\x54\xd1\x2b\x73\xba\x6a\x5f\x06\xe4\x41\x95\x86\x12\x83\xca\xa4\x94\x61\x25\x79\x60\xe2\x68\x3a\x76\xff\x7d\x3a\xf6\x3f\x07\xe4\x41\xec\x43\x89\xc7\x1c\x71\x14\x20\x3e\x20\xa3\x99\x12\x39\x3b\x0c\x41\x90\xb5\x54\xb8\xfb\xf4\xe1\x7f\x84\x9a\x68\xa5\x28\x61\x3d\x05\xed\xbb\x31\x4f\x10\x70\xe3\x6e\x68\xcf\x98\x81\xc8\x40\x69\x06\x4b\x3c\x83\xca\x12\xf0\x8a\x20\x97\x3a\x46\x39\xa6\x9e\x78\x33\x4e\x53\x73\xa9\x7d\xde\xb5\x63\x75\xff\xb6\x5a\x1d\x52\x16\x3e\xee\x72\xf6\x94\xee\xa8\x2c\x49\x4a\x1c\x21\x34\x27\xcd\x9b\x1f\x28\x21\x93\x98\xcf\x9c\x1f\x85\x47\xde\xa9\x6a\x41\x0a\xcb\x33\x9f\xd2\x13\x2c\x31\x16\x52\xf0\x06\x32\x21\x99\x4c\xef\xc4\x29\x9e\xed\x57\x99\xd3\x7d\xfb\x3e\xc4\xb5\xc7\xbb\x01\xca\xd6\x53\xbf\xec\x8f\xc7\xe9\x17\xbe\x44\x5e\x4d\xd0\x61\x31\x20\x0f\x82\x77\xf5\x15\x73\x82\xa1\xe4\xef\xbe\x4d\xbe\x74\x8e\x80\x0a\xc5\x94\x0f\x32\xfd\x16\xe9\xe7\x01\x7d\x18\xa9\x36\x0c\xda\xa4\x7d\xfe\x2e\x8f\x6e\x8b\xf4\x34\x7b\xfa\x87\xc0\x52\x04\xe2\x22\xd6\x5a\x12\x86\xee\xc1\x5b\xc7\x03\x37\xe1\xa8\xf8\xba\x22\x5e\x91\x01\x5e\x09\x0b\xc2\x02\x82\x3f\xe2\x95\x50\x10\x48\xf4\x1d\xfc\x61\x49\x3b\x3d\x1e\x24\x26\xb4\xd2\x72\x60\x94\x23\xf7\x78\x11\xe2\x09\x5a\x3c\x28\x7d\x4a\x14\x4c\x4d\x31\x87\x12\x4b\x07\x6b\x24\x75\x0a\xa4\xd2\xe8\xa2\xe4\xd3\x21\x2d\x76\xe9\x0f\x26\xf8\x91\xf4\xe9\xd0\x96\xa5\x21\x4b\x93\x11\xc2\x62\x97\xad\x07\xb4\x21\x69\x24\x83\x36\x39\x2a\xf1\x2f\xa5\x10\x6f\xa0\xd0\x29\xc1\x0f\x74\x99\x5f\xce\x20\x59\x21\xcf\x80\xd1\xae\x67\x40\x9c\x5c\xfe\x78\x9e\x22\x8f\xda\xac\x33\xa9\x1f\x4f\x56\xe1\xeb\x88\x21\x68\xe5\xb1\xdc\x29\xa8\xd6\xf1\xc9\x78\xfe\x50\xfa\x51\x52\x9a\x13\xbc\x45\x7b\xec\xc9\xb4\x6e\x89\x63\xb4\xae\x94\xc9\xa6\xee\x9d\x19\x06\x45\x52\x9e\x0c\xf4\xf6\xdd\x02\x3e\x93\x79\x18\xd4\xc6\x1e\x4a\xb7\x6f\xeb\xfd\x5e\xb5\x75\x7d\x95\x7b\x6f\xf4\x1a\x13\xed\x1e\x21\xe7\xe1\xb5\xba\x32\x49\xe0\x19\xca\xf4\xc4\xc1\x4c\x3f\x24\xef\xa1\xfd\x5d\xeb\x35\xd4\xb5\x14\x6a\xa9\x90\xe8\xf4\x4c\x58\xbe\x05\x3c\xd5\x8e\x5f\x06\xc4\xe1\x57\xfd\x80\x64\x0a\x92\xb6\xb5\x9c\x50\x64\x3e\x8d\x78\x82\xa0\xb6\xa2\xc1\x32\x72\x65\xcf\xab\x2c\x7b\xb2\x51\x15\x4b\x91\x4c\xc1\xbc\xf0\x1c\x70\x3d\xae\x73\xfb\x0a\x64\xaf\x21\xb5\x60\x57\x68\x28\x05\x4c\x8c\xb6\x16\x50\x4a\x60\xc2\xc2\x82\x50\x3e\x58\x4b\x89\x9c\x69\x53\x1c\xd7\x71\xd2\x7b\xd8\x9f\x3a\xd6\x92\x54\x55\x84\x82\x77\x48\x1d\x7e\xa7\xac\xd0\x4f\x2c\x6c\xa2\xfb\x7d\xa0\xde\x8e\x39\xbe\x35\x2b\xe0\x32\xbe\x78\x40\xa6\x68\x06\xaf\x5f\xc3\x47\xe7\xc7\x07\x61\x85\xbb\xa2\xac\xbd\xd2\xfa\x51\x91\xe9\xe8\x9d\x41\x22\x47\xfb\x57\x47\xb6\x35\x14\x14\x54\xc4\x64\x6c\x43\x7d\x1f\xea\x35\xdb\xf3\xf6\x99\xea\x8c\x38\x91\x3a\x41\x49\xa7\x5f\xb5\x0f\xbb\xf4\xe1\xb1\xc0\x4f\xbf\x2a\x18\x89\x9e\x72\xeb\x2a\x3b\x01\xd4\x9d\x3d\x86\xe8\x95\x2d\x29\x11\x99\x48\xe0\xd1\x60\x59\x92\xd9\x1d\x42\xb9\xa4\xea\xbc\xa7\xd5\x0c\xb0\x4a\x85\xae\x4b\x28\xdc\xec\x34\x7a\x4d\x93\x67\x89\x59\xa8\x73\x53\x0a\x56\xac\x0b\x64\x0a\x0c\x65\xf6\xdf\xcf\xeb\x31\x53\xb8\xbd\xde\xd2\x1d\xc8\x2a\xe7\xb5\x2f\xee\x2c\xd7\x00\x3a\x2d\x27\x00\xbf\x0d\xb1\x1d\xcf\x29\x09\x2a\x70\xae\x42\xe3\x72\xc8\x6f\xd0\x9c\xee\x3b\xcc\x33\x74\xba\x68\x2e\x55\x64\x48\xd6\x3e\x8f\xe6\x8d\x8a\x91\x7b\x38\x75\x7f\x7b\x4a\xad\xd0\xde\xa2\xea\xa5\x71\xf7\xdc\xf2\x4a\x2d\x97\x1b\xd4\x97\x7e\x7e\x78\xe9\xd8\x3b\x92\x35\x6d\xf6\xcf\xde\x32\x6d\x48\xe4\x6a\x44\xd0\x62\xac\x87\x8b\x1e\x3e\x1d\x1c\x2e\x3e\x2d\x77\x86\x97\x4b\x07\x7a\xb9\x9d\x8d\xf6\x0c\xdd\xce\x29\x9b\x61\x59\xaf\x6f\xba\x0f\xf4\x78\xce\x70\x21\x37\xdd\xb8\x1d\x7f\x4f\x70\x30\x2b\xf3\xcd\x7e\xdb\x26\x35\x31\x77\x30\x8e\x42\xe0\xed\x4e\x07\xd9\x81\xae\x77\xfa\x97\xe6\x7b\x51\x3b\x89\x2e\xc5\x3b\xe0\x8d\x54\x97\xdb\x77\xe2\xa4\xcd\xf8\xcf\x10\xb1\x28\xc8\x32\x16\xa5\xdd\x06\x9a\x7b\x38\x65\xbc\x4c\x49\x12\x7b\x47\xd5\x09\x18\xa2\x92\x4c\x21\xac\xad\x59\x1d\x29\xbc\x5c\xbc\x5c\xfc\x17\x00\x00\xff\xff\xdf\xd5\xd7\x46\x5f\x17\x00\x00") func yaoModelsAgentAssistantModYaoBytes() ([]byte, error) { return bindataRead( @@ -2519,7 +2519,7 @@ func yaoModelsAgentAssistantModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/agent/assistant.mod.yao", size: 5521, mode: os.FileMode(420), modTime: time.Unix(1763118620, 0)} + info := bindataFileInfo{name: "yao/models/agent/assistant.mod.yao", size: 5983, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2539,7 +2539,7 @@ func yaoModelsAgentChatModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/agent/chat.mod.yao", size: 1741, mode: os.FileMode(420), modTime: time.Unix(1763118620, 0)} + info := bindataFileInfo{name: "yao/models/agent/chat.mod.yao", size: 1741, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2559,7 +2559,7 @@ func yaoModelsAgentHistoryModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/agent/history.mod.yao", size: 2941, mode: os.FileMode(420), modTime: time.Unix(1763118620, 0)} + info := bindataFileInfo{name: "yao/models/agent/history.mod.yao", size: 2941, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2579,7 +2579,7 @@ func yaoModelsAttachmentModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/attachment.mod.yao", size: 4286, mode: os.FileMode(420), modTime: time.Unix(1763118620, 0)} + info := bindataFileInfo{name: "yao/models/attachment.mod.yao", size: 4286, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2599,7 +2599,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/models/audit.mod.yao", size: 5588, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2619,7 +2619,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/models/config.mod.yao", size: 1649, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2639,7 +2639,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/models/dsl.mod.yao", size: 3826, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2659,7 +2659,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/models/invitation.mod.yao", size: 6693, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2679,7 +2679,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/models/job/category.mod.yao", size: 2041, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2699,7 +2699,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/models/job/execution.mod.yao", size: 7201, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2719,7 +2719,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/models/job/job.mod.yao", size: 6330, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2739,7 +2739,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/models/job/log.mod.yao", size: 4711, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2759,7 +2759,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/models/kb/collection.mod.yao", size: 5390, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2779,7 +2779,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/models/kb/document.mod.yao", size: 9906, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2799,7 +2799,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/models/member.mod.yao", size: 14798, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2819,7 +2819,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/models/role.mod.yao", size: 6434, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2839,7 +2839,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/models/team.mod.yao", size: 15823, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2859,7 +2859,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/models/user/oauth_account.mod.yao", size: 6928, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2879,7 +2879,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/models/user/type.mod.yao", size: 7502, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2899,7 +2899,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/models/user.mod.yao", size: 12335, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2919,7 +2919,7 @@ func yaoReleaseAppYaz() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/release/app.yaz", size: 181682, mode: os.FileMode(420), modTime: time.Unix(1763118620, 0)} + info := bindataFileInfo{name: "yao/release/app.yaz", size: 181682, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2939,7 +2939,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/stores/agent/cache.lru.yao", size: 301, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2959,7 +2959,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/stores/agent/memory.badger.yao", size: 352, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2979,7 +2979,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/stores/cache.lru.yao", size: 285, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2999,7 +2999,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/stores/kb/cache.lru.yao", size: 304, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3019,7 +3019,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/stores/kb/store.badger.yao", size: 349, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3039,7 +3039,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/stores/oauth/cache.lru.yao", size: 301, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3059,7 +3059,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/stores/oauth/client.badger.yao", size: 352, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3079,7 +3079,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/stores/oauth/store.badger.yao", size: 376, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3099,7 +3099,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/stores/store.badger.yao", size: 341, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3119,7 +3119,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(1763118620, 0)} + info := bindataFileInfo{name: "yao/uploaders/attachment.local.yao", size: 1163, mode: os.FileMode(420), modTime: time.Unix(1764649139, 0)} a := &asset{bytes: bytes, info: info} return a, nil } diff --git a/openapi/agent/assistant.go b/openapi/agent/assistant.go index 04a87e97..ce2d10ea 100644 --- a/openapi/agent/assistant.go +++ b/openapi/agent/assistant.go @@ -192,6 +192,17 @@ func GetAssistant(c *gin.Context) { return } + // Parse select fields (optional - if not provided, returns default fields) + // Query parameter: ?select=field1,field2,field3 + var fields []string + if selectParam := c.Query("select"); selectParam != "" { + fields = strings.Split(selectParam, ",") + // Trim whitespace from each field + for i, field := range fields { + fields[i] = strings.TrimSpace(field) + } + } + // Parse locale (optional - if not provided, returns raw data without i18n translation) // This is useful for form editing scenarios where you need the original values var assistant *agenttypes.AssistantModel @@ -200,10 +211,10 @@ func GetAssistant(c *gin.Context) { if loc := c.Query("locale"); loc != "" { // If locale is specified, get assistant with translation locale := strings.ToLower(strings.TrimSpace(loc)) - assistant, err = agentInstance.Store.GetAssistant(assistantID, locale) + assistant, err = agentInstance.Store.GetAssistant(assistantID, fields, locale) } else { // If no locale specified, get raw data without translation - assistant, err = agentInstance.Store.GetAssistant(assistantID) + assistant, err = agentInstance.Store.GetAssistant(assistantID, fields) } if err != nil { log.Error("Failed to get assistant %s: %v", assistantID, err) @@ -521,8 +532,8 @@ func checkAssistantPermission(authInfo *types.AuthorizedInfo, assistantID string return false, fmt.Errorf("agent store not initialized") } - // Get assistant from store - assistant, err := agentInstance.Store.GetAssistant(assistantID) + // Get assistant from store - only need default fields for permission check + assistant, err := agentInstance.Store.GetAssistant(assistantID, nil) if err != nil { return false, fmt.Errorf("assistant not found: %s", assistantID) } diff --git a/openapi/agent/filter.go b/openapi/agent/filter.go index f946cd3e..deeed3bb 100644 --- a/openapi/agent/filter.go +++ b/openapi/agent/filter.go @@ -126,7 +126,7 @@ func AuthQueryFilter(c *gin.Context, authInfo *types.AuthorizedInfo) func(query. } // FilterBuiltInFields filters sensitive fields for built-in assistants in a list -// For built-in assistants, code-level fields (prompts, workflow, tools, kb, mcp, options) should be cleared +// For built-in assistants, code-level fields (prompts, prompt_presets, workflow, kb, mcp, options, source) should be cleared func FilterBuiltInFields(assistants []*agenttypes.AssistantModel) { if assistants == nil { return @@ -138,7 +138,7 @@ func FilterBuiltInFields(assistants []*agenttypes.AssistantModel) { } // FilterBuiltInAssistant filters sensitive fields for a single built-in assistant -// For built-in assistants, code-level fields (prompts, workflow, tools, kb, mcp, options) should be cleared +// For built-in assistants, code-level fields (prompts, prompt_presets, workflow, kb, mcp, options, source) should be cleared // This function can be used for both single assistant and list of assistants func FilterBuiltInAssistant(assistant *agenttypes.AssistantModel) { if assistant == nil { @@ -148,10 +148,11 @@ func FilterBuiltInAssistant(assistant *agenttypes.AssistantModel) { if assistant.BuiltIn { // Clear code-level sensitive fields for built-in assistants assistant.Prompts = nil + assistant.PromptPresets = nil assistant.Workflow = nil - assistant.Tools = nil assistant.KB = nil assistant.MCP = nil assistant.Options = nil + assistant.Source = "" } } diff --git a/openapi/agent/models.go b/openapi/agent/models.go index db15bfa0..e625f630 100644 --- a/openapi/agent/models.go +++ b/openapi/agent/models.go @@ -130,6 +130,17 @@ func GetModelDetails(c *gin.Context) { return } + // For model API, we only need minimal fields: assistant_id, name, connector, created_at, and permission fields + modelFields := []string{ + "assistant_id", + "name", + "connector", + "created_at", + "built_in", + "__yao_team_id", + "__yao_created_by", + } + // Parse locale (optional - for assistant name translation) // Priority: 1. Query parameter "locale", 2. Header "Accept-Language", 3. Metadata locale := context.GetLocale(c, nil) @@ -138,9 +149,9 @@ func GetModelDetails(c *gin.Context) { var err error if locale != "" { - assistant, err = agentInstance.Store.GetAssistant(assistantID, locale) + assistant, err = agentInstance.Store.GetAssistant(assistantID, modelFields, locale) } else { - assistant, err = agentInstance.Store.GetAssistant(assistantID) + assistant, err = agentInstance.Store.GetAssistant(assistantID, modelFields) } if err != nil { diff --git a/openapi/tests/agent/assistant_update_test.go b/openapi/tests/agent/assistant_update_test.go index ba87fd06..281b6a9a 100644 --- a/openapi/tests/agent/assistant_update_test.go +++ b/openapi/tests/agent/assistant_update_test.go @@ -620,62 +620,7 @@ func TestUpdateAssistant(t *testing.T) { t.Logf("Successfully updated assistant mcp settings: %s", assistantID) }) - t.Run("UpdateAssistantTools", func(t *testing.T) { - // Create a test assistant - assistantID := createTestAssistant("Tools Update Test") - defer func() { - deleteReq, _ := http.NewRequest("DELETE", serverURL+baseURL+"/agent/assistants/"+assistantID, nil) - deleteReq.Header.Set("Authorization", "Bearer "+tokenInfo.AccessToken) - resp, _ := http.DefaultClient.Do(deleteReq) - if resp != nil { - resp.Body.Close() - } - }() - - // Update tools - updateData := map[string]interface{}{ - "tools": []map[string]interface{}{ - { - "name": "web_search", - "description": "Search the web for information", - "parameters": map[string]interface{}{ - "query": map[string]interface{}{ - "type": "string", - "description": "Search query", - "required": true, - }, - }, - }, - { - "name": "calculator", - "description": "Perform calculations", - "parameters": map[string]interface{}{ - "expression": map[string]interface{}{ - "type": "string", - "description": "Mathematical expression", - "required": true, - }, - }, - }, - }, - } - - jsonData, err := json.Marshal(updateData) - assert.NoError(t, err) - - req, err := http.NewRequest("PUT", serverURL+baseURL+"/agent/assistants/"+assistantID, bytes.NewBuffer(jsonData)) - assert.NoError(t, err) - req.Header.Set("Authorization", "Bearer "+tokenInfo.AccessToken) - req.Header.Set("Content-Type", "application/json") - - resp, err := http.DefaultClient.Do(req) - assert.NoError(t, err) - assert.NotNil(t, resp) - defer resp.Body.Close() - - assert.Equal(t, http.StatusOK, resp.StatusCode, "Should successfully update tools") - t.Logf("Successfully updated assistant tools: %s", assistantID) - }) + // Note: UpdateAssistantTools test removed - tools field is deprecated and replaced by MCP t.Run("UpdateAssistantWorkflow", func(t *testing.T) { // Create a test assistant @@ -776,12 +721,7 @@ func TestUpdateAssistant(t *testing.T) { }, }, }, - "tools": []map[string]interface{}{ - { - "name": "updated_tool", - "description": "Updated tool description", - }, - }, + // Note: tools field removed - now handled by MCP "kb": map[string]interface{}{ "collections": []string{"updated-collection"}, "enabled": true, diff --git a/yao/models/agent/assistant.mod.yao b/yao/models/agent/assistant.mod.yao index e13b92c9..3b836660 100644 --- a/yao/models/agent/assistant.mod.yao +++ b/yao/models/agent/assistant.mod.yao @@ -57,6 +57,13 @@ "length": 200, "nullable": false }, + { + "name": "connector_options", + "type": "json", + "label": "Connector Options", + "comment": "Connector selection options: optional flag, available connectors list, and capability filters", + "nullable": true + }, { "name": "description", "type": "string", @@ -108,7 +115,14 @@ "name": "prompts", "type": "json", "label": "Prompts", - "comment": "Assistant prompts", + "comment": "Assistant default prompts", + "nullable": true + }, + { + "name": "prompt_presets", + "type": "json", + "label": "Prompt Presets", + "comment": "Prompt presets organized by mode (e.g., chat, task, etc.)", "nullable": true }, { @@ -133,10 +147,10 @@ "nullable": true }, { - "name": "tools", - "type": "json", - "label": "Tools", - "comment": "Assistant tools", + "name": "source", + "type": "text", + "label": "Source", + "comment": "Hook script source code", "nullable": true }, {