Commit 445e896
M1: Browser use in the platform-hosted virtual desktop (#42624)
* feat(gateway): proxy /v1/desktop/stream to the runtime and open it through velay (#41949)
Claude-Session: https://claude.ai/code/session_012YDF6hHcX7aPZsc6TuByhy
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
* feat(web): interactive pod desktop panel over noVNC (#41951)
Claude-Session: https://claude.ai/code/session_012YDF6hHcX7aPZsc6TuByhy
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
* feat(assistant): on-demand pod desktop session streamed over /v1/desktop/stream (#41952)
* feat(assistant): on-demand pod desktop session streamed over /v1/desktop/stream
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012YDF6hHcX7aPZsc6TuByhy
* chore(feature-flags): align pod-desktop registry wording with the web client entry
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012YDF6hHcX7aPZsc6TuByhy
---------
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
* fix(gateway): desktop stream dropped-frame handling, shared guardian-stream tests, comment trims (#41957)
Claude-Session: https://claude.ai/code/session_012YDF6hHcX7aPZsc6TuByhy
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
* fix(assistant): pod desktop startup rollback, tigervncconfig, baked Chromium, 4xxx close codes (#41966)
Claude-Session: https://claude.ai/code/session_012YDF6hHcX7aPZsc6TuByhy
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
* fix(web): pod desktop clipboard leak, 4xxx close codes, lazy noVNC, shared gateway WS resolver (#41960)
* fix(web): pod desktop clipboard leak, 4xxx close codes, lazy noVNC, shared gateway WS resolver
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012YDF6hHcX7aPZsc6TuByhy
* fix(web): drop stray generated-client symlink from the commit
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012YDF6hHcX7aPZsc6TuByhy
* fix(web): spell out desktop end-reason keys for the catalog-usage guard
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012YDF6hHcX7aPZsc6TuByhy
---------
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
* fix(assistant): pod desktop retry waits for teardown, module-level shutdown latch, image and env hardening (#41985)
Claude-Session: https://claude.ai/code/session_012YDF6hHcX7aPZsc6TuByhy
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
* chore(web): drop dead gateway WS URL builders and trim desktop stream comments (#41983)
Claude-Session: https://claude.ai/code/session_012YDF6hHcX7aPZsc6TuByhy
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
* test(gateway): adopt the shared runtime-stream test harness in every stream suite (#41982)
Claude-Session: https://claude.ai/code/session_012YDF6hHcX7aPZsc6TuByhy
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
* fix(web): let Escape reach the pod desktop instead of closing the modal (#41992)
Claude-Session: https://claude.ai/code/session_012YDF6hHcX7aPZsc6TuByhy
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
* fix(assistant): pod desktop waits out SIGKILL before retry, bridge always releases on start failure (#41993)
Claude-Session: https://claude.ai/code/session_012YDF6hHcX7aPZsc6TuByhy
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
* refactor: rename the pod-desktop flag to assistant-desktop (#42071)
The flag is not in LaunchDarkly yet, so this is a pure rename with no
migration or compatibility shim.
- registry id/key `pod-desktop` -> `assistant-desktop`, label `Pod Desktop`
-> `Assistant Desktop`, bundled copies resynced
- `isPodDesktopEnabled` -> `isAssistantDesktopEnabled` and the flag constant
in `assistant/src/desktop/desktop-feature.ts`
- web selector `useAssistantFeatureFlagStore.use.podDesktop()` ->
`.assistantDesktop()`
- `PodDesktopAffordance` -> `AssistantDesktopAffordance`, files renamed to
`assistant-desktop-affordance.tsx` / `.test.tsx`
- i18n `podDesktop.*` -> `assistantDesktop.*` in all five locale catalogs and
in the desktop-panel key map, keys still spelled out for the catalog guard
- ARCHITECTURE.md section "Pod Desktop Stream" -> "Assistant Desktop Stream",
plus the prose that carried the old name
The route `/v1/desktop/stream`, the `assistant/src/desktop/` directory and the
web `domains/chat/desktop/` directory are unchanged.
Claude-Session: https://claude.ai/code/session_012YDF6hHcX7aPZsc6TuByhy
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* feat(assistant): add a tint2 taskbar to the pod desktop (#42121)
openbox alone draws no panel, so the streamed desktop had no taskbar,
window list or clock. Launch tint2 with its stock config after the window
manager, preflight the binary with the other three, and treat a panel exit
as non-fatal: the desktop keeps running, and teardown still kills it.
Claude-Session: https://claude.ai/code/session_012YDF6hHcX7aPZsc6TuByhy
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* feat(assistant): dock-style desktop taskbar with pinned apps, wider viewer (#42124)
* feat(assistant): dock-style desktop taskbar with pinned apps, wider viewer
Generate a tint2rc at desktop start instead of running tint2 stock: a
bottom-centered floating dock with rounded translucent chrome, icon-only
launchers and window buttons, and generated .desktop launchers for
Playwright's Chromium and xterm. Widen the viewer modal to
min(96vw, 1600px) and shrink its header to a 36px band.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012YDF6hHcX7aPZsc6TuByhy
* feat(assistant): run a compositor so the dock renders rounded
tint2 only gets an ARGB visual when a compositor is already running, so
the rounded translucent dock config rendered as an opaque square strip.
Spawn xcompmgr right after openbox and before the dock, as a cosmetic
child whose spawn failure and exit are logged and left alone.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012YDF6hHcX7aPZsc6TuByhy
---------
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* chore(web): add a third-party licence notice for noVNC (#42142)
noVNC is MPL-2.0, which asks that recipients of the executable form be told
the licence and where to get the source. The bundler preserves its copyright
headers but nothing carried the licence text or a durable source link.
Adds a notice served from the web build root, so it travels with the bundle
rather than living only in the repo. Records the component, version,
copyright, licence, the pinned v1.7.0 source and npm tarball, and an explicit
"not modified by Vellum", followed by noVNC's own notice (which says which of
its files are MPL and which are more permissive) and the full MPL-2.0 text.
The macOS and Windows clients package this same web build so they carry the
file; iOS and Android load the hosted web app, so they reach it over the
network.
Claude-Session: https://claude.ai/code/session_012YDF6hHcX7aPZsc6TuByhy
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix: scope the drop-close to the desktop stream and pin the runtime playwright (#42169)
The shared frame pump behind /v1/stt/stream, /v1/watch/stream and
/v1/desktop/stream closed both sides with 1011 whenever a downstream send
returned 0. That teardown is desktop-specific: RFB is an ordered byte stream
with no resync, so a lost frame corrupts the framebuffer for good, while the
two JSON routes carry self-contained lifecycle and transcript frames.
- `closeOnDroppedFrame` is now an opt-in on the handler factory, taken only by
the desktop stream. stt and watch log and carry on, at debug rather than
warn: the usual trigger is a runtime frame landing just after the browser
socket closed, which is benign and once per session.
- Bun's send returns a byte count, so an empty frame also returns 0. A drop
now requires a non-empty payload.
The image bakes Chromium from `/app/assistant`'s pinned playwright, but the
runtime installed a floating one into the external dir. A different playwright
looks for a different browser build id, so the bake bought a pod nothing and
the first browser call or PDF export re-downloaded Chromium. The runtime
install now asks for the version `assistant/package.json` pins, and replaces a
copy left at any other version.
Also restores the dropped live-voice assertion that a resolve without a
conversationId produces a URL with no conversationId parameter.
Claude-Session: https://claude.ai/code/session_012YDF6hHcX7aPZsc6TuByhy
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* feat(desktop): install components on demand and launch Google Chrome
* fix(desktop): keep failed setup retryable after partial installation
* fix(gateway): register explicit desktop setup route paths
* fix(desktop): use system apt and load the viewer after setup
* fix(desktop): honor custom CA bundles during installation
* fix(desktop): install components for direct stream clients
* feat: add gated assistant desktop computer use
* fix: preserve existing desktop VNC override capabilities
* fix: validate drag destinations against desktop observations
* fix: address desktop control lifecycle review feedback
* Regenerate web API clients when development schemas change
* Use the desktop feature flag for skill discovery and control
* Decode DirectColor desktop screenshots with channel maps
* Decode packed 24-bit desktop screenshot pixels
* Smooth assistant desktop pointer movement
* Use the assistant avatar as the streamed desktop wallpaper (#42549)
* Add assistant avatar wallpaper to streamed desktop
* Queue wallpaper refreshes during active avatar renders
* Add raised assistant OS lettering to desktop wallpaper
* fix(desktop): hide Chrome command-line warning through managed policy (#42562)
* Fix streamed desktop app dock behavior (#42561)
* fix(desktop): unify app launchers and running windows in the dock
* fix(desktop): recover dock initialization and retain app cleanup
* Polish streamed desktop window decorations (#42570)
* Polish streamed desktop window decorations
* Add avatar accents and preserve Openbox include paths
* Use a subtle avatar gradient in desktop title bars
* Add GNOME Mines to the streamed Linux desktop (#42576)
* feat(desktop): include GNOME Mines in on-demand desktop setup
* fix(desktop): add Mines to existing dock layouts
* Use the browser CLI for streamed desktop Chrome over CDP
* Release failed cleanup ownership when the desktop exits
* Repair inherited companion markup and refresh the skill catalog
* Render the desktop pointer without HTML injection
* Refresh skill catalog after merging the feature branch
* Follow current-turn cancellation when reusing desktop control
* Queue API client generation across schema changes
* Invalidate Vite caches after API client generation
* Refresh skill catalog after merging main
* Sync catalog metadata for the latest main merge
* Direct desktop captures through the browser CLI
* Preserve normal browser routing when desktop control ends
* Separate desktop ownership from native computer actions
* Keep M1 browser use independent of native computer control
* Consolidate desktop browser guidance in CLI help
* Reconnect desktop browser control to Chrome reopened from the dock
* Refresh closed desktop CDP connections through input cleanup
* Select browser defaults for web and native desktop clients
* Preserve existing native browser selection
* Rename virtual desktop and restrict it to platform assistants
* Keep virtual desktop cursor visible across navigation and dialogs
* Install virtual desktop automatically on first browser or viewer use
* Keep virtual desktop cursor above keyboard-opened dialogs
* Complete first browser action after virtual desktop setup
* Align browser routing guidance with automatic first-use setup
* Recover virtual browser profiles after container replacement
* Trim repeated virtual desktop browser guidance
* Restore M1 to bb9d565 before browser recovery changes
* Keep computer observation hooks in M2
* Show virtual desktop controls only in the modal header
* Center Desktop headers and shrink control buttons
* Remove explicit desktop handoff and allow direct viewer input
* Align desktop setup documentation with handoff removal
* Remove obsolete handoff instructions from browser help
* Fix IPC disconnect cleanup and remove remaining desktop handoff routes
---------
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>1 parent 5123707 commit 445e896
67 files changed
Lines changed: 3715 additions & 371 deletions
File tree
- assistant
- docs
- scripts
- src
- __tests__
- browser
- cli/commands
- __tests__
- daemon
- __tests__
- desktop
- __tests__
- ipc
- __tests__
- runtime
- __tests__
- routes
- tools/browser
- cdp-client
- __tests__
- cdp-inspect
- __tests__
- clients/web/src
- domains/chat
- components
- desktop
- i18n/locales
- en
- es
- ru
- zh-TW
- zh
- lib/feature-flags
- meta/feature-flags
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
810 | 810 | | |
811 | 811 | | |
812 | 812 | | |
813 | | - | |
| 813 | + | |
814 | 814 | | |
815 | | - | |
| 815 | + | |
816 | 816 | | |
817 | | - | |
| 817 | + | |
818 | 818 | | |
819 | 819 | | |
820 | 820 | | |
821 | | - | |
| 821 | + | |
822 | 822 | | |
823 | 823 | | |
824 | 824 | | |
| |||
828 | 828 | | |
829 | 829 | | |
830 | 830 | | |
| 831 | + | |
| 832 | + | |
| 833 | + | |
| 834 | + | |
| 835 | + | |
| 836 | + | |
| 837 | + | |
| 838 | + | |
831 | 839 | | |
832 | 840 | | |
833 | 841 | | |
| |||
0 commit comments