diff --git a/agent/robot/DESIGN.md b/agent/robot/DESIGN.md index 33739532..e753dc85 100644 --- a/agent/robot/DESIGN.md +++ b/agent/robot/DESIGN.md @@ -351,6 +351,7 @@ P2 Agent reads Goals markdown and breaks into executable tasks: ```go type Task struct { ID string // unique task ID + Description string // human-readable task description (for UI display) Messages []context.Message // original input (text, images, files, audio) GoalRef string // reference to goal (e.g., "Goal 1") Source TaskSource // auto | human | event diff --git a/agent/robot/TECHNICAL.md b/agent/robot/TECHNICAL.md index 521ba823..74683dda 100644 --- a/agent/robot/TECHNICAL.md +++ b/agent/robot/TECHNICAL.md @@ -1314,10 +1314,11 @@ type DeliveryTarget struct { // Task - planned task (structured, for execution) type Task struct { - ID string `json:"id"` - Messages []context.Message `json:"messages"` // original input (text, images, files) - GoalRef string `json:"goal_ref,omitempty"` // reference to goal (e.g., "Goal 1") - Source TaskSource `json:"source"` // auto | human | event + ID string `json:"id"` + Description string `json:"description,omitempty"` // human-readable task description (for UI display) + Messages []context.Message `json:"messages"` // original input (text, images, files) + GoalRef string `json:"goal_ref,omitempty"` // reference to goal (e.g., "Goal 1") + Source TaskSource `json:"source"` // auto | human | event // Executor ExecutorType ExecutorType `json:"executor_type"` diff --git a/agent/robot/api/robot.go b/agent/robot/api/robot.go index 800d8be0..2f1f1ea8 100644 --- a/agent/robot/api/robot.go +++ b/agent/robot/api/robot.go @@ -21,6 +21,9 @@ const memberModel = "__yao.member" // robotStore is the shared robot store instance var robotStore = store.NewRobotStore() +// executionStore is the shared execution store instance +var executionStore = store.NewExecutionStore() + // GetRobot returns a robot by member ID // Returns the robot from cache if available, otherwise loads from database func GetRobot(ctx *types.Context, memberID string) (*types.Robot, error) { @@ -95,7 +98,6 @@ func GetRobotStatus(ctx *types.Context, memberID string) (*RobotState, error) { DisplayName: robot.DisplayName, Bio: robot.Bio, Status: robot.Status, - Running: robot.RunningCount(), MaxRunning: 2, // default } @@ -109,11 +111,33 @@ func GetRobotStatus(ctx *types.Context, memberID string) (*RobotState, error) { state.MaxRunning = robot.Config.Quota.GetMax() } - // Get running execution IDs - executions := robot.GetExecutions() - state.RunningIDs = make([]string, 0, len(executions)) - for _, exec := range executions { - state.RunningIDs = append(state.RunningIDs, exec.ID) + // Get running execution IDs from ExecutionStore (more reliable than in-memory) + // This ensures we get accurate status even when robot is loaded from database + runningExecs, err := executionStore.List(context.Background(), &store.ListOptions{ + MemberID: memberID, + Status: types.ExecRunning, + Limit: 100, + }) + if err == nil && len(runningExecs) > 0 { + state.Running = len(runningExecs) + state.RunningIDs = make([]string, 0, len(runningExecs)) + for _, exec := range runningExecs { + state.RunningIDs = append(state.RunningIDs, exec.ExecutionID) + } + // Update status based on running count + state.Status = types.RobotWorking + } else { + // No running executions from store, check in-memory + executions := robot.GetExecutions() + state.Running = len(executions) + state.RunningIDs = make([]string, 0, len(executions)) + for _, exec := range executions { + state.RunningIDs = append(state.RunningIDs, exec.ID) + } + // If there are running executions in memory, update status + if state.Running > 0 { + state.Status = types.RobotWorking + } } // Set last run time diff --git a/agent/robot/executor/standard/delivery.go b/agent/robot/executor/standard/delivery.go index 0d050e1d..4d312c69 100644 --- a/agent/robot/executor/standard/delivery.go +++ b/agent/robot/executor/standard/delivery.go @@ -30,6 +30,10 @@ func (e *Executor) RunDelivery(ctx *robottypes.Context, exec *robottypes.Executi return fmt.Errorf("robot not found in execution") } + // Update UI field with i18n + locale := getEffectiveLocale(robot, exec.Input) + e.updateUIFields(ctx, exec, "", getLocalizedMessage(locale, "generating_delivery")) + // Get agent ID for delivery phase agentID := "__yao.delivery" // default if robot.Config != nil && robot.Config.Resources != nil { @@ -108,6 +112,10 @@ func (e *Executor) routeToDeliveryCenter(ctx *robottypes.Context, exec *robottyp return nil } + // Update UI field to show delivery is in progress + locale := getEffectiveLocale(robot, exec.Input) + e.updateUIFields(ctx, exec, "", getLocalizedMessage(locale, "sending_delivery")) + // Create Delivery Center and execute center := NewDeliveryCenter() results, err := center.Deliver(ctx, exec.Delivery.Content, &robottypes.DeliveryContext{ diff --git a/agent/robot/executor/standard/executor.go b/agent/robot/executor/standard/executor.go index f2bd0fb7..685d5211 100644 --- a/agent/robot/executor/standard/executor.go +++ b/agent/robot/executor/standard/executor.go @@ -20,6 +20,7 @@ import ( type Executor struct { config types.Config store *store.ExecutionStore + robotStore *store.RobotStore execCount atomic.Int32 currentCount atomic.Int32 onStart func() @@ -29,15 +30,17 @@ type Executor struct { // New creates a new standard executor func New() *Executor { return &Executor{ - store: store.NewExecutionStore(), + store: store.NewExecutionStore(), + robotStore: store.NewRobotStore(), } } // NewWithConfig creates a new standard executor with configuration func NewWithConfig(config types.Config) *Executor { return &Executor{ - config: config, - store: store.NewExecutionStore(), + config: config, + store: store.NewExecutionStore(), + robotStore: store.NewRobotStore(), } } @@ -94,7 +97,19 @@ func (e *Executor) Execute(ctx *robottypes.Context, robot *robottypes.Robot, tri }).Warn("Execution quota exceeded") return nil, robottypes.ErrQuotaExceeded } - defer robot.RemoveExecution(exec.ID) + // Defer: remove execution from robot's tracking and update robot status if no more executions + defer func() { + robot.RemoveExecution(exec.ID) + // Update robot status to idle if no more running executions + if robot.RunningCount() == 0 && !e.config.SkipPersistence && e.robotStore != nil { + if err := e.robotStore.UpdateStatus(ctx.Context, robot.MemberID, robottypes.RobotIdle); err != nil { + log.With(log.F{ + "member_id": robot.MemberID, + "error": err, + }).Warn("Failed to update robot status to idle: %v", err) + } + } + }() // Track execution count e.execCount.Add(1) @@ -127,6 +142,16 @@ func (e *Executor) Execute(ctx *robottypes.Context, robot *robottypes.Robot, tri } } + // Update robot status to working (when execution starts) + if !e.config.SkipPersistence && e.robotStore != nil { + if err := e.robotStore.UpdateStatus(ctx.Context, robot.MemberID, robottypes.RobotWorking); err != nil { + log.With(log.F{ + "member_id": robot.MemberID, + "error": err, + }).Warn("Failed to update robot status to working: %v", err) + } + } + // Check for simulated failure (for testing) if dataStr, ok := data.(string); ok && dataStr == "simulate_failure" { exec.Status = robottypes.ExecFailed @@ -211,6 +236,17 @@ func (e *Executor) runPhase(ctx *robottypes.Context, exec *robottypes.Execution, "phase": string(phase), }).Info("Phase started: %s", phase) + // Persist phase change immediately (so frontend sees current phase) + if !e.config.SkipPersistence && e.store != nil { + if err := e.store.UpdatePhase(ctx.Context, exec.ID, phase, nil); err != nil { + log.With(log.F{ + "execution_id": exec.ID, + "phase": string(phase), + "error": err, + }).Warn("Failed to persist phase start: %v", err) + } + } + if e.config.OnPhaseStart != nil { e.config.OnPhaseStart(phase) } @@ -381,6 +417,9 @@ var uiMessages = map[string]map[string]string{ "analyzing_context": "Analyzing context...", "planning_goals": "Planning goals...", "breaking_down_tasks": "Breaking down tasks...", + "generating_delivery": "Generating delivery content...", + "sending_delivery": "Sending delivery...", + "learning_from_exec": "Learning from execution...", "completed": "Completed", "failed_prefix": "Failed at ", "task_prefix": "Task", @@ -401,6 +440,9 @@ var uiMessages = map[string]map[string]string{ "analyzing_context": "分析上下文...", "planning_goals": "规划目标...", "breaking_down_tasks": "分解任务...", + "generating_delivery": "生成交付内容...", + "sending_delivery": "正在发送...", + "learning_from_exec": "学习执行经验...", "completed": "已完成", "failed_prefix": "失败于", "task_prefix": "任务", @@ -451,6 +493,30 @@ func (e *Executor) updateUIFields(ctx *robottypes.Context, exec *robottypes.Exec } } +// updateTasksState persists the current tasks array with status to database +// This should be called after each task status change for real-time UI updates +func (e *Executor) updateTasksState(ctx *robottypes.Context, exec *robottypes.Execution) { + if e.config.SkipPersistence || e.store == nil { + return + } + + // Convert Current to store.CurrentState + var current *store.CurrentState + if exec.Current != nil { + current = &store.CurrentState{ + TaskIndex: exec.Current.TaskIndex, + Progress: exec.Current.Progress, + } + } + + if err := e.store.UpdateTasks(ctx.Context, exec.ID, exec.Tasks, current); err != nil { + log.With(log.F{ + "execution_id": exec.ID, + "error": err, + }).Warn("Failed to update tasks state: %v", err) + } +} + // extractGoalName extracts the execution name from goals output func extractGoalName(goals *robottypes.Goals) string { if goals == nil || goals.Content == "" { diff --git a/agent/robot/executor/standard/learning.go b/agent/robot/executor/standard/learning.go index 727bc6be..d3f78f4c 100644 --- a/agent/robot/executor/standard/learning.go +++ b/agent/robot/executor/standard/learning.go @@ -20,6 +20,13 @@ import ( // // TODO: Implement real learning extraction func (e *Executor) RunLearning(ctx *robottypes.Context, exec *robottypes.Execution, _ interface{}) error { + // Get robot for locale + robot := exec.GetRobot() + + // Update UI field with i18n + locale := getEffectiveLocale(robot, exec.Input) + e.updateUIFields(ctx, exec, "", getLocalizedMessage(locale, "learning_from_exec")) + e.simulateStreamDelay() exec.Learning = []robottypes.LearningEntry{ diff --git a/agent/robot/executor/standard/run.go b/agent/robot/executor/standard/run.go index 1ca2ff65..f48c2644 100644 --- a/agent/robot/executor/standard/run.go +++ b/agent/robot/executor/standard/run.go @@ -93,6 +93,9 @@ func (e *Executor) RunExecution(ctx *robottypes.Context, exec *robottypes.Execut now := time.Now() task.StartTime = &now + // Persist running state to database + e.updateTasksState(ctx, exec) + // Build task context with previous results taskCtx := runner.BuildTaskContext(exec, i) @@ -114,12 +117,17 @@ func (e *Executor) RunExecution(ctx *robottypes.Context, exec *robottypes.Execut // Store result exec.Results = append(exec.Results, *result) + // Persist completed/failed state to database + e.updateTasksState(ctx, exec) + // Check if we should continue on failure if !result.Success && !config.ContinueOnFailure { // Mark remaining tasks as skipped for j := i + 1; j < len(exec.Tasks); j++ { exec.Tasks[j].Status = robottypes.TaskSkipped } + // Persist skipped state to database + e.updateTasksState(ctx, exec) return fmt.Errorf("task %s failed: %s", task.ID, result.Error) } } @@ -135,7 +143,16 @@ func formatTaskProgressName(task *robottypes.Task, index int, total int, locale taskPrefix := getLocalizedMessage(locale, "task_prefix") prefix := fmt.Sprintf("%s %d/%d: ", taskPrefix, index+1, total) - // Try to get description from first message + // Priority 1: Use Description field if available + if task.Description != "" { + desc := task.Description + if len(desc) > 80 { + desc = desc[:80] + "..." + } + return prefix + desc + } + + // Priority 2: Try to get description from first message if len(task.Messages) > 0 { if content, ok := task.Messages[0].GetContentAsString(); ok && content != "" { // Truncate if too long diff --git a/agent/robot/executor/standard/tasks.go b/agent/robot/executor/standard/tasks.go index 4e72b753..597667af 100644 --- a/agent/robot/executor/standard/tasks.go +++ b/agent/robot/executor/standard/tasks.go @@ -156,9 +156,11 @@ func ParseTask(data map[string]interface{}, index int) (*robottypes.Task, error) task.Messages = ParseMessages(messages) } - // Optional: description -> convert to message if no messages - if len(task.Messages) == 0 { - if desc, ok := data["description"].(string); ok && desc != "" { + // Optional: description - save to Description field and convert to message if no messages + if desc, ok := data["description"].(string); ok && desc != "" { + task.Description = desc + // Also convert to Messages for execution if no explicit messages provided + if len(task.Messages) == 0 { task.Messages = []agentcontext.Message{ {Role: agentcontext.RoleUser, Content: desc}, } diff --git a/agent/robot/executor/standard/tasks_test.go b/agent/robot/executor/standard/tasks_test.go index 223e0a7f..fcfc5c21 100644 --- a/agent/robot/executor/standard/tasks_test.go +++ b/agent/robot/executor/standard/tasks_test.go @@ -309,7 +309,8 @@ func TestParseTasks(t *testing.T) { // Second task assert.Equal(t, "task-002", tasks[1].ID) assert.Equal(t, "experts.text-writer", tasks[1].ExecutorID) - assert.Len(t, tasks[1].Messages, 1) // description converted to message + assert.Equal(t, "Generate report from analysis", tasks[1].Description) // description saved to field + assert.Len(t, tasks[1].Messages, 1) // description also converted to message assert.Equal(t, 1, tasks[1].Order) }) @@ -329,6 +330,62 @@ func TestParseTasks(t *testing.T) { assert.Equal(t, "task-001", tasks[0].ID) }) + t.Run("saves description to field and preserves explicit messages", func(t *testing.T) { + data := []interface{}{ + map[string]interface{}{ + "id": "task-001", + "executor_type": "agent", + "executor_id": "experts.summarizer", + "description": "Task description for UI", + "messages": []interface{}{ + map[string]interface{}{ + "role": "user", + "content": "Explicit message content", + }, + }, + }, + } + + tasks, err := standard.ParseTasks(data) + + require.NoError(t, err) + require.Len(t, tasks, 1) + + // Description should be saved to field + assert.Equal(t, "Task description for UI", tasks[0].Description) + + // Explicit messages should be preserved (not overwritten by description) + assert.Len(t, tasks[0].Messages, 1) + content, ok := tasks[0].Messages[0].GetContentAsString() + assert.True(t, ok) + assert.Equal(t, "Explicit message content", content) + }) + + t.Run("converts description to message when no messages provided", func(t *testing.T) { + data := []interface{}{ + map[string]interface{}{ + "id": "task-001", + "executor_type": "agent", + "executor_id": "experts.summarizer", + "description": "Only description, no messages", + }, + } + + tasks, err := standard.ParseTasks(data) + + require.NoError(t, err) + require.Len(t, tasks, 1) + + // Description should be saved to field + assert.Equal(t, "Only description, no messages", tasks[0].Description) + + // Description should also be converted to message for execution + assert.Len(t, tasks[0].Messages, 1) + content, ok := tasks[0].Messages[0].GetContentAsString() + assert.True(t, ok) + assert.Equal(t, "Only description, no messages", content) + }) + t.Run("returns error for missing executor_type", func(t *testing.T) { data := []interface{}{ map[string]interface{}{ diff --git a/agent/robot/executor/standard/ui_fields_test.go b/agent/robot/executor/standard/ui_fields_test.go index e2e3febe..0ef74ed2 100644 --- a/agent/robot/executor/standard/ui_fields_test.go +++ b/agent/robot/executor/standard/ui_fields_test.go @@ -103,8 +103,9 @@ func TestGetLocalizedMessage(t *testing.T) { keys := []string{ "preparing", "starting", "scheduled_execution", "event_prefix", "event_triggered", "analyzing_context", - "planning_goals", "breaking_down_tasks", "completed", - "failed_prefix", "task_prefix", + "planning_goals", "breaking_down_tasks", + "generating_delivery", "sending_delivery", "learning_from_exec", + "completed", "failed_prefix", "task_prefix", // Phase names for failure messages "phase_inspiration", "phase_goals", "phase_tasks", "phase_run", "phase_delivery", "phase_learning", @@ -119,8 +120,9 @@ func TestGetLocalizedMessage(t *testing.T) { keys := []string{ "preparing", "starting", "scheduled_execution", "event_prefix", "event_triggered", "analyzing_context", - "planning_goals", "breaking_down_tasks", "completed", - "failed_prefix", "task_prefix", + "planning_goals", "breaking_down_tasks", + "generating_delivery", "sending_delivery", "learning_from_exec", + "completed", "failed_prefix", "task_prefix", // Phase names for failure messages "phase_inspiration", "phase_goals", "phase_tasks", "phase_run", "phase_delivery", "phase_learning", @@ -312,9 +314,26 @@ func TestExtractGoalName(t *testing.T) { // ============================================================================ func TestFormatTaskProgressName(t *testing.T) { - t.Run("formats_with_task_description", func(t *testing.T) { + t.Run("prioritizes_description_field_over_messages", func(t *testing.T) { task := &robottypes.Task{ ID: "task-001", + Description: "High-level task description for UI", + ExecutorType: robottypes.ExecutorAssistant, + ExecutorID: "analyst", + Messages: []agentcontext.Message{ + {Role: agentcontext.RoleUser, Content: "Detailed message content for execution"}, + }, + } + + name := formatTaskProgressName(task, 0, 3, "en") + // Should use Description field, NOT the message content + assert.Equal(t, "Task 1/3: High-level task description for UI", name) + }) + + t.Run("falls_back_to_message_when_no_description", func(t *testing.T) { + task := &robottypes.Task{ + ID: "task-001", + Description: "", // Empty description ExecutorType: robottypes.ExecutorAssistant, ExecutorID: "analyst", Messages: []agentcontext.Message{ @@ -340,14 +359,31 @@ func TestFormatTaskProgressName(t *testing.T) { assert.Equal(t, "任务 2/5: 分析销售数据", name) }) - t.Run("truncates_long_description", func(t *testing.T) { + t.Run("truncates_long_description_field", func(t *testing.T) { longDesc := "This is a very long task description that should be truncated because it exceeds 80 characters which is the maximum length allowed" task := &robottypes.Task{ ID: "task-001", + Description: longDesc, + ExecutorType: robottypes.ExecutorAssistant, + ExecutorID: "analyst", + Messages: []agentcontext.Message{}, + } + + name := formatTaskProgressName(task, 0, 1, "en") + // Should be "Task 1/1: " (11 chars) + truncated content (83 chars max with "...") + assert.Contains(t, name, "...") + assert.LessOrEqual(t, len(name), 100) + }) + + t.Run("truncates_long_message_content", func(t *testing.T) { + longContent := "This is a very long message content that should be truncated because it exceeds 80 characters which is the maximum length allowed" + task := &robottypes.Task{ + ID: "task-001", + Description: "", // No description, will use message ExecutorType: robottypes.ExecutorAssistant, ExecutorID: "analyst", Messages: []agentcontext.Message{ - {Role: agentcontext.RoleUser, Content: longDesc}, + {Role: agentcontext.RoleUser, Content: longContent}, }, } diff --git a/agent/robot/store/execution.go b/agent/robot/store/execution.go index efcaeb15..82a42f90 100644 --- a/agent/robot/store/execution.go +++ b/agent/robot/store/execution.go @@ -317,6 +317,34 @@ func (s *ExecutionStore) UpdateCurrent(ctx context.Context, executionID string, return nil } +// UpdateTasks updates the tasks array with current status +// This should be called after each task completes to persist status changes +func (s *ExecutionStore) UpdateTasks(ctx context.Context, executionID string, tasks []types.Task, current *CurrentState) error { + mod := model.Select(s.modelID) + if mod == nil { + return fmt.Errorf("model %s not found", s.modelID) + } + + updateData := map[string]interface{}{ + "tasks": tasks, + "current": current, + } + + _, err := mod.UpdateWhere( + model.QueryParam{ + Wheres: []model.QueryWhere{ + {Column: "execution_id", Value: executionID}, + }, + }, + updateData, + ) + if err != nil { + return fmt.Errorf("failed to update tasks: %w", err) + } + + return nil +} + // UpdateUIFields updates the UI display fields (name and current_task_name) // These fields are updated by executor at each phase for frontend display func (s *ExecutionStore) UpdateUIFields(ctx context.Context, executionID string, name string, currentTaskName string) error { diff --git a/agent/robot/store/execution_test.go b/agent/robot/store/execution_test.go index 7b0a9134..f6bd9835 100644 --- a/agent/robot/store/execution_test.go +++ b/agent/robot/store/execution_test.go @@ -604,6 +604,161 @@ func TestExecutionStoreUpdateUIFields(t *testing.T) { }) } +// TestExecutionStoreUpdateTasks tests updating tasks array with status +func TestExecutionStoreUpdateTasks(t *testing.T) { + if testing.Short() { + t.Skip("Skipping integration test") + } + + testutils.Prepare(t) + defer testutils.Clean(t) + + cleanupTestExecutions(t) + defer cleanupTestExecutions(t) + + s := store.NewExecutionStore() + ctx := context.Background() + + // Create a base record with initial tasks + startTime := time.Now() + record := &store.ExecutionRecord{ + ExecutionID: "exec_test_tasks_001", + MemberID: "member_tasks_001", + TeamID: "team_tasks_001", + TriggerType: types.TriggerClock, + Status: types.ExecRunning, + Phase: types.PhaseRun, + StartTime: &startTime, + Tasks: []types.Task{ + {ID: "task_001", ExecutorType: types.ExecutorAssistant, Status: types.TaskPending, Order: 0}, + {ID: "task_002", ExecutorType: types.ExecutorProcess, Status: types.TaskPending, Order: 1}, + {ID: "task_003", ExecutorType: types.ExecutorAssistant, Status: types.TaskPending, Order: 2}, + }, + } + err := s.Save(ctx, record) + require.NoError(t, err) + + t.Run("updates_task_status_to_running", func(t *testing.T) { + // Update first task to running + tasks := []types.Task{ + {ID: "task_001", ExecutorType: types.ExecutorAssistant, Status: types.TaskRunning, Order: 0}, + {ID: "task_002", ExecutorType: types.ExecutorProcess, Status: types.TaskPending, Order: 1}, + {ID: "task_003", ExecutorType: types.ExecutorAssistant, Status: types.TaskPending, Order: 2}, + } + current := &store.CurrentState{TaskIndex: 0, Progress: "1/3 tasks"} + + err := s.UpdateTasks(ctx, "exec_test_tasks_001", tasks, current) + require.NoError(t, err) + + saved, err := s.Get(ctx, "exec_test_tasks_001") + require.NoError(t, err) + require.Len(t, saved.Tasks, 3) + + assert.Equal(t, types.TaskRunning, saved.Tasks[0].Status) + assert.Equal(t, types.TaskPending, saved.Tasks[1].Status) + assert.Equal(t, types.TaskPending, saved.Tasks[2].Status) + + assert.NotNil(t, saved.Current) + assert.Equal(t, 0, saved.Current.TaskIndex) + }) + + t.Run("updates_task_status_to_completed", func(t *testing.T) { + // First task completed, second running + tasks := []types.Task{ + {ID: "task_001", ExecutorType: types.ExecutorAssistant, Status: types.TaskCompleted, Order: 0}, + {ID: "task_002", ExecutorType: types.ExecutorProcess, Status: types.TaskRunning, Order: 1}, + {ID: "task_003", ExecutorType: types.ExecutorAssistant, Status: types.TaskPending, Order: 2}, + } + current := &store.CurrentState{TaskIndex: 1, Progress: "2/3 tasks"} + + err := s.UpdateTasks(ctx, "exec_test_tasks_001", tasks, current) + require.NoError(t, err) + + saved, err := s.Get(ctx, "exec_test_tasks_001") + require.NoError(t, err) + + assert.Equal(t, types.TaskCompleted, saved.Tasks[0].Status) + assert.Equal(t, types.TaskRunning, saved.Tasks[1].Status) + assert.Equal(t, types.TaskPending, saved.Tasks[2].Status) + assert.Equal(t, 1, saved.Current.TaskIndex) + }) + + t.Run("updates_task_status_to_failed_with_skipped", func(t *testing.T) { + // Second task failed, third skipped + tasks := []types.Task{ + {ID: "task_001", ExecutorType: types.ExecutorAssistant, Status: types.TaskCompleted, Order: 0}, + {ID: "task_002", ExecutorType: types.ExecutorProcess, Status: types.TaskFailed, Order: 1}, + {ID: "task_003", ExecutorType: types.ExecutorAssistant, Status: types.TaskSkipped, Order: 2}, + } + current := &store.CurrentState{TaskIndex: 1, Progress: "Failed at 2/3"} + + err := s.UpdateTasks(ctx, "exec_test_tasks_001", tasks, current) + require.NoError(t, err) + + saved, err := s.Get(ctx, "exec_test_tasks_001") + require.NoError(t, err) + + assert.Equal(t, types.TaskCompleted, saved.Tasks[0].Status) + assert.Equal(t, types.TaskFailed, saved.Tasks[1].Status) + assert.Equal(t, types.TaskSkipped, saved.Tasks[2].Status) + }) + + t.Run("updates_with_nil_current", func(t *testing.T) { + // All tasks completed, no current + tasks := []types.Task{ + {ID: "task_001", ExecutorType: types.ExecutorAssistant, Status: types.TaskCompleted, Order: 0}, + {ID: "task_002", ExecutorType: types.ExecutorProcess, Status: types.TaskCompleted, Order: 1}, + {ID: "task_003", ExecutorType: types.ExecutorAssistant, Status: types.TaskCompleted, Order: 2}, + } + + err := s.UpdateTasks(ctx, "exec_test_tasks_001", tasks, nil) + require.NoError(t, err) + + saved, err := s.Get(ctx, "exec_test_tasks_001") + require.NoError(t, err) + + assert.Equal(t, types.TaskCompleted, saved.Tasks[0].Status) + assert.Equal(t, types.TaskCompleted, saved.Tasks[1].Status) + assert.Equal(t, types.TaskCompleted, saved.Tasks[2].Status) + }) + + t.Run("preserves_task_description", func(t *testing.T) { + // Create a new record with descriptions + record2 := &store.ExecutionRecord{ + ExecutionID: "exec_test_tasks_002", + MemberID: "member_tasks_002", + TeamID: "team_tasks_002", + TriggerType: types.TriggerHuman, + Status: types.ExecRunning, + Phase: types.PhaseRun, + StartTime: &startTime, + Tasks: []types.Task{ + {ID: "task_d01", Description: "Analyze data", ExecutorType: types.ExecutorAssistant, Status: types.TaskPending, Order: 0}, + {ID: "task_d02", Description: "Generate report", ExecutorType: types.ExecutorAssistant, Status: types.TaskPending, Order: 1}, + }, + } + err := s.Save(ctx, record2) + require.NoError(t, err) + + // Update status preserving description + tasks := []types.Task{ + {ID: "task_d01", Description: "Analyze data", ExecutorType: types.ExecutorAssistant, Status: types.TaskCompleted, Order: 0}, + {ID: "task_d02", Description: "Generate report", ExecutorType: types.ExecutorAssistant, Status: types.TaskRunning, Order: 1}, + } + + err = s.UpdateTasks(ctx, "exec_test_tasks_002", tasks, &store.CurrentState{TaskIndex: 1}) + require.NoError(t, err) + + saved, err := s.Get(ctx, "exec_test_tasks_002") + require.NoError(t, err) + + assert.Equal(t, "Analyze data", saved.Tasks[0].Description) + assert.Equal(t, "Generate report", saved.Tasks[1].Description) + assert.Equal(t, types.TaskCompleted, saved.Tasks[0].Status) + assert.Equal(t, types.TaskRunning, saved.Tasks[1].Status) + }) +} + // TestExecutionStoreDelete tests deleting execution records func TestExecutionStoreDelete(t *testing.T) { if testing.Short() { diff --git a/agent/robot/types/robot.go b/agent/robot/types/robot.go index 57bae6d7..339472f2 100644 --- a/agent/robot/types/robot.go +++ b/agent/robot/types/robot.go @@ -216,10 +216,11 @@ type DeliveryTarget struct { // Task - planned task (structured, for execution) type Task struct { - ID string `json:"id"` - Messages []agentcontext.Message `json:"messages"` // original input (text, images, files) - GoalRef string `json:"goal_ref,omitempty"` // reference to goal (e.g., "Goal 1") - Source TaskSource `json:"source"` // auto | human | event + ID string `json:"id"` + Description string `json:"description,omitempty"` // human-readable task description (for UI display) + Messages []agentcontext.Message `json:"messages"` // original input (text, images, files) + GoalRef string `json:"goal_ref,omitempty"` // reference to goal (e.g., "Goal 1") + Source TaskSource `json:"source"` // auto | human | event // Executor ExecutorType ExecutorType `json:"executor_type"` diff --git a/data/bindata.go b/data/bindata.go index 018d2494..200d1919 100644 --- a/data/bindata.go +++ b/data/bindata.go @@ -346,7 +346,7 @@ func cuiSetupIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "cui/setup/index.html", size: 10, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "cui/setup/index.html", size: 10, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -366,7 +366,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(1769220631, 0)} + info := bindataFileInfo{name: "cui/v0.9/index.html", size: 13, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -386,7 +386,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(1769220631, 0)} + info := bindataFileInfo{name: "cui/v1.0/index.html", size: 49, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -406,7 +406,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(1769220631, 0)} + info := bindataFileInfo{name: "cui/v1.0/layouts__index.async.js", size: 71, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -426,7 +426,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(1769220631, 0)} + info := bindataFileInfo{name: "cui/v1.0/umi.js", size: 71, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -446,7 +446,7 @@ func initEnv() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.env", size: 219, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "init/.env", size: 219, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -466,7 +466,7 @@ func initVscodeSettingsJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/.vscode/settings.json", size: 4666, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "init/.vscode/settings.json", size: 4666, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -486,7 +486,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(1769220631, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/console.d.ts", size: 221, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -506,7 +506,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(1769220631, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/exception.d.ts", size: 738, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -526,7 +526,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(1769220631, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/fs.d.ts", size: 8554, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -546,7 +546,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(1769220631, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/global.d.ts", size: 1759, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -566,7 +566,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(1769220631, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/http.d.ts", size: 6179, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -586,7 +586,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(1769220631, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/io.d.ts", size: 587, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -606,7 +606,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(1769220631, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/log.d.ts", size: 1692, mode: os.FileMode(493), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -626,7 +626,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(1769220631, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/neo.d.ts", size: 3750, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -646,7 +646,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(1769220631, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/process/fs.d.ts", size: 11133, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -666,7 +666,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(1769220631, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/process/http.d.ts", size: 5653, mode: os.FileMode(493), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -686,7 +686,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(1769220631, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/process/model.d.ts", size: 6656, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -706,7 +706,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(1769220631, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/process.d.ts", size: 23165, mode: os.FileMode(493), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -726,7 +726,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(1769220631, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/query.d.ts", size: 6124, mode: os.FileMode(493), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -746,7 +746,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(1769220631, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/store.d.ts", size: 2251, mode: os.FileMode(493), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -766,7 +766,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(1769220631, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/sui.d.ts", size: 1713, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -786,7 +786,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(1769220631, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime/time.d.ts", size: 711, mode: os.FileMode(493), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -806,7 +806,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(1769220631, 0)} + info := bindataFileInfo{name: "init/.vscode/types/runtime.d.ts", size: 424, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -826,7 +826,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(1769220631, 0)} + info := bindataFileInfo{name: "init/.vscode/types/sui.d.ts", size: 8931, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -846,7 +846,7 @@ func initAppYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/app.yao", size: 3115, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "init/app.yao", size: 3115, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -866,7 +866,7 @@ func initDataReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/data/README.md", size: 41, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "init/data/README.md", size: 41, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -886,7 +886,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(1769220631, 0)} + info := bindataFileInfo{name: "init/data/templates/default/__assets/README.md", size: 33, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -906,7 +906,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(1769220631, 0)} + info := bindataFileInfo{name: "init/data/templates/default/__assets/images/icons/app.png", size: 34558, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -926,7 +926,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(1769220631, 0)} + info := bindataFileInfo{name: "init/data/templates/default/__assets/images/logos/logo_color.svg", size: 2909, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -946,7 +946,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(1769220631, 0)} + info := bindataFileInfo{name: "init/data/templates/default/__assets/images/logos/wordmark.svg", size: 3615, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -966,7 +966,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(1769220631, 0)} + info := bindataFileInfo{name: "init/data/templates/default/__data.json", size: 30, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -986,7 +986,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(1769220631, 0)} + info := bindataFileInfo{name: "init/data/templates/default/__document.html", size: 492, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1006,7 +1006,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(1769220631, 0)} + info := bindataFileInfo{name: "init/data/templates/default/index/index.css", size: 2896, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1026,7 +1026,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(1769220631, 0)} + info := bindataFileInfo{name: "init/data/templates/default/index/index.html", size: 2361, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1046,7 +1046,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(1769220631, 0)} + info := bindataFileInfo{name: "init/data/templates/default/index/index.json", size: 31, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1066,7 +1066,7 @@ func initDbReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/db/README.md", size: 84, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "init/db/README.md", size: 84, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1086,7 +1086,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(1769220631, 0)} + info := bindataFileInfo{name: "init/flows/menu.flow.yao", size: 813, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1106,7 +1106,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(1769220631, 0)} + info := bindataFileInfo{name: "init/forms/account.form.yao", size: 1194, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1126,7 +1126,7 @@ func initIconsAppIcns() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/icons/app.icns", size: 67465, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "init/icons/app.icns", size: 67465, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1146,7 +1146,7 @@ func initIconsAppIco() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/icons/app.ico", size: 54993, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "init/icons/app.ico", size: 54993, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1166,7 +1166,7 @@ func initIconsAppPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/icons/app.png", size: 34558, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "init/icons/app.png", size: 34558, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1186,7 +1186,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(1769220631, 0)} + info := bindataFileInfo{name: "init/logins/admin.login.yao", size: 302, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1206,7 +1206,7 @@ func initLogsReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/logs/README.md", size: 28, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "init/logs/README.md", size: 28, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1226,7 +1226,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(1769220631, 0)} + info := bindataFileInfo{name: "init/models/admin/user.mod.yao", size: 6416, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1246,7 +1246,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(1769220631, 0)} + info := bindataFileInfo{name: "init/models/tests/pet.mod.yao", size: 525, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1266,7 +1266,7 @@ func initNeoNeoYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/neo/neo.yml", size: 724, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "init/neo/neo.yml", size: 724, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1286,7 +1286,7 @@ func initPublicReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/public/README.md", size: 108, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "init/public/README.md", size: 108, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1306,7 +1306,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(1769220631, 0)} + info := bindataFileInfo{name: "init/public/assets/README.md", size: 33, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1326,7 +1326,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(1769220631, 0)} + info := bindataFileInfo{name: "init/public/assets/images/icons/app.png", size: 34558, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1346,7 +1346,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(1769220631, 0)} + info := bindataFileInfo{name: "init/public/assets/images/logos/logo_color.svg", size: 2909, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1366,7 +1366,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(1769220631, 0)} + info := bindataFileInfo{name: "init/public/assets/images/logos/wordmark.svg", size: 3615, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1386,7 +1386,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(1769220631, 0)} + info := bindataFileInfo{name: "init/public/assets/libsui.min.js", size: 12569, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1406,7 +1406,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(1769220631, 0)} + info := bindataFileInfo{name: "init/public/assets/libsui.min.js.map", size: 38553, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1426,7 +1426,7 @@ func initPublicIndexCfg() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/public/index.cfg", size: 85, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "init/public/index.cfg", size: 85, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1446,7 +1446,7 @@ func initPublicIndexSui() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/public/index.sui", size: 5682, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "init/public/index.sui", size: 5682, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1466,7 +1466,7 @@ func initScriptsAccountTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/scripts/account.ts", size: 2521, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "init/scripts/account.ts", size: 2521, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1486,7 +1486,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(1769220631, 0)} + info := bindataFileInfo{name: "init/scripts/ai/neo.ts", size: 375, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1506,7 +1506,7 @@ func initScriptsTestsTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/scripts/tests.ts", size: 1044, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "init/scripts/tests.ts", size: 1044, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1526,7 +1526,7 @@ func initScriptsUtilsTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/scripts/utils.ts", size: 1230, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "init/scripts/utils.ts", size: 1230, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1546,7 +1546,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(1769220631, 0)} + info := bindataFileInfo{name: "init/suis/web.sui.yao", size: 675, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1566,7 +1566,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(1769220631, 0)} + info := bindataFileInfo{name: "init/tables/account.tab.yao", size: 5597, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1586,7 +1586,7 @@ func initTsconfigJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "init/tsconfig.json", size: 178, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "init/tsconfig.json", size: 178, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1606,7 +1606,7 @@ func libsuiIndexTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "libsui/index.ts", size: 13047, mode: os.FileMode(420), modTime: time.Unix(1769220632, 0)} + info := bindataFileInfo{name: "libsui/index.ts", size: 13047, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1626,7 +1626,7 @@ func libsuiOpenapiTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "libsui/openapi.ts", size: 22959, mode: os.FileMode(420), modTime: time.Unix(1769220632, 0)} + info := bindataFileInfo{name: "libsui/openapi.ts", size: 22959, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1646,7 +1646,7 @@ func libsuiUtilsTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "libsui/utils.ts", size: 5959, mode: os.FileMode(420), modTime: time.Unix(1769220632, 0)} + info := bindataFileInfo{name: "libsui/utils.ts", size: 5959, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1666,7 +1666,7 @@ func libsuiYaoTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "libsui/yao.ts", size: 4338, mode: os.FileMode(420), modTime: time.Unix(1769220632, 0)} + info := bindataFileInfo{name: "libsui/yao.ts", size: 4338, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1686,7 +1686,7 @@ func publicIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "public/index.html", size: 11, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "public/index.html", size: 11, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1706,7 +1706,7 @@ func uiIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "ui/index.html", size: 11, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "ui/index.html", size: 11, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1726,7 +1726,7 @@ func yaoAssistantsEntityPackageYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/assistants/entity/package.yao", size: 212, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "yao/assistants/entity/package.yao", size: 212, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1746,7 +1746,7 @@ func yaoAssistantsEntityPromptsYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/assistants/entity/prompts.yml", size: 930, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "yao/assistants/entity/prompts.yml", size: 930, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1766,7 +1766,7 @@ func yaoAssistantsKeywordPackageYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/assistants/keyword/package.yao", size: 200, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "yao/assistants/keyword/package.yao", size: 200, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1786,7 +1786,7 @@ func yaoAssistantsKeywordPromptsYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/assistants/keyword/prompts.yml", size: 990, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "yao/assistants/keyword/prompts.yml", size: 990, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1806,7 +1806,7 @@ func yaoAssistantsKeywordSrcIndexTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/assistants/keyword/src/index.ts", size: 4104, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "yao/assistants/keyword/src/index.ts", size: 4104, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1826,7 +1826,7 @@ func yaoAssistantsNeedsearchPackageYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/assistants/needsearch/package.yao", size: 207, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "yao/assistants/needsearch/package.yao", size: 207, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1846,7 +1846,7 @@ func yaoAssistantsNeedsearchPromptsYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/assistants/needsearch/prompts.yml", size: 3092, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "yao/assistants/needsearch/prompts.yml", size: 3092, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1866,7 +1866,7 @@ func yaoAssistantsNeedsearchSrcIndexTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/assistants/needsearch/src/index.ts", size: 2767, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "yao/assistants/needsearch/src/index.ts", size: 2767, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1886,7 +1886,7 @@ func yaoAssistantsPromptPackageYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/assistants/prompt/package.yao", size: 186, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "yao/assistants/prompt/package.yao", size: 186, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1906,7 +1906,7 @@ func yaoAssistantsPromptPromptsYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/assistants/prompt/prompts.yml", size: 621, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "yao/assistants/prompt/prompts.yml", size: 621, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1926,7 +1926,7 @@ func yaoAssistantsQuerydslPackageYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/assistants/querydsl/package.yao", size: 196, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "yao/assistants/querydsl/package.yao", size: 196, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1946,7 +1946,7 @@ func yaoAssistantsQuerydslPromptsAggregationYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/assistants/querydsl/prompts/aggregation.yml", size: 6982, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "yao/assistants/querydsl/prompts/aggregation.yml", size: 6982, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1966,7 +1966,7 @@ func yaoAssistantsQuerydslPromptsComplexYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/assistants/querydsl/prompts/complex.yml", size: 7352, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "yao/assistants/querydsl/prompts/complex.yml", size: 7352, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1986,7 +1986,7 @@ func yaoAssistantsQuerydslPromptsFilterYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/assistants/querydsl/prompts/filter.yml", size: 7087, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "yao/assistants/querydsl/prompts/filter.yml", size: 7087, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2006,7 +2006,7 @@ func yaoAssistantsQuerydslPromptsJoinYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/assistants/querydsl/prompts/join.yml", size: 8167, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "yao/assistants/querydsl/prompts/join.yml", size: 8167, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2026,7 +2026,7 @@ func yaoAssistantsQuerydslPromptsYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/assistants/querydsl/prompts.yml", size: 5836, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "yao/assistants/querydsl/prompts.yml", size: 5836, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2046,7 +2046,7 @@ func yaoAssistantsQuerydslSrcIndexTs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/assistants/querydsl/src/index.ts", size: 1873, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "yao/assistants/querydsl/src/index.ts", size: 1873, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2066,7 +2066,7 @@ func yaoAssistantsRobot_promptPackageYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/assistants/robot_prompt/package.yao", size: 204, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "yao/assistants/robot_prompt/package.yao", size: 204, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2086,7 +2086,7 @@ func yaoAssistantsRobot_promptPromptsYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/assistants/robot_prompt/prompts.yml", size: 2606, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "yao/assistants/robot_prompt/prompts.yml", size: 2606, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2106,7 +2106,7 @@ func yaoAssistantsTitlePackageYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/assistants/title/package.yao", size: 178, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "yao/assistants/title/package.yao", size: 178, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2126,7 +2126,7 @@ func yaoAssistantsTitlePromptsYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/assistants/title/prompts.yml", size: 958, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "yao/assistants/title/prompts.yml", size: 958, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2146,7 +2146,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/data/icons/404.png", size: 9342, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2166,7 +2166,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/data/icons/icon.icns", size: 67465, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2186,7 +2186,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/data/icons/icon.ico", size: 54993, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2206,7 +2206,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/data/icons/icon.png", size: 34558, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2226,7 +2226,7 @@ func yaoDataIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/data/index.html", size: 282, mode: os.FileMode(420), modTime: time.Unix(1769220632, 0)} + info := bindataFileInfo{name: "yao/data/index.html", size: 282, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2246,7 +2246,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/chunking/semantic/en.json", size: 5543, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2266,7 +2266,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/chunking/semantic/zh-cn.json", size: 5446, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2286,7 +2286,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/chunking/structured/en.json", size: 2423, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2306,7 +2306,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/chunking/structured/zh-cn.json", size: 2321, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2326,7 +2326,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/mcp/en.json", size: 4235, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2346,7 +2346,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/mcp/zh-cn.json", size: 4060, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2366,7 +2366,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/ocr/en.json", size: 6631, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2386,7 +2386,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/ocr/zh-cn.json", size: 6501, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2406,7 +2406,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/office/en.json", size: 5476, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2426,7 +2426,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/office/zh-cn.json", size: 5356, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2446,7 +2446,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/utf8/en.json", size: 292, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2466,7 +2466,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/utf8/zh-cn.json", size: 281, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2486,7 +2486,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/video/en.json", size: 6411, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2506,7 +2506,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/video/zh-cn.json", size: 6297, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2526,7 +2526,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/vision/en.json", size: 4085, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2546,7 +2546,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/vision/zh-cn.json", size: 3949, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2566,7 +2566,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/whisper/en.json", size: 4449, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2586,7 +2586,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/converter/whisper/zh-cn.json", size: 4312, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2606,7 +2606,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/embedding/fastembed/en.json", size: 6865, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2626,7 +2626,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/embedding/fastembed/zh-cn.json", size: 6685, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2646,7 +2646,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/embedding/openai/en.json", size: 5636, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2666,7 +2666,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/embedding/openai/zh-cn.json", size: 5463, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2686,7 +2686,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/extraction/openai/en.json", size: 9110, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2706,7 +2706,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/extraction/openai/zh-cn.json", size: 8827, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2726,7 +2726,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/fetcher/http/en.json", size: 5885, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2746,7 +2746,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/fetcher/http/zh-cn.json", size: 5925, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2766,7 +2766,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/fetcher/mcp/en.json", size: 6819, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2786,7 +2786,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/data/kb/providers/fetcher/mcp/zh-cn.json", size: 6611, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2806,7 +2806,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/fields/model.trans.json", size: 14938, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2826,7 +2826,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/langs/en-US.json", size: 66, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2846,7 +2846,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/langs/zh-cn/global.yml", size: 1762, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2866,7 +2866,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/langs/zh-cn/logins/admin.login.yml", size: 94, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2886,7 +2886,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/langs/zh-cn/logins/user.login.yml", size: 90, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2906,7 +2906,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/langs/zh-hk/global.yml", size: 1762, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2926,7 +2926,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/langs/zh-hk/logins/admin.login.yml", size: 94, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2946,7 +2946,7 @@ func yaoLangsZhHkLoginsUserLoginYml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/langs/zh-hk/logins/user.login.yml", size: 90, mode: os.FileMode(420), modTime: time.Unix(1769220632, 0)} + info := bindataFileInfo{name: "yao/langs/zh-hk/logins/user.login.yml", size: 90, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2966,7 +2966,7 @@ func yaoModelsAgentAssistantModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/agent/assistant.mod.yao", size: 6945, mode: os.FileMode(420), modTime: time.Unix(1769220632, 0)} + info := bindataFileInfo{name: "yao/models/agent/assistant.mod.yao", size: 6945, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2986,7 +2986,7 @@ func yaoModelsAgentChatModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/agent/chat.mod.yao", size: 3093, mode: os.FileMode(420), modTime: time.Unix(1769220632, 0)} + info := bindataFileInfo{name: "yao/models/agent/chat.mod.yao", size: 3093, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3006,7 +3006,7 @@ func yaoModelsAgentExecutionModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/agent/execution.mod.yao", size: 5414, mode: os.FileMode(420), modTime: time.Unix(1769220632, 0)} + info := bindataFileInfo{name: "yao/models/agent/execution.mod.yao", size: 5414, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3026,7 +3026,7 @@ func yaoModelsAgentMessageModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/agent/message.mod.yao", size: 3712, mode: os.FileMode(420), modTime: time.Unix(1769220632, 0)} + info := bindataFileInfo{name: "yao/models/agent/message.mod.yao", size: 3712, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3046,7 +3046,7 @@ func yaoModelsAgentResumeModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/agent/resume.mod.yao", size: 3896, mode: os.FileMode(420), modTime: time.Unix(1769220632, 0)} + info := bindataFileInfo{name: "yao/models/agent/resume.mod.yao", size: 3896, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3066,7 +3066,7 @@ func yaoModelsAgentSearchModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/agent/search.mod.yao", size: 3103, mode: os.FileMode(420), modTime: time.Unix(1769220632, 0)} + info := bindataFileInfo{name: "yao/models/agent/search.mod.yao", size: 3103, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3086,7 +3086,7 @@ func yaoModelsAttachmentModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/attachment.mod.yao", size: 4687, mode: os.FileMode(420), modTime: time.Unix(1769220632, 0)} + info := bindataFileInfo{name: "yao/models/attachment.mod.yao", size: 4687, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3106,7 +3106,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/models/audit.mod.yao", size: 5588, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3126,7 +3126,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(1769220631, 0)} + info := bindataFileInfo{name: "yao/models/config.mod.yao", size: 1649, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3146,7 +3146,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/models/dsl.mod.yao", size: 3826, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3166,7 +3166,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/models/invitation.mod.yao", size: 6693, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3186,7 +3186,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/models/job/category.mod.yao", size: 2041, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3206,7 +3206,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/models/job/execution.mod.yao", size: 7201, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3226,7 +3226,7 @@ func yaoModelsJobJobModYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/models/job/job.mod.yao", size: 6429, mode: os.FileMode(420), modTime: time.Unix(1769220632, 0)} + info := bindataFileInfo{name: "yao/models/job/job.mod.yao", size: 6429, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3246,7 +3246,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/models/job/log.mod.yao", size: 4711, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3266,7 +3266,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(1769220631, 0)} + info := bindataFileInfo{name: "yao/models/kb/collection.mod.yao", size: 5390, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3286,7 +3286,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(1769220631, 0)} + info := bindataFileInfo{name: "yao/models/kb/document.mod.yao", size: 9906, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3306,7 +3306,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/models/member.mod.yao", size: 14798, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3326,7 +3326,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/models/role.mod.yao", size: 6434, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3346,7 +3346,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(1769220631, 0)} + info := bindataFileInfo{name: "yao/models/team.mod.yao", size: 15823, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3366,7 +3366,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(1769220631, 0)} + info := bindataFileInfo{name: "yao/models/user/oauth_account.mod.yao", size: 6928, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3386,7 +3386,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(1769220631, 0)} + info := bindataFileInfo{name: "yao/models/user/type.mod.yao", size: 7502, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3406,7 +3406,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(1769220632, 0)} + info := bindataFileInfo{name: "yao/models/user.mod.yao", size: 12335, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3426,7 +3426,7 @@ func yaoReleaseAppYaz() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/release/app.yaz", size: 181682, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "yao/release/app.yaz", size: 181682, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3446,7 +3446,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(1769220631, 0)} + info := bindataFileInfo{name: "yao/stores/agent/cache.lru.yao", size: 301, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3466,7 +3466,7 @@ func yaoStoresAgentMemoryChatXunYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/stores/agent/memory/chat.xun.yao", size: 497, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "yao/stores/agent/memory/chat.xun.yao", size: 497, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3486,7 +3486,7 @@ func yaoStoresAgentMemoryContextXunYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/stores/agent/memory/context.xun.yao", size: 507, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "yao/stores/agent/memory/context.xun.yao", size: 507, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3506,7 +3506,7 @@ func yaoStoresAgentMemoryTeamXunYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/stores/agent/memory/team.xun.yao", size: 483, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "yao/stores/agent/memory/team.xun.yao", size: 483, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3526,7 +3526,7 @@ func yaoStoresAgentMemoryUserXunYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/stores/agent/memory/user.xun.yao", size: 489, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "yao/stores/agent/memory/user.xun.yao", size: 489, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3546,7 +3546,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(1769220631, 0)} + info := bindataFileInfo{name: "yao/stores/cache.lru.yao", size: 285, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3566,7 +3566,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(1769220631, 0)} + info := bindataFileInfo{name: "yao/stores/kb/cache.lru.yao", size: 304, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3586,7 +3586,7 @@ func yaoStoresKbStoreXunYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/stores/kb/store.xun.yao", size: 373, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "yao/stores/kb/store.xun.yao", size: 373, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3606,7 +3606,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(1769220631, 0)} + info := bindataFileInfo{name: "yao/stores/oauth/cache.lru.yao", size: 301, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3626,7 +3626,7 @@ func yaoStoresOauthClientXunYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/stores/oauth/client.xun.yao", size: 377, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "yao/stores/oauth/client.xun.yao", size: 377, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3646,7 +3646,7 @@ func yaoStoresOauthStoreXunYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/stores/oauth/store.xun.yao", size: 401, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "yao/stores/oauth/store.xun.yao", size: 401, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3666,7 +3666,7 @@ func yaoStoresStoreXunYao() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "yao/stores/store.xun.yao", size: 369, mode: os.FileMode(420), modTime: time.Unix(1769220631, 0)} + info := bindataFileInfo{name: "yao/stores/store.xun.yao", size: 369, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3686,7 +3686,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(1769220631, 0)} + info := bindataFileInfo{name: "yao/uploaders/attachment.local.yao", size: 1163, mode: os.FileMode(420), modTime: time.Unix(1769226778, 0)} a := &asset{bytes: bytes, info: info} return a, nil } diff --git a/openapi/agent/robot/TODO.md b/openapi/agent/robot/TODO.md index ae17bcbf..e31b7d6b 100644 --- a/openapi/agent/robot/TODO.md +++ b/openapi/agent/robot/TODO.md @@ -45,6 +45,21 @@ | `current_task_name` | `current_task_name` | ✅ Added | | - | `job_id` | 🗑️ **Dead field, to be removed** | +### Task Fields ✅ Aligned + +| Backend (`types.go`) | Frontend (`types.ts`) | Status | +|---------------------|----------------------|--------| +| `id` | `id` | ✅ | +| `description` | `description` | ✅ Added | +| `goal_ref` | `goal_ref` | ✅ | +| `source` | `source` | ✅ | +| `executor_type` | `executor_type` | ✅ | +| `executor_id` | `executor_id` | ✅ | +| `status` | `status` | ✅ | +| `order` | `order` | ✅ | +| `start_time` | `start_time` | ✅ | +| `end_time` | `end_time` | ✅ | + **Action Items:** - [x] **Backend**: `Execution` struct - add `Name`, `CurrentTaskName` fields (see Improvement Plan below) - [x] **Backend**: `RobotConfig` struct - add `DefaultLocale` field (see Improvement Plan below) @@ -53,6 +68,10 @@ - [x] **Backend**: Executor - update `Name`, `CurrentTaskName` at each phase - [x] **Backend**: Store layer - add `UpdateUIFields()` method - [x] **Backend**: Unit tests for UI fields and i18n (executor/standard/ui_fields_test.go, store/execution_test.go) +- [x] **Backend**: `Task` struct - add `Description` field for human-readable task description +- [x] **Backend**: `ParseTask()` - save description from LLM output to `Task.Description` +- [x] **Frontend**: `Task` type - add `description` field +- [x] **Frontend**: Task list display - use `description` as primary title, fallback to `executor_id` - [ ] **Frontend**: Remove `job_id` field from `types.ts` - [ ] **Frontend**: Remove `job_id` mock data from `mock/data.ts` - [ ] **Frontend**: Use `name` and `current_task_name` directly from API response @@ -606,44 +625,52 @@ var uiMessages = map[string]map[string]string{ - [x] Store - add `UpdateUIFields()` method - [x] Unit tests for UI fields and i18n -**Frontend Cleanup (Pending):** +**Frontend Cleanup (Completed):** - [x] Components already use `exec.id` (no changes needed) -- [ ] Remove `job_id` field from `types.ts` -- [ ] Remove `job_id` from `mock/data.ts` -- [ ] Use `name`/`current_task_name` directly from API response +- [x] Remove `job_id` field from `types.ts` +- [x] ~~Remove `job_id` from `mock/data.ts`~~ (mock kept for reference, not used) +- [x] Use `name`/`current_task_name` directly from API response (string, not `{en, cn}`) -#### 5.2 SDK Types (`types.ts`) ⬜ +#### 5.2 SDK Types (`types.ts`) ✅ -- [ ] `ExecutionFilter` interface -- [ ] `Execution` interface (align with backend `ExecutionResponse`) -- [ ] `ExecutionListResponse` interface -- [ ] `ExecutionControlResponse` interface +- [x] `ExecutionFilter` interface +- [x] `ExecutionResponse` interface (align with backend) +- [x] `ExecutionListResponse` interface +- [x] `ExecutionControlResponse` interface +- [x] `ExecStatus`, `TriggerType`, `Phase` type aliases **Deferred to Phase 5 (SSE):** - [ ] ~~`TriggerRequest` / `TriggerResponse` interfaces~~ - [ ] ~~`InterveneRequest` / `InterveneResponse` interfaces~~ -#### 5.3 SDK Methods (`robots.ts`) ⬜ +#### 5.3 SDK Methods (`robots.ts`) ✅ -- [ ] `ListExecutions(robotId, filter)` -- [ ] `GetExecution(robotId, execId)` -- [ ] `PauseExecution(robotId, execId)` -- [ ] `ResumeExecution(robotId, execId)` -- [ ] `CancelExecution(robotId, execId)` +- [x] `ListExecutions(robotId, filter)` +- [x] `GetExecution(robotId, execId)` +- [x] `PauseExecution(robotId, execId)` +- [x] `ResumeExecution(robotId, execId)` +- [x] `CancelExecution(robotId, execId)` **Deferred to Phase 5 (SSE):** - [ ] ~~`Trigger(robotId, data)`~~ - [ ] ~~`Intervene(robotId, data)`~~ -#### 5.4 Page Integration ⬜ +#### 5.4 Page Integration ✅ -- [ ] ActiveTab: Replace mock with `ListExecutions()` API - - [ ] Filter: `status=running|pending` - - [ ] Polling: 1-minute interval (60000ms) - will switch to SSE in Phase 6 -- [ ] HistoryTab: Replace mock with `ListExecutions()` API - - [ ] Filter: `status` filter, `keyword` search - - [ ] Pagination: page/pagesize - - [ ] Polling: 1-minute interval for list refresh +- [x] ActiveTab: Replace mock with `ListExecutions()` API + - [x] Filter: `status=running|pending` + - [x] Polling: 1-minute interval (60000ms) - will switch to SSE in Phase 6 +- [x] HistoryTab: Replace mock with `ListExecutions()` API + - [x] Filter: `status` filter, `keyword` search + - [x] Pagination: page/pagesize + - [x] Polling: 1-minute interval for list refresh +- [x] Execution Detail: Call `GetExecution()` API + - [x] Display execution phases and outputs + - [x] Display `name` and `current_task_name` from API + - [x] Display `error` field for failed executions + - [x] Execution controls: Pause/Resume/Cancel buttons (call control APIs) + - [x] Auto-refresh while execution is running (5s for running) +- [x] useRobots hook extended with execution methods **Deferred to Phase 5 (SSE):** - [ ] ~~Assign Task Modal: Call `Trigger()` API~~