Alix-007
f1778ad36b
fix(ui): prevent browser screenshot fetch hangs ( #107703 )
...
* fix(ui): prevent browser screenshot fetch hangs
* test(ui): cover stalled screenshot body
* test(ui): verify screenshot timer cleanup
* test(ui): cover successful timer cleanup
---------
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-14 22:15:03 -07:00
xydt-tanshanshan
f638cbd0f9
fix(doctor): preserve allowlist entries for version-bound runtime plugins during stale config scan ( #107285 )
...
* fix(doctor): preserve allowlist entries for version-bound runtime plugins (codex) during stale config scan
* fix(doctor): restore codex to scanner stale expectation, protect at repair-sequencing
Scanner now flags codex in plugins.allow as stale so diagnostics are visible.
Repair-sequencing preserves the entry via preservePluginIds which already
includes VERSION_BOUND_RUNTIME_PLUGIN_IDS.
* fix(doctor): scope version-bound runtime plugin preservation to allow surface only
ClawSweeper P2: VERSION_BOUND_RUNTIME_PLUGIN_IDS was applied globally
across all stale config surfaces (deny, entries, slots, channels, etc.),
but only plugins.allow needs preservation. Move to a surface-scoped
parameter surfacePreservePluginIds so codex is preserved only in allow.
* fix(doctor): harden version-bound allowlist repair
* fix(doctor): retain version-bound plugin policy
* fix(doctor): align version-bound plugin diagnostics
Co-authored-by: hailory <hailory@xydigit.com >
---------
Co-authored-by: hailory <hailory@xydigit.com >
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-14 22:14:11 -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
Peter Steinberger
290836cafd
refactor(config): split config I/O responsibilities ( #107983 )
...
* refactor(config): split config I/O
* fix(config): align split modules with guardrails
* fix(config): remove dead write metadata helper
* style(config): format write safety imports
* fix(config): preserve comment-loss warning on split writes
2026-07-14 22:11:22 -07:00
Peter Steinberger
5b097eb48c
feat(ui): pick a repo folder and a cloud worker together in the new-session composer ( #107976 )
2026-07-14 22:10:58 -07:00
snowzlmbot
1eec68a6a0
fix(gateway): recover when suppressed channel secrets are unavailable ( #106826 )
...
* fix(gateway): preserve safe-mode secret recovery
* test(gateway): sanitize SecretRef fixtures
Co-authored-by: snowzlmbot <293528334+snowzlmbot@users.noreply.github.com >
* test(gateway): use inert token placeholder
Co-authored-by: snowzlmbot <293528334+snowzlmbot@users.noreply.github.com >
---------
Co-authored-by: snowzlmbot <293528334+snowzlmbot@users.noreply.github.com >
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-14 22:08:58 -07:00
mushuiyu886
646dfd7e76
fix(plugins): preserve state on npm metadata failures ( #107063 )
...
* fix(plugins): preserve state on npm metadata failures
* fix(plugins): harden npm metadata recovery
Co-authored-by: 杨浩宇0668001029 <yang.haoyu@xydigit.com >
* refactor(plugins): adapt metadata errors to installer split
Co-authored-by: 杨浩宇0668001029 <yang.haoyu@xydigit.com >
* fix(plugins): validate preserved npm payloads
Co-authored-by: 杨浩宇0668001029 <yang.haoyu@xydigit.com >
* fix(plugins): satisfy update lint
---------
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-14 22:05:15 -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
Peter Steinberger
aac4c16f84
refactor(doctor): split Codex route diagnostics ( #107955 )
2026-07-14 22:02:56 -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
Peter Steinberger
74eea60e1b
test(ci): serialize hooks process bootstraps ( #107977 )
...
* test(ci): serialize hooks process bootstraps
* fix(ci): repair main gate contracts
* fix(ci): refresh max-lines suppression baseline
2026-07-14 22:01:47 -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
56ff612606
test(worktrees): cover session liveness across gc entry points ( #107989 )
...
Co-authored-by: RickLin <83101411+ObliviateRickLin@users.noreply.github.com >
2026-07-14 21:59:49 -07:00
Peter Steinberger
cbded6808b
test: speed doctor preview warnings ( #108017 )
2026-07-14 21:53:25 -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
Monkey-wusky
4a9a556a3a
fix(config): reject zero-value resetArchiveRetention to prevent silent data loss ( #104516 )
...
* fix(config): reject zero-value resetArchiveRetention to prevent silent data loss
* fix: add braces to guard clauses for curly lint rule
* fix: normalize numeric values and cover pruneAfter fallback in migration
* fix: reject zero-value pruneAfter at schema level to close fallback gap
* fix: independently check and repair both retention fields in migration
* fix: split doctor diagnostics into field-specific rules and messages
* fix: remove unused local in migration test helper
* fix: repair 5 lint errors (curly braces, zero-fraction, narrow value)
* fix(doctor): rewrite zero resetArchiveRetention to false instead of deleting it
Deleting a zero resetArchiveRetention caused the runtime to fall back to
pruneAfter (default 30d), which contradicted the doctor output that
claimed archives would be kept indefinitely. Only an explicit false
value produces indefinite retention per the documented schema.
- P1: Rewrite zero resetArchiveRetention to false in the doctor
migration apply callback, matching the promised indefinite-retention
behavior.
- P3: Update the pruneAfter rule warning to describe eligible
stale/non-preserved session entries instead of "all sessions".
* fix(config): repair zero retention safely
---------
Co-authored-by: Peter Steinberger <steipete@gmail.com >
Co-authored-by: Peter Steinberger <peter@steipete.me >
2026-07-14 21:47:40 -07:00
Erick Kinnee
067bc662fa
fix(sqlite): distinguish shared system SQLite in WAL safety error ( #107771 )
...
* fix(sqlite): distinguish shared system SQLite from embedded in WAL safety error
* test(sqlite): cover shared build diagnostics
Co-authored-by: Erick Kinnee <erick@ekinnee.dev >
* style(sqlite): format shared build check
Co-authored-by: Erick Kinnee <erick@ekinnee.dev >
---------
Co-authored-by: Erick Kinnee <erick@ekinnee.dev >
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-14 21:46:09 -07:00
Patrick Erichsen
ef110e9a0f
fix(state): prefer SQLite plugin metadata during migration ( #107961 )
...
* fix(state): prefer SQLite plugin install metadata
* test(gateway): type hidden boundary metadata
* test(ci): prune retired QA Matrix line baseline
* test(ci): prune retired QA Matrix line baseline
* fix(state): ignore legacy plugin JSON after SQLite
* fix(state): prefer SQLite plugin install metadata
* fix(state): keep legacy JSON inert after SQLite migration
* fix(state): prefer SQLite plugin install metadata
---------
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-14 21:41:19 -07: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
4401aa7031
test: speed doctor host compatibility tests ( #108008 )
2026-07-14 21:40:27 -07:00
lee-xydt
6ce439da25
fix(config): warn before stripping JSON5 comments on config write ( #107604 )
...
* fix(config): warn before stripping JSON5 comments on config write
Add checkCommentLossWarning in json5-comments.ts to detect JSON5 comments
before config writes. Warn via deps.logger.warn for main config writes and
via options.warn for $include file writes. Both paths support skipOutputLogs
to suppress warnings during automated operations.
Fixes #105683
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
* fix(config): remove public warn callback, route through internal sink
Fixes #105683
- Remove warn field from exported ConfigWriteOptions (P1 merge-risk)
- Default checkCommentLossWarning to console.warn when no callback
- Move include warning after hash-conflict/rejection checks
- Update tests to spy on console.warn instead of custom callback
* fix(config): warn before stripping JSON5 comments
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com >
Co-authored-by: Peter Steinberger <steipete@gmail.com >
Co-authored-by: Peter Steinberger <peter@steipete.me >
2026-07-14 21:39:18 -07:00
Peter Steinberger
4a6dc1fe1d
fix(ui): show New Session failures in a centered alert ( #107997 )
...
* fix(ui): center new session errors
* chore: remove release-owned changelog entry
2026-07-14 21:37:45 -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
decdaf1718
fix(ci): restore session history types and max-lines gate ( #107987 )
...
* fix(gateway): type inline session history messages
* fix(ci): prune stale max-lines baseline
2026-07-14 21:24:40 -07:00
Peter Steinberger
6c0725e0d9
fix(release): tolerate exhausted GitHub read quota
2026-07-15 05:21:30 +01:00
Peter Steinberger
81d634be50
test: speed CLI capture suites ( #107993 )
2026-07-14 21:16:34 -07:00
Peter Steinberger
d61250ee7c
fix(macos): keep left and right menu bar clicks reliable ( #107786 )
...
* fix(macos): stabilize menu bar click routing
* chore(macos): refresh native i18n inventory
* test(macos): avoid global menu event dispatch
* fix(macos): initialize status mouse router
* test(macos): avoid bare status button fixture
* test(macos): isolate status click routing
2026-07-14 21:12:58 -07:00
Peter Steinberger
2372c71697
fix(release): preserve candidate Node runtime
2026-07-15 05:03:43 +01:00
Peter Steinberger
5fa348f3ed
fix(release): pin max-lines debt to branch merge base
2026-07-15 05:03:43 +01: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
01b0989353
fix(release): allow shipped ledger metadata references
2026-07-15 05:03:43 +01:00
Peter Steinberger
cb60e0a667
ci: stabilize release validation checks ( #106959 )
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
jincheng-xydt
41aa36a6e7
fix(doctor): accept memory provider none without api key ( #107778 )
...
* fix(doctor): accept memory provider none without api key
* test(doctor): preserve FTS-only backend diagnostics
Co-authored-by: jincheng-xydt <xu.jincheng@xydigit.com >
---------
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-14 21:01:38 -07:00
Marcus Castro
bc769663f8
fix(qa): restore WhatsApp scenario contracts ( #107543 )
2026-07-15 00:58:38 -03:00
Peter Steinberger
3eb8b3a0f8
refactor(plugins): split plugin installation flows ( #107960 )
...
* refactor(plugins): split plugin installation flows
* fix(plugins): keep compatibility helper private
2026-07-14 20:51:21 -07: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
Peter Steinberger
ce078367e4
fix(docs): preserve plugin surface identifiers
2026-07-14 23:41:24 -04:00
Alix-007
8d260d2f49
fix(qa-lab): prevent Telegram desktop API hangs ( #107699 )
2026-07-14 20:40:55 -07:00
Peter Steinberger
abfdfd65b8
docs: refresh generated docs map ( #107966 )
2026-07-14 20:38:53 -07:00
Shakker
977bf5b0bf
fix: split native chat work by run ( #107965 )
2026-07-15 04:38:01 +01:00
Shakker
4755dee240
fix: preserve hidden chat run boundaries
2026-07-15 04:38:01 +01:00