# 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
1
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
1
2
3

多会话对照:

我们:SessionManager.create/select/close/list
真实:RemoteSessionManager + SessionsWebSocket + HTTP POST + WS subscribe
1
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 文件源码树收束到一起。