coding-agent-adapters 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +34 -10
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +29 -8
- package/dist/index.d.ts +29 -8
- package/dist/index.js +34 -10
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -11,6 +11,14 @@ var BaseCodingAdapter = class extends ptyManager.BaseCLIAdapter {
|
|
|
11
11
|
const adapterConfig = config.adapterConfig;
|
|
12
12
|
return adapterConfig || {};
|
|
13
13
|
}
|
|
14
|
+
/**
|
|
15
|
+
* Check if interactive mode is enabled.
|
|
16
|
+
* When true, skip non-interactive flags (--print, --quiet, etc.)
|
|
17
|
+
*/
|
|
18
|
+
isInteractive(config) {
|
|
19
|
+
const adapterConfig = config.adapterConfig;
|
|
20
|
+
return adapterConfig?.interactive === true;
|
|
21
|
+
}
|
|
14
22
|
/**
|
|
15
23
|
* Override detectExit to include installation instructions
|
|
16
24
|
*/
|
|
@@ -140,7 +148,9 @@ var ClaudeAdapter = class extends BaseCodingAdapter {
|
|
|
140
148
|
}
|
|
141
149
|
getArgs(config) {
|
|
142
150
|
const args = [];
|
|
143
|
-
|
|
151
|
+
if (!this.isInteractive(config)) {
|
|
152
|
+
args.push("--print");
|
|
153
|
+
}
|
|
144
154
|
if (config.workdir) {
|
|
145
155
|
args.push("--cwd", config.workdir);
|
|
146
156
|
}
|
|
@@ -155,7 +165,9 @@ var ClaudeAdapter = class extends BaseCodingAdapter {
|
|
|
155
165
|
if (config.env?.ANTHROPIC_MODEL) {
|
|
156
166
|
env.ANTHROPIC_MODEL = config.env.ANTHROPIC_MODEL;
|
|
157
167
|
}
|
|
158
|
-
|
|
168
|
+
if (!this.isInteractive(config)) {
|
|
169
|
+
env.CLAUDE_CODE_DISABLE_INTERACTIVE = "true";
|
|
170
|
+
}
|
|
159
171
|
return env;
|
|
160
172
|
}
|
|
161
173
|
detectLogin(output) {
|
|
@@ -282,11 +294,13 @@ var GeminiAdapter = class extends BaseCodingAdapter {
|
|
|
282
294
|
}
|
|
283
295
|
getArgs(config) {
|
|
284
296
|
const args = [];
|
|
285
|
-
|
|
297
|
+
if (!this.isInteractive(config)) {
|
|
298
|
+
args.push("--non-interactive");
|
|
299
|
+
args.push("--output-format", "text");
|
|
300
|
+
}
|
|
286
301
|
if (config.workdir) {
|
|
287
302
|
args.push("--cwd", config.workdir);
|
|
288
303
|
}
|
|
289
|
-
args.push("--output-format", "text");
|
|
290
304
|
return args;
|
|
291
305
|
}
|
|
292
306
|
getEnv(config) {
|
|
@@ -299,7 +313,9 @@ var GeminiAdapter = class extends BaseCodingAdapter {
|
|
|
299
313
|
if (config.env?.GEMINI_MODEL) {
|
|
300
314
|
env.GEMINI_MODEL = config.env.GEMINI_MODEL;
|
|
301
315
|
}
|
|
302
|
-
|
|
316
|
+
if (!this.isInteractive(config)) {
|
|
317
|
+
env.NO_COLOR = "1";
|
|
318
|
+
}
|
|
303
319
|
return env;
|
|
304
320
|
}
|
|
305
321
|
detectLogin(output) {
|
|
@@ -451,7 +467,9 @@ var CodexAdapter = class extends BaseCodingAdapter {
|
|
|
451
467
|
}
|
|
452
468
|
getArgs(config) {
|
|
453
469
|
const args = [];
|
|
454
|
-
|
|
470
|
+
if (!this.isInteractive(config)) {
|
|
471
|
+
args.push("--quiet");
|
|
472
|
+
}
|
|
455
473
|
if (config.workdir) {
|
|
456
474
|
args.push("--cwd", config.workdir);
|
|
457
475
|
}
|
|
@@ -466,7 +484,9 @@ var CodexAdapter = class extends BaseCodingAdapter {
|
|
|
466
484
|
if (config.env?.OPENAI_MODEL) {
|
|
467
485
|
env.OPENAI_MODEL = config.env.OPENAI_MODEL;
|
|
468
486
|
}
|
|
469
|
-
|
|
487
|
+
if (!this.isInteractive(config)) {
|
|
488
|
+
env.NO_COLOR = "1";
|
|
489
|
+
}
|
|
470
490
|
return env;
|
|
471
491
|
}
|
|
472
492
|
detectLogin(output) {
|
|
@@ -610,8 +630,10 @@ var AiderAdapter = class extends BaseCodingAdapter {
|
|
|
610
630
|
getArgs(config) {
|
|
611
631
|
const args = [];
|
|
612
632
|
args.push("--auto-commits");
|
|
613
|
-
|
|
614
|
-
|
|
633
|
+
if (!this.isInteractive(config)) {
|
|
634
|
+
args.push("--no-pretty");
|
|
635
|
+
args.push("--no-show-diffs");
|
|
636
|
+
}
|
|
615
637
|
const credentials = this.getCredentials(config);
|
|
616
638
|
if (config.env?.AIDER_MODEL) {
|
|
617
639
|
args.push("--model", config.env.AIDER_MODEL);
|
|
@@ -633,7 +655,9 @@ var AiderAdapter = class extends BaseCodingAdapter {
|
|
|
633
655
|
if (credentials.googleKey) {
|
|
634
656
|
env.GOOGLE_API_KEY = credentials.googleKey;
|
|
635
657
|
}
|
|
636
|
-
|
|
658
|
+
if (!this.isInteractive(config)) {
|
|
659
|
+
env.NO_COLOR = "1";
|
|
660
|
+
}
|
|
637
661
|
if (config.env?.AIDER_NO_GIT === "true") {
|
|
638
662
|
env.AIDER_NO_GIT = "true";
|
|
639
663
|
}
|
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/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 * Extended config with credentials support\n */\nexport interface CodingAgentConfig extends SpawnConfig {\n adapterConfig?: AgentCredentials & 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 * 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 } 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 getCommand(): string {\n return 'claude';\n }\n\n getArgs(config: SpawnConfig): string[] {\n const args: string[] = [];\n\n // Print mode for non-interactive usage\n args.push('--print');\n\n // Set working directory if specified\n if (config.workdir) {\n args.push('--cwd', config.workdir);\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\n env.CLAUDE_CODE_DISABLE_INTERACTIVE = 'true';\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: 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 return (\n stripped.includes('Claude Code') ||\n stripped.includes('How can I help') ||\n stripped.includes('What would you like') ||\n // Check for the typical prompt pattern\n />\\s*$/.test(stripped) ||\n // Or a clear ready indicator\n stripped.includes('Ready')\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 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 } 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 getCommand(): string {\n return 'gemini';\n }\n\n getArgs(config: SpawnConfig): string[] {\n const args: string[] = [];\n\n // Non-interactive mode\n args.push('--non-interactive');\n\n // Set working directory if specified\n if (config.workdir) {\n args.push('--cwd', config.workdir);\n }\n\n // Text output for easier parsing\n args.push('--output-format', 'text');\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\n env.NO_COLOR = '1';\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: 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 return (\n stripped.includes('Gemini') ||\n stripped.includes('Ready') ||\n stripped.includes('How can I help') ||\n stripped.includes('What would you like') ||\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 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 } 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 getCommand(): string {\n return 'codex';\n }\n\n getArgs(config: SpawnConfig): string[] {\n const args: string[] = [];\n\n // Quiet mode for less verbose output\n args.push('--quiet');\n\n // Set working directory if specified\n if (config.workdir) {\n args.push('--cwd', config.workdir);\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\n env.NO_COLOR = '1';\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 } 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 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\n args.push('--no-pretty');\n\n // Don't show diffs (we'll handle this separately if needed)\n args.push('--no-show-diffs');\n\n // Set working directory via --file flag prefix\n // Aider uses current directory, so we rely on PTY cwd\n\n // Model can be specified via env or config\n const credentials = this.getCredentials(config);\n if (config.env?.AIDER_MODEL) {\n args.push('--model', config.env.AIDER_MODEL);\n }\n\n // Default to Claude if anthropic key is available\n if (credentials.anthropicKey && !config.env?.AIDER_MODEL) {\n args.push('--model', 'claude-3-5-sonnet-20241022');\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 // Aider supports multiple backends\n if (credentials.anthropicKey) {\n env.ANTHROPIC_API_KEY = credentials.anthropicKey;\n }\n\n if (credentials.openaiKey) {\n env.OPENAI_API_KEY = credentials.openaiKey;\n }\n\n if (credentials.googleKey) {\n env.GOOGLE_API_KEY = credentials.googleKey;\n }\n\n // Disable color for parsing\n env.NO_COLOR = '1';\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 * 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, AdapterRegistry } from 'pty-manager';\n * import { ClaudeAdapter, GeminiAdapter } from 'coding-agent-adapters';\n *\n * const registry = new AdapterRegistry();\n * registry.register(new ClaudeAdapter());\n * registry.register(new GeminiAdapter());\n *\n * const manager = new PTYManager({ adapters: registry });\n *\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 */\n\n// Base class for extending\nexport { BaseCodingAdapter } from './base-coding-adapter';\nexport type { AgentCredentials, CodingAgentConfig, InstallationInfo } 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// 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 */\nexport const ADAPTER_TYPES = {\n claude: ClaudeAdapter,\n gemini: GeminiAdapter,\n codex: CodexAdapter,\n aider: AiderAdapter,\n} as const;\n\nexport type AdapterType = keyof typeof ADAPTER_TYPES;\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/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 * 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 } & 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 * 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 } 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 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\n // Set working directory if specified\n if (config.workdir) {\n args.push('--cwd', config.workdir);\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: 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 return (\n stripped.includes('Claude Code') ||\n stripped.includes('How can I help') ||\n stripped.includes('What would you like') ||\n // Check for the typical prompt pattern\n />\\s*$/.test(stripped) ||\n // Or a clear ready indicator\n stripped.includes('Ready')\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 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 } 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 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\n // Set working directory if specified\n if (config.workdir) {\n args.push('--cwd', config.workdir);\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: 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 return (\n stripped.includes('Gemini') ||\n stripped.includes('Ready') ||\n stripped.includes('How can I help') ||\n stripped.includes('What would you like') ||\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 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 } 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 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\n // Set working directory if specified\n if (config.workdir) {\n args.push('--cwd', config.workdir);\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 } 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 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 can be specified via env or config\n const credentials = this.getCredentials(config);\n if (config.env?.AIDER_MODEL) {\n args.push('--model', config.env.AIDER_MODEL);\n }\n\n // Default to Claude if anthropic key is available\n if (credentials.anthropicKey && !config.env?.AIDER_MODEL) {\n args.push('--model', 'claude-3-5-sonnet-20241022');\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 // Aider supports multiple backends\n if (credentials.anthropicKey) {\n env.ANTHROPIC_API_KEY = credentials.anthropicKey;\n }\n\n if (credentials.openaiKey) {\n env.OPENAI_API_KEY = credentials.openaiKey;\n }\n\n if (credentials.googleKey) {\n env.GOOGLE_API_KEY = credentials.googleKey;\n }\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 * 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 } 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// 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 */\nexport const ADAPTER_TYPES = {\n claude: ClaudeAdapter,\n gemini: GeminiAdapter,\n codex: CodexAdapter,\n aider: AiderAdapter,\n} as const;\n\nexport type AdapterType = keyof typeof ADAPTER_TYPES;\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
|
@@ -31,10 +31,16 @@ interface InstallationInfo {
|
|
|
31
31
|
minVersion?: string;
|
|
32
32
|
}
|
|
33
33
|
/**
|
|
34
|
-
* Extended config with credentials support
|
|
34
|
+
* Extended config with credentials and mode support
|
|
35
35
|
*/
|
|
36
36
|
interface CodingAgentConfig extends SpawnConfig {
|
|
37
|
-
adapterConfig?: AgentCredentials &
|
|
37
|
+
adapterConfig?: AgentCredentials & {
|
|
38
|
+
/**
|
|
39
|
+
* Run in interactive mode (skip --print/--quiet/--non-interactive flags).
|
|
40
|
+
* Use this when you want the full interactive CLI experience.
|
|
41
|
+
*/
|
|
42
|
+
interactive?: boolean;
|
|
43
|
+
} & Record<string, unknown>;
|
|
38
44
|
}
|
|
39
45
|
/**
|
|
40
46
|
* Base class for AI coding agent adapters
|
|
@@ -48,6 +54,11 @@ declare abstract class BaseCodingAdapter extends BaseCLIAdapter {
|
|
|
48
54
|
* Get credentials from config
|
|
49
55
|
*/
|
|
50
56
|
protected getCredentials(config: SpawnConfig): AgentCredentials;
|
|
57
|
+
/**
|
|
58
|
+
* Check if interactive mode is enabled.
|
|
59
|
+
* When true, skip non-interactive flags (--print, --quiet, etc.)
|
|
60
|
+
*/
|
|
61
|
+
protected isInteractive(config: SpawnConfig): boolean;
|
|
51
62
|
/**
|
|
52
63
|
* Override detectExit to include installation instructions
|
|
53
64
|
*/
|
|
@@ -182,15 +193,14 @@ declare class AiderAdapter extends BaseCodingAdapter {
|
|
|
182
193
|
*
|
|
183
194
|
* @example
|
|
184
195
|
* ```typescript
|
|
185
|
-
* import { PTYManager
|
|
196
|
+
* import { PTYManager } from 'pty-manager';
|
|
186
197
|
* import { ClaudeAdapter, GeminiAdapter } from 'coding-agent-adapters';
|
|
187
198
|
*
|
|
188
|
-
* const
|
|
189
|
-
*
|
|
190
|
-
*
|
|
191
|
-
*
|
|
192
|
-
* const manager = new PTYManager({ adapters: registry });
|
|
199
|
+
* const manager = new PTYManager();
|
|
200
|
+
* manager.registerAdapter(new ClaudeAdapter());
|
|
201
|
+
* manager.registerAdapter(new GeminiAdapter());
|
|
193
202
|
*
|
|
203
|
+
* // Non-interactive mode (default) - for automation
|
|
194
204
|
* const session = await manager.spawn({
|
|
195
205
|
* name: 'my-agent',
|
|
196
206
|
* type: 'claude',
|
|
@@ -199,6 +209,17 @@ declare class AiderAdapter extends BaseCodingAdapter {
|
|
|
199
209
|
* anthropicKey: process.env.ANTHROPIC_API_KEY,
|
|
200
210
|
* },
|
|
201
211
|
* });
|
|
212
|
+
*
|
|
213
|
+
* // Interactive mode - full CLI experience
|
|
214
|
+
* const interactiveSession = await manager.spawn({
|
|
215
|
+
* name: 'my-interactive-agent',
|
|
216
|
+
* type: 'claude',
|
|
217
|
+
* workdir: '/path/to/project',
|
|
218
|
+
* adapterConfig: {
|
|
219
|
+
* anthropicKey: process.env.ANTHROPIC_API_KEY,
|
|
220
|
+
* interactive: true, // Skip --print/--quiet/--non-interactive flags
|
|
221
|
+
* },
|
|
222
|
+
* });
|
|
202
223
|
* ```
|
|
203
224
|
*/
|
|
204
225
|
|
package/dist/index.d.ts
CHANGED
|
@@ -31,10 +31,16 @@ interface InstallationInfo {
|
|
|
31
31
|
minVersion?: string;
|
|
32
32
|
}
|
|
33
33
|
/**
|
|
34
|
-
* Extended config with credentials support
|
|
34
|
+
* Extended config with credentials and mode support
|
|
35
35
|
*/
|
|
36
36
|
interface CodingAgentConfig extends SpawnConfig {
|
|
37
|
-
adapterConfig?: AgentCredentials &
|
|
37
|
+
adapterConfig?: AgentCredentials & {
|
|
38
|
+
/**
|
|
39
|
+
* Run in interactive mode (skip --print/--quiet/--non-interactive flags).
|
|
40
|
+
* Use this when you want the full interactive CLI experience.
|
|
41
|
+
*/
|
|
42
|
+
interactive?: boolean;
|
|
43
|
+
} & Record<string, unknown>;
|
|
38
44
|
}
|
|
39
45
|
/**
|
|
40
46
|
* Base class for AI coding agent adapters
|
|
@@ -48,6 +54,11 @@ declare abstract class BaseCodingAdapter extends BaseCLIAdapter {
|
|
|
48
54
|
* Get credentials from config
|
|
49
55
|
*/
|
|
50
56
|
protected getCredentials(config: SpawnConfig): AgentCredentials;
|
|
57
|
+
/**
|
|
58
|
+
* Check if interactive mode is enabled.
|
|
59
|
+
* When true, skip non-interactive flags (--print, --quiet, etc.)
|
|
60
|
+
*/
|
|
61
|
+
protected isInteractive(config: SpawnConfig): boolean;
|
|
51
62
|
/**
|
|
52
63
|
* Override detectExit to include installation instructions
|
|
53
64
|
*/
|
|
@@ -182,15 +193,14 @@ declare class AiderAdapter extends BaseCodingAdapter {
|
|
|
182
193
|
*
|
|
183
194
|
* @example
|
|
184
195
|
* ```typescript
|
|
185
|
-
* import { PTYManager
|
|
196
|
+
* import { PTYManager } from 'pty-manager';
|
|
186
197
|
* import { ClaudeAdapter, GeminiAdapter } from 'coding-agent-adapters';
|
|
187
198
|
*
|
|
188
|
-
* const
|
|
189
|
-
*
|
|
190
|
-
*
|
|
191
|
-
*
|
|
192
|
-
* const manager = new PTYManager({ adapters: registry });
|
|
199
|
+
* const manager = new PTYManager();
|
|
200
|
+
* manager.registerAdapter(new ClaudeAdapter());
|
|
201
|
+
* manager.registerAdapter(new GeminiAdapter());
|
|
193
202
|
*
|
|
203
|
+
* // Non-interactive mode (default) - for automation
|
|
194
204
|
* const session = await manager.spawn({
|
|
195
205
|
* name: 'my-agent',
|
|
196
206
|
* type: 'claude',
|
|
@@ -199,6 +209,17 @@ declare class AiderAdapter extends BaseCodingAdapter {
|
|
|
199
209
|
* anthropicKey: process.env.ANTHROPIC_API_KEY,
|
|
200
210
|
* },
|
|
201
211
|
* });
|
|
212
|
+
*
|
|
213
|
+
* // Interactive mode - full CLI experience
|
|
214
|
+
* const interactiveSession = await manager.spawn({
|
|
215
|
+
* name: 'my-interactive-agent',
|
|
216
|
+
* type: 'claude',
|
|
217
|
+
* workdir: '/path/to/project',
|
|
218
|
+
* adapterConfig: {
|
|
219
|
+
* anthropicKey: process.env.ANTHROPIC_API_KEY,
|
|
220
|
+
* interactive: true, // Skip --print/--quiet/--non-interactive flags
|
|
221
|
+
* },
|
|
222
|
+
* });
|
|
202
223
|
* ```
|
|
203
224
|
*/
|
|
204
225
|
|
package/dist/index.js
CHANGED
|
@@ -9,6 +9,14 @@ var BaseCodingAdapter = class extends BaseCLIAdapter {
|
|
|
9
9
|
const adapterConfig = config.adapterConfig;
|
|
10
10
|
return adapterConfig || {};
|
|
11
11
|
}
|
|
12
|
+
/**
|
|
13
|
+
* Check if interactive mode is enabled.
|
|
14
|
+
* When true, skip non-interactive flags (--print, --quiet, etc.)
|
|
15
|
+
*/
|
|
16
|
+
isInteractive(config) {
|
|
17
|
+
const adapterConfig = config.adapterConfig;
|
|
18
|
+
return adapterConfig?.interactive === true;
|
|
19
|
+
}
|
|
12
20
|
/**
|
|
13
21
|
* Override detectExit to include installation instructions
|
|
14
22
|
*/
|
|
@@ -138,7 +146,9 @@ var ClaudeAdapter = class extends BaseCodingAdapter {
|
|
|
138
146
|
}
|
|
139
147
|
getArgs(config) {
|
|
140
148
|
const args = [];
|
|
141
|
-
|
|
149
|
+
if (!this.isInteractive(config)) {
|
|
150
|
+
args.push("--print");
|
|
151
|
+
}
|
|
142
152
|
if (config.workdir) {
|
|
143
153
|
args.push("--cwd", config.workdir);
|
|
144
154
|
}
|
|
@@ -153,7 +163,9 @@ var ClaudeAdapter = class extends BaseCodingAdapter {
|
|
|
153
163
|
if (config.env?.ANTHROPIC_MODEL) {
|
|
154
164
|
env.ANTHROPIC_MODEL = config.env.ANTHROPIC_MODEL;
|
|
155
165
|
}
|
|
156
|
-
|
|
166
|
+
if (!this.isInteractive(config)) {
|
|
167
|
+
env.CLAUDE_CODE_DISABLE_INTERACTIVE = "true";
|
|
168
|
+
}
|
|
157
169
|
return env;
|
|
158
170
|
}
|
|
159
171
|
detectLogin(output) {
|
|
@@ -280,11 +292,13 @@ var GeminiAdapter = class extends BaseCodingAdapter {
|
|
|
280
292
|
}
|
|
281
293
|
getArgs(config) {
|
|
282
294
|
const args = [];
|
|
283
|
-
|
|
295
|
+
if (!this.isInteractive(config)) {
|
|
296
|
+
args.push("--non-interactive");
|
|
297
|
+
args.push("--output-format", "text");
|
|
298
|
+
}
|
|
284
299
|
if (config.workdir) {
|
|
285
300
|
args.push("--cwd", config.workdir);
|
|
286
301
|
}
|
|
287
|
-
args.push("--output-format", "text");
|
|
288
302
|
return args;
|
|
289
303
|
}
|
|
290
304
|
getEnv(config) {
|
|
@@ -297,7 +311,9 @@ var GeminiAdapter = class extends BaseCodingAdapter {
|
|
|
297
311
|
if (config.env?.GEMINI_MODEL) {
|
|
298
312
|
env.GEMINI_MODEL = config.env.GEMINI_MODEL;
|
|
299
313
|
}
|
|
300
|
-
|
|
314
|
+
if (!this.isInteractive(config)) {
|
|
315
|
+
env.NO_COLOR = "1";
|
|
316
|
+
}
|
|
301
317
|
return env;
|
|
302
318
|
}
|
|
303
319
|
detectLogin(output) {
|
|
@@ -449,7 +465,9 @@ var CodexAdapter = class extends BaseCodingAdapter {
|
|
|
449
465
|
}
|
|
450
466
|
getArgs(config) {
|
|
451
467
|
const args = [];
|
|
452
|
-
|
|
468
|
+
if (!this.isInteractive(config)) {
|
|
469
|
+
args.push("--quiet");
|
|
470
|
+
}
|
|
453
471
|
if (config.workdir) {
|
|
454
472
|
args.push("--cwd", config.workdir);
|
|
455
473
|
}
|
|
@@ -464,7 +482,9 @@ var CodexAdapter = class extends BaseCodingAdapter {
|
|
|
464
482
|
if (config.env?.OPENAI_MODEL) {
|
|
465
483
|
env.OPENAI_MODEL = config.env.OPENAI_MODEL;
|
|
466
484
|
}
|
|
467
|
-
|
|
485
|
+
if (!this.isInteractive(config)) {
|
|
486
|
+
env.NO_COLOR = "1";
|
|
487
|
+
}
|
|
468
488
|
return env;
|
|
469
489
|
}
|
|
470
490
|
detectLogin(output) {
|
|
@@ -608,8 +628,10 @@ var AiderAdapter = class extends BaseCodingAdapter {
|
|
|
608
628
|
getArgs(config) {
|
|
609
629
|
const args = [];
|
|
610
630
|
args.push("--auto-commits");
|
|
611
|
-
|
|
612
|
-
|
|
631
|
+
if (!this.isInteractive(config)) {
|
|
632
|
+
args.push("--no-pretty");
|
|
633
|
+
args.push("--no-show-diffs");
|
|
634
|
+
}
|
|
613
635
|
const credentials = this.getCredentials(config);
|
|
614
636
|
if (config.env?.AIDER_MODEL) {
|
|
615
637
|
args.push("--model", config.env.AIDER_MODEL);
|
|
@@ -631,7 +653,9 @@ var AiderAdapter = class extends BaseCodingAdapter {
|
|
|
631
653
|
if (credentials.googleKey) {
|
|
632
654
|
env.GOOGLE_API_KEY = credentials.googleKey;
|
|
633
655
|
}
|
|
634
|
-
|
|
656
|
+
if (!this.isInteractive(config)) {
|
|
657
|
+
env.NO_COLOR = "1";
|
|
658
|
+
}
|
|
635
659
|
if (config.env?.AIDER_NO_GIT === "true") {
|
|
636
660
|
env.AIDER_NO_GIT = "true";
|
|
637
661
|
}
|
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/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 * Extended config with credentials support\n */\nexport interface CodingAgentConfig extends SpawnConfig {\n adapterConfig?: AgentCredentials & 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 * 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 } 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 getCommand(): string {\n return 'claude';\n }\n\n getArgs(config: SpawnConfig): string[] {\n const args: string[] = [];\n\n // Print mode for non-interactive usage\n args.push('--print');\n\n // Set working directory if specified\n if (config.workdir) {\n args.push('--cwd', config.workdir);\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\n env.CLAUDE_CODE_DISABLE_INTERACTIVE = 'true';\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: 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 return (\n stripped.includes('Claude Code') ||\n stripped.includes('How can I help') ||\n stripped.includes('What would you like') ||\n // Check for the typical prompt pattern\n />\\s*$/.test(stripped) ||\n // Or a clear ready indicator\n stripped.includes('Ready')\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 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 } 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 getCommand(): string {\n return 'gemini';\n }\n\n getArgs(config: SpawnConfig): string[] {\n const args: string[] = [];\n\n // Non-interactive mode\n args.push('--non-interactive');\n\n // Set working directory if specified\n if (config.workdir) {\n args.push('--cwd', config.workdir);\n }\n\n // Text output for easier parsing\n args.push('--output-format', 'text');\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\n env.NO_COLOR = '1';\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: 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 return (\n stripped.includes('Gemini') ||\n stripped.includes('Ready') ||\n stripped.includes('How can I help') ||\n stripped.includes('What would you like') ||\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 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 } 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 getCommand(): string {\n return 'codex';\n }\n\n getArgs(config: SpawnConfig): string[] {\n const args: string[] = [];\n\n // Quiet mode for less verbose output\n args.push('--quiet');\n\n // Set working directory if specified\n if (config.workdir) {\n args.push('--cwd', config.workdir);\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\n env.NO_COLOR = '1';\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 } 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 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\n args.push('--no-pretty');\n\n // Don't show diffs (we'll handle this separately if needed)\n args.push('--no-show-diffs');\n\n // Set working directory via --file flag prefix\n // Aider uses current directory, so we rely on PTY cwd\n\n // Model can be specified via env or config\n const credentials = this.getCredentials(config);\n if (config.env?.AIDER_MODEL) {\n args.push('--model', config.env.AIDER_MODEL);\n }\n\n // Default to Claude if anthropic key is available\n if (credentials.anthropicKey && !config.env?.AIDER_MODEL) {\n args.push('--model', 'claude-3-5-sonnet-20241022');\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 // Aider supports multiple backends\n if (credentials.anthropicKey) {\n env.ANTHROPIC_API_KEY = credentials.anthropicKey;\n }\n\n if (credentials.openaiKey) {\n env.OPENAI_API_KEY = credentials.openaiKey;\n }\n\n if (credentials.googleKey) {\n env.GOOGLE_API_KEY = credentials.googleKey;\n }\n\n // Disable color for parsing\n env.NO_COLOR = '1';\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 * 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, AdapterRegistry } from 'pty-manager';\n * import { ClaudeAdapter, GeminiAdapter } from 'coding-agent-adapters';\n *\n * const registry = new AdapterRegistry();\n * registry.register(new ClaudeAdapter());\n * registry.register(new GeminiAdapter());\n *\n * const manager = new PTYManager({ adapters: registry });\n *\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 */\n\n// Base class for extending\nexport { BaseCodingAdapter } from './base-coding-adapter';\nexport type { AgentCredentials, CodingAgentConfig, InstallationInfo } 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// 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 */\nexport const ADAPTER_TYPES = {\n claude: ClaudeAdapter,\n gemini: GeminiAdapter,\n codex: CodexAdapter,\n aider: AiderAdapter,\n} as const;\n\nexport type AdapterType = keyof typeof ADAPTER_TYPES;\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/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 * 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 } & 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 * 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 } 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 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\n // Set working directory if specified\n if (config.workdir) {\n args.push('--cwd', config.workdir);\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: 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 return (\n stripped.includes('Claude Code') ||\n stripped.includes('How can I help') ||\n stripped.includes('What would you like') ||\n // Check for the typical prompt pattern\n />\\s*$/.test(stripped) ||\n // Or a clear ready indicator\n stripped.includes('Ready')\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 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 } 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 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\n // Set working directory if specified\n if (config.workdir) {\n args.push('--cwd', config.workdir);\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: 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 return (\n stripped.includes('Gemini') ||\n stripped.includes('Ready') ||\n stripped.includes('How can I help') ||\n stripped.includes('What would you like') ||\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 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 } 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 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\n // Set working directory if specified\n if (config.workdir) {\n args.push('--cwd', config.workdir);\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 } 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 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 can be specified via env or config\n const credentials = this.getCredentials(config);\n if (config.env?.AIDER_MODEL) {\n args.push('--model', config.env.AIDER_MODEL);\n }\n\n // Default to Claude if anthropic key is available\n if (credentials.anthropicKey && !config.env?.AIDER_MODEL) {\n args.push('--model', 'claude-3-5-sonnet-20241022');\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 // Aider supports multiple backends\n if (credentials.anthropicKey) {\n env.ANTHROPIC_API_KEY = credentials.anthropicKey;\n }\n\n if (credentials.openaiKey) {\n env.OPENAI_API_KEY = credentials.openaiKey;\n }\n\n if (credentials.googleKey) {\n env.GOOGLE_API_KEY = credentials.googleKey;\n }\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 * 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 } 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// 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 */\nexport const ADAPTER_TYPES = {\n claude: ClaudeAdapter,\n gemini: GeminiAdapter,\n codex: CodexAdapter,\n aider: AiderAdapter,\n} as const;\n\nexport type AdapterType = keyof typeof ADAPTER_TYPES;\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"]}
|