Commit Graph

3920 Commits

Author SHA1 Message Date
Peter Steinberger
124911aee0 fix: prevent cron and Workboard lifecycle regressions (#114865)
* fix: harden cron and Workboard lifecycle races

* fix: use canonical card identity for Workboard drops
2026-07-27 23:17:15 -04:00
Peter Steinberger
a0530259e2 fix(ui): preserve navigation during startup (#114828) 2026-07-27 23:00:04 -04:00
Peter Steinberger
56d9d07516 feat(ui): match ClickClack discussion sidebars to host themes (#114812)
* feat(ui): align ClickClack discussion themes

* fix(ui): synchronize custom discussion palettes from first paint

* fix(clickclack): explicitly identify theme-aware discussion embeds
2026-07-27 22:03:58 -04:00
Peter Steinberger
cc78df6d5b fix(ui): preserve active Workboard sessions when editing cards (#114804)
* fix(ui): preserve Workboard sessions when editing running cards

* test(ui): stabilize mount recovery under browser load
2026-07-27 21:13:15 -04:00
Peter Steinberger
fafe7d9dad fix: prevent cron and Workboard execution races (#114808) 2026-07-27 20:33:53 -04:00
Peter Steinberger
313daad549 perf(gateway): warm handler families and cache identity avatars (#114754)
* perf(gateway): warm handler families and cache identity avatars

* chore: drop changelog edit (release-generation-owned)

* fix(ci): regenerate protocol models, satisfy knip, absorb sidecar drift

- commit regenerated Swift GatewayModels for the additive cron.list param
- split the avatar data-url cache into assistant-avatar-cache.ts so its
  factory has a production consumer (knip production scan)
- de-export prewarm family names/type; test now drives fake families only
- postReadySidecarCount 2 -> 3: main added a post-ready sidecar in parallel
2026-07-27 19:37:13 -04:00
Peter Steinberger
b12f631a4a fix(ui): keep Gateway questions isolated across reconnects (#114794) 2026-07-27 19:35:09 -04:00
Peter Steinberger
0fdc825b29 fix(ui): make the Control UI e2e suite green and gate merges on it (#114554)
* fix(ui): restore chat flow e2e coverage

(cherry picked from commit 16a094eaec4ae121db09f67c094a41262aa9cefc)

* test(ui): align browser Talk mocks with voice sessions

(cherry picked from commit ef0649334539954b253ab8c51ff436bd8ce757c6)

* test(ui): wait for chat startup in update E2E

(cherry picked from commit 586e1046320dd56398fd8a3b995a1a465f6c6fe2)

* test(ui): update sidebar session route expectation

(cherry picked from commit 9692985027556fad7bb7819c8e140a101e181c47)

* test(ui): update session management e2e contracts

(cherry picked from commit 4e99348dabf08fb8886d55e25a9f9eda1dfe1056)

* test(ui): align Codex session E2E contracts

Update the catalog layout assertion for reorderable sibling sections, expose advanced plugin settings explicitly, and make adopted sessions resolvable through the current path router.

(cherry picked from commit 1a03f924a32facb23302c5618a2b15004feeccff)

* test(ui): align composer e2e with metadata hydration

(cherry picked from commit eca1902e773be32c993ddb22594925f7da82f98f)

* fix(ui): restore usage hint click behavior

(cherry picked from commit ea63b5dab7c3c54048a04d60703e529e5b900df6)

* fix(ui): give reveal-only tooltips an explicit click-to-open opt-in

#112602 made the shared tooltip dismiss on pointer activation so an action
button never strands one open. The usage summary hint exists only to be read,
so clicking it did nothing on touch or in browsers that skip focus on click.
Opt that trigger in rather than bouncing focus through blur/focus, which
briefly drops focus for assistive tech.

(cherry picked from commit 16d165857a4006ae0a0df42168f34a40f4cc9117)

* test(ui): follow sidebar dock resize ownership

(cherry picked from commit fd4792a2dd9fc81fc63f8c9e25291ff2246d235a)

* test(ui): prove the dock resize persists off its clamp

Asserting the post-End width equals SIDEBAR_MIN_WIDTH_PX compared the clamp
to itself across reload, so the check would pass even if the persisted width
were dropped and the column fell back to its minimum. Step off the clamp
first and assert that value survives.

(cherry picked from commit 3636124c326a93b80006ccc4064415ec1a6c2c9f)

* test(ui): align native link routing e2e contracts

Use a non-link bubble hit target after flat assistant styling, assert modified clicks at the routing boundary instead of relying on Chromium tab creation, and preserve native context menus for internal anchors.

(cherry picked from commit 55fbd3052a40c5c03f00f0bf595ef356ac0d1f10)

* test(ui): align native catalog host assertions

(cherry picked from commit 9db9a2fcd5633675a88296b2ccd874563a00cb80)

* test(ui): target tool outcome rollup at dashboard session

Completed-work groups are dashboard-only, so the legacy main session never rendered the disclosure exercised by this test.

(cherry picked from commit ba84b617ef038866451ad03491298349d966a54f)

* test(ui): track discussion panel close action

The flexible multi-sidebar layout replaced the generic Close sidebar action with a panel-specific Close Discussion action. Keep the E2E toggle proof aligned with that intentional accessible-name contract.

(cherry picked from commit 422b1f2bd8fae2a7571881d0455c3040c2ef2de9)

* test(ui): mock pairing list in WhatsApp logout e2e

(cherry picked from commit 3730de075bbb50071fc0cb57c007ab894688a7a1)

* test(ui): open build info from identity menu

(cherry picked from commit b1626a6a723ec13c2cf50444b4c7a65fec289213)

* fix(ui): let the board fixture host page own its theme

The fixture module unconditionally re-added `wa-dark` at import time, which
runs after the host page's inline theme script. #111998 gave that page the
real prefers-color-scheme contract, leaving the line from #112076 stale: in
light mode the root ended up with both `wa-light` and `wa-dark`, so Web
Awesome rendered dropdowns dark.

(cherry picked from commit 43e50de9728f3d5feac9609142d28821896b4f77)

* test(ui): align approval E2E with scoped errors

(cherry picked from commit 6435fe995491c6bae2c28fa374d06cd77f3c46ac)

* test(ui): use radio role in Set Default E2E

(cherry picked from commit acc8d5a487aac4d56515ae35d976fd347efa0be5)

* ci: gate merges on the Control UI e2e suite

test/vitest/vitest.ui-e2e.config.ts was referenced only by package.json and
mantis-web-ui-chat-proof.yml, so nothing in the merge gate ever ran it and 39
failures accumulated across 21 files (#114438). Give it its own job: the suite
runs one file at a time because each owns a Chromium context and a mocked
Gateway, ~21 min measured, which does not fit checks-ui's 20-minute budget.
Also route the config file itself through the Control UI changed-scope so a
change to it triggers the job.

* test(ui): isolate MCP app conformance from sidecars

(cherry picked from commit c2bfd0a00edad804474ebb23449d3150557c7f78)

* test(ui): list newly created E2E sessions

(cherry picked from commit e1a2188699011e818e040358d4eaf6ce26eb0732)

* test(ui): synchronize full-suite e2e setup

* test(ui): drop implied-eval module import and align the e2e workflow guard

* test(ui): wait for pin editor roving focus before keyboard nav

* test(ui): read the startle class in one in-page step

* test(ui): synchronize transient e2e assertions
2026-07-27 19:31:31 -04:00
qingminlong
15ab1334f4 fix(ui): clear web push ready timeout (#110879)
* fix(ui): clear web push ready timeout

* fix(ui): clear web push ready timeout

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-27 18:07:21 -04:00
Peter Steinberger
d0948c33b5 fix: prevent cron and Workboard lifecycle races (#114744) 2026-07-27 17:55:17 -04:00
Peter Steinberger
428b5cc7df perf(board): stop reading widget html on board.get and calm the ticket poll (#114748) 2026-07-27 17:53:08 -04:00
Peter Steinberger
1c0ccdddcd fix(ui): hide the terminal dock while Settings is open (#114737)
* fix(ui): hide docked terminal and browser panels during settings takeover

* test(ui): align browser panel casts with core test typecheck

* test(ui): split dock suppression coverage
2026-07-27 17:08:52 -04:00
Peter Steinberger
c9c22632d0 fix(ui): prevent stale catalog continuations from hijacking chat (#114731)
* fix(ui): prevent stale catalog continuations from hijacking chat

* fix(ui): preserve adopted catalog routes and scoped regression coverage

* test(ui): cover deferred catalog adoption ownership
2026-07-27 17:03:00 -04:00
Peter Steinberger
7394262cd1 feat: per-model code-mode capability flags with an "auto" master-switch tier (#114695)
* feat(tools): per-model code-mode capability flags and auto master-switch tier

* feat(anthropic): flag claude-sonnet-4-6 as code-mode preferred

* revert(anthropic): drop claude-sonnet-4-6 from the code-mode preferred set

* test(anthropic): type the manifest compat field in the catalog contract test

* fix(anthropic): carry catalog compat onto hand-built forward-compat model rows
2026-07-27 16:47:41 -04:00
Peter Steinberger
fbb3525368 fix(ui): show a simple channel settings view with a flip to advanced (#114741)
* test(ui): make channel settings renderable in the mock dev server

* fix(ui): hide advanced channel settings behind the shared advanced tier

* fix(ui): widen the tier renderer callback to lit's nothing

* fix(ui): keep the advanced collapse control on advanced-only channel forms

* docs: note the shared advanced tier on channel settings
2026-07-27 16:39:23 -04:00
Peter Steinberger
f275db6974 refactor: remove dead split facades (#114726)
* refactor: remove dead split facades

* fix: update facade ownership references
2026-07-27 16:32:52 -04:00
Peter Steinberger
762f04da5a refactor(ui): redesign channels DM access requests, drop channel-health JSON card (#114717)
* feat(ui): serve DM pairing fixtures from the mock dev harness

* refactor(ui): align channels DM access requests with the settings design language and drop the channel-health JSON card
2026-07-27 16:15:54 -04:00
Peter Steinberger
26eae2ef3e test(ui): deflake workboard view provider release and drawer dialog tests (#114722)
The provider-release test raced vi.waitFor's 1s default against the lazy
workboard-card-dashboard import; on loaded CI runners the import chain
outlives the timeout, so board.get was never observed. Await the element
definition and its first update instead, which issue board.get
synchronously. Wrap the body in try/finally: the leaked open drawer from
a failure corrupted scoped querySelector results in the shared jsdom
document and cascaded into the drawer dialog test.
2026-07-27 16:10:14 -04:00
Peter Steinberger
f23928e418 fix(ui): keep channel action labels on one line and surface QR next to actions (#114708)
* fix(ui): keep channel action labels on one line and surface QR next to actions

* fix(test): drop duplicate prewarm test from attempt-extra shard config
2026-07-27 15:55:38 -04:00
Peter Steinberger
7e25a84484 fix(ui): show resolved avatars on session owner chips (#114682)
* fix(ui): show resolved avatars on session owner chips

* chore(ui): drop unused ActorIdentityUser re-export
2026-07-27 15:15:18 -04:00
Peter Steinberger
e57549c8b9 fix(ui): prevent stale and read-only Workboard dashboard actions (#114686)
* fix(ui): keep Workboard dashboard card actions connection-safe

* fix(ui): retain type-safe read-only widget enforcement
2026-07-27 14:56:08 -04:00
Peter Steinberger
e1e62f2a6e fix: prevent cron and Workboard lifecycle races (#114674)
* fix: harden cron and workboard lifecycle races

* fix: include missing app-server test in CI shard
2026-07-27 14:52:06 -04:00
Peter Steinberger
b74c4acca9 fix(ui): retain the selected Workboard card agent (#114650) 2026-07-27 13:44:26 -04:00
Peter Steinberger
f0a963a2cb fix(ui): isolate case-sensitive channel sessions (#114638) 2026-07-27 12:55:36 -04:00
Peter Steinberger
ee9bc9a502 fix: harden cron and Workboard scheduling under load (#114564)
* fix: harden cron and Workboard scheduling under load

* test: refresh cron pagination prompt snapshots

* test: verify Workboard stress and generated cron snapshots

* fix(workboard): reclaim expired cross-board worker capacity safely

* fix(workboard): keep reclaim interval private to lifecycle owner

* fix(ci): pin and verify reliable OpenGrep security scanner

* test: guard checksum-verified OpenGrep installation
2026-07-27 09:29:42 -04:00
Peter Steinberger
3d03c415d1 test(ui): remove two load-dependent flakes in the Control UI suite (#114585)
* test(ui): remove two load-dependent flakes in the Control UI suite

Both failed only under a saturated worker pool, roughly one full run in four.

The board refresh tests asserted a 1ms boundary (nothing at 4999ms, fired at
5000ms) on a timer armed during a render cycle, so any drift in when it was
armed failed them. Assert the band that carries the meaning instead: silent at
2s rules out the 1s floor, fired by 8s rules out the 15s a full-TTL calculation
would give. Call count is no longer pinned because the unreplaced ticket keeps
retrying, which has its own test.

The router outlet settled by pumping a fixed five cycles, which returns while a
chain is still resolving into another render. Drain to Lit's documented settled
state instead, via a shared helper with its own coverage.

* test(ui): keep a drain floor so settling never regresses the fixed pump

A settled update only says that render did not reschedule itself, so a promise
chain that requests an update at its end can still be in flight. Keep the five
turns unconditionally and let the settled check extend past them.

* docs(test): state the settle helper's bound instead of implying quiescence
2026-07-27 09:17:33 -04:00
Peter Steinberger
14d8c2439f feat(ui): offer normally-absent core files instead of flagging them missing (#114559)
* feat(ui): offer normally-absent core files instead of flagging them missing

The Agents core-files editor rendered every unwritten workspace file as a
permanently-badged MISSING tab, so an ordinary workspace looked broken. Absence
is only a fault for required files; SOUL.md, USER.md, and MEMORY.md are normal
to be absent until written.

agents.files.list now marks those entries expectedAbsent, and the editor keeps
them out of the tab strip behind an add picker that creates the file on save.
A missing AGENTS.md still shows as a fault.

* chore(protocol): regenerate Swift gateway models for expectedAbsent

* fix(gateway): carry expectedAbsent through agents.files.get

Clients merge the get response over the listed entry, so a missing-file get
that dropped the flag made a file picked from the add picker re-render as a
MISSING fault. Caught by live Control UI proof, not by the unit tests.
2026-07-27 09:16:10 -04:00
Peter Steinberger
9e5849a0e8 feat: render model-authored collapsible details (#114556)
* feat: render model-authored collapsible details in web UI and flatten for plain channels

* fix: guard markdown-it line-index access in details block rule

* fix: satisfy no-new-array lint in disclosure scanners

* fix: unexport internal disclosure scanner types

* fix: respect markdown code boundaries in details scanners

* fix: preserve escaped disclosure tags
2026-07-27 09:05:14 -04:00
Peter Steinberger
98490b66ec fix(ui): keep loading attachments in their original chat (#114568)
* fix(ui): keep pending attachments in their chat session

* test(ui): preserve native attachment-reader hooks
2026-07-27 08:52:08 -04:00
Leon-SK668
7a4abc46ae fix(ui): release failed browser screenshot bodies (#110399)
* fix(ui): release failed browser screenshot bodies

* test(ui): prove failed screenshot body cleanup

* test(ui): satisfy screenshot proof lint

* fix(ui): avoid hanging on failed screenshot cleanup

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-27 08:44:27 -04:00
Peter Steinberger
4aa96a118d fix(sessions): prevent stale and cross-agent observer status after reconnect (#114548)
* fix(sessions): prevent stale and cross-agent observer status

* fix(sessions): sync native observer source inventory

* fix(android): satisfy observer ownership formatting gate
2026-07-27 08:39:29 -04:00
Peter Steinberger
de6b114639 fix(ui): keep first turns visible and block browser regressions (#114498)
* fix(ui): require new-session Chromium regression checks

* fix(ui): stabilize first-turn browser regression scenarios

* test(ui): keep browser regressions within lint boundaries

* test(ui): keep rejected sessions out of browser fixtures
2026-07-27 07:38:48 -04:00
Peter Steinberger
8e848f457e fix: harden cron delivery and Workboard dispatch (#114499) 2026-07-27 07:03:41 -04:00
Peter Steinberger
7b29256e38 fix(control-ui): persist Quick Config fast mode (#114489) 2026-07-27 06:13:54 -04:00
Peter Steinberger
847906373e refactor(ui): unify user avatar rendering (#114496) 2026-07-27 06:11:09 -04:00
Peter Steinberger
b8e7f27ff2 feat(ui): let a link's slug settle a shared short-id prefix (#114486)
* feat(ui): let a link's slug settle a shared short-id prefix

Two sessions can share the first block of their uuid, which sent an otherwise
exact link to the disambiguation view even though the slug in that link already
said which session was meant. Capture the slug on short references and use it to
break the tie.

It can only narrow: a slug matching none or several of the tied sessions leaves
the chooser alone, and a reference that already resolves uniquely is untouched.
Generated links stay at their normal length instead of growing a full uuid.

* fix(ui): never settle a slug tie from an incomplete search

A truncated candidate set is an unfinished search, not a tie: an unexamined page
could hold the same short-id prefix under the same slug. Settling there would be
the guess the bounded search exists to avoid, so keep the chooser.
2026-07-27 06:08:51 -04:00
Peter Steinberger
c56689416e fix(ui): scope global route resolution by agent 2026-07-27 05:43:19 -04:00
Peter Steinberger
68778cb156 fix(ui): reject ownerless global observer history 2026-07-27 05:43:19 -04:00
Peter Steinberger
d68adeb5f8 fix(ui): retain scoped global session metadata 2026-07-27 05:43:19 -04:00
Peter Steinberger
64bf485ba2 fix(sessions): scope observer state by agent 2026-07-27 05:43:19 -04:00
Peter Steinberger
f8a3023a46 fix(ui): preserve agent selection across reconnects 2026-07-27 05:43:19 -04:00
Peter Steinberger
a08fabd8a5 refactor(ui): keep session navigation within line budget 2026-07-27 05:43:19 -04:00
Peter Steinberger
51f228f6fe fix(ui): preserve agent-owned session navigation
Add agent ownership to observer digests, scope global observer delivery and reconciliation, and centralize application session selection across navigation and reconnects.

Co-authored-by: xbrxr03 <abrarhabib03@gmail.com>
2026-07-27 05:43:19 -04:00
ClawSweeper
1583a356c5 fix(ui): show workspace avatar in sidebar (#114126)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-27 02:42:51 -07:00
Peter Steinberger
9f509d4923 refactor(ui): consolidate chat and security regression fixtures (#114408)
* refactor(ui): consolidate chat and security regression fixtures

* fix(ui): type metadata regression fixtures structurally

* fix(ui): remove obsolete realtime test lint suppression

* fix(ui): preserve grandfathered realtime test lint invariant
2026-07-27 05:42:11 -04:00
Peter Steinberger
4f0dcd4d30 fix(ui): show centered mascot while pages load (#114481) 2026-07-27 05:40:38 -04:00
Peter Steinberger
2e9621018a fix(ui): keep derived session titles after sidebar mutations (#114474) 2026-07-27 05:36:56 -04:00
Peter Steinberger
a2ff6cb52b fix(ui): consistently load and cache user avatars (#114444)
* fix(ui): consistently load and cache user avatars

* fix(ui): retain avatar images across profile updates
2026-07-27 05:00:58 -04:00
lee-xydt
2c30b7c0de fix(ui): re-render composer when input history recall mutates draft (#112634)
* fix(ui): re-render composer when input history recall mutates draft

* test(chat-state): add unit tests for composer history invalidation
2026-07-27 04:55:55 -04:00
Peter Steinberger
65cf9c1d65 fix(ui): key the new-session draft on the requested agent (#114415)
The route loader reports an empty agent id whenever it cannot verify one
through the Gateway, so an offline catalog target keyed as ["", catalog]
and became [agent, catalog] on reconnect. That looked like navigation and
cleared whatever the user had typed. Key the draft identity on the agent
the URL requested, which only a navigation can change, and re-derive agent
defaults when the resolved id finally arrives.

Fixes #114398
2026-07-27 04:53:36 -04:00