Commit Graph

83627 Commits

Author SHA1 Message Date
Peter Steinberger c7473fb9bf fix(agents): preserve canonical transcript tool pairing
Keep SessionManager cache and guard pairing aligned with the committed redacted transcript. Settle committed pending-call state before persistence callbacks, retaining pending calls when the append fails. Covers the false aborted result found in live Buzz message-tool testing.
2026-08-27 14:53:19 -07:00
Peter Steinberger e0e4335a62 fix(agents): track persisted tool call identities in session guard 2026-08-27 14:53:19 -07:00
Peter Steinberger c340bc09f0 feat(buzz): support flat automatic replies and typing
Expose opt-in replyToMode off while retaining threaded replies by default. Keep incoming thread/session identity and explicit tool or CLI targets intact. Resolves #120339. Thanks to @Alfridus1 for the report.
2026-08-27 14:53:18 -07:00
Peter Steinberger 7c5a880cca test(update): await managed handoff failure completion (#131184) 2026-08-27 14:38:19 -07:00
Peter Steinberger 7b000dba9d feat(reef): operator-configurable sharing rules for the guard (#131167)
* feat(reef): operator-configurable sharing rules for the guard

Adds channels.reef.guard.rules with capped outbound/inbound free-text
policy. Rules ride the trusted instruction side of the guard call only,
may tighten decisions or explicitly allow otherwise-review cases, and can
never override the deny floor or deterministic checks. The rules text is
hashed into the effective policy version so audit rows and pending review
approvals bind to the exact policy in force.

* fix(reef): full rules digest in policy identity; align blank-rule validation

ClawSweeper review fixes: use the untruncated sha256 rules digest in the
effective policy version so approvalDigest stays collision-resistant, and
express identical non-blank (\S) rule validation in the zod schema, the
manifest JSON Schemas, and the generated channel metadata instead of a
trim-transform mismatch.
2026-08-27 14:37:17 -07:00
Peter Steinberger ef858c0f1b perf(tests): reuse model manifest selection imports (#131194) 2026-08-27 14:34:03 -07:00
Peter Steinberger d5d2167bff fix(codex): keep unsupported service-tier warnings out of chat (#131190) 2026-08-27 14:30:19 -07:00
Peter Steinberger 3f4cefc4d3 fix(code-mode): release canceled timers and parked execution slots (#131186) 2026-08-27 14:29:30 -07:00
Peter Steinberger 0e071abb1e docs: correct verification and hardened setup claims (#131188) 2026-08-27 14:25:03 -07:00
Jason O'Neal 84064a94c3 fix(installer): avoid duplicate gateway restart (#130900) 2026-08-27 14:22:13 -07:00
openclaw-mantis[bot] c1514a2be2 chore(ui): refresh control ui locales (#131098)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-08-27 21:21:58 +00:00
Peter Steinberger 77746299ea refactor(imap): consume the core identifier-authentication scale (#131178)
* refactor(imap): consume the core identifier-authentication scale

Use the SDK type and canonical strength comparator instead of the private
SenderStrength vocabulary and index ordering. Bind config values to the SDK
union with a compile-time exhaustiveness check, preserving all config keys.

Classify unproven From ownership, including no-evidence and DMARC temperror
results, as unverified. Only an explicit unverified minimum gains admission;
the default verified floor and asserted minimum keep their behavior. Keep
existing token admission and thrown-authenticator retries unchanged.

Document the remaining mutable token/early-rejection paths and expose only
the canonical comparator through the SDK, with packaged-consumer coverage.
The IMAP introduction has no stable release contract.

* docs(security): record landed sender-auth mitigations in the threat atlas

Record the graded exact-pair identifier-authentication gate and inert mutable
allowFrom audit findings. Mark R-008 implemented in core while retaining
per-channel verified adoption and downstream mappers as remaining work.
Keep the existing atlas structure and Medium residual risk.
2026-08-27 14:19:39 -07:00
Peter Steinberger c7f1699966 fix(ui): keep Gateway place labels current (#131118) 2026-08-27 14:19:07 -07:00
Peter Steinberger bca58b72bf fix(ui): preserve external config edits after Raw revert (#130935)
* fix(ui): preserve external config edits after raw draft revert

* fix(ui): retain pending config intent across reconnects
2026-08-27 14:16:54 -07:00
Peter Steinberger e0680fdd42 fix(cli): preserve authored config during channel auth (#131117)
* fix(cli): preserve authored channel config during auth

* fix(cli): preserve source config for auth selection

* test(ui): synchronize task panel hover assertions
2026-08-27 14:11:22 -07:00
Peter Steinberger 1b26747cfd perf(ci): refit Control UI E2E duration hints to the grown suite
The table was fitted on 2026-08-23 and has rotted. Measured across the
checks-ui-e2e logs of runs 33063115103 and 33055390669, the suite has grown from
247 to 281 files and from 1430s to 2422s of body, and every surviving hint now
reads 1.5-1.9x low (chat-tool-turn-outcome 17s -> 32s, workspace-validation
19s -> 33s, chat-rail-columns 25s -> 36s). The new slowest file,
chat-flow.clipboard at 49.6s, was not listed at all.

Stale low hints are worse than no hints: the packer treats those files as cheap
relative to byte-proxied ones and stacks them together. Replaying the measured
per-file medians, the widest control-UI shard packs at 243s under the current
table against a 220s ideal, and 233s once refreshed.

Regenerated from measurement rather than patched, and widened from 31 to the 80
slowest files so the table covers the suites that actually set the tallest
shard. Everything below rides the byte proxy, which is fine for the ~4s median
file but mispredicts by up to 3.6x on the tail.
2026-08-27 14:09:44 -07:00
Patrick Erichsen 1659e186b6 improve(ui): add permission docs link to picker (#131152)
* fix(ui): link permission picker to docs

* fix(ui): link picker to session permission guide

* improve(ui): space permission picker heading
2026-08-27 14:06:00 -07:00
Vincent Koc 47e06b8249 fix(gateway): pin runtime generation at admission (#131120) 2026-08-28 05:03:09 +08:00
Peter Steinberger 6e82723125 fix(ui): keep reconnect-uncertain sends inline and prove delivery by run id (#131171)
After a reconnect lost the chat.send ack, the outbox reconcile only accepted
the transcript idempotency marker as delivery proof, so a send whose run was
actively streaming parked as a red 'Delivery uncertain' composer chip for the
whole run. The reconcile now also retires a queued send when the session row
reports its run id in activeRunIds or as lastRunId — the same fact live
terminal-event retirement already trusts.

Attempted unconfirmed messages now stay in the conversation as ordinary
bubbles with an amber 'Delivery unconfirmed · Retry' footer (failed keeps the
red 'Not sent'); the duplicate pane banner is suppressed for them since the
bubble owns the outcome. Command chips, never-attempted failures, and storage
errors keep their existing surfaces. Calmer copy for the remaining honest
uncertainty case.
2026-08-27 13:57:27 -07:00
Peter Steinberger 3424633360 fix(twitch): retain native sender identity in execution audits (#130730)
* fix(twitch): retain native sender identity in execution audits

Forward the registered channel runtime and actual account identity, keeping native participants distinct from role authorization. Normalize the all role at the Twitch policy producer and preserve unknown and disabled-collection paths.

Cover actual registered-plugin ingress and native reply delivery, and drain asynchronous monitor test work before cleanup. Related to #122863; no shared authorization or storage change.

* test(twitch): track the registered context builder in inventory

* test(twitch): honor host and plugin contract boundaries
2026-08-27 13:45:33 -07:00
Peter Steinberger 5f8fd586e7 feat(ci): alarm and self-heal when the docs mirror goes stale (#131173)
Both halves of the docs publish starvation bug (openclaw/docs b4b130bd8,
#131155) were discovered by noticing stale published docs, not by any alert:
nothing watched whether the openclaw/docs mirror actually tracked docs-touching
commits on main. A broken sync (dead token, MDX failure, disabled workflow,
GitHub incident) would again go unnoticed.

Add a scheduled Docs Mirror Freshness check (every 30m) that parses the watched
paths from docs-sync-publish.yml itself - so the staleness definition can never
drift from the sync trigger - finds the newest docs-touching main commit via
the commits API, and compares it against the mirror's .openclaw-sync/source.json
SHA. When the mirror trails by more than 60 minutes it dispatches one
docs-sync-publish recovery run (skipped when a sync is already queued or in
progress) and fails the run so the workflow actor is notified.

The check lives in openclaw/openclaw rather than openclaw/docs because the path
filters it must judge against live here, and same-repo workflow_dispatch heals
with the default GITHUB_TOKEN instead of a cross-repo PAT.

Live-proven: fresh path against the real repos; stale path (detection,
active-run suppression, failing exit) via a simulated stale mirror SHA;
recovery dispatch endpoint via a real manual sync run (33113089552).
2026-08-27 13:45:14 -07:00
Peter Steinberger 79dfa81664 test(config): consolidate runtime snapshot fixtures (#131170) 2026-08-27 13:38:02 -07:00
Peter Steinberger 97f66133c5 test(whatsapp): simplify inbound-drain harness internals (#131158)
Replace the drain waiter array + release loop with one lazily created
shared idle deferred (same semantics: concurrent waiters share it, it
resolves on the first all-trackers-zero publish), and fold the tracker
update into publishInboundPendingWork.

Collapse expectInboxPairingReplyText into expectPairingPromptSent: the
mocked pairing upsert always issues PAIRCODE, so the regex code
extraction and code-override parameter were dead generality. Net -20
lines of test-support code, no behavior change.
2026-08-27 13:36:57 -07:00
Peter Steinberger d95a1dbcf6 fix(copilot): honor static GPT-5.4 mini thinking levels (#131160)
Declare the provider-supported efforts and reuse the canonical minimal-to-low mapping for static GPT-5.4 mini resolution. Preserve xhigh and keep max unavailable.
2026-08-27 13:34:47 -07:00
Peter Steinberger d56e2c42c9 docs: correct Copilot Proxy default enablement (#131164) 2026-08-27 13:29:19 -07:00
Peter Steinberger 3bc404d7c6 refactor(cli): reuse function-shaped lazy loaders (#131144) 2026-08-27 13:24:50 -07:00
Peter Steinberger 621f7c43f7 fix(openai): restore automatic Code Mode for preferred models (#131139)
* fix(openai): restore automatic Code Mode for preferred models

* test(openai): move model override coverage to core owner

* test(openai): load provider through public surface boundary
2026-08-27 13:23:32 -07:00
Patrick Erichsen ea6a1d0f81 fix(ui): make composer text sizing consistent (#131154)
* fix(ui): align composer typography to semantic small size

* fix(ui): use medium composer text sizing
2026-08-27 13:18:48 -07:00
Peter Steinberger 7c65d89e60 fix(ci): stop cancelling in-flight docs publish syncs on main pushes (#131155)
Every docs-touching push to main cancelled the in-flight docs-sync-publish
run (per-ref concurrency group with cancel-in-progress: true), and cancelled
runs leave no successor. Under sustained merge velocity the openclaw/docs
mirror never advanced: observed live 2026-08-27 as four consecutive
'completed cancelled' runs while the mirror sat 6 commits behind main.

Queue instead of cancel: GitHub keeps only the newest pending run per
concurrency group, so bursts still collapse to one follow-up run, and the
existing skip_stale_source guard keeps back-to-back completions idempotent.
This is the source-to-mirror half of the docs publish starvation bug; the
mirror-to-R2 half was fixed in openclaw/docs b4b130bd8.
2026-08-27 13:15:37 -07:00
Jason (Json) 0e216b1581 fix(cron): surface command prompt capability failures (#131123)
* fix(cron): surface command prompt capability failures

* fix(cron): honor grouped shell tool policy

* fix(agents): align wildcard tool construction

* fix(agents): preserve runtime write compatibility
2026-08-27 14:10:21 -06:00
Ayaan Zaidi f636bf2376 fix(skills): stop experience reviews from blocking chats (#131077)
Run hidden Skill Workshop reviews on a private detached session so foreground messages stay responsive and isolated. Preserve prompt-cache affinity, remove closed delivery authority, and retire queued evidence before asynchronous preparation.

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-08-28 01:35:04 +05:30
Peter Steinberger eaf13f1d0c fix(sessions): preserve required creation stamps in storage (#131147) 2026-08-27 13:03:03 -07:00
Peter Steinberger 937a31c4a4 fix(copilot): keep Gemini working without live discovery (#131143)
Declare the Gemini Chat Completions transport and request compatibility in the owning model manifest. Remove the private metadata decoration loop so static catalog selection and forward-compatible synthesis use the same declared contract.
2026-08-27 12:58:38 -07:00
Peter Steinberger 98ba35ab6f refactor(plugins): separate consent mutation from inventory (#131146) 2026-08-27 12:58:34 -07:00
Vyctor H. Brzezowski 5eb62b772c perf(ui): stop loading shimmers from repainting (#128687)
* perf(ui): move loading shimmer off paint

* perf(ui): keep model loading shimmer off paint
2026-08-27 16:54:51 -03:00
Peter Steinberger 430d2caa56 fix(sandbox): retire plugin backends with registry lifecycle (#130662)
* fix(openshell): unregister sandbox backend on plugin stop

Bind the explicit backend disposer to the plugin service lifetime so disabling or reloading OpenShell retires its factory, manager, and workdir hooks together. Preserve the core registry's stale and repeated disposer semantics.

* fix(sandbox): retire plugin backends with registry lifecycle
2026-08-27 12:54:25 -07:00
Peter Steinberger cad34e612f feat(channels): add Matrix and LINE join introductions (#131128)
Introduce on admitted bot joins using the existing sealed no-tools turn and durable room dedupe. Matrix uses room metadata and readable history; LINE uses group names and explicitly unavailable history.

Mark Matrix bridge membership provenance without changing existing event delivery, invite handling, or auto-join. Exclude startup snapshots and already-joined profile updates, including startup connection recovery.

Simplify snapshot budget accounting while preserving prompt bytes, metadata order, and oldest-first message dropping. Add channel config, docs, and regression coverage.
2026-08-27 12:52:55 -07:00
Peter Steinberger f85904465d refactor(agents): derive list entry type from output schema (#131130) 2026-08-27 12:52:45 -07:00
Peter Steinberger 3f3ccd2b40 perf(copilot): avoid duplicating BYOK request bodies (#131145) 2026-08-27 12:51:01 -07:00
Peter Steinberger 9be3cefabd feat(configure): surface the trusted-proxy loopback opt-in with its warning (#131132)
* feat(configure): surface the trusted-proxy loopback opt-in with its warning

Ask for explicit consent before enabling same-host trusted-proxy authentication,
and explain the runtime rejection when consent is declined. Preserve existing
loopback consent and unprompted device enrollment policy on same-mode reruns.

Reuse runtime loopback classification, add English and Chinese wizard copy,
and document the consent and preservation behavior.

* test(configure): assert wizard auth through the real builder

Remove the auth-builder mock and replacement factories so gateway prompt tests verify returned configuration across proxy, token, password, and SecretRef flows. Retain all consent regressions while reducing test scaffolding and reusing tracked environment cleanup.
2026-08-27 12:45:23 -07:00
Peter Steinberger 23233bc30e fix(openshell): preserve nested host symlinks during mirror sync (#131122)
* fix(openshell): preserve nested host symlinks during mirror sync

Reconcile mirror entries recursively so trusted host symlinks and their ancestors survive remote edits and deletions. Preserve unlink-before-copy hardlink safety and drain pending filesystem work before returning an error. Cover the repair with unit regressions and the real OpenShell E2E flow.

Fixes #131111

* chore(openshell): satisfy mirror callback lint rules
2026-08-27 12:43:30 -07:00
Peter Steinberger 8e025e4767 fix(github-copilot): restore usage for domain-aware OAuth profiles (#131137) 2026-08-27 12:37:42 -07:00
Peter Steinberger a509254b16 feat(security): warn on inert mutable allowFrom entries (#131129)
* feat(security): warn on inert mutable allowFrom entries

Report configured entries that cannot authorize with name matching disabled,
and preview lockout counts before disabling mutable matching. Distinguish
mutable aliases from exact identifiers with unproven ownership in audit text.

Reuse channel ingress declarations through one SDK classifier without changing
admission policy. Keep Discord audit findings redacted and exclude symbolic
access-group references from mutable-identifier warnings.

Refs #131099.

* test(security): keep entry-authentication audit coverage in its lanes
2026-08-27 12:33:12 -07:00
Peter Steinberger 9a579cf5fa test(channels): consolidate command fixtures (#131133) 2026-08-27 12:29:22 -07:00
Peter Steinberger c68ee620cd fix(canvas): retire the legacy document root only after migration completes (#131038)
* fix(canvas): retire the legacy document root only after migration completes

* fix(canvas): preserve older migration roots and canonical aliases

Read both historical host locations with shipped plugin precedence.
Select legacy config owners from existing manifest metadata for doctor,
without broadening session-store ownership. Recognize realpath aliases
of canonical storage and cover persisted partial repairs and retries.
2026-08-27 12:28:26 -07:00
Peter Steinberger 5b8683f93c refactor(gateway): reuse user request validation (#131127) 2026-08-27 12:26:53 -07:00
Vincent Koc 30aa2794d9 fix(update): preserve plugin convergence through package restart (#131062)
* fix(update): preserve plugin convergence during package upgrades

* fix(e2e): isolate upgrade restart auth setup

* fix(e2e): isolate candidate restart config

* fix(doctor): skip repairs for disabled plugins

* fix(e2e): use canonical identity for restart install

* fix(update): release plugin lease before doctor

* fix(e2e): seed upgrade companion installs

* fix(e2e): validate companion install versions

* fix(ci): register upgrade config parking script

* test(plugins): type npm install config fixture
2026-08-28 03:26:43 +08:00
Vito Cappello b9d01e7127 fix(agents): continue settled tool batches after a transport drop (#130721)
* fix(agents): continue settled tool batches after a transport drop

A transient provider transport failure (WebSocket drop, socket reset) that
lands after every tool call in the batch has settled used to kill the turn:
any executed side-effecting tool marks the attempt replay-unsafe, and every
recovery path is gated on replay safety, so the runner surfaced the generic
"Agent couldn't generate a response" warning even though the tool results
were already persisted and nothing needed to be re-run. Under code mode every
tool call is exec, so any turn with a tool call died on a socket hiccup.

Continue such attempts from the persisted transcript with the existing
mid-turn continuation prompt, bounded to two continuations per run and only
for silent errored turns with transient evidence; prompt resubmission, profile
rotation, and model fallback stay closed for side-effecting attempts.

* fix(agents): narrow settled transport recovery

Require provider transport diagnostics before continuing a replay-unsafe settled tool batch, leaving rate-limit failures with the existing failover owner. Preserve the prior last-call usage only when a compaction retry fails before recording a replacement, without overwriting a newer successful call after later processing errors.

* fix(agents): restore retry usage only on failure

Keep the previous exact usage hidden while a compaction retry is active. Restore it only when the retry terminates with an error before recording a new call; a successful replacement call remains authoritative across later processing failures.

* fix(agents): require settled tools for transport resume

Keep the parked Code Mode exception scoped to overflow recovery. Provider transport recovery now requires every tool lifecycle item to be settled, with regression coverage for a suspended nested Code Mode run.

* fix(agents): fence suspended code mode recovery

Reject transcript continuation whenever the settled batch still carries producer-recorded suspended Code Mode work, even if the outer lifecycle count has reached zero. Cover that exact state in the recovery regression.

* fix(agents): resume parked code mode after transport drop

Use the canonical mid-turn settled evidence for transport continuation so producer-recorded parked Code Mode runs can resume from the current transcript. This lets the model call wait for the existing cell without replaying the original prompt or exec.

Cover parked active-count states and preserve the terminal, abort, timeout, visible-output, diagnostic, rate-limit, retry-budget, and no-fallback gates.

Worked on by:
- @VACInc

Co-authored-by: VACInc <3279061+VACInc@users.noreply.github.com>

---------

Co-authored-by: VACInc <3279061+VACInc@users.noreply.github.com>
Co-authored-by: roboclaw-bot <309084314+roboclaw-bot@users.noreply.github.com>
2026-08-27 15:16:54 -04:00
Peter Steinberger a9f163ff25 fix(configure): preserve the primary model across provider auth overrides (#131119)
* fix(configure): preserve the primary model across provider auth overrides

* test(configure): cover real model policy after provider auth

Replace copied model policy transforms with the production implementations so configure coverage preserves model metadata and exercises target projection. Cover string primaries and fallback-only initialization without changing production behavior.
2026-08-27 12:05:17 -07:00
Peter Steinberger 19be0f6dc0 fix: honor scenario drivers in generated QA commands (#131101)
* fix: honor scenario drivers in generated QA commands

Carry declared driver requirements through coverage search, grouping and quoted command output. Preserve unconstrained defaults and validate generated arguments through real CLI parsing and canonical lane selection. Closes #131088.

* test: capture generated QA commands through the shell
2026-08-27 11:58:30 -07:00