Commit Graph

79437 Commits

Author SHA1 Message Date
Peter Steinberger 85eb4dc10d fix(agents): expose Skill Workshop evaluation results immediately (#123994)
* fix(agents): surface skill evaluator outcomes

* fix(agents): return evaluator details directly

* fix(agents): stabilize evaluator projection

* fix(agents): use normalization core serializer export
2026-08-14 21:28:57 -07:00
Peter Steinberger e530b58b44 fix(agents): continue after timeout compaction (#124000) 2026-08-14 21:26:59 -07:00
Vyctor H. Brzezowski 9837ad59fa fix(ui): keep the GitHub mark on its label's line when chat wraps (#123355)
* fix(ui): keep the GitHub mark on its label's line when chat wraps

The mark is an in-flow atomic inline, which carries a soft wrap opportunity
after it, so a chat line could end on the octocat and start the next one with
the reference it labels. Painting the mark out of flow and reserving its space
with the anchor's own padding removes that opportunity: nothing inside the
anchor precedes the label any more.

The anchor stays inline, so a long bare URL still fills the line it starts on
instead of moving down whole -- the sibling file-link chip's atomic treatment
could not be reused here.

* test(ui): route GitHub link layout test through Node
2026-08-15 01:26:30 -03:00
Peter Steinberger 289c31ad73 fix(cli): exit non-zero when skills info misses (#123997) 2026-08-14 21:22:57 -07:00
TUARAN d30c036b68 fix(channels): bound errored ingress settlements (#120104)
Route error-bearing fan-in abandonment through the existing failure policy so deterministic pre-adoption failures cannot exceed retry limits and starve same-lane messages.

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-14 21:17:17 -07:00
Peter Steinberger 5bbbdcb223 fix(gateway): stamp targeted event frames on the per-client sequence (#123999)
broadcastToConnIds sent frames without a seq, so a slow-consumer drop
between targeted sends (session.message, talk, pairing, PR-subscription
events) was invisible to the client's gap detector — the stream just got
thinner with no recovery trigger. Targeted frames now consume and carry
the same per-client sequence as fanout frames; the protocol already
treats seq as optional-but-monotonic, so older clients ignore it and
current clients gain gap-triggered recovery for targeted paths.
2026-08-14 21:16:45 -07:00
Peter Steinberger 622eec9c36 fix(ui): stage every gateway-honored agent model shape instead of silently dropping input (#123995)
The agents-page fallback editor gated staging on a resolvable primary
model, but the gateway resolver honors { fallbacks } with no primary
(agent-scope.ts, including the explicit empty-array-disables-global
contract). With a fully implicit default model, typing a fallback chip
cleared the input and staged nothing — no chip, no error, no write.
Clearing the primary had the sibling bug: removeFormValue deleted the
whole model node including authored agent fallbacks.

One stageModelShape owner now writes the smallest representable shape
(bare string, { primary, fallbacks }, { fallbacks }, or removal), and
both entry points share existingModelParts instead of duplicating
existing-shape probing.
2026-08-14 21:14:50 -07:00
Peter Steinberger ed5e489633 perf(ci): widen ui-e2e to 12 shards, ride Blacksmith Windows on hybrid, overlap built-runtime verifiers
Three measured cuts toward the sub-4-minute wall:

- checks-ui-e2e hosted-planner matrix 10 -> 12 rows (11 Vitest shards +
  browser-extension). Shard 1 measured 230s with ~123s test body; Vitest
  hash sharding leaves count as the only balance lever.
- checks-windows hybrid attempt 1 now rides blacksmith-8vcpu-windows-2025
  (retries stay hosted windows-2025). The 3-part hosted split measured a
  342s pole on full-graph runs.
- build-artifacts folds the Doctor plugin-index proof (12s), singleton
  smoke, and startup-memory check (7s) into one step that overlaps them
  on Blacksmith and stays serial on hosted 4-core so the RSS measurement
  is unperturbed; any missing startup asset rebuild completes before the
  fork so no verifier reads dist mid-write.
2026-08-14 21:12:05 -07:00
Peter Steinberger 8739432d4c fix(ui,gateway): single attachment admission funnel + WS-frame-budget clamp on advertised ceiling (#123977)
* fix(ui,gateway): make attachment admission one funnel and clamp advertised ceiling to the WS frame budget

Three residual gaps from the #123654 size-limit fix shared one root cause:
attachment admission policy was scattered instead of owned.

- hello-ok advertised the decoded config ceiling (20MB default, higher with
  mediaMaxMb) without accounting for base64 4/3 expansion against the 25MiB
  WS frame cap, so a 19.6-20MB attachment passed the client guard and the
  encoded chat.send frame still hard-dropped the connection (1009) for
  every pane. The policy owner now clamps the advertised maxBytes to what
  one frame can carry.
- Large-text paste, data-URL image paste, and browser-annotation handoff
  constructed attachments without any size check, bypassing the guard that
  only lived inline in appendAttachmentFiles. All intake paths now share
  one admission funnel (chat-attachment-admission.ts).
- Zero-byte files rendered a normal chip, then the payload assembler
  silently dropped them on send; the funnel rejects them at intake with a
  named toast.

* refactor(ui): drop unused exported type from attachment admission module
2026-08-14 21:10:48 -07:00
Peter Steinberger e26bae5b2a fix(xai): fence cancelled x_search cache writes (#123996)
Prevent a completed standalone x_search request from building or caching a result after caller cancellation. Preserve the exact abort reason and force identical retries back through the provider request path.\n\nFixes #123964
2026-08-14 21:10:10 -07:00
Peter Steinberger 4e64649191 fix(ui): stop per-event full-history reconciles for queued sends behind an active run (#123966)
resumeStoredChatOutboxes runs on every session.message/sessions.changed
event; a never-attempted durable head parked behind an active run issued a
1000-message chat.history request per transcript event only to learn the
run was still active. The session row the wakeup event itself reconciled
already answers that question, so consult it first and keep the history
fetch for attempted rows whose delivered-detection genuinely needs it.
2026-08-14 21:08:42 -07:00
Peter Steinberger a32a7ae9af feat(cua-computer): verify the managed driver artifact on Windows and Linux node hosts (#123986) 2026-08-14 21:08:13 -07:00
Peter Steinberger 05c64cb39c fix(macos): keep replacement node worker active after stale exit (#123969)
* fix(macos): fence stale node worker exit events

* test(macos): synchronize stale worker exit regression

* refactor(macos): unify node worker generation identity
2026-08-14 21:06:57 -07:00
Vyctor H. Brzezowski 9955b70211 fix(ui): toggle terminal main content layout (#122464) 2026-08-15 01:06:54 -03:00
Peter Steinberger 45a5757692 fix(gateway): publish approval timeout expiry to reviewer surfaces (#123950)
* fix(gateway): publish approval timeout expiry to reviewer surfaces

Timer-driven timeout expiry was the only terminal approval transition never
published: forceDeny settles the durable row and local waiter, but no
exec/plugin.approval.resolved event fires, so every reviewer surface prunes
expired approvals on its own clock. With operator clock skew the web card
stays actionable after the gateway already denied (clicking Allow then
silently vanishes via the stale-conflict path), or actionable approvals are
pruned early. Add an onExpired manager hook and route it through the
existing pending-publication queue used by run-abort/authority-close, so
timeout publishes exactly like a resolve.

* test(gateway): move timeout-expiry publication coverage to a focused file

Main's growth pushed exec-approval-manager.test.ts past the counted
max-lines cap once the onExpired test landed on top; the focused sibling
file keeps the regression without a suppression.
2026-08-14 21:06:21 -07:00
Peter Steinberger d6e6d67adc fix(plugins): uninstall fully removes isolated npm plugin files (#123973)
* fix(plugins): remove isolated npm projects on uninstall

Ordinary uninstall now removes the whole owner-managed per-plugin npm project, including packed archives and transitive dependency debris, while shared roots and retained update generations keep their existing lifecycle behavior.

* fix(plugins): preserve failed install cleanup

Allow persistence-failure compensation to remove only a planner-validated isolated npm project root, while continuing to reject shared or ambiguous cleanup targets.
2026-08-14 21:03:12 -07:00
Peter Steinberger e4633cd58d test(cli): remove duplicate daemon build-id assertions (#123981)
* test(cli): remove duplicate daemon build-id assertions

* test(cli): cover daemon JSON metadata at output owner
2026-08-14 21:00:29 -07:00
Peter Steinberger 81e0cf0d1d test: replace ingress waits with stop barriers (#123990) 2026-08-14 20:59:52 -07:00
Peter Steinberger aa7a2fbe0d feat(cua-computer): browser action family over v2 (#123960)
* feat(cua-computer): add browser action family

* refactor(cua-computer): split browser action files

* refactor(cua-computer): move the shared act-params type to the leaf module

* fix(cua-computer): carry the contract params import with the moved type
2026-08-14 20:59:46 -07:00
Gio Della-Libera 103e1a4cc9 fix(claws): recover lifecycle state safely (#123254)
* fix(claws): preserve runtime lifecycle state

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 34377cd6-beac-4e49-8ab0-22cfaf8b54a5

* fix(claws): harden lifecycle reconciliation

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 34377cd6-beac-4e49-8ab0-22cfaf8b54a5

* fix(mcp): serialize ownership mutations

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 34377cd6-beac-4e49-8ab0-22cfaf8b54a5

* test(mcp): prove lifecycle lease ordering

* fix(claws): page cron recovery inventory

* fix(claws): fail closed on missing cron ownership

* refactor(claws): keep pending cron recovery unchanged

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Gio Della-Libera <235387111+giodl73-repo@users.noreply.github.com>
Copilot-Session: 34377cd6-beac-4e49-8ab0-22cfaf8b54a5
2026-08-14 20:52:45 -07:00
Peter Steinberger 53074ae91a feat(workers): install Gateway bundles on nodes (#123985)
* feat(workers): install Gateway bundles on nodes

Add a private paired-channel install command backed by a one-use Gateway HTTP capability, bounded archive validation, script-disabled dependency materialization, and atomic gateway-namespaced publication. Existing device provisioning remains on the local-build path until the next cutover slice.

* docs(runners): record node bundle installer
2026-08-14 20:52:39 -07:00
Peter Steinberger 295f2c0212 fix(ui): align the sidebar to a shared grid and dedupe owner presence (#123938)
* test(ui): add sidebar alignment capture harness

* fix(ui): align sidebar rows to shared grid

* fix(ui): distinguish sidebar owner presence

* fix(ui): visually hide sidebar pages label

* fix(ui): collapse the hidden pages head row

* fix(ui): keep the floating pages action clickable

* fix(ui): scope facepile dedup to the rendered lead and reveal the pages editor on touch

ClawSweeper P1s on #123938: the facepile unconditionally excluded the
session creator even when the lead chip showed the archivist or nothing
at all, hiding a live viewer; renderSessionLeadingState now returns the
rendered owner identity as the single dedup source. The hover-revealed
pages editor gains the standard hoverless-pointer visibility override.
2026-08-14 20:42:37 -07:00
Peter Steinberger 4f4cef66c5 fix(doctor): surface exporter diagnostic failures (#123971) 2026-08-14 20:41:28 -07:00
Peter Steinberger 52cf4db826 fix(synology-chat): prevent duplicate sends after custody loss (#123953)
* fix(synology-chat): preserve durable send custody

* fix(synology-chat): clean rejected media custody
2026-08-14 20:38:56 -07:00
Peter Steinberger 636fc94171 fix(ui): prevent stale session header errors after navigation (#123958)
* fix(ui): retire stale header outcomes

* test(ui): await retained pane presentation

* fix(ui): bind header outcomes to presentation lifetime
2026-08-14 20:38:40 -07:00
Peter Steinberger f827e784c9 fix(ui): retire companion state by lifecycle (#123941) 2026-08-14 20:33:52 -07:00
Peter Steinberger 2ebaebd484 fix(ui): re-attach chat transcript virtualizer after dashboard→split face switch (#123974)
* fix(ui): re-attach chat virtualizer when a foreign host re-stamps the transcript

Switching a board session from Dashboard back to Split left the docked chat
pane blank (sizer-height empty space, no rows) until an unrelated state change
re-rendered the pane or the user scrolled.

Root cause: the transcript template is stamped by openclaw-chat-sidebar-region
(it receives the chat template as a property and renders it in its own, later
update cycle), but the TanStack virtualizer only re-resolves its scroll element
inside the pane host's update. After the face-switch re-stamp no pane update
follows, so the virtualizer stayed detached: scrollElement null, scrollRect
zeroed by the hide transition, calculateRange null, zero rows painted.

Fix, at the owner (ChatSessionVirtualizerHost): attachment now follows the DOM
identity the scroll-element ref records — an identity change queues a microtask
that re-runs the virtualizer adapter's update hook. Zero-size rects from hide
transitions (display:none sidebar panels, unmount teardown) are ignored so they
can no longer wipe measured row heights or become the virtualizer viewport.

Live-verified against a remote gateway where the broken state persisted 5+
seconds pre-fix and one attachment sync healed it. Regression tests fail
pre-fix; e2e covers the deferred-latency dashboard->split flow.

* chore(ui): raise startup JS baseline for transcript virtualizer re-attach fix

Measured 333338 B gzip on PR #123974 run 31861214469 (+345 B over the base
run 31860496921 at 332993 B; prior baseline 332040 B predates recent main
drift). Absolute 350 KiB maintainer cap unchanged. Growth is the foreign-host
attachment sync in chat-transcript-controller.ts — real fix code, not
speculative surface.
2026-08-14 20:31:08 -07:00
Peter Steinberger aec8096bbc refactor(gateway): remove obsolete worker test seams (#123970) 2026-08-14 20:30:34 -07:00
Peter Steinberger 8e79622777 fix(web-search): fence cancelled provider cache writes (#123951) 2026-08-14 20:29:23 -07:00
Peter Steinberger 6ef6d4d466 fix(google-meet): preserve exports on write failure (#123959) 2026-08-14 20:28:59 -07:00
Jason (Json) e382fa7979 fix(codex): keep task lists active across compaction (#123921)
* fix(codex): restore plan state after compaction

* fix(codex): bound restored plan context
2026-08-14 21:27:42 -06:00
Peter Steinberger d612949ee6 perf(ci): ride hybrid 8 vCPU for the checks-ui browser suite
Run 31861511624 made checks-ui the UI-scoped wall pole (247s job, 177s body
on hosted 4-core even in hybrid). Attempt 1 now uses the 8 vCPU class like
the ui-e2e shards; retries stay hosted.
2026-08-14 20:27:03 -07:00
Jason (Json) c1002c3ec4 fix(ui): dismiss landed steer notices (#123908)
* fix(ui): retire landed steer notices

* fix(ui): preserve steer transcript order
2026-08-14 21:19:30 -06:00
Peter Steinberger 5760fcdae1 fix(ci): record 2026-08-15 Control UI startup JS growth in the budget baseline
Tonight's UI fix stream (stale-tab retry, session attention, talk
backpressure) consumed the 1 KiB tolerance and broke build-artifacts plus
both QA smoke ui:build paths on main (run 31861213699, 333309 B vs
332040+1024). Recorded with CI bytes per the checker contract; the 350 KiB
maintainer-approved ceiling still bounds cumulative creep.
2026-08-14 20:19:16 -07:00
Peter Steinberger 4ca63cb98a fix(gateway): fence worker dispatch modes (#123946) 2026-08-14 20:12:36 -07:00
Peter Steinberger 5e8350fb04 fix: report stopped LaunchAgents as stopped (#123961)
* fix(daemon): report stopped launch agents as stopped

* fix(daemon): uninstall stopped launch agents cleanly
2026-08-14 20:10:23 -07:00
Peter Steinberger c6bf10c27d perf(test): reuse Quicksilver peer module graph (#123947) 2026-08-14 20:08:23 -07:00
Jesse Merhi 47442197a1 feat(ui): review install policy warnings (#120900)
* feat(ui): review install policy warnings

* fix(ui): keep install feedback on runtime plugin
2026-08-15 13:07:02 +10:00
Peter Steinberger c1ddb706f6 refactor(gateway): move host-origin tests to admission owner (#123925)
* test(gateway): move host origin cases to admission owner

* test(gateway): preserve port-sensitive build admission cases
2026-08-14 19:54:58 -07:00
Peter Steinberger d29a25e987 fix(logging): stop double-writing root log records (#123936) 2026-08-14 19:54:39 -07:00
Peter Steinberger b99f7c3f74 test(gateway): cover status build ID absence (#123943) 2026-08-14 19:54:31 -07:00
Peter Steinberger d674907896 feat(computer-use): capability-filtered model guidance for the v2 ladder (#123949) 2026-08-14 19:54:15 -07:00
Jason (Json) cae6030575 fix(ui): clear proven uncertain sends (#123927) 2026-08-14 20:49:45 -06:00
Peter Steinberger 2276dca1d3 fix(ci): route the protocol coverage record guard through record-shared
The inlined isRecord in 7e54cc9d19 tripped the coercion-helper declaration
guard on main (runs 31859544700+); the dependency-light scripts/lib/
record-shared.mjs seam is the sanctioned owner for scripts that must run
without workspace package resolution.
2026-08-14 19:44:29 -07:00
Jesse Merhi ed447135bd Prevent auxiliary owners from resetting shared WAL (#123777) 2026-08-15 12:34:24 +10:00
Peter Steinberger 86f38f7c8f fix(terminal): shrink widest flex table columns first (#123934) 2026-08-14 19:32:08 -07:00
Peter Steinberger d8cd661517 fix(gateway): keep supervised restarts from migrating live state (#123920)
* fix(gateway): fence supervised restart schema ownership

* fix(gateway): target supervised safe restarts

* chore: leave changelog to release automation

* fix(gateway): satisfy restart control checks
2026-08-14 19:31:15 -07:00
Peter Steinberger 6abfedcca5 fix: stale Control UI tabs stop retrying after updates (#123932)
* fix(ui): preserve stale client refresh compatibility

* fix(ui): cover build-aware frozen clients
2026-08-14 19:29:59 -07:00
Peter Steinberger 8266adfb45 fix(dns): publish CoreDNS zones atomically (#123928) 2026-08-14 19:29:44 -07:00
Peter Steinberger 7e54cc9d19 perf(ci): make push/PR preflight dependency-free and prune the store archive
The manifest planner closure and the protocol coverage script import only
node builtins and relative files (verified importing the full closure with
an empty node_modules under native type stripping), so push/PR preflight
drops the pnpm store restore and install (~30s off the barrier every lane
waits behind). Manual dispatches keep the tsx path for frozen targets, and
the coverage script inlines the record guard under the documented
dependency-free exception.

The store archive accretes every prior lockfile generation through
prefix-key restores (measured 2.05 GiB, ~36s restore in every hosted job);
the warmup writer now prunes to the current lockfile closure before saving.
2026-08-14 19:25:16 -07:00