Commit Graph
10092 Commits
Author SHA1 Message Date
can1357 1fecdb84fd Merge PR #6240: fix(tui): lock plan review overlay after a choice commits (@roboomp) 2026-07-22 21:13:18 +02:00
can1357 2393f3fd1e Merge PR #6217: fix(tui): surface provider errors above plan review (@roboomp) 2026-07-22 21:13:17 +02:00
can1357 e7f3fde12b fix(tui): prune settled-component cache to rendered messages on rebuild
Session entries keep AgentMessage objects strongly reachable for the whole
session, so WeakMap entries for compacted-away history pinned their
components' rendered layout caches forever. Rebuild now retains only
components for messages the new transcript context actually renders.
2026-07-22 21:13:17 +02:00
can1357 e1173b8aeb Merge PR #6199: fix(tui): reuse settled components after compaction (@roboomp) 2026-07-22 21:13:17 +02:00
can1357 6389f4628a Merge PR #6313: fix(tui): collapse synthetic advisor inputs in the transcript viewer (@roboomp) 2026-07-22 21:13:17 +02:00
can1357 6039f1a377 Merge PR #6270: fix(agent): bound OpenRouter thinking stream retries (@riverpilot) 2026-07-22 21:13:17 +02:00
can1357 ca1deb7aec Merge PR #6227: fix(coding-agent): replay committed tasks over dirty parent (@roboomp) 2026-07-22 21:13:16 +02:00
can1357 b6e9d387d7 fix(mnemopi): derive legacy retention cursor conservatively
Pre-fix resumed sessions wrote cumulative transcript rows under the
incremental ${sessionId}-<ts> source_id shape, so summing every prefixed
legacy row could overshoot the real retained prefix and permanently skip
unseen turns. Use per-row max instead: it can only under-count, which at
worst re-stores one suffix before an explicit cursor row takes over.
Adds a regression seeding a legacy bank with two incremental rows plus a
cumulative resumed row and asserting turns 7-8 still get retained.
2026-07-22 21:13:16 +02:00
can1357 576ee28434 Merge PR #6202: fix(mnemopi): retain only unretained turns on consolidation (@roboomp) 2026-07-22 21:13:16 +02:00
can1357 75b06747aa Merge PR #6225: fix(coding-agent): make hindsight request timeouts per-op and configurable (@roboomp) 2026-07-22 21:13:16 +02:00
can1357 d723de46f9 Merge PR #6206: fix(session): skip titles for local extension commands (@roboomp) 2026-07-22 21:13:16 +02:00
can1357 1ed10c5cef Merge PR #6197: fix(todo): prevent stale batch state replay (@roboomp) 2026-07-22 21:13:15 +02:00
can1357 29a94ac49c Merge PR #6200: fix(session): retry past synthetic tool results after mid-tool-call stall (@roboomp) 2026-07-22 21:13:15 +02:00
can1357 e117474bb5 docs(changelog): move #6177 entry to Unreleased section 2026-07-22 21:13:15 +02:00
can1357 e05419a354 Merge PR #6234: fix(session): log provider turn errors at warn with error fields (@roboomp) 2026-07-22 21:13:15 +02:00
can1357 e912efaa79 Merge PR #6226: fix(session): skip stop hooks during aborts (@roboomp) 2026-07-22 21:13:15 +02:00
can1357 6542641ad8 Merge PR #6253: fix(session): persist terminal empty error turns ending the run (@roboomp) 2026-07-22 21:13:14 +02:00
can1357 52236fa1a5 Merge PR #6262: fix(settings): merge global model roles per-role on save (@roboomp) 2026-07-22 21:13:14 +02:00
pr-evalandcan1357 ab8e36fa6c test(coding-agent): make prewalk no-auth test independent of runner env keys
hasAuth() consults $HOME/.env via getEnvApiKey, so a CEREBRAS_API_KEY in the
runner's home .env legitimately armed prewalk and failed the no-auth case.
Force the condition with a hasConfiguredAuth spy.
2026-07-22 21:13:14 +02:00
can1357 b6674731a0 Merge PR #6203: fix(coding-agent): keep startup alive when prewalk target lacks auth (@roboomp) 2026-07-22 21:13:14 +02:00
can1357 e49426c949 fix(cli): prefer authenticated provider for flat slashful model ids
Flat aggregator ids whose prefix collides with a provider slug (e.g.
openai/gpt-oss-120b hosted on OpenRouter) bypassed the authenticated-model
preference: the explicit-provider branch searched the full catalog only.
Keep provider/id exact references authoritative, but let the flat-id
fallback prefer authenticated providers before catalog order.
2026-07-22 21:13:14 +02:00
can1357 c74ef96263 Merge PR #6230: fix(cli): prefer authenticated provider for bare models (@roboomp) 2026-07-22 21:13:13 +02:00
can1357 ccbe190d64 fix(sdk): inherit role thinking level on startup retry fallback
A retry-chain entry without its own :level suffix now inherits the
unavailable primary's configured thinking level, matching runtime
fallback-chain semantics. Regression test asserts a level that differs
from the fallback model's default.
2026-07-22 21:13:13 +02:00
can1357 a929cde5e2 Merge PR #6285: fix(sdk): resolve missing role fallback chains (@roboomp) 2026-07-22 21:13:13 +02:00
can1357 c083170c46 Merge PR #6233: fix(sdk): resolve configured default role over cold-cache discovery race (@roboomp) 2026-07-22 21:13:13 +02:00
can1357 50ee1a7998 Merge PR #6196: fix(coding-agent): preserve compat overrides on model refresh (@roboomp) 2026-07-22 21:13:13 +02:00
can1357 45df1a0fd5 Merge PR #6286: fix(catalog): restore cached Copilot 1M models via requestModelId (@roboomp) 2026-07-22 21:13:12 +02:00
can1357 45d00ad296 Merge PR #6266: fix(catalog): union Codex models across OAuth accounts (@roboomp) 2026-07-22 21:13:12 +02:00
can1357 b98b4d1607 docs: add [Unreleased] changelog entries for connection-failure retry classification 2026-07-22 21:12:21 +02:00
can1357 06f2ae96f6 Merge PR #6139: fix(ai): retry provider connection failures (@usr-bin-roygbiv) 2026-07-22 21:12:21 +02:00
can1357 87e55d10d7 Merge PR #6269: fix(installer): avoid mismatched bun architecture on apple silicon (@roboomp) 2026-07-22 21:12:20 +02:00
can1357 91a5364fb8 Merge PR #6232: fix(release): preserve changelog source fingerprints (@roboomp) 2026-07-22 21:12:20 +02:00
roboomp a2c90f5e5f fix(tui): collapsed synthetic advisor inputs in transcript viewer
Cold-opening a large read-only Advisor transcript froze the TUI for tens
of seconds: AgentTranscriptViewer.render() called the full
container.render() before ScrollView clipped, laying out every synthetic
`Session update` input as full Markdown. A 6.5 MiB __advisor.jsonl
blocked the first frame ~27s in a repro.

