Skip to content

Align web and Chrome extension UI with VAV desktop - #31

Merged
Obooman merged 15 commits into
mainfrom
cursor/align-client-ui-5633
Sep 5, 2026
Merged

Align web and Chrome extension UI with VAV desktop#31
Obooman merged 15 commits into
mainfrom
cursor/align-client-ui-5633

Conversation

@Obooman

@Obooman Obooman commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

Web, Remote, and the Chrome extension were a second product: vanilla DOM, a <select> run bar, and custom You/Agent markup. They now mount the same desktop AppSidebar, SessionDetail, Transcript, Composer, SessionRunPicker, AgentModelPicker — and load the same index.css (including workspace-view flex) so the session column stays a horizontal composer dock, not a crushed preview.

Phone-only chrome stays thin: pairing, the current-tab chip (ported into the desktop detail-stream above the dock), and the e2e contract fields (#model / #approval / #sendForm). window.vav is a phone-protocol adapter (hello.role=phone). Turns stay in vavd. The worker does not grow an AgentRuntime.

Sending writes configure on the same conversation before send. Browser e2e covers web configure/stub reply and extension pair (URL, auto-discover, vav-daemon://) plus page context, and asserts the composer dock is a horizontal session column that the page chip does not cover.

iOS cannot import React; it keeps the same phone protocol and desktop run-bar order.

Open in Web Open in Cursor 

cursoragent and others added 15 commits September 5, 2026 02:34
Desktop now starts the loopback web bridge on the embedded daemon (and in-process when there is no child). The side panel auto-discovers it, and a pasted Connect URI or local http/ws URL attaches to the same secret.

Co-authored-by: Oboo Cheng <oboochin@gmail.com>
…dge.

Electron e2e now boots with VAVD_SPAWN, waits for /discover on 4752–4762, and completes a phone hello over /vav.

Co-authored-by: Oboo Cheng <oboochin@gmail.com>
Desktop 1.19.0 users open the app, then the side panel — or paste the
Connect vav-daemon:// line. Cover both against a desktop-style spawned
vavd (web on 4752) through a real Chrome extension turn.

Co-authored-by: Oboo Cheng <oboochin@gmail.com>
runtime.onMessage ignored type=pair, so pasted Connect lines never
reached the service worker. Accept that message, take the host name
from welcome, and assert auto-discover plus vav-daemon:// paste against
a uniquely named desktop-style vavd.

Co-authored-by: Oboo Cheng <oboochin@gmail.com>
Web and the side panel were separate HTML/CSS/JS copies. They now mount
the same app-shell: 232px sidebar, You/Agent transcript, thinking-process,
tool-call rows, and the desktop run bar (mode · approval · model ·
thinking · Fast). iOS already used that order; keep it as the phone
reference next to desktop.

Co-authored-by: Oboo Cheng <oboochin@gmail.com>
Phone clients were a second UI (custom sidebar, contract fields as the
run bar). They now render the same App / Sidebar / SessionDetail /
Composer shell, with pairing and page-context chrome on top. Sending
configures the host conversation before the turn so e2e model/approval
stick.

Co-authored-by: Oboo Cheng <oboochin@gmail.com>
Stub the desktop preload surface the browser is missing so App can
mount. Configure still lands on the host conversation; tests now read
the thread that received the turn instead of a workspace-minted empty
session.

Co-authored-by: Oboo Cheng <oboochin@gmail.com>
The HTML is now the App mount (phone.js). The /vav socket lives in the
bundle, not inline markup.

Co-authored-by: Oboo Cheng <oboochin@gmail.com>
…umn.

Phone clients already mount App, but they skipped filePreview.css — the
rules that make WorkspaceView a flex session + collapsed preview drawer.
Without them the composer crushes into a strip and the empty file-preview
state paints over the log. Import the same index.css desktop uses, and
assert the dock stays a horizontal session column in Chrome.

Co-authored-by: Oboo Cheng <oboochin@gmail.com>
The current-tab chip was a fixed overlay at the old vanilla composer
offset, so it covered the desktop dock. Portal it into detail-stream
(same slot as attachment chips) and assert it does not overlap the
composer. Harden vavd spawn teardown against EIO on close.

Co-authored-by: Oboo Cheng <oboochin@gmail.com>
Headless Chrome sometimes throws EIO on close after a green assertion.
That flake was failing otherwise-passing web and extension layout runs.

Co-authored-by: Oboo Cheng <oboochin@gmail.com>
macos-14 now ships system Chrome, so the test ran against a browser it
was meant to skip and timed out on the stub reply. Prefer Playwright's
browser; only fall back to system Chrome on a developer machine.

Co-authored-by: Oboo Cheng <oboochin@gmail.com>
tsc for src/main has no DOM types. Read page globals from globalThis
when Playwright runs the probe in Chrome so typecheck can stay node-only.

Co-authored-by: Oboo Cheng <oboochin@gmail.com>
sessionStore.send requires attachments, and popupMenu needs the native
menu item types. CI never reached tsc while the browser tests failed.

Co-authored-by: Oboo Cheng <oboochin@gmail.com>
macOS runners sometimes asserted the minted temp dir before the host
bind was visible on ConversationStore, after the dial already returned.

Co-authored-by: Oboo Cheng <oboochin@gmail.com>
@Obooman
Obooman marked this pull request as ready for review September 5, 2026 06:30
@Obooman
Obooman merged commit 0004345 into main Sep 5, 2026
3 checks passed
@cursor cursor Bot mentioned this pull request Sep 5, 2026
3 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants