diff --git a/.gitignore b/.gitignore index f03bc66b5..2a4224105 100644 --- a/.gitignore +++ b/.gitignore @@ -15,7 +15,7 @@ src/utils/vendor/ .claude/ .codex/ .omx/ - +.docs/task/ # Binary / screenshot files (root only) /*.png *.bmp diff --git a/README.md b/README.md index 83703c018..6a9ba02ee 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ | 特性 | 说明 | 文档 | |------|------|------| | **Claude 群控技术** | Pipe IPC 多实例协作:同机 main/sub 自动编排 + LAN 跨机器零配置发现与通讯,`/pipes` 选择面板 + `Shift+↓` 交互 + 消息广播路由 | [Pipe IPC](https://ccb.agent-aura.top/docs/features/pipes-and-lan) / [LAN](https://ccb.agent-aura.top/docs/features/lan-pipes) | +| ACP 协议一等一支持 | 支持接入 Zed、Cursor 等 IDE,支持会话恢复、Skills、权限桥接 | [文档](https://ccb.agent-aura.top/docs/features/acp-zed) | | Remote Control 私有部署 | Docker 自托管 RCS + Web UI | [文档](https://ccb.agent-aura.top/docs/features/remote-control-self-hosting) | | /dream 记忆整理 | 自动整理和优化记忆文件 | [文档](https://ccb.agent-aura.top/docs/features/auto-dream) | | Web Search | 内置网页搜索工具 | [文档](https://ccb.agent-aura.top/docs/features/web-browser-tool) | diff --git a/build.ts b/build.ts index 11b859330..0ba7076a7 100644 --- a/build.ts +++ b/build.ts @@ -30,6 +30,8 @@ const DEFAULT_BUILD_FEATURES = [ 'ULTRAPLAN', // P2: daemon + remote control server 'DAEMON', + // ACP (Agent Client Protocol) agent mode + 'ACP', // PR-package restored features 'WORKFLOW_SCRIPTS', 'HISTORY_SNIP', @@ -40,6 +42,8 @@ const DEFAULT_BUILD_FEATURES = [ 'KAIROS', 'COORDINATOR_MODE', 'LAN_PIPES', + 'BG_SESSIONS', + 'TEMPLATES', // 'REVIEW_ARTIFACT', // API 请求无响应,需进一步排查 schema 兼容性 // P3: poor mode (disable extract_memories + prompt_suggestion) 'POOR', diff --git a/bun.lock b/bun.lock index 38d490689..b7965930b 100644 --- a/bun.lock +++ b/bun.lock @@ -5,6 +5,7 @@ "": { "name": "claude-code-best", "dependencies": { + "@agentclientprotocol/sdk": "^0.19.0", "@claude-code-best/mcp-chrome-bridge": "^2.0.7", "ws": "^8.20.0", }, @@ -256,6 +257,8 @@ }, }, "packages": { + "@agentclientprotocol/sdk": ["@agentclientprotocol/sdk@0.19.0", "https://registry.npmmirror.com/@agentclientprotocol/sdk/-/sdk-0.19.0.tgz", { "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-U9I8ws9WTOk6jCBAWpXefGSDgVXn14/kV6HFzwWGcstQ02mOQgClMAROHmoIn9GqZbDBDEOkdIbP4P4TEMQdug=="], + "@alcalzone/ansi-tokenize": ["@alcalzone/ansi-tokenize@0.3.0", "https://registry.npmmirror.com/@alcalzone/ansi-tokenize/-/ansi-tokenize-0.3.0.tgz", { "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" } }, "sha512-p+CMKJ93HFmLkjXKlXiVGlMQEuRb6H0MokBSwUsX+S6BRX8eV5naFZpQJFfJHjRZY0Hmnqy1/r6UWl3x+19zYA=="], "@ant/claude-for-chrome-mcp": ["@ant/claude-for-chrome-mcp@workspace:packages/@ant/claude-for-chrome-mcp"], diff --git a/docs/features/acp-zed.md b/docs/features/acp-zed.md new file mode 100644 index 000000000..d83e28be2 --- /dev/null +++ b/docs/features/acp-zed.md @@ -0,0 +1,189 @@ +# ACP (Agent Client Protocol) — Zed / IDE 集成 + +> Feature Flag: `FEATURE_ACP=1`(build 和 dev 模式默认启用) +> 实现状态:可用(支持 Zed、Cursor 等 ACP 客户端) +> 源码目录:`src/services/acp/` + +## 一、功能概述 + +ACP (Agent Client Protocol) 是一种标准化的 stdio 协议,允许 IDE 和编辑器通过 stdin/stdout 的 NDJSON 流驱动 AI Agent。CCB 实现了完整的 ACP agent 端,可以被 Zed、Cursor 等支持 ACP 的客户端直接调用。 + +### 核心特性 + +- **会话管理**:新建 / 恢复 / 加载 / 分叉 / 关闭会话 +- **历史回放**:恢复会话时自动加载并回放对话历史 +- **权限桥接**:ACP 客户端的权限决策映射到 CCB 的工具权限系统 +- **斜杠命令 & Skills**:加载真实命令列表,支持 `/commit`、`/review` 等 prompt 型 skill +- **Context Window 跟踪**:精确的 usage_update,含 model prefix matching +- **Prompt 排队**:支持连续发送多条 prompt,自动排队处理 +- **模式切换**:auto / default / acceptEdits / plan / dontAsk / bypassPermissions +- **模型切换**:运行时切换 AI 模型 + +## 二、架构 + +``` +┌──────────────┐ NDJSON/stdio ┌──────────────────┐ +│ Zed / IDE │ ◄────────────────► │ CCB ACP Agent │ +│ (Client) │ stdin / stdout │ (Agent) │ +└──────────────┘ │ │ + │ entry.ts │ ← stdio → NDJSON stream + │ agent.ts │ ← ACP protocol handler + │ bridge.ts │ ← SDKMessage → ACP SessionUpdate + │ permissions.ts │ ← 权限桥接 + │ utils.ts │ ← 通用工具 + │ │ + │ QueryEngine │ ← 内部查询引擎 + └──────────────────┘ +``` + +### 文件职责 + +| 文件 | 职责 | +|------|------| +| `entry.ts` | 入口,创建 stdio → NDJSON stream,启动 `AgentSideConnection` | +| `agent.ts` | 实现 ACP `Agent` 接口:会话 CRUD、prompt、cancel、模式/模型切换 | +| `bridge.ts` | `SDKMessage` → ACP `SessionUpdate` 转换:文本/思考/工具/用量/编辑 diff | +| `permissions.ts` | ACP `requestPermission()` → CCB `CanUseToolFn` 桥接 | +| `utils.ts` | Pushable、流转换、权限模式解析、session fingerprint、路径显示 | + +## 三、配置 Zed 编辑器 + +### 3.1 Zed settings.json 配置 + +打开 Zed 的 `settings.json`(`Cmd+,` → Open Settings),添加 `agent_servers` 配置: + +```json +{ + "agent_servers": { + "ccb": { + "type": "custom", + "command": "ccb", + "args": ["--acp"] + } + } +} +``` + +### 3.3 API 认证配置 + +CCB 的 ACP agent 在启动时会自动加载 `settings.json` 中的环境变量(`ANTHROPIC_BASE_URL`、`ANTHROPIC_AUTH_TOKEN` 等)。确保已通过 `/login` 配置好 API 供应商。 + +也可通过环境变量传入: + +```json +{ + "agent_servers": { + "claude-code": { + "command": "ccb", + "args": ["--acp"], + "env": { + "ANTHROPIC_BASE_URL": "https://api.example.com/v1", + "ANTHROPIC_AUTH_TOKEN": "sk-xxx" + } + } + } +} +``` + +### 3.4 在 Zed 中使用 + +1. 配置完成后重启 Zed +2. 打开任意项目目录 +3. 按 `Cmd+'`(macOS)或 `Ctrl+'`(Linux)打开 Agent Panel +4. 在 Agent Panel 顶部的下拉菜单中选择 **claude-code** +5. 开始对话 + +### 3.5 功能说明 + +| 功能 | 操作 | +|------|------| +| 对话 | 在 Agent Panel 中直接输入消息 | +| 斜杠命令 | 输入 `/` 查看可用 skills 列表(如 `/commit`、`/review`) | +| 工具权限 | 弹出权限请求时选择 Allow / Reject / Always Allow | +| 模式切换 | 通过 Agent Panel 的设置菜单切换 auto/default/plan 等模式 | +| 模型切换 | 通过 Agent Panel 的设置菜单切换 AI 模型 | +| 会话恢复 | 关闭重开 Zed 后,之前的会话可自动恢复(含历史消息) | + +## 四、配置其他 ACP 客户端 + +ACP 是开放协议,任何支持 ACP 的客户端都可以连接 CCB。通用配置模式: + +``` +命令: ccb --acp +参数: ["--acp"] +通信: stdin/stdout NDJSON +协议版本: ACP v1 +``` + +### 4.1 Cursor + +在 Cursor 的设置中配置 MCP / Agent Server,使用同样的 `ccb --acp` 命令。 + +### 4.2 自定义客户端 + +使用 `@agentclientprotocol/sdk` 可以快速构建 ACP 客户端: + +```typescript +import { ClientSideConnection, ndJsonStream } from '@agentclientprotocol/sdk' + +// 创建连接(将 ccb --acp 作为子进程启动) +const child = spawn('ccb', ['--acp']) +const stream = ndJsonStream( + Writable.toWeb(child.stdin), + Readable.toWeb(child.stdout), +) + +const client = new ClientSideConnection(stream) + +// 初始化 +await client.initialize({ clientCapabilities: {} }) + +// 创建会话 +const { sessionId } = await client.newSession({ + cwd: '/path/to/project', +}) + +// 发送 prompt +const response = await client.prompt({ + sessionId, + prompt: [{ type: 'text', text: 'Hello, explain this project' }], +}) + +// 监听 session 更新 +client.on('sessionUpdate', (update) => { + console.log('Update:', update) +}) +``` + +## 五、ACP 协议支持矩阵 + +| 方法 | 状态 | 说明 | +|------|------|------| +| `initialize` | ✅ | 返回 agent 信息和能力 | +| `authenticate` | ✅ | 无需认证(自托管) | +| `newSession` | ✅ | 创建新会话 | +| `resumeSession` | ✅ | 恢复已有会话(含历史回放) | +| `loadSession` | ✅ | 加载指定会话(含历史回放) | +| `listSessions` | ✅ | 列出可用会话 | +| `forkSession` | ✅ | 分叉会话 | +| `closeSession` | ✅ | 关闭会话 | +| `prompt` | ✅ | 发送消息,支持排队 | +| `cancel` | ✅ | 取消当前/排队的 prompt | +| `setSessionMode` | ✅ | 切换权限模式 | +| `setSessionModel` | ✅ | 切换 AI 模型 | +| `setSessionConfigOption` | ✅ | 动态修改配置 | + +### SessionUpdate 类型 + +| 类型 | 状态 | 说明 | +|------|------|------| +| `agent_message_chunk` | ✅ | 助手文本消息 | +| `agent_thought_chunk` | ✅ | 思考/推理内容 | +| `user_message_chunk` | ✅ | 用户消息(历史回放) | +| `tool_call` | ✅ | 工具调用开始 | +| `tool_call_update` | ✅ | 工具调用结果/状态更新 | +| `usage_update` | ✅ | token 用量 + context window | +| `plan` | ✅ | TodoWrite → plan entries | +| `available_commands_update` | ✅ | 斜杠命令 & skills 列表 | +| `current_mode_update` | ✅ | 模式切换通知 | +| `config_option_update` | ✅ | 配置更新通知 | diff --git a/docs/features/daemon-restructure-design.md b/docs/features/daemon-restructure-design.md new file mode 100644 index 000000000..8d0d3abd8 --- /dev/null +++ b/docs/features/daemon-restructure-design.md @@ -0,0 +1,318 @@ +# Daemon 重构设计方案 + +> 分支: `feat/integrate-5-branches` +> 基于: `f41745cb` (= main `11bb3f62` 内容) +> 日期: 2026-04-13 + +## 一、问题概述 + +### 1.1 命令结构散乱 + +当前后台进程相关的命令分布在三个不同的位置,没有统一的命名空间: + +| 命令 | 注册位置 | 入口 | +|------|---------|------| +| `claude daemon start/status/stop` | `cli.tsx` 快速路径 L203 | `daemon/main.ts` | +| `claude ps` | `cli.tsx` 快速路径 L220 | `cli/bg.ts` | +| `claude logs ` | `cli.tsx` 快速路径 L232 | `cli/bg.ts` | +| `claude attach ` | `cli.tsx` 快速路径 L236 | `cli/bg.ts` | +| `claude kill ` | `cli.tsx` 快速路径 L238 | `cli/bg.ts` | +| `claude --bg` | `cli.tsx` 快速路径 L244 | `cli/bg.ts` | +| `claude new/list/reply` | `cli.tsx` 快速路径 L250 | `cli/handlers/templateJobs.ts` | +| `claude rollback` | `main.tsx` Commander.js L6525 | `cli/rollback.ts` | +| `claude up` | `main.tsx` Commander.js L6511 | `cli/up.ts` | + +**问题**: +- `ps/logs/attach/kill` 与 `daemon` 逻辑上都是后台进程管理,但互不关联 +- 这些命令都**只有 CLI 入口**,REPL 里输入 `/daemon` 或 `/ps` 不存在 +- `new/list/reply` 是模板任务系统的顶级命令,容易与其他命令冲突(特别是 `list`) + +### 1.2 Windows 不支持 + +`--bg` 和 `attach` 硬依赖 tmux: +- `bg.ts:handleBgFlag()` 第一步就检查 tmux,不可用直接报错退出 +- `bg.ts:attachHandler()` 用 `tmux attach-session`,无 tmux 替代方案 +- Windows (包括 VS Code 终端) 完全无法使用后台会话功能 + +### 1.3 无 REPL 入口 + +对比 `/mcp` 的双注册模式: +- **CLI**: `claude mcp serve/add/remove/list` (Commander.js, `main.tsx:5760`) +- **REPL**: `/mcp enable/disable/reconnect` (slash command, `commands/mcp/index.ts`) + +`daemon`/`bg`/`job` 系列只有 CLI 快速路径,REPL 中完全不可用。 + +## 二、目标 + +1. **层级化命令结构**: 参照 `/mcp` 模式,将后台管理收归 `/daemon`,模板任务收归 `/job` +2. **跨平台后台会话**: Windows / macOS / Linux 都能启动、附着、终止后台会话 +3. **双注册**: CLI (`claude daemon ...`) + REPL (`/daemon ...`) 同时可用 +4. **向后兼容**: 旧命令保留但输出 deprecation 提示 + +## 三、命令结构设计 + +### 3.1 `/daemon` — 后台进程管理 + +合并 daemon supervisor + bg sessions 为统一命名空间: + +``` +claude daemon ← CLI 入口 (cli.tsx 快速路径) +/daemon ← REPL 入口 (slash command, local-jsx) + +子命令: + status 综合状态面板 (daemon + 所有会话) + start [--dir ] 启动 daemon supervisor + stop 停止 daemon + bg [args...] 启动后台会话 + attach [target] 附着到后台会话 + logs [target] 查看会话日志 + kill [target] 终止会话 + (无参数) 等同于 status +``` + +**CLI 快速路径路由** (`cli.tsx`): +```typescript +// 新: 统一入口 +if (feature('DAEMON') && args[0] === 'daemon') { + const sub = args[1] || 'status' + switch (sub) { + case 'start': case 'stop': case 'status': + await daemonMain([sub, ...args.slice(2)]) + break + case 'bg': + await bg.handleBgStart(args.slice(2)) + break + case 'attach': case 'logs': case 'kill': + await bg[`${sub}Handler`](args[2]) + break + } +} + +// 向后兼容 (deprecated) +if (feature('BG_SESSIONS') && ['ps','logs','attach','kill'].includes(args[0])) { + console.warn(`[deprecated] Use: claude daemon ${args[0] === 'ps' ? 'status' : args[0]}`) + // ... delegate to daemon subcommand +} +``` + +**REPL 斜杠命令** (`commands/daemon/index.ts`): +```typescript +const daemon = { + type: 'local-jsx', + name: 'daemon', + description: 'Manage background sessions and daemon', + argumentHint: '[status|start|stop|bg|attach|logs|kill]', + isEnabled: () => feature('DAEMON') || feature('BG_SESSIONS'), + load: () => import('./daemon.js'), +} satisfies Command +``` + +### 3.2 `/job` — 模板任务管理 + +``` +claude job ← CLI 入口 +/job ← REPL 入口 + +子命令: + list 列出模板和活跃任务 + new