three-dim-refactor.md
11.9 KB
四维配置重构方案
1. 问题:当前四维架构的配置膨胀
当前架构的四维是 实现者视角(协议 / 传输 / 生命周期 / 身份),导致:
- 10 个 launcher(kimi-local / claude-local / kimi-docker / claude-docker / kimi-bridge / ...)
- 4 个 cliBackend(claude-cli / gemini-cli / kimi-cli / codex-cli)
- 20 个 agent(同一个 coder prompt 因为 launcher × 部署方式排列组合出 7 个变体)
根本原因:客户端 × 部署方式被混在了 launcher 一个维度里,没有真正正交。
2. 目标:用户视角的四维配置
| 维度 | 用户问题 | 配置字段 | 配置值 |
|---|---|---|---|
| 角色 | 我是什么类型? | type | executor / validator / master / gateway / orchestrator |
| 能力 | 我会什么? | prompt | ./agents/coder.md / ./agents/verifier.md / ... |
| 客户端 | 用什么 AI? | client | kimi / claude / gemini / codex |
| 部署 | 在哪跑? | deploy | local / docker / remote |
加一个可选维度:
| 维度 | 说明 | 配置值 |
|---|---|---|
| 模式 | 通信方式 | cli(简单调用)/ acp(长连接双向流) |
推断规则(系统内部,用户不需要配)
protocol = client.acp_protocol (claude → claude-stream, 其余 → acp)
transport = deploy === 'local' ? 'pipe' : 'websocket'
launcher = { local: 'process', docker: 'docker', remote: 'none' }[deploy]
重构后的 Agent 定义
// 之前 — 7 个 agent 做同一件事
{
"kimi-coder": { "type": "executor", "protocol": "acp", "transport": "pipe", "launcher": "kimi-local", "prompt": "./agents/coder.md" },
"claude-coder": { "type": "executor", "protocol": "claude-stream", "transport": "pipe", "launcher": "claude-local", "prompt": "./agents/coder.md" },
"kimi-docker-coder": { "type": "executor", "protocol": "acp", "transport": "websocket", "launcher": "kimi-docker", "prompt": "./agents/coder.md" },
"claude-engine-coder": { "type": "executor", "cliBackend": "claude-cli", "prompt": "./agents/coder.md" },
"kimi-engine-coder": { "type": "executor", "cliBackend": "kimi-cli", "prompt": "./agents/coder.md" },
// ... 还有更多变体
}
// 之后 — 1 个 agent,想换 AI 或部署方式只改一个字段
{
"coder": {
"type": "executor",
"client": "kimi", // 换成 "claude" 就用 Claude
"deploy": "local", // 换成 "docker" 就跑容器
"mode": "cli", // 换成 "acp" 就走长连接
"prompt": "./agents/coder.md",
"description": "程序员"
}
}
3. 新 DB Schema
3.1 删除旧表(破坏性)
DROP TABLE IF EXISTS agent_launchers CASCADE;
DROP TABLE IF EXISTS agent_cli_backends CASCADE;
3.2 新建 agent_clients 表
一个 client = 一个 AI 工具(kimi / claude / gemini / codex)的全部运行配置。
CREATE TABLE agent_clients (
name VARCHAR(100) PRIMARY KEY, -- 'kimi', 'claude', 'gemini', 'codex'
command VARCHAR(200) NOT NULL, -- CLI 命令: 'kimi', 'claude', 'gemini', 'codex'
-- ═══ ACP 模式配置(mode=acp 时使用)═══
acp_args JSONB DEFAULT '[]', -- ['acp'] / ['--input-format', 'stream-json', ...]
acp_protocol VARCHAR(30) DEFAULT 'acp', -- 推断用: 'acp' | 'claude-stream'
-- ═══ CLI 模式配置(mode=cli 时使用)═══
cli_args JSONB DEFAULT '[]', -- ['--print', '--output-format', 'json', ...]
cli_resume_args JSONB, -- 恢复执行参数
cli_input VARCHAR(20) DEFAULT 'arg',
cli_output VARCHAR(20) DEFAULT 'text',
cli_resume_output VARCHAR(20),
cli_model_arg VARCHAR(50),
cli_session_id_fields JSONB,
cli_system_prompt_arg VARCHAR(50),
cli_system_prompt_when VARCHAR(20),
cli_session_mode VARCHAR(20) DEFAULT 'none',
cli_image_arg VARCHAR(50),
cli_image_mode VARCHAR(20),
-- ═══ Docker 部署配置(deploy=docker 时使用)═══
docker_image VARCHAR(200),
docker_port INTEGER DEFAULT 9001,
docker_env_file VARCHAR(500),
docker_volumes JSONB DEFAULT '[]',
-- ═══ Remote 部署配置(deploy=remote 时使用)═══
remote_url VARCHAR(500),
-- ═══ 通用 ═══
reliability JSONB DEFAULT '{}',
is_builtin BOOLEAN DEFAULT false,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
3.3 修改 agent_definitions
-- 删除旧列
ALTER TABLE agent_definitions DROP COLUMN IF EXISTS protocol;
ALTER TABLE agent_definitions DROP COLUMN IF EXISTS transport;
ALTER TABLE agent_definitions DROP COLUMN IF EXISTS launcher;
ALTER TABLE agent_definitions DROP COLUMN IF EXISTS cli_backend;
-- 新增列
ALTER TABLE agent_definitions ADD COLUMN IF NOT EXISTS client VARCHAR(100) REFERENCES agent_clients(name);
ALTER TABLE agent_definitions ADD COLUMN IF NOT EXISTS deploy VARCHAR(20) DEFAULT 'local'
CHECK (deploy IN ('local', 'docker', 'remote'));
ALTER TABLE agent_definitions ADD COLUMN IF NOT EXISTS mode VARCHAR(10) DEFAULT 'cli'
CHECK (mode IN ('cli', 'acp'));
-- 约束:非 orchestrator 必须有 client
ALTER TABLE agent_definitions DROP CONSTRAINT IF EXISTS agent_exec_mode;
ALTER TABLE agent_definitions ADD CONSTRAINT agent_client_required
CHECK (client IS NOT NULL OR type = 'orchestrator');
3.4 Seed 数据
4 个 Client:
| name | command | acp_protocol | 关键 CLI 配置 |
|---|---|---|---|
| kimi | kimi | acp | --print --yolo, sessionMode=none |
| claude | claude | claude-stream | --print --output-format json --dangerously-skip-permissions, sessionMode=always |
| gemini | gemini | acp | -p, sessionMode=none |
| codex | codex | acp | exec --json --full-auto, sessionMode=existing |
6 个 Agent:
| name | type | client | deploy | mode | prompt |
|---|---|---|---|---|---|
| gateway | gateway | kimi | local | acp | ./agents/gateway.md |
| master | master | kimi | local | acp | ./agents/master.md |
| coder | executor | kimi | local | cli | ./agents/coder.md |
| verifier | validator | kimi | local | cli | ./agents/verifier.md |
| writer | executor | kimi | local | cli | ./agents/writer.md |
| editor | validator | kimi | local | cli | ./agents/editor.md |
用户想用 Claude?→ 改 coder 的 client 为 "claude"。想跑 Docker?→ 改 deploy 为 "docker"。不需要新建 Agent。
4. 代码改动清单
Phase 1: DB Schema 演进
- [x] 重写
db/schema-agents.sql— DROP 旧表 + CREATE agent_clients + ALTER agent_definitions - [x] 重写
db/seed-agents.js— 4 client + 9 agent
Phase 2: 推断引擎
- [x] 新建
server/src/core/runtime-resolver.jsresolve(agent, client)→{ protocol, transport, launcherType, command, args }- 纯函数,无状态,无 DB 依赖
Phase 3: 数据层重写
- [x]
services/agent-queries.js- 删除全部 Launcher CRUD(6 个方法)
- 删除全部 CliBackend CRUD(6 个方法)
- 新增 Client CRUD(getClient / listClients / createClient / updateClient / deleteClient)
- 修改 getAgent — 返回
{ agent, client } - 修改 getFullConfig — 输出
{ agents, clients, agentGroups, settings } - 删除
_rowToLauncherConfig/_rowToCliBackendConfig - 新增
_rowToClientConfig
Phase 4: Registry 重写
- [x]
src/core/registry/index.js- 删除
listLaunchers()/listCliBackends()/listCli() - 新增
listClients()/getClient(name) getAgent()返回{ agent, client }而非{ agent, launcher, cliBackend }getFullConfig()输出新结构
- 删除
Phase 5: agent-manager.js 重构
- [x]
getAgentConfig()— 返回{ agent, client } - [x]
callAgent()— 使用runtime-resolver推断,2 分支替代 4 分支:if (mode === 'cli') → _runViaCliBackend(agent, client, ..., resolved) if (mode === 'acp') → runAcpAgent(agent, client, ..., resolved) - [x]
_runOneshotWithGuard不再被主路径调用(保留但不引用) - [x]
agent-config-builder.js— applyAgentOverrides 改为切 client 而非 cliBackend
Phase 6: API Routes
- [x]
routes/agents.js- 删除
/backends全部路由 - 新增
/clientsCRUD 路由 /clients/health— 对每个 client 检测which <command>- Agent 创建/更新接口改为
{ client, deploy, mode }字段
- 删除
Phase 7: 前端
- [x]
api/index.js- 删除 Backend 相关函数
- 新增 Client 相关函数
- [x]
AgentFormDrawer.vue— 表单改为 Client 下拉 + Deploy 下拉 + Mode 选择 - [x]
BackendPanel.vue→ 新建ClientPanel.vue,展示 4 个 client + 健康状态 - [x]
AgentRegistry.vue— 统计数据更新、Tab 从 backends → clients
Phase 8: 测试
- [x] 重写
test/registry-db.test.js - [x] 重写
test/api-agents-crud.test.js - [x] 重写
test/registry-integration.test.js - [x] 重写
test/e2e-registry-full.test.js - [x] 重写
test/e2e-orchestrator-dynamic.test.js - [x] 前端 vite build 通过 ✅
Phase 9: 文档更新
- [x] 更新
docs/agent-network/04-四维正交架构.md→ 新四维配置架构(角色 × 能力 × 客户端 × 部署) - [x] 更新迁移文档
web/docs/agent-registry-db-migration.md→ 添加重构状态说明
5. 前端 UI 效果
Agent 编辑表单(重构后)
┌─────────────────────────────────────┐
│ 新建 Agent │
├─────────────────────────────────────┤
│ 名称 [ coder ] │
│ 类型 [ executor ▼ ] │
│ 客户端 [ kimi ▼ ] │ ← 只有 4 个选项
│ 部署方式 [ local ▼ ] │ ← 只有 3 个选项
│ 模式 [ cli ▼ ] │ ← cli / acp
│ Prompt [ ./agents/coder.md ] │
│ 描述 [ 程序员 ] │
├─────────────────────────────────────┤
│ [取消] [创建] │
└─────────────────────────────────────┘
之前 vs 之后
| 指标 | 之前 | 之后 |
|---|---|---|
| Launcher 数量 | 10 | 0(概念删除) |
| CLI Backend 数量 | 4 | 0(概念删除) |
| Client 数量 | — | 4 |
| Agent 数量 | 20 | 6 |
| 用户需要配的字段 | protocol + transport + launcher 或 cliBackend | client + deploy + mode |
| 换一个 AI 的操作 | 新建一个 Agent | 改一个字段 |