import { homedir } from 'node:os'; const EXPLICIT_AGENT_RUNTIMES = new Set([ 'claude_code', 'claude_cowork', 'codex', 'cline', 'cursor', 'gemini', 'antigravity', 'windsurf', 'unknown', ]); function truthyEnv(name: string): boolean { return ['1', 'true', 'yes', 'on'].includes( String(process.env[name] ?? '') .trim() .toLowerCase(), ); } export function normalizeAgentRuntime( value: string | undefined, ): string | null { const explicit = value?.trim().toLowerCase().replace(/-/g, '_'); if (!explicit) return null; if (explicit === 'gemini_cli') return 'gemini'; return EXPLICIT_AGENT_RUNTIMES.has(explicit) ? explicit : null; } export function isCoworkLikeSandbox(): boolean { const pluginMode = truthyEnv('DEEPLINE_PLUGIN_MODE'); const claudeRemote = truthyEnv('CLAUDE_CODE_REMOTE'); const projectDir = Boolean(process.env.CLAUDE_PROJECT_DIR?.trim()); const pluginRoot = Boolean(process.env.DEEPLINE_PLUGIN_ROOT?.trim()); const home = process.env.HOME?.trim() || homedir(); const sessionHome = home === '/sessions' || home.startsWith('/sessions/'); return ( claudeRemote || sessionHome || ((pluginMode || pluginRoot) && projectDir) ); } export function detectAgentRuntime( options: { defaultRuntime?: string; detectCowork?: boolean } = {}, ): string { const explicit = normalizeAgentRuntime(process.env.DEEPLINE_AGENT_RUNTIME); if (explicit) return explicit; if (process.env.CODEX_THREAD_ID?.trim()) return 'codex'; if (options.detectCowork !== false && isCoworkLikeSandbox()) { return 'claude_cowork'; } if (process.env.CLAUDECODE?.trim() === '1') return 'claude_code'; if (process.env.CLINE_ACTIVE?.trim().toLowerCase() === 'true') return 'cline'; if (process.env.CURSOR_TRACE_ID?.trim() || process.env.CURSOR_AGENT?.trim()) { return 'cursor'; } if (process.env.WINDSURF?.trim() || process.env.CASCADE?.trim()) { return 'windsurf'; } if ( process.env.ANTIGRAVITY?.trim() || process.env.ANTIGRAVITY_CLI?.trim() || process.env.ANTIGRAVITY_AGENT?.trim() || process.env.ANTIGRAVITY_WORKSPACE?.trim() ) { return 'antigravity'; } if ( process.env.GEMINI_CLI?.trim() || process.env.GEMINI_CLI_VERSION?.trim() || process.env.GEMINI_SANDBOX?.trim() || process.env.GEMINI_CONFIG_DIR?.trim() ) { return 'gemini'; } return options.defaultRuntime ?? 'unknown'; }