Commit Graph

4831 Commits

Author SHA1 Message Date
Shakker 72528033b2 refactor: preserve companion context boundaries 2026-08-12 01:17:17 +02:00
Shakker 281fe1e502 refactor: use canonical companion context owners 2026-08-12 01:17:17 +02:00
Shakker 6932cd6980 fix: reconcile companion progress ownership 2026-08-12 01:17:17 +02:00
Shakker 70fbc35da2 fix: ground session companion context 2026-08-12 01:17:17 +02:00
Vyctor H. Brzezowski d8488a9406 fix(ui): keep short JSON code blocks visible (#122313) 2026-08-11 20:08:43 -03:00
Vyctor H. Brzezowski ec86b02b9e fix(ui): render disallowed link schemes as plain text (#122311)
Preserve readable Markdown labels while removing link wrappers for destinations the Control UI will not navigate.
2026-08-11 20:03:08 -03:00
Vyctor H. Brzezowski 944b81b2dc fix(ui): keep chat Markdown block rhythm consistent (#122289)
Fixes #122269
2026-08-11 19:57:11 -03:00
joshavant b76b9e1a75 fix(ui): retain identity while agent roster loads 2026-08-11 17:54:28 -05:00
joshavant 2fbf4fdbe6 fix(ui): preserve configured agent labels 2026-08-11 17:54:28 -05:00
Josh Lehman 585503896d fix: preserve WebChat reply context after reloads (#122169) 2026-08-11 15:42:01 -07:00
Vyctor H. Brzezowski 89df45c0f5 fix(ui): make DONE moves visibly reversible (#122303)
* fix(ui): make group category moves reversible

* fix(ui): address native Groups drag review
2026-08-11 19:39:07 -03:00
Vyctor H. Brzezowski 67262b70dc fix(ui): keep inline-code punctuation attached (#122291)
* test(ui): cover inline code punctuation spacing

* fix(ui): tighten inline code punctuation spacing

* test(ui): tolerate browser font metrics
2026-08-11 19:30:14 -03:00
Vyctor H. Brzezowski 285e58e5ef fix(ui): label patch file operations accurately (#122287) 2026-08-11 19:23:27 -03:00
Vyctor H. Brzezowski 65f4320147 fix(ui): humanize bare GitHub item links (#122285) 2026-08-11 19:16:07 -03:00
Vyctor H. Brzezowski cfc684e49c fix(ui): remove the pre-creation session row (#122259) 2026-08-11 18:18:03 -03:00
Peter Steinberger 42a4d0a9b8 fix(openai): surface failed realtime response outcomes (#121177)
* fix(talk): type realtime response outcomes

* fix(ci): align realtime outcome contracts

* test(ui): identify completed realtime responses

* chore(plugin-sdk): refresh realtime voice baselines
2026-08-11 14:14:22 -07:00
Vyctor H. Brzezowski ce466fccb0 fix(ui): always show full assistant responses (#122207) 2026-08-11 18:00:48 -03:00
Vyctor H. Brzezowski 776c19eaaa fix(ui): preserve focus on composer accessory clicks (#122243) 2026-08-11 17:50:28 -03:00
Vyctor H. Brzezowski 7d99f9fd86 fix(ui): keep new-session identity anchored (#122242) 2026-08-11 17:30:53 -03:00
Peter Steinberger 627e83d4f7 fix(ui): effort slider matches selected level after model switches (#122125)
* fix(ui): align effort picker after model switches

Publish ordered per-model effort profiles from the Gateway and reconcile new-session effort overrides so labels, slider positions, and create payloads stay consistent.

* fix(ci): align model profile contracts
2026-08-11 13:14:11 -07:00
Peter Steinberger a1846dbebc feat(ui): session-reset dividers + boundary markers for DB-backed sessions (#122222)
* feat(ui): show session-reset dividers and fix boundary markers on DB-backed sessions

/reset now leaves a durable 'Session reset' divider at the transcript
boundary in the Control UI. Root-cause fix underneath: the SQLite
transcript projection only selected message events, so compaction (and
now reset) markers never reached clients for DB-backed sessions; marker
synthesis now has one owner (session-transcript-message.ts) consumed by
both storage backends across full/recent/paged/by-id/anchor reads.
Additive __openclaw marker kind 'reset' documented in clients.md.

* fix(gateway): keep history readers out of the plugin SDK barrel and fix CI gates

Direct imports for the sqlite history readers (the session-accessor barrel
is SDK-reachable via session-transcript-lock-runtime); reset marker added
to the kept-tail chat.history expectation; lint naming fixes; marker tests
split into session-transcript-readers.markers.test.ts.
2026-08-11 12:59:11 -07:00
Vyctor H. Brzezowski 6c485842b1 fix(ui): calm composer focus treatment (#122232) 2026-08-11 16:53:30 -03:00
Vyctor H. Brzezowski a1a1c791fc improve(ui): blend chat header into transcript (#122220) 2026-08-11 16:28:22 -03:00
Peter Steinberger 79701dfc84 fix: speed up streamed assistant output (#122206)
* fix: speed up streamed assistant output

* fix: preserve plan stream invalidation
2026-08-11 12:01:14 -07:00
Vyctor H. Brzezowski 2c636dda0c fix(ui): hide unavailable session changes action (#122152) 2026-08-11 15:02:58 -03:00
Peter Steinberger ebb2770000 refactor: eliminate export name collisions (#122084)
* refactor: eliminate export name collisions

* chore(scripts): burn resolved collision baselines

* refactor: narrow legacy session load options

* chore: refresh SDK and session debt baselines

* refactor: adopt upstream secrets collision fix

* test(plugin-sdk): mock renamed session store core

* fix(scripts): track renamed session accessor core
2026-08-11 10:41:50 -07:00
Peter Steinberger eef860d972 feat(ui): unify system notices in chat with a minimal line family (#122144)
* feat(ui): unify system notices in chat with a minimal line family

Class A (model-facing system turns: restart recovery, gateway restarted,
generic internal_system fallback) and class B (lifecycle facts: compaction)
now share one hairline+icon+label rendering; known kinds show operator
summaries instead of raw injected prompts. Core producers share one
formatSystemTurnPrompt owner for the [System] prefix; subagent resume copy
unified from "gateway reload" to "gateway restart". No protocol, channel,
or marker changes.

* fix(ui): keep system-turn prompt helper out of the plugin SDK surface

Relocate formatSystemTurnPrompt to src/sessions/system-turn-prompt.ts so the
core-internal [System] convention does not widen the SDK API baseline; drop
the unused prefix/type exports; use var(--cursor-action) per cursor policy.
2026-08-11 10:24:38 -07:00
Peter Steinberger cad77fb39c refactor: consolidate remaining coercion helpers (#122020) 2026-08-11 10:22:01 -07:00
Vyctor H. Brzezowski 24bbb416b5 fix(ui): align menu selection checks to the right (#122158)
Aligns selector menu checks to the trailing rail so icons and labels remain stable across Control UI menus and New Session place selection.

Refs #122156.
Prepared head SHA: b1b60d1e15
Co-authored-by: Vyctor H. Brzezowski <51521767+vyctorbrzezowski@users.noreply.github.com>
Co-authored-by: Shakker <165377636+shakkernerd@users.noreply.github.com>
Reviewed-by: @shakkernerd
2026-08-11 18:17:46 +01:00
Peter Steinberger 5c81ed5883 refactor(ui): split runtime config into layered modules (#122117)
* refactor(ui): split runtime config into layered modules

* refactor(ui): delete redundant config wrappers

* chore(lint): ratchet max-lines baseline after ui config split
2026-08-11 10:17:00 -07:00
Peter Steinberger e7ceb5aeb0 improve(ui): speed up large Markdown session switches (#122150)
Amp-Thread-ID: https://ampcode.com/threads/T-019fe957-0e49-707f-859f-9600ef536125

Co-authored-by: Amp <amp@ampcode.com>
2026-08-11 10:14:22 -07:00
Peter Steinberger 3a55867ea1 fix(gateway): bound stalled session subscriptions (#121164) 2026-08-11 10:10:20 -07:00
Peter Steinberger 8fa897a3f1 improve(ui): align transient menu chrome with design-system geometry (#122109)
* improve(ui): align transient menu chrome with design-system geometry

Use one shared transient-menu recipe across Control UI panels and items.

Match the carapace reference: 6px item radius plus 4px inset yields a 10px panel radius, with restrained motion for fixed menus.

* test(ui): align gateway picker menu expectations

* test(cli): keep benign sqlite diagnostics out of ACP exit stderr assertions

* fix(ui): restore 44px menu touch targets on coarse pointers
2026-08-11 10:08:53 -07:00
Peter Steinberger 2d69e39796 fix(ui): scope Desktop panel to cloud sessions (#122145) 2026-08-11 10:06:40 -07:00
Vyctor H. Brzezowski e7ba2e1f6b fix(ui): give the Gateway update a visible, truthful outcome (#121686)
* fix(ui): give the Gateway update a visible, truthful outcome

Confirming an update in the Control UI could end in nothing the operator
could see. The sidebar card only knew `updateRunning`, which clears as soon
as `update.run` answers, so a dev-channel handoff — git pull, install, full
build, restart — spent minutes back on the stale "N commits behind" call to
action. A verified install then published a null banner, so success was
never announced at all, and the reload that a verified install triggers
would have destroyed any in-memory notice anyway.

The lifecycle was already recorded; nothing rendered it. Feed the sidebar
the reconciliation fact the settings page already uses, narrate the wait in
the shell callout that survives the restart, and record the verified result
so it outlives the reload it causes.

Failures now name their cause. The updater already stores the failing step
and its captured output in the restart sentinel and `update.status` returns
it whole, so a disk-full install reads "The update failed at install:
ENOSPC: no space left on device" instead of a reason slug plus "see the
gateway logs". Missing handoff-reason guidance is filled in, and the
duplicate post-restart banner resolver is folded into the shared one.

Also fixes a callout clipped by the fixed shell chrome controls, and the
"Available 246 commits behind" double framing in the confirmation.

* fix(ui): report the Gateway update in the dialog that starts it

Follow-up to the first pass: the shell-top callout was the wrong surface for
this. The dialog the operator clicked is now the one that reports the whole
update, and the ambient surfaces are the fallback for anyone who leaves it.

Confirming no longer closes the dialog. It becomes stateful — the danger
button turns into a disabled "Updating…" with a spinner, and the body
narrates the phases in place: installing, then "The Gateway is restarting.
This page disconnects and reconnects on its own." The dialog is mounted on
document.body, outside the shell, so losing the connection cannot unmount
the only surface still reporting. A request the Gateway never accepts stops
spinning after a bounded grace and says so.

A failure lands in the dialog with its recorded cause and next step. Success
still arrives after the reload a verified install triggers, so it stays a
toast — no dialog exists by then.

The shell-top status callout is gone. The same outcome now renders beside
the sidebar update card that started the update, and stays hidden while the
dialog owns the report so the two surfaces never duplicate each other.

Splits the wire-payload readers out of update-overlay-helpers into
update-schedule-dto and moves update.run answer classification next to them,
keeping both owners under the file-size budget.

* fix(ui): keep the update dialog open through the install in E2E and use a defined warn token

* refactor(ui): wire the update progress stream into the floating card and drop unused video capture

* fix(ui): report the current update, not the previous failure

The dialog subscribed to progress before starting the update. Producers
replay their current snapshot synchronously on subscribe, so a retry
still carrying the previous attempt's failure banner painted that old
error as this update's outcome.

Start the request first, and treat a failure present on the subscribe
emit as the previous attempt's: an accepted run clears the banner before
its first await, so a failure that survives means the request was
refused, which the accept timer already reports truthfully.

* fix(ui): keep update helpers internal

* chore(perf): raise startup-JS budget to 350 KiB

Approved by maintainer Vyctor on 2026-08-11.

Trigger: after #121734, main measured 326650 B—6 B below the prior 319 KiB hard ceiling. Current main subsequently moved the ceiling to 320 KiB; this records the authorized final 350 KiB decision for #121686.

* fix(ui): announce update success without session storage

Show the verified install identity directly when the current document does not reload, so denied session storage cannot suppress the operator-visible outcome.

* test(ui): isolate update toast in overlay tests

The Node-only overlay suite now reaches the direct non-reload success toast. Mock the DOM-owned toast boundary so reconciliation assertions can complete without a browser document.
2026-08-11 13:49:12 -03:00
Peter Steinberger db7eda0146 test(ui): stabilize session archive e2e lanes (#122068) 2026-08-11 09:46:46 -07:00
Shakker 0a406faefc test: remove duplicate tab reorder coverage (#122128) 2026-08-11 18:20:37 +02:00
Shakker 4bb7077538 fix: clear stale queued navigation recovery 2026-08-11 18:20:37 +02:00
Shakker e45ec90b17 fix: reject rollback while navigation is pending 2026-08-11 18:20:37 +02:00
Shakker eeffd6153d fix: preserve shadow-root tab focus 2026-08-11 18:20:37 +02:00
Shakker c402b41eb3 fix: bound browser navigation ownership 2026-08-11 18:20:37 +02:00
Shakker bd55bb39f4 fix: preserve keyboard close focus intent 2026-08-11 18:20:37 +02:00
Shakker e5adfc3565 fix: settle tab hosts before focus recovery 2026-08-11 18:20:37 +02:00
Shakker 6c0c9155f0 fix: wait for tab host settlement before focus 2026-08-11 18:20:37 +02:00
Shakker 17ddf4f52d fix: resolve close focus from the render root 2026-08-11 18:20:37 +02:00
Shakker 0f14a1412d fix: recover focus after async tab close 2026-08-11 18:20:37 +02:00
Shakker 7f5bf7f1f3 fix: restore tab focus after component settlement 2026-08-11 18:20:37 +02:00
Shakker 43bc6ae1b8 fix: retain tab focus through async close 2026-08-11 18:20:37 +02:00
Shakker 3d077fb5d5 fix: keep browser tab failure states coherent 2026-08-11 18:20:37 +02:00
Shakker 2bfb44ea2e fix: satisfy browser tab landing guards 2026-08-11 18:20:37 +02:00