diff --git a/packages/coding-agent/CHANGELOG.md b/packages/coding-agent/CHANGELOG.md index 8f225ac04..2c25a2fb3 100644 --- a/packages/coding-agent/CHANGELOG.md +++ b/packages/coding-agent/CHANGELOG.md @@ -27,7 +27,7 @@ - Updated collab link handling to accept compact `roomId#key` links and relay hosts without explicit scheme when joining or starting sessions - Added `/collab stop` and `/collab status` options to control and inspect active shared sessions -- Added `/collab`, `/join`, and `/leave` for live session sharing: the host shares an end-to-end encrypted link (AES-256-GCM key only in the link fragment; the relay sees opaque bytes) and guests render the session natively in their own TUI — streaming text, tool cards, footer state, ctrl+o expansion, `/dump` — and can prompt or interrupt the host's agent. Guest prompts render with an author badge; session-mutating commands stay host-only. Defaults to the public `relay.omp.sh` relay (`collab.relayUrl`); a self-hostable Go relay lives in the pi-www repo as `omp-collab-relay` +- Added `/collab`, `/join`, and `/leave` for live session sharing: the host shares an end-to-end encrypted link (AES-256-GCM key only in the link fragment; the relay sees opaque bytes) and guests render the session natively in their own TUI — streaming text, tool cards, footer state, ctrl+o expansion, `/dump` — and can prompt or interrupt the host's agent. Guest prompts render with an author badge; session-mutating commands stay host-only. Defaults to the public `my.omp.sh` relay (`collab.relayUrl`); a self-hostable Go relay lives in the pi-www repo as `omp-collab-relay` - Added `collab.relayUrl` and `collab.displayName` settings plus a `collab` status-line segment showing the participant count (host) or guest role. Guests mirror the host's real model/thinking state into their replica agent and the host's subagent ecosystem end-to-end: the live subagent HUD, the Agent Hub table with live progress, hub chat/kill/revive (routed to the host), and on-demand subagent transcript viewing - Added `omp join ` subcommand that launches the interactive TUI and immediately runs `/join ` diff --git a/packages/coding-agent/test/collab/crypto.test.ts b/packages/coding-agent/test/collab/crypto.test.ts index 706330a3b..41c41839d 100644 --- a/packages/coding-agent/test/collab/crypto.test.ts +++ b/packages/coding-agent/test/collab/crypto.test.ts @@ -102,7 +102,7 @@ describe("collab link format", () => { }); it("parses the scheme-less display form of web deep links", () => { - const parsed = parseCollabLink(`relay.omp.sh/#${formatCollabLink(DEFAULT_RELAY_URL, roomId, key)}`); + const parsed = parseCollabLink(`my.omp.sh/#${formatCollabLink(DEFAULT_RELAY_URL, roomId, key)}`); if ("error" in parsed) throw new Error(parsed.error); expect(parsed.wsUrl).toBe(`${DEFAULT_RELAY_URL}/r/${roomId}`); expect(Buffer.from(parsed.key)).toEqual(Buffer.from(key)); @@ -137,7 +137,7 @@ describe("collab link format", () => { it("keeps the key out of web-link path and query", () => { const webLink = formatCollabWebLink(DEFAULT_RELAY_URL, roomId, key); const url = new URL(webLink); - expect(url.origin).toBe("https://relay.omp.sh"); + expect(url.origin).toBe("https://my.omp.sh"); expect(url.pathname).toBe("/"); expect(url.search).toBe(""); expect(url.hash).toBe(`#${roomId}#${Buffer.from(key).toString("base64url")}`); diff --git a/packages/coding-agent/test/join-command.test.ts b/packages/coding-agent/test/join-command.test.ts index 16246c0f2..5bf0926e4 100644 --- a/packages/coding-agent/test/join-command.test.ts +++ b/packages/coding-agent/test/join-command.test.ts @@ -9,8 +9,8 @@ import { isSubcommand, resolveCliArgv } from "@oh-my-pi/pi-coding-agent/cli-comm describe("join command is registered as a top-level subcommand", () => { test("CLI runner routes `join ` to the join command, not launch", () => { expect(isSubcommand("join")).toBe(true); - expect(resolveCliArgv(["join", "wss://relay.omp.sh/s/abc#key"])).toEqual({ - argv: ["join", "wss://relay.omp.sh/s/abc#key"], + expect(resolveCliArgv(["join", "wss://my.omp.sh/s/abc#key"])).toEqual({ + argv: ["join", "wss://my.omp.sh/s/abc#key"], }); }); }); diff --git a/packages/collab-web/README.md b/packages/collab-web/README.md index a3d1d8df0..98d7b660c 100644 --- a/packages/collab-web/README.md +++ b/packages/collab-web/README.md @@ -20,10 +20,10 @@ Host a session from any omp instance (`/collab`, or `/collab ws://localhost:7466 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: +`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://my.omp.sh/`). Two runtime requirements: - **Secure context**: room keys are unwrapped with WebCrypto (`crypto.subtle`), which browsers expose only on `https://` or `localhost`. -- **Relay reachability**: the client connects straight to the relay over WebSocket (`wss://` for anything that isn't localhost). The default relay is `wss://relay.omp.sh`; bare `#` links resolve against it. +- **Relay reachability**: the client connects straight to the relay over WebSocket (`wss://` for anything that isn't localhost). The default relay is `wss://my.omp.sh`; bare `#` links resolve against it. The room key never leaves the URL fragment — it is not sent to the relay or any server. diff --git a/packages/collab-web/index.html b/packages/collab-web/index.html index 6ddabc4df..367aa4daf 100644 --- a/packages/collab-web/index.html +++ b/packages/collab-web/index.html @@ -12,7 +12,7 @@ content="Guest client for omp collab sessions: watch a live coding-agent session — streaming transcript, tool calls, subagents — and prompt the host agent from any browser. End-to-end encrypted; the room key never leaves the URL fragment." /> - + @@ -26,13 +26,13 @@ - + - + @@ -41,13 +41,13 @@ - + - + @@ -56,7 +56,7 @@ "@context": "https://schema.org", "@type": "WebApplication", "name": "omp collab", - "url": "https://relay.omp.sh/", + "url": "https://my.omp.sh/", "applicationCategory": "DeveloperApplication", "operatingSystem": "Any", "description": "Browser guest client for omp collab live sessions: streaming transcript, tool calls, subagent panel, and a composer that prompts the host agent. End-to-end encrypted.", diff --git a/packages/collab-web/public/robots.txt b/packages/collab-web/public/robots.txt index 34bd17b1c..66fafa979 100644 --- a/packages/collab-web/public/robots.txt +++ b/packages/collab-web/public/robots.txt @@ -2,4 +2,4 @@ User-agent: * Allow: / Disallow: /r/ -Sitemap: https://relay.omp.sh/sitemap.xml +Sitemap: https://my.omp.sh/sitemap.xml diff --git a/packages/collab-web/public/sitemap.xml b/packages/collab-web/public/sitemap.xml index 3b25af0ad..c6fa474c0 100644 --- a/packages/collab-web/public/sitemap.xml +++ b/packages/collab-web/public/sitemap.xml @@ -1,7 +1,7 @@ - https://relay.omp.sh/ + https://my.omp.sh/ monthly 1.0 diff --git a/packages/collab-web/scripts/local-relay.ts b/packages/collab-web/scripts/local-relay.ts index cfa1eeae2..a09b6d960 100644 --- a/packages/collab-web/scripts/local-relay.ts +++ b/packages/collab-web/scripts/local-relay.ts @@ -1,5 +1,5 @@ /** - * Offline stand-in for the public collab relay (`wss://relay.omp.sh`). + * Offline stand-in for the public collab relay (`wss://my.omp.sh`). * * Speaks the exact relay contract the real clients expect: * - `GET /r/?role=host|guest` upgrades to a WebSocket. diff --git a/packages/collab-web/test/link.test.ts b/packages/collab-web/test/link.test.ts index 9a2e0ca76..5314e678c 100644 --- a/packages/collab-web/test/link.test.ts +++ b/packages/collab-web/test/link.test.ts @@ -60,7 +60,7 @@ describe("collab link parsing", () => { }); it("parses web deep links (https:///#)", () => { - const bare = parseCollabLink(`https://relay.omp.sh/#${ROOM}#${KEY_TEXT}`); + const bare = parseCollabLink(`https://my.omp.sh/#${ROOM}#${KEY_TEXT}`); if ("error" in bare) throw new Error(bare.error); expect(bare.wsUrl).toBe(`${DEFAULT_RELAY_URL}/r/${ROOM}`); expect(bare.key).toEqual(KEY); diff --git a/packages/wire/CHANGELOG.md b/packages/wire/CHANGELOG.md index 45e63a22e..e10170c70 100644 --- a/packages/wire/CHANGELOG.md +++ b/packages/wire/CHANGELOG.md @@ -6,6 +6,7 @@ - Added `readOnly` flags to participant and session payload types to indicate when a guest is connected via a read-only (view) link - Added `writeToken` to `GuestFrame` hello payloads and parsed collaboration links so full-access links can carry and expose a write-capability token - Added `ROOM_KEY_BYTES` and `WRITE_TOKEN_BYTES` constants for room key and write-token sizing in the wire protocol +- Added `DEFAULT_SHARE_URL` (`https://my.omp.sh/s`), the default share viewer/upload base for `/share` links ## [15.11.8] - 2026-06-12 diff --git a/packages/wire/src/index.ts b/packages/wire/src/index.ts index d5158d0a3..6cb6e03fb 100644 --- a/packages/wire/src/index.ts +++ b/packages/wire/src/index.ts @@ -364,7 +364,10 @@ export const ROOM_KEY_BYTES = 32; export const WRITE_TOKEN_BYTES = 16; /** Default public relay; bare `#` links resolve against it. */ -export const DEFAULT_RELAY_URL = "wss://relay.omp.sh"; +export const DEFAULT_RELAY_URL = "wss://my.omp.sh"; + +/** Default share viewer/upload base; `/share` links resolve against `/#`. */ +export const DEFAULT_SHARE_URL = "https://my.omp.sh/s"; export interface ParsedCollabLink { /** wss://host[:port]/r/ — no query, no fragment. */ diff --git a/packages/wire/test/constants.test.ts b/packages/wire/test/constants.test.ts index 4a11a0b46..8141e69e0 100644 --- a/packages/wire/test/constants.test.ts +++ b/packages/wire/test/constants.test.ts @@ -13,6 +13,6 @@ describe("collab wire constants", () => { expect(COLLAB_PROMPT_MESSAGE_TYPE).toBe("collab-prompt"); expect(ENVELOPE_HEADER_LENGTH).toBe(4); expect(ROOM_ID_BYTES).toBe(16); - expect(DEFAULT_RELAY_URL).toBe("wss://relay.omp.sh"); + expect(DEFAULT_RELAY_URL).toBe("wss://my.omp.sh"); }); });