Claude Code 长会话工程总览
这页回答什么
为什么 Claude Code 看起来不只是一个
query() + tools的 agent,而更像一套能长期运行、不断自我修补、把后台结果重新注回上下文的工程系统?所谓“长会话工程”到底包括哪些横切机制?
这页不试图替代各单页 walkthrough,而是把已经确认的横切能力收束成一张更高层的图。
一句话结论
Claude Code 的成熟度,不主要体现在“能调很多工具”,而在于它围绕 长会话持续运行 建了一整套横切机制:prompt cache 稳定性、上下文压缩、前台到后台切换、任务回流、shell 持久化输出、失败后的安全收口与重试空间。
更直接一点说:
query()是心脏,但长会话工程才是循环能活得久的器官系统。
1. 为什么需要“长会话工程”这个视角
如果系统只回答一次简单问题,那这些机制很多都不重要。
但 Claude Code 要处理的是:
- 多轮对话
- 大量 tool call
- 子 agent / fork / remote agent
- 长时间运行的 shell / monitor
- 可能中途 background 化的任务
- 用户随时插入新消息
- token / context window /缓存成本约束
一旦系统目标变成“持续运行的工程型 agent”,关注点就会从“这次调用对不对”变成:
- 上下文怎么活得久
- 输出怎么不丢
- 后台任务怎么回流
- 阻塞怎么解耦
- 失败怎么不把整轮对话打死
- token 成本怎么不爆炸
所以这里的核心问题不再只是功能,而是可持续运行性。
2. 第一根主骨架:query() 统一循环
Claude Code 的大前提始终没变:
- 主 agent 走
query() - 子 agent 也走
query() - 后台任务完成后,最终仍回到
query()
这意味着长会话工程不是另起一套 runtime,而是围绕同一个主循环,增加各种:
- 前缀稳定性约束
- 回流协议
- 生命周期壳
- 结果缓冲层
所以更准确的说法是:
Claude Code 不是“一个循环 + 一堆外挂”,而是“一个循环 + 一套使其长期可持续运行的横切补偿机制”。
3. prompt cache:为长会话降成本的前缀稳定工程
Prompt cache 设计 已经说明:Claude Code 很在意 cache-critical prefix 的字节稳定性。
这会反过来影响很多架构决策:
- fork child 尽量继承父
renderedSystemPrompt - 工具集合强调排序稳定
useExactTools避免工具池重组- replacement state 倾向 clone 而不是 fresh
- 差异尽量压到前缀末尾
这套设计的意义不只是“快一点”,而是:
在多轮、多 agent、长上下文场景下,不让每一轮都从零烧 token。
所以 prompt cache 在这里属于基础设施,而不是小优化。
4. Task 系统:为长时任务提供生命周期壳
Task 系统总览 已经确认:
runAgent()负责执行- Task 层负责生命周期
这里的 Task 并不是附属 UI 状态,而是长会话工程的关键层。它承接的是:
- 后台 agent
- remote agent
- shell / monitor
- progress
- output file
- kill / completion / failure
- 恢复与通知
也就是说,Task 层回答的是:
一个还没结束、但已经脱离当前 tool call 的执行体,如何继续被系统管理?
这正是长会话系统必须有的中间层。
5. foreground → background:把阻塞从当前调用栈里拆出去
这条机制在 agent 和 shell 两边都成立,只是 execution shell 不同。
agent 侧
foreground 到 background 热切换机制 说明:
- sync agent 一开始就注册成可背景化 task
- 真切后台时,不是简单改 flag
- 而是结束 foreground iterator,再重启 async lifecycle
shell 侧
ShellCommand TaskOutput LocalShellTask 后台执行模型 说明:
- 前台 shell 由
BashToolinline 消费 - 后台化时,不重跑命令
- 而是把同一个
shellCommand的 ownership 移交给LocalShellTask
两者共同点很清楚:
Claude Code 遇到长时阻塞,不是“卡死当前 turn”,而是把执行体迁移到后台生命周期壳里,让主循环继续保持响应。
这就是长会话工程最核心的 responsiveness 机制之一。
6. task-notification 回流:让后台世界重新进入主对话
后台任务如果只是默默跑完,系统其实并没有真正“闭环”。
Claude Code 的做法是统一回流:
- LocalAgentTask 终态发 notification
- RemoteAgentTask 终态发 notification
- LocalShellTask 终态发 notification
- shell stalled prompt 也能发 statusless notification
然后:
messageQueueManager入队query.tsturn 尾 drainattachments.ts转queued_commandmessages.ts再包装成 reminder 风格 user message- 下一轮模型真正看到它
所以长会话工程的关键不是后台任务本身,而是:
后台执行结果如何重新变成主循环可消费的上下文。
没有这一层,后台只会变成黑洞。
7. output file / TaskOutput:让长时输出有稳定落点
长会话里另一个现实问题是:
- 输出可能很长
- 执行可能很久
- 当前 turn 不一定等得完
- UI / 模型 / tools 可能在不同时间读取同一份结果
TaskOutput 解决的是这个问题。
它提供:
- file mode / pipe mode 统一输出账本
- 小输出 inline,大输出给路径
- shared poller 提供 progress
- background shell 的 watchdog 防爆盘
- 输出文件成为 UI、Read tool、task-notification 共用的事实源
这让 Claude Code 的长会话输出不是 ephemeral stream,而是:
可复读、可回流、可延后读取、可供多层消费的持久化对象。
8. 失败与异常不一定抛给用户,而是优先内部收口
目前已确认的设计里,能看到明显的“先内部消化”的倾向:
- shell
interrupt不直接 kill,优先给后台化机会 - shell stalled prompt 先发中间事件,而不是误关任务
- 后台化与完成抢跑时,会修补竞态,避免双重结果
- output file 丢失时,不静默空返回,而是生成 diagnostic 文本,避免模型被误导
- shell cleanup 会显式拆 listener / child / abort 引用,避免后续微任务崩溃与泄漏
这说明系统的目标不是“任何异常都冒泡”,而是:
先把长会话维持住,再尽量把异常转成可理解、可恢复的结构化信息。
这正是工程型 agent 和 demo 型 agent 的分水岭之一。
9. shell / agent / remote 的“中间执行壳”不同,但横切协议在收敛
中间执行层其实并不统一:
- local sync agent 走
runAgent()inline - local async agent 走
LocalAgentTask - remote agent 走 remote session + polling
- shell 走
ShellCommand + LocalShellTask
但它们在长会话工程上的协议正在收敛:
- 都会进入 task 系统或 task-like 管理层
- 都有 output file / transcript 路径
- 都会发
task-notification - 都会在 turn 尾部重新进入主循环
所以这套系统不是“执行引擎统一”,而是:
执行中层各不相同,但长会话治理协议越来越统一。
10. 用这个视角重看 Claude Code 架构
如果只看 Claude Code 架构总览,会得到一张经典图:
- QueryEngine
- query
- Tool
- AgentTool
- Task
但加上长会话工程视角后,会更接近下面这个理解:
核心心脏
query()主循环
成本控制
- prompt cache 稳定性
- 未来还应继续补压缩流水线
生命周期治理
- Task 系统
- foreground/background 切换
- remote / local / shell 的后台托管
结果回流
- task-notification
- queue
- attachment
- next query context
输出持久化
- output file
- transcript symlink
- TaskOutput
韧性机制
- interrupt 不粗暴 kill
- stalled prompt 识别
- 竞态修补
- cleanup ownership 明确化
所以这不再只是“模块图”,而是一张持续运行系统图。
当前仍待补的部分
这页目前仍是不完整总图,至少还缺:
- 上下文压缩流水线的源码级落点
- QueryEngine / query 层的失败恢复与重试路径
- memory / skills / plan mode 在长会话中的真正作用
- print / UI / collapse 层如何帮助用户承受长时任务噪音
但就当前已确认部分,至少可以先稳定地说:
Claude Code 的产品级完成度,来自一组围绕“长会话持续运行”构建的横切工程能力,而不只是 tool call 数量。
与其他页面的关系
- Claude Code 架构总览 给模块总图
- Prompt cache 设计 给成本与前缀稳定视角
- Task 系统总览 给生命周期视角
- task-notification 到 attachment 回流序列图 给统一回流协议
- foreground 到 background 热切换机制 给 agent 热切换机制
- ShellCommand TaskOutput LocalShellTask 后台执行模型 给 shell 路径的细部模型