import { createRouter } from '@@/create-router'; import { sendSidecarCommand, isSidecarConnected } from '@@/sidecar-registry'; import { DESKTOP_SIDECAR_KIND, type DesktopEvent } from '../sidecar/protocol'; export const router = createRouter(); // The desktop UI asks for the password before it can open the WebSocket — and that WebSocket is what // starts the VNC session. So this cannot wait for a session to exist: on a fresh install nothing has // ever written the password, and answering "not configured" deadlocked the page permanently. // // Officer does not read the password file itself. It lives in the owner's ~/.vnc, next to the rfbauth // file x11vnc authenticates against, and the sidecar is the process that writes both — so it is the // process that answers for them too. `vnc:ensure-password` is idempotent: it returns the existing // pair when both files are already there, and provisions them when they are not. router.get('/vnc-password', async (ctx) => { const user = ctx.get('user'); if (!isSidecarConnected(DESKTOP_SIDECAR_KIND)) { return ctx.json({ error: 'VNC sidecar is not connected' }, 503); } try { // Addressed through the platform's GENERIC door: it matches the reply by id and knows nothing about // what `vnc:ensure-password` means. The vocabulary is this plugin's — see sidecar/protocol.ts. const reply = await sendSidecarCommand(DESKTOP_SIDECAR_KIND, { type: 'vnc:ensure-password', id: crypto.randomUUID(), email: user.email, }); if (reply.type === 'vnc:error') throw new Error(reply.error); if (reply.type !== 'vnc:password') throw new Error(`unexpected reply ${reply.type}`); const password = reply.password; return ctx.json({ password }); } catch (err) { const message = err instanceof Error ? err.message : 'Could not provision the VNC password'; console.error('[desktop] VNC password provisioning failed:', message); return ctx.json({ error: message }, 500); } }); // GET /vnc-status is gone. It was never called — DesktopView asks only for /vnc-password — and it was // the sole reason the `vnc:status` command existed on the sidecar wire protocol at all. Noted as dead // by docs/sidecar-audit-2026-07.md months ago.