Commit Graph

2741 Commits

Author SHA1 Message Date
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
Vincent Koc 55a0012c44 fix(ui): restore sidebar navigation exports 2026-07-06 06:56:09 +02:00
Wynne668 f36f3f30ea fix(ui): recover from stale Control UI bundles (#99111)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 05:26:49 +01:00
RayRuan e9a5dc9bf6 fix(ui): preserve structured connect failures (#54758)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 05:26:33 +01:00
Goutam Adwant ae6da5bc77 fix(ui): surface coalesced update restarts (#93082)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 05:26:14 +01:00
Peter Steinberger 0acd851a3b feat(agents): add managed git worktree lifecycle (create/provision/snapshot/restore/GC) (#100535)
Centralized managed worktrees under <state-dir>/worktrees/<repo-fingerprint>/<name>
with branch-per-task (openclaw/<name>), .worktreeinclude provisioning, an optional
.openclaw/worktree-setup.sh repo hook, and a SQLite registry in the shared state DB.
Removal always snapshots the tree (untracked included, gitignored excluded) to
refs/openclaw/snapshots/<id>; restore rebuilds the branch at the original commit with
the snapshot content as uncommitted state. Lossless run-end cleanup, 7-day idle GC for
run-owned worktrees (manual exempt), orphan reconciliation, 30-day snapshot retention.
Surfaces: worktrees.* gateway RPC (operator.admin mutations), openclaw worktrees CLI,
Control UI page, plugin-SDK facade + Workboard kind:"worktree" materialization.

E2E-verified on Testbox: full create->work->remove->restore->gc lifecycle.
2026-07-06 05:24:58 +01:00
Peter Steinberger 62ecc2306c feat(commands): add /learn to draft skills from recent work (#100442)
* feat(commands): add /learn to draft skills from recent work (#100408)

/learn rewrites the turn into a standards-guided Skill Workshop authoring
instruction: the agent gathers named sources (or distills the current
conversation) and files ONE pending skill proposal via skill_workshop.
Approval flow unchanged; sandboxed/tool-restricted agents get a clear
unavailable reply. Extracts the harness OpenClaw-tools predicate into
shared helpers and reserves the command name against plugin shadowing.

* docs: regenerate docs map for /learn section
2026-07-06 04:54:22 +01:00