Commit graph

78639 commits

Author SHA1 Message Date
Peter Steinberger
fb13d62e70
test(macos): remove unused coverage artifacts (#122755)
Some checks are pending
Native App Locale Refresh / Refresh native id (push) Blocked by required conditions
Native App Locale Refresh / Refresh native it (push) Blocked by required conditions
Native App Locale Refresh / Refresh native ja-JP (push) Blocked by required conditions
Native App Locale Refresh / Refresh native ko (push) Blocked by required conditions
Native App Locale Refresh / Refresh native nl (push) Blocked by required conditions
Native App Locale Refresh / Refresh native pl (push) Blocked by required conditions
Native App Locale Refresh / Refresh native pt-BR (push) Blocked by required conditions
Native App Locale Refresh / Refresh native ru (push) Blocked by required conditions
Native App Locale Refresh / Refresh native sv (push) Blocked by required conditions
Native App Locale Refresh / Refresh native th (push) Blocked by required conditions
Native App Locale Refresh / Refresh native tr (push) Blocked by required conditions
Native App Locale Refresh / Refresh native uk (push) Blocked by required conditions
Native App Locale Refresh / Refresh native vi (push) Blocked by required conditions
OpenClaw Stable Main Closeout / Resolve stable release closeout inputs (push) Waiting to run
OpenClaw Stable Main Closeout / Verify stable main closeout (push) Blocked by required conditions
Plugin Init Scaffold Validation / Validate provider scaffold (push) Waiting to run
Plugin NPM Release / preview_plugins_npm (push) Waiting to run
Plugin NPM Release / Validate release publish approval (push) Blocked by required conditions
Plugin NPM Release / preview_plugin_pack (push) Blocked by required conditions
Plugin NPM Release / Preflight plugin npm package () (push) Blocked by required conditions
Plugin NPM Release / publish_plugins_npm (push) Blocked by required conditions
Plugin NPM Release / verify_plugins_npm (push) Blocked by required conditions
Website Installer Sync / static (push) Waiting to run
Website Installer Sync / linux-docker (push) Waiting to run
Website Installer Sync / macos-installer (push) Waiting to run
Website Installer Sync / windows-installer (push) Waiting to run
Website Installer Sync / sync-website (push) Blocked by required conditions
Workflow Sanity / no-tabs (push) Waiting to run
Workflow Sanity / actionlint (push) Waiting to run
Workflow Sanity / generated-doc-baselines (push) Waiting to run
2026-08-12 11:34:28 -07:00
Sedrak Hovhannisyan
2ce420091e
fix: prevent agent hatch failure after gateway startup (#122210)
* fix(system-agent): attach hatch TUI to running gateway

* test(system-agent): isolate TUI gateway state

---------

Co-authored-by: fuller-stack-dev <263060202+fuller-stack-dev@users.noreply.github.com>
2026-08-12 11:19:17 -07:00
Peter Steinberger
16540e2b88
fix(onboard): let model check see pending auth (#122756) 2026-08-12 11:09:47 -07:00
Josh Avant
1b36f42653
fix(audit): preserve numeric decision cursors (#122619) 2026-08-12 13:08:25 -05:00
Peter Steinberger
5e85947a15
test: move approval state cases to router owner (#122754)
Co-authored-by: Amp <amp@ampcode.com>
2026-08-12 11:05:26 -07:00
Peter Steinberger
e69a973bfb
feat(backup): add whole-archive restore into a fresh staging directory (#122750)
* feat(backup): add whole-archive restore into a fresh staging directory

Verify-first extraction with fresh-target and live-state-dir guards,
cleanup on failure, and explicit rollback warnings (ratchet-bearing
channel credentials, approvals, delivery state). Activation stays an
explicit operator step.

* fix(cli): sync backup catalog description with registered command
2026-08-12 18:03:28 +00:00
Peter Steinberger
ab6d4655a2
test(gateway): capture session-store forensics on adoption flake (#122718)
The concurrent keyed sessions.create adoption assertion flaked once on CI
(run 31609081812) with the persisted row missing while all 16 creates
succeeded. Owner-path analysis (fenced create path, direct SQL read,
post-commit publication, async tails, sqlite target resolution) found no
reachable mechanism and the failure never reproduced locally (11 runs).
On mismatch the assertion now reports the case dir's sqlite files, the
resolved target path, and raw session_nodes rows so the next occurrence
identifies the writer/reader split instead of printing undefined.
2026-08-12 11:03:08 -07:00
Vincent Koc
d82edfc4d2
fix(ci): preserve periphery artifacts across reruns (#122743) 2026-08-13 01:56:00 +08:00
Peter Steinberger
42f4322464
refactor(plugin-sdk): prune unreachable facades (#122745) 2026-08-12 10:54:06 -07:00
Peter Steinberger
39c733ff73
refactor(opencode-go): compose provider stream wrappers (#122749)
Amp-Thread-ID: https://ampcode.com/threads/T-019ff438-3b93-77b8-9828-1d3c586cb127

Co-authored-by: Amp <amp@ampcode.com>
2026-08-12 10:53:53 -07:00
Peter Steinberger
2e86f7cc95
fix(telegram): preserve pre-dispatch send custody (#122741) 2026-08-12 10:47:08 -07:00
Peter Steinberger
bae30ae888
test: scale claw export boundary fixtures (#122732)
Co-authored-by: Amp <amp@ampcode.com>
2026-08-12 10:45:58 -07:00
Peter Steinberger
e689231e42
fix: make Codex onboarding survive inherited Node loader paths (#122731)
* fix(codex): sanitize inherited runtime loader paths

* fix(onboard): preserve candidate failure details
2026-08-12 10:42:34 -07:00
Peter Steinberger
144a598831
refactor(discord): remove thread binding test API (#122744) 2026-08-12 10:40:53 -07:00
Peter Steinberger
508dd471b0
feat(slack): live session cards as the default progress mode (#122552)
* feat(slack): render live session cards as the default Slack progress mode

Slack streaming.mode default flips partial->progress.
Progress mode renders one live Block Kit session card with a status header, narration, plan, activity, diff stat, and elapsed time; it is edited in place and finalized to success or error with an Open in OpenClaw button when gateway.publicOrigin is set.
Final assistant text always delivers separately.
The shared progress compositor gains a success-only additive per-turn diffStat mirroring the task ledger fold.
resolveGatewayPublicOrigin is exported through the plugin SDK.
The diffs viewer URL falls back to publicOrigin.
The old rich/text progress render fork is deleted.
Native task cards remain unchanged and opt-in.

* chore(config): regenerate bundled channel config metadata

* refactor(slack): keep session card state type internal

* refactor(slack): split session-card and diff-stat owners under lint ceilings

* refactor(channels): reuse diff-stat type from its owner module

Import ChannelProgressDraftDiffStat from progress-draft-diffstat instead of
redeclaring it in the compositor, resolving the all-exports deadcode scan.

* chore(plugin-sdk): regenerate api baselines for channel barrels

Baselines drifted after the rebase reconciled them against main; regenerate to
match the branch's actual channel-message/channel-outbound surface.

* fix(slack): drop a session card that cannot terminalize after final delivery

If the final reply is delivered but the terminal card edit fails, the caller
now clears the stale card instead of leaving it stuck in its Working state
(mirrors the pre-card preview cleanup). Adds a transport-failure regression and
corrects three tests that asserted the prior ignore-the-result behavior.

Documents resolveGatewayPublicOrigin as a dependency-light runtime helper on the
config-contracts SDK subpath, which previously described a type-only surface.

Addresses ClawSweeper P2 (unfinalized card) and P1 (runtime SDK contract).

* fix(slack): suppress default tool messages under the default progress card

resolveChannelStreamingSuppressDefaultToolProgressMessages re-derived the stream
mode from config with an "off" default, unlike its sibling resolvers which take
a caller-resolved mode override. After this branch made progress the Slack
default, a default-config channel turn saw mode "off" and left a stray
"Using tool: X" plain message posting alongside the session card. Thread the
caller-resolved mode through (compositor passes params.mode; Slack dispatch passes
slackStreaming.mode), matching resolveChannelStreamingPreviewToolProgress.

Retarget the progress-session-card delivery-trace golden at an EMPTY Slack config
so it proves the real default path; the regenerated golden is byte-identical,
confirming defaults now yield the clean card sequence (one card post, separate
final text, one terminal update with the Open in OpenClaw button, no stray tool
message). Switch the dispatch delivery-mode mock to the real resolver so the card
tests exercise the true channel default (automatic), not a hand-rolled one.

* chore(plugin-sdk): regenerate api baselines for the streaming mode param

resolveChannelStreamingSuppressDefaultToolProgressMessages gained an optional
mode override; the changed signature reflows the surface hash of every barrel
that re-exports it, so regenerate the affected baselines.

* chore(config): regenerate config baselines
2026-08-12 10:38:31 -07:00
Peter Steinberger
901dd11a13
improve(ui): header scope dropdown and unchanged-line expansion in session diff (#122711)
* feat(ui): expand session diff navigation

Release note: Make the session diff scope selectable from its header and let working-tree diffs reveal unchanged file context in bounded chunks.

* fix(ui): keep unchanged-line expander labels inside their row

Chromium's flex layout on button elements pins the label line box to the
button's vertical center, painting the gap count into the diff row above.
Grid centering avoids the quirk; skip rows also center-align their controls.

* fix(ui): revalidate diff snapshot before expanding unchanged lines

Addresses the ClawSweeper P2 stale collapsed-gap content finding by revalidating the target file patch before reading current file text.
2026-08-12 10:37:42 -07:00
Peter Steinberger
45a59030db
fix(ai): recover missing OpenAI WebSocket response state (#122727)
* fix(ai): recover rejected WebSocket continuations

* fix(ai): keep WebSocket server error internal
2026-08-12 10:34:09 -07:00
wanyongstar
d52a8b3475
fix(logging): parse diagnostics.stability limit/sinceSeq as strict decimal (#120446)
* fix(logging): parse diagnostics.stability limit/sinceSeq as strict decimal

normalizeDiagnosticStabilityQuery is the only input boundary of the
diagnostics.stability gateway method (no protocol schema), and its
string branch used Number(): "0x10", "1e3", " 5 ", "+42" were
silently coerced instead of rejected, so malformed clients could
filter snapshots by unintended seq values. String params now require
strict decimal digits, matching the boundary's fail-closed contract.

* fix(logging): reject unsafe integers for numeric stability query inputs

Replace Number.isInteger with parseStrictNonNegativeInteger for the numeric path so MAX_SAFE_INTEGER + 1 (and larger) is rejected uniformly across string and number inputs. Add test cases for MAX_SAFE_INTEGER (accepted) and MAX_SAFE_INTEGER + 1 (rejected) for both limit and sinceSeq.

* fix(logging): use normalization-core parser import

---------

Co-authored-by: Altay <altay@hey.com>
2026-08-12 20:31:06 +03:00
Peter Steinberger
4fe4f34a9e
fix(agents): root profile workspaces in profile state (#122733) 2026-08-12 10:31:04 -07:00
Vincent Koc
6e880b5107
fix(qa): preserve model switch failure evidence (#122710) 2026-08-13 01:24:10 +08:00
Peter Steinberger
b50a7fc4cd
fix(agents): page sessions after filtering (#122725) 2026-08-12 10:14:23 -07:00
Vincent Koc
5af8935b53
fix(ci): start gateway for agent delete Docker smoke (#122714) 2026-08-13 01:12:54 +08:00
Peter Steinberger
99d662473c
fix(channels): fail-fast headless channel setup with plugin-declared env contracts (#122530)
* fix(channels): validate headless channel setup

* docs(channels): document headless provisioning

* fix(channels): repair setup metadata typing

* chore(channels): regenerate official channel catalog for env metadata

* fix(slack): keep mode-conditional env contract plugin-owned

Static --use-env declaration keeps only the unconditional SLACK_BOT_TOKEN;
socket-vs-HTTP conditional requirements (app token, signing secret) stay in
Slack's own setup validation so HTTP mode no longer demands an irrelevant
SLACK_APP_TOKEN.

* chore(sdk): regenerate api baselines and catalog after rebase

* fix(slack): align manifest env declaration with runtime contract

* chore(sdk): regenerate api baselines after rebase

* chore(sdk): regenerate api baselines after rebase

* chore(sdk): regenerate api baselines after rebase
2026-08-12 17:12:15 +00:00
Sarah Fortune
bea0e398fa
fix(slack): expose channel reaction events to thread turns (#122363)
* test: cover routed Slack system events

* fix: deliver route events to thread turns

* style: format routed event test

* fix: scope parent event routing to Slack

* test: isolate routed event admission proof

* fix(slack): keep reaction route handoff internal

* fix(slack): preserve channel turn public types

* fix(slack): hide reaction route carrier from sdk

* style: keep channel lifecycle within lint budget

* style: trim channel lifecycle carrier setup

* test: preserve route events on busy admission

* fix(reply): defer system event drain until admission

* test: prove deferred system event drain

---------

Co-authored-by: Sarah Fortune <sarah.fortune@gmail.com>
2026-08-12 10:04:57 -07:00
Peter Steinberger
f525bee2b4
test: isolate assistant transcript repair coverage (#122722)
Co-authored-by: Amp <amp@ampcode.com>
2026-08-12 10:02:54 -07:00
Amp
54734a3f0c fix(scripts): preserve symlinked API barrels 2026-08-12 10:00:58 -07:00
Peter Steinberger
522f06ffc6
feat(worker): support direct Gateway connections (#122683)
* feat(worker): support direct gateway connections

* docs(plan): link node worker provider PR
2026-08-12 09:59:29 -07:00
Amp
9b80654d48 refactor(usage): centralize provider response handling
Amp-Thread-ID: https://ampcode.com/threads/T-019ff67a-5d86-7195-9569-725985ac21b1
2026-08-12 09:54:04 -07:00
Amp
70842228b9 chore(ui): satisfy media readiness lint
Amp-Thread-ID: https://ampcode.com/threads/T-019ff689-6180-72ad-b50d-35b6427c5573
2026-08-12 09:47:50 -07:00
Amp
10acea603d refactor(ui): centralize chat media readiness
Amp-Thread-ID: https://ampcode.com/threads/T-019ff689-6180-72ad-b50d-35b6427c5573
2026-08-12 09:47:50 -07:00
wanyongstar
7e21533841
fix(browser): validate extension relay frame fields before handling (#120283)
* fix(browser): validate extension relay frame fields before handling

* refactor(browser): clarify relay frame validation

* style(browser): format relay frame guards

---------

Co-authored-by: Dallin Romney <dallinromney@gmail.com>
2026-08-13 00:46:15 +08:00
Peter Steinberger
df4e6666c6
refactor(voice): promote realtime voice policy to talk owner (#122668)
* refactor(voice): promote realtime voice policy to talk owner

Move the exact-speech protocol (typed consult-call outcome instead of
string scraping), agent-proxy session instructions, and consult/wake-name/
barge-in policy defaults from the Discord plugin into src/talk, exported
additively via openclaw/plugin-sdk/realtime-voice. Wake-name enablement now
keys on a supportsActivationNameGating provider capability instead of a
hardcoded provider id. Follow-up to the voice split (#122479).

* fix(talk): bind exact-speech bypass to retained session state

Per ClawSweeper review on #122668: the protocol marker is untrusted model
tool-call text; only a parsed answer matching a currently retained
exact-speech text may select the privileged replay path. Unretained
marker calls route to a normal consult.
2026-08-12 09:44:19 -07:00
Peter Steinberger
7179d21d97
feat(gateway): expose public worker ingress (#122643)
* feat(gateway): expose public worker ingress

* docs(plan): mark public worker ingress in progress

* fix(gateway): harden worker ingress provenance

* fix(gateway): preserve disabled worker ingress response
2026-08-12 09:41:45 -07:00
Peter Steinberger
b9f5548b29
test(commands): isolate agent command owner boundaries (#122704)
Amp-Thread-ID: https://ampcode.com/threads/T-019fee8d-665d-707b-a380-23f2a6a1ce03

Co-authored-by: Amp <amp@ampcode.com>
2026-08-12 09:31:23 -07:00
SunnyShu
9594fe4623
fix(media): retain readable images from partial batches (#122361)
Keep readable native images when another attachment fails resolution.
Suppress only unresolved media facts across persisted and transient runner paths.

Co-authored-by: SunnyShu0925 <shu.zongyu@xydigit.com>
2026-08-12 21:57:31 +05:30
Markus Hartung
4e12d0556b
feat(ai): continue stateful OpenAI SSE turns (#122194)
* feat(ai): continue stateful OpenAI SSE turns

Use the prior OpenAI Responses ID for native stateful HTTP/SSE turns, retry missing server state with full history in the same turn, and keep stateless/custom routes unchanged.

Co-authored-by: Markus Hartung <mail@hartmark.se>

* test(ai): assert Responses retry attempt metadata

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-12 09:25:51 -07:00
Peter Steinberger
c23d66e3b5
refactor: consolidate coercion ownership (#122692)
* refactor: consolidate coercion ownership

* test: align shard check with weighted planning

* chore: refresh plugin SDK API baseline
2026-08-12 09:25:28 -07:00
sholomsbs33
7c58151445
fix(agents): validate process actions at the schema boundary (#81157)
Make the process action enum authoritative for model-facing validation and direct executor calls, rejecting malformed actions before session lookup.

Refs #69582.


Punchcard-Session: clear-orchard-timber-c2

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
Co-authored-by: adone0 <vladyslav.yavorskyi@outlook.com>
2026-08-13 00:25:03 +08:00
Vincent Koc
7fa5442fc1
fix(qa): accept cumulative compaction counts (#122680) 2026-08-13 00:19:49 +08:00
Vincent Koc
c76c6cd8a7
fix(ci): stabilize sqlite vacuum interruption proof (#122700) 2026-08-13 00:16:44 +08:00
Peter Steinberger
f29d581ab8
fix(agents): preserve session classification (#122697) 2026-08-12 09:12:14 -07:00
Peter Steinberger
6093e3477d
fix(cli): make doctor --json imply read-only lint mode (#122662)
* fix(cli): make doctor json imply lint

* fix(cli): preserve doctor session selector errors
2026-08-12 09:04:51 -07:00
Vincent Koc
44335ac7ce
fix(e2e): strip private ai fixture dev dependencies (#122678) 2026-08-13 00:03:48 +08:00
Peter Steinberger
71e8cc033b
refactor(qa): remove gateway child test facade (#122693)
* refactor(qa): remove gateway child test facade

* test(qa): refresh scenario source references

* fix(qa): preserve packaged auth redaction boundary
2026-08-12 09:03:40 -07:00
Peter Steinberger
28a5889e9b
feat: supervise headless Linux host desktop (#122677)
* feat(gateway): manage headless Linux host desktop

* chore(plugin-sdk): refresh API baselines

* fix(gateway): tighten managed desktop status proof

* style(gateway): satisfy managed desktop lint

* fix(gateway): preserve explicit port probe result

* fix(doctor): avoid inferring managed desktop runtime state
2026-08-12 08:56:34 -07:00
Peter Steinberger
1f8fdf4ef0
refactor(memory-core): consolidate manager test fixtures (#122671)
* test(memory-core): consolidate manager index fixtures

* test(memory-core): table-drive manager state cases

* test(memory-core): type shared fixture surface
2026-08-12 08:50:09 -07:00
Peter Steinberger
0f4640a887
refactor(openai): consolidate realtime test fixtures (#122670)
* test(openai): consolidate realtime voice fixtures

* test(openai): table-drive realtime voice cases

* test(openai): remove redundant realtime coverage

Browser auth remains covered by 'requires Platform auth before minting browser realtime client secrets' in realtime-voice-browser-auth.test.ts.\n\nCancelled, failed, and incomplete tool output remains covered by 'normalizes .status without closing the reusable socket' in realtime-voice-terminal-outcomes.test.ts.\n\nCommitted oversized finals remain covered by the 'after item commit' row in realtime-transcription-provider.bounds.test.ts.
2026-08-12 08:39:26 -07:00
Vincent Koc
9e8995384b
fix(slack): retry transient member auth lookups (#122356) 2026-08-12 23:38:43 +08:00
Amp
91197bf8d1 refactor(fireworks): flatten Kimi stream wrapper 2026-08-12 08:36:33 -07:00
Amp
72f4ee2274 refactor(meta): inline response payload patching 2026-08-12 08:36:33 -07:00