diff --git a/internal/database/conversation.go b/internal/database/conversation.go index 7a769656..ee3c76e5 100644 --- a/internal/database/conversation.go +++ b/internal/database/conversation.go @@ -577,6 +577,19 @@ func (db *DB) ListUngroupedConversations(limit, offset int, sortBy, projectID st return conversations, rows.Err() } +// GetConversationTitle 获取对话标题(轻量查询,不加载消息) +func (db *DB) GetConversationTitle(id string) (string, error) { + var title string + err := db.QueryRow("SELECT title FROM conversations WHERE id = ?", id).Scan(&title) + if err != nil { + if err == sql.ErrNoRows { + return "", fmt.Errorf("对话不存在") + } + return "", fmt.Errorf("查询对话标题失败: %w", err) + } + return title, nil +} + // UpdateConversationTitle 更新对话标题 func (db *DB) UpdateConversationTitle(id, title string) error { // 注意:不更新 updated_at,因为重命名操作不应该改变对话的更新时间 diff --git a/internal/handler/agent.go b/internal/handler/agent.go index a3893178..1222d69e 100644 --- a/internal/handler/agent.go +++ b/internal/handler/agent.go @@ -1489,17 +1489,51 @@ func (h *AgentHandler) SubscribeAgentTaskEvents(c *gin.Context) { } } +// enrichAgentTasksWithConversationTitles 为任务列表附加当前会话标题(供顶栏/任务页展示,重命名后自动同步) +func (h *AgentHandler) enrichAgentTasksWithConversationTitles(tasks []*AgentTask) { + if h == nil || h.db == nil { + return + } + for _, task := range tasks { + if task == nil || strings.TrimSpace(task.ConversationID) == "" { + continue + } + if title, err := h.db.GetConversationTitle(task.ConversationID); err == nil { + task.Title = strings.TrimSpace(title) + } + } +} + +// enrichCompletedTasksWithConversationTitles 为已完成任务附加当前会话标题 +func (h *AgentHandler) enrichCompletedTasksWithConversationTitles(tasks []*CompletedTask) { + if h == nil || h.db == nil { + return + } + for _, task := range tasks { + if task == nil || strings.TrimSpace(task.ConversationID) == "" { + continue + } + if title, err := h.db.GetConversationTitle(task.ConversationID); err == nil { + task.Title = strings.TrimSpace(title) + } + } +} + // ListAgentTasks 列出所有运行中的任务 func (h *AgentHandler) ListAgentTasks(c *gin.Context) { + tasks := h.tasks.GetActiveTasks() + h.enrichAgentTasksWithConversationTitles(tasks) c.JSON(http.StatusOK, gin.H{ - "tasks": h.tasks.GetActiveTasks(), + "tasks": tasks, }) } // ListCompletedTasks 列出最近完成的任务历史 func (h *AgentHandler) ListCompletedTasks(c *gin.Context) { + tasks := h.tasks.GetCompletedTasks() + h.enrichCompletedTasksWithConversationTitles(tasks) c.JSON(http.StatusOK, gin.H{ - "tasks": h.tasks.GetCompletedTasks(), + "tasks": tasks, }) } diff --git a/internal/handler/task_manager.go b/internal/handler/task_manager.go index bfaea31b..4b19b40f 100644 --- a/internal/handler/task_manager.go +++ b/internal/handler/task_manager.go @@ -26,6 +26,7 @@ func shouldPersistEinoAgentTraceAfterRunError(baseCtx context.Context) bool { // AgentTask 描述正在运行的Agent任务 type AgentTask struct { ConversationID string `json:"conversationId"` + Title string `json:"title,omitempty"` Message string `json:"message,omitempty"` StartedAt time.Time `json:"startedAt"` Status string `json:"status"` @@ -233,6 +234,7 @@ func (m *AgentTaskManager) ActiveMCPExecutionID(conversationID string) string { // CompletedTask 已完成的任务(用于历史记录) type CompletedTask struct { ConversationID string `json:"conversationId"` + Title string `json:"title,omitempty"` Message string `json:"message,omitempty"` StartedAt time.Time `json:"startedAt"` CompletedAt time.Time `json:"completedAt"`