Commit Graph

5428 Commits

Author SHA1 Message Date
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
Peter Steinberger c8f88a8b38 fix(ui): recover newer builds after stale probes (#126628)
* fix(ui): recover newer builds after stale probes

* fix(ui): elect newest stale-build recovery target
2026-08-20 04:21:57 -07:00
Peter Steinberger 2ebe24e9b2 fix(ui): keep sidebar chat rows separated during resize (#126610) 2026-08-20 02:18:34 -07:00
Peter Steinberger 1d2986b06f fix: prevent incompatible cloud runtime dispatches (#126585)
* fix(ui): gate cloud profiles by runtime mode

* test(gateway): expect cloud placement mode

* test(gateway): keep route suite within lint budget
2026-08-20 01:31:27 -07:00
Vyctor H. Brzezowski 68ae235318 improve(ui): refine chat widget host and image actions (#125250)
* improve(ui): refine chat widget host actions

* fix(ui): keep widget pin presentation unchanged

* fix(ui): compact widget actions and restore rounded host

* style(ui): format widget action menu

* test(canvas): refresh widget host document contract

* test(ui): model the widget host wrapper

* fix(ui): preserve retained widget downloads

* fix(ci): register Codex tool coverage

* fix(protocol): keep version exports compact

* fix(ui): preserve widget action outcomes

---------

Co-authored-by: RoboClaw <309084314+roboclaw-bot@users.noreply.github.com>
2026-08-20 05:27:56 -03:00
Peter Steinberger 83978aec63 fix(ui): refresh approval history when decisions resolve (#126579) 2026-08-20 01:13:42 -07:00
Peter Steinberger 764622342c fix(ui): keep empty session groups compact (#126565) 2026-08-20 00:58:54 -07:00
Peter Steinberger 531fc9b365 fix(ui): read-only Agents identity editor stays stuck on Saving (#126568)
* fix(ui): show accurate save state for read-only agents

* test(ui): use canonical text content in agent save assertion
2026-08-20 00:48:17 -07:00
Peter Steinberger 828f1fa851 perf(test): gate lazy recovery proof capture (#126583) 2026-08-20 00:43:50 -07:00
Alix-007 2a79f74701 fix(ui): prioritize active session quota provider (#120557) (#122053) 2026-08-20 00:22:30 -07:00
Vyctor H. Brzezowski 689ab6ec82 fix(ui): contain narrated tool details (#126348)
* fix(ui): contain narrated tool details

* fix(ui): repair narrated tool details
2026-08-20 04:04:53 -03:00
Vito Cappello f612675284 fix(models): keep Claude CLI OAuth available in Control UI (#125471)
* fix(models): honor Claude CLI OAuth ownership in Control UI

Co-authored-by: XX441 <169966250+XX441@users.noreply.github.com>

* test(models): preserve OAuth fixture literal type

* fix(models): preserve persisted CLI runtime ownership

* fix(auth): discover Claude CLI credentials for Anthropic scope

* fix(models): honor CLI-owned OAuth over legacy metadata

* fix(models): migrate CLI OAuth profile ownership

* fix(models): centralize CLI metadata normalization

* fix(doctor): keep CLI migration result internal

* test(models): type CLI OAuth fixtures

* refactor(models): isolate auth status projection

* refactor(models): split auth status API key projection

* fix(auth): preserve legacy CLI metadata on failed migration

* fix(auth): retain healthy CLI OAuth migration state

* fix(doctor): type CLI migration store fallback

* test(doctor): type CLI migration store mock

* fix(models): retain non-CLI credential expiry status

* fix(models): preserve independent auth route status

* fix(models): retain independently configured alias auth

* test(ui): stabilize activity feed fixture clock

* fix(auth): preserve legacy CLI recovery metadata

* fix(auth): scope legacy CLI migration to Claude

* fix(auth): preserve MiniMax CLI expiry ownership

---------

Co-authored-by: VACInc <3279061+VACInc@users.noreply.github.com>
Co-authored-by: XX441 <169966250+XX441@users.noreply.github.com>
Co-authored-by: Patrick Erichsen <patrick.a.erichsen@gmail.com>
2026-08-19 23:05:32 -07:00
Peter Steinberger 0a8226c3db fix(ui): give embedded settings sections the shared section rhythm (#126541)
* fix(ui): give embedded settings sections the shared section rhythm

The agents tab panel hosted settings sections in a bare div, so sections
stacked with zero separation; the bespoke .agents-main margin rule in
agents.css missed the nested tabpanel entirely. Descriptions also pulled
up to 4px under control-height header actions (squeezed Verify/Save rows).

Add a .settings-stack primitive to settings.css for embedded surfaces,
use it on the agent tab panel, delete the page-local margin fork, and let
section descriptions clear action-bearing headers.

* test(agents): export getRuntimeConfigSourceSnapshot from runtime-snapshot mock

Main's checks-node-compact-large shard is red: #126531 routed
provider-model-routes through projectConfigOntoRuntimeSourceSnapshot,
which reads getRuntimeConfigSourceSnapshot, and this suite's explicit
vi.mock factory did not export it (24 failures). Return null so the
projection no-ops and resolvers keep reading the provided config.
2026-08-19 22:31:35 -07:00
Peter Steinberger f289685bf3 fix(ui): stabilize settings and update recovery E2E (#126538)
* test(ui): await settings takeover in app chrome E2E

* test(ui): assert current build after update recovery
2026-08-19 21:39:26 -07:00
Peter Steinberger 70b6f44f13 improve: one alert surface, explained by Ask OpenClaw (#126155)
* refactor(ui): unify sidebar alerts with custodian

* refactor(ui): move custodian alert state

* fix(ui): use the defined mono token in the custodian alert card

* fix(ui): break the update-watcher import cycle

Type the watcher against a structural leaf contract instead of
Pick<ApplicationContext,...>; context.ts reaches this module through
overlays-types.ts, so naming the context type closed a madge cycle.

* fix(ui): re-arm the alert explanation when an incident recurs

Failed-automation and model-auth alerts keep one incident id across
recover-then-fail-again, so an id-keyed dedupe showed the renewed alert
and never explained it. Scope ask-once to the presentation instead.
2026-08-19 21:33:31 -07:00
Vyctor H. Brzezowski 916eef4e99 fix(ui): balance completed-work spacing (#126303)
* fix(ui): balance completed-work spacing

* fix(ui): preserve touch work spacing

* fix(ui): balance touch work spacing

* fix(ui): open completed-work spacing
2026-08-20 00:17:32 -03:00
Patrick Erichsen 6eb9344e7d fix(ui): preserve dashboard side-panel selection (#126511) 2026-08-19 19:11:13 -07:00
Peter Steinberger 0a86702241 feat(github): authorize agent identities from Settings (#126474)
* feat(github): add device authorization lifecycle

* fix(github): harden device authorization lifecycle

* fix(github): refresh native tool display snapshot

* fix(github): refresh config and UI baselines

* refactor(github): break OAuth identity import cycle

* test: make gateway retry deadline assertion scheduler-safe
2026-08-19 17:41:58 -07:00
Vyctor H. Brzezowski 3aff572d74 fix(ui): dismiss session hovercard before its menu opens (#126345)
* fix(ui): dismiss session hovercard before menu

* test(ui): keep hovercard regression focused

* fix(ui): dismiss catalog session hovercards

* test(ui): use typed catalog session key
2026-08-19 21:41:25 -03:00
Vyctor H. Brzezowski 02be7fea97 improve(ui): unify resize handles (#125066)
* improve(ui): unify resize handles

* perf(ui): trim resize handle startup cost

* fix(ui): stop resize drags on blur

* perf(ui): absorb resize blur cleanup

* perf(ui): unify resize drag listener target

* refactor(ui): unify resize drag state

* perf(ui): remove duplicate resize styles

* refactor(ui): let layouts own resize edges

* fix(ui): preserve resize interaction contracts

* test(ui): satisfy resize event lint
2026-08-19 21:11:39 -03:00
Vyctor H. Brzezowski e741649856 fix(ui): keep prose fences fully visible (#126346) 2026-08-19 21:05:51 -03:00
Vyctor H. Brzezowski 16b09ad307 fix(ui): sync Terminal with live theme changes (#126297)
* fix(ui): sync terminal with live theme changes

* test(ui): cover terminal theme lifecycle

* test(ui): supply resolved theme in gateway fixture
2026-08-19 20:21:26 -03:00
Erick Kinnee ee70dbcb14 test(ui): split dynamic catalog convergence e2e test into its own file
Keeps chat-flow.models-reasoning.e2e.test.ts under the 1000-line max-lines
budget; the ratchet forbids new suppressions. The moved test is unchanged.
2026-08-20 00:11:29 +01:00