Commit Graph

38627 Commits

Author SHA1 Message Date
Jason (Json)
ca52d54da2 fix(onboarding): preserve OAuth across runtime defaults (#108617)
Merged via squash.

Prepared head SHA: 366fdedacf
Co-authored-by: fuller-stack-dev <263060202+fuller-stack-dev@users.noreply.github.com>
Co-authored-by: fuller-stack-dev <263060202+fuller-stack-dev@users.noreply.github.com>
Reviewed-by: @fuller-stack-dev
2026-07-15 22:55:32 -06:00
Peter Steinberger
61f8324682 fix(zai): use documented completion token field (#108612) 2026-07-15 21:32:49 -07:00
Peter Steinberger
c8c2b206e8 improve: speed up targeted regression suites (#108609)
* test: speed up targeted regression suites

* test: preserve subprocess startup headroom

* test: keep secops-owned auth coverage unchanged
2026-07-15 21:29:48 -07:00
Eden
8a141549f2 fix(line): keep group history recorded during a mention turn (#107367)
* fix(line): keep group history recorded during a mention turn

Group history cleanup ran a whole-key clear after each mention turn. Because
webhook dispatch is fire-and-forget, a plain (unmentioned) message can be
recorded while the agent is still handling a mention; the post-turn clear then
wiped the whole window, silently dropping that concurrent message from the
next turn's context.

Snapshot the identity keys the turn consumes up front and clear only those,
retaining anything recorded concurrently. The record path now stamps the LINE
message id so entries have a stable identity. Cleanup stays after the turn, so
a failed turn still leaves history intact for the retry. The snapshot/clear
helpers live in group-history.ts, next to the other group modules.

* test(line): cover group history retention when a mention turn fails

Assert that a mention turn whose processMessage throws leaves the group
history window intact (cleanup runs only after a successful turn), so the
retry still has the ambient context. Red/green verified: moving the cleanup
before the await fails this test.

* fix(line): capture consumed group history at the context read boundary

The consumed-key snapshot ran before media download and context
construction, while buildLineMessageContext copied the window later.
A plain message recorded between those awaits was included in the
turn's InboundHistory yet missing from the consumed set, so cleanup
retained it and the next mention received it twice.

Read the window and capture its identity keys in one synchronous step
in the handler (snapshotLineGroupHistory), then pass the materialized
inboundHistory into buildLineMessageContext instead of the live map.
The consumed set is now derived from the exact entries the turn reads,
so an entry is either in the context and cleared, or recorded later
and retained - there is no window where both can be true.

Regression tests park a mention turn inside context construction,
record an ambient message mid-window, and assert it stays out of that
turn's InboundHistory, survives cleanup, and is consumed exactly once
by the next mention. Red/green verified against the previous snapshot
placement.

* test(line): point history-window guardrail at group-history.ts

The group-history cleanup fix moved the createChannelHistoryWindow facade
call out of bot-message-context.ts (which now receives inboundHistory as a
parameter) into the new group-history.ts. Update the cross-channel
historyWindowFiles ledger to match, mirroring telegram's group-history-window.ts
entry already in the same list. Fixes the message-turn-guardrails 'keeps
migrated history users on the channel history window facade' assertion that
build-artifacts flagged.

* fix(line): reserve history across concurrent turns

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

* test(line): complete webhook message fixtures

* test(line): use explicit token placeholders

* refactor(line): keep reservation type private

* refactor(line): render reservations through history facade

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-15 21:27:23 -07:00
Josh Avant
4b7f193c9d fix: gateway-owned work fails through same-host relay (#108423)
* fix(gateway): dispatch owned runtime work in process

* fix(gateway): publish canonical approval resolutions internally

* fix(gateway): seal owned approval runtime lifecycle

* fix(gateway): keep instance runtime contracts acyclic

* fix(gateway): remove stale runtime type imports

* fix(agents): reconcile ambiguous recovery timeouts

* refactor(gateway): constrain internal approval methods

* fix(agents): route orphan recovery in process

* fix(agents): preserve aborted restores for recovery

* fix(agents): keep lifecycle waits in process

* test(agents): type lifecycle runtime mock

* test(agents): complete restored session fixture
2026-07-15 20:51:57 -07:00
Peter Steinberger
de3f7925c4 test(release): harden QA and live validation (#108589) 2026-07-15 20:45:36 -07:00
Peter Steinberger
957cc81175 test: speed up slow unit and browser coverage (#108563) 2026-07-15 19:59:16 -07:00
Dallin Romney
04221fc91e chore(qa): remove retired Matrix package guards (#108531) 2026-07-15 19:28:37 -07:00
Peter Steinberger
7eeb1096db fix(codex): re-home app-server usage reporting on the harness seam
The deleted text provider's usage hook was the only source for the /status
Codex subscription usage line. Harnesses can now contribute an optional
usage snapshot (provider hooks keep priority; only distinct synthetic hook
owners fall through), and the codex harness reports app-server rate limits
via account/rateLimits/read with the same conversion and account identity
as before. No text provider resurrected; deadcode and SDK surface gates
clean.
2026-07-16 03:06:47 +01:00
Peter Steinberger
9c5eab471c chore(doctor): format migration tests, keep cron migration helpers module-local 2026-07-16 03:06:46 +01:00
Peter Steinberger
1491977816 test(doctor): surface the blocked-provider warning through the real route-warnings path
The preview test mocked codex-route-warnings wholesale; the consolidated
blocked-merge warning now flows through it, so the auto-merge case runs the
actual implementation once. Migration identity helpers stay module-local;
codex-route-model-ref formatting fixed.
2026-07-16 03:06:45 +01:00
Peter Steinberger
ea0fe35265 fix(codex): post-fold media route signal, drop unused migration exports
- codex media substitution keys on the registered media-understanding
  provider (image capability + default model) instead of the deleted text
  provider's synthetic auth probe; deterministic injected route in tests
- migration helper exports without production consumers are module-local;
  the blocked-provider warning assertion goes through the plan export
2026-07-16 03:06:45 +01:00
Peter Steinberger
6bcb561012 fix(codex): repair identity-fold CI fan-out
- null-vs-undefined runtime record type at the provider-move helper
- gateway models.list fixtures expect the new agentRuntime intent field
  (codex/implicit for policy-backed OpenAI routes, openclaw/implicit for
  synthetic routes without provider policy)
- split doctor cron legacy-repair into its own module to satisfy the
  max-lines gate without suppressions; callers import directly
2026-07-16 03:06:43 +01:00
Peter Steinberger
3c8269ca52 refactor(codex)!: fold the codex text provider into openai with a doctor migration
The live codex text provider was a redundant projection of the openai
catalog (exclusive provider ownership; the openai plugin's ChatGPT OAuth
discovery already serves gpt-5.6-* route-aware). Folding it:

- extensions/codex no longer registers a text provider, catalog entry, or
  synthetic text auth; provider.ts/provider-catalog.ts/provider-discovery.ts
  and the route-blind model-name heuristics are deleted; the narrow
  post-harness reasoning fallback moves to an app-server-owned module
- openai thinking policy keys on explicit selected-route provenance
  (api === openai-chatgpt-responses) instead of value-shape inference
- models.list gains an optional additive agentRuntime field (configured
  intent); session agentHarnessId remains the execution proof
- doctor --fix migrates the shipped codex/* config shape end to end:
  every model slot, provider-config merge with blocker-aware conflict
  handling, sessions, cron payloads (two-phase: runtime policy persists
  before cron refs rewrite), transcripts; migrated refs carry model-scoped
  agentRuntime.id=codex preserving the shipped wizard semantics; auto
  runtime policies normalize to codex with sibling fields preserved;
  blocked provider conflicts retain the whole legacy namespace fail-closed
  with an actionable warning
- the stale openai:default profile cleanup (#91352) was deliberately
  deferred to a follow-up after review showed it needs per-agent identity
  proofs; doctor keeps warning about unusable profiles

Fixes #105561
Fixes #84637
Fixes #90420
2026-07-16 03:06:43 +01:00
Goutam Adwant
154d53c4f6 fix(state): gateway starts when WSL chmod returns EROFS (#108258)
* fix(state): tolerate guarded EROFS chmod failures

* fix(state): keep EROFS mode handling fail-closed

---------

Co-authored-by: Peter Steinberger <peter@steipete.me>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-15 18:55:49 -07:00
mushuiyu886
6f22ef08a3 fix(tui): preserve emoji in split local shell output (#108268)
Co-authored-by: Peter Steinberger <peter@steipete.me>
2026-07-15 18:38:09 -07:00
xingzhou
cde78074b2 fix(providers): preserve UTF-8 in local service diagnostics (#108518)
Co-authored-by: Peter Steinberger <peter@steipete.me>
2026-07-15 18:26:50 -07:00
Alix-007
dcf110756f fix(xai): apply request policy to video generation requests (#104836) 2026-07-15 21:22:46 -04:00
Peter Steinberger
ab3f057cfd refactor: split plugin loader by responsibility (#108513)
* refactor(plugins): split plugin loader

* refactor(plugins): keep loader helpers internal

* refactor(plugins): remove unused loader type import

* test(plugins): cover split runtime registry boundary
2026-07-15 17:51:13 -07:00
Peter Steinberger
9317aadaa2 feat(slack): add opt-in scoped presence events (#108510)
* feat(slack): add opt-in presence events

* style(slack): satisfy presence lint rules

* chore: keep release changelog centralized

* fix(slack): satisfy presence integration gates

* fix(slack): preserve eligible presence targets
2026-07-15 17:43:26 -07:00
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