@@ -44,7 +44,7 @@ qwen-code 当前把 **Ctrl+O 绑定为 `TOGGLE_COMPACT_MODE`**:一个**全局
4444| 块级状态 | ❌ 无 | ✅ ` expandedKeys ` (按 tool_use_id/uuid) | ✅ ` ToolActionsContext.toggleExpansion ` |
4545| 退出方式 | 再按 Ctrl+O 切回 | 再按 Ctrl+O / Esc 回 prompt | 再按 Ctrl+O 收起 |
4646
47- **qwen 的"新现状底座"= #5661 的 type-based partition 模型(本方案的起点,不是要推翻的旧基线):** #5661 把工具组默认渲染从"靠 `compactMode` 全显/全隐"演进为 **按工具类型分区折叠**——`forceExpandAll` 为假时,`collapsibleTools`(read/search/list,经 `isCollapsibleTool(name)`,非 Canceled)折叠成 `CompactToolGroupDisplay` 分区摘要行(按 `CATEGORY_ORDER`:command /read/edit/write/search/list /agent/other 聚合,如 `Read 3 files, edited 2 files`),`nonCollapsibleTools`(edit/write/command/agent + Canceled)**始终逐个** `ToolMessage`;force 条件(确认/错误/聚焦 shell/用户发起/终端子代理)令 `forceExpandAll=true` → 全部逐个展开。**该模型与 `compactMode` 无关**——`compactMode` 在 #5661 中已不影响工具渲染(仅残留影响思考块)。本方案在此底座上**保留整个 type-based partition 机制不动**,只删除残留的全局 `compactMode` 开关,并叠加 transcript 的 `fullDetail`(置 `forceExpandAll=true`)。
47+ **qwen 的"新现状底座"= #5661 的 type-based partition 模型(本方案的起点,不是要推翻的旧基线):** #5661 把工具组默认渲染从"靠 `compactMode` 全显/全隐"演进为 **按工具类型分区折叠**——`forceExpandAll` 为假时,`collapsibleTools`(read/search/list,经 `isCollapsibleTool(name)`,非 Canceled)折叠成 `CompactToolGroupDisplay` 分区摘要行(按 `CATEGORY_ORDER`:search /read/list/command/edit/write /agent/other 聚合,如 `Read 3 files, edited 2 files`),`nonCollapsibleTools`(edit/write/command/agent + Canceled)**始终逐个** `ToolMessage`;force 条件(确认/错误/聚焦 shell/用户发起/终端子代理)令 `forceExpandAll=true` → 全部逐个展开。**该模型与 `compactMode` 无关**——`compactMode` 在 #5661 中已不影响工具渲染(仅残留影响思考块)。本方案在此底座上**保留整个 type-based partition 机制不动**,只删除残留的全局 `compactMode` 开关,并叠加 transcript 的 `fullDetail`(置 `forceExpandAll=true`)。
4848
4949** Claude Code 的实际机制(来自 ` claude-code ` 打包源码取证):**
5050
@@ -293,10 +293,10 @@ transcript 走 alt-screen 接管整屏,但后台对话仍在跑——这带来
293293### B. 修改
294294
295295| 文件 | 动作 |
296- | -------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --- |
296+ | --- | --- |
297297| ` packages / cli / src / config / keyBindings .ts ` | 删 ` TOGGLE_COMPACT_MODE ` ;加 ` TOGGLE_TRANSCRIPT = ' toggleTranscript' ` ,默认绑 Ctrl+O;保留 ` SHOW_MORE_LINES ` (Ctrl+S) 不动;启动时检测用户 keybindings 是否残留 ` toggleCompactMode ` 绑定,若有则提示迁移到 ` toggleTranscript ` (§6) |
298298| ` packages / cli / src / ui / keyMatchers .ts ` | 同步增删 matcher |
299- | ` packages / cli / src / ui / AppContainer .tsx ` | 删 ` compactMode / compactInline / setCompactMode ` 状态、 ` CompactModeProvider ` 、Ctrl+O 旧分支、 ` compactToggleHasVisualEffect ` 调用;加 ` isTranscriptOpen ` (canonical useState,§4.2)+ ` isTranscriptOpenRef ` + ` transcriptFreeze ` + ` toggleTranscript / openTranscript / closeTranscript ` ;全局 Ctrl+O→ ` toggleTranscript ` ;Esc/q/Ctrl+C **handleGlobalKeypress 第一分支**关闭(早于 QUIT/EXIT/ESCAPE 及 vim INSERT 守卫,§4.3); ` useEffect ` 监听**全部阻塞确认/对话框**自动关闭(§4.6 #1);消息队列 drain 守卫加 ` | | isTranscriptOpenRef .current ` (§4.6 #3); ` refreshStatic ` 用 ` isTranscriptOpenRef ` 守卫、退出时重绘一次(§4.4)。**不并入 ` dialogsVisible ` ,不改 ` useDialogClose ` \*\* |
299+ | ` packages / cli / src / ui / AppContainer .tsx ` | 删 ` compactMode / compactInline / setCompactMode ` 状态、 ` CompactModeProvider ` 、Ctrl+O 旧分支、 ` compactToggleHasVisualEffect ` 调用;加 ` isTranscriptOpen ` (canonical useState,§4.2)+ ` isTranscriptOpenRef ` + ` transcriptFreeze ` + ` toggleTranscript / openTranscript / closeTranscript ` ;全局 Ctrl+O→ ` toggleTranscript ` ;Esc/q/Ctrl+C **handleGlobalKeypress 第一分支**关闭(早于 QUIT/EXIT/ESCAPE 及 vim INSERT 守卫,§4.3); ` useEffect ` 监听**全部阻塞确认/对话框**自动关闭(§4.6 #1);消息队列 drain 守卫加 ` \ | \ | isTranscriptOpenRef .current ` (§4.6 #3); ` refreshStatic ` 用 ` isTranscriptOpenRef ` 守卫、退出时重绘一次(§4.4)。**不并入 ` dialogsVisible ` ,不改 ` useDialogClose ` \*\* |
300300| ` packages / cli / src / ui / contexts / UIStateContext .tsx ` | **surface**(只读投影) ` isTranscriptOpen ` 、 ` transcriptFreeze ` ——canonical 仍在 ` AppContainer ` useState,此处仅暴露给消费者(与现有 dialog 状态同模式,§4.2) |
301301| ` packages / cli / src / ui / contexts / UIActionsContext .tsx ` | 加 ` toggleTranscript / closeTranscript ` |
302302| ` packages / cli / src / ui / hooks / useDialogClose .ts ` | **不改动**(transcript 不走此路径,Esc 在全局前置分支处理,见 §4.3) |
@@ -399,7 +399,7 @@ transcript 走 alt-screen 接管整屏,但后台对话仍在跑——这带来
399399### #5661 type-based partition 基线取证(本 PR 保留并叠加,符号名以**已合入 main** 的真实代码为准)
400400
401401- ** ` ToolGroupMessage .tsx ` ( ` forceExpandAll ` + 分区决策)**: ` forceExpandAll = hasConfirmingTool || hasSubagentPendingConfirmation || hasErrorTool || isEmbeddedShellFocused || isUserInitiated || hasTerminalSubagent ` (**不含 ` compactMode ` / ` allComplete ` **)。 ` collapsibleTools = forceExpandAll ? [] : inlineToolCalls .filter (t => isCollapsibleTool (t .name ) && t .status !== Canceled )` ; ` nonCollapsibleTools = forceExpandAll ? inlineToolCalls : 其余` 。全 collapsible 组 → ` <CompactToolGroupDisplay >` ;混合组 → 摘要行 + 逐个 ` <ToolMessage >` ;对 ToolMessage 逐个传 ` forceShowResult = {isUserInitiated || Confirming || Error || isAgentWithPendingConfirmation || isTerminalSubagentTool }` 。**本 PR 叠加**: ` forceExpandAll = fullDetail || ... ` 、 ` forceShowResult = fullDetail || ... ` 、fullDetail 时 ` availableTerminalHeight = undefined ` 。
402- - ** ` CompactToolGroupDisplay .tsx ` (分区摘要渲染器 + ` isCollapsibleTool ` )**:导出 ` ToolCategory ` 、 ` TOOL_NAME_TO_CATEGORY ` 、 ` CATEGORY_ORDER ` ( ` command / read / edit / write / search / list / agent / other ` )、 ` getToolCategory ` 、 ` buildToolSummary ` 、以及 ** ` isCollapsibleTool ( name ) ` **(判定 read/ search/list) 。本 PR **保留**。
402+ - ** ` CompactToolGroupDisplay .tsx ` (分区摘要渲染器 + ` isCollapsibleTool ` )**:**导出**( ` export ` ) ` getOverallStatus ` 、 ` isCollapsibleTool ( name ) ` (判定 read/search/list)、` buildToolSummary ` 、 ` CompactToolGroupDisplay ` ;**内部符号 **(非导出,仅文件内使用) ` ToolCategory ` 、 ` TOOL_NAME_TO_CATEGORY ` 、 ` CATEGORY_ORDER ` (实际顺序 ` search / read / list / command / edit / write / agent / other ` )、 ` getToolCategory ` 。本 PR **保留**。
403403- ** ` ToolMessage .tsx ` ( ` shouldCollapseResult ` gate)**: ` shouldCollapseResult = ! forceShowResult && status === ToolCallStatus .Success && isCollapsibleTool (name ) && (effectiveDisplayRenderer .type === ' string' || ' ansi' )` (**注意 ` isCollapsibleTool (name )` 守卫**:仅 read/search/list 的 string/ansi 结果折叠,Shell/Edit/Agent 结果始终显示;diff/plan/todo/task 走各自 renderer);高度约束符号: ` MaxSizedBox ` 、 ` sliceTextForMaxHeight ` 、 ` shellOutputMaxLines ` / ` shellStringCapHeight ` 、 ` isCappingShell ` (被 ` ! forceShowResult ` 解除)。本 PR **保留** gate,叠加 fullDetail/点击展开联动( ` forceShowResult = true ` + ` availableTerminalHeight = undefined ` ,无需改 ` ToolMessage ` 本体)。
404404- **更正(早期文档基于 state-based 快照的错误断言)**:早期版本曾断言"**没有** ` forceExpandAll ` / ` isCollapsibleTool ` "——**事实相反,这两个符号是 #5661 合入实现的核心,确实存在**。 ` shouldForceFullDetail .ts ` / ` COLLAPSIBLE_CATEGORIES ` 不存在(force 语义内联在 ` forceExpandAll ` ,分区类别内联在 ` TOOL_NAME_TO_CATEGORY ` / ` isCollapsibleTool ` ),以真实代码为准。
405405
0 commit comments