Commit Graph

78640 Commits

Author SHA1 Message Date
Peter Steinberger 343850d0df fix(googlechat): preserve partial delivery evidence (#122760) 2026-08-12 11:34:59 -07:00
Peter Steinberger fb13d62e70 test(macos): remove unused coverage artifacts (#122755) 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