Commit Graph

3205 Commits

Author SHA1 Message Date
Peter Steinberger
084d1d9637 feat(control-ui): upload files into terminals (#107364)
* feat(control-ui): add terminal file uploads

* fix(control-ui): protect Windows terminal uploads

* fix(control-ui): satisfy terminal upload gates

* chore(ui): translate terminal upload labels

* fix(control-ui): reject unknown Windows upload shells

* fix(control-ui): harden Windows upload paths

* fix(control-ui): retry terminal upload cleanup

* chore(ui): reconcile locale translation memory

* fix(control-ui): validate terminal upload inputs

* fix(control-ui): retry failed upload cleanup

* chore(ui): refresh terminal upload locale metadata

* fix(terminal): integrate uploads with session recovery

* refactor(control-ui): isolate terminal upload transport

* fix(control-ui): keep upload helper types private
2026-07-14 09:33:39 -07:00
Peter Steinberger
f81f9d8570 chore: enforce max-lines suppression ratchet (#107315)
* ci: enforce max-lines suppression ratchet

* chore: prune stale max-lines suppression

* fix: close max-lines ratchet enforcement gaps

* fix: harden max-lines ratchet checks

* fix(ci): satisfy max-lines ratchet checks

* style: format max-lines declarations

* fix(ci): match oxlint suppression grammar

* test: isolate max-lines git fixtures

* chore: prune resolved max-lines debt

* test: skip newline path fixture on Windows

* fix: harden max-lines suppression ratchet

* chore: refresh max-lines baseline

* fix: close max-lines ratchet bypasses

* fix: derive ratchet base from PR merge tree

* fix: support older Git in staged ratchet

* fix: align max-lines declarations and baseline

* chore: refresh max-lines baseline for current main

* fix: exclude generated wizard locales from max-lines

* chore: prune resolved max-lines debt
2026-07-14 09:27:02 -07:00
Jason (Json)
c93b7ca130 fix(control-ui): prevent inflated run times and overlapping tasks (#107229)
* fix(control-ui): use wall clock for run timer

* fix(control-ui): prevent background task overlap
2026-07-14 09:44:54 -06:00
Peter Steinberger
2ecc6b6b6b fix(ui): show restart banner for unapplied config (#107577)
* fix(ui): derive config apply state from gateway

* test(ui): align applied config hash coverage

* test(ui): follow config autosave flow

* fix(ui): guard applied config refreshes

* fix(ui): reconcile patched config revisions

* fix(ui): prevent stale config apply polling

* chore: leave release notes to release flow

* refactor(config): split applied revision helpers

* style(config): format gateway methods

* fix(i18n): refresh Korean native glossary hash
2026-07-14 08:43:35 -07:00
Peter Steinberger
5087804bc8 fix(ui): use type-only test imports (#107618) 2026-07-14 08:34:09 -07:00
Peter Steinberger
9ab3d09f4d fix(terminal): recover sessions after stale Control UI connections (#107419)
* fix(terminal): harden reconnect recovery

* style(terminal): simplify recovery branch

* fix(terminal): handle session picker failures

* fix(terminal): refresh generated surfaces

* fix(terminal): translate session picker labels

* fix(terminal): ignore stale detach after rebind

* fix(terminal): preserve offsets through coalescing

* fix(i18n): refresh Korean native glossary hash

* fix(terminal): serialize picker adoption
2026-07-14 08:27:33 -07:00
Peter Steinberger
7d0db6394e refactor(ui): share native context test provider 2026-07-14 08:07:07 -07:00
Val Alexander
efc12f2e31 feat(workboard): polish drag feedback (#89821)
* feat(workboard): polish drag feedback

Co-authored-by: BunsDev <68980965+BunsDev@users.noreply.github.com>

* test(workboard): prove drag feedback in browser

* refactor(workboard): keep card rendering lean

* test(workboard): avoid drag proof shadowing

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-14 08:01:11 -07:00
tzy-17
66def08d83 feat(workboard): filter cards by persisted board (#102068)
* feat(workboard): filter cards by persisted board

Co-authored-by: 唐梓夷0668001293 <tang.ziyi@xydigit.com>

* refactor(workboard): split board filter helpers

* chore(ui): refresh Workboard i18n baseline

* chore(ui): sync Workboard locale fallbacks

* chore(ui): update Workboard locale metadata

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-14 07:25:00 -07:00
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