Commit Graph

16152 Commits

Author SHA1 Message Date
Leon-SK668
b9e399eec3 fix(active-memory): normalize legacy toggle timestamps (#103116)
* fix(active-memory): normalize legacy toggle timestamps

* test(active-memory): cover non-finite legacy timestamps
2026-07-15 09:25:35 -07:00
pick-cat
d11f304519 fix(qa-channel): add timeout to qa-bus state guarded fetch (#106538)
* fix(qa-channel): add timeout to qa-bus state guarded fetch

* test(qa-channel): add executable negative control for bus-state hang

* test(qa-channel): oxfmt negative-control bus-client test

* fix(qa-channel): sync SDK facade type with getQaBusState options parameter

Co-Authored-By: nebulacoder-v8.0 <noreply@zte.com.cn>

* test(qa-channel): add standalone production-path proof for bus-state timeout

Proof exercises the real getQaBusState code path against loopback
TCP peers that accept but never return HTTP headers:

- Negative control: fetchWithSsrFGuard without timeoutMs stays pending
- Positive control: getQaBusState with timeout rejects with TimeoutError
- Valid response: normal server still resolves within the timeout floor

Co-Authored-By: nebulacoder-v8.0 <noreply@zte.com.cn>

* test(qa-channel): log node version and head SHA in bus-state timeout proof

Co-Authored-By: nebulacoder-v8.0 <noreply@zte.com.cn>

* fix(qa-channel): drop test timeout from public Plugin SDK facade type

Keep the `timeoutMs` option internal to `getQaBusState` for test-only
short floors. The public facade callers do not need it and the SDK
surface should not expose test-only parameters.

Co-Authored-By: nebulacoder-v8.0 <noreply@zte.com.cn>

* chore(qa-channel): remove standalone proof script per review

The negative, timeout, and responsive cases are already durably covered in
bus-client.test.ts. The executed live output remains in the PR body as
evidence.

Co-Authored-By: nebulacoder-v8.0 <noreply@zte.com.cn>

* chore: trigger CI after rebase onto main

* chore: trigger CI after rebase onto main

* test(qa-channel): keep state timeout internal

---------

Co-authored-by: nebulacoder-v8.0 <noreply@zte.com.cn>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Peter Steinberger <peter@steipete.me>
2026-07-15 08:50:53 -07:00
Peter Steinberger
09ce4afd16 test(codex): bound guarded shared-client requests (#108363) 2026-07-15 08:39:23 -07:00
Shakker
752567dbc8 feat: verify ClickClack after channel setup 2026-07-15 15:20:33 +01:00
Shakker
3e352d6727 refactor: share ClickClack setup verification 2026-07-15 15:20:33 +01:00
Peter Steinberger
9d4610cbd1 fix(codex): settle plugin activation, align plugin/list with codex 0.144, bound discovery per turn (#108311)
* fix(codex): settle plugin activation, align plugin/list with codex 0.144, bound discovery per turn

- plugin/list curated queries omit cwds and marketplaceKinds (0.144 semantics:
  explicit kinds disable the automatic global remote catalog; cwds:[] never
  suppressed it), and the missing-marketplace check recognizes the current
  openai-curated-remote wire name via the shared predicate (#107305)
- curated plugin/list snapshots settle in a process-local metadata cache
  (coalesced, invalidated on install/identity change/restart, 1h freshness
  window matching the app-inventory cache) so a missing marketplace or plugin
  no longer re-runs blocking discovery RPCs on every embedded-Codex turn;
  fail-open local-only responses (upstream warns without a load error when the
  remote catalog fetch fails) are never cached, and workspace-directory
  queries stay live because external activation has no invalidation signal
- the whole plugin-config build shares one bounded startup deadline with
  remaining-budget propagation per RPC and a deny-all apps fallback, so a hung
  plugin/list cannot consume the turn (#107305)
- guarded thread requests (start/resume/fork under the native-config fence)
  must carry a finite timeout or abort signal, closing the unbounded-fence-hold
  window for raw callers (#106719 hardening)

* chore(codex): keep plugin metadata types and deadline builder module-local

Deadline behavior tests exercise the production provider composition instead
of a test-only export.
2026-07-15 06:40:29 -07:00
chengzhichao-xydt
e58dc0955f fix(tlon): add timeouts to file upload HTTP requests (#102903)
* fix(tlon): add timeouts to file upload HTTP requests

* fix(tlon): allow slow bounded uploads

---------

Co-authored-by: chengzhichao-xydt <chengzhichao-xydt@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-15 05:41:34 -07:00
marchpure
69ef3ca980 fix(codex): make loop relay optional (#97224)
Move the Codex-specific PreToolUse loop relay switch into the Codex
plugin, preserve policy relays, and cover both normal and side turns.

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: marchpure <marchpure@users.noreply.github.com>
2026-07-15 05:29:20 -07:00
Shakker
728ac14a9a test: use public ClickClack test helpers 2026-07-15 13:05:10 +01:00
Shakker
d1b839eaf6 fix: preserve ClickClack setup secret refs 2026-07-15 13:05:10 +01:00
Shakker
beece7f527 test: track ClickClack temporary directories 2026-07-15 13:05:10 +01:00
Shakker
d54eb4b74d fix: preserve optional ClickClack account typing 2026-07-15 13:05:10 +01:00
Shakker
d599ac9133 fix: resolve ClickClack token secret refs 2026-07-15 13:05:10 +01:00
Shakker
b09c99dfee fix: harden ClickClack setup credentials 2026-07-15 13:05:10 +01:00
Shakker
618c01af69 fix: verify ClickClack workspace ids during setup 2026-07-15 13:05:10 +01:00
Shakker
2c7705e363 fix: retain env-backed ClickClack accounts 2026-07-15 13:05:10 +01:00
Shakker
7af8f7dc22 docs: document ClickClack guided setup 2026-07-15 13:05:10 +01:00
Shakker
8dec391216 feat: add ClickClack setup wizard 2026-07-15 13:05:10 +01:00
Shakker
c3ab3133d8 fix: replace stale ClickClack credentials 2026-07-15 13:05:10 +01:00
Shakker
130fcefe47 feat: add ClickClack setup adapter 2026-07-15 13:05:10 +01:00
Shakker
b63ce98809 feat: add ClickClack setup inputs 2026-07-15 13:05:10 +01:00
Peter Steinberger
0393189243 chore(plugins): gate deprecation hygiene in CI and purge internal deprecated usage (#108261)
* chore(plugins): gate deprecation hygiene in CI and purge internal deprecated usage

* fix(agents): migrate auth-profiles oauth import to OAuthProviderId

* fix(whatsapp): use durability param in delivery-recovery test

* chore(scripts): declare shouldRunDeprecationHygieneChecks in check-changed types

* test(plugins): update runtime-api guard for ssrf policy rename
2026-07-15 04:15:23 -07:00
Ayaan Zaidi
8160bbdf2e fix(telegram): deliver rich-message authoring contract to every runtime via inbound formatting hints 2026-07-15 16:42:27 +05:30
Ayaan Zaidi
fa3b1b08fc test(telegram): use allowlisted token placeholders in contract fixtures 2026-07-15 16:42:27 +05:30
Peter Steinberger
1a27e7f3ec fix(codex): model-scoped usage-limit blocks, structural 429 classification, no silent API-key billing (#108254)
* test(codex): use allowlisted placeholder for auth-bridge api-key fixture

* fix(codex): model-scoped usage-limit blocks, structural 429 classification, no silent API-key billing

- usage-limit blocks written from Codex rate-limit resets are model-scoped via
  a persisted blockedScope marker: healthy sibling models on the same auth
  profile stay usable; a different/unknown model failing widens the block
  profile-wide and never narrows back; legacy rows without the marker stay
  profile-wide until they expire (#100556)
- Codex usage-limit failures now surface as status-429 Error objects at both
  ingress paths (turn-start and streamed turn failure, wrapped at the event
  projector), so core failover classification is structural instead of
  matching message wording; profile blocking uses only rate-limit data whose
  revision advanced during the turn
- usage-limit detection requires the structured codexErrorInfo signal; the
  over-broad "usage limit" substring match that misclassified unrelated
  errors as subscription limits is gone (#96815)
- subscription/OAuth routes can no longer silently fall back to env/auth.json
  API keys: ambient key fallback is restricted to explicit api-key routes,
  native-auth subscription routes verify the account is chatgpt-backed via
  account/read, and shared app-server clients are partitioned by auth
  requirement so pooled clients cannot cross billing modes (#106375)
- integrated e2e regression: usage-limit promptError -> same-model sibling
  profile rotation -> model fallback with reason rate_limit

* chore(codex): keep CodexUsageLimitErrorResult type local
2026-07-15 04:10:57 -07:00
Peter Steinberger
4e756adaaf fix(telegram): stop doctor repeating expired cache warnings (#108259)
* fix(telegram): retire expired legacy caches

* chore: drop release-owned changelog edit
2026-07-15 04:08:15 -07:00
pick-cat
1c2bcbb56f fix: classify provider code-only failover errors (#95729)
* fix(agents): classify provider-native failover errors

Co-authored-by: Altay <altay@hey.com>

* fix(agents): scope provider failover codes

* docs(changelog): credit provider failover fix

* style(anthropic): format failover classifier

* docs(changelog): defer release-owned entry

---------

Co-authored-by: Pick-cat <266665499+Pick-cat@users.noreply.github.com>
Co-authored-by: Altay <altay@hey.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-15 04:07:51 -07:00
Peter Steinberger
ddc9ec3f36 feat(discord): opt-in Discord Activities widget support (#107442)
Adds a Discord Activities integration so an agent can show a self-contained
HTML widget to Discord users, opened as a sandboxed Activity inside the client.
Off by default: routes, the discord_widget tool, and the launch handler register
only when channels.discord.activities is configured. OAuth identifies the user
and gates on the account allowlist; widget lookup is capability- or
instance-validated; token exchange is rate-limited; widget HTML runs in a
no-network sandboxed iframe.
2026-07-15 04:07:46 -07:00
VACInc
092bd16b79 fix: resolve Tavily SecretRefs in agent tools (#97827)
* fix(tools): preserve resolved search credentials

Co-authored-by: VACInc <3279061+VACInc@users.noreply.github.com>

Co-authored-by: Karol Zalewski <karol.zalewski@4zal.net>

* test(agents): isolate Tool Search runtime config coverage

* test(agents): isolate Tool Search runtime config coverage

* test(agents): isolate Tool Search runtime config coverage

* test(agents): isolate Tool Search runtime config coverage

* fix(tools): restore reviewed search credential delta

* docs(changelog): defer release-owned entry

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Karol Zalewski <karol.zalewski@4zal.net>
2026-07-15 03:56:12 -07:00
yujian
d43c8ec7a2 fix(feishu): route SDK traffic through ambient proxy (#86386)
* fix(feishu): route sdk http through ambient proxy

* fix(feishu): preserve request agents under proxy

* fix(feishu): honor managed proxy agent override

* fix(feishu): share ambient proxy transport

* chore(feishu): move release note to pr

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-15 03:47:19 -07:00
Peter Steinberger
026b688161 refactor(session-catalog): normalize search at gateway (#108240)
Co-authored-by: Leon-SK668 <0668001470@xydigit.com>
2026-07-15 03:38:05 -07:00
Peter Steinberger
84c7941f1e refactor: simplify recent async ownership fixes (#108164)
* fix(device-pair): preserve concurrent notify state

Co-authored-by: Alix-007 <li.long15@xydigit.com>

* refactor(ui): simplify logbook refresh ownership

Co-authored-by: Alix-007 <li.long15@xydigit.com>

* fix(qa-lab): bound multipass retry window

Co-authored-by: Alix-007 <li.long15@xydigit.com>

* chore: keep release notes in PR body

Co-authored-by: Alix-007 <li.long15@xydigit.com>

* fix(ui): keep logbook controller state private

Co-authored-by: Alix-007 <li.long15@xydigit.com>

* fix(ui): retire logbook client epochs

Co-authored-by: Alix-007 <li.long15@xydigit.com>

* fix(ui): retire inactive logbook ownership

Co-authored-by: Alix-007 <li.long15@xydigit.com>

* fix(device-pair): require atomic notify state

Co-authored-by: Alix-007 <li.long15@xydigit.com>

---------

Co-authored-by: Alix-007 <li.long15@xydigit.com>
2026-07-15 03:32:15 -07:00
Peter Steinberger
c57d1af958 fix(qa): wait for Matrix config reload (#108214) 2026-07-15 03:31:59 -07:00
Peter Steinberger
bb3fae8348 refactor(telegram): split message dispatch (#108228)
* refactor(telegram): split message dispatch

* fix(telegram): keep dispatch types internal

* fix(telegram): satisfy dispatch lint
2026-07-15 03:25:54 -07:00
Peter Steinberger
b2a336a2b9 refactor(policy): split policy state evidence (#108210) 2026-07-15 02:56:52 -07:00
Ayaan Zaidi
02a5ce6306 refactor(telegram): split rich block modules under lint budgets 2026-07-15 14:57:55 +05:30
Ayaan Zaidi
2b4c03cae8 fix(telegram): keep rich HTML islands intact on message-tool sends 2026-07-15 14:57:55 +05:30
Ayaan Zaidi
195e29343b feat(telegram): map agent HTML islands to typed rich blocks 2026-07-15 14:57:55 +05:30
Ayaan Zaidi
e3bc0f326c feat(telegram): emit Bot API 10.2 rich message blocks 2026-07-15 14:57:55 +05:30
Ayaan Zaidi
8170bdb556 test(telegram): drop rich-HTML formatter tests superseded by blocks emitter 2026-07-15 14:57:55 +05:30
mushuiyu886
65d55d046b fix(synology-chat): replies target the wrong user when Unicode nicknames span response chunks (#108019)
* fix(synology-chat): preserve UTF-8 in user list responses

* refactor(synology-chat): use native response decoding

Co-authored-by: 杨浩宇0668001029 <yang.haoyu@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-15 02:02:00 -07:00
Wynne668
61b85aa1d1 fix(clickclack): stop promptly during reconnect delay (#108145)
* fix(clickclack): cancel reconnect delay on gateway abort

* fix(clickclack): clean up failed websocket cycles

Co-authored-by: ZengWen-DT <ceng.wen@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-15 01:59:58 -07:00
Peter Steinberger
6eda184f27 refactor: simplify native session executable resolution (#108169) 2026-07-15 01:49:45 -07:00
Dallin Romney
ad34552473 refactor(qa): migrate Matrix scenarios into QA Lab (#103589)
* refactor(qa): migrate Matrix scenarios into QA Lab

* fix(qa): build Matrix boundary declarations

* fix(qa): preserve Matrix preview boundaries

* fix(qa): preserve Matrix hot reload semantics

* fix(qa): harden Matrix destructive scenario failures

* fix(qa): harden Matrix scenario isolation

* fix(qa): close Matrix negative scenario blind spots

* fix(qa): isolate Matrix substrate state

* fix(qa): harden Matrix transport substrate

* fix(qa): preserve Matrix profile and event parity

* fix(qa): preserve explicit scenario models

* fix(qa): align Matrix scenario coverage taxonomy

* fix(qa): format Matrix allowlist cleanup

* fix(qa): satisfy migrated Matrix CI contracts

* fix(qa): reconcile Matrix migration with current main

* fix(qa): break scenario flow import cycle

* fix(qa): reconcile Matrix max-lines ownership

* fix(qa): address Matrix review boundaries

* fix(qa): remove stale Matrix lint suppression

* fix(qa): adopt split Matrix E2EE flows

* fix(qa): export Matrix scenario record guard

* fix(qa): align Matrix migration with privatized helpers

* refactor(qa): finish Matrix QA Lab ownership

* fix(qa): preserve Matrix suite defaults

* fix(qa): reconcile Matrix cleanup with current main

* test(qa): follow canonical Matrix profile size

* fix(qa): guard stale Matrix QA package output

* docs(qa): redirect retired Matrix QA pages

* refactor(qa): finish Matrix runner rename

* test(qa): assert Matrix defaults through profile resolver

* docs: refresh QA cleanup map

* fix(qa): privatize Matrix storage discovery
2026-07-15 01:22:20 -07:00
wangmiao0668000666
72521492be fix(workspaces): reject non-decimal --grid segments via strict parser (#107478)
* fix(workspaces): reject non-decimal --grid segments via strict parser

Swap bare Number() in parseWorkspaceGrid for parseStrictNonNegativeInteger
from openclaw/plugin-sdk/number-runtime, so JS-coercion forms (hex,
exponent, octal, binary, negative, empty segment) are rejected at the
CLI --grid parser boundary instead of being silently persisted into
Widget.grid. Same owner-boundary shape as #106384 (google-meet --since)
and #106926 (onepassword --limit).

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

* test(workspaces): prove persisted grid coercions

Co-authored-by: wangmiao0668000666 <wangmiao0668000666@users.noreply.github.com>

---------

Co-authored-by: wangmiao0668000666 <wangmiao0668000666@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-15 01:18:02 -07:00
QiuYuang
92ed1c73ec fix(matrix): keep draft previews for queued followups (#108094)
* fix(matrix): reset draft preview for queued followups

* fix(matrix): rearm queued progress drafts

Co-authored-by: 仇宇昂0668000995 <chou.yuang@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-15 01:16:58 -07:00
Leon-SK668
42d42703e6 fix(session-catalog): keep searches UTF-16 safe (#107719) 2026-07-15 01:16:01 -07:00
Peter Steinberger
2afa9de438 fix(codex): structured abort detection, tool-schema repair, native-result middleware relay (#108105)
* fix(codex): use structured turn status for aborts, repair tool schemas, relay native results to middleware

- turn aborts are detected from the correlated turn/completed status instead
  of byte-matching private codex-rs prose; the <turn_aborted> marker remains a
  non-terminal user-interrupt hint (tags only, wording-independent) because the
  app-server collapses all abort reasons into "interrupted" (#99268)
- dynamic-tool schemas are repaired before projection via the shared OpenAI
  normalizer: annotation nulls stripped, type:null inferred from object/array
  shape hints; unrepairable null constraints stay quarantined instead of
  widening the schema (#106277, #97913)
- Codex-native tool results now flow through agentToolResultMiddleware at the
  post_tool_use relay boundary (observe-only: the Codex PostToolUse contract
  cannot replace a native tool response) (#95597)

* test(codex): regenerate prompt snapshots for normalized dynamic-tool schemas

The shared OpenAI strict-compat normalization now runs on Codex dynamic tools,
so empty object schemas gain additionalProperties:false and required:[] in the
snapshot payloads, matching what the OpenAI provider family sends.
2026-07-15 00:51:24 -07:00
Yuval Dinodia
7974def3fd fix(codex): restore shell for restricted turns (#92294)
* fix(codex): keep OpenClaw exec when native surface has no environment (#92238)

* chore: keep release note in PR

* fix(codex): keep shell tool type internal

Co-authored-by: yetval <yetvald@gmail.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-15 00:37:04 -07:00
Eden
cce791607e fix(line): drop blank entries from trailing commas in agenda/device directives (#105381)
* fix(line): drop blank entries from trailing commas in agenda/device directives

* fix(line): drop blank device action labels

Co-authored-by: Eden <146086744+edenfunf@users.noreply.github.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-15 00:32:30 -07:00