Skip to content

promote: dev -> main (background-shell disk capture + completion notifications)#141

Merged
mabry1985 merged 8 commits into
mainfrom
dev
Apr 26, 2026
Merged

promote: dev -> main (background-shell disk capture + completion notifications)#141
mabry1985 merged 8 commits into
mainfrom
dev

Conversation

@mabry1985

@mabry1985 mabry1985 commented Apr 26, 2026

Copy link
Copy Markdown

Summary

Fixes the eval-loss bug: background shell tasks now write stdout/stderr to per-task disk files; the model is told the path on tool return and gets a <task_notification> on the next turn when the task completes. Adds /bg and bg_stop.

Merge strategy

Use merge commit per branch-strategy.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Background task execution with persistent per-task output files, Task IDs, output path, PID, and a bg_stop control to terminate tasks.
    • Added a /bg command to list recent tasks (status, duration, command, output path, PID).
  • Behavior

    • Completed tasks emit a <task_notification> prepended to the next user prompt; shell background runs return Task ID and output file info.
  • Tests

    • Fixtures updated for deterministic background-task behavior and messaging.
  • Documentation

    • README and docs updated with background workflow, /bg usage, and bg_stop guidance.

…fications (#140)

Fixes eval-loss bug. Previously, `is_background: true` shell commands
detached via `&` and the OS sent their stdout/stderr to nowhere — protoCLI's
data callback only fires while the wrapper is attached. Long-running
processes like eval suites would print results that nothing ever saw.

Mirrors cc-2.18's task framework, scoped to local shells:

- packages/core/src/backgroundShells/: new module
  * registry.ts — BackgroundShellRegistry: in-memory map of taskId →
    {status, command, outputPath, pid, exitCode, ...}, with
    drainPendingNotifications() for the next-turn injection.
  * diskOutput.ts — path helpers + readBackgroundTaskOutput / Exit / Pid.
    Files live at <projectTempDir>/<sessionId>/tasks/<taskId>.{output,exit,pid}.
  * watcher.ts — polls the .exit sentinel (with PID-liveness fallback),
    marks the task complete/failed in the registry once the bg process
    exits.
  * notifications.ts — builds <task_notification> blocks (task_id,
    output_file, status, exit_code, summary).

- shell.ts: when is_background=true on non-Windows, generate a taskId,
  redirect stdout/stderr at the shell level into the per-task output
  file, capture the bg PID and exit code via sentinel files, register
  the task, and start the watcher. Tool result returns the file path
  + task ID so the model can `Read` it later.

- core/client.ts: drain completed-but-unnotified tasks at the start of
  each user query and prepend <task_notification> blocks to the request,
  matching how plan/subagent/arena reminders are added.

- bg-stop.ts: new bg_stop tool. SIGTERM the process group, escalate to
  SIGKILL after 3s, mark the task killed in the registry. Registered
  as a core tool alongside the existing task-* family.

- bgCommand.ts: new /bg slash command listing running and recent
  background tasks with id, status, age, command, output path, pid.

Tests: shell.test.ts updated for new wrapper format; 55/55 pass. Full
core suite (5,337 tests) and cli suite (3,767 tests) pass.

Deferred (worth follow-up PRs):
- Auto-background of long foreground commands and Ctrl+B keybinding.
  Both need foreground shell execution rearchitected so output tees
  to disk from second 1 and the await can be interrupted mid-flight
  without killing the process.

Co-authored-by: Automaker <automaker@localhost>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
@mabry1985 mabry1985 enabled auto-merge April 26, 2026 21:19
@coderabbitai

coderabbitai Bot commented Apr 26, 2026

Copy link
Copy Markdown

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

Adds a background-shell subsystem: types, on-disk task outputs, an in-memory per-session registry, a file watcher and notifications, config/client integration, a bg-stop tool, shell tool changes to launch/register background tasks, a CLI /bg listing command, CLI scheduler/hooks adjustments, docs updates, and package version bumps.

Changes

Cohort / File(s) Summary
Background Shell Types & Registry
packages/core/src/backgroundShells/types.ts, packages/core/src/backgroundShells/registry.ts
New background-task types and an in-memory per-session registry: register tasks, mark exits, update/query tasks, list running, drain pending notifications, subscribe to changes, and clear state.
Disk I/O for Task Outputs
packages/core/src/backgroundShells/diskOutput.ts
New helpers to compute per-session task dirs/paths, ensure directory exists, and best-effort readers for output/exit/pid sentinels (tail-read with max bytes; null/missing handling).
Background Watcher
packages/core/src/backgroundShells/watcher.ts
Fire-and-forget watcher that polls registry + disk (1s interval) to detect exits via exit sentinel or PID liveness; marks tasks completed/failed, updates registry, logs errors/long runs.
Notifications
packages/core/src/backgroundShells/notifications.ts
New function to build XML <task_notification> blocks summarizing task completion (status-aware summary, optional <exit_code>, escaped content, reference to output file).
Background Shell Barrel Export
packages/core/src/backgroundShells/index.ts
New index re-exporting types, registry, diskOutput, notifications, and watcher.
Config & Client Integration
packages/core/src/config/config.ts, packages/core/src/core/client.ts
Config gains lazy BackgroundShellRegistry getter; client drains pending task notifications and prepends them as system reminders when composing requests.
Shell Tool & Tests
packages/core/src/tools/shell.ts, packages/core/src/tools/shell.test.ts
Shell tool supports disk-capture background runs: generates task ID, redirects stdout/stderr to task output file, writes exit/pid sentinels, registers task, starts watcher; tests updated for deterministic IDs and new wrapper/output expectations.
BgStop Tool & Tool Names
packages/core/src/tools/bg-stop.ts, packages/core/src/tools/tool-names.ts
New declarative BG_STOP tool to terminate background tasks (SIGTERM with EPERM fallback to leader, delayed SIGKILL), registry state updates; added BG_STOP to tool name/display maps.
Core Public Exports
packages/core/src/index.ts
Re-exports bg-stop tool and backgroundShells module from core public surface.
CLI Builtin Command & Loader
packages/cli/src/ui/commands/bgCommand.ts, packages/cli/src/services/BuiltinCommandLoader.ts
New built-in /bg slash command (root action and list subcommand) listing background tasks; loader registers bgCommand.
CLI Hooks & Scheduler
packages/cli/src/ui/hooks/useGeminiStream.ts, packages/cli/src/ui/hooks/useReactToolScheduler.ts
Hook updates to handle force-cancel of stale tool calls, maintain stable refs for tool call state, close leaked spans, and surface UI warnings for blocked submissions; scheduler exposes new ForceCancelStaleToolCallsFn and returns it.
Docs & README
README.md, docs/architecture/divergence-from-upstream.md, docs/reference/tools/*, packages/core/src/core/prompts.ts
Docs and prompts updated to document task IDs, output files, <task_notification> behavior, /bg listing, bg_stop usage, and updated shell background semantics.
Package Version Bumps
package.json, packages/cli/package.json, packages/core/package.json, packages/test-utils/package.json, packages/web-templates/package.json, packages/webui/package.json
Version bumps across root and packages; sandbox image tag updated to new version.

Sequence Diagram(s)

sequenceDiagram
    autonumber
    participant User
    participant Client
    participant ShellTool as Shell Tool
    participant Disk as Disk (task dir/files)
    participant Registry
    participant Watcher
    participant Notification

    User->>Client: Request to run background command
    Client->>ShellTool: Execute shell tool (is_background)
    ShellTool->>Disk: create task dir & redirect stdout/stderr to output file
    ShellTool->>Disk: write exit sentinel and pid sentinel
    ShellTool->>Registry: register(task metadata, pid?)
    ShellTool->>Watcher: startBackgroundShellWatcher(config, taskId)
    ShellTool-->>Client: Return "Background command started" with task id & output path
    Client-->>User: Acknowledge background task started

    par Watcher polling loop
        Watcher->>Registry: read task state (running?)
        Watcher->>Disk: read exit sentinel
        alt exit sentinel present
            Watcher->>Registry: markExit(taskId, completed/failed, exitCode)
            Watcher->>Notification: buildBackgroundTaskNotification(task)
        else no sentinel
            Watcher->>Disk: check pid liveness (best-effort)
            alt pid dead and no sentinel after wait
                Watcher->>Registry: markExit(taskId, failed, null)
                Watcher->>Notification: buildBackgroundTaskNotification(task)
            end
        end
    end

    Client->>Registry: drainPendingNotifications()
    Registry-->>Client: drained notifications (atomically flagged)
    Client->>User: prepend notifications to next request
Loading
sequenceDiagram
    autonumber
    participant User
    participant Client
    participant BgStopTool as Bg Stop Tool
    participant Registry
    participant OS

    User->>Client: Request bg_stop(task_id)
    Client->>BgStopTool: invoke with task_id
    BgStopTool->>Registry: get(task_id)
    alt task missing or not running
        BgStopTool-->>Client: Return "task missing/not running"
    else task running
        alt pid present
            BgStopTool->>OS: send SIGTERM to process group (fallback to leader)
            BgStopTool->>OS: check liveness
            BgStopTool-->>BgStopTool: schedule SIGKILL in 3s if still alive
        else no pid available
            BgStopTool-->>Registry: mark task killed (no signal)
        end
        BgStopTool->>Registry: mark task killed
        BgStopTool-->>Client: Return success message
    end
    Client-->>User: Confirm termination status
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~70 minutes

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 28.57% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Description check ❓ Inconclusive The description provides a clear summary of the changes (disk capture, completion notifications, new commands), references the related commit, and specifies the merge strategy. However, it lacks detailed sections matching the template's structure (TLDR, Screenshots, Testing Matrix, Reviewer Test Plan). Consider expanding the description to follow the template more closely by adding explicit sections for Testing Matrix, Reviewer Test Plan, and Screenshots/Demo to improve clarity for reviewers.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately describes the main objective: promoting a background shell feature from dev to main with disk capture and completion notifications.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch dev

Comment @coderabbitai help to get the list of available commands and usage tips.

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Comment thread packages/core/src/tools/shell.ts Fixed

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 4

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@packages/core/src/backgroundShells/notifications.ts`:
- Around line 44-53: The XML builder currently only escapes the summary but
interpolates task.id, task.outputPath, task.status (and any exitLine content)
raw into tags like <task_id>, <output_file>, <status>, which can break XML;
update the code that constructs the notification string to run task.id,
task.outputPath, task.status (and exitLine if it can contain dynamic text)
through the existing escapeXml helper before interpolation so all dynamic fields
are XML-escaped (preserve the same tag names: <task_id>, <output_file>,
<status>, <summary>, <task_notification>).

In `@packages/core/src/config/config.ts`:
- Around line 1225-1235: The cached BackgroundShellRegistry instance stored on
the Config object can leak tasks across sessions; update startNewSession (the
method that begins a new session) to reset/clear the
Config.backgroundShellRegistry (or set it to undefined/null) so
getBackgroundShellRegistry() will construct a fresh BackgroundShellRegistry for
the new session; ensure you reference the backgroundShellRegistry property and
the getBackgroundShellRegistry() and startNewSession() methods when making this
change and also clear any session-specific disk capture paths associated with
tasks if present.

In `@packages/core/src/tools/bg-stop.ts`:
- Around line 99-104: The current logic in bg-stop.ts marks the task killed when
task.pid is falsy; instead, do not call registry.markExit or change state if no
PID is captured—return a message indicating the PID isn't available yet and that
the stop will be retried once PID is present; when a PID is present use the
local pid variable (not task.pid) for signaling. Specifically, update the branch
that checks task.pid to avoid transitioning to 'killed' (remove or skip
registry.markExit(task.id, 'killed', ...)), return a clear
llmContent/returnDisplay explaining PID not captured yet, and ensure later code
uses the pid variable for sending signals and for any markExit calls.

In `@packages/core/src/tools/shell.ts`:
- Line 316: The redirect target tempFilePath is injected unquoted into the shell
command ("pgrep -g 0 > ${tempFilePath} 2>&1"), which breaks when TMPDIR contains
spaces or metacharacters; update the command construction in
packages/core/src/tools/shell.ts to shell-quote or escape tempFilePath when
building that command (e.g., wrap the redirect target in single quotes or use a
shell-escaping helper) so the spawned shell sees a single safe filename token
for the redirection.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 3a89fb8d-5fc8-457b-995f-2f0e27f67c69

📥 Commits

Reviewing files that changed from the base of the PR and between 64647ff and 82b71f0.

📒 Files selected for processing (15)
  • packages/cli/src/services/BuiltinCommandLoader.ts
  • packages/cli/src/ui/commands/bgCommand.ts
  • packages/core/src/backgroundShells/diskOutput.ts
  • packages/core/src/backgroundShells/index.ts
  • packages/core/src/backgroundShells/notifications.ts
  • packages/core/src/backgroundShells/registry.ts
  • packages/core/src/backgroundShells/types.ts
  • packages/core/src/backgroundShells/watcher.ts
  • packages/core/src/config/config.ts
  • packages/core/src/core/client.ts
  • packages/core/src/index.ts
  • packages/core/src/tools/bg-stop.ts
  • packages/core/src/tools/shell.test.ts
  • packages/core/src/tools/shell.ts
  • packages/core/src/tools/tool-names.ts

Comment on lines +44 to +53
return [
'<task_notification>',
`<task_id>${task.id}</task_id>`,
`<output_file>${task.outputPath}</output_file>`,
`<status>${task.status}</status>${exitLine}`,
`<summary>${escapeXml(summary)}</summary>`,
'</task_notification>',
'',
`Read ${task.outputPath} to see the full output.`,
].join('\n');

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Escape all dynamic XML fields, not just the summary.

Lines 46–48 interpolate task.id, task.outputPath, and task.status directly into XML. If any value contains XML metacharacters, <task_notification> can become malformed.

💡 Suggested fix
 export function buildBackgroundTaskNotification(
   task: BackgroundShellTask,
 ): string {
+  const safeTaskId = escapeXml(task.id);
+  const safeOutputPath = escapeXml(task.outputPath);
+  const safeStatus = escapeXml(task.status);
   const exitLine =
     task.exitCode !== undefined && task.exitCode !== null
       ? `\n<exit_code>${task.exitCode}</exit_code>`
       : '';
@@
   return [
     '<task_notification>',
-    `<task_id>${task.id}</task_id>`,
-    `<output_file>${task.outputPath}</output_file>`,
-    `<status>${task.status}</status>${exitLine}`,
+    `<task_id>${safeTaskId}</task_id>`,
+    `<output_file>${safeOutputPath}</output_file>`,
+    `<status>${safeStatus}</status>${exitLine}`,
     `<summary>${escapeXml(summary)}</summary>`,
     '</task_notification>',
     '',
     `Read ${task.outputPath} to see the full output.`,
   ].join('\n');
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/core/src/backgroundShells/notifications.ts` around lines 44 - 53,
The XML builder currently only escapes the summary but interpolates task.id,
task.outputPath, task.status (and any exitLine content) raw into tags like
<task_id>, <output_file>, <status>, which can break XML; update the code that
constructs the notification string to run task.id, task.outputPath, task.status
(and exitLine if it can contain dynamic text) through the existing escapeXml
helper before interpolation so all dynamic fields are XML-escaped (preserve the
same tag names: <task_id>, <output_file>, <status>, <summary>,
<task_notification>).

Comment on lines +1225 to +1235
/**
* Returns the registry of long-running background shell tasks. Lazy
* — only constructed once a task is registered. Disk capture lives at
* <projectTempDir>/<sessionId>/tasks/<taskId>.output.
*/
getBackgroundShellRegistry(): BackgroundShellRegistry {
if (!this.backgroundShellRegistry) {
this.backgroundShellRegistry = new BackgroundShellRegistry();
}
return this.backgroundShellRegistry;
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Background task state can leak across sessions.

Line 1230 returns a cached registry instance, but startNewSession (Line 1253+) does not clear it. Reusing Config can carry old tasks/notifications into a new session.

💡 Suggested fix
  startNewSession(
    sessionId?: string,
    sessionData?: ResumedSessionData,
  ): string {
    this.sessionId = sessionId ?? randomUUID();
    this.sessionData = sessionData;
+   // Reset session-scoped background task state to prevent cross-session leakage.
+   this.backgroundShellRegistry = undefined;
    setDebugLogSession(this);
    this.debugLogger = createDebugLogger();
    this.chatRecordingService = this.chatRecordingEnabled
      ? new ChatRecordingService(this)
      : undefined;
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/core/src/config/config.ts` around lines 1225 - 1235, The cached
BackgroundShellRegistry instance stored on the Config object can leak tasks
across sessions; update startNewSession (the method that begins a new session)
to reset/clear the Config.backgroundShellRegistry (or set it to undefined/null)
so getBackgroundShellRegistry() will construct a fresh BackgroundShellRegistry
for the new session; ensure you reference the backgroundShellRegistry property
and the getBackgroundShellRegistry() and startNewSession() methods when making
this change and also clear any session-specific disk capture paths associated
with tasks if present.

Comment on lines +99 to +104
if (!task.pid) {
// No PID captured — can't signal. Mark killed so the next-turn
// notification fires anyway.
registry.markExit(task.id, 'killed', null);
const msg = `Background task "${task.id}" had no captured PID; marked killed without signal.`;
return { llmContent: msg, returnDisplay: msg };

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

Don't transition a task to killed before you have a PID to signal.

Line 102 treats “PID not captured yet” as “task successfully killed.” Because shell.ts registers from a best-effort .pid read, an immediate bg_stop can report success, stop the watcher on its next poll, and leave the underlying process running with no further tracking.

Proposed fix
+import { readBackgroundTaskPid } from '../backgroundShells/diskOutput.js';
...
-    if (!task.pid) {
-      // No PID captured — can't signal. Mark killed so the next-turn
-      // notification fires anyway.
-      registry.markExit(task.id, 'killed', null);
-      const msg = `Background task "${task.id}" had no captured PID; marked killed without signal.`;
-      return { llmContent: msg, returnDisplay: msg };
-    }
+    let pid =
+      task.pid ?? (await readBackgroundTaskPid(this.config, task.id)) ?? undefined;
+    if (pid == null) {
+      const msg = `Background task "${task.id}" is still starting; PID is not available yet. Try again shortly.`;
+      return {
+        llmContent: msg,
+        returnDisplay: msg,
+        error: { message: msg },
+      };
+    }
+    registry.update(task.id, { pid });

Then use pid below instead of task.pid.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/core/src/tools/bg-stop.ts` around lines 99 - 104, The current logic
in bg-stop.ts marks the task killed when task.pid is falsy; instead, do not call
registry.markExit or change state if no PID is captured—return a message
indicating the PID isn't available yet and that the stop will be retried once
PID is present; when a PID is present use the local pid variable (not task.pid)
for signaling. Specifically, update the branch that checks task.pid to avoid
transitioning to 'killed' (remove or skip registry.markExit(task.id, 'killed',
...)), return a clear llmContent/returnDisplay explaining PID not captured yet,
and ensure later code uses the pid variable for sending signals and for any
markExit calls.

`__bgpid=$!`,
`echo $__bgpid > "${backgroundPidPath}"`,
// pgrep for legacy "child PIDs" reporting
`pgrep -g 0 > ${tempFilePath} 2>&1`,

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Shell-quote the temp-file redirect path.

Line 316 injects tempFilePath directly into shell source. A valid TMPDIR containing spaces or shell metacharacters will break the wrapper before pgrep writes anything, so child PID capture becomes environment-dependent.

#!/bin/bash
# Verifies that an unquoted redirect target with spaces fails while a quoted one succeeds.
set -euo pipefail

tmpdir="$(mktemp -d)"
target="$tmpdir/dir with space/out.txt"
mkdir -p "$(dirname "$target")"

if bash -lc "echo ok > $target" 2>/dev/null; then
  echo "unexpected success"
  exit 1
fi

bash -lc "echo ok > '$target'"
test -f "$target"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/core/src/tools/shell.ts` at line 316, The redirect target
tempFilePath is injected unquoted into the shell command ("pgrep -g 0 >
${tempFilePath} 2>&1"), which breaks when TMPDIR contains spaces or
metacharacters; update the command construction in
packages/core/src/tools/shell.ts to shell-quote or escape tempFilePath when
building that command (e.g., wrap the redirect target in single quotes or use a
shell-escaping helper) so the spawned shell sees a single safe filename token
for the redirection.

…143)

Updates the surface that tells the model and the user how the new
background-shell pipeline actually behaves:

- Shell tool description (surfaced in the system prompt): explicitly
  states that backgrounded commands return a Task ID + Output file
  path, that the OS keeps writing to that file after the wrapper
  exits, that <task_notification> blocks land on the next turn, and
  that bg_stop is the way to kill a runaway. Adds long evals / batch
  jobs to the recommended is_background:true cases.
- is_background parameter description: rewritten to mention task ID,
  output file, the no-poll contract, and bg_stop.
- Core system prompt's "Background Processes" bullet: rewritten in the
  same shape so the agent knows the contract from turn 1.
- docs/reference/tools/shell.md: separate Background-tasks subsection
  documenting the file path, task notification format, /bg, and the
  Windows fallback caveat.
- docs/reference/tools/bg-stop.md (new): full reference page for the
  bg_stop tool, registered in _meta.ts.
- docs/architecture/divergence-from-upstream.md: adds the
  background-shell capture entry under "Net-new tools" so future
  maintainers can spot it as fork-unique.
- README.md: adds a "Long-running Background Shells" section that
  motivates the feature and points at /bg + bg_stop.
- Snapshots updated for prompts.test.ts and shell.test.ts; all 5,337
  core tests pass.

Co-authored-by: Automaker <automaker@localhost>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Apr 26, 2026

Copy link
Copy Markdown

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 54.39% 54.39% 65.53% 78.72%
Core 71.12% 71.12% 74.43% 80.52%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   54.39 |    78.72 |   65.53 |   54.39 |                   
 src               |   66.52 |    63.38 |   66.66 |   66.52 |                   
  gemini.tsx       |   61.13 |    59.01 |      60 |   61.13 | ...28,536-539,548 
  ...ractiveCli.ts |   58.33 |    58.06 |      50 |   58.33 | ...20,435,439-562 
  ...liCommands.ts |   83.77 |    69.76 |     100 |   83.77 | ...12,247,249,377 
  ...ActiveAuth.ts |   94.11 |    82.35 |     100 |   94.11 | 27-30             
 ...cp-integration |    6.13 |    33.33 |      10 |    6.13 |                   
  acpAgent.ts      |    3.37 |        0 |       0 |    3.37 | ...35-141,144-639 
  authMethods.ts   |   17.85 |      100 |       0 |   17.85 | 11-22,25-29,32-37 
  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 |   64.41 |    59.22 |      75 |   64.41 |                   
  ...ryReplayer.ts |   76.31 |    77.14 |      90 |   76.31 | ...21-222,230-231 
  Session.ts       |   56.94 |    46.71 |      64 |   56.94 | ...1457,1463-1466 
  ...entTracker.ts |   90.85 |    84.84 |      90 |   90.85 | ...35,199,251-260 
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   74.59 |    73.07 |     100 |   74.59 | ...73-189,204-206 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ssion/emitters |   92.48 |    87.12 |      92 |   92.48 |                   
  BaseEmitter.ts   |    82.6 |       75 |      80 |    82.6 | 23-24,50-51       
  ...ageEmitter.ts |     100 |    83.33 |     100 |     100 | 84-86             
  PlanEmitter.ts   |     100 |      100 |     100 |     100 |                   
  ...allEmitter.ts |   91.37 |    86.79 |     100 |   91.37 | ...28-229,318,326 
  index.ts         |       0 |        0 |       0 |       0 | 1-10              
 src/commands      |   70.63 |      100 |   15.38 |   70.63 |                   
  auth.ts          |      44 |      100 |       0 |      44 | ...50,59-63,66-67 
  extensions.tsx   |   96.55 |      100 |      50 |   96.55 | 37                
  hooks.tsx        |   66.66 |      100 |       0 |   66.66 | 20-24             
  mcp.ts           |   94.73 |      100 |      50 |   94.73 | 28                
  setup.ts         |   84.61 |      100 |       0 |   84.61 | 18-19             
 src/commands/auth |   45.07 |    95.65 |   64.28 |   45.07 |                   
  handler.ts       |   28.29 |    93.75 |   16.66 |   28.29 | 55-349            
  ...veSelector.ts |     100 |    96.66 |     100 |     100 | 58                
 ...nds/extensions |   84.53 |    88.95 |   81.81 |   84.53 |                   
  consent.ts       |   71.65 |    89.28 |   42.85 |   71.65 | ...85-141,156-162 
  disable.ts       |     100 |      100 |     100 |     100 |                   
  enable.ts        |     100 |      100 |     100 |     100 |                   
  install.ts       |    75.6 |    66.66 |   66.66 |    75.6 | ...39-142,145-153 
  link.ts          |     100 |      100 |     100 |     100 |                   
  list.ts          |     100 |      100 |     100 |     100 |                   
  new.ts           |     100 |      100 |     100 |     100 |                   
  settings.ts      |   99.15 |      100 |   83.33 |   99.15 | 151               
  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         |   60.24 |    28.57 |     100 |   60.24 | ...81,83-87,89-93 
 ...les/mcp-server |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-60              
 src/commands/mcp  |   91.28 |    82.97 |   88.88 |   91.28 |                   
  add.ts           |     100 |    96.66 |     100 |     100 | 213               
  list.ts          |   91.22 |    80.76 |      80 |   91.22 | ...19-121,146-147 
  reconnect.ts     |   76.72 |    71.42 |   85.71 |   76.72 | 35-48,153-175     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...commands/setup |    23.4 |    81.25 |   21.42 |    23.4 |                   
  handler.ts       |    7.99 |      100 |       0 |    7.99 | 57-578            
  ...lDiscovery.ts |   93.75 |    81.25 |     100 |   93.75 | ...,86-87,103-104 
 src/config        |   91.16 |     80.3 |   84.12 |   91.16 |                   
  auth.ts          |   86.66 |    77.55 |     100 |   86.66 | ...92-193,209-210 
  config.ts        |   86.78 |    81.61 |   72.22 |   86.78 | ...1166,1188-1189 
  keyBindings.ts   |   95.95 |       50 |     100 |   95.95 | 160-163           
  ...idersScope.ts |      92 |       90 |     100 |      92 | 11-12             
  sandboxConfig.ts |   54.16 |    23.07 |   66.66 |   54.16 | ...44,54-68,73-89 
  settings.ts      |   80.69 |    82.05 |   81.81 |   80.69 | ...98-699,775-792 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  ...tedFolders.ts |   96.29 |       94 |     100 |   96.29 | ...88-190,205-206 
  webSearch.ts     |   42.37 |       25 |     100 |   42.37 | ...6,86-93,96-112 
 ...nfig/migration |   94.56 |    78.94 |   83.33 |   94.56 |                   
  index.ts         |   93.93 |    88.88 |     100 |   93.93 | 85-86             
  scheduler.ts     |   96.55 |    77.77 |     100 |   96.55 | 19-20             
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ation/versions |   93.63 |     94.5 |     100 |   93.63 |                   
  ...-v2-shared.ts |     100 |      100 |     100 |     100 |                   
  v1-to-v2.ts      |   81.75 |    90.19 |     100 |   81.75 | ...28-229,231-247 
  v2-to-v3.ts      |     100 |      100 |     100 |     100 |                   
 src/constants     |   93.02 |    94.11 |   66.66 |   93.02 |                   
  ...dardApiKey.ts |     100 |      100 |     100 |     100 |                   
  codingPlan.ts    |   92.74 |    94.11 |   66.66 |   92.74 | ...00-301,309-321 
 src/core          |   51.51 |    33.33 |   33.33 |   51.51 |                   
  auth.ts          |    9.52 |      100 |       0 |    9.52 | 21-48             
  initializer.ts   |   84.37 |    33.33 |     100 |   84.37 | 41,55-58          
  theme.ts         |   38.46 |      100 |       0 |   38.46 | 17-24             
 src/generated     |     100 |      100 |     100 |     100 |                   
  git-commit.ts    |     100 |      100 |     100 |     100 |                   
 src/i18n          |   43.69 |    76.19 |   38.88 |   43.69 |                   
  index.ts         |   26.11 |    76.92 |   26.66 |   26.11 | ...35-236,246-257 
  languages.ts     |   98.27 |       75 |     100 |   98.27 | 88                
 src/i18n/locales  |       0 |        0 |       0 |       0 |                   
  de.js            |       0 |        0 |       0 |       0 | 1-1965            
  en.js            |       0 |        0 |       0 |       0 | 1-2160            
  ja.js            |       0 |        0 |       0 |       0 | 1-1459            
  pt.js            |       0 |        0 |       0 |       0 | 1-1957            
  ru.js            |       0 |        0 |       0 |       0 | 1-1964            
  zh.js            |       0 |        0 |       0 |       0 | 1-1811            
 ...nonInteractive |   68.34 |    71.68 |   68.88 |   68.34 |                   
  session.ts       |    73.1 |    69.52 |   81.81 |    73.1 | ...03-604,612-622 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...74-575,578-579 
 ...active/control |   77.48 |       88 |      80 |   77.48 |                   
  ...rolContext.ts |    7.69 |        0 |       0 |    7.69 | 47-79             
  ...Dispatcher.ts |   91.63 |    91.66 |   88.88 |   91.63 | ...54-372,387,390 
  ...rolService.ts |       8 |        0 |       0 |       8 | 46-179            
 ...ol/controllers |    7.32 |       80 |   13.79 |    7.32 |                   
  ...Controller.ts |   19.32 |      100 |      60 |   19.32 | 81-118,127-210    
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |    3.96 |      100 |   11.11 |    3.96 | ...61-379,389-494 
  ...Controller.ts |   14.06 |      100 |       0 |   14.06 | ...82-117,130-133 
  ...Controller.ts |    5.72 |      100 |       0 |    5.72 | ...72-384,393-418 
 .../control/types |       0 |        0 |       0 |       0 |                   
  serviceAPIs.ts   |       0 |        0 |       0 |       0 | 1                 
 ...Interactive/io |   97.57 |    92.56 |   96.15 |   97.57 |                   
  ...putAdapter.ts |   97.31 |     91.3 |     100 |   97.31 | ...1277,1302-1303 
  ...putAdapter.ts |      96 |    91.66 |   85.71 |      96 | 51-52             
  ...nputReader.ts |     100 |    94.73 |     100 |     100 | 67                
  ...putAdapter.ts |   98.23 |      100 |   89.47 |   98.23 | 70-71,111-112     
 src/patches       |       0 |        0 |       0 |       0 |                   
  is-in-ci.ts      |       0 |        0 |       0 |       0 | 1-17              
 src/services      |   89.28 |     87.2 |   96.87 |   89.28 |                   
  ...mandLoader.ts |     100 |      100 |     100 |     100 |                   
  ...killLoader.ts |     100 |      100 |     100 |     100 |                   
  ...andService.ts |     100 |      100 |     100 |     100 |                   
  ...mandLoader.ts |   86.61 |    82.14 |     100 |   86.61 | ...29-334,339-344 
  ...omptLoader.ts |    75.1 |    80.64 |   83.33 |    75.1 | ...03-204,270-271 
  audioCapture.ts  |   98.33 |    93.75 |     100 |   98.33 | 71                
  ...nd-factory.ts |    91.2 |    93.33 |     100 |    91.2 | 119-126           
  ...ation-tool.ts |     100 |    95.45 |     100 |     100 | 125               
  ...and-parser.ts |   89.74 |    85.71 |     100 |   89.74 | 59-62             
  sttClient.ts     |   93.33 |       75 |     100 |   93.33 | 28-29             
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...ght/generators |   85.95 |    86.42 |   90.47 |   85.95 |                   
  DataProcessor.ts |   85.68 |    86.46 |   92.85 |   85.68 | ...1110,1114-1121 
  ...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/test-utils    |   93.63 |    83.33 |      80 |   93.63 |                   
  ...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            |   68.53 |    67.27 |   48.64 |   68.53 |                   
  App.tsx          |     100 |      100 |     100 |     100 |                   
  AppContainer.tsx |    73.8 |    57.14 |   42.85 |    73.8 | ...1263,1669-1675 
  ...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        |   56.36 |      100 |   29.41 |   56.36 | ...49,51-52,60-61 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  keyMatchers.ts   |   91.83 |    88.46 |     100 |   91.83 | 25-26,54-55       
  ...tic-colors.ts |     100 |      100 |     100 |     100 |                   
  textConstants.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/auth       |   29.54 |    46.34 |   26.08 |   29.54 |                   
  AuthDialog.tsx   |   51.95 |     47.5 |   28.57 |   51.95 | ...53,672,674,676 
  ...nProgress.tsx |       0 |        0 |       0 |       0 | 1-64              
  useAuth.ts       |     2.3 |      100 |       0 |     2.3 | 45-595            
 src/ui/commands   |   51.36 |    79.16 |    41.5 |   51.36 |                   
  aboutCommand.ts  |     100 |      100 |     100 |     100 |                   
  agentsCommand.ts |    64.7 |      100 |       0 |    64.7 | ...30,35-36,39-41 
  ...odeCommand.ts |     100 |      100 |     100 |     100 |                   
  arenaCommand.ts  |   32.65 |    67.64 |    37.5 |   32.65 | ...52-557,636-641 
  authCommand.ts   |     100 |      100 |     100 |     100 |                   
  bgCommand.ts     |   23.18 |      100 |       0 |   23.18 | 14-69             
  btwCommand.ts    |     100 |    90.32 |     100 |     100 | 25,199,213        
  bugCommand.ts    |   76.47 |    66.66 |      50 |   76.47 | 21-22,57-66       
  clearCommand.ts  |   89.65 |    55.55 |      50 |   89.65 | 23-24,49-50,68-69 
  ...essCommand.ts |   63.15 |       50 |      50 |   63.15 | ...47-148,162-165 
  ...extCommand.ts |    4.65 |      100 |       0 |    4.65 | ...8,93-96,99-375 
  copyCommand.ts   |   96.22 |      100 |      50 |   96.22 | 15-16             
  ...ryCommand.tsx |   59.19 |    73.07 |    37.5 |   59.19 | ...15-216,224-232 
  docsCommand.ts   |   95.23 |       80 |      50 |   95.23 | 20-21             
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  exportCommand.ts |   55.97 |    91.66 |   33.33 |   55.97 | ...48-349,356-357 
  ...onsCommand.ts |   44.09 |    85.71 |   27.27 |   44.09 | ...35-236,244-245 
  helpCommand.ts   |     100 |      100 |     100 |     100 |                   
  hooksCommand.ts  |   42.72 |       60 |   33.33 |   42.72 | ...86-116,123-124 
  ideCommand.ts    |   41.91 |    69.23 |   21.42 |   41.91 | ...08-209,212-226 
  index.ts         |       0 |        0 |       0 |       0 | 1-20              
  initCommand.ts   |    81.7 |       70 |      50 |    81.7 | ...67,81-86,88-93 
  ...ghtCommand.ts |   56.62 |    28.57 |   28.57 |   56.62 | ...65-179,184-197 
  ...ageCommand.ts |   89.24 |    82.35 |   76.92 |   89.24 | ...20-323,345-346 
  mcpCommand.ts    |   85.71 |      100 |      50 |   85.71 | 14-15             
  memoryCommand.ts |   44.63 |    84.61 |   23.07 |   44.63 | ...69,574-575,593 
  modelCommand.ts  |   57.31 |       80 |   66.66 |   57.31 | 24-33,51-77       
  notesCommand.ts  |    9.32 |      100 |       0 |    9.32 | 27-30,33-151      
  ...onsCommand.ts |     100 |      100 |     100 |     100 |                   
  quitCommand.ts   |   93.75 |      100 |      50 |   93.75 | 15-16             
  recapCommand.ts  |   47.76 |      100 |       0 |   47.76 | 18-51,70,77,81    
  ...oreCommand.ts |   92.24 |     87.5 |     100 |   92.24 | ...,83-88,129-130 
  resumeCommand.ts |     100 |      100 |     100 |     100 |                   
  rewindCommand.ts |    62.5 |      100 |       0 |    62.5 | 17-22             
  ...ngsCommand.ts |     100 |      100 |     100 |     100 |                   
  setupCommand.ts  |     100 |      100 |     100 |     100 |                   
  ...hubCommand.ts |   80.12 |    63.63 |      60 |   80.12 | ...69-172,175-178 
  skillsCommand.ts |   12.28 |      100 |       0 |   12.28 | ...91-109,112-139 
  statsCommand.ts  |   76.92 |       75 |      50 |   76.92 | ...36,50-51,65-66 
  ...aryCommand.ts |    4.61 |      100 |       0 |    4.61 | 21-24,27-322      
  teamCommand.ts   |   15.55 |      100 |       0 |   15.55 | ...70-271,274-298 
  ...tupCommand.ts |     100 |      100 |     100 |     100 |                   
  themeCommand.ts  |     100 |      100 |     100 |     100 |                   
  toolsCommand.ts  |   95.12 |      100 |      50 |   95.12 | 18-19             
  trustCommand.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  vimCommand.ts    |   42.85 |      100 |       0 |   42.85 | 14-15,18-28       
  voiceCommand.ts  |   35.08 |      100 |       0 |   35.08 | 29-51,55-73       
 src/ui/components |   57.82 |    72.52 |   61.31 |   57.82 |                   
  AboutBox.tsx     |     100 |      100 |     100 |     100 |                   
  AnsiOutput.tsx   |     100 |      100 |     100 |     100 |                   
  ApiKeyInput.tsx  |   18.91 |      100 |       0 |   18.91 | 30-95             
  AppHeader.tsx    |   89.58 |       50 |     100 |   89.58 | 33-38             
  ...odeDialog.tsx |     9.7 |      100 |       0 |     9.7 | 35-47,50-182      
  AsciiArt.ts      |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |   13.95 |      100 |       0 |   13.95 | 18-58             
  ...TextInput.tsx |   63.22 |    70.27 |      50 |   63.22 | ...12,220-222,240 
  Composer.tsx     |   89.89 |    58.33 |      50 |   89.89 | ...-55,73,112,125 
  ...itDisplay.tsx |   55.81 |      100 |      50 |   55.81 | 22-38,42-43       
  ...entPrompt.tsx |     100 |      100 |     100 |     100 |                   
  ...ryDisplay.tsx |   75.89 |    62.06 |     100 |   75.89 | ...,88,93-108,113 
  ...geDisplay.tsx |   90.47 |       75 |     100 |   90.47 | 20-21             
  ...ification.tsx |   28.57 |      100 |       0 |   28.57 | 16-36             
  ...gProfiler.tsx |       0 |        0 |       0 |       0 | 1-36              
  ...ogManager.tsx |    8.42 |      100 |       0 |    8.42 | 53-563            
  ...ngsDialog.tsx |    8.44 |      100 |       0 |    8.44 | 37-195            
  ExitWarning.tsx  |     100 |      100 |     100 |     100 |                   
  ...ustDialog.tsx |     100 |      100 |     100 |     100 |                   
  Footer.tsx       |   75.22 |       35 |     100 |   75.22 | ...74,87-91,93-97 
  ...ngSpinner.tsx |   54.28 |       50 |      50 |   54.28 | 31-48,61          
  Header.tsx       |   94.49 |    78.57 |     100 |   94.49 | 95,97,102-105     
  Help.tsx         |   98.74 |    68.75 |     100 |   98.74 | 74,129            
  ...emDisplay.tsx |   68.86 |    41.02 |     100 |   68.86 | ...26,229,232,235 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |   79.19 |    75.08 |     100 |   79.19 | ...1306-1322,1364 
  ...Shortcuts.tsx |   21.11 |      100 |       0 |   21.11 | ...5,48-50,66-124 
  ...Indicator.tsx |     100 |      100 |     100 |     100 |                   
  ...firmation.tsx |   91.42 |      100 |      50 |   91.42 | 26-31             
  MainContent.tsx  |   18.05 |      100 |       0 |   18.05 | 25-92             
  ...geDisplay.tsx |       0 |        0 |       0 |       0 | 1-41              
  ModelDialog.tsx  |   75.13 |    40.98 |     100 |   75.13 | ...17-433,478-482 
  ...tsDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...fications.tsx |   18.18 |      100 |       0 |   18.18 | 15-58             
  ...onsDialog.tsx |    2.18 |      100 |       0 |    2.18 | 62-133,148-986    
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...icePrompt.tsx |   88.14 |    83.87 |     100 |   88.14 | ...01-105,133-138 
  PrepareLabel.tsx |   91.66 |    76.19 |     100 |   91.66 | 73-75,77-79,110   
  ...geDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ngDisplay.tsx |   21.42 |      100 |       0 |   21.42 | 13-39             
  RewindDialog.tsx |       0 |        0 |       0 |       0 | 1-217             
  RewindPicker.tsx |    3.35 |      100 |       0 |    3.35 | 48-70,89-394      
  ...ionPicker.tsx |   94.18 |    92.85 |     100 |   94.18 | 79,194-202        
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...putPrompt.tsx |   72.56 |       80 |      40 |   72.56 | ...06-109,114-117 
  ...ngsDialog.tsx |   66.75 |    72.84 |     100 |   66.75 | ...72-780,786-787 
  ...ionDialog.tsx |    87.8 |      100 |   33.33 |    87.8 | 36-39,44-51       
  ...putPrompt.tsx |    15.9 |      100 |       0 |    15.9 | 20-63             
  ...Indicator.tsx |   44.44 |      100 |       0 |   44.44 | 12-17             
  ...MoreLines.tsx |      28 |      100 |       0 |      28 | 18-40             
  ...ionPicker.tsx |    7.86 |      100 |       0 |    7.86 | 21-131            
  StatsDisplay.tsx |   98.66 |    93.33 |     100 |   98.66 | 199-201           
  StatusBar.tsx    |   96.19 |    72.22 |     100 |   96.19 | 109-111,113       
  ...nsDisplay.tsx |   84.09 |    57.14 |     100 |   84.09 | ...16-118,125-127 
  ...ffDisplay.tsx |   18.42 |      100 |       0 |   18.42 | 16-18,25-58       
  ThemeDialog.tsx  |   90.95 |    44.44 |      75 |   90.95 | ...16-117,159-161 
  Tips.tsx         |      75 |       60 |      75 |      75 | 23,48-49,52-62    
  TodoDisplay.tsx  |     100 |      100 |     100 |     100 |                   
  ...tsDisplay.tsx |     100 |     87.5 |     100 |     100 | 31-32             
  ...oryBanner.tsx |       0 |        0 |       0 |       0 | 1-26              
  TrustDialog.tsx  |     100 |    81.81 |     100 |     100 | 71-86             
  ...ification.tsx |   36.36 |      100 |       0 |   36.36 | 15-22             
  ...MicButton.tsx |   11.11 |      100 |       0 |   11.11 | 26-81             
  ...ackDialog.tsx |    7.84 |      100 |       0 |    7.84 | 24-134            
 ...nts/agent-view |   24.89 |    89.36 |    12.5 |   24.89 |                   
  ...tChatView.tsx |     8.1 |      100 |       0 |     8.1 | 53-283            
  ...tComposer.tsx |    9.95 |      100 |       0 |    9.95 | 57-308            
  AgentFooter.tsx  |   17.07 |      100 |       0 |   17.07 | 28-66             
  AgentHeader.tsx  |   15.38 |      100 |       0 |   15.38 | 27-64             
  AgentTabBar.tsx  |    8.25 |      100 |       0 |    8.25 | 35-55,60-167      
  ...oryAdapter.ts |     100 |     91.3 |     100 |     100 | 102,108-109,137   
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
 ...mponents/arena |    5.89 |      100 |       0 |    5.89 |                   
  ArenaCards.tsx   |       4 |      100 |       0 |       4 | 24-129,134-290    
  ...ectDialog.tsx |    5.28 |      100 |       0 |    5.28 | 32-260            
  ...artDialog.tsx |   10.34 |      100 |       0 |   10.34 | 26-147            
  ...tusDialog.tsx |    5.63 |      100 |       0 |    5.63 | 33-75,80-288      
  ...topDialog.tsx |    6.17 |      100 |       0 |    6.17 | 33-213            
 ...nts/extensions |   45.28 |    33.33 |      60 |   45.28 |                   
  ...gerDialog.tsx |   44.31 |    34.14 |      75 |   44.31 | ...71-480,483-488 
  index.ts         |       0 |        0 |       0 |       0 | 1-9               
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...tensions/steps |   54.77 |    94.23 |   66.66 |   54.77 |                   
  ...ctionStep.tsx |   95.12 |    92.85 |   85.71 |   95.12 | 84-86,89          
  ...etailStep.tsx |    6.18 |      100 |       0 |    6.18 | 17-128            
  ...nListStep.tsx |   88.35 |    94.73 |      80 |   88.35 | 51-52,58-71,105   
  ...electStep.tsx |   13.46 |      100 |       0 |   13.46 | 20-70             
  ...nfirmStep.tsx |   19.56 |      100 |       0 |   19.56 | 23-65             
  index.ts         |     100 |      100 |     100 |     100 |                   
 ...mponents/hooks |   77.96 |    69.91 |      85 |   77.96 |                   
  ...etailStep.tsx |   96.52 |       75 |     100 |   96.52 | 33,37,50,59       
  ...etailStep.tsx |   98.13 |    82.35 |     100 |   98.13 | 41-42             
  ...abledStep.tsx |     100 |      100 |     100 |     100 |                   
  ...sListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |    46.6 |    51.85 |   66.66 |    46.6 | ...04,408-421,425 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-13              
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...components/mcp |   18.82 |    84.37 |   77.77 |   18.82 |                   
  ...entDialog.tsx |    3.64 |      100 |       0 |    3.64 | 41-717            
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-30              
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |   96.42 |    87.09 |     100 |   96.42 | 21,96-97          
 ...ents/mcp/steps |    7.31 |      100 |       0 |    7.31 |                   
  ...icateStep.tsx |    7.58 |      100 |       0 |    7.58 | 27-197            
  ...electStep.tsx |   10.95 |      100 |       0 |   10.95 | 16-88             
  ...etailStep.tsx |    5.26 |      100 |       0 |    5.26 | 31-247            
  ...rListStep.tsx |    5.88 |      100 |       0 |    5.88 | 20-176            
  ...etailStep.tsx |   10.41 |      100 |       0 |   10.41 | ...1,67-79,82-139 
  ToolListStep.tsx |    7.14 |      100 |       0 |    7.14 | 16-146            
 ...nents/messages |   71.41 |    75.88 |   56.86 |   71.41 |                   
  ...ionDialog.tsx |   65.11 |       73 |   42.85 |   65.11 | ...20,538,556-558 
  BtwMessage.tsx   |   76.31 |       50 |     100 |   76.31 | 34-42             
  ...onMessage.tsx |   91.93 |    82.35 |     100 |   91.93 | 57-59,61,63       
  ...nMessages.tsx |   77.35 |      100 |      70 |   77.35 | ...31-244,248-260 
  DiffRenderer.tsx |   93.19 |    86.17 |     100 |   93.19 | ...09,237-238,304 
  ...ssMessage.tsx |    12.5 |      100 |       0 |    12.5 | 18-59             
  RecapMessage.tsx |   42.85 |      100 |       0 |   42.85 | 19-26             
  ...sMessages.tsx |   16.17 |      100 |       0 |   16.17 | ...1,85-95,99-104 
  ...ryMessage.tsx |   12.82 |      100 |       0 |   12.82 | 22-59             
  ...onMessage.tsx |   73.07 |    55.81 |   33.33 |   73.07 | ...34-436,443-445 
  ...upMessage.tsx |   95.09 |     87.5 |     100 |   95.09 | 40-43,55          
  ToolMessage.tsx  |   70.84 |    71.95 |   81.81 |   70.84 | ...94-499,573-575 
 ...ponents/shared |   77.03 |    76.86 |   90.56 |   77.03 |                   
  ...ctionList.tsx |   99.03 |    95.65 |     100 |   99.03 | 85                
  ...tonSelect.tsx |   97.14 |    66.66 |     100 |   97.14 | 72                
  EnumSelector.tsx |     100 |    96.42 |     100 |     100 | 58                
  MaxSizedBox.tsx  |   81.13 |    81.96 |   88.88 |   81.13 | ...12-513,618-619 
  MultiSelect.tsx  |    5.59 |      100 |       0 |    5.59 | 34-41,44-193      
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...eSelector.tsx |     100 |       60 |     100 |     100 | 40-45             
  TextInput.tsx    |    7.14 |      100 |       0 |    7.14 | 39-222            
  text-buffer.ts   |   82.07 |    75.59 |   96.87 |   82.07 | ...1897,1924,1986 
  ...er-actions.ts |   86.71 |    67.79 |     100 |   86.71 | ...07-608,809-811 
 ...ents/subagents |    32.1 |      100 |       0 |    32.1 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  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 |    8.43 |      100 |       0 |    8.43 |                   
  ...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 |    2.29 |      100 |       0 |    2.29 | 28-449            
  ...iewerStep.tsx |   15.21 |      100 |       0 |   15.21 | 18-66             
  ...gerDialog.tsx |    6.74 |      100 |       0 |    6.74 | 35-341            
 ...agents/runtime |    7.83 |      100 |       0 |    7.83 |                   
  ...onDisplay.tsx |    7.83 |      100 |       0 |    7.83 | ...72-502,511-549 
 ...mponents/views |   48.59 |    69.23 |      30 |   48.59 |                   
  ContextUsage.tsx |    5.07 |      100 |       0 |    5.07 | ...30-145,148-424 
  ...sionsList.tsx |   87.69 |    73.68 |     100 |   87.69 | 65-72             
  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   |   76.49 |    79.92 |    87.5 |   76.49 |                   
  ...ewContext.tsx |   65.77 |      100 |      75 |   65.77 | ...22-225,231-241 
  AppContext.tsx   |      40 |      100 |       0 |      40 | 17-22             
  ...igContext.tsx |   81.81 |       50 |     100 |   81.81 | 15-16             
  ...ssContext.tsx |   83.83 |       83 |     100 |   83.83 | ...1049,1054-1056 
  ...owContext.tsx |   89.28 |       80 |   66.66 |   89.28 | 34,47-48,60-62    
  ...onContext.tsx |   47.02 |     62.5 |   71.42 |   47.02 | ...36-239,243-246 
  ...gsContext.tsx |   83.33 |       50 |     100 |   83.33 | 17-18             
  ...usContext.tsx |     100 |      100 |     100 |     100 |                   
  ...ngContext.tsx |   71.42 |       50 |     100 |   71.42 | 17-20             
  ...nsContext.tsx |   89.47 |       50 |     100 |   89.47 | 117-118           
  ...teContext.tsx |   85.71 |       50 |     100 |   85.71 | 160-161           
  ...deContext.tsx |   76.08 |    72.72 |     100 |   76.08 | 47-48,52-59,77-78 
 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      |   74.63 |    78.64 |   79.09 |   74.63 |                   
  ...dProcessor.ts |   83.02 |     81.9 |     100 |   83.02 | ...86-387,406-433 
  keyToAnsi.ts     |    3.92 |      100 |       0 |    3.92 | 19-77             
  ...dProcessor.ts |   94.77 |    70.58 |     100 |   94.77 | ...75-276,281-282 
  ...dProcessor.ts |   76.08 |    58.33 |   66.66 |   76.08 | ...88,712,731-735 
  ...amingState.ts |   12.22 |      100 |       0 |   12.22 | 54-158            
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...odeCommand.ts |   58.82 |      100 |     100 |   58.82 | 28,33-48          
  ...enaCommand.ts |      85 |      100 |     100 |      85 | 23-24,29          
  ...aInProcess.ts |   19.81 |    66.66 |      25 |   19.81 | 57-175            
  ...Completion.ts |   92.77 |    89.09 |     100 |   92.77 | ...86-187,220-223 
  ...ifications.ts |   88.05 |    94.73 |     100 |   88.05 | 84-93             
  ...tIndicator.ts |     100 |    93.75 |     100 |     100 | 63                
  ...ntProgress.ts |   38.37 |      100 |   16.66 |   38.37 | ...9,82-88,91-106 
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-38             
  ...lanUpdates.ts |     100 |       92 |     100 |     100 | 59,158            
  ...ompletion.tsx |   94.87 |    80.55 |     100 |   94.87 | ...02-203,205-206 
  ...dMigration.ts |   90.62 |       75 |     100 |   90.62 | 38-40             
  useCompletion.ts |    92.4 |     87.5 |     100 |    92.4 | 68-69,93-94,98-99 
  ...ialogClose.ts |   22.22 |      100 |     100 |   22.22 | 67-109            
  ...orSettings.ts |     100 |      100 |     100 |     100 |                   
  ...itHandling.ts |   45.16 |      100 |     100 |   45.16 | 46-98             
  ...ionUpdates.ts |   93.45 |     92.3 |     100 |   93.45 | ...83-287,300-306 
  ...agerDialog.ts |   88.88 |      100 |     100 |   88.88 | 21,25             
  ...backDialog.ts |   50.75 |    77.77 |   33.33 |   50.75 | ...56-171,192-193 
  useFocus.ts      |     100 |      100 |     100 |     100 |                   
  ...olderTrust.ts |     100 |      100 |     100 |     100 |                   
  ...ggestions.tsx |   89.15 |     64.7 |     100 |   89.15 | ...19-121,146-147 
  ...miniStream.ts |   69.71 |    67.48 |    87.5 |   69.71 | ...2146,2155-2157 
  ...BranchName.ts |    90.9 |     92.3 |     100 |    90.9 | 19-20,55-58       
  ...itDiffStat.ts |    7.69 |      100 |       0 |    7.69 | 26-79             
  ...oryManager.ts |   98.41 |    93.33 |     100 |   98.41 | 43                
  ...ooksDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...stListener.ts |     100 |      100 |     100 |     100 |                   
  ...ssageDrain.ts |   72.72 |       40 |     100 |   72.72 | 25-26,28-31       
  ...nAuthError.ts |   76.19 |       50 |     100 |   76.19 | 39-40,43-45       
  ...ionEffects.ts |   30.58 |     37.5 |     100 |   30.58 | ...12-119,123-124 
  ...putHistory.ts |   92.59 |    85.71 |     100 |   92.59 | 63-64,72,94-96    
  ...storyStore.ts |     100 |    94.11 |     100 |     100 | 69                
  ...rdHandling.ts |   33.87 |      100 |      50 |   33.87 | 92,101-249        
  useKeypress.ts   |     100 |      100 |     100 |     100 |                   
  ...rdProtocol.ts |   36.36 |      100 |       0 |   36.36 | 24-31             
  ...unchEditor.ts |    8.97 |      100 |       0 |    8.97 | 20-67,74-125      
  ...gIndicator.ts |     100 |      100 |     100 |     100 |                   
  useLogger.ts     |   21.05 |      100 |       0 |   21.05 | 15-37             
  useMcpDialog.ts  |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...oryMonitor.ts |     100 |      100 |     100 |     100 |                   
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...delCommand.ts |     100 |       75 |     100 |     100 | 22                
  ...raseCycler.ts |   84.48 |    76.47 |     100 |   84.48 | ...47,50-51,67-69 
  ...uggestions.ts |   50.73 |       28 |     100 |   50.73 | ...81-183,201-203 
  ...lScheduler.ts |    70.6 |    94.73 |     100 |    70.6 | ...89-292,379-389 
  useRecap.ts      |   49.47 |    66.66 |   33.33 |   49.47 | ...7,84-89,96-125 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  ...umeCommand.ts |   94.54 |    68.75 |     100 |   94.54 | 60-61,79          
  ...ompletion.tsx |   90.59 |    83.33 |     100 |   90.59 | ...01,104,137-140 
  ...ectionList.ts |   96.59 |    94.62 |     100 |   96.59 | ...82-183,237-240 
  ...moryStatus.ts |       0 |        0 |       0 |       0 | 1-29              
  ...sionPicker.ts |   91.66 |    72.34 |     100 |   91.66 | ...45-246,250-251 
  ...ngsCommand.ts |   18.75 |      100 |       0 |   18.75 | 10-25             
  ...ellHistory.ts |   91.74 |    79.41 |     100 |   91.74 | ...74,122-123,133 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-73              
  ...Completion.ts |   80.97 |     84.4 |   91.66 |   80.97 | ...69-471,479-487 
  ...tateAndRef.ts |     100 |      100 |     100 |     100 |                   
  ...eateDialog.ts |   88.23 |      100 |     100 |   88.23 | 14,18             
  ...rminalSize.ts |   76.19 |      100 |      50 |   76.19 | 21-25             
  ...emeCommand.ts |    8.04 |      100 |       0 |    8.04 | 25-112            
  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 |                   
  useVoice.ts      |   93.24 |    77.77 |     100 |   93.24 | 58-62             
  ...elcomeBack.ts |   69.44 |    54.54 |     100 |   69.44 | ...85,89-90,96-98 
  ...indowTitle.ts |     100 |    91.66 |     100 |     100 | 42                
  vim.ts           |   83.54 |     79.5 |     100 |   83.54 | ...44,748-756,765 
 src/ui/layouts    |   79.24 |    38.46 |     100 |   79.24 |                   
  ...AppLayout.tsx |   81.94 |       40 |     100 |   81.94 | 42-44,50-57,75-77 
  ...AppLayout.tsx |   73.52 |    33.33 |     100 |   73.52 | 30-35,37-39       
 src/ui/models     |   56.25 |    85.71 |      40 |   56.25 |                   
  ...ableModels.ts |   56.25 |    85.71 |      40 |   56.25 | ...3,80-81,98-100 
 ...noninteractive |     100 |      100 |    7.69 |     100 |                   
  ...eractiveUi.ts |     100 |      100 |    7.69 |     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     |      99 |    58.66 |     100 |      99 |                   
  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   |     100 |      100 |     100 |     100 |                   
  default-light.ts |     100 |      100 |     100 |     100 |                   
  default.ts       |     100 |      100 |     100 |     100 |                   
  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 |   87.08 |    79.68 |     100 |   87.08 | ...03-312,317-318 
  theme.ts         |     100 |    28.98 |     100 |     100 | 272-461           
  xcode.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/utils      |   70.92 |    85.11 |   81.13 |   70.92 |                   
  ...Colorizer.tsx |   82.78 |    88.23 |     100 |   82.78 | ...10-111,197-223 
  ...nRenderer.tsx |   59.31 |    38.23 |     100 |   59.31 | ...33-139,149-151 
  ...wnDisplay.tsx |   85.75 |    88.05 |     100 |   85.75 | ...76-284,317-342 
  QueryGuard.ts    |   85.71 |      100 |   66.66 |   85.71 | 61-62,65-66       
  ...eRenderer.tsx |   77.88 |    76.19 |     100 |   77.88 | 54-82             
  ...boardUtils.ts |   59.61 |    58.82 |     100 |   59.61 | ...,86-88,107-149 
  commandUtils.ts  |   93.54 |    88.63 |     100 |   93.54 | ...43,147,149-150 
  computeStats.ts  |     100 |      100 |     100 |     100 |                   
  displayUtils.ts  |   60.46 |      100 |      50 |   60.46 | 19-35             
  formatters.ts    |    94.8 |    98.07 |     100 |    94.8 | 101-104           
  highlight.ts     |   98.63 |       95 |     100 |   98.63 | 93                
  isNarrowWidth.ts |     100 |      100 |     100 |     100 |                   
  ...olDetector.ts |    7.22 |      100 |       0 |    7.22 | ...24-125,128-129 
  layoutUtils.ts   |     100 |      100 |     100 |     100 |                   
  ...nUtilities.ts |   69.84 |    85.71 |     100 |   69.84 | 75-91,100-101     
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  ...storyUtils.ts |   60.06 |    65.67 |      90 |   60.06 | ...43,391,396-418 
  ...ickerUtils.ts |     100 |      100 |     100 |     100 |                   
  ...izedOutput.ts |   95.65 |      100 |   88.88 |   95.65 | 134-139           
  ...wOptimizer.ts |     100 |    96.77 |     100 |     100 | 69                
  terminalSetup.ts |    4.37 |      100 |       0 |    4.37 | 44-393            
  textUtils.ts     |   96.52 |    94.44 |    87.5 |   96.52 | 19-20,148-149     
  updateCheck.ts   |     100 |    80.95 |     100 |     100 | 30-42             
 ...i/utils/export |    2.38 |        0 |       0 |    2.38 |                   
  collect.ts       |    0.87 |      100 |       0 |    0.87 | 40-394,401-697    
  index.ts         |     100 |      100 |     100 |     100 |                   
  normalize.ts     |    1.23 |      100 |       0 |    1.23 | 17-336            
  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/utils         |   68.67 |    89.61 |    93.7 |   68.67 |                   
  acpModelUtils.ts |     100 |      100 |     100 |     100 |                   
  ...tification.ts |   92.59 |    71.42 |     100 |   92.59 | 36-37             
  checks.ts        |   33.33 |      100 |       0 |   33.33 | 23-28             
  cleanup.ts       |   65.38 |      100 |   66.66 |   65.38 | 28-37             
  commands.ts      |     100 |      100 |     100 |     100 |                   
  commentJson.ts   |     100 |    93.75 |     100 |     100 | 30                
  deepMerge.ts     |     100 |       90 |     100 |     100 | 41-43,49          
  ...ScopeUtils.ts |   97.56 |    88.88 |     100 |   97.56 | 67                
  ...arResolver.ts |   94.28 |    88.46 |     100 |   94.28 | 28-29,125-126     
  errors.ts        |   98.27 |       95 |     100 |   98.27 | 44-45             
  events.ts        |     100 |      100 |     100 |     100 |                   
  gitUtils.ts      |   91.91 |    84.61 |     100 |   91.91 | 78-81,124-127     
  ...AutoUpdate.ts |    51.2 |       90 |      50 |    51.2 | 87-152            
  ...lationInfo.ts |     100 |      100 |     100 |     100 |                   
  languageUtils.ts |   97.87 |    96.42 |     100 |   97.87 | 132-133           
  math.ts          |       0 |        0 |       0 |       0 | 1-15              
  ...onfigUtils.ts |     100 |      100 |     100 |     100 |                   
  ...iveHelpers.ts |   96.84 |    93.28 |     100 |   96.84 | ...87-488,586,599 
  package.ts       |   88.88 |       80 |     100 |   88.88 | 33-34             
  processUtils.ts  |     100 |      100 |     100 |     100 |                   
  readStdin.ts     |   79.62 |       90 |      80 |   79.62 | 33-40,52-54       
  relaunch.ts      |   98.07 |    76.92 |     100 |   98.07 | 70                
  resolvePath.ts   |   66.66 |       25 |     100 |   66.66 | 12-13,16,18-19    
  sandbox.ts       |       0 |        0 |       0 |       0 | 1-984             
  settingsUtils.ts |   86.32 |    90.59 |   94.44 |   86.32 | ...38,569,632-644 
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  stdioHelpers.ts  |     100 |       60 |     100 |     100 | 23,32             
  systemInfo.ts    |      99 |     90.9 |     100 |      99 | 172               
  ...InfoFields.ts |   86.13 |    65.78 |     100 |   86.13 | ...10-111,132-133 
  ...entEmitter.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                
  windowTitle.ts   |     100 |      100 |     100 |     100 |                   
  ...WithBackup.ts |    62.1 |    77.77 |     100 |    62.1 | 93,107,118-157    
-------------------|---------|----------|---------|---------|-------------------
Core Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   71.12 |    80.52 |   74.43 |   71.12 |                   
 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        |    59.6 |    83.33 |   56.75 |    59.6 |                   
  ...chestrator.ts |   75.83 |     82.6 |     100 |   75.83 | ...49-159,210-217 
  ...ound-store.ts |   97.95 |     90.9 |     100 |   97.95 | 61                
  index.ts         |     100 |      100 |     100 |     100 |                   
  mailbox.ts       |      80 |    78.57 |      80 |      80 | 55-57,74-75,89-97 
  team-config.ts   |    6.48 |      100 |       0 |    6.48 | 43-176            
  team-registry.ts |   45.45 |      100 |       0 |   45.45 | ...34,37-38,41-42 
 src/agents/arena  |   64.56 |    66.66 |   68.49 |   64.56 |                   
  ...gentClient.ts |   79.47 |    88.88 |   81.81 |   79.47 | ...68-183,189-204 
  ArenaManager.ts  |    61.9 |    63.09 |   67.27 |    61.9 | ...1611,1620-1630 
  arena-events.ts  |   64.44 |      100 |      50 |   64.44 | ...71-175,178-183 
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...gents/backends |   76.77 |    85.23 |    72.6 |   76.77 |                   
  ITermBackend.ts  |   97.97 |    93.93 |     100 |   97.97 | ...78-180,255,307 
  ...essBackend.ts |   92.81 |     85.5 |   82.85 |   92.81 | ...15-235,294,390 
  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 |   78.15 |       75 |   74.25 |   78.15 |                   
  agent-core.ts    |   67.19 |    67.63 |   56.52 |   67.19 | ...1317,1344-1390 
  agent-events.ts  |    87.5 |      100 |      75 |    87.5 | 259-263           
  ...t-headless.ts |    80.5 |    71.11 |      55 |    80.5 | ...87-388,391-392 
  ...nteractive.ts |   85.71 |    83.33 |   80.64 |   85.71 | ...18,720,722,725 
  ...statistics.ts |   98.19 |    82.35 |     100 |   98.19 | 127,151,192,225   
  agent-types.ts   |     100 |      100 |     100 |     100 |                   
  compaction.ts    |   88.76 |    66.66 |     100 |   88.76 | ...24-128,135-136 
  index.ts         |     100 |      100 |     100 |     100 |                   
 ...ckgroundShells |   26.48 |       50 |   46.66 |   26.48 |                   
  diskOutput.ts    |   47.25 |       50 |    62.5 |   47.25 | 28-29,54-107      
  index.ts         |     100 |      100 |     100 |     100 |                   
  notifications.ts |    4.76 |      100 |       0 |    4.76 | 12-17,20-54       
  registry.ts      |    2.53 |      100 |       0 |    2.53 | 24-126            
  types.ts         |     100 |      100 |     100 |     100 |                   
  watcher.ts       |   32.35 |       50 |      50 |   32.35 | ...0,63-79,88-109 
 src/config        |    69.3 |    71.52 |   58.25 |    69.3 |                   
  config.ts        |   67.41 |    66.92 |   53.93 |   67.41 | ...2392,2399-2402 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  models.ts        |     100 |      100 |     100 |     100 |                   
  storage.ts       |   79.74 |    92.72 |    75.6 |   79.74 | ...88-292,303-304 
 ...nfirmation-bus |   74.35 |    52.17 |      90 |   74.35 |                   
  message-bus.ts   |   72.22 |       50 |      90 |   72.22 | ...18-120,123-124 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/core          |    78.4 |    80.01 |   89.34 |    78.4 |                   
  agentCore.ts     |   93.75 |       80 |     100 |   93.75 | 115,162,168,171   
  baseLlmClient.ts |     100 |    96.42 |     100 |     100 | 113               
  ...pointStore.ts |     100 |      100 |     100 |     100 |                   
  client.ts        |   73.07 |    72.85 |   91.66 |   73.07 | ...1212,1264-1265 
  ...tGenerator.ts |   80.48 |    55.17 |     100 |   80.48 | ...16,318,325-328 
  ...lScheduler.ts |   69.88 |     77.2 |   89.65 |   69.88 | ...1749,1806-1810 
  geminiChat.ts    |   72.29 |    82.31 |   81.25 |   72.29 | ...56-867,901-904 
  geminiRequest.ts |     100 |      100 |     100 |     100 |                   
  logger.ts        |   82.25 |    81.81 |     100 |   82.25 | ...57-361,407-421 
  ...tyDefaults.ts |     100 |      100 |     100 |     100 |                   
  ...olExecutor.ts |   92.59 |       75 |      50 |   92.59 | 41-42             
  ...on-helpers.ts |   74.74 |    46.15 |     100 |   74.74 | ...86,192,197-206 
  prompts.ts       |   81.71 |    87.05 |   64.28 |   81.71 | ...1263,1273-1300 
  tokenLimits.ts   |     100 |    88.23 |     100 |     100 | 43-44             
  ...okTriggers.ts |   99.31 |     90.9 |     100 |   99.31 | 124,135           
  turn.ts          |   91.13 |    87.03 |     100 |   91.13 | ...85,398-399,447 
 ...ntentGenerator |   87.91 |    69.28 |   91.17 |   87.91 |                   
  ...tGenerator.ts |   87.25 |    64.66 |    87.5 |   87.25 | ...45-652,656-657 
  converter.ts     |   90.35 |    73.97 |     100 |   90.35 | ...99,542-557,580 
  index.ts         |       0 |        0 |       0 |       0 | 1-21              
 ...ntentGenerator |   75.87 |    61.84 |   94.11 |   75.87 |                   
  ...tGenerator.ts |   73.49 |    61.64 |   93.75 |   73.49 | ...57-463,481-482 
  index.ts         |     100 |    66.66 |     100 |     100 | 45                
 ...ntentGenerator |   91.06 |    67.96 |      85 |   91.06 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   91.02 |    67.96 |      85 |   91.02 | ...37,547-548,576 
 ...ntentGenerator |   77.58 |       83 |   91.89 |   77.58 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  converter.ts     |   76.08 |    80.06 |      90 |   76.08 | ...1526,1547-1556 
  errorHandler.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-94              
  ...tGenerator.ts |   48.78 |    91.66 |   77.77 |   48.78 | ...10-163,166-167 
  pipeline.ts      |   84.94 |    80.28 |     100 |   84.94 | ...55-656,658-669 
  ...CallParser.ts |   91.42 |    89.74 |     100 |   91.42 | ...48-352,382-383 
 ...rator/provider |    96.1 |    88.07 |   93.75 |    96.1 |                   
  dashscope.ts     |   96.29 |    87.09 |   93.33 |   96.29 | ...10-211,287-288 
  deepseek.ts      |   90.76 |       75 |     100 |   90.76 | 40-41,45-46,59-60 
  default.ts       |   97.64 |      100 |   85.71 |   97.64 | 85-86             
  index.ts         |     100 |      100 |     100 |     100 |                   
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  openrouter.ts    |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 |                   
 src/extension     |   60.36 |    79.75 |   78.22 |   60.36 |                   
  ...-converter.ts |   63.79 |    47.82 |      90 |   63.79 | ...86-787,796-828 
  ...ionManager.ts |    44.7 |    84.12 |   65.11 |    44.7 | ...1320,1341-1360 
  ...onSettings.ts |   93.46 |    93.05 |     100 |   93.46 | ...17-221,228-232 
  ...-converter.ts |   54.88 |    94.44 |      60 |   54.88 | ...35-146,158-192 
  github.ts        |   44.94 |    88.52 |      60 |   44.94 | ...53-359,398-451 
  index.ts         |     100 |      100 |     100 |     100 |                   
  marketplace.ts   |   97.29 |    93.75 |     100 |   97.29 | ...64,184-185,274 
  npm.ts           |   49.82 |    76.08 |      75 |   49.82 | ...05-407,414-418 
  override.ts      |   94.11 |    88.88 |     100 |   94.11 | 63-64,81-82       
  settings.ts      |   66.26 |      100 |      50 |   66.26 | 81-108,143-149    
  storage.ts       |   94.73 |       90 |     100 |   94.73 | 41-42             
  ...ableSchema.ts |     100 |      100 |     100 |     100 |                   
  variables.ts     |   88.75 |    83.33 |     100 |   88.75 | ...28-231,234-237 
 src/followup      |   44.88 |    92.71 |   68.42 |   44.88 |                   
  followupState.ts |   95.83 |    89.18 |     100 |   95.83 | 153-155,210-211   
  forkedQuery.ts   |      30 |      100 |      50 |      30 | 122-249           
  index.ts         |     100 |      100 |     100 |     100 |                   
  overlayFs.ts     |   95.06 |       84 |     100 |   95.06 | 78,108,122,133    
  speculation.ts   |    13.4 |      100 |   16.66 |    13.4 | 88-458,518-563    
  ...onToolGate.ts |     100 |    96.29 |     100 |     100 | 93                
  ...nGenerator.ts |   38.27 |    95.12 |   33.33 |   38.27 | ...00-302,337-367 
 src/generated     |       0 |        0 |       0 |       0 |                   
  git-commit.ts    |       0 |        0 |       0 |       0 | 1-10              
 src/hooks         |   77.44 |     84.8 |   85.24 |   77.44 |                   
  ...on-checker.ts |     100 |      100 |     100 |     100 |                   
  ...Aggregator.ts |   96.17 |       90 |     100 |   96.17 | ...74,276-277,350 
  ...entHandler.ts |   86.07 |       84 |   80.76 |   86.07 | ...88,641-642,652 
  hookPlanner.ts   |   78.18 |       72 |    90.9 |   78.18 | ...18-236,244-245 
  hookRegistry.ts  |   79.74 |    74.28 |     100 |   79.74 | ...59,361,363,365 
  hookRunner.ts    |   57.83 |    73.33 |   66.66 |   57.83 | ...47-557,610-611 
  hookSystem.ts    |   83.22 |      100 |   86.95 |   83.22 | ...46-362,368-384 
  index.ts         |     100 |      100 |     100 |     100 |                   
  trustedHooks.ts  |     9.3 |      100 |       0 |     9.3 | 24-122            
  types.ts         |   89.61 |    94.66 |   85.18 |   89.61 | ...45-346,406-410 
 src/ide           |   72.67 |    83.92 |   75.92 |   72.67 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  detect-ide.ts    |     100 |      100 |     100 |     100 |                   
  ide-client.ts    |    64.2 |    81.48 |   66.66 |    64.2 | ...9-970,999-1007 
  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           |   33.39 |    43.75 |   44.91 |   33.39 |                   
  ...nfigLoader.ts |   70.27 |    35.89 |   94.73 |   70.27 | ...20-422,426-432 
  ...ionFactory.ts |    4.29 |      100 |       0 |    4.29 | ...20-371,377-394 
  ...Normalizer.ts |   23.09 |    13.72 |   30.43 |   23.09 | ...04-905,909-924 
  ...verManager.ts |   10.47 |       75 |      25 |   10.47 | ...56-675,681-711 
  ...eLspClient.ts |   17.89 |      100 |       0 |   17.89 | ...37-244,254-258 
  ...LspService.ts |   45.87 |    62.13 |   66.66 |   45.87 | ...1282,1299-1309 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/mcp           |   78.74 |    75.68 |   75.92 |   78.74 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...h-provider.ts |   86.95 |      100 |   33.33 |   86.95 | ...,93,97,101-102 
  ...h-provider.ts |   73.74 |    54.45 |     100 |   73.74 | ...64-871,878-880 
  ...en-storage.ts |   98.62 |    97.72 |     100 |   98.62 | 87-88             
  oauth-utils.ts   |   70.58 |    85.29 |    90.9 |   70.58 | ...70-290,315-344 
  ...n-provider.ts |   89.83 |    95.83 |   45.45 |   89.83 | ...43,147,151-152 
 .../token-storage |   79.48 |    86.66 |   86.36 |   79.48 |                   
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   82.75 |    82.35 |   92.85 |   82.75 | ...62-172,180-181 
  ...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        |   15.06 |       75 |     7.4 |   15.06 |                   
  ...tterParser.ts |   13.04 |      100 |       0 |   13.04 | 20-51,57-72       
  index.ts         |     100 |      100 |     100 |     100 |                   
  memoryAge.ts     |   32.07 |      100 |       0 |   32.07 | 36-46,53-68,75-84 
  ...yExtractor.ts |   13.68 |      100 |       0 |   13.68 | 35-189            
  memoryPrompt.ts  |     100 |      100 |     100 |     100 |                   
  memoryScan.ts    |   21.05 |      100 |       0 |   21.05 | 19-24,31-40       
  memoryStore.ts   |    7.75 |       75 |   18.18 |    7.75 | 52-364            
  proposalStore.ts |    7.27 |      100 |       0 |    7.27 | 20-152            
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/mocks         |       0 |        0 |       0 |       0 |                   
  msw.ts           |       0 |        0 |       0 |       0 | 1-9               
 src/models        |   88.44 |    81.65 |    87.3 |   88.44 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nfigErrors.ts |   74.22 |       44 |   84.61 |   74.22 | ...,67-74,106-117 
  ...igResolver.ts |    99.3 |    87.09 |     100 |    99.3 | 127               
  modelRegistry.ts |     100 |    97.72 |     100 |     100 | 164               
  modelsConfig.ts  |   84.51 |    82.17 |   83.33 |   84.51 | ...1069,1098-1099 
  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   |   68.47 |    87.27 |   48.27 |   68.47 |                   
  ...classifier.ts |   30.88 |    57.14 |   33.33 |   30.88 | ...07-230,234-235 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...on-manager.ts |   77.21 |       80 |      84 |   77.21 | ...95-802,822-831 
  rule-parser.ts   |   98.03 |    95.15 |     100 |   98.03 | ...39-840,989-991 
  ...-semantics.ts |   58.28 |    85.27 |    30.2 |   58.28 | ...1604-1614,1643 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/prompts       |   29.09 |      100 |      25 |   29.09 |                   
  mcp-prompts.ts   |   18.18 |      100 |       0 |   18.18 | 11-19             
  ...t-registry.ts |   31.81 |      100 |   28.57 |   31.81 | ...45,51-58,71-76 
 src/recap         |   14.89 |      100 |       0 |   14.89 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...pGenerator.ts |   11.11 |      100 |       0 |   11.11 | 32-75             
 src/services      |   66.13 |    79.79 |   79.46 |   66.13 |                   
  baselineCheck.ts |    3.65 |      100 |       0 |    3.65 | 25-93,100-132     
  ...VerifyGate.ts |   88.81 |    91.42 |     100 |   88.81 | 91-99,139-146     
  ...ionService.ts |   80.63 |    85.31 |   81.81 |   80.63 | ...78-813,828-861 
  ...ingService.ts |   68.39 |    48.38 |   85.71 |   68.39 | ...25-437,453-454 
  cronScheduler.ts |   85.02 |    90.32 |   94.11 |   85.02 | ...24,128-137,202 
  evolveService.ts |      15 |      100 |       0 |      15 | 45-197            
  ...eryService.ts |   80.43 |    95.45 |      75 |   80.43 | ...19-134,140-141 
  ...temService.ts |   89.76 |     85.1 |   88.88 |   89.76 | ...89,191,266-273 
  fileTracker.ts   |   98.21 |     90.9 |     100 |   98.21 | 43                
  gitService.ts    |   85.39 |    83.33 |   77.77 |   85.39 | ...06-107,116-120 
  ...reeService.ts |    67.5 |    65.21 |    87.5 |    67.5 | ...24,830-847,865 
  ...derService.ts |   42.85 |    22.22 |   66.66 |   42.85 | ...03-108,117-118 
  ...ionService.ts |   97.94 |    96.61 |     100 |   97.94 | 104-105,266-267   
  ...solidation.ts |     5.9 |      100 |       0 |     5.9 | 65-339            
  microcompact.ts  |   85.71 |       68 |     100 |   85.71 | ...59,76-77,79-80 
  ...leSelector.ts |   94.03 |       75 |     100 |   94.03 | ...40,243-244,285 
  ...kerService.ts |    5.79 |      100 |       0 |    5.79 | 21-107            
  ...EditVerify.ts |   11.11 |      100 |       0 |   11.11 | 19-76             
  ...MapService.ts |    83.2 |    79.31 |      90 |    83.2 | ...30,343,392-415 
  scopeLock.ts     |   36.17 |    66.66 |   28.57 |   36.17 | ...,87-88,104-116 
  sessionNotes.ts  |   33.89 |      100 |      40 |   33.89 | 89-147            
  ...ionService.ts |   79.23 |    74.74 |   88.88 |   79.23 | ...55-676,684-708 
  ...ionService.ts |   85.06 |    81.59 |      85 |   85.06 | ...1073,1079-1084 
  ...actService.ts |   28.04 |       50 |   33.33 |   28.04 | ...20-121,128-142 
  task-store.ts    |     8.2 |      100 |       0 |     8.2 | 106-586           
 .../sessionMemory |   32.89 |    95.23 |    37.5 |   32.89 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  prompts.ts       |    6.77 |      100 |       0 |    6.77 | ...65-166,179-221 
  sessionMemory.ts |   13.18 |      100 |       0 |   13.18 | 58-176            
  ...emoryUtils.ts |   85.22 |    95.23 |   64.28 |   85.22 | ...68-172,176-177 
 src/skills        |   83.48 |    80.25 |   89.28 |   83.48 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  skill-load.ts    |   90.83 |    77.77 |     100 |   90.83 | ...28,148,160-162 
  skill-manager.ts |    80.9 |    80.83 |    87.5 |    80.9 | ...12-720,727-731 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/subagents     |    80.7 |    82.74 |    92.1 |    80.7 |                   
  ...tin-agents.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nt-manager.ts |    71.6 |    73.88 |      88 |    71.6 | ...-932,1008-1009 
  types.ts         |     100 |      100 |     100 |     100 |                   
  validation.ts    |   92.34 |    96.51 |     100 |   92.34 | 50-55,59-64,68-73 
 src/telemetry     |   66.06 |    84.17 |   71.35 |   66.06 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...-exporters.ts |   46.37 |      100 |   44.44 |   46.37 | ...85,88-89,92-93 
  ...sTelemetry.ts |   24.19 |      100 |   16.66 |   24.19 | ...59-177,186-203 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-111             
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-128             
  loggers.ts       |    49.4 |     61.4 |   52.38 |    49.4 | ...1123,1126-1150 
  metrics.ts       |   75.93 |    86.74 |   76.92 |   75.93 | ...09-846,849-878 
  sanitize.ts      |      80 |    83.33 |     100 |      80 | 35-36,41-42       
  sdk.ts           |   90.05 |    75.75 |     100 |   90.05 | ...31,237-238,244 
  ...etry-utils.ts |     100 |      100 |     100 |     100 |                   
  ...l-decision.ts |     100 |      100 |     100 |     100 |                   
  ...panContext.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |   77.31 |    85.08 |   81.81 |   77.31 | ...1105,1108-1137 
  uiTelemetry.ts   |   91.87 |    96.15 |   78.57 |   91.87 | ...67-168,174-181 
 ...ry/qwen-logger |    68.3 |    81.52 |   64.91 |    68.3 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |    68.3 |    81.31 |   64.28 |    68.3 | ...1040,1078-1079 
 src/test-utils    |   92.85 |    94.28 |   77.41 |   92.85 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  mock-tool.ts     |   91.02 |    93.54 |   75.86 |   91.02 | ...31,195-196,209 
  ...aceContext.ts |     100 |      100 |     100 |     100 |                   
 src/tools         |   71.11 |    77.52 |    73.4 |   71.11 |                   
  agent.ts         |   76.12 |     86.5 |   76.19 |   76.12 | ...1032,1041-1046 
  ...erQuestion.ts |   87.89 |     73.8 |    90.9 |   87.89 | ...44-345,349-350 
  bg-stop.ts       |   31.74 |      100 |      25 |   31.74 | ...79-132,164-167 
  browser-tool.ts  |   55.51 |    44.44 |   94.11 |   55.51 | ...77-978,980-981 
  cron-create.ts   |   97.61 |    88.88 |   83.33 |   97.61 | 30-31             
  cron-delete.ts   |   96.55 |      100 |   83.33 |   96.55 | 26-27             
  cron-list.ts     |   96.36 |      100 |   83.33 |   96.36 | 25-26             
  diffOptions.ts   |     100 |      100 |     100 |     100 |                   
  edit.ts          |   80.03 |    83.83 |      75 |   80.03 | ...49-550,633-683 
  exitPlanMode.ts  |   85.81 |    86.95 |     100 |   85.81 | ...24-129,157-169 
  glob.ts          |   91.57 |    88.33 |   84.61 |   91.57 | ...20,163,293,296 
  grep.ts          |    71.3 |    87.34 |   68.42 |    71.3 | ...90,530,538-545 
  ls.ts            |   96.72 |    90.14 |     100 |   96.72 | 169-174,205,209   
  lsp.ts           |   72.58 |    60.29 |   90.32 |   72.58 | ...1202,1204-1205 
  mailbox-tools.ts |   96.42 |      100 |   83.33 |   96.42 | 39-40,117-118     
  ...nt-manager.ts |   46.44 |       60 |    42.1 |   46.44 | ...89-507,510-547 
  mcp-client.ts    |   29.34 |    70.83 |   45.45 |   29.34 | ...1425,1431-1434 
  mcp-tool.ts      |   90.46 |     87.5 |   96.55 |   90.46 | ...11-612,662-663 
  memoryTool.ts    |   74.68 |     80.7 |   90.47 |   74.68 | ...41-350,463-547 
  ...iable-tool.ts |     100 |    84.61 |     100 |     100 | 102,109           
  read-file.ts     |   94.47 |    88.63 |      80 |   94.47 | ...74,80-83,86-87 
  repoMap.ts       |   59.42 |      100 |   33.33 |   59.42 | ...,47-61,109-112 
  ripGrep.ts       |   96.24 |    90.76 |     100 |   96.24 | ...73,276,354-355 
  ...-transport.ts |    6.34 |      100 |       0 |    6.34 | 47-145            
  shell.ts         |   86.01 |    78.19 |   85.71 |   86.01 | ...59-563,764-765 
  skill.ts         |   94.08 |    88.88 |   84.61 |   94.08 | ...16,255-258,262 
  task-create.ts   |   59.03 |      100 |   33.33 |   59.03 | ...,36-59,105-108 
  task-get.ts      |      50 |      100 |   33.33 |      50 | ...29,32-57,88-91 
  task-list.ts     |   47.82 |      100 |   33.33 |   47.82 | ...,40-72,113-116 
  task-output.ts   |    59.7 |      100 |   33.33 |    59.7 | ...30,33-50,87-90 
  task-ready.ts    |   39.44 |      100 |   33.33 |   39.44 | ...,35-93,132-135 
  task-stop.ts     |      50 |      100 |   33.33 |      50 | ...30,33-61,96-99 
  task-update.ts   |   86.56 |      100 |      75 |   86.56 | 33-38,156-167     
  tool-error.ts    |     100 |      100 |     100 |     100 |                   
  tool-names.ts    |     100 |      100 |     100 |     100 |                   
  tool-registry.ts |   62.56 |    65.38 |   57.57 |   62.56 | ...43-552,559-575 
  tools.ts         |   83.11 |    89.58 |   77.77 |   83.11 | ...35-436,452-458 
  web-fetch.ts     |   85.41 |    58.33 |   91.66 |   85.41 | ...58-259,261-262 
  write-file.ts    |   79.24 |    79.36 |   69.23 |   79.24 | ...46-449,461-496 
 ...ols/web-search |   79.93 |    74.13 |   78.94 |   79.93 |                   
  base-provider.ts |    72.5 |    57.14 |     100 |    72.5 | 44-48,63-66,75-76 
  index.ts         |   82.94 |    80.43 |   85.71 |   82.94 | ...80-188,196-200 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
  utils.ts         |      60 |       50 |      50 |      60 | 35-42             
 ...arch/providers |   77.41 |    68.42 |   88.88 |   77.41 |                   
  ...e-provider.ts |   17.64 |      100 |       0 |   17.64 | 16-33             
  ...e-provider.ts |   83.33 |    55.55 |     100 |   83.33 | 57-58,61-62,76-80 
  ...y-provider.ts |   90.56 |       80 |     100 |   90.56 | 66-70             
 src/utils         |   84.55 |    87.14 |   88.68 |   84.55 |                   
  LruCache.ts      |       0 |        0 |       0 |       0 | 1-41              
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...cFileWrite.ts |   76.08 |    44.44 |     100 |   76.08 | 61-70,72          
  ...essEmitter.ts |   10.86 |      100 |       0 |   10.86 | ...,95-99,114-190 
  browser.ts       |    7.69 |      100 |       0 |    7.69 | 17-56             
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  cronDisplay.ts   |   42.85 |    23.07 |     100 |   42.85 | 26-31,33-45,47-54 
  cronParser.ts    |   89.74 |    85.71 |     100 |   89.74 | ...,63-64,183-186 
  debugLogger.ts   |   96.12 |    93.75 |   93.75 |   96.12 | 164-168           
  editHelper.ts    |   92.67 |    82.14 |     100 |   92.67 | ...52-454,463-464 
  editor.ts        |   96.98 |    93.87 |     100 |   96.98 | ...93-194,196-197 
  ...arResolver.ts |   94.28 |    88.88 |     100 |   94.28 | 28-29,125-126     
  ...entContext.ts |     100 |       95 |     100 |     100 | 83                
  errorParsing.ts  |   96.92 |       95 |     100 |   96.92 | 36-37             
  ...rReporting.ts |   88.46 |       90 |     100 |   88.46 | 69-74             
  errors.ts        |    68.7 |    77.27 |   53.33 |    68.7 | ...86-202,206-212 
  fetch.ts         |   71.97 |    72.22 |   71.42 |   71.97 | ...38,144,157,182 
  fileUtils.ts     |   87.96 |     81.4 |   94.73 |   87.96 | ...85-791,805-811 
  formatters.ts    |   54.54 |       50 |     100 |   54.54 | 12-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        |    12.5 |      100 |       0 |    12.5 | 21-34             
  ...noreParser.ts |    92.3 |    89.36 |     100 |    92.3 | ...15-116,186-187 
  gitUtils.ts      |   36.66 |    76.92 |      50 |   36.66 | ...4,88-89,97-148 
  iconvHelper.ts   |     100 |      100 |     100 |     100 |                   
  ...rePatterns.ts |     100 |      100 |     100 |     100 |                   
  ...ionManager.ts |     100 |       90 |     100 |     100 | 26                
  jsonl-utils.ts   |    8.87 |      100 |       0 |    8.87 | ...51-184,190-196 
  ...-detection.ts |     100 |      100 |     100 |     100 |                   
  ...yDiscovery.ts |   82.01 |    73.21 |     100 |   82.01 | ...74-377,398-399 
  ...tProcessor.ts |   93.63 |    90.12 |     100 |   93.63 | ...96-302,384-385 
  ...Inspectors.ts |   61.53 |      100 |      50 |   61.53 | 18-23             
  ...kerChecker.ts |   84.04 |    78.94 |     100 |   84.04 | 68-69,79-84,92-98 
  openaiLogger.ts  |   86.27 |    82.14 |     100 |   86.27 | ...05-107,130-135 
  partUtils.ts     |     100 |      100 |     100 |     100 |                   
  pathReader.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |   95.69 |    94.52 |     100 |   95.69 | ...,71-72,104-105 
  ...ectSummary.ts |    3.75 |      100 |       0 |    3.75 | 27-119            
  ...tIdContext.ts |     100 |      100 |     100 |     100 |                   
  ...noreParser.ts |    87.5 |    83.87 |     100 |    87.5 | ...72,78-79,85-86 
  ...rDetection.ts |   58.57 |       76 |     100 |   58.57 | ...4,88-89,95-100 
  rateLimit.ts     |      90 |    84.37 |     100 |      90 | 68,79-81          
  readManyFiles.ts |   85.95 |    85.71 |     100 |   85.95 | ...80-182,198-209 
  retry.ts         |   67.91 |    73.68 |     100 |   67.91 | ...82,200,207-208 
  ripgrepUtils.ts  |   46.53 |    83.33 |   66.66 |   46.53 | ...32-233,245-322 
  ...tchOptions.ts |   55.88 |       50 |      75 |   55.88 | ...29-130,151-152 
  safeJsonParse.ts |   74.07 |    83.33 |     100 |   74.07 | 40-46             
  ...nStringify.ts |     100 |      100 |     100 |     100 |                   
  ...aConverter.ts |   90.78 |    87.87 |     100 |   90.78 | ...41-42,93,95-96 
  ...aValidator.ts |     100 |    82.85 |     100 |     100 | 15-39,93-94,125   
  ...r-launcher.ts |   76.52 |     87.5 |   66.66 |   76.52 | ...33,135,153-191 
  shell-utils.ts   |   84.23 |    90.84 |     100 |   84.23 | ...1035,1042-1046 
  ...lAstParser.ts |   92.34 |    86.54 |    92.3 |   92.34 | ...1139-1141,1151 
  ...nlyChecker.ts |   95.75 |    92.39 |     100 |   95.75 | ...00-301,313-314 
  streamStall.ts   |   97.43 |    92.85 |     100 |   97.43 | 75                
  ...tGenerator.ts |     100 |     90.9 |     100 |     100 | 129               
  symlink.ts       |   77.77 |       50 |     100 |   77.77 | 44,54-59          
  ...emEncoding.ts |   96.36 |    91.17 |     100 |   96.36 | 59-60,124-125     
  ...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     |      60 |      100 |   66.66 |      60 | 36-55             
  thoughtUtils.ts  |     100 |    93.33 |     100 |     100 | 72                
  ...-converter.ts |   94.59 |    85.71 |     100 |   94.59 | 35-36             
  tool-utils.ts    |    93.6 |     91.3 |     100 |    93.6 | ...58-159,162-163 
  truncation.ts    |     100 |     90.9 |     100 |     100 | 52,71             
  ...aceContext.ts |   96.22 |       92 |   93.33 |   96.22 | ...15-116,133,160 
  yaml-parser.ts   |      92 |    83.67 |     100 |      92 | 49-53,65-69       
 ...ils/filesearch |   96.17 |     91.4 |     100 |   96.17 |                   
  crawlCache.ts    |     100 |      100 |     100 |     100 |                   
  crawler.ts       |   96.22 |     92.3 |     100 |   96.22 | 66-67             
  fileSearch.ts    |   93.22 |    87.14 |     100 |   93.22 | ...30-231,233-234 
  ignore.ts        |     100 |      100 |     100 |     100 |                   
  result-cache.ts  |     100 |     92.3 |     100 |     100 | 46                
 ...uest-tokenizer |   56.63 |    74.52 |   74.19 |   56.63 |                   
  ...eTokenizer.ts |   41.86 |    76.47 |   69.23 |   41.86 | ...70-443,453-507 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tTokenizer.ts |   68.39 |    69.49 |    90.9 |   68.39 | ...24-325,327-328 
  ...ageFormats.ts |      76 |      100 |   33.33 |      76 | 45-48,55-56       
  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.

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 5

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@docs/reference/tools/bg-stop.md`:
- Around line 23-25: Add a language tag (use "text") to each fenced code block
examples that are currently untagged: the block containing `Background task
"7f9c…" stopped (SIGTERM: <reason if provided>).`, the block containing `No
background task with ID "<task_id>".`, and the multi-line block beginning with
`Background command started.` (including Task ID/Output file/PID lines); update
each opening ``` to ```text so markdownlint MD040 is resolved.

In `@docs/reference/tools/shell.md`:
- Line 37: The docs entry incorrectly lists separate Stdout and Stderr for
foreground runs; update the documentation to match the actual keys emitted by
packages/core/src/tools/shell.ts (it emits Output and Error for foreground
commands). Edit the line in docs/reference/tools/shell.md to replace `Stdout`,
`Stderr` with `Output`, `Error` and ensure the rest of the sentence references
the same set (`Command`, `Directory`, `Output`, `Error`, `Exit Code`, `Signal`,
`Process Group PGID`) so docs match the shell tool's behavior.

In `@packages/core/src/core/prompts.ts`:
- Line 372: The documentation/example text in packages/core/src/core/prompts.ts
still shows shell backgrounding like "node server.js &" which conflicts with the
new rule that background tasks must use is_background: true for ToolNames.SHELL;
update every embedded example in this file (search for occurrences of "&" in
example commands and examples referencing backgrounding) to instead demonstrate
passing is_background: true to ToolNames.SHELL and to use the corresponding flow
with ToolNames.READ_FILE, ToolNames.BG_STOP, and the <task_notification> token;
keep the same explanatory text but replace the ampersand-based examples with
examples that call the shell tool with is_background: true and show reading the
output file and stopping via BG_STOP using the task_id.

In `@packages/core/src/tools/shell.ts`:
- Around line 719-723: The description for the is_background option in the Shell
tool currently promises cross-platform behavior (Task ID, output-file
persistence, <task_notification>, bg_stop) but the Windows implementation only
returns a PID and doesn't register tasks; update the is_background description
in packages/core/src/tools/shell.ts to be platform-specific by either (A)
clarifying that the full Task ID/notification/bg_stop/output-file behavior
applies only on non-Windows platforms and Windows returns only a PID without
notifications, or (B) change wording to state differences explicitly for Windows
vs non-Windows; locate the is_background property in the Shell tool schema and
modify its description text to reflect platform-specific behavior so callers
won’t assume Windows support for task notifications or bg_stop.
- Around line 429-443: The registry currently stores the child's PID (realPid)
but bg_stop needs the process-group leader (the wrapper) PID; update the
registry.register call in the background-start path to set pid to the wrapper's
PID (result.pid) instead of realPid — e.g., use result.pid (or result.pid ??
realPid as a safe fallback) for the pid field when calling
getBackgroundShellRegistry().register, leaving other fields (id, command,
description, cwd, outputPath) unchanged and keeping
startBackgroundShellWatcher(...) as is.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 0b04e36a-28d7-4a53-a0fd-4173e6386c59

📥 Commits

Reviewing files that changed from the base of the PR and between 1592c59 and a4c81b2.

⛔ Files ignored due to path filters (2)
  • packages/core/src/core/__snapshots__/prompts.test.ts.snap is excluded by !**/*.snap
  • packages/core/src/tools/__snapshots__/shell.test.ts.snap is excluded by !**/*.snap
📒 Files selected for processing (7)
  • README.md
  • docs/architecture/divergence-from-upstream.md
  • docs/reference/tools/_meta.ts
  • docs/reference/tools/bg-stop.md
  • docs/reference/tools/shell.md
  • packages/core/src/core/prompts.ts
  • packages/core/src/tools/shell.ts
✅ Files skipped from review due to trivial changes (3)
  • docs/reference/tools/_meta.ts
  • README.md
  • docs/architecture/divergence-from-upstream.md

Comment on lines +23 to +25
```
Background task "7f9c…" stopped (SIGTERM: <reason if provided>).
```

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Add languages to the fenced examples.

markdownlint-cli2 is already flagging these three blocks with MD040, so this page will stay lint-noisy until each fence has a language (text is enough here).

Suggested fix
-```
+```text
 Background task "7f9c…" stopped (SIGTERM: <reason if provided>).

- +text
No background task with ID "<task_id>".


-```
+```text
Background command started.
Task ID: 7f9c…
Output file: /tmp/proto/<project-hash>/<session>/tasks/7f9c…output
PID: 54322
</details>


Also applies to: 29-31, 37-42

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 markdownlint-cli2 (0.22.1)</summary>

[warning] 23-23: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

</details>

</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

Verify each finding against the current code and only fix it if needed.

In @docs/reference/tools/bg-stop.md around lines 23 - 25, Add a language tag
(use "text") to each fenced code block examples that are currently untagged: the
block containing Background task "7f9c…" stopped (SIGTERM: <reason if provided>)., the block containing No background task with ID "<task_id>".,
and the multi-line block beginning with Background command started. (including
Task ID/Output file/PID lines); update each opening totext so
markdownlint MD040 is resolved.


</details>

<!-- fingerprinting:phantom:medusa:grasshopper:a20f7c3f-f901-41ac-9101-2b9115f8b8cd -->

<!-- d98c2f50 -->

<!-- This is an auto-generated comment by CodeRabbit -->

## Output

Returns `Command`, `Directory`, `Stdout`, `Stderr`, `Error`, `Exit Code`, `Signal`, and `Background PIDs`.
For **foreground** commands, the tool returns `Command`, `Directory`, `Stdout`, `Stderr`, `Error`, `Exit Code`, `Signal`, and `Process Group PGID`.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Foreground output keys are documented incorrectly.

The tool does not return separate Stdout and Stderr fields here; packages/core/src/tools/shell.ts still emits Output and Error for foreground runs. Documenting the wrong keys will send users looking for fields that never appear.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/reference/tools/shell.md` at line 37, The docs entry incorrectly lists
separate Stdout and Stderr for foreground runs; update the documentation to
match the actual keys emitted by packages/core/src/tools/shell.ts (it emits
Output and Error for foreground commands). Edit the line in
docs/reference/tools/shell.md to replace `Stdout`, `Stderr` with `Output`,
`Error` and ensure the rest of the sentence references the same set (`Command`,
`Directory`, `Output`, `Error`, `Exit Code`, `Signal`, `Process Group PGID`) so
docs match the shell tool's behavior.

- **Parallelism:** Execute multiple independent tool calls in parallel when feasible (i.e. searching the codebase).
- **Command Execution:** Use the '${ToolNames.SHELL}' tool for running shell commands, remembering the safety rule to explain modifying commands first.
- **Background Processes:** Use background processes (via \`&\`) for commands that are unlikely to stop on their own, e.g. \`node server.js &\`. If unsure, ask the user.
- **Background Processes:** For commands that are unlikely to stop on their own (servers, watchers) or that you'll want to inspect later (long evals, batch jobs), pass \`is_background: true\` to '${ToolNames.SHELL}'. The tool returns a \`Task ID\` and an \`Output file\` path; stdout/stderr is redirected to that file at the shell level so output is never lost. A \`<task_notification>\` arrives on the next turn when the task exits — do not poll. Read the output file with '${ToolNames.READ_FILE}' to inspect progress or final results, and stop a runaway task with '${ToolNames.BG_STOP}' (passing the \`task_id\`).

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Update the embedded examples to match this new rule.

This sentence says backgrounding should be expressed via is_background: true, but the examples later in this file still show commands like node server.js &. Those examples will keep priming the model to emit & unless they are updated too.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/core/src/core/prompts.ts` at line 372, The documentation/example
text in packages/core/src/core/prompts.ts still shows shell backgrounding like
"node server.js &" which conflicts with the new rule that background tasks must
use is_background: true for ToolNames.SHELL; update every embedded example in
this file (search for occurrences of "&" in example commands and examples
referencing backgrounding) to instead demonstrate passing is_background: true to
ToolNames.SHELL and to use the corresponding flow with ToolNames.READ_FILE,
ToolNames.BG_STOP, and the <task_notification> token; keep the same explanatory
text but replace the ampersand-based examples with examples that call the shell
tool with is_background: true and show reading the output file and stopping via
BG_STOP using the task_id.

Comment on lines +429 to +443
if (backgroundTaskId && backgroundOutputPath) {
const realPid = await readBackgroundTaskPid(
this.config,
backgroundTaskId,
);
const registry = this.config.getBackgroundShellRegistry();
registry.register({
id: backgroundTaskId,
command: this.params.command,
description: this.params.description ?? this.params.command,
cwd,
outputPath: backgroundOutputPath,
pid: realPid ?? undefined,
});
startBackgroundShellWatcher(this.config, backgroundTaskId);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

bash -lc '
  wrapper_pid=$$
  wrapper_pgid=$(ps -o pgid= -p "$$" | tr -d " ")
  (sleep 30) &
  bgpid=$!
  bg_pgid=$(ps -o pgid= -p "$bgpid" | tr -d " ")
  echo "wrapper_pid=$wrapper_pid wrapper_pgid=$wrapper_pgid"
  echo "bgpid=$bgpid bg_pgid=$bg_pgid"
  kill "$bgpid"
  wait "$bgpid" 2>/dev/null || true
'

Repository: protoLabsAI/protoCLI

Length of output: 298


🏁 Script executed:

# First, find the relevant files
find packages -name "bg-stop.ts" -o -name "shell.ts" | head -20

Repository: protoLabsAI/protoCLI

Length of output: 132


🏁 Script executed:

# Read bg-stop.ts to verify kill(-pid, ...) usage
cat -n packages/core/src/tools/bg-stop.ts | head -100

Repository: protoLabsAI/protoCLI

Length of output: 3483


🏁 Script executed:

# Read the specific section of shell.ts mentioned in review (lines 295-319 for wrapper, 429-443 for registry)
sed -n '295,443p' packages/core/src/tools/shell.ts | cat -n

Repository: protoLabsAI/protoCLI

Length of output: 6861


🏁 Script executed:

# Find ShellExecutionService definition
rg -t ts "class ShellExecutionService|export.*ShellExecutionService" --max-count=10

Repository: protoLabsAI/protoCLI

Length of output: 153


🏁 Script executed:

# Look for the execute method signature and return type
rg -t ts "execute\(" packages/core/src/tools/shell.ts -A 3 -B 1 | head -40

Repository: protoLabsAI/protoCLI

Length of output: 389


🏁 Script executed:

# Check what the registry interface expects and how it uses the pid
rg -t ts "interface.*BackgroundShellTask|getBackgroundShellRegistry" -A 10 | head -60

Repository: protoLabsAI/protoCLI

Length of output: 4073


🏁 Script executed:

# Look at the complete context around line 33 to see variable names
sed -n '1,100p' packages/core/src/tools/shell.ts | cat -n

Repository: protoLabsAI/protoCLI

Length of output: 3860


🏁 Script executed:

# Get the complete BackgroundShellTask interface
cat -n packages/core/src/backgroundShells/types.ts | head -50

Repository: protoLabsAI/protoCLI

Length of output: 1635


🏁 Script executed:

# Look at ShellExecutionService.execute return type
rg -t ts "execute\s*\(" packages/core/src/services/shellExecutionService.ts -A 30 | head -60

Repository: protoLabsAI/protoCLI

Length of output: 841


🏁 Script executed:

# Find where result.pid is set or defined
rg -t ts "result\.pid|return.*pid" packages/core/src/services/shellExecutionService.ts -B 2 -A 2

Repository: protoLabsAI/protoCLI

Length of output: 839


🏁 Script executed:

# Look at what ShellExecutionService.execute returns in detail
cat -n packages/core/src/services/shellExecutionService.ts | grep -A 200 "interface.*ShellExecutionHandle\|type.*ShellExecutionHandle"

Repository: protoLabsAI/protoCLI

Length of output: 6529


🏁 Script executed:

# Search for ShellExecutionResult type definition
rg -t ts "interface ShellExecutionResult|type ShellExecutionResult" packages/ -A 10

Repository: protoLabsAI/protoCLI

Length of output: 2916


🏁 Script executed:

# Look at the full context around where result is created in shell.ts to see all available variables
sed -n '320,450p' packages/core/src/tools/shell.ts | cat -n

Repository: protoLabsAI/protoCLI

Length of output: 5696


🏁 Script executed:

# Verify there's no pid field in ShellExecutionResult
rg -t ts "interface ShellExecutionResult" -A 15 packages/core/src/services/shellExecutionService.ts

Repository: protoLabsAI/protoCLI

Length of output: 713


🏁 Script executed:

# Check what pid and result variables are available in the context around line 116
sed -n '1,150p' packages/core/src/services/shellExecutionService.ts | grep -A 10 "interface ShellExecutionResult"

Repository: protoLabsAI/protoCLI

Length of output: 495


🏁 Script executed:

# Double-check the ShellExecutionHandle interface
rg -t ts "interface ShellExecutionHandle" -A 5 packages/core/src/services/shellExecutionService.ts

Repository: protoLabsAI/protoCLI

Length of output: 289


🏁 Script executed:

# Check if result.pid is available at the registration point by looking at the full variable scope
sed -n '320,450p' packages/core/src/tools/shell.ts | grep -B 30 "registry.register"

Repository: protoLabsAI/protoCLI

Length of output: 1132


🏁 Script executed:

# Also verify what the BackgroundShellTask comment says about the pid field
cat -n packages/core/src/backgroundShells/types.ts | grep -B 2 -A 2 "PID of the spawned"

Repository: protoLabsAI/protoCLI

Length of output: 364


🏁 Script executed:

# Verify that pid and result.pid are the same by looking at how they're assigned in ShellExecutionService
rg -t ts "return.*pid.*result" packages/core/src/services/shellExecutionService.ts -B 5 -A 2

Repository: protoLabsAI/protoCLI

Length of output: 426


🏁 Script executed:

# Also check if there's any documentation or usage pattern showing pid vs result.pid
rg -t ts "result\.pid|\.pid.*result" packages/core/src/tools/shell.ts -B 3 -A 3

Repository: protoLabsAI/protoCLI

Length of output: 529


🏁 Script executed:

# Check the complete wrapper script to understand process group behavior
sed -n '295,325p' packages/core/src/tools/shell.ts | cat -n

Repository: protoLabsAI/protoCLI

Length of output: 1873


🏁 Script executed:

# Verify that result.pid is the wrapper's PID by checking how it's used in comparisons
rg -t ts "result\.pid" packages/core/src/tools/shell.ts -B 2 -A 2

Repository: protoLabsAI/protoCLI

Length of output: 421


Register the process-group ID, not the child PID, for bg_stop.

bg_stop signals -task.pid via process.kill(), which requires the process group leader's PID. The code currently stores the background child's PID (realPid, from $!), but the wrapper shell's PID (result.pid) is the actual process group leader. When the child runs in the wrapper's process group via { ( command ) & }, signaling the child's PID alone misses the group. Use result.pid (the wrapper PGID) in the registry instead.

Suggested fix
           registry.register({
             id: backgroundTaskId,
             command: this.params.command,
             description: this.params.description ?? this.params.command,
             cwd,
             outputPath: backgroundOutputPath,
-            pid: realPid ?? undefined,
+            pid: result.pid ?? realPid ?? undefined,
           });
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/core/src/tools/shell.ts` around lines 429 - 443, The registry
currently stores the child's PID (realPid) but bg_stop needs the process-group
leader (the wrapper) PID; update the registry.register call in the
background-start path to set pid to the wrapper's PID (result.pid) instead of
realPid — e.g., use result.pid (or result.pid ?? realPid as a safe fallback) for
the pid field when calling getBackgroundShellRegistry().register, leaving other
fields (id, command, description, cwd, outputPath) unchanged and keeping
startBackgroundShellWatcher(...) as is.

Comment on lines 719 to 723
is_background: {
type: 'boolean',
description:
'Optional: Whether to run the command in background. If not specified, defaults to false (foreground execution). Explicitly set to true for long-running processes like development servers, watchers, or daemons that should continue running without blocking further commands.',
'Optional: Whether to run the command in background. Defaults to false. Set to true for long-running processes (servers, watchers, evals, batch jobs). Background tasks return a Task ID and an Output file path; stdout/stderr is redirected to that file by the OS so output survives even after this tool returns. You will receive a <task_notification> on the next turn when the task exits — do not poll. Stop a runaway task with the bg_stop tool.',
},

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Make the background-task description platform-specific.

This text now promises Task ID, output-file persistence, automatic <task_notification>, and bg_stop for every background command, but the Windows path still returns only a PID and never registers the task. That contract mismatch will cause bad follow-up tool calls on Windows unless the description is gated to non-Windows or the Windows implementation is brought up to parity.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/core/src/tools/shell.ts` around lines 719 - 723, The description for
the is_background option in the Shell tool currently promises cross-platform
behavior (Task ID, output-file persistence, <task_notification>, bg_stop) but
the Windows implementation only returns a PID and doesn't register tasks; update
the is_background description in packages/core/src/tools/shell.ts to be
platform-specific by either (A) clarifying that the full Task
ID/notification/bg_stop/output-file behavior applies only on non-Windows
platforms and Windows returns only a PID without notifications, or (B) change
wording to state differences explicitly for Windows vs non-Windows; locate the
is_background property in the Shell tool schema and modify its description text
to reflect platform-specific behavior so callers won’t assume Windows support
for task notifications or bg_stop.

mabry1985 and others added 2 commits April 26, 2026 15:48
… span (#145)

Symptom (also reported on the Langfuse trace, session 442ed5c7,
turn ba924d250d7c with 739s latency and zero LLM activity in the
middle): user presses Esc to cancel, then any subsequent input is
silently dropped — UI stays in the loading indicator forever.

Root cause:
  - cancelOngoingRequest aborts the AbortController and flips
    isResponding=false, but does not clear toolCalls. If a tool
    ignores its AbortSignal, it stays in 'executing' / 'scheduled' /
    etc., or finishes with responseSubmittedToGemini=false. Either
    way, streamingState computes 'Responding' (useGeminiStream.ts:
    424-437) and submitQuery's guard (1305-1314) silently drops the
    next user submission. The in-code comment at line 244-245 even
    flags this class of bug for a different cause.
  - cancelOngoingRequest never calls endTurnSpan, so the OTel turn
    span leaks. The recap + prompt-suggestion LLM calls that fire on
    streamingState=Idle then attach to the dead span — Langfuse
    reports the turn as 12 minutes long when the actual model work
    was 1.7 seconds.

Inheritance: upstream qwen-code has the identical cancelOngoingRequest
shape and the identical silent-return guard. gemini-cli upstream's
PR #21960 (closing #21096) addressed a different cancel-related bug
(retry-loop loading indicator showing stale "still on it" text), not
the stuck-toolCalls case. Issue #18525 there ("Agent Stuck between
Responses") is essentially the same symptom and is still open. So
this is inherited, not introduced — but the leaked turn span is
fork-only, since startTurnSpan/endTurnSpan are part of our agent
harness.

Fix:
- useReactToolScheduler exposes a new forceCancelStaleToolCalls()
  that flips responseSubmittedToGemini=true on terminal calls and
  synthesizes a 'cancelled' state for any non-terminal call (with a
  clear "User cancelled. Tool was force-cleared after the abort
  signal did not stop it within the grace window" message in the
  responseParts so downstream consumers don't choke).
- cancelOngoingRequest in useGeminiStream:
  * marks every current toolCall as submitted immediately (handles
    the common case where the tool finished but the flag wasn't
    flipped),
  * schedules a 3s setTimeout that calls forceCancelStaleToolCalls
    and surfaces a WARNING if anything had to be force-cleared so
    the user knows the underlying process may still be running,
  * calls endTurnSpan('ok') so the recap/suggestion LLM calls don't
    keep nesting under a dead turn span in Langfuse.
- submitQuery no longer silently drops submissions when streamingState
  is non-Idle. It logs a clear WARNING explaining what state we're
  in (Responding / WaitingForConfirmation / Backgrounded) and what
  the user should do (approve the tool, wait, or press Esc).

Tests: 3,767 cli tests + 5,337 core tests pass. Existing cancellation
tests in useGeminiStream.test.tsx (49 tests in that file) continue to
pass with the new flow.

Co-authored-by: Automaker <automaker@localhost>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 3

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/cli/src/ui/hooks/useGeminiStream.ts (1)

1347-1387: ⚠️ Potential issue | 🟠 Major

The new warning is still skipped while a request/backgrounded turn is actually active.

queryGuardRef.current.tryStart() returns null before this streamingState branch runs, so normal user submissions during an in-flight response or backgrounded turn still hit the silent return at Lines 1349-1351. The warning only appears after the guard has already been released, which misses the main UX case this change is trying to address.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/cli/src/ui/hooks/useGeminiStream.ts` around lines 1347 - 1387, The
guard is acquired too early so tryStart() can return null and cause a silent
return before you can surface the warning; in useGeminiStream adjust the logic
so you check streamingState (Responding / WaitingForConfirmation / Backgrounded)
and call addItem(...) to show the warning before attempting
queryGuardRef.current.tryStart(), or if you must keep tryStart first then detect
generation === null and streamingState indicates an active turn and call
addItem(...) (using the same stateLabel logic) instead of returning silently;
reference the generation variable, queryGuardRef.current.tryStart()/end(), the
streamingState enum checks, and the addItem call.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@packages/cli/src/ui/hooks/useGeminiStream.ts`:
- Around line 550-561: The timeout in useGeminiStream.ts currently calls
forceCancelStaleToolCallsRef.current() after 3s which acts on the global
toolCallsRef state at fire time and can mistakenly cancel tools from a new turn;
change the pattern so that at cancellation time you capture the specific IDs (or
prompt/turn ID) of the tool calls to be cleared (e.g., snapshot an array of
cancelled IDs) and pass that snapshot into the delayed callback, then update
forceCancelStaleToolCallsRef.current or provide a new function (e.g.,
forceCancelSpecificToolCalls) that accepts the captured IDs and only cancels
those if still pending when the timer runs, and keep the addItem warning but
reference the number of captured IDs actually cleared rather than scanning
global state at timeout.

In `@packages/cli/src/ui/hooks/useReactToolScheduler.ts`:
- Around line 203-259: forceCancelStaleToolCalls only mutates UI state
(setToolCallsForDisplay) but doesn't tell the CoreToolScheduler to abort/cancel
the underlying tracked call, so the scheduler can later emit a real completion;
update forceCancelStaleToolCalls to also notify the scheduler for each
non-terminal TrackedToolCall (use the callId/invocation from the
TrackedToolCall/request) by invoking the scheduler's cancel/abort API (or the
existing method that marks a tracked call as cancelled) before writing the
synthesized cancelled TrackedCancelledToolCall and setting
responseSubmittedToGemini; ensure lastForceCancelledCountRef and
setToolCallsForDisplay behavior remain the same so the UI and scheduler stay in
sync and duplicate completion submissions are prevented.
- Around line 209-218: The code is incrementing the counter variable changed for
calls that are already terminal but only need responseSubmittedToGemini toggled,
which overreports “force-cleared” tool calls; update the logic in
useReactToolScheduler so you do not increment changed in the branch that handles
already-terminal tc values (the block checking tc.status === 'success' ||
'error' || 'cancelled' where you set responseSubmittedToGemini), and instead
only increment changed in the actual force-cancel code path where a call’s
status is actively set to 'cancelled' (the real force-cancel transition), and
make the same fix for the analogous code at the other site (lines referenced
around the second block) so changed truly reflects only real force-cancels.

---

Outside diff comments:
In `@packages/cli/src/ui/hooks/useGeminiStream.ts`:
- Around line 1347-1387: The guard is acquired too early so tryStart() can
return null and cause a silent return before you can surface the warning; in
useGeminiStream adjust the logic so you check streamingState (Responding /
WaitingForConfirmation / Backgrounded) and call addItem(...) to show the warning
before attempting queryGuardRef.current.tryStart(), or if you must keep tryStart
first then detect generation === null and streamingState indicates an active
turn and call addItem(...) (using the same stateLabel logic) instead of
returning silently; reference the generation variable,
queryGuardRef.current.tryStart()/end(), the streamingState enum checks, and the
addItem call.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: aa347afe-5149-44d3-9747-08153f28c3c8

📥 Commits

Reviewing files that changed from the base of the PR and between d697ddf and da4928f.

📒 Files selected for processing (2)
  • packages/cli/src/ui/hooks/useGeminiStream.ts
  • packages/cli/src/ui/hooks/useReactToolScheduler.ts

Comment on lines +550 to +561
setTimeout(() => {
const cleared = forceCancelStaleToolCallsRef.current();
if (cleared > 0) {
addItem(
{
type: MessageType.WARNING,
text: `Force-cleared ${cleared} stuck tool call(s) after cancel grace window. The underlying process(es) may still be running in the background.`,
},
Date.now(),
);
}
}, 3000);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

Scope the 3s force-clear to the cancelled turn.

This timeout operates on whatever toolCallsRef.current contains when it fires. If the user cancels, immediately starts a new turn, and that new turn launches tools within the next 3 seconds, this callback can force-cancel the new turn's tool calls instead of the stale ones. Capture the cancelled call IDs or prompt ID here and only clear those same calls if they are still pending when the timer runs.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/cli/src/ui/hooks/useGeminiStream.ts` around lines 550 - 561, The
timeout in useGeminiStream.ts currently calls
forceCancelStaleToolCallsRef.current() after 3s which acts on the global
toolCallsRef state at fire time and can mistakenly cancel tools from a new turn;
change the pattern so that at cancellation time you capture the specific IDs (or
prompt/turn ID) of the tool calls to be cleared (e.g., snapshot an array of
cancelled IDs) and pass that snapshot into the delayed callback, then update
forceCancelStaleToolCallsRef.current or provide a new function (e.g.,
forceCancelSpecificToolCalls) that accepts the captured IDs and only cancels
those if still pending when the timer runs, and keep the addItem warning but
reference the number of captured IDs actually cleared rather than scanning
global state at timeout.

Comment thread packages/cli/src/ui/hooks/useReactToolScheduler.ts
Comment on lines +209 to +218
// Already terminal: just guarantee the submitted flag so
// streamingState clears even if handleCompletedTools never ran.
if (
tc.status === 'success' ||
tc.status === 'error' ||
tc.status === 'cancelled'
) {
if (tc.responseSubmittedToGemini) return tc;
changed++;
return { ...tc, responseSubmittedToGemini: true };

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Only count real force-cancels in the returned value.

changed is incremented for already-terminal calls that merely need responseSubmittedToGemini=true. The caller treats the return value as “stuck tool calls force-cleared”, so this can overstate what was actually force-cancelled and produce a misleading warning.

Also applies to: 255-258

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/cli/src/ui/hooks/useReactToolScheduler.ts` around lines 209 - 218,
The code is incrementing the counter variable changed for calls that are already
terminal but only need responseSubmittedToGemini toggled, which overreports
“force-cleared” tool calls; update the logic in useReactToolScheduler so you do
not increment changed in the branch that handles already-terminal tc values (the
block checking tc.status === 'success' || 'error' || 'cancelled' where you set
responseSubmittedToGemini), and instead only increment changed in the actual
force-cancel code path where a call’s status is actively set to 'cancelled' (the
real force-cancel transition), and make the same fix for the analogous code at
the other site (lines referenced around the second block) so changed truly
reflects only real force-cancels.

mabry1985 and others added 2 commits April 26, 2026 16:16
…147)

CodeQL flagged two new alerts on the background-shell wrapper code
landed in #140:
  - js/polynomial-redos at shell.ts:292 ('&+$' on a trimmed string)
  - js/polynomial-redos at shell.ts:305 ('\\s*&\\s*$' on a trimmed string)

Both are low practical risk (the inputs are bounded model-emitted
shell commands) but the alert is blocking the dev → main promotion
in PR #141. Swap each for a plain string-op equivalent — same intent,
no quantifier-on-quantifier shape for the analyzer to flag.

Co-authored-by: Automaker <automaker@localhost>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
@mabry1985 mabry1985 merged commit d262004 into main Apr 26, 2026
12 checks passed
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.

2 participants