Skip to content

Merge/upstream safe commits#24

Merged
TaimoorSiddiquiOfficial merged 60 commits into
mainfrom
merge/upstream-safe-commits
May 13, 2026
Merged

Merge/upstream safe commits#24
TaimoorSiddiquiOfficial merged 60 commits into
mainfrom
merge/upstream-safe-commits

Conversation

@TaimoorSiddiquiOfficial

@TaimoorSiddiquiOfficial TaimoorSiddiquiOfficial commented May 12, 2026

Copy link
Copy Markdown
Owner

Summary This PR cherry-picks upstream improvements from QwenLM/qwen-code into HopCode, applying HopCode rebranding where necessary. It closes the gap between HopCode main and the upstream, covering 36 of 48 new upstream commits. ### Features included - autoSkill memory: background project skill extraction (QwenLM#3673) - Slash command discovery: improved slash command UI (QwenLM#3736) - /diff command: git diff statistics utility (QwenLM#3491) - /branch command: fork conversation to a new branch - ToolSearch: on-demand loading of deferred tool schemas (QwenLM#3589, QwenLM#4022, QwenLM#4069) - JSON schema output: --json-schema flag for structured headless output (QwenLM#3598) - Ctrl+B keybind: promote message keybind (QwenLM#3969) - i18n coverage: core built-in internationalization (QwenLM#3871) - runtime.json sidecar: writes session metadata for active sessions (QwenLM#3714) - HOPCODE_HOME env var: customize config directory (upstream: QWEN_HOME QwenLM#2953) - Standalone archive install: binary archive distribution (QwenLM#3776) - Codegraph skill: PR review risk analysis and conflict detection (QwenLM#3910) - Anthropic proxy + prompt cache: global scope support (QwenLM#4020) - Hierarchical session tracing: OTel span hierarchy (QwenLM#4071) - DASHSCOPE_PROXY_BASE_URL: prompt cache via API gateway (QwenLM#3991) - fdir → git ls-files: replace crawler with git ls-files + ripgrep fallback (QwenLM#3214) - ask_user_question always-visible: surfaces clarification UX (QwenLM#4041) - Session-list perf: head/tail 64KB bound, pooled buffer, lazy message count (QwenLM#3897) - VSCode message edit/rewind: message metadata UI (QwenLM#3762) ### Bug fixes included - preserve comments in settings.json migration write-back (QwenLM#3861) - monitor notifications for subagents (QwenLM#3933) - unfreeze Ctrl+O compact-mode on long conversations (QwenLM#3905) - harden reactive compression follow-ups (QwenLM#3985) - unify Edit/WriteFile prior-read with Claude Code (QwenLM#4002) - repair stale --json-schema integration assertion (QwenLM#4075) - log internal OpenAI JSON requests through debug logger (QwenLM#4081) ### Refactors included - Remove legacy qwen auth CLI subcommand → /auth TUI dialog (QwenLM#3959) - Route side-query LLM calls through runSideQuery chokepoint (QwenLM#3775) - Remove dead useCollector setting and unreachable TelemetryTarget (QwenLM#4061) - runtime.json sidecar follow-ups (QwenLM#4030) ### Telemetry - Inject traceId/spanId into debug log files for OTel correlation (QwenLM#3847) - Add hierarchical session tracing spans (QwenLM#4071)

yiliang114 and others added 30 commits May 11, 2026 14:10
* ci: skip unnecessary release and SDK checks

* ci: guard release skip classification for non-pr events

* ci: harden release sync skip gate

* ci: refine release sync skip fallback
* test: stabilize main e2e flakes

* test: stabilize macos e2e assertions
… buffer; lazy message count (QwenLM#3897)

* perf(core): drop full-file readline + pool tail buffer in listSessions

`listSessions` previously called `countSessionMessages` per file, which
streamed the entire JSONL through `readline` to count unique
user/assistant UUIDs. For a project with N sessions averaging M bytes
each, every /resume open paid O(N · M) wall time before showing the
picker — by far the dominant cost once a project accumulated many
multi-MB sessions.

This change:

- Drops the per-file count from listSessions / findSessionsByTitle.
  `SessionListItem.messageCount` is now optional. Callers that need
  a count call the new public `SessionService.countSessionMessages
  (sessionId)` lazily — typically only when a SessionPreview panel is
  about to display the badge.
- Pools a single 64KB tail-read buffer across the per-file metadata
  reads in listSessions / findSessionsByTitle, mirroring the pattern
  in claude-code's `enrichLogs`. The two helpers in
  `sessionStorageUtils` (`readLastJsonStringFieldSync` and
  `readLastJsonStringFieldsSync`) accept an optional caller-owned
  scratch buffer; one-off callers (rename, single-session lookup) pass
  nothing and keep the original alloc behaviour.
- Updates SessionPicker's row metadata to omit the "N messages"
  segment when `messageCount` isn't available, keeping the visual
  layout intact.

Tests:
- Pin that listSessions does not populate messageCount (regression
  guard against silently re-introducing the per-file scan).
- Smoke test the buffer-pool plumbing — same caller-owned buffer
  handed to two reads of different file sizes returns both correct
  values without state bleed.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>

* perf(core): re-anchor custom_title; drop Phase-2 full-file scan

Tightens the title-write / title-read invariant so the picker's
metadata read is bounded to a fixed 2 × 64KB per file, regardless
of session length, with no fallback that scales with file size.

Writer (`ChatRecordingService`):
  - New `bytesSinceTitleAnchor` counter and `TITLE_REANCHOR_BYTES`
    threshold (32 KB, half of LITE_READ_BUF_SIZE).
  - `appendRecord` now updates the counter and, once it crosses the
    threshold while a title is set, re-appends a fresh `custom_title`
    record to EOF (`reanchorTitle`). The recursive append routes
    back through the same tracking path, which sees the title
    record and resets the counter to zero.
  - Sessions that never set a title pay zero overhead — the early
    return in `updateTitleAnchorTracking` short-circuits.

Reader (`sessionStorageUtils`):
  - `readLastJsonStringFieldSync` / `readLastJsonStringFieldsSync`
    now read the file's last 64 KB, fall back to the first 64 KB
    on miss, and return `undefined` if neither contains the field.
    The previous Phase-2 streaming full-file scan (capped at 64 MB)
    is removed entirely.
  - The pooled scratch buffer (already optional) now backs both the
    tail and head reads — only one allocation per `listSessions`
    page even with the head fallback firing.
  - `MAX_FULL_SCAN_BYTES` constant deleted (unused).

The two changes are coupled: the reader's tighter bound only works
because the writer guarantees the title stays in tail. A title
buried mid-file is now intentionally `undefined` (the picker
falls back to `firstPrompt` for display) rather than triggering a
full-file scan that would freeze the UI on long agent transcripts.

Tests:
  - `chatRecordingService.customTitle.test.ts` — three scenarios
    pinning the re-anchor invariant: threshold trigger, no-spurious
    on no-title sessions, no-trigger on small write bursts.
  - `sessionStorageUtils.test.ts` — replaces Phase-2 tests with
    head-window fallback tests; pins the new "buried beyond both
    windows returns undefined" contract; updates buffer-pool reuse
    test to cover both tail and head reads with the same scratch.

E2E coverage (35/35 scenarios on a separate harness against real
fs): R1–R10 reader contract, M1–M4 multi-field, W1–W7 writer
re-anchor, L1–L6 listing latency + regression pins, S1 stress
(200 × 3 MB), C1 concurrency, I1–I5 writer/reader integration.
Measured 2.6× speedup on listSessions(50) over 50 × 4 MB
sessions vs the legacy `countSessionMessages` baseline; speedup
scales linearly with average file size.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>

* test(core): cover CR review gaps for session-list perf path

- countSessionMessages: valid id counts unique user/assistant uuids and
  ignores other types/malformed lines; invalid id short-circuits without
  filesystem access; ENOENT degrades to 0 instead of bubbling.
- readLastJsonStringFieldsSync: mirror the single-field variant's
  scratch-buffer reuse test across a tail-hit then head-fallback to
  catch any decode that ignores bytesRead.
- ChatRecordingService re-anchor: legacy resumed session (source
  undefined) must omit titleSource on threshold-triggered re-anchor,
  not silently reclassify as 'manual'.

Co-authored-by: Qwen-Coder <noreply@alibabacloud.com>

* fix(core): count title-anchor bytes as utf-8 + reset on reanchor failure

`String.length` undercounts the on-disk size of multi-byte payloads
(CJK, emoji are 1 UTF-16 unit but 3 UTF-8 bytes), so a session full
of CJK content could push >96KB of writes past the last anchor before
the 32KB threshold thinks it has — silently drifting the title past
the 64KB tail window the picker scans. Switch the byte counter to
`Buffer.byteLength(..., 'utf8')` for parity with `jsonl.writeLine`.

Also reset `bytesSinceTitleAnchor` to 0 in the reanchor catch:
without it, a failing reanchor pins the counter at the threshold
and turns a single transient I/O fault into a per-record retry
storm. One missed anchor is the right tradeoff — finalize() will
re-emit on the next lifecycle event.

Co-authored-by: Qwen-Coder <noreply@alibabacloud.com>

* fix(core): trim head-window to whole lines in lite metadata reads

The 64KB head-window fallback in `readLastJsonStringFieldSync` /
`readLastJsonStringFieldsSync` reads a fixed slice and hands it
straight to the extractor — its trailing bytes can fall mid-record.
A partial line whose `customTitle` value happens to close inside
the buffer but whose body extends past 64KB would otherwise win
the latest-match race and surface as the picker's title.

Drop everything past the last `\n` before extracting (only when the
buffer is shorter than the file — a small file is necessarily whole-
line). Honors the original Phase-2 contract that only complete lines
get a vote, without paying for the deleted full-file scan.

Co-authored-by: Qwen-Coder <noreply@alibabacloud.com>

* fix(core,cli): preview lazy count, project-scope countSessionMessages, pin perf contract

Address QwenLM#3897 follow-up review findings:

- SessionPreview footer no longer drops the message count when listSessions
  omits it. The prop is the override path; default falls back to a unique
  user/assistant uuid count derived from the already-loaded conversation,
  matching countSessionMessages semantics with zero extra disk I/O.
- countSessionMessages now scopes to the current project, mirroring the
  first-record cwd check in deleteSession/renameSession/loadSession. A
  valid sessionId from another project sharing the chats dir no longer
  bypasses project boundaries on lazy count.
- New regression tests:
  - SessionPicker row renders cleanly with messageCount === undefined
    (no "messages"/"undefined"/dangling separator)
  - findSessionsByTitle perf contract: matches have messageCount
    undefined and fs.createReadStream is never called
  - countSessionMessages: cross-project sessions return 0 without
    streaming, empty file returns 0
- Update corruption-recovery tests to call private countSessionMessagesFromPath
  (the streaming entry point) instead of the public sessionId-shaped API the
  merge from main pointed them at.

Co-Authored-By: Qwen-Coder <noreply@qwen.com>

* docs(core): correct stale 'full-file fallback' comments to head-window

The session metadata reader uses two bounded 64KB windows (tail + head)
since the perf rework on this branch — never a full-file scan. Two
comments still described the prior behavior. Reported in MR review.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>

* fix(cli): route ACP renameSession through live ChatRecordingService

ACP renameSession constructed a fresh SessionService and wrote the
custom_title record straight to disk. When the same session was live
in this process, ChatRecordingService.currentCustomTitle stayed at
the old value, so the next title re-anchor (every 32KB) or finalize()
re-emitted the stale title at EOF and silently reverted the rename.

Now we look up the live ChatRecordingService first and route through
recordCustomTitle, which keeps the in-memory cache and the on-disk
record in sync. The SessionService path remains for the non-live case
(e.g., another client renaming a backgrounded session). Reported in
MR review.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>

* fix(core): harden session title re-anchor invariants

* docs(core): clarify bounded metadata race recovery cost

* test(core): cover bounded multi-field title reads

---------

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Co-authored-by: Qwen-Coder <noreply@alibabacloud.com>
Co-authored-by: Qwen-Coder <noreply@qwen.com>
Co-authored-by: qqqys <266654365+qqqys@users.noreply.github.com>
…wenLM#3598)

* feat(cli): add --json-schema for structured output in headless mode

Registers a synthetic `structured_output` tool whose parameter schema IS the
user-supplied JSON Schema. In headless mode (`qwen -p`), the first successful
call terminates the session and exposes the validated payload via the result
message's `structured_result` field. Invalid schemas are rejected at CLI parse
time via a new strict Ajv compile helper so they can't silently no-op at
runtime.

* fix(cli): honour "first structured_output call ends session" + reject non-object root schemas

Two review fixes for the `--json-schema` feature:

1. `runNonInteractive` now breaks out of the tool-call loop as soon as the
   first successful `structured_output` invocation is captured, rather than
   continuing to execute any trailing tool calls the model emitted in the
   same turn. This restores the documented single-shot contract and prevents
   side-effecting tools from running after the final answer has already
   been accepted.

2. `resolveJsonSchemaArg` rejects schemas whose root `type` is anything
   other than "object" (or a type array including "object"). Function-
   calling APIs require tool arguments to be JSON objects, so a schema
   like `{"type": "array"}` would have registered an unusable synthetic
   tool the model could never satisfy. Absent `type` and `type: "object"`
   remain accepted.

Adds tests for both paths and updates the existing Ajv-compile test to
exercise that path without tripping the new root-type guard first.

* fix(cli): also reject root anyOf/oneOf schemas whose branches can't accept objects

Addresses a review follow-up: the previous root-object check only inspected
the top-level `type` keyword, so a schema like
`{"anyOf":[{"type":"array"},{"type":"string"}]}` slipped through even though
none of its branches can ever validate the object-shaped arguments that
function-calling APIs send.

Replace the single `type` check with `schemaRootAcceptsObject`, which
recursively walks root-level anyOf/oneOf branches and requires at least one
to accept objects. Absent `type`, `type: "object"`, `type: ["object", ...]`,
and mixed anyOf branches where one accepts object all still pass. `allOf`
is left to Ajv's runtime behaviour — guessing intent across contradictory
allOf branches at parse time is fragile.

* fix(cli): propagate exitCode from --json-schema failure path + tests

Address two PR-3598 review findings:

1. gemini.tsx unconditionally called process.exit(0) after
   runNonInteractive/runNonInteractiveStreamJson, clobbering the
   process.exitCode = 1 set by nonInteractiveCli.ts when the model
   emits plain text instead of the structured_output tool. Switch
   both call sites to process.exit(process.exitCode ?? 0) so CI can
   detect the failure via the exit code.

2. nonInteractiveCli.test.ts: strengthen the structured-output
   success path to assert registry.abortAll() is called and that the
   stdout result envelope carries the JSON-stringified args under
   `result` plus the raw object under `structured_result`. Add a
   retry-path test that mocks executeToolCall to return an error on
   the first structured_output call, then verifies sendMessageStream
   is called a second time so the model can retry rather than the
   session terminating early.

* fix(cli): suppress non-structured tool calls when structured_output is in the same turn

When --json-schema is active and the model emits a batch like
[write_file(...), structured_output(...)], the previous implementation
ran the leading side-effecting tool before accepting the structured
result, violating the "structured_output is the terminal contract"
guarantee. The trailing-only break also let an invalid first
structured_output fall through to subsequent tools before the retry
turn.

Pre-scan the batch: if a structured_output request is present, execute
ONLY the first one and skip everything else (leading and trailing).
This is consistent with the existing terminal-path semantics — the
suppressed tool_use blocks lack a matching tool_result, the same way
max-turns / cancellation leave the stream.

Adds a test covering the reverse-order [side_effect, structured_output]
case alongside the existing trailing-suppression and retry tests.

* fix(cli): tighten --json-schema root validation per review feedback

Three small holes flagged in the latest pass:

1. `schemaRootAcceptsObject` returned early when a root `type` keyword
   was present, ignoring sibling `anyOf`/`oneOf`. JSON Schema applies
   keywords at the same level conjunctively, so e.g.
   `{type:"object", anyOf:[{type:"string"}]}` is unsatisfiable for any
   value but used to pass. Now both `type` AND any sibling
   `anyOf`/`oneOf` must independently admit object.

2. The FatalConfigError text said "Every branch of a root anyOf/oneOf
   must be satisfiable by an object", but the actual logic only
   requires *at least one* branch (and tests still accept
   `anyOf:[object, string]`). Reworded to "at least one branch" so the
   message matches the behaviour.

3. `compileStrict` used `typeof schema !== 'object'` to gate input,
   which lets arrays through (`typeof [] === 'object'`). The contract
   says "schema must be a JSON object", so add an `Array.isArray`
   check so array input gets the intended error rather than a less
   helpful Ajv compile message.

Tests cover the new rejection paths and the array case.

* fix(cli): handle root $ref and allOf in --json-schema accept-object check

`schemaRootAcceptsObject` previously only inspected `type`, `anyOf`,
and `oneOf` at the root, so a couple of unsatisfiable shapes still
slipped through:

1. `{"$ref":"#/$defs/Foo","$defs":{"Foo":{"type":"array"}}}` would be
   accepted because we don't follow $refs, but registers a synthetic
   tool whose params resolve to "array" — the model can never produce
   a valid object. Now reject any root $ref unless the user adds a
   sibling `type:"object"` as an explicit anchor.

2. `allOf` was deferred to Ajv runtime, but allOf is conjunctive at
   the same level as `type` / `anyOf` / `oneOf`, so an entry like
   `{"allOf":[{"type":"object"},{"type":"string"}]}` is unsatisfiable
   for any value. Walk it like the others, requiring every branch to
   admit object.

Tests cover the new $ref-rejected / $ref+anchor-accepted paths and the
allOf reject/accept paths.

* fix(cli): explicit exit code from runNonInteractive + pair suppressed tool calls

Three review threads on the structured-output flow:

1. The break that ends the for-loop on a successful structured_output
   call sat *before* the responseParts.push and modelOverride capture.
   SyntheticOutputTool currently returns neither, so it was safe today
   — but anyone wiring extra signals into the synthetic tool later
   would see them silently dropped. Move the break after both captures
   so the contract is explicit, not implicit.

2. The failure path used to set process.exitCode = 1 and return void,
   relying on global mutable state across an async boundary. Any
   cleanup task between runNonInteractive and process.exit could
   silently turn the structured-output failure into exit 0. Switch
   runNonInteractive to Promise<number>, return 0 / 1 directly from
   each function-level exit, and have gemini.tsx use the captured
   return value.

3. The pre-scan from the prior commit suppresses sibling tool calls
   when structured_output is in the same turn. On the retry path —
   when structured_output fails validation — the next-turn payload
   has tool_result for structured_output but no entry for the
   suppressed siblings, leaving the prior assistant turn's tool_use
   blocks unpaired. Anthropic and OpenAI both reject that batch
   shape, so the retry would surface as an opaque provider error.
   Synthesize a "skipped" functionResponse for every suppressed call
   so every tool_use in the prior assistant message has a matching
   tool_result.

Tests cover the new retry-pairing contract and update the existing
plain-text-failure test to assert on the return value rather than
process.exitCode.

* fix: address Copilot follow-up review on --json-schema scaffolding

Five small but real findings flagged on the latest pass:

1. core/src/index.ts re-exported `SyntheticOutputTool` via `export type`,
   but it's a runtime class — that erased it from the emitted JS and
   would break value imports. Split into a value `export { ... }` and a
   `export type { StructuredOutputParams }`.

2. The structured-output success path returned without flushing
   `localQueue` notifications or finalising one-shot monitors. If a
   background task had already emitted `task_started`, exiting here
   could drop its paired `task_notification` and leave SDK consumers
   with unpaired lifecycle events. Mirror the regular terminal path's
   `flushQueuedNotificationsToSdk` + `finalizeOneShotMonitors` calls
   before `emitResult`.

3. `schemaRootAcceptsObject` ignored the `not` keyword, so
   `{not:{type:"object"}}` (which forbids every object value) slipped
   through. Add a best-effort `not` check that rejects when
   `not.type` directly excludes object. Deeper negated patterns still
   fall through to Ajv at runtime.

4. `compileStrict`'s JSDoc claimed it errored on "Ajv versions we can't
   support", but the function doesn't actually check Ajv versions. Reword
   to "malformed or uses unsupported draft/features for our Ajv
   configuration" so the contract matches the implementation.

5. The pre-scan suppressed sibling tool calls but only synthesised
   tool_result events for them on the retry path — the success path
   left those tool_use blocks unpaired in the emitted JSONL/stream-json
   event log. Move the synthesis after the for loop so it runs for both
   the success break and the validation-failure fall-through; the event
   log is now consistent regardless of which path the run takes.

Tests cover the new \`not\`-rejection paths, the success-path tool_result
synthesis, and the existing retry-pairing test still passes against the
restructured emit ordering.

* fix(cli): tighten --json-schema parse-time gate per Copilot review

Two more shapes that used to slip through:

1. `schemaRootAcceptsObject` defaulted to true when no narrowing
   keyword was present, so root-value constraints like `{const: 1}`
   or `{enum: [1, 2]}` registered an unsatisfiable structured_output
   contract — the model could never produce a value matching the
   tool's parameter schema, and the run would loop on validation
   failures until max-turns. Reject `const` whose literal isn't an
   object, and `enum` whose members include no object.

2. The yargs check rejected `--json-schema` with `-i` and with no
   prompt, but not with `--input-format stream-json`. Stream-json
   keeps the process open waiting for protocol messages, so
   "terminate on the first valid structured_output call" silently
   drops everything queued after that point. Refuse the combination
   at parse time so the contradiction surfaces immediately.

Tests cover the new const/enum reject and accept paths.

* fix(cli): handle empty/boolean subschemas + allow stdin-only prompt

Three more shapes flagged on the latest review pass:

1. `schemaRootAcceptsObject` treated an empty root `anyOf`/`oneOf`
   as "no constraint" (skipped when length === 0), but per JSON
   Schema an empty union is unsatisfiable — no value can match a
   member of the empty set. Reject those at parse time so users
   get a clear parse error instead of an opaque runtime
   never-validates loop.

2. JSON Schema (draft-06+) allows boolean subschemas anywhere a
   schema is accepted: `true` matches every value, `false` matches
   nothing. The `anyOf`/`oneOf`/`allOf` walks were rejecting
   booleans via the typeof-object guard, which incorrectly
   rejected `{anyOf:[true]}` and `{allOf:[true,{type:"object"}]}`
   while letting `{anyOf:[false]}` slip through. Replace the
   per-branch object guard with a `variantAcceptsObject` helper
   that treats `true` as accepting and `false` as rejecting, then
   recurses on object subschemas.

3. The yargs `.check` rejected `--json-schema` when no `-p` /
   positional prompt was given, but the headless CLI also reads
   the prompt from stdin (`cat prompt.txt | qwen --json-schema
   '...'`) — a legit usage pattern that was being blocked. Drop
   the parse-time no-prompt rejection; the existing runtime "No
   input provided via stdin..." error in gemini.tsx still catches
   genuinely empty input.

Tests cover the empty-union, all-`false`, mixed-boolean accept,
and `false`-in-allOf reject paths. Live-verified against the
bundled CLI: `echo "..." | qwen --json-schema '...'` now reaches
the model call, and the four schema edge cases all surface the
expected error text or proceed past parse time.

* docs(core): note SyntheticOutputTool as the value-export exception

The block comment above the lazy-load type re-exports said tool classes
"are now lazy-loaded and are not exported as values from the package
root", but `SyntheticOutputTool` was just promoted to a runtime export
in 6203852 so the CLI's `--json-schema` flow can construct it from
the package root. Document that exception inline so downstream
consumers reading the comment don't get told the wrong story.

* fix(cli): try every structured_output in a same-turn batch in order

The pre-scan used to pick only the FIRST structured_output call from a
turn and suppress everything else, even other structured_output calls.
That created two avoidable failure modes:

1. `[structured_output(bad), structured_output(good)]` would attempt
   only the bad one, fail validation, and force a full retry turn.
   The model already produced a valid structured payload — we should
   try it before asking again.

2. The trailing structured_output's tool_result was synthesised with
   the "Skipped: structured_output was also requested in this turn..."
   message, which is misleading because that call WAS the structured
   output we should have tried.

Filter `requestsToExecute` to ALL structured_output calls (in original
order) when --json-schema is active, and let the existing loop break
on the first success. Track an `executedCallIds` set, then synthesise
tool_result + retry parts after the loop for every tool_use the model
emitted that we never actually executed — covering both non-structured
siblings (always suppressed) and any structured_output left over after
the success break (only one terminal contract per turn).

Reworded the synthesised "skipped" output to "this turn's
structured_output contract took precedence" so it reads correctly
regardless of whether the suppressed call was structured or not.

Tests cover the multi-structured retry-free success path; the
existing single-structured retry and trailing/leading suppression
tests still pass against the updated emit ordering.

* fix: address gpt-5.5 review on --json-schema (privacy + $ref + core-tools)

Three findings, three changes:

1. Reject every root `$ref` in --json-schema, even with a sibling
   `type: "object"` anchor. Ajv applies `$ref` conjunctively with
   sibling keywords, so the previous "accept when type:object is
   present" carve-out was unsound: `{type:"object",$ref:"#/$defs/Foo",
   $defs:{Foo:{type:"array"}}}` parsed fine but no object value can
   satisfy both at runtime, leaving the model to loop until maxTurns.
   Updated docstring + test cases (replaced the accept-with-anchor
   case with a reject case for both anchored and well-formed $ref
   shapes — users wanting composition should inline at the root).

2. Redact `function_args` for structured_output in ToolCallEvent.
   The args ARE the user's structured payload (already emitted via
   stdout `result` / `structured_result`); recording them again as
   ordinary tool-call function_args duplicates that data into OTLP
   exports, QwenLogger, ui-telemetry, and the chat-recording UI
   event mirror — surfaces that can leak off-device. Replace with a
   stable `__redacted` placeholder so consumers still see the call
   happened (duration, success, decision metrics preserved) but the
   payload itself doesn't ride along. Two new uiTelemetry tests
   cover the redacted vs non-redacted paths.

3. Document and test that structured_output bypasses the --core-tools
   allowlist (same as agent / skill / exit_plan_mode / ask_user_question
   etc.). The synthetic tool only exists when --json-schema is set,
   so adding it to CORE_TOOLS would let `--core-tools read_file
   --json-schema X` silently drop the terminal contract and loop the
   model until maxTurns — bypass is intentional. Expanded the
   CORE_TOOLS docstring to enumerate the synthetic-tool exclusions
   and added a permission-manager test mirroring the pattern used
   for agent / skill / exit_plan_mode.

* fix(cli): apply structured_output terminal handling to drain turns

The synthetic structured_output tool is registered for the entire
headless session, so it can be invoked from EITHER the main
assistant-turn loop OR from a drain turn (queued cron-job /
notification reply). The drain path (drainOneItem) was treating it
like any other tool: execute, append the response back into
itemMessages, keep going. The submitted args were never captured and
no structured_result envelope was emitted, so a run that legitimately
satisfied --json-schema mid-drain ended up failing the contract with
"Model produced plain text..." anyway.

Apply the same terminal handling to drain turns:

- Hoist `structuredSubmission` to session scope so both paths write
  to one variable.
- In `drainOneItem`, run the same pre-scan: when --json-schema is
  active and structured_output is in the batch, execute every
  structured_output in original order until one succeeds; suppress
  every non-structured sibling. Synthesise tool_results for any
  unexecuted tool_use the model emitted, mirroring the main path.
- On capture, return early from drainOneItem so the drained item's
  inner while loop stops.
- `drainLocalQueue` short-circuits when a captured submission is in
  flight, so subsequent queued items don't run.
- The cron `checkCronDone` watches the same flag and stops the
  scheduler immediately on capture, releasing the surrounding
  `await new Promise(...)`.
- The final holdback loop bails out on capture so monitor lifecycle
  doesn't extend past the structured submission.
- After the holdback, before the existing failure / regular-success
  emit, emit the structured success envelope and return 0.

Adds a focused unit test that drives the drain path end-to-end via a
synchronously-fired monitor notification: main turn produces plain
text, the drain reply calls structured_output, and the test asserts
exit 0 + structured_result populated + no "Model produced plain
text..." error.

* fix(cli): address gpt-5.5 review follow-ups on --json-schema scaffolding

Six review findings, six small fixes:

1. **Nested $ref incorrectly rejected.** `schemaRootAcceptsObject`
   recurses into anyOf/oneOf/allOf branches and used to apply the
   root-only $ref rejection at every level, blocking common
   composition shapes like
   `{anyOf:[{$ref:"#/$defs/Foo"},{type:"string"}]}`. Add an
   `isRoot=true` parameter; non-root recursion treats `$ref` as
   opaque and defers to Ajv at runtime. Tests cover nested refs in
   anyOf / oneOf / allOf.

2. **Inaccurate package-root export comment.** `core/src/index.ts`
   claimed `SyntheticOutputTool` was exported as a runtime value
   for the CLI's --json-schema flow, but the only construction is
   inside `Config.registerLazy` via a relative dynamic import — no
   value consumer reaches into `@qwen-code/qwen-code-core`. Revert
   to a type-only re-export so `SyntheticOutputTool` lines up with
   every other lazy-loaded tool class.

3. **Unused constructor parameter.** `SyntheticOutputTool` took
   `(_config: Config, schema)` but never read `_config`. Drop the
   parameter (and the corresponding pass-through at the registration
   call site) so readers don't wonder why a Config is being threaded
   through.

4. **Tool description claimed "exactly once".** The retry path
   explicitly tolerates multiple calls until one validates, so
   "Call this tool exactly once" is misleading to a model that
   tried twice. Reword to "Call this tool to deliver the final
   result; the first call with valid arguments ends the session" so
   the description matches the actual contract.

5. **Asymmetric shutdown on the structured-output success path.**
   The regular terminal path waits in a holdback loop until
   `hasUnfinalizedTasks()` is false; the structured-output path
   used to call `abortAll()` and flush immediately, dropping the
   matching `task_notification` for any agent whose natural handler
   hadn't yet enqueued it. Add a bounded holdback (capped at 500ms
   via STRUCTURED_SHUTDOWN_HOLDBACK_MS) — long enough for typical
   abort callbacks to enqueue, short enough that a hung agent can't
   block exit.

6. **gemini.tsx exit-code asymmetry.** `runNonInteractive` returns
   an explicit exit code, but `runNonInteractiveStreamJson` still
   reads `process.exitCode` after `runExitCleanup`. Currently safe
   because the yargs `.check` rejects --json-schema with stream-json
   input, but a future stream-json equivalent of structured output
   would need to plumb the exit code through the return value too.
   Document this in a comment so the constraint is visible at the
   call site.

Plus: strengthen `synthesises tool_result for suppressed sibling
calls when structured_output fails validation` to assert the failed
structured_output's `functionResponse.response` carries the actual
validation error string ("args invalid"), not the synthesised
"Skipped:" prose — a regression that overwrote it would otherwise
slip past the existing pairing assertion.

* fix(cli): close --json-schema gaps surfaced in self-audit + review

Five fixes layered onto the same robustness pass over the
`--json-schema` flow:

1. **bare-mode registration** (`packages/core/src/config/config.ts`):
   `qwen --bare --json-schema X -p "..."` previously skipped the
   synthetic `structured_output` registration entirely (the
   registration block lives below the bare-mode early-return), so the
   model had no way to terminate and the run looped to
   `maxSessionTurns`. Register the synthetic tool inside the bare
   branch too.

2. **TTY interactive rejection** (`packages/cli/src/gemini.tsx`):
   `qwen --json-schema X` on a TTY with no `-p` and no piped stdin
   routes to `isInteractive=true` (priority-3 fallback) and would
   launch the TUI, where `structured_output` is just an inert tool
   that prints "accepted" and lets the chat continue. Parse-time
   gating can't catch this (stdin isn't probed yet at parse time), so
   reject at runtime before the UI launches; runs `runExitCleanup`
   first so MCP subprocesses get torn down.

3. **drain-turn structured-success flush**
   (`packages/cli/src/nonInteractiveCli.ts`): when a drain turn
   captures `structured_output`, `drainLocalQueue` returns early,
   leaving any items the drain didn't process in `localQueue`. The
   prior emit path then ran `registry.abortAll()` + `emitResult`
   without flushing — stream-json consumers saw `task_started` events
   without paired `task_notification`. Add the same 500ms holdback +
   `flushQueuedNotificationsToSdk` the main-turn structured-success
   path uses, so the two paths agree.

4. **ACP mutual-exclusion** (`packages/cli/src/config/config.ts`):
   `--acp` runs an independent `runAcpAgent` turn loop that doesn't
   honour the synthetic-tool terminal contract, so `--acp
   --json-schema X` would register the tool but never terminate. Add
   a yargs `.check` rejection covering both `--acp` and the
   deprecated `--experimental-acp` alias.

5. **max-turns + Skipped wording** (review comments
   #3198579251/#3198579389/#3198579567 from yiliang114):
   - `handleMaxTurnsExceededError` now appends a `--json-schema`-
     specific hint pointing at the common stuck-run causes
     (structured_output denied by `permissions.deny` /
     `--exclude-tools`, unsatisfiable schema, prompt didn't
     instruct the model). Without this, three different failures
     all surfaced as the same generic "increase maxSessionTurns"
     line.
   - The synthesised "Skipped:" tool_result for suppressed sibling
     calls drops the trailing "Re-issue this call in a separate
     turn if needed." sentence on the success path, where the
     session terminates immediately and no consumer (model or SDK)
     can act on the advice. Retry path keeps the sentence — the
     model is about to receive these parts and may legitimately
     re-issue.

Tests cover each fix: bare-mode registration order, ACP / experimental-
acp rejection (×2), `--json-schema` hint in both text and JSON max-turns
output, and explicit Skipped-text assertions on the success and retry
paths.

* fix: address 9 self-qreview comments on --json-schema PR

Folds the 9 Suggestion-level comments from the previous /qreview pass
into code/test fixes. Each one is a real issue, but mostly defensive —
none changes the user-visible happy path.

**Refactors (F4/F5/F6 — code-quality)**

- F4 `nonInteractiveCli.ts`: extract `SUPPRESSED_OUTPUT_SUCCESS` /
  `SUPPRESSED_OUTPUT_RETRY` module-level constants and a
  `suppressedOutputBody(structuredCaptured)` helper. Both the main-turn
  and drain-turn synthesis sites previously had a 4-way duplicated
  ternary; future wording changes can no longer drift between them.
- F5 `nonInteractiveCli.ts`: extract `emitStructuredSuccess()` closure
  inside `runNonInteractive`. The "abortAll → bounded holdback → flush
  → finalize one-shot monitors → emitResult → return 0" terminal block
  is now defined once and called from both the main-turn and drain-turn
  success paths. `finalizeOneShotMonitors` is idempotent
  (`oneShotMonitorsFinalized` guard) so the unconditional invocation is
  safe even when the drain-turn already finalized monitors before
  reaching the helper.
- F6 `core/config/config.ts`: extract
  `registerStructuredOutputIfRequested()` helper. The synthetic-tool
  registration block is no longer duplicated between the bare-mode
  early-return branch and the regular registration branch.

**Tests (F7/F8/F9 — pin existing behaviour)**

- F7 `nonInteractiveCli.test.ts`: new test "holds back for in-flight
  background tasks before emitting structured success" — flips
  `hasUnfinalizedTasks: true → false` mid-poll so the holdback `while`
  body actually executes; spies on `abortAll` and asserts ordering of
  `task_notification` (must precede the result envelope) and the
  bounded elapsed-time cap. None of the existing structured-output
  success tests entered this branch (they all pinned
  `hasUnfinalizedTasks: () => false`).
- F8 `gemini.test.tsx`: new test "rejects --json-schema when running
  in interactive (TUI) mode" — pins the TUI guard at gemini.tsx:694,
  asserting the headless-only stderr message AND the exact ordering
  `writeStderrLine → runExitCleanup → process.exit(1)` so a future
  refactor can't swap any of those steps.
- F9 `cli/config.test.ts`: pin the two previously-untested
  `--json-schema` mutual-exclusion branches: `-i`/`--prompt-interactive`
  and `--input-format stream-json`. The stream-json check is
  load-bearing — `gemini.tsx:768` explicitly relies on this rejection
  holding (the parse-time `process.exitCode ?? 0` plumbing in the
  stream-json branch is only safe because `--json-schema` can't reach
  it).

**Behaviour fixes (F1/F2/F15 — privacy / security / correctness)**

- F1 `core/core/geminiChat.ts`: redact `functionCall.args` for
  `structured_output` tool calls before passing them to
  `chatRecordingService.recordAssistantTurn`. Without this, the
  user's structured payload (already emitted on stdout via
  `result` / `structured_result`) was persisted verbatim to
  `<projectDir>/chats/<sessionId>.jsonl` and re-fed into model
  context on `--continue` / `--resume`, contradicting the privacy
  contract documented next to the existing `ToolCallEvent` redaction.
  Each validation-failure retry was also recorded. Now mirrors the
  same `__redacted` placeholder. Helper extracted as
  `redactStructuredOutputArgsForRecording` so it's unit-testable.
- F2 `cli/config/config.ts`: `resolveJsonSchemaArg`'s `@path` reader
  now (a) `fs.statSync`s first to refuse non-regular files (FIFOs,
  character devices like `/dev/zero`, directories), (b) caps the
  schema file at 1 MiB so an attacker who can influence the path
  through a wrapping process can't OOM the run, and (c) on JSON
  parse failure for `@path` source emits a generic "content of
  <path> is not valid JSON" instead of echoing the SyntaxError —
  Node ≥18's SyntaxError embeds a ~10-char file-content prefix in
  its message, which would otherwise ride out on stderr through any
  wrapper that surfaces the error. Inline (non-`@path`) JSON keeps
  the SyntaxError detail because the user is the source.
- F15 `core/tools/tool-registry.ts`: `registerTool` now also checks
  the lazy `factories` map for name collisions, not just the eager
  `tools` map. An MCP server registering a tool whose name shadows a
  built-in lazy factory (e.g. `structured_output`) now gets
  auto-qualified to `mcp__<server>__<name>`, instead of silently
  winning the resolution. The synthetic structured-output tool no
  longer needs renaming for the corner case to be safe.

Targeted suite (13 changed-area test files): 883/886 pass — 3
pre-existing skips. Typecheck clean on both packages.

* fix: address 3 deepseek-v4-pro qreview comments on --json-schema PR

Three Suggestion-level comments from the latest /qreview pass.

**N1 — `schemaRootAcceptsObject` skips `if/then/else`** (cli/config/config.ts):
A schema like `{"if": true, "then": {"type": "string"}}` passed parse-time
gating but is unsatisfiable for object-typed tool args at runtime — the
model would loop until maxSessionTurns. Add a best-effort check for the
two decidable shapes:
- `if: true` → object MUST match `then`; if `then` excludes objects
  (boolean `false`, non-object `type`, etc.), reject at parse time.
- `if: false` → object MUST match `else` (`true` if absent); same check.
Object-schema `if` cases stay runtime-decidable and fall through to Ajv,
matching the existing best-effort scope on `not`. 4 new test cases pin
both reject and accept paths.

**N2 — subagent registries register `structured_output` too** (core/config/config.ts,
core/tools/agent/agent.ts, core/agents/backends/InProcessBackend.ts):
`createApprovalModeOverride` and `buildSubagentContextOverride` rebuild
the tool registry on a `Object.create(base)` config. `this.jsonSchema`
propagates through the prototype chain, so
`registerStructuredOutputIfRequested` was firing for every subagent
registry rebuild — but only `runNonInteractive`'s main / drain loops
detect a successful `structured_output` call as terminal. A subagent
that called the tool would receive "Session will end now" and then keep
running because its own loop has no terminator: wasted tokens, no
structured payload on stdout.

Add a `forSubAgent: true` option to `createToolRegistry` (alongside the
existing `skipDiscovery`), and propagate it from both subagent rebuild
sites. The structured-output registration helper short-circuits when
the flag is set. Bare-mode init does NOT set the flag, preserving the
F6 fix where `qwen --bare --json-schema X -p "..."` still gets the
synthetic tool. New test asserts the registry rebuilt with
`forSubAgent: true` registers READ_FILE / EDIT / SHELL but NOT
STRUCTURED_OUTPUT.

**N3 — TEXT-mode `structuredResult` not integration-tested** (nonInteractiveCli.test.ts):
All 8 existing `--json-schema` tests pin `OutputFormat.JSON` or
`STREAM_JSON`. TEXT (the default for `qwen -p ...`) has no integration
coverage, so a regression in
`BaseJsonOutputAdapter.buildResultMessage`'s
`hasStructured ? JSON.stringify(structuredResult) : resultText`
contract or in `JsonOutputAdapter.emitResult`'s text-mode
`process.stdout.write(`${result}\n`)` path would only surface to plain
`qwen -p` users. New test pins TEXT-mode behaviour: stdout is exactly
`${JSON.stringify(structuredArgs)}\n` — no JSON envelope, no event
log.

Targeted suite (13 spec files): 945/948 pass — 3 pre-existing skips.
Typecheck clean on both packages.

* fix(cli): narrow `not` rejection in schemaRootAcceptsObject

Address Critical review comment #3216123734.

`schemaRootAcceptsObject`'s `not` handler previously rejected any schema
whose `not.type` included `"object"`, regardless of what other
constraints `not` had. That's a false positive for schemas where the
extra constraints NARROW what `not` excludes:

    { "not": { "type": "object", "required": ["error"] } }

excludes only objects with an `error` key — the value `{}` satisfies
this schema fine, but the old check rejected it at parse time with
"--json-schema root must accept object-typed values".

Fix: only reject when `not` is exactly `{type: ...}` with no narrowing
siblings (the unambiguous "every object is excluded" case). When other
keywords are present (`required`, `properties`, `minProperties`,
`enum`, etc.), defer to Ajv at runtime — same best-effort scope as the
sibling `anyOf`/`oneOf`/`allOf` deep-content checks.

3 new test cases pin the fixed accept paths
(`{not:{type:"object",required:[...]}}`,
`{not:{type:"object",properties:...,required:[...]}}`,
`{not:{type:"object",minProperties:1}}`). The existing reject test for
bare `{not:{type:"object"}}` still passes.

* refactor: dedupe structured_output handling per qreview C1/C2/C3

Three Suggestion-level review comments from the latest /qreview pass.

**C1 — main-turn / drain-turn `structured_output` dispatch was
duplicated ~120 lines** (`nonInteractiveCli.ts`)

The two batch-handling sites had near-identical bodies (filter
`structured_output` from the batch when `--json-schema` is active →
iterate with `executeToolCall` → write to `structuredSubmission` on
first valid call → synthesise tool_result events for suppressed
siblings). The only meaningful difference was which `modelOverride`
binding the loop wrote to (session-scoped `modelOverride` for the
main turn vs per-drain-item `itemModelOverride`). Extracted
`processToolCallBatch(batchRequests, setModelOverride)` defined
inside `runNonInteractive`:

- Closes over session-scoped state (`adapter`, `config`,
  `abortController`, `options`, `structuredSubmission`,
  `executeToolCall`, `handleToolError`, `suppressedOutputBody`,
  the progress-handler helpers).
- Takes the `modelOverride` setter as the one call-site-specific
  parameter so the main turn binds to the session var and the drain
  binds to the per-item var.

Main-turn body went from ~120 lines to a single call; drain-turn body
likewise. Net file shrink ~80 lines, no behaviour change. All 42
existing structured-output tests still pass (including
`stops executing remaining tool calls...`,
`tries multiple structured_output calls in the same turn...`,
`synthesises tool_result for suppressed sibling calls...`,
`captures structured_output emitted from a drain-turn (queued notification)`).

**C2 + C3 — `{__redacted: '…'}` placeholder duplicated in two files**
(`telemetry/types.ts` + `core/geminiChat.ts`)

The `ToolCallEvent` constructor (for telemetry surfaces — OTLP /
QwenLogger / ui-telemetry / chat-recording UI event mirror) and
`redactStructuredOutputArgsForRecording` (for the on-disk
chat-recording JSONL) each had a verbatim copy of:

    { __redacted: 'structured_output payload (see stdout result)' }

If the redaction wording (or the `__redacted` key, or the placeholder
text) ever drifted between the two surfaces, the privacy contract
would be subtly broken on one and not the other.

Hoisted to `STRUCTURED_OUTPUT_REDACTED_ARGS` exported from
`packages/core/src/tools/syntheticOutput.ts`, imported in both sites.
The constant carries its rationale in a JSDoc block so future readers
see both call sites at once.

Targeted suite (13 spec files): 961/964 pass — 3 pre-existing skips.
Typecheck clean on both packages.

---------

Co-authored-by: wenshao <wenshao@U-K7F6PQY3-2157.local>
* feat(cli): Ctrl+B promote keybind — wire UI to PR-2's promoteAbortController (QwenLM#3831 PR-3 of 3)

Final piece of the foreground → background promote feature. PR-1
(QwenLM#3842) landed the `signal.reason` foundation; PR-2 (QwenLM#3894) wired
`shell.ts` to detect a `{ kind: 'background' }` abort, snapshot
output, register a `BackgroundShellEntry`, and stash the promote
`AbortController` on `TrackedExecutingToolCall`. This PR exposes
the user-visible surface: pressing Ctrl+B during an in-flight
foreground shell command transfers ownership to a background task
the user can inspect via `/tasks` or stop via `task_stop`.

- `keyBindings.ts`: new `Command.PROMOTE_SHELL_TO_BACKGROUND` bound to
  `Ctrl+B`. JSDoc explains the no-shell-running no-op semantics.

- `useReactToolScheduler.ts`: project `promoteAbortController` from
  the core's `ExecutingToolCall` through `TrackedExecutingToolCall`
  so the React layer (AppContainer keypress handler) can find it
  by callId without re-plumbing through the scheduler.

- `AppContainer.tsx`: `handleGlobalKeypress` gains a
  `PROMOTE_SHELL_TO_BACKGROUND` branch that walks
  `pendingToolCallsRef.current` (the ref, not the destructured
  array — keeps the deps list stable so the handler isn't re-bound
  on every tool-call status update), finds the executing tool call
  with a defined `promoteAbortController`, calls
  `.abort({ kind: 'background' })`, and returns early.
  No-op when no foreground shell is executing — Ctrl+B then falls
  through to the input layer's existing cursor-left binding.

- `keyboard-shortcuts.md`: documents Ctrl+B with explicit
  fall-through behavior so the conflict with the prompt-area
  cursor-left binding is intentional + understandable.

- `keyMatchers.test.ts` (+1): Ctrl+B positive / bare-b + meta+b +
  Ctrl+other negatives.
- `AppContainer.test.tsx` (+2):
  - **Ctrl+B promotes** — pendingToolCalls includes an executing
    shell with a stubbed `AbortController` + spy; firing Ctrl+B
    asserts `abort({ kind: 'background' })` is called once.
  - **Ctrl+B no-op** — empty `pendingToolCalls` + Ctrl+B must NOT
    throw (pins the safety contract for the typing-mid-prompt
    case where the input layer's own Ctrl+B should still fire).
- 37/37 keyMatchers + 58/58 AppContainer pass; tsc + ESLint clean.

The unit / integration tests cover the keybind → abort wiring and
the promote handler's downstream behavior (PR-2's tests). Real-PTY
E2E is intentionally manual since headless test infrastructure
doesn't drive a real shell child + Ctrl+B keystroke; documented in
the PR description checklist.

Closes the 3-PR sequence for QwenLM#3831 (Phase D part b of QwenLM#3634).

* fix(cli): QwenLM#3969 review wave — broadcast comment + debug log + redundancy

5 QwenLM#3969 review threads addressed:

- **AppContainer.tsx Ctrl+B handler**: documented the
  KeypressContext.broadcast caveat (after `return`, the same Ctrl+B
  is still dispatched to text-buffer cursor-left + DebugProfiler;
  visible cursor-left side effect is cosmetic) so future readers
  understand why the prompt cursor moves on a successful promote.
  Added `debugLogger.debug` calls on both branches (matched callId
  on success; streamingState + pendingToolCalls.length on no-op
  fall-through) so "Ctrl+B doesn't work" reports are debuggable.

- **useReactToolScheduler.ts TrackedExecutingToolCall**: dropped
  the redundant `pid?` and `promoteAbortController?` declarations
  — both come through the `& ExecutingToolCall` intersection
  unchanged. Fixed the JSDoc that wrote `{ kind: 'background',
  shellId }`: callers don't generate `shellId` (it's optional on
  the abort-reason union and `handlePromotedForeground` produces
  it downstream). The corresponding executing branch in
  `toolCallsUpdateHandler` no longer projects pid /
  promoteAbortController explicitly — `...coreTc` already spreads
  them; the explicit-undefined clearing in the non-executing
  branch is also dropped (those fields aren't on coreTc when
  status !== 'executing', so `...coreTc` doesn't carry them).

- **AppContainer.test.tsx**: replaced two `as unknown as Key`
  double-casts with direct `: Key` annotations on the literal —
  the object already conforms to the Key interface, double-cast
  was bypassing type safety needlessly.

Tests: 37/37 keyMatchers + 58/58 AppContainer pass; tsc + ESLint
clean. No behavior change beyond the new debug log lines.

* fix(cli): QwenLM#3969 wave — tool-name guard + non-shell test + defensive clear

3 QwenLM#3969 review threads addressed; 1 deferred:

- AppContainer.tsx: Ctrl+B `find()` predicate now also checks
  `tc.request.name === ToolNames.SHELL` before matching the executing
  tool call. Defense-in-depth — today only the shell tool wires
  `promoteAbortController`, but a future copy-paste / type confusion
  that adds the property to a non-shell tool would otherwise let
  Ctrl+B mistakenly fire `abort({kind:'background'})` on a tool
  whose service has no promote-handoff handler.

- useReactToolScheduler.ts: re-added explicit `pid: undefined` and
  `promoteAbortController: undefined` to the non-executing return.
  Previously dropped on the assumption that `...coreTc` doesn't
  carry these fields when the status isn't `executing` — true today,
  but the explicit clearing is defense-in-depth against a future
  core change that adds either field to a non-executing status type
  (would surface as a stuck PID display or a Ctrl+B handler that
  matches a no-longer-executing tool call).

- AppContainer.test.tsx: replaced the placeholder "no-op when no
  pending tool calls" framing on the empty-array case (it does
  exercise the `executing-status` predicate but NOT the tool-name
  guard) with TWO tests:
    1. existing empty-array no-throw test (renamed for clarity)
    2. NEW: executing non-shell tool with a hostile-shape
       `promoteAbortController` — asserts `abortSpy` is NOT called.
       This is the regression test for the new tool-name guard above.

Tests: 61/61 AppContainer.test.tsx pass; tsc + ESLint clean.

Deferred to follow-up (replied + tracked):
- `debugLogger.debug` is file-only; success-path "agent unblocks +
  next message says 'promoted to bg_xxx'" is the user-visible signal.
  Adding a synthetic history item or stderr line for the gap between
  keypress and agent message conflicts with Ink rendering and is
  better as a focused UX PR.

* test(cli): pin inheritance of pid + promoteAbortController via type assertions

explicit `pid?: number` and `promoteAbortController?: AbortController`
from `TrackedExecutingToolCall`, relying on the `& ExecutingToolCall`
intersection to inherit them. Current review flags the type-safety
regression: if core renames or removes either field, the React-side
build won't catch it locally — Ctrl+B handler silently breaks at
runtime.

Compromise: keep the type minimal (no re-declaration noise the prior
review flagged) but add compile-time `extends keyof ExecutingToolCall`
assertions that fail loudly + locally if either field disappears.
The assertions are evaluated at compile time and zero-cost at
runtime; the dummy `const` pins them so they aren't dead code.

61/61 AppContainer tests pass; tsc clean.
* feat(core): write runtime.json sidecar for active sessions

Port kimi-cli PR QwenLM#2082 part 1 to qwen-code.

On interactive session start, atomically write a small JSON sidecar at <projectDir>/chats/<sessionId>.runtime.json recording the (pid, session_id, work_dir, hostname, started_at, qwen_version) tuple.

External tools (terminal multiplexers, IDE integrations, status daemons) can map a running PID to its session id and work dir without parsing argv. Write is best-effort: a read-only filesystem must not block UI startup.

OS process title (was QwenLM#3713) and dynamic OSC tab title (kimi QwenLM#2083) remain out of scope.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(core): refresh runtime.json on same-PID session swap

Config.startNewSession() reassigns this.sessionId in the same process,
which is reached by /clear, /reset, /new and /resume. Previously the
old <oldId>.runtime.json was left behind, falsely claiming the still-
live PID for a session no longer being served, and no new sidecar was
written for the incoming session.

Centralize the swap by clearing the old sidecar and writing a fresh
one for the new session id from inside startNewSession itself, so all
same-PID transitions are covered. The refresh runs as a fire-and-
forget best-effort; failures must not block the session switch.

Mirrors the post-merge Codex P1 fix on kimi-cli PR QwenLM#2082 (the source
of the runtime.json sidecar pattern this PR ports).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(core): only refresh runtime.json when this process owns it

Mirrors kimi-cli PR QwenLM#2082 commit e237951f (Codex P1 r3158754463): a
short-lived non-interactive invocation (qwen --prompt, ACP, etc.) that
runs `/clear` would otherwise call `Config.startNewSession()`, delete
a concurrent shell's runtime.json sidecar (same outgoing session id),
and never write a replacement — leaving the shell discoverable to
nobody.

Add a `runtimeStatusEnabled` flag on Config, flipped on by the
interactive UI bootstrap immediately after the first successful
sidecar write, and gate the swap-time refresh in
`startNewSession()` on it. Non-interactive entry points never reach
the bootstrap, so they won't touch sibling sidecars.

Kimi later reverted the equivalent `write only from shell mode`
guard (commit 7083975a) in favor of writing from every long-lived
mode, but qwen's wire point is already interactive-only, so the
narrower guard is the right shape here.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…/auth TUI dialog (QwenLM#3959)

The `qwen auth` CLI subcommand (with subcommands like qwen-oauth,
coding-plan, api-key, openrouter, status) has been superseded by the
richer /auth TUI dialog introduced in the provider-first auth registry
(QwenLM#3864). Running `qwen auth` now prints a deprecation notice pointing
users to the /auth TUI dialog (interactive), env vars (CI/headless),
or /doctor (status check).

Changes:
- Replace auth.ts with a stub that prints a removal notice and exits
- Delete handler.ts (734 lines), interactiveSelector.ts, and their
  tests (interactiveSelector.test.ts, openrouter.test.ts, status.test.ts)
- Update /auth slash command to handle non-interactive/ACP modes gracefully
- Enrich /doctor auth check with provider-aware diagnostics using
  findProviderByCredentials
- Mark `auth` as a subcommand that handles its own exit in config.ts

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
* feat(installer): add standalone archive installation

* fix(installer): harden standalone archive installs

* fix(installer): address standalone review findings

* chore(installer): clarify review followups

* fix(installer): stabilize standalone script checks

* chore(installer): remove internal planning docs

* chore(installer): simplify standalone release review fixes

* test(installer): add Windows batch install smoke

* test(installer): fix Windows batch smoke quoting

* test(installer): preserve Windows cmd quotes

* fix(installer): use robust Windows checksum hashing

* ci: narrow installer debug matrix

* fix(installer): address standalone review hardening

* fix(installer): avoid Windows validation parse errors

* fix(installer): simplify Windows option validation

* fix(installer): harden standalone review fixes
* feat(i18n): expand built-in locale coverage

* feat(cli): add dynamic slash command translation

* test(cli): stabilize session picker assertions

* fix(core): close jsonl readers before cleanup

* fix: address i18n review regressions

* fix(cli): address dynamic i18n review findings

* fix(cli): address i18n review follow-ups

* fix(cli): address i18n review feedback

* test(cli): align i18n parity coverage with strict locales

* fix(cli): address i18n review findings
…LM#3673)

* feat(memory): add autoSkill background project skill extraction

* fix(test): add missing mock methods for autoSkill (getAutoSkillEnabled, recordCompletedToolCall, consumePendingMemoryTaskPromises)

* fix(test): fix cross-platform path comparison in skillReviewNudge integration test

* fix(autoSkill): address critical review comments

- Fix merged_with_extract silent drop: remove broken merge optimization
  in scheduleSkillReview(). When an extract task is pending/running,
  skill review is now scheduled independently instead of recording
  metadata that no production code ever reads.

- Fix SKILL_MANAGE blocked from skill review agent: prepareTools() now
  only enforces the recursion guard (AGENT tool) when the agent has an
  explicit tools list. Wildcard/inherit subagents still get the full
  EXCLUDED_TOOLS_FOR_SUBAGENTS filter, preventing task subagents from
  calling skill_manage. The dedicated skill review agent can now receive
  the skill_manage tool it requires.

- Update manager.test.ts: replace merged_with_extract tests with
  concurrent-extract independent-scheduling tests.
- Update skill-manage.test.ts: clarify test description to reflect
  wildcard-only exclusion semantics.

* fix(autoSkill): reject symlink traversal in skill_manage path guard

assertProjectSkillPath() uses path.resolve() which is purely lexical and
does not dereference symlinks. If any path component inside .qwen/skills/
is a symlink pointing outside the project, fs.writeFile/readFile/rm would
follow the link and mutate files outside the advertised write boundary.

Add assertRealProjectSkillPath() (async) in skill-paths.ts that:
- Resolves the real path of the skills root via fs.realpath()
- Walks up from targetPath to find the nearest existing ancestor
- Resolves that ancestor to its real filesystem path
- Rejects if the real path falls outside the real skills root

skill-manage.ts execute() now calls both the cheap lexical check (fast
fail for obviously wrong paths) and the async real-path check before any
fs.writeFile / fs.rm mutation.

Add three symlink-specific tests in skill-paths.test.ts covering:
- Legitimate path accepted
- Symlinked directory pointing outside skills root rejected
- Skills root itself being a symlink (safe target) accepted

* refactor(autoSkill): remove skill_manage tool, use path-based skill write detection

Address reviewer feedback: instead of keeping skill_manage as the sole
write gate (which still had symlink bypass risk via generic tools), remove
the dedicated tool entirely and replace with a two-layer protection:

1. skillsModifiedInSession (client.ts): detects writes to .qwen/skills/
   by inspecting the file_path arg of every completed tool call, replacing
   the fragile historyCallsSkillManage() history scan.

2. hasAutoSkillSource + evaluateScopedDecision (skillReviewAgentPlanner.ts):
   the review agent's permission sandbox now verifies BOTH that the target
   path is inside the skills directory AND that the existing file already
   contains 'source: auto-skill' in its frontmatter before allowing edits,
   preventing the agent from overwriting user-managed skills.

Changes:
- Delete skill-manage.ts and skill-manage.test.ts
- Remove SKILL_MANAGE from ToolNames, ToolDisplayNames, config registerLazy,
  agent-core EXCLUDED_TOOLS comment, and agent.ts comment
- Replace historyCallsSkillManage() with skillsModified: boolean param in
  scheduleSkillReview; skip reason renamed skills_modified_in_session
- recordCompletedToolCall(name, filePath?) detects .qwen/skills/ writes;
  CLI layers pass file_path arg from tool call request
- Fix buildTaskPrompt frontmatter template to use top-level source: auto-skill
- Update skill-paths.ts error messages to remove skill_manage references
- Update all unit/integration tests accordingly

* fix(autoSkill): deduplicate concurrent skill-review tasks per projectRoot

scheduleSkillReview() was launching a new background task every time the
threshold was reached for the same project, with no guard against multiple
in-flight reviews running concurrently.

Fix: add skillReviewInFlightByProject Map that tracks the taskId of any
running review per projectRoot. A second call while one is in-flight returns
{ status: 'skipped', skippedReason: 'already_running', taskId: <existing> }.
The map entry is cleared in a finally block inside runSkillReview() so the
next session can schedule a fresh review after the current one completes.

Also extend SkillReviewScheduleResult.skippedReason union to include
'already_running', and add a unit test covering the full lifecycle:
first call schedules, second call is skipped with existing taskId, and a
third call after completion schedules a new task.

* fix(autoSkill): address all critical review comments

1. hasAutoSkillSource: narrow catch to ENOENT only (EISDIR/EACCES etc.
   return false to deny); tighten frontmatter regex to match opening block only.

2. evaluateScopedDecision: add explicit allow for READ_FILE and LS so they
   don't fall to 'default' which the base PermissionManager might widen;
   EDIT/WRITE_FILE now call assertRealProjectSkillPath() (async realpath guard)
   in addition to the lexical check, closing the symlink traversal hole.

3. isScopedTool / getScopedDenyRule: cover READ_FILE and LS so hasRelevantRules
   returns true and findMatchingDenyRule is correctly consulted for them.

4. recordCompletedToolCall (client.ts): broaden tool name set to match
   WRITE_TOOL_NAMES in manager.ts (write_file, edit, replace, create_file) and
   inspect all three arg keys (file_path, path, target_file). Signature changed
   from (name, filePath?) to (name, args?) to carry all args through.

5. client.ts hardcoded literals: replace threshold/maxTurns/timeoutMs with the
   named constants AUTO_SKILL_THRESHOLD / DEFAULT_AUTO_SKILL_MAX_TURNS /
   DEFAULT_AUTO_SKILL_TIMEOUT_MS imported from manager.ts and
   skillReviewAgentPlanner.ts.

6. toolCallCount / skillsModifiedInSession reset: only reset when skill review
   is actually scheduled (status === 'scheduled'), not every turn, so the
   counter correctly accumulates across turns within a session as per design doc.

7. runSkillReview (manager.ts): rethrow after marking record failed, consistent
   with runExtract behavior.

8. skillReviewNudge.integration.test.ts test 5: rewrite to reflect the
   in-flight dedup contract (second same-project call returns already_running
   with existing taskId; third call after completion gets a new task). Add
   vi.mock for runSkillReviewByAgent so the test does not need a full Config.

* fix(autoSkill): address all review comments

- skill-paths: detect dangling symlinks with lstat before treating ENOENT as safe
- skill-paths: fix isProjectSkillPath relative path resolution to use projectRoot
- skillReviewAgentPlanner: restrict READ_FILE/LS to project root only
- skillReviewAgentPlanner: remove SHELL tool from review agent tool list
- skillReviewAgentPlanner: add path import; remove unused shell imports
- skillReviewAgentPlanner: add comment for buildAgentHistory trailing user message
- client: fix runManagedAutoMemoryBackgroundTasks gate widening
- client: fix skillsModifiedInSession deadlock
- client: add .catch() to skill review promise
- client: hoist SKILL_WRITE_TOOL_NAMES to module-level ReadonlySet
- agent-core: use full EXCLUDED_TOOLS_FOR_SUBAGENTS for explicit tool list subagents
- manager: extend notify() signature to accept 'skill-review' taskType
- config: fix JSDoc default value comment (false, not true)

* fix(autoSkill): address second round review comments

- client: reset toolCallCount when scheduleSkillReview returns already_running
  and count >= threshold, preventing immediate cascade after in-flight review
- client.test: add autoSkill branch tests (scheduled/already_running/skills_modified)
- client.test: add full recordCompletedToolCall unit tests (skillsModifiedInSession,
  toolCallCount increment, skill path detection for write_file/edit/read_file)
- client.test: add scheduleSkillReview mock to mockMemoryManager
- nonInteractiveCli.test: add assertions for recordCompletedToolCall and
  consumePendingMemoryTaskPromises in tool-call integration test
tanzhenxin and others added 6 commits May 13, 2026 00:18
)

The "fails fast at CLI parse time on invalid JSON Schema" integration
test stopped exercising the Ajv strict-compile path once the
`--json-schema` root-accepts-object precheck landed. The precheck rejects
`{type: "this-is-not-a-real-type"}` before Ajv runs, so the CLI exits
with the "root must accept object-typed values" error instead of the
"is not a valid JSON Schema" error the test expects.

Move the bogus `type` into a property so the root precheck passes and
Ajv catches the unknown type, restoring the test's original intent.
Copilot AI review requested due to automatic review settings May 12, 2026 21:49

Copilot AI 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.

Copilot wasn't able to review this pull request because it exceeds the maximum number of files (300). Try reducing the number of changed files and requesting a review from Copilot again.

@coderabbitai

coderabbitai Bot commented May 12, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 299 files, which is 149 over the limit of 150.

To get a review, narrow the scope:
• coderabbit review --type committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: ee93f620-84e4-4771-8d4f-f395bd6715ff

📥 Commits

Reviewing files that changed from the base of the PR and between 25af116 and 1724be8.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (299)
  • .github/workflows/build-and-publish-image.yml
  • .github/workflows/check-issue-completeness.yml
  • .github/workflows/ci.yml
  • .github/workflows/docs-page-action.yml
  • .github/workflows/e2e.yml
  • .github/workflows/hopcode-issue-followup-bot.yml
  • .github/workflows/hopcode-pr-review.yml
  • .github/workflows/release-sdk-python.yml
  • .github/workflows/release-sdk.yml
  • .github/workflows/release-vscode-companion.yml
  • .github/workflows/release.yml
  • .github/workflows/sdk-python.yml
  • .github/workflows/stale.yml
  • .github/workflows/terminal-bench.yml
  • .gitignore
  • .hopcode/e2e-tests/table-wrap-ansi-highlight.md
  • .hopcode/skills/codegraph/SKILL.md
  • .hopcode/skills/codegraph/bug-analysis.md
  • .hopcode/skills/codegraph/evals/evals.json
  • .hopcode/skills/codegraph/patterns.md
  • .hopcode/skills/codegraph/pr-analysis.md
  • .hopcode/skills/codegraph/schema.md
  • .hopcode/skills/structured-debugging/examples/headless-bg-agent-empty-stdout.md
  • .nvmrc
  • .qwen/commands/qc/create-issue.md
  • AGENTS.md
  • CONTRIBUTING.md
  • Dockerfile
  • README.md
  • docs/MIGRATING_FROM_QWEN_CODE.md
  • docs/archive/BRANDING_REVIEW.md
  • docs/archive/BUILD_FIXES_APPLIED.md
  • docs/archive/BUILD_SUCCESS.md
  • docs/archive/COMPETITIVE_MATRIX.md
  • docs/archive/COMPLETE_SUMMARY.md
  • docs/archive/EXECUTIVE_SUMMARY.md
  • docs/archive/FINAL_CHECKLIST.md
  • docs/archive/FINAL_STATUS.md
  • docs/archive/HOPCODE_REBRANDING_FINAL_STATUS.md
  • docs/archive/LAUNCH_CHECKLIST.md
  • docs/archive/LAUNCH_PLAN.md
  • docs/archive/PROJECT_COMPLETE_SUMMARY.md
  • docs/archive/PROJECT_SUMMARY.md
  • docs/archive/PUBLISHING_AND_LAUNCH.md
  • docs/archive/REBRANDING_EXECUTION_COMPLETE.md
  • docs/archive/REBRANDING_OVERVIEW.md
  • docs/archive/REBRANDING_PLAN.md
  • docs/archive/REBRANDING_QUICKSTART.md
  • docs/design/auth/motivation.md
  • docs/design/channels/channels-design.md
  • docs/design/customize-banner-area/customize-banner-area.md
  • docs/design/customize-banner-area/customize-banner-area.zh-CN.md
  • docs/design/openrouter-auth-and-models.md
  • docs/design/slash-command/phase3-technical-design.md
  • docs/design/slash-command/roadmap.md
  • docs/developers/contributing.md
  • docs/developers/development/telemetry.md
  • docs/developers/sdk-typescript.md
  • docs/developers/tools/web-search.md
  • docs/plans/2026-03-22-agent-tool-display-design.md
  • docs/users/configuration/auth.md
  • docs/users/configuration/model-providers.md
  • docs/users/configuration/settings.md
  • docs/users/extension/extension-releasing.md
  • docs/users/extension/getting-started-extensions.md
  • docs/users/extension/introduction.md
  • docs/users/features/channels/plugins.md
  • docs/users/features/channels/weixin.md
  • docs/users/features/checkpointing.md
  • docs/users/features/commands.md
  • docs/users/features/dual-output.md
  • docs/users/features/language.md
  • docs/users/features/markdown-rendering.md
  • docs/users/features/mcp.md
  • docs/users/features/skills.md
  • docs/users/integration-github-action.md
  • docs/users/integration-jetbrains.md
  • docs/users/integration-zed.md
  • docs/users/overview.md
  • docs/users/quickstart.md
  • docs/users/reference/keyboard-shortcuts.md
  • docs/users/support/tos-privacy.md
  • docs/users/support/troubleshooting.md
  • esbuild.config.js
  • eslint.config.js
  • integration-tests/cli/acp-integration.test.ts
  • integration-tests/cli/cron-tools.test.ts
  • integration-tests/cli/edit.test.ts
  • integration-tests/cli/extensions-install.test.ts
  • integration-tests/cli/file-system.test.ts
  • integration-tests/cli/hopcode-config-dir.test.ts
  • integration-tests/cli/json-output.test.ts
  • integration-tests/cli/json-schema.test.ts
  • integration-tests/cli/list_directory.test.ts
  • integration-tests/cli/mcp_server_cyclic_schema.test.ts
  • integration-tests/cli/monitor.test.ts
  • integration-tests/cli/qwen-config-dir.test.ts
  • integration-tests/cli/read_many_files.test.ts
  • integration-tests/cli/run_shell_command.test.ts
  • integration-tests/cli/save_memory.test.ts
  • integration-tests/cli/settings-migration.test.ts
  • integration-tests/cli/simple-mcp-server.test.ts
  • integration-tests/cli/stdin-context.test.ts
  • integration-tests/cli/telemetry.test.ts
  • integration-tests/cli/todo_write.test.ts
  • integration-tests/cli/tool-search.test.ts
  • integration-tests/cli/utf-bom-encoding.test.ts
  • integration-tests/cli/web_search.test.ts
  • integration-tests/cli/write_file.test.ts
  • integration-tests/globalSetup.ts
  • integration-tests/interactive/context-compress-interactive.test.ts
  • integration-tests/interactive/cron-interactive.test.ts
  • integration-tests/interactive/ctrl-c-exit.test.ts
  • integration-tests/interactive/file-system-interactive.test.ts
  • integration-tests/interactive/mixed-input-crash.test.ts
  • integration-tests/sdk-typescript/mcp-server.test.ts
  • integration-tests/sdk-typescript/single-turn.test.ts
  • integration-tests/sdk-typescript/system-control.test.ts
  • integration-tests/sdk-typescript/tool-control.test.ts
  • integration-tests/terminal-capture/table-inline-code-wrap-regression.ts
  • integration-tests/test-helper.ts
  • integration-tests/test-mcp-server.ts
  • integration-tests/vitest.terminal-bench.config.ts
  • package.json
  • packages/channels/base/package.json
  • packages/channels/base/src/PairingStore.ts
  • packages/channels/base/src/index.ts
  • packages/channels/base/src/paths.test.ts
  • packages/channels/base/src/paths.ts
  • packages/channels/dingtalk/package.json
  • packages/channels/discord/package.json
  • packages/channels/plugin-example/package.json
  • packages/channels/telegram/package.json
  • packages/channels/weixin/package.json
  • packages/channels/weixin/src/accounts.ts
  • packages/cli/index.ts
  • packages/cli/package.json
  • packages/cli/src/acp-integration/acpAgent.test.ts
  • packages/cli/src/acp-integration/acpAgent.ts
  • packages/cli/src/acp-integration/errorCodes.ts
  • packages/cli/src/acp-integration/session/Session.test.ts
  • packages/cli/src/acp-integration/session/Session.ts
  • packages/cli/src/acp-integration/session/rewrite/LlmRewriter.test.ts
  • packages/cli/src/acp-integration/session/rewrite/LlmRewriter.ts
  • packages/cli/src/commands/auth.test.ts
  • packages/cli/src/commands/auth.ts
  • packages/cli/src/commands/auth/handler.ts
  • packages/cli/src/commands/auth/interactiveSelector.test.ts
  • packages/cli/src/commands/auth/interactiveSelector.ts
  • packages/cli/src/commands/auth/openrouter.test.ts
  • packages/cli/src/commands/auth/status.test.ts
  • packages/cli/src/commands/channel/config-utils.test.ts
  • packages/cli/src/commands/channel/config-utils.ts
  • packages/cli/src/commands/channel/pidfile.ts
  • packages/cli/src/commands/channel/start.ts
  • packages/cli/src/commands/channel/status.ts
  • packages/cli/src/commands/extensions.test.tsx
  • packages/cli/src/commands/extensions.tsx
  • packages/cli/src/commands/extensions/consent.test.ts
  • packages/cli/src/commands/extensions/disable.test.ts
  • packages/cli/src/commands/extensions/disable.ts
  • packages/cli/src/commands/extensions/enable.test.ts
  • packages/cli/src/commands/extensions/enable.ts
  • packages/cli/src/commands/extensions/examples/mcp-server/example.ts
  • packages/cli/src/commands/extensions/install.test.ts
  • packages/cli/src/commands/extensions/install.ts
  • packages/cli/src/commands/extensions/link.test.ts
  • packages/cli/src/commands/extensions/link.ts
  • packages/cli/src/commands/extensions/list.test.ts
  • packages/cli/src/commands/extensions/list.ts
  • packages/cli/src/commands/extensions/new.test.ts
  • packages/cli/src/commands/extensions/new.ts
  • packages/cli/src/commands/extensions/settings.test.ts
  • packages/cli/src/commands/extensions/settings.ts
  • packages/cli/src/commands/extensions/uninstall.test.ts
  • packages/cli/src/commands/extensions/uninstall.ts
  • packages/cli/src/commands/extensions/update.test.ts
  • packages/cli/src/commands/extensions/update.ts
  • packages/cli/src/commands/extensions/utils.test.ts
  • packages/cli/src/commands/extensions/utils.ts
  • packages/cli/src/commands/mcp.test.ts
  • packages/cli/src/commands/mcp.ts
  • packages/cli/src/commands/mcp/add.test.ts
  • packages/cli/src/commands/mcp/add.ts
  • packages/cli/src/commands/mcp/list.test.ts
  • packages/cli/src/commands/mcp/list.ts
  • packages/cli/src/commands/mcp/presets.ts
  • packages/cli/src/commands/mcp/reconnect.test.ts
  • packages/cli/src/commands/mcp/reconnect.ts
  • packages/cli/src/commands/mcp/remove.test.ts
  • packages/cli/src/commands/mcp/remove.ts
  • packages/cli/src/commands/model/catalog.ts
  • packages/cli/src/commands/review/load-rules.ts
  • packages/cli/src/commands/review/presubmit.ts
  • packages/cli/src/config/config.integration.test.ts
  • packages/cli/src/config/config.test.ts
  • packages/cli/src/config/config.ts
  • packages/cli/src/config/jsonSchemaArg.test.ts
  • packages/cli/src/config/keyBindings.test.ts
  • packages/cli/src/config/keyBindings.ts
  • packages/cli/src/config/migration/index.test.ts
  • packages/cli/src/config/migration/index.ts
  • packages/cli/src/config/migration/scheduler.test.ts
  • packages/cli/src/config/migration/scheduler.ts
  • packages/cli/src/config/migration/types.ts
  • packages/cli/src/config/migration/versions/v1-to-v2-shared.ts
  • packages/cli/src/config/migration/versions/v1-to-v2.test.ts
  • packages/cli/src/config/migration/versions/v1-to-v2.ts
  • packages/cli/src/config/migration/versions/v2-to-v3.test.ts
  • packages/cli/src/config/migration/versions/v2-to-v3.ts
  • packages/cli/src/config/migration/versions/v3-to-v4.test.ts
  • packages/cli/src/config/migration/versions/v3-to-v4.ts
  • packages/cli/src/config/path-freshness.test.ts
  • packages/cli/src/config/sandboxConfig.ts
  • packages/cli/src/config/settings.test.ts
  • packages/cli/src/config/settings.ts
  • packages/cli/src/config/settingsSchema.test.ts
  • packages/cli/src/config/settingsSchema.ts
  • packages/cli/src/config/trustedFolders.test.ts
  • packages/cli/src/config/trustedFolders.ts
  • packages/cli/src/config/webSearch.ts
  • packages/cli/src/core/auth.ts
  • packages/cli/src/core/initializer.ts
  • packages/cli/src/core/theme.ts
  • packages/cli/src/gemini.test.tsx
  • packages/cli/src/gemini.tsx
  • packages/cli/src/i18n/index.test.ts
  • packages/cli/src/i18n/index.ts
  • packages/cli/src/i18n/languages.ts
  • packages/cli/src/i18n/locales/ca.js
  • packages/cli/src/i18n/locales/de.js
  • packages/cli/src/i18n/locales/en.js
  • packages/cli/src/i18n/locales/fr.js
  • packages/cli/src/i18n/locales/ja.js
  • packages/cli/src/i18n/locales/pt.js
  • packages/cli/src/i18n/locales/ru.js
  • packages/cli/src/i18n/locales/zh-TW.js
  • packages/cli/src/i18n/locales/zh.js
  • packages/cli/src/i18n/mustTranslateKeys.test.ts
  • packages/cli/src/i18n/mustTranslateKeys.ts
  • packages/cli/src/i18n/translationDict.ts
  • packages/cli/src/interactive.test.tsx
  • packages/cli/src/interactive.tsx
  • packages/cli/src/nonInteractive/control/ControlContext.ts
  • packages/cli/src/nonInteractive/control/ControlDispatcher.test.ts
  • packages/cli/src/nonInteractive/control/controllers/systemController.ts
  • packages/cli/src/nonInteractive/session.ts
  • packages/cli/src/nonInteractiveCli.test.ts
  • packages/cli/src/nonInteractiveCli.ts
  • packages/cli/src/nonInteractiveCliCommands.test.ts
  • packages/cli/src/nonInteractiveCliCommands.ts
  • packages/cli/src/patches/is-in-ci.ts
  • packages/cli/src/services/BuiltinCommandLoader.test.ts
  • packages/cli/src/services/BuiltinCommandLoader.ts
  • packages/cli/src/services/BundledSkillLoader.ts
  • packages/cli/src/services/CommandService.test.ts
  • packages/cli/src/services/CommandService.ts
  • packages/cli/src/services/DynamicCommandLocalizationService.test.ts
  • packages/cli/src/services/DynamicCommandLocalizationService.ts
  • packages/cli/src/services/FileCommandLoader-extension.test.ts
  • packages/cli/src/services/FileCommandLoader-markdown.test.ts
  • packages/cli/src/services/FileCommandLoader.test.ts
  • packages/cli/src/services/FileCommandLoader.ts
  • packages/cli/src/services/McpPromptLoader.test.ts
  • packages/cli/src/services/McpPromptLoader.ts
  • packages/cli/src/services/SkillCommandLoader.test.ts
  • packages/cli/src/services/SkillCommandLoader.ts
  • packages/cli/src/services/command-factory.test.ts
  • packages/cli/src/services/command-factory.ts
  • packages/cli/src/services/command-migration-tool.test.ts
  • packages/cli/src/services/command-migration-tool.ts
  • packages/cli/src/services/commandMetadata.test.ts
  • packages/cli/src/services/commandMetadata.ts
  • packages/cli/src/services/commandUtils.test.ts
  • packages/cli/src/services/commandUtils.ts
  • packages/cli/src/services/insight/generators/DataProcessor.test.ts
  • packages/cli/src/services/insight/generators/DataProcessor.ts
  • packages/cli/src/services/insight/types/StaticInsightTypes.ts
  • packages/cli/src/services/markdown-command-parser.test.ts
  • packages/cli/src/services/markdown-command-parser.ts
  • packages/cli/src/services/prompt-processors/argumentProcessor.test.ts
  • packages/cli/src/services/prompt-processors/argumentProcessor.ts
  • packages/cli/src/services/prompt-processors/atFileProcessor.test.ts
  • packages/cli/src/services/prompt-processors/atFileProcessor.ts
  • packages/cli/src/services/prompt-processors/injectionParser.test.ts
  • packages/cli/src/services/prompt-processors/injectionParser.ts
  • packages/cli/src/services/prompt-processors/shellProcessor.test.ts
  • packages/cli/src/services/prompt-processors/shellProcessor.ts
  • packages/cli/src/services/prompt-processors/types.ts
  • packages/cli/src/services/tips/index.ts
  • packages/cli/src/services/tips/tipHistory.test.ts
  • packages/cli/src/services/tips/tipHistory.ts
  • packages/cli/src/services/tips/tipRegistry.ts
  • packages/cli/src/services/tips/tipScheduler.test.ts
  • packages/cli/src/services/tips/tipScheduler.ts
  • packages/cli/src/services/types.ts
  • packages/cli/src/test-utils/customMatchers.ts
  • packages/cli/src/test-utils/mockCommandContext.test.ts
  • packages/cli/src/test-utils/mockCommandContext.ts

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch merge/upstream-safe-commits

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


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

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: d6275bf555

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread package-lock.json
Comment on lines 81 to 84
"node_modules/@adobe/css-tools": {
"version": "4.4.4",
"resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz",
"integrity": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==",
"dev": true,
"license": "MIT"

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Restore lockfile integrity metadata

This lockfile update drops the resolved/integrity fields from registry packages (starting here with @adobe/css-tools). The CI workflow still runs npm run check:lockfile after npm ci (.github/workflows/ci.yml lines 105-109), and running that command in this checkout fails with hundreds of packages reported as missing those fields, so every normal CI run will fail until the lockfile is regenerated with the required metadata.

Useful? React with 👍 / 👎.

if (isGitHubBlobUrl(url)) {
url = convertGitHubBlobToRaw(url);
if (url.includes('github.com') && url.includes('/blob/')) {
url = url
@github-actions

github-actions Bot commented May 12, 2026

Copy link
Copy Markdown

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 71.42% 71.42% 70.72% 79.57%
Core 71.03% 71.03% 79.2% 82.45%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   71.42 |    79.57 |   70.72 |   71.42 |                   
 src               |   67.66 |    64.51 |   71.73 |   67.66 |                   
  gemini.tsx       |   60.46 |    64.35 |   66.66 |   60.46 | ...70-782,790,804 
  interactive.tsx  |   60.55 |    60.22 |   66.66 |   60.55 | ...87,695-698,706 
  ...ractiveCli.ts |   72.43 |     62.5 |   72.72 |   72.43 | ...93,915-916,944 
  ...liCommands.ts |   74.56 |    69.56 |     100 |   74.56 | ...61-285,310,412 
  ...ActiveAuth.ts |     100 |    88.23 |     100 |     100 | 66,80             
 ...cp-integration |   53.94 |    66.66 |   58.82 |   53.94 |                   
  acpAgent.ts      |   56.25 |    67.01 |   65.51 |   56.25 | ...71-873,887-895 
  authMethods.ts   |   12.19 |      100 |       0 |   12.19 | 11-31,34-38,41-50 
  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 |   76.02 |    70.59 |      84 |   76.02 |                   
  ...ryReplayer.ts |   65.93 |    75.67 |   81.81 |   65.93 | ...40-255,268-269 
  Session.ts       |   75.12 |    68.89 |    85.1 |   75.12 | ...2456,2462-2465 
  ...entTracker.ts |   90.85 |    84.84 |      90 |   90.85 | ...35,199,251-260 
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   84.21 |    77.77 |     100 |   84.21 | ...37-153,209-211 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ssion/emitters |   96.01 |    90.75 |    92.3 |   96.01 |                   
  BaseEmitter.ts   |   76.92 |    66.66 |      80 |   76.92 | 23-24,39-40,55-56 
  ...ageEmitter.ts |     100 |    89.47 |     100 |     100 | 109,111           
  PlanEmitter.ts   |     100 |      100 |     100 |     100 |                   
  ...allEmitter.ts |   98.06 |     92.3 |     100 |   98.06 | 227-228,327,335   
  index.ts         |       0 |        0 |       0 |       0 | 1-10              
 ...ession/rewrite |   90.36 |    87.83 |   94.11 |   90.36 |                   
  LlmRewriter.ts   |      81 |       84 |     100 |      81 | ...,88-89,155-159 
  ...Middleware.ts |   95.83 |    85.71 |     100 |   95.83 | 119,127-129       
  TurnBuffer.ts    |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 src/auth          |   97.68 |    94.85 |   95.45 |   97.68 |                   
  allProviders.ts  |     100 |      100 |     100 |     100 |                   
  ...iderConfig.ts |    97.6 |    95.04 |     100 |    97.6 | ...61,411,433-434 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 src/auth/install  |   98.59 |    88.88 |     100 |   98.59 |                   
  ...nstallPlan.ts |   98.59 |    88.88 |     100 |   98.59 | 85,98             
 ...viders/alibaba |   96.96 |    66.66 |   66.66 |   96.96 |                   
  ...baStandard.ts |     100 |      100 |     100 |     100 |                   
  codingPlan.ts    |   93.67 |    66.66 |   66.66 |   93.67 | 83,87-89,94       
  tokenPlan.ts     |     100 |      100 |     100 |     100 |                   
 ...oviders/custom |     100 |      100 |     100 |     100 |                   
  ...omProvider.ts |     100 |      100 |     100 |     100 |                   
 ...roviders/oauth |    91.5 |    77.03 |   97.05 |    91.5 |                   
  openrouter.ts    |   84.37 |    33.33 |     100 |   84.37 | 43-48             
  ...outerOAuth.ts |    91.9 |    79.06 |   96.87 |    91.9 | ...53-655,699-701 
 ...ers/thirdParty |     100 |      100 |     100 |     100 |                   
  deepseek.ts      |     100 |      100 |     100 |     100 |                   
  idealab.ts       |     100 |      100 |     100 |     100 |                   
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  zai.ts           |     100 |      100 |     100 |     100 |                   
 src/commands      |   18.97 |    85.71 |   11.49 |   18.97 |                   
  auth.ts          |     100 |    83.33 |     100 |     100 | 11,14             
  channel.ts       |   56.66 |      100 |       0 |   56.66 | 15-19,27-34       
  cron.ts          |    22.9 |      100 |       0 |    22.9 | ...21-228,237-247 
  dashboard.ts     |   12.35 |      100 |       0 |   12.35 | ...05-118,120-121 
  extensions.tsx   |   96.55 |      100 |      50 |   96.55 | 37                
  grpc.ts          |   12.16 |      100 |       0 |   12.16 | ...94-111,113-114 
  hooks.tsx        |   66.66 |      100 |       0 |   66.66 | 20-24             
  learn.ts         |    4.68 |      100 |       0 |    4.68 | ...02-325,327-328 
  mcp.ts           |   95.23 |      100 |      50 |   95.23 | 30                
  review.ts        |   51.85 |      100 |       0 |   51.85 | 24-35,38          
  search.ts        |    5.18 |      100 |       0 |    5.18 | ...62-190,192-274 
  serve.ts         |    4.74 |      100 |       0 |    4.74 | ...31-351,353-354 
  skills.ts        |   15.64 |      100 |       0 |   15.64 | ...42,351-360,363 
 src/commands/auth |    48.8 |    33.33 |      20 |    48.8 |                   
  handler.ts       |       0 |        0 |       0 |       0 |                   
  ...veSelector.ts |     7.5 |        0 |       0 |     7.5 | 14-56             
  providers.ts     |       0 |        0 |       0 |       0 | 1-331             
  registry.ts      |   95.27 |      100 |       0 |   95.27 | 317-318,325-335   
 ...mmands/channel |    39.2 |    79.45 |      50 |    39.2 |                   
  ...l-registry.ts |    8.33 |      100 |       0 |    8.33 | 6-22,25-43        
  config-utils.ts  |      92 |      100 |   66.66 |      92 | 21-26             
  configure.ts     |    14.7 |      100 |       0 |    14.7 | 18-21,23-84       
  pairing.ts       |   26.31 |      100 |       0 |   26.31 | ...30,40-50,52-65 
  pidfile.ts       |   96.34 |    86.95 |     100 |   96.34 | 49,59,91          
  start.ts         |   30.98 |       52 |   69.23 |   30.98 | ...72-475,484-486 
  status.ts        |   17.85 |      100 |       0 |   17.85 | 15-26,32-76       
  stop.ts          |      20 |      100 |       0 |      20 | 14-48             
 ...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 | ...36-139,142-150 
  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              
 ...ommands/github |   12.61 |      100 |       0 |   12.61 |                   
  auth.ts          |    9.44 |      100 |       0 |    9.44 | ...63-267,269-279 
  commit.ts        |    6.28 |      100 |       0 |    6.28 | ...44-261,263-275 
  index.ts         |   54.16 |      100 |       0 |   54.16 | 30-40             
  issues.ts        |   21.83 |      100 |       0 |   21.83 | ...58-162,171-175 
  pr.ts            |   12.08 |      100 |       0 |   12.08 | ...77-309,318-322 
  status.ts        |   10.25 |      100 |       0 |   10.25 | 24-131,138-146    
 src/commands/mcp  |   86.98 |    86.08 |      80 |   86.98 |                   
  add.ts           |     100 |    98.03 |     100 |     100 | 290               
  list.ts          |   91.22 |    80.76 |      80 |   91.22 | ...19-121,146-147 
  presets.ts       |   64.33 |      100 |       0 |   64.33 | 108-118,120-165   
  reconnect.ts     |   76.72 |    71.42 |   85.71 |   76.72 | 35-48,153-175     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...commands/model |   79.26 |       35 |   35.29 |   79.26 |                   
  catalog.ts       |   99.84 |      100 |      50 |   99.84 | 1371-1372         
  discovery.ts     |      25 |       40 |      50 |      25 | ...04-141,156-237 
  index.ts         |    9.65 |      100 |       0 |    9.65 | ...31-236,238-247 
  ollama.ts        |      24 |    23.07 |      50 |      24 | ...87-193,196-210 
 ...mmands/profile |   27.55 |    26.66 |   13.33 |   27.55 |                   
  handler.ts       |    2.98 |      100 |       0 |    2.98 | 22-179            
  index.ts         |    55.4 |      100 |       0 |    55.4 | ...-87,94-101,104 
  ...eBootstrap.ts |   49.01 |       10 |     100 |   49.01 | 31-38,43-65,69    
  profileStore.ts  |   29.68 |       60 |    37.5 |   29.68 | 40,47-96,102-103  
 ...ommands/review |   11.48 |      100 |       0 |   11.48 |                   
  cleanup.ts       |   17.94 |      100 |       0 |   17.94 | ...01-106,108-109 
  deterministic.ts |   13.75 |      100 |       0 |   13.75 | ...22-738,740-741 
  fetch-pr.ts      |   11.36 |      100 |       0 |   11.36 | ...80-201,203-204 
  load-rules.ts    |   10.34 |      100 |       0 |   10.34 | ...52-164,166-167 
  pr-context.ts    |    6.22 |      100 |       0 |    6.22 | ...97-312,314-315 
  presubmit.ts     |    9.35 |      100 |       0 |    9.35 | ...62-287,289-290 
 ...nds/review/lib |      30 |      100 |       0 |      30 |                   
  gh.ts            |   22.58 |      100 |       0 |   22.58 | ...49,53-54,62-69 
  git.ts           |   22.72 |      100 |       0 |   22.72 | 15-18,29-39,43-44 
  paths.ts         |   52.94 |      100 |       0 |   52.94 | ...26,37-38,42-43 
 src/config        |   90.89 |    80.99 |   84.88 |   90.89 |                   
  auth.ts          |   86.98 |    80.32 |     100 |   86.98 | ...26-227,243-244 
  config.ts        |   82.95 |       80 |   73.07 |   82.95 | ...1829,1853-1854 
  keyBindings.ts   |   96.11 |       50 |     100 |   96.11 | 169-172           
  ...idersScope.ts |      92 |       90 |     100 |      92 | 11-12             
  sandboxConfig.ts |    58.9 |    61.53 |   66.66 |    58.9 | ...54-68,73,77-89 
  settings.ts      |   85.62 |    86.63 |   86.48 |   85.62 | ...1154,1159-1162 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  ...tedFolders.ts |   96.22 |       94 |     100 |   96.22 | ...88-190,205-206 
  webSearch.ts     |   71.27 |    33.33 |     100 |   71.27 | ...44-145,157-158 
 ...nfig/migration |   94.89 |    78.94 |   83.33 |   94.89 |                   
  index.ts         |   94.87 |    88.88 |     100 |   94.87 | 91-92             
  scheduler.ts     |   96.55 |    77.77 |     100 |   96.55 | 19-20             
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ation/versions |   94.74 |       96 |     100 |   94.74 |                   
  ...-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 |                   
  v3-to-v4.ts      |     100 |      100 |     100 |     100 |                   
 src/constants     |      25 |      100 |       0 |      25 |                   
  codingPlan.ts    |      25 |      100 |       0 |      25 | 18-27             
 src/core          |     100 |      100 |     100 |     100 |                   
  auth.ts          |     100 |      100 |     100 |     100 |                   
  initializer.ts   |     100 |      100 |     100 |     100 |                   
  theme.ts         |     100 |      100 |     100 |     100 |                   
 src/dualOutput    |   63.09 |    64.51 |   55.55 |   63.09 |                   
  ...tputBridge.ts |   62.94 |    65.51 |   56.25 |   62.94 | ...22-323,331-334 
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/export        |       0 |        0 |       0 |       0 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-7               
 src/generated     |     100 |      100 |     100 |     100 |                   
  git-commit.ts    |     100 |      100 |     100 |     100 |                   
 src/i18n          |   80.89 |    79.56 |   47.61 |   80.89 |                   
  index.ts         |   68.18 |    76.36 |   36.36 |   68.18 | ...67-268,278-283 
  languages.ts     |   95.33 |    86.48 |     100 |   95.33 | ...67,195-198,213 
  ...nslateKeys.ts |     100 |      100 |     100 |     100 |                   
  ...lationDict.ts |       0 |        0 |       0 |       0 | 1-25              
 src/i18n/locales  |     100 |      100 |     100 |     100 |                   
  ca.js            |     100 |      100 |     100 |     100 |                   
  de.js            |     100 |      100 |     100 |     100 |                   
  en.js            |     100 |      100 |     100 |     100 |                   
  fr.js            |     100 |      100 |     100 |     100 |                   
  ja.js            |     100 |      100 |     100 |     100 |                   
  pt.js            |     100 |      100 |     100 |     100 |                   
  ru.js            |     100 |      100 |     100 |     100 |                   
  zh-TW.js         |     100 |      100 |     100 |     100 |                   
  zh.js            |     100 |      100 |     100 |     100 |                   
 ...nonInteractive |   72.75 |    72.14 |   74.07 |   72.75 |                   
  session.ts       |   76.94 |    70.45 |   85.71 |   76.94 | ...77-778,787-797 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...80-581,584-585 
 ...active/control |   77.04 |    91.83 |      80 |   77.04 |                   
  ...rolContext.ts |    7.14 |      100 |       0 |    7.14 | 49-84             
  ...Dispatcher.ts |   91.66 |    91.83 |   88.88 |   91.66 | ...54-372,388,391 
  ...rolService.ts |       8 |      100 |       0 |       8 | 46-179            
 ...ol/controllers |    7.04 |       80 |   13.33 |    7.04 |                   
  ...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 | ...58-376,386-491 
  ...Controller.ts |   14.06 |      100 |       0 |   14.06 | ...82-117,130-133 
  ...Controller.ts |     5.2 |      100 |       0 |     5.2 | ...21-433,442-472 
 .../control/types |       0 |        0 |       0 |       0 |                   
  serviceAPIs.ts   |       0 |        0 |       0 |       0 | 1                 
 ...Interactive/io |   97.62 |    93.22 |   95.18 |   97.62 |                   
  ...putAdapter.ts |   97.37 |    92.14 |   98.07 |   97.37 | ...1373,1398-1399 
  ...putAdapter.ts |      96 |    91.66 |   85.71 |      96 | 51-52             
  ...nputReader.ts |     100 |    94.73 |     100 |     100 | 67                
  ...putAdapter.ts |   98.28 |      100 |      90 |   98.28 | 81-82,122-123     
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/patches       |       0 |        0 |       0 |       0 |                   
  is-in-ci.ts      |       0 |        0 |       0 |       0 | 1-17              
 src/remoteInput   |   86.98 |       75 |   85.71 |   86.98 |                   
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  ...putWatcher.ts |   88.12 |    76.08 |   91.66 |   88.12 | ...21-222,233-236 
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/services      |   92.85 |     90.9 |   98.36 |   92.85 |                   
  ...mandLoader.ts |     100 |     92.3 |     100 |     100 | 95                
  ...killLoader.ts |     100 |    96.15 |     100 |     100 | 45                
  ...andService.ts |   98.75 |      100 |     100 |   98.75 | 111               
  ...ionService.ts |   97.19 |    89.77 |     100 |   97.19 | ...85,423-424,428 
  ...mandLoader.ts |   86.83 |    83.87 |     100 |   86.83 | ...30-335,340-345 
  ...omptLoader.ts |   76.05 |    80.64 |   83.33 |   76.05 | ...09-210,276-277 
  ...mandLoader.ts |     100 |      100 |     100 |     100 |                   
  ...nd-factory.ts |    91.5 |    91.66 |     100 |    91.5 | 129,138-145       
  ...ation-tool.ts |     100 |    95.45 |     100 |     100 | 125               
  ...ndMetadata.ts |   98.18 |    96.66 |     100 |   98.18 | 81,85             
  commandUtils.ts  |      96 |    91.66 |     100 |      96 | 48                
  ...and-parser.ts |   90.69 |    85.71 |     100 |   90.69 | 60-63             
  ...ionService.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...ght/generators |    85.9 |    85.61 |   90.47 |    85.9 |                   
  DataProcessor.ts |   85.63 |     85.6 |   92.85 |   85.63 | ...1122,1126-1133 
  ...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.33 |    94.04 |     100 |   97.33 |                   
  ...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.51 |    95.65 |     100 |   97.51 | 95-98             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services/tips |   97.37 |    83.07 |     100 |   97.37 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  tipHistory.ts    |   92.66 |       70 |     100 |   92.66 | ...22,147,154,163 
  tipRegistry.ts   |     100 |    95.23 |     100 |     100 | 33                
  tipScheduler.ts  |     100 |    91.66 |     100 |     100 | 55                
 src/test-utils    |   85.11 |    89.28 |   76.92 |   85.11 |                   
  ...omMatchers.ts |   69.69 |       50 |      50 |   69.69 | 32-35,37-39,45-47 
  ...andContext.ts |     100 |      100 |     100 |     100 |                   
  render.tsx       |    82.4 |    91.11 |   77.27 |    82.4 | ...62-270,272-279 
 src/ui            |   65.28 |    67.73 |   54.76 |   65.28 |                   
  App.tsx          |     100 |      100 |     100 |     100 |                   
  AppContainer.tsx |   68.12 |     62.4 |      75 |   68.12 | ...2437,2441-2445 
  ...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        |   52.72 |      100 |   23.52 |   52.72 | ...52,54-55,60-61 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  keyMatchers.ts   |   95.91 |    96.42 |     100 |   95.91 | 25-26             
  ...tic-colors.ts |     100 |      100 |     100 |     100 |                   
  textConstants.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/auth       |   47.45 |    58.73 |   21.42 |   47.45 |                   
  AuthDialog.tsx   |   64.37 |    44.44 |   16.66 |   64.37 | ...58,365-387,391 
  ...nProgress.tsx |       0 |        0 |       0 |       0 | 1-64              
  ...etupSteps.tsx |    9.61 |      100 |       0 |    9.61 | ...35-352,391-476 
  useAuth.ts       |   73.69 |    68.29 |     100 |   73.69 | ...95,497-512,573 
  ...rSetupFlow.ts |   44.61 |    33.33 |      50 |   44.61 | ...57-378,395-438 
 src/ui/commands   |   50.12 |    79.15 |   75.87 |   50.12 |                   
  aboutCommand.ts  |     100 |    85.71 |     100 |     100 | 36                
  ...nceCommand.ts |       0 |        0 |       0 |       0 | 1-771             
  agentsCommand.ts |   83.78 |      100 |      60 |   83.78 | 30-32,42-44       
  ...odeCommand.ts |     100 |      100 |     100 |     100 |                   
  arenaCommand.ts  |   62.81 |    58.73 |   65.21 |   62.81 | ...91-596,681-689 
  authCommand.ts   |     100 |      100 |     100 |     100 |                   
  branchCommand.ts |     100 |      100 |     100 |     100 |                   
  btwCommand.ts    |   95.59 |    71.42 |     100 |   95.59 | 72,154-159        
  bugCommand.ts    |   81.13 |    71.42 |     100 |   81.13 | 60-69             
  ciCommand.ts     |       0 |        0 |       0 |       0 | 1-346             
  clearCommand.ts  |   92.94 |       75 |     100 |   92.94 | 45-46,74-75,93-94 
  ...essCommand.ts |    64.7 |       50 |      75 |    64.7 | ...48-149,163-166 
  ...extCommand.ts |   35.24 |    28.57 |   45.45 |   35.24 | ...86-521,532-533 
  copyCommand.ts   |   98.28 |    94.89 |     100 |   98.28 | ...80,280,321,327 
  deleteCommand.ts |     100 |      100 |     100 |     100 |                   
  diffCommand.ts   |   99.02 |    86.11 |     100 |   99.02 | 222,226           
  ...ryCommand.tsx |   68.09 |    77.77 |   77.77 |   68.09 | ...56-261,315-323 
  docsCommand.ts   |     100 |    88.88 |     100 |     100 | 25                
  doctorCommand.ts |     100 |    93.33 |     100 |     100 | 21                
  dreamCommand.ts  |      75 |    66.66 |   66.66 |      75 | 22-27,44-47       
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  exportCommand.ts |      60 |    92.85 |   77.77 |      60 | 176-317           
  ...onsCommand.ts |   48.66 |     90.9 |   63.63 |   48.66 | ...05-109,159-211 
  forgetCommand.ts |   26.82 |      100 |      50 |   26.82 | 18-51             
  ...uthCommand.ts |       0 |        0 |       0 |       0 | 1-295             
  githubCommand.ts |       0 |        0 |       0 |       0 | 1-248             
  ...uthCommand.ts |       0 |        0 |       0 |       0 | 1-191             
  helpCommand.ts   |     100 |      100 |     100 |     100 |                   
  ...oryCommand.ts |    41.5 |      100 |   43.75 |    41.5 | ...87-202,217-245 
  hooksCommand.ts  |   19.86 |       40 |      40 |   19.86 | ...48-180,204-209 
  ideCommand.ts    |   60.75 |    64.28 |   41.17 |   60.75 | ...05-306,310-324 
  initCommand.ts   |   84.33 |    72.72 |     100 |   84.33 | 68,82-87,89-94    
  ...ghtCommand.ts |   74.56 |    68.42 |     100 |   74.56 | ...31-245,250-273 
  ...ageCommand.ts |   85.76 |    82.82 |     100 |   85.76 | ...51-658,687-694 
  ...ateCommand.ts |       0 |        0 |       0 |       0 | 1-920             
  ...elsCommand.ts |     100 |      100 |     100 |     100 |                   
  mcpCommand.ts    |     100 |      100 |     100 |     100 |                   
  ...ditCommand.ts |       0 |        0 |       0 |       0 | 1-795             
  memoryCommand.ts |     100 |      100 |     100 |     100 |                   
  modelCommand.ts  |   74.56 |    79.06 |   71.42 |   74.56 | ...91-200,223-228 
  ...onsCommand.ts |     100 |      100 |     100 |     100 |                   
  planCommand.ts   |   78.82 |    76.92 |     100 |   78.82 | 30-35,51-56,68-73 
  ...verCommand.ts |       0 |        0 |       0 |       0 | 1-1109            
  quitCommand.ts   |     100 |      100 |     100 |     100 |                   
  recapCommand.ts  |   21.81 |      100 |      50 |   21.81 | 24-73             
  ...berCommand.ts |   32.43 |      100 |      50 |   32.43 | 23-57             
  renameCommand.ts |   85.29 |    78.18 |     100 |   85.29 | ...06-313,320-325 
  ...oreCommand.ts |    92.3 |    87.87 |     100 |    92.3 | ...,83-88,129-130 
  resumeCommand.ts |     100 |      100 |     100 |     100 |                   
  rewindCommand.ts |      80 |      100 |      50 |      80 | 19-21             
  ...iewCommand.ts |       0 |        0 |       0 |       0 | 1-797             
  ...ngsCommand.ts |     100 |      100 |     100 |     100 |                   
  ...hubCommand.ts |   81.43 |    65.21 |      80 |   81.43 | ...70-173,176-179 
  skillsCommand.ts |   15.04 |      100 |      25 |   15.04 | ...90-106,109-136 
  statsCommand.ts  |   88.19 |    84.21 |     100 |   88.19 | ...,58-61,143-146 
  ...ineCommand.ts |     100 |      100 |     100 |     100 |                   
  ...aryCommand.ts |    6.46 |      100 |      50 |    6.46 | 28-326            
  tasksCommand.ts  |   77.45 |    73.43 |     100 |   77.45 | ...55-159,181-186 
  ...tupCommand.ts |     100 |      100 |     100 |     100 |                   
  themeCommand.ts  |     100 |      100 |     100 |     100 |                   
  toolsCommand.ts  |     100 |      100 |     100 |     100 |                   
  trustCommand.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  vimCommand.ts    |   54.54 |      100 |      50 |   54.54 | 19-29             
 src/ui/components |    58.6 |    73.78 |   65.93 |    58.6 |                   
  AboutBox.tsx     |     100 |      100 |     100 |     100 |                   
  AnsiOutput.tsx   |   65.57 |      100 |      50 |   65.57 | 65-86             
  ApiKeyInput.tsx  |       0 |        0 |       0 |       0 | 1-97              
  AppHeader.tsx    |   89.39 |       75 |     100 |   89.39 | 35,37-42,44       
  ...odeDialog.tsx |     9.7 |      100 |       0 |     9.7 | 35-47,50-182      
  AsciiArt.ts      |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |   14.63 |      100 |       0 |   14.63 | 18-56             
  ...TextInput.tsx |   77.01 |       76 |     100 |   77.01 | ...20,234-236,263 
  Composer.tsx     |    80.8 |     64.7 |     100 |    80.8 | ...85,103,154,167 
  ...entPrompt.tsx |     100 |      100 |     100 |     100 |                   
  ...ryDisplay.tsx |   75.89 |    62.06 |     100 |   75.89 | ...,85,90-105,110 
  ...geDisplay.tsx |   68.42 |    57.14 |     100 |   68.42 | 16-17,31-32,42-50 
  ...ification.tsx |   28.57 |      100 |       0 |   28.57 | 16-36             
  ...gProfiler.tsx |       0 |        0 |       0 |       0 | 1-36              
  ...ogManager.tsx |   12.46 |      100 |       0 |   12.46 | 63-472            
  ...ngsDialog.tsx |    8.44 |      100 |       0 |    8.44 | 34-192            
  ExitWarning.tsx  |     100 |      100 |     100 |     100 |                   
  ...hProgress.tsx |    87.8 |    33.33 |     100 |    87.8 | 28-31,56          
  ...ustDialog.tsx |     100 |      100 |     100 |     100 |                   
  Footer.tsx       |   79.33 |    59.37 |     100 |   79.33 | ...82,89-93,95-99 
  ...ngSpinner.tsx |   56.14 |       40 |      50 |   56.14 | ...3,80-81,95-100 
  Header.tsx       |   98.62 |    94.28 |     100 |   98.62 | 162,164           
  Help.tsx         |   98.32 |    89.88 |     100 |   98.32 | ...24,381,447-448 
  ...emDisplay.tsx |   60.25 |       36 |     100 |   60.25 | ...41,344,347-360 
  ...hProgress.tsx |   85.25 |    88.46 |     100 |   85.25 | 121-147           
  ...ngSpinner.tsx |    22.8 |      100 |       0 |    22.8 | 35-52,60-100      
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |   82.33 |    77.67 |   83.33 |   82.33 | ...1347,1411,1461 
  ...Shortcuts.tsx |   20.87 |      100 |       0 |   20.87 | ...6,49-51,67-125 
  ...Indicator.tsx |     100 |    91.42 |     100 |     100 | 65,74             
  ...firmation.tsx |   91.42 |      100 |      50 |   91.42 | 26-31             
  MainContent.tsx  |   81.75 |       75 |     100 |   81.75 | ...70-274,282-286 
  ...elsDialog.tsx |   16.07 |    89.18 |      50 |   16.07 | ...58-159,162-648 
  MemoryDialog.tsx |   53.21 |    51.21 |   57.14 |   53.21 | ...54,366,379-381 
  ...geDisplay.tsx |       0 |        0 |       0 |       0 | 1-41              
  ModelDialog.tsx  |   73.88 |    42.67 |     100 |   73.88 | ...75-880,908-912 
  ...tsDisplay.tsx |     100 |    97.22 |     100 |     100 | 270               
  ...fications.tsx |   18.18 |      100 |       0 |   18.18 | 15-58             
  ...onsDialog.tsx |    2.13 |      100 |       0 |    2.13 | 62-133,148-1004   
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...icePrompt.tsx |   88.14 |    83.87 |     100 |   88.14 | ...01-105,133-138 
  PrepareLabel.tsx |   91.66 |    77.27 |     100 |   91.66 | 73-75,77-79,110   
  ...derDialog.tsx |       0 |        0 |       0 |       0 | 1-625             
  ...atePrompt.tsx |    8.57 |      100 |       0 |    8.57 | 24-55,58-134      
  ...geDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ngDisplay.tsx |   21.42 |      100 |       0 |   21.42 | 13-39             
  ...dSelector.tsx |    4.45 |      100 |       0 |    4.45 | 28-92,100-328     
  ...ionPicker.tsx |    97.2 |    90.56 |     100 |    97.2 | 107,140,304-308   
  ...onPreview.tsx |   92.42 |    84.37 |     100 |   92.42 | ...,70-71,143-145 
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...putPrompt.tsx |   72.56 |       80 |      40 |   72.56 | ...06-109,114-117 
  ...ngsDialog.tsx |   67.53 |    74.71 |     100 |   67.53 | ...11-819,825-826 
  ...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 |   57.14 |      100 |       0 |   57.14 | 12-15             
  ...MoreLines.tsx |      28 |      100 |       0 |      28 | 18-40             
  ...ionPicker.tsx |   17.59 |      100 |       0 |   17.59 | 55-172            
  StatsDisplay.tsx |   97.44 |    94.11 |     100 |   97.44 | 296-301           
  ...yTodoList.tsx |   94.17 |       80 |     100 |   94.17 | 56-57,131-134     
  ...nsDisplay.tsx |   87.25 |       64 |     100 |   87.25 | ...45-147,154-156 
  ThemeDialog.tsx  |   89.95 |    46.15 |      75 |   89.95 | ...71-173,243-245 
  Tips.tsx         |   93.54 |       75 |     100 |   93.54 | 39-40             
  TodoDisplay.tsx  |     100 |      100 |     100 |     100 |                   
  ...tsDisplay.tsx |     100 |     87.5 |     100 |     100 | 31-32             
  TrustDialog.tsx  |     100 |    81.81 |     100 |     100 | 71-86             
  ...ification.tsx |   36.36 |      100 |       0 |   36.36 | 15-22             
  ...ackDialog.tsx |    7.84 |      100 |       0 |    7.84 | 24-134            
 ...nts/agent-view |    25.2 |       90 |      10 |    25.2 |                   
  ...atContent.tsx |    8.79 |      100 |       0 |    8.79 | 53-265,271-273    
  ...tChatView.tsx |   21.05 |      100 |       0 |   21.05 | 21-39             
  ...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.13 |      100 |       0 |    8.13 | 39-59,64-187      
  ...oryAdapter.ts |     100 |    91.83 |     100 |     100 | 103,109-110,138   
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
 ...mponents/arena |   45.72 |    70.53 |   60.86 |   45.72 |                   
  ArenaCards.tsx   |   73.06 |    71.79 |   85.71 |   73.06 | ...83-185,321-326 
  ...ectDialog.tsx |   83.48 |    69.86 |   88.88 |   83.48 | ...88-392,409-410 
  ...artDialog.tsx |   10.15 |      100 |       0 |   10.15 | 27-161            
  ...tusDialog.tsx |    5.63 |      100 |       0 |    5.63 | 33-75,80-288      
  ...topDialog.tsx |    6.17 |      100 |       0 |    6.17 | 33-213            
 ...ackground-view |   75.44 |     83.6 |   85.29 |   75.44 |                   
  ...sksDialog.tsx |   70.05 |       79 |   76.19 |   70.05 | ...1119,1195-1197 
  ...TasksPill.tsx |   70.83 |    86.95 |     100 |   70.83 | 44,84-96,104-112  
  ...gentPanel.tsx |   99.52 |    93.18 |     100 |   99.52 | 123               
 ...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 |   72.24 |    70.52 |      80 |   72.24 |                   
  ...etailStep.tsx |   96.52 |       75 |     100 |   96.52 | 33,37,50,59       
  ...etailStep.tsx |   93.27 |    73.68 |     100 |   93.27 | 41-42,99-104,110  
  ...abledStep.tsx |     100 |      100 |     100 |     100 |                   
  ...sListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   36.09 |    47.05 |      50 |   36.09 | ...49,453-466,470 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-13              
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...components/mcp |    21.4 |    83.72 |   83.33 |    21.4 |                   
  ...ealthPill.tsx |   68.42 |    85.71 |     100 |   68.42 | 40-46             
  ...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         |   94.79 |    85.71 |     100 |   94.79 | 16,20,35,109-110  
 ...ents/mcp/steps |    6.65 |      100 |       0 |    6.65 |                   
  ...icateStep.tsx |     5.1 |      100 |       0 |     5.1 | 34-95,98-334      
  ...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 |   82.15 |    80.23 |   72.85 |   82.15 |                   
  ...ionDialog.tsx |   77.35 |    74.54 |    62.5 |   77.35 | ...90,508,526-528 
  BtwMessage.tsx   |     100 |      100 |     100 |     100 |                   
  ...upDisplay.tsx |   97.67 |    83.72 |     100 |   97.67 | 118,141,149       
  ...onMessage.tsx |   91.93 |    82.35 |     100 |   91.93 | 57-59,61,63       
  ...nMessages.tsx |   79.06 |      100 |      70 |   79.06 | ...51-264,268-280 
  DiffRenderer.tsx |   93.19 |    86.17 |     100 |   93.19 | ...09,237-238,304 
  ...tsDisplay.tsx |   97.82 |    77.27 |     100 |   97.82 | 87,89             
  ...ssMessage.tsx |    12.5 |      100 |       0 |    12.5 | 18-59             
  ...edMessage.tsx |   16.66 |      100 |       0 |   16.66 | 22-38             
  ...sMessages.tsx |   55.67 |       40 |   28.57 |   55.67 | ...20-125,133-145 
  ...ryMessage.tsx |   14.28 |      100 |       0 |   14.28 | 23-62             
  ...onMessage.tsx |   81.02 |    69.23 |   33.33 |   81.02 | ...24-426,433-435 
  ...upMessage.tsx |      84 |    93.61 |     100 |      84 | ...56-383,405-420 
  ToolMessage.tsx  |   88.84 |    75.71 |    92.3 |   88.84 | ...44-749,776-778 
 ...ponents/shared |   82.47 |    77.41 |   92.75 |   82.47 |                   
  ...ctionList.tsx |   99.03 |    95.65 |     100 |   99.03 | 85                
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  EnumSelector.tsx |     100 |    96.42 |     100 |     100 | 58                
  MaxSizedBox.tsx  |   83.01 |    86.15 |   88.88 |   83.01 | ...12-513,618-619 
  MultiSelect.tsx  |    6.29 |      100 |       0 |    6.29 | 35-42,45-176      
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...eSelector.tsx |     100 |       60 |     100 |     100 | 40-45             
  TextInput.tsx    |   73.29 |    54.05 |      80 |   73.29 | ...13-217,229-235 
  ...apsedTime.tsx |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |     100 |      100 |     100 |     100 |                   
  text-buffer.ts   |   83.78 |     75.9 |   97.61 |   83.78 | ...2252,2300,2368 
  ...er-actions.ts |   86.71 |    67.79 |     100 |   86.71 | ...07-608,809-811 
 ...ents/subagents |   30.87 |        0 |       0 |   30.87 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
  reducers.tsx     |    12.1 |      100 |       0 |    12.1 | 33-190            
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |   10.95 |      100 |       0 |   10.95 | ...1,56-57,60-102 
 ...bagents/create |    9.13 |      100 |       0 |    9.13 |                   
  ...ionWizard.tsx |    7.28 |      100 |       0 |    7.28 | 34-299            
  ...rSelector.tsx |   14.75 |      100 |       0 |   14.75 | 26-85             
  ...onSummary.tsx |    4.26 |      100 |       0 |    4.26 | 24-328            
  ...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.39 |      100 |       0 |    8.39 |                   
  ...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 |   13.72 |      100 |       0 |   13.72 | 18-73             
  ...gerDialog.tsx |    6.74 |      100 |       0 |    6.74 | 35-341            
 ...mponents/views |   42.16 |    69.23 |   21.42 |   42.16 |                   
  ContextUsage.tsx |     4.7 |      100 |       0 |     4.7 | ...52-167,170-456 
  DoctorReport.tsx |     9.8 |      100 |       0 |     9.8 | 25-54,57-131      
  ...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   |   77.05 |    77.81 |   82.14 |   77.05 |                   
  ...ewContext.tsx |   65.77 |      100 |      75 |   65.77 | ...22-225,231-241 
  AppContext.tsx   |      80 |       50 |     100 |      80 | 19-20             
  ...ewContext.tsx |   93.37 |    68.57 |      50 |   93.37 | ...94-195,222-226 
  ...deContext.tsx |     100 |      100 |     100 |     100 |                   
  ...igContext.tsx |   81.81 |       50 |     100 |   81.81 | 15-16             
  ...ssContext.tsx |   81.88 |    81.72 |     100 |   81.88 | ...1153,1159-1161 
  ...owContext.tsx |   89.28 |       80 |   66.66 |   89.28 | 34,47-48,60-62    
  ...deContext.tsx |     100 |      100 |      50 |     100 |                   
  ...onContext.tsx |   43.28 |     62.5 |    62.5 |   43.28 | ...58-261,265-268 
  ...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             
  ...utContext.tsx |   85.71 |      100 |   66.66 |   85.71 | 13-14             
  ...nsContext.tsx |   88.23 |       50 |     100 |   88.23 | 108-109           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 173-174           
  ...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/history    |   40.85 |    81.81 |   41.17 |   40.85 |                   
  HistoryVault.ts  |   40.85 |    81.81 |   41.17 |   40.85 | ...19-248,253-261 
 src/ui/hooks      |   81.48 |     81.5 |   86.05 |   81.48 |                   
  ...dProcessor.ts |   83.23 |    82.56 |     100 |   83.23 | ...90-391,410-437 
  keyToAnsi.ts     |    3.92 |      100 |       0 |    3.92 | 19-77             
  ...dProcessor.ts |    94.8 |    70.58 |     100 |    94.8 | ...76-277,282-283 
  ...dProcessor.ts |   74.76 |    61.22 |   61.53 |   74.76 | ...23,947,966-970 
  ...amingState.ts |   12.22 |      100 |       0 |   12.22 | 54-158            
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...ationFrame.ts |      32 |       60 |     100 |      32 | 42-44,51-90       
  ...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 |   92.07 |    96.29 |     100 |   92.07 | 116-124           
  ...tIndicator.ts |     100 |    93.75 |     100 |     100 | 63                
  ...waySummary.ts |   96.22 |    69.69 |     100 |   96.22 | 125-127,169       
  ...ndTaskView.ts |   94.11 |    76.92 |     100 |   94.11 | 119-123,216,222   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   93.75 |    73.17 |     100 |   93.75 | ...68-169,221-222 
  ...ompletion.tsx |   95.95 |    82.75 |     100 |   95.95 | ...22-223,225-226 
  ...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 
  ...nitMessage.ts |     100 |      100 |     100 |     100 |                   
  ...extualTips.ts |   76.92 |       50 |     100 |   76.92 | 55,68,71-75,88-96 
  ...eteCommand.ts |   33.33 |       50 |     100 |   33.33 | 30,34,41-90       
  ...ialogClose.ts |   16.66 |      100 |     100 |   16.66 | 79-139            
  ...oublePress.ts |   53.12 |       75 |     100 |   53.12 | 33-35,41-54       
  ...orSettings.ts |     100 |      100 |     100 |     100 |                   
  ...Completion.ts |   99.12 |    97.67 |     100 |   99.12 | 182-183           
  ...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 |   54.47 |       50 |   33.33 |   54.47 | ...69-171,193-194 
  useFocus.ts      |     100 |      100 |     100 |     100 |                   
  ...olderTrust.ts |     100 |      100 |     100 |     100 |                   
  ...ggestions.tsx |   89.15 |     62.5 |      50 |   89.15 | ...22-124,149-150 
  ...miniStream.ts |   75.92 |    72.95 |   91.66 |   75.92 | ...2300,2313-2321 
  ...BranchName.ts |    90.9 |     92.3 |     100 |    90.9 | 19-20,55-58       
  ...oryManager.ts |   89.84 |    93.75 |     100 |   89.84 | ...53-154,164-166 
  ...ooksDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...opCodeAuth.ts |     100 |      100 |     100 |     100 |                   
  ...stListener.ts |     100 |      100 |     100 |     100 |                   
  ...nAuthError.ts |   76.19 |       50 |     100 |   76.19 | 39-40,43-45       
  ...putHistory.ts |   92.59 |    85.71 |     100 |   92.59 | 63-64,72,94-96    
  ...storyStore.ts |     100 |    94.11 |     100 |     100 | 69                
  useKeypress.ts   |     100 |      100 |     100 |     100 |                   
  ...rdProtocol.ts |   36.36 |      100 |       0 |   36.36 | 24-31             
  ...unchEditor.ts |    9.67 |      100 |       0 |    9.67 | 11-32,39-90       
  ...gIndicator.ts |     100 |      100 |     100 |     100 |                   
  useLogger.ts     |   21.05 |      100 |       0 |   21.05 | 15-37             
  useMCPHealth.ts  |   63.15 |       75 |      50 |   63.15 | 42-52,64-67       
  ...elsCommand.ts |     100 |      100 |     100 |     100 |                   
  useMcpDialog.ts  |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...moryDialog.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.74 |    76.47 |     100 |   84.74 | ...49,52-53,69-71 
  ...derCommand.ts |       0 |        0 |       0 |       0 | 1-27              
  ...derUpdates.ts |   86.38 |    77.19 |     100 |   86.38 | ...22,281-293,341 
  ...lScheduler.ts |    84.7 |    93.33 |     100 |    84.7 | ...71-276,372-382 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  ...umeCommand.ts |   97.24 |    76.92 |     100 |   97.24 | 104-105,145       
  ...ompletion.tsx |   90.59 |    83.33 |     100 |   90.59 | ...01,104,137-140 
  ...ectionList.ts |   96.96 |    95.69 |     100 |   96.96 | ...82-183,237-240 
  ...sionPicker.ts |   93.15 |    82.14 |     100 |   93.15 | ...87-288,309-311 
  ...earchInput.ts |     100 |      100 |     100 |     100 |                   
  ...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 |   82.67 |    85.41 |   94.73 |   82.67 | ...68-670,678-714 
  ...tateAndRef.ts |     100 |      100 |     100 |     100 |                   
  useStatusLine.ts |     100 |    98.79 |     100 |     100 | 257               
  ...eateDialog.ts |   88.23 |      100 |     100 |   88.23 | 14,18             
  ...tification.ts |     100 |    85.71 |     100 |     100 | 47                
  ...alProgress.ts |   53.06 |       50 |   66.66 |   53.06 | ...53,61-68,79-85 
  ...rminalSize.ts |      60 |    83.33 |      50 |      60 | 24-37,43-44       
  ...emeCommand.ts |   67.01 |    29.41 |     100 |   67.01 | ...10-111,115-116 
  useTimer.ts      |   88.09 |    85.71 |     100 |   88.09 | 44-45,51-53       
  ...lMigration.ts |       0 |        0 |       0 |       0 |                   
  ...rustModify.ts |     100 |      100 |     100 |     100 |                   
  ...elcomeBack.ts |   87.36 |     90.9 |     100 |   87.36 | ...,94-96,114-115 
  vim.ts           |   83.77 |    80.31 |     100 |   83.77 | ...55,759-767,776 
 src/ui/layouts    |   89.72 |     87.5 |     100 |   89.72 |                   
  ...AppLayout.tsx |   89.88 |     87.5 |     100 |   89.88 | 51-53,93-98       
  ...AppLayout.tsx |   89.47 |     87.5 |     100 |   89.47 | 58-63             
 ...i/manageModels |   58.14 |    48.38 |     100 |   58.14 |                   
  manageModels.ts  |   58.14 |    48.38 |     100 |   58.14 | ...19,232,263-317 
 src/ui/models     |   80.24 |    79.16 |   71.42 |   80.24 |                   
  ...ableModels.ts |   80.24 |    79.16 |   71.42 |   80.24 | ...,61-71,123-125 
 ...noninteractive |     100 |      100 |    6.66 |     100 |                   
  ...eractiveUi.ts |     100 |      100 |    6.66 |     100 |                   
 src/ui/state      |   94.91 |    81.81 |     100 |   94.91 |                   
  extensions.ts    |   94.91 |    81.81 |     100 |   94.91 | 68-69,88          
 src/ui/themes     |   98.53 |    70.31 |     100 |   98.53 |                   
  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 |                   
  ...inal-theme.ts |   88.59 |    85.45 |     100 |   88.59 | ...57-261,266-270 
  dracula.ts       |     100 |      100 |     100 |     100 |                   
  github-dark.ts   |     100 |      100 |     100 |     100 |                   
  github-light.ts  |     100 |      100 |     100 |     100 |                   
  googlecode.ts    |     100 |      100 |     100 |     100 |                   
  hopcode-dark.ts  |     100 |      100 |     100 |     100 |                   
  hopcode-light.ts |     100 |      100 |     100 |     100 |                   
  no-color.ts      |     100 |      100 |     100 |     100 |                   
  ...tic-tokens.ts |     100 |      100 |     100 |     100 |                   
  ...-of-purple.ts |     100 |      100 |     100 |     100 |                   
  theme-manager.ts |   88.07 |    82.89 |     100 |   88.07 | ...52-361,366-367 
  theme.ts         |     100 |    38.02 |     100 |     100 | ...34-449,457-461 
  xcode.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/utils      |    83.1 |    81.95 |   91.91 |    83.1 |                   
  ...Colorizer.tsx |   82.78 |    88.23 |     100 |   82.78 | ...10-111,197-223 
  ...nRenderer.tsx |   57.89 |    55.31 |      50 |   57.89 | ...86-188,208-227 
  ...wnDisplay.tsx |   86.01 |    87.41 |     100 |   86.01 | ...87,704,729-754 
  ...idDiagram.tsx |   87.79 |    95.34 |     100 |   87.79 | 156-179           
  ...eRenderer.tsx |   93.18 |    81.43 |      95 |   93.18 | ...20-623,667-672 
  ...dWorkUtils.ts |     100 |      100 |     100 |     100 |                   
  ...boardUtils.ts |   59.61 |    58.82 |     100 |   59.61 | ...,86-88,107-149 
  commandUtils.ts  |    95.9 |    88.29 |     100 |    95.9 | ...62,164-165,289 
  computeStats.ts  |     100 |      100 |     100 |     100 |                   
  customBanner.ts  |   90.68 |    91.22 |     100 |   90.68 | ...13,324-327,334 
  displayUtils.ts  |   88.37 |    72.22 |     100 |   88.37 | 23,25,29,31,33    
  formatters.ts    |   95.23 |    98.27 |     100 |   95.23 | 117-120           
  gradientUtils.ts |     100 |      100 |     100 |     100 |                   
  highlight.ts     |     100 |      100 |     100 |     100 |                   
  ...oryMapping.ts |     100 |    94.28 |     100 |     100 | 29,51             
  isNarrowWidth.ts |     100 |      100 |     100 |     100 |                   
  ...olDetector.ts |    8.23 |      100 |       0 |    8.23 | ...31-132,135-136 
  latexRenderer.ts |   94.95 |     73.8 |     100 |   94.95 | ...76-178,184-187 
  layoutUtils.ts   |     100 |      100 |     100 |     100 |                   
  ...nUtilities.ts |   69.84 |    85.71 |     100 |   69.84 | 75-91,100-101     
  ...ToolGroups.ts |   98.66 |    96.77 |     100 |   98.66 | 48-49             
  ...geRenderer.ts |   86.28 |    69.06 |   95.12 |   86.28 | ...1281,1321-1327 
  ...alRenderer.ts |   86.69 |     71.9 |     100 |   86.69 | ...1476,1513-1519 
  ...lsBySource.ts |     100 |    95.23 |     100 |     100 | 83                
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  ...storyUtils.ts |   61.06 |    69.62 |      90 |   61.06 | ...64,412,417-439 
  ...ickerUtils.ts |     100 |      100 |     100 |     100 |                   
  ...izedOutput.ts |   95.04 |      100 |   88.88 |   95.04 | 115-120           
  ...wOptimizer.ts |     100 |    96.77 |     100 |     100 | 69                
  terminalSetup.ts |    4.37 |      100 |       0 |    4.37 | 44-393            
  textUtils.ts     |   97.35 |    94.38 |   91.66 |   97.35 | ...50-251,386-387 
  todoSnapshot.ts  |   89.11 |    93.33 |     100 |   89.11 | ...,66-78,180-181 
  updateCheck.ts   |     100 |    80.95 |     100 |     100 | 30-42             
 ...i/utils/export |   56.77 |     40.8 |   79.41 |   56.77 |                   
  collect.ts       |   55.92 |    50.58 |   86.36 |   55.92 | ...25-640,642-647 
  index.ts         |     100 |      100 |     100 |     100 |                   
  normalize.ts     |   57.47 |    20.51 |      80 |   57.47 | ...09-310,324-359 
  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         |   66.88 |    89.14 |   83.12 |   66.88 |                   
  acpModelUtils.ts |     100 |      100 |     100 |     100 |                   
  apiPreconnect.ts |   96.61 |    97.14 |     100 |   96.61 | 167-170           
  checks.ts        |   33.33 |      100 |       0 |   33.33 | 23-28             
  cleanup.ts       |   84.12 |    93.33 |      80 |   84.12 | 75,106-115        
  commands.ts      |     100 |      100 |     100 |     100 |                   
  commentJson.ts   |   85.18 |    86.36 |     100 |   85.18 | 64-73,99-100      
  ...Calculator.ts |     100 |      100 |     100 |     100 |                   
  deepMerge.ts     |     100 |       90 |     100 |     100 | 41-43,49          
  ...ScopeUtils.ts |   97.56 |    88.88 |     100 |   97.56 | 67                
  doctorChecks.ts  |   62.47 |    68.57 |     100 |   62.47 | ...51-499,503-532 
  ...putCapture.ts |   90.65 |    86.17 |     100 |   90.65 | ...72,370,372-373 
  ...arResolver.ts |   94.28 |    88.46 |     100 |   94.28 | 28-29,125-126     
  errors.ts        |   98.67 |    96.36 |     100 |   98.67 | 67-68             
  events.ts        |     100 |      100 |     100 |     100 |                   
  gitUtils.ts      |   93.68 |       84 |     100 |   93.68 | 79-80,121-124     
  githubApi.ts     |    1.93 |      100 |       0 |    1.93 | ...92-308,314-446 
  ...TokenStore.ts |   29.54 |       25 |      25 |   29.54 | ...46,50-57,61-68 
  ...AutoUpdate.ts |   90.76 |    93.33 |   88.88 |   90.76 | 103-114           
  ...lationInfo.ts |     100 |      100 |     100 |     100 |                   
  languageUtils.ts |   97.89 |    96.42 |     100 |   97.89 | 132-133           
  math.ts          |       0 |        0 |       0 |       0 | 1-15              
  ...onfigUtils.ts |     100 |      100 |     100 |     100 |                   
  ...iveHelpers.ts |   96.82 |    93.28 |     100 |   96.82 | ...84-485,583,596 
  osc.ts           |    97.5 |      100 |   88.88 |    97.5 | 195-196           
  package.ts       |   88.88 |       80 |     100 |   88.88 | 33-34             
  processUtils.ts  |     100 |      100 |     100 |     100 |                   
  promptUtils.ts   |    3.44 |      100 |       0 |    3.44 | 14-46             
  ...rDetection.ts |    6.25 |      100 |       0 |    6.25 | 43-118            
  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-1039            
  settingsUtils.ts |   82.89 |    90.67 |   89.47 |   82.89 | ...52-663,670-678 
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...upProfiler.ts |     100 |       96 |     100 |     100 | 110               
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  stdioHelpers.ts  |     100 |       60 |     100 |     100 | 23,32             
  systemInfo.ts    |   92.52 |     90.9 |   83.33 |   92.52 | 63-69,184         
  ...InfoFields.ts |    87.5 |     64.1 |     100 |    87.5 | ...21-122,143-144 
  ...iffPreview.ts |   94.11 |    83.33 |     100 |   94.11 | 13                
  ...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 |   63.15 |    81.25 |     100 |   63.15 | 93,118-157        
-------------------|---------|----------|---------|---------|-------------------
Core Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   71.03 |    82.45 |    79.2 |   71.03 |                   
 src               |   72.33 |    16.66 |   16.66 |   72.33 |                   
  auth.ts          |       0 |      100 |     100 |       0 | 10-22             
  bun.ts           |       0 |        0 |       0 |       0 | 1-5               
  env.ts           |       0 |        0 |       0 |       0 | 1-13              
  global.ts        |       0 |        0 |       0 |       0 | 1-12              
  index.ts         |     100 |      100 |     100 |     100 |                   
  installation.ts  |       0 |        0 |       0 |       0 | 1-15              
  plugin.ts        |       0 |        0 |       0 |       0 | 1-6               
 src/__mocks__/fs  |       0 |        0 |       0 |       0 |                   
  promises.ts      |       0 |        0 |       0 |       0 | 1-48              
 src/agents        |   85.12 |    76.94 |   87.64 |   85.12 |                   
  ...transcript.ts |   88.92 |    76.66 |     100 |   88.92 | ...82,306-307,438 
  ...ent-resume.ts |   81.23 |    69.89 |   77.41 |   81.23 | ...1021,1024-1026 
  ...ound-tasks.ts |   95.13 |    86.61 |     100 |   95.13 | ...06-707,733-734 
  github-agents.ts |   68.18 |      100 |      20 |   68.18 | ...60-164,170-171 
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/agents/arena  |   76.98 |    67.72 |   78.72 |   76.98 |                   
  ...gentClient.ts |   79.47 |    88.88 |   81.81 |   79.47 | ...68-183,189-204 
  ArenaManager.ts  |   75.92 |    64.19 |   78.26 |   75.92 | ...1860,1866-1867 
  arena-events.ts  |   64.44 |      100 |      50 |   64.44 | ...71-175,178-183 
  diff-summary.ts  |    87.5 |    73.46 |     100 |    87.5 | ...32-133,137-138 
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...gents/backends |   76.35 |    86.15 |   73.04 |   76.35 |                   
  ITermBackend.ts  |   97.97 |    93.93 |     100 |   97.97 | ...78-180,255,307 
  ...essBackend.ts |   91.37 |    90.62 |   86.66 |   91.37 | ...95,250-270,329 
  TmuxBackend.ts   |    90.7 |    76.55 |   97.36 |    90.7 | ...87,697,743-747 
  detect.ts        |   31.25 |      100 |       0 |   31.25 | 34-88             
  index.ts         |     100 |      100 |     100 |     100 |                   
  iterm-it2.ts     |     100 |     92.1 |     100 |     100 | 37-38,106         
  tmux-commands.ts |    6.64 |      100 |    3.03 |    6.64 | ...93-363,386-503 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...agents/runtime |   81.06 |    76.52 |   70.83 |   81.06 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  agent-core.ts    |   76.45 |    72.35 |   60.86 |   76.45 | ...1604,1631-1677 
  agent-events.ts  |     100 |      100 |     100 |     100 |                   
  ...t-headless.ts |   81.19 |    71.73 |   60.86 |   81.19 | ...98-399,402-403 
  ...nteractive.ts |   79.71 |    79.62 |      75 |   79.71 | ...54,456,458,461 
  ...statistics.ts |   96.95 |    81.39 |   91.66 |   96.95 | ...40,164,205,238 
  agent-types.ts   |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/auth          |    6.88 |      100 |       0 |    6.88 |                   
  ...b-app-auth.ts |    3.67 |      100 |       0 |    3.67 | ...46-261,267-273 
  ...-flow-auth.ts |    9.46 |      100 |       0 |    9.46 | ...88-290,297-302 
 src/config        |   76.09 |    81.14 |   62.66 |   76.09 |                   
  ...ovalConfig.ts |     100 |      100 |     100 |     100 |                   
  chatConfig.ts    |   71.42 |      100 |    37.5 |   71.42 | ...53,56-57,60-61 
  config.ts        |   71.53 |     76.4 |   54.67 |   71.53 | ...3101,3108-3112 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  models.ts        |     100 |      100 |     100 |     100 |                   
  ...ionsConfig.ts |     100 |    93.75 |     100 |     100 | 82,104            
  storage.ts       |   95.07 |    93.44 |   89.47 |   95.07 | ...50-251,254-255 
  ...etryConfig.ts |     100 |    85.71 |     100 |     100 | 68,76,100         
  uiConfig.ts      |   81.08 |    85.71 |   57.14 |   81.08 | ...12-113,116-117 
 ...nfirmation-bus |   99.01 |    98.18 |     100 |   99.01 |                   
  ...ateHandler.ts |     100 |      100 |     100 |     100 |                   
  message-bus.ts   |   98.14 |    97.05 |     100 |   98.14 | 42-43             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/core          |   78.25 |    82.06 |   87.31 |   78.25 |                   
  baseLlmClient.ts |   91.63 |    84.37 |   84.61 |   91.63 | ...91,299-313,380 
  ...ionPlanner.ts |   89.85 |     91.3 |     100 |   89.85 | 44-48,134-135     
  client.ts        |   78.39 |    76.13 |   85.18 |   78.39 | ...1498,1535-1538 
  ...tGenerator.ts |    72.1 |    61.11 |     100 |    72.1 | ...63,365,372-375 
  ...lScheduler.ts |   80.69 |    82.22 |   93.33 |   80.69 | ...2378,2430-2434 
  geminiChat.ts    |   87.89 |    83.98 |   84.21 |   87.89 | ...1258,1325-1326 
  geminiRequest.ts |     100 |      100 |     100 |     100 |                   
  ...ionHandler.ts |       0 |        0 |       0 |       0 | 1-133             
  ...htProtocol.ts |    9.09 |      100 |       0 |    9.09 | 34-42,45-49,52-87 
  logger.ts        |   82.25 |       82 |     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 |   85.71 |    70.58 |     100 |   85.71 | ...90-191,205-214 
  ...issionFlow.ts |   98.59 |    94.73 |     100 |   98.59 | 93                
  prompts.ts       |   84.59 |     87.5 |   73.33 |   84.59 | ...1161,1179-1194 
  tokenLimits.ts   |     100 |    89.47 |     100 |     100 | 51-52             
  ...ionHandler.ts |       0 |        0 |       0 |       0 | 1-434             
  ...okTriggers.ts |   99.31 |    90.41 |     100 |   99.31 | 124,135           
  turn.ts          |   96.44 |    88.88 |     100 |   96.44 | ...01,414-415,463 
 ...ntentGenerator |   95.12 |    81.91 |   93.61 |   95.12 |                   
  ...tGenerator.ts |   97.13 |    83.58 |    92.3 |   97.13 | ...22,714,870,926 
  converter.ts     |   94.51 |    80.62 |     100 |   94.51 | ...06-607,617,816 
  index.ts         |       0 |        0 |       0 |       0 | 1-21              
 ...ntentGenerator |   91.53 |    71.64 |   93.33 |   91.53 |                   
  ...tGenerator.ts |      90 |    70.96 |   92.85 |      90 | ...80-286,304-305 
  index.ts         |     100 |       80 |     100 |     100 | 50                
 ...ntentGenerator |   93.33 |    83.33 |      90 |   93.33 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   93.31 |    83.33 |      90 |   93.31 | ...94,804-805,833 
 ...ntentGenerator |   77.91 |    82.89 |   89.47 |   77.91 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  converter.ts     |    71.5 |    78.35 |   86.95 |    71.5 | ...1410,1431-1437 
  errorHandler.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |   52.38 |    44.44 |      50 |   52.38 | ...77,81-85,89-93 
  ...tGenerator.ts |   48.78 |    91.66 |   77.77 |   48.78 | ...10-163,166-167 
  pipeline.ts      |   93.65 |     84.9 |     100 |   93.65 | ...79-480,488,553 
  ...ureContext.ts |     100 |      100 |     100 |     100 |                   
  ...ingOptions.ts |       0 |        0 |       0 |       0 | 1                 
  ...CallParser.ts |   90.66 |     88.4 |     100 |   90.66 | ...15-319,349-350 
  ...kingParser.ts |     100 |    96.87 |     100 |     100 | 42                
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...rator/provider |   95.93 |    88.04 |   95.45 |   95.93 |                   
  dashscope.ts     |   95.49 |    87.17 |   93.33 |   95.49 | ...47-248,324-325 
  deepseek.ts      |   95.55 |    90.56 |     100 |   95.55 | ...31-132,145-146 
  default.ts       |   94.62 |    86.36 |   85.71 |   94.62 | 85-86,156-158     
  index.ts         |     100 |      100 |     100 |     100 |                   
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  mistral.ts       |   96.07 |    73.33 |     100 |   96.07 | 32-33             
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  openrouter.ts    |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 |                   
 src/extension     |   60.63 |    79.46 |    78.4 |   60.63 |                   
  ...-converter.ts |   62.66 |    47.82 |      90 |   62.66 | ...90-791,800-832 
  ...ionManager.ts |   47.04 |    82.06 |    65.9 |   47.04 | ...1398,1408-1427 
  ...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           |   48.66 |    76.08 |      75 |   48.66 | ...18-420,427-431 
  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       |     100 |      100 |     100 |     100 |                   
  ...ableSchema.ts |     100 |      100 |     100 |     100 |                   
  variables.ts     |   88.75 |    83.33 |     100 |   88.75 | ...28-231,234-237 
 src/flag          |       0 |      100 |     100 |       0 |                   
  flag.ts          |       0 |      100 |     100 |       0 | 5-28              
 src/followup      |   46.91 |     92.3 |   71.87 |   46.91 |                   
  followupState.ts |      96 |    89.74 |     100 |      96 | 159-161,218-219   
  index.ts         |     100 |      100 |     100 |     100 |                   
  overlayFs.ts     |   95.06 |       84 |     100 |   95.06 | 78,108,122,133    
  speculation.ts   |   13.22 |      100 |   16.66 |   13.22 | 88-458,518-568    
  ...onToolGate.ts |     100 |    96.29 |     100 |     100 | 93                
  ...nGenerator.ts |    38.4 |    95.12 |   33.33 |    38.4 | ...16-318,353-383 
 src/generated     |       0 |        0 |       0 |       0 |                   
  git-commit.ts    |       0 |        0 |       0 |       0 | 1-10              
 src/hooks         |   80.63 |    84.35 |   84.16 |   80.63 |                   
  ...okRegistry.ts |   86.48 |    77.08 |     100 |   86.48 | ...41-344,362-369 
  ...bortSignal.ts |     100 |      100 |     100 |     100 |                   
  ...terpolator.ts |   96.66 |    93.33 |     100 |   96.66 | 66-67             
  ...HookRunner.ts |   96.68 |    87.23 |     100 |   96.68 | 110-112,231-233   
  ...Aggregator.ts |   96.37 |    90.54 |     100 |   96.37 | ...89,291-292,365 
  ...entHandler.ts |   95.58 |    84.37 |   92.59 |   95.58 | ...29,682-683,693 
  hookPlanner.ts   |   84.13 |    76.59 |      90 |   84.13 | ...38,144,162-173 
  hookRegistry.ts  |   88.83 |    86.36 |     100 |   88.83 | ...21,326,330,334 
  hookRunner.ts    |   53.94 |     72.6 |   61.11 |   53.94 | ...27-728,737-738 
  hookSystem.ts    |   75.47 |      100 |   56.41 |   75.47 | ...75-576,582-583 
  ...HookRunner.ts |   75.51 |     61.9 |      80 |   75.51 | ...05-406,424-425 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...SkillHooks.ts |   78.75 |       75 |   66.66 |   78.75 | 62-66,137-152     
  ...oksManager.ts |    96.5 |     91.8 |     100 |    96.5 | ...90,209-210,223 
  ssrfGuard.ts     |   77.22 |    85.36 |     100 |   77.22 | ...57,261-267,273 
  trustedHooks.ts  |       0 |        0 |       0 |       0 | 1-124             
  types.ts         |   90.18 |    90.78 |   85.18 |   90.18 | ...91-392,452-456 
  urlValidator.ts  |     100 |      100 |     100 |     100 |                   
 src/hopcode       |   86.09 |    79.48 |   97.18 |   86.09 |                   
  ...tGenerator.ts |   98.64 |    98.18 |     100 |   98.64 | 105-106           
  hopCodeOAuth2.ts |   85.03 |    74.81 |   93.33 |   85.03 | ...,985-1001,1031 
  ...kenManager.ts |   83.91 |    76.22 |     100 |   83.91 | ...67-772,793-798 
 src/ide           |   74.45 |    83.39 |   78.33 |   74.45 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  detect-ide.ts    |     100 |      100 |     100 |     100 |                   
  ide-client.ts    |   64.43 |    81.48 |   66.66 |   64.43 | ...6-967,996-1004 
  ide-installer.ts |   89.06 |    79.31 |     100 |   89.06 | ...36,143-147,160 
  ideContext.ts    |     100 |      100 |     100 |     100 |                   
  process-utils.ts |   84.84 |    71.79 |     100 |   84.84 | ...37,151,193-194 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/lsp           |   33.92 |    44.97 |   45.76 |   33.92 |                   
  ...nfigLoader.ts |   70.27 |    35.89 |   94.73 |   70.27 | ...20-422,426-432 
  ...ionFactory.ts |    4.29 |        0 |       0 |    4.29 | ...20-371,377-394 
  ...Normalizer.ts |   23.09 |    13.72 |   30.43 |   23.09 | ...04-905,909-924 
  ...verManager.ts |   13.52 |    81.25 |   29.16 |   13.52 | ...75-694,700-730 
  ...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           |    63.2 |    75.34 |   73.21 |    63.2 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...mcp-client.ts |    1.98 |      100 |       0 |    1.98 | 134-665,671-672   
  ...h-provider.ts |   86.95 |      100 |   33.33 |   86.95 | ...,93,97,101-102 
  ...h-provider.ts |   73.82 |    53.92 |     100 |   73.82 | ...88-895,902-904 
  ...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.52 |    86.66 |   86.36 |   79.52 |                   
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   82.87 |    82.35 |   92.85 |   82.87 | ...63-173,181-182 
  ...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        |   66.29 |    75.88 |   65.43 |   66.29 |                   
  const.ts         |     100 |      100 |     100 |     100 |                   
  dream.ts         |   65.65 |    73.33 |      50 |   65.65 | 50,107-148        
  ...entPlanner.ts |   57.84 |    72.72 |   33.33 |   57.84 | ...35,140-147,152 
  entries.ts       |   63.77 |    79.16 |      50 |   63.77 | ...72-180,183-189 
  extract.ts       |    95.2 |    79.16 |     100 |    95.2 | 81-86,125         
  ...entPlanner.ts |   63.08 |    65.71 |   41.17 |   63.08 | ...17,222-223,332 
  ...ionPlanner.ts |       0 |        0 |       0 |       0 | 1                 
  forget.ts        |    45.8 |    61.53 |   44.44 |    45.8 | ...04,211,214-346 
  governance.ts    |       0 |        0 |       0 |       0 |                   
  indexer.ts       |   83.87 |    45.45 |     100 |   83.87 | ...50,56-57,69-70 
  manager.ts       |   75.31 |    81.04 |    75.6 |   75.31 | ...1278,1291-1293 
  memoryAge.ts     |   90.47 |    77.77 |     100 |   90.47 | 50-51             
  paths.ts         |   55.47 |    89.47 |   85.71 |   55.47 | ...,89-90,106-114 
  prompt.ts        |   93.36 |    71.42 |     100 |   93.36 | ...58,161,228-229 
  proposalStore.ts |       0 |        0 |       0 |       0 | 1-97              
  recall.ts        |   79.56 |    69.38 |   88.88 |   79.56 | ...40-245,269-280 
  ...ceSelector.ts |   91.95 |    77.27 |     100 |   91.95 | ...08,110-111,119 
  scan.ts          |   87.91 |    68.42 |     100 |   87.91 | ...47-48,58,82-87 
  ...entPlanner.ts |    11.5 |      100 |       0 |    11.5 | ...57-192,210-298 
  status.ts        |   10.52 |      100 |       0 |   10.52 | 41-98             
  store.ts         |   94.44 |    83.33 |     100 |   94.44 | 56-57,92-93       
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/mocks         |       0 |        0 |       0 |       0 |                   
  msw.ts           |       0 |        0 |       0 |       0 | 1-9               
 src/models        |   89.29 |     86.1 |   87.67 |   89.29 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...tor-config.ts |   90.24 |    91.42 |     100 |   90.24 | 142,148,151-160   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nfigErrors.ts |   74.22 |    47.82 |   84.61 |   74.22 | ...,67-74,106-117 
  ...igResolver.ts |   98.63 |    92.85 |     100 |   98.63 | 162,324,330       
  modelRegistry.ts |     100 |    98.59 |     100 |     100 | 222               
  modelsConfig.ts  |   84.29 |    81.92 |   81.57 |   84.29 | ...1229,1258-1259 
  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   |   71.18 |    88.73 |   48.57 |   71.18 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...on-manager.ts |   81.42 |    86.66 |      80 |   81.42 | ...29-830,837-846 
  rule-parser.ts   |   95.99 |    93.18 |     100 |   95.99 | ...-864,1013-1015 
  ...-semantics.ts |   58.28 |    85.27 |    30.2 |   58.28 | ...1604-1614,1643 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/project       |       0 |        0 |       0 |       0 |                   
  instance.ts      |       0 |        0 |       0 |       0 | 1-9               
 src/prompts       |   83.63 |      100 |    87.5 |   83.63 |                   
  mcp-prompts.ts   |   18.18 |      100 |       0 |   18.18 | 11-19             
  ...t-registry.ts |     100 |      100 |     100 |     100 |                   
 src/provider      |       0 |       40 |      40 |       0 |                   
  auth.ts          |       0 |        0 |       0 |       0 | 1-173             
  error.ts         |       0 |      100 |     100 |       0 | 2-204             
  models.ts        |       0 |        0 |       0 |       0 | 1-139             
  provider.ts      |       0 |        0 |       0 |       0 | 1-1602            
  transform.ts     |       0 |      100 |     100 |       0 | 2-1097            
 ...er/sdk/copilot |       0 |    33.33 |   33.33 |       0 |                   
  ...t-provider.ts |       0 |      100 |     100 |       0 | 2-110             
  index.ts         |       0 |        0 |       0 |       0 | 1                 
  ...ible-error.ts |       0 |        0 |       0 |       0 | 1-30              
 ...k/copilot/chat |       0 |     37.5 |    37.5 |       0 |                   
  ...t-messages.ts |       0 |        0 |       0 |       0 | 1-172             
  ...e-metadata.ts |       0 |        0 |       0 |       0 | 1-15              
  ...ish-reason.ts |       0 |      100 |     100 |       0 | 3-19              
  ...-api-types.ts |       0 |        0 |       0 |       0 |                   
  ...uage-model.ts |       0 |        0 |       0 |       0 | 1-851             
  ...at-options.ts |       0 |        0 |       0 |       0 | 1-26              
  ...-extractor.ts |       0 |        0 |       0 |       0 |                   
  ...pare-tools.ts |       0 |        0 |       0 |       0 | 1-92              
 ...ilot/responses |       0 |       50 |      50 |       0 |                   
  ...nses-input.ts |       0 |        0 |       0 |       0 | 1-323             
  ...ish-reason.ts |       0 |      100 |     100 |       0 | 3-22              
  openai-config.ts |       0 |        0 |       0 |       0 |                   
  openai-error.ts  |       0 |        0 |       0 |       0 | 1-22              
  ...-api-types.ts |       0 |        0 |       0 |       0 |                   
  ...uage-model.ts |       0 |        0 |       0 |       0 | 1-1818            
  ...pare-tools.ts |       0 |        0 |       0 |       0 | 1-180             
  ...s-settings.ts |       0 |        0 |       0 |       0 |                   
 ...responses/tool |       0 |        0 |       0 |       0 |                   
  ...nterpreter.ts |       0 |        0 |       0 |       0 | 1-89              
  file-search.ts   |       0 |        0 |       0 |       0 | 1-132             
  ...generation.ts |       0 |        0 |       0 |       0 | 1-116             
  local-shell.ts   |       0 |        0 |       0 |       0 | 1-65              
  ...ch-preview.ts |       0 |        0 |       0 |       0 | 1-104             
  web-search.ts    |       0 |        0 |       0 |       0 | 1-103             
 src/security      |     100 |      100 |     100 |     100 |                   
  ...l-security.ts |     100 |      100 |     100 |     100 |                   
 src/services      |   82.49 |    84.72 |   89.28 |   82.49 |                   
  ...ionTrailer.ts |     100 |      100 |     100 |     100 |                   
  ...llRegistry.ts |   89.38 |    92.85 |     100 |   89.38 | 115-124,199-200   
  ...ionService.ts |   95.53 |    95.14 |     100 |   95.53 | ...92,354,356-360 
  ...ingService.ts |   84.12 |    84.39 |   82.35 |   84.12 | ...1211,1228-1229 
  ...ttribution.ts |   91.73 |    87.71 |      90 |   91.73 | ...80-685,826-827 
  cronScheduler.ts |   97.56 |    92.98 |     100 |   97.56 | 62-63,77,155      
  evolveService.ts |       0 |        0 |       0 |       0 | 1-188             
  ...eryService.ts |   78.21 |    95.45 |      60 |   78.21 | ...50-151,157-158 
  fileReadCache.ts |     100 |      100 |     100 |     100 |                   
  ...temService.ts |   89.76 |     85.1 |   88.88 |   89.76 | ...89,191,266-273 
  ...ratedFiles.ts |      96 |    88.23 |     100 |      96 | 119-120,146-147   
  gitInit.ts       |     100 |      100 |     100 |     100 |                   
  gitService.ts    |   68.75 |     92.3 |   55.55 |   68.75 | ...12-122,125-129 
  ...reeService.ts |   71.83 |    68.47 |    91.3 |   71.83 | ...89-790,806,822 
  ...ionService.ts |   98.13 |     97.8 |   95.45 |   98.13 | ...32-333,380-381 
  ...orRegistry.ts |   96.34 |    91.66 |     100 |   96.34 | ...90-391,542-543 
  ollamaService.ts |   90.54 |       84 |     100 |   90.54 | ...01-503,513-522 
  ...kerService.ts |    6.94 |      100 |       0 |    6.94 | 27-115            
  ...MapService.ts |   85.54 |    86.88 |     100 |   85.54 | ...82,312-315,328 
  sessionRecap.ts  |   12.34 |      100 |       0 |   12.34 | 49-158            
  ...ionService.ts |   87.39 |    76.56 |   92.85 |   87.39 | ...1221,1225-1226 
  sessionTitle.ts  |   93.91 |    71.15 |     100 |   93.91 | ...34-237,268-269 
  ...ionService.ts |   83.06 |    78.66 |   87.75 |   83.06 | ...1489,1495-1500 
  task-store.ts    |    3.64 |      100 |       0 |    3.64 | 50-216            
  ...UseSummary.ts |   94.63 |    88.67 |     100 |   94.63 | ...69-171,221-222 
 ...icrocompaction |   98.62 |    86.44 |     100 |   98.62 |                   
  microcompact.ts  |   98.62 |    86.44 |     100 |   98.62 | 138,142           
 src/skills        |    87.5 |     83.8 |   94.23 |    87.5 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...activation.ts |     100 |     93.1 |     100 |     100 | 93,112            
  skill-load.ts    |   92.94 |    81.63 |     100 |   92.94 | ...06,226,238-240 
  skill-manager.ts |   83.31 |    79.66 |   90.32 |   83.31 | ...1115,1122-1126 
  skill-paths.ts   |   86.74 |    77.77 |     100 |   86.74 | ...00-101,106-107 
  symlinkScope.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/subagents     |   83.79 |    79.74 |   95.23 |   83.79 |                   
  ...tin-agents.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...-selection.ts |     100 |      100 |     100 |     100 |                   
  ...nt-manager.ts |   76.74 |    71.42 |   92.85 |   76.74 | ...1155,1177-1178 
  types.ts         |     100 |      100 |     100 |     100 |                   
  validation.ts    |    92.5 |    95.18 |     100 |    92.5 | 51-56,69-74,78-83 
 src/telemetry     |   73.38 |    87.16 |    76.4 |   73.38 |                   
  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 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-111             
  ...-processor.ts |   93.89 |    90.21 |   94.11 |   93.89 | ...70-275,294-295 
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-128             
  loggers.ts       |    51.9 |       64 |   57.77 |    51.9 | ...1214,1231-1251 
  metrics.ts       |   73.91 |    82.95 |   73.21 |   73.91 | ...1017,1020-1031 
  modelPricing.ts  |   70.37 |      100 |       0 |   70.37 | ...16-126,133-138 
  sanitize.ts      |      80 |    83.33 |     100 |      80 | 35-36,41-42       
  sdk.ts           |   90.42 |    83.56 |   76.92 |   90.42 | ...16-317,337-341 
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...on-tracing.ts |   92.77 |     87.3 |     100 |   92.77 | 79-93,379-383     
  ...etry-utils.ts |     100 |      100 |     100 |     100 |                   
  ...l-decision.ts |     100 |      100 |     100 |     100 |                   
  ...e-id-utils.ts |     100 |      100 |     100 |     100 |                   
  tracer.ts        |   99.24 |    88.88 |     100 |   99.24 | 53                
  types.ts         |   79.17 |    94.49 |   83.33 |   79.17 | ...1149,1152-1181 
  uiTelemetry.ts   |   92.97 |    96.96 |   81.25 |   92.97 | ...93-194,200-207 
 ...hopcode-logger |   68.35 |    79.56 |   64.91 |   68.35 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  ...ode-logger.ts |   68.35 |    79.34 |   64.28 |   68.35 | ...1058,1096-1097 
 src/test-utils    |   93.16 |    95.83 |   73.52 |   93.16 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  ...st-helpers.ts |   94.11 |       90 |     100 |   94.11 | 69-70             
  index.ts         |     100 |      100 |     100 |     100 |                   
  mock-tool.ts     |   91.19 |    97.05 |   68.96 |   91.19 | ...38,202-203,216 
  ...aceContext.ts |     100 |      100 |     100 |     100 |                   
 src/tools         |   73.02 |     81.4 |   81.11 |   73.02 |                   
  ...erQuestion.ts |   89.01 |    76.74 |    90.9 |   89.01 | ...41-342,349-350 
  bg-stop.ts       |   52.85 |      100 |   33.33 |   52.85 | ...32,35-61,93-96 
  browser.ts       |      26 |      100 |      20 |      26 | ...47-287,355-358 
  cron-create.ts   |   97.75 |    88.88 |   83.33 |   97.75 | 30-31             
  cron-delete.ts   |   96.82 |      100 |   83.33 |   96.82 | 26-27             
  cron-list.ts     |   96.66 |      100 |   83.33 |   96.66 | 25-26             
  diffOptions.ts   |     100 |      100 |     100 |     100 |                   
  edit.ts          |   78.01 |    84.76 |   73.33 |   78.01 | ...86-687,774-824 
  exitPlanMode.ts  |   85.09 |    85.71 |     100 |   85.09 | ...60-163,177-189 
  glob.ts          |   90.63 |    88.33 |   84.61 |   90.63 | ...28,171,302,305 
  grep.ts          |   79.19 |    85.71 |   78.94 |   79.19 | ...20,560,569-576 
  ls.ts            |   96.74 |    90.27 |     100 |   96.74 | 176-181,212,216   
  lsp.ts           |   72.77 |    60.09 |   90.32 |   72.77 | ...1211,1213-1214 
  ...nt-manager.ts |   51.95 |     65.9 |   47.36 |   51.95 | ...03-525,528-565 
  mcp-client.ts    |   32.44 |    75.28 |   63.63 |   32.44 | ...1462,1466-1469 
  mcp-tool.ts      |   90.98 |    88.88 |   96.42 |   90.98 | ...95-596,646-647 
  memory-config.ts |       0 |        0 |       0 |       0 | 1-47              
  ...iable-tool.ts |     100 |    84.61 |     100 |     100 | 102,109           
  monitor.ts       |   92.27 |    83.94 |      92 |   92.27 | ...18,547-550,563 
  ...nforcement.ts |   82.44 |       90 |     100 |   82.44 | 174-185,234-247   
  read-file.ts     |   95.07 |     88.6 |      90 |   95.07 | ...99,290-293,296 
  repoMap.ts       |   59.42 |      100 |   33.33 |   59.42 | ...,47-61,109-112 
  ripGrep.ts       |   94.59 |    85.71 |   93.33 |   94.59 | ...60,463,541-542 
  ...-transport.ts |    6.34 |      100 |       0 |    6.34 | 47-145            
  send-message.ts  |   89.32 |    91.66 |   83.33 |   89.32 | 44-45,68-76       
  shell.ts         |   72.18 |    80.23 |   89.65 |   72.18 | ...3659,3708-3714 
  skill-utils.ts   |     100 |      100 |     100 |     100 |                   
  skill.ts         |   88.11 |    91.17 |   84.61 |   88.11 | ...95,399,422-444 
  ...eticOutput.ts |   95.12 |      100 |      80 |   95.12 | 60-61             
  task-create.ts   |       0 |        0 |       0 |       0 | 1-109             
  task-get.ts      |       0 |        0 |       0 |       0 | 1-85              
  task-list.ts     |       0 |        0 |       0 |       0 | 1-113             
  task-output.ts   |       0 |        0 |       0 |       0 | 1-88              
  task-ready.ts    |       0 |        0 |       0 |       0 | 1-96              
  task-stop.ts     |   93.14 |    96.15 |   85.71 |   93.14 | 39-40,54-64       
  task-update.ts   |   94.49 |      100 |   85.71 |   94.49 | 33-38             
  todoWrite.ts     |   85.42 |    84.09 |   84.61 |   85.42 | ...05-410,432-433 
  tool-error.ts    |     100 |      100 |     100 |     100 |                   
  tool-names.ts    |     100 |      100 |     100 |     100 |                   
  tool-registry.ts |    74.1 |    75.49 |      80 |    74.1 | ...05-806,814-815 
  tool-search.ts   |   95.19 |    86.48 |    92.3 |   95.19 | ...47-153,208-213 
  tools.ts         |   87.76 |       90 |   88.23 |   87.76 | ...50-451,467-473 
  web-fetch.ts     |   88.59 |    79.48 |    92.3 |   88.59 | ...12-313,315-316 
  write-file.ts    |    79.2 |    79.26 |   83.33 |    79.2 | ...39-642,654-689 
 src/tools/agent   |   83.42 |    84.95 |   83.92 |   83.42 |                   
  agent.ts         |   83.72 |    85.38 |   84.31 |   83.72 | ...1669,1678-1682 
  fork-subagent.ts |   78.26 |    71.42 |      80 |   78.26 | 54-72,104-105     
 ...ols/web-search |   61.08 |     66.1 |   73.68 |   61.08 |                   
  base-provider.ts |    40.9 |    33.33 |     100 |    40.9 | 40-43,48-56       
  index.ts         |   62.69 |    70.58 |      80 |   62.69 | ...32-369,388-398 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
  utils.ts         |      60 |       50 |      50 |      60 | 35-42             
 ...arch/providers |    20.7 |    55.17 |   56.52 |    20.7 |                   
  bing-provider.ts |    5.88 |       50 |      50 |    5.88 | 43-99             
  ...m-provider.ts |   16.58 |        0 |       0 |   16.58 | 48-56,75-255      
  ...e-provider.ts |       8 |        0 |       0 |       8 | 68-83,89-199      
  ...o-provider.ts |    3.84 |       50 |      50 |    3.84 | 36-124            
  exa-provider.ts  |       6 |       50 |      50 |       6 | 36-91             
  ...l-provider.ts |    5.55 |       50 |      50 |    5.55 | 39-100            
  ...e-provider.ts |      82 |    55.55 |     100 |      82 | 57-58,61-62,72-76 
  jina-provider.ts |       6 |       50 |      50 |       6 | 34-92             
  ...y-provider.ts |   89.79 |       75 |     100 |   89.79 | 62-66             
 src/util          |     7.5 |    33.33 |      25 |     7.5 |                   
  bun-shim.ts      |    87.5 |      100 |       0 |    87.5 | 6                 
  error.ts         |       0 |      100 |     100 |       0 | 8-49              
  filesystem.ts    |       0 |        0 |       0 |       0 | 1-22              
  fn.ts            |       0 |      100 |     100 |       0 | 3-14              
  iife.ts          |       0 |        0 |       0 |       0 | 1-3               
  lazy.ts          |       0 |        0 |       0 |       0 | 1-11              
  log.ts           |       0 |        0 |       0 |       0 | 1-25              
  zod-meta.ts      |      40 |      100 |       0 |      40 | 12-14             
 src/utils         |   88.35 |    86.93 |   93.19 |   88.35 |                   
  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          
  bareMode.ts      |   27.27 |      100 |       0 |   27.27 | 9-15,18-19        
  browser.ts       |    7.69 |      100 |       0 |    7.69 | 17-56             
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  ...engthError.ts |   89.11 |    86.66 |     100 |   89.11 | ...28-129,132-133 
  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   |   95.95 |    92.42 |   94.73 |   95.95 | 106-107,218-222   
  editHelper.ts    |   93.63 |    83.52 |     100 |   93.63 | ...28-429,463-464 
  editor.ts        |   97.61 |    95.71 |     100 |   97.61 | ...70-271,273-274 
  ...arResolver.ts |   94.28 |    88.88 |     100 |   94.28 | 28-29,125-126     
  ...entContext.ts |     100 |    95.45 |     100 |     100 | 83                
  errorParsing.ts  |   87.87 |    91.89 |     100 |   87.87 | 73-74,93-103      
  ...rReporting.ts |   88.46 |       90 |     100 |   88.46 | 69-74             
  errors.ts        |   72.37 |    77.41 |   58.82 |   72.37 | ...73-289,293-299 
  fetch.ts         |   70.18 |    71.42 |   71.42 |   70.18 | ...42,148,161,186 
  fileUtils.ts     |   91.42 |    86.07 |      95 |   91.42 | ...1183,1187-1193 
  forkedAgent.ts   |    78.5 |    70.73 |   85.71 |    78.5 | ...30-436,441-447 
  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             
  gitDiff.ts       |   92.36 |    79.53 |     100 |   92.36 | ...55-856,928-929 
  ...noreParser.ts |   92.36 |     87.5 |     100 |   92.36 | ...17-118,188-189 
  gitUtils.ts      |   56.66 |    85.71 |      75 |   56.66 | ...2,72-73,97-148 
  ...noreParser.ts |   85.71 |    82.14 |     100 |   85.71 | ...61,67-68,74-75 
  iconvHelper.ts   |     100 |      100 |     100 |     100 |                   
  ...rePatterns.ts |     100 |      100 |     100 |     100 |                   
  ...ionManager.ts |     100 |     90.9 |     100 |     100 | 26                
  ...lPromptIds.ts |     100 |      100 |     100 |     100 |                   
  jsonl-utils.ts   |    74.1 |    90.76 |   58.33 |    74.1 | ...23-326,336-342 
  ...-detection.ts |     100 |      100 |     100 |     100 |                   
  ...yDiscovery.ts |    83.9 |    79.36 |     100 |    83.9 | ...16,319,411-414 
  ...tProcessor.ts |   93.63 |       90 |     100 |   93.63 | ...96-302,384-385 
  ...Inspectors.ts |   61.53 |      100 |      50 |   61.53 | 18-23             
  ...kerChecker.ts |   82.55 |    78.57 |     100 |   82.55 | 68-69,79-84,92-98 
  notebook.ts      |   94.35 |    84.78 |     100 |   94.35 | ...10,122,174-176 
  openaiLogger.ts  |   87.93 |    82.85 |     100 |   87.93 | ...22-124,147-152 
  partUtils.ts     |     100 |      100 |     100 |     100 |                   
  pathReader.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |   93.21 |    91.86 |     100 |   93.21 | ...89-390,392-394 
  pdf.ts           |   93.68 |    87.05 |     100 |   93.68 | ...96-297,321-325 
  projectPath.ts   |     100 |      100 |     100 |     100 |                   
  ...ectSummary.ts |   89.39 |    72.41 |     100 |   89.39 | ...37-142,193-196 
  ...tIdContext.ts |     100 |      100 |     100 |     100 |                   
  proxyUtils.ts    |     100 |      100 |     100 |     100 |                   
  ...rDetection.ts |   58.57 |       76 |     100 |   58.57 | ...4,88-89,95-100 
  rateLimit.ts     |   92.55 |    85.92 |     100 |   92.55 | ...70-272,309-310 
  readManyFiles.ts |   87.96 |    86.95 |     100 |   87.96 | ...05-207,223-234 
  retry.ts         |   89.95 |    88.05 |     100 |   89.95 | ...32,353,360-361 
  ripgrepUtils.ts  |   46.53 |    84.37 |   66.66 |   46.53 | ...32-233,245-322 
  ...sDiscovery.ts |   97.42 |    92.85 |     100 |   97.42 | ...04,182-183,202 
  ...tchOptions.ts |   63.09 |    64.28 |   83.33 |   63.09 | ...32-133,190-191 
  runtimeStatus.ts |   85.58 |    81.57 |     100 |   85.58 | ...81,231-237,239 
  safeJsonParse.ts |   74.07 |    83.33 |     100 |   74.07 | 40-46             
  ...nStringify.ts |     100 |      100 |     100 |     100 |                   
  ...aConverter.ts |   90.78 |    88.23 |     100 |   90.78 | ...41-42,93,95-96 
  ...aValidator.ts |   94.57 |    80.26 |     100 |   94.57 | ...01,210-213,267 
  ...r-launcher.ts |   76.92 |     91.3 |   66.66 |   76.92 | ...34,136,157-195 
  ...orageUtils.ts |   96.89 |    85.84 |     100 |   96.89 | ...51,367,447,466 
  shell-utils.ts   |   81.36 |    89.36 |     100 |   81.36 | ...1570,1577-1581 
  ...lAstParser.ts |   95.58 |    85.79 |     100 |   95.58 | ...1059-1061,1071 
  ...nlyChecker.ts |   95.75 |    92.39 |     100 |   95.75 | ...00-301,313-314 
  sideQuery.ts     |   98.71 |    97.14 |     100 |   98.71 | 106               
  ...tGenerator.ts |     100 |      100 |     100 |     100 |                   
  ...ameContext.ts |     100 |      100 |     100 |     100 |                   
  symlink.ts       |   77.77 |       50 |     100 |   77.77 | 44,54-59          
  ...emEncoding.ts |   96.36 |    91.17 |     100 |   96.36 | 59-60,124-125     
  terminalSafe.ts  |     100 |      100 |     100 |     100 |                   
  ...Serializer.ts |   98.72 |       90 |     100 |   98.72 | 42-43,134,201-203 
  testUtils.ts     |   53.33 |      100 |   33.33 |   53.33 | ...53,59-64,70-72 
  textUtils.ts     |      60 |      100 |   66.66 |      60 | 36-55             
  thoughtUtils.ts  |     100 |    92.85 |     100 |     100 | 71                
  ...-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 |       92 |     100 |     100 | 52,71             
  windowsPath.ts   |   89.47 |    79.31 |     100 |   89.47 | ...57-58,62,90-91 
  ...aceContext.ts |   93.71 |    89.28 |   93.33 |   93.71 | ...24-225,249-251 
  xml.ts           |     100 |      100 |     100 |     100 |                   
  yaml-parser.ts   |      92 |    84.31 |     100 |      92 | 49-53,65-69       
 ...ils/filesearch |   85.78 |    80.89 |   96.42 |   85.78 |                   
  crawlCache.ts    |     100 |      100 |     100 |     100 |                   
  crawler.ts       |   82.84 |    77.49 |   94.82 |   82.84 | ...1451,1485-1486 
  fileSearch.ts    |   93.58 |    87.32 |     100 |   93.58 | ...46-247,249-250 
  ignore.ts        |     100 |       96 |     100 |     100 | 11                
  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.

tanzhenxin and others added 4 commits May 13, 2026 06:50
* fix(core): log internal OpenAI JSON requests

* fix(core): avoid duplicate OpenAI log metadata
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
)

* test(e2e): stabilize MCP tool message flow

* ci(e2e): cancel stale main E2E runs

* test(e2e): accept paired MCP tool results

* test(e2e): stabilize monitor tool check

* test(e2e): stabilize run_shell_command file-listing assertion

The model consistently picks list_directory over run_shell_command
for file-listing prompts. Make the prompt explicit about which tool
to use, matching the approach taken for the MCP tool flow test.
Comment on lines +20 to +22
const sanitized = promptId
.replace(/[^a-zA-Z0-9._-]+/g, '-')
.replace(/^-+|-+$/g, '');
doudouOUC and others added 10 commits May 13, 2026 07:06
… and CLI flags (QwenLM#4066)

* docs(telemetry): align config and docs semantics for target, outfile, and CLI flags

- Remove stale warning note "This feature requires corresponding code
  changes" — the OTLP implementation is now complete (QwenLM#3779, QwenLM#4061)
- Clarify that `target` is an informational destination label and does
  not control exporter routing; `otlpEndpoint` or `outfile` must be set
  to configure where data is sent
- Mark `--telemetry-target` CLI flag as deprecated in the configuration
  table to match the deprecateOption() call in cli/src/config/config.ts
- Fix `outfile` / `QWEN_TELEMETRY_OUTFILE` descriptions: remove the
  incorrect "when target is local" qualifier — outfile overrides OTLP
  export regardless of the target value
- Simplify the file-based output example by removing the now-redundant
  `"target": "local"` and `"otlpEndpoint": ""` fields

Closes the "Align telemetry config and docs semantics for target,
useCollector, otlpEndpoint, otlpProtocol, and outfile" checklist item
in QwenLM#3731.

🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code)

* docs(telemetry): address Copilot review comments on outfile and target descriptions

- Fix outfile table row in telemetry.md: "overrides `otlpEndpoint`" →
  "overrides OTLP export" (outfile disables all OTLP exporting, not
  just the base endpoint)
- Use fully-qualified setting names (`telemetry.otlpEndpoint`,
  `telemetry.outfile`) in the target description in settings.md for
  consistency with the rest of the table

🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code)

* docs(telemetry): update QWEN_TELEMETRY_TARGET env var description and add outfile note

- Align QWEN_TELEMETRY_TARGET env var description with the updated
  telemetry.target setting semantics (informational label, not routing)
- Add a note after the file-based output example clarifying that outfile
  automatically disables OTLP export

🤖 Generated with [Qwen Code](https://github.com/QwenLM/qwen-code)
… workflow

- Add root-level one-off migration/rebrand .mjs scripts to eslint global
  ignores (_rebrand_*.mjs, rebrand_cherry*.mjs, resolve_*.mjs, fix_*.mjs,
  inspect_qwen*.mjs) so they no longer produce lint errors
- Fix hopcode-issue-followup-bot.yml: change repository condition from
  'QwenLM/qwen-code' to 'TaimoorSiddiquiOfficial/HopCode' (functional
  blocker — workflow would never run without this fix)
- Rebrand all Qwen/qwen-issue-bot markers to HopCode/hopcode-issue-bot
  throughout the workflow (description, step names, prompt text, HTML
  comment markers used in issue comments)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- storage: fix getRuntimeStatusPath to use chats/ dir and .runtime.json suffix
- askUserQuestion: set shouldDefer to false so tool loads immediately
- syntheticOutput: fix STRUCTURED_OUTPUT_REDACTED_ARGS key (__redacted) and value
- gitDiff.test: skip Windows symlink test with test.skipIf(process.platform === 'win32')
- AppContainer.test: fix Ctrl+B tests — pendingGeminiHistoryItems + missing mock fields
- gemini.tsx: reject --json-schema in interactive (TUI) mode with clear error
- gemini.test: add getJsonSchema mock to kitty-protocol tests
- chatRecordingService: implement title re-anchor afterWrite() with UTF-8 byte counting,
  sidecar writes that don't update lastRecordUuid, and counter resets in
  recordCustomTitle/finalize

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- package-lock.json: update version references to 0.27.6
- auth.test.ts: rebrand qwen auth -> hopcode auth in removal notice test
- config.ts: improve schemaRootAcceptsObject type guard and error message
- settings.test.ts: import resetHomeEnvBootstrapForTesting, remove duplicate mock block
- nonInteractiveCli.test.ts: mock CommandService.fromCommands and fix YOLO->Izn mode message
- prompts.ts: move Quran guidance before memory suffix, use plain newline prefix
- prompts.test.ts.snap: update snapshots to match new prompt ordering
- hopCodeOAuth2.ts: export hopCodeOAuth2Events and clearHopcodeCredentials aliases
- subagent-manager.test.ts: update built-in agent counts (4 new built-in agents)
- vscode-ide-companion/NOTICES.txt: update third-party notices

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@TaimoorSiddiquiOfficial TaimoorSiddiquiOfficial merged commit dce6a05 into main May 13, 2026
12 of 13 checks passed
TaimoorSiddiquiOfficial pushed a commit that referenced this pull request Jun 12, 2026
…wenLM#4647)

* fix(clipboard): use platform-native tools for image paste on Linux

Replace @teddyzhu/clipboard native module with wl-paste/xclip on Linux
to fix image paste in WSL2+Wayland environments.

The native module uses X11 protocol and cannot read clipboard images
when the session uses Wayland (common in WSL2 with WSLg). This causes
clipboardHasImage() to return false even when the clipboard contains
an image.

Changes:
- Use wl-paste --list-types to detect images (Wayland)
- Use xclip -selection clipboard -t TARGETS -o to detect images (X11)
- Handle image/bmp format from Windows clipboard (WSL2 exposes BMP)
- Convert BMP to PNG using Python PIL when available
- Detect clipboard tool via WAYLAND_DISPLAY when XDG_SESSION_TYPE is unset
- Keep @teddyzhu/clipboard as fallback for macOS/Windows

Fixes QwenLM#3517
Fixes QwenLM#2885

* test: update clipboard tests for platform-native tools

The tests were mocking @teddyzhu/clipboard but the implementation now
uses platform-native tools (wl-paste/xclip) on Linux. Update mocks
to test the spawn-based implementation.

* fix: address critical review comments

1. Fix command injection in Python BMP-to-PNG conversion
   - Use sys.argv instead of string interpolation
   - Prevents path traversal via single-quote injection

2. Fix BMP fallback dead code
   - When PIL is not available, return BMP file path instead of
     deleting the only copy and returning false
   - Update saveClipboardImage to handle non-PNG return paths

* fix: address review suggestions for resource leaks and robustness

- #3: Add proper cleanup in saveFromCommand error paths (kill child, destroy stream)
- #4: Add 5s timeout for all spawned processes to prevent TUI hangs
- #7: Check exit code in checkClipboardForImage (code === 0)
- #8: Move fs.mkdir inside try/catch in saveClipboardImage
- #10: Merge checkWlPasteForImage/checkXclipForImage into checkClipboardForImage

* fix: address all remaining review comments

Source code fixes:
- #25: Add timeout to getWlPasteImageTypes (PROCESS_TIMEOUT_MS)
- #26: Add timeout to python3 spawn in BMP-to-PNG conversion
- #27: Wrap child.kill() in try-catch in timeout handlers
- #28: Replace dynamic import('node:fs/promises') with static statSync
- #30: Export resetLinuxClipboardTool() for testability
- Add try-catch around spawn in checkClipboardForImage
- Use stdio: ['ignore', 'ignore', 'ignore'] for python3 spawn

Test fixes:
- #24: Use vi.hoisted() for mock functions (avoids hoisting issue)
- #31: Stub process.platform = 'linux' in beforeEach
- Add default export to node:child_process mock
- Use EventEmitter-based mock child for async behavior
- All 7 tests passing

* perf: cache wl-paste --list-types result to avoid redundant calls

Avoid spawning wl-paste twice on the paste hot path:
1. clipboardHasImage calls wl-paste --list-types (check)
2. saveClipboardImage calls getWlPasteImageTypes (get types)

Now the result is cached after the first call and reused.
Cache is reset via resetLinuxClipboardTool() for testing.

* fix: address remaining review suggestions

- #1: Add child.stdout error handler in saveFromCommand
- #2: Add macOS/Windows test coverage for @teddyzhu/clipboard fallback
- #3: Fix .replace('.png', '.bmp') to use regex /\.png$/ to prevent path corruption

* fix: address critical cache invalidation and other review feedback

- #1 Critical: Reset cachedWlPasteImageTypes at start of clipboardHasImage
  to prevent stale data between paste operations
- #1 Critical: Check exit code in getWlPasteImageTypes close handler,
  do not cache failed results
- #2: Replace statSync with async fs.stat to avoid blocking event loop
- #3: Remove async from close handler, use promise chain instead
- #4: Return false instead of bmpPath when PIL conversion fails,
  as downstream expects .png files
- #5: Capture stderr from spawned processes for diagnostics

* fix: address remaining code review issues

- #1: Narrow detection to only report supported formats (png/bmp)
- #2: Do not cache results on timeout or error
- #3: Use line-level matching instead of includes('image/')
- #4: Replace execSync with execFileSync to avoid shell injection
- #5: Upgrade BMP→PNG failure log to warn level with install hint

* fix: restore getClipboardModule import caching (regression fix)

The original Qwen Code cached the @teddyzhu/clipboard module import via
getClipboardModule() with cachedClipboardModule and clipboardLoadAttempted.
Our refactoring removed this caching, causing the module to be re-imported
on every clipboardHasImage/saveClipboardImage call.

Restored the original caching mechanism for macOS/Windows fallback path.

* test: add saveClipboardImage success path and cache behavior tests

- Add test for successful PNG save path
- Add test for cache invalidation between clipboardHasImage calls
- All 11 tests passing

* fix: revert execSync to fix WSL2 clipboard detection

execFileSync('command', ['-v', 'wl-paste']) fails because 'command'
is a shell built-in, not an executable. execSync runs through a shell
so it can find 'command'. Reverted to execSync to restore clipboard
tool detection on WSL2.

Also fixed TypeScript errors in tests by using (child as any) for
mock event emitter properties.

* fix: address critical file leak and filter issues from review

- #1: Clean up bmpPath in catch block when PIL conversion fails
- #2: Narrow getWlPasteImageTypes filter to only image/png and image/bmp
- #3: Clean up empty PNG file when size guard fails
- #3b: Fix typo python3-pyl → python3-pil

* test: add xclip, BMP, error path test coverage; fix weak assertion

- Add xclip/X11 path tests (detection, no image, not found)
- Add BMP-to-PNG conversion tests (PIL failure, prefer PNG over BMP)
- Add saveFromCommand error path tests (timeout, spawn error, stdout error)
- Replace tautological 'successful PNG save' assertion with proper null-on-error tests
- Fix ESLint: add no-explicit-any suppressions, prefix unused setupWaylandEnv

Note: xclip save success path requires createWriteStream mock that vitest
cannot fully support with ...actual spread. Detection and error paths verified.

19 tests passing.

* fix: remove unused _setupWaylandEnv function that breaks TS build

Fixes TS6133 error caused by noUnusedLocals: true in tsconfig.json.
The function was generated by test agent but never called.

* fix: clean up tempFilePath on PIL conversion failure

When python3 PIL conversion fails mid-write, tempFilePath (the target
.png) may have been partially written. Add fs.unlink(tempFilePath) in
the catch block to prevent partial file leakage.

Suggested by wenshao in PR review.

* fix: address review feedback on file leaks and test coverage

- Add tempFilePath cleanup when python3 PIL conversion fails mid-write
- Restore image/bmp detection with clarifying comment (WSL2 Wayland)
- Fix stat mock syntax (remove debug console.log, simplify)
- Fix originalPlatform scope (was undefined in afterEach)

Co-authored-by: Shaojin Wen <shaojin.wensj@alibaba-inc.com>

19 tests passing, tsc + eslint clean.

* ci: retrigger tests

* fix: address review feedback on test coverage and defensive guard

- Replace tautological saveClipboardImage assertion with meaningful
  spawn-argument verification
- Wrap clipboardHasImage Linux branch in try/catch guard (preserve
  'never throw, return false' contract)
- Fix node:fs/promises mock to use importOriginal for indirect deps
- Add readFile/writeFile/appendFile/access/copyFile/rename/rm/rmdir
  to mock (required by indirect deps like chatCompressionService)
- Remove node:fs root mock to avoid cross-test pollution

19 tests passing, tsc + eslint clean.

* fix: address review feedback on test coverage and defensive guard

- Replace tautological saveClipboardImage assertion with spawn-arg
  verification (prefer PNG over BMP test)
- Wrap clipboardHasImage Linux branch in try/catch guard
- Fix node:fs/promises mock to use importOriginal for indirect deps
- Add missing fs/promises methods (readFile etc.) required by deps
- Remove node:fs root mock entirely to avoid cross-test pollution
- Document xclip/BMP save success path: blocked by vitest built-in
  module mock limitation

19 tests passing, tsc + eslint clean.

* fix: secure clipboard temp filename with random UUID suffix

Add random UUID to temp filename to prevent predictable path
symlink attacks (Critical review feedback). The UUID makes the
path unguessable, eliminating the symlink attack vector.

19 tests passing, tsc + eslint clean.

* fix: add O_EXCL protection against symlink attacks in saveFromCommand

Use fs.open with O_EXCL flag (O_WRONLY|O_CREAT|O_EXCL) to atomically
create the file, refusing to follow symlinks. Combined with the random
UUID filename from the previous commit, this fully addresses the
symlink attack vector identified in review.

Also update 'prefer PNG over BMP' test: with O_EXCL, the save path
fails when mkdir is mocked (directory doesn't exist), so the test
now verifies format detection only rather than the full save pipeline.

19 tests passing, tsc + eslint clean.

* fix: capture python3 stderr for BMP conversion errors

Use stdio 'pipe' for stderr instead of 'ignore' so users see useful
diagnostic messages (e.g. ModuleNotFoundError: No module named PIL)
when python3 BMP-to-PNG conversion fails.

19 tests passing, tsc + eslint clean.
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.