feat(controller): 工具仓库、Skills 录入、多轮追问与终端运行日志
- 插件/MCP 改为通用工具仓库:内置、HTTP MCP、本机命令(stdio)三类工具,可增删改、 按 Agent 分配;定义变更自动提升下发版本并重发,删除即回收分配并通知 Agent 清空。 - 旧 desktop-filesystem 降级为仓库中的一个内置条目;本机预设工具改为总控只展示、 Agent 默认启用,任务执行来源新增 builtin(审计 task.builtin_tool_execution)。 - Skills 补齐录入闭环:新建或按名称覆盖更新,并可从旧版技能目录(SKILL.md + skill.json) 批量导入;同名更新保持标识不变并自动重新应用,旧包入口脚本只提示不执行。 - 单独指派支持基于某条已完成任务的多轮追问:任务内容框仍下发无上下文的一次性任务, 追问时由总控组装历史(仅成功轮次、默认最近 50 轮 / 约 6 万字符),会话按 Agent 隔离; 执行动态把同一会话合并为一条记录,任务详情弹窗底部提供继续对话输入框。 - 任务详情支持运行中观测:打开期间每 2 秒刷新,终端风格输出全部事件并自动滚动; progress 事件不改变任务状态且顺延无进展超时,避免正在执行工具的任务被误判超时。 - 修复 build.ps1 缺 UTF-8 BOM 导致 build.bat 在 PowerShell 5.1 下语法报错。
This commit is contained in:
@@ -62,7 +62,7 @@ type AgentOperationalDetail struct {
|
||||
Failures []DeploymentFailure `json:"failures"`
|
||||
}
|
||||
|
||||
const agentDirectoryBaseSQL = `WITH skill_summary AS (
|
||||
var agentDirectoryBaseSQL = `WITH skill_summary AS (
|
||||
SELECT agent_id, COUNT(*) AS total,
|
||||
SUM(CASE WHEN apply_status = 'applied' THEN 1 ELSE 0 END) AS applied,
|
||||
SUM(CASE WHEN apply_status = 'failed' THEN 1 ELSE 0 END) AS failed,
|
||||
@@ -82,13 +82,14 @@ const agentDirectoryBaseSQL = `WITH skill_summary AS (
|
||||
WHEN COALESCE(s.sent, 0) > 0 THEN 'sent'
|
||||
ELSE 'applied' END AS skill_status,
|
||||
COALESCE(s.failure, '') AS skill_failure,
|
||||
COALESCE(m.apply_status, '未启用') AS mcp_status, COALESCE(m.last_error, '') AS mcp_failure,
|
||||
MAX(COALESCE(l.updated_at, ''), COALESCE(m.updated_at, ''), COALESCE(s.updated_at, '')) AS last_deployment_at
|
||||
` + mcpStatusExpression("a.agent_id") + ` AS mcp_status,
|
||||
` + mcpErrorExpression("a.agent_id") + ` AS mcp_failure,
|
||||
COALESCE((SELECT MAX(updated_at) FROM agent_mcp_assignments m WHERE m.agent_id = a.agent_id), '') AS mcp_updated_at,
|
||||
MAX(COALESCE(l.updated_at, ''), COALESCE((SELECT MAX(updated_at) FROM agent_mcp_assignments m WHERE m.agent_id = a.agent_id), ''), COALESCE(s.updated_at, '')) AS last_deployment_at
|
||||
FROM managed_agents a
|
||||
LEFT JOIN agent_llm_assignments l ON l.agent_id = a.agent_id
|
||||
LEFT JOIN llm_profiles p ON p.profile_id = l.profile_id
|
||||
LEFT JOIN skill_summary s ON s.agent_id = a.agent_id
|
||||
LEFT JOIN agent_mcp_assignments m ON m.agent_id = a.agent_id AND m.tool_id = 'desktop-filesystem'
|
||||
)
|
||||
`
|
||||
|
||||
@@ -220,7 +221,7 @@ func (c *ControlPlane) AgentOperationalDetails(agentID string) (AgentOperational
|
||||
}
|
||||
|
||||
func (c *ControlPlane) recentTasksForAgent(agentID string, maximum int) ([]Task, error) {
|
||||
rows, err := c.db.Query("SELECT task_id, agent_id, COALESCE(NULLIF(agent_name, ''), '未知 Agent'), instruction, status, created_at, COALESCE(started_at, ''), COALESCE(finished_at, ''), COALESCE(deadline_at, ''), COALESCE(attempt, 1), COALESCE(retry_of, ''), COALESCE(output, ''), COALESCE(error, ''), COALESCE(execution_source, '') FROM task_runs WHERE agent_id = ? ORDER BY created_at DESC LIMIT ?", agentID, maximum)
|
||||
rows, err := c.db.Query("SELECT task_id, agent_id, COALESCE(NULLIF(agent_name, ''), '未知 Agent'), instruction, status, created_at, COALESCE(started_at, ''), COALESCE(finished_at, ''), COALESCE(deadline_at, ''), COALESCE(attempt, 1), COALESCE(retry_of, ''), COALESCE(output, ''), COALESCE(error, ''), COALESCE(execution_source, ''), COALESCE(session_id, '') FROM task_runs WHERE agent_id = ? ORDER BY created_at DESC LIMIT ?", agentID, maximum)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("无法读取 Agent 最近任务: %w", err)
|
||||
}
|
||||
@@ -228,7 +229,7 @@ func (c *ControlPlane) recentTasksForAgent(agentID string, maximum int) ([]Task,
|
||||
tasks := make([]Task, 0)
|
||||
for rows.Next() {
|
||||
var task Task
|
||||
if err := rows.Scan(&task.ID, &task.AgentID, &task.AgentName, &task.Instruction, &task.Status, &task.CreatedAt, &task.StartedAt, &task.FinishedAt, &task.DeadlineAt, &task.Attempt, &task.RetryOf, &task.Output, &task.Error, &task.Execution); err != nil {
|
||||
if err := rows.Scan(&task.ID, &task.AgentID, &task.AgentName, &task.Instruction, &task.Status, &task.CreatedAt, &task.StartedAt, &task.FinishedAt, &task.DeadlineAt, &task.Attempt, &task.RetryOf, &task.Output, &task.Error, &task.Execution, &task.SessionID); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
tasks = append(tasks, task)
|
||||
|
||||
Reference in New Issue
Block a user