Commit graph

65537 commits

Author SHA1 Message Date
Peter Steinberger
aca96d2dcf
ci: retry transient release workflow reads (#102896) 2026-07-09 15:34:02 +01:00
Sascha Kuhlmann
13821c9d34
Fix silent context-engine maintenance task delivery status (#102147)
* Fix silent context maintenance task delivery status

* refactor(context-engine): document maintenance delivery invariant

* fix(context-engine): preserve visible maintenance flows

* style(context-engine): format maintenance test import

* test(context-engine): use direct maintenance task lookup

---------

Co-authored-by: Sascha Kuhlmann <coolmanns@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-09 15:33:05 +01:00
Peter Steinberger
3ebcfb8ee3 perf(test): avoid deadline sleeps and broad tool imports 2026-07-09 10:32:21 -04:00
Ziyang Zhang
a1466b2400
fix(models): align model list truncation by terminal width (#102819)
* fix(models): align model list truncation by terminal width

* fix(models): sanitize formatter input before measuring width

* test(models): tighten terminal-width regressions

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-09 15:30:29 +01:00
Peter Steinberger
f8dbd34ab8
feat(nodes): add computer use (computer.act) on macOS nodes via Peekaboo (#102776)
* feat(nodes): add computer use (computer.act) on macOS nodes via Peekaboo

* fix(nodes): release held computer.act input on node disconnect/stop/disable

* fix(nodes): release held computer.act input armed after a lifecycle release

* fix(nodes): scope computer.act lifecycle catch-up release to the arming action

* chore(nodes): register computer tool display metadata, sync native i18n, doc-comment constants

* fix(nodes): preserve caught-error cause in computer tool resolver; regen docs map
2026-07-09 15:28:09 +01:00
Peter Steinberger
d9f8fc6322
feat(android): add system app language selection (#102876)
Co-authored-by: snowzlmbot <293528334+snowzlmbot@users.noreply.github.com>
2026-07-09 15:27:36 +01:00
ly-wang19
8a8038170b
fix(models): retain generated models with richer input metadata (#97858)
* fix(models): accept audio and video input modalities in models.json schema

* fix(models): constrain generated catalog runtime inputs

* fix(models): preserve projected input capabilities

* fix(models): exclude unsupported runtime-only inputs

---------

Co-authored-by: ly-wang19 <ly-wang19@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-09 15:26:15 +01:00
ToToKr
fe18ceda76
fix(gateway): keep command-list field clamping UTF-16 safe (#102816)
* fix(gateway): keep command-list field clamping UTF-16 safe

clampString truncated command names, descriptions, aliases, arg names/descriptions, and choice values/labels with a raw value.slice(0, maxLength). When an emoji (or other astral code point) straddles the clamp limit, the raw slice keeps a dangling high surrogate and emits a lone surrogate over the gateway commands.list protocol result. Route the clamp through the shared truncateUtf16Safe primitive so the boundary code point is dropped whole. Adds a regression test through buildCommandsListResult.

* test(gateway): fold UTF-16 clamp regression into bounds coverage

Co-authored-by: MoerAI <friendnt@g.skku.edu>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-09 15:25:59 +01:00
Peter Steinberger
772e0f7683
fix(ui): hide Workboard selects before positioning (#102867)
Co-authored-by: wm0018 <wu.min5@xydigit.com>
2026-07-09 15:25:01 +01:00
Masato Hoshino
34248e101f
fix(gateway): bound sessions.usage all-agent session discovery concurrency (#102013)
* fix(gateway): bound sessions.usage all-agent session discovery concurrency

* refactor(gateway): centralize usage agent tasks

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-09 15:23:56 +01:00
Peter Steinberger
2ff33f97eb
improve(webchat): model picker applies changes immediately, no Save/Discard row (#102871)
* feat(webchat): apply model picker changes immediately, drop Save/Discard row

* test(webchat): keep unavailable-default picker assertion

* fix(webchat): render picker check marks only on the selected row

* fix(webchat): lock reasoning and speed while a model switch is pending

* fix(webchat): guard immediate picker patches against stale rollbacks

* docs(webchat): note send gating invariant in picker commit path
2026-07-09 15:23:39 +01:00
Peter Steinberger
5ef269c2bb
fix: keep bounded Unicode text valid across UTF-16 boundaries (#102823)
* fix(text): keep bounded output UTF-16 safe

Co-authored-by: 黄剑雄0668001315 <huang.jianxiong@xydigit.com>
Co-authored-by: 0668000539 <shu.zongyu@xydigit.com>
Co-authored-by: 张鹊平0668001085 <zhang.queping@xydigit.com>
Co-authored-by: 赵旺0668001248 <zhao.wang1@xydigit.com>
Co-authored-by: 陈宪彪0668000387 <chen.xianbiao@xydigit.com>
Co-authored-by: lizeyu-xydt <li.zeyu@xydigit.com>

* chore(changelog): defer release note to automation

* refactor(qa-lab): keep text helper behind SDK

---------

Co-authored-by: 黄剑雄0668001315 <huang.jianxiong@xydigit.com>
Co-authored-by: 0668000539 <shu.zongyu@xydigit.com>
Co-authored-by: 张鹊平0668001085 <zhang.queping@xydigit.com>
Co-authored-by: 赵旺0668001248 <zhao.wang1@xydigit.com>
Co-authored-by: 陈宪彪0668000387 <chen.xianbiao@xydigit.com>
Co-authored-by: lizeyu-xydt <li.zeyu@xydigit.com>
2026-07-09 15:21:23 +01:00
Peter Steinberger
b8cdb93f6f
refactor(ui): simplify Lit state ownership (#102848)
Co-authored-by: Peter Steinberger <peter@steipete.me>
2026-07-09 07:15:19 -07:00
loong954
20646156a7
fix(lifecycle): keep install output truncation UTF-16 safe (#102833)
* fix(lifecycle): keep install output truncation UTF-16 safe

* test(lifecycle): exercise split surrogate boundary

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-09 15:14:49 +01:00
Peter Steinberger
70bb770e6b
feat(webchat): rare lobster pet variants incl. retro homage to the classic logo (#102829)
* feat(webchat): rare lobster pet variants modeled on real lobster genetics

Extends the sidebar pet's palette ladder with a rare tier: blue (7%),
calico with mottled spots (3%), deep-sea abyss with glowing eye glints
(2%), translucent ghost/albino (1%), and a bicolor split two-tone with
mismatched claws and antennae (1%). Weights loosely mirror real-world
odds (blue ~1 in 2M, calico ~1 in 30M, split ~1 in 50M, ghost ~1 in
100M). Offline mode still greys out every variant's glints. Drops the
unused --lob-dim inline variable.

* feat(webchat): retro grail variant honoring the classic OpenClaw logo

Adds a ~0.5% super-rare 'retro' lobster pet: classic logo red with a
white sticker-outline halo, one oversized raised claw with a pincer
notch (small left pincher stays), determined angled brows, a smirk, and
tall V antennae. The mega claw rides the .lob-claw--r group so wave and
snip acts swing it.
2026-07-09 15:14:11 +01:00
Peter Steinberger
b5ba0771f9
feat: carry gateway client capabilities through the CLI loopback backend (#102835)
* test: shorten loopback token fixtures below secret-scanner thresholds

* feat: carry gateway client capabilities through the CLI loopback backend

CLI-backed model runs now transport the originating client's declared
capabilities along the existing per-field loopback contract: RunCliAgentParams
gains clientCaps, prepare emits OPENCLAW_MCP_CLIENT_CAPS, the loopback header
template forwards x-openclaw-client-caps, the request context parses and
normalizes it (grant-authenticated callers keep ignoring spoofable headers),
and the loopback tool cache keys on a stable caps serialization so capless and
capped requests never share tool lists. Capability-gated tools such as
show_widget now work on CLI backends; the CLI session binding hash includes
caps, consistent with messageProvider. Cron and command-attempt runs stay
capless (fail closed).

Fixes #102577
2026-07-09 15:09:09 +01:00
LiLan0125
db0f6f09dc
fix(google): restore image tool results for prefixed Gemini 2 models (#102382)
* fix(google): handle prefixed Gemini 2 image fallback

* test(google): cover prefixed Gemini 3 image responses

* docs(changelog): note prefixed Gemini fallback

Co-authored-by: 李兰 0668001394 <li.lan3@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-09 15:09:05 +01:00
Raghav Sethi
19f42a27e5
feat(ios): redesign Control tab to a flatter, card-based layout (#98582)
* feat(ios): refresh Control tab layout

Co-authored-by: Raghav Sethi <rsraghavsethi@gmail.com>

* fix(ios): align Control card edges

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-09 15:08:07 +01:00
wings1029
4c55d46254
fix(imessage): keep CLI stderr tails UTF-16 safe (#102626)
* fix(imessage): keep CLI stderr tail truncation UTF-16 safe

* test(imessage): hit stderr surrogate boundary

* fix(imessage): use plugin sdk text helper

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-09 15:04:07 +01:00
Peter Steinberger
11dda0e5fd
ci: make release child dispatch idempotent (#102858) 2026-07-09 15:03:46 +01:00
Peter Steinberger
2f013382a0
feat(ui): add settings profile page with lifetime token stats, streaks, and activity heatmap (#102842)
* feat(ui): add settings profile i18n strings and regenerated locale bundles

* feat(ui): add settings profile page with token stats, streak heatmap, and top tools

* chore(ui): record intentional OpenClaw brand string in raw-copy baseline
2026-07-09 15:03:12 +01:00
wangyan2026
2e9e46bb37
fix(crestodian): keep prompt history UTF-16 safe (#102627)
* fix(crestodian): keep assistant prompt history truncation UTF-16 safe

* test(crestodian): simplify history boundary proof

* test(crestodian): add dangling-surrogate proof and raw-slice bug evidence

* test(crestodian): remove duplicate UTF-16 cases

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-09 15:01:34 +01:00
xingzhou
763ef215e0
fix(ui): keep event payload previews UTF-16 safe (#102625)
* fix(ui): keep event payload previews UTF-16 safe

* chore: use shared utf16 truncator in presenter

* fix(ui): use canonical utf16 truncator import

* refactor(ui): reuse canonical text truncation

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-09 15:01:17 +01:00
Pavan Kumar Gondhi
3ba72f624a
fix: trust hook mapping provenance (#102418) 2026-07-09 19:26:00 +05:30
Peter Steinberger
f9bafcc240
feat(ui): show agent avatars in the agents page selector (#102817)
Replace the native <select> on the Agents page with an accessible custom
listbox dropdown (openclaw-agent-select) that renders each agent's avatar
image, identity emoji, or initial. Local /avatar/<id> routes are fetched
with the bearer credential and rendered as cached blob URLs when gateway
token auth is active, matching the chat-avatar contract.

Refs #102792, #57067
2026-07-09 14:55:25 +01:00
NIO
2d5dd6c035
fix(googlechat): bound control and media requests (#102227)
* fix(googlechat): add 30 s request timeout to withGoogleChatResponse

* fix(googlechat): satisfy ResolvedGoogleChatAccount in api.test.ts

* fix(googlechat): bound control and media requests

Co-authored-by: NIO <nocodet@mail.com>

---------

Co-authored-by: NIO <nocodet@mail.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-09 14:49:14 +01:00
Peter Steinberger
47cc6c9667
fix(qqbot): propagate canonical image MIME types (#102795) 2026-07-09 14:48:11 +01:00
Peter Steinberger
2786239080 fix(ci): refresh native i18n sentinel 2026-07-09 09:45:36 -04:00
huangjianxiong
0e626690cd
fix(qa-matrix): keep shared reply previews UTF-16 safe (#102656)
* fix(qa-matrix): keep reply body preview truncation UTF-16 safe

Replace `.slice(0, 200)` with `truncateUtf16Safe(replyBody, 200)` in
buildMatrixReplyArtifact to prevent surrogate pair corruption.

Ref. lsr911 pattern — mechanical substitution, no behavior change.

* test(qa-matrix): preserve reply preview semantics

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-09 14:41:54 +01:00
Peter Steinberger
f6b9901243
fix(msteams): bound team group lookup cache (#102814)
Co-authored-by: sunlit-deng <yang.jiajun1@xydigit.com>
2026-07-09 14:31:45 +01:00
Ayaan Zaidi
474d660137 fix(infra): converge legacy state migrations on archive collisions 2026-07-09 18:57:58 +05:30
Peter Steinberger
25e18fc3b5 fix(ci): sync lobster pet raw-copy baseline 2026-07-09 09:21:08 -04:00
wuqxuan
3fd52514e3
fix: surface OpenAI chat-completions refusal as assistant text (#102344)
* fix: surface OpenAI chat-completions refusal as assistant text

* fix: cover message.refusal on packages/ai completions path
2026-07-09 06:10:03 -07:00
Vincent Koc
cb7468fc58
refactor(android): remove orphaned legacy screens (#102809) 2026-07-09 06:02:30 -07:00
Peter Steinberger
124119a898
test(plugins): sync release contracts (#102777)
* test(plugins): sync release contracts

* test(codex): isolate dynamic tool capability test
2026-07-09 13:57:35 +01:00
Peter Steinberger
fdd19e3017
feat(ui): merge the voice level meter into the stop-voice pill and disambiguate the stop controls (#102786)
* feat(ui): merge voice level meter into the stop-voice pill and disambiguate stop controls

* docs(web): describe the live voice pill control in Talk mode

* test(ui): capture dark-mode voice control proof in talk e2e

* fix(ui): keep the live voice pill wide at phone widths

* fix(ui): show the stop glyph instead of a fake listening meter when a talk session errors

* test(ui): assemble the mock talk client secret so scanners do not flag it
2026-07-09 13:55:56 +01:00
Peter Steinberger
9f2c357700 perf(test): scope registry and port fixtures 2026-07-09 08:53:35 -04:00
Alix-007
e5259fa8bb
fix(google): add timeout to Vertex ADC token refresh (#102050)
* fix(google): add timeout to Vertex ADC token refresh

* test(google): consolidate ADC timeout proof

* fix(google): bound all ADC token refreshes

* test(google): observe ADC timeout before advancing time

* fix(google): keep dependency timeout claims exact

* fix(google): bound library-managed ADC refreshes

* fix(google): recover after ADC refresh timeout

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-09 13:46:33 +01:00
Peter Steinberger
07a7d596ff
feat(providers): add Qwen 3.6 Flash and Gemini 3.1 Live (#102791)
* feat(providers): add current Qwen and Gemini Live models

* fix(google): align live thinking enum type

* fix(google): align live thinking enum type
2026-07-09 13:37:16 +01:00
Peter Steinberger
c8c1f37d2f
feat(cli): add roast taglines to startup banner (#102789) 2026-07-09 13:35:01 +01:00
Peter Steinberger
01f4596d5a
feat(webchat): sidebar lobster status pet (seeded per session) (#102766)
* feat(webchat): composer lobster mascot perches on the empty prompt

A decorative OpenClaw lobster (smooth icons.lobster style) sits on the
composer edge while the prompt is idle, ducks away on typing/runs, and
plays personality-weighted idle acts (scuttle, wave, snip, hop, spin,
peek, bubbles, nap with z's; poke to startle). Look and personality are
seeded per session + page load: palette, size, antennae, accessory,
perch, facing, temperament. Decorative contract: aria-hidden, no config,
reduced-motion stays fully static, timers pause on hidden tabs and clean
up on disconnect. Hidden on short-landscape viewports where the composer
scrolls.

Closes #102754

* refactor(webchat): move lobster mascot from composer to sidebar status pet

The composer perch read too close to Claude Code's input mascot. The pet
now lives on the sidebar footer ledge above the connection dot and
mirrors gateway state: idle personality acts when quiet, a faster scurry
pool while runs are active, grey-eyed worried pacing while disconnected,
and a startle on every status flip. Composer wiring reverted; element
renamed openclaw-lobster-pet; hidden in the collapsed rail.
2026-07-09 13:34:29 +01:00
Peter Steinberger
deb7faf7b0
refactor(ui): harden Lit lifecycle boundaries (#102745)
* refactor(ui): harden Lit lifecycle boundaries

* fix(ui): clear ChatPage subscriptions before teardown

* test(ui): satisfy lifecycle lint gates

* chore: defer Lit lifecycle release note

* fix(ui): sync raw-copy baseline

* test(ui): avoid order-sensitive Sessions mock

---------

Co-authored-by: Peter Steinberger <peter@steipete.me>
2026-07-09 05:28:52 -07:00
Peter Steinberger
e45e755fb9
feat(ui): add native link routing bridge (#102783) 2026-07-09 13:26:24 +01:00
Peter Steinberger
411bf2ad4b
test(android): cover discovery and startup gates (#102758)
* test(android): cover discovery and startup gates

Co-authored-by: NianJiuZst <180004567+users.noreply.github.com>

* test(android): keep startup gate tests keystore-free
2026-07-09 13:25:40 +01:00
Alix-007
64e80888d4
fix(qqbot): bound speech transcription requests (#102028)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-09 13:25:29 +01:00
Vincent Koc
0535679083
fix(release): validate exact prepared npm package sets (#102759)
* fix(release): validate prepared npm package sets

Forward-port the beta3 package-set preflight, Telegram, and Parallels validation to main while preserving main's existing Bun install smoke. Recompute decoded proxy response lengths and require artifact tarballs to exactly match the verified manifest.

* fix(release): lock fixture registry proxy origin
2026-07-09 05:19:24 -07:00
Vincent Koc
aaf5ddd832
refactor(ui): localize internal declarations (#102793) 2026-07-09 05:16:06 -07:00
lzyyzznl
f786efddcd
fix(cron): keep bounded diagnostics UTF-16 safe (#102624)
* fix(cron): use truncateUtf16Safe for diagnostic entry and summary truncation

* test(cron): cover UTF-16 diagnostic boundaries

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-09 13:05:51 +01:00
maweibin
5b2c316950
fix(auto-reply): keep fallback reason truncation UTF-16 safe (#102631)
* fix(auto-reply): keep fallback reason truncation UTF-16 safe

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

* test(auto-reply): cover UTF-16 fallback truncation

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-09 13:05:36 +01:00
Masato Hoshino
a49567cdfd
fix(qqbot): treat inbound attachment content types case-insensitively (#102753)
* fix(qqbot): treat inbound attachment content types case-insensitively

* test(qqbot): use distinct download paths per image; note voice sentinel in comment
2026-07-09 05:05:34 -07:00