Synthetic (agent-attributed) inputs now render as a CollapsedSyntheticMessageComponent:
one dim summary row (heading, size, line count, ctrl+o hint) that builds
the heavy UserMessageComponent Markdown only on expand. Blocks above the
viewport never pay layout on cold open; the raw observability data in
__advisor.jsonl is untouched. Real user prompts stay fully rendered.

Fixes #6308
2026-07-22 18:12:24 +00:00
Alexander Kirilin 298fea76bd chore(agent): clean retry helper formatting 2026-07-22 09:49:55 -04:00
roboomp b257a6dcbf fix(session): preserved startup fallback ownership
- Carried startup-selected fallback role and primary selector into AgentSession.
- Continued remaining role fallback entries after the startup fallback fails.
- Added regression coverage for chained startup failover.

Fixes #6283
2026-07-22 11:11:30 +00:00
roboomp b823c18837 fix(catalog): guarded request-model header recovery
Versioned request-header restoration metadata inside v10 cache rows so only markers written by the old id-only matcher can bypass an unrestorable marker through requestModelId. Current aliases whose live headers differ from their static base remain unresolved and are refetched or dropped.

Added catalog and startup-registry regressions for custom-header aliases while preserving legacy Copilot -1m cache recovery.

Fixes #6284
2026-07-22 11:10:23 +00:00
roboomp 79edf46158 fix(sdk): preserved suffixed role fallback lookup
- Stripped explicit thinking suffixes before recording configured role identity.
- Covered unavailable suffixed-role primaries selecting authenticated fallbacks.

