Daemon 内部实现
定位 HTTP、ACP、事件、审批和 MCP 生命周期的实现责任。
这一组面向修改或排查 Qwen Code daemon 内部实现的开发者。运行服务先看Daemon 使用与运维,应用开发先看SDK。
进程与信任边界
flowchart LR
C[HTTP 与 SSE 客户端] --> H[Serve HTTP 运行时]
H --> B[工作区 ACP Bridge]
B --> A[qwen --acp 子进程]
A --> M[工作区 MCP 连接池]
M --> S[MCP 服务]
B --> E[各会话 EventBus 与审批协调]每个活动 workspace runtime 有自己的 bridge 和 ACP child,不在不同工作区之间共享。HTTP/SSE 终止于 daemon,模型与工具执行发生在 child;两者通过 ACP stdio 连接。ACP 不是客户端访问 daemon 的 REST 协议。
默认 single scope 复用一个逻辑会话,thread scope 按对话拆分。会话拆分不自动成为操作系统隔离或完整多租户授权边界。
按问题进入
- 启动与关闭:配置验证、内部 hosting 生命周期和退出证明。
- HTTP 中间件:认证、Origin、日志与路由检查顺序。
- ACP Bridge:工作区运行时、队列、channel factory 与早期事件。
- Bridge 生命周期:预热、空闲回收、恢复超时与关闭。
- 审批协调:四种策略、quorum 和请求状态。
- 审批传输与身份:REST/ACP 标识、取消与授权检查。
实现位置
| 责任 | 主要路径 |
|---|---|
| 启动和 Express 组装 | packages/cli/src/serve/run-qwen-serve.ts、server.ts |
| bridge、会话、审批和 EventBus | packages/acp-bridge/ |
| MCP pool、entry 与 workspace budget | packages/core/src/tools/ |
| HTTP/SSE SDK 和共享 transcript | packages/sdk-typescript/src/daemon/ |
| Web Shell 消费者 | packages/web-shell/client/daemon/ |
内部 F1/F2/F3/F4 是上游实现里程碑,不是用户套餐或协议版本。修改行为时仍应核对 capability 与具体来源,而不能只依据里程碑名称。
阅读旧说明的边界
上游索引保留了一些过时总述,例如“只有 TypeScript 提供 daemon client”;当前Java SDK已经有 daemon 路径。UI 事件数量也随增量接口变化,不应把索引中的固定数字当作完整契约。
TUI、IDE 与渠道的历史适配草案和当前共享 UI 文档并存。新工作按具体实现与客户端适配边界判断,不能把拟议入口或计划迁移直接写成默认产品行为。
MCP 与文件服务
会话与事件协议
-
Capability 与版本:逐项预检和条件广告。
本节文档
- Serve 启动与关闭理解配置校验、工作区规范化以及内部 hosting 的生命周期绑定。
- HTTP 检查顺序与冷启动定位 Host、Origin、bearer、日志和 JSON 解析各自覆盖的请求。
- ACP Bridge 与执行队列理解工作区 child 复用、prompt FIFO、模型切换和早期事件缓冲。
- Bridge 回收与恢复边界避免关闭竞态,理解恢复超时、隔离新会话和有界 replay。
- 多客户端审批策略配置 first-responder、designated、consensus 或 local-only,并理解默认等待。
- 审批标识与跨连接投票区分 ACP 连接内 JSON-RPC ID、bridge requestId 和会话绑定。
- MCP 连接池与生命周期理解共享 transport、会话视图、重启以及空闲回收的实际条件。
- MCP 配置指纹与隔离判断哪些变化创建新连接,哪些过滤仍可共享 transport。
- Workspace MCP 预算控制按服务名预留名额,理解滞回警告、批量拒绝和不同管理路径。
- WorkspaceFileSystem 的读写边界区分 HTTP 文件访问、同机 ACP 工具例外与有限窗口读取。
- 文件错误、审计与 ACP 传递按 errorKind 区分路径、权限、并发、内容和系统 I/O 故障。
- 会话生命周期与客户端身份区分 create、attach、load、resume、detach 和会话终止。
- 会话归档、删除与持久化证明处理活动与归档冲突、严格 flush 和不能自动修复的所有权异常。
- Daemon worktree 恢复与所有权转移理解 marker 证明、superseded 会话和 task reset 的失败边界。
- Prompt 接纳、队列与终态用 promptId 区分已接纳、取消请求、执行结束和恢复出的历史结果。
- Daemon 事件封套与状态投影区分 wire envelope、ACP metadata、会话状态和前向兼容。
- SSE 重连、Epoch 与重同步保留事件游标和 bus epoch,处理四类缺口并区分历史裁剪。
- SSE 背压与慢客户端区分帧数、字节、重放预算和 MCP App 文本降级。
- Capability 预检与版本契约按具体行为检查特性标签,区分协议、封套和事件版本。