Commit Graph

15862 Commits

Author SHA1 Message Date
Peter Steinberger
2e0f6d5304 fix: recover browser routing and Discord voice context 2026-07-13 23:38:56 +01:00
Peter Steinberger
5c9e09af3a style(codex): format prompt projection 2026-07-13 15:32:59 -07:00
Peter Steinberger
51fece4960 fix(codex): preserve failure-path ownership 2026-07-13 15:32:59 -07:00
Peter Steinberger
323a9fbe29 refactor(codex): split app server run attempt 2026-07-13 15:32:59 -07:00
Peter Steinberger
4319ddbe8c feat(control-ui): import Codex and Claude Code memory (#106406)
* feat(control-ui): import coding assistant memory

* test(migrate): clean memory import temp dirs

* chore: move memory import note to PR body

* build: refresh memory import generated artifacts

* fix(control-ui): complete memory import checks

* build(control-ui): localize memory recovery labels

* fix(control-ui): harden memory import recovery

* refactor(migrate): keep memory import surfaces bounded

* fix(control-ui): use canonical agent row type

* fix(codex): drop dead migration type exports

* fix(migrate): restrict imported memory permissions

* fix(control-ui): preserve memory import recovery state

* fix(control-ui): retain memory import results

* build(control-ui): preserve translation memory history

* fix(control-ui): bind memory import state to agent

* fix(control-ui): unlock memory import after refresh

* test(gateway): preserve memory method suffix

* fix(migrate): bind reviewed memory imports

* fix(migrate): make memory imports retry-safe

* perf(ui): keep memory import lazy

* build: refresh generated artifacts after rebase

* chore: keep migration runtime within LOC guard

* build: refresh Swift protocol model
2026-07-13 15:30:06 -07:00
Peter Steinberger
4568606490 refactor(telegram): privatize doctor helpers (#106861) 2026-07-13 15:29:06 -07:00
Peter Steinberger
95da05ddce fix(oc-path): preserve JSONC insertion formatting 2026-07-13 15:25:53 -07:00
Peter Steinberger
dc8ef09bbe refactor(diagnostics-otel): keep extracted helpers private 2026-07-13 15:25:11 -07:00
Peter Steinberger
6454b07b17 refactor(diagnostics-otel): slim service orchestration 2026-07-13 15:25:11 -07:00
Peter Steinberger
00af5a5989 refactor(diagnostics-otel): extract event recorders 2026-07-13 15:25:11 -07:00
Peter Steinberger
351c069ed2 refactor(diagnostics-otel): extract telemetry foundations 2026-07-13 15:25:11 -07:00
wangmiao0668000666
5f681a1cb8 fix(memory-core): clear pending-update wait timer after update settles (#106173)
* fix(memory-core): clear pending-update wait timer after update settles

* test(memory-core): wrap setImmediate Promise executor in block body

`oxlint(no-promise-executor-return)` (enabled in the bundled-extension
config used by `pnpm lint:extensions:bundled` /`check-lint` /
`check-additional-extension-bundled`) flags the implicit return from
`new Promise((resolve) => setImmediate(resolve))`. The arrow function
is expression-bodied and returns the Immediate handle, which the rule
treats as a return inside a Promise executor.

Switch both occurrences in the regression guard to block bodies so the
executor callback does not return a value. Behavior is unchanged:
setImmediate still fires resolve on the next macrotask; the regression
assertion (process.getActiveResourcesInfo() delta) still passes.

* test(memory-core): track pending wait timer cleanup

* refactor(memory-core): keep timer cleanup LOC-neutral

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Peter Steinberger <peter@steipete.me>
2026-07-13 15:16:19 -07:00
ruel225
b6330edbe4 fix(sdk): add prototype-pollution guard to migration config merge (#103059) (#106116)
* fix(sdk): add prototype-pollution guard to migration config merge

mergeMigrationConfigValue and writeMigrationConfigPath had no
isBlockedObjectKey guard, allowing __proto__/constructor/prototype
keys from imported config files to trigger prototype pollution.

Add the same guard used by the sibling config-path writer
(setConfigValueAtPath/parseConfigPath) to reject blocked object
keys before they reach a bracket assignment.

Fixes #103059

* fix(sdk): harden migration config patches

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-13 15:14:58 -07:00
Peter Steinberger
76834210f8 fix(lobster): restore literal dep reference for runtime contract
70ab6b324d dropped the last literal "@clawdbot/lobster" mention from the
runner while keeping the join-built dynamic import, so the unused-direct-
dependency contract started failing on main. Document the join trick with
the literal package path so the contract sees the dependency again.
2026-07-13 14:55:36 -07:00
Peter Steinberger
70ab6b324d refactor(lobster): use canonical core export 2026-07-13 14:39:18 -07:00
Piotr Durlej
48279d46ca fix(signal): detect native bot mentions in group gating (#96738)
* fix(signal): detect native bot mentions in group gating

* fix(signal): accept ordinary-text native mentions

* chore(signal): defer release note to release process

* fix(signal): satisfy mention gating quality gates

* test(signal): cover public mention facts helper

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-13 14:35:23 -07:00
Peter Steinberger
3982424daa fix: main build passes strict checks (#106772)
* fix: restore main build checks

* chore: drop superseded main fixes

* fix: restore architecture and lint checks

* test: align runtime plugin install mocks

* style: format current main files

* test: assert transcript policy caching directly

* fix: deduplicate SQLite guardrail allowlist
2026-07-13 14:28:48 -07:00
Peter Steinberger
eb169a3c87 refactor(canvas): use chokidar watch directly 2026-07-13 14:04:39 -07:00
Peter Steinberger
995c75baa0 fix(ci): restore current-main quality gates (#106751)
* fix(ci): restore Control UI quality gates

* fix(ci): repair dead export cleanup fallout

* fix(ci): repair latest main quality gates

* fix(ci): satisfy current-main gate contracts

* docs: format Cloud Workers guide

* test: isolate context lookup module
2026-07-13 13:54:03 -07:00
Peter Steinberger
90a545b9e6 refactor(slack): trim internal exports (#106794) 2026-07-13 13:37:21 -07:00
Peter Steinberger
9b8fa12f25 refactor(google): use genai session type 2026-07-13 13:28:06 -07:00
Peter Steinberger
3d64e6fd7c refactor(microsoft): use node-edge-tts declarations 2026-07-13 13:21:09 -07:00
Peter Steinberger
6315dd8e2d fix(reef): adopt self-initiated friendships via durable outbound-intent markers 2026-07-13 13:03:55 -07:00
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
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
d2f4fdf8e6 refactor(amazon-bedrock): use exact AWS SDK contracts 2026-07-13 12:29:19 -07:00
Peter Steinberger
1ecef82da8 refactor(googlechat): reuse Google auth gaxios runtime 2026-07-13 12:14:22 -07:00
Shakker
72b42f0ed7 fix: preserve ClickClack nonce lookup causes (#105775) 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
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
Jacqueline Henriksen
ba00bd7bb4 fix: deliver ClickClack media and configurable model replies 2026-07-13 19:57:34 +01: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
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
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
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
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
wings1029
fd49e97ee5 fix(discord): inherit default_auto_archive_duration in createThreadDiscord (#103413)
* fix(discord): inherit default_auto_archive_duration in createThreadDiscord

When createThreadForBinding hardcoded autoArchiveMinutes: 60, the
parent channel's default_auto_archive_duration (configured by
operators at 1440, 4320, or 10080) was silently overridden. This is
the same pattern fixed in #103033 for sendMessageDiscord's implicit
forum thread creation.

- Move the auto_archive_duration set after the channel fetch in
  createThreadDiscord so channel.default_auto_archive_duration can
  serve as a fallback when autoArchiveMinutes is not provided.
- Remove the hardcoded autoArchiveMinutes: 60 from
  createThreadForBinding so it inherits the channel default for
  forum/media channels and omits the field for text channels
  (preserving Discord's server-side default).
- Explicit autoArchiveMinutes from callers (thread-create action,
  auto-thread config) still take priority via the ?? operator.

Co-Authored-By: Claude <noreply@anthropic.com>

* refactor(discord): preserve parent thread archive defaults

Co-authored-by: 陈志强0668000989 <chen.zhiqiang1@xydigit.com>

* docs(changelog): credit Discord archive default fix

Co-authored-by: 陈志强0668000989 <chen.zhiqiang1@xydigit.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-13 10:31:46 -07:00
Peter Steinberger
e8290c699e refactor(codex): split app-server attempt helpers (#106550)
* refactor(codex): split app-server attempt helpers

* fix(codex): mark harness imports type-only
2026-07-13 09:58:01 -07:00
Peter Steinberger
fc4b6a4254 feat(codex): show the account email with app-server usage windows (#106500)
* feat(codex): read the account email with app-server usage

The Codex-harness usage snapshot now carries the account identity: the
usage fetch runs account/rateLimits/read and account/read over one
app-server session (new withCodexAppServerJsonClient seam, which the
single-request helper now delegates to), so the email is guaranteed to
belong to the same account as the windows. Identity stays best-effort;
rate limits survive an account read failure.

* style(test): scanner-safe app-server marker fixture

* test(codex): keep scanner-neutral hunks around app-server marker literals

* fix(codex): bound the best-effort account read within the usage deadline

Review P2: account/read shared the outer usage deadline, so a slow or hung
identity read could reject the whole snapshot with a timeout instead of
returning the already-fetched rate-limit windows. Race the account read
against a local timer bounded to min(4s, usageTimeoutMs/3) and drop the
identity on timeout; a regression test hangs account/read and asserts the
windows still return.

* fix(codex): send account/read params and bound identity by the remaining deadline

Second review round: account/read (GetAccount) requires a params object per
the app-server protocol, so send an empty {} (refreshToken defaults false);
without it a real app-server rejects the request. Bound the best-effort
identity read by the time left before the shared usage deadline (minus a
margin) instead of the original budget, so a slow rate-limit read can no
longer let the identity read trip the outer timeout and discard the
already-fetched windows.

* fix(codex): reserve the isolated shutdown budget in the usage deadline

Third review round: withCodexAppServerJsonClient awaits the isolated
client's closeAndWait inside the outer timeout, so a hung account/read
could reach the deadline during force-kill/exit cleanup and discard the
already-fetched windows. The usage read now passes a cheap isolatedShutdown
(force-kill 200ms + exit 300ms) and the identity bound reserves that plus a
250ms margin (750ms) of the remaining deadline, so cleanup always finishes
before the outer timeout.

* style(codex): rename scoped-request generic to avoid shadowing
2026-07-13 09:56:47 -07:00
Peter Steinberger
2ec0299f9f fix(crabbox): keep setup runs from syncing the gateway checkout
crabbox run rsyncs the invoking repo by default, which blew the setup
budget when the gateway provisioned from a source checkout. Workspace
transfer is owned by the worker tunnel, so setup passes --no-sync.
2026-07-13 09:54:49 -07:00
cxbAsDev
7abc6665dc fix(discord): retry reply session init conflicts to prevent silent message loss (#103562)
* fix(discord): retry session conflicts without duplicate inbound work

Co-authored-by: 陈宪彪0668000387 <chen.xianbiao@xydigit.com>

* refactor(discord): split session retry policy

* refactor(discord): keep retry error private

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-13 09:50:26 -07:00
Peter Steinberger
0665c16dd6 refactor(diagnostics): split OTEL content helpers (#106554) 2026-07-13 09:48:23 -07:00
Peter Steinberger
5d12f6bfb5 refactor(policy): remove remaining unused exports (#106591)
* refactor(policy): remove unused exports

* chore(deadcode): regenerate policy export baseline
2026-07-13 09:47:31 -07:00
Peter Steinberger
d8fb5b404e refactor(policy): split doctor evaluator modules (#106313)
* refactor(policy): split doctor evaluator modules

* refactor(policy): split runtime shape owners

* refactor(policy): split doctor policy domains
2026-07-13 09:35:11 -07:00