注意:说明:
注意:Beta: 此 API 处于 Beta 阶段,接口可能会有调整。欢迎反馈意见。
·REST API (/api/v1/*) — 无状态 HTTP 请求/响应,适合 Webhook 接入、管理操作、简单查询
·ACP (/api/v1/acp) — 有状态流式协议(JSON-RPC over SSE),适合构建完整 Agent 客户端应用
二、启动 HTTP 服务
codebuddy –serve –port 8080 –session-id my-session
三、API 文档(Swagger UI)
服务启动后访问:
·交互式文档: http://127.0.0.1:8080/api/docs
·OpenAPI 规范: http://127.0.0.1:8080/api/openapi.json
Swagger UI 提供所有公开端点的交互式测试界面。
四、验证服务正常
curl http://127.0.0.1:8080/api/v1/health# {"data":{"status":"ok","uptime":12.3,"platforms":["generic","wecom","wechat-kf"]}}
五、API 分层
| 层级 | 路由前缀 | 兼容性承诺 | 说明 |
| 公开 REST API | /api/v1/* | 语义化版本,不做破坏性变更 | 这篇档覆盖的内容 |
| 公开 ACP 协议 | /api/v1/acp | 遵循 ACP 规范 | 完整对话能力,参见 ACP 文档 |
| 内部 RPC | /internal/* | 不保证兼容性 | CLI 内部使用,不对外开放 |
七、自定义请求头
所有 API 请求(除豁免路径外)必须携带自定义请求头:
X-CodeBuddy-Request: 1
原理:自定义请求头会使浏览器的跨域请求变为"非简单请求",强制触发 CORS preflight。配合 CORS 白名单,非法源的请求会被拦截。即使攻击者使用 fetch(url, { mode: 'no-cors' }),浏览器也不允许在 no-cors 模式下发送自定义头,请求会因缺少该头而被服务端拒绝(403)。
八、豁免路径
以下路径不需要携带 X-CodeBuddy-Request 头:
| 路径 | 说明 |
| GET / | SPA 入口页 |
| GET /assets/* | 静态资源 |
| GET /docs/* | API 文档页 |
| GET /manifest.webmanifest | PWA 清单 |
| GET /api/v1/auth/status | 认证状态检查 |
| POST /api/v1/auth/login | 登录 |
| */api/v1/webhooks/* | Webhook(有平台签名验证) |
| GET /api/openapi.json | OpenAPI 规范 |
| GET /api/docs* | Swagger UI |
可通过环境变量 CODEBUDDY_DISABLE_REQUEST_VALIDATION=1 关闭此校验。
九、CORS 白名单
跨域请求的 Origin 会与服务端 CORS 白名单匹配,不在白名单中的来源会被拒绝(预检返回无 CORS 头的 204,实际请求返回 403 Origin not allowed)。白名单来源:
·本地端点自身的回环变体(localhost / 127.0.0.1 / [::1],仅限服务实际监听的端口)
·Tunnel URL(如启用)
·配置项 gateway.corsOrigins
·环境变量 CODEBUDDY_CODE_CORS_ORIGINS(逗号分隔,支持精确 origin、*.domain 子域通配和 * 全开)
注意:回环来源不再被无条件放行。 早期实现允许任意 localhost / 127.0.0.1 来源(不论端口),这使用户浏览器中任何占用本地端口的页面(如恶意页运行在 http://localhost:3000)都能跨源调用本服务的执行进程 / 文件读写接口。Cookie 的 SameSite=Strict 无法防护此场景 —— 端口不属于 "site" 的组成部分,localhost:3000 与 localhost:8321 属同 site 不同 origin,浏览器会照常携带会话 Cookie。
本地开发(Vite dev server 5173 → 后端 8321 属跨源)需显式声明来源:
CODEBUDDY_CODE_CORS_ORIGINS=http://localhost:5173 codebuddy –serve
被拒绝时,服务端日志与 403 响应体的 hint 字段都会提示该配置方式。
绑定 0.0.0.0 时(如 –host 0.0.0.0,常见于云虚拟机 / 局域网暴露场景),若未显式设置 CODEBUDDY_CODE_CORS_ORIGINS,服务端会自动允许所有来源(等价于配置 *),无需额外配置即可通过任意 IP 或域名访问 Web UI;显式设置该环境变量时以用户配置为准。此场景下认证为强制开启(见下),凭据仍是必需的。
十、认证
–serve 默认开启密码认证。首次启动会生成随机密码并写入 ~/.codebuddy/settings.json,同时在终端打印一条带密码的可点链接:
Endpoint http://127.0.0.1:8321 Web UI http://127.0.0.1:8321/?password=<生成的密码> Password <生成的密码> Config ~/.codebuddy/settings.json
点击该链接即可登录 Web UI(服务端会下发有效期 30 天的 gateway_session Cookie,后续直接访问端点即可,无需重复输入)。
认证模式优先级(高 → 低):
| 来源 | 取值 | 说明 |
| 环境变量 CODEBUDDY_GATEWAY_AUTH | password / none | 优先级最高,适合 CI |
| 绑定非回环地址(如 –host 0.0.0.0) | 强制 password | 对外暴露时不允许关闭 |
| 命令行 –auth <mode> | password / none | – |
| 配置项 gateway.auth | password / none | – |
| 默认值 | password | –serve 的兜底模式 |
注意:安全说明:
注意:这组端点包含执行进程(/api/v1/process/*)、读写任意文件(/api/v1/files/*、/api/v1/fs/*)和交互式终端(/api/v1/pty/*)等敏感能力。因此默认强制认证(secure by default,与 E2B Secured Access 的默认行为一致)。关闭认证意味着同机任意进程都能通过该服务执行命令、读写文件,仅建议在隔离环境(容器 / 一次性沙箱)或 CI 中使用。
关闭认证(仅在明确知晓风险时使用,启动时会打印警告):
codebuddy –serve –auth none# 或CODEBUDDY_GATEWAY_AUTH=none codebuddy –serve
十一、携带凭据的方式
API 请求(/api/v1/*)只接受请求头或 Cookie:
# 1) Bearer Token(推荐,同时携带安全头)curl -H "X-CodeBuddy-Request: 1" \\ -H "Authorization: Bearer YOUR_PASSWORD" \\ http://host:port/api/v1/sessions# 2) X-Access-Token(与 Bearer 等价,对齐 E2B envd 的凭据头习惯)curl -H "X-CodeBuddy-Request: 1" \\ -H "X-Access-Token: YOUR_PASSWORD" \\ http://host:port/api/v1/sessions# 3) Cookie(浏览器登录后自动携带)curl -H "X-CodeBuddy-Request: 1" \\ -H "Cookie: gateway_session=<sha256(password)>" \\ http://host:port/api/v1/sessions
注意:?password= 仅对 GET / 与 POST /api/v1/auth/login 有效,对其他 /api/v1/* 端点无效(会返回 401)。这是有意设计:URL 会被记录到浏览器历史、服务端访问日志,并在用户复制分享链接时泄露,因此密码不出现在 API 请求的网址中。?password= 的唯一用途是首次进门换取 gateway_session Cookie。
注意:用 ?password= 测 API 会得到 401,这不是认证实现有问题。
十二、响应格式
所有 /api/v1/* 端点使用统一的信封格式:
// 成功{ "data": { … }}// 错误{ "error": { "code": "AUTH_REQUIRED", // 机器可读错误码 "message": "Authentication required" // 人类可读描述 }}
十四、系统
| 方法 | 端点 | 说明 |
| GET | /api/v1/health | 健康检查 |
| GET | /api/v1/info | 环境信息(版本、OS、CWD 等) |
| GET | /api/v1/metrics | 系统资源指标 + 实例进程指标 |
| GET | /api/v1/envs | 环境变量(对齐 E2B envd) |
十五、认证
| 方法 | 端点 | 说明 |
| GET | /api/v1/auth/status | 获取认证状态 |
| POST | /api/v1/auth/login | 密码登录,返回 token |
十六、Runs(Agent 执行)
| 方法 | 端点 | 说明 |
| POST | /api/v1/runs | 发起 Agent 执行(异步,返回 runId) |
| GET | /api/v1/runs/:runId | 查询执行状态 |
| GET | /api/v1/runs/:runId/stream | SSE 流式获取执行结果 |
| POST | /api/v1/runs/:runId/cancel | 取消执行 |
十七、Webhooks(第三方平台接入)
| 方法 | 端点 | 说明 |
| GET | /api/v1/webhooks/:platform | 平台 URL 验证(企微等) |
| POST | /api/v1/webhooks/:platform | 平台消息 Webhook 入口 |
支持的平台:generic、wecom(企业微信)、wechat-kf(微信客服)
十八、会话
| 方法 | 端点 | 说明 |
| GET | /api/v1/sessions | 获取会话列表(支持 cwd 查询参数) |
| DELETE | /api/v1/sessions/:id | 删除会话 |
| POST | /api/v1/sessions/:id/rename | 重命名会话 |
| GET | /api/v1/sessions/across-projects | 已废弃,使用 GET /api/v1/sessions?cwd=* 代替 |
| GET | /api/v1/sessions/workspaces | 已废弃 |
十九、PTY(终端)
| 方法 | 端点 | 说明 |
| POST | /api/v1/pty | 创建 PTY 会话 |
| GET | /api/v1/pty | 列出 PTY 会话 |
| GET | /api/v1/pty/:id | 查询 PTY 会话 |
| DELETE | /api/v1/pty/:id | 销毁 PTY 会话 |
| GET | /api/v1/pty/:id/output | SSE 流式获取 PTY 输出(替代 WebSocket) |
| POST | /api/v1/pty/:id/input/send | 发送 PTY 输入(对齐 E2B Process.SendInput) |
| POST | /api/v1/pty/:id/resize | 调整 PTY 大小(对齐 E2B Process.Update) |
| WebSocket | /api/v1/pty/:id/ws | PTY 双向数据传输(兼容保留) |
20、Workers & Daemon
Worker 是运行中的 CLI 进程(interactive / bg / daemon),通过 PID 文件注册表管理。
| 方法 | 端点 | 说明 |
| GET | /api/v1/workers | 获取所有活跃 Worker 列表 |
| POST | /api/v1/workers | 手动添加远程 Worker |
| GET | /api/v1/workers/:id | 获取 Worker 详情(按 PID 或名称) |
| GET | /api/v1/workers/:id/logs | 获取 Worker 日志(支持多类型) |
| DELETE | /api/v1/workers/:id | 终止 Worker 进程 |
| GET | /api/v1/daemon/status | 查询 Daemon 状态 |
| POST | /api/v1/daemon/start | 启动 Daemon |
| POST | /api/v1/daemon/stop | 停止 Daemon |
| POST | /api/v1/daemon/restart | 重启 Daemon |
Workers 查询参数:
·?kind=bg — 按类型过滤(interactive / bg / daemon / daemon-worker)
·?local=true — 仅返回本地 Worker(远程代理调用时使用)
日志类型参数 (GET /api/v1/workers/:id/logs):
·?type=telemetry — 遥测日志(~/.codebuddy/logs/{date}/)
·?type=process — 进程 stdout/stderr(bg/daemon 日志)
·?type=debug — 调试日志(~/.codebuddy/debug/,需 –debug)
·?type=transcript — 对话历史摘要
·?tail=200 — 只返回最后 N 行
·不传 type 时自动选择最佳来源(telemetry > process > debug > transcript)
21、Jobs(后台智能体实例)
Jobs 是由 /bg、左箭头转后台或 codebuddy agents 派发出的后台智能体实例。它们与 CLI agent-view / TUI 共用 JobStore 和生命周期语义。
| 方法 | 端点 | 说明 |
| GET | /api/v1/jobs | 获取实例列表;支持 all=1 和 cwd 过滤 |
| POST | /api/v1/jobs | 派发后台智能体或 shell job |
| GET | /api/v1/jobs/events | SSE 订阅 snapshot / added / changed / removed / keepalive |
| GET | /api/v1/jobs/prefs | 获取置顶与项目分组偏好 |
| PUT | /api/v1/jobs/prefs | 批量更新置顶与项目分组偏好 |
| GET | /api/v1/jobs/dispatch-context | 获取启动目录、可用 Agent 与仓库目标 |
| GET | /api/v1/jobs/resumable | 获取可恢复的历史会话;支持 cwd、includeAttached=1 |
| POST | /api/v1/jobs/resume | 从历史会话恢复为独立 job |
| GET | /api/v1/jobs/:id | 获取 job 详情;id 支持稳定 ID、short ID 或 sessionId |
| PATCH | /api/v1/jobs/:id/name | 重命名 job |
| POST | /api/v1/jobs/:id/reply | 回复等待输入的 job |
| POST | /api/v1/jobs/:id/stop | 停止 job |
| POST | /api/v1/jobs/:id/respawn | 重启 job 并恢复对话 |
| DELETE | /api/v1/jobs/:id | 删除 job 记录 |
| GET | /api/v1/jobs/:id/stream | SSE 回放 transcript 尾部并尾随新输出 |
| GET | /api/v1/jobs/:id/transcript | 一次性返回最近最多 1000 行 ACP replay updates |
派发请求体 (POST /api/v1/jobs):
| 字段 | 类型 | 必填 | 说明 |
| prompt | string | 是 | 初始指令;bash=true 时为 shell 命令 |
| cwd | string | 否 | 启动目录,默认当前工作目录 |
| agent / model | string | 否 | 自定义 Agent 或模型 |
| effort | string | 否 | minimal / low / medium / high / xhigh / max |
| permissionMode | string | 否 | default / acceptEdits / plan / auto / dontAsk / bypassPermissions |
| name | string | 否 | 列表显示名称 |
| bash | boolean | 否 | 派发一次性 shell job |
| sourceSessionId | string | 否 | 继承受限上下文;新 job 仍使用独立会话 |
| bgIsolation | string | 否 | none / worktree;省略时跟随全局后台写隔离设置 |
effort、permissionMode、bgIsolation 按白名单校验,非法值返回 400 BAD_REQUEST。请求省略可选字段时不覆盖会话或全局默认值。
生命周期字段:
·state: working / blocked / done / failed / stopped
·status: 存活进程的即时状态 busy / waiting / idle / stopped
·tempo: active / idle / blocked
·alive 与 settled 独立;settled=true && alive=false 表示已结束历史
·foregroundHeld=true 表示仍被前台终端持有,暂时不能 attach
·webUrl 仅在 job worker 存活并监听 loopback HTTP(S) 时返回,否则为 null
对话与错误:
·/transcript 一次性返回 { sessionId, updates },最多包含最近 1000 行转换后的 ACP replay updates。
·/stream 返回 text/event-stream;先回放最多 1000 行,再每秒尾随新增 JSONL 记录;shell job 返回空流。
·不存在的 job 返回 404 JOB_NOT_FOUND。
·删除若被 worktree 或前台持有守卫拒绝,仍返回 HTTP 200,但 body 为 { "deleted": false, "reason": "…" }。
# 派发后台智能体curl -H "X-CodeBuddy-Request: 1" \\ -H "Authorization: Bearer $PASSWORD" \\ -H 'Content-Type: application/json' \\ -X POST http://127.0.0.1:8080/api/v1/jobs \\ -d '{"prompt":"检查当前仓库的测试状态","cwd":"/repo/app"}'# 订阅 job 列表变化curl -N -H "X-CodeBuddy-Request: 1" \\ -H "Authorization: Bearer $PASSWORD" \\ http://127.0.0.1:8080/api/v1/jobs/events
22、Channels(远程控制)
| 方法 | 端点 | 说明 |
| GET | /api/v1/channels | 获取客户端列表 |
| POST | /api/v1/channels/:type/:id/start | 启动客户端 |
| POST | /api/v1/channels/:type/:id/stop | 停止客户端 |
| POST | /api/v1/channels/wechat | 创建微信实例 |
| POST | /api/v1/channels/wecom | 创建企微实例 |
23、文件系统(E2B 兼容)
文件内容操作(对齐 E2B envd HTTP 端点):
| 方法 | 端点 | 说明 |
| GET | /api/v1/files/download?path=… | 下载文件(对齐 E2B envd GET /files) |
| POST | /api/v1/files/upload?path=… | 上传文件(对齐 E2B envd POST /files) |
| POST | /api/v1/files/compose | 合并多文件(对齐 E2B envd POST /files/compose) |
文件操作(对齐 E2B filesystem.proto):
| 方法 | 端点 | 说明 |
| POST | /api/v1/fs/stat | 获取文件/目录信息(对齐 Filesystem.Stat) |
| POST | /api/v1/fs/list | 列出目录内容(对齐 Filesystem.ListDir) |
| POST | /api/v1/fs/mkdir | 创建目录(对齐 Filesystem.MakeDir) |
| POST | /api/v1/fs/remove | 删除文件/目录(对齐 Filesystem.Remove) |
| POST | /api/v1/fs/move | 移动/重命名(对齐 Filesystem.Move) |
文件监听(对齐 E2B filesystem.proto):
| 方法 | 端点 | 说明 |
| POST | /api/v1/fs/watch | 流式目录监听 SSE(对齐 Filesystem.WatchDir) |
| POST | /api/v1/fs/watcher/create | 创建监听器(对齐 Filesystem.CreateWatcher) |
| POST | /api/v1/fs/watcher/events | 获取监听事件(对齐 Filesystem.GetWatcherEvents) |
| POST | /api/v1/fs/watcher/remove | 删除监听器(对齐 Filesystem.RemoveWatcher) |
CBC 增强:
| 方法 | 端点 | 说明 |
| GET | /api/v1/fs/search?query=… | 文件模糊搜索(基于 ripgrep,E2B 无对应接口) |
24、进程管理(E2B 兼容)
对齐 E2B process.proto,将 gRPC 方法映射为 REST 端点:
| 方法 | 端点 | 说明 |
| POST | /api/v1/process/start | 启动进程(对齐 Process.Start,支持 SSE/JSON) |
| GET | /api/v1/process/list | 列出运行中进程(对齐 Process.List) |
| POST | /api/v1/process/connect | 连接到进程 SSE 流(对齐 Process.Connect) |
| POST | /api/v1/process/input/send | 发送 stdin(对齐 Process.SendInput) |
| POST | /api/v1/process/input/stream | 流式发送 stdin(对齐 Process.StreamInput) |
| POST | /api/v1/process/signal/send | 发送信号(对齐 Process.SendSignal) |
| POST | /api/v1/process/stdin/close | 关闭 stdin(对齐 Process.CloseStdin) |
| POST | /api/v1/process/update | 更新进程配置如 PTY resize(对齐 Process.Update) |
25、ACP(Agent Client Protocol)
| 方法 | 端点 | 说明 |
| POST | /api/v1/acp/connect | 建立 ACP 连接,返回 connectionId 和 sessionToken |
| GET | /api/v1/acp | SSE 通知订阅(需要 acp-connection-id Header) |
| POST | /api/v1/acp | 发送 JSON-RPC 请求(newSession、prompt、cancelRun 等) |
| DELETE | /api/v1/acp | 断开连接 |
26、文件变更(Checkpoint)— Internal
| 方法 | 端点 | 说明 |
| POST | /internal/file-changes/diff | 获取单个文件的 diff 内容 |
| POST | /internal/file-changes/checkpoints | 列出可回退的 checkpoint |
| POST | /internal/file-changes/revert | 撤回文件变更或回退到 checkpoint |
注意:这些是内部端点,无稳定性保证,仅供 Web UI 消费。
27、插件管理
| 方法 | 端点 | 说明 |
| GET | /api/v1/plugins | 列出已安装插件(可选 includeBuiltin=false 过滤内置插件) |
| POST | /api/v1/plugins | 安装插件 |
| POST | /api/v1/plugins/validate | 验证插件/市场清单文件 |
| POST | /api/v1/plugins/enable | 启用插件 |
| POST | /api/v1/plugins/disable | 禁用插件 |
| POST | /api/v1/plugins/uninstall | 卸载插件 |
| POST | /api/v1/plugins/update | 更新插件到最新版本 |
| GET | /api/v1/plugins/marketplaces | 列出已配置的插件市场(可选 includeBuiltin=false 过滤内置市场) |
| POST | /api/v1/plugins/marketplaces | 添加插件市场(可选 autoUpdate 添加时即开启自动更新) |
| POST | /api/v1/plugins/marketplaces/browse | 浏览市场中的可用插件 |
| POST | /api/v1/plugins/marketplaces/update | 更新市场(同步远端仓库内容) |
| POST | /api/v1/plugins/marketplaces/auto-update | 开启/关闭市场自动更新 |
| DELETE | /api/v1/plugins/marketplaces/:name | 删除插件市场 |
28、配置管理
| 方法 | 端点 | 说明 |
| GET | /api/v1/settings | 列出所有配置 |
| GET | /api/v1/settings/:key | 获取单个配置值 |
| PUT | /api/v1/settings/:key | 设置配置值 |
| POST | /api/v1/settings/:key/items | 向数组类配置追加值 |
| POST | /api/v1/settings/:key/remove | 从数组类配置移除值 |
29、工作目录
| 方法 | 端点 | 说明 |
| GET | /api/v1/workspace-dirs | 列出当前附加工作目录 |
| POST | /api/v1/workspace-dirs | 添加单个工作目录 |
| DELETE | /api/v1/workspace-dirs?path= | 移除单个工作目录 |
| PUT | /api/v1/workspace-dirs/sync | 全量同步工作目录列表 |
30、任务模板
| 方法 | 端点 | 说明 |
| GET | /api/v1/tasks/templates | 获取任务模板 |
| POST | /api/v1/tasks/templates/refresh | 刷新(触发 AI 推荐) |
31、使用统计
| 方法 | 端点 | 说明 |
| GET | /api/v1/stats | 历史使用统计(跨所有项目) |
| GET | /api/v1/stats/session | 当前会话实时统计 |
32、链路追踪
| 方法 | 端点 | 说明 |
| GET | /api/v1/traces | 获取 trace 列表(支持分页和过滤) |
| GET | /api/v1/traces/:traceId | 获取 trace 详情(含 spans) |
| DELETE | /api/v1/traces | 清空所有 traces |
Traces 查询参数:
·?offset=0&limit=50 — 分页(limit 上限 200)
·?session_id=xxx — 按会话 ID 过滤
·?worker_pid=12345 — 指定 Worker 实例(支持远程代理)
·?worker_pid=all — 扫描所有实例
33、定时任务
| 方法 | 端点 | 说明 |
| GET | /api/v1/scheduled-tasks | 获取定时任务列表 |
| POST | /api/v1/scheduled-tasks | 创建定时任务 |
| DELETE | /api/v1/scheduled-tasks/:id | 删除定时任务 |
定时任务查询参数:
·?sessionId=xxx — 会话 ID(必需,不传则使用当前活跃会话)
34、使用示例
以下示例为突出各端点自身的参数而省略了公共请求头。实际调用 /api/v1/* 时需要补上:
-H "X-CodeBuddy-Request: 1" -H "Authorization: Bearer $PASSWORD"
其中 $PASSWORD 是 –serve 启动时打印的密码(见认证)。缺少安全头会得到403 Missing required header,缺少凭据会得到 401 AUTH_REQUIRED。仅/api/v1/health、/api/v1/auth/status 等豁免端点可直接访问。
35、健康检查
curl http://127.0.0.1:8080/api/v1/health
36、发起 Agent 执行
# 发送消息(body 为 Gateway Protocol 格式,id/type 必填)curl -X POST http://127.0.0.1:8080/api/v1/runs \\ -H "Content-Type: application/json" \\ -H "X-CodeBuddy-Request: 1" \\ -d '{ "id": "run-1", "type": "message", "source": {"platform": "generic", "sender": {"id": "dev", "name": "Developer"}, "conversation": {"id": "run-1", "type": "direct"}}, "payload": {"text": "帮我分析代码性能"} }'# 响应: {"data": {"runId": "uuid-xxx", "status": "accepted"}}# 通过 SSE 流获取结果(同样需携带 X-CodeBuddy-Request 头)curl -H "X-CodeBuddy-Request: 1" http://127.0.0.1:8080/api/v1/runs/uuid-xxx/stream
37、请求体字段(Gateway Protocol)
POST /api/v1/runs 的请求体为 Gateway Protocol 入站消息格式:
| 字段 | 必填 | 类型 | 说明 |
| id | 是 | string | 消息唯一 ID,由调用方生成,用于去重与追踪 |
| type | 是 | "message" | "action" | 消息类型。message 发起对话,action 发送控制指令 |
| payload.text | 否 | string | prompt 文本(也兼容顶层 text / prompt) |
| payload.attachments | 否 | array | 附件列表,元素含 type(image/voice/video/file)、url、urlType(local-path/url)等 |
| version | 否 | string | 协议版本,默认 "1.0" |
| source.platform | 否 | string | 来源平台,默认 "generic" |
| source.sender.id | 否 | string | 发送者 ID,用于限流;缺省为 "unknown" |
| source.sender.name | 否 | string | 发送者名称 |
| source.conversation.id | 否 | string | 会话 ID,缺省取 id |
| source.conversation.type | 否 | "direct" | "group" | 会话类型,默认 "direct" |
| action | 否 | "cancel" | "status" | 仅 type="action" 时使用的控制动作 |
| callback.url | 否 | string | 异步回传结果的回调地址(模式 B) |
| callback.headers | 否 | object | 回调请求附加的自定义头 |
| timeoutMs | 否 | number | 单次执行超时(毫秒),优先级高于 settings.gateway.runTimeoutMs;也可用请求头 X-Codebuddy-Run-Timeout。设为 0 或负数关闭超时保护 |
权威定义见源码 src/node/remote-gateway/gateway-protocol.ts 的 GatewayInboundMessage。
38、PTY 终端管理
# 创建终端curl -X POST http://127.0.0.1:8080/api/v1/pty \\ -H "Content-Type: application/json" \\ -d '{"cols": 120, "rows": 40}'# 列出终端curl http://127.0.0.1:8080/api/v1/pty# SSE 流式获取输出(替代 WebSocket)curl http://127.0.0.1:8080/api/v1/pty/SESSION_ID/output# 发送输入curl -X POST http://127.0.0.1:8080/api/v1/pty/SESSION_ID/input/send \\ -H "Content-Type: application/json" \\ -d '{"data": "ls -la\\n"}'# 调整大小curl -X POST http://127.0.0.1:8080/api/v1/pty/SESSION_ID/resize \\ -H "Content-Type: application/json" \\ -d '{"cols": 200, "rows": 50}'# 销毁终端curl -X DELETE http://127.0.0.1:8080/api/v1/pty/SESSION_ID
39、文件系统操作(E2B 兼容)
# 下载文件curl "http://127.0.0.1:8080/api/v1/files/download?path=/tmp/test.txt"# 上传文件curl -X POST "http://127.0.0.1:8080/api/v1/files/upload?path=/tmp/upload.txt" \\ -H "Content-Type: application/octet-stream" \\ –data-binary @local-file.txt# 获取文件信息curl -X POST http://127.0.0.1:8080/api/v1/fs/stat \\ -H "Content-Type: application/json" \\ -d '{"path": "/tmp"}'# 列出目录curl -X POST http://127.0.0.1:8080/api/v1/fs/list \\ -H "Content-Type: application/json" \\ -d '{"path": "/tmp", "depth": 2}'# 创建目录curl -X POST http://127.0.0.1:8080/api/v1/fs/mkdir \\ -H "Content-Type: application/json" \\ -d '{"path": "/tmp/new-dir"}'# 文件模糊搜索(CBC 增强)curl "http://127.0.0.1:8080/api/v1/fs/search?query=component&limit=10"
40、进程管理(E2B 兼容)
# 启动进程(JSON 模式)curl -X POST http://127.0.0.1:8080/api/v1/process/start \\ -H "Content-Type: application/json" \\ -d '{"process": {"cmd": "python3", "args": ["script.py"]}, "tag": "my-script"}'# 启动进程(SSE 流式输出)curl -X POST http://127.0.0.1:8080/api/v1/process/start \\ -H "Content-Type: application/json" \\ -H "Accept: text/event-stream" \\ -d '{"process": {"cmd": "python3", "args": ["script.py"]}}'# 列出运行中进程curl http://127.0.0.1:8080/api/v1/process/list# 发送 stdincurl -X POST http://127.0.0.1:8080/api/v1/process/input/send \\ -H "Content-Type: application/json" \\ -d '{"process": {"pid": 12345}, "input": {"stdin": "hello\\n"}}'# 发送信号(SIGTERM)curl -X POST http://127.0.0.1:8080/api/v1/process/signal/send \\ -H "Content-Type: application/json" \\ -d '{"process": {"tag": "my-script"}, "signal": 15}'# 系统指标 + 实例进程指标curl http://127.0.0.1:8080/api/v1/metrics# 响应: { data: { ts, cpuCount, cpuUsedPct, memTotalMib, memUsedMib, diskUsed, diskTotal, instances: [{ id, cwd, pid, rssMib, heapUsedMib, heapTotalMib, uptimeSeconds, … }] } }
41、会话管理
# 获取当前工作空间的会话列表curl http://127.0.0.1:8080/api/v1/sessions# 获取所有工作空间的会话列表curl http://127.0.0.1:8080/api/v1/sessions?cwd=*# 获取指定工作目录的会话列表curl http://127.0.0.1:8080/api/v1/sessions?cwd=/path/to/workspace# 获取指定项目的会话列表(按压缩工作目录名过滤)curl http://127.0.0.1:8080/api/v1/sessions?cwd=*&projectId=workspace-hash# 重命名会话curl -X POST http://127.0.0.1:8080/api/v1/sessions/SESSION_ID/rename \\ -H "Content-Type: application/json" \\ -d '{"name": "性能优化讨论"}'
cwd 查询参数说明:
| cwd 值 | 说明 |
| 不传 | 返回当前工作空间的会话 |
| * | 返回所有工作空间的会话 |
| /path/to/workspace | 返回指定工作目录的会话 |
42、文件变更管理(Internal)
# 获取文件 diff(需要文件在 checkpoint 中被跟踪)curl -X POST http://127.0.0.1:8080/internal/file-changes/diff \\ -H "Content-Type: application/json" \\ -d '{"path": "/path/to/file.ts"}'# 响应: {"data": {"path": "/path/to/file.ts", "oldText": "…", "newText": "…"}}# 列出可回退的 checkpointcurl -X POST http://127.0.0.1:8080/internal/file-changes/checkpoints \\ -H "Content-Type: application/json" \\ -d '{}'# 响应: {"data": {"checkpoints": [{"id": "xxx", "label": "…", "createdAt": 1234567890, "files": […], "additions": 5, "deletions": 2}]}}# 按文件撤回变更curl -X POST http://127.0.0.1:8080/internal/file-changes/revert \\ -H "Content-Type: application/json" \\ -d '{"paths": ["/path/to/file.ts"]}'# 响应: {"data": {"success": true, "revertedFiles": ["/path/to/file.ts"]}}# 回退到指定 checkpointcurl -X POST http://127.0.0.1:8080/internal/file-changes/revert \\ -H "Content-Type: application/json" \\ -d '{"checkpointId": "checkpoint-uuid", "scope": "CodeAndConversation"}'# scope 可选值: "Code"(仅回退文件), "Conversation"(仅回退对话), "CodeAndConversation"(全部回退)# 撤回全部变更(回退到最早的 checkpoint)curl -X POST http://127.0.0.1:8080/internal/file-changes/revert \\ -H "Content-Type: application/json" \\ -d '{}'
43、插件管理
# 列出已安装插件(每项带 isBuiltIn 布尔字段,标识是否属于内置市场)curl http://127.0.0.1:8080/api/v1/plugins# 只列出用户自行安装的插件,过滤掉内置市场下的插件curl "http://127.0.0.1:8080/api/v1/plugins?includeBuiltin=false"# 安装插件("name@marketplace" 格式)curl -X POST http://127.0.0.1:8080/api/v1/plugins \\ -H "Content-Type: application/json" \\ -d '{"plugin": "my-plugin@my-marketplace"}'# 启用插件curl -X POST http://127.0.0.1:8080/api/v1/plugins/enable \\ -H "Content-Type: application/json" \\ -d '{"plugin": "my-plugin@my-marketplace"}'# 禁用插件curl -X POST http://127.0.0.1:8080/api/v1/plugins/disable \\ -H "Content-Type: application/json" \\ -d '{"plugin": "my-plugin@my-marketplace"}'# 卸载插件curl -X POST http://127.0.0.1:8080/api/v1/plugins/uninstall \\ -H "Content-Type: application/json" \\ -d '{"plugin": "my-plugin@my-marketplace"}'# 更新插件到最新版本(传 waitForApply=true 可等待重建生效后再返回)curl -X POST http://127.0.0.1:8080/api/v1/plugins/update \\ -H "Content-Type: application/json" \\ -d '{"plugin": "my-plugin@my-marketplace"}'# 列出插件市场(每项带 isBuiltIn 布尔字段)curl http://127.0.0.1:8080/api/v1/plugins/marketplaces# 只列出用户自行添加的市场,过滤掉内置市场curl "http://127.0.0.1:8080/api/v1/plugins/marketplaces?includeBuiltin=false"# 添加插件市场curl -X POST http://127.0.0.1:8080/api/v1/plugins/marketplaces \\ -H "Content-Type: application/json" \\ -d '{"source": "https://example.com/marketplace", "name": "my-marketplace"}'# 添加插件市场并默认开启自动更新(等价于添加后再调一次 marketplaces/auto-update)curl -X POST http://127.0.0.1:8080/api/v1/plugins/marketplaces \\ -H "Content-Type: application/json" \\ -d '{"source": "https://example.com/marketplace", "name": "my-marketplace", "autoUpdate": true}'# 浏览市场中的插件curl -X POST http://127.0.0.1:8080/api/v1/plugins/marketplaces/browse \\ -H "Content-Type: application/json" \\ -d '{"marketplace": "my-marketplace"}'# 更新市场(真正从远端拉取最新内容)curl -X POST http://127.0.0.1:8080/api/v1/plugins/marketplaces/update \\ -H "Content-Type: application/json" \\ -d '{"marketplace": "my-marketplace"}'# 开启/关闭市场自动更新(开启后后台周期性同步并升级已安装插件)curl -X POST http://127.0.0.1:8080/api/v1/plugins/marketplaces/auto-update \\ -H "Content-Type: application/json" \\ -d '{"marketplace": "my-marketplace", "autoUpdate": true}'# 删除插件市场curl -X DELETE http://127.0.0.1:8080/api/v1/plugins/marketplaces/my-marketplace
44、配置管理
# 列出所有配置curl http://127.0.0.1:8080/api/v1/settings# 按作用域列出配置curl "http://127.0.0.1:8080/api/v1/settings?scope=user"# 获取单个配置curl http://127.0.0.1:8080/api/v1/settings/model# 设置配置值curl -X PUT http://127.0.0.1:8080/api/v1/settings/theme \\ -H "Content-Type: application/json" \\ -d '{"value": "dark"}'# 向数组类配置追加值curl -X POST http://127.0.0.1:8080/api/v1/settings/permissions/items \\ -H "Content-Type: application/json" \\ -d '{"values": ["Allow: Read(**)"]}'# 从数组类配置移除值curl -X POST http://127.0.0.1:8080/api/v1/settings/permissions/remove \\ -H "Content-Type: application/json" \\ -d '{"values": ["Allow: Read(**)"]}'
45、工作目录
管理附加工作目录,使权限系统放行这些目录下的文件操作(与 /add-dir 命令效果一致)。
# 列出当前附加工作目录curl http://127.0.0.1:8080/api/v1/workspace-dirs# 添加工作目录curl -X POST http://127.0.0.1:8080/api/v1/workspace-dirs \\ -H "Content-Type: application/json" \\ -d '{"path": "/Users/me/other-project"}'# 移除工作目录curl -X DELETE "http://127.0.0.1:8080/api/v1/workspace-dirs?path=/Users/me/other-project"# 全量同步(页面刷新恢复后调用)curl -X PUT http://127.0.0.1:8080/api/v1/workspace-dirs/sync \\ -H "Content-Type: application/json" \\ -d '{"dirs": ["/Users/me/project-a", "/Users/me/project-b"]}'
注意:说明:
46、使用统计
# 获取历史使用统计(活动热力图、模型/工具使用排行、连续活跃天数等)curl http://127.0.0.1:8080/api/v1/stats# 获取当前会话的实时成本统计curl http://127.0.0.1:8080/api/v1/stats/session
47、链路追踪
# 获取 trace 列表(分页)curl "http://127.0.0.1:8080/api/v1/traces?offset=0&limit=20"# 按会话 ID 过滤curl "http://127.0.0.1:8080/api/v1/traces?session_id=SESSION_ID"# 获取 trace 详情(含所有 spans)curl http://127.0.0.1:8080/api/v1/traces/TRACE_ID# 从远程 Worker 获取 tracescurl "http://127.0.0.1:8080/api/v1/traces?worker_pid=12345"# 清空所有 tracescurl -X DELETE http://127.0.0.1:8080/api/v1/traces
48、定时任务管理
# 获取定时任务列表curl "http://127.0.0.1:8080/api/v1/scheduled-tasks?sessionId=SESSION_ID"# 创建定时任务(每 5 分钟执行)curl -X POST http://127.0.0.1:8080/api/v1/scheduled-tasks \\ -H "Content-Type: application/json" \\ -d '{"cron": "*/5 * * * *", "prompt": "检查构建状态", "sessionId": "SESSION_ID"}'# 创建一次性任务(每周一上午 9 点)curl -X POST http://127.0.0.1:8080/api/v1/scheduled-tasks \\ -H "Content-Type: application/json" \\ -d '{"cron": "0 9 * * 1", "prompt": "生成周报", "recurring": false, "sessionId": "SESSION_ID"}'# 创建持久化任务(重启后仍保留)curl -X POST http://127.0.0.1:8080/api/v1/scheduled-tasks \\ -H "Content-Type: application/json" \\ -d '{"cron": "0 0 * * *", "prompt": "每日清理", "durable": true, "sessionId": "SESSION_ID"}'# 删除定时任务curl -X DELETE "http://127.0.0.1:8080/api/v1/scheduled-tasks/TASK_ID?sessionId=SESSION_ID"
49、错误码
| 错误码 | HTTP 状态 | 说明 |
| AUTH_REQUIRED | 401 | 需要认证 |
| AUTH_INVALID | 401 | 认证无效 |
| AUTH_RATE_LIMITED | 429 | 登录尝试过多 |
| NOT_FOUND | 404 | 资源不存在 |
| BAD_REQUEST | 400 | 请求参数错误 |
| RATE_LIMITED | 429 | 请求频率过高 |
| INTERNAL_ERROR | 500 | 服务器内部错误 |
| SESSION_NOT_FOUND | 404 | 会话不存在 |
| SESSION_DELETE_CURRENT | 400 | 不能删除当前会话 |
| TERMINAL_NOT_FOUND | 404 | PTY 不存在 |
| PROCESS_NOT_FOUND | 404 | 进程不存在 |
| PATH_REQUIRED | 400 | 缺少 path 参数 |
| PATH_NOT_DIRECTORY | 400 | 路径不是目录 |
| INSUFFICIENT_STORAGE | 507 | 磁盘空间不足 |
| RUN_NOT_FOUND | 404 | 执行不存在 |
| PLATFORM_UNSUPPORTED | 400 | 不支持的 Webhook 平台 |
| SIGNATURE_INVALID | 403 | 签名验证失败 |