coding-agent-adapters 0.2.11 → 0.2.13

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.
package/dist/index.cjs CHANGED
@@ -122,6 +122,16 @@ var ClaudeAdapter = class extends BaseCodingAdapter {
122
122
  * Explicit responseType: 'text' prevents the usesTuiMenus default from kicking in.
123
123
  */
124
124
  autoResponseRules = [
125
+ {
126
+ pattern: /trust.*folder|safety.?check|project.you.created/i,
127
+ type: "permission",
128
+ response: "",
129
+ responseType: "keys",
130
+ keys: ["enter"],
131
+ description: "Accept trust prompt for working directory",
132
+ safe: true,
133
+ once: true
134
+ },
125
135
  {
126
136
  pattern: /update available.*\[y\/n\]/i,
127
137
  type: "update",
@@ -287,8 +297,10 @@ var ClaudeAdapter = class extends BaseCodingAdapter {
287
297
  if (/trust.*directory|do you want to|needs? your permission/i.test(stripped)) {
288
298
  return false;
289
299
  }
290
- return stripped.includes("How can I help") || stripped.includes("What would you like") || // Match "claude> " or similar specific prompts, not bare ">"
291
- /claude>\s*$/i.test(stripped);
300
+ return stripped.includes("How can I help") || stripped.includes("What would you like") || // v2.1+ shows "for shortcuts" hint when ready
301
+ stripped.includes("for shortcuts") || // Match "claude> " or similar specific prompts, not bare ">"
302
+ /claude>\s*$/i.test(stripped) || // v2.1+ uses ❯ as the input prompt
303
+ /❯\s*$/.test(stripped);
292
304
  }
293
305
  parseOutput(output) {
294
306
  const stripped = this.stripAnsi(output);
@@ -499,13 +511,14 @@ var CodexAdapter = class extends BaseCodingAdapter {
499
511
  safe: true
500
512
  },
501
513
  {
502
- pattern: /trust the contents of this directory/i,
514
+ pattern: /trust.the.contents|trust.this.directory|do.you.trust/i,
503
515
  type: "permission",
504
516
  response: "",
505
517
  responseType: "keys",
506
518
  keys: ["enter"],
507
519
  description: "Trust directory contents to allow Codex to operate",
508
- safe: true
520
+ safe: true,
521
+ once: true
509
522
  }
510
523
  ];
511
524
  getRecommendedModels(_credentials) {
@@ -661,7 +674,7 @@ var AiderAdapter = class extends BaseCodingAdapter {
661
674
  */
662
675
  autoResponseRules = [
663
676
  {
664
- pattern: /Add .+ to the chat\?.*\[y\/n\]/i,
677
+ pattern: /Add .+ to the chat\?.*(\[y\/n\]|\[Yes\]|\(Y\)es)/i,
665
678
  type: "permission",
666
679
  response: "y",
667
680
  responseType: "text",
@@ -669,7 +682,7 @@ var AiderAdapter = class extends BaseCodingAdapter {
669
682
  safe: true
670
683
  },
671
684
  {
672
- pattern: /Create new file.*\[y\/n\]/i,
685
+ pattern: /Create new file.*(\[y\/n\]|\[Yes\]|\(Y\)es)/i,
673
686
  type: "permission",
674
687
  response: "y",
675
688
  responseType: "text",
@@ -677,7 +690,7 @@ var AiderAdapter = class extends BaseCodingAdapter {
677
690
  safe: true
678
691
  },
679
692
  {
680
- pattern: /Apply.*changes.*\[y\/n\]/i,
693
+ pattern: /Apply.*changes.*(\[y\/n\]|\[Yes\]|\(Y\)es)/i,
681
694
  type: "permission",
682
695
  response: "y",
683
696
  responseType: "text",
@@ -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"],"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 { 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 * 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 * 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 * 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 } 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: /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 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 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 // Match \"claude> \" or similar specific prompts, not bare \">\"\n /claude>\\s*$/i.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} from 'pty-manager';\nimport { BaseCodingAdapter, type InstallationInfo, type ModelRecommendations, type AgentCredentials } 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 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 // 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 // Gemini-specific: Tool execution confirmation (WriteFile, Shell, etc.)\n // Check BEFORE login — permission prompts contain \"API key\" banner text\n // that would otherwise false-positive the login detector.\n // TUI menu — use keys:enter to confirm\n if (/Apply this change\\?/i.test(stripped) || /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 // Gemini-specific: 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 // Gemini-specific: 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 // Gemini-specific: 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 // Specific ready indicators - avoid broad patterns like \"Gemini\" which\n // appears in banners alongside auth errors\n return (\n stripped.includes('Ready') ||\n stripped.includes('Type your message') ||\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 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 } 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 TUI menus (Ink/React) — rules use key sequences.\n */\n readonly autoResponseRules: AutoResponseRule[] = [\n {\n pattern: /Update (available|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: /trust the contents of this directory/i,\n type: 'permission',\n response: '',\n responseType: 'keys',\n keys: ['enter'],\n description: 'Trust directory contents to allow Codex to operate',\n safe: true,\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 // Check for device code flow\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 */\n detectBlockingPrompt(output: string): BlockingPromptDetection {\n const stripped = this.stripAnsi(output);\n\n // First check for login\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 // OpenAI-specific: 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 // OpenAI-specific: 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 // OpenAI-specific: 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 return (\n stripped.includes('Codex') ||\n stripped.includes('Ready') ||\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 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 } 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 [y/n] prompts, NOT TUI menus.\n * Explicit responseType: 'text' prevents the usesTuiMenus default from kicking in.\n */\n readonly autoResponseRules: AutoResponseRule[] = [\n {\n pattern: /Add .+ to the chat\\?.*\\[y\\/n\\]/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: /Create new file.*\\[y\\/n\\]/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: /Apply.*changes.*\\[y\\/n\\]/i,\n type: 'permission',\n response: 'y',\n responseType: 'text',\n description: 'Apply proposed changes',\n safe: true,\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 default alias > let aider pick\n // Aliases (sonnet, 4o, gemini) are maintained by Aider and auto-update\n const provider = (config.adapterConfig as { provider?: string } | undefined)?.provider;\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 }\n // No provider preference → don't force a model, aider picks based on available keys\n\n // API keys via --api-key flag (no env vars needed)\n const credentials = this.getCredentials(config);\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 return { required: false };\n }\n\n detectBlockingPrompt(output: string): BlockingPromptDetection {\n const stripped = this.stripAnsi(output);\n\n // First check for login\n const loginDetection = this.detectLogin(output);\n if (loginDetection.required) {\n return {\n detected: true,\n type: 'login',\n prompt: loginDetection.instructions,\n canAutoRespond: false,\n instructions: loginDetection.instructions,\n };\n }\n\n // Aider-specific: 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 // Aider-specific: Git repo not found\n if (/not.*git.*repo|git.*not.*found|initialize.*git/i.test(stripped)) {\n return {\n detected: true,\n type: 'config',\n prompt: 'Git repository required',\n canAutoRespond: false,\n instructions: 'Aider requires a git repository. Run git init or use --no-git',\n };\n }\n\n // Aider-specific: Confirm file operations (that aren't auto-responded)\n if (/delete|remove|overwrite/i.test(stripped) && /\\[y\\/n\\]/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 return (\n stripped.includes('aider>') ||\n stripped.includes('Aider') ||\n /aider.*ready/i.test(stripped) ||\n // Aider shows file list when ready\n /Added.*to the chat/i.test(stripped) ||\n // Or the prompt\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 getPromptPattern(): RegExp {\n return /(?:aider>|>)\\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 } 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/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"],"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 { 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 * 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 * 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 * 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 } 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 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 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} from 'pty-manager';\nimport { BaseCodingAdapter, type InstallationInfo, type ModelRecommendations, type AgentCredentials } 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 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 // 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 // Gemini-specific: Tool execution confirmation (WriteFile, Shell, etc.)\n // Check BEFORE login — permission prompts contain \"API key\" banner text\n // that would otherwise false-positive the login detector.\n // TUI menu — use keys:enter to confirm\n if (/Apply this change\\?/i.test(stripped) || /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 // Gemini-specific: 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 // Gemini-specific: 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 // Gemini-specific: 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 // Specific ready indicators - avoid broad patterns like \"Gemini\" which\n // appears in banners alongside auth errors\n return (\n stripped.includes('Ready') ||\n stripped.includes('Type your message') ||\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 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 } 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 TUI menus (Ink/React) — rules use key sequences.\n */\n readonly autoResponseRules: AutoResponseRule[] = [\n {\n pattern: /Update (available|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: /trust.the.contents|trust.this.directory|do.you.trust/i,\n type: 'permission',\n response: '',\n responseType: 'keys',\n keys: ['enter'],\n description: 'Trust directory contents to allow Codex to operate',\n safe: true,\n once: true,\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 // Check for device code flow\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 */\n detectBlockingPrompt(output: string): BlockingPromptDetection {\n const stripped = this.stripAnsi(output);\n\n // First check for login\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 // OpenAI-specific: 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 // OpenAI-specific: 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 // OpenAI-specific: 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 return (\n stripped.includes('Codex') ||\n stripped.includes('Ready') ||\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 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 } 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 [y/n] prompts, NOT TUI menus.\n * Explicit responseType: 'text' prevents the usesTuiMenus default from kicking in.\n */\n readonly autoResponseRules: AutoResponseRule[] = [\n {\n pattern: /Add .+ to the chat\\?.*(\\[y\\/n\\]|\\[Yes\\]|\\(Y\\)es)/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: /Create new file.*(\\[y\\/n\\]|\\[Yes\\]|\\(Y\\)es)/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: /Apply.*changes.*(\\[y\\/n\\]|\\[Yes\\]|\\(Y\\)es)/i,\n type: 'permission',\n response: 'y',\n responseType: 'text',\n description: 'Apply proposed changes',\n safe: true,\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 default alias > let aider pick\n // Aliases (sonnet, 4o, gemini) are maintained by Aider and auto-update\n const provider = (config.adapterConfig as { provider?: string } | undefined)?.provider;\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 }\n // No provider preference → don't force a model, aider picks based on available keys\n\n // API keys via --api-key flag (no env vars needed)\n const credentials = this.getCredentials(config);\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 return { required: false };\n }\n\n detectBlockingPrompt(output: string): BlockingPromptDetection {\n const stripped = this.stripAnsi(output);\n\n // First check for login\n const loginDetection = this.detectLogin(output);\n if (loginDetection.required) {\n return {\n detected: true,\n type: 'login',\n prompt: loginDetection.instructions,\n canAutoRespond: false,\n instructions: loginDetection.instructions,\n };\n }\n\n // Aider-specific: 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 // Aider-specific: Git repo not found\n if (/not.*git.*repo|git.*not.*found|initialize.*git/i.test(stripped)) {\n return {\n detected: true,\n type: 'config',\n prompt: 'Git repository required',\n canAutoRespond: false,\n instructions: 'Aider requires a git repository. Run git init or use --no-git',\n };\n }\n\n // Aider-specific: Confirm file operations (that aren't auto-responded)\n if (/delete|remove|overwrite/i.test(stripped) && /\\[y\\/n\\]/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 return (\n stripped.includes('aider>') ||\n stripped.includes('Aider') ||\n /aider.*ready/i.test(stripped) ||\n // Aider shows file list when ready\n /Added.*to the chat/i.test(stripped) ||\n // Or the prompt\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 getPromptPattern(): RegExp {\n return /(?:aider>|>)\\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 } 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"]}
package/dist/index.js CHANGED
@@ -120,6 +120,16 @@ var ClaudeAdapter = class extends BaseCodingAdapter {
120
120
  * Explicit responseType: 'text' prevents the usesTuiMenus default from kicking in.
121
121
  */
122
122
  autoResponseRules = [
123
+ {
124
+ pattern: /trust.*folder|safety.?check|project.you.created/i,
125
+ type: "permission",
126
+ response: "",
127
+ responseType: "keys",
128
+ keys: ["enter"],
129
+ description: "Accept trust prompt for working directory",
130
+ safe: true,
131
+ once: true
132
+ },
123
133
  {
124
134
  pattern: /update available.*\[y\/n\]/i,
125
135
  type: "update",
@@ -285,8 +295,10 @@ var ClaudeAdapter = class extends BaseCodingAdapter {
285
295
  if (/trust.*directory|do you want to|needs? your permission/i.test(stripped)) {
286
296
  return false;
287
297
  }
288
- return stripped.includes("How can I help") || stripped.includes("What would you like") || // Match "claude> " or similar specific prompts, not bare ">"
289
- /claude>\s*$/i.test(stripped);
298
+ return stripped.includes("How can I help") || stripped.includes("What would you like") || // v2.1+ shows "for shortcuts" hint when ready
299
+ stripped.includes("for shortcuts") || // Match "claude> " or similar specific prompts, not bare ">"
300
+ /claude>\s*$/i.test(stripped) || // v2.1+ uses ❯ as the input prompt
301
+ /❯\s*$/.test(stripped);
290
302
  }
291
303
  parseOutput(output) {
292
304
  const stripped = this.stripAnsi(output);
@@ -497,13 +509,14 @@ var CodexAdapter = class extends BaseCodingAdapter {
497
509
  safe: true
498
510
  },
499
511
  {
500
- pattern: /trust the contents of this directory/i,
512
+ pattern: /trust.the.contents|trust.this.directory|do.you.trust/i,
501
513
  type: "permission",
502
514
  response: "",
503
515
  responseType: "keys",
504
516
  keys: ["enter"],
505
517
  description: "Trust directory contents to allow Codex to operate",
506
- safe: true
518
+ safe: true,
519
+ once: true
507
520
  }
508
521
  ];
509
522
  getRecommendedModels(_credentials) {
@@ -659,7 +672,7 @@ var AiderAdapter = class extends BaseCodingAdapter {
659
672
  */
660
673
  autoResponseRules = [
661
674
  {
662
- pattern: /Add .+ to the chat\?.*\[y\/n\]/i,
675
+ pattern: /Add .+ to the chat\?.*(\[y\/n\]|\[Yes\]|\(Y\)es)/i,
663
676
  type: "permission",
664
677
  response: "y",
665
678
  responseType: "text",
@@ -667,7 +680,7 @@ var AiderAdapter = class extends BaseCodingAdapter {
667
680
  safe: true
668
681
  },
669
682
  {
670
- pattern: /Create new file.*\[y\/n\]/i,
683
+ pattern: /Create new file.*(\[y\/n\]|\[Yes\]|\(Y\)es)/i,
671
684
  type: "permission",
672
685
  response: "y",
673
686
  responseType: "text",
@@ -675,7 +688,7 @@ var AiderAdapter = class extends BaseCodingAdapter {
675
688
  safe: true
676
689
  },
677
690
  {
678
- pattern: /Apply.*changes.*\[y\/n\]/i,
691
+ pattern: /Apply.*changes.*(\[y\/n\]|\[Yes\]|\(Y\)es)/i,
679
692
  type: "permission",
680
693
  response: "y",
681
694
  responseType: "text",
package/dist/index.js.map CHANGED
@@ -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":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Base Coding Agent Adapter\n *\n * Extends pty-manager's BaseCLIAdapter with credential handling\n * for AI coding agents.\n */\n\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 * 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 * 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 * 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 } 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: /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 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 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 // Match \"claude> \" or similar specific prompts, not bare \">\"\n /claude>\\s*$/i.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} from 'pty-manager';\nimport { BaseCodingAdapter, type InstallationInfo, type ModelRecommendations, type AgentCredentials } 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 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 // 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 // Gemini-specific: Tool execution confirmation (WriteFile, Shell, etc.)\n // Check BEFORE login — permission prompts contain \"API key\" banner text\n // that would otherwise false-positive the login detector.\n // TUI menu — use keys:enter to confirm\n if (/Apply this change\\?/i.test(stripped) || /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 // Gemini-specific: 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 // Gemini-specific: 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 // Gemini-specific: 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 // Specific ready indicators - avoid broad patterns like \"Gemini\" which\n // appears in banners alongside auth errors\n return (\n stripped.includes('Ready') ||\n stripped.includes('Type your message') ||\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 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 } 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 TUI menus (Ink/React) — rules use key sequences.\n */\n readonly autoResponseRules: AutoResponseRule[] = [\n {\n pattern: /Update (available|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: /trust the contents of this directory/i,\n type: 'permission',\n response: '',\n responseType: 'keys',\n keys: ['enter'],\n description: 'Trust directory contents to allow Codex to operate',\n safe: true,\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 // Check for device code flow\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 */\n detectBlockingPrompt(output: string): BlockingPromptDetection {\n const stripped = this.stripAnsi(output);\n\n // First check for login\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 // OpenAI-specific: 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 // OpenAI-specific: 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 // OpenAI-specific: 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 return (\n stripped.includes('Codex') ||\n stripped.includes('Ready') ||\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 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 } 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 [y/n] prompts, NOT TUI menus.\n * Explicit responseType: 'text' prevents the usesTuiMenus default from kicking in.\n */\n readonly autoResponseRules: AutoResponseRule[] = [\n {\n pattern: /Add .+ to the chat\\?.*\\[y\\/n\\]/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: /Create new file.*\\[y\\/n\\]/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: /Apply.*changes.*\\[y\\/n\\]/i,\n type: 'permission',\n response: 'y',\n responseType: 'text',\n description: 'Apply proposed changes',\n safe: true,\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 default alias > let aider pick\n // Aliases (sonnet, 4o, gemini) are maintained by Aider and auto-update\n const provider = (config.adapterConfig as { provider?: string } | undefined)?.provider;\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 }\n // No provider preference → don't force a model, aider picks based on available keys\n\n // API keys via --api-key flag (no env vars needed)\n const credentials = this.getCredentials(config);\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 return { required: false };\n }\n\n detectBlockingPrompt(output: string): BlockingPromptDetection {\n const stripped = this.stripAnsi(output);\n\n // First check for login\n const loginDetection = this.detectLogin(output);\n if (loginDetection.required) {\n return {\n detected: true,\n type: 'login',\n prompt: loginDetection.instructions,\n canAutoRespond: false,\n instructions: loginDetection.instructions,\n };\n }\n\n // Aider-specific: 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 // Aider-specific: Git repo not found\n if (/not.*git.*repo|git.*not.*found|initialize.*git/i.test(stripped)) {\n return {\n detected: true,\n type: 'config',\n prompt: 'Git repository required',\n canAutoRespond: false,\n instructions: 'Aider requires a git repository. Run git init or use --no-git',\n };\n }\n\n // Aider-specific: Confirm file operations (that aren't auto-responded)\n if (/delete|remove|overwrite/i.test(stripped) && /\\[y\\/n\\]/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 return (\n stripped.includes('aider>') ||\n stripped.includes('Aider') ||\n /aider.*ready/i.test(stripped) ||\n // Aider shows file list when ready\n /Added.*to the chat/i.test(stripped) ||\n // Or the prompt\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 getPromptPattern(): RegExp {\n return /(?:aider>|>)\\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 } 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/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":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Base Coding Agent Adapter\n *\n * Extends pty-manager's BaseCLIAdapter with credential handling\n * for AI coding agents.\n */\n\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 * 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 * 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 * 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 } 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 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 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} from 'pty-manager';\nimport { BaseCodingAdapter, type InstallationInfo, type ModelRecommendations, type AgentCredentials } 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 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 // 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 // Gemini-specific: Tool execution confirmation (WriteFile, Shell, etc.)\n // Check BEFORE login — permission prompts contain \"API key\" banner text\n // that would otherwise false-positive the login detector.\n // TUI menu — use keys:enter to confirm\n if (/Apply this change\\?/i.test(stripped) || /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 // Gemini-specific: 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 // Gemini-specific: 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 // Gemini-specific: 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 // Specific ready indicators - avoid broad patterns like \"Gemini\" which\n // appears in banners alongside auth errors\n return (\n stripped.includes('Ready') ||\n stripped.includes('Type your message') ||\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 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 } 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 TUI menus (Ink/React) — rules use key sequences.\n */\n readonly autoResponseRules: AutoResponseRule[] = [\n {\n pattern: /Update (available|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: /trust.the.contents|trust.this.directory|do.you.trust/i,\n type: 'permission',\n response: '',\n responseType: 'keys',\n keys: ['enter'],\n description: 'Trust directory contents to allow Codex to operate',\n safe: true,\n once: true,\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 // Check for device code flow\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 */\n detectBlockingPrompt(output: string): BlockingPromptDetection {\n const stripped = this.stripAnsi(output);\n\n // First check for login\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 // OpenAI-specific: 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 // OpenAI-specific: 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 // OpenAI-specific: 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 return (\n stripped.includes('Codex') ||\n stripped.includes('Ready') ||\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 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 } 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 [y/n] prompts, NOT TUI menus.\n * Explicit responseType: 'text' prevents the usesTuiMenus default from kicking in.\n */\n readonly autoResponseRules: AutoResponseRule[] = [\n {\n pattern: /Add .+ to the chat\\?.*(\\[y\\/n\\]|\\[Yes\\]|\\(Y\\)es)/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: /Create new file.*(\\[y\\/n\\]|\\[Yes\\]|\\(Y\\)es)/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: /Apply.*changes.*(\\[y\\/n\\]|\\[Yes\\]|\\(Y\\)es)/i,\n type: 'permission',\n response: 'y',\n responseType: 'text',\n description: 'Apply proposed changes',\n safe: true,\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 default alias > let aider pick\n // Aliases (sonnet, 4o, gemini) are maintained by Aider and auto-update\n const provider = (config.adapterConfig as { provider?: string } | undefined)?.provider;\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 }\n // No provider preference → don't force a model, aider picks based on available keys\n\n // API keys via --api-key flag (no env vars needed)\n const credentials = this.getCredentials(config);\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 return { required: false };\n }\n\n detectBlockingPrompt(output: string): BlockingPromptDetection {\n const stripped = this.stripAnsi(output);\n\n // First check for login\n const loginDetection = this.detectLogin(output);\n if (loginDetection.required) {\n return {\n detected: true,\n type: 'login',\n prompt: loginDetection.instructions,\n canAutoRespond: false,\n instructions: loginDetection.instructions,\n };\n }\n\n // Aider-specific: 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 // Aider-specific: Git repo not found\n if (/not.*git.*repo|git.*not.*found|initialize.*git/i.test(stripped)) {\n return {\n detected: true,\n type: 'config',\n prompt: 'Git repository required',\n canAutoRespond: false,\n instructions: 'Aider requires a git repository. Run git init or use --no-git',\n };\n }\n\n // Aider-specific: Confirm file operations (that aren't auto-responded)\n if (/delete|remove|overwrite/i.test(stripped) && /\\[y\\/n\\]/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 return (\n stripped.includes('aider>') ||\n stripped.includes('Aider') ||\n /aider.*ready/i.test(stripped) ||\n // Aider shows file list when ready\n /Added.*to the chat/i.test(stripped) ||\n // Or the prompt\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 getPromptPattern(): RegExp {\n return /(?:aider>|>)\\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 } 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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "coding-agent-adapters",
3
- "version": "0.2.11",
3
+ "version": "0.2.13",
4
4
  "description": "CLI adapters for AI coding agents - Claude Code, Gemini CLI, OpenAI Codex, and Aider",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -40,7 +40,7 @@
40
40
  "author": "Parallax",
41
41
  "license": "MIT",
42
42
  "peerDependencies": {
43
- "pty-manager": "^1.2.16",
43
+ "pty-manager": "^1.2.18",
44
44
  "agent-adapter-monitor": "^0.1.0"
45
45
  },
46
46
  "peerDependenciesMeta": {
@@ -53,7 +53,7 @@
53
53
  "tsup": "^8.0.0",
54
54
  "typescript": "^5.3.0",
55
55
  "vitest": "^1.0.0",
56
- "pty-manager": "1.2.16"
56
+ "pty-manager": "1.2.18"
57
57
  },
58
58
  "engines": {
59
59
  "node": ">=18.0.0"