Commit Graph

78555 Commits

Author SHA1 Message Date
Vincent Koc 33a5f37937 fix(release): repair survivor fixture assertion quoting (#120680) 2026-08-09 03:53:51 +08:00
wanyongstar 9c3e4ce431 fix(browser): bound batch action nesting depth in act request normalization (#120274)
* fix(browser): bound batch action nesting depth in act request normalization

normalizeActRequest recursed over batch nesting with no depth bound, so a
~1MB POST /act body with tens of thousands of nested batch levels parsed
fine and then crashed normalization with RangeError: Maximum call stack
size exceeded before the ACT_MAX_BATCH_ACTIONS count check could run,
surfacing an internal stack overflow as the 400 validation message.

Thread the existing ACT_MAX_BATCH_DEPTH limit through normalizeBatchAction/
normalizeActRequest and reject deeper nesting up front with a clear
'batch nesting exceeds maximum depth of 5' error, matching the bound the
Playwright executor already enforces at dispatch time.

* fix(browser): match batch depth executor boundary

Accept the six wrapper levels supported by the Playwright executor and reject the seventh during request normalization.

Co-authored-by: 万拥 0668000723 <wan.yong@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-08 12:52:59 -07:00
Peter Steinberger 0b85f9c174 feat: resolve short session references in the gateway (#120512)
* feat(gateway): resolve short session references

* refactor(ui): delegate short session resolution to gateway

* fix: complete short session resolver integration

* fix(gateway): filter deleted-agent short sessions

* fix(ui): support older gateway short links

* docs(web): qualify short-link candidate limits for older gateways

* refactor(protocol): split session resolve schema

* fix(gateway): filter session resolver visibility
2026-08-08 12:52:06 -07:00
Peter Steinberger 1609ae9b62 fix(gateway): refresh active session listings (#120424) 2026-08-08 12:52:00 -07:00
Peter Steinberger fb608005b5 fix(update): log campaign lifecycle for debugging (#120669) 2026-08-08 12:51:51 -07:00
Victor Sumner 417f3ace5c fix(cron): isolated heartbeat recovers after session archival (#120314)
* fix(cron): recover archived heartbeat sessions

* fix(cron): preserve heartbeat initialization guard
2026-08-08 12:50:16 -07:00
Peter Steinberger 3a4506073b fix(ui): streamline live token counter in the chat working row (#120676)
The live working indicator read '592 output tokens' next to the whimsical
progress phrase, duplicating liveness signals and diverging from the
turn-recap wording ('592 tokens'). Now the whimsical phrase shows only
while no usage data exists; once tokens stream, the count replaces it and
reuses the shared turnRecap token labels. Removes the redundant
chat.outputTokens i18n key.
2026-08-08 12:49:25 -07:00
Vincent Koc 38039f5ea8 fix(secrets): preserve Windows ACL diagnostics (#120211)
* fix(secrets): preserve Windows ACL diagnostics

* fix(secrets): make Windows path security proof deterministic

* test(secrets): isolate Windows ACL tool failures

* test(secrets): preserve ACL preload process contract

* test(ci): route Doctor ACL proof to Windows

* test(qa): normalize Clack note borders

* test(ci): register Windows ACL preload for deadcode checks
2026-08-09 03:48:42 +08:00
Peter Steinberger 1889764369 revert(ui): session is the product noun — undo thread copy rename (#120667)
Implements docs/plan/runners.md milestone 1a.
2026-08-08 12:43:05 -07:00
Peter Steinberger 2717342e45 fix(ui): quiet tool-activity rows with one hover treatment (#120674)
Replace the bordered activity-group card (border + background + hairline
row separators + per-row radius flattening) with a flat indented list and
a single 2px left rail. Every tool row now shares the same 6px hover pill
inside and outside groups, removing the square/round corner mismatch.

Also scope the generic .chat-bubble:hover accent-border rule away from
tool-shell bubbles: it tinted the group's hairline separators red on
hover, which read as an error state.
2026-08-08 12:38:50 -07:00
Peter Steinberger a445cdd824 fix(ui): remove model picker chevrons (#120673) 2026-08-08 12:37:58 -07:00
Vincent Koc b40f846757 fix(release): keep survivor plugin repair hermetic (#120677) 2026-08-09 03:34:42 +08:00
Peter Steinberger 5ebbc3c003 fix(agents): keep stalled turns visible after Responses streams settle (#120426)
* fix(agents): keep stalled turns visible after Responses streams settle

A bare-continue turn in live QA (goal-followthrough-live, gpt-5.4 via
openai-responses) completed its SSE requests and then produced no terminal
result, delivery, timeout, or error for 6+ minutes until SIGTERM. Root cause:
turn liveness is enforced only while awaiting provider stream events (llm-idle
watchdog); queued subscription handlers are fire-and-forget during the turn and
finalize joined them unbounded and un-abortable, backed only by the 48h default
run budget. One hung delivery handler silently dead-ended the whole turn.

- Bound the pending-events join in attempt-stream-finalize with a 120s liveness
  deadline plus the run-abort signal; on expiry, warn with the runId and proceed
  to settlement so the run always yields a visible terminal outcome.
- Responses transports now report every SSE event via notifyLlmRequestActivity
  (parity with completions/anthropic), so bookkeeping-only events keep the idle
  watchdog quiet instead of counting as network silence.

* fix(agents): bound the settlement block-reply flush with the shared liveness join

ClawSweeper P1 on #120426: after the finalize-phase join times out, settlement
still awaited onBlockReplyFlush on the same wedged delivery chain (unbounded on
the supported blockReplyTimeoutMs: 0 path). Generalize the bounded join into
joinWithRunLivenessDeadline in run/abortable.ts (owner of abort/liveness
racing) and use it for both the pending-events join and the settle flush;
timeout and abort resolve with a recorded warning so the turn always reaches a
visible terminal outcome. New coverage: helper tests (hang, abort, rejection)
and a real-settle-path regression holding the flush past the deadline.
2026-08-08 12:34:23 -07:00
Gio Della-Libera a3094582ff feat(claws): export reviewed native bootstrap (#115371)
* feat(claws): export reviewed native bootstrap

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 3cdcdb00-ade8-4e61-85a7-8151b35f216a

* fix(claws): fail export when the package bootstrap drifted

Export re-emitted BOOTSTRAP.md only while the seeded copy was still pending, so
an agent whose bootstrap had been edited, flagged unsafe, or become unreadable
exported a package with no bootstrap at all. That is the same class of silent
loss the managed workspace files already guard against, so treat it the same
way: drifted bootstrap state now fails with `bootstrap_drifted` unless the
author supplies a reviewed `--bootstrap` replacement. A consumed bootstrap
stays a completed lifecycle state and still exports without BOOTSTRAP.md.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 3cdcdb00-ade8-4e61-85a7-8151b35f216a

* fix(claws): bind pending bootstrap export bytes

* fix(claws): preserve current export ownership limits

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 3cdcdb00-ade8-4e61-85a7-8151b35f216a
2026-08-08 12:32:26 -07:00
wanyongstar fe908cf309 fix(matrix): ignore out-of-range hex escapes in env account tokens (#120428)
* fix(matrix): ignore out-of-range hex escapes in env account tokens

decodeMatrixEnvAccountToken guarded String.fromCodePoint with
Number.isFinite, which does not bound the Unicode range: a MATRIX_*
env var whose _X<hex>_ escape exceeds 0x10FFFF (e.g.
MATRIX_A_X110000_B_HOMESERVER) threw RangeError out of
listMatrixEnvAccountIds, crashing discovery of every env-backed
Matrix account during startup and doctor checks. Escapes above the
Unicode max are now rejected like any other malformed token.

* chore(matrix): tighten decoder invariant comment

Co-authored-by: 万拥 0668000723 <wan.yong@xydigit.com>

* chore(matrix): clarify decoder invariant

Co-authored-by: 万拥 0668000723 <wan.yong@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-08 12:24:41 -07:00
Peter Steinberger 0487b6812c fix(qa): honor Crabbox SSH fallback ports (#120539) 2026-08-08 12:01:30 -07:00
Peter Steinberger e7a9f33d89 refactor(core): adopt normalization-core leaf helpers across production (#120350)
* refactor(core): adopt normalization-core leaf helpers across production

* fix(ci): keep plugin contract source-resolvable

* fix(errors): preserve adapter-owned error fields

* fix(errors): short-circuit existing errors before stringifying

* fix(errors): skip throwing structured getters

* ci: retrigger checks on current base

* fix(errors): guard structured error enumeration

* fix: harden error detail copying
2026-08-08 12:00:49 -07:00
Vincent Koc e81d7e62e8 fix(release): scope upgrade plugin credentials (#120666) 2026-08-09 03:00:36 +08:00
Peter Steinberger 47f78a32eb fix(ai): preserve long Responses sessions after server compaction (#120457)
* fix(ai): preserve Responses server compaction state

Persist opaque Responses compaction items as fenced provider replay state so long stateless sessions can resume authoritative compressed history without exposing it in display or diagnostics. Carry state through worker transcripts and prune replay prefixes without splitting tool pairs.

Release note: Preserve long OpenAI Responses sessions across server-side compaction and worker restarts.

Related: #95788

* test(ai): align long-context fixtures with CI contracts

Make tool-result fixtures type-complete, use the canonical model selector helper, remove unused test-helper exports, and route the paid long-context live probe through the dedicated Gateway profile shard.

* test(ai): type mocked Responses terminal events

Give the mock SSE event collection an explicit open event shape so terminal response events coexist with output-item events under the root test typecheck.

* fix(ai): suppress rejected compaction replay

Persist a route-fenced suppression tombstone when encrypted-content recovery rejects a compaction item, so later turns do not retry the same opaque state. Preserve the tombstone through transcript redaction and cover successful fallback followed by the next turn.

* fix(ai): keep compaction suppression transport-private

Keep the suppression contract local to its sole Responses transport owner and make the regression fixture satisfy root type and lint checks without widening the Plugin SDK surface.

* refactor(ai): remove compaction suppression re-export

* fix(ai): scope compaction suppression to replay route

Keep foreign-route rejection tombstones from hiding the newest compatible Responses compaction while preserving same-route suppression.

* fix(ai): harden Responses replay recovery

Stage encrypted replay recovery so compaction is only suppressed after an attributable rejection. Preserve terminal ordering and keep provider replay within worker frame budgets without truncating opaque state.

* refactor(ai): centralize Responses output indexes

Keep normalized output identity tracking in the stream-slot owner, move response failure state to its diagnostic owner, and remove the obsolete replay clone export so exact-head static gates remain shrink-only.

* fix(ai): retain idless terminal tool identity

Use the canonical empty identity only when a provider supplies neither call nor item id, preventing terminal recovery from duplicating a done-only tool call while preserving stronger identities when available.

* fix(sessions): hide provider replay from public events

* fix(ai): stage encrypted replay recovery

* fix(ai): keep replay attempt kind internal

* fix(ai): route Azure through replay recovery

Use the shared encrypted-content retry owner for Azure Responses so compaction suppression and prompt-observer variants stay coherent across transports.

* fix(ai): harden replay persistence boundaries

Fence Azure replay by the resolved request endpoint, drop invalid replay during transcript sanitization, and surface worker-launch replay omissions through the existing redacted diagnostic path.
2026-08-08 11:55:26 -07:00
Vincent Koc a901261754 fix(test): keep fork E2E setup builds observable (#120653)
* fix(test): stream E2E setup build progress

* fix(test): keep E2E setup builds in runner group

* fix(test): own E2E setup streams and signals

* test(ci): route E2E setup regression correctly
2026-08-09 02:53:38 +08:00
Peter Steinberger 82f6280fa8 fix(cloud-workers): retain provider operation ownership (#120661)
Keep per-environment provider work serialized through actual settlement after caller-visible timeouts, so replay, destroy, and shutdown cannot overlap a still-running setup.\n\nCloses #120651
2026-08-08 11:42:47 -07:00
Peter Steinberger 5e66d9ee66 docs: runners plan — one placement model for sessions, devices, and cloud (#120657)
* docs: runners plan — one placement model for sessions, devices, and cloud

Proposal for unifying where sessions run: gateway/devices/cloud as runners
behind the existing worker admission stack; session-continuation ergonomics;
one-paste device pairing; derived projects read model; naming rulings
(session, devices); deletion ledger. Encodes the adversarial-review
kill-list as non-goals with code evidence.

* docs: unwrap PR refs so markdownlint MD018 passes
2026-08-08 11:29:08 -07:00
Peter Steinberger 53afc51b47 refactor(cli): inline state migration policy (#120641)
* refactor(cli): inline state migration policy

Remove the single-use exported helper so migration policy now lives at ensureConfigReady, its lifecycle owner. Move duplicate argv and preaction coverage into the lifecycle-owner test table while preserving behavior. This follows #120451.

* refactor(cli): preserve gateway migration rationale

Keep the ownership invariant beside the inlined gateway-call exception.
2026-08-08 11:23:39 -07:00
Peter Steinberger e3de98a451 feat(update): scheduled update campaigns with countdown, dev-channel auto-update, and Updates settings page (#120506)
* feat(update): scheduled update campaigns with countdown, dev-channel auto-update, and Updates settings page

* fix(ui): satisfy update campaign deadcode checks

* feat(update): extend scheduled update campaigns

* test(ui): include Updates page in settings sidebar search expectations

* fix(update): end campaigns when apply fails

* fix(update): pin dev campaign applies to the announced commit

* test(ui): align update e2e fixtures

* fix(update): pin adopted dev updates to the announced commit

* docs(update): document automatic dev update campaigns

* fix(ui): gate automatic dev updates on git installs

* fix(gateway): scope detailed update metadata to read-capable clients

* fix(gateway): break post-attach madge cycle with a leaf client-lookup type

* chore(protocol): regenerate clients after rebase

* test(gateway): update method tail after rebase

* fix(update): preserve campaign target and hold state

* test(update): align adoption mocks and split handoff suite

* test(update): route split handoff suites on Windows
2026-08-08 11:19:53 -07:00
openclaw-mantis[bot] 6cdb8187ab chore(i18n): refresh native locales (#120614)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-08-09 02:14:06 +08:00
Vincent Koc 0d45efd5da fix(ci): retry transient artifact API reads (#120654) 2026-08-09 02:05:04 +08:00
Peter Steinberger 01ae18c076 fix(clawrouter): honor advertised reasoning efforts (#120631) 2026-08-08 11:01:34 -07:00
Peter Steinberger eecbfcc960 fix(infra): unify env-truthiness, missing-path, realpath, and abort-sleep semantics (#120359)
* fix(infra): unify environment truthiness

* fix(infra): unify missing path classification

* refactor(infra): unify realpath fallbacks

* fix(infra): unify abortable sleep errors

* docs(infra): clarify path fallback semantics

* fix(infra): route realpaths through policy wrapper

* fix(infra): ratchet plugin SDK wildcard budget

* fix(agents): preserve zero-delay abort precedence

* fix(infra): preserve fallback and media recovery contracts

* fix(plugins): share quarantine path resolution
2026-08-08 10:58:57 -07:00
Vincent Koc a07d0e249d fix(maintainers): parse merge comment URL structurally (#120649) 2026-08-09 01:58:11 +08:00
Peter Steinberger a70deaf14e fix(ui): label only operator-pinned runtimes in model picker rows (#120646) 2026-08-08 10:57:27 -07:00
Peter Steinberger 7492f6937c docs(agents): replace exact-head re-review gate with 12-hour review window 2026-08-08 10:50:18 -07:00
Vincent Koc e4309e0cc7 test(claws): canonicalize bootstrap export fixture path (#120644) 2026-08-09 01:12:47 +08:00
Vincent Koc 3e0504d50f fix(scripts): stabilize dependency pin timeout test (#120642) 2026-08-09 01:08:48 +08:00
Peter Steinberger 33f082b86a test(codex): align completed tool metadata expectation (#120637) 2026-08-08 10:04:26 -07:00
Vincent Koc 49161dee60 fix(release): unblock deferred Telegram beta validation (#120630)
* fix(release): allow deferring package Telegram validation

* fix(qa): mount taxonomy in package Telegram harness

* fix(release): restrict Telegram deferral to beta
2026-08-09 01:03:02 +08:00
Vincent Koc 0fd3ee6929 fix(ci): isolate performance gateway fixture (#120620) 2026-08-09 00:56:01 +08:00
Peter Steinberger 7fd723b515 fix(agent): apply steering before unstarted tools (#120470)
* fix(agent): apply steering before unstarted tools

Restore steering checkpoints before sequential tool launches and before parallel batch launch. Preserve paired synthetic tool results, async callback compatibility, and Code Mode outcome handling.

* fix(agent): delay tool loop admission commits

Commit loop-detection history only for calls crossing the final launch checkpoint. Release steering-skipped markers, add repeated-steer coverage, and align remaining steering contract text.

* fix(agent): keep tool admission lifecycle internal

Attach delayed admission callbacks through the private internal-hooks seam so steering history remains correct without widening the public Agent Core or Plugin SDK contract.

* fix(agent): preserve steering API contracts

Keep public steering callbacks Promise-based and protocol error kinds unchanged. Use private synchronous draining and structured skip details to retain launch-boundary behavior without API or generated protocol drift.

* test(gateway): use canonical steering fixture config

Use keyed agent entries in the real gateway steering harness so current main does not migrate the fixture during startup.

* fix(agent): remove unused lifecycle re-export

* fix(agent): gate tool launch after wrapper preflight

Split OpenClaw tool execution into private prepare and launch phases so steering is checked after policy, approval, validation, and reconciliation but before the original side effect. Preserve final arguments, voice grants, loop admission, context wrappers, and direct tool execution.

* fix(agent): preserve steering callback receiver

Invoke public steering callbacks with their AgentLoopConfig receiver and cover method-style implementations that read config-owned queue state.
2026-08-08 09:52:10 -07:00
Vincent Koc 6f06fb2949 fix(deps): register missing ownership metadata (#120615) 2026-08-09 00:50:45 +08:00
Vincent Koc 13322b2adc fix(ci): run every changed-scope routing suite (#120625) 2026-08-09 00:50:17 +08:00
Vincent Koc 7fd1f731a6 fix(release): make tar extraction portable on Windows (#120619) 2026-08-09 00:47:20 +08:00
Peter Steinberger a413b16ee6 test(qa): derive diagnostics package version (#120636) 2026-08-08 09:44:37 -07:00
Peter Steinberger 74b1627f88 feat(ui): show agent runtime distinction in model picker rows (#120617)
* feat(ui): show agent runtime distinction in model picker rows

* fix(ui): label known CLI runtime ids in model picker rows
2026-08-08 09:36:19 -07:00
Peter Steinberger 13e30a9d55 refactor(ui): unify the visible board dock union into board settings (#120605)
The visible-dock union existed twice: BoardVisibleChatDock (hand-written
literal union in lib/board/settings.ts, persistence layer) and
VisibleBoardDock (derived from the protocol BoardTab shape in
chat-pane-shared.ts, render layer). Follow-up from #120487.

Keep one canonical exported type in lib/board/settings.ts, now derived
from BoardTab so persisted settings can never drift from the wire
contract, and migrate all render-layer consumers to it. Net -5 LOC,
type-only.
2026-08-08 09:29:43 -07:00
Shakker 6c3cc2c0a1 fix: discard retired session list errors (#120627) 2026-08-08 17:25:39 +01:00
Shakker b1e37e0502 fix: preserve dashboard data during refresh 2026-08-08 17:25:38 +01:00
Shakker 5d5bc74121 docs: document live dashboard index refresh 2026-08-08 17:25:38 +01:00
Shakker 9090e92f36 fix: keep dashboards current after session changes 2026-08-08 17:25:38 +01:00
Peter Steinberger 40385bb5c1 test(e2e): isolate shared build artifacts (#120628) 2026-08-08 09:21:50 -07:00
SunnyShu 1beb96378d fix(cli): keep config writes out of state migration (#120451)
Targeted config writes retain validation while Doctor and the gateway own state migration.

Fixes #120413

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-08 09:12:51 -07:00
Peter Steinberger 5b97cbe420 refactor(gateway): centralize channel health projection (#120552)
* refactor(gateway): centralize channel health projection

* test(gateway): pass channel health policy to projection
2026-08-08 08:57:47 -07:00