Commit Graph

68679 Commits

Author SHA1 Message Date
Peter Steinberger 34b8a3fda0 fix(release): isolate trusted candidate dependencies 2026-07-15 07:08:00 +01:00
Peter Steinberger f30d9b250a fix(worktrees): fail closed on owner lookup errors (#108041) 2026-07-14 23:06:26 -07:00
Dallin Romney fc56b55403 docs: refresh generated docs map (#108052) 2026-07-14 23:05:07 -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
Peter Steinberger 701d02f241 refactor(gateway): make secret assignment projection explicit (#108040) 2026-07-14 22:56:54 -07:00
Peter Steinberger c8733ea674 fix(release): run candidate smoke from trusted tooling 2026-07-15 06:56:04 +01:00
Wynne668 f0bcf899c0 fix(imessage): preserve split Full Disk Access errors (#107393) 2026-07-14 22:52:49 -07:00
Leon-SK668 9f471d0189 fix(gateway): keep worker failures UTF-16 safe (#107718) 2026-07-14 22:51:38 -07:00
Peter Steinberger 2e73cff6ca fix(maint): keep PR maintenance delta-only (#108018)
* fix(maint): keep fork prep sync delta-only

* fix(ci): use exact merge parent for PR diffs

* fix(ci): pass docs diff base through environment

* test(ci): cover environment-mediated docs base
2026-07-14 22:49:33 -07:00
Peter Steinberger ccefa7c028 test: speed exec no-output timer (#108037) 2026-07-14 22:48:11 -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 d702f6fb33 ci: shorten full release validation critical path (#107894)
* ci(release): parallelize plugin Docker lanes

* test(plugins): expect malformed URL redaction

* ci: start release performance validation concurrently

* docs(agents): guard PR operations after throttling
2026-07-14 22:39:32 -07:00
Peter Steinberger 596fb742fc fix(macos): update Peekaboo for Swift 6.2 (#107926) 2026-07-14 22:38:22 -07:00
Yuval Dinodia d576881390 fix(github-copilot): reject unsupported OAuth enterprise domain before refresh and model routing (#105584)
* fix(github-copilot): reject unsupported OAuth enterprise domain before refresh and model routing

Legacy github-copilot OAuth credentials can carry a non-github.com
enterpriseUrl. The token-refresh path templated it into the endpoint and
sent the bearer refresh token there with no allowlist, and the model
routing path derived a base URL from the same credential, so an unexpired
credential kept routing its access token to that origin without ever
reaching a refresh.

A persisted credential origin that is not on the Copilot host allowlist
is now rejected before any request is issued and before any model URL is
produced. Because an off-allowlist origin means the stored access token
may itself have been minted by that origin, the credential is refused as
a whole rather than coerced to github.com: modifyModels withholds the
github-copilot models so the token has no route, and its proxy-ep is
never trusted. Login rejects an unsupported host up front, so every path
that turns a domain into a bearer-bearing URL validates first.
formatAuthDoctorHint guides affected users to re-authenticate, mirroring
the qwen-portal hint. Supported hosts are unchanged: github.com and
*.ghe.com data-residency tenants still route and refresh as before.

The allowlist plus a new isSupportedGithubCopilotDomain predicate move to
a dependency-free plugin-sdk leaf so the core OAuth runtime can share them
without closing a module cycle; plugin-sdk/provider-auth re-exports
normalizeGithubCopilotDomain, so the plugin-owned GitHub Copilot provider
keeps its existing import.

Fixes #103078.

* fix(github-copilot): resolve provider auth base conflict

* fix(github-copilot): resolve provider auth base conflict

* fix(github-copilot): validate token proxy endpoint

* fix(github-copilot): remove stale helper import

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Peter Steinberger <peter@steipete.me>
2026-07-14 22:29:35 -07:00
Alix-007 ebb1e83b64 fix(logbook): bound background refresh concurrency (#106397)
* fix(logbook): bound background refresh concurrency

* fix(logbook): unify refresh ownership

* style(logbook): format type import

* test(logbook): use typed rejection error

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-14 22:27:20 -07:00
Peter Steinberger b9a837ec8d refactor(agents): split agent session responsibilities (#107948) 2026-07-14 22:25:08 -07:00
Peter Steinberger 9275f476f4 fix(release): retry flaky fresh Parallels lanes 2026-07-15 06:24:32 +01:00
Peter Steinberger fbe033214d test: speed doctor plugin install tests (#108022) 2026-07-14 22:21:26 -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
Peter Steinberger eebc0dbc33 refactor(auto-reply): split agent runner execution (#107985)
* refactor(auto-reply): split agent runner execution

* style(auto-reply): satisfy promise executor lint

* fix(ci): align refactor baselines and test types

* fix(ci): prune stale max-lines baseline
2026-07-14 22:20:25 -07:00
Peter Steinberger 9384a40393 build(linux): allow macOS and Windows test builds of the desktop app (#108004)
The desktop companion crate was Linux-only. All platform-specific code
lives in canvas.rs (WebKitGTK, cairo, unix sockets, SO_PEERCRED), so:
move webkit2gtk/cairo-rs/libc under linux target dependencies, gate the
canvas module, its protocol registration, invoke handler, and exit
shutdown to Linux, add a USERPROFILE home fallback and an explicit
no-op installer error for Windows, and add the multi-size icon.ico
Windows resource. Linux behavior is unchanged; macOS/Windows builds are
for testing (macOS cargo build+test green locally; Windows aarch64-msvc
built and launched in a Windows 11 ARM VM).
2026-07-14 22:17:05 -07:00
Peter Steinberger 51d85769b3 fix(ui): terminal artifacts after hide and show (#107970)
* fix(ui): repaint terminal after hide and show

* chore: leave release notes to release workflow

* fix(ui): keep terminal scrollbar hidden on repaint

* test(ui): assert terminal repaint pixels
2026-07-14 22:15:59 -07:00
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