Commit Graph

20367 Commits

Author SHA1 Message Date
Peter Steinberger d9506ff26e fix(crabbox): restore cloud machine CPU and RAM (#130684)
Preserve structured provider catalogs beyond the lifecycle log capture limit so the cloud machine picker shows CPU/RAM and all available classes again. Keep lifecycle output limits and machine selection unchanged.

Fixes #130660.
2026-08-26 21:42:56 -07:00
Markus Hartung 8c293c1ae1 fix(matrix): show recovery key availability in text status (#128051)
Keep raw recovery keys in explicitly opted-in JSON output. Add a safe text
hint in the CLI-owned result renderer, remove duplicated stored-key output,
and cover normal, verbose, missing-key and JSON command behavior.

Thanks @hartmark for the original fix and real-account reproduction.

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-26 21:38:32 -07:00
Vincent Koc 345b25e305 refactor(qa-lab): share process tree metric reader (#130419) 2026-08-27 12:34:57 +08:00
Vincent Koc 53288562ca refactor(google-meet): share token source resolution (#130423) 2026-08-27 12:19:16 +08:00
Rain 110eb787a1 fix(github-copilot): preserve catalog thinking efforts in requests (#107834)
* fix(github-copilot): preserve catalog thinking efforts in requests

Unify discovered and bundled capability mapping with the provider thinking policy. Preserve supported xhigh/max Responses efforts and map minimal to the supported low minimum, while respecting explicit account opt-outs and transport limits.

Fixes #107792

Co-authored-by: Pluviobyte <Pluviobyte@users.noreply.github.com>

* fix(github-copilot): resolve nullable thinking policy transport

Accept the public policy API context and resolve missing transports before enforcing Claude and Gemini effort restrictions. Cover undefined and null API values without changing explicit Responses routes.

* refactor(github-copilot): normalize manifest models as one catalog

Use the canonical batch model provider builder after the single-row helper was removed on main. Preserve model transport and compatibility decoration without a legacy API shim.

* refactor(github-copilot): decorate owned catalog rows in place

Keep the normalized manifest batch as the sole owner of runtime rows and apply transport metadata directly, avoiding redundant row copies.

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Pluviobyte <Pluviobyte@users.noreply.github.com>
2026-08-26 21:09:21 -07:00
Vincent Koc 751e6c540f refactor(google): share video capability metadata (#130406) 2026-08-27 12:04:58 +08:00
Peter Steinberger 63f7df85bb feat(channels): post a grounded introduction when the bot joins a group room (#130103)
* feat(channels): introduce bots when they join group rooms

* feat(channels): add Discord and Telegram join introductions

* fix(channels): isolate untrusted evidence and select allowed join targets

* refactor(channels): scope joinIntro to implementing channels

* fix(channels): keep a delivered join introduction settled when its durable commit fails

* feat(channels): read more room history and document join introductions in detail

* chore(config): regenerate bundled channel metadata after rebase
2026-08-26 21:02:26 -07:00
Mislav Ivanda 3a5cb3847c feat(sandbox): add Daytona cloud sandbox backend plugin (#121554)
* feat: @openclaw/daytona-sandbox inital version

Signed-off-by: Mislav Ivanda <mislavivanda454@gmail.com>

* feat: plugin config params extended

Signed-off-by: Mislav Ivanda <mislavivanda454@gmail.com>

* feat: implement ClawSweeper review notes

Signed-off-by: Mislav Ivanda <mislavivanda454@gmail.com>

* fix(daytona): honor abort signals and clean up remote staging on failure

Signed-off-by: Mislav Ivanda <mislavivanda454@gmail.com>

* fix(daytona): register launcher as knip entry and refresh manifest schema

Signed-off-by: Mislav Ivanda <mislavivanda454@gmail.com>

* fix(daytona): cancellable session transport and auto-stopped sandbox restart

Signed-off-by: Mislav Ivanda <mislavivanda454@gmail.com>

* fix(daytona): deny egress by default and arm launcher cleanup before startup

Signed-off-by: Mislav Ivanda <mislavivanda454@gmail.com>

* fix(daytona): stop cancelled startup before submission

* test(daytona): satisfy deferred race lint

* test(release): update plugin publisher inventory

* fix(daytona): close provisioning and PTY cleanup gaps

* test(daytona): type PTY launcher mock

* fix(acpx): avoid promise-returning line handler

* fix(daytona): await PTY signal cleanup

* fix(daytona): declare ClawHub install route

* fix(daytona): forward PTY stdin EOF

* fix(daytona): serialize PTY input

* docs(daytona): document sandbox backend config

---------

Signed-off-by: Mislav Ivanda <mislavivanda454@gmail.com>
Co-authored-by: Patrick Erichsen <patrick.a.erichsen@gmail.com>
2026-08-26 20:52:12 -07:00
Vincent Koc 4c7f31f8fc refactor(diagnostics): merge tool call content branches (#130379) 2026-08-27 11:40:38 +08:00
Peter Steinberger 0924fd9a0c fix(codex): reclaim binding capacity after session deletion (#128366)
* fix(codex): reclaim binding ownership when sessions are deleted

Prepare harness deletion outside the SQLite writer and compare-delete exact companion ownership at the session removal edge, with compensation before commit and native subscription release afterward. Preserve live siblings and upstream native history. Repair proven orphan bindings through the existing Doctor planner under maintenance ownership.

* fix(codex): reuse prepared auth for resumed thread ownership

* docs(plugins): clarify shared migration and auth contracts

* test(codex): use the canonical config type facade

* fix(codex): preserve native threads during manual resume

Record pending attachment intent and validate the immutable native tool catalog
before applying configuration to the selected thread. Require uninterrupted
physical-client ownership through native unsubscribe, resume, and binding commit.
Keep the thread intact on unsupported policy, competing work, or failed proof.

Reuse canonical retained-owner cleanup and preserve unsafe-client retirement.
Cover the real command producer, cold and loaded resumes, competing leases,
lazy-store commit fencing, and the Gateway competing-owner path.

* test: isolate Codex auth and session completion fixtures
2026-08-26 20:33:53 -07:00
JC 8a0cf73053 fix(memory): isolate sqlite-vec KNN from the event loop (#128078)
* fix(memory): isolate sqlite-vec KNN in subprocess

* fix(memory): satisfy KNN subprocess CI guards

* test(release): include memory KNN child artifact

* test(memory): update KNN subprocess fixtures

* fix(memory): bound KNN child row payloads

* fix(memory): preserve published readers during cancellable KNN

Keep shadow reindex database, vector readiness, FTS and metadata state in
an owned async context. Public operations retain the published connection,
and escaped shadow continuations cannot write to it after rebuild closes.

Terminate the one-shot query child through its owned handle and retain
admission until close. Remove process-tree/PID probing and test-only hooks.
Cover publication overlap, callback reads, cancellation and recovery.

Co-authored-by: OpenClaw Assistant <assistant@openclaw.local>

* refactor(memory): separate database context ownership

Keep the published reader and shadow writer context in its own owner module. Repair plugin test imports and typed lint findings without changing the verified KNN behavior.

---------

Co-authored-by: OpenClaw Assistant <assistant@openclaw.local>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-26 20:29:02 -07:00
Peter Steinberger 7c6a79828a fix(feishu): preserve unavailable controls in message cards (#130641) 2026-08-26 20:27:31 -07:00
SunnyShu 87bc80bfe5 fix(memory): correct LIKE fallback ranking (#120603)
Treat LIKE fallback as recall-only so memory search no longer reports false perfect scores. Carry the body-match fact through keyword and hybrid ranking to preserve lexical ordering, including exact path tiers.

Co-authored-by: SunnyShu0925 <shu.zongyu@xydigit.com>
Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-08-27 08:49:31 +05:30
Vincent Koc d62cb8aa07 fix(sqlite): safely discard retired commitments state (#130629)
* fix(sqlite): finalize commitments retirement

* fix(doctor): discard retired commitments json
2026-08-27 11:18:58 +08:00
Vincent Koc 6e3df0d70b refactor(openai): inline non-negative config ranges (#130199) 2026-08-27 11:16:59 +08:00
xingzhou b05938bac1 fix(teams-meetings): verify listening in reused tabs (#111466)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-26 20:13:41 -07:00
Peter Steinberger f1bef4b3a2 fix(browser): preserve snapshot names and native refs (#130623) 2026-08-26 20:09:49 -07:00
Vincent Koc a87fb08e70 refactor(lobster): unify managed flow parameter parsing (#129540) 2026-08-27 10:58:06 +08:00
Peter Steinberger c578d324ef fix(qa): preserve truthful debug snapshots for large AIMock requests (#130605) 2026-08-26 19:54:39 -07:00
Peter Steinberger 4b287caac3 fix(memory): stop false Copilot index mismatch warnings (#130603)
Share provider-owned canonical model projection across cold identity and creation, keep undiscovered models unknown, and preserve strict initialized identity checks. Consolidate obsolete lookup and table-existence paths.

Co-authored-by: 1052326311 <65798732+1052326311@users.noreply.github.com>
2026-08-26 19:50:15 -07:00
Ayaan Zaidi 1cb914d6bf fix(telegram): make ask_user controls native and reliable (#130262)
Make ask_user use native Telegram controls when one single-select question can be represented directly, while keeping multi-select and batch questions on the text fallback. Add native Other-to-ForceReply input, preserve Gateway-owned option ordering across Telegram, Slack, and Discord, and prevent later progress from overwriting the delivered question.

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-08-27 08:14:39 +05:30
Peter Steinberger e514840104 fix(slack): retain all multipart action send receipts (#130606)
Reuse the existing receipt aggregation owner for Slack action fanout and preserve every accepted message ID across media, presentation segments, and nested text chunks. Retain single-message shape, legacy scalar fields, thread placement, and question-card identity.

Fixes #130604
2026-08-26 19:42:16 -07:00
sunlit-deng 943400ea8c fix(codex): decode mixed-case file image URLs (#121611)
Preserve Node file URL conversion and prove both metadata fields through the real pinned Codex app server.
2026-08-26 19:39:59 -07:00
Peter Steinberger 7408f9672e refactor(msteams): simplify attachment size and redirect handling (#130595) 2026-08-26 19:37:00 -07:00
Peter Steinberger 7f05472938 feat(buzz): retain bounded passive context for accepted turns (#130509)
* feat(buzz): retain bounded passive context for accepted turns

Add opt-in connection-owned room and thread context using the shared history window. Preserve sender admission, current roster filtering, UTF-8 bounds, and snapshot consumption without passive inference, session recording, or typing. Related: #129599.

* docs(config): align baseline with landed Feishu sticker sets
2026-08-26 19:36:05 -07:00
Peter Steinberger 89d6ce457c refactor(models): build provider catalogs as complete batches (#130564)
* refactor(models): build provider catalogs as complete batches

* refactor(models): decorate owned catalog rows in place
2026-08-26 19:07:24 -07:00
Vincent Koc 6ae89b5a8e fix(imessage): preserve dunder reference links (#130547)
* fix(imessage): preserve dunder reference links

* docs(plugin-sdk): define dunder parser option
2026-08-27 09:53:50 +08:00
Peter Steinberger 67d22a58ac refactor(embeddings): unify provider contract (#130506)
* refactor(embeddings): unify provider contract

* test(plugins): declare embedding type bridge

* test(memory): migrate embedding fixtures
2026-08-26 18:20:48 -07:00
wahaha1223 43be187b67 fix(qa-lab): bound retained child output without changing verdicts (#108981)
Reuse the canonical settlement owner for boundary helpers, reject truncated verification JSON, and preserve complete live output streams.

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-26 18:15:45 -07:00
Peter Steinberger fc51e97e60 refactor(feishu): unify private tool registration setup (#130522) 2026-08-26 18:05:15 -07:00
Peter Steinberger de70b00d95 feat(buzz): bound bot-to-bot room conversations (#130488)
Use the shared per-Gateway bot-pair budget with the latest received signed room roles. Preserve existing sender and mention admission and human traffic. Release note: bound repeated Buzz bot exchanges without adding a channel-specific policy or persistent state.
2026-08-26 17:58:41 -07:00
Peter Steinberger 4c4c06aa35 fix: honor fresh provider catalog discovery (#130412)
* fix: honor fresh provider catalog discovery

* test: use compatible deferred catalog fixture
2026-08-26 17:57:31 -07:00
Peter Steinberger 98017ad71e fix(telegram): preserve complete rich message edits (#130526)
Keep one-message replacements whole through existing rich-to-plain recovery instead of selecting only the first send page. Preserve send pagination, preview clamping, and visible oversized-edit failures.

Fixes #130525
2026-08-26 17:55:29 -07:00
Peter Steinberger 42112dd86e fix(feishu): preserve commands in select fallback cards (#130515) 2026-08-26 17:41:40 -07:00
Peter Steinberger a0d6467948 feat(feishu): find received stickers by configured keywords (#130498)
* feat(feishu): search configured received stickers by keyword

Bind curated sticker sets to the selected bot app ID and reuse the existing sticker action gate and native sender. Enforce matching scalar bounds in runtime and generated config schemas, with bounded search output and explicit truncation. Completes the configurable-set request in #114578.

* refactor(feishu): keep sticker schemas with config owner

* build(feishu): regenerate catalog metadata after channel schema update
2026-08-26 17:37:05 -07:00
Marvinthebored ef0247bc3c fix(discord): a failing slash command leaves the user watching a spinner that never resolves (#128630)
* fix(discord): surface interaction handler failures instead of leaving a spinner

A command handler that threw after deferring left Discord showing a
spinner forever; the failure only reached the Gateway log.

Dispatch now reports a best-effort failure notice before rethrowing, but
only where a spinner is known to exist: responseState 'deferred' with no
follow-up already sent. 'deferred-update' is excluded because the
interaction's original response is the message a component is attached
to, and editing it would overwrite content the user is reading.
'unacknowledged' is excluded because a second initial callback risks
'already acknowledged' and Discord shows its own notice. 'replied' is
excluded because nextReplyAction() would turn the notice into a
contradictory follow-up.

The notice sets allowed_mentions.parse to empty so an exception message
containing @everyone cannot ping the channel.

* fix(discord): report a generic notice instead of the handler exception text

An interaction response is visible to the whole channel, and handler
exceptions routinely carry absolute paths, config keys, and provider
responses. Send fixed text and leave the detail in the Gateway log, which
also removes the mention-injection source rather than only escaping it.

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

* fix(discord): re-check follow-up delivery inside the response queue

hasSentFollowUp is only set once the follow-up REST call resolves, so a
follow-up still in flight when the handler throws left the reporter
deciding against state that was about to change. Move the guard into a
queued operation that re-reads both the response state and follow-up
delivery, so any in-flight follow-up settles and records itself first.

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

---------

Co-authored-by: Marvinthebored <peter@lindsey.jp>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-08-26 17:32:28 -07:00
Peter Steinberger 162e8d1394 refactor(plugins): derive private config types from schemas (#130414)
* refactor(plugins): derive private config types from schemas

* test(ci): make directory binding proof deterministic

Replace race-prone child-cwd polling with a synchronous fixture retarget after the real chdir, preserving the full worker and security assertions. Shrink the assertion-safety baseline for the three casts removed by the schema cleanup.
2026-08-26 17:21:24 -07:00
Peter Steinberger fed350dbc4 fix(browser): hidden selectors prematurely complete waits (#130508) 2026-08-26 17:14:51 -07:00
Ayaan Gazali 1f2e99832b fix(channels): bundled channels reject the documented responsePrefix override (#118148)
* fix(channels): bundled channels reject the documented responsePrefix override

* fix(feishu): pass channel and account to the reply prefix resolver

The ordinary reply dispatcher built the prefix context without channel or
accountId, so channels.feishu.responsePrefix and its account override fell
through to the global value. The comment dispatcher already passed them.

* fix(channels): accept twitch's root responsePrefix and type ClickClack's

Twitch validates as a two-branch union with both branches closed, so
responsePrefix declared only on the account shape left
channels.twitch.responsePrefix rejected whenever accounts is present. Also
declares responsePrefix on ClickClackAccountConfig so typed callers can express
what its schema already accepts.

* fix(clickclack): apply the configured responsePrefix in model mode

Model mode sends the completion straight to ClickClack instead of going through
the agent reply pipeline, so the documented responsePrefix parsed and then did
nothing. Resolve it through the public reply-pipeline seam so template
variables like {model} render from the completion's own provider and model.

* fix(clickclack): do not double the response prefix in model mode

systemPrompt is operator-owned, so a model can be instructed to emit the
configured prefix itself and the unconditional concatenation then sent it
twice. Match the shared reply normalizer's startsWith guard.

* test(clickclack): resolve inbound access through the real resolver

Main now requires access.channelIngress, which the hand-built fixture did not
provide, so the model-mode messages never dispatched. Drop the fixture and let
handleClickClackInbound resolve access from a DM-shaped message, matching the
sibling bot-loop tests.

* test(channels): reject a key missing from any composed branch

A union alternative is a configuration mode an operator can pick, so a key
present in only one mode is unusable in the other even though the union still
validates. Treat any rejecting alternative as a rejection, and walk allOf when
collecting account schemas.

* fix(channels): offer responsePrefix only where the reply path applies it

Applying the prefix to an outbound reply is per-channel wiring, not a shared
step. Buzz, Nostr, QA Channel, Raft, Reef and SMS never read it, so accepting
the key there validated a setting their delivery path ignores. Anchor the
contract to the channels that consume the prefix.

* fix(channels): complete shared response prefix delivery

Co-authored-by: ayaangazali <ayaangazali.work@gmail.com>

* docs(config): refresh response prefix baseline

* test(tlon): use canonical prefix fixture helpers

* test(channels): prove Twitch reply prefix delivery

Exercise schema admission and the real shared reply dispatcher at the Twitch native send boundary, replacing redundant schema-only coverage. Keep Tlon fixtures on canonical imports and recording options.

* docs(channels): clarify explicit message prefix behavior

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-26 17:08:28 -07:00
Peter Steinberger e9dc4b9d1a fix: Buzz bots recover relay stalls and reject revoked senders (#130467)
* fix(buzz): recover stalled sessions and revalidate room admission

* test: correct Buzz relay fixture types

Keep release notes in the PR body and leave the release-owned changelog unchanged.

* test: isolate Buzz relay mock exports

* test: clarify Buzz admission and output lifetimes
2026-08-26 16:47:58 -07:00
Peter Steinberger c385cdc8f1 fix(channels): preserve long presentation text (#130368)
* fix(channels): preserve long presentation text

Preserve complete authored titles, body text, and context through shared presentation limits and repeated normalization, including whitespace at split boundaries. Keep Discord and Feishu native rendering lossless and retain original content in Discord component-overflow fallback.

* test(channels): fix presentation regression CI gates

* fix(feishu): retain native presentation outbound hooks
2026-08-26 16:43:48 -07:00
Peter Steinberger 5153f25495 fix(memory): prevent forgotten session content from returning (#130451) 2026-08-26 16:26:00 -07:00
Peter Steinberger 395e5db41b chore(deps): refresh dependencies after seven-day cooldown (#130296)
* chore(deps): refresh cooled npm and plugin dependencies

* chore(deps): refresh cooled build and workflow tooling

* chore(deps): retain formatter compatibility

* chore(deps): retain lint compatibility
2026-08-26 16:13:18 -07:00
Peter Steinberger dcb20658fc fix(openshell): preserve file writes during concurrent mirror commands (#130447)
Lease complete mirror file operations through the workspace owner instead of locking only remote transport. Preserve successful writes across exec publication and share serialization across backend handles.

Proven with a real Docker red/green reproduction, 128-workflow mirror/remote stress matrix, exact inventories, failure recovery, 170 focused tests, and updated operator docs. Related: #127441; follow-up to #130031.
2026-08-26 15:59:31 -07:00
Peter Steinberger c120d093fc fix(ollama): keep local setup local and skip embedding chat defaults (#130459)
Share remote identity across discovery, node inference, and Local-only setup.
Keep affirmative embedding-only models out of inferred chat capabilities,
guided selection, and failed-download fallback while preserving advertised
metadata and existing unknown-capability chat fallback behavior.

Follow up on #130240 with reproduced regressions, 742 Ollama tests, isolated
real-daemon before/after proof, and source-blind public CLI validation.

Co-authored-by: Yigtwxx <yigiterdogan023@gmail.com>
2026-08-26 15:43:45 -07:00
Peter Steinberger d27b0e9620 fix(discord): remove late previews after transient delete failures (#130392)
* fix(discord): clean up late progress previews after queued turns

* fix(discord): unify preview cleanup ownership
2026-08-26 15:32:28 -07:00
Dallin Romney 39454997b4 fix(plugins): align diffs external install metadata (#130362) 2026-08-26 15:14:08 -07:00
Peter Steinberger 0e05d8205a fix(browser): accept common keyboard aliases (#130401)
* fix(browser): accept common keyboard aliases

* docs(browser): note keyboard alias repair
2026-08-26 15:12:37 -07:00
Dallin Romney 11ed401370 fix(qa): track current Slack progress cards (#130354) 2026-08-26 15:09:02 -07:00
Dallin Romney cf7b3a24ec fix(qa): run Buzz profile scenarios with pooled credentials (#130316)
* fix(qa): honor pooled Buzz credentials in profiles

* test(qa): guard optional Buzz cleanup

* fix(qa): delegate Buzz profile credential selection

* refactor(qa): simplify Buzz source handoff

* docs(qa): clarify Buzz credential delegation
2026-08-26 15:07:13 -07:00