Commit Graph

72394 Commits

Author SHA1 Message Date
Peter Steinberger
a854cea4f7 fix(codex): stop supervision flag from gating the whole plugin config (#114413)
The plugin re-resolved its own enable state with supervision.enabled as
enabledByDefault, so an operator who only declared plugins.entries.codex.config
(auto-enabled by core) silently lost every codex setting, including
appServer.homeScope=user, whenever supervision was absent or off.

Use a live plugin config block as the plugin-side default, matching core's
plugin-tool-configured auto-enable and the onepassword convention. Supervision
stays gated in its own tool surface.
2026-07-27 04:34:38 -04:00
Peter Steinberger
da4ae86232 fix(ui): claim new-session handoffs on the direct chat route (#114377)
* test(ui): align new-session e2e with path routes and startup transcript

* fix(ui): claim new-session handoffs on the direct chat route

Deferred session navigation can route a pane straight onto the created
session key, which never runs the switch path that admits the one-shot
handoffs. The rejected turn then expired unclaimed instead of offering a
retry, and an accepted prompt stayed hidden until the transcript bootstrap
resolved. Mirror chat-state-route's admission on the direct branch.

Fixes #114374

* fix(ui): keep the projected first prompt above the replies it started

A pane that admits the accepted prompt before its transcript bootstrap
resolves leaves that row in chatMessages while the history request is in
flight. The merge then re-placed it as a late optimistic tail, and since
#113266 stable rows keep insertion order, the first turn rendered below the
tool activity it kicked off. The handoff reconciler owns that head row, so
exclude it from the late tail.
2026-07-27 04:34:17 -04:00
Peter Steinberger
2fa5281b14 fix(cron): bind jobs to durable session (#114421) 2026-07-27 04:34:02 -04:00
Peter Steinberger
5a8db91459 fix(macos): keep polling gateway-executed wizard steps (#114383)
* fix(macos): keep polling gateway-executed wizard steps

* docs(ui): note the prebuilt control-UI bundle in live verification

* test(macos): fail fast when gateway progress polling stalls

* chore(i18n): refresh native source inventory anchors
2026-07-27 04:33:09 -04:00
Peter Steinberger
45bad50e26 fix(qa): harden Mantis Telegram proof harness (#114429)
* fix(qa): harden Mantis Telegram proof harness

* fix(qa): require explicit Mantis dispatch
2026-07-27 04:33:06 -04:00
Peter Steinberger
4aa2ab2b25 perf(gateway): fold session touched-files incrementally via transcript delta (#114401)
* perf(gateway): fold session touched-files incrementally via transcript delta

* refactor(gateway): keep session touched-files fold on the canonical sqlite path

* test(gateway): split session files transcript-fold coverage

* test(gateway): drop unused session-files test-support exports
2026-07-27 04:32:57 -04:00
Peter Steinberger
abfe7c64a7 docs(install): recommend Node 26 as the OpenClaw runtime (#114399)
* docs(install): recommend Node 26; CI/installer stay on Node 24 for now

* feat(cli): point unsupported-runtime nvm hint at Node 26

* feat(install): provision Node 26 by default (brew mainline node formula, NodeSource 26.x, portable win zip)

* test(install): align installer tests with Node 26 provisioning defaults

* docs(install): state per-platform Node provisioning accurately
2026-07-27 04:32:21 -04:00
lanyoung
ae8556fed3 fix(openai): retry transient Codex device polling failures (#114094)
* fix(openai): retry transient Codex device polling failures

* fix(openai): retry transient device polling errors

Co-authored-by: lanyoung <1014080235@qq.com>

Co-authored-by: loong954 <yuan.longhui@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: loong954 <yuan.longhui@xydigit.com>
2026-07-27 04:31:48 -04:00
Peter Steinberger
af552d4bc6 feat(ui): resolve session URLs through the gateway with best-effort slug matching (#114422)
* feat(ui): resolve session URLs through the gateway with best-effort slug matching

Session URLs now resolve a stored board face and a display-name slug through
the gateway instead of guessing from the browser's cached session page.

- An uncached open marks only the in-app navigation, never the shareable href,
  so the chat loader can re-derive the face and replace the URL.
- A cached row settles the lookup locally, keeping navigation off the wire.
- A one-segment reference resolves short id, then literal key, then display-name
  slug; ties reuse the existing disambiguation view.

* refactor(ui): keep slug ties on short disambiguation prefixes

Slug candidates reused the full uuid, which produced 32-character links in the
disambiguation view. uniqueShortIdPrefix already falls back to the full id when
the bounded search was truncated, so reuse it and drop the flag.

* fix(ui): navigate worktree owner links in-app so the face marker survives

The Worktrees owner link was a bare anchor consuming only the shareable href,
so preferenceDerivedFace was a no-op there and an uncached owner always opened
on chat. Match the other session surfaces: keep the clean href and navigate
with the options on plain clicks.

* fix(ui): search the first uuid block so long session references resolve

The gateway matches sessions.list search as a plain substring and stored keys
hold a hyphenated uuid, so any hyphen-stripped reference past the first block
matched nothing and 404'd. This hit disambiguation links, which offer prefixes
longer than eight characters. Send the first block and keep applying the full
prefix per row.

A resolved slug now canonicalizes to that same short reference instead of a
full uuid, so /chat/main/deploy-monitor settles on -6db92d48.

* docs(ui): record why the face marker stays out of shareable hrefs
2026-07-27 04:31:33 -04:00
Peter Steinberger
067820f2d4 fix(release): detect missing bundled providers after npm install (#114400)
* fix(release): verify all installed bundled provider manifests

* test(release): seed all packaged bundled plugin fixtures
2026-07-27 04:29:47 -04:00
Peter Steinberger
9b171190f2 perf(sessions): cache branch summaries behind a transcript watermark (#114412) 2026-07-27 04:24:48 -04:00
carlosjarenom
c93652cbe4 fix(telegram): persist update offset only after durable spool write in isolated polling (#113368)
* fix(telegram): persist update offset only after durable spool write in isolated polling

Closes #113315

In isolated polling ingress, the parent session now persists the Telegram
update offset only after the update has been durably written to the spool.
This prevents an update from being acknowledged (via the offset) before it
has been safely enqueued, which could lead to permanent data loss if the
process crashes between offset persistence and spool write.

Changes:
- Call persistUpdateId(updateId) after writeTelegramSpooledUpdate succeeds.
- Add structured logs for poll-start, update receipt, spool success/failure,
  and offset persistence success/failure.
- In isolated mode, stop passing onUpdateId to the bot so the offset is only
  persisted once, after the spool write.
- Add regression tests verifying spool-before-offset ordering and the
  failure path when spooling fails.

* fix(telegram): persist isolated polling offset only across contiguous spooled updates

Closes #113315

- Track successfully spooled update ids and advance the persisted offset only
  through a contiguous boundary. This prevents a later update_id from being
  persisted before an earlier one has finished spooling, which would make the
  earlier update unrecoverable after a restart.
- Serialize spooling while no durable offset floor exists, so the first
  successful spool becomes the persisted floor.
- Coalesce duplicate worker deliveries for the same update_id and ack both
  success and failure paths.
- Fix TypeScript cast errors in polling-session.test.ts.

* fix(telegram): serialize durable polling offsets (#113368)

---------

Co-authored-by: Carlos <carlos@example.com>
Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-07-27 17:21:03 +09:00
zengLingbiao
a8e52b49a0 fix(google): reject malformed base64 audio in Gemini TTS responses (#114041)
* fix(google): reject malformed base64 audio in Gemini TTS responses

* fix(media): validate provider audio payloads

Co-authored-by: zengLingbiao <zeng.lingbiao@xydigit.com>

* fix(xai): terminate malformed realtime audio

Co-authored-by: zengLingbiao <zeng.lingbiao@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-27 04:17:35 -04:00
Dallin Romney
ec391edea7 fix: clarify unstored exec approval defaults (#114417) 2026-07-27 16:07:11 +08:00
Peter Steinberger
669db2968f refactor(agents): retire TOOLS.md into an AGENTS.md section with a doctor migration (#113966)
* fix(agents): stop retired attestation hashes from faking a vanished workspace

* feat(agents): migrate TOOLS.md content into the AGENTS.md tools section

* refactor(agents): drop TOOLS.md from the workspace bootstrap set

* refactor(policy): read tool policy entries from AGENTS.md

* docs: describe local tool notes as an AGENTS.md section

* test(codex): drop TOOLS.md developer-instruction coverage with the removed path

* test(agents): cover the TOOLS.md doctor migration behaviors

* refactor(doctor): satisfy TOOLS.md migration lint

* test(agents): split workspace attestation survival coverage

* refactor(codex): simplify workspace context basenames

* refactor(doctor): keep TOOLS.md migration helpers module-local

* docs: regenerate docs map

* fix(doctor): keep migration claims fresh

* fix(doctor): preserve nested tool notes

* refactor(doctor): split tools migration helpers

* refactor(doctor): limit TOOLS.md migration to workspace root

* style(doctor): keep migration under line limit

* fix(doctor): recover interrupted AGENTS publish

* docs(hooks): describe root-only TOOLS.md migration accurately

* fix(doctor): preserve migrated tool guidance visibility

* test(agents): regenerate prompt snapshots after rebase

* fix(policy): block evaluation while TOOLS.md is unmigrated

* fix(doctor): check merged bootstrap budget per agent

* fix(doctor): keep budget helper internal

* refactor(doctor): keep migration budget helpers to their consumers
2026-07-27 03:56:30 -04:00
Santhi Prakash
445774d85e [AI-assisted] docs(senseaudio): fix broken Docs URL to docs.senseaudio.cn (#114021)
The SenseAudio provider guide linked its Docs row to
https://senseaudio.cn/docs, which returns 404. The SenseAudio platform
homepage itself links to https://docs.senseaudio.cn (200), so point the
Docs row there instead.
2026-07-27 03:56:03 -04:00
Thiago Pontes
bb687fa2de fix(ui): keep long Markdown previews scrollable (#113465)
* [AI] fix(ui): add min-height:0 to flex scroll containers for Firefox

Firefox enforces the CSS Flexbox automatic minimum size more strictly
than Chromium, preventing .sidebar-content and .md-preview-dialog__body
from shrinking below their content height. This blocked overflow:auto
from creating a scrollable area when Markdown content exceeded the
available panel height.

Add min-height:0 to both flex children so Firefox allows them to shrink
and become the inner scroll container.

Related to #107571

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* [AI] fix(ui): bound Markdown sidebar previews

* [AI] fix(ui): bound file sidebar editors

* test(ui): cover scroll repair in sidebar column layout

---------

Co-authored-by: 杨爱文 <yang.aiwen@xydigit.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Thiago Pontes AI <thiagopontesai@Hefestos-Mac-Mini.local>
2026-07-27 03:54:03 -04:00
Peter Steinberger
3b519cecb8 refactor(plugins): consolidate security and install test fixtures (#114410) 2026-07-27 03:52:37 -04:00
Peter Steinberger
08b1ff73e2 refactor(channels): fix account resolution and setup isolation (#114395)
* refactor(channels): fix account resolution and setup isolation

* fix(channels): keep account resolvers safely destructurable
2026-07-27 03:49:37 -04:00
Peter Steinberger
e9990b818a feat(cli): add models auth logout (#114407) 2026-07-27 03:48:27 -04:00
Peter Steinberger
498a2caaf2 fix(models): keep dynamic model lists consistent across CLI and Gateway (#114393)
* fix(models): unify prepared catalogs and safe migration

* refactor(models): remove obsolete prepared catalog paths
2026-07-27 03:46:56 -04:00
Peter Steinberger
3c67fcc45d fix(release): stabilize beta validation and completion (#114396)
* test(release): fix rebased validation gates

* test(migrate-hermes): use canonical auth store fixture

* test(secrets): reset runtime state before migration isolation

* test(secrets): reload singleton graph for migration isolation

* test(secrets): isolate auth migration state

* fix(release): return completed validation run

* docs: refresh docs map after forward-port
2026-07-27 03:42:00 -04:00
Peter Steinberger
d4ed57bc88 docs(agents): note null-delimited file lists for tool invocations 2026-07-27 00:29:16 -07:00
Yuval Dinodia
0017566618 fix(acp): keep ACP turns alive when a backend rejects the requested thinking level (#113935)
* fix(acp): keep ACP turns alive when a backend rejects the requested thinking level

ACP sessions carrying a thinking level the backend cannot express died before
their first turn. Pre-turn control application forwarded the persisted thinking
option to the backend-advertised effort key, and a rejected value aborted the
whole turn with ACP_TURN_FAILED.

The skip path for thinking config rejections only matched the
ACP_BACKEND_UNSUPPORTED_CONTROL code, which OpenClaw mints for keys a backend
does not advertise. Backends that advertise the key but reject the value answer
with a JSON-RPC error instead, so the skip never fired and the optional control
became fatal. Thinking rejections now match the same rejection signals the
sibling timeout control already tolerates, including invalid-value answers.
Required controls and genuine runtime failures still fail the turn.

* fix(acp): narrow thinking rejection fallback

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-27 03:25:43 -04:00
Peter Steinberger
97467fe73b refactor(gateway): consolidate RPC test scenarios (#114404) 2026-07-27 03:25:22 -04:00
Peter Steinberger
079ac9390d refactor(ios): simplify node and Watch lifecycle ownership (#114366)
* refactor(ios): centralize node lifecycle owners

* fix(ios): sync native localization source inventory

* test(ios): prove gateway and notification lifecycles in simulator

* fix(ios): preserve voice upgrade and correlate watch snapshots
2026-07-27 03:23:31 -04:00
Peter Steinberger
0cc0a100ee refactor(cron): split oversized modules, retire max-lines suppressions, behavior-name regression suites (#114391)
* refactor(cron): split oversized modules

* test(cron): consolidate regression suites

* refactor(cron): keep delivery outbound loader module-private
2026-07-27 03:22:51 -04:00
Peter Steinberger
eec2c0cc26 refactor(providers): unify lifecycle-safe manifest registration (#114381)
* refactor(providers): canonicalize manifest-driven registration

* fix(zai): eliminate type-only SDK import side effects
2026-07-27 03:20:02 -04:00
Peter Steinberger
65cce37480 fix(codex): keep user-home app-servers on native Codex auth (#114397)
A prepared OpenClaw auth handoff was still resolved for connections that
target the operator's native Codex home, so every turn failed with
"Prepared Codex auth requires an isolated app-server home." once a stored
OpenAI profile produced a prepared model route. User-home mode now keeps
its native account for both subscription and Platform routes, matching the
documented contract; the shared-client guard stays as the backstop.
2026-07-27 03:19:06 -04:00
Peter Steinberger
24e6d5edd7 fix(ui): recover offline-selected locales once the gateway reconnects (#114378)
* fix(ui): retry offline-failed locale loads when the gateway reconnects

* fix(ui): recover offline-failed locale loads via guarded stale-chunk reload

* test(ui): isolate locale retry tests from the i18n singleton cache

* test(ui): move locale manager test factory to test-support
2026-07-27 03:18:02 -04:00
Fede Kamelhar
cc027149e5 security fix(agents): close symlink-then-.. workspace boundary bypass in assertSandboxPath (#113405)
* fix(agents): close symlink-then-.. workspace boundary bypass in assertSandboxPath

resolveSandboxPath builds on path.resolve, which collapses ".." lexically
before any symlink is resolved. When a "<symlink>/.." sequence appears, the
lexical collapse lands on a harmless in-root path while the OS resolves the
same raw string (symlink first, then "..") to a location outside the
workspace, so assertSandboxPath approved inputs whose real resolution escaped
the boundary.

Add assertRawParentWithinRoot: it resolves the raw (non-collapsed) parent
chain via the OS realpath (fs.realpath.native; the JS realpath and
path.resolve both pre-collapse "..") and asserts it stays inside the
workspace root. It runs after assertNoPathAliasEscape so that guard's more
specific messages still win for cases it already catches, adding coverage only
for the residual gap it never sees.

Not currently reachable through shipped tools (read/write/edit route I/O
through fs-safe Root, which opens its own collapsed path; other callers use
the returned .resolved) -- this hardens the validator so the boundary no
longer depends on caller discipline. Regression test included.

* fix(agents): simplify raw sandbox path guard

* fix(agents): preserve symlinked sandbox roots

* fix(agents): validate raw final path aliases

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-27 03:15:59 -04:00
Peter Steinberger
3e4c57dbeb fix(onepassword): resolve secret refs under Bun by dropping execa buffer encoding (#114346) 2026-07-27 03:15:17 -04:00
Peter Steinberger
3a4f337802 fix(gateway): connect first-boot loopback agents after readiness (#114380)
* fix(gateway): pair local CLI before runtime-token readiness

* docs(gateway): explain first-boot loopback CLI auth

* fix(gateway): keep startup pairing result internal

* chore(gateway): leave release note to release process
2026-07-27 03:15:12 -04:00
Peter Steinberger
1fe66e0fe8 fix(ui): guard empty catalog refresh responses (#114394) 2026-07-27 03:09:25 -04:00
Peter Steinberger
7ad7cf8b0f refactor(sessions): unify canonical SQLite lifecycle and transcript projection (#114369)
* refactor(sessions): unify canonical SQLite lifecycle and transcript projection

* fix(sessions): ratchet eliminated transcript accessor debt
2026-07-27 02:59:08 -04:00
Peter Steinberger
b461ae6de8 test(model-catalog): cover normalization and routing boundaries (#114384) 2026-07-27 02:56:59 -04:00
Peter Steinberger
b34c19632f refactor(daemon): split Windows task scheduler integration (#113783)
* refactor(daemon): split Windows task scheduler integration

* refactor(daemon): keep split helpers private

* refactor(daemon): remove superseded schtasks script module
2026-07-27 02:55:23 -04:00
Pavan Kumar Gondhi
33f44caa5d fix: restrict QQBot quoted context [AI] (#114136)
* fix: restrict qqbot quoted context

* fix: narrow qqbot bot quote exemption

* test: use valid qqbot ingress reasons

* fix: honor narrowed qqbot open dm quotes

* fix: honor narrowed qqbot open group quotes

* test: use valid qqbot blocked ingress decisions

* fix: honor qqbot quote visibility mode

* docs: mention qqbot context visibility

* fix: validate qqbot context visibility config

* fix: hide denied qqbot quote sender

* test: avoid unbound qqbot access mock

* test: allow auth migration isolation to finish

* Revert "test: allow auth migration isolation to finish"

This reverts commit f2b9a4f5e9.
2026-07-27 12:23:21 +05:30
Peter Steinberger
9a0fa8f375 fix(ui): back off unavailable session PR polling (#114266)
* fix(ui): back off unavailable session PR polling

The sidebar PR indicators iterated worktree rows sequentially; each ~68ms
UNAVAILABLE reply immediately advanced to the next row, hammering
controlUi.sessionPullRequests at ~14 calls/second forever (the method is
advertised while its runtime dependency is down, so the advertised-method
gate never stopped it).

Route all callers through GatewayBrowserClient.requestSessionPullRequests:
a non-retryable UNAVAILABLE latches until the next socket hello; retryable
failures back off 30s doubling to 5min, honoring longer server retry hints.
A generation counter keeps concurrent rows from multiplying one outage wave.

* fix(ui): satisfy test-types and knip lanes

Type the PR-indicator request mocks with real signatures instead of bare
vi.fn shells, and keep GatewaySessionPullRequestsParams module-local until a
second consumer exists.

* test(ui): route hydration stubs through the PR latch wrapper

* chore(ui): drop unused ControlUiSessionPullRequests re-export

* test(ui): stub the PR latch wrapper in sidebar and clobber fixtures
2026-07-27 02:49:45 -04:00
Peter Steinberger
dda4883a4c fix(auto-reply): prevent duplicate rewritten-command replies (#114379)
* fix(auto-reply): dedupe settled block finals

* chore: leave release note to release flow
2026-07-27 02:49:23 -04:00
ClawSweeper
5b58d8540d fix(ui): new sessions remember valid workspace and model choices (#113884)
* fix(ui): remember new session selections

* fix(ui): repair stale new session folder preference

* fix(ui): clear node cwd when switching agents

* fix(ui): revalidate remembered model selections

* fix(ui): repair moved workspace preference

* fix(ui): anchor stale folder errno detection

* fix(ui): wait for remembered session choices

* fix(ui): satisfy new session preference contracts

* fix(ui): persist early folder for resolved agent

* fix(ui): anchor stale folder errno detection

* fix(ui): repair rejected workspace worktree preference

* test(ui): narrow new session request params

* fix(ui): keep an unusable remembered worktree from blocking submit

* test(ui): wait for the committed chat route before leaving it

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-27 02:47:09 -04:00
Pavan Kumar Gondhi
af7b0708aa fix: block unsafe workspace dotenv controls [AI] (#114133)
* fix: block unsafe workspace dotenv controls

* fix: narrow workspace dotenv control blocking

* fix: narrow dotenv token matching

* fix: scope dotenv access control keys

* fix: block bedrock bearer dotenv key

* fix: block bedrock credential dotenv keys

* test: split dotenv blocklist coverage

* fix: block aws sdk dotenv controls

* fix: block aws credential provider dotenv controls

* fix: block aws credential metadata dotenv controls
2026-07-27 12:15:31 +05:30
Peter Steinberger
a731397ea1 refactor: unify doctor repairs and configure setup (#114375) 2026-07-27 02:42:09 -04:00
Peter Steinberger
2242b968b3 fix(tui): prevent duplicate session rollover after stale terminal redraw (#114373)
* test(tui): make real session rollover deterministic

* test(tui): satisfy typed deferred lint
2026-07-27 02:40:43 -04:00
Peter Steinberger
3796a45911 fix(release): keep advisory summaries portable on macOS (#114371) 2026-07-27 02:38:11 -04:00
Peter Steinberger
0f68118176 fix(ci): run Testbox validation when draft PRs become ready (#114372) 2026-07-27 02:36:36 -04:00
Peter Steinberger
054495d16d fix(ci): verify stale bugs before closure (#114365) 2026-07-27 02:25:15 -04:00
Peter Steinberger
fee6db765d fix(openai): prevent onboarding from offering unavailable account models (#114356)
* fix(openai): keep account models and onboarding release proof authoritative

* fix(openai): document configured model catalog authority
2026-07-27 02:23:50 -04:00
Peter Steinberger
604f379203 perf: collapse board.get store reads (#114363) 2026-07-27 02:21:12 -04:00
Peter Steinberger
390f46d042 fix(agents): preserve fallback route provenance (#114360)
Co-authored-by: 1052326311 <65798732+1052326311@users.noreply.github.com>
2026-07-27 02:20:56 -04:00