feat(desktop): multi-transport hosts with relay fallback, card-style services dropdown
- A saved host now keeps every transport its pairing link carried: direct URL plus the relay descriptor, with one token for both (the mobile connection model). Switching tries the direct leg and falls back to the E2EE tunnel; list probes report Connected · Relay when only the tunnel reaches the host; relaunch restore picks direct first - Host switching trusts the dropdown's fresh probe instead of re-probing on click (no doubled latency, no transient Unreachable flashes); statuses are written once with the final outcome, survive the dropdown closing via a last-known cache, and an unprobed host reads Checking — never Unknown - Open-in-new-window works for relay hosts: a new IPC command boots the local UI with the host id injected and the renderer picks the transport; the app render holds on the relay restore so the splash shows instead of a transient auth screen (10s safety valve) - Relay host control socket gained protocol-level keepalive: a missed pong window terminates and reconnects, so the relay can no longer hold a ghost registration that leaves every client tunnel hanging; the desktop relay probe also hard-times-out at 8s instead of hanging status flows - Services dropdown restyled with mobile-style cards: per-provider usage cards, per-host instance cards with a selected highlight and a toned status line, MCP servers grouped in a card
This commit is contained in:
@@ -62,6 +62,14 @@ if (clientToken && isLocalPage) {
|
||||
contextBridge.exposeInMainWorld('__OPENCHAMBER_CLIENT_TOKEN__', clientToken);
|
||||
}
|
||||
|
||||
// Which saved host this window should connect to over the relay-capable path
|
||||
// (direct probe first, E2EE tunnel fallback). Local pages only — the id is
|
||||
// only useful together with the desktop IPC channel anyway.
|
||||
const relayHostId = readArgValue('--openchamber-relay-host-id');
|
||||
if (relayHostId && isLocalPage) {
|
||||
contextBridge.exposeInMainWorld('__OPENCHAMBER_RELAY_HOST_ID__', relayHostId);
|
||||
}
|
||||
|
||||
if (runtimeHeadersRaw && isLocalPage) {
|
||||
try {
|
||||
const runtimeHeaders = JSON.parse(runtimeHeadersRaw);
|
||||
|
||||
Reference in New Issue
Block a user