feat(cli): Add agent view roster UI - #7803
Conversation
262cd8b to
e127eaf
Compare
f70f85b to
f3efafe
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)为单个提交。 |
f3efafe to
fff0a6d
Compare
e127eaf to
cddb16b
Compare
|
Qwen Code review did not complete successfully. Run review failed. See workflow logs for details. A transient error is retried automatically; if you are seeing this, retry with |
|
Thanks for the PR — this is the capstone (5/5) of the Agent View stack, adding the roster TUI on top of
Moving on to code review. 🔍 中文说明感谢贡献 —— 这是 Agent View 堆栈的最终 PR(5/5),在
进入代码审查 🔍 — Qwen Code · qwen3.8-max-preview Reviewed at |
Code reviewMy independent take before reading the diff: a roster for background sessions wants three layers — a pure model mapping session-state files to display rows (group / sort / filter), a stateful container owning the actions (dispatch, peek, attach, pin, rename, stop/remove) plus refresh, and a presentational Ink component holding the keymap — reusing the existing prompt primitives ( No correctness bugs, security holes, or regressions jumped out. The dense keyboard logic in
The worker↔roster interaction this PR wires up (state out, control events in) looks like this: sequenceDiagram
participant P1 as User
participant P2 as Roster TUI (qwen agents)
participant P3 as Sideband state files
participant P4 as Worker session (AppContainer)
P4->>P3: report state (idle, working, needs_input, stopped)
P3-->>P2: read and subscribe to rows
P1->>P2: answer, stop, prompt, or attach
P2->>P3: write control event
P4->>P3: poll control events every 250ms
P4->>P4: apply event (enqueue prompt, cancel, confirm tool, detach)
Files changed (20 of 20 shown)
Test evidenceThis is a stacked PR targeting the feature branch The roster is a user-visible TUI, and the author has write access (non-fork branch), so the isolated real-scenario lanes are available: a maintainer can trigger
中文说明代码审查:独立设想与 PR 基本一致 —— 三层结构(纯 model / 有状态容器 / 展示层),并良好复用了现有 prompt 原语与 测试证据:这是面向功能分支 — Qwen Code · qwen3.8-max-preview Reviewed at |
|
Confidence: 3/5 — the code review is clean (this is 4/5-quality work), but the feature direction still needs a maintainer's sign-off, so I'm deferring rather than approving. Stepping back: the implementation is genuinely good. The three-layer split (pure Two things keep me from approving, and both are judgment calls a maintainer is better placed to make than a gate:
Neither is a code defect — they're "should this ship, in this shape, now" questions. The ⏸️ Deferring to @wenshao — clean, well-tested code, but the Agent View direction (#6383 still 中文说明置信度:3/5 —— 代码审查干净(这是 4/5 质量的工作),但功能方向仍需 maintainer 签字,因此我选择转交而非批准。 退一步看:实现确实好。三层拆分(纯 有两点让我不批准,且都是 maintainer 比 gate 更适合判断的取舍:
两者都不是代码缺陷 —— 而是"现在是否该以这个形态发布"的问题。 ⏸️ 转交 @wenshao —— 代码干净、测试充分,但 Agent View 方向(#6383 仍 — Qwen Code · qwen3.8-max-preview Reviewed at |
# Conflicts: # packages/cli/src/ui/AppContainer.tsx # packages/cli/src/ui/commands/resumeCommand.test.ts # packages/cli/src/ui/commands/resumeCommand.ts
- Narrow AgentViewSupervisorSubscriptionOptions to omit timeoutMs, which the subscription never reads - Throw when DEV=true with a .ts entrypoint but tsx is missing, instead of silently spawning a process that will crash - Add test for the qwen fallback path when argv[1] is undefined - Add test for worker sideband auth bypass (workerEvent without token)
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Partially reviewed — gaps disclosed.
Not explored to full depth (tool budget reached): chunk 12: run AgentViewRoster.test.tsx under vitest to confirm green — the shared review worktree (and the parent checkout) has no node_modules , and a full npm ci (….
Not reviewed: reverse audit — did not converge within the reverse-audit round cap of 3.
Test Plan (not a blocker): npm run build — exit 1.
Deferred under the convergence posture (round 7, not a blocker) — recorded, not requested in this round:
packages/cli/src/commands/agents.ts:285 — [review] isNotManagedPeekError regex-couples to supervisor error prosepackages/cli/src/commands/agents.ts:148 — [review] title cache wiped per change event → O(N × 64–256KB) sync IOpackages/cli/src/commands/agents.ts:513 — [review] header model resolution diverges from the authoritative resolverpackages/cli/src/startup/agent-view-resume-guard.ts:83 — [probe] delete guard allow path untested (mutation survives)packages/cli/src/ui/AppContainer.tsx:2229 — [review] agentViewLastResult O(history) copy every renderpackages/cli/src/ui/AppContainer.tsx:5089 — [review] argv-build failure swallowed without diagnosticspackages/cli/src/ui/agent-view/AgentViewRoster.tsx:975 — [probe] dangling '·' footer separatorpackages/cli/src/ui/components/SessionPicker.tsx:293 — [review] managed-session selection interception untestedpackages/cli/src/ui/AppContainer.tsx:2885 — [review] control poll loop + prompt/stop branches untestedpackages/cli/src/ui/AppContainer.test.tsx:6716 — [probe] idle-gate test vacuous for the new predicatepackages/cli/src/ui/agent-view/AgentViewApp.tsx:268 — [review] attach-mode dispatch branch untestedpackages/cli/src/commands/agents.ts:445 — [review] non-TTY text output drops displayName/titlepackages/cli/src/ui/hooks/useResumeCommand.ts:103 — [test] worker-block branch untested (inline mock not hoisted; efficacy inert)packages/cli/src/commands/agents.ts:74 — [review] dispatchPrompt attach parameter is deadpackages/cli/src/commands/agents.test.ts:490 — [review] subscribeToChanges behavior untestedpackages/cli/src/ui/AppContainer.tsx:277 — [review] EMPTY_TOOL_CALLS dead default + misleading commentpackages/cli/src/ui/agent-view/AgentViewApp.test.tsx:205 — [review] submitPeekPrompt refresh hardening untestedpackages/cli/src/ui/agent-view/AgentViewRoster.test.tsx:213 — [review] Home/End test never presses Endpackages/cli/src/ui/components/SessionPicker.tsx:230 — [probe] agentViewMeta wraps past the itemHeight budgetpackages/cli/src/commands/agents.ts:401 — [probe] readTranscriptTitle uses canonical id, not resumeSessionId- …and 17 more (see the run report)
中文说明
仅完成部分审查,审查缺口已披露。
未探索到全部深度(达到工具调用预算):chunk 12:run AgentViewRoster.test.tsx under vitest to confirm green — the shared review worktree (and the parent checkout) has no node_modules , and a full npm ci (…。
未审查:反向审计——在 3 轮的反审轮数上限内未收敛。
Test Plan(非阻断):npm run build — exit 1。
收敛姿态下延后(第 7 轮,非阻断)——已记录,本轮不要求修改:共 37 条(原文未翻译,列表见上方英文部分)。
— qwen3.8-max via Qwen Code /review (v0.21.15)
… codex/qwen-code-pr-7802 # Conflicts: # packages/cli/src/agent-view/supervisor-runner.ts # packages/cli/src/agent-view/supervisor-server.ts
…agent/agent-view-roster-ui
|
Resolved the current review round in The fixes cover all 11 reported correctness gaps:
Verification completed:
中文说明在通过普通 merge commit 本次覆盖 11 个正确性问题:
已完成验证:
|
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Partially reviewed — gaps disclosed.
Not reviewed: reverse audit — did not converge within the reverse-audit round cap of 3.
Deferred under the convergence posture (round 8, not a blocker) — recorded, not requested in this round:
packages/cli/src/agent-view/supervisor-store.test.ts:269 (+22 locations) — [review] Twenty-two test-coverage gaps across the diff: new…packages/cli/src/agent-view/supervisor-store.ts:260 (+1 locations) — [review] Every present-but-unreadable/invalid state.json throws out…packages/cli/src/commands/agents.ts:156 (+1 locations) — [review] Roster title cache stores only positive hits and is wiped…packages/cli/src/commands/agents.ts:463 (+1 locations) — [review] Non-TTY text listing emits every session supervisor.list()…packages/cli/src/commands/agents.ts:532 (+1 locations) — [review] The roster header's env model fallback hardcodes…packages/cli/src/ui/AppContainer.tsx:277 (+1 locations) — [review] The EMPTY_TOOL_CALLS destructuring default can never apply…packages/cli/src/ui/AppContainer.tsx:1764 (+1 locations) — [review] runAgentViewRosterCommand swallows argv-build errors with…packages/cli/src/ui/AppContainer.tsx:2230 (+1 locations) — [review] agentViewLastResult (a worker-only value) is computed…packages/cli/src/ui/agent-view/AgentViewApp.test.tsx:1238 (+1 locations) — [review] The roster silently drops the session-name argument of…packages/cli/src/ui/agent-view/AgentViewApp.tsx:489 (+1 locations) — [review] renameSession is the only mutating action without an…packages/cli/src/ui/agent-view/AgentViewApp.tsx:743 (+1 locations) — [review] Any dispatch prompt containing a whitespace-separated…packages/cli/src/ui/agent-view/AgentViewRoster.tsx:111 (+1 locations) — [review] AgentViewPromptInput.isPerfectMatch is declared and…packages/cli/src/ui/agent-view/AgentViewRoster.tsx:545 (+1 locations) — [review] useAgentViewSlashCommands' filter keeps a non-built-in…packages/cli/src/ui/agent-view/roster-model.ts:121 (+1 locations) — [review] Directory group mode groups sessions by display basename…packages/cli/src/ui/agent-view/roster-model.ts:210 (+1 locations) — [review] The NaN-createdAt guard maps unparseable timestamps to…packages/cli/src/ui/agent-view/worker-ui-bridge.ts:294 (+1 locations) — [review] The free-text approval vocabulary is six exact English…packages/cli/src/ui/components/SessionPicker.tsx:618 (+2 locations) — [review] Hardcoded English strings in otherwise-translated…packages/cli/src/ui/hooks/useResumeCommand.test.ts:85 (+1 locations) — [review] The newly added vi.mock('../utils/restoreGoal.js') targets…packages/cli/src/ui/utils/textUtils.ts:126 (+1 locations) — [review] cleanSingleLineText inherits stripUnsafeCharacters'…
中文说明
仅完成部分审查,审查缺口已披露。
未审查:反向审计——在 3 轮的反审轮数上限内未收敛。
收敛姿态下延后(第 8 轮,非阻断)——已记录,本轮不要求修改:共 19 条(原文未翻译,列表见上方英文部分)。
— qwen3.8-max via Qwen Code /review (v0.21.15)
…agent/agent-view-roster-ui # Conflicts: # packages/cli/src/startup/agent-view-resume-guard.ts # packages/cli/src/ui/AppContainer.tsx
|
Resolved the latest review round and the dependency conflict.
中文说明已解决最新一轮 review 和依赖分支冲突。
|
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Not explored to full depth (tool budget reached): chunk 18: live execution of roster-model.test.ts via vitest (no node_modules in the review worktree; npx vitest fails at config load).
Deferred under the convergence posture (round 9, not a blocker) — recorded, not requested in this round:
packages/cli/src/ui/hooks/useResumeCommand.test.ts:95 (+4 locations) — [test] Revert-probe-hollow tests: four new test changes pass with the source change revertedpackages/cli/src/ui/agent-view/AgentViewRoster.test.tsx:497 (+16 locations) — [review] Mutation-surviving test gaps: 16 new tests pass under mutants of the behavior they claim to pinpackages/cli/src/ui/agent-view/AgentViewApp.tsx:807 (+4 locations) — [review] Untested new branches/wiring: four behaviors added by this diff are exercised by zero testspackages/cli/src/ui/AppContainer.tsx:2230 — [review] Per-render full-history scan for agentViewLastResult in every session, sideband or notpackages/cli/src/ui/agent-view/AgentViewRoster.tsx:990 — [review] Prompt-box footer ends with a dangling · separatorpackages/cli/src/ui/agent-view/roster-model.ts:150 — [review] Inert worker spread into deriveAgentViewPresentation — field never readpackages/cli/src/ui/components/SessionPicker.tsx:303 — [review] Managed-session selection gate + preview overlay have zero test coveragepackages/cli/src/ui/hooks/useDeleteCommand.ts:187 — [review] Bulk delete conflates live-managed block and failed ownership release under one wrong toastpackages/cli/src/ui/AppContainer.tsx:2854 — [review] Worker-sideband control poll loop (queueing, idle gating, stop, redraw) entirely untestedpackages/cli/src/ui/components/DialogManager.tsx:526 — [review] includeAgentViewSessions dialog wiring untested — inverted === hides agent-view sessionspackages/cli/src/gemini.tsx:425 — [review] Exit-kind → exit-code mapping untested AND unreachable in the PTY-host child (dead branch)packages/cli/src/commands/agents.ts:156 — [review] titleCache over-invalidation: O(N) synchronous transcript reads per event/poll on the event looppackages/cli/src/ui/AppContainer.tsx:5091 — [review] runAgentViewRosterCommand silently swallows argv-build errors after irreversible detachpackages/cli/src/ui/agent-view/AgentViewApp.tsx:643 — [review] Dismissing the notice leaves the Ctrl+X remove confirmation armed — remove executes laterpackages/cli/src/ui/agent-view/AgentViewRoster.tsx:479 — [review] CSI_RESIDUE_PATTERN silently drops [1] , [2026] , [ ] pastes (unchecked checkbox lost)packages/cli/src/ui/agent-view/roster-model.ts:121 — [review] Directory group mode groups by project basename, merging unrelated same-named directoriespackages/cli/src/ui/agent-view/roster-model.ts:186 — [review] Four AgentRosterRow fields (updatedAt, inputKind, lastActivityAt, lastHeartbeatAt) have no read sitepackages/cli/src/ui/agent-view/worker-ui-bridge.ts:304 — [review] Multi-question AskUserQuestion fan-out fabricates answers the user never gavepackages/cli/src/ui/AppContainer.tsx:277 — [review] EMPTY_TOOL_CALLS default is dead; comment misdescribes the identity-stability sourcepackages/cli/src/ui/AppContainer.tsx:2873 — [review] Answered-soft-question marker goes stale when a slash command consumes the roster reply- …and 4 more (see the run report)
中文说明
未探索到全部深度(达到工具调用预算):chunk 18:live execution of roster-model.test.ts via vitest (no node_modules in the review worktree; npx vitest fails at config load)。
收敛姿态下延后(第 9 轮,非阻断)——已记录,本轮不要求修改:共 24 条(原文未翻译,列表见上方英文部分)。
— qwen3.8-max via Qwen Code /review (v0.21.15)
…agent/agent-view-roster-ui
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Partially reviewed — gaps disclosed.
Not explored to full depth (tool budget reached): chunk 15: none — no check was cut short..
Not reviewed: reverse audit — did not converge within the reverse-audit round cap of 3.
Deferred under the convergence posture (round 10, not a blocker) — recorded, not requested in this round:
packages/cli/src/commands/agents.test.ts:342 — [probe] The new test is the only gate on the default JSON filterpackages/cli/src/commands/agents.test.ts:399 — [probe] The new non-TTY tests cannot pin the TTY gate: in vitestpackages/cli/src/commands/agents.test.ts:422 — [review] The non-TTY text roster always printspackages/cli/src/commands/agents.test.ts:493 — [probe] actions.loadRows/subscribeToChanges are onlypackages/cli/src/commands/agents.test.ts:638 — [probe] No test gates the loop's re-render after a successfulpackages/cli/src/commands/agents.test.ts:1045 — [review] The only test gating formatPeekPanel exercises just thepackages/cli/src/commands/agents.ts:76 — [review] The attach parameter on exported AgentsInteractiveActions.dpackages/cli/src/commands/agents.ts:164 — [review] The empty-callback foregroundSubscription is apackages/cli/src/commands/agents.ts:384 — [review] Transcript title lookup has no negative cache:packages/cli/src/commands/agents.ts:463 — [review] The non-TTY text roster drops the session display namepackages/cli/src/commands/agents.ts:530 — [review] The Agent View header's model/auth are computed withpackages/cli/src/commands/agents.ts:561 — [review] readProviderLabel picks the provider label by scanningpackages/cli/src/config/config.test.ts:39 — [test] The only change in this 469-test file is unasserted mockpackages/cli/src/gemini.tsx:425 — [review] The new non-'exited' exit branch is unreachable in thepackages/cli/src/startup/agent-view-resume-guard.test.ts:29 — [probe] The delete guard's load-bearing choice of the strictpackages/cli/src/startup/agent-view-resume-guard.test.ts:193 — [review] Every unit test for isManagedAgentViewDeleteBlockedpackages/cli/src/startup/agent-view-resume-guard.ts:96 — [review] isManagedAgentViewDeleteBlocked blocks managed sessions inpackages/cli/src/ui/AppContainer.test.tsx:1022 — [review] The new detach-failure test exercises only thepackages/cli/src/ui/AppContainer.test.tsx:6782 — [review] The idle-gate test asserts both gate flags against apackages/cli/src/ui/AppContainer.tsx:2912 — [review] The worker's stop-ack state report is deterministically- …and 40 more (see the run report)
中文说明
仅完成部分审查,审查缺口已披露。
未探索到全部深度(达到工具调用预算):chunk 15:none — no check was cut short.。
未审查:反向审计——在 3 轮的反审轮数上限内未收敛。
收敛姿态下延后(第 10 轮,非阻断)——已记录,本轮不要求修改:共 60 条(原文未翻译,列表见上方英文部分)。
— qwen3.8-max via Qwen Code /review (v0.21.15)
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Partially reviewed — gaps disclosed.
Not reviewed: reverse audit — stopped before round 1 by the review time budget.
Deferred under the convergence posture (round 11, not a blocker) — recorded, not requested in this round:
packages/cli/src/commands/agents.test.ts:942 — [probe] 'shows adoption failures in a persistent error panel'packages/cli/src/commands/agents.ts:798 — [review] formatPeekPanel's queuedPromptCount branchpackages/cli/src/config/config.test.ts:39 — [test] Inert test edit: the added subscribe mock is assertedpackages/cli/src/startup/agent-view-resume-guard.test.ts:192 — [review] Every assertion added for isManagedAgentViewDeleteBlockedpackages/cli/src/ui/agent-view/roster-model.ts:144 — [probe] The NaN fallback of 0 makes an unparseable createdAtpackages/cli/src/ui/agent-view/worker-ui-bridge.ts:207 — [review] The 'prompt' and 'stop' branches of applyAgentViewWorkerConpackages/cli/src/ui/commands/resumeCommand.test.ts:71 — [test] Inert test edit: the assertion checks a value the testpackages/cli/src/ui/components/SessionPicker.tsx:303 — [review] The managed-session selection intercept andpackages/cli/src/ui/hooks/slashCommandProcessor.test.ts:798 — [test] Inert new test: passes with all PR source changespackages/cli/src/ui/hooks/useDeleteCommand.ts:196 — [review] Batch delete lumps a supervisor release failure for anpackages/cli/src/ui/hooks/useResumeCommand.ts:103 — [test] The new worker-resume block branch has no test exercising
中文说明
仅完成部分审查,审查缺口已披露。
未审查:反向审计——评审时间预算不足,未能开始第 1 轮。
收敛姿态下延后(第 11 轮,非阻断)——已记录,本轮不要求修改:共 11 条(原文未翻译,列表见上方英文部分)。
— qwen3.8-max via Qwen Code /review (v0.21.15)
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Not explored to full depth (tool budget reached): chunk 21: executing worker-ui-bridge.test.ts via vitest — no node_modules is installed in the review worktree or the parent checkout, and a fresh npm ci + build excee…; chunk 22: executing the test suite — the worktree has no node_modules and a full npm ci in the shared review worktree was out of scope; all assertions were verified b….
Deferred under the convergence posture (round 12, not a blocker) — recorded, not requested in this round:
packages/cli/src/agent-view/worker-sideband.test.ts:376 — [review] control-poll replay branch lost coveragepackages/cli/src/commands/agents.ts:301 — [review] isNotManagedPeekError couples to daemon error phrasingpackages/cli/src/startup/agent-view-resume-guard.test.ts:192 — [probe] delete-guard core predicate branches untestedpackages/cli/src/ui/agent-view/AgentViewApp.test.tsx:1002 — [review] pin/rename refresh-failure test lacks the negative assertionpackages/cli/src/ui/agent-view/AgentViewRoster.test.tsx:208 — [review] Home/End test never presses Endpackages/cli/src/ui/agent-view/AgentViewRoster.tsx:1045 — [review] formatWaitingLine case-sensitivity diverges from blocking-wait classifierpackages/cli/src/ui/agent-view/roster-model.ts:155 — [probe] dead NaN guard — invalid now throws before the guard appliespackages/cli/src/ui/hooks/useDeleteCommand.ts:196 — [review] batch delete conflates blocked and release-failed skip reasonspackages/cli/src/ui/AppContainer.tsx:2911 — [review] worker-side control-event consumption (prompt/stop) has no testpackages/cli/src/ui/agent-view/AgentViewApp.tsx:265 — [review] dispatch-and-attach branch never exercised through the apppackages/cli/src/commands/agents.ts:779 — [review] formatPeekPanel queuedPromptCount/lastResult/fallback branches untestedpackages/cli/src/commands/agents.test.ts:494 — [review] subscribeToChanges titleCache-clear wrapper has no behavioral coveragepackages/cli/src/commands/agents.ts:790 — [review] formatPeekPanel activity lines are never renderedpackages/cli/src/ui/AppContainer.test.tsx:2956 — [review] /quit and /exit sent as peek replies execute on the worker unreportedpackages/cli/src/ui/agent-view/AgentViewApp.test.tsx:103 — [review] canAttach:false guard is unpairedpackages/cli/src/ui/agent-view/AgentViewApp.test.tsx:1460 — [review] Ctrl+C 2-second interrupt window has no expiry testpackages/cli/src/ui/agent-view/AgentViewApp.tsx:26 — [review] AgentViewAppActions duplicated as AgentsInteractiveActions across the layer boundarypackages/cli/src/ui/agent-view/AgentViewApp.tsx:588 — [probe] toggleGroupMode notice derives from a stale closure under same-tick double eventspackages/cli/src/ui/agent-view/AgentViewApp.tsx:772 — [review] runAgentViewRosterApp lifecycle has zero test coveragepackages/cli/src/ui/agent-view/AgentViewRoster.test.tsx:504 — [probe] lagging-echo test does not gate the anti-clobber protection- …and 36 more (see the run report)
Convergence: round 12 posted 4 inline comment(s), 4 of them reported for the first time; the previous round posted 5. Findings keep coming back to the same files: packages/cli/src/ui/agent-view/AgentViewApp.tsx (findings in round 10; 2 more now); packages/cli/src/ui/agent-view/AgentViewRoster.tsx (findings in round 10; 1 more now). A cluster that keeps producing siblings usually means the fixes are treating instances of a shared root cause — triaging that cause before the next round, or splitting an independent cluster into its own pull request, tends to end the loop faster than fixing them one at a time. (Observation only — nothing was withheld from this review because of this observation.)
中文说明
未探索到全部深度(达到工具调用预算):chunk 21:executing worker-ui-bridge.test.ts via vitest — no node_modules is installed in the review worktree or the parent checkout, and a fresh npm ci + build excee…;chunk 22:executing the test suite — the worktree has no node_modules and a full npm ci in the shared review worktree was out of scope; all assertions were verified b…。
收敛姿态下延后(第 12 轮,非阻断)——已记录,本轮不要求修改:共 56 条(原文未翻译,列表见上方英文部分)。
收敛情况:第 12 轮发布了 4 条行内评论,其中 4 条是首次提出;上一轮发布了 5 条。发现反复回到同一批文件:packages/cli/src/ui/agent-view/AgentViewApp.tsx(第 10 轮已出过发现,本轮又有 2 条);packages/cli/src/ui/agent-view/AgentViewRoster.tsx(第 10 轮已出过发现,本轮又有 1 条)。一个不断再生兄弟发现的簇,通常意味着逐条修复只在处理同一根因的实例——先定位并处理该根因,或把独立的簇拆成单独的 PR,通常比逐条修复更快结束循环。(仅为观察——本轮评审未因此扣留任何内容。)
— qwen3.8-max via Qwen Code /review (v0.22.0)
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Partially reviewed — gaps disclosed.
Not explored to full depth (tool budget reached): chunk 8: executing the new test file under vitest — the review worktree has no node_modules /dependency dists, and a full npm install + workspace build was out of bud….
Not reviewed: reverse audit — did not converge within the reverse-audit round cap of 3.
Deferred under the convergence posture (round 13, not a blocker) — recorded, not requested in this round:
packages/cli/src/commands/agents.ts:158 — [test] titleCache.clear() mutant survives — roster title-cache invalidation has no testpackages/cli/src/ui/agent-view/AgentViewApp.test.tsx:97 — [review] attach-dispatch branch (Shift+Enter) has zero test coveragepackages/cli/src/ui/agent-view/AgentViewApp.tsx:239 — [review] s: filter panel count is a stale snapshot while the roster re-renders livepackages/cli/src/ui/agent-view/AgentViewApp.tsx:289 — [review] dispatch resolution clears an in-flight peek reply draft; Enter then attaches instead of sendingpackages/cli/src/ui/agent-view/AgentViewApp.tsx:367 — [review] generation guard checked before await refreshRows(); refresh-failure path clobbers a newer peek targetpackages/cli/src/ui/agent-view/AgentViewApp.tsx:590 — [review] toggleGroupMode notice computed from stale closure — misreports grouping on bursty Ctrl+Spackages/cli/src/ui/agent-view/AgentViewRoster.test.tsx:208 — [review] Home-and-End test presses Home only; the End path has no coveragepackages/cli/src/ui/agent-view/AgentViewRoster.test.tsx:264 — [review] grace-timer unmount cleanup effect exercised by no test (mutant survives)packages/cli/src/ui/agent-view/AgentViewRoster.test.tsx:308 — [review] grace-timer escape path with a peek panel open is untested (mutant survives)packages/cli/src/ui/agent-view/AgentViewRoster.test.tsx:530 — [review] lagging-echo test cannot detect its named regression (replay converges on current buffer)packages/cli/src/ui/agent-view/AgentViewRoster.test.tsx:826 — [review] stale-panel Enter guard pinned by no test; silent attach reachable when input mode is undefinedpackages/cli/src/ui/agent-view/AgentViewRoster.tsx:247 — [review] grace-timer fire-and-drop branch exercised by no test (mutant survives)packages/cli/src/ui/agent-view/AgentViewRoster.tsx:249 — [review] grace window swallows genuine Ctrl+C/Ctrl+X within 25 ms of Esc (interrupt beat lost)packages/cli/src/ui/components/SessionPicker.tsx:150 — [review] 'bg' badge and 'Esc to return' hardcoded English instead of t()-wrapped (i18n convention)packages/cli/src/ui/components/SessionPicker.tsx:303 — [review] allowManagedAgentViewSelection is a dead switch at its only true set sitepackages/cli/src/ui/components/StandaloneSessionPicker.test.tsx:466 — [review] managed-session selection intercept (handleSelect guard) untested; guard-delete mutant survivespackages/cli/src/ui/components/StandaloneSessionPicker.tsx:21 (+6 locations) — [test] six agent-view picker wiring hunks each survive individual revert — no per-hunk test gate
Convergence: round 13 posted 1 inline comment(s), 1 of them reported for the first time; the previous round posted 4 (4 new). Findings keep coming back to the same files: packages/cli/src/ui/agent-view/AgentViewRoster.tsx (findings in round 12; 1 more now). A cluster that keeps producing siblings usually means the fixes are treating instances of a shared root cause — triaging that cause before the next round, or splitting an independent cluster into its own pull request, tends to end the loop faster than fixing them one at a time. (Observation only — nothing was withheld from this review because of this observation.)
中文说明
仅完成部分审查,审查缺口已披露。
未探索到全部深度(达到工具调用预算):chunk 8:executing the new test file under vitest — the review worktree has no node_modules /dependency dists, and a full npm install + workspace build was out of bud…。
未审查:反向审计——在 3 轮的反审轮数上限内未收敛。
收敛姿态下延后(第 13 轮,非阻断)——已记录,本轮不要求修改:共 17 条(原文未翻译,列表见上方英文部分)。
收敛情况:第 13 轮发布了 1 条行内评论,其中 1 条是首次提出;上一轮发布了 4 条(其中 4 条首次提出)。发现反复回到同一批文件:packages/cli/src/ui/agent-view/AgentViewRoster.tsx(第 12 轮已出过发现,本轮又有 1 条)。一个不断再生兄弟发现的簇,通常意味着逐条修复只在处理同一根因的实例——先定位并处理该根因,或把独立的簇拆成单独的 PR,通常比逐条修复更快结束循环。(仅为观察——本轮评审未因此扣留任何内容。)
— qwen3.8-max via Qwen Code /review (v0.22.0)
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Partially reviewed — gaps disclosed.
Unresolved, please confirm:
- [Critical] packages/cli/src/commands/agents.ts — 1 prior-round blocker cannot be ruled on: body truncated in context rendering and not fetched in full (comment 3826153746, R7-1 refresh best-effort)
- [Critical] packages/cli/src/ui/agent-view/AgentViewApp.test.tsx — 1 prior-round blocker cannot be ruled on: body truncated, not fetched (comment 3807091551, peek reply failure feedback)
- [Critical] packages/cli/src/ui/agent-view/AgentViewApp.tsx — 26 prior-round blockers cannot be ruled on: bodies truncated in context rendering and not fetched in full (comments 3796848203, 3796848201, 3796848212-adjacent 3803666117, 3803666220, 380709…
- [Critical] packages/cli/src/ui/agent-view/AgentViewRoster.tsx — 40 prior-round blockers cannot be ruled on: bodies truncated in context rendering and not fetched in full (comments 3796848205, 3796848208, 3796848212, 3796848214, 3796848216, 3803666142,…
- [Critical] packages/cli/src/ui/agent-view/roster-model.ts — 3 prior-round blockers cannot be ruled on: bodies truncated, not fetched (comments 3796848223, 3816424713, 3831380533)
- [Critical] packages/cli/src/ui/agent-view/worker-ui-bridge.ts — 7 prior-round blockers cannot be ruled on: bodies truncated, not fetched (comments 3796848227, 3796848232, 3803666156, 3807091632, 3820134288, 3826153800, 3829013364)
- [Critical] packages/cli/src/ui/AppContainer.tsx — 15 prior-round blockers cannot be ruled on: bodies truncated, not fetched (comments 3796848196, 3796848199, 3796848200, 3803666163, 3803666188, 3803666213, 3807091540, 3807091547, 3812161938, 381642468…
- [Critical] packages/cli/src/ui/components/DialogManager.tsx — 1 prior-round blocker cannot be ruled on: body truncated, not fetched (comment 3803666198)
- [Critical] packages/cli/src/ui/components/SessionPicker.tsx — 4 prior-round blockers cannot be ruled on: bodies truncated, not fetched (comments 3796848236, 3807091640, 3829013371, 3838437949)
- [Critical] packages/cli/src/ui/components/StandaloneSessionPicker.tsx — 3 prior-round blockers cannot be ruled on: bodies truncated, not fetched (comments 3803666180, 3807091649, 3820134253)
- [Critical] packages/cli/src/ui/contexts/KeypressContext.tsx — 1 prior-round blocker cannot be ruled on: body truncated, not fetched (comment 3796848240)
- [Critical] packages/cli/src/ui/hooks/useDeleteCommand.ts — 2 prior-round blockers cannot be ruled on: bodies truncated, not fetched (comments 3823226863, 3829013377)
- [Critical] packages/cli/src/ui/hooks/useSessionPicker.ts — 3 prior-round blockers cannot be ruled on: bodies truncated, not fetched (comments 3820134308, 3823226834, 3826153786)
Not reviewed: reverse audit — did not converge within the reverse-audit round cap of 5.
Deferred under the convergence posture (round 14, not a blocker) — recorded, not requested in this round:
packages/cli/src/commands/agents.ts:158 — [test] titleCache.clear() on supervisor change has no test gating itpackages/cli/src/ui/agent-view/AgentViewRoster.test.tsx:534 — [review] lagging-echo suppression test is vacuouspackages/cli/src/ui/agent-view/AgentViewRoster.tsx:589 — [review] built-in slash-command filter has no testpackages/cli/src/ui/agent-view/AgentViewRoster.test.tsx:209 — [review] Home/End test never presses Endpackages/cli/src/ui/agent-view/AgentViewRoster.tsx:113 — [review] AgentViewPromptInput.isPerfectMatch is dead plumbingpackages/cli/src/ui/agent-view/AgentViewRoster.test.tsx:200 — [review] cursor-movement test is not position-sensitive
中文说明
仅完成部分审查,审查缺口已披露。
未决,请确认:共 13 条(原文未翻译,列表见上方英文部分)。
未审查:反向审计——在 5 轮的反审轮数上限内未收敛。
收敛姿态下延后(第 14 轮,非阻断)——已记录,本轮不要求修改:共 6 条(原文未翻译,列表见上方英文部分)。
— qwen3.8-max via Qwen Code /review (v0.22.0)
df65321 to
e64a1a5
Compare
What this PR does
Stack position: 5/5. Parent: #7802.
This final stacked PR adds the Agent View roster TUI. It displays managed background sessions in Needs input, Working, and Completed groups, supports filtering, peek, attach, follow-up replies, blocking answers, pin, rename, stop/remove confirmation, shortcut help, subscription refresh, and managed resume picker integration.
Why it's needed
Agent View is meant to be operated as a multi-session workspace rather than only as individual commands. The roster gives users a single interactive surface for monitoring background tasks, answering sessions that need input, attaching to live workers, and cleaning up completed work.
Reviewer Test Plan
How to verify
npm run build; the repository should build successfully.cd packages/cli && npx vitest run src/agent-view --coverage.enabled=false; all Agent View unit tests should pass.cd packages/cli && npx vitest run src/ui/agent-view/AgentViewApp.test.tsx src/ui/agent-view/roster-model.test.ts --coverage.enabled=false; these roster model and app tests should pass.qwen agents: background sessions appear in the roster, Space opens peek, Enter/Right attaches, Ctrl+X first stops and shows the remove hint, Ctrl+X again within the hint removes, and prompt input remains usable after transient hints close.Evidence (Before & After)
TUI behavior was manually exercised during development; no fresh screenshot or tmux capture is attached in this PR body.
Tested on
Environment (optional)
macOS, Node.js v26.2.0. Local verification required reinstalling current workspace dependencies and applying the existing Ink patch to local
node_modules.Risk & Scope
Linked Issues
Refs #6383
中文说明
此 PR 的内容
堆栈位置:5/5。父 PR:#7802。
这个最终 stacked PR 增加 Agent View roster TUI。它以 Needs input、Working 和 Completed 分组展示托管后台 session,支持过滤、peek、attach、follow-up reply、blocking answer、pin、rename、stop/remove 确认、快捷键帮助、订阅刷新,以及托管 resume picker 集成。
为什么需要
Agent View 的目标是作为多 session 工作区使用,而不是只通过单个命令操作。roster 给用户一个统一的交互界面,用于监控后台任务、回答需要输入的 session、attach 到 live worker,以及清理完成的工作。
评审者测试计划
如何验证
npm run build;仓库应成功构建。cd packages/cli && npx vitest run src/agent-view --coverage.enabled=false;全部 Agent View 单元测试应通过。cd packages/cli && npx vitest run src/ui/agent-view/AgentViewApp.test.tsx src/ui/agent-view/roster-model.test.ts --coverage.enabled=false;这些 roster model 和 app 测试应通过。qwen agents:后台 session 会出现在 roster 中,Space 打开 peek,Enter/Right attach,第一次 Ctrl+X stop 并显示 remove hint,hint 期间再次 Ctrl+X remove,并且 transient hint 关闭后 prompt input 仍可输入。证据(变更前后)
开发期间已手动验证 TUI 行为;此 PR body 未附加新的截图或 tmux capture。
测试平台
环境(可选)
macOS,Node.js v26.2.0。本地验证前需要补齐当前 workspace 依赖,并把仓库已有 Ink patch 应用到本地
node_modules。风险与范围
关联 Issue
关联 #6383