Commit Graph

67697 Commits

Author SHA1 Message Date
Vincent Koc
084cf2a43d fix(ci): refresh deprecated plugin sdk budgets 2026-07-07 04:46:49 +02:00
Peter Steinberger
4fa8af486f perf(test): drop redundant benchmark cli spawn 2026-07-06 22:44:30 -04:00
Peter Steinberger
5df7942f70 fix(ci): refresh plugin sdk export budget 2026-07-06 22:44:30 -04:00
Peter Steinberger
0e3ce24cc8 fix(ui): resolve sidebar merge markers 2026-07-06 22:44:30 -04:00
Colin Johnson
632efa2d73 fix ios qr scanner lifecycle (#101235)
* fix ios qr scanner lifecycle

* fix(ios): tighten QR scanner lifecycle change

---------

Co-authored-by: joshavant <830519+joshavant@users.noreply.github.com>
2026-07-06 21:34:44 -05:00
Darren2030
ceb7a4adba fix(codex): project guardianWarning circuit-breaker notification (#101220)
* fix(codex): project guardianWarning circuit-breaker notification

Codex emits a `guardianWarning` notification from its rejection
circuit-breaker (e.g. 3 consecutive or 10 total denials in a turn)
right before ending the turn as interrupted. The app-server event
projector had no case for it, so the rejection-limit reason was
silently dropped and the turn degraded to a generic interruption.

Project it on the `codex_app_server.guardian` stream with phase
"warning", alongside the existing autoApprovalReview handling. The
exact v2 param shape is not bundled in OpenClaw's protocol schemas,
so the human-readable reason is read defensively.

Closes #101207

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

* fix(codex): route guardianWarning through thread-scoped filter

`guardianWarning` is thread-scoped — codex emits it with only
{message, threadId} (no turnId). The turn-strict pre-switch filter
therefore dropped it before it reached the projection switch, making
the handler added in the previous commit dead code for real traffic.

Correlate it on the thread alone (mirroring hook notifications) so it
reaches the switch, and read the `message` field per the codex schema.
The regression test now sends the real {threadId, message} shape
instead of a synthetic turnId, so it actually exercises the routing.

Refs #101207

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

* repro(codex): add real behavior proof for guardianWarning projection

* fix(codex): narrow guardian warning projection

Co-authored-by: 曾文锋0668000834 <zeng.wenfeng@xydigit.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-06 19:33:24 -07:00
Masato Hoshino
c0b6b846ac fix(acp): record cancelled background turns as cancelled, not succeeded (#101245)
* fix(acp): record cancelled background turns as cancelled, not succeeded

A cancelled parented ACP turn resolves without throwing (only failed turns
throw), so the turn-runner success path recorded the detached task as
succeeded. Thread the terminal status out of consumeAcpTurnStream and branch
at the runner; widen markBackgroundTaskTerminal to accept cancelled, routed
through the existing failTaskRunByRunId sink. The runTurn fallback infers
cancellation from done.stopReason, mirroring the acpx adapter.

* fix(acp): narrow cancelled task status handling

Co-authored-by: masatohoshino <g515hoshino@gmail.com>

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-06 19:32:40 -07:00
Peter Steinberger
6a5726b808 feat(control-ui): drag sessions into split view with animated drop preview (#101191)
* feat(control-ui): drag sessions into split view with animated drop preview

* fix(i18n): translate split drop labels and pending upstream strings
2026-07-07 03:30:46 +01:00
Peter Steinberger
6273e82ca5 fix(lint): drop unused TRANSCRIPT_NOT_CONTINUABLE_ERROR_CODE import in model-fallback test 2026-07-06 19:29:35 -07:00
Peter Steinberger
1a307be2e0 feat(skills): add lifecycle curator for workshop-created skills (#101214)
Tracks per-skill usage from the skill.used diagnostic event (trusted-only
delivery, file-scoped identity), sweeps workshop-created skills daily from
gateway maintenance (active -> stale 30d -> archived 90d, pinned bypass,
restore-only unarchive, files never touched), filters archived skills from
snapshots fail-open, reports workspace-scoped overlap candidates, and adds
openclaw skills curator CLI, additive gateway methods, and a warn-only
doctor finding. Zero new config keys; SQLite/Kysely state only.
2026-07-07 03:25:44 +01:00
Peter Steinberger
b2cecd8ece feat(android): hide thinking control and gate sends for models without reasoning support (#101002) 2026-07-07 03:23:08 +01:00
Jvle
f309c6054b fix(ui): preserve chat scroll when copying code (#100807)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-07 03:22:14 +01:00
Vincent Koc
143751282c fix(agents): honor long lane timeouts 2026-07-07 04:17:46 +02:00
Masato Hoshino
6522dbf66b fix(imessage): handle stdout/stderr stream errors in the RPC client child (#101084)
* fix(imessage): handle stdout/stderr stream errors in the RPC client child

A dead imsg RPC helper can emit an async error on any of its stdio streams.
On a raw stream an unhandled 'error' event throws and surfaces as an
uncaughtException, crashing the gateway. #75438 added this guard for stdin
but left stdout/stderr — on the same long-lived child — unguarded.

Route stdout/stderr stream errors through the existing failAll path via a
shared failFromStreamError helper, mirroring the stdin handler. Add a
regression test that emits 'error' on each stream and asserts the child does
not throw and in-flight requests reject cleanly.

* fix(imessage): terminate failed RPC transports

* test(imessage): exercise real stream failure

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-07 03:15:27 +01:00
Sanjay Santhanam
00a8dae28b fix(agent-model): omit synthesized maxTokens fallback when nothing was configured (#98312)
* fix(agent-model): omit synthesized maxTokens fallback (Fixes #98295)

The configured-fallback resolver used DEFAULT_CONTEXT_TOKENS (200_000) as
the last-resort value for model.maxTokens when no configured, provider,
or bundled-catalog value was known. For strict OpenAI-compatible providers,
model.maxTokens is forwarded as max_completion_tokens on every request,
so the synthesized 200k value became a wire-level output cap that exceeded
the provider ceiling and produced HTTP 400 (Param Incorrect) on providers
like Xiaomi MiMo (131_072 max) — reported for mimo-v2.5 / mimo-v2.5-pro
added via 'models add' on a custom provider entry.

The sibling applyConfiguredProviderOverrides path already omits maxTokens
when nothing resolves; align resolveConfiguredFallbackModel with that
behavior. When the transport sees an undefined model.maxTokens, it omits
max_completion_tokens entirely and the provider applies its own default,
which is the correct behavior when the user has configured no output limit.

contextWindow retains DEFAULT_CONTEXT_TOKENS as its local budgeting
fallback (it is not shipped on the wire).

* test(agents): prove unknown output cap omission

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-07 03:15:03 +01:00
Ayaan Zaidi
486033b183 fix(agents): normalize compaction recovery tails
Compaction failure and timeout recovery can no longer leave a session transcript assistant-last and wedged after restoring pre-compaction state.

Transcript-continuation failures now carry a typed agent-core error code and no longer demote the active model through model fallback scoring.

Surface: embedded agent runner compaction recovery, model fallback classification, packages/agent-core.

Refs #100312. Includes regression coverage for #99943.
2026-07-07 02:09:21 +00:00
Ayaan Zaidi
b1da734a1e fix(logging): recover orphaned stalled lanes
Stalled sessions could leave a session lane occupied by an orphaned active task after the embedded run handle was gone. Diagnostics repeatedly reported the stuck state, but the lane stayed held and queued turns could remain blocked indefinitely.

Release ownerless active lane tasks after the stale threshold, while guarding against fresh lane work and raised compaction safety windows so recovery does not double-run serialized session work or overlap transcript compaction. Stalled model-call recovery also no longer requires an in-process embedded run handle, so no-handle stalls can be reclaimed by the existing conservative recovery path.

Refs #99847.

Refs #94650.
2026-07-07 02:07:45 +00:00
Ayaan Zaidi
ec289357a4 fix(agents): keep embedded lane watchdog bounded
Wedged model calls could hold an agent session lane for the normalized max timer duration when the user disabled the run timeout. In production that path resolves to MAX_TIMER_TIMEOUT_MS, so a zero-progress model call could block sibling work for about 24.8 days instead of failing through the normal terminal outcome path.

Cap the lane watchdog at the default agent deadline plus the existing grace window while preserving explicit shorter run timeouts. The disabled/max-timeout case now releases the lane at the default 48h deadline instead of inheriting the timer sentinel.

Refs #97588.

Refs #94650.
2026-07-07 02:07:45 +00:00
qingminlong
d6f097b3de fix(agents): normalize surrogate cache fingerprints (#101009)
* fix(agents): normalize surrogate cache fingerprints

* fix(agents): reuse provider surrogate sanitizer

* chore(agents): keep transport imports grouped

* fix(agents): avoid runtime import for surrogate sanitizer

* fix(agents): scope surrogate cache normalization

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-07 03:06:56 +01:00
ZOOWH
63d71f4ab1 fix(chat.abort): pass stored sessionId to match active embedded runs (#101222)
* fix(chat.abort): pass stored sessionId to match active embedded runs

The chat.abort RPC path was missing sessionId in the abort resolver
call, unlike the /stop path which passes entry?.sessionId. This meant
resolveAuthorizedRunsForSessionKeys could not match active runs
registered by sessionId, causing chat.abort to report aborted:false
while the tool subprocess continued running.

Fix: load the session entry in the chat.abort handler and pass
entry?.sessionId to abortChatRunsForSessionKeyWithPartials, giving
it the same match dimension that /stop already uses.

* test(gateway): tighten chat abort session matching proof

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-07 03:05:39 +01:00
Peter Steinberger
0d981095d4 refactor(codex): store app-server thread bindings in SQLite plugin state (#101210)
* test(codex): shorten placeholder auth fixture strings

* feat(plugin-state): add reject-new overflow policy for keyed namespaces

* feat(agents): thread agent identity and session generation through reset and hooks

* refactor(codex): add SQLite-backed app-server thread binding store

* refactor(codex): move app-server runtime callers onto the binding store

* refactor(codex): move conversation, entry, and thread-tool flows onto the binding store

* refactor(codex): move command handlers onto the binding store

* feat(codex): import legacy binding sidecars via doctor state migration

* fix(codex): keep doctor sidecar scan inside stateDir

* fix(codex): make binding migration landable

* chore(changelog): defer release note

* test(plugin-state): stabilize durable-capacity ordering
2026-07-07 03:03:44 +01:00
ianchen08
a27e3f3a99 fix(auto-reply): stop treating wait as abort trigger (#98639)
* fix(auto-reply): stop treating wait as abort trigger

* test(channels): treat wait as debounced text

* docs: remove wait from abort phrases

---------

Co-authored-by: Ian Chen <ianchen@IandeMBP.home>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-07 03:03:23 +01:00
Anderson J. Eccel
87a9e27025 retry whatsapp session init conflicts (#101106) 2026-07-06 23:03:10 -03:00
Peter Steinberger
f3106057e6 perf(test): batch install PowerShell cases 2026-07-06 21:47:22 -04:00
Vincent Koc
7bbe75089a test(android): isolate gateway bootstrap prefs 2026-07-07 03:35:58 +02:00
Dallin Romney
253b784468 test(qa): use qa flow for channel routing scenarios (#101076)
* test(qa): canonicalize channel routing scenarios

* test(qa): enforce Crabline actor allowlists

* test(qa): preserve canonical flow integration

* test(matrix): use retained topology fixture id

* test(qa): preserve WhatsApp live defaults

* QA: declare channel transport policy in scenarios

* refactor(qa): keep transport policy type local

* refactor(qa): keep transport policy on leaf contract

* test(matrix): use retained routing fixture
2026-07-06 18:35:41 -07:00
Alba María Téllez Fernández
349d3547cc fix(security): align browser audit with plugin policy (#97732)
* fix(security): respect plugin policy in browser audit summary

* fix(security): reuse browser plugin activation policy

Co-authored-by: Alba María Téllez Fernández <amtellezfernandez@gmail.com>

* fix(security): keep browser config behind plugin policy

Co-authored-by: Alba María Téllez Fernández <amtellezfernandez@gmail.com>

* chore(security): keep release notes in PR body

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-07 02:27:05 +01:00
Colin Johnson
82106a18b3 fix(android): stabilize recent sessions overview (#101161) 2026-07-06 21:20:06 -04:00
Josh Lehman
cb0d8a1294 refactor(sessions): move inbound meta, goals, and delivery reads behind the session accessor (#101180) 2026-07-06 18:07:26 -07:00
Peter Steinberger
bb658d0a6d feat(macos): redesign chat window as native shell with sessions sidebar, toolbar pickers, slash commands, and context usage (#101103)
* feat(chat-ui): native macOS chat window shell with sessions sidebar, context usage, and slash commands

* feat(macos): host redesigned chat window shell and complete gateway chat transport

* fix(chat-ui): gate slash panel on catalog support and register window shell shortcuts outside menus

* fix(chat-ui): make sidebar selection tags optional and sync programmatic composer text into the focused NSTextView

* fix(macos): track in-window session switches for chat window reuse

* fix(chat-ui): re-bootstrap in place when deleting the active main session

* docs(macos): describe the redesigned native chat window

* fix(macos): scope bare global session RPCs to the routing default agent

* style(chat-ui): restore blank line between rebased helpers

* fix(macos): scope selected global session actions

* fix(macos): refresh chat routing identity

* fix(chat-ui): hide delete for main sessions

* fix(macos): remove duplicate session patch path

* fix(chat-ui): resolve sidebar session aliases

* fix(chat-ui): isolate sidebar alias resolution

* fix(chat-ui): reconcile active session aliases

* fix(chat-ui): prefer selected session aliases

* chore(i18n): refresh chat window inventory

* fix(chat-ui): return sidebar filter result

* refactor(chat-ui): split session actions
2026-07-07 02:06:10 +01:00
Josh Lehman
4e2a80cac3 refactor(sessions): route new session store bypasses through the accessor (#101179) 2026-07-06 18:05:18 -07:00
Gio Della-Libera
97777a7026 policy: repair channel ingress findings (#99720)
* policy: repair channel ingress findings

* policy: skip scoped inherited ingress repairs

* fix(policy): keep doctor lint findings generic

---------

Co-authored-by: Gio Della-Libera <giodl@microsoft.com>
2026-07-06 18:03:40 -07:00
WhatsSkiLL
4b3941c7f2 fix(android): tune screenshot mode visual sizing (#100895)
* fix(android): tune screenshot mode visual sizing

* chore(android): refresh screenshot i18n inventory

* refactor(android): simplify screenshot mode sizing

---------

Co-authored-by: IWhatsskill <284122573+IWhatsskill@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-07 02:01:02 +01:00
Vincent Koc
775ef966c3 refactor(deadcode): localize internal type aliases (#101243) 2026-07-06 17:57:32 -07:00
kenners22
ffa6ebda4c fix(cli): protect protocol stdout during startup (#89997)
* fix(cli): suppress mcp serve startup stdout

* fix(cli): suppress mcp serve startup stdout

* fix(cli): protect protocol stdout during startup

* fix(cli): match ACP protocol options at startup

* fix(cli): derive protocol ownership from command action

---------

Co-authored-by: JARVIS <kenners22@users.noreply.github.com>
Co-authored-by: openclaw-clownfish[bot] <280122609+openclaw-clownfish[bot]@users.noreply.github.com>
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
Co-authored-by: Vincent Koc <25068+vincentkoc@users.noreply.github.com>
2026-07-06 17:55:50 -07:00
Dallin Romney
c1b9e36221 test(qa): migrate channel thread and DM isolation scenarios (#101112)
* test(qa): migrate channel thread isolation scenarios

* test(qa): remove stale Matrix scenario fixture

* test(qa): use canonical coverage taxonomy ids

* test(qa): preserve Matrix flow runtime identities

* test(qa): expose Slack thread polling helper

* test(qa): select Matrix for native thread smoke

* test(qa): keep Matrix subagent spawn opt-in

* test(qa): target selected live account in scenario patches
2026-07-06 17:52:38 -07:00
Peter Steinberger
2b6eb31999 chore(ci): refresh generated baselines (#101242) 2026-07-07 01:47:44 +01:00
Vincent Koc
0e8870da76 fix(ci): refresh Mythos plugin SDK export budget 2026-07-06 17:43:24 -07:00
Vincent Koc
74bb2ad7a5 fix(package): reuse bundled artifact for install smoke 2026-07-07 02:31:09 +02:00
Vincent Koc
9d86728795 refactor(ui): localize internal type exports (#101165) 2026-07-06 17:28:31 -07:00
huangjianxiong
c3c4d03f90 fix(browser): bound response text decoding (#98940)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-07 01:25:49 +01:00
Peter Steinberger
f95ca90378 fix(ios): persist voice notes through offline delivery (#101236)
* fix(ios): persist voice note delivery state

* fix(ios): pin chats during attachment staging

* fix(ios): keep voice notes on captured chat

* fix(ios): keep voice notes durable through staging

* fix(ios): harden voice note lifecycle

* test(ios): satisfy strict concurrency in voice note proof

* fix(ios): keep legacy attachment sends live

* fix(ios): retain legacy drafts during outbox restore

* fix(ios): pin voice note recipient presentation

* fix(ios): preserve confirmed voice note duration

* chore(i18n): refresh voice note source inventory

* chore: leave release notes to release automation
2026-07-07 01:21:16 +01:00
Vincent Koc
f305e707a3 feat(models): add Claude Mythos 5 support (#101238) 2026-07-06 17:19:49 -07:00
cxbAsDev
090c3a26d0 fix(msteams): bound Graph attachment JSON responses (#101082)
* fix(extensions/msteams): bound Graph collection JSON response read to prevent OOM

* fix(msteams): bound Graph message JSON reads

* test(msteams): exercise Graph overflow response

* refactor(msteams): stream Graph hosted content

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-07 01:18:09 +01:00
WhatsSkiLL
bce414d8b8 improve(android): align command palette row affordances (#101072)
* android: tidy command palette row affordances

* docs(android): credit command palette polish

---------

Co-authored-by: IWhatsskill <284122573+IWhatsskill@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-07 01:14:46 +01:00
Peter Steinberger
4c97aa1311 feat(mobile): rename, delete, and create session groups on iOS and Android (#101234)
* feat(mobile): rename, delete, and create sidebar session groups on iOS and Android

Group section headers on the iOS Command Center sessions screen and the
Android sessions screen gain Rename/New/Delete group actions. Bulk ops
enumerate every member (active + archived, explicit high list limit since
the gateway caps an absent limit at 100 rows) and patch category per
session; delete keeps sessions and moves them to Ungrouped. Known custom
groups persist client-side (iOS UserDefaults, Android SharedPreferences)
so empty groups stay visible as move targets.

* chore(i18n): refresh native string inventory after rebase onto main
2026-07-07 01:09:57 +01:00
Peter Steinberger
aed2482292 fix(qa): restore automatic smoke coverage across channels (#101186)
* fix(qa): restore channel-sharded smoke coverage

Co-authored-by: Peter Steinberger <steipete@gmail.com>

Co-authored-by: Dallin Romney <dallinromney@gmail.com>

* fix(qa): restore channel-sharded smoke coverage

* fix(qa): restore channel-sharded smoke coverage

* fix(qa): restore channel-sharded smoke coverage

---------

Co-authored-by: Vincent Koc <25068+vincentkoc@users.noreply.github.com>
Co-authored-by: Dallin Romney <dallinromney@gmail.com>
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-06 17:09:40 -07:00
Vincent Koc
736c6743c1 chore(i18n): refresh native inventory line anchors (#101233) 2026-07-06 17:06:27 -07:00
Peter Steinberger
2b3a985b11 chore(i18n): refresh native source inventory (#101232) 2026-07-07 00:58:03 +01:00
Peter Steinberger
5157446a2c feat(ui): rename, delete, and toggle sidebar session groups (#101117)
* feat(ui): rename, delete, and toggle sidebar session groups

Sidebar group headers gain a kebab + right-click menu with Rename group,
New group, and Delete group. Rename/delete enumerate every member session
(active + archived, across agents) via unbounded sessions.list queries and
patch category per session; delete keeps sessions and moves them to
Ungrouped. Stored-but-empty groups render as sections, and the sidebar
sort popover gains a persisted Group by toggle (Custom groups / None).

* test(ui): capture sidebar group management UI proof shots

* fix(ui): page session-group enumeration past the gateway's 100-row default

sessions.list caps an absent limit at SESSIONS_LIST_DEFAULT_LIMIT (100), so
the rename/delete member enumeration now walks nextOffset pages explicitly;
a silent cap would strand members in the old group on stores >100 sessions.

* chore(i18n): restore fallback-key tracking for new sidebar group strings after rebase

* chore(i18n): translate new sidebar group strings across locales
2026-07-07 00:54:36 +01:00