Commit Graph
9801 Commits
Author SHA1 Message Date
can1357 7eeaba0471 refactor(coding-agent/session): restructured monolithic agent session
- Extracted internal handlers and logic from AgentSession into dedicated runner, guard, and coordinator modules.
- Created standalone modules for bash execution, evaluation runners, IRC bridging, and prewalk coordination.
- Established dedicated session components for tracking stats, todos, streams, and retry fallback chains.
- Preserved existing session behavior while significantly reducing monolithic class size and complexity.
2026-07-24 01:24:44 +02:00
roboomp 68193c8240 test(extensibility): drop dynamic import from #6449 regression test
Extract the first-wins global registration into an exported
ensureGraphCommonJsRequireRegistered() seam and assert its idempotent
(first-wins) contract directly, instead of copying the module and importing
the copy at runtime. Removes the inline await import() banned under
packages/coding-agent and keeps regression coverage: the test fails if the
registration reverts to an unconditional set.

Fixes #6449
2026-07-23 23:08:30 +00:00
roboomp d69cf2106e fix(extensibility): guard legacy-pi-compat commonjs registration first-wins
On npm/source-link installs the @(scope)/pi-coding-agent root shim is served
from src/, so an extension's import evaluates a second instance of
legacy-pi-compat.ts. Its unconditional top-level
Reflect.set(globalThis, COMMONJS_REQUIRE_GLOBAL, evaluateGraphCommonJs)
clobbered the host bundle's populated CommonJS graph bridge with an empty-state
copy, breaking transitive CommonJS dependency resolution for legacy pi
extensions ("Missing graph-owned CommonJS definition").

Guard the registration to first-wins so the host-owned bridge survives a
second module instantiation.

Fixes #6449
2026-07-23 23:00:35 +00:00
Alex TYRODE 7626effec5 fix(extensions): preserve service-tier host compatibility 2026-07-23 22:14:31 +00:00
Anatoli Tsinovoy ead98c7f12 fix(plan): preserve review annotations 2026-07-24 00:52:31 +03:00
Anatoli Tsinovoy fddad3c719 fix(coding-agent): return from omfg amendment cancel 2026-07-24 00:52:27 +03:00
Alex TYRODE e0928070c2 feat(extensions): expose session service tiers 2026-07-23 21:49:20 +00:00
TechDufus 890dd88597 fix(coding-agent): make mixed-agent task batches atomic and inspectable 2026-07-23 16:47:51 -05:00
Alex TYRODE 60920e1c00 Merge upstream main into feat/auth-broker-account-pools 2026-07-23 21:37:51 +00:00
Alex TYRODE e6ab870d37 fix(ai): close auth broker account pool gaps 2026-07-23 21:28:17 +00:00
can1357 e23359fd1a fix(prompts): restored JS spread operator mangled into Unicode ellipsis by reformat
- 24e2a52615 turned ...f into …f inside the workflow-notice parallel example, making the copyable snippet a syntax error.
2026-07-23 23:15:31 +02:00
can1357 46d2b7d864 Merge PR #6439: fix(compaction): stop feeding reasoning back to Claude summarizer (@roboomp) 2026-07-23 23:05:47 +02:00
Alexander Kirilin 4274100bbe fix(cli): preserve cache prefix whitespace 2026-07-23 16:52:20 -04:00
can1357 8cab2b7cd5 fix(session): run prompts issued while disposing instead of dropping them
- The memory-backend transition await added in PR #6428 guarded with #isDisposed, which beginDispose() sets immediately; prompts issued in the disposing window were silently dropped instead of running their final turn and settling via the dispose abort.
- Guard now only drops the prompt when disposal began during the transition await.
2026-07-23 22:42:34 +02:00
roboomp 5a70eda7d7 fix(compaction): stop feeding reasoning back to Claude summarizer
Both compaction serializers reproduced prior assistant reasoning as text
bound for a Claude target, tripping Anthropic's reasoning_extraction
refusal and wedging Fable 5 sessions:

- context-full: serializeConversation rendered thinking verbatim inside
  <thinking> tags via the anthropic dialect renderer. Now drops thinking
  blocks when the summary target dialect is anthropic; other dialects
  (e.g. Harmony) keep native reasoning.
- snapcompact: emitted ¶think sections baked into replayed archive
  frames. Added an includeThinking serialize option (default true) and
  wired the agent session to disable it for Anthropic-dialect models.

