Commit Graph

2747 Commits

Author SHA1 Message Date
Peter Steinberger 68c85effcd chore(ui): refresh control ui locales
Translate chat.composer.realtimeTalkRequiresMicrophone across all
locales; it shipped as a recorded English fallback with the chat
composer redesign and broke the control-ui-i18n CI gate on main.
2026-07-06 23:45:10 +01:00
Jason (Json) 17d3c2eb0a feat(ui): redesign chat composer controls (#100461)
* feat(ui): redesign chat composer controls

* fix(ui): preserve scoped chat model catalogs

* fix(ui): honor configured default agent in chat commands

* fix(ui): align composer translations and tests

* test(ui): expect cached chat commands

* fix(ui): inset composer attachment previews

* fix(ui): add attachment preview top padding

* fix(ui): preserve composer layout after main merge

* fix(ui): keep abort available during voice input

* fix(ui): merge duplicate model provider groups

* feat(ui): finalize chat composer redesign

* fix(ui): refine composer layout and scroll indicators

* fix(ui): align composer with chat column

* fix(ui): restore composer max width

* fix(ui): match composer Codex width

* fix(ui): stabilize chat composer controls

* docs: refresh generated map

* fix(ui): discard rejected model drafts

* fix(ui): clear chat composer CI gates

* test(ui): await rejected model rollback

* fix(ui): address chat composer review findings

* fix(ui): preserve default provider ordering

* fix(ui): stage model picker changes until save

* fix(ui): scope model picker drafts to chat context

* fix(ui): align composer drafts and message actions

* fix(ui): preserve reasoning rendering

* feat(ui): refine chat composer interactions

* fix(ui): repair chat composer CI checks

* fix(ui): repair chat composer integration checks

* fix(ui): translate chat composer labels

* fix(ui): restore mobile camera action

* test(ui): target visible attachment control

* test(ui): locate attachment disclosure directly

* fix(ui): preserve composer control ordering

* test(ui): track current composer controls

* fix(ui): honor terminal active-run state

* fix(ui): guard command metadata ownership

* fix(ui): stage agent model defaults

* fix(ui): preserve chat settings and scroll signals

* fix(ui): reconcile merged chat controls

* fix(ui): localize Talk composer options

* test(ui): infer chat control props

* fix(ui): refresh agent model metadata on session switch

* style(ui): format merged chat controls

* test(ui): avoid shadowed composer geometry names
2026-07-06 16:18:36 -06:00
Vincent Koc 076273a43b refactor(ui): localize internal type exports (#101135) 2026-07-06 12:44:31 -07:00
Peter Steinberger e9464313b7 feat(ui): polish sidebar rail and hide disabled Workboard nav (#101123) 2026-07-06 20:31:57 +01:00
github-actions[bot] a7c4a0471d chore(ui): refresh control ui locales 2026-07-06 18:52:14 +00:00
Peter Steinberger 92cfceac09 feat(ui): select Talk microphone inputs (#101100) 2026-07-06 19:39:58 +01:00
Peter Steinberger d04d0754a2 fix(ui): move sidebar collapse toggle from the topbar into the sidebar footer (#101038)
* fix(ui): move sidebar collapse toggle from the topbar into the sidebar footer

* docs: sidebar collapse toggle lives in the sidebar footer
2026-07-06 18:39:52 +01:00
Peter Steinberger 6f0f98545c improve(ui): sessions page fits on one screen with per-session overrides in a row drawer (#100943)
* feat(ui): redesign sessions page into roster table with details drawer

* fix(ui): decouple sessions drawer expansion from deep-link query narrowing; update mobile column hiding for new roster

* fix(ui): reload open session drawer when a session gains compaction checkpoints
2026-07-06 18:33:27 +01:00
Alix-007 02a099756e fix(control-ui): isolate gateway settings by base path (#97665)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 17:52:29 +01:00
Vincent Koc 67732dd312 refactor(ui): localize view prop types (#101013) 2026-07-06 09:49:45 -07:00
ZZIPP 979d198fd1 fix(media): recognize m2a as MPEG audio (#92167)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 17:48:37 +01:00
Peter Steinberger 84f21bd9fc feat(ui): clickable file links in chat with a workspace file viewer sidebar (#100679)
* feat(ui): link file paths in chat and add workspace file viewer sidebar

Auto-detect file paths in chat markdown (plain paths, path:line, inline
code, explicit/absolute links) and render them as clickable links that
open a dedicated file viewer sidebar with line numbers, highlight.js
syntax highlighting, scroll-to-line, in-file search, reveal-in-rail,
open-in-editor, and copy actions. Workspace rail browser entries are
now previewable even when the transcript never touched them;
sessions.files.get serves any file inside the workspace root with the
existing containment, symlink/hardlink, and size guards.

Closes #100615

* feat(ui): linkify file paths in sidebar markdown and fix file-view gutter width

Markdown rendered in the chat detail sidebar now gets the same clickable
file links as chat messages, opening files via the panel's own click
delegation. File viewer gutter uses a fixed per-file digit width so
short lines no longer indent their code past longer ones.

* fix(ui): keep browser-entry active highlight and narrow file content for editor open

loadWorkspace no longer clears the rail active marker for browser-only
entries, so Show in Files keeps the revealed file highlighted after the
forced reload. openInEditor narrows the sidebar content kind before use,
fixing the tsgo type error.

* chore(ui): fix lint findings in file viewer helpers

* fix(ui): harden workspace file previews

* fix(ui): wire file previews through chat panes

* fix(ui): preserve workspace file targets

* fix(ui): preserve workspace file targets
2026-07-06 17:47:28 +01:00
Dallin Romney 5af7ba92ce refactor: consolidate byte-size formatting (#99768)
* refactor: consolidate byte-size formatting

* fix: stabilize byte formatter import boundary

* fix: keep byte formatter within SDK budget

* fix: emit byte formatter package entry

* refactor: trim byte formatter surface

* fix: use narrow byte formatter import

* refactor: remove byte formatter dependency changes

* fix: refresh rebased byte formatter baseline
2026-07-06 09:26:04 -07:00
Peter Steinberger 161e66f7bd fix(ui): move Worktrees page from the sidebar into Settings navigation (#100995) 2026-07-06 17:16:39 +01:00
Huang Wanjia 9375f7f0bf fix: keep /steer working for active runs (#100803)
* fix: honor active run flags for steer command

* test(ui): simplify steer e2e fixture

* test(ui): preserve mock session row types

---------

Co-authored-by: martin <huangtongxuedev@outlook.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 16:50:12 +01:00
Shakker 67ec544884 fix: keep new sidebar sessions visible (#100981) 2026-07-06 16:48:53 +01:00
Peter Steinberger add5c513ae feat(ui): stable session order, palette-only search, and macOS titlebar brand for the sidebar (#100648)
* feat(ui): declutter the sidebar — pinned/chats groups, stable ordering, palette session search, titlebar brand in macOS app

- Sessions split into Pinned and Chats groups; pins are exempt from the
  nine-row recency cap and the open session highlights in place instead of
  hoisting to the top, so clicking a row no longer reshuffles the list.
- The command palette (Cmd+K) is the single search: it queries sessions
  across agents server-side and lists matching chats next to nav commands;
  the sidebar session-picker popover and its magnifier are removed, and the
  topbar search pill shrinks to an icon button.
- The sidebar brand row is gone: web keeps the breadcrumb wordmark, and the
  macOS app shows a compact brand mark in the native titlebar strip next to
  the traffic lights (CSS-gated on the injected openclaw-native-macos class).
- The agent filter dropdown becomes a compact scope chip in the Chats group
  header; the welcome badge drops its duplicate claw logo.
- Footer collapses to one icon row (status dot, settings, docs, pairing,
  mobile theme switch); default pinned nav routes are now Overview-only and
  the Recent-collapse preference is retired.

* test(ui): keep sidebar hover-reveal proof before the stability click; refresh locale metadata

Clicking the row leaves :focus-within on it, which keeps the management
actions visible; the hidden-actions assertion must run first.

* test(ui): archive an idle session in the sidebar e2e; assert running rows stay archive-disabled

* fix(ui): drop stale and hidden rows from palette session search

Invalidate the in-flight search and clear results on every query change so a
late-resolving previous-query request cannot leave stale rows selectable, and
run results through getVisibleSessionRows so archived/global/unknown/cron/
subagent rows stay hidden like the sidebar list. Codex review findings.

* fix(ui): over-fetch palette session search so hidden rows cannot starve visible matches

Exclude global/unknown rows server-side and fetch a full 50-row page before
applying the sidebar's hidden-row filter, keeping the 10-row display cap.
Codex review finding.

* chore(i18n): refresh sidebar locale metadata after rebase

* fix(ui): bound command palette session search

* docs: defer release notes to release generation
2026-07-06 16:38:26 +01:00
Shakker ece23c4d3d fix: translate sidebar sort labels 2026-07-06 16:09:44 +01:00
Shakker 2a02379e7d fix: preserve sidebar session position 2026-07-06 16:09:44 +01:00
vyctorbrzezowski a03c828cad fix(ui): keep sidebar session order stable 2026-07-06 16:09:44 +01:00
Vincent Koc 0ecfc522db refactor(ui): trim unused type surface (#100952)
Fixes #100951
2026-07-06 08:04:18 -07:00
Peter Steinberger aa1929ccb0 feat(control-ui): multi-pane split view for chat (#100754)
* feat(control-ui): add multi-pane split view to chat

* fix(control-ui): boot classic chat pane without fabricated session key

* fix(control-ui): thread per-pane composer state into session goal pill
2026-07-06 16:01:51 +01:00
Vincent Koc 5733fb0e19 refactor(ui): localize internal-only symbols (#100931) 2026-07-06 07:28:48 -07:00
Vincent Koc 94a0d2ec3b test: align shifted main assertions (#100897) 2026-07-06 07:24:26 -07:00
Peter Steinberger f623d81f52 feat(ui): show background tasks live in the web Control UI (#100789)
* feat(gateway): broadcast task ledger changes as task events

* feat(ui): add background Tasks page to Control UI

* fix(gateway): address tasks page review findings

* fix(ui): surface tasks.cancel refusals on the Tasks page

* fix(gateway): guard stale task observer disposal against replacement gateways

* chore: satisfy lint and docs-map gates for tasks page

* test(gateway): await async agent unsub in stale-dispose test
2026-07-06 14:36:33 +01:00
Peter Steinberger 88f1ec38d4 feat(sessions): grouping, unread state, and full session controls on web, iOS, and Android (#100814)
Gateway (additive, no protocol version bump): SessionEntry gains
lastReadAt/markedUnreadAt/lastActivityAt; session rows expose a derived
unread flag (explicit mark, or last read before latest activity; never-read
sessions stay read so upgrades do not light up). lastActivityAt is stamped
in the canonical post-run store update - user, channel, and cron runs count
as activity; heartbeat, internal-event, and preserved-state runs do not.
sessions.patch gains unread; sessions.create gains fork (transcript fork
from parentSessionKey under the parent lifecycle lock, refusing active,
concurrently-changed, and oversized parents, cross-agent aware).

Web sidebar: Pinned/custom-group/Ungrouped sections, unread dots, kebab and
right-click context menu (pin, mark unread/read, rename, fork, move to group,
archive, delete guarded for agent main sessions and active runs), mark-read
on view with loop-safe re-acknowledgement and failure retry; sessions page
gets unread + fork actions and shared custom-group helpers.

iOS Command Center: grouped sections, unread/pin indicators, Show Archived
gated on per-entry state, full context menu with rename/new-group alerts and
delete confirmation, current-session preview guarantee, read-episode
re-acknowledgement; new patch/delete/fork transport calls; Swift protocol
models regenerated.

Android SessionsScreen: grouped headers, unread/pin indicators, Archived
filter gated on per-entry state, long-press menu with the full control set,
agent-scoped forks, explicit label/category clears from session events,
main-session fallback when archiving/deleting the open chat, read-episode
re-acknowledgement with failure retry.

Closes #100739
2026-07-06 14:30:55 +01:00
Vincent Koc 6418e196b1 refactor: remove unused internal exports (#100882) 2026-07-06 05:59:18 -07:00
Peter Steinberger e66b470ea5 feat(ui): add configurable chat send shortcut (#100810)
* feat(ui): add configurable chat send shortcut

Co-authored-by: vincentkoc <25068+vincentkoc@users.noreply.github.com>

* fix(ui): translate chat shortcut labels

---------

Co-authored-by: vincentkoc <25068+vincentkoc@users.noreply.github.com>
2026-07-06 12:36:07 +01:00
Peter Steinberger 827402243d feat: add Anthropic and OpenAI cost history (#100672)
* feat(providers): add admin cost history

* fix(ui): sync cron raw-copy baseline

* fix(usage): harden provider cost credentials

* fix(ui): refresh raw-copy baseline

* docs: refresh documentation map

* fix(ci): sync provider usage baselines

* fix(ui): hide zero-cost history bars

* docs(changelog): defer provider cost note
2026-07-06 12:06:55 +01:00
Vincent Koc 17777b3a9f refactor: remove proven dead code across runtime surfaces (#100823)
* refactor: remove unused internal helpers

* refactor(ui): remove unused compatibility helpers

* refactor(android): remove unused talk cleanup shim

* refactor(android): remove orphaned legacy UI

* refactor: remove unused private exports

* refactor(docs-i18n): remove dead matcher and satisfy lint
2026-07-06 03:31:19 -07:00
github-actions[bot] 65e2166fbe chore(ui): refresh control ui locales 2026-07-06 09:32:48 +00:00
Peter Steinberger b4b1984fe7 feat(gateway): start a new chat session in a managed worktree (#100788)
Adds an additive worktree flag to sessions.create so any new chat can run in an
isolated managed worktree of the agent's git workspace, with the branch checked
out and .worktreeinclude provisioning applied. The session's spawnedCwd points at
the matching subdirectory inside the worktree so chat runs, CLI, and the file
browser execute there. agents.list gains workspaceGit (workspace or an ancestor
is a git checkout) to gate the affordance; web sidebar, iOS, and Android expose a
New-Chat-in-worktree action. Uses the method's operator.write scope, but the
.openclaw/worktree-setup.sh step runs only for operator.admin callers since it
executes repo code. Deleting the session, or leaving via a plain New Chat, clears
the cwd and lossless-removes the worktree; idle GC treats recent session activity
as worktree activity so an active session's checkout is never swept.

Live-verified end-to-end on a real gateway; follow-up to #100535 (issue #100534).
2026-07-06 10:23:41 +01:00
Peter Steinberger c05766b2ff chore(i18n): refresh control ui raw-copy baseline 2026-07-06 05:17:21 -04:00
Peter Steinberger aa0b5b1fb4 improve(ui): pin sidebar nav above a scrollable session list (#100742)
Nav routes (Overview, Workboard, Agents, More) now render first and stay
pinned; the session list owns the remaining sidebar height and scrolls
internally instead of being capped at min(42vh, 400px). Mobile drawer
matches the pinned-nav layout.
2026-07-06 10:08:29 +01:00
Peter Steinberger 0423c142c1 fix(ui): open embedded terminal before login gate (#100727) 2026-07-06 10:00:56 +01:00
Peter Steinberger 3170bfa489 fix(ui): proxy canonical inbound media previews (#100725)
Co-authored-by: Cornna <96944678+ymylive@users.noreply.github.com>
2026-07-06 09:54:19 +01:00
jincheng-xydt ba9700d59a fix #99163: harden large chat attachment parsing (#99213)
* fix(gateway): harden large chat attachment parsing

* test(ui): prove large chat image paste

* fix(media): preserve short MIME rejection

---------

Co-authored-by: xjch <267882353+jincheng-xydt@users.noreply.github.com>
Co-authored-by: Vincent Koc <25068+vincentkoc@users.noreply.github.com>
2026-07-06 01:47:21 -07:00
Peter Steinberger 1b44efec8c feat(ui): redesign session goal into interactive composer pill with elapsed time and /goal edit (#100736)
* feat(ui): redesign session goal into interactive composer pill with elapsed time and /goal edit

* docs: align goal command table cell padding

* docs: regenerate docs map for goal Control UI section
2026-07-06 09:42:49 +01:00
Peter Steinberger 5f3629e944 fix(ui): show selected agent default model (#100719)
Co-authored-by: Harry Xie <harryhsieh963@yahoo.com>
2026-07-06 09:41:38 +01:00
Peter Steinberger eae4000c38 fix(control-ui): preserve assistant download filenames (#100728)
* fix(gateway): preserve assistant media filenames

Co-authored-by: Rovy <xiaxia@rovy.dev>

* test(ui): verify assistant media download filename

---------

Co-authored-by: Rovy <xiaxia@rovy.dev>
2026-07-06 09:04:22 +01:00
Peter Steinberger 2585d6b2e8 fix(ui): localize cron action menu 2026-07-06 03:48:46 -04:00
haruai ead92d7078 fix: stop reconnecting on protocol mismatch (#98414)
* fix: stop reconnecting on protocol mismatch

* fix(ui): stop protocol mismatch reconnects

* test(ui): assert protocol mismatch recovery copy

* test(ui): count gateway reconnect attempts

* test(gateway): keep detail-less reconnect case typed

* test(gateway): keep pairing retry fixture typed

---------

Co-authored-by: haruaiclone-droid <281899875+haruaiclone-droid@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 07:43:33 +01:00
Peter Steinberger 6e71b0bf30 fix(ui): reopen web terminals without stale content (#100665) 2026-07-06 07:42:38 +01:00
Peter Steinberger ef269f2689 improve(ui): declutter the Cron Jobs page into compact scannable rows (#100646) 2026-07-06 07:29:02 +01:00
Peter Steinberger 98ca8c945e fix(ui): stop repeating tool names in expanded activity (#100606)
* fix(ui): stop repeating tool names in expanded activity

* fix(ui): stop repeating tool names in expanded activity
2026-07-06 07:17:23 +01:00
github-actions[bot] 241c761d00 chore(ui): refresh control ui locales 2026-07-06 06:01:14 +00:00
heichl_xydigit 00f5df24e5 fix(webchat): keep context indicator visible with stale token data (#89772)
* fix(webchat): keep context indicator visible with stale token data

The context usage indicator was disappearing after sending a message because
totalTokensFresh was set to false during the run, even though we had valid
token count data from before the message was sent.

Changes:
- Modified getContextNoticeViewModel to show the indicator even when
  totalTokensFresh is false, as long as totalTokens is non-zero
- Added isStale flag to indicate when token data is not fresh
- Applied subtle visual styling for stale data (lighter colors, 5% opacity)
- Added "(updating)" suffix to the percentage text and title when stale
- Updated tests to verify the new behavior

Fixes #89662

* test(ui): cover stale context indicator behavior

* docs(changelog): note Control UI fix

---------

Co-authored-by: 黑承亮0668000844 <bladin@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 06:44:41 +01:00
Ben.Li b3ba030707 fix(ui): show cron job model selection (#95341)
* fix(ui): show cron job model selection

* fix(ui): scope quick-create cron model selection

* test(ui): cover cron model quick create

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 06:43:40 +01:00
pick-cat ea99b96ddd fix(ui): preserve live tool stream order (#93184)
* fix(ui): preserve live tool stream order

* chore: trigger CI

* refactor(ui): preserve causal tool stream ordering

* docs(changelog): note Control UI fix

* test(ui): use current tool event contract

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 06:43:05 +01:00
Peter Steinberger 89f911f322 refactor(ui): consolidate sidebar navigation contract (#100612)
* fix(ui): restore sidebar navigation contract

* refactor(ui): remove duplicate sidebar navigation model
2026-07-06 06:30:57 +01:00