export const deepLinkEvent = "opencode:deep-link" export const parseDeepLink = (input: string) => { if (!input.startsWith("opencode://")) return if (typeof URL.canParse === "function" && !URL.canParse(input)) return const url = (() => { try { return new URL(input) } catch { return undefined } })() if (!url) return if (url.hostname !== "open-project") return const directory = url.searchParams.get("directory") if (!directory) return return directory } export const collectOpenProjectDeepLinks = (urls: string[]) => urls.map(parseDeepLink).filter((directory): directory is string => !!directory) type OpenCodeWindow = Window & { __OPENCODE__?: { deepLinks?: string[] } } export const drainPendingDeepLinks = (target: OpenCodeWindow) => { const pending = target.__OPENCODE__?.deepLinks ?? [] if (pending.length === 0) return [] if (target.__OPENCODE__) target.__OPENCODE__.deepLinks = [] return pending }