Commit Graph

16109 Commits

Author SHA1 Message Date
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
Peter Steinberger
061ccb1a26 refactor(active-memory): prepare recall context once 2026-07-15 08:30:41 +01:00
Peter Steinberger
46fad5296a refactor(github-copilot): own runtime auth in provider (#108096) 2026-07-15 00:19:44 -07:00
Leon-SK668
9a8ed45935 fix(linux-node): keep command errors UTF-16 safe (#107717) 2026-07-15 00:16:39 -07:00
Peter Steinberger
0754d23615 fix: group native sessions by host (#108062)
* fix(control-ui): group native sessions by host

* test: satisfy native session checks

* chore: remove release-owned changelog entry
2026-07-14 23:51:00 -07:00
Peter Steinberger
80e1509fe8 fix(codex): keep parent binding on cross-key handoff and stop foreign-transcript mirror warns (#108042)
- session_end with a provably different nextSessionKey (dashboard "New Chat",
  fork child) no longer permanently retires the still-live parent Codex
  binding; same-key rollovers, unknown-key ends, and terminal ends retire as
  before (#106778)
- mirrored session-history reads treat well-formed non-Codex transcripts as an
  empty mirror instead of a read failure, so codex harness hooks stop warning
  on every non-Codex model run; corrupted session headers stay on the warn
  path (#106556)
2026-07-14 23:50:01 -07:00
Peter Steinberger
c51bb5ed20 test(github-copilot): align token endpoint fixtures (#108047)
* test(github-copilot): align token endpoint fixtures

* docs: refresh generated docs map
2026-07-14 23:25:49 -07:00
Alix-007
d5ece3b2d7 fix(device-pair): bound notifier polling overlap (#106395)
* fix(device-pair): bound notifier polling overlap

* fix(device-pair): retain notify lock across reloads

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

* test(device-pair): prove reload delivery dedupe

* test(device-pair): type pairing list mock

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-14 23:17:09 -07:00
Peter Steinberger
3d4ba02574 feat(active-memory): add recall-specific fast mode (#108043)
* feat(active-memory): add fast mode override

* fix(agents): preserve fast auto cutoff

* fix(active-memory): inherit parent fast mode

* docs: refresh generated docs map
2026-07-14 23:09:04 -07:00
VectorPeak
1ac30c8491 fix(tlon): send fragment image URLs as media (#104853)
* fix(tlon): keep fragment image URLs as media

Co-authored-by: chatgpt-codex-connector[bot] <199175422+chatgpt-codex-connector[bot]@users.noreply.github.com>

* test(tlon): prove fragment image media send path

Co-authored-by: chatgpt-codex-connector[bot] <199175422+chatgpt-codex-connector[bot]@users.noreply.github.com>

* test(tlon): remove mocked fragment outbound proof

Keep the PR evidence scoped to the helper-level regression test until live Tlon proof is available. The mocked outbound test was not sufficient for the reviewer-requested live behavior proof and triggered serialized-state review noise.

Co-authored-by: chatgpt-codex-connector[bot] <199175422+chatgpt-codex-connector[bot]@users.noreply.github.com>

* docs: refresh docs map for CI

Regenerate docs/docs_map.md after syncing with upstream/main so the docs map check passes on this PR branch.

Co-authored-by: chatgpt-codex-connector[bot] <199175422+chatgpt-codex-connector[bot]@users.noreply.github.com>

* fix(tlon): constrain fragment image URL matching

Co-authored-by: chatgpt-codex-connector[bot] <199175422+chatgpt-codex-connector[bot]@users.noreply.github.com>

* fix(tlon): harden image URL classification

Co-authored-by: VectorPeak <garrufariw@gmail.com>

---------

Co-authored-by: chatgpt-codex-connector[bot] <199175422+chatgpt-codex-connector[bot]@users.noreply.github.com>
Co-authored-by: VectorPeak <VectorPeak@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-14 23:04:21 -07:00
Peter Steinberger
7f1baa6d75 refactor(codex): trim session catalog exports (#108045)
* refactor(codex): privatize session catalog helpers

* chore(deadcode): refresh export baseline
2026-07-14 22:59:46 -07:00
Wynne668
f0bcf899c0 fix(imessage): preserve split Full Disk Access errors (#107393) 2026-07-14 22:52:49 -07:00
Peter Steinberger
5bbf30b852 refactor(canvas): remove internal A2UI handler factory (#108038)
* refactor(canvas): remove internal A2UI handler factory

* chore(deadcode): refresh export baseline
2026-07-14 22:41:27 -07:00
Peter Steinberger
1967e4c04d refactor(telegram): privatize internal plugin surfaces (#108026)
* refactor(telegram): privatize internal plugin surfaces

* chore(deadcode): refresh export baseline
2026-07-14 22:20:46 -07:00
qingminlong
7440a1ae83 fix(file-transfer): reject oversized dir.fetch preflights (#106293)
* fix(file-transfer): reject oversized dir fetch preflights

* test(file-transfer): cover real oversized dir preflight

* test(file-transfer): wrap oversized preflight fixture

* test(file-transfer): cover preflight du fallback

* ci: restore max-lines baseline entry

* fix(file-transfer): make dir preflight size check authoritative

* ci: drop stale max-lines baseline restore

* test(file-transfer): gate tar-backed preflight cases

* fix(file-transfer): preserve preflight bounds and errors

---------

Co-authored-by: Omar Shahine <10343873+omarshahine@users.noreply.github.com>
2026-07-14 22:14:08 -07:00
Peter Steinberger
e9fc23ad1f refactor(plugin-sdk): remove private testing barrel ahead of window (#108020) 2026-07-14 22:13:37 -07:00
qingminlong
fc71a6c0d7 fix(matrix): parse JSON response types with mixed casing (#105470)
* fix(matrix): parse JSON content types case-insensitively

* test(matrix): require exact JSON media type

Co-authored-by: qingminlong <0668001063@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-14 22:03:17 -07:00
clawsweeper[bot]
3a208a5068 fix(discord): prevent presence wake floods after reconnects (#107969)
* feat(discord): throttle online-presence events after gateway reconnects

After a Discord gateway (re)connect the presence replay burst emitted one
system event per member, waking the agent each time. Add a per-account
emission gate: a post-reconnect suppression window (default 5 min), a
sliding-window burst limit (default 8/60s, logged once per episode), and
a configurable per-user greeting cooldown (default 8h). New guild
presenceEvents knobs: cooldownSeconds, reconnectSuppressSeconds,
burstLimit, burstWindowSeconds.

* fix(discord): preserve presence throttle retries

* fix(discord): preserve presence throttle retries

* fix(discord): scope presence throttle per guild

Co-authored-by: openclaw-clawsweeper[bot] <openclaw-clawsweeper[bot]@users.noreply.github.com>

* fix(discord): keep presence gate internals private

Co-authored-by: openclaw-clawsweeper[bot] <openclaw-clawsweeper[bot]@users.noreply.github.com>

---------

Co-authored-by: openclaw-clawsweeper[bot] <openclaw-clawsweeper[bot]@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Peter Steinberger <peter@steipete.me>
2026-07-14 22:02:53 -07:00
sunlit-deng
696aeb07dd fix(logbook): reject malformed snapshot base64 (#106473)
* fix(logbook): reject malformed snapshot base64

* fix(logbook): import base64 canonicalizer from focused media-core subpath

* fix(logbook): validate hostile snapshot payloads

Co-authored-by: sunlit-deng <yang.jiajun1@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-14 22:01:44 -07:00
Peter Steinberger
3ce986d526 fix(ci): restore Discord architecture and max-lines gates (#108013)
* fix(discord): break channel info cache cycle

* chore(ci): prune stale Discord max-lines baseline
2026-07-14 21:52:09 -07:00
Marcus Castro
0b565d16bc refactor(whatsapp): delegate inbound context policy to SDK (#107066) 2026-07-15 01:50:12 -03:00
xingzhou
c508e4a2b8 fix(workspaces): array bindings can select the wrong item for malformed pointers (#107317)
* fix(workspaces): reject malformed array indices in file bindings

* test(workspaces): cover canonical array pointers

Co-authored-by: xingzhou <zhangguiping@xydigit.com>

* test(workspaces): reject zero-padded array index

Co-authored-by: xingzhou <zhang.guiping@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: xingzhou <zhangguiping@xydigit.com>
2026-07-14 21:40:39 -07:00
Peter Steinberger
3932a6038c refactor(discord): privatize internal plugin surfaces (#108003)
* refactor(discord): privatize internal plugin surfaces

* chore(deadcode): update export baseline
2026-07-14 21:26:00 -07:00
Peter Steinberger
bac7744233 fix(qa): scope duplicate parity capture handling 2026-07-15 05:03:43 +01:00
Peter Steinberger
33e415ea6c fix(qa): keep parity helper private 2026-07-15 05:03:43 +01:00
Peter Steinberger
e23ba67142 fix(qa): reconcile duplicate parity capture rows 2026-07-15 05:03:43 +01:00
Vincent Koc
11c570294a test(foundry): use approved token placeholders 2026-07-15 05:03:42 +01:00
Marcus Castro
bc769663f8 fix(qa): restore WhatsApp scenario contracts (#107543) 2026-07-15 00:58:38 -03:00
Peter Steinberger
938bddddc1 refactor: privatize QA Matrix and Workspaces internals (#107973)
* refactor(qa-matrix): replace testing export facades

* refactor(workspaces): remove broadcast reset export

* chore(deadcode): shrink unused export baseline
2026-07-14 20:48:46 -07:00
Alix-007
4e24470ced fix(qa-lab): prevent Multipass Node download hangs (#107702) 2026-07-14 20:47:49 -07:00
Alix-007
e9d76ae2a7 fix(qa-lab): prevent dashboard API hangs (#107701) 2026-07-14 20:45:57 -07:00
Alix-007
1878c57a46 fix(qa-lab): prevent Slack desktop auth hangs (#107700) 2026-07-14 20:43:46 -07:00
Peter Steinberger
7748574c4b fix: stabilize flaky test shards blocking merges (#107938)
* test: stabilize flaky test shards

* style: format Feishu delivery trace types
2026-07-14 20:41:54 -07:00
Alix-007
8d260d2f49 fix(qa-lab): prevent Telegram desktop API hangs (#107699) 2026-07-14 20:40:55 -07:00
Peter Steinberger
30738a3c3b fix(onepassword): preserve authorization handoff 2026-07-14 23:23:17 -04:00
Peter Steinberger
894cc604a5 refactor(core): declare outbound target grammar on the messaging adapter (batch 2) (#107953)
* refactor(core): declare outbound target grammar on the messaging adapter (batch 2)

* test(outbound): drop a useless spread in the comparison fixture
2026-07-14 20:09:00 -07:00
Peter Steinberger
b50822aab5 refactor(channels): remove Google Chat and Matrix test exports (#107951)
* refactor(googlechat): privatize internal test seams

* refactor(matrix): remove internal test exports

* chore(deadcode): refresh export baseline
2026-07-14 20:06:39 -07:00
Shakker
2c95bd2387 fix: repair main CI regressions 2026-07-15 04:03:56 +01:00
Peter Steinberger
5fc7ba6da0 test: isolate UI globals and satisfy Mattermost lint (#107936) 2026-07-14 19:45:53 -07:00
Peter Steinberger
ed12937cbd refactor(plugin-sdk)!: delete the zero-consumer channel-ingress facade, AccessFacts projections, and dead dispatch aliases (#107906)
* refactor(plugin-sdk)!: delete the zero-consumer channel-ingress facade, AccessFacts projections, and dead dispatch aliases

* chore(plugin-sdk): refresh API baseline hash for the facade deletions

* fix(channels): drop dead AccessFacts field writes stranded by the facade deletion

* chore(plugin-sdk): refresh API baseline hash after rebase
2026-07-14 19:43:18 -07:00
Kyle Klouzal
2333bd59db fix: keep yielded parent turns nonterminal (#95996)
* fix: keep yielded parent turns nonterminal

* fix: type chat final stop reasons

* test: isolate yielded session reconciliation

* fix: refresh yielded lifecycle generated surfaces

* test: register Codex lifecycle test shard

---------

Co-authored-by: FullerStackDev <263060202+fuller-stack-dev@users.noreply.github.com>
2026-07-14 20:35:33 -06:00
Peter Steinberger
57d926b4fd fix: connect resumed native terminals reliably (#107688)
* fix: render resumed paired-node terminals

* fix(control-ui): connect native catalog terminals reliably

* chore: keep release notes in PR body

* fix(control-ui): require terminal reconnect cancellation

* fix(gateway): cancel timed-out terminal opens safely

* fix(control-ui): recover stalled terminal opens

* chore(ui): refresh i18n fallback baseline

* fix: preserve login shell path for resumed terminals

* refactor(plugin-sdk): avoid extra resolver export

* fix(gateway): normalize terminal open failures

* test(control-ui): split terminal readiness coverage

* docs: explain catalog terminal PATH restoration

* fix(control-ui): complete terminal readiness release gates

* fix(ci): remove unused shell resolver exports

* chore(plugin-sdk): refresh API baseline after rebase
2026-07-14 19:18:19 -07:00
Peter Steinberger
6d3eff97a0 refactor(channels): privatize Mattermost and MSTeams test seams (#107924)
* refactor(mattermost): privatize internal test seams

* refactor(msteams): privatize internal test seams

* docs(mattermost): fix public API import path

* refactor(deadcode): shrink export baseline
2026-07-14 19:11:46 -07:00
Peter Steinberger
72e50c82fb refactor(clickclack): privatize command menu mapping (#107923) 2026-07-14 19:09:51 -07:00