Commit graph

65548 commits

Author SHA1 Message Date
Peter Steinberger
4bf348bec8
test(ui): isolate chat pane custom-element registration (#102869)
* test(ui): isolate chat pane registration

* test(ui): document shared registry invariant

* test(ui): isolate chat page environment
2026-07-09 15:54:03 +01:00
Peter Steinberger
54f45a950b
feat(watchos): connect directly to Gateway as a node (#102893)
* feat(watchos): add direct gateway node

* docs: refresh watch node docs map

* chore: leave release notes to release workflow

* chore(ios): refresh native localization inventory

* fix(watchos): keep direct node policy bounded
2026-07-09 15:53:02 +01:00
Peter Steinberger
b80062be3a
improve(ui): drop the redundant desktop top bar and add back/forward navigation to the macOS app (#102808)
* feat(ui): drop the desktop top bar in favor of sidebar navigation

The Control UI top bar only rendered the OpenClaw › agent › page breadcrumb
on desktop, duplicating the sidebar. Desktop now renders no topbar row; the
row returns solely as the chat split toolbar's backdrop. Narrow viewports
keep the header (drawer toggle, brand, command-palette search) and now show
the brand across the whole drawer range. Routing already uses pushState, so
browser back/forward traverses navigation.

* feat(macos): add back/forward controls to the dashboard window

Native titlebar buttons next to the traffic lights drive WKWebView history,
which carries the Control UI's pushState navigation; enabled state tracks
canGoBack/canGoForward via KVO and trackpad swipe gestures are enabled too.
Back/forward traversals to entries from a replaced gateway endpoint cancel
silently instead of opening a dead URL in the system browser.

* fix(macos): keep the dashboard drag strip off the web content column

With the desktop topbar row removed, the 28px mid-window drag region sat on
top of the content column (chat thread has no top padding) and swallowed
clicks as window drags. Shrink it to a 12px edge strip; the sidebar region
over the reserved native-chrome padding stays the primary drag surface.
2026-07-09 15:46:59 +01:00
Peter Steinberger
29517fe178
fix(gateway): merge MCP schema properties by own keys (#102856)
Co-authored-by: Alix-007 <li.long15@xydigit.com>
2026-07-09 15:46:41 +01:00
Peter Steinberger
aaf5af2fbc
fix(agents): clamp zero bash job TTLs (#102855)
Co-authored-by: 0668000787 <ma.weibin@xydigit.com>
2026-07-09 15:43:59 +01:00
Peter Steinberger
79d3daa09b
fix(gateway): parse image data URLs linearly (#102825)
Co-authored-by: WangYan <wang.yan29@xydigit.com>
2026-07-09 15:42:07 +01:00
Peter Steinberger
8985598302
fix(gateway): stop paired-device duplication and redesign the Nodes page (#102810)
* fix(gateway): prune superseded silent device pairings on auto-approve

* feat(ui): unified nodes & devices inventory with dedupe and cleanup

* docs: nodes page inventory + silent pairing supersede cleanup

* refactor(gateway): run silent-pairing prune after approval broadcast

* fix(ui): surface node list errors on the nodes inventory card

* fix(gateway): restrict pairing auto-prune to same-host silent approvals

* fix(gateway): report live device connections and guard pairing prune races

* docs(ui): document bulk-cleanup name-collision tradeoff

* fix(gateway): avoid map-spread when marking live device connections

* docs: regenerate docs map
2026-07-09 15:40:30 +01:00
Peter Steinberger
743422217e
fix(qa): normalize malformed JSON errors (#102830)
Co-authored-by: ZengWen-DT <ceng.wen@xydigit.com>
2026-07-09 15:40:27 +01:00
Peter Steinberger
3e492e0146
test(ui): scope default agent selector (#102902) 2026-07-09 15:39:59 +01:00
Peter Steinberger
428c68a3c7
feat: show provider plan usage (5h/weekly/credits) in the chat context popover, keep API cost for API billing (#102784)
* feat(usage): route claude-cli to Anthropic plan usage with plan label and billing

* feat(webchat): redesign context popover with plan-usage bars and API-cost gating

* fix(usage): match plan usage across CLI provider aliases and source plan label from synced auth profile

* docs(plugins): document plan metadata on usage auth token

* chore(usage): document provider-level billing attribution limits, fix overview test types

* fix(webchat): avoid map-spread in quota group collection

* test(webchat): deflake subscription popover reset fixture
2026-07-09 15:36:13 +01:00
Martin Kessler
2587bd54f1
fix(media): trust known CLI transcript files (#87393)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-09 15:35:38 +01:00
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