Commit Graph

332 Commits

Author SHA1 Message Date
Peter Steinberger 8fdf7570a1 feat(gateway): live Desktop observer for cloud workers (Labs) (#120727)
* feat(gateway): live desktop observer for cloud workers

Adds live observation for cloud worker desktops through the gateway and Crabbox plugin, including desktop provisioning, persisted desktop metadata, tunneled WebSocket proxying, and the worker.desktop.observe protocol method.

The gateway, Crabbox plugin, and gateway protocol surfaces remain off by default behind the cloudWorkers.desktop Labs flag.

* feat(ui): Desktop panel for cloud worker observation

* docs(gateway): document cloud worker desktop lab

* fix(ci): regenerate contract baselines after rebase

* fix(protocol): regenerate Android gateway methods

* fix(ci): align rebased SDK and lint baselines

* fix(gateway): enforce view-only RFB boundary and fence desktop teardown

* fix(gateway): tighten RFB filter surface

* fix(state): keep pre-desktop databases readable and harden view-only RFB

* fix(gateway): fence desktop observer upgrades behind work admission

* fix(gateway): bind desktop observer tokens to their owner epoch

* fix(ci): regenerate config and SDK baselines after rebase

* fix(ci): regenerate native protocol and SDK baselines

* fix(ci): regenerate contracts after main rebase

* fix(state): register desktop metadata as lazy additive

* fix(ci): regenerate SDK baseline after final direct-merge rebase
2026-08-09 09:37:01 -07:00
Peter Steinberger 8616c0c374 refactor: finish shared test helper migrations (#120996)
* test: finish shared helper migrations

* test: fix helper migration CI

* style: fix test import ordering

* test(acpx): restore deferred void types

* test: fix helper migrations after rebase
2026-08-09 06:00:06 -07:00
Shakker 7874024748 fix: preserve staged browser annotations across remounts 2026-08-09 13:56:55 +02:00
Colin Johnson c44b01614d fix: profile saves leave stale sidebar identity (#120791)
Profile identity changes now refresh immediately across connected browsers, including revisioned avatar URLs that avoid stale cached images.

Fixes #120784
Prepared head SHA: 20fb9ea42d
Co-authored-by: Colin Johnson <211764741+Solvely-Colin@users.noreply.github.com>
Co-authored-by: Shakker <165377636+shakkernerd@users.noreply.github.com>
Reviewed-by: @shakkernerd
2026-08-09 11:58:19 +01:00
Peter Steinberger 6f56d797d7 fix(ui): survive route notFound at startup and stop silent chat draft loss (#120960) 2026-08-09 02:57:54 -07:00
Peter Steinberger e40e352fe7 refactor(session-url): centralize normalization and contract tests (#120945)
* refactor(session-url): centralize contract normalization

* fix(ui): resolve normalization agent-id alias

* test(session-url): make grammar tables type-safe
2026-08-09 02:56:07 -07:00
Peter Steinberger f67da420f6 feat(ui): labs-gated CLI agent targets in new-session model picker (#120949)
* feat(config): gate CLI agent discovery

* feat(ui): add CLI agents to model picker
2026-08-09 00:00:00 -07:00
Peter Steinberger b4cedfd40e fix(ui): show dev checkout commit lag in Updates (#120769)
* fix(ui): report dev checkout update status

Show tracked-upstream commit lag and verified install/commit timestamps in Settings > Updates. Verify the post-restart Git revision before reporting success, and surface same-revision updates as an explicit no-op unless plugin convergence changed the install.

* test(ui): expect authoritative update reconciliation
2026-08-08 17:21:42 -07:00
Peter Steinberger bd6d35443f fix(ui): keep dashboards alive across view switches (#120640)
* fix(ui): retain dashboards across view switches

Keep visited dashboard runtimes alive across Chat, Split, and Dashboard transitions, suspend hidden work, and avoid same-face persistence requests.

Refs #120639

* fix(ui): preserve session owner during route loads

Carry the last successful route match through pending loads so face-only navigation retains dashboard runtimes without stranding session or catalog switches.

Refs #120639

* fix(ui): preserve sandbox bridge while hidden

Suspend hidden board frame work without disposing the one-shot sandbox handshake, loaded document, or MessagePort.

Refs #120639

* fix(ui): forward sandbox readiness while hidden

Keep the constrained sandbox message channel alive during dashboard suspension so one-shot proxy readiness reaches the retained host without resuming widget work.

Refs #120639

* fix(ui): pause hidden plugin widgets

Propagate board activity through trusted plugin renderers so Workboard widgets suppress hidden refresh and mutation work, then refresh once without remounting.

Refs #120639
2026-08-08 15:53:59 -07:00
Peter Steinberger 47fd629c8d feat(gateway): persist per-origin device auth (#120533)
* feat(gateway): add per-origin device auth

* fix(ui): remove unused gateway scope alias

* test(tui): split gateway chat coverage

* test(tui): update connection test routing

* fix(auth): preserve legacy device auth migration guard
2026-08-08 13:53:31 -07:00
Peter Steinberger f15ce3941f refactor(ui): devices is the user-facing word for paired hardware (#120689)
Implements docs/plan/runners.md milestone 1b.
2026-08-08 13:47:17 -07:00
Peter Steinberger 1889764369 revert(ui): session is the product noun — undo thread copy rename (#120667)
Implements docs/plan/runners.md milestone 1a.
2026-08-08 12:43:05 -07:00
Peter Steinberger e7a9f33d89 refactor(core): adopt normalization-core leaf helpers across production (#120350)
* refactor(core): adopt normalization-core leaf helpers across production

* fix(ci): keep plugin contract source-resolvable

* fix(errors): preserve adapter-owned error fields

* fix(errors): short-circuit existing errors before stringifying

* fix(errors): skip throwing structured getters

* ci: retrigger checks on current base

* fix(errors): guard structured error enumeration

* fix: harden error detail copying
2026-08-08 12:00:49 -07:00
Peter Steinberger e3de98a451 feat(update): scheduled update campaigns with countdown, dev-channel auto-update, and Updates settings page (#120506)
* feat(update): scheduled update campaigns with countdown, dev-channel auto-update, and Updates settings page

* fix(ui): satisfy update campaign deadcode checks

* feat(update): extend scheduled update campaigns

* test(ui): include Updates page in settings sidebar search expectations

* fix(update): end campaigns when apply fails

* fix(update): pin dev campaign applies to the announced commit

* test(ui): align update e2e fixtures

* fix(update): pin adopted dev updates to the announced commit

* docs(update): document automatic dev update campaigns

* fix(ui): gate automatic dev updates on git installs

* fix(gateway): scope detailed update metadata to read-capable clients

* fix(gateway): break post-attach madge cycle with a leaf client-lookup type

* chore(protocol): regenerate clients after rebase

* test(gateway): update method tail after rebase

* fix(update): preserve campaign target and hold state

* test(update): align adoption mocks and split handoff suite

* test(update): route split handoff suites on Windows
2026-08-08 11:19:53 -07:00
Peter Steinberger 1e004151c6 fix(ui): prevent Git metadata stalls from blocking Control UI builds [AI] (#120490)
* fix(ui): bound advisory Git build metadata reads

* fix(ui): hard-kill lockless Git metadata reads
2026-08-08 07:39:24 -07:00
Peter Steinberger 2cfacdb671 fix(ui): move stale-client refresh notice into the sidebar update card (#120483)
* fix(ui): move stale-client refresh notice into the sidebar update card

The 'Server updated — refresh for full capabilities' notice rendered as a
full-width callout at the top of <main>, where the fixed shell-chrome
controls (nav toggle / search, layout.css z-index 45) overlap its text.

Move the notice into the existing sidebar-update-card slot above the
identity/connectivity footer: refreshRequired takes precedence over
updateAvailable (a stale client cannot trust its own update metadata),
renders non-dismissible with a refresh icon and two-line text, and is
wired through the sidebar, settings sidebar, and collapsed-nav floating
card. The old top-of-main banner branch, its resolver helper, and the
orphaned i18n key are deleted.

* fix(ui): keep stale-client refresh visible during onboarding and clear collapsed chrome cluster

Address both accepted ClawSweeper P2 findings:

- restore the stale-client refresh action during onboarding
- keep the floating update card clear of the three-button collapsed chrome cluster
2026-08-08 03:06:12 -07:00
Peter Steinberger 13e8e1df4a fix(ui): hide connection form during initial auth (#120372)
* fix(ui): hide connection form during initial auth

Use the authoritative gateway connecting/error state so trusted-proxy, Tailscale, bootstrap, device, and token auth all keep the centered loading screen until the first handshake resolves. Real failures still reveal the login gate, manual retries stay pinned, and established reconnects retain the shell.

* fix(ui): preserve approval document login gate

Scope the neutral unresolved first-connect splash to the normal Control UI document. Standalone approval links continue to expose their authentication gate without losing the deep link, while embedded terminal behavior remains unchanged.
2026-08-07 17:18:02 -07:00
Peter Steinberger 8bf62e7007 refactor(ui): derive gateway types from protocol and consolidate navigation/error helpers (#120348)
* refactor(protocol): derive shared gateway types

* refactor(ui): consolidate navigation click handling

* refactor(ui): centralize UI state and error helpers
2026-08-07 15:25:07 -07:00
Jason (Json) ab4761f3fc fix(ui): preserve structured login error codes (#120069) 2026-08-07 11:09:11 -06:00
Shakker 93b2b0fde0 test: split preference lifecycle coverage 2026-08-06 21:44:44 +01:00
Shakker 55e1246702 refactor: separate preference state policy 2026-08-06 21:44:44 +01:00
Shakker 698520f654 fix: satisfy preference sync type checks 2026-08-06 21:44:44 +01:00
Shakker 56ab6ce78e fix: label browser-local read-only preferences 2026-08-06 21:44:44 +01:00
Shakker fa06a000c5 fix: reconcile preference intent across tabs 2026-08-06 21:44:44 +01:00
Shakker e118e607bc fix: apply server preference deltas after read-only edits 2026-08-06 21:44:44 +01:00
Shakker 5a88b7b9a2 fix: keep read-only preferences browser-local 2026-08-06 21:44:43 +01:00
Shakker c56ad42525 fix: grant host-authorized control ui owner access 2026-08-06 02:21:45 +01:00
Jason (Json) 47ce26985d fix(ui): preserve profile avatars under Control UI base paths (#119308)
* fix(ui): preserve active session status layout

* fix(ui): preserve avatar paths and fork lineage

* fix(ui): preserve avatars under control UI base paths
2026-08-05 00:31:04 -06:00
Peter Steinberger 8d2996937f fix(ui): clear split-pane questions after answers and cancellations (#118787)
* fix(ui): reconcile question outcomes across gateway projections

* fix(ui): preserve question outcomes after pane disposal

---------

Co-authored-by: Peter Steinberger <steipete@macos.shared>
2026-08-04 18:28:19 -07:00
Shakker 65545770d0 fix: preserve workshop revisions across session navigation 2026-08-04 17:48:31 +01:00
Shakker 28495ea691 refactor: isolate workshop revision handoff 2026-08-04 17:48:31 +01:00
Shakker 34e73d25a6 fix: bind revision handoffs to gateway snapshots 2026-08-04 17:48:31 +01:00
Shakker e0bda43954 fix: prevent workshop revision replay after reconnect 2026-08-04 17:48:31 +01:00
Shakker 58259c0720 fix: recheck config access before dispatch 2026-08-04 17:48:31 +01:00
Peter Steinberger e99f6dc4c3 fix(ui): surface onboarding and pairing clipboard failures (#118651)
* fix(ui): surface onboarding and pairing clipboard failures

* fix(ui): keep translated clipboard labels after feedback resets
2026-08-03 05:53:28 -07:00
Peter Steinberger b438b9605f fix: dashboards fail to load and interrupted first-time setup never recovers (#118388)
* fix: recover dashboards and interrupted first-time setup

* fix: clarify managed proxy bypass boundary

---------

Co-authored-by: Peter Steinberger <steipete@macos.shared>
2026-08-02 19:56:40 -07:00
Peter Steinberger 9aead8a897 test(ui): run runtime-free suites in Node (#118198)
Co-authored-by: Peter Steinberger <steipete@mac-studio-sf2.local>
2026-08-02 14:46:14 -07:00
Shakker 040e0f5a6e fix: disable unauthorized session controls 2026-08-02 18:32:19 +01:00
Shakker 2c96af3b76 fix: gate new session creation by operator scope 2026-08-02 18:32:19 +01:00
Peter Steinberger 76cb418b6f fix(macos): reopen AI choice, fix daemon error text, hand onboarding off to the dashboard custodian (#117921)
* fix(macos): let onboarding replace an auto-connected AI

The AI page auto-tests the best detected candidate and connects without
asking, then hides every alternative route. Add 'Choose a different AI'
to the connected banner: a re-detect pass with auto-activation
suppressed that ends at the picker (candidates, provider sign-in, API
keys). Also disable the manual key Connect button while another test
runs (submitManualKey silently dropped the tap), and isolate a test
that read the machine's real resume store.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(macos): surface real daemon errors past the Node banner

Gateway daemon failures summarized as 'Node.js v26.5.1' because the
summary takes the last non-empty line and Node fatal errors end with a
version banner. Drop trailing banner lines and prefer the last
error-shaped line above them; all other output keeps its last line.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat(macos): hand onboarding off to the dashboard custodian

Native onboarding now ends once inference verifies: welcome, connection,
install (when needed), AI setup. Finish opens the dashboard at
/custodian?onboarding=1, where the custodian onboarding owns memory
import, channels, app recommendations, and the hatch (browser-first per
the onboarding redesign). The native memory-import and permissions
pages leave the first-run flow; 'Set up later' keeps the native ready
page. The native navigation bridge gains a validated optional search
field so the handoff can request onboarding chrome; the URL fallback
carries the query alongside the token fragment.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* refactor(macos): delete the unreachable native memory-import module

The dashboard handoff removed the memory-import page from every flow,
leaving the module reachable only from tests. CI's dead-code scan
rightly flagged the first orphans; remove the whole path (model, page,
mascot wiring, tests) instead of trimming symbol by symbol. The
dashboard's own memory-import surface owns the feature.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Peter Steinberger <steipete@mac-studio-sf2.local>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-02 02:57:25 -07:00
Peter Steinberger 0ab2443692 fix(ui): eliminate core contract drift (#117817)
* fix(ui): eliminate core contract drift

* fix(ui): resolve cleanup contract checks
2026-08-01 22:10:22 -07:00
Peter Steinberger e98fdeefdf refactor(errors): consolidate message formatting (#117818) 2026-08-01 22:05:49 -07:00
Peter Steinberger d585c0c1ec fix(ui): keep newer Appearance choices after delayed theme imports [AI-assisted] (#117292)
* fix(ui): fence stale custom theme imports

* test(ui): split custom theme ownership coverage

* fix(ui): fence external theme import ownership

* fix(ui): separate theme import activation ownership

* fix(ui): bind theme imports to authoritative intent

* refactor(ui): own custom theme import lifecycles

* test(ui): refresh memory helper routing expectation

* test(ui): emit custom theme race verdict
2026-08-01 02:07:10 -07:00
Peter Steinberger 4a27e2d3aa fix(ui): keep canvas lease renewals lifecycle-owned and timer-safe (#117173)
Co-authored-by: Peter Steinberger <steipete@macos.shared>
2026-07-31 19:55:29 -07:00
Peter Steinberger 7e78de747b refactor(ui): replace duplicated locale bundles with canonical translation memory (#117157)
* refactor(ui): generate locale bundles from canonical translation memory

* fix(ui): keep server-only locale config out of browser test helpers
2026-07-31 19:40:27 -07:00
Peter Steinberger 91aff8089c fix(ui): retire stale Gateway event-log observers (#117169)
Co-authored-by: Peter Steinberger <steipete@macos.shared>
2026-07-31 19:39:29 -07:00
Peter Steinberger 3c81eb4925 fix(ui): scope Gateway reconnect lineage to its target (#117125)
Co-authored-by: Peter Steinberger <steipete@macos.shared>
2026-07-31 17:38:17 -07:00
Peter Steinberger 5d6f21122c fix(ui): canonical plugin settings, reconnect, and freshness ownership (#117047)
* fix(ui): unify memory and plugin config mutation ownership

* test(ui): prove committed memory refresh failures in Chromium

* fix(ui): preserve concurrent memory mutation outcomes

* test(ui): prove model setup reloads after reconnect

* test(ui): await mocked reconnect handshake before restoring model

* fix(ui): own model setup connection generations

* test(ui): use valid setup gateway hello fixtures

* test(ui): synchronize memory mutation owner regressions

* fix(ui): bind memory restart notices to executing gateway process

* fix(ui): scope setup and memory state to gateway connections

* fix(ui): prevent stale memory restart notice ownership

* fix(ui): separate gateway refresh warnings from restart notices

* test(ui): await current memory catalog before reconnect actions

* fix(ui): clear shared memory refresh warnings after authoritative updates

* test(ui): click the visible memory add-on switch host

* test(ui): assert canonical gateway refresh error text

* test(ui): align gateway fixtures and dead-code ownership

---------

Co-authored-by: Peter Steinberger <steipete@macos.shared>
2026-07-31 17:30:46 -07:00
Peter Steinberger 7bae24760b refactor(ui): make sessions and navigation reliable across reconnects (#117103)
* refactor(ui): consolidate connection ownership and split control shell

* fix(ui): keep terminal session contract with reconciliation owner
2026-07-31 16:36:47 -07:00
Peter Steinberger 4976eb38ab fix(ui): honor Gateway readiness abort and subscription ownership (#117048)
* fix(ui): keep canceled gateway waits retired

* test(ui): bind Gateway readiness test helper callback

* test(ui): isolate server locale preference singleton

---------

Co-authored-by: Peter Steinberger <steipete@macos.shared>
2026-07-31 15:06:55 -07:00