import { notifyError } from './notifications' // Window flag set by the Electron main process when it opens a standalone // session window (see electron/main.cjs buildSessionWindowUrl). It rides in the // query string BEFORE the HashRouter '#', so we read it from location.search, // never from the router. A "secondary" window renders a single chat without the // global session sidebar or the install / onboarding overlays. const SECONDARY_WINDOW_FLAG = 'secondary' let secondaryWindowCache: boolean | null = null export function isSecondaryWindow(): boolean { if (secondaryWindowCache !== null) { return secondaryWindowCache } let result = false try { result = new URLSearchParams(window.location.search).get('win') === SECONDARY_WINDOW_FLAG } catch { result = false } secondaryWindowCache = result return result } let watchWindowCache: boolean | null = null // A "watch" window spectates a session that is being driven elsewhere (a // running subagent). It resumes lazily — the gateway registers history + a // transport for the live mirror without building an agent, so opening it is // cheap even while the backend is busy running the delegation. export function isWatchWindow(): boolean { if (watchWindowCache !== null) { return watchWindowCache } let result = false try { result = new URLSearchParams(window.location.search).get('watch') === '1' } catch { result = false } watchWindowCache = result return result } // True when running inside the Electron desktop shell (the preload bridge is // present). The "open in new window" affordance is desktop-only. export function canOpenSessionWindow(): boolean { return typeof window !== 'undefined' && typeof window.hermesDesktop?.openSessionWindow === 'function' } // Open (or focus) a standalone OS window for a single chat session. No-ops // gracefully outside Electron so callers can wire it unconditionally. // `watch: true` opens a spectator window (lazy resume, live-mirror stream). export async function openSessionInNewWindow(sessionId: string, opts?: { watch?: boolean }): Promise { if (!sessionId || !canOpenSessionWindow()) { return } try { const result = await window.hermesDesktop.openSessionWindow(sessionId, opts) if (!result?.ok) { notifyError(new Error(result?.error || 'unknown error'), 'Could not open chat in a new window') } } catch (err) { notifyError(err, 'Could not open chat in a new window') } }