Commit Graph

3266 Commits

Author SHA1 Message Date
Peter Steinberger
883e357759 fix(ui): restore autosave validation gates (#107477)
* fix(ui): sync autosave locale catalogs

* fix(ui): repair autosave lint and test types

* fix(ui): clarify Korean discard action
2026-07-14 06:29:45 -07:00
Peter Steinberger
578163c4a3 refactor(ui): privatize config autosave delay (#107475) 2026-07-14 05:55:04 -07:00
Peter Steinberger
d6fc3d34e2 improve(ui): auto-save config edits, flatten config pages, single restart affordance (#107458) 2026-07-14 05:31:41 -07:00
Peter Steinberger
9d79d85f46 feat(workboard): refresh Control UI from live changes (#99051)
* feat(workboard): refresh control ui from live changes

* refactor(workboard): tighten live invalidation path

* chore(workboard): preserve locale catalog state

* refactor(gateway): keep broadcaster runtime object

* refactor(plugin-sdk): own gateway event types

* test(workboard): bind reconciliation mocks

* test(release): declare recovery helpers

* fix(workboard): cancel direct loads on teardown
2026-07-14 05:17:23 -07:00
openclaw-mantis[bot]
2444013175 chore(ui): refresh control ui locales (#107372)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-07-14 05:13:10 -07:00
Peter Steinberger
e0fd84b019 refactor(ui): use highlight.js native registry 2026-07-14 03:46:42 -07:00
Peter Steinberger
3229fbdc48 fix(config): render Feishu group policy in Form mode (#107336)
* fix(ui): scope unsupported config guidance to fields

* fix(config): export Feishu transform inputs

* chore: remove release-owned changelog entry
2026-07-14 03:42:43 -07:00
Peter Steinberger
bc4ed5cf61 feat(macos): native-feel dashboard hosting — instant reopen, preload, frame autosave, ⌘N/⌘K, route memory (#106997)
* feat(macos): native-feel dashboard hosting: instant reopen, preload, frame autosave, ⌘N/⌘K, route memory

The hosted Control UI dashboard now skips SPA reloads when reopening an
unchanged endpoint (auth-equality gated), preloads after launch when a
credentialed local/direct config exists, autosaves its window frame, maps
⌘N/⌘K menu items onto the shipped native web events, filters browser-tell
context-menu items, restores the last committed route via web-side
localStorage memory, and themes the pre-paint background.

* refactor(ui): satisfy TS LOC ratchet: move optional lazy-element helpers out of app-host

app-host.ts is over the 500-line ratchet ceiling and may not grow; move the
self-contained optional custom-element block into lazy-custom-element.ts (its
natural owner) and fold the route-restore decision into native-route-memory's
considerRouteRestore so the shell only replaces-or-persists.

* fix(macos): recover stuck dashboard command queue via deliverability gate

Replace the failure-page-only fast-path check with canDeliverNativeCommands
(live document or in-flight load); a terminally cancelled reload now falls
through to the reload path instead of queueing ⌘N/⌘K forever.

* fix(ui): let in-flight navigation win over native route restore

The one-shot startup restore now checks the rendered/pending match against
the committed bootstrap route; an explicit navigation already in flight
(replayed native new-session, fast click) is no longer clobbered.

* docs(ui): note idempotent collapse of pending native new-session replays

* fix(macos): drop queued dashboard commands on terminal load failure

Queued ⌘N/⌘K are moment-bound; surviving a failure page meant a later
recovery reload replayed stale commands (double palette toggle nets closed,
surprise navigation). Both failure entry points now clear the queue.

* fix(ui): persist native route memory only for settled router states

Mid-navigation emissions still carry the stale committed bootstrap route; an
interrupted restore could overwrite the remembered destination with it.

* fix(macos): coalesce dashboard opens for queued native commands

One in-flight open drains a manager-level queue in press order; a Task per
key press could race window creation (duplicate windows) and reorder ⌘N/⌘K
delivery on the non-immediate remote path.

* fix(macos): correct dashboard placement after frame-autosave restore

setFrameAutosaveName re-applies the stored frame; run ensureOnScreen after
both autosave-name assignments so a frame saved on a disconnected monitor
cannot restore the window off-screen.

* fix(macos): clear dashboard failure state when history restores a real document

Swipe-back/⌘[ off the failure page commits an http(s) document without
passing through load(); the flag previously stayed set and forced a reload
on the next native command.

* fix(macos): keep in-flight dashboard loads instead of restarting them

An open/update during the launch preload previously cancelled and restarted
the same-URL load; in-flight non-failure documents now count as usable in
the reload decision.

* fix(macos,ui): ⌘K legacy fallback + transient search param filtering

Command palette dispatch now sends a cancelable toggle event and falls back
to the shipped open-search event when no handler acknowledges it, so ⌘K
keeps working against older gateway-served bundles. Route memory strips
one-shot action params (?draft=) before persisting; navigation state like
?session= still restores.

* chore(i18n): register dashboard menu strings + drop unused route-memory export

native:i18n:sync inventory + per-locale artifacts for New Session / Command
Palette…; StoredNativeRoute is module-internal after the considerRouteRestore
refactor (deadcode exports gate).

* chore(i18n): rebaseline raw-copy for relocated lazy-element labels

The lazy-custom-element extraction moved three internal load-failure labels
out of app-host.ts; refresh the keyless raw-copy baseline to match (main's
new ui:i18n:verify gate).
2026-07-14 03:33:25 -07:00
Peter Steinberger
276efaa48b refactor(ui): privatize chat helpers (#107379) 2026-07-14 03:27:45 -07:00
Jason (Json)
01a7f4fb3f feat(ui): add images and model selection to new sessions (#107358)
Merged via squash.

Prepared head SHA: cf99b5bab5
Co-authored-by: fuller-stack-dev <263060202+fuller-stack-dev@users.noreply.github.com>
Co-authored-by: fuller-stack-dev <263060202+fuller-stack-dev@users.noreply.github.com>
Reviewed-by: @fuller-stack-dev
2026-07-14 04:14:01 -06:00
Peter Steinberger
e052d122d6 fix(ui): make scrollbars contextual (#107349) 2026-07-14 03:06:28 -07:00
Peter Steinberger
8ea5ee2f17 refactor(terminal): unify bounded buffers (#107337)
* refactor(terminal): unify bounded buffers

* refactor(terminal): tighten buffer closure

* refactor(terminal): keep buffer policy private
2026-07-14 03:04:37 -07:00
Peter Steinberger
cd7290bc29 fix(discord): show only agent status in progress drafts (#107338)
* fix(discord): show agent status only in progress drafts

* test(discord): preserve explicit progress label expectation

* test(telegram): update default progress label fixtures

* test(ui): use supported hidden-label assertions
2026-07-14 02:52:01 -07:00
Dallin Romney
561cf56c53 refactor(workboard): share control ui contract (#102271)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-14 02:33:22 -07:00
snowzlmbot
e8ad0466ff fix: render assistant transcript headers safely (#99404)
* fix: render assistant transcript headers safely

Co-authored-by: snowzlmbot <293528334+snowzlmbot@users.noreply.github.com>

* fix(markdown): nest crossing annotation spans

* fix(markdown): protect final transport projections

* refactor(markdown): split transcript render ownership

* test(ui): cover assistant transcript render flag

* refactor(markdown): keep transcript helpers private

* docs(changelog): note assistant transcript headers

* chore(plugin-sdk): refresh transcript annotation baseline

* fix(markdown): harden final transcript projections

* docs(changelog): defer transcript note to release

* refactor(markdown): centralize HTML tokenization

* fix(markdown): satisfy lint gates

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: snowzlmbot <293528334+snowzlmbot@users.noreply.github.com>
2026-07-14 02:25:37 -07:00
Peter Steinberger
d169dc4a12 feat(ui): hover preview of latest tasks on the running-tasks status row (#107297)
* feat(ui): add hover preview popover to running-tasks status row

* chore(ui-mock): exercise finished tasks and status-preview overflow in background-tasks mock

* refactor(ui): move status row into chat-background-tasks-status module (LOC ratchet)

* test(ui): add statusRowId to background-tasks props fixtures

* chore(i18n): record statusPreviewMore fallback baseline

* chore(i18n): sync locale bundles for statusPreviewMore
2026-07-14 01:57:30 -07:00
Peter Steinberger
625d859938 test(ci): harden scheduled release probes (#107272)
* test(ci): harden scheduled release probes

* docs(agents): record testbox warmup failure

* test(wizard): avoid Promise executor return
2026-07-14 01:48:10 -07:00
Peter Steinberger
89f53f1c38 fix(terminal): keystrokes typed while a terminal opens are lost; node PTY relay lifecycle races (#107214)
* fix(terminal): harden node PTY relay and terminal session lifecycle

Pin node relay invokes to the authorized node connection (ROUTE_CHANGED
guard), stop node-side input writes to settled/dead PTYs, finalize
sessions on resize failure like write failure, keep surrogate pairs
intact across scrollback and relay prelude truncation, bound the relay
pre-registration output buffer, and buffer Control UI keystrokes typed
while terminal.open/attach is in flight so slow node-relay opens no
longer drop input. Correct the terminal.data seq doc to its real
contract and pin seq monotonicity, seq-gap bounds, input coercion, and
runner event routing with new tests.

* refactor(terminal): extract startup input buffer and fix CI findings

Move Control UI startup input buffering into terminal-startup-input.ts
(LOC budget), drop a stale session-manager comment, remove a map
spread, and fix test typings for event frames and typed mock access.
2026-07-14 01:22:22 -07:00
Peter Steinberger
47d37804a8 improve(ui): catch i18n catalog drift locally (#107253)
* ci(ui): verify i18n catalogs locally

* fix(ui): preserve scoped i18n sync errors

* refactor(ui): share i18n raw-copy verifier

* test(ui): cover i18n lint gate

* fix(ui): route lint threads to oxlint
2026-07-14 01:12:36 -07:00
Peter Steinberger
b940339c32 fix: use plain agent progress labels (#107260)
* fix(channels): simplify agent progress labels

* chore: keep changelog release-owned

* chore: refresh bundled channel metadata
2026-07-14 01:00:24 -07:00
Peter Steinberger
644d4c3d23 fix: explain and control native session discovery (#107162)
* fix: make native session discovery configurable

* refactor: split native session discovery helpers

* chore: keep release notes in PR body

* fix: refresh generated session protocol models

* test(ui): avoid shared lazy-element mock race
2026-07-14 00:18:18 -07:00
Peter Steinberger
5a7184e3e3 fix(ui): remove duplicate New Session rows (#107198)
* fix(ui): simplify agent switcher rows

* chore: keep release changelog owner-only

* test(ui): isolate lazy MCP preview module

* style(ui): format lazy preview isolation
2026-07-14 00:05:15 -07:00
Peter Steinberger
c44b854e8e refactor(ui): use task-list token contract 2026-07-13 23:29:14 -07:00
xingzhou
46457b3610 fix(ui): Sessions filters silently accept trailing text (#107072)
* fix(ui): reject partial session filter values

* fix(ui): validate session filters strictly

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-13 22:22:20 -07:00
Peter Steinberger
d8d2f83cc1 feat(terminal): open Codex/Claude catalog sessions in a terminal on their owning host
Catalog session rows (sidebar context menu + click), the built-in viewer
header, and a new "Open Codex/Claude sessions in" preference can launch the
native CLI (codex resume / claude --resume) in the operator terminal on the
machine that owns the session.

- Gateway-local sessions spawn through the existing terminal launch policy
  (sandbox/enabled gates preserved) with the resume command in the session cwd.
- Paired-node sessions run through a new seq-ordered node PTY relay: a
  duplex node-host command streams PTY output via node.invoke.progress and
  receives keystrokes/resize via a new node.invoke.input event, behind the
  unchanged terminal.* client protocol (TerminalSessionManager gains a backend
  abstraction; node relay reuses the streaming-invoke controller).
- Owner boundary: each plugin owns its resume command and builds argv from a
  validated thread id; the gateway routes node opens through the node command
  allowlist and plugin invoke policy (no advertisement-only trust), and nodes
  re-verify session eligibility before spawning.
- UI setting catalogOpenTarget + canOpenTerminal capability gate every entry
  point; capability requires the owning host to actually have the CLI.

Node PATH is normalized before command-availability probes, Windows .cmd/.bat
shims spawn via ComSpec, and catalog terminal opens reattach persisted tabs
before opening the new tab.
2026-07-13 22:20:50 -07:00
Peter Steinberger
cac097946d feat(ui): devices card action redesign + in-page removal confirm (#107123)
* feat(ui): redesign devices card actions and fix silent stale cleanup

* fix(ui): show device id in removal prompt; keep device glyphs page-local

* fix(ui): drop pending removal prompt on connection reset

* fix(ui): sync device removal prompt locales; attach devices view test containers

* chore(i18n): sync locale bundles for device removal prompt
2026-07-13 22:07:39 -07:00
Peter Steinberger
a6094900b6 fix(ui): stop Raw config editor asking users to switch to Raw (#107116)
* fix(ui): hide form warning in raw config mode

* chore: keep release notes out of fix PR
2026-07-13 21:56:45 -07:00
Peter Steinberger
05fb55eb7b feat: discover OpenCode and Pi sessions on paired nodes (#106941)
* feat(sessions): add opencode and pi catalogs

* fix(sessions): satisfy catalog lint

* fix(sessions): validate pi storage paths

* fix(sessions): index growing pi transcripts

* refactor(sessions): split pi path resolution

* docs(sessions): refresh catalog map

* refactor(sessions): privatize pi catalog internals

* fix(sessions): validate node catalog payloads

* fix(sessions): harden external catalog discovery

* fix(sessions): normalize catalog transcript data

* refactor(gateway): keep node scope gate compact

* fix(opencode): reject option-like session ids

* fix(sessions): align external id validation
2026-07-13 21:45:53 -07:00
Peter Steinberger
889b4f7dcf fix(control-ui): rotate branded progress labels (#107111)
* fix(control-ui): rotate branded progress labels

* chore: keep progress note in PR body
2026-07-13 21:42:35 -07:00
Peter Steinberger
861d1d5d53 fix(ui): lock the app root scroll in every host, not just standalone PWAs (#107102)
* fix(ui): lock the app root scroll in every host, not just standalone PWAs

* fix(ui): size mount fallback scroller to the visible viewport
2026-07-13 21:37:37 -07:00
Peter Steinberger
d45dd28df6 fix(ui): match settings controls to scene styling (#107109)
* fix(ui): match settings controls to scene styling

* chore: leave release notes to release automation
2026-07-13 21:34:48 -07:00
Peter Steinberger
f69e1263d3 fix(ui): restore reload history and bundled icons (#106981)
* fix(ui): restore chat history after reload

* refactor(ui): keep chat pane within size limit

* test(ui): satisfy chat pane lint

* fix(ui): allow bundled Web Awesome icons
2026-07-13 21:20:34 -07:00
sebastian-openclaw
a61f6b75ab fix(ui): restore custom avatar after session switches (#106553)
* fix(ui): restore assistant avatar after session switch

* fix(ui): rerender pane after avatar refresh

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-13 19:20:06 -07:00
Peter Steinberger
c29ad5f02d improve(ui): drop page subtitles from settings and hub headers (#106954)
* improve(ui): drop page subtitles from settings and hub headers

The one-line page subtitles restated the nav label the user just
clicked ('Channels and settings.') while sections and rows already
carry contextual descriptions; every header now reads title-only,
matching the settings design language reference. Subtitle strings stay
in app-navigation for settings-search matching and the sidebar search
blocks. Removes the now-unused .page-sub rule.

* fix(ui): give Skills and Skill Workshop route-specific page titles

* chore(ui): drop unused configPageSubtitle helper
2026-07-13 18:14:41 -07:00
Peter Steinberger
18a452055f feat(control-ui): show compaction savings and run time (#106921)
* feat(control-ui): show compaction savings and run time

* fix(control-ui): satisfy locale and export checks

* fix(control-ui): refresh locale metadata
2026-07-13 18:07:33 -07:00
Peter Steinberger
8590655190 refactor(ui): use Web Awesome controls throughout Control UI (#106865)
* refactor(ui): add Web Awesome foundation

* refactor(ui): migrate shared menus and chat controls

* refactor(ui): migrate page controls to Web Awesome

* refactor(ui): migrate workboard controls to Web Awesome

* fix(ui): harden Web Awesome interactions

* test(ui): type Web Awesome dropdown state

* fix(ui): preserve menu focus and selection

* fix(ui): restore agent picker focus

* fix(ui): track keyboard menu dismissal

* fix(ui): ignore stale session menu closes

* fix(ui): complete Web Awesome keyboard migration

* fix(ui): repair Web Awesome lockfile graph

* docs(ui): keep release note in PR body

* fix(ui): satisfy Web Awesome migration gates

* perf(ui): keep Web Awesome theme in startup stylesheet

* fix(ui): replace reopened Web Awesome session menus

* fix(ui): keep replacement session menus open
2026-07-13 17:46:28 -07:00
Peter Steinberger
333281e516 fix(ui): retain settings route across queued patches (#106901)
* fix(ui): retain settings route across queued patches

* test(ui): model queued session patch waits

* test(ui): keep patch queue option internal
2026-07-13 17:13:45 -07:00
Peter Steinberger
e5cc956734 fix(ci): satisfy UI LOC ratchet (#106915) 2026-07-13 17:05:09 -07:00
Peter Steinberger
345083a5ab fix(ui): uniform 32px control height across settings clusters (#106898)
Inputs (41px), buttons (30-38px), and segmented switches (33px) sat at
mixed heights inside the same settings rows and toolbars. All controls
in settings clusters now share --settings-control-height (32px), and
the eight remaining native selects (cron filter popover, model-provider
default/fallback pickers, usage session sort) adopt .settings-select.
Row control clusters wrap only at mobile widths where they have a
definite width (Chromium collapses wrappable shrink-to-fit flex
containers to their widest item).
2026-07-13 16:42:31 -07:00
Peter Steinberger
d6d09293c2 fix(ui): preserve model provider route provenance (#106872)
* fix(ui): preserve model provider route provenance

* fix(ci): repair current-main quality gates
2026-07-13 16:31:28 -07:00
Peter Steinberger
cf8b57e7d0 feat(skills): scan session history for workshop ideas (#106766)
* feat: scan past sessions for skill proposals

* feat(ui): add progressive skill history scans

* fix(ui): keep skill history scans synchronized

* refactor: split skill history scan ownership

* style: fix mock helper formatting

* style: format skill history scan

* build: refresh skill history schema baselines

* build: refresh plugin SDK baseline after rebase

* perf(ui): keep startup request budget bounded

* fix(skills): satisfy history scan integration gates

* fix(ui): bound control ui startup chunks

* build: refresh plugin SDK API baseline

* build(ui): refresh self-learning translation memory

* refactor(ui): split skill workshop state

* fix(ci): refresh skill workshop gates

* fix(ci): satisfy skill history lint

* build: refresh plugin SDK baseline after main rebase
2026-07-13 16:15:50 -07:00
Vincent Koc
a010a2e0a3 refactor(ui): remove unused channel wizard getter (#106878) 2026-07-14 07:01:44 +08:00
xingzhou
88a45fe495 fix(chat): keep large paste previews Unicode-safe (#106328) 2026-07-13 16:00:18 -07:00
Peter Steinberger
4319ddbe8c feat(control-ui): import Codex and Claude Code memory (#106406)
* feat(control-ui): import coding assistant memory

* test(migrate): clean memory import temp dirs

* chore: move memory import note to PR body

* build: refresh memory import generated artifacts

* fix(control-ui): complete memory import checks

* build(control-ui): localize memory recovery labels

* fix(control-ui): harden memory import recovery

* refactor(migrate): keep memory import surfaces bounded

* fix(control-ui): use canonical agent row type

* fix(codex): drop dead migration type exports

* fix(migrate): restrict imported memory permissions

* fix(control-ui): preserve memory import recovery state

* fix(control-ui): retain memory import results

* build(control-ui): preserve translation memory history

* fix(control-ui): bind memory import state to agent

* fix(control-ui): unlock memory import after refresh

* test(gateway): preserve memory method suffix

* fix(migrate): bind reviewed memory imports

* fix(migrate): make memory imports retry-safe

* perf(ui): keep memory import lazy

* build: refresh generated artifacts after rebase

* chore: keep migration runtime within LOC guard

* build: refresh Swift protocol model
2026-07-13 15:30:06 -07:00
Peter Steinberger
70833dab7f ci: scope PR Node tests to changed targets (#106633)
* ci: scope PR Node tests to changed targets

* ci: bound targeted Node test plans

* test: cover changed path manifest input

* fix(ui): preserve model providers lazy boundary

* ci: cover public SDK re-export consumers

* ci: reject unresolved changed test targets

* ci: cover public SDK wrapper imports

* ci: preserve global checks in targeted plans

* docs(ci): clarify targeted boundary coverage

* test(plugins): declare computed runtime dependencies
2026-07-13 15:26:02 -07:00
Peter Steinberger
00b38ebc20 feat(web): show session branch row for local changed files (#106835)
* feat(web): show session branch row for local changed files

The pre-PR branch row above the composer only appeared once the branch
was pushed and ahead of the default branch. Sessions with local work
(committed, uncommitted, or untracked changes) showed nothing.

The gateway now emits the branch payload whenever the working tree has
changed files vs the default-branch merge base; createUrl is withheld
until GitHub's pull/new page has something to compare, and the UI only
renders the Create PR link when it is present.

* refactor(gateway): keep control-ui-session-prs under LOC ratchet

* docs(gateway): note explicit-base diff counts conflict paths
2026-07-13 15:17:37 -07:00
Peter Steinberger
3c58dba07b refactor(ui): privatize chat settings patch tracker (#106842) 2026-07-13 14:58:59 -07:00
Peter Steinberger
908230a537 fix(ui): keep tool-only turn details visible (#106791)
* fix(ui): keep tool-only turn details visible

* refactor(ui): keep tool card component size neutral

* style(ui): format tool turn e2e test

* chore: leave release notes to release automation
2026-07-13 14:42:09 -07:00
Peter Steinberger
030e7b9121 test(ui): deduplicate MCP security coverage (#106762)
* fix(ci): repair checks after dead export cleanup

* fix(ci): classify SQLite schema and migration boundaries

* fix(ci): avoid duplicate SQLite guard classification
2026-07-13 14:40:17 -07:00
Peter Steinberger
2d362a9b01 fix(ui): show mock task transcripts (#106774) 2026-07-13 14:39:47 -07:00