Commit Graph

81255 Commits

Author SHA1 Message Date
Patrick Erichsen 695b25386d fix(release): offer OCM installation (#126019) 2026-08-18 14:08:14 -07:00
Peter Steinberger fa62fccb86 refactor(gateway): remove workspace plugin generation projections (#125990)
* refactor(agents): remove workspace plugin generation projections

* test(agents): pass explicit generation in auth refresh
2026-08-18 14:03:27 -07:00
Peter Steinberger f2158a9c36 feat(sessions): keep durable work visible and auto-archive stale sessions (#124925)
* feat(agents): clarify visible session guidance

* feat(sessions): auto-archive inactive dashboard sessions

* fix(sessions): preserve active dashboard sessions during maintenance

* test(sessions): preserve admitted dashboard sessions during archive

* chore: refresh session generated artifacts

* test: align recovery id with transcript redaction

* fix(sessions): report only committed maintenance counts
2026-08-18 14:02:54 -07:00
Peter Steinberger 8032e6c75e fix(ui): restore session link hovercards (#125968)
* fix(ui): restore session link hovercards

* chore: defer session hovercard release note
2026-08-18 13:51:35 -07:00
Onur Solmaz f5e9622fc9 fix(providers): report request acceptance consistently (#125807)
* fix(providers): report request acceptance consistently

* fix(providers): retain response hook compatibility

* fix(providers): keep legacy response hook path

* fix(providers): distinguish rejected response attempts

* fix(providers): keep acceptance evidence truthful

* fix(google): preserve provider acceptance errors

* test(google): satisfy acceptance callback lint

* fix(google): exclude acceptance hooks from retry deadline

* fix(openai): report Codex websocket acceptance

* fix(openai): commit websocket state before acceptance hook

* fix(google): abort pending acceptance callbacks

* fix(providers): abort pending acceptance callbacks

* fix(mistral): report observed HTTP response

* fix(mistral): report rejected HTTP responses

* fix(providers): derive acceptance from HTTP status

* fix(providers): preserve acceptance lifecycle cleanup

* fix(anthropic): report observed HTTP response

* fix(anthropic): report rejected HTTP responses

* fix(plugin-sdk): expose provider lifecycle

* fix(providers): stop after lifecycle abort

* fix(mistral): cancel unread acceptance failures
2026-08-18 23:50:57 +03:00
Peter Steinberger 549e6349f8 fix(workboard): prevent orphaned runs and overwritten cards (#125951)
* fix(workboard): make ownership updates atomic

Persist launch intent before worker acceptance, reconcile accepted identities,
fence cross-host card mutations, and deduplicate session capture in SQLite.

Closes #125932

* test(workboard): keep race fixtures plugin-local

Use a plugin-local synchronization helper and update the sessions-page capture
expectation for the new store-owned RPC.

* fix(workboard): fence lifecycle and restore races

Apply terminal lifecycle state only while the matched association is current,
and converge concurrent archived session restores on the active winner.
2026-08-18 13:50:17 -07:00
Peter Steinberger 347a0eaf8c feat(ui): activity feed automation grouping, live status, deep-link inspector (#125981)
* feat(ui): collapse automation sessions in activity feed

* feat(ui): show live run status on activity feed rows

* feat(ui): make run inspector deep-link only

* fix(ui): only link inspect run to a current active run

Addresses ClawSweeper P1: a stale observer digest could deep-link a live
row to an ended run's audit record; trust digest runId only when it is
still in activeRunIds.
2026-08-18 13:49:25 -07:00
Patrick Erichsen 3e2a82bc0b feat(release): add interactive release validation skill (#125642)
* feat(release): model interactive validation campaigns

* feat(release): add validation skill workflow

* fix(release): select validation scope before missions

* fix(release): harden copied validation setup

* fix(release): require manual validation skill invocation

* fix(release): harden copied validation finalization

* fix(release): narrow validation issue feedback

* fix(release): surface upgrade results before testing

* fix(release): select validation missions one at a time

* refactor(release): simplify validation to markdown worksheet

* feat(release): prioritize validation from release notes

* refactor(release): tighten validation worksheet hierarchy

* refactor(release): summarize validation priorities by theme

* refactor(release): integrate priorities into subsystem notes

* refactor(release): align subsystem note hierarchy

* refactor(release): remove cherry-picked examples

* refactor(release): derive validation from maturity scorecard

* fix(release): publish absolute scorecard links

* docs(release): preserve scorecard generation step

* docs(release): clarify generated surface headings

* refactor(release): present validation guidance in tables

* docs(release): normalize surface table example

* refactor(release): embed notes in surface tables

* refactor(release): sequence validation campaign setup

* fix(release): trust explicit validation issue

* fix(release): preserve campaign worksheet

* fix(release): clarify validation worksheet
2026-08-18 13:48:11 -07:00
Peter Steinberger 99acca309c fix(crabbox): surface invalid cloud worker profiles (#125991) 2026-08-18 13:47:51 -07:00
Peter Steinberger f97a133254 fix(config): fail config unset on a missing path again (#125958)
runConfigUnset scoped its missing-path error to --dry-run, so the real
invocation printed "No change" and exited 0 while --dry-run on the same
input exited 1 with a specific message. Dry-run exists to predict the
real run, and a typo'd unset in a script reported success.

Restore the failure for both modes, keeping the strict-config assertion
introduced alongside the regression and the JSON5 byte preservation it
was added to guarantee.
2026-08-18 13:45:57 -07:00
Peter Steinberger f59392fdf5 fix(channels): redact logs and reject unknown filters (#125939)
* fix(channels): redact and validate log filters

* fix(logging): preserve filtered redacted channel tails

* fix(channels): match log filters on exact boundaries

* fix(logging): honor redaction off mode
2026-08-18 13:37:17 -07:00
Peter Steinberger 1d36dac99d fix(gateway): retain chat root through error persistence (#125985) 2026-08-18 13:33:35 -07:00
Peter Steinberger a57d9b5060 fix(ui): never restore a stored draft over typed new-session composer text (#125884)
* fix(ui): never restore a stored draft over typed new-session composer text

After a reload the new-session composer renders before the gateway
recovery scope arrives; selectRoute then zeroes the draft revision, so
text typed in that window lost to the stored draft's higher revision and
the async restore overwrote (or, interleaved with input, appended to)
what the user had typed. Seen on PR #125690 CI (checks-ui-e2e 5/12, run
32122284238) as a doubled composer value.

NewSessionDraftPersistence now records a pristine baseline at each
programmatic content replacement (page reset, navigation handoff,
restore apply) and restores only when no user mutation happened past it;
otherwise the typed text wins and persists above the stored revision,
including minting a revision for text typed before route activation so
that draft still lands. The chat composer sibling is unaffected: its
revision lineage persists synchronously to localStorage.

* test(ui): run draft-persistence regression in the isolated ui lane

The regression test mocks the statically imported
durable-composer-persistence helper (the store runtime is only
dynamically imported, so under the shared isolate:false module graph its
mock alone is packing-dependent). Isolating the file makes the mocks
deterministic and keeps the shared-lane file set unchanged so sibling
packing does not shift.
2026-08-18 13:23:31 -07:00
Peter Steinberger d1a194b52f fix(gateway): refresh edited skills in agent RPC sessions (#125962)
* fix(gateway): watch skills for agent RPC turns

* ci: rebalance hosted agent chat shard
2026-08-18 13:06:48 -07:00
Peter Steinberger 6f8e5d9078 test(slack): remove cache reset seams (#125971) 2026-08-18 12:47:14 -07:00
Peter Steinberger d5aff660a2 fix(codex): keep large AGENTS.md instructions visible (#125966)
* fix(codex): raise native project doc budget

Default OpenClaw Codex threads to a bounded 128 KiB aggregate project-document budget so large AGENTS.md chains remain visible. Preserve explicit ordinary-thread overrides and keep restricted or lightweight turns at zero.

* test(codex): refresh project doc config expectations
2026-08-18 12:39:52 -07:00
Peter Steinberger d1f58c4be4 fix(ollama): stop response handling after abort (#125961)
Recheck the request signal after an async response hook settles so a concurrent abort cannot reach response body handling. Related to #125802 and #125834.

Co-authored-by: Onur Solmaz <2453968+osolmaz@users.noreply.github.com>
2026-08-18 12:31:46 -07:00
Peter Steinberger a99253f73e perf(test): reuse plugin load-context modules (#125965) 2026-08-18 12:26:24 -07:00
Peter Steinberger bb92dc61c8 fix: stop --tag main from failing during npm pack (#125949)
* fix: refuse unsupported OpenClaw source package updates

* refactor: narrow main update refusal
2026-08-18 12:22:45 -07:00
Peter Steinberger 3116923ff7 test(ui): stabilize widget hover proof (#125959) 2026-08-18 12:21:47 -07:00
Peter Steinberger 934a32cd81 test(providers): remove JSON reader facades (#125956) 2026-08-18 12:18:30 -07:00
Peter Steinberger 110be8ccb6 fix: resume turns settled during gateway restart drain (#125955)
Keep drain-owned recovery state authoritative when the pre-restart run reaches a normal terminal event, so startup continues the original request without requiring a manual retry.\n\nRelated: #57425
2026-08-18 12:14:16 -07:00
Peter Steinberger 7ae9cbf3bc fix(cli): stop claiming a write when approvals mutations are no-ops (#125960)
`openclaw approvals allowlist add|remove` printed "Writing local approvals."
from the shared target-resolution helper, before the mutation decision was
made. Both idempotent paths ("Already allowlisted.", "Pattern not found.")
returned without saving, so the CLI announced a write that never happened.
`approvals set` had the same problem: it announced the write and then rejected
unparseable input.

Move the announcement from `loadWritableSnapshotTarget` into the local branch
of `saveSnapshotTargeted`, the function that owns the write. Every caller of
the shared seam is fixed at once and exit codes are unchanged: idempotent add
and remove still leave the requested end state satisfied and exit 0.
2026-08-18 12:12:37 -07:00
Josh Avant 72783bcdc2 fix(voice-call): preserve caller ownership context (#125953) 2026-08-18 12:10:13 -07:00
Peter Steinberger 153ad5ec27 fix(cli): preserve migration agent ownership (#125948) 2026-08-18 12:10:09 -07:00
Peter Steinberger c1527822ce feat: add dashboard fullscreen modes (#125806)
* feat(ui): add dashboard fullscreen modes

* docs(ui): document dashboard fullscreen modes

* fix(ui): scope dashboard fullscreen lifecycles

* test(ui): align dashboard e2e grant fixture

* fix(ui): surface dashboard document load failures
2026-08-18 12:09:07 -07:00
Peter Steinberger 82d48e0c03 fix(gateway): clean sessionless agent media (#125938) 2026-08-18 12:00:16 -07:00
Peter Steinberger 872230be91 fix(ui): retry CLI agent catalog discovery (#125943)
* fix(ui): retry new-session CLI catalog discovery

* fix(ui): distinguish CLI agent catalog errors
2026-08-18 11:59:12 -07:00
Peter Steinberger e15d5329fa fix(memory): scope Dream Diary requests to agents (#125936) 2026-08-18 11:54:58 -07:00
Peter Steinberger 5301fb5e7f fix(codex): preserve harness trajectories (#125941) 2026-08-18 11:47:09 -07:00
Peter Steinberger 4e61d49c42 test(macos): remove NodeInfo encoding contract (#125926) 2026-08-18 11:43:56 -07:00
Peter Steinberger ab2bd4faa8 feat(ui): consolidate activity filters into toolbar with people popover (#125917)
* test(ui): seed mock activity sessions across owners

* feat(ui): consolidate activity filters into toolbar

Also restores the shared .input styling contract for standalone form controls.

* test(ui): update activity feed e2e for toolbar people popover
2026-08-18 11:41:06 -07:00
Peter Steinberger 97a4d324f5 fix(gateway): allow non-admin cloud sessions (#125787)
* fix(gateway): allow non-admin cloud sessions

Admin-provisioned shared runners are now usable by operator.write while raw environment, config, and pairing controls remain admin-only.

Closes #125602

* chore(test): prune assertion safety baseline

* refactor(gateway): isolate cloud reclaim lifecycle

* test(gateway): declare Codex dispatch ownership

* test(ui): cover session-scoped cloud cleanup

* perf(ui): trim tooltip startup path

* fix(gateway): fence cloud placement activation

* test(gateway): update move recovery dispatch contract

* fix(gateway): fail closed on placement recovery

* docs(gateway): explain fail-closed move recovery

* refactor(gateway): consolidate session mutation target keys
2026-08-18 11:33:54 -07:00
Peter Steinberger ef22410985 refactor(protocol): remove beta-only expectedRunId from chat.send (#125921)
The Gateway owns start-or-steer at admission (6515f6a255) and no
client produces expectedRunId anymore (d84a910fc8). The field shipped
only in v2026.8.1-beta.2 - never a stable tag - so it is removed rather
than deprecated. Steer sends resolve the selected session's current
operation; the exact-match branch, the operation|run target identity
discriminator, run_mismatch rejection, and the suggestion producers'
active-run-id selection (with its ambiguity failure) are deleted.
Provider-native turn fencing (Codex expectedTurnId) is unchanged:
the backend-captured runId on the injection target remains.
2026-08-18 11:28:36 -07:00
Peter Steinberger 91cc7d512b fix(cli): report broadcast delivery failures (#125915)
* fix(cli): report broadcast delivery failures

* test(qa): wait for descendant process exit
2026-08-18 11:28:13 -07:00
Peter Steinberger b1d53fcdda fix(browser): repair session lifecycle ownership (#125933)
Preserve browser availability and profile ownership across node and extension routes, close session-owned node tabs, honor screenshot refs, and hide unavailable tab-bound actions.
2026-08-18 11:20:04 -07:00
Peter Steinberger 8bd49e1f4d fix(ui): surface failed widget access decisions (#125934) 2026-08-18 11:19:47 -07:00
Peter Steinberger 2ffbff0547 refactor(gateway): bind plugin runtimes to their owning instance (#125821)
* refactor(gateway): bind plugin runtimes per instance

* refactor(gateway): migrate ambient context readers

* refactor(gateway): remove global fallback context

* test(gateway): cover reverse instance shutdown

* fix(gateway): preserve plugin runtime owner on reload

* test(gateway): migrate tool invoke context scope

* fix(gateway): bind remaining runtime ownership
2026-08-18 11:10:32 -07:00
Peter Steinberger 6302114879 perf(test): reuse command differential temp root (#125930) 2026-08-18 11:08:35 -07:00
Peter Steinberger 09f543d6c7 fix(tui): block sends until session events are subscribed (#125928)
* fix(tui): gate chat readiness on session subscription

* test(tui): warm subscription readiness regression
2026-08-18 11:08:13 -07:00
Peter Steinberger 3a96fbd64d feat(canvas): present widgets on native device panels (#125818)
* feat(canvas): present widgets on native panels

* refactor(agents): inline gateway caller selection

* fix(canvas): restrict widget panels to macOS

* refactor(agents): reuse resolved spawn workspace
2026-08-18 11:05:41 -07:00
Peter Steinberger 1958551ff9 fix(channels): defer ingress during gateway drain (#125919) 2026-08-18 10:56:05 -07:00
Peter Steinberger 62b2141118 fix: keep turns active when sessions_yield has no child (#125850)
* fix(agents): reject sessions_yield without child completion

* fix(agents): preserve native child yield claims

* chore(agents): keep tool registry within lint limit

* fix(agents): preserve subagent self-yield
2026-08-18 10:53:37 -07:00
Peter Steinberger f3855fa639 fix(ui): stop truncated Workshop diffs showing zero totals (#125922)
* fix(ui): mark truncated Workshop diffs incomplete

* fix(ui): clarify truncated Workshop comparisons
2026-08-18 10:52:31 -07:00
Peter Steinberger fd8326c5bf fix(codex): reap sandbox process trees before termination (#125908) 2026-08-18 10:48:10 -07:00
Peter Steinberger fd216cb550 fix: prevent plugin metadata rescans from stalling Gateway (#125596)
* fix(plugins): preserve gateway metadata ownership

Generic runtime contexts no longer displace the Gateway lifecycle snapshot, preventing repeated synchronous plugin inventory validation on session hot paths.

* fix(gateway): reuse lifecycle plugin generation for turns

* test(agents): align static runtime lifecycle expectations

* test(gateway): refresh minimal runtime fixtures

* test(runtime): pass lifecycle metadata explicitly

* fix(skills): reuse gateway metadata for commands

* test(gateway): prepare reply runtime for agent RPCs

* style(agents): format rebased runtime preparation

* test(gateway): prepare runtime for direct agent RPCs

* test(gateway): provide direct agent runtime fixture

* test(gateway): prepare chat send reply runtime

* test(qa): await descendant process exit
2026-08-18 10:47:16 -07:00
Peter Steinberger f95b5a0062 test(ui): wait for the outbox retry drain instead of the timer tick (#125912)
The retryable-send and retryable-history tests asserted the resend side
effect immediately after `vi.advanceTimersByTimeAsync(100)`. Sinon's async
tick yields exactly one real macrotask after firing the last timer, and the
retry chain (`void scheduleStoredChatOutboxDrain` -> `chat.history` ->
`chat.send`) consumes exactly that one boundary, so the assertions had zero
slack and flaked under CI contention.

Wait for the outcome with `waitForFast` instead, and fold the outbox-empty
assertion into the wait since retirement lands after the send call.
2026-08-18 10:45:29 -07:00
Peter Steinberger 0684f50136 fix(gateway): harden hook admission and shutdown (#125893)
* fix(gateway): harden hook admission and shutdown

Flush structured 413 and 408 hook responses before closing oversized or timed-out request sockets, and reject deferred wake requests that target an explicit session.

Direct Gateway close now marks startup and readiness as draining immediately and attempts every HTTP listener shutdown before reporting an incomplete close.

* test(gateway): model request destruction in fuzzing

Give the HTTP request fuzz double the IncomingMessage destroy contract exercised after 413 and 408 responses finish.

* fix(gateway): preserve response and shutdown bounds

Route installed webhook body-limit failures through the shared response-first close owner and require complete Feishu 413/408 responses before terminal connection closure.

Retain the current-main grace bound for agent-harness disposal so one stuck harness cannot block listener teardown.

* test(telegram): model response-close request cleanup

Keep the slow-body request alive through response finish, then assert cleanup when the mock response transport closes.
2026-08-18 10:39:56 -07:00
Peter Steinberger d33ba0015d fix(mcp): preserve recovery text with structured results (#125914)
* fix(mcp): preserve structured result text

* fix(mcp): preserve node-host structured results
2026-08-18 10:36:03 -07:00
Peter Steinberger a7d6256be8 fix(agents): link known progress card references (#125887) 2026-08-18 10:31:28 -07:00