Fixes #6093
2026-07-23 20:38:27 +00:00
can1357 83e0e4cdac Merge PR #6435: fix(session): resume resolved tool stalls (@roboomp) 2026-07-23 22:38:05 +02:00
Alexander Kirilin f25cc6cf09 fix(cli): harden prompt cache benchmark diagnostics 2026-07-23 16:37:39 -04:00
can1357 b326e79e6e chore: applied formatter and dropped unused catch binding from merged lsp fix 2026-07-23 22:27:08 +02:00
Baris Demirdelen 0cd96ad2cd Merge branch 'main' into fix/acp-mcp-late-connect 2026-07-23 22:25:23 +02:00
can1357 9c44ad185c fix(read): restored untilAborted import dropped by merge overlap of #6404 and #6417
- #6417 moved findUniqueSuffixMatch (the only prior untilAborted user) out of read.ts and removed the import; #6404 added new untilAborted callsites in regions git auto-merged without conflict.
2026-07-23 22:19:37 +02:00
roboomp 055a0ce0af fix(session): resumed resolved tool stalls
- Preserved stalled assistant turns when every emitted tool call had a result, including synthetic unexecuted results.

- Kept unresolved and non-stall tool errors replay-safe and covered terminal error agent_end delivery.

Fixes #6414
2026-07-23 20:18:03 +00:00
can1357 29c2bd2595 Merge PR #6415: fix(compaction): judge remote-preserve reuse against the active model (@roboomp)
# Conflicts:
#	packages/coding-agent/src/session/agent-session.ts
2026-07-23 22:16:11 +02:00
can1357 72ff07ff84 Merge PR #6428: fix(memory): synchronize live backend lifecycle (@roboomp) 2026-07-23 22:15:25 +02:00
can1357 c6e8ff5494 Merge PR #6409: fix(bedrock): validate prompt cache checkpoints (@riverpilot) 2026-07-23 22:15:24 +02:00
can1357 eaa3002b9d fix(tts): cap replay retention so long utterances stay bounded in memory
Streamed PCM kept for the nonzero-exit replay is now dropped once the
utterance exceeds 60s (~5.8 MB at 24 kHz mono f32): the recovered failure
is a short clip that fits the pipe buffer before a broken backend dies,
while replaying a long already-played utterance would duplicate audio and
unbounded retention would defeat streaming for long input.
2026-07-23 22:15:24 +02:00
can1357 46ae99cea8 Merge PR #6421: fix(tts): play buffered audio when streaming backend exits nonzero (@roboomp) 2026-07-23 22:15:24 +02:00
can1357 2ecba08e2a Merge PR #6407: fix(browser): bound open timeout and lease browser across tab acquisition (@roboomp) 2026-07-23 22:15:24 +02:00
can1357 ad1713632b Merge PR #6405: fix(eval): coalesce dead Python kernel replacement (@roboomp) 2026-07-23 22:15:23 +02:00
can1357 bbf0402990 fix(coding-agent): surface JSON-RPC error code so -32601 method-not-found is recognized regardless of message text
Codex P2 on #6403: sendRequest rejected with only the server's error
message; a server answering rust-analyzer/reloadWorkspace with code
-32601 but nonstandard text (e.g. "Unknown request") would fail
isMethodNotFoundError and turn lsp reload into a hard error instead of
falling back to the generic reload. Include the code in the rejection
message so the existing -32601 substring check matches. Adds a
regression test with a -32601/"Unknown request" response.
2026-07-23 22:15:23 +02:00
can1357 221c93c88b Merge PR #6403: fix(coding-agent): propagate cancellation from lsp reload instead of false restart (@roboomp) 2026-07-23 22:15:23 +02:00
can1357 418076e44a fix: treat escaped quotes inside double-quoted backticks as inner quoting
Bash treats \" inside a backtick substitution nested in double quotes as
a quote delimiter for the inner command; the generic backslash-skip made
isInsideShellQuote report such quoted literals as unquoted, wrongly
expanding internal URLs inside them (Codex P2 review finding).
2026-07-23 22:15:23 +02:00
can1357 5ac3094d88 Merge PR #6418: fix(tool): expand internal urls inside backtick substitutions (@roboomp) 2026-07-23 22:15:23 +02:00
can1357 cf886d8d8a fix(edit): reuse resolved workspace target across apply_patch hunks for the same authored path 2026-07-23 22:15:23 +02:00
can1357 a5e59a4e56 Merge PR #6417: fix(edit): align relative path resolution (@roboomp) 2026-07-23 22:15:22 +02:00
can1357 c991270145 Merge PR #6404: fix(coding-agent): make PDF image cache content-aware (@roboomp) 2026-07-23 22:15:22 +02:00
can1357 a6072d0013 Merge PR #6427: fix(session): validate blob refs before path join (@roboomp) 2026-07-23 22:15:22 +02:00
can1357 449762b0e9 Merge PR #6426: fix(session): serialize ArtifactManager first-use init (@roboomp) 2026-07-23 22:15:22 +02:00
can1357 e8502806ff fix(mcp): retry smithery poll timeouts until the authorization deadline
A single hung/slow poll now aborts with TimeoutError after 30s; without
this, that one timeout escaped #waitForSmitheryCliApiKey and dropped the
browser login to the manual API-key fallback instead of retrying until
the 5-minute deadline. Catch isTimeoutError in the poll loop and
continue; export SmitheryCliPollResponse to type the retried response.
2026-07-23 22:15:21 +02:00
can1357 db2601eaff Merge PR #6425: fix(mcp): bound oauth discovery and smithery poll fetches with abort timeouts (@roboomp) 2026-07-23 22:15:21 +02:00
can1357 a18956ded9 Merge PR #6424: fix(mcp): serialize mcp.json config writes and use unique temp path (@roboomp) 2026-07-23 22:15:21 +02:00
can1357 ef39fe18b9 Merge PR #6420: fix(tui): re-resolve transient status colors on theme swap (@roboomp) 2026-07-23 22:15:21 +02:00
Baris Demirdelen d4f97d39f0 Fix race condition in the race condition fix 2026-07-23 22:10:15 +02:00
Baris Demirdelen bddbbfd5cf fix(acp): pick up MCP tools that connect after the startup race 2026-07-23 22:10:15 +02:00
roboomp 75668387db fix(write): guarded selector-shaped archive members
Applied the read-selector misfire check to archive members after loading
the archive entry map and before mutation. Missing empty selector-shaped
members now fail closed, while existing literal members remain writable.

