Skip to content

feat(workflows): finish Dynamic Workflows port — resume, saved workflows, keyword trigger, notifications (#4721) - #5600

Merged
LaZzyMan merged 19 commits into
mainfrom
lazzy/workflow-port-completion
Jun 22, 2026
Merged

feat(workflows): finish Dynamic Workflows port — resume, saved workflows, keyword trigger, notifications (#4721)#5600
LaZzyMan merged 19 commits into
mainfrom
lazzy/workflow-port-completion

Conversation

@LaZzyMan

Copy link
Copy Markdown
Collaborator

What this PR does

Finishes the Dynamic Workflows port (#4721) on top of the already-merged P1–P5 foundation, bundling all remaining work into one PR. It adds, in dependency order:

  • workflow('<name>') nested global (P-nested) — a running workflow can invoke a saved workflow by name (single level only; the nested sandbox lacks the impl, so deeper nesting throws).
  • Agent stall watchdog + retry (P-stall) — a per-dispatch watchdog aborts a subagent that goes silent past a timeout (reset on round/stream/usage/tool events, suspended during in-flight tools), with a 3-attempt retry loop wrapping both dispatch paths.
  • Budget-exhausted drop accounting (Gap-3)parallel()/pipeline() distinguish a slot dropped by the token cap from an ordinary error.
  • Same-session resume via JSONL journal (P6)resumeFromRunId replays a rolling prefix-hash chain; agent() calls whose (prompt, opts) match the journal are served from cache for the longest unchanged prefix, then the run goes live from the first miss.
  • Run snapshots (P7b-A2) — each terminal run is persisted to <projectDir>/workflows/<runId>.json, so /workflows shows a recent history that survives a restart (retention-capped, oldest pruned).
  • Saved workflows as /<name> slash commands (P7b-A1) — a script saved at .qwen/workflows/<name>.js (project) or ~/.qwen/workflows/<name>.js (user) is discoverable as /<name>, which dispatches the workflow tool with the file path (read fresh each run). The tool gained a scriptPath param (XOR with inline script).
  • Save-to-disk dialog (P7b-A3) — in the /workflows detail view, s saves a completed run's script to a named .qwen/workflows/<name>.js (project/user scope toggle, overwrite confirm).
  • workflow keyword trigger + footer indicator (P7-trigger) — mentioning the word workflow in a prompt softly steers that turn toward the Workflow tool (a <system-reminder> nudge, never a forced tool call) and shows a ⚙ workflow active footer indicator. Opt-out via ui.disableWorkflowKeywordTrigger.
  • Completion notification (P-notif) — a terminal-bell notification fires when a run completes/fails (not on user-initiated cancel).
  • Telemetry (P-telemetry)qwen-code.workflow_keyword and qwen-code.workflow_run events (no-op unless telemetry is enabled).

Whole-run cancel already works from the /workflows dialog (x aborts the run). Per-agent pause/retry/skip and the ACP 'workflow' daemon propagation are intentionally deferred to follow-ups.

Why it's needed

P1–P5 shipped the workflow engine and the live /workflows view, but a workflow couldn't be resumed, saved, re-run by name, or noticed when it finished, and there was no opt-in trigger. This PR closes that gap so workflows become reusable, durable across sessions, and discoverable — matching the capability surface of the upstream feature this was reverse-engineered from.

Reviewer Test Plan

How to verify

Enable the feature with QWEN_CODE_ENABLE_WORKFLOWS=1.

  1. Saved-workflow discovery + run. Create .qwen/workflows/demo.js with export const meta = { name: 'demo', phases: [{title:'Plan'}] }; phase('Plan'); log('hi'); return 'done';. Start the CLI; type /demo → autocomplete shows demo [json-args] Run the "demo" saved workflow (project). Run it → it completes with result: "done".
  2. Cross-session history. Run /workflows → the completed run is listed. Restart the CLI (fresh process) and run /workflows again → the run is still listed (loaded from the on-disk snapshot, not in-memory state).
  3. Keyword trigger. Submit a prompt containing the word workflow → the footer shows ⚙ workflow active during the turn; it clears when the turn returns to idle. workflows, dataflow, my-workflow-runner do NOT trigger.
  4. Resume. Run a workflow with agent() calls, then call the tool again with resumeFromRunId: <id> and the same script → matching agent() calls are served from the journal cache.
  5. Save dialog. After a run, open the background-tasks dialog, focus the workflow entry, Enter for detail, s to save, type a name, Tab to toggle scope, Enter → the script is written to .qwen/workflows/<name>.js and becomes /<name> next session.

Evidence (Before & After)

Verified locally via tmux against the local build (node dist/cli.js, real auth):

  • /demo-research saved-workflow autocomplete + full execution (result: "done", logs/phases parsed).
  • /workflows: empty state → populated listing → survives a process restart (run re-listed purely from the on-disk snapshot at ~/.qwen/projects/<hash>/workflows/<runId>.json).
  • Footer ⚙ workflow active appears on a workflow-keyword submit and the steered turn completes normally.

The save dialog (P7b-A3), the terminal bell (P-notif, an escape sequence), and per-run cancel (P-tui) are covered by unit/component tests rather than tmux (the interactive multi-key save flow and escape-sequence bell aren't reliably driveable via send-keys). Full suite: the workflow surface across both packages is green (380+ workflow-specific tests), plus workspace typecheck and lint.

Tested on

OS Status
🍏 macOS
🪟 Windows ⚠️
🐧 Linux ⚠️

LaZzyMan added 15 commits June 22, 2026 14:47
…vocation (#4721 P-nested)

Fills the P1 `workflow()` throwing stub with a real nested-workflow
primitive. `workflow('<name>')` resolves a saved script from
`.qwen/workflows/<name>.js` (project) or `~/.qwen/workflows/<name>.js`
(user); `workflow({scriptPath})` reads an explicit path. The resolved
script runs as a nested orchestration that SHARES the parent run's
agent-count cap, concurrency window, token budget, and emitter — so
nested phases/logs and token spend roll into the same registry entry
and the global caps bound parent + nested together.

Single-level nesting is enforced structurally: the orchestrator injects
the `workflow` impl only at the top level, so a nested workflow's
sandbox has no impl and a second-level `workflow()` call lands in the
throwing else-branch. No depth counter to drift.

- NEW `workflow-saved.ts`: `resolveSavedWorkflowScript(nameOrRef, config)`
  + `listSavedWorkflows` + `validateWorkflowName` + `WORKFLOW_NAME_PATTERN`.
  Shared with the upcoming CLI slash-command loader and save dialog.
  Project scope shadows user scope (matches FileCommandLoader precedence).
- `Storage`: `getProjectWorkflowsDir` / `getUserWorkflowsDir` (scripts) +
  `getWorkflowRunsDir` / `getWorkflowRunSnapshotPath` /
  `getWorkflowRunJournalPath` (reserved for P6/P7b run artifacts).
- `workflow-sandbox.ts`: `SandboxOptions.workflow` + `__b.hasWorkflow/
  hostWorkflow` bridge. The vm `workflow()` global mirrors `agent()`:
  args sanitized vm→host via JSON round-trip, single result revived
  back into the vm realm (T1/T8/T14 escape defense). Else-branch throws
  a clear "unavailable / single-level limit" message.
- `workflow-orchestrator.ts`: `WorkflowRunRequest.resolveSavedWorkflow`
  injection seam; `workflowImpl` built in `run()` closing over the
  shared countedDispatch/parallel/pipeline/budget/emitter; nested
  sandbox created WITHOUT a workflow impl.
- `WorkflowTool`: wires `resolveSavedWorkflowScript(ref, this.config)`.

Tests: workflow-saved.test.ts (20: name/scriptPath resolution, scope
precedence, miss errors, name validation, listing). orchestrator
P-nested block (7: resolve+return, nested args, shared agent cap,
shared budget, single-level throw, no-resolver throw, resolver-reject
surfaces to parent). sandbox (workflow() unavailable + injected-impl
revival + scriptPath passthrough). 237 workflow tests pass, lint clean.

Refs #4721.
A workflow `agent()` could hang indefinitely — a looping model, a
provider stalling mid-stream, or a tool that never returns would only be
caught by the subagent's coarse 10-min `max_time_minutes`. P-stall adds a
fine-grained per-dispatch stall watchdog: after `stallMs` (default 60s,
env `QWEN_CODE_WORKFLOW_STALL_SECONDS`, per-call `agent({stallMs})`) of NO
observable progress, the dispatch is aborted and retried up to 3 times
before abandoning.

"Progress" = any reasoning-loop event (round start/end, streamed text,
token usage, tool call/result). The timer is SUSPENDED while a tool is in
flight, so a legitimately long tool call (90s build, slow MCP) is never
flagged — only true no-output-no-tool dead time counts toward the stall.

Design (low-invasiveness): `runStallResilient` owns the per-attempt
`AbortController` + `AgentEventEmitter`, chains the caller's parent signal
into the per-attempt controller, and hands both into `runSingleDispatch`
(the extracted single-attempt body of the former inline dispatch). A
stall fires `controller.abort('stalled')` → the subagent returns
CANCELLED → runSingleDispatch throws its "did not complete" terminal →
the wrapper retries when `watchdog.stalled()` is set AND the parent signal
is not aborted. Non-stall failures (MAX_TURNS / TIMEOUT / ERROR /
schema-nudge-exhaustion) propagate immediately — a retry won't fix a
deterministic outcome. Parent abort propagates without retry.

Schema-mode rescue is free: if a stall fires after the subagent already
captured a valid `structured_output`, runSingleDispatch returns that
payload before the terminate-mode check, so the wrapper sees success.

Uniform across both dispatch paths: the watchdog emitter is passed to the
fast-path `AgentHeadless.create` (new arg 7) AND to `runOverridePath`,
where `createSchemaEventEmitter` is refactored to `attachSchemaListeners`
so the schema `structured_output` capture and the stall watchdog observe
the SAME subagent emitter.

- NEW `workflow-stall.ts`: `attachStallWatchdog`, `runStallResilient`,
  `resolveStallMs`, constants. 18 unit tests (fake-timer watchdog timing:
  fire / reset-on-activity / suspend-during-tool / dispose / disabled;
  retry loop: success / stall-3x-abandon / stall-then-recover /
  non-stall-no-retry / parent-abort-no-retry / abort-propagation /
  stallMs=0-passthrough).
- `WorkflowAgentOpts.stallMs` + sandbox `KNOWN_AGENT_OPTS` allowlist.

334 workflow tests pass, lint clean.

Scoped out (deliberate): throttle-backoff retry (degraded-GOAL detection
+ 45s sleep). It needs per-attempt duration/output-token threading into
the wrapper and risks false-positives on legitimately short answers
(a yes/no agent returns <50 tokens). The hang-prevention watchdog is the
high-value core; throttle is a refinement that can follow.

Refs #4721.
…ne (#4721 Gap-3)

`settleToNullArray` (shared by `parallel()` / `pipeline()`) mapped every
rejected thunk to `null` and logged each at debug level with the same
"thunk rejected" message. A run that hits the token budget mid-fan-out
drops its remaining slots via `WorkflowBudgetExceededError` — expected,
capacity-shaped behaviour — but those drops were indistinguishable from
arbitrary dispatch failures (rate limit, model outage) in the logs.

Now budget-exhausted drops are counted separately (duck-typed on
`err.name === 'WorkflowBudgetExceededError'`, since the cross-realm
rejection's `instanceof` is unreliable) and summarized as
`parallel: N slot(s) dropped — token budget exceeded`, while genuine
failures keep their per-slot warning. Matches upstream's distinct
budget-drop accounting. Behaviour to the script is unchanged (slots are
still `null`); this is operator-facing observability only.

Refs #4721.
`Workflow({resumeFromRunId})` re-runs a workflow and serves cached
results for the longest UNCHANGED PREFIX of agent() calls — a run
interrupted (crash, kill, network blip) at agent #40 resumes by replaying
the 39 journaled results instantly and only re-dispatching from the
divergence point. Every run journals (so any run is resumable); the
replay maps load only when resuming.

Key derivation (upstream `v2` parity): each dispatch's key is
`v2:sha256(prefixHash ‖ prompt ‖ canonicalOpts)`, where `prefixHash` is
the PREVIOUS dispatch's key. The rolling chain is what gives
"longest-unchanged-prefix" semantics — editing call #3 changes its key,
which re-keys #4, #5… so the cache naturally invalidates from the edit
point. `canonicalOpts` keeps only the dispatch-affecting opts
(schema/model/isolation/agentType) with keys sorted, so a re-serialized
schema or a label tweak doesn't bust the cache. Determinism (Date.now /
Math.random throw in the sandbox) guarantees the key chain is stable
across runs.

Critical invariant ("first miss invalidates the suffix"): once ANY
dispatch runs live during resume, `hadMiss` flips and no later dispatch
trusts the cache — even a later key that happens to match. The
prefix-hash chain already re-keys the suffix after a divergence, and
`hadMiss` is the belt-and-suspenders guard matching upstream's `f` flag.

The journal cache check runs BEFORE the budget gate and agent-count
cap, so a cached result is free: no token spend, no agent-cap slot, no
live dispatch. It still fires `agentDispatched` + `agentCompleted` so the
registry/UI counters advance. Result-append is fire-and-forget (a journal
write failure never fails the dispatch); the per-dispatch entry id is
captured in a closure so concurrent dispatches can't clobber it.

- NEW `workflow-journal.ts`: `WorkflowJournal` (jsonl-utils `read`/
  `writeLine`), `deriveAgentKey`, `canonicalizeAgentOpts`, `buildReplay`.
- `WorkflowRunRequest.journal` + `.resumeReplay`; cache logic in
  `countedDispatch`.
- `Storage.getWorkflowRunsDir` / `getWorkflowRunJournalPath` /
  `getWorkflowRunSnapshotPath` (added in the P-nested commit).
- `WorkflowParams.resumeFromRunId` + schema; `WorkflowTool` reuses the
  prior runId, loads the journal as replay, appends to the same file.

Tests: workflow-journal.test.ts (12: canonicalize projection/sort/
function-strip, key determinism/prompt/opt/cosmetic/chain sensitivity,
buildReplay last-write + accumulate, journal round-trip + missing-file).
orchestrator P6 block (5: normal run journals started+result, resume
serves cached prefix with 0 dispatches, first-miss-invalidates-suffix
with a mid-script prompt edit, cache hit advances registry counters,
cached dispatches bypass the agent-count cap). 351 workflow tests pass,
lint clean.

Refs #4721.
A function value is structurally assignable to `schema?: object`, so the
`@ts-expect-error` on the function-strip test asserted a type error that
never occurred — `tsc --noEmit` (which includes test files) flagged it as
TS2578. Replace the directive with a comment explaining the test exercises
the runtime strip of callable opt values.
…ws history (#4721 P7b-A2)

The `WorkflowRunRegistry` is in-memory and dies with the CLI process, so
`/workflows` could only ever show runs from the current session. Persist a
JSON snapshot of each terminal run to `<projectDir>/workflows/<runId>.json`
so the listing (and per-run detail view) survives a restart.

- workflow-snapshot.ts: `toSnapshot`/`writeWorkflowSnapshot`/
  `listWorkflowSnapshots` + retention prune (cap 30, oldest by mtime).
  perPhaseTokens is flattened to `[phaseOrNull, tokens]` pairs for JSON;
  a non-serializable script result degrades to a placeholder string.
- WorkflowTask gains `script`/`scriptPath` (the snapshot carries the script
  source; also feeds the upcoming save-to-disk dialog). `script` defaults
  to '' in register() for legacy callers.
- WorkflowTool registers the script source and, in its terminal `finally`,
  writes the snapshot once the registry entry has transitioned (best-effort,
  awaited so headless runs flush before the process exits).
- /workflows merges disk snapshots into the listing (live registry entries
  win on a runId collision) and falls back to a snapshot in the detail view
  when the runId predates this process.

Snapshot files (`<runId>.json`) never collide with resume journals
(`<runId>/journal.jsonl`, in a subdir) — the `*.json` glob skips the dirs.
A workflow script saved at `.qwen/workflows/<name>.js` (project) or
`~/.qwen/workflows/<name>.js` (user) is now discoverable as a `/<name>`
slash command that runs it — the user-facing complement to the in-script
`workflow('<name>')` global (both resolve via core's `listSavedWorkflows`,
project scope shadowing user).

- SavedWorkflowLoader (CLI): a new ICommandLoader, wired into both loader
  arrays (interactive + non-interactive) just before FileCommandLoader. Each
  discovered workflow becomes a `{ type:'tool', toolName:'workflow',
  toolArgs:{ scriptPath } }` dispatch. Gated on isWorkflowsEnabled (the tool
  isn't registered otherwise), bare mode, and folder trust — mirroring
  FileCommandLoader. Trailing text is forwarded to the script's `args`
  global (parsed as JSON when valid, else the raw string).
- WorkflowTool: `scriptPath` param (XOR with `script`, enforced in
  validateToolParamValues). When set, the tool reads the file at execution
  time (hot reload) and records the resolved absolute path on the registry
  entry as run provenance (feeds the P7b-A2 snapshot + the save dialog's
  "already saved" branch).
- Activate the reserved `'workflow-command'` CommandSource; commands render
  under a "Workflow" source label.

Re-exports listSavedWorkflows / resolveSavedWorkflowScript / validateWorkflowName
/ getSavedWorkflowDirs / WORKFLOW_NAME_PATTERN from core for CLI consumers.
#4721 P7b-A3)

The `/workflows` detail view now offers `s` to save a finished run's script
to `.qwen/workflows/<name>.js` (project) or `~/.qwen/workflows/<name>.js`
(user) — the run becomes a `/<name>` slash command (P7b-A1) and a
`workflow('<name>')` target (P-nested).

- core `saveWorkflowScript(config, { name, scope, script, overwrite })`:
  validates the name, refuses to clobber unless `overwrite`, returns a
  discriminated result (saved / exists / invalid-name / empty-script) so the
  UI can prompt rather than throw. Reuses the saved-workflow dir + name rules.
- WorkflowSaveOverlay: a self-contained overlay (single keypress handler with
  a minimal inline name editor — names are short kebab strings) for name entry,
  Tab scope toggle, overwrite confirmation, and saved/error states. The parent
  dialog yields all keys to it while open.
- BackgroundTasksDialog: `s` opens the overlay for a terminal workflow entry
  that still carries its script; the hint row advertises it.

The new `/<name>` command surfaces on the next session (the in-memory command
list is not hot-reloaded mid-session); the file is usable immediately via
`workflow('<name>')`.
…ger)

Mentioning the word `workflow` in a prompt now softly steers that turn
toward the Workflow tool, and the Footer shows a `⚙ workflow active`
indicator for the steered turn.

- workflow-keyword.ts: `detectWorkflowKeyword` (whitespace-tokenized,
  edge-punctuation-stripped — `workflow`/`workflow.`/`(workflow)` match;
  `workflows`, `dataflow`, `my-workflow-runner` do not) +
  `buildWorkflowSteeringNotice` (a soft nudge, not a forced tool call).
- AppContainer.handleFinalSubmit: on a keyword hit (feature enabled, not a
  slash command, opt-out unset) prepend a `<system-reminder>` — the same
  one-shot mechanism as the worktree-restore notice — and arm the indicator;
  it clears when the turn returns to idle.
- UIState gains `workflowKeywordActive`; Footer renders the indicator next to
  the worktree line; `ui.disableWorkflowKeywordTrigger` setting opts out.

No `ultracode` naming — the trigger keyword is the plain word `workflow`,
per the original issue.
A workflow can run for minutes as a single tool call; the user shouldn't have
to watch the /workflows dialog to learn it finished. Fire a terminal-bell
notification when a run reaches `completed` / `failed`.

- WorkflowRunRegistry gains a `notificationCallback` slot (separate from the
  dialog-owned `statusChangeCallback`), fired in `complete()` / `fail()` —
  NOT `cancel()`, since a user-initiated cancel needs no notification.
- AppContainer wires the callback to the existing `sendNotification` service
  (gated on the `general.terminalBell` setting), mirroring the agent
  attention-notification path. The call is optional so partial registry mocks
  in CLI tests no-op instead of throwing.
Two lightweight OpenTelemetry events (no-op unless telemetry is enabled),
following the SpeculationEvent template:

- `qwen-code.workflow_keyword` — the `workflow` keyword steered a turn
  (fired from AppContainer alongside the trigger).
- `qwen-code.workflow_run` — a run reached a terminal state, with status +
  agents dispatched/completed + phase count + tokens + duration (fired from
  the WorkflowTool's terminal finally; wrapped so a logging failure can never
  mask the tool result).
 P7b-A2)

Covers `toSnapshot` (perPhaseTokens Map flattening, non-JSON result
placeholder, defensive array copy), the disk round-trip + newest-first sort,
unparseable-file skipping, the missing-dir tolerance, and the
MAX_RETAINED_SNAPSHOTS mtime prune — none of which were exercised directly
before (only indirectly via the /workflows merge tests).
…test (#4721)

Five `import('./workflow-journal.js').JournalEntry[]` annotations tripped
`@typescript-eslint/array-type` (T[] forbidden for non-simple types). Pure
type-annotation change; behavior unchanged.
…mmand label (#4721)

Self-review (doc-vs-code drift) caught the model-facing tool description still
claiming "No resume and no background execution yet (scheduled for later
phases)" — both now exist on this branch (P6 resume via resumeFromRunId; runs
tracked in /workflows + the background-tasks view). Replace the stale clause
with the real capabilities so the model isn't told a present feature is absent.

Also: point the schema XOR meta-comment at the `scriptPath` description (which
states it) rather than `script`'s (which doesn't), and add the missing
`formatCommandSourceLabel('workflow-command') === 'Workflow'` test guarding the
exhaustive CommandSource Record.
…ordTrigger (#4721)

Generated counterpart of the new `ui.disableWorkflowKeywordTrigger` setting
added in the P7-trigger commit; the schema mirror is committed in this repo.

@qqqys qqqys left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Critical: resumeFromRunId is used as a raw path segment for both the run id and the journal path.

At packages/core/src/tools/workflow/workflow.ts:240, any caller-provided resumeFromRunId becomes runId, and line 251 passes it directly to storage.getWorkflowRunJournalPath(runId). The storage helpers added in packages/core/src/config/storage.ts:383 and packages/core/src/config/storage.ts:390 then use path.join(...) with that value. A value such as ../../chats/<id> escapes <projectDir>/workflows, so running or resuming a workflow can read/write journal and snapshot files outside the workflow artifact directory and overwrite/corrupt other runtime data. This is user-controlled via the tool parameter, so it breaks the storage boundary for workflow/session artifacts.

Please validate resumeFromRunId before using it in any storage path, for example by accepting only generated run ids like wf_[0-9a-f]{16}, or route it through a dedicated sanitizer and verify the resolved snapshot/journal paths stay under getWorkflowRunsDir().

Comment thread packages/core/src/agents/runtime/workflow-saved.ts Outdated
Comment thread packages/core/src/tools/workflow/workflow.ts
Comment thread packages/cli/src/services/saved-workflow-loader.ts Outdated
Comment thread packages/core/src/agents/workflow-snapshot.ts
Comment thread packages/cli/src/ui/AppContainer.tsx
Comment thread packages/core/src/agents/runtime/workflow-orchestrator.ts
Comment thread packages/core/src/agents/runtime/workflow-journal.ts
Comment thread packages/core/src/agents/runtime/workflow-stall.ts
Comment thread packages/core/src/tools/workflow/workflow.ts Outdated
Comment thread packages/core/src/tools/workflow/workflow.ts
Comment thread packages/core/src/agents/runtime/workflow-saved.ts
Comment thread packages/core/src/agents/workflow-snapshot.ts
Comment thread packages/core/src/agents/runtime/workflow-journal.ts
Comment thread packages/core/src/agents/runtime/workflow-stall.ts
Comment thread packages/core/src/agents/runtime/workflow-saved.ts
#4721)

A real-scenario tmux run surfaced this: `descendFromComposer` only focuses the
live-agent panel (agent-kind entries) or the Arena tab bar, and a workflow is
never a live-agent-panel entry (`isLiveAgentPanelVisibleEntry` requires
`kind === 'agent'`). So in a session whose only background task is a workflow,
pressing ↓ from the composer focused nothing — the BackgroundTasksDialog could
not be opened by keyboard at all, which made the P7b-A3 save action (and the
per-run detail view) unreachable for exactly the workflow-only case they target.

Add a final `descendFromComposer` branch: when there's no live-agent panel and
no Arena tab bar but the background-tasks pill IS shown (`bgEntries.length > 0`),
focus the pill, completing the composer → pill → dialog chain.
@github-actions

github-actions Bot commented Jun 22, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 77.6% 77.6% 81.03% 79.74%
Core 83.51% 83.51% 85.01% 84.42%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |    77.6 |    79.74 |   81.03 |    77.6 |                   
 src               |   73.24 |    70.77 |   77.55 |   73.24 |                   
  gemini.tsx       |   63.93 |    66.07 |   71.42 |   63.93 | ...1229,1234-1239 
  ...ractiveCli.ts |   73.14 |       68 |      75 |   73.14 | ...1734-1736,1771 
  ...liCommands.ts |   88.02 |     82.1 |     100 |   88.02 | ...32,401,435,529 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   56.51 |    62.15 |   82.75 |   56.51 |                   
  acpAgent.ts      |   56.37 |    62.19 |   82.94 |   56.37 | ...7127,7152-7167 
  authMethods.ts   |      92 |       60 |     100 |      92 | 33-34             
  errorCodes.ts    |       0 |        0 |       0 |       0 | 1-22              
  ...DirContext.ts |     100 |      100 |     100 |     100 |                   
 ...ration/service |   68.65 |    83.33 |   66.66 |   68.65 |                   
  filesystem.ts    |   68.65 |    83.33 |   66.66 |   68.65 | ...32,77-94,97-98 
 ...ration/session |   85.58 |     78.5 |    88.8 |   85.58 |                   
  ...ryReplayer.ts |   67.34 |     75.6 |   81.81 |   67.34 | ...54-269,282-283 
  Session.ts       |   86.29 |    78.04 |   90.09 |   86.29 | ...4683,4709-4713 
  ...entTracker.ts |   91.39 |    89.47 |   88.88 |   91.39 | ...31,195,266-275 
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   84.21 |    83.33 |     100 |   84.21 | ...37-153,209-211 
  tasksSnapshot.ts |   94.06 |    86.66 |     100 |   94.06 | 60-66             
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ssion/emitters |   96.25 |    94.11 |   96.96 |   96.25 |                   
  BaseEmitter.ts   |    92.3 |    81.81 |     100 |    92.3 | 23-24             
  ...ageEmitter.ts |   95.23 |    95.12 |     100 |   95.23 | 48-55             
  PlanEmitter.ts   |     100 |      100 |     100 |     100 |                   
  ...allEmitter.ts |   98.44 |    94.44 |     100 |   98.44 | 318-319,420,428   
  index.ts         |       0 |        0 |       0 |       0 | 1-10              
 ...ession/rewrite |    91.3 |    88.09 |   94.44 |    91.3 |                   
  LlmRewriter.ts   |      81 |       84 |     100 |      81 | ...,88-89,155-159 
  ...Middleware.ts |   96.74 |    86.84 |     100 |   96.74 | 135,143-145       
  TurnBuffer.ts    |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 src/commands      |   62.14 |    89.28 |      50 |   62.14 |                   
  auth.ts          |     100 |    83.33 |     100 |     100 | 11,14             
  channel.ts       |   56.66 |      100 |       0 |   56.66 | 15-19,27-34       
  extensions.tsx   |   96.77 |      100 |      50 |   96.77 | 39                
  hooks.tsx        |   66.66 |      100 |       0 |   66.66 | 20-24             
  mcp.ts           |   95.45 |      100 |      50 |   95.45 | 31                
  review.ts        |   51.85 |      100 |       0 |   51.85 | 24-35,38          
  serve.ts         |   51.35 |     92.3 |      50 |   51.35 | 31-33,317-528     
  sessions.ts      |     100 |      100 |      50 |     100 |                   
 ...mmands/channel |   40.73 |    84.26 |      55 |   40.73 |                   
  ...l-registry.ts |    6.66 |      100 |       0 |    6.66 | 6-32,35-53        
  config-utils.ts  |      92 |      100 |   66.66 |      92 | 21-26             
  configure.ts     |    14.7 |      100 |       0 |    14.7 | 18-21,23-84       
  pairing.ts       |   26.31 |      100 |       0 |   26.31 | ...30,40-50,52-65 
  pidfile.ts       |   97.11 |    94.73 |     100 |   97.11 | 27-28,45          
  start.ts         |   31.94 |    53.84 |   71.42 |   31.94 | ...83-486,495-497 
  status.ts        |   17.85 |      100 |       0 |   17.85 | 15-26,32-76       
  stop.ts          |      20 |      100 |       0 |      20 | 14-48             
 ...nds/extensions |    87.4 |    89.38 |   84.74 |    87.4 |                   
  consent.ts       |   72.82 |       90 |   42.85 |   72.82 | ...86-142,157-163 
  disable.ts       |     100 |      100 |     100 |     100 |                   
  enable.ts        |     100 |      100 |     100 |     100 |                   
  install.ts       |   85.05 |    83.33 |      75 |   85.05 | ...05-208,211-220 
  link.ts          |     100 |      100 |     100 |     100 |                   
  list.ts          |     100 |     87.5 |     100 |     100 | 22                
  new.ts           |     100 |      100 |     100 |     100 |                   
  settings.ts      |   99.15 |      100 |   83.33 |   99.15 | 151               
  sources.ts       |   93.42 |    87.09 |   92.85 |   93.42 | ...4-66,96-98,167 
  uninstall.ts     |    37.5 |      100 |   33.33 |    37.5 | 23-45,57-64,67-70 
  update.ts        |   96.32 |      100 |     100 |   96.32 | 101-105           
  utils.ts         |   68.47 |    33.33 |     100 |   68.47 | ...98-102,104-108 
 ...les/mcp-server |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-60              
 ...amples/starter |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-64              
 src/commands/mcp  |   90.09 |    86.23 |   83.33 |   90.09 |                   
  add.ts           |    99.3 |    96.07 |     100 |    99.3 | 154-155           
  approve.ts       |   76.19 |     87.5 |   66.66 |   76.19 | ...,89-99,114-124 
  list.ts          |   92.59 |    83.87 |      80 |   92.59 | ...62-164,180-181 
  reconnect.ts     |    78.1 |    73.33 |   85.71 |    78.1 | 42-55,163-185     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...ommands/review |   11.57 |      100 |       0 |   11.57 |                   
  cleanup.ts       |   17.94 |      100 |       0 |   17.94 | ...01-106,108-109 
  deterministic.ts |   13.75 |      100 |       0 |   13.75 | ...22-738,740-741 
  fetch-pr.ts      |   11.36 |      100 |       0 |   11.36 | ...80-201,203-204 
  load-rules.ts    |   11.32 |      100 |       0 |   11.32 | ...41-153,155-156 
  pr-context.ts    |    6.22 |      100 |       0 |    6.22 | ...97-312,314-315 
  presubmit.ts     |    9.35 |      100 |       0 |    9.35 | ...62-287,289-290 
 ...nds/review/lib |      30 |      100 |       0 |      30 |                   
  gh.ts            |   22.58 |      100 |       0 |   22.58 | ...49,53-54,62-69 
  git.ts           |   22.72 |      100 |       0 |   22.72 | 15-18,29-39,43-44 
  paths.ts         |   52.94 |      100 |       0 |   52.94 | ...26,37-38,42-43 
 ...mands/sessions |   91.56 |    86.95 |   83.33 |   91.56 |                   
  common.ts        |     100 |      100 |     100 |     100 |                   
  list.ts          |   90.96 |    86.66 |   81.81 |   90.96 | 208-219,221-222   
 src/config        |   91.91 |    85.78 |   92.94 |   91.91 |                   
  auth.ts          |   88.94 |    83.56 |     100 |   88.94 | ...86-287,303-304 
  ...eMcpImport.ts |   87.88 |    81.52 |     100 |   87.88 | ...57-365,447-448 
  config.ts        |   86.59 |       84 |   82.75 |   86.59 | ...2078,2080-2088 
  keyBindings.ts   |   97.05 |       50 |     100 |   97.05 | 209-212           
  ...ngsAdapter.ts |     100 |    94.11 |     100 |     100 | 64                
  mcpApprovals.ts  |   96.12 |    94.87 |     100 |   96.12 | 193-194,199-201   
  mcpJson.ts       |     100 |      100 |     100 |     100 |                   
  mcpServers.ts    |   92.85 |     87.5 |     100 |   92.85 | 46-47             
  ...idersScope.ts |      92 |       90 |     100 |      92 | 11-12             
  ...abledTools.ts |     100 |      100 |     100 |     100 |                   
  sandboxConfig.ts |   61.64 |    71.87 |   66.66 |   61.64 | ...54-68,73,77-89 
  settings.ts      |   78.96 |       87 |    87.8 |   78.96 | ...1532,1547-1550 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  ...ngsWatcher.ts |   95.54 |    88.34 |     100 |   95.54 | ...28,277-278,293 
  ...tedFolders.ts |   96.89 |    93.65 |     100 |   96.89 | ...39-241,256-257 
 ...nfig/migration |   94.89 |    78.94 |   83.33 |   94.89 |                   
  index.ts         |   94.87 |    88.88 |     100 |   94.87 | 91-92             
  scheduler.ts     |   96.55 |    77.77 |     100 |   96.55 | 19-20             
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ation/versions |   94.74 |    96.06 |     100 |   94.74 |                   
  ...-v2-shared.ts |     100 |      100 |     100 |     100 |                   
  v1-to-v2.ts      |   81.75 |    90.56 |     100 |   81.75 | ...28-229,231-247 
  v2-to-v3.ts      |     100 |      100 |     100 |     100 |                   
  v3-to-v4.ts      |     100 |      100 |     100 |     100 |                   
 src/core          |     100 |      100 |     100 |     100 |                   
  auth.ts          |     100 |      100 |     100 |     100 |                   
  initializer.ts   |     100 |      100 |     100 |     100 |                   
  theme.ts         |     100 |      100 |     100 |     100 |                   
 src/dualOutput    |   69.39 |    66.66 |   63.15 |   69.39 |                   
  ...tputBridge.ts |   69.48 |     67.3 |    64.7 |   69.48 | ...82-383,391-394 
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/export        |       0 |        0 |       0 |       0 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-7               
 src/generated     |     100 |      100 |     100 |     100 |                   
  git-commit.ts    |     100 |      100 |     100 |     100 |                   
 src/i18n          |   84.12 |       80 |   67.56 |   84.12 |                   
  index.ts         |   67.45 |    76.92 |   57.14 |   67.45 | ...70-271,294-299 
  languages.ts     |   96.92 |    86.66 |     100 |   96.92 | 134-135,167,184   
  ...nslateKeys.ts |     100 |      100 |     100 |     100 |                   
  ...lationDict.ts |   93.33 |    66.66 |     100 |   93.33 | 15                
 src/i18n/locales  |     100 |      100 |     100 |     100 |                   
  ca.js            |     100 |      100 |     100 |     100 |                   
  de.js            |     100 |      100 |     100 |     100 |                   
  en.js            |     100 |      100 |     100 |     100 |                   
  fr.js            |     100 |      100 |     100 |     100 |                   
  ja.js            |     100 |      100 |     100 |     100 |                   
  pt.js            |     100 |      100 |     100 |     100 |                   
  ru.js            |     100 |      100 |     100 |     100 |                   
  zh-TW.js         |     100 |      100 |     100 |     100 |                   
  zh.js            |     100 |      100 |     100 |     100 |                   
 ...nonInteractive |   72.45 |    71.03 |   74.07 |   72.45 |                   
  session.ts       |   76.46 |    69.34 |   85.71 |   76.46 | ...32-833,842-852 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...90-591,594-595 
 ...active/control |   76.29 |    88.23 |      80 |   76.29 |                   
  ...rolContext.ts |    6.89 |        0 |       0 |    6.89 | 50-86             
  ...Dispatcher.ts |   91.66 |    91.83 |   88.88 |   91.66 | ...49-367,383,386 
  ...rolService.ts |     7.4 |        0 |       0 |     7.4 | 46-185            
 ...ol/controllers |    26.7 |    37.93 |   35.48 |    26.7 |                   
  ...Controller.ts |   36.97 |       80 |      80 |   36.97 | ...15-117,127-210 
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |   31.32 |     38.7 |      40 |   31.32 | ...68-577,592-597 
  ...Controller.ts |   14.06 |      100 |       0 |   14.06 | ...82-117,130-133 
  ...Controller.ts |   21.97 |    28.57 |   27.27 |   21.97 | ...39-451,460-489 
 .../control/types |       0 |        0 |       0 |       0 |                   
  serviceAPIs.ts   |       0 |        0 |       0 |       0 | 1                 
 ...Interactive/io |    98.1 |    94.18 |   95.23 |    98.1 |                   
  ...putAdapter.ts |   98.02 |    93.33 |   98.07 |   98.02 | ...1303,1398-1399 
  ...putAdapter.ts |      96 |    91.66 |   85.71 |      96 | 51-52             
  ...nputReader.ts |     100 |    94.73 |     100 |     100 | 67                
  ...putAdapter.ts |   98.38 |      100 |   90.47 |   98.38 | 83-84,124-125     
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/patches       |       0 |        0 |       0 |       0 |                   
  is-in-ci.ts      |       0 |        0 |       0 |       0 | 1-17              
 src/remoteInput   |   83.12 |    73.43 |    87.5 |   83.12 |                   
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  ...putWatcher.ts |   83.77 |    74.19 |   92.85 |   83.77 | ...05-306,317-320 
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/serve         |   80.51 |    81.39 |   81.27 |   80.51 |                   
  ...sionBridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   93.26 |    92.64 |     100 |   93.26 | ...07-308,311-313 
  ...em-adapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |    95.45 |     100 |     100 | 342               
  ...s-provider.ts |   67.01 |    51.42 |     100 |   67.01 | ...40-245,278-286 
  daemonLogger.ts  |   98.63 |    90.32 |   95.83 |   98.63 | 161,165           
  daemonStatus.ts  |    98.3 |    82.99 |     100 |    98.3 | ...11,513-514,563 
  debug-mode.ts    |     100 |      100 |     100 |     100 |                   
  demo.ts          |     100 |      100 |     100 |     100 |                   
  env-snapshot.ts  |   92.75 |       84 |     100 |   92.75 | 110-113,179-186   
  event-bus.ts     |     100 |      100 |     100 |     100 |                   
  ...ry-channel.ts |       0 |        0 |       0 |       0 | 1-14              
  index.ts         |       0 |        0 |       0 |       0 | 1-143             
  ...back-binds.ts |     100 |      100 |     100 |     100 |                   
  ...sion-audit.ts |     100 |      100 |   93.33 |     100 |                   
  rate-limit.ts    |   90.37 |    87.77 |   93.75 |   90.37 | ...95-297,348-352 
  ...qwen-serve.ts |   69.69 |    82.77 |   32.69 |   69.69 | ...1472,1475-1482 
  server.ts        |   81.26 |    81.98 |    85.1 |   81.26 | ...5602,5668-5677 
  status.ts        |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...hellStatic.ts |   89.56 |       80 |     100 |   89.56 | ...88-191,224-227 
  ...ace-agents.ts |   62.47 |    70.34 |   90.47 |   62.47 | ...1346,1356-1366 
  ...ace-memory.ts |   87.13 |    78.46 |     100 |   87.13 | ...54-361,421-428 
 src/serve/acpHttp |   68.65 |     70.5 |   93.75 |   68.65 |                   
  ...onRegistry.ts |   89.08 |    82.43 |   93.33 |   89.08 | ...05,479,499-513 
  dispatch.ts      |   60.72 |    64.34 |     100 |   60.72 | ...2579,2653-2656 
  index.ts         |   75.63 |    68.21 |    90.9 |   75.63 | ...31,734,760-762 
  jsonRpc.ts       |     100 |    96.96 |     100 |     100 | 92                
  sseStream.ts     |   93.91 |    87.87 |   84.61 |   93.91 | ...50-152,154-156 
  ...portStream.ts |       0 |        0 |       0 |       0 | 1                 
  wsStream.ts      |   91.86 |       80 |     100 |   91.86 | 45,50,93,97-100   
 src/serve/auth    |   86.86 |    79.18 |   93.87 |   86.86 |                   
  device-flow.ts   |   96.35 |       80 |   97.61 |   96.35 | ...1358,1453,1519 
  ...w-provider.ts |   44.24 |    74.07 |   71.42 |   44.24 | ...23-284,297,301 
 src/serve/fs      |   85.12 |    81.01 |     100 |   85.12 |                   
  audit.ts         |     100 |    96.15 |     100 |     100 | 201               
  errors.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  paths.ts         |   77.82 |    77.08 |     100 |   77.82 | ...64,493-497,510 
  policy.ts        |   90.32 |    89.18 |     100 |   90.32 | 142-150           
  ...ile-system.ts |   84.03 |    78.55 |     100 |   84.03 | ...2031,2058-2059 
 src/serve/routes  |   75.89 |    76.51 |   94.28 |   75.89 |                   
  a2uiAction.ts    |     100 |    93.65 |     100 |     100 | 114-118,163,267   
  ...-file-read.ts |   94.41 |    76.92 |     100 |   94.41 | ...28-329,390-392 
  ...file-write.ts |    82.1 |    60.52 |     100 |    82.1 | ...42-244,247-249 
  ...e-settings.ts |   23.62 |      100 |      50 |   23.62 | ...10-223,230-327 
 ...kspace-service |   81.62 |     82.3 |    87.5 |   81.62 |                   
  index.ts         |   81.79 |    83.03 |   93.33 |   81.79 | ...93-498,558-623 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 src/services      |   92.34 |    91.07 |   97.82 |   92.34 |                   
  ...mandLoader.ts |     100 |    88.88 |     100 |     100 | 99-112            
  ...killLoader.ts |     100 |    93.33 |     100 |     100 | 48,67             
  ...andService.ts |   98.73 |      100 |     100 |   98.73 | 107               
  ...mandLoader.ts |   86.83 |    83.87 |     100 |   86.83 | ...30-335,340-345 
  ...omptLoader.ts |   75.84 |    80.64 |   83.33 |   75.84 | ...10-211,277-278 
  ...mandLoader.ts |     100 |    97.14 |     100 |     100 | 66                
  ...nd-factory.ts |   91.42 |    91.66 |     100 |   91.42 | 128,137-144       
  ...ation-tool.ts |     100 |    95.45 |     100 |     100 | 125               
  ...ndMetadata.ts |   98.23 |    96.72 |     100 |   98.23 | 83,87             
  commandUtils.ts  |      96 |     90.9 |     100 |      96 | 48                
  ...and-parser.ts |   90.69 |    85.71 |     100 |   90.69 | 63-66             
  ...ionService.ts |     100 |      100 |     100 |     100 |                   
  ...low-loader.ts |     100 |    96.29 |     100 |     100 | 88                
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...ght/generators |    88.3 |    85.49 |   92.59 |    88.3 |                   
  DataProcessor.ts |   88.22 |    85.48 |      95 |   88.22 | ...1341,1345-1352 
  ...tGenerator.ts |   98.21 |    85.71 |     100 |   98.21 | 46                
  ...teRenderer.ts |   45.45 |      100 |       0 |   45.45 | 13-51             
 .../insight/types |       0 |       50 |      50 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 | 1                 
 ...mpt-processors |   97.27 |    94.04 |     100 |   97.27 |                   
  ...tProcessor.ts |     100 |      100 |     100 |     100 |                   
  ...eProcessor.ts |   94.52 |    84.21 |     100 |   94.52 | 46-47,93-94       
  ...tionParser.ts |     100 |      100 |     100 |     100 |                   
  ...lProcessor.ts |   97.41 |    95.65 |     100 |   97.41 | 95-98             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services/tips |   97.35 |    84.84 |     100 |   97.35 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  tipHistory.ts    |   92.59 |       70 |     100 |   92.59 | ...24,146,153,162 
  tipRegistry.ts   |     100 |      100 |     100 |     100 |                   
  tipScheduler.ts  |     100 |    91.66 |     100 |     100 | 55                
 src/startup       |   80.53 |     74.6 |     100 |   80.53 |                   
  ...reeStartup.ts |   80.53 |     74.6 |     100 |   80.53 | ...94,403,409-412 
 src/test-utils    |   93.78 |    83.33 |      80 |   93.78 |                   
  ...omMatchers.ts |   69.69 |       50 |      50 |   69.69 | 32-35,37-39,45-47 
  ...andContext.ts |     100 |      100 |     100 |     100 |                   
  render.tsx       |     100 |      100 |     100 |     100 |                   
 src/ui            |   70.17 |    73.02 |   60.93 |   70.17 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |   70.67 |     66.5 |      55 |   70.67 | ...3422,3426-3430 
  ...tionNudge.tsx |    9.58 |      100 |       0 |    9.58 | 24-94             
  ...ackDialog.tsx |   29.23 |      100 |       0 |   29.23 | 25-75             
  ...tionNudge.tsx |    7.69 |      100 |       0 |    7.69 | 25-103            
  colors.ts        |      60 |      100 |   35.29 |      60 | ...52,54-55,60-61 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  keyMatchers.ts   |   95.91 |    97.14 |     100 |   95.91 | 25-26             
  ...tic-colors.ts |     100 |      100 |     100 |     100 |                   
  ...inePresets.ts |   98.28 |    89.87 |     100 |   98.28 | ...34,261,420-422 
  textConstants.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/auth       |   59.21 |    65.94 |   51.11 |   59.21 |                   
  AuthDialog.tsx   |   62.87 |     42.1 |   18.18 |   62.87 | ...03,310-332,336 
  ...nProgress.tsx |       0 |        0 |       0 |       0 | 1-64              
  ...etupSteps.tsx |   60.03 |    70.37 |      56 |   60.03 | ...87,791,800,803 
  useAuth.ts       |    94.6 |    73.52 |     100 |    94.6 | ...21-222,241-247 
  ...rSetupFlow.ts |   43.52 |    33.33 |      50 |   43.52 | ...72-393,410-453 
 src/ui/commands   |   78.86 |    81.12 |    87.6 |   78.86 |                   
  aboutCommand.ts  |     100 |      100 |     100 |     100 |                   
  agentsCommand.ts |   83.78 |      100 |      60 |   83.78 | 30-32,42-44       
  ...odeCommand.ts |   89.47 |    81.25 |     100 |   89.47 | 92-93,95-100      
  arenaCommand.ts  |   62.81 |    58.73 |   65.21 |   62.81 | ...90-595,680-688 
  authCommand.ts   |     100 |      100 |     100 |     100 |                   
  branchCommand.ts |     100 |      100 |     100 |     100 |                   
  btwCommand.ts    |   94.32 |    77.41 |     100 |   94.32 | 35-36,114-119     
  bugCommand.ts    |     100 |    77.77 |     100 |     100 | 27,61             
  cdCommand.ts     |   89.44 |    80.35 |     100 |   89.44 | ...81,106-111,190 
  clearCommand.ts  |   79.64 |       68 |     100 |   79.64 | ...24-125,133-142 
  ...essCommand.ts |   67.95 |    55.88 |      75 |   67.95 | ...86-187,201-204 
  ...astCommand.ts |   70.86 |    74.07 |      75 |   70.86 | ...,61-93,117-122 
  ...extCommand.ts |   65.35 |     66.1 |   84.61 |   65.35 | ...42-575,586-587 
  copyCommand.ts   |   98.49 |    95.78 |     100 |   98.49 | ...80,280,321,327 
  deleteCommand.ts |     100 |      100 |     100 |     100 |                   
  diffCommand.ts   |     100 |     87.5 |     100 |     100 | ...61,224-225,238 
  ...ryCommand.tsx |   81.84 |    86.11 |   91.66 |   81.84 | ...66-271,318-325 
  docsCommand.ts   |     100 |     90.9 |     100 |     100 | 25                
  doctorCommand.ts |   65.37 |    81.88 |   94.11 |   65.37 | ...85-535,538-672 
  dreamCommand.ts  |   85.45 |    88.88 |     100 |   85.45 | 58-65             
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  exportCommand.ts |   98.25 |    91.02 |     100 |   98.25 | ...81,198-199,364 
  ...onsCommand.ts |    50.3 |    48.14 |   69.23 |    50.3 | ...08,262-314,375 
  forgetCommand.ts |     100 |       90 |     100 |     100 | 59                
  forkCommand.ts   |     100 |    94.11 |     100 |     100 | 96,147            
  goalCommand.ts   |   91.46 |    84.44 |      90 |   91.46 | ...87-190,202-205 
  helpCommand.ts   |     100 |      100 |     100 |     100 |                   
  ...oryCommand.ts |     100 |      100 |     100 |     100 |                   
  hooksCommand.ts  |   81.13 |    65.71 |   85.71 |   81.13 | ...,86-93,131-132 
  ideCommand.ts    |   60.75 |    64.28 |   41.17 |   60.75 | ...05-306,310-324 
  ...figCommand.ts |   52.83 |    81.25 |      70 |   52.83 | ...74-319,321-330 
  initCommand.ts   |   84.33 |    72.72 |     100 |   84.33 | 68,82-87,89-94    
  ...ghtCommand.ts |   77.87 |    71.42 |     100 |   77.87 | ...44-245,250-272 
  ...ageCommand.ts |   92.17 |    82.69 |     100 |   92.17 | ...39,159,168-178 
  lspCommand.ts    |     100 |    86.95 |     100 |     100 | 31,101-102        
  mcpCommand.ts    |     100 |      100 |     100 |     100 |                   
  memoryCommand.ts |     100 |      100 |     100 |     100 |                   
  modelCommand.ts  |   79.34 |    81.33 |   77.77 |   79.34 | ...26-331,383-388 
  ...onsCommand.ts |     100 |      100 |     100 |     100 |                   
  planCommand.ts   |   78.82 |    76.92 |     100 |   78.82 | 30-35,51-56,68-73 
  quitCommand.ts   |     100 |      100 |     100 |     100 |                   
  recapCommand.ts  |   21.81 |      100 |      50 |   21.81 | 24-73             
  ...berCommand.ts |      96 |       70 |     100 |      96 | 57,62             
  renameCommand.ts |   85.71 |    86.04 |     100 |   85.71 | ...02-209,216-221 
  ...oreCommand.ts |    90.9 |    86.04 |     100 |    90.9 | ...41-146,176-177 
  resumeCommand.ts |     100 |      100 |     100 |     100 |                   
  rewindCommand.ts |   81.25 |      100 |      50 |   81.25 | 20-22             
  ...ngsCommand.ts |     100 |      100 |     100 |     100 |                   
  ...hubCommand.ts |   81.43 |    65.21 |      80 |   81.43 | ...70-173,176-179 
  skillsCommand.ts |    85.5 |    81.25 |     100 |    85.5 | 36-44,70          
  statsCommand.ts  |   90.15 |    78.53 |     100 |   90.15 | ...55-658,749-756 
  ...ineCommand.ts |     100 |      100 |     100 |     100 |                   
  ...aryCommand.ts |    6.43 |      100 |      50 |    6.43 | 31-330            
  tasksCommand.ts  |   77.22 |    72.13 |     100 |   77.22 | ...46-150,172-177 
  ...tupCommand.ts |     100 |      100 |     100 |     100 |                   
  themeCommand.ts  |     100 |      100 |     100 |     100 |                   
  toolsCommand.ts  |     100 |      100 |     100 |     100 |                   
  trustCommand.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  vimCommand.ts    |   54.54 |      100 |      50 |   54.54 | 19-29             
  voice-command.ts |   94.73 |    89.74 |     100 |   94.73 | 64,126-131        
  ...owsCommand.ts |   91.82 |    78.87 |   66.66 |   91.82 | ...59-160,169-174 
 src/ui/components |   64.87 |    77.63 |   63.07 |   64.87 |                   
  AboutBox.tsx     |     100 |      100 |     100 |     100 |                   
  AnsiOutput.tsx   |   65.57 |      100 |      50 |   65.57 | 69-90             
  ApiKeyInput.tsx  |       0 |        0 |       0 |       0 | 1-97              
  AppHeader.tsx    |    88.7 |       75 |     100 |    88.7 | 36,38-43,45       
  ...odeDialog.tsx |   87.24 |    72.22 |   33.33 |   87.24 | ...85,233-238,245 
  AsciiArt.ts      |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |   16.27 |      100 |       0 |   16.27 | 19-58             
  ...TextInput.tsx |   84.21 |    80.59 |     100 |   84.21 | ...36-238,252-254 
  Composer.tsx     |   94.39 |    66.66 |     100 |   94.39 | ...-71,83,138,151 
  ...entPrompt.tsx |     100 |      100 |     100 |     100 |                   
  ...ryDisplay.tsx |   75.89 |    62.06 |     100 |   75.89 | ...,88,93-108,113 
  ...geDisplay.tsx |   68.42 |    57.14 |     100 |   68.42 | 16-17,31-32,42-50 
  ...ification.tsx |   28.57 |      100 |       0 |   28.57 | 16-36             
  ...gProfiler.tsx |       0 |        0 |       0 |       0 | 1-36              
  ...ogManager.tsx |   11.61 |      100 |       0 |   11.61 | 69-563            
  DiffDialog.tsx   |   31.17 |    19.51 |   30.76 |   31.17 | ...07-712,722-735 
  ...ngsDialog.tsx |    8.44 |      100 |       0 |    8.44 | 37-195            
  ExitWarning.tsx  |     100 |      100 |     100 |     100 |                   
  ...hProgress.tsx |    87.8 |    33.33 |     100 |    87.8 | 28-31,56          
  ...ustDialog.tsx |     100 |      100 |     100 |     100 |                   
  Footer.tsx       |   78.91 |    54.34 |     100 |   78.91 | ...43,176,198-203 
  ...ngSpinner.tsx |   68.42 |       80 |      50 |   68.42 | 35-52,73,80-81    
  GoalPill.tsx     |   76.19 |    81.81 |     100 |   76.19 | 24-30,46-50       
  Header.tsx       |   98.62 |    94.28 |     100 |   98.62 | 162,164           
  Help.tsx         |   98.32 |       90 |     100 |   98.32 | ...24,381,447-448 
  ...emDisplay.tsx |   72.56 |       60 |     100 |   72.56 | ...89,392,395-401 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |   82.55 |    79.78 |      75 |   82.55 | ...1864,1890,1942 
  ...Shortcuts.tsx |   20.87 |      100 |       0 |   20.87 | ...6,49-51,67-125 
  ...Indicator.tsx |   98.14 |    97.82 |     100 |   98.14 | 157-158           
  ...firmation.tsx |   91.42 |      100 |      50 |   91.42 | 26-31             
  MainContent.tsx  |   87.36 |     87.2 |   66.66 |   87.36 | ...20-321,380-384 
  MemoryDialog.tsx |   61.87 |    76.05 |    62.5 |   61.87 | ...72,391,428-430 
  ...geDisplay.tsx |       0 |        0 |       0 |       0 | 1-41              
  ModelDialog.tsx  |   83.58 |    70.44 |     100 |   83.58 | ...72-688,745-749 
  ...tsDisplay.tsx |     100 |    97.22 |     100 |     100 | 270               
  ...fications.tsx |   18.18 |      100 |       0 |   18.18 | 15-58             
  ...onsDialog.tsx |    2.13 |      100 |       0 |    2.13 | 62-133,148-1004   
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...icePrompt.tsx |   92.64 |    85.71 |     100 |   92.64 | 102-106,134-139   
  PrepareLabel.tsx |   91.66 |    77.27 |     100 |   91.66 | 73-75,77-79,110   
  ...atePrompt.tsx |    8.57 |      100 |       0 |    8.57 | 24-55,58-134      
  ...geDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ngDisplay.tsx |   21.42 |      100 |       0 |   21.42 | 13-39             
  ...hProgress.tsx |   85.25 |    88.46 |     100 |   85.25 | 121-147           
  ...dSelector.tsx |   92.79 |    82.65 |     100 |   92.79 | ...19-323,354-370 
  ...ionPicker.tsx |   83.66 |    72.13 |     100 |   83.66 | ...96,402,444-466 
  ...onPreview.tsx |   93.54 |    84.21 |     100 |   93.54 | ...,70-71,194-196 
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...putPrompt.tsx |   72.56 |       80 |      40 |   72.56 | ...06-109,114-117 
  ...tedDialog.tsx |     100 |      100 |     100 |     100 |                   
  ...ngsDialog.tsx |   68.27 |    71.66 |      75 |   68.27 | ...16-824,830-831 
  ...ionDialog.tsx |    92.3 |    96.15 |   33.33 |    92.3 | 60-63,68-75,164   
  ...putPrompt.tsx |    15.9 |      100 |       0 |    15.9 | 20-63             
  ...Indicator.tsx |   57.14 |      100 |       0 |   57.14 | 12-15             
  ...MoreLines.tsx |      28 |      100 |       0 |      28 | 18-40             
  ...ionPicker.tsx |   17.59 |      100 |       0 |   17.59 | 55-172            
  ...tivityTab.tsx |    3.94 |      100 |       0 |    3.94 | 27-275            
  StatsDialog.tsx  |    8.85 |      100 |       0 |    8.85 | ...5,49-84,92-238 
  StatsDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ciencyTab.tsx |    3.28 |      100 |       0 |    3.28 | 25-258            
  ...atmapView.tsx |    8.98 |      100 |       0 |    8.98 | 20-107            
  ...essionTab.tsx |    5.46 |      100 |       0 |    5.46 | 24-215            
  ...ineDialog.tsx |    93.5 |    85.18 |     100 |    93.5 | ...05,267,287-289 
  ...yTodoList.tsx |   96.33 |    88.23 |     100 |   96.33 | 137-140           
  ...nsDisplay.tsx |   90.47 |    75.86 |     100 |   90.47 | ...46,149,176-178 
  ThemeDialog.tsx  |   89.95 |    46.15 |      75 |   89.95 | ...71-173,243-245 
  Tips.tsx         |   93.54 |       75 |     100 |   93.54 | 39-40             
  TodoDisplay.tsx  |     100 |      100 |     100 |     100 |                   
  ...tsDisplay.tsx |     100 |     87.5 |     100 |     100 | 31-32             
  TrustDialog.tsx  |     100 |    81.81 |     100 |     100 | 71-86             
  ...ification.tsx |   36.36 |      100 |       0 |   36.36 | 15-22             
  ...Indicator.tsx |   97.36 |     87.5 |     100 |   97.36 | 51                
  ...ackDialog.tsx |    7.84 |      100 |       0 |    7.84 | 24-134            
  ...xitDialog.tsx |   80.36 |    43.47 |      60 |   80.36 | ...24-238,248-251 
  ...odeVisuals.ts |   91.42 |    64.28 |     100 |   91.42 | 15,21,24          
  ...s-helpers.tsx |      25 |      100 |       0 |      25 | ...3,86-89,94-102 
 ...nts/agent-view |   54.01 |    70.87 |   42.85 |   54.01 |                   
  ...atContent.tsx |    8.83 |      100 |       0 |    8.83 | 53-268,274-276    
  ...tChatView.tsx |   21.05 |      100 |       0 |   21.05 | 21-39             
  ...tComposer.tsx |   64.78 |    29.41 |   33.33 |   64.78 | ...51,269,277-279 
  AgentFooter.tsx  |   17.07 |      100 |       0 |   17.07 | 28-66             
  AgentHeader.tsx  |   15.38 |      100 |       0 |   15.38 | 27-64             
  AgentTabBar.tsx  |    87.9 |    63.88 |     100 |    87.9 | ...88,110-118,136 
  ...oryAdapter.ts |     100 |    91.83 |     100 |     100 | 103,109-110,138   
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
 ...mponents/arena |   45.59 |    70.53 |   60.86 |   45.59 |                   
  ArenaCards.tsx   |   73.06 |    71.79 |   85.71 |   73.06 | ...83-185,321-326 
  ...ectDialog.tsx |   83.48 |    69.86 |   88.88 |   83.48 | ...88-392,409-410 
  ...artDialog.tsx |    9.92 |      100 |       0 |    9.92 | 27-164            
  ...tusDialog.tsx |    5.63 |      100 |       0 |    5.63 | 33-75,80-288      
  ...topDialog.tsx |    6.17 |      100 |       0 |    6.17 | 33-213            
 ...ackground-view |   78.47 |     77.8 |   88.09 |   78.47 |                   
  ...sksDialog.tsx |   73.81 |    74.32 |   79.16 |   73.81 | ...1546,1568-1574 
  ...TasksPill.tsx |   67.03 |     86.2 |     100 |   67.03 | ...02-122,130-138 
  ...gentPanel.tsx |   97.43 |    85.39 |     100 |   97.43 | 121,436-440       
  ...Visibility.ts |     100 |      100 |     100 |     100 |                   
  ...e-overlay.tsx |   88.57 |    76.47 |     100 |   88.57 | ...34-136,138-140 
 ...nts/extensions |   84.58 |    78.18 |   83.33 |   84.58 |                   
  ...gerDialog.tsx |   82.46 |    77.77 |     100 |   82.46 | ...89,191-198,258 
  TabBar.tsx       |   97.29 |    88.88 |     100 |   97.29 | 33                
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...tensions/steps |   47.01 |    84.74 |   58.82 |   47.01 |                   
  ...ctionStep.tsx |   95.12 |    92.85 |   85.71 |   95.12 | 84-86,89          
  ...etailStep.tsx |       0 |        0 |       0 |       0 | 1-145             
  ...nListStep.tsx |   75.13 |    88.09 |   66.66 |   75.13 | ...52,173,202-208 
  ...electStep.tsx |       0 |        0 |       0 |       0 | 1-77              
  ...nfirmStep.tsx |   17.39 |      100 |       0 |   17.39 | 28-71             
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
 ...xtensions/tabs |   66.18 |    67.65 |   66.66 |   66.18 |                   
  DiscoverTab.tsx  |   57.21 |     63.2 |   55.55 |   57.21 | ...98,661-665,669 
  InstalledTab.tsx |   71.62 |    68.65 |   83.33 |   71.62 | ...67,772-773,810 
  SourcesTab.tsx   |   69.25 |     70.4 |   66.66 |   69.25 | ...16,535,607-619 
 ...tensions/views |   23.84 |       44 |    6.25 |   23.84 |                   
  ...tionsView.tsx |    6.02 |      100 |       0 |    6.02 | 52-65,68-368      
  ...tionsView.tsx |   46.44 |       44 |    9.09 |   46.44 | ...45-352,355-367 
  ...etailView.tsx |    9.56 |      100 |       0 |    9.56 | 40-67,70-158      
 ...mponents/hooks |   86.85 |     81.3 |   91.89 |   86.85 |                   
  ...rListBody.tsx |   95.29 |    85.18 |     100 |   95.29 | 95-98             
  ...etailStep.tsx |   75.32 |    71.42 |      60 |   75.32 | ...56-169,173-186 
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entHeader.tsx |     100 |    85.71 |     100 |     100 | 47                
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...abledStep.tsx |     100 |      100 |     100 |     100 |                   
  ...sListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   72.29 |    70.24 |     100 |   72.29 | ...51,563-568,572 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-13              
  ...erGrouping.ts |     100 |      100 |     100 |     100 |                   
  sourceLabels.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...components/mcp |   20.12 |    91.83 |   76.92 |   20.12 |                   
  ...ealthPill.tsx |   68.42 |    85.71 |     100 |   68.42 | 40-46             
  ...entDialog.tsx |     3.3 |      100 |       0 |     3.3 | 46-799            
  ...valDialog.tsx |   15.06 |      100 |       0 |   15.06 | 40-109            
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-30              
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |      97 |       95 |     100 |      97 | 24,113-114        
 ...ents/mcp/steps |   39.43 |       40 |   43.75 |   39.43 |                   
  ...icateStep.tsx |    5.65 |      100 |       0 |    5.65 | 40-66,69-308      
  ...electStep.tsx |   10.95 |      100 |       0 |   10.95 | 16-88             
  ...etailStep.tsx |   57.58 |      7.4 |   33.33 |   57.58 | ...43-252,263-282 
  ...rListStep.tsx |   74.82 |    55.88 |     100 |   74.82 | ...65-170,181-185 
  ...etailStep.tsx |    10.3 |      100 |       0 |    10.3 | ...1,67-79,82-140 
  ToolListStep.tsx |   69.29 |       50 |     100 |   69.29 | ...23,126,135-144 
 ...nents/messages |   83.19 |    79.81 |   78.82 |   83.19 |                   
  ...ionDialog.tsx |   80.84 |     77.6 |    62.5 |   80.84 | ...98,516,534-536 
  BtwMessage.tsx   |     100 |      100 |     100 |     100 |                   
  ...upDisplay.tsx |   97.67 |    83.72 |     100 |   97.67 | 119,142,150       
  ...onMessage.tsx |   91.93 |    82.35 |     100 |   91.93 | 57-59,61,63       
  ...nMessages.tsx |   81.14 |    74.41 |    92.3 |   81.14 | ...00-406,460-466 
  DiffRenderer.tsx |   93.19 |    86.17 |     100 |   93.19 | ...09,237-238,304 
  ...tsDisplay.tsx |   97.82 |    77.27 |     100 |   97.82 | 87,89             
  ...usMessage.tsx |   76.31 |     42.1 |   66.66 |   76.31 | ...99,101,124,155 
  ...tsDisplay.tsx |   95.18 |    88.05 |     100 |   95.18 | ...32,134,167-172 
  ...ssMessage.tsx |    12.5 |      100 |       0 |    12.5 | 18-59             
  ...edMessage.tsx |   16.66 |      100 |       0 |   16.66 | 22-38             
  ...sMessages.tsx |   55.67 |       40 |   28.57 |   55.67 | ...20-125,133-145 
  ...ryMessage.tsx |   14.28 |      100 |       0 |   14.28 | 23-62             
  ...onMessage.tsx |   82.31 |    74.02 |   33.33 |   82.31 | ...69-471,478-480 
  ...upMessage.tsx |   82.63 |    92.85 |     100 |   82.63 | ...85-412,434-449 
  ToolMessage.tsx  |   88.19 |    74.32 |    92.3 |   88.19 | ...60-765,792-794 
 ...ponents/shared |   84.45 |    80.93 |    95.5 |   84.45 |                   
  ...ctionList.tsx |     100 |      100 |     100 |     100 |                   
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  EnumSelector.tsx |     100 |    96.42 |     100 |     100 | 58                
  MaxSizedBox.tsx  |   83.01 |    86.15 |   88.88 |   83.01 | ...12-513,618-619 
  MultiSelect.tsx  |   93.58 |       75 |     100 |   93.58 | ...43,199-201,211 
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...eSelector.tsx |     100 |       60 |     100 |     100 | 40-45             
  ...lableList.tsx |   76.25 |       80 |     100 |   76.25 | 44-58,65-68       
  StaticRender.tsx |   72.72 |      100 |     100 |   72.72 | 31-33             
  TextInput.tsx    |    80.8 |    67.24 |      80 |    80.8 | ...36-240,252-258 
  ...apsedTime.tsx |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |     100 |      100 |     100 |     100 |                   
  ...lizedList.tsx |   84.26 |    80.88 |      90 |   84.26 | ...68-696,743-765 
  text-buffer.ts   |   85.94 |    81.73 |   97.91 |   85.94 | ...2651,2749-2750 
  ...er-actions.ts |   73.93 |    67.22 |     100 |   73.93 | ...32-733,934-936 
 ...ponents/skills |    3.61 |      100 |       0 |    3.61 |                   
  ...gerDialog.tsx |    3.61 |      100 |       0 |    3.61 | ...90-148,151-694 
 ...ents/subagents |   30.87 |        0 |       0 |   30.87 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
  reducers.tsx     |    12.1 |      100 |       0 |    12.1 | 33-190            
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |   10.95 |      100 |       0 |   10.95 | ...1,56-57,60-102 
 ...bagents/create |    9.13 |      100 |       0 |    9.13 |                   
  ...ionWizard.tsx |    7.28 |      100 |       0 |    7.28 | 34-299            
  ...rSelector.tsx |   14.75 |      100 |       0 |   14.75 | 26-85             
  ...onSummary.tsx |    4.26 |      100 |       0 |    4.26 | 27-331            
  ...tionInput.tsx |    8.63 |      100 |       0 |    8.63 | 23-177            
  ...dSelector.tsx |   33.33 |      100 |       0 |   33.33 | 20-21,26-27,36-63 
  ...nSelector.tsx |    37.5 |      100 |       0 |    37.5 | 20-21,26-27,36-58 
  ...EntryStep.tsx |   12.76 |      100 |       0 |   12.76 | 34-78             
  ToolSelector.tsx |    4.16 |      100 |       0 |    4.16 | 31-253            
 ...bagents/manage |   21.51 |    59.52 |   27.27 |   21.51 |                   
  ...ctionStep.tsx |   10.25 |      100 |       0 |   10.25 | 21-103            
  ...eleteStep.tsx |   20.93 |      100 |       0 |   20.93 | 23-62             
  ...tEditStep.tsx |   25.53 |      100 |       0 |   25.53 | ...2,37-38,51-124 
  ...ctionStep.tsx |   35.42 |    59.52 |     100 |   35.42 | ...20-432,437-439 
  ...iewerStep.tsx |   13.72 |      100 |       0 |   13.72 | 18-73             
  ...gerDialog.tsx |    6.74 |      100 |       0 |    6.74 | 35-341            
 ...mponents/views |   70.24 |    67.32 |    64.7 |   70.24 |                   
  ContextUsage.tsx |   70.88 |    63.88 |      80 |   70.88 | ...20-426,463-557 
  DoctorReport.tsx |     9.8 |      100 |       0 |     9.8 | 25-54,57-131      
  ...sionsList.tsx |   87.87 |    73.68 |     100 |   87.87 | 69-76             
  McpStatus.tsx    |   89.53 |    60.52 |     100 |   89.53 | ...72,175-177,262 
  SkillsList.tsx   |   27.27 |      100 |       0 |   27.27 | 18-35             
  ToolsList.tsx    |     100 |      100 |     100 |     100 |                   
 src/ui/contexts   |   77.25 |     77.4 |   81.03 |   77.25 |                   
  ...ewContext.tsx |   64.83 |    88.88 |      50 |   64.83 | ...16-219,225-235 
  AppContext.tsx   |      80 |       50 |     100 |      80 | 19-20             
  ...ewContext.tsx |   92.45 |    62.79 |      50 |   92.45 | ...69-270,272-276 
  ...deContext.tsx |     100 |      100 |     100 |     100 |                   
  ...igContext.tsx |   81.81 |       50 |     100 |   81.81 | 15-16             
  ...ssContext.tsx |   81.26 |    81.04 |     100 |   81.26 | ...1199,1203-1205 
  ...owContext.tsx |   91.07 |    81.81 |     100 |   91.07 | 47-48,60-62       
  ...deContext.tsx |     100 |      100 |      50 |     100 |                   
  ...onContext.tsx |   43.26 |     62.5 |    62.5 |   43.26 | ...64-267,276-279 
  ...gsContext.tsx |     100 |      100 |     100 |     100 |                   
  ...usContext.tsx |     100 |      100 |     100 |     100 |                   
  ...ngContext.tsx |   71.42 |       50 |     100 |   71.42 | 17-20             
  ...utContext.tsx |   85.71 |      100 |   66.66 |   85.71 | 13-14             
  ...nsContext.tsx |   88.88 |       50 |     100 |   88.88 | 137-138           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 216-217           
  ...deContext.tsx |      80 |     87.5 |      75 |      80 | ...11-112,118-120 
 src/ui/daemon     |   90.65 |    73.61 |   95.45 |   90.65 |                   
  ...ui-adapter.ts |   90.65 |    73.61 |   95.45 |   90.65 | ...44,762-763,849 
 src/ui/editors    |   93.33 |    85.71 |   66.66 |   93.33 |                   
  ...ngsManager.ts |   93.33 |    85.71 |   66.66 |   93.33 | 49,63-64          
 src/ui/hooks      |   83.16 |    81.32 |   86.95 |   83.16 |                   
  ...dProcessor.ts |   88.67 |    82.55 |     100 |   88.67 | ...31-632,638-643 
  keyToAnsi.ts     |    3.92 |      100 |       0 |    3.92 | 19-77             
  ...esourceRef.ts |     100 |      100 |     100 |     100 |                   
  ...dProcessor.ts |   94.62 |    73.58 |     100 |   94.62 | ...86-287,292-293 
  ...dProcessor.ts |   84.46 |     63.5 |   82.35 |   84.46 | ...1072,1093-1097 
  ...oice-input.ts |   91.94 |     80.8 |   66.66 |   91.94 | ...61,463-464,614 
  ...amingState.ts |   12.22 |      100 |       0 |   12.22 | 54-157            
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...dScrollbar.ts |     100 |      100 |     100 |     100 |                   
  ...ationFrame.ts |      42 |       75 |     100 |      42 | 42-44,53-59,62-87 
  ...odeCommand.ts |   58.82 |      100 |     100 |   58.82 | 28,33-48          
  ...enaCommand.ts |      85 |      100 |     100 |      85 | 23-24,29          
  ...aInProcess.ts |   27.92 |       80 |      25 |   27.92 | ...69-170,173-175 
  ...Completion.ts |   91.52 |    83.33 |     100 |   91.52 | ...71-272,309-312 
  ...ifications.ts |   86.91 |    96.29 |     100 |   86.91 | 116-130           
  ...tIndicator.ts |   83.49 |    70.96 |     100 |   83.49 | ...60,168,170-178 
  ...waySummary.ts |   96.22 |    69.69 |     100 |   96.22 | 125-127,169       
  ...ndTaskView.ts |   93.84 |    74.46 |     100 |   93.84 | ...25-129,218,224 
  ...chedScroll.ts |     100 |      100 |     100 |     100 |                   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   93.19 |    71.05 |     100 |   93.19 | ...37,183,256-259 
  ...ompletion.tsx |   95.36 |    82.81 |     100 |   95.36 | ...32-233,235-236 
  ...dMigration.ts |    92.1 |    88.88 |     100 |    92.1 | 42-44             
  useCompletion.ts |   94.11 |    89.65 |     100 |   94.11 | ...32-133,137-138 
  ...nitMessage.ts |     100 |      100 |     100 |     100 |                   
  ...extualTips.ts |   77.27 |       50 |     100 |   77.27 | ...2,75-79,93-101 
  ...eteCommand.ts |   78.53 |    88.57 |     100 |   78.53 | ...96-104,112-113 
  ...ialogClose.ts |    12.5 |      100 |     100 |    12.5 | 85-181            
  useDiffData.ts   |   11.62 |      100 |       0 |   11.62 | 44-87             
  ...oublePress.ts |   53.12 |       75 |     100 |   53.12 | 33-35,41-54       
  ...orSettings.ts |     100 |      100 |     100 |     100 |                   
  ...Completion.ts |   99.12 |    97.64 |     100 |   99.12 | 182-183           
  ...ionUpdates.ts |    93.5 |     92.3 |     100 |    93.5 | ...87-291,304-310 
  ...agerDialog.ts |   88.88 |      100 |     100 |   88.88 | 21,25             
  ...backDialog.ts |    63.9 |    76.47 |   66.66 |    63.9 | ...66-168,190-191 
  useFocus.ts      |     100 |      100 |     100 |     100 |                   
  ...olderTrust.ts |     100 |      100 |     100 |     100 |                   
  ...ggestions.tsx |   96.47 |    78.94 |     100 |   96.47 | 121,155-156       
  ...miniStream.ts |   82.93 |    79.41 |   94.44 |   82.93 | ...3093,3176-3184 
  ...BranchName.ts |     100 |    91.66 |     100 |     100 | 30                
  ...oryManager.ts |   97.94 |    98.24 |     100 |   97.94 | 139-142           
  ...ooksDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...stListener.ts |     100 |      100 |     100 |     100 |                   
  ...nAuthError.ts |   76.19 |       50 |     100 |   76.19 | 39-40,43-45       
  ...putHistory.ts |   92.59 |    85.71 |     100 |   92.59 | 63-64,72,94-96    
  ...storyStore.ts |     100 |    94.11 |     100 |     100 | 69                
  useKeypress.ts   |     100 |      100 |     100 |     100 |                   
  ...rdProtocol.ts |   36.36 |      100 |       0 |   36.36 | 24-31             
  ...unchEditor.ts |    9.67 |      100 |       0 |    9.67 | 11-32,39-90       
  ...gIndicator.ts |     100 |      100 |     100 |     100 |                   
  useLogger.ts     |      16 |      100 |       0 |      16 | 15-45             
  useMCPHealth.ts  |   63.15 |       75 |      50 |   63.15 | 42-52,64-67       
  ...cpApproval.ts |   92.37 |    83.33 |     100 |   92.37 | ...00-103,115-116 
  useMcpDialog.ts  |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...moryDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...oryMonitor.ts |   83.14 |    78.57 |     100 |   83.14 | 54-63,74-79       
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...delCommand.ts |     100 |     87.5 |     100 |     100 | 29                
  ...ouseEvents.ts |   87.17 |    88.88 |   66.66 |   87.17 | 81-82,86-88       
  ...raseCycler.ts |   84.74 |    76.47 |     100 |   84.74 | ...49,52-53,69-71 
  ...rredEditor.ts |   58.33 |    22.22 |     100 |   58.33 | 23-27,29-33       
  ...derUpdates.ts |   86.61 |    77.96 |    90.9 |   86.61 | ...26,290-302,350 
  useQwenAuth.ts   |     100 |      100 |     100 |     100 |                   
  ...lScheduler.ts |   88.54 |    91.83 |     100 |   88.54 | ...73-278,381-391 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  ...tleRepaint.ts |     100 |      100 |     100 |     100 |                   
  ...umeCommand.ts |   93.47 |       68 |     100 |   93.47 | ...17,152,193-198 
  ...ompletion.tsx |   90.59 |    83.33 |     100 |   90.59 | ...01,104,137-140 
  ...ectionList.ts |   97.05 |    96.07 |     100 |   97.05 | ...90-191,245-248 
  ...sionPicker.ts |   92.87 |    90.35 |     100 |   92.87 | ...99-501,503-505 
  ...earchInput.ts |     100 |    97.29 |     100 |     100 | 82                
  ...ngsCommand.ts |   18.75 |      100 |       0 |   18.75 | 10-25             
  ...ellHistory.ts |   93.28 |    80.95 |     100 |   93.28 | ...96,153-154,164 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-73              
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...Completion.ts |   82.85 |    85.13 |   94.73 |   82.85 | ...78-680,688-724 
  ...tateAndRef.ts |     100 |      100 |     100 |     100 |                   
  ...tatsDialog.ts |     100 |      100 |     100 |     100 |                   
  useStatusLine.ts |    96.3 |    92.19 |     100 |    96.3 | ...77-380,466-473 
  ...eateDialog.ts |   88.23 |      100 |     100 |   88.23 | 14,18             
  ...mInProcess.ts |   27.35 |       80 |      25 |   27.35 | ...82-183,186-188 
  ...tification.ts |     100 |     87.5 |     100 |     100 | 50                
  ...alProgress.ts |   53.06 |       50 |   66.66 |   53.06 | ...53,61-68,79-85 
  ...rminalSize.ts |   76.19 |      100 |      50 |   76.19 | 21-25             
  ...emeCommand.ts |   67.01 |    29.41 |     100 |   67.01 | ...10-111,115-116 
  useTimer.ts      |   88.09 |    85.71 |     100 |   88.09 | 44-45,51-53       
  ...lMigration.ts |       0 |        0 |       0 |       0 |                   
  ...rustModify.ts |     100 |      100 |     100 |     100 |                   
  useTurnDiffs.ts  |   95.12 |    78.57 |     100 |   95.12 | 133-134,156-157   
  ...elcomeBack.ts |   87.36 |     90.9 |     100 |   87.36 | ...,94-96,114-115 
  ...reeSession.ts |   93.75 |    72.72 |     100 |   93.75 | 47-48,72          
  vim.ts           |      74 |    67.56 |   69.23 |      74 | ...1854-1861,1869 
 src/ui/layouts    |    90.9 |    90.62 |     100 |    90.9 |                   
  ...AppLayout.tsx |   90.72 |       90 |     100 |   90.72 | 57-59,101-106     
  ...AppLayout.tsx |   91.17 |    91.66 |     100 |   91.17 | 70-75             
 src/ui/models     |   80.24 |    79.16 |   71.42 |   80.24 |                   
  ...ableModels.ts |   80.24 |    79.16 |   71.42 |   80.24 | ...,61-71,123-125 
 ...noninteractive |     100 |      100 |    6.66 |     100 |                   
  ...eractiveUi.ts |     100 |      100 |    6.66 |     100 |                   
 src/ui/state      |   94.91 |    81.81 |     100 |   94.91 |                   
  extensions.ts    |   94.91 |    81.81 |     100 |   94.91 | 68-69,88          
 src/ui/themes     |   98.39 |    73.15 |     100 |   98.39 |                   
  ansi-light.ts    |     100 |      100 |     100 |     100 |                   
  ansi.ts          |     100 |      100 |     100 |     100 |                   
  atom-one-dark.ts |     100 |      100 |     100 |     100 |                   
  ayu-light.ts     |     100 |      100 |     100 |     100 |                   
  ayu.ts           |     100 |      100 |     100 |     100 |                   
  color-utils.ts   |   97.91 |       92 |     100 |   97.91 | ...51-352,354-355 
  default-light.ts |     100 |      100 |     100 |     100 |                   
  default.ts       |     100 |      100 |     100 |     100 |                   
  ...inal-theme.ts |   88.59 |    85.96 |     100 |   88.59 | ...57-261,266-270 
  dracula.ts       |     100 |      100 |     100 |     100 |                   
  github-dark.ts   |     100 |      100 |     100 |     100 |                   
  github-light.ts  |     100 |      100 |     100 |     100 |                   
  googlecode.ts    |     100 |      100 |     100 |     100 |                   
  no-color.ts      |     100 |      100 |     100 |     100 |                   
  qwen-dark.ts     |     100 |      100 |     100 |     100 |                   
  qwen-light.ts    |     100 |      100 |     100 |     100 |                   
  ...tic-tokens.ts |     100 |      100 |     100 |     100 |                   
  ...-of-purple.ts |     100 |      100 |     100 |     100 |                   
  theme-manager.ts |   88.34 |    83.54 |     100 |   88.34 | ...58-367,372-373 
  theme.ts         |     100 |    38.02 |     100 |     100 | ...34-449,457-461 
  xcode.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/utils      |   83.66 |    83.18 |      93 |   83.66 |                   
  ...Colorizer.tsx |   80.42 |    85.41 |     100 |   80.42 | ...00-201,298-324 
  ...nRenderer.tsx |   68.83 |    70.14 |      50 |   68.83 | ...52-254,274-293 
  ...wnDisplay.tsx |   86.01 |    87.66 |     100 |   86.01 | ...87,704,729-754 
  ...idDiagram.tsx |   87.79 |    95.34 |     100 |   87.79 | 156-179           
  ...eRenderer.tsx |   92.08 |    80.45 |      95 |   92.08 | ...76-679,723-728 
  ...odeDisplay.ts |   96.55 |     90.9 |     100 |   96.55 | 34                
  asciiCharts.ts   |   96.77 |    87.62 |     100 |   96.77 | 173-180,281       
  ...dWorkUtils.ts |     100 |      100 |     100 |     100 |                   
  ...boardUtils.ts |   51.92 |    72.72 |   91.66 |   51.92 | ...21,624-633,636 
  commandUtils.ts  |      96 |    88.77 |     100 |      96 | ...72,174-175,302 
  computeStats.ts  |     100 |      100 |     100 |     100 |                   
  customBanner.ts  |   90.68 |    91.22 |     100 |   90.68 | ...13,324-327,334 
  displayUtils.ts  |   88.37 |    72.22 |     100 |   88.37 | 23,25,29,31,33    
  formatters.ts    |    95.4 |    98.38 |     100 |    95.4 | 123-126           
  gradientUtils.ts |     100 |      100 |     100 |     100 |                   
  highlight.ts     |     100 |      100 |     100 |     100 |                   
  ...oryMapping.ts |     100 |    96.77 |     100 |     100 | 43                
  historyUtils.ts  |   94.11 |       94 |     100 |   94.11 | 94-97             
  isNarrowWidth.ts |     100 |      100 |     100 |     100 |                   
  ...olDetector.ts |    8.23 |      100 |       0 |    8.23 | ...31-132,135-136 
  latexRenderer.ts |   94.95 |     73.8 |     100 |   94.95 | ...76-178,184-187 
  layoutUtils.ts   |     100 |      100 |     100 |     100 |                   
  ...ightLoader.ts |     100 |    89.47 |     100 |     100 | 81,110            
  ...nUtilities.ts |   90.21 |    85.71 |     100 |   90.21 | ...,91-95,107-108 
  ...ToolGroups.ts |   98.66 |    96.77 |     100 |   98.66 | 48-49             
  ...geRenderer.ts |   86.23 |    68.93 |   95.12 |   86.23 | ...1284,1324-1330 
  ...alRenderer.ts |   86.69 |     71.9 |     100 |   86.69 | ...1476,1513-1519 
  ...lsBySource.ts |     100 |    95.23 |     100 |     100 | 84                
  mouse.ts         |   90.71 |    73.33 |   88.88 |   90.71 | ...40-143,200-201 
  osc8.ts          |   94.84 |    88.74 |     100 |   94.84 | ...57,442,446-447 
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  restoreGoal.ts   |   99.02 |    97.56 |     100 |   99.02 | 106               
  ...storyUtils.ts |   66.66 |    75.96 |   93.33 |   66.66 | ...37-459,580-581 
  ...ickerUtils.ts |     100 |      100 |     100 |     100 |                   
  ...ataService.ts |   93.17 |     79.1 |     100 |   93.17 | ...14,227,254-256 
  ...izedOutput.ts |   94.94 |      100 |   88.88 |   94.94 | 112-117           
  ...wOptimizer.ts |     100 |    96.77 |     100 |     100 | 69                
  terminalSetup.ts |    4.37 |      100 |       0 |    4.37 | 44-393            
  textUtils.ts     |   97.61 |    94.89 |   92.85 |   97.61 | ...50-251,386-387 
  todoSnapshot.ts  |   89.33 |    93.47 |     100 |   89.33 | ...,66-78,180-181 
  updateCheck.ts   |     100 |    80.95 |     100 |     100 | 30-42             
  ...ow-keyword.ts |     100 |      100 |     100 |     100 |                   
 ...i/utils/export |      57 |     40.8 |   79.41 |      57 |                   
  collect.ts       |   55.92 |    50.58 |   86.36 |   55.92 | ...25-640,642-647 
  index.ts         |     100 |      100 |     100 |     100 |                   
  normalize.ts     |   58.11 |    20.51 |      80 |   58.11 | ...13-314,328-363 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
  utils.ts         |      40 |      100 |       0 |      40 | 11-13             
 ...ort/formatters |    3.38 |      100 |       0 |    3.38 |                   
  html.ts          |    9.61 |      100 |       0 |    9.61 | ...28,34-76,82-84 
  json.ts          |      50 |      100 |       0 |      50 | 14-15             
  jsonl.ts         |     3.5 |      100 |       0 |     3.5 | 14-76             
  markdown.ts      |    0.94 |      100 |       0 |    0.94 | 13-295            
 src/ui/voice      |   83.15 |    74.06 |   83.51 |   83.15 |                   
  ...d-recorder.ts |     6.2 |      100 |       0 |     6.2 | ...33-159,162-163 
  ...o-recorder.ts |      80 |       90 |      50 |      80 | ...11-112,126-131 
  ...me-session.ts |   91.14 |     64.7 |   92.85 |   91.14 | ...76,282,292-295 
  sox-recorder.ts  |    92.7 |    71.87 |     100 |    92.7 | ...34-135,153-154 
  ...ailability.ts |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |     100 |      100 |     100 |     100 |                   
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  ...e-recorder.ts |   88.29 |    67.74 |   81.81 |   88.29 | ...,98-99,112,115 
  ...ream-retry.ts |     100 |    88.88 |     100 |     100 | 18                
  ...am-session.ts |   87.45 |    63.33 |   81.81 |   87.45 | ...03,320-322,339 
  ...ranscriber.ts |   89.47 |    76.77 |   95.65 |   89.47 | ...42-544,547-549 
 src/utils         |   73.44 |    89.74 |   90.82 |   73.44 |                   
  acpModelUtils.ts |     100 |      100 |     100 |     100 |                   
  apiPreconnect.ts |   96.72 |    97.14 |     100 |   96.72 | 165-168           
  checks.ts        |   33.33 |      100 |       0 |   33.33 | 23-28             
  cleanup.ts       |   84.12 |    93.33 |      80 |   84.12 | 75,106-115        
  commands.ts      |     100 |      100 |     100 |     100 |                   
  commentJson.ts   |   90.51 |    91.89 |     100 |   90.51 | 67-76,116         
  ...Calculator.ts |     100 |      100 |     100 |     100 |                   
  cpuProfiler.ts   |   70.38 |    71.83 |   88.88 |   70.38 | ...27,430-431,438 
  deepMerge.ts     |     100 |       90 |     100 |     100 | 41-43,49          
  ...ScopeUtils.ts |   97.56 |    88.88 |     100 |   97.56 | 67                
  doctorChecks.ts  |   70.31 |    74.57 |     100 |   70.31 | ...95-301,325-341 
  ...putCapture.ts |   90.65 |    86.17 |     100 |   90.65 | ...72,370,372-373 
  ...arResolver.ts |   97.14 |    96.42 |     100 |   97.14 | 125-126           
  errors.ts        |   90.85 |    96.36 |    92.3 |   90.85 | 69-70,298-310     
  events.ts        |     100 |      100 |     100 |     100 |                   
  gitUtils.ts      |   91.22 |    82.35 |     100 |   91.22 | ...,94-97,140-143 
  ...AutoUpdate.ts |    92.2 |    95.23 |   88.88 |    92.2 | 130-141           
  ...tyWarnings.ts |     100 |      100 |     100 |     100 |                   
  ...lationInfo.ts |   97.71 |    94.18 |     100 |   97.71 | ...57,274-275,320 
  languageUtils.ts |   98.47 |    97.67 |     100 |   98.47 | 153-154           
  math.ts          |       0 |        0 |       0 |       0 | 1-15              
  ...iagnostics.ts |   94.57 |    83.01 |   88.88 |   94.57 | ...05,311,315-317 
  ...serMessage.ts |     100 |      100 |     100 |     100 |                   
  ...onfigUtils.ts |     100 |    98.92 |     100 |     100 | 218               
  ...iveHelpers.ts |   96.93 |    93.84 |     100 |   96.93 | ...15-416,514,527 
  osc.ts           |    97.5 |      100 |   88.88 |    97.5 | 195-196           
  package.ts       |   88.88 |       80 |     100 |   88.88 | 33-34             
  processUtils.ts  |     100 |      100 |     100 |     100 |                   
  readStdin.ts     |   93.67 |    94.11 |   85.71 |   93.67 | 79-83             
  relaunch.ts      |   93.22 |    81.25 |     100 |   93.22 | 65-67,80          
  resolvePath.ts   |     100 |      100 |     100 |     100 |                   
  runBudget.ts     |   99.35 |    96.77 |     100 |   99.35 | 119               
  sandbox-path.ts  |     100 |      100 |     100 |     100 |                   
  sandbox.ts       |       0 |        0 |       0 |       0 | 1-1042            
  ...xImageName.ts |     100 |    77.77 |     100 |     100 | 10,18             
  sandboxMounts.ts |     100 |      100 |     100 |     100 |                   
  sessionPaths.ts  |   90.84 |    90.56 |     100 |   90.84 | ...81-182,185-186 
  settingsUtils.ts |   82.51 |    91.85 |   89.74 |   82.51 | ...76-694,701-709 
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...ate-verify.ts |     100 |      100 |     100 |     100 |                   
  ...one-update.ts |   27.55 |    76.11 |   45.83 |   27.55 | ...44-845,848-867 
  ...upProfiler.ts |   98.46 |    94.52 |     100 |   98.46 | 130-131,305       
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  stdioHelpers.ts  |     100 |       60 |     100 |     100 | 23,32             
  systemInfo.ts    |   95.12 |    89.06 |     100 |   95.12 | ...43-244,249-253 
  ...InfoFields.ts |    87.5 |    65.85 |     100 |    87.5 | ...24-125,146-147 
  ...alSequence.ts |     100 |    97.61 |     100 |     100 | 60                
  ...iffPreview.ts |   94.11 |    83.33 |     100 |   94.11 | 13                
  ...entEmitter.ts |     100 |      100 |     100 |     100 |                   
  ...ansionHook.ts |     100 |      100 |     100 |     100 |                   
  ...upWarnings.ts |   91.17 |    82.35 |     100 |   91.17 | 67-68,73-74,77-78 
  version.ts       |     100 |       50 |     100 |     100 | 11                
  ...ingHandler.ts |     100 |      100 |     100 |     100 |                   
  windowTitle.ts   |   95.45 |    93.33 |     100 |   95.45 | 54-55             
  ...WithBackup.ts |   65.04 |    77.77 |     100 |   65.04 | 97,112,133-172    
 ...s/housekeeping |   91.63 |    91.02 |      95 |   91.63 |                   
  cleanup.ts       |   95.77 |    95.83 |     100 |   95.77 | 70-72             
  ...eractionAt.ts |     100 |      100 |     100 |     100 |                   
  scheduler.ts     |   91.91 |    90.47 |    87.5 |   91.91 | 58-62,73,131-135  
  throttledOnce.ts |   86.66 |     86.2 |     100 |   86.66 | ...99,105,137-138 
-------------------|---------|----------|---------|---------|-------------------
Core Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   83.51 |    84.42 |   85.01 |   83.51 |                   
 src               |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/__mocks__/fs  |       0 |        0 |       0 |       0 |                   
  promises.ts      |       0 |        0 |       0 |       0 | 1-48              
 src/agents        |   89.66 |    81.05 |   94.65 |   89.66 |                   
  ...transcript.ts |    92.3 |    85.93 |     100 |    92.3 | ...05,324-325,456 
  ...ent-resume.ts |   83.23 |    71.04 |   79.41 |   83.23 | ...1263-1267,1270 
  ...ound-tasks.ts |   96.83 |    89.03 |     100 |   96.83 | ...1167,1187-1190 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...n-registry.ts |   95.73 |    89.28 |     100 |   95.73 | ...16-417,489-493 
  ...w-snapshot.ts |   92.85 |    73.33 |     100 |   92.85 | ...53-154,167,170 
 src/agents/arena  |   76.54 |    66.87 |   78.72 |   76.54 |                   
  ...gentClient.ts |   79.47 |    88.88 |   81.81 |   79.47 | ...68-183,189-204 
  ArenaManager.ts  |   75.37 |    63.37 |   78.26 |   75.37 | ...1860,1866-1867 
  arena-events.ts  |   64.44 |      100 |      50 |   64.44 | ...71-175,178-183 
  diff-summary.ts  |    87.5 |    72.34 |     100 |    87.5 | ...32-133,137-138 
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...gents/backends |   76.43 |    86.23 |   73.04 |   76.43 |                   
  ITermBackend.ts  |   97.97 |    93.93 |     100 |   97.97 | ...78-180,255,307 
  ...essBackend.ts |   91.98 |     90.9 |   86.66 |   91.98 | ...95,250-270,329 
  TmuxBackend.ts   |    90.7 |    76.55 |   97.36 |    90.7 | ...87,697,743-747 
  detect.ts        |   31.25 |      100 |       0 |   31.25 | 34-88             
  index.ts         |     100 |      100 |     100 |     100 |                   
  iterm-it2.ts     |     100 |     92.1 |     100 |     100 | 37-38,106         
  tmux-commands.ts |    6.64 |      100 |    3.03 |    6.64 | ...93-363,386-503 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...agents/runtime |   88.04 |    85.05 |   82.21 |   88.04 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  agent-core.ts    |   78.78 |    74.15 |   65.95 |   78.78 | ...1787,1814-1861 
  agent-events.ts  |     100 |      100 |     100 |     100 |                   
  ...t-headless.ts |   87.93 |    79.06 |   63.63 |   87.93 | ...00-401,404-405 
  ...nteractive.ts |   80.55 |    81.35 |   74.07 |   80.55 | ...79,481,483,486 
  ...statistics.ts |   98.19 |    82.35 |     100 |   98.19 | 127,151,192,225   
  agent-types.ts   |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...low-budget.ts |     100 |      100 |     100 |     100 |                   
  ...ow-journal.ts |   91.76 |    75.86 |     100 |   91.76 | ...38-139,179-181 
  ...chestrator.ts |   91.47 |    87.74 |   82.35 |   91.47 | ...1725,1774-1777 
  ...ow-prompts.ts |     100 |      100 |     100 |     100 |                   
  ...ow-sandbox.ts |   96.87 |    94.51 |     100 |   96.87 | ...24-325,330-331 
  ...flow-saved.ts |   96.55 |    94.36 |     100 |   96.55 | 134-135,236-239   
  ...flow-stall.ts |   97.87 |    82.69 |     100 |   97.87 | 136-137,234       
 src/agents/tasks  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/agents/team   |   80.31 |    83.19 |    86.5 |   80.31 |                   
  TeamManager.ts   |   67.11 |    76.25 |   74.41 |   67.11 | ...1433,1456-1457 
  identity.ts      |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...sionBridge.ts |     100 |      100 |     100 |     100 |                   
  mailbox.ts       |   94.76 |    86.36 |   92.85 |   94.76 | 86-87,348-354     
  ...ptAddendum.ts |     100 |      100 |     100 |     100 |                   
  tasks.ts         |   88.85 |    82.47 |   96.29 |   88.85 | ...-990,1034-1035 
  team-events.ts   |   60.52 |      100 |      50 |   60.52 | ...37-141,148-152 
  teamHelpers.ts   |   92.02 |    94.91 |   95.23 |   92.02 | ...31-332,368-378 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...eam/test-utils |   94.39 |    93.38 |   98.21 |   94.39 |                   
  ...on-harness.ts |   96.49 |    77.77 |     100 |   96.49 | 128-129,141-142   
  fake-agent.ts    |   98.49 |    95.08 |     100 |   98.49 | 201-203           
  fake-backend.ts  |   86.46 |    97.61 |   95.83 |   86.46 | 124-146           
 src/config        |   78.93 |    84.15 |   65.46 |   78.93 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   77.25 |    83.26 |    61.4 |   77.25 | ...5084,5089-5090 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  models.ts        |     100 |      100 |     100 |     100 |                   
  storage.ts       |   94.63 |    91.86 |   89.58 |   94.63 | ...15-416,419-420 
 ...nfirmation-bus |   98.29 |    97.14 |     100 |   98.29 |                   
  message-bus.ts   |   98.14 |    97.05 |     100 |   98.14 | 42-43             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/core          |   88.42 |    84.07 |   91.97 |   88.42 |                   
  baseLlmClient.ts |   81.74 |    77.52 |   77.77 |   81.74 | ...24,526-536,545 
  client.ts        |   87.72 |    81.21 |      90 |   87.72 | ...2615,2710-2711 
  ...tGenerator.ts |   84.86 |    69.23 |     100 |   84.86 | ...90,392,399-402 
  ...lScheduler.ts |   87.63 |     82.3 |   95.94 |   87.63 | ...4165,4193-4204 
  geminiChat.ts    |   89.04 |    87.24 |      95 |   89.04 | ...3253,3320-3321 
  geminiRequest.ts |     100 |      100 |     100 |     100 |                   
  ...MediaLimit.ts |     100 |    95.83 |     100 |     100 | 96                
  ...htProtocol.ts |    9.09 |      100 |       0 |    9.09 | ...9,62-66,69-110 
  logger.ts        |   87.41 |    87.02 |     100 |   87.41 | ...64-568,614-628 
  ...tyDefaults.ts |     100 |      100 |     100 |     100 |                   
  ...olExecutor.ts |   92.59 |       75 |      50 |   92.59 | 41-42             
  ...on-helpers.ts |   86.48 |    72.22 |     100 |   86.48 | ...97-198,212-221 
  ...issionFlow.ts |   98.78 |       96 |     100 |   98.78 | 93                
  prompts.ts       |   88.93 |    87.87 |   72.72 |   88.93 | ...-910,1113-1114 
  ...port-retry.ts |     100 |      100 |     100 |     100 |                   
  tokenLimits.ts   |     100 |    89.28 |     100 |     100 | 30,65-66          
  ...allIdUtils.ts |   98.23 |     92.1 |     100 |   98.23 | 36,45             
  ...okTriggers.ts |   99.43 |     91.5 |     100 |   99.43 | 175,186           
  turn.ts          |   96.81 |    88.13 |     100 |   96.81 | ...60,473-474,520 
 ...ntentGenerator |   95.04 |    82.54 |      94 |   95.04 |                   
  ...tGenerator.ts |   96.59 |    84.07 |   92.85 |   96.59 | ...,973,1001-1003 
  converter.ts     |   94.51 |    80.72 |     100 |   94.51 | ...06-607,617,823 
  index.ts         |       0 |        0 |       0 |       0 | 1-21              
  usage.ts         |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   91.53 |    71.64 |   93.33 |   91.53 |                   
  ...tGenerator.ts |      90 |    70.96 |   92.85 |      90 | ...80-286,304-305 
  index.ts         |     100 |       80 |     100 |     100 | 50                
 ...ntentGenerator |   94.24 |    84.03 |   91.17 |   94.24 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   94.11 |    82.57 |   90.62 |   94.11 | ...1028-1029,1057 
  ...tDetection.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |      88 |    84.52 |   93.67 |      88 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  converter.ts     |   87.57 |    82.32 |   96.15 |   87.57 | ...1508,1677-1692 
  errorHandler.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |   58.33 |    71.42 |      50 |   58.33 | ...70,73-77,85-89 
  ...tGenerator.ts |    66.4 |    70.58 |   88.88 |    66.4 | ...51-157,168-169 
  pipeline.ts      |   94.44 |    86.71 |     100 |   94.44 | ...38-539,547,615 
  ...ureContext.ts |     100 |      100 |     100 |     100 |                   
  ...ingOptions.ts |       0 |        0 |       0 |       0 | 1                 
  ...CallParser.ts |    90.2 |    87.65 |     100 |    90.2 | ...39-343,373-374 
  ...kingParser.ts |     100 |    96.87 |     100 |     100 | 42                
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...rator/provider |   97.09 |    90.49 |   96.07 |   97.09 |                   
  dashscope.ts     |   97.77 |     92.3 |   94.44 |   97.77 | ...06-307,449-450 
  deepseek.ts      |   94.91 |    89.36 |     100 |   94.91 | ...31-132,145-146 
  default.ts       |    97.5 |    96.55 |   88.88 |    97.5 | 123-124,197       
  index.ts         |     100 |      100 |     100 |     100 |                   
  mimo.ts          |   94.11 |    66.66 |     100 |   94.11 | 29,52-53          
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  mistral.ts       |   96.07 |    73.33 |     100 |   96.07 | 32-33             
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 |                   
  utils.ts         |     100 |      100 |     100 |     100 |                   
 src/extension     |   77.62 |    79.45 |   84.54 |   77.62 |                   
  ...-converter.ts |   77.16 |    68.02 |     100 |   77.16 | ...1090,1135-1136 
  corruptFile.ts   |     100 |       50 |     100 |     100 | 40-45             
  ...-converter.ts |    73.8 |       75 |     100 |    73.8 | 44-54             
  ...ionManager.ts |   60.68 |    71.42 |   55.17 |   60.68 | ...1613,1638-1639 
  ...references.ts |     100 |    89.58 |     100 |     100 | ...05,129,197,200 
  ...onSettings.ts |   92.65 |    91.89 |     100 |   92.65 | ...28-232,312-313 
  ...-converter.ts |    75.9 |    83.33 |   85.71 |    75.9 | ...98,202,214-248 
  github.ts        |   84.71 |     85.4 |     100 |   84.71 | ...61-662,670-671 
  http-client.ts   |   84.61 |       80 |     100 |   84.61 | 20-21             
  i18n.ts          |   78.26 |    95.83 |      50 |   78.26 | 104-110,116-123   
  index.ts         |     100 |      100 |     100 |     100 |                   
  marketplace.ts   |   87.11 |    84.28 |     100 |   87.11 | ...44,348-354,429 
  npm.ts           |   74.67 |    71.64 |     100 |   74.67 | ...19-421,428-432 
  override.ts      |   94.11 |    88.88 |     100 |   94.11 | 63-64,81-82       
  redaction.ts     |     100 |      100 |     100 |     100 |                   
  settings.ts      |   66.26 |      100 |      50 |   66.26 | 81-107,141-146    
  ...ceRegistry.ts |   93.96 |    83.14 |     100 |   93.96 | ...35-341,362-363 
  storage.ts       |     100 |      100 |     100 |     100 |                   
  ...ableSchema.ts |     100 |      100 |     100 |     100 |                   
  variables.ts     |   88.75 |    83.33 |     100 |   88.75 | ...28-231,234-237 
 src/followup      |   76.26 |    73.59 |    90.9 |   76.26 |                   
  followupState.ts |   98.44 |    95.74 |     100 |   98.44 | 236-237           
  index.ts         |     100 |      100 |     100 |     100 |                   
  overlayFs.ts     |   96.29 |    88.88 |     100 |   96.29 | 78,108,122        
  speculation.ts   |   63.01 |    40.29 |   71.42 |   63.01 | ...73-574,577-582 
  ...onToolGate.ts |     100 |    96.55 |     100 |     100 | 95                
  ...nGenerator.ts |   70.35 |     75.4 |   83.33 |   70.35 | ...83-247,326-328 
 src/generated     |       0 |        0 |       0 |       0 |                   
  git-commit.ts    |       0 |        0 |       0 |       0 | 1-10              
 src/goals         |   89.57 |    83.57 |   94.44 |   89.57 |                   
  ...eGoalStore.ts |    85.1 |    95.45 |   84.61 |    85.1 | ...63-166,174-182 
  goalHook.ts      |   97.26 |    91.66 |     100 |   97.26 | 100-105           
  goalJudge.ts     |   84.33 |    74.28 |     100 |   84.33 | ...57-358,366-368 
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/hooks         |   86.93 |    85.44 |   88.01 |   86.93 |                   
  ...okRegistry.ts |   86.48 |    77.08 |     100 |   86.48 | ...41-344,362-369 
  ...bortSignal.ts |     100 |      100 |     100 |     100 |                   
  ...terpolator.ts |   96.66 |    93.33 |     100 |   96.66 | 66-67             
  ...HookRunner.ts |   96.68 |    87.23 |     100 |   96.68 | 110-112,231-233   
  ...Aggregator.ts |   96.35 |    90.69 |     100 |   96.35 | ...00-301,382,384 
  ...entHandler.ts |   95.32 |    85.05 |   94.11 |   95.32 | ...71,928-929,939 
  hookPlanner.ts   |   86.29 |    83.33 |   85.71 |   86.29 | ...15-219,226-237 
  hookRegistry.ts  |   91.48 |    84.61 |     100 |   91.48 | ...97,416,420,424 
  hookRunner.ts    |   62.42 |    72.04 |   66.66 |   62.42 | ...64-765,774-775 
  hookSystem.ts    |      87 |      100 |   68.88 |      87 | ...15-716,722-723 
  ...HookRunner.ts |   75.51 |     61.9 |      80 |   75.51 | ...05-406,424-425 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...edCallback.ts |     100 |      100 |     100 |     100 |                   
  ...HookRunner.ts |   96.37 |     90.9 |      90 |   96.37 | 342-350,424-425   
  ...SkillHooks.ts |   78.75 |       75 |   66.66 |   78.75 | 62-66,137-152     
  ...oksManager.ts |   96.66 |    91.66 |     100 |   96.66 | ...90,209-210,223 
  ssrfGuard.ts     |   77.22 |    85.36 |     100 |   77.22 | ...57,261-267,273 
  stopHookCap.ts   |     100 |      100 |     100 |     100 |                   
  trustedHooks.ts  |      90 |    52.63 |     100 |      90 | ...53,66-67,97-98 
  types.ts         |   92.83 |       94 |    87.5 |   92.83 | ...87-488,573-577 
  urlValidator.ts  |     100 |      100 |     100 |     100 |                   
 src/ide           |   75.55 |    83.52 |   78.33 |   75.55 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  detect-ide.ts    |     100 |      100 |     100 |     100 |                   
  ide-client.ts    |   66.14 |    81.75 |   66.66 |   66.14 | ...3-964,993-1001 
  ide-installer.ts |   89.06 |    79.31 |     100 |   89.06 | ...36,143-147,160 
  ideContext.ts    |     100 |      100 |     100 |     100 |                   
  process-utils.ts |   84.84 |    71.79 |     100 |   84.84 | ...37,151,193-194 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/lsp           |   43.47 |     58.9 |   52.48 |   43.47 |                   
  ...nfigLoader.ts |   78.28 |     64.7 |      95 |   78.28 | ...35-437,441-447 
  ...ionFactory.ts |   42.81 |    73.07 |      50 |   42.81 | ...76-427,433-450 
  ...Normalizer.ts |   23.09 |    13.72 |   30.43 |   23.09 | ...04-905,909-924 
  ...verManager.ts |   25.31 |    62.06 |   41.66 |   25.31 | ...85-704,710-740 
  ...eLspClient.ts |   32.77 |       80 |   17.64 |   32.77 | ...84-288,294-295 
  ...LspService.ts |   51.85 |    65.98 |   68.57 |   51.85 | ...1339,1399-1409 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/mcp           |   82.17 |     77.5 |   77.96 |   82.17 |                   
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...h-provider.ts |   86.95 |      100 |   33.33 |   86.95 | ...,93,97,101-102 
  ...h-provider.ts |   79.52 |    58.06 |     100 |   79.52 | ...33-940,947-949 
  ...en-storage.ts |   98.64 |    97.77 |     100 |   98.64 | 88-89             
  oauth-utils.ts   |   73.61 |    85.48 |    92.3 |   73.61 | ...46-366,392-421 
  ...n-provider.ts |   89.83 |       96 |   45.45 |   89.83 | ...43,147,151-152 
 .../token-storage |   82.12 |    88.19 |   89.28 |   82.12 |                   
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   87.08 |    87.27 |   95.23 |   87.08 | ...00-201,214-215 
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   68.14 |    82.35 |   64.28 |   68.14 | ...81-295,298-314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/memory        |   74.29 |    78.47 |   72.53 |   74.29 |                   
  const.ts         |   94.28 |     92.3 |     100 |   94.28 | 66-67             
  dream.ts         |      66 |    73.33 |      50 |      66 | 51,108-149        
  ...entPlanner.ts |   57.84 |    72.72 |   33.33 |   57.84 | ...35,140-147,152 
  entries.ts       |   63.77 |    79.16 |      50 |   63.77 | ...72-180,183-189 
  extract.ts       |   91.36 |    72.41 |     100 |   91.36 | ...99,118-121,189 
  ...entPlanner.ts |   67.59 |     73.8 |      50 |   67.59 | ...31,240-243,415 
  ...ionPlanner.ts |       0 |        0 |       0 |       0 | 1                 
  forget.ts        |   46.21 |    61.53 |   44.44 |   46.21 | ...06,213,216-348 
  indexer.ts       |    86.3 |       50 |     100 |    86.3 | ...56,62-63,75-76 
  manager.ts       |   78.48 |    83.23 |   76.19 |   78.48 | ...1363,1376-1378 
  memoryAge.ts     |   90.47 |       80 |     100 |   90.47 | 50-51             
  paths.ts         |   79.06 |    95.12 |     100 |   79.06 | 32-33,49-86       
  prompt.ts        |   94.87 |    78.57 |     100 |   94.87 | ...63,166,304-305 
  recall.ts        |   82.06 |       75 |    90.9 |   82.06 | ...59-364,395-406 
  ...ceSelector.ts |    93.1 |    81.81 |     100 |    93.1 | ...25,127-128,136 
  scan.ts          |   92.92 |    78.26 |     100 |   92.92 | ...51-52,62,90-91 
  ...entPlanner.ts |   58.33 |    66.66 |   56.25 |   58.33 | ...61-282,358-403 
  status.ts        |   10.52 |      100 |       0 |   10.52 | 41-98             
  store.ts         |   93.33 |    81.25 |     100 |   93.33 | ...,94-95,119-120 
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ontextFile.ts |   79.38 |    81.03 |   81.81 |   79.38 | ...58-272,286-291 
 src/mocks         |       0 |        0 |       0 |       0 |                   
  msw.ts           |       0 |        0 |       0 |       0 | 1-9               
 src/models        |   90.02 |    87.11 |   88.15 |   90.02 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...tor-config.ts |   90.24 |    91.42 |     100 |   90.24 | 142,148,151-160   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nfigErrors.ts |   74.22 |       44 |   84.61 |   74.22 | ...,67-74,106-117 
  ...igResolver.ts |   98.66 |    92.85 |     100 |   98.66 | 162,324,330       
  modelRegistry.ts |     100 |    98.64 |     100 |     100 | 229               
  modelsConfig.ts  |   86.33 |    85.51 |   82.92 |   86.33 | ...1333,1362-1363 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/output        |     100 |      100 |     100 |     100 |                   
  ...-formatter.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/permissions   |   82.68 |    92.01 |   68.46 |   82.68 |                   
  autoMode.ts      |   97.84 |    94.27 |     100 |   97.84 | 523-524,545-552   
  ...transcript.ts |      98 |       84 |     100 |      98 | 200-201           
  classifier.ts    |      94 |    94.44 |     100 |      94 | 158-165,385-389   
  ...erousRules.ts |     100 |    89.36 |     100 |     100 | 110,133,147,175   
  ...alTracking.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...on-manager.ts |   84.89 |     89.1 |      80 |   84.89 | ...1025,1131-1135 
  rule-parser.ts   |    97.4 |    93.82 |     100 |    97.4 | ...-884,1033-1035 
  ...-semantics.ts |   70.36 |    91.07 |   46.66 |   70.36 | ...2237,2300-2303 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...sifier-prompts |   99.04 |    95.23 |     100 |   99.04 |                   
  system-prompt.ts |   99.04 |    95.23 |     100 |   99.04 | 219               
 src/plan-gate     |   76.16 |    91.42 |      80 |   76.16 |                   
  ...viewAgents.ts |   52.28 |    88.46 |   66.66 |   52.28 | ...24-220,242-243 
  ...provalGate.ts |   92.47 |    92.85 |   85.71 |   92.47 | ...86-187,268-274 
  state.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/prompts       |   83.63 |      100 |    87.5 |   83.63 |                   
  mcp-prompts.ts   |   18.18 |      100 |       0 |   18.18 | 11-19             
  ...t-registry.ts |     100 |      100 |     100 |     100 |                   
 src/providers     |   83.63 |    75.28 |   73.33 |   83.63 |                   
  all-providers.ts |   69.23 |      100 |       0 |   69.23 | 71-72,76-82,86-92 
  index.ts         |     100 |      100 |     100 |     100 |                   
  install.ts       |   98.93 |    87.71 |     100 |   98.93 | 286-287           
  ...der-config.ts |   77.49 |    69.49 |   80.95 |   77.49 | ...57-458,465-474 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...viders/presets |   97.56 |    89.28 |   55.55 |   97.56 |                   
  ...oding-plan.ts |   87.34 |      100 |       0 |   87.34 | 82-84,87-89,91-94 
  ...a-standard.ts |     100 |      100 |     100 |     100 |                   
  ...token-plan.ts |     100 |      100 |     100 |     100 |                   
  ...m-provider.ts |   97.05 |    81.25 |      75 |   97.05 | 118-119           
  deepseek.ts      |     100 |      100 |     100 |     100 |                   
  idealab.ts       |     100 |      100 |     100 |     100 |                   
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  openrouter.ts    |     100 |      100 |     100 |     100 |                   
  requesty.ts      |     100 |      100 |     100 |     100 |                   
  zai.ts           |     100 |      100 |     100 |     100 |                   
 src/qwen          |    85.3 |    78.57 |   95.89 |    85.3 |                   
  ...tGenerator.ts |   98.64 |    98.18 |     100 |   98.64 | 105-106           
  qwenOAuth2.ts    |   82.55 |    73.24 |   90.62 |   82.55 | ...1183-1199,1229 
  ...kenManager.ts |   85.36 |    76.61 |     100 |   85.36 | ...52-757,778-783 
 src/resources     |     100 |      100 |     100 |     100 |                   
  ...e-registry.ts |     100 |      100 |     100 |     100 |                   
 src/services      |   87.92 |       85 |   93.84 |   87.92 |                   
  ...ionTrailer.ts |     100 |      100 |     100 |     100 |                   
  ...llRegistry.ts |   97.35 |    85.34 |     100 |   97.35 | ...94,117,417-418 
  ...ionService.ts |   96.46 |    94.44 |     100 |   96.46 | ...35,651,780-788 
  ...ingService.ts |   84.06 |    82.35 |   81.39 |   84.06 | ...1459,1474-1475 
  ...ttribution.ts |   91.73 |    87.71 |      90 |   91.73 | ...80-685,826-827 
  ...utSlimming.ts |     100 |    97.43 |     100 |     100 | 215,268           
  cronScheduler.ts |   95.09 |    90.18 |     100 |   95.09 | ...-940,1239-1240 
  cronTasksFile.ts |   95.03 |    89.47 |     100 |   95.03 | ...44-147,172-173 
  cronTasksLock.ts |   94.44 |    89.47 |     100 |   94.44 | ...02-103,132-133 
  ...eryService.ts |   80.43 |    95.45 |      75 |   80.43 | ...19-134,140-141 
  ...oryService.ts |   88.17 |    79.02 |    92.3 |   88.17 | ...1303,1344-1347 
  fileReadCache.ts |     100 |      100 |     100 |     100 |                   
  ...temService.ts |   91.27 |    82.69 |    90.9 |   91.27 | ...94,196,294-301 
  ...ratedFiles.ts |      96 |    88.23 |     100 |      96 | 119-120,146-147   
  gitInit.ts       |     100 |      100 |     100 |     100 |                   
  ...reeService.ts |    69.4 |    68.82 |   93.33 |    69.4 | ...2064,2092-2093 
  ...ionService.ts |   99.07 |    98.48 |     100 |   99.07 | 462-463,510-511   
  ...ticsDumper.ts |   98.37 |    95.23 |     100 |   98.37 | 185-186           
  ...ureMonitor.ts |   96.06 |    91.48 |   96.96 |   96.06 | ...49,850,864-866 
  ...orRegistry.ts |   97.26 |    91.22 |     100 |   97.26 | ...50-451,605-606 
  ...ttachments.ts |   97.24 |    90.39 |     100 |   97.24 | ...08,646,661-662 
  sessionRecap.ts  |     9.7 |      100 |       0 |     9.7 | 42-172            
  ...ionService.ts |   87.31 |    79.37 |   94.44 |   87.31 | ...1483,1553-1573 
  sessionTitle.ts  |   93.87 |    71.15 |     100 |   93.87 | ...32-235,266-267 
  ...ionService.ts |   82.58 |    78.02 |   90.62 |   82.58 | ...2173,2179-2184 
  ...pInhibitor.ts |   97.34 |    92.68 |     100 |   97.34 | ...28,167,361-362 
  ...Estimation.ts |     100 |    86.66 |     100 |     100 | 96-97             
  ...ageService.ts |   97.76 |    91.59 |   93.75 |   97.76 | ...61-262,366,567 
  ...UseSummary.ts |   94.63 |    88.46 |     100 |   94.63 | ...62-164,214-215 
  ...oryService.ts |   89.03 |    65.38 |     100 |   89.03 | ...23-325,330-331 
  ...reeCleanup.ts |   14.56 |      100 |   33.33 |   14.56 | 58-185            
  ...ionService.ts |   87.98 |     86.6 |     100 |   87.98 | ...38-439,455-456 
 ...icrocompaction |   98.88 |    93.56 |     100 |   98.88 |                   
  microcompact.ts  |   98.88 |    93.56 |     100 |   98.88 | ...24,466,470,621 
 src/skills        |   88.14 |    86.62 |      90 |   88.14 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...activation.ts |     100 |     93.1 |     100 |     100 | 93,112            
  skill-load.ts    |   94.84 |     87.5 |     100 |   94.84 | ...03,223,235-237 
  skill-manager.ts |   83.39 |    81.42 |   82.35 |   83.39 | ...1199,1206-1210 
  skill-paths.ts   |   89.15 |    86.36 |     100 |   89.15 | ...00-101,106-107 
  symlinkScope.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |   97.91 |       98 |     100 |   97.91 | 277-278           
 src/subagents     |   85.84 |    85.55 |   94.33 |   85.84 |                   
  ...ter-schema.ts |     100 |    98.07 |     100 |     100 | 99                
  ...tin-agents.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nt-manager.ts |    81.2 |    79.93 |   91.17 |    81.2 | ...1432,1509-1510 
  types.ts         |     100 |      100 |     100 |     100 |                   
  validation.ts    |   92.46 |    95.18 |     100 |   92.46 | 47-52,63-68,71-76 
 src/telemetry     |    78.4 |     86.7 |   80.32 |    78.4 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...on-metrics.ts |   98.96 |    79.48 |     100 |   98.96 | 169,183           
  ...on-tracing.ts |   74.55 |    73.21 |   70.58 |   74.55 | ...95,336-338,354 
  ...attributes.ts |   98.13 |       88 |     100 |   98.13 | 185-187           
  ...-exporters.ts |   65.78 |    83.33 |   55.55 |   65.78 | ...04-105,108-109 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-111             
  ...-processor.ts |   99.09 |    95.61 |      95 |   99.09 | 141,365-366       
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-128             
  loggers.ts       |   52.89 |    65.88 |   60.41 |   52.89 | ...1294,1311-1331 
  metrics.ts       |   75.31 |    80.85 |   77.19 |   75.31 | ...1021,1024-1035 
  ...attributes.ts |     100 |      100 |     100 |     100 |                   
  ...ime-config.ts |       0 |        0 |       0 |       0 | 1                 
  sanitize.ts      |      80 |    83.33 |     100 |      80 | 35-36,41-42       
  sdk.ts           |   86.75 |     88.4 |   66.66 |   86.75 | ...17-621,659-681 
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...on-tracing.ts |   90.04 |    88.07 |   96.55 |   90.04 | ...1504,1535-1538 
  ...etry-utils.ts |     100 |      100 |     100 |     100 |                   
  ...l-decision.ts |     100 |      100 |     100 |     100 |                   
  trace-context.ts |     100 |      100 |     100 |     100 |                   
  ...e-id-utils.ts |     100 |      100 |     100 |     100 |                   
  tracer.ts        |   98.56 |    88.63 |     100 |   98.56 | 52,101            
  types.ts         |   79.26 |    85.27 |   83.54 |   79.26 | ...1282,1286-1293 
  uiTelemetry.ts   |      92 |    95.34 |   80.95 |      92 | ...00,206-216,244 
 ...ry/qwen-logger |   68.52 |    80.61 |   65.51 |   68.52 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |   68.52 |    80.41 |   64.91 |   68.52 | ...1077,1115-1116 
 src/test-utils    |   93.44 |    96.15 |   77.77 |   93.44 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  ...st-helpers.ts |   94.11 |       90 |     100 |   94.11 | 69-70             
  index.ts         |     100 |      100 |     100 |     100 |                   
  mock-tool.ts     |   91.71 |    97.36 |   74.19 |   91.71 | ...54,218-219,232 
  ...aceContext.ts |     100 |      100 |     100 |     100 |                   
 src/tools         |   80.65 |    82.38 |   86.76 |   80.65 |                   
  ...erQuestion.ts |   90.03 |    79.36 |   91.66 |   90.03 | ...99-400,407-408 
  cron-create.ts   |   88.18 |    93.33 |    62.5 |   88.18 | ...,45-46,177-185 
  cron-delete.ts   |   97.56 |      100 |   83.33 |   97.56 | 31-32             
  cron-list.ts     |   98.16 |    93.75 |    87.5 |   98.16 | 50-51             
  diffOptions.ts   |     100 |      100 |     100 |     100 |                   
  edit.ts          |   80.82 |    83.48 |      75 |   80.82 | ...08-709,819-869 
  ...r-worktree.ts |   83.14 |    67.56 |    87.5 |   83.14 | ...84-187,278-279 
  enterPlanMode.ts |   81.08 |    66.66 |   85.71 |   81.08 | ...,74-79,112-126 
  exit-worktree.ts |   83.29 |    83.65 |   94.44 |   83.29 | ...14-515,537-538 
  exitPlanMode.ts  |   82.53 |    77.19 |     100 |   82.53 | ...91-394,426-429 
  glob.ts          |   95.88 |     87.5 |    92.3 |   95.88 | ...16,172,303,306 
  grep.ts          |   83.09 |    86.66 |   80.95 |   83.09 | ...60-661,711-712 
  ...adTracking.ts |     100 |      100 |     100 |     100 |                   
  loop-wakeup.ts   |   99.24 |    92.85 |     100 |   99.24 | 44                
  ls.ts            |   96.74 |    90.27 |     100 |   96.74 | 176-181,212,216   
  lsp.ts           |   72.77 |    60.09 |   90.32 |   72.77 | ...1211,1213-1214 
  ...nt-manager.ts |   80.57 |    78.46 |   84.44 |   80.57 | ...2985,2987-2988 
  mcp-client.ts    |   44.36 |    86.58 |   75.67 |   44.36 | ...1849,1853-1856 
  ...ry-timeout.ts |     100 |      100 |     100 |     100 |                   
  mcp-errors.ts    |     100 |      100 |     100 |     100 |                   
  ...pool-entry.ts |   77.56 |    84.11 |   77.14 |   77.56 | ...1291,1299-1300 
  ...ool-events.ts |       8 |        0 |       0 |       8 | 132-158           
  mcp-pool-key.ts  |   97.46 |    93.93 |     100 |   97.46 | 175-176           
  mcp-status.ts    |     100 |      100 |     100 |     100 |                   
  mcp-tool.ts      |   91.43 |     89.9 |   96.66 |   91.43 | ...72-673,723-724 
  ...sport-pool.ts |   83.49 |    80.15 |   84.61 |   83.49 | ...1409,1416-1420 
  ...ace-budget.ts |   87.27 |     82.6 |     100 |   87.27 | ...00-305,340-345 
  memory-config.ts |     100 |      100 |     100 |     100 |                   
  ...iable-tool.ts |     100 |    84.61 |     100 |     100 | 102,109           
  monitor.ts       |   91.65 |    84.05 |   88.46 |   91.65 | ...87,600,796-801 
  notebook-edit.ts |   85.11 |    76.42 |   81.25 |   85.11 | ...54-870,916-917 
  ...escendants.ts |   36.17 |    64.51 |   55.55 |   36.17 | ...46-310,385-390 
  ...nforcement.ts |   82.57 |    89.74 |     100 |   82.57 | 174-185,234-247   
  read-file.ts     |   94.75 |    90.32 |   81.81 |   94.75 | ...02,305,388-389 
  ripGrep.ts       |   93.85 |    85.21 |    87.5 |   93.85 | ...56-557,563-564 
  ...-transport.ts |    6.34 |        0 |       0 |    6.34 | 47-145            
  send-message.ts  |   81.39 |    88.88 |    62.5 |   81.39 | ...22-228,311-319 
  ...n-mcp-view.ts |   93.57 |     92.3 |      90 |   93.57 | 122-130           
  shell.ts         |   76.79 |    81.58 |   91.11 |   76.79 | ...4718,4781-4782 
  skill-utils.ts   |     100 |      100 |     100 |     100 |                   
  skill.ts         |    89.4 |     92.5 |   88.88 |    89.4 | ...43,447,476-498 
  ...eticOutput.ts |   95.12 |      100 |      80 |   95.12 | 87-88             
  task-create.ts   |   93.85 |     92.3 |   81.81 |   93.85 | 41-45,59-60,91    
  task-list.ts     |   73.38 |    77.77 |   83.33 |   73.38 | ...02,105,109-116 
  task-stop.ts     |   93.14 |    96.15 |   85.71 |   93.14 | 39-40,54-64       
  task-update.ts   |   80.67 |       78 |    92.3 |   80.67 | ...75-383,415-426 
  team-create.ts   |   97.22 |    85.71 |   83.33 |   97.22 | 48-49,129-130     
  team-delete.ts   |   86.74 |    83.33 |   83.33 |   86.74 | 37-38,42-48,72-73 
  todoWrite.ts     |   89.27 |    82.05 |   92.85 |   89.27 | ...50-555,577-578 
  tool-error.ts    |     100 |      100 |     100 |     100 |                   
  tool-names.ts    |     100 |      100 |     100 |     100 |                   
  tool-registry.ts |   76.04 |     76.1 |   81.39 |   76.04 | ...62-863,871-872 
  tool-search.ts   |   92.35 |    85.84 |    92.3 |   92.35 | ...08-213,320-329 
  tools.ts         |   92.36 |    90.74 |   90.47 |   92.36 | ...99-500,516-522 
  web-fetch.ts     |   89.56 |    83.33 |   92.85 |   89.56 | ...06-307,312-313 
  write-file.ts    |   82.65 |    80.45 |   84.61 |   82.65 | ...65-668,696-731 
 src/tools/agent   |   76.38 |    84.93 |   76.66 |   76.38 |                   
  agent.ts         |    76.6 |    85.14 |    77.1 |    76.6 | ...3097,3124-3187 
  fork-subagent.ts |   71.08 |       75 |   71.42 |   71.08 | ...25-126,161-172 
 ...tools/artifact |   95.44 |    90.53 |   88.37 |   95.44 |                   
  artifact-tool.ts |   89.28 |    76.47 |   69.23 |   89.28 | ...54-255,263-266 
  ...-publisher.ts |     100 |    85.71 |     100 |     100 | 32                
  ...-publisher.ts |   96.74 |    97.72 |    87.5 |   96.74 | 29-30,156-157     
  html.ts          |     100 |    96.77 |     100 |     100 | 122               
  ...-publisher.ts |     100 |       80 |     100 |     100 | 30                
  oss-publisher.ts |    98.1 |    91.48 |     100 |    98.1 | 43-45             
  publisher.ts     |     100 |      100 |     100 |     100 |                   
 ...s/computer-use |   90.05 |    81.35 |   75.36 |   90.05 |                   
  bootstrap.ts     |   59.42 |    80.95 |   41.66 |   59.42 | ...35-339,341-345 
  client.ts        |   73.22 |    89.65 |   64.28 |   73.22 | ...70-172,233-242 
  constants.ts     |     100 |    94.73 |     100 |     100 | 129,256           
  downloader.ts    |   65.29 |    52.77 |   58.33 |   65.29 | ...99-300,316-355 
  index.ts         |     100 |      100 |     100 |     100 |                   
  install-state.ts |   94.44 |    72.72 |     100 |   94.44 | 44-45             
  ...n-detector.ts |     100 |     87.5 |     100 |     100 | 50                
  schemas.ts       |     100 |      100 |     100 |     100 |                   
  tool.ts          |   96.29 |     85.5 |     100 |   96.29 | 75-76,184,251-257 
 ...tools/workflow |   87.46 |    79.41 |   85.71 |   87.46 |                   
  workflow.ts      |   87.46 |    79.41 |   85.71 |   87.46 | ...53-654,666-669 
 src/utils         |   90.23 |    88.74 |      95 |   90.23 |                   
  LruCache.ts      |       0 |        0 |       0 |       0 | 1-41              
  ...Controller.ts |     100 |      100 |     100 |     100 |                   
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...cFileWrite.ts |   94.76 |    93.26 |     100 |   94.76 | ...30-531,634-638 
  bareMode.ts      |   27.27 |      100 |       0 |   27.27 | 9-15,18-19        
  browser.ts       |   86.84 |    78.94 |     100 |   86.84 | 34,36-37,65-66    
  btwUtils.ts      |   13.95 |      100 |       0 |   13.95 | 17-31,34-55       
  bundlePaths.ts   |     100 |      100 |     100 |     100 |                   
  ...ncyLimiter.ts |   94.64 |    95.23 |     100 |   94.64 | 64-66             
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  ...engthError.ts |   91.11 |    89.47 |     100 |   91.11 | ...46-147,154-155 
  cronDisplay.ts   |     100 |    91.66 |     100 |     100 | 15,43,57          
  cronParser.ts    |   95.34 |     93.1 |     100 |   95.34 | 41-42,47-48,70-71 
  debugLogger.ts   |   96.42 |    94.11 |   88.23 |   96.42 | 185-189           
  editHelper.ts    |   93.63 |    83.52 |     100 |   93.63 | ...28-429,463-464 
  editor.ts        |    97.6 |     95.4 |     100 |    97.6 | ...25-326,328-329 
  env.ts           |     100 |      100 |     100 |     100 |                   
  ...arResolver.ts |   94.28 |    88.88 |     100 |   94.28 | 28-29,125-126     
  ...entContext.ts |   96.78 |    89.13 |      95 |   96.78 | ...51-252,257,403 
  errorParsing.ts  |    97.7 |    97.05 |     100 |    97.7 | 72-73             
  ...rReporting.ts |   88.46 |       90 |     100 |   88.46 | 69-74             
  errors.ts        |   70.54 |    80.39 |      50 |   70.54 | ...15-231,235-241 
  fetch.ts         |    70.8 |     77.5 |   71.42 |    70.8 | ...41-142,161,186 
  fileUtils.ts     |    91.5 |    86.25 |   95.23 |    91.5 | ...1191,1195-1201 
  forkedAgent.ts   |   80.68 |    78.12 |   83.33 |   80.68 | ...39-545,550-556 
  formatters.ts    |   81.81 |       75 |     100 |   81.81 | 15-16             
  ...eUtilities.ts |   89.21 |    86.66 |     100 |   89.21 | 16-17,49-55,65-66 
  ...rStructure.ts |   94.36 |    94.28 |     100 |   94.36 | ...17-120,330-335 
  getPty.ts        |   31.57 |       50 |     100 |   31.57 | 26-38             
  gitDiff.ts       |   92.36 |    80.09 |     100 |   92.36 | ...55-856,928-929 
  gitDirect.ts     |   98.46 |    90.17 |     100 |   98.46 | 148,268,352       
  ...noreParser.ts |   93.84 |     91.3 |     100 |   93.84 | ...03-104,185-186 
  gitUtils.ts      |   72.91 |    90.32 |   83.33 |   72.91 | ...,77-78,102-153 
  iconvHelper.ts   |     100 |      100 |     100 |     100 |                   
  ...rePatterns.ts |     100 |      100 |     100 |     100 |                   
  ...ionManager.ts |     100 |     90.9 |     100 |     100 | 27                
  ...lPromptIds.ts |     100 |      100 |     100 |     100 |                   
  jsonl-utils.ts   |   93.13 |     92.3 |     100 |   93.13 | ...16-317,356-359 
  ...-detection.ts |     100 |      100 |     100 |     100 |                   
  ...iagnostics.ts |    96.4 |     94.2 |     100 |    96.4 | ...66,293-294,376 
  ...yDiscovery.ts |    92.4 |    89.01 |     100 |    92.4 | ...28,331,522-525 
  ...tProcessor.ts |   93.77 |    89.02 |     100 |   93.77 | ...13-319,406-407 
  ...Inspectors.ts |     100 |      100 |     100 |     100 |                   
  modelId.ts       |   98.96 |    98.18 |     100 |   98.96 | 153               
  ...kerChecker.ts |    90.9 |    91.66 |     100 |    90.9 | 73-79             
  notebook.ts      |   94.57 |    89.83 |   95.83 |   94.57 | ...21,333,385-387 
  openaiLogger.ts  |   90.85 |    87.87 |     100 |   90.85 | ...97-199,222-227 
  partUtils.ts     |     100 |    98.61 |     100 |     100 | 206               
  pathReader.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |    93.3 |    92.22 |     100 |    93.3 | ...92-393,395-397 
  pdf.ts           |   93.68 |    87.05 |     100 |   93.68 | ...96-297,321-325 
  projectPath.ts   |     100 |      100 |     100 |     100 |                   
  projectRoot.ts   |   71.73 |    78.57 |     100 |   71.73 | 54-66             
  ...ectSummary.ts |   89.62 |    72.41 |     100 |   89.62 | ...40-145,196-199 
  ...tIdContext.ts |     100 |      100 |     100 |     100 |                   
  proxyUtils.ts    |     100 |      100 |     100 |     100 |                   
  ...rDetection.ts |   58.57 |       76 |     100 |   58.57 | ...4,88-89,95-100 
  ...noreParser.ts |   89.28 |    88.88 |     100 |   89.28 | 51-52,59-60,73-74 
  rateLimit.ts     |   93.75 |    88.34 |     100 |   93.75 | ...13,218-219,262 
  readManyFiles.ts |   87.59 |       84 |     100 |   87.59 | ...09-211,227-238 
  retry.ts         |   95.93 |    91.83 |     100 |   95.93 | ...33,524-525,543 
  retryContext.ts  |     100 |      100 |     100 |     100 |                   
  ...sification.ts |   97.52 |    96.84 |     100 |   97.52 | ...05,255-256,282 
  retryPolicy.ts   |   97.72 |    90.56 |     100 |   97.72 | 130-131           
  ripgrepUtils.ts  |   50.94 |    85.71 |      70 |   50.94 | ...54-255,268-346 
  ...sDiscovery.ts |   97.42 |    92.85 |     100 |   97.42 | ...04,182-183,202 
  ...iagnostics.ts |   83.08 |     67.5 |   92.59 |   83.08 | ...23,543-544,550 
  ...tchOptions.ts |   82.18 |    85.18 |   95.23 |   82.18 | ...24,549,578-587 
  ...odelPrefix.ts |     100 |      100 |     100 |     100 |                   
  runtimeStatus.ts |    97.5 |    89.74 |     100 |    97.5 | 162-163           
  safeJsonParse.ts |   74.07 |    83.33 |     100 |   74.07 | 40-46             
  ...nStringify.ts |     100 |      100 |     100 |     100 |                   
  ...aConverter.ts |   90.78 |    88.23 |     100 |   90.78 | ...41-42,93,95-96 
  ...aValidator.ts |   91.97 |    83.42 |     100 |   91.97 | ...44,866-867,880 
  ...r-launcher.ts |   96.35 |    93.97 |   85.71 |   96.35 | ...35-336,347-348 
  sedEditParser.ts |   91.72 |    92.12 |     100 |   91.72 | ...36-539,615-616 
  ...nIdContext.ts |     100 |      100 |     100 |     100 |                   
  ...orageUtils.ts |   95.98 |     83.8 |     100 |   95.98 | ...70,386,466,485 
  shell-utils.ts   |   86.24 |    89.61 |     100 |   86.24 | ...2003,2010-2014 
  ...lAstParser.ts |   95.57 |    85.88 |     100 |   95.57 | ...1066-1068,1078 
  ...ContextEnv.ts |     100 |      100 |     100 |     100 |                   
  ...nlyChecker.ts |   95.08 |    91.66 |     100 |   95.08 | ...15-316,324-325 
  sideQuery.ts     |   86.61 |     87.5 |     100 |   86.61 | ...66-172,174-180 
  ...pEventSink.ts |     100 |       80 |     100 |     100 | 61                
  ...tGenerator.ts |     100 |      100 |     100 |     100 |                   
  ...ameContext.ts |     100 |      100 |     100 |     100 |                   
  symlink.ts       |   81.48 |    77.77 |     100 |   81.48 | 54-59             
  ...emEncoding.ts |   96.36 |    91.17 |     100 |   96.36 | 59-60,124-125     
  terminalSafe.ts  |     100 |      100 |     100 |     100 |                   
  ...Serializer.ts |   98.72 |       90 |     100 |   98.72 | 42-43,134,201-203 
  testUtils.ts     |   53.33 |      100 |   33.33 |   53.33 | ...53,59-64,70-72 
  textUtils.ts     |      65 |      100 |      75 |      65 | 56-75             
  thoughtUtils.ts  |     100 |    92.85 |     100 |     100 | 71                
  ...-converter.ts |   95.23 |    85.71 |     100 |   95.23 | 36-37             
  tool-utils.ts    |    93.6 |     91.3 |     100 |    93.6 | ...58-159,162-163 
  ...ultCleanup.ts |   15.74 |    33.33 |      25 |   15.74 | 33-134            
  ...Compaction.ts |   95.68 |    95.32 |     100 |   95.68 | ...29-334,533-534 
  truncation.ts    |   75.55 |    86.02 |   71.42 |   75.55 | ...44-449,453-477 
  windowsPath.ts   |   89.47 |    79.31 |     100 |   89.47 | ...57-58,62,90-91 
  ...aceContext.ts |   95.81 |    89.39 |     100 |   95.81 | ...74-275,299-301 
  xml.ts           |    97.8 |     87.5 |     100 |    97.8 | 98-99             
  yaml-parser.ts   |   83.87 |    77.27 |     100 |   83.87 | ...31-234,239-240 
 ...ils/filesearch |   83.26 |    80.07 |   94.44 |   83.26 |                   
  crawlCache.ts    |     100 |      100 |     100 |     100 |                   
  crawler.ts       |   82.47 |    76.22 |      95 |   82.47 | ...1525,1559-1560 
  fileSearch.ts    |   93.78 |    87.67 |     100 |   93.78 | ...70-271,273-274 
  fzfWorker.ts     |       0 |        0 |       0 |       0 | 1-109             
  ...rkerHandle.ts |   84.05 |    75.43 |   89.47 |   84.05 | ...30-334,340-341 
  ignore.ts        |     100 |      100 |     100 |     100 |                   
  result-cache.ts  |     100 |    93.75 |     100 |     100 | 49                
 ...uest-tokenizer |   68.81 |    73.82 |   83.87 |   68.81 |                   
  ...eTokenizer.ts |   65.72 |    74.02 |    92.3 |   65.72 | ...65-466,479-533 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tTokenizer.ts |   68.39 |    69.49 |    90.9 |   68.39 | ...24-325,327-328 
  ...ageFormats.ts |   76.92 |      100 |   33.33 |   76.92 | 46-49,56-57       
  textTokenizer.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
-------------------|---------|----------|---------|---------|-------------------

For detailed HTML reports, please see the 'coverage-reports-22.x-ubuntu-latest' artifact from the main CI run.

@LaZzyMan

Copy link
Copy Markdown
Collaborator Author

End-to-end demo (real model, real sub-agent dispatch)

Full lifecycle recorded against the local build (qwen3.6-plus, QWEN_CODE_ENABLE_WORKFLOWS=1):

workflow E2E demo

  1. Open a task — the model calls the Workflow tool with an inline script that dispatches two agent() sub-agents; the ⚙ workflow active footer indicator lights up (P7-trigger, keyword steering).
  2. Running state — footer shows the · 1 workflow pill with a live agentsDispatched count.
  3. /workflows — lists the run: 2/2 agents · Research phase · tokens.
  4. Completionfrance: Paris, japan: Tokyo.
  5. Open the background-tasks dialog focuses the pill → per-run detail view (phase tree + agents + tokens, s save hint).
  6. Saves → name capitals → project scope.
  7. Persisted — written to .qwen/workflows/capitals.js, which becomes the /capitals saved-workflow command (P7b-A1 / P7b-A3).

This real-scenario run also surfaced a genuine reachability bug, fixed in 5a1fb6a: a workflow-only session (no live sub-agents) could not open the BackgroundTasksDialog by keyboard at all — descendFromComposer only focused the live-agent panel or the Arena tab bar, and a workflow is never a live-agent-panel entry (isLiveAgentPanelVisibleEntry requires kind === 'agent'), so focused nothing and the save action was unreachable in exactly the case it targets. Fixed by focusing the background-tasks pill when it's the only descendable surface.

The GIF lives on a throwaway demo-assets-workflow-port branch, not in this PR's diff — safe to delete after review.

@wenshao wenshao left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Incremental review of 5a1fb6a (the InputPrompt background-pill focus fix added since the previous review). The change is correct and well-scoped: the new bgEntries.length > 0 branch matches the pill's own render guard (BackgroundTasksPill returns null when entries.length === 0), so it can't strand focus on a hidden pill; it reuses the existing pillFocused → ↓ → openDialog chain; and the useCallback deps are complete. Minor nit (non-blocking): no regression test covers the new workflow-only focus branch, and the function's lead comment (the top→bottom focus order) wasn't updated to include the new pill step.

This commit does not touch the previously-flagged path-traversal Criticals (resumeFromRunId run-id, and scriptPath / workflow('<name>') containment), which remain open. Not approving: those Criticals are still unresolved and CI is still running on this commit.

— claude-opus-4-8[1m] via Qwen Code /qreview

@wenshao wenshao left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Incremental re-review of 5a1fb6a6d2e6994b1e19ebcd2cdce56ba70630ce found no new actionable issues in the latest InputPrompt.tsx-only update. I am leaving this as a comment rather than approval because existing review comments remain open and CI is still pending.

Verification:

  • qwen review deterministic ... reported 0 findings for the changed file; direct npm run typecheck and cd packages/cli && npx tsc --noEmit passed.
  • cd packages/cli && npx vitest run src/ui/components/InputPrompt.test.tsx src/ui/components/background-view/BackgroundTasksPill.test.tsx src/ui/components/background-view/BackgroundTasksDialog.test.tsx passed (232 tests).

— GPT-5 Codex via Qwen Code /review

@wenshao wenshao left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Suggestion] Missing test coverage: no test asserts setBgPillFocused is called when the new else if (bgEntries.length > 0) branch fires. The mock infrastructure is already in place (mockViewActions.setBgPillFocused in InputPrompt.test.tsx), so adding a test case that sets agents: new Map(), provides a non-agent bg entry (kind: 'workflow'), presses Down, and asserts setBgPillFocused was called with true would cover the gap.

— qwen3.7-max via Qwen Code /review

Comment thread packages/cli/src/ui/components/InputPrompt.tsx
Comment thread packages/cli/src/ui/components/InputPrompt.tsx
Comment thread packages/cli/src/ui/components/InputPrompt.tsx
…dless, resume, stall (#4721, PR #5600)

Security:
- Validate `resumeFromRunId` as `wf_<hex>` before it flows into the journal/
  snapshot paths (path.join), closing a path-traversal write/read outside
  `<projectDir>/workflows`.
- `resolveSavedWorkflowScript`: validate the string name (no `../` escape) and
  route both the name and `scriptPath` forms through a realpath boundary check
  that refuses anything resolving outside the saved-workflow dirs — this also
  defeats symlink escape. `listJsFiles` skips symlinked entries during discovery.

Correctness:
- Saved-workflow slash commands are `interactive` only — their `{type:'tool'}`
  action becomes `unsupported` in headless/ACP, so advertising those modes
  surfaced a command that then failed.
- Skip workflow keyword steering for `?btw`/`/btw` so the system-reminder prefix
  no longer breaks BTW routing.
- Seed the resume prefix-hash chain with `sha256(args)` so a resume with
  different args misses the journal and re-runs live instead of silently
  replaying the prior run's results.
- The stall watchdog arms on the FIRST response event, not at attach time, so a
  reasoning model's slow time-to-first-token is not a false stall (that window
  is bounded by the subagent's max_time); it now detects post-first-response
  streaming stalls.

Resource / docs:
- `pruneSnapshots` also removes each pruned run's `<runId>/journal.jsonl`
  directory (previously leaked unboundedly).
- Drop the inaccurate "save dialog offers 'already saved'" comment (no such
  affordance exists) from the three sites.

Adds security + behavioural tests for each; declined as out of scope: nested-
workflow log accumulation, a __proto__-guard test, hung-tool watchdog suspend
(max_time backstops it), and the save TOCTOU.
@LaZzyMan

Copy link
Copy Markdown
Collaborator Author

Review round 1 — addressed in 564593a

Thanks for the thorough security pass. Outcomes:

Fixed (9):

  • resumeFromRunId path traversal (also @qqqys's review-body) — validated as wf_<hex> in validateToolParamValues before it can become runId and reach getWorkflowRunJournalPath / getWorkflowRunSnapshotPath.
  • workflow('<name>') / scriptPath path escape — string-name validation + a realpath boundary check that refuses anything resolving outside getSavedWorkflowDirs.
  • ✅ Symlink-follow arbitrary-file read — listJsFiles skips symlinked entries; resolution goes through the realpath boundary check.
  • ✅ Saved-workflow commands false-available in headless/ACP — restricted to supportedModes: ['interactive'] (the tool-dispatch action is unsupported there).
  • ✅ Keyword steering broke ?btw routing — steering now skips ?btw//btw submissions.
  • ✅ Resume cache ignored args — the prefix-hash chain is seeded with sha256(args) (deriveArgsSeed).
  • ✅ Stall false-trip on slow first token — the watchdog now arms on the first response event. (AgentEventType.START is never emitted, so subscribing to it would be a no-op; the time-to-first-response window is instead bounded by the subagent's max_time_minutes.)
  • pruneSnapshots leaked journal directories — now removes <runId>/journal.jsonl alongside the snapshot.
  • ✅ Inaccurate "save dialog offers 'already saved'" comments — removed from all three sites.

Declined (out of scope for this round / backstopped):

  • ❌ Nested-workflow log accumulation — niche single-level feature; child phase()/log() is visible live via the emitter, only the final snapshot loses it.
  • __proto__-guard dedicated test — added coverage for working code.
  • ❌ Hung-tool permanent watchdog suspend — the subagent's max_time_minutes bounds the dispatch.
  • saveWorkflowScript TOCTOU — interactive single-user save; the window is unreachable in practice.

Each fix carries a security/behavioural test. All inline threads have been replied to and resolved.

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Thanks for the PR! This finishes the Dynamic Workflows surface — resume, saved workflows, keyword trigger, snapshots, notifications. Big chunk of work.

Template looks good ✓ — all required sections present, evidence provided, tested-on table filled.

Direction: aligned. This is the natural continuation of #4721 (P1–P5 already merged). Workflows without resume/save/discovery are half a feature — this PR closes the gap. The upstream feature this ports from has these capabilities, so the direction signal is clear.

Scope: 42 files, 4186 additions, ~10 sub-features in one PR. That's a lot, but I think bundling is defensible here — the sub-features are tightly coupled (resume needs the journal, saved workflows need the slash command loader, snapshots need the registry, the save dialog needs the saved-workflow resolver). Splitting into 5 smaller PRs would create merge-conflict hell and make each individually unreleasable. The tradeoff is a harder review, but that's on us, not the contributor.

On the existing review comments: the path-traversal criticals flagged by @qqqys appear to be addressed in the current code:

  • resumeFromRunId is validated with /^wf_[0-9a-f]+$/ in validateToolParamValues
  • resolveSavedWorkflowScript routes through readWorkflowFileSecurely which does fs.realpath + boundary check ✓
  • validateWorkflowName uses /^[a-z][a-z0-9-]{0,40}$/ and is called before any path construction ✓
  • Symlinks in workflow dirs are explicitly skipped in listJsFiles

These are defense-in-depth (name validation AND realpath check), which is the right approach for a tool that accepts user-controlled paths.

One concern before code review: tested only on macOS per the PR body. This CI runs on all three platforms — worth watching for platform-specific failures in the journal/snapshot paths (which use path.join and should be fine, but fs.realpath behavior on Windows symlinks can be surprising).

Moving on to code review and real-scenario testing. 🔍

中文说明

感谢贡献!这个 PR 完成了 Dynamic Workflows 的完整移植——恢复、保存、关键词触发、快照、通知。工作量很大。

模板完整 ✓ — 所有必填章节都有,提供了证据,测试平台表已填写。

**方向:**对齐。这是 #4721(已合并的 P1–P5)的自然延续。没有恢复/保存/发现功能的 Workflow 只是半成品——这个 PR 补全了这个缺口。上游对应的功能确实有这些能力,方向信号明确。

**范围:**42 个文件,4186 行新增,约 10 个子功能集中在一个 PR 里。量很大,但我认为打包是合理的——子功能紧密耦合(resume 需要 journal,保存的 workflow 需要 slash command loader,快照需要 registry,保存对话框需要 saved-workflow resolver)。拆成 5 个小 PR 会导致合并冲突地狱,且每个单独都不可发布。代价是审查更难,但这是我们的事,不是贡献者的。

关于已有的 review 评论:@qqqys 标记的路径穿越 Critical 在当前代码中看起来已修复:

  • resumeFromRunIdvalidateToolParamValues 中用 /^wf_[0-9a-f]+$/ 验证 ✓
  • resolveSavedWorkflowScript 经过 readWorkflowFileSecurely,做了 fs.realpath + 边界检查 ✓
  • validateWorkflowName/^[a-z][a-z0-9-]{0,40}$/ 并在任何路径构造前调用 ✓
  • workflow 目录中的符号链接在 listJsFiles 中被显式跳过 ✓

这些是纵深防御(名称验证 + realpath 检查),对于接受用户控制路径的工具来说是正确的做法。

**一个顾虑:**PR body 显示仅在 macOS 上测试。CI 在三个平台运行——需要关注 journal/snapshot 路径的平台特定问题(使用了 path.join 应该没问题,但 Windows 上 fs.realpath 对符号链接的行为可能出人意料)。

进入代码审查和真实场景测试。🔍

Qwen Code · qwen3.7-max

…#4721)

Round-1's descendFromComposer pill branch (5a1fb6a) only reached the pill when no Arena tab bar was present. When both an Arena roster and a background-tasks pill (e.g. a workflow run) are shown, ↓ from the composer stops at the tab bar, whose Down handler was a no-op — stranding the pill and the run's detail/save dialog behind it.

AgentTabBar's Down now descends into the pill when one is shown (bgEntries > 0), completing the chain BackgroundTasksPill already documents (Composer ↓ → AgentTabBar ↓ → Pill ↓ → Dialog); the dialog is now reachable in all four roster/pill coexistence cases. Also refresh the stale descendFromComposer comment to name the pill destination and add InputPrompt coverage for the round-1 pill branch.
@LaZzyMan

Copy link
Copy Markdown
Collaborator Author

Review round 2 (InputPrompt focus-chain follow-ups) — addressed in dd587f9

  • AgentTabBar's Down was a no-op, stranding the background-tasks pill (and the run's detail/save dialog) behind the Arena tab bar. Down now descends into the pill when one is shown (bgEntries.length > 0), completing the chain BackgroundTasksPill.tsx documents: Composer ↓ → AgentTabBar ↓ → Pill ↓ → Dialog. Audited all three Down handlers in the chain — the dialog is now reachable in all four roster/pill coexistence cases.
  • ✅ Stale descendFromComposer comment now names the pill destination.
  • ✅ Added InputPrompt.test.tsx coverage for the round-1 pill branch; reframed AgentTabBar's no-op test into 'descends into the pill' + 'no-op when no pill'.

typecheck + lint clean; AgentTabBar.test.tsx (7) and InputPrompt.test.tsx (178) green. All three inline threads replied to and resolved.

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Code Review

Independently, I'd approach this the same way: a scriptPath XOR with script, file-based discovery in .qwen/workflows/, slash command registration via ICommandLoader, JSONL journal with rolling prefix-hash for resume, snapshots for cross-session history. The PR's implementation matches this and adds good engineering — the readWorkflowFileSecurely realpath boundary check, the deriveArgsSeed chain root (prevents cross-run cache leaks), and the stall watchdog that suspends during tool flights.

Security — path traversal (addressing @qqqys's review):

The concerns are fixed with defense-in-depth. I verified directly:

1. validateWorkflowName:
   "../../evil": BLOCKED (regex: /^[a-z][a-z0-9-]{0,40}$/)
   "CamelCase": BLOCKED
   "ok-name": accepted

2. resolveSavedWorkflowScript('../../etc/passwd'):
   BLOCKED at name validation (before any path construction)

3. resolveSavedWorkflowScript({scriptPath: '/etc/passwd'}):
   BLOCKED: "refusing to load a workflow file outside the saved-workflow directories"
   (realpath boundary check in readWorkflowFileSecurely)

4. Symlink in .qwen/workflows/ → silently excluded from discovery
   (lstat check in listJsFiles — prevents a malicious repo from shipping
    a symlink to ~/.aws/credentials and leaking it through snapshots)

5. resumeFromRunId validation: /^wf_[0-9a-f]+$/ in validateToolParamValues
   (blocks path segments in the journal/snapshot path)

All five attack vectors blocked. The security is layered (name check AND realpath check), which is the right call for user-controlled paths.

Journal design: the rolling prefix-hash chain (v2:sha256(prefixHash ‖ prompt ‖ canonicalOpts)) with deriveArgsSeed as the chain root is correct — editing call #3 changes #3's key, which cascades to invalidate #4, #5, etc. The canonicalizeAgentOpts projection (only schema/model/isolation/agentType, sorted keys) correctly avoids cosmetic cache busts. JSONL append-only with fire-and-forget writes (journal failure ≠ dispatch failure) is the right tradeoff.

Stall watchdog: arms on first progress event (not attach time) — correctly avoids false-tripping on slow first-response. Suspends during in-flight tools (a 90s shell build isn't a stall). Uses timer.unref() so it doesn't keep the event loop alive. The 3-retry loop distinguishes stall-abort (retry) from parent-abort (propagate). Clean implementation.

No critical blockers found. 125 new unit tests pass (96 core + 29 CLI). Typecheck clean. Build succeeds.

Real-Scenario Testing

CLI smoke test (feature flag)

$ QWEN_CODE_ENABLE_WORKFLOWS=1 node dist/cli.js -p 'say hello' --model qwen3-coder-plus
Hello! How can I assist you today?

CLI boots and responds normally with workflows enabled. ✓

Keyword detection (direct verification)

$ node -e "..." (detectWorkflowKeyword tests)
workflow: true       ← exact word matches
workflows: false     ← plural does NOT trigger
dataflow: false      ← compound does NOT trigger
my-workflow-runner: false ← hyphenated compound does NOT trigger
Workflow.: true      ← edge punctuation stripped
(workflow): true     ← parens stripped
WORKFLOW: true       ← case-insensitive

All 7 cases correct — matches the stricter "standalone word" semantics (not \bworkflow\b). ✓

Saved workflow discovery

$ node triage-test-script.mjs
Discovered workflows: [
  { "name": "demo", "scriptPath": ".../.qwen/workflows/demo.js", "source": "project" }
]

Created .qwen/workflows/demo.js, listSavedWorkflows found it immediately. ✓

Security tests (path traversal + symlink)

$ node triage-security-test.mjs
validateWorkflowName("../../evil"): BLOCKED
resolveSavedWorkflowScript('../../etc/passwd'): BLOCKED at name validation
resolveSavedWorkflowScript({scriptPath: '/etc/passwd'}): BLOCKED by realpath boundary
Symlink in .qwen/workflows/: excluded from discovery
Valid resolution of 'demo': OK (script length: 127)

All 5 security scenarios verified. ✓

Not tested

Full interactive workflow execution and resume require model API calls — no API key in this CI environment. The unit tests comprehensively cover the execution path (96 core tests including journal replay, stall retry, saved-workflow resolution, and snapshot pruning). The save dialog and terminal bell are covered by component tests (7 overlay tests).

中文说明

代码审查

独立来看,我会采用相同的方法:scriptPathscript XOR,.qwen/workflows/ 中的文件发现,通过 ICommandLoader 注册斜杠命令,带滚动前缀哈希的 JSONL 日志用于恢复,快照用于跨会话历史。PR 的实现与此一致,并增加了良好的工程实践——readWorkflowFileSecurely 的 realpath 边界检查、deriveArgsSeed 链根(防止跨运行缓存泄漏)、以及暂停工具执行期间暂停的 stall 看门狗。

安全——路径穿越(回应 @qqqys 的审查):

问题已用纵深防御修复。我直接验证了:

  • 名称验证在路径构造前阻止了 ../../evil
  • realpath 边界检查阻止了 /etc/passwd
  • 符号链接从发现中被排除
  • resumeFromRunId/^wf_[0-9a-f]+$/ 正则阻止了路径段

所有五个攻击向量都被阻止。安全是分层的(名称检查 + realpath 检查),对用户控制的路径来说是正确的做法。

日志设计: 滚动前缀哈希链 + deriveArgsSeed 链根正确——编辑第 3 个调用会级联失效 #4#5 等。canonicalizeAgentOpts 投影正确避免了装饰性缓存失效。JSONL 追加写入且 fire-and-forget 是正确的权衡。

未发现关键阻塞问题。 125 个新单元测试全部通过。类型检查干净。构建成功。

真实场景测试

  • CLI 带 workflow 功能标志启动正常 ✓
  • 关键词检测:7/7 用例正确 ✓
  • 保存的 workflow 发现:创建 .qwen/workflows/demo.js 后立即被发现 ✓
  • 安全测试:5/5 路径穿越/符号链接场景被阻止 ✓
  • 完整的交互式 workflow 执行和恢复需要模型 API 调用,此 CI 环境没有 API key

Qwen Code · qwen3.7-max

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Stepping back to think about the whole picture.

This PR finishes the Dynamic Workflows surface — it's the bridge from "workflows exist" (P1–P5) to "workflows are reusable, durable, and discoverable." My independent proposal would have looked almost identical: scriptPath XOR, file discovery in .qwen/workflows/, slash command registration, JSONL journal with rolling prefix-hash, snapshots. The PR matches that and adds engineering I'd have missed (the deriveArgsSeed chain root to prevent cross-run cache leaks, the stall watchdog's tool-flight suspension).

The security concerns that drove the existing CHANGES_REQUESTED reviews are resolved. I verified all five attack vectors directly — path traversal via name, path traversal via scriptPath, symlink in workflow dir, resumeFromRunId path injection, and valid-resolution happy path. Defense-in-depth works. The earlier reviewers flagged the right thing; the contributor fixed it the right way.

125 new tests, all green. Typecheck clean. Build clean. The keyword detection behaves exactly as documented (7/7 cases verified independently). The saved-workflow discovery works end-to-end (created a file, found it, resolved it, ran it through security checks).

What I'd flag as mild concerns (not blockers):

The scope is large (42 files, 4186 additions, ~10 sub-features). In isolation I'd have preferred smaller PRs, but the coupling is real — resume needs the journal, saved workflows need the loader, snapshots need the registry. Splitting would have created integration pain without reducing review complexity. The contributor made the right call.

Only macOS tested per the PR body. The code uses path.join and fs.realpath throughout (platform-agnostic), so I don't expect platform failures, but Windows fs.realpath behavior with edge cases can surprise. CI will tell.

The stall watchdog timeout (60s default) is a heuristic. A genuinely slow model response that happens to produce events just under the threshold won't trip it; a model that pauses for 61s between tokens will. The env override (QWEN_CODE_WORKFLOW_STALL_SECONDS) and per-call stallMs give escape hatches. Fine for now.

Bottom line: this ships the feature cleanly, the security is solid, the tests cover the surface, and the code is something I'd be fine maintaining. Approving. ✅

中文说明

退一步看全局。

这个 PR 完成了 Dynamic Workflows 的完整能力面——从"workflow 存在"(P1–P5)到"workflow 可复用、持久化、可发现"的桥梁。我的独立方案几乎完全一样:scriptPath XOR、.qwen/workflows/ 中的文件发现、斜杠命令注册、带滚动前缀哈希的 JSONL 日志、快照。PR 与此一致,还增加了一些我会遗漏的工程细节(deriveArgsSeed 链根防止跨运行缓存泄漏、stall 看门狗的工具执行暂停机制)。

驱动现有 CHANGES_REQUESTED 审查的安全问题已解决。 我直接验证了所有五个攻击向量——通过名称的路径穿越、通过 scriptPath 的路径穿越、workflow 目录中的符号链接、resumeFromRunId 路径注入、以及正常解析的 happy path。纵深防御有效。之前的审查者标记了正确的问题;贡献者以正确的方式修复了它。

125 个新测试,全部通过。 类型检查干净。构建干净。关键词检测行为完全符合文档(独立验证 7/7 用例)。保存的 workflow 发现端到端工作(创建文件、找到它、解析它、通过安全检查运行)。

轻微顾虑(非阻塞):

范围较大(42 文件,4186 行新增,约 10 个子功能)。孤立来看我会更倾向于小 PR,但耦合是真实的——恢复需要日志,保存的 workflow 需要加载器,快照需要注册表。拆分会增加集成痛苦而不减少审查复杂度。贡献者做了正确的选择。

PR body 显示仅在 macOS 上测试。代码全程使用 path.joinfs.realpath(平台无关),所以不预期平台故障,但 Windows 的 fs.realpath 在边缘情况下可能出人意料。CI 会告诉我们。

stall 看门狗超时(默认 60s)是启发式的。一个恰好低于阈值产生事件的慢模型响应不会触发它;一个在 token 之间暂停 61s 的模型会。环境变量覆盖和每次调用的 stallMs 提供了逃生通道。目前可以。

结论: 这个 PR 干净地交付了功能,安全扎实,测试覆盖了全面,代码我愿意维护。批准。✅

Qwen Code · qwen3.7-max

@qwen-code-ci-bot qwen-code-ci-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, looks ready to ship. ✅

Comment thread packages/core/src/agents/runtime/workflow-saved.ts Outdated
A checked-in `.qwen/workflows -> /outside` symlink turned its external target into the trusted boundary: readWorkflowFileSecurely realpaths the root, so discovery listed, workflow('<name>') read, and the save dialog wrote external files. Round 1's per-entry symlink guard missed this because the link is the dir, not the files it exposes (which are regular).

Refuse a symlinked root for all three operations via isSymlinkedRoot (lstat). Symlinked *ancestors* are still tolerated (realpath keeps a project under macOS `/tmp -> /private/tmp` working) — only the workflows dir itself must not be a link. Each vector carries a RED-before-fix security test (`.qwen/workflows -> outside`: discovery excludes, read refuses, save throws).

@wenshao wenshao left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No new review findings in the latest update. Downgraded from Approve to Comment: CI still running.

— GPT-5 Codex via Qwen Code /review

Comment thread packages/core/src/agents/workflow-snapshot.ts
@wenshao

wenshao commented Jun 22, 2026

Copy link
Copy Markdown
Collaborator

✅ Verification — Dynamic Workflows port: saved workflows, cross-session history, keyword trigger, and journal resume all work live

I ran an independent local verification of this PR on Linux at head c343bcbcb (QWEN_CODE_ENABLE_WORKFLOWS=1). I drove the real dist/cli.js under tmux for 4 of the 5 reviewer-plan items, captured the on-disk/on-the-wire evidence, and ran the PR's workflow unit surface. Everything checks out.

Method

Piece Detail
Build head c343bcbcbnpm install + npm run bundle → real dist/cli.js
Driver real TUI under tmux (interactive items) + headless node dist/cli.js -p … --approval-mode yolo (resume); isolated HOME, mock OpenAI for boot/subagents; Linux x64 / Node 22
Observables /workflows listing, on-disk snapshot + journal files, the footer indicator, and the captured /v1/chat/completions payloads (for the steering reminder + subagent request counts)

Unit surface — 443 workflow tests pass (0 failed)

Core 362 (workflow-orchestrator 113, workflow-sandbox 109 incl. the 30 s vm-timeout security test, workflow-saved 33, workflow-run-registry 32, workflow-stall 19, workflow-journal 14, workflow-snapshot 8, workflow tool 34) + CLI 81 (workflow-keyword, saved-workflow-loader, workflowsCommand, workflow-save-overlay, commandMetadata).

Runtime verifications (real CLI)

1) Saved-workflow discovery + run (P7b-A1).qwen/workflows/demo.js

> /demo                  ← autocomplete: demo [json-args]  Run the "demo" saved workflow (project)
result: "done"           ← phase "Plan" executed, log "hello from the demo workflow" captured

and a snapshot was persisted to ~/.qwen/projects/<hash>/workflows/wf_febb98a68a241591.json.

2) Cross-session history (P7b-A2) — survives a full process restart

session 1:  /workflows → Workflow runs (1 total · 0 running) · wf_febb98… completed · demo · Plan · 1 phase
<kill the CLI process, relaunch a FRESH one>
session 2:  /workflows → Workflow runs (1 total · 0 running) · wf_febb98… completed · demo · 1 phase

The fresh process has an empty in-memory registry, so the listing comes purely from the on-disk snapshot. ✅

3) workflow keyword trigger + footer (P7-trigger) — verified positive and negative in one fresh session:

turn 1 "list the workflows and the dataflow in my-workflow-runner"  → NO footer, NO steering reminder   ← negative
turn 2 "can you build a workflow for this"                          → footer "⚙ workflow active" +
                                                                       <system-reminder> injected         ← positive

The injected reminder is the soft nudge (verbatim from the request): "…If this request benefits from orchestrating multiple steps or subagents, strongly prefer the Workflow tool… If a workflow is not a good fit for this request, proceed normally." — never a forced tool call. workflows / dataflow / my-workflow-runner correctly do not trigger (matches detectWorkflowKeyword's whole-word rule). Opt-out ui.disableWorkflowKeywordTrigger is present in the settings schema.

4) Same-session resume via JSONL journal (P6) — a workflow with two agent() calls, run twice with the same resumeFromRunId. The only difference between the two runs is the on-disk journal:

                          │  ARM A (empty journal)        │  ARM B (journal intact, same runId)
  subagent model requests │  2  (agent ALPHA + agent BRAVO) │  0  (both served from the journal cache)
  journal.jsonl           │  written (2 results)          │  replayed
  outcome                 │  Workflow finished. (exit 0)   │  Workflow finished. (exit 0)

The journal records each agent result keyed by a rolling prefix-hash:

{"type":"result","key":"v2:be4f98…","agentId":"1","result":"RESULT_ALPHA"}
{"type":"result","key":"v2:c38b4e…","agentId":"2","result":"RESULT_BRAVO"}

On the resume run, both agent() calls matched the journal and were served from cache — zero new subagent calls — exactly the P6 contract.

5) Save-to-disk dialog (P7b-A3) — the multi-key interactive save flow is covered by its component test (workflow-save-overlay.test.tsx, 7 tests, green); consistent with the PR's note that it isn't reliably send-keys-driveable. Not exercised via tmux.

📝 Notes for merge (non-blocking)

  1. resumeFromRunId format is enforced — the tool rejects a non-wf_<hex> id (must match the generated id format). Good guard; just a heads-up that a hand-typed resume id must be valid hex.
  2. Saved-workflow /<name> commands are supportedModes: ['interactive'] by design (their {type:'tool'} dispatch isn't wired for headless/ACP yet) — they don't appear in -p/ACP, which the PR documents as deferred.
  3. A cosmetic React act(...) warning surfaces in workflow-save-overlay.test.tsx (tests pass) — tidy-up, not a blocker.

Verdict (verification side): the four runtime-visible headline features — saved-workflow discovery/run, cross-session history, the keyword trigger + footer, and journal resume — all behave exactly as described against the real CLI, and the 443-test workflow unit surface is green. Looks merge-ready from here; final call is the maintainers'.

🇨🇳 中文版(点击展开)

✅ 验证 —— Dynamic Workflows 移植:保存的工作流、跨会话历史、关键词触发、journal 续跑均实测可用

我在 c343bcbcb 上对该 PR 做了一次独立的 Linux 本地验证(QWEN_CODE_ENABLE_WORKFLOWS=1)。对审阅计划 5 项中的 4 项,我用 tmux 驱动真实 dist/cli.js,抓取磁盘/链路证据,并跑了 PR 的工作流单测面。全部通过。

方法

部分 细节
构建 head c343bcbcbnpm install + npm run bundle → 真实 dist/cli.js
驱动 交互项用 tmux 下真实 TUI + 续跑用无头 node dist/cli.js -p … --approval-mode yolo;隔离 HOME,mock OpenAI 负责启动/子代理;Linux x64 / Node 22
观测 /workflows 列表、磁盘上的 snapshot + journal 文件、footer 指示器、抓取的 /v1/chat/completions 请求体(用于 steering reminder 与子代理请求计数)

单测面 —— 443 个工作流测试通过(0 失败)

Core 362(workflow-orchestrator 113、workflow-sandbox 109 含 30 秒 vm 超时安全测试、workflow-saved 33、workflow-run-registry 32、workflow-stall 19、workflow-journal 14、workflow-snapshot 8、workflow 工具 34)+ CLI 81(workflow-keywordsaved-workflow-loaderworkflowsCommandworkflow-save-overlaycommandMetadata)。

运行时验证(真实 CLI)

1)保存的工作流发现 + 运行(P7b-A1) —— .qwen/workflows/demo.js

> /demo                  ← 自动补全:demo [json-args]  Run the "demo" saved workflow (project)
result: "done"           ← phase "Plan" 执行,log "hello from the demo workflow" 被捕获

并把 snapshot 持久化到 ~/.qwen/projects/<hash>/workflows/wf_febb98a68a241591.json

2)跨会话历史(P7b-A2)—— 经受完整进程重启

会话 1:  /workflows → Workflow runs (1 total · 0 running) · wf_febb98… completed · demo · Plan · 1 phase
<杀掉 CLI 进程,重新启动一个全新进程>
会话 2:  /workflows → Workflow runs (1 total · 0 running) · wf_febb98… completed · demo · 1 phase

全新进程的内存 registry 为空,因此该列表完全来自磁盘上的 snapshot。✅

3)workflow 关键词触发 + footer(P7-trigger) —— 在同一全新会话中正反例都验证:

turn 1 "list the workflows and the dataflow in my-workflow-runner"  → 无 footer、无 steering reminder   ← 反例
turn 2 "can you build a workflow for this"                          → footer "⚙ workflow active" +
                                                                       注入 <system-reminder>            ← 正例

注入的 reminder 是软提示(取自请求原文):"…If this request benefits from orchestrating multiple steps or subagents, strongly prefer the Workflow tool… If a workflow is not a good fit for this request, proceed normally." —— 从不强制工具调用。workflows / dataflow / my-workflow-runner 正确地触发(符合 detectWorkflowKeyword 的整词规则)。退出开关 ui.disableWorkflowKeywordTrigger 在设置 schema 中存在。

4)同会话 journal 续跑(P6) —— 一个带两个 agent() 调用的工作流,用相同resumeFromRunId 跑两次。两次之间唯一的差别是磁盘上的 journal:

                          │  ARM A(空 journal)            │  ARM B(journal 完整,同一 runId)
  子代理模型请求           │  2(agent ALPHA + agent BRAVO) │  0(两个都从 journal 缓存返回)
  journal.jsonl           │  已写入(2 条 result)         │  被回放
  结果                     │  Workflow finished.(exit 0)   │  Workflow finished.(exit 0)

journal 用滚动前缀哈希为每个 agent 结果建键:

{"type":"result","key":"v2:be4f98…","agentId":"1","result":"RESULT_ALPHA"}
{"type":"result","key":"v2:c38b4e…","agentId":"2","result":"RESULT_BRAVO"}

续跑那次,两个 agent() 调用都命中 journal 从缓存返回 —— 次新的子代理调用 —— 正是 P6 的约定。

5)保存到磁盘对话框(P7b-A3) —— 多键交互的保存流程由其组件测试(workflow-save-overlay.test.tsx,7 个,绿)覆盖;与 PR 自述「不易用 send-keys 驱动」一致。未经 tmux 实测。

📝 合并参考(非阻塞)

  1. resumeFromRunId 的格式有强校验 —— 工具会拒绝非 wf_<hex> 的 id(must match the generated id format)。是个好守卫;仅提醒:手填的 resume id 必须是合法 hex。
  2. 保存的工作流 /<name> 命令按设计为 supportedModes: ['interactive'](其 {type:'tool'} dispatch 尚未接到无头/ACP),因此不出现在 -p/ACP —— PR 已说明为后续工作。
  3. workflow-save-overlay.test.tsx 触发了一个表面的 React act(...) 警告(测试通过)—— 顺手清理即可,不阻塞。

结论(验证视角): 四个运行时可见的核心特性 —— 保存的工作流发现/运行、跨会话历史、关键词触发 + footer、journal 续跑 —— 在真实 CLI 上的行为与描述完全一致,且 443 个工作流单测全绿。从这里看具备合并条件;最终决定权在维护者。

@qqqys qqqys left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-reviewed the prior path-traversal concern. The latest head validates resumeFromRunId before it reaches workflow journal/snapshot paths, and the related workflow boundary tests pass locally.

@pomelo-nwu pomelo-nwu left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Killer Feature!

@LaZzyMan
LaZzyMan merged commit f9f8f6c into main Jun 22, 2026
51 checks passed
LaZzyMan added a commit that referenced this pull request Jun 23, 2026
pruneSnapshots derived runId from a snapshot filename and passed it straight to fs.rm(..., { recursive: true, force: true }). The listing is a plain *.json glob, so a file named ...json yields runId '..' and the rm deletes the runs dir's PARENT (the project root, .git and all); notarun.json deletes a sibling dir. A malicious repo could commit such a file under workflows/; once a victim runs more than the retention cap, the prune wipes their project.

Gate the recursive delete on the generated wf_<hex> run-id shape (the same pattern workflow.ts already uses to validate resumeFromRunId). The .json unlink stays unconditional — it removes exactly that one file, never a directory. Carries a RED-before-fix test that plants ...json / notarun.json as the oldest snapshots and asserts the parent canary and a sibling dir survive.

Follow-up to PR #5600 (merged); addresses review thread r3451484367.
wenshao pushed a commit that referenced this pull request Jun 23, 2026
…5740)

pruneSnapshots derived runId from a snapshot filename and passed it straight to fs.rm(..., { recursive: true, force: true }). The listing is a plain *.json glob, so a file named ...json yields runId '..' and the rm deletes the runs dir's PARENT (the project root, .git and all); notarun.json deletes a sibling dir. A malicious repo could commit such a file under workflows/; once a victim runs more than the retention cap, the prune wipes their project.

Gate the recursive delete on the generated wf_<hex> run-id shape (the same pattern workflow.ts already uses to validate resumeFromRunId). The .json unlink stays unconditional — it removes exactly that one file, never a directory. Carries a RED-before-fix test that plants ...json / notarun.json as the oldest snapshots and asserts the parent canary and a sibling dir survive.

Follow-up to PR #5600 (merged); addresses review thread r3451484367.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants