Commit Graph

67872 Commits

Author SHA1 Message Date
Shakker
4e809c57ff docs: note ClickClack delivery fixes 2026-07-13 19:57:34 +01:00
Shakker
9d03b47a1d docs: document durable ClickClack recovery 2026-07-13 19:57:34 +01:00
Shakker
ef6c44f10b fix: route ClickClack replies through runtime policy 2026-07-13 19:57:34 +01:00
Shakker
9b5cd4cd0d fix: reconcile durable ClickClack sends 2026-07-13 19:57:34 +01:00
Shakker
0039c066c1 feat: add ClickClack nonce recovery lookups 2026-07-13 19:57:34 +01:00
Shakker
33f6367117 feat: index durable outbound message parts 2026-07-13 19:57:34 +01:00
Jacqueline Henriksen
ba00bd7bb4 fix: deliver ClickClack media and configurable model replies 2026-07-13 19:57:34 +01:00
Vincent Koc
aea2dd6ab2 fix(test): follow private UI export cleanup 2026-07-13 20:56:46 +02:00
Peter Steinberger
e3c5821d98 feat(ui): redesign Channels page with guided channel setup wizard (#106469)
* feat(ui): redesign Channels page with guided channel setup wizard

Adds wizard.start flow=channels gateway RPC (additive protocol change) that
drives the shared channel-setup wizard (openclaw channels add) over the
session step protocol. Control UI Channels page becomes a card hub with
plugin-art covers, guided per-channel setup modal (WhatsApp QR pairing via
web.login.*, BotFather/Slack/Discord helper links), and a detail overlay
hosting the full schema config form.

* test(ui): cover channel wizard controller; refresh channels view test props

* chore(mock): use non-token-shaped wizard placeholder

* test(gateway): scanner-safe auth local in channels wizard test

* fix(ui): cancel gateway wizard session on channels page disconnect

* fix(ui): adopt browse-all channel pick and guard dirty config before setup

* fix(ui): cancel gateway session created by a stale wizard.start

* fix(ui): adopt multiselect channel picks; drop redundant String()

* fix(ui): track all wizard-adopted channels so WhatsApp QR runs regardless of pick order

* feat(gateway): report configured channels on terminal channel-wizard result

Replaces the Control UI's channel-adoption heuristic with the authoritative
outcome: the channels flow reports its actual selection after config commit,
the wizard session surfaces it as an additive channels field on the terminal
wizard.next result, and the UI keys WhatsApp QR linking off that.

* refactor(ui): align channels hub with the unified settings design language

Hub becomes settings-language rows (44px art tiles, status dots, uppercase
section headings, hairline groups) instead of a card gallery; the detail
overlay hosts the migrated per-channel settings sections with Run setup in
the header. Wizard dialog and tile/cover styles move to spacing tokens.

* chore(i18n): translate channels hub/setup strings; refresh raw-copy baseline

* refactor: satisfy LOC ratchet and dead-export gates

Split mock-dev channel/plugin fixtures into their own modules, move wizard
runner types/defaults to server-methods/wizard.ts, extract the channels page
wizard host and nostr profile HTTP ops, and unexport internal-only types
(incl. the unused config-form SECTION_META barrel re-export).

* chore(i18n): retranslate channels strings on rebased locale bundles

* fix(test): drop redundant String() in channels wizard e2e

* fix: address channel-wizard review findings

- lock wizard cancellation before durable installs/config writes
- report configured channel accounts on the terminal wizard result and
  start WhatsApp QR pairing for that account (web.login accountId)
- forward request options through the browser gateway client so wizard
  RPC timeouts apply
- render skipped setup as a no-change completion
- keep detail/advanced config reachable for unconfigured channels
- surface the dirty-config warning inside the detail overlay
- adopt the picked channel for wizard title/links in browse-all flows

* fix(ui): local wizard RPC timeout; translate no-change completion strings
2026-07-13 11:49:42 -07:00
Peter Steinberger
1e505ee574 refactor(gateway): extract source reply finalization (#106733) 2026-07-13 11:48:36 -07:00
Peter Steinberger
e2cc1ea0f7 refactor(ui): avoid model group map spreads (#106732) 2026-07-13 11:47:29 -07:00
Peter Steinberger
78bf10f6d1 test(ui): update E2E expectations (#106731) 2026-07-13 11:45:57 -07:00
Peter Steinberger
40b119f57a refactor(build): run generated formatter through oxfmt bin 2026-07-13 11:44:28 -07:00
Peter Steinberger
bab9c6502a refactor(ui): privatize default model view props (#106728) 2026-07-13 11:43:37 -07:00
Peter Steinberger
246cb48849 docs(cron): remove retired run-log settings 2026-07-13 11:41:27 -07:00
Peter Steinberger
59003634ad refactor(cron): retire cron_run_logs; ledger-owned retention and cancellation
Stops the legacy run-log dual-write, auto-imports remaining rows and drops
the table at state-DB open (table-presence guard: self-heals downgrade
round-trips), keeps the newest 2000 terminal runs per job in the ledger,
retires cron.runLog config via doctor, and moves live-run cancellation to
src/cron behind the shared task control seam.

Part 2 of 2 for #106041.
2026-07-13 11:41:27 -07:00
Peter Steinberger
c82d840d1f refactor(gateway): extract command reply folding (#106708) 2026-07-13 11:36:58 -07:00
Peter Steinberger
faa0e1712a refactor(bonjour): use ciao runtime contract 2026-07-13 11:35:48 -07:00
dwc1997
f07ea10869 fix(deepgram): validate realtime base URL overrides, preserving ws(s):// endpoints (#105334)
* fix(deepgram): reject malformed and non-http(s) realtime base URL overrides

* fix(deepgram): accept direct ws(s):// realtime base URL overrides

Preserve released behavior: v2026.6.11 passes wss:// (and ws://) base URL
overrides straight through to the WebSocket URL builder. The prior validator
rejected every non-http(s) scheme, breaking custom Deepgram realtime proxies
that use a direct wss:// endpoint. Accept ws:/wss: alongside http(s):, keep
rejecting malformed and unrelated schemes, and preserve a direct ws(s):
override's protocol/path/port through toDeepgramRealtimeWsUrl.

* fix(deepgram): keep secure ws:// -> wss:// upgrade for realtime base URL

A prior change preserved direct ws:/wss: overrides unchanged, which also
stopped upgrading a plaintext ws:// override to wss://. That regressed the
released behavior where every accepted non-http: scheme maps to wss:, so an
existing ws:// endpoint would begin sending Deepgram realtime audio and
provider auth over an unencrypted socket. Restore the release mapping
(http: -> ws:, all others -> wss:), which still preserves a direct wss://
override and keeps the ws:// -> wss:// secure upgrade.

* fix(deepgram): preserve custom websocket transport

Co-authored-by: dwc1997 <du.wenchi@xydigit.com>

* test(deepgram): use placeholder credential fixture

* test(deepgram): clarify loopback callbacks

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-13 11:33:53 -07:00
Peter Steinberger
cdf4f2208b chore(deadcode): move resolveCronRunEndedAt baseline entry to event codec 2026-07-13 11:32:57 -07:00
Peter Steinberger
bb273034f3 fix(cron): decouple cron history codec/migration from the agents sandbox tree
CI caught two real PR1 regressions. (1) Wiring the cron-run-logs migration
into state-db open transitively pulled agents/sandbox via the run-log error
codec, breaking ~13 tests that mock config/paths without STATE_DIR: split the
event->entry write codec into task-run-event-codec.ts and dependency-inject
the failover reason resolver so live run-log reads keep recompute while the
ledger read + migration stay dependency-light. (2) cron/service/task-runs.ts
reached into task-registry internals: route through the task-executor facade.
Known bounded limitation documented in the migration: legacy rows lacking a
stored errorReason are imported without a recomputed one (write-time authoring
is canonical going forward).
2026-07-13 11:32:57 -07:00
Peter Steinberger
b1f765ae8b fix(cron): baseline transitional cron-ledger exports; drop dead migration re-export
check-dependencies (knip) flagged run-log read exports left unused after the
reader flip plus test-only ledger/migration exports. Baseline the genuine
test-only/transitional exports; remove the redundant state-migrations barrel
re-export (state-db imports the migration from the sibling module directly).
2026-07-13 11:32:57 -07:00
Peter Steinberger
861d5c57db fix(test): drop unused import in extracted cron run-log migration test
The cron import test was extracted into its own file during rebase; it
triggers the migration via openOpenClawStateDatabase, so the direct
migrateLegacyCronRunLogsToTaskRuns import was unused (check-lint) and the
hand-written header needed oxfmt (check-docs).
2026-07-13 11:32:57 -07:00
Peter Steinberger
b842be157a chore(cron): decompose oversized modules for the changed-file LOC ratchet
Extracts startup-run repair, timer outcome finalization, task record
normalization, legacy task-sidecar row codec, and state-schema helpers
into focused modules; exempts .generated.d.ts files from the ratchet
(policy gap: schema evolution regrows generated Kysely types).
2026-07-13 11:32:57 -07:00
Peter Steinberger
4d9052929b feat(cron): serve cron run history from the task ledger
Cron executions now write full-fidelity task_runs rows (detail_json column,
store-key scoped) and cron.runs/CLI/task-maintenance read from the ledger;
legacy cron_run_logs dual-write stays as a revert safety net. Existing
history auto-imports at first state-DB open (verified against a production
DB copy: 2750/2750 rows, byte-identical parity, idempotent). Startup crash
recovery restores finished runs from finalized ledger rows instead of
reporting synthetic interruptions.

Part 1 of 2 for #106041.
2026-07-13 11:32:57 -07:00
Peter Steinberger
bfe2786957 refactor(ui): remove dead exports (#105979)
* refactor(ui): remove dead exports

* chore(deadcode): refresh export baseline

* refactor(gateway): privatize chat media fields
2026-07-13 11:32:00 -07:00
Peter Steinberger
5f3d56a2f0 fix(gateway): preserve chat media dispatch state (#106702) 2026-07-13 11:26:18 -07:00
Peter Steinberger
9166b23318 feat: configure model providers from the Control UI settings page (#106490)
* feat(gateway): add models.probe RPC, credential provenance, targeted auth logout

* feat(ui): configure model providers from settings — keys, probes, logout, defaults

* docs: Control UI provider configuration section

* fix(ui): confirm fallback shrinkage via replacePaths; guard model catalog refresh races; scanner-safe probe fixtures

* test(models): scanner-safe probe fixture identifier

* chore(i18n): resync model-providers strings after rebase

* fix(gateway-protocol): drop duplicate probe type imports after rebase

* chore(protocol): regenerate Swift client for probe field order

* chore(i18n): resync model-providers strings after main rebase

* test(ui): scope model-providers E2E to settings-section headings

* fix(models): isolate marker probes from stored profiles; emit no_model for config-only providers [AI]

* fix(models): honor configured auth mode for env probes; probe config-bound profiles past auth.order [AI]

* fix(gateway): resolve provider auth aliases in models.probe [AI]

* fix(gateway): scope targeted auth logout to skip provider-wide run abort [AI]

* fix(models): probe requested provider for overrides; unregister ephemeral probe DB [AI]

* fix(gateway): exclude local no-auth markers from models.authStatus API-key provenance [AI]

* chore(i18n): resync model-providers strings for landing
2026-07-13 11:23:34 -07:00
Peter Steinberger
4b69a8bc69 refactor(gateway): privatize chat media fields type (#106698) 2026-07-13 11:21:12 -07:00
qingminlong
8ffe428bd8 fix(memory): accept leading-zero Content-Length on JSON responses (#105916)
* fix(memory): accept leading-zero content lengths

* test(memory): keep leading-zero size caps

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-13 11:20:06 -07:00
Peter Steinberger
b4e61b48be refactor(build): derive package entries from exports 2026-07-13 11:18:44 -07:00
Peter Steinberger
2eaf7ed9f0 refactor(gateway): extract chat reply dispatch (#106697) 2026-07-13 11:17:17 -07:00
Alix-007
676d3f0230 fix(qqbot): clear voice send timeouts after delivery settles (#105885)
* fix(qqbot): clear voice send timeouts after delivery settles

* chore(deadcode): allowlist test-only timeout constant exports

* test(qqbot): cover timeout race lifecycle

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-13 11:16:18 -07:00
Peter Steinberger
f264f4517a improve(worker): include ack state in the live-event stall error
The stalled-acknowledgement error now names seq/runId/ackedSeq/previousAck/
buffered so an operator can tell a gateway backpressure stall from a real
protocol bug without reproducing.
2026-07-13 11:14:47 -07:00
wahaha1223
990183b602 fix(ai): reject noncanonical array indices in local schema refs (#105922)
* fix(ai): reject noncanonical array indices in local schema refs

* test(ai): harden local schema ref indices

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-13 11:14:33 -07:00
Peter Steinberger
6e8df6c045 fix(ios): block incomplete shares when attachments are omitted (#106513)
* fix(ios): block omitted share attachments

Co-authored-by: jincheng-xydt <xu.jincheng@xydigit.com>

* chore: keep release note in PR body

---------

Co-authored-by: jincheng-xydt <xu.jincheng@xydigit.com>
2026-07-13 11:14:30 -07:00
Peter Steinberger
668e5e8096 refactor: split config reply dispatch (#106642)
* docs: relax refactor issue and CI gates

* refactor: split config reply dispatch

* test: allow ACP dispatch startup under parallel load

* refactor: keep dispatch helper types private
2026-07-13 11:12:32 -07:00
Peter Steinberger
7a8ce01a5b fix(gateway): reset state across in-process restarts (#106691) 2026-07-13 11:08:34 -07:00
Peter Steinberger
db02a96c4c refactor(process): route bounded commands through Execa (#106495)
* refactor(process): centralize bounded command execution

* refactor(process): migrate core one-shot commands

* refactor(plugins): migrate one-shot commands

* fix(process): await Windows tree termination

* chore(plugin-sdk): refresh process runtime surface

* refactor(process): migrate remaining bounded commands

* refactor(process): normalize command result handling

* refactor(process): split execution responsibilities

* chore(plugin-sdk): refresh API baseline

* chore(process): remove release-owned changelog entry

* fix(process): narrow binary command input checks

* fix(process): cap sandbox command output

* fix(qa-lab): preserve exact node probe env

* chore(ci): refresh dead export baseline

* fix(process): preserve force-kill command deadlines

* fix(process): avoid post-exit timeout reclassification

* test(process): update scp staging wrapper mock

* test(process): update remaining wrapper mocks

* refactor(qa-lab): preserve Execa tar execution
2026-07-13 11:07:35 -07:00
Peter Steinberger
171fabef24 refactor(gateway): extract chat user-turn assembly (#106689) 2026-07-13 11:05:21 -07:00
Peter Steinberger
4c7efd2673 refactor(agents): privatize session state types (#106672)
* refactor(agents): privatize session state types

* chore(deadcode): shrink agents export baseline
2026-07-13 11:04:21 -07:00
Peter Steinberger
e30cc79b81 ci: remove redundant extension oxlint lanes 2026-07-13 11:02:51 -07:00
Peter Steinberger
553c245961 fix(cloud-workers): install bundle deps after the integrity check, hash the vendor tree
The bundle install verifier walks the staged tree and compares its hash to
the expected bundle hash. Two live-E2E bugs: (1) it never walked vendor/,
so vendored workspace packages failed the hash; (2) npm install ran before
the check, so node_modules (intentionally hash-excluded) polluted the tree.
Verify the pristine bundle including vendor/, then run the production
npm install. Proven locally: VERIFY_INSTALL_JS returns 0 on the extracted
tarball and the worker entry resolves every module post-install.
2026-07-13 11:00:03 -07:00
Peter Steinberger
301a4bf627 improve(ui): redesign Settings About with Clawd hero and community links (#106508)
* feat(ui): redesign Settings About with Clawd hero and community links

* fix(ui): route About hero product name through i18n

* chore(i18n): translate About page keys, resync raw-copy baseline

* fix(ui): keep About brand icons in a local module (LOC ratchet)

* chore(i18n): resync About locale bundles after rebase
2026-07-13 10:54:11 -07:00
Peter Steinberger
2257d232b0 refactor(gateway): extract chat attachment phase (#106615) 2026-07-13 10:51:21 -07:00
Peter Steinberger
20b7a9fc84 fix(cloud-workers): vendor dist-referenced workspace packages in worker bundles
tsdown's never-bundle list keeps @openclaw/ai external of dist, but it is a
workspace:* dependency, so the pruned worker package.json dropped it and the
leased box failed with "Cannot find package '@openclaw/ai'" after
npm install --omit=dev.

The bundle producer now scans the staged dist/openclaw.mjs bytes for quoted
@openclaw/<pkg> import specifiers, intersects them with workspace: deps in
the original root manifest, and stages each referenced package (pruned
package.json, built dist/, npm-shrinkwrap.json when present) under
vendor/<scope-flattened>/ through the same hardened O_NOFOLLOW staging path.
The shipped root package.json rewrites those deps to file:./vendor/<dir> so
the box install resolves them offline; unreferenced workspace deps stay
dropped. All vendored files are manifest entries, so the bundle hash covers
them. Staging/vendoring moved to bundle-staging.ts to keep bundle.ts bounded.

Proven locally: produced a bundle from a built worktree, extracted it, ran
npm install --ignore-scripts --omit=dev, and the worker entry reached
"invalid worker launch descriptor" (all modules resolved).
2026-07-13 10:51:05 -07:00
Vincent Koc
ee2efed993 refactor(commands): remove duplicate session target export (#106620) 2026-07-14 01:49:36 +08:00
Peter Steinberger
409d13f94f refactor(active-memory): split runtime modules (#106285)
* refactor(active-memory): split runtime modules

* fix(active-memory): annotate hook deadline result

* refactor(active-memory): keep runtime modules bounded

* fix(active-memory): use type-only recall imports

* refactor(active-memory): supersede partial split

* fix(gateway): type pruned worker manifest
2026-07-13 10:45:01 -07:00
Peter Steinberger
9544937b22 refactor(auto-reply): trim test facade exports (#106639) 2026-07-13 10:43:41 -07:00
Vincent Koc
0468fd6d41 fix(gateway): preserve worker manifest record type 2026-07-13 19:38:57 +02:00