Peter Steinberger
ff72f287c3
fix(gateway): declare viewer presence explicitly instead of deriving it from subscriptions ( #116001 )
...
* fix(gateway): declare viewer presence explicitly instead of deriving it from subscriptions
* refactor(ui): isolate viewer presence lifecycle ownership
* chore(protocol): register viewer presence schema owner
* fix(ui): keep viewer presence cleared after detach
* chore: drop changelog edits from this PR
CHANGELOG.md is release-owned; release generation derives entries from merged
PRs. Release-note context stays in the PR body.
2026-07-29 13:56:54 -04:00
Peter Steinberger
b930ee055c
fix(ui): preserve initials for missing user avatars ( #115976 )
...
* fix(ui): preserve initials for missing user avatars
* test(ui): prove missing avatar fallback in browser
* chore: defer avatar note to release workflow
* test(ui): stabilize avatar fallback browser proof
2026-07-29 13:34:36 -04:00
Peter Steinberger
b44890bf2d
fix(sessions): recover deleted chats without endless retries ( #115974 )
...
* fix(sessions): recover deleted chats without lifecycle races
* fix(sessions): narrow deleted route commit keys
* test(sessions): isolate deleted-chat recovery regressions
* fix(sessions): recover chats after agent removal
* fix(sessions): fence recreated session deletion races
* fix(sessions): preserve filtered active conversations
* test(sessions): preserve canonical main during chat recovery
* test(ui): follow canonical agent channels route
2026-07-29 13:22:29 -04:00
Peter Steinberger
af717db39c
feat(ui): add per-connector tool access to composer ( #115907 )
...
* feat(ui): per-connector tool access in composer menu
* fix(ui): harden tool access loading and dynamic keys
* fix(ui): harden tool access reads and catalog freshness
* fix(ui): invalidate tool catalog on connector edits
* test(ui): fix composer capability checks
2026-07-29 11:39:53 -04:00
Peter Steinberger
68a3ca740d
fix(ui): harden chat and session interactions ( #115967 )
2026-07-29 11:39:10 -04:00
Vincent Koc
fd28cd3bec
fix(ui): support shortcuts on non-Latin keyboards
2026-07-29 23:09:22 +08:00
Peter Steinberger
fde4658bf6
fix(ui): recover sessions and dashboards after prolonged outages ( #115654 )
...
* fix(ui): recover long-running sessions and dashboards
* fix(ui): expose browser-safe gateway timers
* refactor(ui): keep browser timer surface minimal
* refactor(gateway): extract pending request state
* fix(ci): refresh browser runtime and format baseline
* fix(ci): exclude generated plugin outputs from targeted lint
* fix(ui): bound long-running connection and pane lifecycles
* refactor(ui): split long-running lifecycle regression coverage
* fix(ui): bound long-running media and lint ownership
* fix(security): preserve explicit workspace disable denylist
* fix(ci): preserve plugin manifest fallback lint
2026-07-29 10:09:51 -04:00
Peter Steinberger
f27899181e
feat(ui): add composer capability menu ( #115800 )
...
* feat(ui): composer capability menu with per-session overrides
* refactor(ui): keep chat render within lint ceiling
* fix(ui): preserve loaded capability overrides
* fix(ui): remove stale capability menu field
* fix(ui): gate capability menu on runtime-config readiness
2026-07-29 06:48:08 -04:00
Peter Steinberger
662abec754
feat(gateway): push session PR indicators to subscribed clients ( #115643 )
...
* feat(gateway): push session PR indicators to subscribed clients
* test(gateway): fix PR indicator drift
* chore(protocol): allowlist PR-indicator event for native apps (Control UI surface)
* test: align PR indicator lifecycle coverage
* fix(ui): scope session PR store listeners to active watchers
2026-07-29 06:30:01 -04:00
Vincent Koc
25c375e47f
refactor: reuse canonical record guards ( #115810 )
...
* docs(agents): standardize canonical record guards
* refactor(model-catalog): use canonical record guard
* refactor(scripts): use canonical record guard
* refactor(ui): use canonical record guard
* refactor(codex): use canonical record guard
* refactor(agents): use canonical record guard
* refactor(sessions): use canonical record guard
* refactor(doctor): use canonical record guard
* refactor(infra): use canonical record guard
2026-07-29 11:43:36 +02:00
Peter Steinberger
ef5066b3cf
fix(ui): preserve model names alongside aliases ( #115789 )
...
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-29 05:38:55 -04:00
Peter Steinberger
7a4649ceb3
feat(ui): first-class chat audio/video player cards ( #115764 )
...
* feat(ui): add chat media player cards
* fix(ui): harden chat media attachment lifecycle
* fix(ui): finalize chat media fallbacks
* fix(ui): rely on video playback errors
* fix(ui): guard deferred media resume
* test(ui): align local media assertions with player cards
* docs(ui): note cross-origin download fallback
* fix(ui): keep player helpers module-private
* test(ui): wait for encoded video attachment
* test(ui): wait for hidden audio media element
* test(scripts): give oxlint shard-kill test headroom under CI load
2026-07-29 05:32:43 -04:00
Vincent Koc
755eea5e97
fix(ui): localize remaining control surfaces ( #115730 )
...
* feat(ui): add localization keys for control surfaces
* fix(ui): localize relative time and durations
* fix(ui): localize update and recovery notices
* fix(ui): localize chat controls and command results
* fix(ui): localize memory management views
* fix(ui): localize shared tool surfaces
* fix(ui): localize settings and action notices
* chore(ui): tighten localization raw-copy baseline
* fix(ui): preserve localized status copy
* fix(ui): preserve compact sidebar time label
* fix(ui): preserve near-future sidebar direction
* test(ui): align screenshot localization assertion
2026-07-29 16:34:35 +08:00
Peter Steinberger
a2c88e2a18
feat(ui): path-based agent and panel URLs on Settings > Agents ( #115673 )
...
* feat(ui): add agent panel path URLs
* test(ui): clarify unknown agent route fallback
* fix(ui): reject agent URL dot segments
* test(ui): clarify agent panel switch proof
* chore(ui): localize panel id table and refresh docs map
* test(ui): keep agent panel cases test-local
* chore(ui): keep agent route path type local
2026-07-29 04:12:46 -04:00
Vincent Koc
14940edf15
feat(skills): add Skill Workshop lifecycle hooks ( #115606 )
...
* feat(skills): add lifecycle hook contracts
* feat(plugins): expose skill hook contracts
* feat(plugins): identify skill evaluators
* feat(skills): persist proposal evaluation lifecycle
* feat(skills): add agent evaluation action
* feat(skills): emit committed skill lifecycle changes
* feat(gateway): expose skill proposal evaluation lifecycle
* feat(ui): add Skill Workshop evaluations
* fix(skills): bind lifecycle state to proposal revisions
* fix(skills): preserve lifecycle events without artifacts
* feat(cli): evaluate skill proposals
* fix(ui): bind evaluations to proposal revisions
* docs(skills): document lifecycle hook primitives
* chore(plugin-sdk): refresh skill hook surface
* fix(skills): harden proposal evaluator execution
* fix(plugins): isolate skill evaluator inputs
* fix(cli): align skill lifecycle deadlines
* fix(skills): preserve evaluation replay invariants
* test(ui): capture Skill Workshop evaluation proof
* fix(skills): bind apply to evaluated target tree
* fix(skills): preserve evaluation contract edges
* fix(skills): bound evaluation event storage
* chore(skills): keep lifecycle helpers internal
* refactor(skills): isolate evaluation persistence
* fix(skills): satisfy lifecycle validation gates
* chore(protocol): refresh Skill Workshop clients
* docs: refresh Skill Workshop map
* chore: keep release notes in PR metadata
* docs: refresh merged docs map
* fix(ci): type Code Mode catch errors
* fix(skills): freeze lifecycle observation payloads
* fix(protocol): keep proposal inspect backward-decodable
* fix(skills): enforce final evaluator bundle limits
* fix(skills): preserve lifecycle caller attribution
* chore: drop subsumed Code Mode formatting
* test(plugins): adapt lifecycle hook mocks
2026-07-29 15:49:44 +08:00
Peter Steinberger
eee32eaf66
refactor(ui): remove duplicate dashboard widget paths ( #115504 )
2026-07-28 23:18:16 -04:00
Patrick Erichsen
f0de25b3fd
fix(ui): canonicalize agent model identity ( #115480 )
2026-07-28 21:05:11 -05:00
Peter Steinberger
6782eb7104
fix(ui): prevent unowned dashboard subscriptions ( #115457 )
2026-07-28 20:59:40 -04:00
Peter Steinberger
ad3f74f296
fix(chat): make web and terminal share one session state ( #115429 )
...
* fix(chat): consolidate web and terminal session state
* fix(chat): preserve live history across stale snapshots
2026-07-28 18:53:21 -04:00
Peter Steinberger
d239a59d82
fix(ui): make Control UI ownership and permissions reliable ( #115364 )
...
* fix(ui): unify connection-owned gateway event dispatch
* fix(qa): keep hosted UI smoke evidence truthful
* fix(ui): make mobile navigation drawer an accessible modal
* refactor(ui): centralize settings search destinations
* fix(ui): own chat media resource lifecycles
* fix(ui): unify sidebar session scope ownership
* refactor(ui): remove obsolete navigation backdrop styles
* refactor(ui): isolate dashboard provider lease capabilities
* fix(ui): centralize gateway operator permissions
* style(ui): format gateway event regressions
* fix(ui): render live dashboard permissions immediately
* fix(ui): enforce approval grant authority
* fix(gateway): fence retired sockets after event gaps
* fix(ui): isolate sidebar gateway fixtures across shared workers
* test(ui): isolate singleton-sensitive browser suites
* fix(ui): retire stale catalog pagination on gateway reconnect
* fix(ui): restore drawer focus after native dialog dismissal
* fix(ui): seed drawer threads and preserve modal focus ownership
* fix(ui): isolate nested native drawer overlay lifecycle
* test(ui): prove isolated dashboard lease authorization
* fix(ui): bound settled managed image resources
* fix(ui): type native modal focus and shared test helper
* fix(ui): correct approval mock types and trim dead export
* fix(ui): keep settings section metadata private
* fix(qa): keep hosted coverage regression within lint limit
* refactor(ui): keep catalog presence in its session data owner
* fix(browser): regenerate bundled copilot runtime
* test(ui): split board lease authorization regressions
* fix(ui): snapshot gateway listener fanout without redundant spread
* fix(ui): bind chat media subscriptions to image lifetime
* fix(ui): extract overlay access lifecycle
* fix(ui): restore guarded media after Lit reconnection
* test(ui): localize board lease fixture title
* fix(ui): reuse system approval fixture labels
* test(ui): narrow managed media lifecycle source
* fix(ui): prevent retired board gateway clients from rolling back leases
* fix(ui): expose pairing to pairing-scoped operators
* fix(ui): preserve legacy device pairing access
* fix(ui): preserve responsive sidebar ownership
* fix(ui): preserve responsive navigation and prove media ownership
* fix(ui): retire revoked catalog and refresh pairing grants
* test(ui): align typed catalog fixtures with main
2026-07-28 16:42:05 -04:00
Peter Steinberger
18ecde3d9f
refactor(chat): keep web and terminal sessions synchronized ( #115377 )
...
* refactor(chat): unify web and TUI session synchronization
* refactor(chat): extract canonical projection and transcript owners
* test(gateway): verify private transcript store identity
* test(agents): protect public transcript storage boundary
* fix(chat): harden cross-client identity and subscription lifecycles
* fix(gateway-client): preserve type-safe release callback rejection
* test(ui): complete shared sidebar gateway fixture
2026-07-28 16:08:10 -04:00
Peter Steinberger
c536b0731e
perf(ui): debounce event-driven session list refreshes and right-size child paging ( #115374 )
2026-07-28 15:16:28 -04:00
Peter Steinberger
c41ca078a6
refactor(ui): adopt @lit/task across remaining page surfaces ( #115274 )
...
* refactor(ui): adopt @lit/task across remaining page surfaces
* refactor(ui): keep approval history pagination explicit
* fix(ui): preserve task refresh ordering
2026-07-28 12:44:34 -04:00
Peter Steinberger
a88c4283ad
refactor(workboard): tidy Control UI card execution helpers ( #115195 )
2026-07-28 12:28:00 -04:00
Peter Steinberger
13f20055f0
refactor(ui): split Profile (identity) from Usage (statistics) ( #115245 )
...
* refactor(ui): profile owns identity; usage owns statistics
* fix(ui): rerender profile on connection transitions
* chore(ui): drop usage exports orphaned by the profile split
* chore(ui): localize usage TTL constant in gateway source replacement test
2026-07-28 12:09:50 -04:00
scotthuang
35f035806b
fix(ui): avoid duplicate session refreshes during startup ( #114764 )
...
* fix(ui): avoid duplicate startup session refreshes
* fix(ui): remove redundant hydration return
* test(ui): prove session hydration reconnect ownership
* test(ui): align reconnect proof with single hydration
* test(ui): wait explicitly for catalog startup
* test(ui): isolate tool anchor navigation state
---------
Co-authored-by: scotthuang <scotthuang@tencent.com >
Co-authored-by: Vincent Koc <vincentkoc@ieee.org >
2026-07-28 23:15:07 +08:00
Peter Steinberger
053384fa01
refactor(ui): adopt @lit/task for async data lifecycle ( #115131 )
...
* refactor(ui): adopt @lit/task for async data lifecycle
- migrate chat diff/discussion, new-session discovery, and MCP app setup reads
- migrate usage, plugins, transcript/checkpoint, worktree, memory-import, and model-setup reads
- delete read-lane request counters, abort-controller epochs, and current-request predicates while retaining mutation epochs and keyed caches
* chore(ui): drop dead plugin search helper (knip)
* chore(deps): allowlist @lit/task as root UI-workspace dependency in knip
* fix(ui): preserve usage refresh lifecycle
* test(ui): source workboard fixture copy from en locale (raw-copy gate)
* test(ui): read workboard fixture copy via t() (typed locale access)
* style: format test-support imports
2026-07-28 08:37:47 -04:00
Peter Steinberger
7f37900bca
perf(ui): flip sessions instantly and drop redundant switch RPCs ( #115129 )
...
* perf(ui): flip sessions instantly and drop redundant switch RPCs
* chore: revert changelog edit (release generation owns CHANGELOG.md)
* test(ui): adapt ported switch e2e tests to split-suite helpers
* chore(ui): un-export internal CachedShortSession type (knip)
2026-07-28 06:25:25 -04:00
Peter Steinberger
18556423da
fix(cron): allow no-timeout scheduled jobs in Control UI ( #115090 )
2026-07-28 05:46:17 -04:00
Vincent Koc
4d105ebdd0
refactor(ui): share board provider helpers ( #115082 )
2026-07-28 16:49:12 +08:00
Peter Steinberger
4b05d83035
fix: generated images do not appear in native chat ( #115042 )
...
* fix(chat): render managed images in native clients
Co-authored-by: Francesco Giannicola <francescogiannicola1@gmail.com >
* chore: keep release changelog owned
* refactor(macos): split managed image loading
* test(apple): prove managed image header policy
* test(native): stabilize managed image proof
* test(apple): satisfy strict concurrency checks
---------
Co-authored-by: Francesco Giannicola <francescogiannicola1@gmail.com >
2026-07-28 04:39:53 -04:00
Peter Steinberger
0771486cc1
fix(ui): mirror optimistic session-settings patches into the sessions capability snapshot ( #115009 )
...
Chat kept optimistic thinking-level and fast-mode row patches only in the
host copy of the session list. Any mid-flight capability publish (for
example the loading flip at the start of the post-patch list refresh)
replaced that copy wholesale and reverted the patched row until the
refreshed canonical list landed. The reasoning slider visibly snapped
back to the inherited default during that window and keyboard commits
landing inside it were swallowed, which is the race behind the flaky
chat-composer-redesign thinking-slider e2e assertion on CI.
patchSessionRow now mirrors the optimistic fields into the published
capability snapshot via a new SessionCapability.patchRowLocal, matching
how model overrides already live capability-side, so intermediate
publishes carry the patch and the revert window is gone.
2026-07-28 03:27:51 -04:00
Peter Steinberger
81478b564e
fix(ui): prevent duplicate Workboard widget loads and card moves ( #114972 )
...
* fix(ui): coalesce concurrent Workboard widget updates
* fix(ui): remove stale Workboard refresh guard
2026-07-28 03:18:26 -04:00
Peter Steinberger
854a7f0e91
fix(ui): preserve agent, session, locale, and dashboard ownership ( #114896 )
...
* fix(ui): isolate sessions and preserve agent-scoped state
* test(ui): stabilize agent-scoped chat startup browser proof
2026-07-28 01:02:06 -04:00
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
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
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
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
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
8e848f457e
fix: harden cron delivery and Workboard dispatch ( #114499 )
2026-07-27 07:03:41 -04:00
Peter Steinberger
c56689416e
fix(ui): scope global route resolution by agent
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
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
Peter Steinberger
af552d4bc6
feat(ui): resolve session URLs through the gateway with best-effort slug matching ( #114422 )
...
* feat(ui): resolve session URLs through the gateway with best-effort slug matching
Session URLs now resolve a stored board face and a display-name slug through
the gateway instead of guessing from the browser's cached session page.
- An uncached open marks only the in-app navigation, never the shareable href,
so the chat loader can re-derive the face and replace the URL.
- A cached row settles the lookup locally, keeping navigation off the wire.
- A one-segment reference resolves short id, then literal key, then display-name
slug; ties reuse the existing disambiguation view.
* refactor(ui): keep slug ties on short disambiguation prefixes
Slug candidates reused the full uuid, which produced 32-character links in the
disambiguation view. uniqueShortIdPrefix already falls back to the full id when
the bounded search was truncated, so reuse it and drop the flag.
* fix(ui): navigate worktree owner links in-app so the face marker survives
The Worktrees owner link was a bare anchor consuming only the shareable href,
so preferenceDerivedFace was a no-op there and an uncached owner always opened
on chat. Match the other session surfaces: keep the clean href and navigate
with the options on plain clicks.
* fix(ui): search the first uuid block so long session references resolve
The gateway matches sessions.list search as a plain substring and stored keys
hold a hyphenated uuid, so any hyphen-stripped reference past the first block
matched nothing and 404'd. This hit disambiguation links, which offer prefixes
longer than eight characters. Send the first block and keep applying the full
prefix per row.
A resolved slug now canonicalizes to that same short reference instead of a
full uuid, so /chat/main/deploy-monitor settles on -6db92d48.
* docs(ui): record why the face marker stays out of shareable hrefs
2026-07-27 04:31:33 -04:00
Peter Lee
0406e66369
fix(ui): keep stable chat rows in insertion order and only sort live tool/stream items by timestamp ( #113266 )
...
* fix(ui): keep stable chat rows in insertion order and only sort live tool/stream items by timestamp
* fix(ui): keep live rows within current turn
* fix(ui): keep current work above queued turns
* fix(ui): keep streamed replies above queued turns
* fix(ui): preserve reconnecting run order
* fix(ui): preserve causal terminal ordering
* fix(ui): bound replay rows to owning turns
* fix(ui): keep question summaries in owning turns
* fix(ui): scope question run ownership to session
* fix(ui): restore reconnecting chat run identity
* fix(ui): remove unused chatItemTimestamp import in chat-thread-build.ts
* fix(ui): correlate question summaries with agent runs
Co-authored-by: Peter Lee <li.xialong@xydigit.com >
* chore(i18n): refresh native source baseline
Co-authored-by: Peter Lee <li.xialong@xydigit.com >
* fix(ui): remove unused chatItemTimestamp export and split tool-stream test file
---------
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-27 02:08:22 -04:00
Peter Steinberger
256988e068
refactor(ui): consolidate workboard regression fixtures ( #114348 )
...
* refactor(ui): consolidate workboard regression fixtures
* test(ui): preserve nullable workboard refresh fixture
2026-07-27 01:48:05 -04:00