04.3 上下文附件与建议系统
关注源码
src/context.tssrc/utils/attachments.tssrc/services/PromptSuggestion/promptSuggestion.ts
上下文不是只靠 messages
进入模型的内容除了对话消息,还包括大量动态注入的上下文和附件,例如:
- git 状态
- CLAUDE.md
- 当前日期
- memory files
- agent list
- task delta
- MCP instructions delta
- LSP diagnostics
- 计划文件
- IDE 选区
这些大多由 utils/attachments.ts 组织。
attachments.ts 的角色
这个文件本质上是“上下文编排器”,它会统一处理:
- 文件类附件
- 图片/document 附件
- 任务附件
- memory / CLAUDE.md 注入
- toolSearch / MCP delta 注入
- skill listing / agent listing 注入
也就是说,很多看似零散的上下文能力,最后都在这里汇合成可发送给模型的 message/attachment。
为什么附件层很重要
因为它决定了:
- 模型到底看见哪些辅助信息
- 信息是以内联文本、附件还是 delta 的形式出现
- 哪些内容在 compact 后会被重新注入
它其实是 system prompt 之外的第二条上下文总线。
Prompt Suggestion
PromptSuggestion/promptSuggestion.ts 负责下一条 prompt 建议,触发时会检查:
- 是否交互式会话
- 是否 leader 而非 teammate
- 是否被 settings / gate 关闭
- 当前是否有 pending permission / elicitation
- 当前是否处于 plan mode
真正生成建议时也走 forked agent,并复用 cache-safe params。
Suggestion 与 Speculation 的关系
Prompt suggestion 只负责“给出建议文本”。
如果 speculation 开启,则会在建议生成后进一步:
- 预跑可能的后续结果
- 把推测结果存进 AppState
- 在用户接受建议时节省响应时间
因此 suggestion 是 UI 功能,但实现上仍然与 runtime/fork/cache 强耦合。
设计上的关键点
1. context 注入是统一编排,而不是多个模块各自写 prompt
这有助于控制缓存稳定性和上下文体积。
2. 建议系统建立在同一运行时之上
它不是简单模板匹配,而是复用 agent runtime 获取高质量建议。
3. attachment 层连接了记忆、任务、MCP、技能与 UI
很多系统把这些能力分散在不同 feature 中,这里则把它们统一成模型可消费的上下文入口。