coding-agent-adapters 0.2.18 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/base-coding-adapter.ts","../src/claude-adapter.ts","../src/gemini-adapter.ts","../src/codex-adapter.ts","../src/aider-adapter.ts","../src/pattern-loader.ts","../src/index.ts"],"names":["BaseCLIAdapter","join","mkdir","dirname","appendFile","writeFile"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Base Coding Agent Adapter\n *\n * Extends pty-manager's BaseCLIAdapter with credential handling\n * for AI coding agents.\n */\n\nimport { writeFile, appendFile, mkdir } from 'node:fs/promises';\nimport { join, dirname } from 'node:path';\nimport { BaseCLIAdapter } from 'pty-manager';\nimport type { SpawnConfig } from 'pty-manager';\n\n/**\n * Credentials that can be passed via SpawnConfig.adapterConfig\n */\nexport interface AgentCredentials {\n anthropicKey?: string;\n openaiKey?: string;\n googleKey?: string;\n githubToken?: string;\n custom?: Record<string, string>;\n}\n\n/**\n * Installation information for a CLI tool\n */\nexport interface InstallationInfo {\n /** Command to install the CLI (e.g., \"npm install -g @anthropic-ai/claude-code\") */\n command: string;\n /** Alternative installation methods */\n alternatives?: string[];\n /** URL to installation docs */\n docsUrl: string;\n /** Minimum required version (if known) */\n minVersion?: string;\n}\n\n/**\n * Model tier recommendations for an adapter\n */\nexport interface ModelRecommendations {\n /** Most capable model for complex tasks */\n powerful: string;\n /** Fastest/cheapest model for simple tasks */\n fast: string;\n}\n\n/**\n * Describes a file that a coding agent CLI reads from the workspace.\n * Orchestration systems use this to write instructions/config before spawning agents.\n */\nexport interface AgentFileDescriptor {\n /** File path relative to workspace root (e.g., \"CLAUDE.md\", \".aider.conf.yml\") */\n relativePath: string;\n /** Human-readable description of what this file does */\n description: string;\n /** Whether the CLI reads this file automatically on startup */\n autoLoaded: boolean;\n /** File category */\n type: 'memory' | 'config' | 'rules';\n /** File format */\n format: 'markdown' | 'yaml' | 'json' | 'text';\n}\n\n/**\n * Options for writing a memory file into a workspace\n */\nexport interface WriteMemoryOptions {\n /** Custom file name override (default: adapter's primary memory file) */\n fileName?: string;\n /** Append to existing file instead of overwriting */\n append?: boolean;\n}\n\n/**\n * Extended config with credentials and mode support\n */\nexport interface CodingAgentConfig extends SpawnConfig {\n adapterConfig?: AgentCredentials & {\n /**\n * Run in interactive mode (skip --print/--quiet/--non-interactive flags).\n * Use this when you want the full interactive CLI experience.\n */\n interactive?: boolean;\n /**\n * Preferred provider for multi-provider adapters (e.g., Aider).\n * Only the API key for this provider is passed, letting the CLI\n * pick its best model for that provider automatically.\n */\n provider?: 'anthropic' | 'openai' | 'google';\n } & Record<string, unknown>;\n}\n\n/**\n * Base class for AI coding agent adapters\n */\nexport abstract class BaseCodingAdapter extends BaseCLIAdapter {\n /**\n * Coding agent CLIs use TUI menus that require arrow-key navigation.\n */\n override readonly usesTuiMenus: boolean = true;\n\n /**\n * Installation information for this CLI tool\n */\n abstract readonly installation: InstallationInfo;\n\n /**\n * Workspace files this CLI reads automatically.\n * Orchestration systems use this to know where to write instructions/config\n * before spawning an agent.\n */\n abstract getWorkspaceFiles(): AgentFileDescriptor[];\n\n /**\n * The primary memory file for this CLI (the one it reads for project instructions).\n * Returns the relativePath of the first 'memory' type file from getWorkspaceFiles().\n */\n get memoryFilePath(): string {\n const memoryFile = this.getWorkspaceFiles().find(f => f.type === 'memory');\n if (!memoryFile) {\n throw new Error(`${this.displayName} adapter has no memory file defined`);\n }\n return memoryFile.relativePath;\n }\n\n /**\n * Get credentials from config\n */\n protected getCredentials(config: SpawnConfig): AgentCredentials {\n const adapterConfig = config.adapterConfig as AgentCredentials | undefined;\n return adapterConfig || {};\n }\n\n /**\n * Check if interactive mode is enabled.\n * When true, skip non-interactive flags (--print, --quiet, etc.)\n */\n protected isInteractive(config: SpawnConfig): boolean {\n const adapterConfig = config.adapterConfig as { interactive?: boolean } | undefined;\n return adapterConfig?.interactive === true;\n }\n\n /**\n * Get recommended models for this adapter.\n * Returns powerful (most capable) and fast (cheapest/fastest) model names.\n */\n abstract getRecommendedModels(credentials?: AgentCredentials): ModelRecommendations;\n\n /**\n * Override stripAnsi to handle TUI cursor-forward codes.\n * TUI CLIs (Claude Code, Gemini CLI) use \\x1b[<n>C (cursor forward)\n * instead of literal spaces for word positioning. Replace with spaces\n * before stripping other ANSI codes so regex patterns can match.\n */\n protected stripAnsi(str: string): string {\n const withSpaces = str.replace(/\\x1b\\[\\d*C/g, ' ');\n return super.stripAnsi(withSpaces);\n }\n\n /**\n * Override detectExit to include installation instructions\n */\n detectExit(output: string): { exited: boolean; code?: number; error?: string } {\n if (output.includes('Command not found') || output.includes('command not found')) {\n return {\n exited: true,\n code: 127,\n error: `${this.displayName} CLI not found. Install with: ${this.installation.command}\\nDocs: ${this.installation.docsUrl}`,\n };\n }\n\n return super.detectExit(output);\n }\n\n /**\n * Get formatted installation instructions\n */\n getInstallInstructions(): string {\n const lines = [\n `${this.displayName} Installation`,\n `${'='.repeat(this.displayName.length + 13)}`,\n '',\n `Primary: ${this.installation.command}`,\n ];\n\n if (this.installation.alternatives?.length) {\n lines.push('');\n lines.push('Alternatives:');\n for (const alt of this.installation.alternatives) {\n lines.push(` - ${alt}`);\n }\n }\n\n lines.push('');\n lines.push(`Docs: ${this.installation.docsUrl}`);\n\n if (this.installation.minVersion) {\n lines.push(`Minimum version: ${this.installation.minVersion}`);\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Check if response appears complete based on common patterns\n */\n protected isResponseComplete(output: string): boolean {\n const completionIndicators = [\n /\\n>\\s*$/, // Ends with prompt\n /\\n\\s*$/, // Ends with newline\n /Done\\./i, // Explicit done\n /completed/i, // Task completed\n /finished/i, // Finished\n /```\\s*$/, // Code block ended\n ];\n\n return completionIndicators.some((pattern) => pattern.test(output));\n }\n\n /**\n * Extract the main content from CLI output, removing common artifacts\n */\n protected extractContent(output: string, promptPattern: RegExp): string {\n let content = output;\n\n // Remove prompt lines\n content = content.replace(promptPattern, '');\n\n // Remove common status lines\n content = content.replace(/^(Thinking|Working|Reading|Writing|Processing|Generating)\\.+$/gm, '');\n\n // Trim whitespace\n content = content.trim();\n\n return content;\n }\n\n /**\n * Write content to this agent's memory file in a workspace.\n * Creates parent directories as needed.\n *\n * @param workspacePath - Absolute path to the workspace root\n * @param content - The memory/instructions content to write\n * @param options - Optional: custom fileName, append mode\n * @returns The absolute path of the written file\n */\n async writeMemoryFile(\n workspacePath: string,\n content: string,\n options?: WriteMemoryOptions,\n ): Promise<string> {\n const relativePath = options?.fileName ?? this.memoryFilePath;\n const fullPath = join(workspacePath, relativePath);\n\n // Ensure parent directory exists\n await mkdir(dirname(fullPath), { recursive: true });\n\n if (options?.append) {\n await appendFile(fullPath, content, 'utf-8');\n } else {\n await writeFile(fullPath, content, 'utf-8');\n }\n\n return fullPath;\n }\n}\n","/**\n * Claude Code CLI Adapter\n *\n * Adapter for the Claude Code CLI (claude command).\n */\n\nimport type {\n SpawnConfig,\n ParsedOutput,\n LoginDetection,\n BlockingPromptDetection,\n AutoResponseRule,\n} from 'pty-manager';\nimport { BaseCodingAdapter, type InstallationInfo, type ModelRecommendations, type AgentCredentials, type AgentFileDescriptor } from './base-coding-adapter';\n\nexport class ClaudeAdapter extends BaseCodingAdapter {\n readonly adapterType = 'claude';\n readonly displayName = 'Claude Code';\n\n readonly installation: InstallationInfo = {\n command: 'npm install -g @anthropic-ai/claude-code',\n alternatives: [\n 'npx @anthropic-ai/claude-code (run without installing)',\n 'brew install claude-code (macOS with Homebrew)',\n ],\n docsUrl: 'https://docs.anthropic.com/en/docs/claude-code',\n minVersion: '1.0.0',\n };\n\n /**\n * Auto-response rules for Claude Code CLI.\n * These handle common text-based [y/n] prompts that can be safely auto-responded.\n * Explicit responseType: 'text' prevents the usesTuiMenus default from kicking in.\n */\n readonly autoResponseRules: AutoResponseRule[] = [\n {\n pattern: /trust.*folder|safety.?check|project.you.created/i,\n type: 'permission',\n response: '',\n responseType: 'keys',\n keys: ['enter'],\n description: 'Accept trust prompt for working directory',\n safe: true,\n once: true,\n },\n {\n pattern: /update available.*\\[y\\/n\\]/i,\n type: 'update',\n response: 'n',\n responseType: 'text',\n description: 'Decline Claude Code update to continue execution',\n safe: true,\n },\n {\n pattern: /new version.*available.*\\[y\\/n\\]/i,\n type: 'update',\n response: 'n',\n responseType: 'text',\n description: 'Decline version upgrade prompt',\n safe: true,\n },\n {\n pattern: /would you like to enable.*telemetry.*\\[y\\/n\\]/i,\n type: 'config',\n response: 'n',\n responseType: 'text',\n description: 'Decline telemetry prompt',\n safe: true,\n },\n {\n pattern: /send anonymous usage data.*\\[y\\/n\\]/i,\n type: 'config',\n response: 'n',\n responseType: 'text',\n description: 'Decline anonymous usage data',\n safe: true,\n },\n {\n pattern: /continue without.*\\[y\\/n\\]/i,\n type: 'config',\n response: 'y',\n responseType: 'text',\n description: 'Continue without optional feature',\n safe: true,\n },\n ];\n\n getWorkspaceFiles(): AgentFileDescriptor[] {\n return [\n {\n relativePath: 'CLAUDE.md',\n description: 'Project-level instructions read automatically on startup',\n autoLoaded: true,\n type: 'memory',\n format: 'markdown',\n },\n {\n relativePath: '.claude/settings.json',\n description: 'Project-scoped settings (allowed tools, permissions)',\n autoLoaded: true,\n type: 'config',\n format: 'json',\n },\n {\n relativePath: '.claude/commands',\n description: 'Custom slash commands directory',\n autoLoaded: false,\n type: 'config',\n format: 'markdown',\n },\n ];\n }\n\n getRecommendedModels(_credentials?: AgentCredentials): ModelRecommendations {\n return {\n powerful: 'claude-sonnet-4-20250514',\n fast: 'claude-haiku-4-5-20251001',\n };\n }\n\n getCommand(): string {\n return 'claude';\n }\n\n getArgs(config: SpawnConfig): string[] {\n const args: string[] = [];\n\n // Print mode for non-interactive usage (skip if interactive mode)\n if (!this.isInteractive(config)) {\n args.push('--print');\n\n // Set working directory in non-interactive mode\n // In interactive/PTY mode, the PTY's cwd is already set by spawn config\n if (config.workdir) {\n args.push('--cwd', config.workdir);\n }\n }\n\n return args;\n }\n\n getEnv(config: SpawnConfig): Record<string, string> {\n const env: Record<string, string> = {};\n const credentials = this.getCredentials(config);\n\n // API key from credentials or env\n if (credentials.anthropicKey) {\n env.ANTHROPIC_API_KEY = credentials.anthropicKey;\n }\n\n // Model selection (if specified in config env)\n if (config.env?.ANTHROPIC_MODEL) {\n env.ANTHROPIC_MODEL = config.env.ANTHROPIC_MODEL;\n }\n\n // Disable interactive features for automation (skip if interactive mode)\n if (!this.isInteractive(config)) {\n env.CLAUDE_CODE_DISABLE_INTERACTIVE = 'true';\n }\n\n return env;\n }\n\n detectLogin(output: string): LoginDetection {\n const stripped = this.stripAnsi(output);\n\n // Check for API key issues\n if (\n stripped.includes('API key not found') ||\n stripped.includes('ANTHROPIC_API_KEY') ||\n stripped.includes('authentication required') ||\n stripped.includes('Please sign in') ||\n stripped.includes('Invalid API key')\n ) {\n return {\n required: true,\n type: 'api_key',\n instructions: 'Set ANTHROPIC_API_KEY environment variable or provide credentials in adapterConfig',\n };\n }\n\n // Check for OAuth/browser login\n if (\n stripped.includes('Open this URL') ||\n stripped.includes('browser to authenticate')\n ) {\n const urlMatch = stripped.match(/https?:\\/\\/[^\\s]+/);\n return {\n required: true,\n type: 'browser',\n url: urlMatch ? urlMatch[0] : undefined,\n instructions: 'Browser authentication required',\n };\n }\n\n return { required: false };\n }\n\n /**\n * Detect blocking prompts specific to Claude Code CLI\n */\n detectBlockingPrompt(output: string): BlockingPromptDetection {\n // Guard: if the output looks like a ready state, don't flag as blocking.\n // This prevents residual prompt text in the buffer from being misinterpreted\n // after the CLI has already moved past the blocking state.\n if (this.detectReady(output)) {\n return { detected: false };\n }\n\n const stripped = this.stripAnsi(output);\n\n // First check for login (highest priority)\n const loginDetection = this.detectLogin(output);\n if (loginDetection.required) {\n return {\n detected: true,\n type: 'login',\n prompt: loginDetection.instructions,\n url: loginDetection.url,\n canAutoRespond: false,\n instructions: loginDetection.instructions,\n };\n }\n\n // Claude-specific: Tool permission prompt (TUI menu — use keys:enter)\n if (/Do you want to|wants? (your )?permission|needs your permission/i.test(stripped)) {\n return {\n detected: true,\n type: 'permission',\n prompt: 'Claude tool permission',\n suggestedResponse: 'keys:enter',\n canAutoRespond: true,\n instructions: 'Claude is asking permission to use a tool',\n };\n }\n\n // Claude-specific: Model selection prompt\n if (/choose.*model|select.*model|available models/i.test(stripped) &&\n /\\d+\\)|claude-/i.test(stripped)) {\n return {\n detected: true,\n type: 'model_select',\n prompt: 'Claude model selection',\n canAutoRespond: false,\n instructions: 'Please select a Claude model or set ANTHROPIC_MODEL env var',\n };\n }\n\n // Claude-specific: API key tier/plan selection\n if (/which.*tier|select.*plan|api.*tier/i.test(stripped)) {\n return {\n detected: true,\n type: 'config',\n prompt: 'API tier selection',\n canAutoRespond: false,\n instructions: 'Please select an API tier',\n };\n }\n\n // Claude-specific: First-time setup wizard\n if (/welcome to claude|first time setup|initial configuration/i.test(stripped)) {\n return {\n detected: true,\n type: 'config',\n prompt: 'First-time setup',\n canAutoRespond: false,\n instructions: 'Claude Code requires initial configuration',\n };\n }\n\n // Claude-specific: Permission to access files/directories\n if (/allow.*access|grant.*permission|access to .* files/i.test(stripped) &&\n /\\[y\\/n\\]/i.test(stripped)) {\n return {\n detected: true,\n type: 'permission',\n prompt: 'File/directory access permission',\n options: ['y', 'n'],\n suggestedResponse: 'y',\n canAutoRespond: true,\n instructions: 'Claude Code requesting file access permission',\n };\n }\n\n // Fall back to base class detection\n return super.detectBlockingPrompt(output);\n }\n\n detectReady(output: string): boolean {\n const stripped = this.stripAnsi(output);\n\n // Guard: if the output contains a trust prompt, we're NOT ready yet —\n // the user (or auto-response) still needs to confirm.\n if (/trust.*directory|do you want to|needs? your permission/i.test(stripped)) {\n return false;\n }\n\n // Claude Code shows a prompt when ready\n // Only match specific interactive prompts, not banner text like \"Claude Code\"\n // or generic words like \"Ready\" which appear alongside auth/trust screens\n return (\n stripped.includes('How can I help') ||\n stripped.includes('What would you like') ||\n // v2.1+ shows \"for shortcuts\" hint when ready\n stripped.includes('for shortcuts') ||\n // Match \"claude> \" or similar specific prompts, not bare \">\"\n /claude>\\s*$/i.test(stripped) ||\n // v2.1+ uses ❯ as the input prompt\n /❯\\s*$/.test(stripped)\n );\n }\n\n parseOutput(output: string): ParsedOutput | null {\n const stripped = this.stripAnsi(output);\n\n // Check if this looks like a complete response\n const isComplete = this.isResponseComplete(stripped);\n\n if (!isComplete) {\n return null;\n }\n\n // Determine if this is a question\n const isQuestion = this.containsQuestion(stripped);\n\n // Extract the actual content\n const content = this.extractContent(stripped, /^.*>\\s*/gm);\n\n return {\n type: isQuestion ? 'question' : 'response',\n content,\n isComplete: true,\n isQuestion,\n metadata: {\n raw: output,\n },\n };\n }\n\n getPromptPattern(): RegExp {\n // Claude Code prompt patterns\n // Match \"claude> \" specifically, not bare \">\" which is too broad\n return /claude>\\s*$/i;\n }\n\n getHealthCheckCommand(): string {\n return 'claude --version';\n }\n}\n","/**\n * Google Gemini CLI Adapter\n *\n * Adapter for the Google Gemini CLI tool.\n */\n\nimport type {\n SpawnConfig,\n ParsedOutput,\n LoginDetection,\n BlockingPromptDetection,\n AutoResponseRule,\n} from 'pty-manager';\nimport { BaseCodingAdapter, type InstallationInfo, type ModelRecommendations, type AgentCredentials, type AgentFileDescriptor } from './base-coding-adapter';\n\nexport class GeminiAdapter extends BaseCodingAdapter {\n readonly adapterType = 'gemini';\n readonly displayName = 'Google Gemini';\n\n readonly installation: InstallationInfo = {\n command: 'npm install -g @anthropics/gemini-cli',\n alternatives: [\n 'See documentation for latest installation method',\n ],\n docsUrl: 'https://github.com/anthropics/gemini-cli#installation',\n };\n\n /**\n * Auto-response rules for Gemini CLI.\n * Gemini uses Ink/React TUI with arrow-key radio menus.\n * Source: FolderTrustDialog.tsx, MultiFolderTrustDialog.tsx, CloudFreePrivacyNotice.tsx\n */\n readonly autoResponseRules: AutoResponseRule[] = [\n {\n pattern: /do.?you.?trust.?this.?folder|trust.?folder|trust.?parent.?folder/i,\n type: 'permission',\n response: '',\n responseType: 'keys',\n keys: ['enter'],\n description: 'Trust current folder (default selection in radio menu)',\n safe: true,\n once: true,\n },\n {\n pattern: /trust.?the.?following.?folders.*(added|workspace)/i,\n type: 'permission',\n response: '',\n responseType: 'keys',\n keys: ['enter'],\n description: 'Trust multiple folders being added to workspace',\n safe: true,\n once: true,\n },\n {\n pattern: /allow.?google.?to.?use.?this.?data/i,\n type: 'config',\n response: '',\n responseType: 'keys',\n keys: ['down', 'enter'],\n description: 'Decline Google data collection (select \"No\")',\n safe: true,\n once: true,\n },\n ];\n\n getWorkspaceFiles(): AgentFileDescriptor[] {\n return [\n {\n relativePath: 'GEMINI.md',\n description: 'Project-level instructions read automatically on startup',\n autoLoaded: true,\n type: 'memory',\n format: 'markdown',\n },\n {\n relativePath: '.gemini/settings.json',\n description: 'Project-scoped settings (tool permissions, sandbox config)',\n autoLoaded: true,\n type: 'config',\n format: 'json',\n },\n {\n relativePath: '.gemini/styles',\n description: 'Custom style/persona definitions directory',\n autoLoaded: false,\n type: 'config',\n format: 'markdown',\n },\n ];\n }\n\n getRecommendedModels(_credentials?: AgentCredentials): ModelRecommendations {\n return {\n powerful: 'gemini-3-pro',\n fast: 'gemini-3-flash',\n };\n }\n\n getCommand(): string {\n return 'gemini';\n }\n\n getArgs(config: SpawnConfig): string[] {\n const args: string[] = [];\n\n // Non-interactive mode (skip if interactive mode)\n if (!this.isInteractive(config)) {\n args.push('--non-interactive');\n // Text output for easier parsing (only in non-interactive mode)\n args.push('--output-format', 'text');\n\n // Set working directory in non-interactive mode\n // In interactive/PTY mode, the PTY's cwd is already set by spawn config\n if (config.workdir) {\n args.push('--cwd', config.workdir);\n }\n }\n\n return args;\n }\n\n getEnv(config: SpawnConfig): Record<string, string> {\n const env: Record<string, string> = {};\n const credentials = this.getCredentials(config);\n\n // Google API key from credentials\n if (credentials.googleKey) {\n env.GOOGLE_API_KEY = credentials.googleKey;\n env.GEMINI_API_KEY = credentials.googleKey;\n }\n\n // Model selection from config env\n if (config.env?.GEMINI_MODEL) {\n env.GEMINI_MODEL = config.env.GEMINI_MODEL;\n }\n\n // Disable color for parsing (skip if interactive mode)\n if (!this.isInteractive(config)) {\n env.NO_COLOR = '1';\n }\n\n return env;\n }\n\n detectLogin(output: string): LoginDetection {\n const stripped = this.stripAnsi(output);\n\n // Check for API key issues\n if (\n stripped.includes('API key not found') ||\n stripped.includes('GOOGLE_API_KEY') ||\n stripped.includes('GEMINI_API_KEY') ||\n stripped.includes('authentication required') ||\n stripped.includes('Invalid API key') ||\n stripped.includes('API key is not valid')\n ) {\n return {\n required: true,\n type: 'api_key',\n instructions: 'Set GOOGLE_API_KEY or GEMINI_API_KEY environment variable',\n };\n }\n\n // Gemini API key entry dialog (ApiAuthDialog.tsx)\n if (/enter.?gemini.?api.?key/i.test(stripped)) {\n return {\n required: true,\n type: 'api_key',\n instructions: 'Enter a Gemini API key or set GEMINI_API_KEY environment variable',\n };\n }\n\n // Auth dialog — initial auth choice (AuthDialog.tsx)\n if (/how.?would.?you.?like.?to.?authenticate/i.test(stripped) ||\n (/get.?started/i.test(stripped) && /login.?with.?google|use.?gemini.?api.?key|vertex/i.test(stripped))) {\n return {\n required: true,\n type: 'oauth',\n instructions: 'Gemini CLI authentication required — select an auth method',\n };\n }\n\n // OAuth in-progress (AuthInProgress.tsx)\n if (/waiting.?for.?auth/i.test(stripped)) {\n return {\n required: true,\n type: 'oauth',\n instructions: 'Waiting for browser authentication to complete',\n };\n }\n\n // Check for OAuth flow\n if (\n stripped.includes('Sign in with Google') ||\n stripped.includes('OAuth') ||\n stripped.includes('accounts.google.com')\n ) {\n const urlMatch = stripped.match(/https?:\\/\\/[^\\s]+/);\n return {\n required: true,\n type: 'oauth',\n url: urlMatch ? urlMatch[0] : 'https://accounts.google.com',\n instructions: 'Google OAuth authentication required',\n };\n }\n\n // Check for ADC (Application Default Credentials)\n if (\n stripped.includes('Application Default Credentials') ||\n stripped.includes('gcloud auth')\n ) {\n return {\n required: true,\n type: 'browser',\n instructions: 'Run: gcloud auth application-default login',\n };\n }\n\n return { required: false };\n }\n\n detectBlockingPrompt(output: string): BlockingPromptDetection {\n const stripped = this.stripAnsi(output);\n\n // Tool permission / execution confirmation (ToolConfirmationMessage.tsx)\n // Check BEFORE login — permission prompts contain \"API key\" banner text\n // that would otherwise false-positive the login detector.\n // TUI arrow-key menu — use keys:enter to select \"Allow once\" (default)\n if (/apply.?this.?change\\??/i.test(stripped) ||\n /allow.?execution.?of/i.test(stripped) ||\n /do.?you.?want.?to.?proceed\\??/i.test(stripped) ||\n /waiting.?for.?user.?confirmation/i.test(stripped)) {\n return {\n detected: true,\n type: 'permission',\n prompt: 'Gemini tool execution confirmation',\n suggestedResponse: 'keys:enter',\n canAutoRespond: true,\n instructions: 'Gemini is asking to apply a change (file write, shell command, etc.)',\n };\n }\n\n // Login check — after permission prompts\n const loginDetection = this.detectLogin(output);\n if (loginDetection.required) {\n return {\n detected: true,\n type: 'login',\n prompt: loginDetection.instructions,\n url: loginDetection.url,\n canAutoRespond: false,\n instructions: loginDetection.instructions,\n };\n }\n\n // Account validation required (ValidationDialog.tsx)\n if (/further.?action.?is.?required/i.test(stripped) ||\n /verify.?your.?account/i.test(stripped) ||\n /waiting.?for.?verification/i.test(stripped)) {\n return {\n detected: true,\n type: 'config',\n prompt: 'Account verification required',\n canAutoRespond: false,\n instructions: 'Your Gemini account requires verification before continuing',\n };\n }\n\n // Model selection\n if (/select.*model|choose.*model|gemini-/i.test(stripped) &&\n /\\d+\\)/i.test(stripped)) {\n return {\n detected: true,\n type: 'model_select',\n prompt: 'Gemini model selection',\n canAutoRespond: false,\n instructions: 'Please select a model or set GEMINI_MODEL env var',\n };\n }\n\n // Project selection\n if (/select.*project|choose.*project|google cloud project/i.test(stripped)) {\n return {\n detected: true,\n type: 'project_select',\n prompt: 'Google Cloud project selection',\n canAutoRespond: false,\n instructions: 'Please select a Google Cloud project',\n };\n }\n\n // Safety filter triggered\n if (/safety.*filter|content.*blocked|unsafe.*content/i.test(stripped)) {\n return {\n detected: true,\n type: 'unknown',\n prompt: 'Safety filter triggered',\n canAutoRespond: false,\n instructions: 'Content was blocked by safety filters',\n };\n }\n\n // Fall back to base class detection\n return super.detectBlockingPrompt(output);\n }\n\n detectReady(output: string): boolean {\n const stripped = this.stripAnsi(output);\n\n // Definitive positive indicators — always win, even if stale auth/trust\n // dialog text is still in the buffer from a TUI re-render.\n // \"Type your message\" is the Composer placeholder (Composer.tsx:446)\n // and is unambiguous — the CLI is ready to accept input.\n if (/type.?your.?message/i.test(stripped)) {\n return true;\n }\n\n // Guard: if output contains a trust or auth prompt, we're NOT ready\n // (only checked when no definitive positive indicator is present)\n if (/do.?you.?trust.?this.?folder/i.test(stripped) ||\n /how.?would.?you.?like.?to.?authenticate/i.test(stripped) ||\n /waiting.?for.?auth/i.test(stripped) ||\n /allow.?google.?to.?use.?this.?data/i.test(stripped)) {\n return false;\n }\n\n // InputPrompt glyph — >, !, *, (r:) (InputPrompt.tsx:1450)\n if (/^\\s*[>!*]\\s+/m.test(stripped) || /\\(r:\\)/.test(stripped)) {\n return true;\n }\n\n return (\n stripped.includes('How can I help') ||\n stripped.includes('What would you like') ||\n // Match \"gemini> \" prompt specifically, not bare \">\"\n /gemini>\\s*$/i.test(stripped)\n );\n }\n\n parseOutput(output: string): ParsedOutput | null {\n const stripped = this.stripAnsi(output);\n\n const isComplete = this.isResponseComplete(stripped);\n\n if (!isComplete) {\n return null;\n }\n\n const isQuestion = this.containsQuestion(stripped);\n\n // Extract content, removing prompts and safety warnings\n let content = this.extractContent(stripped, /^.*(?:gemini|>)\\s*/gim);\n content = content.replace(/^\\[Safety[^\\]]*\\].*$/gm, '');\n\n return {\n type: isQuestion ? 'question' : 'response',\n content,\n isComplete: true,\n isQuestion,\n metadata: {\n raw: output,\n },\n };\n }\n\n /**\n * Detect exit conditions specific to Gemini CLI.\n * Source: FolderTrustDialog.tsx:127, LogoutConfirmationDialog.tsx:64\n */\n override detectExit(output: string): { exited: boolean; code?: number; error?: string } {\n const stripped = this.stripAnsi(output);\n\n if (/folder.?trust.?level.?must.?be.?selected.*exiting/i.test(stripped)) {\n return {\n exited: true,\n code: 1,\n error: 'Gemini CLI exited because no folder trust level was selected',\n };\n }\n\n if (/you are now logged out/i.test(stripped)) {\n return {\n exited: true,\n code: 0,\n };\n }\n\n return super.detectExit(output);\n }\n\n getPromptPattern(): RegExp {\n // Match \"gemini> \" specifically, not bare \">\" which is too broad\n return /gemini>\\s*$/i;\n }\n\n getHealthCheckCommand(): string {\n return 'gemini --version';\n }\n}\n","/**\n * OpenAI Codex CLI Adapter\n *\n * Adapter for the OpenAI Codex CLI tool.\n */\n\nimport type {\n SpawnConfig,\n ParsedOutput,\n LoginDetection,\n BlockingPromptDetection,\n AutoResponseRule,\n} from 'pty-manager';\nimport { BaseCodingAdapter, type InstallationInfo, type ModelRecommendations, type AgentCredentials, type AgentFileDescriptor } from './base-coding-adapter';\n\nexport class CodexAdapter extends BaseCodingAdapter {\n readonly adapterType = 'codex';\n readonly displayName = 'OpenAI Codex';\n\n readonly installation: InstallationInfo = {\n command: 'npm install -g @openai/codex',\n alternatives: [\n 'pip install openai (Python SDK)',\n ],\n docsUrl: 'https://github.com/openai/codex',\n };\n\n /**\n * Auto-response rules for OpenAI Codex CLI.\n * Codex uses ratatui/crossterm full-screen TUI with arrow-key menus.\n * Source: trust_directory.rs, update_prompt.rs, model_migration.rs, cwd_prompt.rs, chatwidget.rs, main.rs\n */\n readonly autoResponseRules: AutoResponseRule[] = [\n {\n pattern: /update.?available.*->|update.?now|skip.?until.?next.?version/i,\n type: 'config',\n response: '',\n responseType: 'keys',\n keys: ['down', 'enter'],\n description: 'Skip Codex CLI update prompt (select \"Skip\")',\n safe: true,\n },\n {\n pattern: /do.?you.?trust.?the.?contents|trust.?this.?directory|yes,?.?continue|prompt.?injection/i,\n type: 'permission',\n response: '',\n responseType: 'keys',\n keys: ['enter'],\n description: 'Trust directory contents (default: \"Yes, continue\")',\n safe: true,\n once: true,\n },\n {\n pattern: /choose.?how.?you.?d.?like.?codex.?to.?proceed|try.?new.?model|use.?existing.?model/i,\n type: 'config',\n response: '',\n responseType: 'keys',\n keys: ['enter'],\n description: 'Accept model migration (default: \"Try new model\")',\n safe: true,\n once: true,\n },\n {\n pattern: /choose.?working.?directory.?to.?(resume|fork)/i,\n type: 'config',\n response: '',\n responseType: 'keys',\n keys: ['enter'],\n description: 'Accept default working directory for session resume',\n safe: true,\n },\n {\n pattern: /enable.?full.?access\\??/i,\n type: 'permission',\n response: '',\n responseType: 'keys',\n keys: ['enter'],\n description: 'Confirm full access mode (default: \"Yes, continue anyway\")',\n safe: true,\n once: true,\n },\n {\n pattern: /continue.?anyway\\?\\s*\\[y\\/N\\]/i,\n type: 'config',\n response: 'y',\n responseType: 'text',\n description: 'Confirm dumb terminal continuation',\n safe: true,\n },\n ];\n\n getWorkspaceFiles(): AgentFileDescriptor[] {\n return [\n {\n relativePath: 'AGENTS.md',\n description: 'Project-level instructions read automatically on startup',\n autoLoaded: true,\n type: 'memory',\n format: 'markdown',\n },\n {\n relativePath: 'codex.md',\n description: 'Additional project context file',\n autoLoaded: true,\n type: 'memory',\n format: 'markdown',\n },\n {\n relativePath: '.codex/config.json',\n description: 'Project-scoped Codex configuration',\n autoLoaded: true,\n type: 'config',\n format: 'json',\n },\n ];\n }\n\n getRecommendedModels(_credentials?: AgentCredentials): ModelRecommendations {\n return {\n powerful: 'o3',\n fast: 'gpt-4o-mini',\n };\n }\n\n getCommand(): string {\n return 'codex';\n }\n\n getArgs(config: SpawnConfig): string[] {\n const args: string[] = [];\n\n // Quiet mode for less verbose output (skip if interactive mode)\n if (!this.isInteractive(config)) {\n args.push('--quiet');\n\n // Set working directory in non-interactive mode\n // In interactive/PTY mode, the PTY's cwd is already set by spawn config\n if (config.workdir) {\n args.push('--cwd', config.workdir);\n }\n }\n\n return args;\n }\n\n getEnv(config: SpawnConfig): Record<string, string> {\n const env: Record<string, string> = {};\n const credentials = this.getCredentials(config);\n\n // OpenAI API key from credentials\n if (credentials.openaiKey) {\n env.OPENAI_API_KEY = credentials.openaiKey;\n }\n\n // Model selection from config env\n if (config.env?.OPENAI_MODEL) {\n env.OPENAI_MODEL = config.env.OPENAI_MODEL;\n }\n\n // Disable color output for easier parsing (skip if interactive mode)\n if (!this.isInteractive(config)) {\n env.NO_COLOR = '1';\n }\n\n return env;\n }\n\n detectLogin(output: string): LoginDetection {\n const stripped = this.stripAnsi(output);\n\n // Check for API key issues\n if (\n stripped.includes('API key not found') ||\n stripped.includes('OPENAI_API_KEY') ||\n stripped.includes('authentication required') ||\n stripped.includes('Invalid API key') ||\n stripped.includes('Unauthorized') ||\n stripped.includes('API key is invalid')\n ) {\n return {\n required: true,\n type: 'api_key',\n instructions: 'Set OPENAI_API_KEY environment variable or provide credentials in adapterConfig',\n };\n }\n\n // Onboarding auth menu (auth.rs:313)\n if (/sign.?in.?with.?chatgpt/i.test(stripped) ||\n (/sign.?in.?with.?device.?code/i.test(stripped) && !/open.?this.?link/i.test(stripped)) ||\n /provide.?your.?own.?api.?key/i.test(stripped)) {\n return {\n required: true,\n type: 'oauth',\n instructions: 'Codex authentication required — select a sign-in method or provide an API key',\n };\n }\n\n // Device code login flow (headless_chatgpt_login.rs:140)\n if (/preparing.?device.?code.?login/i.test(stripped) ||\n /open.?this.?link.?in.?your.?browser/i.test(stripped) ||\n /enter.?this.?one-time.?code/i.test(stripped)) {\n const codeMatch = stripped.match(/code[:\\s]+([A-Z0-9-]+)/i);\n const urlMatch = stripped.match(/https?:\\/\\/[^\\s]+/);\n return {\n required: true,\n type: 'device_code',\n url: urlMatch ? urlMatch[0] : undefined,\n instructions: codeMatch\n ? `Enter code ${codeMatch[1]} at the URL`\n : 'Device code authentication in progress — complete in browser',\n };\n }\n\n // Legacy device code detection\n if (stripped.includes('device code') || stripped.includes('Enter the code')) {\n const codeMatch = stripped.match(/code[:\\s]+([A-Z0-9-]+)/i);\n const urlMatch = stripped.match(/https?:\\/\\/[^\\s]+/);\n return {\n required: true,\n type: 'device_code',\n url: urlMatch ? urlMatch[0] : undefined,\n instructions: codeMatch\n ? `Enter code ${codeMatch[1]} at the URL`\n : 'Device code authentication required',\n };\n }\n\n return { required: false };\n }\n\n /**\n * Detect blocking prompts specific to OpenAI Codex CLI.\n * Source: approval_overlay.rs, chatwidget.rs, request_user_input/mod.rs\n */\n detectBlockingPrompt(output: string): BlockingPromptDetection {\n const stripped = this.stripAnsi(output);\n\n // Tool approval prompts (approval_overlay.rs:122)\n // Check BEFORE login — permission prompts may coexist with auth-related banner text.\n // TUI arrow-key menu — use keys:enter to select default (\"Yes, proceed\")\n if (/would.?you.?like.?to.?run.?the.?following.?command/i.test(stripped) ||\n /do.?you.?want.?to.?approve.?access/i.test(stripped) ||\n /would.?you.?like.?to.?make.?the.?following.?edits/i.test(stripped) ||\n (/press.?enter.?to.?confirm/i.test(stripped) && /esc.?to.?cancel/i.test(stripped))) {\n return {\n detected: true,\n type: 'permission',\n prompt: 'Codex tool approval',\n suggestedResponse: 'keys:enter',\n canAutoRespond: true,\n instructions: 'Codex is asking permission to execute a command, approve access, or apply edits',\n };\n }\n\n // Login check — after permission prompts\n const loginDetection = this.detectLogin(output);\n if (loginDetection.required) {\n return {\n detected: true,\n type: 'login',\n prompt: loginDetection.instructions,\n url: loginDetection.url,\n canAutoRespond: false,\n instructions: loginDetection.instructions,\n };\n }\n\n // Windows sandbox setup (chatwidget.rs:5818)\n if (/set.?up.?default.?sandbox/i.test(stripped) ||\n /use.?non-admin.?sandbox/i.test(stripped)) {\n return {\n detected: true,\n type: 'config',\n prompt: 'Windows sandbox setup',\n canAutoRespond: false,\n instructions: 'Codex needs a sandbox configuration on Windows',\n };\n }\n\n // Multi-step user input from model (request_user_input/mod.rs:41)\n if (/type.?your.?answer/i.test(stripped) && /select.?an.?option/i.test(stripped)) {\n return {\n detected: true,\n type: 'unknown',\n prompt: 'Codex requesting structured user input',\n canAutoRespond: false,\n instructions: 'Codex model is asking multi-step questions that require user input',\n };\n }\n\n // Model selection\n if (/select.*model|choose.*model|gpt-4|gpt-3\\.5/i.test(stripped) &&\n /\\d+\\)/i.test(stripped)) {\n return {\n detected: true,\n type: 'model_select',\n prompt: 'OpenAI model selection',\n canAutoRespond: false,\n instructions: 'Please select a model or set OPENAI_MODEL env var',\n };\n }\n\n // Organization selection\n if (/select.*organization|choose.*org|multiple organizations/i.test(stripped)) {\n return {\n detected: true,\n type: 'config',\n prompt: 'Organization selection',\n canAutoRespond: false,\n instructions: 'Please select an OpenAI organization',\n };\n }\n\n // Rate limit warning\n if (/rate limit|too many requests/i.test(stripped) &&\n /retry|wait/i.test(stripped)) {\n return {\n detected: true,\n type: 'unknown',\n prompt: 'Rate limit reached',\n canAutoRespond: false,\n instructions: 'OpenAI rate limit reached - please wait',\n };\n }\n\n // Fall back to base class detection\n return super.detectBlockingPrompt(output);\n }\n\n detectReady(output: string): boolean {\n const stripped = this.stripAnsi(output);\n\n // Guard: if output contains trust, auth, or update prompts, we're NOT ready\n if (/do.?you.?trust.?the.?contents/i.test(stripped) ||\n /sign.?in.?with.?chatgpt/i.test(stripped) ||\n /update.?available/i.test(stripped) ||\n /enable.?full.?access/i.test(stripped) ||\n /choose.?working.?directory/i.test(stripped)) {\n return false;\n }\n\n // Ready prompt glyph `›` with placeholder suggestions (chat_composer.rs:3697)\n if (/›\\s+/m.test(stripped)) {\n return true;\n }\n\n // Placeholder suggestions indicate the composer is active (chatwidget.rs:7228)\n if (/explain this codebase|summarize recent commits|find and fix a bug/i.test(stripped)) {\n return true;\n }\n\n return (\n stripped.includes('How can I help') ||\n /(?:codex|>)\\s*$/i.test(stripped)\n );\n }\n\n parseOutput(output: string): ParsedOutput | null {\n const stripped = this.stripAnsi(output);\n\n const isComplete = this.isResponseComplete(stripped);\n\n if (!isComplete) {\n return null;\n }\n\n const isQuestion = this.containsQuestion(stripped);\n const content = this.extractContent(stripped, /^.*(?:codex|>)\\s*/gim);\n\n return {\n type: isQuestion ? 'question' : 'response',\n content,\n isComplete: true,\n isQuestion,\n metadata: {\n raw: output,\n },\n };\n }\n\n /**\n * Detect exit conditions specific to Codex CLI.\n * Source: main.rs:404, main.rs:414, main.rs:461\n */\n override detectExit(output: string): { exited: boolean; code?: number; error?: string } {\n const stripped = this.stripAnsi(output);\n\n // Session ended — provides resume command (main.rs:404)\n if (/to.?continue.?this.?session,?.?run/i.test(stripped)) {\n return { exited: true, code: 0 };\n }\n\n // Update completed — needs restart (main.rs:461)\n if (/update.?ran.?successfully.*restart.?codex/i.test(stripped)) {\n return {\n exited: true,\n code: 0,\n error: 'Codex updated successfully — restart required',\n };\n }\n\n return super.detectExit(output);\n }\n\n getPromptPattern(): RegExp {\n return /(?:codex|>)\\s*$/i;\n }\n\n getHealthCheckCommand(): string {\n return 'codex --version';\n }\n}\n","/**\n * Aider CLI Adapter\n *\n * Adapter for the Aider AI pair programming tool.\n * https://github.com/paul-gauthier/aider\n */\n\nimport type {\n SpawnConfig,\n ParsedOutput,\n LoginDetection,\n BlockingPromptDetection,\n AutoResponseRule,\n} from 'pty-manager';\nimport { BaseCodingAdapter, type InstallationInfo, type ModelRecommendations, type AgentCredentials, type AgentFileDescriptor } from './base-coding-adapter';\n\nexport class AiderAdapter extends BaseCodingAdapter {\n readonly adapterType = 'aider';\n readonly displayName = 'Aider';\n\n /**\n * Aider uses plain text [y/n] prompts, NOT TUI arrow-key menus.\n */\n override readonly usesTuiMenus: boolean = false;\n\n readonly installation: InstallationInfo = {\n command: 'pip install aider-chat',\n alternatives: [\n 'pipx install aider-chat (isolated install)',\n 'brew install aider (macOS with Homebrew)',\n ],\n docsUrl: 'https://aider.chat/docs/install.html',\n minVersion: '0.50.0',\n };\n\n /**\n * Auto-response rules for Aider CLI.\n * Aider uses plain text prompts via io.py:832 with (Y)es/(N)o format.\n * All rules are responseType: 'text' — Aider never uses TUI menus.\n *\n * Decline rules come first to override the generic accept patterns.\n */\n readonly autoResponseRules: AutoResponseRule[] = [\n // ── Decline rules (specific, checked first) ────────────────────────\n {\n pattern: /allow collection of anonymous analytics/i,\n type: 'config',\n response: 'n',\n responseType: 'text',\n description: 'Decline Aider telemetry opt-in',\n safe: true,\n once: true,\n },\n {\n pattern: /would you like to see what.?s new in this version/i,\n type: 'config',\n response: 'n',\n responseType: 'text',\n description: 'Decline release notes offer',\n safe: true,\n once: true,\n },\n {\n pattern: /open a github issue pre-filled/i,\n type: 'config',\n response: 'n',\n responseType: 'text',\n description: 'Decline automatic bug report',\n safe: true,\n },\n // ── File / edit operations ──────────────────────────────────────────\n {\n pattern: /add .+ to the chat\\?/i,\n type: 'permission',\n response: 'y',\n responseType: 'text',\n description: 'Allow Aider to add files to chat context',\n safe: true,\n },\n {\n pattern: /add url to the chat\\?/i,\n type: 'permission',\n response: 'y',\n responseType: 'text',\n description: 'Allow Aider to add URL content to chat',\n safe: true,\n },\n {\n pattern: /create new file\\?/i,\n type: 'permission',\n response: 'y',\n responseType: 'text',\n description: 'Allow Aider to create new files',\n safe: true,\n },\n {\n pattern: /allow edits to file/i,\n type: 'permission',\n response: 'y',\n responseType: 'text',\n description: 'Allow edits to file not yet in chat',\n safe: true,\n },\n {\n pattern: /edit the files\\?/i,\n type: 'permission',\n response: 'y',\n responseType: 'text',\n description: 'Accept architect mode edits',\n safe: true,\n },\n // ── Shell operations ────────────────────────────────────────────────\n {\n pattern: /run shell commands?\\?/i,\n type: 'permission',\n response: 'y',\n responseType: 'text',\n description: 'Allow Aider to run shell commands',\n safe: true,\n },\n {\n pattern: /add command output to the chat\\?/i,\n type: 'permission',\n response: 'y',\n responseType: 'text',\n description: 'Add shell command output to chat context',\n safe: true,\n },\n {\n pattern: /add \\d+.*tokens of command output to the chat\\?/i,\n type: 'permission',\n response: 'y',\n responseType: 'text',\n description: 'Add /run command output to chat context',\n safe: true,\n },\n // ── Setup / maintenance ─────────────────────────────────────────────\n {\n pattern: /no git repo found.*create one/i,\n type: 'config',\n response: 'y',\n responseType: 'text',\n description: 'Create git repo for change tracking',\n safe: true,\n once: true,\n },\n {\n pattern: /add .+ to \\.gitignore/i,\n type: 'config',\n response: 'y',\n responseType: 'text',\n description: 'Update .gitignore with Aider patterns',\n safe: true,\n once: true,\n },\n {\n pattern: /run pip install\\?/i,\n type: 'config',\n response: 'y',\n responseType: 'text',\n description: 'Install missing Python dependencies',\n safe: true,\n },\n {\n pattern: /install playwright\\?/i,\n type: 'config',\n response: 'y',\n responseType: 'text',\n description: 'Install Playwright for web scraping',\n safe: true,\n },\n // ── Other safe confirmations ────────────────────────────────────────\n {\n pattern: /fix lint errors in/i,\n type: 'permission',\n response: 'y',\n responseType: 'text',\n description: 'Accept lint error fix suggestion',\n safe: true,\n },\n {\n pattern: /try to proceed anyway\\?/i,\n type: 'config',\n response: 'y',\n responseType: 'text',\n description: 'Continue despite context limit warning',\n safe: true,\n },\n ];\n\n getWorkspaceFiles(): AgentFileDescriptor[] {\n return [\n {\n relativePath: '.aider.conventions.md',\n description: 'Project conventions and instructions read on startup (--read flag)',\n autoLoaded: true,\n type: 'memory',\n format: 'markdown',\n },\n {\n relativePath: '.aider.conf.yml',\n description: 'Project-scoped Aider configuration (model, flags, options)',\n autoLoaded: true,\n type: 'config',\n format: 'yaml',\n },\n {\n relativePath: '.aiderignore',\n description: 'Gitignore-style file listing paths Aider should not edit',\n autoLoaded: true,\n type: 'rules',\n format: 'text',\n },\n ];\n }\n\n getRecommendedModels(credentials?: AgentCredentials): ModelRecommendations {\n if (credentials?.anthropicKey) {\n return {\n powerful: 'anthropic/claude-sonnet-4-20250514',\n fast: 'anthropic/claude-haiku-4-5-20251001',\n };\n }\n if (credentials?.openaiKey) {\n return {\n powerful: 'openai/o3',\n fast: 'openai/gpt-4o-mini',\n };\n }\n if (credentials?.googleKey) {\n return {\n powerful: 'gemini/gemini-3-pro',\n fast: 'gemini/gemini-3-flash',\n };\n }\n // Default to Anthropic\n return {\n powerful: 'anthropic/claude-sonnet-4-20250514',\n fast: 'anthropic/claude-haiku-4-5-20251001',\n };\n }\n\n getCommand(): string {\n return 'aider';\n }\n\n getArgs(config: SpawnConfig): string[] {\n const args: string[] = [];\n\n // Use auto-commits to avoid manual git operations\n args.push('--auto-commits');\n\n // Disable pretty output for easier parsing (skip if interactive mode)\n if (!this.isInteractive(config)) {\n args.push('--no-pretty');\n // Don't show diffs (we'll handle this separately if needed)\n args.push('--no-show-diffs');\n }\n\n // Set working directory via --file flag prefix\n // Aider uses current directory, so we rely on PTY cwd\n\n // Model: explicit > provider metadata > inferred from API keys > aider default\n // Aliases (sonnet, 4o, gemini) are maintained by Aider and auto-update\n const provider = (config.adapterConfig as { provider?: string } | undefined)?.provider;\n const credentials = this.getCredentials(config);\n if (config.env?.AIDER_MODEL) {\n args.push('--model', config.env.AIDER_MODEL);\n } else if (provider === 'anthropic') {\n args.push('--model', 'sonnet');\n } else if (provider === 'openai') {\n args.push('--model', '4o');\n } else if (provider === 'google') {\n args.push('--model', 'gemini');\n } else if (credentials.anthropicKey) {\n // No explicit provider — infer from available API keys\n args.push('--model', 'sonnet');\n } else if (credentials.openaiKey) {\n args.push('--model', '4o');\n } else if (credentials.googleKey) {\n args.push('--model', 'gemini');\n }\n // No keys at all → don't force a model, let aider use its own default\n\n // API keys via --api-key flag (no env vars needed)\n if (credentials.anthropicKey) args.push('--api-key', `anthropic=${credentials.anthropicKey}`);\n if (credentials.openaiKey) args.push('--api-key', `openai=${credentials.openaiKey}`);\n if (credentials.googleKey) args.push('--api-key', `gemini=${credentials.googleKey}`);\n\n return args;\n }\n\n getEnv(config: SpawnConfig): Record<string, string> {\n // API keys are passed via --api-key args, not env vars\n const env: Record<string, string> = {};\n\n // Disable color for parsing (skip if interactive mode)\n if (!this.isInteractive(config)) {\n env.NO_COLOR = '1';\n }\n\n // Disable git integration if not wanted\n if (config.env?.AIDER_NO_GIT === 'true') {\n env.AIDER_NO_GIT = 'true';\n }\n\n return env;\n }\n\n detectLogin(output: string): LoginDetection {\n const stripped = this.stripAnsi(output);\n\n // Check for missing API keys\n if (\n stripped.includes('No API key') ||\n stripped.includes('API key not found') ||\n stripped.includes('ANTHROPIC_API_KEY') ||\n stripped.includes('OPENAI_API_KEY') ||\n stripped.includes('Missing API key')\n ) {\n return {\n required: true,\n type: 'api_key',\n instructions: 'Set ANTHROPIC_API_KEY or OPENAI_API_KEY environment variable',\n };\n }\n\n // Check for invalid API key\n if (\n stripped.includes('Invalid API key') ||\n stripped.includes('Authentication failed') ||\n stripped.includes('Unauthorized')\n ) {\n return {\n required: true,\n type: 'api_key',\n instructions: 'API key is invalid - please check your credentials',\n };\n }\n\n // OpenRouter OAuth login offer (onboarding.py:94)\n if (/login to openrouter or create a free account/i.test(stripped)) {\n return {\n required: true,\n type: 'oauth',\n instructions: 'Aider offering OpenRouter OAuth login — provide API keys to skip',\n };\n }\n\n // OpenRouter OAuth browser flow in progress (onboarding.py:311)\n if (/please open this url in your browser to connect aider with openrouter/i.test(stripped) ||\n /waiting up to 5 minutes for you to finish in the browser/i.test(stripped)) {\n const urlMatch = stripped.match(/https?:\\/\\/[^\\s]+/);\n return {\n required: true,\n type: 'browser',\n url: urlMatch ? urlMatch[0] : undefined,\n instructions: 'Complete OpenRouter authentication in browser',\n };\n }\n\n return { required: false };\n }\n\n /**\n * Detect blocking prompts specific to Aider CLI.\n * Source: io.py, onboarding.py, base_coder.py, report.py\n */\n detectBlockingPrompt(output: string): BlockingPromptDetection {\n const stripped = this.stripAnsi(output);\n\n // First check for login / auth\n const loginDetection = this.detectLogin(output);\n if (loginDetection.required) {\n return {\n detected: true,\n type: 'login',\n prompt: loginDetection.instructions,\n url: loginDetection.url,\n canAutoRespond: false,\n instructions: loginDetection.instructions,\n };\n }\n\n // Model selection\n if (/select.*model|choose.*model|which model/i.test(stripped)) {\n return {\n detected: true,\n type: 'model_select',\n prompt: 'Model selection required',\n canAutoRespond: false,\n instructions: 'Please select a model or set AIDER_MODEL env var',\n };\n }\n\n // Confirmation validation error — re-prompt loop (io.py:897)\n if (/please answer with one of:/i.test(stripped)) {\n return {\n detected: true,\n type: 'unknown',\n prompt: 'Invalid confirmation input',\n canAutoRespond: false,\n instructions: 'Aider received an invalid response to a confirmation prompt',\n };\n }\n\n // Destructive operations — NOT auto-responded\n if (/delete|remove|overwrite/i.test(stripped) &&\n (/\\[y\\/n\\]/i.test(stripped) || /\\(Y\\)es\\/\\(N\\)o/i.test(stripped))) {\n return {\n detected: true,\n type: 'permission',\n prompt: 'Destructive operation confirmation',\n options: ['y', 'n'],\n canAutoRespond: false,\n instructions: 'Aider is asking to perform a potentially destructive operation',\n };\n }\n\n // Fall back to base class detection\n return super.detectBlockingPrompt(output);\n }\n\n detectReady(output: string): boolean {\n const stripped = this.stripAnsi(output);\n\n // Guard: if output contains an auth/OAuth prompt, we're NOT ready\n if (/login to openrouter/i.test(stripped) ||\n /open this url in your browser/i.test(stripped) ||\n /waiting up to 5 minutes/i.test(stripped)) {\n return false;\n }\n\n // Edit-format mode prompts (io.py:545): ask>, code>, architect>, help>, multi>\n if (/(?:ask|code|architect|help)(?:\\s+multi)?>\\s*$/m.test(stripped) ||\n /^multi>\\s*$/m.test(stripped)) {\n return true;\n }\n\n // Startup banner indicates Aider launched (base_coder.py:209)\n if (/^Aider v\\d+/m.test(stripped)) {\n return true;\n }\n\n // File list display means chat context is ready\n if (/^(?:Readonly|Editable):/m.test(stripped)) {\n return true;\n }\n\n return (\n // Legacy prompt patterns\n stripped.includes('aider>') ||\n /Added.*to the chat/i.test(stripped) ||\n />\\s*$/.test(stripped)\n );\n }\n\n parseOutput(output: string): ParsedOutput | null {\n const stripped = this.stripAnsi(output);\n\n const isComplete = this.isResponseComplete(stripped);\n\n if (!isComplete) {\n return null;\n }\n\n const isQuestion = this.containsQuestion(stripped);\n\n // Extract content, removing aider prompt\n let content = this.extractContent(stripped, /^.*aider>\\s*/gim);\n\n // Remove file operation confirmations from content\n content = content.replace(/^(Added|Removed|Created|Updated) .+ (to|from) the chat\\.?$/gm, '');\n\n return {\n type: isQuestion ? 'question' : 'response',\n content: content.trim(),\n isComplete: true,\n isQuestion,\n metadata: {\n raw: output,\n },\n };\n }\n\n /**\n * Detect exit conditions specific to Aider.\n * Source: base_coder.py:994, base_coder.py:998, report.py:77, versioncheck.py:58\n */\n override detectExit(output: string): { exited: boolean; code?: number; error?: string } {\n const stripped = this.stripAnsi(output);\n\n // Ctrl+C exit (base_coder.py:994-998)\n if (/\\^C again to exit/i.test(stripped) ||\n /\\^C KeyboardInterrupt/i.test(stripped)) {\n return { exited: true, code: 130 };\n }\n\n // Version update completed (versioncheck.py:58)\n if (/re-run aider to use new version/i.test(stripped)) {\n return {\n exited: true,\n code: 0,\n error: 'Aider updated — restart required',\n };\n }\n\n return super.detectExit(output);\n }\n\n getPromptPattern(): RegExp {\n // Match edit-format prompts: ask>, code>, architect>, help>, multi>\n // Also legacy aider> and bare >\n return /(?:ask|code|architect|help|aider|multi)(?:\\s+multi)?>\\s*$/i;\n }\n\n getHealthCheckCommand(): string {\n return 'aider --version';\n }\n}\n","/**\n * Dynamic Pattern Loader\n *\n * Loads adapter patterns from @parallax/adapter-monitor snapshots when available,\n * with fallback to hardcoded baseline patterns.\n */\n\nimport type { AdapterType } from './types';\n\n/**\n * Pattern set for an adapter\n */\nexport interface AdapterPatterns {\n /** Ready state detection patterns */\n ready: string[];\n /** Auth/login detection patterns */\n auth: string[];\n /** Blocking prompt detection patterns */\n blocking: string[];\n /** Source of patterns */\n source: 'snapshot' | 'baseline';\n /** Version these patterns are from (if from snapshot) */\n version?: string;\n}\n\n/**\n * Baseline hardcoded patterns - used when no snapshots available\n */\nconst BASELINE_PATTERNS: Record<AdapterType, AdapterPatterns> = {\n claude: {\n ready: [\n 'Claude Code',\n 'How can I help',\n 'What would you like',\n 'Ready',\n ],\n auth: [\n 'ANTHROPIC_API_KEY',\n 'API key not found',\n 'authentication required',\n 'Please sign in',\n 'Invalid API key',\n ],\n blocking: [\n 'update available',\n '[y/n]',\n ],\n source: 'baseline',\n },\n\n gemini: {\n ready: [\n 'Type your message',\n 'How can I help',\n 'What would you like',\n 'Ready',\n ],\n auth: [\n 'GOOGLE_API_KEY',\n 'GEMINI_API_KEY',\n 'API key not found',\n 'Sign in with Google',\n 'gcloud auth',\n 'Application Default Credentials',\n ],\n blocking: [\n 'update available',\n '[y/n]',\n ],\n source: 'baseline',\n },\n\n codex: {\n ready: [\n 'Codex',\n 'How can I help',\n 'Ready',\n ],\n auth: [\n 'OPENAI_API_KEY',\n 'API key not found',\n 'Unauthorized',\n 'Invalid API key',\n ],\n blocking: [\n 'update available',\n '[y/n]',\n ],\n source: 'baseline',\n },\n\n aider: {\n ready: [\n 'Aider',\n 'What would you like',\n 'Ready',\n ],\n auth: [\n 'API key',\n 'OPENAI_API_KEY',\n 'ANTHROPIC_API_KEY',\n 'No API key',\n ],\n blocking: [\n '(Y)es/(N)o',\n '[y/n]',\n ],\n source: 'baseline',\n },\n};\n\n/**\n * Cache for loaded patterns\n */\nconst patternCache: Map<string, AdapterPatterns> = new Map();\n\n/**\n * Monitor patterns result shape (matches @parallax/adapter-monitor VersionPatternMapping)\n */\ninterface MonitorPatterns {\n version: string;\n readyPatterns: string[];\n authPatterns: string[];\n blockingPatterns: string[];\n}\n\n/**\n * Try to load patterns from @parallax/adapter-monitor\n */\nasync function tryLoadFromMonitor(\n adapter: AdapterType,\n version?: string\n): Promise<AdapterPatterns | null> {\n try {\n // Dynamic import - will fail gracefully if package not installed\n // Uses string variable to avoid TypeScript trying to resolve the module\n const moduleName = 'agent-adapter-monitor';\n const monitor = await import(/* webpackIgnore: true */ moduleName) as {\n getPatternsForVersion: (\n adapter: string,\n version: string\n ) => Promise<MonitorPatterns | null>;\n };\n\n // Try to get patterns for specific version or latest\n const patterns = version\n ? await monitor.getPatternsForVersion(adapter, version)\n : await monitor.getPatternsForVersion(adapter, 'latest');\n\n if (patterns) {\n return {\n ready: patterns.readyPatterns || [],\n auth: patterns.authPatterns || [],\n blocking: patterns.blockingPatterns || [],\n source: 'snapshot',\n version: patterns.version,\n };\n }\n } catch {\n // Package not installed or no snapshots available - that's fine\n }\n\n return null;\n}\n\n/**\n * Load patterns for an adapter\n *\n * Tries to load from @parallax/adapter-monitor snapshots first,\n * falls back to hardcoded baseline patterns.\n *\n * @param adapter - Adapter type\n * @param version - Optional specific CLI version to load patterns for\n * @param forceRefresh - Skip cache and reload\n */\nexport async function loadPatterns(\n adapter: AdapterType,\n version?: string,\n forceRefresh = false\n): Promise<AdapterPatterns> {\n const cacheKey = `${adapter}:${version || 'latest'}`;\n\n // Check cache first\n if (!forceRefresh && patternCache.has(cacheKey)) {\n return patternCache.get(cacheKey)!;\n }\n\n // Try loading from monitor\n const monitorPatterns = await tryLoadFromMonitor(adapter, version);\n\n if (monitorPatterns && monitorPatterns.ready.length > 0) {\n patternCache.set(cacheKey, monitorPatterns);\n return monitorPatterns;\n }\n\n // Fall back to baseline\n const baseline = BASELINE_PATTERNS[adapter];\n patternCache.set(cacheKey, baseline);\n return baseline;\n}\n\n/**\n * Load patterns synchronously (uses cache or baseline only)\n *\n * Use this in constructors or synchronous code paths.\n * For best results, call loadPatterns() asynchronously during init.\n */\nexport function loadPatternsSync(adapter: AdapterType): AdapterPatterns {\n const cacheKey = `${adapter}:latest`;\n\n // Return cached if available\n if (patternCache.has(cacheKey)) {\n return patternCache.get(cacheKey)!;\n }\n\n // Otherwise return baseline (don't cache - let async load update it)\n return BASELINE_PATTERNS[adapter];\n}\n\n/**\n * Preload patterns for all adapters\n *\n * Call this during application startup to warm the cache.\n */\nexport async function preloadAllPatterns(): Promise<void> {\n const adapters: AdapterType[] = ['claude', 'gemini', 'codex', 'aider'];\n\n await Promise.all(adapters.map((adapter) => loadPatterns(adapter)));\n}\n\n/**\n * Clear the pattern cache\n */\nexport function clearPatternCache(): void {\n patternCache.clear();\n}\n\n/**\n * Get baseline patterns (always available, no async)\n */\nexport function getBaselinePatterns(adapter: AdapterType): AdapterPatterns {\n return BASELINE_PATTERNS[adapter];\n}\n\n/**\n * Check if dynamic patterns are available\n */\nexport async function hasDynamicPatterns(adapter: AdapterType): Promise<boolean> {\n const patterns = await tryLoadFromMonitor(adapter);\n return patterns !== null;\n}\n","/**\n * coding-agent-adapters\n *\n * CLI adapters for AI coding agents.\n * Works with pty-manager to spawn and manage coding agents.\n *\n * @example\n * ```typescript\n * import { PTYManager } from 'pty-manager';\n * import { ClaudeAdapter, GeminiAdapter } from 'coding-agent-adapters';\n *\n * const manager = new PTYManager();\n * manager.registerAdapter(new ClaudeAdapter());\n * manager.registerAdapter(new GeminiAdapter());\n *\n * // Non-interactive mode (default) - for automation\n * const session = await manager.spawn({\n * name: 'my-agent',\n * type: 'claude',\n * workdir: '/path/to/project',\n * adapterConfig: {\n * anthropicKey: process.env.ANTHROPIC_API_KEY,\n * },\n * });\n *\n * // Interactive mode - full CLI experience\n * const interactiveSession = await manager.spawn({\n * name: 'my-interactive-agent',\n * type: 'claude',\n * workdir: '/path/to/project',\n * adapterConfig: {\n * anthropicKey: process.env.ANTHROPIC_API_KEY,\n * interactive: true, // Skip --print/--quiet/--non-interactive flags\n * },\n * });\n * ```\n */\n\n// Base class for extending\nexport { BaseCodingAdapter } from './base-coding-adapter';\nexport type { AgentCredentials, CodingAgentConfig, InstallationInfo, ModelRecommendations, AgentFileDescriptor, WriteMemoryOptions } from './base-coding-adapter';\n\n// Adapters\nexport { ClaudeAdapter } from './claude-adapter';\nexport { GeminiAdapter } from './gemini-adapter';\nexport { CodexAdapter } from './codex-adapter';\nexport { AiderAdapter } from './aider-adapter';\n\n// Pattern loading (dynamic patterns from adapter-monitor, with baseline fallback)\nexport {\n loadPatterns,\n loadPatternsSync,\n preloadAllPatterns,\n clearPatternCache,\n getBaselinePatterns,\n hasDynamicPatterns,\n} from './pattern-loader';\nexport type { AdapterPatterns } from './pattern-loader';\n\n// Types\nexport type { AdapterType } from './types';\n\n// Convenience function to register all adapters\nimport { ClaudeAdapter } from './claude-adapter';\nimport { GeminiAdapter } from './gemini-adapter';\nimport { CodexAdapter } from './codex-adapter';\nimport { AiderAdapter } from './aider-adapter';\n\n/**\n * Create instances of all available adapters\n */\nexport function createAllAdapters() {\n return [\n new ClaudeAdapter(),\n new GeminiAdapter(),\n new CodexAdapter(),\n new AiderAdapter(),\n ];\n}\n\n/**\n * Adapter type to class mapping\n */\nimport type { AdapterType } from './types';\n\nexport const ADAPTER_TYPES: Record<AdapterType, typeof ClaudeAdapter | typeof GeminiAdapter | typeof CodexAdapter | typeof AiderAdapter> = {\n claude: ClaudeAdapter,\n gemini: GeminiAdapter,\n codex: CodexAdapter,\n aider: AiderAdapter,\n};\n\n/**\n * Create a specific adapter by type\n */\nexport function createAdapter(type: AdapterType) {\n const AdapterClass = ADAPTER_TYPES[type];\n if (!AdapterClass) {\n throw new Error(`Unknown adapter type: ${type}`);\n }\n return new AdapterClass();\n}\n\n/**\n * Result of checking if a CLI is installed\n */\nexport interface PreflightResult {\n adapter: string;\n installed: boolean;\n version?: string;\n error?: string;\n installCommand: string;\n docsUrl: string;\n}\n\n/**\n * Check if specific adapters are installed\n *\n * @example\n * ```typescript\n * const results = await checkAdapters(['claude', 'aider']);\n * for (const result of results) {\n * if (!result.installed) {\n * console.log(`${result.adapter} not found. Install: ${result.installCommand}`);\n * }\n * }\n * ```\n */\nexport async function checkAdapters(types: AdapterType[]): Promise<PreflightResult[]> {\n const results: PreflightResult[] = [];\n\n for (const type of types) {\n const adapter = createAdapter(type);\n const validation = await adapter.validateInstallation();\n\n results.push({\n adapter: adapter.displayName,\n installed: validation.installed,\n version: validation.version,\n error: validation.error,\n installCommand: adapter.installation.command,\n docsUrl: adapter.installation.docsUrl,\n });\n }\n\n return results;\n}\n\n/**\n * Check all available adapters\n *\n * @example\n * ```typescript\n * const results = await checkAllAdapters();\n * const missing = results.filter(r => !r.installed);\n *\n * if (missing.length > 0) {\n * console.log('Missing CLI tools:');\n * for (const m of missing) {\n * console.log(` ${m.adapter}: ${m.installCommand}`);\n * }\n * }\n * ```\n */\nexport async function checkAllAdapters(): Promise<PreflightResult[]> {\n return checkAdapters(Object.keys(ADAPTER_TYPES) as AdapterType[]);\n}\n\n/**\n * Print installation instructions for missing adapters\n */\nexport async function printMissingAdapters(types?: AdapterType[]): Promise<void> {\n const results = types ? await checkAdapters(types) : await checkAllAdapters();\n const missing = results.filter(r => !r.installed);\n\n if (missing.length === 0) {\n console.log('All CLI tools are installed!');\n return;\n }\n\n console.log('\\nMissing CLI tools:\\n');\n for (const m of missing) {\n console.log(`${m.adapter}`);\n console.log(` Install: ${m.installCommand}`);\n console.log(` Docs: ${m.docsUrl}`);\n if (m.error) {\n console.log(` Error: ${m.error}`);\n }\n console.log();\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/approval-presets.ts","../src/base-coding-adapter.ts","../src/claude-adapter.ts","../src/gemini-adapter.ts","../src/codex-adapter.ts","../src/aider-adapter.ts","../src/pattern-loader.ts","../src/index.ts"],"names":["BaseCLIAdapter","join","mkdir","dirname","writeFile","appendFile"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Approval Presets\n *\n * Unified preset system for controlling tool permissions across all supported\n * coding agent CLIs. Each preset translates to the correct per-CLI config\n * format (JSON settings files, CLI flags, env vars).\n */\n\nimport type { AdapterType } from './types';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type ToolCategory =\n | 'file_read'\n | 'file_write'\n | 'shell'\n | 'web'\n | 'agent'\n | 'planning'\n | 'user_interaction';\n\nexport type RiskLevel = 'low' | 'medium' | 'high';\n\nexport type ApprovalPreset = 'readonly' | 'standard' | 'permissive' | 'autonomous';\n\nexport interface ToolCategoryInfo {\n category: ToolCategory;\n risk: RiskLevel;\n description: string;\n}\n\nexport interface PresetDefinition {\n preset: ApprovalPreset;\n description: string;\n autoApprove: ToolCategory[];\n requireApproval: ToolCategory[];\n blocked: ToolCategory[];\n}\n\nexport interface ApprovalConfig {\n preset: ApprovalPreset;\n cliFlags: string[];\n workspaceFiles: Array<{\n relativePath: string;\n content: string;\n format: 'json' | 'yaml' | 'toml';\n }>;\n envVars: Record<string, string>;\n summary: string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Constants\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const TOOL_CATEGORIES: ToolCategoryInfo[] = [\n { category: 'file_read', risk: 'low', description: 'Read files, search, list directories' },\n { category: 'file_write', risk: 'medium', description: 'Write, edit, and create files' },\n { category: 'shell', risk: 'high', description: 'Execute shell commands' },\n { category: 'web', risk: 'medium', description: 'Web search and fetch' },\n { category: 'agent', risk: 'medium', description: 'Spawn sub-agents, skills, MCP tools' },\n { category: 'planning', risk: 'low', description: 'Task planning and todo management' },\n { category: 'user_interaction', risk: 'low', description: 'Ask user questions' },\n];\n\nexport const PRESET_DEFINITIONS: PresetDefinition[] = [\n {\n preset: 'readonly',\n description: 'Read-only. Safe for auditing.',\n autoApprove: ['file_read', 'planning', 'user_interaction'],\n requireApproval: [],\n blocked: ['file_write', 'shell', 'web', 'agent'],\n },\n {\n preset: 'standard',\n description: 'Standard dev. Reads + web auto, writes/shell prompt.',\n autoApprove: ['file_read', 'planning', 'user_interaction', 'web'],\n requireApproval: ['file_write', 'shell', 'agent'],\n blocked: [],\n },\n {\n preset: 'permissive',\n description: 'File ops auto-approved, shell still prompts.',\n autoApprove: ['file_read', 'file_write', 'planning', 'user_interaction', 'web', 'agent'],\n requireApproval: ['shell'],\n blocked: [],\n },\n {\n preset: 'autonomous',\n description: 'Everything auto-approved. Use with sandbox.',\n autoApprove: ['file_read', 'file_write', 'shell', 'web', 'agent', 'planning', 'user_interaction'],\n requireApproval: [],\n blocked: [],\n },\n];\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Per-CLI Tool Category Mappings\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const CLAUDE_TOOL_CATEGORIES: Record<string, ToolCategory> = {\n // file_read\n Read: 'file_read',\n Grep: 'file_read',\n Glob: 'file_read',\n LS: 'file_read',\n NotebookRead: 'file_read',\n // file_write\n Write: 'file_write',\n Edit: 'file_write',\n // shell\n Bash: 'shell',\n BashOutput: 'shell',\n KillShell: 'shell',\n // web\n WebSearch: 'web',\n WebFetch: 'web',\n // agent\n Task: 'agent',\n Skill: 'agent',\n // planning\n TodoWrite: 'planning',\n // user_interaction\n AskUserQuestion: 'user_interaction',\n};\n\nexport const GEMINI_TOOL_CATEGORIES: Record<string, ToolCategory> = {\n // file_read\n read_file: 'file_read',\n read_many_files: 'file_read',\n list_directory: 'file_read',\n glob: 'file_read',\n search_file_content: 'file_read',\n // file_write\n write_file: 'file_write',\n replace: 'file_write',\n // shell\n run_shell_command: 'shell',\n // web\n web_fetch: 'web',\n google_web_search: 'web',\n // agent\n activate_skill: 'agent',\n get_internal_docs: 'agent',\n // planning\n save_memory: 'planning',\n write_todos: 'planning',\n // user_interaction\n ask_user: 'user_interaction',\n};\n\nexport const CODEX_TOOL_CATEGORIES: Record<string, ToolCategory> = {\n // shell (codex uses shell for most operations)\n exec_command: 'shell',\n write_stdin: 'shell',\n shell_command: 'shell',\n // file_write\n apply_patch: 'file_write',\n // file_read\n grep_files: 'file_read',\n read_file: 'file_read',\n list_dir: 'file_read',\n // web\n web_search: 'web',\n view_image: 'web',\n // agent\n spawn_agent: 'agent',\n send_input: 'agent',\n resume_agent: 'agent',\n wait: 'agent',\n close_agent: 'agent',\n // planning\n update_plan: 'planning',\n // user_interaction\n request_user_input: 'user_interaction',\n};\n\nexport const AIDER_COMMAND_CATEGORIES: Record<string, ToolCategory> = {\n // file_read\n '/read-only': 'file_read',\n '/ls': 'file_read',\n '/map': 'file_read',\n '/map-refresh': 'file_read',\n '/tokens': 'file_read',\n '/diff': 'file_read',\n '/context': 'file_read',\n // file_write\n '/add': 'file_write',\n '/drop': 'file_write',\n '/edit': 'file_write',\n '/code': 'file_write',\n '/architect': 'file_write',\n '/undo': 'file_write',\n // shell\n '/run': 'shell',\n '/test': 'shell',\n '/lint': 'shell',\n '/git': 'shell',\n // web\n '/web': 'web',\n // planning\n '/ask': 'planning',\n // user_interaction\n '/voice': 'user_interaction',\n '/help': 'user_interaction',\n // config/other\n '/model': 'planning',\n '/settings': 'planning',\n '/commit': 'file_write',\n '/clear': 'planning',\n '/reset': 'planning',\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Per-CLI Config Generators\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction getToolsForCategories(\n mapping: Record<string, ToolCategory>,\n categories: ToolCategory[],\n): string[] {\n return Object.entries(mapping)\n .filter(([, cat]) => categories.includes(cat))\n .map(([tool]) => tool);\n}\n\nexport function generateClaudeApprovalConfig(preset: ApprovalPreset): ApprovalConfig {\n const def = getPresetDefinition(preset);\n\n const allowTools = getToolsForCategories(CLAUDE_TOOL_CATEGORIES, def.autoApprove);\n const denyTools = getToolsForCategories(CLAUDE_TOOL_CATEGORIES, def.blocked);\n\n const settings: Record<string, unknown> = {\n permissions: {} as Record<string, unknown>,\n };\n\n const permissions = settings.permissions as Record<string, unknown>;\n if (allowTools.length > 0) {\n permissions.allow = allowTools;\n }\n if (denyTools.length > 0) {\n permissions.deny = denyTools;\n }\n\n // Autonomous mode: enable sandbox and auto-allow bash\n if (preset === 'autonomous') {\n settings.sandbox = {\n enabled: true,\n autoAllowBashIfSandboxed: true,\n };\n }\n\n const cliFlags: string[] = [];\n\n // Autonomous: pass all tools via --tools flag\n if (preset === 'autonomous') {\n const allTools = Object.keys(CLAUDE_TOOL_CATEGORIES);\n cliFlags.push('--tools', allTools.join(','));\n }\n\n return {\n preset,\n cliFlags,\n workspaceFiles: [\n {\n relativePath: '.claude/settings.json',\n content: JSON.stringify(settings, null, 2),\n format: 'json',\n },\n ],\n envVars: {},\n summary: `Claude Code: ${def.description}`,\n };\n}\n\nexport function generateGeminiApprovalConfig(preset: ApprovalPreset): ApprovalConfig {\n const def = getPresetDefinition(preset);\n const cliFlags: string[] = [];\n\n const allowedTools = getToolsForCategories(GEMINI_TOOL_CATEGORIES, def.autoApprove);\n const excludeTools = getToolsForCategories(GEMINI_TOOL_CATEGORIES, def.blocked);\n\n let approvalMode: string;\n\n switch (preset) {\n case 'readonly':\n approvalMode = 'plan';\n cliFlags.push('--approval-mode', 'plan');\n break;\n case 'standard':\n approvalMode = 'default';\n break;\n case 'permissive':\n approvalMode = 'auto_edit';\n cliFlags.push('--approval-mode', 'auto_edit');\n break;\n case 'autonomous':\n approvalMode = 'auto_edit';\n cliFlags.push('-y');\n break;\n }\n\n const settings: Record<string, unknown> = {\n general: {\n defaultApprovalMode: approvalMode,\n },\n tools: {} as Record<string, unknown>,\n };\n\n const tools = settings.tools as Record<string, unknown>;\n if (allowedTools.length > 0) {\n tools.allowed = allowedTools;\n }\n if (excludeTools.length > 0) {\n tools.exclude = excludeTools;\n }\n\n return {\n preset,\n cliFlags,\n workspaceFiles: [\n {\n relativePath: '.gemini/settings.json',\n content: JSON.stringify(settings, null, 2),\n format: 'json',\n },\n ],\n envVars: {},\n summary: `Gemini CLI: ${def.description}`,\n };\n}\n\nexport function generateCodexApprovalConfig(preset: ApprovalPreset): ApprovalConfig {\n const cliFlags: string[] = [];\n\n let approvalPolicy: string;\n let sandboxMode: string;\n let webSearch: boolean;\n\n switch (preset) {\n case 'readonly':\n approvalPolicy = 'untrusted';\n sandboxMode = 'workspace-read';\n webSearch = false;\n cliFlags.push('--sandbox', 'workspace-read', '-a', 'untrusted');\n break;\n case 'standard':\n approvalPolicy = 'on-failure';\n sandboxMode = 'workspace-write';\n webSearch = true;\n cliFlags.push('--sandbox', 'workspace-write');\n break;\n case 'permissive':\n approvalPolicy = 'on-request';\n sandboxMode = 'workspace-write';\n webSearch = true;\n cliFlags.push('-a', 'on-request');\n break;\n case 'autonomous':\n approvalPolicy = 'never';\n sandboxMode = 'workspace-write';\n webSearch = true;\n cliFlags.push('--full-auto');\n break;\n }\n\n const config = {\n approval_policy: approvalPolicy,\n sandbox_mode: sandboxMode,\n tools: {\n web_search: webSearch,\n },\n };\n\n return {\n preset,\n cliFlags,\n workspaceFiles: [\n {\n relativePath: '.codex/config.json',\n content: JSON.stringify(config, null, 2),\n format: 'json',\n },\n ],\n envVars: {},\n summary: `Codex: ${getPresetDefinition(preset).description}`,\n };\n}\n\nexport function generateAiderApprovalConfig(preset: ApprovalPreset): ApprovalConfig {\n const def = getPresetDefinition(preset);\n const cliFlags: string[] = [];\n const lines: string[] = [];\n\n switch (preset) {\n case 'readonly':\n lines.push('yes-always: false');\n lines.push('no-auto-commits: true');\n cliFlags.push('--no-auto-commits');\n break;\n case 'standard':\n lines.push('yes-always: false');\n break;\n case 'permissive':\n lines.push('yes-always: true');\n cliFlags.push('--yes-always');\n break;\n case 'autonomous':\n lines.push('yes-always: true');\n cliFlags.push('--yes-always');\n break;\n }\n\n return {\n preset,\n cliFlags,\n workspaceFiles: [\n {\n relativePath: '.aider.conf.yml',\n content: lines.join('\\n') + '\\n',\n format: 'yaml',\n },\n ],\n envVars: {},\n summary: `Aider: ${def.description}`,\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Public API\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function generateApprovalConfig(\n adapterType: AdapterType,\n preset: ApprovalPreset,\n): ApprovalConfig {\n switch (adapterType) {\n case 'claude':\n return generateClaudeApprovalConfig(preset);\n case 'gemini':\n return generateGeminiApprovalConfig(preset);\n case 'codex':\n return generateCodexApprovalConfig(preset);\n case 'aider':\n return generateAiderApprovalConfig(preset);\n default:\n throw new Error(`Unknown adapter type: ${adapterType}`);\n }\n}\n\nexport function listPresets(): PresetDefinition[] {\n return [...PRESET_DEFINITIONS];\n}\n\nexport function getPresetDefinition(preset: ApprovalPreset): PresetDefinition {\n const def = PRESET_DEFINITIONS.find(d => d.preset === preset);\n if (!def) {\n throw new Error(`Unknown preset: ${preset}`);\n }\n return def;\n}\n","/**\n * Base Coding Agent Adapter\n *\n * Extends pty-manager's BaseCLIAdapter with credential handling\n * for AI coding agents.\n */\n\nimport { writeFile, appendFile, mkdir } from 'node:fs/promises';\nimport { join, dirname } from 'node:path';\nimport { BaseCLIAdapter } from 'pty-manager';\nimport type { SpawnConfig } from 'pty-manager';\nimport { generateApprovalConfig, type ApprovalPreset, type ApprovalConfig } from './approval-presets';\n\n/**\n * Credentials that can be passed via SpawnConfig.adapterConfig\n */\nexport interface AgentCredentials {\n anthropicKey?: string;\n openaiKey?: string;\n googleKey?: string;\n githubToken?: string;\n custom?: Record<string, string>;\n}\n\n/**\n * Installation information for a CLI tool\n */\nexport interface InstallationInfo {\n /** Command to install the CLI (e.g., \"npm install -g @anthropic-ai/claude-code\") */\n command: string;\n /** Alternative installation methods */\n alternatives?: string[];\n /** URL to installation docs */\n docsUrl: string;\n /** Minimum required version (if known) */\n minVersion?: string;\n}\n\n/**\n * Model tier recommendations for an adapter\n */\nexport interface ModelRecommendations {\n /** Most capable model for complex tasks */\n powerful: string;\n /** Fastest/cheapest model for simple tasks */\n fast: string;\n}\n\n/**\n * Describes a file that a coding agent CLI reads from the workspace.\n * Orchestration systems use this to write instructions/config before spawning agents.\n */\nexport interface AgentFileDescriptor {\n /** File path relative to workspace root (e.g., \"CLAUDE.md\", \".aider.conf.yml\") */\n relativePath: string;\n /** Human-readable description of what this file does */\n description: string;\n /** Whether the CLI reads this file automatically on startup */\n autoLoaded: boolean;\n /** File category */\n type: 'memory' | 'config' | 'rules';\n /** File format */\n format: 'markdown' | 'yaml' | 'json' | 'text';\n}\n\n/**\n * Options for writing a memory file into a workspace\n */\nexport interface WriteMemoryOptions {\n /** Custom file name override (default: adapter's primary memory file) */\n fileName?: string;\n /** Append to existing file instead of overwriting */\n append?: boolean;\n}\n\n/**\n * Extended config with credentials and mode support\n */\nexport interface CodingAgentConfig extends SpawnConfig {\n adapterConfig?: AgentCredentials & {\n /**\n * Run in interactive mode (skip --print/--quiet/--non-interactive flags).\n * Use this when you want the full interactive CLI experience.\n */\n interactive?: boolean;\n /**\n * Preferred provider for multi-provider adapters (e.g., Aider).\n * Only the API key for this provider is passed, letting the CLI\n * pick its best model for that provider automatically.\n */\n provider?: 'anthropic' | 'openai' | 'google';\n /**\n * Approval preset controlling tool permissions.\n * Translates to CLI-specific config files and flags.\n */\n approvalPreset?: ApprovalPreset;\n } & Record<string, unknown>;\n}\n\n/**\n * Base class for AI coding agent adapters\n */\nexport abstract class BaseCodingAdapter extends BaseCLIAdapter {\n /**\n * Coding agent CLIs use TUI menus that require arrow-key navigation.\n */\n override readonly usesTuiMenus: boolean = true;\n\n /**\n * Installation information for this CLI tool\n */\n abstract readonly installation: InstallationInfo;\n\n /**\n * Workspace files this CLI reads automatically.\n * Orchestration systems use this to know where to write instructions/config\n * before spawning an agent.\n */\n abstract getWorkspaceFiles(): AgentFileDescriptor[];\n\n /**\n * The primary memory file for this CLI (the one it reads for project instructions).\n * Returns the relativePath of the first 'memory' type file from getWorkspaceFiles().\n */\n get memoryFilePath(): string {\n const memoryFile = this.getWorkspaceFiles().find(f => f.type === 'memory');\n if (!memoryFile) {\n throw new Error(`${this.displayName} adapter has no memory file defined`);\n }\n return memoryFile.relativePath;\n }\n\n /**\n * Get credentials from config\n */\n protected getCredentials(config: SpawnConfig): AgentCredentials {\n const adapterConfig = config.adapterConfig as AgentCredentials | undefined;\n return adapterConfig || {};\n }\n\n /**\n * Check if interactive mode is enabled.\n * When true, skip non-interactive flags (--print, --quiet, etc.)\n */\n protected isInteractive(config: SpawnConfig): boolean {\n const adapterConfig = config.adapterConfig as { interactive?: boolean } | undefined;\n return adapterConfig?.interactive === true;\n }\n\n /**\n * Get recommended models for this adapter.\n * Returns powerful (most capable) and fast (cheapest/fastest) model names.\n */\n abstract getRecommendedModels(credentials?: AgentCredentials): ModelRecommendations;\n\n /**\n * Override stripAnsi to handle TUI cursor-forward codes.\n * TUI CLIs (Claude Code, Gemini CLI) use \\x1b[<n>C (cursor forward)\n * instead of literal spaces for word positioning. Replace with spaces\n * before stripping other ANSI codes so regex patterns can match.\n */\n protected stripAnsi(str: string): string {\n const withSpaces = str.replace(/\\x1b\\[\\d*C/g, ' ');\n return super.stripAnsi(withSpaces);\n }\n\n /**\n * Override detectExit to include installation instructions\n */\n detectExit(output: string): { exited: boolean; code?: number; error?: string } {\n if (output.includes('Command not found') || output.includes('command not found')) {\n return {\n exited: true,\n code: 127,\n error: `${this.displayName} CLI not found. Install with: ${this.installation.command}\\nDocs: ${this.installation.docsUrl}`,\n };\n }\n\n return super.detectExit(output);\n }\n\n /**\n * Get formatted installation instructions\n */\n getInstallInstructions(): string {\n const lines = [\n `${this.displayName} Installation`,\n `${'='.repeat(this.displayName.length + 13)}`,\n '',\n `Primary: ${this.installation.command}`,\n ];\n\n if (this.installation.alternatives?.length) {\n lines.push('');\n lines.push('Alternatives:');\n for (const alt of this.installation.alternatives) {\n lines.push(` - ${alt}`);\n }\n }\n\n lines.push('');\n lines.push(`Docs: ${this.installation.docsUrl}`);\n\n if (this.installation.minVersion) {\n lines.push(`Minimum version: ${this.installation.minVersion}`);\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Check if response appears complete based on common patterns\n */\n protected isResponseComplete(output: string): boolean {\n const completionIndicators = [\n /\\n>\\s*$/, // Ends with prompt\n /\\n\\s*$/, // Ends with newline\n /Done\\./i, // Explicit done\n /completed/i, // Task completed\n /finished/i, // Finished\n /```\\s*$/, // Code block ended\n ];\n\n return completionIndicators.some((pattern) => pattern.test(output));\n }\n\n /**\n * Extract the main content from CLI output, removing common artifacts\n */\n protected extractContent(output: string, promptPattern: RegExp): string {\n let content = output;\n\n // Remove prompt lines\n content = content.replace(promptPattern, '');\n\n // Remove common status lines\n content = content.replace(/^(Thinking|Working|Reading|Writing|Processing|Generating)\\.+$/gm, '');\n\n // Trim whitespace\n content = content.trim();\n\n return content;\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Approval Presets\n // ─────────────────────────────────────────────────────────────────────────────\n\n /**\n * Extract the approval preset from a spawn config, if set.\n */\n protected getApprovalPreset(config: SpawnConfig): ApprovalPreset | undefined {\n const adapterConfig = config.adapterConfig as { approvalPreset?: ApprovalPreset } | undefined;\n return adapterConfig?.approvalPreset;\n }\n\n /**\n * Generate the approval config for this adapter, if a preset is set.\n */\n getApprovalConfig(config: SpawnConfig): ApprovalConfig | null {\n const preset = this.getApprovalPreset(config);\n if (!preset) return null;\n return generateApprovalConfig(this.adapterType as 'claude' | 'gemini' | 'codex' | 'aider', preset);\n }\n\n /**\n * Write approval config files to a workspace directory.\n * Returns the list of files written (absolute paths).\n */\n async writeApprovalConfig(workspacePath: string, config: SpawnConfig): Promise<string[]> {\n const approvalConfig = this.getApprovalConfig(config);\n if (!approvalConfig) return [];\n\n const written: string[] = [];\n for (const file of approvalConfig.workspaceFiles) {\n const fullPath = join(workspacePath, file.relativePath);\n await mkdir(dirname(fullPath), { recursive: true });\n await writeFile(fullPath, file.content, 'utf-8');\n written.push(fullPath);\n }\n return written;\n }\n\n /**\n * Write content to this agent's memory file in a workspace.\n * Creates parent directories as needed.\n *\n * @param workspacePath - Absolute path to the workspace root\n * @param content - The memory/instructions content to write\n * @param options - Optional: custom fileName, append mode\n * @returns The absolute path of the written file\n */\n async writeMemoryFile(\n workspacePath: string,\n content: string,\n options?: WriteMemoryOptions,\n ): Promise<string> {\n const relativePath = options?.fileName ?? this.memoryFilePath;\n const fullPath = join(workspacePath, relativePath);\n\n // Ensure parent directory exists\n await mkdir(dirname(fullPath), { recursive: true });\n\n if (options?.append) {\n await appendFile(fullPath, content, 'utf-8');\n } else {\n await writeFile(fullPath, content, 'utf-8');\n }\n\n return fullPath;\n }\n}\n","/**\n * Claude Code CLI Adapter\n *\n * Adapter for the Claude Code CLI (claude command).\n */\n\nimport type {\n SpawnConfig,\n ParsedOutput,\n LoginDetection,\n BlockingPromptDetection,\n AutoResponseRule,\n} from 'pty-manager';\nimport { BaseCodingAdapter, type InstallationInfo, type ModelRecommendations, type AgentCredentials, type AgentFileDescriptor } from './base-coding-adapter';\n\nexport class ClaudeAdapter extends BaseCodingAdapter {\n readonly adapterType = 'claude';\n readonly displayName = 'Claude Code';\n\n readonly installation: InstallationInfo = {\n command: 'npm install -g @anthropic-ai/claude-code',\n alternatives: [\n 'npx @anthropic-ai/claude-code (run without installing)',\n 'brew install claude-code (macOS with Homebrew)',\n ],\n docsUrl: 'https://docs.anthropic.com/en/docs/claude-code',\n minVersion: '1.0.0',\n };\n\n /**\n * Auto-response rules for Claude Code CLI.\n * These handle common text-based [y/n] prompts that can be safely auto-responded.\n * Explicit responseType: 'text' prevents the usesTuiMenus default from kicking in.\n */\n readonly autoResponseRules: AutoResponseRule[] = [\n {\n pattern: /trust.*folder|safety.?check|project.you.created/i,\n type: 'permission',\n response: '',\n responseType: 'keys',\n keys: ['enter'],\n description: 'Accept trust prompt for working directory',\n safe: true,\n once: true,\n },\n {\n pattern: /update available.*\\[y\\/n\\]/i,\n type: 'update',\n response: 'n',\n responseType: 'text',\n description: 'Decline Claude Code update to continue execution',\n safe: true,\n },\n {\n pattern: /new version.*available.*\\[y\\/n\\]/i,\n type: 'update',\n response: 'n',\n responseType: 'text',\n description: 'Decline version upgrade prompt',\n safe: true,\n },\n {\n pattern: /would you like to enable.*telemetry.*\\[y\\/n\\]/i,\n type: 'config',\n response: 'n',\n responseType: 'text',\n description: 'Decline telemetry prompt',\n safe: true,\n },\n {\n pattern: /send anonymous usage data.*\\[y\\/n\\]/i,\n type: 'config',\n response: 'n',\n responseType: 'text',\n description: 'Decline anonymous usage data',\n safe: true,\n },\n {\n pattern: /continue without.*\\[y\\/n\\]/i,\n type: 'config',\n response: 'y',\n responseType: 'text',\n description: 'Continue without optional feature',\n safe: true,\n },\n ];\n\n getWorkspaceFiles(): AgentFileDescriptor[] {\n return [\n {\n relativePath: 'CLAUDE.md',\n description: 'Project-level instructions read automatically on startup',\n autoLoaded: true,\n type: 'memory',\n format: 'markdown',\n },\n {\n relativePath: '.claude/settings.json',\n description: 'Project-scoped settings (allowed tools, permissions)',\n autoLoaded: true,\n type: 'config',\n format: 'json',\n },\n {\n relativePath: '.claude/commands',\n description: 'Custom slash commands directory',\n autoLoaded: false,\n type: 'config',\n format: 'markdown',\n },\n ];\n }\n\n getRecommendedModels(_credentials?: AgentCredentials): ModelRecommendations {\n return {\n powerful: 'claude-sonnet-4-20250514',\n fast: 'claude-haiku-4-5-20251001',\n };\n }\n\n getCommand(): string {\n return 'claude';\n }\n\n getArgs(config: SpawnConfig): string[] {\n const args: string[] = [];\n\n // Print mode for non-interactive usage (skip if interactive mode)\n if (!this.isInteractive(config)) {\n args.push('--print');\n\n // Set working directory in non-interactive mode\n // In interactive/PTY mode, the PTY's cwd is already set by spawn config\n if (config.workdir) {\n args.push('--cwd', config.workdir);\n }\n }\n\n // Append approval preset CLI flags\n const approvalConfig = this.getApprovalConfig(config);\n if (approvalConfig) {\n args.push(...approvalConfig.cliFlags);\n }\n\n return args;\n }\n\n getEnv(config: SpawnConfig): Record<string, string> {\n const env: Record<string, string> = {};\n const credentials = this.getCredentials(config);\n\n // API key from credentials or env\n if (credentials.anthropicKey) {\n env.ANTHROPIC_API_KEY = credentials.anthropicKey;\n }\n\n // Model selection (if specified in config env)\n if (config.env?.ANTHROPIC_MODEL) {\n env.ANTHROPIC_MODEL = config.env.ANTHROPIC_MODEL;\n }\n\n // Disable interactive features for automation (skip if interactive mode)\n if (!this.isInteractive(config)) {\n env.CLAUDE_CODE_DISABLE_INTERACTIVE = 'true';\n }\n\n return env;\n }\n\n detectLogin(output: string): LoginDetection {\n const stripped = this.stripAnsi(output);\n\n // Check for API key issues\n if (\n stripped.includes('API key not found') ||\n stripped.includes('ANTHROPIC_API_KEY') ||\n stripped.includes('authentication required') ||\n stripped.includes('Please sign in') ||\n stripped.includes('Invalid API key')\n ) {\n return {\n required: true,\n type: 'api_key',\n instructions: 'Set ANTHROPIC_API_KEY environment variable or provide credentials in adapterConfig',\n };\n }\n\n // Check for OAuth/browser login\n if (\n stripped.includes('Open this URL') ||\n stripped.includes('browser to authenticate')\n ) {\n const urlMatch = stripped.match(/https?:\\/\\/[^\\s]+/);\n return {\n required: true,\n type: 'browser',\n url: urlMatch ? urlMatch[0] : undefined,\n instructions: 'Browser authentication required',\n };\n }\n\n return { required: false };\n }\n\n /**\n * Detect blocking prompts specific to Claude Code CLI\n */\n detectBlockingPrompt(output: string): BlockingPromptDetection {\n // Guard: if the output looks like a ready state, don't flag as blocking.\n // This prevents residual prompt text in the buffer from being misinterpreted\n // after the CLI has already moved past the blocking state.\n if (this.detectReady(output)) {\n return { detected: false };\n }\n\n const stripped = this.stripAnsi(output);\n\n // First check for login (highest priority)\n const loginDetection = this.detectLogin(output);\n if (loginDetection.required) {\n return {\n detected: true,\n type: 'login',\n prompt: loginDetection.instructions,\n url: loginDetection.url,\n canAutoRespond: false,\n instructions: loginDetection.instructions,\n };\n }\n\n // Claude-specific: Tool permission prompt (TUI menu — use keys:enter)\n if (/Do you want to|wants? (your )?permission|needs your permission/i.test(stripped)) {\n return {\n detected: true,\n type: 'permission',\n prompt: 'Claude tool permission',\n suggestedResponse: 'keys:enter',\n canAutoRespond: true,\n instructions: 'Claude is asking permission to use a tool',\n };\n }\n\n // Claude-specific: Model selection prompt\n if (/choose.*model|select.*model|available models/i.test(stripped) &&\n /\\d+\\)|claude-/i.test(stripped)) {\n return {\n detected: true,\n type: 'model_select',\n prompt: 'Claude model selection',\n canAutoRespond: false,\n instructions: 'Please select a Claude model or set ANTHROPIC_MODEL env var',\n };\n }\n\n // Claude-specific: API key tier/plan selection\n if (/which.*tier|select.*plan|api.*tier/i.test(stripped)) {\n return {\n detected: true,\n type: 'config',\n prompt: 'API tier selection',\n canAutoRespond: false,\n instructions: 'Please select an API tier',\n };\n }\n\n // Claude-specific: First-time setup wizard\n if (/welcome to claude|first time setup|initial configuration/i.test(stripped)) {\n return {\n detected: true,\n type: 'config',\n prompt: 'First-time setup',\n canAutoRespond: false,\n instructions: 'Claude Code requires initial configuration',\n };\n }\n\n // Claude-specific: Permission to access files/directories\n if (/allow.*access|grant.*permission|access to .* files/i.test(stripped) &&\n /\\[y\\/n\\]/i.test(stripped)) {\n return {\n detected: true,\n type: 'permission',\n prompt: 'File/directory access permission',\n options: ['y', 'n'],\n suggestedResponse: 'y',\n canAutoRespond: true,\n instructions: 'Claude Code requesting file access permission',\n };\n }\n\n // Fall back to base class detection\n return super.detectBlockingPrompt(output);\n }\n\n detectReady(output: string): boolean {\n const stripped = this.stripAnsi(output);\n\n // Guard: if the output contains a trust prompt, we're NOT ready yet —\n // the user (or auto-response) still needs to confirm.\n if (/trust.*directory|do you want to|needs? your permission/i.test(stripped)) {\n return false;\n }\n\n // Claude Code shows a prompt when ready\n // Only match specific interactive prompts, not banner text like \"Claude Code\"\n // or generic words like \"Ready\" which appear alongside auth/trust screens\n return (\n stripped.includes('How can I help') ||\n stripped.includes('What would you like') ||\n // v2.1+ shows \"for shortcuts\" hint when ready\n stripped.includes('for shortcuts') ||\n // Match \"claude> \" or similar specific prompts, not bare \">\"\n /claude>\\s*$/i.test(stripped) ||\n // v2.1+ uses ❯ as the input prompt\n /❯\\s*$/.test(stripped)\n );\n }\n\n parseOutput(output: string): ParsedOutput | null {\n const stripped = this.stripAnsi(output);\n\n // Check if this looks like a complete response\n const isComplete = this.isResponseComplete(stripped);\n\n if (!isComplete) {\n return null;\n }\n\n // Determine if this is a question\n const isQuestion = this.containsQuestion(stripped);\n\n // Extract the actual content\n const content = this.extractContent(stripped, /^.*>\\s*/gm);\n\n return {\n type: isQuestion ? 'question' : 'response',\n content,\n isComplete: true,\n isQuestion,\n metadata: {\n raw: output,\n },\n };\n }\n\n getPromptPattern(): RegExp {\n // Claude Code prompt patterns\n // Match \"claude> \" specifically, not bare \">\" which is too broad\n return /claude>\\s*$/i;\n }\n\n getHealthCheckCommand(): string {\n return 'claude --version';\n }\n}\n","/**\n * Google Gemini CLI Adapter\n *\n * Adapter for the Google Gemini CLI tool.\n */\n\nimport type {\n SpawnConfig,\n ParsedOutput,\n LoginDetection,\n BlockingPromptDetection,\n AutoResponseRule,\n} from 'pty-manager';\nimport { BaseCodingAdapter, type InstallationInfo, type ModelRecommendations, type AgentCredentials, type AgentFileDescriptor } from './base-coding-adapter';\n\nexport class GeminiAdapter extends BaseCodingAdapter {\n readonly adapterType = 'gemini';\n readonly displayName = 'Google Gemini';\n\n readonly installation: InstallationInfo = {\n command: 'npm install -g @anthropics/gemini-cli',\n alternatives: [\n 'See documentation for latest installation method',\n ],\n docsUrl: 'https://github.com/anthropics/gemini-cli#installation',\n };\n\n /**\n * Auto-response rules for Gemini CLI.\n * Gemini uses Ink/React TUI with arrow-key radio menus.\n * Source: FolderTrustDialog.tsx, MultiFolderTrustDialog.tsx, CloudFreePrivacyNotice.tsx\n */\n readonly autoResponseRules: AutoResponseRule[] = [\n {\n pattern: /do.?you.?trust.?this.?folder|trust.?folder|trust.?parent.?folder/i,\n type: 'permission',\n response: '',\n responseType: 'keys',\n keys: ['enter'],\n description: 'Trust current folder (default selection in radio menu)',\n safe: true,\n once: true,\n },\n {\n pattern: /trust.?the.?following.?folders.*(added|workspace)/i,\n type: 'permission',\n response: '',\n responseType: 'keys',\n keys: ['enter'],\n description: 'Trust multiple folders being added to workspace',\n safe: true,\n once: true,\n },\n {\n pattern: /allow.?google.?to.?use.?this.?data/i,\n type: 'config',\n response: '',\n responseType: 'keys',\n keys: ['down', 'enter'],\n description: 'Decline Google data collection (select \"No\")',\n safe: true,\n once: true,\n },\n ];\n\n getWorkspaceFiles(): AgentFileDescriptor[] {\n return [\n {\n relativePath: 'GEMINI.md',\n description: 'Project-level instructions read automatically on startup',\n autoLoaded: true,\n type: 'memory',\n format: 'markdown',\n },\n {\n relativePath: '.gemini/settings.json',\n description: 'Project-scoped settings (tool permissions, sandbox config)',\n autoLoaded: true,\n type: 'config',\n format: 'json',\n },\n {\n relativePath: '.gemini/styles',\n description: 'Custom style/persona definitions directory',\n autoLoaded: false,\n type: 'config',\n format: 'markdown',\n },\n ];\n }\n\n getRecommendedModels(_credentials?: AgentCredentials): ModelRecommendations {\n return {\n powerful: 'gemini-3-pro',\n fast: 'gemini-3-flash',\n };\n }\n\n getCommand(): string {\n return 'gemini';\n }\n\n getArgs(config: SpawnConfig): string[] {\n const args: string[] = [];\n\n // Non-interactive mode (skip if interactive mode)\n if (!this.isInteractive(config)) {\n args.push('--non-interactive');\n // Text output for easier parsing (only in non-interactive mode)\n args.push('--output-format', 'text');\n\n // Set working directory in non-interactive mode\n // In interactive/PTY mode, the PTY's cwd is already set by spawn config\n if (config.workdir) {\n args.push('--cwd', config.workdir);\n }\n }\n\n // Append approval preset CLI flags\n const approvalConfig = this.getApprovalConfig(config);\n if (approvalConfig) {\n args.push(...approvalConfig.cliFlags);\n }\n\n return args;\n }\n\n getEnv(config: SpawnConfig): Record<string, string> {\n const env: Record<string, string> = {};\n const credentials = this.getCredentials(config);\n\n // Google API key from credentials\n if (credentials.googleKey) {\n env.GOOGLE_API_KEY = credentials.googleKey;\n env.GEMINI_API_KEY = credentials.googleKey;\n }\n\n // Model selection from config env\n if (config.env?.GEMINI_MODEL) {\n env.GEMINI_MODEL = config.env.GEMINI_MODEL;\n }\n\n // Disable color for parsing (skip if interactive mode)\n if (!this.isInteractive(config)) {\n env.NO_COLOR = '1';\n }\n\n return env;\n }\n\n detectLogin(output: string): LoginDetection {\n const stripped = this.stripAnsi(output);\n\n // Check for API key issues\n if (\n stripped.includes('API key not found') ||\n stripped.includes('GOOGLE_API_KEY') ||\n stripped.includes('GEMINI_API_KEY') ||\n stripped.includes('authentication required') ||\n stripped.includes('Invalid API key') ||\n stripped.includes('API key is not valid')\n ) {\n return {\n required: true,\n type: 'api_key',\n instructions: 'Set GOOGLE_API_KEY or GEMINI_API_KEY environment variable',\n };\n }\n\n // Gemini API key entry dialog (ApiAuthDialog.tsx)\n if (/enter.?gemini.?api.?key/i.test(stripped)) {\n return {\n required: true,\n type: 'api_key',\n instructions: 'Enter a Gemini API key or set GEMINI_API_KEY environment variable',\n };\n }\n\n // Auth dialog — initial auth choice (AuthDialog.tsx)\n if (/how.?would.?you.?like.?to.?authenticate/i.test(stripped) ||\n (/get.?started/i.test(stripped) && /login.?with.?google|use.?gemini.?api.?key|vertex/i.test(stripped))) {\n return {\n required: true,\n type: 'oauth',\n instructions: 'Gemini CLI authentication required — select an auth method',\n };\n }\n\n // OAuth in-progress (AuthInProgress.tsx)\n if (/waiting.?for.?auth/i.test(stripped)) {\n return {\n required: true,\n type: 'oauth',\n instructions: 'Waiting for browser authentication to complete',\n };\n }\n\n // Check for OAuth flow\n if (\n stripped.includes('Sign in with Google') ||\n stripped.includes('OAuth') ||\n stripped.includes('accounts.google.com')\n ) {\n const urlMatch = stripped.match(/https?:\\/\\/[^\\s]+/);\n return {\n required: true,\n type: 'oauth',\n url: urlMatch ? urlMatch[0] : 'https://accounts.google.com',\n instructions: 'Google OAuth authentication required',\n };\n }\n\n // Check for ADC (Application Default Credentials)\n if (\n stripped.includes('Application Default Credentials') ||\n stripped.includes('gcloud auth')\n ) {\n return {\n required: true,\n type: 'browser',\n instructions: 'Run: gcloud auth application-default login',\n };\n }\n\n return { required: false };\n }\n\n detectBlockingPrompt(output: string): BlockingPromptDetection {\n const stripped = this.stripAnsi(output);\n\n // Tool permission / execution confirmation (ToolConfirmationMessage.tsx)\n // Check BEFORE login — permission prompts contain \"API key\" banner text\n // that would otherwise false-positive the login detector.\n // TUI arrow-key menu — use keys:enter to select \"Allow once\" (default)\n if (/apply.?this.?change\\??/i.test(stripped) ||\n /allow.?execution.?of/i.test(stripped) ||\n /do.?you.?want.?to.?proceed\\??/i.test(stripped) ||\n /waiting.?for.?user.?confirmation/i.test(stripped)) {\n return {\n detected: true,\n type: 'permission',\n prompt: 'Gemini tool execution confirmation',\n suggestedResponse: 'keys:enter',\n canAutoRespond: true,\n instructions: 'Gemini is asking to apply a change (file write, shell command, etc.)',\n };\n }\n\n // Login check — after permission prompts\n const loginDetection = this.detectLogin(output);\n if (loginDetection.required) {\n return {\n detected: true,\n type: 'login',\n prompt: loginDetection.instructions,\n url: loginDetection.url,\n canAutoRespond: false,\n instructions: loginDetection.instructions,\n };\n }\n\n // Account validation required (ValidationDialog.tsx)\n if (/further.?action.?is.?required/i.test(stripped) ||\n /verify.?your.?account/i.test(stripped) ||\n /waiting.?for.?verification/i.test(stripped)) {\n return {\n detected: true,\n type: 'config',\n prompt: 'Account verification required',\n canAutoRespond: false,\n instructions: 'Your Gemini account requires verification before continuing',\n };\n }\n\n // Model selection\n if (/select.*model|choose.*model|gemini-/i.test(stripped) &&\n /\\d+\\)/i.test(stripped)) {\n return {\n detected: true,\n type: 'model_select',\n prompt: 'Gemini model selection',\n canAutoRespond: false,\n instructions: 'Please select a model or set GEMINI_MODEL env var',\n };\n }\n\n // Project selection\n if (/select.*project|choose.*project|google cloud project/i.test(stripped)) {\n return {\n detected: true,\n type: 'project_select',\n prompt: 'Google Cloud project selection',\n canAutoRespond: false,\n instructions: 'Please select a Google Cloud project',\n };\n }\n\n // Safety filter triggered\n if (/safety.*filter|content.*blocked|unsafe.*content/i.test(stripped)) {\n return {\n detected: true,\n type: 'unknown',\n prompt: 'Safety filter triggered',\n canAutoRespond: false,\n instructions: 'Content was blocked by safety filters',\n };\n }\n\n // Fall back to base class detection\n return super.detectBlockingPrompt(output);\n }\n\n detectReady(output: string): boolean {\n const stripped = this.stripAnsi(output);\n\n // Definitive positive indicators — always win, even if stale auth/trust\n // dialog text is still in the buffer from a TUI re-render.\n // \"Type your message\" is the Composer placeholder (Composer.tsx:446)\n // and is unambiguous — the CLI is ready to accept input.\n if (/type.?your.?message/i.test(stripped)) {\n return true;\n }\n\n // Guard: if output contains a trust or auth prompt, we're NOT ready\n // (only checked when no definitive positive indicator is present)\n if (/do.?you.?trust.?this.?folder/i.test(stripped) ||\n /how.?would.?you.?like.?to.?authenticate/i.test(stripped) ||\n /waiting.?for.?auth/i.test(stripped) ||\n /allow.?google.?to.?use.?this.?data/i.test(stripped)) {\n return false;\n }\n\n // InputPrompt glyph — >, !, *, (r:) (InputPrompt.tsx:1450)\n if (/^\\s*[>!*]\\s+/m.test(stripped) || /\\(r:\\)/.test(stripped)) {\n return true;\n }\n\n return (\n stripped.includes('How can I help') ||\n stripped.includes('What would you like') ||\n // Match \"gemini> \" prompt specifically, not bare \">\"\n /gemini>\\s*$/i.test(stripped)\n );\n }\n\n parseOutput(output: string): ParsedOutput | null {\n const stripped = this.stripAnsi(output);\n\n const isComplete = this.isResponseComplete(stripped);\n\n if (!isComplete) {\n return null;\n }\n\n const isQuestion = this.containsQuestion(stripped);\n\n // Extract content, removing prompts and safety warnings\n let content = this.extractContent(stripped, /^.*(?:gemini|>)\\s*/gim);\n content = content.replace(/^\\[Safety[^\\]]*\\].*$/gm, '');\n\n return {\n type: isQuestion ? 'question' : 'response',\n content,\n isComplete: true,\n isQuestion,\n metadata: {\n raw: output,\n },\n };\n }\n\n /**\n * Detect exit conditions specific to Gemini CLI.\n * Source: FolderTrustDialog.tsx:127, LogoutConfirmationDialog.tsx:64\n */\n override detectExit(output: string): { exited: boolean; code?: number; error?: string } {\n const stripped = this.stripAnsi(output);\n\n if (/folder.?trust.?level.?must.?be.?selected.*exiting/i.test(stripped)) {\n return {\n exited: true,\n code: 1,\n error: 'Gemini CLI exited because no folder trust level was selected',\n };\n }\n\n if (/you are now logged out/i.test(stripped)) {\n return {\n exited: true,\n code: 0,\n };\n }\n\n return super.detectExit(output);\n }\n\n getPromptPattern(): RegExp {\n // Match \"gemini> \" specifically, not bare \">\" which is too broad\n return /gemini>\\s*$/i;\n }\n\n getHealthCheckCommand(): string {\n return 'gemini --version';\n }\n}\n","/**\n * OpenAI Codex CLI Adapter\n *\n * Adapter for the OpenAI Codex CLI tool.\n */\n\nimport type {\n SpawnConfig,\n ParsedOutput,\n LoginDetection,\n BlockingPromptDetection,\n AutoResponseRule,\n} from 'pty-manager';\nimport { BaseCodingAdapter, type InstallationInfo, type ModelRecommendations, type AgentCredentials, type AgentFileDescriptor } from './base-coding-adapter';\n\nexport class CodexAdapter extends BaseCodingAdapter {\n readonly adapterType = 'codex';\n readonly displayName = 'OpenAI Codex';\n\n readonly installation: InstallationInfo = {\n command: 'npm install -g @openai/codex',\n alternatives: [\n 'pip install openai (Python SDK)',\n ],\n docsUrl: 'https://github.com/openai/codex',\n };\n\n /**\n * Auto-response rules for OpenAI Codex CLI.\n * Codex uses ratatui/crossterm full-screen TUI with arrow-key menus.\n * Source: trust_directory.rs, update_prompt.rs, model_migration.rs, cwd_prompt.rs, chatwidget.rs, main.rs\n */\n readonly autoResponseRules: AutoResponseRule[] = [\n {\n pattern: /update.?available.*->|update.?now|skip.?until.?next.?version/i,\n type: 'config',\n response: '',\n responseType: 'keys',\n keys: ['down', 'enter'],\n description: 'Skip Codex CLI update prompt (select \"Skip\")',\n safe: true,\n },\n {\n pattern: /do.?you.?trust.?the.?contents|trust.?this.?directory|yes,?.?continue|prompt.?injection/i,\n type: 'permission',\n response: '',\n responseType: 'keys',\n keys: ['enter'],\n description: 'Trust directory contents (default: \"Yes, continue\")',\n safe: true,\n once: true,\n },\n {\n pattern: /choose.?how.?you.?d.?like.?codex.?to.?proceed|try.?new.?model|use.?existing.?model/i,\n type: 'config',\n response: '',\n responseType: 'keys',\n keys: ['enter'],\n description: 'Accept model migration (default: \"Try new model\")',\n safe: true,\n once: true,\n },\n {\n pattern: /choose.?working.?directory.?to.?(resume|fork)/i,\n type: 'config',\n response: '',\n responseType: 'keys',\n keys: ['enter'],\n description: 'Accept default working directory for session resume',\n safe: true,\n },\n {\n pattern: /enable.?full.?access\\??/i,\n type: 'permission',\n response: '',\n responseType: 'keys',\n keys: ['enter'],\n description: 'Confirm full access mode (default: \"Yes, continue anyway\")',\n safe: true,\n once: true,\n },\n {\n pattern: /continue.?anyway\\?\\s*\\[y\\/N\\]/i,\n type: 'config',\n response: 'y',\n responseType: 'text',\n description: 'Confirm dumb terminal continuation',\n safe: true,\n },\n ];\n\n getWorkspaceFiles(): AgentFileDescriptor[] {\n return [\n {\n relativePath: 'AGENTS.md',\n description: 'Project-level instructions read automatically on startup',\n autoLoaded: true,\n type: 'memory',\n format: 'markdown',\n },\n {\n relativePath: 'codex.md',\n description: 'Additional project context file',\n autoLoaded: true,\n type: 'memory',\n format: 'markdown',\n },\n {\n relativePath: '.codex/config.json',\n description: 'Project-scoped Codex configuration',\n autoLoaded: true,\n type: 'config',\n format: 'json',\n },\n ];\n }\n\n getRecommendedModels(_credentials?: AgentCredentials): ModelRecommendations {\n return {\n powerful: 'o3',\n fast: 'gpt-4o-mini',\n };\n }\n\n getCommand(): string {\n return 'codex';\n }\n\n getArgs(config: SpawnConfig): string[] {\n const args: string[] = [];\n\n // Quiet mode for less verbose output (skip if interactive mode)\n if (!this.isInteractive(config)) {\n args.push('--quiet');\n\n // Set working directory in non-interactive mode\n // In interactive/PTY mode, the PTY's cwd is already set by spawn config\n if (config.workdir) {\n args.push('--cwd', config.workdir);\n }\n }\n\n // Append approval preset CLI flags\n const approvalConfig = this.getApprovalConfig(config);\n if (approvalConfig) {\n args.push(...approvalConfig.cliFlags);\n }\n\n return args;\n }\n\n getEnv(config: SpawnConfig): Record<string, string> {\n const env: Record<string, string> = {};\n const credentials = this.getCredentials(config);\n\n // OpenAI API key from credentials\n if (credentials.openaiKey) {\n env.OPENAI_API_KEY = credentials.openaiKey;\n }\n\n // Model selection from config env\n if (config.env?.OPENAI_MODEL) {\n env.OPENAI_MODEL = config.env.OPENAI_MODEL;\n }\n\n // Disable color output for easier parsing (skip if interactive mode)\n if (!this.isInteractive(config)) {\n env.NO_COLOR = '1';\n }\n\n return env;\n }\n\n detectLogin(output: string): LoginDetection {\n const stripped = this.stripAnsi(output);\n\n // Check for API key issues\n if (\n stripped.includes('API key not found') ||\n stripped.includes('OPENAI_API_KEY') ||\n stripped.includes('authentication required') ||\n stripped.includes('Invalid API key') ||\n stripped.includes('Unauthorized') ||\n stripped.includes('API key is invalid')\n ) {\n return {\n required: true,\n type: 'api_key',\n instructions: 'Set OPENAI_API_KEY environment variable or provide credentials in adapterConfig',\n };\n }\n\n // Onboarding auth menu (auth.rs:313)\n if (/sign.?in.?with.?chatgpt/i.test(stripped) ||\n (/sign.?in.?with.?device.?code/i.test(stripped) && !/open.?this.?link/i.test(stripped)) ||\n /provide.?your.?own.?api.?key/i.test(stripped)) {\n return {\n required: true,\n type: 'oauth',\n instructions: 'Codex authentication required — select a sign-in method or provide an API key',\n };\n }\n\n // Device code login flow (headless_chatgpt_login.rs:140)\n if (/preparing.?device.?code.?login/i.test(stripped) ||\n /open.?this.?link.?in.?your.?browser/i.test(stripped) ||\n /enter.?this.?one-time.?code/i.test(stripped)) {\n const codeMatch = stripped.match(/code[:\\s]+([A-Z0-9-]+)/i);\n const urlMatch = stripped.match(/https?:\\/\\/[^\\s]+/);\n return {\n required: true,\n type: 'device_code',\n url: urlMatch ? urlMatch[0] : undefined,\n instructions: codeMatch\n ? `Enter code ${codeMatch[1]} at the URL`\n : 'Device code authentication in progress — complete in browser',\n };\n }\n\n // Legacy device code detection\n if (stripped.includes('device code') || stripped.includes('Enter the code')) {\n const codeMatch = stripped.match(/code[:\\s]+([A-Z0-9-]+)/i);\n const urlMatch = stripped.match(/https?:\\/\\/[^\\s]+/);\n return {\n required: true,\n type: 'device_code',\n url: urlMatch ? urlMatch[0] : undefined,\n instructions: codeMatch\n ? `Enter code ${codeMatch[1]} at the URL`\n : 'Device code authentication required',\n };\n }\n\n return { required: false };\n }\n\n /**\n * Detect blocking prompts specific to OpenAI Codex CLI.\n * Source: approval_overlay.rs, chatwidget.rs, request_user_input/mod.rs\n */\n detectBlockingPrompt(output: string): BlockingPromptDetection {\n const stripped = this.stripAnsi(output);\n\n // Tool approval prompts (approval_overlay.rs:122)\n // Check BEFORE login — permission prompts may coexist with auth-related banner text.\n // TUI arrow-key menu — use keys:enter to select default (\"Yes, proceed\")\n if (/would.?you.?like.?to.?run.?the.?following.?command/i.test(stripped) ||\n /do.?you.?want.?to.?approve.?access/i.test(stripped) ||\n /would.?you.?like.?to.?make.?the.?following.?edits/i.test(stripped) ||\n (/press.?enter.?to.?confirm/i.test(stripped) && /esc.?to.?cancel/i.test(stripped))) {\n return {\n detected: true,\n type: 'permission',\n prompt: 'Codex tool approval',\n suggestedResponse: 'keys:enter',\n canAutoRespond: true,\n instructions: 'Codex is asking permission to execute a command, approve access, or apply edits',\n };\n }\n\n // Login check — after permission prompts\n const loginDetection = this.detectLogin(output);\n if (loginDetection.required) {\n return {\n detected: true,\n type: 'login',\n prompt: loginDetection.instructions,\n url: loginDetection.url,\n canAutoRespond: false,\n instructions: loginDetection.instructions,\n };\n }\n\n // Windows sandbox setup (chatwidget.rs:5818)\n if (/set.?up.?default.?sandbox/i.test(stripped) ||\n /use.?non-admin.?sandbox/i.test(stripped)) {\n return {\n detected: true,\n type: 'config',\n prompt: 'Windows sandbox setup',\n canAutoRespond: false,\n instructions: 'Codex needs a sandbox configuration on Windows',\n };\n }\n\n // Multi-step user input from model (request_user_input/mod.rs:41)\n if (/type.?your.?answer/i.test(stripped) && /select.?an.?option/i.test(stripped)) {\n return {\n detected: true,\n type: 'unknown',\n prompt: 'Codex requesting structured user input',\n canAutoRespond: false,\n instructions: 'Codex model is asking multi-step questions that require user input',\n };\n }\n\n // Model selection\n if (/select.*model|choose.*model|gpt-4|gpt-3\\.5/i.test(stripped) &&\n /\\d+\\)/i.test(stripped)) {\n return {\n detected: true,\n type: 'model_select',\n prompt: 'OpenAI model selection',\n canAutoRespond: false,\n instructions: 'Please select a model or set OPENAI_MODEL env var',\n };\n }\n\n // Organization selection\n if (/select.*organization|choose.*org|multiple organizations/i.test(stripped)) {\n return {\n detected: true,\n type: 'config',\n prompt: 'Organization selection',\n canAutoRespond: false,\n instructions: 'Please select an OpenAI organization',\n };\n }\n\n // Rate limit warning\n if (/rate limit|too many requests/i.test(stripped) &&\n /retry|wait/i.test(stripped)) {\n return {\n detected: true,\n type: 'unknown',\n prompt: 'Rate limit reached',\n canAutoRespond: false,\n instructions: 'OpenAI rate limit reached - please wait',\n };\n }\n\n // Fall back to base class detection\n return super.detectBlockingPrompt(output);\n }\n\n detectReady(output: string): boolean {\n const stripped = this.stripAnsi(output);\n\n // Guard: if output contains trust, auth, or update prompts, we're NOT ready\n if (/do.?you.?trust.?the.?contents/i.test(stripped) ||\n /sign.?in.?with.?chatgpt/i.test(stripped) ||\n /update.?available/i.test(stripped) ||\n /enable.?full.?access/i.test(stripped) ||\n /choose.?working.?directory/i.test(stripped)) {\n return false;\n }\n\n // Ready prompt glyph `›` with placeholder suggestions (chat_composer.rs:3697)\n if (/›\\s+/m.test(stripped)) {\n return true;\n }\n\n // Placeholder suggestions indicate the composer is active (chatwidget.rs:7228)\n if (/explain this codebase|summarize recent commits|find and fix a bug/i.test(stripped)) {\n return true;\n }\n\n return (\n stripped.includes('How can I help') ||\n /(?:codex|>)\\s*$/i.test(stripped)\n );\n }\n\n parseOutput(output: string): ParsedOutput | null {\n const stripped = this.stripAnsi(output);\n\n const isComplete = this.isResponseComplete(stripped);\n\n if (!isComplete) {\n return null;\n }\n\n const isQuestion = this.containsQuestion(stripped);\n const content = this.extractContent(stripped, /^.*(?:codex|>)\\s*/gim);\n\n return {\n type: isQuestion ? 'question' : 'response',\n content,\n isComplete: true,\n isQuestion,\n metadata: {\n raw: output,\n },\n };\n }\n\n /**\n * Detect exit conditions specific to Codex CLI.\n * Source: main.rs:404, main.rs:414, main.rs:461\n */\n override detectExit(output: string): { exited: boolean; code?: number; error?: string } {\n const stripped = this.stripAnsi(output);\n\n // Session ended — provides resume command (main.rs:404)\n if (/to.?continue.?this.?session,?.?run/i.test(stripped)) {\n return { exited: true, code: 0 };\n }\n\n // Update completed — needs restart (main.rs:461)\n if (/update.?ran.?successfully.*restart.?codex/i.test(stripped)) {\n return {\n exited: true,\n code: 0,\n error: 'Codex updated successfully — restart required',\n };\n }\n\n return super.detectExit(output);\n }\n\n getPromptPattern(): RegExp {\n return /(?:codex|>)\\s*$/i;\n }\n\n getHealthCheckCommand(): string {\n return 'codex --version';\n }\n}\n","/**\n * Aider CLI Adapter\n *\n * Adapter for the Aider AI pair programming tool.\n * https://github.com/paul-gauthier/aider\n */\n\nimport type {\n SpawnConfig,\n ParsedOutput,\n LoginDetection,\n BlockingPromptDetection,\n AutoResponseRule,\n} from 'pty-manager';\nimport { BaseCodingAdapter, type InstallationInfo, type ModelRecommendations, type AgentCredentials, type AgentFileDescriptor } from './base-coding-adapter';\n\nexport class AiderAdapter extends BaseCodingAdapter {\n readonly adapterType = 'aider';\n readonly displayName = 'Aider';\n\n /**\n * Aider uses plain text [y/n] prompts, NOT TUI arrow-key menus.\n */\n override readonly usesTuiMenus: boolean = false;\n\n readonly installation: InstallationInfo = {\n command: 'pip install aider-chat',\n alternatives: [\n 'pipx install aider-chat (isolated install)',\n 'brew install aider (macOS with Homebrew)',\n ],\n docsUrl: 'https://aider.chat/docs/install.html',\n minVersion: '0.50.0',\n };\n\n /**\n * Auto-response rules for Aider CLI.\n * Aider uses plain text prompts via io.py:832 with (Y)es/(N)o format.\n * All rules are responseType: 'text' — Aider never uses TUI menus.\n *\n * Decline rules come first to override the generic accept patterns.\n */\n readonly autoResponseRules: AutoResponseRule[] = [\n // ── Decline rules (specific, checked first) ────────────────────────\n {\n pattern: /allow collection of anonymous analytics/i,\n type: 'config',\n response: 'n',\n responseType: 'text',\n description: 'Decline Aider telemetry opt-in',\n safe: true,\n once: true,\n },\n {\n pattern: /would you like to see what.?s new in this version/i,\n type: 'config',\n response: 'n',\n responseType: 'text',\n description: 'Decline release notes offer',\n safe: true,\n once: true,\n },\n {\n pattern: /open a github issue pre-filled/i,\n type: 'config',\n response: 'n',\n responseType: 'text',\n description: 'Decline automatic bug report',\n safe: true,\n },\n // ── File / edit operations ──────────────────────────────────────────\n {\n pattern: /add .+ to the chat\\?/i,\n type: 'permission',\n response: 'y',\n responseType: 'text',\n description: 'Allow Aider to add files to chat context',\n safe: true,\n },\n {\n pattern: /add url to the chat\\?/i,\n type: 'permission',\n response: 'y',\n responseType: 'text',\n description: 'Allow Aider to add URL content to chat',\n safe: true,\n },\n {\n pattern: /create new file\\?/i,\n type: 'permission',\n response: 'y',\n responseType: 'text',\n description: 'Allow Aider to create new files',\n safe: true,\n },\n {\n pattern: /allow edits to file/i,\n type: 'permission',\n response: 'y',\n responseType: 'text',\n description: 'Allow edits to file not yet in chat',\n safe: true,\n },\n {\n pattern: /edit the files\\?/i,\n type: 'permission',\n response: 'y',\n responseType: 'text',\n description: 'Accept architect mode edits',\n safe: true,\n },\n // ── Shell operations ────────────────────────────────────────────────\n {\n pattern: /run shell commands?\\?/i,\n type: 'permission',\n response: 'y',\n responseType: 'text',\n description: 'Allow Aider to run shell commands',\n safe: true,\n },\n {\n pattern: /add command output to the chat\\?/i,\n type: 'permission',\n response: 'y',\n responseType: 'text',\n description: 'Add shell command output to chat context',\n safe: true,\n },\n {\n pattern: /add \\d+.*tokens of command output to the chat\\?/i,\n type: 'permission',\n response: 'y',\n responseType: 'text',\n description: 'Add /run command output to chat context',\n safe: true,\n },\n // ── Setup / maintenance ─────────────────────────────────────────────\n {\n pattern: /no git repo found.*create one/i,\n type: 'config',\n response: 'y',\n responseType: 'text',\n description: 'Create git repo for change tracking',\n safe: true,\n once: true,\n },\n {\n pattern: /add .+ to \\.gitignore/i,\n type: 'config',\n response: 'y',\n responseType: 'text',\n description: 'Update .gitignore with Aider patterns',\n safe: true,\n once: true,\n },\n {\n pattern: /run pip install\\?/i,\n type: 'config',\n response: 'y',\n responseType: 'text',\n description: 'Install missing Python dependencies',\n safe: true,\n },\n {\n pattern: /install playwright\\?/i,\n type: 'config',\n response: 'y',\n responseType: 'text',\n description: 'Install Playwright for web scraping',\n safe: true,\n },\n // ── Other safe confirmations ────────────────────────────────────────\n {\n pattern: /fix lint errors in/i,\n type: 'permission',\n response: 'y',\n responseType: 'text',\n description: 'Accept lint error fix suggestion',\n safe: true,\n },\n {\n pattern: /try to proceed anyway\\?/i,\n type: 'config',\n response: 'y',\n responseType: 'text',\n description: 'Continue despite context limit warning',\n safe: true,\n },\n ];\n\n getWorkspaceFiles(): AgentFileDescriptor[] {\n return [\n {\n relativePath: '.aider.conventions.md',\n description: 'Project conventions and instructions read on startup (--read flag)',\n autoLoaded: true,\n type: 'memory',\n format: 'markdown',\n },\n {\n relativePath: '.aider.conf.yml',\n description: 'Project-scoped Aider configuration (model, flags, options)',\n autoLoaded: true,\n type: 'config',\n format: 'yaml',\n },\n {\n relativePath: '.aiderignore',\n description: 'Gitignore-style file listing paths Aider should not edit',\n autoLoaded: true,\n type: 'rules',\n format: 'text',\n },\n ];\n }\n\n getRecommendedModels(credentials?: AgentCredentials): ModelRecommendations {\n if (credentials?.anthropicKey) {\n return {\n powerful: 'anthropic/claude-sonnet-4-20250514',\n fast: 'anthropic/claude-haiku-4-5-20251001',\n };\n }\n if (credentials?.openaiKey) {\n return {\n powerful: 'openai/o3',\n fast: 'openai/gpt-4o-mini',\n };\n }\n if (credentials?.googleKey) {\n return {\n powerful: 'gemini/gemini-3-pro',\n fast: 'gemini/gemini-3-flash',\n };\n }\n // Default to Anthropic\n return {\n powerful: 'anthropic/claude-sonnet-4-20250514',\n fast: 'anthropic/claude-haiku-4-5-20251001',\n };\n }\n\n getCommand(): string {\n return 'aider';\n }\n\n getArgs(config: SpawnConfig): string[] {\n const args: string[] = [];\n\n // Use auto-commits to avoid manual git operations\n args.push('--auto-commits');\n\n // Disable pretty output for easier parsing (skip if interactive mode)\n if (!this.isInteractive(config)) {\n args.push('--no-pretty');\n // Don't show diffs (we'll handle this separately if needed)\n args.push('--no-show-diffs');\n }\n\n // Set working directory via --file flag prefix\n // Aider uses current directory, so we rely on PTY cwd\n\n // Model: explicit > provider metadata > inferred from API keys > aider default\n // Aliases (sonnet, 4o, gemini) are maintained by Aider and auto-update\n const provider = (config.adapterConfig as { provider?: string } | undefined)?.provider;\n const credentials = this.getCredentials(config);\n if (config.env?.AIDER_MODEL) {\n args.push('--model', config.env.AIDER_MODEL);\n } else if (provider === 'anthropic') {\n args.push('--model', 'sonnet');\n } else if (provider === 'openai') {\n args.push('--model', '4o');\n } else if (provider === 'google') {\n args.push('--model', 'gemini');\n } else if (credentials.anthropicKey) {\n // No explicit provider — infer from available API keys\n args.push('--model', 'sonnet');\n } else if (credentials.openaiKey) {\n args.push('--model', '4o');\n } else if (credentials.googleKey) {\n args.push('--model', 'gemini');\n }\n // No keys at all → don't force a model, let aider use its own default\n\n // API keys via --api-key flag (no env vars needed)\n if (credentials.anthropicKey) args.push('--api-key', `anthropic=${credentials.anthropicKey}`);\n if (credentials.openaiKey) args.push('--api-key', `openai=${credentials.openaiKey}`);\n if (credentials.googleKey) args.push('--api-key', `gemini=${credentials.googleKey}`);\n\n // Append approval preset CLI flags\n const approvalConfig = this.getApprovalConfig(config);\n if (approvalConfig) {\n args.push(...approvalConfig.cliFlags);\n }\n\n return args;\n }\n\n getEnv(config: SpawnConfig): Record<string, string> {\n // API keys are passed via --api-key args, not env vars\n const env: Record<string, string> = {};\n\n // Disable color for parsing (skip if interactive mode)\n if (!this.isInteractive(config)) {\n env.NO_COLOR = '1';\n }\n\n // Disable git integration if not wanted\n if (config.env?.AIDER_NO_GIT === 'true') {\n env.AIDER_NO_GIT = 'true';\n }\n\n return env;\n }\n\n detectLogin(output: string): LoginDetection {\n const stripped = this.stripAnsi(output);\n\n // Check for missing API keys\n if (\n stripped.includes('No API key') ||\n stripped.includes('API key not found') ||\n stripped.includes('ANTHROPIC_API_KEY') ||\n stripped.includes('OPENAI_API_KEY') ||\n stripped.includes('Missing API key')\n ) {\n return {\n required: true,\n type: 'api_key',\n instructions: 'Set ANTHROPIC_API_KEY or OPENAI_API_KEY environment variable',\n };\n }\n\n // Check for invalid API key\n if (\n stripped.includes('Invalid API key') ||\n stripped.includes('Authentication failed') ||\n stripped.includes('Unauthorized')\n ) {\n return {\n required: true,\n type: 'api_key',\n instructions: 'API key is invalid - please check your credentials',\n };\n }\n\n // OpenRouter OAuth login offer (onboarding.py:94)\n if (/login to openrouter or create a free account/i.test(stripped)) {\n return {\n required: true,\n type: 'oauth',\n instructions: 'Aider offering OpenRouter OAuth login — provide API keys to skip',\n };\n }\n\n // OpenRouter OAuth browser flow in progress (onboarding.py:311)\n if (/please open this url in your browser to connect aider with openrouter/i.test(stripped) ||\n /waiting up to 5 minutes for you to finish in the browser/i.test(stripped)) {\n const urlMatch = stripped.match(/https?:\\/\\/[^\\s]+/);\n return {\n required: true,\n type: 'browser',\n url: urlMatch ? urlMatch[0] : undefined,\n instructions: 'Complete OpenRouter authentication in browser',\n };\n }\n\n return { required: false };\n }\n\n /**\n * Detect blocking prompts specific to Aider CLI.\n * Source: io.py, onboarding.py, base_coder.py, report.py\n */\n detectBlockingPrompt(output: string): BlockingPromptDetection {\n const stripped = this.stripAnsi(output);\n\n // First check for login / auth\n const loginDetection = this.detectLogin(output);\n if (loginDetection.required) {\n return {\n detected: true,\n type: 'login',\n prompt: loginDetection.instructions,\n url: loginDetection.url,\n canAutoRespond: false,\n instructions: loginDetection.instructions,\n };\n }\n\n // Model selection\n if (/select.*model|choose.*model|which model/i.test(stripped)) {\n return {\n detected: true,\n type: 'model_select',\n prompt: 'Model selection required',\n canAutoRespond: false,\n instructions: 'Please select a model or set AIDER_MODEL env var',\n };\n }\n\n // Confirmation validation error — re-prompt loop (io.py:897)\n if (/please answer with one of:/i.test(stripped)) {\n return {\n detected: true,\n type: 'unknown',\n prompt: 'Invalid confirmation input',\n canAutoRespond: false,\n instructions: 'Aider received an invalid response to a confirmation prompt',\n };\n }\n\n // Destructive operations — NOT auto-responded\n if (/delete|remove|overwrite/i.test(stripped) &&\n (/\\[y\\/n\\]/i.test(stripped) || /\\(Y\\)es\\/\\(N\\)o/i.test(stripped))) {\n return {\n detected: true,\n type: 'permission',\n prompt: 'Destructive operation confirmation',\n options: ['y', 'n'],\n canAutoRespond: false,\n instructions: 'Aider is asking to perform a potentially destructive operation',\n };\n }\n\n // Fall back to base class detection\n return super.detectBlockingPrompt(output);\n }\n\n detectReady(output: string): boolean {\n const stripped = this.stripAnsi(output);\n\n // Guard: if output contains an auth/OAuth prompt, we're NOT ready\n if (/login to openrouter/i.test(stripped) ||\n /open this url in your browser/i.test(stripped) ||\n /waiting up to 5 minutes/i.test(stripped)) {\n return false;\n }\n\n // Edit-format mode prompts (io.py:545): ask>, code>, architect>, help>, multi>\n if (/(?:ask|code|architect|help)(?:\\s+multi)?>\\s*$/m.test(stripped) ||\n /^multi>\\s*$/m.test(stripped)) {\n return true;\n }\n\n // Startup banner indicates Aider launched (base_coder.py:209)\n if (/^Aider v\\d+/m.test(stripped)) {\n return true;\n }\n\n // File list display means chat context is ready\n if (/^(?:Readonly|Editable):/m.test(stripped)) {\n return true;\n }\n\n return (\n // Legacy prompt patterns\n stripped.includes('aider>') ||\n /Added.*to the chat/i.test(stripped) ||\n />\\s*$/.test(stripped)\n );\n }\n\n parseOutput(output: string): ParsedOutput | null {\n const stripped = this.stripAnsi(output);\n\n const isComplete = this.isResponseComplete(stripped);\n\n if (!isComplete) {\n return null;\n }\n\n const isQuestion = this.containsQuestion(stripped);\n\n // Extract content, removing aider prompt\n let content = this.extractContent(stripped, /^.*aider>\\s*/gim);\n\n // Remove file operation confirmations from content\n content = content.replace(/^(Added|Removed|Created|Updated) .+ (to|from) the chat\\.?$/gm, '');\n\n return {\n type: isQuestion ? 'question' : 'response',\n content: content.trim(),\n isComplete: true,\n isQuestion,\n metadata: {\n raw: output,\n },\n };\n }\n\n /**\n * Detect exit conditions specific to Aider.\n * Source: base_coder.py:994, base_coder.py:998, report.py:77, versioncheck.py:58\n */\n override detectExit(output: string): { exited: boolean; code?: number; error?: string } {\n const stripped = this.stripAnsi(output);\n\n // Ctrl+C exit (base_coder.py:994-998)\n if (/\\^C again to exit/i.test(stripped) ||\n /\\^C KeyboardInterrupt/i.test(stripped)) {\n return { exited: true, code: 130 };\n }\n\n // Version update completed (versioncheck.py:58)\n if (/re-run aider to use new version/i.test(stripped)) {\n return {\n exited: true,\n code: 0,\n error: 'Aider updated — restart required',\n };\n }\n\n return super.detectExit(output);\n }\n\n getPromptPattern(): RegExp {\n // Match edit-format prompts: ask>, code>, architect>, help>, multi>\n // Also legacy aider> and bare >\n return /(?:ask|code|architect|help|aider|multi)(?:\\s+multi)?>\\s*$/i;\n }\n\n getHealthCheckCommand(): string {\n return 'aider --version';\n }\n}\n","/**\n * Dynamic Pattern Loader\n *\n * Loads adapter patterns from @parallax/adapter-monitor snapshots when available,\n * with fallback to hardcoded baseline patterns.\n */\n\nimport type { AdapterType } from './types';\n\n/**\n * Pattern set for an adapter\n */\nexport interface AdapterPatterns {\n /** Ready state detection patterns */\n ready: string[];\n /** Auth/login detection patterns */\n auth: string[];\n /** Blocking prompt detection patterns */\n blocking: string[];\n /** Source of patterns */\n source: 'snapshot' | 'baseline';\n /** Version these patterns are from (if from snapshot) */\n version?: string;\n}\n\n/**\n * Baseline hardcoded patterns - used when no snapshots available\n */\nconst BASELINE_PATTERNS: Record<AdapterType, AdapterPatterns> = {\n claude: {\n ready: [\n 'Claude Code',\n 'How can I help',\n 'What would you like',\n 'Ready',\n ],\n auth: [\n 'ANTHROPIC_API_KEY',\n 'API key not found',\n 'authentication required',\n 'Please sign in',\n 'Invalid API key',\n ],\n blocking: [\n 'update available',\n '[y/n]',\n ],\n source: 'baseline',\n },\n\n gemini: {\n ready: [\n 'Type your message',\n 'How can I help',\n 'What would you like',\n 'Ready',\n ],\n auth: [\n 'GOOGLE_API_KEY',\n 'GEMINI_API_KEY',\n 'API key not found',\n 'Sign in with Google',\n 'gcloud auth',\n 'Application Default Credentials',\n ],\n blocking: [\n 'update available',\n '[y/n]',\n ],\n source: 'baseline',\n },\n\n codex: {\n ready: [\n 'Codex',\n 'How can I help',\n 'Ready',\n ],\n auth: [\n 'OPENAI_API_KEY',\n 'API key not found',\n 'Unauthorized',\n 'Invalid API key',\n ],\n blocking: [\n 'update available',\n '[y/n]',\n ],\n source: 'baseline',\n },\n\n aider: {\n ready: [\n 'Aider',\n 'What would you like',\n 'Ready',\n ],\n auth: [\n 'API key',\n 'OPENAI_API_KEY',\n 'ANTHROPIC_API_KEY',\n 'No API key',\n ],\n blocking: [\n '(Y)es/(N)o',\n '[y/n]',\n ],\n source: 'baseline',\n },\n};\n\n/**\n * Cache for loaded patterns\n */\nconst patternCache: Map<string, AdapterPatterns> = new Map();\n\n/**\n * Monitor patterns result shape (matches @parallax/adapter-monitor VersionPatternMapping)\n */\ninterface MonitorPatterns {\n version: string;\n readyPatterns: string[];\n authPatterns: string[];\n blockingPatterns: string[];\n}\n\n/**\n * Try to load patterns from @parallax/adapter-monitor\n */\nasync function tryLoadFromMonitor(\n adapter: AdapterType,\n version?: string\n): Promise<AdapterPatterns | null> {\n try {\n // Dynamic import - will fail gracefully if package not installed\n // Uses string variable to avoid TypeScript trying to resolve the module\n const moduleName = 'agent-adapter-monitor';\n const monitor = await import(/* webpackIgnore: true */ moduleName) as {\n getPatternsForVersion: (\n adapter: string,\n version: string\n ) => Promise<MonitorPatterns | null>;\n };\n\n // Try to get patterns for specific version or latest\n const patterns = version\n ? await monitor.getPatternsForVersion(adapter, version)\n : await monitor.getPatternsForVersion(adapter, 'latest');\n\n if (patterns) {\n return {\n ready: patterns.readyPatterns || [],\n auth: patterns.authPatterns || [],\n blocking: patterns.blockingPatterns || [],\n source: 'snapshot',\n version: patterns.version,\n };\n }\n } catch {\n // Package not installed or no snapshots available - that's fine\n }\n\n return null;\n}\n\n/**\n * Load patterns for an adapter\n *\n * Tries to load from @parallax/adapter-monitor snapshots first,\n * falls back to hardcoded baseline patterns.\n *\n * @param adapter - Adapter type\n * @param version - Optional specific CLI version to load patterns for\n * @param forceRefresh - Skip cache and reload\n */\nexport async function loadPatterns(\n adapter: AdapterType,\n version?: string,\n forceRefresh = false\n): Promise<AdapterPatterns> {\n const cacheKey = `${adapter}:${version || 'latest'}`;\n\n // Check cache first\n if (!forceRefresh && patternCache.has(cacheKey)) {\n return patternCache.get(cacheKey)!;\n }\n\n // Try loading from monitor\n const monitorPatterns = await tryLoadFromMonitor(adapter, version);\n\n if (monitorPatterns && monitorPatterns.ready.length > 0) {\n patternCache.set(cacheKey, monitorPatterns);\n return monitorPatterns;\n }\n\n // Fall back to baseline\n const baseline = BASELINE_PATTERNS[adapter];\n patternCache.set(cacheKey, baseline);\n return baseline;\n}\n\n/**\n * Load patterns synchronously (uses cache or baseline only)\n *\n * Use this in constructors or synchronous code paths.\n * For best results, call loadPatterns() asynchronously during init.\n */\nexport function loadPatternsSync(adapter: AdapterType): AdapterPatterns {\n const cacheKey = `${adapter}:latest`;\n\n // Return cached if available\n if (patternCache.has(cacheKey)) {\n return patternCache.get(cacheKey)!;\n }\n\n // Otherwise return baseline (don't cache - let async load update it)\n return BASELINE_PATTERNS[adapter];\n}\n\n/**\n * Preload patterns for all adapters\n *\n * Call this during application startup to warm the cache.\n */\nexport async function preloadAllPatterns(): Promise<void> {\n const adapters: AdapterType[] = ['claude', 'gemini', 'codex', 'aider'];\n\n await Promise.all(adapters.map((adapter) => loadPatterns(adapter)));\n}\n\n/**\n * Clear the pattern cache\n */\nexport function clearPatternCache(): void {\n patternCache.clear();\n}\n\n/**\n * Get baseline patterns (always available, no async)\n */\nexport function getBaselinePatterns(adapter: AdapterType): AdapterPatterns {\n return BASELINE_PATTERNS[adapter];\n}\n\n/**\n * Check if dynamic patterns are available\n */\nexport async function hasDynamicPatterns(adapter: AdapterType): Promise<boolean> {\n const patterns = await tryLoadFromMonitor(adapter);\n return patterns !== null;\n}\n","/**\n * coding-agent-adapters\n *\n * CLI adapters for AI coding agents.\n * Works with pty-manager to spawn and manage coding agents.\n *\n * @example\n * ```typescript\n * import { PTYManager } from 'pty-manager';\n * import { ClaudeAdapter, GeminiAdapter } from 'coding-agent-adapters';\n *\n * const manager = new PTYManager();\n * manager.registerAdapter(new ClaudeAdapter());\n * manager.registerAdapter(new GeminiAdapter());\n *\n * // Non-interactive mode (default) - for automation\n * const session = await manager.spawn({\n * name: 'my-agent',\n * type: 'claude',\n * workdir: '/path/to/project',\n * adapterConfig: {\n * anthropicKey: process.env.ANTHROPIC_API_KEY,\n * },\n * });\n *\n * // Interactive mode - full CLI experience\n * const interactiveSession = await manager.spawn({\n * name: 'my-interactive-agent',\n * type: 'claude',\n * workdir: '/path/to/project',\n * adapterConfig: {\n * anthropicKey: process.env.ANTHROPIC_API_KEY,\n * interactive: true, // Skip --print/--quiet/--non-interactive flags\n * },\n * });\n * ```\n */\n\n// Base class for extending\nexport { BaseCodingAdapter } from './base-coding-adapter';\nexport type { AgentCredentials, CodingAgentConfig, InstallationInfo, ModelRecommendations, AgentFileDescriptor, WriteMemoryOptions } from './base-coding-adapter';\n\n// Adapters\nexport { ClaudeAdapter } from './claude-adapter';\nexport { GeminiAdapter } from './gemini-adapter';\nexport { CodexAdapter } from './codex-adapter';\nexport { AiderAdapter } from './aider-adapter';\n\n// Pattern loading (dynamic patterns from adapter-monitor, with baseline fallback)\nexport {\n loadPatterns,\n loadPatternsSync,\n preloadAllPatterns,\n clearPatternCache,\n getBaselinePatterns,\n hasDynamicPatterns,\n} from './pattern-loader';\nexport type { AdapterPatterns } from './pattern-loader';\n\n// Approval presets\nexport {\n generateApprovalConfig,\n generateClaudeApprovalConfig,\n generateGeminiApprovalConfig,\n generateCodexApprovalConfig,\n generateAiderApprovalConfig,\n listPresets,\n getPresetDefinition,\n TOOL_CATEGORIES,\n PRESET_DEFINITIONS,\n CLAUDE_TOOL_CATEGORIES,\n GEMINI_TOOL_CATEGORIES,\n CODEX_TOOL_CATEGORIES,\n AIDER_COMMAND_CATEGORIES,\n} from './approval-presets';\nexport type {\n ToolCategory,\n RiskLevel,\n ApprovalPreset,\n ToolCategoryInfo,\n PresetDefinition,\n ApprovalConfig,\n} from './approval-presets';\n\n// Types\nexport type { AdapterType } from './types';\n\n// Convenience function to register all adapters\nimport { ClaudeAdapter } from './claude-adapter';\nimport { GeminiAdapter } from './gemini-adapter';\nimport { CodexAdapter } from './codex-adapter';\nimport { AiderAdapter } from './aider-adapter';\n\n/**\n * Create instances of all available adapters\n */\nexport function createAllAdapters() {\n return [\n new ClaudeAdapter(),\n new GeminiAdapter(),\n new CodexAdapter(),\n new AiderAdapter(),\n ];\n}\n\n/**\n * Adapter type to class mapping\n */\nimport type { AdapterType } from './types';\n\nexport const ADAPTER_TYPES: Record<AdapterType, typeof ClaudeAdapter | typeof GeminiAdapter | typeof CodexAdapter | typeof AiderAdapter> = {\n claude: ClaudeAdapter,\n gemini: GeminiAdapter,\n codex: CodexAdapter,\n aider: AiderAdapter,\n};\n\n/**\n * Create a specific adapter by type\n */\nexport function createAdapter(type: AdapterType) {\n const AdapterClass = ADAPTER_TYPES[type];\n if (!AdapterClass) {\n throw new Error(`Unknown adapter type: ${type}`);\n }\n return new AdapterClass();\n}\n\n/**\n * Result of checking if a CLI is installed\n */\nexport interface PreflightResult {\n adapter: string;\n installed: boolean;\n version?: string;\n error?: string;\n installCommand: string;\n docsUrl: string;\n}\n\n/**\n * Check if specific adapters are installed\n *\n * @example\n * ```typescript\n * const results = await checkAdapters(['claude', 'aider']);\n * for (const result of results) {\n * if (!result.installed) {\n * console.log(`${result.adapter} not found. Install: ${result.installCommand}`);\n * }\n * }\n * ```\n */\nexport async function checkAdapters(types: AdapterType[]): Promise<PreflightResult[]> {\n const results: PreflightResult[] = [];\n\n for (const type of types) {\n const adapter = createAdapter(type);\n const validation = await adapter.validateInstallation();\n\n results.push({\n adapter: adapter.displayName,\n installed: validation.installed,\n version: validation.version,\n error: validation.error,\n installCommand: adapter.installation.command,\n docsUrl: adapter.installation.docsUrl,\n });\n }\n\n return results;\n}\n\n/**\n * Check all available adapters\n *\n * @example\n * ```typescript\n * const results = await checkAllAdapters();\n * const missing = results.filter(r => !r.installed);\n *\n * if (missing.length > 0) {\n * console.log('Missing CLI tools:');\n * for (const m of missing) {\n * console.log(` ${m.adapter}: ${m.installCommand}`);\n * }\n * }\n * ```\n */\nexport async function checkAllAdapters(): Promise<PreflightResult[]> {\n return checkAdapters(Object.keys(ADAPTER_TYPES) as AdapterType[]);\n}\n\n/**\n * Print installation instructions for missing adapters\n */\nexport async function printMissingAdapters(types?: AdapterType[]): Promise<void> {\n const results = types ? await checkAdapters(types) : await checkAllAdapters();\n const missing = results.filter(r => !r.installed);\n\n if (missing.length === 0) {\n console.log('All CLI tools are installed!');\n return;\n }\n\n console.log('\\nMissing CLI tools:\\n');\n for (const m of missing) {\n console.log(`${m.adapter}`);\n console.log(` Install: ${m.installCommand}`);\n console.log(` Docs: ${m.docsUrl}`);\n if (m.error) {\n console.log(` Error: ${m.error}`);\n }\n console.log();\n }\n}\n"]}