Commit Graph

38607 Commits

Author SHA1 Message Date
morluto
16801bf4f0 fix(agents): prevent subagent registry resurrection (#105793)
* fix(agents): retire legacy subagent registry JSON

Co-authored-by: morluto <76467478+morluto@users.noreply.github.com>

* fix(agents): keep migration decision internal

Co-authored-by: morluto <76467478+morluto@users.noreply.github.com>

* style(agents): format migration decision type

Co-authored-by: morluto <76467478+morluto@users.noreply.github.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-15 17:01:42 -07:00
Peter Steinberger
9c065c895e refactor(cli): split capability commands by domain (#108419)
* refactor(cli): split capability commands by domain

* fix(cli): keep capability metadata type private
2026-07-15 16:57:21 -07:00
Dallin Romney
2d9b78fff7 refactor(qa): canonicalize live scenario coverage (#108464) 2026-07-15 16:50:41 -07:00
Peter Steinberger
ff8d4a3f9c style: format file-read 2026-07-16 00:16:27 +01:00
sunlit-deng
55a822dc68 fix(sessions): keep tail follow cursor aligned with bytes actually read (#108127)
* fix(sessions): keep tail follow cursor aligned with bytes actually read

* refactor(infra): share synchronous file window reads

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

---------

Co-authored-by: Peter Steinberger <peter@steipete.me>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-15 16:00:50 -07:00
xingzhou
3b51889c3b fix(extensions): prevent corrupted UTF-8 in api.exec output (#108365)
* fix(extensions): preserve split UTF-8 in api.exec

* test(agents): cover incomplete exec UTF-8 at EOF

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

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-15 15:59:59 -07:00
Peter Steinberger
94b2774098 test(agents): stabilize stale lock retry timing (#108483) 2026-07-15 15:54:28 -07:00
Peter Steinberger
4b286de845 fix(release): repair validation correlations (#108480) 2026-07-15 15:53:17 -07:00
sunlit-deng
8cc8feee4d fix(agents): keep continuation bootstrap marker across short reads (#108253)
* fix(agents): keep bootstrap markers across short reads

* refactor(infra): share bounded file window reads

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

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-15 15:50:59 -07:00
Josh Avant
3b47d18cc7 fix(zalo): reject unsupported message actions early (#108434) 2026-07-15 15:29:46 -07:00
Josh Avant
2cc04c205f fix(qa-channel): bind message actions to authorized targets (#108433)
* fix(qa-channel): bind message actions to authorized targets

* fix(qa-channel): close target-binding review gaps

* fix(qa-lab): preserve conversation identity in snapshots

* fix(qa-channel): canonicalize scoped targets

* fix(qa-channel): unify target parsing

* fix(qa-channel): close review gaps
2026-07-15 14:36:20 -07:00
Peter Steinberger
766742c674 refactor(node-host): move configuration to shared SQLite (#108457)
* refactor(node-host): move config to shared SQLite

* test(node-host): satisfy migration gates
2026-07-15 14:02:23 -07:00
Peter Steinberger
32a84d093f refactor(agents): split agent command orchestration (#108424)
* refactor(agents): split agent command orchestration

* test(agents): tighten cleanup ownership proof

* refactor(agents): keep command helper types private

* test(cli): track refactored secret resolution callsite

* fix(agents): preserve post-run session ownership

* fix(agents): preserve media recovery across command split
2026-07-15 13:42:05 -07:00
Dallin Romney
af71400c8e refactor(qa): route live channel selectors through suite host (#108429)
* refactor(qa): route live channel selectors through suite host

* fix(qa): repair live selector CI

* fix(qa): remove retired runner exports

* fix(qa): remove obsolete live evidence
2026-07-15 13:35:34 -07:00
Peter Steinberger
de8b787812 fix(gateway): dispose deferred lifecycle timers (#108451)
* test(clawhub): isolate error-body limits from retries

* fix(gateway): dispose deferred lifecycle timers

* chore: keep gateway changelog release-owned
2026-07-15 13:35:15 -07:00
Peter Steinberger
ff8a015981 test: tighten additional async polling (#108450) 2026-07-15 13:14:35 -07:00
xydt-tanshanshan
d201acd6e8 refactor(push-web): move web push store to shared SQLite state DB (#103294)
* refactor(push-web): move state to shared SQLite

Co-authored-by: hailory <hailory@xydigit.com>

* fix(push-web): harden legacy migration retries

* fix(push-web): format migration lock errors

* fix(push-web): gate runtime during legacy migration

* fix(push-web): keep store internals private

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: hailory <hailory@xydigit.com>
2026-07-15 12:54:22 -07:00
clawsweeper[bot]
15a304d6e1 fix(agents): wake owning session after generated-media direct delivery (#108024)
* fix(agents): wake owning session after generated-media direct delivery

When a background media generation (image/music/video) completes but the
requester's agent turn cannot be woken, delivery falls back to sending the
media straight to the channel. The owning session never learned about it,
leaving the attachment orphaned with no agent follow-up.

Queue a system event plus a scoped heartbeat wake after both direct
fallback paths (announce delivery and the shared background lifecycle) so
the agent continues the conversation in its own voice. Subagent requester
sessions skip the heartbeat since their completions route via announce.

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

* fix(agents): persist generated media session handoffs

Co-authored-by: Molty <steipete@gmail.com>

* chore: prune max-lines baseline

* fix(agents): harden durable media handoffs

* fix(agents): charge media retries once

* chore: refresh max-lines baseline

* fix(agents): persist delivery settlement cleanup

* fix(agents): fence interrupted media delivery

* fix(agents): fence durable handoff admission

* fix(agents): reconcile terminal handoffs at retry limit

* fix(agents): align durable handoff types

* test(agents): type durable handoff fixtures

* fix: satisfy session delivery lint

* fix: avoid payload map spreads

* fix: satisfy durable handoff gates

* test: align generated media handoff expectations

* fix: avoid serializing session recovery state during load

---------

Co-authored-by: Molty <steipete@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 12:54:12 -07:00
Peter Steinberger
d37e873420 refactor(plugins): split plugin type contracts (#108416)
* refactor(plugins): split plugin type contracts

* refactor(plugins): split provider type contracts

* refactor(plugins): extract plugin definition contract
2026-07-15 12:51:39 -07:00
Peter Steinberger
f52b3d02d4 fix(gateway): redispatch reclaimed worker placements (#108426) 2026-07-15 12:50:47 -07:00
Peter Steinberger
e3296c0574 ci: restore workflow sanity and ClawHub shard (#108437)
* ci: stop actionlint from re-running shellcheck

* test: make ClawHub error-body checks retry-safe
2026-07-15 12:39:54 -07:00
Peter Steinberger
c3927271fa fix(release): retry ClawHub internal errors 2026-07-15 20:13:23 +01:00
Peter Steinberger
ff4d854167 fix(reef): migrate legacy peer trust config (#108417)
* fix(reef): migrate legacy peer trust config

* chore(reef): leave changelog to release flow

* build(reef): refresh bundled config metadata

* fix(reef): keep identity scope internal
2026-07-15 11:37:32 -07:00
Peter Steinberger
126b549a26 feat: run and reclaim cloud worker sessions from Control UI (#108398)
* feat(gateway): finish cloud worker session reclaim

* chore(gateway): refresh cloud worker artifacts

* fix(gateway): preserve recovery environment narrowing

* test(gateway): complete worker tunnel mock

* fix(gateway): harden cloud worker recovery

* fix(gateway): serialize forced worker teardown

* fix(gateway): handle replaced workspace directories

* fix(gateway): preserve forced destroy receiver

* test(ui): cover cloud worker reclaim flow

* fix(gateway): close final worker recovery races

* fix(ci): align cloud worker generated surfaces

* test(gateway): satisfy worker queue lint

* fix(gateway): recheck remote workspace after lease fence

* chore: move cloud worker release note to PR
2026-07-15 11:24:04 -07:00
Peter Steinberger
bbb62d8510 chore(plugins): window unused and bundled-only public plugin-sdk subpaths (#108415)
* chore(plugins): window unused and bundled-only public plugin-sdk subpaths

* fix(plugins): keep literal compat codes in windowed subpath seeds
2026-07-15 11:21:59 -07:00
Peter Steinberger
f810fb35d5 refactor(reef): centralize peer trust in SQLite (#108375)
* feat(plugin-sdk): support removing pairing requests

* refactor(reef): centralize peer trust in SQLite

* chore: defer Reef release note

* fix(reef): share runtime state across module instances

* refactor(reef): narrow trust store boundary

* test(reef): pass config to account description
2026-07-15 10:21:54 -07:00
Andy Ye
e41585fb0c fix(usage): exclude untimestamped records from daily ranges (#89745)
* fix(usage): exclude untimestamped entries from daily ranges

* fix(usage): preserve all-time untimestamped totals

Co-authored-by: Andy Ye <35905412+TurboTheTurtle@users.noreply.github.com>

* chore(ci): prune stale max-lines suppression

* fix(usage): align open-ended cache ranges

Co-authored-by: Andy Ye <35905412+TurboTheTurtle@users.noreply.github.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-15 10:10:50 -07:00
wings1029
6da7868158 fix(process): report actual UTF-8 byte count in stdin write message (#104966)
* fix(process): report actual UTF-8 byte count in stdin write message

Replace string.length (UTF-16 code units) with Buffer.byteLength(content, 'utf8')
so the reported byte count matches the actual bytes written to process stdin.

For ASCII content the values are identical. For non-ASCII content (CJK, emoji),
string.length underreports the actual UTF-8 byte count.

* test(process): cover UTF-8 stdin write byte count

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

* style(test): keep UTF-8 regression compact

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-15 10:03:49 -07:00
Peter Steinberger
f3adeb2ac6 fix(discord): move command deploy cache to sqlite (#108381) 2026-07-15 10:03:09 -07:00
wings1029
771a98bb89 fix(process): report actual UTF-8 byte count in send-keys message (#104968)
* fix(process): report actual UTF-8 byte count in send-keys message

Replace string.length (UTF-16 code units) with Buffer.byteLength(data, 'utf8')
so the reported byte count matches the actual bytes sent to process stdin.

For ASCII key sequences the values are identical. For non-ASCII text
sent via literal key data, string.length underreports the actual UTF-8
byte count.

* test(process): cover UTF-8 send-keys byte count

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

* ci: prune stale max-lines baseline

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-15 09:37:55 -07:00
Peter Steinberger
9497450511 refactor: eliminate dead-export baseline (#108376)
Burn the grandfathered unused-export baseline to zero and enforce a hard-zero Knip gate.
2026-07-15 17:05:07 +01:00
Peter Steinberger
f41c143345 refactor(state): move skill upload staging to SQLite (#108346)
* refactor(state): move skill upload staging to sqlite

* test(skills): make archive mode assertion portable

* fix(skills): fence upload finalization by lease owner

* fix(skills): handle nullable lease expiry

* fix(skills): bound upload install leases
2026-07-15 08:40:46 -07:00
Peter Steinberger
65188a7430 fix(agents): reject synchronous sessions_send self-targets, break down missing-cost entries, dedup usage merges (#108354)
* fix(agents): reject synchronous sessions_send self-targets, break down missing-cost entries, dedup usage merges

- sessions_send fails fast with a clear error when a synchronous send resolves
  to the calling session's own key, instead of enqueueing behind the sender's
  own lane until timeout and falling back to an empty reply; fire-and-forget
  (timeoutSeconds: 0) self-delivery keeps working (#107172)
- missingCostEntries now carries a provider/model breakdown surfaced on the
  status runtime line and gateway CLI cost line, so zero-priced usage (e.g.
  openai-codex/*) is attributable instead of an opaque counter (#98348)
- codex-synthetic-usage merge helpers share one precedence helper; behavior
  unchanged, duplicate ranking logic deleted (#107497)

* test: use a valid billing type in synthetic-usage precedence case

* test: fix billing expectation to match valid type
2026-07-15 08:23:49 -07:00
jincheng-xydt
b2e42e3645 fix(update): preserve pnpm and Bun global installs (#107802)
* fix(update): preserve pnpm and bun global installs

* fix(update): anchor pnpm updates to invoking install

* fix(update): recover skipped pnpm lifecycle

* fix(update): fail closed on ambiguous pnpm ownership

* fix(update): tolerate pnpm probe warnings

* fix(update): bind pnpm installs to project owners

* fix(update): isolate pnpm mutations from caller pins

* docs(changelog): credit pnpm 11 report

Co-authored-by: jincheng-xydt <xu.jincheng@xydigit.com>

* chore(changelog): defer release note ownership

* fix(update): make package-root fallback explicit

* test(update): split pnpm scenario coverage

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-15 08:03:35 -07:00
Peter Steinberger
c41f46260c test(tasks): update registry boundary seams (#108347) 2026-07-15 07:52:36 -07:00
Peter Steinberger
e4fe96983c fix(plugins): keep official plugin config across bundled-to-external moves, harden npm metadata parsing (#108336)
* fix(plugins): keep official plugin config across bundled-to-external moves, harden npm metadata parsing

- doctor --fix and plugin auto-enable treat official-catalog plugin ids as
  known configuration even when the external package is not installed yet, so
  a bundled-to-external transition (codex) no longer silently drops the
  plugins.allow entry and unregisters the agent harness; garbage ids are still
  pruned, and the codex-specific diagnostic suppression in the doctor scan is
  replaced by the generic official-catalog rule (#107226)
- npm view metadata normalization handles object and multi-version array
  output, flat dist.* keys and nested dist objects, absent openclaw blocks,
  selects the maximum satisfying semver (publication order is not semver
  order), fails closed when a recognized range has no satisfying entry, and
  names the missing fields in the error (#107842)

The #107219 register-crash fix (lazy binding-store opening so plugin
registration never touches runtime.state under the base runtime) landed with
#108311 alongside its regression test.

* style: format install-source-utils imports
2026-07-15 07:35:59 -07:00
Peter Steinberger
3d76a4af92 refactor(deadcode): privatize runtime test seams (#108338)
* refactor(sessions): privatize runtime test seams

* refactor(commitments): privatize extraction test seams

* refactor(flows): privatize doctor health seams

* refactor(tasks): privatize registry test seams

* build(commitments): bundle Docker test support

* chore(deadcode): shrink runtime export baseline
2026-07-15 07:27:10 -07:00
w33d
dd149f01ba fix: stateful plugin hooks and tools stay aligned after scoped loads (#108110)
* fix(plugins): align hook and tool registrations

Reuse gateway-owned plugin registrations for matching hooks and tools while loading only missing tool owners from narrower runtime scopes.\n\nCo-authored-by: w33d <w33d@steadholme.local>

* test(plugins): cover mixed registry tool owners

Verify gateway-pinned and compatible active registrations compose without another plugin load.

Co-authored-by: w33d <w33d@steadholme.local>

* refactor(plugins): keep pinned registry lookup internal

Reuse the existing runtime-state contract so hook and tool ownership does not expand the Plugin SDK surface or treat unpinned active registries as Gateway owners.

* test(plugins): complete hook context fixture

Supply the required tool name in the stateful hook ownership regression context.

* chore: leave contributor release note in PR

Normal contributor PRs do not modify the release-owned changelog; the PR body retains the release note and attribution.

* fix(plugins): align partial registry owners

* fix(plugins): preserve scoped tool diagnostics

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: w33d <w33d@steadholme.local>
2026-07-15 07:12:43 -07:00
Peter Steinberger
4e78d91c0f refactor(sessions): split session accessor by ownership (#108247) 2026-07-15 06:47:29 -07:00
Peter Steinberger
674dd37cd0 refactor(deadcode): privatize core test seams (#108325)
* refactor(entry): privatize compile cache internals

* refactor(logging): privatize diagnostic test seams

* refactor(plugin-state): privatize store test seams

* refactor(skills): privatize lifecycle test seams

* refactor(node-host): privatize invoke test seam

* refactor(system-agent): privatize turn test seam

* chore(deadcode): shrink core test seam baseline
2026-07-15 06:37:40 -07:00
Peter Steinberger
9cdc0c3495 test: tighten async polling intervals (#108301) 2026-07-15 06:14:54 -07:00
Peter Steinberger
e38cd62e0d refactor(state): move managed image records to SQLite (#108290)
* refactor(state): move managed image records to sqlite

* refactor(state): narrow managed image store exports

* fix(state): preserve managed image media roots

* test(state): track managed image temp directories
2026-07-15 06:14:10 -07:00
wuqxuan
610453e5fe fix: doctor should not treat loopback bind as network-accessible 0.0.0.0 (#107731)
* fix: treat loopback bind as local-only in doctor security

* test: type resolveGatewayBindHost mock for check-test-types

* fix(gateway): keep loopback bind canonical

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Peter Steinberger <peter@steipete.me>
2026-07-15 06:13:56 -07:00
lin-hongkuan
dc23f4f255 test: preserve logging exports in startup mocks (#103582)
Co-authored-by: lin-hongkuan <lin-hongkuan@users.noreply.github.com>
2026-07-15 06:11:30 -07:00
Peter Steinberger
3ea45589ba refactor(agents): trim CLI and transport export seams (#108309)
* refactor(agents): trim CLI and transport export seams

* chore(deadcode): shrink agents CLI transport baseline
2026-07-15 14:02:29 +01:00
QiuYuang
5642f6515e fix(web-fetch): recognize mixed-case media types (#108230)
* fix(web-fetch): recognize mixed-case media types

* fix(web-fetch): match normalized media types

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Peter Steinberger <peter@steipete.me>
2026-07-15 05:58:31 -07:00
Peter Steinberger
2808507c3b refactor(agents): privatize runtime test seams (#108295)
Shrinks the dead-export baseline from 156 to 151 entries.
2026-07-15 05:36:35 -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
Peter Steinberger
855659a1dd refactor(agents): privatize state reset seams (#108285)
* refactor(agents): privatize state reset seams

* chore(deadcode): shrink agents state seam baseline
2026-07-15 05:09:45 -07:00
Shakker
24c753ae31 fix: keep channel CLI helpers private 2026-07-15 13:05:10 +01:00