Commit Graph

4676 Commits

Author SHA1 Message Date
Peter Steinberger 97bd54ded7 fix(sessions): prevent failures and stale state under rapid use (#121680)
* fix(sessions): harden lifecycle reliability and listing speed

Amp-Thread-ID: https://ampcode.com/threads/T-019febfb-f949-77cd-b15b-d31d0b42d2fb

* test: repair strict type fixtures

Amp-Thread-ID: https://ampcode.com/threads/T-019febfb-f949-77cd-b15b-d31d0b42d2fb

* chore(plugin-sdk): refresh current main API baseline

Amp-Thread-ID: https://ampcode.com/threads/T-019febfb-f949-77cd-b15b-d31d0b42d2fb

* fix(ci): repair current-main validation blockers

Amp-Thread-ID: https://ampcode.com/threads/T-019febfb-f949-77cd-b15b-d31d0b42d2fb

* test(cron): preserve upstream assertion order

Amp-Thread-ID: https://ampcode.com/threads/T-019febfb-f949-77cd-b15b-d31d0b42d2fb

* fix(gateway): settle setup admission test sessions

Amp-Thread-ID: https://ampcode.com/threads/T-019febfb-f949-77cd-b15b-d31d0b42d2fb

* test(ui): sample wizard action geometry atomically

Amp-Thread-ID: https://ampcode.com/threads/T-019febfb-f949-77cd-b15b-d31d0b42d2fb

---------

Co-authored-by: Amp <amp@ampcode.com>
2026-08-10 12:58:59 -07:00
Peter Steinberger 084ed7f04b fix(ui): stabilize mobile drawer focus E2E (#121663)
* test(ui): await native drawer focus settlement

* test(ui): distinguish browser chrome focus
2026-08-10 12:56:19 -07:00
Peter Steinberger 8a5978154f fix(ui): handle keyboard context menu shortcuts (#121628)
* fix(ui): handle keyboard context menu shortcuts

* fix(ci): repair shared validation regressions

* fix(ci): repair setup admission lint

* fix(ci): settle setup admission tests
2026-08-10 12:39:22 -07:00
Peter Steinberger 519c8ed38d fix(ui): align managed image preview contracts 2026-08-10 11:47:43 -07:00
Colin Johnson 86fe45ce17 fix(control-ui): scale sidebar text with appearance setting (#121087)
Scales Control UI sidebar and navigation text with the existing Appearance preference while preserving mobile input zoom safety and bounded session-count layout.

Prepared head SHA: bafb9a2b74
Co-authored-by: Colin Johnson <211764741+Solvely-Colin@users.noreply.github.com>
Co-authored-by: Shakker <165377636+shakkernerd@users.noreply.github.com>
Reviewed-by: @shakkernerd
2026-08-10 18:29:23 +01:00
Peter Steinberger 4e5029e43b fix(ci): repair test-type breakage from generated image actions
The image-actions feature landed with an untyped fetch spy and an unknown
URL argument; newer vitest types surface both. Capture anchor downloads via
a typed mock implementation and coerce the probed block URL. Also add the
toolCallId/itemId fields to the Discord harness's stale local copies of the
onToolStart/onCommandOutput payload types (canonical type already has them).
2026-08-10 10:25:31 -07:00
openclaw-mantis[bot] e195585a90 chore(ui): refresh control ui locales (#121555)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-08-10 09:02:29 -07:00
Ittiz bad30d5a74 feat(ui): add generated image actions (#77017)
Give Control UI managed images bounded previews and shared full-image Open, Download, and Copy actions. Keep artifact access transcript-bound; the existing ticket is intentionally attachment-scoped to the lower-fidelity thumbnail.

Co-authored-by: Ittiz <github@daein.org>
Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-08-10 21:30:58 +05:30
Peter Steinberger fbebfc713f test(ui): remove retired source mirrors (#121607) 2026-08-10 07:27:48 -07:00
Peter Steinberger ebd03db156 test(ui): target canonical reconnect session refresh (#121609) 2026-08-10 07:23:02 -07:00
Shakker 98b89aaa00 test: isolate attachment rebound mock registry (#121577) 2026-08-10 16:10:19 +02:00
Shakker 3b288b4f6e test: isolate attachment rebound coverage 2026-08-10 16:10:18 +02:00
Shakker f46c3f9200 test: type MCP rebound fixture 2026-08-10 16:10:18 +02:00
Shakker 6e70f17759 fix: reactivate retained attachment panes 2026-08-10 16:10:18 +02:00
Shakker c31ccaafa4 fix: finalize late closed-pane attachments 2026-08-10 16:10:18 +02:00
Shakker 6eded1bbce fix: prevent closed pane attachment restaging 2026-08-10 16:10:18 +02:00
Shakker fb9b1aba9e fix: retain replacement attachment payload ownership 2026-08-10 16:10:18 +02:00
Shakker 607f50bece fix: preserve fallback attachment packages across remounts 2026-08-10 16:10:18 +02:00
Shakker 33bee61f2c test: cover ownerless staged attachment cleanup 2026-08-10 16:10:18 +02:00
Shakker c5a5ba2263 fix: preserve staged attachments across chat remounts 2026-08-10 16:10:18 +02:00
Peter Steinberger 3b3c540896 refactor: remove dead branches and test-only helpers (#121345)
* refactor: remove dead branches and test-only helpers

* fix: preserve codex cleanup error causes

* fix: preserve gateway error code compatibility

* chore: update plugin sdk api baseline

* docs: fix live cache runner path
2026-08-10 06:47:43 -07:00
Peter Steinberger 0d4e9f3ede fix(codex): report harness context window; compact context popover (#121491)
* fix(codex): report harness context window as session contextTokens

Codex app-server reports model_context_window per turn. Carry it through the projector into the run result meta so session rows show the real window instead of the catalog's standard-tier input cap (272k vs 1M for gpt-5.6 models).

* improve(ui): compact chat context popover

Inline stat rows replace boxed tiles; zero-value cost rows and the whole cost section when empty are omitted; provider/model provenance lines are removed because the footer already shows the model; and the popover is narrowed to 300px.

* refactor(codex): split attempt-result assembly out of event projector

* fix(codex): seed attempt context window from startup binding

App-server v2 turn/started omits the core model_context_window, so thread/tokenUsage/updated is the only live carrier. Seed usage-less attempts from the retained startup binding rollout/session window so session metadata cannot regress to the catalog fallback.

* fix(codex): prefer native startup context window

Persisted session contextTokens has no source provenance and may contain the catalog fallback. Keep the minimum window for the conservative rotation fuse, but seed the projector from the native rollout when it is available.

* chore(plugin-sdk): regenerate api baseline (new format)

* revert(gateway): "prevent restart replay after final delivery" (broke 5 CI jobs)
2026-08-10 05:52:19 -07:00
Peter Steinberger 6b565c047f feat(ui): show unsent-draft pencil on sidebar session rows (#121476)
* feat(ui): show unsent-draft pencil on sidebar session rows

Typed-but-unsent composer text now surfaces as a pencil badge on the
owning session's sidebar row (and Home row) once you switch away.
Draft persistence now notifies stored-outbox subscribers so the
indicator appears and clears live. The active session suppresses the
badge since its composer is already visible.

* chore: refresh merge ref for CI against current main

* chore: refresh merge ref against healed main

* fix(ui): notify draft indicator only on presence transitions

Unconditional notify on every draft persist let outbox-projection
subscribers re-persist a stale pane over a newer draft (chat-state
route-fallback invariant). The sidebar pencil only consumes presence,
so notify on empty/non-empty transitions only.
2026-08-10 04:53:15 -07:00
Peter Steinberger 0a6a1d9419 fix(gateway): unify media privacy in chat history (#121490)
* fix(gateway): unify media privacy in chat history

Centralize image, audio, video, and persisted media-fact privacy at the shared Gateway history projection. Remove duplicate sessions_history redaction, validate managed media claims canonically, and keep safe media-only user turns renderable.

* test(gateway): type history RPC integration

* test(agents): align history fixture with gateway projection
2026-08-10 03:30:44 -07:00
Jesse Merhi e97c3450a2 fix(ui): preserve negotiated paired cancel 2026-08-10 20:15:29 +10:00
Jesse Merhi 66a44643d4 test(ui): follow browser cursor policy 2026-08-10 20:15:29 +10:00
Jesse Merhi 29827ea0ce fix(ui): preserve disabled cancel hover 2026-08-10 20:15:29 +10:00
Jesse Merhi cf1ac91609 test(ui): assert structured receipt count 2026-08-10 20:15:29 +10:00
Jesse Merhi ce852958bd test(ui): cover mounted and receipt wizard submissions 2026-08-10 20:15:29 +10:00
Jesse Merhi 402305f003 fix(ui): align wizard control states 2026-08-10 20:15:29 +10:00
Jesse Merhi 66196b7bf7 Control UI: pair wizard cancel and primary actions 2026-08-10 20:15:29 +10:00
Jesse Merhi 767bbb49d7 Control UI: preserve disabled wizard hover states 2026-08-10 20:15:29 +10:00
Jesse Merhi 84ad551e27 Control UI: size wizard actions for touch 2026-08-10 20:15:29 +10:00
Jesse Merhi 0368d89ebd Control UI: clarify wizard interactions 2026-08-10 20:15:29 +10:00
Peter Steinberger c3775a8f21 test(ui): stabilize checkbox alignment proof
Poll both fixed-width selection rails together and compare their trailing edges so the browser assertion measures settled popover geometry instead of sampling different points in the open animation.
2026-08-10 03:08:24 -07:00
Peter Steinberger c68606b812 fix(ui): align automation session checkmark
Keep Web Awesome checkbox semantics while rendering the selection state in the sidebar filter shared trailing rail. Add mocked-browser coverage for the hidden native mark and one-pixel alignment invariant.

Co-authored-by: Vyctor H. Brzezowski <krzyszchweski@gmail.com>
2026-08-10 03:08:24 -07:00
Jesse Merhi 260628f4fa perf(ui): keep cancel capability within startup budget 2026-08-10 20:01:24 +10:00
jesse-merhi 2300de7162 Gateway: negotiate Custodian wizard cancellation 2026-08-10 20:01:24 +10:00
Jesse Merhi 890a4b0089 Control UI: add direct Custodian wizard cancel 2026-08-10 20:01:24 +10:00
Peter Steinberger 890a5e895b fix: onboarding stalls or loses progress during interrupted setup (#121415)
* fix: harden onboarding recovery flows

Amp-Thread-ID: https://ampcode.com/threads/T-019fe94a-32da-757b-bff1-caefb6302cd1

* refactor: consolidate onboarding state lifecycles

Amp-Thread-ID: https://ampcode.com/threads/T-019fe94a-32da-757b-bff1-caefb6302cd1

* test: model canonical onboarding config writes

Amp-Thread-ID: https://ampcode.com/threads/T-019fe94a-32da-757b-bff1-caefb6302cd1

* fix: compose onboarding locks across gateway surfaces

Amp-Thread-ID: https://ampcode.com/threads/T-019fe94a-32da-757b-bff1-caefb6302cd1

---------

Co-authored-by: Amp <amp@ampcode.com>
2026-08-10 02:45:14 -07:00
Peter Steinberger 3a1f645228 fix(ui): prevent duplicate initial prompts during session startup (#121498)
* fix(ui): unify initial prompt handoff projection

Route create-time prompts through the canonical session projection so live persistence and delayed history adopt one stable bubble. Preserve inline attachment content across reconnects and authoritative identity handoff while removing duplicate matching and post-reducer mutation paths.

* fix(ui): preserve initial prompt projection contracts

* fix(ci): restore exact-head validation
2026-08-10 02:38:33 -07:00
Peter Steinberger 69a414bd0c test(ui): consolidate session pin coverage (#121539) 2026-08-10 02:37:47 -07:00
Peter Steinberger 019bd9a59f fix(ui): keep typing indicator in the composer footer (#121438)
* fix(ui): keep typing indicator in the composer footer

Keep typing activity in the fixed-height Control UI composer footer so collaborators no longer shift the textarea.

Render up to three author avatars before the localized typing label.

* test(ui): target the typing label in E2E

* fix(ui): hide typing avatars from the status announcement

Status text already names typers; role=img avatars made screen readers announce names twice. Addresses ClawSweeper P2.
2026-08-10 02:20:50 -07:00
Peter Steinberger f6298bf84d fix(workers): preserve disappeared-worker failures across restarts (#121122)
* fix(workers): persist placement terminal failures

* fix(workers): refresh placement protocol clients

* refactor(workers): isolate error formatting

* fix: integrate cloud terminal state with current main

* chore(plugin-sdk): refresh API baseline

* refactor(ui): inline one-use cloud terminal-reason banner helper

Keeps the Control UI startup JS bundle inside its 317 KiB gzip budget
(the helper + type-only import tipped it by 16 bytes).

* refactor(ui): trim terminal-reason lookup to type-erased optional access

Recovers the last gzip byte of the Control UI startup budget
(324609 B vs the 324608 B limit).
2026-08-10 00:36:52 -07:00
Peter Steinberger 3f08684989 feat(control-ui): preview text attachments inline with a download action (#121400)
* feat(control-ui): preview text attachments inline with a download action

Document attachments in chat now render a unified attachment card: text-like
files get a bounded, cached inline preview plus an explicit download button;
other documents get the same card chrome with a download action.

* fix(control-ui): split document preview module and e2e file under lint caps

* fix(control-ui): keep availability helpers module-internal after resolver move

* fix(control-ui): cancel document preview streams at the preview budget

Reads at most the preview budget from the response body and cancels the
reader, so unknown-size or endless text attachments cannot buffer fully
just by rendering; adds a streaming regression test.

* fix(control-ui): slice preview chunks to the byte budget before decoding

A blob or misbehaving source can deliver one giant chunk; cap the bytes
handed to TextDecoder at the remaining preview budget so rendering never
allocates or scans the full payload. Adds a single-oversized-chunk
regression asserting the decoded byte bound.

* test(control-ui): track decoded bytes via a TextDecoder subclass

Replaces the prototype spy that tripped typescript(unbound-method) in
oxlint with a stubbed tracking subclass; unstubGlobals restores it.
2026-08-10 00:30:56 -07:00
Peter Steinberger e0262e6aa4 feat(ui): add people session sorting (#121470)
* feat(ui): add people session sorting

Offer People sorting in the Control UI session sidebar when the Gateway reports multiple session-sharing identities.

* fix(ui): restore sidebar translation dependency

* fix(ui): preserve session sort ordering contracts
2026-08-10 00:18:02 -07:00
Peter Steinberger a7d61fc114 fix(ui): remote sessions show pasted titles and final replies (#121467)
* fix(ui): refresh remote session titles and final replies

* test(ui): split sidebar presentation e2e coverage
2026-08-10 00:13:55 -07:00
Peter Steinberger 32c740384a improve(ui): show dashboard switcher only for real board content (#121480)
* improve(ui): remove builtin observer dashboard injection

The Control UI fabricated a synthetic Observer tab + read-only builtin
widget on top of the real board snapshot whenever a session produced an
observer digest, which forced hasBoard=true and surfaced the prominent
chat/split/dashboard face switcher for sessions that never had a
dashboard. The dashboard face only duplicated the chat-rail observer HUD.

Delete the injection path, the builtin widget kind and its readOnly
concept, the pane-local ObserverDigestHistory, the observer widget
renderer/styles, and the orphaned chat.observer.* i18n keys. The session
header face switcher now appears only when the board provider has real
content. Chat-rail observer HUD, sidebar narration, config observer
settings, and protocol surfaces are unchanged.

* test(ui): give plugin widget cell chunk waits a real timeout

The four vi.waitFor calls on the lazily imported workboard-card element
used the 1s default, which a cold transform exceeds on loaded machines;
observed flaking 1-3 of 4 tests depending on host contention.
2026-08-10 00:13:51 -07:00
Peter Steinberger f9730534fb feat(ui): turn the widget pin action into an icon button (#121419)
* feat(ui): turn the widget pin action into an icon button

The chat widget card's pin control was a bare text button ("Pin to
dashboard" / "Pinning…" / "Pinned"). It is now a 26px icon button using
the shared Lucide pin icon, styled like the adjacent widget-actions
trigger, with the accent color marking the pinned state. Labels move to
title/aria-label so tooltips and accessible names are unchanged, and the
two pin handlers collapse into one shared helper. The session-dashboard
e2e now records hover/pinned proof screenshots under
.artifacts/control-ui-e2e/workboard-pin when OPENCLAW_UI_E2E_RECORD=1.

* test(ui): assert pin button state via aria-label

The pin control no longer carries text content; the pinned state is
exposed through aria-label/title, which is what the widget-card unit
test now asserts.

* fix(ui): trim pin action label updates
2026-08-10 00:13:23 -07:00
Peter Steinberger 3621c4b511 feat: browse and start sessions inside agent workspaces (#121417)
* feat(gateway): allow workspace-contained browsing

* fix(ui): preserve canonical workspace selections
2026-08-09 23:57:46 -07:00