Peter Steinberger
b4e10e8a90
fix: preserve markdown formatting around media attachments ( #116786 )
...
Co-authored-by: Peter Steinberger <steipete@macos.shared >
2026-07-31 04:20:39 -07:00
Shakker
fcf2e7aadc
test: type session request parameters ( #116713 )
2026-07-31 09:21:05 +01:00
Shakker
75d10f8e4f
fix: retain event invalidation for pagination
2026-07-31 09:21:05 +01:00
Shakker
fe5d591cc3
fix: preserve queued session refresh options
2026-07-31 09:21:04 +01:00
Vincent Koc
b3ce00b480
refactor(schema): share config validation runtime ( #116622 )
2026-07-31 12:40:48 +08:00
Vincent Koc
9906f810f6
test(ui): remove duplicate avatar route coverage ( #116656 )
2026-07-31 12:02:12 +08:00
Vincent Koc
183db47e97
fix(ui): preserve schema-backed settings edits ( #116282 )
...
* fix(ui): harden schema-backed settings controls
Co-authored-by: wangmiao0668000666 <wang.miao86@xydigit.com >
* test(ui): match config secret label in Chromium
* chore(ui): remove release-owned changelog entry
* test(agents): mock incremental registry persistence
---------
Co-authored-by: wangmiao0668000666 <wang.miao86@xydigit.com >
2026-07-30 23:08:53 +08:00
Omar Shahine
5f4471c8d3
feat(ui): finish cron -> Automations rename in visible strings ( #114853 )
...
* feat(ui): finish cron -> Automations rename in visible strings
* fix(ui): strip persisted pre-rename Cron labels before applying the Automation prefix
Codex review finding: gateway rows persist labels as 'Cron: ...' (and keep
writing them until the strings PR lands), so the renamed typed prefix
double-rendered as 'Automation: Cron: ...'. Legacy label prefixes are now
stripped before prefixing; regression tests cover both stored shapes.
* fix(ui): catalog typed-session prefixes and refresh locale catalogs for the rename
Review follow-ups: typed-session prefixes come from the i18n catalog and
display branching uses machine identity (session kind), not translated text;
remaining English feature labels (config group, settings nav, dreaming intro)
renamed; all 20 locale catalogs refreshed through the owner sync (translated,
strict ui:i18n:check green) with a non-English regression protecting the
renamed keys.
* chore(ui): reconcile locale catalogs after rebase onto main locale refresh
* fix(ui): keep locale bundles workflow-owned; pin the rename at the English source
CI isolates generated locale artifacts from source PRs (preflight changed-scope
gate); the post-merge control-ui-locale-refresh workflow owns retranslation.
This PR ships the English source, catalog prefix keys, and machine-identity
display branching; the regression pins the renamed keys at the source of truth.
* fix(ui): move rename catalog test out of workflow-owned locales dir
---------
Co-authored-by: Omar Shahine <10343873+omarshahine@users.noreply.github.com >
2026-07-30 07:18:19 -07:00
Peter Steinberger
7fa95e2656
feat(ui): add composable skill references ( #116330 )
...
* feat(ui): add composable skill references
* fix(ui): align skill reference CI contracts
* fix(ui): scope skill references to WebChat
2026-07-30 04:07:02 -07:00
Vincent Koc
2d9cf7b6d1
improve(ui): guide optional channel setup after model setup ( #116078 )
2026-07-30 09:08:07 +08:00
Peter Steinberger
d60436a4ee
feat(ui): transcode renditions and waveform audio cards ( #116115 )
...
* feat(ui): add chat media renditions and waveforms
* fix(ui): tighten media playback guards
* fix(ui): bound waveform decode memory
* fix(ui): harden media playback retries
* fix(ui): preserve valid media state
* fix(ui): stop detached video playback
* fix(ui): bound media artifact resolution
* fix(ui): reject failed media fallback sources
* refactor(ui): split attachment availability helpers
* fix(ui): unload media across auth resets
* fix(ui): retain the longest-lived media ticket
2026-07-29 16:44:05 -07:00
Vincent Koc
925fdb023e
refactor(ui): remove retired time format bootstrap ( #116097 )
2026-07-29 22:23:27 +00:00
Vincent Koc
9eee6181d7
fix(ui): serialize Control UI config writers ( #116029 )
2026-07-30 05:09:23 +08:00
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