[{"name":"fixtures","kind":"directory","size":0,"lastCommitHash":"42ea9046ab9f75bc0fcf9f455d853f530cc15ae7","lastCommitWhen":"2026-07-23T17:52:00-07:00","lastCommitMessage":"feat(coding-agent): agent-callable refine skill (#504)\n\n* feat(coding-agent): background refine planning to not block conversation\n\nSplit the synchronous _refine() flow into two phases:\n- Planning (background): LLM call via completeSimple without\n  disconnecting from agent events or aborting the agent\n- Application (synchronous, fast): waits for agent idle, then\n  disconnects briefly, applies proposal, saves harness state,\n  rebuilds system prompt, emits refine_complete event\n\nrefine() public method signature unchanged. _waitForRefineIdle()\nonly blocks for the application phase. Interactive mode\nhandleRefineCommand fires refine without blocking the UI.\n\nRace condition fixes found by Macroscope and Cursor Bugbot:\n- Serialize concurrent refine calls via _refineApplyPending flag\n- Remove abort() from apply phase to preserve concurrent work\n- Narrow _refineInFlight to only cover disconnect+apply+reconnect\n- Re-check _refineApplyPending at turn handoff guards\n- Block turns during apply transition window\n- Clear _refineApplyPending on dispose\n- Re-sync systemPrompt after refine completes at handoff\n\n* fix(coding-agent): harden refine error paths and in-flight guard\n\n- Schedule pending message resume on planning failure and cancellation\n  so queued turns started during background planning are not stranded\n- Set _refineInFlight before calling _applyRefine so synchronous\n  listeners on refine_complete see the guard\n- Wrap refine_complete _emit in try/catch so listener failures do not\n  flip a successful refinement into a reported failure\n\nFound by Cursor Bugbot and Macroscope.\n\n* fix(coding-agent): preserve extension systemPrompt at handoff re-sync\n\nRestore extensionResult?.systemPrompt ?? this._baseSystemPrompt at\nline 3056 which was accidentally changed to just this._baseSystemPrompt\nduring the handoff re-sync refactor. Without this, heartbeat and other\nextension-modified system prompts were clobbered.\n\n* fix(coding-agent): preserve extension systemPrompt at handoff re-sync\n\nLift extensionResult declaration outside the try block so it can be\nreferenced at the handoff re-sync point. After _waitForRefineIdle,\nre-apply extensionResult?.systemPrompt ?? this._baseSystemPrompt\ninstead of just this._baseSystemPrompt so extension-modified prompts\nsurvive a concurrent refine.\n\nFound by Macroscope.\n\n* fix(coding-agent): harden background refinement (fixes #497)\n\n* feat(coding-agent): agent-callable refine skill\n\nAdd a  Python skill (SKILL.md + kernel package) that lets the\nmodel schedule continual harness refinement from IPython via\n, mirroring how the compact skill works as both an\nagent-callable tool and a user command.\n\nChanges:\n- New  skill with  and  API\n  in packages/coding-agent/skills/refine/\n- Add  to AgentSession:  stores a\n  pending request and returns immediately (non-blocking);\n  reports pending/in-flight state\n- Register  and  handlers in the kernel host\n  bridge, gated by\n- Add  fired at the turn boundary after\n  compaction checks; calls  fire-and-forget so it cannot\n  deadlock the active tool call\n- Filter the  skill from  when auto-refine\n  is not available (non-persisted sessions, subagent depth > 0)\n- Clean up  in the dispose path\n- Update RLM prompt and harness state instructions to reference\n   instead of\n- Add  constant to refinement module\n- 16 tests covering scheduling, status, turn-boundary consumption,\n  validation, gating, and dispose cleanup\n\n* test(coding-agent): align refine skill prompt assertions\n\n* feat(coding-agent): serialize refinement and persist initial goals\n\nSerialize automatic refinement at turn boundaries, abort stale branch work,\nprotect concurrent harness writes with baseline conflict checks, and preserve\nsubagent model selection across daemon rehydration.\n\nAdd durable top-level initial goals, daemon/SDK plumbing, immediate session\nflushes, inherited daemon-worker environment scrubbing, refine_complete\nevents, and real JSON CLI/socket/supervisor/worker process coverage.\n\n* fix: preserve serialized refine and snapshot catch-up\n\n* fix: guard agent_end auto-refine scheduling in serialized mode\n\nIn serialized mode, _scheduleAutoRefineAfterAgentEnd was called\nunconditionally at agent_end. When a background plan failed at the\nshouldStopAfterTurn boundary (cooldownMs=0, turn threshold met),\n_maybeAutoRefine fired from the interactive path via setTimeout(0),\nrunning a duplicate review+refine the boundary explicitly skipped.\n\nGuard _scheduleAutoRefineAfterAgentEnd behind the existing\n!this._serializedRefine check at the agent_end handler, matching\nthe _consumePendingRequestedRefine guard one line above.\n\nRegression test proves agent_end does not schedule _maybeAutoRefine\nafter a checkpoint failure (cooldownMs=0, turnInterval=1).\n\n* test: drive agent_end event path in serialized auto-refine guard regression\n\nThe previous test only waited after the checkpoint without actually\ninvoking the agent_end code path, so it passed even with the guard\nreverted. Now sets _lastAssistantMessage, spies\n_scheduleAutoRefineAfterAgentEnd, mocks _checkCompaction(false), and\ndrives _handleAgentEvent({type:'agent_end'}) through\n_processAgentEvent → _agentEventQueue. Verified the test fails when\nthe guard is temporarily reverted and passes when restored.\n\n* fix: re-queue explicit refine.run on serialized background plan failure\n\nWhen serialized background planning for an explicit refine.run fails\nat the turn boundary, the consumed request was silently dropped — the\nagent received 'scheduled: true' but no refinement ran.\n\nSerializedBackgroundPlanResult failure now carries explicit, options,\nand branchVersion. At the checkpoint, when the failure was for an\nexplicit request (skipReview=true), branchVersion is still current,\nand no newer _pendingRequestedRefine exists, the original options are\nrestored to _pendingRequestedRefine and fall through to the existing\nsynchronous pending path. Newer requests retain priority; interval\nfailures keep no-retry cooldown semantics; stale branch failures never\nrequeue.\n\nTests: (1) explicit bg plan fails then boundary replan/apply succeeds,\n(2) interval bg failure does not retry, (3) stale branch failure does\nnot requeue, (4) newer pending supersedes failed older request.\n\n* fix: prevent disposal double-refine after explicit drain\n\nIn _drainPendingRefinementForDisposal, after draining a pending\nrefine.run via _runSerializedRefine, _assistantTurnsSinceAutoRefine\nand _lastAutoRefineReviewAt were not reset. The subsequent interval\ncheck could trigger a second refinement during teardown.\n\nStamp cooldown and reset counter immediately after the explicit\ndrain, mirroring the background-plan drain path above.\n\nRegression test proves: one explicit plan/apply and zero subsequent\ninterval review/apply during disposal when the turn counter was due.\nTest verified to fail (2 planCalls) when the bookkeeping is reverted\nand pass (1 planCall) when restored.\n\nNote: public refine() vs _serializedPlanInFlight coordination deferred\npending independent design review — that hunk was reverted.\n\n* fix: coordinate public refine with serialized background planning\n\nPublic refine() now waits for _serializedPlanInFlight in its\nserialization loop. When a serialized background plan is in flight\n(started during an active turn at message_end), public refine first\nawaits the plan promise (no overlapping model calls), then waits for\nagent idle so the active turn's shouldStopAfterTurn checkpoint\nconsumes and applies the plan. Only then does public planning start.\n\nThis prevents: (1) overlapping _planRefine model calls, (2) mid-turn\n_applyRefine via _applySerializedPlan, (3) duplicate consumers of\nthe same serialized plan promise.\n\nRegression test uses a real active turn with a blocking gate tool:\nwhile the tool executes, an explicit refine.run starts bg planning,\nthen public refine() is called concurrently. Asserts max _planRefine\nconcurrency=1, bg plan applied once, public plan applied once.\nVerified mutant-sensitive: fails (planCalls=2, concurrent) without\nthe guard, passes (planCalls sequential) with it.\n\nAlso fixes disposal double-refine: after draining a pending\nrefine.run via _runSerializedRefine, stamps cooldown and resets\n_assistantTurnsSinceAutoRefine so the interval check doesn't trigger\na second refinement during teardown.\n\n* test: strengthen public-refine concurrency regression\n\nGate tool now signals from execute entry; asserts isStreaming===true\nbefore calling handleRefineHostRequest (no manual isStreaming\nfalsification). Replaces Promise.allSettled with Promise.race against\na bounded 10s timeout so failures surface. Captures plan objects and\noptions on _applyRefine, asserts apply order/identity: bg plan-1\nwith instructions 'bg' first, then public plan-2 with instructions\n'public'. Mutant-sensitive: fails (planCalls=2, concurrent) on\npre-fix source, passes with the guard.\n\n* Fix quiescence, aborted-refine, and prompt race in refine apply\n\nSnapshot _baseSystemPrompt before extension hooks so a refine that\ncompletes during the hook is detected and its stale extension prompt\ndiscarded. Replace bare waitForIdle in _applyRefine with requestAbort +\nPromise.allSettled over agent, event queue, compaction, and branch\nsummary to ensure full session quiescence without cancelling child\nruns. Clear _pendingRequestedRefine on aborted turns so stale requests\ndo not leak to subsequent checkpoints. Force pending message resume\nafter refine to re-arm queue drained by requestAbort.\n\n* fix(coding-agent): preserve refine completion event wiring\n\n* fix(coding-agent): defer serialized compaction refinement\n\n* fix(coding-agent): finish headless stack review fixes\n\nfixes #497\n\n* fix(coding-agent): cancel queued refinement on abort\n\nfixes #514\n\n* fix(coding-agent): harden refinement lifecycle (fixes #514)\n\n* fix(coding-agent): resolve serialized refine races (fixes #514)\n\n* fix(coding-agent): guard serialized planning (fixes #514)\n\n* fix(coding-agent): preserve injected prompt extensions (fixes #514)\n\n* fix(coding-agent): preserve empty injected prompts (fixes #514)\n\n* fix(coding-agent): harden combined refine stack (fixes #504)\n\n* fix(coding-agent): clear aborted refine options (fixes #504)\n\n* fix(coding-agent): make latest refine request win (fixes #504)\n\n* fix(coding-agent): record stale refine cooldown (fixes #504)\n\n* fix(coding-agent): prioritize explicit refine (fixes #504)\n\n* fix(coding-agent): close final refine races (fixes #504)\n\n* fix(coding-agent): invalidate superseded refine plans (fixes #504)\n\n---------\n\nCo-authored-by: Kevin Thomas <kevin.jt2007@gmail.com>"},{"name":"session-manager","kind":"directory","size":0,"lastCommitHash":"032e3ee74574ca16efaf8745a1394b821256a5d0","lastCommitWhen":"2026-08-18T12:17:35+02:00","lastCommitMessage":"chore: remove redundant comments and unused internals (#1505)\n\n* chore: remove redundant comments\n\n* chore(tui): remove redundant export comments\n\n* chore(coding-agent): remove redundant example comments\n\n* chore(ai): remove redundant comments\n\n* chore(coding-agent): remove obsolete core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant rpc test comments\n\n* chore(coding-agent): remove redundant CLI comments\n\n* chore(agent): remove redundant comments\n\n* chore(tui): remove redundant source comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(ai): remove redundant source comments\n\n* chore(coding-agent): remove redundant session comments\n\n* chore(coding-agent): remove redundant core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(tests): remove redundant test comments\n\n* chore: remove unused internal helpers\n\n* docs: restore public API contracts\n\n* chore(coding-agent): restore invariant documentation\n\n* chore(coding-agent): clarify agent family contracts\n\n* style(coding-agent): format restored contracts\n\n* fix: restore intentional catch explanations"},{"name":"suite","kind":"directory","size":0,"lastCommitHash":"bee1dc826360b82ca9d943ca856cd2863f597297","lastCommitWhen":"2026-09-01T22:34:13+09:00","lastCommitMessage":"feat(coding-agent): add loss-bounded compaction projection\n"},{"name":"acp-cold-cli.test.ts","kind":"file","size":6993,"lastCommitHash":"47dccfad4c0e71cd357f12d233ac44cc803af8c5","lastCommitWhen":"2026-08-11T10:58:25-07:00","lastCommitMessage":"chore(deps): consolidate dependency updates (#632)\n\n* chore(deps): consolidate dependency updates\n\n* chore(deps): fold in remaining eligible Dependabot updates\n\nAdds the reviewed bumps from #571, #599, #713, and #714 to the\nconsolidated update:\n\n- brace-expansion 5.0.7 -> 5.0.9 (transitive, lockfile only)\n- ip-address 10.2.0 -> 10.4.0 (transitive, lockfile only)\n- typebox ^1.1.24 -> ^1.3.9 in packages/agent, packages/ai, and\n  packages/coding-agent (lockfile resolves 1.3.10, released 2026-08-02,\n  past the seven-day minimum release age)\n- typescript ^5.9.2/^5.7.3 -> ^7.0.2 (dev-only; every build and check in\n  this repo runs through tsgo, nothing invokes tsc)\n\nundici 8.9.0 from #712 is intentionally NOT included: undici 8 requires\nNode >= 22.19.0 while this package supports >= 22.8.0, so the major bump\nwould silently drop supported Node versions. It stays on 7.29.0."},{"name":"acp-events.test.ts","kind":"file","size":11012,"lastCommitHash":"61eb64748eb077e2a084432db92d101a2a83e146","lastCommitWhen":"2026-08-26T15:24:10-07:00","lastCommitMessage":"Minimal CPython REPL runtime (rlm.repl) (#1685)\n\n* feat(coding-agent): add async-by-default bash() to the kernel runtime\n\n* chore(coding-agent): tighten bash() comments and changelog fragment\n\n* feat(coding-agent): add a standalone CPython REPL runtime speaking JSON lines over stdio\n\n* chore(coding-agent): tighten REPL runtime comments\n\n* feat(coding-agent): run the kernel on the REPL runtime over stdio\n\n* fix(coding-agent): reject pending host requests on kernel teardown\n\nThe runtime now fails pending host_request futures when stdin hits EOF or\na shutdown request arrives, so a cell awaiting a host reply can no longer\nblock _serve from consuming the shutdown and wedge the process. Startup\nand busy-kernel messages plus the ipython tool description now say Python\nkernel, matching the default REPL runtime client.\n\n* chore(coding-agent): describe the kernel-heavy test tag client-neutrally\n\n* feat(coding-agent): make the REPL runtime the only kernel\n\nRemoves the Jupyter/ipykernel/ZMQ kernel client, the fork server, the\nPRIME_AGENT_KERNEL escape hatch, and the %%bash/%cd/%env cell rewriting.\nMagic-style cells (%/%%/!) return a one-line error naming the Python or\nbash() replacement. The kernel venv no longer installs ipykernel;\nexisting venvs are rebuilt once via the bootstrap schema bump. Old\nsnapshot artifacts still restore through the runtime's pickle compat.\n\n* fix(coding-agent): close MCP transports in REPL shutdown\n\n* fix(coding-agent): address bash() review findings — exact tail retention, foreground-status lifecycle with group anchoring, post-kill forkserver reap, Windows start-id parity, executor-free await\n\n* fix(coding-agent): tree-kill bash() process trees on Windows and make running reflect group liveness\n\n* fix(runtime): address repl runtime review findings\n\n- revalidate targeted interrupts through SIGINT delivery so a stale signal\n  cannot cancel a later request\n- preserve a parked untargeted interrupt while another request is inflight\n- reject non-string interrupt ids and validate snapshot options\n  (prune_oversized bool, max_bytes/max_variable_bytes present => int)\n- guard str(exc) in error/skip/fail reasons so a broken __str__ cannot\n  kill the runtime\n- fail the snapshot when the manifest write fails (before any pruning)\n- report 'snapshot not found' reason on restore of a missing path\n- wait unbounded for the output-pump drain marker so done never precedes\n  captured output and marker bytes never leak\n- document that aggregate-cap skips are not pruned\n\n* fix(coding-agent): carry bash() status pipe as stdin so strict-POSIX shells accept single-digit fd redirections\n\n* fix(coding-agent): address host-swap review findings — runtime-neutral kernel wording, %cd/%env rewrite fidelity, linear-time magic regexes, restart supersession guard\n\n* fix(coding-agent): reject stale column-0 line magics on any cell line, not just the first\n\n* fix(coding-agent): close status fds when wake-pipe creation fails and gate bash() commands on orphan-journal registration\n\n* fix(coding-agent): strip quoted %cd targets, use UTF-16-safe %env parsing, and expand $var/${var} values PEP-215-style\n\n* fix(coding-agent): fail rlm.run fast outside a live kernel so vitest workers cannot hang on a comm that never replies\n\n* fix(coding-agent): clear the active cell id before terminal events so late background output is never tagged with a finished cell\n\n* fix(coding-agent): update legacy IPython-era tests to assert cutover behavior\n\n* fix(coding-agent): describe the column-0 magic scan without referencing the removed rewrite backend\n\n* fix(coding-agent): consume parked interrupts on compile failures and survive user-closed stdio in the drain path\n\n* fix(coding-agent): redact bare %env listings, prefer '=' in %env parsing, echo %cd targets, and keep graceful shutdowns owning their cleanup\n\n* fix(coding-agent): reject kernel startup promptly on spawn errors and commit %cd previous-dir tracking only after chdir succeeds\n\n* fix(coding-agent): trim ParsedIpythonBashCell to the body field its callers use\n\n* fix(coding-agent): kill full process trees in the Windows orphan reaper via taskkill /T\n\n* fix(coding-agent): survive compile-phase crashes and fd-reuse drain hangs in the REPL runtime\n\n* fix(coding-agent): shield snapshot prune deletions from interrupts and pin the host comm probe to its real seam\n\n* fix(coding-agent): route list_names through the per-request backstop and skip non-string namespace keys\n\n* fix(coding-agent): reject snapshot requests whose manifest path aliases the payload path\n\n* fix(coding-agent): reject negative snapshot size caps that would prune every user variable\n\n* fix(coding-agent): kill one-shot await bash() on cancel, resolve Windows helpers via System32, retry taskkill after reap, and fail closed on orphan-journal enrollment\n\n* fix(coding-agent): attribute REPL stream output at write time so raw fd and user-thread bytes never carry another cell's id\n\n* fix(coding-agent): surface unattributed REPL stream output as separate background output instead of dropping or merging it\n\n* fix(coding-agent): confirm group exit before a cancelled one-shot bash() await propagates and complete-write orphan-journal records\n\n* fix(coding-agent): expose a working sys.stdout.buffer on the tagged REPL writer routing bytes through the null-attributed raw channel\n\n* fix(coding-agent): mark between-cell background output truncated when the pending buffer cap is hit\n\n* fix(coding-agent): shield the cancelled-await bash() confirm-exit from re-cancellation, fail clearly without bash on Windows, and fence slow pumps out of result assembly\n\n* fix(coding-agent): survive hostile protocol lines in the REPL reader thread and interrupt without pthread_kill on Windows\n\n* fix(coding-agent): send the protocol shutdown from dispose() so the runtime closes MCP servers and kills live bash groups before the hard kill\n\n* fix(coding-agent): flag the pump's read-to-commit window so the bash() drain fence cannot miss an in-flight chunk\n\n* fix(coding-agent): guard the whole REPL request line against hostile input, reject duplicate in-flight ids, complete short buffer-pipe writes, and clean the snapshot temp file on KeyboardInterrupt\n\n* fix(coding-agent): drop stale between-cell background output on kernel teardown so it cannot surface after a restart\n\n* fix(coding-agent): assert the tagged channel only in the large buffer-write REPL test since cross-channel ordering is not guaranteed\n\n* fix(coding-agent): resolve taskkill via absolute System32 path in the host orphan reaper\n\n* fix(coding-agent): write the inactive orphan-journal record only after a delivered kill so undelivered signals leave the host reaper in charge\n\n* fix(coding-agent): keep a REPL request interrupt-targetable through its trailing-expression repr and output drain until done is emitted\n\n* fix(coding-agent): count an already-exited leader as delivered in the Windows bash() reap so clean exits still journal inactive\n\n* fix(coding-agent): reject NaN and Infinity in emit() payloads before they corrupt REPL protocol framing\n\n* chore(coding-agent): correct the stale ipykernel requirement on the python override doc\n\n* chore(coding-agent): drop migration-era wording from kernel comments\n\n* fix(coding-agent): resolve trusted absolute shell host-side and close Windows journal/reap gaps\n\n* fix(coding-agent): best-effort-kill pid-only orphan records in daemon force-stop and recovery reaps\n\n* refactor(coding-agent): drop the magic-cell rejection gate\n\n%-prefixed and !-prefixed cells now reach CPython and fail with its own\nSyntaxError, which names the offending line. The rejection layer guarded\nagainst model-produced IPython syntax, but with the shipped prompt fresh\nsessions do not produce it, and the plain SyntaxError is protection enough.\nparseIpythonBashCell stays: transcripts from ipykernel-era sessions render\n%%bash cells with shell highlighting forever.\n\n* fix(coding-agent): report a committed destructive snapshot as success even when an interrupt was parked\n\n* chore(ai): drop stray live-regen drift in models.generated.ts\n\nad657d7ec accidentally committed generate-models output produced by a local\nbuild; the catalog belongs to its own regen PRs.\n\n* test(coding-agent): expect a plain SyntaxError for legacy %%bash cells after the magic-rejection gate removal\n\n* fix(coding-agent): consume a finishing-targeted interrupt after a completed state request instead of failing the done\n\n* fix(coding-agent): exit the REPL runtime when its owner dies even during a busy cell\n\n* fix(coding-agent): resolve the kernel bash shell only from trusted absolute paths on Windows\n\n* fix(coding-agent): contain Windows bash children with kill-on-close job objects\n\n* test(coding-agent): cover owner death during a non-yielding REPL cell\n\n* fix(coding-agent): skip concurrently deleted names during snapshot instead of aborting\n\n* fix(coding-agent): fall back to taskkill when job termination fails\n\n* fix(coding-agent): stop telling REPL-default users they need ipykernel\n\n* fix(coding-agent): clear the SIGINT target when its request finishes\n\n* test(coding-agent): drop migration-era wording from the %%bash rejection comment\n\n* fix(coding-agent): start Windows bash children suspended and fail closed when job containment cannot be established\n\n* fix(coding-agent): re-assert the kernel SIGINT handler between cells so a cell rebinding SIGINT cannot break interrupts\n\n* fix(coding-agent): kill the whole tree for enriched orphan records on Windows force-stop\n\nstopTrackedProcess signals only the shell pid on Windows; use killOrphanProcess (taskkill /T) after the identity check, matching the owned-session-worker and daemon-supervisor reapers.\n\n* docs(coding-agent): describe current magic-cell behavior in release notes\n\nMagic-style cells fail with a plain SyntaxError; the migration error and %cd/%env rewrites were removed, so the notes stop claiming them.\n\n* fix(coding-agent): skip the liveness check when the orphan identity is stale\n\nA reused pid looked like a failed kill after the identity re-check skipped taskkill, blocking worker cleanup with a spurious failure.\n\n* fix(coding-agent): journal Windows bash() children before job assignment so a kernel kill mid-spawn cannot leak an unjournaled suspended process\n\n* fix(coding-agent): pre-create the Windows bash() job before spawn and contain the child before the journal start-id query\n\n* fix(coding-agent): create Windows bash() children atomically inside the kill-on-close job via PROC_THREAD_ATTRIBUTE_JOB_LIST, closing the Popen-to-assignment leak window\n\n* chore(coding-agent): compress the atomic-job-association comments to one-line rationale\n\n* fix(coding-agent): send duplicate-id protocol errors outside the interrupt lock and reject int payloads in the captured stdout buffer\n\n* docs(coding-agent): update the kernel provisioner docstring for the REPL/IPython split\n\n* fix(coding-agent): retain the Windows bash() process handle through job cleanup and taskkill fallbacks so a recycled pid can never be killed\n\n* fix(coding-agent): serialize Windows bash() abort cleanup under the kill lock so shutdown taskkill can never race the process-handle close\n\n* fix(coding-agent): commit REPL snapshot payload and manifest atomically via unique temp files with guaranteed cleanup and parked-SIGINT restore\n\n* fix(coding-agent): stage REPL restore before an interrupt-parked apply and recover committed snapshot/restore results from protocol interrupts so a committed operation is never misreported as failed\n\n* chore(coding-agent): compress restore-shield rationale comments to one line each\n\n* fix(coding-agent): surface unattributed background output in IPython cell details and render it after the traceback in the expanded cell view\n\n* docs(coding-agent): replace stale Jupyter comm vocabulary in rlm-runtime failure modes and focused validation with stdio-transport equivalents\n\n* docs(coding-agent): describe the REPL trust boundary and runtime-bootstrap failure in stdio terms and drop the removed TokenUsage export\n\n* fix(runtime): address REPL review findings\n\n* fix(runtime): preserve near-cap snapshots\n\n---------\n\nCo-authored-by: Seth <seth@primeintellect.ai>"},{"name":"acp-kernel-features.test.ts","kind":"file","size":10616,"lastCommitHash":"61eb64748eb077e2a084432db92d101a2a83e146","lastCommitWhen":"2026-08-26T15:24:10-07:00","lastCommitMessage":"Minimal CPython REPL runtime (rlm.repl) (#1685)\n\n* feat(coding-agent): add async-by-default bash() to the kernel runtime\n\n* chore(coding-agent): tighten bash() comments and changelog fragment\n\n* feat(coding-agent): add a standalone CPython REPL runtime speaking JSON lines over stdio\n\n* chore(coding-agent): tighten REPL runtime comments\n\n* feat(coding-agent): run the kernel on the REPL runtime over stdio\n\n* fix(coding-agent): reject pending host requests on kernel teardown\n\nThe runtime now fails pending host_request futures when stdin hits EOF or\na shutdown request arrives, so a cell awaiting a host reply can no longer\nblock _serve from consuming the shutdown and wedge the process. Startup\nand busy-kernel messages plus the ipython tool description now say Python\nkernel, matching the default REPL runtime client.\n\n* chore(coding-agent): describe the kernel-heavy test tag client-neutrally\n\n* feat(coding-agent): make the REPL runtime the only kernel\n\nRemoves the Jupyter/ipykernel/ZMQ kernel client, the fork server, the\nPRIME_AGENT_KERNEL escape hatch, and the %%bash/%cd/%env cell rewriting.\nMagic-style cells (%/%%/!) return a one-line error naming the Python or\nbash() replacement. The kernel venv no longer installs ipykernel;\nexisting venvs are rebuilt once via the bootstrap schema bump. Old\nsnapshot artifacts still restore through the runtime's pickle compat.\n\n* fix(coding-agent): close MCP transports in REPL shutdown\n\n* fix(coding-agent): address bash() review findings — exact tail retention, foreground-status lifecycle with group anchoring, post-kill forkserver reap, Windows start-id parity, executor-free await\n\n* fix(coding-agent): tree-kill bash() process trees on Windows and make running reflect group liveness\n\n* fix(runtime): address repl runtime review findings\n\n- revalidate targeted interrupts through SIGINT delivery so a stale signal\n  cannot cancel a later request\n- preserve a parked untargeted interrupt while another request is inflight\n- reject non-string interrupt ids and validate snapshot options\n  (prune_oversized bool, max_bytes/max_variable_bytes present => int)\n- guard str(exc) in error/skip/fail reasons so a broken __str__ cannot\n  kill the runtime\n- fail the snapshot when the manifest write fails (before any pruning)\n- report 'snapshot not found' reason on restore of a missing path\n- wait unbounded for the output-pump drain marker so done never precedes\n  captured output and marker bytes never leak\n- document that aggregate-cap skips are not pruned\n\n* fix(coding-agent): carry bash() status pipe as stdin so strict-POSIX shells accept single-digit fd redirections\n\n* fix(coding-agent): address host-swap review findings — runtime-neutral kernel wording, %cd/%env rewrite fidelity, linear-time magic regexes, restart supersession guard\n\n* fix(coding-agent): reject stale column-0 line magics on any cell line, not just the first\n\n* fix(coding-agent): close status fds when wake-pipe creation fails and gate bash() commands on orphan-journal registration\n\n* fix(coding-agent): strip quoted %cd targets, use UTF-16-safe %env parsing, and expand $var/${var} values PEP-215-style\n\n* fix(coding-agent): fail rlm.run fast outside a live kernel so vitest workers cannot hang on a comm that never replies\n\n* fix(coding-agent): clear the active cell id before terminal events so late background output is never tagged with a finished cell\n\n* fix(coding-agent): update legacy IPython-era tests to assert cutover behavior\n\n* fix(coding-agent): describe the column-0 magic scan without referencing the removed rewrite backend\n\n* fix(coding-agent): consume parked interrupts on compile failures and survive user-closed stdio in the drain path\n\n* fix(coding-agent): redact bare %env listings, prefer '=' in %env parsing, echo %cd targets, and keep graceful shutdowns owning their cleanup\n\n* fix(coding-agent): reject kernel startup promptly on spawn errors and commit %cd previous-dir tracking only after chdir succeeds\n\n* fix(coding-agent): trim ParsedIpythonBashCell to the body field its callers use\n\n* fix(coding-agent): kill full process trees in the Windows orphan reaper via taskkill /T\n\n* fix(coding-agent): survive compile-phase crashes and fd-reuse drain hangs in the REPL runtime\n\n* fix(coding-agent): shield snapshot prune deletions from interrupts and pin the host comm probe to its real seam\n\n* fix(coding-agent): route list_names through the per-request backstop and skip non-string namespace keys\n\n* fix(coding-agent): reject snapshot requests whose manifest path aliases the payload path\n\n* fix(coding-agent): reject negative snapshot size caps that would prune every user variable\n\n* fix(coding-agent): kill one-shot await bash() on cancel, resolve Windows helpers via System32, retry taskkill after reap, and fail closed on orphan-journal enrollment\n\n* fix(coding-agent): attribute REPL stream output at write time so raw fd and user-thread bytes never carry another cell's id\n\n* fix(coding-agent): surface unattributed REPL stream output as separate background output instead of dropping or merging it\n\n* fix(coding-agent): confirm group exit before a cancelled one-shot bash() await propagates and complete-write orphan-journal records\n\n* fix(coding-agent): expose a working sys.stdout.buffer on the tagged REPL writer routing bytes through the null-attributed raw channel\n\n* fix(coding-agent): mark between-cell background output truncated when the pending buffer cap is hit\n\n* fix(coding-agent): shield the cancelled-await bash() confirm-exit from re-cancellation, fail clearly without bash on Windows, and fence slow pumps out of result assembly\n\n* fix(coding-agent): survive hostile protocol lines in the REPL reader thread and interrupt without pthread_kill on Windows\n\n* fix(coding-agent): send the protocol shutdown from dispose() so the runtime closes MCP servers and kills live bash groups before the hard kill\n\n* fix(coding-agent): flag the pump's read-to-commit window so the bash() drain fence cannot miss an in-flight chunk\n\n* fix(coding-agent): guard the whole REPL request line against hostile input, reject duplicate in-flight ids, complete short buffer-pipe writes, and clean the snapshot temp file on KeyboardInterrupt\n\n* fix(coding-agent): drop stale between-cell background output on kernel teardown so it cannot surface after a restart\n\n* fix(coding-agent): assert the tagged channel only in the large buffer-write REPL test since cross-channel ordering is not guaranteed\n\n* fix(coding-agent): resolve taskkill via absolute System32 path in the host orphan reaper\n\n* fix(coding-agent): write the inactive orphan-journal record only after a delivered kill so undelivered signals leave the host reaper in charge\n\n* fix(coding-agent): keep a REPL request interrupt-targetable through its trailing-expression repr and output drain until done is emitted\n\n* fix(coding-agent): count an already-exited leader as delivered in the Windows bash() reap so clean exits still journal inactive\n\n* fix(coding-agent): reject NaN and Infinity in emit() payloads before they corrupt REPL protocol framing\n\n* chore(coding-agent): correct the stale ipykernel requirement on the python override doc\n\n* chore(coding-agent): drop migration-era wording from kernel comments\n\n* fix(coding-agent): resolve trusted absolute shell host-side and close Windows journal/reap gaps\n\n* fix(coding-agent): best-effort-kill pid-only orphan records in daemon force-stop and recovery reaps\n\n* refactor(coding-agent): drop the magic-cell rejection gate\n\n%-prefixed and !-prefixed cells now reach CPython and fail with its own\nSyntaxError, which names the offending line. The rejection layer guarded\nagainst model-produced IPython syntax, but with the shipped prompt fresh\nsessions do not produce it, and the plain SyntaxError is protection enough.\nparseIpythonBashCell stays: transcripts from ipykernel-era sessions render\n%%bash cells with shell highlighting forever.\n\n* fix(coding-agent): report a committed destructive snapshot as success even when an interrupt was parked\n\n* chore(ai): drop stray live-regen drift in models.generated.ts\n\nad657d7ec accidentally committed generate-models output produced by a local\nbuild; the catalog belongs to its own regen PRs.\n\n* test(coding-agent): expect a plain SyntaxError for legacy %%bash cells after the magic-rejection gate removal\n\n* fix(coding-agent): consume a finishing-targeted interrupt after a completed state request instead of failing the done\n\n* fix(coding-agent): exit the REPL runtime when its owner dies even during a busy cell\n\n* fix(coding-agent): resolve the kernel bash shell only from trusted absolute paths on Windows\n\n* fix(coding-agent): contain Windows bash children with kill-on-close job objects\n\n* test(coding-agent): cover owner death during a non-yielding REPL cell\n\n* fix(coding-agent): skip concurrently deleted names during snapshot instead of aborting\n\n* fix(coding-agent): fall back to taskkill when job termination fails\n\n* fix(coding-agent): stop telling REPL-default users they need ipykernel\n\n* fix(coding-agent): clear the SIGINT target when its request finishes\n\n* test(coding-agent): drop migration-era wording from the %%bash rejection comment\n\n* fix(coding-agent): start Windows bash children suspended and fail closed when job containment cannot be established\n\n* fix(coding-agent): re-assert the kernel SIGINT handler between cells so a cell rebinding SIGINT cannot break interrupts\n\n* fix(coding-agent): kill the whole tree for enriched orphan records on Windows force-stop\n\nstopTrackedProcess signals only the shell pid on Windows; use killOrphanProcess (taskkill /T) after the identity check, matching the owned-session-worker and daemon-supervisor reapers.\n\n* docs(coding-agent): describe current magic-cell behavior in release notes\n\nMagic-style cells fail with a plain SyntaxError; the migration error and %cd/%env rewrites were removed, so the notes stop claiming them.\n\n* fix(coding-agent): skip the liveness check when the orphan identity is stale\n\nA reused pid looked like a failed kill after the identity re-check skipped taskkill, blocking worker cleanup with a spurious failure.\n\n* fix(coding-agent): journal Windows bash() children before job assignment so a kernel kill mid-spawn cannot leak an unjournaled suspended process\n\n* fix(coding-agent): pre-create the Windows bash() job before spawn and contain the child before the journal start-id query\n\n* fix(coding-agent): create Windows bash() children atomically inside the kill-on-close job via PROC_THREAD_ATTRIBUTE_JOB_LIST, closing the Popen-to-assignment leak window\n\n* chore(coding-agent): compress the atomic-job-association comments to one-line rationale\n\n* fix(coding-agent): send duplicate-id protocol errors outside the interrupt lock and reject int payloads in the captured stdout buffer\n\n* docs(coding-agent): update the kernel provisioner docstring for the REPL/IPython split\n\n* fix(coding-agent): retain the Windows bash() process handle through job cleanup and taskkill fallbacks so a recycled pid can never be killed\n\n* fix(coding-agent): serialize Windows bash() abort cleanup under the kill lock so shutdown taskkill can never race the process-handle close\n\n* fix(coding-agent): commit REPL snapshot payload and manifest atomically via unique temp files with guaranteed cleanup and parked-SIGINT restore\n\n* fix(coding-agent): stage REPL restore before an interrupt-parked apply and recover committed snapshot/restore results from protocol interrupts so a committed operation is never misreported as failed\n\n* chore(coding-agent): compress restore-shield rationale comments to one line each\n\n* fix(coding-agent): surface unattributed background output in IPython cell details and render it after the traceback in the expanded cell view\n\n* docs(coding-agent): replace stale Jupyter comm vocabulary in rlm-runtime failure modes and focused validation with stdio-transport equivalents\n\n* docs(coding-agent): describe the REPL trust boundary and runtime-bootstrap failure in stdio terms and drop the removed TokenUsage export\n\n* fix(runtime): address REPL review findings\n\n* fix(runtime): preserve near-cap snapshots\n\n---------\n\nCo-authored-by: Seth <seth@primeintellect.ai>"},{"name":"acp-mcp.test.ts","kind":"file","size":6495,"lastCommitHash":"c75a637b00d3b52762841e72efe92289a0d55b49","lastCommitWhen":"2026-08-20T11:40:26-07:00","lastCommitMessage":"feat(coding-agent): support ACP MCP programs (#1378)\n\n* feat(coding-agent): support ACP MCP programs\n\n* feat(coding-agent): port ACP MCP servers to kernel runtime\n\n* fix(coding-agent): fence ACP MCP daemon ownership\n\n* fix(coding-agent): release ACP MCP leases on detach\n\n* test(coding-agent): preserve daemon prototype fixtures\n\n* fix(coding-agent): roll back failed ACP MCP claims\n\n* fix(coding-agent): reap ACP MCP transports on release\n\n* fix(coding-agent): isolate ACP MCP release failures\n\n* fix(coding-agent): retry empty-session MCP cleanup\n\n---------\n\nCo-authored-by: Seth <seth@primeintellect.ai>"},{"name":"acp-rlm-subagents.test.ts","kind":"file","size":5550,"lastCommitHash":"7e70aea03dcf78c97aa65cc2a8e1aeb2a068e5fe","lastCommitWhen":"2026-08-31T22:05:28+09:00","lastCommitMessage":"complete guarded RLM results and background completion wakeups\n"},{"name":"acp-stop-reason.test.ts","kind":"file","size":1966,"lastCommitHash":"032e3ee74574ca16efaf8745a1394b821256a5d0","lastCommitWhen":"2026-08-18T12:17:35+02:00","lastCommitMessage":"chore: remove redundant comments and unused internals (#1505)\n\n* chore: remove redundant comments\n\n* chore(tui): remove redundant export comments\n\n* chore(coding-agent): remove redundant example comments\n\n* chore(ai): remove redundant comments\n\n* chore(coding-agent): remove obsolete core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant rpc test comments\n\n* chore(coding-agent): remove redundant CLI comments\n\n* chore(agent): remove redundant comments\n\n* chore(tui): remove redundant source comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(ai): remove redundant source comments\n\n* chore(coding-agent): remove redundant session comments\n\n* chore(coding-agent): remove redundant core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(tests): remove redundant test comments\n\n* chore: remove unused internal helpers\n\n* docs: restore public API contracts\n\n* chore(coding-agent): restore invariant documentation\n\n* chore(coding-agent): clarify agent family contracts\n\n* style(coding-agent): format restored contracts\n\n* fix: restore intentional catch explanations"},{"name":"agent-activity.test.ts","kind":"file","size":6914,"lastCommitHash":"032e3ee74574ca16efaf8745a1394b821256a5d0","lastCommitWhen":"2026-08-18T12:17:35+02:00","lastCommitMessage":"chore: remove redundant comments and unused internals (#1505)\n\n* chore: remove redundant comments\n\n* chore(tui): remove redundant export comments\n\n* chore(coding-agent): remove redundant example comments\n\n* chore(ai): remove redundant comments\n\n* chore(coding-agent): remove obsolete core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant rpc test comments\n\n* chore(coding-agent): remove redundant CLI comments\n\n* chore(agent): remove redundant comments\n\n* chore(tui): remove redundant source comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(ai): remove redundant source comments\n\n* chore(coding-agent): remove redundant session comments\n\n* chore(coding-agent): remove redundant core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(tests): remove redundant test comments\n\n* chore: remove unused internal helpers\n\n* docs: restore public API contracts\n\n* chore(coding-agent): restore invariant documentation\n\n* chore(coding-agent): clarify agent family contracts\n\n* style(coding-agent): format restored contracts\n\n* fix: restore intentional catch explanations"},{"name":"agent-connection-daemon.test.ts","kind":"file","size":105319,"lastCommitHash":"b0023ef6c0a260b08f9c00d08e81f4106da7430e","lastCommitWhen":"2026-09-01T21:18:22+09:00","lastCommitMessage":"feat(coding-agent): add dot continuation shortcut\n"},{"name":"agent-connection-in-process.test.ts","kind":"file","size":12575,"lastCommitHash":"b0023ef6c0a260b08f9c00d08e81f4106da7430e","lastCommitWhen":"2026-09-01T21:18:22+09:00","lastCommitMessage":"feat(coding-agent): add dot continuation shortcut\n"},{"name":"agent-connection-snapshot.test.ts","kind":"file","size":1906,"lastCommitHash":"9160b212dfd01e4490beb3157fb717a1fd27584c","lastCommitWhen":"2026-06-09T21:11:57-07:00","lastCommitMessage":"prepare daemon protocol for swarm reconnect (#81)\n\n* prepare daemon protocol for swarm reconnect\n\n* fix daemon reconnect cursor handling\n"},{"name":"agent-observe.test.ts","kind":"file","size":1771,"lastCommitHash":"2c30b48b4b05c4e7efd184dc13bc0ed7daa1c2a4","lastCommitWhen":"2026-07-01T18:53:02-07:00","lastCommitMessage":"Add user orchestrator for agent messaging and observation (#207)\n\n* Add user orchestrator agent messaging and observe\n\n* Add orchestration heartbeat skill\n\n* Address user orchestrator PR review comments\n\n* Tighten agent message rate limiting\n\n* Harden agent message queue safety\n\n* Preserve agent message reservations on queue clear\n\n* Serialize agent messages per target\n\n* Handle queued agent message edge cases\n\n* Preserve orchestration heartbeat schedule on refresh\n\n* Fix agent message queue handling\n\n* Fix agent message review issues\n\n* Defer agent message acknowledgment past stream start\n\n* Fix agent message acceptance race\n\n* Avoid blocking agent message send on pre-prompt work\n\n* Avoid blocking agent messages on pre-prompt hooks\n\n* Hide daemon prompt fast path from public options\n\n* fix(coding-agent): harden agent message delivery\n\n* fix(coding-agent): keep failed agent messages from consuming limits\n\n* fix(coding-agent): address agent orchestrator review issues\n\n* fix(coding-agent): address agent orchestrator review issues\n\n* fix(coding-agent): queue sends during accepted retries\n\n* fix(coding-agent): address remaining orchestrator bot findings\n\n* test(coding-agent): update streaming prompt guard expectation\n\n* test(coding-agent): remove duplicate daemon queue case\n\n* fix(coding-agent): harden prompt acceptance races\n\n* fix(coding-agent): serialize agent message clearing\n\n* fix(coding-agent): lock agent message safety controls\n\n* fix(coding-agent): harden agent message pause\n\n* fix(coding-agent): queue agent messages internally\n\n* fix(coding-agent): release prompt lock when streaming starts\n\n* fix(coding-agent): reject messages paused while locked\n\n* fix(coding-agent): reject messages after session switch\n\n* fix(coding-agent): serialize session close with messages\n\n* fix(coding-agent): reject messages for closing sessions\n\n* fix(coding-agent): queue messages during compaction\n\n* fix(coding-agent): avoid blocking messages during prompt prep\n\n* fix(coding-agent): track queued agent messages\n\n* fix(coding-agent): preserve agent message queue identity\n\nFixes #207\n\n* fix(coding-agent): parse canonical agent message ids\n\nFixes #207\n\n* fix(coding-agent): clear accepted agent messages\n\nFixes #207\n\n* fix(coding-agent): sanitize agent message metadata\n\nFixes #207\n\n* fix(coding-agent): suppress cleared accepted messages\n\nFixes #207\n\n* fix(coding-agent): clear accepted prompt state on failure\n\nFixes #207\n\n* fix(coding-agent): account for accepted message delivery\n\nFixes #207\n\n* fix(coding-agent): close accepted prompt busy gap\n\nFixes #207\n\n* fix(coding-agent): harden accepted message cleanup\n\nFixes #207\n\n* fix(coding-agent): report accepted messages as pending\n\nFixes #207\n\n* fix(coding-agent): wait for accepted message delivery\n\nFixes #207\n\n* fix(coding-agent): report duplicate follow-up preflight\n\nFixes #207\n\n* fix(coding-agent): reject cleared accepted messages\n\nFixes #207\n\n* fix(coding-agent): reject failed agent message delivery\n\nFixes #207\n\n* fix(coding-agent): emit cleared accepted agent end\n\nFixes #207\n\n* fix(coding-agent): unblock idle prompts after agent delivery\n\nFixes #207\n\n* fix(coding-agent): wait for agent message delivery\n\nFixes #207\n\n* fix(coding-agent): avoid direct delivery waiter hang\n\nFixes #207\n\n* fix(coding-agent): settle late agent message waits\n\nFixes #207\n\n* fix(coding-agent): reject delivery waits on dispose\n\nFixes #207\n\n* fix(coding-agent): acknowledge queued agent messages\n\n* fix(coding-agent): review fixes for agent messaging admission, capacity, lifecycle, and CLI parsing\n\n* fix(coding-agent): drain agent messages after bash\n\n* fix(coding-agent): preserve queued message order after bash\n\n* fix(coding-agent): resolve queued agent-message sends without blocking on delivery; settle waiters on abort\n\n* fix(coding-agent): report busy observed sessions\n\n* fix(coding-agent): settle agent-message lifecycle edge cases\n\n* fix(coding-agent): keep deferred agent messages ordered\n\n* fix(coding-agent): harden queued message cleanup\n\n* fix(coding-agent): report queued direct accepts\n\n* fix(coding-agent): harden agent message delivery state\n\n* fix(coding-agent): restore next-turn context after failed accept\n\n* fix(coding-agent): defer cron while agent accepts messages\n\n* fix(coding-agent): queue cron during agent-message accept\n\n* fix(coding-agent): normalize orchestration heartbeat intervals\n\n* fix(coding-agent): recheck busy state before direct accept\n\n* fix(coding-agent): preserve next-turn context in queued accepts\n\n* fix(coding-agent): settle queued accept edge cases\n\n* fix(coding-agent): serialize daemon prompts with agent messages\n\n---------\n\nCo-authored-by: Kevin Thomas <kevin.jt2007@gmail.com>"},{"name":"agent-session-bus.test.ts","kind":"file","size":16324,"lastCommitHash":"e714b3a61a900338ecb28681336dda800ffff0b8","lastCommitWhen":"2026-08-05T17:46:39+02:00","lastCommitMessage":"refactor(coding-agent): make agent messages steer-only (#631)"},{"name":"agent-session-concurrent.test.ts","kind":"file","size":35330,"lastCommitHash":"ceb418049dd929676beb13f77a6d697bcd52f854","lastCommitWhen":"2026-08-28T17:09:00+02:00","lastCommitMessage":"refactor(coding-agent): centralize agent-message admission in AgentSession (#1861)\n\n* refactor(coding-agent): query agent peers on demand instead of broadcasting mirrors\n\n* refactor(coding-agent): centralize agent-message admission in AgentSession\n\n* fix(coding-agent): respond to unknown worker commands instead of dropping them\n\nLegacy worker_sync_agent_peers commands from an older supervisor fell\nthrough handleWorkerCommand without a response, forcing the requester\nto wait out its full 5s timeout on every peer sync. A default case now\nwrites an immediate failure for any unhandled worker command.\n\n* fix(daemon): re-check cron job runnability after prompt admission fence\n\nrunCronJob snapshotted the runnable job before promptHeartbeat/\npromptUntilAccepted, which can wait on the session admission fence. A job\ncancelled or completed during that wait was still delivered. Re-check via\nthe admissionCommitted hook and skip when the job is no longer runnable.\n\n* fix(daemon): skip cron delivery when the job content changed during admission\n\nupdateRlmHeartbeat mutates prompt/deliveryMode in place under the same job\nid, so the existence-only admissionCommitted re-check still delivered the\nstale snapshot captured before the admission fence wait. Compare the\nrefreshed job's prompt and deliveryMode and skip on mismatch; the skip\nreschedules nextRunAt so the updated instruction is delivered next cycle.\n\n* fix(coding-agent): re-check prompt admission after async input normalization\n\n_prompt ran admissionCommitted before _normalizeSubmission, but async\nextension input handlers are awaited between that check and\n_admitSessionInput, so a cron job cancelled or updated during the await\nstill delivered its stale prompt. Re-run the callback after the awaited\nnormalization so invalidated content is not admitted."},{"name":"agent-session-config.test.ts","kind":"file","size":6446,"lastCommitHash":"d98d0762c0dea0e4d176233c03965dc05a8b33bf","lastCommitWhen":"2026-08-20T10:52:30+02:00","lastCommitMessage":"feat(acp): harden resident session lifecycle (#1494)\n\n* feat(acp): harden resident session lifecycle\n\n* test(daemon): align recovery fixtures with durable context\n\n* fix(acp): validate durable host settings\n\n* fix(daemon): clean up failed resident resources\n\n* fix(daemon): recover owned workers from fresh context\n\n* fix(acp): verify authoritative completion state\n\n* fix(daemon): refresh requested child roster\n\n* fix(acp): read child roster without reattaching\n\n* fix(daemon): preserve telemetry opt-out on recovery\n\n* fix(daemon): scope resident path conflicts\n\n* test(acp): remove runtime publish hook\n\n* fix(acp): drain admitted updates on close\n\n* fix(daemon): merge fresh supervisor defaults\n\n* fix(acp): await autonomous lifecycle settlement\n\n* fix(acp): preserve daemon input fences\n\n* fix(acp): serialize terminal lifecycle turns\n\n* fix(acp): reacquire daemon fences after reconnect\n\n* fix(acp): fail closed across abort cuts\n\n* fix(acp): resume queued input after pause\n\n* fix(acp): invalidate pending pumps on pause\n\n* fix(acp): preserve pause ownership through supervisor\n\n* fix(acp): fail closed on pause cleanup loss\n\n* test(daemon): initialize pause ownership harness\n\n* fix(acp): fence detach pause cleanup\n\n* fix(daemon): preserve detach-all cleanup\n\n* test(daemon): initialize worker pause registry\n\n* fix(daemon): reacquire pauses across release\n\n* fix(daemon): clear stable detach selectors\n\n* fix(daemon): retain detach fences on attach failure\n\n* refactor(daemon): keep descriptor validation private\n\n* docs(changelog): describe ACP lifecycle fencing\n\n* fix(acp): settle restart and failed close lifecycle\n\n* fix(acp): serialize cancel after failed close\n\n* fix(acp): preserve lifecycle reconciliation ordering\n\n* fix(acp): settle deleted child runtimes\n\n* test(acp): consolidate child deletion regressions\n\n* fix(acp): rearm settled child deletion\n\n* fix(acp): preserve recursive terminal settlement\n\n* test(acp): update terminal notice regression"},{"name":"agent-session-dynamic-provider.test.ts","kind":"file","size":3684,"lastCommitHash":"3e5ad67e0f325d4888f82f9b82966218eb4407f5","lastCommitWhen":"2026-05-07T15:59:42+02:00","lastCommitMessage":"chore: migrate pi packages to earendil works scope\n"},{"name":"agent-session-dynamic-tools.test.ts","kind":"file","size":5563,"lastCommitHash":"b396363a8b8116dad0aada22eaf24a3cb3bb8c3f","lastCommitWhen":"2026-05-08T16:11:24-07:00","lastCommitMessage":"add model agnostic rlm system prompt (#4)\n\n* add rlm bootstrap system prompt\n\n* make rlm prompt model agnostic\n\n* match rlm harness system prompt"},{"name":"agent-session-queue-mutation.test.ts","kind":"file","size":12398,"lastCommitHash":"71ca6cfd1a2f7205ca0ec1baa65d10d0ed88f6e8","lastCommitWhen":"2026-08-10T22:09:01-04:00","lastCommitMessage":"feat(coding-agent): edit queued messages in place and preserve the queue on interrupt (#838)\n\n* feat(coding-agent): edit queued messages in place and preserve the queue on interrupt\n\nBrowse queued steering/follow-up messages with Alt+Up/Alt+Down, edit the\nselected item in the editor, and apply with Enter (steering) or Alt+Enter\n(follow-up), flipping lanes when needed. Submitting an empty edit deletes the\nitem; Ctrl+Alt+Up/Down reorders it within its lane.\n\nCtrl+C/Escape now abort the active turn without clearing the queue: queued\nmessages stay server-owned and visible, and draining resumes on the next\nsuccessful edit or fresh submit (the input pump is already suspended by\nrequestAbort and resumed by _prompt on main).\n\nServer: AgentSession.mutateQueuedMessage addresses items by\n(lane, index, expectedText) against the same projection the snapshot\npublishes, so no ids, revisions, or snapshot changes are needed. Deletes\nsettle agentMessageId outcomes; replaces rebuild content/records, honor an\nimage tri-state (preserve/clear/replace), reject non-editable turns, and\nresume queued work. Daemon wire adds one mutate_queued_message request behind\nthe queue_message_mutation capability (schema 13 -> 14); older daemons report\n\"unsupported\" and the UI shows a status message.\n\napp.message.dequeue is migrated to app.message.navigateOlder; the\nrestore-queue-to-editor path is removed.\n\n* fix(coding-agent): address queue-edit review findings\n\n- Serialize queue mutations through a single chain so rapid Enter/reorder\n  presses cannot race each other or send stale indices; surface rejected\n  reorders as a status message.\n- Guard editor writes after a mutation with an editor-text ownership check so\n  a stale completion never clobbers newer typing, and restore the edit when\n  the mutation throws (Enter clears the editor before onSubmit runs).\n- Restore the stashed draft when the browsed queue item is consumed or\n  removed externally, so Enter cannot resubmit stale queued text.\n- Deduplicate repeated [image #N] markers in replace mutations.\n- Use the configured app.message.followUp key in the browse header instead of\n  a hard-coded alt+enter.\n- Drop the dead clearEditor() wrapper and tolerate partial test harnesses in\n  the onSubmit/handleFollowUp queue interception (fixes the 4509 CI shard).\n\n* fix(coding-agent): keep chained reorders addressable before the queue event arrives\n\nOver the daemon, the mutation response can land before the corresponding\nsession_action_update, so a queued follow-up move would still address the\npre-move index and be rejected. On a successful move, swap the local queue\nmirror optimistically and resync the selection; the later event settles to\nthe same state.\n\n* fix(coding-agent): reset queue browsing on session switch and mirror edits optimistically\n\nresetCurrentSessionRenderState now clears the queue selection and its\nstashed draft, so Enter in a freshly switched session can never issue a\nmutation addressed at the previous session's queue. Applied replace and\ndelete mutations update the local queue mirror immediately (like moves\nalready did), so an immediate re-browse sees the new text instead of a\nstale expectedText that the daemon would reject.\n\n* fix(coding-agent): skip the optimistic queue patch when the event already landed\n\nIn-process connections deliver the session_action_update before the\nmutateQueuedMessage await resumes; sync can retarget the selection onto a\nsame-text item, so the text guard alone let the optimistic patch apply the\ndelete or lane move a second time. Queue events always assign a fresh\nconnectionQueue object, so patch only when the mirror is still the exact\nobject captured before the request.\n\nAlso folds the session-switch regression coverage into the existing\nrender-state reset tests instead of a duplicated harness, and drops the\ndefensive optional chaining that hid missing harness fields.\n\n* fix(coding-agent): move queued message mutation to daemon schema revision 15\n\nMain took revision 14 for the telemetry policy surface (a18809e00), so the\nqueued-message-mutation gate and the advertised schema identity move to a\nfresh revision 15 with the recomputed wire-shape digest.\n\n* docs(coding-agent): record revision 15 in the schema history comment\n\n* when switching sessions with a queued message, make sure it doesn't appear in the other queue\n\n* fix(coding-agent): harden queued edit lifecycle\n\n* fix(coding-agent): preserve failed queue edit drafts\n\n* fix(coding-agent): close queue edit state races\n\n* fix: stashed draft lost after edit\n\n---------\n\nCo-authored-by: Alex Zhang <alex.lx.zhang@gmail.com>"},{"name":"agent-session-recursion.test.ts","kind":"file","size":199399,"lastCommitHash":"f49ba1ee03d67d742f4ab9d05b2d978482a9c064","lastCommitWhen":"2026-09-01T22:33:29+09:00","lastCommitMessage":"fix(coding-agent): drain bash completion before RLM follow-up\n"},{"name":"agent-session-runtime-events.test.ts","kind":"file","size":4562,"lastCommitHash":"5b280898a02a43f6d0024fd4503e30c925fc52c6","lastCommitWhen":"2026-07-17T14:24:38-07:00","lastCommitMessage":"test: remove redundant lower-level coverage (#439)"},{"name":"agent-session-runtime-model-fallback.test.ts","kind":"file","size":1826,"lastCommitHash":"c1a87a58882436106c8c8398e158c5de41a38f50","lastCommitWhen":"2026-06-12T13:08:14-07:00","lastCommitMessage":"do not show the stale no-models warning when the session has a model (#154)"},{"name":"agent-session-services.test.ts","kind":"file","size":14537,"lastCommitHash":"878bf91309c9dfa8030245019a17cf411920fd4b","lastCommitWhen":"2026-08-31T21:52:03+09:00","lastCommitMessage":"feat(coding-agent): unify RLM subagent lifecycle, messaging, and observation on rlm\n\n- rlm() and rlm.list_subagents() return one mutable RLMSubagent handle owning refresh, send, observe, info, result, and delete; RLMSpawnHandle is removed\n- agent messaging and observation move into rlm (send_parent, send_sibling, send_child, family, observe, info); agent_message.* and agent_observe.* host routes register whenever their controllers exist, independent of skill visibility\n- bundled agent-message and agent-observe skills are no longer model-visible; prompts document the rlm-native surface only\n- composable schema-validated result and context-admission contracts for RLM subagents\n- docs and changelog fragments updated for the unified surface\n"},{"name":"agent-session-stats.test.ts","kind":"file","size":4834,"lastCommitHash":"3e5ad67e0f325d4888f82f9b82966218eb4407f5","lastCommitWhen":"2026-05-07T15:59:42+02:00","lastCommitMessage":"chore: migrate pi packages to earendil works scope\n"},{"name":"agent-session-tree-navigation.test.ts","kind":"file","size":11263,"lastCommitHash":"5c61d6bc9245a72a53a2d61c44ae0b024ac7ed41","lastCommitWhen":"2026-03-04T08:55:30+01:00","lastCommitMessage":"fix(coding-agent): queue messages during branch summarization (#1803)\n\nMessages submitted while a branch summary was being generated were\nprocessed immediately instead of being queued. This happened because\nisCompacting only checked compaction abort controllers, not the branch\nsummary abort controller.\n\nInclude _branchSummaryAbortController in the isCompacting getter so all\nexisting guards (message queueing, reload blocking) also apply during\nbranch summarization."},{"name":"agent-sessions.test.ts","kind":"file","size":3635,"lastCommitHash":"94f25d4f34f31f4b5a096834097edd9ccb1a2992","lastCommitWhen":"2026-09-01T22:32:33+09:00","lastCommitMessage":"feat(coding-agent): add root session controls\n"},{"name":"agent-traces-git-context.test.ts","kind":"file","size":2269,"lastCommitHash":"032e3ee74574ca16efaf8745a1394b821256a5d0","lastCommitWhen":"2026-08-18T12:17:35+02:00","lastCommitMessage":"chore: remove redundant comments and unused internals (#1505)\n\n* chore: remove redundant comments\n\n* chore(tui): remove redundant export comments\n\n* chore(coding-agent): remove redundant example comments\n\n* chore(ai): remove redundant comments\n\n* chore(coding-agent): remove obsolete core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant rpc test comments\n\n* chore(coding-agent): remove redundant CLI comments\n\n* chore(agent): remove redundant comments\n\n* chore(tui): remove redundant source comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(ai): remove redundant source comments\n\n* chore(coding-agent): remove redundant session comments\n\n* chore(coding-agent): remove redundant core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(tests): remove redundant test comments\n\n* chore: remove unused internal helpers\n\n* docs: restore public API contracts\n\n* chore(coding-agent): restore invariant documentation\n\n* chore(coding-agent): clarify agent family contracts\n\n* style(coding-agent): format restored contracts\n\n* fix: restore intentional catch explanations"},{"name":"agent-traces.test.ts","kind":"file","size":38960,"lastCommitHash":"c514ab9652c1a5d20299d0ee3b48d589b86f2aa6","lastCommitWhen":"2026-07-16T15:39:26-07:00","lastCommitMessage":"improve trace upload reliability and controls (#389)\n\n* feat(coding-agent): improve trace upload controls (ENG-4586)\n\n* fix(coding-agent): address trace upload review findings, fixes #389\n\n* fix(coding-agent): stop canceled trace batches, fixes #389\n\n* fix(coding-agent): handle trace upload cancellation, fixes #389\n\n* fix(coding-agent): pace trace upload-all, fixes #389\n\n* fix(coding-agent): bound and cancel trace backfills, fixes #389\n\n* fix(coding-agent): honor service retry delays, fixes #389"},{"name":"agents-view-inactive-reply.test.ts","kind":"file","size":28018,"lastCommitHash":"941576dbec6d388de6b9f3cb61bce90cce3f55c4","lastCommitWhen":"2026-08-03T09:56:37+02:00","lastCommitMessage":"refactor(coding-agent): publish session action protocol (#575)\n\n* refactor(coding-agent): publish session action protocol\n\n* fix(coding-agent): restore queue projection guards and recovery validation\n\n* fix(coding-agent): repair test migrations for session action snapshots\n\n* correcting when multiple messages are sent, how it's counted\n\n* fix(coding-agent): await update supervisor teardown (fixes #575)\n\n---------\n\nCo-authored-by: Alex Zhang <alex.lx.zhang@gmail.com>"},{"name":"agents-view-missing-cwd.test.ts","kind":"file","size":3356,"lastCommitHash":"032e3ee74574ca16efaf8745a1394b821256a5d0","lastCommitWhen":"2026-08-18T12:17:35+02:00","lastCommitMessage":"chore: remove redundant comments and unused internals (#1505)\n\n* chore: remove redundant comments\n\n* chore(tui): remove redundant export comments\n\n* chore(coding-agent): remove redundant example comments\n\n* chore(ai): remove redundant comments\n\n* chore(coding-agent): remove obsolete core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant rpc test comments\n\n* chore(coding-agent): remove redundant CLI comments\n\n* chore(agent): remove redundant comments\n\n* chore(tui): remove redundant source comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(ai): remove redundant source comments\n\n* chore(coding-agent): remove redundant session comments\n\n* chore(coding-agent): remove redundant core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(tests): remove redundant test comments\n\n* chore: remove unused internal helpers\n\n* docs: restore public API contracts\n\n* chore(coding-agent): restore invariant documentation\n\n* chore(coding-agent): clarify agent family contracts\n\n* style(coding-agent): format restored contracts\n\n* fix: restore intentional catch explanations"},{"name":"agents-view-mode.test.ts","kind":"file","size":32228,"lastCommitHash":"b0023ef6c0a260b08f9c00d08e81f4106da7430e","lastCommitWhen":"2026-09-01T21:18:22+09:00","lastCommitMessage":"feat(coding-agent): add dot continuation shortcut\n"},{"name":"agents-view-state.test.ts","kind":"file","size":57484,"lastCommitHash":"fa9e4ab16e0aa05ee4b65fe0b81b29ebdc30a9c2","lastCommitWhen":"2026-08-13T15:22:54-07:00","lastCommitMessage":"ENG-5126 Sort agents view sessions by last message time (#1134)\n\n* feat(coding-agent): sort agents view sessions by last message time within sections\n\n* fix(coding-agent): keep running agents in stable creation order in agents view\n\n* chore(coding-agent): polish agents view sorting\n\n* style(coding-agent): format agents view sorting test\n\n---------\n\nCo-authored-by: Seth <seth@primeintellect.ai>"},{"name":"args.test.ts","kind":"file","size":22492,"lastCommitHash":"42ea9046ab9f75bc0fcf9f455d853f530cc15ae7","lastCommitWhen":"2026-07-23T17:52:00-07:00","lastCommitMessage":"feat(coding-agent): agent-callable refine skill (#504)\n\n* feat(coding-agent): background refine planning to not block conversation\n\nSplit the synchronous _refine() flow into two phases:\n- Planning (background): LLM call via completeSimple without\n  disconnecting from agent events or aborting the agent\n- Application (synchronous, fast): waits for agent idle, then\n  disconnects briefly, applies proposal, saves harness state,\n  rebuilds system prompt, emits refine_complete event\n\nrefine() public method signature unchanged. _waitForRefineIdle()\nonly blocks for the application phase. Interactive mode\nhandleRefineCommand fires refine without blocking the UI.\n\nRace condition fixes found by Macroscope and Cursor Bugbot:\n- Serialize concurrent refine calls via _refineApplyPending flag\n- Remove abort() from apply phase to preserve concurrent work\n- Narrow _refineInFlight to only cover disconnect+apply+reconnect\n- Re-check _refineApplyPending at turn handoff guards\n- Block turns during apply transition window\n- Clear _refineApplyPending on dispose\n- Re-sync systemPrompt after refine completes at handoff\n\n* fix(coding-agent): harden refine error paths and in-flight guard\n\n- Schedule pending message resume on planning failure and cancellation\n  so queued turns started during background planning are not stranded\n- Set _refineInFlight before calling _applyRefine so synchronous\n  listeners on refine_complete see the guard\n- Wrap refine_complete _emit in try/catch so listener failures do not\n  flip a successful refinement into a reported failure\n\nFound by Cursor Bugbot and Macroscope.\n\n* fix(coding-agent): preserve extension systemPrompt at handoff re-sync\n\nRestore extensionResult?.systemPrompt ?? this._baseSystemPrompt at\nline 3056 which was accidentally changed to just this._baseSystemPrompt\nduring the handoff re-sync refactor. Without this, heartbeat and other\nextension-modified system prompts were clobbered.\n\n* fix(coding-agent): preserve extension systemPrompt at handoff re-sync\n\nLift extensionResult declaration outside the try block so it can be\nreferenced at the handoff re-sync point. After _waitForRefineIdle,\nre-apply extensionResult?.systemPrompt ?? this._baseSystemPrompt\ninstead of just this._baseSystemPrompt so extension-modified prompts\nsurvive a concurrent refine.\n\nFound by Macroscope.\n\n* fix(coding-agent): harden background refinement (fixes #497)\n\n* feat(coding-agent): agent-callable refine skill\n\nAdd a  Python skill (SKILL.md + kernel package) that lets the\nmodel schedule continual harness refinement from IPython via\n, mirroring how the compact skill works as both an\nagent-callable tool and a user command.\n\nChanges:\n- New  skill with  and  API\n  in packages/coding-agent/skills/refine/\n- Add  to AgentSession:  stores a\n  pending request and returns immediately (non-blocking);\n  reports pending/in-flight state\n- Register  and  handlers in the kernel host\n  bridge, gated by\n- Add  fired at the turn boundary after\n  compaction checks; calls  fire-and-forget so it cannot\n  deadlock the active tool call\n- Filter the  skill from  when auto-refine\n  is not available (non-persisted sessions, subagent depth > 0)\n- Clean up  in the dispose path\n- Update RLM prompt and harness state instructions to reference\n   instead of\n- Add  constant to refinement module\n- 16 tests covering scheduling, status, turn-boundary consumption,\n  validation, gating, and dispose cleanup\n\n* test(coding-agent): align refine skill prompt assertions\n\n* feat(coding-agent): serialize refinement and persist initial goals\n\nSerialize automatic refinement at turn boundaries, abort stale branch work,\nprotect concurrent harness writes with baseline conflict checks, and preserve\nsubagent model selection across daemon rehydration.\n\nAdd durable top-level initial goals, daemon/SDK plumbing, immediate session\nflushes, inherited daemon-worker environment scrubbing, refine_complete\nevents, and real JSON CLI/socket/supervisor/worker process coverage.\n\n* fix: preserve serialized refine and snapshot catch-up\n\n* fix: guard agent_end auto-refine scheduling in serialized mode\n\nIn serialized mode, _scheduleAutoRefineAfterAgentEnd was called\nunconditionally at agent_end. When a background plan failed at the\nshouldStopAfterTurn boundary (cooldownMs=0, turn threshold met),\n_maybeAutoRefine fired from the interactive path via setTimeout(0),\nrunning a duplicate review+refine the boundary explicitly skipped.\n\nGuard _scheduleAutoRefineAfterAgentEnd behind the existing\n!this._serializedRefine check at the agent_end handler, matching\nthe _consumePendingRequestedRefine guard one line above.\n\nRegression test proves agent_end does not schedule _maybeAutoRefine\nafter a checkpoint failure (cooldownMs=0, turnInterval=1).\n\n* test: drive agent_end event path in serialized auto-refine guard regression\n\nThe previous test only waited after the checkpoint without actually\ninvoking the agent_end code path, so it passed even with the guard\nreverted. Now sets _lastAssistantMessage, spies\n_scheduleAutoRefineAfterAgentEnd, mocks _checkCompaction(false), and\ndrives _handleAgentEvent({type:'agent_end'}) through\n_processAgentEvent → _agentEventQueue. Verified the test fails when\nthe guard is temporarily reverted and passes when restored.\n\n* fix: re-queue explicit refine.run on serialized background plan failure\n\nWhen serialized background planning for an explicit refine.run fails\nat the turn boundary, the consumed request was silently dropped — the\nagent received 'scheduled: true' but no refinement ran.\n\nSerializedBackgroundPlanResult failure now carries explicit, options,\nand branchVersion. At the checkpoint, when the failure was for an\nexplicit request (skipReview=true), branchVersion is still current,\nand no newer _pendingRequestedRefine exists, the original options are\nrestored to _pendingRequestedRefine and fall through to the existing\nsynchronous pending path. Newer requests retain priority; interval\nfailures keep no-retry cooldown semantics; stale branch failures never\nrequeue.\n\nTests: (1) explicit bg plan fails then boundary replan/apply succeeds,\n(2) interval bg failure does not retry, (3) stale branch failure does\nnot requeue, (4) newer pending supersedes failed older request.\n\n* fix: prevent disposal double-refine after explicit drain\n\nIn _drainPendingRefinementForDisposal, after draining a pending\nrefine.run via _runSerializedRefine, _assistantTurnsSinceAutoRefine\nand _lastAutoRefineReviewAt were not reset. The subsequent interval\ncheck could trigger a second refinement during teardown.\n\nStamp cooldown and reset counter immediately after the explicit\ndrain, mirroring the background-plan drain path above.\n\nRegression test proves: one explicit plan/apply and zero subsequent\ninterval review/apply during disposal when the turn counter was due.\nTest verified to fail (2 planCalls) when the bookkeeping is reverted\nand pass (1 planCall) when restored.\n\nNote: public refine() vs _serializedPlanInFlight coordination deferred\npending independent design review — that hunk was reverted.\n\n* fix: coordinate public refine with serialized background planning\n\nPublic refine() now waits for _serializedPlanInFlight in its\nserialization loop. When a serialized background plan is in flight\n(started during an active turn at message_end), public refine first\nawaits the plan promise (no overlapping model calls), then waits for\nagent idle so the active turn's shouldStopAfterTurn checkpoint\nconsumes and applies the plan. Only then does public planning start.\n\nThis prevents: (1) overlapping _planRefine model calls, (2) mid-turn\n_applyRefine via _applySerializedPlan, (3) duplicate consumers of\nthe same serialized plan promise.\n\nRegression test uses a real active turn with a blocking gate tool:\nwhile the tool executes, an explicit refine.run starts bg planning,\nthen public refine() is called concurrently. Asserts max _planRefine\nconcurrency=1, bg plan applied once, public plan applied once.\nVerified mutant-sensitive: fails (planCalls=2, concurrent) without\nthe guard, passes (planCalls sequential) with it.\n\nAlso fixes disposal double-refine: after draining a pending\nrefine.run via _runSerializedRefine, stamps cooldown and resets\n_assistantTurnsSinceAutoRefine so the interval check doesn't trigger\na second refinement during teardown.\n\n* test: strengthen public-refine concurrency regression\n\nGate tool now signals from execute entry; asserts isStreaming===true\nbefore calling handleRefineHostRequest (no manual isStreaming\nfalsification). Replaces Promise.allSettled with Promise.race against\na bounded 10s timeout so failures surface. Captures plan objects and\noptions on _applyRefine, asserts apply order/identity: bg plan-1\nwith instructions 'bg' first, then public plan-2 with instructions\n'public'. Mutant-sensitive: fails (planCalls=2, concurrent) on\npre-fix source, passes with the guard.\n\n* Fix quiescence, aborted-refine, and prompt race in refine apply\n\nSnapshot _baseSystemPrompt before extension hooks so a refine that\ncompletes during the hook is detected and its stale extension prompt\ndiscarded. Replace bare waitForIdle in _applyRefine with requestAbort +\nPromise.allSettled over agent, event queue, compaction, and branch\nsummary to ensure full session quiescence without cancelling child\nruns. Clear _pendingRequestedRefine on aborted turns so stale requests\ndo not leak to subsequent checkpoints. Force pending message resume\nafter refine to re-arm queue drained by requestAbort.\n\n* fix(coding-agent): preserve refine completion event wiring\n\n* fix(coding-agent): defer serialized compaction refinement\n\n* fix(coding-agent): finish headless stack review fixes\n\nfixes #497\n\n* fix(coding-agent): cancel queued refinement on abort\n\nfixes #514\n\n* fix(coding-agent): harden refinement lifecycle (fixes #514)\n\n* fix(coding-agent): resolve serialized refine races (fixes #514)\n\n* fix(coding-agent): guard serialized planning (fixes #514)\n\n* fix(coding-agent): preserve injected prompt extensions (fixes #514)\n\n* fix(coding-agent): preserve empty injected prompts (fixes #514)\n\n* fix(coding-agent): harden combined refine stack (fixes #504)\n\n* fix(coding-agent): clear aborted refine options (fixes #504)\n\n* fix(coding-agent): make latest refine request win (fixes #504)\n\n* fix(coding-agent): record stale refine cooldown (fixes #504)\n\n* fix(coding-agent): prioritize explicit refine (fixes #504)\n\n* fix(coding-agent): close final refine races (fixes #504)\n\n* fix(coding-agent): invalidate superseded refine plans (fixes #504)\n\n---------\n\nCo-authored-by: Kevin Thomas <kevin.jt2007@gmail.com>"},{"name":"assistant-message-streaming-bench.ts","kind":"file","size":3556,"lastCommitHash":"7c4df72953572312bfbf919dc6292b24a2295e13","lastCommitWhen":"2026-06-09T23:15:13-07:00","lastCommitMessage":"speed up daemon startup and tui streaming performance (#117)\n\n* perf: daemon early-listen, single ensure, faster polls, streaming benches + identity tests\n\n* perf: lazy-load extension bundles, cli-highlight, and typebox/compile off the startup path\n\n* perf: slim attach payload for capable clients (skip event + top-level state/messages)\n\n* perf: reconcile assistant message at render time + per-block markdown render cache\n\n* perf: stop double-sending partial message in daemon message_update events\n\n* test: add attach payload benchmark script\n\n* perf: spawn interactive daemon before importing the heavy module graph\n\n* test: isolate session dirs in runtime tests to stop leaking into the shared sessions dir\n\n* perf: bundle cli entry with esbuild for ~3x faster startup\n\n* add --dist flag to prime-agent.sh to run the bundled build\n\n* address review bot findings: honor --cwd in early daemon spawn, fix theme null colors check, fix bench script edge cases"},{"name":"assistant-message.test.ts","kind":"file","size":12022,"lastCommitHash":"1ae59498f4d58447ef640ed1a74159f2abb67a10","lastCommitWhen":"2026-08-11T12:34:32-07:00","lastCommitMessage":"fix: tolerate null assistant content blocks (#1256)"},{"name":"auth-flows.test.ts","kind":"file","size":7310,"lastCommitHash":"7158a471842c1fb579ac74cc71732967026893cb","lastCommitWhen":"2026-07-14T19:15:33-07:00","lastCommitMessage":"unify configuration menu (#401)\n\n* fix(coding-agent): persist prime inference model\n\n* feat(coding-agent): unify configuration menu\n\n* fix(coding-agent): sync models after provider login\n\n* fix(coding-agent): refresh Prime models before fallback\n\n* fix(coding-agent): replace empty model placeholder after login"},{"name":"auth-storage.test.ts","kind":"file","size":37005,"lastCommitHash":"378e32d5813087768ec3f34ed32901813a36744c","lastCommitWhen":"2026-08-28T14:15:16+02:00","lastCommitMessage":"refactor(coding-agent): remove test-only config cache reset APIs (#1849)"},{"name":"bash-close-hang-windows.test.ts","kind":"file","size":3765,"lastCommitHash":"032e3ee74574ca16efaf8745a1394b821256a5d0","lastCommitWhen":"2026-08-18T12:17:35+02:00","lastCommitMessage":"chore: remove redundant comments and unused internals (#1505)\n\n* chore: remove redundant comments\n\n* chore(tui): remove redundant export comments\n\n* chore(coding-agent): remove redundant example comments\n\n* chore(ai): remove redundant comments\n\n* chore(coding-agent): remove obsolete core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant rpc test comments\n\n* chore(coding-agent): remove redundant CLI comments\n\n* chore(agent): remove redundant comments\n\n* chore(tui): remove redundant source comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(ai): remove redundant source comments\n\n* chore(coding-agent): remove redundant session comments\n\n* chore(coding-agent): remove redundant core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(tests): remove redundant test comments\n\n* chore: remove unused internal helpers\n\n* docs: restore public API contracts\n\n* chore(coding-agent): restore invariant documentation\n\n* chore(coding-agent): clarify agent family contracts\n\n* style(coding-agent): format restored contracts\n\n* fix: restore intentional catch explanations"},{"name":"bash-execution-width.test.ts","kind":"file","size":2985,"lastCommitHash":"032e3ee74574ca16efaf8745a1394b821256a5d0","lastCommitWhen":"2026-08-18T12:17:35+02:00","lastCommitMessage":"chore: remove redundant comments and unused internals (#1505)\n\n* chore: remove redundant comments\n\n* chore(tui): remove redundant export comments\n\n* chore(coding-agent): remove redundant example comments\n\n* chore(ai): remove redundant comments\n\n* chore(coding-agent): remove obsolete core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant rpc test comments\n\n* chore(coding-agent): remove redundant CLI comments\n\n* chore(agent): remove redundant comments\n\n* chore(tui): remove redundant source comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(ai): remove redundant source comments\n\n* chore(coding-agent): remove redundant session comments\n\n* chore(coding-agent): remove redundant core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(tests): remove redundant test comments\n\n* chore: remove unused internal helpers\n\n* docs: restore public API contracts\n\n* chore(coding-agent): restore invariant documentation\n\n* chore(coding-agent): clarify agent family contracts\n\n* style(coding-agent): format restored contracts\n\n* fix: restore intentional catch explanations"},{"name":"block-images.test.ts","kind":"file","size":2480,"lastCommitHash":"032e3ee74574ca16efaf8745a1394b821256a5d0","lastCommitWhen":"2026-08-18T12:17:35+02:00","lastCommitMessage":"chore: remove redundant comments and unused internals (#1505)\n\n* chore: remove redundant comments\n\n* chore(tui): remove redundant export comments\n\n* chore(coding-agent): remove redundant example comments\n\n* chore(ai): remove redundant comments\n\n* chore(coding-agent): remove obsolete core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant rpc test comments\n\n* chore(coding-agent): remove redundant CLI comments\n\n* chore(agent): remove redundant comments\n\n* chore(tui): remove redundant source comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(ai): remove redundant source comments\n\n* chore(coding-agent): remove redundant session comments\n\n* chore(coding-agent): remove redundant core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(tests): remove redundant test comments\n\n* chore: remove unused internal helpers\n\n* docs: restore public API contracts\n\n* chore(coding-agent): restore invariant documentation\n\n* chore(coding-agent): clarify agent family contracts\n\n* style(coding-agent): format restored contracts\n\n* fix: restore intentional catch explanations"},{"name":"boot-gate.test.ts","kind":"file","size":796,"lastCommitHash":"61eb64748eb077e2a084432db92d101a2a83e146","lastCommitWhen":"2026-08-26T15:24:10-07:00","lastCommitMessage":"Minimal CPython REPL runtime (rlm.repl) (#1685)\n\n* feat(coding-agent): add async-by-default bash() to the kernel runtime\n\n* chore(coding-agent): tighten bash() comments and changelog fragment\n\n* feat(coding-agent): add a standalone CPython REPL runtime speaking JSON lines over stdio\n\n* chore(coding-agent): tighten REPL runtime comments\n\n* feat(coding-agent): run the kernel on the REPL runtime over stdio\n\n* fix(coding-agent): reject pending host requests on kernel teardown\n\nThe runtime now fails pending host_request futures when stdin hits EOF or\na shutdown request arrives, so a cell awaiting a host reply can no longer\nblock _serve from consuming the shutdown and wedge the process. Startup\nand busy-kernel messages plus the ipython tool description now say Python\nkernel, matching the default REPL runtime client.\n\n* chore(coding-agent): describe the kernel-heavy test tag client-neutrally\n\n* feat(coding-agent): make the REPL runtime the only kernel\n\nRemoves the Jupyter/ipykernel/ZMQ kernel client, the fork server, the\nPRIME_AGENT_KERNEL escape hatch, and the %%bash/%cd/%env cell rewriting.\nMagic-style cells (%/%%/!) return a one-line error naming the Python or\nbash() replacement. The kernel venv no longer installs ipykernel;\nexisting venvs are rebuilt once via the bootstrap schema bump. Old\nsnapshot artifacts still restore through the runtime's pickle compat.\n\n* fix(coding-agent): close MCP transports in REPL shutdown\n\n* fix(coding-agent): address bash() review findings — exact tail retention, foreground-status lifecycle with group anchoring, post-kill forkserver reap, Windows start-id parity, executor-free await\n\n* fix(coding-agent): tree-kill bash() process trees on Windows and make running reflect group liveness\n\n* fix(runtime): address repl runtime review findings\n\n- revalidate targeted interrupts through SIGINT delivery so a stale signal\n  cannot cancel a later request\n- preserve a parked untargeted interrupt while another request is inflight\n- reject non-string interrupt ids and validate snapshot options\n  (prune_oversized bool, max_bytes/max_variable_bytes present => int)\n- guard str(exc) in error/skip/fail reasons so a broken __str__ cannot\n  kill the runtime\n- fail the snapshot when the manifest write fails (before any pruning)\n- report 'snapshot not found' reason on restore of a missing path\n- wait unbounded for the output-pump drain marker so done never precedes\n  captured output and marker bytes never leak\n- document that aggregate-cap skips are not pruned\n\n* fix(coding-agent): carry bash() status pipe as stdin so strict-POSIX shells accept single-digit fd redirections\n\n* fix(coding-agent): address host-swap review findings — runtime-neutral kernel wording, %cd/%env rewrite fidelity, linear-time magic regexes, restart supersession guard\n\n* fix(coding-agent): reject stale column-0 line magics on any cell line, not just the first\n\n* fix(coding-agent): close status fds when wake-pipe creation fails and gate bash() commands on orphan-journal registration\n\n* fix(coding-agent): strip quoted %cd targets, use UTF-16-safe %env parsing, and expand $var/${var} values PEP-215-style\n\n* fix(coding-agent): fail rlm.run fast outside a live kernel so vitest workers cannot hang on a comm that never replies\n\n* fix(coding-agent): clear the active cell id before terminal events so late background output is never tagged with a finished cell\n\n* fix(coding-agent): update legacy IPython-era tests to assert cutover behavior\n\n* fix(coding-agent): describe the column-0 magic scan without referencing the removed rewrite backend\n\n* fix(coding-agent): consume parked interrupts on compile failures and survive user-closed stdio in the drain path\n\n* fix(coding-agent): redact bare %env listings, prefer '=' in %env parsing, echo %cd targets, and keep graceful shutdowns owning their cleanup\n\n* fix(coding-agent): reject kernel startup promptly on spawn errors and commit %cd previous-dir tracking only after chdir succeeds\n\n* fix(coding-agent): trim ParsedIpythonBashCell to the body field its callers use\n\n* fix(coding-agent): kill full process trees in the Windows orphan reaper via taskkill /T\n\n* fix(coding-agent): survive compile-phase crashes and fd-reuse drain hangs in the REPL runtime\n\n* fix(coding-agent): shield snapshot prune deletions from interrupts and pin the host comm probe to its real seam\n\n* fix(coding-agent): route list_names through the per-request backstop and skip non-string namespace keys\n\n* fix(coding-agent): reject snapshot requests whose manifest path aliases the payload path\n\n* fix(coding-agent): reject negative snapshot size caps that would prune every user variable\n\n* fix(coding-agent): kill one-shot await bash() on cancel, resolve Windows helpers via System32, retry taskkill after reap, and fail closed on orphan-journal enrollment\n\n* fix(coding-agent): attribute REPL stream output at write time so raw fd and user-thread bytes never carry another cell's id\n\n* fix(coding-agent): surface unattributed REPL stream output as separate background output instead of dropping or merging it\n\n* fix(coding-agent): confirm group exit before a cancelled one-shot bash() await propagates and complete-write orphan-journal records\n\n* fix(coding-agent): expose a working sys.stdout.buffer on the tagged REPL writer routing bytes through the null-attributed raw channel\n\n* fix(coding-agent): mark between-cell background output truncated when the pending buffer cap is hit\n\n* fix(coding-agent): shield the cancelled-await bash() confirm-exit from re-cancellation, fail clearly without bash on Windows, and fence slow pumps out of result assembly\n\n* fix(coding-agent): survive hostile protocol lines in the REPL reader thread and interrupt without pthread_kill on Windows\n\n* fix(coding-agent): send the protocol shutdown from dispose() so the runtime closes MCP servers and kills live bash groups before the hard kill\n\n* fix(coding-agent): flag the pump's read-to-commit window so the bash() drain fence cannot miss an in-flight chunk\n\n* fix(coding-agent): guard the whole REPL request line against hostile input, reject duplicate in-flight ids, complete short buffer-pipe writes, and clean the snapshot temp file on KeyboardInterrupt\n\n* fix(coding-agent): drop stale between-cell background output on kernel teardown so it cannot surface after a restart\n\n* fix(coding-agent): assert the tagged channel only in the large buffer-write REPL test since cross-channel ordering is not guaranteed\n\n* fix(coding-agent): resolve taskkill via absolute System32 path in the host orphan reaper\n\n* fix(coding-agent): write the inactive orphan-journal record only after a delivered kill so undelivered signals leave the host reaper in charge\n\n* fix(coding-agent): keep a REPL request interrupt-targetable through its trailing-expression repr and output drain until done is emitted\n\n* fix(coding-agent): count an already-exited leader as delivered in the Windows bash() reap so clean exits still journal inactive\n\n* fix(coding-agent): reject NaN and Infinity in emit() payloads before they corrupt REPL protocol framing\n\n* chore(coding-agent): correct the stale ipykernel requirement on the python override doc\n\n* chore(coding-agent): drop migration-era wording from kernel comments\n\n* fix(coding-agent): resolve trusted absolute shell host-side and close Windows journal/reap gaps\n\n* fix(coding-agent): best-effort-kill pid-only orphan records in daemon force-stop and recovery reaps\n\n* refactor(coding-agent): drop the magic-cell rejection gate\n\n%-prefixed and !-prefixed cells now reach CPython and fail with its own\nSyntaxError, which names the offending line. The rejection layer guarded\nagainst model-produced IPython syntax, but with the shipped prompt fresh\nsessions do not produce it, and the plain SyntaxError is protection enough.\nparseIpythonBashCell stays: transcripts from ipykernel-era sessions render\n%%bash cells with shell highlighting forever.\n\n* fix(coding-agent): report a committed destructive snapshot as success even when an interrupt was parked\n\n* chore(ai): drop stray live-regen drift in models.generated.ts\n\nad657d7ec accidentally committed generate-models output produced by a local\nbuild; the catalog belongs to its own regen PRs.\n\n* test(coding-agent): expect a plain SyntaxError for legacy %%bash cells after the magic-rejection gate removal\n\n* fix(coding-agent): consume a finishing-targeted interrupt after a completed state request instead of failing the done\n\n* fix(coding-agent): exit the REPL runtime when its owner dies even during a busy cell\n\n* fix(coding-agent): resolve the kernel bash shell only from trusted absolute paths on Windows\n\n* fix(coding-agent): contain Windows bash children with kill-on-close job objects\n\n* test(coding-agent): cover owner death during a non-yielding REPL cell\n\n* fix(coding-agent): skip concurrently deleted names during snapshot instead of aborting\n\n* fix(coding-agent): fall back to taskkill when job termination fails\n\n* fix(coding-agent): stop telling REPL-default users they need ipykernel\n\n* fix(coding-agent): clear the SIGINT target when its request finishes\n\n* test(coding-agent): drop migration-era wording from the %%bash rejection comment\n\n* fix(coding-agent): start Windows bash children suspended and fail closed when job containment cannot be established\n\n* fix(coding-agent): re-assert the kernel SIGINT handler between cells so a cell rebinding SIGINT cannot break interrupts\n\n* fix(coding-agent): kill the whole tree for enriched orphan records on Windows force-stop\n\nstopTrackedProcess signals only the shell pid on Windows; use killOrphanProcess (taskkill /T) after the identity check, matching the owned-session-worker and daemon-supervisor reapers.\n\n* docs(coding-agent): describe current magic-cell behavior in release notes\n\nMagic-style cells fail with a plain SyntaxError; the migration error and %cd/%env rewrites were removed, so the notes stop claiming them.\n\n* fix(coding-agent): skip the liveness check when the orphan identity is stale\n\nA reused pid looked like a failed kill after the identity re-check skipped taskkill, blocking worker cleanup with a spurious failure.\n\n* fix(coding-agent): journal Windows bash() children before job assignment so a kernel kill mid-spawn cannot leak an unjournaled suspended process\n\n* fix(coding-agent): pre-create the Windows bash() job before spawn and contain the child before the journal start-id query\n\n* fix(coding-agent): create Windows bash() children atomically inside the kill-on-close job via PROC_THREAD_ATTRIBUTE_JOB_LIST, closing the Popen-to-assignment leak window\n\n* chore(coding-agent): compress the atomic-job-association comments to one-line rationale\n\n* fix(coding-agent): send duplicate-id protocol errors outside the interrupt lock and reject int payloads in the captured stdout buffer\n\n* docs(coding-agent): update the kernel provisioner docstring for the REPL/IPython split\n\n* fix(coding-agent): retain the Windows bash() process handle through job cleanup and taskkill fallbacks so a recycled pid can never be killed\n\n* fix(coding-agent): serialize Windows bash() abort cleanup under the kill lock so shutdown taskkill can never race the process-handle close\n\n* fix(coding-agent): commit REPL snapshot payload and manifest atomically via unique temp files with guaranteed cleanup and parked-SIGINT restore\n\n* fix(coding-agent): stage REPL restore before an interrupt-parked apply and recover committed snapshot/restore results from protocol interrupts so a committed operation is never misreported as failed\n\n* chore(coding-agent): compress restore-shield rationale comments to one line each\n\n* fix(coding-agent): surface unattributed background output in IPython cell details and render it after the traceback in the expanded cell view\n\n* docs(coding-agent): replace stale Jupyter comm vocabulary in rlm-runtime failure modes and focused validation with stdio-transport equivalents\n\n* docs(coding-agent): describe the REPL trust boundary and runtime-bootstrap failure in stdio terms and drop the removed TokenUsage export\n\n* fix(runtime): address REPL review findings\n\n* fix(runtime): preserve near-cap snapshots\n\n---------\n\nCo-authored-by: Seth <seth@primeintellect.ai>"},{"name":"builtin-skills.test.ts","kind":"file","size":12255,"lastCommitHash":"032e3ee74574ca16efaf8745a1394b821256a5d0","lastCommitWhen":"2026-08-18T12:17:35+02:00","lastCommitMessage":"chore: remove redundant comments and unused internals (#1505)\n\n* chore: remove redundant comments\n\n* chore(tui): remove redundant export comments\n\n* chore(coding-agent): remove redundant example comments\n\n* chore(ai): remove redundant comments\n\n* chore(coding-agent): remove obsolete core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant rpc test comments\n\n* chore(coding-agent): remove redundant CLI comments\n\n* chore(agent): remove redundant comments\n\n* chore(tui): remove redundant source comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(ai): remove redundant source comments\n\n* chore(coding-agent): remove redundant session comments\n\n* chore(coding-agent): remove redundant core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(tests): remove redundant test comments\n\n* chore: remove unused internal helpers\n\n* docs: restore public API contracts\n\n* chore(coding-agent): restore invariant documentation\n\n* chore(coding-agent): clarify agent family contracts\n\n* style(coding-agent): format restored contracts\n\n* fix: restore intentional catch explanations"},{"name":"centered-overlay.test.ts","kind":"file","size":1895,"lastCommitHash":"032e3ee74574ca16efaf8745a1394b821256a5d0","lastCommitWhen":"2026-08-18T12:17:35+02:00","lastCommitMessage":"chore: remove redundant comments and unused internals (#1505)\n\n* chore: remove redundant comments\n\n* chore(tui): remove redundant export comments\n\n* chore(coding-agent): remove redundant example comments\n\n* chore(ai): remove redundant comments\n\n* chore(coding-agent): remove obsolete core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant rpc test comments\n\n* chore(coding-agent): remove redundant CLI comments\n\n* chore(agent): remove redundant comments\n\n* chore(tui): remove redundant source comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(ai): remove redundant source comments\n\n* chore(coding-agent): remove redundant session comments\n\n* chore(coding-agent): remove redundant core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(tests): remove redundant test comments\n\n* chore: remove unused internal helpers\n\n* docs: restore public API contracts\n\n* chore(coding-agent): restore invariant documentation\n\n* chore(coding-agent): clarify agent family contracts\n\n* style(coding-agent): format restored contracts\n\n* fix: restore intentional catch explanations"},{"name":"child-process.test.ts","kind":"file","size":2276,"lastCommitHash":"032e3ee74574ca16efaf8745a1394b821256a5d0","lastCommitWhen":"2026-08-18T12:17:35+02:00","lastCommitMessage":"chore: remove redundant comments and unused internals (#1505)\n\n* chore: remove redundant comments\n\n* chore(tui): remove redundant export comments\n\n* chore(coding-agent): remove redundant example comments\n\n* chore(ai): remove redundant comments\n\n* chore(coding-agent): remove obsolete core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant rpc test comments\n\n* chore(coding-agent): remove redundant CLI comments\n\n* chore(agent): remove redundant comments\n\n* chore(tui): remove redundant source comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(ai): remove redundant source comments\n\n* chore(coding-agent): remove redundant session comments\n\n* chore(coding-agent): remove redundant core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(tests): remove redundant test comments\n\n* chore: remove unused internal helpers\n\n* docs: restore public API contracts\n\n* chore(coding-agent): restore invariant documentation\n\n* chore(coding-agent): clarify agent family contracts\n\n* style(coding-agent): format restored contracts\n\n* fix: restore intentional catch explanations"},{"name":"clipboard-image-bmp-conversion.test.ts","kind":"file","size":3004,"lastCommitHash":"38ed9e86f88ad7d10983e755634e6b8277dd72ea","lastCommitWhen":"2026-01-31T23:24:10+01:00","lastCommitMessage":"fix(coding-agent): convert clipboard BMP images to PNG on paste\n\nWSL2/WSLg often provides clipboard images as image/bmp only.\nPreviously this resulted in invalid PNG files being written.\n\nNow readClipboardImage() converts unsupported formats to PNG\nvia Photon before returning.\n\nCloses #1109\n\nBased on #1112 by @lightningRalf\n"},{"name":"clipboard-image.test.ts","kind":"file","size":5767,"lastCommitHash":"0b8452c32f1aed2c74aa447ae7028de4d926a033","lastCommitWhen":"2026-04-30T23:08:51+02:00","lastCommitMessage":"fix(coding-agent): fix WSL clipboard image paste\n\ncloses #2469\n"},{"name":"clipboard.test.ts","kind":"file","size":4171,"lastCommitHash":"7c5ef0b70e83bb408b3f47785cce017940b06841","lastCommitWhen":"2026-05-03T12:55:23+02:00","lastCommitMessage":"test(ai,coding-agent): stabilize env-sensitive test cases (#4119)"},{"name":"code-preview.test.ts","kind":"file","size":4272,"lastCommitHash":"032e3ee74574ca16efaf8745a1394b821256a5d0","lastCommitWhen":"2026-08-18T12:17:35+02:00","lastCommitMessage":"chore: remove redundant comments and unused internals (#1505)\n\n* chore: remove redundant comments\n\n* chore(tui): remove redundant export comments\n\n* chore(coding-agent): remove redundant example comments\n\n* chore(ai): remove redundant comments\n\n* chore(coding-agent): remove obsolete core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant rpc test comments\n\n* chore(coding-agent): remove redundant CLI comments\n\n* chore(agent): remove redundant comments\n\n* chore(tui): remove redundant source comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(ai): remove redundant source comments\n\n* chore(coding-agent): remove redundant session comments\n\n* chore(coding-agent): remove redundant core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(tests): remove redundant test comments\n\n* chore: remove unused internal helpers\n\n* docs: restore public API contracts\n\n* chore(coding-agent): restore invariant documentation\n\n* chore(coding-agent): clarify agent family contracts\n\n* style(coding-agent): format restored contracts\n\n* fix: restore intentional catch explanations"},{"name":"command-recovery-journal.test.ts","kind":"file","size":3168,"lastCommitHash":"3fc0ac54fad747871c0d2797bce5b21530aecffc","lastCommitWhen":"2026-07-30T17:38:19+02:00","lastCommitMessage":"feat: canonical session-input scheduling with durable, queueable commands (#540)\n\n* feat(agent): stop before scheduling another turn\n\n* test(agent): remove redundant option forwarding coverage\n\n* test(agent): consolidate turn-boundary coverage\n\n* test(coding-agent): skip staged temp files in 4606 status scan\n\n* test(coding-agent): stabilize process-suite cleanup races\n\n* test(process): allow exact supervisor cleanup to settle\n\n* feat(daemon): checkpoint session inputs for restart\n\n* fix(daemon): harden restart checkpoint transactions\n\n* feat(daemon): unify session input admission\n\n* fix(daemon): complete restart transactions safely\n\n* fix(headless): surface command outcomes\n\n* fix(daemon): fence restart manifest capture\n\n* test(process): isolate daemon client environment\n\n* fix(daemon): restore checkpoint handoff state\n\n* fix(daemon): preserve admission completion contracts\n\n* fix(daemon): fence full queued turns before restart\n\n* fix(daemon): settle queued input outcomes\n\n* fix(daemon): preserve restart transaction ownership\n\n* fix(daemon): report prompt admission rejection\n\n* refactor(daemon): collapse update restart state machines\n\n* feat(coding-agent): unify session input scheduling\n\n* test(daemon): consolidate cron admission coverage\n\n* fix(daemon): bound prepare deadline and fence direct prompt acceptance\n\n* fix(headless): drain session-owned inputs before exit\n\n* fix(daemon): settle queued prompt completions\n\n* fix(daemon): fence stale commit clients and injected prompt sections\n\n* test(coding-agent): remove scheduler implementation assertions\n\n* fix(daemon): keep cleared prompts cancelled\n\n* fix(daemon): fence injected dispatch on delivery and env adoption\n\n* fix(coding-agent): harden session input admission\n\n* refactor(coding-agent): unify agent message outcomes\n\n* fix(daemon): fence injected prompts until target handoff\n\n* fix(coding-agent): align command dispatch parsing\n\n* fix(coding-agent): reject re-armed completions for delivered message ids\n\n* fix(daemon): fence admitted work during restart\n\n* fix(coding-agent): serialize command admission\n\n* fix(coding-agent): drop generated prompt-wait outcomes after completion\n\n* fix(daemon): cancel stalled restart checkpoints\n\n* fix(coding-agent): preserve queued continuation semantics\n\n* fix(daemon): preserve scheduled input contracts\n\n* fix(daemon): close restart admission before checkpoint\n\n* fix(coding-agent): avoid redundant continuation turns\n\n* fix(daemon): settle command delivery outcomes\n\n* fix(daemon): preserve merged queue checkpoints\n\n* fix(coding-agent): serialize all turn admission\n\n* test(daemon): preserve merged delivery coverage\n\n* fix(daemon): make drain cancellation terminal\n\n* fix(tui): unify durable compaction presentation\n\n* test(coding-agent): consolidate scheduler coverage\n\n* refactor(coding-agent): route TUI inputs through session admission\n\n* fix(daemon): bound message delivery outcomes\n\n* fix(daemon): preserve restart checkpoint semantics\n\n* test(tui): consolidate compaction presentation coverage\n\n* test(coding-agent): synchronize scheduler integration coverage\n\n* fix(tui): preserve admission ordering\n\n* fix(daemon): cancel pending prompt admission\n\n* fix(daemon): align admission restart integration\n\n* fix(tui): retain successful context usage\n\n* fix(coding-agent): harden queued input lifecycle\n\n* fix(tui): preserve admission errors and retry spacing\n\n* style(daemon): format combined protocol\n\n* fix(daemon): clear restart-rejected admission\n\n* fix(coding-agent): disclose non-durable compaction outcomes\n\n* refactor(coding-agent): consolidate scheduler predicates and coverage\n\n* fix(tui): preserve editor input during startup\n\n* fix(daemon): close prompt admission edge cases\n\n* fix(daemon): release stale parsed admissions\n\n* refactor(coding-agent): simplify compaction outcome handling\n\n* fix(coding-agent): harden queued prompt handoff and refine parsing\n\n* fix(tui): retry startup prompts until admitted\n\n* fix(daemon): close prompt admission races\n\n* fix(daemon): revoke late stale claims\n\n* fix(coding-agent): restore the session file after a torn outcome append\n\n* fix(coding-agent): snapshot prepared prompts adjacent to handoff\n\n* fix(tui): bound startup and follow-up admission\n\n* test(daemon): ignore private handler arity\n\n* fix(daemon): serialize replay admission\n\n* fix(compaction): preserve durable outcomes in headless mode\n\n* fix(coding-agent): suspend the input pump for update-restart aborts\n\n* refactor(tui): simplify startup prompt delivery\n\n* fix(daemon): reconcile prompt admission outcomes\n\n* test(daemon): extend fixture cleanup retries\n\n* fix(session): preserve symlinked atomic rewrites\n\n* fix(scheduler): cancel continuations at abort boundaries\n\n* fix(tui): drop superseded command paths and stop startup prompts at run exit\n\n* fix(daemon): observe cancelled admission work\n\n* fix(daemon): clear restart-rejected admission\n\n* fix(compaction): preserve merged event handling\n\n* fix(scheduler): preserve queued input ownership\n\n* fix(tui): drop submits resumed by run teardown\n\n* fix(daemon): settle admission-only work once\n\n* test(daemon): assert cron admission completion\n\n* feat(coding-agent): add session command primitives\n\n* fix(session): preserve atomic rewrite ownership\n\n* fix(scheduler): derive steering stop from live queue\n\n* fix(tui): preserve stash on lifecycle cancellation\n\n* fix(daemon): preserve steer and follow-up lanes\n\n* fix(daemon): wake checkpoint at prompt handoff\n\n* test(coding-agent): consolidate command message coverage\n\n* fix(tui): preserve transcript on rebuild failure\n\n* fix(scheduler): run checkpoints before steering stop\n\n* fix(tui): cancel startup admission on lifecycle exit\n\n* fix(daemon): preserve definitive prompt failures\n\n* fix(daemon): finish publish after owner loss\n\n* fix(coding-agent): validate command metadata consistency\n\n* fix(compaction): persist outcomes before events\n\n* fix(scheduler): hand off injected follow-ups\n\n* fix(tui): integrate side conversations with admission\n\n* test(daemon): model idle lane insertion\n\n* fix(daemon): adopt deferred attach env on rollback\n\n* fix(coding-agent): align command dispatch parsing\n\n* fix(headless): skip malformed outcome suffix entries\n\n* fix(scheduler): preserve ordered input ownership\n\n* fix(tui): retain rejected rich drafts\n\n* fix(scheduler): observe pre-aborted admission waits\n\n* fix(daemon): reserve update shutdown for publish\n\n* fix(coding-agent): keep multiline slash input literal\n\n* fix(compaction): order equal-time legacy messages after summary\n\n* test(process): sweep late supervisor owners before cleanup\n\n* test(process): terminate late exact supervisor owners\n\n* fix(agent): recheck stop after steering poll\n\n* fix(scheduler): recheck pause at direct admission\n\n* fix(tui): retain lifecycle drafts in submission order\n\n* fix(daemon): preserve client identity and safe markers\n\n* fix(agent): never drop steering drained by the stop-window poll\n\nA stop that flips during the post-tool-batch steering poll no longer ends\nthe loop when that poll returned messages; drained steering owns the turn\nboundary and is injected before the loop can stop.\n\n* fix(scheduler): invalidate queued prompt preparation on branch navigation\n\nCached before_agent_start preparation survives a deferral requeue, so a\nbranch switch during the pause could deliver extension messages prepared\nagainst the old branch. Clear queued prompt preparation when tree\nnavigation rebuilds the session context.\n\n* fix(tui): honor cancellation in pause waits and pin deferred stash release\n\n- forward the abort signal into the queued-work admission wait taken when\n  a pause appears between admission acquire and the ownership commit, so\n  a cancelled prompt rejects instead of blocking until the pause clears\n- capture the stash session id and state when a release is deferred by\n  in-flight submissions, so a /new rebind cannot redirect the deferred\n  release at the new session's state\n- align the prompt-stash submit harness with the submission fields so the\n  draft-retention paths run instead of throwing on missing state\n\n* fix(daemon): keep cancelled admissions definitive across repeated cancels\n\nA second cancel_prompt_admission for an already-cancelled admission now\nshort-circuits with cancelled instead of forwarding to the worker, and a\nworker unknown response can no longer downgrade a cancellation that\nraced in during the round-trip.\n\n* fix(coding-agent): require dispatch proof before releasing the prompt fence\n\nAgent.prompt() resolves even when a lifecycle listener failure produced a\nsynthetic error turn without the injected message ever reaching agent\nstate. Treat a resolved prompt as dispatched only when the dispatch\nobserver fired or the message is present in agent state, so the direct-\nprompt checkpoint section cannot release with the accepted input missing\nfrom both the queue and the run.\n\n* chore(scheduler): tighten fix comments\n\n* chore(tui): tighten fix comments\n\n* chore(agent): tighten fix comments\n\n* chore(daemon): tighten fix comments\n\n* chore(coding-agent): tighten fix comment\n\n* test(agent): flip the stop only on the post-tool-batch steering poll\n\nThe pre-loop poll also set stopRequested, so the pre-steering check\nstopped the loop and the post-empty-poll recheck under test never ran.\nVerified the test now fails when the recheck is removed.\n\n* fix(scheduler): treat pump-owned work as busy for post-compaction continue\n\nThe continuation timer only checked pendingMessageCount, but the pump\nmoves items into _activeSessionInput before handoff, so the timer could\ncall agent.continue() and forget continuations the pump still owned.\nIdle now also requires no active input, no running pump, and no pump\nrequest.\n\n* fix(tui): bind barrier-paused submissions to their original session\n\nA submit paused on the startup-prompt barrier could resume after /new\nrebound the live stash fields, delivering the prompt to and stashing the\ndraft in the wrong session. The submission now captures its session and\nstash state up front, bails out of prompting when the session changed,\nand retains drafts in the captured state.\n\n* fix(scheduler): let queueIfBusy join pending work at direct admission\n\nDirect-turn admission drained queued work before queueIfBusy callers\ncould see it, so heartbeats and accepted agent messages blocked until\nthe queue emptied and then started direct turns. Admission now returns\nimmediately for queueIfBusy callers (allowPendingQueue) and preflight\nenqueues behind the pending work, which also removes the pump-reschedule\nspin while the queue is blocked by bash/compaction/retry.\n\n* chore(agent): tighten test comment\n\n* chore(tui): tighten fix comments\n\n* chore(scheduler): tighten fix comments\n\n* fix(compaction): retain unpersisted outcome disclosures across rebuilds\n\nAn outcome whose session-file append failed lived only in live agent\nstate, so transcript rebuilds from buildSessionContext dropped the\ndisclosure. Failed appends are now retained and appended to rebuilt\ncontexts.\n\n* fix(tui): observe admission cancellation on the streaming prompt path\n\nWhile streaming, _prompt skips direct-turn admission, so an aborted\nadmission signal was never checked and a cancelled startup prompt could\nstill enqueue into a session the user already left. The streaming path\nnow treats its entry as the commit point and rejects already-aborted\nprompts.\n\n* fix(compaction): keep unpersisted outcome disclosures in transcript order\n\nRebuilds appended retained disclosures after every persisted message, so\nturns persisted after the failed append rendered above the notice. The\ndisclosures now merge into the rebuilt context by timestamp.\n\n* fix(daemon): gate admission cancellation on a minimum schema revision\n\nschemaRevision is monotonic, but the admission gates compared it with\nexact equality, so a newer daemon failed signal-backed prompt\ncancellation against an older client even while still advertising\nprompt_admission_cancellation. Both gates now require a minimum\nrevision, matching the protocol.version check.\n\n* fix(compaction): keep unpersisted outcome disclosures across state reloads\n\nSuccessful compaction and tree navigation reload agent.state.messages\nfrom the session file, which dropped disclosures that only exist in\nmemory after a failed append. The timestamp merge now runs on every\nrebuild path via a shared helper.\n\n* chore(tui): tighten fix comment\n\n* chore(daemon): drop redundant gate comment\n\n* chore(compaction): tighten fix comments\n\n* fix(scheduler): treat a skipped compaction as benign in queued commands\n\nA too-short or already-compacted /compact throws CompactionSkippedError,\nwhich compaction_end already surfaces as a warning; the queued-command\nexecutor also recorded a durable 'Command failed' error row for the same\nskip. The executor now ignores the skip.\n\n* fix(daemon): re-validate field-gated requests before reconnect replay\n\nA prompt carrying admissionId that was pending across a reconnect was\nreplayed without re-checking the new daemon_hello, so a replaced or\ndowngraded daemon would silently ignore the admission field and take\nownership of an uncancellable prompt. Pending requests now remember\ntheir schema requirement and reject with the capability error when the\nnew hello no longer satisfies it. Also awaits the newer-revision test's\nrequest so closing the client cannot leak an unhandled rejection.\n\n* fix(tui): keep every deferred prompt-stash release across rebinds\n\nA teardown release after a /new rebind overwrote the pending release\npair captured at the original deferral, so the first session's stash\nstate was never released. Deferred releases now accumulate per session\nand all drain once pending submissions settle.\n\n* fix(tui): restore the compaction loader without a start-event edge\n\nThe compaction spinner was created only on the compaction_start event,\nso a compaction already running when the client attached or returned to\nthe chat (e.g. a /compact queued from the agents view) showed no\nprogress at all until it finished. syncWorkingLoader now restores the\nloader from the connection's isCompacting state, and the loader\ncreation is shared with the event path. Adds core coverage proving the\ncompaction lifecycle events fire for /compact queued behind a running\nturn on both lanes.\n\n* test: consolidate scheduler tests into e2e scenario journeys\n\nReplace ~50 fine-grained scheduler test cases with 7 end-to-end scenario\ntests (S1-S7) that drive the real AgentSession through gated faux-model\nruns with staged, phase-labeled assertions:\n\n- S1: mid-run steering/follow-up/command/custom input ordering\n- S2: queue editing (coalescing, removal APIs, steering-stop reconciliation)\n- S3: pause-lease preparation with anchor re-preparation and direct handoff\n- S4: update-restart abort snapshots and envelope-vs-literal restore\n- S5: queued command delivery vs gated completion outcomes\n- S6: auto-refine via real turns (interval review, busy deferral, branch\n  navigation invalidation) instead of _maybeAutoRefine internals\n- S7: accepted agent-message lifecycle (busy queueing, delivery-before-\n  completion, literal slash commands, cleared-during-admission cleanup)\n\nAlso shrink the 300-iteration outcome-leak loop to 3, drop a typeof-only\nassertion, redundant whitespace-variant and duplicate guard tests.\n\nWhite-box tests for admission-boundary races, cooldown stamping, and\nfault-injection windows are kept; those interleavings have no public\ntrigger. Coverage on agent-session.ts is unchanged (59.7% lines before\nand after) at -516 net test lines.\n\n* fix: close session-input scheduler race windows around admission and restart checkpoints\n\nThree bugbot findings on the scheduler plus one hardening pass:\n\n- promptUntilAccepted no longer waits for the session-input pump after\n  admission: it resolves at ownership commit while queued work (including\n  slash commands) executes, restoring its documented contract.\n- waitForSessionInputCheckpoint now waits for an executing queued session\n  command; the pump shifts commands off the queue before running them, so\n  a restart snapshot could otherwise proceed mid-/compact or /refine and\n  drop the command from durable queued input.\n- The queued-prompt handoff holds a checkpoint section until dispatch is\n  observed. The phase flipped to handedOff (notifying checkpoint waiters)\n  before agent.prompt() ran, so a checkpoint could drain a stale event\n  queue snapshot and flush before the accepted messages persisted.\n- waitForPromiseOrAbort rechecks signal.aborted after registering its\n  abort listener, matching waitForPromptAdmission.\n\nEach fix has a regression test verified to fail against the unfixed code.\n\n* chore: trim comments in scheduler scenarios and race fixes\n\n* fix: fence triggerTurn custom messages for restart checkpoints\n\nsendCustomMessage with triggerTurn took direct-turn admission but never\nentered a direct prompt section, so waitForSessionInputCheckpoint could\nsnapshot between admission and dispatch and miss the in-flight turn.\nHold a checkpoint section from admission until the message dispatches,\nmirroring the queued-handoff fence.\n\n* fix: keep pump-owned session inputs visible as pending\n\nWhen the session-input pump moved prompts or commands into\n_activeSessionInput, they left the typed queues before delivery, so\npendingMessageCount, queue previews, snapshots, and queue_update briefly\nreported an empty queue during preparation and long-running queued\ncommands, and agent-message backpressure undercounted.\n\nCount still-preparing prompts and executing commands as pending, emit\nqueue updates at prompt handoff and command completion, and clear\nownership before the deferred-requeue emit so items are not\ndouble-counted.\n\n* fix: harden durable command persistence and cleared-input accounting\n\nTwo bugbot findings on the queued session-command path:\n\n- _appendDurableSessionCommandMessage now persists through\n  appendCustomMessageEntryWithRollback before touching live state, so a\n  failed write cannot leave an unsaved leaf or a transcript/file\n  divergence; the failure-row append no longer masks the original\n  command error.\n\n- clearQueue marks the preparing active input cancelled;\n  _undeliveredActiveSessionInputs now excludes cancelled items so\n  pendingMessageCount, previews, and queue updates drop cleared work\n  immediately instead of waiting for the pump to unwind.\n\n* fix: stop coalescing follow-up keys against handed-off prompts\n\nFollow-up queueKey coalescing treated all _activeSessionInput prompt\nitems as pending owners. After handoff the prompt is committed to the\nrunning turn, so a later same-key follow-up (e.g. a heartbeat) was\nrejected for the rest of that turn instead of queueing behind it.\nCoalesce only against a preparing, non-cancelled active input, shared by\n_enqueueSessionInput and hasQueuedFollowUp.\n\n* fix: count session-owned queues as queued work after compaction\n\nPost-compaction decisions only consulted agent.hasQueuedMessages(), but\nqueued prompts and commands now live in the session-owned steer and\nfollow-up queues. Include pendingMessageCount so auto-refine defers to\nthe next turn boundary instead of running before queued input turns,\nand post-compaction continue is scheduled when only session-owned work\nis waiting (manual, auto, and failure-resume paths).\n\n* fix(daemon): centralize prompt admission compatibility\n\n* fix(daemon): recheck command compatibility on replay"},{"name":"compact-session-stream.test.ts","kind":"file","size":5703,"lastCommitHash":"4d19005d4a25b10ce6d90fdd4961ed374c64ea17","lastCommitWhen":"2026-07-13T17:47:15-07:00","lastCommitMessage":"isolate daemon sessions in worker processes (#383)\n\n* perf(coding-agent): add large daemon attach benchmark\n\n* feat(coding-agent): isolate session execution in workers\n\n* fix(coding-agent): reconnect after supervisor replacement\n\n* fix(tui): preserve input across fullscreen handoff\n\n* fix(coding-agent): prevent archived heartbeat revival\n\n* fix(coding-agent): cancel orphan heartbeat sessions\n\n* fix(tui): preserve drafts across daemon refreshes\n\n* fix(coding-agent): separate daemon resyncs from replacements\n\n* fix(coding-agent): stabilize daemon streaming ui\n\n* refactor(coding-agent): remove obsolete subagent tree\n\n* feat(coding-agent): show subagent recaps inline\n\n* fix(coding-agent): refine subagent summary spacing\n\n* fix(coding-agent): preserve full subagent row selection\n\n* fix(coding-agent): align subagent summary rows\n\n* fix(coding-agent): preserve reasoning during daemon resync\n\n* fix(coding-agent): isolate heartbeat scheduling per worker (ENG-4527)\n\n* fix(coding-agent): retry partial daemon reconnects\n\n* fix(coding-agent): harden isolated daemon recovery\n\n* fix(coding-agent): close daemon recovery races\n\n* fix(coding-agent): validate daemon recovery state\n\n* fix(coding-agent): close isolated worker recovery gaps\n\n* fix(coding-agent): verify orphan process identity\n\n* fix(coding-agent): isolate worker client capabilities\n\n* fix(coding-agent): preserve daemon terminal ordering\n\n* fix(coding-agent): serialize durable daemon state\n\n* fix(coding-agent): avoid duplicate worker recovery\n\n* fix(coding-agent): isolate peer sync failures\n\n* fix(coding-agent): fail unanswered rpc commands\n\n* fix(coding-agent): distinguish lease contention"},{"name":"compaction-extensions-example.test.ts","kind":"file","size":2023,"lastCommitHash":"032e3ee74574ca16efaf8745a1394b821256a5d0","lastCommitWhen":"2026-08-18T12:17:35+02:00","lastCommitMessage":"chore: remove redundant comments and unused internals (#1505)\n\n* chore: remove redundant comments\n\n* chore(tui): remove redundant export comments\n\n* chore(coding-agent): remove redundant example comments\n\n* chore(ai): remove redundant comments\n\n* chore(coding-agent): remove obsolete core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant rpc test comments\n\n* chore(coding-agent): remove redundant CLI comments\n\n* chore(agent): remove redundant comments\n\n* chore(tui): remove redundant source comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(ai): remove redundant source comments\n\n* chore(coding-agent): remove redundant session comments\n\n* chore(coding-agent): remove redundant core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(tests): remove redundant test comments\n\n* chore: remove unused internal helpers\n\n* docs: restore public API contracts\n\n* chore(coding-agent): restore invariant documentation\n\n* chore(coding-agent): clarify agent family contracts\n\n* style(coding-agent): format restored contracts\n\n* fix: restore intentional catch explanations"},{"name":"compaction-extensions.test.ts","kind":"file","size":12781,"lastCommitHash":"4a7a55c9a1f053f0bc3500066c6a65b2d0ea4636","lastCommitWhen":"2026-05-08T15:34:55-07:00","lastCommitMessage":"make ipython default and remove legacy tools (#3)\n\n* chore: strip legacy tools\n\n* docs: remove stale read tool references"},{"name":"compaction-generation.test.ts","kind":"file","size":11006,"lastCommitHash":"bee1dc826360b82ca9d943ca856cd2863f597297","lastCommitWhen":"2026-09-01T22:34:13+09:00","lastCommitMessage":"feat(coding-agent): add loss-bounded compaction projection\n"},{"name":"compaction-serialization.test.ts","kind":"file","size":9226,"lastCommitHash":"bee1dc826360b82ca9d943ca856cd2863f597297","lastCommitWhen":"2026-09-01T22:34:13+09:00","lastCommitMessage":"feat(coding-agent): add loss-bounded compaction projection\n"},{"name":"compaction-summary-reasoning.test.ts","kind":"file","size":3048,"lastCommitHash":"3e5ad67e0f325d4888f82f9b82966218eb4407f5","lastCommitWhen":"2026-05-07T15:59:42+02:00","lastCommitMessage":"chore: migrate pi packages to earendil works scope\n"},{"name":"compaction.test.ts","kind":"file","size":26354,"lastCommitHash":"bee1dc826360b82ca9d943ca856cd2863f597297","lastCommitWhen":"2026-09-01T22:34:13+09:00","lastCommitMessage":"feat(coding-agent): add loss-bounded compaction projection\n"},{"name":"config.test.ts","kind":"file","size":16825,"lastCommitHash":"8189b12d6c2f2912326aa369d5d12533ba9d91b5","lastCommitWhen":"2026-08-18T14:04:58-07:00","lastCommitMessage":"Normalize daemon socket paths before deriving identity (#1520)\n\n* fix(coding-agent): normalize daemon socket paths at every entry point, fixes ENG-5303\n\n* fix(coding-agent): address review findings on socket-path normalization\n\n- Defer --daemon-socket normalization until after --cwd applies so relative\n  socket paths resolve against the requested working directory\n- Migrate legacy raw-spelling worker-descriptor namespaces to the canonical\n  directory on supervisor construction so existing workers stay adoptable\n- Consolidate the remaining private normalizers (package-manager-cli,\n  daemon-update-restart) onto the shared normalizeSocketPath\n- Wait for killed test supervisors to exit before removing their directories\n  to fix ENOTEMPTY flakes in CI\n\n* fix(coding-agent): harden descriptor-namespace adoption and test cleanup\n\n- Adopt a raw-spelling descriptor namespace only after the socket-path lease\n  and registry ownership are held, so a rejected startup can never move a live\n  supervisor's directory\n- Skip unreadable JSON entries per file when identifying a namespace instead\n  of aborting the whole scan\n- Drop migration-era vocabulary from the helper names and test titles\n- Disable the Node compile cache for spawned test supervisors and tolerate\n  cleanup races so worker processes exiting late cannot fail the suite\n\n* refactor(coding-agent): drop the descriptor-namespace adoption machinery\n\nNormalization at the entry points prevents namespace forks going forward;\ndescriptors written under an old raw-spelling key are healed per-field on\nload only when they share the directory. Cross-directory adoption kept\naccreting ordering hazards (live-daemon rename races, persisted-config\nstaleness) disproportionate to its value, so a daemon that previously ran\non a non-canonical spelling simply starts fresh namespaces; saved sessions\nare unaffected (they live in the session catalog, not the descriptor dir).\n\n* docs(coding-agent): align the changelog with the simplified scope\n\n* chore(coding-agent): trim excessive comments\n\n* fix(coding-agent): normalize the early-launch socket key and drop an incidental test\n\nmaybeStartDaemonEarly memoized ensure attempts under the raw --daemon-socket\nspelling while main uses the normalized one, so equivalent spellings could\nrun two concurrent spawn attempts for one daemon. The early kick now derives\nthe same canonical spelling (resolving relative paths against --cwd).\n\n* chore(coding-agent): simplify socket normalization coverage\n\n* Address final review feedback\n\n---------\n\nCo-authored-by: Seth <seth@primeintellect.ai>"},{"name":"configuration-menu.test.ts","kind":"file","size":7676,"lastCommitHash":"a6c08e8903aff749810860865156ceb7b75d4598","lastCommitWhen":"2026-08-05T01:54:45-04:00","lastCommitMessage":"Add reverse tab navigation to /login, remaps model scope to alt/option+s (#618)\n\n* feat(login): support reverse tab navigation\n\n* remap model scope to alt/opt+s and shift+tab to reverse\n\n* fix old tests\n\n---------\n\nCo-authored-by: az <altzhang@mit.edu>\nCo-authored-by: Alex Zhang <alex.lx.zhang@gmail.com>"},{"name":"context-tree.test.ts","kind":"file","size":17767,"lastCommitHash":"21e51f30eecb9025b9bc9cfa8ec8bdf635d88135","lastCommitWhen":"2026-07-22T11:08:52+02:00","lastCommitMessage":"Unify navigation, continuation, and disclosure symbols across the TUI (#487)\n\n* chore: unify selection cursor, continuation, tree connector, and queued marker symbols\n\n- Changed selection cursor from → to › across SelectList, scoped-models\n  selector, and theme default to match tree-selector and user-message-selector\n- Changed queued follow-up hint from ↳ to ╰─ to match tool-execution connector\n- Changed /context tree connectors from ├ /└  to ├─ /└─  to match tree-selector\n  and session-picker\n- Changed IPython cell queued marker from ▸ to ◇ to match subagent and\n  context-tree status icons (◇→◆ working-icon pulse family)\n\n* test: update context-tree assertions for unified tree connectors"},{"name":"cron-jobs.test.ts","kind":"file","size":49282,"lastCommitHash":"3b2d1f227556ea7dbb33dd394e9ba3990cd0f320","lastCommitWhen":"2026-08-03T09:56:38+02:00","lastCommitMessage":"refactor(coding-agent): harden session action races (#576)\n\n* refactor(coding-agent): harden session action races\n\n* fix(coding-agent): revalidate turn batches after commit fence acquisition\n\n* fix(coding-agent): reschedule pump after batch revalidation deferral\n\n* fix(coding-agent): restore cross-lane queue-key coalescing and compaction pending checks\n\nThe underlying bugs originate in PR #573, but this fix lands at the stack head in PR #576 to avoid rebasing three dependent PRs immediately before release.\n\n* refactor(coding-agent): delete compensating scheduler state\n\n* fix(coding-agent): count only pending successors after compaction\n\n* fix(coding-agent): honor prompt abort during fence wait and fix compaction test await\n\n* test(coding-agent): remove flaky post-compaction continue regression\n\nThe fake-timer event-await combination never completes under CI timing.\nThe production change it covered (pending-successor counting after\nthreshold compaction, 697fcf474) remains covered by the passing\n'resumes after threshold compaction when only agent-level queued\nmessages exist' test exercising the same projection.\n\n* fix(coding-agent): reject fence waiters on session disposal\n\n* fix(coding-agent): restore settlement, ordering, and idle guards\n\nSeveral fixes originate in #574/#575 but land at the stack head to avoid rebasing the whole chain.\n\n* fix(coding-agent): serialize injected admission with the commit fence\n\n* fix(coding-agent): release fence on admission failure and unify pause-aware admission\n\n* fix(coding-agent): stabilize waitForIdle event-queue wait and drop dead queue-key probe\n\n* fix(coding-agent): preserve batched action message order (fixes #576)\n\n* fix(coding-agent): revalidate commands after commit fence (fixes #576)\n\n---------\n\nCo-authored-by: Alex Zhang <alex.lx.zhang@gmail.com>"},{"name":"custom-editor.test.ts","kind":"file","size":9628,"lastCommitHash":"8ee310c5d551b5a020c724b44573371a7bf383fc","lastCommitWhen":"2026-08-18T15:50:44+02:00","lastCommitMessage":"fix(coding-agent): keep Shift+Enter newline working where it sends a raw \\n (#1522)\n\n* fix(coding-agent): let a raw \\n insert a newline instead of toggling edit diffs\n\n0.7.3 added app.edits.expand with the default ctrl+j (#1388). The custom\neditor dispatches app actions before the base editor handling, and a raw\n\"\\n\" byte decodes as ctrl+j — but that byte is exactly what Shift+Enter\nsends in terminals that map it to a literal newline (the mapping our own\nkeys.ts comments recommend for Ghostty), and ctrl+j is itself a\ntraditional newline key. Since 0.7.3, that input toggled edit diffs and\nShift+Enter stopped producing newlines outside kitty-protocol terminals.\n\nSkip app-action dispatch for the raw \"\\n\" byte in the editor and in the\nsubagent-line key handler so it reaches the newline handling; ctrl+j\nstill triggers the toggle via the kitty CSI-u encoding, which is\nunambiguous.\n\n* Trim the collision comments to one line each"},{"name":"daemon-catalog-process.test.ts","kind":"file","size":900,"lastCommitHash":"06e4a19dc902382dbb90b67fbe4ed53c3f7b99b2","lastCommitWhen":"2026-08-16T12:00:25+02:00","lastCommitMessage":"refactor(daemon): consolidate rlm subagent metadata onto the spawn ledger (#1390)\n\n* feat(daemon): add per-child rlm subagent display files\n\n* feat(daemon): serve passive rlm subagents from the ledger and stop writing registries\n\n* refactor(daemon): drop the unconsumed catalog siblings walk\n\n* test(daemon): cover display files and legacy registry metadata fallback\n\n* refactor(daemon): share rlm subagent metadata field spreading\n\n* refactor(daemon): derive the legacy registry entry type from the passive entry\n\n* fix(daemon): resolve deleted-child paths for job cleanup and harden display writes\n\n* fix(daemon): fail admission on lost spawn records and never clobber-publish seeds"},{"name":"daemon-client-env.test.ts","kind":"file","size":4200,"lastCommitHash":"032e3ee74574ca16efaf8745a1394b821256a5d0","lastCommitWhen":"2026-08-18T12:17:35+02:00","lastCommitMessage":"chore: remove redundant comments and unused internals (#1505)\n\n* chore: remove redundant comments\n\n* chore(tui): remove redundant export comments\n\n* chore(coding-agent): remove redundant example comments\n\n* chore(ai): remove redundant comments\n\n* chore(coding-agent): remove obsolete core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant rpc test comments\n\n* chore(coding-agent): remove redundant CLI comments\n\n* chore(agent): remove redundant comments\n\n* chore(tui): remove redundant source comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(ai): remove redundant source comments\n\n* chore(coding-agent): remove redundant session comments\n\n* chore(coding-agent): remove redundant core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(tests): remove redundant test comments\n\n* chore: remove unused internal helpers\n\n* docs: restore public API contracts\n\n* chore(coding-agent): restore invariant documentation\n\n* chore(coding-agent): clarify agent family contracts\n\n* style(coding-agent): format restored contracts\n\n* fix: restore intentional catch explanations"},{"name":"daemon-client.test.ts","kind":"file","size":29467,"lastCommitHash":"7f207361ffa85bb58dbf45c51c166c6c7cb26143","lastCommitWhen":"2026-08-05T04:46:52+02:00","lastCommitMessage":"feat(coding-agent): per-sibling-set names and family roster (#595)\n\n* feat(coding-agent): per-sibling-set names and family roster\n\nEnforce sibling-scoped names against resident, passive, and saved agent catalogs across spawn and rename paths. Add a relationship-scoped family roster host request and Python skill API, sharing agents-view status classification and cross-worker catalog synchronization.\n\nTrack B PR 1 of the recursive-agent-harness plan (PR 4 in the plan table).\n\n* fix(coding-agent): decouple roster sync from catalog hot path; complete uniqueness coverage\n\n- remove saved-session scans from peer sync and make launch sync failures non-fatal\\n- share roster status classification and preserve fresh local catalog rows\\n- enforce root, saved-child, and extension rename uniqueness with bounded sibling reads\\n- centralize collision errors and pin id/name ambiguity behavior\n\n* fix(coding-agent): bound default session-name search to safe integers\n\n* fix(coding-agent): normalize and preflight agent names\n\n- Normalize daemon session names and reject empty values before validation and persistence.\\n- Preflight passive child names before hydration commits resident runtimes.\\n- Fall back to listAgents metadata for custom controllers without name validation.\\n- Normalize supervisor create names before collision checks and reservations.\n\n* fix(coding-agent): classify nonresident subagents as inactive\n\n* fix(coding-agent): separate subagent delete intent from cancel_rlm_child\n\ncancel_rlm_child returns to pure cancel semantics: it reports\n{ cancelled } and never deletes. Deletion now travels explicitly over\na new delete_rlm_subagent command behind the rlm_subagent_deletion\nserver capability. The daemon only deletes children that are not\ncurrently running and reports unknown or running targets benignly\ninstead of throwing. The agents view revalidates the row state on the\nconfirming keypress, sends cancel for running rows and the delete\ncommand for inactive or completed rows, and falls back to cancel-only\nwith a notice when the daemon lacks the capability.\n\nFixes: unknown children turning cancel into a failed daemon response;\na subagent finishing between the two delete keypresses being deleted\nunder stop semantics; retained idle resident children being permanently\ndeleted by a stop.\n\n* fix(coding-agent): authoritative running checks and root scoping for subagent lifecycle\n\ndelete_rlm_subagent could kill a daemon-hydrated child that was\nactively streaming but absent from the parent's local run map; the\ndaemon now refuses deletion when the child session itself is running.\nConcurrent delete joiners derived success from a per-call flag and\ncould report deleted when the shared deletion bailed on a running\nchild; the outcome now propagates through the shared promise. Forked\ntop-level sessions carried their fork source as a header parent into\nname scoping, escaping root-scope uniqueness; effective depth zero is\nnow root-scoped for names.\n\n* fix(coding-agent): delete nested inactive subagents\n\n- Recurse through active and retained child sessions when deleting an inactive nested subagent.\n- Treat matching resident descendants as running regardless of their immediate parent session.\n- Add regressions for nested deletion and daemon running-state protection.\n\n* fix(coding-agent): propagate skipped subagent deletion outcomes\n\n- Preserve skipped_running outcomes in the RLM delete-subagent host response while retaining the existing deleted response shape.\n- Add a host-handler regression test for skipped_running deletion races.\n\n* fix(coding-agent): canonicalize sibling parent identity\n\n- Resolve mixed parent session paths and IDs through catalog identity pairs.\n- Keep identifier-less non-root sessions out of sibling and name-conflict groups.\n- Cover canonical, unresolved, and parentless sibling comparisons.\n\n* fix(coding-agent): resolve relative sibling parent paths\n\n- Resolve target parent session paths relative to the target session file.\n- Canonicalize each saved sibling's relative parent path from its own session directory.\n- Cover sibling discovery when relative parent headers differ across child directories."},{"name":"daemon-command.test.ts","kind":"file","size":15973,"lastCommitHash":"e714b3a61a900338ecb28681336dda800ffff0b8","lastCommitWhen":"2026-08-05T17:46:39+02:00","lastCommitMessage":"refactor(coding-agent): make agent messages steer-only (#631)"},{"name":"daemon-extension-binding.test.ts","kind":"file","size":8594,"lastCommitHash":"b030f3938463c2a9f5767c93e861a2d5d57b5d92","lastCommitWhen":"2026-08-05T04:46:52+02:00","lastCommitMessage":"feat(coding-agent): intra-tree child session passivation (#589)\n\n* feat(coding-agent): intra-tree child session passivation\n\nTrack A PR 7 (final) of the recursive-agent-harness plan (D5, shape 2):\n\n- idle child sessions inside a LIVE worker passivate individually: graceful\n  closeSession (kernel snapshot + JSONL flush + lease release), sessions-map\n  removal, registry/catalog rows preserved - the child becomes exactly a\n  lazy-hydration passive row (attach/message/observe/list all work)\n- pure canPassivateSession() beside canEvictWorker(), sharing its per-\n  session clauses; additionally requires a parent edge, no non-passive\n  descendants, and no mid-hydration descendant (passive children's\n  sessionFiles checked against openingSessions - hydration blocks parent\n  passivation); roots remain shape-1 territory; passivation never cascades\n- complete-then-rehydrate: touches mid-passivation join the passivation\n  promise (keyed by resolved sessionFile - stable across sessions-map\n  removal) then flow through the normal hydration machinery; deterministic\n  gated race tests for a2a delivery and grandchild hydration\n- supervisor sweep extension: capped worker command (2 children/worker/\n  sweep), one snapshot per state per sweep, fresh-snapshot fence recheck\n  before dispose; whole-tree-evictable workers excluded (owned by shape 1)\n- same idleEvictionMinutes setting governs both shapes; #548 doctrine\n  inversion deferred (prompts out of scope this run)\n\n* fix(coding-agent): harden passivation against new admission fences and reap dedupe\n\nPost-rebase semantic fixes after moving the stack onto the hardened\nscheduler base (cb8f53e15):\n\n- passivation predicate treats admission-in-flight as busy: agent-message\n  accepting/preparing/target-lock states and AgentSession's pending\n  admission-fence waiters (70aeb9c49/2d97dbb4f made prompt paths await the\n  direct-turn admission fence before any session action exists, so a target\n  mid-admission looked idle to the sweep); deterministic gated-admission\n  regression test\n- deleteRlmSubagentRuntime cancels scheduled jobs by session file even when\n  its close joins an in-flight passivation close via closingSessions (the\n  joined 'shutdown' close skipped 'killed'-close job cleanup; #547 reap race)\n\n* fix(coding-agent): harden passive-child hydration, resolution, and deletion races\n\n- Finding 0: heartbeat restore could return a concurrently hydrating child before binding; fence resident fallback with waitForBoundSession and treat unavailable binding as a skipped dispatch. origin: PR #583\n- Finding 1: supervisor child lookup accepted only exact selectors after worker suffix matching; add the same session-ID suffix fallback within the selected worker. origin: PR #583\n- Finding 3: passive create hydration skipped explicit name and client environment bookkeeping; apply both before returning the hydrated state. origin: PR #583\n- Finding 4: concurrent passive deletions raced through asynchronous resolution and started duplicate host deletes; defer deletion behind an atomic in-flight map check and coalesce callers. origin: PR #583\n- Finding 5: concurrent hydration could make a passive lookup stale for advertised IDs and paths; retry normal bound-session resolution before rethrowing the original unknown-session error. origin: PR #583\n- Finding 6: ambiguous live selectors fell through to passive lookup and could misroute; introduce a dedicated ambiguity error and rethrow it before passive resolution. origin: PR #583\n- Finding 7: passive open skipped name and client-env bookkeeping (cron rebinding already occurred in addRuntime); apply only the missing bookkeeping. origin: PR #583\n- Finding 30: rlmChildId traffic treated a resident passivating child as closing; join passivation and rehydrate in both bound lookup and direct message hydration branches. origin: PR #589\n\n* fix(coding-agent): restore attach/catch-up ordering invariants and sweep snapshot atomicity\n\n- Finding 22: async snapshot creation exposed clients before attach initialization; publish client attachment only after the snapshot resolves. origin: PR #587\n- Finding 23: catch-up validity was checked only before async snapshot creation; revalidate session and client attachment after the await. origin: PR #587\n- Finding 25: deterministic ambiguous selectors entered the 30-second remote-send retry loop; fail fast for Ambiguous errors. origin: PR #588\n- Finding 28: active rows ignored stable file-keyed schedule pins during active-id rebinding; consult both id- and file-keyed heartbeat/cron sets. origin: PR #588\n- Finding 29: passivation sampled activity before an asynchronous passive-registry walk; complete the walk before atomically sampling summary and admission markers. origin: PR #589\n\n* fix(coding-agent): correct rlmDepth semantics on reference edges, env parsing, and legacy fallbacks\n\n- Finding 8: new-session parent links were deriving spawn depth; copy the source header depth across the reference edge and add a runtime regression test (origin: PR #584).\n- Finding 9: first-entry forks of legacy sessions discarded effective runtime depth; fall back to session.rlmDepth in persisted and in-memory branches and test both (origin: PR #584).\n- Finding 10: root RLM_DEPTH parsing accepted malformed and unsafe values; require decimal digits and a valid safe non-negative integer, with probe cases as tests (origin: PR #584).\n- Finding 11: child-depth derivation could overflow MAX_SAFE_INTEGER; guard the increment and test the boundary (origin: PR #584).\n- Finding 12: daemon children of in-memory parents skipped explicit depth persistence; always create the child header with explicit depth and test --no-session ancestry (origin: PR #584).\n- Finding 13: legacy completed subagents rehydrated at root depth; restore the depth-one fallback and test a registry/header pair without depth (origin: PR #584).\n\n* fix(coding-agent): make /rlm-max-depth persistence honest and unblock stale kernel gate\n\n- /rlm-max-depth --global could claim persistence after deferred settings write failures; drain and surface global errors before reporting success (origin: PR #585)\n- /rlm-max-depth mutated live state before chat persistence and left failed entries indexed; persist first through rollback-safe custom-entry append, then mutate state and prompt (origin: PR #585)\n- invalid persisted global rlmMaxDepth could abort branch navigation after the leaf moved; ignore invalid global reads and fall through to env/default (origin: PR #585)\n- the kernel-side recursion pre-filter used stale one-shot RLM_MAX_DEPTH and blocked raises before the authoritative host gate; remove the duplicated Python gate (origin: PR #585)\n\n* fix(coding-agent): agents-view scope stability, crash-path backSession, summary refresh, pulse, and settings cycling\n\n- Finding 18: stale saved-catalog readiness could destructively drop scope during refresh; reset readiness when refresh starts. origin: PR #586\n- Finding 19: resolved scope roots were lost across view remounts, swallowing early Left navigation; persist and restore the root summary. origin: PR #586\n- Finding 20: post-attach crashes left backSession pointing at the prior session; assign the opened summary before interactive mode runs. origin: PR #586\n- Findings 21 and 24: startup seeding could leave subagent counts stale and background subagents drove an unused render pulse; refresh every seed and pulse only while streaming. origin: PR #587\n- Finding 27: custom idle-eviction values cycled directly to off; include custom numeric values in the sorted cycle. origin: PR #588\n\n* fix(coding-agent): attach reservation vs passivation, binding join on retry, hydration env, settings error scoping, fractional eviction values\n\n- reserve in-flight attaches and revalidate session liveness before attachment (origin: round-1 fix a342ca23d)\n- join concurrent child binding on the final passive resolution retry (origin: round-1 fix ae3ed4571)\n- adopt create-command client env before passive child hydration (origin: round-1 fix ae3ed4571)\n- isolate max-depth write errors while preserving project diagnostics (origin: round-1 fix 9e738f38f)\n- preserve fractional idle eviction values through settings cycling (origin: round-1 fix 721f45b59; stack commit aa98c9aca)\n\n* fix(coding-agent): post-rebase hardening of passive hydration, snapshots, and depth ingestion\n\n- preserve daemon routable IDs for passive children (origin: PR #583)\n- recheck guarded passive hydration and heartbeat restores (origin: PR #583)\n- repair wrong-kind pending hydration joins (origin: PR #583)\n- fence passive hydration during update restart preparation (origin: PR #583)\n- validate persisted RLM depth before constructor ingestion (origin: PR #584)\n- retry attach child snapshots across session replacement (origin: PR #587)\n- retain effective depth for legacy parented new sessions (origin: PR #589)\n- coordinate parent passivation with child hydration publication (origin: PR #589)\n\n* fix(coding-agent): leave shared passive hydration resident on guard cancellation\n\nThe ownership-blind close closed shared hydrations out from under concurrent wakes (both interleavings); the idle sweep is the ownership-free arbiter.\n\norigin: round-4 fix b95640046 / PR #583\n\n* fix(coding-agent): prefer persisted header depth for legacy rehydration entries\n\nThe legacy-entry rehydration fallback (entry.rlmDepth ?? 1) is passed as\nconfig, which outranks the opened transcript header in AgentSession — so a\nnested legacy child whose header carried a deeper persisted depth woke at\ndepth 1, weakening the host recursion gate. Registry depth stays\nauthoritative when present; otherwise the validated header depth wins and 1\nremains the last-resort default for fully legacy children.\n\norigin: PR #584 fallback restored in round-1 triage; surfaced by post-rebase\nbot review of PR #589.\n\n* fix(coding-agent): fence chain hydration against parent passivation; invalidate stale scope roots\n\n* fix(coding-agent): bound the session snapshot stabilization loop\n\n* fix(coding-agent): restore child event forwarder when passivation close fails\n\nPassivation teardown invoked the retained child's event-forwarder\nunsubscribe before closing the session. When the close failed and the\nchild was re-adopted, the forwarder was gone, so a still-resident child\nstopped emitting rlm_child_update to its parent. Teardown now returns\nthe unsubscribe so the passivation path only invokes it after a\nsuccessful close and restores it on the failed-close re-adopt path.\n\n* fix(coding-agent): close child passivation races\n\n- Keep snapshot messages aligned with the final runtime session summary after stabilization exhaustion.\n- Retry passive child hydration when the child starts passivating inside the hydration window.\n- Apply archive and scheduled-job cancellation when kill joins a resume-preserving close.\n\n* fix(coding-agent): upgrade cascading close reasons\n\n- Track the applied close reason and resident descendant states through cascading teardown.\n- Apply stronger joined close effects uniformly to parents and captured descendants.\n- Cover shutdown-to-killed descendant cleanup and completed-to-killed idempotency.\n\n* fix(coding-agent): preserve passive child id on hydration retry\n\n- Forward the restored active-session ID when retrying after a mismatched pending open.\n- Cover the pending-open race through passive-child hydration.\n\n* fix(coding-agent): recover passivation waiters\n\n- Treat failed passivation settlement as a join signal before retrying resident sessions.\n- Cover concurrent open, message delivery, and hydration after passivation rejection.\n\n* fix(coding-agent): harden passivation close races\n\n- Preserve stronger close-reason upgrades when the joined close fails.\n- Run child passivation outside the supervisor-wide eviction fence.\n- Complete reason-upgrade persistence across targets and record the stronger reason before propagating errors.\n\n* fix(coding-agent): preserve passive opener state across races\n\n- Defer root parent client env adoption until passive hydration and its open guard succeed.\n- Join opening or resident passive targets when parent-change restart resolution races hydration."},{"name":"daemon-launch.test.ts","kind":"file","size":15782,"lastCommitHash":"315420208447126ac84cf53efe3ee0a66c66255f","lastCommitWhen":"2026-08-05T01:27:31-04:00","lastCommitMessage":"fix(coding-agent): show why the daemon crashed instead of a generic timeout (#608)\n\n* fix(coding-agent): surface daemon startup crashes\n\n* refactor(coding-agent): simplify daemon startup stderr capture\n\n* fix(coding-agent): report startup crashes from the daemon log instead of a stderr pipe\n\nPiping the detached daemon's stderr tied its lifetime to the CLI: once\nthe short-lived client exited and the pipe closed, the daemon's next\nconsole.error crashed it with EPIPE (CI: serialized-refine and 4685\ndaemon tests). A pipe also raced exit-before-drain and kept the parent\nevent loop alive on the timeout path, as both review bots noted.\n\nSpawn with stdio ignore again and read the tail of the daemon's own\nrotating log for the error text; the supervisor already writes startup\nfailures there before rethrowing.\n\n* fix(coding-agent): only report daemon log content from the current startup\n\nBot review follow-up: the per-socket log persists across runs, so a\ndaemon that crashed before logging surfaced a previous run's tail as\nthe crash cause. Snapshot the log size before spawning and read only\ncontent past it, falling back to the full file if rotation shrank it.\n\n* fix(coding-agent): compare daemon log offset in bytes\n\nBot review follow-up: the pre-spawn offset comes from statSync (bytes)\nbut was applied with string slice (characters), so multi-byte log\ncontent shifted the window and could resurface stale lines or hide\nfresh ones. Slice the raw buffer and decode afterwards.\n\n* fix(coding-agent): tolerate losing a daemon startup race\n\nBot review follow-up: a spawned child that exits because a concurrent\nlauncher won the socket must not fail the ensure when a healthy daemon\nis already answering. Probe before failing on child exit.\n\n* fix changelog + add extra listeners on other types of errors\n\n---------\n\nCo-authored-by: az <altzhang@mit.edu>\nCo-authored-by: Alex Zhang <alex.lx.zhang@gmail.com>"},{"name":"daemon-list-format.test.ts","kind":"file","size":2729,"lastCommitHash":"941576dbec6d388de6b9f3cb61bce90cce3f55c4","lastCommitWhen":"2026-08-03T09:56:37+02:00","lastCommitMessage":"refactor(coding-agent): publish session action protocol (#575)\n\n* refactor(coding-agent): publish session action protocol\n\n* fix(coding-agent): restore queue projection guards and recovery validation\n\n* fix(coding-agent): repair test migrations for session action snapshots\n\n* correcting when multiple messages are sent, how it's counted\n\n* fix(coding-agent): await update supervisor teardown (fixes #575)\n\n---------\n\nCo-authored-by: Alex Zhang <alex.lx.zhang@gmail.com>"},{"name":"daemon-mode.test.ts","kind":"file","size":371713,"lastCommitHash":"94f25d4f34f31f4b5a096834097edd9ccb1a2992","lastCommitWhen":"2026-09-01T22:32:33+09:00","lastCommitMessage":"feat(coding-agent): add root session controls\n"},{"name":"daemon-multiclient-bench.ts","kind":"file","size":26374,"lastCommitHash":"941576dbec6d388de6b9f3cb61bce90cce3f55c4","lastCommitWhen":"2026-08-03T09:56:37+02:00","lastCommitMessage":"refactor(coding-agent): publish session action protocol (#575)\n\n* refactor(coding-agent): publish session action protocol\n\n* fix(coding-agent): restore queue projection guards and recovery validation\n\n* fix(coding-agent): repair test migrations for session action snapshots\n\n* correcting when multiple messages are sent, how it's counted\n\n* fix(coding-agent): await update supervisor teardown (fixes #575)\n\n---------\n\nCo-authored-by: Alex Zhang <alex.lx.zhang@gmail.com>"},{"name":"daemon-protocol.test.ts","kind":"file","size":16252,"lastCommitHash":"c75a637b00d3b52762841e72efe92289a0d55b49","lastCommitWhen":"2026-08-20T11:40:26-07:00","lastCommitMessage":"feat(coding-agent): support ACP MCP programs (#1378)\n\n* feat(coding-agent): support ACP MCP programs\n\n* feat(coding-agent): port ACP MCP servers to kernel runtime\n\n* fix(coding-agent): fence ACP MCP daemon ownership\n\n* fix(coding-agent): release ACP MCP leases on detach\n\n* test(coding-agent): preserve daemon prototype fixtures\n\n* fix(coding-agent): roll back failed ACP MCP claims\n\n* fix(coding-agent): reap ACP MCP transports on release\n\n* fix(coding-agent): isolate ACP MCP release failures\n\n* fix(coding-agent): retry empty-session MCP cleanup\n\n---------\n\nCo-authored-by: Seth <seth@primeintellect.ai>"},{"name":"daemon-ps-format.test.ts","kind":"file","size":1625,"lastCommitHash":"ebb240e5a8dce8cb0e169f0be94b8bae3c2ae1b1","lastCommitWhen":"2026-07-16T12:38:34-07:00","lastCommitMessage":"standardize cli commands and discovery (#423)\n\n* feat: standardize cli commands (ENG-4538)\n\n* fix: address cli review feedback\n\n* fix: address cli review follow-ups\n\n* fix: handle cli routing edge cases\n\n* fix: correct doctor cleanup guidance\n\n* fix: improve cli migration errors\n\n* fix: complete cli migration guidance\n\n* fix: harden shutdown cleanup output\n\n* fix: keep attach connect-only\n\n* fix: preserve agents options\n\n* fix: attach path-like agent names\n\n* test: migrate shutdown regression\n\n* fix(coding-agent): address cli review findings\n\nfixes #423\n\n* fix(coding-agent): route removed commands through help\n\nfixes #423\n\n* fix(coding-agent): preserve help and attach routing\n\nfixes #423\n\n* fix(coding-agent): preserve nested command options\n\nfixes #423\n\n* fix(coding-agent): distinguish help prompts from commands\n\nfixes #423\n\n* docs: add common cli commands"},{"name":"daemon-ps.test.ts","kind":"file","size":9758,"lastCommitHash":"10a5de8f4595f7a60d9fa58ebd820248276698c6","lastCommitWhen":"2026-07-17T13:30:17-07:00","lastCommitMessage":"make daemon mismatches self-healing (#466)\n\n* fix daemon mismatch recovery for ENG-4687\n\n* fix daemon review findings for ENG-4687\n\n* bound daemon shutdown discovery for ENG-4687\n\n* fix daemon shutdown convergence state for ENG-4687\n\n* document isolated daemon message logging failure\n\n* fix daemon startup and update recovery for ENG-4687\n\n* isolate daemon recovery listeners for ENG-4687\n\n* preserve protocol 3 heartbeat support for ENG-4687"},{"name":"daemon-runtime-lease.test.ts","kind":"file","size":2032,"lastCommitHash":"4d19005d4a25b10ce6d90fdd4961ed374c64ea17","lastCommitWhen":"2026-07-13T17:47:15-07:00","lastCommitMessage":"isolate daemon sessions in worker processes (#383)\n\n* perf(coding-agent): add large daemon attach benchmark\n\n* feat(coding-agent): isolate session execution in workers\n\n* fix(coding-agent): reconnect after supervisor replacement\n\n* fix(tui): preserve input across fullscreen handoff\n\n* fix(coding-agent): prevent archived heartbeat revival\n\n* fix(coding-agent): cancel orphan heartbeat sessions\n\n* fix(tui): preserve drafts across daemon refreshes\n\n* fix(coding-agent): separate daemon resyncs from replacements\n\n* fix(coding-agent): stabilize daemon streaming ui\n\n* refactor(coding-agent): remove obsolete subagent tree\n\n* feat(coding-agent): show subagent recaps inline\n\n* fix(coding-agent): refine subagent summary spacing\n\n* fix(coding-agent): preserve full subagent row selection\n\n* fix(coding-agent): align subagent summary rows\n\n* fix(coding-agent): preserve reasoning during daemon resync\n\n* fix(coding-agent): isolate heartbeat scheduling per worker (ENG-4527)\n\n* fix(coding-agent): retry partial daemon reconnects\n\n* fix(coding-agent): harden isolated daemon recovery\n\n* fix(coding-agent): close daemon recovery races\n\n* fix(coding-agent): validate daemon recovery state\n\n* fix(coding-agent): close isolated worker recovery gaps\n\n* fix(coding-agent): verify orphan process identity\n\n* fix(coding-agent): isolate worker client capabilities\n\n* fix(coding-agent): preserve daemon terminal ordering\n\n* fix(coding-agent): serialize durable daemon state\n\n* fix(coding-agent): avoid duplicate worker recovery\n\n* fix(coding-agent): isolate peer sync failures\n\n* fix(coding-agent): fail unanswered rpc commands\n\n* fix(coding-agent): distinguish lease contention"},{"name":"daemon-session-id.test.ts","kind":"file","size":5656,"lastCommitHash":"b0a77adeb9f7e9c219803e25829c83a92c639ebb","lastCommitWhen":"2026-07-20T13:28:04-07:00","lastCommitMessage":"reject invalid resume session ids (#479)\n\n* fix(coding-agent): reject invalid resume selectors (ENG-4722)\n\n* fix(coding-agent): resolve ambiguous session selectors\n\nfixes #479\n\n* fix(coding-agent): prefer exact session ids\n\nfixes #479"},{"name":"daemon-session-list.test.ts","kind":"file","size":23253,"lastCommitHash":"c0334a176fb8f78b8c37327a6c76865792b03b52","lastCommitWhen":"2026-08-29T10:52:45+02:00","lastCommitMessage":"fix(coding-agent): single projection for RLM child snapshots (#1845)\n\n* fix(coding-agent): single projection for RLM child snapshots\n\n* fix(coding-agent): project live follow-up activity for session-only children\n\nA rehydrated child registered without an RlmChildRun always snapshotted as\nstatus done with no activity, so an attach mid-follow-up showed it idle.\nDerive activity from live session state, mirroring the run projection's\ndone-plus-activity convention for follow-ups."},{"name":"daemon-session-summarizer-lifecycle.test.ts","kind":"file","size":7803,"lastCommitHash":"032e3ee74574ca16efaf8745a1394b821256a5d0","lastCommitWhen":"2026-08-18T12:17:35+02:00","lastCommitMessage":"chore: remove redundant comments and unused internals (#1505)\n\n* chore: remove redundant comments\n\n* chore(tui): remove redundant export comments\n\n* chore(coding-agent): remove redundant example comments\n\n* chore(ai): remove redundant comments\n\n* chore(coding-agent): remove obsolete core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant rpc test comments\n\n* chore(coding-agent): remove redundant CLI comments\n\n* chore(agent): remove redundant comments\n\n* chore(tui): remove redundant source comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(ai): remove redundant source comments\n\n* chore(coding-agent): remove redundant session comments\n\n* chore(coding-agent): remove redundant core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(tests): remove redundant test comments\n\n* chore: remove unused internal helpers\n\n* docs: restore public API contracts\n\n* chore(coding-agent): restore invariant documentation\n\n* chore(coding-agent): clarify agent family contracts\n\n* style(coding-agent): format restored contracts\n\n* fix: restore intentional catch explanations"},{"name":"daemon-session-summarizer.test.ts","kind":"file","size":7261,"lastCommitHash":"92042b4dbcef9f6064f5be28ef461e44a8f90c38","lastCommitWhen":"2026-06-23T15:34:26-07:00","lastCommitMessage":"put the recap status in its own tag and harden parsing (#244)\n\n* put recap status in a <status> tag and harden parsing\n\n* drop WORKING from the status set; only completed/needs_input matter\n\n* parse recaps purely from the tags and drop the line-format fallback\n\n* trim noise comments in the summarizer"},{"name":"daemon-socket.test.ts","kind":"file","size":7748,"lastCommitHash":"8189b12d6c2f2912326aa369d5d12533ba9d91b5","lastCommitWhen":"2026-08-18T14:04:58-07:00","lastCommitMessage":"Normalize daemon socket paths before deriving identity (#1520)\n\n* fix(coding-agent): normalize daemon socket paths at every entry point, fixes ENG-5303\n\n* fix(coding-agent): address review findings on socket-path normalization\n\n- Defer --daemon-socket normalization until after --cwd applies so relative\n  socket paths resolve against the requested working directory\n- Migrate legacy raw-spelling worker-descriptor namespaces to the canonical\n  directory on supervisor construction so existing workers stay adoptable\n- Consolidate the remaining private normalizers (package-manager-cli,\n  daemon-update-restart) onto the shared normalizeSocketPath\n- Wait for killed test supervisors to exit before removing their directories\n  to fix ENOTEMPTY flakes in CI\n\n* fix(coding-agent): harden descriptor-namespace adoption and test cleanup\n\n- Adopt a raw-spelling descriptor namespace only after the socket-path lease\n  and registry ownership are held, so a rejected startup can never move a live\n  supervisor's directory\n- Skip unreadable JSON entries per file when identifying a namespace instead\n  of aborting the whole scan\n- Drop migration-era vocabulary from the helper names and test titles\n- Disable the Node compile cache for spawned test supervisors and tolerate\n  cleanup races so worker processes exiting late cannot fail the suite\n\n* refactor(coding-agent): drop the descriptor-namespace adoption machinery\n\nNormalization at the entry points prevents namespace forks going forward;\ndescriptors written under an old raw-spelling key are healed per-field on\nload only when they share the directory. Cross-directory adoption kept\naccreting ordering hazards (live-daemon rename races, persisted-config\nstaleness) disproportionate to its value, so a daemon that previously ran\non a non-canonical spelling simply starts fresh namespaces; saved sessions\nare unaffected (they live in the session catalog, not the descriptor dir).\n\n* docs(coding-agent): align the changelog with the simplified scope\n\n* chore(coding-agent): trim excessive comments\n\n* fix(coding-agent): normalize the early-launch socket key and drop an incidental test\n\nmaybeStartDaemonEarly memoized ensure attempts under the raw --daemon-socket\nspelling while main uses the normalized one, so equivalent spellings could\nrun two concurrent spawn attempts for one daemon. The early kick now derives\nthe same canonical spelling (resolving relative paths against --cwd).\n\n* chore(coding-agent): simplify socket normalization coverage\n\n* Address final review feedback\n\n---------\n\nCo-authored-by: Seth <seth@primeintellect.ai>"},{"name":"daemon-stop-confirm.test.ts","kind":"file","size":4397,"lastCommitHash":"941576dbec6d388de6b9f3cb61bce90cce3f55c4","lastCommitWhen":"2026-08-03T09:56:37+02:00","lastCommitMessage":"refactor(coding-agent): publish session action protocol (#575)\n\n* refactor(coding-agent): publish session action protocol\n\n* fix(coding-agent): restore queue projection guards and recovery validation\n\n* fix(coding-agent): repair test migrations for session action snapshots\n\n* correcting when multiple messages are sent, how it's counted\n\n* fix(coding-agent): await update supervisor teardown (fixes #575)\n\n---------\n\nCo-authored-by: Alex Zhang <alex.lx.zhang@gmail.com>"},{"name":"daemon-supervisor-admission.test.ts","kind":"file","size":20806,"lastCommitHash":"d98d0762c0dea0e4d176233c03965dc05a8b33bf","lastCommitWhen":"2026-08-20T10:52:30+02:00","lastCommitMessage":"feat(acp): harden resident session lifecycle (#1494)\n\n* feat(acp): harden resident session lifecycle\n\n* test(daemon): align recovery fixtures with durable context\n\n* fix(acp): validate durable host settings\n\n* fix(daemon): clean up failed resident resources\n\n* fix(daemon): recover owned workers from fresh context\n\n* fix(acp): verify authoritative completion state\n\n* fix(daemon): refresh requested child roster\n\n* fix(acp): read child roster without reattaching\n\n* fix(daemon): preserve telemetry opt-out on recovery\n\n* fix(daemon): scope resident path conflicts\n\n* test(acp): remove runtime publish hook\n\n* fix(acp): drain admitted updates on close\n\n* fix(daemon): merge fresh supervisor defaults\n\n* fix(acp): await autonomous lifecycle settlement\n\n* fix(acp): preserve daemon input fences\n\n* fix(acp): serialize terminal lifecycle turns\n\n* fix(acp): reacquire daemon fences after reconnect\n\n* fix(acp): fail closed across abort cuts\n\n* fix(acp): resume queued input after pause\n\n* fix(acp): invalidate pending pumps on pause\n\n* fix(acp): preserve pause ownership through supervisor\n\n* fix(acp): fail closed on pause cleanup loss\n\n* test(daemon): initialize pause ownership harness\n\n* fix(acp): fence detach pause cleanup\n\n* fix(daemon): preserve detach-all cleanup\n\n* test(daemon): initialize worker pause registry\n\n* fix(daemon): reacquire pauses across release\n\n* fix(daemon): clear stable detach selectors\n\n* fix(daemon): retain detach fences on attach failure\n\n* refactor(daemon): keep descriptor validation private\n\n* docs(changelog): describe ACP lifecycle fencing\n\n* fix(acp): settle restart and failed close lifecycle\n\n* fix(acp): serialize cancel after failed close\n\n* fix(acp): preserve lifecycle reconciliation ordering\n\n* fix(acp): settle deleted child runtimes\n\n* test(acp): consolidate child deletion regressions\n\n* fix(acp): rearm settled child deletion\n\n* fix(acp): preserve recursive terminal settlement\n\n* test(acp): update terminal notice regression"},{"name":"daemon-supervisor-eviction.test.ts","kind":"file","size":16974,"lastCommitHash":"d98d0762c0dea0e4d176233c03965dc05a8b33bf","lastCommitWhen":"2026-08-20T10:52:30+02:00","lastCommitMessage":"feat(acp): harden resident session lifecycle (#1494)\n\n* feat(acp): harden resident session lifecycle\n\n* test(daemon): align recovery fixtures with durable context\n\n* fix(acp): validate durable host settings\n\n* fix(daemon): clean up failed resident resources\n\n* fix(daemon): recover owned workers from fresh context\n\n* fix(acp): verify authoritative completion state\n\n* fix(daemon): refresh requested child roster\n\n* fix(acp): read child roster without reattaching\n\n* fix(daemon): preserve telemetry opt-out on recovery\n\n* fix(daemon): scope resident path conflicts\n\n* test(acp): remove runtime publish hook\n\n* fix(acp): drain admitted updates on close\n\n* fix(daemon): merge fresh supervisor defaults\n\n* fix(acp): await autonomous lifecycle settlement\n\n* fix(acp): preserve daemon input fences\n\n* fix(acp): serialize terminal lifecycle turns\n\n* fix(acp): reacquire daemon fences after reconnect\n\n* fix(acp): fail closed across abort cuts\n\n* fix(acp): resume queued input after pause\n\n* fix(acp): invalidate pending pumps on pause\n\n* fix(acp): preserve pause ownership through supervisor\n\n* fix(acp): fail closed on pause cleanup loss\n\n* test(daemon): initialize pause ownership harness\n\n* fix(acp): fence detach pause cleanup\n\n* fix(daemon): preserve detach-all cleanup\n\n* test(daemon): initialize worker pause registry\n\n* fix(daemon): reacquire pauses across release\n\n* fix(daemon): clear stable detach selectors\n\n* fix(daemon): retain detach fences on attach failure\n\n* refactor(daemon): keep descriptor validation private\n\n* docs(changelog): describe ACP lifecycle fencing\n\n* fix(acp): settle restart and failed close lifecycle\n\n* fix(acp): serialize cancel after failed close\n\n* fix(acp): preserve lifecycle reconciliation ordering\n\n* fix(acp): settle deleted child runtimes\n\n* test(acp): consolidate child deletion regressions\n\n* fix(acp): rearm settled child deletion\n\n* fix(acp): preserve recursive terminal settlement\n\n* test(acp): update terminal notice regression"},{"name":"daemon-supervisor-heartbeats.test.ts","kind":"file","size":6851,"lastCommitHash":"34b294f8318e292d9288ffe5433226c80078248d","lastCommitWhen":"2026-08-21T13:05:23-07:00","lastCommitMessage":"fix(daemon): skip failed workers in heartbeat catalog (#1621)\n\n* fix(daemon): skip failed workers in heartbeat catalog\n\n* Add the changelog fragment"},{"name":"daemon-supervisor-input-pause.test.ts","kind":"file","size":13872,"lastCommitHash":"d98d0762c0dea0e4d176233c03965dc05a8b33bf","lastCommitWhen":"2026-08-20T10:52:30+02:00","lastCommitMessage":"feat(acp): harden resident session lifecycle (#1494)\n\n* feat(acp): harden resident session lifecycle\n\n* test(daemon): align recovery fixtures with durable context\n\n* fix(acp): validate durable host settings\n\n* fix(daemon): clean up failed resident resources\n\n* fix(daemon): recover owned workers from fresh context\n\n* fix(acp): verify authoritative completion state\n\n* fix(daemon): refresh requested child roster\n\n* fix(acp): read child roster without reattaching\n\n* fix(daemon): preserve telemetry opt-out on recovery\n\n* fix(daemon): scope resident path conflicts\n\n* test(acp): remove runtime publish hook\n\n* fix(acp): drain admitted updates on close\n\n* fix(daemon): merge fresh supervisor defaults\n\n* fix(acp): await autonomous lifecycle settlement\n\n* fix(acp): preserve daemon input fences\n\n* fix(acp): serialize terminal lifecycle turns\n\n* fix(acp): reacquire daemon fences after reconnect\n\n* fix(acp): fail closed across abort cuts\n\n* fix(acp): resume queued input after pause\n\n* fix(acp): invalidate pending pumps on pause\n\n* fix(acp): preserve pause ownership through supervisor\n\n* fix(acp): fail closed on pause cleanup loss\n\n* test(daemon): initialize pause ownership harness\n\n* fix(acp): fence detach pause cleanup\n\n* fix(daemon): preserve detach-all cleanup\n\n* test(daemon): initialize worker pause registry\n\n* fix(daemon): reacquire pauses across release\n\n* fix(daemon): clear stable detach selectors\n\n* fix(daemon): retain detach fences on attach failure\n\n* refactor(daemon): keep descriptor validation private\n\n* docs(changelog): describe ACP lifecycle fencing\n\n* fix(acp): settle restart and failed close lifecycle\n\n* fix(acp): serialize cancel after failed close\n\n* fix(acp): preserve lifecycle reconciliation ordering\n\n* fix(acp): settle deleted child runtimes\n\n* test(acp): consolidate child deletion regressions\n\n* fix(acp): rearm settled child deletion\n\n* fix(acp): preserve recursive terminal settlement\n\n* test(acp): update terminal notice regression"},{"name":"daemon-supervisor-lazy-subagents.test.ts","kind":"file","size":30876,"lastCommitHash":"5b6c0e94e11a97fcfdd7a9fc9dc4f7acbda9c853","lastCommitWhen":"2026-08-29T11:34:20+02:00","lastCommitMessage":"fix(coding-agent): enforce session ownership when joining an in-flight open (#1864)\n\n* fix(coding-agent): wait for worker recovery before session reuse\n\n* fix(coding-agent): join overlapping worker starts\n\n* fix(coding-agent): enforce session ownership when joining an in-flight open\n\nJoining an opening worker via openingWorkers returned the pending worker\nto any client with the same session path, bypassing the ownership check\nthat the settled path applies in reuseWorkerForCreate. Await the pending\nopen and apply the shared owner check before returning; a rejected open\nstill propagates its original error to joiners.\n\n* fix(coding-agent): rejoin an open registered during stale-worker reclaim\n\nThe reclaimStaleWorkerRegistration await sits between the pending-open\ncheck and openingWorkers.set, so a concurrent opener registered during\nthat await was overwritten and a second worker launched for the same\nsaved session (regression from the #1756 reordering). Re-check the map\nafter the reclaim await and join through the shared owner-checked path.\n\n* test(coding-agent): cover foreign-owner join at the post-reclaim re-check\n\nAn intruder client joining the open registered during stale-worker\nreclaim must get SessionAlreadyActiveError; kills the mutant that\nreturns the pending promise without the owner check."},{"name":"daemon-supervisor-monitor.test.ts","kind":"file","size":140457,"lastCommitHash":"2afe65a0106d25c6dda17b0bccc2c81dece31b82","lastCommitWhen":"2026-08-31T22:18:35+09:00","lastCommitMessage":"fix(daemon): reclaim dead worker tombstones before updates\n"},{"name":"daemon-supervisor-ownership.test.ts","kind":"file","size":9031,"lastCommitHash":"032e3ee74574ca16efaf8745a1394b821256a5d0","lastCommitWhen":"2026-08-18T12:17:35+02:00","lastCommitMessage":"chore: remove redundant comments and unused internals (#1505)\n\n* chore: remove redundant comments\n\n* chore(tui): remove redundant export comments\n\n* chore(coding-agent): remove redundant example comments\n\n* chore(ai): remove redundant comments\n\n* chore(coding-agent): remove obsolete core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant rpc test comments\n\n* chore(coding-agent): remove redundant CLI comments\n\n* chore(agent): remove redundant comments\n\n* chore(tui): remove redundant source comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(ai): remove redundant source comments\n\n* chore(coding-agent): remove redundant session comments\n\n* chore(coding-agent): remove redundant core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(tests): remove redundant test comments\n\n* chore: remove unused internal helpers\n\n* docs: restore public API contracts\n\n* chore(coding-agent): restore invariant documentation\n\n* chore(coding-agent): clarify agent family contracts\n\n* style(coding-agent): format restored contracts\n\n* fix: restore intentional catch explanations"},{"name":"daemon-supervisor-process.test.ts","kind":"file","size":62919,"lastCommitHash":"d98d0762c0dea0e4d176233c03965dc05a8b33bf","lastCommitWhen":"2026-08-20T10:52:30+02:00","lastCommitMessage":"feat(acp): harden resident session lifecycle (#1494)\n\n* feat(acp): harden resident session lifecycle\n\n* test(daemon): align recovery fixtures with durable context\n\n* fix(acp): validate durable host settings\n\n* fix(daemon): clean up failed resident resources\n\n* fix(daemon): recover owned workers from fresh context\n\n* fix(acp): verify authoritative completion state\n\n* fix(daemon): refresh requested child roster\n\n* fix(acp): read child roster without reattaching\n\n* fix(daemon): preserve telemetry opt-out on recovery\n\n* fix(daemon): scope resident path conflicts\n\n* test(acp): remove runtime publish hook\n\n* fix(acp): drain admitted updates on close\n\n* fix(daemon): merge fresh supervisor defaults\n\n* fix(acp): await autonomous lifecycle settlement\n\n* fix(acp): preserve daemon input fences\n\n* fix(acp): serialize terminal lifecycle turns\n\n* fix(acp): reacquire daemon fences after reconnect\n\n* fix(acp): fail closed across abort cuts\n\n* fix(acp): resume queued input after pause\n\n* fix(acp): invalidate pending pumps on pause\n\n* fix(acp): preserve pause ownership through supervisor\n\n* fix(acp): fail closed on pause cleanup loss\n\n* test(daemon): initialize pause ownership harness\n\n* fix(acp): fence detach pause cleanup\n\n* fix(daemon): preserve detach-all cleanup\n\n* test(daemon): initialize worker pause registry\n\n* fix(daemon): reacquire pauses across release\n\n* fix(daemon): clear stable detach selectors\n\n* fix(daemon): retain detach fences on attach failure\n\n* refactor(daemon): keep descriptor validation private\n\n* docs(changelog): describe ACP lifecycle fencing\n\n* fix(acp): settle restart and failed close lifecycle\n\n* fix(acp): serialize cancel after failed close\n\n* fix(acp): preserve lifecycle reconciliation ordering\n\n* fix(acp): settle deleted child runtimes\n\n* test(acp): consolidate child deletion regressions\n\n* fix(acp): rearm settled child deletion\n\n* fix(acp): preserve recursive terminal settlement\n\n* test(acp): update terminal notice regression"},{"name":"daemon-supervisor-side-question.test.ts","kind":"file","size":6236,"lastCommitHash":"e4a590984f0b16b8db7998d89dc308ac5772bf40","lastCommitWhen":"2026-08-03T12:50:52+02:00","lastCommitMessage":"fix(coding-agent): echo salvaged command id in daemon parse failures (#592)"},{"name":"edit-summary.test.ts","kind":"file","size":5216,"lastCommitHash":"032e3ee74574ca16efaf8745a1394b821256a5d0","lastCommitWhen":"2026-08-18T12:17:35+02:00","lastCommitMessage":"chore: remove redundant comments and unused internals (#1505)\n\n* chore: remove redundant comments\n\n* chore(tui): remove redundant export comments\n\n* chore(coding-agent): remove redundant example comments\n\n* chore(ai): remove redundant comments\n\n* chore(coding-agent): remove obsolete core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant rpc test comments\n\n* chore(coding-agent): remove redundant CLI comments\n\n* chore(agent): remove redundant comments\n\n* chore(tui): remove redundant source comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(ai): remove redundant source comments\n\n* chore(coding-agent): remove redundant session comments\n\n* chore(coding-agent): remove redundant core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(tests): remove redundant test comments\n\n* chore: remove unused internal helpers\n\n* docs: restore public API contracts\n\n* chore(coding-agent): restore invariant documentation\n\n* chore(coding-agent): clarify agent family contracts\n\n* style(coding-agent): format restored contracts\n\n* fix: restore intentional catch explanations"},{"name":"edit-tool-legacy-input.test.ts","kind":"file","size":3948,"lastCommitHash":"64da6f342259690472ad0195d0847ec54709e5a1","lastCommitWhen":"2026-05-11T15:38:11-07:00","lastCommitMessage":"Adjust tool prompt guidance (#25)\n\n* fix(coding-agent): keep edit guidance out of system prompt\n\n* chore: remove agents guidance from prompt fix\n\n* fix(coding-agent): document ipython shell prefixes"},{"name":"edit-tool-no-full-redraw.test.ts","kind":"file","size":7437,"lastCommitHash":"e64fbcbf33c8861db4b3ceb15c3ac9b1971cb824","lastCommitWhen":"2026-08-17T10:21:35+02:00","lastCommitMessage":"Add Ctrl+J to toggle edit diffs independently of tool output (#1388)\n\n* feat(coding-agent): add ctrl+j toggle to expand edit diffs independently of tool output\n\n* feat(coding-agent): make ctrl+j sole owner of edit-diff visibility and hint the summary line\n\n* fix(coding-agent): stop duplicating the ctrl+j hint on collapsed edits\n\nCollapsed built-in edits showed the hint twice: on the edit header and on\nthe summary line. The header hint now renders only when the diff is\nexpanded (where no summary line exists); collapsed rows keep the single\nhint on the summary line.\n\n* fix(coding-agent): keep the ctrl+j hint visible while no summary line renders\n\nGating the header hint on expansion assumed the collapsed summary line\nalways carries the cue, but that summary only mounts once a successful\nresult with a countable diff lands. During the preview-only window and on\nerror rows the diff was expandable with no visible hint.\n\nThe header now keeps the hint whenever the summary line is absent\n(mirroring its mount condition) and yields it once the summary renders,\nso exactly one hint is visible in every state.\n\n* fix(coding-agent): advertise the collapse key on expanded ipython diff headers\n\n* fix(coding-agent): move the expanded-diff collapse hint to the truncated cell header"},{"name":"exec.test.ts","kind":"file","size":1733,"lastCommitHash":"9cc944a8fe31850e7d867fd95b6c715a63f4eecb","lastCommitWhen":"2026-07-22T10:39:23+02:00","lastCommitMessage":"fix(coding-agent): force-kill unresponsive exec children (#458)\n\n* fix exec force-kill fallback cleanup\n\n* test(coding-agent): avoid coupling exec test to timer setup\n\n* docs(coding-agent): document exec cancellation (fixes #458)\n\n---------\n\nCo-authored-by: Kevin Thomas <kevin.jt2007@gmail.com>"},{"name":"export-html-skill-block.test.ts","kind":"file","size":1949,"lastCommitHash":"88619669e2fc3efaf2697742608d0fe500ddba9d","lastCommitWhen":"2026-05-06T18:06:37+02:00","lastCommitMessage":"fix(coding-agent): strip skill wrapper XML from HTML export user messages (#4234)\n\nSkill slash commands store a structural <skill>...</skill> wrapper in raw\nuser messages. The TUI uses parseSkillBlock() to split this into separate\nSkillInvocationMessageComponent and UserMessageComponent siblings, but the\nHTML export renderer passed the full raw text through markdown, causing\nbroken/dangling XML tags to appear in exported HTML.\n\nAdd parseSkillBlock() to the export template and render skill-invocation\nand user-message as separate sibling blocks:\n- Sidebar tree shows skill name + user prompt separately\n- Content area shows a clickable skill-invocation block (collapsed by\n  default, markdown content on expand) followed by the user message\n- Copy-link button preserved on the wrapper element\n- Toggle tools (O key) expands/collapses skill invocations alongside\n  compaction and tool output blocks"},{"name":"export-html-whitespace.test.ts","kind":"file","size":1901,"lastCommitHash":"3e5ad67e0f325d4888f82f9b82966218eb4407f5","lastCommitWhen":"2026-05-07T15:59:42+02:00","lastCommitMessage":"chore: migrate pi packages to earendil works scope\n"},{"name":"export-html-xss.test.ts","kind":"file","size":2652,"lastCommitHash":"032e3ee74574ca16efaf8745a1394b821256a5d0","lastCommitWhen":"2026-08-18T12:17:35+02:00","lastCommitMessage":"chore: remove redundant comments and unused internals (#1505)\n\n* chore: remove redundant comments\n\n* chore(tui): remove redundant export comments\n\n* chore(coding-agent): remove redundant example comments\n\n* chore(ai): remove redundant comments\n\n* chore(coding-agent): remove obsolete core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant rpc test comments\n\n* chore(coding-agent): remove redundant CLI comments\n\n* chore(agent): remove redundant comments\n\n* chore(tui): remove redundant source comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(ai): remove redundant source comments\n\n* chore(coding-agent): remove redundant session comments\n\n* chore(coding-agent): remove redundant core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(tests): remove redundant test comments\n\n* chore: remove unused internal helpers\n\n* docs: restore public API contracts\n\n* chore(coding-agent): restore invariant documentation\n\n* chore(coding-agent): clarify agent family contracts\n\n* style(coding-agent): format restored contracts\n\n* fix: restore intentional catch explanations"},{"name":"extension-selector.test.ts","kind":"file","size":2284,"lastCommitHash":"61eb64748eb077e2a084432db92d101a2a83e146","lastCommitWhen":"2026-08-26T15:24:10-07:00","lastCommitMessage":"Minimal CPython REPL runtime (rlm.repl) (#1685)\n\n* feat(coding-agent): add async-by-default bash() to the kernel runtime\n\n* chore(coding-agent): tighten bash() comments and changelog fragment\n\n* feat(coding-agent): add a standalone CPython REPL runtime speaking JSON lines over stdio\n\n* chore(coding-agent): tighten REPL runtime comments\n\n* feat(coding-agent): run the kernel on the REPL runtime over stdio\n\n* fix(coding-agent): reject pending host requests on kernel teardown\n\nThe runtime now fails pending host_request futures when stdin hits EOF or\na shutdown request arrives, so a cell awaiting a host reply can no longer\nblock _serve from consuming the shutdown and wedge the process. Startup\nand busy-kernel messages plus the ipython tool description now say Python\nkernel, matching the default REPL runtime client.\n\n* chore(coding-agent): describe the kernel-heavy test tag client-neutrally\n\n* feat(coding-agent): make the REPL runtime the only kernel\n\nRemoves the Jupyter/ipykernel/ZMQ kernel client, the fork server, the\nPRIME_AGENT_KERNEL escape hatch, and the %%bash/%cd/%env cell rewriting.\nMagic-style cells (%/%%/!) return a one-line error naming the Python or\nbash() replacement. The kernel venv no longer installs ipykernel;\nexisting venvs are rebuilt once via the bootstrap schema bump. Old\nsnapshot artifacts still restore through the runtime's pickle compat.\n\n* fix(coding-agent): close MCP transports in REPL shutdown\n\n* fix(coding-agent): address bash() review findings — exact tail retention, foreground-status lifecycle with group anchoring, post-kill forkserver reap, Windows start-id parity, executor-free await\n\n* fix(coding-agent): tree-kill bash() process trees on Windows and make running reflect group liveness\n\n* fix(runtime): address repl runtime review findings\n\n- revalidate targeted interrupts through SIGINT delivery so a stale signal\n  cannot cancel a later request\n- preserve a parked untargeted interrupt while another request is inflight\n- reject non-string interrupt ids and validate snapshot options\n  (prune_oversized bool, max_bytes/max_variable_bytes present => int)\n- guard str(exc) in error/skip/fail reasons so a broken __str__ cannot\n  kill the runtime\n- fail the snapshot when the manifest write fails (before any pruning)\n- report 'snapshot not found' reason on restore of a missing path\n- wait unbounded for the output-pump drain marker so done never precedes\n  captured output and marker bytes never leak\n- document that aggregate-cap skips are not pruned\n\n* fix(coding-agent): carry bash() status pipe as stdin so strict-POSIX shells accept single-digit fd redirections\n\n* fix(coding-agent): address host-swap review findings — runtime-neutral kernel wording, %cd/%env rewrite fidelity, linear-time magic regexes, restart supersession guard\n\n* fix(coding-agent): reject stale column-0 line magics on any cell line, not just the first\n\n* fix(coding-agent): close status fds when wake-pipe creation fails and gate bash() commands on orphan-journal registration\n\n* fix(coding-agent): strip quoted %cd targets, use UTF-16-safe %env parsing, and expand $var/${var} values PEP-215-style\n\n* fix(coding-agent): fail rlm.run fast outside a live kernel so vitest workers cannot hang on a comm that never replies\n\n* fix(coding-agent): clear the active cell id before terminal events so late background output is never tagged with a finished cell\n\n* fix(coding-agent): update legacy IPython-era tests to assert cutover behavior\n\n* fix(coding-agent): describe the column-0 magic scan without referencing the removed rewrite backend\n\n* fix(coding-agent): consume parked interrupts on compile failures and survive user-closed stdio in the drain path\n\n* fix(coding-agent): redact bare %env listings, prefer '=' in %env parsing, echo %cd targets, and keep graceful shutdowns owning their cleanup\n\n* fix(coding-agent): reject kernel startup promptly on spawn errors and commit %cd previous-dir tracking only after chdir succeeds\n\n* fix(coding-agent): trim ParsedIpythonBashCell to the body field its callers use\n\n* fix(coding-agent): kill full process trees in the Windows orphan reaper via taskkill /T\n\n* fix(coding-agent): survive compile-phase crashes and fd-reuse drain hangs in the REPL runtime\n\n* fix(coding-agent): shield snapshot prune deletions from interrupts and pin the host comm probe to its real seam\n\n* fix(coding-agent): route list_names through the per-request backstop and skip non-string namespace keys\n\n* fix(coding-agent): reject snapshot requests whose manifest path aliases the payload path\n\n* fix(coding-agent): reject negative snapshot size caps that would prune every user variable\n\n* fix(coding-agent): kill one-shot await bash() on cancel, resolve Windows helpers via System32, retry taskkill after reap, and fail closed on orphan-journal enrollment\n\n* fix(coding-agent): attribute REPL stream output at write time so raw fd and user-thread bytes never carry another cell's id\n\n* fix(coding-agent): surface unattributed REPL stream output as separate background output instead of dropping or merging it\n\n* fix(coding-agent): confirm group exit before a cancelled one-shot bash() await propagates and complete-write orphan-journal records\n\n* fix(coding-agent): expose a working sys.stdout.buffer on the tagged REPL writer routing bytes through the null-attributed raw channel\n\n* fix(coding-agent): mark between-cell background output truncated when the pending buffer cap is hit\n\n* fix(coding-agent): shield the cancelled-await bash() confirm-exit from re-cancellation, fail clearly without bash on Windows, and fence slow pumps out of result assembly\n\n* fix(coding-agent): survive hostile protocol lines in the REPL reader thread and interrupt without pthread_kill on Windows\n\n* fix(coding-agent): send the protocol shutdown from dispose() so the runtime closes MCP servers and kills live bash groups before the hard kill\n\n* fix(coding-agent): flag the pump's read-to-commit window so the bash() drain fence cannot miss an in-flight chunk\n\n* fix(coding-agent): guard the whole REPL request line against hostile input, reject duplicate in-flight ids, complete short buffer-pipe writes, and clean the snapshot temp file on KeyboardInterrupt\n\n* fix(coding-agent): drop stale between-cell background output on kernel teardown so it cannot surface after a restart\n\n* fix(coding-agent): assert the tagged channel only in the large buffer-write REPL test since cross-channel ordering is not guaranteed\n\n* fix(coding-agent): resolve taskkill via absolute System32 path in the host orphan reaper\n\n* fix(coding-agent): write the inactive orphan-journal record only after a delivered kill so undelivered signals leave the host reaper in charge\n\n* fix(coding-agent): keep a REPL request interrupt-targetable through its trailing-expression repr and output drain until done is emitted\n\n* fix(coding-agent): count an already-exited leader as delivered in the Windows bash() reap so clean exits still journal inactive\n\n* fix(coding-agent): reject NaN and Infinity in emit() payloads before they corrupt REPL protocol framing\n\n* chore(coding-agent): correct the stale ipykernel requirement on the python override doc\n\n* chore(coding-agent): drop migration-era wording from kernel comments\n\n* fix(coding-agent): resolve trusted absolute shell host-side and close Windows journal/reap gaps\n\n* fix(coding-agent): best-effort-kill pid-only orphan records in daemon force-stop and recovery reaps\n\n* refactor(coding-agent): drop the magic-cell rejection gate\n\n%-prefixed and !-prefixed cells now reach CPython and fail with its own\nSyntaxError, which names the offending line. The rejection layer guarded\nagainst model-produced IPython syntax, but with the shipped prompt fresh\nsessions do not produce it, and the plain SyntaxError is protection enough.\nparseIpythonBashCell stays: transcripts from ipykernel-era sessions render\n%%bash cells with shell highlighting forever.\n\n* fix(coding-agent): report a committed destructive snapshot as success even when an interrupt was parked\n\n* chore(ai): drop stray live-regen drift in models.generated.ts\n\nad657d7ec accidentally committed generate-models output produced by a local\nbuild; the catalog belongs to its own regen PRs.\n\n* test(coding-agent): expect a plain SyntaxError for legacy %%bash cells after the magic-rejection gate removal\n\n* fix(coding-agent): consume a finishing-targeted interrupt after a completed state request instead of failing the done\n\n* fix(coding-agent): exit the REPL runtime when its owner dies even during a busy cell\n\n* fix(coding-agent): resolve the kernel bash shell only from trusted absolute paths on Windows\n\n* fix(coding-agent): contain Windows bash children with kill-on-close job objects\n\n* test(coding-agent): cover owner death during a non-yielding REPL cell\n\n* fix(coding-agent): skip concurrently deleted names during snapshot instead of aborting\n\n* fix(coding-agent): fall back to taskkill when job termination fails\n\n* fix(coding-agent): stop telling REPL-default users they need ipykernel\n\n* fix(coding-agent): clear the SIGINT target when its request finishes\n\n* test(coding-agent): drop migration-era wording from the %%bash rejection comment\n\n* fix(coding-agent): start Windows bash children suspended and fail closed when job containment cannot be established\n\n* fix(coding-agent): re-assert the kernel SIGINT handler between cells so a cell rebinding SIGINT cannot break interrupts\n\n* fix(coding-agent): kill the whole tree for enriched orphan records on Windows force-stop\n\nstopTrackedProcess signals only the shell pid on Windows; use killOrphanProcess (taskkill /T) after the identity check, matching the owned-session-worker and daemon-supervisor reapers.\n\n* docs(coding-agent): describe current magic-cell behavior in release notes\n\nMagic-style cells fail with a plain SyntaxError; the migration error and %cd/%env rewrites were removed, so the notes stop claiming them.\n\n* fix(coding-agent): skip the liveness check when the orphan identity is stale\n\nA reused pid looked like a failed kill after the identity re-check skipped taskkill, blocking worker cleanup with a spurious failure.\n\n* fix(coding-agent): journal Windows bash() children before job assignment so a kernel kill mid-spawn cannot leak an unjournaled suspended process\n\n* fix(coding-agent): pre-create the Windows bash() job before spawn and contain the child before the journal start-id query\n\n* fix(coding-agent): create Windows bash() children atomically inside the kill-on-close job via PROC_THREAD_ATTRIBUTE_JOB_LIST, closing the Popen-to-assignment leak window\n\n* chore(coding-agent): compress the atomic-job-association comments to one-line rationale\n\n* fix(coding-agent): send duplicate-id protocol errors outside the interrupt lock and reject int payloads in the captured stdout buffer\n\n* docs(coding-agent): update the kernel provisioner docstring for the REPL/IPython split\n\n* fix(coding-agent): retain the Windows bash() process handle through job cleanup and taskkill fallbacks so a recycled pid can never be killed\n\n* fix(coding-agent): serialize Windows bash() abort cleanup under the kill lock so shutdown taskkill can never race the process-handle close\n\n* fix(coding-agent): commit REPL snapshot payload and manifest atomically via unique temp files with guaranteed cleanup and parked-SIGINT restore\n\n* fix(coding-agent): stage REPL restore before an interrupt-parked apply and recover committed snapshot/restore results from protocol interrupts so a committed operation is never misreported as failed\n\n* chore(coding-agent): compress restore-shield rationale comments to one line each\n\n* fix(coding-agent): surface unattributed background output in IPython cell details and render it after the traceback in the expanded cell view\n\n* docs(coding-agent): replace stale Jupyter comm vocabulary in rlm-runtime failure modes and focused validation with stdio-transport equivalents\n\n* docs(coding-agent): describe the REPL trust boundary and runtime-bootstrap failure in stdio terms and drop the removed TokenUsage export\n\n* fix(runtime): address REPL review findings\n\n* fix(runtime): preserve near-cap snapshots\n\n---------\n\nCo-authored-by: Seth <seth@primeintellect.ai>"},{"name":"extension-tool-wrapper-rebind.test.ts","kind":"file","size":2202,"lastCommitHash":"032e3ee74574ca16efaf8745a1394b821256a5d0","lastCommitWhen":"2026-08-18T12:17:35+02:00","lastCommitMessage":"chore: remove redundant comments and unused internals (#1505)\n\n* chore: remove redundant comments\n\n* chore(tui): remove redundant export comments\n\n* chore(coding-agent): remove redundant example comments\n\n* chore(ai): remove redundant comments\n\n* chore(coding-agent): remove obsolete core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant rpc test comments\n\n* chore(coding-agent): remove redundant CLI comments\n\n* chore(agent): remove redundant comments\n\n* chore(tui): remove redundant source comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(ai): remove redundant source comments\n\n* chore(coding-agent): remove redundant session comments\n\n* chore(coding-agent): remove redundant core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(tests): remove redundant test comments\n\n* chore: remove unused internal helpers\n\n* docs: restore public API contracts\n\n* chore(coding-agent): restore invariant documentation\n\n* chore(coding-agent): clarify agent family contracts\n\n* style(coding-agent): format restored contracts\n\n* fix: restore intentional catch explanations"},{"name":"extensions-discovery.test.ts","kind":"file","size":15597,"lastCommitHash":"032e3ee74574ca16efaf8745a1394b821256a5d0","lastCommitWhen":"2026-08-18T12:17:35+02:00","lastCommitMessage":"chore: remove redundant comments and unused internals (#1505)\n\n* chore: remove redundant comments\n\n* chore(tui): remove redundant export comments\n\n* chore(coding-agent): remove redundant example comments\n\n* chore(ai): remove redundant comments\n\n* chore(coding-agent): remove obsolete core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant rpc test comments\n\n* chore(coding-agent): remove redundant CLI comments\n\n* chore(agent): remove redundant comments\n\n* chore(tui): remove redundant source comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(ai): remove redundant source comments\n\n* chore(coding-agent): remove redundant session comments\n\n* chore(coding-agent): remove redundant core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(tests): remove redundant test comments\n\n* chore: remove unused internal helpers\n\n* docs: restore public API contracts\n\n* chore(coding-agent): restore invariant documentation\n\n* chore(coding-agent): clarify agent family contracts\n\n* style(coding-agent): format restored contracts\n\n* fix: restore intentional catch explanations"},{"name":"extensions-input-event.test.ts","kind":"file","size":4935,"lastCommitHash":"032e3ee74574ca16efaf8745a1394b821256a5d0","lastCommitWhen":"2026-08-18T12:17:35+02:00","lastCommitMessage":"chore: remove redundant comments and unused internals (#1505)\n\n* chore: remove redundant comments\n\n* chore(tui): remove redundant export comments\n\n* chore(coding-agent): remove redundant example comments\n\n* chore(ai): remove redundant comments\n\n* chore(coding-agent): remove obsolete core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant rpc test comments\n\n* chore(coding-agent): remove redundant CLI comments\n\n* chore(agent): remove redundant comments\n\n* chore(tui): remove redundant source comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(ai): remove redundant source comments\n\n* chore(coding-agent): remove redundant session comments\n\n* chore(coding-agent): remove redundant core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(tests): remove redundant test comments\n\n* chore: remove unused internal helpers\n\n* docs: restore public API contracts\n\n* chore(coding-agent): restore invariant documentation\n\n* chore(coding-agent): clarify agent family contracts\n\n* style(coding-agent): format restored contracts\n\n* fix: restore intentional catch explanations"},{"name":"extensions-runner.test.ts","kind":"file","size":28763,"lastCommitHash":"cba2a919a7a9408c2811a77dcfd756cca110dc6a","lastCommitWhen":"2026-08-05T04:46:53+02:00","lastCommitMessage":"feat(coding-agent): narrow agent reach to the nuclear family (#597)\n\n* feat(coding-agent): narrow agent reach to the nuclear family\n\nImplement nuclear-family authorization for agent-origin messaging and observation, keep roots connected as virtual siblings, scope broadcasts and discovery to the family roster, and synchronize only root peers between workers.\n\nTrack B PR 3 of the recursive-agent-harness plan (PR 10 in the plan table)\n\n* fix(coding-agent): family-edge id fallback, canonical paths, broadcast receipts\n\nFinding 1: fall back to persisted parentSessionId when sibling path edges are mixed, with focused policy coverage.\n\nFinding 2: document the accepted hydrate-before-authorize follow-up at observe and send resolution.\n\nFinding 3: canonicalize worker family paths with the shared realpath-based helper and cover symlink aliases.\n\nFinding 4: settle every family broadcast delivery, preserving successful receipts and returning target/error entries for failures; teach the kernel skill to emit each successful receipt.\n\nFinding 5: document agent-observe's current same-worker visibility limit.\n\nFinding 6: document the accepted direct-socket trust boundary for agentOrigin without a source session.\n\n* fix(coding-agent): harden sibling-name uniqueness, roster context, and rename plumbing\n\n- reject inactive root and mixed-depth sibling name collisions (origin: PR #595)\n- reserve worker opens and daemon renames across asynchronous validation (origin: PR #595)\n- discover orphaned running children and report RLM heartbeat activity (origin: PR #595)\n- scope catalogs to callers and persisted parent headers (origin: PR #595)\n- propagate extension rename promises and clean failed runtime opens (origin: PR #595)\n\n* fix(coding-agent): surface child failures, gate a2a doctrine, close errored children, unhang reach rejections\n\n- sanitize family relationship labels for parse-safe queue clearing (origin: PR #596)\n- gate a2a and observation doctrine on installed Python skills (origin: PR #596)\n- release failed or cancelled daemon children to close zombie sessions (origin: PR #596)\n- inject child failure notices and retain errored registry entries (origin: PR #596)\n- isolate post-send roster bookkeeping failures from delivery receipts (origin: PR #596)\n- reset replied state on accepted or queued parent follow-ups (origin: PR #596)\n- fail family-reach rejections without remote retry delay (origin: PR #597)\n\n* fix(coding-agent): passive child status fidelity, scoped name reservations, authorize before hydration\n\nFinding 101 (PR #597): map retained running registry rows to error in passive child snapshots.\n\nFinding 102 (PR #596): scope concurrent name reservations by depth and parent identity.\n\nFinding 103 (PR #597): authorize passive send and observe targets from persisted family metadata before hydration.\n\nCI hardening (PR #595): expose the supervisor message response when the sibling-delivery assertion fails.\n\n* test(coding-agent): make sibling delivery process test keyless\n\nCI ran this process test without provider credentials, so delivering to the idle target synchronously started its turn and propagated model-auth preflight failure through the worker receipt. This is existing main behavior for both cross-worker and intra-worker sends, not coupling introduced by the family-reach stack.\n\nKeep genuine cross-worker routing and agent-origin family authorization coverage, but hold the target busy with the process suite's existing blocking-bash fixture. The message is then admitted through the established queued path without requiring a model, and the assertion now verifies that queued receipt.\n\n* fix(coding-agent): surface nonresident child outcomes in rlm.list_subagents\n\nCarry passive registry outcomes through daemon agent summaries and map noncompleted nonresident children to errors while preserving completed results.\n\nAdd deterministic coverage for running and completed passive children.\n\nOrigin: PR #597 review\n\n* refactor(coding-agent): drop agent_message compat surfaces\n\nlist_agents subsumes roster; positional send removed except the all broadcast; origin: user decision on PR #595-#597 migration shims\n\n* fix(coding-agent): header-parent family edges, canonical catalog paths, broadcast guard, passive children in observe list\n\nOrigin: PR #597 review round 4 + agent-observe discovery report.\n\n* fix(coding-agent): session-relative header parents, unified relationship labeling, ipython-gated reply doctrine\n\nResolve persisted relative parentSession headers against the child session file for family reach and both name-reservation paths. Reuse the family catalog relationship logic when labeling messages so reopened children retain parent/child attribution.\n\nThe reply-doctrine gate belongs conceptually in #596 (where the doctrine originated), but lands here at the current stack head because the same line is present and this verification round targets e5a69d644.\n\n* fix(coding-agent): compute fromRelationship from the recipient's perspective\n\n* fix(coding-agent): serialize family names and child teardown\n\n- Reserve sibling-scoped names in the supervisor for creates and renames.\n- Persist cancelled hosted-child deletion before runtime teardown.\n- Reject parentless deep sessions as nuclear-family siblings.\n- Retain errored startup deletion tombstones until failure handling settles.\n\n* fix(coding-agent): harden family naming authorization\n\n- Prefer persisted header parents over stale runtime spawn metadata for family authorization.\n- Encode supervisor name reservation scopes structurally to prevent key collisions.\n- Hold active saved-session rename reservations through worker completion.\n\n* fix(coding-agent): secure worker renames and child cleanup\n\n- Authenticate worker-originated session renames against the resident worker token while preserving client ownership isolation.\\n- Fully remove settled errored child runs and hide detached deletions from listings and name reservations.\n\n* fix(coding-agent): share the structural name-reservation key; never strand cancelled children\n\nThe worker-side sessionNameReservationKey still colon-joined its parts\nwhile the supervisor had moved to structural JSON encoding, so parent\npaths or names containing colons could collide into one reservation key\nand spuriously block concurrent renames in a worker. Both sides now use\none shared structural encoder in core/agent-messages.\n\nreleaseRlmSubagentRuntime recorded the cancellation deletion boundary\nbefore locating the child session; a registry failure there returned\nearly and left the cancelled child resident and listed while the caller\ndisposed its runtime. The deletion error is now deferred until after the\nsession is closed or the runtime disposed.\n\n* fix(coding-agent): disambiguate family targets by reach\n\nObserving or messaging a family member by roster name failed with an\nambiguity error when an unrelated agent shared the name, because global\nresolution threw before the reach check. Ambiguous name matches are now\nre-filtered by family reachability and resolve when exactly one\nreachable candidate remains.\n\n* fix(coding-agent): normalize depth-zero family scope\n\n- Ignore fork lineage when building depth-zero family catalog entries so roots remain sibling-reachable.\n- Collapse depth-zero name reservations to root scope and omit parent identity from rename reservations.\n\n* fix(coding-agent): preserve family target identity\n\n- Preserve legacy parent edges when RLM depth is unknown.\n- Resolve reachable ambiguities across both session IDs and names.\n- Reserve deleted child names until startup settles and skip cancelled publication.\n\n* fix(coding-agent): notify parents of terminal child runs\n\n- Inject a host cancellation notice while keeping explicit deletion silent.\n- Inject a completed-without-reply notice with the child's last assistant preview.\n- Suppress terminal notices after an explicit child-to-parent reply.\n- Render child terminal notices as injected prompt panels.\n\n* fix(coding-agent): preserve child reply completion state\n\n- Track successful child-to-parent replies monotonically for each child run.\n- Suppress false no-reply notices when a later parent message resets latest-task reply state.\n- Add regression coverage for reply-then-parent-follow-up completion.\n\n* fix(coding-agent): let terminal child sends reach roster\n\n- Ignore retained failed child runs when resolving pending child publications.\n- Fall through delete-before-startup tombstones to normal roster resolution.\n- Cover healthy roster shadowing and missing-child tombstone regressions.\n\n* fix(coding-agent): preserve completed child message bridge\n\n- Allow completed runs to bridge RLM child IDs to published session IDs during terminal injection.\n- Keep failed, cancelled, and detached-deletion runs excluded from publication bridging.\n- Cover ID-addressed delivery while completion-message injection is blocked."},{"name":"file-lines.test.ts","kind":"file","size":2197,"lastCommitHash":"213fc0d441ec0c4c39091e1dae17d3046c77d2a7","lastCommitWhen":"2026-08-02T12:00:33+02:00","lastCommitMessage":"fix(coding-agent): bound large session load memory (#549)\n\n* fix(coding-agent): reap deleted subagent runtimes on compaction\n\n* docs(coding-agent): guide completed subagent cleanup\n\n* fix(coding-agent): bound large session load memory\n\n---------\n\nCo-authored-by: Sebastian <sebastian@primeintellect.ai>"},{"name":"file-mutation-queue.test.ts","kind":"file","size":3634,"lastCommitHash":"4a7a55c9a1f053f0bc3500066c6a65b2d0ea4636","lastCommitWhen":"2026-05-08T15:34:55-07:00","lastCommitMessage":"make ipython default and remove legacy tools (#3)\n\n* chore: strip legacy tools\n\n* docs: remove stale read tool references"},{"name":"fire-and-forget-protocol.test.ts","kind":"file","size":2301,"lastCommitHash":"e714b3a61a900338ecb28681336dda800ffff0b8","lastCommitWhen":"2026-08-05T17:46:39+02:00","lastCommitMessage":"refactor(coding-agent): make agent messages steer-only (#631)"},{"name":"footer-data-provider.test.ts","kind":"file","size":8363,"lastCommitHash":"f3a2c9d05e5b4e7921347da2fbf0c807aff92fb3","lastCommitWhen":"2026-04-22T23:03:19+02:00","lastCommitMessage":"fix(coding-agent,mom): retry fs watchers on async errors closes #3564\n"},{"name":"footer-width.test.ts","kind":"file","size":1380,"lastCommitHash":"891b99800bdd40d53c8f67bbae03acc55262e585","lastCommitWhen":"2026-06-09T21:11:57-07:00","lastCommitMessage":"decouple interactive mode from agent runtime (#79)\n\n* decouple interactive mode from agent runtime\n\n* add rich tui attach for daemon sessions\n\n* clarify agent connection boundary\n\n* document agent connection architecture\n\n* fix daemon interactive session replacement\n\n* refresh transcript after session replacement\n\n* fix daemon session attach edge cases\n\n* fix remaining daemon tui review findings\n\n* fix daemon tui review regressions\n\n* fix daemon tui cancellation gaps\n\n* fix daemon attach by session file\n\n* fix daemon extension ui client routing\n\n* fix daemon close ui cancellation order\n\n* fix daemon active session lookup startup\n"},{"name":"frontmatter.test.ts","kind":"file","size":2502,"lastCommitHash":"ce7e73b5037278ea81ed755d75f4247e09f71497","lastCommitWhen":"2026-01-16T00:31:53+01:00","lastCommitMessage":"Centralize frontmatter parsing + parse frontmatter with yaml library (#728)\n\n* Add frontmatter utility and tidy coding agent prompts\n\n* Add frontmatter parsing utilities and tests\n\n* Parse frontmatter with YAML parser\n\n* Simplify frontmatter parsing utilities\n\n* strip body in 1 place\n\n* Improve frontmatter parsing error handling\n\n* Normalize multiline skill and select-list descriptions"},{"name":"fullscreen-mode.test.ts","kind":"file","size":3069,"lastCommitHash":"fd789e21e105b120288b67ffc657b24a019e4bcc","lastCommitWhen":"2026-08-14T10:19:30+02:00","lastCommitMessage":"fix(coding-agent): restore Ghostty fullscreen mouse capture (#1385)"},{"name":"git-context.test.ts","kind":"file","size":2764,"lastCommitHash":"728ebde01f524379062073e376b1068021d40b9d","lastCommitWhen":"2026-06-21T14:46:38-07:00","lastCommitMessage":"store git commit, ref, and repo url in session traces (#208)\n\n* store git commit, ref, and repo url in session traces\n\n* read git state via git commands instead of parsing .git\n\n* make git dedup branch-aware and trace headers reflect latest commit\n\n* make trace git headers branch-aware\n\n* capture git context in forked session headers\n\n* trim redundant comments on git-context code\n\n* capture git context when forking a session file\n\n* drop source git_state entries when forking a session\n\n* trim git-context code comments to essentials\n\n* capture git state at end of turn to catch mid-run commits"},{"name":"git-ssh-url.test.ts","kind":"file","size":2036,"lastCommitHash":"5b280898a02a43f6d0024fd4503e30c925fc52c6","lastCommitWhen":"2026-07-17T14:24:38-07:00","lastCommitMessage":"test: remove redundant lower-level coverage (#439)"},{"name":"git-update.test.ts","kind":"file","size":13864,"lastCommitHash":"032e3ee74574ca16efaf8745a1394b821256a5d0","lastCommitWhen":"2026-08-18T12:17:35+02:00","lastCommitMessage":"chore: remove redundant comments and unused internals (#1505)\n\n* chore: remove redundant comments\n\n* chore(tui): remove redundant export comments\n\n* chore(coding-agent): remove redundant example comments\n\n* chore(ai): remove redundant comments\n\n* chore(coding-agent): remove obsolete core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant rpc test comments\n\n* chore(coding-agent): remove redundant CLI comments\n\n* chore(agent): remove redundant comments\n\n* chore(tui): remove redundant source comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(ai): remove redundant source comments\n\n* chore(coding-agent): remove redundant session comments\n\n* chore(coding-agent): remove redundant core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(tests): remove redundant test comments\n\n* chore: remove unused internal helpers\n\n* docs: restore public API contracts\n\n* chore(coding-agent): restore invariant documentation\n\n* chore(coding-agent): clarify agent family contracts\n\n* style(coding-agent): format restored contracts\n\n* fix: restore intentional catch explanations"},{"name":"goal-continuation-quiescence.test.ts","kind":"file","size":5055,"lastCommitHash":"e51d2266c8e444263575f2db1ac5b00b731d7556","lastCommitWhen":"2026-08-21T09:55:11-07:00","lastCommitMessage":"fix(coding-agent): hold goal continuations while subagent work is unsettled (#1610)\n\n* Hold goal continuations while subagent work is unsettled\n\nThe harness teaches models to delegate and end their turn, but the goal\ncontinuation hook re-prompted the parent the instant it went idle,\npunishing correct waiting with a full-context call per turn (#1598).\nThe hook now defers while _hasUnsettledRlmQuiescenceWork() reports\noutstanding descendant work and resumes via the existing goal-context\nadmission once the last run settles.\n\n* Add the changelog fragment and the continuation-quiescence unit suite\n\n* Make the continuation resume wake, retry, and queue in order\n\nReview round: the resume went through _runOrQueueGoalContext, which\nadmits with wake:false (an idle parent never woke), front:true (the\ncontinuation jumped ahead of the settling child's terminal notice), and\nthe deferral flag was cleared before an admit that throws under an\nadmission pause (goal stranded idle). The helper now admits directly\nwithout front and with the wake enabled, keeps the deferral until the\nadmit succeeds, early-returns while admission is paused, and the pause\nrelease retries it.\n\n* Respect abort suspension and goal replacement in the resume\n\nReview round two: the resume admit could clear the post-abort pump\nsuspension via its immediate wake, starting a goal turn right after the\nuser aborted — it now holds the deferral while the pump is suspended\nand resumeQueuedWork retries it. A deferral no longer leaks onto a\nreplacement goal: _clearQueuedGoalContexts and _startGoal drop it.\n\n* Count resumed continuations\n\nReview: the resumed continuation skipped the continuationsUsed\nincrement, so resumed cycles reported a stale count. The resume now\nmirrors the hook, rolling the state back when admission throws so the\nretry re-counts."},{"name":"heartbeat-catalog.test.ts","kind":"file","size":1348,"lastCommitHash":"941576dbec6d388de6b9f3cb61bce90cce3f55c4","lastCommitWhen":"2026-08-03T09:56:37+02:00","lastCommitMessage":"refactor(coding-agent): publish session action protocol (#575)\n\n* refactor(coding-agent): publish session action protocol\n\n* fix(coding-agent): restore queue projection guards and recovery validation\n\n* fix(coding-agent): repair test migrations for session action snapshots\n\n* correcting when multiple messages are sent, how it's counted\n\n* fix(coding-agent): await update supervisor teardown (fixes #575)\n\n---------\n\nCo-authored-by: Alex Zhang <alex.lx.zhang@gmail.com>"},{"name":"heartbeat-manager.test.ts","kind":"file","size":5911,"lastCommitHash":"85c236d5fc5b0255addaa74026fbcfbf3e490b19","lastCommitWhen":"2026-08-29T10:54:05+02:00","lastCommitMessage":"refactor(coding-agent): derive scoped heartbeats at render time (#1857)\n\n* refactor(coding-agent): derive scoped heartbeats at render time\n\n* fix(coding-agent): keep the earliest heartbeat manager refresh deadline\n\nscheduleHeartbeatManagerRefresh now runs on every subagent snapshot\nupdate, and each call cleared and re-armed the refresh timer. An overdue\nheartbeat uses a relative 5s fallback delay, so children updating more\noften than every 5s postponed the open manager's refresh indefinitely.\nTrack the scheduled deadline and keep the pending timer unless the newly\nderived deadline is earlier.\n\n* test(coding-agent): cover re-arming the heartbeat refresh to an earlier deadline\n\nThe keep-timer-always mutant (returning whenever a timer is armed)\nsurvived the touched suites: nothing proved a sooner heartbeat pulls the\npending refresh forward past the capped 60s poll."},{"name":"herdr-agent-state.test.ts","kind":"file","size":18697,"lastCommitHash":"032e3ee74574ca16efaf8745a1394b821256a5d0","lastCommitWhen":"2026-08-18T12:17:35+02:00","lastCommitMessage":"chore: remove redundant comments and unused internals (#1505)\n\n* chore: remove redundant comments\n\n* chore(tui): remove redundant export comments\n\n* chore(coding-agent): remove redundant example comments\n\n* chore(ai): remove redundant comments\n\n* chore(coding-agent): remove obsolete core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant rpc test comments\n\n* chore(coding-agent): remove redundant CLI comments\n\n* chore(agent): remove redundant comments\n\n* chore(tui): remove redundant source comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(ai): remove redundant source comments\n\n* chore(coding-agent): remove redundant session comments\n\n* chore(coding-agent): remove redundant core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(tests): remove redundant test comments\n\n* chore: remove unused internal helpers\n\n* docs: restore public API contracts\n\n* chore(coding-agent): restore invariant documentation\n\n* chore(coding-agent): clarify agent family contracts\n\n* style(coding-agent): format restored contracts\n\n* fix: restore intentional catch explanations"},{"name":"image-markers.test.ts","kind":"file","size":3206,"lastCommitHash":"032e3ee74574ca16efaf8745a1394b821256a5d0","lastCommitWhen":"2026-08-18T12:17:35+02:00","lastCommitMessage":"chore: remove redundant comments and unused internals (#1505)\n\n* chore: remove redundant comments\n\n* chore(tui): remove redundant export comments\n\n* chore(coding-agent): remove redundant example comments\n\n* chore(ai): remove redundant comments\n\n* chore(coding-agent): remove obsolete core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant rpc test comments\n\n* chore(coding-agent): remove redundant CLI comments\n\n* chore(agent): remove redundant comments\n\n* chore(tui): remove redundant source comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(ai): remove redundant source comments\n\n* chore(coding-agent): remove redundant session comments\n\n* chore(coding-agent): remove redundant core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(tests): remove redundant test comments\n\n* chore: remove unused internal helpers\n\n* docs: restore public API contracts\n\n* chore(coding-agent): restore invariant documentation\n\n* chore(coding-agent): clarify agent family contracts\n\n* style(coding-agent): format restored contracts\n\n* fix: restore intentional catch explanations"},{"name":"image-processing.test.ts","kind":"file","size":7071,"lastCommitHash":"032e3ee74574ca16efaf8745a1394b821256a5d0","lastCommitWhen":"2026-08-18T12:17:35+02:00","lastCommitMessage":"chore: remove redundant comments and unused internals (#1505)\n\n* chore: remove redundant comments\n\n* chore(tui): remove redundant export comments\n\n* chore(coding-agent): remove redundant example comments\n\n* chore(ai): remove redundant comments\n\n* chore(coding-agent): remove obsolete core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant rpc test comments\n\n* chore(coding-agent): remove redundant CLI comments\n\n* chore(agent): remove redundant comments\n\n* chore(tui): remove redundant source comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(ai): remove redundant source comments\n\n* chore(coding-agent): remove redundant session comments\n\n* chore(coding-agent): remove redundant core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(tests): remove redundant test comments\n\n* chore: remove unused internal helpers\n\n* docs: restore public API contracts\n\n* chore(coding-agent): restore invariant documentation\n\n* chore(coding-agent): clarify agent family contracts\n\n* style(coding-agent): format restored contracts\n\n* fix: restore intentional catch explanations"},{"name":"image-resize-callers.test.ts","kind":"file","size":1328,"lastCommitHash":"4a7a55c9a1f053f0bc3500066c6a65b2d0ea4636","lastCommitWhen":"2026-05-08T15:34:55-07:00","lastCommitMessage":"make ipython default and remove legacy tools (#3)\n\n* chore: strip legacy tools\n\n* docs: remove stale read tool references"},{"name":"initial-message.test.ts","kind":"file","size":1414,"lastCommitHash":"9f9277ccdd2f652be5608c27e2f19f6b93ab980e","lastCommitWhen":"2026-04-03T20:14:12+02:00","lastCommitMessage":"refactor(coding-agent): replace AgentSessionRuntimeHost with closure-based AgentSessionRuntime\n\n- Replace AgentSessionRuntimeHost and bootstrap abstractions with AgentSessionRuntime\n- Runtime creation is now closure-based via CreateAgentSessionRuntimeFactory\n- Factory closes over process-global fixed inputs, recreates cwd-bound services per effective cwd\n- Session config (model, thinking, tools, scoped models) re-resolved per target cwd\n- CLI resource paths resolved once at startup as absolute paths\n- Swap lifecycle: teardown old, create next, apply next (hard fail on creation error)\n- Unified diagnostics model (info/warning/error) for args, services, session resolution, resources\n- No logging or process exits inside creation/parsing logic\n- Removed session_directory support\n- Removed session_switch and session_fork extension events (use session_start with reason)\n- Moved package/config CLI to package-manager-cli.ts\n- Fixed theme init for --resume session picker\n- Fixed flaky reftable footer test (content-based polling)\n- Fixed silent drop of unknown single-dash CLI flags\n- Added error diagnostics for missing explicit CLI resource paths\n- Updated SDK docs, examples, plans, exports, tests, changelog\n\nfixes #2753\n"},{"name":"interactive-heartbeat-management.test.ts","kind":"file","size":10039,"lastCommitHash":"85c236d5fc5b0255addaa74026fbcfbf3e490b19","lastCommitWhen":"2026-08-29T10:54:05+02:00","lastCommitMessage":"refactor(coding-agent): derive scoped heartbeats at render time (#1857)\n\n* refactor(coding-agent): derive scoped heartbeats at render time\n\n* fix(coding-agent): keep the earliest heartbeat manager refresh deadline\n\nscheduleHeartbeatManagerRefresh now runs on every subagent snapshot\nupdate, and each call cleared and re-armed the refresh timer. An overdue\nheartbeat uses a relative 5s fallback delay, so children updating more\noften than every 5s postponed the open manager's refresh indefinitely.\nTrack the scheduled deadline and keep the pending timer unless the newly\nderived deadline is earlier.\n\n* test(coding-agent): cover re-arming the heartbeat refresh to an earlier deadline\n\nThe keep-timer-always mutant (returning whenever a timer is armed)\nsurvived the touched suites: nothing proved a sooner heartbeat pulls the\npending refresh forward past the capped 60s poll."},{"name":"interactive-mode-anthropic-warning.test.ts","kind":"file","size":3156,"lastCommitHash":"d01fdd20858f77d7c0a96bf2a9c960550813fbb0","lastCommitWhen":"2026-06-09T21:11:57-07:00","lastCommitMessage":"add daemon agents view (#114)\n\n* feat(coding-agent): add daemon agents view\n\n* fix(coding-agent): preserve inactive agents\n\n* fix(coding-agent): hide inactive agents\n\n* fix(coding-agent): filter inactive agents\n\n* fix(coding-agent): keep agents visible during remove confirmation\n\n* fix(coding-agent): summarize subagents in agents view\n\n* fix(coding-agent): render midstream daemon attachments\n\n* fix(coding-agent): simplify agents view hour durations\n\n* fix(coding-agent): persist agents view selection\n\n* fix(coding-agent): address agents view review findings\n\n* fix(coding-agent): harden agents view review paths\n\n* fix(coding-agent): simplify agents view return result\n\n* fix(coding-agent): avoid replaying agents view startup prompts\n\n* fix marquee hint test for arrow glyph keybinding rendering\n\n* fix interactive-mode tests after agent connection decoupling\n\n* fix review findings: connection error handling, pending tool race, daemon cli flags\n\n* prevent duplicate runtimes per session file and daemon prompt hang\n\n* restart stale daemons after self-update\n* harden stale daemon shutdown and explicit session id reuse\n* apply requested names to reused daemon sessions and migrate colliding legacy session files\n* hide subagents without runtime kind metadata and restore archived agents on intentional resume\n"},{"name":"interactive-mode-boundary.test.ts","kind":"file","size":1958,"lastCommitHash":"891b99800bdd40d53c8f67bbae03acc55262e585","lastCommitWhen":"2026-06-09T21:11:57-07:00","lastCommitMessage":"decouple interactive mode from agent runtime (#79)\n\n* decouple interactive mode from agent runtime\n\n* add rich tui attach for daemon sessions\n\n* clarify agent connection boundary\n\n* document agent connection architecture\n\n* fix daemon interactive session replacement\n\n* refresh transcript after session replacement\n\n* fix daemon session attach edge cases\n\n* fix remaining daemon tui review findings\n\n* fix daemon tui review regressions\n\n* fix daemon tui cancellation gaps\n\n* fix daemon attach by session file\n\n* fix daemon extension ui client routing\n\n* fix daemon close ui cancellation order\n\n* fix daemon active session lookup startup\n"},{"name":"interactive-mode-clear-command.test.ts","kind":"file","size":4291,"lastCommitHash":"05aa747fec4311e6361165d4d1ea93fe0c93fce4","lastCommitWhen":"2026-07-28T19:34:27+02:00","lastCommitMessage":"feat(coding-agent): start named sessions with prompts (#546)"},{"name":"interactive-mode-clone-command.test.ts","kind":"file","size":2608,"lastCommitHash":"891b99800bdd40d53c8f67bbae03acc55262e585","lastCommitWhen":"2026-06-09T21:11:57-07:00","lastCommitMessage":"decouple interactive mode from agent runtime (#79)\n\n* decouple interactive mode from agent runtime\n\n* add rich tui attach for daemon sessions\n\n* clarify agent connection boundary\n\n* document agent connection architecture\n\n* fix daemon interactive session replacement\n\n* refresh transcript after session replacement\n\n* fix daemon session attach edge cases\n\n* fix remaining daemon tui review findings\n\n* fix daemon tui review regressions\n\n* fix daemon tui cancellation gaps\n\n* fix daemon attach by session file\n\n* fix daemon extension ui client routing\n\n* fix daemon close ui cancellation order\n\n* fix daemon active session lookup startup\n"},{"name":"interactive-mode-compaction.test.ts","kind":"file","size":4830,"lastCommitHash":"2f218e15130904568a805ac8d1920927747d7791","lastCommitWhen":"2026-07-30T17:38:20+02:00","lastCommitMessage":"feat: unified agents and resume view (#541)\n\n* feat(coding-agent): unify searchable session view\n\n* fix(tui): keep session durations stable\n\n* test(daemon): tolerate partial session manager fixtures\n\n* test(tui): narrow session view race coverage\n\n* fix(tui): stabilize unified session catalogs\n\n* fix(tui): preserve session view lifecycle\n\n* fix(tui): preserve compact session view layout\n\n* test(tui): align cumulative session fixtures\n\n* fix(tui): preserve unified session identity and drafts\n\n* feat(tui): color recognized slash commands\n\n* fix(tui): keep view cancels and subagent matches local\n\n* test(tui): avoid platform-specific markdown styling\n\n* fix(tui): align session view status, reselect, and local resume flows\n\n* test(tui): consolidate slash command rendering coverage\n\n* test(tui): cover session view exit shutdown from chat\n\n* fix(tui): preserve dynamic command presentation\n\n* test(coding-agent): deadline-wait the create dedup race\n\n* test(coding-agent): align stacked fixtures\n\n* fix(tui): show seconds for sub-minute heartbeat countdowns\n\n* test(coding-agent): align cumulative session behavior\n\n* fix(coding-agent): flush child traces regardless of retention\n\n* fix(tui): single-own replacement catalog refresh\n\n* fix(tui): preserve drafts and completed child traces\n\n* fix(coding-agent): align template argument whitespace\n\n* fix(tui): restore saved sessions after reconnect\n\n* test(coding-agent): consolidate command presentation coverage\n\n* feat(tui): resume saved sessions from the reply composer\n\n* fix(tui): require heartbeat reconnect probe\n\n* test(coding-agent): align cumulative admission errors\n\n* fix(tui): schedule resumed replies from the resume summary\n\n* test(tui): align lifecycle stash handoff result\n\n* test(coding-agent): preserve unique lifecycle coverage\n\n* fix(tui): preserve inactive reply state on failures\n\n* fix(tui): route local agents view startup\n\n* refactor(tui): single-owner command catalog refresh\n\n* fix(tui): preserve selection after saved resume\n\n* test(tui): align startup lifecycle handoff\n\n* test(tui): resolve cumulative submit fixture\n\n* fix(tui): preserve in-flight reply drafts\n\n* test(tui): align owned startup exit shape\n\n* test(daemon): align delivery waiter contract\n\n* fix(tui): refresh resumed reply failures\n\n* fix(tui): preserve search selection\n\n* style(test): format cumulative prompt coverage\n\n* fix(agents-view): refresh reply target before send\n\n* fix(tui): complete onboarding before sessions\n\n* fix(tui): fence resync rendering by generation\n\n* refactor(coding-agent): consolidate prompt-admission cancellation\n\nExtract one shared waitForPromptAdmission helper and typed\nPromptAdmissionCancelledError into core/prompt-admission.ts, replacing\nthree near-identical copies in agent-session, daemon-mode, and\ndaemon-supervisor along with their copy-paste tests and the supervisor's\nstringly cancelled-status cast.\n\nAlso:\n- make _steeringStopPending a derived getter instead of a cached field\n  manually re-synced at 15 call sites\n- surface genuine handoff errors in _isDeferredSessionInputError instead\n  of silently requeueing them when the session is coincidentally busy\n- remove the production-dead pauseQueuedWork shim and narrow\n  resumeQueuedWork to pump-suspension recovery only\n\n* test(coding-agent): deterministic waits and shared test helpers\n\n- replace the 50ms sleep proving no queued turn starts after\n  abortForUpdateRestart with waitForSessionInputIdle\n- replace the 300ms sleep proving no prompt retry after an uncertain\n  admission failure with a bounded microtask drain\n- use the shared createDeferred from suite/scheduling.ts instead of two\n  local reimplementations\n- guard Reflect-based private access in the agents-view and supervisor\n  harnesses so renamed members fail with explicit messages, and document\n  why the constructor-bypass supervisor harness exists\n\n* chore(coding-agent): trim redundant comments from recent refactors\n\n* fix(coding-agent): guard session-input error surfacing against listener throws\n\nA throwing extension error listener could escape _surfaceSessionInputError\ninside _isDeferredSessionInputError before the pump requeued undelivered\nprompts, dropping them. Surfacing is now best-effort.\n\n* chore(coding-agent): tighten fix comment\n\n* fix(tui): keep the selection anchor across fallback unblocking\n\nResolving a missing anchor no longer overwrites the persisted anchor\nidentities with the visible fallback row, and typing while the anchor is\npending no longer claims the fallback either, so a late poll that\ndelivers the intended session re-anchors selection instead of opening\nthe wrong session.\n\n* fix(tui): open the unified session view on back navigation in local chats\n\nThe left-arrow back gesture only worked for daemon-backed sessions;\nprocess-local chats could reach the same unified view only via /resume.\nBack navigation now routes through requestAgentsView, which opens the\nlocal session view in place for process-local sessions.\n\n* fix(tui): preserve reply statuses across post-reply catalog refreshes\n\nThe refreshes triggered after a reply send or a failed resumed send used\ndefault error handling, so a failing catalog refresh could overwrite the\nsticky cwd-fallback notice or the send-failure message. Both refreshes\nnow preserve the current status on error.\n\n* chore(tui): drop redundant back-navigation comment\n\n* chore(tui): tighten reply-status comments\n\n* feat(tui): new session shortcut and steer/queue reply delivery\n\nctrl+n (app.agents.new) creates a fresh daemon session from the agents\nview and opens it. In the reply composer, Enter now steers a streaming\nagent and alt+enter (app.message.followUp) queues the reply as a\nfollow-up. While the composer is armed the hint line switches to\ncomposer hints: steer/send/resume & send, queue once text is typed, and\nesc to cancel.\n\n* feat(tui): session-owned slash commands in the reply composer\n\n/compact, /refine, /goal, and /autonomous pass through the daemon\nprompt path from the agents-view reply composer, with slash\nautocomplete active only while a reply target is armed. Other built-in\ncommands are rejected with guidance instead of being sent to the model\nas plain text.\n\n* feat(tui): view commands in the agents view\n\n/new, /fork, /name, and /kill run from the search editor against the\nselected row and from the armed reply composer against its target,\nwith autocomplete in both contexts. /fork forks at the current leaf via\nthe existing daemon fork RPC, resuming saved rows first; /name renames\nactive or saved sessions; /kill stops a running agent. Unknown or\nsession-only commands are rejected with guidance and plain text remains\na search query. The search hints now advertise \"/ commands\".\n\n* fix(tui): harden new-session shortcut and follow-up delivery\n\nctrl+n no longer fires while the reply composer is armed, so an unsent\ndraft cannot be discarded by opening a new session. Alt+Enter now\nexpands paste markers like Enter does. A session created after the view\nalready finished is killed instead of orphaned in the agents list.\n\n* fix(tui): preserve rejected drafts and bind completions to the target cwd\n\nA rejected command no longer loses the typed text (submitValue clears\nthe buffer before onSubmit; the rejection path now restores it unless\nnewer input arrived). The composer autocomplete provider is rebuilt\nwhen a target is armed, so @-file completions resolve in the target\nsession's cwd instead of the view's startup directory.\n\n* fix(tui): harden view commands against races, stale composers, and cancels\n\nAdapter-mode search no longer suggests view commands it will not run.\nArmed view commands cannot double-run (the buffer is already clear\nduring the RPC) and a failed command restores the typed draft in both\nthe composer and the search editor, without clobbering newer input.\nComposer disarm after /kill and /fork is guarded against a composer\nre-armed mid-command, and a fork cancelled by an extension is reported\nas cancelled instead of success.\n\n* fix(tui): report new-session outcome to callers\n\ncreateNewSession returns whether a session was created and opened, so\ncommand callers can restore a cleared draft on failure.\n\n* fix(tui): refresh after failed resumed forks and propagate /new outcome\n\nA saved row resumed for a fork that then fails, cancels, or has nothing\nto fork now refreshes the catalog so the newly live session appears\nimmediately. /new propagates createNewSession's outcome so a failed\ncreate restores the cleared draft.\n\n* fix(tui): enable @-path completion in the reply composer\n\nThe composer provider was built without an fd path, so @ fuzzy file\nsearch always returned empty. The view now resolves fd once and rebinds\nan armed provider when it becomes available.\n\n* fix(tui): create sessions over a dedicated connection\n\nfinish() closes the shared client, which rejected an in-flight create\nand made its session unkillable; a missing client also threw before the\nguard reset, permanently disabling the shortcut. Session creation now\nruns on its own short-lived connection inside the guarded try, so the\norphan-kill path works even after the view finished.\n\n* fix(tui): harden view commands against stale targets and filter churn\n\nSlash input in the search editor no longer filters the list, which\ncould swap the selected row before Enter ran the command on it. The\narmed composer re-resolves its captured summary before dispatch so\n/kill, /name, and /fork act on the current runtime, and rejects view\ncommands under the local adapter instead of sending them as prompt\ntext. A session resumed only to serve a fork is stopped again when the\nfork fails or is cancelled.\n\n* docs(tui): move the dedicated-connection rationale to its helper\n\n* fix(tui): drop submitted view commands from the persisted query\n\nsubmitValue clears the editor without queryChanged, so a successful\nsearch-editor command stayed in persistentState.query and a remount\nrestored it where Enter could re-run it on an arbitrary row. Failed\ncommands restore the draft through setSearchQuery so the persisted\nquery stays in sync.\n\n* fix(tui): only freeze the search filter for recognized command input\n\nUnknown slash-prefixed terms like /foo stayed unfiltered because any\nleading slash suppressed the query. The filter now freezes only while\nthe input is a view command or a prefix that can still extend into one,\nso ordinary slash search terms keep filtering.\n\n* fix(tui): warn on view commands in the adapter search editor\n\nAdapter sessions fell through to openSelected() when a view command was\ntyped, opening an unrelated row. The search branch now rejects them\nwith the same unavailable-command warning the reply composer shows.\n\n* test: consolidate overlapping reply-composer tests\n\n* test: fold command-classification cases into one test\n\n* test: consolidate overlapping view-command tests\n\n* refactor(tui): drop the /fork view command\n\nThe in-place daemon fork semantics (runtime rebind at the current leaf,\nresume-then-rollback for saved rows) carried a third of the view-command\ncomplexity for a command whose behavior we already flagged as awkward\nuntil isolated forking lands. /new, /name, and /kill remain.\n\n* fix(tui): restore the draft when the adapter search rejects a command\n\nsubmitValue had already cleared the buffer, so the warning silently ate\nthe typed command; it now comes back through setSearchQuery like other\nfailed search-editor commands.\n\n* test: fold sendReply delivery and follow-up keybinding cases together\n\n* test: fold draft-restore rejection cases together\n\n* docs(tui): tighten create-session comments\n\n* docs(tui): tighten the fd-rebind comment\n\n* test: fold overlapping composer tests; tighten comments\n\n* fix(tui): ctrl+c cancels the armed composer as its hint advertises\n\napp.clear ran first and started the exit flow, so a second ctrl+c could\nexit the view and discard the draft.\n\n* fix(tui): refresh the saved catalog after a live /name rename\n\nOnly the live list was refreshed, so the stale saved entry resurfaced\nthe old name once the agent was killed. Mirrors confirmRename.\n\n* fix(tui): gate search autocomplete on command input; refresh both catalogs after /kill\n\nAbsolute-path queries like /tmp/ fell through CombinedAutocompleteProvider\nto filesystem completions; the search editor now uses the same\nisAgentsViewCommandInput predicate as the filter freeze. Catalog\nrefreshes after rename and kill go through a shared refreshBothCatalogs\nso a killed agent reliably reappears under Inactive.\n\n* refactor(tui): share one renameSession path between rename mode and /name\n\n/name reimplemented the rename separately: it reported success before\nthe refresh and missed the older-daemon restart hint. Both entry points\nnow use the same rename/refresh/report sequence.\n\n* fix(tui): tolerate an already-finished agent in /kill\n\ndeactivatePendingAgent treats \"Unknown active session\" as already\nstopped; /kill surfaced the same race as a raw error.\n\n* docs(tui): drop comments that restate adjacent code\n\n* refactor(tui): search-only search bar; retire /resume and the local session view\n\nThe agents-view search bar no longer parses commands: /name and /kill\nlive only in the armed reply composer (their target is captured\nexplicitly), and new-session stays on its keybinding. This deletes the\nsearch-command autocomplete, the filter-freeze machinery, and the\npersisted-query replay handling that command input required.\n\nSession browsing is daemon-only: /resume and bare --resume are removed\nalong with the process-local SessionViewAdapter and every adapter\nbranch in the view. --resume <id|path> still resumes directly;\nnon-daemon `agents` warns and opens a chat. The chat hint now reads\n\"agents/resume\".\n\n* test: port #502 saved-catalog regressions off the removed adapter seam\n\nThe adapter layer was removed with /resume, so refreshSavedSessions now\nstreams list_saved_sessions through the daemon client and confirmRename\ndelegates to the shared renameSession path. The #502 regression harnesses\nstill faked options.adapter, so three tests failed (and two more passed\nonly because the missing client stub produced the expected false). Rebuild\nthem against client.request with onProgress streaming and the renameSession\ndelegate; behavior under test is unchanged.\n\n* chore: drop orphaned JSDoc for the removed bare --resume option"},{"name":"interactive-mode-ctrl-c.test.ts","kind":"file","size":13061,"lastCommitHash":"bab124212fd5451beb071a884b5771ac7c1a8e1a","lastCommitWhen":"2026-08-29T10:52:17+02:00","lastCommitMessage":"fix(coding-agent): single-source the interactive queue state (#1842)\n\n* fix(coding-agent): single-source the interactive queue state\n\n* fix(coding-agent): close queue-state races around rebind, moves, and failed edits\n\n- rebindCurrentSession: re-sync sessionActions after resubscribing; a\n  session_action_update fired in the unsubscribed gap was lost forever.\n- browseQueueSelection: block browsing while a queue move RPC is pending,\n  matching the pendingQueueEdit guard, so the move response cannot reselect\n  the original item under newly browsed editor text.\n- moveQueueSelection: when the applied move's session_action_update has not\n  landed yet (sessionActions reference unchanged), mirror the swap locally so\n  the moved selection is not dropped against the pre-move snapshot; reconcile\n  the selection in the error path.\n- applyQueueSelection: reconcile the selection after the pending-edit flag\n  clears, so a rejected/failed edit no longer leaves Enter targeting a row\n  that was removed while events were suppressed."},{"name":"interactive-mode-debug-command.test.ts","kind":"file","size":3308,"lastCommitHash":"891b99800bdd40d53c8f67bbae03acc55262e585","lastCommitWhen":"2026-06-09T21:11:57-07:00","lastCommitMessage":"decouple interactive mode from agent runtime (#79)\n\n* decouple interactive mode from agent runtime\n\n* add rich tui attach for daemon sessions\n\n* clarify agent connection boundary\n\n* document agent connection architecture\n\n* fix daemon interactive session replacement\n\n* refresh transcript after session replacement\n\n* fix daemon session attach edge cases\n\n* fix remaining daemon tui review findings\n\n* fix daemon tui review regressions\n\n* fix daemon tui cancellation gaps\n\n* fix daemon attach by session file\n\n* fix daemon extension ui client routing\n\n* fix daemon close ui cancellation order\n\n* fix daemon active session lookup startup\n"},{"name":"interactive-mode-effort-command.test.ts","kind":"file","size":16443,"lastCommitHash":"848081edb1f9a4f4d643cdb1cc01e1d99bc61cfd","lastCommitWhen":"2026-08-21T16:08:23+02:00","lastCommitMessage":"Support /fast with OpenAI API-key authentication (#1609)\n\n* feat(coding-agent): support /fast with OpenAI API-key authentication (ENG-5425)\n\nWidens supportsFastMode() to admit GPT-5.4/GPT-5.5/GPT-5.6 on the openai\nprovider (openai-responses API) in addition to ChatGPT auth, corrects the\nGPT-5.6 fast-pricing multiplier from 2.5x to 2x per OpenAI's current\npricing table, and updates the /fast unavailable message.\n\nResolves discussion #1595.\n\n* docs(ai): trim pricing comments to source reference only\n\n* chore: drop research scratch file from the branch\n\n* chore: restore package-lock.json from main (unrelated npm churn)\n\n* test: update fast-mode unavailable message assertion"},{"name":"interactive-mode-feature-hints.test.ts","kind":"file","size":7830,"lastCommitHash":"bab124212fd5451beb071a884b5771ac7c1a8e1a","lastCommitWhen":"2026-08-29T10:52:17+02:00","lastCommitMessage":"fix(coding-agent): single-source the interactive queue state (#1842)\n\n* fix(coding-agent): single-source the interactive queue state\n\n* fix(coding-agent): close queue-state races around rebind, moves, and failed edits\n\n- rebindCurrentSession: re-sync sessionActions after resubscribing; a\n  session_action_update fired in the unsubscribed gap was lost forever.\n- browseQueueSelection: block browsing while a queue move RPC is pending,\n  matching the pendingQueueEdit guard, so the move response cannot reselect\n  the original item under newly browsed editor text.\n- moveQueueSelection: when the applied move's session_action_update has not\n  landed yet (sessionActions reference unchanged), mirror the swap locally so\n  the moved selection is not dropped against the pre-move snapshot; reconcile\n  the selection in the error path.\n- applyQueueSelection: reconcile the selection after the pending-edit flag\n  clears, so a rejected/failed edit no longer leaves Enter targeting a row\n  that was removed while events were suppressed."},{"name":"interactive-mode-heartbeat-command.test.ts","kind":"file","size":1912,"lastCommitHash":"97d933bf6c9e7fae44cdb0bd3a60e8a979cfaf73","lastCommitWhen":"2026-07-09T23:17:30-07:00","lastCommitMessage":"Steer heartbeats by default with configurable delivery mode (#358)\n\n* feat(coding-agent): steer heartbeats by default with configurable delivery mode\n\nScheduled heartbeat prompts now steer (interrupt the current turn) by\ndefault instead of queueing as follow-up messages. Delivery mode is\nconfigurable as \"steer\" or \"follow_up\" for both user /heartbeat jobs and\ninternal rlm_heartbeat jobs, which share the cron scheduler plumbing.\n\n- Add AgentHeartbeatDeliveryMode with DEFAULT_HEARTBEAT_DELIVERY_MODE=steer\n- Persist deliveryMode on heartbeat/rlm_heartbeat cron jobs\n- /heartbeat accepts --steer/--follow-up (and --deliver <mode>)\n- rlm_heartbeat skill create/update accept delivery_mode\n- shouldDeferHeartbeatCronJob is delivery-mode-aware: steer heartbeats\n  interrupt a plain streaming turn, follow_up still defers\n- Update CLI/slash help, autocomplete, protocol/connection types, and docs\n\n* fix(coding-agent): validate heartbeat delivery mode edge cases\n\nAddress Macroscope findings on PR #358:\n\n- Parse delivery flags that appear after the /heartbeat instruction.\n- Normalize and validate daemon heartbeat_set deliveryMode before persisting.\n- Clear stale queued RLM heartbeat follow-ups when only deliveryMode changes.\n\nAdds focused regressions for each case.\n\n* fix(coding-agent): keep middle heartbeat delivery flags literal\n\nConsume /heartbeat delivery flags only from option positions: leading flags,\ntrailing flags, or immediately after the interval. This preserves literal\nmentions of --follow-up/--steer in the middle of free-form instructions while\nstill supporting trailing opt-out syntax.\n\n* fix(coding-agent): clear queued steered heartbeat prompts\n\nAddress Cursor Bugbot's PR #358 finding: steer-delivered heartbeat prompts\ncan queue in the steering queue, so pause/clear/replace cleanup must remove\nthem by heartbeat queue key just like follow-up heartbeat prompts.\n\nAdds queueKey support for steering messages and a regression covering queued\nsteered heartbeat removal.\n\n* fix(coding-agent): reject invalid heartbeat delivery flag values\n\nStrictly validate --deliver values in /heartbeat command option positions so\ninvalid delivery modes cannot silently become part of the instruction text.\n\nKeeps delivery-like text in the middle of free-form instructions literal.\n\n* fix(coding-agent): preserve steering queue keys across restart\n\nSteered heartbeat prompts rely on their heartbeat queue key for pause/clear and\nreplace cleanup. Preserve that key in update-restart snapshots and restore it\nwhen queued steering messages are replayed.\n\n* fix(coding-agent): address heartbeat review findings (fixes #358)\n\n* fix(coding-agent): preserve heartbeat delivery mode (fixes #358)\n\n* fix(coding-agent): preserve queue keys on expanded steer commands\n\nForward queueKey and agentMessageId through AgentSession.steer() for daemon\nsteer commands that use the normal prompt-expansion path. This keeps keyed\ncleanup working for steered heartbeat prompts regardless of restore path.\n\n---------\n\nCo-authored-by: Kevin Thomas <kevin.jt2007@gmail.com>"},{"name":"interactive-mode-import-command.test.ts","kind":"file","size":5814,"lastCommitHash":"891b99800bdd40d53c8f67bbae03acc55262e585","lastCommitWhen":"2026-06-09T21:11:57-07:00","lastCommitMessage":"decouple interactive mode from agent runtime (#79)\n\n* decouple interactive mode from agent runtime\n\n* add rich tui attach for daemon sessions\n\n* clarify agent connection boundary\n\n* document agent connection architecture\n\n* fix daemon interactive session replacement\n\n* refresh transcript after session replacement\n\n* fix daemon session attach edge cases\n\n* fix remaining daemon tui review findings\n\n* fix daemon tui review regressions\n\n* fix daemon tui cancellation gaps\n\n* fix daemon attach by session file\n\n* fix daemon extension ui client routing\n\n* fix daemon close ui cancellation order\n\n* fix daemon active session lookup startup\n"},{"name":"interactive-mode-prompt-stash.test.ts","kind":"file","size":32368,"lastCommitHash":"b0023ef6c0a260b08f9c00d08e81f4106da7430e","lastCommitWhen":"2026-09-01T21:18:22+09:00","lastCommitMessage":"feat(coding-agent): add dot continuation shortcut\n"},{"name":"interactive-mode-resume-command.test.ts","kind":"file","size":2553,"lastCommitHash":"2ea5ae091087cad90ab6ee8e87c62869eb4d7edc","lastCommitWhen":"2026-08-13T15:44:00-07:00","lastCommitMessage":"Bring back bare --resume and the /resume command (#1280)\n\n* feat(coding-agent): restore bare --resume agents view and /resume slash command\n\n* chore(coding-agent): clean up resume PR\n\n---------\n\nCo-authored-by: Seth <seth@primeintellect.ai>"},{"name":"interactive-mode-rlm-max-depth-command.test.ts","kind":"file","size":4361,"lastCommitHash":"5929ebee6004da12602e8051e43a77b05118c80e","lastCommitWhen":"2026-08-05T04:46:50+02:00","lastCommitMessage":"feat(coding-agent): /rlm-max-depth session command (#585)\n\n* feat(coding-agent): /rlm-max-depth session command\n\nSession-owned command (fifth SessionCommandAction arm) controlling the RLM\nrecursion cap per D6 of the recursive-agent-harness plan:\n\n- /rlm-max-depth shows the effective cap and its origin\n  (chat/inherited/global/env/default)\n- /rlm-max-depth <int> sets it for this chat, persisted forever via an\n  rlm_max_depth_state JSONL entry (goal pattern, flushNow); children spawned\n  afterward inherit copy-at-spawn; no retroactive push-down, no upward\n  propagation; a child's own setting overrides its inherited value across\n  reopen (persisted chat state > spawn config > global > env > 1)\n- /rlm-max-depth <int> --global sets the settings.json default for new\n  sessions everywhere and pins this session\n- branch navigation reloads the persisted state alongside goal state and\n  refreshes the system prompt when the effective value changes\n- absolute-depth cap semantics unchanged (depth >= maxDepth blocks spawn)\n\nTrack A PR 3 of the recursive-agent-harness plan.\n\n* refactor(coding-agent): make /rlm-max-depth immediate with one-line feedback\n\nUser decision: make this a state command like /name that never steers or queues. Replace the compaction-style status message with dim one-line feedback while leaving persisted chat state and global settings behavior unchanged.\n\nInteractive and daemon AgentConnection clients use the immediate direct API. RPC has no dedicated command yet; sending /rlm-max-depth as a prompt is no longer a command path.\n\n* fix(coding-agent): preserve live command and prompt state\n\n- Clear /rlm-max-depth input before awaiting its daemon RPC so new drafts survive.\n- Resolve the system prompt per turn so active runs observe max-depth updates.\n\n* fix(coding-agent): preserve extension prompt on depth changes\n\n- Refresh the active extension-modified system prompt when RLM max depth changes.\n- Add regression coverage for preserving extension doctrine while applying new depth doctrine mid-run.\n\n* fix(coding-agent): report failed global saves when settings cannot parse\n\nSettingsManager.save bailed silently when the global settings file had\na load error: no write was enqueued and no error recorded, so after the\nstartup diagnostic was drained, setRlmMaxDepth reported globalSaved\neven though nothing reached disk. The bail now records a scoped\nsettings error so the drain reports the failure.\n\n* fix(coding-agent): resolve prompt after API key lookup\n\n- Resolve the live system prompt after asynchronous API key lookup, immediately before the provider call.\n- Add regression coverage for prompt changes during API key resolution."},{"name":"interactive-mode-services.test.ts","kind":"file","size":1722,"lastCommitHash":"a3d86fbe593df760febb5c5e945fe99c59022a63","lastCommitWhen":"2026-08-21T14:02:30-07:00","lastCommitMessage":"fix(coding-agent): refresh MCP providers after add (#1629)\n\n* fix(coding-agent): refresh MCP providers after add\n\n* fix(coding-agent): preserve legacy MCP login guidance"},{"name":"interactive-mode-startup.test.ts","kind":"file","size":11880,"lastCommitHash":"0f6a388544df538d6b31ec54e53d1455f7b5a9de","lastCommitWhen":"2026-08-28T14:15:25+02:00","lastCommitMessage":"refactor(coding-agent): read messageCount instead of a shadow flag (#1852)"},{"name":"interactive-mode-status.test.ts","kind":"file","size":207495,"lastCommitHash":"85c236d5fc5b0255addaa74026fbcfbf3e490b19","lastCommitWhen":"2026-08-29T10:54:05+02:00","lastCommitMessage":"refactor(coding-agent): derive scoped heartbeats at render time (#1857)\n\n* refactor(coding-agent): derive scoped heartbeats at render time\n\n* fix(coding-agent): keep the earliest heartbeat manager refresh deadline\n\nscheduleHeartbeatManagerRefresh now runs on every subagent snapshot\nupdate, and each call cleared and re-armed the refresh timer. An overdue\nheartbeat uses a relative 5s fallback delay, so children updating more\noften than every 5s postponed the open manager's refresh indefinitely.\nTrack the scheduled deadline and keep the pending timer unless the newly\nderived deadline is earlier.\n\n* test(coding-agent): cover re-arming the heartbeat refresh to an earlier deadline\n\nThe keep-timer-always mutant (returning whenever a timer is armed)\nsurvived the touched suites: nothing proved a sooner heartbeat pulls the\npending refresh forward past the capped 60s poll."},{"name":"interactive-mode-streaming.test.ts","kind":"file","size":14557,"lastCommitHash":"c382f09856d4a8c8d2b765179657047d58691f25","lastCommitWhen":"2026-08-30T17:18:36+02:00","lastCommitMessage":"feat(coding-agent): render Mermaid diagrams inline in the terminal (#1893)\n\n* feat(coding-agent): render Mermaid code blocks as inline Unicode diagrams\n\nPorts pi-mono's Mermaid rendering (grok-mermaid) into prime-agent:\n- pi-tui Markdown gains an options.transform hook that rewrites source\n  Markdown with the exact content width before parsing (ported from\n  upstream pi-tui).\n- New mermaid.ts transform replaces top-level mermaid code blocks with\n  themed Unicode diagrams, falls back to the raw block when the diagram\n  is wider than the message, and appends a themed warning line for\n  partially rendered final diagrams.\n- AssistantMessageComponent applies the transform to text blocks only\n  (never thinking blocks) and tracks streaming state so the\n  streaming-to-final transition re-renders.\n- New markdown.mermaid setting (off/final/streaming, default streaming)\n  with a settings-selector entry.\n\nLinear: ENG-5673\n\n* test(coding-agent): kill mermaid mutation survivors\n\nAdversarial review mutation testing found three surviving mutants:\n- width guard flipped to >= (exact-fit diagrams would fall back)\n- codeSpan fence reduced to a single backtick (backtick labels break)\n- isStreaming inverted at the message_end call site (final mode never renders)\n\nAdds an exact-width boundary test, a backtick-label test, and a\nhandleEvent-level final-mode transition test that kill them.\n\n* build(coding-agent): pin grok-mermaid exactly for renderer-output stability\n\n* test(coding-agent): collapse redundant mermaid coverage\n\n* docs(coding-agent): tighten mermaid comments\n\n* fix(coding-agent): tolerate non-object markdown settings values\n\nNormalize a malformed markdown settings value at the migration boundary\n(mirroring the telemetry handling) so changing the Mermaid mode cannot\nthrow, and add the missing tui changelog fragment.\n\n* test(coding-agent): drop mermaid.test.ts\n\n* chore(coding-agent): one-line mermaid codeSpan comments"},{"name":"interactive-mode-suspend.test.ts","kind":"file","size":5542,"lastCommitHash":"624a7f794f30fd56d2e7af8020c3aad986c57bba","lastCommitWhen":"2026-04-16T12:33:47+02:00","lastCommitMessage":"fix(coding-agent): handle ctrl+z on windows closes #3191\n"},{"name":"interactive-mode-traces-command.test.ts","kind":"file","size":5211,"lastCommitHash":"c514ab9652c1a5d20299d0ee3b48d589b86f2aa6","lastCommitWhen":"2026-07-16T15:39:26-07:00","lastCommitMessage":"improve trace upload reliability and controls (#389)\n\n* feat(coding-agent): improve trace upload controls (ENG-4586)\n\n* fix(coding-agent): address trace upload review findings, fixes #389\n\n* fix(coding-agent): stop canceled trace batches, fixes #389\n\n* fix(coding-agent): handle trace upload cancellation, fixes #389\n\n* fix(coding-agent): pace trace upload-all, fixes #389\n\n* fix(coding-agent): bound and cancel trace backfills, fixes #389\n\n* fix(coding-agent): honor service retry delays, fixes #389"},{"name":"interactive-queue-edit.test.ts","kind":"file","size":24486,"lastCommitHash":"bab124212fd5451beb071a884b5771ac7c1a8e1a","lastCommitWhen":"2026-08-29T10:52:17+02:00","lastCommitMessage":"fix(coding-agent): single-source the interactive queue state (#1842)\n\n* fix(coding-agent): single-source the interactive queue state\n\n* fix(coding-agent): close queue-state races around rebind, moves, and failed edits\n\n- rebindCurrentSession: re-sync sessionActions after resubscribing; a\n  session_action_update fired in the unsubscribed gap was lost forever.\n- browseQueueSelection: block browsing while a queue move RPC is pending,\n  matching the pendingQueueEdit guard, so the move response cannot reselect\n  the original item under newly browsed editor text.\n- moveQueueSelection: when the applied move's session_action_update has not\n  landed yet (sessionActions reference unchanged), mirror the swap locally so\n  the moved selection is not dropped against the pre-move snapshot; reconcile\n  the selection in the error path.\n- applyQueueSelection: reconcile the selection after the pending-edit flag\n  clears, so a rejected/failed edit no longer leaves Enter targeting a row\n  that was removed while events were suppressed."},{"name":"interactive-update-relaunch.test.ts","kind":"file","size":2807,"lastCommitHash":"039eba051a93e009c9336262cf6357523e85473d","lastCommitWhen":"2026-07-16T15:24:29-07:00","lastCommitMessage":"fix daemon update restart coordination (#406)\n\n* fix(coding-agent): prevent concurrent daemon supervisors\n\nFixes ENG-4600\n\n* fix(coding-agent): harden supervisor handoff\n\nFixes ENG-4600\n\n* test(coding-agent): prove resident handoff\n\nFixes ENG-4600\n\n* test(coding-agent): preserve daemon socket exports\n\nFixes ENG-4600\n\n* test(coding-agent): isolate supervisor registry\n\nFixes ENG-4600\n\n* fix(coding-agent): reduce supervisor ownership scope (ENG-4600)\n\n* test(coding-agent): make supervisor teardown deterministic (ENG-4600)\n\n* test(coding-agent): contain supervisor fixtures (ENG-4600)\n\n* test(coding-agent): grace supervisor fixture cleanup (ENG-4600)\n\n* fix(coding-agent): coordinate daemon update restarts\n\nFixes ENG-4606\n\n* test(coding-agent): clean stale fixture owners (ENG-4600)\n\n* fix(coding-agent): harden update restart recovery\n\nFixes ENG-4606\n\n* fix(coding-agent): contain restart recovery failures\n\nFixes ENG-4606\n\n* test(coding-agent): clean replacement fixture owner (ENG-4600)\n\n* fix(coding-agent): report restart recovery results\n\nFixes ENG-4606\n\n* fix(coding-agent): await update recovery completion\n\nFixes ENG-4606\n\n* fix(coding-agent): defer daemon startup fence (ENG-4600)\n\n* fix(coding-agent): watchdog update restart progress\n\nFixes ENG-4606\n\n* fix(coding-agent): fence late daemon hello (ENG-4600)\n\n* fix(coding-agent): join concurrent update recovery\n\nFixes ENG-4606\n\n* fix(coding-agent): fence Windows process identity\n\nFixes ENG-4606\n\n* fix(coding-agent): harden update restart progress\n\nFixes ENG-4606\n\n* fix(coding-agent): complete supervisor shutdown cleanup (ENG-4600)\n\n* fix(coding-agent): scope update restart recovery\n\nFixes ENG-4606\n\n* fix(coding-agent): normalize restart identity lazily\n\nFixes ENG-4606\n\n* fix(coding-agent): recover ambiguous daemon shutdown\n\nFixes ENG-4606\n\n* chore: trigger ci after retargeting\n\nFixes ENG-4606\n\n* fix(coding-agent): preserve interactive daemon boundary\n\nFixes ENG-4606\n\n* test(coding-agent): isolate self-update install paths\n\nFixes ENG-4606\n\n* fix(coding-agent): harden coordinator completion waits\n\nFixes ENG-4606\n\n* fix(coding-agent): stabilize restart coordinator home\n\n* fix(coding-agent): preserve interactive update child"},{"name":"ipython-attachments.test.ts","kind":"file","size":1169,"lastCommitHash":"6e929e1560143d3d6fba8f36cda51bbc99301954","lastCommitWhen":"2026-06-26T18:43:51-07:00","lastCommitMessage":"load on-disk images into model context via attach-media skill (#274)\n\n* add attach-media skill to load on-disk images into context\n\n* declare attachments on ipython tool details\n\n* address review: fix console-script name, emit attachments atomically, guard sizes\n\n* stream attachment encoding one image at a time\n\n* clarify vision-unsupported error to prompt telling the user\n\n* rename skill to attach-image and trim skill description\n\n* document attachment size-cap invariant so skill images are never silently dropped\n\n* add live-kernel integration test for attach-image skill\n\n* fail loudly on oversized attachment instead of silent drop"},{"name":"ipython-bootstrap.test.ts","kind":"file","size":5445,"lastCommitHash":"d60fab8a76d9c169f945341f0ee3bde21903bb55","lastCommitWhen":"2026-08-28T17:40:01+02:00","lastCommitMessage":"fix(coding-agent): repair corrupt REPL protocol frames (#1839)\n\n* refactor(coding-agent): unify kernel shutdown\n\n* docs(coding-agent): carry over shutdown rationale comments\n\n* fix(coding-agent): repair corrupt REPL protocol\n\n* fix(coding-agent): cancel the final kernel snapshot before disposal cleanup\n\n* fix(coding-agent): block new executions from splicing ahead of the final dispose snapshot\n\nflushSnapshotForDispose captured the execution queue while the kernel\nstate was still 'running', so a concurrent execute() (which has no\nper-cell timeout) could enqueue after the capture; captureSnapshot then\nqueued behind it and its timeout never started, hanging dispose() and\nshutdown({snapshot:true}) forever. Claim the flush before capturing the\nqueue: non-internal requests are rejected while the final snapshot is\nflushing, keeping every wait on the dispose path bounded.\n\n* fix(coding-agent): close protocol-repair races and bound the repair\n\n- Gate queued requests behind an in-flight repair: a request whose queue\n  slot opens during a repair releases the slot and requeues after the\n  repair, so queued executes/snapshots can no longer run on the empty\n  replacement kernel ahead of restoreState (and overwrite its result or\n  clobber the last good snapshot).\n- Race the repair wait in execute() with opts.signal so an aborted call\n  returns its aborted result promptly instead of pending through repair.\n- Bound the repair's restore with REPAIR_RESTORE_TIMEOUT_MS so a stalled\n  replacement cannot wedge protocolRepairPromise (and every later\n  execute) forever; a timed-out restore discards the replacement and\n  returns to clean idle.\n- Stop respawn-looping when the replacement kernel itself emits a corrupt\n  frame during repair: discard it and settle at clean idle instead of\n  superseding into an unbounded chain of repairs.\n\n* fix(coding-agent): re-bootstrap repaired kernels and gate busy-waiting cells\n\n- A protocol-repaired kernel restored only the user namespace, so live\n  handles (rlm, bash, skills) were missing and the next cell failed with\n  NameErrors. KernelManagerOptions gains bootstrapCode (the provisioner\n  passes its buildRlmBootstrapCode output); the repair re-runs it after\n  restore, bounded like the restore, and discards the replacement to\n  clean idle when it fails.\n- The repair requeue gate only ran right after taking the queue slot, so\n  a cell busy-waiting on an interrupted execution when corruption arrived\n  could proceed onto the unrestored replacement while blocking the\n  repair's restore behind its slot. The gate now sits after the busy-wait\n  (still exempting the repair's own requests), covering both windows.\n- Fold the repeated kill-to-clean-idle teardown into killChildToIdle and\n  rename REPAIR_RESTORE_TIMEOUT_MS to REPAIR_STEP_TIMEOUT_MS since it now\n  bounds restore and bootstrap.\n\n* fix(coding-agent): join concurrent teardowns into one final snapshot flush\n\nConcurrent dispose() and shutdown({ snapshot: true }) (e.g. a session\ndispose racing the SIGINT handler) each ran flushSnapshotForDispose: the\nfirst finisher's finally cleared flushingSnapshotForDispose while the\nsecond was still flushing, dropping the execution guard early and\nenqueueing a duplicate final snapshot behind the first. Memoize the\nin-flight flush so every teardown joins the same bounded flush.\n\n* fix(coding-agent): close protocol repair gaps for schema-invalid frames, startup chunks, and rebootstrap\n\n- Fail the protocol on JSON object frames that violate the frame schema\n  (unknown event kind; done/host_request without a string id) instead of\n  silently dropping them, which left the active request unsettled forever.\n  The protocol version handshake is exact, so unknown kinds are corruption,\n  not forward compatibility.\n- A corrupt frame sharing one stdout chunk with ready no longer lets the\n  startup mark the corrupt child running: failProtocolFrame records the\n  error while starting and doStart fails the start.\n- A fresh kernel started lazily after a discarded repair re-runs the\n  configured runtime bootstrap before serving user code, so rlm/bash/skills\n  handles are never silently missing.\n\n* test(coding-agent): reconcile chain-collapse suites and cover teardown racing the lazy re-bootstrap\n\n- Point the graceful-shutdown flush spies at captureSnapshot: the merged\n  final flush (kernel-snapshot-dispose-timeout) snapshots through the\n  bounded captureSnapshot path, not snapshotState, so the old spies let\n  real snapshot requests hit the mocked wire and leaked fake timers.\n- The superseded repair's booting replacement is now hard-killed without\n  a protocol shutdown (single-kernel-shutdown only drains running\n  kernels), so it may die before journaling its spawn; assert spawn-count\n  stability after teardown instead of an exact boot count.\n- New composition test: a teardown racing an in-flight lazy re-bootstrap\n  stays bounded, spawns nothing new, and settles the raced cell.\n\n* fix(coding-agent): re-check the final-flush guard after the re-bootstrap wait\n\n- An external execute admitted before the final dispose flush could park on\n  the lazy re-bootstrap, then take its queue slot after the flush captured\n  pendingExecutions - splicing between the captured queue and the final\n  snapshot and unbounding the teardown. Re-check the flush guard right\n  after the ensure await; unit test proves the re-check is load-bearing.\n- Deflake the teardown-vs-re-bootstrap composition test: the fake runtime\n  journals its spawn before ready, so poll isRunning before the teardown to\n  race the re-bootstrap deterministically instead of the boot.\n\n* fix(coding-agent): close bot-review gaps in protocol repair and teardown seams\n\n- Terminal frames (done/host_request) with an EMPTY string id now fail the\n  protocol like id-less ones: the runtime mints uuid hex ids and echoes the\n  host's uuids, so an empty id is corruption that previously slipped past\n  the validator into the silent-drop hang.\n- An execution aborted while waiting on the lazy re-bootstrap settles\n  promptly: the wait races the abort signal (same pattern as\n  waitForProtocolRepair) and the aborted request returns before parking on\n  the queue slot behind the still-running bootstrap.\n- A failed kernel startup awaits its own teardown (final snapshot flush\n  included) before surfacing the error, so a replacement provisioner gated\n  on this dispose can no longer race the still-flushing kernel over the\n  same snapshot files.\n- restart() during the final dispose flush is rejected instead of taking a\n  queue slot and joining the owning shutdown, which could deadlock the\n  flush's snapshot behind the held slot.\n\n* test(coding-agent): cover empty-string host_request ids in the frame validator\n\nKills the surviving mutant that relaxed the host_request half of the\nnon-empty-id requirement back to typeof-only: an empty-id host_request now\nhas a corruption test mirroring the empty-id done one (protocol fails and\nthe kernel is repaired instead of the awaiting cell hanging).\n\n* fix(coding-agent): restore the saved namespace on lazily reprovisioned kernels\n\nAfter a discarded repair whose failure never implicated the snapshot (the\nrepair start died, or only its bootstrap failed), the lazily started fresh\nkernel re-ran the bootstrap but silently abandoned the user's saved\nnamespace forever. Track restore separately: killChildToIdle marks both\npending; the two snapshot-culprit discard paths (clean restore failure,\nreplacement corrupted mid-repair) clear the restore flag so a poisoned\nsnapshot is never retried; the lazy path restores one-shot best-effort\n(ordinary startup semantics) before bootstrapping, and a teardown's final\nsnapshot never triggers reprovisioning. Restore-attempt journaling in the\nfake runtime pins the no-retry and no-double-restore semantics.\n\n* fix(coding-agent): protect the saved snapshot from unrestored kernels; phase-aware corruption attribution\n\n- The final dispose flush skips its snapshot while pendingRestore is set:\n  a kernel that never restored the saved namespace must not overwrite it\n  (the on-disk snapshot is strictly fresher). One interleaving-independent\n  condition instead of joining the reprovision promise, which would\n  reintroduce the 30-60s teardown stall the teardown guard prevents. The\n  lazy one-shot clear moves after the corruption check so the flag also\n  covers a flush racing an in-flight lazy restore.\n- The repair give-up path attributes corruption by phase: performRestore\n  clears pendingRestore on success, so the flag still being set means the\n  corruption struck at or before the restore (snapshot stays the prime\n  suspect, loop-safe); corruption strictly after a successful restore\n  keeps the namespace restorable at the cost of at most one bounded\n  restore per later attempt."},{"name":"ipython-cell-background-output.test.ts","kind":"file","size":4613,"lastCommitHash":"61eb64748eb077e2a084432db92d101a2a83e146","lastCommitWhen":"2026-08-26T15:24:10-07:00","lastCommitMessage":"Minimal CPython REPL runtime (rlm.repl) (#1685)\n\n* feat(coding-agent): add async-by-default bash() to the kernel runtime\n\n* chore(coding-agent): tighten bash() comments and changelog fragment\n\n* feat(coding-agent): add a standalone CPython REPL runtime speaking JSON lines over stdio\n\n* chore(coding-agent): tighten REPL runtime comments\n\n* feat(coding-agent): run the kernel on the REPL runtime over stdio\n\n* fix(coding-agent): reject pending host requests on kernel teardown\n\nThe runtime now fails pending host_request futures when stdin hits EOF or\na shutdown request arrives, so a cell awaiting a host reply can no longer\nblock _serve from consuming the shutdown and wedge the process. Startup\nand busy-kernel messages plus the ipython tool description now say Python\nkernel, matching the default REPL runtime client.\n\n* chore(coding-agent): describe the kernel-heavy test tag client-neutrally\n\n* feat(coding-agent): make the REPL runtime the only kernel\n\nRemoves the Jupyter/ipykernel/ZMQ kernel client, the fork server, the\nPRIME_AGENT_KERNEL escape hatch, and the %%bash/%cd/%env cell rewriting.\nMagic-style cells (%/%%/!) return a one-line error naming the Python or\nbash() replacement. The kernel venv no longer installs ipykernel;\nexisting venvs are rebuilt once via the bootstrap schema bump. Old\nsnapshot artifacts still restore through the runtime's pickle compat.\n\n* fix(coding-agent): close MCP transports in REPL shutdown\n\n* fix(coding-agent): address bash() review findings — exact tail retention, foreground-status lifecycle with group anchoring, post-kill forkserver reap, Windows start-id parity, executor-free await\n\n* fix(coding-agent): tree-kill bash() process trees on Windows and make running reflect group liveness\n\n* fix(runtime): address repl runtime review findings\n\n- revalidate targeted interrupts through SIGINT delivery so a stale signal\n  cannot cancel a later request\n- preserve a parked untargeted interrupt while another request is inflight\n- reject non-string interrupt ids and validate snapshot options\n  (prune_oversized bool, max_bytes/max_variable_bytes present => int)\n- guard str(exc) in error/skip/fail reasons so a broken __str__ cannot\n  kill the runtime\n- fail the snapshot when the manifest write fails (before any pruning)\n- report 'snapshot not found' reason on restore of a missing path\n- wait unbounded for the output-pump drain marker so done never precedes\n  captured output and marker bytes never leak\n- document that aggregate-cap skips are not pruned\n\n* fix(coding-agent): carry bash() status pipe as stdin so strict-POSIX shells accept single-digit fd redirections\n\n* fix(coding-agent): address host-swap review findings — runtime-neutral kernel wording, %cd/%env rewrite fidelity, linear-time magic regexes, restart supersession guard\n\n* fix(coding-agent): reject stale column-0 line magics on any cell line, not just the first\n\n* fix(coding-agent): close status fds when wake-pipe creation fails and gate bash() commands on orphan-journal registration\n\n* fix(coding-agent): strip quoted %cd targets, use UTF-16-safe %env parsing, and expand $var/${var} values PEP-215-style\n\n* fix(coding-agent): fail rlm.run fast outside a live kernel so vitest workers cannot hang on a comm that never replies\n\n* fix(coding-agent): clear the active cell id before terminal events so late background output is never tagged with a finished cell\n\n* fix(coding-agent): update legacy IPython-era tests to assert cutover behavior\n\n* fix(coding-agent): describe the column-0 magic scan without referencing the removed rewrite backend\n\n* fix(coding-agent): consume parked interrupts on compile failures and survive user-closed stdio in the drain path\n\n* fix(coding-agent): redact bare %env listings, prefer '=' in %env parsing, echo %cd targets, and keep graceful shutdowns owning their cleanup\n\n* fix(coding-agent): reject kernel startup promptly on spawn errors and commit %cd previous-dir tracking only after chdir succeeds\n\n* fix(coding-agent): trim ParsedIpythonBashCell to the body field its callers use\n\n* fix(coding-agent): kill full process trees in the Windows orphan reaper via taskkill /T\n\n* fix(coding-agent): survive compile-phase crashes and fd-reuse drain hangs in the REPL runtime\n\n* fix(coding-agent): shield snapshot prune deletions from interrupts and pin the host comm probe to its real seam\n\n* fix(coding-agent): route list_names through the per-request backstop and skip non-string namespace keys\n\n* fix(coding-agent): reject snapshot requests whose manifest path aliases the payload path\n\n* fix(coding-agent): reject negative snapshot size caps that would prune every user variable\n\n* fix(coding-agent): kill one-shot await bash() on cancel, resolve Windows helpers via System32, retry taskkill after reap, and fail closed on orphan-journal enrollment\n\n* fix(coding-agent): attribute REPL stream output at write time so raw fd and user-thread bytes never carry another cell's id\n\n* fix(coding-agent): surface unattributed REPL stream output as separate background output instead of dropping or merging it\n\n* fix(coding-agent): confirm group exit before a cancelled one-shot bash() await propagates and complete-write orphan-journal records\n\n* fix(coding-agent): expose a working sys.stdout.buffer on the tagged REPL writer routing bytes through the null-attributed raw channel\n\n* fix(coding-agent): mark between-cell background output truncated when the pending buffer cap is hit\n\n* fix(coding-agent): shield the cancelled-await bash() confirm-exit from re-cancellation, fail clearly without bash on Windows, and fence slow pumps out of result assembly\n\n* fix(coding-agent): survive hostile protocol lines in the REPL reader thread and interrupt without pthread_kill on Windows\n\n* fix(coding-agent): send the protocol shutdown from dispose() so the runtime closes MCP servers and kills live bash groups before the hard kill\n\n* fix(coding-agent): flag the pump's read-to-commit window so the bash() drain fence cannot miss an in-flight chunk\n\n* fix(coding-agent): guard the whole REPL request line against hostile input, reject duplicate in-flight ids, complete short buffer-pipe writes, and clean the snapshot temp file on KeyboardInterrupt\n\n* fix(coding-agent): drop stale between-cell background output on kernel teardown so it cannot surface after a restart\n\n* fix(coding-agent): assert the tagged channel only in the large buffer-write REPL test since cross-channel ordering is not guaranteed\n\n* fix(coding-agent): resolve taskkill via absolute System32 path in the host orphan reaper\n\n* fix(coding-agent): write the inactive orphan-journal record only after a delivered kill so undelivered signals leave the host reaper in charge\n\n* fix(coding-agent): keep a REPL request interrupt-targetable through its trailing-expression repr and output drain until done is emitted\n\n* fix(coding-agent): count an already-exited leader as delivered in the Windows bash() reap so clean exits still journal inactive\n\n* fix(coding-agent): reject NaN and Infinity in emit() payloads before they corrupt REPL protocol framing\n\n* chore(coding-agent): correct the stale ipykernel requirement on the python override doc\n\n* chore(coding-agent): drop migration-era wording from kernel comments\n\n* fix(coding-agent): resolve trusted absolute shell host-side and close Windows journal/reap gaps\n\n* fix(coding-agent): best-effort-kill pid-only orphan records in daemon force-stop and recovery reaps\n\n* refactor(coding-agent): drop the magic-cell rejection gate\n\n%-prefixed and !-prefixed cells now reach CPython and fail with its own\nSyntaxError, which names the offending line. The rejection layer guarded\nagainst model-produced IPython syntax, but with the shipped prompt fresh\nsessions do not produce it, and the plain SyntaxError is protection enough.\nparseIpythonBashCell stays: transcripts from ipykernel-era sessions render\n%%bash cells with shell highlighting forever.\n\n* fix(coding-agent): report a committed destructive snapshot as success even when an interrupt was parked\n\n* chore(ai): drop stray live-regen drift in models.generated.ts\n\nad657d7ec accidentally committed generate-models output produced by a local\nbuild; the catalog belongs to its own regen PRs.\n\n* test(coding-agent): expect a plain SyntaxError for legacy %%bash cells after the magic-rejection gate removal\n\n* fix(coding-agent): consume a finishing-targeted interrupt after a completed state request instead of failing the done\n\n* fix(coding-agent): exit the REPL runtime when its owner dies even during a busy cell\n\n* fix(coding-agent): resolve the kernel bash shell only from trusted absolute paths on Windows\n\n* fix(coding-agent): contain Windows bash children with kill-on-close job objects\n\n* test(coding-agent): cover owner death during a non-yielding REPL cell\n\n* fix(coding-agent): skip concurrently deleted names during snapshot instead of aborting\n\n* fix(coding-agent): fall back to taskkill when job termination fails\n\n* fix(coding-agent): stop telling REPL-default users they need ipykernel\n\n* fix(coding-agent): clear the SIGINT target when its request finishes\n\n* test(coding-agent): drop migration-era wording from the %%bash rejection comment\n\n* fix(coding-agent): start Windows bash children suspended and fail closed when job containment cannot be established\n\n* fix(coding-agent): re-assert the kernel SIGINT handler between cells so a cell rebinding SIGINT cannot break interrupts\n\n* fix(coding-agent): kill the whole tree for enriched orphan records on Windows force-stop\n\nstopTrackedProcess signals only the shell pid on Windows; use killOrphanProcess (taskkill /T) after the identity check, matching the owned-session-worker and daemon-supervisor reapers.\n\n* docs(coding-agent): describe current magic-cell behavior in release notes\n\nMagic-style cells fail with a plain SyntaxError; the migration error and %cd/%env rewrites were removed, so the notes stop claiming them.\n\n* fix(coding-agent): skip the liveness check when the orphan identity is stale\n\nA reused pid looked like a failed kill after the identity re-check skipped taskkill, blocking worker cleanup with a spurious failure.\n\n* fix(coding-agent): journal Windows bash() children before job assignment so a kernel kill mid-spawn cannot leak an unjournaled suspended process\n\n* fix(coding-agent): pre-create the Windows bash() job before spawn and contain the child before the journal start-id query\n\n* fix(coding-agent): create Windows bash() children atomically inside the kill-on-close job via PROC_THREAD_ATTRIBUTE_JOB_LIST, closing the Popen-to-assignment leak window\n\n* chore(coding-agent): compress the atomic-job-association comments to one-line rationale\n\n* fix(coding-agent): send duplicate-id protocol errors outside the interrupt lock and reject int payloads in the captured stdout buffer\n\n* docs(coding-agent): update the kernel provisioner docstring for the REPL/IPython split\n\n* fix(coding-agent): retain the Windows bash() process handle through job cleanup and taskkill fallbacks so a recycled pid can never be killed\n\n* fix(coding-agent): serialize Windows bash() abort cleanup under the kill lock so shutdown taskkill can never race the process-handle close\n\n* fix(coding-agent): commit REPL snapshot payload and manifest atomically via unique temp files with guaranteed cleanup and parked-SIGINT restore\n\n* fix(coding-agent): stage REPL restore before an interrupt-parked apply and recover committed snapshot/restore results from protocol interrupts so a committed operation is never misreported as failed\n\n* chore(coding-agent): compress restore-shield rationale comments to one line each\n\n* fix(coding-agent): surface unattributed background output in IPython cell details and render it after the traceback in the expanded cell view\n\n* docs(coding-agent): replace stale Jupyter comm vocabulary in rlm-runtime failure modes and focused validation with stdio-transport equivalents\n\n* docs(coding-agent): describe the REPL trust boundary and runtime-bootstrap failure in stdio terms and drop the removed TokenUsage export\n\n* fix(runtime): address REPL review findings\n\n* fix(runtime): preserve near-cap snapshots\n\n---------\n\nCo-authored-by: Seth <seth@primeintellect.ai>"},{"name":"ipython-cell-diff.test.ts","kind":"file","size":20502,"lastCommitHash":"032e3ee74574ca16efaf8745a1394b821256a5d0","lastCommitWhen":"2026-08-18T12:17:35+02:00","lastCommitMessage":"chore: remove redundant comments and unused internals (#1505)\n\n* chore: remove redundant comments\n\n* chore(tui): remove redundant export comments\n\n* chore(coding-agent): remove redundant example comments\n\n* chore(ai): remove redundant comments\n\n* chore(coding-agent): remove obsolete core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant rpc test comments\n\n* chore(coding-agent): remove redundant CLI comments\n\n* chore(agent): remove redundant comments\n\n* chore(tui): remove redundant source comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(ai): remove redundant source comments\n\n* chore(coding-agent): remove redundant session comments\n\n* chore(coding-agent): remove redundant core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(tests): remove redundant test comments\n\n* chore: remove unused internal helpers\n\n* docs: restore public API contracts\n\n* chore(coding-agent): restore invariant documentation\n\n* chore(coding-agent): clarify agent family contracts\n\n* style(coding-agent): format restored contracts\n\n* fix: restore intentional catch explanations"},{"name":"ipython-cell-wrap.test.ts","kind":"file","size":2998,"lastCommitHash":"032e3ee74574ca16efaf8745a1394b821256a5d0","lastCommitWhen":"2026-08-18T12:17:35+02:00","lastCommitMessage":"chore: remove redundant comments and unused internals (#1505)\n\n* chore: remove redundant comments\n\n* chore(tui): remove redundant export comments\n\n* chore(coding-agent): remove redundant example comments\n\n* chore(ai): remove redundant comments\n\n* chore(coding-agent): remove obsolete core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant rpc test comments\n\n* chore(coding-agent): remove redundant CLI comments\n\n* chore(agent): remove redundant comments\n\n* chore(tui): remove redundant source comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(ai): remove redundant source comments\n\n* chore(coding-agent): remove redundant session comments\n\n* chore(coding-agent): remove redundant core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(tests): remove redundant test comments\n\n* chore: remove unused internal helpers\n\n* docs: restore public API contracts\n\n* chore(coding-agent): restore invariant documentation\n\n* chore(coding-agent): clarify agent family contracts\n\n* style(coding-agent): format restored contracts\n\n* fix: restore intentional catch explanations"},{"name":"ipython-provisioner.test.ts","kind":"file","size":15449,"lastCommitHash":"853041ec88f550f4e8d07e523cad82fbbb7e44f9","lastCommitWhen":"2026-08-29T11:08:24+02:00","lastCommitMessage":"fix(coding-agent): abort every in-flight bash command with its own controller (#1882)\n\n* fix(coding-agent): give each executeBash invocation its own abort controller\n\nConcurrent execute_bash_and_wait daemon commands shared the single _bashAbortController field: the first finisher cleared the second command's controller and abortBash could only target the most recent command, leaving earlier still-running commands unabortable. Track per-invocation controllers in a set; abortBash aborts all in-flight commands. Fixes ENG-5752.\n\n* fix(coding-agent): flag pending user bash abort while other bash commands run\n\nabortBash only set _userBashAbortRequested when no abort controllers were registered, so an abort arriving during user_bash extension dispatch was lost when a concurrent executeBash occupied the controller set and the user bash still started. Set the flag whenever a user bash is running; runUserBash clears it at each start. Also reword the per-invocation controller comments to present-tense behavior.\n\n* test(coding-agent): update fake REPLs to protocol 3\n\n---------\n\nCo-authored-by: Xeophon <46377542+xeophon@users.noreply.github.com>"},{"name":"kernel-agent-message-skill.test.ts","kind":"file","size":9551,"lastCommitHash":"d60fab8a76d9c169f945341f0ee3bde21903bb55","lastCommitWhen":"2026-08-28T17:40:01+02:00","lastCommitMessage":"fix(coding-agent): repair corrupt REPL protocol frames (#1839)\n\n* refactor(coding-agent): unify kernel shutdown\n\n* docs(coding-agent): carry over shutdown rationale comments\n\n* fix(coding-agent): repair corrupt REPL protocol\n\n* fix(coding-agent): cancel the final kernel snapshot before disposal cleanup\n\n* fix(coding-agent): block new executions from splicing ahead of the final dispose snapshot\n\nflushSnapshotForDispose captured the execution queue while the kernel\nstate was still 'running', so a concurrent execute() (which has no\nper-cell timeout) could enqueue after the capture; captureSnapshot then\nqueued behind it and its timeout never started, hanging dispose() and\nshutdown({snapshot:true}) forever. Claim the flush before capturing the\nqueue: non-internal requests are rejected while the final snapshot is\nflushing, keeping every wait on the dispose path bounded.\n\n* fix(coding-agent): close protocol-repair races and bound the repair\n\n- Gate queued requests behind an in-flight repair: a request whose queue\n  slot opens during a repair releases the slot and requeues after the\n  repair, so queued executes/snapshots can no longer run on the empty\n  replacement kernel ahead of restoreState (and overwrite its result or\n  clobber the last good snapshot).\n- Race the repair wait in execute() with opts.signal so an aborted call\n  returns its aborted result promptly instead of pending through repair.\n- Bound the repair's restore with REPAIR_RESTORE_TIMEOUT_MS so a stalled\n  replacement cannot wedge protocolRepairPromise (and every later\n  execute) forever; a timed-out restore discards the replacement and\n  returns to clean idle.\n- Stop respawn-looping when the replacement kernel itself emits a corrupt\n  frame during repair: discard it and settle at clean idle instead of\n  superseding into an unbounded chain of repairs.\n\n* fix(coding-agent): re-bootstrap repaired kernels and gate busy-waiting cells\n\n- A protocol-repaired kernel restored only the user namespace, so live\n  handles (rlm, bash, skills) were missing and the next cell failed with\n  NameErrors. KernelManagerOptions gains bootstrapCode (the provisioner\n  passes its buildRlmBootstrapCode output); the repair re-runs it after\n  restore, bounded like the restore, and discards the replacement to\n  clean idle when it fails.\n- The repair requeue gate only ran right after taking the queue slot, so\n  a cell busy-waiting on an interrupted execution when corruption arrived\n  could proceed onto the unrestored replacement while blocking the\n  repair's restore behind its slot. The gate now sits after the busy-wait\n  (still exempting the repair's own requests), covering both windows.\n- Fold the repeated kill-to-clean-idle teardown into killChildToIdle and\n  rename REPAIR_RESTORE_TIMEOUT_MS to REPAIR_STEP_TIMEOUT_MS since it now\n  bounds restore and bootstrap.\n\n* fix(coding-agent): join concurrent teardowns into one final snapshot flush\n\nConcurrent dispose() and shutdown({ snapshot: true }) (e.g. a session\ndispose racing the SIGINT handler) each ran flushSnapshotForDispose: the\nfirst finisher's finally cleared flushingSnapshotForDispose while the\nsecond was still flushing, dropping the execution guard early and\nenqueueing a duplicate final snapshot behind the first. Memoize the\nin-flight flush so every teardown joins the same bounded flush.\n\n* fix(coding-agent): close protocol repair gaps for schema-invalid frames, startup chunks, and rebootstrap\n\n- Fail the protocol on JSON object frames that violate the frame schema\n  (unknown event kind; done/host_request without a string id) instead of\n  silently dropping them, which left the active request unsettled forever.\n  The protocol version handshake is exact, so unknown kinds are corruption,\n  not forward compatibility.\n- A corrupt frame sharing one stdout chunk with ready no longer lets the\n  startup mark the corrupt child running: failProtocolFrame records the\n  error while starting and doStart fails the start.\n- A fresh kernel started lazily after a discarded repair re-runs the\n  configured runtime bootstrap before serving user code, so rlm/bash/skills\n  handles are never silently missing.\n\n* test(coding-agent): reconcile chain-collapse suites and cover teardown racing the lazy re-bootstrap\n\n- Point the graceful-shutdown flush spies at captureSnapshot: the merged\n  final flush (kernel-snapshot-dispose-timeout) snapshots through the\n  bounded captureSnapshot path, not snapshotState, so the old spies let\n  real snapshot requests hit the mocked wire and leaked fake timers.\n- The superseded repair's booting replacement is now hard-killed without\n  a protocol shutdown (single-kernel-shutdown only drains running\n  kernels), so it may die before journaling its spawn; assert spawn-count\n  stability after teardown instead of an exact boot count.\n- New composition test: a teardown racing an in-flight lazy re-bootstrap\n  stays bounded, spawns nothing new, and settles the raced cell.\n\n* fix(coding-agent): re-check the final-flush guard after the re-bootstrap wait\n\n- An external execute admitted before the final dispose flush could park on\n  the lazy re-bootstrap, then take its queue slot after the flush captured\n  pendingExecutions - splicing between the captured queue and the final\n  snapshot and unbounding the teardown. Re-check the flush guard right\n  after the ensure await; unit test proves the re-check is load-bearing.\n- Deflake the teardown-vs-re-bootstrap composition test: the fake runtime\n  journals its spawn before ready, so poll isRunning before the teardown to\n  race the re-bootstrap deterministically instead of the boot.\n\n* fix(coding-agent): close bot-review gaps in protocol repair and teardown seams\n\n- Terminal frames (done/host_request) with an EMPTY string id now fail the\n  protocol like id-less ones: the runtime mints uuid hex ids and echoes the\n  host's uuids, so an empty id is corruption that previously slipped past\n  the validator into the silent-drop hang.\n- An execution aborted while waiting on the lazy re-bootstrap settles\n  promptly: the wait races the abort signal (same pattern as\n  waitForProtocolRepair) and the aborted request returns before parking on\n  the queue slot behind the still-running bootstrap.\n- A failed kernel startup awaits its own teardown (final snapshot flush\n  included) before surfacing the error, so a replacement provisioner gated\n  on this dispose can no longer race the still-flushing kernel over the\n  same snapshot files.\n- restart() during the final dispose flush is rejected instead of taking a\n  queue slot and joining the owning shutdown, which could deadlock the\n  flush's snapshot behind the held slot.\n\n* test(coding-agent): cover empty-string host_request ids in the frame validator\n\nKills the surviving mutant that relaxed the host_request half of the\nnon-empty-id requirement back to typeof-only: an empty-id host_request now\nhas a corruption test mirroring the empty-id done one (protocol fails and\nthe kernel is repaired instead of the awaiting cell hanging).\n\n* fix(coding-agent): restore the saved namespace on lazily reprovisioned kernels\n\nAfter a discarded repair whose failure never implicated the snapshot (the\nrepair start died, or only its bootstrap failed), the lazily started fresh\nkernel re-ran the bootstrap but silently abandoned the user's saved\nnamespace forever. Track restore separately: killChildToIdle marks both\npending; the two snapshot-culprit discard paths (clean restore failure,\nreplacement corrupted mid-repair) clear the restore flag so a poisoned\nsnapshot is never retried; the lazy path restores one-shot best-effort\n(ordinary startup semantics) before bootstrapping, and a teardown's final\nsnapshot never triggers reprovisioning. Restore-attempt journaling in the\nfake runtime pins the no-retry and no-double-restore semantics.\n\n* fix(coding-agent): protect the saved snapshot from unrestored kernels; phase-aware corruption attribution\n\n- The final dispose flush skips its snapshot while pendingRestore is set:\n  a kernel that never restored the saved namespace must not overwrite it\n  (the on-disk snapshot is strictly fresher). One interleaving-independent\n  condition instead of joining the reprovision promise, which would\n  reintroduce the 30-60s teardown stall the teardown guard prevents. The\n  lazy one-shot clear moves after the corruption check so the flag also\n  covers a flush racing an in-flight lazy restore.\n- The repair give-up path attributes corruption by phase: performRestore\n  clears pendingRestore on success, so the flag still being set means the\n  corruption struck at or before the restore (snapshot stays the prime\n  suspect, loop-safe); corruption strictly after a successful restore\n  keeps the namespace restorable at the cost of at most one bounded\n  restore per later attempt."},{"name":"kernel-agent-observe-skill.test.ts","kind":"file","size":4043,"lastCommitHash":"2c30b48b4b05c4e7efd184dc13bc0ed7daa1c2a4","lastCommitWhen":"2026-07-01T18:53:02-07:00","lastCommitMessage":"Add user orchestrator for agent messaging and observation (#207)\n\n* Add user orchestrator agent messaging and observe\n\n* Add orchestration heartbeat skill\n\n* Address user orchestrator PR review comments\n\n* Tighten agent message rate limiting\n\n* Harden agent message queue safety\n\n* Preserve agent message reservations on queue clear\n\n* Serialize agent messages per target\n\n* Handle queued agent message edge cases\n\n* Preserve orchestration heartbeat schedule on refresh\n\n* Fix agent message queue handling\n\n* Fix agent message review issues\n\n* Defer agent message acknowledgment past stream start\n\n* Fix agent message acceptance race\n\n* Avoid blocking agent message send on pre-prompt work\n\n* Avoid blocking agent messages on pre-prompt hooks\n\n* Hide daemon prompt fast path from public options\n\n* fix(coding-agent): harden agent message delivery\n\n* fix(coding-agent): keep failed agent messages from consuming limits\n\n* fix(coding-agent): address agent orchestrator review issues\n\n* fix(coding-agent): address agent orchestrator review issues\n\n* fix(coding-agent): queue sends during accepted retries\n\n* fix(coding-agent): address remaining orchestrator bot findings\n\n* test(coding-agent): update streaming prompt guard expectation\n\n* test(coding-agent): remove duplicate daemon queue case\n\n* fix(coding-agent): harden prompt acceptance races\n\n* fix(coding-agent): serialize agent message clearing\n\n* fix(coding-agent): lock agent message safety controls\n\n* fix(coding-agent): harden agent message pause\n\n* fix(coding-agent): queue agent messages internally\n\n* fix(coding-agent): release prompt lock when streaming starts\n\n* fix(coding-agent): reject messages paused while locked\n\n* fix(coding-agent): reject messages after session switch\n\n* fix(coding-agent): serialize session close with messages\n\n* fix(coding-agent): reject messages for closing sessions\n\n* fix(coding-agent): queue messages during compaction\n\n* fix(coding-agent): avoid blocking messages during prompt prep\n\n* fix(coding-agent): track queued agent messages\n\n* fix(coding-agent): preserve agent message queue identity\n\nFixes #207\n\n* fix(coding-agent): parse canonical agent message ids\n\nFixes #207\n\n* fix(coding-agent): clear accepted agent messages\n\nFixes #207\n\n* fix(coding-agent): sanitize agent message metadata\n\nFixes #207\n\n* fix(coding-agent): suppress cleared accepted messages\n\nFixes #207\n\n* fix(coding-agent): clear accepted prompt state on failure\n\nFixes #207\n\n* fix(coding-agent): account for accepted message delivery\n\nFixes #207\n\n* fix(coding-agent): close accepted prompt busy gap\n\nFixes #207\n\n* fix(coding-agent): harden accepted message cleanup\n\nFixes #207\n\n* fix(coding-agent): report accepted messages as pending\n\nFixes #207\n\n* fix(coding-agent): wait for accepted message delivery\n\nFixes #207\n\n* fix(coding-agent): report duplicate follow-up preflight\n\nFixes #207\n\n* fix(coding-agent): reject cleared accepted messages\n\nFixes #207\n\n* fix(coding-agent): reject failed agent message delivery\n\nFixes #207\n\n* fix(coding-agent): emit cleared accepted agent end\n\nFixes #207\n\n* fix(coding-agent): unblock idle prompts after agent delivery\n\nFixes #207\n\n* fix(coding-agent): wait for agent message delivery\n\nFixes #207\n\n* fix(coding-agent): avoid direct delivery waiter hang\n\nFixes #207\n\n* fix(coding-agent): settle late agent message waits\n\nFixes #207\n\n* fix(coding-agent): reject delivery waits on dispose\n\nFixes #207\n\n* fix(coding-agent): acknowledge queued agent messages\n\n* fix(coding-agent): review fixes for agent messaging admission, capacity, lifecycle, and CLI parsing\n\n* fix(coding-agent): drain agent messages after bash\n\n* fix(coding-agent): preserve queued message order after bash\n\n* fix(coding-agent): resolve queued agent-message sends without blocking on delivery; settle waiters on abort\n\n* fix(coding-agent): report busy observed sessions\n\n* fix(coding-agent): settle agent-message lifecycle edge cases\n\n* fix(coding-agent): keep deferred agent messages ordered\n\n* fix(coding-agent): harden queued message cleanup\n\n* fix(coding-agent): report queued direct accepts\n\n* fix(coding-agent): harden agent message delivery state\n\n* fix(coding-agent): restore next-turn context after failed accept\n\n* fix(coding-agent): defer cron while agent accepts messages\n\n* fix(coding-agent): queue cron during agent-message accept\n\n* fix(coding-agent): normalize orchestration heartbeat intervals\n\n* fix(coding-agent): recheck busy state before direct accept\n\n* fix(coding-agent): preserve next-turn context in queued accepts\n\n* fix(coding-agent): settle queued accept edge cases\n\n* fix(coding-agent): serialize daemon prompts with agent messages\n\n---------\n\nCo-authored-by: Kevin Thomas <kevin.jt2007@gmail.com>"},{"name":"kernel-attach-image-skill.test.ts","kind":"file","size":9989,"lastCommitHash":"61eb64748eb077e2a084432db92d101a2a83e146","lastCommitWhen":"2026-08-26T15:24:10-07:00","lastCommitMessage":"Minimal CPython REPL runtime (rlm.repl) (#1685)\n\n* feat(coding-agent): add async-by-default bash() to the kernel runtime\n\n* chore(coding-agent): tighten bash() comments and changelog fragment\n\n* feat(coding-agent): add a standalone CPython REPL runtime speaking JSON lines over stdio\n\n* chore(coding-agent): tighten REPL runtime comments\n\n* feat(coding-agent): run the kernel on the REPL runtime over stdio\n\n* fix(coding-agent): reject pending host requests on kernel teardown\n\nThe runtime now fails pending host_request futures when stdin hits EOF or\na shutdown request arrives, so a cell awaiting a host reply can no longer\nblock _serve from consuming the shutdown and wedge the process. Startup\nand busy-kernel messages plus the ipython tool description now say Python\nkernel, matching the default REPL runtime client.\n\n* chore(coding-agent): describe the kernel-heavy test tag client-neutrally\n\n* feat(coding-agent): make the REPL runtime the only kernel\n\nRemoves the Jupyter/ipykernel/ZMQ kernel client, the fork server, the\nPRIME_AGENT_KERNEL escape hatch, and the %%bash/%cd/%env cell rewriting.\nMagic-style cells (%/%%/!) return a one-line error naming the Python or\nbash() replacement. The kernel venv no longer installs ipykernel;\nexisting venvs are rebuilt once via the bootstrap schema bump. Old\nsnapshot artifacts still restore through the runtime's pickle compat.\n\n* fix(coding-agent): close MCP transports in REPL shutdown\n\n* fix(coding-agent): address bash() review findings — exact tail retention, foreground-status lifecycle with group anchoring, post-kill forkserver reap, Windows start-id parity, executor-free await\n\n* fix(coding-agent): tree-kill bash() process trees on Windows and make running reflect group liveness\n\n* fix(runtime): address repl runtime review findings\n\n- revalidate targeted interrupts through SIGINT delivery so a stale signal\n  cannot cancel a later request\n- preserve a parked untargeted interrupt while another request is inflight\n- reject non-string interrupt ids and validate snapshot options\n  (prune_oversized bool, max_bytes/max_variable_bytes present => int)\n- guard str(exc) in error/skip/fail reasons so a broken __str__ cannot\n  kill the runtime\n- fail the snapshot when the manifest write fails (before any pruning)\n- report 'snapshot not found' reason on restore of a missing path\n- wait unbounded for the output-pump drain marker so done never precedes\n  captured output and marker bytes never leak\n- document that aggregate-cap skips are not pruned\n\n* fix(coding-agent): carry bash() status pipe as stdin so strict-POSIX shells accept single-digit fd redirections\n\n* fix(coding-agent): address host-swap review findings — runtime-neutral kernel wording, %cd/%env rewrite fidelity, linear-time magic regexes, restart supersession guard\n\n* fix(coding-agent): reject stale column-0 line magics on any cell line, not just the first\n\n* fix(coding-agent): close status fds when wake-pipe creation fails and gate bash() commands on orphan-journal registration\n\n* fix(coding-agent): strip quoted %cd targets, use UTF-16-safe %env parsing, and expand $var/${var} values PEP-215-style\n\n* fix(coding-agent): fail rlm.run fast outside a live kernel so vitest workers cannot hang on a comm that never replies\n\n* fix(coding-agent): clear the active cell id before terminal events so late background output is never tagged with a finished cell\n\n* fix(coding-agent): update legacy IPython-era tests to assert cutover behavior\n\n* fix(coding-agent): describe the column-0 magic scan without referencing the removed rewrite backend\n\n* fix(coding-agent): consume parked interrupts on compile failures and survive user-closed stdio in the drain path\n\n* fix(coding-agent): redact bare %env listings, prefer '=' in %env parsing, echo %cd targets, and keep graceful shutdowns owning their cleanup\n\n* fix(coding-agent): reject kernel startup promptly on spawn errors and commit %cd previous-dir tracking only after chdir succeeds\n\n* fix(coding-agent): trim ParsedIpythonBashCell to the body field its callers use\n\n* fix(coding-agent): kill full process trees in the Windows orphan reaper via taskkill /T\n\n* fix(coding-agent): survive compile-phase crashes and fd-reuse drain hangs in the REPL runtime\n\n* fix(coding-agent): shield snapshot prune deletions from interrupts and pin the host comm probe to its real seam\n\n* fix(coding-agent): route list_names through the per-request backstop and skip non-string namespace keys\n\n* fix(coding-agent): reject snapshot requests whose manifest path aliases the payload path\n\n* fix(coding-agent): reject negative snapshot size caps that would prune every user variable\n\n* fix(coding-agent): kill one-shot await bash() on cancel, resolve Windows helpers via System32, retry taskkill after reap, and fail closed on orphan-journal enrollment\n\n* fix(coding-agent): attribute REPL stream output at write time so raw fd and user-thread bytes never carry another cell's id\n\n* fix(coding-agent): surface unattributed REPL stream output as separate background output instead of dropping or merging it\n\n* fix(coding-agent): confirm group exit before a cancelled one-shot bash() await propagates and complete-write orphan-journal records\n\n* fix(coding-agent): expose a working sys.stdout.buffer on the tagged REPL writer routing bytes through the null-attributed raw channel\n\n* fix(coding-agent): mark between-cell background output truncated when the pending buffer cap is hit\n\n* fix(coding-agent): shield the cancelled-await bash() confirm-exit from re-cancellation, fail clearly without bash on Windows, and fence slow pumps out of result assembly\n\n* fix(coding-agent): survive hostile protocol lines in the REPL reader thread and interrupt without pthread_kill on Windows\n\n* fix(coding-agent): send the protocol shutdown from dispose() so the runtime closes MCP servers and kills live bash groups before the hard kill\n\n* fix(coding-agent): flag the pump's read-to-commit window so the bash() drain fence cannot miss an in-flight chunk\n\n* fix(coding-agent): guard the whole REPL request line against hostile input, reject duplicate in-flight ids, complete short buffer-pipe writes, and clean the snapshot temp file on KeyboardInterrupt\n\n* fix(coding-agent): drop stale between-cell background output on kernel teardown so it cannot surface after a restart\n\n* fix(coding-agent): assert the tagged channel only in the large buffer-write REPL test since cross-channel ordering is not guaranteed\n\n* fix(coding-agent): resolve taskkill via absolute System32 path in the host orphan reaper\n\n* fix(coding-agent): write the inactive orphan-journal record only after a delivered kill so undelivered signals leave the host reaper in charge\n\n* fix(coding-agent): keep a REPL request interrupt-targetable through its trailing-expression repr and output drain until done is emitted\n\n* fix(coding-agent): count an already-exited leader as delivered in the Windows bash() reap so clean exits still journal inactive\n\n* fix(coding-agent): reject NaN and Infinity in emit() payloads before they corrupt REPL protocol framing\n\n* chore(coding-agent): correct the stale ipykernel requirement on the python override doc\n\n* chore(coding-agent): drop migration-era wording from kernel comments\n\n* fix(coding-agent): resolve trusted absolute shell host-side and close Windows journal/reap gaps\n\n* fix(coding-agent): best-effort-kill pid-only orphan records in daemon force-stop and recovery reaps\n\n* refactor(coding-agent): drop the magic-cell rejection gate\n\n%-prefixed and !-prefixed cells now reach CPython and fail with its own\nSyntaxError, which names the offending line. The rejection layer guarded\nagainst model-produced IPython syntax, but with the shipped prompt fresh\nsessions do not produce it, and the plain SyntaxError is protection enough.\nparseIpythonBashCell stays: transcripts from ipykernel-era sessions render\n%%bash cells with shell highlighting forever.\n\n* fix(coding-agent): report a committed destructive snapshot as success even when an interrupt was parked\n\n* chore(ai): drop stray live-regen drift in models.generated.ts\n\nad657d7ec accidentally committed generate-models output produced by a local\nbuild; the catalog belongs to its own regen PRs.\n\n* test(coding-agent): expect a plain SyntaxError for legacy %%bash cells after the magic-rejection gate removal\n\n* fix(coding-agent): consume a finishing-targeted interrupt after a completed state request instead of failing the done\n\n* fix(coding-agent): exit the REPL runtime when its owner dies even during a busy cell\n\n* fix(coding-agent): resolve the kernel bash shell only from trusted absolute paths on Windows\n\n* fix(coding-agent): contain Windows bash children with kill-on-close job objects\n\n* test(coding-agent): cover owner death during a non-yielding REPL cell\n\n* fix(coding-agent): skip concurrently deleted names during snapshot instead of aborting\n\n* fix(coding-agent): fall back to taskkill when job termination fails\n\n* fix(coding-agent): stop telling REPL-default users they need ipykernel\n\n* fix(coding-agent): clear the SIGINT target when its request finishes\n\n* test(coding-agent): drop migration-era wording from the %%bash rejection comment\n\n* fix(coding-agent): start Windows bash children suspended and fail closed when job containment cannot be established\n\n* fix(coding-agent): re-assert the kernel SIGINT handler between cells so a cell rebinding SIGINT cannot break interrupts\n\n* fix(coding-agent): kill the whole tree for enriched orphan records on Windows force-stop\n\nstopTrackedProcess signals only the shell pid on Windows; use killOrphanProcess (taskkill /T) after the identity check, matching the owned-session-worker and daemon-supervisor reapers.\n\n* docs(coding-agent): describe current magic-cell behavior in release notes\n\nMagic-style cells fail with a plain SyntaxError; the migration error and %cd/%env rewrites were removed, so the notes stop claiming them.\n\n* fix(coding-agent): skip the liveness check when the orphan identity is stale\n\nA reused pid looked like a failed kill after the identity re-check skipped taskkill, blocking worker cleanup with a spurious failure.\n\n* fix(coding-agent): journal Windows bash() children before job assignment so a kernel kill mid-spawn cannot leak an unjournaled suspended process\n\n* fix(coding-agent): pre-create the Windows bash() job before spawn and contain the child before the journal start-id query\n\n* fix(coding-agent): create Windows bash() children atomically inside the kill-on-close job via PROC_THREAD_ATTRIBUTE_JOB_LIST, closing the Popen-to-assignment leak window\n\n* chore(coding-agent): compress the atomic-job-association comments to one-line rationale\n\n* fix(coding-agent): send duplicate-id protocol errors outside the interrupt lock and reject int payloads in the captured stdout buffer\n\n* docs(coding-agent): update the kernel provisioner docstring for the REPL/IPython split\n\n* fix(coding-agent): retain the Windows bash() process handle through job cleanup and taskkill fallbacks so a recycled pid can never be killed\n\n* fix(coding-agent): serialize Windows bash() abort cleanup under the kill lock so shutdown taskkill can never race the process-handle close\n\n* fix(coding-agent): commit REPL snapshot payload and manifest atomically via unique temp files with guaranteed cleanup and parked-SIGINT restore\n\n* fix(coding-agent): stage REPL restore before an interrupt-parked apply and recover committed snapshot/restore results from protocol interrupts so a committed operation is never misreported as failed\n\n* chore(coding-agent): compress restore-shield rationale comments to one line each\n\n* fix(coding-agent): surface unattributed background output in IPython cell details and render it after the traceback in the expanded cell view\n\n* docs(coding-agent): replace stale Jupyter comm vocabulary in rlm-runtime failure modes and focused validation with stdio-transport equivalents\n\n* docs(coding-agent): describe the REPL trust boundary and runtime-bootstrap failure in stdio terms and drop the removed TokenUsage export\n\n* fix(runtime): address REPL review findings\n\n* fix(runtime): preserve near-cap snapshots\n\n---------\n\nCo-authored-by: Seth <seth@primeintellect.ai>"},{"name":"kernel-bash-shell.test.ts","kind":"file","size":2076,"lastCommitHash":"0940833b771fbaf5144451988604b310a96722fd","lastCommitWhen":"2026-08-26T14:41:46-07:00","lastCommitMessage":"Async bash() tool for the kernel runtime (#1684)\n\n* feat(coding-agent): add async-by-default bash() to the kernel runtime\n\n* chore(coding-agent): tighten bash() comments and changelog fragment\n\n* fix(coding-agent): address bash() review findings — exact tail retention, foreground-status lifecycle with group anchoring, post-kill forkserver reap, Windows start-id parity, executor-free await\n\n* fix(coding-agent): tree-kill bash() process trees on Windows and make running reflect group liveness\n\n* fix(coding-agent): carry bash() status pipe as stdin so strict-POSIX shells accept single-digit fd redirections\n\n* fix(coding-agent): close status fds when wake-pipe creation fails and gate bash() commands on orphan-journal registration\n\n* fix(coding-agent): kill full process trees in the Windows orphan reaper via taskkill /T\n\n* fix(coding-agent): kill one-shot await bash() on cancel, resolve Windows helpers via System32, retry taskkill after reap, and fail closed on orphan-journal enrollment\n\n* fix(coding-agent): confirm group exit before a cancelled one-shot bash() await propagates and complete-write orphan-journal records\n\n* fix(coding-agent): shield the cancelled-await bash() confirm-exit from re-cancellation, fail clearly without bash on Windows, and fence slow pumps out of result assembly\n\n* fix(coding-agent): flag the pump's read-to-commit window so the bash() drain fence cannot miss an in-flight chunk\n\n* fix(coding-agent): resolve taskkill via absolute System32 path in the host orphan reaper\n\n* fix(coding-agent): write the inactive orphan-journal record only after a delivered kill so undelivered signals leave the host reaper in charge\n\n* fix(coding-agent): count an already-exited leader as delivered in the Windows bash() reap so clean exits still journal inactive\n\n* fix(coding-agent): resolve trusted absolute shell host-side and close Windows journal/reap gaps\n\n* fix(coding-agent): best-effort-kill pid-only orphan records in daemon force-stop and recovery reaps\n\n* fix(coding-agent): resolve the kernel bash shell only from trusted absolute paths on Windows\n\n* fix(coding-agent): contain Windows bash children with kill-on-close job objects\n\n* fix(coding-agent): fall back to taskkill when job termination fails\n\n* fix(coding-agent): start Windows bash children suspended and fail closed when job containment cannot be established\n\n* fix(coding-agent): kill the whole tree for enriched orphan records on Windows force-stop\n\nstopTrackedProcess signals only the shell pid on Windows; use killOrphanProcess (taskkill /T) after the identity check, matching the owned-session-worker and daemon-supervisor reapers.\n\n* fix(coding-agent): skip the liveness check when the orphan identity is stale\n\nA reused pid looked like a failed kill after the identity re-check skipped taskkill, blocking worker cleanup with a spurious failure.\n\n* fix(coding-agent): journal Windows bash() children before job assignment so a kernel kill mid-spawn cannot leak an unjournaled suspended process\n\n* fix(coding-agent): pre-create the Windows bash() job before spawn and contain the child before the journal start-id query\n\n* fix(coding-agent): create Windows bash() children atomically inside the kill-on-close job via PROC_THREAD_ATTRIBUTE_JOB_LIST, closing the Popen-to-assignment leak window\n\n* chore(coding-agent): compress the atomic-job-association comments to one-line rationale\n\n* fix(coding-agent): retain the Windows bash() process handle through job cleanup and taskkill fallbacks so a recycled pid can never be killed\n\n* fix(coding-agent): serialize Windows bash() abort cleanup under the kill lock so shutdown taskkill can never race the process-handle close"},{"name":"kernel-bootstrap.test.ts","kind":"file","size":19213,"lastCommitHash":"61eb64748eb077e2a084432db92d101a2a83e146","lastCommitWhen":"2026-08-26T15:24:10-07:00","lastCommitMessage":"Minimal CPython REPL runtime (rlm.repl) (#1685)\n\n* feat(coding-agent): add async-by-default bash() to the kernel runtime\n\n* chore(coding-agent): tighten bash() comments and changelog fragment\n\n* feat(coding-agent): add a standalone CPython REPL runtime speaking JSON lines over stdio\n\n* chore(coding-agent): tighten REPL runtime comments\n\n* feat(coding-agent): run the kernel on the REPL runtime over stdio\n\n* fix(coding-agent): reject pending host requests on kernel teardown\n\nThe runtime now fails pending host_request futures when stdin hits EOF or\na shutdown request arrives, so a cell awaiting a host reply can no longer\nblock _serve from consuming the shutdown and wedge the process. Startup\nand busy-kernel messages plus the ipython tool description now say Python\nkernel, matching the default REPL runtime client.\n\n* chore(coding-agent): describe the kernel-heavy test tag client-neutrally\n\n* feat(coding-agent): make the REPL runtime the only kernel\n\nRemoves the Jupyter/ipykernel/ZMQ kernel client, the fork server, the\nPRIME_AGENT_KERNEL escape hatch, and the %%bash/%cd/%env cell rewriting.\nMagic-style cells (%/%%/!) return a one-line error naming the Python or\nbash() replacement. The kernel venv no longer installs ipykernel;\nexisting venvs are rebuilt once via the bootstrap schema bump. Old\nsnapshot artifacts still restore through the runtime's pickle compat.\n\n* fix(coding-agent): close MCP transports in REPL shutdown\n\n* fix(coding-agent): address bash() review findings — exact tail retention, foreground-status lifecycle with group anchoring, post-kill forkserver reap, Windows start-id parity, executor-free await\n\n* fix(coding-agent): tree-kill bash() process trees on Windows and make running reflect group liveness\n\n* fix(runtime): address repl runtime review findings\n\n- revalidate targeted interrupts through SIGINT delivery so a stale signal\n  cannot cancel a later request\n- preserve a parked untargeted interrupt while another request is inflight\n- reject non-string interrupt ids and validate snapshot options\n  (prune_oversized bool, max_bytes/max_variable_bytes present => int)\n- guard str(exc) in error/skip/fail reasons so a broken __str__ cannot\n  kill the runtime\n- fail the snapshot when the manifest write fails (before any pruning)\n- report 'snapshot not found' reason on restore of a missing path\n- wait unbounded for the output-pump drain marker so done never precedes\n  captured output and marker bytes never leak\n- document that aggregate-cap skips are not pruned\n\n* fix(coding-agent): carry bash() status pipe as stdin so strict-POSIX shells accept single-digit fd redirections\n\n* fix(coding-agent): address host-swap review findings — runtime-neutral kernel wording, %cd/%env rewrite fidelity, linear-time magic regexes, restart supersession guard\n\n* fix(coding-agent): reject stale column-0 line magics on any cell line, not just the first\n\n* fix(coding-agent): close status fds when wake-pipe creation fails and gate bash() commands on orphan-journal registration\n\n* fix(coding-agent): strip quoted %cd targets, use UTF-16-safe %env parsing, and expand $var/${var} values PEP-215-style\n\n* fix(coding-agent): fail rlm.run fast outside a live kernel so vitest workers cannot hang on a comm that never replies\n\n* fix(coding-agent): clear the active cell id before terminal events so late background output is never tagged with a finished cell\n\n* fix(coding-agent): update legacy IPython-era tests to assert cutover behavior\n\n* fix(coding-agent): describe the column-0 magic scan without referencing the removed rewrite backend\n\n* fix(coding-agent): consume parked interrupts on compile failures and survive user-closed stdio in the drain path\n\n* fix(coding-agent): redact bare %env listings, prefer '=' in %env parsing, echo %cd targets, and keep graceful shutdowns owning their cleanup\n\n* fix(coding-agent): reject kernel startup promptly on spawn errors and commit %cd previous-dir tracking only after chdir succeeds\n\n* fix(coding-agent): trim ParsedIpythonBashCell to the body field its callers use\n\n* fix(coding-agent): kill full process trees in the Windows orphan reaper via taskkill /T\n\n* fix(coding-agent): survive compile-phase crashes and fd-reuse drain hangs in the REPL runtime\n\n* fix(coding-agent): shield snapshot prune deletions from interrupts and pin the host comm probe to its real seam\n\n* fix(coding-agent): route list_names through the per-request backstop and skip non-string namespace keys\n\n* fix(coding-agent): reject snapshot requests whose manifest path aliases the payload path\n\n* fix(coding-agent): reject negative snapshot size caps that would prune every user variable\n\n* fix(coding-agent): kill one-shot await bash() on cancel, resolve Windows helpers via System32, retry taskkill after reap, and fail closed on orphan-journal enrollment\n\n* fix(coding-agent): attribute REPL stream output at write time so raw fd and user-thread bytes never carry another cell's id\n\n* fix(coding-agent): surface unattributed REPL stream output as separate background output instead of dropping or merging it\n\n* fix(coding-agent): confirm group exit before a cancelled one-shot bash() await propagates and complete-write orphan-journal records\n\n* fix(coding-agent): expose a working sys.stdout.buffer on the tagged REPL writer routing bytes through the null-attributed raw channel\n\n* fix(coding-agent): mark between-cell background output truncated when the pending buffer cap is hit\n\n* fix(coding-agent): shield the cancelled-await bash() confirm-exit from re-cancellation, fail clearly without bash on Windows, and fence slow pumps out of result assembly\n\n* fix(coding-agent): survive hostile protocol lines in the REPL reader thread and interrupt without pthread_kill on Windows\n\n* fix(coding-agent): send the protocol shutdown from dispose() so the runtime closes MCP servers and kills live bash groups before the hard kill\n\n* fix(coding-agent): flag the pump's read-to-commit window so the bash() drain fence cannot miss an in-flight chunk\n\n* fix(coding-agent): guard the whole REPL request line against hostile input, reject duplicate in-flight ids, complete short buffer-pipe writes, and clean the snapshot temp file on KeyboardInterrupt\n\n* fix(coding-agent): drop stale between-cell background output on kernel teardown so it cannot surface after a restart\n\n* fix(coding-agent): assert the tagged channel only in the large buffer-write REPL test since cross-channel ordering is not guaranteed\n\n* fix(coding-agent): resolve taskkill via absolute System32 path in the host orphan reaper\n\n* fix(coding-agent): write the inactive orphan-journal record only after a delivered kill so undelivered signals leave the host reaper in charge\n\n* fix(coding-agent): keep a REPL request interrupt-targetable through its trailing-expression repr and output drain until done is emitted\n\n* fix(coding-agent): count an already-exited leader as delivered in the Windows bash() reap so clean exits still journal inactive\n\n* fix(coding-agent): reject NaN and Infinity in emit() payloads before they corrupt REPL protocol framing\n\n* chore(coding-agent): correct the stale ipykernel requirement on the python override doc\n\n* chore(coding-agent): drop migration-era wording from kernel comments\n\n* fix(coding-agent): resolve trusted absolute shell host-side and close Windows journal/reap gaps\n\n* fix(coding-agent): best-effort-kill pid-only orphan records in daemon force-stop and recovery reaps\n\n* refactor(coding-agent): drop the magic-cell rejection gate\n\n%-prefixed and !-prefixed cells now reach CPython and fail with its own\nSyntaxError, which names the offending line. The rejection layer guarded\nagainst model-produced IPython syntax, but with the shipped prompt fresh\nsessions do not produce it, and the plain SyntaxError is protection enough.\nparseIpythonBashCell stays: transcripts from ipykernel-era sessions render\n%%bash cells with shell highlighting forever.\n\n* fix(coding-agent): report a committed destructive snapshot as success even when an interrupt was parked\n\n* chore(ai): drop stray live-regen drift in models.generated.ts\n\nad657d7ec accidentally committed generate-models output produced by a local\nbuild; the catalog belongs to its own regen PRs.\n\n* test(coding-agent): expect a plain SyntaxError for legacy %%bash cells after the magic-rejection gate removal\n\n* fix(coding-agent): consume a finishing-targeted interrupt after a completed state request instead of failing the done\n\n* fix(coding-agent): exit the REPL runtime when its owner dies even during a busy cell\n\n* fix(coding-agent): resolve the kernel bash shell only from trusted absolute paths on Windows\n\n* fix(coding-agent): contain Windows bash children with kill-on-close job objects\n\n* test(coding-agent): cover owner death during a non-yielding REPL cell\n\n* fix(coding-agent): skip concurrently deleted names during snapshot instead of aborting\n\n* fix(coding-agent): fall back to taskkill when job termination fails\n\n* fix(coding-agent): stop telling REPL-default users they need ipykernel\n\n* fix(coding-agent): clear the SIGINT target when its request finishes\n\n* test(coding-agent): drop migration-era wording from the %%bash rejection comment\n\n* fix(coding-agent): start Windows bash children suspended and fail closed when job containment cannot be established\n\n* fix(coding-agent): re-assert the kernel SIGINT handler between cells so a cell rebinding SIGINT cannot break interrupts\n\n* fix(coding-agent): kill the whole tree for enriched orphan records on Windows force-stop\n\nstopTrackedProcess signals only the shell pid on Windows; use killOrphanProcess (taskkill /T) after the identity check, matching the owned-session-worker and daemon-supervisor reapers.\n\n* docs(coding-agent): describe current magic-cell behavior in release notes\n\nMagic-style cells fail with a plain SyntaxError; the migration error and %cd/%env rewrites were removed, so the notes stop claiming them.\n\n* fix(coding-agent): skip the liveness check when the orphan identity is stale\n\nA reused pid looked like a failed kill after the identity re-check skipped taskkill, blocking worker cleanup with a spurious failure.\n\n* fix(coding-agent): journal Windows bash() children before job assignment so a kernel kill mid-spawn cannot leak an unjournaled suspended process\n\n* fix(coding-agent): pre-create the Windows bash() job before spawn and contain the child before the journal start-id query\n\n* fix(coding-agent): create Windows bash() children atomically inside the kill-on-close job via PROC_THREAD_ATTRIBUTE_JOB_LIST, closing the Popen-to-assignment leak window\n\n* chore(coding-agent): compress the atomic-job-association comments to one-line rationale\n\n* fix(coding-agent): send duplicate-id protocol errors outside the interrupt lock and reject int payloads in the captured stdout buffer\n\n* docs(coding-agent): update the kernel provisioner docstring for the REPL/IPython split\n\n* fix(coding-agent): retain the Windows bash() process handle through job cleanup and taskkill fallbacks so a recycled pid can never be killed\n\n* fix(coding-agent): serialize Windows bash() abort cleanup under the kill lock so shutdown taskkill can never race the process-handle close\n\n* fix(coding-agent): commit REPL snapshot payload and manifest atomically via unique temp files with guaranteed cleanup and parked-SIGINT restore\n\n* fix(coding-agent): stage REPL restore before an interrupt-parked apply and recover committed snapshot/restore results from protocol interrupts so a committed operation is never misreported as failed\n\n* chore(coding-agent): compress restore-shield rationale comments to one line each\n\n* fix(coding-agent): surface unattributed background output in IPython cell details and render it after the traceback in the expanded cell view\n\n* docs(coding-agent): replace stale Jupyter comm vocabulary in rlm-runtime failure modes and focused validation with stdio-transport equivalents\n\n* docs(coding-agent): describe the REPL trust boundary and runtime-bootstrap failure in stdio terms and drop the removed TokenUsage export\n\n* fix(runtime): address REPL review findings\n\n* fix(runtime): preserve near-cap snapshots\n\n---------\n\nCo-authored-by: Seth <seth@primeintellect.ai>"},{"name":"kernel-goal-skill.test.ts","kind":"file","size":4889,"lastCommitHash":"af14f066c3e2b1dfec94672b78a3fd35a2acbe5a","lastCommitWhen":"2026-08-28T17:39:44+02:00","lastCommitMessage":"fix(coding-agent): dispatcher-owned host-reply envelope (#1836)\n\n* fix host reply result envelope\n\n* docs(coding-agent): drop a stale handler-contract sentence from the merge"},{"name":"kernel-rlm-heartbeat-skill.test.ts","kind":"file","size":5806,"lastCommitHash":"97d933bf6c9e7fae44cdb0bd3a60e8a979cfaf73","lastCommitWhen":"2026-07-09T23:17:30-07:00","lastCommitMessage":"Steer heartbeats by default with configurable delivery mode (#358)\n\n* feat(coding-agent): steer heartbeats by default with configurable delivery mode\n\nScheduled heartbeat prompts now steer (interrupt the current turn) by\ndefault instead of queueing as follow-up messages. Delivery mode is\nconfigurable as \"steer\" or \"follow_up\" for both user /heartbeat jobs and\ninternal rlm_heartbeat jobs, which share the cron scheduler plumbing.\n\n- Add AgentHeartbeatDeliveryMode with DEFAULT_HEARTBEAT_DELIVERY_MODE=steer\n- Persist deliveryMode on heartbeat/rlm_heartbeat cron jobs\n- /heartbeat accepts --steer/--follow-up (and --deliver <mode>)\n- rlm_heartbeat skill create/update accept delivery_mode\n- shouldDeferHeartbeatCronJob is delivery-mode-aware: steer heartbeats\n  interrupt a plain streaming turn, follow_up still defers\n- Update CLI/slash help, autocomplete, protocol/connection types, and docs\n\n* fix(coding-agent): validate heartbeat delivery mode edge cases\n\nAddress Macroscope findings on PR #358:\n\n- Parse delivery flags that appear after the /heartbeat instruction.\n- Normalize and validate daemon heartbeat_set deliveryMode before persisting.\n- Clear stale queued RLM heartbeat follow-ups when only deliveryMode changes.\n\nAdds focused regressions for each case.\n\n* fix(coding-agent): keep middle heartbeat delivery flags literal\n\nConsume /heartbeat delivery flags only from option positions: leading flags,\ntrailing flags, or immediately after the interval. This preserves literal\nmentions of --follow-up/--steer in the middle of free-form instructions while\nstill supporting trailing opt-out syntax.\n\n* fix(coding-agent): clear queued steered heartbeat prompts\n\nAddress Cursor Bugbot's PR #358 finding: steer-delivered heartbeat prompts\ncan queue in the steering queue, so pause/clear/replace cleanup must remove\nthem by heartbeat queue key just like follow-up heartbeat prompts.\n\nAdds queueKey support for steering messages and a regression covering queued\nsteered heartbeat removal.\n\n* fix(coding-agent): reject invalid heartbeat delivery flag values\n\nStrictly validate --deliver values in /heartbeat command option positions so\ninvalid delivery modes cannot silently become part of the instruction text.\n\nKeeps delivery-like text in the middle of free-form instructions literal.\n\n* fix(coding-agent): preserve steering queue keys across restart\n\nSteered heartbeat prompts rely on their heartbeat queue key for pause/clear and\nreplace cleanup. Preserve that key in update-restart snapshots and restore it\nwhen queued steering messages are replayed.\n\n* fix(coding-agent): address heartbeat review findings (fixes #358)\n\n* fix(coding-agent): preserve heartbeat delivery mode (fixes #358)\n\n* fix(coding-agent): preserve queue keys on expanded steer commands\n\nForward queueKey and agentMessageId through AgentSession.steer() for daemon\nsteer commands that use the normal prompt-expansion path. This keeps keyed\ncleanup working for steered heartbeat prompts regardless of restore path.\n\n---------\n\nCo-authored-by: Kevin Thomas <kevin.jt2007@gmail.com>"},{"name":"kernel-state-snapshot.test.ts","kind":"file","size":546,"lastCommitHash":"61eb64748eb077e2a084432db92d101a2a83e146","lastCommitWhen":"2026-08-26T15:24:10-07:00","lastCommitMessage":"Minimal CPython REPL runtime (rlm.repl) (#1685)\n\n* feat(coding-agent): add async-by-default bash() to the kernel runtime\n\n* chore(coding-agent): tighten bash() comments and changelog fragment\n\n* feat(coding-agent): add a standalone CPython REPL runtime speaking JSON lines over stdio\n\n* chore(coding-agent): tighten REPL runtime comments\n\n* feat(coding-agent): run the kernel on the REPL runtime over stdio\n\n* fix(coding-agent): reject pending host requests on kernel teardown\n\nThe runtime now fails pending host_request futures when stdin hits EOF or\na shutdown request arrives, so a cell awaiting a host reply can no longer\nblock _serve from consuming the shutdown and wedge the process. Startup\nand busy-kernel messages plus the ipython tool description now say Python\nkernel, matching the default REPL runtime client.\n\n* chore(coding-agent): describe the kernel-heavy test tag client-neutrally\n\n* feat(coding-agent): make the REPL runtime the only kernel\n\nRemoves the Jupyter/ipykernel/ZMQ kernel client, the fork server, the\nPRIME_AGENT_KERNEL escape hatch, and the %%bash/%cd/%env cell rewriting.\nMagic-style cells (%/%%/!) return a one-line error naming the Python or\nbash() replacement. The kernel venv no longer installs ipykernel;\nexisting venvs are rebuilt once via the bootstrap schema bump. Old\nsnapshot artifacts still restore through the runtime's pickle compat.\n\n* fix(coding-agent): close MCP transports in REPL shutdown\n\n* fix(coding-agent): address bash() review findings — exact tail retention, foreground-status lifecycle with group anchoring, post-kill forkserver reap, Windows start-id parity, executor-free await\n\n* fix(coding-agent): tree-kill bash() process trees on Windows and make running reflect group liveness\n\n* fix(runtime): address repl runtime review findings\n\n- revalidate targeted interrupts through SIGINT delivery so a stale signal\n  cannot cancel a later request\n- preserve a parked untargeted interrupt while another request is inflight\n- reject non-string interrupt ids and validate snapshot options\n  (prune_oversized bool, max_bytes/max_variable_bytes present => int)\n- guard str(exc) in error/skip/fail reasons so a broken __str__ cannot\n  kill the runtime\n- fail the snapshot when the manifest write fails (before any pruning)\n- report 'snapshot not found' reason on restore of a missing path\n- wait unbounded for the output-pump drain marker so done never precedes\n  captured output and marker bytes never leak\n- document that aggregate-cap skips are not pruned\n\n* fix(coding-agent): carry bash() status pipe as stdin so strict-POSIX shells accept single-digit fd redirections\n\n* fix(coding-agent): address host-swap review findings — runtime-neutral kernel wording, %cd/%env rewrite fidelity, linear-time magic regexes, restart supersession guard\n\n* fix(coding-agent): reject stale column-0 line magics on any cell line, not just the first\n\n* fix(coding-agent): close status fds when wake-pipe creation fails and gate bash() commands on orphan-journal registration\n\n* fix(coding-agent): strip quoted %cd targets, use UTF-16-safe %env parsing, and expand $var/${var} values PEP-215-style\n\n* fix(coding-agent): fail rlm.run fast outside a live kernel so vitest workers cannot hang on a comm that never replies\n\n* fix(coding-agent): clear the active cell id before terminal events so late background output is never tagged with a finished cell\n\n* fix(coding-agent): update legacy IPython-era tests to assert cutover behavior\n\n* fix(coding-agent): describe the column-0 magic scan without referencing the removed rewrite backend\n\n* fix(coding-agent): consume parked interrupts on compile failures and survive user-closed stdio in the drain path\n\n* fix(coding-agent): redact bare %env listings, prefer '=' in %env parsing, echo %cd targets, and keep graceful shutdowns owning their cleanup\n\n* fix(coding-agent): reject kernel startup promptly on spawn errors and commit %cd previous-dir tracking only after chdir succeeds\n\n* fix(coding-agent): trim ParsedIpythonBashCell to the body field its callers use\n\n* fix(coding-agent): kill full process trees in the Windows orphan reaper via taskkill /T\n\n* fix(coding-agent): survive compile-phase crashes and fd-reuse drain hangs in the REPL runtime\n\n* fix(coding-agent): shield snapshot prune deletions from interrupts and pin the host comm probe to its real seam\n\n* fix(coding-agent): route list_names through the per-request backstop and skip non-string namespace keys\n\n* fix(coding-agent): reject snapshot requests whose manifest path aliases the payload path\n\n* fix(coding-agent): reject negative snapshot size caps that would prune every user variable\n\n* fix(coding-agent): kill one-shot await bash() on cancel, resolve Windows helpers via System32, retry taskkill after reap, and fail closed on orphan-journal enrollment\n\n* fix(coding-agent): attribute REPL stream output at write time so raw fd and user-thread bytes never carry another cell's id\n\n* fix(coding-agent): surface unattributed REPL stream output as separate background output instead of dropping or merging it\n\n* fix(coding-agent): confirm group exit before a cancelled one-shot bash() await propagates and complete-write orphan-journal records\n\n* fix(coding-agent): expose a working sys.stdout.buffer on the tagged REPL writer routing bytes through the null-attributed raw channel\n\n* fix(coding-agent): mark between-cell background output truncated when the pending buffer cap is hit\n\n* fix(coding-agent): shield the cancelled-await bash() confirm-exit from re-cancellation, fail clearly without bash on Windows, and fence slow pumps out of result assembly\n\n* fix(coding-agent): survive hostile protocol lines in the REPL reader thread and interrupt without pthread_kill on Windows\n\n* fix(coding-agent): send the protocol shutdown from dispose() so the runtime closes MCP servers and kills live bash groups before the hard kill\n\n* fix(coding-agent): flag the pump's read-to-commit window so the bash() drain fence cannot miss an in-flight chunk\n\n* fix(coding-agent): guard the whole REPL request line against hostile input, reject duplicate in-flight ids, complete short buffer-pipe writes, and clean the snapshot temp file on KeyboardInterrupt\n\n* fix(coding-agent): drop stale between-cell background output on kernel teardown so it cannot surface after a restart\n\n* fix(coding-agent): assert the tagged channel only in the large buffer-write REPL test since cross-channel ordering is not guaranteed\n\n* fix(coding-agent): resolve taskkill via absolute System32 path in the host orphan reaper\n\n* fix(coding-agent): write the inactive orphan-journal record only after a delivered kill so undelivered signals leave the host reaper in charge\n\n* fix(coding-agent): keep a REPL request interrupt-targetable through its trailing-expression repr and output drain until done is emitted\n\n* fix(coding-agent): count an already-exited leader as delivered in the Windows bash() reap so clean exits still journal inactive\n\n* fix(coding-agent): reject NaN and Infinity in emit() payloads before they corrupt REPL protocol framing\n\n* chore(coding-agent): correct the stale ipykernel requirement on the python override doc\n\n* chore(coding-agent): drop migration-era wording from kernel comments\n\n* fix(coding-agent): resolve trusted absolute shell host-side and close Windows journal/reap gaps\n\n* fix(coding-agent): best-effort-kill pid-only orphan records in daemon force-stop and recovery reaps\n\n* refactor(coding-agent): drop the magic-cell rejection gate\n\n%-prefixed and !-prefixed cells now reach CPython and fail with its own\nSyntaxError, which names the offending line. The rejection layer guarded\nagainst model-produced IPython syntax, but with the shipped prompt fresh\nsessions do not produce it, and the plain SyntaxError is protection enough.\nparseIpythonBashCell stays: transcripts from ipykernel-era sessions render\n%%bash cells with shell highlighting forever.\n\n* fix(coding-agent): report a committed destructive snapshot as success even when an interrupt was parked\n\n* chore(ai): drop stray live-regen drift in models.generated.ts\n\nad657d7ec accidentally committed generate-models output produced by a local\nbuild; the catalog belongs to its own regen PRs.\n\n* test(coding-agent): expect a plain SyntaxError for legacy %%bash cells after the magic-rejection gate removal\n\n* fix(coding-agent): consume a finishing-targeted interrupt after a completed state request instead of failing the done\n\n* fix(coding-agent): exit the REPL runtime when its owner dies even during a busy cell\n\n* fix(coding-agent): resolve the kernel bash shell only from trusted absolute paths on Windows\n\n* fix(coding-agent): contain Windows bash children with kill-on-close job objects\n\n* test(coding-agent): cover owner death during a non-yielding REPL cell\n\n* fix(coding-agent): skip concurrently deleted names during snapshot instead of aborting\n\n* fix(coding-agent): fall back to taskkill when job termination fails\n\n* fix(coding-agent): stop telling REPL-default users they need ipykernel\n\n* fix(coding-agent): clear the SIGINT target when its request finishes\n\n* test(coding-agent): drop migration-era wording from the %%bash rejection comment\n\n* fix(coding-agent): start Windows bash children suspended and fail closed when job containment cannot be established\n\n* fix(coding-agent): re-assert the kernel SIGINT handler between cells so a cell rebinding SIGINT cannot break interrupts\n\n* fix(coding-agent): kill the whole tree for enriched orphan records on Windows force-stop\n\nstopTrackedProcess signals only the shell pid on Windows; use killOrphanProcess (taskkill /T) after the identity check, matching the owned-session-worker and daemon-supervisor reapers.\n\n* docs(coding-agent): describe current magic-cell behavior in release notes\n\nMagic-style cells fail with a plain SyntaxError; the migration error and %cd/%env rewrites were removed, so the notes stop claiming them.\n\n* fix(coding-agent): skip the liveness check when the orphan identity is stale\n\nA reused pid looked like a failed kill after the identity re-check skipped taskkill, blocking worker cleanup with a spurious failure.\n\n* fix(coding-agent): journal Windows bash() children before job assignment so a kernel kill mid-spawn cannot leak an unjournaled suspended process\n\n* fix(coding-agent): pre-create the Windows bash() job before spawn and contain the child before the journal start-id query\n\n* fix(coding-agent): create Windows bash() children atomically inside the kill-on-close job via PROC_THREAD_ATTRIBUTE_JOB_LIST, closing the Popen-to-assignment leak window\n\n* chore(coding-agent): compress the atomic-job-association comments to one-line rationale\n\n* fix(coding-agent): send duplicate-id protocol errors outside the interrupt lock and reject int payloads in the captured stdout buffer\n\n* docs(coding-agent): update the kernel provisioner docstring for the REPL/IPython split\n\n* fix(coding-agent): retain the Windows bash() process handle through job cleanup and taskkill fallbacks so a recycled pid can never be killed\n\n* fix(coding-agent): serialize Windows bash() abort cleanup under the kill lock so shutdown taskkill can never race the process-handle close\n\n* fix(coding-agent): commit REPL snapshot payload and manifest atomically via unique temp files with guaranteed cleanup and parked-SIGINT restore\n\n* fix(coding-agent): stage REPL restore before an interrupt-parked apply and recover committed snapshot/restore results from protocol interrupts so a committed operation is never misreported as failed\n\n* chore(coding-agent): compress restore-shield rationale comments to one line each\n\n* fix(coding-agent): surface unattributed background output in IPython cell details and render it after the traceback in the expanded cell view\n\n* docs(coding-agent): replace stale Jupyter comm vocabulary in rlm-runtime failure modes and focused validation with stdio-transport equivalents\n\n* docs(coding-agent): describe the REPL trust boundary and runtime-bootstrap failure in stdio terms and drop the removed TokenUsage export\n\n* fix(runtime): address REPL review findings\n\n* fix(runtime): preserve near-cap snapshots\n\n---------\n\nCo-authored-by: Seth <seth@primeintellect.ai>"},{"name":"keybinding-hints.test.ts","kind":"file","size":1382,"lastCommitHash":"63eedf1c5fb06c07c17d727f72fad71f04baf2bc","lastCommitWhen":"2026-06-11T14:58:11-07:00","lastCommitMessage":"restore prime inference browser login and fix cancel shortcut labels (#142)\n\n* restore prime inference browser login with manual key fallback\n\n* keep aborted browser login rejection explicitly handled"},{"name":"keybindings-migration.test.ts","kind":"file","size":3746,"lastCommitHash":"71ca6cfd1a2f7205ca0ec1baa65d10d0ed88f6e8","lastCommitWhen":"2026-08-10T22:09:01-04:00","lastCommitMessage":"feat(coding-agent): edit queued messages in place and preserve the queue on interrupt (#838)\n\n* feat(coding-agent): edit queued messages in place and preserve the queue on interrupt\n\nBrowse queued steering/follow-up messages with Alt+Up/Alt+Down, edit the\nselected item in the editor, and apply with Enter (steering) or Alt+Enter\n(follow-up), flipping lanes when needed. Submitting an empty edit deletes the\nitem; Ctrl+Alt+Up/Down reorders it within its lane.\n\nCtrl+C/Escape now abort the active turn without clearing the queue: queued\nmessages stay server-owned and visible, and draining resumes on the next\nsuccessful edit or fresh submit (the input pump is already suspended by\nrequestAbort and resumed by _prompt on main).\n\nServer: AgentSession.mutateQueuedMessage addresses items by\n(lane, index, expectedText) against the same projection the snapshot\npublishes, so no ids, revisions, or snapshot changes are needed. Deletes\nsettle agentMessageId outcomes; replaces rebuild content/records, honor an\nimage tri-state (preserve/clear/replace), reject non-editable turns, and\nresume queued work. Daemon wire adds one mutate_queued_message request behind\nthe queue_message_mutation capability (schema 13 -> 14); older daemons report\n\"unsupported\" and the UI shows a status message.\n\napp.message.dequeue is migrated to app.message.navigateOlder; the\nrestore-queue-to-editor path is removed.\n\n* fix(coding-agent): address queue-edit review findings\n\n- Serialize queue mutations through a single chain so rapid Enter/reorder\n  presses cannot race each other or send stale indices; surface rejected\n  reorders as a status message.\n- Guard editor writes after a mutation with an editor-text ownership check so\n  a stale completion never clobbers newer typing, and restore the edit when\n  the mutation throws (Enter clears the editor before onSubmit runs).\n- Restore the stashed draft when the browsed queue item is consumed or\n  removed externally, so Enter cannot resubmit stale queued text.\n- Deduplicate repeated [image #N] markers in replace mutations.\n- Use the configured app.message.followUp key in the browse header instead of\n  a hard-coded alt+enter.\n- Drop the dead clearEditor() wrapper and tolerate partial test harnesses in\n  the onSubmit/handleFollowUp queue interception (fixes the 4509 CI shard).\n\n* fix(coding-agent): keep chained reorders addressable before the queue event arrives\n\nOver the daemon, the mutation response can land before the corresponding\nsession_action_update, so a queued follow-up move would still address the\npre-move index and be rejected. On a successful move, swap the local queue\nmirror optimistically and resync the selection; the later event settles to\nthe same state.\n\n* fix(coding-agent): reset queue browsing on session switch and mirror edits optimistically\n\nresetCurrentSessionRenderState now clears the queue selection and its\nstashed draft, so Enter in a freshly switched session can never issue a\nmutation addressed at the previous session's queue. Applied replace and\ndelete mutations update the local queue mirror immediately (like moves\nalready did), so an immediate re-browse sees the new text instead of a\nstale expectedText that the daemon would reject.\n\n* fix(coding-agent): skip the optimistic queue patch when the event already landed\n\nIn-process connections deliver the session_action_update before the\nmutateQueuedMessage await resumes; sync can retarget the selection onto a\nsame-text item, so the text guard alone let the optimistic patch apply the\ndelete or lane move a second time. Queue events always assign a fresh\nconnectionQueue object, so patch only when the mirror is still the exact\nobject captured before the request.\n\nAlso folds the session-switch regression coverage into the existing\nrender-state reset tests instead of a duplicated harness, and drops the\ndefensive optional chaining that hid missing harness fields.\n\n* fix(coding-agent): move queued message mutation to daemon schema revision 15\n\nMain took revision 14 for the telemetry policy surface (a18809e00), so the\nqueued-message-mutation gate and the advertised schema identity move to a\nfresh revision 15 with the recomputed wire-shape digest.\n\n* docs(coding-agent): record revision 15 in the schema history comment\n\n* when switching sessions with a queued message, make sure it doesn't appear in the other queue\n\n* fix(coding-agent): harden queued edit lifecycle\n\n* fix(coding-agent): preserve failed queue edit drafts\n\n* fix(coding-agent): close queue edit state races\n\n* fix: stashed draft lost after edit\n\n---------\n\nCo-authored-by: Alex Zhang <alex.lx.zhang@gmail.com>"},{"name":"legacy-rlm-host-types.d.ts","kind":"file","size":362,"lastCommitHash":"032e3ee74574ca16efaf8745a1394b821256a5d0","lastCommitWhen":"2026-08-18T12:17:35+02:00","lastCommitMessage":"chore: remove redundant comments and unused internals (#1505)\n\n* chore: remove redundant comments\n\n* chore(tui): remove redundant export comments\n\n* chore(coding-agent): remove redundant example comments\n\n* chore(ai): remove redundant comments\n\n* chore(coding-agent): remove obsolete core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant rpc test comments\n\n* chore(coding-agent): remove redundant CLI comments\n\n* chore(agent): remove redundant comments\n\n* chore(tui): remove redundant source comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(ai): remove redundant source comments\n\n* chore(coding-agent): remove redundant session comments\n\n* chore(coding-agent): remove redundant core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(tests): remove redundant test comments\n\n* chore: remove unused internal helpers\n\n* docs: restore public API contracts\n\n* chore(coding-agent): restore invariant documentation\n\n* chore(coding-agent): clarify agent family contracts\n\n* style(coding-agent): format restored contracts\n\n* fix: restore intentional catch explanations"},{"name":"login-dialog.test.ts","kind":"file","size":8353,"lastCommitHash":"ebfe770ef61bebf063f194b63f20397ed3446a68","lastCommitWhen":"2026-08-10T14:00:34+02:00","lastCommitMessage":"Add login URL copy action (#647)\n\n* fix(coding-agent): add login URL copy action\n\nFixes #643\n\n* fix(coding-agent): preserve login dialog input\n\nFixes #643\n\n* fix(coding-agent): keep login URL copy available\n\nFixes #643"},{"name":"main-interactive-routing.test.ts","kind":"file","size":14673,"lastCommitHash":"94f25d4f34f31f4b5a096834097edd9ccb1a2992","lastCommitWhen":"2026-09-01T22:32:33+09:00","lastCommitMessage":"feat(coding-agent): add root session controls\n"},{"name":"marquee-components.test.ts","kind":"file","size":15499,"lastCommitHash":"032e3ee74574ca16efaf8745a1394b821256a5d0","lastCommitWhen":"2026-08-18T12:17:35+02:00","lastCommitMessage":"chore: remove redundant comments and unused internals (#1505)\n\n* chore: remove redundant comments\n\n* chore(tui): remove redundant export comments\n\n* chore(coding-agent): remove redundant example comments\n\n* chore(ai): remove redundant comments\n\n* chore(coding-agent): remove obsolete core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant rpc test comments\n\n* chore(coding-agent): remove redundant CLI comments\n\n* chore(agent): remove redundant comments\n\n* chore(tui): remove redundant source comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(ai): remove redundant source comments\n\n* chore(coding-agent): remove redundant session comments\n\n* chore(coding-agent): remove redundant core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(tests): remove redundant test comments\n\n* chore: remove unused internal helpers\n\n* docs: restore public API contracts\n\n* chore(coding-agent): restore invariant documentation\n\n* chore(coding-agent): clarify agent family contracts\n\n* style(coding-agent): format restored contracts\n\n* fix: restore intentional catch explanations"},{"name":"mcp-command.test.ts","kind":"file","size":7669,"lastCommitHash":"bb61ca21c3e27a5d2af7fab3ab662789a5e478d2","lastCommitWhen":"2026-08-20T17:21:33+02:00","lastCommitMessage":"fix(coding-agent): close MCP runtime review follow-ups (#1585)\n\n* fix(coding-agent): close MCP runtime review follow-ups\n\n- drop the mcp:<name> credential on every add, not only replaces: a fresh\n  add can repoint a name an authored non-catalog skill (e.g. slack) resolves\n  via mcp.config, and the stored token must never replay there\n- keep the kernel MCP close budget strictly inside the host kill deadline\n  (2.5s + 1s dispatch < 5s) and pin the relationship in a test\n- include kernel exit in the host's first shutdown race so a kernel that\n  dies without shutdown_reply finishes promptly instead of eating the deadline\n- close a shutdown race that dropped a just-opened generation from the\n  registry without closing it, leaving its server process running\n- run kernel-mcp-shutdown.test.ts in test:kernel and the Python runtime\n  tests in CI; gate the E2E on module availability instead of an exact\n  ipykernel version that silently skipped the suite\n- pin mcp>=2,<3, require Python >=3.11 (asyncio.timeout), and resolve the\n  streamable-HTTP transport via mcp_base instead of new-only + private imports\n- shield sibling generation closes from a failing close in shutdown/reload\n- reject a quoted-empty mcp add option value deterministically\n\n* fix: keep SSE-friendly read timeouts and handled shutdown races\n\nMatch the SDK factory's timeouts (30s ops / 300s reads) on the http_client\ntransport path in both the generic runtime and mcp_base, keeping reads above\nthe configured per-call timeout; an httpx default client caps reads at 5s and\na flat 30s cap drops quiet streams whose server sends no pings. Attach a\nrejection handler to the abandoned graceful-reply composite so a late send\nfailure cannot surface as an unhandled rejection.\n\n* docs: compress comments to single-line invariants\n\n* fix: give the http_client transport its companion client and stop following redirects\n\nThe mcp 2.x transport calls client.sse() for server-initiated streams and\nreconnects; a plain httpx client has no such method, so the GET stream died\nin a silent reconnect loop (AttributeError swallowed by the retry). Both\nfallback paths now build an httpx2 client with the SDK-factory timeouts.\nRedirects are disabled on these clients: httpx only strips Authorization on\ncross-origin redirects, so configured secret headers would follow a\nredirecting endpoint. httpx itself is no longer used and leaves the runtime\ndependencies (added by #1495 for the code this replaces).\n\n* fix: stop authored integrations honoring mcpServers overrides and fail credential drops closed\n\nAn authored McpIntegration resolved its URL through mcp.config, so a\nsame-named user entry repointed it while its credentials — auth.json tokens\nor a bearer-token env var the add-time drop can never reach — followed as\nthe Authorization header. Authored integrations now always use their class\nURL; custom endpoints go through the generic runtime under their own name.\n\nThe add flow also persisted the new URL before dropping stored credentials,\nand the store records persistence failures instead of throwing, so a failed\nor silently skipped write left the old token armed against the new URL\nbehind a reported success. Drops now happen before the entry is persisted\nand drain the store's recorded errors, aborting the add on failure.\n\n* fix(coding-agent): make credential removal disk-verified instead of error-drain heuristics\n\nThree review rounds patched the same invariant at the call site: logout\nremoves memory before a persist that swallows failures (and silently no-ops\nafter a load error), so has() gating skipped retries and drainErrors missed\nthe loadError path entirely. The invariant now lives in the owning layer:\nAuthStorage.removeVerified performs the disk removal under lock, throws on\nany load or write failure, and only then updates memory — disk-authoritative\nand idempotent. dropServerCredentials shrinks to a try/rethrow around it.\n\nDrop-before-persist ordering is deliberate: a settings-flush failure after a\nverified drop strands the server on re-login (recoverable); the reverse\norder can strand an old token against a new URL (replay).\n\n* fix(coding-agent): keep the stale marker until a verified removal succeeds\n\nA failed removeVerified cleared the stored stale marker first, making a\nsuppressed credential selectable again while it survived on disk. Also\ncompress comments to single-line invariants.\n\n* fix: bind MCP OAuth tokens to the endpoint they were issued for\n\nAn in-flight login races retargeting: /mcp login captures the provider\nfor the old URL, awaits the browser, and a concurrent add --force drops\nthe credential and persists a new URL; the finishing login then stores\nan old-endpoint token under the same name and the runtime sends it to\nthe new URL. No ordering fixes this — the binding token<->endpoint\nexisted nowhere. Credentials now record the endpoint at issuance,\nrefreshes carry the original binding forward (no laundering), and both\nconsumers verify it: the kernel refuses to attach a foreign-bound token\nand the host treats it as not authed. Legacy unbound credentials keep\nworking.\n\n* fix(coding-agent): strip trailing slashes without a backtracking regex\n\nCodeQL flagged the /\\/+$/ anchor on stored-credential and settings input\nas polynomial; a two-line loop replaces it.\n\n* fix: require endpoint binding for user-declared MCP OAuth credentials\n\nAccepting unbound legacy credentials kept the replay window open: a\npre-update login can finish after a retarget and store an unbound token,\nand a refresh would have re-bound it to the current URL. User-declared\nservers now require an exact binding (host and kernel), and a refresh\nnever infers one. Builtin catalog integrations keep accepting stored\ncredentials — their URLs are code-constant and cannot be retargeted.\nBreaking: generic-server OAuth credentials stored before the binding\nexisted require one /mcp login.\n\n* chore: trim a narrating test comment and compress the _bound_auth docstring\n\n* chore: reframe unbound-credential refusal as standing behavior, not migration wording\n\n* fix: compare MCP endpoint bindings exactly\n\nTrailing-slash normalization ran on the whole URL string, so a slash\nthat is part of the query unified distinct targets (?tenant=trusted/\nmatched ?tenant=trusted). Both strings come from the same settings\nentry, so any difference means the entry changed: compare exactly.\nAlso retires the stripTrailingSlashes helper."},{"name":"mcp-manager.test.ts","kind":"file","size":10936,"lastCommitHash":"c75a637b00d3b52762841e72efe92289a0d55b49","lastCommitWhen":"2026-08-20T11:40:26-07:00","lastCommitMessage":"feat(coding-agent): support ACP MCP programs (#1378)\n\n* feat(coding-agent): support ACP MCP programs\n\n* feat(coding-agent): port ACP MCP servers to kernel runtime\n\n* fix(coding-agent): fence ACP MCP daemon ownership\n\n* fix(coding-agent): release ACP MCP leases on detach\n\n* test(coding-agent): preserve daemon prototype fixtures\n\n* fix(coding-agent): roll back failed ACP MCP claims\n\n* fix(coding-agent): reap ACP MCP transports on release\n\n* fix(coding-agent): isolate ACP MCP release failures\n\n* fix(coding-agent): retry empty-session MCP cleanup\n\n---------\n\nCo-authored-by: Seth <seth@primeintellect.ai>"},{"name":"menu-panel.test.ts","kind":"file","size":5518,"lastCommitHash":"90b841996aba818c5ba9b89f64a351d54312d61d","lastCommitWhen":"2026-07-16T12:25:49-07:00","lastCommitMessage":"add heartbeat observability and management (#425)\n\n* feat(coding-agent): add heartbeat observability (ENG-4536)\n\n* fix(coding-agent): keep heartbeat controls in ipython (ENG-4536)\n\n* fix(coding-agent): refine heartbeat controls (ENG-4536)\n\n* fix(coding-agent): tighten heartbeat navigation (ENG-4536)\n\n* fix(coding-agent): simplify heartbeat stopping (ENG-4536)\n\n* fix(coding-agent): polish heartbeat menu (ENG-4536)\n\n* fix(coding-agent): address heartbeat review feedback (fixes #425)\n\n* fix(coding-agent): cache worker heartbeat catalogs (fixes #425)\n\n* fix(coding-agent): limit heartbeat catalog invalidation (fixes #425)\n\n* fix(coding-agent): keep heartbeat management live (fixes #425)\n\n* fix(coding-agent): refresh stale heartbeat catalogs (fixes #425)\n\n* fix(coding-agent): preserve heartbeat action success (fixes #425)"},{"name":"migrations.test.ts","kind":"file","size":3461,"lastCommitHash":"3ad60e98237dee44702abc5b205252b59850ea4c","lastCommitWhen":"2026-06-09T21:11:57-07:00","lastCommitMessage":"feat(coding-agent): add daemon session manager (#74)\n\n* feat(coding-agent): add daemon session manager PoC\n\nAdd socket daemon mode that owns multiple agent runtimes and cleans up Unix socket lifecycle.\n\nAdd daemon client and CLI controls for start, list, create, attach, prompt, rename, kill, and shutdown.\n\nWire daemon mode into CLI args, main startup, package exports, and changelog.\n\n* feat(coding-agent): streamline daemon entrypoint\n\nMake bare daemon start the background manager if needed, create a new named or numbered session, and attach to it.\n\nMove daemon help to explicit help flags, remove the bootstrap session from live listings, and show session names before ids in list output.\n\n* fix(coding-agent): harden daemon session lifecycle\n\n* fix(coding-agent): reset daemon client after failed connect\n\n* test(coding-agent): cover daemon client reconnect failures\n\n* refactor(coding-agent): rename daemon active session id\n\n* docs(coding-agent): remove daemon poc wording\n\n* refactor(coding-agent): split daemon mode modules\n\n* feat(coding-agent): add per-session daemon runtime config\n\n* refactor(coding-agent): remove daemon session config alias\n\n* refactor(coding-agent): rename daemon session types\n\n* docs(coding-agent): clarify active session summary\n\n* feat(coding-agent): include model in active session summary\n\n* refactor(coding-agent): use active session state for daemon list\n\n* feat(coding-agent): unify daemon session listing\n\n* fix(coding-agent): make daemon list all table output\n\n* feat(coding-agent): color daemon session list\n\n* fix(coding-agent): hide cwd from daemon list table\n\n* feat(coding-agent): show daemon session age\n\n* refactor(coding-agent): simplify session list type names\n\n* refactor(coding-agent): inline session age stat\n\n* refactor(coding-agent): remove active state list normalization\n\n* refactor(coding-agent): rename daemon session summaries\n\n* fix(coding-agent): color only daemon list status\n\n* feat(coding-agent): support daemon session id prefixes\n\n* fix(coding-agent): match daemon session id suffixes\n\n* test(coding-agent): cover daemon list output\n\n* fix(coding-agent): persist daemon session state\n\n* feat(coding-agent): support session root env var\n\n* feat(coding-agent): flatten session storage\n\n* feat(coding-agent): separate session artifacts\n\n* add explainer\n\n* fix(coding-agent): clear daemon client after close\n\n* fix(coding-agent): dispose daemon runtime on bind failure\n\n* fix(coding-agent): clean migrated session directories\n\n* fix(coding-agent): tighten session migration scan\n\n* fix(coding-agent): clean daemon prompt waiter\n\n* fix(coding-agent): stop json daemon attach on close\n\n* fix(coding-agent): harden daemon session cleanup\n\n* fix(coding-agent): ignore stale daemon prompt end\n\n* fix(coding-agent): clean daemon waiter helpers\n\n* fix(coding-agent): harden daemon prompt and flags\n\n* fix(coding-agent): harden daemon followups\n\n* fix(coding-agent): preserve prime cli auth fallback\n\n* fix(coding-agent): honor cwd for session resume\n\n* fix(coding-agent): tighten resume cwd and migrations\n\n* fix(coding-agent): address daemon review followups\n\n* fix(coding-agent): clean up daemon followup fixes\n\n* fix(coding-agent): harden daemon session close handling\n\n* fix(coding-agent): avoid daemon session id collisions\n\n---------\n\nCo-authored-by: Kevin Thomas <kevin.jt2007@gmail.com>\n"},{"name":"model-registry.test.ts","kind":"file","size":55252,"lastCommitHash":"378e32d5813087768ec3f34ed32901813a36744c","lastCommitWhen":"2026-08-28T14:15:16+02:00","lastCommitMessage":"refactor(coding-agent): remove test-only config cache reset APIs (#1849)"},{"name":"model-resolver.test.ts","kind":"file","size":16633,"lastCommitHash":"056014620853010778e478396b76ac04b3341864","lastCommitWhen":"2026-08-29T10:12:24+02:00","lastCommitMessage":"refactor(coding-agent): remove test-only parser and feature-hint seams (#1860)\n\n* refactor(coding-agent): remove test-only parser and feature-hint seams\n\n* test(coding-agent): restore provider-overlap and invalid-suffix warning coverage via public resolver API"},{"name":"model-selector-actions.test.ts","kind":"file","size":11943,"lastCommitHash":"b09fbdb46c2c8e238b616d6511392dba3acf7ab6","lastCommitWhen":"2026-08-19T16:34:59-07:00","lastCommitMessage":"fix(coding-agent): rank model search by intent (#539)\n\nFixes ENG-5388\n\nCo-authored-by: Seth <seth@primeintellect.ai>"},{"name":"mutation-drain-latch.test.ts","kind":"file","size":1483,"lastCommitHash":"3fc0ac54fad747871c0d2797bce5b21530aecffc","lastCommitWhen":"2026-07-30T17:38:19+02:00","lastCommitMessage":"feat: canonical session-input scheduling with durable, queueable commands (#540)\n\n* feat(agent): stop before scheduling another turn\n\n* test(agent): remove redundant option forwarding coverage\n\n* test(agent): consolidate turn-boundary coverage\n\n* test(coding-agent): skip staged temp files in 4606 status scan\n\n* test(coding-agent): stabilize process-suite cleanup races\n\n* test(process): allow exact supervisor cleanup to settle\n\n* feat(daemon): checkpoint session inputs for restart\n\n* fix(daemon): harden restart checkpoint transactions\n\n* feat(daemon): unify session input admission\n\n* fix(daemon): complete restart transactions safely\n\n* fix(headless): surface command outcomes\n\n* fix(daemon): fence restart manifest capture\n\n* test(process): isolate daemon client environment\n\n* fix(daemon): restore checkpoint handoff state\n\n* fix(daemon): preserve admission completion contracts\n\n* fix(daemon): fence full queued turns before restart\n\n* fix(daemon): settle queued input outcomes\n\n* fix(daemon): preserve restart transaction ownership\n\n* fix(daemon): report prompt admission rejection\n\n* refactor(daemon): collapse update restart state machines\n\n* feat(coding-agent): unify session input scheduling\n\n* test(daemon): consolidate cron admission coverage\n\n* fix(daemon): bound prepare deadline and fence direct prompt acceptance\n\n* fix(headless): drain session-owned inputs before exit\n\n* fix(daemon): settle queued prompt completions\n\n* fix(daemon): fence stale commit clients and injected prompt sections\n\n* test(coding-agent): remove scheduler implementation assertions\n\n* fix(daemon): keep cleared prompts cancelled\n\n* fix(daemon): fence injected dispatch on delivery and env adoption\n\n* fix(coding-agent): harden session input admission\n\n* refactor(coding-agent): unify agent message outcomes\n\n* fix(daemon): fence injected prompts until target handoff\n\n* fix(coding-agent): align command dispatch parsing\n\n* fix(coding-agent): reject re-armed completions for delivered message ids\n\n* fix(daemon): fence admitted work during restart\n\n* fix(coding-agent): serialize command admission\n\n* fix(coding-agent): drop generated prompt-wait outcomes after completion\n\n* fix(daemon): cancel stalled restart checkpoints\n\n* fix(coding-agent): preserve queued continuation semantics\n\n* fix(daemon): preserve scheduled input contracts\n\n* fix(daemon): close restart admission before checkpoint\n\n* fix(coding-agent): avoid redundant continuation turns\n\n* fix(daemon): settle command delivery outcomes\n\n* fix(daemon): preserve merged queue checkpoints\n\n* fix(coding-agent): serialize all turn admission\n\n* test(daemon): preserve merged delivery coverage\n\n* fix(daemon): make drain cancellation terminal\n\n* fix(tui): unify durable compaction presentation\n\n* test(coding-agent): consolidate scheduler coverage\n\n* refactor(coding-agent): route TUI inputs through session admission\n\n* fix(daemon): bound message delivery outcomes\n\n* fix(daemon): preserve restart checkpoint semantics\n\n* test(tui): consolidate compaction presentation coverage\n\n* test(coding-agent): synchronize scheduler integration coverage\n\n* fix(tui): preserve admission ordering\n\n* fix(daemon): cancel pending prompt admission\n\n* fix(daemon): align admission restart integration\n\n* fix(tui): retain successful context usage\n\n* fix(coding-agent): harden queued input lifecycle\n\n* fix(tui): preserve admission errors and retry spacing\n\n* style(daemon): format combined protocol\n\n* fix(daemon): clear restart-rejected admission\n\n* fix(coding-agent): disclose non-durable compaction outcomes\n\n* refactor(coding-agent): consolidate scheduler predicates and coverage\n\n* fix(tui): preserve editor input during startup\n\n* fix(daemon): close prompt admission edge cases\n\n* fix(daemon): release stale parsed admissions\n\n* refactor(coding-agent): simplify compaction outcome handling\n\n* fix(coding-agent): harden queued prompt handoff and refine parsing\n\n* fix(tui): retry startup prompts until admitted\n\n* fix(daemon): close prompt admission races\n\n* fix(daemon): revoke late stale claims\n\n* fix(coding-agent): restore the session file after a torn outcome append\n\n* fix(coding-agent): snapshot prepared prompts adjacent to handoff\n\n* fix(tui): bound startup and follow-up admission\n\n* test(daemon): ignore private handler arity\n\n* fix(daemon): serialize replay admission\n\n* fix(compaction): preserve durable outcomes in headless mode\n\n* fix(coding-agent): suspend the input pump for update-restart aborts\n\n* refactor(tui): simplify startup prompt delivery\n\n* fix(daemon): reconcile prompt admission outcomes\n\n* test(daemon): extend fixture cleanup retries\n\n* fix(session): preserve symlinked atomic rewrites\n\n* fix(scheduler): cancel continuations at abort boundaries\n\n* fix(tui): drop superseded command paths and stop startup prompts at run exit\n\n* fix(daemon): observe cancelled admission work\n\n* fix(daemon): clear restart-rejected admission\n\n* fix(compaction): preserve merged event handling\n\n* fix(scheduler): preserve queued input ownership\n\n* fix(tui): drop submits resumed by run teardown\n\n* fix(daemon): settle admission-only work once\n\n* test(daemon): assert cron admission completion\n\n* feat(coding-agent): add session command primitives\n\n* fix(session): preserve atomic rewrite ownership\n\n* fix(scheduler): derive steering stop from live queue\n\n* fix(tui): preserve stash on lifecycle cancellation\n\n* fix(daemon): preserve steer and follow-up lanes\n\n* fix(daemon): wake checkpoint at prompt handoff\n\n* test(coding-agent): consolidate command message coverage\n\n* fix(tui): preserve transcript on rebuild failure\n\n* fix(scheduler): run checkpoints before steering stop\n\n* fix(tui): cancel startup admission on lifecycle exit\n\n* fix(daemon): preserve definitive prompt failures\n\n* fix(daemon): finish publish after owner loss\n\n* fix(coding-agent): validate command metadata consistency\n\n* fix(compaction): persist outcomes before events\n\n* fix(scheduler): hand off injected follow-ups\n\n* fix(tui): integrate side conversations with admission\n\n* test(daemon): model idle lane insertion\n\n* fix(daemon): adopt deferred attach env on rollback\n\n* fix(coding-agent): align command dispatch parsing\n\n* fix(headless): skip malformed outcome suffix entries\n\n* fix(scheduler): preserve ordered input ownership\n\n* fix(tui): retain rejected rich drafts\n\n* fix(scheduler): observe pre-aborted admission waits\n\n* fix(daemon): reserve update shutdown for publish\n\n* fix(coding-agent): keep multiline slash input literal\n\n* fix(compaction): order equal-time legacy messages after summary\n\n* test(process): sweep late supervisor owners before cleanup\n\n* test(process): terminate late exact supervisor owners\n\n* fix(agent): recheck stop after steering poll\n\n* fix(scheduler): recheck pause at direct admission\n\n* fix(tui): retain lifecycle drafts in submission order\n\n* fix(daemon): preserve client identity and safe markers\n\n* fix(agent): never drop steering drained by the stop-window poll\n\nA stop that flips during the post-tool-batch steering poll no longer ends\nthe loop when that poll returned messages; drained steering owns the turn\nboundary and is injected before the loop can stop.\n\n* fix(scheduler): invalidate queued prompt preparation on branch navigation\n\nCached before_agent_start preparation survives a deferral requeue, so a\nbranch switch during the pause could deliver extension messages prepared\nagainst the old branch. Clear queued prompt preparation when tree\nnavigation rebuilds the session context.\n\n* fix(tui): honor cancellation in pause waits and pin deferred stash release\n\n- forward the abort signal into the queued-work admission wait taken when\n  a pause appears between admission acquire and the ownership commit, so\n  a cancelled prompt rejects instead of blocking until the pause clears\n- capture the stash session id and state when a release is deferred by\n  in-flight submissions, so a /new rebind cannot redirect the deferred\n  release at the new session's state\n- align the prompt-stash submit harness with the submission fields so the\n  draft-retention paths run instead of throwing on missing state\n\n* fix(daemon): keep cancelled admissions definitive across repeated cancels\n\nA second cancel_prompt_admission for an already-cancelled admission now\nshort-circuits with cancelled instead of forwarding to the worker, and a\nworker unknown response can no longer downgrade a cancellation that\nraced in during the round-trip.\n\n* fix(coding-agent): require dispatch proof before releasing the prompt fence\n\nAgent.prompt() resolves even when a lifecycle listener failure produced a\nsynthetic error turn without the injected message ever reaching agent\nstate. Treat a resolved prompt as dispatched only when the dispatch\nobserver fired or the message is present in agent state, so the direct-\nprompt checkpoint section cannot release with the accepted input missing\nfrom both the queue and the run.\n\n* chore(scheduler): tighten fix comments\n\n* chore(tui): tighten fix comments\n\n* chore(agent): tighten fix comments\n\n* chore(daemon): tighten fix comments\n\n* chore(coding-agent): tighten fix comment\n\n* test(agent): flip the stop only on the post-tool-batch steering poll\n\nThe pre-loop poll also set stopRequested, so the pre-steering check\nstopped the loop and the post-empty-poll recheck under test never ran.\nVerified the test now fails when the recheck is removed.\n\n* fix(scheduler): treat pump-owned work as busy for post-compaction continue\n\nThe continuation timer only checked pendingMessageCount, but the pump\nmoves items into _activeSessionInput before handoff, so the timer could\ncall agent.continue() and forget continuations the pump still owned.\nIdle now also requires no active input, no running pump, and no pump\nrequest.\n\n* fix(tui): bind barrier-paused submissions to their original session\n\nA submit paused on the startup-prompt barrier could resume after /new\nrebound the live stash fields, delivering the prompt to and stashing the\ndraft in the wrong session. The submission now captures its session and\nstash state up front, bails out of prompting when the session changed,\nand retains drafts in the captured state.\n\n* fix(scheduler): let queueIfBusy join pending work at direct admission\n\nDirect-turn admission drained queued work before queueIfBusy callers\ncould see it, so heartbeats and accepted agent messages blocked until\nthe queue emptied and then started direct turns. Admission now returns\nimmediately for queueIfBusy callers (allowPendingQueue) and preflight\nenqueues behind the pending work, which also removes the pump-reschedule\nspin while the queue is blocked by bash/compaction/retry.\n\n* chore(agent): tighten test comment\n\n* chore(tui): tighten fix comments\n\n* chore(scheduler): tighten fix comments\n\n* fix(compaction): retain unpersisted outcome disclosures across rebuilds\n\nAn outcome whose session-file append failed lived only in live agent\nstate, so transcript rebuilds from buildSessionContext dropped the\ndisclosure. Failed appends are now retained and appended to rebuilt\ncontexts.\n\n* fix(tui): observe admission cancellation on the streaming prompt path\n\nWhile streaming, _prompt skips direct-turn admission, so an aborted\nadmission signal was never checked and a cancelled startup prompt could\nstill enqueue into a session the user already left. The streaming path\nnow treats its entry as the commit point and rejects already-aborted\nprompts.\n\n* fix(compaction): keep unpersisted outcome disclosures in transcript order\n\nRebuilds appended retained disclosures after every persisted message, so\nturns persisted after the failed append rendered above the notice. The\ndisclosures now merge into the rebuilt context by timestamp.\n\n* fix(daemon): gate admission cancellation on a minimum schema revision\n\nschemaRevision is monotonic, but the admission gates compared it with\nexact equality, so a newer daemon failed signal-backed prompt\ncancellation against an older client even while still advertising\nprompt_admission_cancellation. Both gates now require a minimum\nrevision, matching the protocol.version check.\n\n* fix(compaction): keep unpersisted outcome disclosures across state reloads\n\nSuccessful compaction and tree navigation reload agent.state.messages\nfrom the session file, which dropped disclosures that only exist in\nmemory after a failed append. The timestamp merge now runs on every\nrebuild path via a shared helper.\n\n* chore(tui): tighten fix comment\n\n* chore(daemon): drop redundant gate comment\n\n* chore(compaction): tighten fix comments\n\n* fix(scheduler): treat a skipped compaction as benign in queued commands\n\nA too-short or already-compacted /compact throws CompactionSkippedError,\nwhich compaction_end already surfaces as a warning; the queued-command\nexecutor also recorded a durable 'Command failed' error row for the same\nskip. The executor now ignores the skip.\n\n* fix(daemon): re-validate field-gated requests before reconnect replay\n\nA prompt carrying admissionId that was pending across a reconnect was\nreplayed without re-checking the new daemon_hello, so a replaced or\ndowngraded daemon would silently ignore the admission field and take\nownership of an uncancellable prompt. Pending requests now remember\ntheir schema requirement and reject with the capability error when the\nnew hello no longer satisfies it. Also awaits the newer-revision test's\nrequest so closing the client cannot leak an unhandled rejection.\n\n* fix(tui): keep every deferred prompt-stash release across rebinds\n\nA teardown release after a /new rebind overwrote the pending release\npair captured at the original deferral, so the first session's stash\nstate was never released. Deferred releases now accumulate per session\nand all drain once pending submissions settle.\n\n* fix(tui): restore the compaction loader without a start-event edge\n\nThe compaction spinner was created only on the compaction_start event,\nso a compaction already running when the client attached or returned to\nthe chat (e.g. a /compact queued from the agents view) showed no\nprogress at all until it finished. syncWorkingLoader now restores the\nloader from the connection's isCompacting state, and the loader\ncreation is shared with the event path. Adds core coverage proving the\ncompaction lifecycle events fire for /compact queued behind a running\nturn on both lanes.\n\n* test: consolidate scheduler tests into e2e scenario journeys\n\nReplace ~50 fine-grained scheduler test cases with 7 end-to-end scenario\ntests (S1-S7) that drive the real AgentSession through gated faux-model\nruns with staged, phase-labeled assertions:\n\n- S1: mid-run steering/follow-up/command/custom input ordering\n- S2: queue editing (coalescing, removal APIs, steering-stop reconciliation)\n- S3: pause-lease preparation with anchor re-preparation and direct handoff\n- S4: update-restart abort snapshots and envelope-vs-literal restore\n- S5: queued command delivery vs gated completion outcomes\n- S6: auto-refine via real turns (interval review, busy deferral, branch\n  navigation invalidation) instead of _maybeAutoRefine internals\n- S7: accepted agent-message lifecycle (busy queueing, delivery-before-\n  completion, literal slash commands, cleared-during-admission cleanup)\n\nAlso shrink the 300-iteration outcome-leak loop to 3, drop a typeof-only\nassertion, redundant whitespace-variant and duplicate guard tests.\n\nWhite-box tests for admission-boundary races, cooldown stamping, and\nfault-injection windows are kept; those interleavings have no public\ntrigger. Coverage on agent-session.ts is unchanged (59.7% lines before\nand after) at -516 net test lines.\n\n* fix: close session-input scheduler race windows around admission and restart checkpoints\n\nThree bugbot findings on the scheduler plus one hardening pass:\n\n- promptUntilAccepted no longer waits for the session-input pump after\n  admission: it resolves at ownership commit while queued work (including\n  slash commands) executes, restoring its documented contract.\n- waitForSessionInputCheckpoint now waits for an executing queued session\n  command; the pump shifts commands off the queue before running them, so\n  a restart snapshot could otherwise proceed mid-/compact or /refine and\n  drop the command from durable queued input.\n- The queued-prompt handoff holds a checkpoint section until dispatch is\n  observed. The phase flipped to handedOff (notifying checkpoint waiters)\n  before agent.prompt() ran, so a checkpoint could drain a stale event\n  queue snapshot and flush before the accepted messages persisted.\n- waitForPromiseOrAbort rechecks signal.aborted after registering its\n  abort listener, matching waitForPromptAdmission.\n\nEach fix has a regression test verified to fail against the unfixed code.\n\n* chore: trim comments in scheduler scenarios and race fixes\n\n* fix: fence triggerTurn custom messages for restart checkpoints\n\nsendCustomMessage with triggerTurn took direct-turn admission but never\nentered a direct prompt section, so waitForSessionInputCheckpoint could\nsnapshot between admission and dispatch and miss the in-flight turn.\nHold a checkpoint section from admission until the message dispatches,\nmirroring the queued-handoff fence.\n\n* fix: keep pump-owned session inputs visible as pending\n\nWhen the session-input pump moved prompts or commands into\n_activeSessionInput, they left the typed queues before delivery, so\npendingMessageCount, queue previews, snapshots, and queue_update briefly\nreported an empty queue during preparation and long-running queued\ncommands, and agent-message backpressure undercounted.\n\nCount still-preparing prompts and executing commands as pending, emit\nqueue updates at prompt handoff and command completion, and clear\nownership before the deferred-requeue emit so items are not\ndouble-counted.\n\n* fix: harden durable command persistence and cleared-input accounting\n\nTwo bugbot findings on the queued session-command path:\n\n- _appendDurableSessionCommandMessage now persists through\n  appendCustomMessageEntryWithRollback before touching live state, so a\n  failed write cannot leave an unsaved leaf or a transcript/file\n  divergence; the failure-row append no longer masks the original\n  command error.\n\n- clearQueue marks the preparing active input cancelled;\n  _undeliveredActiveSessionInputs now excludes cancelled items so\n  pendingMessageCount, previews, and queue updates drop cleared work\n  immediately instead of waiting for the pump to unwind.\n\n* fix: stop coalescing follow-up keys against handed-off prompts\n\nFollow-up queueKey coalescing treated all _activeSessionInput prompt\nitems as pending owners. After handoff the prompt is committed to the\nrunning turn, so a later same-key follow-up (e.g. a heartbeat) was\nrejected for the rest of that turn instead of queueing behind it.\nCoalesce only against a preparing, non-cancelled active input, shared by\n_enqueueSessionInput and hasQueuedFollowUp.\n\n* fix: count session-owned queues as queued work after compaction\n\nPost-compaction decisions only consulted agent.hasQueuedMessages(), but\nqueued prompts and commands now live in the session-owned steer and\nfollow-up queues. Include pendingMessageCount so auto-refine defers to\nthe next turn boundary instead of running before queued input turns,\nand post-compaction continue is scheduled when only session-owned work\nis waiting (manual, auto, and failure-resume paths).\n\n* fix(daemon): centralize prompt admission compatibility\n\n* fix(daemon): recheck command compatibility on replay"},{"name":"no-silent-catch.test.ts","kind":"file","size":1660,"lastCommitHash":"032e3ee74574ca16efaf8745a1394b821256a5d0","lastCommitWhen":"2026-08-18T12:17:35+02:00","lastCommitMessage":"chore: remove redundant comments and unused internals (#1505)\n\n* chore: remove redundant comments\n\n* chore(tui): remove redundant export comments\n\n* chore(coding-agent): remove redundant example comments\n\n* chore(ai): remove redundant comments\n\n* chore(coding-agent): remove obsolete core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant rpc test comments\n\n* chore(coding-agent): remove redundant CLI comments\n\n* chore(agent): remove redundant comments\n\n* chore(tui): remove redundant source comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(ai): remove redundant source comments\n\n* chore(coding-agent): remove redundant session comments\n\n* chore(coding-agent): remove redundant core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(tests): remove redundant test comments\n\n* chore: remove unused internal helpers\n\n* docs: restore public API contracts\n\n* chore(coding-agent): restore invariant documentation\n\n* chore(coding-agent): clarify agent family contracts\n\n* style(coding-agent): format restored contracts\n\n* fix: restore intentional catch explanations"},{"name":"node-version-check.test.ts","kind":"file","size":2428,"lastCommitHash":"10ef94a7583f0acba130493fe77c555d482fa835","lastCommitWhen":"2026-07-16T12:23:32-07:00","lastCommitMessage":"guide users on unsupported node instead of crashing on launch (#273)\n\n* guide users on unsupported node instead of crashing on launch\n\n* point node-version guidance at the releases page instead of a wrong npm name\n\n* fix node version preflight"},{"name":"oauth-selector.test.ts","kind":"file","size":15858,"lastCommitHash":"032e3ee74574ca16efaf8745a1394b821256a5d0","lastCommitWhen":"2026-08-18T12:17:35+02:00","lastCommitMessage":"chore: remove redundant comments and unused internals (#1505)\n\n* chore: remove redundant comments\n\n* chore(tui): remove redundant export comments\n\n* chore(coding-agent): remove redundant example comments\n\n* chore(ai): remove redundant comments\n\n* chore(coding-agent): remove obsolete core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant rpc test comments\n\n* chore(coding-agent): remove redundant CLI comments\n\n* chore(agent): remove redundant comments\n\n* chore(tui): remove redundant source comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(ai): remove redundant source comments\n\n* chore(coding-agent): remove redundant session comments\n\n* chore(coding-agent): remove redundant core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(tests): remove redundant test comments\n\n* chore: remove unused internal helpers\n\n* docs: restore public API contracts\n\n* chore(coding-agent): restore invariant documentation\n\n* chore(coding-agent): clarify agent family contracts\n\n* style(coding-agent): format restored contracts\n\n* fix: restore intentional catch explanations"},{"name":"onboarding-startup.test.ts","kind":"file","size":2795,"lastCommitHash":"1ec948118ec93ec60d9fd3eecbbcdbe340b3b455","lastCommitWhen":"2026-07-10T15:47:49-07:00","lastCommitMessage":"stop onboarding from gating normal tui use (#377)\n\n* fix(coding-agent): stop onboarding from gating tui use (ENG-4537)\n\n* fix(coding-agent): retain deferred initial prompts\n\n* style(coding-agent): remove redundant onboarding comments"},{"name":"orphan-process-journal.test.ts","kind":"file","size":7187,"lastCommitHash":"0940833b771fbaf5144451988604b310a96722fd","lastCommitWhen":"2026-08-26T14:41:46-07:00","lastCommitMessage":"Async bash() tool for the kernel runtime (#1684)\n\n* feat(coding-agent): add async-by-default bash() to the kernel runtime\n\n* chore(coding-agent): tighten bash() comments and changelog fragment\n\n* fix(coding-agent): address bash() review findings — exact tail retention, foreground-status lifecycle with group anchoring, post-kill forkserver reap, Windows start-id parity, executor-free await\n\n* fix(coding-agent): tree-kill bash() process trees on Windows and make running reflect group liveness\n\n* fix(coding-agent): carry bash() status pipe as stdin so strict-POSIX shells accept single-digit fd redirections\n\n* fix(coding-agent): close status fds when wake-pipe creation fails and gate bash() commands on orphan-journal registration\n\n* fix(coding-agent): kill full process trees in the Windows orphan reaper via taskkill /T\n\n* fix(coding-agent): kill one-shot await bash() on cancel, resolve Windows helpers via System32, retry taskkill after reap, and fail closed on orphan-journal enrollment\n\n* fix(coding-agent): confirm group exit before a cancelled one-shot bash() await propagates and complete-write orphan-journal records\n\n* fix(coding-agent): shield the cancelled-await bash() confirm-exit from re-cancellation, fail clearly without bash on Windows, and fence slow pumps out of result assembly\n\n* fix(coding-agent): flag the pump's read-to-commit window so the bash() drain fence cannot miss an in-flight chunk\n\n* fix(coding-agent): resolve taskkill via absolute System32 path in the host orphan reaper\n\n* fix(coding-agent): write the inactive orphan-journal record only after a delivered kill so undelivered signals leave the host reaper in charge\n\n* fix(coding-agent): count an already-exited leader as delivered in the Windows bash() reap so clean exits still journal inactive\n\n* fix(coding-agent): resolve trusted absolute shell host-side and close Windows journal/reap gaps\n\n* fix(coding-agent): best-effort-kill pid-only orphan records in daemon force-stop and recovery reaps\n\n* fix(coding-agent): resolve the kernel bash shell only from trusted absolute paths on Windows\n\n* fix(coding-agent): contain Windows bash children with kill-on-close job objects\n\n* fix(coding-agent): fall back to taskkill when job termination fails\n\n* fix(coding-agent): start Windows bash children suspended and fail closed when job containment cannot be established\n\n* fix(coding-agent): kill the whole tree for enriched orphan records on Windows force-stop\n\nstopTrackedProcess signals only the shell pid on Windows; use killOrphanProcess (taskkill /T) after the identity check, matching the owned-session-worker and daemon-supervisor reapers.\n\n* fix(coding-agent): skip the liveness check when the orphan identity is stale\n\nA reused pid looked like a failed kill after the identity re-check skipped taskkill, blocking worker cleanup with a spurious failure.\n\n* fix(coding-agent): journal Windows bash() children before job assignment so a kernel kill mid-spawn cannot leak an unjournaled suspended process\n\n* fix(coding-agent): pre-create the Windows bash() job before spawn and contain the child before the journal start-id query\n\n* fix(coding-agent): create Windows bash() children atomically inside the kill-on-close job via PROC_THREAD_ATTRIBUTE_JOB_LIST, closing the Popen-to-assignment leak window\n\n* chore(coding-agent): compress the atomic-job-association comments to one-line rationale\n\n* fix(coding-agent): retain the Windows bash() process handle through job cleanup and taskkill fallbacks so a recycled pid can never be killed\n\n* fix(coding-agent): serialize Windows bash() abort cleanup under the kill lock so shutdown taskkill can never race the process-handle close"},{"name":"owned-session-worker-process.test.ts","kind":"file","size":11893,"lastCommitHash":"82a4ee24ee251c694d0da4ac0ec4b580a7bf8ed5","lastCommitWhen":"2026-07-22T21:19:13+02:00","lastCommitMessage":"test(coding-agent): promote routing and notice coverage (#500)\n\n* test(coding-agent): promote routing and notice coverage\n\n* test: stabilize routing coverage\n\nfixes #500\n\n---------\n\nCo-authored-by: Kevin Thomas <kevin.jt2007@gmail.com>"},{"name":"owned-session-worker.test.ts","kind":"file","size":2393,"lastCommitHash":"82a4ee24ee251c694d0da4ac0ec4b580a7bf8ed5","lastCommitWhen":"2026-07-22T21:19:13+02:00","lastCommitMessage":"test(coding-agent): promote routing and notice coverage (#500)\n\n* test(coding-agent): promote routing and notice coverage\n\n* test: stabilize routing coverage\n\nfixes #500\n\n---------\n\nCo-authored-by: Kevin Thomas <kevin.jt2007@gmail.com>"},{"name":"package-command-paths.test.ts","kind":"file","size":20833,"lastCommitHash":"039eba051a93e009c9336262cf6357523e85473d","lastCommitWhen":"2026-07-16T15:24:29-07:00","lastCommitMessage":"fix daemon update restart coordination (#406)\n\n* fix(coding-agent): prevent concurrent daemon supervisors\n\nFixes ENG-4600\n\n* fix(coding-agent): harden supervisor handoff\n\nFixes ENG-4600\n\n* test(coding-agent): prove resident handoff\n\nFixes ENG-4600\n\n* test(coding-agent): preserve daemon socket exports\n\nFixes ENG-4600\n\n* test(coding-agent): isolate supervisor registry\n\nFixes ENG-4600\n\n* fix(coding-agent): reduce supervisor ownership scope (ENG-4600)\n\n* test(coding-agent): make supervisor teardown deterministic (ENG-4600)\n\n* test(coding-agent): contain supervisor fixtures (ENG-4600)\n\n* test(coding-agent): grace supervisor fixture cleanup (ENG-4600)\n\n* fix(coding-agent): coordinate daemon update restarts\n\nFixes ENG-4606\n\n* test(coding-agent): clean stale fixture owners (ENG-4600)\n\n* fix(coding-agent): harden update restart recovery\n\nFixes ENG-4606\n\n* fix(coding-agent): contain restart recovery failures\n\nFixes ENG-4606\n\n* test(coding-agent): clean replacement fixture owner (ENG-4600)\n\n* fix(coding-agent): report restart recovery results\n\nFixes ENG-4606\n\n* fix(coding-agent): await update recovery completion\n\nFixes ENG-4606\n\n* fix(coding-agent): defer daemon startup fence (ENG-4600)\n\n* fix(coding-agent): watchdog update restart progress\n\nFixes ENG-4606\n\n* fix(coding-agent): fence late daemon hello (ENG-4600)\n\n* fix(coding-agent): join concurrent update recovery\n\nFixes ENG-4606\n\n* fix(coding-agent): fence Windows process identity\n\nFixes ENG-4606\n\n* fix(coding-agent): harden update restart progress\n\nFixes ENG-4606\n\n* fix(coding-agent): complete supervisor shutdown cleanup (ENG-4600)\n\n* fix(coding-agent): scope update restart recovery\n\nFixes ENG-4606\n\n* fix(coding-agent): normalize restart identity lazily\n\nFixes ENG-4606\n\n* fix(coding-agent): recover ambiguous daemon shutdown\n\nFixes ENG-4606\n\n* chore: trigger ci after retargeting\n\nFixes ENG-4606\n\n* fix(coding-agent): preserve interactive daemon boundary\n\nFixes ENG-4606\n\n* test(coding-agent): isolate self-update install paths\n\nFixes ENG-4606\n\n* fix(coding-agent): harden coordinator completion waits\n\nFixes ENG-4606\n\n* fix(coding-agent): stabilize restart coordinator home\n\n* fix(coding-agent): preserve interactive update child"},{"name":"package-manager-ssh.test.ts","kind":"file","size":3363,"lastCommitHash":"5b280898a02a43f6d0024fd4503e30c925fc52c6","lastCommitWhen":"2026-07-17T14:24:38-07:00","lastCommitMessage":"test: remove redundant lower-level coverage (#439)"},{"name":"package-manager.test.ts","kind":"file","size":77656,"lastCommitHash":"032e3ee74574ca16efaf8745a1394b821256a5d0","lastCommitWhen":"2026-08-18T12:17:35+02:00","lastCommitMessage":"chore: remove redundant comments and unused internals (#1505)\n\n* chore: remove redundant comments\n\n* chore(tui): remove redundant export comments\n\n* chore(coding-agent): remove redundant example comments\n\n* chore(ai): remove redundant comments\n\n* chore(coding-agent): remove obsolete core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant rpc test comments\n\n* chore(coding-agent): remove redundant CLI comments\n\n* chore(agent): remove redundant comments\n\n* chore(tui): remove redundant source comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(ai): remove redundant source comments\n\n* chore(coding-agent): remove redundant session comments\n\n* chore(coding-agent): remove redundant core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(tests): remove redundant test comments\n\n* chore: remove unused internal helpers\n\n* docs: restore public API contracts\n\n* chore(coding-agent): restore invariant documentation\n\n* chore(coding-agent): clarify agent family contracts\n\n* style(coding-agent): format restored contracts\n\n* fix: restore intentional catch explanations"},{"name":"package-self-update-daemon.test.ts","kind":"file","size":50023,"lastCommitHash":"6d3e2609b33beb81af58523b867bc2a401425b3a","lastCommitWhen":"2026-08-31T23:35:01+09:00","lastCommitMessage":"fix(update): restart prepared daemon when coordination fails\n"},{"name":"path-utils.test.ts","kind":"file","size":6242,"lastCommitHash":"d22c120b82336af859adc8cc4d54e7a37200bcc5","lastCommitWhen":"2026-04-15T12:00:46+02:00","lastCommitMessage":"handle lower case am/pm in macos screenshot names (#3194)"},{"name":"paths.test.ts","kind":"file","size":2879,"lastCommitHash":"032e3ee74574ca16efaf8745a1394b821256a5d0","lastCommitWhen":"2026-08-18T12:17:35+02:00","lastCommitMessage":"chore: remove redundant comments and unused internals (#1505)\n\n* chore: remove redundant comments\n\n* chore(tui): remove redundant export comments\n\n* chore(coding-agent): remove redundant example comments\n\n* chore(ai): remove redundant comments\n\n* chore(coding-agent): remove obsolete core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant rpc test comments\n\n* chore(coding-agent): remove redundant CLI comments\n\n* chore(agent): remove redundant comments\n\n* chore(tui): remove redundant source comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(ai): remove redundant source comments\n\n* chore(coding-agent): remove redundant session comments\n\n* chore(coding-agent): remove redundant core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(tests): remove redundant test comments\n\n* chore: remove unused internal helpers\n\n* docs: restore public API contracts\n\n* chore(coding-agent): restore invariant documentation\n\n* chore(coding-agent): clarify agent family contracts\n\n* style(coding-agent): format restored contracts\n\n* fix: restore intentional catch explanations"},{"name":"pi-user-agent.test.ts","kind":"file","size":539,"lastCommitHash":"a04350e4a7b96cdf1835d387a1cc3e55ad2426fe","lastCommitWhen":"2026-05-19T15:47:12-07:00","lastCommitMessage":"switch update checks to prime agent releases (#49)\n\n* fix(coding-agent): use prime update manifest\n\n* fix(coding-agent): remove pi telemetry from update flow\n\n* fix(coding-agent): avoid redundant tarball self-updates\n\n* fix(coding-agent): use manifest install spec for forced updates\n\n* fix(coding-agent): clean up old package after tarball rename"},{"name":"plan-mode-utils.test.ts","kind":"file","size":8173,"lastCommitHash":"e8f1322eeee866c4fb8e8d5f04cb81078595e431","lastCommitWhen":"2026-01-13T17:53:11+01:00","lastCommitMessage":"feat(plan-mode): enhanced plan mode with explicit step tracking (#694)\n\nChanges from the original:\n- Explicit [DONE:n] tag tracking (more accurate than auto-marking on tool_result)\n- Plan: header requirement - only extracts todos from 'Plan:' sections\n- Utils extracted to separate file for testability\n- Better session resume - only scans messages after plan-mode-execute marker\n- Context filtering - properly filters plan-mode-context custom type messages\n- Refactored to directory structure (index.ts + utils.ts + README.md)\n\nThe original auto-completed steps on every tool_result, which was inaccurate\nfor multi-tool steps. This version uses explicit [DONE:n] markers that the\nagent outputs after completing each step."},{"name":"prime-inference-auth.test.ts","kind":"file","size":15011,"lastCommitHash":"724f351af7e4bf889a2a386278b066e53e86d574","lastCommitWhen":"2026-06-17T14:28:06-07:00","lastCommitMessage":"add opt-in trace uploads (#169)\n\n* add opt-in trace uploads\n\n* slow trace upload cadence\n\n* clarify missing trace endpoint\n\n* use prod trace upload endpoint by default\n\n* address trace upload review comments\n\n* serialize trace upload flushes"},{"name":"prime-inference-model-selection.test.ts","kind":"file","size":2055,"lastCommitHash":"a2bc615663993892a7dec49268ae6f5b8b5a96ea","lastCommitWhen":"2026-07-14T19:01:37-07:00","lastCommitMessage":"fix(coding-agent): persist prime inference model (#400)"},{"name":"prime-onboarding-splash.test.ts","kind":"file","size":5805,"lastCommitHash":"d02d98da8a3054f2c2bb3e1c07dda9c88de62eca","lastCommitWhen":"2026-07-16T14:46:13-07:00","lastCommitMessage":"fix onboarding login and model selector flow (#445)\n\n* fix: stabilize onboarding flow\n\nFixes ENG-4658\n\n* fix: preserve onboarding focus\n\nFixes ENG-4658"},{"name":"prime-team-selector.test.ts","kind":"file","size":2575,"lastCommitHash":"fbc546222812e8fc722075de028d2b0af9d71c42","lastCommitWhen":"2026-05-27T17:22:03-07:00","lastCommitMessage":"add prime team selection to onboarding (#73)\n\n* add prime inference team selection\n\n* fix startup cwd display for worktrees\n\n* fix prime team fallback precedence\n\n* fix prime team login cancellation\n\n* fix onboarding notification defaults"},{"name":"print-mode.test.ts","kind":"file","size":34349,"lastCommitHash":"274cbb84fb7f82c96b478659645b6de9e2e4ad8f","lastCommitWhen":"2026-08-21T10:59:54-07:00","lastCommitMessage":"feat(coding-agent): surface refinement status and outcomes (#447)\n\n* feat(coding-agent): surface refinement and queue prompts\n\n* fix(coding-agent): preserve internal prompt handoff semantics\n\n* fix(coding-agent): preserve refinement queue order\n\n* fix: preserve queued prompt semantics\n\n* feat(coding-agent): show exact refinement edits\n\n* chore: restore main's package-lock.json\n\n* test: assert isRefining stays false while a public refine waits for idle\n\n* review: bump daemon schema to 17, drop duplicate attach-terminal refinement lines, tighten comments\n\n* test: executable compatibility assertions for revision-17 refinement additions\n\n* fix: mirror compaction_outcome handling for refinement_outcome in print mode and context rebuilds\n\n* Render refinement outcomes like compaction and skill messages\n\nReplace the bespoke checkmark rendering with the shared custom-message\npattern: a boxed bold [refinement] label on the customMessage background,\ncollapsed to a single summary line and expanded through the same\ntool-output toggle (ctrl+o) that compaction summaries and skill\ninvocations use, instead of a separate edit-diff axis.\n\n* Strip the live-status plumbing; keep only the durable outcome message\n\nThe apply phase is sub-second, so a \"Refining\" loader, agents-view\nstatus label, daemon status string, heartbeat deferral, and an\nisRefining wire flag were all periphery for something users can barely\nsee. Drop refinement_start/end events and every isRefining touchpoint\n(daemon protocol schema stays at 16 — no wire change at all), and slim\nthe outcome-message validator to the shallow envelope checks the\ncompaction outcome uses. The feature is now just the persisted\n[refinement] transcript card.\n\n* Show a live loader for user-issued /refine by reusing existing edges\n\nNo new events or state: start the loader when the /refine slash-command\nmessage reaches the transcript and stop it on the already-wire-visible\nrefine_complete/refine_failed events, mirroring the compaction loader.\n\n* Extract the shared expandable custom-message card skeleton\n\nCompaction, skill, and now refinement cards each copied the same Box\nsubclass with an expanded flag, setExpanded, invalidate, and bold-label\nformatting. Pull that into ExpandableCustomMessageBox + a\ncustomMessageLabel helper and rebase all three components onto it, so\nthe refinement card only carries its edit-row/diff formatting.\n\n* Emit refine_failed when a queued /refine command fails\n\nA failed /refine persisted its command-error row without emitting\nrefine_failed, so the TUI loader kept spinning. Emit it from the queued\ncommand catch, matching the refine.run and auto-refine failure paths.\n\n* Align the refinement card layout with compaction and shield its loader\n\nCollapsed card now renders the [refinement] label line above the\nsummary line, matching the compaction card structure. The refine loader\njoins compaction/retry in the syncWorkingLoader ownership guard so\nperiodic reconcile paths (subagent updates, connection refreshes)\ncannot clear it mid-refine.\n\n* Truncate the collapsed refinement summary instead of wrapping\n\nLong summaries wrapped the collapsed line onto a second row. Render the\ncollapsed line through a width-aware component that ellipsizes the\nsummary while keeping the edit count and expand hint visible.\n\n* Remount the refine loader after compaction and hard-clip the collapsed line\n\nA compaction that starts mid-refine owns the status container; on\ncompaction_end syncWorkingLoader now remounts the refine loader instead\nof bailing on the ownership guard. The collapsed outcome line is also\nclipped to the render width after assembly so extreme narrow viewports\ncannot wrap it.\n\n* fix: settle the /refine loader on its own result row and discard it on teardown\n\nrefine_complete carries no request identity, so an agent or auto\nrefinement settling while a queued user /refine waited on it killed the\nloader early. The /refine result row is the user refine's settle edge\n(emitted after refine() returns, error row on failure), so the loader\nstops there — and on refine_failed, which covers a failed result-row\nappend. Session switches and stop() now discard the loader timer, which\npreviously leaked when the view never received a settle event.\n\n* fix(coding-agent): correlate refine loader settlement\n\n* fix: emit refine_failed only for the refinement itself\n\nThe queued /refine catch emitted refine_failed for any error in the\ncommand try, including a result-row persist failure after refine()\nsucceeded — reporting a completed harness update as failed. The emit now\nwraps only the parse+refine call; the outer catch keeps its row-append\nduty as the correlated settle edge.\n\n* fix(coding-agent): remove refine loader on teardown\n\n* fix(coding-agent): retain outcomes when refine audit write fails\n\n---------\n\nCo-authored-by: Seth <seth@primeintellect.ai>"},{"name":"prompt-admission.test.ts","kind":"file","size":1404,"lastCommitHash":"2f218e15130904568a805ac8d1920927747d7791","lastCommitWhen":"2026-07-30T17:38:20+02:00","lastCommitMessage":"feat: unified agents and resume view (#541)\n\n* feat(coding-agent): unify searchable session view\n\n* fix(tui): keep session durations stable\n\n* test(daemon): tolerate partial session manager fixtures\n\n* test(tui): narrow session view race coverage\n\n* fix(tui): stabilize unified session catalogs\n\n* fix(tui): preserve session view lifecycle\n\n* fix(tui): preserve compact session view layout\n\n* test(tui): align cumulative session fixtures\n\n* fix(tui): preserve unified session identity and drafts\n\n* feat(tui): color recognized slash commands\n\n* fix(tui): keep view cancels and subagent matches local\n\n* test(tui): avoid platform-specific markdown styling\n\n* fix(tui): align session view status, reselect, and local resume flows\n\n* test(tui): consolidate slash command rendering coverage\n\n* test(tui): cover session view exit shutdown from chat\n\n* fix(tui): preserve dynamic command presentation\n\n* test(coding-agent): deadline-wait the create dedup race\n\n* test(coding-agent): align stacked fixtures\n\n* fix(tui): show seconds for sub-minute heartbeat countdowns\n\n* test(coding-agent): align cumulative session behavior\n\n* fix(coding-agent): flush child traces regardless of retention\n\n* fix(tui): single-own replacement catalog refresh\n\n* fix(tui): preserve drafts and completed child traces\n\n* fix(coding-agent): align template argument whitespace\n\n* fix(tui): restore saved sessions after reconnect\n\n* test(coding-agent): consolidate command presentation coverage\n\n* feat(tui): resume saved sessions from the reply composer\n\n* fix(tui): require heartbeat reconnect probe\n\n* test(coding-agent): align cumulative admission errors\n\n* fix(tui): schedule resumed replies from the resume summary\n\n* test(tui): align lifecycle stash handoff result\n\n* test(coding-agent): preserve unique lifecycle coverage\n\n* fix(tui): preserve inactive reply state on failures\n\n* fix(tui): route local agents view startup\n\n* refactor(tui): single-owner command catalog refresh\n\n* fix(tui): preserve selection after saved resume\n\n* test(tui): align startup lifecycle handoff\n\n* test(tui): resolve cumulative submit fixture\n\n* fix(tui): preserve in-flight reply drafts\n\n* test(tui): align owned startup exit shape\n\n* test(daemon): align delivery waiter contract\n\n* fix(tui): refresh resumed reply failures\n\n* fix(tui): preserve search selection\n\n* style(test): format cumulative prompt coverage\n\n* fix(agents-view): refresh reply target before send\n\n* fix(tui): complete onboarding before sessions\n\n* fix(tui): fence resync rendering by generation\n\n* refactor(coding-agent): consolidate prompt-admission cancellation\n\nExtract one shared waitForPromptAdmission helper and typed\nPromptAdmissionCancelledError into core/prompt-admission.ts, replacing\nthree near-identical copies in agent-session, daemon-mode, and\ndaemon-supervisor along with their copy-paste tests and the supervisor's\nstringly cancelled-status cast.\n\nAlso:\n- make _steeringStopPending a derived getter instead of a cached field\n  manually re-synced at 15 call sites\n- surface genuine handoff errors in _isDeferredSessionInputError instead\n  of silently requeueing them when the session is coincidentally busy\n- remove the production-dead pauseQueuedWork shim and narrow\n  resumeQueuedWork to pump-suspension recovery only\n\n* test(coding-agent): deterministic waits and shared test helpers\n\n- replace the 50ms sleep proving no queued turn starts after\n  abortForUpdateRestart with waitForSessionInputIdle\n- replace the 300ms sleep proving no prompt retry after an uncertain\n  admission failure with a bounded microtask drain\n- use the shared createDeferred from suite/scheduling.ts instead of two\n  local reimplementations\n- guard Reflect-based private access in the agents-view and supervisor\n  harnesses so renamed members fail with explicit messages, and document\n  why the constructor-bypass supervisor harness exists\n\n* chore(coding-agent): trim redundant comments from recent refactors\n\n* fix(coding-agent): guard session-input error surfacing against listener throws\n\nA throwing extension error listener could escape _surfaceSessionInputError\ninside _isDeferredSessionInputError before the pump requeued undelivered\nprompts, dropping them. Surfacing is now best-effort.\n\n* chore(coding-agent): tighten fix comment\n\n* fix(tui): keep the selection anchor across fallback unblocking\n\nResolving a missing anchor no longer overwrites the persisted anchor\nidentities with the visible fallback row, and typing while the anchor is\npending no longer claims the fallback either, so a late poll that\ndelivers the intended session re-anchors selection instead of opening\nthe wrong session.\n\n* fix(tui): open the unified session view on back navigation in local chats\n\nThe left-arrow back gesture only worked for daemon-backed sessions;\nprocess-local chats could reach the same unified view only via /resume.\nBack navigation now routes through requestAgentsView, which opens the\nlocal session view in place for process-local sessions.\n\n* fix(tui): preserve reply statuses across post-reply catalog refreshes\n\nThe refreshes triggered after a reply send or a failed resumed send used\ndefault error handling, so a failing catalog refresh could overwrite the\nsticky cwd-fallback notice or the send-failure message. Both refreshes\nnow preserve the current status on error.\n\n* chore(tui): drop redundant back-navigation comment\n\n* chore(tui): tighten reply-status comments\n\n* feat(tui): new session shortcut and steer/queue reply delivery\n\nctrl+n (app.agents.new) creates a fresh daemon session from the agents\nview and opens it. In the reply composer, Enter now steers a streaming\nagent and alt+enter (app.message.followUp) queues the reply as a\nfollow-up. While the composer is armed the hint line switches to\ncomposer hints: steer/send/resume & send, queue once text is typed, and\nesc to cancel.\n\n* feat(tui): session-owned slash commands in the reply composer\n\n/compact, /refine, /goal, and /autonomous pass through the daemon\nprompt path from the agents-view reply composer, with slash\nautocomplete active only while a reply target is armed. Other built-in\ncommands are rejected with guidance instead of being sent to the model\nas plain text.\n\n* feat(tui): view commands in the agents view\n\n/new, /fork, /name, and /kill run from the search editor against the\nselected row and from the armed reply composer against its target,\nwith autocomplete in both contexts. /fork forks at the current leaf via\nthe existing daemon fork RPC, resuming saved rows first; /name renames\nactive or saved sessions; /kill stops a running agent. Unknown or\nsession-only commands are rejected with guidance and plain text remains\na search query. The search hints now advertise \"/ commands\".\n\n* fix(tui): harden new-session shortcut and follow-up delivery\n\nctrl+n no longer fires while the reply composer is armed, so an unsent\ndraft cannot be discarded by opening a new session. Alt+Enter now\nexpands paste markers like Enter does. A session created after the view\nalready finished is killed instead of orphaned in the agents list.\n\n* fix(tui): preserve rejected drafts and bind completions to the target cwd\n\nA rejected command no longer loses the typed text (submitValue clears\nthe buffer before onSubmit; the rejection path now restores it unless\nnewer input arrived). The composer autocomplete provider is rebuilt\nwhen a target is armed, so @-file completions resolve in the target\nsession's cwd instead of the view's startup directory.\n\n* fix(tui): harden view commands against races, stale composers, and cancels\n\nAdapter-mode search no longer suggests view commands it will not run.\nArmed view commands cannot double-run (the buffer is already clear\nduring the RPC) and a failed command restores the typed draft in both\nthe composer and the search editor, without clobbering newer input.\nComposer disarm after /kill and /fork is guarded against a composer\nre-armed mid-command, and a fork cancelled by an extension is reported\nas cancelled instead of success.\n\n* fix(tui): report new-session outcome to callers\n\ncreateNewSession returns whether a session was created and opened, so\ncommand callers can restore a cleared draft on failure.\n\n* fix(tui): refresh after failed resumed forks and propagate /new outcome\n\nA saved row resumed for a fork that then fails, cancels, or has nothing\nto fork now refreshes the catalog so the newly live session appears\nimmediately. /new propagates createNewSession's outcome so a failed\ncreate restores the cleared draft.\n\n* fix(tui): enable @-path completion in the reply composer\n\nThe composer provider was built without an fd path, so @ fuzzy file\nsearch always returned empty. The view now resolves fd once and rebinds\nan armed provider when it becomes available.\n\n* fix(tui): create sessions over a dedicated connection\n\nfinish() closes the shared client, which rejected an in-flight create\nand made its session unkillable; a missing client also threw before the\nguard reset, permanently disabling the shortcut. Session creation now\nruns on its own short-lived connection inside the guarded try, so the\norphan-kill path works even after the view finished.\n\n* fix(tui): harden view commands against stale targets and filter churn\n\nSlash input in the search editor no longer filters the list, which\ncould swap the selected row before Enter ran the command on it. The\narmed composer re-resolves its captured summary before dispatch so\n/kill, /name, and /fork act on the current runtime, and rejects view\ncommands under the local adapter instead of sending them as prompt\ntext. A session resumed only to serve a fork is stopped again when the\nfork fails or is cancelled.\n\n* docs(tui): move the dedicated-connection rationale to its helper\n\n* fix(tui): drop submitted view commands from the persisted query\n\nsubmitValue clears the editor without queryChanged, so a successful\nsearch-editor command stayed in persistentState.query and a remount\nrestored it where Enter could re-run it on an arbitrary row. Failed\ncommands restore the draft through setSearchQuery so the persisted\nquery stays in sync.\n\n* fix(tui): only freeze the search filter for recognized command input\n\nUnknown slash-prefixed terms like /foo stayed unfiltered because any\nleading slash suppressed the query. The filter now freezes only while\nthe input is a view command or a prefix that can still extend into one,\nso ordinary slash search terms keep filtering.\n\n* fix(tui): warn on view commands in the adapter search editor\n\nAdapter sessions fell through to openSelected() when a view command was\ntyped, opening an unrelated row. The search branch now rejects them\nwith the same unavailable-command warning the reply composer shows.\n\n* test: consolidate overlapping reply-composer tests\n\n* test: fold command-classification cases into one test\n\n* test: consolidate overlapping view-command tests\n\n* refactor(tui): drop the /fork view command\n\nThe in-place daemon fork semantics (runtime rebind at the current leaf,\nresume-then-rollback for saved rows) carried a third of the view-command\ncomplexity for a command whose behavior we already flagged as awkward\nuntil isolated forking lands. /new, /name, and /kill remain.\n\n* fix(tui): restore the draft when the adapter search rejects a command\n\nsubmitValue had already cleared the buffer, so the warning silently ate\nthe typed command; it now comes back through setSearchQuery like other\nfailed search-editor commands.\n\n* test: fold sendReply delivery and follow-up keybinding cases together\n\n* test: fold draft-restore rejection cases together\n\n* docs(tui): tighten create-session comments\n\n* docs(tui): tighten the fd-rebind comment\n\n* test: fold overlapping composer tests; tighten comments\n\n* fix(tui): ctrl+c cancels the armed composer as its hint advertises\n\napp.clear ran first and started the exit flow, so a second ctrl+c could\nexit the view and discard the draft.\n\n* fix(tui): refresh the saved catalog after a live /name rename\n\nOnly the live list was refreshed, so the stale saved entry resurfaced\nthe old name once the agent was killed. Mirrors confirmRename.\n\n* fix(tui): gate search autocomplete on command input; refresh both catalogs after /kill\n\nAbsolute-path queries like /tmp/ fell through CombinedAutocompleteProvider\nto filesystem completions; the search editor now uses the same\nisAgentsViewCommandInput predicate as the filter freeze. Catalog\nrefreshes after rename and kill go through a shared refreshBothCatalogs\nso a killed agent reliably reappears under Inactive.\n\n* refactor(tui): share one renameSession path between rename mode and /name\n\n/name reimplemented the rename separately: it reported success before\nthe refresh and missed the older-daemon restart hint. Both entry points\nnow use the same rename/refresh/report sequence.\n\n* fix(tui): tolerate an already-finished agent in /kill\n\ndeactivatePendingAgent treats \"Unknown active session\" as already\nstopped; /kill surfaced the same race as a raw error.\n\n* docs(tui): drop comments that restate adjacent code\n\n* refactor(tui): search-only search bar; retire /resume and the local session view\n\nThe agents-view search bar no longer parses commands: /name and /kill\nlive only in the armed reply composer (their target is captured\nexplicitly), and new-session stays on its keybinding. This deletes the\nsearch-command autocomplete, the filter-freeze machinery, and the\npersisted-query replay handling that command input required.\n\nSession browsing is daemon-only: /resume and bare --resume are removed\nalong with the process-local SessionViewAdapter and every adapter\nbranch in the view. --resume <id|path> still resumes directly;\nnon-daemon `agents` warns and opens a chat. The chat hint now reads\n\"agents/resume\".\n\n* test: port #502 saved-catalog regressions off the removed adapter seam\n\nThe adapter layer was removed with /resume, so refreshSavedSessions now\nstreams list_saved_sessions through the daemon client and confirmRename\ndelegates to the shared renameSession path. The #502 regression harnesses\nstill faked options.adapter, so three tests failed (and two more passed\nonly because the missing client stub produced the expected false). Rebuild\nthem against client.request with onProgress streaming and the renameSession\ndelegate; behavior under test is unchanged.\n\n* chore: drop orphaned JSDoc for the removed bare --resume option"},{"name":"prompt-templates.test.ts","kind":"file","size":19729,"lastCommitHash":"f8f02221eecad192c65324ebba50037505cfdac6","lastCommitWhen":"2026-08-20T13:17:52+02:00","lastCommitMessage":"feat: add generic kernel-owned MCP runtime (#1495)\n\n* feat(coding-agent): add generic MCP runtime\n\n* fix(coding-agent): harden MCP lifecycle and overrides\n\n* fix(runtime): close cancelled host request comms\n\n* fix(runtime): preserve MCP SDK result aliases\n\n* fix(runtime): preserve synchronous kernel shutdown\n\n* fix(runtime): allow MCP close retry after cancellation\n\n* feat(coding-agent): manage MCP servers from CLI and TUI\n\n* fix(coding-agent): preserve inherited stdio env names\n\n* fix(coding-agent): reserve built-in MCP identities\n\n* fix(coding-agent): allow cleanup of reserved MCP entries\n\n* test(coding-agent): update MCP command hint\n\n* fix: address MCP reload and cleanup findings\n\n* fix(coding-agent): advertise generic MCP connections\n\n* fix(coding-agent): keep MCP command results visible\n\n* fix(runtime): surface safe stdio startup diagnostics\n\n* fix(runtime): preserve startup errors through cleanup\n\n* fix(coding-agent): drop stored MCP credentials when a server is removed or replaced\n\n* fix(coding-agent): scope credential drops to generic servers and keep quoted empty argv tokens\n\n* docs(coding-agent): document the removed catalog-name override as a breaking change\n\n* fix: close kernel MCP servers during shutdown\n\n* docs: preserve changelog sections after main merge\n\n* fix: harden MCP shutdown boundaries\n\n* fix: bound graceful kernel shutdown\n\n---------\n\nCo-authored-by: Sebastian <sebastian@primeintellect.ai>"},{"name":"public-command.test.ts","kind":"file","size":14433,"lastCommitHash":"f8f02221eecad192c65324ebba50037505cfdac6","lastCommitWhen":"2026-08-20T13:17:52+02:00","lastCommitMessage":"feat: add generic kernel-owned MCP runtime (#1495)\n\n* feat(coding-agent): add generic MCP runtime\n\n* fix(coding-agent): harden MCP lifecycle and overrides\n\n* fix(runtime): close cancelled host request comms\n\n* fix(runtime): preserve MCP SDK result aliases\n\n* fix(runtime): preserve synchronous kernel shutdown\n\n* fix(runtime): allow MCP close retry after cancellation\n\n* feat(coding-agent): manage MCP servers from CLI and TUI\n\n* fix(coding-agent): preserve inherited stdio env names\n\n* fix(coding-agent): reserve built-in MCP identities\n\n* fix(coding-agent): allow cleanup of reserved MCP entries\n\n* test(coding-agent): update MCP command hint\n\n* fix: address MCP reload and cleanup findings\n\n* fix(coding-agent): advertise generic MCP connections\n\n* fix(coding-agent): keep MCP command results visible\n\n* fix(runtime): surface safe stdio startup diagnostics\n\n* fix(runtime): preserve startup errors through cleanup\n\n* fix(coding-agent): drop stored MCP credentials when a server is removed or replaced\n\n* fix(coding-agent): scope credential drops to generic servers and keep quoted empty argv tokens\n\n* docs(coding-agent): document the removed catalog-name override as a breaking change\n\n* fix: close kernel MCP servers during shutdown\n\n* docs: preserve changelog sections after main merge\n\n* fix: harden MCP shutdown boundaries\n\n* fix: bound graceful kernel shutdown\n\n---------\n\nCo-authored-by: Sebastian <sebastian@primeintellect.ai>"},{"name":"queue-selection.test.ts","kind":"file","size":1508,"lastCommitHash":"bab124212fd5451beb071a884b5771ac7c1a8e1a","lastCommitWhen":"2026-08-29T10:52:17+02:00","lastCommitMessage":"fix(coding-agent): single-source the interactive queue state (#1842)\n\n* fix(coding-agent): single-source the interactive queue state\n\n* fix(coding-agent): close queue-state races around rebind, moves, and failed edits\n\n- rebindCurrentSession: re-sync sessionActions after resubscribing; a\n  session_action_update fired in the unsubscribed gap was lost forever.\n- browseQueueSelection: block browsing while a queue move RPC is pending,\n  matching the pendingQueueEdit guard, so the move response cannot reselect\n  the original item under newly browsed editor text.\n- moveQueueSelection: when the applied move's session_action_update has not\n  landed yet (sessionActions reference unchanged), mirror the swap locally so\n  the moved selection is not dropped against the pre-move snapshot; reconcile\n  the selection in the error path.\n- applyQueueSelection: reconcile the selection after the pending-edit flag\n  clears, so a rejected/failed edit no longer leaves Enter targeting a row\n  that was removed while events were suppressed."},{"name":"refinement-outcome-message.test.ts","kind":"file","size":5922,"lastCommitHash":"274cbb84fb7f82c96b478659645b6de9e2e4ad8f","lastCommitWhen":"2026-08-21T10:59:54-07:00","lastCommitMessage":"feat(coding-agent): surface refinement status and outcomes (#447)\n\n* feat(coding-agent): surface refinement and queue prompts\n\n* fix(coding-agent): preserve internal prompt handoff semantics\n\n* fix(coding-agent): preserve refinement queue order\n\n* fix: preserve queued prompt semantics\n\n* feat(coding-agent): show exact refinement edits\n\n* chore: restore main's package-lock.json\n\n* test: assert isRefining stays false while a public refine waits for idle\n\n* review: bump daemon schema to 17, drop duplicate attach-terminal refinement lines, tighten comments\n\n* test: executable compatibility assertions for revision-17 refinement additions\n\n* fix: mirror compaction_outcome handling for refinement_outcome in print mode and context rebuilds\n\n* Render refinement outcomes like compaction and skill messages\n\nReplace the bespoke checkmark rendering with the shared custom-message\npattern: a boxed bold [refinement] label on the customMessage background,\ncollapsed to a single summary line and expanded through the same\ntool-output toggle (ctrl+o) that compaction summaries and skill\ninvocations use, instead of a separate edit-diff axis.\n\n* Strip the live-status plumbing; keep only the durable outcome message\n\nThe apply phase is sub-second, so a \"Refining\" loader, agents-view\nstatus label, daemon status string, heartbeat deferral, and an\nisRefining wire flag were all periphery for something users can barely\nsee. Drop refinement_start/end events and every isRefining touchpoint\n(daemon protocol schema stays at 16 — no wire change at all), and slim\nthe outcome-message validator to the shallow envelope checks the\ncompaction outcome uses. The feature is now just the persisted\n[refinement] transcript card.\n\n* Show a live loader for user-issued /refine by reusing existing edges\n\nNo new events or state: start the loader when the /refine slash-command\nmessage reaches the transcript and stop it on the already-wire-visible\nrefine_complete/refine_failed events, mirroring the compaction loader.\n\n* Extract the shared expandable custom-message card skeleton\n\nCompaction, skill, and now refinement cards each copied the same Box\nsubclass with an expanded flag, setExpanded, invalidate, and bold-label\nformatting. Pull that into ExpandableCustomMessageBox + a\ncustomMessageLabel helper and rebase all three components onto it, so\nthe refinement card only carries its edit-row/diff formatting.\n\n* Emit refine_failed when a queued /refine command fails\n\nA failed /refine persisted its command-error row without emitting\nrefine_failed, so the TUI loader kept spinning. Emit it from the queued\ncommand catch, matching the refine.run and auto-refine failure paths.\n\n* Align the refinement card layout with compaction and shield its loader\n\nCollapsed card now renders the [refinement] label line above the\nsummary line, matching the compaction card structure. The refine loader\njoins compaction/retry in the syncWorkingLoader ownership guard so\nperiodic reconcile paths (subagent updates, connection refreshes)\ncannot clear it mid-refine.\n\n* Truncate the collapsed refinement summary instead of wrapping\n\nLong summaries wrapped the collapsed line onto a second row. Render the\ncollapsed line through a width-aware component that ellipsizes the\nsummary while keeping the edit count and expand hint visible.\n\n* Remount the refine loader after compaction and hard-clip the collapsed line\n\nA compaction that starts mid-refine owns the status container; on\ncompaction_end syncWorkingLoader now remounts the refine loader instead\nof bailing on the ownership guard. The collapsed outcome line is also\nclipped to the render width after assembly so extreme narrow viewports\ncannot wrap it.\n\n* fix: settle the /refine loader on its own result row and discard it on teardown\n\nrefine_complete carries no request identity, so an agent or auto\nrefinement settling while a queued user /refine waited on it killed the\nloader early. The /refine result row is the user refine's settle edge\n(emitted after refine() returns, error row on failure), so the loader\nstops there — and on refine_failed, which covers a failed result-row\nappend. Session switches and stop() now discard the loader timer, which\npreviously leaked when the view never received a settle event.\n\n* fix(coding-agent): correlate refine loader settlement\n\n* fix: emit refine_failed only for the refinement itself\n\nThe queued /refine catch emitted refine_failed for any error in the\ncommand try, including a result-row persist failure after refine()\nsucceeded — reporting a completed harness update as failed. The emit now\nwraps only the parse+refine call; the outer catch keeps its row-append\nduty as the correlated settle edge.\n\n* fix(coding-agent): remove refine loader on teardown\n\n* fix(coding-agent): retain outcomes when refine audit write fails\n\n---------\n\nCo-authored-by: Seth <seth@primeintellect.ai>"},{"name":"refinement.test.ts","kind":"file","size":46906,"lastCommitHash":"7e70aea03dcf78c97aa65cc2a8e1aeb2a068e5fe","lastCommitWhen":"2026-08-31T22:05:28+09:00","lastCommitMessage":"complete guarded RLM results and background completion wakeups\n"},{"name":"repl-kernel-abort.test.ts","kind":"file","size":22738,"lastCommitHash":"d60fab8a76d9c169f945341f0ee3bde21903bb55","lastCommitWhen":"2026-08-28T17:40:01+02:00","lastCommitMessage":"fix(coding-agent): repair corrupt REPL protocol frames (#1839)\n\n* refactor(coding-agent): unify kernel shutdown\n\n* docs(coding-agent): carry over shutdown rationale comments\n\n* fix(coding-agent): repair corrupt REPL protocol\n\n* fix(coding-agent): cancel the final kernel snapshot before disposal cleanup\n\n* fix(coding-agent): block new executions from splicing ahead of the final dispose snapshot\n\nflushSnapshotForDispose captured the execution queue while the kernel\nstate was still 'running', so a concurrent execute() (which has no\nper-cell timeout) could enqueue after the capture; captureSnapshot then\nqueued behind it and its timeout never started, hanging dispose() and\nshutdown({snapshot:true}) forever. Claim the flush before capturing the\nqueue: non-internal requests are rejected while the final snapshot is\nflushing, keeping every wait on the dispose path bounded.\n\n* fix(coding-agent): close protocol-repair races and bound the repair\n\n- Gate queued requests behind an in-flight repair: a request whose queue\n  slot opens during a repair releases the slot and requeues after the\n  repair, so queued executes/snapshots can no longer run on the empty\n  replacement kernel ahead of restoreState (and overwrite its result or\n  clobber the last good snapshot).\n- Race the repair wait in execute() with opts.signal so an aborted call\n  returns its aborted result promptly instead of pending through repair.\n- Bound the repair's restore with REPAIR_RESTORE_TIMEOUT_MS so a stalled\n  replacement cannot wedge protocolRepairPromise (and every later\n  execute) forever; a timed-out restore discards the replacement and\n  returns to clean idle.\n- Stop respawn-looping when the replacement kernel itself emits a corrupt\n  frame during repair: discard it and settle at clean idle instead of\n  superseding into an unbounded chain of repairs.\n\n* fix(coding-agent): re-bootstrap repaired kernels and gate busy-waiting cells\n\n- A protocol-repaired kernel restored only the user namespace, so live\n  handles (rlm, bash, skills) were missing and the next cell failed with\n  NameErrors. KernelManagerOptions gains bootstrapCode (the provisioner\n  passes its buildRlmBootstrapCode output); the repair re-runs it after\n  restore, bounded like the restore, and discards the replacement to\n  clean idle when it fails.\n- The repair requeue gate only ran right after taking the queue slot, so\n  a cell busy-waiting on an interrupted execution when corruption arrived\n  could proceed onto the unrestored replacement while blocking the\n  repair's restore behind its slot. The gate now sits after the busy-wait\n  (still exempting the repair's own requests), covering both windows.\n- Fold the repeated kill-to-clean-idle teardown into killChildToIdle and\n  rename REPAIR_RESTORE_TIMEOUT_MS to REPAIR_STEP_TIMEOUT_MS since it now\n  bounds restore and bootstrap.\n\n* fix(coding-agent): join concurrent teardowns into one final snapshot flush\n\nConcurrent dispose() and shutdown({ snapshot: true }) (e.g. a session\ndispose racing the SIGINT handler) each ran flushSnapshotForDispose: the\nfirst finisher's finally cleared flushingSnapshotForDispose while the\nsecond was still flushing, dropping the execution guard early and\nenqueueing a duplicate final snapshot behind the first. Memoize the\nin-flight flush so every teardown joins the same bounded flush.\n\n* fix(coding-agent): close protocol repair gaps for schema-invalid frames, startup chunks, and rebootstrap\n\n- Fail the protocol on JSON object frames that violate the frame schema\n  (unknown event kind; done/host_request without a string id) instead of\n  silently dropping them, which left the active request unsettled forever.\n  The protocol version handshake is exact, so unknown kinds are corruption,\n  not forward compatibility.\n- A corrupt frame sharing one stdout chunk with ready no longer lets the\n  startup mark the corrupt child running: failProtocolFrame records the\n  error while starting and doStart fails the start.\n- A fresh kernel started lazily after a discarded repair re-runs the\n  configured runtime bootstrap before serving user code, so rlm/bash/skills\n  handles are never silently missing.\n\n* test(coding-agent): reconcile chain-collapse suites and cover teardown racing the lazy re-bootstrap\n\n- Point the graceful-shutdown flush spies at captureSnapshot: the merged\n  final flush (kernel-snapshot-dispose-timeout) snapshots through the\n  bounded captureSnapshot path, not snapshotState, so the old spies let\n  real snapshot requests hit the mocked wire and leaked fake timers.\n- The superseded repair's booting replacement is now hard-killed without\n  a protocol shutdown (single-kernel-shutdown only drains running\n  kernels), so it may die before journaling its spawn; assert spawn-count\n  stability after teardown instead of an exact boot count.\n- New composition test: a teardown racing an in-flight lazy re-bootstrap\n  stays bounded, spawns nothing new, and settles the raced cell.\n\n* fix(coding-agent): re-check the final-flush guard after the re-bootstrap wait\n\n- An external execute admitted before the final dispose flush could park on\n  the lazy re-bootstrap, then take its queue slot after the flush captured\n  pendingExecutions - splicing between the captured queue and the final\n  snapshot and unbounding the teardown. Re-check the flush guard right\n  after the ensure await; unit test proves the re-check is load-bearing.\n- Deflake the teardown-vs-re-bootstrap composition test: the fake runtime\n  journals its spawn before ready, so poll isRunning before the teardown to\n  race the re-bootstrap deterministically instead of the boot.\n\n* fix(coding-agent): close bot-review gaps in protocol repair and teardown seams\n\n- Terminal frames (done/host_request) with an EMPTY string id now fail the\n  protocol like id-less ones: the runtime mints uuid hex ids and echoes the\n  host's uuids, so an empty id is corruption that previously slipped past\n  the validator into the silent-drop hang.\n- An execution aborted while waiting on the lazy re-bootstrap settles\n  promptly: the wait races the abort signal (same pattern as\n  waitForProtocolRepair) and the aborted request returns before parking on\n  the queue slot behind the still-running bootstrap.\n- A failed kernel startup awaits its own teardown (final snapshot flush\n  included) before surfacing the error, so a replacement provisioner gated\n  on this dispose can no longer race the still-flushing kernel over the\n  same snapshot files.\n- restart() during the final dispose flush is rejected instead of taking a\n  queue slot and joining the owning shutdown, which could deadlock the\n  flush's snapshot behind the held slot.\n\n* test(coding-agent): cover empty-string host_request ids in the frame validator\n\nKills the surviving mutant that relaxed the host_request half of the\nnon-empty-id requirement back to typeof-only: an empty-id host_request now\nhas a corruption test mirroring the empty-id done one (protocol fails and\nthe kernel is repaired instead of the awaiting cell hanging).\n\n* fix(coding-agent): restore the saved namespace on lazily reprovisioned kernels\n\nAfter a discarded repair whose failure never implicated the snapshot (the\nrepair start died, or only its bootstrap failed), the lazily started fresh\nkernel re-ran the bootstrap but silently abandoned the user's saved\nnamespace forever. Track restore separately: killChildToIdle marks both\npending; the two snapshot-culprit discard paths (clean restore failure,\nreplacement corrupted mid-repair) clear the restore flag so a poisoned\nsnapshot is never retried; the lazy path restores one-shot best-effort\n(ordinary startup semantics) before bootstrapping, and a teardown's final\nsnapshot never triggers reprovisioning. Restore-attempt journaling in the\nfake runtime pins the no-retry and no-double-restore semantics.\n\n* fix(coding-agent): protect the saved snapshot from unrestored kernels; phase-aware corruption attribution\n\n- The final dispose flush skips its snapshot while pendingRestore is set:\n  a kernel that never restored the saved namespace must not overwrite it\n  (the on-disk snapshot is strictly fresher). One interleaving-independent\n  condition instead of joining the reprovision promise, which would\n  reintroduce the 30-60s teardown stall the teardown guard prevents. The\n  lazy one-shot clear moves after the corruption check so the flag also\n  covers a flush racing an in-flight lazy restore.\n- The repair give-up path attributes corruption by phase: performRestore\n  clears pendingRestore on success, so the flag still being set means the\n  corruption struck at or before the restore (snapshot stays the prime\n  suspect, loop-safe); corruption strictly after a successful restore\n  keeps the namespace restorable at the cost of at most one bounded\n  restore per later attempt."},{"name":"repl-kernel-execute.test.ts","kind":"file","size":9170,"lastCommitHash":"72bc988e04dff455838cc9078171a1703134eeba","lastCommitWhen":"2026-08-31T22:15:32+09:00","lastCommitMessage":"fix(runtime): survive SystemExit in persistent REPL\n"},{"name":"repl-kernel-mcp-shutdown.test.ts","kind":"file","size":3643,"lastCommitHash":"61eb64748eb077e2a084432db92d101a2a83e146","lastCommitWhen":"2026-08-26T15:24:10-07:00","lastCommitMessage":"Minimal CPython REPL runtime (rlm.repl) (#1685)\n\n* feat(coding-agent): add async-by-default bash() to the kernel runtime\n\n* chore(coding-agent): tighten bash() comments and changelog fragment\n\n* feat(coding-agent): add a standalone CPython REPL runtime speaking JSON lines over stdio\n\n* chore(coding-agent): tighten REPL runtime comments\n\n* feat(coding-agent): run the kernel on the REPL runtime over stdio\n\n* fix(coding-agent): reject pending host requests on kernel teardown\n\nThe runtime now fails pending host_request futures when stdin hits EOF or\na shutdown request arrives, so a cell awaiting a host reply can no longer\nblock _serve from consuming the shutdown and wedge the process. Startup\nand busy-kernel messages plus the ipython tool description now say Python\nkernel, matching the default REPL runtime client.\n\n* chore(coding-agent): describe the kernel-heavy test tag client-neutrally\n\n* feat(coding-agent): make the REPL runtime the only kernel\n\nRemoves the Jupyter/ipykernel/ZMQ kernel client, the fork server, the\nPRIME_AGENT_KERNEL escape hatch, and the %%bash/%cd/%env cell rewriting.\nMagic-style cells (%/%%/!) return a one-line error naming the Python or\nbash() replacement. The kernel venv no longer installs ipykernel;\nexisting venvs are rebuilt once via the bootstrap schema bump. Old\nsnapshot artifacts still restore through the runtime's pickle compat.\n\n* fix(coding-agent): close MCP transports in REPL shutdown\n\n* fix(coding-agent): address bash() review findings — exact tail retention, foreground-status lifecycle with group anchoring, post-kill forkserver reap, Windows start-id parity, executor-free await\n\n* fix(coding-agent): tree-kill bash() process trees on Windows and make running reflect group liveness\n\n* fix(runtime): address repl runtime review findings\n\n- revalidate targeted interrupts through SIGINT delivery so a stale signal\n  cannot cancel a later request\n- preserve a parked untargeted interrupt while another request is inflight\n- reject non-string interrupt ids and validate snapshot options\n  (prune_oversized bool, max_bytes/max_variable_bytes present => int)\n- guard str(exc) in error/skip/fail reasons so a broken __str__ cannot\n  kill the runtime\n- fail the snapshot when the manifest write fails (before any pruning)\n- report 'snapshot not found' reason on restore of a missing path\n- wait unbounded for the output-pump drain marker so done never precedes\n  captured output and marker bytes never leak\n- document that aggregate-cap skips are not pruned\n\n* fix(coding-agent): carry bash() status pipe as stdin so strict-POSIX shells accept single-digit fd redirections\n\n* fix(coding-agent): address host-swap review findings — runtime-neutral kernel wording, %cd/%env rewrite fidelity, linear-time magic regexes, restart supersession guard\n\n* fix(coding-agent): reject stale column-0 line magics on any cell line, not just the first\n\n* fix(coding-agent): close status fds when wake-pipe creation fails and gate bash() commands on orphan-journal registration\n\n* fix(coding-agent): strip quoted %cd targets, use UTF-16-safe %env parsing, and expand $var/${var} values PEP-215-style\n\n* fix(coding-agent): fail rlm.run fast outside a live kernel so vitest workers cannot hang on a comm that never replies\n\n* fix(coding-agent): clear the active cell id before terminal events so late background output is never tagged with a finished cell\n\n* fix(coding-agent): update legacy IPython-era tests to assert cutover behavior\n\n* fix(coding-agent): describe the column-0 magic scan without referencing the removed rewrite backend\n\n* fix(coding-agent): consume parked interrupts on compile failures and survive user-closed stdio in the drain path\n\n* fix(coding-agent): redact bare %env listings, prefer '=' in %env parsing, echo %cd targets, and keep graceful shutdowns owning their cleanup\n\n* fix(coding-agent): reject kernel startup promptly on spawn errors and commit %cd previous-dir tracking only after chdir succeeds\n\n* fix(coding-agent): trim ParsedIpythonBashCell to the body field its callers use\n\n* fix(coding-agent): kill full process trees in the Windows orphan reaper via taskkill /T\n\n* fix(coding-agent): survive compile-phase crashes and fd-reuse drain hangs in the REPL runtime\n\n* fix(coding-agent): shield snapshot prune deletions from interrupts and pin the host comm probe to its real seam\n\n* fix(coding-agent): route list_names through the per-request backstop and skip non-string namespace keys\n\n* fix(coding-agent): reject snapshot requests whose manifest path aliases the payload path\n\n* fix(coding-agent): reject negative snapshot size caps that would prune every user variable\n\n* fix(coding-agent): kill one-shot await bash() on cancel, resolve Windows helpers via System32, retry taskkill after reap, and fail closed on orphan-journal enrollment\n\n* fix(coding-agent): attribute REPL stream output at write time so raw fd and user-thread bytes never carry another cell's id\n\n* fix(coding-agent): surface unattributed REPL stream output as separate background output instead of dropping or merging it\n\n* fix(coding-agent): confirm group exit before a cancelled one-shot bash() await propagates and complete-write orphan-journal records\n\n* fix(coding-agent): expose a working sys.stdout.buffer on the tagged REPL writer routing bytes through the null-attributed raw channel\n\n* fix(coding-agent): mark between-cell background output truncated when the pending buffer cap is hit\n\n* fix(coding-agent): shield the cancelled-await bash() confirm-exit from re-cancellation, fail clearly without bash on Windows, and fence slow pumps out of result assembly\n\n* fix(coding-agent): survive hostile protocol lines in the REPL reader thread and interrupt without pthread_kill on Windows\n\n* fix(coding-agent): send the protocol shutdown from dispose() so the runtime closes MCP servers and kills live bash groups before the hard kill\n\n* fix(coding-agent): flag the pump's read-to-commit window so the bash() drain fence cannot miss an in-flight chunk\n\n* fix(coding-agent): guard the whole REPL request line against hostile input, reject duplicate in-flight ids, complete short buffer-pipe writes, and clean the snapshot temp file on KeyboardInterrupt\n\n* fix(coding-agent): drop stale between-cell background output on kernel teardown so it cannot surface after a restart\n\n* fix(coding-agent): assert the tagged channel only in the large buffer-write REPL test since cross-channel ordering is not guaranteed\n\n* fix(coding-agent): resolve taskkill via absolute System32 path in the host orphan reaper\n\n* fix(coding-agent): write the inactive orphan-journal record only after a delivered kill so undelivered signals leave the host reaper in charge\n\n* fix(coding-agent): keep a REPL request interrupt-targetable through its trailing-expression repr and output drain until done is emitted\n\n* fix(coding-agent): count an already-exited leader as delivered in the Windows bash() reap so clean exits still journal inactive\n\n* fix(coding-agent): reject NaN and Infinity in emit() payloads before they corrupt REPL protocol framing\n\n* chore(coding-agent): correct the stale ipykernel requirement on the python override doc\n\n* chore(coding-agent): drop migration-era wording from kernel comments\n\n* fix(coding-agent): resolve trusted absolute shell host-side and close Windows journal/reap gaps\n\n* fix(coding-agent): best-effort-kill pid-only orphan records in daemon force-stop and recovery reaps\n\n* refactor(coding-agent): drop the magic-cell rejection gate\n\n%-prefixed and !-prefixed cells now reach CPython and fail with its own\nSyntaxError, which names the offending line. The rejection layer guarded\nagainst model-produced IPython syntax, but with the shipped prompt fresh\nsessions do not produce it, and the plain SyntaxError is protection enough.\nparseIpythonBashCell stays: transcripts from ipykernel-era sessions render\n%%bash cells with shell highlighting forever.\n\n* fix(coding-agent): report a committed destructive snapshot as success even when an interrupt was parked\n\n* chore(ai): drop stray live-regen drift in models.generated.ts\n\nad657d7ec accidentally committed generate-models output produced by a local\nbuild; the catalog belongs to its own regen PRs.\n\n* test(coding-agent): expect a plain SyntaxError for legacy %%bash cells after the magic-rejection gate removal\n\n* fix(coding-agent): consume a finishing-targeted interrupt after a completed state request instead of failing the done\n\n* fix(coding-agent): exit the REPL runtime when its owner dies even during a busy cell\n\n* fix(coding-agent): resolve the kernel bash shell only from trusted absolute paths on Windows\n\n* fix(coding-agent): contain Windows bash children with kill-on-close job objects\n\n* test(coding-agent): cover owner death during a non-yielding REPL cell\n\n* fix(coding-agent): skip concurrently deleted names during snapshot instead of aborting\n\n* fix(coding-agent): fall back to taskkill when job termination fails\n\n* fix(coding-agent): stop telling REPL-default users they need ipykernel\n\n* fix(coding-agent): clear the SIGINT target when its request finishes\n\n* test(coding-agent): drop migration-era wording from the %%bash rejection comment\n\n* fix(coding-agent): start Windows bash children suspended and fail closed when job containment cannot be established\n\n* fix(coding-agent): re-assert the kernel SIGINT handler between cells so a cell rebinding SIGINT cannot break interrupts\n\n* fix(coding-agent): kill the whole tree for enriched orphan records on Windows force-stop\n\nstopTrackedProcess signals only the shell pid on Windows; use killOrphanProcess (taskkill /T) after the identity check, matching the owned-session-worker and daemon-supervisor reapers.\n\n* docs(coding-agent): describe current magic-cell behavior in release notes\n\nMagic-style cells fail with a plain SyntaxError; the migration error and %cd/%env rewrites were removed, so the notes stop claiming them.\n\n* fix(coding-agent): skip the liveness check when the orphan identity is stale\n\nA reused pid looked like a failed kill after the identity re-check skipped taskkill, blocking worker cleanup with a spurious failure.\n\n* fix(coding-agent): journal Windows bash() children before job assignment so a kernel kill mid-spawn cannot leak an unjournaled suspended process\n\n* fix(coding-agent): pre-create the Windows bash() job before spawn and contain the child before the journal start-id query\n\n* fix(coding-agent): create Windows bash() children atomically inside the kill-on-close job via PROC_THREAD_ATTRIBUTE_JOB_LIST, closing the Popen-to-assignment leak window\n\n* chore(coding-agent): compress the atomic-job-association comments to one-line rationale\n\n* fix(coding-agent): send duplicate-id protocol errors outside the interrupt lock and reject int payloads in the captured stdout buffer\n\n* docs(coding-agent): update the kernel provisioner docstring for the REPL/IPython split\n\n* fix(coding-agent): retain the Windows bash() process handle through job cleanup and taskkill fallbacks so a recycled pid can never be killed\n\n* fix(coding-agent): serialize Windows bash() abort cleanup under the kill lock so shutdown taskkill can never race the process-handle close\n\n* fix(coding-agent): commit REPL snapshot payload and manifest atomically via unique temp files with guaranteed cleanup and parked-SIGINT restore\n\n* fix(coding-agent): stage REPL restore before an interrupt-parked apply and recover committed snapshot/restore results from protocol interrupts so a committed operation is never misreported as failed\n\n* chore(coding-agent): compress restore-shield rationale comments to one line each\n\n* fix(coding-agent): surface unattributed background output in IPython cell details and render it after the traceback in the expanded cell view\n\n* docs(coding-agent): replace stale Jupyter comm vocabulary in rlm-runtime failure modes and focused validation with stdio-transport equivalents\n\n* docs(coding-agent): describe the REPL trust boundary and runtime-bootstrap failure in stdio terms and drop the removed TokenUsage export\n\n* fix(runtime): address REPL review findings\n\n* fix(runtime): preserve near-cap snapshots\n\n---------\n\nCo-authored-by: Seth <seth@primeintellect.ai>"},{"name":"repl-kernel-parent-watchdog.test.ts","kind":"file","size":14734,"lastCommitHash":"d60fab8a76d9c169f945341f0ee3bde21903bb55","lastCommitWhen":"2026-08-28T17:40:01+02:00","lastCommitMessage":"fix(coding-agent): repair corrupt REPL protocol frames (#1839)\n\n* refactor(coding-agent): unify kernel shutdown\n\n* docs(coding-agent): carry over shutdown rationale comments\n\n* fix(coding-agent): repair corrupt REPL protocol\n\n* fix(coding-agent): cancel the final kernel snapshot before disposal cleanup\n\n* fix(coding-agent): block new executions from splicing ahead of the final dispose snapshot\n\nflushSnapshotForDispose captured the execution queue while the kernel\nstate was still 'running', so a concurrent execute() (which has no\nper-cell timeout) could enqueue after the capture; captureSnapshot then\nqueued behind it and its timeout never started, hanging dispose() and\nshutdown({snapshot:true}) forever. Claim the flush before capturing the\nqueue: non-internal requests are rejected while the final snapshot is\nflushing, keeping every wait on the dispose path bounded.\n\n* fix(coding-agent): close protocol-repair races and bound the repair\n\n- Gate queued requests behind an in-flight repair: a request whose queue\n  slot opens during a repair releases the slot and requeues after the\n  repair, so queued executes/snapshots can no longer run on the empty\n  replacement kernel ahead of restoreState (and overwrite its result or\n  clobber the last good snapshot).\n- Race the repair wait in execute() with opts.signal so an aborted call\n  returns its aborted result promptly instead of pending through repair.\n- Bound the repair's restore with REPAIR_RESTORE_TIMEOUT_MS so a stalled\n  replacement cannot wedge protocolRepairPromise (and every later\n  execute) forever; a timed-out restore discards the replacement and\n  returns to clean idle.\n- Stop respawn-looping when the replacement kernel itself emits a corrupt\n  frame during repair: discard it and settle at clean idle instead of\n  superseding into an unbounded chain of repairs.\n\n* fix(coding-agent): re-bootstrap repaired kernels and gate busy-waiting cells\n\n- A protocol-repaired kernel restored only the user namespace, so live\n  handles (rlm, bash, skills) were missing and the next cell failed with\n  NameErrors. KernelManagerOptions gains bootstrapCode (the provisioner\n  passes its buildRlmBootstrapCode output); the repair re-runs it after\n  restore, bounded like the restore, and discards the replacement to\n  clean idle when it fails.\n- The repair requeue gate only ran right after taking the queue slot, so\n  a cell busy-waiting on an interrupted execution when corruption arrived\n  could proceed onto the unrestored replacement while blocking the\n  repair's restore behind its slot. The gate now sits after the busy-wait\n  (still exempting the repair's own requests), covering both windows.\n- Fold the repeated kill-to-clean-idle teardown into killChildToIdle and\n  rename REPAIR_RESTORE_TIMEOUT_MS to REPAIR_STEP_TIMEOUT_MS since it now\n  bounds restore and bootstrap.\n\n* fix(coding-agent): join concurrent teardowns into one final snapshot flush\n\nConcurrent dispose() and shutdown({ snapshot: true }) (e.g. a session\ndispose racing the SIGINT handler) each ran flushSnapshotForDispose: the\nfirst finisher's finally cleared flushingSnapshotForDispose while the\nsecond was still flushing, dropping the execution guard early and\nenqueueing a duplicate final snapshot behind the first. Memoize the\nin-flight flush so every teardown joins the same bounded flush.\n\n* fix(coding-agent): close protocol repair gaps for schema-invalid frames, startup chunks, and rebootstrap\n\n- Fail the protocol on JSON object frames that violate the frame schema\n  (unknown event kind; done/host_request without a string id) instead of\n  silently dropping them, which left the active request unsettled forever.\n  The protocol version handshake is exact, so unknown kinds are corruption,\n  not forward compatibility.\n- A corrupt frame sharing one stdout chunk with ready no longer lets the\n  startup mark the corrupt child running: failProtocolFrame records the\n  error while starting and doStart fails the start.\n- A fresh kernel started lazily after a discarded repair re-runs the\n  configured runtime bootstrap before serving user code, so rlm/bash/skills\n  handles are never silently missing.\n\n* test(coding-agent): reconcile chain-collapse suites and cover teardown racing the lazy re-bootstrap\n\n- Point the graceful-shutdown flush spies at captureSnapshot: the merged\n  final flush (kernel-snapshot-dispose-timeout) snapshots through the\n  bounded captureSnapshot path, not snapshotState, so the old spies let\n  real snapshot requests hit the mocked wire and leaked fake timers.\n- The superseded repair's booting replacement is now hard-killed without\n  a protocol shutdown (single-kernel-shutdown only drains running\n  kernels), so it may die before journaling its spawn; assert spawn-count\n  stability after teardown instead of an exact boot count.\n- New composition test: a teardown racing an in-flight lazy re-bootstrap\n  stays bounded, spawns nothing new, and settles the raced cell.\n\n* fix(coding-agent): re-check the final-flush guard after the re-bootstrap wait\n\n- An external execute admitted before the final dispose flush could park on\n  the lazy re-bootstrap, then take its queue slot after the flush captured\n  pendingExecutions - splicing between the captured queue and the final\n  snapshot and unbounding the teardown. Re-check the flush guard right\n  after the ensure await; unit test proves the re-check is load-bearing.\n- Deflake the teardown-vs-re-bootstrap composition test: the fake runtime\n  journals its spawn before ready, so poll isRunning before the teardown to\n  race the re-bootstrap deterministically instead of the boot.\n\n* fix(coding-agent): close bot-review gaps in protocol repair and teardown seams\n\n- Terminal frames (done/host_request) with an EMPTY string id now fail the\n  protocol like id-less ones: the runtime mints uuid hex ids and echoes the\n  host's uuids, so an empty id is corruption that previously slipped past\n  the validator into the silent-drop hang.\n- An execution aborted while waiting on the lazy re-bootstrap settles\n  promptly: the wait races the abort signal (same pattern as\n  waitForProtocolRepair) and the aborted request returns before parking on\n  the queue slot behind the still-running bootstrap.\n- A failed kernel startup awaits its own teardown (final snapshot flush\n  included) before surfacing the error, so a replacement provisioner gated\n  on this dispose can no longer race the still-flushing kernel over the\n  same snapshot files.\n- restart() during the final dispose flush is rejected instead of taking a\n  queue slot and joining the owning shutdown, which could deadlock the\n  flush's snapshot behind the held slot.\n\n* test(coding-agent): cover empty-string host_request ids in the frame validator\n\nKills the surviving mutant that relaxed the host_request half of the\nnon-empty-id requirement back to typeof-only: an empty-id host_request now\nhas a corruption test mirroring the empty-id done one (protocol fails and\nthe kernel is repaired instead of the awaiting cell hanging).\n\n* fix(coding-agent): restore the saved namespace on lazily reprovisioned kernels\n\nAfter a discarded repair whose failure never implicated the snapshot (the\nrepair start died, or only its bootstrap failed), the lazily started fresh\nkernel re-ran the bootstrap but silently abandoned the user's saved\nnamespace forever. Track restore separately: killChildToIdle marks both\npending; the two snapshot-culprit discard paths (clean restore failure,\nreplacement corrupted mid-repair) clear the restore flag so a poisoned\nsnapshot is never retried; the lazy path restores one-shot best-effort\n(ordinary startup semantics) before bootstrapping, and a teardown's final\nsnapshot never triggers reprovisioning. Restore-attempt journaling in the\nfake runtime pins the no-retry and no-double-restore semantics.\n\n* fix(coding-agent): protect the saved snapshot from unrestored kernels; phase-aware corruption attribution\n\n- The final dispose flush skips its snapshot while pendingRestore is set:\n  a kernel that never restored the saved namespace must not overwrite it\n  (the on-disk snapshot is strictly fresher). One interleaving-independent\n  condition instead of joining the reprovision promise, which would\n  reintroduce the 30-60s teardown stall the teardown guard prevents. The\n  lazy one-shot clear moves after the corruption check so the flag also\n  covers a flush racing an in-flight lazy restore.\n- The repair give-up path attributes corruption by phase: performRestore\n  clears pendingRestore on success, so the flag still being set means the\n  corruption struck at or before the restore (snapshot stays the prime\n  suspect, loop-safe); corruption strictly after a successful restore\n  keeps the namespace restorable at the cost of at most one bounded\n  restore per later attempt."},{"name":"repl-kernel-protocol-corruption.test.ts","kind":"file","size":25924,"lastCommitHash":"853041ec88f550f4e8d07e523cad82fbbb7e44f9","lastCommitWhen":"2026-08-29T11:08:24+02:00","lastCommitMessage":"fix(coding-agent): abort every in-flight bash command with its own controller (#1882)\n\n* fix(coding-agent): give each executeBash invocation its own abort controller\n\nConcurrent execute_bash_and_wait daemon commands shared the single _bashAbortController field: the first finisher cleared the second command's controller and abortBash could only target the most recent command, leaving earlier still-running commands unabortable. Track per-invocation controllers in a set; abortBash aborts all in-flight commands. Fixes ENG-5752.\n\n* fix(coding-agent): flag pending user bash abort while other bash commands run\n\nabortBash only set _userBashAbortRequested when no abort controllers were registered, so an abort arriving during user_bash extension dispatch was lost when a concurrent executeBash occupied the controller set and the user bash still started. Set the flag whenever a user bash is running; runUserBash clears it at each start. Also reword the per-invocation controller comments to present-tense behavior.\n\n* test(coding-agent): update fake REPLs to protocol 3\n\n---------\n\nCo-authored-by: Xeophon <46377542+xeophon@users.noreply.github.com>"},{"name":"repl-kernel-shutdown.test.ts","kind":"file","size":11041,"lastCommitHash":"d60fab8a76d9c169f945341f0ee3bde21903bb55","lastCommitWhen":"2026-08-28T17:40:01+02:00","lastCommitMessage":"fix(coding-agent): repair corrupt REPL protocol frames (#1839)\n\n* refactor(coding-agent): unify kernel shutdown\n\n* docs(coding-agent): carry over shutdown rationale comments\n\n* fix(coding-agent): repair corrupt REPL protocol\n\n* fix(coding-agent): cancel the final kernel snapshot before disposal cleanup\n\n* fix(coding-agent): block new executions from splicing ahead of the final dispose snapshot\n\nflushSnapshotForDispose captured the execution queue while the kernel\nstate was still 'running', so a concurrent execute() (which has no\nper-cell timeout) could enqueue after the capture; captureSnapshot then\nqueued behind it and its timeout never started, hanging dispose() and\nshutdown({snapshot:true}) forever. Claim the flush before capturing the\nqueue: non-internal requests are rejected while the final snapshot is\nflushing, keeping every wait on the dispose path bounded.\n\n* fix(coding-agent): close protocol-repair races and bound the repair\n\n- Gate queued requests behind an in-flight repair: a request whose queue\n  slot opens during a repair releases the slot and requeues after the\n  repair, so queued executes/snapshots can no longer run on the empty\n  replacement kernel ahead of restoreState (and overwrite its result or\n  clobber the last good snapshot).\n- Race the repair wait in execute() with opts.signal so an aborted call\n  returns its aborted result promptly instead of pending through repair.\n- Bound the repair's restore with REPAIR_RESTORE_TIMEOUT_MS so a stalled\n  replacement cannot wedge protocolRepairPromise (and every later\n  execute) forever; a timed-out restore discards the replacement and\n  returns to clean idle.\n- Stop respawn-looping when the replacement kernel itself emits a corrupt\n  frame during repair: discard it and settle at clean idle instead of\n  superseding into an unbounded chain of repairs.\n\n* fix(coding-agent): re-bootstrap repaired kernels and gate busy-waiting cells\n\n- A protocol-repaired kernel restored only the user namespace, so live\n  handles (rlm, bash, skills) were missing and the next cell failed with\n  NameErrors. KernelManagerOptions gains bootstrapCode (the provisioner\n  passes its buildRlmBootstrapCode output); the repair re-runs it after\n  restore, bounded like the restore, and discards the replacement to\n  clean idle when it fails.\n- The repair requeue gate only ran right after taking the queue slot, so\n  a cell busy-waiting on an interrupted execution when corruption arrived\n  could proceed onto the unrestored replacement while blocking the\n  repair's restore behind its slot. The gate now sits after the busy-wait\n  (still exempting the repair's own requests), covering both windows.\n- Fold the repeated kill-to-clean-idle teardown into killChildToIdle and\n  rename REPAIR_RESTORE_TIMEOUT_MS to REPAIR_STEP_TIMEOUT_MS since it now\n  bounds restore and bootstrap.\n\n* fix(coding-agent): join concurrent teardowns into one final snapshot flush\n\nConcurrent dispose() and shutdown({ snapshot: true }) (e.g. a session\ndispose racing the SIGINT handler) each ran flushSnapshotForDispose: the\nfirst finisher's finally cleared flushingSnapshotForDispose while the\nsecond was still flushing, dropping the execution guard early and\nenqueueing a duplicate final snapshot behind the first. Memoize the\nin-flight flush so every teardown joins the same bounded flush.\n\n* fix(coding-agent): close protocol repair gaps for schema-invalid frames, startup chunks, and rebootstrap\n\n- Fail the protocol on JSON object frames that violate the frame schema\n  (unknown event kind; done/host_request without a string id) instead of\n  silently dropping them, which left the active request unsettled forever.\n  The protocol version handshake is exact, so unknown kinds are corruption,\n  not forward compatibility.\n- A corrupt frame sharing one stdout chunk with ready no longer lets the\n  startup mark the corrupt child running: failProtocolFrame records the\n  error while starting and doStart fails the start.\n- A fresh kernel started lazily after a discarded repair re-runs the\n  configured runtime bootstrap before serving user code, so rlm/bash/skills\n  handles are never silently missing.\n\n* test(coding-agent): reconcile chain-collapse suites and cover teardown racing the lazy re-bootstrap\n\n- Point the graceful-shutdown flush spies at captureSnapshot: the merged\n  final flush (kernel-snapshot-dispose-timeout) snapshots through the\n  bounded captureSnapshot path, not snapshotState, so the old spies let\n  real snapshot requests hit the mocked wire and leaked fake timers.\n- The superseded repair's booting replacement is now hard-killed without\n  a protocol shutdown (single-kernel-shutdown only drains running\n  kernels), so it may die before journaling its spawn; assert spawn-count\n  stability after teardown instead of an exact boot count.\n- New composition test: a teardown racing an in-flight lazy re-bootstrap\n  stays bounded, spawns nothing new, and settles the raced cell.\n\n* fix(coding-agent): re-check the final-flush guard after the re-bootstrap wait\n\n- An external execute admitted before the final dispose flush could park on\n  the lazy re-bootstrap, then take its queue slot after the flush captured\n  pendingExecutions - splicing between the captured queue and the final\n  snapshot and unbounding the teardown. Re-check the flush guard right\n  after the ensure await; unit test proves the re-check is load-bearing.\n- Deflake the teardown-vs-re-bootstrap composition test: the fake runtime\n  journals its spawn before ready, so poll isRunning before the teardown to\n  race the re-bootstrap deterministically instead of the boot.\n\n* fix(coding-agent): close bot-review gaps in protocol repair and teardown seams\n\n- Terminal frames (done/host_request) with an EMPTY string id now fail the\n  protocol like id-less ones: the runtime mints uuid hex ids and echoes the\n  host's uuids, so an empty id is corruption that previously slipped past\n  the validator into the silent-drop hang.\n- An execution aborted while waiting on the lazy re-bootstrap settles\n  promptly: the wait races the abort signal (same pattern as\n  waitForProtocolRepair) and the aborted request returns before parking on\n  the queue slot behind the still-running bootstrap.\n- A failed kernel startup awaits its own teardown (final snapshot flush\n  included) before surfacing the error, so a replacement provisioner gated\n  on this dispose can no longer race the still-flushing kernel over the\n  same snapshot files.\n- restart() during the final dispose flush is rejected instead of taking a\n  queue slot and joining the owning shutdown, which could deadlock the\n  flush's snapshot behind the held slot.\n\n* test(coding-agent): cover empty-string host_request ids in the frame validator\n\nKills the surviving mutant that relaxed the host_request half of the\nnon-empty-id requirement back to typeof-only: an empty-id host_request now\nhas a corruption test mirroring the empty-id done one (protocol fails and\nthe kernel is repaired instead of the awaiting cell hanging).\n\n* fix(coding-agent): restore the saved namespace on lazily reprovisioned kernels\n\nAfter a discarded repair whose failure never implicated the snapshot (the\nrepair start died, or only its bootstrap failed), the lazily started fresh\nkernel re-ran the bootstrap but silently abandoned the user's saved\nnamespace forever. Track restore separately: killChildToIdle marks both\npending; the two snapshot-culprit discard paths (clean restore failure,\nreplacement corrupted mid-repair) clear the restore flag so a poisoned\nsnapshot is never retried; the lazy path restores one-shot best-effort\n(ordinary startup semantics) before bootstrapping, and a teardown's final\nsnapshot never triggers reprovisioning. Restore-attempt journaling in the\nfake runtime pins the no-retry and no-double-restore semantics.\n\n* fix(coding-agent): protect the saved snapshot from unrestored kernels; phase-aware corruption attribution\n\n- The final dispose flush skips its snapshot while pendingRestore is set:\n  a kernel that never restored the saved namespace must not overwrite it\n  (the on-disk snapshot is strictly fresher). One interleaving-independent\n  condition instead of joining the reprovision promise, which would\n  reintroduce the 30-60s teardown stall the teardown guard prevents. The\n  lazy one-shot clear moves after the corruption check so the flag also\n  covers a flush racing an in-flight lazy restore.\n- The repair give-up path attributes corruption by phase: performRestore\n  clears pendingRestore on success, so the flag still being set means the\n  corruption struck at or before the restore (snapshot stays the prime\n  suspect, loop-safe); corruption strictly after a successful restore\n  keeps the namespace restorable at the cost of at most one bounded\n  restore per later attempt."},{"name":"repl-kernel-startup.test.ts","kind":"file","size":3351,"lastCommitHash":"d60fab8a76d9c169f945341f0ee3bde21903bb55","lastCommitWhen":"2026-08-28T17:40:01+02:00","lastCommitMessage":"fix(coding-agent): repair corrupt REPL protocol frames (#1839)\n\n* refactor(coding-agent): unify kernel shutdown\n\n* docs(coding-agent): carry over shutdown rationale comments\n\n* fix(coding-agent): repair corrupt REPL protocol\n\n* fix(coding-agent): cancel the final kernel snapshot before disposal cleanup\n\n* fix(coding-agent): block new executions from splicing ahead of the final dispose snapshot\n\nflushSnapshotForDispose captured the execution queue while the kernel\nstate was still 'running', so a concurrent execute() (which has no\nper-cell timeout) could enqueue after the capture; captureSnapshot then\nqueued behind it and its timeout never started, hanging dispose() and\nshutdown({snapshot:true}) forever. Claim the flush before capturing the\nqueue: non-internal requests are rejected while the final snapshot is\nflushing, keeping every wait on the dispose path bounded.\n\n* fix(coding-agent): close protocol-repair races and bound the repair\n\n- Gate queued requests behind an in-flight repair: a request whose queue\n  slot opens during a repair releases the slot and requeues after the\n  repair, so queued executes/snapshots can no longer run on the empty\n  replacement kernel ahead of restoreState (and overwrite its result or\n  clobber the last good snapshot).\n- Race the repair wait in execute() with opts.signal so an aborted call\n  returns its aborted result promptly instead of pending through repair.\n- Bound the repair's restore with REPAIR_RESTORE_TIMEOUT_MS so a stalled\n  replacement cannot wedge protocolRepairPromise (and every later\n  execute) forever; a timed-out restore discards the replacement and\n  returns to clean idle.\n- Stop respawn-looping when the replacement kernel itself emits a corrupt\n  frame during repair: discard it and settle at clean idle instead of\n  superseding into an unbounded chain of repairs.\n\n* fix(coding-agent): re-bootstrap repaired kernels and gate busy-waiting cells\n\n- A protocol-repaired kernel restored only the user namespace, so live\n  handles (rlm, bash, skills) were missing and the next cell failed with\n  NameErrors. KernelManagerOptions gains bootstrapCode (the provisioner\n  passes its buildRlmBootstrapCode output); the repair re-runs it after\n  restore, bounded like the restore, and discards the replacement to\n  clean idle when it fails.\n- The repair requeue gate only ran right after taking the queue slot, so\n  a cell busy-waiting on an interrupted execution when corruption arrived\n  could proceed onto the unrestored replacement while blocking the\n  repair's restore behind its slot. The gate now sits after the busy-wait\n  (still exempting the repair's own requests), covering both windows.\n- Fold the repeated kill-to-clean-idle teardown into killChildToIdle and\n  rename REPAIR_RESTORE_TIMEOUT_MS to REPAIR_STEP_TIMEOUT_MS since it now\n  bounds restore and bootstrap.\n\n* fix(coding-agent): join concurrent teardowns into one final snapshot flush\n\nConcurrent dispose() and shutdown({ snapshot: true }) (e.g. a session\ndispose racing the SIGINT handler) each ran flushSnapshotForDispose: the\nfirst finisher's finally cleared flushingSnapshotForDispose while the\nsecond was still flushing, dropping the execution guard early and\nenqueueing a duplicate final snapshot behind the first. Memoize the\nin-flight flush so every teardown joins the same bounded flush.\n\n* fix(coding-agent): close protocol repair gaps for schema-invalid frames, startup chunks, and rebootstrap\n\n- Fail the protocol on JSON object frames that violate the frame schema\n  (unknown event kind; done/host_request without a string id) instead of\n  silently dropping them, which left the active request unsettled forever.\n  The protocol version handshake is exact, so unknown kinds are corruption,\n  not forward compatibility.\n- A corrupt frame sharing one stdout chunk with ready no longer lets the\n  startup mark the corrupt child running: failProtocolFrame records the\n  error while starting and doStart fails the start.\n- A fresh kernel started lazily after a discarded repair re-runs the\n  configured runtime bootstrap before serving user code, so rlm/bash/skills\n  handles are never silently missing.\n\n* test(coding-agent): reconcile chain-collapse suites and cover teardown racing the lazy re-bootstrap\n\n- Point the graceful-shutdown flush spies at captureSnapshot: the merged\n  final flush (kernel-snapshot-dispose-timeout) snapshots through the\n  bounded captureSnapshot path, not snapshotState, so the old spies let\n  real snapshot requests hit the mocked wire and leaked fake timers.\n- The superseded repair's booting replacement is now hard-killed without\n  a protocol shutdown (single-kernel-shutdown only drains running\n  kernels), so it may die before journaling its spawn; assert spawn-count\n  stability after teardown instead of an exact boot count.\n- New composition test: a teardown racing an in-flight lazy re-bootstrap\n  stays bounded, spawns nothing new, and settles the raced cell.\n\n* fix(coding-agent): re-check the final-flush guard after the re-bootstrap wait\n\n- An external execute admitted before the final dispose flush could park on\n  the lazy re-bootstrap, then take its queue slot after the flush captured\n  pendingExecutions - splicing between the captured queue and the final\n  snapshot and unbounding the teardown. Re-check the flush guard right\n  after the ensure await; unit test proves the re-check is load-bearing.\n- Deflake the teardown-vs-re-bootstrap composition test: the fake runtime\n  journals its spawn before ready, so poll isRunning before the teardown to\n  race the re-bootstrap deterministically instead of the boot.\n\n* fix(coding-agent): close bot-review gaps in protocol repair and teardown seams\n\n- Terminal frames (done/host_request) with an EMPTY string id now fail the\n  protocol like id-less ones: the runtime mints uuid hex ids and echoes the\n  host's uuids, so an empty id is corruption that previously slipped past\n  the validator into the silent-drop hang.\n- An execution aborted while waiting on the lazy re-bootstrap settles\n  promptly: the wait races the abort signal (same pattern as\n  waitForProtocolRepair) and the aborted request returns before parking on\n  the queue slot behind the still-running bootstrap.\n- A failed kernel startup awaits its own teardown (final snapshot flush\n  included) before surfacing the error, so a replacement provisioner gated\n  on this dispose can no longer race the still-flushing kernel over the\n  same snapshot files.\n- restart() during the final dispose flush is rejected instead of taking a\n  queue slot and joining the owning shutdown, which could deadlock the\n  flush's snapshot behind the held slot.\n\n* test(coding-agent): cover empty-string host_request ids in the frame validator\n\nKills the surviving mutant that relaxed the host_request half of the\nnon-empty-id requirement back to typeof-only: an empty-id host_request now\nhas a corruption test mirroring the empty-id done one (protocol fails and\nthe kernel is repaired instead of the awaiting cell hanging).\n\n* fix(coding-agent): restore the saved namespace on lazily reprovisioned kernels\n\nAfter a discarded repair whose failure never implicated the snapshot (the\nrepair start died, or only its bootstrap failed), the lazily started fresh\nkernel re-ran the bootstrap but silently abandoned the user's saved\nnamespace forever. Track restore separately: killChildToIdle marks both\npending; the two snapshot-culprit discard paths (clean restore failure,\nreplacement corrupted mid-repair) clear the restore flag so a poisoned\nsnapshot is never retried; the lazy path restores one-shot best-effort\n(ordinary startup semantics) before bootstrapping, and a teardown's final\nsnapshot never triggers reprovisioning. Restore-attempt journaling in the\nfake runtime pins the no-retry and no-double-restore semantics.\n\n* fix(coding-agent): protect the saved snapshot from unrestored kernels; phase-aware corruption attribution\n\n- The final dispose flush skips its snapshot while pendingRestore is set:\n  a kernel that never restored the saved namespace must not overwrite it\n  (the on-disk snapshot is strictly fresher). One interleaving-independent\n  condition instead of joining the reprovision promise, which would\n  reintroduce the 30-60s teardown stall the teardown guard prevents. The\n  lazy one-shot clear moves after the corruption check so the flag also\n  covers a flush racing an in-flight lazy restore.\n- The repair give-up path attributes corruption by phase: performRestore\n  clears pendingRestore on success, so the flag still being set means the\n  corruption struck at or before the restore (snapshot stays the prime\n  suspect, loop-safe); corruption strictly after a successful restore\n  keeps the namespace restorable at the cost of at most one bounded\n  restore per later attempt."},{"name":"repl-kernel-state-roundtrip.test.ts","kind":"file","size":7736,"lastCommitHash":"d60fab8a76d9c169f945341f0ee3bde21903bb55","lastCommitWhen":"2026-08-28T17:40:01+02:00","lastCommitMessage":"fix(coding-agent): repair corrupt REPL protocol frames (#1839)\n\n* refactor(coding-agent): unify kernel shutdown\n\n* docs(coding-agent): carry over shutdown rationale comments\n\n* fix(coding-agent): repair corrupt REPL protocol\n\n* fix(coding-agent): cancel the final kernel snapshot before disposal cleanup\n\n* fix(coding-agent): block new executions from splicing ahead of the final dispose snapshot\n\nflushSnapshotForDispose captured the execution queue while the kernel\nstate was still 'running', so a concurrent execute() (which has no\nper-cell timeout) could enqueue after the capture; captureSnapshot then\nqueued behind it and its timeout never started, hanging dispose() and\nshutdown({snapshot:true}) forever. Claim the flush before capturing the\nqueue: non-internal requests are rejected while the final snapshot is\nflushing, keeping every wait on the dispose path bounded.\n\n* fix(coding-agent): close protocol-repair races and bound the repair\n\n- Gate queued requests behind an in-flight repair: a request whose queue\n  slot opens during a repair releases the slot and requeues after the\n  repair, so queued executes/snapshots can no longer run on the empty\n  replacement kernel ahead of restoreState (and overwrite its result or\n  clobber the last good snapshot).\n- Race the repair wait in execute() with opts.signal so an aborted call\n  returns its aborted result promptly instead of pending through repair.\n- Bound the repair's restore with REPAIR_RESTORE_TIMEOUT_MS so a stalled\n  replacement cannot wedge protocolRepairPromise (and every later\n  execute) forever; a timed-out restore discards the replacement and\n  returns to clean idle.\n- Stop respawn-looping when the replacement kernel itself emits a corrupt\n  frame during repair: discard it and settle at clean idle instead of\n  superseding into an unbounded chain of repairs.\n\n* fix(coding-agent): re-bootstrap repaired kernels and gate busy-waiting cells\n\n- A protocol-repaired kernel restored only the user namespace, so live\n  handles (rlm, bash, skills) were missing and the next cell failed with\n  NameErrors. KernelManagerOptions gains bootstrapCode (the provisioner\n  passes its buildRlmBootstrapCode output); the repair re-runs it after\n  restore, bounded like the restore, and discards the replacement to\n  clean idle when it fails.\n- The repair requeue gate only ran right after taking the queue slot, so\n  a cell busy-waiting on an interrupted execution when corruption arrived\n  could proceed onto the unrestored replacement while blocking the\n  repair's restore behind its slot. The gate now sits after the busy-wait\n  (still exempting the repair's own requests), covering both windows.\n- Fold the repeated kill-to-clean-idle teardown into killChildToIdle and\n  rename REPAIR_RESTORE_TIMEOUT_MS to REPAIR_STEP_TIMEOUT_MS since it now\n  bounds restore and bootstrap.\n\n* fix(coding-agent): join concurrent teardowns into one final snapshot flush\n\nConcurrent dispose() and shutdown({ snapshot: true }) (e.g. a session\ndispose racing the SIGINT handler) each ran flushSnapshotForDispose: the\nfirst finisher's finally cleared flushingSnapshotForDispose while the\nsecond was still flushing, dropping the execution guard early and\nenqueueing a duplicate final snapshot behind the first. Memoize the\nin-flight flush so every teardown joins the same bounded flush.\n\n* fix(coding-agent): close protocol repair gaps for schema-invalid frames, startup chunks, and rebootstrap\n\n- Fail the protocol on JSON object frames that violate the frame schema\n  (unknown event kind; done/host_request without a string id) instead of\n  silently dropping them, which left the active request unsettled forever.\n  The protocol version handshake is exact, so unknown kinds are corruption,\n  not forward compatibility.\n- A corrupt frame sharing one stdout chunk with ready no longer lets the\n  startup mark the corrupt child running: failProtocolFrame records the\n  error while starting and doStart fails the start.\n- A fresh kernel started lazily after a discarded repair re-runs the\n  configured runtime bootstrap before serving user code, so rlm/bash/skills\n  handles are never silently missing.\n\n* test(coding-agent): reconcile chain-collapse suites and cover teardown racing the lazy re-bootstrap\n\n- Point the graceful-shutdown flush spies at captureSnapshot: the merged\n  final flush (kernel-snapshot-dispose-timeout) snapshots through the\n  bounded captureSnapshot path, not snapshotState, so the old spies let\n  real snapshot requests hit the mocked wire and leaked fake timers.\n- The superseded repair's booting replacement is now hard-killed without\n  a protocol shutdown (single-kernel-shutdown only drains running\n  kernels), so it may die before journaling its spawn; assert spawn-count\n  stability after teardown instead of an exact boot count.\n- New composition test: a teardown racing an in-flight lazy re-bootstrap\n  stays bounded, spawns nothing new, and settles the raced cell.\n\n* fix(coding-agent): re-check the final-flush guard after the re-bootstrap wait\n\n- An external execute admitted before the final dispose flush could park on\n  the lazy re-bootstrap, then take its queue slot after the flush captured\n  pendingExecutions - splicing between the captured queue and the final\n  snapshot and unbounding the teardown. Re-check the flush guard right\n  after the ensure await; unit test proves the re-check is load-bearing.\n- Deflake the teardown-vs-re-bootstrap composition test: the fake runtime\n  journals its spawn before ready, so poll isRunning before the teardown to\n  race the re-bootstrap deterministically instead of the boot.\n\n* fix(coding-agent): close bot-review gaps in protocol repair and teardown seams\n\n- Terminal frames (done/host_request) with an EMPTY string id now fail the\n  protocol like id-less ones: the runtime mints uuid hex ids and echoes the\n  host's uuids, so an empty id is corruption that previously slipped past\n  the validator into the silent-drop hang.\n- An execution aborted while waiting on the lazy re-bootstrap settles\n  promptly: the wait races the abort signal (same pattern as\n  waitForProtocolRepair) and the aborted request returns before parking on\n  the queue slot behind the still-running bootstrap.\n- A failed kernel startup awaits its own teardown (final snapshot flush\n  included) before surfacing the error, so a replacement provisioner gated\n  on this dispose can no longer race the still-flushing kernel over the\n  same snapshot files.\n- restart() during the final dispose flush is rejected instead of taking a\n  queue slot and joining the owning shutdown, which could deadlock the\n  flush's snapshot behind the held slot.\n\n* test(coding-agent): cover empty-string host_request ids in the frame validator\n\nKills the surviving mutant that relaxed the host_request half of the\nnon-empty-id requirement back to typeof-only: an empty-id host_request now\nhas a corruption test mirroring the empty-id done one (protocol fails and\nthe kernel is repaired instead of the awaiting cell hanging).\n\n* fix(coding-agent): restore the saved namespace on lazily reprovisioned kernels\n\nAfter a discarded repair whose failure never implicated the snapshot (the\nrepair start died, or only its bootstrap failed), the lazily started fresh\nkernel re-ran the bootstrap but silently abandoned the user's saved\nnamespace forever. Track restore separately: killChildToIdle marks both\npending; the two snapshot-culprit discard paths (clean restore failure,\nreplacement corrupted mid-repair) clear the restore flag so a poisoned\nsnapshot is never retried; the lazy path restores one-shot best-effort\n(ordinary startup semantics) before bootstrapping, and a teardown's final\nsnapshot never triggers reprovisioning. Restore-attempt journaling in the\nfake runtime pins the no-retry and no-double-restore semantics.\n\n* fix(coding-agent): protect the saved snapshot from unrestored kernels; phase-aware corruption attribution\n\n- The final dispose flush skips its snapshot while pendingRestore is set:\n  a kernel that never restored the saved namespace must not overwrite it\n  (the on-disk snapshot is strictly fresher). One interleaving-independent\n  condition instead of joining the reprovision promise, which would\n  reintroduce the 30-60s teardown stall the teardown guard prevents. The\n  lazy one-shot clear moves after the corruption check so the flag also\n  covers a flush racing an in-flight lazy restore.\n- The repair give-up path attributes corruption by phase: performRestore\n  clears pendingRestore on success, so the flag still being set means the\n  corruption struck at or before the restore (snapshot stays the prime\n  suspect, loop-safe); corruption strictly after a successful restore\n  keeps the namespace restorable at the cost of at most one bounded\n  restore per later attempt."},{"name":"resolve-config-value.test.ts","kind":"file","size":1162,"lastCommitHash":"91b5c6191c00e63841249caa45699563cfeb1b3d","lastCommitWhen":"2026-08-20T12:35:46+02:00","lastCommitMessage":"fix(coding-agent): treat a set-but-empty credential env var as missing (#1513)"},{"name":"resource-loader.test.ts","kind":"file","size":23593,"lastCommitHash":"032e3ee74574ca16efaf8745a1394b821256a5d0","lastCommitWhen":"2026-08-18T12:17:35+02:00","lastCommitMessage":"chore: remove redundant comments and unused internals (#1505)\n\n* chore: remove redundant comments\n\n* chore(tui): remove redundant export comments\n\n* chore(coding-agent): remove redundant example comments\n\n* chore(ai): remove redundant comments\n\n* chore(coding-agent): remove obsolete core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant rpc test comments\n\n* chore(coding-agent): remove redundant CLI comments\n\n* chore(agent): remove redundant comments\n\n* chore(tui): remove redundant source comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(ai): remove redundant source comments\n\n* chore(coding-agent): remove redundant session comments\n\n* chore(coding-agent): remove redundant core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(tests): remove redundant test comments\n\n* chore: remove unused internal helpers\n\n* docs: restore public API contracts\n\n* chore(coding-agent): restore invariant documentation\n\n* chore(coding-agent): clarify agent family contracts\n\n* style(coding-agent): format restored contracts\n\n* fix: restore intentional catch explanations"},{"name":"restore-sandbox-env.test.ts","kind":"file","size":2095,"lastCommitHash":"032e3ee74574ca16efaf8745a1394b821256a5d0","lastCommitWhen":"2026-08-18T12:17:35+02:00","lastCommitMessage":"chore: remove redundant comments and unused internals (#1505)\n\n* chore: remove redundant comments\n\n* chore(tui): remove redundant export comments\n\n* chore(coding-agent): remove redundant example comments\n\n* chore(ai): remove redundant comments\n\n* chore(coding-agent): remove obsolete core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant rpc test comments\n\n* chore(coding-agent): remove redundant CLI comments\n\n* chore(agent): remove redundant comments\n\n* chore(tui): remove redundant source comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(ai): remove redundant source comments\n\n* chore(coding-agent): remove redundant session comments\n\n* chore(coding-agent): remove redundant core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(tests): remove redundant test comments\n\n* chore: remove unused internal helpers\n\n* docs: restore public API contracts\n\n* chore(coding-agent): restore invariant documentation\n\n* chore(coding-agent): clarify agent family contracts\n\n* style(coding-agent): format restored contracts\n\n* fix: restore intentional catch explanations"},{"name":"resume-hint.test.ts","kind":"file","size":1850,"lastCommitHash":"67dc4b55fe3f284ef0e87ee22891826b3be2f375","lastCommitWhen":"2026-07-06T15:02:47-07:00","lastCommitMessage":"replace session flag with resume selector (#319)\n\n* fix(coding-agent): replace session flag with resume selector\n\n* fix(coding-agent): preserve resume prompts\n\n* fix(coding-agent): handle empty resume selectors\n\n* fix(coding-agent): update sdk example model\n\n* fix(coding-agent): tighten resume selector parsing\n\n* fix(coding-agent): recognize relative resume paths\n\n* fix(coding-agent): defer resume selector fallback\n\n* fix(test): stabilize ci fixtures\n\n* fix(coding-agent): restore resume prompt fallback"},{"name":"rlm-contract.test.ts","kind":"file","size":16519,"lastCommitHash":"4a770d657c741044a547b490f2059c1aafb7f7a7","lastCommitWhen":"2026-08-31T21:52:03+09:00","lastCommitMessage":"make rlm spawns fail-closed: schema-bound results by default, guarded context, explicit unguarded opt-out\n"},{"name":"rlm-ledger.test.ts","kind":"file","size":46642,"lastCommitHash":"d167f61c2550b77c8c0991f73b8dfcca1d6e7ff5","lastCommitWhen":"2026-08-31T22:14:18+09:00","lastCommitMessage":"fix(rlm): persist failed children without false result readiness\n"},{"name":"rlm-subagent-display.test.ts","kind":"file","size":3608,"lastCommitHash":"d167f61c2550b77c8c0991f73b8dfcca1d6e7ff5","lastCommitWhen":"2026-08-31T22:14:18+09:00","lastCommitMessage":"fix(rlm): persist failed children without false result readiness\n"},{"name":"rpc-client-clone.test.ts","kind":"file","size":840,"lastCommitHash":"d554409b1f457e708358ac88879ccdd848ef0147","lastCommitWhen":"2026-04-20T14:33:32+02:00","lastCommitMessage":"fix(coding-agent): split /clone from /fork UX\n\ncloses #2962\n"},{"name":"rpc-client-refine.test.ts","kind":"file","size":1151,"lastCommitHash":"8893b31d897aa1ab16473fdff7cb9eb82782632f","lastCommitWhen":"2026-06-15T14:04:34-07:00","lastCommitMessage":"Add harness refinement command (#97)\n\n* feat(coding-agent): add harness refinement command\n\n* fix(coding-agent): expose harness on callable rlm\n\n* test(coding-agent): cover refinement action matrix\n\n* feat(coding-agent): persist harness state globally\n\n* feat(coding-agent): inject harness overview into prompt\n\n* feat(runtime): add explicit harness CRUD methods\n\n* feat(coding-agent): align harness specs with rlm calls\n\n* fix(coding-agent): address harness review comments\n\n* fix(runtime): skip malformed harness records\n\n* fix(runtime): normalize harness entry versions\n\n* fix(runtime): normalize refinement change entries\n\n* fix(coding-agent): require current harness runtime\n\n* feat(refinement): add harness skill argument contracts\n\n* fix(refinement): require python references for harness skills\n\n* fix(refinement): address review hygiene issues\n\n* fix(runtime): normalize loaded harness entry ids\n\n* fix(runtime): normalize loaded harness entry kinds\n\n* fix(refinement): support agent connection refine command\n\n* fix(runtime): normalize loaded harness path fields\n\n* fix(refinement): harden daemon refine requests\n\n* fix(refinement): merge cross-process harness writes and make rollback global\n\n- reload harness_state.json on the kernel side when its mtime changes so\n  in-kernel rlm.harness writes no longer clobber host /refine edits\n- append refinement results to a global refinements.jsonl log and source\n  rollback history from it so a refinement applied in one session can be\n  rolled back from another\n- update kernel-and-rlm-recursion docs for global storage and rollback\n\n* fix(refinement): address review-bot findings on /refine\n\n- host /refine now plans the proposal, then re-reads harness_state.json\n  immediately before applying so concurrent kernel/cross-session writes\n  during the LLM pass are not clobbered (split planRefinement/apply)\n- RPC refine uses the 10min request timeout instead of the default 30s\n- interactive /refine rollback works in a fresh session (skips the\n  no-trajectory guard, which only applies to learning refinements)\n- python create/update sync from disk once via _upsert so create-or-fail\n  cannot be downgraded to a silent update by a second reload\n\n* fix(refinement): harden harness state against corrupt files and partial updates\n\n- load() tolerates corrupt/non-object harness_state.json (python and ts)\n  and degrades to empty instead of crashing the kernel or prompt build\n- guard module-level harness init so a load failure cannot break import rlm\n- skill/entry update preserves omitted reference/arguments/metadata instead\n  of wiping the stored contract; an explicit {} still clears\n\n* fix(refinement): preserve omitted update fields and guarantee safe harness fallback\n\n- python update/_upsert now preserves an entry's path when omitted (was reset\n  to the method default), matching the reference/arguments/metadata behavior\n- update_skill no longer requires re-sending the reference on title/content-only\n  updates; it validates only when a reference is supplied and otherwise preserves\n- HarnessState gains a true in_memory mode (no path resolution, no disk) used as\n  the import-time fallback so a path-resolution failure cannot recur or crash\n\n---------\n\nCo-authored-by: Kevin Thomas <kevin.jt2007@gmail.com>"},{"name":"rpc-example.ts","kind":"file","size":2051,"lastCommitHash":"70b84532bb5e1da33f1adf769d9ca3d34fd60eb0","lastCommitWhen":"2025-12-09T14:44:13+01:00","lastCommitMessage":"Update RPC example to use RpcClient\n"},{"name":"rpc-jsonl.test.ts","kind":"file","size":4793,"lastCommitHash":"ebb7fd5f6f3ebeb6c0d9dd17266cb2026940d9e0","lastCommitWhen":"2026-07-17T16:19:06-07:00","lastCommitMessage":"back all client modes with the daemon (#456)\n\n* refactor(coding-agent): daemon back all client modes (ENG-4685)\n\n* fix(coding-agent): harden daemon client modes (ENG-4685)\n\n* fix(coding-agent): address daemon client review findings (ENG-4685)\n\n* fix(coding-agent): close daemon client review gaps (ENG-4685)\n\n* fix(coding-agent): preserve daemon client ordering (ENG-4685)\n\n* fix(coding-agent): validate rpc command shapes (ENG-4685)\n\n* fix daemon worker adoption\n\n* fix daemon owned-session authorization (fixes #456)\n\n* hide client-owned daemon sessions (fixes #456)\n\n* route stale daemon clients locally (fixes #456)\n\n* fix(coding-agent): drain rpc prompts before eof\n\nfixes #456\n\n* fix(coding-agent): preserve rpc prompt streaming\n\nfixes #456\n\n* fix(coding-agent): preserve prompt wait calls\n\nfixes #456"},{"name":"rpc-prompt-response-semantics.test.ts","kind":"file","size":9497,"lastCommitHash":"ebb7fd5f6f3ebeb6c0d9dd17266cb2026940d9e0","lastCommitWhen":"2026-07-17T16:19:06-07:00","lastCommitMessage":"back all client modes with the daemon (#456)\n\n* refactor(coding-agent): daemon back all client modes (ENG-4685)\n\n* fix(coding-agent): harden daemon client modes (ENG-4685)\n\n* fix(coding-agent): address daemon client review findings (ENG-4685)\n\n* fix(coding-agent): close daemon client review gaps (ENG-4685)\n\n* fix(coding-agent): preserve daemon client ordering (ENG-4685)\n\n* fix(coding-agent): validate rpc command shapes (ENG-4685)\n\n* fix daemon worker adoption\n\n* fix daemon owned-session authorization (fixes #456)\n\n* hide client-owned daemon sessions (fixes #456)\n\n* route stale daemon clients locally (fixes #456)\n\n* fix(coding-agent): drain rpc prompts before eof\n\nfixes #456\n\n* fix(coding-agent): preserve rpc prompt streaming\n\nfixes #456\n\n* fix(coding-agent): preserve prompt wait calls\n\nfixes #456"},{"name":"rpc.test.ts","kind":"file","size":9269,"lastCommitHash":"032e3ee74574ca16efaf8745a1394b821256a5d0","lastCommitWhen":"2026-08-18T12:17:35+02:00","lastCommitMessage":"chore: remove redundant comments and unused internals (#1505)\n\n* chore: remove redundant comments\n\n* chore(tui): remove redundant export comments\n\n* chore(coding-agent): remove redundant example comments\n\n* chore(ai): remove redundant comments\n\n* chore(coding-agent): remove obsolete core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant rpc test comments\n\n* chore(coding-agent): remove redundant CLI comments\n\n* chore(agent): remove redundant comments\n\n* chore(tui): remove redundant source comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(ai): remove redundant source comments\n\n* chore(coding-agent): remove redundant session comments\n\n* chore(coding-agent): remove redundant core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(tests): remove redundant test comments\n\n* chore: remove unused internal helpers\n\n* docs: restore public API contracts\n\n* chore(coding-agent): restore invariant documentation\n\n* chore(coding-agent): clarify agent family contracts\n\n* style(coding-agent): format restored contracts\n\n* fix: restore intentional catch explanations"},{"name":"saved-session-catalog.test.ts","kind":"file","size":4355,"lastCommitHash":"44683372c3d70fc27b664f9311394b061b133602","lastCommitWhen":"2026-08-05T04:46:50+02:00","lastCommitMessage":"feat(coding-agent): persist parent edges and derived depth for all sessions (#584)\n\n* feat(coding-agent): persist parent edges and derived depth for all sessions\n\nGroundwork for the recursive agent tree (Track A PR 2): every session -\nlive, passive, or saved-only - carries its tree position without a runtime\nand without inference.\n\n- additive rlmDepth field in the session JSONL header (no format bump; old\n  readers ignore it); surfaced through SessionInfo, the saved-session\n  catalog, SessionSummary, and agent-connection types\n- spawn edges derive child depth = parent depth + 1 at creation; fork and\n  branch COPY the source depth (reference edges, not structural parents):\n  a forked root stays a root\n- RLM_DEPTH env seeds fresh parentless sessions; persisted header wins for\n  resumed sessions; legacy children resolve depth via the subagent registry\n  fallback, never chain walks at scan time\n- one shared saved-session-info serializer (deduped from daemon-mode/\n  daemon-supervisor); DAEMON_SCHEMA_REVISION 9 with regenerated id\n\nTrack A PR 2 of the recursive-agent-harness plan.\n\n* fix(coding-agent): backfill legacy session RLM depth\n\n- Infer legacy session depth from nested subagent artifact directories.\n- Persist inferred depth when opening sessions while keeping listings read-only.\n- Use resolved file metadata for passive rows and daemon subagent rehydration.\n\n* fix(coding-agent): resolve legacy RLM depths reliably\n\n- Derive legacy child depth from its parent header before using anchored path inference.\n- Preserve authoritative registry depth for passive legacy subagents.\n\n* fix(coding-agent): preserve legacy fork RLM depth\n\n- Copy the recursively resolved source depth across legacy fork and branch reference edges.\n- Increment legacy spawn depth only for structural subagent artifact paths while retaining safe cycle and unreadable-parent fallbacks.\n\n* fix(coding-agent): resolve relative legacy session parents\n\n- Resolve relative parentSession paths from the current legacy session directory during RLM depth traversal.\n- Add regression coverage for relative-linked legacy sessions when the process cwd differs."},{"name":"sdk-codex-cache-probe-tool-loop.ts","kind":"file","size":18740,"lastCommitHash":"67dc4b55fe3f284ef0e87ee22891826b3be2f375","lastCommitWhen":"2026-07-06T15:02:47-07:00","lastCommitMessage":"replace session flag with resume selector (#319)\n\n* fix(coding-agent): replace session flag with resume selector\n\n* fix(coding-agent): preserve resume prompts\n\n* fix(coding-agent): handle empty resume selectors\n\n* fix(coding-agent): update sdk example model\n\n* fix(coding-agent): tighten resume selector parsing\n\n* fix(coding-agent): recognize relative resume paths\n\n* fix(coding-agent): defer resume selector fallback\n\n* fix(test): stabilize ci fixtures\n\n* fix(coding-agent): restore resume prompt fallback"},{"name":"sdk-session-manager.test.ts","kind":"file","size":3064,"lastCommitHash":"61eb64748eb077e2a084432db92d101a2a83e146","lastCommitWhen":"2026-08-26T15:24:10-07:00","lastCommitMessage":"Minimal CPython REPL runtime (rlm.repl) (#1685)\n\n* feat(coding-agent): add async-by-default bash() to the kernel runtime\n\n* chore(coding-agent): tighten bash() comments and changelog fragment\n\n* feat(coding-agent): add a standalone CPython REPL runtime speaking JSON lines over stdio\n\n* chore(coding-agent): tighten REPL runtime comments\n\n* feat(coding-agent): run the kernel on the REPL runtime over stdio\n\n* fix(coding-agent): reject pending host requests on kernel teardown\n\nThe runtime now fails pending host_request futures when stdin hits EOF or\na shutdown request arrives, so a cell awaiting a host reply can no longer\nblock _serve from consuming the shutdown and wedge the process. Startup\nand busy-kernel messages plus the ipython tool description now say Python\nkernel, matching the default REPL runtime client.\n\n* chore(coding-agent): describe the kernel-heavy test tag client-neutrally\n\n* feat(coding-agent): make the REPL runtime the only kernel\n\nRemoves the Jupyter/ipykernel/ZMQ kernel client, the fork server, the\nPRIME_AGENT_KERNEL escape hatch, and the %%bash/%cd/%env cell rewriting.\nMagic-style cells (%/%%/!) return a one-line error naming the Python or\nbash() replacement. The kernel venv no longer installs ipykernel;\nexisting venvs are rebuilt once via the bootstrap schema bump. Old\nsnapshot artifacts still restore through the runtime's pickle compat.\n\n* fix(coding-agent): close MCP transports in REPL shutdown\n\n* fix(coding-agent): address bash() review findings — exact tail retention, foreground-status lifecycle with group anchoring, post-kill forkserver reap, Windows start-id parity, executor-free await\n\n* fix(coding-agent): tree-kill bash() process trees on Windows and make running reflect group liveness\n\n* fix(runtime): address repl runtime review findings\n\n- revalidate targeted interrupts through SIGINT delivery so a stale signal\n  cannot cancel a later request\n- preserve a parked untargeted interrupt while another request is inflight\n- reject non-string interrupt ids and validate snapshot options\n  (prune_oversized bool, max_bytes/max_variable_bytes present => int)\n- guard str(exc) in error/skip/fail reasons so a broken __str__ cannot\n  kill the runtime\n- fail the snapshot when the manifest write fails (before any pruning)\n- report 'snapshot not found' reason on restore of a missing path\n- wait unbounded for the output-pump drain marker so done never precedes\n  captured output and marker bytes never leak\n- document that aggregate-cap skips are not pruned\n\n* fix(coding-agent): carry bash() status pipe as stdin so strict-POSIX shells accept single-digit fd redirections\n\n* fix(coding-agent): address host-swap review findings — runtime-neutral kernel wording, %cd/%env rewrite fidelity, linear-time magic regexes, restart supersession guard\n\n* fix(coding-agent): reject stale column-0 line magics on any cell line, not just the first\n\n* fix(coding-agent): close status fds when wake-pipe creation fails and gate bash() commands on orphan-journal registration\n\n* fix(coding-agent): strip quoted %cd targets, use UTF-16-safe %env parsing, and expand $var/${var} values PEP-215-style\n\n* fix(coding-agent): fail rlm.run fast outside a live kernel so vitest workers cannot hang on a comm that never replies\n\n* fix(coding-agent): clear the active cell id before terminal events so late background output is never tagged with a finished cell\n\n* fix(coding-agent): update legacy IPython-era tests to assert cutover behavior\n\n* fix(coding-agent): describe the column-0 magic scan without referencing the removed rewrite backend\n\n* fix(coding-agent): consume parked interrupts on compile failures and survive user-closed stdio in the drain path\n\n* fix(coding-agent): redact bare %env listings, prefer '=' in %env parsing, echo %cd targets, and keep graceful shutdowns owning their cleanup\n\n* fix(coding-agent): reject kernel startup promptly on spawn errors and commit %cd previous-dir tracking only after chdir succeeds\n\n* fix(coding-agent): trim ParsedIpythonBashCell to the body field its callers use\n\n* fix(coding-agent): kill full process trees in the Windows orphan reaper via taskkill /T\n\n* fix(coding-agent): survive compile-phase crashes and fd-reuse drain hangs in the REPL runtime\n\n* fix(coding-agent): shield snapshot prune deletions from interrupts and pin the host comm probe to its real seam\n\n* fix(coding-agent): route list_names through the per-request backstop and skip non-string namespace keys\n\n* fix(coding-agent): reject snapshot requests whose manifest path aliases the payload path\n\n* fix(coding-agent): reject negative snapshot size caps that would prune every user variable\n\n* fix(coding-agent): kill one-shot await bash() on cancel, resolve Windows helpers via System32, retry taskkill after reap, and fail closed on orphan-journal enrollment\n\n* fix(coding-agent): attribute REPL stream output at write time so raw fd and user-thread bytes never carry another cell's id\n\n* fix(coding-agent): surface unattributed REPL stream output as separate background output instead of dropping or merging it\n\n* fix(coding-agent): confirm group exit before a cancelled one-shot bash() await propagates and complete-write orphan-journal records\n\n* fix(coding-agent): expose a working sys.stdout.buffer on the tagged REPL writer routing bytes through the null-attributed raw channel\n\n* fix(coding-agent): mark between-cell background output truncated when the pending buffer cap is hit\n\n* fix(coding-agent): shield the cancelled-await bash() confirm-exit from re-cancellation, fail clearly without bash on Windows, and fence slow pumps out of result assembly\n\n* fix(coding-agent): survive hostile protocol lines in the REPL reader thread and interrupt without pthread_kill on Windows\n\n* fix(coding-agent): send the protocol shutdown from dispose() so the runtime closes MCP servers and kills live bash groups before the hard kill\n\n* fix(coding-agent): flag the pump's read-to-commit window so the bash() drain fence cannot miss an in-flight chunk\n\n* fix(coding-agent): guard the whole REPL request line against hostile input, reject duplicate in-flight ids, complete short buffer-pipe writes, and clean the snapshot temp file on KeyboardInterrupt\n\n* fix(coding-agent): drop stale between-cell background output on kernel teardown so it cannot surface after a restart\n\n* fix(coding-agent): assert the tagged channel only in the large buffer-write REPL test since cross-channel ordering is not guaranteed\n\n* fix(coding-agent): resolve taskkill via absolute System32 path in the host orphan reaper\n\n* fix(coding-agent): write the inactive orphan-journal record only after a delivered kill so undelivered signals leave the host reaper in charge\n\n* fix(coding-agent): keep a REPL request interrupt-targetable through its trailing-expression repr and output drain until done is emitted\n\n* fix(coding-agent): count an already-exited leader as delivered in the Windows bash() reap so clean exits still journal inactive\n\n* fix(coding-agent): reject NaN and Infinity in emit() payloads before they corrupt REPL protocol framing\n\n* chore(coding-agent): correct the stale ipykernel requirement on the python override doc\n\n* chore(coding-agent): drop migration-era wording from kernel comments\n\n* fix(coding-agent): resolve trusted absolute shell host-side and close Windows journal/reap gaps\n\n* fix(coding-agent): best-effort-kill pid-only orphan records in daemon force-stop and recovery reaps\n\n* refactor(coding-agent): drop the magic-cell rejection gate\n\n%-prefixed and !-prefixed cells now reach CPython and fail with its own\nSyntaxError, which names the offending line. The rejection layer guarded\nagainst model-produced IPython syntax, but with the shipped prompt fresh\nsessions do not produce it, and the plain SyntaxError is protection enough.\nparseIpythonBashCell stays: transcripts from ipykernel-era sessions render\n%%bash cells with shell highlighting forever.\n\n* fix(coding-agent): report a committed destructive snapshot as success even when an interrupt was parked\n\n* chore(ai): drop stray live-regen drift in models.generated.ts\n\nad657d7ec accidentally committed generate-models output produced by a local\nbuild; the catalog belongs to its own regen PRs.\n\n* test(coding-agent): expect a plain SyntaxError for legacy %%bash cells after the magic-rejection gate removal\n\n* fix(coding-agent): consume a finishing-targeted interrupt after a completed state request instead of failing the done\n\n* fix(coding-agent): exit the REPL runtime when its owner dies even during a busy cell\n\n* fix(coding-agent): resolve the kernel bash shell only from trusted absolute paths on Windows\n\n* fix(coding-agent): contain Windows bash children with kill-on-close job objects\n\n* test(coding-agent): cover owner death during a non-yielding REPL cell\n\n* fix(coding-agent): skip concurrently deleted names during snapshot instead of aborting\n\n* fix(coding-agent): fall back to taskkill when job termination fails\n\n* fix(coding-agent): stop telling REPL-default users they need ipykernel\n\n* fix(coding-agent): clear the SIGINT target when its request finishes\n\n* test(coding-agent): drop migration-era wording from the %%bash rejection comment\n\n* fix(coding-agent): start Windows bash children suspended and fail closed when job containment cannot be established\n\n* fix(coding-agent): re-assert the kernel SIGINT handler between cells so a cell rebinding SIGINT cannot break interrupts\n\n* fix(coding-agent): kill the whole tree for enriched orphan records on Windows force-stop\n\nstopTrackedProcess signals only the shell pid on Windows; use killOrphanProcess (taskkill /T) after the identity check, matching the owned-session-worker and daemon-supervisor reapers.\n\n* docs(coding-agent): describe current magic-cell behavior in release notes\n\nMagic-style cells fail with a plain SyntaxError; the migration error and %cd/%env rewrites were removed, so the notes stop claiming them.\n\n* fix(coding-agent): skip the liveness check when the orphan identity is stale\n\nA reused pid looked like a failed kill after the identity re-check skipped taskkill, blocking worker cleanup with a spurious failure.\n\n* fix(coding-agent): journal Windows bash() children before job assignment so a kernel kill mid-spawn cannot leak an unjournaled suspended process\n\n* fix(coding-agent): pre-create the Windows bash() job before spawn and contain the child before the journal start-id query\n\n* fix(coding-agent): create Windows bash() children atomically inside the kill-on-close job via PROC_THREAD_ATTRIBUTE_JOB_LIST, closing the Popen-to-assignment leak window\n\n* chore(coding-agent): compress the atomic-job-association comments to one-line rationale\n\n* fix(coding-agent): send duplicate-id protocol errors outside the interrupt lock and reject int payloads in the captured stdout buffer\n\n* docs(coding-agent): update the kernel provisioner docstring for the REPL/IPython split\n\n* fix(coding-agent): retain the Windows bash() process handle through job cleanup and taskkill fallbacks so a recycled pid can never be killed\n\n* fix(coding-agent): serialize Windows bash() abort cleanup under the kill lock so shutdown taskkill can never race the process-handle close\n\n* fix(coding-agent): commit REPL snapshot payload and manifest atomically via unique temp files with guaranteed cleanup and parked-SIGINT restore\n\n* fix(coding-agent): stage REPL restore before an interrupt-parked apply and recover committed snapshot/restore results from protocol interrupts so a committed operation is never misreported as failed\n\n* chore(coding-agent): compress restore-shield rationale comments to one line each\n\n* fix(coding-agent): surface unattributed background output in IPython cell details and render it after the traceback in the expanded cell view\n\n* docs(coding-agent): replace stale Jupyter comm vocabulary in rlm-runtime failure modes and focused validation with stdio-transport equivalents\n\n* docs(coding-agent): describe the REPL trust boundary and runtime-bootstrap failure in stdio terms and drop the removed TokenUsage export\n\n* fix(runtime): address REPL review findings\n\n* fix(runtime): preserve near-cap snapshots\n\n---------\n\nCo-authored-by: Seth <seth@primeintellect.ai>"},{"name":"sdk-skills.test.ts","kind":"file","size":3616,"lastCommitHash":"032e3ee74574ca16efaf8745a1394b821256a5d0","lastCommitWhen":"2026-08-18T12:17:35+02:00","lastCommitMessage":"chore: remove redundant comments and unused internals (#1505)\n\n* chore: remove redundant comments\n\n* chore(tui): remove redundant export comments\n\n* chore(coding-agent): remove redundant example comments\n\n* chore(ai): remove redundant comments\n\n* chore(coding-agent): remove obsolete core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant rpc test comments\n\n* chore(coding-agent): remove redundant CLI comments\n\n* chore(agent): remove redundant comments\n\n* chore(tui): remove redundant source comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(ai): remove redundant source comments\n\n* chore(coding-agent): remove redundant session comments\n\n* chore(coding-agent): remove redundant core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(tests): remove redundant test comments\n\n* chore: remove unused internal helpers\n\n* docs: restore public API contracts\n\n* chore(coding-agent): restore invariant documentation\n\n* chore(coding-agent): clarify agent family contracts\n\n* style(coding-agent): format restored contracts\n\n* fix: restore intentional catch explanations"},{"name":"selector-search-reset.test.ts","kind":"file","size":4011,"lastCommitHash":"2f218e15130904568a805ac8d1920927747d7791","lastCommitWhen":"2026-07-30T17:38:20+02:00","lastCommitMessage":"feat: unified agents and resume view (#541)\n\n* feat(coding-agent): unify searchable session view\n\n* fix(tui): keep session durations stable\n\n* test(daemon): tolerate partial session manager fixtures\n\n* test(tui): narrow session view race coverage\n\n* fix(tui): stabilize unified session catalogs\n\n* fix(tui): preserve session view lifecycle\n\n* fix(tui): preserve compact session view layout\n\n* test(tui): align cumulative session fixtures\n\n* fix(tui): preserve unified session identity and drafts\n\n* feat(tui): color recognized slash commands\n\n* fix(tui): keep view cancels and subagent matches local\n\n* test(tui): avoid platform-specific markdown styling\n\n* fix(tui): align session view status, reselect, and local resume flows\n\n* test(tui): consolidate slash command rendering coverage\n\n* test(tui): cover session view exit shutdown from chat\n\n* fix(tui): preserve dynamic command presentation\n\n* test(coding-agent): deadline-wait the create dedup race\n\n* test(coding-agent): align stacked fixtures\n\n* fix(tui): show seconds for sub-minute heartbeat countdowns\n\n* test(coding-agent): align cumulative session behavior\n\n* fix(coding-agent): flush child traces regardless of retention\n\n* fix(tui): single-own replacement catalog refresh\n\n* fix(tui): preserve drafts and completed child traces\n\n* fix(coding-agent): align template argument whitespace\n\n* fix(tui): restore saved sessions after reconnect\n\n* test(coding-agent): consolidate command presentation coverage\n\n* feat(tui): resume saved sessions from the reply composer\n\n* fix(tui): require heartbeat reconnect probe\n\n* test(coding-agent): align cumulative admission errors\n\n* fix(tui): schedule resumed replies from the resume summary\n\n* test(tui): align lifecycle stash handoff result\n\n* test(coding-agent): preserve unique lifecycle coverage\n\n* fix(tui): preserve inactive reply state on failures\n\n* fix(tui): route local agents view startup\n\n* refactor(tui): single-owner command catalog refresh\n\n* fix(tui): preserve selection after saved resume\n\n* test(tui): align startup lifecycle handoff\n\n* test(tui): resolve cumulative submit fixture\n\n* fix(tui): preserve in-flight reply drafts\n\n* test(tui): align owned startup exit shape\n\n* test(daemon): align delivery waiter contract\n\n* fix(tui): refresh resumed reply failures\n\n* fix(tui): preserve search selection\n\n* style(test): format cumulative prompt coverage\n\n* fix(agents-view): refresh reply target before send\n\n* fix(tui): complete onboarding before sessions\n\n* fix(tui): fence resync rendering by generation\n\n* refactor(coding-agent): consolidate prompt-admission cancellation\n\nExtract one shared waitForPromptAdmission helper and typed\nPromptAdmissionCancelledError into core/prompt-admission.ts, replacing\nthree near-identical copies in agent-session, daemon-mode, and\ndaemon-supervisor along with their copy-paste tests and the supervisor's\nstringly cancelled-status cast.\n\nAlso:\n- make _steeringStopPending a derived getter instead of a cached field\n  manually re-synced at 15 call sites\n- surface genuine handoff errors in _isDeferredSessionInputError instead\n  of silently requeueing them when the session is coincidentally busy\n- remove the production-dead pauseQueuedWork shim and narrow\n  resumeQueuedWork to pump-suspension recovery only\n\n* test(coding-agent): deterministic waits and shared test helpers\n\n- replace the 50ms sleep proving no queued turn starts after\n  abortForUpdateRestart with waitForSessionInputIdle\n- replace the 300ms sleep proving no prompt retry after an uncertain\n  admission failure with a bounded microtask drain\n- use the shared createDeferred from suite/scheduling.ts instead of two\n  local reimplementations\n- guard Reflect-based private access in the agents-view and supervisor\n  harnesses so renamed members fail with explicit messages, and document\n  why the constructor-bypass supervisor harness exists\n\n* chore(coding-agent): trim redundant comments from recent refactors\n\n* fix(coding-agent): guard session-input error surfacing against listener throws\n\nA throwing extension error listener could escape _surfaceSessionInputError\ninside _isDeferredSessionInputError before the pump requeued undelivered\nprompts, dropping them. Surfacing is now best-effort.\n\n* chore(coding-agent): tighten fix comment\n\n* fix(tui): keep the selection anchor across fallback unblocking\n\nResolving a missing anchor no longer overwrites the persisted anchor\nidentities with the visible fallback row, and typing while the anchor is\npending no longer claims the fallback either, so a late poll that\ndelivers the intended session re-anchors selection instead of opening\nthe wrong session.\n\n* fix(tui): open the unified session view on back navigation in local chats\n\nThe left-arrow back gesture only worked for daemon-backed sessions;\nprocess-local chats could reach the same unified view only via /resume.\nBack navigation now routes through requestAgentsView, which opens the\nlocal session view in place for process-local sessions.\n\n* fix(tui): preserve reply statuses across post-reply catalog refreshes\n\nThe refreshes triggered after a reply send or a failed resumed send used\ndefault error handling, so a failing catalog refresh could overwrite the\nsticky cwd-fallback notice or the send-failure message. Both refreshes\nnow preserve the current status on error.\n\n* chore(tui): drop redundant back-navigation comment\n\n* chore(tui): tighten reply-status comments\n\n* feat(tui): new session shortcut and steer/queue reply delivery\n\nctrl+n (app.agents.new) creates a fresh daemon session from the agents\nview and opens it. In the reply composer, Enter now steers a streaming\nagent and alt+enter (app.message.followUp) queues the reply as a\nfollow-up. While the composer is armed the hint line switches to\ncomposer hints: steer/send/resume & send, queue once text is typed, and\nesc to cancel.\n\n* feat(tui): session-owned slash commands in the reply composer\n\n/compact, /refine, /goal, and /autonomous pass through the daemon\nprompt path from the agents-view reply composer, with slash\nautocomplete active only while a reply target is armed. Other built-in\ncommands are rejected with guidance instead of being sent to the model\nas plain text.\n\n* feat(tui): view commands in the agents view\n\n/new, /fork, /name, and /kill run from the search editor against the\nselected row and from the armed reply composer against its target,\nwith autocomplete in both contexts. /fork forks at the current leaf via\nthe existing daemon fork RPC, resuming saved rows first; /name renames\nactive or saved sessions; /kill stops a running agent. Unknown or\nsession-only commands are rejected with guidance and plain text remains\na search query. The search hints now advertise \"/ commands\".\n\n* fix(tui): harden new-session shortcut and follow-up delivery\n\nctrl+n no longer fires while the reply composer is armed, so an unsent\ndraft cannot be discarded by opening a new session. Alt+Enter now\nexpands paste markers like Enter does. A session created after the view\nalready finished is killed instead of orphaned in the agents list.\n\n* fix(tui): preserve rejected drafts and bind completions to the target cwd\n\nA rejected command no longer loses the typed text (submitValue clears\nthe buffer before onSubmit; the rejection path now restores it unless\nnewer input arrived). The composer autocomplete provider is rebuilt\nwhen a target is armed, so @-file completions resolve in the target\nsession's cwd instead of the view's startup directory.\n\n* fix(tui): harden view commands against races, stale composers, and cancels\n\nAdapter-mode search no longer suggests view commands it will not run.\nArmed view commands cannot double-run (the buffer is already clear\nduring the RPC) and a failed command restores the typed draft in both\nthe composer and the search editor, without clobbering newer input.\nComposer disarm after /kill and /fork is guarded against a composer\nre-armed mid-command, and a fork cancelled by an extension is reported\nas cancelled instead of success.\n\n* fix(tui): report new-session outcome to callers\n\ncreateNewSession returns whether a session was created and opened, so\ncommand callers can restore a cleared draft on failure.\n\n* fix(tui): refresh after failed resumed forks and propagate /new outcome\n\nA saved row resumed for a fork that then fails, cancels, or has nothing\nto fork now refreshes the catalog so the newly live session appears\nimmediately. /new propagates createNewSession's outcome so a failed\ncreate restores the cleared draft.\n\n* fix(tui): enable @-path completion in the reply composer\n\nThe composer provider was built without an fd path, so @ fuzzy file\nsearch always returned empty. The view now resolves fd once and rebinds\nan armed provider when it becomes available.\n\n* fix(tui): create sessions over a dedicated connection\n\nfinish() closes the shared client, which rejected an in-flight create\nand made its session unkillable; a missing client also threw before the\nguard reset, permanently disabling the shortcut. Session creation now\nruns on its own short-lived connection inside the guarded try, so the\norphan-kill path works even after the view finished.\n\n* fix(tui): harden view commands against stale targets and filter churn\n\nSlash input in the search editor no longer filters the list, which\ncould swap the selected row before Enter ran the command on it. The\narmed composer re-resolves its captured summary before dispatch so\n/kill, /name, and /fork act on the current runtime, and rejects view\ncommands under the local adapter instead of sending them as prompt\ntext. A session resumed only to serve a fork is stopped again when the\nfork fails or is cancelled.\n\n* docs(tui): move the dedicated-connection rationale to its helper\n\n* fix(tui): drop submitted view commands from the persisted query\n\nsubmitValue clears the editor without queryChanged, so a successful\nsearch-editor command stayed in persistentState.query and a remount\nrestored it where Enter could re-run it on an arbitrary row. Failed\ncommands restore the draft through setSearchQuery so the persisted\nquery stays in sync.\n\n* fix(tui): only freeze the search filter for recognized command input\n\nUnknown slash-prefixed terms like /foo stayed unfiltered because any\nleading slash suppressed the query. The filter now freezes only while\nthe input is a view command or a prefix that can still extend into one,\nso ordinary slash search terms keep filtering.\n\n* fix(tui): warn on view commands in the adapter search editor\n\nAdapter sessions fell through to openSelected() when a view command was\ntyped, opening an unrelated row. The search branch now rejects them\nwith the same unavailable-command warning the reply composer shows.\n\n* test: consolidate overlapping reply-composer tests\n\n* test: fold command-classification cases into one test\n\n* test: consolidate overlapping view-command tests\n\n* refactor(tui): drop the /fork view command\n\nThe in-place daemon fork semantics (runtime rebind at the current leaf,\nresume-then-rollback for saved rows) carried a third of the view-command\ncomplexity for a command whose behavior we already flagged as awkward\nuntil isolated forking lands. /new, /name, and /kill remain.\n\n* fix(tui): restore the draft when the adapter search rejects a command\n\nsubmitValue had already cleared the buffer, so the warning silently ate\nthe typed command; it now comes back through setSearchQuery like other\nfailed search-editor commands.\n\n* test: fold sendReply delivery and follow-up keybinding cases together\n\n* test: fold draft-restore rejection cases together\n\n* docs(tui): tighten create-session comments\n\n* docs(tui): tighten the fd-rebind comment\n\n* test: fold overlapping composer tests; tighten comments\n\n* fix(tui): ctrl+c cancels the armed composer as its hint advertises\n\napp.clear ran first and started the exit flow, so a second ctrl+c could\nexit the view and discard the draft.\n\n* fix(tui): refresh the saved catalog after a live /name rename\n\nOnly the live list was refreshed, so the stale saved entry resurfaced\nthe old name once the agent was killed. Mirrors confirmRename.\n\n* fix(tui): gate search autocomplete on command input; refresh both catalogs after /kill\n\nAbsolute-path queries like /tmp/ fell through CombinedAutocompleteProvider\nto filesystem completions; the search editor now uses the same\nisAgentsViewCommandInput predicate as the filter freeze. Catalog\nrefreshes after rename and kill go through a shared refreshBothCatalogs\nso a killed agent reliably reappears under Inactive.\n\n* refactor(tui): share one renameSession path between rename mode and /name\n\n/name reimplemented the rename separately: it reported success before\nthe refresh and missed the older-daemon restart hint. Both entry points\nnow use the same rename/refresh/report sequence.\n\n* fix(tui): tolerate an already-finished agent in /kill\n\ndeactivatePendingAgent treats \"Unknown active session\" as already\nstopped; /kill surfaced the same race as a raw error.\n\n* docs(tui): drop comments that restate adjacent code\n\n* refactor(tui): search-only search bar; retire /resume and the local session view\n\nThe agents-view search bar no longer parses commands: /name and /kill\nlive only in the armed reply composer (their target is captured\nexplicitly), and new-session stays on its keybinding. This deletes the\nsearch-command autocomplete, the filter-freeze machinery, and the\npersisted-query replay handling that command input required.\n\nSession browsing is daemon-only: /resume and bare --resume are removed\nalong with the process-local SessionViewAdapter and every adapter\nbranch in the view. --resume <id|path> still resumes directly;\nnon-daemon `agents` warns and opens a chat. The chat hint now reads\n\"agents/resume\".\n\n* test: port #502 saved-catalog regressions off the removed adapter seam\n\nThe adapter layer was removed with /resume, so refreshSavedSessions now\nstreams list_saved_sessions through the daemon client and confirmRename\ndelegates to the shared renameSession path. The #502 regression harnesses\nstill faked options.adapter, so three tests failed (and two more passed\nonly because the missing client stub produced the expected false). Rebuild\nthem against client.request with onProgress streaming and the renameSession\ndelegate; behavior under test is unchanged.\n\n* chore: drop orphaned JSDoc for the removed bare --resume option"},{"name":"semaphore.test.ts","kind":"file","size":3046,"lastCommitHash":"a556dfde8274b175178129af227fd0d32d253eb3","lastCommitWhen":"2026-06-30T18:05:13-07:00","lastCommitMessage":"bound subagent kernel-boot concurrency (#294)\n\n* bound subagent kernel-boot concurrency\n\nGate IPython kernel boots behind a process-wide semaphore so a large\nrlm.run fan-out no longer spawns every kernel at once and starves the\nbox. Runs start queued and flip to running on slot acquire; default\nlimit is cpus-2, overridable via PRIME_AGENT_MAX_CONCURRENT_SUBAGENT_BOOTS.\n\n* move kernel-boot gate to the real boot; raise default limit\n\nGate the actual kernel boot inside the lazy IPython provisioner (start +\nrestore + bootstrap) instead of subagent runtime creation, so session\ncreation is never delayed -- only the first IPython boot waits for a slot.\nThe boot weight is the cold Python interpreter + import graph, not the\nports; default limit is now min(16, 2*cores), override via\nPRIME_AGENT_MAX_CONCURRENT_KERNEL_BOOTS.\n\n* trim comments to non-obvious why-notes only\n\n* hold boot permit only across bounded start(); harden env override\n\n* make semaphore acquire abortable so a queued waiter can drop out\n\n* cancel a disposed provisioner's queued kernel boot\n\n* fall back to default for out-of-range boot-concurrency env (e.g. 00)"},{"name":"session-action-store.test.ts","kind":"file","size":11633,"lastCommitHash":"b030f3938463c2a9f5767c93e861a2d5d57b5d92","lastCommitWhen":"2026-08-05T04:46:52+02:00","lastCommitMessage":"feat(coding-agent): intra-tree child session passivation (#589)\n\n* feat(coding-agent): intra-tree child session passivation\n\nTrack A PR 7 (final) of the recursive-agent-harness plan (D5, shape 2):\n\n- idle child sessions inside a LIVE worker passivate individually: graceful\n  closeSession (kernel snapshot + JSONL flush + lease release), sessions-map\n  removal, registry/catalog rows preserved - the child becomes exactly a\n  lazy-hydration passive row (attach/message/observe/list all work)\n- pure canPassivateSession() beside canEvictWorker(), sharing its per-\n  session clauses; additionally requires a parent edge, no non-passive\n  descendants, and no mid-hydration descendant (passive children's\n  sessionFiles checked against openingSessions - hydration blocks parent\n  passivation); roots remain shape-1 territory; passivation never cascades\n- complete-then-rehydrate: touches mid-passivation join the passivation\n  promise (keyed by resolved sessionFile - stable across sessions-map\n  removal) then flow through the normal hydration machinery; deterministic\n  gated race tests for a2a delivery and grandchild hydration\n- supervisor sweep extension: capped worker command (2 children/worker/\n  sweep), one snapshot per state per sweep, fresh-snapshot fence recheck\n  before dispose; whole-tree-evictable workers excluded (owned by shape 1)\n- same idleEvictionMinutes setting governs both shapes; #548 doctrine\n  inversion deferred (prompts out of scope this run)\n\n* fix(coding-agent): harden passivation against new admission fences and reap dedupe\n\nPost-rebase semantic fixes after moving the stack onto the hardened\nscheduler base (cb8f53e15):\n\n- passivation predicate treats admission-in-flight as busy: agent-message\n  accepting/preparing/target-lock states and AgentSession's pending\n  admission-fence waiters (70aeb9c49/2d97dbb4f made prompt paths await the\n  direct-turn admission fence before any session action exists, so a target\n  mid-admission looked idle to the sweep); deterministic gated-admission\n  regression test\n- deleteRlmSubagentRuntime cancels scheduled jobs by session file even when\n  its close joins an in-flight passivation close via closingSessions (the\n  joined 'shutdown' close skipped 'killed'-close job cleanup; #547 reap race)\n\n* fix(coding-agent): harden passive-child hydration, resolution, and deletion races\n\n- Finding 0: heartbeat restore could return a concurrently hydrating child before binding; fence resident fallback with waitForBoundSession and treat unavailable binding as a skipped dispatch. origin: PR #583\n- Finding 1: supervisor child lookup accepted only exact selectors after worker suffix matching; add the same session-ID suffix fallback within the selected worker. origin: PR #583\n- Finding 3: passive create hydration skipped explicit name and client environment bookkeeping; apply both before returning the hydrated state. origin: PR #583\n- Finding 4: concurrent passive deletions raced through asynchronous resolution and started duplicate host deletes; defer deletion behind an atomic in-flight map check and coalesce callers. origin: PR #583\n- Finding 5: concurrent hydration could make a passive lookup stale for advertised IDs and paths; retry normal bound-session resolution before rethrowing the original unknown-session error. origin: PR #583\n- Finding 6: ambiguous live selectors fell through to passive lookup and could misroute; introduce a dedicated ambiguity error and rethrow it before passive resolution. origin: PR #583\n- Finding 7: passive open skipped name and client-env bookkeeping (cron rebinding already occurred in addRuntime); apply only the missing bookkeeping. origin: PR #583\n- Finding 30: rlmChildId traffic treated a resident passivating child as closing; join passivation and rehydrate in both bound lookup and direct message hydration branches. origin: PR #589\n\n* fix(coding-agent): restore attach/catch-up ordering invariants and sweep snapshot atomicity\n\n- Finding 22: async snapshot creation exposed clients before attach initialization; publish client attachment only after the snapshot resolves. origin: PR #587\n- Finding 23: catch-up validity was checked only before async snapshot creation; revalidate session and client attachment after the await. origin: PR #587\n- Finding 25: deterministic ambiguous selectors entered the 30-second remote-send retry loop; fail fast for Ambiguous errors. origin: PR #588\n- Finding 28: active rows ignored stable file-keyed schedule pins during active-id rebinding; consult both id- and file-keyed heartbeat/cron sets. origin: PR #588\n- Finding 29: passivation sampled activity before an asynchronous passive-registry walk; complete the walk before atomically sampling summary and admission markers. origin: PR #589\n\n* fix(coding-agent): correct rlmDepth semantics on reference edges, env parsing, and legacy fallbacks\n\n- Finding 8: new-session parent links were deriving spawn depth; copy the source header depth across the reference edge and add a runtime regression test (origin: PR #584).\n- Finding 9: first-entry forks of legacy sessions discarded effective runtime depth; fall back to session.rlmDepth in persisted and in-memory branches and test both (origin: PR #584).\n- Finding 10: root RLM_DEPTH parsing accepted malformed and unsafe values; require decimal digits and a valid safe non-negative integer, with probe cases as tests (origin: PR #584).\n- Finding 11: child-depth derivation could overflow MAX_SAFE_INTEGER; guard the increment and test the boundary (origin: PR #584).\n- Finding 12: daemon children of in-memory parents skipped explicit depth persistence; always create the child header with explicit depth and test --no-session ancestry (origin: PR #584).\n- Finding 13: legacy completed subagents rehydrated at root depth; restore the depth-one fallback and test a registry/header pair without depth (origin: PR #584).\n\n* fix(coding-agent): make /rlm-max-depth persistence honest and unblock stale kernel gate\n\n- /rlm-max-depth --global could claim persistence after deferred settings write failures; drain and surface global errors before reporting success (origin: PR #585)\n- /rlm-max-depth mutated live state before chat persistence and left failed entries indexed; persist first through rollback-safe custom-entry append, then mutate state and prompt (origin: PR #585)\n- invalid persisted global rlmMaxDepth could abort branch navigation after the leaf moved; ignore invalid global reads and fall through to env/default (origin: PR #585)\n- the kernel-side recursion pre-filter used stale one-shot RLM_MAX_DEPTH and blocked raises before the authoritative host gate; remove the duplicated Python gate (origin: PR #585)\n\n* fix(coding-agent): agents-view scope stability, crash-path backSession, summary refresh, pulse, and settings cycling\n\n- Finding 18: stale saved-catalog readiness could destructively drop scope during refresh; reset readiness when refresh starts. origin: PR #586\n- Finding 19: resolved scope roots were lost across view remounts, swallowing early Left navigation; persist and restore the root summary. origin: PR #586\n- Finding 20: post-attach crashes left backSession pointing at the prior session; assign the opened summary before interactive mode runs. origin: PR #586\n- Findings 21 and 24: startup seeding could leave subagent counts stale and background subagents drove an unused render pulse; refresh every seed and pulse only while streaming. origin: PR #587\n- Finding 27: custom idle-eviction values cycled directly to off; include custom numeric values in the sorted cycle. origin: PR #588\n\n* fix(coding-agent): attach reservation vs passivation, binding join on retry, hydration env, settings error scoping, fractional eviction values\n\n- reserve in-flight attaches and revalidate session liveness before attachment (origin: round-1 fix a342ca23d)\n- join concurrent child binding on the final passive resolution retry (origin: round-1 fix ae3ed4571)\n- adopt create-command client env before passive child hydration (origin: round-1 fix ae3ed4571)\n- isolate max-depth write errors while preserving project diagnostics (origin: round-1 fix 9e738f38f)\n- preserve fractional idle eviction values through settings cycling (origin: round-1 fix 721f45b59; stack commit aa98c9aca)\n\n* fix(coding-agent): post-rebase hardening of passive hydration, snapshots, and depth ingestion\n\n- preserve daemon routable IDs for passive children (origin: PR #583)\n- recheck guarded passive hydration and heartbeat restores (origin: PR #583)\n- repair wrong-kind pending hydration joins (origin: PR #583)\n- fence passive hydration during update restart preparation (origin: PR #583)\n- validate persisted RLM depth before constructor ingestion (origin: PR #584)\n- retry attach child snapshots across session replacement (origin: PR #587)\n- retain effective depth for legacy parented new sessions (origin: PR #589)\n- coordinate parent passivation with child hydration publication (origin: PR #589)\n\n* fix(coding-agent): leave shared passive hydration resident on guard cancellation\n\nThe ownership-blind close closed shared hydrations out from under concurrent wakes (both interleavings); the idle sweep is the ownership-free arbiter.\n\norigin: round-4 fix b95640046 / PR #583\n\n* fix(coding-agent): prefer persisted header depth for legacy rehydration entries\n\nThe legacy-entry rehydration fallback (entry.rlmDepth ?? 1) is passed as\nconfig, which outranks the opened transcript header in AgentSession — so a\nnested legacy child whose header carried a deeper persisted depth woke at\ndepth 1, weakening the host recursion gate. Registry depth stays\nauthoritative when present; otherwise the validated header depth wins and 1\nremains the last-resort default for fully legacy children.\n\norigin: PR #584 fallback restored in round-1 triage; surfaced by post-rebase\nbot review of PR #589.\n\n* fix(coding-agent): fence chain hydration against parent passivation; invalidate stale scope roots\n\n* fix(coding-agent): bound the session snapshot stabilization loop\n\n* fix(coding-agent): restore child event forwarder when passivation close fails\n\nPassivation teardown invoked the retained child's event-forwarder\nunsubscribe before closing the session. When the close failed and the\nchild was re-adopted, the forwarder was gone, so a still-resident child\nstopped emitting rlm_child_update to its parent. Teardown now returns\nthe unsubscribe so the passivation path only invokes it after a\nsuccessful close and restores it on the failed-close re-adopt path.\n\n* fix(coding-agent): close child passivation races\n\n- Keep snapshot messages aligned with the final runtime session summary after stabilization exhaustion.\n- Retry passive child hydration when the child starts passivating inside the hydration window.\n- Apply archive and scheduled-job cancellation when kill joins a resume-preserving close.\n\n* fix(coding-agent): upgrade cascading close reasons\n\n- Track the applied close reason and resident descendant states through cascading teardown.\n- Apply stronger joined close effects uniformly to parents and captured descendants.\n- Cover shutdown-to-killed descendant cleanup and completed-to-killed idempotency.\n\n* fix(coding-agent): preserve passive child id on hydration retry\n\n- Forward the restored active-session ID when retrying after a mismatched pending open.\n- Cover the pending-open race through passive-child hydration.\n\n* fix(coding-agent): recover passivation waiters\n\n- Treat failed passivation settlement as a join signal before retrying resident sessions.\n- Cover concurrent open, message delivery, and hydration after passivation rejection.\n\n* fix(coding-agent): harden passivation close races\n\n- Preserve stronger close-reason upgrades when the joined close fails.\n- Run child passivation outside the supervisor-wide eviction fence.\n- Complete reason-upgrade persistence across targets and record the stronger reason before propagating errors.\n\n* fix(coding-agent): preserve passive opener state across races\n\n- Defer root parent client env adoption until passive hydration and its open guard succeed.\n- Join opening or resident passive targets when parent-change restart resolution races hydration."},{"name":"session-artifacts-delete.test.ts","kind":"file","size":3405,"lastCommitHash":"a9a8655037b009036c1fbcc4bb66aed65afcb532","lastCommitWhen":"2026-08-17T10:52:38-07:00","lastCommitMessage":"fix(daemon): drop deleted rlm children's kernel state and dedupe artifact paths (#1450)\n\n* refactor: canonical session artifact path helpers in session-manager\n\n* fix(daemon): drop a deleted rlm child's nested artifact dir, keep the transcript\n\n* feat(daemon): bounded per-parent reaper for tombstoned rlm child artifact dirs\n\n* fix(daemon): re-sweep artifact dirs resurrected by teardown snapshots\n\n* test(daemon): artifact-dir deletion, best-effort rm, reaper bounds, path helper equivalence\n\n* fix(daemon): guard degenerate session-file names in the artifact reaper\n\nAlso sweep every tombstoned edge on retry-heal, skip the chmod rm-failure test as root, and pin the depth-2 transcript boundary.\n\n* docs: trim redundant policy comments to repo discipline\n\n* fix(daemon): re-sweep artifact dirs even when child teardown throws\n\n* fix(daemon): never let jobs-store errors mask a child deletion\n\nPre-round-2 a cancel throw on the healthy path propagated as a deletion\nfailure. Swallowing it is deliberate: both tombstones are durable by this\npoint, the reaper and retry-heal converge on leftover state, and a deletion\nshould not fail over jobs-store bookkeeping.\n\n* revert(daemon): drop the orphan-artifact reaper, keep the deletion hook\n\nNew children never orphan artifact dirs once the deletion hook exists; the pre-fix garbage is a one-time mess not worth a permanent mechanism in the deletion path. The degenerate-basename guard keeps direct coverage via deleteSessionArtifacts.\n\n* fix(ai): stabilize Cloudflare gateway model test\n\n---------\n\nCo-authored-by: Seth <seth@primeintellect.ai>"},{"name":"session-command-messages.test.ts","kind":"file","size":8094,"lastCommitHash":"b0023ef6c0a260b08f9c00d08e81f4106da7430e","lastCommitWhen":"2026-09-01T21:18:22+09:00","lastCommitMessage":"feat(coding-agent): add dot continuation shortcut\n"},{"name":"session-cwd.test.ts","kind":"file","size":6022,"lastCommitHash":"2f218e15130904568a805ac8d1920927747d7791","lastCommitWhen":"2026-07-30T17:38:20+02:00","lastCommitMessage":"feat: unified agents and resume view (#541)\n\n* feat(coding-agent): unify searchable session view\n\n* fix(tui): keep session durations stable\n\n* test(daemon): tolerate partial session manager fixtures\n\n* test(tui): narrow session view race coverage\n\n* fix(tui): stabilize unified session catalogs\n\n* fix(tui): preserve session view lifecycle\n\n* fix(tui): preserve compact session view layout\n\n* test(tui): align cumulative session fixtures\n\n* fix(tui): preserve unified session identity and drafts\n\n* feat(tui): color recognized slash commands\n\n* fix(tui): keep view cancels and subagent matches local\n\n* test(tui): avoid platform-specific markdown styling\n\n* fix(tui): align session view status, reselect, and local resume flows\n\n* test(tui): consolidate slash command rendering coverage\n\n* test(tui): cover session view exit shutdown from chat\n\n* fix(tui): preserve dynamic command presentation\n\n* test(coding-agent): deadline-wait the create dedup race\n\n* test(coding-agent): align stacked fixtures\n\n* fix(tui): show seconds for sub-minute heartbeat countdowns\n\n* test(coding-agent): align cumulative session behavior\n\n* fix(coding-agent): flush child traces regardless of retention\n\n* fix(tui): single-own replacement catalog refresh\n\n* fix(tui): preserve drafts and completed child traces\n\n* fix(coding-agent): align template argument whitespace\n\n* fix(tui): restore saved sessions after reconnect\n\n* test(coding-agent): consolidate command presentation coverage\n\n* feat(tui): resume saved sessions from the reply composer\n\n* fix(tui): require heartbeat reconnect probe\n\n* test(coding-agent): align cumulative admission errors\n\n* fix(tui): schedule resumed replies from the resume summary\n\n* test(tui): align lifecycle stash handoff result\n\n* test(coding-agent): preserve unique lifecycle coverage\n\n* fix(tui): preserve inactive reply state on failures\n\n* fix(tui): route local agents view startup\n\n* refactor(tui): single-owner command catalog refresh\n\n* fix(tui): preserve selection after saved resume\n\n* test(tui): align startup lifecycle handoff\n\n* test(tui): resolve cumulative submit fixture\n\n* fix(tui): preserve in-flight reply drafts\n\n* test(tui): align owned startup exit shape\n\n* test(daemon): align delivery waiter contract\n\n* fix(tui): refresh resumed reply failures\n\n* fix(tui): preserve search selection\n\n* style(test): format cumulative prompt coverage\n\n* fix(agents-view): refresh reply target before send\n\n* fix(tui): complete onboarding before sessions\n\n* fix(tui): fence resync rendering by generation\n\n* refactor(coding-agent): consolidate prompt-admission cancellation\n\nExtract one shared waitForPromptAdmission helper and typed\nPromptAdmissionCancelledError into core/prompt-admission.ts, replacing\nthree near-identical copies in agent-session, daemon-mode, and\ndaemon-supervisor along with their copy-paste tests and the supervisor's\nstringly cancelled-status cast.\n\nAlso:\n- make _steeringStopPending a derived getter instead of a cached field\n  manually re-synced at 15 call sites\n- surface genuine handoff errors in _isDeferredSessionInputError instead\n  of silently requeueing them when the session is coincidentally busy\n- remove the production-dead pauseQueuedWork shim and narrow\n  resumeQueuedWork to pump-suspension recovery only\n\n* test(coding-agent): deterministic waits and shared test helpers\n\n- replace the 50ms sleep proving no queued turn starts after\n  abortForUpdateRestart with waitForSessionInputIdle\n- replace the 300ms sleep proving no prompt retry after an uncertain\n  admission failure with a bounded microtask drain\n- use the shared createDeferred from suite/scheduling.ts instead of two\n  local reimplementations\n- guard Reflect-based private access in the agents-view and supervisor\n  harnesses so renamed members fail with explicit messages, and document\n  why the constructor-bypass supervisor harness exists\n\n* chore(coding-agent): trim redundant comments from recent refactors\n\n* fix(coding-agent): guard session-input error surfacing against listener throws\n\nA throwing extension error listener could escape _surfaceSessionInputError\ninside _isDeferredSessionInputError before the pump requeued undelivered\nprompts, dropping them. Surfacing is now best-effort.\n\n* chore(coding-agent): tighten fix comment\n\n* fix(tui): keep the selection anchor across fallback unblocking\n\nResolving a missing anchor no longer overwrites the persisted anchor\nidentities with the visible fallback row, and typing while the anchor is\npending no longer claims the fallback either, so a late poll that\ndelivers the intended session re-anchors selection instead of opening\nthe wrong session.\n\n* fix(tui): open the unified session view on back navigation in local chats\n\nThe left-arrow back gesture only worked for daemon-backed sessions;\nprocess-local chats could reach the same unified view only via /resume.\nBack navigation now routes through requestAgentsView, which opens the\nlocal session view in place for process-local sessions.\n\n* fix(tui): preserve reply statuses across post-reply catalog refreshes\n\nThe refreshes triggered after a reply send or a failed resumed send used\ndefault error handling, so a failing catalog refresh could overwrite the\nsticky cwd-fallback notice or the send-failure message. Both refreshes\nnow preserve the current status on error.\n\n* chore(tui): drop redundant back-navigation comment\n\n* chore(tui): tighten reply-status comments\n\n* feat(tui): new session shortcut and steer/queue reply delivery\n\nctrl+n (app.agents.new) creates a fresh daemon session from the agents\nview and opens it. In the reply composer, Enter now steers a streaming\nagent and alt+enter (app.message.followUp) queues the reply as a\nfollow-up. While the composer is armed the hint line switches to\ncomposer hints: steer/send/resume & send, queue once text is typed, and\nesc to cancel.\n\n* feat(tui): session-owned slash commands in the reply composer\n\n/compact, /refine, /goal, and /autonomous pass through the daemon\nprompt path from the agents-view reply composer, with slash\nautocomplete active only while a reply target is armed. Other built-in\ncommands are rejected with guidance instead of being sent to the model\nas plain text.\n\n* feat(tui): view commands in the agents view\n\n/new, /fork, /name, and /kill run from the search editor against the\nselected row and from the armed reply composer against its target,\nwith autocomplete in both contexts. /fork forks at the current leaf via\nthe existing daemon fork RPC, resuming saved rows first; /name renames\nactive or saved sessions; /kill stops a running agent. Unknown or\nsession-only commands are rejected with guidance and plain text remains\na search query. The search hints now advertise \"/ commands\".\n\n* fix(tui): harden new-session shortcut and follow-up delivery\n\nctrl+n no longer fires while the reply composer is armed, so an unsent\ndraft cannot be discarded by opening a new session. Alt+Enter now\nexpands paste markers like Enter does. A session created after the view\nalready finished is killed instead of orphaned in the agents list.\n\n* fix(tui): preserve rejected drafts and bind completions to the target cwd\n\nA rejected command no longer loses the typed text (submitValue clears\nthe buffer before onSubmit; the rejection path now restores it unless\nnewer input arrived). The composer autocomplete provider is rebuilt\nwhen a target is armed, so @-file completions resolve in the target\nsession's cwd instead of the view's startup directory.\n\n* fix(tui): harden view commands against races, stale composers, and cancels\n\nAdapter-mode search no longer suggests view commands it will not run.\nArmed view commands cannot double-run (the buffer is already clear\nduring the RPC) and a failed command restores the typed draft in both\nthe composer and the search editor, without clobbering newer input.\nComposer disarm after /kill and /fork is guarded against a composer\nre-armed mid-command, and a fork cancelled by an extension is reported\nas cancelled instead of success.\n\n* fix(tui): report new-session outcome to callers\n\ncreateNewSession returns whether a session was created and opened, so\ncommand callers can restore a cleared draft on failure.\n\n* fix(tui): refresh after failed resumed forks and propagate /new outcome\n\nA saved row resumed for a fork that then fails, cancels, or has nothing\nto fork now refreshes the catalog so the newly live session appears\nimmediately. /new propagates createNewSession's outcome so a failed\ncreate restores the cleared draft.\n\n* fix(tui): enable @-path completion in the reply composer\n\nThe composer provider was built without an fd path, so @ fuzzy file\nsearch always returned empty. The view now resolves fd once and rebinds\nan armed provider when it becomes available.\n\n* fix(tui): create sessions over a dedicated connection\n\nfinish() closes the shared client, which rejected an in-flight create\nand made its session unkillable; a missing client also threw before the\nguard reset, permanently disabling the shortcut. Session creation now\nruns on its own short-lived connection inside the guarded try, so the\norphan-kill path works even after the view finished.\n\n* fix(tui): harden view commands against stale targets and filter churn\n\nSlash input in the search editor no longer filters the list, which\ncould swap the selected row before Enter ran the command on it. The\narmed composer re-resolves its captured summary before dispatch so\n/kill, /name, and /fork act on the current runtime, and rejects view\ncommands under the local adapter instead of sending them as prompt\ntext. A session resumed only to serve a fork is stopped again when the\nfork fails or is cancelled.\n\n* docs(tui): move the dedicated-connection rationale to its helper\n\n* fix(tui): drop submitted view commands from the persisted query\n\nsubmitValue clears the editor without queryChanged, so a successful\nsearch-editor command stayed in persistentState.query and a remount\nrestored it where Enter could re-run it on an arbitrary row. Failed\ncommands restore the draft through setSearchQuery so the persisted\nquery stays in sync.\n\n* fix(tui): only freeze the search filter for recognized command input\n\nUnknown slash-prefixed terms like /foo stayed unfiltered because any\nleading slash suppressed the query. The filter now freezes only while\nthe input is a view command or a prefix that can still extend into one,\nso ordinary slash search terms keep filtering.\n\n* fix(tui): warn on view commands in the adapter search editor\n\nAdapter sessions fell through to openSelected() when a view command was\ntyped, opening an unrelated row. The search branch now rejects them\nwith the same unavailable-command warning the reply composer shows.\n\n* test: consolidate overlapping reply-composer tests\n\n* test: fold command-classification cases into one test\n\n* test: consolidate overlapping view-command tests\n\n* refactor(tui): drop the /fork view command\n\nThe in-place daemon fork semantics (runtime rebind at the current leaf,\nresume-then-rollback for saved rows) carried a third of the view-command\ncomplexity for a command whose behavior we already flagged as awkward\nuntil isolated forking lands. /new, /name, and /kill remain.\n\n* fix(tui): restore the draft when the adapter search rejects a command\n\nsubmitValue had already cleared the buffer, so the warning silently ate\nthe typed command; it now comes back through setSearchQuery like other\nfailed search-editor commands.\n\n* test: fold sendReply delivery and follow-up keybinding cases together\n\n* test: fold draft-restore rejection cases together\n\n* docs(tui): tighten create-session comments\n\n* docs(tui): tighten the fd-rebind comment\n\n* test: fold overlapping composer tests; tighten comments\n\n* fix(tui): ctrl+c cancels the armed composer as its hint advertises\n\napp.clear ran first and started the exit flow, so a second ctrl+c could\nexit the view and discard the draft.\n\n* fix(tui): refresh the saved catalog after a live /name rename\n\nOnly the live list was refreshed, so the stale saved entry resurfaced\nthe old name once the agent was killed. Mirrors confirmRename.\n\n* fix(tui): gate search autocomplete on command input; refresh both catalogs after /kill\n\nAbsolute-path queries like /tmp/ fell through CombinedAutocompleteProvider\nto filesystem completions; the search editor now uses the same\nisAgentsViewCommandInput predicate as the filter freeze. Catalog\nrefreshes after rename and kill go through a shared refreshBothCatalogs\nso a killed agent reliably reappears under Inactive.\n\n* refactor(tui): share one renameSession path between rename mode and /name\n\n/name reimplemented the rename separately: it reported success before\nthe refresh and missed the older-daemon restart hint. Both entry points\nnow use the same rename/refresh/report sequence.\n\n* fix(tui): tolerate an already-finished agent in /kill\n\ndeactivatePendingAgent treats \"Unknown active session\" as already\nstopped; /kill surfaced the same race as a raw error.\n\n* docs(tui): drop comments that restate adjacent code\n\n* refactor(tui): search-only search bar; retire /resume and the local session view\n\nThe agents-view search bar no longer parses commands: /name and /kill\nlive only in the armed reply composer (their target is captured\nexplicitly), and new-session stays on its keybinding. This deletes the\nsearch-command autocomplete, the filter-freeze machinery, and the\npersisted-query replay handling that command input required.\n\nSession browsing is daemon-only: /resume and bare --resume are removed\nalong with the process-local SessionViewAdapter and every adapter\nbranch in the view. --resume <id|path> still resumes directly;\nnon-daemon `agents` warns and opens a chat. The chat hint now reads\n\"agents/resume\".\n\n* test: port #502 saved-catalog regressions off the removed adapter seam\n\nThe adapter layer was removed with /resume, so refreshSavedSessions now\nstreams list_saved_sessions through the daemon client and confirmRename\ndelegates to the shared renameSession path. The #502 regression harnesses\nstill faked options.adapter, so three tests failed (and two more passed\nonly because the missing client stub produced the expected false). Rebuild\nthem against client.request with onProgress streaming and the renameSession\ndelegate; behavior under test is unchanged.\n\n* chore: drop orphaned JSDoc for the removed bare --resume option"},{"name":"session-info-modified-timestamp.test.ts","kind":"file","size":2421,"lastCommitHash":"032e3ee74574ca16efaf8745a1394b821256a5d0","lastCommitWhen":"2026-08-18T12:17:35+02:00","lastCommitMessage":"chore: remove redundant comments and unused internals (#1505)\n\n* chore: remove redundant comments\n\n* chore(tui): remove redundant export comments\n\n* chore(coding-agent): remove redundant example comments\n\n* chore(ai): remove redundant comments\n\n* chore(coding-agent): remove obsolete core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant rpc test comments\n\n* chore(coding-agent): remove redundant CLI comments\n\n* chore(agent): remove redundant comments\n\n* chore(tui): remove redundant source comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(ai): remove redundant source comments\n\n* chore(coding-agent): remove redundant session comments\n\n* chore(coding-agent): remove redundant core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(tests): remove redundant test comments\n\n* chore: remove unused internal helpers\n\n* docs: restore public API contracts\n\n* chore(coding-agent): restore invariant documentation\n\n* chore(coding-agent): clarify agent family contracts\n\n* style(coding-agent): format restored contracts\n\n* fix: restore intentional catch explanations"},{"name":"session-lease.test.ts","kind":"file","size":6139,"lastCommitHash":"039eba051a93e009c9336262cf6357523e85473d","lastCommitWhen":"2026-07-16T15:24:29-07:00","lastCommitMessage":"fix daemon update restart coordination (#406)\n\n* fix(coding-agent): prevent concurrent daemon supervisors\n\nFixes ENG-4600\n\n* fix(coding-agent): harden supervisor handoff\n\nFixes ENG-4600\n\n* test(coding-agent): prove resident handoff\n\nFixes ENG-4600\n\n* test(coding-agent): preserve daemon socket exports\n\nFixes ENG-4600\n\n* test(coding-agent): isolate supervisor registry\n\nFixes ENG-4600\n\n* fix(coding-agent): reduce supervisor ownership scope (ENG-4600)\n\n* test(coding-agent): make supervisor teardown deterministic (ENG-4600)\n\n* test(coding-agent): contain supervisor fixtures (ENG-4600)\n\n* test(coding-agent): grace supervisor fixture cleanup (ENG-4600)\n\n* fix(coding-agent): coordinate daemon update restarts\n\nFixes ENG-4606\n\n* test(coding-agent): clean stale fixture owners (ENG-4600)\n\n* fix(coding-agent): harden update restart recovery\n\nFixes ENG-4606\n\n* fix(coding-agent): contain restart recovery failures\n\nFixes ENG-4606\n\n* test(coding-agent): clean replacement fixture owner (ENG-4600)\n\n* fix(coding-agent): report restart recovery results\n\nFixes ENG-4606\n\n* fix(coding-agent): await update recovery completion\n\nFixes ENG-4606\n\n* fix(coding-agent): defer daemon startup fence (ENG-4600)\n\n* fix(coding-agent): watchdog update restart progress\n\nFixes ENG-4606\n\n* fix(coding-agent): fence late daemon hello (ENG-4600)\n\n* fix(coding-agent): join concurrent update recovery\n\nFixes ENG-4606\n\n* fix(coding-agent): fence Windows process identity\n\nFixes ENG-4606\n\n* fix(coding-agent): harden update restart progress\n\nFixes ENG-4606\n\n* fix(coding-agent): complete supervisor shutdown cleanup (ENG-4600)\n\n* fix(coding-agent): scope update restart recovery\n\nFixes ENG-4606\n\n* fix(coding-agent): normalize restart identity lazily\n\nFixes ENG-4606\n\n* fix(coding-agent): recover ambiguous daemon shutdown\n\nFixes ENG-4606\n\n* chore: trigger ci after retargeting\n\nFixes ENG-4606\n\n* fix(coding-agent): preserve interactive daemon boundary\n\nFixes ENG-4606\n\n* test(coding-agent): isolate self-update install paths\n\nFixes ENG-4606\n\n* fix(coding-agent): harden coordinator completion waits\n\nFixes ENG-4606\n\n* fix(coding-agent): stabilize restart coordinator home\n\n* fix(coding-agent): preserve interactive update child"},{"name":"session-manager-flush.test.ts","kind":"file","size":14662,"lastCommitHash":"032e3ee74574ca16efaf8745a1394b821256a5d0","lastCommitWhen":"2026-08-18T12:17:35+02:00","lastCommitMessage":"chore: remove redundant comments and unused internals (#1505)\n\n* chore: remove redundant comments\n\n* chore(tui): remove redundant export comments\n\n* chore(coding-agent): remove redundant example comments\n\n* chore(ai): remove redundant comments\n\n* chore(coding-agent): remove obsolete core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant rpc test comments\n\n* chore(coding-agent): remove redundant CLI comments\n\n* chore(agent): remove redundant comments\n\n* chore(tui): remove redundant source comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(ai): remove redundant source comments\n\n* chore(coding-agent): remove redundant session comments\n\n* chore(coding-agent): remove redundant core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(tests): remove redundant test comments\n\n* chore: remove unused internal helpers\n\n* docs: restore public API contracts\n\n* chore(coding-agent): restore invariant documentation\n\n* chore(coding-agent): clarify agent family contracts\n\n* style(coding-agent): format restored contracts\n\n* fix: restore intentional catch explanations"},{"name":"session-manager-git-state.test.ts","kind":"file","size":5062,"lastCommitHash":"032e3ee74574ca16efaf8745a1394b821256a5d0","lastCommitWhen":"2026-08-18T12:17:35+02:00","lastCommitMessage":"chore: remove redundant comments and unused internals (#1505)\n\n* chore: remove redundant comments\n\n* chore(tui): remove redundant export comments\n\n* chore(coding-agent): remove redundant example comments\n\n* chore(ai): remove redundant comments\n\n* chore(coding-agent): remove obsolete core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant rpc test comments\n\n* chore(coding-agent): remove redundant CLI comments\n\n* chore(agent): remove redundant comments\n\n* chore(tui): remove redundant source comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(ai): remove redundant source comments\n\n* chore(coding-agent): remove redundant session comments\n\n* chore(coding-agent): remove redundant core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(tests): remove redundant test comments\n\n* chore: remove unused internal helpers\n\n* docs: restore public API contracts\n\n* chore(coding-agent): restore invariant documentation\n\n* chore(coding-agent): clarify agent family contracts\n\n* style(coding-agent): format restored contracts\n\n* fix: restore intentional catch explanations"},{"name":"session-view-search.test.ts","kind":"file","size":932,"lastCommitHash":"2f218e15130904568a805ac8d1920927747d7791","lastCommitWhen":"2026-07-30T17:38:20+02:00","lastCommitMessage":"feat: unified agents and resume view (#541)\n\n* feat(coding-agent): unify searchable session view\n\n* fix(tui): keep session durations stable\n\n* test(daemon): tolerate partial session manager fixtures\n\n* test(tui): narrow session view race coverage\n\n* fix(tui): stabilize unified session catalogs\n\n* fix(tui): preserve session view lifecycle\n\n* fix(tui): preserve compact session view layout\n\n* test(tui): align cumulative session fixtures\n\n* fix(tui): preserve unified session identity and drafts\n\n* feat(tui): color recognized slash commands\n\n* fix(tui): keep view cancels and subagent matches local\n\n* test(tui): avoid platform-specific markdown styling\n\n* fix(tui): align session view status, reselect, and local resume flows\n\n* test(tui): consolidate slash command rendering coverage\n\n* test(tui): cover session view exit shutdown from chat\n\n* fix(tui): preserve dynamic command presentation\n\n* test(coding-agent): deadline-wait the create dedup race\n\n* test(coding-agent): align stacked fixtures\n\n* fix(tui): show seconds for sub-minute heartbeat countdowns\n\n* test(coding-agent): align cumulative session behavior\n\n* fix(coding-agent): flush child traces regardless of retention\n\n* fix(tui): single-own replacement catalog refresh\n\n* fix(tui): preserve drafts and completed child traces\n\n* fix(coding-agent): align template argument whitespace\n\n* fix(tui): restore saved sessions after reconnect\n\n* test(coding-agent): consolidate command presentation coverage\n\n* feat(tui): resume saved sessions from the reply composer\n\n* fix(tui): require heartbeat reconnect probe\n\n* test(coding-agent): align cumulative admission errors\n\n* fix(tui): schedule resumed replies from the resume summary\n\n* test(tui): align lifecycle stash handoff result\n\n* test(coding-agent): preserve unique lifecycle coverage\n\n* fix(tui): preserve inactive reply state on failures\n\n* fix(tui): route local agents view startup\n\n* refactor(tui): single-owner command catalog refresh\n\n* fix(tui): preserve selection after saved resume\n\n* test(tui): align startup lifecycle handoff\n\n* test(tui): resolve cumulative submit fixture\n\n* fix(tui): preserve in-flight reply drafts\n\n* test(tui): align owned startup exit shape\n\n* test(daemon): align delivery waiter contract\n\n* fix(tui): refresh resumed reply failures\n\n* fix(tui): preserve search selection\n\n* style(test): format cumulative prompt coverage\n\n* fix(agents-view): refresh reply target before send\n\n* fix(tui): complete onboarding before sessions\n\n* fix(tui): fence resync rendering by generation\n\n* refactor(coding-agent): consolidate prompt-admission cancellation\n\nExtract one shared waitForPromptAdmission helper and typed\nPromptAdmissionCancelledError into core/prompt-admission.ts, replacing\nthree near-identical copies in agent-session, daemon-mode, and\ndaemon-supervisor along with their copy-paste tests and the supervisor's\nstringly cancelled-status cast.\n\nAlso:\n- make _steeringStopPending a derived getter instead of a cached field\n  manually re-synced at 15 call sites\n- surface genuine handoff errors in _isDeferredSessionInputError instead\n  of silently requeueing them when the session is coincidentally busy\n- remove the production-dead pauseQueuedWork shim and narrow\n  resumeQueuedWork to pump-suspension recovery only\n\n* test(coding-agent): deterministic waits and shared test helpers\n\n- replace the 50ms sleep proving no queued turn starts after\n  abortForUpdateRestart with waitForSessionInputIdle\n- replace the 300ms sleep proving no prompt retry after an uncertain\n  admission failure with a bounded microtask drain\n- use the shared createDeferred from suite/scheduling.ts instead of two\n  local reimplementations\n- guard Reflect-based private access in the agents-view and supervisor\n  harnesses so renamed members fail with explicit messages, and document\n  why the constructor-bypass supervisor harness exists\n\n* chore(coding-agent): trim redundant comments from recent refactors\n\n* fix(coding-agent): guard session-input error surfacing against listener throws\n\nA throwing extension error listener could escape _surfaceSessionInputError\ninside _isDeferredSessionInputError before the pump requeued undelivered\nprompts, dropping them. Surfacing is now best-effort.\n\n* chore(coding-agent): tighten fix comment\n\n* fix(tui): keep the selection anchor across fallback unblocking\n\nResolving a missing anchor no longer overwrites the persisted anchor\nidentities with the visible fallback row, and typing while the anchor is\npending no longer claims the fallback either, so a late poll that\ndelivers the intended session re-anchors selection instead of opening\nthe wrong session.\n\n* fix(tui): open the unified session view on back navigation in local chats\n\nThe left-arrow back gesture only worked for daemon-backed sessions;\nprocess-local chats could reach the same unified view only via /resume.\nBack navigation now routes through requestAgentsView, which opens the\nlocal session view in place for process-local sessions.\n\n* fix(tui): preserve reply statuses across post-reply catalog refreshes\n\nThe refreshes triggered after a reply send or a failed resumed send used\ndefault error handling, so a failing catalog refresh could overwrite the\nsticky cwd-fallback notice or the send-failure message. Both refreshes\nnow preserve the current status on error.\n\n* chore(tui): drop redundant back-navigation comment\n\n* chore(tui): tighten reply-status comments\n\n* feat(tui): new session shortcut and steer/queue reply delivery\n\nctrl+n (app.agents.new) creates a fresh daemon session from the agents\nview and opens it. In the reply composer, Enter now steers a streaming\nagent and alt+enter (app.message.followUp) queues the reply as a\nfollow-up. While the composer is armed the hint line switches to\ncomposer hints: steer/send/resume & send, queue once text is typed, and\nesc to cancel.\n\n* feat(tui): session-owned slash commands in the reply composer\n\n/compact, /refine, /goal, and /autonomous pass through the daemon\nprompt path from the agents-view reply composer, with slash\nautocomplete active only while a reply target is armed. Other built-in\ncommands are rejected with guidance instead of being sent to the model\nas plain text.\n\n* feat(tui): view commands in the agents view\n\n/new, /fork, /name, and /kill run from the search editor against the\nselected row and from the armed reply composer against its target,\nwith autocomplete in both contexts. /fork forks at the current leaf via\nthe existing daemon fork RPC, resuming saved rows first; /name renames\nactive or saved sessions; /kill stops a running agent. Unknown or\nsession-only commands are rejected with guidance and plain text remains\na search query. The search hints now advertise \"/ commands\".\n\n* fix(tui): harden new-session shortcut and follow-up delivery\n\nctrl+n no longer fires while the reply composer is armed, so an unsent\ndraft cannot be discarded by opening a new session. Alt+Enter now\nexpands paste markers like Enter does. A session created after the view\nalready finished is killed instead of orphaned in the agents list.\n\n* fix(tui): preserve rejected drafts and bind completions to the target cwd\n\nA rejected command no longer loses the typed text (submitValue clears\nthe buffer before onSubmit; the rejection path now restores it unless\nnewer input arrived). The composer autocomplete provider is rebuilt\nwhen a target is armed, so @-file completions resolve in the target\nsession's cwd instead of the view's startup directory.\n\n* fix(tui): harden view commands against races, stale composers, and cancels\n\nAdapter-mode search no longer suggests view commands it will not run.\nArmed view commands cannot double-run (the buffer is already clear\nduring the RPC) and a failed command restores the typed draft in both\nthe composer and the search editor, without clobbering newer input.\nComposer disarm after /kill and /fork is guarded against a composer\nre-armed mid-command, and a fork cancelled by an extension is reported\nas cancelled instead of success.\n\n* fix(tui): report new-session outcome to callers\n\ncreateNewSession returns whether a session was created and opened, so\ncommand callers can restore a cleared draft on failure.\n\n* fix(tui): refresh after failed resumed forks and propagate /new outcome\n\nA saved row resumed for a fork that then fails, cancels, or has nothing\nto fork now refreshes the catalog so the newly live session appears\nimmediately. /new propagates createNewSession's outcome so a failed\ncreate restores the cleared draft.\n\n* fix(tui): enable @-path completion in the reply composer\n\nThe composer provider was built without an fd path, so @ fuzzy file\nsearch always returned empty. The view now resolves fd once and rebinds\nan armed provider when it becomes available.\n\n* fix(tui): create sessions over a dedicated connection\n\nfinish() closes the shared client, which rejected an in-flight create\nand made its session unkillable; a missing client also threw before the\nguard reset, permanently disabling the shortcut. Session creation now\nruns on its own short-lived connection inside the guarded try, so the\norphan-kill path works even after the view finished.\n\n* fix(tui): harden view commands against stale targets and filter churn\n\nSlash input in the search editor no longer filters the list, which\ncould swap the selected row before Enter ran the command on it. The\narmed composer re-resolves its captured summary before dispatch so\n/kill, /name, and /fork act on the current runtime, and rejects view\ncommands under the local adapter instead of sending them as prompt\ntext. A session resumed only to serve a fork is stopped again when the\nfork fails or is cancelled.\n\n* docs(tui): move the dedicated-connection rationale to its helper\n\n* fix(tui): drop submitted view commands from the persisted query\n\nsubmitValue clears the editor without queryChanged, so a successful\nsearch-editor command stayed in persistentState.query and a remount\nrestored it where Enter could re-run it on an arbitrary row. Failed\ncommands restore the draft through setSearchQuery so the persisted\nquery stays in sync.\n\n* fix(tui): only freeze the search filter for recognized command input\n\nUnknown slash-prefixed terms like /foo stayed unfiltered because any\nleading slash suppressed the query. The filter now freezes only while\nthe input is a view command or a prefix that can still extend into one,\nso ordinary slash search terms keep filtering.\n\n* fix(tui): warn on view commands in the adapter search editor\n\nAdapter sessions fell through to openSelected() when a view command was\ntyped, opening an unrelated row. The search branch now rejects them\nwith the same unavailable-command warning the reply composer shows.\n\n* test: consolidate overlapping reply-composer tests\n\n* test: fold command-classification cases into one test\n\n* test: consolidate overlapping view-command tests\n\n* refactor(tui): drop the /fork view command\n\nThe in-place daemon fork semantics (runtime rebind at the current leaf,\nresume-then-rollback for saved rows) carried a third of the view-command\ncomplexity for a command whose behavior we already flagged as awkward\nuntil isolated forking lands. /new, /name, and /kill remain.\n\n* fix(tui): restore the draft when the adapter search rejects a command\n\nsubmitValue had already cleared the buffer, so the warning silently ate\nthe typed command; it now comes back through setSearchQuery like other\nfailed search-editor commands.\n\n* test: fold sendReply delivery and follow-up keybinding cases together\n\n* test: fold draft-restore rejection cases together\n\n* docs(tui): tighten create-session comments\n\n* docs(tui): tighten the fd-rebind comment\n\n* test: fold overlapping composer tests; tighten comments\n\n* fix(tui): ctrl+c cancels the armed composer as its hint advertises\n\napp.clear ran first and started the exit flow, so a second ctrl+c could\nexit the view and discard the draft.\n\n* fix(tui): refresh the saved catalog after a live /name rename\n\nOnly the live list was refreshed, so the stale saved entry resurfaced\nthe old name once the agent was killed. Mirrors confirmRename.\n\n* fix(tui): gate search autocomplete on command input; refresh both catalogs after /kill\n\nAbsolute-path queries like /tmp/ fell through CombinedAutocompleteProvider\nto filesystem completions; the search editor now uses the same\nisAgentsViewCommandInput predicate as the filter freeze. Catalog\nrefreshes after rename and kill go through a shared refreshBothCatalogs\nso a killed agent reliably reappears under Inactive.\n\n* refactor(tui): share one renameSession path between rename mode and /name\n\n/name reimplemented the rename separately: it reported success before\nthe refresh and missed the older-daemon restart hint. Both entry points\nnow use the same rename/refresh/report sequence.\n\n* fix(tui): tolerate an already-finished agent in /kill\n\ndeactivatePendingAgent treats \"Unknown active session\" as already\nstopped; /kill surfaced the same race as a raw error.\n\n* docs(tui): drop comments that restate adjacent code\n\n* refactor(tui): search-only search bar; retire /resume and the local session view\n\nThe agents-view search bar no longer parses commands: /name and /kill\nlive only in the armed reply composer (their target is captured\nexplicitly), and new-session stays on its keybinding. This deletes the\nsearch-command autocomplete, the filter-freeze machinery, and the\npersisted-query replay handling that command input required.\n\nSession browsing is daemon-only: /resume and bare --resume are removed\nalong with the process-local SessionViewAdapter and every adapter\nbranch in the view. --resume <id|path> still resumes directly;\nnon-daemon `agents` warns and opens a chat. The chat hint now reads\n\"agents/resume\".\n\n* test: port #502 saved-catalog regressions off the removed adapter seam\n\nThe adapter layer was removed with /resume, so refreshSavedSessions now\nstreams list_saved_sessions through the daemon client and confirmRename\ndelegates to the shared renameSession path. The #502 regression harnesses\nstill faked options.adapter, so three tests failed (and two more passed\nonly because the missing client stub produced the expected false). Rebuild\nthem against client.request with onProgress streaming and the renameSession\ndelegate; behavior under test is unchanged.\n\n* chore: drop orphaned JSDoc for the removed bare --resume option"},{"name":"session-worker-private-framing.test.ts","kind":"file","size":3138,"lastCommitHash":"4d19005d4a25b10ce6d90fdd4961ed374c64ea17","lastCommitWhen":"2026-07-13T17:47:15-07:00","lastCommitMessage":"isolate daemon sessions in worker processes (#383)\n\n* perf(coding-agent): add large daemon attach benchmark\n\n* feat(coding-agent): isolate session execution in workers\n\n* fix(coding-agent): reconnect after supervisor replacement\n\n* fix(tui): preserve input across fullscreen handoff\n\n* fix(coding-agent): prevent archived heartbeat revival\n\n* fix(coding-agent): cancel orphan heartbeat sessions\n\n* fix(tui): preserve drafts across daemon refreshes\n\n* fix(coding-agent): separate daemon resyncs from replacements\n\n* fix(coding-agent): stabilize daemon streaming ui\n\n* refactor(coding-agent): remove obsolete subagent tree\n\n* feat(coding-agent): show subagent recaps inline\n\n* fix(coding-agent): refine subagent summary spacing\n\n* fix(coding-agent): preserve full subagent row selection\n\n* fix(coding-agent): align subagent summary rows\n\n* fix(coding-agent): preserve reasoning during daemon resync\n\n* fix(coding-agent): isolate heartbeat scheduling per worker (ENG-4527)\n\n* fix(coding-agent): retry partial daemon reconnects\n\n* fix(coding-agent): harden isolated daemon recovery\n\n* fix(coding-agent): close daemon recovery races\n\n* fix(coding-agent): validate daemon recovery state\n\n* fix(coding-agent): close isolated worker recovery gaps\n\n* fix(coding-agent): verify orphan process identity\n\n* fix(coding-agent): isolate worker client capabilities\n\n* fix(coding-agent): preserve daemon terminal ordering\n\n* fix(coding-agent): serialize durable daemon state\n\n* fix(coding-agent): avoid duplicate worker recovery\n\n* fix(coding-agent): isolate peer sync failures\n\n* fix(coding-agent): fail unanswered rpc commands\n\n* fix(coding-agent): distinguish lease contention"},{"name":"settings-manager-bug.test.ts","kind":"file","size":4309,"lastCommitHash":"032e3ee74574ca16efaf8745a1394b821256a5d0","lastCommitWhen":"2026-08-18T12:17:35+02:00","lastCommitMessage":"chore: remove redundant comments and unused internals (#1505)\n\n* chore: remove redundant comments\n\n* chore(tui): remove redundant export comments\n\n* chore(coding-agent): remove redundant example comments\n\n* chore(ai): remove redundant comments\n\n* chore(coding-agent): remove obsolete core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(coding-agent): remove redundant rpc test comments\n\n* chore(coding-agent): remove redundant CLI comments\n\n* chore(agent): remove redundant comments\n\n* chore(tui): remove redundant source comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant mode comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(ai): remove redundant source comments\n\n* chore(coding-agent): remove redundant session comments\n\n* chore(coding-agent): remove redundant core comments\n\n* chore(coding-agent): remove redundant test comments\n\n* chore(tests): remove redundant test comments\n\n* chore: remove unused internal helpers\n\n* docs: restore public API contracts\n\n* chore(coding-agent): restore invariant documentation\n\n* chore(coding-agent): clarify agent family contracts\n\n* style(coding-agent): format restored contracts\n\n* fix: restore intentional catch explanations"},{"name":"settings-manager.test.ts","kind":"file","size":20466,"lastCommitHash":"c382f09856d4a8c8d2b765179657047d58691f25","lastCommitWhen":"2026-08-30T17:18:36+02:00","lastCommitMessage":"feat(coding-agent): render Mermaid diagrams inline in the terminal (#1893)\n\n* feat(coding-agent): render Mermaid code blocks as inline Unicode diagrams\n\nPorts pi-mono's Mermaid rendering (grok-mermaid) into prime-agent:\n- pi-tui Markdown gains an options.transform hook that rewrites source\n  Markdown with the exact content width before parsing (ported from\n  upstream pi-tui).\n- New mermaid.ts transform replaces top-level mermaid code blocks with\n  themed Unicode diagrams, falls back to the raw block when the diagram\n  is wider than the message, and appends a themed warning line for\n  partially rendered final diagrams.\n- AssistantMessageComponent applies the transform to text blocks only\n  (never thinking blocks) and tracks streaming state so the\n  streaming-to-final transition re-renders.\n- New markdown.mermaid setting (off/final/streaming, default streaming)\n  with a settings-selector entry.\n\nLinear: ENG-5673\n\n* test(coding-agent): kill mermaid mutation survivors\n\nAdversarial review mutation testing found three surviving mutants:\n- width guard flipped to >= (exact-fit diagrams would fall back)\n- codeSpan fence reduced to a single backtick (backtick labels break)\n- isStreaming inverted at the message_end call site (final mode never renders)\n\nAdds an exact-width boundary test, a backtick-label test, and a\nhandleEvent-level final-mode transition test that kill them.\n\n* build(coding-agent): pin grok-mermaid exactly for renderer-output stability\n\n* test(coding-agent): collapse redundant mermaid coverage\n\n* docs(coding-agent): tighten mermaid comments\n\n* fix(coding-agent): tolerate non-object markdown settings values\n\nNormalize a malformed markdown settings value at the migration boundary\n(mirroring the telemetry handling) so changing the Mermaid mode cannot\nthrow, and add the missing tui changelog fragment.\n\n* test(coding-agent): drop mermaid.test.ts\n\n* chore(coding-agent): one-line mermaid codeSpan comments"},{"name":"settings-selector.test.ts","kind":"file","size":3862,"lastCommitHash":"c382f09856d4a8c8d2b765179657047d58691f25","lastCommitWhen":"2026-08-30T17:18:36+02:00","lastCommitMessage":"feat(coding-agent): render Mermaid diagrams inline in the terminal (#1893)\n\n* feat(coding-agent): render Mermaid code blocks as inline Unicode diagrams\n\nPorts pi-mono's Mermaid rendering (grok-mermaid) into prime-agent:\n- pi-tui Markdown gains an options.transform hook that rewrites source\n  Markdown with the exact content width before parsing (ported from\n  upstream pi-tui).\n- New mermaid.ts transform replaces top-level mermaid code blocks with\n  themed Unicode diagrams, falls back to the raw block when the diagram\n  is wider than the message, and appends a themed warning line for\n  partially rendered final diagrams.\n- AssistantMessageComponent applies the transform to text blocks only\n  (never thinking blocks) and tracks streaming state so the\n  streaming-to-final transition re-renders.\n- New markdown.mermaid setting (off/final/streaming, default streaming)\n  with a settings-selector entry.\n\nLinear: ENG-5673\n\n* test(coding-agent): kill mermaid mutation survivors\n\nAdversarial review mutation testing found three surviving mutants:\n- width guard flipped to >= (exact-fit diagrams would fall back)\n- codeSpan fence reduced to a single backtick (backtick labels break)\n- isStreaming inverted at the message_end call site (final mode never renders)\n\nAdds an exact-width boundary test, a backtick-label test, and a\nhandleEvent-level final-mode transition test that kill them.\n\n* build(coding-agent): pin grok-mermaid exactly for renderer-output stability\n\n* test(coding-agent): collapse redundant mermaid coverage\n\n* docs(coding-agent): tighten mermaid comments\n\n* fix(coding-agent): tolerate non-object markdown settings values\n\nNormalize a malformed markdown settings value at the migration boundary\n(mirroring the telemetry handling) so changing the Mermaid mode cannot\nthrow, and add the missing tui changelog fragment.\n\n* test(coding-agent): drop mermaid.test.ts\n\n* chore(coding-agent): one-line mermaid codeSpan comments"},{"name":"skills.test.ts","kind":"file","size":17454,"lastCommitHash":"2cb2f491a5882d203a0b2e3329ecf731876382af","lastCommitWhen":"2026-06-01T15:26:27-07:00","lastCommitMessage":"add python-backed skills (#76)\n\n* add python-backed skills\n\n* harden python skill loading\n\n* fix python skill bootstrap retries\n\n* retry python skill installs without rebuilding\n\n* fix(ai): refresh stale provider test models"},{"name":"slash-commands.test.ts","kind":"file","size":10695,"lastCommitHash":"f8f02221eecad192c65324ebba50037505cfdac6","lastCommitWhen":"2026-08-20T13:17:52+02:00","lastCommitMessage":"feat: add generic kernel-owned MCP runtime (#1495)\n\n* feat(coding-agent): add generic MCP runtime\n\n* fix(coding-agent): harden MCP lifecycle and overrides\n\n* fix(runtime): close cancelled host request comms\n\n* fix(runtime): preserve MCP SDK result aliases\n\n* fix(runtime): preserve synchronous kernel shutdown\n\n* fix(runtime): allow MCP close retry after cancellation\n\n* feat(coding-agent): manage MCP servers from CLI and TUI\n\n* fix(coding-agent): preserve inherited stdio env names\n\n* fix(coding-agent): reserve built-in MCP identities\n\n* fix(coding-agent): allow cleanup of reserved MCP entries\n\n* test(coding-agent): update MCP command hint\n\n* fix: address MCP reload and cleanup findings\n\n* fix(coding-agent): advertise generic MCP connections\n\n* fix(coding-agent): keep MCP command results visible\n\n* fix(runtime): surface safe stdio startup diagnostics\n\n* fix(runtime): preserve startup errors through cleanup\n\n* fix(coding-agent): drop stored MCP credentials when a server is removed or replaced\n\n* fix(coding-agent): scope credential drops to generic servers and keep quoted empty argv tokens\n\n* docs(coding-agent): document the removed catalog-name override as a breaking change\n\n* fix: close kernel MCP servers during shutdown\n\n* docs: preserve changelog sections after main merge\n\n* fix: harden MCP shutdown boundaries\n\n* fix: bound graceful kernel shutdown\n\n---------\n\nCo-authored-by: Sebastian <sebastian@primeintellect.ai>"},{"name":"snapshot-transcript-cache.test.ts","kind":"file","size":4625,"lastCommitHash":"aa476e6f02fdc53fc6f282ba063ec1fa10ac1968","lastCommitWhen":"2026-08-31T22:05:41+09:00","lastCommitMessage":"fix(daemon): freeze snapshot messages at capture\n"},{"name":"startup-notices.test.ts","kind":"file","size":691,"lastCommitHash":"82a4ee24ee251c694d0da4ac0ec4b580a7bf8ed5","lastCommitWhen":"2026-07-22T21:19:13+02:00","lastCommitMessage":"test(coding-agent): promote routing and notice coverage (#500)\n\n* test(coding-agent): promote routing and notice coverage\n\n* test: stabilize routing coverage\n\nfixes #500\n\n---------\n\nCo-authored-by: Kevin Thomas <kevin.jt2007@gmail.com>"},{"name":"stdout-cleanliness.test.ts","kind":"file","size":3324,"lastCommitHash":"8bf2164f7999c4e64864531a025ff1568d67d815","lastCommitWhen":"2026-07-17T11:07:08-07:00","lastCommitMessage":"fix(coding-agent): simplify top-level help (ENG-4688) (#455)"},{"name":"streaming-render-debug.ts","kind":"file","size":2850,"lastCommitHash":"3e5ad67e0f325d4888f82f9b82966218eb4407f5","lastCommitWhen":"2026-05-07T15:59:42+02:00","lastCommitMessage":"chore: migrate pi packages to earendil works scope\n"},{"name":"subagent-summary-line.test.ts","kind":"file","size":10337,"lastCommitHash":"85c236d5fc5b0255addaa74026fbcfbf3e490b19","lastCommitWhen":"2026-08-29T10:54:05+02:00","lastCommitMessage":"refactor(coding-agent): derive scoped heartbeats at render time (#1857)\n\n* refactor(coding-agent): derive scoped heartbeats at render time\n\n* fix(coding-agent): keep the earliest heartbeat manager refresh deadline\n\nscheduleHeartbeatManagerRefresh now runs on every subagent snapshot\nupdate, and each call cleared and re-armed the refresh timer. An overdue\nheartbeat uses a relative 5s fallback delay, so children updating more\noften than every 5s postponed the open manager's refresh indefinitely.\nTrack the scheduled deadline and keep the pending timer unless the newly\nderived deadline is earlier.\n\n* test(coding-agent): cover re-arming the heartbeat refresh to an earlier deadline\n\nThe keep-timer-always mutant (returning whenever a timer is armed)\nsurvived the touched suites: nothing proved a sooner heartbeat pulls the\npending refresh forward past the capped 60s poll."},{"name":"system-prompt.test.ts","kind":"file","size":25261,"lastCommitHash":"7e70aea03dcf78c97aa65cc2a8e1aeb2a068e5fe","lastCommitWhen":"2026-08-31T22:05:28+09:00","lastCommitMessage":"complete guarded RLM results and background completion wakeups\n"},{"name":"telemetry.test.ts","kind":"file","size":16278,"lastCommitHash":"9db2722ed48bcf5c2576176a463cd23d3e59eec9","lastCommitWhen":"2026-08-29T10:53:35+02:00","lastCommitMessage":"refactor(coding-agent): remove the NODE_ENV=test telemetry branch (#1848)"},{"name":"test-theme-colors.ts","kind":"file","size":7861,"lastCommitHash":"2127573ac82a88c6c631fce92bd323edde4d7421","lastCommitWhen":"2026-06-11T12:53:54-07:00","lastCommitMessage":"unify tool rendering into a labeled background panel (#137)"},{"name":"theme-adaptive.test.ts","kind":"file","size":11805,"lastCommitHash":"fdc1bfdfc5ad8f3c1b24ea2e75a61bbf7c211129","lastCommitWhen":"2026-07-31T17:09:00+02:00","lastCommitMessage":"fix(coding-agent): keep selection highlight visible against matching terminal backgrounds (#562)"},{"name":"theme-export.test.ts","kind":"file","size":2813,"lastCommitHash":"94ece04f5d977326d01cc1b1913b04d2e2c8ff9e","lastCommitWhen":"2026-05-19T17:29:44-07:00","lastCommitMessage":"clean up legacy pi artifacts (#50)\n\n* chore: clean up legacy pi artifacts\n\n* test: update prime agent branding expectations"},{"name":"tool-execution-component.test.ts","kind":"file","size":31865,"lastCommitHash":"875aba9652c1bbf482aa1e2ae42ea519e3fd180b","lastCommitWhen":"2026-08-17T10:40:26+02:00","lastCommitMessage":"feat(coding-agent): always-visible edit summary with inline Ctrl+J diff (#1392)\n\n* feat(coding-agent): add ctrl+j toggle to expand edit diffs independently of tool output\n\n* feat(coding-agent): make ctrl+j sole owner of edit-diff visibility and hint the summary line\n\n* feat(coding-agent): always show the edit summary line and render the diff inline beneath it\n\n* fix(coding-agent): suppress edit summary on failed edits, unify summary path formatting, trim dead exports\n\n* fix(coding-agent): color the edit header as error when execution fails after a successful preview\n\n* fix(coding-agent): always show the ctrl+j hint on edit summary rows\n\nThe edit-diff hint was threaded through showExpandHint, the flag that\nrestricts the ctrl+o hint to the latest tool row. Since the agent almost\nalways runs more tools after an edit, edit rows stopped being \"latest\"\nimmediately and the ctrl+j hint effectively never appeared.\n\nThe ctrl+j hint now renders on every edit summary row, matching the\nalways-visible thinking (ctrl+t) and agent-message (ctrl+p) hints. The\nlatest-row gating still applies to the ctrl+o hint on the header line.\n\n* fix(coding-agent): stop duplicating the ctrl+j hint on collapsed edits\n\nCollapsed built-in edits showed the hint twice: on the edit header and on\nthe summary line. The header hint now renders only when the diff is\nexpanded (where no summary line exists); collapsed rows keep the single\nhint on the summary line.\n\n* docs(coding-agent): correct the ctrl+j hint comment to match showHint\n\nThe hint renders on every tool row, but within a row only on the last\nfile's summary line — the comment claimed every summary row.\n\n* fix(coding-agent): keep the ctrl+j hint visible while no summary line renders\n\nGating the header hint on expansion assumed the collapsed summary line\nalways carries the cue, but that summary only mounts once a successful\nresult with a countable diff lands. During the preview-only window and on\nerror rows the diff was expandable with no visible hint.\n\nThe header now keeps the hint whenever the summary line is absent\n(mirroring its mount condition) and yields it once the summary renders,\nso exactly one hint is visible in every state.\n\n* fix(coding-agent): advertise the collapse key on expanded ipython diff headers\n\n* fix(coding-agent): move the expanded-diff collapse hint to the truncated cell header\n\n* fix(coding-agent): stabilize summary-line truncation across the ctrl+j toggle and reuse countChangedLines"},{"name":"tools-manager.test.ts","kind":"file","size":5754,"lastCommitHash":"d7f09fcfcf1a9b2c08548e9172324799a6b73b7c","lastCommitWhen":"2026-07-14T17:29:37-07:00","lastCommitMessage":"fix(coding-agent): make ripgrep optional (ENG-4572) (#399)"},{"name":"tools.test.ts","kind":"file","size":25982,"lastCommitHash":"a7f679a1255c9e2ce9df41625241cc1e99fcfaec","lastCommitWhen":"2026-06-10T16:12:34-07:00","lastCommitMessage":"chore(deps-dev): bump vitest from 3.2.4 to 4.1.8 (#104)\n\n* chore(deps-dev): bump vitest from 3.2.4 to 4.1.8\n\nBumps [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) from 3.2.4 to 4.1.8.\n- [Release notes](https://github.com/vitest-dev/vitest/releases)\n- [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md)\n- [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.8/packages/vitest)\n\n---\nupdated-dependencies:\n- dependency-name: vitest\n  dependency-version: 3.2.6\n  dependency-type: direct:development\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\n\n* fix shellPath spy test for vitest 4 spy reuse semantics\n\n---------\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>\nCo-authored-by: Kevin Thomas <kevin.jt2007@gmail.com>"},{"name":"tree-selector.test.ts","kind":"file","size":22662,"lastCommitHash":"fd1bd875dc20628b2acd1b46d401ed223c3bcf4d","lastCommitWhen":"2026-07-15T16:23:39-07:00","lastCommitMessage":"add openai fast mode (#414)\n\n* feat: add OpenAI fast mode (ENG-4620)\n\n* fix: preserve fast mode on empty resume (ENG-4620)\n\n* fix: serialize fast mode toggles (ENG-4620)\n\n* fix: bump daemon protocol for fast mode (ENG-4620)\n\n* fix: keep fast mode in child agents (ENG-4620)\n\n* fix: route fast mode through daemon (ENG-4620)\n\n* fix: persist fast mode preference (ENG-4620)\n\n* fix: bind fast toggle to session (ENG-4620)\n\n* fix: sync fast mode after model switch (ENG-4620)\n\n* fix: preserve fast mode during tree navigation (ENG-4620)\n\n* fix: preserve fast mode preference on resume (ENG-4620)\n\n* fix: preserve daemon envelope compatibility (ENG-4620)\n\n* fix: render fast mode session metadata (ENG-4620)\n\n* fix: sync effective fast mode state (ENG-4620)\n\n* fix: preserve fast mode preference (ENG-4620)"},{"name":"trigger-compact-extension.test.ts","kind":"file","size":1915,"lastCommitHash":"7d4faa080dd07676806db0f653ef3e08a0c0081f","lastCommitWhen":"2026-03-28T22:25:06+01:00","lastCommitMessage":"fix: expose abort signal to extensions closes #2660\n"},{"name":"truncate-to-width.test.ts","kind":"file","size":2922,"lastCommitHash":"3e5ad67e0f325d4888f82f9b82966218eb4407f5","lastCommitWhen":"2026-05-07T15:59:42+02:00","lastCommitMessage":"chore: migrate pi packages to earendil works scope\n"},{"name":"user-message.test.ts","kind":"file","size":3756,"lastCommitHash":"2f218e15130904568a805ac8d1920927747d7791","lastCommitWhen":"2026-07-30T17:38:20+02:00","lastCommitMessage":"feat: unified agents and resume view (#541)\n\n* feat(coding-agent): unify searchable session view\n\n* fix(tui): keep session durations stable\n\n* test(daemon): tolerate partial session manager fixtures\n\n* test(tui): narrow session view race coverage\n\n* fix(tui): stabilize unified session catalogs\n\n* fix(tui): preserve session view lifecycle\n\n* fix(tui): preserve compact session view layout\n\n* test(tui): align cumulative session fixtures\n\n* fix(tui): preserve unified session identity and drafts\n\n* feat(tui): color recognized slash commands\n\n* fix(tui): keep view cancels and subagent matches local\n\n* test(tui): avoid platform-specific markdown styling\n\n* fix(tui): align session view status, reselect, and local resume flows\n\n* test(tui): consolidate slash command rendering coverage\n\n* test(tui): cover session view exit shutdown from chat\n\n* fix(tui): preserve dynamic command presentation\n\n* test(coding-agent): deadline-wait the create dedup race\n\n* test(coding-agent): align stacked fixtures\n\n* fix(tui): show seconds for sub-minute heartbeat countdowns\n\n* test(coding-agent): align cumulative session behavior\n\n* fix(coding-agent): flush child traces regardless of retention\n\n* fix(tui): single-own replacement catalog refresh\n\n* fix(tui): preserve drafts and completed child traces\n\n* fix(coding-agent): align template argument whitespace\n\n* fix(tui): restore saved sessions after reconnect\n\n* test(coding-agent): consolidate command presentation coverage\n\n* feat(tui): resume saved sessions from the reply composer\n\n* fix(tui): require heartbeat reconnect probe\n\n* test(coding-agent): align cumulative admission errors\n\n* fix(tui): schedule resumed replies from the resume summary\n\n* test(tui): align lifecycle stash handoff result\n\n* test(coding-agent): preserve unique lifecycle coverage\n\n* fix(tui): preserve inactive reply state on failures\n\n* fix(tui): route local agents view startup\n\n* refactor(tui): single-owner command catalog refresh\n\n* fix(tui): preserve selection after saved resume\n\n* test(tui): align startup lifecycle handoff\n\n* test(tui): resolve cumulative submit fixture\n\n* fix(tui): preserve in-flight reply drafts\n\n* test(tui): align owned startup exit shape\n\n* test(daemon): align delivery waiter contract\n\n* fix(tui): refresh resumed reply failures\n\n* fix(tui): preserve search selection\n\n* style(test): format cumulative prompt coverage\n\n* fix(agents-view): refresh reply target before send\n\n* fix(tui): complete onboarding before sessions\n\n* fix(tui): fence resync rendering by generation\n\n* refactor(coding-agent): consolidate prompt-admission cancellation\n\nExtract one shared waitForPromptAdmission helper and typed\nPromptAdmissionCancelledError into core/prompt-admission.ts, replacing\nthree near-identical copies in agent-session, daemon-mode, and\ndaemon-supervisor along with their copy-paste tests and the supervisor's\nstringly cancelled-status cast.\n\nAlso:\n- make _steeringStopPending a derived getter instead of a cached field\n  manually re-synced at 15 call sites\n- surface genuine handoff errors in _isDeferredSessionInputError instead\n  of silently requeueing them when the session is coincidentally busy\n- remove the production-dead pauseQueuedWork shim and narrow\n  resumeQueuedWork to pump-suspension recovery only\n\n* test(coding-agent): deterministic waits and shared test helpers\n\n- replace the 50ms sleep proving no queued turn starts after\n  abortForUpdateRestart with waitForSessionInputIdle\n- replace the 300ms sleep proving no prompt retry after an uncertain\n  admission failure with a bounded microtask drain\n- use the shared createDeferred from suite/scheduling.ts instead of two\n  local reimplementations\n- guard Reflect-based private access in the agents-view and supervisor\n  harnesses so renamed members fail with explicit messages, and document\n  why the constructor-bypass supervisor harness exists\n\n* chore(coding-agent): trim redundant comments from recent refactors\n\n* fix(coding-agent): guard session-input error surfacing against listener throws\n\nA throwing extension error listener could escape _surfaceSessionInputError\ninside _isDeferredSessionInputError before the pump requeued undelivered\nprompts, dropping them. Surfacing is now best-effort.\n\n* chore(coding-agent): tighten fix comment\n\n* fix(tui): keep the selection anchor across fallback unblocking\n\nResolving a missing anchor no longer overwrites the persisted anchor\nidentities with the visible fallback row, and typing while the anchor is\npending no longer claims the fallback either, so a late poll that\ndelivers the intended session re-anchors selection instead of opening\nthe wrong session.\n\n* fix(tui): open the unified session view on back navigation in local chats\n\nThe left-arrow back gesture only worked for daemon-backed sessions;\nprocess-local chats could reach the same unified view only via /resume.\nBack navigation now routes through requestAgentsView, which opens the\nlocal session view in place for process-local sessions.\n\n* fix(tui): preserve reply statuses across post-reply catalog refreshes\n\nThe refreshes triggered after a reply send or a failed resumed send used\ndefault error handling, so a failing catalog refresh could overwrite the\nsticky cwd-fallback notice or the send-failure message. Both refreshes\nnow preserve the current status on error.\n\n* chore(tui): drop redundant back-navigation comment\n\n* chore(tui): tighten reply-status comments\n\n* feat(tui): new session shortcut and steer/queue reply delivery\n\nctrl+n (app.agents.new) creates a fresh daemon session from the agents\nview and opens it. In the reply composer, Enter now steers a streaming\nagent and alt+enter (app.message.followUp) queues the reply as a\nfollow-up. While the composer is armed the hint line switches to\ncomposer hints: steer/send/resume & send, queue once text is typed, and\nesc to cancel.\n\n* feat(tui): session-owned slash commands in the reply composer\n\n/compact, /refine, /goal, and /autonomous pass through the daemon\nprompt path from the agents-view reply composer, with slash\nautocomplete active only while a reply target is armed. Other built-in\ncommands are rejected with guidance instead of being sent to the model\nas plain text.\n\n* feat(tui): view commands in the agents view\n\n/new, /fork, /name, and /kill run from the search editor against the\nselected row and from the armed reply composer against its target,\nwith autocomplete in both contexts. /fork forks at the current leaf via\nthe existing daemon fork RPC, resuming saved rows first; /name renames\nactive or saved sessions; /kill stops a running agent. Unknown or\nsession-only commands are rejected with guidance and plain text remains\na search query. The search hints now advertise \"/ commands\".\n\n* fix(tui): harden new-session shortcut and follow-up delivery\n\nctrl+n no longer fires while the reply composer is armed, so an unsent\ndraft cannot be discarded by opening a new session. Alt+Enter now\nexpands paste markers like Enter does. A session created after the view\nalready finished is killed instead of orphaned in the agents list.\n\n* fix(tui): preserve rejected drafts and bind completions to the target cwd\n\nA rejected command no longer loses the typed text (submitValue clears\nthe buffer before onSubmit; the rejection path now restores it unless\nnewer input arrived). The composer autocomplete provider is rebuilt\nwhen a target is armed, so @-file completions resolve in the target\nsession's cwd instead of the view's startup directory.\n\n* fix(tui): harden view commands against races, stale composers, and cancels\n\nAdapter-mode search no longer suggests view commands it will not run.\nArmed view commands cannot double-run (the buffer is already clear\nduring the RPC) and a failed command restores the typed draft in both\nthe composer and the search editor, without clobbering newer input.\nComposer disarm after /kill and /fork is guarded against a composer\nre-armed mid-command, and a fork cancelled by an extension is reported\nas cancelled instead of success.\n\n* fix(tui): report new-session outcome to callers\n\ncreateNewSession returns whether a session was created and opened, so\ncommand callers can restore a cleared draft on failure.\n\n* fix(tui): refresh after failed resumed forks and propagate /new outcome\n\nA saved row resumed for a fork that then fails, cancels, or has nothing\nto fork now refreshes the catalog so the newly live session appears\nimmediately. /new propagates createNewSession's outcome so a failed\ncreate restores the cleared draft.\n\n* fix(tui): enable @-path completion in the reply composer\n\nThe composer provider was built without an fd path, so @ fuzzy file\nsearch always returned empty. The view now resolves fd once and rebinds\nan armed provider when it becomes available.\n\n* fix(tui): create sessions over a dedicated connection\n\nfinish() closes the shared client, which rejected an in-flight create\nand made its session unkillable; a missing client also threw before the\nguard reset, permanently disabling the shortcut. Session creation now\nruns on its own short-lived connection inside the guarded try, so the\norphan-kill path works even after the view finished.\n\n* fix(tui): harden view commands against stale targets and filter churn\n\nSlash input in the search editor no longer filters the list, which\ncould swap the selected row before Enter ran the command on it. The\narmed composer re-resolves its captured summary before dispatch so\n/kill, /name, and /fork act on the current runtime, and rejects view\ncommands under the local adapter instead of sending them as prompt\ntext. A session resumed only to serve a fork is stopped again when the\nfork fails or is cancelled.\n\n* docs(tui): move the dedicated-connection rationale to its helper\n\n* fix(tui): drop submitted view commands from the persisted query\n\nsubmitValue clears the editor without queryChanged, so a successful\nsearch-editor command stayed in persistentState.query and a remount\nrestored it where Enter could re-run it on an arbitrary row. Failed\ncommands restore the draft through setSearchQuery so the persisted\nquery stays in sync.\n\n* fix(tui): only freeze the search filter for recognized command input\n\nUnknown slash-prefixed terms like /foo stayed unfiltered because any\nleading slash suppressed the query. The filter now freezes only while\nthe input is a view command or a prefix that can still extend into one,\nso ordinary slash search terms keep filtering.\n\n* fix(tui): warn on view commands in the adapter search editor\n\nAdapter sessions fell through to openSelected() when a view command was\ntyped, opening an unrelated row. The search branch now rejects them\nwith the same unavailable-command warning the reply composer shows.\n\n* test: consolidate overlapping reply-composer tests\n\n* test: fold command-classification cases into one test\n\n* test: consolidate overlapping view-command tests\n\n* refactor(tui): drop the /fork view command\n\nThe in-place daemon fork semantics (runtime rebind at the current leaf,\nresume-then-rollback for saved rows) carried a third of the view-command\ncomplexity for a command whose behavior we already flagged as awkward\nuntil isolated forking lands. /new, /name, and /kill remain.\n\n* fix(tui): restore the draft when the adapter search rejects a command\n\nsubmitValue had already cleared the buffer, so the warning silently ate\nthe typed command; it now comes back through setSearchQuery like other\nfailed search-editor commands.\n\n* test: fold sendReply delivery and follow-up keybinding cases together\n\n* test: fold draft-restore rejection cases together\n\n* docs(tui): tighten create-session comments\n\n* docs(tui): tighten the fd-rebind comment\n\n* test: fold overlapping composer tests; tighten comments\n\n* fix(tui): ctrl+c cancels the armed composer as its hint advertises\n\napp.clear ran first and started the exit flow, so a second ctrl+c could\nexit the view and discard the draft.\n\n* fix(tui): refresh the saved catalog after a live /name rename\n\nOnly the live list was refreshed, so the stale saved entry resurfaced\nthe old name once the agent was killed. Mirrors confirmRename.\n\n* fix(tui): gate search autocomplete on command input; refresh both catalogs after /kill\n\nAbsolute-path queries like /tmp/ fell through CombinedAutocompleteProvider\nto filesystem completions; the search editor now uses the same\nisAgentsViewCommandInput predicate as the filter freeze. Catalog\nrefreshes after rename and kill go through a shared refreshBothCatalogs\nso a killed agent reliably reappears under Inactive.\n\n* refactor(tui): share one renameSession path between rename mode and /name\n\n/name reimplemented the rename separately: it reported success before\nthe refresh and missed the older-daemon restart hint. Both entry points\nnow use the same rename/refresh/report sequence.\n\n* fix(tui): tolerate an already-finished agent in /kill\n\ndeactivatePendingAgent treats \"Unknown active session\" as already\nstopped; /kill surfaced the same race as a raw error.\n\n* docs(tui): drop comments that restate adjacent code\n\n* refactor(tui): search-only search bar; retire /resume and the local session view\n\nThe agents-view search bar no longer parses commands: /name and /kill\nlive only in the armed reply composer (their target is captured\nexplicitly), and new-session stays on its keybinding. This deletes the\nsearch-command autocomplete, the filter-freeze machinery, and the\npersisted-query replay handling that command input required.\n\nSession browsing is daemon-only: /resume and bare --resume are removed\nalong with the process-local SessionViewAdapter and every adapter\nbranch in the view. --resume <id|path> still resumes directly;\nnon-daemon `agents` warns and opens a chat. The chat hint now reads\n\"agents/resume\".\n\n* test: port #502 saved-catalog regressions off the removed adapter seam\n\nThe adapter layer was removed with /resume, so refreshSavedSessions now\nstreams list_saved_sessions through the daemon client and confirmRename\ndelegates to the shared renameSession path. The #502 regression harnesses\nstill faked options.adapter, so three tests failed (and two more passed\nonly because the missing client stub produced the expected false). Rebuild\nthem against client.request with onProgress streaming and the renameSession\ndelegate; behavior under test is unchanged.\n\n* chore: drop orphaned JSDoc for the removed bare --resume option"},{"name":"utilities.ts","kind":"file","size":9242,"lastCommitHash":"d773015ba9b1f3e9d17a5eb801601f7688792fcf","lastCommitWhen":"2026-06-24T20:37:36-07:00","lastCommitMessage":"feat(coding-agent): bundle default websearch skill (#86)\n\n* feat(ai): add Claude Opus 4.8 to Prime Inference\n\n* feat(coding-agent): bundle default websearch skill\n\nShip a Serper-backed websearch Python skill with Prime Agent so web\nsearch works without manually installing a skill package. Bundled\nskills load by default and are overridden by user/project/package/CLI\nskills with the same name; --no-skills excludes them.\n\n* fix(coding-agent): resolve bundled skills dir by src checkout\n\nMatch the established srcOrDist asset convention: pick the package-root\nskills dir on source checkouts and dist/skills otherwise, so a stale\ndist/ from a prior build does not shadow live source edits.\n\n* fix(coding-agent): configure bundled websearch skill\n\n* fix(coding-agent): clarify websearch startup warning\n\n* store serper websearch key via /login instead of env var\n\nAdd the Serper key as an api-key credential in the /login screen so it is\nstored in auth.json and injected into the kernel as SERPER_API_KEY; an env\nvar still takes precedence. Drop the startup warning and make the skill's\nmissing-key error instruct the agent to guide the user through /login.\n\nAlso fix two websearch.py bugs: bad numeric env vars no longer crash run(),\nand truncation stays within max_output.\n\n* put serper under a services tab in /login and read its key from auth.json\n\nAdd a Providers/Services tab split to the /login selector (left/right to\nswitch) so the Serper web-search credential lives under Services instead of\nbeing buried in the provider list. Skip the post-login model picker for\nservice credentials.\n\nThe websearch skill now resolves its key from SERPER_API_KEY or auth.json on\neach call, so a key added via /login works even when the kernel started\nfirst.\n\n* harden websearch key resolution and login tab cursor handling\n\nAddress review feedback: resolve the Serper key from a programmatic (SDK)\nagentDir by exporting it to the kernel, ignore non-mapping auth.json and\n\"!command\" key references instead of crashing or sending them verbatim, and\nonly steal left/right for tab switching when the /login search field is empty\nso cursor editing still works.\n\n* resolve serper key via auth storage and fix login tab layout\n\nInject the Serper key resolved through AuthStorage (handles literal, env-var,\nand !command credential forms) into the kernel when websearch is active,\nusing the session's own storage so it is correct for SDK-injected managers.\nThe skill's mid-session auth.json fallback now resolves env-var-reference\nkeys too. Reserve the extra rows the /login tab bar consumes so the selector\nno longer overflows small terminals.\n\n* always export agent dir for websearch and clamp truncation\n\nExport PRIME_AGENT_CODING_AGENT_DIR regardless of the bundled-skill setting so\na --skill or project websearch copy can still locate auth.json; only the key\ninjection stays gated on the bundled skill. Hard-clamp truncated output so it\nnever exceeds max_output when the budget is smaller than the marker.\n\n* scope agent dir to explicit config and use callable skill form in docs\n\nPass agentDir to the session only when the caller set it explicitly, so an\ninjected custom auth storage backed by another directory is not overridden by\nthe default path. Update the websearch docs to call the skill directly. Trim\ncomments.\n\n* gate serper key injection on a loaded websearch skill, not settings\n\nInject the key whenever any websearch skill is loaded (bundled, --skill, or\nproject), so a custom skill relying on the agent to resolve command-backed\ncredentials still works when bundledSkills.websearch is off.\n\n---------\n\nCo-authored-by: Kevin Thomas <kevin.jt2007@gmail.com>"},{"name":"version-check.test.ts","kind":"file","size":3594,"lastCommitHash":"389abd51e332202e13bb010a7465914affde36dc","lastCommitWhen":"2026-07-17T16:03:17-07:00","lastCommitMessage":"add production and beta release channels (#469)\n\n* add production and beta release channels\n\n* serialize release workflow runs\n\n* make production releases retryable"},{"name":"worker-recovery-journal.test.ts","kind":"file","size":2014,"lastCommitHash":"4d19005d4a25b10ce6d90fdd4961ed374c64ea17","lastCommitWhen":"2026-07-13T17:47:15-07:00","lastCommitMessage":"isolate daemon sessions in worker processes (#383)\n\n* perf(coding-agent): add large daemon attach benchmark\n\n* feat(coding-agent): isolate session execution in workers\n\n* fix(coding-agent): reconnect after supervisor replacement\n\n* fix(tui): preserve input across fullscreen handoff\n\n* fix(coding-agent): prevent archived heartbeat revival\n\n* fix(coding-agent): cancel orphan heartbeat sessions\n\n* fix(tui): preserve drafts across daemon refreshes\n\n* fix(coding-agent): separate daemon resyncs from replacements\n\n* fix(coding-agent): stabilize daemon streaming ui\n\n* refactor(coding-agent): remove obsolete subagent tree\n\n* feat(coding-agent): show subagent recaps inline\n\n* fix(coding-agent): refine subagent summary spacing\n\n* fix(coding-agent): preserve full subagent row selection\n\n* fix(coding-agent): align subagent summary rows\n\n* fix(coding-agent): preserve reasoning during daemon resync\n\n* fix(coding-agent): isolate heartbeat scheduling per worker (ENG-4527)\n\n* fix(coding-agent): retry partial daemon reconnects\n\n* fix(coding-agent): harden isolated daemon recovery\n\n* fix(coding-agent): close daemon recovery races\n\n* fix(coding-agent): validate daemon recovery state\n\n* fix(coding-agent): close isolated worker recovery gaps\n\n* fix(coding-agent): verify orphan process identity\n\n* fix(coding-agent): isolate worker client capabilities\n\n* fix(coding-agent): preserve daemon terminal ordering\n\n* fix(coding-agent): serialize durable daemon state\n\n* fix(coding-agent): avoid duplicate worker recovery\n\n* fix(coding-agent): isolate peer sync failures\n\n* fix(coding-agent): fail unanswered rpc commands\n\n* fix(coding-agent): distinguish lease contention"},{"name":"working-duration.test.ts","kind":"file","size":717,"lastCommitHash":"bc43ee904e918c15ed6907cba2780e0497a947be","lastCommitWhen":"2026-08-02T11:24:07+02:00","lastCommitMessage":"fix(coding-agent): format long thinking durations (#579)"},{"name":"working-icon-animation.test.ts","kind":"file","size":1867,"lastCommitHash":"e55d8d6c9df8651961f360979c73e7bffb6d1066","lastCommitWhen":"2026-06-23T21:01:58-07:00","lastCommitMessage":"improve subagent ux in the chat view (#247)\n\n* improve subagent UX in the chat view\n\n* surface subagent prompt diffs and keep chat actions live in the list\n\n* pass full subagent prompt as label; cap only at TUI display\n\n* window subagent prompt elision tightly around the diff\n\n* address review-bot findings: pulse/loader reset, width-aware truncation, full-width prompt, subagent count priority, partial-result spinner\n\n* wire summary onOpen fallback so Enter has defined behavior on an empty list\n\n* update tool-execution test for animated running status glyph\n\n* re-attach working loader after compaction/retry clear the status container\n\n* stub syncWorkingLoader in compaction handleEvent test"}]