Added regression coverage proving rejected writes leave archives unchanged.
2026-07-23 20:07:07 +00:00
roboomp 741725612b fix(tts): gated playback clearing to user messages
Moved vocalizer interruption from agent_start to user message_start so agentLoopContinue preserves queued speech.

Expanded regression coverage for continuation starts and user prompt boundaries.

Fixes #6375
2026-07-23 20:05:49 +00:00
roboomp 111de5ab71 fix(agent): commit plan-reference flag on delivery, not construction
#buildPlanReferenceMessage set #planReferenceSent = true while building the
message, before it was handed to agent.prompt. Any pre-send setup bail (the
four #promptGeneration generation-bail returns) or throw (@-mention reads,
before_agent_start hooks) between build and delivery left the flag true with
nothing delivered, and the #promptWithMessage finally never cleared it — so the
retry short-circuited at `if (this.#planReferenceSent) return null` and the
approved plan was silently dropped for the rest of the session.

Move the flag commit to the delivery hand-off point in #promptWithMessage: set
it only when a plan-reference message was built AND we are about to call
#promptAgentWithIdleRetry. Every bail/throw now leaves the flag clear so the
next prompt re-injects the plan. The compaction-success resets (issue #1246)
still clear it for re-injection on the next turn.

Fixes #4094
2026-07-23 19:54:52 +00:00
can1357 7158dcd9b3 fix(coding-agent): deferred hub tool renderer access to avoid temporal dead zone
- Convert the hub tool renderer to a lazy getter to prevent initialization-order temporal dead zone issues.
- Add session move support to the fake ACP builtin session runtime.
2026-07-23 21:54:35 +02:00
roboomp 3b194a3e37 fix(dap): reject and bound the unix socket connect on Linux
connectSocket captured only resolve from Promise.withResolvers and its
error handler merely errored the stream, so a Bun.connect failure
(ECONNREFUSED/ENOENT/EACCES on a stat-ready-but-dead socket) never
settled the promise. The unbounded await in #spawnSocketUnix then hung
the launch forever, and the surrounding kill/reap guard could not fire.

Capture reject, track an opened flag, reject on error/close-before-open
and on the Bun.connect promise rejection, and bound the connect with a
timeout matching the launch deadline (cleared on settle). Thread
timeoutMs from #spawnSocketUnix. Export connectSocket for a deterministic
reject-path test.

Fixes #4087
2026-07-23 19:54:04 +00:00
roboomp cb63ebd9f5 fix(session): preserved compaction data for rewinds
Kept superseded summaries and preserveData durable while deriving forward transcript elision from the active compaction.

Added branch and rewind coverage for snapcompact archives and OpenAI remote replacement history.

Fixes #4090
2026-07-23 19:53:05 +00:00
roboomp 5a1f227a6b fix(memory): synchronized live backend lifecycle
- Serialized backend transitions across runtime state, tools, and prompts.
- Rehydrated Mnemopi listeners after clear and enqueue maintenance.
- Made memory.backend the sole post-migration local runtime gate.

Fixes #5638
2026-07-23 19:52:09 +00:00