各文件的职责见头注释,头注释之外:
index.ts的toolDefinitions同时供子代理全过程视图渲染子会话的工具行;TUI 会话安装分组,退出释放。host.ts另含ChatMirror(供不在主聊天里的投影造同一套组件)与detachedTui(给这类投影的工具行一个独立 TUI 句柄,主会话分组补丁不把它们当自己的行)。grouping.ts:发现聊天容器时自检形状,不符就不安装并提示,渲染中途不符整体退回原生。group-view.ts:轮界、摘要行、中间回复规则见其注释。turn-summary.ts:会话进行中的事实由投影环境的busy()拉取(主会话取busy.ts的busyView,子代理视图取自己的会话事件),不记时长。round.ts:投影按能力识别零行标记组件;一轮多条的合成规则(combineRounds)在根round.ts,摘要行与输入框外壳都经它读,resume 后仍有数。line.tsparts.tsactions.ts:单工具行、着色片段与动作词/目标,Master 活动列表复用其中的纯渲染部分。click-anchor.ts主会话与子代理视图共用。
改分组前核对宿主 ToolExecutionComponent、AssistantMessageComponent、Container 和 TUI 动态引用;读宿主私有字段只能经 host.ts。子会话不注册工具渲染(无界面)。
原消息与聊天树不改写、不搬移;渲染与鼠标命中使用同一投影。两档展示直接读取 getToolsExpanded(),
不拦截快捷键。过程列表保留原生思考组件与其展开设置;单工具正文仍由宿主工具行持有,其他卡片保持原生行为。
轮界只从聊天树推出、不另存状态,resume 后一样;开轮的用户消息是点击展开该轮的状态键。点击某轮摘要只是相对全局档位的覆盖,
ctrl+o 切全局档位时清空所有覆盖并复位被点开的原生卡片。机器消息(内容为信封的 CustomMessage)一律一行,
点击切换原生卡片;全局展开不平铺它们:包装了 CustomMessage 的 setExpanded,原生展开只放行投影点开登记过的
(host.ts 的 openCard,主会话与子代理视图同一机制)。机器消息的失败色只认生产端声明的事实,消费端不按标题文字判断成败(口径见 master/event-format.ts)。
用户消息一律是人类输入(子代理视图里是 Master 派的活),是轮界;插件的事件与提示都是 CustomMessage,属于过程。
段内还可能出现整行单色 Text:宿主把 transcript 提示画成 warning、状态行画成 dim,颜色是它唯一给出的语义通道
(只折入有工具或思考的段,warning 计入 ⚠ N;无摘要行可依附时保持原样,避免为提示凭空造摘要行顶开回复);错误、混色文本与其余节点仍是段边界。
宿主 CustomEntry 有段可依附时属于本轮(轮记录零行)。重载中途的那一段没有记录,只有 ✓。思考块不计次数或耗时;纯思考的段留 ✓ 摘要行,
思考结束不消失,避免回复上移;助手的错误、中断和截断诊断始终保留。
摘要行不铺工具背景色,没有按类计数与展开符号。当前动作词与目标由工具行的
actionWord / actionTarget 能力提供,按能力而非类身份选择,避免扩展多次加载产生的 ToolLine 副本不相等;未提供该能力的静态
工具使用通用参数摘要。单工具详情的鼠标事件按裁掉的空行补回坐标后交给宿主。
动效订阅(flame.ts 的 onFrame)只在投影发现有活的摘要或落定过渡时发生,静止即取消。宿主 regular 模式只能改视口内的行,改到视口上方就清屏(含滚动历史)整屏重画,所以该模式下摘要行之下的行数加输入框占用达到终端行数(摘要行已在视口外)时,摘要行画成静止形态(ProjectionEnv.still:不动的火苗、落定直接是终色、不闪到达高亮);fullscreen 模式不受此限。
宿主在助手 contentContainer 的直接子节点中,只把思考包在 MouseRegion。混合消息复用原生正文/错误节点,
独立渲染接收者继承原组件以保留 OSC133 消息跳转与鼠标布局,但只持有自己的 children 和布局缓存。原消息由
宿主失效更新;投影不能调用原生 invalidate 去重建共享子节点,也不复制思考展开状态。
宿主适配只有一个当前所有者,reload 先卸旧再装新;非 TUI 子会话不能安装或卸载主会话投影。借首条用户消息、助手或
工具插入事件定位聊天容器(首条用户消息一出现就带竖条),找到后立即卸掉发现钩子,不包装 requestRender。
耗时列读宿主渲染上下文里的 durationMs(导出 HTML 时没有,不显示)。成功结果未展开时只取长度与耗时,不清洗正文;
错误保留摘要,单工具展开保留原始正文和 edit diff。
极致模式以一次人类输入为单位折叠:用户消息(左侧橙色竖条)下方是一行摘要,思考、所有工具调用(含图片结果与子代理动作)、子代理结果等机器消息、中途说的话都折进去。上一轮还没歇下时你补的话(steer 或等子代理时的追加)也属于这一轮,折叠时与普通用户消息一样带竖条显示全文,只是不再另起一轮。Pi 的单行提示(缓存重计费、丢弃思考块、压缩计费)与状态行也折进有工具或思考的过程组;错误消息照常显示。
摘要下方依次是最近 3 条中间回复的首句(更早的显示为 +N 条;有补话时每条补话后面跟它那一段的回复,各段分别计数;首句规则见 format.ts 的 firstSentence)和最后一条回复全文。
摘要行运行中的当前动作:工具在跑时是动作词加简短目标(cd 到当前目录的前缀省掉),模型在想是“思考中”,在出正文是“回复中”,窄屏先裁目标;一轮从开始到歇下这一行一直在原位,回复不跳。子代理结果到达时短暂显示事件标题(如“fix-auth 已返回”,失败为红);指挥官只在等子代理时只有火苗。实时计时只在输入框上边框一处(见 statusbar/AGENTS.md)。
会话歇下(含等完子代理)后定格为灰色 ✓ 耗时 · 均速(如 ✓ 2m18s · 42 tps;一小时以上写成 1h、4h13m37s);按 Esc 中断或请求失败是红色 ✗ 已中断 · 耗时 / ✗ 请求失败 · 耗时,不带均速。均速只计模型请求耗时(含首字与网络等待)和输出 token(可能含思考),等子代理与工具执行不算;一轮里有请求失败、中断或压缩失败就整轮不显示均速。只有文字回复的轮同样有这一行。工具失败、子代理失败与宿主提示怎么计、怎么追加见 turn-summary.ts 头注释(工具行失败展开后自己标红;宿主提示多条取首条);窄屏先裁原文、再丢耗时、最后丢提示原文。这条事后记录保存在会话里(不发送给模型),resume 后仍然显示。只有思考没有工具的段,摘要行同样是 ✓。
点击某一轮的摘要只展开这一轮;按工具展开快捷键(默认 Ctrl+O)展开所有轮,按时间顺序列出工具、中间回复和 ↳ 标题 · 时长 首句 机器消息行(失败、审查未通过/未完成/停止为红;点击该行看完整内容),再按回到折叠。思考和单工具正文继续使用原生查看方式。