poe-code 3.0.73 → 3.0.75

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/templates/python/env.hbs", "../../src/templates/python/main.py.hbs", "../../src/templates/python/requirements.txt.hbs", "../../src/templates/codex/config.toml.hbs", "../../src/cli/constants.ts", "../../packages/agent-spawn/src/run-command.ts", "../../packages/agent-defs/src/agents/claude-code.ts", "../../packages/agent-defs/src/agents/claude-desktop.ts", "../../packages/agent-defs/src/agents/codex.ts", "../../packages/agent-defs/src/agents/opencode.ts", "../../packages/agent-defs/src/agents/kimi.ts", "../../packages/agent-defs/src/registry.ts", "../../packages/agent-spawn/src/configs/mcp.ts", "../../packages/agent-spawn/src/configs/claude-code.ts", "../../packages/agent-spawn/src/configs/codex.ts", "../../packages/agent-spawn/src/configs/opencode.ts", "../../packages/agent-spawn/src/configs/kimi.ts", "../../packages/agent-spawn/src/configs/index.ts", "../../packages/agent-spawn/src/spawn.ts", "../../packages/agent-spawn/src/configs/resolve-config.ts", "../../packages/agent-spawn/src/mcp-args.ts", "../../packages/agent-spawn/src/model-utils.ts", "../../packages/agent-spawn/src/spawn-interactive.ts", "../../packages/design-system/src/tokens/colors.ts", "../../packages/design-system/src/tokens/typography.ts", "../../packages/design-system/src/components/text.ts", "../../packages/design-system/src/internal/theme-detect.ts", "../../packages/design-system/src/components/symbols.ts", "../../packages/design-system/src/components/logger.ts", "../../packages/design-system/src/internal/output-format.ts", "../../packages/design-system/src/components/table.ts", "../../packages/design-system/src/acp/components.ts", "../../packages/design-system/src/prompts/index.ts", "../../packages/design-system/src/static/spinner.ts", "../../packages/design-system/src/static/menu.ts", "../../packages/agent-spawn/src/acp/spawn.ts", "../../src/utils/command-checks.ts", "../../packages/config-mutations/src/mutations/config-mutation.ts", "../../packages/config-mutations/src/mutations/file-mutation.ts", "../../packages/config-mutations/src/execution/apply-mutation.ts", "../../packages/config-mutations/src/formats/json.ts", "../../packages/config-mutations/src/formats/toml.ts", "../../packages/config-mutations/src/formats/index.ts", "../../packages/config-mutations/src/execution/path-utils.ts", "../../packages/config-mutations/src/fs-utils.ts", "../../packages/config-mutations/src/execution/run-mutations.ts", "../../packages/config-mutations/src/template/render.ts", "../../src/services/service-install.ts", "../../src/providers/create-provider.ts", "../../src/providers/opencode.ts"],
4
- "sourcesContent": ["POE_API_KEY={{apiKey}}\nPOE_BASE_URL=https://api.poe.com/v1\nMODEL={{model}}\n", "import os\nfrom openai import OpenAI\nfrom dotenv import load_dotenv\n\nload_dotenv()\n\nclient = OpenAI(\n api_key=os.getenv(\"POE_API_KEY\"),\n base_url=os.getenv(\"POE_BASE_URL\")\n)\n\nresponse = client.chat.completions.create(\n model=os.getenv(\"MODEL\", \"{{model}}\"),\n messages=[{\"role\": \"user\", \"content\": \"Tell me a joke\"}]\n)\n\nprint(response.choices[0].message.content)\n", "openai>=1.0.0\npython-dotenv>=1.0.0\n", "model_provider = \"poe\"\nmodel = \"{{{model}}}\"\nmodel_reasoning_effort = \"{{reasoningEffort}}\"\nmodel_verbosity = \"medium\"\n\n[model_providers.poe]\nname = \"poe\"\nbase_url = \"{{{baseUrl}}}\"\nwire_api = \"responses\"\nexperimental_bearer_token = \"{{apiKey}}\"\n", "export const FRONTIER_MODELS = [\n \"anthropic/claude-opus-4.6\",\n \"anthropic/claude-sonnet-4.6\",\n \"openai/gpt-5.3-codex\",\n \"openai/gpt-5.2\",\n \"google/gemini-3-pro\"\n] as const;\n\nexport const DEFAULT_FRONTIER_MODEL = \"anthropic/claude-sonnet-4.6\";\n\nexport const DEFAULT_TEXT_MODEL = \"anthropic/claude-sonnet-4.6\";\nexport const DEFAULT_IMAGE_BOT = \"google/nano-banana-pro\";\nexport const DEFAULT_AUDIO_BOT = \"elevenlabs/elevenlabs-v3\";\nexport const DEFAULT_VIDEO_BOT = \"google/veo-3.1\";\n\nexport const CLAUDE_CODE_VARIANTS = {\n haiku: \"anthropic/claude-haiku-4.5\",\n sonnet: \"anthropic/claude-sonnet-4.6\",\n opus: \"anthropic/claude-opus-4.6\"\n} as const;\n\nexport const DEFAULT_CLAUDE_CODE_MODEL = CLAUDE_CODE_VARIANTS.sonnet;\n\n/**\n * Extracts the model ID from a namespaced model slug (lowercase).\n * e.g., \"anthropic/claude-sonnet-4.6\" -> \"claude-sonnet-4.6\"\n */\nexport function stripModelNamespace(model: string): string {\n const slashIndex = model.indexOf(\"/\");\n const id = slashIndex === -1 ? model : model.slice(slashIndex + 1);\n return id.toLowerCase();\n}\n\nexport const CODEX_MODELS = [\n \"openai/gpt-5.3-codex\",\n \"openai/gpt-5.2-codex\",\n \"openai/gpt-5.2\",\n \"openai/gpt-5.2-chat\",\n \"openai/gpt-5.2-pro\",\n \"openai/gpt-5.1\",\n \"openai/gpt-5.1-codex-mini\"\n] as const;\nexport const DEFAULT_CODEX_MODEL = CODEX_MODELS[0];\n\nexport const KIMI_MODELS = [\n \"novitaai/kimi-k2.5\",\n \"novitaai/kimi-k2-thinking\",\n] as const;\nexport const DEFAULT_KIMI_MODEL = KIMI_MODELS[0];\n\nexport const DEFAULT_REASONING = \"medium\";\nexport const PROVIDER_NAME = \"poe\";\nexport const FEEDBACK_URL = \"https://github.com/poe-platform/poe-code/issues\";\n", "import { spawn } from \"node:child_process\";\n\nexport interface CommandRunnerResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\nexport interface CommandRunnerOptions {\n cwd?: string;\n env?: Record<string, string | undefined>;\n stdin?: string | Buffer;\n}\n\nexport type CommandRunner = (\n command: string,\n args: string[],\n options?: CommandRunnerOptions\n) => Promise<CommandRunnerResult>;\n\nexport function runCommand(\n command: string,\n args: string[],\n options?: CommandRunnerOptions\n): Promise<CommandRunnerResult> {\n return new Promise((resolve) => {\n const hasStdin = options?.stdin != null;\n const child = spawn(command, args, {\n stdio: [hasStdin ? \"pipe\" : \"ignore\", \"pipe\", \"pipe\"],\n cwd: options?.cwd,\n env: options?.env\n ? {\n ...(process.env as Record<string, string | undefined>),\n ...options.env\n }\n : undefined\n });\n let stdout = \"\";\n let stderr = \"\";\n\n if (hasStdin && child.stdin) {\n child.stdin.on(\"error\", () => {});\n child.stdin.end(options!.stdin);\n }\n\n child.stdout?.setEncoding(\"utf8\");\n child.stdout?.on(\"data\", (chunk: string | Buffer) => {\n stdout += chunk.toString();\n });\n\n child.stderr?.setEncoding(\"utf8\");\n child.stderr?.on(\"data\", (chunk: string | Buffer) => {\n stderr += chunk.toString();\n });\n\n child.on(\"error\", (error: NodeJS.ErrnoException) => {\n const exitCode =\n typeof error.code === \"number\"\n ? error.code\n : typeof error.errno === \"number\"\n ? error.errno\n : 127;\n const message =\n error instanceof Error ? error.message : String(error ?? \"error\");\n resolve({\n stdout,\n stderr: stderr ? `${stderr}${message}` : message,\n exitCode\n });\n });\n\n child.on(\"close\", (code) => {\n resolve({\n stdout,\n stderr,\n exitCode: code ?? 0\n });\n });\n });\n}\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const claudeCodeAgent: AgentDefinition = {\n id: \"claude-code\",\n name: \"claude-code\",\n label: \"Claude Code\",\n summary: \"Configure Claude Code to route through Poe.\",\n aliases: [\"claude\"],\n binaryName: \"claude\",\n configPath: \"~/.claude/settings.json\",\n branding: {\n colors: {\n dark: \"#C15F3C\",\n light: \"#C15F3C\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const claudeDesktopAgent: AgentDefinition = {\n id: \"claude-desktop\",\n name: \"claude-desktop\",\n label: \"Claude Desktop\",\n summary: \"Anthropic's official desktop application for Claude\",\n configPath: \"~/.claude/settings.json\",\n branding: {\n colors: {\n dark: \"#D97757\",\n light: \"#D97757\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const codexAgent: AgentDefinition = {\n id: \"codex\",\n name: \"codex\",\n label: \"Codex\",\n summary: \"Configure Codex to use Poe as the model provider.\",\n binaryName: \"codex\",\n configPath: \"~/.codex/config.toml\",\n branding: {\n colors: {\n dark: \"#D5D9DF\",\n light: \"#7A7F86\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const openCodeAgent: AgentDefinition = {\n id: \"opencode\",\n name: \"opencode\",\n label: \"OpenCode CLI\",\n summary: \"Configure OpenCode CLI to use the Poe API.\",\n binaryName: \"opencode\",\n configPath: \"~/.config/opencode/config.json\",\n branding: {\n colors: {\n dark: \"#4A4F55\",\n light: \"#2F3338\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const kimiAgent: AgentDefinition = {\n id: \"kimi\",\n name: \"kimi\",\n label: \"Kimi\",\n summary: \"Configure Kimi CLI to use Poe API\",\n aliases: [\"kimi-cli\"],\n binaryName: \"kimi\",\n configPath: \"~/.kimi/config.toml\",\n branding: {\n colors: {\n dark: \"#7B68EE\",\n light: \"#6A5ACD\"\n }\n }\n};\n", "import type { AgentDefinition } from \"./types.js\";\nimport {\n claudeCodeAgent,\n claudeDesktopAgent,\n codexAgent,\n openCodeAgent,\n kimiAgent\n} from \"./agents/index.js\";\n\nexport const allAgents: AgentDefinition[] = [\n claudeCodeAgent,\n claudeDesktopAgent,\n codexAgent,\n openCodeAgent,\n kimiAgent\n];\n\nconst lookup = new Map<string, string>();\n\nfor (const agent of allAgents) {\n const values = [agent.id, agent.name, ...(agent.aliases ?? [])];\n for (const value of values) {\n const normalized = value.toLowerCase();\n if (!lookup.has(normalized)) {\n lookup.set(normalized, agent.id);\n }\n }\n}\n\nexport function resolveAgentId(input: string): string | undefined {\n if (!input) {\n return undefined;\n }\n return lookup.get(input.toLowerCase());\n}\n", "import type { McpSpawnConfig } from \"../types.js\";\n\ninterface JsonMcpServer {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n}\n\nfunction toJsonMcpServers(servers: McpSpawnConfig): Record<string, JsonMcpServer> {\n const out: Record<string, JsonMcpServer> = {};\n\n for (const [name, server] of Object.entries(servers)) {\n const mapped: JsonMcpServer = { command: server.command };\n if (server.args && server.args.length > 0) {\n mapped.args = server.args;\n }\n if (server.env && Object.keys(server.env).length > 0) {\n mapped.env = server.env;\n }\n out[name] = mapped;\n }\n\n return out;\n}\n\nfunction toTomlString(value: string): string {\n return JSON.stringify(value);\n}\n\nfunction toTomlArray(values: string[]): string {\n const serialized = values.map((value) => toTomlString(value));\n return `[${serialized.join(\", \")}]`;\n}\n\nfunction toTomlInlineTable(values: Record<string, string>): string {\n const parts: string[] = [];\n for (const [key, value] of Object.entries(values)) {\n parts.push(`${JSON.stringify(key)}=${toTomlString(value)}`);\n }\n return `{${parts.join(\", \")}}`;\n}\n\nexport function serializeJsonMcpArgs(servers: McpSpawnConfig): string[] {\n return [\"--mcp-config\", JSON.stringify({ mcpServers: toJsonMcpServers(servers) })];\n}\n\nexport function serializeCodexMcpArgs(servers: McpSpawnConfig): string[] {\n const args: string[] = [];\n\n for (const [name, server] of Object.entries(servers)) {\n const prefix = `mcp_servers.${name}`;\n args.push(\"-c\", `${prefix}.command=${toTomlString(server.command)}`);\n\n if (server.args && server.args.length > 0) {\n args.push(\"-c\", `${prefix}.args=${toTomlArray(server.args)}`);\n }\n\n if (server.env && Object.keys(server.env).length > 0) {\n args.push(\"-c\", `${prefix}.env=${toTomlInlineTable(server.env)}`);\n }\n }\n\n return args;\n}\n", "import type { CliSpawnConfig } from \"../types.js\";\nimport { serializeJsonMcpArgs } from \"./mcp.js\";\n\nexport const claudeCodeSpawnConfig: CliSpawnConfig = {\n kind: \"cli\",\n agentId: \"claude-code\",\n // ACP adapter support: yes (adapter: \"claude\")\n adapter: \"claude\",\n promptFlag: \"-p\",\n modelFlag: \"--model\",\n modelStripProviderPrefix: true,\n modelTransform: (model) => model.replaceAll(\".\", \"-\"),\n defaultArgs: [\n \"--output-format\",\n \"stream-json\",\n \"--verbose\"\n ],\n mcpArgs: serializeJsonMcpArgs,\n modes: {\n yolo: [\"--dangerously-skip-permissions\"],\n edit: [\"--permission-mode\", \"acceptEdits\", \"--allowedTools\", \"Bash,Read,Write,Edit,Glob,Grep,NotebookEdit\"],\n read: [\"--permission-mode\", \"plan\"]\n },\n stdinMode: {\n omitPrompt: true,\n extraArgs: [\"--input-format\", \"text\"]\n },\n interactive: {\n defaultArgs: []\n },\n resumeCommand: (threadId) => [\"--resume\", threadId]\n};\n", "import type { CliSpawnConfig } from \"../types.js\";\nimport { serializeCodexMcpArgs } from \"./mcp.js\";\n\nexport const codexSpawnConfig: CliSpawnConfig = {\n kind: \"cli\",\n agentId: \"codex\",\n // ACP adapter support: yes (adapter: \"codex\")\n adapter: \"codex\",\n promptFlag: \"exec\",\n modelFlag: \"--model\",\n modelStripProviderPrefix: true,\n defaultArgs: [\"--skip-git-repo-check\", \"--json\"],\n mcpArgs: serializeCodexMcpArgs,\n modes: {\n yolo: [\"-s\", \"danger-full-access\"],\n edit: [\"-s\", \"workspace-write\"],\n read: [\"-s\", \"read-only\"]\n },\n stdinMode: {\n omitPrompt: true,\n extraArgs: [\"-\"]\n },\n interactive: {\n defaultArgs: [\"-a\", \"never\"]\n },\n resumeCommand: (threadId, cwd) => [\"resume\", \"-C\", cwd, threadId]\n};\n", "import type { CliSpawnConfig } from \"../types.js\";\n\n/**\n * OpenCode JSON output format (empirically observed)\n *\n * OpenCode can emit \"raw JSON events\" when running a prompt via:\n * - `opencode run \"<prompt>\" --format json ...`\n *\n * Key observations (OpenCode CLI v1.1.47):\n * - Output is **NDJSON / line-delimited JSON**: one JSON object per stdout line.\n * - Each line is an event object with a top-level `type` string (NOT ACP's `{ event: ... }`).\n * - Common top-level fields:\n * - `type`: `\"step_start\" | \"text\" | \"tool_use\" | \"step_finish\" | ...`\n * - `timestamp`: number (ms since epoch)\n * - `sessionID`: string (e.g. `\"ses_...\"`)\n * - `part`: object with event-specific payload\n *\n * `text` events:\n * ```ts\n * {\n * type: \"text\",\n * sessionID: \"ses_...\",\n * part: {\n * type: \"text\",\n * messageID: \"msg_...\",\n * text: \"Hello ...\",\n * time: { start: 1770000000000, end: 1770000000000 }\n * }\n * }\n * ```\n *\n * Tool calls (`tool_use`):\n * - Represented as a single event with `part.type: \"tool\"` and `state.status`.\n * - `state.input` includes tool arguments; `state.output` is the tool result string.\n * ```ts\n * {\n * type: \"tool_use\",\n * sessionID: \"ses_...\",\n * part: {\n * type: \"tool\",\n * callID: \"call_...\",\n * tool: \"bash\",\n * state: {\n * status: \"completed\",\n * input: { command: \"echo hello\", description: \"...\" },\n * output: \"hello\\n\"\n * }\n * }\n * }\n * ```\n *\n * Step boundaries:\n * - `step_start` and `step_finish` wrap a single model/tool turn.\n * - `step_finish.part.tokens` contains token accounting:\n * `{ input, output, reasoning, cache: { read, write } }`\n *\n * Negative cases / gotchas:\n * - Some failures (e.g. invalid `--model` / unknown provider) can print a non-JSON stack trace\n * before any JSON events are emitted, even with `--format json`.\n * - If `--format json` is ever removed upstream, OpenCode will need a text-mode fallback\n * (no streaming event adapter).\n */\nexport const openCodeSpawnConfig: CliSpawnConfig = {\n kind: \"cli\",\n agentId: \"opencode\",\n // ACP adapter support: yes (adapter: \"opencode\").\n // OpenCode's `--format json` emits NDJSON events with `{ type, sessionID, part }`\n // (no `{ event, ... }` field), so it needs the OpenCode adapter (not \"native\").\n adapter: \"opencode\",\n promptFlag: \"run\",\n modelFlag: \"--model\",\n modelStripProviderPrefix: false,\n modelTransform: (model) => {\n return model.startsWith(\"poe/\") ? model : `poe/${model}`;\n },\n defaultArgs: [\"--format\", \"json\"],\n modes: {\n yolo: [],\n edit: [],\n read: [\"--agent\", \"plan\"]\n },\n interactive: {\n defaultArgs: [],\n promptFlag: \"--prompt\"\n },\n resumeCommand: (threadId, cwd) => [cwd, \"--session\", threadId]\n};\n", "import type { CliSpawnConfig } from \"../types.js\";\nimport { serializeJsonMcpArgs } from \"./mcp.js\";\n\nexport const kimiSpawnConfig: CliSpawnConfig = {\n kind: \"cli\",\n agentId: \"kimi\",\n // ACP adapter support: yes (adapter: \"kimi\").\n // Kimi's `--output-format stream-json` emits OpenAI-style `{ role, content }` JSON\n // (no `{ event, ... }` field), so it needs the Kimi adapter (not \"native\").\n adapter: \"kimi\",\n promptFlag: \"-p\",\n modelStripProviderPrefix: true,\n defaultArgs: [\"--print\", \"--output-format\", \"stream-json\"],\n mcpArgs: serializeJsonMcpArgs,\n modes: {\n yolo: [\"--yolo\"],\n edit: [],\n read: []\n },\n stdinMode: {\n omitPrompt: true,\n extraArgs: [\"--input-format\", \"stream-json\"]\n },\n interactive: {\n defaultArgs: [],\n promptFlag: \"-p\"\n },\n resumeCommand: (threadId, cwd) => [\"--session\", threadId, \"--work-dir\", cwd]\n};\n", "import { resolveAgentId } from \"@poe-code/agent-defs\";\nimport type { SpawnConfig } from \"../types.js\";\nimport { claudeCodeSpawnConfig } from \"./claude-code.js\";\nimport { codexSpawnConfig } from \"./codex.js\";\nimport { openCodeSpawnConfig } from \"./opencode.js\";\nimport { kimiSpawnConfig } from \"./kimi.js\";\n\n// ACP adapter support (spawn streaming):\n// - Supported (has `adapter`): claude-code, codex, opencode, kimi\nexport const allSpawnConfigs: readonly SpawnConfig[] = [\n claudeCodeSpawnConfig,\n codexSpawnConfig,\n openCodeSpawnConfig,\n kimiSpawnConfig\n];\n\nconst lookup = new Map<string, SpawnConfig>();\n\nfor (const config of allSpawnConfigs) {\n lookup.set(config.agentId, config);\n}\n\nexport function getSpawnConfig(input: string): SpawnConfig | undefined {\n const resolvedId = resolveAgentId(input);\n if (!resolvedId) {\n return undefined;\n }\n return lookup.get(resolvedId);\n}\n\nexport function supportsMcpAtSpawn(input: string): boolean {\n const config = getSpawnConfig(input);\n return (\n !!config &&\n config.kind === \"cli\" &&\n typeof config.mcpArgs === \"function\"\n );\n}\n\nexport function listMcpSupportedAgents(): string[] {\n const supported: string[] = [];\n\n for (const config of allSpawnConfigs) {\n if (config.kind !== \"cli\" || typeof config.mcpArgs !== \"function\") {\n continue;\n }\n supported.push(config.agentId);\n }\n\n return supported;\n}\n", "import { spawn as spawnChildProcess } from \"node:child_process\";\nimport { resolveConfig } from \"./configs/resolve-config.js\";\nimport { getMcpArgs } from \"./mcp-args.js\";\nimport { stripModelNamespace } from \"./model-utils.js\";\nimport type {\n CliSpawnConfig,\n McpSpawnConfig,\n SpawnContext,\n SpawnMode,\n SpawnOptions,\n SpawnResult,\n StdinMode\n} from \"./types.js\";\n\nexport interface BuildSpawnArgsOptions {\n prompt: string;\n model?: string;\n mode?: SpawnMode;\n args?: string[];\n mcpServers?: McpSpawnConfig;\n useStdin?: boolean;\n}\n\nexport interface BuildSpawnArgsResult {\n binaryName: string;\n args: string[];\n}\n\nfunction resolveCliConfig(agentId: string) {\n const resolved = resolveConfig(agentId);\n\n if (!resolved.spawnConfig) {\n throw new Error(`Agent \"${resolved.agentId}\" has no spawn config.`);\n }\n\n if (resolved.spawnConfig.kind !== \"cli\") {\n throw new Error(`Agent \"${resolved.agentId}\" does not support CLI spawn.`);\n }\n\n if (!resolved.binaryName) {\n throw new Error(`Agent \"${resolved.agentId}\" has no binaryName.`);\n }\n\n return {\n agentId: resolved.agentId,\n binaryName: resolved.binaryName,\n spawnConfig: resolved.spawnConfig\n };\n}\n\nfunction buildCliArgs(\n config: CliSpawnConfig,\n options: BuildSpawnArgsOptions,\n stdinMode?: StdinMode\n): string[] {\n const args: string[] = stdinMode\n ? [\n config.promptFlag,\n ...(stdinMode.omitPrompt ? [] : [options.prompt]),\n ...stdinMode.extraArgs\n ]\n : [config.promptFlag, options.prompt];\n\n if (options.model && config.modelFlag) {\n let model = config.modelStripProviderPrefix\n ? stripModelNamespace(options.model)\n : options.model;\n if (config.modelTransform) model = config.modelTransform(model);\n args.push(config.modelFlag, model);\n }\n\n args.push(...config.defaultArgs);\n args.push(...getMcpArgs(config, options.mcpServers));\n args.push(...config.modes[options.mode ?? \"yolo\"]);\n\n if (options.args && options.args.length > 0) {\n args.push(...options.args);\n }\n\n return args;\n}\n\nexport function buildSpawnArgs(\n agentId: string,\n options: BuildSpawnArgsOptions\n): BuildSpawnArgsResult {\n const { binaryName, spawnConfig } = resolveCliConfig(agentId);\n const stdinMode =\n options.useStdin && spawnConfig.stdinMode ? spawnConfig.stdinMode : undefined;\n return { binaryName, args: buildCliArgs(spawnConfig, options, stdinMode) };\n}\n\nexport async function spawn(\n agentId: string,\n options: SpawnOptions,\n context?: SpawnContext\n): Promise<SpawnResult> {\n const { agentId: resolvedId, binaryName, spawnConfig } = resolveCliConfig(agentId);\n\n const stdinMode =\n options.useStdin && spawnConfig.stdinMode ? spawnConfig.stdinMode : undefined;\n\n const spawnArgs = buildCliArgs(spawnConfig, options, stdinMode);\n\n if (context?.dryRun) {\n const rendered = [binaryName, ...spawnArgs].join(\" \");\n context.logger?.dryRun(rendered);\n return { stdout: \"\", stderr: \"\", exitCode: 0 };\n }\n\n const child = spawnChildProcess(binaryName, spawnArgs, {\n cwd: options.cwd,\n stdio: [stdinMode ? \"pipe\" : \"inherit\", \"pipe\", \"pipe\"]\n });\n\n if (!child.stdout || !child.stderr) {\n throw new Error(`Failed to spawn \"${resolvedId}\": missing stdio pipes.`);\n }\n\n const stdoutStream = child.stdout;\n const stderrStream = child.stderr;\n\n if (stdinMode) {\n if (!child.stdin) {\n throw new Error(`Failed to spawn \"${resolvedId}\": missing stdin pipe.`);\n }\n child.stdin.setDefaultEncoding(\"utf8\");\n child.stdin.write(options.prompt);\n child.stdin.end();\n }\n\n return new Promise<SpawnResult>((resolve, reject) => {\n let stdout = \"\";\n let stderr = \"\";\n\n stdoutStream.setEncoding(\"utf8\");\n stdoutStream.on(\"data\", (chunk) => {\n stdout += chunk;\n if (options.tee?.stdout) options.tee.stdout.write(chunk);\n });\n\n stderrStream.setEncoding(\"utf8\");\n stderrStream.on(\"data\", (chunk) => {\n stderr += chunk;\n if (options.tee?.stderr) options.tee.stderr.write(chunk);\n });\n\n child.on(\"error\", (error) => {\n reject(error);\n });\n\n child.on(\"close\", (code) => {\n resolve({\n stdout,\n stderr,\n exitCode: code ?? 1\n });\n });\n });\n}\n", "import { allAgents, resolveAgentId } from \"@poe-code/agent-defs\";\nimport type { SpawnConfig } from \"../types.js\";\nimport { getSpawnConfig } from \"./index.js\";\n\nexport interface ResolvedSpawnConfig {\n agentId: string;\n binaryName?: string;\n spawnConfig?: SpawnConfig;\n}\n\nexport function resolveConfig(agentId: string): ResolvedSpawnConfig {\n const resolvedAgentId = resolveAgentId(agentId);\n if (!resolvedAgentId) {\n throw new Error(`Unknown agent \"${agentId}\".`);\n }\n\n const agentDefinition = allAgents.find((agent) => agent.id === resolvedAgentId);\n if (!agentDefinition) {\n throw new Error(`Unknown agent \"${agentId}\".`);\n }\n\n const spawnConfig = getSpawnConfig(resolvedAgentId);\n const binaryName = agentDefinition.binaryName;\n\n return { agentId: resolvedAgentId, binaryName, spawnConfig };\n}\n", "import { listMcpSupportedAgents } from \"./configs/index.js\";\nimport type { CliSpawnConfig, McpSpawnConfig } from \"./types.js\";\n\nexport function hasMcpServers(servers?: McpSpawnConfig): servers is McpSpawnConfig {\n if (!servers) {\n return false;\n }\n return Object.keys(servers).length > 0;\n}\n\nexport function getMcpArgs(\n config: CliSpawnConfig,\n servers?: McpSpawnConfig\n): string[] {\n if (!hasMcpServers(servers)) {\n return [];\n }\n if (!config.mcpArgs) {\n throw new Error(formatUnsupportedMcpSpawnMessage(config.agentId));\n }\n return config.mcpArgs(servers);\n}\n\nexport function formatUnsupportedMcpSpawnMessage(agentId: string): string {\n const supported = listMcpSupportedAgents();\n const supportedText = supported.length > 0 ? supported.join(\", \") : \"(none)\";\n return (\n `Agent \"${agentId}\" does not support MCP servers at spawn time.\\n` +\n `Agents with spawn-time MCP support: ${supportedText}`\n );\n}\n", "/**\n * Strips the provider namespace prefix from a model identifier.\n * e.g., \"anthropic/claude-opus-4.6\" \u2192 \"claude-opus-4.6\"\n *\n * CLI binaries (claude, codex, opencode, kimi) only accept bare model IDs.\n * Passing a namespaced model like \"anthropic/claude-opus-4.6\" causes the\n * binary to fail with \"model not found\". This function MUST be called\n * before passing any model to a CLI binary via spawn args.\n */\nexport function stripModelNamespace(model: string): string {\n const slashIndex = model.indexOf(\"/\");\n return slashIndex === -1 ? model : model.slice(slashIndex + 1);\n}\n", "import { spawn as spawnChildProcess } from \"node:child_process\";\nimport { resolveConfig } from \"./configs/resolve-config.js\";\nimport { getMcpArgs } from \"./mcp-args.js\";\nimport { stripModelNamespace } from \"./model-utils.js\";\nimport type { SpawnOptions, SpawnResult } from \"./types.js\";\n\nexport async function spawnInteractive(\n agentId: string,\n options: SpawnOptions\n): Promise<SpawnResult> {\n const resolved = resolveConfig(agentId);\n const spawnConfig = resolved.spawnConfig;\n\n if (!spawnConfig) {\n throw new Error(`Agent \"${resolved.agentId}\" has no spawn config.`);\n }\n\n if (spawnConfig.kind !== \"cli\") {\n throw new Error(`Agent \"${resolved.agentId}\" does not support CLI spawn.`);\n }\n\n if (!resolved.binaryName) {\n throw new Error(`Agent \"${resolved.agentId}\" has no binaryName.`);\n }\n\n if (!spawnConfig.interactive) {\n throw new Error(`Agent \"${resolved.agentId}\" does not support interactive mode.`);\n }\n\n const { interactive } = spawnConfig;\n\n const args: string[] = [];\n\n if (options.prompt) {\n if (interactive.promptFlag) {\n args.push(interactive.promptFlag, options.prompt);\n } else {\n args.push(options.prompt);\n }\n }\n\n if (options.model && spawnConfig.modelFlag) {\n let model = spawnConfig.modelStripProviderPrefix\n ? stripModelNamespace(options.model)\n : options.model;\n if (spawnConfig.modelTransform) model = spawnConfig.modelTransform(model);\n args.push(spawnConfig.modelFlag, model);\n }\n\n args.push(...interactive.defaultArgs);\n args.push(...getMcpArgs(spawnConfig, options.mcpServers));\n\n const mode = options.mode ?? \"yolo\";\n args.push(...spawnConfig.modes[mode]);\n\n if (options.args && options.args.length > 0) {\n args.push(...options.args);\n }\n\n const child = spawnChildProcess(resolved.binaryName, args, {\n cwd: options.cwd,\n stdio: \"inherit\"\n });\n\n return new Promise<SpawnResult>((resolve, reject) => {\n child.on(\"error\", (error) => {\n reject(error);\n });\n\n child.on(\"close\", (code) => {\n resolve({\n stdout: \"\",\n stderr: \"\",\n exitCode: code ?? 1\n });\n });\n });\n}\n", "import chalk from \"chalk\";\n\nexport const brand = \"#a200ff\";\n\nexport const dark = {\n header: (text: string) => chalk.magentaBright.bold(text),\n divider: (text: string) => chalk.dim(text),\n prompt: (text: string) => chalk.cyan(text),\n number: (text: string) => chalk.cyanBright(text),\n intro: (text: string) => chalk.bgMagenta.white(` Poe - ${text} `),\n resolvedSymbol: chalk.magenta(\"\u25C7\"),\n errorSymbol: chalk.red(\"\u25A0\"),\n accent: (text: string) => chalk.cyan(text),\n muted: (text: string) => chalk.dim(text),\n success: (text: string) => chalk.green(text),\n warning: (text: string) => chalk.yellow(text),\n error: (text: string) => chalk.red(text),\n info: (text: string) => chalk.magenta(text),\n badge: (text: string) => chalk.bgYellow.black(` ${text} `)\n};\n\nexport const light = {\n header: (text: string) => chalk.hex(\"#a200ff\").bold(text),\n divider: (text: string) => chalk.hex(\"#666666\")(text),\n prompt: (text: string) => chalk.hex(\"#006699\").bold(text),\n number: (text: string) => chalk.hex(\"#0077cc\").bold(text),\n intro: (text: string) => chalk.bgHex(\"#a200ff\").white(` Poe - ${text} `),\n resolvedSymbol: chalk.hex(\"#a200ff\")(\"\u25C7\"),\n errorSymbol: chalk.hex(\"#cc0000\")(\"\u25A0\"),\n accent: (text: string) => chalk.hex(\"#006699\").bold(text),\n muted: (text: string) => chalk.hex(\"#666666\")(text),\n success: (text: string) => chalk.hex(\"#008800\")(text),\n warning: (text: string) => chalk.hex(\"#cc6600\")(text),\n error: (text: string) => chalk.hex(\"#cc0000\")(text),\n info: (text: string) => chalk.hex(\"#a200ff\")(text),\n badge: (text: string) => chalk.bgHex(\"#cc6600\").white(` ${text} `)\n};\n\nexport type ThemeName = \"dark\" | \"light\";\nexport type ThemePalette = typeof dark;\n", "import chalk from \"chalk\";\n\nexport const typography = {\n bold: (text: string) => chalk.bold(text),\n dim: (text: string) => chalk.dim(text),\n italic: (text: string) => chalk.italic(text),\n underline: (text: string) => chalk.underline(text),\n strikethrough: (text: string) => chalk.strikethrough(text)\n} as const;\n", "import chalk from \"chalk\";\nimport { getTheme } from \"../internal/theme-detect.js\";\nimport { typography } from \"../tokens/typography.js\";\n\nexport const text = {\n intro(content: string): string {\n const theme = getTheme();\n return theme.intro(content);\n },\n heading(content: string): string {\n const theme = getTheme();\n return theme.header(content);\n },\n section(content: string): string {\n return typography.bold(content);\n },\n command(content: string): string {\n const theme = getTheme();\n return theme.accent(content);\n },\n argument(content: string): string {\n const theme = getTheme();\n return theme.muted(content);\n },\n option(content: string): string {\n return chalk.yellow(content);\n },\n example(content: string): string {\n const theme = getTheme();\n return theme.muted(content);\n },\n usageCommand(content: string): string {\n return chalk.green(content);\n },\n link(content: string): string {\n const theme = getTheme();\n return theme.accent(content);\n },\n muted(content: string): string {\n const theme = getTheme();\n return theme.muted(content);\n },\n badge(content: string): string {\n const theme = getTheme();\n return theme.badge(content);\n }\n} as const;\n", "import { dark, light, type ThemeName, type ThemePalette } from \"../tokens/colors.js\";\n\nexport interface ThemeEnv {\n POE_CODE_THEME?: string;\n APPLE_INTERFACE_STYLE?: string;\n VSCODE_COLOR_THEME_KIND?: string;\n COLORFGBG?: string;\n}\n\nfunction detectThemeFromEnv(env: ThemeEnv): ThemeName | undefined {\n const apple = env.APPLE_INTERFACE_STYLE;\n if (typeof apple === \"string\") {\n return apple.toLowerCase() === \"dark\" ? \"dark\" : \"light\";\n }\n\n const vscodeKind = env.VSCODE_COLOR_THEME_KIND;\n if (typeof vscodeKind === \"string\") {\n const normalized = vscodeKind.toLowerCase();\n if (normalized.includes(\"light\")) {\n return \"light\";\n }\n if (normalized.includes(\"dark\")) {\n return \"dark\";\n }\n }\n\n const colorFGBG = env.COLORFGBG;\n if (typeof colorFGBG === \"string\") {\n const parts = colorFGBG.split(\";\").map((part) => Number.parseInt(part, 10));\n const background = parts.at(-1);\n if (Number.isFinite(background)) {\n return background! >= 8 ? \"light\" : \"dark\";\n }\n }\n\n return undefined;\n}\n\nexport function resolveThemeName(env: ThemeEnv = process.env as ThemeEnv): ThemeName {\n const raw = env.POE_CODE_THEME?.toLowerCase();\n if (raw === \"light\" || raw === \"dark\") {\n return raw;\n }\n const detected = detectThemeFromEnv(env);\n if (detected) {\n return detected;\n }\n return \"dark\";\n}\n\nlet cachedTheme: ThemePalette | undefined;\n\nexport function getTheme(env?: ThemeEnv): ThemePalette {\n if (cachedTheme) {\n return cachedTheme;\n }\n const themeName = resolveThemeName(env);\n cachedTheme = themeName === \"light\" ? light : dark;\n return cachedTheme;\n}\n\nexport function resetThemeCache(): void {\n cachedTheme = undefined;\n}\n", "import chalk from \"chalk\";\nimport { getTheme } from \"../internal/theme-detect.js\";\n\nexport const symbols = {\n get info(): string {\n return chalk.magenta(\"\u25CF\");\n },\n get success(): string {\n return chalk.magenta(\"\u25C6\");\n },\n get resolved(): string {\n const theme = getTheme();\n return theme.resolvedSymbol;\n },\n get errorResolved(): string {\n const theme = getTheme();\n return theme.errorSymbol;\n },\n bar: \"\u2502\",\n cornerTopRight: \"\u256E\",\n cornerBottomRight: \"\u256F\",\n warning: \"\u25B2\",\n active: \"\u25C6\",\n inactive: \"\u25CB\"\n} as const;\n", "import { log } from \"@clack/prompts\";\nimport chalk from \"chalk\";\nimport { symbols } from \"./symbols.js\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\n\nexport interface LoggerOutput {\n info(message: string): void;\n success(message: string): void;\n warn(message: string): void;\n error(message: string): void;\n resolved(label: string, value: string): void;\n errorResolved(label: string, value: string): void;\n message(message: string, symbol?: string): void;\n}\n\nexport function createLogger(emitter?: (message: string) => void): LoggerOutput {\n const emit = (\n level: \"info\" | \"success\" | \"warn\" | \"error\",\n message: string\n ): void => {\n if (emitter) {\n emitter(message);\n return;\n }\n if (resolveOutputFormat() !== \"terminal\") {\n process.stdout.write(message + \"\\n\");\n return;\n }\n if (level === \"success\") {\n log.message(message, { symbol: symbols.success });\n return;\n }\n if (level === \"warn\") {\n log.warn(message);\n return;\n }\n if (level === \"error\") {\n log.error(message);\n return;\n }\n log.message(message, { symbol: symbols.info });\n };\n\n return {\n info(message: string): void {\n emit(\"info\", message);\n },\n success(message: string): void {\n emit(\"success\", message);\n },\n warn(message: string): void {\n emit(\"warn\", message);\n },\n error(message: string): void {\n emit(\"error\", message);\n },\n resolved(label: string, value: string): void {\n if (emitter) {\n emitter(`${label}: ${value}`);\n return;\n }\n log.message(`${label}\\n ${value}`, { symbol: symbols.resolved });\n },\n errorResolved(label: string, value: string): void {\n if (emitter) {\n emitter(`${label}: ${value}`);\n return;\n }\n log.message(`${label}\\n ${value}`, { symbol: symbols.errorResolved });\n },\n message(message: string, symbol?: string): void {\n if (emitter) {\n emitter(message);\n return;\n }\n log.message(message, { symbol: symbol ?? chalk.gray(\"\u2502\") });\n }\n };\n}\n\nexport const logger = createLogger();\n", "export type OutputFormat = \"terminal\" | \"markdown\" | \"json\";\n\nconst VALID_FORMATS = new Set<OutputFormat>([\"terminal\", \"markdown\", \"json\"]);\n\nlet cached: OutputFormat | undefined;\n\nexport function resolveOutputFormat(\n env: { OUTPUT_FORMAT?: string } = process.env as { OUTPUT_FORMAT?: string }\n): OutputFormat {\n if (cached) {\n return cached;\n }\n const raw = env.OUTPUT_FORMAT?.toLowerCase();\n cached = VALID_FORMATS.has(raw as OutputFormat) ? (raw as OutputFormat) : \"terminal\";\n return cached;\n}\n\nexport function resetOutputFormatCache(): void {\n cached = undefined;\n}\n", "import { Table } from \"console-table-printer\";\nimport type { ThemePalette } from \"../tokens/colors.js\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\n\nexport interface TableColumn {\n name: string;\n title: string;\n alignment: \"left\" | \"right\";\n maxLen: number;\n}\n\nexport interface RenderTableOptions {\n theme: ThemePalette;\n columns: TableColumn[];\n rows: Record<string, string>[];\n}\n\nfunction stripAnsi(value: string): string {\n return value.replace(/\\u001b\\[[0-9;]*m/g, \"\");\n}\n\nfunction renderTableTerminal(options: RenderTableOptions): string {\n const { theme, columns, rows } = options;\n\n const table = new Table({\n style: {\n headerTop: {\n left: theme.muted(\"\u250C\"),\n mid: theme.muted(\"\u252C\"),\n right: theme.muted(\"\u2510\"),\n other: theme.muted(\"\u2500\")\n },\n headerBottom: {\n left: theme.muted(\"\u251C\"),\n mid: theme.muted(\"\u253C\"),\n right: theme.muted(\"\u2524\"),\n other: theme.muted(\"\u2500\")\n },\n tableBottom: {\n left: theme.muted(\"\u2514\"),\n mid: theme.muted(\"\u2534\"),\n right: theme.muted(\"\u2518\"),\n other: theme.muted(\"\u2500\")\n },\n vertical: theme.muted(\"\u2502\"),\n rowSeparator: {\n left: theme.muted(\"\u251C\"),\n mid: theme.muted(\"\u253C\"),\n right: theme.muted(\"\u2524\"),\n other: theme.muted(\"\u2500\")\n }\n },\n columns: columns.map((col) => ({\n name: col.name,\n title: theme.header(col.title),\n alignment: col.alignment,\n maxLen: col.maxLen\n }))\n });\n\n for (const row of rows) {\n table.addRow(row);\n }\n\n return table.render();\n}\n\nfunction renderTableMarkdown(options: RenderTableOptions): string {\n const { columns, rows } = options;\n\n const header = `| ${columns.map((c) => c.title).join(\" | \")} |`;\n const separator = `| ${columns.map((c) => (c.alignment === \"right\" ? \"---:\" : \":---\")).join(\" | \")} |`;\n\n const dataRows = rows.map(\n (row) =>\n `| ${columns.map((c) => stripAnsi(row[c.name] ?? \"\").replace(/\\|/g, \"\\\\|\")).join(\" | \")} |`\n );\n\n return [header, separator, ...dataRows].join(\"\\n\");\n}\n\nfunction renderTableJson(options: RenderTableOptions): string {\n const { columns, rows } = options;\n\n const cleaned = rows.map((row) => {\n const obj: Record<string, string> = {};\n for (const col of columns) {\n obj[col.name] = stripAnsi(row[col.name] ?? \"\");\n }\n return obj;\n });\n\n return JSON.stringify(cleaned, null, 2);\n}\n\nexport function renderTable(options: RenderTableOptions): string {\n const format = resolveOutputFormat();\n switch (format) {\n case \"markdown\":\n return renderTableMarkdown(options);\n case \"json\":\n return renderTableJson(options);\n default:\n return renderTableTerminal(options);\n }\n}\n", "import chalk from \"chalk\";\n\nfunction truncate(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text;\n if (maxLength <= 3) return text.slice(0, maxLength);\n return `${text.slice(0, maxLength - 3)}...`;\n}\n\nconst KIND_COLORS: Record<string, (text: string) => string> = {\n exec: (text) => chalk.yellow(text),\n edit: (text) => chalk.magenta(text),\n read: (text) => chalk.cyan(text),\n search: (text) => chalk.blue(text),\n think: (text) => chalk.dim(text),\n other: (text) => chalk.dim(text)\n};\n\nfunction colorForKind(kind: string): (text: string) => string {\n return KIND_COLORS[kind] ?? ((text) => chalk.dim(text));\n}\n\nfunction writeLine(line: string): void {\n process.stdout.write(`${line}\\n`);\n}\n\nconst AGENT_PREFIX = `${chalk.green.bold(\"\u2713\")} agent: `;\n\nexport function renderAgentMessage(text: string): void {\n writeLine(`${AGENT_PREFIX}${text}`);\n}\n\nexport function renderToolStart(kind: string, title: string): void {\n const color = colorForKind(kind);\n writeLine(color(` \u2192 ${kind}: ${title}`));\n}\n\nexport function renderToolComplete(kind: string): void {\n const color = colorForKind(kind);\n writeLine(color(` \u2713 ${kind}`));\n}\n\nexport function renderReasoning(text: string): void {\n writeLine(chalk.dim(` \u2713 ${truncate(text, 80)}`));\n}\n\nexport function renderUsage(tokens: {\n input: number;\n output: number;\n cached?: number;\n costUsd?: number;\n}): void {\n const cached = typeof tokens.cached === \"number\" && tokens.cached > 0\n ? ` (${tokens.cached} cached)`\n : \"\";\n\n let cost = \"\";\n if (typeof tokens.costUsd === \"number\") {\n const formatted = new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: \"USD\",\n minimumFractionDigits: 2,\n maximumFractionDigits: 6\n }).format(tokens.costUsd);\n cost = ` (${formatted})`;\n }\n\n writeLine(\n chalk.green(\n `\u2713 tokens: ${tokens.input} in${cached} \u2192 ${tokens.output} out${cost}`\n )\n );\n}\n\nexport function renderError(message: string): void {\n writeLine(chalk.red(`\u2717 ${message}`));\n}\n", "import * as clack from \"@clack/prompts\";\nimport { text as textComponent } from \"../components/text.js\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\n\nexport { isCancel, cancel, log } from \"@clack/prompts\";\n\nfunction stripAnsi(value: string): string {\n return value.replace(/\\u001b\\[[0-9;]*m/g, \"\");\n}\n\nexport function intro(title: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`# ${stripAnsi(title)}\\n\\n`);\n return;\n }\n if (format === \"json\") {\n return;\n }\n clack.intro(textComponent.intro(title));\n}\n\nexport function introPlain(title: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`# ${stripAnsi(title)}\\n\\n`);\n return;\n }\n if (format === \"json\") {\n return;\n }\n clack.intro(title);\n}\n\nexport function outro(message: string): void {\n if (resolveOutputFormat() !== \"terminal\") {\n return;\n }\n clack.outro(message);\n}\n\nexport function note(message: string, title?: string): void {\n if (resolveOutputFormat() !== \"terminal\") {\n return;\n }\n clack.note(message, title);\n}\n\nexport type SelectOptions<Value> = Parameters<typeof clack.select<Value>>[0];\n\nexport async function select<Value>(\n opts: SelectOptions<Value>\n): Promise<Value | symbol> {\n return clack.select(opts);\n}\n\nexport type TextOptions = Parameters<typeof clack.text>[0];\n\nexport async function text(opts: TextOptions): Promise<string | symbol> {\n return clack.text(opts);\n}\n\nexport type ConfirmOptions = Parameters<typeof clack.confirm>[0];\n\nexport async function confirm(opts: ConfirmOptions): Promise<boolean | symbol> {\n return clack.confirm(opts);\n}\n\nexport class PromptCancelledError extends Error {\n constructor(message = \"Operation cancelled.\") {\n super(message);\n this.name = \"PromptCancelledError\";\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\nexport async function confirmOrCancel(opts: ConfirmOptions): Promise<boolean> {\n const result = await confirm(opts);\n if (clack.isCancel(result)) {\n clack.cancel(\"Operation cancelled.\");\n throw new PromptCancelledError();\n }\n return result === true;\n}\n\nexport type PasswordOptions = Parameters<typeof clack.password>[0];\n\nexport async function password(opts: PasswordOptions): Promise<string | symbol> {\n return clack.password(opts);\n}\n\nexport type SpinnerOptions = {\n start: (message?: string) => void;\n stop: (message?: string, code?: number) => void;\n message: (message?: string) => void;\n};\n\nexport function spinner(): SpinnerOptions {\n return clack.spinner();\n}\n\nexport interface WithSpinnerOptions<T> {\n message: string;\n fn: () => Promise<T>;\n stopMessage?: (result: T) => string;\n subtext?: (result: T) => string | undefined;\n}\n\nfunction formatElapsed(ms: number): string {\n const totalSeconds = Math.floor(ms / 1000);\n if (totalSeconds < 60) {\n return `${totalSeconds}s`;\n }\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n return `${minutes}m ${seconds}s`;\n}\n\nexport async function withSpinner<T>(options: WithSpinnerOptions<T>): Promise<T> {\n const { message, fn, stopMessage, subtext } = options;\n\n if (resolveOutputFormat() === \"json\") {\n const result = await fn();\n const sub = subtext ? subtext(result) : undefined;\n if (sub) {\n process.stdout.write(sub + \"\\n\");\n }\n return result;\n }\n\n const noSpinner = process.env.POE_NO_SPINNER === \"1\";\n const isTTY = process.stdout.isTTY;\n\n if (noSpinner || !isTTY) {\n const result = await fn();\n const msg = stopMessage ? stopMessage(result) : undefined;\n if (msg) {\n process.stdout.write(`\\x1b[32m\u25C6\\x1b[0m ${msg}\\n`);\n }\n const sub = subtext ? subtext(result) : undefined;\n if (sub) {\n for (const line of sub.split(\"\\n\")) {\n process.stdout.write(`\\x1b[90m\u2502\\x1b[0m ${line}\\n`);\n }\n }\n return result;\n }\n\n const s = spinner();\n const start = Date.now();\n s.start(message);\n\n const timer = setInterval(() => {\n s.message(`${message} [${formatElapsed(Date.now() - start)}]`);\n }, 1000);\n\n try {\n const result = await fn();\n clearInterval(timer);\n const elapsed = formatElapsed(Date.now() - start);\n const msg = stopMessage ? stopMessage(result) : undefined;\n s.stop(msg ? `${msg} [${elapsed}]` : `Done [${elapsed}]`);\n\n const sub = subtext ? subtext(result) : undefined;\n if (sub) {\n for (const line of sub.split(\"\\n\")) {\n process.stdout.write(`\\x1b[90m\u2502\\x1b[0m ${line}\\n`);\n }\n }\n\n return result;\n } catch (error) {\n clearInterval(timer);\n s.stop(\"\", 1);\n throw error;\n }\n}\n", "import chalk from \"chalk\";\nimport { symbols } from \"../components/symbols.js\";\n\nexport const SPINNER_FRAMES = [\"\u25D2\", \"\u25D0\", \"\u25D3\", \"\u25D1\"] as const;\n\nexport interface SpinnerFrameOptions {\n frame?: number;\n message: string;\n timer?: string;\n}\n\nexport function renderSpinnerFrame(options: SpinnerFrameOptions): string {\n const frame = options.frame ?? 0;\n const spinnerChar = chalk.magenta(SPINNER_FRAMES[frame % SPINNER_FRAMES.length]);\n const timerSuffix = options.timer ? chalk.dim(` [${options.timer}]`) : \"\";\n const bar = chalk.gray(symbols.bar);\n\n return `${spinnerChar} ${options.message}${timerSuffix}\\n${bar}`;\n}\n\nexport interface SpinnerStoppedOptions {\n message: string;\n code?: number;\n timer?: string;\n subtext?: string;\n}\n\nexport function renderSpinnerStopped(options: SpinnerStoppedOptions): string {\n const code = options.code ?? 0;\n const symbol = code === 0\n ? chalk.green(\"\u25C6\")\n : chalk.red(\"\u25A0\");\n const timerSuffix = options.timer ? chalk.dim(` [${options.timer}]`) : \"\";\n const bar = chalk.gray(symbols.bar);\n\n let output = `${symbol} ${options.message}${timerSuffix}`;\n if (options.subtext) {\n output += `\\n${bar} ${chalk.dim(options.subtext)}`;\n }\n return output;\n}\n", "import chalk from \"chalk\";\nimport { symbols } from \"../components/symbols.js\";\nimport { getTheme } from \"../internal/theme-detect.js\";\n\nexport interface MenuOption {\n label: string;\n value: string;\n hint?: string;\n}\n\nexport interface RenderMenuOptions {\n message: string;\n options: MenuOption[];\n selectedIndex?: number;\n}\n\nexport function renderMenu(opts: RenderMenuOptions): string {\n const theme = getTheme();\n const bar = chalk.gray(symbols.bar);\n const lines: string[] = [];\n\n lines.push(`${chalk.cyan(symbols.active)} ${opts.message}`);\n lines.push(bar);\n\n opts.options.forEach((option, index) => {\n const isSelected = index === (opts.selectedIndex ?? 0);\n const prefix = isSelected ? chalk.cyan(symbols.active) : chalk.gray(symbols.inactive);\n const label = isSelected ? theme.accent(option.label) : option.label;\n const hint = option.hint ? chalk.dim(` (${option.hint})`) : \"\";\n lines.push(`${bar} ${prefix} ${label}${hint}`);\n });\n\n lines.push(`${bar}`);\n return lines.join(\"\\n\");\n}\n", "import { spawn as spawnChildProcess } from \"node:child_process\";\nimport { getAdapter } from \"../adapters/index.js\";\nimport type { AcpEvent } from \"./types.js\";\nimport { readLines } from \"./line-reader.js\";\nimport { resolveConfig } from \"../configs/resolve-config.js\";\nimport { getMcpArgs } from \"../mcp-args.js\";\nimport { stripModelNamespace } from \"../model-utils.js\";\nimport type { SpawnOptions, SpawnResult, SpawnUsage } from \"../types.js\";\n\nexport interface SpawnStreamingOptions extends SpawnOptions {\n agentId: string;\n}\n\nexport interface SpawnStreamingResult {\n events: AsyncIterable<AcpEvent>;\n done: Promise<SpawnResult>;\n}\n\nfunction isAcpEvent(value: unknown): value is AcpEvent {\n return !!value && typeof value === \"object\" && \"event\" in value;\n}\n\nfunction captureUsage(event: AcpEvent): SpawnUsage | undefined {\n if (event.event !== \"usage\") return;\n const usage = event as Partial<SpawnUsage>;\n\n const inputTokens = typeof usage.inputTokens === \"number\" ? usage.inputTokens : 0;\n const outputTokens = typeof usage.outputTokens === \"number\" ? usage.outputTokens : 0;\n const cachedTokens = typeof usage.cachedTokens === \"number\" ? usage.cachedTokens : undefined;\n const costUsd = typeof usage.costUsd === \"number\" ? usage.costUsd : undefined;\n\n return { inputTokens, outputTokens, cachedTokens, costUsd };\n}\n\nexport function spawnStreaming(options: SpawnStreamingOptions): SpawnStreamingResult {\n const { agentId, binaryName, spawnConfig } = resolveConfig(options.agentId);\n\n if (spawnConfig === undefined) {\n throw new Error(`Agent \"${agentId}\" has no spawn config.`);\n }\n\n if (spawnConfig.kind !== \"cli\") {\n throw new Error(`Agent \"${agentId}\" does not support CLI spawn.`);\n }\n\n if (!binaryName) {\n throw new Error(`Agent \"${agentId}\" has no binaryName.`);\n }\n\n const args: string[] = [spawnConfig.promptFlag];\n\n const useStdin = !!options.useStdin && !!spawnConfig.stdinMode;\n if (!useStdin || !spawnConfig.stdinMode?.omitPrompt) {\n args.push(options.prompt);\n }\n\n if (options.model && spawnConfig.modelFlag) {\n let model = spawnConfig.modelStripProviderPrefix\n ? stripModelNamespace(options.model)\n : options.model;\n if (spawnConfig.modelTransform) model = spawnConfig.modelTransform(model);\n args.push(spawnConfig.modelFlag, model);\n }\n\n args.push(...spawnConfig.defaultArgs);\n args.push(...getMcpArgs(spawnConfig, options.mcpServers));\n\n const mode = options.mode ?? \"yolo\";\n args.push(...spawnConfig.modes[mode]);\n\n if (useStdin) {\n args.push(...spawnConfig.stdinMode!.extraArgs);\n }\n\n if (options.args && options.args.length > 0) {\n args.push(...options.args);\n }\n\n const child = spawnChildProcess(binaryName, args, {\n cwd: options.cwd,\n stdio: [\"pipe\", \"pipe\", \"pipe\"]\n });\n\n const result: SpawnResult = { stdout: \"\", stderr: \"\", exitCode: 1 };\n child.stderr.setEncoding(\"utf8\");\n child.stderr.on(\"data\", (chunk) => {\n result.stderr += chunk;\n });\n\n if (useStdin) {\n child.stdin.write(options.prompt);\n }\n child.stdin.end();\n\n const adapter = getAdapter(spawnConfig.adapter);\n\n const events: AsyncIterable<AcpEvent> = (async function* () {\n for await (const output of adapter(readLines(child.stdout))) {\n if (!isAcpEvent(output)) continue;\n\n if (output.event === \"session_start\") {\n const maybeThreadId = (output as { threadId?: unknown }).threadId;\n if (typeof maybeThreadId === \"string\" && maybeThreadId.length > 0) {\n result.threadId = maybeThreadId;\n result.sessionId = maybeThreadId;\n }\n }\n\n const maybeUsage = captureUsage(output);\n if (maybeUsage) {\n result.usage = maybeUsage;\n }\n\n yield output;\n }\n })();\n\n const done = new Promise<SpawnResult>((resolve, reject) => {\n child.on(\"error\", (error) => {\n reject(error);\n });\n\n child.on(\"close\", (code) => {\n result.exitCode = code ?? 1;\n resolve(result);\n });\n });\n\n return { events, done };\n}\n", "import type { CommandRunner, CommandRunnerResult } from \"@poe-code/agent-spawn\";\nimport { buildSpawnArgs } from \"@poe-code/agent-spawn\";\n\nexport type {\n CommandRunner,\n CommandRunnerOptions,\n CommandRunnerResult\n} from \"@poe-code/agent-spawn\";\n\nexport function formatCommandRunnerResult(\n result: CommandRunnerResult\n): string {\n const stdout =\n result.stdout.length > 0 ? result.stdout : \"<empty>\";\n const stderr =\n result.stderr.length > 0 ? result.stderr : \"<empty>\";\n return `stdout:\\n${stdout}\\nstderr:\\n${stderr}`;\n}\n\nexport interface RunAndMatchOutputOptions {\n command: string;\n args: string[];\n expectedOutput: string;\n skipOnDryRun?: boolean;\n}\n\nexport function describeCommandExpectation(\n command: string,\n args: string[],\n expectedOutput: string\n): string {\n return `${renderCommandLine(command, args)} (expecting \"${expectedOutput}\")`;\n}\n\nexport interface CommandExpectationCheckOptions\n extends RunAndMatchOutputOptions {\n id: string;\n}\n\nexport function createCommandExpectationCheck(\n options: CommandExpectationCheckOptions\n): CommandCheck {\n return {\n id: options.id,\n description: describeCommandExpectation(\n options.command,\n options.args,\n options.expectedOutput\n ),\n async run(context) {\n await runAndMatchOutput(context, options);\n }\n };\n}\n\nexport async function runAndMatchOutput(\n context: CommandCheckContext,\n options: RunAndMatchOutputOptions\n): Promise<void> {\n const rendered = renderCommandLine(options.command, options.args);\n if (options.skipOnDryRun !== false && context.isDryRun) {\n if (context.logDryRun) {\n context.logDryRun(\n `Dry run: ${rendered} (expecting \"${options.expectedOutput}\")`\n );\n }\n return;\n }\n\n const result = await context.runCommand(options.command, options.args);\n if (result.exitCode !== 0) {\n const detail = formatCommandRunnerResult(result);\n throw new Error(\n [`Command ${rendered} failed with exit code ${result.exitCode}.`, detail].join(\"\\n\")\n );\n }\n\n if (!stdoutMatchesExpected(result.stdout, options.expectedOutput)) {\n const detail = formatCommandRunnerResult(result);\n const received = result.stdout.trim();\n throw new Error(\n [\n `Command ${rendered} failed: expected \"${options.expectedOutput}\" but received \"${received}\".`,\n detail\n ].join(\"\\n\")\n );\n }\n}\n\nexport function stdoutMatchesExpected(stdout: string, expected: string): boolean {\n const trimmed = stdout.trim();\n if (trimmed === expected) {\n return true;\n }\n\n const lines = stdout\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n\n if (lines.some((line) => line === expected)) {\n return true;\n }\n\n for (const line of lines) {\n if (line[0] !== \"{\") continue;\n try {\n const parsed = JSON.parse(line) as { type?: string; result?: string };\n if (parsed.type === \"result\" && parsed.result === expected) {\n return true;\n }\n } catch {\n continue;\n }\n }\n\n return false;\n}\n\nfunction renderCommandLine(command: string, args: string[]): string {\n return [command, ...args].map(quoteIfNeeded).join(\" \").trim();\n}\n\nfunction quoteIfNeeded(value: string): string {\n if (value.length === 0) {\n return '\"\"';\n }\n if (needsQuoting(value)) {\n return `\"${value.replaceAll('\"', '\\\\\"')}\"`;\n }\n return value;\n}\n\nfunction needsQuoting(value: string): boolean {\n return (\n value.includes(\" \") ||\n value.includes(\"\\t\") ||\n value.includes(\"\\n\")\n );\n}\n\nexport interface CommandCheckContext {\n isDryRun: boolean;\n runCommand: CommandRunner;\n logDryRun?: (message: string) => void;\n}\n\nexport interface CommandCheck {\n id: string;\n description?: string;\n run(context: CommandCheckContext): Promise<void>;\n}\n\nexport function createSpawnHealthCheck(\n agentId: string,\n options: { model?: string; expectedOutput: string }\n): CommandCheck {\n const prompt = `Output exactly: ${options.expectedOutput}`;\n const { binaryName, args } = buildSpawnArgs(agentId, {\n prompt,\n model: options.model,\n mode: \"yolo\"\n });\n return {\n id: `${agentId}-cli-health`,\n description: `spawn ${agentId} (expecting \"${options.expectedOutput}\")`,\n async run(context) {\n if (context.isDryRun) {\n context.logDryRun?.(\n `Dry run: ${[binaryName, ...args].join(\" \")} (expecting \"${options.expectedOutput}\")`\n );\n return;\n }\n\n const result = await context.runCommand(binaryName, args);\n\n if (result.exitCode !== 0) {\n throw new Error(\n `spawn ${agentId} failed with exit code ${result.exitCode}.\\n${formatCommandRunnerResult(result)}`\n );\n }\n\n if (!result.stdout.includes(options.expectedOutput)) {\n throw new Error(\n `spawn ${agentId}: expected \"${options.expectedOutput}\" in stdout.\\n${formatCommandRunnerResult(result)}`\n );\n }\n }\n };\n}\n\n/**\n * Creates a check that detects if a binary exists using multiple fallback methods.\n * This is useful in Docker/containerized environments where PATH may not be updated after npm install.\n *\n * @param binaryName - The name of the binary to check for (e.g., \"claude\", \"codex\")\n * @param id - Unique identifier for the check\n * @param description - Human-readable description of what's being checked\n * @returns A CommandCheck that verifies the binary using multiple detection methods\n */\nexport function createBinaryExistsCheck(\n binaryName: string,\n id: string,\n description: string\n): CommandCheck {\n return {\n id,\n description,\n async run({ runCommand }) {\n // Common installation paths for CLI tools\n const commonPaths = [\n `/usr/local/bin/${binaryName}`,\n `/usr/bin/${binaryName}`,\n `$HOME/.local/bin/${binaryName}`,\n `$HOME/.claude/local/bin/${binaryName}`\n ];\n\n const detectors: Array<{\n command: string;\n args: string[];\n validate: (result: CommandRunnerResult) => boolean;\n }> = [\n {\n command: \"which\",\n args: [binaryName],\n validate: (result) => result.exitCode === 0\n },\n {\n command: \"where\",\n args: [binaryName],\n validate: (result) =>\n result.exitCode === 0 && result.stdout.trim().length > 0\n },\n // Check common installation paths using shell expansion for $HOME\n {\n command: \"sh\",\n args: [\n \"-c\",\n commonPaths.map((p) => `test -f \"${p}\"`).join(\" || \")\n ],\n validate: (result) => result.exitCode === 0\n }\n ];\n\n for (const detector of detectors) {\n const result = await runCommand(detector.command, detector.args);\n if (detector.validate(result)) {\n return;\n }\n }\n\n throw new Error(`${binaryName} CLI binary not found on PATH.`);\n }\n };\n}\n", "import type {\n ConfigMergeMutation,\n ConfigPruneMutation,\n ConfigTransformMutation,\n ConfigObject,\n ValueResolver,\n MutationOptions\n} from \"../types.js\";\n\nexport interface MergeOptions {\n /** Target file path (must start with ~) */\n target: ValueResolver<string>;\n /** Value to merge into the config file */\n value: ValueResolver<ConfigObject>;\n /** Optional explicit format override */\n format?: \"json\" | \"toml\";\n /** Optional prune by prefix before merging (TOML) */\n pruneByPrefix?: Record<string, string>;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface PruneOptions {\n /** Target file path (must start with ~) */\n target: ValueResolver<string>;\n /** Shape to prune from the config file */\n shape: ValueResolver<ConfigObject>;\n /** Optional explicit format override */\n format?: \"json\" | \"toml\";\n /** Optional guard - only prune if predicate returns true */\n onlyIf?: (doc: ConfigObject, ctx: MutationOptions) => boolean;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface TransformOptions {\n /** Target file path (must start with ~) */\n target: ValueResolver<string>;\n /** Optional explicit format override */\n format?: \"json\" | \"toml\";\n /** Transform function - receives parsed content, returns transformed content */\n transform: (\n content: ConfigObject,\n ctx: MutationOptions\n ) => { content: ConfigObject | null; changed: boolean };\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nfunction merge(options: MergeOptions): ConfigMergeMutation {\n return {\n kind: \"configMerge\",\n target: options.target,\n value: options.value,\n format: options.format,\n pruneByPrefix: options.pruneByPrefix,\n label: options.label\n };\n}\n\nfunction prune(options: PruneOptions): ConfigPruneMutation {\n return {\n kind: \"configPrune\",\n target: options.target,\n shape: options.shape,\n format: options.format,\n onlyIf: options.onlyIf,\n label: options.label\n };\n}\n\nfunction transform(options: TransformOptions): ConfigTransformMutation {\n return {\n kind: \"configTransform\",\n target: options.target,\n format: options.format,\n transform: options.transform,\n label: options.label\n };\n}\n\nexport const configMutation = {\n merge,\n prune,\n transform\n};\n", "import type {\n EnsureDirectoryMutation,\n RemoveDirectoryMutation,\n RemoveFileMutation,\n ChmodMutation,\n BackupMutation,\n ValueResolver\n} from \"../types.js\";\n\nexport interface EnsureDirectoryOptions {\n /** Directory path (must start with ~) */\n path: ValueResolver<string>;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface RemoveOptions {\n /** Target file path (must start with ~) */\n target: ValueResolver<string>;\n /** Only remove if file is empty/whitespace */\n whenEmpty?: boolean;\n /** Only remove if content matches regex */\n whenContentMatches?: RegExp;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface RemoveDirectoryOptions {\n /** Directory path (must start with ~) */\n path: ValueResolver<string>;\n /** Remove directory even when not empty */\n force?: boolean;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface ChmodOptions {\n /** Target file path (must start with ~) */\n target: ValueResolver<string>;\n /** File permission mode (e.g., 0o755) */\n mode: number;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface BackupOptions {\n /** Target file path to backup (must start with ~) */\n target: ValueResolver<string>;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nfunction ensureDirectory(options: EnsureDirectoryOptions): EnsureDirectoryMutation {\n return {\n kind: \"ensureDirectory\",\n path: options.path,\n label: options.label\n };\n}\n\nfunction remove(options: RemoveOptions): RemoveFileMutation {\n return {\n kind: \"removeFile\",\n target: options.target,\n whenEmpty: options.whenEmpty,\n whenContentMatches: options.whenContentMatches,\n label: options.label\n };\n}\n\nfunction removeDirectory(\n options: RemoveDirectoryOptions\n): RemoveDirectoryMutation {\n return {\n kind: \"removeDirectory\",\n path: options.path,\n force: options.force,\n label: options.label\n };\n}\n\nfunction chmod(options: ChmodOptions): ChmodMutation {\n return {\n kind: \"chmod\",\n target: options.target,\n mode: options.mode,\n label: options.label\n };\n}\n\nfunction backup(options: BackupOptions): BackupMutation {\n return {\n kind: \"backup\",\n target: options.target,\n label: options.label\n };\n}\n\nexport const fileMutation = {\n ensureDirectory,\n remove,\n removeDirectory,\n chmod,\n backup\n};\n", "import Mustache from \"mustache\";\nimport type {\n Mutation,\n MutationContext,\n MutationOutcome,\n MutationDetails,\n ConfigObject,\n MutationOptions,\n ValueResolver,\n FileSystem\n} from \"../types.js\";\nimport { getConfigFormat, detectFormat } from \"../formats/index.js\";\nimport { resolvePath } from \"./path-utils.js\";\nimport {\n isNotFound,\n readFileIfExists,\n pathExists,\n createTimestamp\n} from \"../fs-utils.js\";\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction resolveValue<T>(\n resolver: ValueResolver<T>,\n options: MutationOptions\n): T {\n if (typeof resolver === \"function\") {\n return (resolver as (ctx: MutationOptions) => T)(options);\n }\n return resolver;\n}\n\nfunction createInvalidDocumentBackupPath(targetPath: string): string {\n const ext = targetPath.includes(\".\") ? targetPath.split(\".\").pop() : \"bak\";\n return `${targetPath}.invalid-${createTimestamp()}.${ext}`;\n}\n\nasync function backupInvalidDocument(\n fs: FileSystem,\n targetPath: string,\n content: string\n): Promise<void> {\n const backupPath = createInvalidDocumentBackupPath(targetPath);\n await fs.writeFile(backupPath, content, { encoding: \"utf8\" });\n}\n\nfunction describeMutation(kind: string, targetPath?: string): string {\n const displayPath = targetPath ?? \"target\";\n switch (kind) {\n case \"ensureDirectory\":\n return `Create ${displayPath}`;\n case \"removeDirectory\":\n return `Remove directory ${displayPath}`;\n case \"backup\":\n return `Backup ${displayPath}`;\n case \"templateWrite\":\n return `Write ${displayPath}`;\n case \"chmod\":\n return `Set permissions on ${displayPath}`;\n case \"removeFile\":\n return `Remove ${displayPath}`;\n case \"configMerge\":\n case \"configPrune\":\n case \"configTransform\":\n case \"templateMergeToml\":\n case \"templateMergeJson\":\n return `Update ${displayPath}`;\n default:\n return \"Operation\";\n }\n}\n\nfunction pruneKeysByPrefix(\n table: ConfigObject,\n prefix: string\n): ConfigObject {\n const result: ConfigObject = {};\n for (const [key, value] of Object.entries(table)) {\n if (!key.startsWith(prefix)) {\n result[key] = value;\n }\n }\n return result;\n}\n\nfunction isConfigObject(value: unknown): value is ConfigObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction mergeWithPruneByPrefix(\n base: ConfigObject,\n patch: ConfigObject,\n pruneByPrefix?: Record<string, string>\n): ConfigObject {\n const result: ConfigObject = { ...base };\n const prefixMap = pruneByPrefix ?? {};\n\n for (const [key, value] of Object.entries(patch)) {\n const current = result[key];\n const prefix = prefixMap[key];\n\n if (isConfigObject(current) && isConfigObject(value)) {\n if (prefix) {\n const pruned = pruneKeysByPrefix(current, prefix);\n result[key] = { ...pruned, ...value };\n } else {\n result[key] = mergeWithPruneByPrefix(\n current,\n value as ConfigObject,\n prefixMap\n );\n }\n continue;\n }\n result[key] = value;\n }\n return result;\n}\n\n// ============================================================================\n// Apply Mutation\n// ============================================================================\n\nexport async function applyMutation(\n mutation: Mutation,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n switch (mutation.kind) {\n case \"ensureDirectory\":\n return applyEnsureDirectory(mutation, context, options);\n case \"removeDirectory\":\n return applyRemoveDirectory(mutation, context, options);\n case \"removeFile\":\n return applyRemoveFile(mutation, context, options);\n case \"chmod\":\n return applyChmod(mutation, context, options);\n case \"backup\":\n return applyBackup(mutation, context, options);\n case \"configMerge\":\n return applyConfigMerge(mutation, context, options);\n case \"configPrune\":\n return applyConfigPrune(mutation, context, options);\n case \"configTransform\":\n return applyConfigTransform(mutation, context, options);\n case \"templateWrite\":\n return applyTemplateWrite(mutation, context, options);\n case \"templateMergeToml\":\n return applyTemplateMerge(mutation, context, options, \"toml\");\n case \"templateMergeJson\":\n return applyTemplateMerge(mutation, context, options, \"json\");\n default: {\n const never: never = mutation;\n throw new Error(`Unknown mutation kind: ${(never as Mutation).kind}`);\n }\n }\n}\n\n// ============================================================================\n// File Mutation Handlers\n// ============================================================================\n\nasync function applyEnsureDirectory(\n mutation: Extract<Mutation, { kind: \"ensureDirectory\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.path, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const existed = await pathExists(context.fs, targetPath);\n\n if (!context.dryRun) {\n await context.fs.mkdir(targetPath, { recursive: true });\n }\n\n return {\n outcome: {\n changed: !existed,\n effect: \"mkdir\",\n detail: existed ? \"noop\" : \"create\"\n },\n details\n };\n}\n\nasync function applyRemoveDirectory(\n mutation: Extract<Mutation, { kind: \"removeDirectory\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.path, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const existed = await pathExists(context.fs, targetPath);\n if (!existed) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (typeof context.fs.rm !== \"function\") {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (mutation.force) {\n if (!context.dryRun) {\n await context.fs.rm(targetPath, { recursive: true, force: true });\n }\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n }\n\n const entries = await context.fs.readdir(targetPath);\n if (entries.length > 0) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n await context.fs.rm(targetPath, { recursive: true, force: true });\n }\n\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n}\n\nasync function applyRemoveFile(\n mutation: Extract<Mutation, { kind: \"removeFile\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n try {\n const content = await context.fs.readFile(targetPath, \"utf8\");\n const trimmed = content.trim();\n\n // Check whenContentMatches guard\n if (mutation.whenContentMatches && !mutation.whenContentMatches.test(trimmed)) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n // Check whenEmpty guard\n if (mutation.whenEmpty && trimmed.length > 0) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n await context.fs.unlink(targetPath);\n }\n\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n } catch (error) {\n if (isNotFound(error)) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n throw error;\n }\n}\n\nasync function applyChmod(\n mutation: Extract<Mutation, { kind: \"chmod\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n if (typeof context.fs.chmod !== \"function\") {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n try {\n const stat = await context.fs.stat(targetPath);\n const currentMode = typeof stat.mode === \"number\" ? stat.mode & 0o777 : null;\n\n if (currentMode === mutation.mode) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n await context.fs.chmod(targetPath, mutation.mode);\n }\n\n return {\n outcome: { changed: true, effect: \"chmod\", detail: \"update\" },\n details\n };\n } catch (error) {\n if (isNotFound(error)) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n throw error;\n }\n}\n\nasync function applyBackup(\n mutation: Extract<Mutation, { kind: \"backup\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const content = await readFileIfExists(context.fs, targetPath);\n if (content === null) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n const backupPath = `${targetPath}.backup-${createTimestamp()}`;\n await context.fs.writeFile(backupPath, content, { encoding: \"utf8\" });\n }\n\n return {\n outcome: { changed: true, effect: \"copy\", detail: \"backup\" },\n details\n };\n}\n\n// ============================================================================\n// Config Mutation Handlers\n// ============================================================================\n\nasync function applyConfigMerge(\n mutation: Extract<Mutation, { kind: \"configMerge\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const formatName = mutation.format ?? detectFormat(rawPath);\n if (!formatName) {\n throw new Error(\n `Cannot detect config format for \"${rawPath}\". Provide explicit format option.`\n );\n }\n const format = getConfigFormat(formatName);\n\n const rawContent = await readFileIfExists(context.fs, targetPath);\n let current: ConfigObject;\n try {\n current = rawContent === null ? {} : format.parse(rawContent);\n } catch {\n // Invalid file - backup and start fresh\n if (rawContent !== null) {\n await backupInvalidDocument(context.fs, targetPath, rawContent);\n }\n current = {};\n }\n\n const value = resolveValue(mutation.value, options);\n\n // Use mergeWithPruneByPrefix for TOML files with pruneByPrefix option\n let merged: ConfigObject;\n if (mutation.pruneByPrefix) {\n merged = mergeWithPruneByPrefix(current, value, mutation.pruneByPrefix);\n } else {\n merged = format.merge(current, value);\n }\n\n const serialized = format.serialize(merged);\n const changed = serialized !== rawContent;\n\n if (changed && !context.dryRun) {\n await context.fs.writeFile(targetPath, serialized, { encoding: \"utf8\" });\n }\n\n return {\n outcome: {\n changed,\n effect: changed ? \"write\" : \"none\",\n detail: changed ? (rawContent === null ? \"create\" : \"update\") : \"noop\"\n },\n details\n };\n}\n\nasync function applyConfigPrune(\n mutation: Extract<Mutation, { kind: \"configPrune\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const rawContent = await readFileIfExists(context.fs, targetPath);\n if (rawContent === null) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n const formatName = mutation.format ?? detectFormat(rawPath);\n if (!formatName) {\n throw new Error(\n `Cannot detect config format for \"${rawPath}\". Provide explicit format option.`\n );\n }\n const format = getConfigFormat(formatName);\n\n let current: ConfigObject;\n try {\n current = format.parse(rawContent);\n } catch {\n // Invalid file - can't prune, leave as-is\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n // Check onlyIf guard\n if (mutation.onlyIf && !mutation.onlyIf(current, options)) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n const shape = resolveValue(mutation.shape, options);\n const { changed, result } = format.prune(current, shape);\n\n if (!changed) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n // Delete file if empty\n if (Object.keys(result).length === 0) {\n if (!context.dryRun) {\n await context.fs.unlink(targetPath);\n }\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n }\n\n const serialized = format.serialize(result);\n if (!context.dryRun) {\n await context.fs.writeFile(targetPath, serialized, { encoding: \"utf8\" });\n }\n\n return {\n outcome: { changed: true, effect: \"write\", detail: \"update\" },\n details\n };\n}\n\nasync function applyConfigTransform(\n mutation: Extract<Mutation, { kind: \"configTransform\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const formatName = mutation.format ?? detectFormat(rawPath);\n if (!formatName) {\n throw new Error(\n `Cannot detect config format for \"${rawPath}\". Provide explicit format option.`\n );\n }\n const format = getConfigFormat(formatName);\n\n const rawContent = await readFileIfExists(context.fs, targetPath);\n let current: ConfigObject;\n try {\n current = rawContent === null ? {} : format.parse(rawContent);\n } catch {\n if (rawContent !== null) {\n await backupInvalidDocument(context.fs, targetPath, rawContent);\n }\n current = {};\n }\n\n const { content: transformed, changed } = mutation.transform(current, options);\n\n if (!changed) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n // Delete file if null\n if (transformed === null) {\n if (rawContent === null) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n if (!context.dryRun) {\n await context.fs.unlink(targetPath);\n }\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n }\n\n const serialized = format.serialize(transformed);\n if (!context.dryRun) {\n await context.fs.writeFile(targetPath, serialized, { encoding: \"utf8\" });\n }\n\n return {\n outcome: {\n changed: true,\n effect: \"write\",\n detail: rawContent === null ? \"create\" : \"update\"\n },\n details\n };\n}\n\n// ============================================================================\n// Template Mutation Handlers\n// ============================================================================\n\nasync function applyTemplateWrite(\n mutation: Extract<Mutation, { kind: \"templateWrite\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n if (!context.templates) {\n throw new Error(\n \"Template mutations require a templates loader. \" +\n \"Provide templates function to runMutations context.\"\n );\n }\n\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const template = await context.templates(mutation.templateId);\n const templateContext = mutation.context\n ? resolveValue(mutation.context, options)\n : {};\n const rendered = Mustache.render(template, templateContext);\n\n const existed = await pathExists(context.fs, targetPath);\n\n if (!context.dryRun) {\n await context.fs.writeFile(targetPath, rendered, { encoding: \"utf8\" });\n }\n\n return {\n outcome: {\n changed: true,\n effect: \"write\",\n detail: existed ? \"update\" : \"create\"\n },\n details\n };\n}\n\nasync function applyTemplateMerge(\n mutation: Extract<Mutation, { kind: \"templateMergeToml\" | \"templateMergeJson\" }>,\n context: MutationContext,\n options: MutationOptions,\n formatName: \"toml\" | \"json\"\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n if (!context.templates) {\n throw new Error(\n \"Template mutations require a templates loader. \" +\n \"Provide templates function to runMutations context.\"\n );\n }\n\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const format = getConfigFormat(formatName);\n\n // Load and render template\n const template = await context.templates(mutation.templateId);\n const templateContext = mutation.context\n ? resolveValue(mutation.context, options)\n : {};\n const rendered = Mustache.render(template, templateContext);\n\n // Parse rendered template\n let templateDoc: ConfigObject;\n try {\n templateDoc = format.parse(rendered);\n } catch (error) {\n throw new Error(\n `Failed to parse rendered template \"${mutation.templateId}\" as ${formatName.toUpperCase()}: ${error}`,\n { cause: error }\n );\n }\n\n // Read and parse existing file\n const rawContent = await readFileIfExists(context.fs, targetPath);\n let current: ConfigObject;\n try {\n current = rawContent === null ? {} : format.parse(rawContent);\n } catch {\n if (rawContent !== null) {\n await backupInvalidDocument(context.fs, targetPath, rawContent);\n }\n current = {};\n }\n\n // Merge\n const merged = format.merge(current, templateDoc);\n const serialized = format.serialize(merged);\n const changed = serialized !== rawContent;\n\n if (changed && !context.dryRun) {\n await context.fs.writeFile(targetPath, serialized, { encoding: \"utf8\" });\n }\n\n return {\n outcome: {\n changed,\n effect: changed ? \"write\" : \"none\",\n detail: changed ? (rawContent === null ? \"create\" : \"update\") : \"noop\"\n },\n details\n };\n}\n", "import * as jsonc from \"jsonc-parser\";\nimport type { ConfigFormat, ConfigObject, ConfigValue } from \"../types.js\";\n\nfunction isConfigObject(value: unknown): value is ConfigObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction detectIndent(content: string): string {\n const match = content.match(/^[\\t ]+/m);\n if (match) {\n return match[0];\n }\n return \" \";\n}\n\nfunction parse(content: string): ConfigObject {\n if (!content || content.trim() === \"\") {\n return {};\n }\n const errors: jsonc.ParseError[] = [];\n const parsed = jsonc.parse(content, errors, {\n allowTrailingComma: true,\n disallowComments: false\n });\n if (errors.length > 0) {\n throw new Error(`JSON parse error: ${jsonc.printParseErrorCode(errors[0].error)}`);\n }\n if (parsed === null || parsed === undefined) {\n return {};\n }\n if (!isConfigObject(parsed)) {\n throw new Error(\"Expected JSON object.\");\n }\n return parsed;\n}\n\nfunction serialize(obj: ConfigObject): string {\n return `${JSON.stringify(obj, null, 2)}\\n`;\n}\n\nfunction merge(base: ConfigObject, patch: ConfigObject): ConfigObject {\n const result: ConfigObject = { ...base };\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n const existing = result[key];\n if (isConfigObject(existing) && isConfigObject(value)) {\n result[key] = merge(existing, value);\n continue;\n }\n result[key] = value as ConfigValue;\n }\n return result;\n}\n\nfunction prune(\n obj: ConfigObject,\n shape: ConfigObject\n): { changed: boolean; result: ConfigObject } {\n let changed = false;\n const result: ConfigObject = { ...obj };\n\n for (const [key, pattern] of Object.entries(shape)) {\n if (!(key in result)) {\n continue;\n }\n\n const current = result[key];\n\n // Empty object pattern means \"delete this key entirely\"\n if (isConfigObject(pattern) && Object.keys(pattern).length === 0) {\n delete result[key];\n changed = true;\n continue;\n }\n\n // Non-empty object pattern with object current: recurse\n if (isConfigObject(pattern) && isConfigObject(current)) {\n const { changed: childChanged, result: childResult } = prune(\n current,\n pattern\n );\n if (childChanged) {\n changed = true;\n }\n if (Object.keys(childResult).length === 0) {\n delete result[key];\n } else {\n result[key] = childResult;\n }\n continue;\n }\n\n delete result[key];\n changed = true;\n }\n\n return { changed, result };\n}\n\n/**\n * Modify JSON content at a specific path while preserving comments and formatting.\n * Uses jsonc-parser's modify() for targeted updates.\n *\n * @param content - The original JSON content (may include comments)\n * @param path - JSON path array, e.g. [\"mcpServers\", \"my-server\"]\n * @param value - The value to set (or undefined to remove)\n * @returns The modified JSON content with comments preserved\n */\nfunction modifyAtPath(\n content: string,\n path: (string | number)[],\n value: ConfigValue | undefined\n): string {\n const indent = detectIndent(content);\n const formattingOptions: jsonc.FormattingOptions = {\n tabSize: indent === \"\\t\" ? 1 : indent.length,\n insertSpaces: indent !== \"\\t\",\n eol: \"\\n\"\n };\n\n const edits = jsonc.modify(content, path, value, { formattingOptions });\n let result = jsonc.applyEdits(content, edits);\n\n if (!result.endsWith(\"\\n\")) {\n result += \"\\n\";\n }\n\n return result;\n}\n\n/**\n * Merge a patch into JSON content while preserving comments and formatting.\n * Uses jsonc.modify() for each top-level key to preserve existing comments.\n *\n * @param content - The original JSON content (may include comments)\n * @param patch - Object with values to merge\n * @returns The modified JSON content with comments preserved\n */\nfunction mergePreservingComments(\n content: string,\n patch: ConfigObject\n): string {\n let result = content || \"{}\";\n\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n result = modifyAtPath(result, [key], value);\n }\n\n return result;\n}\n\n/**\n * Remove a key from JSON content while preserving comments and formatting.\n *\n * @param content - The original JSON content\n * @param path - JSON path array to the key to remove\n * @returns The modified JSON content with comments preserved\n */\nfunction removeAtPath(content: string, path: (string | number)[]): string {\n return modifyAtPath(content, path, undefined);\n}\n\nexport { detectIndent, modifyAtPath, mergePreservingComments, removeAtPath };\n\nexport const jsonFormat: ConfigFormat = {\n parse,\n serialize,\n merge,\n prune\n};\n", "import { parse as parseToml, stringify as stringifyToml } from \"smol-toml\";\nimport type { ConfigFormat, ConfigObject, ConfigValue } from \"../types.js\";\n\nfunction isConfigObject(value: unknown): value is ConfigObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction parse(content: string): ConfigObject {\n if (!content || content.trim() === \"\") {\n return {};\n }\n const parsed = parseToml(content);\n if (!isConfigObject(parsed)) {\n throw new Error(\"Expected TOML document to be a table.\");\n }\n return parsed as ConfigObject;\n}\n\nfunction serialize(obj: ConfigObject): string {\n const serialized = stringifyToml(obj);\n return serialized.endsWith(\"\\n\") ? serialized : `${serialized}\\n`;\n}\n\nfunction merge(base: ConfigObject, patch: ConfigObject): ConfigObject {\n const result: ConfigObject = { ...base };\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n const existing = result[key];\n if (isConfigObject(existing) && isConfigObject(value)) {\n result[key] = merge(existing, value);\n continue;\n }\n result[key] = value as ConfigValue;\n }\n return result;\n}\n\nfunction prune(\n obj: ConfigObject,\n shape: ConfigObject\n): { changed: boolean; result: ConfigObject } {\n let changed = false;\n const result: ConfigObject = { ...obj };\n\n for (const [key, pattern] of Object.entries(shape)) {\n if (!(key in result)) {\n continue;\n }\n\n const current = result[key];\n\n // Empty object pattern means \"delete this key entirely\"\n if (isConfigObject(pattern) && Object.keys(pattern).length === 0) {\n delete result[key];\n changed = true;\n continue;\n }\n\n // Non-empty object pattern with object current: recurse\n if (isConfigObject(pattern) && isConfigObject(current)) {\n const { changed: childChanged, result: childResult } = prune(\n current,\n pattern\n );\n if (childChanged) {\n changed = true;\n }\n if (Object.keys(childResult).length === 0) {\n delete result[key];\n } else {\n result[key] = childResult;\n }\n continue;\n }\n\n delete result[key];\n changed = true;\n }\n\n return { changed, result };\n}\n\nexport const tomlFormat: ConfigFormat = {\n parse,\n serialize,\n merge,\n prune\n};\n", "import type { ConfigFormat } from \"../types.js\";\nimport { jsonFormat } from \"./json.js\";\nimport { tomlFormat } from \"./toml.js\";\n\nexport type FormatName = \"json\" | \"toml\";\n\nconst formatRegistry: Record<FormatName, ConfigFormat> = {\n json: jsonFormat,\n toml: tomlFormat\n};\n\nconst extensionMap: Record<string, FormatName> = {\n \".json\": \"json\",\n \".toml\": \"toml\"\n};\n\n/**\n * Get a format handler by path (auto-detect from extension) or explicit format name.\n */\nexport function getConfigFormat(pathOrFormat: string): ConfigFormat {\n // Check if it's an explicit format name\n if (pathOrFormat in formatRegistry) {\n return formatRegistry[pathOrFormat as FormatName];\n }\n\n // Try to detect from extension\n const ext = getExtension(pathOrFormat);\n const formatName = extensionMap[ext];\n\n if (!formatName) {\n throw new Error(\n `Unsupported config format. Cannot detect format from \"${pathOrFormat}\". ` +\n `Supported extensions: ${Object.keys(extensionMap).join(\", \")}. ` +\n `Supported format names: ${Object.keys(formatRegistry).join(\", \")}.`\n );\n }\n\n return formatRegistry[formatName];\n}\n\n/**\n * Detect format name from a file path.\n */\nexport function detectFormat(path: string): FormatName | undefined {\n const ext = getExtension(path);\n return extensionMap[ext];\n}\n\nfunction getExtension(path: string): string {\n const lastDot = path.lastIndexOf(\".\");\n if (lastDot === -1) {\n return \"\";\n }\n return path.slice(lastDot).toLowerCase();\n}\n\nexport { jsonFormat } from \"./json.js\";\nexport { tomlFormat } from \"./toml.js\";\n", "import path from \"node:path\";\nimport type { PathMapper } from \"../types.js\";\n\n/**\n * Expand ~ shortcut to the provided home directory.\n */\nexport function expandHome(targetPath: string, homeDir: string): string {\n if (!targetPath?.startsWith(\"~\")) {\n return targetPath;\n }\n\n // Handle ~./ -> ~/.\n if (targetPath.startsWith(\"~./\")) {\n targetPath = `~/.${targetPath.slice(3)}`;\n }\n\n let remainder = targetPath.slice(1);\n\n // Remove leading slash or backslash\n if (remainder.startsWith(\"/\") || remainder.startsWith(\"\\\\\")) {\n remainder = remainder.slice(1);\n } else if (remainder.startsWith(\".\")) {\n // Handle ~/.\n remainder = remainder.slice(1);\n if (remainder.startsWith(\"/\") || remainder.startsWith(\"\\\\\")) {\n remainder = remainder.slice(1);\n }\n }\n\n return remainder.length === 0 ? homeDir : path.join(homeDir, remainder);\n}\n\n/**\n * Validate that a path is home-relative (starts with ~).\n * Throws if the path is not home-relative.\n */\nexport function validateHomePath(targetPath: string): void {\n if (typeof targetPath !== \"string\" || targetPath.length === 0) {\n throw new Error(\"Target path must be a non-empty string.\");\n }\n\n if (!targetPath.startsWith(\"~\")) {\n throw new Error(\n `All target paths must be home-relative (start with ~). Received: \"${targetPath}\"`\n );\n }\n}\n\n/**\n * Resolve a path with optional path mapping for isolated configurations.\n * 1. Validates the path starts with ~\n * 2. Expands ~ to home directory\n * 3. If pathMapper is provided, maps the directory portion and reconstructs the path\n */\nexport function resolvePath(\n rawPath: string,\n homeDir: string,\n pathMapper?: PathMapper\n): string {\n validateHomePath(rawPath);\n const expanded = expandHome(rawPath, homeDir);\n\n if (!pathMapper) {\n return expanded;\n }\n\n // Map the directory portion\n const rawDirectory = path.dirname(expanded);\n const mappedDirectory = pathMapper.mapTargetDirectory({\n targetDirectory: rawDirectory\n });\n const filename = path.basename(expanded);\n\n return filename.length === 0 ? mappedDirectory : path.join(mappedDirectory, filename);\n}\n", "import type { FileSystem } from \"./types.js\";\n\n/**\n * Check if an error is a \"file not found\" (ENOENT) error.\n */\nexport function isNotFound(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error as { code?: string }).code === \"ENOENT\"\n );\n}\n\n/**\n * Read a file if it exists, returning null if not found.\n */\nexport async function readFileIfExists(\n fs: FileSystem,\n target: string\n): Promise<string | null> {\n try {\n return await fs.readFile(target, \"utf8\");\n } catch (error) {\n if (isNotFound(error)) {\n return null;\n }\n throw error;\n }\n}\n\n/**\n * Check if a path exists (file or directory).\n */\nexport async function pathExists(\n fs: FileSystem,\n target: string\n): Promise<boolean> {\n try {\n await fs.stat(target);\n return true;\n } catch (error) {\n if (isNotFound(error)) {\n return false;\n }\n throw error;\n }\n}\n\n/**\n * Create an ISO timestamp safe for use in filenames.\n * Replaces colons and dots with dashes.\n */\nexport function createTimestamp(): string {\n return new Date().toISOString().replaceAll(\":\", \"-\").replaceAll(\".\", \"-\");\n}\n", "import type {\n Mutation,\n MutationContext,\n MutationResult,\n MutationOptions\n} from \"../types.js\";\nimport { applyMutation } from \"./apply-mutation.js\";\n\n/**\n * Execute an array of mutations in order.\n *\n * All dependencies must be injected - no defaults, no globals.\n */\nexport async function runMutations(\n mutations: Mutation[],\n context: MutationContext,\n options?: MutationOptions\n): Promise<MutationResult> {\n const effects: MutationResult[\"effects\"] = [];\n let anyChanged = false;\n const resolverOptions = options ?? {};\n\n for (const mutation of mutations) {\n const { outcome } = await executeMutation(\n mutation,\n context,\n resolverOptions\n );\n effects.push(outcome);\n if (outcome.changed) {\n anyChanged = true;\n }\n }\n\n return {\n changed: anyChanged,\n effects\n };\n}\n\nasync function executeMutation(\n mutation: Mutation,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationResult[\"effects\"][number]; details: { kind: string; label: string; targetPath?: string } }> {\n // Call onStart observer\n context.observers?.onStart?.({\n kind: mutation.kind,\n label: mutation.label ?? mutation.kind,\n targetPath: undefined // Will be resolved during apply\n });\n\n try {\n const { outcome, details } = await applyMutation(mutation, context, options);\n\n // Call onComplete observer\n context.observers?.onComplete?.(details, outcome);\n\n return { outcome, details };\n } catch (error) {\n // Call onError observer\n context.observers?.onError?.(\n {\n kind: mutation.kind,\n label: mutation.label ?? mutation.kind,\n targetPath: undefined\n },\n error\n );\n\n // Re-throw the error\n throw error;\n }\n}\n", "import Mustache from \"mustache\";\n\nexport type TemplateVariables = Record<string, string | number | boolean | string[]>;\n\n// Disable HTML escaping - we're rendering prompts, not HTML\nconst originalEscape = Mustache.escape;\n\n/**\n * Render a mustache template with the given variables.\n * Arrays are automatically joined with newlines.\n * HTML escaping is disabled.\n */\nexport function renderTemplate(\n template: string,\n variables: TemplateVariables\n): string {\n // Pre-process variables to handle arrays\n const processed: Record<string, string | number | boolean> = {};\n for (const [key, value] of Object.entries(variables)) {\n if (Array.isArray(value)) {\n processed[key] = value.join(\"\\n\");\n } else {\n processed[key] = value;\n }\n }\n\n // Temporarily disable HTML escaping\n Mustache.escape = (text: string) => text;\n try {\n return Mustache.render(template, processed);\n } finally {\n Mustache.escape = originalEscape;\n }\n}\n", "import type {\n CommandRunner,\n CommandCheckContext,\n CommandCheck\n} from \"../utils/command-checks.js\";\n\nexport interface InstallContext {\n isDryRun: boolean;\n runCommand: CommandRunner;\n logger: (message: string) => void;\n platform: NodeJS.Platform;\n}\n\nexport interface InstallCommand {\n id: string;\n command: string;\n args: string[];\n platforms?: NodeJS.Platform[];\n}\n\nexport interface ServiceInstallDefinition {\n id: string;\n summary: string;\n check: CommandCheck;\n steps: InstallCommand[];\n postChecks?: CommandCheck[];\n successMessage?: string;\n}\n\nexport async function runServiceInstall(\n definition: ServiceInstallDefinition,\n context: InstallContext\n): Promise<boolean> {\n const checkContext: CommandCheckContext = {\n isDryRun: context.isDryRun,\n runCommand: context.runCommand\n };\n\n let needsInstall = false;\n try {\n await definition.check.run(checkContext);\n context.logger(`${definition.summary} already installed.`);\n } catch (error) {\n const detail =\n error instanceof Error ? error.message : String(error);\n context.logger(`${definition.summary} not detected: ${detail}`);\n needsInstall = true;\n }\n\n if (!needsInstall) {\n return false;\n }\n\n if (context.isDryRun) {\n logInstallDryRun(definition, context);\n return true;\n }\n\n const platformSteps = filterStepsByPlatform(definition.steps, context.platform);\n for (const step of platformSteps) {\n await runInstallStep(step, context);\n }\n\n await definition.check.run(checkContext);\n\n if (definition.postChecks) {\n for (const postCheck of definition.postChecks) {\n await postCheck.run(checkContext);\n }\n }\n\n context.logger(\n definition.successMessage ?? `${definition.summary} installed.`\n );\n return true;\n}\n\nfunction describeInstallCommand(step: InstallCommand): string {\n return `[${step.id}] ${formatCommand(step.command, step.args)}`;\n}\n\nfunction formatCommand(command: string, args: string[]): string {\n return [command, ...args.map(quoteIfNeeded)].join(\" \");\n}\n\nfunction quoteIfNeeded(value: string): string {\n if (value.length === 0) {\n return '\"\"';\n }\n if (value.includes(\" \") || value.includes(\"\\t\") || value.includes(\"\\n\")) {\n return `\"${value.replaceAll('\"', '\\\\\"')}\"`;\n }\n return value;\n}\n\nfunction filterStepsByPlatform(\n steps: InstallCommand[],\n platform: NodeJS.Platform\n): InstallCommand[] {\n return steps.filter(\n (step) => !step.platforms || step.platforms.includes(platform)\n );\n}\n\nfunction logInstallDryRun(\n definition: ServiceInstallDefinition,\n context: InstallContext\n): void {\n context.logger(`Dry run: would install ${definition.summary}.`);\n const platformSteps = filterStepsByPlatform(definition.steps, context.platform);\n for (const step of platformSteps) {\n context.logger(`Dry run: ${describeInstallCommand(step)}`);\n }\n}\n\nasync function runInstallStep(\n step: InstallCommand,\n context: InstallContext\n): Promise<void> {\n context.logger(`Running ${describeInstallCommand(step)}`);\n const result = await context.runCommand(step.command, step.args);\n if (result.exitCode !== 0) {\n const stderr = result.stderr.trim();\n const suffix = stderr.length > 0 ? `: ${stderr}` : \"\";\n throw new Error(\n `${describeInstallCommand(step)} failed with exit code ${result.exitCode}${suffix}`\n );\n }\n}\n", "import type {\n ProviderService,\n ProviderContext,\n ProviderBranding,\n ProviderConfigurePrompts,\n ProviderIsolatedEnv\n} from \"../cli/service-registry.js\";\nimport {\n runMutations,\n type Mutation,\n type MutationObservers\n} from \"@poe-code/config-mutations\";\nimport {\n runServiceInstall,\n type ServiceInstallDefinition\n} from \"../services/service-install.js\";\n// Template imports are lazy to avoid breaking tsc output when imported\n// by generate-bin-wrappers.mjs (Node.js can't resolve .hbs as ESM modules)\nconst templateImports: Record<string, () => Promise<{ default: string }>> = {\n \"python/env.hbs\": () => import(\"../templates/python/env.hbs\"),\n \"python/main.py.hbs\": () => import(\"../templates/python/main.py.hbs\"),\n \"python/requirements.txt.hbs\": () => import(\"../templates/python/requirements.txt.hbs\"),\n \"codex/config.toml.hbs\": () => import(\"../templates/codex/config.toml.hbs\"),\n};\n\nasync function loadTemplate(templateId: string): Promise<string> {\n const loader = templateImports[templateId];\n if (!loader) {\n throw new Error(`Template not found: ${templateId}`);\n }\n const module = await loader();\n return module.default;\n}\n\ninterface ManifestVersionDefinition {\n configure: Mutation[];\n unconfigure?: Mutation[];\n}\n\nexport interface ServiceRunOptions {\n observers?: MutationObservers;\n}\n\ninterface CreateProviderOptions<\n ConfigureOptions,\n UnconfigureOptions,\n SpawnOptions\n> {\n name: string;\n aliases?: string[];\n label: string;\n id: string;\n summary: string;\n branding?: ProviderBranding;\n disabled?: boolean;\n supportsStdinPrompt?: boolean;\n configurePrompts?: ProviderConfigurePrompts;\n postConfigureMessages?: string[];\n isolatedEnv?: ProviderIsolatedEnv;\n manifest: ManifestVersionDefinition;\n install?: ServiceInstallDefinition;\n test?: ProviderService<ConfigureOptions, UnconfigureOptions, SpawnOptions>[\"test\"];\n spawn?: ProviderService<\n ConfigureOptions,\n UnconfigureOptions,\n SpawnOptions\n >[\"spawn\"];\n}\n\nexport function createProvider<\n ConfigureOptions = any,\n UnconfigureOptions = ConfigureOptions,\n SpawnOptions = any\n>(\n opts: CreateProviderOptions<ConfigureOptions, UnconfigureOptions, SpawnOptions>\n): ProviderService<ConfigureOptions, UnconfigureOptions, SpawnOptions> {\n const provider: ProviderService<\n ConfigureOptions,\n UnconfigureOptions,\n SpawnOptions\n > = {\n id: opts.id,\n summary: opts.summary,\n name: opts.name,\n aliases: opts.aliases,\n label: opts.label,\n branding: opts.branding,\n disabled: opts.disabled,\n supportsStdinPrompt: opts.supportsStdinPrompt,\n configurePrompts: opts.configurePrompts,\n postConfigureMessages: opts.postConfigureMessages,\n isolatedEnv: opts.isolatedEnv,\n async configure(context, runOptions) {\n await runMutations(opts.manifest.configure, {\n fs: context.fs,\n homeDir: context.env.homeDir,\n observers: runOptions?.observers,\n templates: loadTemplate,\n pathMapper: context.pathMapper\n }, context.options as Record<string, unknown>);\n context.command.flushDryRun({ emitIfEmpty: false });\n },\n async unconfigure(context, runOptions) {\n if (!opts.manifest.unconfigure) {\n return false;\n }\n const result = await runMutations(opts.manifest.unconfigure, {\n fs: context.fs,\n homeDir: context.env.homeDir,\n observers: runOptions?.observers,\n templates: loadTemplate,\n pathMapper: context.pathMapper\n }, context.options as Record<string, unknown>);\n context.command.flushDryRun({ emitIfEmpty: false });\n return result.changed;\n }\n };\n\n if (opts.install) {\n provider.install = createInstallRunner(opts.install);\n }\n\n if (opts.test) {\n provider.test = opts.test;\n }\n\n if (opts.spawn) {\n provider.spawn = opts.spawn;\n }\n\n return provider;\n}\n\nfunction createInstallRunner(definition: ServiceInstallDefinition) {\n return async (context: ProviderContext): Promise<void> => {\n await runServiceInstall(definition, {\n isDryRun: context.logger.context.dryRun,\n runCommand: context.command.runCommand,\n logger: (message) => context.logger.verbose(message),\n platform: context.env.platform\n });\n };\n}\n", "import {\n DEFAULT_FRONTIER_MODEL,\n FRONTIER_MODELS,\n PROVIDER_NAME\n} from \"../cli/constants.js\";\nimport {\n createBinaryExistsCheck,\n createSpawnHealthCheck\n} from \"../utils/command-checks.js\";\nimport { type ServiceInstallDefinition } from \"../services/service-install.js\";\nimport {\n configMutation,\n fileMutation\n} from \"@poe-code/config-mutations\";\nimport { createProvider } from \"./create-provider.js\";\nimport type { ProviderSpawnOptions } from \"./spawn-options.js\";\nimport { openCodeAgent } from \"@poe-code/agent-defs\";\n\nfunction providerModel(model?: string): string {\n const value = model ?? DEFAULT_FRONTIER_MODEL;\n const prefix = `${PROVIDER_NAME}/`;\n return value.startsWith(prefix) ? value : `${prefix}${value}`;\n}\n\nexport const OPEN_CODE_INSTALL_DEFINITION: ServiceInstallDefinition = {\n id: \"opencode\",\n summary: \"OpenCode CLI\",\n check: createBinaryExistsCheck(\n \"opencode\",\n \"opencode-cli-binary\",\n \"OpenCode CLI binary must exist\"\n ),\n steps: [\n {\n id: \"install-opencode-cli-npm\",\n command: \"npm\",\n args: [\"install\", \"-g\", \"opencode-ai\"]\n }\n ],\n successMessage: \"Installed OpenCode CLI via npm.\"\n};\n\nfunction getModelArgs(model?: string): string[] {\n return [\"--model\", providerModel(model)];\n}\n\nexport const openCodeService = createProvider({\n ...openCodeAgent,\n supportsStdinPrompt: false,\n configurePrompts: {\n model: {\n label: \"OpenCode model\",\n defaultValue: DEFAULT_FRONTIER_MODEL,\n choices: FRONTIER_MODELS.map((id) => ({\n title: id,\n value: id\n }))\n }\n },\n isolatedEnv: {\n agentBinary: openCodeAgent.binaryName!,\n configProbe: {\n kind: \"isolatedFile\",\n relativePath: \".config/opencode/config.json\"\n },\n env: {\n XDG_CONFIG_HOME: { kind: \"isolatedDir\", relativePath: \".config\" },\n XDG_DATA_HOME: { kind: \"isolatedDir\", relativePath: \".local/share\" }\n }\n },\n manifest: {\n configure: [\n fileMutation.ensureDirectory({ path: \"~/.config/opencode\" }),\n configMutation.merge({\n target: \"~/.config/opencode/config.json\",\n value: (ctx) => {\n const { model } = (ctx ?? {}) as { model?: string };\n return {\n $schema: \"https://opencode.ai/config.json\",\n model: providerModel(model),\n enabled_providers: [PROVIDER_NAME]\n };\n }\n }),\n fileMutation.ensureDirectory({ path: \"~/.local/share/opencode\" }),\n configMutation.merge({\n target: \"~/.local/share/opencode/auth.json\",\n value: (ctx) => {\n const { apiKey } = (ctx ?? {}) as { apiKey?: string };\n return {\n [PROVIDER_NAME]: {\n type: \"api\",\n key: apiKey ?? \"\"\n }\n };\n }\n })\n ],\n unconfigure: [\n configMutation.prune({\n target: \"~/.config/opencode/config.json\",\n shape: { enabled_providers: true }\n }),\n configMutation.prune({\n target: \"~/.local/share/opencode/auth.json\",\n shape: { [PROVIDER_NAME]: true }\n })\n ]\n },\n install: OPEN_CODE_INSTALL_DEFINITION,\n test(context) {\n return context.runCheck(\n createSpawnHealthCheck(\"opencode\", {\n model: context.model,\n expectedOutput: \"OPEN_CODE_OK\"\n })\n );\n },\n spawn(context, options) {\n const opts = (options ?? {}) as ProviderSpawnOptions;\n const args = [\n ...getModelArgs(opts.model),\n \"run\",\n opts.prompt,\n ...(opts.args ?? [])\n ];\n if (opts.cwd) {\n return context.command.runCommand(\"poe-code\", [\"wrap\", \"opencode\", ...args], {\n cwd: opts.cwd\n });\n }\n return context.command.runCommand(\"poe-code\", [\"wrap\", \"opencode\", ...args]);\n }\n});\n\nexport const provider = openCodeService;\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["POE_API_KEY={{apiKey}}\nPOE_BASE_URL=https://api.poe.com/v1\nMODEL={{model}}\n", "import os\nfrom openai import OpenAI\nfrom dotenv import load_dotenv\n\nload_dotenv()\n\nclient = OpenAI(\n api_key=os.getenv(\"POE_API_KEY\"),\n base_url=os.getenv(\"POE_BASE_URL\")\n)\n\nresponse = client.chat.completions.create(\n model=os.getenv(\"MODEL\", \"{{model}}\"),\n messages=[{\"role\": \"user\", \"content\": \"Tell me a joke\"}]\n)\n\nprint(response.choices[0].message.content)\n", "openai>=1.0.0\npython-dotenv>=1.0.0\n", "model_provider = \"poe\"\nmodel = \"{{{model}}}\"\nmodel_reasoning_effort = \"{{reasoningEffort}}\"\nmodel_verbosity = \"medium\"\n\n[model_providers.poe]\nname = \"poe\"\nbase_url = \"{{{baseUrl}}}\"\nwire_api = \"responses\"\nexperimental_bearer_token = \"{{apiKey}}\"\n", "export const FRONTIER_MODELS = [\n \"anthropic/claude-opus-4.6\",\n \"anthropic/claude-sonnet-4.6\",\n \"openai/gpt-5.3-codex\",\n \"openai/gpt-5.2\",\n \"google/gemini-3-pro\"\n] as const;\n\nexport const DEFAULT_FRONTIER_MODEL = \"anthropic/claude-sonnet-4.6\";\n\nexport const DEFAULT_TEXT_MODEL = \"anthropic/claude-sonnet-4.6\";\nexport const DEFAULT_IMAGE_BOT = \"google/nano-banana-pro\";\nexport const DEFAULT_AUDIO_BOT = \"elevenlabs/elevenlabs-v3\";\nexport const DEFAULT_VIDEO_BOT = \"google/veo-3.1\";\n\nexport const CLAUDE_CODE_VARIANTS = {\n haiku: \"anthropic/claude-haiku-4.5\",\n sonnet: \"anthropic/claude-sonnet-4.6\",\n opus: \"anthropic/claude-opus-4.6\"\n} as const;\n\nexport const DEFAULT_CLAUDE_CODE_MODEL = CLAUDE_CODE_VARIANTS.sonnet;\n\n/**\n * Extracts the model ID from a namespaced model slug (lowercase).\n * e.g., \"anthropic/claude-sonnet-4.6\" -> \"claude-sonnet-4.6\"\n */\nexport function stripModelNamespace(model: string): string {\n const slashIndex = model.indexOf(\"/\");\n const id = slashIndex === -1 ? model : model.slice(slashIndex + 1);\n return id.toLowerCase();\n}\n\nexport const CODEX_MODELS = [\n \"openai/gpt-5.3-codex\",\n \"openai/gpt-5.2-codex\",\n \"openai/gpt-5.2\",\n \"openai/gpt-5.2-chat\",\n \"openai/gpt-5.2-pro\",\n \"openai/gpt-5.1\",\n \"openai/gpt-5.1-codex-mini\"\n] as const;\nexport const DEFAULT_CODEX_MODEL = CODEX_MODELS[0];\n\nexport const KIMI_MODELS = [\n \"novitaai/kimi-k2.5\",\n \"novitaai/kimi-k2-thinking\",\n] as const;\nexport const DEFAULT_KIMI_MODEL = KIMI_MODELS[0];\n\nexport const DEFAULT_REASONING = \"medium\";\nexport const PROVIDER_NAME = \"poe\";\nexport const FEEDBACK_URL = \"https://github.com/poe-platform/poe-code/issues\";\n", "import { spawn } from \"node:child_process\";\n\nexport interface CommandRunnerResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\nexport interface CommandRunnerOptions {\n cwd?: string;\n env?: Record<string, string | undefined>;\n stdin?: string | Buffer;\n}\n\nexport type CommandRunner = (\n command: string,\n args: string[],\n options?: CommandRunnerOptions\n) => Promise<CommandRunnerResult>;\n\nexport function runCommand(\n command: string,\n args: string[],\n options?: CommandRunnerOptions\n): Promise<CommandRunnerResult> {\n return new Promise((resolve) => {\n const hasStdin = options?.stdin != null;\n const child = spawn(command, args, {\n stdio: [hasStdin ? \"pipe\" : \"ignore\", \"pipe\", \"pipe\"],\n cwd: options?.cwd,\n env: options?.env\n ? {\n ...(process.env as Record<string, string | undefined>),\n ...options.env\n }\n : undefined\n });\n let stdout = \"\";\n let stderr = \"\";\n\n if (hasStdin && child.stdin) {\n child.stdin.on(\"error\", () => {});\n child.stdin.end(options!.stdin);\n }\n\n child.stdout?.setEncoding(\"utf8\");\n child.stdout?.on(\"data\", (chunk: string | Buffer) => {\n stdout += chunk.toString();\n });\n\n child.stderr?.setEncoding(\"utf8\");\n child.stderr?.on(\"data\", (chunk: string | Buffer) => {\n stderr += chunk.toString();\n });\n\n child.on(\"error\", (error: NodeJS.ErrnoException) => {\n const exitCode =\n typeof error.code === \"number\"\n ? error.code\n : typeof error.errno === \"number\"\n ? error.errno\n : 127;\n const message =\n error instanceof Error ? error.message : String(error ?? \"error\");\n resolve({\n stdout,\n stderr: stderr ? `${stderr}${message}` : message,\n exitCode\n });\n });\n\n child.on(\"close\", (code) => {\n resolve({\n stdout,\n stderr,\n exitCode: code ?? 0\n });\n });\n });\n}\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const claudeCodeAgent: AgentDefinition = {\n id: \"claude-code\",\n name: \"claude-code\",\n label: \"Claude Code\",\n summary: \"Configure Claude Code to route through Poe.\",\n aliases: [\"claude\"],\n binaryName: \"claude\",\n configPath: \"~/.claude/settings.json\",\n branding: {\n colors: {\n dark: \"#C15F3C\",\n light: \"#C15F3C\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const claudeDesktopAgent: AgentDefinition = {\n id: \"claude-desktop\",\n name: \"claude-desktop\",\n label: \"Claude Desktop\",\n summary: \"Anthropic's official desktop application for Claude\",\n configPath: \"~/.claude/settings.json\",\n branding: {\n colors: {\n dark: \"#D97757\",\n light: \"#D97757\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const codexAgent: AgentDefinition = {\n id: \"codex\",\n name: \"codex\",\n label: \"Codex\",\n summary: \"Configure Codex to use Poe as the model provider.\",\n binaryName: \"codex\",\n configPath: \"~/.codex/config.toml\",\n branding: {\n colors: {\n dark: \"#D5D9DF\",\n light: \"#7A7F86\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const openCodeAgent: AgentDefinition = {\n id: \"opencode\",\n name: \"opencode\",\n label: \"OpenCode CLI\",\n summary: \"Configure OpenCode CLI to use the Poe API.\",\n binaryName: \"opencode\",\n configPath: \"~/.config/opencode/config.json\",\n branding: {\n colors: {\n dark: \"#4A4F55\",\n light: \"#2F3338\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const kimiAgent: AgentDefinition = {\n id: \"kimi\",\n name: \"kimi\",\n label: \"Kimi\",\n summary: \"Configure Kimi CLI to use Poe API\",\n aliases: [\"kimi-cli\"],\n binaryName: \"kimi\",\n configPath: \"~/.kimi/config.toml\",\n branding: {\n colors: {\n dark: \"#7B68EE\",\n light: \"#6A5ACD\"\n }\n }\n};\n", "import type { AgentDefinition } from \"./types.js\";\nimport {\n claudeCodeAgent,\n claudeDesktopAgent,\n codexAgent,\n openCodeAgent,\n kimiAgent\n} from \"./agents/index.js\";\n\nexport const allAgents: AgentDefinition[] = [\n claudeCodeAgent,\n claudeDesktopAgent,\n codexAgent,\n openCodeAgent,\n kimiAgent\n];\n\nconst lookup = new Map<string, string>();\n\nfor (const agent of allAgents) {\n const values = [agent.id, agent.name, ...(agent.aliases ?? [])];\n for (const value of values) {\n const normalized = value.toLowerCase();\n if (!lookup.has(normalized)) {\n lookup.set(normalized, agent.id);\n }\n }\n}\n\nexport function resolveAgentId(input: string): string | undefined {\n if (!input) {\n return undefined;\n }\n return lookup.get(input.toLowerCase());\n}\n", "import type { McpSpawnConfig } from \"../types.js\";\n\ninterface JsonMcpServer {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n}\n\nfunction toJsonMcpServers(servers: McpSpawnConfig): Record<string, JsonMcpServer> {\n const out: Record<string, JsonMcpServer> = {};\n\n for (const [name, server] of Object.entries(servers)) {\n const mapped: JsonMcpServer = { command: server.command };\n if (server.args && server.args.length > 0) {\n mapped.args = server.args;\n }\n if (server.env && Object.keys(server.env).length > 0) {\n mapped.env = server.env;\n }\n out[name] = mapped;\n }\n\n return out;\n}\n\nfunction toTomlString(value: string): string {\n return JSON.stringify(value);\n}\n\nfunction toTomlArray(values: string[]): string {\n const serialized = values.map((value) => toTomlString(value));\n return `[${serialized.join(\", \")}]`;\n}\n\nfunction toTomlInlineTable(values: Record<string, string>): string {\n const parts: string[] = [];\n for (const [key, value] of Object.entries(values)) {\n parts.push(`${JSON.stringify(key)}=${toTomlString(value)}`);\n }\n return `{${parts.join(\", \")}}`;\n}\n\nexport function serializeJsonMcpArgs(servers: McpSpawnConfig): string[] {\n return [\"--mcp-config\", JSON.stringify({ mcpServers: toJsonMcpServers(servers) })];\n}\n\nexport function serializeCodexMcpArgs(servers: McpSpawnConfig): string[] {\n const args: string[] = [];\n\n for (const [name, server] of Object.entries(servers)) {\n const prefix = `mcp_servers.${name}`;\n args.push(\"-c\", `${prefix}.command=${toTomlString(server.command)}`);\n\n if (server.args && server.args.length > 0) {\n args.push(\"-c\", `${prefix}.args=${toTomlArray(server.args)}`);\n }\n\n if (server.env && Object.keys(server.env).length > 0) {\n args.push(\"-c\", `${prefix}.env=${toTomlInlineTable(server.env)}`);\n }\n }\n\n return args;\n}\n", "import type { CliSpawnConfig } from \"../types.js\";\nimport { serializeJsonMcpArgs } from \"./mcp.js\";\n\nexport const claudeCodeSpawnConfig: CliSpawnConfig = {\n kind: \"cli\",\n agentId: \"claude-code\",\n // ACP adapter support: yes (adapter: \"claude\")\n adapter: \"claude\",\n promptFlag: \"-p\",\n modelFlag: \"--model\",\n modelStripProviderPrefix: true,\n modelTransform: (model) => model.replaceAll(\".\", \"-\"),\n defaultArgs: [\n \"--output-format\",\n \"stream-json\",\n \"--verbose\"\n ],\n mcpArgs: serializeJsonMcpArgs,\n modes: {\n yolo: [\"--dangerously-skip-permissions\"],\n edit: [\"--permission-mode\", \"acceptEdits\", \"--allowedTools\", \"Bash,Read,Write,Edit,Glob,Grep,NotebookEdit\"],\n read: [\"--permission-mode\", \"plan\"]\n },\n stdinMode: {\n omitPrompt: true,\n extraArgs: [\"--input-format\", \"text\"]\n },\n interactive: {\n defaultArgs: []\n },\n resumeCommand: (threadId) => [\"--resume\", threadId]\n};\n", "import type { CliSpawnConfig } from \"../types.js\";\nimport { serializeCodexMcpArgs } from \"./mcp.js\";\n\nexport const codexSpawnConfig: CliSpawnConfig = {\n kind: \"cli\",\n agentId: \"codex\",\n // ACP adapter support: yes (adapter: \"codex\")\n adapter: \"codex\",\n promptFlag: \"exec\",\n modelFlag: \"--model\",\n modelStripProviderPrefix: true,\n defaultArgs: [\"--skip-git-repo-check\", \"--json\"],\n mcpArgs: serializeCodexMcpArgs,\n modes: {\n yolo: [\"-s\", \"danger-full-access\"],\n edit: [\"-s\", \"workspace-write\"],\n read: [\"-s\", \"read-only\"]\n },\n stdinMode: {\n omitPrompt: true,\n extraArgs: [\"-\"]\n },\n interactive: {\n defaultArgs: [\"-a\", \"never\"]\n },\n resumeCommand: (threadId, cwd) => [\"resume\", \"-C\", cwd, threadId]\n};\n", "import type { CliSpawnConfig } from \"../types.js\";\n\n/**\n * OpenCode JSON output format (empirically observed)\n *\n * OpenCode can emit \"raw JSON events\" when running a prompt via:\n * - `opencode run \"<prompt>\" --format json ...`\n *\n * Key observations (OpenCode CLI v1.1.47):\n * - Output is **NDJSON / line-delimited JSON**: one JSON object per stdout line.\n * - Each line is an event object with a top-level `type` string (NOT ACP's `{ event: ... }`).\n * - Common top-level fields:\n * - `type`: `\"step_start\" | \"text\" | \"tool_use\" | \"step_finish\" | ...`\n * - `timestamp`: number (ms since epoch)\n * - `sessionID`: string (e.g. `\"ses_...\"`)\n * - `part`: object with event-specific payload\n *\n * `text` events:\n * ```ts\n * {\n * type: \"text\",\n * sessionID: \"ses_...\",\n * part: {\n * type: \"text\",\n * messageID: \"msg_...\",\n * text: \"Hello ...\",\n * time: { start: 1770000000000, end: 1770000000000 }\n * }\n * }\n * ```\n *\n * Tool calls (`tool_use`):\n * - Represented as a single event with `part.type: \"tool\"` and `state.status`.\n * - `state.input` includes tool arguments; `state.output` is the tool result string.\n * ```ts\n * {\n * type: \"tool_use\",\n * sessionID: \"ses_...\",\n * part: {\n * type: \"tool\",\n * callID: \"call_...\",\n * tool: \"bash\",\n * state: {\n * status: \"completed\",\n * input: { command: \"echo hello\", description: \"...\" },\n * output: \"hello\\n\"\n * }\n * }\n * }\n * ```\n *\n * Step boundaries:\n * - `step_start` and `step_finish` wrap a single model/tool turn.\n * - `step_finish.part.tokens` contains token accounting:\n * `{ input, output, reasoning, cache: { read, write } }`\n *\n * Negative cases / gotchas:\n * - Some failures (e.g. invalid `--model` / unknown provider) can print a non-JSON stack trace\n * before any JSON events are emitted, even with `--format json`.\n * - If `--format json` is ever removed upstream, OpenCode will need a text-mode fallback\n * (no streaming event adapter).\n */\nexport const openCodeSpawnConfig: CliSpawnConfig = {\n kind: \"cli\",\n agentId: \"opencode\",\n // ACP adapter support: yes (adapter: \"opencode\").\n // OpenCode's `--format json` emits NDJSON events with `{ type, sessionID, part }`\n // (no `{ event, ... }` field), so it needs the OpenCode adapter (not \"native\").\n adapter: \"opencode\",\n promptFlag: \"run\",\n modelFlag: \"--model\",\n modelStripProviderPrefix: false,\n modelTransform: (model) => {\n return model.startsWith(\"poe/\") ? model : `poe/${model}`;\n },\n defaultArgs: [\"--format\", \"json\"],\n modes: {\n yolo: [],\n edit: [],\n read: [\"--agent\", \"plan\"]\n },\n interactive: {\n defaultArgs: [],\n promptFlag: \"--prompt\"\n },\n resumeCommand: (threadId, cwd) => [cwd, \"--session\", threadId]\n};\n", "import type { CliSpawnConfig } from \"../types.js\";\nimport { serializeJsonMcpArgs } from \"./mcp.js\";\n\nexport const kimiSpawnConfig: CliSpawnConfig = {\n kind: \"cli\",\n agentId: \"kimi\",\n // ACP adapter support: yes (adapter: \"kimi\").\n // Kimi's `--output-format stream-json` emits OpenAI-style `{ role, content }` JSON\n // (no `{ event, ... }` field), so it needs the Kimi adapter (not \"native\").\n adapter: \"kimi\",\n promptFlag: \"-p\",\n modelStripProviderPrefix: true,\n defaultArgs: [\"--print\", \"--output-format\", \"stream-json\"],\n mcpArgs: serializeJsonMcpArgs,\n modes: {\n yolo: [\"--yolo\"],\n edit: [],\n read: []\n },\n stdinMode: {\n omitPrompt: true,\n extraArgs: [\"--input-format\", \"stream-json\"]\n },\n interactive: {\n defaultArgs: [],\n promptFlag: \"-p\"\n },\n resumeCommand: (threadId, cwd) => [\"--session\", threadId, \"--work-dir\", cwd]\n};\n", "import { resolveAgentId } from \"@poe-code/agent-defs\";\nimport type { SpawnConfig } from \"../types.js\";\nimport { claudeCodeSpawnConfig } from \"./claude-code.js\";\nimport { codexSpawnConfig } from \"./codex.js\";\nimport { openCodeSpawnConfig } from \"./opencode.js\";\nimport { kimiSpawnConfig } from \"./kimi.js\";\n\n// ACP adapter support (spawn streaming):\n// - Supported (has `adapter`): claude-code, codex, opencode, kimi\nexport const allSpawnConfigs: readonly SpawnConfig[] = [\n claudeCodeSpawnConfig,\n codexSpawnConfig,\n openCodeSpawnConfig,\n kimiSpawnConfig\n];\n\nconst lookup = new Map<string, SpawnConfig>();\n\nfor (const config of allSpawnConfigs) {\n lookup.set(config.agentId, config);\n}\n\nexport function getSpawnConfig(input: string): SpawnConfig | undefined {\n const resolvedId = resolveAgentId(input);\n if (!resolvedId) {\n return undefined;\n }\n return lookup.get(resolvedId);\n}\n\nexport function supportsMcpAtSpawn(input: string): boolean {\n const config = getSpawnConfig(input);\n return (\n !!config &&\n config.kind === \"cli\" &&\n typeof config.mcpArgs === \"function\"\n );\n}\n\nexport function listMcpSupportedAgents(): string[] {\n const supported: string[] = [];\n\n for (const config of allSpawnConfigs) {\n if (config.kind !== \"cli\" || typeof config.mcpArgs !== \"function\") {\n continue;\n }\n supported.push(config.agentId);\n }\n\n return supported;\n}\n", "import { spawn as spawnChildProcess } from \"node:child_process\";\nimport { resolveConfig } from \"./configs/resolve-config.js\";\nimport { getMcpArgs } from \"./mcp-args.js\";\nimport { stripModelNamespace } from \"./model-utils.js\";\nimport type {\n CliSpawnConfig,\n McpSpawnConfig,\n SpawnContext,\n SpawnMode,\n SpawnOptions,\n SpawnResult,\n StdinMode\n} from \"./types.js\";\n\nexport interface BuildSpawnArgsOptions {\n prompt: string;\n model?: string;\n mode?: SpawnMode;\n args?: string[];\n mcpServers?: McpSpawnConfig;\n useStdin?: boolean;\n}\n\nexport interface BuildSpawnArgsResult {\n binaryName: string;\n args: string[];\n}\n\nfunction resolveCliConfig(agentId: string) {\n const resolved = resolveConfig(agentId);\n\n if (!resolved.spawnConfig) {\n throw new Error(`Agent \"${resolved.agentId}\" has no spawn config.`);\n }\n\n if (resolved.spawnConfig.kind !== \"cli\") {\n throw new Error(`Agent \"${resolved.agentId}\" does not support CLI spawn.`);\n }\n\n if (!resolved.binaryName) {\n throw new Error(`Agent \"${resolved.agentId}\" has no binaryName.`);\n }\n\n return {\n agentId: resolved.agentId,\n binaryName: resolved.binaryName,\n spawnConfig: resolved.spawnConfig\n };\n}\n\nfunction buildCliArgs(\n config: CliSpawnConfig,\n options: BuildSpawnArgsOptions,\n stdinMode?: StdinMode\n): string[] {\n const args: string[] = stdinMode\n ? [\n config.promptFlag,\n ...(stdinMode.omitPrompt ? [] : [options.prompt]),\n ...stdinMode.extraArgs\n ]\n : [config.promptFlag, options.prompt];\n\n if (options.model && config.modelFlag) {\n let model = config.modelStripProviderPrefix\n ? stripModelNamespace(options.model)\n : options.model;\n if (config.modelTransform) model = config.modelTransform(model);\n args.push(config.modelFlag, model);\n }\n\n args.push(...config.defaultArgs);\n args.push(...getMcpArgs(config, options.mcpServers));\n args.push(...config.modes[options.mode ?? \"yolo\"]);\n\n if (options.args && options.args.length > 0) {\n args.push(...options.args);\n }\n\n return args;\n}\n\nexport function buildSpawnArgs(\n agentId: string,\n options: BuildSpawnArgsOptions\n): BuildSpawnArgsResult {\n const { binaryName, spawnConfig } = resolveCliConfig(agentId);\n const stdinMode =\n options.useStdin && spawnConfig.stdinMode ? spawnConfig.stdinMode : undefined;\n return { binaryName, args: buildCliArgs(spawnConfig, options, stdinMode) };\n}\n\nexport async function spawn(\n agentId: string,\n options: SpawnOptions,\n context?: SpawnContext\n): Promise<SpawnResult> {\n const { agentId: resolvedId, binaryName, spawnConfig } = resolveCliConfig(agentId);\n\n const stdinMode =\n options.useStdin && spawnConfig.stdinMode ? spawnConfig.stdinMode : undefined;\n\n const spawnArgs = buildCliArgs(spawnConfig, options, stdinMode);\n\n if (context?.dryRun) {\n const rendered = [binaryName, ...spawnArgs].join(\" \");\n context.logger?.dryRun(rendered);\n return { stdout: \"\", stderr: \"\", exitCode: 0 };\n }\n\n const child = spawnChildProcess(binaryName, spawnArgs, {\n cwd: options.cwd,\n stdio: [stdinMode ? \"pipe\" : \"inherit\", \"pipe\", \"pipe\"]\n });\n\n if (!child.stdout || !child.stderr) {\n throw new Error(`Failed to spawn \"${resolvedId}\": missing stdio pipes.`);\n }\n\n const stdoutStream = child.stdout;\n const stderrStream = child.stderr;\n\n if (stdinMode) {\n if (!child.stdin) {\n throw new Error(`Failed to spawn \"${resolvedId}\": missing stdin pipe.`);\n }\n child.stdin.setDefaultEncoding(\"utf8\");\n child.stdin.write(options.prompt);\n child.stdin.end();\n }\n\n return new Promise<SpawnResult>((resolve, reject) => {\n let stdout = \"\";\n let stderr = \"\";\n\n stdoutStream.setEncoding(\"utf8\");\n stdoutStream.on(\"data\", (chunk) => {\n stdout += chunk;\n if (options.tee?.stdout) options.tee.stdout.write(chunk);\n });\n\n stderrStream.setEncoding(\"utf8\");\n stderrStream.on(\"data\", (chunk) => {\n stderr += chunk;\n if (options.tee?.stderr) options.tee.stderr.write(chunk);\n });\n\n child.on(\"error\", (error) => {\n reject(error);\n });\n\n child.on(\"close\", (code) => {\n resolve({\n stdout,\n stderr,\n exitCode: code ?? 1\n });\n });\n });\n}\n", "import { allAgents, resolveAgentId } from \"@poe-code/agent-defs\";\nimport type { SpawnConfig } from \"../types.js\";\nimport { getSpawnConfig } from \"./index.js\";\n\nexport interface ResolvedSpawnConfig {\n agentId: string;\n binaryName?: string;\n spawnConfig?: SpawnConfig;\n}\n\nexport function resolveConfig(agentId: string): ResolvedSpawnConfig {\n const resolvedAgentId = resolveAgentId(agentId);\n if (!resolvedAgentId) {\n throw new Error(`Unknown agent \"${agentId}\".`);\n }\n\n const agentDefinition = allAgents.find((agent) => agent.id === resolvedAgentId);\n if (!agentDefinition) {\n throw new Error(`Unknown agent \"${agentId}\".`);\n }\n\n const spawnConfig = getSpawnConfig(resolvedAgentId);\n const binaryName = agentDefinition.binaryName;\n\n return { agentId: resolvedAgentId, binaryName, spawnConfig };\n}\n", "import { listMcpSupportedAgents } from \"./configs/index.js\";\nimport type { CliSpawnConfig, McpSpawnConfig } from \"./types.js\";\n\nexport function hasMcpServers(servers?: McpSpawnConfig): servers is McpSpawnConfig {\n if (!servers) {\n return false;\n }\n return Object.keys(servers).length > 0;\n}\n\nexport function getMcpArgs(\n config: CliSpawnConfig,\n servers?: McpSpawnConfig\n): string[] {\n if (!hasMcpServers(servers)) {\n return [];\n }\n if (!config.mcpArgs) {\n throw new Error(formatUnsupportedMcpSpawnMessage(config.agentId));\n }\n return config.mcpArgs(servers);\n}\n\nexport function formatUnsupportedMcpSpawnMessage(agentId: string): string {\n const supported = listMcpSupportedAgents();\n const supportedText = supported.length > 0 ? supported.join(\", \") : \"(none)\";\n return (\n `Agent \"${agentId}\" does not support MCP servers at spawn time.\\n` +\n `Agents with spawn-time MCP support: ${supportedText}`\n );\n}\n", "/**\n * Strips the provider namespace prefix from a model identifier.\n * e.g., \"anthropic/claude-opus-4.6\" \u2192 \"claude-opus-4.6\"\n *\n * CLI binaries (claude, codex, opencode, kimi) only accept bare model IDs.\n * Passing a namespaced model like \"anthropic/claude-opus-4.6\" causes the\n * binary to fail with \"model not found\". This function MUST be called\n * before passing any model to a CLI binary via spawn args.\n */\nexport function stripModelNamespace(model: string): string {\n const slashIndex = model.indexOf(\"/\");\n return slashIndex === -1 ? model : model.slice(slashIndex + 1);\n}\n", "import { spawn as spawnChildProcess } from \"node:child_process\";\nimport { resolveConfig } from \"./configs/resolve-config.js\";\nimport { getMcpArgs } from \"./mcp-args.js\";\nimport { stripModelNamespace } from \"./model-utils.js\";\nimport type { SpawnOptions, SpawnResult } from \"./types.js\";\n\nexport async function spawnInteractive(\n agentId: string,\n options: SpawnOptions\n): Promise<SpawnResult> {\n const resolved = resolveConfig(agentId);\n const spawnConfig = resolved.spawnConfig;\n\n if (!spawnConfig) {\n throw new Error(`Agent \"${resolved.agentId}\" has no spawn config.`);\n }\n\n if (spawnConfig.kind !== \"cli\") {\n throw new Error(`Agent \"${resolved.agentId}\" does not support CLI spawn.`);\n }\n\n if (!resolved.binaryName) {\n throw new Error(`Agent \"${resolved.agentId}\" has no binaryName.`);\n }\n\n if (!spawnConfig.interactive) {\n throw new Error(`Agent \"${resolved.agentId}\" does not support interactive mode.`);\n }\n\n const { interactive } = spawnConfig;\n\n const args: string[] = [];\n\n if (options.prompt) {\n if (interactive.promptFlag) {\n args.push(interactive.promptFlag, options.prompt);\n } else {\n args.push(options.prompt);\n }\n }\n\n if (options.model && spawnConfig.modelFlag) {\n let model = spawnConfig.modelStripProviderPrefix\n ? stripModelNamespace(options.model)\n : options.model;\n if (spawnConfig.modelTransform) model = spawnConfig.modelTransform(model);\n args.push(spawnConfig.modelFlag, model);\n }\n\n args.push(...interactive.defaultArgs);\n args.push(...getMcpArgs(spawnConfig, options.mcpServers));\n\n const mode = options.mode ?? \"yolo\";\n args.push(...spawnConfig.modes[mode]);\n\n if (options.args && options.args.length > 0) {\n args.push(...options.args);\n }\n\n const child = spawnChildProcess(resolved.binaryName, args, {\n cwd: options.cwd,\n stdio: \"inherit\"\n });\n\n return new Promise<SpawnResult>((resolve, reject) => {\n child.on(\"error\", (error) => {\n reject(error);\n });\n\n child.on(\"close\", (code) => {\n resolve({\n stdout: \"\",\n stderr: \"\",\n exitCode: code ?? 1\n });\n });\n });\n}\n", "import chalk from \"chalk\";\n\nexport const brand = \"#a200ff\";\n\nexport const dark = {\n header: (text: string) => chalk.magentaBright.bold(text),\n divider: (text: string) => chalk.dim(text),\n prompt: (text: string) => chalk.cyan(text),\n number: (text: string) => chalk.cyanBright(text),\n intro: (text: string) => chalk.bgMagenta.white(` Poe - ${text} `),\n resolvedSymbol: chalk.magenta(\"\u25C7\"),\n errorSymbol: chalk.red(\"\u25A0\"),\n accent: (text: string) => chalk.cyan(text),\n muted: (text: string) => chalk.dim(text),\n success: (text: string) => chalk.green(text),\n warning: (text: string) => chalk.yellow(text),\n error: (text: string) => chalk.red(text),\n info: (text: string) => chalk.magenta(text),\n badge: (text: string) => chalk.bgYellow.black(` ${text} `)\n};\n\nexport const light = {\n header: (text: string) => chalk.hex(\"#a200ff\").bold(text),\n divider: (text: string) => chalk.hex(\"#666666\")(text),\n prompt: (text: string) => chalk.hex(\"#006699\").bold(text),\n number: (text: string) => chalk.hex(\"#0077cc\").bold(text),\n intro: (text: string) => chalk.bgHex(\"#a200ff\").white(` Poe - ${text} `),\n resolvedSymbol: chalk.hex(\"#a200ff\")(\"\u25C7\"),\n errorSymbol: chalk.hex(\"#cc0000\")(\"\u25A0\"),\n accent: (text: string) => chalk.hex(\"#006699\").bold(text),\n muted: (text: string) => chalk.hex(\"#666666\")(text),\n success: (text: string) => chalk.hex(\"#008800\")(text),\n warning: (text: string) => chalk.hex(\"#cc6600\")(text),\n error: (text: string) => chalk.hex(\"#cc0000\")(text),\n info: (text: string) => chalk.hex(\"#a200ff\")(text),\n badge: (text: string) => chalk.bgHex(\"#cc6600\").white(` ${text} `)\n};\n\nexport type ThemeName = \"dark\" | \"light\";\nexport type ThemePalette = typeof dark;\n", "import chalk from \"chalk\";\n\nexport const typography = {\n bold: (text: string) => chalk.bold(text),\n dim: (text: string) => chalk.dim(text),\n italic: (text: string) => chalk.italic(text),\n underline: (text: string) => chalk.underline(text),\n strikethrough: (text: string) => chalk.strikethrough(text)\n} as const;\n", "import chalk from \"chalk\";\nimport { getTheme } from \"../internal/theme-detect.js\";\nimport { typography } from \"../tokens/typography.js\";\n\nexport const text = {\n intro(content: string): string {\n const theme = getTheme();\n return theme.intro(content);\n },\n heading(content: string): string {\n const theme = getTheme();\n return theme.header(content);\n },\n section(content: string): string {\n return typography.bold(content);\n },\n command(content: string): string {\n const theme = getTheme();\n return theme.accent(content);\n },\n argument(content: string): string {\n const theme = getTheme();\n return theme.muted(content);\n },\n option(content: string): string {\n return chalk.yellow(content);\n },\n example(content: string): string {\n const theme = getTheme();\n return theme.muted(content);\n },\n usageCommand(content: string): string {\n return chalk.green(content);\n },\n link(content: string): string {\n const theme = getTheme();\n return theme.accent(content);\n },\n muted(content: string): string {\n const theme = getTheme();\n return theme.muted(content);\n },\n badge(content: string): string {\n const theme = getTheme();\n return theme.badge(content);\n }\n} as const;\n", "import { dark, light, type ThemeName, type ThemePalette } from \"../tokens/colors.js\";\n\nexport interface ThemeEnv {\n POE_CODE_THEME?: string;\n APPLE_INTERFACE_STYLE?: string;\n VSCODE_COLOR_THEME_KIND?: string;\n COLORFGBG?: string;\n}\n\nfunction detectThemeFromEnv(env: ThemeEnv): ThemeName | undefined {\n const apple = env.APPLE_INTERFACE_STYLE;\n if (typeof apple === \"string\") {\n return apple.toLowerCase() === \"dark\" ? \"dark\" : \"light\";\n }\n\n const vscodeKind = env.VSCODE_COLOR_THEME_KIND;\n if (typeof vscodeKind === \"string\") {\n const normalized = vscodeKind.toLowerCase();\n if (normalized.includes(\"light\")) {\n return \"light\";\n }\n if (normalized.includes(\"dark\")) {\n return \"dark\";\n }\n }\n\n const colorFGBG = env.COLORFGBG;\n if (typeof colorFGBG === \"string\") {\n const parts = colorFGBG.split(\";\").map((part) => Number.parseInt(part, 10));\n const background = parts.at(-1);\n if (Number.isFinite(background)) {\n return background! >= 8 ? \"light\" : \"dark\";\n }\n }\n\n return undefined;\n}\n\nexport function resolveThemeName(env: ThemeEnv = process.env as ThemeEnv): ThemeName {\n const raw = env.POE_CODE_THEME?.toLowerCase();\n if (raw === \"light\" || raw === \"dark\") {\n return raw;\n }\n const detected = detectThemeFromEnv(env);\n if (detected) {\n return detected;\n }\n return \"dark\";\n}\n\nlet cachedTheme: ThemePalette | undefined;\n\nexport function getTheme(env?: ThemeEnv): ThemePalette {\n if (cachedTheme) {\n return cachedTheme;\n }\n const themeName = resolveThemeName(env);\n cachedTheme = themeName === \"light\" ? light : dark;\n return cachedTheme;\n}\n\nexport function resetThemeCache(): void {\n cachedTheme = undefined;\n}\n", "import chalk from \"chalk\";\nimport { getTheme } from \"../internal/theme-detect.js\";\n\nexport const symbols = {\n get info(): string {\n return chalk.magenta(\"\u25CF\");\n },\n get success(): string {\n return chalk.magenta(\"\u25C6\");\n },\n get resolved(): string {\n const theme = getTheme();\n return theme.resolvedSymbol;\n },\n get errorResolved(): string {\n const theme = getTheme();\n return theme.errorSymbol;\n },\n bar: \"\u2502\",\n cornerTopRight: \"\u256E\",\n cornerBottomRight: \"\u256F\",\n warning: \"\u25B2\",\n active: \"\u25C6\",\n inactive: \"\u25CB\"\n} as const;\n", "import { log } from \"@clack/prompts\";\nimport chalk from \"chalk\";\nimport { symbols } from \"./symbols.js\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\n\nexport interface LoggerOutput {\n info(message: string): void;\n success(message: string): void;\n warn(message: string): void;\n error(message: string): void;\n resolved(label: string, value: string): void;\n errorResolved(label: string, value: string): void;\n message(message: string, symbol?: string): void;\n}\n\nexport function createLogger(emitter?: (message: string) => void): LoggerOutput {\n const emit = (\n level: \"info\" | \"success\" | \"warn\" | \"error\",\n message: string\n ): void => {\n if (emitter) {\n emitter(message);\n return;\n }\n if (resolveOutputFormat() !== \"terminal\") {\n process.stdout.write(message + \"\\n\");\n return;\n }\n if (level === \"success\") {\n log.message(message, { symbol: symbols.success });\n return;\n }\n if (level === \"warn\") {\n log.warn(message);\n return;\n }\n if (level === \"error\") {\n log.error(message);\n return;\n }\n log.message(message, { symbol: symbols.info });\n };\n\n return {\n info(message: string): void {\n emit(\"info\", message);\n },\n success(message: string): void {\n emit(\"success\", message);\n },\n warn(message: string): void {\n emit(\"warn\", message);\n },\n error(message: string): void {\n emit(\"error\", message);\n },\n resolved(label: string, value: string): void {\n if (emitter) {\n emitter(`${label}: ${value}`);\n return;\n }\n log.message(`${label}\\n ${value}`, { symbol: symbols.resolved });\n },\n errorResolved(label: string, value: string): void {\n if (emitter) {\n emitter(`${label}: ${value}`);\n return;\n }\n log.message(`${label}\\n ${value}`, { symbol: symbols.errorResolved });\n },\n message(message: string, symbol?: string): void {\n if (emitter) {\n emitter(message);\n return;\n }\n log.message(message, { symbol: symbol ?? chalk.gray(\"\u2502\") });\n }\n };\n}\n\nexport const logger = createLogger();\n", "export type OutputFormat = \"terminal\" | \"markdown\" | \"json\";\n\nconst VALID_FORMATS = new Set<OutputFormat>([\"terminal\", \"markdown\", \"json\"]);\n\nlet cached: OutputFormat | undefined;\n\nexport function resolveOutputFormat(\n env: { OUTPUT_FORMAT?: string } = process.env as { OUTPUT_FORMAT?: string }\n): OutputFormat {\n if (cached) {\n return cached;\n }\n const raw = env.OUTPUT_FORMAT?.toLowerCase();\n cached = VALID_FORMATS.has(raw as OutputFormat) ? (raw as OutputFormat) : \"terminal\";\n return cached;\n}\n\nexport function resetOutputFormatCache(): void {\n cached = undefined;\n}\n", "import { Table } from \"console-table-printer\";\nimport type { ThemePalette } from \"../tokens/colors.js\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\n\nexport interface TableColumn {\n name: string;\n title: string;\n alignment: \"left\" | \"right\";\n maxLen: number;\n}\n\nexport interface RenderTableOptions {\n theme: ThemePalette;\n columns: TableColumn[];\n rows: Record<string, string>[];\n}\n\nfunction stripAnsi(value: string): string {\n return value.replace(/\\u001b\\[[0-9;]*m/g, \"\");\n}\n\nfunction renderTableTerminal(options: RenderTableOptions): string {\n const { theme, columns, rows } = options;\n\n const table = new Table({\n style: {\n headerTop: {\n left: theme.muted(\"\u250C\"),\n mid: theme.muted(\"\u252C\"),\n right: theme.muted(\"\u2510\"),\n other: theme.muted(\"\u2500\")\n },\n headerBottom: {\n left: theme.muted(\"\u251C\"),\n mid: theme.muted(\"\u253C\"),\n right: theme.muted(\"\u2524\"),\n other: theme.muted(\"\u2500\")\n },\n tableBottom: {\n left: theme.muted(\"\u2514\"),\n mid: theme.muted(\"\u2534\"),\n right: theme.muted(\"\u2518\"),\n other: theme.muted(\"\u2500\")\n },\n vertical: theme.muted(\"\u2502\"),\n rowSeparator: {\n left: theme.muted(\"\u251C\"),\n mid: theme.muted(\"\u253C\"),\n right: theme.muted(\"\u2524\"),\n other: theme.muted(\"\u2500\")\n }\n },\n columns: columns.map((col) => ({\n name: col.name,\n title: theme.header(col.title),\n alignment: col.alignment,\n maxLen: col.maxLen\n }))\n });\n\n for (const row of rows) {\n table.addRow(row);\n }\n\n return table.render();\n}\n\nfunction renderTableMarkdown(options: RenderTableOptions): string {\n const { columns, rows } = options;\n\n const header = `| ${columns.map((c) => c.title).join(\" | \")} |`;\n const separator = `| ${columns.map((c) => (c.alignment === \"right\" ? \"---:\" : \":---\")).join(\" | \")} |`;\n\n const dataRows = rows.map(\n (row) =>\n `| ${columns.map((c) => stripAnsi(row[c.name] ?? \"\").replace(/\\|/g, \"\\\\|\")).join(\" | \")} |`\n );\n\n return [header, separator, ...dataRows].join(\"\\n\");\n}\n\nfunction renderTableJson(options: RenderTableOptions): string {\n const { columns, rows } = options;\n\n const cleaned = rows.map((row) => {\n const obj: Record<string, string> = {};\n for (const col of columns) {\n obj[col.name] = stripAnsi(row[col.name] ?? \"\");\n }\n return obj;\n });\n\n return JSON.stringify(cleaned, null, 2);\n}\n\nexport function renderTable(options: RenderTableOptions): string {\n const format = resolveOutputFormat();\n switch (format) {\n case \"markdown\":\n return renderTableMarkdown(options);\n case \"json\":\n return renderTableJson(options);\n default:\n return renderTableTerminal(options);\n }\n}\n", "import chalk from \"chalk\";\n\nfunction truncate(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text;\n if (maxLength <= 3) return text.slice(0, maxLength);\n return `${text.slice(0, maxLength - 3)}...`;\n}\n\nconst KIND_COLORS: Record<string, (text: string) => string> = {\n exec: (text) => chalk.yellow(text),\n edit: (text) => chalk.magenta(text),\n read: (text) => chalk.cyan(text),\n search: (text) => chalk.blue(text),\n think: (text) => chalk.dim(text),\n other: (text) => chalk.dim(text)\n};\n\nfunction colorForKind(kind: string): (text: string) => string {\n return KIND_COLORS[kind] ?? ((text) => chalk.dim(text));\n}\n\nfunction writeLine(line: string): void {\n process.stdout.write(`${line}\\n`);\n}\n\nconst AGENT_PREFIX = `${chalk.green.bold(\"\u2713\")} agent: `;\n\nexport function renderAgentMessage(text: string): void {\n writeLine(`${AGENT_PREFIX}${text}`);\n}\n\nexport function renderToolStart(kind: string, title: string): void {\n const color = colorForKind(kind);\n writeLine(color(` \u2192 ${kind}: ${title}`));\n}\n\nexport function renderToolComplete(kind: string): void {\n const color = colorForKind(kind);\n writeLine(color(` \u2713 ${kind}`));\n}\n\nexport function renderReasoning(text: string): void {\n writeLine(chalk.dim(` \u2713 ${truncate(text, 80)}`));\n}\n\nexport function renderUsage(tokens: {\n input: number;\n output: number;\n cached?: number;\n costUsd?: number;\n}): void {\n const cached = typeof tokens.cached === \"number\" && tokens.cached > 0\n ? ` (${tokens.cached} cached)`\n : \"\";\n\n let cost = \"\";\n if (typeof tokens.costUsd === \"number\") {\n const formatted = new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: \"USD\",\n minimumFractionDigits: 2,\n maximumFractionDigits: 6\n }).format(tokens.costUsd);\n cost = ` (${formatted})`;\n }\n\n writeLine(\n chalk.green(\n `\u2713 tokens: ${tokens.input} in${cached} \u2192 ${tokens.output} out${cost}`\n )\n );\n}\n\nexport function renderError(message: string): void {\n writeLine(chalk.red(`\u2717 ${message}`));\n}\n", "import * as clack from \"@clack/prompts\";\nimport { text as textComponent } from \"../components/text.js\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\n\nexport { isCancel, cancel, log } from \"@clack/prompts\";\n\nfunction stripAnsi(value: string): string {\n return value.replace(/\\u001b\\[[0-9;]*m/g, \"\");\n}\n\nexport function intro(title: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`# ${stripAnsi(title)}\\n\\n`);\n return;\n }\n if (format === \"json\") {\n return;\n }\n clack.intro(textComponent.intro(title));\n}\n\nexport function introPlain(title: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`# ${stripAnsi(title)}\\n\\n`);\n return;\n }\n if (format === \"json\") {\n return;\n }\n clack.intro(title);\n}\n\nexport function outro(message: string): void {\n if (resolveOutputFormat() !== \"terminal\") {\n return;\n }\n clack.outro(message);\n}\n\nexport function note(message: string, title?: string): void {\n if (resolveOutputFormat() !== \"terminal\") {\n return;\n }\n clack.note(message, title);\n}\n\nexport type SelectOptions<Value> = Parameters<typeof clack.select<Value>>[0];\n\nexport async function select<Value>(\n opts: SelectOptions<Value>\n): Promise<Value | symbol> {\n return clack.select(opts);\n}\n\nexport type TextOptions = Parameters<typeof clack.text>[0];\n\nexport async function text(opts: TextOptions): Promise<string | symbol> {\n return clack.text(opts);\n}\n\nexport type ConfirmOptions = Parameters<typeof clack.confirm>[0];\n\nexport async function confirm(opts: ConfirmOptions): Promise<boolean | symbol> {\n return clack.confirm(opts);\n}\n\nexport class PromptCancelledError extends Error {\n constructor(message = \"Operation cancelled.\") {\n super(message);\n this.name = \"PromptCancelledError\";\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\nexport async function confirmOrCancel(opts: ConfirmOptions): Promise<boolean> {\n const result = await confirm(opts);\n if (clack.isCancel(result)) {\n clack.cancel(\"Operation cancelled.\");\n throw new PromptCancelledError();\n }\n return result === true;\n}\n\nexport type PasswordOptions = Parameters<typeof clack.password>[0];\n\nexport async function password(opts: PasswordOptions): Promise<string | symbol> {\n return clack.password(opts);\n}\n\nexport type SpinnerOptions = {\n start: (message?: string) => void;\n stop: (message?: string, code?: number) => void;\n message: (message?: string) => void;\n};\n\nexport function spinner(): SpinnerOptions {\n return clack.spinner();\n}\n\nexport interface WithSpinnerOptions<T> {\n message: string;\n fn: () => Promise<T>;\n stopMessage?: (result: T) => string;\n subtext?: (result: T) => string | undefined;\n}\n\nfunction formatElapsed(ms: number): string {\n const totalSeconds = Math.floor(ms / 1000);\n if (totalSeconds < 60) {\n return `${totalSeconds}s`;\n }\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n return `${minutes}m ${seconds}s`;\n}\n\nexport async function withSpinner<T>(options: WithSpinnerOptions<T>): Promise<T> {\n const { message, fn, stopMessage, subtext } = options;\n\n if (resolveOutputFormat() === \"json\") {\n const result = await fn();\n const sub = subtext ? subtext(result) : undefined;\n if (sub) {\n process.stdout.write(sub + \"\\n\");\n }\n return result;\n }\n\n const noSpinner = process.env.POE_NO_SPINNER === \"1\";\n const isTTY = process.stdout.isTTY;\n\n if (noSpinner || !isTTY) {\n const result = await fn();\n const msg = stopMessage ? stopMessage(result) : undefined;\n if (msg) {\n process.stdout.write(`\\x1b[32m\u25C6\\x1b[0m ${msg}\\n`);\n }\n const sub = subtext ? subtext(result) : undefined;\n if (sub) {\n for (const line of sub.split(\"\\n\")) {\n process.stdout.write(`\\x1b[90m\u2502\\x1b[0m ${line}\\n`);\n }\n }\n return result;\n }\n\n const s = spinner();\n const start = Date.now();\n s.start(message);\n\n const timer = setInterval(() => {\n s.message(`${message} [${formatElapsed(Date.now() - start)}]`);\n }, 1000);\n\n try {\n const result = await fn();\n clearInterval(timer);\n const elapsed = formatElapsed(Date.now() - start);\n const msg = stopMessage ? stopMessage(result) : undefined;\n s.stop(msg ? `${msg} [${elapsed}]` : `Done [${elapsed}]`);\n\n const sub = subtext ? subtext(result) : undefined;\n if (sub) {\n for (const line of sub.split(\"\\n\")) {\n process.stdout.write(`\\x1b[90m\u2502\\x1b[0m ${line}\\n`);\n }\n }\n\n return result;\n } catch (error) {\n clearInterval(timer);\n s.stop(\"\", 1);\n throw error;\n }\n}\n", "import chalk from \"chalk\";\nimport { symbols } from \"../components/symbols.js\";\n\nexport const SPINNER_FRAMES = [\"\u25D2\", \"\u25D0\", \"\u25D3\", \"\u25D1\"] as const;\n\nexport interface SpinnerFrameOptions {\n frame?: number;\n message: string;\n timer?: string;\n}\n\nexport function renderSpinnerFrame(options: SpinnerFrameOptions): string {\n const frame = options.frame ?? 0;\n const spinnerChar = chalk.magenta(SPINNER_FRAMES[frame % SPINNER_FRAMES.length]);\n const timerSuffix = options.timer ? chalk.dim(` [${options.timer}]`) : \"\";\n const bar = chalk.gray(symbols.bar);\n\n return `${spinnerChar} ${options.message}${timerSuffix}\\n${bar}`;\n}\n\nexport interface SpinnerStoppedOptions {\n message: string;\n code?: number;\n timer?: string;\n subtext?: string;\n}\n\nexport function renderSpinnerStopped(options: SpinnerStoppedOptions): string {\n const code = options.code ?? 0;\n const symbol = code === 0\n ? chalk.green(\"\u25C6\")\n : chalk.red(\"\u25A0\");\n const timerSuffix = options.timer ? chalk.dim(` [${options.timer}]`) : \"\";\n const bar = chalk.gray(symbols.bar);\n\n let output = `${symbol} ${options.message}${timerSuffix}`;\n if (options.subtext) {\n output += `\\n${bar} ${chalk.dim(options.subtext)}`;\n }\n return output;\n}\n", "import chalk from \"chalk\";\nimport { symbols } from \"../components/symbols.js\";\nimport { getTheme } from \"../internal/theme-detect.js\";\n\nexport interface MenuOption {\n label: string;\n value: string;\n hint?: string;\n}\n\nexport interface RenderMenuOptions {\n message: string;\n options: MenuOption[];\n selectedIndex?: number;\n}\n\nexport function renderMenu(opts: RenderMenuOptions): string {\n const theme = getTheme();\n const bar = chalk.gray(symbols.bar);\n const lines: string[] = [];\n\n lines.push(`${chalk.cyan(symbols.active)} ${opts.message}`);\n lines.push(bar);\n\n opts.options.forEach((option, index) => {\n const isSelected = index === (opts.selectedIndex ?? 0);\n const prefix = isSelected ? chalk.cyan(symbols.active) : chalk.gray(symbols.inactive);\n const label = isSelected ? theme.accent(option.label) : option.label;\n const hint = option.hint ? chalk.dim(` (${option.hint})`) : \"\";\n lines.push(`${bar} ${prefix} ${label}${hint}`);\n });\n\n lines.push(`${bar}`);\n return lines.join(\"\\n\");\n}\n", "import { spawn as spawnChildProcess } from \"node:child_process\";\nimport { getAdapter } from \"../adapters/index.js\";\nimport type { AcpEvent } from \"./types.js\";\nimport { readLines } from \"./line-reader.js\";\nimport { resolveConfig } from \"../configs/resolve-config.js\";\nimport { getMcpArgs } from \"../mcp-args.js\";\nimport { stripModelNamespace } from \"../model-utils.js\";\nimport type { SpawnOptions, SpawnResult, SpawnUsage } from \"../types.js\";\n\nexport interface SpawnStreamingOptions extends SpawnOptions {\n agentId: string;\n}\n\nexport interface SpawnStreamingResult {\n events: AsyncIterable<AcpEvent>;\n done: Promise<SpawnResult>;\n}\n\nfunction isAcpEvent(value: unknown): value is AcpEvent {\n return !!value && typeof value === \"object\" && \"event\" in value;\n}\n\nfunction captureUsage(event: AcpEvent): SpawnUsage | undefined {\n if (event.event !== \"usage\") return;\n const usage = event as Partial<SpawnUsage>;\n\n const inputTokens = typeof usage.inputTokens === \"number\" ? usage.inputTokens : 0;\n const outputTokens = typeof usage.outputTokens === \"number\" ? usage.outputTokens : 0;\n const cachedTokens = typeof usage.cachedTokens === \"number\" ? usage.cachedTokens : undefined;\n const costUsd = typeof usage.costUsd === \"number\" ? usage.costUsd : undefined;\n\n return { inputTokens, outputTokens, cachedTokens, costUsd };\n}\n\nexport function spawnStreaming(options: SpawnStreamingOptions): SpawnStreamingResult {\n const { agentId, binaryName, spawnConfig } = resolveConfig(options.agentId);\n\n if (spawnConfig === undefined) {\n throw new Error(`Agent \"${agentId}\" has no spawn config.`);\n }\n\n if (spawnConfig.kind !== \"cli\") {\n throw new Error(`Agent \"${agentId}\" does not support CLI spawn.`);\n }\n\n if (!binaryName) {\n throw new Error(`Agent \"${agentId}\" has no binaryName.`);\n }\n\n const args: string[] = [spawnConfig.promptFlag];\n\n const useStdin = !!options.useStdin && !!spawnConfig.stdinMode;\n if (!useStdin || !spawnConfig.stdinMode?.omitPrompt) {\n args.push(options.prompt);\n }\n\n if (options.model && spawnConfig.modelFlag) {\n let model = spawnConfig.modelStripProviderPrefix\n ? stripModelNamespace(options.model)\n : options.model;\n if (spawnConfig.modelTransform) model = spawnConfig.modelTransform(model);\n args.push(spawnConfig.modelFlag, model);\n }\n\n args.push(...spawnConfig.defaultArgs);\n args.push(...getMcpArgs(spawnConfig, options.mcpServers));\n\n const mode = options.mode ?? \"yolo\";\n args.push(...spawnConfig.modes[mode]);\n\n if (useStdin) {\n args.push(...spawnConfig.stdinMode!.extraArgs);\n }\n\n if (options.args && options.args.length > 0) {\n args.push(...options.args);\n }\n\n const child = spawnChildProcess(binaryName, args, {\n cwd: options.cwd,\n stdio: [\"pipe\", \"pipe\", \"pipe\"]\n });\n\n const result: SpawnResult = { stdout: \"\", stderr: \"\", exitCode: 1 };\n child.stderr.setEncoding(\"utf8\");\n child.stderr.on(\"data\", (chunk) => {\n result.stderr += chunk;\n });\n\n if (useStdin) {\n child.stdin.write(options.prompt);\n }\n child.stdin.end();\n\n const adapter = getAdapter(spawnConfig.adapter);\n\n const events: AsyncIterable<AcpEvent> = (async function* () {\n for await (const output of adapter(readLines(child.stdout))) {\n if (!isAcpEvent(output)) continue;\n\n if (output.event === \"session_start\") {\n const maybeThreadId = (output as { threadId?: unknown }).threadId;\n if (typeof maybeThreadId === \"string\" && maybeThreadId.length > 0) {\n result.threadId = maybeThreadId;\n result.sessionId = maybeThreadId;\n }\n }\n\n const maybeUsage = captureUsage(output);\n if (maybeUsage) {\n result.usage = maybeUsage;\n }\n\n yield output;\n }\n })();\n\n const done = new Promise<SpawnResult>((resolve, reject) => {\n child.on(\"error\", (error) => {\n reject(error);\n });\n\n child.on(\"close\", (code) => {\n result.exitCode = code ?? 1;\n resolve(result);\n });\n });\n\n return { events, done };\n}\n", "import type { CommandRunner, CommandRunnerResult } from \"@poe-code/agent-spawn\";\nimport { buildSpawnArgs } from \"@poe-code/agent-spawn\";\n\nexport type {\n CommandRunner,\n CommandRunnerOptions,\n CommandRunnerResult\n} from \"@poe-code/agent-spawn\";\n\nexport function formatCommandRunnerResult(\n result: CommandRunnerResult\n): string {\n const stdout =\n result.stdout.length > 0 ? result.stdout : \"<empty>\";\n const stderr =\n result.stderr.length > 0 ? result.stderr : \"<empty>\";\n return `stdout:\\n${stdout}\\nstderr:\\n${stderr}`;\n}\n\nexport interface RunAndMatchOutputOptions {\n command: string;\n args: string[];\n expectedOutput: string;\n skipOnDryRun?: boolean;\n}\n\nexport function describeCommandExpectation(\n command: string,\n args: string[],\n expectedOutput: string\n): string {\n return `${renderCommandLine(command, args)} (expecting \"${expectedOutput}\")`;\n}\n\nexport interface CommandExpectationCheckOptions\n extends RunAndMatchOutputOptions {\n id: string;\n}\n\nexport function createCommandExpectationCheck(\n options: CommandExpectationCheckOptions\n): CommandCheck {\n return {\n id: options.id,\n description: describeCommandExpectation(\n options.command,\n options.args,\n options.expectedOutput\n ),\n async run(context) {\n await runAndMatchOutput(context, options);\n }\n };\n}\n\nexport async function runAndMatchOutput(\n context: CommandCheckContext,\n options: RunAndMatchOutputOptions\n): Promise<void> {\n const rendered = renderCommandLine(options.command, options.args);\n if (options.skipOnDryRun !== false && context.isDryRun) {\n if (context.logDryRun) {\n context.logDryRun(\n `Dry run: ${rendered} (expecting \"${options.expectedOutput}\")`\n );\n }\n return;\n }\n\n const result = await context.runCommand(options.command, options.args);\n if (result.exitCode !== 0) {\n const detail = formatCommandRunnerResult(result);\n throw new Error(\n [`Command ${rendered} failed with exit code ${result.exitCode}.`, detail].join(\"\\n\")\n );\n }\n\n if (!stdoutMatchesExpected(result.stdout, options.expectedOutput)) {\n const detail = formatCommandRunnerResult(result);\n const received = result.stdout.trim();\n throw new Error(\n [\n `Command ${rendered} failed: expected \"${options.expectedOutput}\" but received \"${received}\".`,\n detail\n ].join(\"\\n\")\n );\n }\n}\n\nexport function stdoutMatchesExpected(stdout: string, expected: string): boolean {\n const trimmed = stdout.trim();\n if (trimmed === expected) {\n return true;\n }\n\n const lines = stdout\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n\n if (lines.some((line) => line === expected)) {\n return true;\n }\n\n for (const line of lines) {\n if (line[0] !== \"{\") continue;\n try {\n const parsed = JSON.parse(line) as { type?: string; result?: string };\n if (parsed.type === \"result\" && parsed.result === expected) {\n return true;\n }\n } catch {\n continue;\n }\n }\n\n return false;\n}\n\nfunction renderCommandLine(command: string, args: string[]): string {\n return [command, ...args].map(quoteIfNeeded).join(\" \").trim();\n}\n\nfunction quoteIfNeeded(value: string): string {\n if (value.length === 0) {\n return '\"\"';\n }\n if (needsQuoting(value)) {\n return `\"${value.replaceAll('\"', '\\\\\"')}\"`;\n }\n return value;\n}\n\nfunction needsQuoting(value: string): boolean {\n return (\n value.includes(\" \") ||\n value.includes(\"\\t\") ||\n value.includes(\"\\n\")\n );\n}\n\nexport interface CommandCheckContext {\n isDryRun: boolean;\n runCommand: CommandRunner;\n logDryRun?: (message: string) => void;\n}\n\nexport interface CommandCheck {\n id: string;\n description?: string;\n run(context: CommandCheckContext): Promise<void>;\n}\n\nexport function createSpawnHealthCheck(\n agentId: string,\n options: { model?: string; expectedOutput: string }\n): CommandCheck {\n const prompt = `Output exactly: ${options.expectedOutput}`;\n const { binaryName, args } = buildSpawnArgs(agentId, {\n prompt,\n model: options.model,\n mode: \"yolo\"\n });\n return {\n id: `${agentId}-cli-health`,\n description: `spawn ${agentId} (expecting \"${options.expectedOutput}\")`,\n async run(context) {\n if (context.isDryRun) {\n context.logDryRun?.(\n `Dry run: ${[binaryName, ...args].join(\" \")} (expecting \"${options.expectedOutput}\")`\n );\n return;\n }\n\n const result = await context.runCommand(binaryName, args);\n\n if (result.exitCode !== 0) {\n throw new Error(\n `spawn ${agentId} failed with exit code ${result.exitCode}.\\n${formatCommandRunnerResult(result)}`\n );\n }\n\n if (!result.stdout.includes(options.expectedOutput)) {\n throw new Error(\n `spawn ${agentId}: expected \"${options.expectedOutput}\" in stdout.\\n${formatCommandRunnerResult(result)}`\n );\n }\n }\n };\n}\n\n/**\n * Creates a check that detects if a binary exists using multiple fallback methods.\n * This is useful in Docker/containerized environments where PATH may not be updated after npm install.\n *\n * @param binaryName - The name of the binary to check for (e.g., \"claude\", \"codex\")\n * @param id - Unique identifier for the check\n * @param description - Human-readable description of what's being checked\n * @returns A CommandCheck that verifies the binary using multiple detection methods\n */\nexport function createBinaryExistsCheck(\n binaryName: string,\n id: string,\n description: string\n): CommandCheck {\n return {\n id,\n description,\n async run({ runCommand }) {\n // Common installation paths for CLI tools\n const commonPaths = [\n `/usr/local/bin/${binaryName}`,\n `/usr/bin/${binaryName}`,\n `$HOME/.local/bin/${binaryName}`,\n `$HOME/.claude/local/bin/${binaryName}`\n ];\n\n const detectors: Array<{\n command: string;\n args: string[];\n validate: (result: CommandRunnerResult) => boolean;\n }> = [\n {\n command: \"which\",\n args: [binaryName],\n validate: (result) => result.exitCode === 0\n },\n {\n command: \"where\",\n args: [binaryName],\n validate: (result) =>\n result.exitCode === 0 && result.stdout.trim().length > 0\n },\n // Check common installation paths using shell expansion for $HOME\n {\n command: \"sh\",\n args: [\n \"-c\",\n commonPaths.map((p) => `test -f \"${p}\"`).join(\" || \")\n ],\n validate: (result) => result.exitCode === 0\n }\n ];\n\n for (const detector of detectors) {\n const result = await runCommand(detector.command, detector.args);\n if (detector.validate(result)) {\n return;\n }\n }\n\n throw new Error(`${binaryName} CLI binary not found on PATH.`);\n }\n };\n}\n", "import type {\n ConfigMergeMutation,\n ConfigPruneMutation,\n ConfigTransformMutation,\n ConfigObject,\n ValueResolver,\n MutationOptions\n} from \"../types.js\";\n\nexport interface MergeOptions {\n /** Target file path (must start with ~) */\n target: ValueResolver<string>;\n /** Value to merge into the config file */\n value: ValueResolver<ConfigObject>;\n /** Optional explicit format override */\n format?: \"json\" | \"toml\";\n /** Optional prune by prefix before merging (TOML) */\n pruneByPrefix?: Record<string, string>;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface PruneOptions {\n /** Target file path (must start with ~) */\n target: ValueResolver<string>;\n /** Shape to prune from the config file */\n shape: ValueResolver<ConfigObject>;\n /** Optional explicit format override */\n format?: \"json\" | \"toml\";\n /** Optional guard - only prune if predicate returns true */\n onlyIf?: (doc: ConfigObject, ctx: MutationOptions) => boolean;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface TransformOptions {\n /** Target file path (must start with ~) */\n target: ValueResolver<string>;\n /** Optional explicit format override */\n format?: \"json\" | \"toml\";\n /** Transform function - receives parsed content, returns transformed content */\n transform: (\n content: ConfigObject,\n ctx: MutationOptions\n ) => { content: ConfigObject | null; changed: boolean };\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nfunction merge(options: MergeOptions): ConfigMergeMutation {\n return {\n kind: \"configMerge\",\n target: options.target,\n value: options.value,\n format: options.format,\n pruneByPrefix: options.pruneByPrefix,\n label: options.label\n };\n}\n\nfunction prune(options: PruneOptions): ConfigPruneMutation {\n return {\n kind: \"configPrune\",\n target: options.target,\n shape: options.shape,\n format: options.format,\n onlyIf: options.onlyIf,\n label: options.label\n };\n}\n\nfunction transform(options: TransformOptions): ConfigTransformMutation {\n return {\n kind: \"configTransform\",\n target: options.target,\n format: options.format,\n transform: options.transform,\n label: options.label\n };\n}\n\nexport const configMutation = {\n merge,\n prune,\n transform\n};\n", "import type {\n EnsureDirectoryMutation,\n RemoveDirectoryMutation,\n RemoveFileMutation,\n ChmodMutation,\n BackupMutation,\n ValueResolver\n} from \"../types.js\";\n\nexport interface EnsureDirectoryOptions {\n /** Directory path (must start with ~) */\n path: ValueResolver<string>;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface RemoveOptions {\n /** Target file path (must start with ~) */\n target: ValueResolver<string>;\n /** Only remove if file is empty/whitespace */\n whenEmpty?: boolean;\n /** Only remove if content matches regex */\n whenContentMatches?: RegExp;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface RemoveDirectoryOptions {\n /** Directory path (must start with ~) */\n path: ValueResolver<string>;\n /** Remove directory even when not empty */\n force?: boolean;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface ChmodOptions {\n /** Target file path (must start with ~) */\n target: ValueResolver<string>;\n /** File permission mode (e.g., 0o755) */\n mode: number;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nexport interface BackupOptions {\n /** Target file path to backup (must start with ~) */\n target: ValueResolver<string>;\n /** Optional human-readable label for logging */\n label?: string;\n}\n\nfunction ensureDirectory(options: EnsureDirectoryOptions): EnsureDirectoryMutation {\n return {\n kind: \"ensureDirectory\",\n path: options.path,\n label: options.label\n };\n}\n\nfunction remove(options: RemoveOptions): RemoveFileMutation {\n return {\n kind: \"removeFile\",\n target: options.target,\n whenEmpty: options.whenEmpty,\n whenContentMatches: options.whenContentMatches,\n label: options.label\n };\n}\n\nfunction removeDirectory(\n options: RemoveDirectoryOptions\n): RemoveDirectoryMutation {\n return {\n kind: \"removeDirectory\",\n path: options.path,\n force: options.force,\n label: options.label\n };\n}\n\nfunction chmod(options: ChmodOptions): ChmodMutation {\n return {\n kind: \"chmod\",\n target: options.target,\n mode: options.mode,\n label: options.label\n };\n}\n\nfunction backup(options: BackupOptions): BackupMutation {\n return {\n kind: \"backup\",\n target: options.target,\n label: options.label\n };\n}\n\nexport const fileMutation = {\n ensureDirectory,\n remove,\n removeDirectory,\n chmod,\n backup\n};\n", "import Mustache from \"mustache\";\nimport type {\n Mutation,\n MutationContext,\n MutationOutcome,\n MutationDetails,\n ConfigObject,\n MutationOptions,\n ValueResolver,\n FileSystem\n} from \"../types.js\";\nimport { getConfigFormat, detectFormat } from \"../formats/index.js\";\nimport { resolvePath } from \"./path-utils.js\";\nimport {\n isNotFound,\n readFileIfExists,\n pathExists,\n createTimestamp\n} from \"../fs-utils.js\";\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction resolveValue<T>(\n resolver: ValueResolver<T>,\n options: MutationOptions\n): T {\n if (typeof resolver === \"function\") {\n return (resolver as (ctx: MutationOptions) => T)(options);\n }\n return resolver;\n}\n\nfunction createInvalidDocumentBackupPath(targetPath: string): string {\n const ext = targetPath.includes(\".\") ? targetPath.split(\".\").pop() : \"bak\";\n return `${targetPath}.invalid-${createTimestamp()}.${ext}`;\n}\n\nasync function backupInvalidDocument(\n fs: FileSystem,\n targetPath: string,\n content: string\n): Promise<void> {\n const backupPath = createInvalidDocumentBackupPath(targetPath);\n await fs.writeFile(backupPath, content, { encoding: \"utf8\" });\n}\n\nfunction describeMutation(kind: string, targetPath?: string): string {\n const displayPath = targetPath ?? \"target\";\n switch (kind) {\n case \"ensureDirectory\":\n return `Create ${displayPath}`;\n case \"removeDirectory\":\n return `Remove directory ${displayPath}`;\n case \"backup\":\n return `Backup ${displayPath}`;\n case \"templateWrite\":\n return `Write ${displayPath}`;\n case \"chmod\":\n return `Set permissions on ${displayPath}`;\n case \"removeFile\":\n return `Remove ${displayPath}`;\n case \"configMerge\":\n case \"configPrune\":\n case \"configTransform\":\n case \"templateMergeToml\":\n case \"templateMergeJson\":\n return `Update ${displayPath}`;\n default:\n return \"Operation\";\n }\n}\n\nfunction pruneKeysByPrefix(\n table: ConfigObject,\n prefix: string\n): ConfigObject {\n const result: ConfigObject = {};\n for (const [key, value] of Object.entries(table)) {\n if (!key.startsWith(prefix)) {\n result[key] = value;\n }\n }\n return result;\n}\n\nfunction isConfigObject(value: unknown): value is ConfigObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction mergeWithPruneByPrefix(\n base: ConfigObject,\n patch: ConfigObject,\n pruneByPrefix?: Record<string, string>\n): ConfigObject {\n const result: ConfigObject = { ...base };\n const prefixMap = pruneByPrefix ?? {};\n\n for (const [key, value] of Object.entries(patch)) {\n const current = result[key];\n const prefix = prefixMap[key];\n\n if (isConfigObject(current) && isConfigObject(value)) {\n if (prefix) {\n const pruned = pruneKeysByPrefix(current, prefix);\n result[key] = { ...pruned, ...value };\n } else {\n result[key] = mergeWithPruneByPrefix(\n current,\n value as ConfigObject,\n prefixMap\n );\n }\n continue;\n }\n result[key] = value;\n }\n return result;\n}\n\n// ============================================================================\n// Apply Mutation\n// ============================================================================\n\nexport async function applyMutation(\n mutation: Mutation,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n switch (mutation.kind) {\n case \"ensureDirectory\":\n return applyEnsureDirectory(mutation, context, options);\n case \"removeDirectory\":\n return applyRemoveDirectory(mutation, context, options);\n case \"removeFile\":\n return applyRemoveFile(mutation, context, options);\n case \"chmod\":\n return applyChmod(mutation, context, options);\n case \"backup\":\n return applyBackup(mutation, context, options);\n case \"configMerge\":\n return applyConfigMerge(mutation, context, options);\n case \"configPrune\":\n return applyConfigPrune(mutation, context, options);\n case \"configTransform\":\n return applyConfigTransform(mutation, context, options);\n case \"templateWrite\":\n return applyTemplateWrite(mutation, context, options);\n case \"templateMergeToml\":\n return applyTemplateMerge(mutation, context, options, \"toml\");\n case \"templateMergeJson\":\n return applyTemplateMerge(mutation, context, options, \"json\");\n default: {\n const never: never = mutation;\n throw new Error(`Unknown mutation kind: ${(never as Mutation).kind}`);\n }\n }\n}\n\n// ============================================================================\n// File Mutation Handlers\n// ============================================================================\n\nasync function applyEnsureDirectory(\n mutation: Extract<Mutation, { kind: \"ensureDirectory\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.path, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const existed = await pathExists(context.fs, targetPath);\n\n if (!context.dryRun) {\n await context.fs.mkdir(targetPath, { recursive: true });\n }\n\n return {\n outcome: {\n changed: !existed,\n effect: \"mkdir\",\n detail: existed ? \"noop\" : \"create\"\n },\n details\n };\n}\n\nasync function applyRemoveDirectory(\n mutation: Extract<Mutation, { kind: \"removeDirectory\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.path, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const existed = await pathExists(context.fs, targetPath);\n if (!existed) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (typeof context.fs.rm !== \"function\") {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (mutation.force) {\n if (!context.dryRun) {\n await context.fs.rm(targetPath, { recursive: true, force: true });\n }\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n }\n\n const entries = await context.fs.readdir(targetPath);\n if (entries.length > 0) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n await context.fs.rm(targetPath, { recursive: true, force: true });\n }\n\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n}\n\nasync function applyRemoveFile(\n mutation: Extract<Mutation, { kind: \"removeFile\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n try {\n const content = await context.fs.readFile(targetPath, \"utf8\");\n const trimmed = content.trim();\n\n // Check whenContentMatches guard\n if (mutation.whenContentMatches && !mutation.whenContentMatches.test(trimmed)) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n // Check whenEmpty guard\n if (mutation.whenEmpty && trimmed.length > 0) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n await context.fs.unlink(targetPath);\n }\n\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n } catch (error) {\n if (isNotFound(error)) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n throw error;\n }\n}\n\nasync function applyChmod(\n mutation: Extract<Mutation, { kind: \"chmod\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n if (typeof context.fs.chmod !== \"function\") {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n try {\n const stat = await context.fs.stat(targetPath);\n const currentMode = typeof stat.mode === \"number\" ? stat.mode & 0o777 : null;\n\n if (currentMode === mutation.mode) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n await context.fs.chmod(targetPath, mutation.mode);\n }\n\n return {\n outcome: { changed: true, effect: \"chmod\", detail: \"update\" },\n details\n };\n } catch (error) {\n if (isNotFound(error)) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n throw error;\n }\n}\n\nasync function applyBackup(\n mutation: Extract<Mutation, { kind: \"backup\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const content = await readFileIfExists(context.fs, targetPath);\n if (content === null) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n const backupPath = `${targetPath}.backup-${createTimestamp()}`;\n await context.fs.writeFile(backupPath, content, { encoding: \"utf8\" });\n }\n\n return {\n outcome: { changed: true, effect: \"copy\", detail: \"backup\" },\n details\n };\n}\n\n// ============================================================================\n// Config Mutation Handlers\n// ============================================================================\n\nasync function applyConfigMerge(\n mutation: Extract<Mutation, { kind: \"configMerge\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const formatName = mutation.format ?? detectFormat(rawPath);\n if (!formatName) {\n throw new Error(\n `Cannot detect config format for \"${rawPath}\". Provide explicit format option.`\n );\n }\n const format = getConfigFormat(formatName);\n\n const rawContent = await readFileIfExists(context.fs, targetPath);\n let current: ConfigObject;\n try {\n current = rawContent === null ? {} : format.parse(rawContent);\n } catch {\n // Invalid file - backup and start fresh\n if (rawContent !== null) {\n await backupInvalidDocument(context.fs, targetPath, rawContent);\n }\n current = {};\n }\n\n const value = resolveValue(mutation.value, options);\n\n // Use mergeWithPruneByPrefix for TOML files with pruneByPrefix option\n let merged: ConfigObject;\n if (mutation.pruneByPrefix) {\n merged = mergeWithPruneByPrefix(current, value, mutation.pruneByPrefix);\n } else {\n merged = format.merge(current, value);\n }\n\n const serialized = format.serialize(merged);\n const changed = serialized !== rawContent;\n\n if (changed && !context.dryRun) {\n await context.fs.writeFile(targetPath, serialized, { encoding: \"utf8\" });\n }\n\n return {\n outcome: {\n changed,\n effect: changed ? \"write\" : \"none\",\n detail: changed ? (rawContent === null ? \"create\" : \"update\") : \"noop\"\n },\n details\n };\n}\n\nasync function applyConfigPrune(\n mutation: Extract<Mutation, { kind: \"configPrune\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const rawContent = await readFileIfExists(context.fs, targetPath);\n if (rawContent === null) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n const formatName = mutation.format ?? detectFormat(rawPath);\n if (!formatName) {\n throw new Error(\n `Cannot detect config format for \"${rawPath}\". Provide explicit format option.`\n );\n }\n const format = getConfigFormat(formatName);\n\n let current: ConfigObject;\n try {\n current = format.parse(rawContent);\n } catch {\n // Invalid file - can't prune, leave as-is\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n // Check onlyIf guard\n if (mutation.onlyIf && !mutation.onlyIf(current, options)) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n const shape = resolveValue(mutation.shape, options);\n const { changed, result } = format.prune(current, shape);\n\n if (!changed) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n // Delete file if empty\n if (Object.keys(result).length === 0) {\n if (!context.dryRun) {\n await context.fs.unlink(targetPath);\n }\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n }\n\n const serialized = format.serialize(result);\n if (!context.dryRun) {\n await context.fs.writeFile(targetPath, serialized, { encoding: \"utf8\" });\n }\n\n return {\n outcome: { changed: true, effect: \"write\", detail: \"update\" },\n details\n };\n}\n\nasync function applyConfigTransform(\n mutation: Extract<Mutation, { kind: \"configTransform\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const formatName = mutation.format ?? detectFormat(rawPath);\n if (!formatName) {\n throw new Error(\n `Cannot detect config format for \"${rawPath}\". Provide explicit format option.`\n );\n }\n const format = getConfigFormat(formatName);\n\n const rawContent = await readFileIfExists(context.fs, targetPath);\n let current: ConfigObject;\n try {\n current = rawContent === null ? {} : format.parse(rawContent);\n } catch {\n if (rawContent !== null) {\n await backupInvalidDocument(context.fs, targetPath, rawContent);\n }\n current = {};\n }\n\n const { content: transformed, changed } = mutation.transform(current, options);\n\n if (!changed) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n // Delete file if null\n if (transformed === null) {\n if (rawContent === null) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n if (!context.dryRun) {\n await context.fs.unlink(targetPath);\n }\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n }\n\n const serialized = format.serialize(transformed);\n if (!context.dryRun) {\n await context.fs.writeFile(targetPath, serialized, { encoding: \"utf8\" });\n }\n\n return {\n outcome: {\n changed: true,\n effect: \"write\",\n detail: rawContent === null ? \"create\" : \"update\"\n },\n details\n };\n}\n\n// ============================================================================\n// Template Mutation Handlers\n// ============================================================================\n\nasync function applyTemplateWrite(\n mutation: Extract<Mutation, { kind: \"templateWrite\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n if (!context.templates) {\n throw new Error(\n \"Template mutations require a templates loader. \" +\n \"Provide templates function to runMutations context.\"\n );\n }\n\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const template = await context.templates(mutation.templateId);\n const templateContext = mutation.context\n ? resolveValue(mutation.context, options)\n : {};\n const rendered = Mustache.render(template, templateContext);\n\n const existed = await pathExists(context.fs, targetPath);\n\n if (!context.dryRun) {\n await context.fs.writeFile(targetPath, rendered, { encoding: \"utf8\" });\n }\n\n return {\n outcome: {\n changed: true,\n effect: \"write\",\n detail: existed ? \"update\" : \"create\"\n },\n details\n };\n}\n\nasync function applyTemplateMerge(\n mutation: Extract<Mutation, { kind: \"templateMergeToml\" | \"templateMergeJson\" }>,\n context: MutationContext,\n options: MutationOptions,\n formatName: \"toml\" | \"json\"\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n if (!context.templates) {\n throw new Error(\n \"Template mutations require a templates loader. \" +\n \"Provide templates function to runMutations context.\"\n );\n }\n\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const format = getConfigFormat(formatName);\n\n // Load and render template\n const template = await context.templates(mutation.templateId);\n const templateContext = mutation.context\n ? resolveValue(mutation.context, options)\n : {};\n const rendered = Mustache.render(template, templateContext);\n\n // Parse rendered template\n let templateDoc: ConfigObject;\n try {\n templateDoc = format.parse(rendered);\n } catch (error) {\n throw new Error(\n `Failed to parse rendered template \"${mutation.templateId}\" as ${formatName.toUpperCase()}: ${error}`,\n { cause: error }\n );\n }\n\n // Read and parse existing file\n const rawContent = await readFileIfExists(context.fs, targetPath);\n let current: ConfigObject;\n try {\n current = rawContent === null ? {} : format.parse(rawContent);\n } catch {\n if (rawContent !== null) {\n await backupInvalidDocument(context.fs, targetPath, rawContent);\n }\n current = {};\n }\n\n // Merge\n const merged = format.merge(current, templateDoc);\n const serialized = format.serialize(merged);\n const changed = serialized !== rawContent;\n\n if (changed && !context.dryRun) {\n await context.fs.writeFile(targetPath, serialized, { encoding: \"utf8\" });\n }\n\n return {\n outcome: {\n changed,\n effect: changed ? \"write\" : \"none\",\n detail: changed ? (rawContent === null ? \"create\" : \"update\") : \"noop\"\n },\n details\n };\n}\n", "import * as jsonc from \"jsonc-parser\";\nimport type { ConfigFormat, ConfigObject, ConfigValue } from \"../types.js\";\n\nfunction isConfigObject(value: unknown): value is ConfigObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction detectIndent(content: string): string {\n const match = content.match(/^[\\t ]+/m);\n if (match) {\n return match[0];\n }\n return \" \";\n}\n\nfunction parse(content: string): ConfigObject {\n if (!content || content.trim() === \"\") {\n return {};\n }\n const errors: jsonc.ParseError[] = [];\n const parsed = jsonc.parse(content, errors, {\n allowTrailingComma: true,\n disallowComments: false\n });\n if (errors.length > 0) {\n throw new Error(`JSON parse error: ${jsonc.printParseErrorCode(errors[0].error)}`);\n }\n if (parsed === null || parsed === undefined) {\n return {};\n }\n if (!isConfigObject(parsed)) {\n throw new Error(\"Expected JSON object.\");\n }\n return parsed;\n}\n\nfunction serialize(obj: ConfigObject): string {\n return `${JSON.stringify(obj, null, 2)}\\n`;\n}\n\nfunction merge(base: ConfigObject, patch: ConfigObject): ConfigObject {\n const result: ConfigObject = { ...base };\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n const existing = result[key];\n if (isConfigObject(existing) && isConfigObject(value)) {\n result[key] = merge(existing, value);\n continue;\n }\n result[key] = value as ConfigValue;\n }\n return result;\n}\n\nfunction prune(\n obj: ConfigObject,\n shape: ConfigObject\n): { changed: boolean; result: ConfigObject } {\n let changed = false;\n const result: ConfigObject = { ...obj };\n\n for (const [key, pattern] of Object.entries(shape)) {\n if (!(key in result)) {\n continue;\n }\n\n const current = result[key];\n\n // Empty object pattern means \"delete this key entirely\"\n if (isConfigObject(pattern) && Object.keys(pattern).length === 0) {\n delete result[key];\n changed = true;\n continue;\n }\n\n // Non-empty object pattern with object current: recurse\n if (isConfigObject(pattern) && isConfigObject(current)) {\n const { changed: childChanged, result: childResult } = prune(\n current,\n pattern\n );\n if (childChanged) {\n changed = true;\n }\n if (Object.keys(childResult).length === 0) {\n delete result[key];\n } else {\n result[key] = childResult;\n }\n continue;\n }\n\n delete result[key];\n changed = true;\n }\n\n return { changed, result };\n}\n\n/**\n * Modify JSON content at a specific path while preserving comments and formatting.\n * Uses jsonc-parser's modify() for targeted updates.\n *\n * @param content - The original JSON content (may include comments)\n * @param path - JSON path array, e.g. [\"mcpServers\", \"my-server\"]\n * @param value - The value to set (or undefined to remove)\n * @returns The modified JSON content with comments preserved\n */\nfunction modifyAtPath(\n content: string,\n path: (string | number)[],\n value: ConfigValue | undefined\n): string {\n const indent = detectIndent(content);\n const formattingOptions: jsonc.FormattingOptions = {\n tabSize: indent === \"\\t\" ? 1 : indent.length,\n insertSpaces: indent !== \"\\t\",\n eol: \"\\n\"\n };\n\n const edits = jsonc.modify(content, path, value, { formattingOptions });\n let result = jsonc.applyEdits(content, edits);\n\n if (!result.endsWith(\"\\n\")) {\n result += \"\\n\";\n }\n\n return result;\n}\n\n/**\n * Merge a patch into JSON content while preserving comments and formatting.\n * Uses jsonc.modify() for each top-level key to preserve existing comments.\n *\n * @param content - The original JSON content (may include comments)\n * @param patch - Object with values to merge\n * @returns The modified JSON content with comments preserved\n */\nfunction mergePreservingComments(\n content: string,\n patch: ConfigObject\n): string {\n let result = content || \"{}\";\n\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n result = modifyAtPath(result, [key], value);\n }\n\n return result;\n}\n\n/**\n * Remove a key from JSON content while preserving comments and formatting.\n *\n * @param content - The original JSON content\n * @param path - JSON path array to the key to remove\n * @returns The modified JSON content with comments preserved\n */\nfunction removeAtPath(content: string, path: (string | number)[]): string {\n return modifyAtPath(content, path, undefined);\n}\n\nexport { detectIndent, modifyAtPath, mergePreservingComments, removeAtPath };\n\nexport const jsonFormat: ConfigFormat = {\n parse,\n serialize,\n merge,\n prune\n};\n", "import { parse as parseToml, stringify as stringifyToml } from \"smol-toml\";\nimport type { ConfigFormat, ConfigObject, ConfigValue } from \"../types.js\";\n\nfunction isConfigObject(value: unknown): value is ConfigObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction parse(content: string): ConfigObject {\n if (!content || content.trim() === \"\") {\n return {};\n }\n const parsed = parseToml(content);\n if (!isConfigObject(parsed)) {\n throw new Error(\"Expected TOML document to be a table.\");\n }\n return parsed as ConfigObject;\n}\n\nfunction serialize(obj: ConfigObject): string {\n const serialized = stringifyToml(obj);\n return serialized.endsWith(\"\\n\") ? serialized : `${serialized}\\n`;\n}\n\nfunction merge(base: ConfigObject, patch: ConfigObject): ConfigObject {\n const result: ConfigObject = { ...base };\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n const existing = result[key];\n if (isConfigObject(existing) && isConfigObject(value)) {\n result[key] = merge(existing, value);\n continue;\n }\n result[key] = value as ConfigValue;\n }\n return result;\n}\n\nfunction prune(\n obj: ConfigObject,\n shape: ConfigObject\n): { changed: boolean; result: ConfigObject } {\n let changed = false;\n const result: ConfigObject = { ...obj };\n\n for (const [key, pattern] of Object.entries(shape)) {\n if (!(key in result)) {\n continue;\n }\n\n const current = result[key];\n\n // Empty object pattern means \"delete this key entirely\"\n if (isConfigObject(pattern) && Object.keys(pattern).length === 0) {\n delete result[key];\n changed = true;\n continue;\n }\n\n // Non-empty object pattern with object current: recurse\n if (isConfigObject(pattern) && isConfigObject(current)) {\n const { changed: childChanged, result: childResult } = prune(\n current,\n pattern\n );\n if (childChanged) {\n changed = true;\n }\n if (Object.keys(childResult).length === 0) {\n delete result[key];\n } else {\n result[key] = childResult;\n }\n continue;\n }\n\n delete result[key];\n changed = true;\n }\n\n return { changed, result };\n}\n\nexport const tomlFormat: ConfigFormat = {\n parse,\n serialize,\n merge,\n prune\n};\n", "import type { ConfigFormat } from \"../types.js\";\nimport { jsonFormat } from \"./json.js\";\nimport { tomlFormat } from \"./toml.js\";\n\nexport type FormatName = \"json\" | \"toml\";\n\nconst formatRegistry: Record<FormatName, ConfigFormat> = {\n json: jsonFormat,\n toml: tomlFormat\n};\n\nconst extensionMap: Record<string, FormatName> = {\n \".json\": \"json\",\n \".toml\": \"toml\"\n};\n\n/**\n * Get a format handler by path (auto-detect from extension) or explicit format name.\n */\nexport function getConfigFormat(pathOrFormat: string): ConfigFormat {\n // Check if it's an explicit format name\n if (pathOrFormat in formatRegistry) {\n return formatRegistry[pathOrFormat as FormatName];\n }\n\n // Try to detect from extension\n const ext = getExtension(pathOrFormat);\n const formatName = extensionMap[ext];\n\n if (!formatName) {\n throw new Error(\n `Unsupported config format. Cannot detect format from \"${pathOrFormat}\". ` +\n `Supported extensions: ${Object.keys(extensionMap).join(\", \")}. ` +\n `Supported format names: ${Object.keys(formatRegistry).join(\", \")}.`\n );\n }\n\n return formatRegistry[formatName];\n}\n\n/**\n * Detect format name from a file path.\n */\nexport function detectFormat(path: string): FormatName | undefined {\n const ext = getExtension(path);\n return extensionMap[ext];\n}\n\nfunction getExtension(path: string): string {\n const lastDot = path.lastIndexOf(\".\");\n if (lastDot === -1) {\n return \"\";\n }\n return path.slice(lastDot).toLowerCase();\n}\n\nexport { jsonFormat } from \"./json.js\";\nexport { tomlFormat } from \"./toml.js\";\n", "import path from \"node:path\";\nimport type { PathMapper } from \"../types.js\";\n\n/**\n * Expand ~ shortcut to the provided home directory.\n */\nexport function expandHome(targetPath: string, homeDir: string): string {\n if (!targetPath?.startsWith(\"~\")) {\n return targetPath;\n }\n\n // Handle ~./ -> ~/.\n if (targetPath.startsWith(\"~./\")) {\n targetPath = `~/.${targetPath.slice(3)}`;\n }\n\n let remainder = targetPath.slice(1);\n\n // Remove leading slash or backslash\n if (remainder.startsWith(\"/\") || remainder.startsWith(\"\\\\\")) {\n remainder = remainder.slice(1);\n } else if (remainder.startsWith(\".\")) {\n // Handle ~/.\n remainder = remainder.slice(1);\n if (remainder.startsWith(\"/\") || remainder.startsWith(\"\\\\\")) {\n remainder = remainder.slice(1);\n }\n }\n\n return remainder.length === 0 ? homeDir : path.join(homeDir, remainder);\n}\n\n/**\n * Validate that a path is home-relative (starts with ~).\n * Throws if the path is not home-relative.\n */\nexport function validateHomePath(targetPath: string): void {\n if (typeof targetPath !== \"string\" || targetPath.length === 0) {\n throw new Error(\"Target path must be a non-empty string.\");\n }\n\n if (!targetPath.startsWith(\"~\")) {\n throw new Error(\n `All target paths must be home-relative (start with ~). Received: \"${targetPath}\"`\n );\n }\n}\n\n/**\n * Resolve a path with optional path mapping for isolated configurations.\n * 1. Validates the path starts with ~\n * 2. Expands ~ to home directory\n * 3. If pathMapper is provided, maps the directory portion and reconstructs the path\n */\nexport function resolvePath(\n rawPath: string,\n homeDir: string,\n pathMapper?: PathMapper\n): string {\n validateHomePath(rawPath);\n const expanded = expandHome(rawPath, homeDir);\n\n if (!pathMapper) {\n return expanded;\n }\n\n // Map the directory portion\n const rawDirectory = path.dirname(expanded);\n const mappedDirectory = pathMapper.mapTargetDirectory({\n targetDirectory: rawDirectory\n });\n const filename = path.basename(expanded);\n\n return filename.length === 0 ? mappedDirectory : path.join(mappedDirectory, filename);\n}\n", "import type { FileSystem } from \"./types.js\";\n\n/**\n * Check if an error is a \"file not found\" (ENOENT) error.\n */\nexport function isNotFound(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error as { code?: string }).code === \"ENOENT\"\n );\n}\n\n/**\n * Read a file if it exists, returning null if not found.\n */\nexport async function readFileIfExists(\n fs: FileSystem,\n target: string\n): Promise<string | null> {\n try {\n return await fs.readFile(target, \"utf8\");\n } catch (error) {\n if (isNotFound(error)) {\n return null;\n }\n throw error;\n }\n}\n\n/**\n * Check if a path exists (file or directory).\n */\nexport async function pathExists(\n fs: FileSystem,\n target: string\n): Promise<boolean> {\n try {\n await fs.stat(target);\n return true;\n } catch (error) {\n if (isNotFound(error)) {\n return false;\n }\n throw error;\n }\n}\n\n/**\n * Create an ISO timestamp safe for use in filenames.\n * Replaces colons and dots with dashes.\n */\nexport function createTimestamp(): string {\n return new Date().toISOString().replaceAll(\":\", \"-\").replaceAll(\".\", \"-\");\n}\n", "import type {\n Mutation,\n MutationContext,\n MutationResult,\n MutationOptions\n} from \"../types.js\";\nimport { applyMutation } from \"./apply-mutation.js\";\n\n/**\n * Execute an array of mutations in order.\n *\n * All dependencies must be injected - no defaults, no globals.\n */\nexport async function runMutations(\n mutations: Mutation[],\n context: MutationContext,\n options?: MutationOptions\n): Promise<MutationResult> {\n const effects: MutationResult[\"effects\"] = [];\n let anyChanged = false;\n const resolverOptions = options ?? {};\n\n for (const mutation of mutations) {\n const { outcome } = await executeMutation(\n mutation,\n context,\n resolverOptions\n );\n effects.push(outcome);\n if (outcome.changed) {\n anyChanged = true;\n }\n }\n\n return {\n changed: anyChanged,\n effects\n };\n}\n\nasync function executeMutation(\n mutation: Mutation,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationResult[\"effects\"][number]; details: { kind: string; label: string; targetPath?: string } }> {\n // Call onStart observer\n context.observers?.onStart?.({\n kind: mutation.kind,\n label: mutation.label ?? mutation.kind,\n targetPath: undefined // Will be resolved during apply\n });\n\n try {\n const { outcome, details } = await applyMutation(mutation, context, options);\n\n // Call onComplete observer\n context.observers?.onComplete?.(details, outcome);\n\n return { outcome, details };\n } catch (error) {\n // Call onError observer\n context.observers?.onError?.(\n {\n kind: mutation.kind,\n label: mutation.label ?? mutation.kind,\n targetPath: undefined\n },\n error\n );\n\n // Re-throw the error\n throw error;\n }\n}\n", "import Mustache from \"mustache\";\n\nexport type TemplateVariables = Record<string, string | number | boolean | string[]>;\n\n// Disable HTML escaping - we're rendering prompts, not HTML\nconst originalEscape = Mustache.escape;\n\n/**\n * Render a mustache template with the given variables.\n * Arrays are automatically joined with newlines.\n * HTML escaping is disabled.\n */\nexport function renderTemplate(\n template: string,\n variables: TemplateVariables\n): string {\n // Pre-process variables to handle arrays\n const processed: Record<string, string | number | boolean> = {};\n for (const [key, value] of Object.entries(variables)) {\n if (Array.isArray(value)) {\n processed[key] = value.join(\"\\n\");\n } else {\n processed[key] = value;\n }\n }\n\n // Temporarily disable HTML escaping\n Mustache.escape = (text: string) => text;\n try {\n return Mustache.render(template, processed);\n } finally {\n Mustache.escape = originalEscape;\n }\n}\n", "import type {\n CommandRunner,\n CommandCheckContext,\n CommandCheck\n} from \"../utils/command-checks.js\";\n\nexport interface InstallContext {\n isDryRun: boolean;\n runCommand: CommandRunner;\n logger: (message: string) => void;\n platform: NodeJS.Platform;\n}\n\nexport interface InstallCommand {\n id: string;\n command: string;\n args: string[];\n platforms?: NodeJS.Platform[];\n}\n\nexport interface ServiceInstallDefinition {\n id: string;\n summary: string;\n check: CommandCheck;\n steps: InstallCommand[];\n postChecks?: CommandCheck[];\n successMessage?: string;\n}\n\nexport async function runServiceInstall(\n definition: ServiceInstallDefinition,\n context: InstallContext\n): Promise<boolean> {\n const checkContext: CommandCheckContext = {\n isDryRun: context.isDryRun,\n runCommand: context.runCommand\n };\n\n let needsInstall = false;\n try {\n await definition.check.run(checkContext);\n context.logger(`${definition.summary} already installed.`);\n } catch (error) {\n const detail =\n error instanceof Error ? error.message : String(error);\n context.logger(`${definition.summary} not detected: ${detail}`);\n needsInstall = true;\n }\n\n if (!needsInstall) {\n return false;\n }\n\n if (context.isDryRun) {\n logInstallDryRun(definition, context);\n return true;\n }\n\n const platformSteps = filterStepsByPlatform(definition.steps, context.platform);\n for (const step of platformSteps) {\n await runInstallStep(step, context);\n }\n\n await definition.check.run(checkContext);\n\n if (definition.postChecks) {\n for (const postCheck of definition.postChecks) {\n await postCheck.run(checkContext);\n }\n }\n\n context.logger(\n definition.successMessage ?? `${definition.summary} installed.`\n );\n return true;\n}\n\nfunction describeInstallCommand(step: InstallCommand): string {\n return `[${step.id}] ${formatCommand(step.command, step.args)}`;\n}\n\nfunction formatCommand(command: string, args: string[]): string {\n return [command, ...args.map(quoteIfNeeded)].join(\" \");\n}\n\nfunction quoteIfNeeded(value: string): string {\n if (value.length === 0) {\n return '\"\"';\n }\n if (value.includes(\" \") || value.includes(\"\\t\") || value.includes(\"\\n\")) {\n return `\"${value.replaceAll('\"', '\\\\\"')}\"`;\n }\n return value;\n}\n\nfunction filterStepsByPlatform(\n steps: InstallCommand[],\n platform: NodeJS.Platform\n): InstallCommand[] {\n return steps.filter(\n (step) => !step.platforms || step.platforms.includes(platform)\n );\n}\n\nfunction logInstallDryRun(\n definition: ServiceInstallDefinition,\n context: InstallContext\n): void {\n context.logger(`Dry run: would install ${definition.summary}.`);\n const platformSteps = filterStepsByPlatform(definition.steps, context.platform);\n for (const step of platformSteps) {\n context.logger(`Dry run: ${describeInstallCommand(step)}`);\n }\n}\n\nasync function runInstallStep(\n step: InstallCommand,\n context: InstallContext\n): Promise<void> {\n context.logger(`Running ${describeInstallCommand(step)}`);\n const result = await context.runCommand(step.command, step.args);\n if (result.exitCode !== 0) {\n const stderr = result.stderr.trim();\n const suffix = stderr.length > 0 ? `: ${stderr}` : \"\";\n throw new Error(\n `${describeInstallCommand(step)} failed with exit code ${result.exitCode}${suffix}`\n );\n }\n}\n", "import type {\n ProviderService,\n ProviderContext,\n ProviderBranding,\n ProviderConfigurePrompts,\n ProviderIsolatedEnv\n} from \"../cli/service-registry.js\";\nimport {\n runMutations,\n type Mutation,\n type MutationObservers\n} from \"@poe-code/config-mutations\";\nimport {\n runServiceInstall,\n type ServiceInstallDefinition\n} from \"../services/service-install.js\";\n// Template imports are lazy to avoid breaking tsc output when imported\n// by generate-bin-wrappers.mjs (Node.js can't resolve .hbs as ESM modules)\nconst templateImports: Record<string, () => Promise<{ default: string }>> = {\n \"python/env.hbs\": () => import(\"../templates/python/env.hbs\"),\n \"python/main.py.hbs\": () => import(\"../templates/python/main.py.hbs\"),\n \"python/requirements.txt.hbs\": () => import(\"../templates/python/requirements.txt.hbs\"),\n \"codex/config.toml.hbs\": () => import(\"../templates/codex/config.toml.hbs\"),\n};\n\nasync function loadTemplate(templateId: string): Promise<string> {\n const loader = templateImports[templateId];\n if (!loader) {\n throw new Error(`Template not found: ${templateId}`);\n }\n const module = await loader();\n return module.default;\n}\n\ninterface ManifestVersionDefinition {\n configure: Mutation[];\n unconfigure?: Mutation[];\n}\n\nexport interface ServiceRunOptions {\n observers?: MutationObservers;\n}\n\ninterface CreateProviderOptions<\n ConfigureOptions,\n UnconfigureOptions,\n SpawnOptions\n> {\n name: string;\n aliases?: string[];\n label: string;\n id: string;\n summary: string;\n branding?: ProviderBranding;\n disabled?: boolean;\n supportsStdinPrompt?: boolean;\n supportsMcpSpawn?: boolean;\n configurePrompts?: ProviderConfigurePrompts;\n postConfigureMessages?: string[];\n isolatedEnv?: ProviderIsolatedEnv;\n manifest: ManifestVersionDefinition;\n install?: ServiceInstallDefinition;\n test?: ProviderService<ConfigureOptions, UnconfigureOptions, SpawnOptions>[\"test\"];\n spawn?: ProviderService<\n ConfigureOptions,\n UnconfigureOptions,\n SpawnOptions\n >[\"spawn\"];\n}\n\nexport function createProvider<\n ConfigureOptions = any,\n UnconfigureOptions = ConfigureOptions,\n SpawnOptions = any\n>(\n opts: CreateProviderOptions<ConfigureOptions, UnconfigureOptions, SpawnOptions>\n): ProviderService<ConfigureOptions, UnconfigureOptions, SpawnOptions> {\n const provider: ProviderService<\n ConfigureOptions,\n UnconfigureOptions,\n SpawnOptions\n > = {\n id: opts.id,\n summary: opts.summary,\n name: opts.name,\n aliases: opts.aliases,\n label: opts.label,\n branding: opts.branding,\n disabled: opts.disabled,\n supportsStdinPrompt: opts.supportsStdinPrompt,\n supportsMcpSpawn: opts.supportsMcpSpawn,\n configurePrompts: opts.configurePrompts,\n postConfigureMessages: opts.postConfigureMessages,\n isolatedEnv: opts.isolatedEnv,\n async configure(context, runOptions) {\n await runMutations(opts.manifest.configure, {\n fs: context.fs,\n homeDir: context.env.homeDir,\n observers: runOptions?.observers,\n templates: loadTemplate,\n pathMapper: context.pathMapper\n }, context.options as Record<string, unknown>);\n context.command.flushDryRun({ emitIfEmpty: false });\n },\n async unconfigure(context, runOptions) {\n if (!opts.manifest.unconfigure) {\n return false;\n }\n const result = await runMutations(opts.manifest.unconfigure, {\n fs: context.fs,\n homeDir: context.env.homeDir,\n observers: runOptions?.observers,\n templates: loadTemplate,\n pathMapper: context.pathMapper\n }, context.options as Record<string, unknown>);\n context.command.flushDryRun({ emitIfEmpty: false });\n return result.changed;\n }\n };\n\n if (opts.install) {\n provider.install = createInstallRunner(opts.install);\n }\n\n if (opts.test) {\n provider.test = opts.test;\n }\n\n if (opts.spawn) {\n provider.spawn = opts.spawn;\n }\n\n return provider;\n}\n\nfunction createInstallRunner(definition: ServiceInstallDefinition) {\n return async (context: ProviderContext): Promise<void> => {\n await runServiceInstall(definition, {\n isDryRun: context.logger.context.dryRun,\n runCommand: context.command.runCommand,\n logger: (message) => context.logger.verbose(message),\n platform: context.env.platform\n });\n };\n}\n", "import {\n DEFAULT_FRONTIER_MODEL,\n FRONTIER_MODELS,\n PROVIDER_NAME\n} from \"../cli/constants.js\";\nimport {\n createBinaryExistsCheck,\n createSpawnHealthCheck\n} from \"../utils/command-checks.js\";\nimport { type ServiceInstallDefinition } from \"../services/service-install.js\";\nimport {\n configMutation,\n fileMutation\n} from \"@poe-code/config-mutations\";\nimport { createProvider } from \"./create-provider.js\";\nimport type { ProviderSpawnOptions } from \"./spawn-options.js\";\nimport { openCodeAgent } from \"@poe-code/agent-defs\";\n\nfunction providerModel(model?: string): string {\n const value = model ?? DEFAULT_FRONTIER_MODEL;\n const prefix = `${PROVIDER_NAME}/`;\n return value.startsWith(prefix) ? value : `${prefix}${value}`;\n}\n\nexport const OPEN_CODE_INSTALL_DEFINITION: ServiceInstallDefinition = {\n id: \"opencode\",\n summary: \"OpenCode CLI\",\n check: createBinaryExistsCheck(\n \"opencode\",\n \"opencode-cli-binary\",\n \"OpenCode CLI binary must exist\"\n ),\n steps: [\n {\n id: \"install-opencode-cli-npm\",\n command: \"npm\",\n args: [\"install\", \"-g\", \"opencode-ai\"]\n }\n ],\n successMessage: \"Installed OpenCode CLI via npm.\"\n};\n\nfunction getModelArgs(model?: string): string[] {\n return [\"--model\", providerModel(model)];\n}\n\nexport const openCodeService = createProvider({\n ...openCodeAgent,\n supportsStdinPrompt: false,\n configurePrompts: {\n model: {\n label: \"OpenCode model\",\n defaultValue: DEFAULT_FRONTIER_MODEL,\n choices: FRONTIER_MODELS.map((id) => ({\n title: id,\n value: id\n }))\n }\n },\n isolatedEnv: {\n agentBinary: openCodeAgent.binaryName!,\n configProbe: {\n kind: \"isolatedFile\",\n relativePath: \".config/opencode/config.json\"\n },\n env: {\n XDG_CONFIG_HOME: { kind: \"isolatedDir\", relativePath: \".config\" },\n XDG_DATA_HOME: { kind: \"isolatedDir\", relativePath: \".local/share\" }\n }\n },\n manifest: {\n configure: [\n fileMutation.ensureDirectory({ path: \"~/.config/opencode\" }),\n configMutation.merge({\n target: \"~/.config/opencode/config.json\",\n value: (ctx) => {\n const { model } = (ctx ?? {}) as { model?: string };\n return {\n $schema: \"https://opencode.ai/config.json\",\n model: providerModel(model),\n enabled_providers: [PROVIDER_NAME]\n };\n }\n }),\n fileMutation.ensureDirectory({ path: \"~/.local/share/opencode\" }),\n configMutation.merge({\n target: \"~/.local/share/opencode/auth.json\",\n value: (ctx) => {\n const { apiKey } = (ctx ?? {}) as { apiKey?: string };\n return {\n [PROVIDER_NAME]: {\n type: \"api\",\n key: apiKey ?? \"\"\n }\n };\n }\n })\n ],\n unconfigure: [\n configMutation.prune({\n target: \"~/.config/opencode/config.json\",\n shape: { enabled_providers: true }\n }),\n configMutation.prune({\n target: \"~/.local/share/opencode/auth.json\",\n shape: { [PROVIDER_NAME]: true }\n })\n ]\n },\n install: OPEN_CODE_INSTALL_DEFINITION,\n test(context) {\n return context.runCheck(\n createSpawnHealthCheck(\"opencode\", {\n model: context.model,\n expectedOutput: \"OPEN_CODE_OK\"\n })\n );\n },\n spawn(context, options) {\n const opts = (options ?? {}) as ProviderSpawnOptions;\n const args = [\n ...getModelArgs(opts.model),\n \"run\",\n opts.prompt,\n ...(opts.args ?? [])\n ];\n if (opts.cwd) {\n return context.command.runCommand(\"poe-code\", [\"wrap\", \"opencode\", ...args], {\n cwd: opts.cwd\n });\n }\n return context.command.runCommand(\"poe-code\", [\"wrap\", \"opencode\", ...args]);\n }\n});\n\nexport const provider = openCodeService;\n"],
5
+ "mappings": "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",
6
6
  "names": ["lookup", "spawnChildProcess", "text", "chalk", "chalk", "chalk", "chalk", "chalk", "chalk", "chalk", "chalk", "isCancel", "cancel", "log", "chalk", "chalk", "spawnChildProcess", "runCommand", "parse", "merge", "prune", "parse", "merge", "prune", "isConfigObject", "parse", "serialize", "merge", "prune", "path", "isConfigObject", "Mustache", "formatCommand", "provider"]
7
7
  }