(
url: string,
options?: { isRemote?: boolean; useGlimpse?: boolean }
)
| 186 | } |
| 187 | |
| 188 | export async function openBrowser( |
| 189 | url: string, |
| 190 | options?: { isRemote?: boolean; useGlimpse?: boolean } |
| 191 | ): Promise<boolean> { |
| 192 | try { |
| 193 | const rawPlannotatorBrowser = process.env.PLANNOTATOR_BROWSER; |
| 194 | const rawBrowser = process.env.BROWSER; |
| 195 | const plannotatorBrowser = isNoOpBrowserSentinel(rawPlannotatorBrowser) |
| 196 | ? undefined |
| 197 | : rawPlannotatorBrowser; |
| 198 | const envBrowser = isNoOpBrowserSentinel(rawBrowser) ? undefined : rawBrowser; |
| 199 | const browser = plannotatorBrowser || envBrowser; |
| 200 | const isRemote = options?.isRemote ?? false; |
| 201 | if (shouldTryRemoteBrowserFallback(isRemote)) { |
| 202 | const openedViaIpc = await tryVscodeIpc(url); |
| 203 | if (openedViaIpc) { |
| 204 | return true; |
| 205 | } |
| 206 | } |
| 207 | |
| 208 | if (options?.useGlimpse && !browser && !isRemote && resolveUseGlimpse(loadConfig())) { |
| 209 | const openedViaGlimpse = await openGlimpse(url); |
| 210 | if (openedViaGlimpse) { |
| 211 | return true; |
| 212 | } |
| 213 | } |
| 214 | |
| 215 | const platform = process.platform; |
| 216 | const wsl = await isWSL(); |
| 217 | |
| 218 | if (browser) { |
| 219 | if (plannotatorBrowser && platform === "darwin") { |
| 220 | if (plannotatorBrowser.includes("/") && !plannotatorBrowser.endsWith(".app")) { |
| 221 | await $`${plannotatorBrowser} ${url}`.quiet(); |
| 222 | } else { |
| 223 | await $`open -a ${plannotatorBrowser} ${url}`.quiet(); |
| 224 | } |
| 225 | } else if ((platform === "win32" || wsl) && plannotatorBrowser) { |
| 226 | await $`cmd.exe /c start "" ${plannotatorBrowser} ${url}`.quiet(); |
| 227 | } else { |
| 228 | await $`${browser} ${url}`.quiet(); |
| 229 | } |
| 230 | } else { |
| 231 | // Default system browser |
| 232 | if (platform === "win32" || wsl) { |
| 233 | await $`cmd.exe /c start ${url}`.quiet(); |
| 234 | } else if (platform === "darwin") { |
| 235 | await $`open ${url}`.quiet(); |
| 236 | } else { |
| 237 | await $`xdg-open ${url}`.quiet(); |
| 238 | } |
| 239 | } |
| 240 | return true; |
| 241 | } catch { |
| 242 | // Shell-based open failed — try VS Code IPC registry as fallback |
| 243 | return tryVscodeIpc(url); |
| 244 | } |
| 245 | } |
no test coverage detected