From b3a39ad93d89b3edd6b42c0419336b3d0e789442 Mon Sep 17 00:00:00 2001 From: Acbox Liu Date: Sun, 22 Mar 2026 19:03:28 +0800 Subject: [PATCH] refactor: replace persistent subagents with ephemeral spawn tool (#280) * refactor: replace persistent subagents with ephemeral spawn tool (#subagent) - Drop subagents table, remove all persistent subagent infrastructure - Add 'subagent' session type with parent_session_id on bot_sessions - Rewrite subagent tool as single 'spawn' tool with parallel execution - Create system_subagent.md prompt, add _subagent.md include for chat - Limit subagent tools to file, exec, web_search, web_fetch only - Merge subagent token usage into parent chat session in reporting - Remove frontend subagent management page, update chat UI for spawn - Fix UTF-8 truncation in session title, fix query not passed to agent * refactor: remove history message page --- apps/web/src/i18n/locales/en.json | 27 +- apps/web/src/i18n/locales/zh.json | 27 +- .../src/pages/bots/components/bot-history.vue | 217 ------- .../pages/bots/components/bot-subagents.vue | 460 ------------- apps/web/src/pages/bots/detail.vue | 4 - .../pages/chat/components/session-sidebar.vue | 3 + .../pages/chat/components/tool-call-block.vue | 6 +- .../chat/components/tool-call-subagent.vue | 134 ++-- cmd/agent/main.go | 19 +- cmd/memoh/serve.go | 21 +- db/migrations/0001_init.up.sql | 23 +- db/migrations/0012_subagent_usage.down.sql | 5 +- db/migrations/0012_subagent_usage.up.sql | 5 +- ...drop_subagents_add_parent_session.down.sql | 32 + ...3_drop_subagents_add_parent_session.up.sql | 15 + db/queries/sessions.sql | 12 +- db/queries/subagents.sql | 58 -- db/queries/token_usage.sql | 6 +- internal/agent/agent.go | 1 + internal/agent/prompt.go | 15 +- internal/agent/prompts/_subagent.md | 11 +- internal/agent/prompts/subagent.md | 5 - internal/agent/prompts/system_subagent.md | 20 + internal/agent/spawn_adapter.go | 81 +++ internal/agent/tools/browser.go | 2 +- internal/agent/tools/contacts.go | 2 +- internal/agent/tools/email.go | 3 + internal/agent/tools/federation.go | 2 +- internal/agent/tools/history.go | 3 + internal/agent/tools/memory.go | 3 + internal/agent/tools/message.go | 3 + internal/agent/tools/schedule.go | 2 +- internal/agent/tools/subagent.go | 483 ++++++++------ internal/agent/tools/tts.go | 2 +- internal/agent/tools/types.go | 1 + internal/agent/types.go | 1 + internal/command/commands.go | 1 - internal/command/handler.go | 4 - internal/command/handler_test.go | 28 +- internal/command/subagent.go | 94 --- internal/conversation/flow/resolver.go | 1 + internal/db/sqlc/models.go | 36 +- internal/db/sqlc/sessions.sql.go | 77 ++- internal/db/sqlc/subagents.sql.go | 307 --------- internal/db/sqlc/token_usage.sql.go | 6 +- internal/handlers/subagent.go | 438 ------------- internal/session/service.go | 56 +- internal/subagent/service.go | 402 ------------ internal/subagent/types.go | 58 -- packages/sdk/src/@pinia/colada.gen.ts | 176 +---- packages/sdk/src/index.ts | 4 +- packages/sdk/src/sdk.gen.ts | 107 +-- packages/sdk/src/types.gen.ts | 451 +------------ spec/docs.go | 614 +----------------- spec/swagger.json | 614 +----------------- spec/swagger.yaml | 408 +----------- 56 files changed, 716 insertions(+), 4880 deletions(-) delete mode 100644 apps/web/src/pages/bots/components/bot-history.vue delete mode 100644 apps/web/src/pages/bots/components/bot-subagents.vue create mode 100644 db/migrations/0043_drop_subagents_add_parent_session.down.sql create mode 100644 db/migrations/0043_drop_subagents_add_parent_session.up.sql delete mode 100644 db/queries/subagents.sql delete mode 100644 internal/agent/prompts/subagent.md create mode 100644 internal/agent/prompts/system_subagent.md create mode 100644 internal/agent/spawn_adapter.go delete mode 100644 internal/command/subagent.go delete mode 100644 internal/db/sqlc/subagents.sql.go delete mode 100644 internal/handlers/subagent.go delete mode 100644 internal/subagent/service.go delete mode 100644 internal/subagent/types.go diff --git a/apps/web/src/i18n/locales/en.json b/apps/web/src/i18n/locales/en.json index f6cc2560..26cc6e28 100644 --- a/apps/web/src/i18n/locales/en.json +++ b/apps/web/src/i18n/locales/en.json @@ -151,7 +151,7 @@ "toolContactsCount": "{count} contacts", "toolEmailCount": "{count} emails", "toolEmailAccounts": "{count} accounts", - "toolSubagentCount": "{count} subagents", + "toolSpawnCount": "{count} tasks", "unknownUser": "{platform} User", "files": "Files", "sessions": "Sessions", @@ -163,7 +163,8 @@ "untitledSession": "Untitled Session", "noSessions": "No sessions yet", "sessionTypeHeartbeat": "Heartbeat", - "sessionTypeSchedule": "Scheduled Task" + "sessionTypeSchedule": "Scheduled Task", + "sessionTypeSubagent": "Subagent" }, "models": { "title": "Models", @@ -565,7 +566,6 @@ "channels": "Platforms", "container": "Container", "mcp": "MCP", - "subagents": "Subagents", "heartbeat": "Heartbeat", "compaction": "Compaction", "schedule": "Schedule", @@ -1017,27 +1017,6 @@ "filterAll": "All", "expandContent": "Expand", "collapseContent": "Collapse" - }, - "subagents": { - "title": "Subagents", - "subtitle": "Manage autonomous subagents for this bot.", - "add": "Create Subagent", - "emptyTitle": "No Subagents", - "emptyDescription": "Click above to create a subagent", - "description": "Description", - "descriptionPlaceholder": "Enter subagent description", - "deleteConfirm": "Are you sure you want to delete this subagent?", - "deleteSuccess": "Subagent deleted", - "deleteFailed": "Failed to delete subagent", - "saveSuccess": "Subagent saved", - "saveFailed": "Failed to save subagent", - "loadFailed": "Failed to load subagents", - "viewContext": "View Context", - "contextTitle": "Subagent Context", - "contextEmpty": "No context messages", - "messagesCount": "{count} messages", - "usage": "Usage", - "skills": "Skills" } }, "usage": { diff --git a/apps/web/src/i18n/locales/zh.json b/apps/web/src/i18n/locales/zh.json index 6c56914c..95584c98 100644 --- a/apps/web/src/i18n/locales/zh.json +++ b/apps/web/src/i18n/locales/zh.json @@ -147,7 +147,7 @@ "toolContactsCount": "{count} 个联系人", "toolEmailCount": "{count} 封邮件", "toolEmailAccounts": "{count} 个账户", - "toolSubagentCount": "{count} 个子代理", + "toolSpawnCount": "{count} 个任务", "unknownUser": "{platform}用户", "files": "文件管理", "sessions": "会话", @@ -159,7 +159,8 @@ "untitledSession": "未命名会话", "noSessions": "暂无会话", "sessionTypeHeartbeat": "心跳", - "sessionTypeSchedule": "定时任务" + "sessionTypeSchedule": "定时任务", + "sessionTypeSubagent": "子智能体" }, "models": { "title": "模型", @@ -561,7 +562,6 @@ "channels": "平台", "container": "容器", "mcp": "MCP", - "subagents": "子智能体", "heartbeat": "心跳", "compaction": "上下文压缩", "schedule": "定时任务", @@ -1013,27 +1013,6 @@ "filterAll": "全部", "expandContent": "展开", "collapseContent": "收起" - }, - "subagents": { - "title": "子智能体", - "subtitle": "管理当前 Bot 的自治子智能体。", - "add": "创建子智能体", - "emptyTitle": "暂无子智能体", - "emptyDescription": "点击上方按钮创建子智能体", - "description": "描述", - "descriptionPlaceholder": "输入子智能体描述", - "deleteConfirm": "确定要删除这个子智能体吗?", - "deleteSuccess": "子智能体已删除", - "deleteFailed": "删除子智能体失败", - "saveSuccess": "子智能体已保存", - "saveFailed": "保存子智能体失败", - "loadFailed": "加载子智能体失败", - "viewContext": "查看上下文", - "contextTitle": "子智能体上下文", - "contextEmpty": "暂无上下文消息", - "messagesCount": "{count} 条消息", - "usage": "用量", - "skills": "技能" } }, "usage": { diff --git a/apps/web/src/pages/bots/components/bot-history.vue b/apps/web/src/pages/bots/components/bot-history.vue deleted file mode 100644 index 1bf3310d..00000000 --- a/apps/web/src/pages/bots/components/bot-history.vue +++ /dev/null @@ -1,217 +0,0 @@ - - - diff --git a/apps/web/src/pages/bots/components/bot-subagents.vue b/apps/web/src/pages/bots/components/bot-subagents.vue deleted file mode 100644 index 0e47fd80..00000000 --- a/apps/web/src/pages/bots/components/bot-subagents.vue +++ /dev/null @@ -1,460 +0,0 @@ -