Commit Graph

2698 Commits

Author SHA1 Message Date
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
Peter Steinberger
07e2d633cc feat: show auto-detected provider plans and billing (#100520)
* feat(providers): auto-discover usage billing

* feat(ui): show provider plans and billing

* fix(ui): translate provider billing labels
2026-07-06 04:53:09 +01:00
Peter Steinberger
2bed394793 feat(gateway): add system.info RPC and Gateway Host card in Settings (#100478)
* feat(gateway): add system.info RPC and Gateway Host card in Settings

Settings quick page now shows where the Gateway runs and how the host
is doing: machine name, LAN address and runtime port, OS, Node/PID,
uptime, CPU count and load, RAM, and free disk on the state-dir volume.
Backed by a new additive operator.read RPC (system.info); the card
polls every 10s while visible and hides for clients without the read
scope or against older gateways.

Refs #100465

* docs: regenerate docs map for Gateway host status section

* fix(gateway): harden system info compatibility

* fix(ui): clear stale gateway host info

* docs(changelog): note gateway host status
2026-07-06 04:29:19 +01:00
Peter Steinberger
c064cae040 feat(ui): preview GitHub issues and pull requests on hover (#100434)
* feat(ui): add GitHub link hover cards

* chore(ui): sync GitHub hover card copy baseline

* docs(changelog): defer GitHub preview entry
2026-07-06 03:11:46 +01:00
brokemac79
49ae7ec065 [codex] Fail closed pair slash command routing (#98262)
* fix: keep pair qr from widening gateway bind

* fix: honor plugin activation for slash reservations

* fix: authorize spaced slash commands

* fix: keep reserved commands out of manifest reservations

* fix: avoid manifest fail-closed for declined commands

* fix: gate manifest command fallback by auth

* fix: keep runtime command probe internal

* fix: scope spaced slash authorization

* fix: route spaced plugin slash commands

* docs: note spaced plugin command routing

* docs: note spaced plugin command routing

* docs: split command routing changelog follow-up

---------

Co-authored-by: brokemac79 <255583030+brokemac79@users.noreply.github.com>
Co-authored-by: Peter Steinberger <58493+steipete@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 02:55:58 +01:00
Peter Steinberger
e596e2850d fix(control-ui): keep the dashboard mounted with a reconnect banner on gateway drops (#100479)
* fix(control-ui): keep the dashboard mounted with a reconnect banner on gateway drops

Once a session is established, a dropped gateway WebSocket no longer
unmounts the dashboard into the login gate. The client's close handler
now reports willRetry (the same fact that drives its reconnect
scheduling), the gateway store derives a `reconnecting` snapshot state
from it (everConnected && willRetry), and the app shell stays mounted
with an amber "Gateway connection lost - reconnecting" banner plus a
Retry now action while the client retries with backoff. The login gate
is reserved for first connects, credential rejections, and manual gate
submissions; event-gap recovery also no longer flashes the gate.

createApplicationGateway moved from bootstrap.ts to gateway-store.ts
with an injectable client factory for direct behavior tests. Adds the
previously unstyled `.callout.warn` variant and a "Connection loss and
reconnect" docs section.

Fixes #100475

* chore(i18n): regenerate control-ui locale bundles for connection banner strings

* chore(control-ui): unbreak CI - add reconnecting to overlays snapshot fixture, regenerate docs map

* chore(i18n): re-sync locale metadata after rebase onto refreshed main locales

* chore(i18n): refresh raw-copy baseline after rebase
2026-07-06 02:55:07 +01:00
Peter Steinberger
4f8eeeaca9 fix(ui): bind stale run state to run identity (#100527)
Co-authored-by: Tiffany Chum <tiffanychum@users.noreply.github.com>
2026-07-06 02:33:40 +01:00
Peter Steinberger
797bca251e fix(ui): remove redundant file-preview Escape hint (#100528)
Co-authored-by: 咸士山 0668001391 <xian.shishan@xydigit.com>
2026-07-06 02:25:17 +01:00
Peter Steinberger
f12312d69b fix(ui): align Skills filters (#100526)
Co-authored-by: 杨爱文 <yang.aiwen@xydigit.com>
2026-07-06 02:24:11 +01:00
Peter Steinberger
286c020748 fix(ui): preserve autonomous tool failures (#100514)
* fix(ui): preserve autonomous tool failures

Co-authored-by: qingminlong <qing.minlong@xydigit.com>

* chore: defer release note to maintainer batch

---------

Co-authored-by: qingminlong <qing.minlong@xydigit.com>
2026-07-06 02:23:03 +01:00
Peter Steinberger
60cf7eaa00 feat(ui): make the sidebar session-first and minimal (#100386)
* feat(ui): bolder sidebar minimalism — pinned/chats session groups, compact icon footer, no brand header

* test(ui): align fixtures with single default pinned route; document pinned-cap invariant

* fix(ui): preserve sidebar session groups

* fix(ui): polish minimal sidebar behavior

* fix(ui): avoid duplicate pinned chat fallback

* docs(changelog): note sidebar layout refresh

* chore(i18n): preserve sidebar locale metadata

* fix(ui): reuse localized sessions label

* test(ui): follow localized sessions label

* chore(ui): trim sidebar landing churn

* docs(ui): update minimal sidebar guidance
2026-07-06 02:08:02 +01:00
github-actions[bot]
366ed56a95 chore(ui): refresh control ui locales 2026-07-05 23:07:28 +00:00
Peter Steinberger
ff32076f78 feat(ui): add comparative cost analysis (#100432)
* feat(ui): add comparative cost analysis

* fix(usage): align cost buckets with request timezone

* test(ui): avoid shadowing cost fixture

* fix(usage): align session daily timezone buckets

* test(usage): include day offset in cache keys

* fix(ui): ship translated cost analysis strings

* fix(ui): scope cost window analysis

* chore(ui): refresh locale metadata

* chore(ui): refresh locale metadata
2026-07-05 23:58:40 +01:00
Peter Steinberger
927bbeb58c feat(chat-ui): redesign composer bottom bar with split Talk control and reasoning-effort chip (#100445)
* feat(chat-ui): redesign composer bottom bar with split Talk control and reasoning-effort chip

Removes the toolbar divider so the composer frame is the only chrome, merges
the Talk toggle and Talk settings gear into a mic+caret split control, shows
the effective reasoning level as a subtle pill next to the model name
(accent-washed only on session override), right-aligns the model/settings
cluster next to Send, and softens active/selected highlight states across the
bar. The combined model menu and reasoning fly-out now anchor right so they
stay on screen.

* fix(chat-ui): keep mobile composer controls usable

* fix(chat-ui): keep reasoning controls in mobile viewport

* fix(chat-ui): simplify composer placeholder

* chore(i18n): refresh composer locale metadata
2026-07-05 23:27:14 +01:00
haruai
ff440393da fix: ignore stale approval resolve errors (#98394)
* fix(ui): scope approval decision results

Co-authored-by: haruaiclone-droid <281899875+haruaiclone-droid@users.noreply.github.com>

* docs(changelog): credit approval race fix

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: haruaiclone-droid <281899875+haruaiclone-droid@users.noreply.github.com>
2026-07-05 23:06:18 +01:00
github-actions[bot]
cff46028f4 chore(ui): refresh control ui locales 2026-07-05 21:06:02 +00:00
Peter Steinberger
51771c3a14 feat(ui): declutter the Control UI sidebar with customizable pinned nav and a More section (#100296)
* feat(ui): declutter sidebar with pinned nav, More section, and customize menu

* test(ui): normalize sidebar e2e labels

* docs: refresh generated docs map

* fix(ui): keep tablet navigation drawer expandable

* chore(ui): refresh i18n raw-copy baseline
2026-07-05 21:56:51 +01:00
Peter Steinberger
5e0504aa43 feat(ui): simplify Talk settings (#100453)
Co-authored-by: Peter Steinberger <steipete@openai.com>
2026-07-05 21:31:52 +01:00
lzyyzznl
8e7cd40719 fix(ui): render direct tool-result image blocks inline in chat (#50779) (#100295)
* fix(ui): render direct tool-result images inline

Co-authored-by: 黄剑雄0668001315 <huang.jianxiong@xydigit.com>

* test(ui): stabilize delayed-send scroll precondition

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: 黄剑雄0668001315 <huang.jianxiong@xydigit.com>
2026-07-05 12:48:29 -07:00
Peter Steinberger
c730d8f1f1 feat(logbook): automatic work journal plugin with Control UI timeline tab (#99930)
* feat(logbook): automatic work journal plugin with a plugin-contributed Control UI tab

Squash of PR #99930 work for rebase onto the Control UI route refactor:
- extensions/logbook: Dayflow-style capture -> observations -> timeline cards
  pipeline with SQLite store, node capture commands, standup/ask, retention
- plugin SDK/gateway seam: surface "tab" Control UI descriptors projected
  into hello-ok controlUiTabs (scope-filtered, deterministic order)
- Control UI: dynamic plugin tabs with bundled Logbook view
- docs, tests, labeler wiring

* feat(ui): port plugin tabs and Logbook to the route-owned Control UI architecture

- shared /plugin route carries the tab id in the query (?id=<tab>), matching
  the router's exact-path contract
- openclaw-plugin-page renders bundled views (Logbook), sandboxed plugin
  frames (descriptor path), or the unavailable card
- sidebar renders hello controlUiTabs after each group's static routes
- Logbook view/controller live under ui/src/pages/plugin/

* fix(ui): namespace plugin tabs by pluginId to prevent cross-plugin tab id collisions

* fix(logbook): prefer app capture nodes and rotate off failing nodes

* fix(plugins): reject protocol-relative Control UI tab paths

* fix(logbook): harden automatic journal

* docs(changelog): remove maintainer self-credit

* chore(ui): refresh locale metadata after rebase

* fix(logbook): preserve analysis window boundaries

* fix(logbook): align status privacy and timezone

* fix(ui): stop hidden plugin tab polling
2026-07-05 11:50:44 -07:00
Peter Steinberger
8a187447f9 feat(ui): show provider costs in context popover (#100379)
* feat(ui): show estimated run cost

* feat(ui): show provider cost breakdown
2026-07-05 10:49:06 -07:00
Peter Steinberger
d84314d6b7 fix(ui): reveal message context on timestamp hover (#100391)
* fix(ui): reveal message context from timestamp

* fix(ui): paint message context preview

* docs(changelog): note timestamp context reveal
2026-07-05 10:48:22 -07:00
Peter Steinberger
89ef6632de feat(ui): scroll truncated sidebar session names on hover (#100276)
* feat(ui): scroll truncated sidebar session names on hover

Sidebar recent-session labels clip long titles with an ellipsis and there
was no way to read the tail without opening the session. Hovering a row
now animates the label's text-indent to slide the clipped tail into view
(speed-proportional duration, 300ms minimum) and snaps back quickly on
mouse leave. Resting ellipsis rendering is preserved by animating
text-indent instead of transforming an inner wrapper, since text-overflow
draws no ellipsis for atomic inline children. Respects
prefers-reduced-motion.

* fix(ui): harden sidebar session marquee
2026-07-05 10:29:46 -07:00
github-actions[bot]
06bf43083d chore(ui): refresh control ui locales 2026-07-05 16:22:32 +00:00
Peter Steinberger
f607ba0691 feat(control-ui): session grouping with drag & drop and channel categorization (#100262)
* feat(control-ui): session grouping with drag & drop and channel categorization

* fix(control-ui): restrict session drag&drop to private session-key payloads

* chore(i18n): translate session grouping strings across control ui locales

* chore(protocol): regenerate swift gateway models for session category

* chore(protocol): regenerate swift gateway models for session category
2026-07-05 09:13:17 -07:00
Shakker
4074c8e743 fix: remove sidebar usage quota 2026-07-05 15:57:27 +01:00
Peter Steinberger
00da1243a8 fix(ui): clear session labels across subscribed clients (#100266)
* fix(ui): reconcile cleared session labels

* chore: remove release-owned changelog entry

* chore: remove release-owned changelog entry

* chore: remove release-owned changelog entry

* chore: remove release-owned changelog entry

* chore: remove release-owned changelog entry
2026-07-05 07:54:05 -07:00
Peter Steinberger
862de9f1a1 fix(pairing): advertise reachable Tailnet routes (#100317)
* fix(pairing): advertise reachable tailnet routes

* fix(pairing): satisfy native and SDK checks

* fix(ios): cancel stale pairing route probes

* test(pairing): document LAN-only Serve fallback

* fix(ios): preserve pairing result initializer
2026-07-05 07:43:43 -07:00
Peter Steinberger
a5fdc07121 fix(ui): simplify grouped tool activity (#100318) 2026-07-05 06:56:58 -07:00
github-actions[bot]
80801be738 chore(ui): refresh control ui locales 2026-07-05 13:33:08 +00:00
Peter Steinberger
db96218c05 feat(ui): show context usage details (#100264)
* feat(ui): show context usage details

* fix(ui): translate context usage labels

* fix(ui): translate context usage labels

* test: route e2e tempfile helper dependencies

* chore: drop superseded test routing change

* chore: drop superseded test routing change

* chore: drop superseded test routing change
2026-07-05 06:24:05 -07:00
Peter Steinberger
f9e194e4a1 fix(ui): keep login recovery accessible 2026-07-05 06:13:00 -07:00
Peter Steinberger
f886ce7339 fix(ui): keep the connection-error disclosure collapsed by default
Restore the maintainer-requested collapsed <details> failure callout that
a parallel session reverted, adapt the e2e expectations, and drop the
PR-side CHANGELOG edit (changelog is release-generation-owned).
2026-07-05 06:09:31 -07:00
Peter Steinberger
99845cfddf fix(ui): mobile-optimize gateway dashboard login gate (#100208) 2026-07-05 06:07:52 -07:00
Peter Steinberger
1f484a8dbd test: speed up and stabilize full suite 2026-07-05 08:00:23 -04:00
Peter Steinberger
78685aec46 fix(ui): center terminal new-session button (#100256) 2026-07-05 02:36:12 -07:00
Peter Steinberger
e7808dbe60 fix(ui): hide idle composer scrollbar (#100252) 2026-07-05 02:25:34 -07:00
Peter Steinberger
86bf85fb35 fix(ui): publish mobile setup independently (#100179)
* fix(ui): publish mobile setup independently

* fix(ui): publish mobile setup independently
2026-07-05 01:54:58 -07:00
Peter Steinberger
091d9564b6 fix(ui): hide duplicate terminal caret (#100240) 2026-07-05 01:48:43 -07:00
Peter Steinberger
8b229a938c fix(ui): simplify OpenAI speed choices (#100190) 2026-07-05 01:46:13 -07:00
Peter Steinberger
e72a2c825d fix(ui): simplify selectable tool error rows (#100199)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-05 00:08:21 -07:00
Peter Steinberger
9b60e1429d fix(control-ui): declutter Settings and make Simple/Advanced switch persistent (#100147)
Quick Settings read as competing panels and the Appearance card wrapped/clipped its segmented controls in a narrow side column. Switching to Advanced also had no visible way back — the only return was a "Quick Settings" link buried in the accordion nav.

- Replace the one-way "Advanced" button and buried accordion back link with a persistent Simple/Advanced switch in the page header, mirrored into an in-body row at the mobile breakpoint where the header is hidden.
- Give Appearance a full-width auto-fit grid so Theme/Mode/Roundness/Text size never wrap or clip.
- Drop the duplicate Context Profile side panel for a compact summary line, and only show "Pending" when a change is actually staged (pass savedConfigObject).
- Remove the redundant in-page "Quick Settings" heading and unused preset copy.

Presentation-only within ui/src/pages/config; net -354 non-test LOC. Closes #100145.
2026-07-05 02:20:02 -04:00
Peter Steinberger
062f88e3e3 refactor: extract reusable AI runtime package (#99059)
* refactor: extract reusable AI runtime package

* refactor: complete AI provider relocation

* refactor: keep llm core internal

* refactor(ai): make @openclaw/ai self-contained with host policy ports

Move pure transport helpers (tool projections, strict-schema normalization,
prompt-cache boundary, stream guards, anthropic/openai compat, request
activity) from src into packages/ai; move utf16-slice into
normalization-core. Inject host policy (guarded fetch, redaction,
strict-tool defaults, diagnostics logging) through AiTransportHost with
inert library defaults installed by src/llm/stream.ts. Narrow the public
barrel to instance-scoped createApiRegistry/createLlmRuntime; the
process-default runtime moves behind internal/ and
registerBuiltInApiProviders takes an explicit registry. Delete the
src/llm/api-registry re-export facade.

* fix(ai): teach node, jiti, and vite resolvers the @openclaw/ai and utf16-slice subpaths

The workspace alias tables in root-alias.cjs, plugin-sdk-native-resolver,
sdk-alias, the shared vitest config, and the Control UI vite config only
knew @openclaw/llm-core; Node-side plugin loading resolved @openclaw/ai
through the pnpm symlink to the unbuilt dist (checks-node-compact CI
failures), and the Control UI build broke on the new
normalization-core/utf16-slice subpath.

* chore(ui): drop leftover service-worker debug logging

* build(release): ship @openclaw/ai with its own shrinkwrap and honest dependency set

packages/ai declares only its six real runtime deps (kysely, chalk, json5,
tslog, zod, fs-safe, and proxyline were never imported); orphaned root deps
removed. generate-npm-shrinkwrap now treats publishable packages/* like
publishable plugins so the AI tarball pins its transitive tree even though
workspace deps are omitted from the root shrinkwrap. knip learns the
package entry points; the tsdown dts neverBundle option moves to its
documented deps.dts home; the README documents the no-semver internal/*
contract and host ports.

* docs(ai): add minimal external-consumer example app

examples/ai-chat consumes only the public @openclaw/ai surface (built dist
via the workspace link): isolated runtime, built-in provider registration,
one streamed completion. Supports Anthropic/OpenAI via env keys and a
keyless local Ollama target; live-verified against Ollama.

* docs(ai): document the @openclaw/ai package and workspace shrinkwrap boundary

* chore(check): include examples/ in duplicate-scan targets

* fix: emit normalization package subpaths

* fix: complete AI package boundary artifacts

* fix: align AI package boundary contracts

* fix(ci): stabilize package release contracts

* test: align documentation contract checks

* test: keep cron docs guard aligned

* test: align restored docs contract guards

* test: follow upstream docs contracts

* docs: drop superseded talk wording
2026-07-05 01:56:40 -04:00
Peter Steinberger
1d9fb2773f feat(ui): surface mobile pairing shortcuts (#100157) 2026-07-05 00:47:27 -04:00