Fixes #6283
2026-07-22 11:01:05 +00:00
roboomp d9bab7ce8b fix(catalog): restore cached request-model variants via requestModelId
Copilot -1m long-context variants are synthesized with transport
headers and a requestModelId to a bundled base. The v10 cache omits
headers; the writer only matched a same-id static entry, so these
variants were flagged unrestorable and dropped on the next offline
read, vanishing from the picker with a "Could not restore model"
warning. The startup registry loader dropped them the same way.

Restore/match headers through requestModelId in the cache writer, the
model-manager restore path, and the coding-agent startup loader, and
bypass a stale unrestorable marker written by the old id-only writer.

Fixes #6284
2026-07-22 10:59:10 +00:00
roboomp 093f7c2660 fix(sdk): resolved missing role fallback chains
- Carried configured role identity through deferred CLI model resolution.
- Consulted ordered authenticated role fallbacks after unavailable primaries.
- Added startup regression coverage for missing primary and fallback entries.

Fixes #6283
2026-07-22 10:52:57 +00:00
Alexander Kirilin 5abac0245a fix(agent): bound OpenRouter thinking stream retries 2026-07-22 03:21:00 -04:00
roboomp dfeaa7aed1 fix(catalog): aborted codex discovery on failed account refresh
resolveCodexDiscoveryAccounts now returns null when any stored Codex OAuth
account fails to resolve (e.g. a transient refresh failure), and the manager's
resolveAccounts callback propagates null to skip discovery. Previously a failed
account was silently dropped before unionCodexModels saw it, so the remaining
accounts were unioned and cached as the authoritative catalog, hiding the
failed account's models for the cache TTL. Aborting keeps the previous/bundled
catalog.

Add a ModelRegistry regression test with one refreshable and one failing Codex
account asserting discovery makes no /models call and bundled models survive.

Fixes #6265
2026-07-22 07:19:11 +00:00
roboomp 329db086f4 fix(installer): avoid mismatched bun architecture on apple silicon
The default install path only checked whether bun existed, so an
x86_64 bun running under Rosetta installed an x86_64 omp on Apple
Silicon (AVX warning, ~11s startup). Compare bun's process.arch to
the host, detecting Apple Silicon via `sysctl -in hw.optional.arm64`
so Rosetta can't spoof it, and fall back to the prebuilt native
binary on mismatch; `--source` now errors actionably. install_binary
also derives the arch from the real host instead of the
Rosetta-translated `uname -m`.

Fixes #6268
2026-07-22 07:11:40 +00:00
roboomp 2eff59e060 fix(catalog): preserved codex discovery token fallback
Keep the bearer resolved by the discovery preflight when it is not among the
stored OAuth account resolutions. This preserves Codex discovery for env,
runtime/config override, and stored non-OAuth credential sources while still
unioning all configured OAuth account catalogs.

Add a ModelRegistry regression test that drives runtime-key discovery and
asserts the resolved bearer reaches the Codex models endpoint.

