{"version":3,"sources":["../src/approval-presets.ts","../src/base-coding-adapter.ts","../src/aider-adapter.ts","../src/claude-adapter.ts","../src/codex-adapter.ts","../src/gemini-adapter.ts","../src/hermes-adapter.ts","../src/opencode-adapter.ts","../src/pattern-loader.ts","../src/index.ts"],"names":["BaseCLIAdapter","exec","join","mkdir","dirname","writeFile","appendFile","hookEntry","settingsHooks","pino"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Approval Presets\n *\n * Unified preset system for controlling tool permissions across all supported\n * coding agent CLIs. Each preset translates to the correct per-CLI config\n * format (JSON settings files, CLI flags, env vars).\n */\n\nimport type { AdapterType } from './base-coding-adapter';\n\nlet _autonomousSandboxWarningLogged = false;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type ToolCategory =\n  | 'file_read'\n  | 'file_write'\n  | 'shell'\n  | 'web'\n  | 'agent'\n  | 'planning'\n  | 'user_interaction';\n\nexport type RiskLevel = 'low' | 'medium' | 'high';\n\nexport type ApprovalPreset =\n  | 'readonly'\n  | 'standard'\n  | 'permissive'\n  | 'autonomous';\n\nexport interface ToolCategoryInfo {\n  category: ToolCategory;\n  risk: RiskLevel;\n  description: string;\n}\n\nexport interface PresetDefinition {\n  preset: ApprovalPreset;\n  description: string;\n  autoApprove: ToolCategory[];\n  requireApproval: ToolCategory[];\n  blocked: ToolCategory[];\n}\n\nexport interface ApprovalConfig {\n  preset: ApprovalPreset;\n  cliFlags: string[];\n  workspaceFiles: Array<{\n    relativePath: string;\n    content: string;\n    format: 'json' | 'yaml' | 'toml';\n  }>;\n  envVars: Record<string, string>;\n  summary: string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Constants\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const TOOL_CATEGORIES: ToolCategoryInfo[] = [\n  {\n    category: 'file_read',\n    risk: 'low',\n    description: 'Read files, search, list directories',\n  },\n  {\n    category: 'file_write',\n    risk: 'medium',\n    description: 'Write, edit, and create files',\n  },\n  { category: 'shell', risk: 'high', description: 'Execute shell commands' },\n  { category: 'web', risk: 'medium', description: 'Web search and fetch' },\n  {\n    category: 'agent',\n    risk: 'medium',\n    description: 'Spawn sub-agents, skills, MCP tools',\n  },\n  {\n    category: 'planning',\n    risk: 'low',\n    description: 'Task planning and todo management',\n  },\n  {\n    category: 'user_interaction',\n    risk: 'low',\n    description: 'Ask user questions',\n  },\n];\n\nexport const PRESET_DEFINITIONS: PresetDefinition[] = [\n  {\n    preset: 'readonly',\n    description: 'Read-only. Safe for auditing.',\n    autoApprove: ['file_read', 'planning', 'user_interaction'],\n    requireApproval: [],\n    blocked: ['file_write', 'shell', 'web', 'agent'],\n  },\n  {\n    preset: 'standard',\n    description: 'Standard dev. Reads + web auto, writes/shell prompt.',\n    autoApprove: ['file_read', 'planning', 'user_interaction', 'web'],\n    requireApproval: ['file_write', 'shell', 'agent'],\n    blocked: [],\n  },\n  {\n    preset: 'permissive',\n    description: 'File ops auto-approved, shell still prompts.',\n    autoApprove: [\n      'file_read',\n      'file_write',\n      'planning',\n      'user_interaction',\n      'web',\n      'agent',\n    ],\n    requireApproval: ['shell'],\n    blocked: [],\n  },\n  {\n    preset: 'autonomous',\n    description: 'Everything auto-approved. Use with sandbox.',\n    autoApprove: [\n      'file_read',\n      'file_write',\n      'shell',\n      'web',\n      'agent',\n      'planning',\n      'user_interaction',\n    ],\n    requireApproval: [],\n    blocked: [],\n  },\n];\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Per-CLI Tool Category Mappings\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const CLAUDE_TOOL_CATEGORIES: Record<string, ToolCategory> = {\n  // file_read\n  Read: 'file_read',\n  Grep: 'file_read',\n  Glob: 'file_read',\n  LS: 'file_read',\n  NotebookRead: 'file_read',\n  // file_write\n  Write: 'file_write',\n  Edit: 'file_write',\n  MultiEdit: 'file_write',\n  NotebookEdit: 'file_write',\n  // shell\n  Bash: 'shell',\n  BashOutput: 'shell',\n  KillShell: 'shell',\n  // web\n  WebSearch: 'web',\n  WebFetch: 'web',\n  // agent\n  Task: 'agent',\n  Skill: 'agent',\n  // planning\n  TodoWrite: 'planning',\n  // user_interaction\n  AskUserQuestion: 'user_interaction',\n};\n\nexport const GEMINI_TOOL_CATEGORIES: Record<string, ToolCategory> = {\n  // file_read\n  read_file: 'file_read',\n  read_many_files: 'file_read',\n  list_directory: 'file_read',\n  glob: 'file_read',\n  search_file_content: 'file_read',\n  // file_write\n  write_file: 'file_write',\n  replace: 'file_write',\n  // shell\n  run_shell_command: 'shell',\n  // web\n  web_fetch: 'web',\n  google_web_search: 'web',\n  // agent\n  activate_skill: 'agent',\n  get_internal_docs: 'agent',\n  // planning\n  save_memory: 'planning',\n  write_todos: 'planning',\n  // user_interaction\n  ask_user: 'user_interaction',\n};\n\nexport const CODEX_TOOL_CATEGORIES: Record<string, ToolCategory> = {\n  // shell (codex uses shell for most operations)\n  exec_command: 'shell',\n  write_stdin: 'shell',\n  shell_command: 'shell',\n  // file_write\n  apply_patch: 'file_write',\n  // file_read\n  grep_files: 'file_read',\n  read_file: 'file_read',\n  list_dir: 'file_read',\n  // web\n  web_search: 'web',\n  view_image: 'web',\n  // agent\n  spawn_agent: 'agent',\n  send_input: 'agent',\n  resume_agent: 'agent',\n  wait: 'agent',\n  close_agent: 'agent',\n  // planning\n  update_plan: 'planning',\n  // user_interaction\n  request_user_input: 'user_interaction',\n};\n\nexport const AIDER_COMMAND_CATEGORIES: Record<string, ToolCategory> = {\n  // file_read\n  '/read-only': 'file_read',\n  '/ls': 'file_read',\n  '/map': 'file_read',\n  '/map-refresh': 'file_read',\n  '/tokens': 'file_read',\n  '/diff': 'file_read',\n  '/context': 'file_read',\n  // file_write\n  '/add': 'file_write',\n  '/drop': 'file_write',\n  '/edit': 'file_write',\n  '/code': 'file_write',\n  '/architect': 'file_write',\n  '/undo': 'file_write',\n  // shell\n  '/run': 'shell',\n  '/test': 'shell',\n  '/lint': 'shell',\n  '/git': 'shell',\n  // web\n  '/web': 'web',\n  // planning\n  '/ask': 'planning',\n  // user_interaction\n  '/voice': 'user_interaction',\n  '/help': 'user_interaction',\n  // config/other\n  '/model': 'planning',\n  '/settings': 'planning',\n  '/commit': 'file_write',\n  '/clear': 'planning',\n  '/reset': 'planning',\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Per-CLI Config Generators\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction getToolsForCategories(\n  mapping: Record<string, ToolCategory>,\n  categories: ToolCategory[]\n): string[] {\n  return Object.entries(mapping)\n    .filter(([, cat]) => categories.includes(cat))\n    .map(([tool]) => tool);\n}\n\nexport function generateClaudeApprovalConfig(\n  preset: ApprovalPreset\n): ApprovalConfig {\n  const def = getPresetDefinition(preset);\n\n  const allowTools = getToolsForCategories(\n    CLAUDE_TOOL_CATEGORIES,\n    def.autoApprove\n  );\n  const denyTools = getToolsForCategories(CLAUDE_TOOL_CATEGORIES, def.blocked);\n\n  const settings: Record<string, unknown> = {\n    permissions: {} as Record<string, unknown>,\n  };\n\n  const permissions = settings.permissions as Record<string, unknown>;\n  if (allowTools.length > 0) {\n    permissions.allow = allowTools;\n  }\n  if (denyTools.length > 0) {\n    permissions.deny = denyTools;\n  }\n\n  // Autonomous mode: enable sandbox and auto-allow bash\n  if (preset === 'autonomous') {\n    settings.sandbox = {\n      enabled: true,\n      autoAllowBashIfSandboxed: true,\n    };\n  }\n\n  const cliFlags: string[] = [];\n\n  // Permissive: auto-accept file edits via --permission-mode acceptEdits\n  // (from leaked source: valid modes are default, plan, acceptEdits, bypassPermissions, dontAsk)\n  if (preset === 'permissive') {\n    cliFlags.push('--permission-mode', 'acceptEdits');\n  }\n\n  // Autonomous: skip all permission prompts and pass all tools\n  if (preset === 'autonomous') {\n    cliFlags.push('--dangerously-skip-permissions');\n    if (!_autonomousSandboxWarningLogged) {\n      console.warn(\n        'Autonomous preset uses --dangerously-skip-permissions. Ensure agents run in a sandboxed environment.'\n      );\n      _autonomousSandboxWarningLogged = true;\n    }\n  }\n\n  return {\n    preset,\n    cliFlags,\n    workspaceFiles: [\n      {\n        relativePath: '.claude/settings.json',\n        content: JSON.stringify(settings, null, 2),\n        format: 'json',\n      },\n    ],\n    envVars: {},\n    summary: `Claude Code: ${def.description}`,\n  };\n}\n\nexport function generateGeminiApprovalConfig(\n  preset: ApprovalPreset\n): ApprovalConfig {\n  const def = getPresetDefinition(preset);\n  const cliFlags: string[] = [];\n\n  const allowedTools = getToolsForCategories(\n    GEMINI_TOOL_CATEGORIES,\n    def.autoApprove\n  );\n  const excludeTools = getToolsForCategories(\n    GEMINI_TOOL_CATEGORIES,\n    def.blocked\n  );\n\n  let approvalMode: string;\n\n  switch (preset) {\n    case 'readonly':\n      approvalMode = 'plan';\n      cliFlags.push('--approval-mode', 'plan');\n      break;\n    case 'standard':\n      approvalMode = 'default';\n      break;\n    case 'permissive':\n      approvalMode = 'auto_edit';\n      cliFlags.push('--approval-mode', 'auto_edit');\n      break;\n    case 'autonomous':\n      approvalMode = 'auto_edit';\n      cliFlags.push('-y');\n      break;\n  }\n\n  const settings: Record<string, unknown> = {\n    general: {\n      defaultApprovalMode: approvalMode,\n    },\n    tools: {} as Record<string, unknown>,\n  };\n\n  const tools = settings.tools as Record<string, unknown>;\n  if (allowedTools.length > 0) {\n    tools.allowed = allowedTools;\n  }\n  if (excludeTools.length > 0) {\n    tools.exclude = excludeTools;\n  }\n\n  return {\n    preset,\n    cliFlags,\n    workspaceFiles: [\n      {\n        relativePath: '.gemini/settings.json',\n        content: JSON.stringify(settings, null, 2),\n        format: 'json',\n      },\n    ],\n    envVars: {},\n    summary: `Gemini CLI: ${def.description}`,\n  };\n}\n\nexport function generateCodexApprovalConfig(\n  preset: ApprovalPreset\n): ApprovalConfig {\n  const cliFlags: string[] = [];\n\n  let approvalPolicy: string;\n  let sandboxMode: string;\n  let webSearch: boolean;\n\n  switch (preset) {\n    case 'readonly':\n      approvalPolicy = 'untrusted';\n      sandboxMode = 'workspace-read';\n      webSearch = false;\n      cliFlags.push('--sandbox', 'workspace-read', '-a', 'untrusted');\n      break;\n    case 'standard':\n      approvalPolicy = 'on-failure';\n      sandboxMode = 'workspace-write';\n      webSearch = true;\n      cliFlags.push('--sandbox', 'workspace-write');\n      break;\n    case 'permissive':\n      approvalPolicy = 'on-request';\n      sandboxMode = 'workspace-write';\n      webSearch = true;\n      cliFlags.push('-a', 'on-request');\n      break;\n    case 'autonomous':\n      approvalPolicy = 'never';\n      sandboxMode = 'workspace-write';\n      webSearch = true;\n      cliFlags.push('--full-auto');\n      break;\n  }\n\n  const config = {\n    approval_policy: approvalPolicy,\n    sandbox_mode: sandboxMode,\n    tools: {\n      web_search: webSearch,\n    },\n  };\n\n  return {\n    preset,\n    cliFlags,\n    workspaceFiles: [\n      {\n        relativePath: '.codex/config.json',\n        content: JSON.stringify(config, null, 2),\n        format: 'json',\n      },\n    ],\n    envVars: {},\n    summary: `Codex: ${getPresetDefinition(preset).description}`,\n  };\n}\n\nexport function generateAiderApprovalConfig(\n  preset: ApprovalPreset\n): ApprovalConfig {\n  const def = getPresetDefinition(preset);\n  const cliFlags: string[] = [];\n  const lines: string[] = [];\n\n  switch (preset) {\n    case 'readonly':\n      lines.push('yes-always: false');\n      lines.push('no-auto-commits: true');\n      cliFlags.push('--no-auto-commits');\n      break;\n    case 'standard':\n      lines.push('yes-always: false');\n      break;\n    case 'permissive':\n      lines.push('yes-always: true');\n      cliFlags.push('--yes-always');\n      break;\n    case 'autonomous':\n      lines.push('yes-always: true');\n      cliFlags.push('--yes-always');\n      break;\n  }\n\n  return {\n    preset,\n    cliFlags,\n    workspaceFiles: [\n      {\n        relativePath: '.aider.conf.yml',\n        content: `${lines.join('\\n')}\\n`,\n        format: 'yaml',\n      },\n    ],\n    envVars: {},\n    summary: `Aider: ${def.description}`,\n  };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\nexport function generateHermesApprovalConfig(\n  preset: ApprovalPreset\n): ApprovalConfig {\n  const def = getPresetDefinition(preset);\n\n  // Hermes CLI handles dangerous command approvals internally and does not\n  // currently expose a stable approval-policy CLI/file matrix like other adapters.\n  return {\n    preset,\n    cliFlags: [],\n    workspaceFiles: [],\n    envVars: {},\n    summary: `Hermes Agent: ${def.description}`,\n  };\n}\n\n// Public API\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function generateApprovalConfig(\n  adapterType: AdapterType,\n  preset: ApprovalPreset\n): ApprovalConfig {\n  switch (adapterType) {\n    case 'claude':\n      return generateClaudeApprovalConfig(preset);\n    case 'gemini':\n      return generateGeminiApprovalConfig(preset);\n    case 'codex':\n      return generateCodexApprovalConfig(preset);\n    case 'aider':\n      return generateAiderApprovalConfig(preset);\n    case 'hermes':\n      return generateHermesApprovalConfig(preset);\n    case 'opencode':\n      return generateOpencodeApprovalConfig(preset);\n    default:\n      throw new Error(`Unknown adapter type: ${adapterType}`);\n  }\n}\n\n/**\n * OpenCode approval-preset → CLI flag mapping.\n *\n * OpenCode has a single permission switch: `--dangerously-skip-permissions`\n * (a flag of the `run` subcommand). Either you accept all tool actions\n * unsupervised or you don't. The readonly / standard / permissive\n * presets map to \"no flag\" (opencode falls back to its own interactive\n * permission prompts); only `autonomous` opts into the bypass.\n *\n * Tools are not declared explicitly to opencode at spawn time — it picks\n * them up from its built-in registry and the loaded plugins. `tools: {}`\n * is kept for shape-consistency with the other adapters.\n */\nexport function generateOpencodeApprovalConfig(\n  preset: ApprovalPreset\n): ApprovalConfig {\n  const cliFlags: string[] = [];\n  let summary: string;\n  switch (preset) {\n    case 'autonomous':\n      cliFlags.push('--dangerously-skip-permissions');\n      summary =\n        'OpenCode: all tool actions auto-approved (--dangerously-skip-permissions)';\n      break;\n    case 'readonly':\n      summary = 'OpenCode: interactive permissions (read-heavy session)';\n      break;\n    case 'standard':\n      summary = 'OpenCode: interactive permissions (standard session)';\n      break;\n    case 'permissive':\n      summary = 'OpenCode: interactive permissions (permissive session)';\n      break;\n  }\n  return {\n    preset,\n    cliFlags,\n    workspaceFiles: [],\n    envVars: {},\n    summary,\n  };\n}\n\nexport function listPresets(): PresetDefinition[] {\n  return [...PRESET_DEFINITIONS];\n}\n\nexport function getPresetDefinition(preset: ApprovalPreset): PresetDefinition {\n  const def = PRESET_DEFINITIONS.find((d) => d.preset === preset);\n  if (!def) {\n    throw new Error(`Unknown preset: ${preset}`);\n  }\n  return def;\n}\n","/**\n * Base Coding Agent Adapter\n *\n * Extends pty-manager's BaseCLIAdapter with credential handling\n * for AI coding agents.\n */\n\nimport { exec } from 'node:child_process';\nimport { appendFile, mkdir, writeFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport type { SpawnConfig } from 'adapter-types';\nimport { BaseCLIAdapter } from 'adapter-types';\nimport {\n  type ApprovalConfig,\n  type ApprovalPreset,\n  generateApprovalConfig,\n} from './approval-presets';\n\n/**\n * Supported adapter types\n */\nexport type AdapterType =\n  | 'claude'\n  | 'gemini'\n  | 'codex'\n  | 'aider'\n  | 'hermes'\n  | 'opencode';\n\n/**\n * Authentication status for a CLI agent's subscription/login.\n */\nexport interface AuthStatus {\n  /** Whether auth status could be determined */\n  status: 'authenticated' | 'unauthenticated' | 'unknown';\n  /** Auth method if authenticated (e.g. \"subscription\", \"api_key\", \"oauth\") */\n  method?: string;\n  /** Human-readable detail (e.g. email, account name) */\n  detail?: string;\n  /** Instruction to authenticate if not logged in */\n  loginHint?: string;\n}\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  /** Override Anthropic API base URL (e.g. cloud proxy) */\n  anthropicBaseUrl?: string;\n  /** Override OpenAI API base URL (e.g. cloud proxy) */\n  openaiBaseUrl?: string;\n  /**\n   * Extra TOML appended to the adapter's generated config file when the\n   * adapter writes one (currently: Codex's per-spawn `config.toml` under\n   * the isolated `CODEX_HOME`).\n   *\n   * Use this when the orchestrator needs to set CLI-specific knobs the\n   * adapter does not model directly — for example disabling Codex's\n   * experimental Responses API WebSocket transport when routing through\n   * a proxy that does not support WebSocket upgrades:\n   *\n   *   extraConfigToml: '[features]\\nresponses_websockets_v2 = false\\n'\n   *\n   * The string is appended verbatim with a leading newline; no merging\n   * or validation is performed. Adapters that don't generate a config\n   * file ignore this field.\n   */\n  extraConfigToml?: string;\n}\n\n/**\n * Installation information for a CLI tool\n */\nexport interface InstallationInfo {\n  /** Command to install the CLI (e.g., \"npm install -g @anthropic-ai/claude-code\") */\n  command: string;\n  /** Alternative installation methods */\n  alternatives?: string[];\n  /** URL to installation docs */\n  docsUrl: string;\n  /** Minimum required version (if known) */\n  minVersion?: string;\n}\n\n/**\n * Model tier recommendations for an adapter\n */\nexport interface ModelRecommendations {\n  /** Most capable model for complex tasks */\n  powerful: string;\n  /** Fastest/cheapest model for simple tasks */\n  fast: string;\n}\n\n/**\n * Describes a file that a coding agent CLI reads from the workspace.\n * Orchestration systems use this to write instructions/config before spawning agents.\n */\nexport interface AgentFileDescriptor {\n  /** File path relative to workspace root (e.g., \"CLAUDE.md\", \".aider.conf.yml\") */\n  relativePath: string;\n  /** Human-readable description of what this file does */\n  description: string;\n  /** Whether the CLI reads this file automatically on startup */\n  autoLoaded: boolean;\n  /** File category */\n  type: 'memory' | 'config' | 'rules';\n  /** File format */\n  format: 'markdown' | 'yaml' | 'json' | 'text';\n}\n\n/**\n * Options for writing a memory file into a workspace\n */\nexport interface WriteMemoryOptions {\n  /** Custom file name override (default: adapter's primary memory file) */\n  fileName?: string;\n  /** Append to existing file instead of overwriting */\n  append?: boolean;\n}\n\n/**\n * Extended config with credentials and mode support\n */\nexport interface CodingAgentConfig extends SpawnConfig {\n  adapterConfig?: AgentCredentials & {\n    /**\n     * Run in interactive mode (skip --print/--quiet/--non-interactive flags).\n     * Use this when you want the full interactive CLI experience.\n     */\n    interactive?: boolean;\n    /**\n     * Preferred provider for multi-provider adapters (e.g., Aider).\n     * Only the API key for this provider is passed, letting the CLI\n     * pick its best model for that provider automatically.\n     */\n    provider?: 'anthropic' | 'openai' | 'google';\n    /**\n     * Approval preset controlling tool permissions.\n     * Translates to CLI-specific config files and flags.\n     */\n    approvalPreset?: ApprovalPreset;\n    /**\n     * Claude-only: enable hook marker telemetry parsing.\n     * Requires Claude hook config that emits PARALLAX_CLAUDE_HOOK lines.\n     */\n    claudeHookTelemetry?: boolean;\n    /**\n     * Claude-only: override hook marker prefix token.\n     */\n    claudeHookMarkerPrefix?: string;\n    /**\n     * Gemini-only: enable hook marker telemetry parsing.\n     * Requires Gemini hook config that emits PARALLAX_GEMINI_HOOK markers.\n     */\n    geminiHookTelemetry?: boolean;\n    /**\n     * Gemini-only: override hook marker prefix token.\n     */\n    geminiHookMarkerPrefix?: string;\n  } & Record<string, unknown>;\n}\n\n/**\n * Base class for AI coding agent adapters\n */\nexport abstract class BaseCodingAdapter extends BaseCLIAdapter {\n  /**\n   * Coding agent CLIs use TUI menus that require arrow-key navigation.\n   */\n  override readonly usesTuiMenus: boolean = true;\n\n  /**\n   * Ms of output silence after detectReady match before emitting session_ready.\n   * Allows TUI rendering (status bar, shortcuts, update notices) to complete\n   * before the orchestrator sends input.\n   */\n  readonly readySettleMs: number = 300;\n\n  /**\n   * Installation information for this CLI tool\n   */\n  abstract readonly installation: InstallationInfo;\n\n  /**\n   * Workspace files this CLI reads automatically.\n   * Orchestration systems use this to know where to write instructions/config\n   * before spawning an agent.\n   */\n  abstract getWorkspaceFiles(): AgentFileDescriptor[];\n\n  /**\n   * The primary memory file for this CLI (the one it reads for project instructions).\n   * Returns the relativePath of the first 'memory' type file from getWorkspaceFiles().\n   */\n  get memoryFilePath(): string {\n    const memoryFile = this.getWorkspaceFiles().find(\n      (f) => f.type === 'memory'\n    );\n    if (!memoryFile) {\n      throw new Error(`${this.displayName} adapter has no memory file defined`);\n    }\n    return memoryFile.relativePath;\n  }\n\n  /**\n   * Get credentials from config\n   */\n  protected getCredentials(config: SpawnConfig): AgentCredentials {\n    const adapterConfig = config.adapterConfig as AgentCredentials | undefined;\n    return adapterConfig || {};\n  }\n\n  /**\n   * Check if interactive mode is enabled.\n   * When true, skip non-interactive flags (--print, --quiet, etc.)\n   */\n  protected isInteractive(config: SpawnConfig): boolean {\n    const adapterConfig = config.adapterConfig as\n      | { interactive?: boolean }\n      | undefined;\n    return adapterConfig?.interactive === true;\n  }\n\n  /**\n   * Get recommended models for this adapter.\n   * Returns powerful (most capable) and fast (cheapest/fastest) model names.\n   */\n  abstract getRecommendedModels(\n    credentials?: AgentCredentials\n  ): ModelRecommendations;\n\n  /**\n   * Check whether the CLI is authenticated via its subscription/login.\n   * Override in subclasses that support a status check command.\n   * Default: returns 'unknown' (no way to check).\n   */\n  async checkAuthStatus(): Promise<AuthStatus> {\n    return { status: 'unknown' };\n  }\n\n  /**\n   * Trigger the CLI's authentication flow.\n   * Returns info about what was launched (URL to open, instructions, etc.).\n   * Override in subclasses. Default: returns null (no auth flow available).\n   */\n  async triggerAuth(): Promise<{\n    launched: boolean;\n    /** URL the user should open (if browser-based auth) */\n    url?: string;\n    /** Device code to enter (Codex) */\n    deviceCode?: string;\n    /** Human-readable instructions */\n    instructions: string;\n  } | null> {\n    return null;\n  }\n\n  /**\n   * Helper: run a command and return stdout, or null on any failure.\n   */\n  protected execQuiet(\n    command: string,\n    timeoutMs = 5000,\n  ): Promise<string | null> {\n    return new Promise((resolve) => {\n      exec(command, { timeout: timeoutMs }, (err, stdout, stderr) => {\n        // Return output even on non-zero exit (e.g. \"Not logged in\" exits 1)\n        const output = (stdout || stderr || '').trim();\n        if (err && !output) {\n          resolve(null);\n          return;\n        }\n        resolve(output || null);\n      });\n    });\n  }\n\n  /**\n   * Override stripAnsi to handle TUI cursor movement codes, spinner/box-drawing\n   * characters, bare control characters, and extra whitespace.\n   *\n   * TUI CLIs (Claude Code, Gemini CLI, Codex) use cursor positioning\n   * sequences instead of literal spaces, and render decorative Unicode\n   * characters (spinners, box-drawing). All of these must be stripped so\n   * adapter detection methods (detectReady, detectTaskComplete, etc.) can\n   * match visible text with their regex patterns.\n   *\n   * Note: ❯ and › are preserved — they are prompt indicators used by\n   * detectReady / detectTaskComplete.\n   */\n  protected stripAnsi(str: string): string {\n    // Cursor forward/back/up/down, column positioning, line movement\n    let result = str.replace(/\\x1b\\[\\d*[CDABGdEF]/g, ' ');\n    // Absolute positioning: \\x1b[r;cH and \\x1b[r;cf\n    result = result.replace(/\\x1b\\[\\d*(?:;\\d+)?[Hf]/g, ' ');\n    // Erase display/line (preserve word boundaries)\n    result = result.replace(/\\x1b\\[\\d*[JK]/g, ' ');\n\n    // Strip remaining ANSI via parent\n    result = super.stripAnsi(result);\n\n    // Strip bare control characters (CR, backspace, bell, etc.)\n    // Preserves \\x09 (tab) and \\x0a (newline) only.\n    // eslint-disable-next-line no-control-regex\n    result = result.replace(/[\\x00-\\x08\\x0b-\\x0d\\x0e-\\x1f\\x7f]/g, '');\n\n    // Normalize non-breaking space (\\xa0) to regular space.\n    // Claude Code TUI emits \\xa0 after the ❯ prompt.\n    result = result.replace(/\\xa0/g, ' ');\n\n    // Strip TUI box-drawing, spinner, and decorative Unicode characters.\n    // Keeps ❯ and › (prompt indicators) and ◇ (Gemini ready signal).\n    result = result.replace(\n      /[│╭╰╮╯─═╌║╔╗╚╝╠╣╦╩╬┌┐└┘├┤┬┴┼●○❮▶◀⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏⣾⣽⣻⢿⡿⣟⣯⣷✻✶✳✢⏺←→↑↓⬆⬇◆▪▫■□▲△▼▽◈⟨⟩⌘⏎⏏⌫⌦⇧⇪⌥]/g,\n      ' '\n    );\n\n    // Collapse multiple spaces\n    result = result.replace(/ {2,}/g, ' ');\n\n    return result;\n  }\n\n  /**\n   * Generate hook telemetry protocol configuration.\n   * Returns null by default — only Claude adapter supports hooks.\n   */\n  getHookTelemetryProtocol(_options?: {\n    scriptPath?: string;\n    markerPrefix?: string;\n    httpUrl?: string;\n    sessionId?: string;\n  }): {\n    markerPrefix: string;\n    scriptPath: string;\n    scriptContent: string;\n    settingsHooks: Record<string, unknown>;\n  } | null {\n    return null;\n  }\n\n  /**\n   * Override detectExit to include installation instructions\n   */\n  detectExit(output: string): {\n    exited: boolean;\n    code?: number;\n    error?: string;\n  } {\n    if (\n      output.includes('Command not found') ||\n      output.includes('command not found')\n    ) {\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(\n      /^(Thinking|Working|Reading|Writing|Processing|Generating)\\.+$/gm,\n      ''\n    );\n\n    // Trim whitespace\n    content = content.trim();\n\n    return content;\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────────\n  // Loading / Active-Work Detection\n  // ─────────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Detect if the CLI is actively loading/processing (thinking spinner,\n   * file reading, model streaming, etc.). When true, stall detection is\n   * suppressed because the agent is provably working.\n   */\n  abstract detectLoading(output: string): boolean;\n\n  // ─────────────────────────────────────────────────────────────────────────────\n  // Task Completion Detection\n  // ─────────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Detect if the CLI has completed a task and returned to its idle prompt.\n   * More specific than detectReady() — matches high-confidence completion indicators\n   * (e.g. duration summaries, explicit \"done\" messages) alongside the idle prompt.\n   *\n   * Used as a fast-path in stall detection to avoid expensive LLM classifier calls.\n   */\n  abstract detectTaskComplete(output: string): boolean;\n\n  // ─────────────────────────────────────────────────────────────────────────────\n  // Approval Presets\n  // ─────────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Extract the approval preset from a spawn config, if set.\n   */\n  protected getApprovalPreset(config: SpawnConfig): ApprovalPreset | undefined {\n    const adapterConfig = config.adapterConfig as\n      | { approvalPreset?: ApprovalPreset }\n      | undefined;\n    return adapterConfig?.approvalPreset;\n  }\n\n  /**\n   * Generate the approval config for this adapter, if a preset is set.\n   */\n  getApprovalConfig(config: SpawnConfig): ApprovalConfig | null {\n    const preset = this.getApprovalPreset(config);\n    if (!preset) return null;\n    return generateApprovalConfig(\n      this.adapterType as 'claude' | 'gemini' | 'codex' | 'aider' | 'hermes',\n      preset\n    );\n  }\n\n  /**\n   * Write approval config files to a workspace directory.\n   * Returns the list of files written (absolute paths).\n   */\n  async writeApprovalConfig(\n    workspacePath: string,\n    config: SpawnConfig\n  ): Promise<string[]> {\n    const approvalConfig = this.getApprovalConfig(config);\n    if (!approvalConfig) return [];\n\n    const written: string[] = [];\n    for (const file of approvalConfig.workspaceFiles) {\n      const fullPath = join(workspacePath, file.relativePath);\n      await mkdir(dirname(fullPath), { recursive: true });\n      await writeFile(fullPath, file.content, 'utf-8');\n      written.push(fullPath);\n    }\n    return written;\n  }\n\n  /**\n   * Write content to this agent's memory file in a workspace.\n   * Creates parent directories as needed.\n   *\n   * @param workspacePath - Absolute path to the workspace root\n   * @param content - The memory/instructions content to write\n   * @param options - Optional: custom fileName, append mode\n   * @returns The absolute path of the written file\n   */\n  async writeMemoryFile(\n    workspacePath: string,\n    content: string,\n    options?: WriteMemoryOptions\n  ): Promise<string> {\n    const relativePath = options?.fileName ?? this.memoryFilePath;\n    const fullPath = join(workspacePath, relativePath);\n\n    // Ensure parent directory exists\n    await mkdir(dirname(fullPath), { recursive: true });\n\n    if (options?.append) {\n      await appendFile(fullPath, content, 'utf-8');\n    } else {\n      await writeFile(fullPath, content, 'utf-8');\n    }\n\n    return fullPath;\n  }\n}\n","/**\n * 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  AutoResponseRule,\n  BlockingPromptDetection,\n  LoginDetection,\n  ParsedOutput,\n  SpawnConfig,\n} from 'adapter-types';\nimport {\n  type AgentCredentials,\n  type AgentFileDescriptor,\n  BaseCodingAdapter,\n  type InstallationInfo,\n  type ModelRecommendations,\n} from './base-coding-adapter';\n\nexport class AiderAdapter extends BaseCodingAdapter {\n  readonly adapterType = 'aider';\n  readonly displayName = 'Aider';\n\n  /** Minimal TUI, mostly text output — shorter settle delay */\n  override readonly readySettleMs: number = 200;\n\n  /**\n   * Aider uses plain text [y/n] prompts, NOT TUI arrow-key menus.\n   */\n  override readonly usesTuiMenus: boolean = false;\n\n  readonly installation: InstallationInfo = {\n    command: 'pip install aider-chat',\n    alternatives: [\n      'pipx install aider-chat (isolated install)',\n      'brew install aider (macOS with Homebrew)',\n    ],\n    docsUrl: 'https://aider.chat/docs/install.html',\n    minVersion: '0.50.0',\n  };\n\n  /**\n   * Auto-response rules for Aider CLI.\n   * Aider uses plain text prompts via io.py:832 with (Y)es/(N)o format.\n   * All rules are responseType: 'text' — Aider never uses TUI menus.\n   *\n   * Decline rules come first to override the generic accept patterns.\n   */\n  readonly autoResponseRules: AutoResponseRule[] = [\n    // ── Decline rules (specific, checked first) ────────────────────────\n    {\n      pattern: /allow collection of anonymous analytics/i,\n      type: 'config',\n      response: 'n',\n      responseType: 'text',\n      description: 'Decline Aider telemetry opt-in',\n      safe: true,\n      once: true,\n    },\n    {\n      pattern: /would you like to see what.?s new in this version/i,\n      type: 'config',\n      response: 'n',\n      responseType: 'text',\n      description: 'Decline release notes offer',\n      safe: true,\n      once: true,\n    },\n    {\n      pattern: /open a github issue pre-filled/i,\n      type: 'config',\n      response: 'n',\n      responseType: 'text',\n      description: 'Decline automatic bug report',\n      safe: true,\n    },\n    {\n      pattern: /open documentation url for more info\\?/i,\n      type: 'config',\n      response: 'n',\n      responseType: 'text',\n      description: 'Decline opening Aider documentation for model warnings',\n      safe: true,\n    },\n    // ── File / edit operations ──────────────────────────────────────────\n    {\n      pattern: /add .+ to the chat\\?/i,\n      type: 'permission',\n      response: 'y',\n      responseType: 'text',\n      description: 'Allow Aider to add files to chat context',\n      safe: true,\n    },\n    {\n      pattern: /add url to the chat\\?/i,\n      type: 'permission',\n      response: 'y',\n      responseType: 'text',\n      description: 'Allow Aider to add URL content to chat',\n      safe: true,\n    },\n    {\n      pattern: /create new file\\?/i,\n      type: 'permission',\n      response: 'y',\n      responseType: 'text',\n      description: 'Allow Aider to create new files',\n      safe: true,\n    },\n    {\n      pattern: /allow edits to file/i,\n      type: 'permission',\n      response: 'y',\n      responseType: 'text',\n      description: 'Allow edits to file not yet in chat',\n      safe: true,\n    },\n    {\n      pattern: /edit the files\\?/i,\n      type: 'permission',\n      response: 'y',\n      responseType: 'text',\n      description: 'Accept architect mode edits',\n      safe: true,\n    },\n    // ── Shell operations ────────────────────────────────────────────────\n    {\n      pattern: /run shell commands?\\?/i,\n      type: 'permission',\n      response: 'y',\n      responseType: 'text',\n      description: 'Allow Aider to run shell commands',\n      safe: true,\n    },\n    {\n      pattern: /add command output to the chat\\?/i,\n      type: 'permission',\n      response: 'y',\n      responseType: 'text',\n      description: 'Add shell command output to chat context',\n      safe: true,\n    },\n    {\n      pattern: /add \\d+.*tokens of command output to the chat\\?/i,\n      type: 'permission',\n      response: 'y',\n      responseType: 'text',\n      description: 'Add /run command output to chat context',\n      safe: true,\n    },\n    // ── Setup / maintenance ─────────────────────────────────────────────\n    {\n      pattern: /no git repo found.*create one/i,\n      type: 'config',\n      response: 'y',\n      responseType: 'text',\n      description: 'Create git repo for change tracking',\n      safe: true,\n      once: true,\n    },\n    {\n      pattern: /add .+ to \\.gitignore/i,\n      type: 'config',\n      response: 'y',\n      responseType: 'text',\n      description: 'Update .gitignore with Aider patterns',\n      safe: true,\n      once: true,\n    },\n    {\n      pattern: /run pip install\\?/i,\n      type: 'config',\n      response: 'y',\n      responseType: 'text',\n      description: 'Install missing Python dependencies',\n      safe: true,\n    },\n    {\n      pattern: /install playwright\\?/i,\n      type: 'config',\n      response: 'y',\n      responseType: 'text',\n      description: 'Install Playwright for web scraping',\n      safe: true,\n    },\n    // ── Other safe confirmations ────────────────────────────────────────\n    {\n      pattern: /fix lint errors in/i,\n      type: 'permission',\n      response: 'y',\n      responseType: 'text',\n      description: 'Accept lint error fix suggestion',\n      safe: true,\n    },\n    {\n      pattern: /try to proceed anyway\\?/i,\n      type: 'config',\n      response: 'y',\n      responseType: 'text',\n      description: 'Continue despite context limit warning',\n      safe: true,\n    },\n  ];\n\n  getWorkspaceFiles(): AgentFileDescriptor[] {\n    return [\n      {\n        relativePath: '.aider.conventions.md',\n        description:\n          'Project conventions and instructions read on startup (--read flag)',\n        autoLoaded: true,\n        type: 'memory',\n        format: 'markdown',\n      },\n      {\n        relativePath: '.aider.conf.yml',\n        description:\n          'Project-scoped Aider configuration (model, flags, options)',\n        autoLoaded: true,\n        type: 'config',\n        format: 'yaml',\n      },\n      {\n        relativePath: '.aiderignore',\n        description: 'Gitignore-style file listing paths Aider should not edit',\n        autoLoaded: true,\n        type: 'rules',\n        format: 'text',\n      },\n    ];\n  }\n\n  getRecommendedModels(credentials?: AgentCredentials): ModelRecommendations {\n    if (credentials?.anthropicKey) {\n      return {\n        powerful: 'anthropic/claude-sonnet-4-20250514',\n        fast: 'anthropic/claude-haiku-4-5-20251001',\n      };\n    }\n    if (credentials?.openaiKey) {\n      return {\n        powerful: 'openai/o3',\n        fast: 'openai/gpt-4o-mini',\n      };\n    }\n    if (credentials?.googleKey) {\n      return {\n        powerful: 'gemini/gemini-3-pro',\n        fast: 'gemini/gemini-3-flash',\n      };\n    }\n    // Default to Anthropic\n    return {\n      powerful: 'anthropic/claude-sonnet-4-20250514',\n      fast: 'anthropic/claude-haiku-4-5-20251001',\n    };\n  }\n\n  getCommand(): string {\n    return 'aider';\n  }\n\n  getArgs(config: SpawnConfig): string[] {\n    const args: string[] = [];\n    const interactive = this.isInteractive(config);\n\n    if (!interactive) {\n      // Use auto-commits to avoid manual git operations in automation mode.\n      args.push('--auto-commits');\n\n      // Disable pretty output for easier parsing (automation mode only).\n      args.push('--no-pretty');\n      args.push('--no-show-diffs');\n    }\n\n    // Suppress model warnings when using a proxy (keys won't match expected format)\n    const creds = this.getCredentials(config);\n    if (creds.anthropicBaseUrl || creds.openaiBaseUrl) {\n      args.push('--no-show-model-warnings');\n    }\n\n    // Set working directory via --file flag prefix\n    // Aider uses current directory, so we rely on PTY cwd\n\n    // Model: explicit > provider metadata > inferred from credentials > aider default\n    // Aliases (sonnet, 4o, gemini) are maintained by Aider and auto-update\n    const provider = (config.adapterConfig as { provider?: string } | undefined)\n      ?.provider;\n    const credentials = this.getCredentials(config);\n    if (config.env?.AIDER_MODEL) {\n      args.push('--model', config.env.AIDER_MODEL);\n    } else if (provider === 'anthropic' || (!provider && credentials.anthropicKey && !credentials.googleKey)) {\n      args.push('--model', 'sonnet');\n    } else if (provider === 'openai' || (!provider && credentials.openaiKey && !credentials.anthropicKey)) {\n      args.push('--model', '4o');\n    } else if (provider === 'google' || (!provider && credentials.googleKey)) {\n      args.push('--model', 'gemini');\n    }\n    // No provider or keys → don't force a model, let aider use its own default\n\n    // API keys via --api-key flag only in automation mode.\n    if (!interactive) {\n      if (credentials.anthropicKey)\n        args.push('--api-key', `anthropic=${credentials.anthropicKey}`);\n      if (credentials.openaiKey)\n        args.push('--api-key', `openai=${credentials.openaiKey}`);\n      if (credentials.googleKey)\n        args.push('--api-key', `gemini=${credentials.googleKey}`);\n\n      // Base URL override (e.g. cloud proxy) — CLI flag for automation mode\n      if (credentials.openaiBaseUrl) {\n        args.push('--openai-api-base', credentials.openaiBaseUrl);\n      }\n    }\n\n    // Append approval preset CLI flags\n    const approvalConfig = this.getApprovalConfig(config);\n    if (approvalConfig) {\n      args.push(...approvalConfig.cliFlags);\n    }\n\n    return args;\n  }\n\n  getEnv(config: SpawnConfig): Record<string, string> {\n    // API keys are passed via --api-key args in automation mode,\n    // but env vars are needed for interactive mode and base URL overrides.\n    const env: Record<string, string> = {};\n    const credentials = this.getCredentials(config);\n\n    // When a proxy base URL is set, litellm needs both provider keys\n    // and base URLs since it routes by model name (anthropic models\n    // use ANTHROPIC_API_KEY, openai models use OPENAI_API_KEY).\n    if (credentials.anthropicBaseUrl) {\n      env.ANTHROPIC_API_BASE = credentials.anthropicBaseUrl;\n    }\n    if (credentials.openaiBaseUrl) {\n      env.OPENAI_API_BASE = credentials.openaiBaseUrl;\n    }\n    // Set API keys via env for interactive mode (--api-key flags only work in automation)\n    if (this.isInteractive(config)) {\n      if (credentials.anthropicKey) {\n        env.ANTHROPIC_API_KEY = credentials.anthropicKey;\n      }\n      if (credentials.openaiKey) {\n        env.OPENAI_API_KEY = credentials.openaiKey;\n      }\n      if (credentials.googleKey) {\n        env.GEMINI_API_KEY = credentials.googleKey;\n      }\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:\n          'Set ANTHROPIC_API_KEY or OPENAI_API_KEY environment variable',\n      };\n    }\n\n    // Check for invalid API key\n    if (\n      stripped.includes('Invalid API key') ||\n      stripped.includes('Authentication failed') ||\n      stripped.includes('Unauthorized')\n    ) {\n      return {\n        required: true,\n        type: 'api_key',\n        instructions: 'API key is invalid - please check your credentials',\n      };\n    }\n\n    // OpenRouter OAuth login offer (onboarding.py:94)\n    if (/login to openrouter or create a free account/i.test(stripped)) {\n      return {\n        required: true,\n        type: 'oauth',\n        instructions:\n          'Aider offering OpenRouter OAuth login — provide API keys to skip',\n      };\n    }\n\n    // OpenRouter OAuth browser flow in progress (onboarding.py:311)\n    if (\n      /please open this url in your browser to connect aider with openrouter/i.test(\n        stripped\n      ) ||\n      /waiting up to 5 minutes for you to finish in the browser/i.test(stripped)\n    ) {\n      const urlMatch = stripped.match(/https?:\\/\\/[^\\s]+/);\n      return {\n        required: true,\n        type: 'browser',\n        url: urlMatch ? urlMatch[0] : undefined,\n        instructions: 'Complete OpenRouter authentication in browser',\n      };\n    }\n\n    return { required: false };\n  }\n\n  /**\n   * Detect blocking prompts specific to Aider CLI.\n   *\n   * IMPORTANT: Does NOT fall back to base class detection because the base\n   * class has broad heuristics (any line ending with \"?\") that trigger on\n   * normal LLM output. Aider uses --yes-always to auto-accept most prompts,\n   * so we only need to detect auth/login and the few prompts that bypass it.\n   *\n   * Source: io.py, onboarding.py, base_coder.py, report.py\n   */\n  detectBlockingPrompt(output: string): BlockingPromptDetection {\n    const stripped = this.stripAnsi(output);\n\n    // Auth / 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    // Model selection (onboarding — not handled by --yes-always)\n    if (/select.*model|choose.*model|which model/i.test(stripped)) {\n      return {\n        detected: true,\n        type: 'model_select',\n        prompt: 'Model selection required',\n        canAutoRespond: false,\n        instructions: 'Please select a model or set AIDER_MODEL env var',\n      };\n    }\n\n    // Confirmation validation error — re-prompt loop (io.py:897)\n    if (/please answer with one of:/i.test(stripped)) {\n      return {\n        detected: true,\n        type: 'unknown',\n        prompt: 'Invalid confirmation input',\n        canAutoRespond: false,\n        instructions:\n          'Aider received an invalid response to a confirmation prompt',\n      };\n    }\n\n    // Explicit y/n prompt NOT already handled by --yes-always\n    // (e.g. destructive ops, git reset confirmations)\n    if (\n      /\\[y\\/n\\]/i.test(stripped) || /\\(Y\\)es\\/\\(N\\)o/i.test(stripped)\n    ) {\n      return {\n        detected: true,\n        type: 'permission',\n        prompt: stripped.slice(-200),\n        options: ['y', 'n'],\n        canAutoRespond: false,\n        instructions: 'Aider is asking for confirmation',\n      };\n    }\n\n    // No blocking prompt detected — normal output\n    return { detected: false };\n  }\n\n  /**\n   * Detect if Aider is actively loading/processing.\n   *\n   * Patterns from: AGENT_LOADING_STATUS_PATTERNS.json\n   *   - aider_active_waiting_model: \"Waiting for <model>\"\n   *   - aider_active_waiting_llm_default: \"Waiting for LLM\"\n   *   - aider_active_generating_commit_message: \"Generating commit message with ...\"\n   */\n  detectLoading(output: string): boolean {\n    const stripped = this.stripAnsi(output);\n    const tail = stripped.slice(-500);\n\n    // Waiting for model response\n    if (/Waiting\\s+for\\s+(?:LLM|[A-Za-z0-9_./:@-]+)/i.test(tail)) {\n      return true;\n    }\n\n    // Generating commit message\n    if (/Generating\\s+commit\\s+message\\s+with\\s+/i.test(tail)) {\n      return true;\n    }\n\n    return false;\n  }\n\n  /**\n   * Detect task completion for Aider.\n   *\n   * High-confidence patterns:\n   *   - \"Aider is waiting for your input\" notification (bell message)\n   *   - Edit-format mode prompts (ask>, code>, architect>) after output\n   *\n   * Patterns from: AGENT_LOADING_STATUS_PATTERNS.json\n   *   - aider_completed_llm_response_ready\n   */\n  detectTaskComplete(output: string): boolean {\n    const stripped = this.stripAnsi(output);\n\n    // \"Aider is waiting for your input\" — explicit notification that model turn finished\n    if (/Aider\\s+is\\s+waiting\\s+for\\s+your\\s+input/.test(stripped)) {\n      return true;\n    }\n\n    // Mode prompt at end of output after visible response content.\n    // Only count as task-complete if there's substantial output above the prompt\n    // (not just a bare prompt which could be startup).\n    // Match named prompts (ask>, code>, architect>, multi>) AND plain >\n    // Aider shows plain > in some modes.\n    const hasPrompt = /(?:(?:ask|code|architect)(?:\\s+multi)?)?>\\s*$/m.test(\n      stripped\n    );\n    if (hasPrompt) {\n      // Check for signs of completed work above the prompt\n      const hasEditMarkers =\n        /Applied edit to|Commit [a-f0-9]+|wrote to|Updated/i.test(stripped);\n      const hasTokenUsage = /Tokens:|Cost:/i.test(stripped);\n      if (hasEditMarkers || hasTokenUsage) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  detectReady(output: string): boolean {\n    const stripped = this.stripAnsi(output);\n\n    // Guard: if output contains an auth/OAuth prompt, we're NOT ready\n    if (\n      /login to openrouter/i.test(stripped) ||\n      /open this url in your browser/i.test(stripped) ||\n      /waiting up to 5 minutes/i.test(stripped)\n    ) {\n      return false;\n    }\n\n    // Edit-format mode prompts (io.py:545): ask>, code>, architect>, help>, multi>\n    if (\n      /(?:ask|code|architect|help)(?:\\s+multi)?>\\s*$/m.test(stripped) ||\n      /^multi>\\s*$/m.test(stripped)\n    ) {\n      return true;\n    }\n\n    // Startup banner indicates Aider launched (base_coder.py:209)\n    if (/^Aider v\\d+/m.test(stripped)) {\n      return true;\n    }\n\n    // File list display means chat context is ready\n    if (/^(?:Readonly|Editable):/m.test(stripped)) {\n      return true;\n    }\n\n    return (\n      // Legacy prompt patterns\n      stripped.includes('aider>') ||\n      /Added.*to the chat/i.test(stripped) ||\n      />\\s*$/.test(stripped)\n    );\n  }\n\n  parseOutput(output: string): ParsedOutput | null {\n    const stripped = this.stripAnsi(output);\n\n    const isComplete = this.isResponseComplete(stripped);\n\n    if (!isComplete) {\n      return null;\n    }\n\n    const isQuestion = this.containsQuestion(stripped);\n\n    // Extract content, removing aider prompt\n    let content = this.extractContent(stripped, /^.*aider>\\s*/gim);\n\n    // Remove file operation confirmations from content\n    content = content.replace(\n      /^(Added|Removed|Created|Updated) .+ (to|from) the chat\\.?$/gm,\n      ''\n    );\n\n    return {\n      type: isQuestion ? 'question' : 'response',\n      content: content.trim(),\n      isComplete: true,\n      isQuestion,\n      metadata: {\n        raw: output,\n      },\n    };\n  }\n\n  /**\n   * Detect exit conditions specific to Aider.\n   * Source: base_coder.py:994, base_coder.py:998, report.py:77, versioncheck.py:58\n   */\n  override detectExit(output: string): {\n    exited: boolean;\n    code?: number;\n    error?: string;\n  } {\n    const stripped = this.stripAnsi(output);\n\n    // Ctrl+C exit (base_coder.py:994-998)\n    if (\n      /\\^C again to exit/i.test(stripped) ||\n      /\\^C KeyboardInterrupt/i.test(stripped)\n    ) {\n      return { exited: true, code: 130 };\n    }\n\n    // Version update completed (versioncheck.py:58)\n    if (/re-run aider to use new version/i.test(stripped)) {\n      return {\n        exited: true,\n        code: 0,\n        error: 'Aider updated — restart required',\n      };\n    }\n\n    return super.detectExit(output);\n  }\n\n  getPromptPattern(): RegExp {\n    // Match edit-format prompts: ask>, code>, architect>, help>, multi>\n    // Also legacy aider> and bare >\n    return /(?:ask|code|architect|help|aider|multi)(?:\\s+multi)?>\\s*$/i;\n  }\n\n  getHealthCheckCommand(): string {\n    return 'aider --version';\n  }\n}\n","/**\n * Claude Code CLI Adapter\n *\n * Adapter for the Claude Code CLI (claude command).\n */\n\nimport type {\n  AutoResponseRule,\n  BlockingPromptDetection,\n  LoginDetection,\n  ParsedOutput,\n  SpawnConfig,\n  ToolRunningInfo,\n} from 'adapter-types';\nimport {\n  type AgentCredentials,\n  type AgentFileDescriptor,\n  type AuthStatus,\n  BaseCodingAdapter,\n  type InstallationInfo,\n  type ModelRecommendations,\n} from './base-coding-adapter';\n\nconst CLAUDE_HOOK_MARKER_PREFIX = 'PARALLAX_CLAUDE_HOOK';\n\n/**\n * All 8 turn-completion verbs from Claude Code source.\n * Randomly selected by the TUI when a turn finishes.\n */\nconst TURN_COMPLETION_VERBS = [\n  'Baked',\n  'Brewed',\n  'Churned',\n  'Cogitated',\n  'Cooked',\n  'Crunched',\n  'Sautéed',\n  'Worked',\n] as const;\n\n/** Turn duration pattern matching all known completion verbs */\nconst TURN_DURATION_RE = new RegExp(\n  `(?:${TURN_COMPLETION_VERBS.join('|')})\\\\s+for\\\\s+\\\\d+(?:h\\\\s+\\\\d{1,2}m\\\\s+\\\\d{1,2}s|m\\\\s+\\\\d{1,2}s|s)`\n);\n\n/**\n * Sample of the 204 spinner verbs from Claude Code source.\n * Used to detect loading state from spinner text like \"Cogitating…\"\n */\nconst SPINNER_VERB_RE =\n  /(?:Accomplishing|Architecting|Baking|Brewing|Calculating|Churning|Clauding|Cogitating|Computing|Concocting|Cooking|Crafting|Creating|Crunching|Deliberating|Determining|Doing|Fermenting|Forging|Generating|Imagining|Incubating|Inferring|Kneading|Manifesting|Mulling|Musing|Percolating|Pondering|Processing|Ruminating|Sautéing|Simmering|Synthesizing|Thinking|Tinkering|Vibing|Working|Wrangling)(?:…|\\.{3})/;\n\ninterface ClaudeHookMarker {\n  event: string;\n  notification_type?: string;\n  tool_name?: string;\n  message?: string;\n}\n\ninterface ClaudeAdapterConfig {\n  continue?: boolean;\n  resume?: string;\n  claudeHookTelemetry?: boolean;\n  claudeHookMarkerPrefix?: string;\n  /** Use --bare mode for lightweight automation (skips hooks, LSP, plugins, CLAUDE.md) */\n  bare?: boolean;\n  /** Maximum agentic turns (--print mode only) */\n  maxTurns?: number;\n  /** Maximum API spend in USD (--print mode only) */\n  maxBudgetUsd?: number;\n  /** Permission mode: 'default' | 'plan' | 'acceptEdits' | 'bypassPermissions' | 'dontAsk' */\n  permissionMode?: string;\n}\n\nexport class ClaudeAdapter extends BaseCodingAdapter {\n  readonly adapterType = 'claude';\n  readonly displayName = 'Claude Code';\n\n  /** Heaviest TUI — status bar, shortcuts, update notices, /ide suggestions.\n   *  3000ms needed because detectReady fires early during boot rendering. */\n  override readonly readySettleMs: number = 3000;\n\n  readonly installation: InstallationInfo = {\n    command: 'npm install -g @anthropic-ai/claude-code',\n    alternatives: [\n      'npx @anthropic-ai/claude-code (run without installing)',\n      'brew install claude-code (macOS with Homebrew)',\n    ],\n    docsUrl: 'https://docs.anthropic.com/en/docs/claude-code',\n    minVersion: '1.0.0',\n  };\n\n  /**\n   * Auto-response rules for Claude Code CLI.\n   * These handle common text-based [y/n] prompts that can be safely auto-responded.\n   * Explicit responseType: 'text' prevents the usesTuiMenus default from kicking in.\n   */\n  readonly autoResponseRules: AutoResponseRule[] = [\n    {\n      pattern:\n        /choose\\s+the\\s+text\\s+style\\s+that\\s+looks\\s+best\\s+with\\s+your\\s+terminal|syntax\\s+theme:/i,\n      type: 'config',\n      response: '',\n      responseType: 'keys',\n      keys: ['enter'],\n      description: 'Accept Claude first-run theme/style prompt',\n      safe: true,\n      once: true,\n    },\n    {\n      pattern:\n        /trust.*(?:folder|directory)|safety.?check|project.you.created|(?:Yes|Allow).*(?:No|Deny).*(?:Enter|Return)/i,\n      type: 'permission',\n      response: '',\n      responseType: 'keys',\n      keys: ['enter'],\n      description: 'Accept trust prompt for working directory',\n      safe: true,\n      once: true,\n    },\n    {\n      pattern:\n        /wants? (?:your )?permission|needs your permission|(?:Allow|Approve)\\s[\\s\\S]{0,50}(?:Deny|Don't allow)/i,\n      type: 'permission',\n      response: '',\n      responseType: 'keys',\n      keys: ['enter'],\n      description:\n        'Auto-approve tool permission prompts (file access, MCP tools, etc.)',\n      safe: true,\n      once: true,\n    },\n    {\n      pattern: /update available.*\\[y\\/n\\]/i,\n      type: 'update',\n      response: 'n',\n      responseType: 'text',\n      description: 'Decline Claude Code update to continue execution',\n      safe: true,\n    },\n    {\n      pattern: /new version.*available.*\\[y\\/n\\]/i,\n      type: 'update',\n      response: 'n',\n      responseType: 'text',\n      description: 'Decline version upgrade prompt',\n      safe: true,\n    },\n    {\n      pattern: /would you like to enable.*telemetry.*\\[y\\/n\\]/i,\n      type: 'config',\n      response: 'n',\n      responseType: 'text',\n      description: 'Decline telemetry prompt',\n      safe: true,\n    },\n    {\n      pattern: /send anonymous usage data.*\\[y\\/n\\]/i,\n      type: 'config',\n      response: 'n',\n      responseType: 'text',\n      description: 'Decline anonymous usage data',\n      safe: true,\n    },\n    {\n      pattern:\n        /how is claude doing this session\\?\\s*\\(optional\\)|1:\\s*bad\\s+2:\\s*fine\\s+3:\\s*good\\s+0:\\s*dismiss/i,\n      type: 'config',\n      response: '0',\n      responseType: 'text',\n      description: 'Dismiss optional Claude session survey',\n      safe: true,\n      once: true,\n    },\n    {\n      pattern: /continue without.*\\[y\\/n\\]/i,\n      type: 'config',\n      response: 'y',\n      responseType: 'text',\n      description: 'Continue without optional feature',\n      safe: true,\n    },\n    // From leaked source: exact \"Do you want to proceed?\" permission text\n    {\n      pattern: /Do you want to proceed\\?/,\n      type: 'permission',\n      response: '',\n      responseType: 'keys',\n      keys: ['enter'],\n      description: 'Accept Claude \"Do you want to proceed?\" permission dialog',\n      safe: true,\n      once: true,\n    },\n    // From leaked source: file edit permission dialog\n    {\n      pattern: /Do you want to make this edit to/,\n      type: 'permission',\n      response: '',\n      responseType: 'keys',\n      keys: ['enter'],\n      description: 'Accept Claude file edit permission',\n      safe: true,\n      once: true,\n    },\n    // From leaked source: context limit / compact prompt\n    {\n      pattern:\n        /Context limit reached|\\/compact or \\/clear to continue/i,\n      type: 'config',\n      response: '/compact',\n      responseType: 'text',\n      description:\n        'Auto-compact when context limit reached to continue execution',\n      safe: true,\n    },\n    // From leaked source: exit confirmation\n    {\n      pattern: /Press .{1,10} again to exit/,\n      type: 'config',\n      response: '',\n      responseType: 'keys',\n      keys: ['escape'],\n      description: 'Cancel accidental exit confirmation',\n      safe: true,\n      once: true,\n    },\n    // API key detected in environment — accept it (API Keys / Cloud mode)\n    {\n      pattern:\n        /(?:custom|detected).*API key.*(?:environment|ANTHROPIC_API_KEY)|Do you want to use this API key/i,\n      type: 'config',\n      response: '',\n      responseType: 'keys',\n      // Cursor defaults to \"2. No\" — move up to \"1. Yes\" then confirm\n      keys: ['up', 'enter'],\n      description: 'Accept detected ANTHROPIC_API_KEY from environment',\n      safe: true,\n      once: true,\n    },\n  ];\n\n  getWorkspaceFiles(): AgentFileDescriptor[] {\n    return [\n      {\n        relativePath: 'CLAUDE.md',\n        description: 'Project-level instructions read automatically on startup',\n        autoLoaded: true,\n        type: 'memory',\n        format: 'markdown',\n      },\n      {\n        relativePath: '.claude/settings.json',\n        description: 'Project-scoped settings (allowed tools, permissions)',\n        autoLoaded: true,\n        type: 'config',\n        format: 'json',\n      },\n      {\n        relativePath: '.claude/commands',\n        description: 'Custom slash commands directory',\n        autoLoaded: false,\n        type: 'config',\n        format: 'markdown',\n      },\n    ];\n  }\n\n  getRecommendedModels(_credentials?: AgentCredentials): ModelRecommendations {\n    return {\n      powerful: 'claude-sonnet-4-20250514',\n      fast: 'claude-haiku-4-5-20251001',\n    };\n  }\n\n  override async checkAuthStatus(): Promise<AuthStatus> {\n    const out = await this.execQuiet('claude auth status 2>&1');\n    if (!out) return { status: 'unknown' };\n\n    try {\n      const parsed = JSON.parse(out);\n      if (parsed.loggedIn) {\n        return {\n          status: 'authenticated',\n          method: parsed.authMethod ?? 'subscription',\n          detail: parsed.email || parsed.orgName || parsed.subscriptionType || undefined,\n        };\n      }\n      return {\n        status: 'unauthenticated',\n        loginHint: 'Run \"claude auth login\" to sign in.',\n      };\n    } catch {\n      // Non-JSON output — check negative patterns first\n      if (/not.logged.in|unauthenticated/i.test(out)) {\n        return {\n          status: 'unauthenticated',\n          loginHint: 'Run \"claude auth login\" to sign in.',\n        };\n      }\n      if (/logged.in|authenticated/i.test(out)) {\n        return { status: 'authenticated', method: 'subscription' };\n      }\n      return { status: 'unknown' };\n    }\n  }\n\n  override async triggerAuth(): Promise<{\n    launched: boolean;\n    url?: string;\n    instructions: string;\n  } | null> {\n    // claude auth login opens a browser for OAuth\n    const out = await this.execQuiet('claude auth login 2>&1', 15000);\n    if (out && /open.*url|browser/i.test(out)) {\n      const urlMatch = out.match(/https?:\\/\\/[^\\s]+/);\n      return {\n        launched: true,\n        url: urlMatch?.[0],\n        instructions: 'Complete sign-in in your browser.',\n      };\n    }\n    // May have auto-completed or failed\n    return {\n      launched: !!out,\n      instructions: out || 'Run \"claude auth login\" in your terminal.',\n    };\n  }\n\n  getCommand(): string {\n    return 'claude';\n  }\n\n  getArgs(config: SpawnConfig): string[] {\n    const args: string[] = [];\n    const adapterConfig = config.adapterConfig as\n      | ClaudeAdapterConfig\n      | undefined;\n\n    // Print mode for non-interactive usage (skip if interactive mode)\n    if (!this.isInteractive(config)) {\n      args.push('--print');\n\n      // Set working directory in non-interactive mode\n      // In interactive/PTY mode, the PTY's cwd is already set by spawn config\n      if (config.workdir) {\n        args.push('--cwd', config.workdir);\n      }\n    }\n\n    // Bare mode: lightweight automation — skips hooks, LSP, plugins, CLAUDE.md\n    if (adapterConfig?.bare) {\n      args.push('--bare');\n    }\n\n    // Pass-through resume flags for interactive sessions\n    if (adapterConfig?.resume) {\n      args.push('--resume', adapterConfig.resume);\n    } else if (adapterConfig?.continue) {\n      args.push('--continue');\n    }\n\n    // Permission mode override (acceptEdits, plan, dontAsk, etc.)\n    if (adapterConfig?.permissionMode) {\n      args.push('--permission-mode', adapterConfig.permissionMode);\n    }\n\n    // Execution limits (--print mode only)\n    if (!this.isInteractive(config)) {\n      if (adapterConfig?.maxTurns) {\n        args.push('--max-turns', String(adapterConfig.maxTurns));\n      }\n      if (adapterConfig?.maxBudgetUsd) {\n        args.push('--max-budget-usd', String(adapterConfig.maxBudgetUsd));\n      }\n    }\n\n    // Append approval preset CLI flags\n    const approvalConfig = this.getApprovalConfig(config);\n    if (approvalConfig) {\n      args.push(...approvalConfig.cliFlags);\n    }\n\n    return args;\n  }\n\n  getEnv(config: SpawnConfig): Record<string, string> {\n    const env: Record<string, string> = {};\n    const credentials = this.getCredentials(config);\n    const adapterConfig = config.adapterConfig as\n      | ClaudeAdapterConfig\n      | undefined;\n\n    // API key from credentials or env\n    if (credentials.anthropicKey) {\n      env.ANTHROPIC_API_KEY = credentials.anthropicKey;\n      // Skip keychain/subscription auth when an API key is explicitly provided.\n      // Prevents \"Auth conflict\" error when user is also logged in via subscription.\n      env.CLAUDE_CODE_SIMPLE = '1';\n    }\n\n    // Base URL override (e.g. route through cloud proxy)\n    if (credentials.anthropicBaseUrl) {\n      env.ANTHROPIC_BASE_URL = credentials.anthropicBaseUrl;\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    // Optional: hook telemetry mode. When enabled, hook scripts can emit\n    // deterministic marker lines that this adapter consumes.\n    if (adapterConfig?.claudeHookTelemetry) {\n      env.PARALLAX_CLAUDE_HOOK_TELEMETRY = '1';\n      env.PARALLAX_CLAUDE_HOOK_MARKER_PREFIX =\n        adapterConfig.claudeHookMarkerPrefix || CLAUDE_HOOK_MARKER_PREFIX;\n    }\n\n    return env;\n  }\n\n  override getHookTelemetryProtocol(options?: {\n    scriptPath?: string;\n    markerPrefix?: string;\n    httpUrl?: string;\n    sessionId?: string;\n  }): {\n    markerPrefix: string;\n    scriptPath: string;\n    scriptContent: string;\n    settingsHooks: Record<string, unknown>;\n  } {\n    // HTTP hook mode: generate HTTP hook entries instead of command hooks\n    if (options?.httpUrl) {\n      const httpHookBase: Record<string, unknown> = {\n        type: 'http',\n        url: options.httpUrl,\n        timeout: 5,\n      };\n      // Inject session ID header if available (env var resolved at runtime)\n      if (options.sessionId) {\n        httpHookBase.headers = { 'X-Parallax-Session-Id': options.sessionId };\n      }\n\n      const hookEntry = [{ matcher: '', hooks: [{ ...httpHookBase }] }];\n      const hookEntryNoMatcher = [{ hooks: [{ ...httpHookBase }] }];\n\n      const settingsHooks: Record<string, unknown> = {\n        PermissionRequest: hookEntryNoMatcher,\n        PreToolUse: hookEntry,\n        Stop: hookEntryNoMatcher,\n        Notification: hookEntry,\n        TaskCompleted: hookEntryNoMatcher,\n      };\n\n      return {\n        markerPrefix: '',\n        scriptPath: '',\n        scriptContent: '',\n        settingsHooks,\n      };\n    }\n\n    // Command hook mode (fallback): emit marker lines to stdout\n    const markerPrefix = options?.markerPrefix || CLAUDE_HOOK_MARKER_PREFIX;\n    const scriptPath =\n      options?.scriptPath || '.claude/hooks/parallax-hook-telemetry.sh';\n    const scriptCommand = `\"${'$'}CLAUDE_PROJECT_DIR\"/${scriptPath}`;\n    const hookEntry = [\n      { matcher: '', hooks: [{ type: 'command', command: scriptCommand }] },\n    ];\n\n    const settingsHooks: Record<string, unknown> = {\n      Notification: hookEntry,\n      PreToolUse: hookEntry,\n      TaskCompleted: hookEntry,\n      SessionEnd: hookEntry,\n    };\n\n    const scriptContent = `#!/usr/bin/env bash\nset -euo pipefail\n\nINPUT=\"$(cat)\"\n[ -z \"${'$'}INPUT\" ] && exit 0\n\nif ! command -v jq >/dev/null 2>&1; then\n  exit 0\nfi\n\nEVENT=\"$(printf '%s' \"${'$'}INPUT\" | jq -r '.hook_event_name // empty')\"\n[ -z \"${'$'}EVENT\" ] && exit 0\n\nNOTIFICATION_TYPE=\"$(printf '%s' \"${'$'}INPUT\" | jq -r '.notification_type // empty')\"\nTOOL_NAME=\"$(printf '%s' \"${'$'}INPUT\" | jq -r '.tool_name // empty')\"\nMESSAGE=\"$(printf '%s' \"${'$'}INPUT\" | jq -r '.message // empty')\"\n\nprintf '%s ' '${markerPrefix}'\njq -nc \\\n  --arg event \"${'$'}EVENT\" \\\n  --arg notification_type \"${'$'}NOTIFICATION_TYPE\" \\\n  --arg tool_name \"${'$'}TOOL_NAME\" \\\n  --arg message \"${'$'}MESSAGE\" \\\n  '({event: $event}\n   + (if $notification_type != \"\" then {notification_type: $notification_type} else {} end)\n   + (if $tool_name != \"\" then {tool_name: $tool_name} else {} end)\n   + (if $message != \"\" then {message: $message} else {} end))'\n`;\n\n    return {\n      markerPrefix,\n      scriptPath,\n      scriptContent,\n      settingsHooks,\n    };\n  }\n\n  private getHookMarkers(output: string): ClaudeHookMarker[] {\n    const markers: ClaudeHookMarker[] = [];\n    const markerRegex = /(?:^|\\n)\\s*([A-Z0-9_]+)\\s+(\\{[^\\n\\r]+\\})/g;\n    let match: RegExpExecArray | null;\n\n    while ((match = markerRegex.exec(output)) !== null) {\n      const markerToken = match[1];\n      if (!markerToken.includes('CLAUDE_HOOK')) {\n        continue;\n      }\n      const payload = match[2];\n      try {\n        const parsed = JSON.parse(payload) as Record<string, unknown>;\n        const event =\n          typeof parsed.event === 'string' ? parsed.event : undefined;\n        if (!event) continue;\n        markers.push({\n          event,\n          notification_type:\n            typeof parsed.notification_type === 'string'\n              ? parsed.notification_type\n              : undefined,\n          tool_name:\n            typeof parsed.tool_name === 'string' ? parsed.tool_name : undefined,\n          message:\n            typeof parsed.message === 'string' ? parsed.message : undefined,\n        });\n      } catch {\n        // Ignore malformed marker payloads.\n      }\n    }\n\n    return markers;\n  }\n\n  private getLatestHookMarker(output: string): ClaudeHookMarker | null {\n    const markers = this.getHookMarkers(output);\n    return markers.length > 0 ? markers[markers.length - 1] : null;\n  }\n\n  private stripHookMarkers(output: string): string {\n    return output.replace(\n      /(?:^|\\n)\\s*[A-Z0-9_]*CLAUDE_HOOK[A-Z0-9_]*\\s+\\{[^\\n\\r]+\\}\\s*/g,\n      '\\n'\n    );\n  }\n\n  detectLogin(output: string): LoginDetection {\n    const stripped = this.stripAnsi(output);\n\n    // Check for CLI login required (Claude Code >= 1.x interactive mode)\n    // Pattern: \"Not logged in · Please run /login\"\n    if (\n      stripped.includes('Not logged in') ||\n      stripped.includes('Please run /login') ||\n      stripped.includes('please log in') ||\n      stripped.includes('run /login')\n    ) {\n      return {\n        required: true,\n        type: 'cli_auth',\n        instructions:\n          'Claude Code requires authentication. Run \"claude login\" in your terminal.',\n      };\n    }\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:\n          '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    const marker = this.getLatestHookMarker(stripped);\n\n    // Skip blocking prompt detection when the output is just spinner/loading text.\n    // Claude Code's TUI renders spinner words (\"Tomfoolering…\", \"Recombobulating…\")\n    // that produce partial fragments across buffer boundaries (e.g. \"lculating…\\n\").\n    // These fragments can false-positive as blocking prompts if not filtered early.\n    if (this.detectLoading(output)) {\n      return { detected: false };\n    }\n    // Spinner fragment: a single short word fragment ending in … or ... with trailing whitespace.\n    // Catches partial spinner words split across buffer boundaries.\n    // Also catches spinner frame characters (·, ✢, ✳, ✶, ✻, ✽) from leaked source.\n    const trimmedTail = stripped.slice(-200).trim();\n    if (/^[a-zA-Z]{1,30}(?:…|\\.{3})\\s*$/.test(trimmedTail)) {\n      return { detected: false };\n    }\n    if (/^[·✢✳✶✻✽\\*]\\s+[A-Z]/.test(trimmedTail)) {\n      return { detected: false };\n    }\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    if (marker?.event === 'Notification') {\n      if (marker.notification_type === 'permission_prompt') {\n        return {\n          detected: true,\n          type: 'permission',\n          prompt: marker.message || 'Claude permission prompt',\n          suggestedResponse: 'keys:enter',\n          canAutoRespond: true,\n          instructions: 'Claude is waiting for permission approval',\n        };\n      }\n      if (marker.notification_type === 'elicitation_dialog') {\n        return {\n          detected: true,\n          type: 'tool_wait',\n          prompt: marker.message || 'Claude elicitation dialog',\n          canAutoRespond: false,\n          instructions: 'Claude is waiting for required user input',\n        };\n      }\n    }\n\n    // From leaked source: exact bypass permissions dialog text.\n    // Title: \"WARNING: Claude Code running in Bypass Permissions mode\"\n    // Options: \"No, exit\" and \"Yes, I accept\"\n    if (\n      /WARNING.*Bypass Permissions mode|Bypass Permissions mode.*accept all responsibility/is.test(\n        stripped\n      ) &&\n      (/No,?\\s*exit/i.test(stripped) || /Yes,?\\s*I accept/i.test(stripped))\n    ) {\n      return {\n        detected: true,\n        type: 'permission',\n        prompt: 'Bypass Permissions confirmation',\n        options: ['1', '2'],\n        suggestedResponse: '2',\n        canAutoRespond: true,\n        instructions:\n          'Claude is asking to confirm bypass permissions mode; reply 2 to accept',\n      };\n    }\n\n    // From leaked source: credit balance too low\n    if (/Credit balance too low/i.test(stripped)) {\n      return {\n        detected: true,\n        type: 'config',\n        prompt: 'Credit balance too low',\n        canAutoRespond: false,\n        instructions:\n          'Anthropic account credit balance is too low to continue. Add funds at https://platform.claude.com/settings/billing',\n      };\n    }\n\n    // From leaked source: context limit reached (non-auto-respond version)\n    if (\n      /Context limit reached/i.test(stripped) &&\n      !/\\/compact or \\/clear/i.test(stripped)\n    ) {\n      return {\n        detected: true,\n        type: 'config',\n        prompt: 'Context limit reached',\n        suggestedResponse: '/compact',\n        canAutoRespond: true,\n        instructions: 'Context window full — run /compact to continue',\n      };\n    }\n\n    // Claude survey/feedback prompt (optional)\n    if (\n      /how is claude doing this session\\?\\s*\\(optional\\)|1:\\s*bad\\s+2:\\s*fine\\s+3:\\s*good\\s+0:\\s*dismiss/i.test(\n        stripped\n      )\n    ) {\n      return {\n        detected: true,\n        type: 'config',\n        prompt: 'Claude session survey',\n        options: ['1', '2', '3', '0'],\n        suggestedResponse: '0',\n        canAutoRespond: true,\n        instructions: 'Optional survey prompt; reply 0 to dismiss',\n      };\n    }\n\n    // Generic Claude modal/dialog controls discovered from live capture\n    if (\n      /enter\\/tab\\/space to toggle.*esc to cancel|enter to confirm.*esc to cancel|esc to close/i.test(\n        stripped\n      )\n    ) {\n      return {\n        detected: true,\n        type: 'config',\n        prompt: 'Claude dialog awaiting navigation',\n        options: ['keys:enter', 'keys:esc', 'keys:down,enter'],\n        suggestedResponse: 'keys:esc',\n        canAutoRespond: false,\n        instructions: 'Use Enter/Esc or arrow keys to navigate this dialog',\n      };\n    }\n\n    // Slash-menu screens where navigation keys are required.\n    // Important: startup status lines can include \"/chrome\" (for example:\n    // \"Claude in Chrome enabled · /chrome\") but are not blocking prompts.\n    // Require either explicit navigation instructions or an interactive\n    // menu-style line with a prompt/selection marker.\n    if (\n      /press .* to navigate .* enter .* esc|use (?:arrow|↑↓) keys|enter to select|esc to (?:go back|close|cancel)/i.test(\n        stripped\n      ) ||\n      /(?:^|\\n)\\s*(?:❯|>)\\s*\\/(?:agents|chrome|config|tasks|skills|remote-env)\\b/im.test(\n        stripped\n      )\n    ) {\n      return {\n        detected: true,\n        type: 'config',\n        prompt: 'Claude menu navigation required',\n        options: ['keys:esc', 'keys:enter', 'keys:down,enter'],\n        suggestedResponse: 'keys:esc',\n        canAutoRespond: false,\n        instructions:\n          'Claude is showing an interactive menu; use arrow keys + Enter or Esc',\n      };\n    }\n\n    // From leaked source: exact permission prompt texts.\n    // - \"Do you want to proceed?\" (generic permission)\n    // - \"Do you want to make this edit to {filename}?\" (file edit)\n    // - \"Claude needs your permission to use {toolName}\" (tool use)\n    // - \"Claude Code needs your attention\" (generic fallback)\n    if (\n      /Do you want to|wants? (?:your )?permission|needs your permission|needs your (?:approval|attention)/i.test(\n        stripped\n      )\n    ) {\n      return {\n        detected: true,\n        type: 'permission',\n        prompt: 'Claude tool permission',\n        suggestedResponse: 'keys:enter',\n        canAutoRespond: true,\n        instructions: 'Claude is asking permission to use a tool',\n      };\n    }\n\n    // Claude-specific: Model selection prompt\n    if (\n      /choose.*model|select.*model|available models/i.test(stripped) &&\n      /\\d+\\)|claude-/i.test(stripped)\n    ) {\n      return {\n        detected: true,\n        type: 'model_select',\n        prompt: 'Claude model selection',\n        canAutoRespond: false,\n        instructions:\n          '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 (\n      /welcome to claude|first time setup|initial configuration/i.test(stripped)\n    ) {\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 (\n      /allow.*access|grant.*permission|access to .* files/i.test(stripped) &&\n      /\\[y\\/n\\]/i.test(stripped)\n    ) {\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    // If explicit blocking patterns did not match and output is clearly idle\n    // or task-complete, avoid generic fallback misclassifying residual text\n    // (e.g. \"? for shortcuts\", status bar fragments) as a blocking prompt.\n    if (this.detectReady(output) || this.detectTaskComplete(output)) {\n      return { detected: false };\n    }\n\n    // Suppress the base-class \"last line ends with ?\" fallback when the output\n    // contains Claude's idle prompt (❯) — the \"? for shortcuts\" hint and TUI\n    // status bar lines arrive in separate chunks, so detectReady may not match\n    // yet, but a bare \"?\" is not a real blocking prompt.\n    if (/❯/.test(stripped.slice(-300))) {\n      return { detected: false };\n    }\n\n    // Fall back to base class detection\n    return super.detectBlockingPrompt(output);\n  }\n\n  /**\n   * Detect if Claude Code is actively loading/processing.\n   *\n   * Patterns from: AGENT_LOADING_STATUS_PATTERNS.json\n   *   - claude_active_reading_files: \"Reading N files…\"\n   *   - General: \"esc to interrupt\" spinner status line\n   */\n  detectLoading(output: string): boolean {\n    const stripped = this.stripAnsi(output);\n    const marker = this.getLatestHookMarker(stripped);\n    const tail = stripped.slice(-500);\n\n    if (marker?.event === 'PreToolUse') {\n      return true;\n    }\n\n    // Active spinner with \"esc to interrupt\" — agent is working\n    if (/esc\\s+to\\s+interrupt/i.test(tail)) {\n      return true;\n    }\n\n    // \"Reading N files\" loading indicator\n    if (/Reading\\s+\\d+\\s+files/i.test(tail)) {\n      return true;\n    }\n\n    // Spinner verb from Claude Code source (e.g. \"Cogitating…\", \"Vibing…\")\n    if (SPINNER_VERB_RE.test(tail)) {\n      return true;\n    }\n\n    // Spinner frame characters (·, ✢, ✳, ✶, ✻, ✽) at start of a line\n    // followed by a capitalized word — indicates active thinking animation.\n    // Must be at line start to avoid matching middle-dot separators like \"Enter · Esc\".\n    if (/(?:^|\\n)\\s*[✢✳✶✻✽]\\s+[A-Z][a-z]/.test(tail)) {\n      return true;\n    }\n\n    return false;\n  }\n\n  /**\n   * Detect if an external tool/process is running within the Claude session.\n   *\n   * Claude Code can launch external tools (browser, bash, Node, Python, etc.)\n   * that show status lines like \"Claude in Chrome[javascript_tool]\" or\n   * \"[bash_tool]\", \"[python_tool]\", etc.\n   *\n   * When detected, stall detection is suppressed and the UI can display\n   * which tool is active.\n   */\n  detectToolRunning(output: string): ToolRunningInfo | null {\n    const stripped = this.stripAnsi(output);\n    const marker = this.getLatestHookMarker(stripped);\n    const tail = stripped.slice(-500);\n\n    if (marker?.event === 'PreToolUse' && marker.tool_name) {\n      return {\n        toolName: marker.tool_name.toLowerCase(),\n        description: `${marker.tool_name} (hook)`,\n      };\n    }\n\n    // Prefer contextual pattern: \"Claude in <App>[tool_name]\".\n    // Do not treat \"Claude in <App> enabled · /chrome\" as a running tool.\n    const contextualMatch = tail.match(\n      /Claude\\s+in\\s+([A-Za-z0-9._-]+)\\s*\\[(\\w+_tool)\\]/i\n    );\n    if (contextualMatch) {\n      const appName = contextualMatch[1];\n      const toolType = contextualMatch[2].toLowerCase();\n      const friendlyName = toolType.replace(/_tool$/i, '');\n      return {\n        toolName: friendlyName,\n        description: `${appName} (${toolType})`,\n      };\n    }\n\n    // Generic fallback: bracketed tool token anywhere in tail.\n    // This still detects [bash_tool], [python_tool], etc., but intentionally\n    // avoids deriving app context from unrelated status lines.\n    const toolMatch = tail.match(/\\[(\\w+_tool)\\]/i);\n    if (toolMatch) {\n      const toolType = toolMatch[1].toLowerCase();\n      const friendlyName = toolType.replace(/_tool$/i, '');\n      return { toolName: friendlyName, description: toolType };\n    }\n\n    return null;\n  }\n\n  /**\n   * Detect task completion for Claude Code.\n   *\n   * High-confidence pattern: turn duration summary + idle prompt.\n   * Claude Code shows \"<Verb> for Xm Ys\" (e.g. \"Cooked for 3m 12s\")\n   * when a turn completes, followed by the ❯ input prompt.\n   *\n   * Patterns from: AGENT_LOADING_STATUS_PATTERNS.json\n   *   - claude_completed_turn_duration\n   *   - claude_completed_turn_duration_custom_verb\n   */\n  detectTaskComplete(output: string): boolean {\n    const stripped = this.stripAnsi(output);\n    const marker = this.getLatestHookMarker(stripped);\n    if (!stripped.trim()) return false;\n\n    if (marker?.event === 'TaskCompleted') {\n      return true;\n    }\n    if (\n      marker?.event === 'Notification' &&\n      marker.notification_type === 'idle_prompt'\n    ) {\n      return true;\n    }\n    // NOTE: Do NOT call detectLoading() here. The buffer often contains stale\n    // loading patterns (e.g. \"esc to interrupt\" from the spinner) alongside\n    // completion signals. Task completion is a more specific signal and should\n    // not be suppressed by loading detection — that priority is handled at the\n    // PTY session level in onStallTimerFired().\n\n    // If Claude is waiting for a confirmation, it's not task-complete idle.\n    if (\n      /trust.*directory|do you want to|needs? your permission/i.test(stripped)\n    ) {\n      return false;\n    }\n\n    // Turn duration pattern: known completion verbs from Claude Code source\n    // (Baked, Brewed, Churned, Cogitated, Cooked, Crunched, Sautéed, Worked).\n    // Also allow unknown verbs as fallback — Claude Code may add more.\n    // Budget info may follow: \"· 1,234 / 2,048 (60%)\"\n    const hasDuration =\n      TURN_DURATION_RE.test(stripped) ||\n      /[A-Z][A-Za-z' -]{2,40}\\s+for\\s+\\d+(?:h\\s+\\d{1,2}m\\s+\\d{1,2}s|m\\s+\\d{1,2}s|s)/.test(\n        stripped\n      );\n\n    // Idle prompt: ❯ in the tail of the output.\n    // The status bar (file counts, PR info, \"Update available\", etc.) renders\n    // *after* the ❯ prompt in the TUI output stream, so we can't anchor to $.\n    const tail = stripped.slice(-300);\n    const hasIdlePrompt = /❯/.test(tail);\n\n    // High confidence: duration summary + idle prompt\n    if (hasDuration && hasIdlePrompt) {\n      return true;\n    }\n\n    // Medium confidence: idle prompt with \"for shortcuts\" hint (post-task state)\n    if (hasIdlePrompt && stripped.includes('for shortcuts')) {\n      return true;\n    }\n\n    return false;\n  }\n\n  detectReady(output: string): boolean {\n    const stripped = this.stripAnsi(output);\n    const marker = this.getLatestHookMarker(stripped);\n    if (!stripped.trim()) return false;\n\n    if (marker?.event === 'Notification') {\n      if (\n        marker.notification_type === 'permission_prompt' ||\n        marker.notification_type === 'elicitation_dialog'\n      ) {\n        return false;\n      }\n      if (marker.notification_type === 'idle_prompt') {\n        return true;\n      }\n    }\n    // Same rationale as detectTaskComplete: don't let stale loading patterns\n    // in the buffer suppress ready detection.\n\n    // Guard: if the output contains a trust prompt or permission, not ready.\n    if (\n      /trust.*directory|do you want to|needs? your permission|needs your (?:approval|attention)/i.test(\n        stripped\n      )\n    ) {\n      return false;\n    }\n\n    // From leaked source: vim mode indicator means user is typing, not ready\n    if (/-- INSERT --/.test(stripped.slice(-200))) {\n      return false;\n    }\n\n    // Claude Code shows a prompt when ready\n    // Only match specific interactive prompts, not banner text like \"Claude Code\"\n    // or generic words like \"Ready\" which appear alongside auth/trust screens\n    // Check the tail for prompt patterns — the status bar (file counts,\n    // PR info, \"Update available\", etc.) renders *after* the prompt in the\n    // TUI output stream, so we can't anchor to $.\n    const tail = stripped.slice(-300);\n    const hasConversationalReadyText =\n      stripped.includes('How can I help') ||\n      stripped.includes('What would you like');\n\n    const hasLegacyPrompt = /claude>/i.test(tail);\n    const hasShortcutsHint = stripped.includes('for shortcuts');\n    const hasInteractivePromptBar =\n      /❯\\s+\\S/.test(tail) &&\n      (/\\/effort/i.test(stripped) ||\n        /Welcome back/i.test(stripped) ||\n        /Recent activity/i.test(stripped) ||\n        /What's new/i.test(stripped));\n\n    // Deliberately do NOT treat a bare \"❯\" as ready. Claude's TUI redraws\n    // can emit transient prompt glyphs before fully settling.\n    return (\n      hasConversationalReadyText ||\n      hasLegacyPrompt ||\n      hasShortcutsHint ||\n      hasInteractivePromptBar\n    );\n  }\n\n  parseOutput(output: string): ParsedOutput | null {\n    const withoutHookMarkers = this.stripHookMarkers(output);\n    const stripped = this.stripAnsi(withoutHookMarkers);\n\n    // Check if this looks like a complete response\n    const isComplete = this.isResponseComplete(stripped);\n\n    if (!isComplete) {\n      return null;\n    }\n\n    // Determine if this is a question\n    const isQuestion = this.containsQuestion(stripped);\n\n    // Extract the actual content\n    const content = this.extractContent(stripped, /^.*>\\s*/gm);\n\n    return {\n      type: isQuestion ? 'question' : 'response',\n      content,\n      isComplete: true,\n      isQuestion,\n      metadata: {\n        raw: output,\n      },\n    };\n  }\n\n  getPromptPattern(): RegExp {\n    // Claude Code prompt patterns\n    // Match \"claude> \" specifically, not bare \">\" which is too broad\n    return /claude>\\s*$/i;\n  }\n\n  getHealthCheckCommand(): string {\n    return 'claude --version';\n  }\n\n  override detectExit(output: string): {\n    exited: boolean;\n    code?: number;\n    error?: string;\n  } {\n    const stripped = this.stripAnsi(output);\n    const marker = this.getLatestHookMarker(stripped);\n    if (marker?.event === 'SessionEnd') {\n      return { exited: true, code: 0 };\n    }\n    return super.detectExit(output);\n  }\n}\n","/**\n * OpenAI Codex CLI Adapter\n *\n * Adapter for the OpenAI Codex CLI tool.\n */\n\nimport type {\n  AutoResponseRule,\n  BlockingPromptDetection,\n  LoginDetection,\n  ParsedOutput,\n  SpawnConfig,\n} from 'adapter-types';\nimport {\n  type AgentCredentials,\n  type AgentFileDescriptor,\n  type AuthStatus,\n  BaseCodingAdapter,\n  type InstallationInfo,\n  type ModelRecommendations,\n} from './base-coding-adapter';\n\nexport class CodexAdapter extends BaseCodingAdapter {\n  readonly adapterType = 'codex';\n  readonly displayName = 'OpenAI Codex';\n  override readonly readySettleMs: number = 2000;\n\n  readonly installation: InstallationInfo = {\n    command: 'npm install -g @openai/codex',\n    alternatives: ['pip install openai (Python SDK)'],\n    docsUrl: 'https://github.com/openai/codex',\n  };\n\n  /**\n   * Auto-response rules for OpenAI Codex CLI.\n   * Codex uses ratatui/crossterm full-screen TUI with arrow-key menus.\n   * Source: trust_directory.rs, update_prompt.rs, model_migration.rs, cwd_prompt.rs, chatwidget.rs, main.rs\n   */\n  readonly autoResponseRules: AutoResponseRule[] = [\n    {\n      pattern: /update.?available.*->|update.?now|skip.?until.?next.?version/i,\n      type: 'config',\n      response: '',\n      responseType: 'keys',\n      keys: ['down', 'enter'],\n      description: 'Skip Codex CLI update prompt (select \"Skip\")',\n      safe: true,\n    },\n    {\n      pattern:\n        /do.?you.?trust.?the.?contents|trust.?this.?directory|yes,?.?continue|prompt.?injection/i,\n      type: 'permission',\n      response: '',\n      responseType: 'keys',\n      keys: ['enter'],\n      description: 'Trust directory contents (default: \"Yes, continue\")',\n      safe: true,\n      once: true,\n    },\n    {\n      pattern:\n        /choose.?how.?you.?d.?like.?codex.?to.?proceed|try.?new.?model|use.?existing.?model/i,\n      type: 'config',\n      response: '',\n      responseType: 'keys',\n      keys: ['enter'],\n      description: 'Accept model migration (default: \"Try new model\")',\n      safe: true,\n      once: true,\n    },\n    {\n      pattern: /choose.?working.?directory.?to.?(resume|fork)/i,\n      type: 'config',\n      response: '',\n      responseType: 'keys',\n      keys: ['enter'],\n      description: 'Accept default working directory for session resume',\n      safe: true,\n    },\n    {\n      pattern: /enable.?full.?access\\??/i,\n      type: 'permission',\n      response: '',\n      responseType: 'keys',\n      keys: ['enter'],\n      description: 'Confirm full access mode (default: \"Yes, continue anyway\")',\n      safe: true,\n      once: true,\n    },\n    {\n      pattern: /continue.?anyway\\?\\s*\\[y\\/N\\]/i,\n      type: 'config',\n      response: 'y',\n      responseType: 'text',\n      description: 'Confirm dumb terminal continuation',\n      safe: true,\n    },\n  ];\n\n  getWorkspaceFiles(): AgentFileDescriptor[] {\n    return [\n      {\n        relativePath: 'AGENTS.md',\n        description: 'Project-level instructions read automatically on startup',\n        autoLoaded: true,\n        type: 'memory',\n        format: 'markdown',\n      },\n      {\n        relativePath: 'codex.md',\n        description: 'Additional project context file',\n        autoLoaded: true,\n        type: 'memory',\n        format: 'markdown',\n      },\n      {\n        relativePath: '.codex/config.json',\n        description: 'Project-scoped Codex configuration',\n        autoLoaded: true,\n        type: 'config',\n        format: 'json',\n      },\n    ];\n  }\n\n  getRecommendedModels(_credentials?: AgentCredentials): ModelRecommendations {\n    return {\n      powerful: 'o3',\n      fast: 'gpt-4o-mini',\n    };\n  }\n\n  override async checkAuthStatus(): Promise<AuthStatus> {\n    const out = await this.execQuiet('codex login status 2>&1');\n    if (!out) return { status: 'unknown' };\n\n    // Check negative patterns first (\"Not logged in\" contains \"logged in\")\n    if (/not.logged.in|no.active.session/i.test(out)) {\n      return {\n        status: 'unauthenticated',\n        loginHint: 'Run \"codex login\" to sign in with your ChatGPT account.',\n      };\n    }\n    if (/logged.in/i.test(out)) {\n      // e.g. \"Logged in using ChatGPT\"\n      const method = /chatgpt/i.test(out) ? 'subscription' : 'api_key';\n      return { status: 'authenticated', method, detail: out.trim() };\n    }\n    return { status: 'unknown' };\n  }\n\n  override async triggerAuth(): Promise<{\n    launched: boolean;\n    url?: string;\n    deviceCode?: string;\n    instructions: string;\n  } | null> {\n    // codex login --device-auth requests a device code from OpenAI.\n    // Stores token in ~/.codex/auth.json — works for all subsequent launches.\n    const raw = await this.execQuiet('codex login --device-auth 2>&1', 15000);\n\n    // Strip ANSI escape codes before parsing\n    const out = raw ? raw.replace(/\\x1b\\[[0-9;]*m/g, '') : '';\n\n    if (!raw || /429|too many requests|rate.limit/i.test(out)) {\n      return {\n        launched: false,\n        instructions: 'Rate limited by OpenAI. Wait a minute and try again.',\n      };\n    }\n    if (/error/i.test(out) && !out.includes('auth.openai.com')) {\n      return {\n        launched: false,\n        instructions: out.split('\\n').pop()?.trim() || 'Sign-in failed. Try again.',\n      };\n    }\n\n    const urlMatch = out.match(/https?:\\/\\/[^\\s]+/);\n    // Match the one-time code line: \"XY5F-UHM74\" (uppercase alphanumeric with hyphen)\n    const codeMatch = out.match(/^\\s*([A-Z0-9]+-[A-Z0-9]+)\\s*$/m);\n\n    return {\n      launched: true,\n      url: urlMatch?.[0],\n      deviceCode: codeMatch?.[1],\n      instructions: codeMatch?.[1]\n        ? `Open the URL and enter code: ${codeMatch[1]}`\n        : 'Complete sign-in in your browser.',\n    };\n  }\n\n  getCommand(): string {\n    return 'codex';\n  }\n\n  /**\n   * When using a cloud proxy, create an isolated CODEX_HOME directory with\n   * an `auth.json` set to apikey mode and a `config.toml` pointing at the\n   * proxy. This bypasses the user's `~/.codex/auth.json` (which may have a\n   * persisted ChatGPT subscription session) so requests actually route\n   * through the proxy with our API key instead of being silently routed\n   * back to OpenAI's chat backend via the user's stored OAuth tokens.\n   *\n   * Returns the path to the temp dir, or null if no proxy is configured.\n   */\n  private prepareIsolatedCodexHome(\n    credentials: AgentCredentials,\n  ): string | null {\n    if (!credentials.openaiBaseUrl) return null;\n\n    // biome-ignore lint: synchronous setup is fine in adapter init path\n    const fs = require('node:fs') as typeof import('node:fs');\n    // biome-ignore lint: synchronous setup is fine in adapter init path\n    const os = require('node:os') as typeof import('node:os');\n    // biome-ignore lint: synchronous setup is fine in adapter init path\n    const path = require('node:path') as typeof import('node:path');\n\n    const home = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-cloud-'));\n\n    // Write auth.json with apikey mode and the cloud key\n    fs.writeFileSync(\n      path.join(home, 'auth.json'),\n      JSON.stringify({\n        auth_mode: 'apikey',\n        OPENAI_API_KEY: credentials.openaiKey ?? null,\n        tokens: null,\n        last_refresh: null,\n      }),\n    );\n\n    // Write minimal config.toml with proxy base URL.\n    // Don't carry over user model preferences — let the cloud proxy choose.\n    //\n    // If the caller provided `extraConfigToml`, append it verbatim. This\n    // is the orchestrator's escape hatch for Codex-specific knobs the\n    // adapter does not model (e.g. disabling experimental features like\n    // the Responses API WebSocket transport when proxying through a\n    // gateway that does not support WS upgrades).\n    let configToml = `openai_base_url = \"${credentials.openaiBaseUrl}\"\\n`;\n    if (credentials.extraConfigToml?.trim()) {\n      configToml += `\\n${credentials.extraConfigToml}`;\n      if (!configToml.endsWith('\\n')) configToml += '\\n';\n    }\n    fs.writeFileSync(path.join(home, 'config.toml'), configToml);\n\n    return home;\n  }\n\n  getArgs(config: SpawnConfig): string[] {\n    const args: string[] = [];\n\n    // Quiet mode for less verbose output (skip if interactive mode)\n    if (!this.isInteractive(config)) {\n      args.push('--quiet');\n\n      // Set working directory in non-interactive mode\n      // In interactive/PTY mode, the PTY's cwd is already set by spawn config\n      if (config.workdir) {\n        args.push('--cwd', config.workdir);\n      }\n    }\n\n    // Append approval preset CLI flags\n    const approvalConfig = this.getApprovalConfig(config);\n    if (approvalConfig) {\n      args.push(...approvalConfig.cliFlags);\n    }\n\n    return args;\n  }\n\n  getEnv(config: SpawnConfig): Record<string, string> {\n    const env: Record<string, string> = {};\n    const credentials = this.getCredentials(config);\n\n    // OpenAI API key from credentials\n    if (credentials.openaiKey) {\n      env.OPENAI_API_KEY = credentials.openaiKey;\n    }\n\n    // Cloud proxy mode: isolate from the user's ~/.codex/ via CODEX_HOME so\n    // any persisted ChatGPT subscription session is ignored and requests\n    // actually route through the proxy with our API key.\n    const isolatedHome = this.prepareIsolatedCodexHome(credentials);\n    if (isolatedHome) {\n      env.CODEX_HOME = isolatedHome;\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:\n          'Set OPENAI_API_KEY environment variable or provide credentials in adapterConfig',\n      };\n    }\n\n    // Onboarding auth menu (auth.rs:313)\n    if (\n      /sign.?in.?with.?chatgpt/i.test(stripped) ||\n      (/sign.?in.?with.?device.?code/i.test(stripped) &&\n        !/open.?this.?link/i.test(stripped)) ||\n      /provide.?your.?own.?api.?key/i.test(stripped)\n    ) {\n      return {\n        required: true,\n        type: 'oauth',\n        instructions:\n          'Codex authentication required — select a sign-in method or provide an API key',\n      };\n    }\n\n    // Device code login flow (headless_chatgpt_login.rs:140)\n    if (\n      /preparing.?device.?code.?login/i.test(stripped) ||\n      /open.?this.?link.?in.?your.?browser/i.test(stripped) ||\n      /enter.?this.?one-time.?code/i.test(stripped)\n    ) {\n      const codeMatch = stripped.match(/code[:\\s]+([A-Z0-9-]+)/i);\n      const deviceCode = codeMatch ? codeMatch[1] : undefined;\n      const urlMatch = stripped.match(/https?:\\/\\/[^\\s]+/);\n      return {\n        required: true,\n        type: 'device_code',\n        url: urlMatch ? urlMatch[0] : undefined,\n        deviceCode,\n        instructions: deviceCode\n          ? `Enter code ${deviceCode} at the URL`\n          : 'Device code authentication in progress — complete in browser',\n      };\n    }\n\n    // Legacy device code detection\n    if (\n      stripped.includes('device code') ||\n      stripped.includes('Enter the code')\n    ) {\n      const codeMatch = stripped.match(/code[:\\s]+([A-Z0-9-]+)/i);\n      const deviceCode = codeMatch ? codeMatch[1] : undefined;\n      const urlMatch = stripped.match(/https?:\\/\\/[^\\s]+/);\n      return {\n        required: true,\n        type: 'device_code',\n        url: urlMatch ? urlMatch[0] : undefined,\n        deviceCode,\n        instructions: deviceCode\n          ? `Enter code ${deviceCode} at the URL`\n          : 'Device code authentication required',\n      };\n    }\n\n    return { required: false };\n  }\n\n  /**\n   * Detect blocking prompts specific to OpenAI Codex CLI.\n   * Source: approval_overlay.rs, chatwidget.rs, request_user_input/mod.rs\n   */\n  detectBlockingPrompt(output: string): BlockingPromptDetection {\n    const stripped = this.stripAnsi(output);\n\n    // Tool approval prompts (approval_overlay.rs:122)\n    // Check BEFORE login — permission prompts may coexist with auth-related banner text.\n    // TUI arrow-key menu — use keys:enter to select default (\"Yes, proceed\")\n    if (\n      /would.?you.?like.?to.?run.?the.?following.?command/i.test(stripped) ||\n      /do.?you.?want.?to.?approve.?access/i.test(stripped) ||\n      /would.?you.?like.?to.?make.?the.?following.?edits/i.test(stripped) ||\n      (/press.?enter.?to.?confirm/i.test(stripped) &&\n        /esc.?to.?cancel/i.test(stripped))\n    ) {\n      return {\n        detected: true,\n        type: 'permission',\n        prompt: 'Codex tool approval',\n        suggestedResponse: 'keys:enter',\n        canAutoRespond: true,\n        instructions:\n          'Codex is asking permission to execute a command, approve access, or apply edits',\n      };\n    }\n\n    // Login check — after permission prompts\n    const loginDetection = this.detectLogin(output);\n    if (loginDetection.required) {\n      return {\n        detected: true,\n        type: 'login',\n        prompt: loginDetection.instructions,\n        url: loginDetection.url,\n        canAutoRespond: false,\n        instructions: loginDetection.instructions,\n      };\n    }\n\n    // Windows sandbox setup (chatwidget.rs:5818)\n    if (\n      /set.?up.?default.?sandbox/i.test(stripped) ||\n      /use.?non-admin.?sandbox/i.test(stripped)\n    ) {\n      return {\n        detected: true,\n        type: 'config',\n        prompt: 'Windows sandbox setup',\n        canAutoRespond: false,\n        instructions: 'Codex needs a sandbox configuration on Windows',\n      };\n    }\n\n    // Multi-step user input from model (request_user_input/mod.rs:41)\n    if (\n      /type.?your.?answer/i.test(stripped) &&\n      /select.?an.?option/i.test(stripped)\n    ) {\n      return {\n        detected: true,\n        type: 'unknown',\n        prompt: 'Codex requesting structured user input',\n        canAutoRespond: false,\n        instructions:\n          'Codex model is asking multi-step questions that require user input',\n      };\n    }\n\n    // Model selection\n    if (\n      /select.*model|choose.*model|gpt-4|gpt-3\\.5/i.test(stripped) &&\n      /\\d+\\)/i.test(stripped)\n    ) {\n      return {\n        detected: true,\n        type: 'model_select',\n        prompt: 'OpenAI model selection',\n        canAutoRespond: false,\n        instructions: 'Please select a model or set OPENAI_MODEL env var',\n      };\n    }\n\n    // Organization selection\n    if (\n      /select.*organization|choose.*org|multiple organizations/i.test(stripped)\n    ) {\n      return {\n        detected: true,\n        type: 'config',\n        prompt: 'Organization selection',\n        canAutoRespond: false,\n        instructions: 'Please select an OpenAI organization',\n      };\n    }\n\n    // Rate limit warning\n    if (\n      /rate limit|too many requests/i.test(stripped) &&\n      /retry|wait/i.test(stripped)\n    ) {\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  /**\n   * Detect if Codex CLI is actively loading/processing.\n   *\n   * Patterns from: AGENT_LOADING_STATUS_PATTERNS.json\n   *   - codex_active_status_row: \"• Working (0s • esc to interrupt)\"\n   *   - codex_active_booting_mcp: \"Booting MCP server: ...\"\n   *   - codex_active_web_search: \"Searching the web\"\n   */\n  detectLoading(output: string): boolean {\n    const stripped = this.stripAnsi(output);\n    const tail = stripped.slice(-500);\n\n    // Active status row with \"esc to interrupt\"\n    if (/esc\\s+to\\s+interrupt/i.test(tail)) {\n      return true;\n    }\n\n    // Booting MCP server\n    if (/Booting\\s+MCP\\s+server/i.test(tail)) {\n      return true;\n    }\n\n    // Web search in progress\n    if (/Searching\\s+the\\s+web/i.test(tail)) {\n      return true;\n    }\n\n    return false;\n  }\n\n  /**\n   * Detect task completion for Codex CLI.\n   *\n   * High-confidence patterns:\n   *   - \"Worked for Xm Ys\" separator after work-heavy turns\n   *   - \"› Ask Codex to do anything\" ready prompt\n   *\n   * Patterns from: AGENT_LOADING_STATUS_PATTERNS.json\n   *   - codex_completed_worked_for_separator\n   *   - codex_ready_prompt\n   */\n  detectTaskComplete(output: string): boolean {\n    const stripped = this.stripAnsi(output);\n    if (!stripped.trim()) return false;\n    // Do NOT call detectLoading() here — stale loading patterns in the buffer\n    // would suppress valid completion signals. Priority is handled at the\n    // PTY session level.\n\n    // \"Worked for <duration>\" separator — high-confidence completion indicator\n    const hasWorkedFor =\n      /Worked\\s+for\\s+\\d+(?:h\\s+\\d{2}m\\s+\\d{2}s|m\\s+\\d{2}s|s)/.test(stripped);\n\n    // Composer-ready prompt: \"› Ask Codex to do anything\" OR any non-menu composer row.\n    // Excludes menu selections like \"› 1. Yes, proceed\".\n    const hasComposerPrompt =\n      /›\\s+Ask\\s+Codex\\s+to\\s+do\\s+anything/.test(stripped) ||\n      /^\\s*›\\s*(?!\\d+\\.)\\S.*$/m.test(stripped);\n\n    // Footer hints that are shown with an active idle composer.\n    const hasIdleFooterHints =\n      /\\?\\s+for\\s+shortcuts/i.test(stripped) ||\n      /context\\s+left/i.test(stripped) ||\n      /tab\\s+to\\s+queue\\s+message/i.test(stripped);\n\n    // High confidence: worked-for separator + idle composer signal\n    if (hasWorkedFor && (hasComposerPrompt || hasIdleFooterHints)) {\n      return true;\n    }\n\n    // Medium confidence: idle composer prompt alone\n    if (hasComposerPrompt) {\n      return true;\n    }\n\n    // Worked-for separator + idle footer hints\n    if (hasWorkedFor && hasIdleFooterHints) {\n      return true;\n    }\n\n    return false;\n  }\n\n  detectReady(output: string): boolean {\n    const rawTail = output.slice(-2000);\n    const hasRawComposerSignals =\n      /OpenAI\\s+Codex/i.test(rawTail) &&\n      (/Explain\\s+this\\s+codebase/i.test(rawTail) ||\n        /Summarize\\s+recent\\s+commits/i.test(rawTail) ||\n        /Ask\\s+Codex\\s+to\\s+do\\s+anything/i.test(rawTail) ||\n        /\\?\\s+for\\s+shortcuts/i.test(rawTail) ||\n        /context\\s+left/i.test(rawTail));\n    if (hasRawComposerSignals) {\n      return true;\n    }\n\n    const stripped = this.stripAnsi(output);\n    if (!stripped.trim()) return false;\n    // Same rationale as detectTaskComplete: don't let stale loading patterns\n    // suppress ready detection.\n\n    // Positive ready signals first (tail-biased), then fallback to guards.\n    // This prevents stale historical text in outputBuffer from masking\n    // a real idle composer prompt after task completion.\n    const tail = stripped.slice(-1200);\n    const hasComposerPrompt =\n      /^\\s*›\\s*(?!\\d+\\.)\\S.*$/m.test(tail) ||\n      /›\\s+Ask\\s+Codex\\s+to\\s+do\\s+anything/.test(tail);\n    const hasComposerFooter =\n      /\\?\\s+for\\s+shortcuts/i.test(tail) ||\n      /context\\s+left/i.test(tail) ||\n      /tab\\s+to\\s+queue\\s+message/i.test(tail) ||\n      /shift\\s*\\+\\s*enter\\s+for\\s+newline/i.test(tail);\n    const hasStartupComposerHints =\n      /Summarize\\s+recent\\s+commits/i.test(tail) ||\n      /Explain\\s+this\\s+codebase/i.test(tail) ||\n      /Ask\\s+Codex\\s+to\\s+do\\s+anything/i.test(tail);\n    const hasCodexHeader =\n      /OpenAI\\s+Codex/i.test(tail) && /directory:\\s+~?\\/?.+/i.test(tail);\n    const hasInteractiveStatusBar =\n      /gpt-[\\w.-]+\\s+(?:high|medium|low)/i.test(tail) && /left\\b/i.test(tail);\n\n    if (\n      hasComposerPrompt ||\n      hasComposerFooter ||\n      hasStartupComposerHints ||\n      (hasCodexHeader && hasInteractiveStatusBar)\n    ) {\n      return true;\n    }\n\n    // Guard: if output contains trust, auth, or update prompts, we're NOT ready\n    if (\n      /do.?you.?trust.?the.?contents/i.test(stripped) ||\n      /sign.?in.?with.?chatgpt/i.test(stripped) ||\n      /update.?available/i.test(stripped) ||\n      /enable.?full.?access/i.test(stripped) ||\n      /choose.?working.?directory/i.test(stripped)\n    ) {\n      return false;\n    }\n\n    // Placeholder suggestions indicate the composer is active (chatwidget.rs:7228)\n    if (\n      /explain this codebase|summarize recent commits|find and fix a bug/i.test(\n        stripped\n      )\n    ) {\n      return true;\n    }\n\n    return (\n      stripped.includes('How can I help') || /(?:codex|>)\\s*$/i.test(stripped)\n    );\n  }\n\n  parseOutput(output: string): ParsedOutput | null {\n    const stripped = this.stripAnsi(output);\n\n    const isComplete = this.isResponseComplete(stripped);\n\n    if (!isComplete) {\n      return null;\n    }\n\n    const isQuestion = this.containsQuestion(stripped);\n    const content = this.extractContent(stripped, /^.*(?:codex|>)\\s*/gim);\n\n    return {\n      type: isQuestion ? 'question' : 'response',\n      content,\n      isComplete: true,\n      isQuestion,\n      metadata: {\n        raw: output,\n      },\n    };\n  }\n\n  /**\n   * Detect exit conditions specific to Codex CLI.\n   * Source: main.rs:404, main.rs:414, main.rs:461\n   */\n  override detectExit(output: string): {\n    exited: boolean;\n    code?: number;\n    error?: string;\n  } {\n    const stripped = this.stripAnsi(output);\n\n    // Session ended — provides resume command (main.rs:404)\n    if (/to.?continue.?this.?session,?.?run/i.test(stripped)) {\n      return { exited: true, code: 0 };\n    }\n\n    // Update completed — needs restart (main.rs:461)\n    if (/update.?ran.?successfully.*restart.?codex/i.test(stripped)) {\n      return {\n        exited: true,\n        code: 0,\n        error: 'Codex updated successfully — restart required',\n      };\n    }\n\n    return super.detectExit(output);\n  }\n\n  getPromptPattern(): RegExp {\n    return /(?:codex|>)\\s*$/i;\n  }\n\n  getHealthCheckCommand(): string {\n    return 'codex --version';\n  }\n}\n","/**\n * Google Gemini CLI Adapter\n *\n * Adapter for the Google Gemini CLI tool.\n */\n\nimport type {\n  AutoResponseRule,\n  BlockingPromptDetection,\n  LoginDetection,\n  ParsedOutput,\n  SpawnConfig,\n  ToolRunningInfo,\n} from 'adapter-types';\nimport {\n  type AgentCredentials,\n  type AgentFileDescriptor,\n  type AuthStatus,\n  BaseCodingAdapter,\n  type InstallationInfo,\n  type ModelRecommendations,\n} from './base-coding-adapter';\n\nconst GEMINI_HOOK_MARKER_PREFIX = 'PARALLAX_GEMINI_HOOK';\n\ninterface GeminiHookMarker {\n  event: string;\n  notification_type?: string;\n  tool_name?: string;\n  message?: string;\n}\n\ninterface GeminiAdapterConfig {\n  geminiHookTelemetry?: boolean;\n  geminiHookMarkerPrefix?: string;\n}\n\nexport class GeminiAdapter extends BaseCodingAdapter {\n  readonly adapterType = 'gemini';\n  readonly displayName = 'Google Gemini';\n  override readonly readySettleMs: number = 1500;\n\n  readonly installation: InstallationInfo = {\n    command: 'npm install -g @google/gemini-cli',\n    alternatives: ['See documentation for latest installation method'],\n    docsUrl: 'https://github.com/google-gemini/gemini-cli#installation',\n  };\n\n  /**\n   * Auto-response rules for Gemini CLI.\n   * Gemini uses Ink/React TUI with arrow-key radio menus.\n   * Source: FolderTrustDialog.tsx, MultiFolderTrustDialog.tsx, CloudFreePrivacyNotice.tsx\n   */\n  readonly autoResponseRules: AutoResponseRule[] = [\n    {\n      pattern:\n        /do.?you.?trust.?this.?folder|trust.?folder|trust.?parent.?folder/i,\n      type: 'permission',\n      response: '',\n      responseType: 'keys',\n      keys: ['enter'],\n      description: 'Trust current folder (default selection in radio menu)',\n      safe: true,\n      once: true,\n    },\n    {\n      pattern: /trust.?the.?following.?folders.*(added|workspace)/i,\n      type: 'permission',\n      response: '',\n      responseType: 'keys',\n      keys: ['enter'],\n      description: 'Trust multiple folders being added to workspace',\n      safe: true,\n      once: true,\n    },\n    {\n      pattern: /allow.?google.?to.?use.?this.?data/i,\n      type: 'config',\n      response: '',\n      responseType: 'keys',\n      keys: ['down', 'enter'],\n      description: 'Decline Google data collection (select \"No\")',\n      safe: true,\n      once: true,\n    },\n  ];\n\n  getWorkspaceFiles(): AgentFileDescriptor[] {\n    return [\n      {\n        relativePath: 'GEMINI.md',\n        description: 'Project-level instructions read automatically on startup',\n        autoLoaded: true,\n        type: 'memory',\n        format: 'markdown',\n      },\n      {\n        relativePath: '.gemini/settings.json',\n        description:\n          'Project-scoped settings (tool permissions, sandbox config)',\n        autoLoaded: true,\n        type: 'config',\n        format: 'json',\n      },\n      {\n        relativePath: '.gemini/styles',\n        description: 'Custom style/persona definitions directory',\n        autoLoaded: false,\n        type: 'config',\n        format: 'markdown',\n      },\n    ];\n  }\n\n  getRecommendedModels(_credentials?: AgentCredentials): ModelRecommendations {\n    return {\n      powerful: 'gemini-3-pro',\n      fast: 'gemini-3-flash',\n    };\n  }\n\n  override async checkAuthStatus(): Promise<AuthStatus> {\n    // Gemini CLI has no dedicated auth status command.\n    // Check for credential files cross-platform.\n    const { existsSync } = await import('node:fs');\n    const { homedir } = await import('node:os');\n    const { join } = await import('node:path');\n\n    const base =\n      process.platform === 'win32'\n        ? join(process.env.APPDATA || join(homedir(), 'AppData', 'Roaming'), 'gemini')\n        : join(homedir(), '.gemini');\n\n    // google_accounts.json is created after OAuth login\n    if (existsSync(join(base, 'google_accounts.json'))) {\n      return { status: 'authenticated', method: 'oauth' };\n    }\n    // If the config dir exists but no accounts file, likely not authenticated\n    if (existsSync(base)) {\n      return {\n        status: 'unauthenticated',\n        loginHint: 'Run \"gemini\" and complete the Google sign-in flow.',\n      };\n    }\n    return { status: 'unknown' };\n  }\n\n  override async triggerAuth(): Promise<{\n    launched: boolean;\n    url?: string;\n    instructions: string;\n  } | null> {\n    // Gemini CLI has no dedicated auth command — auth is embedded in startup.\n    // Best we can do: tell the user to run it manually.\n    return {\n      launched: false,\n      instructions:\n        'Run \"gemini\" in your terminal and complete the Google sign-in flow.',\n    };\n  }\n\n  getCommand(): string {\n    return 'gemini';\n  }\n\n  getArgs(config: SpawnConfig): string[] {\n    const args: string[] = [];\n\n    // Non-interactive mode (skip if interactive mode)\n    if (!this.isInteractive(config)) {\n      args.push('--non-interactive');\n      // Text output for easier parsing (only in non-interactive mode)\n      args.push('--output-format', 'text');\n\n      // Set working directory in non-interactive mode\n      // In interactive/PTY mode, the PTY's cwd is already set by spawn config\n      if (config.workdir) {\n        args.push('--cwd', config.workdir);\n      }\n    }\n\n    // Append approval preset CLI flags\n    const approvalConfig = this.getApprovalConfig(config);\n    if (approvalConfig) {\n      args.push(...approvalConfig.cliFlags);\n    }\n\n    return args;\n  }\n\n  getEnv(config: SpawnConfig): Record<string, string> {\n    const env: Record<string, string> = {};\n    const credentials = this.getCredentials(config);\n    const adapterConfig = config.adapterConfig as\n      | GeminiAdapterConfig\n      | undefined;\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    // Optional: hook telemetry mode. Gemini hooks can emit marker lines\n    // via systemMessage in valid JSON responses.\n    if (adapterConfig?.geminiHookTelemetry) {\n      env.PARALLAX_GEMINI_HOOK_TELEMETRY = '1';\n      env.PARALLAX_GEMINI_HOOK_MARKER_PREFIX =\n        adapterConfig.geminiHookMarkerPrefix || GEMINI_HOOK_MARKER_PREFIX;\n    }\n\n    return env;\n  }\n\n  override getHookTelemetryProtocol(options?: {\n    scriptPath?: string;\n    markerPrefix?: string;\n    httpUrl?: string;\n    sessionId?: string;\n  }): {\n    markerPrefix: string;\n    scriptPath: string;\n    scriptContent: string;\n    settingsHooks: Record<string, unknown>;\n  } {\n    // HTTP hook mode: generate command hooks that curl the orchestrator endpoint.\n    // Gemini CLI only supports command hooks (no native HTTP), so we bridge\n    // stdin JSON → curl POST → pipe response JSON back to stdout.\n    if (options?.httpUrl) {\n      const sessionHeader = options.sessionId\n        ? ` -H 'X-Parallax-Session-Id: ${options.sessionId}'`\n        : '';\n      // The command reads Gemini's hook JSON from stdin, POSTs it to the\n      // orchestrator, and pipes the JSON response back to stdout. On curl\n      // failure, emit a safe no-op JSON so Gemini continues normally.\n      const curlCommand =\n        `bash -c 'curl -sf -X POST \"${options.httpUrl}\"` +\n        ` -H \"Content-Type: application/json\"${sessionHeader}` +\n        ` -d @- --max-time 4 2>/dev/null || echo \"{\\\\\"continue\\\\\":true}\"'`;\n\n      const hookEntry = [\n        {\n          matcher: '',\n          hooks: [{ type: 'command', command: curlCommand, timeout: 5000 }],\n        },\n      ];\n      const hookEntryNoMatcher = [\n        { hooks: [{ type: 'command', command: curlCommand, timeout: 5000 }] },\n      ];\n\n      const settingsHooks: Record<string, unknown> = {\n        BeforeTool: hookEntry,\n        AfterTool: hookEntry,\n        AfterAgent: hookEntryNoMatcher,\n        SessionEnd: hookEntryNoMatcher,\n        Notification: hookEntry,\n      };\n\n      return {\n        markerPrefix: '',\n        scriptPath: '',\n        scriptContent: '',\n        settingsHooks,\n      };\n    }\n\n    // Command hook mode (fallback): emit marker lines via systemMessage\n    const markerPrefix = options?.markerPrefix || GEMINI_HOOK_MARKER_PREFIX;\n    const scriptPath =\n      options?.scriptPath || '.gemini/hooks/parallax-hook-telemetry.sh';\n    const scriptCommand = `\"${'$'}GEMINI_PROJECT_ROOT\"/${scriptPath}`;\n    const hookEntry = [\n      { matcher: '', hooks: [{ type: 'command', command: scriptCommand }] },\n    ];\n\n    const settingsHooks: Record<string, unknown> = {\n      Notification: hookEntry,\n      BeforeTool: hookEntry,\n      AfterAgent: hookEntry,\n      SessionEnd: hookEntry,\n    };\n\n    // Gemini hook stdout must be valid JSON. We encode marker output through\n    // systemMessage so the marker still appears in terminal output.\n    const scriptContent = `#!/usr/bin/env bash\nset -euo pipefail\n\nINPUT=\"$(cat)\"\n[ -z \"${'$'}INPUT\" ] && exit 0\n\nif ! command -v jq >/dev/null 2>&1; then\n  # Valid no-op response\n  printf '%s\\n' '{\"continue\":true}'\n  exit 0\nfi\n\nEVENT=\"$(printf '%s' \"${'$'}INPUT\" | jq -r '.hookEventName // .hook_event_name // empty')\"\n[ -z \"${'$'}EVENT\" ] && { printf '%s\\n' '{\"continue\":true}'; exit 0; }\n\nNOTIFICATION_TYPE=\"$(printf '%s' \"${'$'}INPUT\" | jq -r '.notificationType // .notification_type // empty')\"\nTOOL_NAME=\"$(printf '%s' \"${'$'}INPUT\" | jq -r '.toolName // .tool_name // empty')\"\nMESSAGE=\"$(printf '%s' \"${'$'}INPUT\" | jq -r '.message // empty')\"\n\nPAYLOAD=\"$(jq -nc \\\\\n  --arg event \"${'$'}EVENT\" \\\\\n  --arg notification_type \"${'$'}NOTIFICATION_TYPE\" \\\\\n  --arg tool_name \"${'$'}TOOL_NAME\" \\\\\n  --arg message \"${'$'}MESSAGE\" \\\\\n  '({event: $event}\n   + (if $notification_type != \"\" then {notification_type: $notification_type} else {} end)\n   + (if $tool_name != \"\" then {tool_name: $tool_name} else {} end)\n   + (if $message != \"\" then {message: $message} else {} end))')\"\n\nMARKER=\"${markerPrefix} ${'$'}PAYLOAD\"\njq -nc --arg m \"${'$'}MARKER\" '{continue: true, suppressOutput: true, systemMessage: $m}'\n`;\n\n    return {\n      markerPrefix,\n      scriptPath,\n      scriptContent,\n      settingsHooks,\n    };\n  }\n\n  private getHookMarkers(output: string): GeminiHookMarker[] {\n    const markers: GeminiHookMarker[] = [];\n    const markerRegex = /(?:^|\\n)\\s*([A-Z0-9_]+)\\s+(\\{[^\\n\\r]+\\})/g;\n    let match: RegExpExecArray | null;\n\n    while ((match = markerRegex.exec(output)) !== null) {\n      const markerToken = match[1];\n      if (!markerToken.includes('GEMINI_HOOK')) {\n        continue;\n      }\n      const payload = match[2];\n      try {\n        const parsed = JSON.parse(payload) as Record<string, unknown>;\n        const event =\n          typeof parsed.event === 'string' ? parsed.event : undefined;\n        if (!event) continue;\n        markers.push({\n          event,\n          notification_type:\n            typeof parsed.notification_type === 'string'\n              ? parsed.notification_type\n              : undefined,\n          tool_name:\n            typeof parsed.tool_name === 'string' ? parsed.tool_name : undefined,\n          message:\n            typeof parsed.message === 'string' ? parsed.message : undefined,\n        });\n      } catch {\n        // Ignore malformed marker payloads.\n      }\n    }\n\n    return markers;\n  }\n\n  private getLatestHookMarker(output: string): GeminiHookMarker | null {\n    const markers = this.getHookMarkers(output);\n    return markers.length > 0 ? markers[markers.length - 1] : null;\n  }\n\n  private stripHookMarkers(output: string): string {\n    return output.replace(\n      /(?:^|\\n)\\s*[A-Z0-9_]*GEMINI_HOOK[A-Z0-9_]*\\s+\\{[^\\n\\r]+\\}\\s*/g,\n      '\\n'\n    );\n  }\n\n  detectLogin(output: string): LoginDetection {\n    const stripped = this.stripAnsi(output);\n\n    // Check for API key issues.\n    // Must require error context — \"Both GOOGLE_API_KEY and GEMINI_API_KEY are set. Using ...\"\n    // is a success message, not an auth error.\n    if (\n      stripped.includes('API key not found') ||\n      /set (?:GOOGLE_API_KEY|GEMINI_API_KEY)/i.test(stripped) ||\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:\n          'Set GOOGLE_API_KEY or GEMINI_API_KEY environment variable',\n      };\n    }\n\n    // Gemini API key entry dialog (ApiAuthDialog.tsx)\n    if (/enter.?gemini.?api.?key/i.test(stripped)) {\n      return {\n        required: true,\n        type: 'api_key',\n        instructions:\n          'Enter a Gemini API key or set GEMINI_API_KEY environment variable',\n      };\n    }\n\n    // Auth dialog — initial auth choice (AuthDialog.tsx)\n    if (\n      /how.?would.?you.?like.?to.?authenticate/i.test(stripped) ||\n      (/get.?started/i.test(stripped) &&\n        /login.?with.?google|use.?gemini.?api.?key|vertex/i.test(stripped))\n    ) {\n      return {\n        required: true,\n        type: 'oauth',\n        instructions:\n          'Gemini CLI authentication required — select an auth method',\n      };\n    }\n\n    // OAuth in-progress (AuthInProgress.tsx)\n    if (/waiting.?for.?auth/i.test(stripped)) {\n      return {\n        required: true,\n        type: 'oauth',\n        instructions: 'Waiting for browser authentication to complete',\n      };\n    }\n\n    // Check for OAuth flow\n    if (\n      stripped.includes('Sign in with Google') ||\n      stripped.includes('OAuth') ||\n      stripped.includes('accounts.google.com')\n    ) {\n      const urlMatch = stripped.match(/https?:\\/\\/[^\\s]+/);\n      return {\n        required: true,\n        type: 'oauth',\n        url: urlMatch ? urlMatch[0] : 'https://accounts.google.com',\n        instructions: 'Google OAuth authentication required',\n      };\n    }\n\n    // Check for ADC (Application Default Credentials)\n    if (\n      stripped.includes('Application Default Credentials') ||\n      stripped.includes('gcloud auth')\n    ) {\n      return {\n        required: true,\n        type: 'browser',\n        instructions: 'Run: gcloud auth application-default login',\n      };\n    }\n\n    return { required: false };\n  }\n\n  detectBlockingPrompt(output: string): BlockingPromptDetection {\n    const stripped = this.stripAnsi(output);\n    const marker = this.getLatestHookMarker(stripped);\n\n    if (\n      marker?.event === 'Notification' &&\n      marker.notification_type === 'ToolPermission'\n    ) {\n      return {\n        detected: true,\n        type: 'permission',\n        prompt: marker.message || 'Gemini tool permission',\n        suggestedResponse: 'keys:enter',\n        canAutoRespond: true,\n        instructions: 'Gemini is asking to allow a tool action',\n      };\n    }\n\n    // Tool permission / execution confirmation (ToolConfirmationMessage.tsx)\n    // Check BEFORE login — permission prompts contain \"API key\" banner text\n    // that would otherwise false-positive the login detector.\n    // TUI arrow-key menu — use keys:enter to select \"Allow once\" (default)\n    if (\n      /apply.?this.?change\\??/i.test(stripped) ||\n      /allow.?execution.?of/i.test(stripped) ||\n      /do.?you.?want.?to.?proceed\\??/i.test(stripped) ||\n      /waiting.?for.?user.?confirmation/i.test(stripped)\n    ) {\n      return {\n        detected: true,\n        type: 'permission',\n        prompt: 'Gemini tool execution confirmation',\n        suggestedResponse: 'keys:enter',\n        canAutoRespond: true,\n        instructions:\n          'Gemini is asking to apply a change (file write, shell command, etc.)',\n      };\n    }\n\n    // Interactive shell command confirmation prompts (inside tool output).\n    // Example from captures: \"Do you want to continue (Y/n)?\"\n    if (\n      /do.?you.?want.?to.?continue\\s*\\([yY]\\/[nN]\\)\\??/i.test(stripped) ||\n      /continue\\??\\s*\\([yY]\\/[nN]\\)\\??/i.test(stripped) ||\n      /are.?you.?sure\\??\\s*\\([yY]\\/[nN]\\)\\??/i.test(stripped)\n    ) {\n      return {\n        detected: true,\n        type: 'tool_wait',\n        prompt: 'Interactive shell confirmation required (y/n)',\n        canAutoRespond: false,\n        instructions:\n          'Focus shell input (Tab) and answer the y/n confirmation prompt',\n      };\n    }\n\n    // Interactive shell awaiting input (usePhraseCycler.ts)\n    if (/Interactive\\s+shell\\s+awaiting\\s+input/i.test(stripped)) {\n      return {\n        detected: true,\n        type: 'tool_wait',\n        prompt: 'Gemini interactive shell needs user focus',\n        canAutoRespond: false,\n        instructions:\n          'Press Tab to focus the interactive shell, or wait for it to complete',\n      };\n    }\n\n    // Session checkpoint prompt\n    if (\n      /enable.?checkpointing.?to.?recover.?your.?session.?after.?a.?crash/i.test(\n        stripped\n      )\n    ) {\n      return {\n        detected: true,\n        type: 'config',\n        prompt: 'Gemini checkpoint setup prompt',\n        canAutoRespond: false,\n        instructions:\n          'Respond to checkpoint setup prompt (for example: press \"s\" to configure or dismiss)',\n      };\n    }\n\n    // Login check — after permission prompts\n    const loginDetection = this.detectLogin(output);\n    if (loginDetection.required) {\n      return {\n        detected: true,\n        type: 'login',\n        prompt: loginDetection.instructions,\n        url: loginDetection.url,\n        canAutoRespond: false,\n        instructions: loginDetection.instructions,\n      };\n    }\n\n    // Account validation required (ValidationDialog.tsx)\n    if (\n      /further.?action.?is.?required/i.test(stripped) ||\n      /verify.?your.?account/i.test(stripped) ||\n      /waiting.?for.?verification/i.test(stripped)\n    ) {\n      return {\n        detected: true,\n        type: 'config',\n        prompt: 'Account verification required',\n        canAutoRespond: false,\n        instructions:\n          'Your Gemini account requires verification before continuing',\n      };\n    }\n\n    // Model selection\n    if (\n      /select.*model|choose.*model|gemini-/i.test(stripped) &&\n      /\\d+\\)/i.test(stripped)\n    ) {\n      return {\n        detected: true,\n        type: 'model_select',\n        prompt: 'Gemini model selection',\n        canAutoRespond: false,\n        instructions: 'Please select a model or set GEMINI_MODEL env var',\n      };\n    }\n\n    // Project selection\n    if (\n      /select.*project|choose.*project|google cloud project/i.test(stripped)\n    ) {\n      return {\n        detected: true,\n        type: 'project_select',\n        prompt: 'Google Cloud project selection',\n        canAutoRespond: false,\n        instructions: 'Please select a Google Cloud project',\n      };\n    }\n\n    // Safety filter triggered\n    if (/safety.*filter|content.*blocked|unsafe.*content/i.test(stripped)) {\n      return {\n        detected: true,\n        type: 'unknown',\n        prompt: 'Safety filter triggered',\n        canAutoRespond: false,\n        instructions: 'Content was blocked by safety filters',\n      };\n    }\n\n    // Fall back to base class detection\n    return super.detectBlockingPrompt(output);\n  }\n\n  /**\n   * Detect if Gemini CLI is actively loading/processing.\n   *\n   * Patterns from: AGENT_LOADING_STATUS_PATTERNS.json\n   *   - gemini_active_loading_line: \"(esc to cancel, Xs)\"\n   *   - gemini_active_waiting_user_confirmation: \"Waiting for user confirmation...\"\n   */\n  detectLoading(output: string): boolean {\n    const stripped = this.stripAnsi(output);\n    const marker = this.getLatestHookMarker(stripped);\n    const tail = stripped.slice(-500);\n\n    if (marker?.event === 'BeforeTool') {\n      return true;\n    }\n\n    // Active loading indicator with \"esc to cancel\" + timer\n    if (/esc\\s+to\\s+cancel/i.test(tail)) {\n      return true;\n    }\n\n    // Waiting for user confirmation (streaming state)\n    if (/Waiting\\s+for\\s+user\\s+confirmation/i.test(tail)) {\n      return true;\n    }\n\n    return false;\n  }\n\n  detectToolRunning(output: string): ToolRunningInfo | null {\n    const stripped = this.stripAnsi(output);\n    const marker = this.getLatestHookMarker(stripped);\n    if (marker?.event === 'BeforeTool' && marker.tool_name) {\n      return {\n        toolName: marker.tool_name.toLowerCase(),\n        description: `${marker.tool_name} (hook)`,\n      };\n    }\n    return null;\n  }\n\n  /**\n   * Detect task completion for Gemini CLI.\n   *\n   * High-confidence patterns:\n   *   - \"◇ Ready\" window title signal (OSC sequence, may survive ANSI stripping)\n   *   - \"Type your message\" composer placeholder after agent output\n   *\n   * Patterns from: AGENT_LOADING_STATUS_PATTERNS.json\n   *   - gemini_ready_title\n   */\n  detectTaskComplete(output: string): boolean {\n    const stripped = this.stripAnsi(output);\n    const marker = this.getLatestHookMarker(stripped);\n\n    if (marker?.event === 'AfterAgent') {\n      return true;\n    }\n\n    // Window title \"◇ Ready\" is a strong task-complete signal\n    if (/◇\\s+Ready/.test(stripped)) {\n      return true;\n    }\n\n    // Composer placeholder is definitive — the agent is idle\n    if (/type.?your.?message/i.test(stripped)) {\n      return true;\n    }\n\n    return false;\n  }\n\n  detectReady(output: string): boolean {\n    const stripped = this.stripAnsi(output);\n    const marker = this.getLatestHookMarker(stripped);\n\n    if (\n      marker?.event === 'Notification' &&\n      marker.notification_type === 'ToolPermission'\n    ) {\n      return false;\n    }\n    if (marker?.event === 'AfterAgent') {\n      return true;\n    }\n\n    const hasActiveOverlay =\n      /interactive\\s+shell\\s+awaiting\\s+input|press\\s+tab\\s+to\\s+focus\\s+shell/i.test(\n        stripped\n      ) ||\n      /waiting\\s+for\\s+user\\s+confirmation|apply.?this.?change|allow.?execution|do.?you.?want.?to.?proceed/i.test(\n        stripped\n      ) ||\n      /do.?you.?want.?to.?continue\\s*\\([yY]\\/[nN]\\)\\??|are.?you.?sure\\??\\s*\\([yY]\\/[nN]\\)\\??/i.test(\n        stripped\n      ) ||\n      /enable.?checkpointing.?to.?recover.?your.?session.?after.?a.?crash/i.test(\n        stripped\n      ) ||\n      /esc\\s+to\\s+cancel|esc\\s+to\\s+interrupt/i.test(stripped);\n\n    if (hasActiveOverlay) {\n      return false;\n    }\n\n    // Definitive positive indicators — always win, even if stale auth/trust\n    // dialog text is still in the buffer from a TUI re-render.\n    // \"Type your message\" is the Composer placeholder (Composer.tsx:446)\n    // and is unambiguous — the CLI is ready to accept input.\n    if (/type.?your.?message/i.test(stripped)) {\n      return true;\n    }\n\n    // Guard: if output contains a trust or auth prompt, we're NOT ready\n    // (only checked when no definitive positive indicator is present)\n    if (\n      /do.?you.?trust.?this.?folder/i.test(stripped) ||\n      /how.?would.?you.?like.?to.?authenticate/i.test(stripped) ||\n      /waiting.?for.?auth/i.test(stripped) ||\n      /allow.?google.?to.?use.?this.?data/i.test(stripped)\n    ) {\n      return false;\n    }\n\n    // InputPrompt glyph — >, !, *, (r:) (InputPrompt.tsx:1450)\n    if (/^\\s*[>!*]\\s+/m.test(stripped) || /\\(r:\\)/.test(stripped)) {\n      return true;\n    }\n\n    return (\n      stripped.includes('How can I help') ||\n      stripped.includes('What would you like') ||\n      // Match \"gemini> \" prompt specifically, not bare \">\"\n      /gemini>\\s*$/i.test(stripped)\n    );\n  }\n\n  parseOutput(output: string): ParsedOutput | null {\n    const withoutHookMarkers = this.stripHookMarkers(output);\n    const stripped = this.stripAnsi(withoutHookMarkers);\n\n    const isComplete = this.isResponseComplete(stripped);\n\n    if (!isComplete) {\n      return null;\n    }\n\n    const isQuestion = this.containsQuestion(stripped);\n\n    // Extract content, removing prompts and safety warnings\n    let content = this.extractContent(stripped, /^.*(?:gemini|>)\\s*/gim);\n    content = content.replace(/^\\[Safety[^\\]]*\\].*$/gm, '');\n\n    return {\n      type: isQuestion ? 'question' : 'response',\n      content,\n      isComplete: true,\n      isQuestion,\n      metadata: {\n        raw: output,\n      },\n    };\n  }\n\n  /**\n   * Detect exit conditions specific to Gemini CLI.\n   * Source: FolderTrustDialog.tsx:127, LogoutConfirmationDialog.tsx:64\n   */\n  override detectExit(output: string): {\n    exited: boolean;\n    code?: number;\n    error?: string;\n  } {\n    const stripped = this.stripAnsi(output);\n    const marker = this.getLatestHookMarker(stripped);\n\n    if (marker?.event === 'SessionEnd') {\n      return {\n        exited: true,\n        code: 0,\n      };\n    }\n\n    if (/folder.?trust.?level.?must.?be.?selected.*exiting/i.test(stripped)) {\n      return {\n        exited: true,\n        code: 1,\n        error: 'Gemini CLI exited because no folder trust level was selected',\n      };\n    }\n\n    if (/you are now logged out/i.test(stripped)) {\n      return {\n        exited: true,\n        code: 0,\n      };\n    }\n\n    // Session summary / shutdown (SessionSummaryDisplay.tsx)\n    if (/Agent\\s+powering\\s+down/i.test(stripped)) {\n      return {\n        exited: true,\n        code: 0,\n      };\n    }\n\n    return super.detectExit(output);\n  }\n\n  getPromptPattern(): RegExp {\n    // Match \"gemini> \" specifically, not bare \">\" which is too broad\n    return /gemini>\\s*$/i;\n  }\n\n  getHealthCheckCommand(): string {\n    return 'gemini --version';\n  }\n}\n","/**\n * Hermes Agent CLI Adapter\n *\n * Adapter for the Hermes Agent CLI tool.\n */\n\nimport type {\n  BlockingPromptDetection,\n  LoginDetection,\n  ParsedOutput,\n  SpawnConfig,\n} from 'adapter-types';\nimport {\n  type AgentCredentials,\n  type AgentFileDescriptor,\n  BaseCodingAdapter,\n  type InstallationInfo,\n  type ModelRecommendations,\n} from './base-coding-adapter';\n\nexport class HermesAdapter extends BaseCodingAdapter {\n  readonly adapterType = 'hermes';\n  readonly displayName = 'Hermes Agent';\n\n  /** Prompt-toolkit TUI + spinner rendering needs a slightly longer settle. */\n  override readonly readySettleMs: number = 400;\n\n  readonly installation: InstallationInfo = {\n    command: 'pip install \"hermes-agent[cli]\"',\n    alternatives: [\n      'pipx install \"hermes-agent[cli]\"',\n      'uv tool install \"hermes-agent[cli]\"',\n    ],\n    docsUrl: 'https://github.com/NousResearch/hermes-agent',\n  };\n\n  getWorkspaceFiles(): AgentFileDescriptor[] {\n    return [\n      {\n        relativePath: 'AGENTS.md',\n        description:\n          'Project instructions and architecture notes loaded by Hermes context files',\n        autoLoaded: true,\n        type: 'memory',\n        format: 'markdown',\n      },\n      {\n        relativePath: 'SOUL.md',\n        description:\n          'Optional persona/context file auto-injected into Hermes system prompt',\n        autoLoaded: true,\n        type: 'memory',\n        format: 'markdown',\n      },\n      {\n        relativePath: 'cli-config.yaml',\n        description: 'Legacy/local Hermes CLI configuration file',\n        autoLoaded: true,\n        type: 'config',\n        format: 'yaml',\n      },\n    ];\n  }\n\n  getRecommendedModels(_credentials?: AgentCredentials): ModelRecommendations {\n    return {\n      powerful: 'anthropic/claude-opus-4.6',\n      fast: 'google/gemini-3-flash-preview',\n    };\n  }\n\n  getCommand(): string {\n    return 'hermes';\n  }\n\n  getArgs(_config: SpawnConfig): string[] {\n    // Force chat mode so startup behavior is consistent with the interactive CLI.\n    return ['chat'];\n  }\n\n  getEnv(config: SpawnConfig): Record<string, string> {\n    const env: Record<string, string> = {};\n    const credentials = this.getCredentials(config);\n\n    if (credentials.openaiKey) {\n      // Hermes primarily uses OpenRouter credentials in CLI mode.\n      env.OPENROUTER_API_KEY = credentials.openaiKey;\n      env.OPENAI_API_KEY = credentials.openaiKey;\n    }\n    if (credentials.anthropicKey) {\n      env.ANTHROPIC_API_KEY = credentials.anthropicKey;\n    }\n    if (credentials.googleKey) {\n      env.GOOGLE_API_KEY = credentials.googleKey;\n      env.GEMINI_API_KEY = credentials.googleKey;\n    }\n\n    if (!this.isInteractive(config)) {\n      env.HERMES_QUIET = '1';\n    }\n\n    return env;\n  }\n\n  detectLogin(output: string): LoginDetection {\n    const stripped = this.stripAnsi(output);\n\n    if (\n      /isn.?t configured yet/i.test(stripped) ||\n      /no api keys or providers found/i.test(stripped) ||\n      /run setup now\\?\\s*\\[y\\/n\\]/i.test(stripped)\n    ) {\n      return {\n        required: true,\n        type: 'api_key',\n        instructions: 'Hermes requires provider credentials. Run: hermes setup',\n      };\n    }\n\n    return { required: false };\n  }\n\n  detectBlockingPrompt(output: string): BlockingPromptDetection {\n    const stripped = this.stripAnsi(output);\n\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    if (/Hermes needs your input|Other \\(type your answer\\)/i.test(stripped)) {\n      return {\n        detected: true,\n        type: 'tool_wait',\n        prompt: 'Hermes clarify prompt',\n        canAutoRespond: false,\n        instructions:\n          'Hermes is waiting for clarify input (arrow keys + Enter or free text).',\n      };\n    }\n\n    if (\n      /Sudo Password Required|password hidden|Password \\(hidden\\):/i.test(\n        stripped\n      )\n    ) {\n      return {\n        detected: true,\n        type: 'tool_wait',\n        prompt: 'Hermes sudo password prompt',\n        canAutoRespond: false,\n        instructions:\n          'Hermes terminal tool is waiting for a sudo password or skip.',\n      };\n    }\n\n    if (\n      /Dangerous Command|Allow once|Allow for this session|permanent allowlist|\\bDeny\\b/i.test(\n        stripped\n      )\n    ) {\n      return {\n        detected: true,\n        type: 'permission',\n        prompt: 'Hermes dangerous command approval',\n        canAutoRespond: false,\n        instructions: 'Choose approval policy (once/session/always/deny).',\n      };\n    }\n\n    return super.detectBlockingPrompt(output);\n  }\n\n  detectLoading(output: string): boolean {\n    const stripped = this.stripAnsi(output);\n    const tail = stripped.slice(-1200);\n\n    // Thinking spinner verbs from agent/display.py\n    if (\n      /(?:pondering|contemplating|musing|cogitating|ruminating|deliberating|mulling|reflecting|processing|reasoning|analyzing|computing|synthesizing|formulating|brainstorming)\\.\\.\\.\\s*\\(\\d+\\.\\d+s\\)/i.test(\n        tail\n      )\n    ) {\n      return true;\n    }\n\n    // Tool spinner / active progress line with elapsed time.\n    if (\n      /\\(\\d+\\.\\d+s\\)\\s*$/.test(tail) &&\n      /(?:🔍|📄|💻|⚙️|📖|✍️|🔧|🌐|👆|⌨️|📋|🧠|📚|🎨|🐍|🔀|⚡|💬)/.test(tail)\n    ) {\n      return true;\n    }\n\n    // Prompt in working state.\n    if (/⚕\\s*❯\\s*$/.test(tail)) {\n      return true;\n    }\n\n    return false;\n  }\n\n  detectTaskComplete(output: string): boolean {\n    // Check raw output first because stripAnsi removes box-drawing chars.\n    if (/╭─\\s*⚕\\s*Hermes/i.test(output)) {\n      return true;\n    }\n\n    const stripped = this.stripAnsi(output);\n    if (!stripped.trim()) return false;\n\n    if (this.detectLoading(stripped)) {\n      return false;\n    }\n\n    const hasIdlePrompt = /(?:^|\\n)\\s*❯\\s*$/m.test(stripped);\n    const hasToolFeed = /(?:^|\\n)\\s*┊\\s+\\S+/m.test(stripped);\n\n    if (hasIdlePrompt && hasToolFeed) {\n      return true;\n    }\n\n    return false;\n  }\n\n  detectReady(output: string): boolean {\n    const stripped = this.stripAnsi(output);\n    const tail = stripped.slice(-800);\n\n    if (!tail.trim()) return false;\n\n    if (this.detectLoading(tail)) {\n      return false;\n    }\n\n    if (\n      /Hermes needs your input|Sudo Password Required|Dangerous Command/i.test(\n        tail\n      )\n    ) {\n      return false;\n    }\n\n    if (/(?:⚕|⚠|🔐|\\?|✎)\\s*❯\\s*$/.test(tail)) {\n      return false;\n    }\n\n    return /(?:^|\\n)\\s*❯\\s*$/m.test(tail);\n  }\n\n  parseOutput(output: string): ParsedOutput | null {\n    const raw = output;\n    const stripped = this.stripAnsi(output);\n\n    const complete = this.detectTaskComplete(raw) || this.detectReady(stripped);\n    if (!complete) {\n      return null;\n    }\n\n    let content = '';\n\n    // Final response box emitted by the Hermes CLI.\n    const boxMatch = raw.match(/╭─\\s*⚕\\s*Hermes[^\\n]*\\n([\\s\\S]*?)\\n\\s*╰/i);\n    if (boxMatch?.[1]) {\n      content = boxMatch[1].trim();\n    }\n\n    // Fallback: keep tail content with prompts stripped.\n    if (!content) {\n      content = this.extractContent(\n        stripped,\n        /(?:^|\\n)\\s*(?:⚕|⚠|🔐|\\?|✎)?\\s*❯\\s*$/gim\n      );\n    }\n\n    return {\n      type: this.containsQuestion(content) ? 'question' : 'response',\n      content,\n      isComplete: true,\n      isQuestion: this.containsQuestion(content),\n      metadata: {\n        raw: output,\n      },\n    };\n  }\n\n  getPromptPattern(): RegExp {\n    return /(?:^|\\n)\\s*(?:⚕|⚠|🔐|\\?|✎)?\\s*❯\\s*$/i;\n  }\n\n  override detectExit(output: string): {\n    exited: boolean;\n    code?: number;\n    error?: string;\n  } {\n    const stripped = this.stripAnsi(output);\n\n    if (/Goodbye!\\s*⚕/i.test(stripped)) {\n      return { exited: true, code: 0 };\n    }\n\n    return super.detectExit(output);\n  }\n\n  getHealthCheckCommand(): string {\n    return 'hermes version';\n  }\n}\n","/**\n * OpenCode CLI Adapter\n *\n * Adapter for the OpenCode CLI (https://opencode.ai). OpenCode is a\n * provider-agnostic coding agent — it speaks OpenAI's chat-completions\n * protocol against any compatible endpoint (Anthropic, OpenAI, Cerebras,\n * OpenRouter, Groq, Together, DeepSeek, Ollama, vLLM, etc.) plus a\n * native Anthropic backend. Configuration is supplied to the binary via\n * the `OPENCODE_CONFIG_CONTENT` environment variable (a JSON object that\n * defines providers + the chosen model). The orchestrator constructs\n * that JSON from the user's standard provider env keys.\n *\n * Workspace-file convention matches Codex: `AGENTS.md` at the workdir\n * root is auto-loaded as project instructions on startup.\n *\n * Source: https://github.com/sst/opencode\n */\n\nimport type {\n  BlockingPromptDetection,\n  LoginDetection,\n  ParsedOutput,\n  SpawnConfig,\n} from 'adapter-types';\nimport {\n  type AgentCredentials,\n  type AgentFileDescriptor,\n  BaseCodingAdapter,\n  type InstallationInfo,\n  type ModelRecommendations,\n} from './base-coding-adapter';\n\nexport class OpencodeAdapter extends BaseCodingAdapter {\n  readonly adapterType = 'opencode';\n  readonly displayName = 'OpenCode';\n\n  /**\n   * OpenCode's TUI is light (no full-screen ratatui-style status bar),\n   * so a short settle is sufficient — matches Gemini-CLI's 300ms baseline.\n   */\n  override readonly readySettleMs: number = 300;\n\n  readonly installation: InstallationInfo = {\n    command: 'curl -fsSL https://opencode.ai/install | bash',\n    alternatives: [\n      'npm install -g opencode-ai',\n      'brew install sst/tap/opencode',\n    ],\n    docsUrl: 'https://opencode.ai/docs',\n  };\n\n  getWorkspaceFiles(): AgentFileDescriptor[] {\n    return [\n      {\n        relativePath: 'AGENTS.md',\n        description:\n          'Project-level instructions auto-loaded by OpenCode on startup (same convention as Codex).',\n        autoLoaded: true,\n        type: 'memory',\n        format: 'markdown',\n      },\n      {\n        relativePath: 'opencode.json',\n        description:\n          'Optional workspace-scoped OpenCode config (provider/model overrides for this project).',\n        autoLoaded: true,\n        type: 'config',\n        format: 'json',\n      },\n    ];\n  }\n\n  getRecommendedModels(credentials?: AgentCredentials): ModelRecommendations {\n    // Anthropic key → Claude (OpenCode's native backend). Otherwise prefer\n    // a non-reasoning OpenAI-spec model so reasoning_effort tuning isn't\n    // required for the default to work.\n    if (credentials?.anthropicKey) {\n      return {\n        powerful: 'anthropic/claude-opus-4-7',\n        fast: 'anthropic/claude-haiku-4-5',\n      };\n    }\n    return {\n      powerful: 'openai/gpt-4o',\n      fast: 'openai/gpt-4o-mini',\n    };\n  }\n\n  getCommand(): string {\n    return 'opencode';\n  }\n\n  getArgs(config: SpawnConfig): string[] {\n    // OpenCode TUI launches with bare `opencode`. The `run` subcommand\n    // is non-interactive: it consumes the message as the prompt, drives\n    // a single agent loop, and exits. `--dangerously-skip-permissions`\n    // is a `run`-subcommand flag (NOT top-level), so it must come AFTER\n    // `run` — verified live with opencode 1.14.x.\n    if (this.isInteractive(config)) {\n      return [];\n    }\n    const args = ['run', '--dangerously-skip-permissions'];\n    // OpenCode `run` mode requires the task as a positional argument\n    // (it does NOT read from stdin like Claude / Codex). Callers pass\n    // the prompt via `config.adapterConfig.initialPrompt` (mirroring\n    // codex's exec-mode convention). Without this arg the session\n    // spawns idle.\n    const initialPrompt = (\n      config.adapterConfig as { initialPrompt?: unknown } | undefined\n    )?.initialPrompt;\n    if (typeof initialPrompt === 'string' && initialPrompt.trim()) {\n      args.push(initialPrompt.trim());\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    // The orchestrator passes a fully-baked OpenCode config (JSON\n    // describing the chosen provider + apiKey + model) via the\n    // `OPENCODE_CONFIG_CONTENT` env var. The opencode binary reads that\n    // env var ahead of any local config files. The orchestrator's\n    // `buildOpencodeSpawnConfig` helper synthesizes this from whatever\n    // provider env vars the user has configured (CEREBRAS_API_KEY,\n    // OPENROUTER_API_KEY, etc.).\n    if (config.env?.OPENCODE_CONFIG_CONTENT) {\n      env.OPENCODE_CONFIG_CONTENT = config.env.OPENCODE_CONFIG_CONTENT;\n    }\n\n    // Suppress the auto-update check and terminal-title hijack so PTY\n    // output stays clean for the orchestrator's parser.\n    env.OPENCODE_DISABLE_AUTOUPDATE = '1';\n    env.OPENCODE_DISABLE_TERMINAL_TITLE = '1';\n\n    // Forward provider API keys for users who prefer letting OpenCode\n    // discover them natively (instead of via OPENCODE_CONFIG_CONTENT).\n    // OpenCode's per-provider env-key conventions match the providers'\n    // own docs.\n    if (credentials.anthropicKey) {\n      env.ANTHROPIC_API_KEY = credentials.anthropicKey;\n    }\n    if (credentials.openaiKey) {\n      env.OPENAI_API_KEY = credentials.openaiKey;\n      if (credentials.openaiBaseUrl) {\n        env.OPENAI_BASE_URL = credentials.openaiBaseUrl;\n      }\n    }\n    if (credentials.googleKey) {\n      env.GOOGLE_API_KEY = credentials.googleKey;\n      env.GEMINI_API_KEY = credentials.googleKey;\n    }\n\n    return env;\n  }\n\n  /**\n   * OpenCode does not display its own login prompts when an API key is\n   * pre-supplied (either via OPENCODE_CONFIG_CONTENT or a provider env\n   * var). The bare `opencode auth` CLI exists for interactive setup, but\n   * orchestrator-managed sessions never need it — credentials are\n   * injected via env at spawn time.\n   *\n   * Auth-required signals are limited to error banners that surface\n   * when an inbound request is rejected (401 / 403 / \"invalid api key\").\n   */\n  detectLogin(output: string): LoginDetection {\n    const stripped = this.stripAnsi(output);\n\n    if (\n      /no.?provider.?configured|opencode.?auth.?login/i.test(stripped) ||\n      /missing.?api.?key|api.?key.?not.?found/i.test(stripped)\n    ) {\n      return {\n        required: true,\n        type: 'api_key',\n        instructions:\n          'OpenCode requires a provider API key. Set OPENCODE_CONFIG_CONTENT or one of: ANTHROPIC_API_KEY, OPENAI_API_KEY, CEREBRAS_API_KEY, OPENROUTER_API_KEY.',\n      };\n    }\n\n    if (\n      /401|403|unauthorized|invalid.?api.?key/i.test(stripped) &&\n      /opencode|provider/i.test(stripped)\n    ) {\n      return {\n        required: true,\n        type: 'api_key',\n        instructions:\n          'OpenCode provider rejected credentials. Verify the API key for the selected provider.',\n      };\n    }\n\n    return { required: false };\n  }\n\n  /**\n   * `--dangerously-skip-permissions` on `opencode run` short-circuits the\n   * usual permission UI, so during normal orchestrator-spawned sessions\n   * the adapter rarely encounters blocking prompts. The patterns below\n   * cover the residual cases (interactive sessions, or provider auth\n   * surfacing mid-run).\n   */\n  detectBlockingPrompt(output: string): BlockingPromptDetection {\n    const stripped = this.stripAnsi(output);\n\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    // Permission request from the agent — only appears WITHOUT\n    // --dangerously-skip-permissions. Looks like: \"! permission requested:\n    // external_directory (/home/user/*); auto-rejecting\"\n    if (/permission requested:\\s+\\S+/i.test(stripped)) {\n      return {\n        detected: true,\n        type: 'permission',\n        prompt: 'OpenCode permission request',\n        canAutoRespond: false,\n        instructions:\n          'OpenCode is asking permission for a tool action. Re-spawn with --dangerously-skip-permissions if this is automation.',\n      };\n    }\n\n    return super.detectBlockingPrompt(output);\n  }\n\n  detectLoading(output: string): boolean {\n    const stripped = this.stripAnsi(output);\n    const tail = stripped.slice(-600);\n\n    // Active agent loop indicator emitted at the top of every run:\n    // \"> build · gpt-oss-120b\" (provider · model). Stays visible while\n    // the agent is iterating. NOTE: BaseCodingAdapter.stripAnsi strips\n    // `← → ↑ ↓` as TUI decoration, so we can't rely on opencode's\n    // arrow-prefixed tool-call status lines as a separate signal — the\n    // build-header line is sufficient on its own.\n    if (/^>\\s+(build|chat|plan|run)\\s+·\\s+\\S+/im.test(tail)) {\n      return true;\n    }\n\n    // Tool-call status lines after stripAnsi look like \" Write /path\"\n    // (the `←` arrow is stripped, leaving a leading space). The verb\n    // word is the durable signal.\n    if (\n      /(?:^|\\n)\\s+(?:Read|Write|Edit|Bash|Glob|Grep|Run|Tool)\\s+\\S+/.test(tail)\n    ) {\n      return true;\n    }\n\n    return false;\n  }\n\n  detectTaskComplete(output: string): boolean {\n    const stripped = this.stripAnsi(output);\n    if (!stripped.trim()) return false;\n\n    // In `run` mode the session exits naturally after the agent loop\n    // completes — the orchestrator's process-exit detection handles the\n    // strong signal. As a soft signal, the absence of an active build\n    // line PLUS the presence of a terminal response is sufficient.\n    if (this.detectLoading(stripped)) {\n      return false;\n    }\n\n    // Terminal session finished: opencode emits \"Wrote file successfully.\"\n    // or a final assistant response when everything completed normally.\n    if (\n      /Wrote file successfully\\.|^Done\\.?$|^Finished\\.?$/im.test(stripped)\n    ) {\n      return true;\n    }\n\n    return false;\n  }\n\n  detectReady(output: string): boolean {\n    const stripped = this.stripAnsi(output);\n    const tail = stripped.slice(-400);\n\n    if (!tail.trim()) return false;\n\n    if (this.detectLoading(tail)) {\n      return false;\n    }\n\n    // Interactive `opencode` TUI prompts with `>` followed by a cursor.\n    // In `run` mode this rarely appears (the process exits instead).\n    if (/(?:^|\\n)\\s*>\\s*$/m.test(tail)) {\n      return true;\n    }\n\n    return false;\n  }\n\n  parseOutput(output: string): ParsedOutput | null {\n    const stripped = this.stripAnsi(output);\n    const complete = this.detectTaskComplete(stripped);\n    if (!complete) {\n      return null;\n    }\n\n    // OpenCode's `run` mode prints the agent's final reply as the last\n    // non-tool-call block before the process exits. Strip the \"> build\"\n    // header and any \"← Write /path\" tool lines to isolate user-facing\n    // text.\n    const content = stripped\n      .split('\\n')\n      .filter((line) => {\n        if (/^>\\s+(build|chat|plan|run)\\s+·/i.test(line)) return false;\n        if (/^[←→$]\\s+(Read|Write|Edit|Bash|Glob|Grep|Run|Tool)/i.test(line))\n          return false;\n        if (/^Wrote file successfully\\.?$/i.test(line)) return false;\n        return true;\n      })\n      .join('\\n')\n      .trim();\n\n    return {\n      type: this.containsQuestion(content) ? 'question' : 'response',\n      content,\n      isComplete: true,\n      isQuestion: this.containsQuestion(content),\n      metadata: { raw: output },\n    };\n  }\n\n  getPromptPattern(): RegExp {\n    return /(?:^|\\n)\\s*>\\s*$/m;\n  }\n\n  getHealthCheckCommand(): string {\n    return 'opencode --version';\n  }\n}\n","/**\n * Dynamic Pattern Loader\n *\n * Loads adapter patterns from @parallaxai/adapter-monitor snapshots when available,\n * with fallback to hardcoded baseline patterns.\n */\n\nimport type { AdapterType } from './base-coding-adapter';\n\n/**\n * Pattern set for an adapter\n */\nexport interface AdapterPatterns {\n  /** Ready state detection patterns */\n  ready: string[];\n  /** Auth/login detection patterns */\n  auth: string[];\n  /** Blocking prompt detection patterns */\n  blocking: string[];\n  /** Loading/active indicator patterns */\n  loading: string[];\n  /** Turn completion patterns */\n  turnComplete: string[];\n  /** Tool wait patterns */\n  toolWait: string[];\n  /** Exit/session complete patterns */\n  exit: string[];\n  /** Source of patterns */\n  source: 'snapshot' | 'baseline';\n  /** Version these patterns are from (if from snapshot) */\n  version?: string;\n}\n\n/**\n * Baseline hardcoded patterns - used when no snapshots available\n */\nconst BASELINE_PATTERNS: Record<AdapterType, AdapterPatterns> = {\n  claude: {\n    ready: ['Claude Code', 'How can I help', 'What would you like', 'Ready'],\n    auth: [\n      'ANTHROPIC_API_KEY',\n      'API key not found',\n      'authentication required',\n      'Please sign in',\n      'Invalid API key',\n    ],\n    blocking: ['update available', '[y/n]'],\n    loading: ['Reading X files…'],\n    turnComplete: ['Cooked for 1m 6s', '<CustomVerb> for 4m 39s'],\n    toolWait: [],\n    exit: [],\n    source: 'baseline',\n  },\n\n  gemini: {\n    ready: [\n      'Type your message',\n      'How can I help',\n      'What would you like',\n      'Ready',\n    ],\n    auth: [\n      'GOOGLE_API_KEY',\n      'GEMINI_API_KEY',\n      'API key not found',\n      'Sign in with Google',\n      'gcloud auth',\n      'Application Default Credentials',\n    ],\n    blocking: ['update available', '[y/n]'],\n    loading: [\n      '<phrase> (esc to cancel, 25s)',\n      'Waiting for user confirmation...',\n      'Generating witty retort…',\n      'Reticulating splines',\n      'Warming up the AI hamsters',\n    ],\n    turnComplete: [],\n    toolWait: ['Interactive shell awaiting input... press tab to focus shell'],\n    exit: ['Agent powering down. Goodbye!'],\n    source: 'baseline',\n  },\n\n  codex: {\n    ready: ['Codex', 'How can I help', 'Ready'],\n    auth: [\n      'OPENAI_API_KEY',\n      'API key not found',\n      'Unauthorized',\n      'Invalid API key',\n    ],\n    blocking: ['update available', '[y/n]'],\n    loading: ['• Working (0s • esc to interrupt)', 'Booting MCP server: alpha'],\n    turnComplete: ['Worked for 1m 05s'],\n    toolWait: [\n      'Waiting for background terminal · <command>',\n      'Searching the web',\n    ],\n    exit: [],\n    source: 'baseline',\n  },\n\n  aider: {\n    ready: ['Aider', 'What would you like', 'Ready'],\n    auth: ['API key', 'OPENAI_API_KEY', 'ANTHROPIC_API_KEY', 'No API key'],\n    blocking: ['(Y)es/(N)o', '[y/n]'],\n    loading: [\n      'Waiting for <model>',\n      'Waiting for LLM',\n      'Generating commit message with <model>',\n    ],\n    turnComplete: ['Aider is waiting for your input'],\n    toolWait: [],\n    exit: [],\n    source: 'baseline',\n  },\n  hermes: {\n    ready: ['❯', '⚕ Hermes', 'Welcome to Hermes Agent'],\n    auth: [\n      \"isn't configured yet\",\n      'no API keys or providers found',\n      'Run setup now? [Y/n]',\n    ],\n    blocking: [\n      'Hermes needs your input',\n      'Sudo Password Required',\n      'Dangerous Command',\n    ],\n    loading: ['deliberating...', '(0.0s)', '⚕ ❯'],\n    turnComplete: ['╭─ ⚕ Hermes', '❯'],\n    toolWait: [\n      'Hermes needs your input',\n      'Sudo Password Required',\n      'Dangerous Command',\n    ],\n    exit: ['Goodbye! ⚕'],\n    source: 'baseline',\n  },\n  opencode: {\n    // OpenCode emits a \"> build · <model>\" header at the top of every\n    // session (interactive TUI prints `> ` as the input prompt; `run`\n    // mode shows the build header then streams agent output).\n    ready: ['>', 'build · ', 'opencode'],\n    auth: [\n      'no provider configured',\n      'opencode auth login',\n      'missing api key',\n      'api key not found',\n      'Invalid API key',\n      '401',\n      '403',\n    ],\n    blocking: ['permission requested:', 'auto-rejecting'],\n    loading: ['> build · ', '> chat · ', '> plan · ', '> run · '],\n    turnComplete: ['Wrote file successfully.', 'Done.', 'Finished.'],\n    toolWait: ['permission requested:'],\n    exit: [],\n    source: 'baseline',\n  },\n};\n\n/**\n * Cache for loaded patterns\n */\nconst patternCache: Map<string, AdapterPatterns> = new Map();\n\n/**\n * Monitor patterns result shape (matches @parallaxai/adapter-monitor VersionPatternMapping)\n */\ninterface MonitorPatterns {\n  version: string;\n  readyPatterns: string[];\n  authPatterns: string[];\n  blockingPatterns: string[];\n  loadingPatterns?: string[];\n  turnCompletePatterns?: string[];\n  toolWaitPatterns?: string[];\n  exitPatterns?: string[];\n}\n\n/**\n * Try to load patterns from @parallaxai/adapter-monitor\n */\nasync function tryLoadFromMonitor(\n  adapter: AdapterType,\n  version?: string\n): Promise<AdapterPatterns | null> {\n  try {\n    // Dynamic import - will fail gracefully if package not installed\n    // Uses string variable to avoid TypeScript trying to resolve the module\n    const moduleName = 'agent-adapter-monitor';\n    const monitor = (await import(/* webpackIgnore: true */ moduleName)) as {\n      getPatternsForVersion: (\n        adapter: string,\n        version: string\n      ) => Promise<MonitorPatterns | null>;\n    };\n\n    // Try to get patterns for specific version or latest\n    const patterns = version\n      ? await monitor.getPatternsForVersion(adapter, version)\n      : await monitor.getPatternsForVersion(adapter, 'latest');\n\n    if (patterns) {\n      return {\n        ready: patterns.readyPatterns || [],\n        auth: patterns.authPatterns || [],\n        blocking: patterns.blockingPatterns || [],\n        loading: patterns.loadingPatterns || [],\n        turnComplete: patterns.turnCompletePatterns || [],\n        toolWait: patterns.toolWaitPatterns || [],\n        exit: patterns.exitPatterns || [],\n        source: 'snapshot',\n        version: patterns.version,\n      };\n    }\n  } catch {\n    // Package not installed or no snapshots available - that's fine\n  }\n\n  return null;\n}\n\n/**\n * Load patterns for an adapter\n *\n * Tries to load from @parallaxai/adapter-monitor snapshots first,\n * falls back to hardcoded baseline patterns.\n *\n * @param adapter - Adapter type\n * @param version - Optional specific CLI version to load patterns for\n * @param forceRefresh - Skip cache and reload\n */\nexport async function loadPatterns(\n  adapter: AdapterType,\n  version?: string,\n  forceRefresh = false\n): Promise<AdapterPatterns> {\n  const cacheKey = `${adapter}:${version || 'latest'}`;\n\n  // Check cache first\n  if (!forceRefresh && patternCache.has(cacheKey)) {\n    return patternCache.get(cacheKey)!;\n  }\n\n  // Try loading from monitor\n  const monitorPatterns = await tryLoadFromMonitor(adapter, version);\n\n  if (monitorPatterns && monitorPatterns.ready.length > 0) {\n    patternCache.set(cacheKey, monitorPatterns);\n    return monitorPatterns;\n  }\n\n  // Fall back to baseline\n  const baseline = BASELINE_PATTERNS[adapter];\n  patternCache.set(cacheKey, baseline);\n  return baseline;\n}\n\n/**\n * Load patterns synchronously (uses cache or baseline only)\n *\n * Use this in constructors or synchronous code paths.\n * For best results, call loadPatterns() asynchronously during init.\n */\nexport function loadPatternsSync(adapter: AdapterType): AdapterPatterns {\n  const cacheKey = `${adapter}:latest`;\n\n  // Return cached if available\n  if (patternCache.has(cacheKey)) {\n    return patternCache.get(cacheKey)!;\n  }\n\n  // Otherwise return baseline (don't cache - let async load update it)\n  return BASELINE_PATTERNS[adapter];\n}\n\n/**\n * Preload patterns for all adapters\n *\n * Call this during application startup to warm the cache.\n */\nexport async function preloadAllPatterns(): Promise<void> {\n  const adapters: AdapterType[] = ['claude', 'gemini', 'codex', 'aider'];\n\n  await Promise.all(adapters.map((adapter) => loadPatterns(adapter)));\n}\n\n/**\n * Clear the pattern cache\n */\nexport function clearPatternCache(): void {\n  patternCache.clear();\n}\n\n/**\n * Get baseline patterns (always available, no async)\n */\nexport function getBaselinePatterns(adapter: AdapterType): AdapterPatterns {\n  return BASELINE_PATTERNS[adapter];\n}\n\n/**\n * Check if dynamic patterns are available\n */\nexport async function hasDynamicPatterns(\n  adapter: AdapterType\n): Promise<boolean> {\n  const patterns = await tryLoadFromMonitor(adapter);\n  return patterns !== null;\n}\n","/**\n * coding-agent-adapters\n *\n * CLI adapters for AI coding agents.\n * Works with pty-manager to spawn and manage coding agents.\n *\n * @example\n * ```typescript\n * import { PTYManager } from 'pty-manager';\n * import { ClaudeAdapter, GeminiAdapter } from 'coding-agent-adapters';\n *\n * const manager = new PTYManager();\n * manager.registerAdapter(new ClaudeAdapter());\n * manager.registerAdapter(new GeminiAdapter());\n *\n * // Non-interactive mode (default) - for automation\n * const session = await manager.spawn({\n *   name: 'my-agent',\n *   type: 'claude',\n *   workdir: '/path/to/project',\n *   adapterConfig: {\n *     anthropicKey: process.env.ANTHROPIC_API_KEY,\n *   },\n * });\n *\n * // Interactive mode - full CLI experience\n * const interactiveSession = await manager.spawn({\n *   name: 'my-interactive-agent',\n *   type: 'claude',\n *   workdir: '/path/to/project',\n *   adapterConfig: {\n *     anthropicKey: process.env.ANTHROPIC_API_KEY,\n *     interactive: true, // Skip --print/--quiet/--non-interactive flags\n *   },\n * });\n * ```\n */\n\nimport pino from 'pino';\n\nconst logger = pino({ name: 'coding-agent-adapters' });\n\nexport { AiderAdapter } from './aider-adapter';\nexport type {\n  ApprovalConfig,\n  ApprovalPreset,\n  PresetDefinition,\n  RiskLevel,\n  ToolCategory,\n  ToolCategoryInfo,\n} from './approval-presets';\n// Approval presets\nexport {\n  AIDER_COMMAND_CATEGORIES,\n  CLAUDE_TOOL_CATEGORIES,\n  CODEX_TOOL_CATEGORIES,\n  GEMINI_TOOL_CATEGORIES,\n  generateAiderApprovalConfig,\n  generateApprovalConfig,\n  generateClaudeApprovalConfig,\n  generateCodexApprovalConfig,\n  generateGeminiApprovalConfig,\n  generateHermesApprovalConfig,\n  getPresetDefinition,\n  listPresets,\n  PRESET_DEFINITIONS,\n  TOOL_CATEGORIES,\n} from './approval-presets';\n// Types\nexport type {\n  AdapterType,\n  AgentCredentials,\n  AgentFileDescriptor,\n  AuthStatus,\n  CodingAgentConfig,\n  InstallationInfo,\n  ModelRecommendations,\n  WriteMemoryOptions,\n} from './base-coding-adapter';\n// Base class for extending\nexport { BaseCodingAdapter } from './base-coding-adapter';\n// Adapters\nexport { ClaudeAdapter } from './claude-adapter';\nexport { CodexAdapter } from './codex-adapter';\nexport { GeminiAdapter } from './gemini-adapter';\nexport { HermesAdapter } from './hermes-adapter';\nexport { OpencodeAdapter } from './opencode-adapter';\nexport type { AdapterPatterns } from './pattern-loader';\n// Pattern loading (dynamic patterns from adapter-monitor, with baseline fallback)\nexport {\n  clearPatternCache,\n  getBaselinePatterns,\n  hasDynamicPatterns,\n  loadPatterns,\n  loadPatternsSync,\n  preloadAllPatterns,\n} from './pattern-loader';\n\nimport { AiderAdapter } from './aider-adapter';\n// Convenience function to register all adapters\nimport { ClaudeAdapter } from './claude-adapter';\nimport { CodexAdapter } from './codex-adapter';\nimport { GeminiAdapter } from './gemini-adapter';\nimport { HermesAdapter } from './hermes-adapter';\nimport { OpencodeAdapter } from './opencode-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    new HermesAdapter(),\n    new OpencodeAdapter(),\n  ];\n}\n\n/**\n * Adapter type to class mapping\n */\nimport type { AdapterType, AuthStatus } from './base-coding-adapter';\n\nexport const ADAPTER_TYPES: Record<\n  AdapterType,\n  | typeof ClaudeAdapter\n  | typeof GeminiAdapter\n  | typeof CodexAdapter\n  | typeof AiderAdapter\n  | typeof HermesAdapter\n  | typeof OpencodeAdapter\n> = {\n  claude: ClaudeAdapter,\n  gemini: GeminiAdapter,\n  codex: CodexAdapter,\n  aider: AiderAdapter,\n  hermes: HermesAdapter,\n  opencode: OpencodeAdapter,\n};\n\n/**\n * Create a specific adapter by type\n */\nexport function createAdapter(type: AdapterType) {\n  const AdapterClass = ADAPTER_TYPES[type];\n  if (!AdapterClass) {\n    throw new Error(`Unknown adapter type: ${type}`);\n  }\n  return new AdapterClass();\n}\n\n/**\n * Result of checking if a CLI is installed\n */\nexport interface PreflightResult {\n  adapter: string;\n  installed: boolean;\n  version?: string;\n  error?: string;\n  installCommand: string;\n  docsUrl: string;\n  /** Subscription/login auth status (only checked if installed) */\n  auth?: AuthStatus;\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(\n  types: AdapterType[]\n): Promise<PreflightResult[]> {\n  return Promise.all(\n    types.map(async (type) => {\n      const adapter = createAdapter(type);\n      const validation = await adapter.validateInstallation();\n\n      // Only check auth if the CLI is installed\n      let auth: AuthStatus | undefined;\n      if (validation.installed) {\n        try {\n          auth = await adapter.checkAuthStatus();\n        } catch {\n          auth = { status: 'unknown' };\n        }\n      }\n\n      return {\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        auth,\n      };\n    })\n  );\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(\n  types?: AdapterType[]\n): 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    logger.info('All CLI tools are installed');\n    return;\n  }\n\n  logger.info({ count: missing.length }, 'Missing CLI tools detected');\n  for (const m of missing) {\n    logger.warn(\n      {\n        adapter: m.adapter,\n        installCommand: m.installCommand,\n        docsUrl: m.docsUrl,\n        ...(m.error ? { error: m.error } : {}),\n      },\n      'CLI tool not installed'\n    );\n  }\n}\n"]}