Commit Graph

80379 Commits

Author SHA1 Message Date
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
Peter Steinberger 30af09b8e3 fix(models): reject unknown providers when setting a default model (#125558)
* fix(models): reject unknown providers when setting a default model

`openclaw models set` validated only the provider/model syntax, so a
nonexistent provider was written to config with a success message while
config validate, doctor, models status and gateway startup all stayed silent.
An unknown provider now fails without changing config; an unknown model under
a known provider still saves with a warning, since the local catalog can lag a
newly released or self-hosted model. Doctor reports refs already in config.

* fix(models): avoid shadowing the repair warning and the map spread
2026-08-17 21:15:45 -07:00
Peter Steinberger 90526f3a9c fix(ui): stop composer mic hover shift and stray red hover (#125565)
* fix(ui): stop composer mic hover shift and stray red hover

The device-picker chevron collapsed to width 0 while idle and grew to
20px on hover, shoving the right-aligned mic button 20px left under
the cursor on every mouse-over. Detach the picker into its own
fixed-width ghost button beside the mic instead of morphing the mic's
shape into a split pill; hover only fades the picker's opacity, so the
reserved layout never shifts.

Also fixes the mic showing the send button's loud accent-red hover in
dark/openknot themes: those themes overrode .chat-send-btn:hover
directly, which outranked every variant's own hover rule (including
the intentional neutral mic hover and the stop button's danger hover).
Theme overrides now set a --chat-send-hover-background variable that
each variant's hover rule can still take precedence over.

* chore(scripts): register composer mic hover proof script

Missing package.json entry made the deadcode full-tree scan flag the
new capture script as an unused file, same as the existing
ui:proof:workboard sibling.
2026-08-17 21:09:17 -07:00
Peter Steinberger 6611e409d0 test(ui): cover discussion cold-open without URL (#125498) 2026-08-17 21:08:39 -07:00
Peter Steinberger d2be70d36c fix(agents): preserve exec outcomes across lifecycle races (#125532)
* fix(agents): preserve exec outcomes across lifecycle races

Detached Gateway follow-up failures no longer escape after dispatch, and sandbox finalization cannot be falsely backgrounded.

Related: #125529

* fix(agents): own detached approval failures

* style(agents): format approval continuation
2026-08-17 21:08:15 -07:00
SunnyShu 79095b5a3f fix(sessions): bound store lookup to stop gateway CPU wedge without dropping retired stores (#124516)
* fix(sessions): bound store lookup to stop gateway CPU wedge without dropping retired stores

* fix(sessions): finish bounded retired store resolution

Path-derived ownership now avoids irrelevant registry filesystem identity matching while preserving unreadable and ambiguous registry semantics and cross-root retired-store visibility.

Co-authored-by: SunnyShu0925 <shu.zongyu@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-17 21:08:04 -07:00
Peter Steinberger 33e2e6b0f9 fix(ui): show session hovercards for every sidebar row beside the rail (#125563)
* fix(ui): show session hovercards for every sidebar row beside the rail

Sidebar session rows were excluded from session-link hovercards, so only
the Home (main) row showed a card, and it overlaid the sidebar itself.
Hovercards now open for all sidebar session rows and position to the
right of the sidebar so navigation stays visible.

* fix(ui): yield sidebar previews to active progress hovercards

Sidebar rows already open a progress hovercard when the session has an
active progress card; the new preview card stacked on top of it. The
preview now probes the shared progress-card store (deduped with the
progress provider's own load) and opens only when the row has none.
2026-08-17 21:06:41 -07:00
Peter Steinberger b7ccf62fbd fix(voice-call): keep Funnel off occupied HTTPS ports (#125552)
* fix(voice-call): support alternate Tailscale HTTPS ports

* refactor(voice-call): keep Tailscale DNS lookup private

* fix(voice-call): preserve config normalization contract
2026-08-17 21:04:17 -07:00
Vyctor H. Brzezowski c75d4dc911 improve(ui): align chat branch and PR rows (#125232)
* improve(ui): align chat branch and PR rows

* improve(ui): collapse absent PR number slot

* improve(ui): give Create PR a neutral chip surface

* improve(ui): rebalance merged PR row contrast

* improve(ui): use standard squircle for PR rows

* fix(ui): consolidate static PR link styling
2026-08-17 20:52:00 -07:00
Peter Steinberger aa2d3df8e6 test(ui): wait for persisted new-session drafts (#125548) 2026-08-17 20:49:32 -07:00
Peter Steinberger 8df3debf89 fix: clean up orphaned media attachments (#125560) 2026-08-17 20:48:45 -07:00
Ayaan Zaidi 8575ead129 fix(ui): show skill mentions in the new-session composer (#125554)
The /new page renders its own composer, which never wired the `$skill` mention menu owned by the chat composer, so typing `$` there did nothing while /chat offered completions. Narrow the skill-menu module to a small host contract shared by both composers, drive it from the new-session textarea, and refresh commands.list on the first `$`. Also moves `paneDomId` to the composer DOM helpers to break a types→skill-menu→slash-menu→state import cycle.
2026-08-18 03:48:37 +00:00
Peter Steinberger ba3599627c perf(gateway): prepare provider usage runtime (#125520)
* perf(gateway): prepare provider usage runtime

* fix(gateway): keep provider usage internals private
2026-08-17 20:47:29 -07:00
Peter Steinberger 7242074ecc fix(memory): prevent silent context loss in resets and search (#125534)
* fix(memory): record transcript capture failures

* fix(memory): backfill filtered search results
2026-08-17 20:46:52 -07:00
Peter Steinberger bc9c3a4ad8 fix(tts): classify real transport timeouts as timeouts (#125530)
TTS attempt records only recognized err.name === 'AbortError' as a
timeout, but the shared transport names its abort 'TimeoutError'
(fetch-timeout.ts) and provider operation deadlines throw plain Errors
ending in 'timed out'. Every real HTTP provider timeout was therefore
recorded as reasonCode 'provider_error', dead-ending diagnosis in
/tts status and telemetry — the timeout classifier was dead code.

Recognize all three shapes via one helper shared by the reason code
and the formatted error text. The existing classification test crafted
an AbortError by hand, green-lighting the misclassification; it now
uses the real TimeoutError transport shape.
2026-08-17 20:43:12 -07:00
Peter Steinberger ebac731352 fix(google-meet): classify gateway CLI fallback with typed guards instead of message matching (#125495)
* fix(google-meet): classify gateway CLI fallback with typed guards instead of message matching

Replaces the message-substring classifier in the Meet CLI's
gateway-unavailable local fallback with the structural
isGatewayTransportError/isGatewayClientRequestError guards (seam shared
verbatim with #125458). Decision surface chosen per Meet semantics:
uncoded transport closes (unreachable sockets, now incl. ETIMEDOUT/
ENETUNREACH) fall back; coded closes incl. 1006 deliberately do not,
since a live gateway may still own Meet browser sessions; unknown-method
fallback stays but requires a structural gateway request error. Adds
ECONNRESET to GATEWAY_UNREACHABLE_SOCKET_CODES so connect-time resets
wrap into the typed unreachable error instead of escaping raw.

* test(process): treat Linux zombies as terminated
2026-08-17 20:40:46 -07:00
Peter Steinberger 1acabe40a9 feat(voice-call): let realtime agents end calls (#125525) 2026-08-17 20:39:13 -07:00
Peter Steinberger a0c5937fd1 fix(ui): restore full chat history after cached layout changes (#125536)
Cached Control UI transcripts no longer show a large blank region or hide earlier loaded messages after layout/transcript-shape changes.

Closes #125533
2026-08-17 20:33:05 -07:00
Peter Steinberger de41c7de8c fix(scripts): release the PR operation lock when review-init metadata fails (#125547)
The lock auto-releases only while the pre-side-effect validation marker is active; review_init marked side effects before the read-only metadata fetch, so a transient GitHub failure retained the lock and forced a lock-recover loop. The read-only fetch now runs before the marker.
2026-08-17 20:26:20 -07:00
Peter Steinberger 4ed01969e8 refactor(agents): unify exec approval wait outcomes (#125524)
* refactor(agents): unify exec approval wait outcomes

* docs(plan): record approval wait cleanup
2026-08-17 20:23:10 -07:00
Peter Steinberger 974a52f64f refactor(ui): deduplicate session menus and hovercards (#125478)
* refactor(ui): share session menu and hovercard mechanics

* test(ui): align fixtures with gateway hello contract

* fix(ui): close session access and focus gaps

* test(ui): advertise sidebar custodian method

* refactor(ui): split chat pane layout rendering

* fix(ui): align rebased chat render checks
2026-08-17 20:15:04 -07:00
Peter Steinberger e859f2bab3 fix(ui): restore task suggestion checks (#125538) 2026-08-17 20:10:01 -07:00
Peter Steinberger b66845607a fix: bind discovered conversations after threaded activity (#125514) 2026-08-17 20:09:04 -07:00
Peter Steinberger 72243fbef0 perf(doctor): batch transcript migration checkpoints (#125510)
Amp-Thread-ID: https://ampcode.com/threads/T-01a00a6a-b64e-74a5-8b15-2d3b966a468d

Co-authored-by: Amp <amp@ampcode.com>
2026-08-17 19:59:03 -07:00
Shakker aa8be5acf9 fix: correct setup provider drift diagnostics (#125523)
Stop reporting metadata-only setup provider descriptors as missing runtime registrations while preserving genuine provider, CLI, loading, and registration diagnostics.

Fixes #125506.
2026-08-18 03:54:47 +01:00
Jesse Merhi a928da457f Show worktree option only for Git group folders (#125280)
* feat(ui): show worktrees only for Git group folders

* feat(ui): enrich group environment picker

* fix(ui): preserve worktree defaults on probe errors

* fix(ui): reject stale group repository probes

* test(ui): type repository inspection helper
2026-08-17 19:50:15 -07:00
Peter Steinberger 41c0818751 fix(openai): prevent realtime barge-in truncation errors (#125502)
* fix(openai): clamp realtime barge-in truncation

Clamp OpenAI Realtime barge-in truncation to the audio duration produced for each assistant item. This prevents interruption failures observed live when 3,700 ms of decoded audio was paired with a 3,760 ms transport-clock timestamp.

* fix(openai): propagate PCM sideband audio format

The browser sideband negotiated PCM16, but its bridge defaulted to G.711 for duration accounting. Propagate the negotiated format so truncation uses the actual PCM duration and closes ClawSweeper's in-scope finding.
2026-08-17 19:29:50 -07:00