/** * Terminal preference capture for deep link handling. * * Separate from terminalLauncher.ts so interactiveHelpers.tsx can import * this without pulling the full launcher module into the startup path * (which would defeat LODESTONE tree-shaking). */ import { getGlobalConfig, saveGlobalConfig } from '../config.js' import { logForDebugging } from '../debug.js' /** * Map TERM_PROGRAM env var values (lowercased) to the `app` name used by * launchMacosTerminal's switch cases. TERM_PROGRAM values are what terminals * self-report; they don't always match the .app bundle name (e.g., * "iTerm.app" → "iTerm", "Apple_Terminal" → "Terminal"). */ const TERM_PROGRAM_TO_APP: Record = { iterm: 'iTerm', 'iterm.app': 'iTerm', ghostty: 'Ghostty', kitty: 'kitty', alacritty: 'Alacritty', wezterm: 'WezTerm', apple_terminal: 'Terminal', } /** * Capture the current terminal from TERM_PROGRAM and store it for the deep * link handler to use later. The handler runs headless (LaunchServices/xdg) * where TERM_PROGRAM is unset, so without this it falls back to a static * priority list that picks whatever is installed first — often not the * terminal the user actually uses. * * Called fire-and-forget from interactive startup, same as * updateGithubRepoPathMapping. */ export function updateDeepLinkTerminalPreference(): void { // Only detectMacosTerminal reads the stored value — skip the write on // other platforms. if (process.platform !== 'darwin') return const termProgram = process.env.TERM_PROGRAM if (!termProgram) return const app = TERM_PROGRAM_TO_APP[termProgram.toLowerCase()] if (!app) return const config = getGlobalConfig() if (config.deepLinkTerminal === app) return saveGlobalConfig(current => ({ ...current, deepLinkTerminal: app })) logForDebugging(`Stored deep link terminal preference: ${app}`) }