Commit Graph

6790 Commits

Author SHA1 Message Date
Peter Steinberger
a838c68dbe feat(talk): add Gemini Live video (#109719)
Stream bounded browser camera frames directly to Gemini Live and keep camera media off the Gateway. Add lifecycle, function-calling, fake-camera E2E, and live-smoke coverage.

Co-authored-by: shushushu <1064076525@qq.com>
2026-07-16 23:55:06 -07:00
Wynne668
9ac2f77487 fix(cli): force-stop stalled root-help renderers (#109417)
Co-authored-by: wahaha1223 <0668001153@xydigit.com>
2026-07-16 23:30:02 -07:00
Peter Steinberger
2030ac7438 fix(acp): preserve legacy replay state during doctor repair (#109685)
* fix(acp): move legacy replay migration to doctor

* refactor(acp): use Kysely for replay migration

* style(acp): remove redundant replay coercions

* style(acp): format replay migration
2026-07-16 23:29:29 -07:00
Peter Steinberger
a1dfd47edd refactor(sdk): collapse plan updates to typed steps (#109660)
* refactor(sdk): collapse plan updates to typed steps

Per owner decision, remove the shipped steps: string[] SDK field and its unreleased planSteps replacement early. Collapse onPlanUpdate to one typed steps field. Retain wire-level string normalization for external Codex plugin version skew.

* chore(sdk): tighten rebased surface budget
2026-07-16 22:35:29 -07:00
Peter Steinberger
ec42788cef perf(ci): cache packaged dependency reify in the docker e2e functional image (#109665)
* perf(ci): cache packaged dependency reify in the docker e2e functional image

Split the shared functional E2E image into manifest -> deps -> app stages so
the 328-package npm reify is layer-keyed on package.json + npm-shrinkwrap.json
alone. Per-PR tarballs (changed dist bytes, unchanged deps) now hit the cached
dependency layer on warm builders (Blacksmith sticky docker layers, local
buildkit) instead of re-running npm install on every build; the per-PR work
drops to manifest extract + package extract + packaged postinstall.

The deps stage reify also matches the shipped shrinkwrap exactly; the previous
npm install -g <tarball> path silently drifted ~15 transitive packages to newer
registry versions and lost the node-domexception -> @nolyfill/domexception
alias. npm install (not npm ci) because the generated shrinkwrap does not
guarantee npm ci's strict manifest sync (p-retry pins @types/retry@0.12.0 while
the shrinkwrap resolves 0.12.5).

Local proof (Apple Silicon, docker-container builder): per-PR warm image build
59s -> 43s with the 29s npm layer CACHED; lane total 164s -> 139s warm,
229s -> 160s cold; system-agent-first-run lane passes end to end, and the
installed tree matches the old image structure except for the documented
version-drift fixes.

* test: update e2e image guard for the staged dependency layer

The guard pinned the retired npm install -g invocation; assert the new
invariants instead: manifest-keyed deps layer, no global-prefix install,
deps COPY into /app, and postinstall ordered before the self-link so its
prune walks cannot cycle.
2026-07-16 22:34:13 -07:00
Leon-SK668
7e34687015 fix(scripts): preserve emoji in issue label prompts (#109477) 2026-07-16 22:27:04 -07:00
Peter Steinberger
0e9db60059 fix(ci): accept environment-waiting publish evidence 2026-07-17 06:11:20 +01:00
Peter Steinberger
e873a7f955 refactor(memory): move QMD coordination to SQLite (#109636)
* refactor(memory): move QMD coordination to SQLite

* chore: keep release notes in PR body

* chore: annotate lease SQLite primitive
2026-07-16 22:01:34 -07:00
Peter Steinberger
e7c389b97a perf(ci): cache declarations and remove test import tail (#109593) 2026-07-16 21:51:06 -07:00
Ayaan Zaidi
19b5e564d7 fix(channels): clear type-aware lint debt and re-measure the drain seam after the split 2026-07-17 10:12:54 +05:30
Ayaan Zaidi
16c14e5bbf feat(channels): expose the turn-adoption lifecycle seam
Replace the bare onTurnAdopted callback and queuedFollowupLifecycle with one
turnAdoptionLifecycle surface (onSettled guaranteed via finally; adoption-loss
aborts queued steering turns without transcript replay), threaded through the
turn kernel and agent runner, exposed to plugins via
runtime.state.openChannelIngressDrain and the channel-outbound SDK barrel,
with surface budgets re-measured against the narrowed baselines (#108656).
2026-07-17 10:12:54 +05:30
Peter Steinberger
863297cce5 perf(ci): cut cli-startup-metadata and preflight fixed costs (#109628)
* perf(build): cut write-cli-startup-metadata wall time via launcher-boot browser help and parallel renders

* perf(ci): fetch preflight parent metadata blob-less instead of a full depth-2 snapshot

* test(ci): expect the blob-less preflight parent fetch in checkout guards

* fix(build): default the bundled root-help render env

RootHelpRenderOptions marks env optional but spawnText requires one;
check-test-types caught the undefined assignment.
2026-07-16 21:35:03 -07:00
Peter Steinberger
e3618454f2 refactor(talk): add realtime voice session harness and adopt in google-meet and voice-call (#109497)
* refactor(talk): add realtime voice session harness and adopt in google-meet and voice-call

* fix(google-meet): satisfy prefer-const in realtime engine wiring
2026-07-16 21:28:44 -07:00
Peter Steinberger
0c18e0c87f refactor(docker): isolate E2E diagnostics (#109625) 2026-07-16 21:19:06 -07:00
Peter Steinberger
ff9b291673 fix(docker): explain unsupported E2E resource limits (#109587)
* fix(docker): diagnose unsupported E2E resource limits

* test(docker): track diagnostic temp dirs

* fix(docker): bound resource diagnostic capture

* fix(docker): restrict diagnostic FIFO access
2026-07-16 20:56:23 -07:00
Peter Steinberger
96815a437b fix(channels): centralize access gates and media fallback (#109548)
* refactor(channels): shared supplemental sender gating, allowlist-match adoption, outbound mop-ups

* fix(plugin-sdk): skip-aware media sequence with text fallback for empty URLs

* chore(plugin-sdk): align surface budgets after rebase

* test(qqbot): type media sender mock calls

* fix(plugin-sdk): distinguish empty media sequences

* fix(plugin-sdk): track void media sends
2026-07-16 20:55:08 -07:00
Peter Steinberger
2256387885 fix(ci): clear duplicate declaration and retired-state assertion breaks
Two direct-landed changes left every PR red: release-candidate-checklist.d.mts
declared isDirectReleaseCandidateExecution twice with other declarations
between them (adjacent-overload-signatures), and the parallels smoke model
test still asserted the workspace-state.json seeding that b6535fb8de
deliberately retired. Drop the duplicate and flip the assertion to guard
the retirement.
2026-07-16 20:37:45 -07:00
Peter Steinberger
6a89730c7b fix(scripts): restore isDirectReleaseCandidateExecution declaration (#109586) 2026-07-16 20:24:24 -07:00
EVA
09575bd20f feat(workspaces): show agent status and custom-widget decisions (#101826)
* feat(workspaces): add operations widgets

* fix(workspaces): format agent progress translation

* fix(workspaces): keep operations widget helpers private

* feat(workspaces): harden operations widgets

Co-authored-by: EVA <eva@100yen.org>

* chore(i18n): defer generated locale refresh

* refactor(workspaces): isolate approval state

* fix(release): declare direct checklist execution

* fix(release): satisfy checklist declaration lint

* fix(release): align checklist declaration order

---------

Co-authored-by: Eva <eva@100yen.org>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 20:19:49 -07:00
Peter Steinberger
b6535fb8de fix(release): stop writing retired smoke state 2026-07-17 04:14:39 +01:00
Peter Steinberger
69b2916dd6 fix(scripts): drop duplicate isDirectReleaseCandidateExecution declaration (#109560) 2026-07-16 20:04:42 -07:00
Peter Steinberger
082ffd442a fix(release): remove duplicate checklist declaration (#109553) 2026-07-16 19:54:27 -07:00
Peter Steinberger
eb17bfdc95 fix(release): declare direct checklist execution helper (#109546) 2026-07-16 19:43:51 -07:00
Peter Steinberger
33a354c655 fix(scripts): declare isDirectReleaseCandidateExecution in checklist d.mts
test/scripts/release-candidate-checklist.test.ts imports it; the missing
declaration breaks check-test-types on main.
2026-07-17 02:42:51 +00:00
Peter Steinberger
905395a3ff fix(release): stop recreating retired workspace state 2026-07-17 03:41:32 +01:00
Peter Steinberger
dffb136784 fix(release): keep beta performance advisory 2026-07-17 03:06:39 +01:00
Peter Steinberger
aafbf7aabc fix(pr): close the review follow-ups on early gate proof (#109513)
* fix(pr): close the review follow-ups on early gate proof

Three fail-safe gaps from #109331's review that silently disabled the
speedup: a stale terminal failure blocked a gate-proven pending rerun
(now superseded only by a SCHEDULED run whose own gate passed — manual
runs still cannot mask unresolved failures, guard test intact); the
attempt jobs lookup read one page while full-scope runs sit near the
100-job cap (now pages until the gate job is visible); and same-attempt
completion between snapshot and re-read discarded valid gate evidence
(now only an advanced attempt or non-success completion rejects).

* fix(pr): only newer gate-proven reruns supersede a terminal failure

Autoreview P1: without an ordering bound, a stalled older run's passed
gate could mask a newer completed failure. The supersede now requires
the gate-proven scheduled run to be created after the failed run;
regression test covers the stalled-older-run case.
2026-07-16 19:02:52 -07:00
Peter Steinberger
9bd51e97fa fix(release): run trusted tooling through symlink roots 2026-07-17 03:00:52 +01:00
Leon-SK668
2e3b4ab586 fix(scripts): preserve emoji in dev tooling previews (#109469)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 18:56:18 -07:00
Peter Steinberger
6b6bf3a34b fix(ci): repair Mantis desktop scenario dispatch (#109505) 2026-07-16 18:50:57 -07:00
Leon-SK668
1f5c8239d7 fix(scripts): preserve emoji in request log previews (#109481)
* fix(scripts): preserve emoji in request log previews

* fix(scripts): keep mock preview standalone

* refactor(scripts): reuse UTF-16 truncation helper

Co-authored-by: Leon-SK668 <0668001470@xydigit.com>

* test(scripts): cover raw Node mock loading

Co-authored-by: Leon-SK668 <0668001470@xydigit.com>

* docs(scripts): note raw Node type stripping contract

Co-authored-by: Leon-SK668 <0668001470@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 18:49:36 -07:00
Peter Steinberger
067635cb51 fix(ui): prevent generated locale rebase conflicts (#109393)
* ci(ui): make locale refresh bot-owned

* test(ui): keep locale gate coverage scoped

* fix(ci): preserve generated PR merge policy

* fix(ci): wait for generated PR head convergence

* fix(ci): retry transient guard API failures

* fix(ci): enforce locale isolation across CI events

* fix(ci): harden generated PR publication

* fix(ci): validate release gate merge tree

* fix(ci): allow trusted main locale output
2026-07-16 18:48:20 -07:00
Peter Steinberger
96b2a203ce perf(pr): accept gate-proven in-progress CI runs for landing (#109331)
* perf(pr): accept gate-proven in-progress CI runs for landing

verify-pr-hosted-gates required the whole CI run to reach completed,
but openclaw/ci-gate — the branch-protection check — needs every
selected lane and fails on any non-success, so a successful gate bound
to the run's check suite proves the merge-relevant outcome while
post-gate stragglers (timing summaries, artifact uploads) are still
running. prepare-run now accepts an in-progress run whose own gate
check succeeded, cutting one to several minutes per landing. Exact
attempt binding via check_suite id prevents a stale gate from a
previous attempt vouching for a rerun; gate proof only applies to the
exact head under verification, never recent-parent evidence.

* fix(pr): bind gate proof to the run attempt, not the check suite

Autoreview P1: check suites survive reruns, so a prior attempt's
successful gate could vouch for an in-progress rerun that has not
reached its own gate. The proof now goes through the attempt-scoped
jobs listing (filter=latest): the gate job must carry the run's own
run_attempt. Regression tests cover same-run/previous-attempt,
different-run, failed, and missing gate jobs.

* fix(pr): rely on filter=latest for gate attempt scoping

Autoreview P2: the REST list-jobs payload does not expose run_attempt,
so requiring it rejected every genuine rerun gate. loadCiGateJobs
already fetches per run with filter=latest, which scopes to the current
attempt, so a run_id match binds the gate correctly without the absent
field.

* fix(pr): declare ciGateJobs in the hosted-gates evidence typedef

* fix(pr): un-export the internal gate helper and loosen test id typing

hasSuccessfulCiGateJob is only reached through collectHostedGateEvidence,
so exporting it tripped the hard-zero deadcode gate; the new test also
typed workflow ids as number against the unknown-shaped return.

* fix(pr): bind early gate proof to the run attempt

Autoreview P1: workflow attempts share a run id and filter=latest keeps
a not-yet-rerun job's prior-attempt execution, so a partial rerun could
surface an old successful ci-gate. The REST job payload does expose
run_attempt (verified live), so fetch the attempt-specific jobs endpoint
and require the gate job's run_attempt to equal the run's.

* fix(pr): revalidate the run attempt after loading gate jobs

Autoreview P2: a rerun starting between the workflow-run snapshot and the
attempt-specific jobs fetch could return a stale prior-attempt gate. Re-read
the run after fetching its jobs and drop the evidence if the run completed or
its attempt advanced, so early proof only applies while the same attempt is
still pending.
2026-07-16 18:31:40 -07:00
Leon-SK668
8fef264f70 fix(release): preserve emoji in ClawHub error details (#108172)
* fix(release): keep ClawHub errors valid Unicode

* fix(release): keep ClawHub helper source-resolvable

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 18:20:34 -07:00
Peter Steinberger
0a19e1ed58 refactor(channels): centralize mention and group activation decisions (#109480)
* refactor(channels): adopt shared mention-gate decision; consolidate group activation

* fix(matrix): carry effective mention decision

* test(session): pin qqbot accessor migration
2026-07-16 18:15:58 -07:00
Peter Steinberger
92146f9f80 refactor(talk): share audio-energy stats and speech-threshold gate across voice surfaces (#109466) 2026-07-16 18:10:26 -07:00
Leon-SK668
3da3318c56 fix(audit): preserve emoji in npm registry errors (#108208)
* fix(audit): keep registry errors valid Unicode

* style(audit): format registry error boundary test

* docs(audit): document direct Node import floor

Co-authored-by: Leon-SK668 <0668001470@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 17:53:09 -07:00
Leon-SK668
56d0721eb7 fix(release): preserve emoji in cross-OS response diagnostics (#108193)
* fix(release): keep cross-OS responses valid Unicode

* style(release): format cross-OS boundary test

* fix(release): resolve UTF-16 helper in direct Node runs

* fix(release): keep cross-OS summaries UTF-16 safe

Co-authored-by: Leon-SK668 <0668001470@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 17:43:56 -07:00
Peter Steinberger
dde6af2199 fix(docs): defer localized orphan deletion 2026-07-16 20:43:06 -04:00
Leon-SK668
bdf3886024 fix(scripts): preserve emoji in GitHub API errors (#108184)
* fix(scripts): keep GitHub errors valid Unicode

* style(scripts): format GitHub error boundary test

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 17:33:35 -07:00
Peter Steinberger
d71c1fe596 feat(onboarding): prefer strongest local model in guided detection (#109250)
* feat(onboarding): rank detected local models

* docs(sdk): comment local-model rank bucket layout

* feat(sdk): rank gemma4 first for local setup-assistant models
2026-07-16 17:30:49 -07:00
Peter Steinberger
b78cf56349 improve(ci): persist warm Vitest and Node caches (#109425)
* perf(ci): harden persistent test caches

* ci: document trusted cache cleanup trigger

* ci: harden composite cache inputs

* perf(ci): isolate Node build bytecode cache
2026-07-16 17:22:28 -07:00
Peter Steinberger
85d375c1b2 chore: add live tool-surface benchmark (#109374)
* test(agents): add tool-surface live benchmark

* chore(agents): narrow live benchmark exports

* fix(agents): pin live bench models
2026-07-16 17:20:47 -07:00
ooiuuii
396194b96b fix(install): reject PATH runtimes with broken npm (#107825)
* fix(install): reject runtimes with broken npm

* test(installer): use real Node for npm selection

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 17:17:07 -07:00
iloveleon19
382d570cbf feat(channels): add unified implicit mention policy (#108829)
* feat(mattermost): add thread.requireExplicitMention to opt out of thread auto-follow

Mattermost treats any reply in a thread the bot has participated in as an
implicit mention, so requireMention only gates the first message and the bot
then answers follow-ups addressed to other people for the participation TTL.
Slack exposes channels.slack.thread.requireExplicitMention for exactly this;
Mattermost had no equivalent and its strict schema rejected the key.

Add channels.mattermost.thread.requireExplicitMention (channel + per-account),
mirroring Slack. When set, thread participation no longer counts as a mention.
Default (unset/false) keeps today's auto-follow behavior unchanged.

Related: #108269

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* feat(channels): add implicit mention policy foundation

* feat(channels): unify implicit mention policy

Co-authored-by: leon <dodoma0919@gmail.com>

* refactor(channels): keep implicit policy inside evaluator

* fix(channels): use exported implicit mention type

* chore(channels): satisfy extension lint

* fix(config): break implicit mention type cycle

* fix(plugin-sdk): account for implicit mention config export

* refactor(config): isolate implicit mention schema

* chore(plugin-sdk): align implicit mention surface budget

* fix(config): remove unused schema re-export

---------

Co-authored-by: leon <dodoma0919@gmail.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 17:16:01 -07:00
qingminlong
f3e8164e7c fix(ci): keep boundary output tails UTF-8 safe (#109167)
* fix(ci): keep boundary output tails UTF-8 safe

* fix(ci): preserve split UTF-8 output tails

Co-authored-by: qingminlong <qing.minlong@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 17:12:50 -07:00
Peter Steinberger
9cda66123b fix(ci): address reviewer findings across the perf-lever batch (#109254)
* fix(ci): address reviewer findings across the perf-lever batch

Seven follow-ups from Codex review feedback on the landed CI perf PRs:
docker packaging switches to the full build profile (the ciArtifacts
step env clobbered its canonical-dts requirement); the boundary sticky
restore gates on generative source tree OIDs in both lanes, making
restored artifacts valid by construction (kills the clock-skew mtime
false-skip and ghost declarations from deleted sources); the node-test
worker budget derives from nproc instead of the runner label (labels
over-promise under load) and keeps the 2-worker cap when plans can
overlap; the deadcode task falls back to serial Knip below 8 cores;
the lint-lane i18n verify also runs for any ui-touching diff (keys are
extracted from all ui sources, not just ui/src/i18n); the oxlint
concurrency diagnostic moves to stderr; and workspace packages join
the prompt-snapshot always-run surface.

* fix(ci): fingerprint every generative source the boundary artifacts consume

Autoreview flagged inputs outside the tree-OID gate; toolchain, config,
and script inputs were already covered by the sticky key hash, but the
old actions/cache key also fingerprinted src/plugins/types.ts and
src/video-generation sources the OID list missed. Add those plus
src/channels (the plugin-sdk declaration graph reaches its public
types) to the fingerprint in all three sites.

* fix(ci): fold runner toolchain identity into the boundary sticky fingerprint

Autoreview: the sticky key hashes config/scripts/package.json/lockfile,
but a node/pnpm toolchain bump (pinned in the workflow, not the key)
could leave the key unchanged and bless artifacts built with the prior
toolchain. Record node/pnpm versions alongside the source tree OIDs in
all three fingerprint sites so a toolchain-only change forces a cold
build.
2026-07-16 17:09:56 -07:00
Peter Steinberger
349f78776d fix(models): refresh bundled provider catalogs (#109410)
* fix(models): refresh bundled provider catalogs

* docs(models): refresh generated docs map

* fix(xiaomi): keep provider helper private

* chore(release): defer catalog release note
2026-07-16 16:47:25 -07:00
Peter Steinberger
334c182c27 refactor(diffs): move ephemeral artifacts to SQLite (#109328)
* refactor(diffs): move ephemeral artifacts to SQLite

* fix(plugin-state): satisfy SDK validation gates

* test(diffs): satisfy lint contracts

* fix(plugin-state): count expired blobs toward quotas

* fix(plugin-state): harden blob storage boundaries

* fix(plugins): replace stale install provenance
2026-07-16 16:47:19 -07:00
Peter Steinberger
7a58956768 fix(docs): drop duplicate pruneOrphanLocaleDocs declaration
The generated hand-edited d.mts declared pruneOrphanLocaleDocs twice
with resolveClawHubRepoPath between them, tripping the
adjacent-overload-signatures lint on every PR. Keep the documented
declaration.
2026-07-16 16:36:49 -07:00