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
Vincent Koc
14ffd4393e
feat(ui): add provider icons to coding catalogs ( #115956 )
2026-07-30 01:33:15 +08: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
d7d3fc5dad
feat(ui): enable tool-loop detection from Labs ( #115983 )
...
* feat(ui): add tool loop detection lab
* docs(tools): mention loop detection lab
2026-07-29 13:21:52 -04:00
Vincent Koc
a47d81e7b3
fix(ui): derive cron timezone suggestions ( #115973 )
2026-07-30 01:12:45 +08:00
Peter Steinberger
c87e545c88
fix(ui): rename the Memory Palace browser to Memory Wiki and document it ( #115954 )
...
* fix(ui): rename the Memory Palace browser to Memory Wiki and document it
* refactor(memory-wiki): drop the old memory-palace module files
* docs: refresh generated docs map
* test(ui): align dream-diary hub-tab assertion with the wiki sub-tab id
* docs: describe memory wiki clustering behavior accurately
* docs(memory-wiki): record the wiki.overview rename decision at the registration site
* test(ui): query the Agents channels hub tab by tab role after the hub-tabs refactor
2026-07-29 12:51:37 -04:00
Peter Steinberger
5bfc65d7f4
refactor: remove 3,543 lines of redundant runtime and tests ( #115961 )
...
* refactor: remove 3,543 lines of redundant runtime and tests
* refactor: ratchet production environment variable budget
2026-07-29 11:43:41 -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
f083518506
Merge pull request #115942 from openclaw/fix/macos-keyboard-accessibility
...
fix(accessibility): restore web view navigation and layout-aware shortcuts
* commit 'fd28cd3becfded364107f236f526b08422f8ebab':
fix(ui): support shortcuts on non-Latin keyboards
fix(macos): enable keyboard navigation in web views
2026-07-29 23:29:56 +08:00
Peter Steinberger
df3674f577
refactor(ui): unify tab navigation on the shared hub tabs ( #115934 )
...
* refactor(ui): unify tab navigation on shared hub tabs
* refactor(ui): move cron navigation to hub tabs
* test(ui): update agent overview tab locator
2026-07-29 11:24:44 -04:00
Vincent Koc
fd28cd3bec
fix(ui): support shortcuts on non-Latin keyboards
2026-07-29 23:09:22 +08:00
Vincent Koc
0570d53691
fix(ui): keep hide confirmation in viewport ( #115928 )
2026-07-29 22:51:08 +08:00
Peter Steinberger
53815217e9
fix(memory): session backfill drains and rolls back reversibly ( #115926 )
...
* fix(memory): complete reversible session backfill
* refactor(memory): split backfill lifecycle helpers
* fix(memory): break backfill lifecycle import cycle
* fix(memory): keep lifecycle contract exports minimal
2026-07-29 10:48:16 -04:00
Miorbnli
7e3e4f6cd9
fix(ui): do not report stopped channels as connected ( #112518 )
...
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-29 10:47:10 -04:00
finallylly
25f1e70480
feat: add Asia/Shanghai to cron timezone suggestions ( #65936 )
...
* feat: add Asia/Shanghai to cron timezone suggestions
Adds Asia/Shanghai to the CRON_TIMEZONE_SUGGESTIONS list for users
in the Asia region who want to use their local timezone in cron schedules.
* fix(ui): preserve original cron contribution during main refresh
* fix(ui): suggest Asia/Shanghai for cron schedules
Preserve @finallylly original PR #65936 ; move its one-line IANA timezone suggestion to the current cron UI owner and cover the actual rendered Chromium datalist.
---------
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-29 10:27:32 -04:00
Peter Steinberger
68a3d28906
fix: keep content after HTML-backed disclosures visible ( #115877 )
...
* fix(chat): close disclosures in coalesced HTML
Keep model-authored details closers visible to the shared disclosure contract when CommonMark absorbs them into type-6 HTML blocks across the Control UI and native apps.
* refactor(apps): isolate disclosure unfolding
Keep the native disclosure segmenter below its lint complexity and type-size limits, and refresh the source-owned native i18n inventory after the move.
* fix(apps): align disclosure helper visibility
Keep the extracted same-file helper compatible with Swift access control while leaving its implementation types hidden outside the source file.
* fix(apps): align source replacement visibility
Keep the source replacement helper at the same file-private boundary as the extracted disclosure unfolding types.
2026-07-29 10:24:46 -04:00
Peter Steinberger
88c41f44de
feat(ui): add MCP servers from composer connectors ( #115921 )
2026-07-29 10:23:52 -04:00
Vincent Koc
099b806a9b
fix(ui): reduce embedded terminal font size
2026-07-29 22:22:17 +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
loong954
f5959499a5
fix(ui): preserve Unicode in session key truncation ( #109860 )
...
* fix(ui): preserve Unicode in session key truncation
Replace raw .slice(0, 8) with truncateUtf16Safe for session key
truncation in usage overview fallback display.
* test(ui): add Unicode-safe session key truncation tests
Five cases verify truncateUtf16Safe replaces .slice(0,8) for session
key display in usage overview:
- short keys unmodified, ASCII truncation, surrogate pair straddling
boundary, emoji within limit, exact-8-char keys
* test(ui): verify Unicode usage sessions in Chromium
Co-authored-by: 袁龙辉0668001277 <yuan.longhui@xydigit.com >
---------
Co-authored-by: 袁龙辉0668001277 <yuan.longhui@xydigit.com >
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-29 10:04:50 -04:00
Colin Johnson
306c02af57
feat(ui): preview session workspace images ( #95956 )
...
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-29 09:22:46 -04:00
Peter Steinberger
4624f681ad
refactor(ui): give Memory the shared hub header with hoisted agent scope ( #115884 )
2026-07-29 08:48:05 -04:00
synth
c0070d70ab
fix(ui): muted theme text below WCAG AA contrast in webchat ( #114586 )
...
* fix(ui): raise muted theme text tokens to WCAG AA contrast
Secondary text using --muted/--muted-foreground measured 3.1-3.5:1 on
several bundled themes (issue #107299 ), below the 4.5:1 AA floor for
normal text. Nudges the offending hex tokens and adds a vitest guardrail
that parses base.css and asserts every text-on-surface token pairing in
every theme block stays >= 4.5:1 so future palette edits can't regress
this silently.
Closes #107299
* fix(ui): satisfy oxlint and noUncheckedIndexedAccess in contrast test
- Number.parseInt over global parseInt, ** over Math.pow, toSorted over sort
- Guard regex capture groups and indexed access under noUncheckedIndexedAccess
* test(ui): cover rendered theme contrast in Chromium
* test(ui): prove Skill Workshop mobile width in Chromium
* test(ui): stabilize deferred history prepend anchors
* test(ui): serialize rendered theme color diagnostics
---------
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-29 08:26:10 -04:00
Peter Steinberger
a49b553f08
feat(ui): add docs links to settings pages ( #115874 )
2026-07-29 08:11:41 -04:00
batmanscode
f3b70d5902
fix(ui): include proxy credentials in manifest requests ( #111053 )
...
* fix(ui): include credentials in manifest requests
* test(ui): verify authenticated PWA manifest browser requests
---------
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-29 08:10:36 -04:00
Vincent Koc
38abf500ba
fix(update): stabilize cross-version dev upgrades ( #115651 )
...
* fix(e2e): stabilize cross-version Parallels upgrades
* fix(e2e): avoid inline macOS guest probes
* fix(e2e): detach Windows dev updates
* fix(e2e): detach macOS guest updates with Node
* fix(e2e): initialize skipped upgrade config
* fix(update): use partial clone for dev checkout
* fix(update): keep Windows dev checkouts clean
* fix(e2e): pin Parallels dev update targets
* fix(e2e): own Parallels gateway restarts
* fix(e2e): verify pinned Parallels checkouts
* fix(e2e): forward Parallels update budgets
* fix(e2e): use canonical provider auth choices
* chore: leave changelog to release automation
* test(ui): stabilize route waits on loaded runners
2026-07-29 19:52:34 +08:00
openclaw-mantis[bot]
6e782e021b
chore(ui): refresh control ui locales ( #115843 )
...
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-07-29 19:39:29 +08:00
xydigit-sj
7b34145e44
fix(ui): fall back to updateAvailable.latestVersion for handoff version verification ( #112987 )
...
* fix(ui): derive pending update expected version from updateAvailable fallback
* test(ui): verify managed update handoff after reconnect
* style(ui): format managed handoff browser regression
* test(ui): align managed update verification with gateway phases
* fix(ui): keep skill workshop within the mobile viewport
* test(ui): await sidebar route readiness after reload
---------
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-29 07:28:14 -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
af70829cdf
refactor(ui): move Agent Defaults entry from the sidebar into the Agents page ( #115836 )
...
* refactor(ui): move Agent Defaults entry from the sidebar into the Agents page
* fix(ui): keep Agent Defaults searchable
2026-07-29 06:30:40 -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
b6f70ea440
fix(setup): make Gemini recovery actionable ( #115835 )
2026-07-29 18:29:32 +08:00
Peter Steinberger
f318df7a55
refactor(ui): dissolve the General settings page into Appearance ( #115798 )
...
* refactor(ui): dissolve the General settings page into Appearance
* test(ui): drop dissolved config route expectation
* test(ui): cover legacy General model redirect
* style(ui): format legacy redirect test
2026-07-29 05:49:20 -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
Vincent Koc
47c1921d5d
fix(ui): stabilize memory engine selection ( #115750 )
2026-07-29 11:37:39 +02: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
cc6b766079
fix(ui): guide users through missing or broken AI setup ( #115716 )
...
* fix(ui): block chat until inference is configured
* fix(ui): gate new sessions on configured inference
* fix(ui): gate custodian before inference starts
* fix(ui): clarify custodian setup navigation
* fix(ui): explain missing AI provider setup
* fix(ui): distinguish unavailable configured AI
* fix(ui): align inference setup fixtures
* test(ui): default mock gateway to working inference
* test(ui): align startup send gate coverage
* test(ui): inherit inference in gateway fixtures
* test(ui): normalize deferred gateway agents
* test(ui): update model setup sidebar fixture
2026-07-29 16:48:48 +08:00
Vincent Koc
0f9c702d8b
fix(ui): collapse custodian startup error gap ( #115720 )
2026-07-29 16:43:30 +08: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
Vincent Koc
87a66ddf2d
fix(ui): unify sidebar thread density ( #115646 )
2026-07-29 16:12:54 +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
Peter Steinberger
d885f9175d
feat(ui): move settings save feedback into the sidebar footer ( #115679 )
...
* feat(ui): move settings save feedback to sidebar
* test(ui): support stateful config writes in mock gateway
* test(ui): add save indicator to memory sidebar test
2026-07-29 04:10:56 -04:00
Peter Steinberger
4a108155c5
fix(ui): restore in-flight assistant replies after reconnect ( #115691 )
...
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-29 04:09:29 -04:00
Peter Steinberger
62c71c7b23
fix(control-ui): defer local media checks until preview roots load ( #115672 )
...
Carry forward Brandon Zarnitz original bootstrap fix into the current Control UI owner modules. Keep the authenticated Gateway authoritative until preview roots arrive and preserve populated-root denials. Add fail-first regressions, real Chromium audio/image and denial flows, and ticket/authentication proof.
Fixes #67915
Co-authored-by: Brandon Zarnitz <bzarnitz13@gmail.com >
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-29 03:55:24 -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
7018a36d04
feat(ui): memory settings polish — inline add-on toggles, phase explanations, embedding test ( #115557 )
...
* feat(ui): toggle memory add-ons inline on the Settings tab
* feat(ui): improve memory overview and settings controls
* fix(ui): restore rejected settings toggles
* fix(ui): surface memory add-on restart requirements
* fix(ui): reconcile restart notices by gateway process
* fix(ui): preserve pending restart notices
* fix(ui): order memory add-on catalog reloads
* fix(ui): reload add-ons through current gateway
* fix(ui): respect plugin mutation availability
* test(ui): type the plugins.list mock fallback for mutationAllowed
2026-07-29 03:40:52 -04:00
Peter Steinberger
18535626ed
test(ui): cover imported Claude history redaction ( #115683 )
...
Co-authored-by: Peter Steinberger <steipete@gmail.com >
2026-07-29 03:36:38 -04:00