# Step 72: 源码对照③
一句话导读:把 step64-71 的“无头内核 + 多前端 + 控制消息 + 多会话”放回真实 Claude Code 的 SDK、Bridge、Remote 和 sessionStorage 中校准。
# 一、这一步做了什么(What)
step72 不加新功能,而是对照真实源码:QueryEngine.ts、bridge/replBridge.ts、bridge/sessionRunner.ts、remote/RemoteSessionManager.ts、remote/SessionsWebSocket.ts、entrypoints/sdk/controlTypes.ts、utils/sessionStorage.ts、cost-tracker.ts。
目标是确认 Phase 7 这条路线是否真实:从终端 UI 尝味,到 Web/SSE/WS,到 createCore,到多会话。
# 二、面试官视角:为什么要做?(Why)
面试题:Web demo 已经跑通了,为什么还要看真实 Bridge / Remote 源码?
因为 Phase 7 最容易误判:以为自己做的是“网页聊天框”,实际上真实价值在于多 surface 架构。源码对照能告诉我们哪些抽象对上了真实产品,哪些只是 demo。
| 我们的抽象 | 真实对应 |
|---|---|
QueryEngine.run() | QueryEngine.submitMessage() |
permission_request | control_request can_use_tool |
SessionManager | RemoteSessionManager |
| 前端 histories Map | sessionStorage.ts JSONL |
# 三、原理:它是怎么工作的(How)
对照核心链路:
用户 surface(终端/Web/远端)
→ createCore / QueryEngineConfig 装配
→ QueryEngine 无头循环
→ EngineEvent / SDKMessage
→ Bridge / WebSocket / Remote session
→ control_request 处理权限
→ sessionStorage 记录 transcript
2
3
4
5
6
7
真实 QueryEngineConfig 包含 tools、commands、mcpClients、agents、canUseTool、AppState getter/setter、SDK status、abortController。我们 createCore() 是把这些分散装配压缩成一个教学函数。
权限流对照:
我们:permission_request(id, tool, input) → permission_response(id, allow)
真实:control_request{subtype:"can_use_tool", tool_name, input, tool_use_id}
→ SDKControlResponse
2
3
多会话对照:
我们:SessionManager.create/select/close/list
真实:RemoteSessionManager + SessionsWebSocket + HTTP POST + WS subscribe
2
最大缺口是持久化。真实 sessionStorage.ts 负责 JSONL transcript、parentUuid chain、resume、compact boundary、title、tombstone、修复链路;我们的 Step 71 只有进程内会话和前端展示 Map。
# 四、深入追问(面试常见 follow-up)
Q:step70 的 createCore 在真实源码里有同名文件吗?
A:没有,但形状分散在 QueryEngineConfig、bootstrap、commands、tools、bridge/sdk surface。教学版把装配层浓缩成一个函数。
Q:为什么说权限请求是控制消息?
A:它不是普通输出,而是会阻塞引擎继续执行,需要用户响应。真实 SDK 用 control_request/control_response 统一表达。
Q:Phase 7 最大缺口是什么?
A:sessionStorage。没有 JSONL transcript,就没有真正的 resume、链路修复、成本恢复和跨进程会话管理。
Q:我们的 miniWs 有意义吗?真实源码肯定不会手写吧?
A:意义在理解双向通道和帧协议。真实用成熟实现,并补 OAuth、ping、reconnect、close code 等纵深。
# 五、踩坑 / 设计权衡
源码对照确认:继续堆 UI 视觉不是最高价值,下一步若扩展应优先做持久化、多会话恢复、取消/中断和统一 control envelope。
# 六、与真实源码的对照
| 我们的实现 | Claude Code 源码 |
|---|---|
QueryEngine.run() | submitMessage() async generator |
createCore() | 分散装配层 + QueryEngineConfig |
| WS 权限弹窗 | bridge/sessionRunner control_request |
SessionManager | RemoteSessionManager / SessionsWebSocket |
| 前端 histories Map | sessionStorage.ts transcript |
CostTracker.stats() | cost-tracker restore + model usage |
# 七、一句话总结
step72 证明 Phase 7 的主线不是“做了个网页”,而是走到了真实 Claude Code 的核心形状:无头内核、多 surface、控制消息、多会话和可恢复状态。
# 下一节预告
下一篇跳到 step75 全面源码巡礼:用架构脑图把整个 75 步路线与真实 2039 文件源码树收束到一起。