Commit Graph

5450 Commits

Author SHA1 Message Date
Peter Steinberger be2f7c6a3d perf(test): speed up Tasks page state observations (#127121) 2026-08-21 01:58:21 -07:00
Peter Steinberger 627f862e8e perf(test): speed up new-session model control observations (#127101) 2026-08-21 01:20:01 -07:00
Peter Steinberger 0a0d343cf2 fix(ui): refresh active agent file content (#127086)
Amp-Thread-ID: https://ampcode.com/threads/T-01a021f4-b547-7788-a916-d4a94cbd3e3b

Co-authored-by: Amp <amp@ampcode.com>
2026-08-21 01:13:55 -07:00
Peter Steinberger 8ac7dd254c perf(test): speed up model provider page observation polling (#127085) 2026-08-21 00:40:36 -07:00
Peter Steinberger 46d09d1a28 perf(test): speed up Agents page observation polling (#127063) 2026-08-20 23:55:44 -07:00
Shakker faa1cfc598 fix(ui): associate steering work by target run (#126997) 2026-08-21 07:45:40 +01:00
Shakker b2d49afd8e fix(ui): collapse completed pre-steer work 2026-08-21 07:45:40 +01:00
Shakker d15f570742 fix: dismiss sidebar session menu tooltip (#127044)
Dismiss the sidebar session tooltip whenever its overflow menu opens, preserving unobstructed menu actions and stable row semantics.

Refs #127039.
2026-08-21 07:14:13 +01:00
Peter Steinberger f14cf6b910 perf(test): speed up pairing access polling (#127047) 2026-08-20 23:02:46 -07:00
Peter Steinberger bed80ee645 fix(cron): reject malformed condition scripts before saving (#127004)
* fix(cron): reject malformed condition triggers

Validate newly authored cron condition scripts before persistence, return actionable Gateway errors, and preserve maintenance of malformed triggers shipped in existing releases.

* fix(cron): reject blank condition triggers
2026-08-20 22:42:06 -07:00
Vyctor H. Brzezowski 6c667989a8 fix(ui): soften active split-pane indication (#126714)
* fix(ui): soften active split-pane indication

* fix(ui): scope split-pane attenuation to split layout

* fix(ui): refine split-pane visual hierarchy

* test(ui): establish active split pane in visual proof

* test(ui): activate split pane through its header

* style(ui): format split-pane selectors

* fix(ui): preserve inactive split-pane controls

* fix(ui): finalize inactive split-pane styling

* fix(ui): preserve inactive split-pane actions

* Revert "fix(ui): preserve inactive split-pane actions"

This reverts commit 2cadd21346.

* fix(ui): keep inactive split-pane status visible

* fix(ui): restore approved split-pane treatment

* fix(ui): keep inactive placement status visible
2026-08-21 02:41:32 -03:00
Peter Steinberger e7cfff2167 feat(control-ui): stream live draft previews in the typing indicator (#126994)
* feat(control-ui): stream live draft previews in the typing indicator

Multi-identity sessions now show what a teammate is typing, not just that
they are typing: the composer's per-keystroke session.typing sends carry a
bounded tail of the draft (optional preview field, 400 code points max),
the gateway throttle re-emits on changed payloads at 250ms (boolean-only
stays at 1s, trailing edge keeps the latest draft), and the transcript
renders a per-actor bubble with the live text plus a blinking caret.
Actors without preview data keep the three-dot bubble.

Previews are ephemeral presence: never persisted, never part of the
session transcript or model context, excluded from aria-live regions, and
gated by the existing >=2-live-viewers, sharing-role, and incognito
checks. No new config surface.

* chore(protocol): regenerate Swift gateway models for typing preview

* fix(gateway): aggregate typing previews across same-actor connections

A boolean-only session.typing update from a second connection of the same
actor (another tab or device) erased their live draft preview, because
typing liveness aggregated per actor while the broadcast preview came only
from the latest request. Preview aggregation now lives with the connection
aggregation owner: updateTypingConnections tracks per-connection previews
and returns the newest non-empty preview among live connections, so the
broadcast keeps the active draft until its connection stops or expires.

Regression fails pre-fix (event lost its preview field).
2026-08-20 22:30:41 -07:00
Peter Steinberger 6f52e9fc2f fix(telegram): preserve direct-message topics in config and cron writeback (#127010)
* fix(telegram): preserve direct message topics in target writeback

* test(ui): consolidate cron scheduler status coverage
2026-08-20 22:27:10 -07:00
Peter Steinberger 3cf33583db perf(test): speed up lazy UI lifecycle polling (#127025) 2026-08-20 22:22:58 -07:00
Peter Steinberger 5de08664ac improve(ui): skip discarded workspace loading during first-run setup (#126967)
* perf(ui): defer workspace loading during first-run setup

Wait for the initial model-setup decision before starting the default Chat router, and load workspace chrome only when a workspace route is visible.

Keep the existing loading mascot visible while the Gateway decides the first-run destination.

Amp-Thread-ID: https://ampcode.com/threads/T-01a021f4-76a1-76f1-8758-25d0466913af

* fix(ui): release first-run gate on terminal connect failure

Amp-Thread-ID: https://ampcode.com/threads/T-01a021f4-76a1-76f1-8758-25d0466913af

* fix(ui): dedupe sidebar lazy preload

Amp-Thread-ID: https://ampcode.com/threads/T-01a021f4-76a1-76f1-8758-25d0466913af

---------

Co-authored-by: Amp <amp@ampcode.com>
2026-08-20 22:20:12 -07:00
Peter Steinberger da18d2f335 test(ui): split the oversized cron view suite to unbreak main (#127018)
`main` is red: `check-lint-core-5` fails with

    ui/src/pages/cron/view.test.ts
      1124:4  error  File has too many lines (1004).  eslint(max-lines)

The file has been growing for a while (1104 lines at fa75cdd01c, 1116 at
2acfc47b7f) and crossed the 1000 code-line cap at a4b3f63a87 (#126945). Every
PR opened since inherits the failure, so this is not any one PR's fault to fix
in passing -- it blocks the merge gate for everyone.

Repo policy forbids a `max-lines` suppression, so the file is split along the
seam it already had: three top-level describes, one of which was two thirds of
the file. `cron view editor` moves to `view.editor.test.ts`; `cron view list
pane` and `cron view selects` stay in `view.test.ts`. The four DOM helpers the
blocks shared move into the existing `view.test-support.ts` sibling rather than
being duplicated, and each file imports only what it uses.

No test content changed: 42 tests before, 42 after, same 41 `it(` declarations.
Sizes drop to 373 / 721 / 143 lines, all well under the cap.
2026-08-20 22:06:18 -07:00
Peter Steinberger a4b3f63a87 fix(ui): use active scheduler trigger capability (#126945)
Control UI automation trigger authoring now reflects the running scheduler across unsaved and saved-but-unapplied config edits and reconnects.
2026-08-20 21:28:44 -07:00
Peter Steinberger 2acfc47b7f fix(ui): expose all automation schedule filters (#126962)
* fix(ui): expose all automation schedule filters

Amp-Thread-ID: https://ampcode.com/threads/T-01a021f4-b547-7788-a916-d4a94cbd3e3b

* refactor(ui): derive cron filters from protocol

Amp-Thread-ID: https://ampcode.com/threads/T-01a021f4-b547-7788-a916-d4a94cbd3e3b

---------

Co-authored-by: Amp <amp@ampcode.com>
2026-08-20 21:10:49 -07:00
openclaw-mantis[bot] bafa32fd54 chore(ui): refresh control ui locales (#126927)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-08-20 20:03:25 -07:00
Josh Lehman b6bf9a7154 fix(ui): preserve active commentary on steer (#126886)
Control UI now preserves active-run commentary and tool progress when a follow-up steers the same run, while fresh sends still clear stale projection state.

Fixes #126938.
Reviewed-by: @shakkernerd
2026-08-21 04:01:29 +01:00
Peter Steinberger ee337708de fix(ui): label composer textareas (#126952)
Amp-Thread-ID: https://ampcode.com/threads/T-01a021f4-b547-7788-a916-d4a94cbd3e3b

Co-authored-by: Amp <amp@ampcode.com>
2026-08-20 19:54:49 -07:00
Dallin Romney 56e32bb723 fix(ui): surface onboarding memory import load failures (#126738) 2026-08-20 19:10:54 -07:00
Peter Steinberger ab2bbd42df test: trim UI and tooling test seams (#126937) 2026-08-20 19:04:18 -07:00
Sasan 034325d3e2 fix(ui): surface provider-usage failures instead of silent empty panels (#120309)
* fix(ui): surface provider-usage failures instead of empty panels

* fix(ui): complete typed route-data fixtures and stop reporting cancelled usage requests as failed

- Add providerUsageUnavailable to the five UsageRouteData fixtures in
  gateway-source-replacement.test.ts; check-test-types passes again.
- requestProviderUsage reports failed only for non-cancelled rejections; an
  aborted request is the caller superseding its own load, not an outage.
- Cover answered, failed, and cancelled outcomes.

* chore(ui): keep ProviderUsageFetch local to its module

* fix(ui): clear the provider failure flag when an aggregate usage load fails

- A failed aggregate refresh says nothing about provider usage; the stale
  flag no longer keeps claiming the last provider request failed after a
  later usage.cost or sessions.usage rejection.
- Sequential regression: usage.status failure, then an aggregate failure,
  ends with the flag cleared.

* test(ui): type the usage route data on the test element

* test(ui): cover provider usage request outcomes

* fix(ui): model provider usage request outcome

* fix(ui): preserve provider usage outcomes

* fix(ui): resolve provider usage build
2026-08-20 18:15:14 -07:00
Peter Steinberger 91b8a03453 fix(ui): recover failed new-session navigation without duplicate tasks (#126873)
* fix(ui): preserve committed sessions when chat navigation fails

* test(ui): keep committed-session retry fixtures fully typed
2026-08-20 16:27:26 -07:00
Peter Steinberger 96cb0b9b49 fix(ui): retire stale tools and skills after reconnects (#126826) 2026-08-20 13:47:31 -07:00
openclaw-mantis[bot] ddf73d4ca2 chore(ui): refresh control ui locales (#126614)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-08-20 13:16:10 -07:00
ZYV5ge adc608401e fix(control-ui): queue distinct repeated submissions instead of dropping user actions (#118884)
* fix(control-ui): preserve distinct identical chat submissions

Co-authored-by: ZYV5ge <39863830+ZYV5ge@users.noreply.github.com>

* fix(control-ui): keep submission guard key immutable

Co-authored-by: ZYV5ge <39863830+ZYV5ge@users.noreply.github.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-20 12:53:08 -07:00
Dinesh H Suthar 8beae99ed0 fix(ui): hydrate ClawHub verdicts on initial skills route (#110166)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-20 12:19:05 -07:00
Peter Steinberger ee7146a282 fix(ui): make startup gzip runtime-independent (#126795)
Host zlib versions compress identical startup assets into different bytes, causing false Linux budget failures. Emit canonical shipped pako gzip sidecars, restore the 512 B ratchet tolerance, and lower the startup baseline from 348351 B to 344531 B.
2026-08-20 12:00:01 -07:00
Peter Steinberger 0d555266e4 refactor(nodes): retire legacy runner inventory parsing (#126773) 2026-08-20 11:53:00 -07:00
ClawSweeper 8b78e07d3d fix(ui): compact Guardian review rationale (#126778)
Co-authored-by: RoboClaw <309084314+roboclaw-bot@users.noreply.github.com>
2026-08-20 11:25:52 -07:00
Peter Steinberger 8efbf7ce00 fix(ui): session hovercards stop replaying unchanged PR status (#126726)
* perf(ui): avoid replaying unchanged session PR subscriptions

* test: ratchet assertion safety baseline

* test(ui): assert service worker update outcomes

* test(slack): avoid wall-clock rate-limit assertion
2026-08-20 11:11:40 -07:00
Peter Steinberger 7f9a46ea82 fix(gateway): recover chat when session subscriptions stop responding (#126760)
* fix(gateway): prevent stalled session subscriptions from freezing chat

* fix(gateway): retire timed-out session subscription leases

* fix(gateway): preserve subscription recovery failure cause
2026-08-20 11:06:26 -07:00
Colin Johnson 64b0e865df fix(ui): keep attributed avatars beside sent messages (#112472)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-20 10:50:17 -07:00
Peter Steinberger 9dc391c75b perf(ui): keep config render helpers lazy (#126754)
Restore the cross-platform Control UI startup gzip budget by keeping render-only sensitive-path helpers outside the startup config-draft graph. Preserve existing behavior and caller APIs while moving generic schema, search, and path helpers to their existing startup owner.
2026-08-20 10:22:55 -07:00
Peter Steinberger 695c16b7bc fix(ui): stop provider probes after agent selection changes (#126750) 2026-08-20 10:21:57 -07:00
Peter Steinberger 62ed43dfd0 fix(ui): keep ad hoc visualizations inline and readable (#126729)
* fix(ui): keep ad hoc visualizations readable

* perf(ui): preserve startup bundle budget
2026-08-20 10:05:21 -07:00
Peter Steinberger bbbd70542b feat(sessions): recover offline device placements (#126284)
* feat(sessions): recover offline device placements

* chore(protocol): refresh session placement models

* perf(ui): lazy-load session placement recovery

* test(ui): remove dropdown timing assertion

* test(ui): await committed cloud recovery route

* fix(sessions): complete explicit abandonment locally

* fix(sessions): fence lists by runner availability

* fix(ui): preserve canonical session freshness

* fix(sessions): preserve recovery contracts after rebase

* test(ui): await durable cloud recovery entry

* test(gateway): complete current runner fixtures

* fix(gateway): publish runner availability edges

* fix(ui): preserve shared session freshness

* fix(ui): preserve canonical sidebar session state

* fix(sessions): preserve abandoned partials and run-owned replies

* fix(sessions): resume durable abandonment retries

* test(gateway): compose provisioning replay with runner availability

* fix(sessions): publish recovered move transitions
2026-08-20 09:59:59 -07:00
Peter Steinberger 7975432eb5 fix(onboard): enable Runway and Alibaba video provider authentication (#126722)
* fix(onboard): enable Runway and Alibaba video provider authentication

* perf(ui): load image lightbox only when opening images

* perf(ui): defer onboarding memory import outside setup
2026-08-20 09:30:48 -07:00
Peter Steinberger fa75cdd01c fix(ui): validate automation condition triggers (#126718) 2026-08-20 09:02:48 -07:00
Hiroshi Tanaka 55f1738d50 fix(control-ui): config form save corrupts 64-bit id strings in string|number fields (#126402)
* fix(control-ui): stop config form save from corrupting 64-bit id strings

Saving the schema-driven config form coerced every numeric-looking string
to a JS number before submission. For union-typed fields such as
tools.elevated.allowFrom.* (anyOf: string | number), string entries
holding 64-bit ids (Discord/Telegram snowflakes) were rewritten through
Number(), which rounds past 2^53:
"1048113311314608148" -> 1048113311314608100. The corruption also hit
untouched fields, because serialization coerces the whole form, so merely
saving an unrelated setting silently broke elevated-approval allowlists
(fail-closed: the real user id no longer matched).

Two guards fix this:
- coerceFormValues keeps a string that already satisfies a string variant
  of an anyOf/oneOf union instead of parsing it into another variant's
  number.
- coerceConfigFormNumberString refuses lossy integer parses: plain
  integer text beyond Number.MAX_SAFE_INTEGER that does not round-trip
  through BigInt stays a string, so pure number/integer fields fail
  validation loudly instead of storing a corrupted id.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(control-ui): harden 64-bit config id preservation

* fix(control-ui): validate mixed-union scalar branches

* test(control-ui): prove real gateway id preservation

* test(control-ui): use communications route for config proof

* test(control-ui): grant config proof admin scope

* test(control-ui): reopen raw config for proof

* fix(control-ui): preserve explicit union input types

* test(control-ui): exercise union collection draft

* ci: retry flaky control ui e2e

* fix(control-ui): preserve mixed scalar branch types

* ci: retry service worker e2e

* fix(control-ui): preserve typeless string union branches

* fix(control-ui): reject lossy decimal coercion

* fix(control-ui): reject lossy pure numeric input

* fix(control-ui): preserve exact numeric branch semantics

* ci: retry checkout rate limit

* ci(control-ui): capture real gateway proof

* test(control-ui): frame config proof values

* ci: retry checkout download

* test(control-ui): prove Gateway-served production bundle

* fix(control-ui): preserve exact incremental union edits

* refactor(control-ui): isolate scalar edit session state

* fix(control-ui): keep scalar edit branch type internal

* fix(control-ui): avoid detached focus selector

* fix(control-ui): round-trip exact numeric branches

* refactor(control-ui): share exact scalar formatting

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-20 08:50:24 -07:00
ClawSweeper 8c6c7a30cf improve(ui): make mobile image previews zoomable (#126528)
* improve(ui): make mobile image previews zoomable

* fix: harden mobile image viewer

---------

Co-authored-by: RoboClaw <309084314+roboclaw-bot@users.noreply.github.com>
Co-authored-by: Shakker <shakkerdroid@gmail.com>
2026-08-20 16:39:49 +01:00
SunnyShu 9bba88dbba fix(tasks): rank terminal tasks by completion and keep Recent terminal-only (#123219)
* fix(tasks): rank terminal tasks by completion and keep Recent terminal-only

- updateTaskStateByRunId backfills lastEventAt from endedAt for terminal
  finalizers (mirrors markTaskTerminalById), keeping activity monotonic
- both taskUpdatedAt projections rank terminal tasks by the maximum
  available activity timestamp, healing stale rows while preserving later
  delivery/terminal-outcome events recorded after completion
- Tasks page Recent fetch filters to terminal statuses so queued/running
  rows cannot starve the Recent section

Related to #100911

* refactor(tasks): normalize completion at registry owner

Absorb terminal timestamp ordering into the canonical registry lifecycle boundary, remove duplicated projection and writer policy, and prove Recent remains visible behind 200 active tasks in Chromium.

Co-authored-by: SunnyShu0925 <shu.zongyu@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-20 08:38:57 -07:00
Peter Steinberger 36ca7df091 fix(test): use activated service worker build signal (#126584) 2026-08-20 08:29:50 -07:00
Peter Steinberger 974917f520 fix(ui): keep pending approvals visible throughout Settings (#126698) 2026-08-20 08:10:06 -07:00
Peter Steinberger 855599d7e9 fix(ui): keep sidebar icon endcap intact in single-line session rows (#126567)
With message preview off, rows collapse to one line and the second-row icon
logic (spinner, unread dot, badges, facepile, trail) rides beside the title.
Two defects broke that:

- Long titles crushed the icon endcap: the single-line title used flex-basis
  auto, so overflow shrink was distributed onto the endcap (24px -> ~7px),
  clipping the status icons. Basis 0 now mirrors the two-line subtitle
  contract: text absorbs all shrink before icons do.
- Native catalog session rows always rendered the two-line skeleton with an
  empty details line (46px vs 30px) and never collapsed, in both preview
  modes. Catalog rows never carry preview text, so they are now always
  single-line.

Regression coverage: long-title endcap geometry in
chat-flow.sidebar-presentation.e2e.test.ts (fails pre-fix), and
codex-sessions.e2e.test.ts density assertions updated to the new
all-single-line contract.
2026-08-20 07:37:21 -07:00
ClawSweeper 267ffc4754 feat(ui): manage automation condition triggers (#126534)
* feat(ui): manage cron condition triggers

* test(models): isolate ambient CLI availability

Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>

---------

Co-authored-by: RoboClaw <309084314+roboclaw-bot@users.noreply.github.com>
Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>
2026-08-20 07:20:01 -07:00
Peter Steinberger fae9bd6baf fix(ui): refresh mixed-role node status (#126677) 2026-08-20 06:49:58 -07:00
Vyctor H. Brzezowski 5e6b29d23a fix(ui): keep peer identity stable when actions appear (#126287)
* fix(ui): keep peer identity stable when actions appear

* fix(ui): keep mobile peer actions trailing
2026-08-20 10:30:14 -03:00