coding-agent-adapters 0.2.5 → 0.2.7
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 +26 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +26 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -19,6 +19,16 @@ var BaseCodingAdapter = class extends ptyManager.BaseCLIAdapter {
|
|
|
19
19
|
const adapterConfig = config.adapterConfig;
|
|
20
20
|
return adapterConfig?.interactive === true;
|
|
21
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* Override stripAnsi to handle TUI cursor-forward codes.
|
|
24
|
+
* TUI CLIs (Claude Code, Gemini CLI) use \x1b[<n>C (cursor forward)
|
|
25
|
+
* instead of literal spaces for word positioning. Replace with spaces
|
|
26
|
+
* before stripping other ANSI codes so regex patterns can match.
|
|
27
|
+
*/
|
|
28
|
+
stripAnsi(str) {
|
|
29
|
+
const withSpaces = str.replace(/\x1b\[\d*C/g, " ");
|
|
30
|
+
return super.stripAnsi(withSpaces);
|
|
31
|
+
}
|
|
22
32
|
/**
|
|
23
33
|
* Override detectExit to include installation instructions
|
|
24
34
|
*/
|
|
@@ -490,6 +500,20 @@ var CodexAdapter = class extends BaseCodingAdapter {
|
|
|
490
500
|
response: "n",
|
|
491
501
|
description: "Decline beta features",
|
|
492
502
|
safe: true
|
|
503
|
+
},
|
|
504
|
+
{
|
|
505
|
+
pattern: /Update (available|now)|Skip until next version/i,
|
|
506
|
+
type: "config",
|
|
507
|
+
response: "2",
|
|
508
|
+
description: "Skip Codex CLI update prompt",
|
|
509
|
+
safe: true
|
|
510
|
+
},
|
|
511
|
+
{
|
|
512
|
+
pattern: /trust the contents of this directory/i,
|
|
513
|
+
type: "permission",
|
|
514
|
+
response: "y",
|
|
515
|
+
description: "Trust directory contents to allow Codex to operate",
|
|
516
|
+
safe: true
|
|
493
517
|
}
|
|
494
518
|
];
|
|
495
519
|
getRecommendedModels(_credentials) {
|
|
@@ -702,12 +726,12 @@ var AiderAdapter = class extends BaseCodingAdapter {
|
|
|
702
726
|
} else if (provider === "openai") {
|
|
703
727
|
args.push("--model", "4o");
|
|
704
728
|
} else if (provider === "google") {
|
|
705
|
-
args.push("--model", "gemini");
|
|
729
|
+
args.push("--model", "gemini/gemini-2.5-pro");
|
|
706
730
|
}
|
|
707
731
|
const credentials = this.getCredentials(config);
|
|
708
732
|
if (credentials.anthropicKey) args.push("--api-key", `anthropic=${credentials.anthropicKey}`);
|
|
709
733
|
if (credentials.openaiKey) args.push("--api-key", `openai=${credentials.openaiKey}`);
|
|
710
|
-
if (credentials.googleKey) args.push("--api-key", `
|
|
734
|
+
if (credentials.googleKey) args.push("--api-key", `gemini=${credentials.googleKey}`);
|
|
711
735
|
return args;
|
|
712
736
|
}
|
|
713
737
|
getEnv(config) {
|
package/dist/index.cjs.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":["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 * 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 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 prompts that can be safely auto-responded.\n */\n readonly autoResponseRules: AutoResponseRule[] = [\n {\n pattern: /update available.*\\[y\\/n\\]/i,\n type: 'update',\n response: 'n',\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 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 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 description: 'Decline anonymous usage data',\n safe: true,\n },\n {\n pattern: /continue without.*\\[y\\/n\\]/i,\n type: 'config',\n response: 'y',\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\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 canAutoRespond: false,\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 // Claude Code shows a prompt when ready\n // Avoid overly broad patterns that could match during auth\n return (\n stripped.includes('Claude Code') ||\n stripped.includes('How can I help') ||\n stripped.includes('What would you like') ||\n stripped.includes('Ready') ||\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-2.5-pro',\n fast: 'gemini-2.5-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 // 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 // Gemini-specific: Tool execution confirmation (WriteFile, Shell, etc.)\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 canAutoRespond: false,\n instructions: 'Gemini is asking to apply a change (file write, shell command, etc.)',\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 */\n readonly autoResponseRules: AutoResponseRule[] = [\n {\n pattern: /update available.*\\[y\\/n\\]/i,\n type: 'update',\n response: 'n',\n description: 'Decline Codex update to continue execution',\n safe: true,\n },\n {\n pattern: /new version.*\\[y\\/n\\]/i,\n type: 'update',\n response: 'n',\n description: 'Decline version upgrade',\n safe: true,\n },\n {\n pattern: /send.*telemetry.*\\[y\\/n\\]/i,\n type: 'config',\n response: 'n',\n description: 'Decline telemetry',\n safe: true,\n },\n {\n pattern: /enable.*beta.*features.*\\[y\\/n\\]/i,\n type: 'config',\n response: 'n',\n description: 'Decline beta features',\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 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 */\n readonly autoResponseRules: AutoResponseRule[] = [\n {\n pattern: /Add .+ to the chat\\?.*\\[y\\/n\\]/i,\n type: 'permission',\n response: 'y',\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 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 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-2.5-pro',\n fast: 'gemini/gemini-2.5-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', `google=${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":";;;;;AAmEO,IAAe,iBAAA,GAAf,cAAyCA,yBAAA,CAAe;AAAA;AAAA;AAAA;AAAA,EASnD,eAAe,MAAA,EAAuC;AAC9D,IAAA,MAAM,gBAAgB,MAAA,CAAO,aAAA;AAC7B,IAAA,OAAO,iBAAiB,EAAC;AAAA;AAC3B;AAAA;AAAA;AAAA;AAAA,EAMU,cAAc,MAAA,EAA8B;AACpD,IAAA,MAAM,gBAAgB,MAAA,CAAO,aAAA;AAC7B,IAAA,OAAO,eAAe,WAAA,KAAgB,IAAA;AAAA;AACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcU,UAAU,GAAA,EAAqB;AACvC,IAAA,MAAM,UAAA,GAAa,GAAA,CAAI,OAAA,CAAQ,aAAA,EAAe,GAAG,CAAA;AACjD,IAAA,OAAO,KAAA,CAAM,UAAU,UAAU,CAAA;AAAA;AACnC;AAAA;AAAA;AAAA,EAKA,WAAW,MAAA,EAAoE;AAC7E,IAAA,IAAI,OAAO,QAAA,CAAS,mBAAmB,KAAK,MAAA,CAAO,QAAA,CAAS,mBAAmB,CAAA,EAAG;AAChF,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,IAAA;AAAA,QACR,IAAA,EAAM,GAAA;AAAA,QACN,OAAO,CAAA,EAAG,IAAA,CAAK,WAAW,CAAA,8BAAA,EAAiC,IAAA,CAAK,aAAa,OAAO;AAAA,MAAA,EAAW,IAAA,CAAK,aAAa,OAAO,CAAA;AAAA,OAC1H;AAAA;AAGF,IAAA,OAAO,KAAA,CAAM,WAAW,MAAM,CAAA;AAAA;AAChC;AAAA;AAAA;AAAA,EAKA,sBAAA,GAAiC;AAC/B,IAAA,MAAM,KAAA,GAAQ;AAAA,MACZ,CAAA,EAAG,KAAK,WAAW,CAAA,aAAA,CAAA;AAAA,MACnB,GAAG,GAAA,CAAI,MAAA,CAAO,KAAK,WAAA,CAAY,MAAA,GAAS,EAAE,CAAC,CAAA,CAAA;AAAA,MAC3C,EAAA;AAAA,MACA,CAAA,SAAA,EAAY,IAAA,CAAK,YAAA,CAAa,OAAO,CAAA;AAAA,KACvC;AAEA,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,YAAA,EAAc,MAAA,EAAQ;AAC1C,MAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,MAAA,KAAA,CAAM,KAAK,eAAe,CAAA;AAC1B,MAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,YAAA,CAAa,YAAA,EAAc;AAChD,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,IAAA,EAAO,GAAG,CAAA,CAAE,CAAA;AAAA;AACzB;AAGF,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,MAAA,EAAS,IAAA,CAAK,YAAA,CAAa,OAAO,CAAA,CAAE,CAAA;AAE/C,IAAA,IAAI,IAAA,CAAK,aAAa,UAAA,EAAY;AAChC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,iBAAA,EAAoB,IAAA,CAAK,YAAA,CAAa,UAAU,CAAA,CAAE,CAAA;AAAA;AAG/D,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA;AACxB;AAAA;AAAA;AAAA,EAKU,mBAAmB,MAAA,EAAyB;AACpD,IAAA,MAAM,oBAAA,GAAuB;AAAA,MAC3B,SAAA;AAAA;AAAA,MACA,QAAA;AAAA;AAAA,MACA,SAAA;AAAA;AAAA,MACA,YAAA;AAAA;AAAA,MACA,WAAA;AAAA;AAAA,MACA;AAAA;AAAA,KACF;AAEA,IAAA,OAAO,qBAAqB,IAAA,CAAK,CAAC,YAAY,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA;AACpE;AAAA;AAAA;AAAA,EAKU,cAAA,CAAe,QAAgB,aAAA,EAA+B;AACtE,IAAA,IAAI,OAAA,GAAU,MAAA;AAGd,IAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,aAAA,EAAe,EAAE,CAAA;AAG3C,IAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,iEAAA,EAAmE,EAAE,CAAA;AAG/F,IAAA,OAAA,GAAU,QAAQ,IAAA,EAAK;AAEvB,IAAA,OAAO,OAAA;AAAA;AAEX;;;ACzKO,IAAM,aAAA,GAAN,cAA4B,iBAAA,CAAkB;AAAA,EAC1C,WAAA,GAAc,QAAA;AAAA,EACd,WAAA,GAAc,aAAA;AAAA,EAEd,YAAA,GAAiC;AAAA,IACxC,OAAA,EAAS,0CAAA;AAAA,IACT,YAAA,EAAc;AAAA,MACZ,wDAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,OAAA,EAAS,gDAAA;AAAA,IACT,UAAA,EAAY;AAAA,GACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMS,iBAAA,GAAwC;AAAA,IAC/C;AAAA,MACE,OAAA,EAAS,6BAAA;AAAA,MACT,IAAA,EAAM,QAAA;AAAA,MACN,QAAA,EAAU,GAAA;AAAA,MACV,WAAA,EAAa,kDAAA;AAAA,MACb,IAAA,EAAM;AAAA,KACR;AAAA,IACA;AAAA,MACE,OAAA,EAAS,mCAAA;AAAA,MACT,IAAA,EAAM,QAAA;AAAA,MACN,QAAA,EAAU,GAAA;AAAA,MACV,WAAA,EAAa,gCAAA;AAAA,MACb,IAAA,EAAM;AAAA,KACR;AAAA,IACA;AAAA,MACE,OAAA,EAAS,gDAAA;AAAA,MACT,IAAA,EAAM,QAAA;AAAA,MACN,QAAA,EAAU,GAAA;AAAA,MACV,WAAA,EAAa,0BAAA;AAAA,MACb,IAAA,EAAM;AAAA,KACR;AAAA,IACA;AAAA,MACE,OAAA,EAAS,sCAAA;AAAA,MACT,IAAA,EAAM,QAAA;AAAA,MACN,QAAA,EAAU,GAAA;AAAA,MACV,WAAA,EAAa,8BAAA;AAAA,MACb,IAAA,EAAM;AAAA,KACR;AAAA,IACA;AAAA,MACE,OAAA,EAAS,6BAAA;AAAA,MACT,IAAA,EAAM,QAAA;AAAA,MACN,QAAA,EAAU,GAAA;AAAA,MACV,WAAA,EAAa,mCAAA;AAAA,MACb,IAAA,EAAM;AAAA;AACR,GACF;AAAA,EAEA,qBAAqB,YAAA,EAAuD;AAC1E,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,0BAAA;AAAA,MACV,IAAA,EAAM;AAAA,KACR;AAAA;AACF,EAEA,UAAA,GAAqB;AACnB,IAAA,OAAO,QAAA;AAAA;AACT,EAEA,QAAQ,MAAA,EAA+B;AACrC,IAAA,MAAM,OAAiB,EAAC;AAGxB,IAAA,IAAI,CAAC,IAAA,CAAK,aAAA,CAAc,MAAM,CAAA,EAAG;AAC/B,MAAA,IAAA,CAAK,KAAK,SAAS,CAAA;AAInB,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,MAAA,CAAO,OAAO,CAAA;AAAA;AACnC;AAGF,IAAA,OAAO,IAAA;AAAA;AACT,EAEA,OAAO,MAAA,EAA6C;AAClD,IAAA,MAAM,MAA8B,EAAC;AACrC,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,cAAA,CAAe,MAAM,CAAA;AAG9C,IAAA,IAAI,YAAY,YAAA,EAAc;AAC5B,MAAA,GAAA,CAAI,oBAAoB,WAAA,CAAY,YAAA;AAAA;AAItC,IAAA,IAAI,MAAA,CAAO,KAAK,eAAA,EAAiB;AAC/B,MAAA,GAAA,CAAI,eAAA,GAAkB,OAAO,GAAA,CAAI,eAAA;AAAA;AAInC,IAAA,IAAI,CAAC,IAAA,CAAK,aAAA,CAAc,MAAM,CAAA,EAAG;AAC/B,MAAA,GAAA,CAAI,+BAAA,GAAkC,MAAA;AAAA;AAGxC,IAAA,OAAO,GAAA;AAAA;AACT,EAEA,YAAY,MAAA,EAAgC;AAC1C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAGtC,IAAA,IACE,SAAS,QAAA,CAAS,mBAAmB,KACrC,QAAA,CAAS,QAAA,CAAS,mBAAmB,CAAA,IACrC,QAAA,CAAS,SAAS,yBAAyB,CAAA,IAC3C,SAAS,QAAA,CAAS,gBAAgB,KAClC,QAAA,CAAS,QAAA,CAAS,iBAAiB,CAAA,EACnC;AACA,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM,SAAA;AAAA,QACN,YAAA,EAAc;AAAA,OAChB;AAAA;AAIF,IAAA,IACE,SAAS,QAAA,CAAS,eAAe,KACjC,QAAA,CAAS,QAAA,CAAS,yBAAyB,CAAA,EAC3C;AACA,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,KAAA,CAAM,mBAAmB,CAAA;AACnD,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM,SAAA;AAAA,QACN,GAAA,EAAK,QAAA,GAAW,QAAA,CAAS,CAAC,CAAA,GAAI,MAAA;AAAA,QAC9B,YAAA,EAAc;AAAA,OAChB;AAAA;AAGF,IAAA,OAAO,EAAE,UAAU,KAAA,EAAM;AAAA;AAC3B;AAAA;AAAA;AAAA,EAKA,qBAAqB,MAAA,EAAyC;AAC5D,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAGtC,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA;AAC9C,IAAA,IAAI,eAAe,QAAA,EAAU;AAC3B,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM,OAAA;AAAA,QACN,QAAQ,cAAA,CAAe,YAAA;AAAA,QACvB,KAAK,cAAA,CAAe,GAAA;AAAA,QACpB,cAAA,EAAgB,KAAA;AAAA,QAChB,cAAc,cAAA,CAAe;AAAA,OAC/B;AAAA;AAIF,IAAA,IAAI,iEAAA,CAAkE,IAAA,CAAK,QAAQ,CAAA,EAAG;AACpF,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM,YAAA;AAAA,QACN,MAAA,EAAQ,wBAAA;AAAA,QACR,cAAA,EAAgB,KAAA;AAAA,QAChB,YAAA,EAAc;AAAA,OAChB;AAAA;AAIF,IAAA,IAAI,gDAAgD,IAAA,CAAK,QAAQ,KAC7D,gBAAA,CAAiB,IAAA,CAAK,QAAQ,CAAA,EAAG;AACnC,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM,cAAA;AAAA,QACN,MAAA,EAAQ,wBAAA;AAAA,QACR,cAAA,EAAgB,KAAA;AAAA,QAChB,YAAA,EAAc;AAAA,OAChB;AAAA;AAIF,IAAA,IAAI,qCAAA,CAAsC,IAAA,CAAK,QAAQ,CAAA,EAAG;AACxD,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,MAAA,EAAQ,oBAAA;AAAA,QACR,cAAA,EAAgB,KAAA;AAAA,QAChB,YAAA,EAAc;AAAA,OAChB;AAAA;AAIF,IAAA,IAAI,2DAAA,CAA4D,IAAA,CAAK,QAAQ,CAAA,EAAG;AAC9E,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,MAAA,EAAQ,kBAAA;AAAA,QACR,cAAA,EAAgB,KAAA;AAAA,QAChB,YAAA,EAAc;AAAA,OAChB;AAAA;AAIF,IAAA,IAAI,sDAAsD,IAAA,CAAK,QAAQ,KACnE,WAAA,CAAY,IAAA,CAAK,QAAQ,CAAA,EAAG;AAC9B,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM,YAAA;AAAA,QACN,MAAA,EAAQ,kCAAA;AAAA,QACR,OAAA,EAAS,CAAC,GAAA,EAAK,GAAG,CAAA;AAAA,QAClB,iBAAA,EAAmB,GAAA;AAAA,QACnB,cAAA,EAAgB,IAAA;AAAA,QAChB,YAAA,EAAc;AAAA,OAChB;AAAA;AAIF,IAAA,OAAO,KAAA,CAAM,qBAAqB,MAAM,CAAA;AAAA;AAC1C,EAEA,YAAY,MAAA,EAAyB;AACnC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAItC,IAAA,OACE,QAAA,CAAS,QAAA,CAAS,aAAa,CAAA,IAC/B,SAAS,QAAA,CAAS,gBAAgB,CAAA,IAClC,QAAA,CAAS,QAAA,CAAS,qBAAqB,CAAA,IACvC,QAAA,CAAS,SAAS,OAAO,CAAA;AAAA,IAEzB,cAAA,CAAe,KAAK,QAAQ,CAAA;AAAA;AAEhC,EAEA,YAAY,MAAA,EAAqC;AAC/C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAGtC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,kBAAA,CAAmB,QAAQ,CAAA;AAEnD,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,OAAO,IAAA;AAAA;AAIT,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,gBAAA,CAAiB,QAAQ,CAAA;AAGjD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,QAAA,EAAU,WAAW,CAAA;AAEzD,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,aAAa,UAAA,GAAa,UAAA;AAAA,MAChC,OAAA;AAAA,MACA,UAAA,EAAY,IAAA;AAAA,MACZ,UAAA;AAAA,MACA,QAAA,EAAU;AAAA,QACR,GAAA,EAAK;AAAA;AACP,KACF;AAAA;AACF,EAEA,gBAAA,GAA2B;AAGzB,IAAA,OAAO,cAAA;AAAA;AACT,EAEA,qBAAA,GAAgC;AAC9B,IAAA,OAAO,kBAAA;AAAA;AAEX;;;ACnRO,IAAM,aAAA,GAAN,cAA4B,iBAAA,CAAkB;AAAA,EAC1C,WAAA,GAAc,QAAA;AAAA,EACd,WAAA,GAAc,eAAA;AAAA,EAEd,YAAA,GAAiC;AAAA,IACxC,OAAA,EAAS,uCAAA;AAAA,IACT,YAAA,EAAc;AAAA,MACZ;AAAA,KACF;AAAA,IACA,OAAA,EAAS;AAAA,GACX;AAAA,EAEA,qBAAqB,YAAA,EAAuD;AAC1E,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,gBAAA;AAAA,MACV,IAAA,EAAM;AAAA,KACR;AAAA;AACF,EAEA,UAAA,GAAqB;AACnB,IAAA,OAAO,QAAA;AAAA;AACT,EAEA,QAAQ,MAAA,EAA+B;AACrC,IAAA,MAAM,OAAiB,EAAC;AAGxB,IAAA,IAAI,CAAC,IAAA,CAAK,aAAA,CAAc,MAAM,CAAA,EAAG;AAC/B,MAAA,IAAA,CAAK,KAAK,mBAAmB,CAAA;AAE7B,MAAA,IAAA,CAAK,IAAA,CAAK,mBAAmB,MAAM,CAAA;AAInC,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,MAAA,CAAO,OAAO,CAAA;AAAA;AACnC;AAGF,IAAA,OAAO,IAAA;AAAA;AACT,EAEA,OAAO,MAAA,EAA6C;AAClD,IAAA,MAAM,MAA8B,EAAC;AACrC,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,cAAA,CAAe,MAAM,CAAA;AAG9C,IAAA,IAAI,YAAY,SAAA,EAAW;AACzB,MAAA,GAAA,CAAI,iBAAiB,WAAA,CAAY,SAAA;AACjC,MAAA,GAAA,CAAI,iBAAiB,WAAA,CAAY,SAAA;AAAA;AAInC,IAAA,IAAI,MAAA,CAAO,KAAK,YAAA,EAAc;AAC5B,MAAA,GAAA,CAAI,YAAA,GAAe,OAAO,GAAA,CAAI,YAAA;AAAA;AAIhC,IAAA,IAAI,CAAC,IAAA,CAAK,aAAA,CAAc,MAAM,CAAA,EAAG;AAC/B,MAAA,GAAA,CAAI,QAAA,GAAW,GAAA;AAAA;AAGjB,IAAA,OAAO,GAAA;AAAA;AACT,EAEA,YAAY,MAAA,EAAgC;AAC1C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAGtC,IAAA,IACE,QAAA,CAAS,SAAS,mBAAmB,CAAA,IACrC,SAAS,QAAA,CAAS,gBAAgB,CAAA,IAClC,QAAA,CAAS,QAAA,CAAS,gBAAgB,KAClC,QAAA,CAAS,QAAA,CAAS,yBAAyB,CAAA,IAC3C,QAAA,CAAS,QAAA,CAAS,iBAAiB,CAAA,IACnC,QAAA,CAAS,QAAA,CAAS,sBAAsB,CAAA,EACxC;AACA,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM,SAAA;AAAA,QACN,YAAA,EAAc;AAAA,OAChB;AAAA;AAIF,IAAA,IACE,QAAA,CAAS,QAAA,CAAS,qBAAqB,CAAA,IACvC,QAAA,CAAS,QAAA,CAAS,OAAO,CAAA,IACzB,QAAA,CAAS,QAAA,CAAS,qBAAqB,CAAA,EACvC;AACA,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,KAAA,CAAM,mBAAmB,CAAA;AACnD,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM,OAAA;AAAA,QACN,GAAA,EAAK,QAAA,GAAW,QAAA,CAAS,CAAC,CAAA,GAAI,6BAAA;AAAA,QAC9B,YAAA,EAAc;AAAA,OAChB;AAAA;AAIF,IAAA,IACE,SAAS,QAAA,CAAS,iCAAiC,KACnD,QAAA,CAAS,QAAA,CAAS,aAAa,CAAA,EAC/B;AACA,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM,SAAA;AAAA,QACN,YAAA,EAAc;AAAA,OAChB;AAAA;AAGF,IAAA,OAAO,EAAE,UAAU,KAAA,EAAM;AAAA;AAC3B,EAEA,qBAAqB,MAAA,EAAyC;AAC5D,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAGtC,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA;AAC9C,IAAA,IAAI,eAAe,QAAA,EAAU;AAC3B,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM,OAAA;AAAA,QACN,QAAQ,cAAA,CAAe,YAAA;AAAA,QACvB,KAAK,cAAA,CAAe,GAAA;AAAA,QACpB,cAAA,EAAgB,KAAA;AAAA,QAChB,cAAc,cAAA,CAAe;AAAA,OAC/B;AAAA;AAIF,IAAA,IAAI,uBAAuB,IAAA,CAAK,QAAQ,KAAK,gCAAA,CAAiC,IAAA,CAAK,QAAQ,CAAA,EAAG;AAC5F,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM,YAAA;AAAA,QACN,MAAA,EAAQ,oCAAA;AAAA,QACR,cAAA,EAAgB,KAAA;AAAA,QAChB,YAAA,EAAc;AAAA,OAChB;AAAA;AAIF,IAAA,IAAI,uCAAuC,IAAA,CAAK,QAAQ,KACpD,QAAA,CAAS,IAAA,CAAK,QAAQ,CAAA,EAAG;AAC3B,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM,cAAA;AAAA,QACN,MAAA,EAAQ,wBAAA;AAAA,QACR,cAAA,EAAgB,KAAA;AAAA,QAChB,YAAA,EAAc;AAAA,OAChB;AAAA;AAIF,IAAA,IAAI,uDAAA,CAAwD,IAAA,CAAK,QAAQ,CAAA,EAAG;AAC1E,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM,gBAAA;AAAA,QACN,MAAA,EAAQ,gCAAA;AAAA,QACR,cAAA,EAAgB,KAAA;AAAA,QAChB,YAAA,EAAc;AAAA,OAChB;AAAA;AAIF,IAAA,IAAI,kDAAA,CAAmD,IAAA,CAAK,QAAQ,CAAA,EAAG;AACrE,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM,SAAA;AAAA,QACN,MAAA,EAAQ,yBAAA;AAAA,QACR,cAAA,EAAgB,KAAA;AAAA,QAChB,YAAA,EAAc;AAAA,OAChB;AAAA;AAIF,IAAA,OAAO,KAAA,CAAM,qBAAqB,MAAM,CAAA;AAAA;AAC1C,EAEA,YAAY,MAAA,EAAyB;AACnC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAItC,IAAA,OACE,QAAA,CAAS,QAAA,CAAS,OAAO,CAAA,IACzB,SAAS,QAAA,CAAS,mBAAmB,CAAA,IACrC,QAAA,CAAS,QAAA,CAAS,gBAAgB,CAAA,IAClC,QAAA,CAAS,SAAS,qBAAqB,CAAA;AAAA,IAEvC,cAAA,CAAe,KAAK,QAAQ,CAAA;AAAA;AAEhC,EAEA,YAAY,MAAA,EAAqC;AAC/C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAEtC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,kBAAA,CAAmB,QAAQ,CAAA;AAEnD,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,OAAO,IAAA;AAAA;AAGT,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,gBAAA,CAAiB,QAAQ,CAAA;AAGjD,IAAA,IAAI,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,QAAA,EAAU,uBAAuB,CAAA;AACnE,IAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,wBAAA,EAA0B,EAAE,CAAA;AAEtD,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,aAAa,UAAA,GAAa,UAAA;AAAA,MAChC,OAAA;AAAA,MACA,UAAA,EAAY,IAAA;AAAA,MACZ,UAAA;AAAA,MACA,QAAA,EAAU;AAAA,QACR,GAAA,EAAK;AAAA;AACP,KACF;AAAA;AACF,EAEA,gBAAA,GAA2B;AAEzB,IAAA,OAAO,cAAA;AAAA;AACT,EAEA,qBAAA,GAAgC;AAC9B,IAAA,OAAO,kBAAA;AAAA;AAEX;;;ACnOO,IAAM,YAAA,GAAN,cAA2B,iBAAA,CAAkB;AAAA,EACzC,WAAA,GAAc,OAAA;AAAA,EACd,WAAA,GAAc,cAAA;AAAA,EAEd,YAAA,GAAiC;AAAA,IACxC,OAAA,EAAS,8BAAA;AAAA,IACT,YAAA,EAAc;AAAA,MACZ;AAAA,KACF;AAAA,IACA,OAAA,EAAS;AAAA,GACX;AAAA;AAAA;AAAA;AAAA,EAKS,iBAAA,GAAwC;AAAA,IAC/C;AAAA,MACE,OAAA,EAAS,6BAAA;AAAA,MACT,IAAA,EAAM,QAAA;AAAA,MACN,QAAA,EAAU,GAAA;AAAA,MACV,WAAA,EAAa,4CAAA;AAAA,MACb,IAAA,EAAM;AAAA,KACR;AAAA,IACA;AAAA,MACE,OAAA,EAAS,wBAAA;AAAA,MACT,IAAA,EAAM,QAAA;AAAA,MACN,QAAA,EAAU,GAAA;AAAA,MACV,WAAA,EAAa,yBAAA;AAAA,MACb,IAAA,EAAM;AAAA,KACR;AAAA,IACA;AAAA,MACE,OAAA,EAAS,4BAAA;AAAA,MACT,IAAA,EAAM,QAAA;AAAA,MACN,QAAA,EAAU,GAAA;AAAA,MACV,WAAA,EAAa,mBAAA;AAAA,MACb,IAAA,EAAM;AAAA,KACR;AAAA,IACA;AAAA,MACE,OAAA,EAAS,mCAAA;AAAA,MACT,IAAA,EAAM,QAAA;AAAA,MACN,QAAA,EAAU,GAAA;AAAA,MACV,WAAA,EAAa,uBAAA;AAAA,MACb,IAAA,EAAM;AAAA,KACR;AAAA,IACA;AAAA,MACE,OAAA,EAAS,iDAAA;AAAA,MACT,IAAA,EAAM,QAAA;AAAA,MACN,QAAA,EAAU,GAAA;AAAA,MACV,WAAA,EAAa,8BAAA;AAAA,MACb,IAAA,EAAM;AAAA,KACR;AAAA,IACA;AAAA,MACE,OAAA,EAAS,uCAAA;AAAA,MACT,IAAA,EAAM,YAAA;AAAA,MACN,QAAA,EAAU,GAAA;AAAA,MACV,WAAA,EAAa,oDAAA;AAAA,MACb,IAAA,EAAM;AAAA;AACR,GACF;AAAA,EAEA,qBAAqB,YAAA,EAAuD;AAC1E,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,IAAA;AAAA,MACV,IAAA,EAAM;AAAA,KACR;AAAA;AACF,EAEA,UAAA,GAAqB;AACnB,IAAA,OAAO,OAAA;AAAA;AACT,EAEA,QAAQ,MAAA,EAA+B;AACrC,IAAA,MAAM,OAAiB,EAAC;AAGxB,IAAA,IAAI,CAAC,IAAA,CAAK,aAAA,CAAc,MAAM,CAAA,EAAG;AAC/B,MAAA,IAAA,CAAK,KAAK,SAAS,CAAA;AAInB,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,MAAA,CAAO,OAAO,CAAA;AAAA;AACnC;AAGF,IAAA,OAAO,IAAA;AAAA;AACT,EAEA,OAAO,MAAA,EAA6C;AAClD,IAAA,MAAM,MAA8B,EAAC;AACrC,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,cAAA,CAAe,MAAM,CAAA;AAG9C,IAAA,IAAI,YAAY,SAAA,EAAW;AACzB,MAAA,GAAA,CAAI,iBAAiB,WAAA,CAAY,SAAA;AAAA;AAInC,IAAA,IAAI,MAAA,CAAO,KAAK,YAAA,EAAc;AAC5B,MAAA,GAAA,CAAI,YAAA,GAAe,OAAO,GAAA,CAAI,YAAA;AAAA;AAIhC,IAAA,IAAI,CAAC,IAAA,CAAK,aAAA,CAAc,MAAM,CAAA,EAAG;AAC/B,MAAA,GAAA,CAAI,QAAA,GAAW,GAAA;AAAA;AAGjB,IAAA,OAAO,GAAA;AAAA;AACT,EAEA,YAAY,MAAA,EAAgC;AAC1C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAGtC,IAAA,IACE,QAAA,CAAS,SAAS,mBAAmB,CAAA,IACrC,SAAS,QAAA,CAAS,gBAAgB,CAAA,IAClC,QAAA,CAAS,QAAA,CAAS,yBAAyB,KAC3C,QAAA,CAAS,QAAA,CAAS,iBAAiB,CAAA,IACnC,QAAA,CAAS,QAAA,CAAS,cAAc,CAAA,IAChC,QAAA,CAAS,QAAA,CAAS,oBAAoB,CAAA,EACtC;AACA,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM,SAAA;AAAA,QACN,YAAA,EAAc;AAAA,OAChB;AAAA;AAIF,IAAA,IAAI,SAAS,QAAA,CAAS,aAAa,KAAK,QAAA,CAAS,QAAA,CAAS,gBAAgB,CAAA,EAAG;AAC3E,MAAA,MAAM,SAAA,GAAY,QAAA,CAAS,KAAA,CAAM,yBAAyB,CAAA;AAC1D,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,KAAA,CAAM,mBAAmB,CAAA;AACnD,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM,aAAA;AAAA,QACN,GAAA,EAAK,QAAA,GAAW,QAAA,CAAS,CAAC,CAAA,GAAI,MAAA;AAAA,QAC9B,cAAc,SAAA,GACV,CAAA,WAAA,EAAc,SAAA,CAAU,CAAC,CAAC,CAAA,WAAA,CAAA,GAC1B;AAAA,OACN;AAAA;AAGF,IAAA,OAAO,EAAE,UAAU,KAAA,EAAM;AAAA;AAC3B;AAAA;AAAA;AAAA,EAKA,qBAAqB,MAAA,EAAyC;AAC5D,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAGtC,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA;AAC9C,IAAA,IAAI,eAAe,QAAA,EAAU;AAC3B,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM,OAAA;AAAA,QACN,QAAQ,cAAA,CAAe,YAAA;AAAA,QACvB,KAAK,cAAA,CAAe,GAAA;AAAA,QACpB,cAAA,EAAgB,KAAA;AAAA,QAChB,cAAc,cAAA,CAAe;AAAA,OAC/B;AAAA;AAIF,IAAA,IAAI,8CAA8C,IAAA,CAAK,QAAQ,KAC3D,QAAA,CAAS,IAAA,CAAK,QAAQ,CAAA,EAAG;AAC3B,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM,cAAA;AAAA,QACN,MAAA,EAAQ,wBAAA;AAAA,QACR,cAAA,EAAgB,KAAA;AAAA,QAChB,YAAA,EAAc;AAAA,OAChB;AAAA;AAIF,IAAA,IAAI,0DAAA,CAA2D,IAAA,CAAK,QAAQ,CAAA,EAAG;AAC7E,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,MAAA,EAAQ,wBAAA;AAAA,QACR,cAAA,EAAgB,KAAA;AAAA,QAChB,YAAA,EAAc;AAAA,OAChB;AAAA;AAIF,IAAA,IAAI,gCAAgC,IAAA,CAAK,QAAQ,KAC7C,aAAA,CAAc,IAAA,CAAK,QAAQ,CAAA,EAAG;AAChC,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM,SAAA;AAAA,QACN,MAAA,EAAQ,oBAAA;AAAA,QACR,cAAA,EAAgB,KAAA;AAAA,QAChB,YAAA,EAAc;AAAA,OAChB;AAAA;AAIF,IAAA,OAAO,KAAA,CAAM,qBAAqB,MAAM,CAAA;AAAA;AAC1C,EAEA,YAAY,MAAA,EAAyB;AACnC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAEtC,IAAA,OACE,QAAA,CAAS,QAAA,CAAS,OAAO,CAAA,IACzB,SAAS,QAAA,CAAS,OAAO,CAAA,IACzB,QAAA,CAAS,QAAA,CAAS,gBAAgB,CAAA,IAClC,kBAAA,CAAmB,KAAK,QAAQ,CAAA;AAAA;AAEpC,EAEA,YAAY,MAAA,EAAqC;AAC/C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAEtC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,kBAAA,CAAmB,QAAQ,CAAA;AAEnD,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,OAAO,IAAA;AAAA;AAGT,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,gBAAA,CAAiB,QAAQ,CAAA;AACjD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,QAAA,EAAU,sBAAsB,CAAA;AAEpE,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,aAAa,UAAA,GAAa,UAAA;AAAA,MAChC,OAAA;AAAA,MACA,UAAA,EAAY,IAAA;AAAA,MACZ,UAAA;AAAA,MACA,QAAA,EAAU;AAAA,QACR,GAAA,EAAK;AAAA;AACP,KACF;AAAA;AACF,EAEA,gBAAA,GAA2B;AACzB,IAAA,OAAO,kBAAA;AAAA;AACT,EAEA,qBAAA,GAAgC;AAC9B,IAAA,OAAO,iBAAA;AAAA;AAEX;;;ACpPO,IAAM,YAAA,GAAN,cAA2B,iBAAA,CAAkB;AAAA,EACzC,WAAA,GAAc,OAAA;AAAA,EACd,WAAA,GAAc,OAAA;AAAA,EAEd,YAAA,GAAiC;AAAA,IACxC,OAAA,EAAS,wBAAA;AAAA,IACT,YAAA,EAAc;AAAA,MACZ,4CAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,OAAA,EAAS,sCAAA;AAAA,IACT,UAAA,EAAY;AAAA,GACd;AAAA;AAAA;AAAA;AAAA,EAKS,iBAAA,GAAwC;AAAA,IAC/C;AAAA,MACE,OAAA,EAAS,iCAAA;AAAA,MACT,IAAA,EAAM,YAAA;AAAA,MACN,QAAA,EAAU,GAAA;AAAA,MACV,WAAA,EAAa,0CAAA;AAAA,MACb,IAAA,EAAM;AAAA,KACR;AAAA,IACA;AAAA,MACE,OAAA,EAAS,4BAAA;AAAA,MACT,IAAA,EAAM,YAAA;AAAA,MACN,QAAA,EAAU,GAAA;AAAA,MACV,WAAA,EAAa,iCAAA;AAAA,MACb,IAAA,EAAM;AAAA,KACR;AAAA,IACA;AAAA,MACE,OAAA,EAAS,2BAAA;AAAA,MACT,IAAA,EAAM,YAAA;AAAA,MACN,QAAA,EAAU,GAAA;AAAA,MACV,WAAA,EAAa,wBAAA;AAAA,MACb,IAAA,EAAM;AAAA;AACR,GACF;AAAA,EAEA,qBAAqB,WAAA,EAAsD;AACzE,IAAA,IAAI,aAAa,YAAA,EAAc;AAC7B,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,oCAAA;AAAA,QACV,IAAA,EAAM;AAAA,OACR;AAAA;AAEF,IAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,WAAA;AAAA,QACV,IAAA,EAAM;AAAA,OACR;AAAA;AAEF,IAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,uBAAA;AAAA,QACV,IAAA,EAAM;AAAA,OACR;AAAA;AAGF,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,oCAAA;AAAA,MACV,IAAA,EAAM;AAAA,KACR;AAAA;AACF,EAEA,UAAA,GAAqB;AACnB,IAAA,OAAO,OAAA;AAAA;AACT,EAEA,QAAQ,MAAA,EAA+B;AACrC,IAAA,MAAM,OAAiB,EAAC;AAGxB,IAAA,IAAA,CAAK,KAAK,gBAAgB,CAAA;AAG1B,IAAA,IAAI,CAAC,IAAA,CAAK,aAAA,CAAc,MAAM,CAAA,EAAG;AAC/B,MAAA,IAAA,CAAK,KAAK,aAAa,CAAA;AAEvB,MAAA,IAAA,CAAK,KAAK,iBAAiB,CAAA;AAAA;AAQ7B,IAAA,MAAM,QAAA,GAAY,OAAO,aAAA,EAAqD,QAAA;AAC9E,IAAA,IAAI,MAAA,CAAO,KAAK,WAAA,EAAa;AAC3B,MAAA,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,MAAA,CAAO,GAAA,CAAI,WAAW,CAAA;AAAA,KAC7C,MAAA,IAAW,aAAa,WAAA,EAAa;AACnC,MAAA,IAAA,CAAK,IAAA,CAAK,WAAW,QAAQ,CAAA;AAAA,KAC/B,MAAA,IAAW,aAAa,QAAA,EAAU;AAChC,MAAA,IAAA,CAAK,IAAA,CAAK,WAAW,IAAI,CAAA;AAAA,KAC3B,MAAA,IAAW,aAAa,QAAA,EAAU;AAChC,MAAA,IAAA,CAAK,IAAA,CAAK,WAAW,uBAAuB,CAAA;AAAA;AAK9C,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,cAAA,CAAe,MAAM,CAAA;AAC9C,IAAA,IAAI,WAAA,CAAY,cAAc,IAAA,CAAK,IAAA,CAAK,aAAa,CAAA,UAAA,EAAa,WAAA,CAAY,YAAY,CAAA,CAAE,CAAA;AAC5F,IAAA,IAAI,WAAA,CAAY,WAAW,IAAA,CAAK,IAAA,CAAK,aAAa,CAAA,OAAA,EAAU,WAAA,CAAY,SAAS,CAAA,CAAE,CAAA;AACnF,IAAA,IAAI,WAAA,CAAY,WAAW,IAAA,CAAK,IAAA,CAAK,aAAa,CAAA,OAAA,EAAU,WAAA,CAAY,SAAS,CAAA,CAAE,CAAA;AAEnF,IAAA,OAAO,IAAA;AAAA;AACT,EAEA,OAAO,MAAA,EAA6C;AAElD,IAAA,MAAM,MAA8B,EAAC;AAGrC,IAAA,IAAI,CAAC,IAAA,CAAK,aAAA,CAAc,MAAM,CAAA,EAAG;AAC/B,MAAA,GAAA,CAAI,QAAA,GAAW,GAAA;AAAA;AAIjB,IAAA,IAAI,MAAA,CAAO,GAAA,EAAK,YAAA,KAAiB,MAAA,EAAQ;AACvC,MAAA,GAAA,CAAI,YAAA,GAAe,MAAA;AAAA;AAGrB,IAAA,OAAO,GAAA;AAAA;AACT,EAEA,YAAY,MAAA,EAAgC;AAC1C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAGtC,IAAA,IACE,SAAS,QAAA,CAAS,YAAY,KAC9B,QAAA,CAAS,QAAA,CAAS,mBAAmB,CAAA,IACrC,QAAA,CAAS,SAAS,mBAAmB,CAAA,IACrC,SAAS,QAAA,CAAS,gBAAgB,KAClC,QAAA,CAAS,QAAA,CAAS,iBAAiB,CAAA,EACnC;AACA,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM,SAAA;AAAA,QACN,YAAA,EAAc;AAAA,OAChB;AAAA;AAIF,IAAA,IACE,QAAA,CAAS,QAAA,CAAS,iBAAiB,CAAA,IACnC,QAAA,CAAS,QAAA,CAAS,uBAAuB,CAAA,IACzC,QAAA,CAAS,QAAA,CAAS,cAAc,CAAA,EAChC;AACA,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM,SAAA;AAAA,QACN,YAAA,EAAc;AAAA,OAChB;AAAA;AAGF,IAAA,OAAO,EAAE,UAAU,KAAA,EAAM;AAAA;AAC3B,EAEA,qBAAqB,MAAA,EAAyC;AAC5D,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAGtC,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA;AAC9C,IAAA,IAAI,eAAe,QAAA,EAAU;AAC3B,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM,OAAA;AAAA,QACN,QAAQ,cAAA,CAAe,YAAA;AAAA,QACvB,cAAA,EAAgB,KAAA;AAAA,QAChB,cAAc,cAAA,CAAe;AAAA,OAC/B;AAAA;AAIF,IAAA,IAAI,0CAAA,CAA2C,IAAA,CAAK,QAAQ,CAAA,EAAG;AAC7D,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM,cAAA;AAAA,QACN,MAAA,EAAQ,0BAAA;AAAA,QACR,cAAA,EAAgB,KAAA;AAAA,QAChB,YAAA,EAAc;AAAA,OAChB;AAAA;AAIF,IAAA,IAAI,iDAAA,CAAkD,IAAA,CAAK,QAAQ,CAAA,EAAG;AACpE,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,MAAA,EAAQ,yBAAA;AAAA,QACR,cAAA,EAAgB,KAAA;AAAA,QAChB,YAAA,EAAc;AAAA,OAChB;AAAA;AAIF,IAAA,IAAI,2BAA2B,IAAA,CAAK,QAAQ,KAAK,WAAA,CAAY,IAAA,CAAK,QAAQ,CAAA,EAAG;AAC3E,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM,YAAA;AAAA,QACN,MAAA,EAAQ,oCAAA;AAAA,QACR,OAAA,EAAS,CAAC,GAAA,EAAK,GAAG,CAAA;AAAA,QAClB,cAAA,EAAgB,KAAA;AAAA,QAChB,YAAA,EAAc;AAAA,OAChB;AAAA;AAIF,IAAA,OAAO,KAAA,CAAM,qBAAqB,MAAM,CAAA;AAAA;AAC1C,EAEA,YAAY,MAAA,EAAyB;AACnC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAEtC,IAAA,OACE,QAAA,CAAS,QAAA,CAAS,QAAQ,CAAA,IAC1B,QAAA,CAAS,SAAS,OAAO,CAAA,IACzB,eAAA,CAAgB,IAAA,CAAK,QAAQ,CAAA;AAAA,IAE7B,qBAAA,CAAsB,KAAK,QAAQ,CAAA;AAAA,IAEnC,OAAA,CAAQ,KAAK,QAAQ,CAAA;AAAA;AAEzB,EAEA,YAAY,MAAA,EAAqC;AAC/C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAEtC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,kBAAA,CAAmB,QAAQ,CAAA;AAEnD,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,OAAO,IAAA;AAAA;AAGT,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,gBAAA,CAAiB,QAAQ,CAAA;AAGjD,IAAA,IAAI,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,QAAA,EAAU,iBAAiB,CAAA;AAG7D,IAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,8DAAA,EAAgE,EAAE,CAAA;AAE5F,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,aAAa,UAAA,GAAa,UAAA;AAAA,MAChC,OAAA,EAAS,QAAQ,IAAA,EAAK;AAAA,MACtB,UAAA,EAAY,IAAA;AAAA,MACZ,UAAA;AAAA,MACA,QAAA,EAAU;AAAA,QACR,GAAA,EAAK;AAAA;AACP,KACF;AAAA;AACF,EAEA,gBAAA,GAA2B;AACzB,IAAA,OAAO,mBAAA;AAAA;AACT,EAEA,qBAAA,GAAgC;AAC9B,IAAA,OAAO,iBAAA;AAAA;AAEX;;;AC3PA,IAAM,iBAAA,GAA0D;AAAA,EAC9D,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO;AAAA,MACL,aAAA;AAAA,MACA,gBAAA;AAAA,MACA,qBAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,mBAAA;AAAA,MACA,mBAAA;AAAA,MACA,yBAAA;AAAA,MACA,gBAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,QAAA,EAAU;AAAA,MACR,kBAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,MAAA,EAAQ;AAAA,GACV;AAAA,EAEA,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO;AAAA,MACL,mBAAA;AAAA,MACA,gBAAA;AAAA,MACA,qBAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,gBAAA;AAAA,MACA,gBAAA;AAAA,MACA,mBAAA;AAAA,MACA,qBAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,QAAA,EAAU;AAAA,MACR,kBAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,MAAA,EAAQ;AAAA,GACV;AAAA,EAEA,KAAA,EAAO;AAAA,IACL,KAAA,EAAO;AAAA,MACL,OAAA;AAAA,MACA,gBAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,gBAAA;AAAA,MACA,mBAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,QAAA,EAAU;AAAA,MACR,kBAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,MAAA,EAAQ;AAAA,GACV;AAAA,EAEA,KAAA,EAAO;AAAA,IACL,KAAA,EAAO;AAAA,MACL,OAAA;AAAA,MACA,qBAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,SAAA;AAAA,MACA,gBAAA;AAAA,MACA,mBAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,QAAA,EAAU;AAAA,MACR,YAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,MAAA,EAAQ;AAAA;AAEZ,CAAA;AAKA,IAAM,YAAA,uBAAiD,GAAA,EAAI;AAe3D,eAAe,kBAAA,CACb,SACA,OAAA,EACiC;AACjC,EAAA,IAAI;AAGF,IAAA,MAAM,UAAA,GAAa,uBAAA;AACnB,IAAA,MAAM,UAAU,MAAM;AAAA;AAAA,MAAiC;AAAA,KAAA;AAQvD,IAAA,MAAM,QAAA,GAAW,OAAA,GACb,MAAM,OAAA,CAAQ,qBAAA,CAAsB,OAAA,EAAS,OAAO,CAAA,GACpD,MAAM,OAAA,CAAQ,qBAAA,CAAsB,OAAA,EAAS,QAAQ,CAAA;AAEzD,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,QAAA,CAAS,aAAA,IAAiB,EAAC;AAAA,QAClC,IAAA,EAAM,QAAA,CAAS,YAAA,IAAgB,EAAC;AAAA,QAChC,QAAA,EAAU,QAAA,CAAS,gBAAA,IAAoB,EAAC;AAAA,QACxC,MAAA,EAAQ,UAAA;AAAA,QACR,SAAS,QAAA,CAAS;AAAA,OACpB;AAAA;AACF,GACF,CAAA,MAAQ;AAAA;AAIR,EAAA,OAAO,IAAA;AACT;AAYA,eAAsB,YAAA,CACpB,OAAA,EACA,OAAA,EACA,YAAA,GAAe,KAAA,EACW;AAC1B,EAAA,MAAM,QAAA,GAAW,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,WAAW,QAAQ,CAAA,CAAA;AAGlD,EAAA,IAAI,CAAC,YAAA,IAAgB,YAAA,CAAa,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC/C,IAAA,OAAO,YAAA,CAAa,IAAI,QAAQ,CAAA;AAAA;AAIlC,EAAA,MAAM,eAAA,GAAkB,MAAM,kBAAA,CAAmB,OAAA,EAAS,OAAO,CAAA;AAEjE,EAAA,IAAI,eAAA,IAAmB,eAAA,CAAgB,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACvD,IAAA,YAAA,CAAa,GAAA,CAAI,UAAU,eAAe,CAAA;AAC1C,IAAA,OAAO,eAAA;AAAA;AAIT,EAAA,MAAM,QAAA,GAAW,kBAAkB,OAAO,CAAA;AAC1C,EAAA,YAAA,CAAa,GAAA,CAAI,UAAU,QAAQ,CAAA;AACnC,EAAA,OAAO,QAAA;AACT;AAQO,SAAS,iBAAiB,OAAA,EAAuC;AACtE,EAAA,MAAM,QAAA,GAAW,GAAG,OAAO,CAAA,OAAA,CAAA;AAG3B,EAAA,IAAI,YAAA,CAAa,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC9B,IAAA,OAAO,YAAA,CAAa,IAAI,QAAQ,CAAA;AAAA;AAIlC,EAAA,OAAO,kBAAkB,OAAO,CAAA;AAClC;AAOA,eAAsB,kBAAA,GAAoC;AACxD,EAAA,MAAM,QAAA,GAA0B,CAAC,QAAA,EAAU,QAAA,EAAU,SAAS,OAAO,CAAA;AAErE,EAAA,MAAM,OAAA,CAAQ,IAAI,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,KAAY,YAAA,CAAa,OAAO,CAAC,CAAC,CAAA;AACpE;AAKO,SAAS,iBAAA,GAA0B;AACxC,EAAA,YAAA,CAAa,KAAA,EAAM;AACrB;AAKO,SAAS,oBAAoB,OAAA,EAAuC;AACzE,EAAA,OAAO,kBAAkB,OAAO,CAAA;AAClC;AAKA,eAAsB,mBAAmB,OAAA,EAAwC;AAC/E,EAAA,MAAM,QAAA,GAAW,MAAM,kBAAA,CAAmB,OAAO,CAAA;AACjD,EAAA,OAAO,QAAA,KAAa,IAAA;AACtB;;;ACnLO,SAAS,iBAAA,GAAoB;AAClC,EAAA,OAAO;AAAA,IACL,IAAI,aAAA,EAAc;AAAA,IAClB,IAAI,aAAA,EAAc;AAAA,IAClB,IAAI,YAAA,EAAa;AAAA,IACjB,IAAI,YAAA;AAAa,GACnB;AACF;AAOO,IAAM,aAAA,GAA8H;AAAA,EACzI,MAAA,EAAQ,aAAA;AAAA,EACR,MAAA,EAAQ,aAAA;AAAA,EACR,KAAA,EAAO,YAAA;AAAA,EACP,KAAA,EAAO;AACT;AAKO,SAAS,cAAc,IAAA,EAAmB;AAC/C,EAAA,MAAM,YAAA,GAAe,cAAc,IAAI,CAAA;AACvC,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,IAAI,CAAA,CAAE,CAAA;AAAA;AAEjD,EAAA,OAAO,IAAI,YAAA,EAAa;AAC1B;AA2BA,eAAsB,cAAc,KAAA,EAAkD;AACpF,EAAA,MAAM,UAA6B,EAAC;AAEpC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,OAAA,GAAU,cAAc,IAAI,CAAA;AAClC,IAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,oBAAA,EAAqB;AAEtD,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,SAAS,OAAA,CAAQ,WAAA;AAAA,MACjB,WAAW,UAAA,CAAW,SAAA;AAAA,MACtB,SAAS,UAAA,CAAW,OAAA;AAAA,MACpB,OAAO,UAAA,CAAW,KAAA;AAAA,MAClB,cAAA,EAAgB,QAAQ,YAAA,CAAa,OAAA;AAAA,MACrC,OAAA,EAAS,QAAQ,YAAA,CAAa;AAAA,KAC/B,CAAA;AAAA;AAGH,EAAA,OAAO,OAAA;AACT;AAkBA,eAAsB,gBAAA,GAA+C;AACnE,EAAA,OAAO,aAAA,CAAc,MAAA,CAAO,IAAA,CAAK,aAAa,CAAkB,CAAA;AAClE;AAKA,eAAsB,qBAAqB,KAAA,EAAsC;AAC/E,EAAA,MAAM,UAAU,KAAA,GAAQ,MAAM,cAAc,KAAK,CAAA,GAAI,MAAM,gBAAA,EAAiB;AAC5E,EAAA,MAAM,UAAU,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,EAAE,SAAS,CAAA;AAEhD,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,OAAA,CAAQ,IAAI,8BAA8B,CAAA;AAC1C,IAAA;AAAA;AAGF,EAAA,OAAA,CAAQ,IAAI,wBAAwB,CAAA;AACpC,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AAC1B,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,WAAA,EAAc,CAAA,CAAE,cAAc,CAAA,CAAE,CAAA;AAC5C,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,QAAA,EAAW,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AAClC,IAAA,IAAI,EAAE,KAAA,EAAO;AACX,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,SAAA,EAAY,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA;AAEnC,IAAA,OAAA,CAAQ,GAAA,EAAI;AAAA;AAEhB","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 * 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 prompts that can be safely auto-responded.\n */\n readonly autoResponseRules: AutoResponseRule[] = [\n {\n pattern: /update available.*\\[y\\/n\\]/i,\n type: 'update',\n response: 'n',\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 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 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 description: 'Decline anonymous usage data',\n safe: true,\n },\n {\n pattern: /continue without.*\\[y\\/n\\]/i,\n type: 'config',\n response: 'y',\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\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 canAutoRespond: false,\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 // Claude Code shows a prompt when ready\n // Avoid overly broad patterns that could match during auth\n return (\n stripped.includes('Claude Code') ||\n stripped.includes('How can I help') ||\n stripped.includes('What would you like') ||\n stripped.includes('Ready') ||\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-2.5-pro',\n fast: 'gemini-2.5-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 // 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 // Gemini-specific: Tool execution confirmation (WriteFile, Shell, etc.)\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 canAutoRespond: false,\n instructions: 'Gemini is asking to apply a change (file write, shell command, etc.)',\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 */\n readonly autoResponseRules: AutoResponseRule[] = [\n {\n pattern: /update available.*\\[y\\/n\\]/i,\n type: 'update',\n response: 'n',\n description: 'Decline Codex update to continue execution',\n safe: true,\n },\n {\n pattern: /new version.*\\[y\\/n\\]/i,\n type: 'update',\n response: 'n',\n description: 'Decline version upgrade',\n safe: true,\n },\n {\n pattern: /send.*telemetry.*\\[y\\/n\\]/i,\n type: 'config',\n response: 'n',\n description: 'Decline telemetry',\n safe: true,\n },\n {\n pattern: /enable.*beta.*features.*\\[y\\/n\\]/i,\n type: 'config',\n response: 'n',\n description: 'Decline beta features',\n safe: true,\n },\n {\n pattern: /Update (available|now)|Skip until next version/i,\n type: 'config',\n response: '2',\n description: 'Skip Codex CLI update prompt',\n safe: true,\n },\n {\n pattern: /trust the contents of this directory/i,\n type: 'permission',\n response: 'y',\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 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 */\n readonly autoResponseRules: AutoResponseRule[] = [\n {\n pattern: /Add .+ to the chat\\?.*\\[y\\/n\\]/i,\n type: 'permission',\n response: 'y',\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 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 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-2.5-pro',\n fast: 'gemini/gemini-2.5-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/gemini-2.5-pro');\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.d.cts
CHANGED
|
@@ -79,6 +79,13 @@ declare abstract class BaseCodingAdapter extends BaseCLIAdapter {
|
|
|
79
79
|
* Returns powerful (most capable) and fast (cheapest/fastest) model names.
|
|
80
80
|
*/
|
|
81
81
|
abstract getRecommendedModels(credentials?: AgentCredentials): ModelRecommendations;
|
|
82
|
+
/**
|
|
83
|
+
* Override stripAnsi to handle TUI cursor-forward codes.
|
|
84
|
+
* TUI CLIs (Claude Code, Gemini CLI) use \x1b[<n>C (cursor forward)
|
|
85
|
+
* instead of literal spaces for word positioning. Replace with spaces
|
|
86
|
+
* before stripping other ANSI codes so regex patterns can match.
|
|
87
|
+
*/
|
|
88
|
+
protected stripAnsi(str: string): string;
|
|
82
89
|
/**
|
|
83
90
|
* Override detectExit to include installation instructions
|
|
84
91
|
*/
|
package/dist/index.d.ts
CHANGED
|
@@ -79,6 +79,13 @@ declare abstract class BaseCodingAdapter extends BaseCLIAdapter {
|
|
|
79
79
|
* Returns powerful (most capable) and fast (cheapest/fastest) model names.
|
|
80
80
|
*/
|
|
81
81
|
abstract getRecommendedModels(credentials?: AgentCredentials): ModelRecommendations;
|
|
82
|
+
/**
|
|
83
|
+
* Override stripAnsi to handle TUI cursor-forward codes.
|
|
84
|
+
* TUI CLIs (Claude Code, Gemini CLI) use \x1b[<n>C (cursor forward)
|
|
85
|
+
* instead of literal spaces for word positioning. Replace with spaces
|
|
86
|
+
* before stripping other ANSI codes so regex patterns can match.
|
|
87
|
+
*/
|
|
88
|
+
protected stripAnsi(str: string): string;
|
|
82
89
|
/**
|
|
83
90
|
* Override detectExit to include installation instructions
|
|
84
91
|
*/
|
package/dist/index.js
CHANGED
|
@@ -17,6 +17,16 @@ var BaseCodingAdapter = class extends BaseCLIAdapter {
|
|
|
17
17
|
const adapterConfig = config.adapterConfig;
|
|
18
18
|
return adapterConfig?.interactive === true;
|
|
19
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* Override stripAnsi to handle TUI cursor-forward codes.
|
|
22
|
+
* TUI CLIs (Claude Code, Gemini CLI) use \x1b[<n>C (cursor forward)
|
|
23
|
+
* instead of literal spaces for word positioning. Replace with spaces
|
|
24
|
+
* before stripping other ANSI codes so regex patterns can match.
|
|
25
|
+
*/
|
|
26
|
+
stripAnsi(str) {
|
|
27
|
+
const withSpaces = str.replace(/\x1b\[\d*C/g, " ");
|
|
28
|
+
return super.stripAnsi(withSpaces);
|
|
29
|
+
}
|
|
20
30
|
/**
|
|
21
31
|
* Override detectExit to include installation instructions
|
|
22
32
|
*/
|
|
@@ -488,6 +498,20 @@ var CodexAdapter = class extends BaseCodingAdapter {
|
|
|
488
498
|
response: "n",
|
|
489
499
|
description: "Decline beta features",
|
|
490
500
|
safe: true
|
|
501
|
+
},
|
|
502
|
+
{
|
|
503
|
+
pattern: /Update (available|now)|Skip until next version/i,
|
|
504
|
+
type: "config",
|
|
505
|
+
response: "2",
|
|
506
|
+
description: "Skip Codex CLI update prompt",
|
|
507
|
+
safe: true
|
|
508
|
+
},
|
|
509
|
+
{
|
|
510
|
+
pattern: /trust the contents of this directory/i,
|
|
511
|
+
type: "permission",
|
|
512
|
+
response: "y",
|
|
513
|
+
description: "Trust directory contents to allow Codex to operate",
|
|
514
|
+
safe: true
|
|
491
515
|
}
|
|
492
516
|
];
|
|
493
517
|
getRecommendedModels(_credentials) {
|
|
@@ -700,12 +724,12 @@ var AiderAdapter = class extends BaseCodingAdapter {
|
|
|
700
724
|
} else if (provider === "openai") {
|
|
701
725
|
args.push("--model", "4o");
|
|
702
726
|
} else if (provider === "google") {
|
|
703
|
-
args.push("--model", "gemini");
|
|
727
|
+
args.push("--model", "gemini/gemini-2.5-pro");
|
|
704
728
|
}
|
|
705
729
|
const credentials = this.getCredentials(config);
|
|
706
730
|
if (credentials.anthropicKey) args.push("--api-key", `anthropic=${credentials.anthropicKey}`);
|
|
707
731
|
if (credentials.openaiKey) args.push("--api-key", `openai=${credentials.openaiKey}`);
|
|
708
|
-
if (credentials.googleKey) args.push("--api-key", `
|
|
732
|
+
if (credentials.googleKey) args.push("--api-key", `gemini=${credentials.googleKey}`);
|
|
709
733
|
return args;
|
|
710
734
|
}
|
|
711
735
|
getEnv(config) {
|
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 * 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 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 prompts that can be safely auto-responded.\n */\n readonly autoResponseRules: AutoResponseRule[] = [\n {\n pattern: /update available.*\\[y\\/n\\]/i,\n type: 'update',\n response: 'n',\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 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 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 description: 'Decline anonymous usage data',\n safe: true,\n },\n {\n pattern: /continue without.*\\[y\\/n\\]/i,\n type: 'config',\n response: 'y',\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\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 canAutoRespond: false,\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 // Claude Code shows a prompt when ready\n // Avoid overly broad patterns that could match during auth\n return (\n stripped.includes('Claude Code') ||\n stripped.includes('How can I help') ||\n stripped.includes('What would you like') ||\n stripped.includes('Ready') ||\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-2.5-pro',\n fast: 'gemini-2.5-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 // 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 // Gemini-specific: Tool execution confirmation (WriteFile, Shell, etc.)\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 canAutoRespond: false,\n instructions: 'Gemini is asking to apply a change (file write, shell command, etc.)',\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 */\n readonly autoResponseRules: AutoResponseRule[] = [\n {\n pattern: /update available.*\\[y\\/n\\]/i,\n type: 'update',\n response: 'n',\n description: 'Decline Codex update to continue execution',\n safe: true,\n },\n {\n pattern: /new version.*\\[y\\/n\\]/i,\n type: 'update',\n response: 'n',\n description: 'Decline version upgrade',\n safe: true,\n },\n {\n pattern: /send.*telemetry.*\\[y\\/n\\]/i,\n type: 'config',\n response: 'n',\n description: 'Decline telemetry',\n safe: true,\n },\n {\n pattern: /enable.*beta.*features.*\\[y\\/n\\]/i,\n type: 'config',\n response: 'n',\n description: 'Decline beta features',\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 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 */\n readonly autoResponseRules: AutoResponseRule[] = [\n {\n pattern: /Add .+ to the chat\\?.*\\[y\\/n\\]/i,\n type: 'permission',\n response: 'y',\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 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 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-2.5-pro',\n fast: 'gemini/gemini-2.5-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', `google=${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 * 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 prompts that can be safely auto-responded.\n */\n readonly autoResponseRules: AutoResponseRule[] = [\n {\n pattern: /update available.*\\[y\\/n\\]/i,\n type: 'update',\n response: 'n',\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 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 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 description: 'Decline anonymous usage data',\n safe: true,\n },\n {\n pattern: /continue without.*\\[y\\/n\\]/i,\n type: 'config',\n response: 'y',\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\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 canAutoRespond: false,\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 // Claude Code shows a prompt when ready\n // Avoid overly broad patterns that could match during auth\n return (\n stripped.includes('Claude Code') ||\n stripped.includes('How can I help') ||\n stripped.includes('What would you like') ||\n stripped.includes('Ready') ||\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-2.5-pro',\n fast: 'gemini-2.5-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 // 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 // Gemini-specific: Tool execution confirmation (WriteFile, Shell, etc.)\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 canAutoRespond: false,\n instructions: 'Gemini is asking to apply a change (file write, shell command, etc.)',\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 */\n readonly autoResponseRules: AutoResponseRule[] = [\n {\n pattern: /update available.*\\[y\\/n\\]/i,\n type: 'update',\n response: 'n',\n description: 'Decline Codex update to continue execution',\n safe: true,\n },\n {\n pattern: /new version.*\\[y\\/n\\]/i,\n type: 'update',\n response: 'n',\n description: 'Decline version upgrade',\n safe: true,\n },\n {\n pattern: /send.*telemetry.*\\[y\\/n\\]/i,\n type: 'config',\n response: 'n',\n description: 'Decline telemetry',\n safe: true,\n },\n {\n pattern: /enable.*beta.*features.*\\[y\\/n\\]/i,\n type: 'config',\n response: 'n',\n description: 'Decline beta features',\n safe: true,\n },\n {\n pattern: /Update (available|now)|Skip until next version/i,\n type: 'config',\n response: '2',\n description: 'Skip Codex CLI update prompt',\n safe: true,\n },\n {\n pattern: /trust the contents of this directory/i,\n type: 'permission',\n response: 'y',\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 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 */\n readonly autoResponseRules: AutoResponseRule[] = [\n {\n pattern: /Add .+ to the chat\\?.*\\[y\\/n\\]/i,\n type: 'permission',\n response: 'y',\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 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 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-2.5-pro',\n fast: 'gemini/gemini-2.5-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/gemini-2.5-pro');\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"]}
|