- Extended `parseCollabLink` test coverage to reject 16-byte and 40-byte fragments instead of only rejecting short keys. - Added coverage for full-link fragments to ensure key and write token are parsed when present. - Updated `GuestClient` test setup so `welcomeFrame` carries a `readOnly` flag into snapshot assertions.
@oh-my-pi/collab-web
Web client for omp collab sessions. Paste a /collab link into the browser and you get the same live session guests see in the TUI: streaming transcript, tool-call cards, subagent panel with live transcripts, and a composer that prompts (or interrupts) the host agent.
Quick start
# dev server (Bun HTML dev server with HMR) — http://localhost:3000
bun run dev
# offline demo: local relay + scripted mock host; prints a ws://localhost link
bun run mock-host
Host a session from any omp instance (/collab, or /collab ws://localhost:7466 to use the mock relay), then paste the printed link into the connect screen. Deep links work too: http://localhost:3000/#<roomId>#<key> auto-connects on load.
Build & deploy
bun run build # static site in dist/
dist/ is a fully static SPA — host it anywhere. JS/CSS bundles are content-hashed; favicons, manifest.webmanifest, robots.txt, sitemap.xml, and og-image.png come from public/ and are emitted at the site root under stable names (canonical URL: https://relay.omp.sh/). Two runtime requirements:
- Secure context: room keys are unwrapped with WebCrypto (
crypto.subtle), which browsers expose only onhttps://orlocalhost. - Relay reachability: the client connects straight to the relay over WebSocket (
wss://for anything that isn't localhost). The default relay iswss://relay.omp.sh; bare<roomId>#<key>links resolve against it.
The room key never leaves the URL fragment — it is not sent to the relay or any server.
Architecture
src/lib/— vendored wire codec (codec.tsAES-256-GCM,link.tsenvelope + link grammar),socket.tsreconnecting relay socket,client.tsguest session store (GuestClient+ immutable snapshots foruseSyncExternalStore). Shared protocol shapes come from@oh-my-pi/pi-wire.src/components/—transcript/(entries, markdown, tool cards),agents/(panel + transcript drawer),shell/(connect screen, header, composer, banners, toasts).scripts/—local-relay.ts(content-blind relay onBun.serve),mock-host.ts+fixture.ts(scripted host for offline dev).
The package is intentionally standalone — no dependency on @oh-my-pi/pi-coding-agent at runtime or type level. Wire-shape drift is prevented by consuming the same @oh-my-pi/pi-wire contracts as the host, with sealed-frame interop still covered by test/codec.test.ts.