Qwen Code 架构与包边界
区分直接 agent 执行、ACP 运行时及 HTTP 客户端,定位扩展和状态责任。
Qwen Code 的多个界面共用核心 agent 逻辑,但并不都通过 daemon。理解进程和包边界,有助于判断一个问题属于显示、传输、权限还是模型运行。
两条执行路径
flowchart LR
T[交互 TUI / Headless / query] --> CLI[CLI host]
CLI --> CORE[Core agent 与工具]
U[Web Shell / IDE / 渠道 / 自定义客户端] --> SDK[Daemon SDK 或 HTTP]
SDK --> D[qwen serve]
D --> B[ACP bridge]
B --> ACP[qwen --acp]
ACP --> CORE
CORE --> M[模型提供商]
CORE --> MCP[MCP 服务]
CORE --> FS[主机文件与进程]直接 TUI/headless 构造并运行 core;ACP 模式通过传输托管 core,既可由编辑器直接驱动,也可被 qwen serve 包装为 HTTP/SSE。独立 qwen channel start 可直接使用 ACP bridge,不要求经过 daemon。
主要包
| 路径 | 责任 |
|---|---|
| packages/cli | 可执行入口、参数、配置组装、Ink TUI、headless、ACP、serve 与命令适配 |
| packages/core | agent loop、provider、上下文、工具、权限、会话、记忆和共享服务 |
| packages/acp-bridge | child/通道生命周期、会话复用、事件、权限协调和文件接口接缝 |
| packages/sdk-typescript | query 进程调用、HTTP/SSE 客户端与 transcript 投影 |
| packages/web-shell | React 状态层和浏览器 UI |
| packages/web-templates | 可嵌入的 JavaScript/CSS 模板字符串 |
| packages/channels | 通用渠道 runtime 和平台适配器 |
| packages/sdk-java、packages/sdk-python | 各语言程序接口 |
Desktop、VS Code Companion、Chrome Extension、Zed Extension 适配各自宿主;audio-capture 提供原生麦克风采集,cua-driver/mobile-mcp 通过 MCP 类边界连接桌面与移动设备。integration-tests 覆盖端到端路径,scripts 管构建、发布和仓库维护。
跨包依赖应使用公开 exports,不通过相对路径导入另一个包内部源文件。
core 与显示层
CLI 解析参数并合并用户、工作区、环境和默认设置,必要时准备 sandbox,再启动目标模式。core 接收解析后的配置,构建模型请求、更新历史、执行权限判断和工具循环,返回结构化事件。
core 不决定 TUI 怎么画、浏览器怎么传输;平台格式、卡片、编辑器 diff 和宿主事件留在 adapter。共享 agent 行为放 core,wire/transport 行为放 bridge、SDK 或 daemon,避免平台细节反向渗入通用工具。
daemon 的运行时归属
daemon 先认证并解析 owning workspace,再交给该运行时的 bridge/ACP child。每个活跃可信工作区有自己的 bridge 与 child;会话和客户端复用在该边界内完成。bridge 可在生产接真实子进程,在测试接内存通道。
这是一种运行时分区,不代表工作区成为操作系统沙箱或不同 bearer 的权限域。API 和 agent 文件工具的实际边界、主机凭据可见性及共享认证见工作区和文件访问。
扩展点与状态
MCP 扩展工具、prompt 和资源,Extensions/Skills 包装复用行为,Channels 连接外部消息,SDK/UI adapter 把公共事件投影到自定义应用。直接会话通过 core 服务保存历史;daemon 负责把外部操作路由到工作区,而 live agent 执行仍由 ACP child 持有。
新增适配器优先复用公开契约,不直接导入服务端实现来规避能力检查或生命周期管理。