Commit Graph

67766 Commits

Author SHA1 Message Date
Peter Steinberger
9826acdc35 fix(ci): use canonical worker environment types 2026-07-13 08:29:28 -07:00
Peter Steinberger
9f546e2645 refactor: clear remaining plugin dead-export baseline (#106488)
* refactor: clear remaining plugin dead-export baseline

* refactor: expose plugin runtime type consumers to knip
2026-07-13 08:26:12 -07:00
Jason (Json)
b32f59c8c1 feat(ui): create catalog sessions from the sidebar (#105810)
* feat(ui): create sessions from catalog headers

* fix(ui): deduplicate catalog-owned sessions

* fix(ui): preserve catalog session routing state

* fix(ui): keep per-agent session creation in switcher

* fix(anthropic): normalize runtime config snapshot

* test(plugin-sdk): account for model runtime export

* test(plugin-sdk): classify current deprecated surface

* test(ui): follow agent chip menu trigger

* fix(ui): bind catalog drafts to validated agent

* fix(ui): resolve catalog targets from gateway

* refactor(ui): split sidebar session helpers

* chore(ci): complete LOC baseline migration

* fix(ui): extract sidebar session catalog rendering

* fix(anthropic): use provider-relative catalog model id

* chore(ci): ratchet sidebar LOC baselines

* test(ui): cover catalog draft retargeting

* chore(plugin-sdk): refresh API baseline

* style: format catalog session changes

* fix(ui): retry catalog drafts after reconnect

* fix(ui): back off catalog target retries

* fix(ui): keep unresolved catalog drafts locked

* fix(ui): gate catalog creation in core

* fix(ui): keep catalog renderer private

* style(ui): format catalog session target

* chore(plugin-sdk): refresh API baseline

* style(ui): format catalog group state

* Merge latest origin/main CI fixes

* fix(ui): preserve catalog session agent selection

* fix(ui): preserve catalog session agent

* chore(plugin-sdk): refresh API baseline

* fix(ui): type catalog route data

* chore(plugin-sdk): refresh API baseline

* refactor(sessions): centralize transcript path archival

* fix(ui): target expanded agent catalog sessions

* fix(ui): scope catalog actions to expanded agent

* docs(ui): clarify catalog loader fallback

* fix(ui): scope catalog pagination to agent

* test(ui): type sidebar lifecycle refresh

* fix(anthropic): preserve node catalog bindings
2026-07-13 09:25:22 -06:00
Peter Steinberger
7d23570591 fix(mac): keep node admission tunnel-local (#106481) 2026-07-13 08:19:53 -07:00
Peter Steinberger
2854dcf61b fix(gateway): restore revokeAttachGrantsForSession used by cloud-workers
#106332 landed using revokeAttachGrantsForSession after #106038 removed it
as dead, breaking prod-types compile on every PR merge ref. Restores the
helper verbatim from 2deb696ef4 with a doc comment.
2026-07-13 08:17:59 -07:00
Peter Steinberger
11f6247618 refactor(commands): privatize doctor helpers (#106478) 2026-07-13 08:16:29 -07:00
Peter Steinberger
2626e97b4c refactor: split oversized catalog and protocol helpers (#106476) 2026-07-13 11:10:42 -04:00
Peter Steinberger
4a7f8c5215 docs(reef): channel setup page, catalog registrations 2026-07-13 08:07:34 -07:00
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