fix(cli): tighten VP-mode controls footprint and fix shell tool indicator overlap#6931
Conversation
Gate Review (re-run)Template ✓ — all required sections present with substantive content. Problem: Observed rendering issues in VP mode — the sticky task panel and subagent roster crowd the conversation off-screen on short terminals, the tool status indicator collapses into command text on narrow widths, and Ctrl+O crashes the transcript when a tool is in Executing state. All four observable claims were independently reproduced via real-terminal A/B testing (round 4 verification, see screenshots in thread). A fifth fix — Shift+Enter inserting a newline instead of executing/accepting on perfect matches — was also verified with kitty CSI-u keyboard protocol. Direction: Aligned. VP mode is slated to become the default renderer, and these rendering/layout issues are blockers for that transition. The keyboard behavior fix (Shift+Enter) is a real safety improvement — pasting text containing a newline while the buffer held a perfectly-matching command could previously auto-execute it. Size: Not applicable — all changes are within Approach: The five rendering fixes are tightly related and belong together. The Shift+Enter keyboard change is a global input-behavior change (not VP-gated, despite the commit title saying "in VP mode input box") — it's a clean, correct improvement but rides somewhat silently in a "VP rendering" PR. The PR body still hasn't been updated to reflect the height-aware VP caps (it says "at most two/three rows" when the actual range is 2–4 / 3–5) or the Shift+Enter change. This is a hygiene concern, not a blocker. Moving on to code review. 🔍 中文说明门禁审查(重新运行)模板 ✓ — 所有必需章节齐全,内容充实。 问题: VP 模式下可观察到的渲染问题——任务面板和子代理列表挤占对话区域、工具状态指示符在窄终端下与命令文字重叠、Ctrl+O 在工具执行期间导致 transcript 崩溃。四项可观察声明均已通过真实终端 A/B 测试独立验证(第 4 轮验证,见评论区截图)。第五项修复——Shift+Enter 在完全匹配时插入换行而非执行/接受——也已通过 kitty CSI-u 键盘协议验证。 方向: 对齐。VP 模式即将成为默认渲染器,这些渲染/布局问题是过渡的阻碍。键盘行为修复(Shift+Enter)是实际的安全改进。 规模: 不适用——所有改动在 方案: 五项渲染修复紧密相关。Shift+Enter 键盘改动是全局输入行为变更(非 VP 门控,尽管 commit 标题说"in VP mode input box")——改动干净正确,但在"VP 渲染修复"PR 里稍显隐蔽。PR 描述仍未更新以反映高度自适应上限和 Shift+Enter 改动,属于规范性问题,不阻塞。 进入代码审查 🔍 — Qwen Code · qwen3.7-max Reviewed at |
Code Review (re-run at
|
Code Coverage Summary
CLI Package - Full Text ReportCore Package - Full Text ReportFor detailed HTML reports, please see the 'coverage-reports-22.x-ubuntu-latest' artifact from the main CI run. |
|
Confidence: 4/5 — Solid, well-tested fix for real VP-mode rendering issues; only non-blocking hygiene concerns remain. This PR fixes genuine problems that users will hit when VP mode becomes the default — panels crowding the conversation off-screen, an indicator that collapses on narrow terminals, a transcript crash on Ctrl+O, and stale footer measurements during streaming. The Shift+Enter behavior fix is a real safety improvement that closes a paste-hazard (pasting text with newlines while the buffer holds a perfect match could auto-execute). The implementation is clean: height-aware caps shared between render and keyboard sites structurally prevent drift, the transcript fix is minimally invasive (one Remaining concerns (all non-blocking, all flagged in prior review rounds):
None of these warrant blocking a PR whose code is correct, tested, and verified end-to-end. Approving. 中文说明置信度:4/5 — 扎实、经过充分测试的 VP 模式渲染修复;仅剩不阻塞的规范性问题。 本 PR 修复了 VP 模式成为默认渲染器时用户会遇到的真实问题——面板挤占对话、窄终端指示符重叠、Ctrl+O transcript 崩溃、流式回合中 footer 高度过期。Shift+Enter 行为修复关闭了一个粘贴安全隐患。 实现干净:高度自适应上限在渲染端和键盘端共享,结构上防止漂移;transcript 修复最小侵入;footer 重测量依赖开销为零。307 个本地测试全部通过,CI 绿色,人工评审者在此 commit 上的 A/B E2E 验证确认了所有行为声明。 剩余问题(均不阻塞,前几轮已提出):
这些都不足以阻塞一个代码正确、已测试、已端到端验证的 PR。批准合并。 — Qwen Code · qwen3.7-max Reviewed at |
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
LGTM, looks ready to ship. ✅
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Not reviewed: chunk 1 — no agent reported covering these; nobody read them.
— qwen3.7-max via Qwen Code /review
dd1809c to
929eff6
Compare
|
Please do not rebase or force-push to an active PR as it invalidates existing review comments. Note for future reference, the bots always squash all changes into a single commit automatically as part of the integration. 中文请勿对活跃的 PR 执行 rebase 或 force-push,因为这会使已有的评审评论失效。另外,供日后参考:作为集成流程的一部分,机器人始终会自动将所有改动压缩(squash)为单个提交。 |
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Reviewed. Suggestions are inline. Unresolved, please confirm: [Critical] MainContent.tsx:406 — Header invisible when availableTerminalHeight=0: pre-existing defect in main's code, outside this PR's diff (author dropped stale banner commits in rebase). Defect verified in current code but not within PR scope. Not reviewed: chunk 1 — no agent reported covering these; nobody read them.
— qwen3.7-max via Qwen Code /review
929eff6 to
afe80d8
Compare
…pt crash, and scroll clipping
VP mode is slated to become the default renderer. Several UX issues block that:
- Shell tool status indicator overlapped / sat flush against the command text: the indicator Box used minWidth without flexShrink, so Yoga could compress it below its reserved column when the flexGrow'd command sibling applied pressure. Add flexShrink={0} (mirrors ToolElapsedTime in the same row) and reserve 3 columns (glyph + two trailing spaces) so the tool name never sits flush against the glyph.
- Sticky todo panel + live agent panel together consumed the whole viewport, leaving no room for the conversation. In VP mode cap the sticky todo list to 2 items and the live agent panel to 3 rows, freeing ~3 extra rows for the conversation on a 24-row terminal. Introduce LIVE_AGENT_PANEL_VP_MAX_ROWS as the single source of truth for the VP panel row budget, referenced by both the layout (rendered maxRows) and the composer keyboard handler (its candidate window), so the two can't drift. Keep the AppContainer layout-key todo cap in lockstep with the rendered value.
- Ctrl+O transcript crashed ("useStreamingContext must be used within a StreamingContextProvider") whenever the frozen snapshot held a tool in the Executing state: TranscriptView renders as a sibling of <App/>, which owns the StreamingContext.Provider, so the transcript subtree had no provider and the executing tool's spinner threw. Wrap the TranscriptView branch in its own StreamingContext.Provider.
- VP viewport bottom was clipped during a pure streaming turn: the controls height is measured one frame late, and its measure effect's deps omitted the composer's own dynamic height inputs (streamingState, embeddedShellFocused, queued messages, input-area mount). With buffer/todo/agent all steady, the loading block appearing left controlsHeight too small and availableTerminalHeight too large until an unrelated dep re-triggered the measure. Add those deps (excluding the per-second elapsedTime / loading phrase, which don't change row count).
All rendering changes gate on useTerminalBuffer; non-VP rendering is unchanged.
Generated with AI
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
afe80d8 to
985d5f0
Compare
chiga0
left a comment
There was a problem hiding this comment.
— qwen3.7-max via Qwen Code /review
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Reviewed. Suggestions are inline. Not reviewed: chunk 1 — no agent reported covering these; nobody read them.
— qwen3.7-max via Qwen Code /review
Review — head
|
|
@wenshao Thanks for the thorough review. Addressing each point:
All 6 inline review threads have been replied to and resolved. |
Review feedback follow-up: - Extract STICKY_TODO_VP_MAX_VISIBLE_ITEMS (= 2) in todoSnapshot.ts and add getStickyTodoMaxVisibleItemsForMode() as single source of truth for both DefaultAppLayout (render) and AppContainer (layout key), preventing silent drift between the two sites. - CompactToolGroupDisplay.test.tsx mock now uses importOriginal() to keep STATUS_INDICATOR_WIDTH in sync with production. - Add tests for getStickyTodoMaxVisibleItemsForMode (VP cap, non-VP passthrough, floor behavior). - Update PR body to accurately describe which changes are VP-gated vs. apply to both renderers.
All review feedback addressed: inline threads resolved, PR body corrected, VP todo cap extracted as shared constant, test mock fixed.
wenshao
left a comment
There was a problem hiding this comment.
Reviewed. Suggestions are inline.
— qwen-latest-series-invite-beta-v77 via Qwen Code /review
ScreenReaderAppLayout still called getStickyTodoMaxVisibleItems directly, missing the VP-mode cap. VP + screen-reader is a reachable combination, so migrate to getStickyTodoMaxVisibleItemsForMode for consistency.
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Reviewed. Suggestions are inline. Not reviewed: chunk 1 — no agent reported covering these; nobody read them.
— qwen3.7-max via Qwen Code /review
Replace static VP-mode caps with height-aware functions: - Sticky todo panel: was flat 2 rows, now clamp(floor(h/12), 2, 4). Short terminals (<=24 rows) still get 2; tall ones (>=48) get up to 4. - Live agent panel: was flat 3 rows, now clamp(floor(h/10), 3, 5). Short terminals (<=30 rows) still get 3; tall ones (>=50) get up to 5. Both caps stay in lockstep between render and keyboard-nav sites via the same shared functions (getStickyTodoMaxVisibleItemsForMode and getLiveAgentPanelVpMaxRows).
|
Qwen Code review did not complete successfully. Qwen review aborted with an API error before posting comments. See workflow logs. |
All review feedback has been addressed. All 11 inline threads resolved. All CI checks passing. Dismissing stale CHANGES_REQUESTED.
Re-review — head
|
Two key bindings intercepted Shift+Enter before BaseTextInput's NEWLINE handler could run: 1. ACCEPT_SUGGESTION's return binding lacked shift: false, so Shift+Enter was captured as 'accept completion suggestion' whenever the slash-command or @-file completion dropdown was visible. Added shift: false. 2. The isPerfectMatch check used Command.RETURN (no modifier constraints) instead of Command.SUBMIT (which requires shift: false), causing Shift+Enter to submit when the buffer exactly matched a slash command. Changed to Command.SUBMIT.
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Reviewed — no blockers. Suggestions are inline. 1 Suggestion-level finding(s) could not be anchored to the diff; see the terminal output.
— qwen3.7-max via Qwen Code /review
Cover min rows on short terminals, growth with height, max cap on tall terminals, and invalid height fallback.
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
[Critical] MainContent.tsx:406 — Header invisible when availableTerminalHeight=0: VirtualizedList returns empty items when containerHeight=0, so the banner sentinel (AppHeader, DebugModeNotification, Notifications) never renders. Pre-existing defect on main, outside this PR's diff. Author says it is tracked by main's banner implementation. Still stands — not fixed by this diff.
— qwen3.7-max via Qwen Code /review
Same pre-existing MainContent.tsx:406 defect already discussed and resolved in thread PRRT_kwDOPB-92c6Q-uYo. Outside this PR diff. Dismissing as duplicate.
Re-review — head
|
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Reviewed. 2 Suggestion-level finding(s) could not be anchored to the diff; see the terminal output. Unresolved, please confirm: [Critical] MainContent.tsx:413 — Header invisible when scrollContainerHeight=0: pre-existing defect on main's code, outside this PR's diff (author dropped stale banner commits in rebase). Cannot verify from this diff whether VirtualizedList handles height=0 correctly. Not reviewed: reverse audit — no auditor ran (Step 5 builds its prompt with agent-prompt --role reverse-audit; none was recorded, so the pass that looks for what Step 3 missed was skipped).
— qwen3.7-max via Qwen Code /review
wenshao
left a comment
There was a problem hiding this comment.
Reviewed. Suggestions are inline. Unresolved, please confirm: [Critical] MainContent.tsx:413 — pre-existing defect on main (header invisible when availableTerminalHeight=0). MainContent.tsx is not in this PR's diff; the blocker was filed against a previous PR version that included banner commits, which were dropped during rebase. Cannot determine applicability to current diff. Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally.
— qwen-latest-series-invite-beta-v92 via Qwen Code /review
1. Fix stale originalMatchers reference to include !key.shift
2. Add createKey('return', { shift: true }) as negative test case
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Reviewed. 1 Suggestion-level finding(s) could not be anchored to the diff; see the terminal output. Unresolved, please confirm: [Critical] MainContent.tsx:413 — pre-existing defect on main (header invisible when scrollContainerHeight=0). MainContent.tsx is not in this PR's diff; blocker filed against a previous PR version that carried banner commits, dropped during rebase. Multiple prior reviewers confirmed it is outside this PR's scope.
— qwen3.7-max via Qwen Code /review
|
@qwen-code /triage |
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
LGTM, looks ready to ship. ✅
Verification — head
|
| # | Finding | Status |
|---|---|---|
| 4 | keyMatchers test gap | ✅ fixed in 2fc8fe0a0 (originalMatchers gains !key.shift; return+shift negative case added). The InputPrompt-level "perfect match + Shift+Enter → newline" unit case is still absent — the E2E above now pins the behaviour, but a unit test would keep it pinned in CI |
| 1 | PR body stale | ❌ still open — the body still says fixed "at most two/three rows" (actual: height-aware 2–4 / 3–5) and still omits the Shift+Enter change entirely (which is global, not VP-gated) |
| 2 | liveAgentPanelVisibility.ts stale "No caller overrides … today" sentence |
❌ open — now contradicted by this PR's own DefaultAppLayout maxRows (the paragraph the PR adds below it is accurate; the old sentence should go) |
| 3 | todoSnapshot.ts "[2, 4]" comment vs min-with-base |
❌ open — clampStickyTodoVisibleItems floors at 1, so sub-10-row terminals can render a single row despite the comment (behavioural impact nil) |
| 5 | useExportCompletion.ts:271 perfect-match carve-out still RETURN while the handler moved to SUBMIT |
❌ open (harmless today) |
| 6 | ACCEPT_SUGGESTION return entry lacks command: false |
❌ open (Cmd+Enter accepts in the dropdown but newlines everywhere else) |
Verdict
Every behavioural claim in this PR verifies end-to-end at this head, with a clean legacy-renderer A/B showing no regression outside the VP gate. From my side this is merge-ready once the PR body pass (finding 1) lands; findings 2/3/5/6 are ride-along polish that can ship here or in a follow-up.
中文版
验证报告 — head 2fc8fe0a0(本地构建 + 真实终端 A/B)
继第三轮评审之后,本轮对 PR 的各项声明做了完整的本地构建行为验证,作为合并参考。
**方法。**在隔离 worktree 中分别以干净 npm ci 构建本 PR head(2fc8fe0a0)与其和 main 的 merge-base(488a86b2)(Node v22.23.1,macOS)。用真实 PTY(node-pty + headless xterm)驱动构建产物 packages/cli/dist/index.js --yolo,对接脚本化的 OpenAI 兼容 mock 服务(SSE 工具调用:12 项 todo_write、长驻 run_shell_command sleep)。VP 模式通过隔离 $HOME 中的 ui.useTerminalBuffer: true 开启;Shift+Enter 探针完成了 kitty CSI-u 键盘协议协商(确认 CLI 发出 ESC[>1u 后才发键)。两个构建使用完全相同的驱动脚本。
A/B 结果 — 四项可观察声明全部复现
**1. Shell 工具 Executing 期间按 Ctrl+O(VP 模式,100×30)。**main 上冻结快照里的 Executing spinner 抛错 — transcript 显示错误回退:"Failed to render transcript. useStreamingContext must be used within a StreamingContextProvider"(严格说是被捕获的渲染失败而非进程退出,但 transcript 同样不可用)。PR 上 transcript 正常渲染,工具行带实时计时 spinner。(见上文截图 1)
**2. VP 模式 sticky 任务面板上限(80×24)。**两个构建跑同一会话:12 项 todo_write 后再进行一轮对话使面板转为 sticky。main 渲染 4 行任务 + "… and 8 more";PR 渲染 2 行 + "… and 10 more" — 正是 min(clamp(⌊24/12⌋, 2, 4), base) = 2,为对话多腾出两行。**旧渲染器回归检查:**同一场景在 useTerminalBuffer: false 下两个构建输出完全一致(4 行 + "and 8 more")— 上限确实只作用于 VP 门内。(见截图 2)
3. 完全匹配命令上的 Shift+Enter(kitty CSI-u)。输入 /help(完全匹配、建议下拉打开)后发送 ESC[13;2u:main 上直接执行命令 — 帮助对话框打开;PR 上落到 NEWLINE:输入框增至两行,不执行任何命令。证实 49a017602 的两半改动(ACCEPT_SUGGESTION shift: false + 完全匹配 RETURN→SUBMIT)在真实终端中协同生效。(见截图 3)
**4. 窄终端下的工具状态指示符(legacy 渲染器,26 列)。**shell 工具运行中:main 预留 2 列(字形 + 1 空格,可被压缩);PR 预留 3 列(字形 + 2 空格)且 flexShrink={0}。说明:在 26–32 列下未能复现字形完全并入命令文本的极端情形(此场景中标题行先换行、指示符 Box 未被挤压),因此"永不重叠"的保证依赖 flexShrink={0} 的语义与更新后的 CompactToolGroupDisplay 断言;拓宽后的预留本身在两种渲染器中均已实证。(见截图 4)
**未做 E2E、由其他层覆盖:**子代理列表上限 + 键盘窗口需要真实子代理,停留在单元层 — getLiveAgentPanelVpMaxRows 边界测试及 InputPrompt 的"面板上按 Enter 映射到实际显示行"测试,本地全部通过。footer 重测量依赖在这些探针中不可直接观察;第 2/3 轮的代码级分析仍然成立,且所有 VP 运行中未出现视口裁剪。
本 head 测试
六个触及/相邻套件本地 307/307 通过(keyMatchers、todoSnapshot、liveAgentPanelVisibility、CompactToolGroupDisplay、StickyTodoList、InputPrompt);CI Test (ubuntu) 在 2fc8fe0a0 为绿。
第三轮发现落实情况
| # | 发现 | 状态 |
|---|---|---|
| 4 | keyMatchers 测试缺口 | ✅ 已修复于 2fc8fe0a0(originalMatchers 补 !key.shift;新增 return+shift 反例)。InputPrompt 层"完全匹配 + Shift+Enter → 换行"的单测仍缺 — 上文 E2E 已钉住行为,但补单测才能在 CI 里长期钉住 |
| 1 | PR 描述过期 | ❌ 仍未修复 — 描述仍写死"最多两行/三行"(实际为随高度伸缩的 2–4 / 3–5),且完全未记载 Shift+Enter 改动(该改动是全局的,非 VP 门控) |
| 2 | liveAgentPanelVisibility.ts 过期注释"No caller overrides … today" |
❌ 未修 — 已被本 PR 自己的 DefaultAppLayout maxRows 推翻(PR 新增的下方段落是准确的,旧句应删) |
| 3 | todoSnapshot.ts "[2, 4]" 注释与 min-with-base |
❌ 未修 — clampStickyTodoVisibleItems 下限为 1,10 行以下终端可能只渲染 1 行,与注释不符(行为影响为零) |
| 5 | useExportCompletion.ts:271 完全匹配豁免仍用 RETURN,主处理器已改 SUBMIT |
❌ 未修(目前无害) |
| 6 | ACCEPT_SUGGESTION return 条目缺 command: false |
❌ 未修(下拉内 Cmd+Enter 接受建议,其他位置均为换行,不对称) |
结论
本 PR 的全部行为声明在该 head 端到端验证通过,legacy 渲染器 A/B 干净,VP 门外无回归。我的判断:PR 描述过一遍(发现 1)后即可合并;发现 2/3/5/6 属顺手打磨,可随本 PR 或后续跟进。
|
@qwen-code /triage |
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
LGTM, looks ready to ship. ✅







What this PR does
Fixes five VP-mode rendering issues, three of which are VP-gated and two of which apply to all renderers:
VP-gated changes:
STICKY_TODO_VP_MAX_VISIBLE_ITEMS,LIVE_AGENT_PANEL_VP_MAX_ROWS) referenced by both the render site and the layout-key / keyboard-nav site, so they cannot drift.Changes that also affect the legacy renderer (safe, not VP-gated):
STATUS_INDICATOR_WIDTHis widened from 2 to 3 columns and the indicator Box usesflexShrink={0}to always keep its reserved column. This gives the legacy renderer one extra column of indent per tool row.TranscriptViewis now wrapped in its ownStreamingContext.Provider. This is a pre-existing crash that affected both renderers.streamingState,embeddedShellFocused,messageQueue.length, andisInputActiveas deps, fixing stalecontrolsHeightthat caused VP viewport bottom clipping during a pure streaming turn. The extra firings are cheap in legacy mode (setControlsHeightno-ops when the height is unchanged).Why it's needed
Viewport mode is slated to become the default renderer, and these problems are visible in everyday use. The overlapping indicator made shell commands hard to read on narrow terminals. The task panel and subagent roster together could fill an entire short terminal, leaving no room for the conversation. The transcript crash on Ctrl+O during a running tool was a real crash in both modes. And stale
controlsHeightcaused the VP viewport bottom to clip during streaming. All needed to be resolved before viewport mode can ship as the default.Reviewer Test Plan
How to verify
Run the CLI with viewport mode enabled on a short terminal (around 24 rows).
Indicator: start a shell command and narrow the terminal to roughly 30 columns. Expected: the status glyph keeps a clear gap before the command text and never overlaps it.
Task panel: create a long todo list (10+ items). Expected: at most two task rows render, followed by an "and N more" line, and the conversation stays visible above the composer.
Subagent roster: launch several background subagents so the roster overflows. Expected: at most three rows render with an overflow hint; navigating up into the roster and pressing Enter opens the highlighted row, not an off-screen one.
Transcript crash: start a shell command (e.g.
sleep 10), then press Ctrl+O while the tool is running. Expected: transcript opens without crashing.Regression: repeat with viewport mode disabled and confirm the task panel, subagent roster, and tool indicator are unchanged (indicator is 1 column wider than before in both modes).
Evidence (Before & After)
Before: on a 24-row terminal the task panel (up to three rows) plus the subagent roster (up to five rows) plus the composer left only about seven rows for the conversation; the shell indicator could visually merge with the command text on narrow widths.
After: the same terminal keeps about ten conversation rows, and the indicator always retains its column.
Tested on
Environment (optional)
Local unit tests via vitest; type-check via tsc.
Risk & Scope
Linked Issues
N/A
中文说明
这个 PR 做了什么
修复五个 VP 模式渲染问题,其中三个仅限 VP 模式,两个对所有渲染器生效:
仅 VP 模式的改动:
STICKY_TODO_VP_MAX_VISIBLE_ITEMS、LIVE_AGENT_PANEL_VP_MAX_ROWS)驱动,渲染端和布局键/键盘导航端引用同一常量,不会漂移。也影响传统渲染器的改动(安全,非 VP 限定):
STATUS_INDICATOR_WIDTH从 2 加宽到 3 列,指示符 Box 使用flexShrink={0}始终保留列宽。传统渲染器每行工具多缩进一列。TranscriptView现在被包裹在自己的StreamingContext.Provider中。这是一个两种渲染器都受影响的既有崩溃。streamingState、embeddedShellFocused、messageQueue.length、isInputActive依赖,修复纯流式回合中controlsHeight过期导致的 VP 视口底部裁剪。传统模式下额外触发开销极低(高度不变时setControlsHeight为 no-op)。为什么需要
viewport 模式即将成为默认渲染器,这些问题在日常使用中都会出现。需要在 viewport 模式作为默认发布前解决。
评审测试计划
如何验证
在矮终端(约 24 行)上启用 viewport 模式运行 CLI。验证指示符不重叠、任务面板最多两行、子代理列表最多三行、Ctrl+O 在工具运行时不崩溃。关闭 viewport 模式确认回归正常(指示符比之前宽一列)。
风险与范围
关联 Issue
N/A