Commit Graph

79331 Commits

Author SHA1 Message Date
Peter Steinberger e7255b9e8c test(cli): remove duplicate skills verify error case (#123843) 2026-08-14 14:33:48 -07:00
ClawSweeper 4fd825bc0a fix(ui): contain mobile lightbox images (#123840)
Co-authored-by: RoboClaw <309084314+roboclaw-bot@users.noreply.github.com>
2026-08-14 14:32:36 -07:00
Peter Steinberger 6072a838a1 fix(anthropic): read keychain auth during non-interactive setup (#123839) 2026-08-14 14:31:15 -07:00
Peter Steinberger 9f125bcee0 perf(test): import package manifest helper directly (#123841) 2026-08-14 14:27:29 -07:00
Peter Steinberger 628056b0ba docs(plan): W2-PKB landed (#123801) (#123838) 2026-08-14 14:26:18 -07:00
Jason (Json) 204416747e fix: prevent sqlite commands from opening live state (#123816)
* fix: prevent sqlite commands from opening live state

* fix: preserve early exec control rejection

* fix: guard sqlite shell reopen commands
2026-08-14 15:19:27 -06:00
Peter Steinberger 4613eeda34 test(plugins): remove duplicate policy reevaluation case (#123836) 2026-08-14 14:17:42 -07:00
Josh Lehman 1c7f1c173c fix: avoid compaction path false positives (#123832) 2026-08-14 14:15:33 -07:00
ClawSweeper c12745429a fix(ui): fork active sessions from stable history (#123718)
* fix(ui): fork active sessions from stable history

* fix(protocol): align active fork types

* test(ui): match main-session fork routing

* fix(sessions): unify stable fork admission

* fix(native): fork active sessions from stable history

* fix(android): fork active sessions from stable history

* style(android): simplify active fork result handling

* fix(native): preserve legacy fork transport API

* test(native): complete legacy fork transport stub

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-14 14:13:25 -07:00
Peter Steinberger 4a6edc0d27 feat(macos): fulfill computer.act v2 via Peekaboo (#123801) 2026-08-14 14:12:25 -07:00
Peter Steinberger b3f1cd36db fix(status): keep multi-agent diagnostics owner-safe (#123826)
* fix(status): preserve explicit multi-agent inventory ownership

* chore: leave changelog to release automation
2026-08-14 14:10:23 -07:00
Peter Steinberger 3c5e2ff296 fix(gateway): retire worker placements without sessions (#123785)
* fix(gateway): retire placements without sessions

* fix(gateway): preserve unreadable placement evidence

* fix(gateway): drain placement retirement on shutdown

* test(sessions): auto-clean identity probe temp dirs

* fix(gateway): join placement sidecar shutdown
2026-08-14 14:07:24 -07:00
Peter Steinberger bf70d5ddb6 refactor(ai): remove Responses replay test seams (#123825) 2026-08-14 14:05:36 -07:00
Peter Steinberger 3dff1727b1 fix(control-ui): give chat links a contrast-safe color token (#123824)
chat links used --accent while user bubbles are filled from --accent-subtle (and peer bubbles from a per-sender hue), so links sat on their own hue at 3.95:1 worst case. New --link/--link-hover tokens derive from each palette's audited --accent-hover and clear WCAG AA on every bubble surface and sender hue; the hover opacity fade, which lowered contrast, is replaced by a color shift.
2026-08-14 14:03:28 -07:00
Jason (Json) fe6b0237d8 fix: recover OpenAI sessions with backup auth profiles (#123791)
* fix(agents): rotate auth after native harness failures

* fix(agents): satisfy auth failover gates
2026-08-14 14:49:42 -06:00
Peter Steinberger ed4ca3aea7 perf(test): reuse LAN node pairing gateways (#123821) 2026-08-14 13:47:23 -07:00
Peter Steinberger ae385f3c6b test: remove obsolete QR dashboard integration suite (#123819) 2026-08-14 13:44:20 -07:00
Vyctor H. Brzezowski dc8facb060 improve(ui): explain the Utility model setting (#123277)
* improve(ui): explain utility model setting

* fix(ui): anchor utility model help above trigger
2026-08-14 17:43:52 -03:00
Peter Steinberger af3118b187 fix(install): propagate Linux build-tool failures instead of claiming success (#123817)
install_build_tools_linux ran run_quiet_step and then returned 0
unconditionally from every package-manager branch, so a failed build-tool
install was printed as an error and immediately overwritten with a success
line. The installer emitted "Installing build tools failed" followed by
"Build tools installed", and the caller's "Continuing without auto-installing
build tools" warning was unreachable. The npm-failure recovery path likewise
reported "Build tools setup complete" and retried an install that could not
succeed. install_build_tools_macos already propagated its status; only the
Linux sibling swallowed it.

Return the package manager's exit status and collapse the five duplicated
is_root/sudo branches into one command list, which removes the bug class
rather than patching a single branch.

Verified against the live openclaw.ai script: a stubbed apt-get failure
reproduced the false success before the change and reports the honest warning
after it.
2026-08-14 13:41:17 -07:00
Peter Steinberger a96d1359dd fix(approvals): sanitize plugin titles and exec paths at the creation boundary (#123742)
* fix(approvals): sanitize plugin titles and exec paths at the creation boundary

Plugin approval title/description/detail were stored raw and flowed
unescaped into channel messages, iOS lock-screen push, and the web modal —
bidi/invisible characters could spoof what the operator approves. Exec
approvals already sanitize command text at creation; mirror that for the
plugin request and for exec's display-only cwd/resolvedPath fields.
Re-check the protocol size caps after escaping so a spoof-heavy title fails
as INVALID_REQUEST instead of a misleading registration throw.

* fix(gateway): sanitize node-policy plugin approvals through the same boundary

The node-policy approval runtime truncated title/description but never
sanitized them, so the identical broadcast/forwarder/push paths stayed
spoofable through this sibling creator (ClawSweeper P1 finding). Normalize
first so a whitespace-only title still fails closed at register.

* fix(approvals): sanitize plugin metadata and cap stored detail

ClawSweeper follow-ups: pluginId/toolName/fallback agentId are interpolated
into channel approval text and were stored raw; the stored detail skipped
the 16,384 cap the durable presentation applies, so escape expansion could
exceed it. Sanitize the metadata at the same boundary (host-minted runtime
identity stays authoritative) and cap detail at storage.

* fix(gateway): sanitize node-policy approval metadata too

toolName and fallback agentId from node-policy code are interpolated into
channel approval text; escape them like the RPC ingress. Host-minted
runtime identity values stay authoritative.

* fix(approvals): normalize exec policy enums and escape host at creation

security/ask are closed enums — arbitrary strings now null out via the
canonical normalizers instead of reaching reviewer meta rows; host gets the
display escape (identity for valid values). nodeId/agentId/sessionKey stay
raw by design: they are matched against the node registry and session
routing, noted inline.
2026-08-14 13:38:27 -07:00
Peter Steinberger 8cd749f2ed fix(matrix): authenticate channel probes (#123766) 2026-08-14 13:32:16 -07:00
Vyctor H. Brzezowski b90001934a fix(ui): keep the chat header blend off the transcript scrollbar (#123308)
The header-to-transcript blend spanned the full pane width, so it painted over the strip where the transcript scrollbar lives and the thumb vanished under the fade while scrolling. Stop the blend one transcript gutter short of both pane edges and make that gutter a token shared with the transcript column, which keeps every pixel of content faded while the scrollbar stays visible (symmetric so RTL keeps the same clearance).
2026-08-14 17:30:05 -03:00
Peter Steinberger afb3b9defb fix(worker): surface gateway admission failures (#123773)
* fix(worker): surface admission retry failures

* fix(worker): ignore cancellation connection errors
2026-08-14 13:29:36 -07:00
Peter Steinberger b822e6e425 refactor(github): consolidate guard display sanitization (#123620) 2026-08-14 13:29:21 -07:00
Peter Steinberger 44fe1b15a3 test: trim compact command leftovers (#123810) 2026-08-14 13:29:00 -07:00
Peter Steinberger 58ab589da5 fix(ui): stale tabs restore terminals without owners (#123660)
* fix(ui): fence stale same-version clients by build

* test(ui): satisfy build identity lint guards

* fix(ui): complete build identity fencing

* chore: leave release notes to release prep

* test(ui): align build identity fixtures

* fix(ui): fence reconnects on pending worker

* test(ui): stabilize cross-platform update proof

* test(ui): satisfy service worker lint

* test(ui): preserve offline socket cohorts
2026-08-14 13:19:02 -07:00
Peter Steinberger 15bf43fe19 fix(node-host): prevent false TLS mismatch after turns (#123790)
* fix(node-host): avoid resumed TLS pin mismatches

* test(node-host): cover pinned replacement sockets

* fix(node-host): preserve proxy routing for pinned transfers

* test(node-host): type proxy tunnel cleanup generically
2026-08-14 13:05:28 -07:00
Peter Steinberger 7c977e0f84 perf(ci): cut hosted CI critical path toward five-minute walls (#123780)
* perf(ci): cut hosted CI critical path toward five-minute walls

Stripe the serial core test-type graphs across two hosted jobs and drop the
duplicated tsgo:test:root pass; gate the six-part QA Smoke matrix off pull
requests unless a QA-owned surface changed; split the fat multi-config Node
shards (cli/cli-process, unit-fast isolated/fake-timers, infra
logging-process/runtime-config) and lower the hosted split ceiling to 150
predicted seconds so no compact lane owns a ~280s wall; expand tooling to
seven stripes.

* perf(ci): widen hosted test-type striping to three jobs

Run 31825922122 measured ~40s per core test-type graph on loaded hosted
runners (282s worst stripe body of the two-way split); three stripes keep
each lane near 150s body under load.
2026-08-14 13:03:52 -07:00
Peter Steinberger 1de6311a99 fix(cli): keep Doctor machine-output failures on stdout (#123752)
* fix(cli): keep Doctor JSON failures on stdout

* fix(cli): cover Doctor JSON selector errors

* fix(cli): route Doctor maintenance JSON errors

* fix(cli): redact Doctor machine errors

* refactor(cli): reuse Doctor error formatting
2026-08-14 12:58:45 -07:00
Peter Steinberger 36c440aa2b fix(cli): sanitize stored strings in directory, cron show, agents, channels, and sessions output (#123797)
* fix(cli): sanitize stored strings in table surfaces

* fix(cli): use resolved identity agent id

* test(cli): keep cron delivery status typed

* test(cli): assert agent JSON non-sanitization without path equality
2026-08-14 12:52:57 -07:00
Peter Steinberger 13fee42c08 fix(cua): keep driver endpoint env private (#123798) 2026-08-14 12:52:33 -07:00
Peter Steinberger 3744af3d44 improve(mac): guard elevation signing identity against drift (#123764)
scripts/mac-elevation-host.sh ships as the portable installer added in
#123675, so it is deliberately self-contained and cannot source shared
constants. That forces it to duplicate ELEVATION_TEAM_ID and
ELEVATION_IDENTITY from scripts/codesign-mac-app.sh, with nothing keeping
the two copies in sync. Add a test asserting they agree, so rotation drift
fails at build time instead of on a target Mac.

Also document why the sign-time and install-time elevation verification
functions both exist: verify_elevation_app requires a notarized and stapled
bundle, so it cannot replace the sign-time check, and deleting that check
would defer every identity failure until after a notarization submission is
already spent.

No behavior change: no artifact bytes, filenames, modes, receipt fields,
signing, notarization, or install paths are touched.
2026-08-14 12:50:57 -07:00
Peter Steinberger 80e046d30e fix(cron): show skipped automation tasks as failed (#123787)
* fix(cron): report skipped runs as failed tasks

* test(cron): align skipped task expectations

* fix(cron): keep skipped tasks failed
2026-08-14 12:42:51 -07:00
Peter Steinberger 986be4558f fix(ui): prevent duplicate Skills preload requests (#123705)
* fix(ui): wait for Skills route preload

* fix(ui): defer Skills fallback until first update

* fix(ui): keep Skills unmounted during preload

* fix(ui): retain route data through gateway metadata updates

* test(ui): make Skills preload race deterministic

* fix(ci): round boundary artifact refresh mtimes

* fix(ci): repair merged main checks

* chore: keep Skills repair diff focused
2026-08-14 12:41:24 -07:00
Peter Steinberger 1805e8eec3 fix(ui): surface auto-disabled automations instead of hiding them as paused (#123769)
An auto-disabled job (10 consecutive run failures / 3 schedule errors)
rendered as plain 'Paused' and simultaneously vanished from the failed
chip, the failing count, and the error dot — the escalation removed
visibility exactly when the problem became permanent. The recorded fact
(state.autoDisabled, already public and used by CLI/doctor) now renders as
a distinct danger note with the reason and count, and auto-disabled jobs
stay in the active-failure predicate.
2026-08-14 12:39:03 -07:00
Peter Steinberger 3289e08c30 fix(ci): repair red merge-ref gates (dead CLI wrapper, oversized test file) (#123794)
* chore(cli): drop unused resolveClawHubTargetWorkspaceDir

#116489 migrated its last callers to resolveClawHubTargetWorkspace but left
the wrapper, failing check-prod-types (TS6133) on every merge-ref CI run.

* test: split dedupe maintenance suite below the max-lines cap

server-maintenance.test.ts crossed the 1000-counted-line test cap when
#123642 added payload-retention coverage, failing check-lint-core-2 on
every merge-ref CI run. Move the dedupe TTL/overflow block into a themed
sibling; module mocks are hoisted per file so the mock preamble is
repeated while fixtures stay local. Test parity 41 = 41.
2026-08-14 12:01:11 -07:00
Peter Steinberger 4af3a85385 fix(cli): drop orphaned ClawHub workspace-dir helper
#123761 removed the last caller of resolveClawHubTargetWorkspaceDir; the
stranded helper fails tsgo prod types (TS6133) and lint on every main push
since 877f2ec083.
2026-08-14 11:59:30 -07:00
Peter Steinberger c6b3394602 docs(plan): computer-use campaign plan (CUA + Peekaboo behind computer.act v2) (#123464)
* docs(plan): computer-use campaign plan — two-provider background computer use (CUA + Peekaboo) behind computer.act v2

* docs(plan): resolve W0-PIN — pinned 0.19.3 already contains inherited IPC and consent adapter

* docs(plan): W0 complete — parity fixtures landed (#123469)

* docs(plan): W1-SEAM landed (#123509)

* docs(plan): W1 complete — v2 contract landed (#123544)

* docs(plan): W2-CUA landed (#123604)

* docs(plan): W2-MAC landed (#123635)

* docs(plan): note picker screenshot evidence belongs to W2-UX

* docs(plan): avoid inline-html placeholder in tracker note
2026-08-14 11:37:11 -07:00
Peter Steinberger 877f2ec083 fix(ui): report connection loss instead of silently dropping session actions (#123771)
* fix(ui): report connection loss instead of silently dropping session actions

patchSession returned 'stale' with no message when the gateway dropped
before a queued dialog submit (rename and similar) — the dialog closed and
the edit vanished with no visible outcome. loadCheckpoint had the sibling
gap: expanding a row while disconnected left the drawer claiming 'No
checkpoints' beside a nonzero checkpoint badge. Both now surface the
existing actionRequiresConnection message at their owning error surface.

* test: widen patchSession test-support patch type for label patches
2026-08-14 11:33:47 -07:00
Peter Steinberger 0bdf11c9dc fix(ui): surface companion clear failures (#123724)
* fix(ui): surface companion clear failures

* fix(ui): scope companion reset errors

* fix(ui): preserve companion clear async contract
2026-08-14 11:30:26 -07:00
Peter Steinberger f22e4990c1 fix(ui): surface Talk input backpressure (#123783) 2026-08-14 11:27:13 -07:00
Peter Steinberger da7a2b4651 fix(ui): show session attention on Home (#123759)
* fix(ui): show main-session attention on Home

* refactor(ui): keep Home attention boundary private
2026-08-14 11:27:04 -07:00
Peter Steinberger 17eb646bb3 refactor(ai): consolidate Responses replay paths (#123762)
* refactor(ai): consolidate Responses replay ownership

* refactor(codex): consolidate completion plumbing

* refactor(agents): centralize replay pairing repair

* refactor: preserve replay static contracts
2026-08-14 11:20:57 -07:00
Peter Steinberger c4b92d9a7a fix(ui): stop turn recap freezing the previous run's token count (#123712)
The session row's terminal stamp (status/endedAt/runtimeMs) and its usage
persist (outputTokens) are separate gateway writes. resolveTurnRecap settled
on the first fresh terminal row and froze whatever outputTokens it carried —
frequently the PREVIOUS turn's count. Treat an unchanged-from-baseline value
as that lag and fall back to the watched run's live usage-stream counter
(captured while watching, since the usage map entry dies at lifecycle end).
2026-08-14 11:18:18 -07:00
Jason (Json) 83356361b3 fix: keep phone Control UI recovery out of node pairing (#123767)
* fix(skills): separate browser and node pairing

* fix(skills): keep pairing secrets out of transcripts
2026-08-14 12:17:33 -06:00
scotthuang 79a4d512d4 fix: send follow-ups after background transcript updates (#121332)
* fix(gateway): allow sends after linear transcript advance

* fix(gateway): keep active-path check internal

* fix(gateway): fence exact leaves by session generation

* test(gateway): use canonical branch-switch key

* refactor: consolidate active path relation reader

---------

Co-authored-by: scotthuang <scotthuang@tencent.com>
Co-authored-by: fuller-stack-dev <263060202+fuller-stack-dev@users.noreply.github.com>
2026-08-14 12:13:01 -06:00
Vyctor H. Brzezowski 3f006ba0fc fix(ui): complete mobile pairing after code redemption (#120933)
* fix(ui): complete pairing setup lifecycle

Redeemed and expired mobile setup codes stayed on screen as usable QR
codes, so a successful pairing had no visible outcome and expired bearer
material still looked live.

The Gateway now mints an opaque, non-authorizing setupId beside each
setup credential, returns its authoritative expiresAtMs, records the
terminal outcome of the exact redemption, and broadcasts
device.pair.setup.completed. Because that broadcast is dropped for
buffered operator sockets, the completion is persisted first and can be
reconciled through the new device.pair.setupStatus method: the Control UI
asks for the recorded outcome before it may present a credential as
expired, so a pairing that succeeds is never shown as a failure.

The Control UI models one closed lifecycle (selection, loading, waiting,
success, expired, error) correlated only by the active setupId, and
Pairing help now carries the external-link affordance.

* fix(ui): preserve unknown pairing outcomes

* test(ui): target pairing terminal headings

* test(ui): align pairing completion fixture

* fix(gateway-protocol): decode setup-code results from older gateways

Older protocol-v4 gateways omit the new setupId and expiresAtMs
lifecycle fields, so requiring them in the generated native model broke
decoding an existing device.pair.setupCode response. Keep both optional
at the wire boundary, require lifecycle metadata before the Control UI
enters its waiting state so a missing outcome stays visible, and cover
the legacy payload with Swift and schema regressions.

* fix(ui): surface rejected pairing dialog loads

The lazy pairing chunk could reject while its overlay was already open,
leaving the shell rendering nothing at all. Record the rejection on the
shell and render a recoverable modal with a reason and a retry so the
open action always ends in a visible outcome.

* fix(state): preserve pairing setup schema compatibility

* test(gateway): cover pairing setup release train

* fix(gateway): commit pairing setup completion atomically

* refactor(state): distinguish setup transaction helpers

* refactor(state): remove obsolete bootstrap restore path

* fix(gateway): preserve setup handoff type safety

* fix(gateway): keep pairing completion terminal after consume

* fix(gateway): validate Watch binding during setup commit

* fix(gateway): revalidate setup credential expiry at commit

* chore: refresh Plugin SDK API contracts after rebase

* fix(pairing): prune expired setup completions

* chore: retrigger CI

* fix(protocol): deduplicate setup expiry field

* fix(protocol): refresh pairing setup clients

* fix(gateway): make pairing setup completion durable

* fix(ui): retire expired pairing credentials immediately

* fix(ui): keep pairing dialog visible while loading

* fix(macos): align setup result initializer order

* fix(gateway): restore generic bootstrap retries

* chore(ui): record pairing startup budget

* chore(ui): refresh pairing startup budget

* style(gateway): format maintenance imports

* test(gateway): cover session-sharing mock

* fix(state): defer setup correlation schema

---------

Co-authored-by: Patrick Erichsen <patrick.a.erichsen@gmail.com>
2026-08-14 11:10:30 -07:00
Peter Steinberger 88babc4643 test(ui): stabilize update confirmation focus proof (#123757)
* test(ui): wait for update dialog focus

* test(ui): poll update confirmation focus
2026-08-14 11:09:03 -07:00
Peter Steinberger 3292ff146c fix(ui): keep the archive Undo working after leaving the Sessions page (#123749)
The archive toast outlives the Sessions page (toast host is app-shell
level), but its Undo action was gated on the page's request scope, which
dies the moment the operator navigates away — clicking Undo within the 6s
window then silently did nothing. Run the un-archive through the shared
sessions mutations store directly (it already fails closed on connection
replacement and publishes errors), mirroring the always-mounted sidebar
undo sibling.
2026-08-14 11:09:02 -07:00
Peter Steinberger b9cf0bb96f fix(macos): package apps from paths with glob characters (#123751)
* fix(macos): handle metacharacters in framework paths

* fix(ci): round boundary artifact refresh mtimes
2026-08-14 11:08:35 -07:00