Fixes #6265
2026-07-22 07:08:22 +00:00
roboomp b9dd5bce8a fix(catalog): unioned codex models across oauth accounts
Codex catalog discovery resolved a single access token, mapped it to one
chatgpt-account-id, and made one authoritative fetchCodexModels call whose
result pruned bundled entries. With multiple ChatGPT/Codex OAuth accounts,
the visible catalog depended on whichever account the discovery preflight
selected, hiding models available only through a sibling account.

openaiCodexModelManagerOptions now takes a resolveAccounts callback, fetches
each configured account's /models catalog independently, and unions them by
id before the authoritative merge. Bundled models are retained when every
account fetch fails. The runtime wiring resolves every stored openai-codex
OAuth account via AuthStorage.getOAuthAccesses.

Fixes #6265
2026-07-22 07:00:31 +00:00
roboomp d30c5e8603 fix(settings): cleared persisted pending role writes
Serialize queued global saves and remove opportunistically persisted roles from the pending set after a successful write when their value has not changed again. This prevents a redundant follow-up save from replaying stale local values over newer external edits.

Expanded the locked-save regression to externally change the same role after the first write and verify flush leaves that newer disk value intact.
2026-07-22 04:27:25 +00:00
roboomp 640249ef33 fix(settings): preserved role writes during pending saves
Snapshot model roles when each save starts and merge any newer pending values before replacing the in-memory global settings. This keeps a second model switch intact while an earlier locked save is in flight.

Added a deterministic regression test that blocks the first file-lock operation, changes another role, and verifies both memory and disk.
2026-07-22 04:19:35 +00:00
roboomp 14a8b709cc fix(settings): merge global model roles per-role on save
Global setModelRole marked the whole modelRoles path modified and
saveNow overwrote the freshly re-read disk record with the stale
in-memory map, clobbering concurrent/external per-role edits despite
the re-read intended to preserve them. Track modified global roles
individually and merge only those into the re-read file, mirroring the
project save path.

Fixes #6260
2026-07-22 04:09:55 +00:00
roboomp 615d3c6dc5 fix(session): persisted terminal empty error turns ending the run
A non-retriable provider error on the continuation turn after a failed
tool result ended the run, but #persistSessionMessageIfMissing dropped
the empty error turn as reload poison, so the session JSONL stopped at
the last tool result and the provider errorMessage was lost with no
durable record of why the run stopped. When retry, model fallback, and
compaction all decline the turn, the non-retry terminal error tail now
persists it via the same helper the retry-lifecycle dead-ends use; the
empty turn stays off the wire on reload via the transform-messages
empty-assistant filter, matching the existing retry-exhaustion path.

Fixes #6249
2026-07-22 02:29:05 +00:00
roboomp 27b0d1722b fix(tui): locked plan review overlay after a choice commits
The fullscreen Plan Review overlay stayed mounted, focused, and fully
interactive after a choice was picked. showPlanReview's finish() resolves
the choice promise but deliberately defers the hide until #approvePlan
(guarded for #5688/#5319/#5689), so during slow async approval work — e.g.
context compaction — arrow keys still moved the cursor and repeat
Enter/Esc were silently swallowed by the settle guard, with the
fullscreen buffer masking all progress underneath. Users on Ghostty and
macOS Terminal read this as "/plan is frozen".

The overlay now flips to a committed state the moment a choice fires:
handleInput is a no-op, and the render shows a "<choice> — submitting…"
indicator plus an "applying your selection" footer. The deferred-hide
timing is untouched, so the existing stale-buffer and focus guards stay
intact.

Fixes #5926
2026-07-21 22:21:35 +00:00
roboomp ee9c08a5c1 fix(session): log provider turn errors at warn with error fields
The agent_end handler only recorded stopReason/provider/model at debug and dropped errorMessage/errorStatus/errorId, so a session dying repeatedly on provider stream failures left no actionable trace in the main log. Extract logProviderTurnError and emit one warn-level entry carrying provider, model, errorMessage, errorStatus, and errorId when a turn ends in stopReason:error.

Fixes #6177
2026-07-21 22:06:57 +00:00