Commit Graph

16409 Commits

Author SHA1 Message Date
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
Yuval Dinodia
a06799ab2a fix(acpx): keep leaked non-openai model out of the Codex ACP thinking slot (#95852)
* fix(acpx): keep leaked non-openai model out of the Codex ACP thinking slot

Codex ACP spawn mis-routed an inherited non-OpenAI fleet default into the
reasoning-effort slot and aborted (#95780). Replace the splitter with a closed
classifier and make the spawn path provenance-aware: drop an inherited leaked
default so Codex starts on its own default, but fail closed with
ACP_INVALID_RUNTIME_OPTION when a caller explicitly selects an unsupported or
malformed model. Thread a modelExplicit flag from resolveAcpSpawnRuntimeOptions
through the ACP runtime ensure contract; strip it before the acpx delegate.

Dropping the inherited default only at ensureSession was not enough: the manager
still persisted the leaked model in runtimeOptions, and the first turn replayed
it through applyRuntimeControls -> setConfigOption(model), which the new
fail-closed Codex control path then rejected. ensureSession now reports the
effective model it applied on the returned handle (applied | dropped), and the
manager persists that effective model, so a dropped inherited default is never
saved or replayed as a model control before the first turn. Explicit unsupported
selections still fail closed at spawn and never persist.

* test(acp): split runtime config validation tests

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 20:15:03 -07:00
clawsweeper[bot]
1c5c3d5201 fix(codex): before_prompt_build receives conversation messages (#101752)
Co-authored-by: clawsweeper <274271284+clawsweeper[bot]@users.noreply.github.com>
Co-authored-by: xingzhou <275915537+zhangguiping-xydt@users.noreply.github.com>
2026-07-16 20:10:25 -07:00
Peter Steinberger
28a3540f32 feat: add native inline widget support (#109212)
* feat: add native inline widget support

* refactor: simplify plugin surface refresh

* fix: preserve plugin surface refresh API

* fix: reload widgets after WebKit termination

* fix: harden native widget refresh

* fix: bound native widget recovery

* docs: defer native widget release note

* chore: refresh native i18n inventory

* fix: harden native widget delivery

* refactor: simplify native widget API surface

* fix: serialize native widget capability refresh

* fix: harden native widget recovery

* fix: recover native widget capabilities

* style: format widget refresh role selection

* fix: correct widget refresh formatting

* fix: harden cross-platform widget recovery

* fix: bind widget trust and recovery to routes

* chore: refresh native i18n inventory

* chore: regenerate Android gateway protocol

* test: remove unused release workflow read
2026-07-16 19:24:41 -07:00
wings1029
730cfd774d fix(qa): bound Windows taskkill process termination (#109453)
`taskkill.exe` can hang when the target process is stuck in a kernel wait
state (e.g. a pending I/O request). Add a 5-second timeout so QA scenario
cleanup fails closed instead of hanging the test runner indefinitely.

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 19:11:43 -07:00
wings1029
13e43d4c05 fix(qa): bound gateway child taskkill termination (#109454)
`taskkill.exe` can hang when the target process is stuck in a kernel wait
state. Add a 5-second timeout to both taskkill invocations in the gateway
child process tree cleanup so stalled termination fails closed instead of
hanging the QA runner.

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 19:10:53 -07:00
Peter Steinberger
658b601ee5 feat(llama-cpp): in-process local GGUF text inference provider (#109444)
* feat(llama-cpp): add in-process text inference

* test(llama-cpp): narrow setup provider fixture

* fix(llama-cpp): trim public surface and refresh docs map

* fix(llama-cpp): import Context type in inference test
2026-07-16 18:53:55 -07:00
xingzhou
afd0fe32c2 fix(qa-lab): preserve boundary emoji in gateway startup diagnostics (#104840)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 18:26:26 -07:00
EVA
368941ae7a feat(workspaces): add secure preview widget (#101354)
* feat(workspaces): add secure preview widget

* fix(workspaces): type preview reload assertion

* fix(workspaces): harden preview widget

* fix(workspaces): honor preview URL binding ownership

* chore(workspaces): remove unused widget exports

---------

Co-authored-by: Eva <eva@100yen.org>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 18:21:54 -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
Wynne668
54f1800d2a fix(matrix): bound recovery key stdin input (#108120)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 18:14:33 -07:00
Peter Steinberger
784ede0af1 feat(system-agent): local-model viability — context cap, thinking off, route-aware timeout (#109445)
* feat: improve system agent local model viability

* fix: forward Ollama effective context cap

* fix(system-agent): keep flat 120s agent-turn budget

* fix(system-agent): keep manifests timeout helper module-local
2026-07-16 18:11:22 -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
Peter Steinberger
edd052989b refactor(google-meet): merge host and node realtime engines behind one audio transport (#109413)
* refactor(google-meet): merge host and node realtime engines behind one audio transport

* refactor(google-meet): internalize engine helpers left test-only after realtime-node removal
2026-07-16 17:39:53 -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
sunlit-deng
a8dc0683cc fix(xai): ignore blank audio env api key (#108953)
* fix(xai): ignore blank audio env api key

* test(xai): focus blank env regression

Co-authored-by: sunlit-deng <yang.jiajun1@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 17:24:35 -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
xingzhou
2b4b688581 fix(github-copilot): release failed catalog responses (#109071) 2026-07-16 17:07:24 -07:00
Peter Steinberger
83d82c9302 refactor(channels): persist runtime state in plugin SQLite (#109380)
* refactor(channels): move reef, msteams, matrix, zalouser file state to SQLite with doctor imports

* fix(channels): harden SQLite state migrations

* test(reef): use SQLite flow stores in receipt suites

* fix(reef): validate restored request policy

* fix(reef): retain replay state through relay window

* docs(reef): describe durable state import

* fix(reef): honor configured legacy state path

* chore: leave changelog to release flow

* fix(reef): use managed temp root in flow tests

* fix(matrix): omit undefined device id from state
2026-07-16 17:05:28 -07:00
Shakker
2f23642719 fix: allow local HTTP ClickClack setup codes (#109429) 2026-07-17 01:00:18 +01:00
mushuiyu886
3ba08dbf77 fix(qa): bound process snapshot probes (#109207) 2026-07-16 16:54:54 -07:00
EVA
4a7abe1556 Workspaces: add trusted chart widgets (#101792)
* feat(workspaces): add trusted chart widgets

* fix(workspaces): keep chart helpers private

* test(workspaces): prove chart widgets in control UI

* fix(workspaces): validate empty chart bounds

* fix(workspaces): expand subnormal chart ranges

* fix(workspaces): normalize chart ranges

* fix(workspaces): keep zero bars at baseline

* fix(ui): sync chart widget locales

* fix(ui): translate chart widget locales

---------

Co-authored-by: Eva <eva@100yen.org>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 16:50:49 -07:00
ooiuuii
b1eaf53672 fix(feishu): avoid local media fallback leaks (#98251)
* Fix Feishu local media fallback leaks

* refactor(feishu): clarify media fallback link style

* fix(feishu): reject credentialed media fallbacks

* fix(feishu): reject ambiguous media fallback URLs

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 16:48:31 -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
d6026ff1fa fix(clickclack): clear deadcode and lint breaks in setup flow
Recent setup commits left the hard-zero gates red on every PR:
parseClickClackSetupCodeInput was exported but only used internally,
ClickClackSetupCodeClaimError was exported yet consumed only by its
test (production catches it structurally through a status field), a
string spread tripped no-misused-spread, and a computed "token" key
tripped no-useless-computed-key. Un-export both symbols, switch the
test to a structural claim-error stand-in matching what the formatter
reads, and apply the two mechanical lint fixes.
2026-07-16 16:23:24 -07:00
zw-xysk
016d80fa10 fix(voice-call): keep ngrok tunnel logs UTF-8 safe across chunk splits (#109220)
* fix(voice-call): decode ngrok pipe chunks as UTF-8

Keep ERR_NGROK diagnostics and startup log lines intact when a multibyte code point is split across stdout/stderr reads.

* test(voice-call): add L3 real-pipe UTF-8 chunk proof for ngrok

Spawn a real Node child through the production startTunnel path so OS pipe boundaries exercise setEncoding("utf8"), and emit a scrapable live-proof line.

* test(voice-call): type real ngrok pipe child for check-test-types

Use ChildProcessByStdio<null, Readable, Readable> for stdio ignore/pipe/pipe instead of casting to ChildProcessWithoutNullStreams.

* test(voice-call): simplify ngrok UTF-8 proof

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 16:09:06 -07:00
Peter Steinberger
3852a75803 improve(extensions): reduce test hotspot setup costs [AI] (#109346)
* test(extensions): reduce hotspot setup costs

* test(signal): track reply reset usage

* test(signal): group reply state helpers

* test(signal): isolate reply author state

* test(active-memory): preserve fixture isolation
2026-07-16 16:07:11 -07:00
Shakker
efd6d8d3f7 test: type ClickClack setup claim fetch mocks (#109398) 2026-07-16 23:56:29 +01:00
Shakker
e78d117a59 refactor: keep claimed ClickClack credentials reviewable 2026-07-16 23:56:29 +01:00
Shakker
5bd0864c4e test: keep ClickClack setup fixtures review-safe 2026-07-16 23:56:29 +01:00
Shakker
ee153b1688 test: use review-safe ClickClack token fixtures 2026-07-16 23:56:29 +01:00
Shakker
44d1542a76 perf: keep ClickClack claim networking off setup startup 2026-07-16 23:56:29 +01:00
Shakker
e6c8f82f50 feat: expose ClickClack setup codes in channels add 2026-07-16 23:56:29 +01:00
Shakker
4cd07e5e8c feat: configure ClickClack accounts from setup codes 2026-07-16 23:56:29 +01:00
Shakker
204f4499e8 feat: add secure ClickClack setup code claim client 2026-07-16 23:56:29 +01:00
xingzhou
2cd236385b fix(reef): close provider streams after guard errors (#109196) 2026-07-16 15:53:23 -07:00
Peter Steinberger
a168ffcd5e improve: reduce extension monitor test import overhead (#109345)
* test(feishu): consolidate monitor helper coverage

* test(imessage): consolidate monitor helper coverage

* test(mattermost): consolidate monitor helper coverage

* test(zalo): consolidate monitor lifecycle coverage

* test(imessage): classify merged monitor support correctly
2026-07-16 15:20:08 -07:00
Peter Steinberger
8680faf83c refactor(discord): retire internal abort signal helper (#109369) 2026-07-16 15:12:50 -07:00
Peter Steinberger
40b10eb3d1 perf: avoid plugin cold loads in request hot paths (#109348)
* perf: avoid cold plugin discovery in hot paths

* chore: remove stale harness policy re-export

* fix: preserve active thinking clamps in status
2026-07-16 14:54:32 -07:00
Peter Steinberger
bd9a996b78 refactor(slack): drive progress drafts through the shared compositor (#109336)
* test(slack): drop rotating loading-message fixture expectations

* refactor(slack): drive progress drafts through the shared compositor

Slack's status_final progress path now uses the shared channel compositor
(preamble headline, reasoning, tools, plan checklist, commentary
arbitration) instead of its hand-rolled gate/merge/render pipeline, and
native task cards consume compositor snapshots with stable row identity
(line ids first, fixed reasoning id, occurrence-suffixed content hashes).
Finals in progress mode post as fresh messages that follow the draft's
thread; the working draft then collapses into a compact activity receipt,
while failed or error finals leave the draft as the turn record. The
rotating native loading messages are gone in favor of the plain typing
status. Queued and assistant-boundary turns re-arm with clean delivery
state, and native completion status survives transient append failures.
2026-07-16 14:50:36 -07:00
Peter Steinberger
7bc2b96c82 perf(anthropic): cache Claude session-catalog transcript metadata by mtime (#109309) 2026-07-16 14:41:33 -07:00
RileyJJY
786ad1dbf8 fix(sms): ignore blank Twilio env account fallbacks (#109149)
* fix(sms): ignore blank Twilio env account fallbacks

* refactor(sms): reuse configured account value predicate

Co-authored-by: RileyJJY <0668000974@xydigit.com>

* test(sms): keep blank account fixture minimal

Co-authored-by: RileyJJY <0668000974@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 14:19:21 -07:00
Peter Steinberger
a327e43023 fix(kimi): import isLiveTestEnabled from plugin-sdk/test-live
The live-test helper is exported from openclaw/plugin-sdk/test-live (as every
other extension live test imports it), not test-env. The wrong subpath in
#109335 broke check-test-types repo-wide.
2026-07-16 14:09:22 -07:00
Peter Steinberger
0631252f4b refactor: reduce plugin SDK test import overhead (#109333)
* refactor(test): split plugin SDK test helpers

* fix(test): align plugin SDK test subpaths
2026-07-16 13:55:23 -07:00
Peter Steinberger
cfaa30a08f fix(release): align Codex discovery and Telegram traces 2026-07-16 21:54:11 +01:00
Dallin Romney
8924e27bb6 refactor(qa): keep synthetic UX evidence out of scenario catalog (#109315)
* refactor(qa): keep UX evidence producer out of catalog

* test(qa): preserve UX producer runner integration
2026-07-16 13:51:18 -07:00
xingzhou
950ec3c620 fix(telegram): stalled getChat errors retain connections (#109007)
* fix(telegram): abort stalled getChat errors

* test(telegram): satisfy promise executor lint

* fix(telegram): close getChat lookup transports

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 13:50:50 -07:00
Peter Steinberger
2409df768c fix(kimi): honor K3 thinking off (#109335)
* fix(kimi): honor K3 thinking off

* chore: defer Kimi release note

* test(kimi): narrow live reasoning blocks
2026-07-16 13:50:15 -07:00
Peter Steinberger
093b8859c4 perf(test): fix env-dependent failures, stop verifier lazy-fetch, balance CI stripes (#109332)
* test: fix environment-dependent failures on built and partial-clone checkouts

Canvas A2UI fixtures now pin the resolved root through a new canvas
test-api hook: dev checkouts with a locally built a2ui.bundle.js won
candidate resolution and shadowed the fixture root. Speech-core prefs
tests resolve the canonical tmpdir (macOS /tmp symlink breaks fs-safe
store roots), and the bundled plugin install test asks discovery for
the canonical bundled path instead of hardcoding the source tree.

* fix(release): keep evidence verifier blob reads local-deterministic

git show against a forged or missing SHA lazily fetched from the
promisor remote on partial clones, hanging a security check on network
state (266s observed). GIT_NO_LAZY_FETCH pins verification to local
objects; missing blobs fail closed as before.

* perf(test): pay the command-handler barrel once and merge subagent command tests

commands-name and commands-login imported the full handler barrel
(~1,700 modules) for registration assertions; those now live in a
dedicated registration test, dropping the two files from 12.6s/4.6s to
1.4s/1.0s locally. Five subagent command test files merged into one so
the auto-reply module graph evaluates once instead of five times.

* perf(ci): stripe node test bins by measured file cost

Round-robin striping packed the whale files together, leaving
auto-reply-commands-1 at ~220s while sibling stripes idled at ~30s.
Greedy LPT over advisory per-file seconds hints balances the commands,
cli-runner, and tooling stripes deterministically; group hints for the
restriped bins are equalized at the old totals.
2026-07-16 13:38:56 -07:00