Commit Graph

1181 Commits

Author SHA1 Message Date
Peter Steinberger 9b43f1c82e improve(ui): fix sidebar session row hierarchy and add a message-preview toggle
Pinned sessions inherited the nav zone's muted colour on the session *title*, so a
pinned row's preview line outshone its own name and the same session read dimmer
pinned than unpinned. A title is content in every zone; only glyphs, meta and the
hover fill follow the zone. The subtitle drops to plain --muted, already proven AA
against every surface by theme-contrast.test.ts.

Rows with no preview text reserved a fixed 18px second line anyway, leaving a dead
band or a lone spinner hanging below-right of the title. They now collapse to one
line via a --single-line class plus a CSS variant, so the endcap rides beside the
title. Rows also gained a little vertical air and reclaimed the right-hand gutter
inside the row, leaving the deliberate scrollbar clearance from #124879 intact.

Adds a localStorage-backed "Show message preview" toggle to the session sort menu
(default on). Operator-actionable state is exempt: attention, the queued
concurrency-slot explanation, and critical observer headlines (stuck /
waiting-on-user) always show, because hiding them behind a display preference is
the silent-failure class.

Also registers extensions/codex/src/app-server/run-attempt-tools.test.ts, which
arrived in #126189 with no shard claim and left main red.
2026-08-19 00:08:07 -07:00
Peter Steinberger 0d14434d0e feat(secrets): add explicit protected and agent-readable access (#126088)
* feat(secrets): add explicit agent access modes

Distinguish protected write-only secrets from agent-readable Gateway environment values, expose policy-bound Gateway exec aliases to Codex, and activate Node environment proxy support for destination-bound egress.\n\nCloses #125975

* fix(gateway): bind lifecycle dispatch to owning instance

* test(ui): preserve mock gateway recovery state

* fix(codex): avoid unavailable gateway process guidance

* fix(harness): keep run correlation host-owned

* fix(gateway): bind restart delivery to instance

* test(codex): construct tools through test host capability
2026-08-18 22:51:15 -07:00
Peter Steinberger 41ed3c3460 fix(ui): buttons use the default cursor instead of the link hand (#126153)
* fix(ui): reserve pointer cursors for links

* test: align cursor and docs contracts
2026-08-18 21:40:52 -07:00
Peter Steinberger a89c568068 fix(ui): center dashboard widget controls on hover (#126076)
* fix(ui): center dashboard widget hover controls

* fix(ui): gate resize handle with centered hover

* fix(ui): preserve iframe clicks with centered controls

* fix(ui): preserve corner actions when centering controls

* fix(ui): compact centered controls at intermediate widths

* test(plugins): align SDK subpath docs contract wording
2026-08-18 21:32:37 -07:00
ClawSweeper 7e69b1d5ab fix(ui): make Guardian review activity subtle (#125395)
* fix(ui): make guardian reviews subtle

* fix(ui): correlate Guardian warning cleanup

* fix(ui): retain ambiguous Guardian warnings

* fix(codex): preserve Guardian review state

Keep command-owned review state durable across reconnect and persisted history, with conservative bounded outcomes and producer-owned routine warning correlation. Verify native user-home app-server auth instead of injecting stored profiles.

* refactor(ui): split workspace conflict rendering

---------

Co-authored-by: RoboClaw <309084314+roboclaw-bot@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-18 20:28:23 -07:00
ClawSweeper bf420e92c6 fix(ui): keep mobile session actions reachable (#126124)
* fix(ui): keep mobile session actions reachable

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

* test(ui): use placement startup capability

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

---------

Co-authored-by: RoboClaw <309084314+roboclaw-bot@users.noreply.github.com>
Co-authored-by: Takhoffman <781889+Takhoffman@users.noreply.github.com>
2026-08-18 19:46:34 -07:00
Vyctor H. Brzezowski 2a469c1cb2 fix(ui): dismiss completed progress cards (#126102)
* test(ui): cover completed progress card dismissal

* test(ui): capture both completed card themes

* fix(ui): dismiss completed progress cards

* style: format progress card dismissal

* test(ui): assert visible dismissal lifecycle

* test(ui): wait for reloaded composer proof

* refactor(ui): reuse progress card action styles

* chore(protocol): refresh Swift progress card params

* style(ui): format progress card test

* fix(ui): hide progress dismissal from viewers

* test(ui): use Vitest viewer assertion
2026-08-18 23:39:31 -03:00
ClawSweeper 22665ae71f fix(ui): fill expanded mobile side panel (#126111)
Co-authored-by: RoboClaw <309084314+roboclaw-bot@users.noreply.github.com>
Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>
2026-08-18 18:55:09 -07:00
ClawSweeper 05817086cc fix(ui): keep memory header stable across tabs (#125568)
* fix(ui): keep memory hub header stable across tabs

* test(ui): tolerate subpixel layout rounding

* fix(ui): keep memory header padding stable

* test(ui): scope memory layout assertion

* test(ui): satisfy promise executor lint

---------

Co-authored-by: RoboClaw <309084314+roboclaw-bot@users.noreply.github.com>
Co-authored-by: Colin Johnson <colin@solvely.net>
2026-08-18 18:45:36 -07:00
Vyctor H. Brzezowski 421104253b feat(ui): proxy opt-in link favicons through gateway (#121906)
Co-authored-by: joshavant <830519+joshavant@users.noreply.github.com>
2026-08-18 17:44:57 -07:00
Vyctor H. Brzezowski 1110cd09bd improve(ui): make online sidebar section collapsible (#125963)
* improve(ui): make online sidebar section collapsible

* improve(ui): show online avatars in compact state

* improve(ui): align online section heading

* fix(ui): satisfy sidebar CI gates

* fix(ui): keep online expanded on first visit
2026-08-18 20:28:38 -03:00
Josh Lehman a91f1202d9 fix(ui): keep Plugins hub navigation stable (#126061)
* fix(ui): keep Plugins hub navigation stable

* chore: format release validation skill
2026-08-18 16:08:41 -07:00
ClawSweeper 20b6a04036 fix(ui): vertically center session row actions (#126041)
Center sidebar session pin and menu actions across the full two-line row while reserving text width on hover and touch. Add browser geometry regression coverage.

Co-authored-by: RoboClaw <309084314+roboclaw-bot@users.noreply.github.com>
2026-08-18 15:10:22 -07:00
ClawSweeper 20c09b8088 improve(ui): label new session picker menus (#126045)
Show Agents, Environments, Projects, and Branches headings when the four New Session pickers open.

Co-authored-by: RoboClaw <309084314+roboclaw-bot@users.noreply.github.com>
2026-08-18 15:10:04 -07:00
ClawSweeper 670f61200b improve(ui): slow new session spinner (#126044)
Co-authored-by: RoboClaw <309084314+roboclaw-bot@users.noreply.github.com>
2026-08-18 15:06:55 -07:00
Peter Steinberger 8032e6c75e fix(ui): restore session link hovercards (#125968)
* fix(ui): restore session link hovercards

* chore: defer session hovercard release note
2026-08-18 13:51:35 -07:00
Peter Steinberger 347a0eaf8c feat(ui): activity feed automation grouping, live status, deep-link inspector (#125981)
* feat(ui): collapse automation sessions in activity feed

* feat(ui): show live run status on activity feed rows

* feat(ui): make run inspector deep-link only

* fix(ui): only link inspect run to a current active run

Addresses ClawSweeper P1: a stale observer digest could deep-link a live
row to an ended run's audit record; trust digest runId only when it is
still in activeRunIds.
2026-08-18 13:49:25 -07:00
Peter Steinberger c1527822ce feat: add dashboard fullscreen modes (#125806)
* feat(ui): add dashboard fullscreen modes

* docs(ui): document dashboard fullscreen modes

* fix(ui): scope dashboard fullscreen lifecycles

* test(ui): align dashboard e2e grant fixture

* fix(ui): surface dashboard document load failures
2026-08-18 12:09:07 -07:00
Peter Steinberger ab2bd4faa8 feat(ui): consolidate activity filters into toolbar with people popover (#125917)
* test(ui): seed mock activity sessions across owners

* feat(ui): consolidate activity filters into toolbar

Also restores the shared .input styling contract for standalone form controls.

* test(ui): update activity feed e2e for toolbar people popover
2026-08-18 11:41:06 -07:00
Peter Steinberger 2bed8caf9e feat(ui): channel conversation avatars in the sidebar (Discord + Slack) (#125668)
* feat(gateway): proxy channel conversation avatars

* feat(discord): capture conversation avatars

* feat(slack): capture DM sender avatars

* test(discord): bind guild avatar mock

* feat(ui): render channel conversation avatars

* fix(ui): align sidebar owner fixtures

* fix(gateway): version channel-avatar routes by media revision

A stable per-session URL let AuthenticatedAvatarRouteLoader's blob and
sticky-404 caches pin a mounted row to a stale or blank avatar after the
backing media changed. Append an opaque digest of the media reference so
replacement and 404-recovery change the route identity.

* test(ui): align sidebar owner facet

* fix(ui): keep owner chip until channel avatar loads

A session with a channelAvatarUrl suppressed its owner chip even while the
blob was loading, auth was not ready, or the route 404ed, leaving an empty
lead slot. The chip now rides as fallback content inside the avatar element
and yields only to a usable image. Covers 404 and auth-pending states;
avatar rows keep renderedOwnerId unset so an owner-viewer stays visible in
the facepile.

* perf(ui): keep channel avatar fallback within budget

* perf(ui): lazy-load the channel avatar element

The avatar element and its authenticated blob loader rode the startup
bundle through session-leading-indicator, pushing startup JS 51 B over the
CI gzip budget. Channel avatars are not startup-critical: register the
element on the first avatar row; the owner-chip fallback covers the
one-time upgrade window. Startup JS returns ~1 KiB under the ceiling.

* build(ui): raise startup baseline for channel avatars

CI-measured startup JS is 344379 B against a 343289 B baseline (+1090 B).
The avatar element and blob loader are code-split out of startup (previous
commit); the residual is the sidebar lead-slot render branch and row
plumbing, which cannot be deferred. Baseline updated via
check-control-ui-performance --update-baseline with CI bytes per the
script's contract; well inside the 4096 B ratchet step and 358400 B
ceiling.
2026-08-18 09:55:50 -07:00
Peter Steinberger d84a910fc8 refactor(ui): send to the selected session; delete exact-run steer machinery (#125862)
browser no longer chooses or persists run targets; steer sends ride the generic durable outbox with queueMode steer and no expectedRunId/expectedLeafEntryId; deletes steer-lifecycle.ts, steered-chip.ts, kind:"steered", steerTargetRunId, sendState:"steering", target-bound retry, uniqueness failure rows; persisted outbox rows normalize at load; net -625 production LOC.
2026-08-18 08:38:23 -07:00
Ayaan Zaidi 0c0649037c feat(ui): show applied revision changes (#125854)
Show bounded predecessor diffs by default so operators can understand applied Skill Workshop revisions without manual comparison. Keep the full revision body one click away and preserve oldest-revision fallback behavior.
2026-08-18 20:40:07 +05:30
Peter Steinberger c77feb00f3 feat(ui): move session filter to a global sidebar toolbar (#125690)
* feat(ui): promote session controls to toolbar

* test(ui): add session toolbar proof capture script

* chore: register session toolbar proof script

* test(ui): target ungrouped session drop zone

* fix(ui): trim session toolbar startup cost

* docs(ui): point new-session guide at the Sessions toolbar

Also name the accepted tradeoff for the inert ungrouped-collapse preference at the partition site (ClawSweeper P1/P3 response).

* test(ui): deflake new-session workspace-memory e2e

Menu-geometry assertions now measure relative to the picker anchor in one atomic evaluate (immune to unrelated page settles, still catches focus-induced moves). The post-reload refill raced the composer's async draft restore, which appended the stored draft to the typed text; waiting for the restored draft asserts the documented persistence instead. Failed CI shard checks-ui-e2e 5/12 on runs 32122284238 attempts 1-2.

* fix(ui): use canonical session owner filter state

* chore(ui): keep session toolbar proof artifacts ignored
2026-08-18 08:09:57 -07:00
Peter Steinberger 8131f56cb1 fix(ui): show progress cards on session links (#125733) 2026-08-18 07:58:52 -07:00
Peter Steinberger 4048ae26e0 feat: credit linked session participants as Git co-authors (#125827)
* feat: credit linked session participants as co-authors

Authenticated profiles can link GitHub and receive automatic co-author credit in shared coding sessions.

* style: format rebased co-author registries

* fix: mark profile schema DDL boundary
2026-08-18 07:15:01 -07:00
Ayaan Zaidi e8044fdffe fix(ui): group Skill Workshop applied revisions per skill with inline history (#125794)
The Applied view rendered every applied proposal as an independent recency-sorted row, so one skill's revision history looked like duplicate skills. Applied now shows one row per live skill with a revision-count badge and grouped tab count; the detail pane gains a lazily loaded History section with operations from the ledger's recorded kind. Pending/rejected/quarantined/stale keep one row per proposal.

Fixes #125632
2026-08-18 12:30:05 +00:00
Vyctor H. Brzezowski 29b1a65d1e improve(ui): compact GitHub links in chat (#125746)
* improve(ui): compact GitHub links in chat

* fix(ui): refine GitHub link pills
2026-08-18 07:59:37 -03:00
Vyctor H. Brzezowski 40597e25b5 fix(ui): match fullscreen table presentation (#125692)
* fix(ui): match fullscreen table presentation

* fix(ui): confirm copied tables with check icon

* test(ui): type table style probe safely

* test(ui): repair table style parity probe

---------

Co-authored-by: RoboClaw <309084314+roboclaw-bot@users.noreply.github.com>
2026-08-18 03:56:49 -07:00
ClawSweeper 415ffc010b fix(ui): restore tool activity interaction polish (#125790)
* fix(ui): restore tool activity interaction polish

* fix(ui): restore final tool activity visuals

* fix(ui): keep running tool activity compact

* fix(ui): preserve tool disclosure state ownership

* fix(ui): preserve disclosure scroll after resize

---------

Co-authored-by: vyctorbrzezowski <krzyszchweski@gmail.com>
Co-authored-by: RoboClaw <309084314+roboclaw-bot@users.noreply.github.com>
2026-08-18 03:56:22 -07:00
Vyctor H. Brzezowski 631b0c77a1 improve(ui): standardize fenced code collapse and wrapping (#125229)
* improve(ui): standardize fenced code collapse and wrapping

Every Markdown code fence now shares one behavior instead of the JSON-only
40-line disclosure: blocks longer than seven lines show a seven-line preview
with the exact hidden-line count, horizontal overflow stays inside the fence,
and a reversible wrap control appears only once a line measurably overflows.
User fences keep the bubble's own typography and carry no code chrome.

The collapsible markup is emitted only for hosts that own the code-block
lifecycle (codeBlockInteraction: interactive), and that lifecycle collapsed to
one click owner plus one initializer so a host cannot wire half of it. The chat
thread, detail panel, and caretaker surface all run it; the skills preview gets
the click owner its copy button had never been given. The scan is deferred and
coalesced because a Lit element ref commits before that render's children, and
detached ResizeObserver targets are released before each pass.

Also adds the interaction mode to the markdown cache key so a static host cannot
serve interactive markup from a sibling render, and drops the stylesheet rules
and selector guards the removed json-collapse markup owned.

* fix(ui): satisfy fenced code checks
2026-08-18 06:11:07 -03:00
Peter Steinberger c5d4a82dec feat(ui): show session info in the sidebar hovercard (#125678)
* feat(ui): show session info in the sidebar hovercard

The sidebar session hovercard now always opens and shows owner, created and updated times, PR chips with CI state and diff stats, plus a branch and changed-files fallback with “No PR yet”. The progress card renders below when present, and the gateway exposes changedFiles on session PR and branch snapshots.

* fix(ui): scope session hovercards to sidebar rows

Keep Markdown session links owned by their dedicated preview hovercard by limiting both lazy registration and runtime activation to sidebar session rows. Add browser coverage that fails when the competing sidebar hovercard steals the link trigger.

* perf(ui): keep session hovercard data out of startup

Reuse the sidebar’s existing session projection from the lazy hovercard runtime instead of publishing a separate startup-loaded registry. This removes the registry lifecycle and its implementation-only tests while keeping the browser ownership regression and restoring the Control UI startup bundle below budget.
2026-08-18 01:57:30 -07:00
Vyctor H. Brzezowski e349d520a2 feat(ui): add typed update recovery actions (#125098)
* feat(ui): add typed update recovery actions

* fix(ui): surface update status refresh failures

* fix(ui): keep update failure type internal

* fix(ui): publish update failure facts atomically

* fix(ui): validate update recovery startup budget

---------

Co-authored-by: RoboClaw <309084314+roboclaw-bot@users.noreply.github.com>
2026-08-18 01:31:21 -07:00
Peter Steinberger ad475ce33a feat(gateway/ui): command-lane diagnostics with debug page table and global busyness overlay (#125591)
* feat(gateway): expose command lane diagnostics

* feat(ui): add live debug busyness overlay

* fix(ui): show newest events in debug overlay and update diagnostics call-list tests

* test(ui): add lane and status fixtures to the mocked dashboard

* feat(ui): add System busyness entry to the account menu

* fix(gateway/ui): bound lane diagnostics, append-only descriptor, fail-visible lanes load

Addresses ClawSweeper review findings on #125591: diagnostics.lanes moves to
the append-only tail of the descriptor table, the Control UI lanes request
fails visibly instead of masking errors, and the RPC exports only static
lane snapshots plus a bounded dynamic-session aggregate composed in the new
command-lane-diagnostics module.

* chore(protocol): regenerate Kotlin gateway methods for diagnostics.lanes

* test(gateway/ui): register diagnostics.lanes in the 2026.8 train and mock it in the debug e2e
2026-08-18 01:10:32 -07:00
Peter Steinberger d9dfc5b3d9 feat(ui): show online people and session activity (#125695)
* feat(ui): add sidebar Online presence section and Activity session feed

Adds a sidebar "Online" section (visible only when at least one other
identity is connected, idle users dimmed) that links into a new
session-feed default view on the existing Activity page: search, time
window, and per-person facets over day-grouped sessions, with a
per-person identity header (devices, viewing-now) when one person is
selected. Removes the dead footer viewer-facepile roster that the
sidebar-zone refactor (#112936) left unmounted.

Client-only; no gateway/protocol changes.

* test(ui): make activity capture date-boundary safe
2026-08-18 01:03:22 -07:00
Peter Steinberger 475d20a034 fix(ui): stop the model picker from nagging about refresh failures (#125661)
* fix(ui): stop the model picker from nagging about refresh failures

A failed background catalog refresh rendered a "Couldn't refresh models"
banner plus a Retry button on top of a complete, working model list, and
replaced the composer trigger's model name with that error text. The
picker already keeps the last-known catalog and re-requests it on every
open, so the operator was being asked to press a button for something the
UI does by itself.

The error stays recorded on the host — it is what drops the stale
availability gate so the composer remains usable — but it is no longer
surfaced while there are models to show. Only a genuinely empty catalog
still says "Models unavailable". The new-session picker gains the chat
picker's open-triggers-revalidate behavior so re-opening it is the retry
there too, instead of dead-ending until a page reload.

Two adjacent simplifications in the same surface:

- Model rows reserve their provider-icon slot as an invisible stem, so
  names line up with the provider heading label (same 34px stem grouped
  and filtered, nothing shifts while typing).
- The "Using agent default" footer is gone: the default row already
  carries a DEFAULT badge and the checkmark. Typing "default" in the
  picker search now matches the default model instead.

Proof: scripts/capture-model-picker-proof.mts captures the open picker
against a mocked gateway; alignment delta 0px (was -24px), search
"default" matches the default row (was nothing), and a failed models.list
leaves no catalog-state element with all rows intact.

* fix(ci): register the model-picker proof script and await its picker revalidation

The unused-file scan needs every scripts/ entry point referenced, like the
sibling ui:proof:* recipes. The catalog-reconnect assertion also has to wait
for the picker's own metadata request instead of reading the log the moment
the rows render.

* test(ui): split model-catalog scenarios out of the new-session e2e file

The catalog-reconnect file hit the 1000-line cap. Its model-catalog metadata
failure/recovery pair is a separate surface from CLI-agent targets, terminal
start, and draft reconnect, so it moves to its own file rather than earning a
max-lines suppression.

* test(audit): give the pinned-reader contract test a realistic timeout

It adds a pinned-SHA git worktree and cold-compiles the audit and state
modules under tsx, which takes minutes on a contended runner. The 120s
default made it fail by construction; it timed out on an unrelated PR shard
while passing locally at ~55s.
2026-08-18 00:58:19 -07:00
Vyctor H. Brzezowski cb5e1d2a2b improve(ui): refine transcript status markers (#125237)
* improve(ui): refine transcript status markers

* fix(ui): attach duplicate marker to message content

* fix(ui): keep duplicate markers outside rich content

---------

Co-authored-by: RoboClaw <309084314+roboclaw-bot@users.noreply.github.com>
2026-08-18 00:50:33 -07:00
Vyctor H. Brzezowski 9fb1b7a1a5 fix(ui): replace user bubble Show more button (#125553)
* fix(ui): replace user bubble show-more button

* fix(ui): remove user bubble chevron surface

* fix(ui): round user bubble chevron hover

* fix(ui): preserve wrapped prompt disclosure

* fix(ui): measure wrapped prompt overflow

---------

Co-authored-by: RoboClaw <309084314+roboclaw-bot@users.noreply.github.com>
2026-08-18 00:34:30 -07:00
Peter Steinberger a910d6c80d fix(ui): separate stop action from microphone picker (#125669) 2026-08-18 00:02:40 -07:00
Vyctor H. Brzezowski 540ea124e0 improve(ui): redesign tool calls as lightweight transcript activity (#125240)
* improve(ui): flatten transcript tool activity

* improve(ui): complete tool activity redesign

* improve(ui): normalize activity row typography

* improve(ui): unify activity typography contract

* improve(ui): standardize all activity row text

* improve(ui): increase activity text size

* improve(ui): underline activity filenames

* improve(ui): tighten activity row spacing

* improve(ui): standardize activity chevrons

* improve(ui): reveal child chevrons on interaction

* improve(ui): retain active child chevrons

* improve(ui): space expanded child tools

* improve(ui): remove idle activity fade and gap

* fix(ui): preserve tool activity contracts

* fix(ui): simplify activity basename lookup

* fix(ui): preserve canonical tool row actions

* fix(ui): record tool outcomes and repair transcript row regressions

Neutral collapsed rows are the design, but this branch left failures with
nowhere to land and shipped chrome whose styles it had already deleted.

- Expanded standalone tool messages close with the outcome line, so an inline
  rows shape still reports the failure instead of dropping it.
- Progress-card receipts drop the badge and the spinner: this branch removed
  both styles, leaving a 0x0 invisible running indicator, and the receipt
  label already names the state.
- Single delete patches are non-navigable; their workspace target is gone, so
  the file action could only ever fail to load.
- Flush command padding derives from the action-button size instead of a stale
  42px constant, and the running text wave covers command rows again.
- Activity lane returns to the tool-shell column width the rule claims.
- Drop CSS nothing references: tool-card tabs, empty, plain-output, activity
  scroll masks, secondary command text.
- renderToolDataBlock takes an optional label instead of comparing copy.
- Split the oversized tool-card test file and refresh stale row assertions.

* fix(ui): fold the tool action size into the card header rule

Stylelint no-duplicate-selectors rejects the separate .chat-tool-card__header
block; the custom property belongs in the existing rule.

---------

Co-authored-by: RoboClaw <309084314+roboclaw-bot@users.noreply.github.com>
2026-08-18 03:36:43 -03:00
Vyctor H. Brzezowski 52eb013330 feat(ui): unify fenced code block visual styling (#125249)
* feat(ui): unify fenced code block styling

* fix(ui): preserve fenced code copy icon

* fix(ui): refine unified fenced code visuals

* fix(ui): increase code fence squircle radius

* fix(ui): inset fence scrolling and add edge fade

* fix(ui): fade overflowing code without surface color

* fix(ui): update code overflow fades by scroll position

* fix(ui): preserve transcript scroll handler with fence fades

* fix(ui): initialize code overflow fades after render

* fix(ui): align JSON tree hierarchy with reference

* fix(ui): remove transcript bullets from JSON tree

* fix(ui): preserve fenced code contracts

* test(ui): align fenced code feedback contracts

* fix(ui): remove fenced code overflow lifecycle

* fix(ui): preserve compact JSON disclosure

* fix(ui): preserve shared fence variants

* fix(ui): address fenced code review findings

---------

Co-authored-by: RoboClaw <309084314+roboclaw-bot@users.noreply.github.com>
2026-08-18 02:57:48 -03:00
Vyctor H. Brzezowski cbe3116e14 feat(ui): add Markdown table interactions (#125245)
* feat(ui): add Markdown table interactions

* fix(ui): scope table interactions to transcripts

* fix(ui): complete table interaction contracts

* chore: refresh PR head

* fix(ui): satisfy table interaction gates

---------

Co-authored-by: RoboClaw <309084314+roboclaw-bot@users.noreply.github.com>
2026-08-17 22:20:32 -07:00
Vyctor H. Brzezowski e97b42a43a fix(ui): show users typing in the transcript (#125244)
* fix(ui): move typing status into transcript

* fix(ui): complete transcript typing lifecycle

* fix(ui): finish transcript typing presentation

* fix(ui): refine typing bubble tail

* fix(ui): complete transcript typing invariants

* fix(ui): satisfy transcript typing gates

* fix(ui): keep typing presence ownership bounded

* fix(ui): keep typing presence dependencies private

---------

Co-authored-by: RoboClaw <309084314+roboclaw-bot@users.noreply.github.com>
2026-08-17 22:19:37 -07:00
Peter Steinberger e6a427c493 perf(ui): defer offscreen plugin row rendering (#125585)
Amp-Thread-ID: https://ampcode.com/threads/T-01a01277-59ee-703a-b04d-927a3ba733a1

Co-authored-by: Amp <amp@ampcode.com>
2026-08-17 21:50:54 -07:00
Peter Steinberger ca8bd59df5 improve(ui): reduce startup stylesheet size (#125539)
* perf(ui): lazy-load settings workspace styles

Amp-Thread-ID: https://ampcode.com/threads/T-01a01277-59ee-703a-b04d-927a3ba733a1

* fix(ui): keep picker styles route scoped

Amp-Thread-ID: https://ampcode.com/threads/T-01a01277-59ee-703a-b04d-927a3ba733a1

---------

Co-authored-by: Amp <amp@ampcode.com>
2026-08-17 21:32:46 -07:00
Peter Steinberger 90526f3a9c fix(ui): stop composer mic hover shift and stray red hover (#125565)
* fix(ui): stop composer mic hover shift and stray red hover

The device-picker chevron collapsed to width 0 while idle and grew to
20px on hover, shoving the right-aligned mic button 20px left under
the cursor on every mouse-over. Detach the picker into its own
fixed-width ghost button beside the mic instead of morphing the mic's
shape into a split pill; hover only fades the picker's opacity, so the
reserved layout never shifts.

Also fixes the mic showing the send button's loud accent-red hover in
dark/openknot themes: those themes overrode .chat-send-btn:hover
directly, which outranked every variant's own hover rule (including
the intentional neutral mic hover and the stop button's danger hover).
Theme overrides now set a --chat-send-hover-background variable that
each variant's hover rule can still take precedence over.

* chore(scripts): register composer mic hover proof script

Missing package.json entry made the deadcode full-tree scan flag the
new capture script as an unused file, same as the existing
ui:proof:workboard sibling.
2026-08-17 21:09:17 -07:00
Peter Steinberger 33e2e6b0f9 fix(ui): show session hovercards for every sidebar row beside the rail (#125563)
* fix(ui): show session hovercards for every sidebar row beside the rail

Sidebar session rows were excluded from session-link hovercards, so only
the Home (main) row showed a card, and it overlaid the sidebar itself.
Hovercards now open for all sidebar session rows and position to the
right of the sidebar so navigation stays visible.

* fix(ui): yield sidebar previews to active progress hovercards

Sidebar rows already open a progress hovercard when the session has an
active progress card; the new preview card stacked on top of it. The
preview now probes the shared progress-card store (deduped with the
progress provider's own load) and opens only when the row has none.
2026-08-17 21:06:41 -07:00
Vyctor H. Brzezowski c75d4dc911 improve(ui): align chat branch and PR rows (#125232)
* improve(ui): align chat branch and PR rows

* improve(ui): collapse absent PR number slot

* improve(ui): give Create PR a neutral chip surface

* improve(ui): rebalance merged PR row contrast

* improve(ui): use standard squircle for PR rows

* fix(ui): consolidate static PR link styling
2026-08-17 20:52:00 -07:00
Jesse Merhi a928da457f Show worktree option only for Git group folders (#125280)
* feat(ui): show worktrees only for Git group folders

* feat(ui): enrich group environment picker

* fix(ui): preserve worktree defaults on probe errors

* fix(ui): reject stale group repository probes

* test(ui): type repository inspection helper
2026-08-17 19:50:15 -07:00
Peter Steinberger 93f7492570 fix(ui): keep side panel tab labels visible (#125511)
Restore the block-axis padding reset lost in #125368 so Web Awesome tab labels remain vertically legible while retaining logical inline spacing. Add LTR and RTL browser geometry coverage for the visible label boundary.
2026-08-17 19:29:18 -07:00
Vyctor H. Brzezowski 47399310a0 improve(ui): redesign suggested task cards (#125231)
* improve(ui): redesign suggested task cards

* fix(ui): preserve suggested task navigation

* fix(ui): refine suggested task card surfaces

* fix(ui): clarify suggested task instruction layers

* fix(ui): normalize task instruction disclosure

* fix(ui): keep split divider stable on hover

* fix(ui): refine suggested task split shape

* fix(ui): tighten task instruction underlap

* fix(ui): smooth suggested task swaps

* fix(ui): wrap suggested task project label

* fix(ui): signal overflowing task paths

* fix(ui): stabilize suggested task stack height

* fix(ui): separate suggested task surface contrast

* fix(ui): narrow suggested task cards

* fix(ui): allow suggested task text selection

* fix(ui): use restrained brand task action

* fix(ui): align dark task action branding

* fix(ui): deepen dark task action color
2026-08-17 23:25:28 -03:00