Commit Graph

81255 Commits

Author SHA1 Message Date
Peter Steinberger 47af5a0960 fix(doctor): point legacy model refs at doctor --fix (#125660)
The model-reference check told operators to install a plugin or configure
models.providers for a retired provider like openai-codex, which would
recreate a route the architecture deliberately removed, while doctor --fix
already migrates the ref losslessly. Ask the migration owner whether it would
rewrite the ref and, when it would, name the target and the repair command.
2026-08-17 23:46:24 -07:00
Peter Steinberger d69f0aaaeb fix: allow direct sessions in non-Git projects (#125657)
Restore direct project sessions regressed by registered-project placement. Git remains required for managed worktrees, while direct sessions validate only that the project directory is available.

Refs #112242
2026-08-17 23:45:18 -07:00
Peter Steinberger 1cf7ec90d0 fix(doctor): classify critical disk exhaustion as error (#125644)
Doctor's human output labels less than 100 MB free as CRITICAL because config,
session, and log writes may fail silently and lose data. The structured lint
finding still used warning, so --severity-min error filtered it out, returned
ok=true, and exited successfully. Share the threshold decision between the
structured severity and requirement: critical is error, low space remains
warning. Update the regression contract accordingly.
2026-08-17 23:43:29 -07:00
Peter Steinberger 561effac2e docs(apps): time-box the progress-card legacy plan fallback to 2026-10-18 (#125643)
The stream:"plan" fallback on both native platforms is deliberate compatibility
debt with a fixed expiry, not a permanent contract. Record the sunset date, point
each platform at its twin and at the tracking issue, and correct the Android note
to v2026.8.x (the newest released tag also lacks progressCard.get).

Refs #125639
2026-08-17 23:38:55 -07:00
Vyctor H. Brzezowski 540ea124e0 improve(ui): redesign tool calls as lightweight transcript activity (#125240)
* improve(ui): flatten transcript tool activity

* improve(ui): complete tool activity redesign

* improve(ui): normalize activity row typography

* improve(ui): unify activity typography contract

* improve(ui): standardize all activity row text

* improve(ui): increase activity text size

* improve(ui): underline activity filenames

* improve(ui): tighten activity row spacing

* improve(ui): standardize activity chevrons

* improve(ui): reveal child chevrons on interaction

* improve(ui): retain active child chevrons

* improve(ui): space expanded child tools

* improve(ui): remove idle activity fade and gap

* fix(ui): preserve tool activity contracts

* fix(ui): simplify activity basename lookup

* fix(ui): preserve canonical tool row actions

* fix(ui): record tool outcomes and repair transcript row regressions

Neutral collapsed rows are the design, but this branch left failures with
nowhere to land and shipped chrome whose styles it had already deleted.

- Expanded standalone tool messages close with the outcome line, so an inline
  rows shape still reports the failure instead of dropping it.
- Progress-card receipts drop the badge and the spinner: this branch removed
  both styles, leaving a 0x0 invisible running indicator, and the receipt
  label already names the state.
- Single delete patches are non-navigable; their workspace target is gone, so
  the file action could only ever fail to load.
- Flush command padding derives from the action-button size instead of a stale
  42px constant, and the running text wave covers command rows again.
- Activity lane returns to the tool-shell column width the rule claims.
- Drop CSS nothing references: tool-card tabs, empty, plain-output, activity
  scroll masks, secondary command text.
- renderToolDataBlock takes an optional label instead of comparing copy.
- Split the oversized tool-card test file and refresh stale row assertions.

* fix(ui): fold the tool action size into the card header rule

Stylelint no-duplicate-selectors rejects the separate .chat-tool-card__header
block; the custom property belongs in the existing rule.

---------

Co-authored-by: RoboClaw <309084314+roboclaw-bot@users.noreply.github.com>
2026-08-18 03:36:43 -03:00
Hannes Rudolph 34c3d15a6b fix(macos): complete Codex onboarding and model picker (#124829)
* fix(setup): refresh Codex registry with staged install

* fix(macos): verify inference before onboarding handoff

* fix(setup): use native Codex home for subscription auth

* fix(codex): honor attempt-scoped setup config

* fix(macos): align onboarding handoff with reopen

* fix(setup): await prepared model convergence

* fix(ui): avoid false auth state for empty catalog

* fix(setup): scope catalog convergence to Codex gateway

* fix(setup): publish the committed runtime catalog

* fix(models): project configured static runtime models

* fix(codex): expose app-server model catalog

* fix(models): preserve Codex auth across reloads

* fix(ci): align Codex onboarding checks

* test(ui): stabilize dock suppression environment

* fix(codex): honor discovery config in app-server model catalog

The manifest documents discovery.enabled (bundled fallback list) and
discovery.timeoutMs (default 2500ms) for model discovery; the new catalog
path used the generic 60s request timeout and ignored the enable gate.
Also drop the test-only listModels injection seam in favor of vi.mock.

* fix(setup): refuse prepared Codex auth over an explicit remote transport

configureCodexCliPreparedAuth silently rewrote an explicitly configured
websocket/unix app-server to local stdio (keeping a dangling url), moving
the credential boundary onto this host. Fail setup with actionable
guidance instead; also surface the root cause when the prepared model
catalog refresh fails after activation.

* refactor(agents): one canonical model-catalog identity key

Three near-identical key helpers existed (models-list-result,
models-list-configured-static, harness/model-catalog). Export
resolveModelCatalogIdentityKey from the route-policy owner, collapse the
duplicate dedupe loops into dedupeByKey, make donor enrichment Map-based,
and inline the one-off harness-augment wrapper.

* fix(macos): restore custodian handoff for fresh activations

Landing every finish on the plain dashboard stranded the custodian
first-run flow (memory import, channels, permissions, hatch). Fresh
activations now hand off to custodian onboarding; live-verified
pre-existing setups reopen the normal dashboard, matching the removed
already-configured shortcut. Tests pin the destination per path.

Also isolate the post-startup Codex login test from developer machines:
ambient OPENAI_API_KEY and a real Codex login made it assert-fail.

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-17 23:31:12 -07:00
Jacqueline Henriksen 72c227c7cc fix(llama): support embedding-only managed servers (#125383)
* fix(llama): support embedding-only managed servers

* docs(llama): describe embedding-only setup

* fix(llama): remove unused model reference export

* fix(llama-cpp): keep guided setup chat-capable

---------

Co-authored-by: Patrick Erichsen <patrick.a.erichsen@gmail.com>
2026-08-17 23:29:43 -07:00
Alix-007 cc6b9470ac fix(browser): prepare direct relay shutdown (#125176) 2026-08-18 02:27:34 -04:00
Peter Steinberger 20199d7e72 fix(ui): coalesce device refreshes during active loads (#125627)
* fix(ui): coalesce device refreshes during active loads

Nodes and device list loaders dropped every refresh request received while a
previous list RPC was in flight. A successful approve, reject, removal, token
mutation, or Gateway resolved event could therefore be overwritten by the old
pre-mutation response and remain stale until the next poll.

Record one closed pending refresh mode per list owner. When the current request
settles, immediately run the coalesced refresh, preserving whether any queued
caller requested visible error handling. Add order-faithful node and device
regressions that fail when the follow-up list request is dropped.

* test(ui): initialize queued device refresh state
2026-08-17 23:25:22 -07:00
Peter Steinberger 1c3e512096 fix(gateway): preserve chat metadata across UI prefs (#125636) 2026-08-17 23:00:41 -07:00
Vyctor H. Brzezowski 52eb013330 feat(ui): unify fenced code block visual styling (#125249)
* feat(ui): unify fenced code block styling

* fix(ui): preserve fenced code copy icon

* fix(ui): refine unified fenced code visuals

* fix(ui): increase code fence squircle radius

* fix(ui): inset fence scrolling and add edge fade

* fix(ui): fade overflowing code without surface color

* fix(ui): update code overflow fades by scroll position

* fix(ui): preserve transcript scroll handler with fence fades

* fix(ui): initialize code overflow fades after render

* fix(ui): align JSON tree hierarchy with reference

* fix(ui): remove transcript bullets from JSON tree

* fix(ui): preserve fenced code contracts

* test(ui): align fenced code feedback contracts

* fix(ui): remove fenced code overflow lifecycle

* fix(ui): preserve compact JSON disclosure

* fix(ui): preserve shared fence variants

* fix(ui): address fenced code review findings

---------

Co-authored-by: RoboClaw <309084314+roboclaw-bot@users.noreply.github.com>
2026-08-18 02:57:48 -03:00
Peter Steinberger b68d13a0f0 fix(memory): bound LanceDB prompts and reload embedding config (#125567)
* fix(memory): bound LanceDB recall and reload embeddings

* fix(memory): preserve LanceDB index identity
2026-08-17 22:55:20 -07:00
Peter Steinberger 7f4bc83ce7 refactor(gateway): use typed doctor close diagnostics (#125629) 2026-08-17 22:55:10 -07:00
Peter Steinberger 0d74bc21b0 fix: keep non-person principals out of session owners (#125579)
* fix: keep non-person principals out of session owners

* fix(sessions): preserve creator filter semantics
2026-08-17 22:55:01 -07:00
Peter Steinberger fc8eb59ab2 fix(sessions): release local claims after forced stop (#125614)
Forced embedded-run terminalization now settles the exact closure-bound local placement claim, preserving replacement fencing and allowing archive to drain.

Closes #125555
2026-08-17 22:54:16 -07:00
Peter Steinberger 2fa889d8b3 fix(state): preserve lazy placement column ownership (#125634) 2026-08-17 22:53:39 -07:00
Peter Steinberger ac7dbe4f83 improve(ui): show starter automations only for empty inventories (#125631) 2026-08-17 22:52:41 -07:00
Peter Steinberger 23bcaef0c1 fix: tools report terminal no-delivery outcomes (#125607)
* fix(tools): report terminal non-delivery outcomes

* fix(agents): prefer authoritative terminal replies

* fix(agents): short-circuit authoritative replies
2026-08-17 22:51:44 -07:00
Peter Steinberger b934625d80 fix(test): name Vitest unhandled errors instead of burying them (#125615)
* fix(test): surface Vitest unhandled errors

* fix(test): keep Vitest error helpers private
2026-08-17 22:49:19 -07:00
Peter Steinberger e5ffbe6800 fix(ui): stop session tooltips covering progress cards (#125594)
* fix(ui): stop session tooltips covering progress cards

* test(ui): align sidebar tooltip expectations

* fix(ui): remove restricted session row tooltip
2026-08-17 22:49:12 -07:00
AmAzing- fc2529e229 fix(docker): preserve importer-resolved runtime dependencies (#125580)
Resolve retained dependency closures from each physical importer so Docker pruning preserves concurrent nested package versions required at runtime.

Add importer-bound regressions and a post-prune grammY import gate.

Co-authored-by: AmAzing129 <115673583+AmAzing129@users.noreply.github.com>
Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-08-18 11:14:48 +05:30
Peter Steinberger 122fc1c786 fix(apps): render legacy plan events when the Gateway lacks the progress-card store (#125588)
* fix(apps): render legacy plan events when the Gateway lacks the progress-card store

progressCard.get ships in no released Gateway tag, so iOS/macOS on any current
release silently showed no status card after the durable-card migration. Restore
legacy stream:"plan" rendering, synthesized into the unified progress card and
gated on a tri-state capability probe so a dual-emitting Gateway never fights the
durable store. Mirrors the Android fix in #125444.

* fix(apps): invalidate progress-card capability on gateway route replacement

A replacement route may be a different Gateway, so a cached known-absent store
must not authorize the legacy plan fallback against a new Gateway that dual-emits
both sources. Clear and re-probe on .routeChanged.
2026-08-17 22:40:55 -07:00
Peter Steinberger 5d098cd36f fix: prefer representation-first progress cards (#125613) 2026-08-17 22:33:15 -07:00
Peter Steinberger 31afd52e99 refactor(realtime): share audio duration calculation (#125612)
Fix xAI barge-in truncation that reported 3760 ms after only 3700 ms of decoded audio.

Share exact audio-duration math across OpenAI, xAI, and Google while keeping provider-specific rounding at each caller.
2026-08-17 22:25:42 -07:00
Peter Steinberger db92131fe9 fix(gateway): allow write-scoped worktree creation (#125598) 2026-08-17 22:24:50 -07:00
Josh Lehman c5c8a1e4c0 fix(skills): resolve GitHub identity from auth (#125481) 2026-08-17 22:21:33 -07:00
Ayaan Zaidi dfcef3a28f fix: Claude CLI subagent thinking and tool calls leak into the parent turn (#125621)
Claude Code forwards Agent-tool subagent records with parent_tool_use_id set; the streaming parser treated them as parent records, so subagent thinking streamed as the assistant's reasoning and subagent tool calls surfaced as unattributed top-level tool events. Gate the thinking/tool dispatchers and assistant-snapshot path on one shared isClaudeSubagentRecord guard.

Also read Claude result errors[] (skipping [ede_diagnostic] telemetry) for every error result instead of reporting only the subtype name.

Fixture: live Claude Code 2.1.234 stream-json capture with a background Explore subagent. Telegram E2E on the claude-cli backend shows the progress draft with only the parent Agent row.
2026-08-18 10:51:18 +05:30
Peter Steinberger 3daf60adda test(ui): restore synthetic window globals (#125616) 2026-08-17 22:21:02 -07:00
Vyctor H. Brzezowski cbe3116e14 feat(ui): add Markdown table interactions (#125245)
* feat(ui): add Markdown table interactions

* fix(ui): scope table interactions to transcripts

* fix(ui): complete table interaction contracts

* chore: refresh PR head

* fix(ui): satisfy table interaction gates

---------

Co-authored-by: RoboClaw <309084314+roboclaw-bot@users.noreply.github.com>
2026-08-17 22:20:32 -07:00
Vyctor H. Brzezowski e97b42a43a fix(ui): show users typing in the transcript (#125244)
* fix(ui): move typing status into transcript

* fix(ui): complete transcript typing lifecycle

* fix(ui): finish transcript typing presentation

* fix(ui): refine typing bubble tail

* fix(ui): complete transcript typing invariants

* fix(ui): satisfy transcript typing gates

* fix(ui): keep typing presence ownership bounded

* fix(ui): keep typing presence dependencies private

---------

Co-authored-by: RoboClaw <309084314+roboclaw-bot@users.noreply.github.com>
2026-08-17 22:19:37 -07:00
Peter Steinberger 2eec047065 fix(mcp): explain an empty probe instead of printing a bare header (#125611)
With no servers configured, mcp probe emitted only its header line and exited
0, while mcp list and mcp doctor both name the condition and the command that
fixes it. Short-circuit the human path with the same guidance and skip building
a runtime for zero servers; JSON output keeps its existing empty envelope.
2026-08-17 22:15:44 -07:00
Peter Steinberger bbf7454b17 fix(codex): retain structured tool result details (#125610) 2026-08-17 22:13:33 -07:00
Vitor Cepeda Lopes 241911c42c fix(doctor): open audit recovery files writable before fsync (#123376)
Co-authored-by: TheAngryPit <16145902+TheAngryPit@users.noreply.github.com>
2026-08-17 22:08:17 -07:00
Peter Steinberger 69a0f2d0ff fix(browser): keep screenshot sharing hints capability-neutral (#125597)
Browser screenshot results always named the message tool even when policy had
removed it from the model's effective tool surface. Report the staged sanitized
outbound copy and its path without naming another independently gated tool, so
the result remains actionable without becoming hallucination bait. Update the
vision, fallback, and raw-image result tests to protect that contract.
2026-08-17 22:07:17 -07:00
Peter Steinberger e6a427c493 perf(ui): defer offscreen plugin row rendering (#125585)
Amp-Thread-ID: https://ampcode.com/threads/T-01a01277-59ee-703a-b04d-927a3ba733a1

Co-authored-by: Amp <amp@ampcode.com>
2026-08-17 21:50:54 -07:00
Peter Steinberger 7fc3371eac fix(codex): enforce hosted search domains for web fetch (#125574)
* fix(codex): apply hosted search domains to web fetch

* fix(net): preserve allowlist error wording

* fix(codex): enforce search domains in side questions
2026-08-17 21:49:35 -07:00
Peter Steinberger e7c55ec27d fix(agents): warn when session search results are incomplete (#125582)
Transcript search excludes sessions whose indexes are rebuilding and already
returns indexing=true, but the model-facing tool gave no guidance that its
results were incomplete. Add a bounded warning telling the model to retry
sessions_search shortly, and cover the exact result contract with a regression
test that fails on the previous behavior.
2026-08-17 21:47:20 -07:00
Josh Avant 916aca13f3 feat: record subagent execution lineage (#122015)
* feat(audit): record subagent execution lineage

* fix(audit): type-check spawn lineage validation

* docs: preserve spawned-run lineage invariants

* fix(audit): preserve lineage for worker spawns

* fix(audit): bind worker lineage to live authority

* fix(audit): keep lineage carrier private

* fix(sessions): preserve ACP participant recording

* fix(audit): keep lineage out of runtime bearer

* fix(audit): keep lineage type private

* test(audit): match current worker claim shape

* test(audit): preserve readonly lineage result

* fix(audit): redeem spawn lineage privately

* fix(audit): preserve lineage redemption on copy

* test(audit): prove nested worker spawn lineage

* fix(audit): restore execution identity CI gates
2026-08-17 21:41:30 -07:00
Peter Steinberger 603b0ec7f5 fix(macos): avoid elevation codesign metadata SIGPIPE (#125487)
* fix(macos): avoid elevation codesign metadata SIGPIPE

* fix(macos): preserve codesign metadata failures
2026-08-17 21:40:38 -07:00
Peter Steinberger 9ba8671296 refactor(agents): unify exec approval routing (#125587)
* refactor(agents): unify exec approval routing

* docs(plan): record approval route cleanup
2026-08-17 21:40:31 -07:00
Peter Steinberger f007b0f7a8 perf(ui): paginate grouped sessions (#125572)
Amp-Thread-ID: https://ampcode.com/threads/T-01a01277-59ee-703a-b04d-927a3ba733a1

Co-authored-by: Amp <amp@ampcode.com>
2026-08-18 04:38:57 +00:00
Peter Steinberger 1cf8ea446d fix(mcp): prevent stale catalogs and silent tool failures (#125564)
* fix(mcp): harden lifecycle and result integrity

* fix(mcp): bound catalog invalidation replay

* test(mcp): stabilize process cleanup proof
2026-08-17 21:37:12 -07:00
Peter Steinberger 0776c4680a fix(ui): stop restart errors from masquerading as model auth (#125513)
* fix(ui): distinguish model catalog freshness errors

* test(ui): cover refreshed configured model load

* fix(ui): wait for fresh model catalogs before auth gating

* fix(ui): import pane ids from composer owner
2026-08-17 21:35:49 -07:00
Peter Steinberger ca8bd59df5 improve(ui): reduce startup stylesheet size (#125539)
* perf(ui): lazy-load settings workspace styles

Amp-Thread-ID: https://ampcode.com/threads/T-01a01277-59ee-703a-b04d-927a3ba733a1

* fix(ui): keep picker styles route scoped

Amp-Thread-ID: https://ampcode.com/threads/T-01a01277-59ee-703a-b04d-927a3ba733a1

---------

Co-authored-by: Amp <amp@ampcode.com>
2026-08-17 21:32:46 -07:00
Peter Steinberger d9b69c5b6f fix(agents): keep model resolution on one plugin generation (#125569)
* fix(agents): pin model resolution to prepared generation

* test(agents): complete prepared runtime fixture
2026-08-17 21:32:37 -07:00
Peter Steinberger 3ab27a2900 fix(cli): exit non-zero when an agent turn fails (#125557)
The gateway-routed path already mapped terminal run status to an exit code,
but the local embedded path did not, so a failed turn exited 0 while its own
JSON envelope reported status "error". Route both through the canonical
agent-run terminal outcome, and fail closed on an unrecognized status since
the gateway response carries an open string.
2026-08-17 21:31:25 -07:00
Ayaan Zaidi c198f8aba4 fix(state): register placement move target_machine_class as additive column (#125583)
worker_session_placement_moves.target_machine_class was in the canonical state schema and the feature lazy ensureColumn path but not in CLAW_LAZY_ADDITIVE_STATE_COLUMN_DEFINITIONS, so a global state DB that already had the lazily-created table failed the strict startup schema check (column definitions differ) and the gateway crash-looped. Register it as lazy-additive so startup repair adds the column in place, like the sibling worker_session_placements entries.
2026-08-18 10:00:45 +05:30
Peter Steinberger 9de3ca5fc9 test(upgrade): add high-volume SQLite survivor (#125571)
Amp-Thread-ID: https://ampcode.com/threads/T-01a00a6a-b64e-74a5-8b15-2d3b966a468d

Co-authored-by: Amp <amp@ampcode.com>
2026-08-17 21:19:24 -07:00
Peter Steinberger 01eec285d9 fix(cli): render gateway transport failures as expected conditions (#125556)
* fix(cli): render gateway transport failures as expected conditions

An unreachable gateway is an expected, recoverable operator condition, but
only the devices command family surfaced it through the root failure handler,
where it rendered as "The CLI command failed" with debug hints. Extract
GatewayTransportError into its own module so the failure renderer can classify
it without importing the transport stack, and treat it as an expected CLI
error alongside missing credentials.

* fix(gateway): import the transport error kind used by the JSON shape

* test(cli): extract the process-test gateway harness

The new devices coverage pushed gateway-backed-exit.process.test.ts past the
max-lines budget, and that file is not in the ratchet baseline. Move the mock
Gateway servers into a sibling test-helpers module instead of suppressing the
rule.
2026-08-17 21:18:02 -07:00
Peter Steinberger 7e7b860bca fix: preserve message delivery after result middleware (#125497)
* fix(agents): carry typed message delivery receipts

* fix(agents): preserve receipts across harness middleware

* fix(agents): preserve plugin broadcast delivery receipts

* fix(agents): preserve partial broadcast delivery receipts
2026-08-17 21:16:14 -07:00