Commit Graph

67758 Commits

Author SHA1 Message Date
Peter Steinberger
e98c7dfbcb feat(cloud-workers): session placement, dispatch, and worker turn routing (#106332)
* feat(gateway-protocol): add session placement schema

Closed state discriminator for session execution placement (local/requested/provisioning/syncing/starting/active/draining/reconciling/reclaimed/failed), sessions.dispatch params, and worker-admission transcript/live cursor extensions. Swift protocol models mirror the schema.

* feat(state): add worker session placement table

worker_session_placements rows carry placement state, transition generation, worker ownership metadata, ACK cursors, and the turn claim columns used for atomic admission.

* feat(cloud-workers): add durable placement state machine store

SQLite-backed placement store split by concern: state table (placement-state), discriminated record types + shape invariants (placement-record), row codec + CAS transition values (placement-row-codec), atomic turn-claim admission/release/waiters (placement-turn-claims), and lifecycle CAS transitions (placement-store).

* feat(cloud-workers): sync workspaces and attach sessions to worker environments

Environment service session attachment + turn credentials, tunnel workspace commands over a dedicated SSH runner, and git/plain workspace sync into $HOME/.openclaw-worker/workspaces with an immutable manifest. Symlink escapes are rejected locally before transfer (macOS openrsync stat-fails them opaquely) and again by the remote manifest guard.

* feat(worker): run one-shot embedded turns from launch descriptors

Worker runtime executes a single embedded turn from a stdin launch descriptor and reports completed/failed/fenced on stdout for the gateway launcher. Terminal lifecycle live events are deferred past the final transcript flush; transcript projection helpers are shared via transcript-message instead of duplicated in the runtime.

* feat(cloud-workers): dispatch placements and route worker turns

Dispatch service drives local->requested->provisioning->syncing->starting->active with failure teardown (placement-dispatch-failure) and restart/runtime recovery incl. lost-worker reclaim (placement-dispatch-recovery). Worker turn launcher claims the placement turn atomically, builds a windowed launch descriptor (worker-turn-payload), runs the remote one-shot worker, and reconciles the committed transcript; agent runners route turns through the session placement admission provider.

* feat(gateway): expose session placement RPCs and startup reconciliation

sessions.dispatch RPC with lifecycle admission barriers, operator-facing placement projection on session listings, placement-aware session reset guard, and startup/interval reconciliation wiring for worker placements.
2026-07-13 08:03:53 -07:00
Peter Steinberger
06b27b9e1d chore(i18n): realign native artifacts after rebase 2026-07-13 08:02:56 -07:00
Peter Steinberger
2c8306a5be improve(android): make gateway QR pairing prominent in Settings
Mirror the iOS gateway settings ordering: nav-bar QR scan action,
Scan QR to Pair hero while unpaired, one Add Gateway panel (scan,
setup code + connect, discovered gateways with per-row connect),
paired gateways below, manual host/credential plumbing at the bottom.
Add facts rows (Discovered, Default Agent, Agents, Instance ID) and a
Diagnose action, plus a deterministic 'gateway' screenshot scene.

Closes #106186
2026-07-13 08:02:56 -07:00
Peter Steinberger
1b615a3985 chore(i18n): translate android gateway settings strings 2026-07-13 08:02:56 -07:00
Peter Steinberger
d323e421c8 refactor(agents): trim fast-mode re-exports (#106463) 2026-07-13 08:00:58 -07:00
Peter Steinberger
f110687cfe refactor(ui): align plugin filter chips with the hub tab strip (#106168)
* refactor(ui): align plugin filter chips with the hub tab strip

Drop the segmented inventory meter above the installed filters and
restyle the filter chips to match the tab strip above them: same
radius, hover, active fill, and count badges. Removes the unused
pluginsPage.pulseLabel key and prunes generated locales.

* ci: trigger PR checks
2026-07-13 08:00:35 -07:00
Peter Steinberger
ab7f6dd3c9 refactor(deadcode): trim policy private exports (#106290) 2026-07-13 07:58:12 -07:00
Peter Steinberger
2ab8cbc66b refactor(config): simplify channel schema loading (#106462) 2026-07-13 07:57:23 -07:00
Vincent Koc
69554995c1 refactor(logging): privatize timezone validation helper (#106459) 2026-07-13 22:55:27 +08:00
WhatsSkiLL
af854dcf50 fix(android): command palette title appears off-center (#106264)
* fix(android): center command palette title

* fix(i18n): sync native app inventory

---------

Co-authored-by: IWhatsskill <284122573+IWhatsskill@users.noreply.github.com>
Co-authored-by: Colin Johnson <colin@solvely.net>
2026-07-13 10:54:44 -04:00
Peter Steinberger
111e84af43 fix: show Sessions custom-group failures (#106451)
* fix(ui): surface Sessions group mutation failures

* refactor(ui): split session group mutation helpers
2026-07-13 07:52:08 -07:00
Shakker
ee80377a22 fix: keep lobster pet above sidebar footer (#106457) 2026-07-13 15:49:48 +01:00
Peter Steinberger
96522b9fce refactor(commands): trim internal helper exports (#106455) 2026-07-13 07:49:09 -07:00
Peter Steinberger
f167089d61 feat(nodes): continue Claude catalog sessions on paired nodes via streaming CLI agent runs (#105833)
* feat(gateway): stream node.invoke progress with idle timeouts and cancel

* feat(node-host): opt-in approval-gated claude cli agent run command

* feat(agents): run node-placed claude-cli turns through streaming node invoke

* feat(anthropic): continue claude catalog sessions on advertising nodes

* docs(nodes): document paired-node claude agent runs and continuation

* chore(plugin-sdk): admit spawn-invocation helper into surface budget

* fix(nodes): harden streaming invoke and node run policy from review findings

* test(node-host): prove multi-token tool-policy argv fails closed

* fix(nodes): allowlist cancel event for apps and break node-host type cycle

* chore(protocol): regenerate Swift gateway models for node invoke progress

* chore(node-host): drop test-only export surface flagged by deadcode ratchet

* style(node-host): merge invoke-types imports

* refactor(nodes): split node agent run modules to satisfy the LOC ratchet

* chore(protocol): regenerate android gateway models and sync export baseline

* chore(plugin-sdk): admit spawn-invocation helper and inherited deprecated drift into surface budget

* chore(plugin-sdk): tolerate inherited agent-core deprecated export

* fix(anthropic): drop node param parser orphaned by upstream catalog split

* ci: sync unused-export baseline with healed main

* test(agents): adopt renamed cli backend prepare helper

* style(node-host): format claude run spawn invocation

* ci: retrigger checks

* chore(plugin-sdk): pin surface budgets to healed-base counts

* fix(protocol): restore untyped lazy validators after upstream style change
2026-07-13 07:39:22 -07:00
Vincent Koc
1b43d71440 refactor(channels): privatize approval channel list (#106447) 2026-07-13 22:35:26 +08:00
Peter Steinberger
0e96fc7e10 refactor(agents): trim bootstrap test exports (#106427)
* refactor(agents): trim bootstrap test exports

* test(agents): isolate bootstrap cache cases
2026-07-13 07:24:33 -07:00
Peter Steinberger
76796d7c69 refactor(gateway): share closed TypeBox objects (#106441)
* refactor(gateway): share closed TypeBox objects

* fix(gateway): remove unused TypeBox import
2026-07-13 07:21:59 -07:00
Peter Steinberger
458746e1c2 chore(ci): enforce changed-file TypeScript LOC ratchet (#106387)
* ci: enforce changed-file TypeScript LOC ratchet

* ci: derive release-gate LOC base from PR

* test(ci): exclude repository test helpers from LOC ratchet

* ci: validate LOC ratchet on PR merge tree

* style: format release maintainer skill

* ci: run LOC ratchet for fast-only changes

* fix(ci): harden LOC ratchet comparisons

* fix(ci): cover native TypeScript in LOC ratchet

* fix(ci): compare LOC against tested merge tree

* test(ci): cover LOC manifest routing
2026-07-13 07:20:32 -07:00
Vincent Koc
60e8d4f021 refactor(queue): remove dead summary reset (#106440) 2026-07-13 22:14:37 +08:00
Peter Steinberger
50e5ffcd25 feat(mac): native pairing approval dialog with instant decisions (#106091)
* feat(mac): native pairing approval dialog with instant decisions

* chore(i18n): sync native inventory and locale artifacts

* chore(i18n): regenerate native inventory, locale artifacts, and projections

* chore(i18n): re-sync native inventory ordering
2026-07-13 07:08:14 -07:00
Peter Steinberger
471f60bc84 fix: show sidebar session action failures (#106435)
* fix(ui): surface sidebar session mutation failures

* test(ui): type sidebar session patch mock
2026-07-13 07:04:13 -07:00
Peter Steinberger
07d5a7e58e fix(ci): refresh native i18n inventory (#106434) 2026-07-13 07:03:22 -07:00
Peter Steinberger
507038c456 refactor: split oversized test suites (#106354)
* refactor: split oversized test suites

* test: classify split modules as test utilities

* test: preserve bundled routing after suite splits

* style: format unit-fast routing import

* test: preserve owner routing for split suites
2026-07-13 07:01:08 -07:00
Omar Abdelmaksoud
101b601df8 fix(auto-reply): retry reply-session init CAS conflicts with backoff (#105754)
* fix(auto-reply): retry reply-session init CAS conflicts with backoff

Reply-session initialization retried a lost optimistic-concurrency commit
exactly once, with no delay, inside the store writer lane. When another
writer (restart recovery, a concurrent dashboard tab, an active reply run)
was mid-commit on the same session key, both attempts lost the revision CAS
within milliseconds and "reply session initialization conflicted" escaped to
the caller — silently dropping the inbound event on webchat/Slack/heartbeat
paths (#102400).

Introduce a typed ReplySessionInitConflictError and retry the whole unlocked
init attempt up to 5 times with jittered exponential backoff (250ms..4s).
The sleep happens outside runExclusiveSessionStoreWrite so the writer lane
is never held while waiting, each retry re-reads a fresh snapshot, and the
error message shape is preserved for channel monitors (e.g. the Telegram
poller) that already classify it as retryable.

Fixes #102400

* fix(auto-reply): cancel conflict backoff on abort

* refactor(auto-reply): unify session init cancellation

* refactor(auto-reply): isolate session conflict retry

---------

Co-authored-by: oabdelmaksoud <oabdelmaksoud@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-13 06:56:02 -07:00
Vincent Koc
c45553089a refactor(slack): trim private reply exports (#106431) 2026-07-13 21:53:34 +08:00
Peter Steinberger
c8e401cfad refactor(gateway): infer validator types from schemas (#106428) 2026-07-13 06:49:10 -07:00
Peter Steinberger
a965d28e04 refactor(cli): trim internal command exports (#106426) 2026-07-13 06:47:02 -07:00
Peter Steinberger
0ff265838b fix(codex): preserve shutdown cleanup across live builds (#106418) 2026-07-13 06:41:19 -07:00
Vincent Koc
a5c5e3b713 fix(ci): refresh plugin SDK API baseline (#106411) 2026-07-13 21:33:06 +08:00
Peter Steinberger
4643bb4c2c fix(mac): keep remote nodes connected during config metadata writes (#106419)
* fix(mac): ignore config metadata churn

* chore: keep release note in PR
2026-07-13 06:31:11 -07:00
Peter Steinberger
afdc3931a8 refactor(agents): reuse diff structured hunks (#106410) 2026-07-13 06:21:31 -07:00
Peter Steinberger
879ed1d859 fix(ui): make tabs, dialogs, and skill cards keyboard accessible (#106320)
* fix(ui): improve keyboard accessibility

* fix(ui): remove unused toggle event

* docs(changelog): note control UI keyboard access

* chore(ui): keep release note in PR body

* chore(ui): translate accessibility labels
2026-07-13 06:20:14 -07:00
Peter Steinberger
b76a7f453b refactor(auto-reply): trim internal export surface (#106409)
* refactor(auto-reply): trim internal export surface

* chore(deadcode): update auto-reply export baseline
2026-07-13 06:17:20 -07:00
Ayaan Zaidi
7cc40d9e46 fix(claude-cli): hold live turn open while native background subagents and workflows run 2026-07-13 18:45:35 +05:30
wuqxuan
94f018caad fix(ui): preserve sidebar collapsed state when group rename/delete fails (#106152)
* fix(ui): preserve sidebar collapsed state when group rename/delete fails

* test(ui): cover group rename/delete rejection error publish

* fix(ui): harden session group mutations

* fix(ui): guard group mutations across reconnects

* fix(ui): keep session group result internal

* style(ui): format sidebar tests

* fix(ui): preserve confirmed group mutations

* chore: keep release notes out of contributor PR

* style(ui): refresh session test formatting

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-13 06:13:58 -07:00
Vitor Cepeda Lopes
93b3f4c45b feat(xai): add native streaming TTS (#103993)
* feat(xai): add streaming TTS via wss://api.x.ai/v1/tts

Expose streamSynthesize on the bundled xAI speech provider so Talk and
Discord streaming playback can use xAI alongside batch REST synthesis.
Adds ws runtime dependency, byte-cap enforcement, and provider tests.

* fix(xai): harden streaming TTS per review feedback

Restrict streaming WS to api.x.ai, decode WebSocket payloads explicitly,
refresh idle timeout on audio.delta, add lifecycle/security tests, and
document the official xAI streaming contract plus non-realtime-voice scope.

* fix(xai): bound streaming TTS text deltas

* fix(xai): require secure native TTS streaming endpoint

* docs(tts): remove duplicate output formats section

* fix(xai): preserve surrogate pairs in tts frames

* fix(xai): bound streaming TTS websocket payloads

* fix(xai): align TTS websocket decoding with ws types

* fix(xai): pin native streaming TTS endpoint

* test(xai): cover native streaming TTS live path

* fix(xai): preserve streaming codec compatibility

* style(xai): format streaming endpoint guard

* docs(tts): describe xAI streaming output policy [skip ci]

* fix(xai): own voice-note TTS format policy [skip ci]

* docs(tts): keep provider summary concise [skip ci]

* test(xai): use explicit placeholder credentials [skip ci]

* test(xai): keep fixtures scanner-safe [skip ci]

---------

Co-authored-by: TheAngryPit <16145902+TheAngryPit@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-13 06:08:28 -07:00
Peter Steinberger
2a7132a43f refactor(agents): trim exec approval exports (#106401) 2026-07-13 06:03:41 -07:00
Vincent Koc
194ed5d34c refactor(acpx): privatize internal helpers (#106394) 2026-07-13 21:01:52 +08:00
Peter Steinberger
df3fe6a4f2 feat(worktrees): configurable cleanup limits (max count, max total size) with Settings UI (#106224)
Config surface worktrees.cleanup.{maxCount,maxTotalSizeGb} (0/unset disables),
enforced by hourly gc, worktrees.gc RPC, and openclaw worktrees gc: least
recently active session/Workboard worktrees are snapshotted and removed until
count and total size fit. Manual worktrees, live locks, run leases, and active
session owners are never limit-evicted. Settings -> Worktrees gains a Cleanup
section with debounced, quota-aware stepper controls. Closes #106213.
2026-07-13 06:00:33 -07:00
Peter Steinberger
370b5150c2 fix(docs-i18n): preserve nested list prefixes 2026-07-13 08:52:13 -04:00
Peter Steinberger
0d1573e9a2 perf(gateway): preserve pristine startup facts (#106282) 2026-07-13 05:50:36 -07:00
Peter Steinberger
26312fd0b0 refactor: remove gateway and channel dead exports (#106038)
* refactor: remove gateway and channel dead exports

* style: format config reload test

* refactor: remove newly dead gateway exports

* test: preserve approval audience coverage

* refactor: preserve gateway contracts while pruning exports

* test: retain gateway regression coverage

* test: restore gateway policy coverage

* test: close dead-export CI gaps

* fix: reconcile dead exports with latest main

* refactor: remove newly dead gateway runner export

* test: remove private worker verifier coverage

* test: preserve weak secret docs coverage

* fix: avoid gateway health import cycle

* fix: preserve node pairing type contract

* style: format talk relay test

* fix: preserve gateway protocol generation contract

* chore: refresh dead export baseline

* fix: preserve loaded target compatibility exports

* fix: preserve plugin SDK declaration resolution

* chore: refresh dead export baseline

* chore: refresh dead export baseline

* test(gateway): derive private worker service options
2026-07-13 05:47:05 -07:00
Peter Steinberger
5ca0e634bc fix(ios): connect iPhone and Watch to protocol v3 gateways (#106294)
* fix(ios): support gateway protocol v3

* chore(i18n): refresh native source metadata

* fix(watchos): keep direct transport on protocol v4

* chore(i18n): refresh Watch source metadata
2026-07-13 05:44:49 -07:00
Peter Steinberger
e1a92c99cf fix(ios): persist chat thinking selections (#106287)
* refactor(apple): share chat gateway requests

* fix(ci): sync native app inventory

* docs: keep Apple release note in PR body
2026-07-13 05:44:08 -07:00
Peter Steinberger
d9a6be9b16 fix(ios): typography audit rejects localized accessibility labels (#106092)
* test(ios): exempt accessibility metadata from typography audit

* test(ios): cover adjacent visual text audit

* test(ios): tighten accessibility typography exemption

* test(ios): preserve strict accessibility typography audit

* test(ios): handle multiline accessibility closures

* test(ios): classify accessibility typography per line

* test(ios): parse nested accessibility metadata
2026-07-13 05:42:46 -07:00
VectorPeak
79cc3c333b fix: OpenRouter OAuth denial redirects show provider errors (#105448)
* fix(openrouter): surface pasted OAuth redirect errors

Co-authored-by: chatgpt-codex-connector[bot] <261883814+chatgpt-codex-connector[bot]@users.noreply.github.com>

* fix(openrouter): align callback OAuth error state checks

Co-authored-by: chatgpt-codex-connector[bot] <261883814+chatgpt-codex-connector[bot]@users.noreply.github.com>

* test(openrouter): initialize callback readiness

---------

Co-authored-by: chatgpt-codex-connector[bot] <261883814+chatgpt-codex-connector[bot]@users.noreply.github.com>
Co-authored-by: Altay <altay@hey.com>
2026-07-13 15:37:26 +03:00
Vincent Koc
9f3d3b5672 refactor(oc-path): privatize internal types (#106317) 2026-07-13 20:37:08 +08:00
Peter Steinberger
265f79e607 fix(mac): allow five-minute node worker cold starts (#106380)
* fix(mac): extend node worker startup timeout

* chore: keep release notes in PR
2026-07-13 05:35:09 -07:00
Peter Steinberger
f87a74602a refactor(gateway): simplify canonical WebSocket client (#106316)
* refactor(gateway): simplify canonical websocket client

* refactor(gateway): keep protocol options internal
2026-07-13 05:34:57 -07:00
wangyan2026
5cb4759742 fix(voice-call): restrict classic streaming to Twilio (#102887)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-13 05:33:16 -07:00