67627 Commits

Author SHA1 Message Date
Peter Steinberger
d9e360f047 refactor(msteams): use exact Teams SDK types 2026-07-13 12:54:19 -07:00
Peter Steinberger
c182dda402 fix(migrate): import current Hermes state and provider contracts (#106758)
* fix(migrate): update Hermes importer contracts

* refactor(migrate): split Hermes importer modules

* fix(migrate): remove duplicate MCP helper

* docs(plugin-sdk): refresh migration API baseline

* chore(migrate): keep release note in PR
2026-07-13 12:53:13 -07:00
Peter Steinberger
a3804782dc ci(ui): raise startup request budget 2026-07-13 12:51:36 -07:00
Peter Steinberger
016ce331dc ci: refresh plugin sdk api baseline 2026-07-13 12:51:36 -07:00
Vincent Koc
3bdcfaf980 refactor(agents): move heartbeat wrapper to its owner 2026-07-13 21:50:21 +02:00
Peter Steinberger
6d299f383c refactor(memory-core): remove unused exports 2026-07-13 12:44:33 -07:00
Peter Steinberger
eb60b2208c refactor(feishu): remove unused exports 2026-07-13 12:44:33 -07:00
Peter Steinberger
35a02653c8 refactor(qqbot): remove unused exports 2026-07-13 12:44:33 -07:00
Peter Steinberger
ae201c5463 refactor(agents): extract attempt tool catalog phase 2026-07-13 12:44:14 -07:00
Vincent Koc
55845b6fe5 fix(ui): remove stale sidebar attention fixtures 2026-07-13 21:41:35 +02:00
Vincent Koc
343334951d fix(test): narrow npm resolution timestamp 2026-07-13 21:34:42 +02:00
Peter Steinberger
bad37249f5 refactor(agents): privatize auth planning types (#106756)
* refactor(agents): privatize auth planning types

* chore(deadcode): refresh export baseline
2026-07-13 12:31:28 -07:00
Peter Steinberger
d2f4fdf8e6 refactor(amazon-bedrock): use exact AWS SDK contracts 2026-07-13 12:29:19 -07:00
Peter Steinberger
a15c6af48e refactor(auto-reply): privatize command helpers (#106750)
* refactor(auto-reply): privatize command helpers

* chore(deadcode): refresh export baseline
2026-07-13 12:26:17 -07:00
Vincent Koc
4825437681 fix(gateway): type chat dispatch generation fixture 2026-07-13 21:23:19 +02:00
Peter Steinberger
761553804f fix(config): remove stale locked-session delete path (#106748) 2026-07-13 12:19:12 -07:00
Peter Steinberger
1ecef82da8 refactor(googlechat): reuse Google auth gaxios runtime 2026-07-13 12:14:22 -07:00
Peter Steinberger
fc3ba072f3 fix(cloud-workers): accept worker live events for dispatch-owned run contexts
A worker-routed turn stalls with "worker live-event acknowledgement did not
advance" because the gateway rejects the worker's first live event.

The gateway claims a run context for the turn (session identity plus
`isControlUiVisible`) before handing the turn to the remote worker. When the
worker's live events arrive, live-events `claimRun` adopts that pre-existing
context but its fresh-claim gate hardcoded `controlUiVisible = false` and
rejected any existing context whose `isControlUiVisible` differed. A visible
turn registers `isControlUiVisible: true`, so seq=1 was rejected as
`invalid-event` and the stream never advanced.

Visibility is a presentation preference the dispatch owns, not a run-identity
attribute. Inherit the existing context's `isControlUiVisible` when adopting it
and drop it from the identity gate. Session/agent/lifecycle identity must still
match, so foreign runs are still rejected and local turns (no pre-existing turn
context, or a matching one) are unaffected.
2026-07-13 12:12:49 -07:00
Peter Steinberger
ad1c0edede refactor(gateway): extract chat dispatch errors (#106743) 2026-07-13 12:10:26 -07:00
Peter Steinberger
1816e83ca5 refactor(gateway): privatize chat finalization helpers (#106742) 2026-07-13 12:08:47 -07:00
Peter Steinberger
d1684f48a3 refactor: delete dead infra and config exports (#106019)
* refactor: delete dead infra and config exports

* refactor: preserve live infra and config contracts

* refactor(config): remove obsolete file-store lifecycle APIs

* refactor(infra): finish current-main dead export cleanup
2026-07-13 12:00:47 -07:00
Peter Steinberger
8dd57279cd refactor(gateway): extract non-agent reply finalization (#106740) 2026-07-13 12:00:27 -07:00
Shakker
72b42f0ed7 fix: preserve ClickClack nonce lookup causes (#105775) 2026-07-13 19:57:34 +01:00
Shakker
321a041006 refactor: bound durable fanout validation 2026-07-13 19:57:34 +01:00
Shakker
f2e93429ed test: use explicit ClickClack token placeholders 2026-07-13 19:57:34 +01:00
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