Commit Graph

111 Commits

Author SHA1 Message Date
Peter Steinberger
0074005682 feat(ui): add Model Providers settings page with auth, quota, and cost per provider (#104061) 2026-07-10 19:31:41 -07:00
Peter Steinberger
0ca8237905 fix(ui): keep raw ids out of sidebar session rows and stop WebKit section overlap (#104062) 2026-07-10 19:14:51 -07:00
Peter Steinberger
62d10f7b84 improve(ui): drag sidebar group headers to reorder custom groups (#103997)
* improve(ui): drag sidebar group headers to reorder custom groups

* test(ui): repair sidebar group e2e for the gateway-owned catalog
2026-07-11 01:39:47 +01:00
Peter Steinberger
6d39ec5152 feat(ui): collapse session PR chips and add a CI monitoring popover (#103853)
* feat(ui): collapse session PR chips and add a CI monitoring popover

* chore(i18n): translate session PR chip strings

* docs(gateway): note Control UI contract shapes ship in lockstep

* chore(i18n): regenerate locale bundles after rebase
2026-07-11 00:37:06 +01:00
Peter Steinberger
188535b097 fix(ui): queue chat input while reconnecting (#102781)
* fix(ui): queue chat input while reconnecting

* test(ui): strengthen offline reconnect proof

* chore: follow release-only changelog policy

* fix(ui): harden offline queue replay

* fix(ui): harden offline replay recovery
2026-07-10 18:37:46 +01:00
Peter Steinberger
5aea34ad8c fix(webui): keep tool activity paired without model calls (#103821)
* fix(webui): make tool activity rendering deterministic

* fix(protocol): remove stale tool-title models

* fix(i18n): translate tool activity labels

* fix(i18n): translate tool activity labels
2026-07-10 18:21:08 +01:00
Peter Steinberger
fc2afc83da feat(webui): redesign tool-call rendering with inline diffs, group summaries, and cheap-model purpose titles (#103748)
Kind-aware tool rows (terminal-style commands with wrapper stripping and
display highlighting, file edits with inline numbered diffs and diffstat,
write previews, key-value args), aggregate group summaries with live run
status, and a new batched chat.toolTitles gateway RPC that titles complex
calls via the configured utilityModel or the OpenAI Luna default (gated to
OpenAI-primary agents, cached in the per-agent SQLite cache_entries).

Also fixes two transcript pairing bugs: result blocks now inherit call
id/name/details at merge time, and results pair with any open call in the
current tool run so parallel calls render as single rows.

Fixes #103554
2026-07-10 17:26:22 +01:00
Peter Steinberger
2d54be31ba feat(ui): detect session pull requests and pin status chips above the chat composer (#103600) 2026-07-10 16:23:28 +01:00
JC
59e95fe3fd feat: support GPT-5.6 Ultra across OpenClaw and Codex runtimes (#98021)
* feat: support GPT-5.6 Ultra across agent runtimes

Co-authored-by: J Cai <anyech@gmail.com>

* fix: keep harness projections discovery-free

* fix(codex): mirror V2 native subagent tasks

* chore: refresh plugin SDK surface budgets

* test: expose Ultra wire effort proof

* test(cron): avoid hoisted mock initialization race

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-10 15:23:24 +01:00
Peter Steinberger
965396921a fix(ui): avoid Zod eval under strict CSP (#103665) 2026-07-10 12:48:33 +01:00
Peter Steinberger
80a1778363 fix(ui): preserve lobster vigil outcomes (#103483) 2026-07-10 12:32:59 +01:00
Peter Steinberger
bacc75a358 fix(ui): stop session shortcuts after panel collapse (#103514)
* fix(ui): stop hidden session menu shortcuts

* fix(ui): adapt hidden menu dismissal to restored sidebar
2026-07-10 11:14:41 +01:00
Peter Steinberger
0bf2c7aedb test(ui): cover session drops on pane headers (#103525)
* fix(ui): accept session drops on split headers

* test(ui): cover session drops on pane headers
2026-07-10 11:04:06 +01:00
Peter Steinberger
d6c7dbc3aa fix(ui): restore sidebar pin editor keyboard controls (#103612)
* fix(ui): restore sidebar menu keyboard controls

* test(ui): cover About in settings search E2E

* chore: leave release notes to release closeout
2026-07-10 11:03:19 +01:00
Peter Steinberger
7fe004d852 feat: show build identity in About screens (#103595)
* feat: show build identity in About screens

* chore: leave root changelog to release automation

* fix: translate Control UI About build details
2026-07-10 10:42:36 +01:00
Peter Steinberger
9ecb2f3a84 feat(ui): restore sidebar chrome, delete the pane workspace strip, compact native narrow header (#103561)
* feat(ui): restore sidebar chrome and remove the pane workspace strip

Reverse course from #103426 on the app chrome: the left sidebar owns
brand, pinned navigation + More, New session, sessions, and the footer
(status dot, Settings, Docs, pairing, theme) again, and the desktop
topbar is gone. What stays from that PR: the dockable workspace rail
(right/bottom, drag or button), the in-flow split-pane headers, and
Cmd+B now hides the sidebar entirely (no 78px icon rail) with a
floating expand control.

The real target of the original request: the vertical icon strip at
each pane's right edge is deleted. A collapsed workspace rail renders
nothing; the toggle (with a changed-file badge) lives in the split-pane
header next to split/close, or floats at the top-right in single-pane
chat. Shift+Cmd+B still toggles.

Narrow native macOS windows (e.g. the in-app link browser splitting
the window) previously stacked 50px of injected titlebar padding on
top of the 58px drawer row; the web CSS now folds that into one
compact 58px row beside the traffic lights, with selectors that
outrank the rules shipped Mac apps inject.

* chore(ui): regenerate locale bundles and docs map for sidebar restore

* fix(ui): bind showPaneHeader explicitly on the classic single pane

* chore(ui): reconcile locale metadata after rebase onto lobster wild cards
2026-07-10 09:35:14 +01:00
Peter Steinberger
66bcfeac6b fix(ui): dismiss stale topbar menus and restore focus (#103508) 2026-07-10 08:33:14 +01:00
Peter Steinberger
51c1c08227 fix(ui): preserve desktop lobster run outcomes (#103501) 2026-07-10 08:18:54 +01:00
Peter Steinberger
5476930568 improve(ui): mark the default model inline (#103484)
* improve(ui): mark the default model inline

* chore: leave changelog to release workflow

---------

Co-authored-by: Peter Steinberger <peter@steipete.me>
2026-07-09 23:54:43 -07:00
Peter Steinberger
4a72a6cb2f feat(ui): move app chrome into a topbar and dock the session workspace rail (#103426)
* feat(ui): move app chrome into a topbar and dock the session workspace rail

The desktop shell now uses a slim topbar for brand, primary navigation
(Chat + pinned routes + More menu), command-palette search, pairing,
theme, and Settings; the left column slims down to a sessions-only
panel (Cmd+B hides it entirely — the 78px icon rail is gone). Split
view drops the fixed geometry-mirroring toolbar for in-flow per-pane
headers. The session workspace rail can dock right or bottom inside
its pane — drag its header between edges or use the dock button — and
the collapsed strip's file glyph is now a real button (it used to be a
dead, button-looking span) with a changed-file count badge. The Mac
app's injected chrome CSS slims down accordingly; its drag-region
geometry is unchanged and the topbar brand strip stays passive under
it.

* chore(ui): regenerate locale bundles for topbar and workspace dock strings

* fix(ui): keep the native macOS drawer clear of the titlebar overlay

The narrow-width slide-over drawer sits fixed at the window top, over
the AppKit traffic lights and drag regions. The old Mac-app-injected
CSS padded .sidebar-shell for this; that rule moved web-side for the
desktop topbar, so restore drawer clearance here for both the app
drawer and the in-drawer settings sidebar.

* chore(ui): translate topbar and workspace dock strings; regen docs map
2026-07-10 07:32:57 +01:00
maweibin
f15f2d1092 fix(ui): normalize Unicode line/paragraph separators in markdown rendering (#102169)
* fix(ui): normalize Unicode line/paragraph separators in markdown

LLM outputs can contain U+2028/U+2029 chars that split() ignores,
causing content to render as one unbroken line in the chat UI.

Define LINE_SEP_RE using String.fromCodePoint() and apply it
alongside existing \r\n normalization in all five markdown
processing entry points. Mirrors normalizeDisplayLineBreaks()
in exec-approval-command-display.

* fix(ui): normalize markdown line breaks once

---------

Co-authored-by: Peter Steinberger <peter@steipete.me>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-10 06:38:07 +01:00
Peter Steinberger
67ff8dfc15 fix(ui): apply selected reasoning and speed before sending (#103253)
* fix(ui): gate sends on pending session settings

* chore(ui): keep changelog release-owned
2026-07-10 03:14:23 +01:00
Peter Steinberger
f12a92d3ca fix(ui): settle canonical session refreshes in lifecycle E2Es (#103224)
* test(ui): settle canonical session refreshes

* test(ui): isolate stale session event assertions
2026-07-10 02:34:15 +01:00
maweibin
8dd45e864e fix(ui): preserve sidebar sessions through reconnect (#102424)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-10 01:02:10 +01:00
Peter Steinberger
fe2486247b feat(ui): add settings sidebar search (#103138)
* feat(ui): add settings sidebar search

* chore: keep release notes in PR body

* fix(i18n): translate settings search labels
2026-07-10 00:08:13 +01:00
Peter Steinberger
af3a76f320 fix(ui): refresh session windows after events (#103134)
* fix(ui): refresh session windows after events

* chore: defer session fix release note
2026-07-09 23:43:07 +01:00
Peter Steinberger
d2163e672c fix(ui): keep hidden sessions out of configured-only lists (#103101)
* fix(ui): preserve session list event scope

Co-authored-by: 0668001336 <wang.lizhang@xydigit.com>

* test(ui): scope session filter e2e locator

---------

Co-authored-by: 0668001336 <wang.lizhang@xydigit.com>
2026-07-09 23:03:38 +01:00
Peter Steinberger
d793575a76 improve(webchat): picker speed control becomes a single fast-mode toggle (#103104)
* improve(webchat): replace picker speed buttons with a fast-mode toggle

Speed is now one bolt toggle per provider contract: OpenAI toggles the
priority tier (Standard/Fast), other fast-mode providers toggle between the
inherited default and fast; auto and explicit standard stay reachable via
/fast and render truthfully. openrouter is removed from the supported set
because it has no runtime fast-mode mapping. Also fixes a render freeze
shipped with the immediate-apply picker: the slider drag preview wrote
textContent into a Lit-managed span, ejecting its ChildPart markers and
breaking every later menu render.

* fix(webchat): keep unmapped-provider speed overrides clear-only

* fix(webchat): make the active speed toggle always write an explicit off
2026-07-09 22:10:56 +01:00
Peter Steinberger
62de86c978 fix(ui): split-view pane header opens a hidden session dropdown when clicked (#103107)
* fix(ui): replace split pane header session select with a static title

* test(ui): focus split pane button in chat-flow e2e after select removal
2026-07-09 22:03:48 +01:00
Peter Steinberger
5013f4a166 test(ui): harden device token revoke flow (#103016) 2026-07-09 18:12:14 +01:00
Peter Steinberger
d8d369b065 feat(macos): open dashboard links in a sidebar browser (#102899)
* feat(macos): add dashboard link browser

* fix(macos): preserve browser navigation state

* fix(macos): preserve accessible external link activation

* fix(macos): preserve trusted editor handoff

* docs: refresh dashboard link map

* chore: keep dashboard release note in PR

* fix(macos): harden sidebar browser lifecycle
2026-07-09 16:40:50 +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
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
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
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
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
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
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
5154fe08fa feat: show Codex sessions across Gateway and paired nodes (#102586)
* feat(codex): add federated session catalog

* fix(codex): align session catalog checks

* fix(ui): translate Codex session catalog

---------

Co-authored-by: Peter Steinberger <peter@steipete.me>
2026-07-09 03:42:03 -07:00
Peter Steinberger
bcc4517d99 test(ui): align sidebar ordering coverage (#102660) 2026-07-09 11:37:09 +01:00
Peter Steinberger
e500a4f017 feat: session context menu (kebab + right-click) on the Sessions page (#102564)
* feat(ui): add session context menu to sessions page rows

Extract the sidebar session menu into a shared <openclaw-session-menu>
component and open it from a kebab button or row right-click on the
Sessions page, replacing the per-row unread/fork/pin/archive/workboard
icon buttons. Adds Open chat, Rename, Move to group, and per-row Delete
to the page; guards (main/global/active-run) now flow through
canArchiveSessionRow on both surfaces.

* fix(ui): retarget gateway session after deleting the current session from the sessions page

Deleting the currently selected session via the new row menu (or the
bulk bar) left gateway.snapshot.sessionKey pointing at the deleted key;
fall back to the agent main session, mirroring the archive path and the
sidebar delete path.
2026-07-09 10:15:08 +01:00
Peter Steinberger
f141af7fd7 fix(ui): keep streamed talk voice-turn transcripts readable (#102573)
* fix(ui): keep streamed talk voice-turn transcripts readable

Talk voice turns collapsed to one character per line in the macOS app
(WKWebView) while streaming: WebKit never re-runs shrink-to-fit intrinsic
sizing for a grid flex-item as its content grows, so the turn froze at
first-delta width. Convert the turn to a flex row (same visual layout).

Assistant transcript deltas also merged through the user-ASR word-boundary
spacing heuristic, mangling verbatim fragments ("Chat G PT"). Assistant
entries now concatenate fragments verbatim, space only sentence-punctuation
joins, and accept both full-transcript and tail-fragment finals.

Fixes #102556

* fix(ui): keep assistant talk fragments strictly verbatim

Drop the sentence-punctuation separator: it invented characters in real
content (Version 1. 2, docs.openclaw. ai) and Google Live tail-finals
could never heal it. The punctuation-spacing heuristic remains user-only.
2026-07-09 10:07:14 +01:00
Peter Steinberger
efe705b889 feat(ui): show microphone activity in Talk mode (#102559) 2026-07-09 09:55:42 +01:00
Peter Steinberger
9269a27f18 feat(ui): redesign settings as a full-page takeover with sidebar navigation (#102549)
* feat(ui): redesign settings as a full-page takeover with sidebar navigation

* chore(ui): regenerate i18n metadata after rebase
2026-07-09 09:51:52 +01:00
Peter Steinberger
ecc2cffad8 improve(ui): keep sidebar sessions inline and draggable (#102558)
* feat(ui): add drag-managed sidebar session groups

* chore: keep release notes in PR body
2026-07-09 09:40:53 +01:00
Peter Steinberger
67630e8973 feat(ui): make the sidebar resizable (#102491)
* feat(ui): make the sidebar resizable

* chore: defer release notes to release automation
2026-07-09 08:18:56 +01:00
Peter Steinberger
ea4e005008 fix(ui): unify split-view controls in one toolbar row (#102492)
* fix(ui): unify split-view toolbar

* chore: remove release-owned changelog entry
2026-07-09 08:17:35 +01:00
Peter Steinberger
5f91f6c958 fix: collapse sidebar after returning from drawer layout (#102463)
* fix(ui): collapse sidebar after drawer resize

* chore: defer sidebar release note
2026-07-09 07:42:17 +01:00