poe-code 3.0.225 → 3.0.226
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent.d.ts +352 -0
- package/dist/agent.js +16713 -0
- package/dist/agent.js.map +7 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +236 -215
- package/dist/index.js.map +4 -4
- package/package.json +5 -1
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../packages/poe-agent/src/agent.ts", "../packages/poe-agent/src/runtime/config.ts", "../packages/poe-agent/src/plugins/poe-agent-plugin-mcp.ts", "../packages/poe-agent/src/plugins/parse-options.ts", "../packages/poe-agent/src/plugins/poe-agent-plugin-policy.ts", "../packages/poe-agent/src/runtime/hooks.ts", "../packages/poe-agent/src/runtime/tool-results.ts", "../packages/poe-agent/src/runtime/acp-core.ts", "../packages/poe-acp-client/src/acp-client.ts", "../packages/poe-acp-client/src/acp-transport.ts", "../packages/poe-acp-client/src/types.ts", "../packages/poe-acp-client/src/jsonrpc-message-layer.ts", "../packages/poe-acp-client/src/run-report.ts", "../packages/poe-agent/src/plugins/poe-agent-plugin-files.ts", "../packages/poe-agent/src/plugins/plugin-args.ts", "../packages/poe-agent/src/plugins/poe-agent-plugin-openai-chat-completions.ts", "../packages/poe-agent/src/runtime/provider-metadata.ts", "../packages/auth-store/src/encrypted-file-store.ts", "../packages/auth-store/src/keychain-store.ts", "../packages/auth-store/src/create-secret-store.ts", "../packages/poe-agent/src/plugins/openai-auth.ts", "../packages/poe-agent/src/plugins/poe-agent-plugin-openai-responses.ts", "../packages/poe-agent/src/plugins/poe-agent-plugin-shell.ts", "../packages/poe-agent/src/system-prompt.ts", "../packages/poe-agent/src/plugins/poe-agent-plugin-system-prompt.ts", "../packages/poe-agent/src/plugins/poe-agent-plugin-web.ts", "../packages/poe-agent/src/plugins/poe-agent-plugin-compaction.ts", "../packages/poe-agent/src/plugins/poe-agent-plugin-memory.ts", "../packages/poe-agent/src/plugins/registry.ts", "../packages/poe-agent/src/plugins/resolve-plugins.ts", "../packages/poe-agent/src/agent-session.ts", "../packages/poe-agent/src/runtime/prompts.ts", "../packages/poe-agent/src/runtime/errors.ts", "../packages/poe-agent/src/runtime/tool-names.ts", "../packages/poe-agent/src/runtime/tools.ts", "../packages/poe-agent/src/runtime/run-context.ts", "../packages/poe-agent/src/runtime/agent-host.ts", "../packages/tiny-mcp-client/src/internal.ts", "../packages/mcp-oauth/dist/client/auth-store-session-store.js", "../packages/mcp-oauth/dist/client/default-oauth-client-provider.js", "../packages/mcp-oauth/dist/client/loopback-authorization.js", "../packages/mcp-oauth/dist/client/authorization-state.js", "../packages/mcp-oauth/dist/client/pkce.js", "../packages/mcp-oauth/dist/server/jwks-token-verifier.js", "../packages/poe-agent/src/runtime/plugin-api-impl.ts", "../packages/poe-agent/src/runtime/plugin-setup.ts", "../packages/poe-agent/src/runtime/resolve-provider.ts", "../packages/poe-agent/src/runtime/transcript.ts", "../packages/poe-agent/src/plugins/poe-agent-plugin-audit-log.ts", "../packages/agent-spawn/src/register-factories.ts", "../packages/agent-harness-tools/src/paths.ts", "../packages/agent-harness-tools/src/plans.ts", "../packages/task-list/src/open.ts", "../packages/task-list/src/state-machine.ts", "../packages/task-list/src/backends/gh-issues-client.ts", "../packages/process-runner/src/docker/context.ts", "../packages/process-runner/src/docker/engine.ts", "../packages/process-runner/src/docker/docker-runner.ts", "../packages/process-runner/src/docker/args.ts", "../packages/process-runner/src/docker/docker-execution-env.ts", "../packages/process-runner/src/host/host-runner.ts", "../packages/process-runner/src/host/host-execution-env.ts", "../packages/process-runner/src/testing/mock-runner.ts", "../packages/task-list/src/backends/utils.ts", "../packages/task-list/src/backends/markdown-dir.ts", "../packages/file-lock/src/lock.ts", "../packages/task-list/src/schema/task.schema.json", "../packages/task-list/src/state.ts", "../packages/task-list/src/backends/yaml-file.ts", "../packages/task-list/src/schema/store.schema.json", "../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/gemini-cli.ts", "../packages/agent-defs/src/agents/opencode.ts", "../packages/agent-defs/src/agents/kimi.ts", "../packages/agent-defs/src/agents/goose.ts", "../packages/agent-defs/src/agents/poe-agent.ts", "../packages/agent-defs/src/registry.ts", "../packages/agent-harness-tools/src/select-agent.ts", "../packages/agent-harness-tools/src/run-logs.ts", "../packages/agent-harness-tools/src/log-stream.ts", "../packages/agent-harness-tools/src/run-poe-command.ts", "../packages/agent-harness-tools/src/binary-exists.ts", "../packages/agent-harness-tools/src/poe-command-execution.ts", "../packages/poe-code-config/src/runtime.ts", "../packages/poe-code-config/src/schema.ts", "../packages/poe-code-config/src/plan-scope.ts", "../packages/poe-code-config/src/store.ts", "../packages/config-extends/src/discover.ts", "../packages/config-extends/src/parse.ts", "../packages/config-extends/src/merge.ts", "../packages/config-extends/src/resolve.ts", "../packages/design-system/src/internal/color-support.ts", "../packages/design-system/src/components/color.ts", "../packages/design-system/src/tokens/colors.ts", "../packages/design-system/src/internal/output-format.ts", "../packages/design-system/src/internal/theme-detect.ts", "../packages/design-system/src/components/symbols.ts", "../packages/design-system/src/internal/strip-ansi.ts", "../packages/design-system/src/prompts/primitives/log.ts", "../packages/design-system/src/components/logger.ts", "../packages/design-system/src/components/table.ts", "../packages/design-system/src/components/template.ts", "../packages/design-system/src/components/browser.ts", "../packages/design-system/src/acp/writer.ts", "../packages/design-system/src/dashboard/terminal.ts", "../packages/design-system/src/explorer/state.ts", "../packages/design-system/src/prompts/index.ts", "../packages/design-system/src/prompts/primitives/cancel.ts", "../packages/config-mutations/src/formats/json.ts", "../packages/config-mutations/src/formats/toml.ts", "../packages/config-mutations/src/formats/yaml.ts", "../packages/config-mutations/src/execution/path-utils.ts", "../packages/config-mutations/src/fs-utils.ts", "../packages/poe-code-config/src/resolve.ts", "../packages/poe-code-config/src/merge.ts", "../packages/poe-code-config/src/inspect.ts", "../packages/poe-code-config/src/configured-services.ts", "../packages/providers/src/auth/api-key.ts", "../packages/providers/src/compatibility.ts", "../packages/providers/src/registry.ts", "../packages/providers/src/providers/poe.ts", "../packages/providers/src/providers/anthropic.ts", "../packages/providers/src/providers/cloudflare.ts", "../packages/poe-code-config/src/state/index.ts", "../packages/poe-code-config/src/state/jobs.ts", "../packages/poe-code-config/src/state/fs.ts", "../packages/poe-code-config/src/state/templates.ts", "../packages/agent-harness-tools/src/execution-env.ts", "../packages/agent-harness-tools/src/workspace-transfer.ts", "../packages/runner-e2b/src/factory.ts", "../packages/runner-e2b/src/sdk.ts", "../packages/runner-e2b/src/template-build.ts", "../packages/runner-e2b/src/opened-env.ts", "../packages/runner-e2b/src/job-handle.ts", "../packages/runner-e2b/src/auth-scope.ts", "../packages/runner-e2b/src/index.ts", "../packages/agent-spawn/src/observability/otel.ts", "../packages/agent-spawn/src/run-command.ts", "../packages/agent-spawn/src/types.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/goose.ts", "../packages/agent-spawn/src/configs/gemini-cli.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/parallel.ts", "../packages/agent-spawn/src/prompt-transport.ts", "../packages/agent-spawn/src/retry.ts", "../packages/agent-spawn/src/skill-bridge.ts", "../packages/agent-skill-config/src/configs.ts", "../packages/agent-skill-config/src/templates.ts", "../packages/agent-skill-config/src/resolve-skill-reference.ts", "../packages/agent-skill-config/src/git-exclude.ts", "../packages/agent-skill-config/src/bridge-active-skills.ts", "../packages/agent-hook-config/src/configs.ts", "../packages/agent-hook-config/src/read-hooks.ts", "../packages/agent-hook-config/src/event-mapping.ts", "../packages/agent-hook-config/src/transform-hooks.ts", "../packages/agent-hook-config/src/write-hooks.ts", "../packages/agent-hook-config/src/symlink-hooks.ts", "../packages/agent-hook-config/src/bridge-hooks.ts", "../packages/agent-spawn/src/adapters/utils.ts", "../packages/agent-spawn/src/adapters/claude.ts", "../packages/agent-spawn/src/adapters/codex.ts", "../packages/agent-spawn/src/adapters/kimi.ts", "../packages/agent-spawn/src/adapters/native.ts", "../packages/agent-spawn/src/adapters/opencode.ts", "../packages/agent-spawn/src/adapters/index.ts", "../packages/agent-spawn/src/acp/meta.ts", "../packages/agent-spawn/src/acp/middleware.ts", "../packages/agent-spawn/src/acp/spawn.ts", "../packages/agent-spawn/src/autonomous.ts", "../packages/agent-spawn/src/acp/replay.ts", "../packages/agent-spawn/src/acp/middlewares/spawn-log.ts", "../src/agent.ts"],
|
|
4
|
+
"sourcesContent": ["import * as fsPromises from \"node:fs/promises\";\nimport type { McpSpawnConfig } from \"@poe-code/agent-spawn\";\nimport type { CreateAgentSessionOptions } from \"./agent-session.js\";\nimport mcpPlugin from \"./plugins/poe-agent-plugin-mcp.js\";\nimport { POLICY_MODE_SESSION_KEY } from \"./plugins/poe-agent-plugin-policy.js\";\nimport { runAcpCore, type AcpModel } from \"./runtime/acp-core.js\";\nimport {\n AgentHost,\n createInMemorySpawnSession,\n type AgentHostOptions\n} from \"./runtime/agent-host.js\";\nimport { AbortError } from \"./runtime/hooks.js\";\nimport {\n createResolvedAgentConfig,\n cloneAgentPlugin,\n resolvePluginSetupOrder,\n toRuntimePlugins,\n type ResolvedAgentConfig\n} from \"./runtime/config.js\";\nimport { getResolvedProviderOptions } from \"./runtime/provider-metadata.js\";\nimport type { AgentPlugin, McpServerConfig } from \"./runtime/plugin-types.js\";\nimport { runPluginSetup } from \"./runtime/plugin-setup.js\";\nimport { collectProviders, resolveProvider } from \"./runtime/resolve-provider.js\";\nimport { createRunContext, type RunContext } from \"./runtime/run-context.js\";\nimport {\n createTranscriptWriter,\n type TranscriptFsApi,\n type TranscriptWriter\n} from \"./runtime/transcript.js\";\nimport { assertValidToolName } from \"./runtime/tool-names.js\";\nimport type {\n AcpEvent,\n AcpHost,\n ChatMessage,\n ForkRequest,\n ForkResult,\n RunOutput,\n RunResult,\n Tool,\n ToolAckResult,\n ToolCallRecord,\n ToolIntent,\n UsageInfo\n} from \"./runtime/types.js\";\n\nexport type AgentRunOptions = {\n signal?: AbortSignal;\n resume?: RunResult;\n skills?: string[];\n // Backward compatibility alias for `skills`.\n activeSkills?: string[];\n maxIterations?: number;\n acpModel?: AcpModel;\n apiKey?: string;\n baseUrl?: string;\n fetch?: typeof fetch;\n cwd?: string;\n baseSystemPrompt?: string;\n createSpawnSession?: AgentHostOptions[\"createSpawnSession\"];\n onStdout?: (chunk: string) => void;\n logPath?: string;\n};\n\ntype InternalAgentRunOptions = AgentRunOptions & {\n __legacyAutoHandleTools?: boolean;\n};\n\nexport type AcpSession = {\n events: AsyncIterable<AcpEvent>;\n acknowledge(intentId: string, result: ToolAckResult): void;\n dispose(): Promise<void>;\n};\n\nexport type AgentBuilder = {\n model(model: string): AgentBuilder;\n use(plugin: AgentPlugin): AgentBuilder;\n tools(...tools: Tool[]): AgentBuilder;\n mcp(configs: McpSpawnConfig): AgentBuilder;\n mcp(...configs: McpServerConfig[]): AgentBuilder;\n acp(prompt: string, options?: AgentRunOptions): Promise<AcpSession>;\n run(prompt: string, options?: AgentRunOptions): Promise<RunResult>;\n stream(prompt: string, options?: AgentRunOptions): AsyncIterable<AcpEvent>;\n};\n\nclass ImmutableAgentBuilder implements AgentBuilder {\n readonly #config: ResolvedAgentConfig;\n\n constructor(config?: ResolvedAgentConfig) {\n this.#config = config ?? createResolvedAgentConfig();\n }\n\n model(model: string): AgentBuilder {\n return new ImmutableAgentBuilder(\n createResolvedAgentConfig({\n ...this.#config,\n model\n })\n );\n }\n\n use(plugin: AgentPlugin): AgentBuilder {\n return new ImmutableAgentBuilder(\n createResolvedAgentConfig({\n ...this.#config,\n plugins: [...this.#config.plugins, cloneAgentPlugin(plugin)]\n })\n );\n }\n\n tools(...tools: Tool[]): AgentBuilder {\n for (const tool of tools) {\n assertValidToolName(tool.name);\n }\n\n return this.use({\n name: `inline-tools-${this.#config.plugins.length + 1}`,\n tools\n });\n }\n\n mcp(configs: McpSpawnConfig): AgentBuilder;\n mcp(...configs: McpServerConfig[]): AgentBuilder;\n mcp(...configsOrMap: [McpSpawnConfig] | McpServerConfig[]): AgentBuilder {\n const configs = normalizeMcpConfigs(configsOrMap);\n\n return new ImmutableAgentBuilder(\n createResolvedAgentConfig({\n ...this.#config,\n plugins: [...this.#config.plugins, ...configs.map((config) => mcpPlugin(config))]\n })\n );\n }\n\n async acp(prompt: string, options: AgentRunOptions = {}): Promise<AcpSession> {\n const prepared = await this.#prepareRun(options).catch((error) => {\n throw toError(error);\n });\n\n const autoHandleTools = (options as InternalAgentRunOptions).__legacyAutoHandleTools === true;\n const delegateHost = new AgentHost({\n runContext: prepared.runContext,\n model: prepared.model,\n baseSystemPrompt: prepared.baseSystemPrompt,\n maxIterations: prepared.maxIterations,\n createSpawnSession: prepared.createSpawnSession\n });\n const host = new CallerAcpHost(\n prepared.runContext,\n delegateHost,\n autoHandleTools ? delegateHost.handle.bind(delegateHost) : undefined\n );\n const events = runAcpCore({\n prompt,\n runContext: prepared.runContext,\n host,\n model: prepared.model,\n baseSystemPrompt: prepared.baseSystemPrompt,\n maxIterations: prepared.maxIterations\n });\n\n return {\n events,\n acknowledge(intentId, result) {\n host.acknowledge(intentId, result);\n },\n async dispose() {\n await prepared.runContext.dispose();\n }\n };\n }\n\n async run(prompt: string, options: AgentRunOptions = {}): Promise<RunResult> {\n const startedRun = await this.#startRun(prompt, options).catch((error) => {\n throw toError(error);\n });\n const { events, runContext } = startedRun;\n\n let completed: RunResult | undefined;\n let failed: Error | undefined;\n let usage: UsageInfo | undefined;\n let streamedOutput = \"\";\n const streamedToolCalls = new Map<\n string,\n {\n intentId: string;\n tool: string;\n args: unknown;\n status?: ToolCallRecord[\"status\"];\n result?: unknown;\n error?: string;\n }\n >();\n const transcript: TranscriptWriter | undefined = options.logPath\n ? createTranscriptWriter({\n logPath: options.logPath,\n fs: defaultTranscriptFs\n })\n : undefined;\n\n try {\n for await (const event of events) {\n await transcript?.write(event);\n\n if (event.type === \"message.delta\") {\n options.onStdout?.(event.content);\n streamedOutput += event.content;\n continue;\n }\n\n if (event.type === \"usage\") {\n usage = event.usage;\n continue;\n }\n\n if (event.type === \"tool.intent\") {\n streamedToolCalls.set(event.intentId, {\n intentId: event.intentId,\n tool: event.tool,\n args: event.args\n });\n continue;\n }\n\n if (event.type === \"tool.result\") {\n const toolCall = streamedToolCalls.get(event.intentId);\n if (toolCall) {\n toolCall.status = \"success\";\n toolCall.result = event.result;\n toolCall.error = undefined;\n }\n continue;\n }\n\n if (event.type === \"tool.error\") {\n const toolCall = streamedToolCalls.get(event.intentId);\n if (toolCall) {\n toolCall.status = \"error\";\n toolCall.error = event.error;\n toolCall.result = undefined;\n }\n continue;\n }\n\n if (event.type === \"session.complete\") {\n completed = event.result;\n continue;\n }\n\n if (event.type === \"session.error\") {\n failed = event.error;\n }\n }\n } finally {\n await transcript?.close();\n }\n\n const logFile = transcript?.filePath ?? completed?.logFile;\n const resultUsage = usage ?? completed?.usage;\n const resultMessages =\n completed?.messages ??\n (runContext.messages.length === 1 && runContext.messages[0]?.role === \"user\"\n ? []\n : [...runContext.messages]);\n const resultToolCalls =\n completed?.toolCalls ??\n Array.from(streamedToolCalls.values()).map((toolCall) => {\n if (toolCall.status === \"success\") {\n return {\n intentId: toolCall.intentId,\n tool: toolCall.tool,\n args: toolCall.args,\n status: \"success\" as const,\n result: toolCall.result\n };\n }\n\n return {\n intentId: toolCall.intentId,\n tool: toolCall.tool,\n args: toolCall.args,\n status: \"error\" as const,\n error: toolCall.error ?? failed?.message ?? \"Run ended before the tool completed.\"\n };\n });\n\n if (failed) {\n const fallback = completed ?? {\n output: streamedOutput,\n stdout: streamedOutput,\n messages: resultMessages,\n toolCalls: resultToolCalls,\n exitCode: 1,\n stderr: failed.message\n };\n\n return {\n ...fallback,\n ...(resultUsage === undefined ? {} : { usage: resultUsage }),\n ...(logFile === undefined ? {} : { logFile }),\n stdout: fallback.stdout ?? fallback.output,\n exitCode: 1,\n stderr: failed.message\n };\n }\n\n if (!completed) {\n throw new Error(\"Run ended without a terminal event.\");\n }\n\n return {\n ...completed,\n ...(resultUsage === undefined ? {} : { usage: resultUsage }),\n ...(logFile === undefined ? {} : { logFile }),\n stdout: completed.stdout ?? completed.output,\n summary: completed.summary ?? completed.output,\n exitCode: completed.exitCode ?? 0,\n stderr: completed.stderr ?? \"\"\n };\n }\n\n async *stream(prompt: string, options: AgentRunOptions = {}): AsyncIterable<AcpEvent> {\n try {\n const startedRun = await this.#startRun(prompt, options);\n for await (const event of startedRun.events) {\n yield event;\n }\n } catch (error) {\n yield {\n type: \"session.error\",\n error: toError(error)\n };\n }\n }\n\n async #startRun(prompt: string, options: AgentRunOptions): Promise<StartedRun> {\n const prepared = await this.#prepareRun(options);\n const host = new AgentHost({\n runContext: prepared.runContext,\n model: prepared.model,\n baseSystemPrompt: prepared.baseSystemPrompt,\n maxIterations: prepared.maxIterations,\n createSpawnSession: prepared.createSpawnSession\n });\n\n return {\n ...prepared,\n events: runAcpCore({\n prompt,\n runContext: prepared.runContext,\n host,\n model: prepared.model,\n baseSystemPrompt: prepared.baseSystemPrompt,\n maxIterations: prepared.maxIterations\n })\n };\n }\n\n async #prepareRun(options: AgentRunOptions): Promise<PreparedRun> {\n const activeSkills = resolveActiveSkills(options);\n const runContext = createRunContext({\n ...(activeSkills === undefined ? {} : { activeSkills })\n });\n runContext.registerDisposeHook(\n linkExternalAbortSignal(options.signal, runContext.abortController)\n );\n\n try {\n assertNotAborted(runContext.abortController.signal);\n const plugins = resolvePluginSetupOrder(toRuntimePlugins(this.#config));\n await runPluginSetup(plugins, runContext);\n assertNotAborted(runContext.abortController.signal);\n const spawnMcpServers =\n runContext.mcpServers.length === 0 ? undefined : toSpawnMcpServers(runContext.mcpServers);\n\n injectResumeMessages(runContext.messages, options.resume?.messages);\n\n const modelName = resolveModelName(this.#config.model, options.acpModel);\n assertNotAborted(runContext.abortController.signal);\n const baseSystemPrompt = options.baseSystemPrompt;\n const model =\n options.acpModel ??\n (await (async () => {\n const providers = collectProviders(plugins);\n const provider = resolveProvider(providers, modelName);\n const providerContext = {\n fetch: options.fetch ?? globalThis.fetch,\n signal: runContext.abortController.signal,\n logger: runContext.logger,\n options: getResolvedProviderOptions(provider)\n };\n\n return provider.createModel(modelName, providerContext);\n })());\n assertNotAborted(runContext.abortController.signal);\n\n return {\n runContext,\n baseSystemPrompt,\n maxIterations: options.maxIterations ?? 100,\n createSpawnSession:\n options.createSpawnSession ??\n (() => {\n const mode = runContext.session.get(\n POLICY_MODE_SESSION_KEY\n ) as CreateAgentSessionOptions[\"mode\"];\n\n return createInMemorySpawnSession({\n model: modelName,\n cwd: options.cwd ?? process.cwd(),\n ...(mode === undefined ? {} : { mode }),\n ...(options.baseUrl === undefined ? {} : { baseUrl: options.baseUrl }),\n ...(spawnMcpServers === undefined ? {} : { mcpServers: spawnMcpServers })\n });\n }),\n model\n };\n } catch (error) {\n try {\n await runContext.dispose();\n } catch (disposeError) {\n throw new AggregateError(\n [error, disposeError],\n \"Run preparation failed and disposal failed.\"\n );\n }\n\n throw error;\n }\n }\n}\n\nconst defaultTranscriptFs: TranscriptFsApi = {\n mkdir: (dir, options) => fsPromises.mkdir(dir, options).then(() => undefined),\n appendFile: (filePath, contents) => fsPromises.appendFile(filePath, contents, \"utf8\")\n};\n\nexport function agent(): AgentBuilder {\n return new ImmutableAgentBuilder();\n}\n\ntype PreparedRun = {\n runContext: RunContext;\n model: AcpModel;\n baseSystemPrompt?: string;\n maxIterations: number;\n createSpawnSession: AgentHostOptions[\"createSpawnSession\"];\n};\n\ntype StartedRun = PreparedRun & {\n events: AsyncIterable<AcpEvent>;\n};\n\nclass CallerAcpHost implements AcpHost {\n readonly #runContext: RunContext;\n readonly #delegate: Pick<AcpHost, \"fork\" | \"spawn\">;\n readonly #autoHandleIntent?: (intent: ToolIntent) => Promise<ToolAckResult>;\n readonly #pending = new Map<\n string,\n {\n resolve(result: ToolAckResult): void;\n reject(error: Error): void;\n }\n >();\n\n constructor(\n runContext: RunContext,\n delegate: Pick<AcpHost, \"fork\" | \"spawn\">,\n autoHandleIntent?: (intent: ToolIntent) => Promise<ToolAckResult>\n ) {\n this.#runContext = runContext;\n this.#delegate = delegate;\n this.#autoHandleIntent = autoHandleIntent;\n\n const onAbort = (): void => {\n this.#rejectPending(toAbortError(runContext.abortController.signal.reason));\n };\n\n if (runContext.abortController.signal.aborted) {\n onAbort();\n } else {\n runContext.abortController.signal.addEventListener(\"abort\", onAbort, { once: true });\n runContext.registerDisposeHook(() => {\n runContext.abortController.signal.removeEventListener(\"abort\", onAbort);\n });\n }\n }\n\n acknowledge(intentId: string, result: ToolAckResult): void {\n const pending = this.#pending.get(intentId);\n if (!pending) {\n throw new Error(`Unknown or already acknowledged tool intent: ${intentId}`);\n }\n\n this.#pending.delete(intentId);\n pending.resolve(result);\n }\n\n async handle(intent: ToolIntent): Promise<ToolAckResult> {\n if (this.#autoHandleIntent) {\n return this.#autoHandleIntent(intent);\n }\n\n assertNotAborted(this.#runContext.abortController.signal);\n\n if (this.#pending.has(intent.intentId)) {\n throw new Error(`Duplicate pending tool intent: ${intent.intentId}`);\n }\n\n return await new Promise<ToolAckResult>((resolve, reject) => {\n this.#pending.set(intent.intentId, { resolve, reject });\n });\n }\n\n async fork(request: ForkRequest): Promise<ForkResult> {\n return this.#delegate.fork(request);\n }\n\n async spawn(prompt: string): Promise<RunOutput> {\n return this.#delegate.spawn(prompt);\n }\n\n #rejectPending(error: Error): void {\n const pendingEntries = Array.from(this.#pending.values());\n this.#pending.clear();\n\n for (const pending of pendingEntries) {\n pending.reject(error);\n }\n }\n}\n\nfunction resolveModelName(configModel: string | undefined, model: AcpModel | undefined): string {\n const normalized = normalizeNonEmptyString(configModel);\n if (normalized) {\n return normalized;\n }\n\n if (model) {\n return \"injected-acp-model\";\n }\n\n throw new Error(\"Missing model. Configure one with .model(...).\", {\n cause: undefined\n });\n}\n\nfunction toSpawnMcpServers(\n mcpServers: ReadonlyArray<McpServerConfig>\n): NonNullable<CreateAgentSessionOptions[\"mcpServers\"]> {\n const byName: NonNullable<CreateAgentSessionOptions[\"mcpServers\"]> = {};\n\n for (const server of mcpServers) {\n byName[server.name] = {\n transport: \"stdio\",\n command: server.command,\n ...(server.args === undefined ? {} : { args: [...server.args] }),\n ...(server.env === undefined ? {} : { env: { ...server.env } })\n };\n }\n\n return byName;\n}\n\nfunction normalizeMcpConfigs(\n configsOrMap: [McpSpawnConfig] | McpServerConfig[]\n): McpServerConfig[] {\n const [first, ...rest] = configsOrMap;\n if (first === undefined) {\n return [];\n }\n\n if (rest.length > 0 || isNamedMcpServerConfig(first)) {\n return [first, ...rest] as McpServerConfig[];\n }\n\n return Object.entries(first).map(([name, server]) => ({ name, ...server }));\n}\n\nfunction isNamedMcpServerConfig(value: McpSpawnConfig | McpServerConfig): value is McpServerConfig {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof value.name === \"string\" &&\n typeof value.command === \"string\"\n );\n}\n\nfunction resolveActiveSkills(options: AgentRunOptions): string[] | undefined {\n if (options.skills !== undefined) {\n return options.skills;\n }\n\n return options.activeSkills;\n}\n\nfunction linkExternalAbortSignal(\n externalSignal: AbortSignal | undefined,\n runAbortController: AbortController\n): () => void {\n if (!externalSignal) {\n return () => undefined;\n }\n\n const onAbort = (): void => {\n if (!runAbortController.signal.aborted) {\n runAbortController.abort(externalSignal.reason);\n }\n };\n\n if (externalSignal.aborted) {\n onAbort();\n } else {\n externalSignal.addEventListener(\"abort\", onAbort, { once: true });\n }\n\n return () => {\n externalSignal.removeEventListener(\"abort\", onAbort);\n };\n}\n\nfunction assertNotAborted(signal: AbortSignal): void {\n if (!signal.aborted) {\n return;\n }\n\n throw toAbortError(signal.reason);\n}\n\nfunction toAbortError(reason: unknown): AbortError {\n if (reason instanceof AbortError) {\n return reason;\n }\n\n return new AbortError(\"Run aborted.\", reason);\n}\n\nfunction injectResumeMessages(\n target: ChatMessage[],\n source: ReadonlyArray<ChatMessage> | undefined\n): void {\n if (!source || source.length === 0) {\n return;\n }\n\n for (const message of source) {\n target.push({ ...message });\n }\n}\n\nexport function normalizeNonEmptyString(value: string | null | undefined): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction toError(value: unknown): Error {\n if (value instanceof Error) {\n return value;\n }\n\n return new Error(String(value));\n}\n", "import type { AgentPlugin, McpServerConfig } from \"./plugin-types.js\";\n\nexport type ResolvedAgentConfig = {\n model?: string;\n plugins: AgentPlugin[];\n};\n\ntype AgentPluginWithDependencies = AgentPlugin & {\n dependencies?: string[];\n dependsOn?: string[];\n};\n\nfunction cloneStringArray(values: readonly string[] | undefined): string[] | undefined {\n if (!values) {\n return undefined;\n }\n\n return [...values];\n}\n\nfunction cloneStringRecord(values: Record<string, string> | undefined): Record<string, string> | undefined {\n if (!values) {\n return undefined;\n }\n\n return { ...values };\n}\n\nfunction cloneUnknown(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(item => cloneUnknown(item));\n }\n\n if (typeof value === \"object\" && value !== null) {\n const cloned: Record<string, unknown> = {};\n\n for (const [key, entry] of Object.entries(value)) {\n cloned[key] = cloneUnknown(entry);\n }\n\n return cloned;\n }\n\n return value;\n}\n\nfunction normalizeName(name: string, label: string): string {\n const normalized = name.trim();\n if (normalized.length === 0) {\n throw new Error(`${label} name must be a non-empty string.`);\n }\n\n return normalized;\n}\n\nexport function cloneAgentPlugin(plugin: AgentPlugin): AgentPlugin {\n const dependencies = readDependencies(plugin);\n\n return Object.freeze({\n ...plugin,\n name: normalizeName(plugin.name, \"Plugin\"),\n ...(plugin.tools === undefined\n ? {}\n : {\n tools: Object.freeze(\n plugin.tools.map(tool =>\n Object.freeze({\n ...tool,\n ...(tool.inputSchema === undefined ? {} : { inputSchema: cloneUnknown(tool.inputSchema) }),\n }),\n ),\n ),\n }),\n ...(plugin.hooks === undefined\n ? {}\n : {\n hooks: Object.freeze({ ...plugin.hooks }),\n }),\n ...(dependencies.length === 0\n ? {}\n : {\n dependencies: Object.freeze(dependencies),\n }),\n } as AgentPlugin);\n}\n\nexport function cloneMcpServerConfig(config: McpServerConfig): McpServerConfig {\n return Object.freeze({\n ...config,\n name: normalizeName(config.name, \"MCP server\"),\n command: normalizeName(config.command, \"MCP server command\"),\n ...(config.args === undefined ? {} : { args: Object.freeze(cloneStringArray(config.args)) as string[] }),\n ...(config.env === undefined\n ? {}\n : { env: Object.freeze(cloneStringRecord(config.env)) as Record<string, string> }),\n }) as McpServerConfig;\n}\n\nexport function createResolvedAgentConfig(input: Partial<ResolvedAgentConfig> = {}): ResolvedAgentConfig {\n const model = input.model?.trim();\n\n return Object.freeze({\n ...(model === undefined || model.length === 0 ? {} : { model }),\n plugins: Object.freeze((input.plugins ?? []).map(plugin => cloneAgentPlugin(plugin))) as AgentPlugin[],\n }) as ResolvedAgentConfig;\n}\n\nexport function toRuntimePlugins(config: ResolvedAgentConfig): AgentPlugin[] {\n return [...config.plugins];\n}\n\nexport function resolvePluginSetupOrder(plugins: AgentPlugin[]): AgentPlugin[] {\n const byName = new Map<string, AgentPlugin>();\n\n for (const plugin of plugins) {\n const pluginName = normalizeName(plugin.name, \"Plugin\");\n if (byName.has(pluginName)) {\n throw new Error(`Duplicate plugin name \"${pluginName}\".`);\n }\n\n byName.set(pluginName, plugin);\n }\n\n const ordered: AgentPlugin[] = [];\n const visitState = new Map<string, \"visiting\" | \"visited\">();\n const stack: string[] = [];\n\n const visit = (pluginName: string): void => {\n const currentState = visitState.get(pluginName);\n\n if (currentState === \"visited\") {\n return;\n }\n\n if (currentState === \"visiting\") {\n const cycleStart = stack.indexOf(pluginName);\n const cycle = cycleStart >= 0 ? [...stack.slice(cycleStart), pluginName] : [...stack, pluginName];\n throw new Error(`Circular plugin dependencies detected: \"${cycle.join('\" -> \"')}\".`);\n }\n\n const plugin = byName.get(pluginName);\n if (!plugin) {\n throw new Error(`Unknown plugin \"${pluginName}\".`);\n }\n\n visitState.set(pluginName, \"visiting\");\n stack.push(pluginName);\n\n for (const dependencyName of readDependencies(plugin)) {\n if (dependencyName === pluginName) {\n throw new Error(`Plugin \"${pluginName}\" cannot depend on itself.`);\n }\n\n if (!byName.has(dependencyName)) {\n throw new Error(\n `Unknown plugin dependency \"${dependencyName}\" for plugin \"${pluginName}\".`,\n );\n }\n\n visit(dependencyName);\n }\n\n stack.pop();\n visitState.set(pluginName, \"visited\");\n ordered.push(plugin);\n };\n\n for (const plugin of plugins) {\n visit(normalizeName(plugin.name, \"Plugin\"));\n }\n\n return ordered;\n}\n\nfunction readDependencies(plugin: AgentPlugin): string[] {\n const dependencyValues = [\n ...(plugin as AgentPluginWithDependencies).dependencies ?? [],\n ...(plugin as AgentPluginWithDependencies).dependsOn ?? [],\n ];\n\n if (dependencyValues.length === 0) {\n return [];\n }\n\n const seen = new Set<string>();\n const normalized: string[] = [];\n\n for (const dependencyName of dependencyValues) {\n if (typeof dependencyName !== \"string\") {\n continue;\n }\n\n const name = dependencyName.trim();\n if (name.length === 0 || seen.has(name)) {\n continue;\n }\n\n seen.add(name);\n normalized.push(name);\n }\n\n return normalized;\n}\n", "import { cloneMcpServerConfig } from \"../runtime/config.js\";\nimport type { AgentPlugin, McpServerConfig } from \"../runtime/plugin-types.js\";\n\nexport default function mcpPlugin(config: McpServerConfig): AgentPlugin {\n const server = cloneMcpServerConfig(config);\n\n return Object.freeze({\n name: `mcp:${server.name}`,\n setup(api) {\n api.addMcp(server);\n },\n });\n}\n", "export function toOptionsObject(input: unknown): Record<string, unknown> {\n if (input === undefined || input === null) {\n return {};\n }\n\n if (typeof input !== \"object\" || Array.isArray(input)) {\n throw new Error(\"expected an object\");\n }\n\n return input as Record<string, unknown>;\n}\n\nexport function rejectUnknownKeys(\n input: Record<string, unknown>,\n allowedKeys: readonly string[]\n): void {\n for (const key of Object.keys(input)) {\n if (!allowedKeys.includes(key)) {\n throw new Error(`${key}: unknown option`);\n }\n }\n}\n\nexport function readOptionalString(\n input: Record<string, unknown>,\n key: string\n): string | undefined {\n const value = input[key];\n if (value === undefined) {\n return undefined;\n }\n\n if (typeof value !== \"string\") {\n throw new Error(`${key}: expected a string`);\n }\n\n return value;\n}\n\nexport function readOptionalStringArray(\n input: Record<string, unknown>,\n key: string\n): string[] | undefined {\n const value = input[key];\n if (value === undefined) {\n return undefined;\n }\n\n if (!Array.isArray(value) || !value.every((item) => typeof item === \"string\")) {\n throw new Error(`${key}: expected an array of strings`);\n }\n\n return value as string[];\n}\n\nexport function readOptionalNonNegativeInteger(\n input: Record<string, unknown>,\n key: string\n): number | undefined {\n const value = input[key];\n if (value === undefined) {\n return undefined;\n }\n\n if (typeof value !== \"number\" || !Number.isInteger(value) || value < 0) {\n throw new Error(`${key}: expected a non-negative integer`);\n }\n\n return value;\n}\n\nexport function readRequiredEnum<T extends string>(\n input: Record<string, unknown>,\n key: string,\n allowedValues: readonly T[]\n): T {\n const value = input[key];\n if (typeof value !== \"string\" || !allowedValues.includes(value as T)) {\n throw new Error(`${key}: expected one of ${allowedValues.join(\", \")}`);\n }\n\n return value as T;\n}\n", "import type { SpawnMode } from \"@poe-code/agent-spawn\";\nimport type { AgentPlugin, PluginApi } from \"../runtime/plugin-types.js\";\nimport { readRequiredEnum, rejectUnknownKeys, toOptionsObject } from \"./parse-options.js\";\nimport type { PluginSpec } from \"./registry.js\";\n\nexport type PolicyPluginOptions = {\n mode: SpawnMode | undefined | (() => SpawnMode | undefined);\n};\n\nexport const POLICY_MODE_SESSION_KEY = \"poe-agent-plugin-policy.mode\";\n\nconst policyPlugin = (options: PolicyPluginOptions): AgentPlugin => {\n let getTool: PluginApi[\"getTool\"] = () => undefined;\n\n return {\n name: \"poe-agent-plugin-policy\",\n setup(api) {\n getTool = api.getTool.bind(api);\n },\n hooks: {\n sessionStart(ctx) {\n const mode = resolveMode(options.mode);\n ctx.session.set(POLICY_MODE_SESSION_KEY, mode);\n },\n async preToolUse(ctx) {\n const mode = ctx.session.get(POLICY_MODE_SESSION_KEY) as SpawnMode | undefined;\n if (mode === undefined || mode === \"yolo\") {\n return;\n }\n\n const tool = getTool(ctx.tool);\n if (!tool?.policy) {\n return {\n reject: `Tool \"${ctx.tool}\" does not declare policy metadata and is blocked in ${mode} mode.`\n };\n }\n\n if (!tool.policy[mode]) {\n return {\n reject: `Tool \"${ctx.tool}\" is not allowed in ${mode} mode.`\n };\n }\n\n const validationError = await tool.policy.validate?.(ctx.args, mode);\n if (!validationError) {\n return;\n }\n\n return {\n reject: validationError\n };\n }\n }\n };\n};\n\nfunction resolveMode(mode: PolicyPluginOptions[\"mode\"]): SpawnMode | undefined {\n return typeof mode === \"function\" ? mode() : mode;\n}\n\nexport default policyPlugin;\n\nexport type PolicyPluginConfigOptions = {\n mode: SpawnMode;\n};\n\nexport const spec: PluginSpec<PolicyPluginConfigOptions> = {\n name: \"policy\",\n parseOptions(input) {\n const obj = toOptionsObject(input);\n rejectUnknownKeys(obj, [\"mode\"]);\n return {\n mode: readRequiredEnum(obj, \"mode\", [\"read\", \"edit\", \"yolo\"] as const),\n };\n },\n factory: options => policyPlugin(options),\n};\n", "import type {\n AgentPlugin,\n HookDecision,\n HookDispatchResult,\n HookEvent,\n HookContext,\n IterationContext,\n NotificationContext,\n PostCompactionContext,\n PreCompactionContext,\n SessionStartContext,\n StopContext,\n ToolUseContext,\n UserPromptSubmitContext\n} from \"./plugin-types.js\";\nimport type { ChatMessage, ForkResult, ToolCallRecord } from \"./types.js\";\n\ntype PluginHooks = NonNullable<AgentPlugin[\"hooks\"]>;\ntype SessionStartHook = NonNullable<PluginHooks[\"sessionStart\"]>;\ntype UserPromptSubmitHook = NonNullable<PluginHooks[\"userPromptSubmit\"]>;\ntype PreToolUseHook = NonNullable<PluginHooks[\"preToolUse\"]>;\ntype PostToolUseHook = NonNullable<PluginHooks[\"postToolUse\"]>;\ntype PreIterationHook = NonNullable<PluginHooks[\"preIteration\"]>;\ntype PostIterationHook = NonNullable<PluginHooks[\"postIteration\"]>;\ntype PreCompactionHook = NonNullable<PluginHooks[\"preCompaction\"]>;\ntype PostCompactionHook = NonNullable<PluginHooks[\"postCompaction\"]>;\ntype NotificationHook = NonNullable<PluginHooks[\"notification\"]>;\ntype StopHook = NonNullable<PluginHooks[\"stop\"]>;\ntype DisposeRun = () => void | Promise<void>;\n\nconst hookContextDisposers = new WeakMap<object, DisposeRun>();\nconst SKIPPABLE_HOOK_EVENTS = new Set<HookEvent>([\n \"preToolUse\",\n \"preIteration\",\n \"preCompaction\",\n \"notification\"\n]);\n\nfunction attachDisposeRun<TContext extends HookContext>(\n context: TContext,\n disposeRun?: DisposeRun\n): TContext {\n if (disposeRun) {\n hookContextDisposers.set(context as object, disposeRun);\n }\n\n return context;\n}\n\nasync function runHookPipeline<TContext>(\n hooks: Array<(ctx: TContext) => HookDecision | Promise<HookDecision>>,\n context: TContext\n): Promise<HookDecision> {\n let firstDecision: HookDecision = undefined;\n\n for (const hook of hooks) {\n const decision = await hook(context);\n if (firstDecision === undefined && decision !== undefined) {\n firstDecision = decision;\n }\n }\n\n return firstDecision;\n}\n\nasync function abortHookExecution(event: HookEvent, context: HookContext): Promise<never> {\n const disposeRun = hookContextDisposers.get(context as object);\n let disposeError: unknown;\n if (disposeRun) {\n try {\n await disposeRun();\n } catch (error) {\n disposeError = error;\n }\n }\n\n throw new AbortError(`Run aborted by ${event} hook decision.`, disposeError);\n}\n\nfunction isRejectDecision(decision: HookDecision): decision is { reject: string } {\n if (typeof decision !== \"object\" || decision === null) {\n return false;\n }\n\n const candidate = decision as Partial<{ reject: unknown }>;\n return typeof candidate.reject === \"string\";\n}\n\nexport class AbortError extends Error {\n constructor(message = \"Run aborted.\", cause?: unknown) {\n super(message, cause === undefined ? undefined : { cause });\n this.name = \"AbortError\";\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\nexport class HookRegistry {\n readonly #sessionStart: SessionStartHook[] = [];\n readonly #userPromptSubmit: UserPromptSubmitHook[] = [];\n readonly #preToolUse: PreToolUseHook[] = [];\n readonly #postToolUse: PostToolUseHook[] = [];\n readonly #preIteration: PreIterationHook[] = [];\n readonly #postIteration: PostIterationHook[] = [];\n readonly #preCompaction: PreCompactionHook[] = [];\n readonly #postCompaction: PostCompactionHook[] = [];\n readonly #notification: NotificationHook[] = [];\n readonly #stop: StopHook[] = [];\n\n add(plugin: AgentPlugin): void {\n if (!plugin.hooks) {\n return;\n }\n\n if (plugin.hooks.sessionStart) {\n this.#sessionStart.push(plugin.hooks.sessionStart);\n }\n\n if (plugin.hooks.userPromptSubmit) {\n this.#userPromptSubmit.push(plugin.hooks.userPromptSubmit);\n }\n\n if (plugin.hooks.preToolUse) {\n this.#preToolUse.push(plugin.hooks.preToolUse);\n }\n\n if (plugin.hooks.postToolUse) {\n this.#postToolUse.push(plugin.hooks.postToolUse);\n }\n\n if (plugin.hooks.preIteration) {\n this.#preIteration.push(plugin.hooks.preIteration);\n }\n\n if (plugin.hooks.postIteration) {\n this.#postIteration.push(plugin.hooks.postIteration);\n }\n\n if (plugin.hooks.preCompaction) {\n this.#preCompaction.push(plugin.hooks.preCompaction);\n }\n\n if (plugin.hooks.postCompaction) {\n this.#postCompaction.push(plugin.hooks.postCompaction);\n }\n\n if (plugin.hooks.notification) {\n this.#notification.push(plugin.hooks.notification);\n }\n\n if (plugin.hooks.stop) {\n this.#stop.push(plugin.hooks.stop);\n }\n }\n\n async run(event: HookEvent, ctx: HookContext): Promise<HookDecision> {\n switch (event) {\n case \"sessionStart\":\n return runHookPipeline(this.#sessionStart, ctx as SessionStartContext);\n case \"userPromptSubmit\":\n return runHookPipeline(this.#userPromptSubmit, ctx as UserPromptSubmitContext);\n case \"preToolUse\":\n return runHookPipeline(this.#preToolUse, ctx as ToolUseContext);\n case \"postToolUse\":\n return runHookPipeline(this.#postToolUse, ctx as ToolUseContext);\n case \"preIteration\":\n return runHookPipeline(this.#preIteration, ctx as IterationContext);\n case \"postIteration\":\n return runHookPipeline(this.#postIteration, ctx as IterationContext);\n case \"preCompaction\":\n return runHookPipeline(this.#preCompaction, ctx as PreCompactionContext);\n case \"postCompaction\":\n return runHookPipeline(this.#postCompaction, ctx as PostCompactionContext);\n case \"notification\":\n return runHookPipeline(this.#notification, ctx as NotificationContext);\n case \"stop\":\n return runHookPipeline(this.#stop, ctx as StopContext);\n default:\n return undefined;\n }\n }\n\n copyFrom(registry: HookRegistry): void {\n this.#sessionStart.push(...registry.#sessionStart);\n this.#userPromptSubmit.push(...registry.#userPromptSubmit);\n this.#preToolUse.push(...registry.#preToolUse);\n this.#postToolUse.push(...registry.#postToolUse);\n this.#preIteration.push(...registry.#preIteration);\n this.#postIteration.push(...registry.#postIteration);\n this.#preCompaction.push(...registry.#preCompaction);\n this.#postCompaction.push(...registry.#postCompaction);\n this.#notification.push(...registry.#notification);\n this.#stop.push(...registry.#stop);\n }\n}\n\nexport type CreateSessionStartHookContextOptions = {\n session: Map<string, unknown>;\n messages: ChatMessage[];\n signal: AbortSignal;\n disposeRun?: DisposeRun;\n};\n\nexport type CreateUserPromptSubmitHookContextOptions = {\n prompt: string;\n messages: ChatMessage[];\n signal: AbortSignal;\n disposeRun?: DisposeRun;\n};\n\nexport type CreatePreToolUseHookContextOptions = {\n tool: string;\n args: unknown;\n intentId: string;\n session: Map<string, unknown>;\n messages: ChatMessage[];\n signal: AbortSignal;\n disposeRun?: DisposeRun;\n};\n\nexport type CreatePostToolUseHookContextOptions = {\n tool: string;\n args: unknown;\n intentId: string;\n result?: unknown;\n error?: string;\n session: Map<string, unknown>;\n messages: ChatMessage[];\n signal: AbortSignal;\n disposeRun?: DisposeRun;\n};\n\nexport type CreatePreIterationHookContextOptions = {\n iterationNumber: number;\n tokenCount: number;\n messages: ChatMessage[];\n signal: AbortSignal;\n fork(prompt: string): Promise<ForkResult>;\n complete: IterationContext[\"complete\"];\n runHook: IterationContext[\"runHook\"];\n disposeRun?: DisposeRun;\n};\n\nexport type CreatePostIterationHookContextOptions = {\n iterationNumber: number;\n tokenCount: number;\n messages: ChatMessage[];\n signal: AbortSignal;\n fork(prompt: string): Promise<ForkResult>;\n complete: IterationContext[\"complete\"];\n runHook: IterationContext[\"runHook\"];\n disposeRun?: DisposeRun;\n};\n\nexport type CreatePreCompactionHookContextOptions = {\n tokenCount: number;\n force: boolean;\n messages: ChatMessage[];\n signal: AbortSignal;\n disposeRun?: DisposeRun;\n};\n\nexport type CreatePostCompactionHookContextOptions = {\n tokenCount: number;\n summary: string;\n droppedMessages: ChatMessage[];\n messages: ChatMessage[];\n signal: AbortSignal;\n disposeRun?: DisposeRun;\n};\n\nexport type CreateNotificationHookContextOptions = {\n event: string;\n message?: string;\n data?: unknown;\n messages: ChatMessage[];\n signal: AbortSignal;\n disposeRun?: DisposeRun;\n};\n\nexport type CreateStopHookContextOptions = {\n status: \"completed\" | \"error\";\n output?: string;\n error?: Error;\n toolCalls: ToolCallRecord[];\n messages: ChatMessage[];\n signal: AbortSignal;\n disposeRun?: DisposeRun;\n};\n\nexport function createSessionStartHookContext(\n options: CreateSessionStartHookContextOptions\n): SessionStartContext {\n return attachDisposeRun(\n {\n session: options.session,\n messages: options.messages,\n signal: options.signal\n },\n options.disposeRun\n );\n}\n\nexport function createUserPromptSubmitHookContext(\n options: CreateUserPromptSubmitHookContextOptions\n): UserPromptSubmitContext {\n return attachDisposeRun(\n {\n prompt: options.prompt,\n messages: options.messages,\n signal: options.signal\n },\n options.disposeRun\n );\n}\n\nexport function createPreToolUseHookContext(\n options: CreatePreToolUseHookContextOptions\n): ToolUseContext {\n return attachDisposeRun(\n {\n tool: options.tool,\n args: options.args,\n intentId: options.intentId,\n session: options.session,\n messages: options.messages,\n signal: options.signal\n },\n options.disposeRun\n );\n}\n\nexport function createPostToolUseHookContext(\n options: CreatePostToolUseHookContextOptions\n): ToolUseContext {\n return attachDisposeRun(\n {\n tool: options.tool,\n args: options.args,\n intentId: options.intentId,\n result: options.result,\n error: options.error,\n session: options.session,\n messages: options.messages,\n signal: options.signal\n },\n options.disposeRun\n );\n}\n\nexport function createPreIterationHookContext(\n options: CreatePreIterationHookContextOptions\n): IterationContext {\n return attachDisposeRun(\n {\n iterationNumber: options.iterationNumber,\n tokenCount: options.tokenCount,\n messages: options.messages,\n signal: options.signal,\n fork: options.fork,\n complete: options.complete,\n runHook: options.runHook\n },\n options.disposeRun\n );\n}\n\nexport function createPostIterationHookContext(\n options: CreatePostIterationHookContextOptions\n): IterationContext {\n return attachDisposeRun(\n {\n iterationNumber: options.iterationNumber,\n tokenCount: options.tokenCount,\n messages: options.messages,\n signal: options.signal,\n fork: options.fork,\n complete: options.complete,\n runHook: options.runHook\n },\n options.disposeRun\n );\n}\n\nexport function createPreCompactionHookContext(\n options: CreatePreCompactionHookContextOptions\n): PreCompactionContext {\n return attachDisposeRun(\n {\n tokenCount: options.tokenCount,\n force: options.force,\n messages: options.messages,\n signal: options.signal\n },\n options.disposeRun\n );\n}\n\nexport function createPostCompactionHookContext(\n options: CreatePostCompactionHookContextOptions\n): PostCompactionContext {\n return attachDisposeRun(\n {\n tokenCount: options.tokenCount,\n summary: options.summary,\n droppedMessages: options.droppedMessages,\n messages: options.messages,\n signal: options.signal\n },\n options.disposeRun\n );\n}\n\nexport function createNotificationHookContext(\n options: CreateNotificationHookContextOptions\n): NotificationContext {\n return attachDisposeRun(\n {\n event: options.event,\n message: options.message,\n data: options.data,\n messages: options.messages,\n signal: options.signal\n },\n options.disposeRun\n );\n}\n\nexport function createStopHookContext(options: CreateStopHookContextOptions): StopContext {\n return attachDisposeRun(\n {\n status: options.status,\n output: options.output,\n error: options.error,\n toolCalls: options.toolCalls,\n messages: options.messages,\n signal: options.signal\n },\n options.disposeRun\n );\n}\n\nexport async function applyHookDecision(\n event: HookEvent,\n decision: HookDecision,\n ctx: HookContext\n): Promise<HookDispatchResult> {\n if (decision === undefined) {\n return { type: \"continue\" };\n }\n\n if (decision === \"skip\") {\n if (SKIPPABLE_HOOK_EVENTS.has(event)) {\n return { type: \"skip\" };\n }\n\n return { type: \"continue\" };\n }\n\n if (decision === \"abort\") {\n await abortHookExecution(event, ctx);\n }\n\n if (isRejectDecision(decision)) {\n if (event === \"preToolUse\") {\n return {\n type: \"tool_error\",\n error: decision.reject\n };\n }\n\n await abortHookExecution(event, ctx);\n }\n\n return { type: \"continue\" };\n}\n\nexport async function dispatchHook(options: {\n registry: HookRegistry;\n event: HookEvent;\n ctx: HookContext;\n disposeRun?: DisposeRun;\n}): Promise<HookDispatchResult> {\n const context = attachDisposeRun(options.ctx, options.disposeRun);\n const decision = await options.registry.run(options.event, context);\n return applyHookDecision(options.event, decision, context);\n}\n", "import type { ChatMessage, ToolResult, ToolResultPart } from \"./types.js\";\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function isToolResultPart(value: unknown): value is ToolResultPart {\n if (!isObjectRecord(value) || typeof value.type !== \"string\") {\n return false;\n }\n\n if (value.type === \"text\") {\n return typeof value.text === \"string\";\n }\n\n if (value.type === \"image\") {\n return typeof value.mimeType === \"string\" && typeof value.data === \"string\";\n }\n\n if (value.type === \"error\") {\n return (\n typeof value.code === \"string\" &&\n typeof value.message === \"string\" &&\n typeof value.retriable === \"boolean\"\n );\n }\n\n return false;\n}\n\nexport function getStructuredToolResultParts(value: unknown): ToolResultPart[] | undefined {\n if (isToolResultPart(value)) {\n return [value];\n }\n\n if (!Array.isArray(value) || value.length === 0 || !value.every(isToolResultPart)) {\n return undefined;\n }\n\n return value;\n}\n\nexport function normalizeToolResult(value: unknown): ToolResult {\n if (typeof value === \"string\") {\n return value;\n }\n\n if (isToolResultPart(value)) {\n return value;\n }\n\n if (Array.isArray(value) && value.every(isToolResultPart)) {\n return value;\n }\n\n if (value === undefined) {\n return \"\";\n }\n\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nexport function toToolMessageContent(value: unknown): ChatMessage[\"content\"] {\n const normalized = normalizeToolResult(value);\n\n if (typeof normalized === \"string\") {\n return normalized;\n }\n\n if (!Array.isArray(normalized) && normalized.type === \"text\") {\n return normalized.text;\n }\n\n return Array.isArray(normalized) ? normalized : [normalized];\n}\n\nexport function toolResultPartToText(part: ToolResultPart): string {\n if (part.type === \"text\") {\n return part.text;\n }\n\n if (part.type === \"image\") {\n return `[image: ${part.mimeType}]`;\n }\n\n return JSON.stringify(part);\n}\n\nexport function estimateMessageContentSize(content: ChatMessage[\"content\"]): number {\n if (typeof content === \"string\") {\n return content.length;\n }\n\n return content.reduce((total, part) => total + toolResultPartToText(part).length, 0);\n}\n", "import {\n applyHookDecision,\n createPostIterationHookContext,\n createPostToolUseHookContext,\n createPreIterationHookContext,\n createPreToolUseHookContext,\n createSessionStartHookContext,\n createStopHookContext,\n createUserPromptSubmitHookContext,\n dispatchHook,\n AbortError\n} from \"./hooks.js\";\nimport type { HookContextByEvent, HookEvent, ProviderStreamEvent } from \"./plugin-types.js\";\nimport type { RunContext } from \"./run-context.js\";\nimport { estimateMessageContentSize, toToolMessageContent } from \"./tool-results.js\";\nimport type {\n AcpEvent,\n AcpHost,\n ChatMessage,\n ForkResult,\n RunResult,\n ToolResultPart,\n ToolAckResult,\n ToolCallRecord,\n ToolIntent,\n UsageInfo\n} from \"./types.js\";\n\nexport type AcpModelToolDefinition = {\n name: string;\n description?: string;\n inputSchema?: unknown;\n};\n\nexport type AcpModelResponse = {\n events: AsyncIterable<ProviderStreamEvent>;\n};\n\nexport type AcpModelRequestMessage = {\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content: string | ToolResultPart[];\n reasoning_content?: string;\n reasoning?: string;\n thinking?: Array<{\n text: string;\n signature?: string;\n }>;\n redacted_thinking?: Array<{\n data: string;\n }>;\n reasoning_details?: unknown[];\n name?: string;\n tool_call_id?: string;\n tool_calls?: Array<{\n id: string;\n type: \"function\";\n function: {\n name: string;\n arguments: string;\n };\n }>;\n};\n\nexport type AcpModel = {\n complete(request: {\n messages: AcpModelRequestMessage[];\n tools: AcpModelToolDefinition[];\n signal: AbortSignal;\n }): Promise<AcpModelResponse>;\n};\n\nexport type RunAcpCoreOptions = {\n prompt: string;\n runContext: RunContext;\n host: AcpHost;\n model: AcpModel;\n baseSystemPrompt?: string;\n maxIterations?: number;\n signal?: AbortSignal;\n disposeRun?(): void | Promise<void>;\n};\n\ntype AsyncResolver<T> = (result: IteratorResult<T>) => void;\n\ntype MutableToolOutcome = {\n intentId: string;\n tool: string;\n args: unknown;\n result?: unknown;\n error?: string;\n};\n\ntype NormalizedModelToolCall = {\n intentId: string;\n tool: string;\n args: unknown;\n rawArguments?: string;\n intentEmitted: boolean;\n};\n\ntype ModelToolError = {\n intentId: string;\n tool: string;\n args: unknown;\n error: string;\n};\n\ntype StreamToolOutcome =\n | {\n type: \"complete\";\n toolCall: NormalizedModelToolCall;\n }\n | {\n type: \"error\";\n error: ModelToolError;\n };\n\ntype CollectedModelResponse = {\n content: string;\n reasoningContent?: string;\n reasoning?: string;\n thinking?: ChatMessage[\"thinking\"];\n redactedThinking?: ChatMessage[\"redacted_thinking\"];\n reasoningDetails?: unknown[];\n toolOutcomes: StreamToolOutcome[];\n usage?: UsageInfo;\n stopReason?: Extract<ProviderStreamEvent, { type: \"stop\" }>[\"reason\"];\n};\n\ntype PendingToolUse = {\n intentId: string;\n tool?: string;\n argsDelta: string;\n intentEmitted: boolean;\n};\n\nclass AsyncEventQueue<T> implements AsyncIterableIterator<T> {\n readonly #items: T[] = [];\n readonly #resolvers: AsyncResolver<T>[] = [];\n #closed = false;\n\n push(item: T): void {\n if (this.#closed) {\n return;\n }\n\n const resolver = this.#resolvers.shift();\n if (resolver) {\n resolver({ done: false, value: item });\n return;\n }\n\n this.#items.push(item);\n }\n\n close(): void {\n if (this.#closed) {\n return;\n }\n\n this.#closed = true;\n while (this.#resolvers.length > 0) {\n const resolver = this.#resolvers.shift();\n if (!resolver) {\n continue;\n }\n resolver({ done: true, value: undefined as never });\n }\n }\n\n async next(): Promise<IteratorResult<T>> {\n if (this.#items.length > 0) {\n const value = this.#items.shift() as T;\n return { done: false, value };\n }\n\n if (this.#closed) {\n return { done: true, value: undefined as never };\n }\n\n return new Promise<IteratorResult<T>>((resolve) => {\n this.#resolvers.push(resolve);\n });\n }\n\n [Symbol.asyncIterator](): AsyncIterableIterator<T> {\n return this;\n }\n}\n\nexport function runAcpCore(options: RunAcpCoreOptions): AsyncIterable<AcpEvent> {\n const events = new AsyncEventQueue<AcpEvent>();\n\n void execute(options, events);\n\n return events;\n}\n\nasync function execute(\n options: RunAcpCoreOptions,\n events: AsyncEventQueue<AcpEvent>\n): Promise<void> {\n const signal = wireAbortSignal(options.signal, options.runContext.abortController);\n const cleanupAbortSignal = signal.cleanup;\n const toolCalls: ToolCallRecord[] = [];\n\n let terminalEmitted = false;\n const baseDisposeRun = options.disposeRun ?? (() => options.runContext.dispose());\n let disposed = false;\n let stopHookRan = false;\n const disposeRun = async (): Promise<void> => {\n if (disposed) {\n return;\n }\n\n disposed = true;\n await baseDisposeRun();\n };\n\n const emit = (event: AcpEvent): void => {\n if (terminalEmitted) {\n return;\n }\n\n events.push(event);\n };\n\n const emitTerminal = (event: AcpEvent): void => {\n if (terminalEmitted) {\n return;\n }\n\n terminalEmitted = true;\n events.push(event);\n events.close();\n };\n\n const runStopHook = async (context: {\n status: \"completed\" | \"error\";\n output?: string;\n error?: Error;\n }): Promise<void> => {\n stopHookRan = true;\n\n const stopContext = createStopHookContext({\n ...context,\n toolCalls,\n messages: options.runContext.messages,\n signal: signal.value,\n disposeRun\n });\n const stopDecision = await options.runContext.hooks.run(\"stop\", stopContext);\n await applyHookDecision(\"stop\", stopDecision, stopContext);\n };\n\n try {\n const result = await runLoop({\n ...options,\n signal: signal.value,\n emit,\n disposeRun,\n toolCalls\n });\n await runStopHook({\n status: \"completed\",\n output: result.output\n });\n\n await disposeRun();\n emitTerminal({\n type: \"session.complete\",\n result: {\n ...result,\n messages: [...options.runContext.messages],\n toolCalls: [...toolCalls]\n }\n });\n } catch (error) {\n let finalError = toError(error);\n\n if (!stopHookRan) {\n try {\n await runStopHook({\n status: \"error\",\n error: finalError\n });\n } catch (stopError) {\n finalError = new AggregateError(\n [finalError, toError(stopError)],\n \"Run failed and stop hook failed.\"\n );\n }\n }\n\n try {\n await disposeRun();\n } catch (disposeError) {\n finalError = new AggregateError(\n [finalError, disposeError],\n \"Run failed and disposal failed.\"\n );\n }\n\n emitTerminal({ type: \"session.error\", error: finalError });\n } finally {\n cleanupAbortSignal();\n events.close();\n }\n}\n\nasync function runLoop(\n options: RunAcpCoreOptions & {\n signal: AbortSignal;\n emit(event: AcpEvent): void;\n toolCalls: ToolCallRecord[];\n }\n): Promise<RunResult> {\n assertNotAborted(options.signal);\n\n let prompt = options.prompt;\n let iterationNumber = 0;\n\n const sessionStartContext = createSessionStartHookContext({\n session: options.runContext.session,\n messages: options.runContext.messages,\n signal: options.signal,\n disposeRun: options.disposeRun\n });\n const sessionStartDecision = await options.runContext.hooks.run(\n \"sessionStart\",\n sessionStartContext\n );\n await applyHookDecision(\"sessionStart\", sessionStartDecision, sessionStartContext);\n\n const promptMessage: ChatMessage = {\n role: \"user\",\n content: prompt\n };\n options.runContext.messages.push(promptMessage);\n\n const userPromptContext = createUserPromptSubmitHookContext({\n prompt,\n messages: options.runContext.messages,\n signal: options.signal,\n disposeRun: options.disposeRun\n });\n const userPromptDecision = await options.runContext.hooks.run(\n \"userPromptSubmit\",\n userPromptContext\n );\n await applyHookDecision(\"userPromptSubmit\", userPromptDecision, userPromptContext);\n prompt = syncSubmittedUserPrompt(promptMessage, prompt, userPromptContext.prompt);\n\n while (true) {\n assertNotAborted(options.signal);\n\n iterationNumber += 1;\n\n if (options.maxIterations !== undefined && iterationNumber > options.maxIterations) {\n throw new AbortError(\"Maximum tool call iterations reached.\");\n }\n\n const preIterationContext = createPreIterationHookContext({\n iterationNumber,\n tokenCount: estimateTokenCount(options.runContext.messages),\n messages: options.runContext.messages,\n signal: options.signal,\n fork: createForkRunner({\n host: options.host,\n emit: options.emit,\n messages: options.runContext.messages,\n toolCalls: options.toolCalls\n }),\n complete: createIterationCompleteRunner({\n model: options.model,\n signal: options.signal\n }),\n runHook: createIterationHookRunner({\n runContext: options.runContext,\n disposeRun: options.disposeRun\n }),\n disposeRun: options.disposeRun\n });\n const preIterationDecision = await options.runContext.hooks.run(\n \"preIteration\",\n preIterationContext\n );\n const preIterationDispatch = await applyHookDecision(\n \"preIteration\",\n preIterationDecision,\n preIterationContext\n );\n\n if (preIterationDispatch.type === \"skip\") {\n await runPostIterationHooks({\n runContext: options.runContext,\n model: options.model,\n signal: options.signal,\n iterationNumber,\n toolCalls: options.toolCalls,\n host: options.host,\n emit: options.emit,\n disposeRun: options.disposeRun\n });\n continue;\n }\n\n const compiledPrompt = await options.runContext.prompts.compile(\n prompt,\n options.baseSystemPrompt\n );\n\n const response = await options.model.complete({\n messages: toModelRequestMessages(options.runContext.messages, compiledPrompt.system),\n tools: options.runContext.tools\n .getActiveTools(options.runContext.activeSkills)\n .map((tool) => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema\n })),\n signal: options.signal\n });\n\n const collectedResponse = await collectModelResponseEvents({\n response,\n emit: options.emit\n });\n\n if (collectedResponse.usage) {\n options.emit({\n type: \"usage\",\n usage: collectedResponse.usage\n });\n }\n\n options.runContext.messages.push(createAssistantMessage(collectedResponse));\n\n for (const toolOutcome of collectedResponse.toolOutcomes) {\n assertNotAborted(options.signal);\n\n if (toolOutcome.type === \"error\") {\n await emitToolExecutionError({\n ...toolOutcome.error,\n runContext: options.runContext,\n emit: options.emit,\n toolCalls: options.toolCalls\n });\n continue;\n }\n\n await runSingleToolCall({\n toolCall: toolOutcome.toolCall,\n runContext: options.runContext,\n host: options.host,\n emit: options.emit,\n signal: options.signal,\n toolCalls: options.toolCalls,\n disposeRun: options.disposeRun\n });\n }\n\n await runPostIterationHooks({\n runContext: options.runContext,\n model: options.model,\n signal: options.signal,\n iterationNumber,\n toolCalls: options.toolCalls,\n host: options.host,\n emit: options.emit,\n disposeRun: options.disposeRun\n });\n\n if (collectedResponse.toolOutcomes.length === 0) {\n return {\n output: collectedResponse.content,\n stdout: collectedResponse.content,\n summary: collectedResponse.content,\n messages: [...options.runContext.messages],\n toolCalls: [...options.toolCalls],\n exitCode: 0,\n stderr: \"\"\n };\n }\n }\n}\n\nasync function runSingleToolCall(options: {\n toolCall: NormalizedModelToolCall;\n runContext: RunContext;\n host: AcpHost;\n emit(event: AcpEvent): void;\n signal: AbortSignal;\n toolCalls: ToolCallRecord[];\n disposeRun?(): void | Promise<void>;\n}): Promise<void> {\n const preToolContext = createPreToolUseHookContext({\n tool: options.toolCall.tool,\n args: options.toolCall.args,\n intentId: options.toolCall.intentId,\n session: options.runContext.session,\n messages: options.runContext.messages,\n signal: options.signal,\n disposeRun: options.disposeRun\n });\n\n const preToolDecision = await options.runContext.hooks.run(\"preToolUse\", preToolContext);\n const preToolDispatch = await applyHookDecision(\"preToolUse\", preToolDecision, preToolContext);\n\n const mutableOutcome: MutableToolOutcome = {\n intentId: preToolContext.intentId,\n tool: preToolContext.tool,\n args: preToolContext.args\n };\n\n if (preToolDispatch.type === \"skip\") {\n mutableOutcome.error = \"Tool call skipped by preToolUse hook.\";\n } else if (preToolDispatch.type === \"tool_error\") {\n mutableOutcome.error = preToolDispatch.error;\n } else {\n if (!options.toolCall.intentEmitted) {\n options.emit({\n type: \"tool.intent\",\n intentId: mutableOutcome.intentId,\n tool: mutableOutcome.tool,\n args: mutableOutcome.args\n });\n }\n\n const intent: ToolIntent = {\n intentId: mutableOutcome.intentId,\n tool: mutableOutcome.tool,\n args: mutableOutcome.args\n };\n\n const ack = await waitForToolAck({\n host: options.host,\n intent,\n signal: options.signal\n });\n\n if (ack.status === \"success\") {\n mutableOutcome.result = ack.result;\n } else {\n mutableOutcome.error = toToolErrorText(ack.result);\n }\n }\n\n const postToolContext = createPostToolUseHookContext({\n tool: mutableOutcome.tool,\n args: mutableOutcome.args,\n intentId: mutableOutcome.intentId,\n result: mutableOutcome.result,\n error: mutableOutcome.error,\n session: options.runContext.session,\n messages: options.runContext.messages,\n signal: options.signal,\n disposeRun: options.disposeRun\n });\n const postToolDecision = await options.runContext.hooks.run(\"postToolUse\", postToolContext);\n await applyHookDecision(\"postToolUse\", postToolDecision, postToolContext);\n\n if (postToolContext.error !== undefined) {\n mutableOutcome.error = postToolContext.error;\n mutableOutcome.result = undefined;\n } else {\n mutableOutcome.result = postToolContext.result;\n mutableOutcome.error = undefined;\n }\n\n if (mutableOutcome.error === undefined) {\n options.emit({\n type: \"tool.result\",\n intentId: mutableOutcome.intentId,\n result: mutableOutcome.result\n });\n\n options.runContext.messages.push({\n role: \"tool\",\n name: mutableOutcome.tool,\n toolCallId: mutableOutcome.intentId,\n content: toToolMessageContent(mutableOutcome.result)\n });\n\n options.toolCalls.push({\n intentId: mutableOutcome.intentId,\n tool: mutableOutcome.tool,\n args: mutableOutcome.args,\n status: \"success\",\n result: mutableOutcome.result\n });\n\n return;\n }\n\n await emitToolExecutionError({\n intentId: mutableOutcome.intentId,\n tool: mutableOutcome.tool,\n args: mutableOutcome.args,\n error: mutableOutcome.error,\n runContext: options.runContext,\n emit: options.emit,\n toolCalls: options.toolCalls\n });\n}\n\nasync function runPostIterationHooks(options: {\n runContext: RunContext;\n model: AcpModel;\n signal: AbortSignal;\n iterationNumber: number;\n toolCalls: ToolCallRecord[];\n host: AcpHost;\n emit(event: AcpEvent): void;\n disposeRun?(): void | Promise<void>;\n}): Promise<void> {\n const postIterationContext = createPostIterationHookContext({\n iterationNumber: options.iterationNumber,\n tokenCount: estimateTokenCount(options.runContext.messages),\n messages: options.runContext.messages,\n signal: options.signal,\n fork: createForkRunner({\n host: options.host,\n emit: options.emit,\n messages: options.runContext.messages,\n toolCalls: options.toolCalls\n }),\n complete: createIterationCompleteRunner({\n model: options.model,\n signal: options.signal\n }),\n runHook: createIterationHookRunner({\n runContext: options.runContext,\n disposeRun: options.disposeRun\n }),\n disposeRun: options.disposeRun\n });\n const postIterationDecision = await options.runContext.hooks.run(\n \"postIteration\",\n postIterationContext\n );\n await applyHookDecision(\"postIteration\", postIterationDecision, postIterationContext);\n}\n\ntype ForkRunnerOptions = {\n host: AcpHost;\n emit(event: AcpEvent): void;\n messages: ChatMessage[];\n toolCalls: ToolCallRecord[];\n};\n\nfunction createForkRunner(options: ForkRunnerOptions): (prompt: string) => Promise<ForkResult> {\n let sequence = 0;\n\n return async (prompt: string): Promise<ForkResult> => {\n sequence += 1;\n const forkId = `fork-${sequence}`;\n\n options.emit({\n type: \"fork.start\",\n forkId,\n prompt\n });\n\n try {\n const result = await options.host.fork({\n forkId,\n prompt,\n context: {\n messages: [...options.messages],\n toolCalls: [...options.toolCalls]\n }\n });\n\n options.emit({\n type: \"fork.complete\",\n forkId,\n result\n });\n\n return result;\n } catch (error) {\n const message = toError(error).message;\n\n options.emit({\n type: \"fork.error\",\n forkId,\n error: message\n });\n\n throw error;\n }\n };\n}\n\nfunction createIterationCompleteRunner(options: { model: AcpModel; signal: AbortSignal }) {\n return async (messages: ChatMessage[]): Promise<string> => {\n assertNotAborted(options.signal);\n\n const response = await options.model.complete({\n messages: toModelRequestMessages(messages, undefined),\n tools: [],\n signal: options.signal\n });\n\n return (await collectModelResponseEvents({ response })).content;\n };\n}\n\nfunction createIterationHookRunner(options: {\n runContext: RunContext;\n disposeRun?(): void | Promise<void>;\n}) {\n return async <TEvent extends HookEvent>(event: TEvent, context: HookContextByEvent[TEvent]) =>\n dispatchHook({\n registry: options.runContext.hooks,\n event,\n ctx: context,\n disposeRun: options.disposeRun\n });\n}\n\nfunction syncSubmittedUserPrompt(\n promptMessage: ChatMessage,\n originalPrompt: string,\n prompt: string\n): string {\n if (typeof promptMessage.content === \"string\" && promptMessage.content !== originalPrompt) {\n return promptMessage.content;\n }\n\n promptMessage.content = prompt;\n return prompt;\n}\n\nasync function collectModelResponseEvents(options: {\n response: AcpModelResponse;\n emit?(event: AcpEvent): void;\n}): Promise<CollectedModelResponse> {\n const contentChunks: string[] = [];\n const thinking: NonNullable<ChatMessage[\"thinking\"]> = [];\n const redactedThinking: NonNullable<ChatMessage[\"redacted_thinking\"]> = [];\n const reasoningDetails: unknown[] = [];\n const toolOutcomes: StreamToolOutcome[] = [];\n const pendingToolUses = new Map<string, PendingToolUse>();\n let usage: UsageInfo | undefined;\n let stopReason: CollectedModelResponse[\"stopReason\"];\n\n for await (const event of options.response.events) {\n switch (event.type) {\n case \"text\":\n if (event.text.length === 0) {\n continue;\n }\n contentChunks.push(event.text);\n options.emit?.({\n type: \"message.delta\",\n content: event.text\n });\n break;\n case \"thinking\":\n if (event.text.length === 0) {\n continue;\n }\n appendThinkingChunk(thinking, event);\n break;\n case \"redacted_thinking\":\n redactedThinking.push({ data: event.data });\n break;\n case \"reasoning_details\":\n reasoningDetails.push(event.payload);\n break;\n case \"tool_use_delta\": {\n const pendingToolUse = getPendingToolUse(pendingToolUses, event.id);\n if (event.name !== undefined) {\n pendingToolUse.tool = normalizeToolName(event.name) ?? pendingToolUse.tool;\n }\n if (event.argsDelta !== undefined && event.argsDelta.length > 0) {\n pendingToolUse.argsDelta += event.argsDelta;\n }\n maybeEmitPendingToolIntent(pendingToolUse, options.emit);\n break;\n }\n case \"tool_use_complete\": {\n const pendingToolUse = getPendingToolUse(pendingToolUses, event.id);\n const tool = normalizeToolName(event.name);\n if (tool === undefined) {\n pendingToolUses.delete(event.id);\n break;\n }\n\n toolOutcomes.push({\n type: \"complete\",\n toolCall: {\n intentId: event.id,\n tool,\n args: event.args,\n rawArguments:\n pendingToolUse.argsDelta.length > 0\n ? pendingToolUse.argsDelta\n : typeof event.args === \"string\"\n ? event.args\n : undefined,\n intentEmitted: pendingToolUse.intentEmitted\n }\n });\n pendingToolUses.delete(event.id);\n break;\n }\n case \"tool_use_json_parse_error\": {\n const pendingToolUse = getPendingToolUse(pendingToolUses, event.id);\n toolOutcomes.push({\n type: \"error\",\n error: {\n intentId: event.id,\n tool: pendingToolUse.tool ?? \"unknown\",\n args: event.raw,\n error: event.error\n }\n });\n pendingToolUses.delete(event.id);\n break;\n }\n case \"usage\":\n usage = {\n inputTokens: event.inputTokens,\n outputTokens: event.outputTokens,\n cachedTokens: event.cachedTokens,\n cacheCreationTokens: event.cacheCreationTokens\n };\n break;\n case \"stop\":\n stopReason = event.reason;\n break;\n }\n }\n\n const reasoningContent =\n thinking.length === 0 ? undefined : thinking.map((entry) => entry.text).join(\"\");\n\n return {\n content: contentChunks.join(\"\"),\n ...(reasoningContent === undefined ? {} : { reasoningContent, reasoning: reasoningContent }),\n ...(thinking.length === 0 ? {} : { thinking }),\n ...(redactedThinking.length === 0 ? {} : { redactedThinking }),\n ...(reasoningDetails.length === 0 ? {} : { reasoningDetails }),\n toolOutcomes,\n ...(usage === undefined ? {} : { usage }),\n ...(stopReason === undefined ? {} : { stopReason })\n };\n}\n\nfunction appendThinkingChunk(\n thinking: NonNullable<ChatMessage[\"thinking\"]>,\n event: Extract<ProviderStreamEvent, { type: \"thinking\" }>\n): void {\n const lastChunk = thinking.at(-1);\n if (lastChunk && lastChunk.signature === event.signature) {\n lastChunk.text += event.text;\n return;\n }\n\n thinking.push({\n text: event.text,\n ...(event.signature === undefined ? {} : { signature: event.signature })\n });\n}\n\nfunction getPendingToolUse(\n pendingToolUses: Map<string, PendingToolUse>,\n intentId: string\n): PendingToolUse {\n const existing = pendingToolUses.get(intentId);\n if (existing) {\n return existing;\n }\n\n const pendingToolUse: PendingToolUse = {\n intentId,\n argsDelta: \"\",\n intentEmitted: false\n };\n pendingToolUses.set(intentId, pendingToolUse);\n return pendingToolUse;\n}\n\nfunction maybeEmitPendingToolIntent(\n pendingToolUse: PendingToolUse,\n emit: ((event: AcpEvent) => void) | undefined\n): void {\n if (\n !emit ||\n pendingToolUse.intentEmitted ||\n pendingToolUse.tool === undefined ||\n pendingToolUse.argsDelta.length === 0\n ) {\n return;\n }\n\n const parsedArgs = tryParseJson(pendingToolUse.argsDelta);\n if (!parsedArgs.ok) {\n return;\n }\n\n emit({\n type: \"tool.intent\",\n intentId: pendingToolUse.intentId,\n tool: pendingToolUse.tool,\n args: parsedArgs.value\n });\n pendingToolUse.intentEmitted = true;\n}\n\nfunction normalizeToolName(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction createAssistantMessage(response: CollectedModelResponse): ChatMessage {\n const message: ChatMessage = {\n role: \"assistant\",\n content: response.content,\n ...(response.reasoningContent === undefined\n ? {}\n : {\n reasoning_content: response.reasoningContent\n }),\n ...(response.reasoning === undefined\n ? {}\n : {\n reasoning: response.reasoning\n }),\n ...(response.thinking === undefined\n ? {}\n : {\n thinking: response.thinking.map((entry) => ({ ...entry }))\n }),\n ...(response.redactedThinking === undefined\n ? {}\n : {\n redacted_thinking: response.redactedThinking.map((entry) => ({ ...entry }))\n }),\n ...(response.reasoningDetails === undefined\n ? {}\n : {\n reasoning_details: [...response.reasoningDetails]\n })\n };\n\n const toolCalls = response.toolOutcomes\n .filter(\n (toolOutcome): toolOutcome is Extract<StreamToolOutcome, { type: \"complete\" }> =>\n toolOutcome.type === \"complete\"\n )\n .map((toolOutcome) => ({\n id: toolOutcome.toolCall.intentId,\n type: \"function\" as const,\n function: {\n name: toolOutcome.toolCall.tool,\n arguments:\n toolOutcome.toolCall.rawArguments ?? serializeToolArguments(toolOutcome.toolCall.args)\n }\n }));\n\n if (toolCalls.length === 0) {\n return message;\n }\n\n return {\n ...message,\n tool_calls: toolCalls\n };\n}\n\nfunction toModelRequestMessages(\n messages: ChatMessage[],\n compiledSystemPrompt: string | undefined\n): AcpModelRequestMessage[] {\n const modelMessages: AcpModelRequestMessage[] = [];\n\n if (\n compiledSystemPrompt !== undefined &&\n compiledSystemPrompt.length > 0 &&\n !hasSystemMessage(messages)\n ) {\n modelMessages.push({\n role: \"system\",\n content: compiledSystemPrompt\n });\n }\n\n for (const message of messages) {\n let modelMessage: AcpModelRequestMessage;\n if (message.role === \"tool\") {\n modelMessage = {\n role: message.role,\n ...(message.toolCallId === undefined ? {} : { tool_call_id: message.toolCallId }),\n ...(message.name === undefined ? {} : { name: message.name }),\n content: message.content\n };\n } else {\n modelMessage = {\n role: message.role,\n content: message.content,\n ...(message.reasoning_content === undefined\n ? {}\n : {\n reasoning_content: message.reasoning_content\n }),\n ...(message.reasoning === undefined\n ? {}\n : {\n reasoning: message.reasoning\n }),\n ...(message.thinking === undefined\n ? {}\n : {\n thinking: message.thinking.map((entry) => ({ ...entry }))\n }),\n ...(message.redacted_thinking === undefined\n ? {}\n : {\n redacted_thinking: message.redacted_thinking.map((entry) => ({ ...entry }))\n }),\n ...(message.reasoning_details === undefined\n ? {}\n : {\n reasoning_details: [...message.reasoning_details]\n })\n };\n\n if (message.name !== undefined) {\n modelMessage.name = message.name;\n }\n }\n\n const maybeToolCalls = message.tool_calls;\n if (maybeToolCalls && maybeToolCalls.length > 0) {\n modelMessage.tool_calls = maybeToolCalls;\n }\n\n modelMessages.push(modelMessage);\n }\n\n return modelMessages;\n}\n\nfunction hasSystemMessage(messages: ChatMessage[]): boolean {\n for (const message of messages) {\n if (message.role === \"system\") {\n return true;\n }\n }\n\n return false;\n}\n\nfunction estimateTokenCount(messages: ChatMessage[]): number {\n let count = 0;\n\n for (const message of messages) {\n count += estimateMessageContentSize(message.content);\n }\n\n return count;\n}\n\nfunction serializeToolArguments(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nfunction tryParseJson(value: string): { ok: true; value: unknown } | { ok: false } {\n if (value.length === 0) {\n return {\n ok: true,\n value: {}\n };\n }\n\n try {\n return {\n ok: true,\n value: JSON.parse(value) as unknown\n };\n } catch {\n return { ok: false };\n }\n}\n\nasync function emitToolExecutionError(options: {\n intentId: string;\n tool: string;\n args: unknown;\n error: string;\n runContext: RunContext;\n emit(event: AcpEvent): void;\n toolCalls: ToolCallRecord[];\n}): Promise<void> {\n options.emit({\n type: \"tool.error\",\n intentId: options.intentId,\n error: options.error\n });\n\n options.runContext.messages.push({\n role: \"tool\",\n name: options.tool,\n toolCallId: options.intentId,\n content: `Error: ${options.error}`\n });\n\n options.toolCalls.push({\n intentId: options.intentId,\n tool: options.tool,\n args: options.args,\n status: \"error\",\n error: options.error\n });\n}\n\nfunction toToolErrorText(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n\n if (value instanceof Error) {\n return value.message;\n }\n\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nasync function waitForToolAck(options: {\n host: AcpHost;\n intent: ToolIntent;\n signal: AbortSignal;\n}): Promise<ToolAckResult> {\n assertNotAborted(options.signal);\n\n let abortListener: (() => void) | undefined;\n const abortPromise = new Promise<never>((_, reject) => {\n abortListener = () => {\n reject(new AbortError(\"Run aborted.\", options.signal.reason));\n };\n\n if (options.signal.aborted) {\n abortListener();\n return;\n }\n\n options.signal.addEventListener(\"abort\", abortListener, { once: true });\n });\n\n try {\n return await Promise.race([options.host.handle(options.intent), abortPromise]);\n } finally {\n if (abortListener) {\n options.signal.removeEventListener(\"abort\", abortListener);\n }\n }\n}\n\nfunction toError(value: unknown): Error {\n if (value instanceof Error) {\n return value;\n }\n\n return new Error(String(value));\n}\n\nfunction assertNotAborted(signal: AbortSignal): void {\n if (!signal.aborted) {\n return;\n }\n\n throw new AbortError(\"Run aborted.\", signal.reason);\n}\n\nfunction wireAbortSignal(\n externalSignal: AbortSignal | undefined,\n runAbortController: AbortController\n): {\n value: AbortSignal;\n cleanup(): void;\n} {\n if (!externalSignal) {\n return {\n value: runAbortController.signal,\n cleanup() {\n return;\n }\n };\n }\n\n const onAbort = (): void => {\n if (!runAbortController.signal.aborted) {\n runAbortController.abort(externalSignal.reason);\n }\n };\n\n if (externalSignal.aborted) {\n onAbort();\n } else {\n externalSignal.addEventListener(\"abort\", onAbort, { once: true });\n }\n\n return {\n value: runAbortController.signal,\n cleanup() {\n externalSignal.removeEventListener(\"abort\", onAbort);\n }\n };\n}\n", "import { isAbsolute } from \"node:path\";\nimport {\n AcpTransport,\n type AcpTransportClosedEvent,\n type AcpTransportOptions,\n} from \"./acp-transport.js\";\nimport type { JsonRpcRequestOptions } from \"./jsonrpc-message-layer.js\";\nimport {\n ACP_ERROR_CODE_INVALID_PARAMS,\n ACP_ERROR_CODE_RESOURCE_NOT_FOUND,\n AcpError,\n type AgentCapabilities,\n type AuthenticateResponse,\n type AuthMethod,\n type CancelNotification,\n type ClientCapabilities,\n type ContentBlock,\n type CreateTerminalRequest,\n type CreateTerminalResponse,\n type EnvVariable,\n type Implementation,\n type InitializeResponse,\n type KillTerminalCommandRequest,\n type KillTerminalCommandResponse,\n type LoadSessionResponse,\n type McpServer,\n type NewSessionResponse,\n type PermissionOption,\n type PromptResponse,\n type RequestId,\n type SessionConfigId,\n type SessionConfigOption,\n type SessionConfigValueId,\n type RequestPermissionOutcome,\n type RequestPermissionRequest,\n type RequestPermissionResponse,\n type ReadTextFileRequest,\n type ReadTextFileResponse,\n type ProtocolVersion,\n type SessionModeId,\n type SessionNotification,\n type SessionId,\n type SetSessionModeResponse,\n type SessionUpdateNotification,\n type ToolCallUpdate,\n type TerminalOutputRequest,\n type TerminalOutputResponse,\n type WaitForTerminalExitRequest,\n type WaitForTerminalExitResponse,\n type WriteTextFileRequest,\n type WriteTextFileResponse,\n type ReleaseTerminalRequest,\n type ReleaseTerminalResponse,\n} from \"./types.js\";\n\nexport type AcpClientState = \"uninitialized\" | \"initialized\" | \"ready\";\ntype ExtensionMethod = `_${string}`;\n\nexport interface PromptTurn extends AsyncIterable<SessionUpdateNotification> {\n response: Promise<PromptResponse>;\n}\n\ninterface AsyncQueue<T> extends AsyncIterable<T>, AsyncIterator<T> {\n push(value: T): void;\n complete(): void;\n fail(error: Error): void;\n}\n\nexport interface AcpClientFsHandler {\n readTextFile?: (args: {\n sessionId: SessionId;\n path: string;\n line?: number | null;\n limit?: number | null;\n }) => string | Promise<string>;\n writeTextFile?: (args: {\n sessionId: SessionId;\n path: string;\n content: string;\n }) => void | Promise<void>;\n}\n\nexport interface AcpClientTerminalHandler {\n create: (args: {\n sessionId: SessionId;\n command: string;\n args?: string[];\n cwd?: string | null;\n env?: EnvVariable[];\n outputByteLimit?: number | null;\n }) => string | Promise<string>;\n output: (args: {\n sessionId: SessionId;\n terminalId: string;\n }) => TerminalOutputResponse | Promise<TerminalOutputResponse>;\n waitForExit: (args: {\n sessionId: SessionId;\n terminalId: string;\n }) => WaitForTerminalExitResponse | Promise<WaitForTerminalExitResponse>;\n kill: (args: { sessionId: SessionId; terminalId: string }) => void | Promise<void>;\n release: (args: {\n sessionId: SessionId;\n terminalId: string;\n }) => void | Promise<void>;\n}\n\ntype AcpClientPermissionHandler = (args: {\n toolCall: ToolCallUpdate;\n options: PermissionOption[];\n}) => RequestPermissionOutcome | Promise<RequestPermissionOutcome>;\n\nexport interface AcpClientHandlers {\n permission?: AcpClientPermissionHandler;\n fs?: AcpClientFsHandler;\n terminal?: AcpClientTerminalHandler;\n}\n\ntype AcpClientTransport = Pick<\n AcpTransport,\n \"sendRequest\" | \"sendNotification\" | \"onRequest\" | \"onNotification\"\n> &\n Partial<Pick<AcpTransport, \"dispose\" | \"closed\">>;\n\ninterface AcpClientSharedOptions {\n protocolVersion?: ProtocolVersion;\n clientCapabilities?: ClientCapabilities;\n clientInfo?: Implementation | null;\n handlers?: AcpClientHandlers;\n permissionHandler?: AcpClientPermissionHandler;\n fsHandler?: AcpClientFsHandler;\n terminalHandler?: AcpClientTerminalHandler;\n skipAuth?: boolean;\n /**\n * Automatically approve all permission requests (selects the first\n * \"allow_always\" or \"allow_once\" option). Ignored when a custom\n * `permissionHandler` is provided.\n */\n autoApprove?: boolean;\n}\n\nexport interface AcpClientProcessOptions extends AcpClientSharedOptions {\n command: string;\n args?: readonly string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n firstRequestId?: number;\n spawn?: AcpTransportOptions[\"spawn\"];\n}\n\nexport interface AcpClientInjectedTransportOptions extends AcpClientSharedOptions {\n transport: AcpClientTransport;\n}\n\nexport type AcpClientOptions = AcpClientProcessOptions | AcpClientInjectedTransportOptions;\n\nfunction toError(reason: unknown): Error {\n return reason instanceof Error ? reason : new Error(String(reason));\n}\n\nfunction invalidParams(message: string): AcpError {\n return new AcpError(\n ACP_ERROR_CODE_INVALID_PARAMS,\n `Invalid params: ${message}`\n );\n}\n\nfunction resourceNotFound(resource: string): AcpError {\n return new AcpError(\n ACP_ERROR_CODE_RESOURCE_NOT_FOUND,\n `Resource not found: ${resource}`\n );\n}\n\nfunction assertAbsolutePath(path: string): void {\n if (!isAbsolute(path)) {\n throw invalidParams('\"path\" must be an absolute path');\n }\n}\n\nfunction assertOneBasedLineNumber(line: number | null | undefined): void {\n if (line === null || line === undefined) {\n return;\n }\n\n if (!Number.isInteger(line) || line < 1) {\n throw invalidParams('\"line\" must be a 1-based integer');\n }\n}\n\nfunction assertExtensionMethod(method: string): asserts method is ExtensionMethod {\n if (!method.startsWith(\"_\")) {\n throw new Error('Extension method must start with \"_\"');\n }\n}\n\nfunction isInjectedTransportOptions(\n options: AcpClientOptions\n): options is AcpClientInjectedTransportOptions {\n return \"transport\" in options;\n}\n\nfunction createAsyncQueue<T>(): AsyncQueue<T> {\n const values: T[] = [];\n const waiters: Array<{\n resolve: (result: IteratorResult<T>) => void;\n reject: (error: Error) => void;\n }> = [];\n let closed = false;\n let failure: Error | null = null;\n\n const resolveOne = (value: T): boolean => {\n const waiter = waiters.shift();\n if (!waiter) {\n return false;\n }\n\n waiter.resolve({ done: false, value });\n return true;\n };\n\n const iterator: AsyncQueue<T> = {\n push(value: T): void {\n if (closed || failure) {\n return;\n }\n\n if (!resolveOne(value)) {\n values.push(value);\n }\n },\n complete(): void {\n if (closed || failure) {\n return;\n }\n\n closed = true;\n while (waiters.length > 0) {\n waiters.shift()?.resolve({ done: true, value: undefined });\n }\n },\n fail(error: Error): void {\n if (closed || failure) {\n return;\n }\n\n failure = error;\n while (waiters.length > 0) {\n waiters.shift()?.reject(error);\n }\n },\n async next(): Promise<IteratorResult<T>> {\n if (values.length > 0) {\n const value = values.shift() as T;\n return { done: false, value };\n }\n\n if (failure) {\n throw failure;\n }\n\n if (closed) {\n return { done: true, value: undefined };\n }\n\n return new Promise<IteratorResult<T>>((resolve, reject) => {\n waiters.push({ resolve, reject });\n });\n },\n async return(): Promise<IteratorResult<T>> {\n iterator.complete();\n return { done: true, value: undefined };\n },\n async throw(error: unknown): Promise<IteratorResult<T>> {\n const normalizedError = toError(error);\n iterator.fail(normalizedError);\n throw normalizedError;\n },\n [Symbol.asyncIterator](): AsyncIterator<T> {\n return iterator;\n },\n };\n\n return iterator;\n}\n\nexport class AcpClient {\n private readonly transport: AcpClientTransport;\n private readonly clientProtocolVersion: ProtocolVersion;\n private clientCapabilities?: ClientCapabilities;\n private readonly clientInfo?: Implementation | null;\n private readonly skipAuth: boolean;\n private readonly permissionHandler?: AcpClientPermissionHandler;\n private readonly fsHandler?: AcpClientFsHandler;\n private readonly terminalHandler?: AcpClientTerminalHandler;\n private readonly activePromptUpdates = new Map<\n SessionId,\n AsyncQueue<SessionUpdateNotification>\n >();\n private readonly trackedTerminalIds = new Map<SessionId, Set<string>>();\n private hasRegisteredFsReadHandler = false;\n private hasRegisteredFsWriteHandler = false;\n private hasRegisteredTerminalHandlers = false;\n private disposed = false;\n\n private lifecycleState: AcpClientState = \"uninitialized\";\n private negotiatedVersion: ProtocolVersion | null = null;\n private availableAuthMethods: AuthMethod[] = [];\n private negotiatedAgentCapabilities: AgentCapabilities | undefined;\n private negotiatedAgentInfo: Implementation | null | undefined;\n\n constructor(options: AcpClientOptions) {\n this.transport = isInjectedTransportOptions(options)\n ? options.transport\n : new AcpTransport({\n command: options.command,\n args: options.args,\n cwd: options.cwd,\n env: options.env,\n firstRequestId: options.firstRequestId,\n spawn: options.spawn,\n });\n this.clientProtocolVersion = options.protocolVersion ?? 1;\n this.clientCapabilities = options.clientCapabilities;\n this.clientInfo = options.clientInfo;\n this.skipAuth = options.skipAuth ?? false;\n this.permissionHandler = options.handlers?.permission ?? options.permissionHandler;\n this.fsHandler = options.handlers?.fs ?? options.fsHandler;\n this.terminalHandler = options.handlers?.terminal ?? options.terminalHandler;\n\n const autoApprove = options.autoApprove === true && !this.permissionHandler;\n\n this.transport.onRequest(\n \"session/request_permission\",\n async (params: RequestPermissionRequest): Promise<RequestPermissionResponse> => {\n if (this.permissionHandler) {\n const outcome = await this.permissionHandler({\n toolCall: params.toolCall,\n options: params.options,\n });\n return { outcome };\n }\n\n if (autoApprove) {\n const allow =\n params.options.find((o: PermissionOption) => o.kind === \"allow_always\") ??\n params.options.find((o: PermissionOption) => o.kind === \"allow_once\");\n if (allow) {\n return { outcome: { outcome: \"selected\", optionId: allow.optionId } };\n }\n }\n\n return { outcome: { outcome: \"cancelled\" } };\n }\n );\n\n this.registerCapabilityHandlers(this.clientCapabilities);\n\n this.transport.onNotification(\"session/update\", (params: SessionNotification) => {\n this.handleSessionUpdateNotification(params);\n });\n }\n\n get state(): AcpClientState {\n return this.lifecycleState;\n }\n\n get negotiatedProtocolVersion(): ProtocolVersion | null {\n return this.negotiatedVersion;\n }\n\n get authMethods(): AuthMethod[] {\n return [...this.availableAuthMethods];\n }\n\n get agentCapabilities(): AgentCapabilities | undefined {\n return this.negotiatedAgentCapabilities;\n }\n\n get agentInfo(): Implementation | null | undefined {\n return this.negotiatedAgentInfo;\n }\n\n get closed(): Promise<AcpTransportClosedEvent> | undefined {\n return this.transport.closed;\n }\n\n async initialize(clientCapabilities?: ClientCapabilities): Promise<InitializeResponse> {\n if (this.lifecycleState !== \"uninitialized\") {\n throw new Error(\"initialize() can only be called once.\");\n }\n\n if (clientCapabilities !== undefined) {\n this.clientCapabilities = clientCapabilities;\n this.registerCapabilityHandlers(clientCapabilities);\n }\n\n const response = await this.transport.sendRequest(\"initialize\", {\n protocolVersion: this.clientProtocolVersion,\n clientInfo: this.clientInfo,\n clientCapabilities: this.clientCapabilities,\n });\n\n const negotiatedProtocolVersion = Math.min(\n this.clientProtocolVersion,\n response.protocolVersion\n );\n\n this.negotiatedVersion = negotiatedProtocolVersion;\n this.negotiatedAgentCapabilities = response.agentCapabilities;\n this.negotiatedAgentInfo = response.agentInfo;\n this.availableAuthMethods = response.authMethods ? [...response.authMethods] : [];\n\n const requiresAuth = this.availableAuthMethods.length > 0 && !this.skipAuth;\n this.lifecycleState = requiresAuth ? \"initialized\" : \"ready\";\n\n return {\n protocolVersion: negotiatedProtocolVersion,\n ...(this.negotiatedAgentCapabilities !== undefined\n ? { agentCapabilities: this.negotiatedAgentCapabilities }\n : {}),\n ...(this.negotiatedAgentInfo !== undefined ? { agentInfo: this.negotiatedAgentInfo } : {}),\n ...(this.availableAuthMethods.length > 0 ? { authMethods: this.authMethods } : {}),\n };\n }\n\n async authenticate(methodId: string): Promise<AuthenticateResponse> {\n if (this.lifecycleState === \"uninitialized\") {\n throw new Error(\"Cannot authenticate before initialize().\");\n }\n\n if (this.lifecycleState === \"ready\") {\n throw new Error(\"Authentication is not required for this agent.\");\n }\n\n if (!this.availableAuthMethods.some((authMethod) => authMethod.id === methodId)) {\n throw new Error(`Unknown auth method \"${methodId}\".`);\n }\n\n const response = await this.transport.sendRequest(\"authenticate\", {\n methodId,\n });\n\n this.lifecycleState = \"ready\";\n return response;\n }\n\n async newSession(cwd: string, mcpServers: McpServer[]): Promise<NewSessionResponse> {\n this.assertReady(\"session/new\");\n this.assertMcpServerCapabilitySupport(mcpServers);\n\n return this.transport.sendRequest(\"session/new\", {\n cwd,\n mcpServers,\n });\n }\n\n async loadSession(\n sessionId: SessionId,\n cwd: string,\n mcpServers: McpServer[]\n ): Promise<LoadSessionResponse> {\n this.assertReady(\"session/load\");\n if (this.negotiatedAgentCapabilities?.loadSession !== true) {\n throw new Error(\n 'Cannot call \"session/load\" because the agent does not support session loading.'\n );\n }\n this.assertMcpServerCapabilitySupport(mcpServers);\n\n return this.transport.sendRequest(\"session/load\", {\n sessionId,\n cwd,\n mcpServers,\n });\n }\n\n async cancelSession(sessionId: SessionId): Promise<void> {\n this.assertReady(\"session/cancel\");\n const payload: CancelNotification = { sessionId };\n this.transport.sendNotification(\"session/cancel\", payload);\n }\n\n async setMode(\n sessionId: SessionId,\n modeId: SessionModeId\n ): Promise<SetSessionModeResponse> {\n this.assertReady(\"session/set_mode\");\n return this.transport.sendRequest(\"session/set_mode\", {\n sessionId,\n modeId,\n });\n }\n\n async setConfigOption(\n sessionId: SessionId,\n configId: SessionConfigId,\n value: SessionConfigValueId\n ): Promise<SessionConfigOption[]> {\n this.assertReady(\"session/set_config_option\");\n const response = await this.transport.sendRequest(\"session/set_config_option\", {\n sessionId,\n configId,\n value,\n });\n\n return response.configOptions;\n }\n\n prompt(sessionId: SessionId, content: ContentBlock[]): PromptTurn {\n this.assertReady(\"session/prompt\");\n this.assertPromptContentCapabilitySupport(content);\n\n if (this.activePromptUpdates.has(sessionId)) {\n throw new Error(\n `Cannot call \"session/prompt\" while another prompt is in progress for session \"${sessionId}\".`\n );\n }\n\n const updates = createAsyncQueue<SessionUpdateNotification>();\n this.activePromptUpdates.set(sessionId, updates);\n\n let requestPromise: Promise<PromptResponse>;\n try {\n requestPromise = this.transport.sendRequest(\"session/prompt\", {\n sessionId,\n prompt: content,\n });\n } catch (error) {\n const normalizedError = toError(error);\n this.activePromptUpdates.delete(sessionId);\n updates.fail(normalizedError);\n throw normalizedError;\n }\n\n const response = requestPromise\n .then((promptResponse) => {\n this.activePromptUpdates.delete(sessionId);\n updates.complete();\n return promptResponse;\n })\n .catch((error) => {\n const normalizedError = toError(error);\n this.activePromptUpdates.delete(sessionId);\n updates.fail(normalizedError);\n throw normalizedError;\n });\n\n return {\n response,\n [Symbol.asyncIterator](): AsyncIterator<SessionUpdateNotification> {\n return updates;\n },\n };\n }\n\n async sendExtRequest<TResult = unknown>(\n method: ExtensionMethod,\n params?: unknown,\n options?: JsonRpcRequestOptions\n ): Promise<TResult>;\n async sendExtRequest<TResult = unknown>(\n method: string,\n params?: unknown,\n options: JsonRpcRequestOptions = {}\n ): Promise<TResult> {\n assertExtensionMethod(method);\n return this.transport.sendRequest(method, params, options) as Promise<TResult>;\n }\n\n async sendExtNotification(method: ExtensionMethod, params?: unknown): Promise<void>;\n async sendExtNotification(method: string, params?: unknown): Promise<void> {\n assertExtensionMethod(method);\n this.transport.sendNotification(method, params);\n }\n\n onExtRequest<TMethod extends ExtensionMethod>(\n method: TMethod,\n handler: (\n params: unknown,\n context: { id: RequestId; method: TMethod }\n ) => unknown | Promise<unknown>\n ): void;\n onExtRequest(\n method: string,\n handler: (params: unknown, context: { id: RequestId; method: string }) => unknown\n ): void {\n assertExtensionMethod(method);\n this.transport.onRequest(method, handler);\n }\n\n onExtNotification<TMethod extends ExtensionMethod>(\n method: TMethod,\n handler: (params: unknown, context: { method: TMethod }) => void | Promise<void>\n ): void;\n onExtNotification(\n method: string,\n handler: (params: unknown, context: { method: string }) => void | Promise<void>\n ): void {\n assertExtensionMethod(method);\n this.transport.onNotification(method, handler);\n }\n\n async dispose(): Promise<void> {\n if (this.disposed) {\n if (this.transport.closed) {\n await this.transport.closed;\n }\n return;\n }\n\n this.disposed = true;\n const disposeReason = new Error(\"ACP client disposed\");\n for (const updates of this.activePromptUpdates.values()) {\n updates.fail(disposeReason);\n }\n this.activePromptUpdates.clear();\n\n if (typeof this.transport.dispose === \"function\") {\n this.transport.dispose(disposeReason);\n }\n\n if (this.transport.closed) {\n await this.transport.closed;\n }\n }\n\n assertReady(operation: string): void {\n if (this.lifecycleState === \"ready\") {\n return;\n }\n\n if (this.lifecycleState === \"uninitialized\") {\n throw new Error(`Cannot call \"${operation}\" before initialize().`);\n }\n\n throw new Error(`Cannot call \"${operation}\" before authentication completes.`);\n }\n\n private registerCapabilityHandlers(capabilities: ClientCapabilities | undefined): void {\n if (\n !this.hasRegisteredFsReadHandler &&\n capabilities?.fs?.readTextFile === true &&\n this.fsHandler?.readTextFile\n ) {\n const readTextFile = this.fsHandler.readTextFile;\n this.transport.onRequest(\n \"fs/read_text_file\",\n async (params: ReadTextFileRequest): Promise<ReadTextFileResponse> => {\n assertAbsolutePath(params.path);\n assertOneBasedLineNumber(params.line);\n\n const content = await readTextFile({\n sessionId: params.sessionId,\n path: params.path,\n line: params.line,\n limit: params.limit,\n });\n return { content };\n }\n );\n this.hasRegisteredFsReadHandler = true;\n }\n\n if (\n !this.hasRegisteredFsWriteHandler &&\n capabilities?.fs?.writeTextFile === true &&\n this.fsHandler?.writeTextFile\n ) {\n const writeTextFile = this.fsHandler.writeTextFile;\n this.transport.onRequest(\n \"fs/write_text_file\",\n async (params: WriteTextFileRequest): Promise<WriteTextFileResponse> => {\n assertAbsolutePath(params.path);\n\n await writeTextFile({\n sessionId: params.sessionId,\n path: params.path,\n content: params.content,\n });\n\n return {};\n }\n );\n this.hasRegisteredFsWriteHandler = true;\n }\n\n if (\n !this.hasRegisteredTerminalHandlers &&\n capabilities?.terminal === true &&\n this.terminalHandler\n ) {\n const terminalHandler = this.terminalHandler;\n this.transport.onRequest(\n \"terminal/create\",\n async (params: CreateTerminalRequest): Promise<CreateTerminalResponse> => {\n const terminalId = await terminalHandler.create({\n sessionId: params.sessionId,\n command: params.command,\n args: params.args,\n cwd: params.cwd,\n env: params.env,\n outputByteLimit: params.outputByteLimit,\n });\n this.trackTerminal(params.sessionId, terminalId);\n\n return { terminalId };\n }\n );\n\n this.transport.onRequest(\n \"terminal/output\",\n async (params: TerminalOutputRequest): Promise<TerminalOutputResponse> => {\n this.assertKnownTerminal(params.sessionId, params.terminalId);\n\n return terminalHandler.output({\n sessionId: params.sessionId,\n terminalId: params.terminalId,\n });\n }\n );\n\n this.transport.onRequest(\n \"terminal/wait_for_exit\",\n async (params: WaitForTerminalExitRequest): Promise<WaitForTerminalExitResponse> => {\n this.assertKnownTerminal(params.sessionId, params.terminalId);\n\n return terminalHandler.waitForExit({\n sessionId: params.sessionId,\n terminalId: params.terminalId,\n });\n }\n );\n\n this.transport.onRequest(\n \"terminal/kill\",\n async (params: KillTerminalCommandRequest): Promise<KillTerminalCommandResponse> => {\n this.assertKnownTerminal(params.sessionId, params.terminalId);\n\n await terminalHandler.kill({\n sessionId: params.sessionId,\n terminalId: params.terminalId,\n });\n\n return {};\n }\n );\n\n this.transport.onRequest(\n \"terminal/release\",\n async (params: ReleaseTerminalRequest): Promise<ReleaseTerminalResponse> => {\n this.assertKnownTerminal(params.sessionId, params.terminalId);\n\n await terminalHandler.release({\n sessionId: params.sessionId,\n terminalId: params.terminalId,\n });\n this.untrackTerminal(params.sessionId, params.terminalId);\n\n return {};\n }\n );\n this.hasRegisteredTerminalHandlers = true;\n }\n }\n\n private assertMcpServerCapabilitySupport(mcpServers: McpServer[]): void {\n const mcpCapabilities = this.negotiatedAgentCapabilities?.mcpCapabilities;\n\n for (const mcpServer of mcpServers) {\n if (!(\"type\" in mcpServer)) {\n continue;\n }\n\n if (mcpServer.type === \"http\" && mcpCapabilities?.http !== true) {\n throw new Error('Agent does not support MCP server type \"http\".');\n }\n\n if (mcpServer.type === \"sse\" && mcpCapabilities?.sse !== true) {\n throw new Error('Agent does not support MCP server type \"sse\".');\n }\n }\n }\n\n private handleSessionUpdateNotification(notification: SessionNotification): void {\n const activePrompt = this.activePromptUpdates.get(notification.sessionId);\n if (!activePrompt) {\n return;\n }\n\n activePrompt.push({\n jsonrpc: \"2.0\",\n method: \"session/update\",\n params: notification,\n });\n }\n\n private trackTerminal(sessionId: SessionId, terminalId: string): void {\n const sessionTerminals = this.trackedTerminalIds.get(sessionId);\n if (sessionTerminals) {\n sessionTerminals.add(terminalId);\n return;\n }\n\n this.trackedTerminalIds.set(sessionId, new Set([terminalId]));\n }\n\n private assertKnownTerminal(sessionId: SessionId, terminalId: string): void {\n const sessionTerminals = this.trackedTerminalIds.get(sessionId);\n if (sessionTerminals?.has(terminalId) === true) {\n return;\n }\n\n throw resourceNotFound(`terminal \"${terminalId}\"`);\n }\n\n private untrackTerminal(sessionId: SessionId, terminalId: string): void {\n const sessionTerminals = this.trackedTerminalIds.get(sessionId);\n if (!sessionTerminals) {\n return;\n }\n\n sessionTerminals.delete(terminalId);\n if (sessionTerminals.size === 0) {\n this.trackedTerminalIds.delete(sessionId);\n }\n }\n\n private assertPromptContentCapabilitySupport(content: ContentBlock[]): void {\n const promptCapabilities = this.negotiatedAgentCapabilities?.promptCapabilities;\n\n for (const block of content) {\n if (block.type === \"image\" && promptCapabilities?.image !== true) {\n throw new Error('Agent does not support prompt content type \"image\".');\n }\n\n if (block.type === \"audio\" && promptCapabilities?.audio !== true) {\n throw new Error('Agent does not support prompt content type \"audio\".');\n }\n\n if (block.type === \"resource\" && promptCapabilities?.embeddedContext !== true) {\n throw new Error('Agent does not support prompt content type \"resource\".');\n }\n }\n }\n}\n", "import {\n spawn as spawnChildProcess,\n type ChildProcessWithoutNullStreams,\n type SpawnOptionsWithoutStdio,\n} from \"node:child_process\";\nimport {\n JsonRpcMessageLayer,\n type JsonRpcNotificationHandler,\n type JsonRpcRequestHandler,\n type JsonRpcRequestOptions,\n} from \"./jsonrpc-message-layer.js\";\nimport type {\n AuthenticateRequest,\n AuthenticateResponse,\n CancelNotification,\n CreateTerminalRequest,\n CreateTerminalResponse,\n InitializeRequest,\n InitializeResponse,\n KillTerminalCommandRequest,\n KillTerminalCommandResponse,\n LoadSessionRequest,\n LoadSessionResponse,\n NewSessionRequest,\n NewSessionResponse,\n PromptRequest,\n PromptResponse,\n ReadTextFileRequest,\n ReadTextFileResponse,\n ReleaseTerminalRequest,\n ReleaseTerminalResponse,\n RequestId,\n RequestPermissionRequest,\n RequestPermissionResponse,\n SessionNotification,\n SetSessionConfigOptionRequest,\n SetSessionConfigOptionResponse,\n SetSessionModeRequest,\n SetSessionModeResponse,\n TerminalOutputRequest,\n TerminalOutputResponse,\n WaitForTerminalExitRequest,\n WaitForTerminalExitResponse,\n WriteTextFileRequest,\n WriteTextFileResponse,\n} from \"./types.js\";\n\ninterface AcpRequestShape<TParams, TResult> {\n params: TParams;\n result: TResult;\n}\n\nexport interface AcpAgentRequestMap {\n initialize: AcpRequestShape<InitializeRequest, InitializeResponse>;\n authenticate: AcpRequestShape<AuthenticateRequest, AuthenticateResponse>;\n \"session/new\": AcpRequestShape<NewSessionRequest, NewSessionResponse>;\n \"session/load\": AcpRequestShape<LoadSessionRequest, LoadSessionResponse>;\n \"session/prompt\": AcpRequestShape<PromptRequest, PromptResponse>;\n \"session/set_mode\": AcpRequestShape<SetSessionModeRequest, SetSessionModeResponse>;\n \"session/set_config_option\": AcpRequestShape<\n SetSessionConfigOptionRequest,\n SetSessionConfigOptionResponse\n >;\n}\n\nexport interface AcpAgentNotificationMap {\n \"session/cancel\": CancelNotification;\n}\n\nexport interface AcpClientRequestMap {\n \"session/request_permission\": AcpRequestShape<\n RequestPermissionRequest,\n RequestPermissionResponse\n >;\n \"fs/read_text_file\": AcpRequestShape<ReadTextFileRequest, ReadTextFileResponse>;\n \"fs/write_text_file\": AcpRequestShape<WriteTextFileRequest, WriteTextFileResponse>;\n \"terminal/create\": AcpRequestShape<CreateTerminalRequest, CreateTerminalResponse>;\n \"terminal/output\": AcpRequestShape<TerminalOutputRequest, TerminalOutputResponse>;\n \"terminal/wait_for_exit\": AcpRequestShape<\n WaitForTerminalExitRequest,\n WaitForTerminalExitResponse\n >;\n \"terminal/kill\": AcpRequestShape<\n KillTerminalCommandRequest,\n KillTerminalCommandResponse\n >;\n \"terminal/release\": AcpRequestShape<ReleaseTerminalRequest, ReleaseTerminalResponse>;\n}\n\nexport interface AcpClientNotificationMap {\n \"session/update\": SessionNotification;\n}\n\ntype ExtensionMethod = `_${string}`;\n\nfunction assertExtensionMethod(method: string): asserts method is ExtensionMethod {\n if (!method.startsWith(\"_\")) {\n throw new Error('Extension method must start with \"_\"');\n }\n}\n\ntype SpawnFunction = (\n command: string,\n args?: ReadonlyArray<string>,\n options?: SpawnOptionsWithoutStdio\n) => ChildProcessWithoutNullStreams;\n\nexport interface AcpTransportOptions {\n command: string;\n args?: readonly string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n firstRequestId?: number;\n spawn?: SpawnFunction;\n}\n\nexport interface AcpTransportClosedEvent {\n code: number | null;\n signal: NodeJS.Signals | null;\n reason: Error;\n stderr: string;\n}\n\nexport class AcpTransport {\n readonly closed: Promise<AcpTransportClosedEvent>;\n\n private readonly command: string;\n private readonly child: ChildProcessWithoutNullStreams;\n private readonly layer: JsonRpcMessageLayer;\n private readonly stderrChunks: string[] = [];\n private resolveClosed: ((value: AcpTransportClosedEvent) => void) | null = null;\n private closeEvent: AcpTransportClosedEvent | null = null;\n private closeReason: Error | null = null;\n\n constructor(options: AcpTransportOptions) {\n const {\n command,\n args = [],\n cwd,\n env,\n firstRequestId,\n spawn = spawnChildProcess,\n } = options;\n\n this.command = command;\n this.closed = new Promise<AcpTransportClosedEvent>((resolve) => {\n this.resolveClosed = resolve;\n });\n\n this.child = spawn(command, [...args], {\n cwd,\n env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n this.child.stderr.setEncoding(\"utf8\");\n this.child.stderr.on(\"data\", (chunk) => {\n this.stderrChunks.push(String(chunk));\n });\n\n this.child.stdin.on(\"error\", (error) => {\n const reason = error instanceof Error ? error : new Error(String(error));\n this.close(reason, this.child.exitCode ?? null, this.child.signalCode ?? null);\n });\n\n this.layer = new JsonRpcMessageLayer({\n input: this.child.stdout,\n output: this.child.stdin,\n firstRequestId,\n });\n\n this.child.once(\"error\", (error) => {\n const reason = error instanceof Error ? error : new Error(String(error));\n this.close(reason, this.child.exitCode ?? null, this.child.signalCode ?? null);\n });\n\n this.child.once(\"close\", (code, signal) => {\n const reason =\n this.closeReason ??\n new Error(\n `ACP transport closed (command \"${this.command}\", code: ${code ?? \"null\"}${\n signal ? `, signal: ${signal}` : \"\"\n })`\n );\n this.close(reason, code ?? null, signal ?? null);\n });\n }\n\n sendRequest<TMethod extends keyof AcpAgentRequestMap>(\n method: TMethod,\n params: AcpAgentRequestMap[TMethod][\"params\"],\n options?: JsonRpcRequestOptions\n ): Promise<AcpAgentRequestMap[TMethod][\"result\"]>;\n sendRequest<TResult = unknown>(\n method: string,\n params?: unknown,\n options?: JsonRpcRequestOptions\n ): Promise<TResult>;\n sendRequest(\n method: string,\n params?: unknown,\n options: JsonRpcRequestOptions = {}\n ): Promise<unknown> {\n return this.layer.sendRequest(method, params, options);\n }\n\n sendExtRequest<TResult = unknown>(\n method: ExtensionMethod,\n params?: unknown,\n options?: JsonRpcRequestOptions\n ): Promise<TResult>;\n sendExtRequest<TResult = unknown>(\n method: string,\n params?: unknown,\n options: JsonRpcRequestOptions = {}\n ): Promise<TResult> {\n assertExtensionMethod(method);\n return this.layer.sendRequest(method, params, options) as Promise<TResult>;\n }\n\n sendNotification<TMethod extends keyof AcpAgentNotificationMap>(\n method: TMethod,\n params: AcpAgentNotificationMap[TMethod]\n ): void;\n sendNotification(method: string, params?: unknown): void;\n sendNotification(method: string, params?: unknown): void {\n this.layer.sendNotification(method, params);\n }\n\n sendExtNotification(method: ExtensionMethod, params?: unknown): void;\n sendExtNotification(method: string, params?: unknown): void;\n sendExtNotification(method: string, params?: unknown): void {\n assertExtensionMethod(method);\n this.layer.sendNotification(method, params);\n }\n\n onRequest<TMethod extends keyof AcpClientRequestMap>(\n method: TMethod,\n handler: (\n params: AcpClientRequestMap[TMethod][\"params\"],\n context: { id: RequestId; method: TMethod }\n ) =>\n | AcpClientRequestMap[TMethod][\"result\"]\n | Promise<AcpClientRequestMap[TMethod][\"result\"]>\n ): void;\n onRequest(method: string, handler: JsonRpcRequestHandler): void;\n onRequest(method: string, handler: JsonRpcRequestHandler): void {\n this.layer.onRequest(method, handler);\n }\n\n onExtRequest<TMethod extends ExtensionMethod>(\n method: TMethod,\n handler: (\n params: unknown,\n context: { id: RequestId; method: TMethod }\n ) => unknown | Promise<unknown>\n ): void;\n onExtRequest(method: string, handler: JsonRpcRequestHandler): void;\n onExtRequest(method: string, handler: JsonRpcRequestHandler): void {\n assertExtensionMethod(method);\n this.layer.onRequest(method, handler);\n }\n\n onNotification<TMethod extends keyof AcpClientNotificationMap>(\n method: TMethod,\n handler: (\n params: AcpClientNotificationMap[TMethod],\n context: { method: TMethod }\n ) => void | Promise<void>\n ): void;\n onNotification(method: string, handler: JsonRpcNotificationHandler): void;\n onNotification(method: string, handler: JsonRpcNotificationHandler): void {\n this.layer.onNotification(method, handler);\n }\n\n onExtNotification<TMethod extends ExtensionMethod>(\n method: TMethod,\n handler: (params: unknown, context: { method: TMethod }) => void | Promise<void>\n ): void;\n onExtNotification(method: string, handler: JsonRpcNotificationHandler): void;\n onExtNotification(method: string, handler: JsonRpcNotificationHandler): void {\n assertExtensionMethod(method);\n this.layer.onNotification(method, handler);\n }\n\n getStderrOutput(): string {\n return this.stderrChunks.join(\"\");\n }\n\n pendingRequestCount(): number {\n return this.layer.pendingRequestCount();\n }\n\n dispose(reason: Error = new Error(\"ACP transport disposed\")): void {\n if (this.closeEvent !== null) {\n return;\n }\n\n this.closeReason = reason;\n this.layer.dispose(reason);\n\n if (!this.child.stdin.destroyed && !this.child.stdin.writableEnded) {\n this.child.stdin.end();\n }\n\n if (this.child.exitCode !== null || this.child.signalCode !== null) {\n this.close(reason, this.child.exitCode, this.child.signalCode);\n return;\n }\n\n const killed = this.child.kill();\n if (!killed) {\n this.close(reason, this.child.exitCode, this.child.signalCode);\n }\n }\n\n private close(reason: Error, code: number | null, signal: NodeJS.Signals | null): void {\n if (this.closeEvent !== null) {\n return;\n }\n\n this.layer.dispose(reason);\n this.closeEvent = {\n code,\n signal,\n reason,\n stderr: this.getStderrOutput(),\n };\n this.resolveClosed?.(this.closeEvent);\n this.resolveClosed = null;\n }\n}\n", "export type AcpMeta = Record<string, unknown> | null;\n\nexport interface AcpExtensible {\n _meta?: AcpMeta;\n}\n\nexport type Role = \"assistant\" | \"user\";\n\nexport interface Annotations extends AcpExtensible {\n audience?: Role[] | null;\n lastModified?: string | null;\n priority?: number | null;\n}\n\nexport interface TextContent extends AcpExtensible {\n type: \"text\";\n text: string;\n annotations?: Annotations | null;\n}\n\nexport interface ImageContent extends AcpExtensible {\n type: \"image\";\n data: string;\n mimeType: string;\n uri?: string | null;\n annotations?: Annotations | null;\n}\n\nexport interface AudioContent extends AcpExtensible {\n type: \"audio\";\n data: string;\n mimeType: string;\n annotations?: Annotations | null;\n}\n\nexport interface ResourceLink extends AcpExtensible {\n type: \"resource_link\";\n name: string;\n uri: string;\n description?: string | null;\n mimeType?: string | null;\n size?: number | null;\n title?: string | null;\n annotations?: Annotations | null;\n}\n\nexport interface TextResourceContents extends AcpExtensible {\n text: string;\n uri: string;\n mimeType?: string | null;\n}\n\nexport interface BlobResourceContents extends AcpExtensible {\n blob: string;\n uri: string;\n mimeType?: string | null;\n}\n\nexport type EmbeddedResourceResource = TextResourceContents | BlobResourceContents;\n\nexport interface EmbeddedResource extends AcpExtensible {\n type: \"resource\";\n resource: EmbeddedResourceResource;\n annotations?: Annotations | null;\n}\n\nexport type ContentBlock =\n | TextContent\n | ImageContent\n | AudioContent\n | ResourceLink\n | EmbeddedResource;\n\nexport interface ContentChunk extends AcpExtensible {\n content: ContentBlock;\n}\n\nexport interface UserMessageChunk extends ContentChunk {\n sessionUpdate: \"user_message_chunk\";\n}\n\nexport interface AgentMessageChunk extends ContentChunk {\n sessionUpdate: \"agent_message_chunk\";\n}\n\nexport interface AgentThoughtChunk extends ContentChunk {\n sessionUpdate: \"agent_thought_chunk\";\n}\n\nexport type ToolKind = \"read\" | \"write\" | \"execute\" | \"other\";\n\nexport type ToolCallStatus =\n | \"pending\"\n | \"in_progress\"\n | \"completed\"\n | \"failed\"\n | \"cancelled\";\n\nexport interface Diff extends AcpExtensible {\n path: string;\n newText: string;\n oldText?: string | null;\n}\n\nexport interface Terminal extends AcpExtensible {\n terminalId: string;\n}\n\nexport interface ToolCallTextContent extends TextContent {\n type: \"text\";\n}\n\nexport interface ToolCallDiffContent extends Diff {\n type: \"diff\";\n}\n\nexport interface ToolCallImageContent extends ImageContent {\n type: \"image\";\n}\n\nexport interface ToolCallResourceLinkContent extends ResourceLink {\n type: \"resource_link\";\n}\n\nexport interface ToolCallResourceContent extends EmbeddedResource {\n type: \"resource\";\n}\n\nexport interface ToolCallTerminalContent extends Terminal {\n type: \"terminal\";\n}\n\nexport type ToolCallContent =\n | ToolCallTextContent\n | ToolCallDiffContent\n | ToolCallImageContent\n | ToolCallResourceLinkContent\n | ToolCallResourceContent\n | ToolCallTerminalContent;\n\nexport interface ToolCallLocation extends AcpExtensible {\n path: string;\n lineNumber?: number | null;\n}\n\nexport interface ToolCall extends AcpExtensible {\n sessionUpdate: \"tool_call\";\n toolCallId: string;\n title: string;\n content?: ToolCallContent[];\n kind?: ToolKind;\n locations?: ToolCallLocation[];\n rawInput?: unknown;\n rawOutput?: unknown;\n status?: ToolCallStatus;\n}\n\nexport interface ToolCallUpdate extends AcpExtensible {\n sessionUpdate: \"tool_call_update\";\n toolCallId: string;\n content?: ToolCallContent[] | null;\n kind?: ToolKind | null;\n locations?: ToolCallLocation[] | null;\n rawInput?: unknown;\n rawOutput?: unknown;\n status?: ToolCallStatus | null;\n title?: string | null;\n}\n\nexport type PlanEntryPriority = \"high\" | \"medium\" | \"low\";\n\nexport type PlanEntryStatus = \"pending\" | \"in_progress\" | \"completed\";\n\nexport interface PlanEntry extends AcpExtensible {\n content: string;\n priority: PlanEntryPriority;\n status: PlanEntryStatus;\n}\n\nexport interface Plan extends AcpExtensible {\n sessionUpdate: \"plan\";\n entries: PlanEntry[];\n}\n\nexport interface UnstructuredCommandInput extends AcpExtensible {\n hint: string;\n}\n\nexport type AvailableCommandInput = UnstructuredCommandInput;\n\nexport interface AvailableCommand extends AcpExtensible {\n name: string;\n description: string;\n input?: AvailableCommandInput | null;\n}\n\nexport interface AvailableCommandsUpdate extends AcpExtensible {\n sessionUpdate: \"available_commands_update\";\n availableCommands: AvailableCommand[];\n}\n\nexport type SessionModeId = string;\n\nexport interface CurrentModeUpdate extends AcpExtensible {\n sessionUpdate: \"current_mode_update\";\n currentModeId: SessionModeId;\n}\n\nexport type SessionConfigId = string;\nexport type SessionConfigGroupId = string;\nexport type SessionConfigValueId = string;\n\nexport type SessionConfigOptionCategory =\n | \"mode\"\n | \"model\"\n | \"thought_level\"\n | string;\n\nexport interface SessionConfigSelectOption extends AcpExtensible {\n value: SessionConfigValueId;\n name: string;\n description?: string | null;\n}\n\nexport interface SessionConfigSelectGroup extends AcpExtensible {\n group: SessionConfigGroupId;\n name: string;\n options: SessionConfigSelectOption[];\n}\n\nexport type SessionConfigSelectOptions =\n | SessionConfigSelectOption[]\n | SessionConfigSelectGroup[];\n\nexport interface SessionConfigSelect {\n currentValue: SessionConfigValueId;\n options: SessionConfigSelectOptions;\n}\n\nexport interface SessionConfigOption extends AcpExtensible, SessionConfigSelect {\n type: \"select\";\n id: SessionConfigId;\n name: string;\n category?: SessionConfigOptionCategory | null;\n description?: string | null;\n}\n\nexport interface ConfigOptionUpdate extends AcpExtensible {\n sessionUpdate: \"config_option_update\";\n configOptions: SessionConfigOption[];\n}\n\nexport interface SessionInfoUpdate extends AcpExtensible {\n sessionUpdate: \"session_info_update\";\n title?: string | null;\n updatedAt?: string | null;\n}\n\nexport interface Cost {\n amount: number;\n currency: string;\n}\n\nexport interface UsageUpdate extends AcpExtensible {\n sessionUpdate: \"usage_update\";\n used: number;\n size: number;\n cost?: Cost | null;\n}\n\nexport type StableSessionUpdate =\n | UserMessageChunk\n | AgentMessageChunk\n | AgentThoughtChunk\n | ToolCall\n | ToolCallUpdate\n | Plan\n | AvailableCommandsUpdate\n | CurrentModeUpdate\n | ConfigOptionUpdate;\n\nexport type UnstableSessionUpdate = SessionInfoUpdate | UsageUpdate;\n\nexport type SessionUpdate = StableSessionUpdate | UnstableSessionUpdate;\n\nexport type SessionUpdateKind = SessionUpdate[\"sessionUpdate\"];\n\nexport type SessionId = string;\n\nexport interface SessionNotification extends AcpExtensible {\n sessionId: SessionId;\n update: SessionUpdate;\n}\n\nexport interface SessionUpdateNotification {\n jsonrpc: \"2.0\";\n method: \"session/update\";\n params: SessionNotification;\n}\n\nexport type ProtocolVersion = number;\n\nexport type RequestId = null | number | string;\n\nexport type StopReason = \"completed\" | \"cancelled\" | \"max_tokens\";\n\nexport interface Implementation extends AcpExtensible {\n name: string;\n version: string;\n title?: string | null;\n}\n\nexport interface AuthMethod extends AcpExtensible {\n id: string;\n name: string;\n description?: string | null;\n}\n\nexport interface FileSystemCapability extends AcpExtensible {\n readTextFile?: boolean;\n writeTextFile?: boolean;\n}\n\nexport interface ClientCapabilities extends AcpExtensible {\n fs?: FileSystemCapability;\n terminal?: boolean;\n}\n\nexport interface McpCapabilities extends AcpExtensible {\n http?: boolean;\n sse?: boolean;\n}\n\nexport interface PromptCapabilities extends AcpExtensible {\n image?: boolean;\n audio?: boolean;\n embeddedContext?: boolean;\n}\n\nexport type SessionCapabilities = AcpExtensible;\n\nexport interface AgentCapabilities extends AcpExtensible {\n loadSession?: boolean;\n mcpCapabilities?: McpCapabilities;\n promptCapabilities?: PromptCapabilities;\n sessionCapabilities?: SessionCapabilities;\n}\n\nexport interface SessionMode extends AcpExtensible {\n id: SessionModeId;\n name: string;\n description?: string | null;\n}\n\nexport interface SessionModeState extends AcpExtensible {\n availableModes: SessionMode[];\n currentModeId: SessionModeId;\n}\n\nexport interface HttpHeader extends AcpExtensible {\n name: string;\n value: string;\n}\n\nexport interface EnvVariable extends AcpExtensible {\n name: string;\n value: string;\n}\n\nexport interface McpServerStdio extends AcpExtensible {\n name: string;\n command: string;\n args: string[];\n env: EnvVariable[];\n}\n\nexport interface McpServerHttp extends AcpExtensible {\n type: \"http\";\n name: string;\n url: string;\n headers: HttpHeader[];\n}\n\nexport interface McpServerSse extends AcpExtensible {\n type: \"sse\";\n name: string;\n url: string;\n headers: HttpHeader[];\n}\n\nexport type McpServer = McpServerStdio | McpServerHttp | McpServerSse;\n\nexport type PermissionOptionId = string;\n\nexport type PermissionOptionKind =\n | \"allow_once\"\n | \"allow_always\"\n | \"reject_once\"\n | \"reject_always\";\n\nexport interface PermissionOption extends AcpExtensible {\n optionId: PermissionOptionId;\n kind: PermissionOptionKind;\n name: string;\n}\n\nexport interface RequestPermissionCancelledOutcome extends AcpExtensible {\n outcome: \"cancelled\";\n}\n\nexport interface RequestPermissionSelectedOutcome extends AcpExtensible {\n outcome: \"selected\";\n optionId: PermissionOptionId;\n}\n\nexport type RequestPermissionOutcome =\n | RequestPermissionCancelledOutcome\n | RequestPermissionSelectedOutcome;\n\nexport interface TerminalExitStatus extends AcpExtensible {\n exitCode?: number | null;\n signal?: string | null;\n}\n\nexport const ACP_ERROR_CODE_PARSE = -32700;\nexport const ACP_ERROR_CODE_INVALID_REQUEST = -32600;\nexport const ACP_ERROR_CODE_METHOD_NOT_FOUND = -32601;\nexport const ACP_ERROR_CODE_INVALID_PARAMS = -32602;\nexport const ACP_ERROR_CODE_INTERNAL = -32603;\nexport const ACP_ERROR_CODE_AUTH_REQUIRED = -32000;\nexport const ACP_ERROR_CODE_RESOURCE_NOT_FOUND = -32002;\n\nexport type StandardAcpErrorCode =\n | typeof ACP_ERROR_CODE_PARSE\n | typeof ACP_ERROR_CODE_INVALID_REQUEST\n | typeof ACP_ERROR_CODE_METHOD_NOT_FOUND\n | typeof ACP_ERROR_CODE_INVALID_PARAMS\n | typeof ACP_ERROR_CODE_INTERNAL\n | typeof ACP_ERROR_CODE_AUTH_REQUIRED\n | typeof ACP_ERROR_CODE_RESOURCE_NOT_FOUND;\n\nexport type AcpErrorCode = StandardAcpErrorCode | number;\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function isAcpErrorCode(value: unknown): value is AcpErrorCode {\n return (\n typeof value === \"number\" &&\n Number.isInteger(value) &&\n value >= -2_147_483_648 &&\n value <= 2_147_483_647\n );\n}\n\nexport class AcpError extends Error {\n readonly code: AcpErrorCode;\n readonly data?: unknown;\n\n constructor(code: AcpErrorCode, message: string, data?: unknown) {\n super(message);\n this.name = \"AcpError\";\n this.code = code;\n if (data !== undefined) {\n this.data = data;\n }\n }\n}\n\nexport function isAcpError(value: unknown): value is AcpError {\n if (value instanceof AcpError) {\n return true;\n }\n\n if (!isObjectRecord(value)) {\n return false;\n }\n\n if (!isAcpErrorCode(value.code) || typeof value.message !== \"string\") {\n return false;\n }\n\n return value.data === undefined || Object.prototype.hasOwnProperty.call(value, \"data\");\n}\n\nexport interface InitializeRequest extends AcpExtensible {\n protocolVersion: ProtocolVersion;\n clientCapabilities?: ClientCapabilities;\n clientInfo?: Implementation | null;\n}\n\nexport interface InitializeResponse extends AcpExtensible {\n protocolVersion: ProtocolVersion;\n agentCapabilities?: AgentCapabilities;\n agentInfo?: Implementation | null;\n authMethods?: AuthMethod[];\n}\n\nexport interface AuthenticateRequest extends AcpExtensible {\n methodId: string;\n}\n\nexport type AuthenticateResponse = AcpExtensible;\n\nexport interface NewSessionRequest extends AcpExtensible {\n cwd: string;\n mcpServers: McpServer[];\n}\n\nexport interface NewSessionResponse extends AcpExtensible {\n sessionId: SessionId;\n configOptions?: SessionConfigOption[] | null;\n modes?: SessionModeState | null;\n}\n\nexport interface LoadSessionRequest extends AcpExtensible {\n sessionId: SessionId;\n cwd: string;\n mcpServers: McpServer[];\n}\n\nexport interface LoadSessionResponse extends AcpExtensible {\n configOptions?: SessionConfigOption[] | null;\n modes?: SessionModeState | null;\n}\n\nexport interface PromptRequest extends AcpExtensible {\n sessionId: SessionId;\n prompt: ContentBlock[];\n}\n\nexport interface PromptResponse extends AcpExtensible {\n stopReason: StopReason;\n}\n\nexport interface SetSessionModeRequest extends AcpExtensible {\n sessionId: SessionId;\n modeId: SessionModeId;\n}\n\nexport type SetSessionModeResponse = AcpExtensible;\n\nexport interface SetSessionConfigOptionRequest extends AcpExtensible {\n sessionId: SessionId;\n configId: SessionConfigId;\n value: SessionConfigValueId;\n}\n\nexport interface SetSessionConfigOptionResponse extends AcpExtensible {\n configOptions: SessionConfigOption[];\n}\n\nexport interface CancelNotification extends AcpExtensible {\n sessionId: SessionId;\n}\n\nexport interface RequestPermissionRequest extends AcpExtensible {\n sessionId: SessionId;\n toolCall: ToolCallUpdate;\n options: PermissionOption[];\n}\n\nexport interface RequestPermissionResponse extends AcpExtensible {\n outcome: RequestPermissionOutcome;\n}\n\nexport interface ReadTextFileRequest extends AcpExtensible {\n sessionId: SessionId;\n path: string;\n line?: number | null;\n limit?: number | null;\n}\n\nexport interface ReadTextFileResponse extends AcpExtensible {\n content: string;\n}\n\nexport interface WriteTextFileRequest extends AcpExtensible {\n sessionId: SessionId;\n path: string;\n content: string;\n}\n\nexport type WriteTextFileResponse = AcpExtensible;\n\nexport interface CreateTerminalRequest extends AcpExtensible {\n sessionId: SessionId;\n command: string;\n args?: string[];\n cwd?: string | null;\n env?: EnvVariable[];\n outputByteLimit?: number | null;\n}\n\nexport interface CreateTerminalResponse extends AcpExtensible {\n terminalId: string;\n}\n\nexport interface TerminalOutputRequest extends AcpExtensible {\n sessionId: SessionId;\n terminalId: string;\n}\n\nexport interface TerminalOutputResponse extends AcpExtensible {\n output: string;\n truncated: boolean;\n exitStatus?: TerminalExitStatus | null;\n}\n\nexport interface WaitForTerminalExitRequest extends AcpExtensible {\n sessionId: SessionId;\n terminalId: string;\n}\n\nexport interface WaitForTerminalExitResponse extends AcpExtensible {\n exitCode?: number | null;\n signal?: string | null;\n}\n\nexport interface KillTerminalCommandRequest extends AcpExtensible {\n sessionId: SessionId;\n terminalId: string;\n}\n\nexport type KillTerminalCommandResponse = AcpExtensible;\n\nexport interface ReleaseTerminalRequest extends AcpExtensible {\n sessionId: SessionId;\n terminalId: string;\n}\n\nexport type ReleaseTerminalResponse = AcpExtensible;\n\nexport interface ExtMethodRequest extends AcpExtensible {\n method: `_${string}`;\n params?: unknown;\n}\n\nexport interface ExtNotification extends AcpExtensible {\n method: `_${string}`;\n params?: unknown;\n}\n", "import type { Readable, Writable } from \"node:stream\";\nimport {\n ACP_ERROR_CODE_INTERNAL,\n ACP_ERROR_CODE_INVALID_REQUEST,\n ACP_ERROR_CODE_METHOD_NOT_FOUND,\n ACP_ERROR_CODE_PARSE,\n AcpError,\n isAcpError,\n isAcpErrorCode,\n type RequestId,\n} from \"./types.js\";\n\nexport interface JsonRpcRequestMessage {\n jsonrpc: \"2.0\";\n id: RequestId;\n method: string;\n params?: unknown;\n}\n\nexport interface JsonRpcNotificationMessage {\n jsonrpc: \"2.0\";\n method: string;\n params?: unknown;\n}\n\nexport interface JsonRpcErrorObject {\n code: number;\n message: string;\n data?: unknown;\n}\n\nexport interface JsonRpcSuccessResponseMessage {\n jsonrpc: \"2.0\";\n id: RequestId;\n result: unknown;\n}\n\nexport interface JsonRpcErrorResponseMessage {\n jsonrpc: \"2.0\";\n id: RequestId;\n error: JsonRpcErrorObject;\n}\n\nexport type JsonRpcResponseMessage =\n | JsonRpcSuccessResponseMessage\n | JsonRpcErrorResponseMessage;\n\nexport type JsonRpcOutgoingMessage =\n | JsonRpcRequestMessage\n | JsonRpcNotificationMessage\n | JsonRpcResponseMessage;\n\nexport type ParsedJsonRpcMessage =\n | {\n type: \"request\";\n message: JsonRpcRequestMessage;\n }\n | {\n type: \"notification\";\n message: JsonRpcNotificationMessage;\n }\n | {\n type: \"response\";\n message: JsonRpcResponseMessage;\n }\n | {\n type: \"invalid\";\n id: RequestId;\n error: AcpError;\n };\n\nexport interface JsonRpcRequestOptions {\n id?: RequestId;\n}\n\nexport interface JsonRpcMessageLayerOptions {\n input: Readable;\n output: Writable;\n firstRequestId?: number;\n}\n\nexport type JsonRpcRequestHandler = (\n params: unknown,\n context: { id: RequestId; method: string }\n) => Promise<unknown> | unknown;\n\nexport type JsonRpcNotificationHandler = (\n params: unknown,\n context: { method: string }\n) => Promise<void> | void;\n\ninterface PendingRequest {\n method: string;\n resolve: (value: unknown) => void;\n reject: (reason: unknown) => void;\n}\n\ninterface JsonRpcResponseError extends Error {\n code: number;\n data?: unknown;\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction hasOwn(\n value: Record<string, unknown>,\n property: string\n): property is keyof typeof value {\n return Object.prototype.hasOwnProperty.call(value, property);\n}\n\nfunction isRequestId(value: unknown): value is RequestId {\n return value === null || typeof value === \"string\" || typeof value === \"number\";\n}\n\nfunction toRequestId(value: unknown): RequestId {\n return isRequestId(value) ? value : null;\n}\n\nfunction parseError(): AcpError {\n return new AcpError(ACP_ERROR_CODE_PARSE, \"Parse error\");\n}\n\nfunction invalidRequest(): AcpError {\n return new AcpError(ACP_ERROR_CODE_INVALID_REQUEST, \"Invalid Request\");\n}\n\nfunction methodNotFound(method: string): AcpError {\n return new AcpError(\n ACP_ERROR_CODE_METHOD_NOT_FOUND,\n `Method not found: \"${method}\"`\n );\n}\n\nfunction internalError(message: string): AcpError {\n return new AcpError(ACP_ERROR_CODE_INTERNAL, message);\n}\n\nfunction isJsonRpcErrorObject(value: unknown): value is JsonRpcErrorObject {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n if (!isAcpErrorCode(value.code) || typeof value.message !== \"string\") {\n return false;\n }\n\n return value.data === undefined || hasOwn(value, \"data\");\n}\n\nfunction toResponseError(error: JsonRpcErrorObject): JsonRpcResponseError {\n return new AcpError(error.code, error.message, error.data);\n}\n\nfunction toDispatchError(error: unknown): AcpError {\n if (error instanceof AcpError) {\n return error;\n }\n\n if (isAcpError(error)) {\n return new AcpError(error.code, error.message, error.data);\n }\n\n if (error instanceof Error && error.message.length > 0) {\n return internalError(error.message);\n }\n\n return internalError(\"Internal error\");\n}\n\nfunction chunkToString(chunk: unknown): string {\n if (typeof chunk === \"string\") {\n return chunk;\n }\n\n if (chunk instanceof Uint8Array) {\n return Buffer.from(chunk).toString(\"utf8\");\n }\n\n return String(chunk);\n}\n\nfunction normalizeLine(line: string): string {\n return line.endsWith(\"\\r\") ? line.slice(0, -1) : line;\n}\n\nasync function* readLines(stream: Readable): AsyncGenerator<string> {\n let buffer = \"\";\n\n for await (const chunk of stream as AsyncIterable<unknown>) {\n buffer += chunkToString(chunk);\n\n while (true) {\n const newlineIndex = buffer.indexOf(\"\\n\");\n if (newlineIndex === -1) {\n break;\n }\n\n const line = buffer.slice(0, newlineIndex);\n buffer = buffer.slice(newlineIndex + 1);\n yield normalizeLine(line);\n }\n }\n\n if (buffer.length > 0) {\n yield normalizeLine(buffer);\n }\n}\n\nfunction createResponseMessage(\n id: RequestId,\n result: unknown\n): JsonRpcSuccessResponseMessage {\n return {\n jsonrpc: \"2.0\",\n id,\n result: result === undefined ? null : result,\n };\n}\n\nexport function createJsonRpcErrorResponse(\n id: RequestId,\n error: AcpError\n): JsonRpcErrorResponseMessage {\n const response: JsonRpcErrorResponseMessage = {\n jsonrpc: \"2.0\",\n id,\n error: {\n code: error.code,\n message: error.message,\n },\n };\n\n if (error.data !== undefined) {\n response.error.data = error.data;\n }\n\n return response;\n}\n\nexport function serializeJsonRpcMessage(message: JsonRpcOutgoingMessage): string {\n return `${JSON.stringify(message)}\\n`;\n}\n\nexport function parseJsonRpcMessage(line: string): ParsedJsonRpcMessage {\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch {\n return {\n type: \"invalid\",\n id: null,\n error: parseError(),\n };\n }\n\n if (!isObjectRecord(parsed)) {\n return {\n type: \"invalid\",\n id: null,\n error: invalidRequest(),\n };\n }\n\n const id = toRequestId(parsed.id);\n\n if (parsed.jsonrpc !== \"2.0\") {\n return {\n type: \"invalid\",\n id,\n error: invalidRequest(),\n };\n }\n\n const hasMethod = hasOwn(parsed, \"method\");\n const hasId = hasOwn(parsed, \"id\");\n\n if (hasMethod) {\n if (typeof parsed.method !== \"string\") {\n return {\n type: \"invalid\",\n id,\n error: invalidRequest(),\n };\n }\n\n if (hasId) {\n if (!isRequestId(parsed.id)) {\n return {\n type: \"invalid\",\n id: null,\n error: invalidRequest(),\n };\n }\n\n const request: JsonRpcRequestMessage = {\n jsonrpc: \"2.0\",\n id: parsed.id,\n method: parsed.method,\n };\n\n if (hasOwn(parsed, \"params\")) {\n request.params = parsed.params;\n }\n\n return { type: \"request\", message: request };\n }\n\n const notification: JsonRpcNotificationMessage = {\n jsonrpc: \"2.0\",\n method: parsed.method,\n };\n\n if (hasOwn(parsed, \"params\")) {\n notification.params = parsed.params;\n }\n\n return {\n type: \"notification\",\n message: notification,\n };\n }\n\n if (!hasId || !isRequestId(parsed.id)) {\n return {\n type: \"invalid\",\n id,\n error: invalidRequest(),\n };\n }\n\n const hasResult = hasOwn(parsed, \"result\");\n const hasError = hasOwn(parsed, \"error\");\n\n if (hasResult === hasError) {\n return {\n type: \"invalid\",\n id: parsed.id,\n error: invalidRequest(),\n };\n }\n\n if (hasResult) {\n return {\n type: \"response\",\n message: {\n jsonrpc: \"2.0\",\n id: parsed.id,\n result: parsed.result,\n },\n };\n }\n\n if (!isJsonRpcErrorObject(parsed.error)) {\n return {\n type: \"invalid\",\n id: parsed.id,\n error: invalidRequest(),\n };\n }\n\n return {\n type: \"response\",\n message: {\n jsonrpc: \"2.0\",\n id: parsed.id,\n error: parsed.error,\n },\n };\n}\n\nexport class JsonRpcMessageLayer {\n private readonly input: Readable;\n private readonly output: Writable;\n private readonly requestHandlers = new Map<string, JsonRpcRequestHandler>();\n private readonly notificationHandlers = new Map<\n string,\n JsonRpcNotificationHandler\n >();\n private readonly pending = new Map<RequestId, PendingRequest>();\n private nextRequestId: number;\n private disposed = false;\n\n constructor(options: JsonRpcMessageLayerOptions) {\n this.input = options.input;\n this.output = options.output;\n this.nextRequestId = options.firstRequestId ?? 1;\n\n if (!Number.isFinite(this.nextRequestId)) {\n throw new Error(\"firstRequestId must be a finite number\");\n }\n\n void this.consumeInput();\n }\n\n onRequest(method: string, handler: JsonRpcRequestHandler): void {\n this.requestHandlers.set(method, handler);\n }\n\n onNotification(method: string, handler: JsonRpcNotificationHandler): void {\n this.notificationHandlers.set(method, handler);\n }\n\n pendingRequestCount(): number {\n return this.pending.size;\n }\n\n sendNotification(method: string, params?: unknown): void {\n const notification: JsonRpcNotificationMessage = {\n jsonrpc: \"2.0\",\n method,\n };\n\n if (params !== undefined) {\n notification.params = params;\n }\n\n this.sendMessage(notification);\n }\n\n sendRequest(\n method: string,\n params?: unknown,\n options: JsonRpcRequestOptions = {}\n ): Promise<unknown> {\n if (this.disposed) {\n throw new Error(\"JSON-RPC message layer is disposed\");\n }\n\n const id = options.id === undefined ? this.nextRequestId++ : options.id;\n\n if (this.pending.has(id)) {\n throw new Error(`A request with id ${JSON.stringify(id)} is already pending`);\n }\n\n const request: JsonRpcRequestMessage = {\n jsonrpc: \"2.0\",\n id,\n method,\n };\n\n if (params !== undefined) {\n request.params = params;\n }\n\n return new Promise((resolve, reject) => {\n this.pending.set(id, {\n method,\n resolve,\n reject,\n });\n\n try {\n this.sendMessage(request);\n } catch (error) {\n this.pending.delete(id);\n reject(error);\n }\n });\n }\n\n dispose(reason: Error = new Error(\"JSON-RPC message layer disposed\")): void {\n if (this.disposed) {\n return;\n }\n\n this.disposed = true;\n this.rejectAllPending(reason);\n }\n\n private async consumeInput(): Promise<void> {\n try {\n for await (const line of readLines(this.input)) {\n if (this.disposed || line.length === 0) {\n continue;\n }\n\n await this.handleIncomingLine(line);\n }\n\n if (!this.disposed) {\n this.dispose(new Error(\"JSON-RPC input stream closed\"));\n }\n } catch (error) {\n if (!this.disposed) {\n this.dispose(\n error instanceof Error\n ? error\n : new Error(`JSON-RPC input stream failed: ${String(error)}`)\n );\n }\n }\n }\n\n private async handleIncomingLine(line: string): Promise<void> {\n const parsed = parseJsonRpcMessage(line);\n\n if (parsed.type === \"invalid\") {\n this.sendMessage(createJsonRpcErrorResponse(parsed.id, parsed.error));\n return;\n }\n\n if (parsed.type === \"response\") {\n this.handleResponse(parsed.message);\n return;\n }\n\n if (parsed.type === \"notification\") {\n await this.handleNotification(parsed.message);\n return;\n }\n\n await this.handleRequest(parsed.message);\n }\n\n private handleResponse(message: JsonRpcResponseMessage): void {\n const pending = this.pending.get(message.id);\n if (!pending) {\n return;\n }\n\n this.pending.delete(message.id);\n\n if (\"error\" in message) {\n pending.reject(toResponseError(message.error));\n return;\n }\n\n pending.resolve(message.result);\n }\n\n private async handleRequest(message: JsonRpcRequestMessage): Promise<void> {\n const handler = this.requestHandlers.get(message.method);\n if (!handler) {\n this.sendMessage(createJsonRpcErrorResponse(message.id, methodNotFound(message.method)));\n return;\n }\n\n try {\n const result = await handler(message.params, {\n id: message.id,\n method: message.method,\n });\n this.sendMessage(createResponseMessage(message.id, result));\n } catch (error) {\n this.sendMessage(createJsonRpcErrorResponse(message.id, toDispatchError(error)));\n }\n }\n\n private async handleNotification(\n message: JsonRpcNotificationMessage\n ): Promise<void> {\n const handler = this.notificationHandlers.get(message.method);\n if (!handler) {\n return;\n }\n\n try {\n await handler(message.params, { method: message.method });\n } catch {\n // Notifications are fire-and-forget per JSON-RPC.\n }\n }\n\n private sendMessage(message: JsonRpcOutgoingMessage): void {\n if (this.disposed) {\n throw new Error(\"JSON-RPC message layer is disposed\");\n }\n\n this.output.write(serializeJsonRpcMessage(message));\n }\n\n private rejectAllPending(error: Error): void {\n for (const pending of this.pending.values()) {\n pending.reject(error);\n }\n\n this.pending.clear();\n }\n}\n", "import * as fsPromises from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport {\n extractToolCallSummariesFromSessionUpdateStream,\n extractUsageFromSessionUpdateStream,\n type ToolCallSummary,\n} from \"./stream-helpers.js\";\nimport type { Cost, SessionUpdate, SessionUpdateNotification, UsageUpdate } from \"./types.js\";\n\ntype SessionUpdateStreamItem = SessionUpdateNotification | SessionUpdate;\n\nexport type RunExitStatus = \"success\" | \"failed\";\n\nexport interface RunReportUsage {\n used: number;\n size: number;\n updates: number;\n cost?: Cost | null;\n}\n\nexport interface RunReportError {\n message: string;\n toolCallId?: string;\n}\n\nexport interface RunReport {\n runId: string;\n startTime: string;\n endTime: string;\n exitStatus: RunExitStatus;\n toolCalls: ToolCallSummary[];\n usage: RunReportUsage;\n errors: RunReportError[];\n}\n\nexport interface GenerateRunReportOptions {\n runId?: string;\n startTime?: string | Date;\n endTime?: string | Date;\n exitStatus?: RunExitStatus;\n errors?: string[];\n now?: () => Date;\n}\n\nexport type RunReportFileSystem = {\n mkdir(path: string, options?: { recursive?: boolean }): Promise<void>;\n writeFile(\n path: string,\n data: string,\n options?: { encoding?: BufferEncoding },\n ): Promise<void>;\n};\n\nexport interface SaveRunReportOptions {\n fs?: RunReportFileSystem;\n homeDir?: string;\n now?: () => Date;\n}\n\nexport interface SavedRunReportPaths {\n reportsDir: string;\n jsonPath: string;\n summaryPath: string;\n}\n\nexport async function generateRunReportFromSessionUpdateStream(\n stream: AsyncIterable<SessionUpdateStreamItem> | Iterable<SessionUpdateStreamItem>,\n options: GenerateRunReportOptions = {},\n): Promise<RunReport> {\n const now = options.now ?? (() => new Date());\n\n const bufferedEntries: SessionUpdateStreamItem[] = [];\n let runIdFromStream: string | undefined;\n\n for await (const entry of stream) {\n bufferedEntries.push(entry);\n if (runIdFromStream) {\n continue;\n }\n\n if (isSessionUpdateNotification(entry)) {\n const sessionId = toNonEmptyString(entry.params.sessionId);\n if (sessionId) {\n runIdFromStream = sessionId;\n }\n }\n }\n\n const runId = toNonEmptyString(options.runId) ?? runIdFromStream;\n if (!runId) {\n throw new Error(\"Run id is required via options.runId or session/update stream items\");\n }\n\n const startTime = normalizeTime(options.startTime, now);\n const endTime = normalizeTime(options.endTime, now);\n\n const toolCalls = await extractToolCallSummariesFromSessionUpdateStream(bufferedEntries);\n const usageUpdates = await extractUsageFromSessionUpdateStream(bufferedEntries);\n\n const usage = summarizeUsage(usageUpdates);\n const errors = collectErrors(toolCalls, options.errors);\n const exitStatus = options.exitStatus ?? (errors.length > 0 ? \"failed\" : \"success\");\n\n return {\n runId,\n startTime,\n endTime,\n exitStatus,\n toolCalls,\n usage,\n errors,\n };\n}\n\nexport function formatRunReportSummary(report: RunReport): string {\n const lines = [\n `Run ID: ${report.runId}`,\n `Start time: ${report.startTime}`,\n `End time: ${report.endTime}`,\n `Duration: ${toDuration(report.startTime, report.endTime)}`,\n `Exit status: ${report.exitStatus}`,\n `Tool count: ${report.toolCalls.length}`,\n `Token usage: ${report.usage.used}/${report.usage.size}`,\n `Error count: ${report.errors.length}`,\n ];\n\n if (report.usage.cost) {\n lines.push(`Cost: ${report.usage.cost.amount} ${report.usage.cost.currency}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nexport async function saveRunReport(\n report: RunReport,\n options: SaveRunReportOptions = {},\n): Promise<SavedRunReportPaths> {\n const fs = options.fs ?? fsPromises;\n const now = options.now ?? (() => new Date());\n\n const reportsDir = join(options.homeDir ?? homedir(), \".poe-code\", \"reports\");\n await fs.mkdir(reportsDir, { recursive: true });\n\n const timestamp = toTimestampForFileName(now());\n const safeRunId = toSafeFileSegment(report.runId);\n const baseFileName = `${timestamp}-${safeRunId}`;\n\n const jsonPath = join(reportsDir, `${baseFileName}.json`);\n const summaryPath = join(reportsDir, `${baseFileName}.txt`);\n\n await fs.writeFile(jsonPath, JSON.stringify(report, null, 2), { encoding: \"utf8\" });\n await fs.writeFile(summaryPath, formatRunReportSummary(report), { encoding: \"utf8\" });\n\n return {\n reportsDir,\n jsonPath,\n summaryPath,\n };\n}\n\nfunction isSessionUpdateNotification(entry: SessionUpdateStreamItem): entry is SessionUpdateNotification {\n return (\n typeof (entry as SessionUpdateNotification).jsonrpc === \"string\" &&\n (entry as SessionUpdateNotification).method === \"session/update\"\n );\n}\n\nfunction normalizeTime(value: string | Date | undefined, now: () => Date): string {\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n if (typeof value === \"string\" && value.length > 0) {\n const parsed = new Date(value);\n if (!Number.isNaN(parsed.getTime())) {\n return parsed.toISOString();\n }\n }\n\n return now().toISOString();\n}\n\nfunction summarizeUsage(updates: readonly UsageUpdate[]): RunReportUsage {\n let used = 0;\n let size = 0;\n let cost: Cost | null | undefined;\n\n for (const update of updates) {\n used += update.used;\n size += update.size;\n\n if (update.cost !== undefined) {\n cost = update.cost;\n }\n }\n\n const usage: RunReportUsage = {\n used,\n size,\n updates: updates.length,\n };\n\n if (cost !== undefined) {\n usage.cost = cost;\n }\n\n return usage;\n}\n\nfunction collectErrors(\n toolCalls: readonly ToolCallSummary[],\n additionalErrors: readonly string[] | undefined,\n): RunReportError[] {\n const errors: RunReportError[] = [];\n\n for (const toolCall of toolCalls) {\n if (toolCall.status !== \"failed\") {\n continue;\n }\n\n errors.push({\n toolCallId: toolCall.toolCallId,\n message: toErrorMessage(toolCall),\n });\n }\n\n if (additionalErrors) {\n for (const message of additionalErrors) {\n const text = toNonEmptyString(message);\n if (text) {\n errors.push({ message: text });\n }\n }\n }\n\n return errors;\n}\n\nfunction toErrorMessage(toolCall: ToolCallSummary): string {\n if (typeof toolCall.rawOutput === \"string\" && toolCall.rawOutput.length > 0) {\n return toolCall.rawOutput;\n }\n\n if (toolCall.rawOutput instanceof Error && toolCall.rawOutput.message.length > 0) {\n return toolCall.rawOutput.message;\n }\n\n if (toolCall.rawOutput !== undefined && toolCall.rawOutput !== null) {\n const encoded = trySerialize(toolCall.rawOutput);\n if (encoded) {\n return encoded;\n }\n }\n\n return `${toolCall.title} failed`;\n}\n\nfunction trySerialize(value: unknown): string | undefined {\n try {\n const serialized = JSON.stringify(value);\n if (typeof serialized === \"string\" && serialized.length > 0) {\n return serialized;\n }\n } catch {\n return undefined;\n }\n\n return undefined;\n}\n\nfunction toDuration(startTime: string, endTime: string): string {\n const startMs = Date.parse(startTime);\n const endMs = Date.parse(endTime);\n\n if (Number.isNaN(startMs) || Number.isNaN(endMs) || endMs < startMs) {\n return \"unknown\";\n }\n\n const seconds = (endMs - startMs) / 1000;\n return `${Number(seconds.toFixed(3))}s`;\n}\n\nfunction toSafeFileSegment(value: string): string {\n let output = \"\";\n\n for (const char of value) {\n if (isAsciiLetterOrDigit(char) || char === \"-\" || char === \"_\") {\n output += char;\n continue;\n }\n\n output += \"-\";\n }\n\n return output.length > 0 ? output : \"run\";\n}\n\nfunction isAsciiLetterOrDigit(value: string): boolean {\n const code = value.charCodeAt(0);\n return (\n (code >= 48 && code <= 57) ||\n (code >= 65 && code <= 90) ||\n (code >= 97 && code <= 122)\n );\n}\n\nfunction toTimestampForFileName(value: Date): string {\n return [\n String(value.getUTCFullYear()),\n pad(value.getUTCMonth() + 1, 2),\n pad(value.getUTCDate(), 2),\n ].join(\"\")\n + \"-\"\n + [\n pad(value.getUTCHours(), 2),\n pad(value.getUTCMinutes(), 2),\n pad(value.getUTCSeconds(), 2),\n ].join(\"\")\n + \"-\"\n + pad(value.getUTCMilliseconds(), 3);\n}\n\nfunction pad(value: number, size: number): string {\n const text = String(value);\n if (text.length >= size) {\n return text;\n }\n\n return `${\"0\".repeat(size - text.length)}${text}`;\n}\n\nfunction toNonEmptyString(value: unknown): string | undefined {\n if (typeof value !== \"string\" || value.length === 0) {\n return undefined;\n }\n\n return value;\n}\n", "import { execFile as execFileCallback } from \"node:child_process\";\nimport fsPromises from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport fastGlob from \"fast-glob\";\nimport type { AgentPlugin } from \"../runtime/plugin-types.js\";\nimport {\n readOptionalString,\n readOptionalStringArray,\n rejectUnknownKeys,\n toOptionsObject\n} from \"./parse-options.js\";\nimport {\n getOptionalBoolean,\n getOptionalNonNegativeInteger,\n getOptionalString,\n getRequiredString,\n isObjectRecord,\n resolveAllowedPath\n} from \"./plugin-args.js\";\nimport type { PluginSpec } from \"./registry.js\";\n\ntype PluginFileSystem = Pick<\n typeof fsPromises,\n \"mkdir\" | \"readFile\" | \"readdir\" | \"stat\" | \"writeFile\"\n>;\n\ntype GrepOutputMode = \"files_with_matches\" | \"content\" | \"count\";\n\ntype SearchContentOptions = {\n pattern: string;\n path: string;\n glob?: string;\n outputMode: GrepOutputMode;\n lineNumbers: boolean;\n ignoreCase: boolean;\n signal: AbortSignal;\n};\n\ntype SearchContentFn = (options: SearchContentOptions) => Promise<string>;\n\ntype GlobFilesOptions = {\n pattern: string;\n cwd: string;\n};\n\ntype GlobFilesFn = (options: GlobFilesOptions) => Promise<string[]>;\n\ntype FilesPluginOptions = {\n cwd?: string;\n allowedPaths?: string[];\n fs?: PluginFileSystem;\n searchContent?: SearchContentFn;\n globFiles?: GlobFilesFn;\n};\n\nexport type FilesPluginConfigOptions = Pick<FilesPluginOptions, \"cwd\" | \"allowedPaths\">;\n\nconst execFile = promisify(execFileCallback);\n\nconst filesPlugin = (options: FilesPluginOptions = {}): AgentPlugin => {\n const cwd = path.resolve(options.cwd ?? process.cwd());\n const allowedPaths = (options.allowedPaths ?? [cwd]).map((allowedPath) =>\n path.resolve(cwd, allowedPath)\n );\n const fs = options.fs ?? fsPromises;\n const searchContent =\n options.searchContent ?? ((searchOptions) => defaultSearchContent(searchOptions, fs));\n const globFiles = options.globFiles ?? defaultGlobFiles;\n\n const readFileTool = {\n name: \"read_file\",\n description: \"Read UTF-8 content from a file.\",\n policy: {\n read: true,\n edit: true\n },\n inputSchema: {\n type: \"object\",\n properties: {\n path: {\n type: \"string\",\n description: \"Path to the file to read.\"\n },\n offset: {\n type: \"integer\",\n minimum: 0,\n description: \"Zero-based starting line offset.\"\n },\n limit: {\n type: \"integer\",\n minimum: 0,\n description: \"Maximum number of lines to read.\"\n }\n },\n required: [\"path\"]\n },\n async call(args: unknown) {\n const filePath = resolveAllowedPath(cwd, allowedPaths, getRequiredString(args, \"path\"));\n const imageMimeType = detectImageMimeType(filePath);\n if (imageMimeType !== undefined) {\n const content = await fs.readFile(filePath);\n return {\n type: \"image\" as const,\n mimeType: imageMimeType,\n data: Buffer.from(content).toString(\"base64\")\n };\n }\n\n const content = await fs.readFile(filePath, \"utf8\");\n return sliceLines(\n content,\n getOptionalNonNegativeInteger(args, \"offset\") ?? 0,\n getOptionalNonNegativeInteger(args, \"limit\")\n );\n }\n };\n\n const editFileTool = {\n name: \"edit_file\",\n description:\n \"Edit or create files. 'str_replace' replaces exact text (old_str must be unique unless replace_all is true). 'create' writes a new file and fails if it exists. 'overwrite' replaces file contents, creating the file if missing.\",\n policy: {\n read: false,\n edit: true\n },\n inputSchema: {\n type: \"object\",\n properties: {\n command: {\n type: \"string\",\n enum: [\"str_replace\", \"create\", \"overwrite\"],\n description: \"Operation to perform.\"\n },\n path: {\n type: \"string\",\n description: \"File path.\"\n },\n old_str: {\n type: \"string\",\n description:\n \"Exact string to find and replace (str_replace only). Must match exactly once.\"\n },\n new_str: {\n type: \"string\",\n description: \"Replacement string (str_replace only).\"\n },\n replace_all: {\n type: \"boolean\",\n description: \"Replace all matching occurrences instead of requiring exactly one match.\"\n },\n file_text: {\n type: \"string\",\n description: \"Full file content (create and overwrite only).\"\n }\n },\n required: [\"command\", \"path\"]\n },\n async call(args: unknown): Promise<string> {\n const command = getRequiredString(args, \"command\");\n const filePath = resolveAllowedPath(cwd, allowedPaths, getRequiredString(args, \"path\"));\n const displayedPath = formatDisplayPath(cwd, filePath);\n\n if (command === \"str_replace\") {\n const oldStr = getRequiredString(args, \"old_str\", true);\n const newStr = getRequiredString(args, \"new_str\", true);\n const replaceAll = getOptionalBoolean(args, \"replace_all\") ?? false;\n const content = await fs.readFile(filePath, \"utf8\");\n\n if (oldStr.length === 0) {\n throw new Error('Tool argument \"old_str\" must not be empty');\n }\n\n const count = countOccurrences(content, oldStr);\n\n if (count === 0) {\n throw new Error(\"old_str not found in file\");\n }\n\n if (!replaceAll && count > 1) {\n throw new Error(`old_str appears ${count} times \u2014 must be unique`);\n }\n\n await fs.writeFile(\n filePath,\n replaceAll ? content.split(oldStr).join(newStr) : content.replace(oldStr, newStr),\n \"utf8\"\n );\n return `Edited file: ${displayedPath}`;\n }\n\n if (command === \"create\") {\n const fileText = getRequiredString(args, \"file_text\", true);\n\n if (await fileExists(fs, filePath)) {\n throw new Error(\"File already exists \u2014 use str_replace to edit\");\n }\n\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, fileText, \"utf8\");\n return `Created file: ${displayedPath}`;\n }\n\n if (command === \"overwrite\") {\n const fileText = getRequiredString(args, \"file_text\", true);\n\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, fileText, \"utf8\");\n return `Overwrote file: ${displayedPath}`;\n }\n\n throw new Error(`Unknown edit_file command: ${command}`);\n }\n };\n\n const listFilesTool = {\n name: \"list_files\",\n description: \"List files in a directory.\",\n policy: {\n read: true,\n edit: true\n },\n inputSchema: {\n type: \"object\",\n properties: {\n path: {\n type: \"string\",\n description: \"Directory path to list. Defaults to current working directory.\"\n }\n }\n },\n async call(args: unknown): Promise<string> {\n const rawPath = getOptionalString(args, \"path\") ?? \".\";\n const directoryPath = resolveAllowedPath(cwd, allowedPaths, rawPath);\n const entries = await fs.readdir(directoryPath);\n const names = entries.sort((left, right) => left.localeCompare(right));\n\n if (names.length === 0) {\n return \"(empty directory)\";\n }\n\n return names.join(\"\\n\");\n }\n };\n\n const grepTool = {\n name: \"grep\",\n description: \"Search file contents with ripgrep.\",\n policy: {\n read: true,\n edit: true\n },\n inputSchema: {\n type: \"object\",\n properties: {\n pattern: {\n type: \"string\",\n description: \"Pattern to search for.\"\n },\n path: {\n type: \"string\",\n description:\n \"Directory or file path to search. Defaults to the current working directory.\"\n },\n glob: {\n type: \"string\",\n description: \"Optional glob filter passed to ripgrep.\"\n },\n output_mode: {\n type: \"string\",\n enum: [\"files_with_matches\", \"content\", \"count\"],\n description: \"Whether to return matching files, matching content, or a total count.\"\n },\n line_numbers: {\n type: \"boolean\",\n description: \"Include line numbers in content output.\"\n },\n ignore_case: {\n type: \"boolean\",\n description: \"Case-insensitive search.\"\n }\n },\n required: [\"pattern\"]\n },\n async call(args: unknown, ctx: { signal: AbortSignal }): Promise<string> {\n const searchPath = resolveAllowedPath(\n cwd,\n allowedPaths,\n getOptionalString(args, \"path\") ?? \".\"\n );\n\n return searchContent({\n pattern: getRequiredString(args, \"pattern\"),\n path: searchPath,\n glob: getOptionalString(args, \"glob\"),\n outputMode: getOptionalGrepOutputMode(args, \"output_mode\") ?? \"content\",\n lineNumbers: getOptionalBoolean(args, \"line_numbers\") ?? false,\n ignoreCase: getOptionalBoolean(args, \"ignore_case\") ?? false,\n signal: ctx.signal\n });\n }\n };\n\n const globTool = {\n name: \"glob\",\n description: \"Find files by glob pattern, sorted by most recently modified first.\",\n policy: {\n read: true,\n edit: true\n },\n inputSchema: {\n type: \"object\",\n properties: {\n pattern: {\n type: \"string\",\n description: \"Fast-glob pattern to match.\"\n },\n path: {\n type: \"string\",\n description: \"Directory to search from. Defaults to the current working directory.\"\n }\n },\n required: [\"pattern\"]\n },\n async call(args: unknown): Promise<string> {\n const searchPath = resolveAllowedPath(\n cwd,\n allowedPaths,\n getOptionalString(args, \"path\") ?? \".\"\n );\n const matches = await globFiles({\n pattern: getRequiredString(args, \"pattern\"),\n cwd: searchPath\n });\n\n const sortedMatches = await sortPathsByModifiedTime(\n matches.map((match) => resolveAllowedPath(cwd, allowedPaths, match)),\n fs\n );\n\n if (sortedMatches.length === 0) {\n return \"(no matches)\";\n }\n\n return sortedMatches.map((match) => formatDisplayPath(cwd, match)).join(\"\\n\");\n }\n };\n\n return {\n name: \"poe-agent-plugin-files\",\n tools: [readFileTool, editFileTool, listFilesTool, grepTool, globTool]\n };\n};\n\nasync function fileExists(fs: PluginFileSystem, filePath: string): Promise<boolean> {\n try {\n await fs.stat(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction countOccurrences(text: string, search: string): number {\n if (search.length === 0) {\n return 0;\n }\n\n let count = 0;\n let index = 0;\n\n while ((index = text.indexOf(search, index)) !== -1) {\n count += 1;\n index += search.length;\n }\n\n return count;\n}\n\nfunction getOptionalGrepOutputMode(args: unknown, key: string): GrepOutputMode | undefined {\n if (!isObjectRecord(args)) {\n throw new Error(\n `Tool argument \"${key}\" must be one of \"files_with_matches\", \"content\", or \"count\"`\n );\n }\n\n const value = args[key];\n if (value === undefined) {\n return undefined;\n }\n\n if (value === \"files_with_matches\" || value === \"content\" || value === \"count\") {\n return value;\n }\n\n throw new Error(\n `Tool argument \"${key}\" must be one of \"files_with_matches\", \"content\", or \"count\"`\n );\n}\n\nfunction formatDisplayPath(cwd: string, filePath: string): string {\n return path.relative(cwd, filePath) || path.basename(filePath);\n}\n\nasync function sortPathsByModifiedTime(\n matches: string[],\n fs: Pick<typeof fsPromises, \"stat\">\n): Promise<string[]> {\n const entries = await Promise.all(\n matches.map(async (match) => ({\n path: match,\n mtimeMs: (await fs.stat(match)).mtimeMs\n }))\n );\n\n entries.sort((left, right) => {\n if (right.mtimeMs !== left.mtimeMs) {\n return right.mtimeMs - left.mtimeMs;\n }\n\n return left.path.localeCompare(right.path);\n });\n\n return entries.map((entry) => entry.path);\n}\n\nasync function defaultSearchContent(\n options: SearchContentOptions,\n fs: Pick<typeof fsPromises, \"stat\">\n): Promise<string> {\n const targetStat = await fs.stat(options.path);\n const searchCwd = targetStat.isDirectory() ? options.path : path.dirname(options.path);\n const searchTarget = targetStat.isDirectory() ? \".\" : path.basename(options.path);\n const args = [\"--color\", \"never\"];\n\n if (options.outputMode === \"content\") {\n args.push(\"--with-filename\");\n if (options.lineNumbers) {\n args.push(\"-n\");\n }\n } else if (options.outputMode === \"files_with_matches\") {\n args.push(\"--files-with-matches\");\n } else {\n args.push(\"--count\", \"--no-filename\");\n }\n\n if (options.ignoreCase) {\n args.push(\"-i\");\n }\n\n if (options.glob !== undefined) {\n args.push(\"--glob\", options.glob);\n }\n\n args.push(options.pattern, searchTarget);\n\n try {\n const result = await execFile(\"rg\", args, {\n cwd: searchCwd,\n maxBuffer: 1024 * 1024,\n signal: options.signal\n });\n\n return formatGrepOutput(result.stdout, options.outputMode);\n } catch (error) {\n if (typeof error === \"object\" && error !== null && Reflect.get(error, \"code\") === 1) {\n return options.outputMode === \"count\" ? \"0\" : \"(no matches)\";\n }\n\n if (error instanceof Error) {\n const stderr = Reflect.get(error, \"stderr\");\n if (typeof stderr === \"string\" && stderr.trim().length > 0) {\n throw new Error(`grep failed: ${stderr.trim()}`);\n }\n\n throw new Error(`grep failed: ${error.message}`);\n }\n\n throw new Error(`grep failed: ${String(error)}`);\n }\n}\n\nfunction formatGrepOutput(stdout: string, outputMode: GrepOutputMode): string {\n const trimmed = stdout.trimEnd();\n\n if (trimmed.length === 0) {\n return outputMode === \"count\" ? \"0\" : \"(no matches)\";\n }\n\n if (outputMode !== \"count\") {\n return trimmed;\n }\n\n let count = 0;\n for (const line of trimmed.split(\"\\n\")) {\n const parsed = Number(line);\n if (Number.isNaN(parsed)) {\n return trimmed;\n }\n\n count += parsed;\n }\n\n return String(count);\n}\n\nasync function defaultGlobFiles(options: GlobFilesOptions): Promise<string[]> {\n return fastGlob(options.pattern, {\n absolute: true,\n cwd: options.cwd,\n dot: true,\n onlyFiles: true,\n unique: true\n });\n}\n\nfunction sliceLines(content: string, offset: number, limit: number | undefined): string {\n if (offset === 0 && limit === undefined) {\n return content;\n }\n\n if (limit === 0) {\n return \"\";\n }\n\n let lineStart = 0;\n\n for (let currentLine = 0; currentLine < offset; currentLine += 1) {\n const nextNewline = content.indexOf(\"\\n\", lineStart);\n if (nextNewline === -1) {\n return \"\";\n }\n\n lineStart = nextNewline + 1;\n }\n\n if (limit === undefined) {\n return content.slice(lineStart);\n }\n\n let lineEnd = lineStart;\n\n for (let remaining = 0; remaining < limit; remaining += 1) {\n const nextNewline = content.indexOf(\"\\n\", lineEnd);\n if (nextNewline === -1) {\n return content.slice(lineStart);\n }\n\n lineEnd = nextNewline + 1;\n }\n\n return content.slice(lineStart, lineEnd);\n}\n\nfunction detectImageMimeType(filePath: string): string | undefined {\n const extension = path.extname(filePath).toLowerCase();\n\n if (extension === \".png\") {\n return \"image/png\";\n }\n\n if (extension === \".jpg\" || extension === \".jpeg\") {\n return \"image/jpeg\";\n }\n\n if (extension === \".gif\") {\n return \"image/gif\";\n }\n\n if (extension === \".webp\") {\n return \"image/webp\";\n }\n\n if (extension === \".bmp\") {\n return \"image/bmp\";\n }\n\n if (extension === \".svg\") {\n return \"image/svg+xml\";\n }\n\n return undefined;\n}\n\nexport default filesPlugin;\n\nexport const spec: PluginSpec<FilesPluginConfigOptions> = {\n name: \"files\",\n parseOptions(input) {\n const obj = toOptionsObject(input);\n rejectUnknownKeys(obj, [\"cwd\", \"allowedPaths\"]);\n const options: FilesPluginConfigOptions = {};\n const cwd = readOptionalString(obj, \"cwd\");\n if (cwd !== undefined) {\n options.cwd = cwd;\n }\n const allowedPaths = readOptionalStringArray(obj, \"allowedPaths\");\n if (allowedPaths !== undefined) {\n options.allowedPaths = allowedPaths;\n }\n return options;\n },\n factory: options => filesPlugin(options),\n};\n", "import path from \"node:path\";\n\nexport function isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function getRequiredString(args: unknown, key: string, allowEmptyString = false): string {\n if (!isObjectRecord(args)) {\n throw new Error(`Tool argument \"${key}\" must be a string`);\n }\n\n const value = args[key];\n\n if (typeof value !== \"string\") {\n throw new Error(`Tool argument \"${key}\" must be a string`);\n }\n\n if (!allowEmptyString && value.trim().length === 0) {\n throw new Error(`Tool argument \"${key}\" must not be empty`);\n }\n\n return value;\n}\n\nexport function getOptionalString(args: unknown, key: string): string | undefined {\n if (!isObjectRecord(args)) {\n throw new Error(`Tool argument \"${key}\" must be a string`);\n }\n\n const value = args[key];\n\n if (value === undefined) {\n return undefined;\n }\n\n if (typeof value !== \"string\") {\n throw new Error(`Tool argument \"${key}\" must be a string`);\n }\n\n return value;\n}\n\nexport function getOptionalBoolean(args: unknown, key: string): boolean | undefined {\n if (!isObjectRecord(args)) {\n throw new Error(`Tool argument \"${key}\" must be a boolean`);\n }\n\n const value = args[key];\n if (value === undefined) {\n return undefined;\n }\n\n if (typeof value !== \"boolean\") {\n throw new Error(`Tool argument \"${key}\" must be a boolean`);\n }\n\n return value;\n}\n\nexport function getOptionalNumber(args: unknown, key: string): number | undefined {\n if (!isObjectRecord(args)) {\n throw new Error(`Tool argument \"${key}\" must be a number`);\n }\n\n const value = args[key];\n if (value === undefined) {\n return undefined;\n }\n\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new Error(`Tool argument \"${key}\" must be a finite number`);\n }\n\n return value;\n}\n\nexport function getOptionalNonNegativeInteger(args: unknown, key: string): number | undefined {\n if (!isObjectRecord(args)) {\n throw new Error(`Tool argument \"${key}\" must be a non-negative integer`);\n }\n\n const value = args[key];\n if (value === undefined) {\n return undefined;\n }\n\n if (typeof value !== \"number\" || !Number.isInteger(value) || value < 0) {\n throw new Error(`Tool argument \"${key}\" must be a non-negative integer`);\n }\n\n return value;\n}\n\nexport function resolveAllowedPath(cwd: string, allowedPaths: string[], inputPath: string): string {\n const resolvedPath = path.resolve(cwd, inputPath);\n const isAllowed = allowedPaths.some(allowedPath => {\n if (allowedPath === resolvedPath) {\n return true;\n }\n\n const rel = path.relative(allowedPath, resolvedPath);\n return rel.length > 0 && !rel.startsWith(\"..\") && !path.isAbsolute(rel);\n });\n\n if (!isAllowed) {\n throw new Error(`Path is outside allowed paths: ${inputPath}`);\n }\n\n return resolvedPath;\n}\n", "import OpenAI from \"openai\";\nimport type { AcpModel, AcpModelRequestMessage } from \"../runtime/acp-core.js\";\nimport { setResolvedPluginOptions } from \"../runtime/provider-metadata.js\";\nimport type { AgentPlugin, ProviderContext, ProviderStreamEvent } from \"../runtime/plugin-types.js\";\nimport { toolResultPartToText } from \"../runtime/tool-results.js\";\nimport type { ToolResultPart } from \"../runtime/types.js\";\nimport {\n readOptionalNonNegativeInteger,\n readOptionalString,\n rejectUnknownKeys,\n toOptionsObject\n} from \"./parse-options.js\";\nimport { resolveOpenaiApiKey } from \"./openai-auth.js\";\nimport type { PluginSpec } from \"./registry.js\";\n\nconst DEFAULT_BASE_URL = \"https://api.poe.com/v1\";\n\ntype ToolCallBuffer = {\n id: string;\n name?: string;\n rawArguments: string;\n};\n\ntype OpenaiChatCompletionsProviderContext = Omit<ProviderContext, \"options\"> & {\n options: OpenaiChatCompletionsPluginOptions;\n};\n\ntype ChatCompletionStreamChunk = {\n choices?: Array<{\n delta?: {\n content?: string | null;\n tool_calls?: Array<{\n index: number;\n id?: string;\n function?: {\n name?: string;\n arguments?: string;\n };\n }>;\n };\n finish_reason?: \"stop\" | \"length\" | \"tool_calls\" | \"content_filter\" | \"function_call\" | null;\n }>;\n usage?: {\n prompt_tokens?: number;\n completion_tokens?: number;\n prompt_tokens_details?: {\n cached_tokens?: number;\n };\n cache_read_input_tokens?: number;\n cache_creation_input_tokens?: number;\n } | null;\n};\n\nexport type OpenaiChatCompletionsPluginOptions = {\n baseUrl?: string;\n apiKey?: string;\n organization?: string;\n defaultHeaders?: Record<string, string>;\n timeout?: number;\n maxRetries?: number;\n};\n\nexport const spec: PluginSpec<OpenaiChatCompletionsPluginOptions> = {\n name: \"openai-chat-completions\",\n parseOptions(input) {\n const obj = toOptionsObject(input);\n rejectUnknownKeys(obj, [\n \"baseUrl\",\n \"apiKey\",\n \"organization\",\n \"defaultHeaders\",\n \"timeout\",\n \"maxRetries\"\n ]);\n\n const baseUrl = readOptionalString(obj, \"baseUrl\");\n const apiKey = readOptionalString(obj, \"apiKey\");\n const organization = readOptionalString(obj, \"organization\");\n const defaultHeaders = readOptionalStringRecord(obj, \"defaultHeaders\");\n const timeout = readOptionalNonNegativeInteger(obj, \"timeout\");\n const maxRetries = readOptionalNonNegativeInteger(obj, \"maxRetries\");\n\n return {\n ...(baseUrl === undefined ? {} : { baseUrl }),\n ...(apiKey === undefined ? {} : { apiKey }),\n ...(organization === undefined ? {} : { organization }),\n ...(defaultHeaders === undefined ? {} : { defaultHeaders }),\n ...(timeout === undefined ? {} : { timeout }),\n ...(maxRetries === undefined ? {} : { maxRetries })\n };\n },\n factory(options) {\n return openaiChatCompletionsPlugin(options);\n }\n};\n\nexport function openaiChatCompletionsPlugin(\n opts: OpenaiChatCompletionsPluginOptions = {}\n): AgentPlugin {\n const options = spec.parseOptions(opts);\n\n return setResolvedPluginOptions(\n {\n name: \"openai-chat-completions-plugin\",\n providers: [\n {\n name: \"openai-chat-completions\",\n supports: () => true,\n createModel(modelId, ctx) {\n return createOpenaiChatCompletionsModel(modelId, {\n ...ctx,\n options: mergePluginOptions(options, ctx.options)\n });\n }\n }\n ]\n },\n options\n );\n}\n\nasync function createOpenaiChatCompletionsModel(\n modelId: string,\n ctx: OpenaiChatCompletionsProviderContext\n): Promise<AcpModel> {\n const options = ctx.options;\n const apiKey = await resolveClientApiKey(options.apiKey);\n const baseURL = resolveClientBaseUrl(options.baseUrl);\n const organization = toNonEmptyString(options.organization);\n const defaultHeaders = cloneStringRecord(options.defaultHeaders);\n\n const openai = new OpenAI({\n ...(baseURL === undefined ? {} : { baseURL }),\n ...(apiKey === undefined ? {} : { apiKey }),\n ...(organization === undefined ? {} : { organization }),\n ...(defaultHeaders === undefined ? {} : { defaultHeaders }),\n ...(options.timeout === undefined ? {} : { timeout: options.timeout }),\n ...(options.maxRetries === undefined ? {} : { maxRetries: options.maxRetries }),\n fetch: ctx.fetch\n });\n\n return {\n async complete(request) {\n const stream = (await openai.chat.completions.create(\n {\n model: modelId,\n messages: request.messages.map((message) => serializeProviderMessage(message)),\n ...(request.tools.length === 0\n ? {}\n : {\n tools: request.tools.map((tool) => ({\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description ?? \"\",\n parameters: normalizeToolInputSchema(tool.inputSchema)\n }\n }))\n }),\n stream: true,\n stream_options: {\n include_usage: true\n }\n } as never,\n {\n signal: request.signal\n }\n )) as unknown as AsyncIterable<ChatCompletionStreamChunk>;\n\n return {\n events: streamChatCompletionChunks(stream)\n };\n }\n };\n}\n\nasync function* streamChatCompletionChunks(\n stream: AsyncIterable<ChatCompletionStreamChunk>\n): AsyncIterable<ProviderStreamEvent> {\n const toolCallsById = new Map<string, ToolCallBuffer>();\n const toolCallIdsByIndex = new Map<number, string>();\n let usage: Extract<ProviderStreamEvent, { type: \"usage\" }> | undefined;\n let stopReason: Extract<ProviderStreamEvent, { type: \"stop\" }>[\"reason\"] | undefined;\n\n for await (const chunk of stream) {\n const nextUsage = extractUsage(chunk.usage);\n if (nextUsage !== undefined) {\n usage = {\n type: \"usage\",\n ...nextUsage\n };\n }\n\n const choice = chunk.choices?.[0];\n if (!choice) {\n continue;\n }\n\n const content = choice.delta?.content;\n if (typeof content === \"string\" && content.length > 0) {\n yield {\n type: \"text\",\n text: content\n };\n }\n\n for (const toolCall of choice.delta?.tool_calls ?? []) {\n const id = resolveToolCallId(toolCall, toolCallIdsByIndex);\n if (id === undefined) {\n continue;\n }\n\n const buffer = getOrCreateToolCallBuffer(toolCallsById, id);\n const name = toolCall.function?.name;\n if (typeof name === \"string\" && name.length > 0 && buffer.name === undefined) {\n buffer.name = name;\n }\n\n const argsDelta = toolCall.function?.arguments;\n if (typeof argsDelta !== \"string\" || argsDelta.length === 0) {\n continue;\n }\n\n buffer.rawArguments += argsDelta;\n yield {\n type: \"tool_use_delta\",\n id,\n ...(typeof name === \"string\" && name.length > 0 ? { name } : {}),\n argsDelta\n };\n }\n\n const nextStopReason = mapFinishReason(choice.finish_reason);\n if (nextStopReason !== undefined) {\n stopReason = nextStopReason;\n }\n }\n\n for (const [id, toolCall] of toolCallsById.entries()) {\n const parsedArguments = parseToolArguments(toolCall.rawArguments);\n if (!parsedArguments.ok) {\n yield {\n type: \"tool_use_json_parse_error\",\n id,\n raw: toolCall.rawArguments,\n error: parsedArguments.error\n };\n continue;\n }\n\n if (toolCall.name === undefined) {\n continue;\n }\n\n yield {\n type: \"tool_use_complete\",\n id,\n name: toolCall.name,\n args: parsedArguments.value\n };\n }\n\n if (usage !== undefined) {\n yield usage;\n }\n\n yield {\n type: \"stop\",\n reason: stopReason ?? \"end_turn\"\n };\n}\n\nfunction mergePluginOptions(\n baseOptions: OpenaiChatCompletionsPluginOptions,\n input: unknown\n): OpenaiChatCompletionsPluginOptions {\n if (input === undefined || input === null) {\n return {\n ...baseOptions,\n ...(baseOptions.defaultHeaders === undefined\n ? {}\n : { defaultHeaders: { ...baseOptions.defaultHeaders } })\n };\n }\n\n const inputOptions = spec.parseOptions(input);\n return {\n ...baseOptions,\n ...inputOptions,\n ...(baseOptions.defaultHeaders === undefined && inputOptions.defaultHeaders === undefined\n ? {}\n : {\n defaultHeaders: {\n ...(baseOptions.defaultHeaders ?? {}),\n ...(inputOptions.defaultHeaders ?? {})\n }\n })\n };\n}\n\nfunction serializeProviderMessage(message: AcpModelRequestMessage): Record<string, unknown> {\n return {\n role: message.role,\n ...(message.role === \"tool\" && typeof message.name === \"string\" ? { name: message.name } : {}),\n ...(message.tool_call_id === undefined ? {} : { tool_call_id: message.tool_call_id }),\n ...serializeReasoningRequestFields(message),\n ...(message.tool_calls === undefined\n ? {}\n : {\n tool_calls: message.tool_calls.map((toolCall) => ({\n ...toolCall,\n function: {\n ...toolCall.function,\n name: toolCall.function.name\n }\n }))\n }),\n content: serializeProviderMessageContent(message.content)\n };\n}\n\nfunction serializeReasoningRequestFields(\n message: AcpModelRequestMessage\n): Pick<AcpModelRequestMessage, \"reasoning\" | \"reasoning_content\"> {\n const thinkingText = message.thinking?.map((entry) => entry.text).join(\"\");\n const reasoningContent = toNonEmptyString(message.reasoning_content) ?? thinkingText;\n const reasoning = toNonEmptyString(message.reasoning) ?? reasoningContent;\n\n return {\n ...(reasoningContent === undefined ? {} : { reasoning_content: reasoningContent }),\n ...(reasoning === undefined ? {} : { reasoning })\n };\n}\n\nfunction serializeProviderMessageContent(content: AcpModelRequestMessage[\"content\"]):\n | string\n | Array<\n | {\n type: \"text\";\n text: string;\n }\n | {\n type: \"image_url\";\n image_url: {\n url: string;\n };\n }\n > {\n if (typeof content === \"string\") {\n return content;\n }\n\n return content.map((part) => serializeProviderContentPart(part));\n}\n\nfunction serializeProviderContentPart(part: ToolResultPart):\n | {\n type: \"text\";\n text: string;\n }\n | {\n type: \"image_url\";\n image_url: {\n url: string;\n };\n } {\n if (part.type === \"image\") {\n return {\n type: \"image_url\",\n image_url: {\n url: `data:${part.mimeType};base64,${part.data}`\n }\n };\n }\n\n return {\n type: \"text\",\n text: toolResultPartToText(part)\n };\n}\n\nfunction normalizeToolInputSchema(schema: unknown): {\n type: \"object\";\n properties: Record<string, unknown>;\n required?: string[];\n} {\n if (typeof schema === \"object\" && schema !== null && !Array.isArray(schema)) {\n const objectSchema = schema as {\n properties?: Record<string, unknown>;\n required?: string[];\n };\n\n return {\n type: \"object\",\n properties: objectSchema.properties ?? {},\n ...(objectSchema.required === undefined ? {} : { required: [...objectSchema.required] })\n };\n }\n\n return {\n type: \"object\",\n properties: {}\n };\n}\n\nfunction resolveToolCallId(\n toolCall: {\n index: number;\n id?: string;\n },\n toolCallIdsByIndex: Map<number, string>\n): string | undefined {\n const id = toNonEmptyString(toolCall.id);\n if (id !== undefined) {\n toolCallIdsByIndex.set(toolCall.index, id);\n return id;\n }\n\n return toolCallIdsByIndex.get(toolCall.index);\n}\n\nfunction getOrCreateToolCallBuffer(\n toolCallsById: Map<string, ToolCallBuffer>,\n id: string\n): ToolCallBuffer {\n const existing = toolCallsById.get(id);\n if (existing !== undefined) {\n return existing;\n }\n\n const created: ToolCallBuffer = {\n id,\n rawArguments: \"\"\n };\n toolCallsById.set(id, created);\n return created;\n}\n\nfunction parseToolArguments(\n value: string\n): { ok: true; value: unknown } | { ok: false; error: string } {\n if (value.length === 0) {\n return {\n ok: true,\n value: {}\n };\n }\n\n try {\n return {\n ok: true,\n value: JSON.parse(value) as unknown\n };\n } catch (error) {\n return {\n ok: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n}\n\nfunction extractUsage(\n usage:\n | {\n prompt_tokens?: number;\n completion_tokens?: number;\n prompt_tokens_details?: {\n cached_tokens?: number;\n };\n cache_read_input_tokens?: number;\n cache_creation_input_tokens?: number;\n }\n | null\n | undefined\n):\n | {\n inputTokens: number;\n outputTokens: number;\n cachedTokens: number;\n cacheCreationTokens: number;\n }\n | undefined {\n if (usage === undefined || usage === null) {\n return undefined;\n }\n\n const inputTokens = toNonNegativeInteger(usage.prompt_tokens) ?? 0;\n const outputTokens = toNonNegativeInteger(usage.completion_tokens) ?? 0;\n const cachedTokens =\n toNonNegativeInteger(usage.prompt_tokens_details?.cached_tokens) ??\n toNonNegativeInteger(usage.cache_read_input_tokens) ??\n 0;\n const cacheCreationTokens = toNonNegativeInteger(usage.cache_creation_input_tokens) ?? 0;\n\n if (inputTokens === 0 && outputTokens === 0 && cachedTokens === 0 && cacheCreationTokens === 0) {\n return undefined;\n }\n\n return {\n inputTokens,\n outputTokens,\n cachedTokens,\n cacheCreationTokens\n };\n}\n\nfunction mapFinishReason(\n reason: \"stop\" | \"length\" | \"tool_calls\" | \"content_filter\" | \"function_call\" | null | undefined\n): Extract<ProviderStreamEvent, { type: \"stop\" }>[\"reason\"] | undefined {\n if (reason === undefined || reason === null) {\n return undefined;\n }\n\n if (reason === \"stop\") {\n return \"end_turn\";\n }\n\n if (reason === \"tool_calls\" || reason === \"function_call\") {\n return \"tool_use\";\n }\n\n if (reason === \"length\") {\n return \"max_tokens\";\n }\n\n return \"error\";\n}\n\nasync function resolveClientApiKey(\n explicitApiKey: string | undefined\n): Promise<string | undefined> {\n const explicit = toNonEmptyString(explicitApiKey);\n if (explicit !== undefined) {\n return await resolveOpenaiApiKey(explicit);\n }\n\n try {\n return await resolveOpenaiApiKey(undefined);\n } catch {\n return undefined;\n }\n}\n\nfunction resolveClientBaseUrl(baseUrl: string | undefined): string | undefined {\n const explicit = toNonEmptyString(baseUrl);\n if (explicit !== undefined) {\n return explicit;\n }\n\n if (toNonEmptyString(process.env.OPENAI_BASE_URL) !== undefined) {\n return undefined;\n }\n\n return DEFAULT_BASE_URL;\n}\n\nfunction readOptionalStringRecord(\n input: Record<string, unknown>,\n key: string\n): Record<string, string> | undefined {\n const value = input[key];\n if (value === undefined) {\n return undefined;\n }\n\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new Error(`${key}: expected an object of string values`);\n }\n\n const entries = Object.entries(value);\n const record: Record<string, string> = {};\n\n for (const [entryKey, entryValue] of entries) {\n if (typeof entryValue !== \"string\") {\n throw new Error(`${key}: expected an object of string values`);\n }\n\n record[entryKey] = entryValue;\n }\n\n return record;\n}\n\nfunction cloneStringRecord(\n value: Record<string, string> | undefined\n): Record<string, string> | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n return { ...value };\n}\n\nfunction toNonNegativeInteger(value: unknown): number | undefined {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) {\n return undefined;\n }\n\n return Math.trunc(value);\n}\n\nfunction toNonEmptyString(value: string | null | undefined): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const trimmed = value.trim();\n return trimmed.length === 0 ? undefined : trimmed;\n}\n", "import type { AgentPlugin, Provider } from \"./plugin-types.js\";\n\nconst resolvedPluginOptions = Symbol(\"resolvedPluginOptions\");\nconst resolvedProviderOptions = Symbol(\"resolvedProviderOptions\");\n\ntype AgentPluginWithOptions = AgentPlugin & {\n [resolvedPluginOptions]?: unknown;\n};\n\ntype ProviderWithOptions = Provider & {\n [resolvedProviderOptions]?: unknown;\n};\n\nexport function setResolvedPluginOptions<T extends AgentPlugin>(plugin: T, options: unknown): T {\n (plugin as AgentPluginWithOptions)[resolvedPluginOptions] = options;\n return plugin;\n}\n\nexport function getResolvedPluginOptions(plugin: AgentPlugin): unknown {\n return (plugin as AgentPluginWithOptions)[resolvedPluginOptions];\n}\n\nexport function setResolvedProviderOptions<T extends Provider>(provider: T, options: unknown): T {\n (provider as ProviderWithOptions)[resolvedProviderOptions] = options;\n return provider;\n}\n\nexport function getResolvedProviderOptions(provider: Provider): unknown {\n return (provider as ProviderWithOptions)[resolvedProviderOptions];\n}\n", "import { createCipheriv, createDecipheriv, randomBytes, scrypt } from \"node:crypto\";\nimport { promises as fs } from \"node:fs\";\nimport { homedir, hostname, userInfo } from \"node:os\";\nimport path from \"node:path\";\nimport type { SecretStore } from \"./types.js\";\n\nconst derivedKeyCache = new Map<string, Promise<Buffer>>();\n\nconst ENCRYPTION_ALGORITHM = \"aes-256-gcm\";\nconst ENCRYPTION_VERSION = 1;\nconst ENCRYPTION_KEY_BYTES = 32;\nconst ENCRYPTION_IV_BYTES = 12;\nconst ENCRYPTION_AUTH_TAG_BYTES = 16;\nconst ENCRYPTION_FILE_MODE = 0o600;\n\ninterface EncryptedDocument {\n version: number;\n iv: string;\n authTag: string;\n ciphertext: string;\n}\n\nexport interface MachineIdentity {\n hostname: string;\n username: string;\n}\n\nexport interface EncryptedFileStoreFileSystem {\n readFile(path: string, encoding: BufferEncoding): Promise<string>;\n writeFile(\n path: string,\n data: string | NodeJS.ArrayBufferView,\n options?: { encoding?: BufferEncoding }\n ): Promise<void>;\n mkdir(path: string, options?: { recursive?: boolean }): Promise<void | string | undefined>;\n unlink(path: string): Promise<void>;\n chmod(path: string, mode: number): Promise<void>;\n}\n\nexport interface EncryptedFileStoreInput {\n fs?: EncryptedFileStoreFileSystem;\n filePath?: string;\n salt: string;\n defaultDirectory?: string;\n defaultFileName?: string;\n getMachineIdentity?: () => MachineIdentity | Promise<MachineIdentity>;\n getHomeDirectory?: () => string;\n getRandomBytes?: (size: number) => Buffer;\n}\n\nexport class EncryptedFileStore implements SecretStore {\n private readonly fs: EncryptedFileStoreFileSystem;\n private readonly filePath: string;\n private readonly salt: string;\n private readonly getMachineIdentity: () => MachineIdentity | Promise<MachineIdentity>;\n private readonly getRandomBytes: (size: number) => Buffer;\n private keyPromise: Promise<Buffer> | null = null;\n\n constructor(input: EncryptedFileStoreInput) {\n this.fs = input.fs ?? fs;\n this.salt = input.salt;\n this.filePath = input.filePath ?? path.join(\n (input.getHomeDirectory ?? homedir)(),\n input.defaultDirectory ?? \".auth-store\",\n input.defaultFileName ?? \"credentials.enc\"\n );\n this.getMachineIdentity = input.getMachineIdentity ?? defaultMachineIdentity;\n this.getRandomBytes = input.getRandomBytes ?? randomBytes;\n }\n\n async get(): Promise<string | null> {\n let rawDocument: string;\n try {\n rawDocument = await this.fs.readFile(this.filePath, \"utf8\");\n } catch (error) {\n if (isNotFoundError(error)) {\n return null;\n }\n throw error;\n }\n\n const document = parseEncryptedDocument(rawDocument);\n if (!document) {\n return null;\n }\n\n const key = await this.getEncryptionKey();\n\n try {\n const iv = Buffer.from(document.iv, \"base64\");\n const authTag = Buffer.from(document.authTag, \"base64\");\n const ciphertext = Buffer.from(document.ciphertext, \"base64\");\n\n if (\n iv.byteLength !== ENCRYPTION_IV_BYTES ||\n authTag.byteLength !== ENCRYPTION_AUTH_TAG_BYTES\n ) {\n return null;\n }\n\n const decipher = createDecipheriv(ENCRYPTION_ALGORITHM, key, iv);\n decipher.setAuthTag(authTag);\n const plaintext = Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n return plaintext.toString(\"utf8\");\n } catch {\n return null;\n }\n }\n\n async set(value: string): Promise<void> {\n const key = await this.getEncryptionKey();\n const iv = this.getRandomBytes(ENCRYPTION_IV_BYTES);\n const cipher = createCipheriv(ENCRYPTION_ALGORITHM, key, iv);\n const ciphertext = Buffer.concat([\n cipher.update(value, \"utf8\"),\n cipher.final()\n ]);\n const authTag = cipher.getAuthTag();\n\n const document: EncryptedDocument = {\n version: ENCRYPTION_VERSION,\n iv: iv.toString(\"base64\"),\n authTag: authTag.toString(\"base64\"),\n ciphertext: ciphertext.toString(\"base64\")\n };\n\n await this.fs.mkdir(path.dirname(this.filePath), { recursive: true });\n await this.fs.writeFile(this.filePath, JSON.stringify(document), {\n encoding: \"utf8\"\n });\n await this.fs.chmod(this.filePath, ENCRYPTION_FILE_MODE);\n }\n\n async delete(): Promise<void> {\n try {\n await this.fs.unlink(this.filePath);\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n }\n }\n\n private getEncryptionKey(): Promise<Buffer> {\n if (!this.keyPromise) {\n this.keyPromise = deriveEncryptionKey(this.getMachineIdentity, this.salt);\n }\n return this.keyPromise;\n }\n}\n\nfunction defaultMachineIdentity(): MachineIdentity {\n return {\n hostname: hostname(),\n username: userInfo().username\n };\n}\n\nasync function deriveEncryptionKey(\n getMachineIdentity: () => MachineIdentity | Promise<MachineIdentity>,\n salt: string\n): Promise<Buffer> {\n const machineIdentity = await getMachineIdentity();\n const secret = `${machineIdentity.hostname}:${machineIdentity.username}`;\n const cacheKey = `${secret}:${salt}`;\n\n const cached = derivedKeyCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const keyPromise = new Promise<Buffer>((resolve, reject) => {\n scrypt(secret, salt, ENCRYPTION_KEY_BYTES, (error, derivedKey) => {\n if (error) {\n reject(error);\n return;\n }\n resolve(Buffer.from(derivedKey));\n });\n });\n\n derivedKeyCache.set(cacheKey, keyPromise);\n return keyPromise;\n}\n\nfunction parseEncryptedDocument(raw: string): EncryptedDocument | null {\n try {\n const parsed = JSON.parse(raw);\n if (!isRecord(parsed)) {\n return null;\n }\n if (parsed.version !== ENCRYPTION_VERSION) {\n return null;\n }\n if (\n typeof parsed.iv !== \"string\" ||\n typeof parsed.authTag !== \"string\" ||\n typeof parsed.ciphertext !== \"string\"\n ) {\n return null;\n }\n return {\n version: parsed.version,\n iv: parsed.iv,\n authTag: parsed.authTag,\n ciphertext: parsed.ciphertext\n };\n } catch {\n return null;\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, any> {\n return Boolean(value && typeof value === \"object\" && !Array.isArray(value));\n}\n\nfunction isNotFoundError(error: unknown): error is NodeJS.ErrnoException {\n return Boolean(\n error &&\n typeof error === \"object\" &&\n \"code\" in error &&\n (error as NodeJS.ErrnoException).code === \"ENOENT\"\n );\n}\n", "import { spawn } from \"node:child_process\";\nimport type { SecretStore } from \"./types.js\";\n\nconst SECURITY_CLI = \"security\";\nconst KEYCHAIN_ITEM_NOT_FOUND_EXIT_CODE = 44;\n\nexport interface KeychainCommandResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\nexport type KeychainCommandRunner = (\n command: string,\n args: string[]\n) => Promise<KeychainCommandResult>;\n\nexport interface KeychainStoreInput {\n runCommand?: KeychainCommandRunner;\n service: string;\n account: string;\n}\n\nexport class KeychainStore implements SecretStore {\n private readonly runCommand: KeychainCommandRunner;\n private readonly service: string;\n private readonly account: string;\n\n constructor(input: KeychainStoreInput) {\n this.runCommand = input.runCommand ?? runSecurityCommand;\n this.service = input.service;\n this.account = input.account;\n }\n\n async get(): Promise<string | null> {\n const result = await this.executeSecurityCommand(\n [\"find-generic-password\", \"-s\", this.service, \"-a\", this.account, \"-w\"],\n \"read secret from macOS Keychain\"\n );\n\n if (result.exitCode === 0) {\n return stripTrailingLineBreak(result.stdout);\n }\n\n if (isKeychainEntryNotFound(result)) {\n return null;\n }\n\n throw createSecurityCliFailure(\"read secret from macOS Keychain\", result);\n }\n\n async set(value: string): Promise<void> {\n const result = await this.executeSecurityCommand(\n [\n \"add-generic-password\",\n \"-s\",\n this.service,\n \"-a\",\n this.account,\n \"-w\",\n value,\n \"-U\"\n ],\n \"store secret in macOS Keychain\"\n );\n\n if (result.exitCode !== 0) {\n throw createSecurityCliFailure(\"store secret in macOS Keychain\", result);\n }\n }\n\n async delete(): Promise<void> {\n const result = await this.executeSecurityCommand(\n [\"delete-generic-password\", \"-s\", this.service, \"-a\", this.account],\n \"delete secret from macOS Keychain\"\n );\n\n if (result.exitCode === 0 || isKeychainEntryNotFound(result)) {\n return;\n }\n\n throw createSecurityCliFailure(\"delete secret from macOS Keychain\", result);\n }\n\n private async executeSecurityCommand(\n args: string[],\n operation: string\n ): Promise<KeychainCommandResult> {\n try {\n return await this.runCommand(SECURITY_CLI, args);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to ${operation}: ${message}`);\n }\n }\n}\n\nfunction runSecurityCommand(\n command: string,\n args: string[]\n): Promise<KeychainCommandResult> {\n return new Promise((resolve) => {\n const child = spawn(command, args, {\n stdio: [\"ignore\", \"pipe\", \"pipe\"]\n });\n\n let stdout = \"\";\n let stderr = \"\";\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 message =\n error instanceof Error ? error.message : String(error ?? \"Unknown error\");\n resolve({\n stdout,\n stderr: stderr ? `${stderr}${message}` : message,\n exitCode: 127\n });\n });\n\n child.on(\"close\", (code) => {\n resolve({\n stdout,\n stderr,\n exitCode: code ?? 0\n });\n });\n });\n}\n\nfunction stripTrailingLineBreak(value: string): string {\n if (value.endsWith(\"\\r\\n\")) {\n return value.slice(0, -2);\n }\n\n if (value.endsWith(\"\\n\") || value.endsWith(\"\\r\")) {\n return value.slice(0, -1);\n }\n\n return value;\n}\n\nfunction isKeychainEntryNotFound(result: KeychainCommandResult): boolean {\n if (result.exitCode === KEYCHAIN_ITEM_NOT_FOUND_EXIT_CODE) {\n return true;\n }\n\n const output = `${result.stderr}\\n${result.stdout}`.toLowerCase();\n\n return (\n output.includes(\"could not be found\") ||\n output.includes(\"item not found\") ||\n output.includes(\"errsecitemnotfound\")\n );\n}\n\nfunction createSecurityCliFailure(\n operation: string,\n result: KeychainCommandResult\n): Error {\n const details = result.stderr.trim() || result.stdout.trim();\n if (details) {\n return new Error(\n `Failed to ${operation}: security exited with code ${result.exitCode}: ${details}`\n );\n }\n\n return new Error(`Failed to ${operation}: security exited with code ${result.exitCode}`);\n}\n", "import type {\n CreateSecretStoreInput,\n CreateSecretStoreResult,\n StoreBackend\n} from \"./types.js\";\nimport { EncryptedFileStore } from \"./encrypted-file-store.js\";\nimport { KeychainStore } from \"./keychain-store.js\";\n\nconst DEFAULT_BACKEND_ENV_VAR = \"AUTH_BACKEND\";\nconst MACOS_PLATFORM = \"darwin\";\n\nconst storeFactories: Record<\n StoreBackend,\n (input: CreateSecretStoreInput) => CreateSecretStoreResult[\"store\"]\n> = {\n file: (input) => {\n if (!input.fileStore) {\n throw new Error(\"fileStore configuration is required for file backend\");\n }\n return new EncryptedFileStore(input.fileStore);\n },\n keychain: (input) => {\n if (!input.keychainStore) {\n throw new Error(\"keychainStore configuration is required for keychain backend\");\n }\n return new KeychainStore(input.keychainStore);\n }\n};\n\nexport function createSecretStore(\n input: CreateSecretStoreInput\n): CreateSecretStoreResult {\n const backend = resolveBackend(input);\n const platform = input.platform ?? process.platform;\n\n if (backend === \"keychain\" && platform !== MACOS_PLATFORM) {\n throw new Error(\n `Keychain backend is only supported on macOS. Current platform: ${platform}`\n );\n }\n\n const store = storeFactories[backend](input);\n\n return { backend, store };\n}\n\nfunction resolveBackend(input: CreateSecretStoreInput): StoreBackend {\n const envVar = input.backendEnvVar ?? DEFAULT_BACKEND_ENV_VAR;\n const configuredBackend =\n input.backend ?? input.env?.[envVar] ?? process.env[envVar];\n\n if (configuredBackend === \"keychain\") {\n return \"keychain\";\n }\n\n return \"file\";\n}\n", "import { createSecretStore } from \"auth-store\";\n\nexport async function resolveOpenaiApiKey(explicit: string | undefined): Promise<string> {\n const normalizedExplicitApiKey = toNonEmptyString(explicit);\n if (normalizedExplicitApiKey) {\n return normalizedExplicitApiKey;\n }\n\n const { store } = createSecretStore({\n backendEnvVar: \"POE_AUTH_BACKEND\",\n fileStore: {\n salt: \"poe-code:encrypted-file-auth-store:v1\",\n defaultDirectory: \".poe-code\",\n defaultFileName: \"credentials.enc\"\n }\n });\n const storedApiKey = toNonEmptyString(await store.get());\n if (storedApiKey) {\n return storedApiKey;\n }\n\n throw new Error(\"Missing Poe API key. Provide apiKey or run 'poe-code login'.\");\n}\n\nfunction toNonEmptyString(value: string | null | undefined): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n", "import OpenAI from \"openai\";\nimport type {\n Response,\n ResponseFunctionToolCall,\n ResponseReasoningItem,\n ResponseStreamEvent\n} from \"openai/resources/responses/responses\";\nimport type { AcpModel, AcpModelRequestMessage } from \"../runtime/acp-core.js\";\nimport { setResolvedPluginOptions } from \"../runtime/provider-metadata.js\";\nimport type { AgentPlugin, ProviderContext, ProviderStreamEvent } from \"../runtime/plugin-types.js\";\nimport { toolResultPartToText } from \"../runtime/tool-results.js\";\nimport type { ToolResultPart } from \"../runtime/types.js\";\nimport {\n readOptionalNonNegativeInteger,\n readOptionalString,\n readOptionalStringArray,\n rejectUnknownKeys,\n toOptionsObject\n} from \"./parse-options.js\";\nimport { resolveOpenaiApiKey } from \"./openai-auth.js\";\nimport type { PluginSpec } from \"./registry.js\";\n\nconst DEFAULT_BASE_URL = \"https://api.poe.com/v1\";\nconst DEFAULT_INCLUDE = [\"reasoning.encrypted_content\"];\nconst REASONING_EFFORT_VALUES = [\"minimal\", \"low\", \"medium\", \"high\"] as const;\nconst REASONING_SUMMARY_VALUES = [\"auto\", \"concise\", \"detailed\"] as const;\n\ntype OpenaiResponsesProviderContext = Omit<ProviderContext, \"options\"> & {\n options: OpenaiResponsesPluginOptions;\n};\n\ntype ToolCallBuffer = {\n id: string;\n itemId?: string;\n name?: string;\n rawArguments: string;\n};\n\ntype ResponseLike = Pick<Response, \"error\" | \"incomplete_details\" | \"output\" | \"status\" | \"usage\">;\n\nexport type OpenaiResponsesPluginOptions = {\n baseUrl?: string;\n apiKey?: string;\n organization?: string;\n project?: string;\n defaultHeaders?: Record<string, string>;\n timeout?: number;\n maxRetries?: number;\n reasoningEffort?: \"minimal\" | \"low\" | \"medium\" | \"high\";\n reasoningSummary?: \"auto\" | \"concise\" | \"detailed\";\n include?: string[];\n};\n\nexport const spec: PluginSpec<OpenaiResponsesPluginOptions> = {\n name: \"openai-responses\",\n parseOptions(input) {\n const obj = toOptionsObject(input);\n rejectUnknownKeys(obj, [\n \"baseUrl\",\n \"apiKey\",\n \"organization\",\n \"project\",\n \"defaultHeaders\",\n \"timeout\",\n \"maxRetries\",\n \"reasoningEffort\",\n \"reasoningSummary\",\n \"include\"\n ]);\n\n const baseUrl = readOptionalString(obj, \"baseUrl\");\n const apiKey = readOptionalString(obj, \"apiKey\");\n const organization = readOptionalString(obj, \"organization\");\n const project = readOptionalString(obj, \"project\");\n const defaultHeaders = readOptionalStringRecord(obj, \"defaultHeaders\");\n const timeout = readOptionalNonNegativeInteger(obj, \"timeout\");\n const maxRetries = readOptionalNonNegativeInteger(obj, \"maxRetries\");\n const reasoningEffort = readOptionalEnum(obj, \"reasoningEffort\", REASONING_EFFORT_VALUES);\n const reasoningSummary = readOptionalEnum(obj, \"reasoningSummary\", REASONING_SUMMARY_VALUES);\n const include = readOptionalStringArray(obj, \"include\");\n\n return {\n ...(baseUrl === undefined ? {} : { baseUrl }),\n ...(apiKey === undefined ? {} : { apiKey }),\n ...(organization === undefined ? {} : { organization }),\n ...(project === undefined ? {} : { project }),\n ...(defaultHeaders === undefined ? {} : { defaultHeaders }),\n ...(timeout === undefined ? {} : { timeout }),\n ...(maxRetries === undefined ? {} : { maxRetries }),\n ...(reasoningEffort === undefined ? {} : { reasoningEffort }),\n ...(reasoningSummary === undefined ? {} : { reasoningSummary }),\n ...(include === undefined ? {} : { include: [...include] })\n };\n },\n factory(options) {\n return openaiResponsesPlugin(options);\n }\n};\n\nexport function openaiResponsesPlugin(opts: OpenaiResponsesPluginOptions = {}): AgentPlugin {\n const options = spec.parseOptions(opts);\n const supports = (id: string) => id.startsWith(\"gpt-\") || isOpenaiOSeriesModel(id);\n\n return setResolvedPluginOptions(\n {\n name: \"openai-responses-plugin\",\n providers: [\n {\n name: \"openai-responses\",\n supports,\n createModel(modelId, ctx) {\n return createOpenaiResponsesModel(modelId, {\n ...ctx,\n options: mergePluginOptions(options, ctx.options)\n });\n }\n }\n ]\n },\n options\n );\n}\n\nasync function createOpenaiResponsesModel(\n modelId: string,\n ctx: OpenaiResponsesProviderContext\n): Promise<AcpModel> {\n const options = ctx.options;\n const apiKey = await resolveClientApiKey(options.apiKey);\n const baseURL = resolveClientBaseUrl(options.baseUrl);\n const organization = toNonEmptyString(options.organization);\n const project = toNonEmptyString(options.project);\n const defaultHeaders = cloneStringRecord(options.defaultHeaders);\n const reasoning = buildReasoningRequestParam(options);\n\n const openai = new OpenAI({\n ...(baseURL === undefined ? {} : { baseURL }),\n ...(apiKey === undefined ? {} : { apiKey }),\n ...(organization === undefined ? {} : { organization }),\n ...(project === undefined ? {} : { project }),\n ...(defaultHeaders === undefined ? {} : { defaultHeaders }),\n ...(options.timeout === undefined ? {} : { timeout: options.timeout }),\n ...(options.maxRetries === undefined ? {} : { maxRetries: options.maxRetries }),\n fetch: ctx.fetch\n });\n\n return {\n async complete(request) {\n const stream = openai.responses.stream(\n {\n model: modelId,\n input: serializeProviderInput(request.messages),\n ...(request.tools.length === 0\n ? {}\n : {\n tools: request.tools.map((tool) => ({\n type: \"function\",\n name: tool.name,\n description: tool.description ?? null,\n parameters: normalizeToolInputSchema(tool.inputSchema),\n strict: null\n }))\n }),\n include: [...(options.include ?? DEFAULT_INCLUDE)],\n ...(reasoning === undefined ? {} : { reasoning })\n } as never,\n {\n signal: request.signal\n }\n ) as AsyncIterable<ResponseStreamEvent>;\n\n return {\n events: streamResponseEvents(stream)\n };\n }\n };\n}\n\nasync function* streamResponseEvents(\n stream: AsyncIterable<ResponseStreamEvent>\n): AsyncIterable<ProviderStreamEvent> {\n const toolCallsById = new Map<string, ToolCallBuffer>();\n const toolCallIdsByItemId = new Map<string, string>();\n let sawToolUse = false;\n\n for await (const event of stream) {\n if (event.type === \"response.output_text.delta\") {\n if (event.delta.length > 0) {\n yield {\n type: \"text\",\n text: event.delta\n };\n }\n continue;\n }\n\n if (event.type === \"response.reasoning_summary_text.delta\") {\n if (event.delta.length > 0) {\n yield {\n type: \"thinking\",\n text: event.delta\n };\n }\n continue;\n }\n\n if (event.type === \"response.output_item.added\") {\n if (!isResponseFunctionToolCall(event.item)) {\n continue;\n }\n\n const id = resolveToolUseId(event.item);\n if (id === undefined) {\n continue;\n }\n\n const buffer = getOrCreateToolCallBuffer(toolCallsById, id);\n buffer.itemId = toNonEmptyString(event.item.id) ?? buffer.itemId;\n buffer.name = toNonEmptyString(event.item.name) ?? buffer.name;\n\n if (buffer.itemId !== undefined) {\n toolCallIdsByItemId.set(buffer.itemId, id);\n }\n\n sawToolUse = true;\n yield {\n type: \"tool_use_delta\",\n id,\n ...(buffer.name === undefined ? {} : { name: buffer.name })\n };\n continue;\n }\n\n if (event.type === \"response.function_call_arguments.delta\") {\n const id = resolveToolUseIdFromItemId(event.item_id, toolCallIdsByItemId);\n if (id === undefined || event.delta.length === 0) {\n continue;\n }\n\n getOrCreateToolCallBuffer(toolCallsById, id).rawArguments += event.delta;\n sawToolUse = true;\n yield {\n type: \"tool_use_delta\",\n id,\n argsDelta: event.delta\n };\n continue;\n }\n\n if (event.type === \"response.output_item.done\") {\n if (isResponseReasoningItem(event.item)) {\n yield {\n type: \"reasoning_details\",\n payload: event.item\n };\n continue;\n }\n\n if (!isResponseFunctionToolCall(event.item)) {\n continue;\n }\n\n const id = resolveToolUseId(event.item);\n if (id === undefined) {\n continue;\n }\n\n const buffer = getOrCreateToolCallBuffer(toolCallsById, id);\n buffer.name = toNonEmptyString(event.item.name) ?? buffer.name;\n buffer.itemId = toNonEmptyString(event.item.id) ?? buffer.itemId;\n if (buffer.itemId !== undefined) {\n toolCallIdsByItemId.set(buffer.itemId, id);\n }\n\n const rawArguments =\n buffer.rawArguments.length > 0 ? buffer.rawArguments : (event.item.arguments ?? \"\");\n const parsedArguments = parseToolArguments(rawArguments);\n if (!parsedArguments.ok) {\n yield {\n type: \"tool_use_json_parse_error\",\n id,\n raw: rawArguments,\n error: parsedArguments.error\n };\n toolCallsById.delete(id);\n continue;\n }\n\n if (buffer.name === undefined) {\n toolCallsById.delete(id);\n continue;\n }\n\n sawToolUse = true;\n yield {\n type: \"tool_use_complete\",\n id,\n name: buffer.name,\n args: parsedArguments.value\n };\n toolCallsById.delete(id);\n continue;\n }\n\n if (event.type === \"response.completed\" || event.type === \"response.incomplete\") {\n const usage = extractUsage(event.response);\n if (usage !== undefined) {\n yield usage;\n }\n\n yield {\n type: \"stop\",\n reason: resolveStopReason(event.response, sawToolUse)\n };\n return;\n }\n\n if (event.type === \"response.failed\") {\n const usage = extractUsage(event.response);\n if (usage !== undefined) {\n yield usage;\n }\n\n yield {\n type: \"stop\",\n reason: \"error\"\n };\n return;\n }\n\n if (event.type === \"error\") {\n throw toResponseStreamError(event);\n }\n }\n\n yield {\n type: \"stop\",\n reason: sawToolUse ? \"tool_use\" : \"end_turn\"\n };\n}\n\nfunction mergePluginOptions(\n baseOptions: OpenaiResponsesPluginOptions,\n input: unknown\n): OpenaiResponsesPluginOptions {\n if (input === undefined || input === null) {\n return clonePluginOptions(baseOptions);\n }\n\n const inputOptions = spec.parseOptions(input);\n return {\n ...clonePluginOptions(baseOptions),\n ...inputOptions,\n ...(baseOptions.defaultHeaders === undefined && inputOptions.defaultHeaders === undefined\n ? {}\n : {\n defaultHeaders: {\n ...(baseOptions.defaultHeaders ?? {}),\n ...(inputOptions.defaultHeaders ?? {})\n }\n }),\n ...(inputOptions.include === undefined ? {} : { include: [...inputOptions.include] })\n };\n}\n\nfunction clonePluginOptions(options: OpenaiResponsesPluginOptions): OpenaiResponsesPluginOptions {\n return {\n ...options,\n ...(options.defaultHeaders === undefined\n ? {}\n : { defaultHeaders: { ...options.defaultHeaders } }),\n ...(options.include === undefined ? {} : { include: [...options.include] })\n };\n}\n\nfunction serializeProviderInput(messages: AcpModelRequestMessage[]): unknown[] {\n const input: unknown[] = [];\n\n for (const message of messages) {\n if (message.role === \"tool\") {\n input.push(serializeToolOutputMessage(message));\n continue;\n }\n\n if (message.role === \"assistant\") {\n for (const reasoningDetail of message.reasoning_details ?? []) {\n if (typeof reasoningDetail === \"object\" && reasoningDetail !== null) {\n input.push(reasoningDetail);\n }\n }\n\n for (const toolCall of message.tool_calls ?? []) {\n input.push({\n id: toolCall.id,\n call_id: toolCall.id,\n type: \"function_call\",\n name: toolCall.function.name,\n arguments: toolCall.function.arguments,\n status: \"completed\"\n });\n }\n\n const assistantContent = serializeAssistantMessageContent(message.content);\n if (assistantContent.length > 0) {\n input.push({\n type: \"message\",\n role: \"assistant\",\n status: \"completed\",\n content: assistantContent\n });\n }\n continue;\n }\n\n input.push({\n type: \"message\",\n role: message.role === \"system\" ? \"system\" : \"user\",\n content: serializeInputMessageContent(message.content)\n });\n }\n\n return input;\n}\n\nfunction serializeToolOutputMessage(message: AcpModelRequestMessage): {\n type: \"function_call_output\";\n call_id: string;\n output: string | Array<ReturnType<typeof serializeInputContentPart>>;\n} {\n const toolCallId = toNonEmptyString(message.tool_call_id);\n if (toolCallId === undefined) {\n throw new Error(\"Tool message is missing tool_call_id.\");\n }\n\n return {\n type: \"function_call_output\",\n call_id: toolCallId,\n output:\n typeof message.content === \"string\"\n ? message.content\n : message.content.map((part) => serializeInputContentPart(part))\n };\n}\n\nfunction serializeInputMessageContent(\n content: AcpModelRequestMessage[\"content\"]\n): Array<ReturnType<typeof serializeInputContentPart>> {\n if (typeof content === \"string\") {\n return [{ type: \"input_text\", text: content }];\n }\n\n return content.map((part) => serializeInputContentPart(part));\n}\n\nfunction serializeAssistantMessageContent(\n content: AcpModelRequestMessage[\"content\"]\n): Array<{ type: \"output_text\"; text: string; annotations: [] }> {\n if (typeof content === \"string\") {\n return content.length === 0\n ? []\n : [\n {\n type: \"output_text\",\n text: content,\n annotations: []\n }\n ];\n }\n\n return content.map((part) => ({\n type: \"output_text\",\n text: toolResultPartToText(part),\n annotations: []\n }));\n}\n\nfunction serializeInputContentPart(\n part: ToolResultPart\n):\n | { type: \"input_text\"; text: string }\n | { type: \"input_image\"; image_url: string; detail: \"auto\" } {\n if (part.type === \"image\") {\n return {\n type: \"input_image\",\n image_url: `data:${part.mimeType};base64,${part.data}`,\n detail: \"auto\"\n };\n }\n\n return {\n type: \"input_text\",\n text: toolResultPartToText(part)\n };\n}\n\nfunction buildReasoningRequestParam(\n options: OpenaiResponsesPluginOptions\n):\n | {\n effort?: OpenaiResponsesPluginOptions[\"reasoningEffort\"];\n summary?: OpenaiResponsesPluginOptions[\"reasoningSummary\"];\n }\n | undefined {\n if (options.reasoningEffort === undefined && options.reasoningSummary === undefined) {\n return undefined;\n }\n\n return {\n ...(options.reasoningEffort === undefined ? {} : { effort: options.reasoningEffort }),\n ...(options.reasoningSummary === undefined ? {} : { summary: options.reasoningSummary })\n };\n}\n\nfunction normalizeToolInputSchema(schema: unknown): {\n type: \"object\";\n properties: Record<string, unknown>;\n required?: string[];\n} {\n if (typeof schema === \"object\" && schema !== null && !Array.isArray(schema)) {\n const objectSchema = schema as {\n properties?: Record<string, unknown>;\n required?: string[];\n };\n\n return {\n type: \"object\",\n properties: objectSchema.properties ?? {},\n ...(objectSchema.required === undefined ? {} : { required: [...objectSchema.required] })\n };\n }\n\n return {\n type: \"object\",\n properties: {}\n };\n}\n\nfunction resolveToolUseId(item: { id?: string; call_id?: string } | undefined): string | undefined {\n return toNonEmptyString(item?.call_id) ?? toNonEmptyString(item?.id);\n}\n\nfunction isResponseReasoningItem(item: unknown): item is ResponseReasoningItem {\n return (\n typeof item === \"object\" &&\n item !== null &&\n \"type\" in item &&\n item.type === \"reasoning\"\n );\n}\n\nfunction isResponseFunctionToolCall(item: unknown): item is ResponseFunctionToolCall {\n return (\n typeof item === \"object\" &&\n item !== null &&\n \"type\" in item &&\n item.type === \"function_call\"\n );\n}\n\nfunction resolveToolUseIdFromItemId(\n itemId: string | undefined,\n toolCallIdsByItemId: Map<string, string>\n): string | undefined {\n const normalizedItemId = toNonEmptyString(itemId);\n if (normalizedItemId === undefined) {\n return undefined;\n }\n\n return toolCallIdsByItemId.get(normalizedItemId) ?? normalizedItemId;\n}\n\nfunction getOrCreateToolCallBuffer(\n toolCallsById: Map<string, ToolCallBuffer>,\n id: string\n): ToolCallBuffer {\n const existing = toolCallsById.get(id);\n if (existing !== undefined) {\n return existing;\n }\n\n const created: ToolCallBuffer = {\n id,\n rawArguments: \"\"\n };\n toolCallsById.set(id, created);\n return created;\n}\n\nfunction parseToolArguments(\n value: string\n): { ok: true; value: unknown } | { ok: false; error: string } {\n if (value.length === 0) {\n return {\n ok: true,\n value: {}\n };\n }\n\n try {\n return {\n ok: true,\n value: JSON.parse(value) as unknown\n };\n } catch (error) {\n return {\n ok: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n}\n\nfunction resolveStopReason(\n response: ResponseLike | undefined,\n sawToolUse: boolean\n): Extract<ProviderStreamEvent, { type: \"stop\" }>[\"reason\"] {\n if (\n response?.status === \"failed\" ||\n (response?.error !== null && response?.error !== undefined)\n ) {\n return \"error\";\n }\n\n const incompleteReason = response?.incomplete_details?.reason;\n if (incompleteReason === \"max_output_tokens\") {\n return \"max_tokens\";\n }\n\n if (incompleteReason === \"content_filter\") {\n return \"error\";\n }\n\n if (sawToolUse || response?.output?.some((item) => item.type === \"function_call\")) {\n return \"tool_use\";\n }\n\n return \"end_turn\";\n}\n\nfunction extractUsage(\n response: ResponseLike | undefined\n): Extract<ProviderStreamEvent, { type: \"usage\" }> | undefined {\n const usage = response?.usage;\n if (usage === undefined) {\n return undefined;\n }\n\n const inputTokens = toNonNegativeInteger(usage.input_tokens) ?? 0;\n const outputTokens = toNonNegativeInteger(usage.output_tokens) ?? 0;\n const cachedTokens = toNonNegativeInteger(usage.input_tokens_details?.cached_tokens) ?? 0;\n\n if (inputTokens === 0 && outputTokens === 0 && cachedTokens === 0) {\n return undefined;\n }\n\n return {\n type: \"usage\",\n inputTokens,\n outputTokens,\n cachedTokens,\n cacheCreationTokens: 0\n };\n}\n\nfunction toResponseStreamError(\n event: Extract<ResponseStreamEvent, { type: \"error\" }>\n): Error {\n const error = new Error(event.message ?? \"OpenAI responses stream failed.\");\n error.name = \"OpenAIResponsesStreamError\";\n Object.assign(error, {\n ...(event.code === undefined ? {} : { code: event.code }),\n ...(event.param === undefined ? {} : { param: event.param })\n });\n return error;\n}\n\nfunction isOpenaiOSeriesModel(id: string): boolean {\n if (!id.startsWith(\"o\") || id.length < 2) {\n return false;\n }\n\n const second = id.charCodeAt(1);\n return second >= 48 && second <= 57;\n}\n\nasync function resolveClientApiKey(\n explicitApiKey: string | undefined\n): Promise<string | undefined> {\n const explicit = toNonEmptyString(explicitApiKey);\n if (explicit !== undefined) {\n return await resolveOpenaiApiKey(explicit);\n }\n\n try {\n return await resolveOpenaiApiKey(undefined);\n } catch {\n return undefined;\n }\n}\n\nfunction resolveClientBaseUrl(baseUrl: string | undefined): string | undefined {\n const explicit = toNonEmptyString(baseUrl);\n if (explicit !== undefined) {\n return explicit;\n }\n\n if (toNonEmptyString(process.env.OPENAI_BASE_URL) !== undefined) {\n return undefined;\n }\n\n return DEFAULT_BASE_URL;\n}\n\nfunction readOptionalEnum<T extends string>(\n input: Record<string, unknown>,\n key: string,\n allowedValues: readonly T[]\n): T | undefined {\n const value = input[key];\n if (value === undefined) {\n return undefined;\n }\n\n if (typeof value !== \"string\" || !allowedValues.includes(value as T)) {\n throw new Error(`${key}: expected one of ${allowedValues.join(\", \")}`);\n }\n\n return value as T;\n}\n\nfunction readOptionalStringRecord(\n input: Record<string, unknown>,\n key: string\n): Record<string, string> | undefined {\n const value = input[key];\n if (value === undefined) {\n return undefined;\n }\n\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new Error(`${key}: expected an object of string values`);\n }\n\n const record: Record<string, string> = {};\n for (const [entryKey, entryValue] of Object.entries(value)) {\n if (typeof entryValue !== \"string\") {\n throw new Error(`${key}: expected an object of string values`);\n }\n\n record[entryKey] = entryValue;\n }\n\n return record;\n}\n\nfunction cloneStringRecord(\n value: Record<string, string> | undefined\n): Record<string, string> | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n return { ...value };\n}\n\nfunction toNonNegativeInteger(value: unknown): number | undefined {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) {\n return undefined;\n }\n\n return Math.trunc(value);\n}\n\nfunction toNonEmptyString(value: string | null | undefined): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const trimmed = value.trim();\n return trimmed.length === 0 ? undefined : trimmed;\n}\n", "import { spawn } from \"node:child_process\";\nimport path from \"node:path\";\nimport type { SpawnMode } from \"@poe-code/agent-spawn\";\nimport { parse as parseShellCommand } from \"shell-quote\";\nimport type { AgentPlugin } from \"../runtime/plugin-types.js\";\nimport type { ToolContext } from \"../runtime/types.js\";\nimport {\n readOptionalString,\n readOptionalStringArray,\n rejectUnknownKeys,\n toOptionsObject\n} from \"./parse-options.js\";\nimport {\n getOptionalBoolean,\n getOptionalNumber,\n getOptionalString,\n getRequiredString,\n resolveAllowedPath\n} from \"./plugin-args.js\";\nimport type { PluginSpec } from \"./registry.js\";\n\ntype RunCommandOptions = {\n signal: AbortSignal;\n timeoutMs: number;\n notify?: ToolContext[\"notify\"];\n};\n\ntype RunCommandFn = (command: string, cwd: string, options: RunCommandOptions) => Promise<string>;\n\ntype ShellPluginOptions = {\n cwd?: string;\n allowedPaths?: string[];\n runCommand?: RunCommandFn;\n};\n\nexport type ShellPluginConfigOptions = Pick<ShellPluginOptions, \"cwd\" | \"allowedPaths\">;\n\ntype SpawnedCommandOutcome = {\n aborted: boolean;\n timedOut: boolean;\n exitCode: number | null;\n exitSignal: NodeJS.Signals | null;\n error?: Error;\n};\n\ntype SpawnedCommand = {\n stdout: { value: string };\n stderr: { value: string };\n terminate(): void;\n completion: Promise<SpawnedCommandOutcome>;\n};\n\ntype BackgroundCommand = {\n handle: string;\n stdout: { value: string };\n stderr: { value: string };\n status: \"running\" | \"exited\";\n exitCode: number | null;\n exitSignal: NodeJS.Signals | null;\n timedOut: boolean;\n error?: string;\n terminate(): void;\n completion: Promise<void>;\n};\n\ntype ShellOutputNotification = {\n event: \"shell.stdout\" | \"shell.stderr\";\n message: string;\n data: {\n background: boolean;\n command: string;\n cwd: string;\n handle?: string;\n stream: \"stdout\" | \"stderr\";\n };\n};\n\nconst defaultTimeoutSeconds = 120;\nconst maxTimeoutSeconds = 600;\nconst terminateGracePeriodMs = 1_000;\n\nconst shellPlugin = (options: ShellPluginOptions = {}): AgentPlugin => {\n const cwd = path.resolve(options.cwd ?? process.cwd());\n const allowedPaths = (options.allowedPaths ?? [cwd]).map((allowedPath) =>\n path.resolve(cwd, allowedPath)\n );\n const runCommand = options.runCommand ?? defaultRunCommand;\n const backgroundCommands = new Map<string, BackgroundCommand>();\n let nextHandle = 0;\n\n const runCommandTool = {\n name: \"run_command\",\n description:\n \"Run a shell command. Set run_in_background to true to start it and receive a handle string for read_background or kill_background.\",\n policy: {\n read: true,\n edit: true,\n validate: validateRunCommandPolicy\n },\n inputSchema: {\n type: \"object\",\n properties: {\n command: {\n type: \"string\",\n description: \"Command to execute.\"\n },\n cwd: {\n type: \"string\",\n description: \"Working directory for command execution.\"\n },\n timeout: {\n type: \"number\",\n description: \"Timeout in seconds. Defaults to 120 and cannot exceed 600.\"\n },\n run_in_background: {\n type: \"boolean\",\n description:\n \"When true, start the command and return a background handle instead of waiting.\"\n }\n },\n required: [\"command\"]\n },\n async call(args: unknown, ctx: ToolContext): Promise<string> {\n const command = getRequiredString(args, \"command\");\n const commandCwdArg = getOptionalString(args, \"cwd\");\n const commandCwd = commandCwdArg ? resolveAllowedPath(cwd, allowedPaths, commandCwdArg) : cwd;\n const timeoutMs = parseTimeoutMs(args);\n const runInBackground = getOptionalBoolean(args, \"run_in_background\") ?? false;\n\n if (runInBackground) {\n if (ctx.signal.aborted) {\n throw new Error(\"Command aborted\");\n }\n\n nextHandle += 1;\n const handle = `background-${nextHandle}`;\n backgroundCommands.set(\n handle,\n createBackgroundCommand(handle, command, commandCwd, timeoutMs, ctx.notify)\n );\n return handle;\n }\n\n return runCommand(command, commandCwd, {\n signal: ctx.signal,\n timeoutMs,\n notify: ctx.notify\n });\n }\n };\n\n const readBackgroundTool = {\n name: \"read_background\",\n description:\n \"Read the latest buffered stdout/stderr and status for a background command handle.\",\n policy: {\n read: true,\n edit: true\n },\n inputSchema: {\n type: \"object\",\n properties: {\n handle: {\n type: \"string\",\n description: \"Handle returned by run_command when run_in_background is true.\"\n }\n },\n required: [\"handle\"]\n },\n async call(args: unknown): Promise<string> {\n const handle = getRequiredString(args, \"handle\");\n const backgroundCommand = getBackgroundCommand(backgroundCommands, handle);\n return formatBackgroundCommand(backgroundCommand);\n }\n };\n\n const killBackgroundTool = {\n name: \"kill_background\",\n description: \"Terminate a background command handle.\",\n policy: {\n read: true,\n edit: true\n },\n inputSchema: {\n type: \"object\",\n properties: {\n handle: {\n type: \"string\",\n description: \"Handle returned by run_command when run_in_background is true.\"\n }\n },\n required: [\"handle\"]\n },\n async call(args: unknown): Promise<string> {\n const handle = getRequiredString(args, \"handle\");\n const backgroundCommand = getBackgroundCommand(backgroundCommands, handle);\n\n if (backgroundCommand.status === \"exited\") {\n return `Background command already exited: ${handle}`;\n }\n\n backgroundCommand.terminate();\n await backgroundCommand.completion;\n return `Killed background command: ${handle}`;\n }\n };\n\n return {\n name: \"poe-agent-plugin-shell\",\n tools: [runCommandTool, readBackgroundTool, killBackgroundTool],\n async dispose(): Promise<void> {\n const pendingStops: Promise<void>[] = [];\n\n for (const backgroundCommand of backgroundCommands.values()) {\n if (backgroundCommand.status === \"exited\") {\n continue;\n }\n\n backgroundCommand.terminate();\n pendingStops.push(backgroundCommand.completion.catch(() => undefined));\n }\n\n await Promise.all(pendingStops);\n backgroundCommands.clear();\n }\n };\n};\n\nfunction parseTimeoutMs(args: unknown): number {\n const timeoutSeconds = getOptionalNumber(args, \"timeout\") ?? defaultTimeoutSeconds;\n\n if (timeoutSeconds <= 0) {\n throw new Error('Tool argument \"timeout\" must be greater than 0');\n }\n\n if (timeoutSeconds > maxTimeoutSeconds) {\n throw new Error(`Tool argument \"timeout\" must not exceed ${maxTimeoutSeconds}`);\n }\n\n return timeoutSeconds * 1_000;\n}\n\nfunction getBackgroundCommand(\n backgroundCommands: Map<string, BackgroundCommand>,\n handle: string\n): BackgroundCommand {\n const backgroundCommand = backgroundCommands.get(handle);\n if (!backgroundCommand) {\n throw new Error(`Unknown background handle: ${handle}`);\n }\n\n return backgroundCommand;\n}\n\nfunction createBackgroundCommand(\n handle: string,\n command: string,\n cwd: string,\n timeoutMs: number,\n notify?: ToolContext[\"notify\"]\n): BackgroundCommand {\n const spawned = spawnShellCommand(command, cwd, {\n timeoutMs,\n notify,\n background: true,\n handle\n });\n\n const backgroundCommand: BackgroundCommand = {\n handle,\n stdout: spawned.stdout,\n stderr: spawned.stderr,\n status: \"running\",\n exitCode: null,\n exitSignal: null,\n timedOut: false,\n terminate: spawned.terminate,\n completion: spawned.completion.then((outcome) => {\n backgroundCommand.status = \"exited\";\n backgroundCommand.exitCode = outcome.exitCode;\n backgroundCommand.exitSignal = outcome.exitSignal;\n backgroundCommand.timedOut = outcome.timedOut;\n if (outcome.error) {\n backgroundCommand.error = outcome.error.message;\n }\n })\n };\n\n return backgroundCommand;\n}\n\nfunction validateRunCommandPolicy(args: unknown, mode: SpawnMode): string | void {\n let command: string;\n\n try {\n command = getRequiredString(args, \"command\");\n } catch {\n return;\n }\n\n let entries: ReturnType<typeof parseShellCommand>;\n\n try {\n entries = parseShellCommand(command);\n } catch (error) {\n return toPolicyErrorMessage(error, mode);\n }\n\n if (entries.length === 0) {\n return `Command is not allowed in ${mode} mode.`;\n }\n\n const segments: string[][] = [];\n let currentSegment: string[] = [];\n\n for (const entry of entries) {\n if (typeof entry === \"string\") {\n currentSegment.push(entry);\n continue;\n }\n\n if (\"op\" in entry) {\n if (entry.op === \"|\" || entry.op === \"||\" || entry.op === \"&&\" || entry.op === \";\") {\n if (currentSegment.length > 0) {\n segments.push(currentSegment);\n currentSegment = [];\n }\n continue;\n }\n\n if (mode === \"read\") {\n if (isDedicatedToolReadCommand(command)) {\n return \"Use the dedicated file/search/list tools instead of shell wrappers for file reads, searches, or directory listings.\";\n }\n\n return `Shell redirection is not allowed in ${mode} mode.`;\n }\n\n continue;\n }\n }\n\n if (currentSegment.length > 0) {\n segments.push(currentSegment);\n }\n\n for (const segment of segments) {\n const commandParts = stripLeadingAssignments(segment);\n const commandName = commandParts[0];\n\n if (!commandName) {\n continue;\n }\n\n const commandArgs = commandParts.slice(1);\n const shellWrapperReason = getShellWrapperReason(commandName, commandArgs);\n if (shellWrapperReason) {\n return shellWrapperReason;\n }\n\n if (isCdWrapper(commandName, commandArgs)) {\n return 'Use the \"cwd\" argument instead of prefixing commands with \"cd\".';\n }\n\n if (mode === \"read\") {\n const directReadToolReason = getDedicatedReadToolReason(commandName, commandArgs);\n if (directReadToolReason) {\n return directReadToolReason;\n }\n\n const nestedCommand = getNestedReadOnlyCommand(commandName, commandArgs);\n if (nestedCommand) {\n if (!isReadOnlyCommand(nestedCommand.commandName, nestedCommand.args)) {\n return `Command \"${commandName}\" is not allowed in ${mode} mode.`;\n }\n\n continue;\n }\n\n if (!isReadOnlyCommand(commandName, commandArgs)) {\n return `Command \"${commandName}\" is not allowed in ${mode} mode.`;\n }\n\n continue;\n }\n\n const blockedReason = getBlockedEditModeReason(commandName, commandArgs);\n if (blockedReason) {\n return blockedReason;\n }\n }\n}\n\nfunction getShellWrapperReason(commandName: string, args: string[]): string | undefined {\n if (!isShellWrapperCommand(commandName) || args.length === 0) {\n return undefined;\n }\n\n const wrappedCommand = extractWrappedCommand(args);\n if (!wrappedCommand) {\n return undefined;\n }\n\n if (isDedicatedToolReadCommand(wrappedCommand)) {\n return \"Use the dedicated file/search/list tools instead of shell wrappers for file reads, searches, or directory listings.\";\n }\n\n return undefined;\n}\n\nfunction isShellWrapperCommand(commandName: string): boolean {\n return commandName === \"bash\" || commandName === \"sh\" || commandName === \"zsh\" || commandName === \"python\" || commandName === \"python3\";\n}\n\nfunction extractWrappedCommand(args: string[]): string | undefined {\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index];\n if (arg === \"-c\" || arg === \"-lc\") {\n return args[index + 1];\n }\n }\n\n const hereDocIndex = args.findIndex((arg) => arg === \"-\" || arg.startsWith(\"-\"));\n if (hereDocIndex === -1) {\n return undefined;\n }\n\n return args.slice(hereDocIndex + 1).join(\" \");\n}\n\nfunction isDedicatedToolReadCommand(command: string): boolean {\n return /(^|\\b)(cat|ls|find|grep|rg)\\b/.test(command) ||\n /open\\s*\\(|read_text\\s*\\(|read_bytes\\s*\\(|Path\\([^)]*\\)\\.read_text\\s*\\(/.test(command);\n}\n\nfunction getDedicatedReadToolReason(commandName: string, args: string[]): string | undefined {\n if (commandName === \"cat\") {\n return 'Use the dedicated file/search/list tools instead of \"cat\" for file reads.';\n }\n\n if (commandName === \"ls\" || commandName === \"find\") {\n return `Use the dedicated file/search/list tools instead of \"${commandName}\" for directory listings.`;\n }\n\n if (commandName === \"grep\" || commandName === \"rg\") {\n return `Use the dedicated file/search/list tools instead of \"${commandName}\" for searches.`;\n }\n\n if (\n (commandName === \"python\" || commandName === \"python3\") &&\n isDedicatedToolReadCommand([commandName, ...args].join(\" \"))\n ) {\n return \"Use the dedicated file/search/list tools instead of shell wrappers for file reads, searches, or directory listings.\";\n }\n\n return undefined;\n}\n\nfunction isCdWrapper(commandName: string, args: string[]): boolean {\n return commandName === \"cd\" || (args.length > 0 && args[0] === \"cd\");\n}\n\nfunction getNestedReadOnlyCommand(\n commandName: string,\n args: string[]\n): { commandName: string; args: string[] } | undefined {\n if (!isShellWrapperCommand(commandName)) {\n return undefined;\n }\n\n const wrappedCommand = extractWrappedCommand(args);\n if (!wrappedCommand) {\n return undefined;\n }\n\n try {\n const nestedEntries = parseShellCommand(wrappedCommand);\n const nestedSegment = nestedEntries.filter((entry): entry is string => typeof entry === \"string\");\n const nestedParts = stripLeadingAssignments(nestedSegment);\n const nestedCommandName = nestedParts[0];\n if (!nestedCommandName) {\n return undefined;\n }\n\n return { commandName: nestedCommandName, args: nestedParts.slice(1) };\n } catch {\n return undefined;\n }\n}\n\nfunction stripLeadingAssignments(tokens: string[]): string[] {\n let index = 0;\n\n while (index < tokens.length && isEnvironmentAssignment(tokens[index])) {\n index += 1;\n }\n\n return tokens.slice(index);\n}\n\nfunction isEnvironmentAssignment(token: string | undefined): boolean {\n if (!token) {\n return false;\n }\n\n const equalsIndex = token.indexOf(\"=\");\n return equalsIndex > 0 && !token.startsWith(\"/\") && !token.startsWith(\"./\");\n}\n\nfunction isReadOnlyCommand(commandName: string, args: string[]): boolean {\n switch (commandName) {\n case \"pwd\":\n case \"ls\":\n case \"cat\":\n case \"head\":\n case \"tail\":\n case \"sed\":\n case \"awk\":\n case \"grep\":\n case \"rg\":\n case \"find\":\n case \"stat\":\n case \"wc\":\n case \"sort\":\n case \"cut\":\n case \"uniq\":\n case \"which\":\n case \"whereis\":\n case \"basename\":\n case \"dirname\":\n case \"echo\":\n case \"printf\":\n case \"env\":\n case \"printenv\":\n case \"true\":\n case \"false\":\n case \"test\":\n case \"[\":\n case \"realpath\":\n case \"readlink\":\n case \"du\":\n return true;\n case \"git\":\n return isReadOnlyGitCommand(args);\n default:\n return false;\n }\n}\n\nfunction isReadOnlyGitCommand(args: string[]): boolean {\n const subcommand = args.find((arg) => !arg.startsWith(\"-\"));\n\n switch (subcommand) {\n case \"status\":\n case \"diff\":\n case \"log\":\n case \"show\":\n case \"rev-parse\":\n case \"ls-files\":\n case \"grep\":\n case \"blame\":\n case \"merge-base\":\n case \"cat-file\":\n case \"reflog\":\n return true;\n default:\n return false;\n }\n}\n\nfunction getBlockedEditModeReason(commandName: string, args: string[]): string | undefined {\n if (commandName === \"rm\" && isRecursiveForceDelete(args)) {\n return 'Command \"rm -rf\" is blocked in edit mode.';\n }\n\n if (commandName === \"git\") {\n const subcommand = args.find((arg) => !arg.startsWith(\"-\"));\n if (\n subcommand === \"add\" ||\n subcommand === \"branch\" ||\n subcommand === \"checkout\" ||\n subcommand === \"cherry-pick\" ||\n subcommand === \"clean\" ||\n subcommand === \"commit\" ||\n subcommand === \"merge\" ||\n subcommand === \"push\" ||\n subcommand === \"rebase\" ||\n subcommand === \"reset\" ||\n subcommand === \"restore\" ||\n subcommand === \"stash\" ||\n subcommand === \"switch\" ||\n subcommand === \"tag\"\n ) {\n return `Command \"git ${subcommand}\" is blocked in edit mode.`;\n }\n }\n\n if (commandName === \"curl\" && isCurlWrite(args)) {\n return 'Command \"curl\" is blocked in edit mode because it performs a network write.';\n }\n\n if (commandName === \"wget\" && isWgetWrite(args)) {\n return 'Command \"wget\" is blocked in edit mode because it performs a network write.';\n }\n}\n\nfunction isRecursiveForceDelete(args: string[]): boolean {\n let hasRecursive = false;\n let hasForce = false;\n\n for (const arg of args) {\n if (arg === \"--recursive\") {\n hasRecursive = true;\n continue;\n }\n\n if (arg === \"--force\") {\n hasForce = true;\n continue;\n }\n\n if (!arg.startsWith(\"-\") || arg.startsWith(\"--\")) {\n continue;\n }\n\n if (arg.includes(\"r\") || arg.includes(\"R\")) {\n hasRecursive = true;\n }\n\n if (arg.includes(\"f\")) {\n hasForce = true;\n }\n }\n\n return hasRecursive && hasForce;\n}\n\nfunction isCurlWrite(args: string[]): boolean {\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index];\n const next = args[index + 1];\n\n if (\n arg === \"-d\" ||\n arg === \"--data\" ||\n arg === \"--data-binary\" ||\n arg === \"--data-raw\" ||\n arg === \"-F\" ||\n arg === \"--form\" ||\n arg === \"-T\" ||\n arg === \"--upload-file\" ||\n arg.startsWith(\"--data=\") ||\n arg.startsWith(\"--data-binary=\") ||\n arg.startsWith(\"--data-raw=\") ||\n arg.startsWith(\"--form=\") ||\n arg.startsWith(\"--upload-file=\")\n ) {\n return true;\n }\n\n if ((arg === \"-X\" || arg === \"--request\") && next) {\n return !isReadOnlyHttpMethod(next);\n }\n\n if (arg.startsWith(\"--request=\")) {\n return !isReadOnlyHttpMethod(arg.slice(\"--request=\".length));\n }\n }\n\n return false;\n}\n\nfunction isWgetWrite(args: string[]): boolean {\n for (const arg of args) {\n if (\n arg === \"--body-data\" ||\n arg === \"--body-file\" ||\n arg === \"--post-data\" ||\n arg === \"--post-file\" ||\n arg.startsWith(\"--body-data=\") ||\n arg.startsWith(\"--body-file=\") ||\n arg.startsWith(\"--post-data=\") ||\n arg.startsWith(\"--post-file=\")\n ) {\n return true;\n }\n\n if (arg.startsWith(\"--method=\")) {\n return !isReadOnlyHttpMethod(arg.slice(\"--method=\".length));\n }\n }\n\n return false;\n}\n\nfunction isReadOnlyHttpMethod(method: string): boolean {\n const normalizedMethod = method.trim().toUpperCase();\n return (\n normalizedMethod === \"GET\" || normalizedMethod === \"HEAD\" || normalizedMethod === \"OPTIONS\"\n );\n}\n\nfunction toPolicyErrorMessage(error: unknown, mode: SpawnMode): string {\n if (error instanceof Error) {\n return `Unable to evaluate command policy in ${mode} mode: ${error.message}`;\n }\n\n return `Unable to evaluate command policy in ${mode} mode.`;\n}\n\nfunction formatBackgroundCommand(backgroundCommand: BackgroundCommand): string {\n const lines = [`Handle: ${backgroundCommand.handle}`, `Status: ${backgroundCommand.status}`];\n\n if (backgroundCommand.exitCode !== null) {\n lines.push(`Exit code: ${backgroundCommand.exitCode}`);\n }\n\n if (backgroundCommand.exitSignal !== null) {\n lines.push(`Signal: ${backgroundCommand.exitSignal}`);\n }\n\n if (backgroundCommand.timedOut) {\n lines.push(\"Timed out: true\");\n }\n\n if (backgroundCommand.error) {\n lines.push(`Error: ${backgroundCommand.error}`);\n }\n\n lines.push(\"STDOUT:\");\n lines.push(formatCapturedOutput(backgroundCommand.stdout.value));\n lines.push(\"STDERR:\");\n lines.push(formatCapturedOutput(backgroundCommand.stderr.value));\n\n return lines.join(\"\\n\");\n}\n\nasync function defaultRunCommand(\n command: string,\n cwd: string,\n options: RunCommandOptions\n): Promise<string> {\n const spawned = spawnShellCommand(command, cwd, options);\n const outcome = await spawned.completion;\n\n if (outcome.timedOut) {\n throw new Error(`Command timed out after ${options.timeoutMs / 1_000} seconds`);\n }\n\n if (outcome.aborted) {\n throw new Error(\"Command aborted\");\n }\n\n if (outcome.error) {\n throw new Error(`Command failed: ${outcome.error.message}`);\n }\n\n if (outcome.exitCode !== 0) {\n throw new Error(getCommandFailureMessage(spawned.stdout.value, spawned.stderr.value, outcome));\n }\n\n const combinedOutput = combineOutput(spawned.stdout.value, spawned.stderr.value);\n return combinedOutput || \"Command completed with no output\";\n}\n\nfunction spawnShellCommand(\n command: string,\n cwd: string,\n options: {\n signal?: AbortSignal;\n timeoutMs: number;\n notify?: ToolContext[\"notify\"];\n background?: boolean;\n handle?: string;\n }\n): SpawnedCommand {\n const stdout = { value: \"\" };\n const stderr = { value: \"\" };\n const pendingNotifications = new Set<Promise<void>>();\n let notificationError: Error | undefined;\n const child = spawn(command, {\n cwd,\n shell: true,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n ...(process.platform === \"win32\" ? {} : { detached: true })\n });\n\n const notify = (stream: ShellOutputNotification[\"data\"][\"stream\"], message: string): void => {\n if (options.notify === undefined || message.length === 0) {\n return;\n }\n\n const pending = Promise.resolve(\n options.notify({\n event: stream === \"stdout\" ? \"shell.stdout\" : \"shell.stderr\",\n message,\n data: {\n background: options.background ?? false,\n command,\n cwd,\n ...(options.handle === undefined ? {} : { handle: options.handle }),\n stream\n }\n } satisfies ShellOutputNotification)\n )\n .catch((error) => {\n if (notificationError === undefined) {\n notificationError = toError(error);\n terminate();\n }\n })\n .finally(() => {\n pendingNotifications.delete(pending);\n });\n\n pendingNotifications.add(pending);\n };\n\n child.stdout?.setEncoding(\"utf8\");\n child.stdout?.on(\"data\", (chunk: string | Buffer) => {\n const value = chunk.toString();\n stdout.value += value;\n notify(\"stdout\", value);\n });\n\n child.stderr?.setEncoding(\"utf8\");\n child.stderr?.on(\"data\", (chunk: string | Buffer) => {\n const value = chunk.toString();\n stderr.value += value;\n notify(\"stderr\", value);\n });\n\n let terminated = false;\n let aborted = false;\n let timedOut = false;\n let escalationTimer: NodeJS.Timeout | undefined;\n\n const clearEscalationTimer = (): void => {\n if (escalationTimer === undefined) {\n return;\n }\n\n clearTimeout(escalationTimer);\n escalationTimer = undefined;\n };\n\n const killProcess = (signal: NodeJS.Signals): void => {\n try {\n if (process.platform !== \"win32\" && child.pid !== undefined) {\n process.kill(-child.pid, signal);\n return;\n }\n\n child.kill(signal);\n } catch {\n return;\n }\n };\n\n const terminate = (): void => {\n if (terminated) {\n return;\n }\n\n terminated = true;\n killProcess(\"SIGTERM\");\n escalationTimer = setTimeout(() => {\n killProcess(\"SIGKILL\");\n }, terminateGracePeriodMs);\n };\n\n const cleanupAbort = bindAbortSignal(options.signal, () => {\n aborted = true;\n terminate();\n });\n\n const timeout = setTimeout(() => {\n timedOut = true;\n terminate();\n }, options.timeoutMs);\n\n const completion = new Promise<SpawnedCommandOutcome>((resolve) => {\n const resolveOutcome = (outcome: SpawnedCommandOutcome): void => {\n void Promise.allSettled(Array.from(pendingNotifications)).then(() => {\n resolve({\n ...outcome,\n ...(outcome.error === undefined && notificationError ? { error: notificationError } : {})\n });\n });\n };\n\n child.once(\"error\", (error) => {\n clearTimeout(timeout);\n clearEscalationTimer();\n cleanupAbort();\n resolveOutcome({\n aborted,\n timedOut,\n exitCode: null,\n exitSignal: null,\n error: error instanceof Error ? error : new Error(String(error))\n });\n });\n\n child.once(\"close\", (code, signal) => {\n clearTimeout(timeout);\n clearEscalationTimer();\n cleanupAbort();\n resolveOutcome({\n aborted,\n timedOut,\n exitCode: code,\n exitSignal: signal,\n ...(notificationError === undefined ? {} : { error: notificationError })\n });\n });\n });\n\n return {\n stdout,\n stderr,\n terminate,\n completion\n };\n}\n\nfunction bindAbortSignal(signal: AbortSignal | undefined, onAbort: () => void): () => void {\n if (signal === undefined) {\n return () => {};\n }\n\n if (signal.aborted) {\n onAbort();\n return () => {};\n }\n\n signal.addEventListener(\"abort\", onAbort, { once: true });\n\n return () => {\n signal.removeEventListener(\"abort\", onAbort);\n };\n}\n\nfunction toError(error: unknown): Error {\n if (error instanceof Error) {\n return error;\n }\n\n return new Error(String(error));\n}\n\nfunction combineOutput(stdout: string, stderr: string): string {\n return [stdout, stderr]\n .map((output) => output.trim())\n .filter((output) => output.length > 0)\n .join(\"\\n\");\n}\n\nfunction formatCapturedOutput(output: string): string {\n const trimmed = output.trim();\n return trimmed.length > 0 ? trimmed : \"(empty)\";\n}\n\nfunction getCommandFailureMessage(\n stdout: string,\n stderr: string,\n outcome: SpawnedCommandOutcome\n): string {\n const combinedOutput = combineOutput(stdout, stderr);\n if (combinedOutput.length > 0) {\n return `Command failed: ${combinedOutput}`;\n }\n\n if (outcome.exitSignal !== null) {\n return `Command failed with signal ${outcome.exitSignal}`;\n }\n\n if (outcome.exitCode !== null) {\n return `Command failed with exit code ${outcome.exitCode}`;\n }\n\n return \"Command failed\";\n}\n\nexport default shellPlugin;\n\nexport const spec: PluginSpec<ShellPluginConfigOptions> = {\n name: \"shell\",\n parseOptions(input) {\n const obj = toOptionsObject(input);\n rejectUnknownKeys(obj, [\"cwd\", \"allowedPaths\"]);\n const options: ShellPluginConfigOptions = {};\n const cwd = readOptionalString(obj, \"cwd\");\n if (cwd !== undefined) {\n options.cwd = cwd;\n }\n const allowedPaths = readOptionalStringArray(obj, \"allowedPaths\");\n if (allowedPaths !== undefined) {\n options.allowedPaths = allowedPaths;\n }\n return options;\n },\n factory: options => shellPlugin(options),\n};\n", "import { readFileSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { fileURLToPath } from \"node:url\";\n\nconst SYSTEM_PROMPT_PATH = fileURLToPath(new URL(\"./SYSTEM_PROMPT.md\", import.meta.url));\n\nexport async function loadSystemPrompt(): Promise<string> {\n return await readFile(SYSTEM_PROMPT_PATH, \"utf8\");\n}\n\nexport function loadSystemPromptSync(): string {\n return readFileSync(SYSTEM_PROMPT_PATH, \"utf8\");\n}\n", "import type { AgentPlugin } from \"../runtime/plugin-types.js\";\nimport { loadSystemPromptSync } from \"../system-prompt.js\";\nimport { rejectUnknownKeys, toOptionsObject } from \"./parse-options.js\";\nimport type { PluginSpec } from \"./registry.js\";\n\nconst systemPromptPlugin = (): AgentPlugin => ({\n name: \"poe-agent-plugin-system-prompt\",\n prompt(ctx) {\n const bundledSystemPrompt = loadSystemPromptSync();\n if (\n ctx.system === bundledSystemPrompt ||\n (typeof ctx.system === \"string\" && ctx.system.startsWith(`${bundledSystemPrompt}\\n`))\n ) {\n return ctx;\n }\n\n return {\n ...ctx,\n system: [bundledSystemPrompt, ctx.system].filter(Boolean).join(\"\\n\"),\n };\n },\n});\n\nexport type SystemPromptPluginConfigOptions = Record<string, never>;\n\nexport const spec: PluginSpec<SystemPromptPluginConfigOptions> = {\n name: \"system-prompt\",\n parseOptions(input) {\n rejectUnknownKeys(toOptionsObject(input), []);\n return {} as SystemPromptPluginConfigOptions;\n },\n factory: () => systemPromptPlugin(),\n};\n\nexport default systemPromptPlugin;\n", "import TurndownService from \"turndown\";\nimport type { AgentPlugin } from \"../runtime/plugin-types.js\";\nimport { rejectUnknownKeys, toOptionsObject } from \"./parse-options.js\";\nimport { getOptionalNonNegativeInteger, getRequiredString } from \"./plugin-args.js\";\nimport type { PluginSpec } from \"./registry.js\";\n\ntype FetchFn = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;\ntype SearchWebFn = (query: string, options: { signal: AbortSignal }) => Promise<string>;\n\ntype WebPluginOptions = {\n searchWeb?: SearchWebFn;\n fetch?: FetchFn;\n};\n\nexport type WebPluginConfigOptions = Record<string, never>;\n\ninterface DuckDuckGoTopic {\n Text?: string;\n Topics?: DuckDuckGoTopic[];\n}\n\ninterface DuckDuckGoPayload {\n AbstractText?: string;\n RelatedTopics?: DuckDuckGoTopic[];\n}\n\nconst fetchUrlPageSize = 20_000;\nconst htmlToMarkdown = new TurndownService({\n headingStyle: \"atx\",\n codeBlockStyle: \"fenced\"\n});\n\nconst webPlugin = (options: WebPluginOptions = {}): AgentPlugin => {\n const fetchFn = options.fetch ?? globalThis.fetch;\n const searchWeb = options.searchWeb ?? ((query, searchOptions) => defaultSearchWeb(query, fetchFn, searchOptions.signal));\n\n const searchWebTool = {\n name: \"search_web\",\n description: \"Search the web for a query.\",\n policy: {\n read: true,\n edit: true\n },\n inputSchema: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"Search query.\"\n }\n },\n required: [\"query\"]\n },\n async call(args: unknown, ctx: { signal: AbortSignal }): Promise<string> {\n return searchWeb(getRequiredString(args, \"query\"), { signal: ctx.signal });\n }\n };\n\n const fetchUrlTool = {\n name: \"fetch_url\",\n description:\n \"Fetch a URL with HTTP GET. HTML is converted to markdown and responses are paginated with an offset.\",\n policy: {\n read: true,\n edit: true\n },\n inputSchema: {\n type: \"object\",\n properties: {\n url: {\n type: \"string\",\n description: \"URL to fetch with HTTP GET.\"\n },\n offset: {\n type: \"integer\",\n minimum: 0,\n description: `Character offset into the fetched content. Each call returns up to ${fetchUrlPageSize} characters.`\n }\n },\n required: [\"url\"]\n },\n async call(args: unknown, ctx: { signal: AbortSignal }): Promise<string> {\n return defaultFetchUrl(\n getRequiredString(args, \"url\"),\n getOptionalNonNegativeInteger(args, \"offset\") ?? 0,\n fetchFn,\n ctx.signal\n );\n }\n };\n\n return {\n name: \"poe-agent-plugin-web\",\n tools: [searchWebTool, fetchUrlTool]\n };\n};\n\nasync function defaultSearchWeb(\n query: string,\n fetchFn: FetchFn,\n signal: AbortSignal\n): Promise<string> {\n const url = new URL(\"https://api.duckduckgo.com/\");\n url.searchParams.set(\"q\", query);\n url.searchParams.set(\"format\", \"json\");\n url.searchParams.set(\"no_redirect\", \"1\");\n url.searchParams.set(\"no_html\", \"1\");\n url.searchParams.set(\"skip_disambig\", \"1\");\n\n const response = await fetchFn(url.toString(), { signal });\n if (!response.ok) {\n throw new Error(`Web search failed (${response.status})`);\n }\n\n const body = (await response.json()) as DuckDuckGoPayload;\n const lines: string[] = [];\n\n if (typeof body.AbstractText === \"string\" && body.AbstractText.trim().length > 0) {\n lines.push(body.AbstractText.trim());\n }\n\n if (body.RelatedTopics) {\n const queue = [...body.RelatedTopics];\n while (queue.length > 0 && lines.length < 5) {\n const current = queue.shift();\n if (!current) {\n continue;\n }\n\n if (typeof current.Text === \"string\" && current.Text.trim().length > 0) {\n lines.push(current.Text.trim());\n }\n\n if (current.Topics) {\n queue.push(...current.Topics);\n }\n }\n }\n\n if (lines.length === 0) {\n return \"No search results found.\";\n }\n\n return lines.join(\"\\n\");\n}\n\nasync function defaultFetchUrl(\n url: string,\n offset: number,\n fetchFn: FetchFn,\n signal: AbortSignal\n): Promise<string> {\n const response = await fetchFn(url, { signal });\n if (!response.ok) {\n throw new Error(`URL fetch failed (${response.status})`);\n }\n\n const contentType = normalizeContentType(response.headers.get(\"content-type\"));\n const rawContent = await response.text();\n const content = formatFetchedBody(rawContent, contentType);\n const start = Math.min(offset, content.length);\n const end = Math.min(start + fetchUrlPageSize, content.length);\n const page = content.slice(start, end);\n const lines = [\n `URL: ${url}`,\n `Content type: ${contentType}`,\n `Showing characters ${start}-${end} of ${content.length}.`\n ];\n\n if (end < content.length) {\n lines.push(`More content available at offset ${end}.`);\n }\n\n lines.push(\"\", page);\n return lines.join(\"\\n\");\n}\n\nfunction normalizeContentType(contentType: string | null): string {\n if (!contentType) {\n return \"unknown\";\n }\n\n const normalized = contentType.split(\";\", 1)[0]?.trim().toLowerCase();\n return normalized && normalized.length > 0 ? normalized : \"unknown\";\n}\n\nfunction formatFetchedBody(content: string, contentType: string): string {\n if (contentType === \"text/html\" || contentType === \"application/xhtml+xml\") {\n const markdown = htmlToMarkdown.turndown(content).trim();\n return markdown.length > 0 ? markdown : \"(empty response body)\";\n }\n\n return content.length > 0 ? content : \"(empty response body)\";\n}\n\nexport default webPlugin;\n\nexport const spec: PluginSpec<WebPluginConfigOptions> = {\n name: \"web\",\n parseOptions(input) {\n rejectUnknownKeys(toOptionsObject(input), []);\n return {} as WebPluginConfigOptions;\n },\n factory: () => webPlugin(),\n};\n", "import {\n createPostCompactionHookContext,\n createPreCompactionHookContext\n} from \"../runtime/hooks.js\";\nimport type {\n AgentPlugin,\n IterationCompactionOptions,\n IterationCompactionResult,\n IterationContext\n} from \"../runtime/plugin-types.js\";\nimport { estimateMessageContentSize } from \"../runtime/tool-results.js\";\nimport type { ChatMessage } from \"../runtime/types.js\";\nimport {\n readOptionalNonNegativeInteger,\n rejectUnknownKeys,\n toOptionsObject\n} from \"./parse-options.js\";\nimport type { PluginSpec } from \"./registry.js\";\n\nconst DEFAULT_CONTEXT_WINDOW = 200_000;\nconst DEFAULT_THRESHOLD_RATIO = 0.8;\nconst DEFAULT_KEEP_LAST_TURNS = 3;\nconst COMPACTION_MESSAGE_NAME = \"compaction\";\n\nexport type CompactionPluginOptions = Pick<\n IterationCompactionOptions,\n \"threshold\" | \"contextWindow\" | \"keepLastTurns\" | \"summarise\"\n>;\n\nconst compactionPlugin = (options: CompactionPluginOptions = {}): AgentPlugin => ({\n name: \"poe-agent-plugin-compaction\",\n hooks: {\n async postIteration(ctx) {\n await compactIteration(ctx, options);\n }\n }\n});\n\nasync function compactIteration(\n ctx: IterationContext,\n options: CompactionPluginOptions\n): Promise<IterationCompactionResult | undefined> {\n const tokenCount = estimateTokenCount(ctx.messages);\n const preCompactionContext = createPreCompactionHookContext({\n tokenCount,\n force: false,\n messages: ctx.messages,\n signal: ctx.signal\n });\n const preCompactionDispatch = await ctx.runHook(\"preCompaction\", preCompactionContext);\n\n if (preCompactionDispatch.type === \"skip\") {\n return undefined;\n }\n\n const contextWindow = options.contextWindow ?? DEFAULT_CONTEXT_WINDOW;\n const threshold = options.threshold ?? Math.floor(contextWindow * DEFAULT_THRESHOLD_RATIO);\n if (tokenCount <= threshold) {\n return undefined;\n }\n\n const compactionPlan = buildCompactionPlan(\n ctx.messages,\n options.keepLastTurns ?? DEFAULT_KEEP_LAST_TURNS\n );\n if (!compactionPlan) {\n return undefined;\n }\n\n const summary = await resolveCompactionSummary({\n complete: ctx.complete,\n messages: compactionPlan.droppedMessages,\n summarise: options.summarise\n });\n const compactedMessages = insertCompactionSummaryMessage(compactionPlan.messages, summary);\n\n ctx.messages.splice(0, ctx.messages.length, ...compactedMessages);\n\n const postCompactionContext = createPostCompactionHookContext({\n tokenCount: estimateTokenCount(ctx.messages),\n summary,\n droppedMessages: compactionPlan.droppedMessages,\n messages: ctx.messages,\n signal: ctx.signal\n });\n await ctx.runHook(\"postCompaction\", postCompactionContext);\n syncCompactionSummaryMessage(ctx.messages, postCompactionContext.summary);\n\n return {\n summary: postCompactionContext.summary,\n droppedMessages: postCompactionContext.droppedMessages\n };\n}\n\nfunction buildCompactionPlan(\n messages: ChatMessage[],\n keepLastTurns: number\n): { messages: ChatMessage[]; droppedMessages: ChatMessage[] } | undefined {\n const tailStartIndex = findCompactionTailStart(messages, keepLastTurns);\n const compactedMessages: ChatMessage[] = [];\n const droppedMessages: ChatMessage[] = [];\n\n for (let index = 0; index < messages.length; index += 1) {\n const message = messages[index];\n if (!message) {\n continue;\n }\n\n if (index < tailStartIndex && !shouldPreserveBeforeCompaction(message)) {\n droppedMessages.push(message);\n continue;\n }\n\n compactedMessages.push(message);\n }\n\n if (droppedMessages.length === 0) {\n return undefined;\n }\n\n return {\n messages: compactedMessages,\n droppedMessages\n };\n}\n\nfunction findCompactionTailStart(messages: ChatMessage[], keepLastTurns: number): number {\n let turnsRemaining = keepLastTurns;\n\n for (let index = messages.length - 1; index >= 0; index -= 1) {\n if (messages[index]?.role !== \"user\") {\n continue;\n }\n\n turnsRemaining -= 1;\n if (turnsRemaining === 0) {\n return index;\n }\n }\n\n return messages.length;\n}\n\nfunction shouldPreserveBeforeCompaction(message: ChatMessage): boolean {\n return message.role === \"system\" && message.name !== COMPACTION_MESSAGE_NAME;\n}\n\nfunction insertCompactionSummaryMessage(messages: ChatMessage[], summary: string): ChatMessage[] {\n const compactedMessages: ChatMessage[] = [];\n const summaryMessage = createCompactionSummaryMessage(summary);\n let inserted = false;\n\n for (const message of messages) {\n if (!inserted && message.role !== \"system\") {\n compactedMessages.push(summaryMessage);\n inserted = true;\n }\n\n compactedMessages.push(message);\n }\n\n if (!inserted) {\n compactedMessages.push(summaryMessage);\n }\n\n return compactedMessages;\n}\n\nfunction createCompactionSummaryMessage(summary: string): ChatMessage {\n return {\n role: \"system\",\n name: COMPACTION_MESSAGE_NAME,\n content: formatCompactionSummary(summary)\n };\n}\n\nfunction syncCompactionSummaryMessage(messages: ChatMessage[], summary: string): void {\n for (const message of messages) {\n if (message.role === \"system\" && message.name === COMPACTION_MESSAGE_NAME) {\n message.content = formatCompactionSummary(summary);\n return;\n }\n }\n}\n\nfunction formatCompactionSummary(summary: string): string {\n return `Compacted context summary:\\n${summary}`;\n}\n\nasync function resolveCompactionSummary(options: {\n complete: IterationContext[\"complete\"];\n messages: ChatMessage[];\n summarise?: (messages: ChatMessage[]) => string | Promise<string>;\n}): Promise<string> {\n const summary = options.summarise\n ? await options.summarise(options.messages)\n : await summariseWithModel(options.complete, options.messages);\n\n const normalizedSummary = summary.trim();\n return normalizedSummary.length > 0 ? normalizedSummary : \"Earlier context was compacted.\";\n}\n\nasync function summariseWithModel(\n complete: IterationContext[\"complete\"],\n messages: ChatMessage[]\n): Promise<string> {\n return complete([\n {\n role: \"system\",\n content:\n \"Summarise the earlier conversation for the same coding task. Preserve goals, constraints, decisions, files, commands, errors, and open questions. Keep it concise and factual.\"\n },\n ...messages,\n {\n role: \"user\",\n content: \"Provide a concise continuation summary for the dropped context only.\"\n }\n ]);\n}\n\nfunction estimateTokenCount(messages: ChatMessage[]): number {\n let count = 0;\n\n for (const message of messages) {\n count += estimateMessageContentSize(message.content);\n }\n\n return count;\n}\n\nexport default compactionPlugin;\n\nexport type CompactionPluginConfigOptions = Pick<\n CompactionPluginOptions,\n \"threshold\" | \"contextWindow\" | \"keepLastTurns\"\n>;\n\nexport const spec: PluginSpec<CompactionPluginConfigOptions> = {\n name: \"compaction\",\n parseOptions(input) {\n const obj = toOptionsObject(input);\n rejectUnknownKeys(obj, [\"threshold\", \"contextWindow\", \"keepLastTurns\"]);\n const options: CompactionPluginConfigOptions = {};\n const threshold = readOptionalNonNegativeInteger(obj, \"threshold\");\n if (threshold !== undefined) {\n options.threshold = threshold;\n }\n const contextWindow = readOptionalNonNegativeInteger(obj, \"contextWindow\");\n if (contextWindow !== undefined) {\n options.contextWindow = contextWindow;\n }\n const keepLastTurns = readOptionalNonNegativeInteger(obj, \"keepLastTurns\");\n if (keepLastTurns !== undefined) {\n options.keepLastTurns = keepLastTurns;\n }\n return options;\n },\n factory: options => compactionPlugin(options),\n};\n", "import fsPromises from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport type { AgentPlugin } from \"../runtime/plugin-types.js\";\nimport { readOptionalString, rejectUnknownKeys, toOptionsObject } from \"./parse-options.js\";\nimport type { PluginSpec } from \"./registry.js\";\n\nconst AGENTS_FILE = \"AGENTS.md\";\nconst USER_MEMORY_DIRECTORY = path.join(\".config\", \"poe-code\");\n\ntype MemoryPluginFileSystem = Pick<typeof fsPromises, \"readFile\">;\n\nexport type MemoryPluginOptions = {\n cwd?: string;\n homeDir?: string;\n fs?: MemoryPluginFileSystem;\n};\n\nexport type MemoryPluginConfigOptions = Pick<MemoryPluginOptions, \"cwd\" | \"homeDir\">;\n\nconst memoryPlugin = (options: MemoryPluginOptions = {}): AgentPlugin => {\n const cwd = path.resolve(options.cwd ?? process.cwd());\n const homeDir = path.resolve(options.homeDir ?? os.homedir());\n const fs = options.fs ?? fsPromises;\n let memoryPromise: Promise<string | undefined> | undefined;\n\n return {\n name: \"poe-agent-plugin-memory\",\n async prompt(ctx) {\n memoryPromise ??= loadMemory({ cwd, homeDir, fs });\n const memory = await memoryPromise;\n\n if (!memory) {\n return ctx;\n }\n\n return {\n ...ctx,\n system: [memory, ctx.system].filter(Boolean).join(\"\\n\\n\"),\n };\n },\n };\n};\n\nasync function loadMemory(options: {\n cwd: string;\n homeDir: string;\n fs: MemoryPluginFileSystem;\n}): Promise<string | undefined> {\n const sections: string[] = [];\n const projectMemoryPath = await findNearestAgentsFile(options.cwd, options.fs);\n\n if (projectMemoryPath) {\n const projectMemory = await loadOptionalMemoryFile(projectMemoryPath, options.fs);\n if (projectMemory) {\n sections.push(formatMemorySection(\"Project memory\", projectMemory));\n }\n }\n\n const userMemory = await loadOptionalMemoryFile(\n path.join(options.homeDir, USER_MEMORY_DIRECTORY, AGENTS_FILE),\n options.fs,\n );\n if (userMemory) {\n sections.push(formatMemorySection(\"User memory\", userMemory));\n }\n\n if (sections.length === 0) {\n return undefined;\n }\n\n return sections.join(\"\\n\\n\");\n}\n\nasync function findNearestAgentsFile(\n cwd: string,\n fs: MemoryPluginFileSystem,\n): Promise<string | undefined> {\n let currentDirectory = cwd;\n\n while (true) {\n const filePath = path.join(currentDirectory, AGENTS_FILE);\n if ((await readOptionalFile(filePath, fs)) !== undefined) {\n return filePath;\n }\n\n const parentDirectory = path.dirname(currentDirectory);\n if (parentDirectory === currentDirectory) {\n return undefined;\n }\n\n currentDirectory = parentDirectory;\n }\n}\n\nasync function loadOptionalMemoryFile(\n filePath: string,\n fs: MemoryPluginFileSystem,\n): Promise<string | undefined> {\n const content = await readOptionalFile(filePath, fs);\n if (content === undefined) {\n return undefined;\n }\n\n return await expandImports({\n filePath,\n content,\n fs,\n loading: new Set<string>(),\n });\n}\n\nasync function expandImports(options: {\n filePath: string;\n content: string;\n fs: MemoryPluginFileSystem;\n loading: Set<string>;\n}): Promise<string | undefined> {\n const normalizedPath = path.resolve(options.filePath);\n if (options.loading.has(normalizedPath)) {\n throw new Error(`Circular AGENTS.md import detected: ${normalizedPath}`);\n }\n\n options.loading.add(normalizedPath);\n\n try {\n const expandedLines: string[] = [];\n\n for (const line of normalizeLineEndings(options.content).split(\"\\n\")) {\n const importPath = parseImportPath(line);\n if (!importPath) {\n expandedLines.push(line);\n continue;\n }\n\n const importedFilePath = path.resolve(path.dirname(normalizedPath), importPath);\n const importedContent = await readRequiredFile(importedFilePath, options.fs);\n const expandedImport = await expandImports({\n filePath: importedFilePath,\n content: importedContent,\n fs: options.fs,\n loading: options.loading,\n });\n\n if (expandedImport) {\n expandedLines.push(expandedImport);\n }\n }\n\n const expandedContent = expandedLines.join(\"\\n\").trim();\n return expandedContent.length > 0 ? expandedContent : undefined;\n } finally {\n options.loading.delete(normalizedPath);\n }\n}\n\nfunction parseImportPath(line: string): string | undefined {\n const trimmed = line.trim();\n if (!trimmed.startsWith(\"@\")) {\n return undefined;\n }\n\n const importPath = trimmed.slice(1).trim();\n return importPath.length > 0 ? importPath : undefined;\n}\n\nfunction formatMemorySection(title: string, content: string): string {\n return `${title}:\\n${content}`;\n}\n\nfunction normalizeLineEndings(content: string): string {\n return content.split(\"\\r\\n\").join(\"\\n\");\n}\n\nasync function readOptionalFile(\n filePath: string,\n fs: MemoryPluginFileSystem,\n): Promise<string | undefined> {\n try {\n return await fs.readFile(filePath, \"utf8\");\n } catch (error) {\n if (isMissingFileError(error)) {\n return undefined;\n }\n\n throw error;\n }\n}\n\nasync function readRequiredFile(filePath: string, fs: MemoryPluginFileSystem): Promise<string> {\n const content = await readOptionalFile(filePath, fs);\n if (content !== undefined) {\n return content;\n }\n\n throw new Error(`Missing AGENTS.md import: ${filePath}`);\n}\n\nfunction isMissingFileError(error: unknown): boolean {\n if (typeof error !== \"object\" || error === null) {\n return false;\n }\n\n return (error as NodeJS.ErrnoException).code === \"ENOENT\";\n}\n\nexport default memoryPlugin;\n\nexport const spec: PluginSpec<MemoryPluginConfigOptions> = {\n name: \"memory\",\n parseOptions(input) {\n const obj = toOptionsObject(input);\n rejectUnknownKeys(obj, [\"cwd\", \"homeDir\"]);\n const options: MemoryPluginConfigOptions = {};\n const cwd = readOptionalString(obj, \"cwd\");\n if (cwd !== undefined) {\n options.cwd = cwd;\n }\n const homeDir = readOptionalString(obj, \"homeDir\");\n if (homeDir !== undefined) {\n options.homeDir = homeDir;\n }\n return options;\n },\n factory: options => memoryPlugin(options),\n};\n", "import type { AgentPlugin } from \"../runtime/plugin-types.js\";\nimport { spec as compactionPluginSpec } from \"./poe-agent-plugin-compaction.js\";\nimport { spec as filesPluginSpec } from \"./poe-agent-plugin-files.js\";\nimport { spec as memoryPluginSpec } from \"./poe-agent-plugin-memory.js\";\nimport { spec as openaiChatCompletionsSpec } from \"./poe-agent-plugin-openai-chat-completions.js\";\nimport { spec as openaiResponsesSpec } from \"./poe-agent-plugin-openai-responses.js\";\nimport { spec as policyPluginSpec } from \"./poe-agent-plugin-policy.js\";\nimport { spec as shellPluginSpec } from \"./poe-agent-plugin-shell.js\";\nimport { spec as systemPromptPluginSpec } from \"./poe-agent-plugin-system-prompt.js\";\nimport { spec as webPluginSpec } from \"./poe-agent-plugin-web.js\";\n\nexport type PluginSpec<Options = unknown> = {\n name: string;\n parseOptions: (input: unknown) => Options;\n factory: (options: Options) => AgentPlugin;\n};\n\nexport const builtinPluginRegistry: ReadonlyMap<string, PluginSpec<any>> = new Map<\n string,\n PluginSpec<any>\n>([\n [systemPromptPluginSpec.name, systemPromptPluginSpec],\n [filesPluginSpec.name, filesPluginSpec],\n [shellPluginSpec.name, shellPluginSpec],\n [webPluginSpec.name, webPluginSpec],\n [memoryPluginSpec.name, memoryPluginSpec],\n [openaiResponsesSpec.name, openaiResponsesSpec],\n [openaiChatCompletionsSpec.name, openaiChatCompletionsSpec],\n [compactionPluginSpec.name, compactionPluginSpec],\n [policyPluginSpec.name, policyPluginSpec]\n]);\n", "import type { AgentPlugin } from \"../runtime/plugin-types.js\";\nimport { setResolvedPluginOptions } from \"../runtime/provider-metadata.js\";\nimport { builtinPluginRegistry } from \"./registry.js\";\n\nexport type PluginConfigEntry = {\n name: string;\n options?: unknown;\n};\n\nexport class PluginConfigError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"PluginConfigError\";\n }\n}\n\nexport function parsePluginConfigEntry(input: unknown): PluginConfigEntry {\n if (!isPlainObject(input)) {\n throw new PluginConfigError(\"agent.plugins: must be an object.\");\n }\n\n for (const key of Object.keys(input)) {\n if (key !== \"name\" && key !== \"options\") {\n throw new PluginConfigError(`agent.plugins: unknown key \"${key}\".`);\n }\n }\n\n const name = input.name;\n if (typeof name !== \"string\" || name.trim().length === 0) {\n throw new PluginConfigError(\"agent.plugins.name: must be a non-empty string.\");\n }\n\n const entry: PluginConfigEntry = { name: name.trim() };\n if (\"options\" in input) {\n entry.options = input.options;\n }\n return entry;\n}\n\nexport function parsePluginConfigEntries(input: unknown): PluginConfigEntry[] {\n if (!Array.isArray(input)) {\n throw new PluginConfigError(\"agent.plugins: must be an array.\");\n }\n\n return input.map((value, index) => {\n try {\n return parsePluginConfigEntry(value);\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Invalid plugin config entry.\";\n const replaced = message.startsWith(\"agent.plugins\")\n ? message.replace(\"agent.plugins\", `agent.plugins[${index}]`)\n : `agent.plugins[${index}]: ${message}`;\n throw new PluginConfigError(replaced);\n }\n });\n}\n\nexport function parseNullablePluginConfigEntries(input: unknown): PluginConfigEntry[] | null {\n if (input === null) {\n return null;\n }\n return parsePluginConfigEntries(input);\n}\n\nexport function resolvePluginsFromConfig(entries: PluginConfigEntry[]): AgentPlugin[] {\n const parsedEntries = parsePluginConfigEntries(entries);\n const seenNames = new Set<string>();\n const plugins: AgentPlugin[] = [];\n\n for (const [index, entry] of parsedEntries.entries()) {\n if (seenNames.has(entry.name)) {\n throw new PluginConfigError(`agent.plugins[${index}]: duplicate plugin \"${entry.name}\".`);\n }\n\n const spec = builtinPluginRegistry.get(entry.name);\n if (!spec) {\n throw createUnknownPluginError(index, entry.name);\n }\n\n let parsedOptions: unknown;\n try {\n parsedOptions = spec.parseOptions(entry.options ?? {});\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Invalid plugin options.\";\n throw new PluginConfigError(`agent.plugins[${index}].options.${message}`);\n }\n\n plugins.push(setResolvedPluginOptions(spec.factory(parsedOptions), parsedOptions));\n seenNames.add(entry.name);\n }\n\n return plugins;\n}\n\nfunction createUnknownPluginError(index: number, name: string): PluginConfigError {\n const suggestions = getPluginSuggestions(name);\n const suggestionText =\n suggestions.length > 0 ? ` Did you mean ${formatSuggestions(suggestions)}?` : \"\";\n return new PluginConfigError(\n `agent.plugins[${index}]: unknown plugin \"${name}\".${suggestionText}`\n );\n}\n\nfunction getPluginSuggestions(name: string): string[] {\n return [...builtinPluginRegistry.keys()]\n .map((candidate) => ({\n name: candidate,\n distance: getLevenshteinDistance(name, candidate)\n }))\n .sort((left, right) => left.distance - right.distance || left.name.localeCompare(right.name))\n .slice(0, 3)\n .map((candidate) => candidate.name);\n}\n\nfunction formatSuggestions(suggestions: string[]): string {\n if (suggestions.length === 1) {\n return `\"${suggestions[0]}\"`;\n }\n\n if (suggestions.length === 2) {\n return `\"${suggestions[0]}\" or \"${suggestions[1]}\"`;\n }\n\n const leading = suggestions\n .slice(0, -1)\n .map((suggestion) => `\"${suggestion}\"`)\n .join(\", \");\n return `${leading}, or \"${suggestions[suggestions.length - 1]}\"`;\n}\n\nfunction getLevenshteinDistance(left: string, right: string): number {\n const rows = left.length + 1;\n const cols = right.length + 1;\n const matrix = Array.from({ length: rows }, () => Array<number>(cols).fill(0));\n\n for (let row = 0; row < rows; row += 1) {\n matrix[row]![0] = row;\n }\n\n for (let col = 0; col < cols; col += 1) {\n matrix[0]![col] = col;\n }\n\n for (let row = 1; row < rows; row += 1) {\n for (let col = 1; col < cols; col += 1) {\n const substitutionCost = left[row - 1] === right[col - 1] ? 0 : 1;\n matrix[row]![col] = Math.min(\n matrix[row - 1]![col]! + 1,\n matrix[row]![col - 1]! + 1,\n matrix[row - 1]![col - 1]! + substitutionCost\n );\n }\n }\n\n return matrix[rows - 1]![cols - 1]!;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n", "import type {\n SessionUpdate,\n SpawnMode,\n ToolCall as AcpToolCall,\n ToolCallUpdate as AcpToolCallUpdate\n} from \"@poe-code/agent-spawn\";\nimport {\n agent,\n normalizeNonEmptyString,\n type AgentBuilder,\n type AgentRunOptions\n} from \"./agent.js\";\nimport filesPlugin from \"./plugins/poe-agent-plugin-files.js\";\nimport { openaiChatCompletionsPlugin } from \"./plugins/poe-agent-plugin-openai-chat-completions.js\";\nimport { openaiResponsesPlugin } from \"./plugins/poe-agent-plugin-openai-responses.js\";\nimport policyPlugin from \"./plugins/poe-agent-plugin-policy.js\";\nimport shellPlugin from \"./plugins/poe-agent-plugin-shell.js\";\nimport systemPromptPlugin from \"./plugins/poe-agent-plugin-system-prompt.js\";\nimport webPlugin from \"./plugins/poe-agent-plugin-web.js\";\nimport { resolvePluginsFromConfig, type PluginConfigEntry } from \"./plugins/resolve-plugins.js\";\nimport type { AgentPlugin } from \"./runtime/plugin-types.js\";\nimport { getStructuredToolResultParts } from \"./runtime/tool-results.js\";\nimport type { AcpEvent, RunResult } from \"./runtime/types.js\";\n\ntype ChatMessage = { role: string; content: string };\n\nexport interface AgentSession {\n sendMessage(prompt: string, options?: AgentSessionSendMessageOptions): Promise<ChatMessage>;\n dispose(): Promise<void>;\n}\n\nexport interface AgentSessionSendMessageOptions {\n signal?: AbortSignal;\n onSessionUpdate?: SessionUpdateCallback;\n}\n\nexport type SessionUpdateCallback = (update: SessionUpdate) => void;\n\nexport interface McpStdioServerDefinition {\n transport: \"stdio\";\n command: string;\n args?: string[];\n env?: Record<string, string>;\n}\n\nexport interface McpHttpServerDefinition {\n transport: \"http\";\n url: string;\n headers?: Record<string, string>;\n}\n\nexport type McpServerDefinition = McpStdioServerDefinition | McpHttpServerDefinition;\n\nexport interface CreateAgentSessionOptions {\n model?: string;\n apiKey?: string;\n cwd?: string;\n allowedPaths?: string[];\n plugins?: AgentPlugin[];\n pluginsConfig?: PluginConfigEntry[];\n mcpServers?: Record<string, McpServerDefinition>;\n baseUrl?: string;\n fetch?: AgentRunOptions[\"fetch\"];\n maxToolCallIterations?: number;\n mode?: SpawnMode;\n}\n\ntype LegacyAcpRunOptions = AgentRunOptions & {\n __legacyAutoHandleTools: true;\n};\n\nexport async function createAgentSession(\n options: CreateAgentSessionOptions = {}\n): Promise<AgentSession> {\n const model = normalizeNonEmptyString(options.model);\n if (!model) {\n throw new Error(\"Missing model. Provide a non-empty model to createAgentSession.\");\n }\n\n if (options.plugins && options.pluginsConfig) {\n throw new Error(\"Cannot provide both plugins and pluginsConfig.\");\n }\n\n let builder = agent().model(model);\n const plugins = options.plugins ??\n (options.pluginsConfig !== undefined\n ? resolvePluginsFromConfig(options.pluginsConfig)\n : undefined) ?? [\n openaiResponsesPlugin(),\n openaiChatCompletionsPlugin(),\n systemPromptPlugin(),\n filesPlugin({ cwd: options.cwd, allowedPaths: options.allowedPaths }),\n shellPlugin({ cwd: options.cwd, allowedPaths: options.allowedPaths }),\n webPlugin()\n ];\n\n for (const plugin of plugins) {\n builder = builder.use(plugin);\n }\n\n for (const [name, definition] of Object.entries(options.mcpServers ?? {})) {\n if (definition.transport !== \"stdio\") {\n throw new Error(\n `Unsupported MCP transport \"${definition.transport}\" for server \"${name}\". Only \"stdio\" is supported.`\n );\n }\n\n builder = builder.mcp({\n name,\n command: definition.command,\n args: definition.args,\n env: definition.env\n });\n }\n\n if (options.mode) {\n builder = builder.use(policyPlugin({ mode: options.mode }));\n }\n\n return adaptAcpToLegacySession(builder, options);\n}\n\nfunction adaptAcpToLegacySession(\n builder: AgentBuilder,\n options: CreateAgentSessionOptions\n): AgentSession {\n let disposed = false;\n let previousRun: RunResult | undefined;\n\n return {\n async sendMessage(\n prompt: string,\n sendOptions: AgentSessionSendMessageOptions = {}\n ): Promise<ChatMessage> {\n if (disposed) {\n throw new Error(\"Agent session is already disposed.\");\n }\n\n const onSessionUpdate = sendOptions.onSessionUpdate;\n let assistantContent = \"\";\n let emittedAssistantChunk = false;\n let completed: RunResult | undefined;\n let failed: Error | undefined;\n\n const runOptions: LegacyAcpRunOptions = {\n signal: sendOptions.signal,\n resume: previousRun,\n apiKey: options.apiKey,\n baseUrl: options.baseUrl,\n fetch: options.fetch,\n cwd: options.cwd,\n maxIterations: options.maxToolCallIterations,\n __legacyAutoHandleTools: true\n };\n\n const acpSession = await builder.acp(prompt, runOptions);\n\n try {\n for await (const event of acpSession.events) {\n handleEvent(event, onSessionUpdate, (chunk) => {\n if (chunk.length > 0) {\n emittedAssistantChunk = true;\n assistantContent += chunk;\n }\n });\n\n if (event.type === \"session.complete\") {\n completed = event.result;\n assistantContent = event.result.output;\n continue;\n }\n\n if (event.type === \"session.error\") {\n failed = event.error;\n }\n }\n } finally {\n await acpSession.dispose();\n }\n\n if (failed) {\n throw failed;\n }\n\n if (!completed) {\n throw new Error(\"Run ended without a terminal event.\");\n }\n\n previousRun = completed;\n\n if (onSessionUpdate && !emittedAssistantChunk && assistantContent.length > 0) {\n onSessionUpdate({\n sessionUpdate: \"agent_message_chunk\",\n content: {\n type: \"text\",\n text: assistantContent\n }\n });\n }\n\n return {\n role: \"assistant\",\n content: assistantContent\n };\n },\n\n async dispose(): Promise<void> {\n disposed = true;\n previousRun = undefined;\n }\n };\n}\n\nfunction handleEvent(\n event: AcpEvent,\n onSessionUpdate: SessionUpdateCallback | undefined,\n onMessageDelta: (chunk: string) => void\n): void {\n if (event.type === \"tool.intent\") {\n if (!onSessionUpdate) {\n return;\n }\n\n const toolCall: AcpToolCall = {\n sessionUpdate: \"tool_call\",\n toolCallId: event.intentId,\n title: event.tool,\n kind: \"execute\",\n status: \"pending\",\n rawInput: event.args\n };\n\n const inProgressUpdate: AcpToolCallUpdate = {\n sessionUpdate: \"tool_call_update\",\n toolCallId: event.intentId,\n kind: \"execute\",\n status: \"in_progress\"\n };\n\n onSessionUpdate(toolCall);\n onSessionUpdate(inProgressUpdate);\n return;\n }\n\n if (event.type === \"tool.result\") {\n if (!onSessionUpdate) {\n return;\n }\n\n const content = toLegacyToolCallContent(event.result);\n onSessionUpdate({\n sessionUpdate: \"tool_call_update\",\n toolCallId: event.intentId,\n kind: \"execute\",\n status: \"completed\",\n rawOutput: event.result,\n ...(content === undefined ? {} : { content })\n });\n return;\n }\n\n if (event.type === \"tool.error\") {\n if (!onSessionUpdate) {\n return;\n }\n\n onSessionUpdate({\n sessionUpdate: \"tool_call_update\",\n toolCallId: event.intentId,\n kind: \"execute\",\n status: \"failed\",\n rawOutput: event.error\n });\n return;\n }\n\n if (event.type === \"message.delta\") {\n onMessageDelta(event.content);\n\n if (!onSessionUpdate || event.content.length === 0) {\n return;\n }\n\n onSessionUpdate({\n sessionUpdate: \"agent_message_chunk\",\n content: {\n type: \"text\",\n text: event.content\n }\n });\n return;\n }\n\n if (event.type === \"usage\") {\n if (!onSessionUpdate) {\n return;\n }\n\n const { inputTokens, outputTokens, cachedTokens, cacheCreationTokens } = event.usage;\n const nonCachedInput = Math.max(0, inputTokens - cachedTokens);\n\n onSessionUpdate({\n sessionUpdate: \"usage_update\",\n used: nonCachedInput,\n size: inputTokens,\n _meta: {\n inputTokens,\n outputTokens,\n cachedTokens,\n cacheCreationTokens\n }\n });\n }\n}\n\nfunction toLegacyToolCallContent(result: unknown): AcpToolCallUpdate[\"content\"] | undefined {\n const parts = getStructuredToolResultParts(result);\n if (!parts) {\n return undefined;\n }\n\n return parts.map((part) => {\n if (part.type === \"text\") {\n return {\n type: \"text\" as const,\n text: part.text\n };\n }\n\n if (part.type === \"image\") {\n return {\n type: \"image\" as const,\n mimeType: part.mimeType,\n data: part.data\n };\n }\n\n return {\n type: \"text\" as const,\n text: JSON.stringify(part)\n };\n });\n}\n", "import type { PromptContext } from \"./plugin-types.js\";\n\nexport type PromptTransform = (ctx: PromptContext) => PromptContext | Promise<PromptContext>;\n\nexport class PromptRegistry {\n readonly #transforms: PromptTransform[] = [];\n\n addTransform(fn: PromptTransform): void {\n this.#transforms.push(fn);\n }\n\n async compile(userPrompt: string, baseSystemPrompt?: string): Promise<PromptContext> {\n let context: PromptContext = {\n userPrompt,\n ...(baseSystemPrompt === undefined\n ? {}\n : {\n baseSystemPrompt,\n system: baseSystemPrompt,\n }),\n };\n\n for (const transform of this.#transforms) {\n context = {\n ...(await transform(context)),\n userPrompt,\n };\n }\n\n return context;\n }\n\n copyFrom(registry: PromptRegistry): void {\n this.#transforms.push(...registry.#transforms);\n }\n}\n", "export class DuplicateToolError extends Error {\n readonly toolName: string;\n\n constructor(toolName: string) {\n super(`Tool name collision: \"${toolName}\" is already registered.`);\n this.name = \"DuplicateToolError\";\n this.toolName = toolName;\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\nexport class PluginSetupError extends Error {\n readonly pluginName: string;\n\n constructor(pluginName: string, cause: unknown) {\n super(`Plugin setup failed for \"${pluginName}\".`, { cause });\n this.name = \"PluginSetupError\";\n this.pluginName = pluginName;\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\nexport class PromptTransformError extends Error {\n readonly pluginName: string;\n\n constructor(pluginName: string, cause: unknown) {\n super(`Prompt transform failed for \"${pluginName}\".`, { cause });\n this.name = \"PromptTransformError\";\n this.pluginName = pluginName;\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n", "export const TOOL_NAME_PATTERN: RegExp = /^[a-zA-Z0-9_-]+$/;\n\nexport class InvalidToolNameError extends Error {\n constructor(name: string, contributor?: string) {\n super(\n contributor === undefined\n ? `Invalid tool name \"${name}\". Tool names must match ${TOOL_NAME_PATTERN}.`\n : `Invalid tool name \"${name}\" from ${contributor}. Tool names must match ${TOOL_NAME_PATTERN}.`,\n );\n this.name = \"InvalidToolNameError\";\n }\n}\n\nexport function assertValidToolName(name: string, contributor?: string): void {\n if (name.length > 0 && TOOL_NAME_PATTERN.test(name)) {\n return;\n }\n\n throw new InvalidToolNameError(name, contributor);\n}\n", "import { DuplicateToolError } from \"./errors.js\";\nimport type { NormalizedTool, Tool, ToolEvent, ToolResult } from \"./types.js\";\nimport { assertValidToolName } from \"./tool-names.js\";\n\nfunction normalizeName(name: string): string {\n return name.trim();\n}\n\nfunction isAsyncGeneratorResult(\n value: unknown\n): value is AsyncGenerator<ToolEvent, ToolResult, void> {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n\n const candidate = value as Partial<AsyncGenerator<ToolEvent, ToolResult, void>>;\n return (\n typeof candidate.next === \"function\" &&\n typeof candidate.return === \"function\" &&\n typeof candidate.throw === \"function\" &&\n typeof candidate[Symbol.asyncIterator] === \"function\"\n );\n}\n\nfunction createNonStreamingInvocation(\n result: ToolResult | Promise<ToolResult>\n): AsyncGenerator<ToolEvent, ToolResult, void> {\n return (async function* (): AsyncGenerator<ToolEvent, ToolResult, void> {\n yield* [];\n return await result;\n })();\n}\n\nfunction createFailingInvocation(error: unknown): AsyncGenerator<ToolEvent, ToolResult, void> {\n return (async function* (): AsyncGenerator<ToolEvent, ToolResult, void> {\n yield* [];\n throw error;\n })();\n}\n\nfunction normalizeActiveSkills(activeSkills?: string[]): string[] {\n const seen = new Set<string>();\n const normalized: string[] = [];\n\n for (const skillName of activeSkills ?? []) {\n const name = normalizeName(skillName);\n if (name.length === 0 || seen.has(name)) {\n continue;\n }\n seen.add(name);\n normalized.push(name);\n }\n\n return normalized;\n}\n\nfunction skillMatchesToolName(skillName: string, toolName: string): boolean {\n if (skillName === toolName) {\n return true;\n }\n\n if (skillName.endsWith(\".*\")) {\n const namespace = skillName.slice(0, -2).trim();\n return namespace.length > 0 && toolName.startsWith(`${namespace}.`);\n }\n\n return toolName.startsWith(`${skillName}.`);\n}\n\nfunction isToolVisibleToModel(tool: NormalizedTool, activeSkills: string[]): boolean {\n if (tool.visibility === \"model\") {\n return true;\n }\n\n if (tool.visibility === \"internal\") {\n return false;\n }\n\n for (const activeSkill of activeSkills) {\n if (skillMatchesToolName(activeSkill, tool.name)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function normalizeTool(tool: Tool): NormalizedTool {\n assertValidToolName(tool.name);\n const normalizedName = normalizeName(tool.name);\n const call = tool.call.bind(tool);\n\n return {\n name: normalizedName,\n description: tool.description,\n inputSchema: tool.inputSchema,\n visibility: tool.visibility ?? \"model\",\n policy: tool.policy,\n invoke(args, ctx) {\n try {\n const result = call(args, ctx);\n if (isAsyncGeneratorResult(result)) {\n return result;\n }\n\n return createNonStreamingInvocation(result);\n } catch (error) {\n return createFailingInvocation(error);\n }\n }\n };\n}\n\nexport class ToolRegistry {\n readonly #tools = new Map<string, NormalizedTool>();\n\n register(tool: Tool): void {\n const normalizedTool = Object.freeze(normalizeTool(tool));\n if (this.#tools.has(normalizedTool.name)) {\n throw new DuplicateToolError(normalizedTool.name);\n }\n\n this.#tools.set(normalizedTool.name, normalizedTool);\n }\n\n get(name: string): NormalizedTool | undefined {\n return this.#tools.get(normalizeName(name));\n }\n\n getAll(): NormalizedTool[] {\n return Array.from(this.#tools.values());\n }\n\n getActiveTools(activeSkills?: string[]): NormalizedTool[] {\n const normalizedActiveSkills = normalizeActiveSkills(activeSkills);\n return this.getAll().filter((tool) => isToolVisibleToModel(tool, normalizedActiveSkills));\n }\n\n copyFrom(registry: ToolRegistry): void {\n for (const tool of registry.#tools.values()) {\n this.#tools.set(tool.name, tool);\n }\n }\n}\n", "import { HookRegistry } from \"./hooks.js\";\nimport type { McpServerConfig } from \"./plugin-types.js\";\nimport { PromptRegistry } from \"./prompts.js\";\nimport { ToolRegistry } from \"./tools.js\";\nimport type { ChatMessage } from \"./types.js\";\n\nexport type DisposeHook = () => void | Promise<void>;\n\nexport type RunContextLogger = {\n error(message: string, error?: unknown): void;\n};\n\nexport type CreateRunContextOptions = {\n activeSkills?: string[];\n logger?: RunContextLogger;\n};\n\nfunction normalizeActiveSkills(activeSkills?: string[]): string[] {\n const seen = new Set<string>();\n const normalized: string[] = [];\n\n for (const value of activeSkills ?? []) {\n const name = value.trim();\n if (name.length === 0 || seen.has(name)) {\n continue;\n }\n\n seen.add(name);\n normalized.push(name);\n }\n\n return normalized;\n}\n\nexport class RunContext {\n readonly messages: ChatMessage[] = [];\n readonly tools = new ToolRegistry();\n readonly prompts = new PromptRegistry();\n readonly hooks = new HookRegistry();\n readonly session = new Map<string, unknown>();\n readonly mcpServers: McpServerConfig[] = [];\n readonly activeSkills: string[];\n readonly abortController = new AbortController();\n readonly childRuns = new Set<Promise<unknown>>();\n\n readonly #logger: RunContextLogger;\n readonly #disposeHooks: DisposeHook[] = [];\n\n #disposing?: Promise<void>;\n #disposed = false;\n\n constructor(options: CreateRunContextOptions = {}) {\n this.activeSkills = normalizeActiveSkills(options.activeSkills);\n this.#logger = options.logger ?? console;\n }\n\n get logger(): RunContextLogger {\n return this.#logger;\n }\n\n registerDisposeHook(hook: DisposeHook): void {\n this.#disposeHooks.push(hook);\n }\n\n trackChildRun<T>(childRun: Promise<T>): Promise<T> {\n this.childRuns.add(childRun);\n void childRun.then(\n () => {\n this.childRuns.delete(childRun);\n },\n () => {\n this.childRuns.delete(childRun);\n }\n );\n\n return childRun;\n }\n\n getChildRunCount(): number {\n return this.childRuns.size;\n }\n\n async dispose(): Promise<void> {\n if (this.#disposed) {\n return;\n }\n\n if (this.#disposing) {\n return this.#disposing;\n }\n\n this.#disposing = this.#disposeInternal();\n\n try {\n await this.#disposing;\n } finally {\n this.#disposed = true;\n this.#disposing = undefined;\n this.#disposeHooks.length = 0;\n this.childRuns.clear();\n }\n }\n\n async #disposeInternal(): Promise<void> {\n if (!this.abortController.signal.aborted) {\n this.abortController.abort();\n }\n\n const errors: unknown[] = [];\n\n for (let index = this.#disposeHooks.length - 1; index >= 0; index -= 1) {\n const hook = this.#disposeHooks[index];\n if (!hook) {\n continue;\n }\n\n try {\n await hook();\n } catch (error) {\n errors.push(error);\n this.#logger.error(\"Dispose hook failed.\", error);\n }\n }\n\n if (errors.length > 0) {\n throw new AggregateError(errors, \"RunContext disposal failed.\");\n }\n }\n}\n\nexport function createRunContext(options?: CreateRunContextOptions): RunContext {\n return new RunContext(options);\n}\n", "import {\n AcpClient,\n type AcpTransportClosedEvent,\n type ContentBlock,\n type InitializeResponse,\n type McpServer,\n type NewSessionResponse,\n type PromptResponse,\n type SessionNotification\n} from \"@poe-code/poe-acp-client\";\nimport {\n createAgentSession,\n type AgentSession,\n type CreateAgentSessionOptions\n} from \"../agent-session.js\";\nimport type { SpawnMode } from \"@poe-code/agent-spawn\";\nimport { runAcpCore, type AcpModel } from \"./acp-core.js\";\nimport { applyHookDecision, createNotificationHookContext } from \"./hooks.js\";\nimport { createRunContext, type RunContext } from \"./run-context.js\";\nimport type {\n AcpEvent,\n AcpHost,\n ForkRequest,\n ForkResult,\n RunOutput,\n ToolAckResult,\n ToolContext,\n ToolEvent,\n ToolIntent\n} from \"./types.js\";\n\ntype InMemorySession = Pick<AgentSession, \"sendMessage\" | \"dispose\">;\ntype InMemoryCreateSession = (options: CreateAgentSessionOptions) => Promise<InMemorySession>;\n\ntype InMemoryNotificationHandler = (\n params: unknown,\n context: { method: string }\n) => void | Promise<void>;\n\ntype InMemoryRequestHandler = (\n params: unknown,\n context: { id: string | number | null; method: string }\n) => unknown | Promise<unknown>;\n\ntype InMemoryAcpTransport = {\n closed: Promise<AcpTransportClosedEvent>;\n sendRequest<TResult = unknown>(method: string, params?: unknown): Promise<TResult>;\n sendNotification(method: string, params?: unknown): void;\n onRequest(method: string, handler: InMemoryRequestHandler): void;\n onNotification(method: string, handler: InMemoryNotificationHandler): void;\n dispose(reason?: Error): void;\n};\n\nexport type AgentHostSpawnClient = Pick<\n AcpClient,\n \"initialize\" | \"newSession\" | \"prompt\" | \"dispose\"\n>;\n\nexport type AgentHostSpawnSession = {\n client: AgentHostSpawnClient;\n cwd: string;\n mcpServers?: McpServer[];\n};\n\nexport type AgentHostOptions = {\n runContext: RunContext;\n model: AcpModel;\n baseSystemPrompt?: string;\n maxIterations?: number;\n emit?(event: AcpEvent): void;\n createSpawnSession(): AgentHostSpawnSession | Promise<AgentHostSpawnSession>;\n};\n\nexport type CreateProcessSpawnSessionOptions = {\n command: string;\n args?: readonly string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n};\n\nexport type CreateInMemorySpawnSessionOptions = {\n model: string;\n cwd: string;\n mode?: SpawnMode;\n baseUrl?: string;\n mcpServers?: CreateAgentSessionOptions[\"mcpServers\"];\n createSession?: InMemoryCreateSession;\n};\n\nexport class AgentHost implements AcpHost {\n readonly #runContext: RunContext;\n readonly #model: AcpModel;\n readonly #baseSystemPrompt?: string;\n readonly #maxIterations?: number;\n readonly #emit?: (event: AcpEvent) => void;\n readonly #createSpawnSession: AgentHostOptions[\"createSpawnSession\"];\n #forkSequence = 0;\n\n constructor(options: AgentHostOptions) {\n this.#runContext = options.runContext;\n this.#model = options.model;\n this.#baseSystemPrompt = options.baseSystemPrompt;\n this.#maxIterations = options.maxIterations;\n this.#emit = options.emit;\n this.#createSpawnSession = options.createSpawnSession;\n }\n\n async handle(intent: ToolIntent): Promise<ToolAckResult> {\n const tool = this.#runContext.tools.get(intent.tool);\n if (!tool) {\n return {\n status: \"error\",\n result: `Unknown tool: ${intent.tool}`\n };\n }\n\n const toolContext: ToolContext = {\n fork: async (prompt) => {\n this.#forkSequence += 1;\n return this.fork({\n forkId: `fork-${this.#forkSequence}`,\n prompt,\n context: {\n messages: [...this.#runContext.messages],\n toolCalls: []\n }\n });\n },\n spawn: async (prompt) => this.spawn(prompt),\n signal: this.#runContext.abortController.signal,\n notify: async (notification) => this.#notify(notification)\n };\n\n try {\n const result = await this.#consumeToolInvocation(tool.invoke(intent.args, toolContext));\n return {\n status: \"success\",\n result\n };\n } catch (error) {\n return {\n status: \"error\",\n result: toErrorMessage(error)\n };\n }\n }\n\n async fork(request: ForkRequest): Promise<ForkResult> {\n this.#emit?.({\n type: \"fork.start\",\n forkId: request.forkId,\n prompt: request.prompt\n });\n\n try {\n const result = await this.#runContext.trackChildRun(this.#runFork(request));\n this.#emit?.({\n type: \"fork.complete\",\n forkId: request.forkId,\n result\n });\n return result;\n } catch (error) {\n const message = toErrorMessage(error);\n this.#emit?.({\n type: \"fork.error\",\n forkId: request.forkId,\n error: message\n });\n throw error;\n }\n }\n\n async spawn(prompt: string): Promise<RunOutput> {\n const spawnSession = await this.#createSpawnSession();\n const mcpServers = spawnSession.mcpServers ?? [];\n let output = \"\";\n\n try {\n await spawnSession.client.initialize();\n const session = await spawnSession.client.newSession(spawnSession.cwd, mcpServers);\n const turn = spawnSession.client.prompt(session.sessionId, [{ type: \"text\", text: prompt }]);\n\n for await (const notification of turn) {\n const update = notification.params.update;\n if (update.sessionUpdate !== \"agent_message_chunk\") {\n continue;\n }\n\n if (update.content.type !== \"text\") {\n continue;\n }\n\n output += update.content.text;\n }\n\n const response = await turn.response;\n if (response.stopReason !== \"completed\") {\n throw new Error(`Spawned session ended with stop reason: ${response.stopReason}`);\n }\n\n return {\n output,\n messages: [\n {\n role: \"assistant\",\n content: output\n }\n ]\n };\n } finally {\n await spawnSession.client.dispose();\n }\n }\n\n async #consumeToolInvocation(\n invocation: AsyncGenerator<ToolEvent, unknown, void>\n ): Promise<unknown> {\n const signal = this.#runContext.abortController.signal;\n let closed = false;\n const closeInvocation = async (): Promise<void> => {\n if (closed) {\n return;\n }\n\n closed = true;\n\n try {\n await invocation.return(undefined);\n } catch {\n return;\n }\n };\n\n const onAbort = (): void => {\n void closeInvocation();\n };\n\n if (signal.aborted) {\n onAbort();\n } else {\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n\n try {\n while (true) {\n const next = await invocation.next();\n if (next.done) {\n return next.value;\n }\n\n if (next.value.type === \"message.delta\") {\n this.#emit?.({\n type: \"message.delta\",\n content: next.value.content\n });\n continue;\n }\n\n this.#emit?.({\n type: \"progress\",\n message: next.value.message\n });\n }\n } finally {\n signal.removeEventListener(\"abort\", onAbort);\n }\n }\n\n async #notify(notification: { event: string; message?: string; data?: unknown }): Promise<void> {\n const signal = this.#runContext.abortController.signal;\n if (signal.aborted) {\n return;\n }\n\n const context = createNotificationHookContext({\n event: notification.event,\n message: notification.message,\n data: notification.data,\n messages: this.#runContext.messages,\n signal\n });\n\n try {\n const decision = await this.#runContext.hooks.run(\"notification\", context);\n await applyHookDecision(\"notification\", decision, context);\n } catch (error) {\n await this.#runContext.dispose().catch(() => undefined);\n throw error;\n }\n }\n\n async #runFork(request: ForkRequest): Promise<ForkResult> {\n const childContext = createRunContext({\n activeSkills: this.#runContext.activeSkills\n });\n childContext.messages.push(...request.context.messages);\n childContext.tools.copyFrom(this.#runContext.tools);\n childContext.prompts.copyFrom(this.#runContext.prompts);\n childContext.hooks.copyFrom(this.#runContext.hooks);\n\n const removeAbortListener = linkAbortController(\n this.#runContext.abortController.signal,\n childContext.abortController\n );\n childContext.registerDisposeHook(removeAbortListener);\n\n const childHost = new AgentHost({\n runContext: childContext,\n model: this.#model,\n baseSystemPrompt: this.#baseSystemPrompt,\n maxIterations: this.#maxIterations,\n createSpawnSession: this.#createSpawnSession\n });\n\n const childEvents = runAcpCore({\n prompt: request.prompt,\n runContext: childContext,\n host: childHost,\n model: this.#model,\n baseSystemPrompt: this.#baseSystemPrompt,\n maxIterations: this.#maxIterations\n });\n\n for await (const event of childEvents) {\n if (event.type === \"session.complete\") {\n return {\n output: event.result.output,\n messages: event.result.messages\n };\n }\n\n if (event.type === \"session.error\") {\n throw event.error;\n }\n }\n\n throw new Error(\"Fork run ended without a terminal event.\");\n }\n}\n\nexport function createProcessSpawnSession(\n options: CreateProcessSpawnSessionOptions\n): AgentHostSpawnSession {\n const cwd = options.cwd ?? process.cwd();\n const client = new AcpClient({\n command: options.command,\n args: options.args,\n cwd,\n ...(options.env === undefined ? {} : { env: options.env })\n });\n\n return {\n client,\n cwd,\n mcpServers: []\n };\n}\n\nexport function createInMemorySpawnSession(\n options: CreateInMemorySpawnSessionOptions\n): AgentHostSpawnSession {\n const transport = createInMemoryAcpTransport(options);\n const client = new AcpClient({ transport });\n\n return {\n client,\n cwd: options.cwd,\n mcpServers: []\n };\n}\n\nexport function createInMemoryAcpTransport(\n options: CreateInMemorySpawnSessionOptions\n): InMemoryAcpTransport {\n const createSession = options.createSession ?? createAgentSession;\n const sessions = new Map<string, InMemorySession>();\n const notificationHandlers = new Map<string, InMemoryNotificationHandler[]>();\n const requestHandlers = new Map<string, InMemoryRequestHandler[]>();\n\n let closed = false;\n let sessionCounter = 0;\n let resolveClosed: ((event: AcpTransportClosedEvent) => void) | undefined;\n\n const closedPromise = new Promise<AcpTransportClosedEvent>((resolve) => {\n resolveClosed = resolve;\n });\n\n const closeTransport = (reason: Error): void => {\n if (closed) {\n return;\n }\n\n closed = true;\n\n const activeSessions = Array.from(sessions.values());\n sessions.clear();\n\n void Promise.all(activeSessions.map(async (session) => session.dispose())).finally(() => {\n resolveClosed?.({\n code: 0,\n signal: null,\n reason,\n stderr: \"\"\n });\n });\n };\n\n return {\n closed: closedPromise,\n async sendRequest<TResult = unknown>(method: string, params?: unknown): Promise<TResult> {\n if (method === \"initialize\") {\n const request = params as { protocolVersion?: number } | undefined;\n const response: InitializeResponse = {\n protocolVersion: request?.protocolVersion ?? 1,\n agentInfo: {\n name: \"poe-agent\",\n version: \"0.0.1\"\n },\n agentCapabilities: {\n sessionCapabilities: {},\n promptCapabilities: {}\n }\n };\n return response as TResult;\n }\n\n if (method === \"session/new\") {\n const request = params as { cwd?: string } | undefined;\n const session = await createSession({\n model: options.model,\n cwd: request?.cwd ?? options.cwd,\n ...(options.mode === undefined ? {} : { mode: options.mode }),\n ...(options.baseUrl === undefined ? {} : { baseUrl: options.baseUrl }),\n ...(options.mcpServers === undefined ? {} : { mcpServers: options.mcpServers })\n });\n sessionCounter += 1;\n const sessionId = `poe-agent-spawn-${sessionCounter}`;\n sessions.set(sessionId, session);\n\n const response: NewSessionResponse = { sessionId };\n return response as TResult;\n }\n\n if (method === \"session/prompt\") {\n const request = params as { sessionId: string; prompt: ContentBlock[] };\n const session = sessions.get(request.sessionId);\n if (!session) {\n throw new Error(`Unknown session \"${request.sessionId}\".`);\n }\n\n const reply = await session.sendMessage(toPromptText(request.prompt));\n if (reply.content.length > 0) {\n const handlers = notificationHandlers.get(\"session/update\") ?? [];\n if (handlers.length > 0) {\n const notification: SessionNotification = {\n sessionId: request.sessionId,\n update: {\n sessionUpdate: \"agent_message_chunk\",\n content: {\n type: \"text\",\n text: reply.content\n }\n }\n };\n\n for (const handler of handlers) {\n void handler(notification, { method: \"session/update\" });\n }\n }\n }\n\n const response: PromptResponse = { stopReason: \"completed\" };\n return response as TResult;\n }\n\n const handlers = requestHandlers.get(method);\n if (handlers && handlers.length > 0) {\n const result = handlers[0]?.(params, { id: null, method });\n return await Promise.resolve(result as TResult);\n }\n\n throw new Error(`Unsupported ACP request method \"${method}\".`);\n },\n sendNotification(method: string, params?: unknown): void {\n if (method !== \"session/cancel\") {\n return;\n }\n\n const sessionId = (params as { sessionId?: string } | undefined)?.sessionId;\n if (!sessionId) {\n return;\n }\n\n const session = sessions.get(sessionId);\n if (!session) {\n return;\n }\n\n sessions.delete(sessionId);\n void session.dispose();\n },\n onRequest(method: string, handler: InMemoryRequestHandler): void {\n const current = requestHandlers.get(method) ?? [];\n requestHandlers.set(method, [...current, handler]);\n },\n onNotification(method: string, handler: InMemoryNotificationHandler): void {\n const current = notificationHandlers.get(method) ?? [];\n notificationHandlers.set(method, [...current, handler]);\n },\n dispose(reason?: Error): void {\n closeTransport(reason ?? new Error(\"In-memory ACP transport disposed.\"));\n }\n };\n}\n\nfunction linkAbortController(parent: AbortSignal, child: AbortController): () => void {\n const onAbort = (): void => {\n if (!child.signal.aborted) {\n child.abort(parent.reason);\n }\n };\n\n if (parent.aborted) {\n onAbort();\n return () => undefined;\n }\n\n parent.addEventListener(\"abort\", onAbort, { once: true });\n return () => {\n parent.removeEventListener(\"abort\", onAbort);\n };\n}\n\nfunction toPromptText(prompt: ContentBlock[]): string {\n const lines: string[] = [];\n\n for (const block of prompt) {\n if (block.type === \"text\") {\n lines.push(block.text);\n continue;\n }\n\n if (block.type === \"resource_link\") {\n lines.push(`${block.name}: ${block.uri}`);\n continue;\n }\n\n if (block.type === \"resource\") {\n if (\"text\" in block.resource) {\n lines.push(block.resource.text);\n }\n continue;\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction toErrorMessage(value: unknown): string {\n if (value instanceof Error) {\n return value.message;\n }\n\n if (typeof value === \"string\") {\n return value;\n }\n\n return String(value);\n}\n", "import { spawn } from \"node:child_process\";\nimport type { ChildProcessWithoutNullStreams, SpawnOptions } from \"node:child_process\";\nimport { PassThrough } from \"node:stream\";\nimport type { Readable, Writable } from \"node:stream\";\nimport type { JSONRPCMessage as SdkJsonRpcMessage } from \"@modelcontextprotocol/sdk/types.js\";\nimport {\n createOAuthClientProvider,\n OAuthError,\n type OAuthClientProvider,\n type OAuthClientProviderOptions,\n} from \"../../mcp-oauth/dist/index.js\";\nimport type { Server as TinyStdioMcpServer } from \"tiny-stdio-mcp-server\";\nimport {\n OAuthMetadataDiscovery,\n parseBearerWwwAuthenticateHeader,\n} from \"./oauth-discovery.js\";\nimport type {\n OAuthDiscoveryCache,\n} from \"./oauth-discovery.js\";\n\nexport {\n OAuthMetadataDiscovery,\n discoverOAuthMetadata,\n parseBearerWwwAuthenticateHeader,\n resolveAuthorizationServerMetadataUrl,\n resolveProtectedResourceMetadataUrl,\n} from \"./oauth-discovery.js\";\nexport {\n createAuthStoreSessionStore,\n createDefaultOAuthClientProvider,\n} from \"../../mcp-oauth/dist/index.js\";\nexport type {\n OAuthDiscoveryCache,\n} from \"./oauth-discovery.js\";\nexport type { OAuthAuthorizationServerMetadata, OAuthDiscoveryResult, OAuthMetadataFetch, OAuthProtectedResourceMetadata, OAuthUnauthorizedChallenge } from \"./oauth-discovery.js\";\nexport type {\n DefaultOAuthClientProviderOptions,\n OAuthClientProvider,\n OAuthClientProviderOptions,\n OAuthSessionStore,\n StoredOAuthSession,\n} from \"../../mcp-oauth/dist/index.js\";\n\nexport type RequestId = number | string;\n\nexport interface Implementation {\n name: string;\n version: string;\n}\n\nexport interface ClientCapabilities {\n roots?: {\n listChanged?: boolean;\n [key: string]: unknown;\n };\n sampling?: {\n [key: string]: unknown;\n };\n experimental?: Record<string, unknown>;\n}\n\nexport interface ServerCapabilities {\n prompts?: {\n listChanged?: boolean;\n [key: string]: unknown;\n };\n resources?: {\n subscribe?: boolean;\n listChanged?: boolean;\n [key: string]: unknown;\n };\n tools?: {\n listChanged?: boolean;\n [key: string]: unknown;\n };\n logging?: {\n [key: string]: unknown;\n };\n completions?: {\n [key: string]: unknown;\n };\n experimental?: Record<string, unknown>;\n}\n\nexport interface InitializeParams {\n protocolVersion: string;\n capabilities: ClientCapabilities;\n clientInfo: Implementation;\n}\n\nexport interface InitializeResult {\n protocolVersion: string;\n capabilities: ServerCapabilities;\n serverInfo: Implementation;\n instructions?: string;\n}\n\nexport interface McpClientOptions {\n clientInfo: Implementation;\n capabilities?: ClientCapabilities;\n onToolsChanged?: () => void | Promise<void>;\n onResourcesChanged?: () => void | Promise<void>;\n onResourceUpdated?: (uri: string) => void | Promise<void>;\n onPromptsChanged?: () => void | Promise<void>;\n onLog?: (message: LogMessage) => void | Promise<void>;\n onProgress?: (params: ProgressParams) => void | Promise<void>;\n onSamplingRequest?: (\n params: CreateMessageParams\n ) => CreateMessageResult | Promise<CreateMessageResult>;\n onRootsList?: () => Root[] | Promise<Root[]>;\n}\n\nconst MCP_PROTOCOL_VERSION = \"2025-03-26\";\n\nexport class McpClient {\n private currentState: \"disconnected\" | \"initializing\" | \"ready\" | \"closed\" = \"disconnected\";\n private currentServerCapabilities: ServerCapabilities | null = null;\n private currentServerInfo: Implementation | null = null;\n private currentInstructions: string | undefined;\n private readonly options: McpClientOptions;\n private transport: McpTransport | null = null;\n private messageLayer: JsonRpcMessageLayer | null = null;\n\n constructor(options: McpClientOptions) {\n this.options = options;\n }\n\n get state(): \"disconnected\" | \"initializing\" | \"ready\" | \"closed\" {\n return this.currentState;\n }\n\n get serverCapabilities(): ServerCapabilities | null {\n return this.currentServerCapabilities;\n }\n\n get serverInfo(): Implementation | null {\n return this.currentServerInfo;\n }\n\n get instructions(): string | undefined {\n return this.currentInstructions;\n }\n\n private getMessageLayerOrThrow(): JsonRpcMessageLayer {\n if (this.currentState === \"disconnected\") {\n throw new Error(\"MCP client is disconnected\");\n }\n\n if (this.currentState === \"closed\") {\n throw new Error(\"MCP client is closed\");\n }\n\n if (this.messageLayer === null) {\n throw new Error(\"MCP client is disconnected\");\n }\n\n return this.messageLayer;\n }\n\n async connect(transport: McpTransport): Promise<InitializeResult> {\n if (this.currentState !== \"disconnected\" && this.currentState !== \"closed\") {\n throw new Error(\"MCP client is already connected\");\n }\n\n const transportClosedReason = transport.closed\n .then((closedEvent) => closedEvent.reason)\n .catch((error: unknown) =>\n error instanceof Error ? error : new Error(String(error))\n );\n const messageLayer = new JsonRpcMessageLayer(\n transport.readable,\n transport.writable,\n 30_000,\n transportClosedReason\n );\n const {\n onSamplingRequest,\n onRootsList,\n onToolsChanged,\n onResourcesChanged,\n onResourceUpdated,\n onPromptsChanged,\n onLog,\n onProgress,\n } = this.options;\n\n messageLayer.onRequest(\"ping\", () => ({}));\n\n if (onSamplingRequest !== undefined) {\n messageLayer.onRequest(\"sampling/createMessage\", (params) =>\n onSamplingRequest(params as CreateMessageParams)\n );\n }\n\n if (onRootsList !== undefined) {\n messageLayer.onRequest(\"roots/list\", async () => ({\n roots: await onRootsList(),\n }));\n }\n\n messageLayer.onNotification(\"notifications/tools/list_changed\", async () => {\n if (onToolsChanged === undefined) {\n return;\n }\n\n await onToolsChanged();\n });\n messageLayer.onNotification(\"notifications/resources/list_changed\", async () => {\n if (onResourcesChanged === undefined) {\n return;\n }\n\n await onResourcesChanged();\n });\n messageLayer.onNotification(\"notifications/resources/updated\", async (params) => {\n if (onResourceUpdated === undefined) {\n return;\n }\n\n if (typeof params !== \"object\" || params === null || Array.isArray(params)) {\n return;\n }\n\n const { uri } = params as { uri?: unknown };\n if (typeof uri !== \"string\") {\n return;\n }\n\n await onResourceUpdated(uri);\n });\n messageLayer.onNotification(\"notifications/prompts/list_changed\", async () => {\n if (onPromptsChanged === undefined) {\n return;\n }\n\n await onPromptsChanged();\n });\n messageLayer.onNotification(\"notifications/message\", async (params) => {\n if (onLog === undefined || !isObjectRecord(params) || !isLogLevel(params.level)) {\n return;\n }\n\n if (!hasOwn(params, \"data\")) {\n return;\n }\n\n const message: LogMessage = {\n level: params.level,\n data: params.data,\n };\n\n if (params.logger !== undefined) {\n if (typeof params.logger !== \"string\") {\n return;\n }\n\n message.logger = params.logger;\n }\n\n await onLog(message);\n });\n messageLayer.onNotification(\"notifications/progress\", async (params) => {\n if (onProgress === undefined || !isObjectRecord(params)) {\n return;\n }\n\n const { progressToken, progress } = params;\n if (!isRequestId(progressToken) || typeof progress !== \"number\") {\n return;\n }\n\n const progressParams: ProgressParams = {\n progressToken,\n progress,\n };\n\n if (params.total !== undefined) {\n if (typeof params.total !== \"number\") {\n return;\n }\n\n progressParams.total = params.total;\n }\n\n if (params.message !== undefined) {\n if (typeof params.message !== \"string\") {\n return;\n }\n\n progressParams.message = params.message;\n }\n\n await onProgress(progressParams);\n });\n messageLayer.onNotification(\"notifications/cancelled\", () => undefined);\n\n this.transport = transport;\n this.messageLayer = messageLayer;\n this.currentState = \"initializing\";\n transport.closed\n .then((closedEvent) => {\n if (this.transport !== transport) {\n return;\n }\n\n this.messageLayer?.dispose(closedEvent.reason);\n this.messageLayer = null;\n this.transport = null;\n this.currentState = \"closed\";\n })\n .catch((error: unknown) => {\n if (this.transport !== transport) {\n return;\n }\n\n const reason = error instanceof Error ? error : new Error(String(error));\n this.messageLayer?.dispose(reason);\n this.messageLayer = null;\n this.transport = null;\n this.currentState = \"closed\";\n });\n\n const capabilities: ClientCapabilities = {\n ...(this.options.capabilities ?? {}),\n };\n\n if (onSamplingRequest !== undefined && capabilities.sampling === undefined) {\n capabilities.sampling = {};\n }\n\n if (onRootsList !== undefined) {\n capabilities.roots = {\n ...(capabilities.roots ?? {}),\n };\n }\n\n const initializeResult = (await messageLayer.sendRequest(\"initialize\", {\n protocolVersion: MCP_PROTOCOL_VERSION,\n clientInfo: this.options.clientInfo,\n capabilities,\n })) as InitializeResult;\n\n if (initializeResult.protocolVersion !== MCP_PROTOCOL_VERSION) {\n throw new McpError(\n ERROR_INVALID_REQUEST,\n `Unsupported protocol version: ${initializeResult.protocolVersion}`\n );\n }\n\n this.currentServerCapabilities = initializeResult.capabilities;\n this.currentServerInfo = initializeResult.serverInfo;\n this.currentInstructions = initializeResult.instructions;\n messageLayer.sendNotification(\"notifications/initialized\");\n this.currentState = \"ready\";\n\n return initializeResult;\n }\n\n private getServerCapabilitiesOrThrow(): ServerCapabilities {\n if (this.currentServerCapabilities === null) {\n throw new Error(\"MCP client has not completed initialization\");\n }\n\n return this.currentServerCapabilities;\n }\n\n async listTools(params: PaginatedParams = {}): Promise<{ tools: Tool[]; nextCursor?: string }> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.tools === undefined) {\n throw new Error(\"Server does not support tools\");\n }\n\n const requestParams = params.cursor === undefined ? undefined : { cursor: params.cursor };\n return (await messageLayer.sendRequest(\"tools/list\", requestParams)) as {\n tools: Tool[];\n nextCursor?: string;\n };\n }\n\n async callTool(params: CallToolParams, options: CallToolOptions = {}): Promise<CallToolResult> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.tools === undefined) {\n throw new Error(\"Server does not support tools\");\n }\n\n const requestParams =\n options.progressToken === undefined\n ? params\n : {\n ...params,\n _meta: {\n progressToken: options.progressToken,\n },\n };\n\n let requestId: RequestId | undefined;\n const requestPromise = messageLayer.sendRequest(\"tools/call\", requestParams, {\n onRequestId: (nextRequestId) => {\n requestId = nextRequestId;\n },\n }) as Promise<CallToolResult>;\n if (options.signal === undefined) {\n return await requestPromise;\n }\n const signal = options.signal;\n\n let abortListener: (() => void) | undefined;\n const abortPromise = new Promise<CallToolResult>((_, reject) => {\n const rejectWithAbortReason = () => {\n if (requestId !== undefined) {\n messageLayer.sendNotification(\"notifications/cancelled\", { requestId });\n }\n reject(signal.reason);\n };\n\n abortListener = rejectWithAbortReason;\n signal.addEventListener(\"abort\", abortListener, { once: true });\n if (signal.aborted) {\n signal.removeEventListener(\"abort\", abortListener);\n rejectWithAbortReason();\n }\n });\n\n try {\n return (await Promise.race([requestPromise, abortPromise])) as CallToolResult;\n } finally {\n if (abortListener !== undefined) {\n signal.removeEventListener(\"abort\", abortListener);\n }\n }\n }\n\n async listResources(\n params: PaginatedParams = {}\n ): Promise<{ resources: Resource[]; nextCursor?: string }> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.resources === undefined) {\n throw new Error(\"Server does not support resources\");\n }\n\n const requestParams = params.cursor === undefined ? undefined : { cursor: params.cursor };\n return (await messageLayer.sendRequest(\"resources/list\", requestParams)) as {\n resources: Resource[];\n nextCursor?: string;\n };\n }\n\n async listResourceTemplates(\n params: PaginatedParams = {}\n ): Promise<{ resourceTemplates: ResourceTemplate[]; nextCursor?: string }> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.resources === undefined) {\n throw new Error(\"Server does not support resources\");\n }\n\n const requestParams = params.cursor === undefined ? undefined : { cursor: params.cursor };\n return (await messageLayer.sendRequest(\"resources/templates/list\", requestParams)) as {\n resourceTemplates: ResourceTemplate[];\n nextCursor?: string;\n };\n }\n\n async readResource(params: ReadResourceParams): Promise<{ contents: ResourceContents[] }> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.resources === undefined) {\n throw new Error(\"Server does not support resources\");\n }\n\n return (await messageLayer.sendRequest(\"resources/read\", params)) as {\n contents: ResourceContents[];\n };\n }\n\n async subscribe(uri: string): Promise<void> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.resources?.subscribe !== true) {\n throw new Error(\"Server does not support resource subscriptions\");\n }\n\n await messageLayer.sendRequest(\"resources/subscribe\", { uri });\n }\n\n async unsubscribe(uri: string): Promise<void> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.resources?.subscribe !== true) {\n throw new Error(\"Server does not support resource subscriptions\");\n }\n\n await messageLayer.sendRequest(\"resources/unsubscribe\", { uri });\n }\n\n async listPrompts(params: PaginatedParams = {}): Promise<{ prompts: Prompt[]; nextCursor?: string }> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.prompts === undefined) {\n throw new Error(\"Server does not support prompts\");\n }\n\n const requestParams = params.cursor === undefined ? undefined : { cursor: params.cursor };\n return (await messageLayer.sendRequest(\"prompts/list\", requestParams)) as {\n prompts: Prompt[];\n nextCursor?: string;\n };\n }\n\n async getPrompt(params: GetPromptParams): Promise<GetPromptResult> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.prompts === undefined) {\n throw new Error(\"Server does not support prompts\");\n }\n\n return (await messageLayer.sendRequest(\"prompts/get\", params)) as GetPromptResult;\n }\n\n async complete(params: CompleteParams): Promise<CompleteResult> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.completions === undefined) {\n throw new Error(\"Server does not support completions\");\n }\n\n return (await messageLayer.sendRequest(\"completion/complete\", params)) as CompleteResult;\n }\n\n async setLogLevel(level: LogLevel): Promise<void> {\n const messageLayer = this.getMessageLayerOrThrow();\n const serverCapabilities = this.getServerCapabilitiesOrThrow();\n if (serverCapabilities.logging === undefined) {\n throw new Error(\"Server does not support logging\");\n }\n\n await messageLayer.sendRequest(\"logging/setLevel\", { level });\n }\n\n async cancel(requestId: RequestId, reason?: string): Promise<void> {\n const messageLayer = this.getMessageLayerOrThrow();\n const params: { requestId: RequestId; reason?: string } = { requestId };\n\n if (reason !== undefined) {\n params.reason = reason;\n }\n\n messageLayer.sendNotification(\"notifications/cancelled\", params);\n }\n\n async sendRootsChanged(): Promise<void> {\n const messageLayer = this.getMessageLayerOrThrow();\n messageLayer.sendNotification(\"notifications/roots/list_changed\");\n }\n\n async ping(): Promise<void> {\n const messageLayer = this.getMessageLayerOrThrow();\n await messageLayer.sendRequest(\"ping\");\n }\n\n async close(): Promise<void> {\n if (this.currentState === \"closed\") {\n return;\n }\n\n const closeError = new Error(\"MCP client closed\");\n this.messageLayer?.dispose(closeError);\n this.transport?.dispose(closeError);\n this.messageLayer = null;\n this.transport = null;\n this.currentState = \"closed\";\n }\n}\n\nexport interface Tool {\n name: string;\n description?: string;\n inputSchema: Record<string, unknown>;\n annotations?: ToolAnnotations;\n}\n\nexport interface ToolAnnotations {\n title?: string;\n readOnlyHint?: boolean;\n destructiveHint?: boolean;\n idempotentHint?: boolean;\n openWorldHint?: boolean;\n}\n\nexport interface CallToolParams {\n name: string;\n arguments?: Record<string, unknown>;\n}\n\nexport interface CallToolOptions {\n signal?: AbortSignal;\n progressToken?: ProgressToken;\n}\n\nexport interface ReadResourceParams {\n uri: string;\n}\n\nexport interface Resource {\n uri: string;\n name: string;\n description?: string;\n mimeType?: string;\n size?: number;\n}\n\nexport interface ResourceTemplate {\n uriTemplate: string;\n name: string;\n description?: string;\n mimeType?: string;\n}\n\nexport interface PaginatedParams {\n cursor?: string;\n}\n\nexport interface PaginatedResult {\n nextCursor?: string;\n}\n\nexport interface TextResourceContents {\n uri: string;\n mimeType?: string;\n text: string;\n}\n\nexport interface BlobResourceContents {\n uri: string;\n mimeType?: string;\n blob: string;\n}\n\nexport type ResourceContents = TextResourceContents | BlobResourceContents;\n\nexport interface TextContent {\n type: \"text\";\n text: string;\n}\n\nexport interface ImageContent {\n type: \"image\";\n data: string;\n mimeType: string;\n}\n\nexport interface AudioContent {\n type: \"audio\";\n data: string;\n mimeType: string;\n}\n\nexport interface EmbeddedResource {\n type: \"resource\";\n resource: ResourceContents;\n}\n\nexport type ContentItem = TextContent | ImageContent | AudioContent | EmbeddedResource;\n\nexport interface Prompt {\n name: string;\n description?: string;\n arguments?: PromptArgument[];\n}\n\nexport interface PromptArgument {\n name: string;\n description?: string;\n required?: boolean;\n}\n\nexport interface PromptMessage {\n role: \"user\" | \"assistant\";\n content: ContentItem;\n}\n\nexport interface GetPromptResult {\n description?: string;\n messages: PromptMessage[];\n}\n\nexport interface GetPromptParams {\n name: string;\n arguments?: Record<string, string>;\n}\n\nexport interface CallToolResult {\n content: ContentItem[];\n isError?: boolean;\n}\n\nexport interface Root {\n uri: string;\n name?: string;\n}\n\nexport type LogLevel =\n | \"debug\"\n | \"info\"\n | \"notice\"\n | \"warning\"\n | \"error\"\n | \"critical\"\n | \"alert\"\n | \"emergency\";\n\nexport interface LogMessage {\n level: LogLevel;\n logger?: string;\n data: unknown;\n}\n\nexport type ProgressToken = RequestId;\n\nexport interface ProgressParams {\n progressToken: ProgressToken;\n progress: number;\n total?: number;\n message?: string;\n}\n\nexport interface ModelHint {\n name?: string;\n}\n\nexport interface ModelPreferences {\n hints?: ModelHint[];\n costPriority?: number;\n speedPriority?: number;\n intelligencePriority?: number;\n}\n\nexport interface SamplingMessage {\n role: \"user\" | \"assistant\";\n content: ContentItem | ContentItem[];\n}\n\nexport type IncludeContext = \"none\" | \"thisServer\" | \"allServers\";\n\nexport interface CreateMessageParams {\n messages: SamplingMessage[];\n modelPreferences?: ModelPreferences;\n systemPrompt?: string;\n includeContext?: IncludeContext;\n temperature?: number;\n maxTokens: number;\n stopSequences?: string[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface CreateMessageResult {\n model: string;\n content: ContentItem | ContentItem[];\n role: \"user\" | \"assistant\";\n stopReason: string;\n}\n\nexport interface PromptReference {\n type: \"ref/prompt\";\n name: string;\n}\n\nexport interface ResourceReference {\n type: \"ref/resource\";\n uri: string;\n}\n\nexport interface CompleteArgument {\n name: string;\n value: string;\n}\n\nexport interface CompleteParams {\n ref: PromptReference | ResourceReference;\n argument: CompleteArgument;\n}\n\nexport interface Completion {\n values: string[];\n hasMore?: boolean;\n total?: number;\n}\n\nexport interface CompleteResult {\n completion: Completion;\n}\n\nexport const ERROR_PARSE = -32700;\nexport const ERROR_INVALID_REQUEST = -32600;\nexport const ERROR_METHOD_NOT_FOUND = -32601;\nexport const ERROR_INVALID_PARAMS = -32602;\nexport const ERROR_INTERNAL = -32603;\n\nexport interface McpTransportClosedEvent {\n reason: Error;\n code?: number;\n signal?: NodeJS.Signals;\n}\n\nexport interface McpTransport {\n readable: Readable;\n writable: Writable;\n closed: Promise<McpTransportClosedEvent>;\n dispose(reason?: Error): void;\n}\n\nexport interface InMemoryServerTransport {\n readable: Readable;\n writable: Writable;\n}\n\nexport interface InMemoryTransportPair {\n clientTransport: McpTransport;\n serverTransport: InMemoryServerTransport;\n}\n\nexport function createInMemoryTransportPair(): InMemoryTransportPair {\n const clientToServer = new PassThrough();\n const serverToClient = new PassThrough();\n let disposed = false;\n let resolveClosed:\n | ((closedEvent: McpTransportClosedEvent) => void)\n | undefined;\n\n const closed = new Promise<McpTransportClosedEvent>((resolve) => {\n resolveClosed = resolve;\n });\n\n const resolveClosedOnce = (reason: Error): void => {\n if (resolveClosed === undefined) {\n return;\n }\n\n const currentResolve = resolveClosed;\n resolveClosed = undefined;\n currentResolve({ reason });\n };\n\n const dispose = (reason = new Error(\"In-memory transport disposed\")): void => {\n if (disposed) {\n return;\n }\n\n disposed = true;\n\n if (!clientToServer.destroyed && !clientToServer.writableEnded) {\n clientToServer.end();\n }\n\n if (!serverToClient.destroyed && !serverToClient.writableEnded) {\n serverToClient.end();\n }\n\n resolveClosedOnce(reason);\n };\n\n clientToServer.once(\"error\", (error) => {\n dispose(error instanceof Error ? error : new Error(String(error)));\n });\n serverToClient.once(\"error\", (error) => {\n dispose(error instanceof Error ? error : new Error(String(error)));\n });\n\n return {\n clientTransport: {\n readable: serverToClient,\n writable: clientToServer,\n closed,\n dispose,\n },\n serverTransport: {\n readable: clientToServer,\n writable: serverToClient,\n },\n };\n}\n\ninterface SdkTransportAdapterInput {\n onclose?: () => void;\n onerror?: (error: Error) => void;\n onmessage?: (message: SdkJsonRpcMessage, extra?: any) => void;\n start(): Promise<void>;\n close(): Promise<void>;\n send(message: SdkJsonRpcMessage): Promise<void>;\n}\n\nexport interface McpClientConnection {\n connect(transport: McpTransport): Promise<void>;\n close(): Promise<void>;\n}\n\ninterface SdkServerConnection {\n connect(transport: unknown): Promise<void>;\n}\n\nexport interface SdkTestPair<TClient extends McpClientConnection> {\n client: TClient;\n cleanup: () => Promise<void>;\n}\n\nexport class SdkTransportAdapter implements McpTransport {\n readonly readable: Readable;\n readonly writable: Writable;\n readonly closed: Promise<McpTransportClosedEvent>;\n private readonly sdkTransport: SdkTransportAdapterInput;\n private readonly readStream = new PassThrough();\n private readonly writeStream = new PassThrough();\n private resolveClosed:\n | ((closedEvent: McpTransportClosedEvent) => void)\n | undefined;\n private disposed = false;\n\n constructor(sdkTransport: SdkTransportAdapterInput) {\n this.sdkTransport = sdkTransport;\n this.readable = this.readStream;\n this.writable = this.writeStream;\n this.closed = new Promise((resolve) => {\n this.resolveClosed = resolve;\n });\n\n this.sdkTransport.onmessage = (message) => {\n this.readStream.write(serializeJsonRpcMessage(message as JsonRpcMessage));\n };\n this.sdkTransport.onclose = () => {\n this.dispose(new Error(\"SDK transport closed\"));\n };\n this.sdkTransport.onerror = (error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n };\n\n this.readStream.once(\"error\", (error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n this.writeStream.once(\"error\", (error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n\n this.consumeWrittenLines().catch((error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n this.sdkTransport.start().catch((error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n }\n\n dispose(reason = new Error(\"SDK transport adapter disposed\")): void {\n if (this.disposed) {\n return;\n }\n\n this.disposed = true;\n\n if (!this.writeStream.destroyed && !this.writeStream.writableEnded) {\n this.writeStream.end();\n }\n\n if (!this.readStream.destroyed && !this.readStream.writableEnded) {\n this.readStream.end();\n }\n\n if (this.resolveClosed !== undefined) {\n const resolveClosed = this.resolveClosed;\n this.resolveClosed = undefined;\n resolveClosed({ reason });\n }\n\n this.sdkTransport.close().catch(() => undefined);\n }\n\n private async consumeWrittenLines(): Promise<void> {\n for await (const line of readLines(this.writeStream)) {\n if (this.disposed || line.length === 0) {\n continue;\n }\n\n let parsedMessage: unknown;\n try {\n parsedMessage = JSON.parse(line);\n } catch {\n throw new Error(`Malformed JSON line: ${line}`);\n }\n\n if (typeof parsedMessage !== \"object\" || parsedMessage === null || Array.isArray(parsedMessage)) {\n throw new Error(`Malformed JSON line: ${line}`);\n }\n\n await this.sdkTransport.send(parsedMessage as SdkJsonRpcMessage);\n }\n }\n}\n\nexport async function createSdkTestPair<TClient extends McpClientConnection>(\n server: SdkServerConnection,\n createClient: () => TClient\n): Promise<SdkTestPair<TClient>> {\n const { InMemoryTransport } = await import(\"@modelcontextprotocol/sdk/inMemory.js\");\n const [clientSdkTransport, serverSdkTransport] = InMemoryTransport.createLinkedPair();\n const clientTransport = new SdkTransportAdapter(clientSdkTransport);\n const serverPromise = server.connect(serverSdkTransport);\n const client = createClient();\n\n try {\n await client.connect(clientTransport);\n } catch (error) {\n clientTransport.dispose(new Error(\"SDK test pair setup failed\"));\n await clientSdkTransport.close();\n await serverSdkTransport.close();\n await serverPromise;\n throw error;\n }\n\n const cleanup = async (): Promise<void> => {\n await client.close();\n clientTransport.dispose(new Error(\"SDK test pair cleanup\"));\n await clientSdkTransport.close();\n await serverSdkTransport.close();\n await serverPromise;\n };\n\n return { client, cleanup };\n}\n\nexport async function createMockEchoToolServer(): Promise<SdkServerConnection> {\n const [{ Server }, { CallToolRequestSchema, ListToolsRequestSchema }] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-echo-tool-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const echoTool = {\n name: \"echo\",\n description: \"Echoes the provided message.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n message: {\n type: \"string\",\n },\n },\n required: [\"message\"],\n },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [echoTool],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name !== \"echo\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n\n const message = request.params.arguments?.message;\n if (typeof message !== \"string\") {\n throw new Error(\"Echo tool requires a string message argument\");\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: message,\n },\n ],\n };\n });\n\n return server;\n}\n\nexport async function createMockMultiToolServer(): Promise<SdkServerConnection> {\n const [{ Server }, { CallToolRequestSchema, ListToolsRequestSchema }] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-multi-tool-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const tools = [\n {\n name: \"add\",\n description: \"Adds two numbers and returns the sum as text.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n a: { type: \"number\" },\n b: { type: \"number\" },\n },\n required: [\"a\", \"b\"],\n },\n },\n {\n name: \"greet\",\n description: \"Greets a user with optional formal tone.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n name: { type: \"string\" },\n formal: { type: \"boolean\" },\n },\n required: [\"name\"],\n },\n },\n {\n name: \"fail\",\n description: \"Returns an intentional tool error payload.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n },\n },\n ];\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name === \"add\") {\n const a = request.params.arguments?.a;\n const b = request.params.arguments?.b;\n\n if (typeof a !== \"number\" || typeof b !== \"number\") {\n throw new Error(\"Add tool requires numeric a and b arguments\");\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: String(a + b),\n },\n ],\n };\n }\n\n if (request.params.name === \"greet\") {\n const name = request.params.arguments?.name;\n const formal = request.params.arguments?.formal;\n\n if (typeof name !== \"string\") {\n throw new Error(\"Greet tool requires a string name argument\");\n }\n if (formal !== undefined && typeof formal !== \"boolean\") {\n throw new Error(\"Greet tool formal argument must be boolean when provided\");\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: formal ? `Good day, ${name}.` : `Hello, ${name}!`,\n },\n ],\n };\n }\n\n if (request.params.name === \"fail\") {\n return {\n isError: true,\n content: [\n {\n type: \"text\" as const,\n text: \"Intentional tool failure.\",\n },\n ],\n };\n }\n\n throw new Error(`Unknown tool: ${request.params.name}`);\n });\n\n return server;\n}\n\nexport async function createMockPaginatedToolsServer(): Promise<SdkServerConnection> {\n const [{ Server }, { ListToolsRequestSchema }] = await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-paginated-tools-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const pageSize = 5;\n const tools = Array.from({ length: 20 }, (_, index) => ({\n name: `tool-${index + 1}`,\n description: `Mock paginated tool ${index + 1}.`,\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n },\n }));\n\n server.setRequestHandler(ListToolsRequestSchema, async (request) => {\n const cursor = request.params?.cursor;\n const startIndex = cursor === undefined ? 0 : Number(cursor);\n\n if (\n !Number.isInteger(startIndex) ||\n startIndex < 0 ||\n startIndex > tools.length ||\n startIndex % pageSize !== 0\n ) {\n throw new Error(`Invalid cursor: ${String(cursor)}`);\n }\n\n const pageTools = tools.slice(startIndex, startIndex + pageSize);\n const nextIndex = startIndex + pageSize;\n if (nextIndex >= tools.length) {\n return { tools: pageTools };\n }\n\n return {\n tools: pageTools,\n nextCursor: String(nextIndex),\n };\n });\n\n return server;\n}\n\nexport async function createMockResourceServer(): Promise<SdkServerConnection> {\n const [\n { Server },\n {\n ListResourcesRequestSchema,\n ListResourceTemplatesRequestSchema,\n ReadResourceRequestSchema,\n },\n ] = await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-resource-server\", version: \"1.0.0\" },\n { capabilities: { resources: {} } }\n );\n const resources = [\n {\n uri: \"file:///readme.txt\",\n name: \"readme.txt\",\n mimeType: \"text/plain\",\n },\n {\n uri: \"file:///image.png\",\n name: \"image.png\",\n mimeType: \"image/png\",\n },\n ];\n const resourceContentsByUri = new Map<string, ResourceContents>([\n [\n \"file:///readme.txt\",\n {\n uri: \"file:///readme.txt\",\n mimeType: \"text/plain\",\n text: \"This is a mock README resource.\",\n },\n ],\n [\n \"file:///image.png\",\n {\n uri: \"file:///image.png\",\n mimeType: \"image/png\",\n blob: \"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8Xw8AAoMBgL9qj3QAAAAASUVORK5CYII=\",\n },\n ],\n ]);\n const resourceTemplates = [\n {\n uriTemplate: \"file:///{path}\",\n name: \"file-template\",\n },\n ];\n\n server.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources,\n }));\n\n server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const resourceContent = resourceContentsByUri.get(request.params.uri);\n if (resourceContent === undefined) {\n throw new Error(`Unknown resource: ${request.params.uri}`);\n }\n\n return {\n contents: [resourceContent],\n };\n });\n\n server.setRequestHandler(ListResourceTemplatesRequestSchema, async () => ({\n resourceTemplates,\n }));\n\n return server;\n}\n\nexport async function createMockSubscribableResourceServer(): Promise<\n SdkServerConnection & {\n triggerResourceUpdated: (uri: string, updatedText?: string) => Promise<void>;\n triggerResourceListChanged: () => Promise<void>;\n }\n> {\n const [\n { Server },\n {\n ListResourcesRequestSchema,\n ReadResourceRequestSchema,\n SubscribeRequestSchema,\n UnsubscribeRequestSchema,\n },\n ] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-subscribable-resource-server\", version: \"1.0.0\" },\n { capabilities: { resources: { subscribe: true, listChanged: true } } }\n );\n const resources = [\n {\n uri: \"file:///readme.txt\",\n name: \"readme.txt\",\n mimeType: \"text/plain\",\n },\n ];\n const resourceContentsByUri = new Map<string, ResourceContents>([\n [\n \"file:///readme.txt\",\n {\n uri: \"file:///readme.txt\",\n mimeType: \"text/plain\",\n text: \"Initial subscribable resource text.\",\n },\n ],\n ]);\n const subscribedUris = new Set<string>();\n\n server.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources,\n }));\n\n server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const resourceContent = resourceContentsByUri.get(request.params.uri);\n if (resourceContent === undefined) {\n throw new Error(`Unknown resource: ${request.params.uri}`);\n }\n\n return {\n contents: [resourceContent],\n };\n });\n\n server.setRequestHandler(SubscribeRequestSchema, async (request) => {\n subscribedUris.add(request.params.uri);\n return {};\n });\n\n server.setRequestHandler(UnsubscribeRequestSchema, async (request) => {\n subscribedUris.delete(request.params.uri);\n return {};\n });\n\n return Object.assign(server, {\n triggerResourceUpdated: async (uri: string, updatedText?: string): Promise<void> => {\n if (updatedText !== undefined) {\n const existingContent = resourceContentsByUri.get(uri);\n if (existingContent === undefined || \"blob\" in existingContent) {\n throw new Error(`Unknown text resource: ${uri}`);\n }\n\n resourceContentsByUri.set(uri, {\n uri,\n mimeType: existingContent.mimeType,\n text: updatedText,\n });\n }\n\n if (!subscribedUris.has(uri)) {\n return;\n }\n\n await server.sendResourceUpdated({ uri });\n },\n triggerResourceListChanged: async (): Promise<void> => {\n await server.sendResourceListChanged();\n },\n });\n}\n\nexport async function createMockPromptServer(): Promise<SdkServerConnection> {\n const [\n { Server },\n { ErrorCode, GetPromptRequestSchema, ListPromptsRequestSchema, McpError: SdkMcpError },\n ] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-prompt-server\", version: \"1.0.0\" },\n { capabilities: { prompts: {} } }\n );\n const promptTemplates = [\n {\n prompt: {\n name: \"code_review\",\n description: \"Review code for correctness and maintainability.\",\n arguments: [\n {\n name: \"code\",\n description: \"Code to review.\",\n required: true,\n },\n ],\n },\n messages: [\n {\n role: \"user\" as const,\n textTemplate: \"Please review the following code:\\n{{code}}\",\n },\n {\n role: \"assistant\" as const,\n textTemplate: \"I will review the code for potential issues and improvements.\",\n },\n ],\n },\n {\n prompt: {\n name: \"summarize\",\n description: \"Summarize the provided text.\",\n },\n messages: [\n {\n role: \"user\" as const,\n textTemplate: \"Please summarize the provided text.\",\n },\n ],\n },\n ];\n const promptsByName = new Map(promptTemplates.map((template) => [template.prompt.name, template]));\n\n const renderPromptMessage = (\n textTemplate: string,\n argumentsMap: Record<string, unknown> | undefined\n ): string => {\n if (argumentsMap === undefined) {\n return textTemplate;\n }\n\n let renderedText = textTemplate;\n for (const [name, value] of Object.entries(argumentsMap)) {\n if (typeof value !== \"string\") {\n continue;\n }\n\n renderedText = renderedText.split(`{{${name}}}`).join(value);\n }\n\n return renderedText;\n };\n\n server.setRequestHandler(ListPromptsRequestSchema, async () => ({\n prompts: promptTemplates.map((template) => template.prompt),\n }));\n\n server.setRequestHandler(GetPromptRequestSchema, async (request) => {\n const template = promptsByName.get(request.params.name);\n if (template === undefined) {\n throw new SdkMcpError(ErrorCode.InvalidParams, `Unknown prompt: ${request.params.name}`);\n }\n\n const requestArguments = request.params.arguments;\n for (const argument of template.prompt.arguments ?? []) {\n if (!argument.required) {\n continue;\n }\n\n const value = requestArguments?.[argument.name];\n if (typeof value !== \"string\") {\n throw new SdkMcpError(\n ErrorCode.InvalidParams,\n `Missing required prompt argument: ${argument.name}`\n );\n }\n }\n\n return {\n description: template.prompt.description,\n messages: template.messages.map((message) => ({\n role: message.role,\n content: {\n type: \"text\" as const,\n text: renderPromptMessage(message.textTemplate, requestArguments),\n },\n })),\n };\n });\n\n return server;\n}\n\nexport async function createMockCompletionServer(): Promise<SdkServerConnection> {\n const [{ Server }, { CompleteRequestSchema }] = await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-completion-server\", version: \"1.0.0\" },\n { capabilities: { completions: {} } }\n );\n const promptArgumentCompletions = new Map<string, string[]>([\n [\"code_review:language\", [\"python\", \"pydantic\", \"pytest\", \"pytorch\", \"pyright\", \"rust\"]],\n ]);\n const maxValues = 3;\n\n server.setRequestHandler(CompleteRequestSchema, async (request) => {\n if (request.params.ref.type !== \"ref/prompt\") {\n return {\n completion: {\n values: [],\n },\n };\n }\n\n const completionKey = `${request.params.ref.name}:${request.params.argument.name}`;\n const candidates = promptArgumentCompletions.get(completionKey) ?? [];\n const partialValue = request.params.argument.value.toLowerCase();\n const matchingValues = candidates.filter((candidate) =>\n candidate.toLowerCase().startsWith(partialValue)\n );\n const values = matchingValues.slice(0, maxValues);\n\n if (values.length < matchingValues.length) {\n return {\n completion: {\n values,\n hasMore: true,\n total: matchingValues.length,\n },\n };\n }\n\n return {\n completion: {\n values,\n },\n };\n });\n\n return server;\n}\n\nexport async function createMockProgressServer(): Promise<SdkServerConnection> {\n const [{ Server }, { CallToolRequestSchema, ListToolsRequestSchema }] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-progress-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const totalSteps = 4;\n const tool = {\n name: \"slow_task\",\n description: \"Runs a simulated slow task and streams progress updates.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [tool],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request, extra) => {\n if (request.params.name !== \"slow_task\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n\n const progressToken = request.params._meta?.progressToken;\n if (progressToken !== undefined) {\n for (let step = 1; step <= totalSteps; step += 1) {\n await extra.sendNotification({\n method: \"notifications/progress\",\n params: {\n progressToken,\n progress: step,\n total: totalSteps,\n message: `Completed step ${step} of ${totalSteps}`,\n },\n });\n\n await new Promise<void>((resolve) => {\n setTimeout(resolve, 5);\n });\n }\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"slow_task complete\",\n },\n ],\n };\n });\n\n return server;\n}\n\nexport interface MockSlowToolServerOptions {\n delayMs?: number;\n pollIntervalMs?: number;\n}\n\nexport async function createMockSlowToolServer(\n options: MockSlowToolServerOptions = {}\n): Promise<\n SdkServerConnection & {\n wasStarted: () => boolean;\n getStartedRequestIds: () => RequestId[];\n wasCancelled: () => boolean;\n getCancelledRequestIds: () => RequestId[];\n }\n> {\n const [{ Server }, { CallToolRequestSchema, ListToolsRequestSchema }] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const defaultDelayMs = options.delayMs ?? 1_000;\n const pollIntervalMs = options.pollIntervalMs ?? 10;\n if (!Number.isFinite(defaultDelayMs) || defaultDelayMs < 0) {\n throw new Error(\"createMockSlowToolServer delayMs must be a finite non-negative number\");\n }\n if (!Number.isFinite(pollIntervalMs) || pollIntervalMs <= 0) {\n throw new Error(\"createMockSlowToolServer pollIntervalMs must be a finite positive number\");\n }\n\n const server = new Server(\n { name: \"mock-slow-tool-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const startedRequestIds = new Set<RequestId>();\n const cancelledRequestIds = new Set<RequestId>();\n const tool = {\n name: \"slow\",\n description: \"Delays the response and supports cancellation.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n delayMs: {\n type: \"number\",\n },\n },\n additionalProperties: false,\n },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [tool],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request, extra) => {\n if (request.params.name !== \"slow\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n startedRequestIds.add(extra.requestId);\n\n const delayArgument = request.params.arguments?.delayMs;\n const delayMs =\n delayArgument === undefined\n ? defaultDelayMs\n : typeof delayArgument === \"number\" && Number.isFinite(delayArgument) && delayArgument >= 0\n ? delayArgument\n : NaN;\n if (!Number.isFinite(delayMs)) {\n throw new Error(\"slow tool delayMs argument must be a finite non-negative number\");\n }\n\n const startedAt = Date.now();\n while (Date.now() - startedAt < delayMs) {\n if (extra.signal.aborted) {\n cancelledRequestIds.add(extra.requestId);\n throw new Error(\"slow tool cancelled\");\n }\n\n const elapsedMs = Date.now() - startedAt;\n const remainingMs = delayMs - elapsedMs;\n await new Promise<void>((resolve) => {\n setTimeout(resolve, Math.max(0, Math.min(pollIntervalMs, remainingMs)));\n });\n }\n\n if (extra.signal.aborted) {\n cancelledRequestIds.add(extra.requestId);\n throw new Error(\"slow tool cancelled\");\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `slow complete after ${delayMs}ms`,\n },\n ],\n };\n });\n\n return Object.assign(server, {\n wasStarted: (): boolean => startedRequestIds.size > 0,\n getStartedRequestIds: (): RequestId[] => Array.from(startedRequestIds),\n wasCancelled: (): boolean => cancelledRequestIds.size > 0,\n getCancelledRequestIds: (): RequestId[] => Array.from(cancelledRequestIds),\n });\n}\n\nexport async function createMockErrorServer(): Promise<SdkServerConnection> {\n const [\n { Server },\n { CallToolRequestSchema, ErrorCode, ListToolsRequestSchema, McpError: SdkMcpError },\n ] = await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-error-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const tools = [\n {\n name: \"invalid_params\",\n description: \"Returns a JSON-RPC Invalid Params error.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n },\n {\n name: \"is_error\",\n description: \"Returns a tools/call result with isError: true.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n },\n {\n name: \"internal_error\",\n description: \"Throws an internal server error.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n },\n ];\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools,\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name === \"invalid_params\") {\n throw new SdkMcpError(\n ErrorCode.InvalidParams,\n \"Intentional invalid params error from mock-error-server.\"\n );\n }\n\n if (request.params.name === \"is_error\") {\n return {\n isError: true,\n content: [\n {\n type: \"text\" as const,\n text: \"Intentional isError tool failure.\",\n },\n ],\n };\n }\n\n if (request.params.name === \"internal_error\") {\n throw new Error(\"Intentional internal error from mock-error-server.\");\n }\n\n throw new Error(`Unknown tool: ${request.params.name}`);\n });\n\n return server;\n}\n\nexport async function createMockSamplingServer(): Promise<SdkServerConnection> {\n const [{ Server }, { CallToolRequestSchema, ListToolsRequestSchema }] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-sampling-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const tool = {\n name: \"sample_message\",\n description: \"Requests sampling/createMessage from the client and returns the sampled text.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n topic: {\n type: \"string\",\n },\n },\n required: [\"topic\"],\n additionalProperties: false,\n },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [tool],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name !== \"sample_message\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n\n const topic = request.params.arguments?.topic;\n if (typeof topic !== \"string\") {\n throw new Error(\"sample_message requires a string topic argument\");\n }\n\n const samplingResult = await server.createMessage({\n messages: [\n {\n role: \"user\",\n content: {\n type: \"text\",\n text: `Provide a concise sentence about ${topic}.`,\n },\n },\n ],\n maxTokens: 64,\n modelPreferences: {\n hints: [{ name: \"mock-sampling-model\" }],\n speedPriority: 0.2,\n intelligencePriority: 0.9,\n },\n systemPrompt: \"Return exactly one concise sentence.\",\n });\n\n const sampledText =\n samplingResult.content.type === \"text\"\n ? samplingResult.content.text\n : JSON.stringify(samplingResult.content);\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Sampled response: ${sampledText}`,\n },\n ],\n };\n });\n\n return server;\n}\n\nexport async function createMockRootsServer(): Promise<SdkServerConnection> {\n const [\n { Server },\n {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n RootsListChangedNotificationSchema,\n },\n ] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-roots-server\", version: \"1.0.0\" },\n { capabilities: { tools: {} } }\n );\n const tool = {\n name: \"roots_summary\",\n description: \"Requests roots/list from the client and returns a summary of roots.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [tool],\n }));\n\n server.setNotificationHandler(RootsListChangedNotificationSchema, async () => {\n await server.listRoots();\n });\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name !== \"roots_summary\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n\n const rootsResult = await server.listRoots();\n const rootSummary = rootsResult.roots\n .map((root) => (root.name === undefined ? root.uri : `${root.name} (${root.uri})`))\n .join(\", \");\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: rootSummary.length === 0 ? \"Roots: none\" : `Roots: ${rootSummary}`,\n },\n ],\n };\n });\n\n return server;\n}\n\nexport async function createMockLoggingServer(): Promise<SdkServerConnection> {\n const [{ Server }, { CallToolRequestSchema, ListToolsRequestSchema }] =\n await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-logging-server\", version: \"1.0.0\" },\n { capabilities: { tools: {}, logging: {} } }\n );\n const tool = {\n name: \"emit_logs\",\n description: \"Emits mock log messages at multiple levels.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n };\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [tool],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name !== \"emit_logs\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n\n await server.sendLoggingMessage({\n level: \"debug\",\n logger: \"mock-logging-server\",\n data: { message: \"Debug message\" },\n });\n await server.sendLoggingMessage({\n level: \"info\",\n logger: \"mock-logging-server\",\n data: { message: \"Info message\" },\n });\n await server.sendLoggingMessage({\n level: \"error\",\n logger: \"mock-logging-server\",\n data: { message: \"Error message\" },\n });\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"Emitted log messages.\",\n },\n ],\n };\n });\n\n return server;\n}\n\nexport async function createMockFullFeaturedServer(): Promise<SdkServerConnection> {\n const [\n { Server },\n {\n CallToolRequestSchema,\n CompleteRequestSchema,\n GetPromptRequestSchema,\n ListPromptsRequestSchema,\n ListResourcesRequestSchema,\n ListToolsRequestSchema,\n ReadResourceRequestSchema,\n },\n ] = await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/index.js\"),\n import(\"@modelcontextprotocol/sdk/types.js\"),\n ]);\n\n const server = new Server(\n { name: \"mock-full-featured-server\", version: \"1.0.0\" },\n {\n capabilities: {\n tools: {},\n resources: {},\n prompts: {},\n logging: {},\n completions: {},\n },\n }\n );\n const tool = {\n name: \"full_featured_ping\",\n description: \"Returns a text response and emits an info log.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {},\n additionalProperties: false,\n },\n };\n const resources = [\n {\n uri: \"file:///full-featured.txt\",\n name: \"full-featured.txt\",\n mimeType: \"text/plain\",\n },\n ];\n const prompts = [\n {\n name: \"full_featured_prompt\",\n description: \"Returns a short prompt message for a topic.\",\n arguments: [\n {\n name: \"topic\",\n description: \"Topic to include in the prompt output.\",\n required: false,\n },\n ],\n },\n ];\n const completionValues = [\"alpha\", \"beta\", \"gamma\"];\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [tool],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name !== \"full_featured_ping\") {\n throw new Error(`Unknown tool: ${request.params.name}`);\n }\n\n await server.sendLoggingMessage({\n level: \"info\",\n logger: \"mock-full-featured-server\",\n data: {\n message: \"full_featured_ping called\",\n },\n });\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"full_featured_ping ok\",\n },\n ],\n };\n });\n\n server.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources,\n }));\n\n server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n if (request.params.uri !== \"file:///full-featured.txt\") {\n throw new Error(`Unknown resource: ${request.params.uri}`);\n }\n\n return {\n contents: [\n {\n uri: \"file:///full-featured.txt\",\n mimeType: \"text/plain\",\n text: \"Mock full-featured resource\",\n },\n ],\n };\n });\n\n server.setRequestHandler(ListPromptsRequestSchema, async () => ({\n prompts,\n }));\n\n server.setRequestHandler(GetPromptRequestSchema, async (request) => {\n if (request.params.name !== \"full_featured_prompt\") {\n throw new Error(`Unknown prompt: ${request.params.name}`);\n }\n\n const topic = request.params.arguments?.topic;\n const topicText = typeof topic === \"string\" && topic.length > 0 ? topic : \"general\";\n\n return {\n description: \"Mock prompt from full-featured server.\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: `Provide a short summary for ${topicText}.`,\n },\n },\n ],\n };\n });\n\n server.setRequestHandler(CompleteRequestSchema, async (request) => {\n if (\n request.params.ref.type !== \"ref/prompt\" ||\n request.params.ref.name !== \"full_featured_prompt\" ||\n request.params.argument.name !== \"topic\"\n ) {\n return {\n completion: {\n values: [],\n },\n };\n }\n\n const partialValue = request.params.argument.value.toLowerCase();\n const values = completionValues.filter((value) => value.startsWith(partialValue));\n\n return {\n completion: {\n values,\n },\n };\n });\n\n return server;\n}\n\nexport async function createTestPair<TClient extends McpClientConnection>(\n server: TinyStdioMcpServer,\n createClient: () => TClient\n): Promise<SdkTestPair<TClient>> {\n const { clientTransport, serverTransport } = createInMemoryTransportPair();\n const serverPromise = server.connect(serverTransport);\n const client = createClient();\n\n try {\n await client.connect(clientTransport);\n } catch (error) {\n clientTransport.dispose(new Error(\"tiny-stdio-mcp-server test pair setup failed\"));\n await serverPromise;\n throw error;\n }\n\n const cleanup = async (): Promise<void> => {\n await client.close();\n clientTransport.dispose(new Error(\"tiny-stdio-mcp-server test pair cleanup\"));\n await serverPromise;\n };\n\n return { client, cleanup };\n}\n\nexport type StdioSpawn = (\n command: string,\n args: ReadonlyArray<string>,\n options: SpawnOptions\n) => ChildProcessWithoutNullStreams;\n\nexport interface StdioTransportOptions {\n command: string;\n args?: string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n spawn?: StdioSpawn;\n}\n\nexport type HttpTransportFetch = (\n input: string | URL,\n init?: RequestInit\n) => Promise<Response>;\n\nexport interface HttpTransportOptions {\n url: string;\n headers?: HeadersInit;\n fetch?: HttpTransportFetch;\n oauth?: OAuthClientProviderOptions;\n oauthDiscoveryCache?: OAuthDiscoveryCache;\n}\n\nfunction defaultStdioSpawn(\n command: string,\n args: ReadonlyArray<string>,\n options: SpawnOptions\n): ChildProcessWithoutNullStreams {\n return spawn(command, args, options) as ChildProcessWithoutNullStreams;\n}\n\nfunction defaultHttpTransportFetch(input: string | URL, init?: RequestInit): Promise<Response> {\n return fetch(input, init);\n}\n\nexport class StdioTransport implements McpTransport {\n readonly readable: Readable;\n readonly writable: Writable;\n readonly closed: Promise<McpTransportClosedEvent>;\n private readonly child: ChildProcessWithoutNullStreams;\n private disposed = false;\n private stderrOutput = \"\";\n private static readonly STDERR_MAX_LENGTH = 65_536;\n\n constructor({\n command,\n args = [],\n cwd,\n env,\n spawn: spawnProcess = defaultStdioSpawn,\n }: StdioTransportOptions) {\n this.child = spawnProcess(command, args, {\n cwd,\n env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n const child = this.child;\n\n this.readable = child.stdout;\n this.writable = child.stdin;\n child.stderr.on(\"data\", (chunk: unknown) => {\n this.stderrOutput += chunkToString(chunk);\n if (this.stderrOutput.length > StdioTransport.STDERR_MAX_LENGTH) {\n this.stderrOutput = this.stderrOutput.slice(-StdioTransport.STDERR_MAX_LENGTH);\n }\n });\n this.closed = new Promise((resolve) => {\n let settled = false;\n const resolveClosed = (event: McpTransportClosedEvent) => {\n if (settled) {\n return;\n }\n\n settled = true;\n resolve(event);\n };\n\n child.once(\"exit\", (code, signal) => {\n const closedEvent: McpTransportClosedEvent = {\n reason: new Error(\"Stdio transport process exited\"),\n };\n\n if (code !== null) {\n closedEvent.code = code;\n }\n\n if (signal !== null) {\n closedEvent.signal = signal;\n }\n\n resolveClosed(closedEvent);\n });\n\n child.once(\"error\", (error) => {\n const closedEvent: McpTransportClosedEvent = {\n reason: error instanceof Error ? error : new Error(String(error)),\n };\n\n if (child.exitCode !== null) {\n closedEvent.code = child.exitCode;\n }\n\n if (child.signalCode !== null) {\n closedEvent.signal = child.signalCode;\n }\n\n resolveClosed(closedEvent);\n });\n });\n }\n\n getStderrOutput(): string {\n return this.stderrOutput;\n }\n\n dispose(reason = new Error(\"Stdio transport disposed\")): void {\n void reason;\n\n if (this.disposed) {\n return;\n }\n\n this.disposed = true;\n\n if (!this.child.stdin.destroyed && !this.child.stdin.writableEnded) {\n this.child.stdin.end();\n }\n\n if (this.child.exitCode === null && this.child.signalCode === null && !this.child.killed) {\n this.child.kill(\"SIGTERM\");\n }\n }\n}\n\nexport class HttpTransport implements McpTransport {\n readonly readable: Readable;\n readonly writable: Writable;\n readonly closed: Promise<McpTransportClosedEvent>;\n private readonly url: string;\n private readonly headers: HeadersInit;\n private readonly fetchImpl: HttpTransportFetch;\n private readonly readStream = new PassThrough();\n private readonly writeStream = new PassThrough();\n private resolveClosed:\n | ((closedEvent: McpTransportClosedEvent) => void)\n | undefined;\n private sessionId: string | undefined;\n private lastEventId: string | undefined;\n private getSseStreamStarted = false;\n private disposed = false;\n private readonly oauthProvider: OAuthClientProvider | undefined;\n private readonly oauthMetadataDiscovery: OAuthMetadataDiscovery | undefined;\n private readonly inFlightFetchAbortControllers = new Set<AbortController>();\n private readonly openSseReaders = new Set<ReadableStreamDefaultReader<Uint8Array>>();\n\n constructor({\n url,\n headers = {},\n fetch: fetchImpl = defaultHttpTransportFetch,\n oauth,\n oauthDiscoveryCache,\n }: HttpTransportOptions) {\n this.url = url;\n this.headers = headers;\n this.fetchImpl = fetchImpl;\n this.oauthProvider = oauth === undefined\n ? undefined\n : createOAuthClientProvider(oauth);\n this.oauthMetadataDiscovery = oauth === undefined\n ? undefined\n : new OAuthMetadataDiscovery({\n fetch: (input, init) => this.fetchWithAbort(input, init ?? {}),\n cache: oauthDiscoveryCache,\n });\n this.readable = this.readStream;\n this.writable = this.writeStream;\n this.closed = new Promise((resolve) => {\n this.resolveClosed = resolve;\n });\n\n this.readStream.once(\"error\", (error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n this.writeStream.once(\"error\", (error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n\n this.consumeWrittenLines().catch((error) => {\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n }\n\n dispose(reason = new Error(\"HTTP transport disposed\")): void {\n if (this.disposed) {\n return;\n }\n\n this.disposed = true;\n this.abortInFlightFetches();\n this.cancelOpenSseReaders();\n this.terminateSession();\n\n if (!this.writeStream.destroyed && !this.writeStream.writableEnded) {\n this.writeStream.end();\n }\n\n if (!this.readStream.destroyed && !this.readStream.writableEnded) {\n this.readStream.end();\n }\n\n const resolveClosed = this.resolveClosed;\n this.resolveClosed = undefined;\n resolveClosed?.({ reason });\n }\n\n private abortInFlightFetches(): void {\n for (const abortController of this.inFlightFetchAbortControllers) {\n abortController.abort();\n }\n\n this.inFlightFetchAbortControllers.clear();\n }\n\n private cancelOpenSseReaders(): void {\n for (const reader of this.openSseReaders) {\n void reader.cancel().catch(() => undefined);\n }\n\n this.openSseReaders.clear();\n }\n\n private async fetchWithAbort(input: string | URL, init: RequestInit): Promise<Response> {\n const abortController = new AbortController();\n this.inFlightFetchAbortControllers.add(abortController);\n\n try {\n return await this.fetchImpl(input, {\n ...init,\n signal: abortController.signal,\n });\n } finally {\n this.inFlightFetchAbortControllers.delete(abortController);\n }\n }\n\n private async consumeWrittenLines(): Promise<void> {\n for await (const line of readLines(this.writeStream)) {\n if (this.disposed || line.length === 0) {\n continue;\n }\n\n const hasSessionId = this.sessionId !== undefined;\n const response = await this.fetchWithOAuthRetry({\n method: \"POST\",\n createHeaders: () => this.createPostHeaders(),\n body: line,\n });\n\n if (hasSessionId && response.status === 404) {\n this.sessionId = undefined;\n this.dispose(new Error(\"HTTP transport session expired (404 response)\"));\n return;\n }\n\n await this.throwForPostHttpError(response);\n this.captureSessionId(response);\n this.maybeOpenGetSseStream();\n await this.forwardResponseMessages(response);\n }\n }\n\n private async createPostHeaders(): Promise<Headers> {\n const headers = new Headers(this.headers);\n headers.set(\"Accept\", \"application/json, text/event-stream\");\n headers.set(\"Content-Type\", \"application/json\");\n if (this.sessionId !== undefined) {\n headers.set(\"Mcp-Session-Id\", this.sessionId);\n }\n return this.authorizeRequestHeaders(headers);\n }\n\n private async createGetHeaders(): Promise<Headers> {\n const headers = new Headers(this.headers);\n headers.set(\"Accept\", \"text/event-stream\");\n if (this.sessionId !== undefined) {\n headers.set(\"Mcp-Session-Id\", this.sessionId);\n }\n if (this.lastEventId !== undefined) {\n headers.set(\"Last-Event-ID\", this.lastEventId);\n }\n return this.authorizeRequestHeaders(headers);\n }\n\n private async createDeleteHeaders(sessionId: string): Promise<Headers> {\n const headers = new Headers(this.headers);\n headers.set(\"Mcp-Session-Id\", sessionId);\n return this.authorizeRequestHeaders(headers);\n }\n\n private async authorizeRequestHeaders(headers: Headers): Promise<Headers> {\n await this.oauthProvider?.authorizeRequest?.({\n requestUrl: new URL(this.url),\n headers,\n fetch: this.fetchImpl,\n });\n return headers;\n }\n\n private captureSessionId(response: Response): void {\n const sessionId = response.headers.get(\"Mcp-Session-Id\");\n if (sessionId === null || sessionId.length === 0) {\n return;\n }\n\n this.sessionId = sessionId;\n }\n\n private maybeOpenGetSseStream(): void {\n if (this.disposed || this.sessionId === undefined || this.getSseStreamStarted) {\n return;\n }\n\n this.getSseStreamStarted = true;\n this.consumeGetSseStream().catch((error) => {\n if (error instanceof HttpTransportGetSseNotSupportedError || this.disposed) {\n return;\n }\n\n this.dispose(error instanceof Error ? error : new Error(String(error)));\n });\n }\n\n private terminateSession(): void {\n if (this.sessionId === undefined) {\n return;\n }\n\n const sessionId = this.sessionId;\n this.sessionId = undefined;\n\n this.sendSessionTerminationRequest(sessionId).catch(() => undefined);\n }\n\n private async sendSessionTerminationRequest(sessionId: string): Promise<void> {\n const response = await this.fetchImpl(this.url, {\n method: \"DELETE\",\n headers: await this.createDeleteHeaders(sessionId),\n });\n\n if (response.status === 405) {\n return;\n }\n }\n\n private async consumeGetSseStream(): Promise<void> {\n const response = await this.fetchWithOAuthRetry({\n method: \"GET\",\n createHeaders: () => this.createGetHeaders(),\n });\n\n if (response.status === 405) {\n throw new HttpTransportGetSseNotSupportedError();\n }\n\n const contentType = response.headers.get(\"Content-Type\");\n if (contentType === null) {\n return;\n }\n\n if (contentType.toLowerCase().includes(\"text/event-stream\")) {\n await this.forwardSseResponseMessages(response);\n this.getSseStreamStarted = false;\n if (!this.disposed && this.sessionId !== undefined && this.lastEventId !== undefined) {\n this.maybeOpenGetSseStream();\n }\n }\n }\n\n private async throwForPostHttpError(response: Response): Promise<void> {\n if (response.status < 400) {\n return;\n }\n\n const responseBody = (await response.text()).trim();\n const statusDescriptor = `${response.status} ${response.statusText}`.trim();\n const message = responseBody.length === 0\n ? `HTTP transport POST failed (${statusDescriptor})`\n : `HTTP transport POST failed (${statusDescriptor}): ${responseBody}`;\n throw new Error(message);\n }\n\n private async maybeHandleUnauthorizedResponse(response: Response): Promise<boolean> {\n if (response.status !== 401 || this.oauthProvider === undefined) {\n return false;\n }\n\n const discoveryClient = this.oauthMetadataDiscovery;\n if (discoveryClient === undefined) {\n return false;\n }\n\n const challenge = parseBearerWwwAuthenticateHeader(response.headers.get(\"WWW-Authenticate\"));\n const resourceMetadataUrl = challenge?.params.resource_metadata;\n const discovery = await discoveryClient.discover(this.url, {\n resourceMetadataUrl,\n });\n const result = await this.oauthProvider.handleUnauthorized({\n requestUrl: new URL(this.url),\n response: response.clone(),\n challenge,\n discovery,\n fetch: this.fetchImpl,\n });\n\n if (result.action === \"retry\") {\n return true;\n }\n\n if (result.error !== undefined) {\n throw result.error;\n }\n\n return false;\n }\n\n private async forwardResponseMessages(response: Response): Promise<void> {\n if (response.status === 202) {\n return;\n }\n\n const contentType = response.headers.get(\"Content-Type\");\n if (contentType === null) {\n return;\n }\n\n const normalizedContentType = contentType.toLowerCase();\n if (normalizedContentType.includes(\"text/event-stream\")) {\n await this.forwardSseResponseMessages(response);\n return;\n }\n\n if (normalizedContentType.includes(\"application/json\")) {\n await this.forwardJsonResponseMessage(response);\n }\n }\n\n private async forwardSseResponseMessages(response: Response): Promise<void> {\n if (response.body === null) {\n return;\n }\n\n const parser = new SseParser();\n const decoder = new TextDecoder();\n const reader = response.body.getReader();\n this.openSseReaders.add(reader);\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n if (value === undefined) {\n continue;\n }\n\n const messages = parser.push(decoder.decode(value, { stream: true }));\n this.writeSseMessages(messages);\n this.lastEventId = parser.lastEventId;\n }\n\n const trailingChunk = decoder.decode();\n if (trailingChunk.length > 0) {\n this.writeSseMessages(parser.push(trailingChunk));\n this.lastEventId = parser.lastEventId;\n }\n\n this.writeSseMessages(parser.flush());\n this.lastEventId = parser.lastEventId;\n } finally {\n this.openSseReaders.delete(reader);\n reader.releaseLock();\n }\n }\n\n private async forwardJsonResponseMessage(response: Response): Promise<void> {\n const payload = await response.text();\n if (payload.length === 0) {\n return;\n }\n\n const parsedPayload = JSON.parse(payload) as unknown;\n this.writeReadableLine(JSON.stringify(parsedPayload));\n }\n\n private writeSseMessages(messages: ParsedSseMessage[]): void {\n for (const message of messages) {\n this.writeReadableLine(message.data);\n }\n }\n\n private writeReadableLine(line: string): void {\n if (this.disposed || this.readStream.destroyed || this.readStream.writableEnded) {\n return;\n }\n\n this.readStream.write(`${line}\\n`);\n }\n\n private async fetchWithOAuthRetry(input: {\n method: \"GET\" | \"POST\";\n createHeaders: () => Promise<Headers>;\n body?: BodyInit;\n }): Promise<Response> {\n const request = async (): Promise<Response> =>\n this.fetchWithAbort(this.url, {\n method: input.method,\n headers: await input.createHeaders(),\n body: input.body,\n });\n\n let response = await request();\n if (await this.maybeHandleUnauthorizedResponse(response)) {\n response = await request();\n }\n\n const oauthError = this.oauthProvider === undefined\n ? null\n : this.readOAuthChallengeError(response);\n if (oauthError !== null) {\n throw oauthError;\n }\n\n return response;\n }\n\n private readOAuthChallengeError(response: Response): OAuthError | null {\n if (response.status !== 401 && response.status !== 403) {\n return null;\n }\n\n const challenge = parseBearerWwwAuthenticateHeader(response.headers.get(\"WWW-Authenticate\"));\n const error = challenge?.params.error;\n if (error === undefined || error.length === 0) {\n return null;\n }\n\n return new OAuthError(\n {\n error,\n error_description: challenge?.params.error_description,\n error_uri: challenge?.params.error_uri,\n },\n response.status\n );\n }\n}\n\nclass HttpTransportGetSseNotSupportedError extends Error {\n constructor() {\n super(\"HTTP transport server does not support GET SSE streams\");\n }\n}\n\nexport interface JsonRpcRequest {\n jsonrpc: \"2.0\";\n id: RequestId;\n method: string;\n params?: unknown;\n}\n\nexport interface JsonRpcNotification {\n jsonrpc: \"2.0\";\n method: string;\n params?: unknown;\n}\n\nexport interface JsonRpcErrorObject {\n code: number;\n message: string;\n data?: unknown;\n}\n\nexport class McpError extends Error {\n readonly code: number;\n declare readonly data?: unknown;\n\n constructor(code: number, message: string, data?: unknown) {\n super(message);\n this.name = \"McpError\";\n this.code = code;\n if (data !== undefined) {\n this.data = data;\n }\n }\n}\n\nexport interface JsonRpcSuccessResponse {\n jsonrpc: \"2.0\";\n id: RequestId;\n result: unknown;\n}\n\nexport interface JsonRpcErrorResponse {\n jsonrpc: \"2.0\";\n id: RequestId;\n error: JsonRpcErrorObject;\n}\n\nexport type JsonRpcResponse = JsonRpcSuccessResponse | JsonRpcErrorResponse;\nexport type JsonRpcMessage = JsonRpcRequest | JsonRpcNotification | JsonRpcResponse;\n\nexport type ParsedJsonRpcMessage =\n | {\n type: \"request\";\n message: JsonRpcRequest;\n }\n | {\n type: \"notification\";\n message: JsonRpcNotification;\n }\n | {\n type: \"response\";\n message: JsonRpcResponse;\n }\n | {\n type: \"invalid\";\n id: RequestId | null;\n error: McpError;\n };\n\nexport function serializeJsonRpcMessage(message: JsonRpcMessage): string {\n return `${JSON.stringify(message)}\\n`;\n}\n\nfunction chunkToString(chunk: unknown): string {\n if (typeof chunk === \"string\") {\n return chunk;\n }\n\n if (chunk instanceof Uint8Array) {\n return Buffer.from(chunk).toString(\"utf8\");\n }\n\n return String(chunk);\n}\n\nfunction normalizeLine(line: string): string {\n return line.endsWith(\"\\r\") ? line.slice(0, -1) : line;\n}\n\nexport async function* readLines(stream: Readable): AsyncGenerator<string> {\n let buffer = \"\";\n\n for await (const chunk of stream as AsyncIterable<unknown>) {\n buffer += chunkToString(chunk);\n\n while (true) {\n const newlineIndex = buffer.indexOf(\"\\n\");\n if (newlineIndex === -1) {\n break;\n }\n\n const line = buffer.slice(0, newlineIndex);\n buffer = buffer.slice(newlineIndex + 1);\n yield normalizeLine(line);\n }\n }\n\n if (buffer.length > 0) {\n yield normalizeLine(buffer);\n }\n}\n\nexport interface ParsedSseMessage {\n data: string;\n id?: string;\n}\n\nexport class SseParser {\n private buffer = \"\";\n private eventType: string | undefined;\n private dataLines: string[] = [];\n private eventId = \"\";\n private hasEventId = false;\n private _lastEventId: string | undefined;\n\n get lastEventId(): string | undefined {\n return this._lastEventId;\n }\n\n push(chunk: string): ParsedSseMessage[] {\n if (chunk.length === 0) {\n return [];\n }\n\n this.buffer += chunk;\n const messages: ParsedSseMessage[] = [];\n\n while (true) {\n const newlineIndex = this.buffer.indexOf(\"\\n\");\n if (newlineIndex === -1) {\n break;\n }\n\n const line = normalizeLine(this.buffer.slice(0, newlineIndex));\n this.buffer = this.buffer.slice(newlineIndex + 1);\n this.consumeLine(line, messages);\n }\n\n return messages;\n }\n\n flush(): ParsedSseMessage[] {\n const messages: ParsedSseMessage[] = [];\n\n if (this.buffer.length > 0) {\n this.consumeLine(normalizeLine(this.buffer), messages);\n this.buffer = \"\";\n }\n\n this.emitEvent(messages);\n return messages;\n }\n\n private consumeLine(line: string, messages: ParsedSseMessage[]): void {\n if (line.length === 0) {\n this.emitEvent(messages);\n return;\n }\n\n if (line.startsWith(\":\")) {\n return;\n }\n\n const separatorIndex = line.indexOf(\":\");\n const field = separatorIndex === -1 ? line : line.slice(0, separatorIndex);\n const rawValue = separatorIndex === -1 ? \"\" : line.slice(separatorIndex + 1);\n const value = rawValue.startsWith(\" \") ? rawValue.slice(1) : rawValue;\n\n if (field === \"event\") {\n this.eventType = value;\n return;\n }\n\n if (field === \"data\") {\n this.dataLines.push(value);\n return;\n }\n\n if (field === \"id\") {\n if (value.includes(\"\\0\")) {\n return;\n }\n\n this.eventId = value;\n this.hasEventId = true;\n }\n }\n\n private emitEvent(messages: ParsedSseMessage[]): void {\n const eventType = this.eventType ?? \"message\";\n\n if (this.hasEventId) {\n this._lastEventId = this.eventId;\n }\n\n if (this.dataLines.length === 0 || eventType !== \"message\") {\n this.resetEvent();\n return;\n }\n\n const message: ParsedSseMessage = {\n data: this.dataLines.join(\"\\n\"),\n };\n\n if (this.hasEventId) {\n message.id = this.eventId;\n }\n\n messages.push(message);\n this.resetEvent();\n }\n\n private resetEvent(): void {\n this.eventType = undefined;\n this.dataLines = [];\n this.eventId = \"\";\n this.hasEventId = false;\n }\n}\n\ninterface PendingRequest {\n resolve: (result: unknown) => void;\n reject: (error: unknown) => void;\n timeout: ReturnType<typeof setTimeout>;\n}\n\ninterface ActiveIncomingRequest {\n cancelled: boolean;\n}\n\nexport interface JsonRpcRequestOptions {\n timeoutMs?: number;\n onRequestId?: (requestId: RequestId) => void;\n}\n\ninterface JsonRpcRequestContext {\n id: RequestId;\n method: string;\n}\n\ntype JsonRpcRequestHandler = (\n params: unknown,\n context: JsonRpcRequestContext\n) => unknown | Promise<unknown>;\n\ninterface JsonRpcNotificationContext {\n method: string;\n}\n\ntype JsonRpcNotificationHandler = (\n params: unknown,\n context: JsonRpcNotificationContext\n) => unknown | Promise<unknown>;\n\nexport class JsonRpcMessageLayer {\n readonly requestTimeoutMs: number;\n private readonly input: Readable;\n private readonly output: Writable;\n private readonly inputClosedReason: Promise<Error> | undefined;\n private nextRequestId = 1;\n private disposedError: Error | undefined;\n private readonly pendingRequests = new Map<RequestId, PendingRequest>();\n private readonly activeIncomingRequests = new Map<RequestId, ActiveIncomingRequest>();\n private readonly requestHandlers = new Map<string, JsonRpcRequestHandler>();\n private readonly notificationHandlers = new Map<string, JsonRpcNotificationHandler>();\n\n constructor(\n input: Readable,\n output: Writable,\n requestTimeoutMs = 30_000,\n inputClosedReason?: Promise<Error>\n ) {\n if (!Number.isFinite(requestTimeoutMs) || requestTimeoutMs < 0) {\n throw new Error(\"requestTimeoutMs must be a non-negative finite number\");\n }\n\n this.input = input;\n this.output = output;\n this.inputClosedReason = inputClosedReason;\n this.requestTimeoutMs = requestTimeoutMs;\n this.consumeInput().catch(() => undefined);\n }\n\n sendNotification(method: string, params?: unknown): void {\n if (this.disposedError !== undefined) {\n throw this.disposedError;\n }\n\n const message: JsonRpcNotification = {\n jsonrpc: \"2.0\",\n method,\n };\n\n if (params !== undefined) {\n message.params = params;\n }\n\n this.output.write(serializeJsonRpcMessage(message));\n }\n\n onRequest(method: string, handler: JsonRpcRequestHandler): void {\n this.requestHandlers.set(method, handler);\n }\n\n onNotification(method: string, handler: JsonRpcNotificationHandler): void {\n this.notificationHandlers.set(method, handler);\n }\n\n sendRequest(\n method: string,\n params?: unknown,\n options: JsonRpcRequestOptions = {}\n ): Promise<unknown> {\n if (this.disposedError !== undefined) {\n throw this.disposedError;\n }\n\n const id = this.nextRequestId;\n this.nextRequestId += 1;\n const timeoutMs = options.timeoutMs ?? this.requestTimeoutMs;\n\n if (!Number.isFinite(timeoutMs) || timeoutMs < 0) {\n throw new Error(\"timeoutMs must be a non-negative finite number\");\n }\n if (options.onRequestId !== undefined) {\n options.onRequestId(id);\n }\n\n const message: JsonRpcRequest = {\n jsonrpc: \"2.0\",\n id,\n method,\n };\n\n if (params !== undefined) {\n message.params = params;\n }\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pendingRequests.delete(id);\n reject(new Error(`JSON-RPC request \"${method}\" timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n\n this.pendingRequests.set(id, { resolve, reject, timeout });\n\n try {\n this.output.write(serializeJsonRpcMessage(message));\n } catch (error) {\n clearTimeout(timeout);\n this.pendingRequests.delete(id);\n reject(error);\n }\n });\n }\n\n dispose(reason = new Error(\"JSON-RPC message layer disposed\")): void {\n if (this.disposedError !== undefined) {\n return;\n }\n\n this.disposedError = reason;\n\n for (const pending of this.pendingRequests.values()) {\n clearTimeout(pending.timeout);\n pending.reject(reason);\n }\n\n this.pendingRequests.clear();\n this.activeIncomingRequests.clear();\n }\n\n private async consumeInput(): Promise<void> {\n try {\n for await (const line of readLines(this.input)) {\n if (this.disposedError !== undefined) {\n break;\n }\n\n if (line.length === 0) {\n continue;\n }\n\n let parsedLine: unknown;\n try {\n parsedLine = JSON.parse(line);\n } catch {\n await this.processParsedMessage({\n type: \"invalid\",\n id: null,\n error: parseError(),\n });\n continue;\n }\n\n if (Array.isArray(parsedLine)) {\n for (const message of parsedLine) {\n if (this.disposedError !== undefined) {\n break;\n }\n\n await this.processParsedMessage(parseJsonRpcPayload(message));\n }\n continue;\n }\n\n await this.processParsedMessage(parseJsonRpcPayload(parsedLine));\n }\n } catch (error) {\n if (this.disposedError === undefined) {\n this.dispose(\n error instanceof Error\n ? error\n : new Error(`JSON-RPC input stream failed: ${String(error)}`)\n );\n }\n return;\n }\n\n if (this.disposedError === undefined) {\n const streamClosedReason = await this.resolveInputStreamClosedReason();\n if (this.disposedError === undefined) {\n this.dispose(streamClosedReason);\n }\n }\n }\n\n private async resolveInputStreamClosedReason(): Promise<Error> {\n const streamClosedError = new Error(\"JSON-RPC input stream closed\");\n if (this.inputClosedReason === undefined) {\n return streamClosedError;\n }\n\n try {\n return await Promise.race([\n this.inputClosedReason,\n new Promise<Error>((resolve) => {\n setTimeout(() => {\n resolve(streamClosedError);\n }, 50);\n }),\n ]);\n } catch {\n return streamClosedError;\n }\n }\n\n private async processParsedMessage(parsed: ParsedJsonRpcMessage): Promise<void> {\n if (parsed.type === \"request\") {\n const handler = this.requestHandlers.get(parsed.message.method);\n if (handler === undefined) {\n this.output.write(\n serializeJsonRpcMessage({\n jsonrpc: \"2.0\",\n id: parsed.message.id,\n error: {\n code: ERROR_METHOD_NOT_FOUND,\n message: `Method not found: ${parsed.message.method}`,\n },\n })\n );\n return;\n }\n\n this.handleIncomingRequest(parsed.message, handler);\n return;\n }\n\n if (parsed.type === \"notification\") {\n if (parsed.message.method === \"notifications/cancelled\") {\n this.handleCancellationNotification(parsed.message.params);\n }\n\n const handler = this.notificationHandlers.get(parsed.message.method);\n if (handler === undefined) {\n return;\n }\n\n try {\n await handler(parsed.message.params, {\n method: parsed.message.method,\n });\n } catch {\n return;\n }\n return;\n }\n\n if (parsed.type === \"invalid\") {\n const errorResponse: {\n jsonrpc: \"2.0\";\n id: RequestId | null;\n error: JsonRpcErrorObject;\n } = {\n jsonrpc: \"2.0\",\n id: parsed.id,\n error: {\n code: parsed.error.code,\n message: parsed.error.message,\n },\n };\n\n if (parsed.error.data !== undefined) {\n errorResponse.error.data = parsed.error.data;\n }\n\n this.output.write(`${JSON.stringify(errorResponse)}\\n`);\n return;\n }\n\n if (parsed.type !== \"response\") {\n return;\n }\n\n const pending = this.pendingRequests.get(parsed.message.id);\n if (pending === undefined) {\n return;\n }\n\n this.pendingRequests.delete(parsed.message.id);\n clearTimeout(pending.timeout);\n if (\"result\" in parsed.message) {\n pending.resolve(parsed.message.result);\n return;\n }\n\n pending.reject(\n new McpError(\n parsed.message.error.code,\n parsed.message.error.message,\n parsed.message.error.data\n )\n );\n }\n\n private handleIncomingRequest(message: JsonRpcRequest, handler: JsonRpcRequestHandler): void {\n const activeRequest: ActiveIncomingRequest = {\n cancelled: false,\n };\n this.activeIncomingRequests.set(message.id, activeRequest);\n\n void (async () => {\n try {\n const result = await handler(message.params, {\n id: message.id,\n method: message.method,\n });\n\n if (this.disposedError !== undefined || activeRequest.cancelled) {\n return;\n }\n\n this.output.write(\n serializeJsonRpcMessage({\n jsonrpc: \"2.0\",\n id: message.id,\n result,\n })\n );\n } catch (error) {\n if (this.disposedError !== undefined || activeRequest.cancelled) {\n return;\n }\n\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.output.write(\n serializeJsonRpcMessage({\n jsonrpc: \"2.0\",\n id: message.id,\n error: {\n code: ERROR_INTERNAL,\n message: errorMessage,\n },\n })\n );\n } finally {\n const inFlightRequest = this.activeIncomingRequests.get(message.id);\n if (inFlightRequest === activeRequest) {\n this.activeIncomingRequests.delete(message.id);\n }\n }\n })();\n }\n\n private handleCancellationNotification(params: unknown): void {\n if (!isObjectRecord(params)) {\n return;\n }\n\n const requestId = params.requestId;\n if (!isRequestId(requestId)) {\n return;\n }\n\n const activeRequest = this.activeIncomingRequests.get(requestId);\n if (activeRequest === undefined) {\n return;\n }\n\n activeRequest.cancelled = true;\n this.activeIncomingRequests.delete(requestId);\n }\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction hasOwn(\n value: Record<string, unknown>,\n property: string\n): property is keyof typeof value {\n return Object.prototype.hasOwnProperty.call(value, property);\n}\n\nfunction isRequestId(value: unknown): value is RequestId {\n return typeof value === \"string\" || typeof value === \"number\";\n}\n\nfunction isLogLevel(value: unknown): value is LogLevel {\n return (\n value === \"debug\" ||\n value === \"info\" ||\n value === \"notice\" ||\n value === \"warning\" ||\n value === \"error\" ||\n value === \"critical\" ||\n value === \"alert\" ||\n value === \"emergency\"\n );\n}\n\nfunction toRequestId(value: unknown): RequestId | null {\n return isRequestId(value) ? value : null;\n}\n\nfunction parseError(): McpError {\n return new McpError(ERROR_PARSE, \"Parse error\");\n}\n\nfunction invalidRequest(): McpError {\n return new McpError(ERROR_INVALID_REQUEST, \"Invalid Request\");\n}\n\nfunction isJsonRpcErrorObject(value: unknown): value is JsonRpcErrorObject {\n if (!isObjectRecord(value)) {\n return false;\n }\n\n if (typeof value.code !== \"number\" || typeof value.message !== \"string\") {\n return false;\n }\n\n return value.data === undefined || hasOwn(value, \"data\");\n}\n\nexport function parseJsonRpcMessage(line: string): ParsedJsonRpcMessage {\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch {\n return {\n type: \"invalid\",\n id: null,\n error: parseError(),\n };\n }\n\n return parseJsonRpcPayload(parsed);\n}\n\nfunction parseJsonRpcPayload(parsed: unknown): ParsedJsonRpcMessage {\n if (!isObjectRecord(parsed)) {\n return {\n type: \"invalid\",\n id: null,\n error: invalidRequest(),\n };\n }\n\n const id = toRequestId(parsed.id);\n\n if (parsed.jsonrpc !== \"2.0\") {\n return {\n type: \"invalid\",\n id,\n error: invalidRequest(),\n };\n }\n\n const hasMethod = hasOwn(parsed, \"method\");\n const hasId = hasOwn(parsed, \"id\");\n\n if (hasMethod) {\n if (typeof parsed.method !== \"string\") {\n return {\n type: \"invalid\",\n id,\n error: invalidRequest(),\n };\n }\n\n if (hasId) {\n if (!isRequestId(parsed.id)) {\n return {\n type: \"invalid\",\n id: null,\n error: invalidRequest(),\n };\n }\n\n const request: JsonRpcRequest = {\n jsonrpc: \"2.0\",\n id: parsed.id,\n method: parsed.method,\n };\n\n if (hasOwn(parsed, \"params\")) {\n request.params = parsed.params;\n }\n\n return {\n type: \"request\",\n message: request,\n };\n }\n\n const notification: JsonRpcNotification = {\n jsonrpc: \"2.0\",\n method: parsed.method,\n };\n\n if (hasOwn(parsed, \"params\")) {\n notification.params = parsed.params;\n }\n\n return {\n type: \"notification\",\n message: notification,\n };\n }\n\n if (!hasId || !isRequestId(parsed.id)) {\n return {\n type: \"invalid\",\n id,\n error: invalidRequest(),\n };\n }\n\n const hasResult = hasOwn(parsed, \"result\");\n const hasError = hasOwn(parsed, \"error\");\n\n if (hasResult === hasError) {\n return {\n type: \"invalid\",\n id: parsed.id,\n error: invalidRequest(),\n };\n }\n\n if (hasResult) {\n return {\n type: \"response\",\n message: {\n jsonrpc: \"2.0\",\n id: parsed.id,\n result: parsed.result,\n },\n };\n }\n\n if (!isJsonRpcErrorObject(parsed.error)) {\n return {\n type: \"invalid\",\n id: parsed.id,\n error: invalidRequest(),\n };\n }\n\n return {\n type: \"response\",\n message: {\n jsonrpc: \"2.0\",\n id: parsed.id,\n error: parsed.error,\n },\n };\n}\n", "import crypto from \"node:crypto\";\nimport path from \"node:path\";\nimport { createSecretStore, } from \"auth-store\";\nimport { canonicalizeResourceIndicator } from \"../resource-indicator.js\";\nconst DEFAULT_FILE_SALT = \"poe-code:mcp-oauth:v1\";\nconst DEFAULT_FILE_DIRECTORY = \".poe-code/mcp-oauth\";\nconst DEFAULT_KEYCHAIN_SERVICE = \"poe-code-mcp-oauth\";\nconst DEFAULT_CLIENT_FILE_SALT = \"poe-code:mcp-oauth:clients:v1\";\nconst DEFAULT_CLIENT_FILE_DIRECTORY = \".poe-code/mcp-oauth/clients\";\nconst DEFAULT_CLIENT_KEYCHAIN_SERVICE = \"poe-code-mcp-oauth-clients\";\nexport function createAuthStoreSessionStore(options = {}) {\n return {\n async load(resource) {\n const store = createResourceSecretStore(resource, options);\n const value = await store.get();\n if (value === null) {\n return null;\n }\n const parsed = JSON.parse(value);\n if (typeof parsed === \"object\" && parsed !== null && !Array.isArray(parsed)) {\n return parsed;\n }\n throw new Error(\"Stored OAuth session must be a JSON object\");\n },\n async save(resource, session) {\n const store = createResourceSecretStore(resource, options);\n await store.set(JSON.stringify(session));\n },\n async clear(resource) {\n const store = createResourceSecretStore(resource, options);\n await store.delete();\n },\n };\n}\nexport function createAuthStoreClientStore(options) {\n return {\n async load(issuer) {\n const store = createIssuerSecretStore(issuer, options);\n const value = await store.get();\n if (value === null) {\n return null;\n }\n const parsed = JSON.parse(value);\n if (typeof parsed === \"object\"\n && parsed !== null\n && !Array.isArray(parsed)\n && typeof parsed.clientId === \"string\") {\n return parsed;\n }\n throw new Error(\"Stored OAuth client must be a JSON object with clientId\");\n },\n async save(issuer, client) {\n const store = createIssuerSecretStore(issuer, options);\n await store.set(JSON.stringify(client));\n },\n async clear(issuer) {\n const store = createIssuerSecretStore(issuer, options);\n await store.delete();\n },\n };\n}\nfunction createNamedSecretStore(key, options, defaults) {\n const hash = crypto.createHash(\"sha256\").update(key).digest(\"hex\");\n const parsedFilePath = options.fileStore?.filePath === undefined ? null : path.parse(options.fileStore.filePath);\n const fileStore = {\n ...options.fileStore,\n salt: options.fileStore?.salt ?? defaults.salt,\n defaultDirectory: parsedFilePath?.dir ||\n options.fileStore?.defaultDirectory ||\n defaults.directory,\n defaultFileName: parsedFilePath === null\n ? `${hash}.enc`\n : `${parsedFilePath.name}-${hash}${parsedFilePath.ext || \".enc\"}`,\n };\n const keychainStore = {\n ...options.keychainStore,\n service: options.keychainStore?.service ?? defaults.service,\n account: `${options.keychainStore?.account ?? defaults.accountPrefix}:${hash}`,\n };\n return createSecretStore({ ...options, fileStore, keychainStore }).store;\n}\nfunction createResourceSecretStore(resource, options) {\n return createNamedSecretStore(canonicalizeResourceIndicator(resource), options, {\n salt: DEFAULT_FILE_SALT,\n directory: DEFAULT_FILE_DIRECTORY,\n service: DEFAULT_KEYCHAIN_SERVICE,\n accountPrefix: \"provider\",\n });\n}\nfunction createIssuerSecretStore(issuer, options) {\n return createNamedSecretStore(issuer, options, {\n salt: DEFAULT_CLIENT_FILE_SALT,\n directory: DEFAULT_CLIENT_FILE_DIRECTORY,\n service: DEFAULT_CLIENT_KEYCHAIN_SERVICE,\n accountPrefix: \"issuer\",\n });\n}\n", "import { URL } from \"node:url\";\nimport { createAuthStoreClientStore, createAuthStoreSessionStore, } from \"./auth-store-session-store.js\";\nimport { createLoopbackAuthorizationSession } from \"./loopback-authorization.js\";\nimport { createAuthorizationState } from \"./authorization-state.js\";\nimport { generateCodeChallenge, generateCodeVerifier } from \"./pkce.js\";\nimport { exchangeAuthorizationCode, OAuthError, refreshAccessToken, isRetryableOAuthError, readOAuthJsonObjectResponse, } from \"./token-endpoint.js\";\nimport { canonicalizeResourceIndicator } from \"../resource-indicator.js\";\nexport function createOAuthClientProvider(options) {\n if (isProviderOptions(options)) {\n return options.provider;\n }\n return createDefaultOAuthClientProvider(options);\n}\nexport function createDefaultOAuthClientProvider(options) {\n const sessionStore = options.sessionStore ?? createAuthStoreSessionStore(options.authStore);\n const clientStore = options.authStore === undefined ? null : createAuthStoreClientStore(options.authStore);\n const now = options.now ?? Date.now;\n const sessions = new Map();\n const registeredClients = new Map();\n const refreshPromises = new Map();\n const authorizationPromises = new Map();\n return {\n async authorizeRequest(input) {\n assertNoAccessTokenInUrl(input.requestUrl, \"Protected resource request URL\");\n const requestUrl = canonicalizeResourceIndicator(input.requestUrl);\n const session = await ensureAuthorizedSession(requestUrl, undefined, input.fetch, false);\n const accessToken = session?.tokens?.accessToken;\n if (session === null || accessToken === undefined) {\n return;\n }\n assertRequestMatchesResource(requestUrl, session.resource);\n input.headers.set(\"Authorization\", `Bearer ${accessToken}`);\n },\n async handleUnauthorized(input) {\n try {\n assertNoAccessTokenInUrl(input.requestUrl, \"Protected resource request URL\");\n const requestUrl = canonicalizeResourceIndicator(input.requestUrl);\n const resource = canonicalizeResourceIndicator(input.discovery.resource);\n assertRequestMatchesResource(requestUrl, resource);\n const forceRefresh = hasCachedAccessToken(await loadSession(resource))\n && input.challenge?.params.error === \"invalid_token\";\n const session = await ensureAuthorizedSession(resource, {\n ...input.discovery,\n resource,\n }, input.fetch, true, forceRefresh);\n if (session?.tokens?.accessToken === undefined) {\n return { action: \"fail\" };\n }\n return { action: \"retry\" };\n }\n catch (error) {\n return {\n action: \"fail\",\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n },\n };\n async function ensureAuthorizedSession(resource, discovery, fetch, allowInteractive, forceRefresh = false) {\n const canonicalResource = canonicalizeResourceIndicator(resource);\n let session = await loadSession(canonicalResource);\n const sessionDiscovery = resolveDiscovery(discovery, session);\n if (session?.tokens !== undefined && !forceRefresh && !isExpired(session.tokens, now)) {\n return session;\n }\n if (session?.tokens?.refreshToken !== undefined\n && sessionDiscovery !== undefined\n && (forceRefresh || isExpired(session.tokens, now))) {\n session = await refreshSession(canonicalResource, session, sessionDiscovery, fetch);\n if (session?.tokens !== undefined && !isExpired(session.tokens, now)) {\n return session;\n }\n }\n if (!allowInteractive || sessionDiscovery === undefined) {\n return session;\n }\n if (forceRefresh && session?.tokens !== undefined) {\n return session;\n }\n return authorizeSession(canonicalResource, session, sessionDiscovery, fetch);\n }\n async function refreshSession(resource, session, discovery, fetch) {\n assertSecureOAuthFlowEndpoints(discovery.authorizationServerMetadata);\n const inFlight = refreshPromises.get(resource);\n if (inFlight !== undefined) {\n return inFlight;\n }\n const promise = (async () => {\n try {\n if (session.tokens?.refreshToken === undefined) {\n return session;\n }\n let refreshAttempted = false;\n let refreshedTokens;\n while (true) {\n try {\n refreshedTokens = await refreshAccessToken({\n tokenEndpoint: discovery.authorizationServerMetadata.token_endpoint,\n clientId: session.client.clientId,\n clientSecret: session.client.clientSecret,\n refreshToken: session.tokens.refreshToken,\n resource,\n fetch,\n now,\n });\n break;\n }\n catch (error) {\n if (error instanceof OAuthError && error.error === \"invalid_grant\") {\n const clearedSession = clearSessionTokens(session);\n await saveSession(resource, clearedSession);\n return clearedSession;\n }\n if (shouldReRegisterStoredDynamicClient(error, await loadRegisteredClient(discovery.authorizationServer), false)) {\n await clearRegisteredClient(discovery.authorizationServer);\n await clearSession(resource);\n return null;\n }\n if (!refreshAttempted && isRetryableOAuthError(error)) {\n refreshAttempted = true;\n continue;\n }\n throw error;\n }\n }\n const updatedSession = {\n ...session,\n tokens: refreshedTokens,\n discovery: toStoredDiscovery(discovery),\n };\n await saveSession(resource, updatedSession);\n return updatedSession;\n }\n finally {\n refreshPromises.delete(resource);\n }\n })();\n refreshPromises.set(resource, promise);\n return promise;\n }\n async function authorizeSession(resource, existingSession, discovery, fetch) {\n const inFlight = authorizationPromises.get(resource);\n if (inFlight !== undefined) {\n return inFlight;\n }\n const promise = (async () => {\n assertS256PkceSupport(discovery.authorizationServerMetadata);\n assertSecureOAuthFlowEndpoints(discovery.authorizationServerMetadata);\n let currentSession = existingSession;\n let transientRetryAttempted = false;\n let reRegistrationAttempted = false;\n while (true) {\n const loopback = await createLoopbackAuthorizationSession({\n openBrowser: options.browser.openBrowser,\n readLine: options.browser.readLine,\n createServer: options.browser.createServer,\n landingPage: options.browser.landingPage,\n });\n let resolvedClient = null;\n try {\n resolvedClient = await resolveClient(currentSession, discovery, loopback.redirectUri, fetch);\n const sessionWithoutTokens = {\n resource,\n authorizationServer: discovery.authorizationServer,\n client: resolvedClient.client,\n discovery: toStoredDiscovery(discovery),\n };\n await saveSession(resource, sessionWithoutTokens);\n const verifier = generateCodeVerifier();\n const challenge = generateCodeChallenge(verifier);\n const authorizationUrl = buildAuthorizationUrl({\n metadata: discovery.authorizationServerMetadata,\n resource,\n clientId: resolvedClient.client.clientId,\n redirectUri: loopback.redirectUri,\n codeChallenge: challenge,\n clientMetadata: getClientMetadata(options.client),\n });\n const code = await loopback.waitForCode(authorizationUrl);\n const tokens = await exchangeAuthorizationCode({\n tokenEndpoint: discovery.authorizationServerMetadata.token_endpoint,\n clientId: resolvedClient.client.clientId,\n clientSecret: resolvedClient.client.clientSecret,\n code,\n codeVerifier: verifier,\n redirectUri: loopback.redirectUri,\n resource,\n fetch,\n now,\n });\n const session = {\n ...sessionWithoutTokens,\n tokens,\n };\n await saveSession(resource, session);\n return session;\n }\n catch (error) {\n if (shouldReRegisterStoredDynamicClient(error, resolvedClient, reRegistrationAttempted)) {\n reRegistrationAttempted = true;\n await clearRegisteredClient(discovery.authorizationServer);\n await clearSession(resource);\n currentSession = null;\n continue;\n }\n if (!transientRetryAttempted && isRetryableOAuthError(error)) {\n transientRetryAttempted = true;\n await clearSession(resource);\n currentSession = null;\n continue;\n }\n throw error;\n }\n finally {\n loopback.close();\n }\n }\n })();\n const finalPromise = promise.finally(() => {\n authorizationPromises.delete(resource);\n });\n authorizationPromises.set(resource, finalPromise);\n return finalPromise;\n }\n async function resolveClient(existingSession, discovery, redirectUri, fetch) {\n if (options.client.mode === \"static\") {\n return {\n kind: \"static\",\n fromStoredRegistration: false,\n client: {\n clientId: options.client.clientId,\n clientSecret: options.client.clientSecret,\n },\n };\n }\n const registrationEndpoint = discovery.authorizationServerMetadata.registration_endpoint;\n if (registrationEndpoint === undefined && options.client.clientId !== undefined) {\n return {\n kind: \"static\",\n fromStoredRegistration: false,\n client: {\n clientId: options.client.clientId,\n clientSecret: options.client.clientSecret,\n },\n };\n }\n const storedClient = await loadRegisteredClient(discovery.authorizationServer);\n if (storedClient !== null) {\n return {\n kind: \"dynamic\",\n fromStoredRegistration: true,\n client: storedClient,\n };\n }\n if (registrationEndpoint === undefined) {\n if (existingSession !== null && existingSession.client.clientId.length > 0) {\n return {\n kind: \"dynamic\",\n fromStoredRegistration: true,\n client: existingSession.client,\n };\n }\n throw new Error(\"Authorization server metadata is missing registration_endpoint\");\n }\n if (existingSession !== null && existingSession.client.clientId.length > 0) {\n const isConfiguredStaticFallback = options.client.clientId !== undefined\n && existingSession.client.clientId === options.client.clientId\n && existingSession.client.clientSecret === options.client.clientSecret;\n if (!isConfiguredStaticFallback) {\n await saveRegisteredClient(discovery.authorizationServer, existingSession.client);\n return {\n kind: \"dynamic\",\n fromStoredRegistration: true,\n client: existingSession.client,\n };\n }\n }\n const registrationBody = buildClientRegistrationBody(getClientMetadata(options.client), redirectUri);\n const response = await fetch(registrationEndpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(registrationBody),\n });\n const payload = await readOAuthJsonObjectResponse(response);\n if (typeof payload.client_id !== \"string\" ||\n payload.client_id.length === 0) {\n throw new Error(\"OAuth client registration response missing client_id\");\n }\n const registeredClient = {\n clientId: payload.client_id,\n clientSecret: typeof payload.client_secret === \"string\" && payload.client_secret.length > 0\n ? payload.client_secret\n : undefined,\n };\n await saveRegisteredClient(discovery.authorizationServer, registeredClient);\n return {\n kind: \"dynamic\",\n fromStoredRegistration: false,\n client: registeredClient,\n };\n }\n async function loadSession(resource) {\n if (sessions.has(resource)) {\n return sessions.get(resource) ?? null;\n }\n const session = await sessionStore.load(resource);\n sessions.set(resource, session);\n return session;\n }\n async function saveSession(resource, session) {\n sessions.set(resource, session);\n await sessionStore.save(resource, session);\n }\n async function clearSession(resource) {\n sessions.delete(resource);\n await sessionStore.clear(resource);\n }\n async function loadRegisteredClient(issuer) {\n if (registeredClients.has(issuer)) {\n return registeredClients.get(issuer) ?? null;\n }\n if (clientStore === null) {\n return null;\n }\n const client = await clientStore.load(issuer);\n registeredClients.set(issuer, client);\n return client;\n }\n async function saveRegisteredClient(issuer, client) {\n registeredClients.set(issuer, client);\n if (clientStore !== null) {\n await clientStore.save(issuer, client);\n }\n }\n async function clearRegisteredClient(issuer) {\n registeredClients.delete(issuer);\n if (clientStore !== null) {\n await clientStore.clear(issuer);\n }\n }\n}\nfunction isProviderOptions(options) {\n return \"provider\" in options;\n}\nfunction isExpired(tokens, now) {\n return tokens.expiresAt !== null && tokens.expiresAt <= now();\n}\nfunction resolveDiscovery(discovery, session) {\n if (discovery !== undefined) {\n return {\n ...discovery,\n resource: canonicalizeResourceIndicator(discovery.resource),\n };\n }\n if (session === null) {\n return undefined;\n }\n const metadata = session.discovery.authorizationServerMetadata;\n if (typeof metadata.issuer !== \"string\" ||\n typeof metadata.authorization_endpoint !== \"string\" ||\n typeof metadata.token_endpoint !== \"string\" ||\n !Array.isArray(metadata.code_challenge_methods_supported) ||\n !metadata.code_challenge_methods_supported.includes(\"S256\")) {\n return undefined;\n }\n return {\n resource: canonicalizeResourceIndicator(session.resource),\n resourceMetadataUrl: session.discovery.resourceMetadataUrl,\n resourceMetadata: session.discovery.resourceMetadata,\n authorizationServer: session.authorizationServer,\n authorizationServerMetadataUrl: \"\",\n authorizationServerMetadata: metadata,\n };\n}\nfunction clearSessionTokens(session) {\n const nextSession = { ...session };\n delete nextSession.tokens;\n return nextSession;\n}\nfunction hasCachedAccessToken(session) {\n return session?.tokens?.accessToken !== undefined;\n}\nfunction getClientMetadata(client) {\n return client.metadata;\n}\nfunction buildAuthorizationUrl(input) {\n const url = new URL(input.metadata.authorization_endpoint);\n const resource = canonicalizeResourceIndicator(input.resource);\n const state = createAuthorizationState({\n issuer: input.metadata.issuer,\n requireIssuer: input.metadata.authorization_response_iss_parameter_supported === true,\n });\n url.searchParams.set(\"response_type\", \"code\");\n url.searchParams.set(\"client_id\", input.clientId);\n url.searchParams.set(\"redirect_uri\", input.redirectUri);\n url.searchParams.set(\"code_challenge\", input.codeChallenge);\n url.searchParams.set(\"code_challenge_method\", \"S256\");\n url.searchParams.set(\"resource\", resource);\n url.searchParams.set(\"state\", state);\n if (input.clientMetadata?.scope !== undefined && input.clientMetadata.scope.length > 0) {\n url.searchParams.set(\"scope\", input.clientMetadata.scope);\n }\n return url.toString();\n}\nfunction assertS256PkceSupport(metadata) {\n if (!metadata.code_challenge_methods_supported.includes(\"S256\")) {\n throw new Error(\"Authorization server metadata must advertise code_challenge_methods_supported including S256\");\n }\n}\nfunction normalizeHostname(hostname) {\n return hostname.endsWith(\".\") ? hostname.slice(0, -1).toLowerCase() : hostname.toLowerCase();\n}\nfunction isLoopbackHostname(hostname) {\n const normalizedHostname = normalizeHostname(hostname);\n return normalizedHostname === \"localhost\"\n || normalizedHostname === \"::1\"\n || normalizedHostname.startsWith(\"127.\");\n}\nfunction assertSecureUrl(value, label) {\n const url = new URL(value);\n if (url.protocol === \"https:\") {\n return;\n }\n if (url.protocol === \"http:\" && isLoopbackHostname(url.hostname)) {\n return;\n }\n throw new Error(`${label} must use https unless it targets a loopback host`);\n}\nfunction assertSecureOAuthFlowEndpoints(metadata) {\n assertNoAccessTokenInUrl(metadata.authorization_endpoint, \"Authorization endpoint\");\n assertNoAccessTokenInUrl(metadata.token_endpoint, \"Token endpoint\");\n assertSecureUrl(metadata.authorization_endpoint, \"Authorization endpoint\");\n assertSecureUrl(metadata.token_endpoint, \"Token endpoint\");\n if (metadata.registration_endpoint !== undefined) {\n assertNoAccessTokenInUrl(metadata.registration_endpoint, \"Registration endpoint\");\n assertSecureUrl(metadata.registration_endpoint, \"Registration endpoint\");\n }\n}\nfunction assertNoAccessTokenInUrl(value, label) {\n const url = value instanceof URL ? new URL(value.toString()) : new URL(value);\n if (url.searchParams.has(\"access_token\")) {\n throw new Error(`${label} must not include access_token in the URI`);\n }\n}\nfunction assertRequestMatchesResource(requestUrl, resource) {\n if (requestUrl !== resource) {\n throw new Error(`OAuth request URL ${requestUrl} does not match discovered resource ${resource}`);\n }\n}\nfunction buildClientRegistrationBody(metadata, redirectUri) {\n const body = {\n redirect_uris: [redirectUri],\n grant_types: [\"authorization_code\", \"refresh_token\"],\n response_types: [\"code\"],\n token_endpoint_auth_method: \"none\",\n };\n if (metadata?.clientName !== undefined && metadata.clientName.length > 0) {\n body.client_name = metadata.clientName;\n }\n if (metadata?.scope !== undefined && metadata.scope.length > 0) {\n body.scope = metadata.scope;\n }\n if (metadata?.softwareId !== undefined && metadata.softwareId.length > 0) {\n body.software_id = metadata.softwareId;\n }\n if (metadata?.softwareVersion !== undefined && metadata.softwareVersion.length > 0) {\n body.software_version = metadata.softwareVersion;\n }\n return body;\n}\nfunction toStoredDiscovery(discovery) {\n return {\n resourceMetadataUrl: discovery.resourceMetadataUrl,\n resourceMetadata: discovery.resourceMetadata,\n authorizationServerMetadata: discovery.authorizationServerMetadata,\n };\n}\nfunction shouldReRegisterStoredDynamicClient(error, client, alreadyAttempted) {\n if (!(error instanceof OAuthError) || error.error !== \"invalid_client\" || alreadyAttempted) {\n return false;\n }\n if (client === null) {\n return false;\n }\n if (\"kind\" in client) {\n return client.kind === \"dynamic\" && client.fromStoredRegistration;\n }\n return true;\n}\n", "import http from \"node:http\";\nimport { parseAuthorizationState } from \"./authorization-state.js\";\nexport async function createLoopbackAuthorizationSession(options = {}) {\n const callbackPath = options.callbackPath ?? \"/callback\";\n const server = options.createServer ? options.createServer() : http.createServer();\n const port = await startServer(server);\n const redirectUri = `http://127.0.0.1:${port}${callbackPath}`;\n return {\n redirectUri,\n async waitForCode(authorizationUrl) {\n return waitForAuthorizationCode(server, authorizationUrl, options, callbackPath);\n },\n close() {\n server.closeAllConnections?.();\n server.close();\n },\n };\n}\nasync function startServer(server) {\n return new Promise((resolve) => {\n server.listen(0, \"127.0.0.1\", () => {\n const address = server.address();\n resolve(address.port);\n });\n });\n}\nfunction waitForAuthorizationCode(server, authorizationUrl, options, callbackPath) {\n const expectedAuthorization = readExpectedAuthorizationCallback(authorizationUrl);\n return new Promise((resolve, reject) => {\n let settled = false;\n const settle = (fn) => {\n if (!settled) {\n settled = true;\n fn();\n }\n };\n server.on(\"request\", (req, res) => {\n const url = new URL(req.url ?? \"/\", \"http://127.0.0.1\");\n if (url.pathname !== callbackPath) {\n res.writeHead(404);\n res.end(\"Not found\");\n return;\n }\n const error = url.searchParams.get(\"error\");\n if (error !== null) {\n const description = url.searchParams.get(\"error_description\") ?? error;\n res.writeHead(400);\n res.end(`Authorization failed: ${description}`);\n settle(() => reject(new Error(`OAuth authorization failed: ${error} \u2014 ${description}`)));\n return;\n }\n try {\n const code = validateAuthorizationCallbackParameters({\n code: url.searchParams.get(\"code\"),\n state: url.searchParams.get(\"state\"),\n iss: url.searchParams.get(\"iss\"),\n }, expectedAuthorization);\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(buildSuccessPage(options.landingPage));\n settle(() => resolve(code));\n }\n catch (error) {\n res.writeHead(400);\n res.end(error instanceof Error ? error.message : \"Invalid OAuth callback\");\n settle(() => reject(error instanceof Error ? error : new Error(String(error))));\n }\n });\n if (options.readLine !== undefined) {\n options.readLine().then((input) => {\n const callbackParameters = extractCallbackParametersFromInput(input);\n if (callbackParameters === null) {\n settle(() => reject(new Error(\"OAuth callback missing authorization code\")));\n return;\n }\n try {\n const code = validateAuthorizationCallbackParameters(callbackParameters, expectedAuthorization);\n settle(() => resolve(code));\n }\n catch (error) {\n settle(() => reject(error instanceof Error ? error : new Error(String(error))));\n }\n }).catch(() => undefined);\n }\n if (options.openBrowser !== undefined) {\n options.openBrowser(authorizationUrl).catch((error) => {\n settle(() => reject(error));\n });\n }\n });\n}\nexport function extractCodeFromInput(input) {\n return extractCallbackParametersFromInput(input)?.code ?? null;\n}\nfunction extractCallbackParametersFromInput(input) {\n const trimmed = input.replaceAll(\"\\r\", \"\").replaceAll(\"\\n\", \"\").trim();\n if (trimmed.length === 0) {\n return null;\n }\n try {\n const url = new URL(trimmed);\n return {\n code: url.searchParams.get(\"code\"),\n state: url.searchParams.get(\"state\"),\n iss: url.searchParams.get(\"iss\"),\n };\n }\n catch {\n return {\n code: trimmed,\n state: null,\n iss: null,\n };\n }\n}\nfunction readExpectedAuthorizationCallback(authorizationUrl) {\n const url = new URL(authorizationUrl);\n const state = url.searchParams.get(\"state\");\n const parsedState = parseAuthorizationState(state);\n return {\n state,\n issuer: parsedState?.issuer ?? null,\n requireIssuer: parsedState?.requireIssuer ?? false,\n };\n}\nfunction validateAuthorizationCallbackParameters(callback, expected) {\n if (callback.code === null || callback.code.length === 0) {\n throw new Error(\"OAuth callback missing authorization code\");\n }\n if (expected.state !== null) {\n if (callback.state === null || callback.state.length === 0) {\n throw new Error(\"OAuth callback missing state\");\n }\n if (callback.state !== expected.state) {\n throw new Error(\"OAuth callback state mismatch\");\n }\n }\n if (expected.requireIssuer) {\n if (callback.iss === null || callback.iss.length === 0) {\n throw new Error(\"OAuth callback missing issuer\");\n }\n }\n if (callback.iss !== null\n && callback.iss.length > 0\n && expected.issuer !== null\n && callback.iss !== expected.issuer) {\n throw new Error(\"OAuth callback issuer mismatch\");\n }\n return callback.code;\n}\nfunction escapeHtml(text) {\n return text\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\")\n .replaceAll(\"\\\"\", \""\");\n}\nexport function buildSuccessPage(landingPage) {\n const title = landingPage?.title ?? \"Connected\";\n const body = landingPage?.body ?? \"You can close this tab and return to your terminal.\";\n return [\n \"<!DOCTYPE html>\",\n `<html><head><meta charset=utf-8><title>${escapeHtml(title)}</title></head>`,\n \"<body style=\\\"font-family:system-ui,sans-serif;display:flex;align-items:center;justify-content:center;min-height:100vh;margin:0\\\">\",\n \"<div style=\\\"text-align:center\\\">\",\n `<h1>${escapeHtml(title)}</h1>`,\n `<p style=\"color:#666\">${escapeHtml(body)}</p>`,\n \"</div></body></html>\",\n ].join(\"\");\n}\n", "import crypto from \"node:crypto\";\nexport function createAuthorizationState(input) {\n const payload = {\n v: 1,\n n: crypto.randomBytes(16).toString(\"base64url\"),\n i: input.issuer,\n r: input.requireIssuer,\n };\n return Buffer.from(JSON.stringify(payload), \"utf8\").toString(\"base64url\");\n}\nexport function parseAuthorizationState(value) {\n if (value === null || value.length === 0) {\n return null;\n }\n try {\n const decoded = Buffer.from(value, \"base64url\").toString(\"utf8\");\n const parsed = JSON.parse(decoded);\n if (parsed.v !== 1\n || typeof parsed.n !== \"string\"\n || parsed.n.length === 0\n || typeof parsed.i !== \"string\"\n || parsed.i.length === 0\n || typeof parsed.r !== \"boolean\") {\n return null;\n }\n return {\n issuer: parsed.i,\n requireIssuer: parsed.r,\n };\n }\n catch {\n return null;\n }\n}\n", "import crypto from \"node:crypto\";\nexport function generateCodeVerifier() {\n return crypto.randomBytes(32).toString(\"base64url\");\n}\nexport function generateCodeChallenge(verifier) {\n return crypto.createHash(\"sha256\").update(verifier).digest(\"base64url\");\n}\n", "import { decodeProtectedHeader, errors, importJWK, jwtVerify, } from \"jose\";\nimport { canonicalizeResourceIndicator } from \"../resource-indicator.js\";\nconst DEFAULT_ALLOWED_ALGORITHMS = [\n \"ES256\",\n \"ES384\",\n \"ES512\",\n \"RS256\",\n \"RS384\",\n \"RS512\",\n \"PS256\",\n \"PS384\",\n \"PS512\",\n \"EdDSA\",\n];\nfunction isTokenVerificationErrorShape(error) {\n if (!(error instanceof Error)) {\n return false;\n }\n const challengeError = error;\n return challengeError.error === \"invalid_token\"\n || challengeError.error === \"insufficient_scope\";\n}\nfunction isObjectRecord(value) {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\nfunction isStringArray(value) {\n return Array.isArray(value) && value.every((item) => typeof item === \"string\");\n}\nfunction toUrl(value, label) {\n try {\n return new URL(String(value));\n }\n catch {\n throw new Error(`${label} must be an absolute URL`);\n }\n}\nfunction normalizeAudience(value) {\n if (typeof value === \"string\") {\n return [value];\n }\n return isStringArray(value) ? [...value] : [];\n}\nfunction normalizeVerifiedAudience(value, expectedResource) {\n const audiences = normalizeAudience(value);\n if (audiences.length !== 1) {\n throw createInvalidTokenError(\"audience mismatch\");\n }\n let normalizedAudience;\n try {\n normalizedAudience = canonicalizeResourceIndicator(audiences[0] ?? \"\");\n }\n catch {\n throw createInvalidTokenError(\"audience mismatch\");\n }\n if (normalizedAudience !== expectedResource) {\n throw createInvalidTokenError(\"audience mismatch\");\n }\n return [normalizedAudience];\n}\nfunction parseScopes(payload) {\n const raw = typeof payload.scope === \"string\"\n ? payload.scope\n : typeof payload.scopes === \"string\"\n ? payload.scopes\n : null;\n if (raw !== null) {\n return raw\n .split(\" \")\n .map((scope) => scope.trim())\n .filter((scope) => scope.length > 0);\n }\n return isStringArray(payload.scopes) ? [...payload.scopes] : [];\n}\nfunction toVerifiedAccessToken(token, payload, audience = normalizeAudience(payload.aud)) {\n return {\n token,\n issuer: typeof payload.iss === \"string\" ? payload.iss : \"\",\n audience,\n scopes: parseScopes(payload),\n expiresAt: typeof payload.exp === \"number\" ? payload.exp : 0,\n claims: { ...payload },\n ...(typeof payload.sub === \"string\"\n ? {\n subject: payload.sub,\n }\n : {}),\n ...(typeof payload.client_id === \"string\"\n ? {\n clientId: payload.client_id,\n }\n : {}),\n };\n}\nfunction createTokenVerificationError(input) {\n return Object.assign(new Error(input.errorDescription ?? input.error), input);\n}\nfunction createInvalidTokenError(errorDescription) {\n return createTokenVerificationError({\n error: \"invalid_token\",\n errorDescription,\n });\n}\nfunction normalizeVerificationError(error) {\n if (isTokenVerificationErrorShape(error)) {\n return error;\n }\n if (error instanceof errors.JWTExpired) {\n return createInvalidTokenError(\"token expired\");\n }\n if (error instanceof errors.JWTClaimValidationFailed) {\n if (error.claim === \"aud\") {\n return createInvalidTokenError(\"audience mismatch\");\n }\n if (error.claim === \"iss\") {\n return createInvalidTokenError(\"issuer mismatch\");\n }\n if (error.claim === \"nbf\") {\n return createInvalidTokenError(\"token not active yet\");\n }\n if (error.claim === \"exp\") {\n return createInvalidTokenError(\"token expired\");\n }\n }\n if (error instanceof errors.JOSEAlgNotAllowed\n || error instanceof errors.JOSENotSupported) {\n return createInvalidTokenError(\"unsupported token algorithm\");\n }\n if (error instanceof errors.JWKSNoMatchingKey\n || error instanceof errors.JWKSMultipleMatchingKeys\n || error instanceof errors.JWSSignatureVerificationFailed) {\n return createInvalidTokenError(\"token signature invalid\");\n }\n if (error instanceof errors.JWKSInvalid) {\n return createInvalidTokenError(\"invalid JWKS document\");\n }\n if (error instanceof errors.JWKSTimeout) {\n return createInvalidTokenError(\"timed out loading JWKS\");\n }\n if (error instanceof Error) {\n return createInvalidTokenError(error.message);\n }\n return createInvalidTokenError(\"token verification failed\");\n}\nasync function loadJwks(jwksUrl, fetchImplementation) {\n const response = await fetchImplementation(jwksUrl, {\n headers: {\n Accept: \"application/json\",\n },\n });\n if (!response.ok) {\n throw createInvalidTokenError(`unable to load JWKS (${response.status})`);\n }\n const payload = (await response.json());\n if (!isObjectRecord(payload) || !Array.isArray(payload.keys)) {\n throw createInvalidTokenError(\"invalid JWKS document\");\n }\n return payload;\n}\nfunction resolveAlgorithm(token, allowedAlgorithms) {\n const header = decodeProtectedHeader(token);\n const alg = header.alg;\n if (hasCriticalHeaderClaims(header)) {\n throw createInvalidTokenError(\"unsupported critical token claims\");\n }\n if (typeof alg !== \"string\"\n || alg === \"none\"\n || alg.startsWith(\"HS\")\n || !allowedAlgorithms.includes(alg)) {\n throw createInvalidTokenError(\"unsupported token algorithm\");\n }\n return alg;\n}\nfunction hasCriticalHeaderClaims(header) {\n return Array.isArray(header.crit) && header.crit.length > 0;\n}\nfunction isVerificationCandidate(key, alg, kid) {\n if (kid !== undefined && key.kid !== kid) {\n return false;\n }\n if (typeof key.alg === \"string\" && key.alg !== alg) {\n return false;\n }\n if (typeof key.use === \"string\" && key.use !== \"sig\") {\n return false;\n }\n if (Array.isArray(key.key_ops) && !key.key_ops.includes(\"verify\")) {\n return false;\n }\n return true;\n}\nfunction shouldContinueWithNextKey(error) {\n return error instanceof errors.JWSSignatureVerificationFailed;\n}\nasync function verifyJwtAgainstJwks(input) {\n const protectedHeader = decodeProtectedHeader(input.token);\n const kid = typeof protectedHeader.kid === \"string\" ? protectedHeader.kid : undefined;\n const candidateKeys = input.jwks.keys.filter((key) => isVerificationCandidate(key, input.alg, kid));\n if (candidateKeys.length === 0) {\n throw createInvalidTokenError(\"token signature invalid\");\n }\n let lastSignatureError;\n for (const candidate of candidateKeys) {\n try {\n const key = await importJWK(candidate, input.alg);\n return await jwtVerify(input.token, key, {\n algorithms: [input.alg],\n issuer: [...input.authorizationServers],\n clockTolerance: input.clockSkewSeconds,\n });\n }\n catch (error) {\n if (shouldContinueWithNextKey(error)) {\n lastSignatureError = error;\n continue;\n }\n throw error;\n }\n }\n throw lastSignatureError ?? createInvalidTokenError(\"token signature invalid\");\n}\nexport function createJwksTokenVerifier(options) {\n const jwksUrl = toUrl(options.jwksUrl, \"jwksUrl\");\n const clockSkewSeconds = options.clockSkewSeconds ?? 30;\n const allowedAlgorithms = options.allowedAlgorithms ?? DEFAULT_ALLOWED_ALGORITHMS;\n const fetchImplementation = options.fetch ?? globalThis.fetch;\n if (typeof fetchImplementation !== \"function\") {\n throw new Error(\"fetch is not available; pass options.fetch explicitly\");\n }\n return {\n async verify(input) {\n const expectedResource = canonicalizeResourceIndicator(input.resource);\n const algorithm = resolveAlgorithm(input.token, allowedAlgorithms);\n try {\n const jwks = await loadJwks(jwksUrl, fetchImplementation);\n const verified = await verifyJwtAgainstJwks({\n token: input.token,\n jwks,\n alg: algorithm,\n authorizationServers: input.authorizationServers,\n clockSkewSeconds,\n });\n const audience = normalizeVerifiedAudience(verified.payload.aud, expectedResource);\n const accessToken = toVerifiedAccessToken(input.token, verified.payload, audience);\n if (input.requiredScopes.length > 0\n && !accessToken.scopes.some((scope) => input.requiredScopes.includes(scope))) {\n throw createTokenVerificationError({\n error: \"insufficient_scope\",\n errorDescription: \"insufficient scope\",\n scope: [...input.requiredScopes],\n });\n }\n return accessToken;\n }\n catch (error) {\n throw normalizeVerificationError(error);\n }\n },\n };\n}\n", "import {\n McpClient,\n StdioTransport,\n type CallToolResult,\n type ContentItem,\n type ResourceContents,\n type Tool as McpTool\n} from \"tiny-mcp-client\";\nimport { AbortError } from \"./hooks.js\";\nimport { cloneMcpServerConfig } from \"./config.js\";\nimport type { McpServerConfig, PluginApi } from \"./plugin-types.js\";\nimport { toolResultPartToText } from \"./tool-results.js\";\nimport { assertValidToolName } from \"./tool-names.js\";\nimport type { Tool, ToolResult, ToolResultPart } from \"./types.js\";\nimport type { RunContext } from \"./run-context.js\";\n\nconst DEFAULT_MCP_CLIENT_INFO = {\n name: \"poe-agent\",\n version: \"0.0.1\"\n};\n\nexport class PluginApiImpl implements PluginApi {\n readonly #runContext: RunContext;\n readonly #pluginName?: string;\n #setupQueue: Promise<void> = Promise.resolve();\n\n constructor(runContext: RunContext, pluginName?: string) {\n this.#runContext = runContext;\n this.#pluginName = pluginName;\n }\n\n addTool(tool: Tool): void {\n assertValidToolName(tool.name, this.#pluginName);\n this.#runContext.tools.register(tool);\n }\n\n getTool(name: string) {\n return this.#runContext.tools.get(name);\n }\n\n addMcp(config: McpServerConfig): void {\n const clonedConfig = cloneMcpServerConfig(config);\n this.#runContext.mcpServers.push(clonedConfig);\n this.#setupQueue = this.#setupQueue.then(() => this.#setupMcp(clonedConfig));\n }\n\n async flushSetup(): Promise<void> {\n await this.#setupQueue;\n }\n\n async #setupMcp(config: McpServerConfig): Promise<void> {\n const transport = new StdioTransport({\n command: config.command,\n args: config.args,\n env:\n config.env === undefined\n ? undefined\n : {\n ...process.env,\n ...config.env\n }\n });\n const client = new McpClient({\n clientInfo: DEFAULT_MCP_CLIENT_INFO\n });\n\n this.#runContext.registerDisposeHook(async () => {\n await client.close?.();\n });\n assertNotAborted(this.#runContext.abortController.signal);\n await client.connect(transport);\n\n let cursor: string | undefined;\n\n while (true) {\n assertNotAborted(this.#runContext.abortController.signal);\n const page =\n cursor === undefined ? await client.listTools() : await client.listTools({ cursor });\n\n for (const tool of page.tools) {\n this.addTool(this.#toRuntimeTool(config, tool, client));\n }\n\n if (page.nextCursor === undefined) {\n return;\n }\n\n cursor = page.nextCursor;\n }\n }\n\n #toRuntimeTool(config: McpServerConfig, mcpTool: McpTool, client: McpClient): Tool {\n return {\n name: `${config.name}_${mcpTool.name}`,\n description: mcpTool.description,\n inputSchema: mcpTool.inputSchema,\n visibility: config.visibility ?? \"model\",\n policy: {\n read: false,\n edit: true\n },\n call: async (args, ctx) => {\n const result = await client.callTool(\n {\n name: mcpTool.name,\n arguments: toMcpArguments(args)\n },\n { signal: ctx.signal }\n );\n\n return callToolResultToToolResult(result);\n }\n };\n }\n}\n\nfunction assertNotAborted(signal: AbortSignal): void {\n if (!signal.aborted) {\n return;\n }\n\n throw new AbortError(\"Run aborted.\", signal.reason);\n}\n\nfunction toMcpArguments(args: unknown): Record<string, unknown> | undefined {\n if (typeof args !== \"object\" || args === null || Array.isArray(args)) {\n return undefined;\n }\n\n return args as Record<string, unknown>;\n}\n\nfunction callToolResultToToolResult(result: CallToolResult): ToolResult {\n const content = result.content.map(contentItemToToolResultPart);\n\n if (result.isError) {\n return {\n type: \"error\",\n code: \"mcp_tool_error\",\n message: content.map((part) => toolResultPartToText(part)).join(\"\\n\"),\n retriable: false\n };\n }\n\n if (content.length === 0) {\n return \"\";\n }\n\n if (content.length === 1) {\n const [single] = content;\n return single.type === \"text\" ? single.text : single;\n }\n\n return content;\n}\n\nfunction contentItemToToolResultPart(item: ContentItem): ToolResultPart {\n switch (item.type) {\n case \"text\":\n return { type: \"text\", text: item.text };\n case \"image\":\n return {\n type: \"image\",\n mimeType: item.mimeType,\n data: item.data\n };\n case \"audio\":\n return {\n type: \"text\",\n text: `[audio: ${item.mimeType}]`\n };\n case \"resource\":\n return {\n type: \"text\",\n text: resourceToString(item.resource)\n };\n }\n}\n\nfunction resourceToString(resource: ResourceContents): string {\n if (\"text\" in resource) {\n return resource.text;\n }\n\n return `[blob: ${resource.uri}]`;\n}\n", "import { PluginSetupError, PromptTransformError } from \"./errors.js\";\nimport type { AgentPlugin } from \"./plugin-types.js\";\nimport { PluginApiImpl } from \"./plugin-api-impl.js\";\nimport type { RunContext } from \"./run-context.js\";\nimport { assertValidToolName } from \"./tool-names.js\";\n\nexport async function runPluginSetup(plugins: AgentPlugin[], runContext: RunContext): Promise<void> {\n for (const plugin of plugins) {\n const contributor = `plugin: ${plugin.name}`;\n const api = new PluginApiImpl(runContext, contributor);\n let setupError: unknown;\n\n try {\n for (const tool of plugin.tools ?? []) {\n assertValidToolName(tool.name, contributor);\n runContext.tools.register(tool);\n }\n\n if (plugin.prompt) {\n runContext.prompts.addTransform(async ctx => {\n try {\n return await plugin.prompt!(ctx);\n } catch (error) {\n throw new PromptTransformError(plugin.name, error);\n }\n });\n }\n\n runContext.hooks.add(plugin);\n\n if (plugin.setup) {\n await plugin.setup(api);\n }\n\n await api.flushSetup();\n\n if (plugin.dispose) {\n runContext.registerDisposeHook(async () => {\n await plugin.dispose!();\n });\n }\n } catch (error) {\n setupError = error;\n }\n\n if (setupError === undefined) {\n continue;\n }\n\n const finalSetupError = await settleMcpSetupError(api, setupError);\n\n try {\n await runContext.dispose();\n } catch (disposeError) {\n throw new PluginSetupError(\n plugin.name,\n new AggregateError(\n [finalSetupError, disposeError],\n `Plugin setup/disposal failed for \"${plugin.name}\".`,\n ),\n );\n }\n\n throw new PluginSetupError(plugin.name, finalSetupError);\n }\n}\n\nasync function settleMcpSetupError(api: PluginApiImpl, setupError: unknown): Promise<unknown> {\n try {\n await api.flushSetup();\n return setupError;\n } catch (mcpSetupError) {\n if (mcpSetupError === setupError) {\n return setupError;\n }\n\n return new AggregateError(\n [setupError, mcpSetupError],\n \"Plugin setup and MCP discovery both failed.\",\n );\n }\n}\n", "import type { AgentPlugin, Provider } from \"./plugin-types.js\";\nimport { getResolvedPluginOptions, setResolvedProviderOptions } from \"./provider-metadata.js\";\n\nfunction formatProviderNames(providerNames: string[]): string {\n return providerNames.length === 0 ? \"(none)\" : providerNames.join(\", \");\n}\n\ntype ProviderResolutionErrorOptions = {\n modelId: string;\n providerNames: string[];\n providerName?: string;\n cause?: unknown;\n};\n\nexport class ProviderResolutionError extends Error {\n readonly modelId: string;\n readonly providerNames: string[];\n readonly providerName?: string;\n\n constructor(options: ProviderResolutionErrorOptions) {\n const message =\n options.providerName === undefined\n ? `No provider supports model \"${options.modelId}\". Registered providers: ${formatProviderNames(options.providerNames)}.`\n : `Provider \"${options.providerName}\" failed while resolving model \"${options.modelId}\". Registered providers: ${formatProviderNames(options.providerNames)}.`;\n\n super(message, { cause: options.cause });\n this.name = \"ProviderResolutionError\";\n this.modelId = options.modelId;\n this.providerNames = [...options.providerNames];\n this.providerName = options.providerName;\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\nexport class DuplicateProviderNameError extends Error {\n readonly providerName: string;\n readonly pluginEntries: string[];\n\n constructor(providerName: string, pluginEntries: string[]) {\n super(\n `Provider name collision: \"${providerName}\" is already registered by ${pluginEntries.join(\", \")}.`\n );\n this.name = \"DuplicateProviderNameError\";\n this.providerName = providerName;\n this.pluginEntries = [...pluginEntries];\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\nexport function collectProviders(plugins: AgentPlugin[]): Provider[] {\n const providers: Provider[] = [];\n const providerEntriesByName = new Map<string, string[]>();\n\n for (const plugin of plugins) {\n if (!plugin.providers || plugin.providers.length === 0) {\n continue;\n }\n\n for (const [providerIndex, provider] of plugin.providers.entries()) {\n const pluginEntry = `${plugin.name}.providers[${providerIndex}]`;\n const existingEntries = providerEntriesByName.get(provider.name);\n\n if (existingEntries) {\n throw new DuplicateProviderNameError(provider.name, [...existingEntries, pluginEntry]);\n }\n\n providerEntriesByName.set(provider.name, [pluginEntry]);\n providers.push(setResolvedProviderOptions(provider, getResolvedPluginOptions(plugin)));\n }\n }\n\n return providers;\n}\n\nexport function resolveProvider(providers: Provider[], modelId: string): Provider {\n const providerNames = providers.map((provider) => provider.name);\n\n for (const provider of providers) {\n let supported: boolean;\n\n try {\n supported = provider.supports(modelId);\n } catch (error) {\n throw new ProviderResolutionError({\n modelId,\n providerNames,\n providerName: provider.name,\n cause: error\n });\n }\n\n if (supported) {\n return provider;\n }\n }\n\n throw new ProviderResolutionError({ modelId, providerNames });\n}\n", "import path from \"node:path\";\nimport type { SessionUpdate } from \"@poe-code/poe-acp-client\";\nimport type { AcpEvent } from \"./types.js\";\n\nexport function mapAcpEventToSessionUpdates(event: AcpEvent): SessionUpdate[] {\n if (event.type === \"message.delta\") {\n if (event.content.length === 0) return [];\n return [{ sessionUpdate: \"agent_message_chunk\", content: { type: \"text\", text: event.content } }];\n }\n\n if (event.type === \"tool.intent\") {\n return [\n {\n sessionUpdate: \"tool_call\",\n toolCallId: event.intentId,\n title: event.tool,\n kind: \"execute\",\n status: \"pending\",\n rawInput: event.args,\n },\n {\n sessionUpdate: \"tool_call_update\",\n toolCallId: event.intentId,\n kind: \"execute\",\n status: \"in_progress\",\n },\n ];\n }\n\n if (event.type === \"tool.result\") {\n return [\n {\n sessionUpdate: \"tool_call_update\",\n toolCallId: event.intentId,\n kind: \"execute\",\n status: \"completed\",\n rawOutput: event.result,\n },\n ];\n }\n\n if (event.type === \"tool.error\") {\n return [\n {\n sessionUpdate: \"tool_call_update\",\n toolCallId: event.intentId,\n kind: \"execute\",\n status: \"failed\",\n rawOutput: event.error,\n },\n ];\n }\n\n if (event.type === \"usage\") {\n const { inputTokens, outputTokens, cachedTokens, cacheCreationTokens } = event.usage;\n const nonCachedInput = Math.max(0, inputTokens - cachedTokens);\n return [\n {\n sessionUpdate: \"usage_update\",\n used: nonCachedInput,\n size: inputTokens,\n _meta: { inputTokens, outputTokens, cachedTokens, cacheCreationTokens },\n },\n ];\n }\n\n return [];\n}\n\nexport interface TranscriptWriter {\n write(event: AcpEvent): Promise<void>;\n close(): Promise<void>;\n readonly filePath: string;\n}\n\nexport interface TranscriptFsApi {\n mkdir(dir: string, options: { recursive: true }): Promise<void>;\n appendFile(path: string, contents: string): Promise<void>;\n}\n\nexport interface CreateTranscriptWriterOptions {\n logPath?: string;\n logDir?: string;\n logFileName?: string;\n fs: TranscriptFsApi;\n pathJoin?: (...parts: string[]) => string;\n}\n\nexport function createTranscriptWriter(\n options: CreateTranscriptWriterOptions,\n): TranscriptWriter {\n const join = options.pathJoin ?? path.join;\n const filePath = resolveTranscriptFilePath(options, join);\n let dirEnsured: Promise<void> | undefined;\n let disabled = false;\n const logDir = path.dirname(filePath);\n\n const ensureDir = (): Promise<void> => {\n if (!dirEnsured) {\n dirEnsured = options.fs.mkdir(logDir, { recursive: true });\n }\n return dirEnsured;\n };\n\n return {\n filePath,\n async write(event: AcpEvent): Promise<void> {\n if (disabled) return;\n\n const updates = mapAcpEventToSessionUpdates(event);\n if (updates.length === 0) return;\n\n try {\n await ensureDir();\n const payload = updates.map(update => `${JSON.stringify(update)}\\n`).join(\"\");\n await options.fs.appendFile(filePath, payload);\n } catch {\n disabled = true;\n }\n },\n async close(): Promise<void> {\n // No persistent handle: appendFile opens/closes each write. Nothing to do.\n },\n };\n}\n\nfunction resolveTranscriptFilePath(\n options: CreateTranscriptWriterOptions,\n join: (...parts: string[]) => string,\n): string {\n if (options.logPath) {\n return options.logPath;\n }\n\n if (options.logDir && options.logFileName) {\n return join(options.logDir, options.logFileName);\n }\n\n throw new Error(\"createTranscriptWriter requires logPath or logDir + logFileName.\");\n}\n", "import { appendFile } from \"node:fs/promises\";\nimport type { AgentPlugin } from \"../runtime/plugin-types.js\";\n\nconst auditLog = (logPath: string): AgentPlugin => ({\n name: \"audit-log\",\n hooks: {\n async postToolUse(ctx) {\n await appendFile(logPath, `${JSON.stringify({ ts: new Date().toISOString(), tool: ctx.tool })}\\n`);\n },\n async postCompaction(ctx) {\n await appendFile(\n logPath,\n `${JSON.stringify({\n ts: new Date().toISOString(),\n event: \"compaction\",\n summary: ctx.summary,\n droppedMessageCount: ctx.droppedMessages.length,\n })}\\n`,\n );\n },\n },\n});\n\nexport default auditLog;\n", "import { spawn as spawnChildProcess } from \"node:child_process\";\nimport { registerExecutionEnvFactory } from \"@poe-code/agent-harness-tools\";\nimport type { ExecutionEnvFactory, OpenedEnv, RunSpec } from \"@poe-code/agent-harness-tools\";\nimport { dockerExecutionEnvFactory, hostExecutionEnvFactory } from \"@poe-code/process-runner\";\nimport { e2bExecutionEnvFactory } from \"@poe-code/runner-e2b\";\n\nregisterExecutionEnvFactory(hostExecutionEnvFactory);\nregisterExecutionEnvFactory(dockerExecutionEnvFactory);\nregisterExecutionEnvFactory(e2bExecutionEnvFactory);\n\nif (isVitest()) {\n registerExecutionEnvFactory(createTestHostExecutionEnvFactory());\n}\n\nfunction isVitest(): boolean {\n return process.env.VITEST !== undefined || process.env.VITEST_POOL_ID !== undefined;\n}\n\nfunction createTestHostExecutionEnvFactory(): ExecutionEnvFactory {\n return {\n type: \"host\",\n supportsDetach: false,\n open: ((openSpec: Parameters<ExecutionEnvFactory[\"open\"]>[0]) => {\n return {\n id: \"host\",\n job: null,\n async uploadWorkspace() {\n return { files: 0, bytes: 0, skipped: [] };\n },\n async downloadWorkspace() {\n return { files: 0, bytes: 0, conflicts: [] };\n },\n exec(spec) {\n return runHost(spawnChildProcess, spec);\n },\n async detach() {\n throw new Error(\n \"host runtime does not support detach because host has no addressable env\"\n );\n },\n shell() {\n return runHost(spawnChildProcess, {\n command: openSpec.shellSpec?.command ?? openSpec.env.SHELL ?? process.env.SHELL ?? \"sh\",\n args: openSpec.shellSpec?.args,\n cwd: openSpec.cwd,\n env:\n openSpec.shellSpec && \"env\" in openSpec.shellSpec\n ? openSpec.shellSpec.env\n : openSpec.env,\n stdin: \"inherit\",\n stdout: \"inherit\",\n stderr: \"inherit\",\n tty: true\n });\n },\n async close() {}\n } as OpenedEnv;\n }) as unknown as ExecutionEnvFactory[\"open\"],\n async attach() {\n throw new Error(\"host runtime does not support reattach\");\n }\n };\n}\n\nfunction runHost(spawnProcess: typeof import(\"node:child_process\").spawn, spec: RunSpec) {\n const stdin = spec.stdin ?? \"ignore\";\n const stdout = spec.stdout ?? \"pipe\";\n const stderr = spec.stderr ?? \"pipe\";\n const stdio =\n stdin === \"inherit\" && stdout === \"inherit\" && stderr === \"inherit\"\n ? \"inherit\"\n : ([stdin, stdout, stderr] as [\n \"pipe\" | \"inherit\" | \"ignore\",\n \"pipe\" | \"inherit\",\n \"pipe\" | \"inherit\"\n ]);\n const child = spawnProcess(spec.command, spec.args ?? [], {\n cwd: spec.cwd,\n env: spec.env,\n stdio\n });\n const result = new Promise<{ exitCode: number }>((resolve) => {\n child.once(\"close\", (code) => {\n resolve({ exitCode: code ?? 1 });\n });\n child.once(\"error\", () => {\n resolve({ exitCode: 1 });\n });\n });\n const kill = (signal?: NodeJS.Signals) => {\n child.kill(signal);\n };\n if (spec.signal?.aborted) {\n kill(\"SIGTERM\");\n } else {\n spec.signal?.addEventListener(\"abort\", () => kill(\"SIGTERM\"), { once: true });\n }\n return {\n pid: child.pid ?? null,\n stdin: child.stdin,\n stdout: child.stdout,\n stderr: child.stderr,\n result,\n kill\n };\n}\n", "import path from \"node:path\";\n\nexport function resolveWorkflowPath(inputPath: string, cwd: string, homeDir: string): string {\n if (inputPath.startsWith(\"~/\")) {\n return path.join(homeDir, inputPath.slice(2));\n }\n\n if (inputPath === \"~\") {\n return homeDir;\n }\n\n return path.isAbsolute(inputPath) ? inputPath : path.resolve(cwd, inputPath);\n}\n\nexport interface DiscoverDocsOptions {\n cwd: string;\n homeDir: string;\n subDirectory: string;\n glob?: string;\n fs: { readdir: (path: string) => Promise<string[]> };\n}\n\nfunction isMissingDirectory(error: unknown): boolean {\n return (\n !!error &&\n typeof error === \"object\" &&\n \"code\" in error &&\n ((error as { code?: unknown }).code === \"ENOENT\" ||\n (error as { code?: unknown }).code === \"ENOTDIR\")\n );\n}\n\nfunction defaultGlobForSubDirectory(subDirectory: string): string {\n return subDirectory.startsWith(\"pipeline/\") ? \"*.yaml\" : \"*.md\";\n}\n\nfunction matchesGlob(fileName: string, glob: string): boolean {\n if (glob === \"*\") {\n return true;\n }\n\n if (glob.startsWith(\"*.\")) {\n const suffix = glob.slice(1).toLowerCase();\n return fileName.toLowerCase().endsWith(suffix);\n }\n\n return fileName === glob;\n}\n\nasync function readDirectory(\n fs: DiscoverDocsOptions[\"fs\"],\n directoryPath: string\n): Promise<string[]> {\n try {\n return await fs.readdir(directoryPath);\n } catch (error) {\n if (isMissingDirectory(error)) {\n return [];\n }\n\n throw error;\n }\n}\n\nasync function discoverFromDirectory(options: {\n fs: DiscoverDocsOptions[\"fs\"];\n directoryPath: string;\n glob: string;\n}): Promise<Array<{ fileName: string; absolutePath: string }>> {\n const entries = await readDirectory(options.fs, options.directoryPath);\n\n return entries\n .filter((entry) => matchesGlob(entry, options.glob))\n .map((entry) => ({\n fileName: entry,\n absolutePath: path.join(options.directoryPath, entry)\n }));\n}\n\nexport async function discoverWorkflowDocs(options: DiscoverDocsOptions): Promise<string[]> {\n const glob = options.glob ?? defaultGlobForSubDirectory(options.subDirectory);\n const projectDirectory = path.join(options.cwd, \".poe-code\", options.subDirectory);\n const globalDirectory = path.join(options.homeDir, \".poe-code\", options.subDirectory);\n\n const [projectDocs, globalDocs] = await Promise.all([\n discoverFromDirectory({\n fs: options.fs,\n directoryPath: projectDirectory,\n glob\n }),\n discoverFromDirectory({\n fs: options.fs,\n directoryPath: globalDirectory,\n glob\n })\n ]);\n\n const docsByFileName = new Map<string, string>();\n\n for (const doc of globalDocs) {\n docsByFileName.set(doc.fileName, doc.absolutePath);\n }\n\n for (const doc of projectDocs) {\n docsByFileName.set(doc.fileName, doc.absolutePath);\n }\n\n return [...docsByFileName.values()].sort((left, right) => left.localeCompare(right));\n}\n", "import * as fsPromises from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { openTaskList, type TaskList, type TaskListFs } from \"@poe-code/task-list\";\nimport { resolveWorkflowPath } from \"./paths.js\";\n\nconst PLAN_LIST_NAME = \"plans\";\nconst MARKDOWN_EXTENSION = \".md\";\n\nexport interface PlanRef {\n id: string;\n absolutePath: string;\n displayPath: string;\n kind: string;\n name: string;\n}\n\nexport interface DiscoverPlansOptions {\n cwd: string;\n homeDir: string;\n planDirectory: string;\n kinds?: readonly string[];\n fs?: TaskListFs;\n}\n\nexport interface ArchivePlanOptions {\n cwd: string;\n homeDir: string;\n planDirectory: string;\n id: string;\n fs?: TaskListFs;\n}\n\nexport interface OpenPlanListOptions {\n cwd: string;\n homeDir: string;\n planDirectory: string;\n fs?: TaskListFs;\n}\n\nfunction defaultFs(): TaskListFs {\n return fsPromises as unknown as TaskListFs;\n}\n\nfunction hasErrorCode(error: unknown, code: string): boolean {\n return (\n !!error &&\n typeof error === \"object\" &&\n \"code\" in error &&\n (error as { code?: unknown }).code === code\n );\n}\n\nasync function directoryExists(fs: TaskListFs, directoryPath: string): Promise<boolean> {\n try {\n return (await fs.stat(directoryPath)).isDirectory();\n } catch (error) {\n if (hasErrorCode(error, \"ENOENT\") || hasErrorCode(error, \"ENOTDIR\")) {\n return false;\n }\n\n throw error;\n }\n}\n\nfunction stripMarkdownExtension(fileName: string): string | undefined {\n if (!fileName.endsWith(MARKDOWN_EXTENSION)) {\n return undefined;\n }\n\n return fileName.slice(0, -MARKDOWN_EXTENSION.length);\n}\n\nfunction idFromPlanFileName(fileName: string): string | undefined {\n const stem = stripMarkdownExtension(fileName);\n if (stem === undefined) {\n return undefined;\n }\n\n let index = 0;\n while (index < stem.length && stem.charCodeAt(index) >= 48 && stem.charCodeAt(index) <= 57) {\n index += 1;\n }\n\n if (index > 0 && stem[index] === \"-\" && index < stem.length - 1) {\n return stem.slice(index + 1);\n }\n\n return stem;\n}\n\nasync function readPlanPaths(fs: TaskListFs, directoryPath: string): Promise<Map<string, string>> {\n const fileNames = await fs.readdir(directoryPath);\n const pathsById = new Map<string, string>();\n\n for (const fileName of fileNames) {\n const id = idFromPlanFileName(fileName);\n if (id === undefined) {\n continue;\n }\n\n const absolutePath = path.join(directoryPath, fileName);\n const stat = await fs.stat(absolutePath);\n if (stat.isFile()) {\n pathsById.set(id, absolutePath);\n }\n }\n\n return pathsById;\n}\n\nfunction isPathWithin(basePath: string, targetPath: string): boolean {\n const relativePath = path.relative(basePath, targetPath);\n\n return relativePath === \"\" || (!relativePath.startsWith(\"..\") && !path.isAbsolute(relativePath));\n}\n\nfunction displayPlanPath(absolutePath: string, cwd: string, homeDir: string): string {\n if (isPathWithin(cwd, absolutePath)) {\n return path.relative(cwd, absolutePath);\n }\n\n if (isPathWithin(homeDir, absolutePath)) {\n const relativeToHome = path.relative(homeDir, absolutePath);\n return relativeToHome.length === 0 ? \"~\" : `~/${relativeToHome}`;\n }\n\n return absolutePath;\n}\n\nfunction resolvePlanDirectory(options: {\n cwd: string;\n homeDir: string;\n planDirectory: string;\n}): string {\n return resolveWorkflowPath(options.planDirectory, options.cwd, options.homeDir);\n}\n\nfunction planKind(metadata: Record<string, unknown>): string {\n return String(metadata.kind ?? \"plan\");\n}\n\nexport async function discoverPlans(options: DiscoverPlansOptions): Promise<PlanRef[]> {\n const resolvedDirectory = resolvePlanDirectory(options);\n const fs = options.fs ?? defaultFs();\n if (!(await directoryExists(fs, resolvedDirectory))) {\n return [];\n }\n\n const [taskList, pathsById] = await Promise.all([\n openPlanList(options),\n readPlanPaths(fs, resolvedDirectory)\n ]);\n const kindFilter = options.kinds === undefined ? undefined : new Set(options.kinds);\n const tasks = await taskList.list(PLAN_LIST_NAME).all();\n\n return tasks\n .map((task) => ({\n id: task.id,\n name: task.name,\n kind: planKind(task.metadata),\n absolutePath: pathsById.get(task.id) ?? path.join(resolvedDirectory, `${task.id}.md`)\n }))\n .filter((plan) => kindFilter === undefined || kindFilter.has(plan.kind))\n .map((plan) => ({\n ...plan,\n displayPath: displayPlanPath(plan.absolutePath, options.cwd, options.homeDir)\n }));\n}\n\nexport const archivePlan = async (options: ArchivePlanOptions): Promise<void> => {\n const taskList = await openPlanList(options);\n const plans = taskList.list(PLAN_LIST_NAME);\n\n await plans.fire(options.id, \"archive\");\n};\n\nexport function openPlanList(options: OpenPlanListOptions): Promise<TaskList> {\n return openTaskList({\n type: \"markdown-dir\",\n path: resolvePlanDirectory(options),\n singleList: PLAN_LIST_NAME,\n frontmatterMode: \"passthrough\",\n fs: options.fs\n });\n}\n", "import * as fsPromises from \"node:fs/promises\";\nimport { ghIssuesBackend } from \"./backends/gh-issues.js\";\nimport { resolveAuth, resolveEndpoint } from \"./backends/gh-issues-client.js\";\nimport { markdownDirBackend } from \"./backends/markdown-dir.js\";\nimport { yamlFileBackend } from \"./backends/yaml-file.js\";\nimport { validateMachine } from \"./state-machine.js\";\nimport { resolveStateMachine } from \"./state.js\";\nimport type {\n BackendFactory,\n BackendDeps,\n OpenGhIssuesOptions,\n OpenMarkdownDirOptions,\n OpenTaskListOptions,\n OpenYamlFileOptions,\n TaskList,\n TaskListFs\n} from \"./types.js\";\n\nconst DEFAULT_LOCK_STALE_MS = 30_000;\nconst DEFAULT_LOCK_RETRIES = 20;\n\ntype FileBackendOptions = OpenMarkdownDirOptions | OpenYamlFileOptions;\n\nexport const backendFactories: Record<FileBackendOptions[\"type\"], BackendFactory> = {\n \"markdown-dir\": markdownDirBackend,\n \"yaml-file\": yamlFileBackend\n};\n\nfunction createDefaultFs(): TaskListFs {\n return fsPromises as unknown as TaskListFs;\n}\n\nexport async function openTaskList(options: OpenTaskListOptions): Promise<TaskList> {\n switch (options.type) {\n case \"markdown-dir\":\n case \"yaml-file\":\n return openFileBackend(options);\n case \"gh-issues\":\n return openGhIssuesBackend(options);\n default:\n throw new Error(`Unknown task list backend type \"${(options as { type: string }).type}\".`);\n }\n}\n\nasync function openFileBackend(options: FileBackendOptions): Promise<TaskList> {\n const factory = backendFactories[options.type];\n const stateMachine = resolveStateMachine(options.stateMachine);\n validateMachine(stateMachine);\n const markdownOptions = options.type === \"markdown-dir\" ? options : undefined;\n\n const deps: BackendDeps = {\n path: options.path,\n defaults: {\n metadata: { ...(options.defaults?.metadata ?? {}) }\n },\n singleList: markdownOptions?.singleList,\n frontmatterMode: markdownOptions?.frontmatterMode ?? \"strict\",\n lockStaleMs: options.lockStaleMs ?? DEFAULT_LOCK_STALE_MS,\n lockRetries: options.lockRetries ?? DEFAULT_LOCK_RETRIES,\n create: options.create ?? false,\n fs: options.fs ?? createDefaultFs(),\n stateMachine\n };\n\n return factory(deps);\n}\n\nasync function openGhIssuesBackend(options: OpenGhIssuesOptions): Promise<TaskList> {\n const token = await resolveAuth({ explicitToken: options.auth?.token });\n const endpoint = resolveEndpoint();\n\n return ghIssuesBackend({\n repo: options.repo,\n project: options.project,\n defaults: {\n metadata: { ...(options.defaults?.metadata ?? {}) }\n },\n token,\n endpoint,\n fetch: options.fetch\n });\n}\n", "import type { Task } from \"./types.js\";\n\nexport interface StateMachineDef<TState extends string = string, TEvent extends string = string> {\n readonly initial: TState;\n readonly states: readonly TState[];\n readonly events: Readonly<Record<TEvent, EventDef<TState>>>;\n}\n\nexport interface EventDef<TState extends string = string> {\n readonly from: readonly TState[] | \"*\";\n readonly to: TState;\n readonly guard?: (task: Task) => true | string;\n readonly onEnter?: (task: Task) => void | Promise<void>;\n readonly onExit?: (task: Task) => void | Promise<void>;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isStateList(value: unknown): value is readonly string[] {\n return Array.isArray(value) && value.every((entry) => typeof entry === \"string\");\n}\n\nfunction canFireFromState<TState extends string>(event: EventDef<TState>, fromState: string): boolean {\n if (event.from === \"*\") {\n return event.to !== fromState;\n }\n\n return event.from.includes(fromState as TState);\n}\n\nexport function validateMachine(machine: StateMachineDef): void {\n if (!isRecord(machine)) {\n throw new TypeError(\"State machine must be an object.\");\n }\n\n if (!isStateList(machine.states)) {\n throw new TypeError(\"State machine states must be a string array.\");\n }\n\n const states = new Set(machine.states);\n\n if (typeof machine.initial !== \"string\") {\n throw new TypeError(\"State machine initial must be a string.\");\n }\n\n if (!states.has(machine.initial)) {\n throw new Error(`Initial state \"${machine.initial}\" is not declared.`);\n }\n\n if (!isRecord(machine.events)) {\n throw new TypeError(\"State machine events must be an object.\");\n }\n\n for (const [eventName, event] of Object.entries(machine.events)) {\n if (!isRecord(event)) {\n throw new TypeError(`Event \"${eventName}\" must be an object.`);\n }\n\n if (event.from !== \"*\" && !isStateList(event.from)) {\n throw new TypeError(`Event \"${eventName}\" has an invalid \"from\" definition.`);\n }\n\n if (typeof event.to !== \"string\") {\n throw new TypeError(`Event \"${eventName}\" target state must be a string.`);\n }\n\n if (!states.has(event.to)) {\n throw new Error(`Event \"${eventName}\" references unknown target state \"${event.to}\".`);\n }\n\n if (event.from !== \"*\") {\n for (const fromState of event.from) {\n if (!states.has(fromState)) {\n throw new Error(`Event \"${eventName}\" references unknown source state \"${fromState}\".`);\n }\n }\n }\n }\n}\n\nexport function eventsFromState<TState extends string, TEvent extends string>(\n machine: StateMachineDef<TState, TEvent>,\n fromState: TState\n): readonly TEvent[] {\n const events: TEvent[] = [];\n\n for (const [eventName, event] of Object.entries(machine.events) as Array<[TEvent, EventDef<TState>]>) {\n if (canFireFromState(event, fromState)) {\n events.push(eventName);\n }\n }\n\n return events;\n}\n\nexport function findEvent<TState extends string, TEvent extends string>(\n machine: StateMachineDef<TState, TEvent>,\n fromState: TState,\n eventName: TEvent\n): EventDef<TState> | undefined {\n const event = machine.events[eventName];\n\n if (event === undefined) {\n return undefined;\n }\n\n return canFireFromState(event, fromState) ? event : undefined;\n}\n", "import { text } from \"node:stream/consumers\";\nimport { createHostRunner, type Runner } from \"@poe-code/process-runner\";\n\nconst DEFAULT_ENDPOINT = \"https://api.github.com/graphql\";\nconst USER_AGENT = \"poe-code-task-list/0.0.1\";\nconst AUTH_ERROR = \"gh auth token failed; install gh, run 'gh auth login', or pass auth: { token }\";\n\nexport interface GhClientOptions {\n token: string;\n endpoint?: string;\n fetch?: typeof fetch;\n}\n\nexport interface GhClient {\n graphql<T>(query: string, variables: Record<string, unknown>): Promise<T>;\n}\n\nexport function createGhClient(options: GhClientOptions): GhClient {\n const fetchImpl = options.fetch ?? fetch;\n const endpoint = options.endpoint || DEFAULT_ENDPOINT;\n\n return {\n async graphql<T>(query: string, variables: Record<string, unknown>) {\n const response = await fetchImpl(endpoint, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${options.token}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": USER_AGENT\n },\n body: JSON.stringify({ query, variables })\n });\n\n const body = await response.text();\n if (response.status !== 200) {\n throw new Error(`GitHub GraphQL request failed with status ${response.status}: ${body}`);\n }\n\n const parsed = JSON.parse(body) as {\n data?: T;\n errors?: { message?: string }[];\n };\n const firstError = parsed.errors?.[0];\n if (firstError !== undefined) {\n throw new Error(firstError.message ?? \"GitHub GraphQL request failed\");\n }\n\n return parsed.data as T;\n }\n };\n}\n\nexport interface ResolveAuthOptions {\n explicitToken?: string;\n runner?: Runner;\n}\n\nexport async function resolveAuth(options: ResolveAuthOptions): Promise<string> {\n if (options.explicitToken !== undefined) {\n return options.explicitToken;\n }\n\n const runner = options.runner ?? createHostRunner();\n const handle = runner.exec({\n command: \"gh\",\n args: [\"auth\", \"token\"],\n stdout: \"pipe\",\n stderr: \"pipe\"\n });\n\n const [stdout, , result] = await Promise.all([\n handle.stdout === null ? Promise.resolve(\"\") : text(handle.stdout),\n handle.stderr === null ? Promise.resolve(\"\") : text(handle.stderr),\n handle.result\n ]);\n const token = stdout.trim();\n\n if (result.exitCode !== 0 || token.length === 0) {\n throw new Error(AUTH_ERROR);\n }\n\n return token;\n}\n\nexport interface ResolveEndpointOptions {\n env?: Record<string, string | undefined>;\n}\n\nexport function resolveEndpoint(options: ResolveEndpointOptions = {}): string {\n const env = options.env ?? process.env;\n const host = env.GH_HOST;\n\n if (host !== undefined && host !== \"\" && host !== \"github.com\") {\n return `https://${host}/api/graphql`;\n }\n\n return DEFAULT_ENDPOINT;\n}\n", "import { execSync } from \"node:child_process\";\nimport type { Engine } from \"../types.js\";\n\ninterface ColimaProfile {\n name?: string;\n profile?: string;\n status?: string;\n runtime?: string;\n}\n\nexport function detectContext(): string | null {\n try {\n const output = execSync(\"colima list --json\", {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"ignore\"]\n });\n const lines = output.trim().split(\"\\n\").filter(Boolean);\n\n for (const line of lines) {\n const profile = JSON.parse(line) as ColimaProfile;\n\n if (profile.status === \"Running\" && profile.runtime === \"docker\") {\n const name = profile.name ?? profile.profile;\n\n if (!name) {\n continue;\n }\n\n return name === \"default\" ? \"colima\" : `colima-${name}`;\n }\n }\n } catch {\n return null;\n }\n\n return null;\n}\n\nexport function buildContextArgs(engine: Engine, context: string | null): string[] {\n if (engine === \"docker\" && context) {\n return [\"--context\", context];\n }\n\n return [];\n}\n", "import { execSync } from \"node:child_process\";\nimport type { Engine } from \"../types.js\";\n\nexport function detectEngine(): Engine {\n if (isEngineAvailable(\"docker\")) {\n return \"docker\";\n }\n\n if (isEngineAvailable(\"podman\")) {\n return \"podman\";\n }\n\n throw new Error(\n \"No container engine found. Please install Docker or Podman:\\n\" +\n \" - Docker Desktop: https://www.docker.com/products/docker-desktop\\n\" +\n \" - Colima (macOS): brew install colima && colima start\\n\" +\n \" - Podman: https://podman.io/docs/installation\"\n );\n}\n\nexport function isEngineAvailable(engine: Engine): boolean {\n try {\n execSync(`${engine} --version`, {\n stdio: \"ignore\"\n });\n return true;\n } catch {\n return false;\n }\n}\n", "import * as childProcess from \"node:child_process\";\nimport { randomBytes } from \"node:crypto\";\nimport { buildDockerRunArgs } from \"./args.js\";\nimport { buildContextArgs, detectContext } from \"./context.js\";\nimport { detectEngine } from \"./engine.js\";\nimport type { DockerRunnerOptions, RunHandle, Runner, RunResult, RunSpec } from \"../types.js\";\n\nexport function createDockerRunner(options: DockerRunnerOptions): Runner {\n const engine = options.engine ?? detectEngine();\n const context = options.context ?? detectContext();\n\n return {\n name: \"docker\",\n exec(spec: RunSpec): RunHandle {\n const stdinMode = spec.stdin ?? \"ignore\";\n const stdoutMode = spec.stdout ?? \"pipe\";\n const stderrMode = spec.stderr ?? \"pipe\";\n const interactiveMode =\n stdinMode === \"inherit\" &&\n stdoutMode === \"inherit\" &&\n stderrMode === \"inherit\" &&\n spec.tty === true;\n const containerName = buildContainerName(options.containerName ?? spec.command);\n const runArgs = buildDockerRunArgs({\n engine,\n context,\n image: options.image,\n command: spec.command,\n args: spec.args ?? [],\n cwd: spec.cwd,\n env: spec.env,\n mounts: options.mounts ?? [],\n ports: options.ports ?? [],\n network: options.network,\n containerName,\n detached: false,\n interactive: stdinMode === \"pipe\" || stdinMode === \"inherit\",\n tty: spec.tty ?? false,\n rm: true,\n extraArgs: options.extraArgs ?? []\n });\n const [command, ...args] = runArgs;\n const child = childProcess.spawn(command, args, {\n stdio: interactiveMode ? \"inherit\" : [stdinMode, stdoutMode, stderrMode]\n });\n let isResultSettled = false;\n let resolveResult: ((value: RunResult) => void) | null = null;\n const result = new Promise<RunResult>((resolve) => {\n resolveResult = resolve;\n });\n const cleanupAbort = bindAbortSignal(spec.signal, () => {\n spawnControlCommand(engine, context, [\"stop\", containerName]);\n });\n const settleResult = (exitCode: number) => {\n if (isResultSettled) {\n return;\n }\n\n isResultSettled = true;\n cleanupAbort();\n resolveResult?.({ exitCode });\n };\n\n child.once(\"error\", () => {\n settleResult(1);\n });\n\n child.once(\"close\", (code) => {\n settleResult(code ?? 1);\n });\n\n return {\n pid: null,\n stdin: interactiveMode ? null : child.stdin,\n stdout: interactiveMode ? null : child.stdout,\n stderr: interactiveMode ? null : child.stderr,\n result,\n kill(signal?: NodeJS.Signals) {\n if (signal === \"SIGKILL\") {\n spawnControlCommand(engine, context, [\"kill\", containerName]);\n return;\n }\n\n if (signal === undefined || signal === \"SIGTERM\") {\n spawnControlCommand(engine, context, [\"stop\", containerName]);\n return;\n }\n\n spawnControlCommand(engine, context, [\"kill\", `--signal=${signal}`, containerName]);\n }\n };\n }\n };\n}\n\nfunction buildContainerName(name: string): string {\n const suffix = randomBytes(3).toString(\"hex\").slice(0, 6);\n const sanitizedName = sanitizeContainerName(name);\n\n return `poe-run-${sanitizedName}-${suffix}`;\n}\n\nfunction sanitizeContainerName(name: string): string {\n let sanitized = \"\";\n\n for (const char of name) {\n if (isContainerNameCharacter(char)) {\n sanitized += char;\n continue;\n }\n\n sanitized += \"-\";\n }\n\n return sanitized.length > 0 ? sanitized : \"command\";\n}\n\nfunction isContainerNameCharacter(char: string): boolean {\n const code = char.charCodeAt(0);\n\n if (code >= 48 && code <= 57) {\n return true;\n }\n\n if (code >= 65 && code <= 90) {\n return true;\n }\n\n if (code >= 97 && code <= 122) {\n return true;\n }\n\n return char === \".\" || char === \"_\" || char === \"-\";\n}\n\nfunction spawnControlCommand(\n engine: DockerRunnerOptions[\"engine\"] extends infer T ? Exclude<T, undefined> : never,\n context: string | null,\n args: string[]\n): void {\n childProcess.spawn(engine, [...buildContextArgs(engine, context), ...args], {\n stdio: \"ignore\"\n });\n}\n\nfunction bindAbortSignal(signal: AbortSignal | undefined, onAbort: () => void): () => void {\n if (signal === undefined) {\n return () => {};\n }\n\n if (signal.aborted) {\n onAbort();\n return () => {};\n }\n\n signal.addEventListener(\"abort\", onAbort, { once: true });\n\n return () => {\n signal.removeEventListener(\"abort\", onAbort);\n };\n}\n", "import path from \"node:path\";\nimport type { DockerRunArgs } from \"../types.js\";\n\nexport function buildDockerRunArgs(input: DockerRunArgs): string[] {\n const args: string[] = [input.engine];\n\n if (input.engine === \"docker\" && input.context) {\n args.push(\"--context\", input.context);\n }\n\n args.push(\"run\");\n\n if (input.rm) {\n args.push(\"--rm\");\n }\n\n if (input.detached) {\n args.push(\"-d\");\n }\n\n if (input.interactive) {\n args.push(\"-i\");\n }\n\n if (input.tty) {\n args.push(\"-t\");\n }\n\n args.push(\"--name\", input.containerName);\n\n if (input.cwd !== undefined) {\n args.push(\"-w\", input.cwd);\n }\n\n for (const [key, value] of Object.entries(input.env ?? {})) {\n args.push(\"-e\", `${key}=${value}`);\n }\n\n for (const mount of input.mounts) {\n const volume = `${path.resolve(mount.source)}:${mount.target}${mount.readonly ? \":ro\" : \"\"}`;\n args.push(\"-v\", volume);\n }\n\n for (const port of input.ports) {\n const mapping = `${port.host}:${port.container}${port.protocol === undefined || port.protocol === \"tcp\" ? \"\" : `/${port.protocol}`}`;\n args.push(\"-p\", mapping);\n }\n\n if (input.network !== undefined) {\n args.push(\"--network\", input.network);\n }\n\n args.push(...input.extraArgs, input.image, input.command, ...input.args);\n\n return args;\n}\n", "import { createHash, randomBytes } from \"node:crypto\";\nimport { mkdtempSync, rmSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport path from \"node:path\";\nimport { buildDockerRunArgs } from \"./args.js\";\nimport { buildContextArgs, detectContext } from \"./context.js\";\nimport { detectEngine } from \"./engine.js\";\nimport { createHostRunner } from \"../host/host-runner.js\";\nimport type {\n DockerMount,\n Engine,\n ExecutionState,\n ExecutionEnvFactory,\n OpenSpec,\n OpenedEnv,\n Runner,\n RunSpec\n} from \"../types.js\";\n\ninterface DockerRuntime {\n type: \"docker\";\n image?: string;\n dockerfile?: string;\n build_context?: string;\n build_args?: Record<string, string>;\n mounts?: DockerMount[];\n engine?: Engine;\n network?: string;\n extra_args?: string[];\n}\n\nexport interface BuildDockerRuntimeTemplateInput {\n cwd: string;\n runtime: DockerRuntime;\n state?: ExecutionState;\n runner?: Runner;\n force?: boolean;\n}\n\nexport interface BuildDockerRuntimeTemplateResult {\n backend: \"docker\";\n hash: string;\n image: string;\n cached: boolean;\n}\n\nconst containerCommand = [\"sh\", \"-c\", \"while :; do sleep 3600; done\"] as const;\n\nexport const dockerExecutionEnvFactory: ExecutionEnvFactory = {\n type: \"docker\",\n supportsDetach: true,\n async open(spec): Promise<OpenedEnv> {\n const runtime = parseDockerRuntime(spec.runtime);\n const runner = spec.hostRunner ?? createHostRunner();\n const engine = runtime.engine ?? detectEngine();\n const context = detectContext();\n const image = await resolveImage({\n spec,\n runtime,\n runner,\n engine,\n context\n });\n const containerName = createContainerName();\n const runArgs = buildDockerRunArgs({\n engine,\n context,\n image,\n command: containerCommand[0],\n args: containerCommand.slice(1),\n cwd: undefined,\n env: undefined,\n mounts: runtime.mounts ?? [],\n ports: [],\n network: runtime.network,\n containerName,\n detached: true,\n interactive: true,\n tty: false,\n rm: false,\n extraArgs: runtime.extra_args ?? []\n });\n const [command, ...args] = runArgs;\n const id = (await runAndRead(runner, { command, args, stdout: \"pipe\", stderr: \"pipe\" })).trim();\n\n return createDockerEnv({\n id,\n spec,\n runner,\n engine,\n context\n });\n },\n async attach(envId, context): Promise<OpenedEnv> {\n const engine = detectEngine();\n return createDockerEnv({\n id: envId,\n spec: createAttachedSpec(context?.cwd),\n runner: createHostRunner(),\n engine,\n context: detectContext(),\n attachedJobId: context?.jobId\n });\n }\n};\n\nfunction createDockerEnv(input: {\n id: string;\n spec: OpenSpec;\n runner: Runner;\n engine: Engine;\n context: string | null;\n attachedJobId?: string;\n}): OpenedEnv {\n const containerRef = input.id;\n\n return {\n id: containerRef,\n job:\n input.attachedJobId === undefined\n ? null\n : createContainerJob(containerRef, input.runner, input.engine, input.context, input.attachedJobId),\n async uploadWorkspace() {\n const tempDir = mkdtempSync(path.join(tmpdir(), \"poe-docker-upload-\"));\n const archivePath = path.join(tempDir, \"workspace.tar\");\n try {\n const excludeArgs = input.spec.uploadIgnoreFiles.flatMap((ignored) => [\n \"--exclude\",\n ignored\n ]);\n const tarArgs = [...excludeArgs, \"-cf\", archivePath, \"-C\", input.spec.cwd, \".\"];\n await runOrThrow(input.runner, {\n command: \"tar\",\n args: tarArgs,\n stdout: \"pipe\",\n stderr: \"pipe\"\n });\n await runOrThrow(input.runner, {\n command: input.engine,\n args: [\n ...buildContextArgs(input.engine, input.context),\n \"cp\",\n archivePath,\n `${containerRef}:/tmp/poe-workspace-upload.tar`\n ],\n stdout: \"pipe\",\n stderr: \"pipe\"\n });\n await runOrThrow(input.runner, {\n command: input.engine,\n args: [\n ...buildContextArgs(input.engine, input.context),\n \"exec\",\n containerRef,\n \"sh\",\n \"-c\",\n `mkdir -p ${shellQuote(input.spec.cwd)} && tar -xf /tmp/poe-workspace-upload.tar -C ${shellQuote(input.spec.cwd)}`\n ],\n stdout: \"pipe\",\n stderr: \"pipe\"\n });\n\n return { files: 0, bytes: 0, skipped: [] };\n } finally {\n rmSync(tempDir, { recursive: true, force: true });\n }\n },\n async downloadWorkspace(opts) {\n const tempDir = mkdtempSync(path.join(tmpdir(), \"poe-docker-download-\"));\n const archivePath = path.join(tempDir, \"workspace.tar\");\n try {\n await runOrThrow(input.runner, {\n command: input.engine,\n args: [\n ...buildContextArgs(input.engine, input.context),\n \"exec\",\n containerRef,\n \"sh\",\n \"-c\",\n `tar -cf /tmp/poe-workspace-download.tar -C ${shellQuote(input.spec.cwd)} .`\n ],\n stdout: \"pipe\",\n stderr: \"pipe\"\n });\n await runOrThrow(input.runner, {\n command: input.engine,\n args: [\n ...buildContextArgs(input.engine, input.context),\n \"cp\",\n `${containerRef}:/tmp/poe-workspace-download.tar`,\n archivePath\n ],\n stdout: \"pipe\",\n stderr: \"pipe\"\n });\n const extractMode = opts.conflictPolicy === \"refuse\" ? \"-xkf\" : \"-xf\";\n await runOrThrow(input.runner, {\n command: \"tar\",\n args: [extractMode, archivePath, \"-C\", input.spec.cwd],\n stdout: \"pipe\",\n stderr: \"pipe\"\n });\n\n return { files: 0, bytes: 0, conflicts: [] };\n } finally {\n rmSync(tempDir, { recursive: true, force: true });\n }\n },\n exec(spec) {\n return input.runner.exec({\n command: input.engine,\n args: [\n ...buildContextArgs(input.engine, input.context),\n \"exec\",\n ...(spec.stdin === \"pipe\" || spec.stdin === \"inherit\" ? [\"-i\"] : []),\n ...(spec.tty === true ? [\"-t\"] : []),\n ...(spec.cwd !== undefined ? [\"-w\", spec.cwd] : []),\n ...buildEnvArgs(spec.env),\n containerRef,\n spec.command,\n ...(spec.args ?? [])\n ],\n stdin: spec.stdin,\n stdout: spec.stdout,\n stderr: spec.stderr,\n tty: spec.tty\n });\n },\n async detach() {\n return createContainerJob(containerRef, input.runner, input.engine, input.context);\n },\n shell() {\n const shellSpec = input.spec.shellSpec;\n return this.exec({\n command: shellSpec?.command ?? input.spec.env.SHELL ?? \"sh\",\n ...(shellSpec?.args ? { args: shellSpec.args } : {}),\n cwd: input.spec.cwd,\n env: shellSpec && \"env\" in shellSpec ? shellSpec.env : input.spec.env,\n stdin: \"inherit\",\n stdout: \"inherit\",\n stderr: \"inherit\",\n tty: true\n });\n },\n async close() {\n await runOrThrow(input.runner, {\n command: input.engine,\n args: [...buildContextArgs(input.engine, input.context), \"rm\", \"-f\", containerRef],\n stdout: \"pipe\",\n stderr: \"pipe\"\n });\n }\n };\n}\n\nasync function resolveImage(input: {\n spec: OpenSpec;\n runtime: DockerRuntime;\n runner: Runner;\n engine: Engine;\n context: string | null;\n}): Promise<string> {\n if (input.runtime.image !== undefined) {\n return input.runtime.image;\n }\n\n const result = await buildDockerRuntimeTemplate({\n cwd: input.spec.cwd,\n runtime: input.runtime,\n state: input.spec.state,\n runner: input.runner\n });\n return result.image;\n}\n\nexport async function buildDockerRuntimeTemplate(\n input: BuildDockerRuntimeTemplateInput\n): Promise<BuildDockerRuntimeTemplateResult> {\n const runner = input.runner ?? createHostRunner();\n const engine = input.runtime.engine ?? detectEngine();\n const context = detectContext();\n const dockerfilePath = path.resolve(\n input.cwd,\n input.runtime.dockerfile ?? path.join(\".poe-code\", \"Dockerfile\")\n );\n const buildContext = path.resolve(input.cwd, input.runtime.build_context ?? \".\");\n const dockerfileBytes = await readFile(dockerfilePath);\n const hash = hashDockerTemplate(dockerfileBytes, input.runtime.build_args ?? {});\n const cached = input.force ? null : await input.state?.templates.get(\"docker\", hash);\n\n if (cached?.image !== undefined) {\n return {\n backend: \"docker\",\n hash,\n image: cached.image,\n cached: true\n };\n }\n\n const image = `poe-code/local:${hash}`;\n await buildImage({\n runner,\n engine,\n context,\n image,\n dockerfilePath,\n buildContext,\n buildArgs: input.runtime.build_args ?? {}\n });\n await input.state?.templates.put(\"docker\", {\n hash,\n image,\n runtime_type: \"docker\",\n dockerfile_path: dockerfilePath,\n built_at: new Date().toISOString()\n });\n\n return {\n backend: \"docker\",\n hash,\n image,\n cached: false\n };\n}\n\nfunction hashDockerTemplate(dockerfileBytes: Buffer, buildArgs: Record<string, string>): string {\n const hash = createHash(\"sha256\");\n hash.update(dockerfileBytes);\n hash.update(\"\\0\");\n for (const [key, value] of sortedBuildArgs(buildArgs)) {\n hash.update(key);\n hash.update(\"=\");\n hash.update(value);\n hash.update(\"\\0\");\n }\n return hash.digest(\"hex\");\n}\n\nasync function buildImage(input: {\n runner: Runner;\n engine: Engine;\n context: string | null;\n image: string;\n dockerfilePath: string;\n buildContext: string;\n buildArgs: Record<string, string>;\n}): Promise<void> {\n await runOrThrow(input.runner, {\n command: input.engine,\n args: [\n ...buildContextArgs(input.engine, input.context),\n \"build\",\n \"--tag\",\n input.image,\n \"-f\",\n input.dockerfilePath,\n ...sortedBuildArgs(input.buildArgs).flatMap(([key, value]) => [\n \"--build-arg\",\n `${key}=${value}`\n ]),\n input.buildContext\n ],\n stdout: \"pipe\",\n stderr: \"pipe\"\n });\n}\n\nfunction parseDockerRuntime(runtime: unknown): DockerRuntime {\n if (!runtime || typeof runtime !== \"object\" || Array.isArray(runtime)) {\n throw new Error(\"docker runtime must be an object\");\n }\n const record = runtime as Record<string, unknown>;\n if (record.type !== \"docker\") {\n throw new Error('docker runtime type must be \"docker\"');\n }\n return record as unknown as DockerRuntime;\n}\n\nasync function runAndRead(runner: Runner, spec: RunSpec): Promise<string> {\n const handle = runner.exec(spec);\n const stdout = readStream(handle.stdout);\n const stderr = readStream(handle.stderr);\n const result = await handle.result;\n const output = await stdout;\n if (result.exitCode !== 0) {\n const errorOutput = await stderr;\n throw new Error(\n `Command failed with exit code ${result.exitCode}: ${spec.command} ${(spec.args ?? []).join(\" \")}${errorOutput ? `\\n${errorOutput}` : \"\"}`\n );\n }\n return output;\n}\n\nasync function runOrThrow(runner: Runner, spec: RunSpec): Promise<void> {\n await runAndRead(runner, spec);\n}\n\nasync function readStream(stream: NodeJS.ReadableStream | null): Promise<string> {\n if (stream === null) {\n return \"\";\n }\n\n stream.setEncoding(\"utf8\");\n const chunks: string[] = [];\n for await (const chunk of stream) {\n chunks.push(String(chunk));\n }\n return chunks.join(\"\");\n}\n\nfunction sortedBuildArgs(buildArgs: Record<string, string>): Array<[string, string]> {\n return Object.entries(buildArgs).sort(([left], [right]) => left.localeCompare(right));\n}\n\nfunction buildEnvArgs(env: RunSpec[\"env\"]): string[] {\n if (env === undefined) {\n return [];\n }\n\n return Object.entries(env).flatMap(([key, value]) => [\"-e\", `${key}=${value}`]);\n}\n\nfunction createContainerName(): string {\n return `poe-env-${randomBytes(6).toString(\"hex\")}`;\n}\n\nfunction createContainerJob(\n containerId: string,\n runner: Runner,\n engine: Engine,\n context: string | null,\n jobId = containerId\n) {\n return {\n id: jobId,\n envId: containerId,\n tool: \"docker\",\n argv: [\"attach\", containerId],\n async status() {\n const handle = runner.exec({\n command: engine,\n args: [\n ...buildContextArgs(engine, context),\n \"inspect\",\n \"-f\",\n \"{{.State.Status}}\",\n containerId\n ],\n stdout: \"pipe\",\n stderr: \"pipe\"\n });\n const stdout = await readStream(handle.stdout);\n const result = await handle.result;\n if (result.exitCode !== 0) {\n return \"lost\" as const;\n }\n return stdout.trim() === \"running\" ? (\"running\" as const) : (\"exited\" as const);\n },\n async *stream(opts?: { sinceByte?: number }) {\n const handle = runner.exec({\n command: engine,\n args: [\n ...buildContextArgs(engine, context),\n \"exec\",\n containerId,\n \"sh\",\n \"-c\",\n `test -f ${shellQuote(`/tmp/poe-jobs/${jobId}.log`)} && tail -c +${(opts?.sinceByte ?? 0) + 1} ${shellQuote(`/tmp/poe-jobs/${jobId}.log`)} || true`\n ],\n stdout: \"pipe\",\n stderr: \"pipe\"\n });\n const stdout = await readStream(handle.stdout);\n await handle.result;\n if (stdout.length > 0) {\n yield { byteOffset: opts?.sinceByte ?? 0, data: stdout };\n }\n },\n async wait() {\n const handle = runner.exec({\n command: engine,\n args: [...buildContextArgs(engine, context), \"wait\", containerId],\n stdout: \"pipe\",\n stderr: \"pipe\"\n });\n const stdout = await readStream(handle.stdout);\n const result = await handle.result;\n return { exitCode: Number.parseInt(stdout.trim(), 10) || result.exitCode };\n },\n async kill(signal?: NodeJS.Signals) {\n const args =\n signal === undefined || signal === \"SIGTERM\"\n ? [\"stop\", containerId]\n : [\"kill\", ...(signal === \"SIGKILL\" ? [] : [`--signal=${signal}`]), containerId];\n await runOrThrow(runner, {\n command: engine,\n args: [...buildContextArgs(engine, context), ...args],\n stdout: \"pipe\",\n stderr: \"pipe\"\n });\n }\n };\n}\n\nfunction createAttachedSpec(cwd = \"/workspace\"): OpenSpec {\n return {\n cwd,\n runtime: {\n type: \"docker\",\n image: \"attached\",\n build_args: {},\n mounts: []\n },\n env: {},\n uploadIgnoreFiles: [],\n jobLabel: {\n tool: \"docker\",\n argv: []\n }\n };\n}\n\nfunction shellQuote(value: string): string {\n return `'${value.replaceAll(\"'\", \"'\\\\''\")}'`;\n}\n", "import { spawn as spawnChildProcess } from \"node:child_process\";\nimport type { Runner, RunSpec } from \"../types.js\";\nimport type { HostRunnerOptions, RunHandle, RunResult } from \"../types.js\";\n\nexport function createHostRunner(options: HostRunnerOptions = {}): Runner {\n const detached = options.detached === true;\n\n return {\n name: \"host\",\n exec(spec: RunSpec): RunHandle {\n const stdinMode = spec.stdin ?? \"ignore\";\n const stdoutMode = spec.stdout ?? \"pipe\";\n const stderrMode = spec.stderr ?? \"pipe\";\n const stdio =\n stdinMode === \"inherit\" && stdoutMode === \"inherit\" && stderrMode === \"inherit\"\n ? \"inherit\"\n : [stdinMode, stdoutMode, stderrMode];\n const child = spawnChildProcess(spec.command, spec.args ?? [], {\n cwd: spec.cwd,\n env: spec.env,\n stdio,\n ...(detached ? { detached: true } : {})\n });\n\n if (detached) {\n child.unref();\n }\n\n const kill = (signal?: NodeJS.Signals) => {\n if (detached && process.platform !== \"win32\" && child.pid !== undefined) {\n process.kill(-child.pid, signal);\n return;\n }\n\n child.kill(signal);\n };\n\n let settled = false;\n let resolveResult: ((value: RunResult) => void) | null = null;\n const result = new Promise<RunResult>((resolve) => {\n resolveResult = resolve;\n });\n\n const cleanupAbort = bindAbortSignal(spec.signal, () => {\n kill(\"SIGTERM\");\n });\n\n child.once(\"close\", (code) => {\n if (settled) return;\n settled = true;\n cleanupAbort();\n resolveResult?.({ exitCode: code ?? 1 });\n });\n child.once(\"error\", () => {\n if (settled) return;\n settled = true;\n cleanupAbort();\n resolveResult?.({ exitCode: 1 });\n });\n\n return {\n pid: child.pid ?? null,\n stdin: child.stdin,\n stdout: child.stdout,\n stderr: child.stderr,\n result,\n kill\n };\n }\n };\n}\n\nfunction bindAbortSignal(signal: AbortSignal | undefined, onAbort: () => void): () => void {\n if (signal === undefined) {\n return () => {};\n }\n\n if (signal.aborted) {\n onAbort();\n return () => {};\n }\n\n signal.addEventListener(\"abort\", onAbort, { once: true });\n\n return () => {\n signal.removeEventListener(\"abort\", onAbort);\n };\n}\n", "import { createHostRunner } from \"./host-runner.js\";\nimport type { ExecutionEnvFactory, OpenedEnv, RunSpec } from \"../types.js\";\n\nexport const hostExecutionEnvFactory: ExecutionEnvFactory = {\n type: \"host\",\n supportsDetach: false,\n async open(openSpec): Promise<OpenedEnv> {\n return {\n id: \"host\",\n job: null,\n async uploadWorkspace() {\n return {\n files: 0,\n bytes: 0,\n skipped: []\n };\n },\n async downloadWorkspace() {\n return {\n files: 0,\n bytes: 0,\n conflicts: []\n };\n },\n exec(spec: RunSpec) {\n return createHostRunner().exec(spec);\n },\n async detach() {\n throw new Error(\"host runtime does not support detach because host has no addressable env\");\n },\n shell() {\n const shellSpec = openSpec.shellSpec;\n return createHostRunner().exec({\n command: shellSpec?.command ?? openSpec.env.SHELL ?? process.env.SHELL ?? \"sh\",\n ...(shellSpec?.args ? { args: shellSpec.args } : {}),\n cwd: openSpec.cwd,\n env: shellSpec && \"env\" in shellSpec ? shellSpec.env : openSpec.env,\n stdin: \"inherit\",\n stdout: \"inherit\",\n stderr: \"inherit\",\n tty: true\n });\n },\n async close() {}\n };\n },\n async attach() {\n throw new Error(\"host runtime does not support reattach\");\n }\n};\n", "import { Readable, Writable } from \"node:stream\";\nimport type { MockRunBehavior, RunHandle, Runner, RunSpec } from \"../types.js\";\n\nexport function createMockRunner(behaviors: MockRunBehavior[]): Runner {\n const remaining = [...behaviors];\n\n return {\n name: \"mock\",\n exec(spec) {\n const behavior = remaining.shift();\n if (behavior === undefined) {\n throw new Error(\"No mock run behaviors left\");\n }\n\n return createRunHandle(spec, behavior);\n }\n };\n}\n\nexport function createMockRunnerByCommand(\n behaviorsByCommand: Record<string, MockRunBehavior>\n): Runner {\n return {\n name: \"mock\",\n exec(spec) {\n const behavior = behaviorsByCommand[spec.command];\n if (behavior === undefined) {\n throw new Error(\n `No mock run behavior found for command \"${spec.command}\"`\n );\n }\n\n return createRunHandle(spec, behavior);\n }\n };\n}\n\nfunction createRunHandle(spec: RunSpec, behavior: MockRunBehavior): RunHandle {\n const stdoutMode = spec.stdout ?? \"pipe\";\n const stderrMode = spec.stderr ?? \"pipe\";\n const stdinMode = spec.stdin ?? \"ignore\";\n const interval = behavior.stdoutInterval ?? 10;\n\n const stdoutController =\n stdoutMode === \"pipe\" && behavior.stdout !== undefined\n ? createReadableStream(behavior.stdout, interval)\n : null;\n const stderrController =\n stderrMode === \"pipe\" && behavior.stderr !== undefined\n ? createReadableStream(behavior.stderr, interval)\n : null;\n\n let resolveResult: ((value: { exitCode: number }) => void) | null = null;\n const result = new Promise<{ exitCode: number }>((resolve) => {\n resolveResult = resolve;\n });\n\n let finished = false;\n const complete = () => {\n if (finished || resolveResult === null) {\n return;\n }\n\n finished = true;\n resolveResult({ exitCode: behavior.exitCode });\n };\n\n const stopStreams = () => {\n stdoutController?.stop();\n stderrController?.stop();\n };\n\n const exitAfterMs = behavior.exitAfterMs ?? 0;\n const exitTimer =\n exitAfterMs > 0\n ? setTimeout(complete, exitAfterMs)\n : queueMicrotask(complete);\n\n return {\n pid: behavior.pid ?? null,\n stdout: stdoutController?.stream ?? null,\n stderr: stderrController?.stream ?? null,\n stdin: stdinMode === \"pipe\" ? createWritableStream() : null,\n result,\n kill() {\n if (typeof exitTimer === \"object\" && exitTimer !== null && \"hasRef\" in exitTimer) {\n clearTimeout(exitTimer);\n }\n stopStreams();\n complete();\n }\n };\n}\n\nfunction createReadableStream(lines: string[], interval: number) {\n const stream = new Readable({\n read() {}\n });\n\n const timers = new Set<NodeJS.Timeout>();\n let stopped = false;\n\n const stop = () => {\n if (stopped) {\n return;\n }\n\n stopped = true;\n for (const timer of timers) {\n clearTimeout(timer);\n }\n timers.clear();\n stream.push(null);\n };\n\n if (lines.length === 0) {\n queueMicrotask(stop);\n return { stream, stop };\n }\n\n for (const [index, line] of lines.entries()) {\n const timer = setTimeout(() => {\n timers.delete(timer);\n if (stopped) {\n return;\n }\n\n stream.push(line);\n if (index === lines.length - 1) {\n stop();\n }\n }, interval * (index + 1));\n\n timers.add(timer);\n }\n\n return { stream, stop };\n}\n\nfunction createWritableStream(): Writable {\n return new Writable({\n write(_chunk, _encoding, callback) {\n callback();\n }\n });\n}\n", "import path from \"node:path\";\nimport type { ListFilter, Task, TaskListFs } from \"../types.js\";\n\nexport interface OrderedEntry {\n task: Task;\n raw: Record<string, unknown>;\n}\n\nexport function compareCreated(left: OrderedEntry, right: OrderedEntry): number {\n const leftCreated = typeof left.raw.created === \"string\" ? left.raw.created : \"\";\n const rightCreated = typeof right.raw.created === \"string\" ? right.raw.created : \"\";\n\n if (leftCreated === \"\" && rightCreated === \"\") {\n return left.task.qualifiedId.localeCompare(right.task.qualifiedId);\n }\n if (leftCreated === \"\") return 1;\n if (rightCreated === \"\") return -1;\n return leftCreated.localeCompare(rightCreated);\n}\n\nexport function applyOrder(entries: OrderedEntry[], order: ListFilter[\"order\"]): Task[] {\n if (order === \"alphabetical\") {\n return sortTasks(entries.map((entry) => entry.task));\n }\n if (order === \"created\") {\n return [...entries].sort(compareCreated).map((entry) => entry.task);\n }\n return entries.map((entry) => entry.task);\n}\n\nlet tmpFileCounter = 0;\n\nexport function hasErrorCode(error: unknown, code: string): boolean {\n return (\n !!error &&\n typeof error === \"object\" &&\n \"code\" in error &&\n (error as { code?: unknown }).code === code\n );\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function sortStrings(values: string[]): string[] {\n return [...values].sort((left, right) => left.localeCompare(right));\n}\n\nexport function sortTasks(tasks: Task[]): Task[] {\n return [...tasks].sort((left, right) => left.qualifiedId.localeCompare(right.qualifiedId));\n}\n\nexport function validateTaskId(id: string): string {\n if (\n id.length === 0 ||\n id.startsWith(\".\") ||\n id.includes(\"/\") ||\n id.includes(\"\\\\\") ||\n id.includes(\"..\")\n ) {\n throw new Error(`Invalid task id \"${id}\".`);\n }\n\n return id;\n}\n\nexport async function statIfExists(\n fs: TaskListFs,\n filePath: string\n): Promise<Awaited<ReturnType<TaskListFs[\"stat\"]>> | undefined> {\n try {\n return await fs.stat(filePath);\n } catch (error) {\n if (hasErrorCode(error, \"ENOENT\")) {\n return undefined;\n }\n\n throw error;\n }\n}\n\nexport async function writeAtomically(fs: TaskListFs, filePath: string, content: string): Promise<void> {\n const tempPath = `${filePath}.tmp-${process.pid}-${tmpFileCounter}`;\n tmpFileCounter += 1;\n\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n\n try {\n await fs.writeFile(tempPath, content, { encoding: \"utf8\", flag: \"wx\" });\n await fs.rename(tempPath, filePath);\n } catch (error) {\n try {\n await fs.unlink(tempPath);\n } catch (unlinkError) {\n if (!hasErrorCode(unlinkError, \"ENOENT\")) {\n throw unlinkError;\n }\n }\n\n throw error;\n }\n}\n", "import path from \"node:path\";\nimport { acquireFileLock } from \"@poe-code/file-lock\";\nimport { parseDocument, stringify } from \"yaml\";\nimport taskSchema from \"../schema/task.schema.json\" with { type: \"json\" };\nimport { eventsFromState, findEvent } from \"../state-machine.js\";\nimport { resolveStateMachine } from \"../state.js\";\nimport {\n AnchorNotFoundError,\n InvalidTransitionError,\n MalformedTaskError,\n OrderMismatchError,\n TaskAlreadyExistsError,\n TaskNotFoundError,\n type BackendDeps,\n type ListFilter,\n type MoveAnchor,\n type Task,\n type TaskCreate,\n type TaskFireOptions,\n type TaskList,\n type TaskListFs,\n type Tasks,\n type TaskUpdate\n} from \"../types.js\";\nimport {\n applyOrder,\n hasErrorCode,\n isRecord,\n sortStrings,\n statIfExists,\n validateTaskId,\n writeAtomically,\n type OrderedEntry\n} from \"./utils.js\";\n\nconst ARCHIVE_DIRECTORY_NAME = \"archive\";\nconst MARKDOWN_EXTENSION = \".md\";\nconst TASK_KIND = \"task\";\nconst TASK_VERSION = 1;\nconst TASK_SCHEMA_ID = taskSchema.$id;\nconst ORDER_LOCK_FILENAME = \".order.lock\";\nconst MIN_PREFIX_WIDTH = 2;\nconst RESERVED_FRONTMATTER_KEYS = new Set([\n \"$schema\",\n \"created\",\n \"description\",\n \"kind\",\n \"name\",\n \"state\",\n \"version\"\n]);\nconst PASSTHROUGH_RESERVED_FRONTMATTER_KEYS = new Set([\"description\", \"name\", \"state\"]);\n\ntype TaskRecord = Record<string, unknown>;\n\ntype TaskFile = {\n task: Task;\n frontmatter: TaskRecord;\n path: string;\n};\n\ntype TaskLocation = {\n archived: boolean;\n path: string;\n};\n\ntype ListLayout = { kind: \"multi\" } | { kind: \"single\"; name: string };\n\nfunction resolveListLayout(deps: BackendDeps): ListLayout {\n return deps.singleList ? { kind: \"single\", name: deps.singleList } : { kind: \"multi\" };\n}\n\nfunction validateListName(name: string): string {\n if (\n name.length === 0 ||\n name === ARCHIVE_DIRECTORY_NAME ||\n name.startsWith(\".\") ||\n name.includes(\"/\") ||\n name.includes(\"\\\\\") ||\n name.includes(\"..\")\n ) {\n throw new Error(`Invalid task list name \"${name}\".`);\n }\n\n return name;\n}\n\nfunction parseQualifiedId(qualifiedId: string): {\n id: string;\n list: string;\n} {\n const separatorIndex = qualifiedId.indexOf(\"/\");\n\n if (\n separatorIndex <= 0 ||\n separatorIndex !== qualifiedId.lastIndexOf(\"/\") ||\n separatorIndex === qualifiedId.length - 1\n ) {\n throw new Error(`Invalid qualified task id \"${qualifiedId}\".`);\n }\n\n return {\n list: validateListName(qualifiedId.slice(0, separatorIndex)),\n id: validateTaskId(qualifiedId.slice(separatorIndex + 1))\n };\n}\n\nfunction listPath(rootPath: string, layout: ListLayout, list: string): string {\n return layout.kind === \"single\" ? rootPath : path.join(rootPath, list);\n}\n\nfunction archiveDirectoryPath(rootPath: string, layout: ListLayout, list: string): string {\n return layout.kind === \"single\"\n ? path.join(rootPath, ARCHIVE_DIRECTORY_NAME)\n : path.join(rootPath, list, ARCHIVE_DIRECTORY_NAME);\n}\n\nfunction activeTaskFilename(id: string, order: number, width: number): string {\n return `${String(order).padStart(width, \"0\")}-${id}${MARKDOWN_EXTENSION}`;\n}\n\nfunction archivedTaskPath(rootPath: string, layout: ListLayout, list: string, id: string): string {\n return path.join(archiveDirectoryPath(rootPath, layout, list), `${id}${MARKDOWN_EXTENSION}`);\n}\n\nfunction isMarkdownFile(entryName: string): boolean {\n return entryName.endsWith(MARKDOWN_EXTENSION);\n}\n\nfunction isHiddenEntry(entryName: string): boolean {\n return entryName.startsWith(\".\");\n}\n\nfunction isLockFile(entryName: string): boolean {\n return entryName.endsWith(\".lock\");\n}\n\nfunction isValidTaskIdShape(id: string): boolean {\n return (\n id.length > 0 &&\n !id.startsWith(\".\") &&\n !id.includes(\"/\") &&\n !id.includes(\"\\\\\") &&\n !id.includes(\"..\")\n );\n}\n\nfunction parseActiveFilename(entryName: string): { id: string; order: number | null } | undefined {\n if (!isMarkdownFile(entryName)) return undefined;\n const stem = entryName.slice(0, -MARKDOWN_EXTENSION.length);\n\n const match = /^(\\d+)-(.+)$/.exec(stem);\n if (match) {\n const id = match[2];\n if (isValidTaskIdShape(id)) {\n return { id, order: Number.parseInt(match[1], 10) };\n }\n }\n\n if (isValidTaskIdShape(stem)) {\n return { id: stem, order: null };\n }\n\n return undefined;\n}\n\nfunction padWidthForCount(count: number): number {\n return Math.max(MIN_PREFIX_WIDTH, String(Math.max(count, 1)).length);\n}\n\nfunction malformedTask(filePath: string, field: string): MalformedTaskError {\n return new MalformedTaskError(`Malformed task \"${filePath}\": invalid \"${field}\".`);\n}\n\nfunction stripTrailingCarriageReturn(line: string): string {\n return line.endsWith(\"\\r\") ? line.slice(0, -1) : line;\n}\n\nfunction splitTaskDocument(\n content: string,\n filePath: string,\n mode: BackendDeps[\"frontmatterMode\"]\n): {\n body: string;\n frontmatter: string;\n} {\n const lines = content.split(\"\\n\");\n const hasFrontmatterBlock =\n lines.length > 0 && stripTrailingCarriageReturn(lines[0]) === \"---\";\n\n if (!hasFrontmatterBlock) {\n if (mode === \"passthrough\") {\n return { frontmatter: \"\", body: content };\n }\n throw malformedTask(filePath, \"frontmatter\");\n }\n\n let closingIndex = -1;\n for (let index = 1; index < lines.length; index += 1) {\n if (stripTrailingCarriageReturn(lines[index]) === \"---\") {\n closingIndex = index;\n break;\n }\n }\n\n if (closingIndex === -1) {\n throw malformedTask(filePath, \"frontmatter\");\n }\n\n const bodyLines = lines.slice(closingIndex + 1);\n if (bodyLines.length > 0 && stripTrailingCarriageReturn(bodyLines[0]) === \"\") {\n bodyLines.shift();\n }\n\n return {\n frontmatter: lines.slice(1, closingIndex).join(\"\\n\"),\n body: bodyLines.join(\"\\n\")\n };\n}\n\nfunction readFrontmatter(frontmatterContent: string, filePath: string): TaskRecord {\n const document = parseDocument(frontmatterContent);\n\n if (document.errors.length > 0) {\n throw malformedTask(filePath, \"frontmatter\");\n }\n\n const parsed = document.toJS();\n if (!isRecord(parsed)) {\n throw malformedTask(filePath, \"frontmatter\");\n }\n\n return parsed;\n}\n\nfunction assertValidTaskRecord(\n frontmatter: TaskRecord,\n filePath: string,\n validStates: ReadonlySet<string>\n): void {\n if (\"$schema\" in frontmatter && frontmatter.$schema !== TASK_SCHEMA_ID) {\n throw malformedTask(filePath, \"$schema\");\n }\n\n if (\"kind\" in frontmatter && frontmatter.kind !== TASK_KIND) {\n throw malformedTask(filePath, \"kind\");\n }\n\n if (\"version\" in frontmatter) {\n if (\n typeof frontmatter.version !== \"number\" ||\n !Number.isInteger(frontmatter.version) ||\n frontmatter.version !== TASK_VERSION\n ) {\n throw malformedTask(filePath, \"version\");\n }\n }\n\n if (typeof frontmatter.name !== \"string\" || frontmatter.name.length === 0) {\n throw malformedTask(filePath, \"name\");\n }\n\n if (typeof frontmatter.state !== \"string\" || !validStates.has(frontmatter.state)) {\n throw malformedTask(filePath, \"state\");\n }\n\n if (\"description\" in frontmatter && typeof frontmatter.description !== \"string\") {\n throw malformedTask(filePath, \"description\");\n }\n}\n\nfunction reservedFrontmatterKeys(mode: BackendDeps[\"frontmatterMode\"]): ReadonlySet<string> {\n return mode === \"passthrough\" ? PASSTHROUGH_RESERVED_FRONTMATTER_KEYS : RESERVED_FRONTMATTER_KEYS;\n}\n\nfunction metadataFromFrontmatter(\n frontmatter: TaskRecord,\n mode: BackendDeps[\"frontmatterMode\"]\n): Record<string, unknown> {\n const metadata: Record<string, unknown> = {};\n const reservedKeys = reservedFrontmatterKeys(mode);\n\n for (const [key, value] of Object.entries(frontmatter)) {\n if (!reservedKeys.has(key)) {\n metadata[key] = value;\n }\n }\n\n return metadata;\n}\n\nfunction createTask(\n list: string,\n id: string,\n frontmatter: TaskRecord,\n body: string,\n mode: BackendDeps[\"frontmatterMode\"],\n sourcePath?: string\n): Task {\n return {\n list,\n id,\n qualifiedId: `${list}/${id}`,\n name: frontmatter.name as string,\n state: frontmatter.state as string,\n description: body,\n metadata: metadataFromFrontmatter(frontmatter, mode),\n ...(sourcePath !== undefined && { sourcePath: path.resolve(sourcePath) })\n };\n}\n\nfunction serializeTaskDocument(frontmatter: TaskRecord, description: string): string {\n return `---\\n${stringify(frontmatter)}---\\n\\n${description}`;\n}\n\nasync function readDirectoryNames(fs: TaskListFs, directoryPath: string): Promise<string[]> {\n try {\n return sortStrings(await fs.readdir(directoryPath));\n } catch (error) {\n if (hasErrorCode(error, \"ENOENT\")) {\n return [];\n }\n\n throw error;\n }\n}\n\nasync function ensureRootPath(deps: BackendDeps): Promise<void> {\n if (deps.create) {\n await deps.fs.mkdir(deps.path, { recursive: true });\n return;\n }\n\n await deps.fs.stat(deps.path);\n}\n\nasync function readTaskFile(\n fs: TaskListFs,\n list: string,\n id: string,\n filePath: string,\n validStates: ReadonlySet<string>,\n initialState: string,\n mode: BackendDeps[\"frontmatterMode\"]\n): Promise<TaskFile> {\n const content = await fs.readFile(filePath, \"utf8\");\n const document = splitTaskDocument(content, filePath, mode);\n const frontmatter =\n mode === \"passthrough\" && document.frontmatter.trim().length === 0\n ? {}\n : readFrontmatter(document.frontmatter, filePath);\n\n if (mode !== \"passthrough\") {\n assertValidTaskRecord(frontmatter, filePath, validStates);\n return {\n path: filePath,\n frontmatter,\n task: createTask(list, id, frontmatter, document.body, mode, filePath)\n };\n }\n\n const parsedFilename = parseActiveFilename(path.basename(filePath));\n const defaultName = parsedFilename?.id ?? id;\n const effectiveFrontmatter: TaskRecord = {\n ...frontmatter,\n name: typeof frontmatter.name === \"string\" ? frontmatter.name : defaultName,\n state:\n typeof frontmatter.state === \"string\" && validStates.has(frontmatter.state)\n ? frontmatter.state\n : initialState\n };\n\n return {\n path: filePath,\n frontmatter,\n task: createTask(list, id, effectiveFrontmatter, document.body, mode, filePath)\n };\n}\n\nasync function findActiveTaskFilename(\n fs: TaskListFs,\n listDirectoryPath: string,\n id: string\n): Promise<string | undefined> {\n const entries = await readDirectoryNames(fs, listDirectoryPath);\n for (const entryName of entries) {\n if (isHiddenEntry(entryName) || isLockFile(entryName)) continue;\n const parsed = parseActiveFilename(entryName);\n if (parsed?.id === id) {\n return entryName;\n }\n }\n return undefined;\n}\n\nasync function findTaskLocation(\n fs: TaskListFs,\n rootPath: string,\n layout: ListLayout,\n list: string,\n id: string\n): Promise<TaskLocation | undefined> {\n const listDirectoryPath = listPath(rootPath, layout, list);\n const activeName = await findActiveTaskFilename(fs, listDirectoryPath, id);\n if (activeName) {\n const activePath = path.join(listDirectoryPath, activeName);\n const activeStat = await statIfExists(fs, activePath);\n if (activeStat?.isFile()) {\n return { archived: false, path: activePath };\n }\n }\n\n const archivedPath = archivedTaskPath(rootPath, layout, list, id);\n const archivedStat = await statIfExists(fs, archivedPath);\n if (archivedStat?.isFile()) {\n return { archived: true, path: archivedPath };\n }\n\n return undefined;\n}\n\nasync function readTaskAtLocation(\n fs: TaskListFs,\n rootPath: string,\n layout: ListLayout,\n list: string,\n id: string,\n validStates: ReadonlySet<string>,\n initialState: string,\n mode: BackendDeps[\"frontmatterMode\"]\n): Promise<TaskFile> {\n const location = await findTaskLocation(fs, rootPath, layout, list, id);\n\n if (!location) {\n throw new TaskNotFoundError(`Task \"${list}/${id}\" not found.`);\n }\n\n return readTaskFile(fs, list, id, location.path, validStates, initialState, mode);\n}\n\nfunction createdFrontmatter(\n defaults: BackendDeps[\"defaults\"],\n input: TaskCreate,\n initialState: string,\n mode: BackendDeps[\"frontmatterMode\"]\n): TaskRecord {\n const frontmatter: TaskRecord =\n mode !== \"passthrough\"\n ? {\n $schema: TASK_SCHEMA_ID,\n kind: TASK_KIND,\n version: TASK_VERSION,\n name: input.name,\n state: initialState\n }\n : {\n name: input.name,\n state: initialState\n };\n const reservedKeys = reservedFrontmatterKeys(mode);\n\n for (const [key, value] of Object.entries(defaults.metadata)) {\n if (!reservedKeys.has(key)) {\n frontmatter[key] = value;\n }\n }\n\n for (const [key, value] of Object.entries(input.metadata ?? {})) {\n if (!reservedKeys.has(key)) {\n frontmatter[key] = value;\n }\n }\n\n frontmatter.created = new Date().toISOString();\n return frontmatter;\n}\n\nfunction updatedFrontmatter(\n existingFrontmatter: TaskRecord,\n task: Task,\n patch: TaskUpdate,\n mode: BackendDeps[\"frontmatterMode\"]\n): TaskRecord {\n const nextFrontmatter: TaskRecord =\n mode !== \"passthrough\"\n ? {\n ...existingFrontmatter,\n $schema: existingFrontmatter.$schema ?? TASK_SCHEMA_ID,\n kind: existingFrontmatter.kind ?? TASK_KIND,\n version: existingFrontmatter.version ?? TASK_VERSION,\n name: patch.name ?? task.name,\n state: task.state\n }\n : {\n ...existingFrontmatter,\n name: patch.name ?? task.name,\n state: task.state\n };\n const reservedKeys = reservedFrontmatterKeys(mode);\n\n for (const [key, value] of Object.entries(patch.metadata ?? {})) {\n if (!reservedKeys.has(key)) {\n nextFrontmatter[key] = value;\n }\n }\n\n return nextFrontmatter;\n}\n\nfunction transitionedFrontmatter(\n existingFrontmatter: TaskRecord,\n task: Task,\n to: string,\n mode: BackendDeps[\"frontmatterMode\"]\n): TaskRecord {\n return mode !== \"passthrough\"\n ? {\n ...existingFrontmatter,\n $schema: existingFrontmatter.$schema ?? TASK_SCHEMA_ID,\n kind: existingFrontmatter.kind ?? TASK_KIND,\n version: existingFrontmatter.version ?? TASK_VERSION,\n name: task.name,\n state: to\n }\n : {\n ...existingFrontmatter,\n name: task.name,\n state: to\n };\n}\n\nfunction firedFrontmatter(\n existingFrontmatter: TaskRecord,\n task: Task,\n to: string,\n mode: BackendDeps[\"frontmatterMode\"],\n metadataPatch?: Record<string, unknown>\n): TaskRecord {\n const nextFrontmatter = transitionedFrontmatter(existingFrontmatter, task, to, mode);\n const reservedKeys = reservedFrontmatterKeys(mode);\n\n for (const [key, value] of Object.entries(metadataPatch ?? {})) {\n if (!reservedKeys.has(key)) {\n nextFrontmatter[key] = value;\n }\n }\n\n return nextFrontmatter;\n}\n\nfunction assertCreateDoesNotSetState(input: TaskCreate): void {\n if (Object.prototype.hasOwnProperty.call(input, \"state\")) {\n throw new Error(\n 'Tasks.create() does not accept \"state\"; new tasks always start at stateMachine.initial.'\n );\n }\n}\n\nfunction assertCreateHasId(input: TaskCreate): asserts input is TaskCreate & { id: string } {\n if (input.id === undefined) {\n throw new Error(\"id is required for markdown-dir backend\");\n }\n}\n\nfunction assertUpdateDoesNotSetState(patch: TaskUpdate): void {\n if (Object.prototype.hasOwnProperty.call(patch, \"state\")) {\n throw new Error('Tasks.update() does not accept \"state\"; use fire() to change task state.');\n }\n}\n\ninterface ActiveEntry {\n id: string;\n order: number | null;\n filename: string;\n}\n\nfunction createTasksView(deps: BackendDeps, layout: ListLayout, list: string): Tasks {\n const listDirectoryPath = listPath(deps.path, layout, list);\n const stateMachine = resolveStateMachine(deps.stateMachine);\n const validStates = new Set(stateMachine.states);\n\n async function readActiveEntries(): Promise<ActiveEntry[]> {\n const entries = await readDirectoryNames(deps.fs, listDirectoryPath);\n const result: ActiveEntry[] = [];\n\n for (const entryName of entries) {\n if (isHiddenEntry(entryName) || isLockFile(entryName)) continue;\n const parsed = parseActiveFilename(entryName);\n if (!parsed) continue;\n\n const entryPath = path.join(listDirectoryPath, entryName);\n const entryStat = await statIfExists(deps.fs, entryPath);\n if (!entryStat?.isFile()) continue;\n\n result.push({ id: parsed.id, order: parsed.order, filename: entryName });\n }\n\n result.sort((left, right) => {\n const leftOrder = left.order ?? Number.POSITIVE_INFINITY;\n const rightOrder = right.order ?? Number.POSITIVE_INFINITY;\n if (leftOrder !== rightOrder) return leftOrder - rightOrder;\n return left.filename.localeCompare(right.filename);\n });\n\n return result;\n }\n\n async function readActiveTasks(): Promise<{\n entries: ActiveEntry[];\n tasks: Map<string, { task: Task; raw: TaskRecord }>;\n }> {\n const entries = await readActiveEntries();\n const tasks = new Map<string, { task: Task; raw: TaskRecord }>();\n\n for (const entry of entries) {\n const filePath = path.join(listDirectoryPath, entry.filename);\n const file = await readTaskFile(\n deps.fs,\n list,\n entry.id,\n filePath,\n validStates,\n stateMachine.initial,\n deps.frontmatterMode\n );\n tasks.set(entry.id, { task: file.task, raw: file.frontmatter });\n }\n\n return { entries, tasks };\n }\n\n async function readArchivedTasks(): Promise<{ task: Task; raw: TaskRecord }[]> {\n const archivePath = archiveDirectoryPath(deps.path, layout, list);\n const entries = await readDirectoryNames(deps.fs, archivePath);\n const result: { task: Task; raw: TaskRecord }[] = [];\n\n for (const entryName of entries) {\n if (isHiddenEntry(entryName) || isLockFile(entryName) || !isMarkdownFile(entryName)) continue;\n\n const entryPath = path.join(archivePath, entryName);\n const entryStat = await statIfExists(deps.fs, entryPath);\n if (!entryStat?.isFile()) continue;\n\n const id = entryName.slice(0, -MARKDOWN_EXTENSION.length);\n const file = await readTaskFile(\n deps.fs,\n list,\n id,\n entryPath,\n validStates,\n stateMachine.initial,\n deps.frontmatterMode\n );\n result.push({ task: file.task, raw: file.frontmatter });\n }\n\n return result.sort((left, right) =>\n left.task.qualifiedId.localeCompare(right.task.qualifiedId)\n );\n }\n\n async function renameActiveEntries(\n entries: ActiveEntry[],\n desiredOrdersById: ReadonlyMap<string, number>\n ): Promise<void> {\n const staged: { from: string; to: string }[] = [];\n const maxOrder = Math.max(...desiredOrdersById.values(), entries.length);\n const width = padWidthForCount(maxOrder);\n\n for (let index = 0; index < entries.length; index += 1) {\n const entry = entries[index];\n const desiredOrder = desiredOrdersById.get(entry.id);\n if (desiredOrder === undefined) continue;\n\n const desiredFilename = activeTaskFilename(entry.id, desiredOrder, width);\n if (entry.filename !== desiredFilename) {\n const fromPath = path.join(listDirectoryPath, entry.filename);\n const stagingPath = path.join(\n listDirectoryPath,\n `${desiredFilename}.staging-${process.pid}-${index}`\n );\n const targetPath = path.join(listDirectoryPath, desiredFilename);\n await deps.fs.rename(fromPath, stagingPath);\n staged.push({ from: stagingPath, to: targetPath });\n }\n }\n\n for (const entry of staged) {\n await deps.fs.rename(entry.from, entry.to);\n }\n }\n\n async function rewriteListPrefixes(orderedIds: readonly string[]): Promise<void> {\n const entries = await readActiveEntries();\n const byId = new Map(entries.map((entry) => [entry.id, entry]));\n const desiredOrdersById = new Map<string, number>();\n\n for (let index = 0; index < orderedIds.length; index += 1) {\n const id = orderedIds[index];\n const entry = byId.get(id);\n if (!entry) continue;\n\n desiredOrdersById.set(id, index + 1);\n }\n\n await renameActiveEntries(entries, desiredOrdersById);\n }\n\n function entryOrder(entry: ActiveEntry, index: number): number {\n return entry.order ?? index + 1;\n }\n\n async function rewriteMovedPrefix(movedId: string, orderedIds: readonly string[]): Promise<void> {\n const entries = await readActiveEntries();\n const byId = new Map(entries.map((entry, index) => [entry.id, { entry, index }]));\n const movedIndex = orderedIds.indexOf(movedId);\n const moved = byId.get(movedId);\n if (movedIndex < 0 || moved === undefined) return;\n\n const desiredOrdersById = new Map<string, number>();\n const previousId = movedIndex > 0 ? orderedIds[movedIndex - 1] : undefined;\n const nextId = movedIndex < orderedIds.length - 1 ? orderedIds[movedIndex + 1] : undefined;\n const previous = previousId === undefined ? undefined : byId.get(previousId);\n const next = nextId === undefined ? undefined : byId.get(nextId);\n\n if (previous !== undefined && next === undefined) {\n desiredOrdersById.set(movedId, entryOrder(previous.entry, previous.index) + 1);\n await renameActiveEntries(entries, desiredOrdersById);\n return;\n }\n\n if (previous === undefined && next !== undefined) {\n const nextOrder = entryOrder(next.entry, next.index);\n if (nextOrder > 1) {\n desiredOrdersById.set(movedId, nextOrder - 1);\n await renameActiveEntries(entries, desiredOrdersById);\n return;\n }\n\n desiredOrdersById.set(movedId, 1);\n let lastOrder = 1;\n for (let index = movedIndex + 1; index < orderedIds.length; index += 1) {\n const candidate = byId.get(orderedIds[index]);\n if (candidate === undefined) continue;\n\n const currentOrder = entryOrder(candidate.entry, candidate.index);\n if (currentOrder > lastOrder) break;\n\n lastOrder += 1;\n desiredOrdersById.set(candidate.entry.id, lastOrder);\n }\n\n await renameActiveEntries(entries, desiredOrdersById);\n return;\n }\n\n if (previous !== undefined && next !== undefined) {\n const previousOrder = entryOrder(previous.entry, previous.index);\n const nextOrder = entryOrder(next.entry, next.index);\n\n if (nextOrder - previousOrder > 1) {\n desiredOrdersById.set(movedId, previousOrder + 1);\n await renameActiveEntries(entries, desiredOrdersById);\n return;\n }\n\n let lastOrder = previousOrder + 1;\n desiredOrdersById.set(movedId, lastOrder);\n for (let index = movedIndex + 1; index < orderedIds.length; index += 1) {\n const candidate = byId.get(orderedIds[index]);\n if (candidate === undefined) continue;\n\n const currentOrder = entryOrder(candidate.entry, candidate.index);\n if (currentOrder > lastOrder) break;\n\n lastOrder += 1;\n desiredOrdersById.set(candidate.entry.id, lastOrder);\n }\n\n await renameActiveEntries(entries, desiredOrdersById);\n }\n }\n\n async function withListLock<T>(action: () => Promise<T>): Promise<T> {\n await deps.fs.mkdir(listDirectoryPath, { recursive: true });\n const release = await acquireFileLock(path.join(listDirectoryPath, ORDER_LOCK_FILENAME), {\n fs: deps.fs,\n staleMs: deps.lockStaleMs,\n retries: deps.lockRetries\n });\n\n try {\n return await action();\n } finally {\n await release();\n }\n }\n\n async function withTaskLock<T>(id: string, action: () => Promise<T>): Promise<T> {\n validateTaskId(id);\n return withListLock(action);\n }\n\n async function withLocatedTaskLock<T>(location: TaskLocation, action: () => Promise<T>) {\n const release = await acquireFileLock(location.path, {\n fs: deps.fs,\n staleMs: deps.lockStaleMs,\n retries: deps.lockRetries\n });\n\n try {\n return await action();\n } finally {\n await release();\n }\n }\n\n async function getTaskFile(id: string): Promise<TaskFile> {\n validateTaskId(id);\n return readTaskAtLocation(\n deps.fs,\n deps.path,\n layout,\n list,\n id,\n validStates,\n stateMachine.initial,\n deps.frontmatterMode\n );\n }\n\n function assertFireableTaskEvent(task: Task, eventName: string) {\n const event = findEvent(stateMachine, task.state, eventName);\n\n if (event === undefined) {\n throw new InvalidTransitionError({\n task,\n event: eventName,\n to: stateMachine.events[eventName]?.to,\n reason: `Cannot fire event \"${eventName}\" from task state \"${task.state}\".`\n });\n }\n\n return event;\n }\n\n return {\n name: list,\n stateMachine,\n async all(filter?: ListFilter): Promise<Task[]> {\n const { entries: activeEntries, tasks: activeTasks } = await readActiveTasks();\n const archivedEntries = filter?.includeArchived ? await readArchivedTasks() : [];\n\n const orderedActive: OrderedEntry[] = activeEntries\n .map((entry) => activeTasks.get(entry.id)!)\n .filter((entry) => {\n if (filter?.state && entry.task.state !== filter.state) return false;\n return true;\n });\n\n const filteredArchived = archivedEntries.filter((entry) => {\n if (filter?.state && entry.task.state !== filter.state) return false;\n return true;\n });\n\n const orderedActiveTasks = applyOrder(orderedActive, filter?.order);\n return [...orderedActiveTasks, ...filteredArchived.map((entry) => entry.task)];\n },\n async get(id: string): Promise<Task> {\n return (await getTaskFile(id)).task;\n },\n async create(input: TaskCreate): Promise<Task> {\n assertCreateDoesNotSetState(input);\n assertCreateHasId(input);\n validateTaskId(input.id);\n await deps.fs.mkdir(listDirectoryPath, { recursive: true });\n\n return withListLock(async () => {\n const existing = await findTaskLocation(deps.fs, deps.path, layout, list, input.id);\n if (existing) {\n throw new TaskAlreadyExistsError(`Task \"${list}/${input.id}\" already exists.`);\n }\n\n const activeEntries = await readActiveEntries();\n const maxOrder = activeEntries.reduce(\n (max, entry) => (entry.order !== null && entry.order > max ? entry.order : max),\n 0\n );\n const nextOrder = maxOrder + 1;\n const width = padWidthForCount(activeEntries.length + 1);\n const filename = activeTaskFilename(input.id, nextOrder, width);\n const targetPath = path.join(listDirectoryPath, filename);\n\n const frontmatter = createdFrontmatter(\n deps.defaults,\n input,\n stateMachine.initial,\n deps.frontmatterMode\n );\n const description = input.description ?? \"\";\n\n await writeAtomically(deps.fs, targetPath, serializeTaskDocument(frontmatter, description));\n\n return createTask(\n list,\n input.id,\n frontmatter,\n description,\n deps.frontmatterMode,\n targetPath\n );\n });\n },\n async update(id: string, patch: TaskUpdate): Promise<Task> {\n assertUpdateDoesNotSetState(patch);\n\n return withTaskLock(id, async () => {\n const existing = await getTaskFile(id);\n const nextFrontmatter = updatedFrontmatter(\n existing.frontmatter,\n existing.task,\n patch,\n deps.frontmatterMode\n );\n const description = patch.description ?? existing.task.description;\n\n await writeAtomically(\n deps.fs,\n existing.path,\n serializeTaskDocument(nextFrontmatter, description)\n );\n\n return createTask(\n list,\n id,\n nextFrontmatter,\n description,\n deps.frontmatterMode,\n existing.path\n );\n });\n },\n async fire(id: string, eventName: string, opts?: TaskFireOptions): Promise<Task> {\n const fireTask = async (): Promise<Task> => {\n const existing = await getTaskFile(id);\n const event = assertFireableTaskEvent(existing.task, eventName);\n const guardResult = event.guard?.(existing.task) ?? true;\n\n if (guardResult !== true) {\n throw new InvalidTransitionError({\n task: existing.task,\n event: eventName,\n to: event.to,\n reason: guardResult\n });\n }\n\n await event.onExit?.(existing.task);\n\n const nextFrontmatter = firedFrontmatter(\n existing.frontmatter,\n existing.task,\n event.to,\n deps.frontmatterMode,\n opts?.metadataPatch\n );\n const serializedTask = serializeTaskDocument(nextFrontmatter, existing.task.description);\n\n if (event.to === \"archived\") {\n const targetPath = archivedTaskPath(deps.path, layout, list, id);\n const archivedTargetExists = await statIfExists(deps.fs, targetPath);\n if (archivedTargetExists?.isFile()) {\n throw new TaskAlreadyExistsError(`Task \"${list}/${id}\" already exists in archive.`);\n }\n\n await writeAtomically(deps.fs, existing.path, serializedTask);\n await deps.fs.mkdir(archiveDirectoryPath(deps.path, layout, list), { recursive: true });\n await deps.fs.rename(existing.path, targetPath);\n const nextTask = createTask(\n list,\n id,\n nextFrontmatter,\n existing.task.description,\n deps.frontmatterMode,\n targetPath\n );\n await event.onEnter?.(nextTask);\n\n return nextTask;\n }\n\n await writeAtomically(deps.fs, existing.path, serializedTask);\n const nextTask = createTask(\n list,\n id,\n nextFrontmatter,\n existing.task.description,\n deps.frontmatterMode,\n existing.path\n );\n await event.onEnter?.(nextTask);\n\n return nextTask;\n };\n\n if (stateMachine.events[eventName]?.to === \"archived\") {\n validateTaskId(id);\n\n return withListLock(async () => {\n const location = await findTaskLocation(deps.fs, deps.path, layout, list, id);\n if (!location) {\n throw new TaskNotFoundError(`Task \"${list}/${id}\" not found.`);\n }\n\n return withLocatedTaskLock(location, fireTask);\n });\n }\n\n return withTaskLock(id, fireTask);\n },\n async canFire(id: string, eventName: string): Promise<boolean> {\n const task = (await getTaskFile(id)).task;\n const event = findEvent(stateMachine, task.state, eventName);\n\n if (event === undefined) {\n return false;\n }\n\n return (event.guard?.(task) ?? true) === true;\n },\n async events(id: string): Promise<readonly string[]> {\n const task = (await getTaskFile(id)).task;\n return eventsFromState(stateMachine, task.state);\n },\n async delete(id: string): Promise<void> {\n await withTaskLock(id, async () => {\n const location = await findTaskLocation(deps.fs, deps.path, layout, list, id);\n if (!location) {\n throw new TaskNotFoundError(`Task \"${list}/${id}\" not found.`);\n }\n\n await deps.fs.unlink(location.path);\n });\n },\n async move(id: string, anchor: MoveAnchor): Promise<Task> {\n validateTaskId(id);\n\n return withListLock(async () => {\n const { entries } = await readActiveTasks();\n const fromIndex = entries.findIndex((entry) => entry.id === id);\n if (fromIndex < 0) {\n throw new TaskNotFoundError(`Task \"${list}/${id}\" not found.`);\n }\n\n const ordered = entries.map((entry) => entry.id);\n ordered.splice(fromIndex, 1);\n\n let insertIndex: number;\n if (\"position\" in anchor) {\n insertIndex = anchor.position === \"top\" ? 0 : ordered.length;\n } else {\n const anchorId = \"before\" in anchor ? anchor.before : anchor.after;\n const anchorIndex = ordered.indexOf(anchorId);\n if (anchorIndex < 0) {\n throw new AnchorNotFoundError(anchorId);\n }\n insertIndex = \"before\" in anchor ? anchorIndex : anchorIndex + 1;\n }\n\n ordered.splice(insertIndex, 0, id);\n await rewriteMovedPrefix(id, ordered);\n\n return (await getTaskFile(id)).task;\n });\n },\n async reorder(ids: readonly string[]): Promise<readonly Task[]> {\n for (const id of ids) {\n validateTaskId(id);\n }\n\n return withListLock(async () => {\n const { entries } = await readActiveTasks();\n const currentIds = entries.map((entry) => entry.id);\n const currentSet = new Set(currentIds);\n const inputSet = new Set(ids);\n const missing = currentIds.filter((id) => !inputSet.has(id));\n const extra = ids.filter((id) => !currentSet.has(id));\n\n if (missing.length > 0 || extra.length > 0) {\n throw new OrderMismatchError({ missing, extra });\n }\n\n await rewriteListPrefixes(ids);\n\n return Promise.all(ids.map(async (id) => (await getTaskFile(id)).task));\n });\n }\n };\n}\n\nexport async function markdownDirBackend(deps: BackendDeps): Promise<TaskList> {\n await ensureRootPath(deps);\n const layout = resolveListLayout(deps);\n const stateMachine = resolveStateMachine(deps.stateMachine);\n const validStates = new Set(stateMachine.states);\n\n const list = (name: string): Tasks => {\n if (layout.kind === \"single\") {\n if (name !== layout.name) {\n throw new Error(`Task list \"${name}\" not found.`);\n }\n\n return createTasksView(deps, layout, name);\n }\n\n const listName = validateListName(name);\n return createTasksView(deps, layout, listName);\n };\n\n const lists = async (): Promise<string[]> => {\n if (layout.kind === \"single\") {\n return [layout.name];\n }\n\n const entries = await readDirectoryNames(deps.fs, deps.path);\n const result: string[] = [];\n\n for (const entryName of entries) {\n if (\n entryName === ARCHIVE_DIRECTORY_NAME ||\n isHiddenEntry(entryName) ||\n isLockFile(entryName)\n ) {\n continue;\n }\n\n const entryPath = path.join(deps.path, entryName);\n const entryStat = await statIfExists(deps.fs, entryPath);\n if (entryStat?.isDirectory()) {\n result.push(entryName);\n }\n }\n\n return sortStrings(result);\n };\n\n const allTasks = async (filter?: ListFilter): Promise<Task[]> => {\n const allLists = await lists();\n const tasks: Task[] = [];\n\n for (const taskListName of allLists) {\n tasks.push(...(await list(taskListName).all(filter)));\n }\n\n return tasks;\n };\n\n const get = async (qualifiedId: string): Promise<Task> => {\n const { list: listName, id } = parseQualifiedId(qualifiedId);\n return list(listName).get(id);\n };\n\n const moveBetweenLists = async (qualifiedId: string, targetList: string): Promise<Task> => {\n if (layout.kind === \"single\") {\n throw new Error(\"moveBetweenLists is unsupported in single-list mode.\");\n }\n\n const { list: sourceListName, id } = parseQualifiedId(qualifiedId);\n const targetListName = validateListName(targetList);\n\n if (sourceListName === targetListName) {\n const file = await readTaskAtLocation(\n deps.fs,\n deps.path,\n layout,\n sourceListName,\n id,\n validStates,\n stateMachine.initial,\n deps.frontmatterMode\n );\n return file.task;\n }\n\n const targetExisting = await findTaskLocation(deps.fs, deps.path, layout, targetListName, id);\n if (targetExisting) {\n throw new TaskAlreadyExistsError(`Task \"${targetListName}/${id}\" already exists.`);\n }\n\n const sourceLocation = await findTaskLocation(deps.fs, deps.path, layout, sourceListName, id);\n if (!sourceLocation) {\n throw new TaskNotFoundError(`Task \"${sourceListName}/${id}\" not found.`);\n }\n\n const targetListDir = listPath(deps.path, layout, targetListName);\n await deps.fs.mkdir(targetListDir, { recursive: true });\n\n const targetEntries = await (async () => {\n const out: ActiveEntry[] = [];\n const names = await readDirectoryNames(deps.fs, targetListDir);\n for (const entryName of names) {\n if (isHiddenEntry(entryName) || isLockFile(entryName)) continue;\n const parsed = parseActiveFilename(entryName);\n if (!parsed) continue;\n out.push({ id: parsed.id, order: parsed.order, filename: entryName });\n }\n return out;\n })();\n\n if (sourceLocation.archived) {\n const archivedTargetDir = archiveDirectoryPath(deps.path, layout, targetListName);\n await deps.fs.mkdir(archivedTargetDir, { recursive: true });\n const archivedTargetPath = archivedTaskPath(deps.path, layout, targetListName, id);\n await deps.fs.rename(sourceLocation.path, archivedTargetPath);\n const file = await readTaskFile(\n deps.fs,\n targetListName,\n id,\n archivedTargetPath,\n validStates,\n stateMachine.initial,\n deps.frontmatterMode\n );\n return file.task;\n }\n\n const maxOrder = targetEntries.reduce(\n (max, entry) => (entry.order !== null && entry.order > max ? entry.order : max),\n 0\n );\n const width = padWidthForCount(targetEntries.length + 1);\n const targetFilename = activeTaskFilename(id, maxOrder + 1, width);\n const targetPath = path.join(targetListDir, targetFilename);\n\n await deps.fs.rename(sourceLocation.path, targetPath);\n const file = await readTaskFile(\n deps.fs,\n targetListName,\n id,\n targetPath,\n validStates,\n stateMachine.initial,\n deps.frontmatterMode\n );\n return file.task;\n };\n\n return {\n list,\n lists,\n allTasks,\n get,\n moveBetweenLists\n };\n}\n", "import * as fsPromises from \"node:fs/promises\";\nimport * as os from \"node:os\";\n\nexport interface FileLockFs {\n open(path: string, flags: string): Promise<{\n close(): Promise<void>;\n writeFile(\n data: string,\n options?: BufferEncoding | { encoding?: BufferEncoding }\n ): Promise<void>;\n }>;\n stat(path: string): Promise<{\n mtimeMs: number;\n }>;\n readFile?(path: string, encoding: BufferEncoding): Promise<string>;\n unlink(path: string): Promise<void>;\n}\n\nexport interface FileLockOptions {\n staleMs?: number;\n retries?: number;\n minTimeout?: number;\n maxTimeout?: number;\n fs?: FileLockFs;\n isPidRunning?: (pid: number) => boolean;\n signal?: AbortSignal;\n}\n\nexport type ReleaseLock = () => Promise<void>;\n\nexport class LockTimeoutError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"LockTimeoutError\";\n }\n}\n\nfunction createAbortError(): Error {\n const error = new Error(\"The operation was aborted.\");\n error.name = \"AbortError\";\n return error;\n}\n\nfunction throwIfAborted(signal?: AbortSignal): void {\n if (signal?.aborted) {\n throw createAbortError();\n }\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n if (!signal) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n if (signal.aborted) {\n return Promise.reject(createAbortError());\n }\n\n return new Promise((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n signal.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n\n const onAbort = () => {\n clearTimeout(timeoutId);\n signal.removeEventListener(\"abort\", onAbort);\n reject(createAbortError());\n };\n\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\nfunction backoff(attempt: number, minTimeout: number, maxTimeout: number): number {\n const delay = Math.min(maxTimeout, minTimeout * 2 ** attempt);\n return delay + Math.random() * delay * 0.1;\n}\n\nfunction hasErrorCode(error: unknown, code: string): boolean {\n return (\n !!error &&\n typeof error === \"object\" &&\n \"code\" in error &&\n (error as { code?: unknown }).code === code\n );\n}\n\nfunction hasAnyErrorCode(error: unknown, codes: readonly string[]): boolean {\n return codes.some((code) => hasErrorCode(error, code));\n}\n\nfunction isPidRunning(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n return !hasErrorCode(error, \"ESRCH\");\n }\n}\n\nfunction createDefaultFs(): FileLockFs {\n return {\n open: (path, flags) => fsPromises.open(path, flags),\n readFile: (path, encoding) => fsPromises.readFile(path, encoding),\n stat: fsPromises.stat,\n unlink: fsPromises.unlink\n };\n}\n\nasync function removeLockFile(\n fs: FileLockFs,\n lockPath: string,\n signal?: AbortSignal\n): Promise<void> {\n for (let attempt = 0; attempt <= 4; attempt += 1) {\n throwIfAborted(signal);\n\n try {\n await fs.unlink(lockPath);\n return;\n } catch (error) {\n if (hasErrorCode(error, \"ENOENT\")) {\n return;\n }\n\n if (!hasAnyErrorCode(error, [\"EPERM\", \"EBUSY\"]) || attempt === 4) {\n throw error;\n }\n }\n\n await sleep(25 * 2 ** attempt, signal);\n }\n}\n\ntype LockMetadata = {\n host: string;\n pid: number;\n};\n\nfunction parseLockMetadata(content: string): LockMetadata | undefined {\n try {\n const parsed = JSON.parse(content) as unknown;\n if (!parsed || typeof parsed !== \"object\" || !(\"host\" in parsed) || !(\"pid\" in parsed)) {\n return undefined;\n }\n\n const { host, pid } = parsed;\n if (typeof host === \"string\" && typeof pid === \"number\" && Number.isSafeInteger(pid) && pid > 0) {\n return {\n host,\n pid\n };\n }\n } catch (ignoredError) {\n void ignoredError;\n }\n\n return undefined;\n}\n\nasync function readLockMetadata(\n fs: FileLockFs,\n lockPath: string\n): Promise<LockMetadata | undefined | null> {\n if (!fs.readFile) {\n return undefined;\n }\n\n try {\n return parseLockMetadata(await fs.readFile(lockPath, \"utf8\"));\n } catch (error) {\n if (hasErrorCode(error, \"ENOENT\")) {\n return null;\n }\n\n return undefined;\n }\n}\n\nasync function shouldReclaimLock(options: {\n fs: FileLockFs;\n isPidRunning: (pid: number) => boolean;\n lockPath: string;\n staleMs: number;\n stat: Awaited<ReturnType<FileLockFs[\"stat\"]>>;\n}): Promise<boolean | \"missing\"> {\n const metadata = await readLockMetadata(options.fs, options.lockPath);\n if (metadata === null) {\n return \"missing\";\n }\n\n if (metadata?.host === os.hostname()) {\n return !options.isPidRunning(metadata.pid);\n }\n\n return Date.now() - options.stat.mtimeMs > options.staleMs;\n}\n\nasync function writeLockMetadata(handle: Awaited<ReturnType<FileLockFs[\"open\"]>>): Promise<void> {\n try {\n await handle.writeFile(\n JSON.stringify({ pid: process.pid, host: os.hostname(), acquiredAt: new Date().toISOString() }),\n { encoding: \"utf8\" }\n );\n } catch (ignoredError) {\n void ignoredError;\n }\n try {\n await handle.close();\n } catch (ignoredError) {\n void ignoredError;\n }\n}\n\nexport async function acquireFileLock(\n filePath: string,\n options: FileLockOptions = {}\n): Promise<ReleaseLock> {\n const fs = options.fs ?? createDefaultFs();\n const retries = options.retries ?? 20;\n const minTimeout = options.minTimeout ?? 25;\n const maxTimeout = options.maxTimeout ?? 250;\n const staleMs = options.staleMs ?? 1_000;\n const pidIsRunning = options.isPidRunning ?? isPidRunning;\n const lockPath = `${filePath}.lock`;\n\n let attempt = 0;\n\n while (attempt <= retries) {\n throwIfAborted(options.signal);\n\n try {\n const handle = await fs.open(lockPath, \"wx\");\n await writeLockMetadata(handle);\n let released = false;\n\n return async () => {\n if (released) {\n return;\n }\n\n released = true;\n await removeLockFile(fs, lockPath, options.signal);\n };\n } catch (error) {\n if (!hasErrorCode(error, \"EEXIST\")) {\n throw error;\n }\n }\n\n let stat: Awaited<ReturnType<FileLockFs[\"stat\"]>>;\n try {\n stat = await fs.stat(lockPath);\n } catch (statError) {\n if (hasErrorCode(statError, \"ENOENT\")) {\n continue;\n }\n\n throw statError;\n }\n\n const reclaimLock = await shouldReclaimLock({\n fs,\n isPidRunning: pidIsRunning,\n lockPath,\n staleMs,\n stat\n });\n if (reclaimLock === \"missing\") {\n continue;\n }\n\n if (reclaimLock) {\n await removeLockFile(fs, lockPath, options.signal);\n continue;\n }\n\n if (attempt >= retries) {\n break;\n }\n\n await sleep(backoff(attempt, minTimeout, maxTimeout), options.signal);\n attempt += 1;\n }\n\n throw new LockTimeoutError(`Failed to acquire lock on \"${filePath}\".`);\n}\n", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://poe-platform.github.io/poe-code/schemas/task-list/task.schema.json\",\n \"title\": \"Task\",\n \"description\": \"Persisted task payload used by task-list backends.\",\n \"type\": \"object\",\n \"properties\": {\n \"$schema\": {\n \"type\": \"string\",\n \"const\": \"https://poe-platform.github.io/poe-code/schemas/task-list/task.schema.json\"\n },\n \"kind\": {\n \"type\": \"string\",\n \"const\": \"task\"\n },\n \"version\": {\n \"type\": \"integer\",\n \"const\": 1\n },\n \"name\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"state\": {\n \"type\": \"string\"\n },\n \"description\": {\n \"type\": \"string\"\n }\n },\n \"required\": [\"name\", \"state\"],\n \"additionalProperties\": true\n}\n", "import {\n findEvent,\n type EventDef,\n type StateMachineDef\n} from \"./state-machine.js\";\nimport { InvalidTransitionError, type TaskState } from \"./types.js\";\n\nexport type TaskEvent = \"plan\" | \"start\" | \"complete\" | \"archive\";\n\nexport const defaultStateMachine = {\n initial: \"draft\",\n states: [\"draft\", \"planned\", \"in-progress\", \"done\", \"archived\"],\n events: {\n plan: { from: [\"draft\"], to: \"planned\" },\n start: { from: [\"planned\"], to: \"in-progress\" },\n complete: { from: [\"in-progress\"], to: \"done\" },\n archive: { from: \"*\", to: \"archived\" }\n }\n} as const satisfies StateMachineDef<TaskState, TaskEvent>;\n\nfunction deriveLegacyTransitions(\n machine: typeof defaultStateMachine\n): Readonly<Record<TaskState, ReadonlySet<TaskState>>> {\n const transitions = Object.fromEntries(\n machine.states.map((state) => [state, new Set<TaskState>()])\n ) as Record<TaskState, Set<TaskState>>;\n\n for (const fromState of machine.states) {\n for (const eventName of Object.keys(machine.events) as TaskEvent[]) {\n const event = findEvent(machine, fromState, eventName);\n\n if (event !== undefined) {\n transitions[fromState].add(event.to);\n }\n }\n }\n\n const terminalState = machine.events.archive.to;\n const activeStates = machine.states.filter((state) => state !== terminalState);\n\n for (let index = 1; index < activeStates.length; index += 1) {\n transitions[activeStates[index]].add(activeStates[index - 1]);\n }\n\n return transitions;\n}\n\nconst defaultTransitions = deriveLegacyTransitions(defaultStateMachine);\n\nexport function resolveStateMachine(\n stateMachine?: StateMachineDef\n): StateMachineDef {\n return stateMachine ?? defaultStateMachine;\n}\n\nexport function assertEvent<TState extends string, TEvent extends string>(\n machine: StateMachineDef<TState, TEvent>,\n fromState: TState,\n eventName: TEvent\n): EventDef<TState> {\n const event = findEvent(machine, fromState, eventName);\n\n if (event === undefined) {\n throw new InvalidTransitionError(\n `Cannot fire event \"${eventName}\" from task state \"${fromState}\".`\n );\n }\n\n return event;\n}\n\nfunction canTransition(\n machine: StateMachineDef,\n fromState: string,\n toState: string\n): boolean {\n if (Object.is(machine, defaultStateMachine)) {\n return defaultTransitions[fromState as TaskState]?.has(toState as TaskState) ?? false;\n }\n\n for (const eventName of Object.keys(machine.events)) {\n if (findEvent(machine, fromState, eventName)?.to === toState) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function assertTransition(from: TaskState, to: TaskState): void;\nexport function assertTransition<TState extends string, TEvent extends string>(\n machine: StateMachineDef<TState, TEvent>,\n from: TState,\n to: TState\n): void;\nexport function assertTransition<TState extends string, TEvent extends string>(\n machineOrFrom: StateMachineDef<TState, TEvent> | TaskState,\n fromOrTo: TState | TaskState,\n maybeTo?: TState\n): void {\n const machine =\n maybeTo === undefined\n ? defaultStateMachine\n : (machineOrFrom as StateMachineDef<TState, TEvent>);\n const fromState = maybeTo === undefined ? (machineOrFrom as TaskState) : (fromOrTo as TState);\n const toState = maybeTo === undefined ? (fromOrTo as TaskState) : maybeTo;\n\n if (!canTransition(machine, fromState, toState)) {\n throw new InvalidTransitionError(\n `Cannot transition task from \"${fromState}\" to \"${toState}\".`\n );\n }\n}\n", "import path from \"node:path\";\nimport { acquireFileLock } from \"@poe-code/file-lock\";\nimport { isMap, parseDocument, type Document, type YAMLMap } from \"yaml\";\nimport storeSchema from \"../schema/store.schema.json\" with { type: \"json\" };\nimport taskSchema from \"../schema/task.schema.json\" with { type: \"json\" };\nimport { eventsFromState, findEvent } from \"../state-machine.js\";\nimport { resolveStateMachine } from \"../state.js\";\nimport {\n AnchorNotFoundError,\n InvalidTransitionError,\n MalformedTaskError,\n OrderMismatchError,\n TaskAlreadyExistsError,\n TaskNotFoundError,\n type BackendDeps,\n type ListFilter,\n type MoveAnchor,\n type Task,\n type TaskCreate,\n type TaskFireOptions,\n type TaskList,\n type TaskListFs,\n type Tasks,\n type TaskUpdate\n} from \"../types.js\";\nimport {\n applyOrder,\n isRecord,\n sortStrings,\n statIfExists,\n validateTaskId,\n writeAtomically,\n type OrderedEntry\n} from \"./utils.js\";\n\nconst STORE_KIND = \"task-store\";\nconst STORE_SCHEMA_ID = storeSchema.$id;\nconst STORE_VERSION = 1;\nconst TASK_KIND = \"task\";\nconst TASK_SCHEMA_ID = taskSchema.$id;\nconst TASK_VERSION = 1;\nconst RESERVED_TASK_KEYS = new Set([\n \"$schema\",\n \"created\",\n \"description\",\n \"kind\",\n \"name\",\n \"state\",\n \"version\"\n]);\n\ntype StoreRecord = Record<string, unknown>;\ntype TaskRecord = Record<string, unknown>;\n\nfunction malformedStore(filePath: string, field: string): MalformedTaskError {\n return new MalformedTaskError(`Malformed task store \"${filePath}\": invalid \"${field}\".`);\n}\n\nfunction malformedTask(list: string, id: string, field: string): MalformedTaskError {\n return new MalformedTaskError(`Malformed task \"${list}/${id}\": invalid \"${field}\".`);\n}\n\nfunction validateListName(name: string): string {\n if (\n name.length === 0 ||\n name.startsWith(\".\") ||\n name.includes(\"/\") ||\n name.includes(\"\\\\\") ||\n name.includes(\"..\")\n ) {\n throw new Error(`Invalid task list name \"${name}\".`);\n }\n\n return name;\n}\n\nfunction parseQualifiedId(qualifiedId: string): {\n id: string;\n list: string;\n} {\n const separatorIndex = qualifiedId.indexOf(\"/\");\n\n if (\n separatorIndex <= 0 ||\n separatorIndex !== qualifiedId.lastIndexOf(\"/\") ||\n separatorIndex === qualifiedId.length - 1\n ) {\n throw new Error(`Invalid qualified task id \"${qualifiedId}\".`);\n }\n\n return {\n list: validateListName(qualifiedId.slice(0, separatorIndex)),\n id: validateTaskId(qualifiedId.slice(separatorIndex + 1))\n };\n}\n\nfunction descriptionFromTaskRecord(taskRecord: TaskRecord): string {\n return typeof taskRecord.description === \"string\" ? taskRecord.description : \"\";\n}\n\nfunction metadataFromTaskRecord(taskRecord: TaskRecord): Record<string, unknown> {\n const metadata: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(taskRecord)) {\n if (!RESERVED_TASK_KEYS.has(key)) {\n metadata[key] = value;\n }\n }\n\n return metadata;\n}\n\nfunction createTask(list: string, id: string, taskRecord: TaskRecord, sourcePath?: string): Task {\n return {\n list,\n id,\n qualifiedId: `${list}/${id}`,\n name: taskRecord.name as string,\n state: taskRecord.state as string,\n description: descriptionFromTaskRecord(taskRecord),\n metadata: metadataFromTaskRecord(taskRecord),\n ...(sourcePath !== undefined && { sourcePath: path.resolve(sourcePath) })\n };\n}\n\nfunction matchesFilter(task: Task, filter?: ListFilter): boolean {\n if (!filter?.includeArchived && task.state === \"archived\") {\n return false;\n }\n\n if (filter?.state !== undefined && task.state !== filter.state) {\n return false;\n }\n\n return true;\n}\n\nfunction createTaskRecord(\n defaults: BackendDeps[\"defaults\"],\n input: TaskCreate,\n initialState: string\n): TaskRecord {\n const taskRecord: TaskRecord = {\n name: input.name,\n state: initialState,\n description: input.description ?? \"\"\n };\n\n for (const [key, value] of Object.entries(defaults.metadata)) {\n if (!RESERVED_TASK_KEYS.has(key)) {\n taskRecord[key] = value;\n }\n }\n\n for (const [key, value] of Object.entries(input.metadata ?? {})) {\n if (!RESERVED_TASK_KEYS.has(key)) {\n taskRecord[key] = value;\n }\n }\n\n taskRecord.created = new Date().toISOString();\n return taskRecord;\n}\n\nfunction assertCreateDoesNotSetState(input: TaskCreate): void {\n if (Object.prototype.hasOwnProperty.call(input, \"state\")) {\n throw new Error(\n 'Tasks.create() does not accept \"state\"; new tasks always start at stateMachine.initial.'\n );\n }\n}\n\nfunction assertCreateHasId(input: TaskCreate): asserts input is TaskCreate & { id: string } {\n if (input.id === undefined) {\n throw new Error(\"id is required for yaml-file backend\");\n }\n}\n\nfunction assertUpdateDoesNotSetState(patch: TaskUpdate): void {\n if (Object.prototype.hasOwnProperty.call(patch, \"state\")) {\n throw new Error('Tasks.update() does not accept \"state\"; use fire() to change task state.');\n }\n}\n\nfunction buildUpdatedTaskRecord(existing: TaskRecord, patch: TaskUpdate): TaskRecord {\n const nextTaskRecord: TaskRecord = {\n ...existing,\n name: patch.name ?? existing.name,\n state: existing.state,\n description: patch.description ?? descriptionFromTaskRecord(existing)\n };\n\n for (const [key, value] of Object.entries(patch.metadata ?? {})) {\n if (!RESERVED_TASK_KEYS.has(key)) {\n nextTaskRecord[key] = value;\n }\n }\n\n return nextTaskRecord;\n}\n\nfunction buildTransitionedTaskRecord(existing: TaskRecord, to: string): TaskRecord {\n return {\n ...existing,\n state: to,\n description: descriptionFromTaskRecord(existing)\n };\n}\n\nfunction buildFiredTaskRecord(\n existing: TaskRecord,\n to: string,\n metadataPatch?: Record<string, unknown>\n): TaskRecord {\n const nextTaskRecord = buildTransitionedTaskRecord(existing, to);\n\n for (const [key, value] of Object.entries(metadataPatch ?? {})) {\n if (!RESERVED_TASK_KEYS.has(key)) {\n nextTaskRecord[key] = value;\n }\n }\n\n return nextTaskRecord;\n}\n\nfunction parseStoreDocument(filePath: string, content: string) {\n let document;\n\n try {\n document = parseDocument(content, { keepSourceTokens: true, prettyErrors: false });\n } catch {\n throw malformedStore(filePath, \"yaml\");\n }\n\n if (document.errors.length > 0) {\n throw malformedStore(filePath, \"yaml\");\n }\n\n return document;\n}\n\nfunction assertValidStoreRecord(store: unknown, filePath: string): asserts store is StoreRecord {\n if (!isRecord(store)) {\n throw malformedStore(filePath, \"store\");\n }\n\n if (store.$schema !== STORE_SCHEMA_ID) {\n throw malformedStore(filePath, \"$schema\");\n }\n\n if (store.kind !== STORE_KIND) {\n throw malformedStore(filePath, \"kind\");\n }\n\n if (typeof store.version !== \"number\" || !Number.isInteger(store.version) || store.version !== STORE_VERSION) {\n throw malformedStore(filePath, \"version\");\n }\n\n if (!isRecord(store.lists)) {\n throw malformedStore(filePath, \"lists\");\n }\n}\n\nfunction assertValidTaskRecord(\n taskRecord: unknown,\n list: string,\n id: string,\n validStates: ReadonlySet<string>\n): asserts taskRecord is TaskRecord {\n if (!isRecord(taskRecord)) {\n throw malformedTask(list, id, \"task\");\n }\n\n if (\"$schema\" in taskRecord && taskRecord.$schema !== TASK_SCHEMA_ID) {\n throw malformedTask(list, id, \"$schema\");\n }\n\n if (\"kind\" in taskRecord && taskRecord.kind !== TASK_KIND) {\n throw malformedTask(list, id, \"kind\");\n }\n\n if (\"version\" in taskRecord) {\n if (\n typeof taskRecord.version !== \"number\" ||\n !Number.isInteger(taskRecord.version) ||\n taskRecord.version !== TASK_VERSION\n ) {\n throw malformedTask(list, id, \"version\");\n }\n }\n\n if (typeof taskRecord.name !== \"string\" || taskRecord.name.length === 0) {\n throw malformedTask(list, id, \"name\");\n }\n\n if (typeof taskRecord.state !== \"string\" || !validStates.has(taskRecord.state)) {\n throw malformedTask(list, id, \"state\");\n }\n\n if (\"description\" in taskRecord && typeof taskRecord.description !== \"string\") {\n throw malformedTask(list, id, \"description\");\n }\n}\n\nfunction validateStoreEntries(\n store: StoreRecord,\n filePath: string,\n validStates: ReadonlySet<string>\n): void {\n const lists = store.lists;\n\n if (!isRecord(lists)) {\n throw malformedStore(filePath, \"lists\");\n }\n\n for (const [list, listRecord] of Object.entries(lists)) {\n try {\n validateListName(list);\n } catch {\n throw malformedStore(filePath, `lists.${list}`);\n }\n\n if (!isRecord(listRecord)) {\n throw malformedStore(filePath, `lists.${list}`);\n }\n\n for (const [id, taskRecord] of Object.entries(listRecord)) {\n try {\n validateTaskId(id);\n } catch {\n throw malformedTask(list, id, \"id\");\n }\n\n assertValidTaskRecord(taskRecord, list, id, validStates);\n }\n }\n}\n\nfunction serializeDocument(document: { toString(): string }): string {\n const serialized = document.toString();\n return serialized.endsWith(\"\\n\") ? serialized : `${serialized}\\n`;\n}\n\nasync function readStore(\n fs: TaskListFs,\n filePath: string,\n validStates: ReadonlySet<string>\n): Promise<{\n document: ReturnType<typeof parseStoreDocument>;\n store: StoreRecord;\n}> {\n const content = await fs.readFile(filePath, \"utf8\");\n const document = parseStoreDocument(filePath, content);\n const store = document.toJS();\n\n assertValidStoreRecord(store, filePath);\n validateStoreEntries(store, filePath, validStates);\n\n return {\n document,\n store\n };\n}\n\nfunction getListsRecord(store: StoreRecord): Record<string, unknown> {\n return store.lists as Record<string, unknown>;\n}\n\nfunction getListRecord(store: StoreRecord, list: string): Record<string, unknown> | undefined {\n const listRecord = getListsRecord(store)[list];\n return isRecord(listRecord) ? listRecord : undefined;\n}\n\nfunction getTaskRecord(store: StoreRecord, list: string, id: string): TaskRecord | undefined {\n const listRecord = getListRecord(store, list);\n const taskRecord = listRecord?.[id];\n\n return isRecord(taskRecord) ? taskRecord : undefined;\n}\n\nfunction getTaskOrThrow(store: StoreRecord, list: string, id: string): TaskRecord {\n const taskRecord = getTaskRecord(store, list, id);\n\n if (!taskRecord) {\n throw new TaskNotFoundError(`Task \"${list}/${id}\" not found.`);\n }\n\n return taskRecord;\n}\n\nfunction getListNode(document: Document, list: string): YAMLMap | undefined {\n const lists = document.get(\"lists\");\n if (!isMap(lists)) {\n return undefined;\n }\n\n const listNode = lists.get(list);\n if (!isMap(listNode)) {\n return undefined;\n }\n\n return listNode;\n}\n\nfunction pairKey(pair: { key: unknown }): string | undefined {\n const key = pair.key;\n if (typeof key === \"string\") {\n return key;\n }\n if (key && typeof key === \"object\" && \"value\" in key && typeof (key as { value: unknown }).value === \"string\") {\n return (key as { value: string }).value;\n }\n return undefined;\n}\n\nfunction findItemIndex(listNode: YAMLMap, id: string): number {\n return listNode.items.findIndex((pair) => pairKey(pair) === id);\n}\n\nfunction activeItemIds(listNode: YAMLMap, validStates: ReadonlySet<string>): string[] {\n const ids: string[] = [];\n for (const pair of listNode.items) {\n const id = pairKey(pair);\n if (id === undefined) continue;\n\n const value = pair.value;\n let state: unknown;\n if (value && typeof value === \"object\" && \"get\" in value && typeof (value as { get: unknown }).get === \"function\") {\n state = (value as YAMLMap).get(\"state\");\n } else if (isRecord(value)) {\n state = value.state;\n }\n\n if (typeof state === \"string\" && validStates.has(state) && state !== \"archived\") {\n ids.push(id);\n }\n }\n return ids;\n}\n\n\nasync function ensureStorePath(deps: BackendDeps): Promise<void> {\n if (!deps.create) {\n await deps.fs.stat(deps.path);\n return;\n }\n\n const existing = await statIfExists(deps.fs, deps.path);\n if (existing !== undefined) {\n return;\n }\n\n await writeAtomically(\n deps.fs,\n deps.path,\n serializeDocument(\n parseDocument(\n [\n `$schema: ${STORE_SCHEMA_ID}`,\n `kind: ${STORE_KIND}`,\n `version: ${STORE_VERSION}`,\n \"lists: {}\",\n \"\"\n ].join(\"\\n\")\n )\n )\n );\n}\n\nasync function withStoreLock<T>(deps: BackendDeps, action: () => Promise<T>): Promise<T> {\n const release = await acquireFileLock(deps.path, {\n fs: deps.fs,\n staleMs: deps.lockStaleMs,\n retries: deps.lockRetries\n });\n\n try {\n return await action();\n } finally {\n await release();\n }\n}\n\nfunction createTasksView(deps: BackendDeps, list: string): Tasks {\n const stateMachine = resolveStateMachine(deps.stateMachine);\n const validStates = new Set(stateMachine.states);\n\n async function readTasks(filter?: ListFilter): Promise<Task[]> {\n const { store } = await readStore(deps.fs, deps.path, validStates);\n const listRecord = getListRecord(store, list);\n\n if (!listRecord) {\n return [];\n }\n\n const entries: OrderedEntry[] = Object.entries(listRecord)\n .map(([id, taskRecord]) => ({\n task: createTask(list, id, taskRecord as TaskRecord, deps.path),\n raw: taskRecord as TaskRecord\n }))\n .filter(({ task }) => matchesFilter(task, filter));\n\n return applyOrder(entries, filter?.order);\n }\n\n function assertFireableTaskEvent(task: Task, eventName: string) {\n const event = findEvent(stateMachine, task.state, eventName);\n\n if (event === undefined) {\n throw new InvalidTransitionError({\n task,\n event: eventName,\n to: stateMachine.events[eventName]?.to,\n reason: `Cannot fire event \"${eventName}\" from task state \"${task.state}\".`\n });\n }\n\n return event;\n }\n\n return {\n name: list,\n stateMachine,\n async all(filter?: ListFilter): Promise<Task[]> {\n return readTasks(filter);\n },\n async get(id: string): Promise<Task> {\n validateTaskId(id);\n const { store } = await readStore(deps.fs, deps.path, validStates);\n return createTask(list, id, getTaskOrThrow(store, list, id), deps.path);\n },\n async create(input: TaskCreate): Promise<Task> {\n assertCreateDoesNotSetState(input);\n assertCreateHasId(input);\n validateTaskId(input.id);\n\n return withStoreLock(deps, async () => {\n const { document, store } = await readStore(deps.fs, deps.path, validStates);\n if (getTaskRecord(store, list, input.id)) {\n throw new TaskAlreadyExistsError(`Task \"${list}/${input.id}\" already exists.`);\n }\n\n const taskRecord = createTaskRecord(deps.defaults, input, stateMachine.initial);\n document.setIn([\"lists\", list, input.id], taskRecord);\n await writeAtomically(deps.fs, deps.path, serializeDocument(document));\n\n return createTask(list, input.id, taskRecord, deps.path);\n });\n },\n async update(id: string, patch: TaskUpdate): Promise<Task> {\n assertUpdateDoesNotSetState(patch);\n validateTaskId(id);\n\n return withStoreLock(deps, async () => {\n const { document, store } = await readStore(deps.fs, deps.path, validStates);\n const existing = getTaskOrThrow(store, list, id);\n const nextTaskRecord = buildUpdatedTaskRecord(existing, patch);\n\n if (patch.name !== undefined) {\n document.setIn([\"lists\", list, id, \"name\"], patch.name);\n }\n\n if (patch.description !== undefined) {\n document.setIn([\"lists\", list, id, \"description\"], patch.description);\n }\n\n for (const [key, value] of Object.entries(patch.metadata ?? {})) {\n if (!RESERVED_TASK_KEYS.has(key)) {\n document.setIn([\"lists\", list, id, key], value);\n }\n }\n\n await writeAtomically(deps.fs, deps.path, serializeDocument(document));\n\n return createTask(list, id, nextTaskRecord, deps.path);\n });\n },\n async fire(id: string, eventName: string, opts?: TaskFireOptions): Promise<Task> {\n validateTaskId(id);\n\n return withStoreLock(deps, async () => {\n const { document, store } = await readStore(deps.fs, deps.path, validStates);\n const existing = getTaskOrThrow(store, list, id);\n const task = createTask(list, id, existing, deps.path);\n const event = assertFireableTaskEvent(task, eventName);\n const guardResult = event.guard?.(task) ?? true;\n\n if (guardResult !== true) {\n throw new InvalidTransitionError({\n task,\n event: eventName,\n to: event.to,\n reason: guardResult\n });\n }\n\n await event.onExit?.(task);\n\n const nextTaskRecord = buildFiredTaskRecord(existing, event.to, opts?.metadataPatch);\n document.setIn([\"lists\", list, id, \"state\"], event.to);\n\n for (const [key, value] of Object.entries(opts?.metadataPatch ?? {})) {\n if (!RESERVED_TASK_KEYS.has(key)) {\n document.setIn([\"lists\", list, id, key], value);\n }\n }\n\n await writeAtomically(deps.fs, deps.path, serializeDocument(document));\n\n const nextTask = createTask(list, id, nextTaskRecord, deps.path);\n await event.onEnter?.(nextTask);\n\n return nextTask;\n });\n },\n async canFire(id: string, eventName: string): Promise<boolean> {\n validateTaskId(id);\n const { store } = await readStore(deps.fs, deps.path, validStates);\n const task = createTask(list, id, getTaskOrThrow(store, list, id), deps.path);\n const event = findEvent(stateMachine, task.state, eventName);\n\n if (event === undefined) {\n return false;\n }\n\n return (event.guard?.(task) ?? true) === true;\n },\n async events(id: string): Promise<readonly string[]> {\n validateTaskId(id);\n const { store } = await readStore(deps.fs, deps.path, validStates);\n const task = createTask(list, id, getTaskOrThrow(store, list, id), deps.path);\n\n return eventsFromState(stateMachine, task.state);\n },\n async delete(id: string): Promise<void> {\n validateTaskId(id);\n\n await withStoreLock(deps, async () => {\n const { document, store } = await readStore(deps.fs, deps.path, validStates);\n getTaskOrThrow(store, list, id);\n document.deleteIn([\"lists\", list, id]);\n await writeAtomically(deps.fs, deps.path, serializeDocument(document));\n });\n },\n async move(id: string, anchor: MoveAnchor): Promise<Task> {\n validateTaskId(id);\n\n return withStoreLock(deps, async () => {\n const { document, store } = await readStore(deps.fs, deps.path, validStates);\n const taskRecord = getTaskOrThrow(store, list, id);\n const listNode = getListNode(document, list);\n if (!listNode) {\n throw new TaskNotFoundError(`Task \"${list}/${id}\" not found.`);\n }\n\n const fromIndex = findItemIndex(listNode, id);\n if (fromIndex < 0) {\n throw new TaskNotFoundError(`Task \"${list}/${id}\" not found.`);\n }\n\n const [movedPair] = listNode.items.splice(fromIndex, 1);\n\n let insertIndex: number;\n if (\"position\" in anchor) {\n insertIndex = anchor.position === \"top\" ? 0 : listNode.items.length;\n } else {\n const anchorId = \"before\" in anchor ? anchor.before : anchor.after;\n const anchorIndex = findItemIndex(listNode, anchorId);\n if (anchorIndex < 0) {\n listNode.items.splice(fromIndex, 0, movedPair);\n throw new AnchorNotFoundError(anchorId);\n }\n insertIndex = \"before\" in anchor ? anchorIndex : anchorIndex + 1;\n }\n\n listNode.items.splice(insertIndex, 0, movedPair);\n await writeAtomically(deps.fs, deps.path, serializeDocument(document));\n\n return createTask(list, id, taskRecord, deps.path);\n });\n },\n async reorder(ids: readonly string[]): Promise<readonly Task[]> {\n for (const id of ids) {\n validateTaskId(id);\n }\n\n return withStoreLock(deps, async () => {\n const { document, store } = await readStore(deps.fs, deps.path, validStates);\n const listNode = getListNode(document, list);\n if (!listNode) {\n throw new OrderMismatchError({ missing: [...ids], extra: [] });\n }\n\n const currentActive = activeItemIds(listNode, validStates);\n const currentSet = new Set(currentActive);\n const inputSet = new Set(ids);\n const missing = currentActive.filter((id) => !inputSet.has(id));\n const extra = ids.filter((id) => !currentSet.has(id));\n\n if (missing.length > 0 || extra.length > 0) {\n throw new OrderMismatchError({ missing, extra });\n }\n\n const archivedPairs = listNode.items.filter((pair) => {\n const id = pairKey(pair);\n return id !== undefined && !currentSet.has(id);\n });\n const orderedActive = ids.map((id) => {\n const pair = listNode.items.find((p) => pairKey(p) === id);\n if (!pair) {\n throw new OrderMismatchError({ missing: [id], extra: [] });\n }\n return pair;\n });\n\n listNode.items.splice(0, listNode.items.length, ...orderedActive, ...archivedPairs);\n await writeAtomically(deps.fs, deps.path, serializeDocument(document));\n\n const tasks = ids.map((id) =>\n createTask(list, id, getTaskOrThrow(store, list, id), deps.path)\n );\n return tasks;\n });\n }\n };\n}\n\nexport async function yamlFileBackend(deps: BackendDeps): Promise<TaskList> {\n await ensureStorePath(deps);\n const stateMachine = resolveStateMachine(deps.stateMachine);\n const validStates = new Set(stateMachine.states);\n\n const list = (name: string): Tasks => {\n const listName = validateListName(name);\n return createTasksView({ ...deps, stateMachine }, listName);\n };\n\n const lists = async (): Promise<string[]> => {\n const { store } = await readStore(deps.fs, deps.path, validStates);\n return sortStrings(Object.keys(getListsRecord(store)));\n };\n\n const allTasks = async (filter?: ListFilter): Promise<Task[]> => {\n const { store } = await readStore(deps.fs, deps.path, validStates);\n const result: Task[] = [];\n\n const listNames = sortStrings(Object.keys(getListsRecord(store)));\n for (const listName of listNames) {\n const listRecord = getListsRecord(store)[listName];\n if (!isRecord(listRecord)) continue;\n\n const entries: OrderedEntry[] = Object.entries(listRecord)\n .map(([id, taskRecord]) => ({\n task: createTask(listName, id, taskRecord as TaskRecord, deps.path),\n raw: taskRecord as TaskRecord\n }))\n .filter(({ task }) => matchesFilter(task, filter));\n\n result.push(...applyOrder(entries, filter?.order));\n }\n\n return result;\n };\n\n const get = async (qualifiedId: string): Promise<Task> => {\n const { list: listName, id } = parseQualifiedId(qualifiedId);\n return list(listName).get(id);\n };\n\n const moveBetweenLists = async (qualifiedId: string, targetList: string): Promise<Task> => {\n const { list: sourceListName, id } = parseQualifiedId(qualifiedId);\n const targetListName = validateListName(targetList);\n\n return withStoreLock(deps, async () => {\n const { document, store } = await readStore(deps.fs, deps.path, validStates);\n const taskRecord = getTaskOrThrow(store, sourceListName, id);\n\n if (sourceListName === targetListName) {\n return createTask(targetListName, id, taskRecord, deps.path);\n }\n\n if (getTaskRecord(store, targetListName, id)) {\n throw new TaskAlreadyExistsError(`Task \"${targetListName}/${id}\" already exists.`);\n }\n\n document.deleteIn([\"lists\", sourceListName, id]);\n document.setIn([\"lists\", targetListName, id], taskRecord);\n await writeAtomically(deps.fs, deps.path, serializeDocument(document));\n\n return createTask(targetListName, id, taskRecord, deps.path);\n });\n };\n\n return {\n list,\n lists,\n allTasks,\n get,\n moveBetweenLists\n };\n}\n", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://poe-platform.github.io/poe-code/schemas/task-list/store.schema.json\",\n \"title\": \"Task Store\",\n \"description\": \"YAML multi-list task store.\",\n \"type\": \"object\",\n \"properties\": {\n \"$schema\": {\n \"type\": \"string\",\n \"const\": \"https://poe-platform.github.io/poe-code/schemas/task-list/store.schema.json\"\n },\n \"kind\": {\n \"type\": \"string\",\n \"const\": \"task-store\"\n },\n \"version\": {\n \"type\": \"integer\",\n \"const\": 1\n },\n \"lists\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"$ref\": \"./task.schema.json\"\n }\n }\n }\n },\n \"required\": [\"$schema\", \"kind\", \"version\", \"lists\"],\n \"additionalProperties\": false\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 apiShapes: [\"anthropic-messages\"],\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 apiShapes: [\"openai-responses\"],\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 geminiCliAgent: AgentDefinition = {\n id: \"gemini-cli\",\n name: \"gemini-cli\",\n aliases: [\"gemini\"],\n label: \"Gemini CLI\",\n summary: \"Configure Google's Gemini CLI to use a compatible Google generations API.\",\n binaryName: \"gemini\",\n configPath: \"~/.gemini/settings.json\",\n apiShapes: [\"google-generations\"],\n branding: {\n colors: {\n dark: \"#8AB4F8\",\n light: \"#1A73E8\"\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 apiShapes: [\"openai-chat-completions\"],\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 apiShapes: [\"openai-chat-completions\"],\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\";\n\nexport const gooseAgent: AgentDefinition = {\n id: \"goose\",\n name: \"goose\",\n label: \"Goose\",\n summary: \"Block's open-source AI agent with ACP support.\",\n binaryName: \"goose\",\n apiShapes: [\"openai-chat-completions\"],\n configPath: \"~/.config/goose/config.yaml\",\n branding: {\n colors: {\n dark: \"#FF6B35\",\n light: \"#E85D26\"\n }\n }\n};\n", "import type { AgentDefinition } from \"../types.js\";\n\nexport const poeAgentAgent: AgentDefinition = {\n id: \"poe-agent\",\n name: \"poe-agent\",\n label: \"Poe Agent\",\n summary: \"Run one-shot prompts with the built-in Poe agent runtime.\",\n apiShapes: [\"openai-responses\", \"openai-chat-completions\"],\n configPath: \"~/.poe-code/config.json\",\n branding: {\n colors: {\n dark: \"#A465F7\",\n light: \"#7A3FD3\"\n }\n }\n};\n", "import type { AgentDefinition } from \"./types.js\";\nimport {\n claudeCodeAgent,\n claudeDesktopAgent,\n codexAgent,\n geminiCliAgent,\n openCodeAgent,\n kimiAgent,\n gooseAgent,\n poeAgentAgent\n} from \"./agents/index.js\";\n\nexport const allAgents: AgentDefinition[] = [\n claudeCodeAgent,\n claudeDesktopAgent,\n codexAgent,\n geminiCliAgent,\n openCodeAgent,\n kimiAgent,\n gooseAgent,\n poeAgentAgent\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 { allAgents, parseAgentSpecifier, resolveAgentId } from \"@poe-code/agent-defs\";\n\ntype Select = typeof import(\"@poe-code/design-system\").select;\ntype IsCancel = typeof import(\"@poe-code/design-system\").isCancel;\n\nexport interface ResolveLoopAgentInput {\n providedAgent?: string;\n configuredDefaultAgent?: string | null;\n frontmatterAgent?: string | string[];\n assumeYes: boolean;\n fallbackAgent: string;\n message: string;\n select: Select;\n isCancel: IsCancel;\n}\n\nconst loopAgents = allAgents.filter(\n (agent) => agent.binaryName !== undefined || agent.id === \"poe-agent\"\n);\nconst supportedAgents = loopAgents.map((agent) => agent.id).join(\", \");\n\nfunction resolveSelectedAgent(agent: string): { agent: string } {\n const specifier = parseAgentSpecifier(agent);\n const resolvedAgentId = resolveAgentId(specifier.agent);\n\n if (!resolvedAgentId || !loopAgents.some((agent) => agent.id === resolvedAgentId)) {\n throw new Error(`Unsupported agent \"${agent}\". Supported agents: ${supportedAgents}`);\n }\n\n return {\n agent: specifier.model ? `${resolvedAgentId}:${specifier.model}` : resolvedAgentId\n };\n}\n\nexport async function resolveLoopAgent(\n input: ResolveLoopAgentInput\n): Promise<{ agent: string } | { cancelled: true }> {\n if (input.providedAgent !== undefined) {\n return resolveSelectedAgent(input.providedAgent);\n }\n\n if (Array.isArray(input.frontmatterAgent)) {\n throw new Error(\"array handled by caller\");\n }\n\n if (typeof input.frontmatterAgent === \"string\") {\n return resolveSelectedAgent(input.frontmatterAgent);\n }\n\n if (input.configuredDefaultAgent !== undefined && input.configuredDefaultAgent !== null) {\n return resolveSelectedAgent(input.configuredDefaultAgent);\n }\n\n if (input.assumeYes) {\n return resolveSelectedAgent(input.fallbackAgent);\n }\n\n const selectedAgent = await input.select({\n message: input.message,\n options: loopAgents.map((agent) => ({\n value: agent.id,\n label: agent.label,\n hint: agent.summary\n }))\n });\n\n if (input.isCancel(selectedAgent)) {\n return { cancelled: true };\n }\n\n return resolveSelectedAgent(selectedAgent);\n}\n", "import path from \"node:path\";\n\nexport interface ResolveRunLogDirOptions {\n planPath: string;\n runner: string;\n homeDir: string;\n}\n\nexport function resolveRunLogDir(options: ResolveRunLogDirOptions): string {\n const slug = slugifyPlanPath(options.planPath);\n return path.join(options.homeDir, \".poe-code\", \"logs\", options.runner, slug);\n}\n\nexport function slugifyPlanPath(planPath: string): string {\n const base = path.basename(planPath);\n const dot = base.lastIndexOf(\".\");\n const stem = dot > 0 ? base.slice(0, dot) : base;\n return slugifyLabel(stem);\n}\n\nexport function makeRunLogFileName(role: string, date: Date = new Date()): string {\n const day = `${date.getUTCFullYear()}${pad(date.getUTCMonth() + 1, 2)}${pad(date.getUTCDate(), 2)}`;\n const time = `${pad(date.getUTCHours(), 2)}${pad(date.getUTCMinutes(), 2)}${pad(date.getUTCSeconds(), 2)}`;\n const ms = pad(date.getUTCMilliseconds(), 3);\n const safeRole = slugifyLabel(role) || \"role\";\n return `${day}-${time}-${ms}-${safeRole}.jsonl`;\n}\n\nfunction slugifyLabel(value: string): string {\n let out = \"\";\n for (const char of value) {\n const code = char.charCodeAt(0);\n const lower = code >= 97 && code <= 122;\n const upper = code >= 65 && code <= 90;\n const digit = code >= 48 && code <= 57;\n\n if (lower || digit) {\n out += char;\n } else if (upper) {\n out += String.fromCharCode(code + 32);\n } else if (char === \"-\" || char === \"_\") {\n out += char;\n } else {\n out += \"-\";\n }\n }\n\n return collapseDashes(out).replace(/^-+|-+$/g, \"\");\n}\n\nfunction collapseDashes(value: string): string {\n let out = \"\";\n let prevDash = false;\n for (const char of value) {\n if (char === \"-\") {\n if (!prevDash) {\n out += \"-\";\n }\n prevDash = true;\n } else {\n out += char;\n prevDash = false;\n }\n }\n return out;\n}\n\nfunction pad(value: number, width: number): string {\n return String(value).padStart(width, \"0\");\n}\n", "import nodeFs from \"node:fs\";\nimport type { FSWatcher } from \"node:fs\";\nimport type { LogChunk } from \"./execution-env.js\";\n\nconst JOB_DIR = \"/tmp/poe-jobs\";\nconst POLL_INTERVAL_MS = 250;\n\nexport interface LogStreamEnv {\n fs?: LogStreamFs;\n}\n\nexport interface LogStreamFs {\n promises: {\n readFile(path: string): Promise<Buffer | string>;\n stat?(path: string): Promise<{ mtimeMs: number }>;\n };\n watch?: (path: string, listener: () => void) => FSWatcher;\n}\n\nexport function wrapForLogTee(argv: string[], jobId: string): string[] {\n if (argv.length === 0) {\n throw new Error(\"wrapForLogTee requires argv to contain at least one argument\");\n }\n\n const command = argv.map(shellQuote).join(\" \");\n const logFile = shellQuote(jobLogPath(jobId));\n const exitFile = shellQuote(jobExitPath(jobId));\n const exitTmpFile = shellQuote(`${jobExitPath(jobId)}.tmp`);\n const script = [\n `mkdir -p ${shellQuote(JOB_DIR)}`,\n `({ (${command}); echo $? > ${exitTmpFile}; } 2>&1 | tee ${logFile}; mv ${exitTmpFile} ${exitFile})`\n ].join(\" && \");\n\n return [\"sh\", \"-c\", script];\n}\n\nexport async function* streamLogFile(\n env: LogStreamEnv,\n jobId: string,\n opts: { sinceByte?: number; since?: Date }\n): AsyncIterable<LogChunk> {\n const fs = env.fs ?? nodeFs;\n const file = jobLogPath(jobId);\n let byteOffset = opts.sinceByte ?? 0;\n\n while (true) {\n if (opts.since !== undefined && !(await wasModifiedSince(fs, file, opts.since))) {\n await waitForLogChange(fs, file);\n continue;\n }\n\n const result = await readLogChunk(fs, file, byteOffset);\n if (result !== null) {\n byteOffset = result.nextByteOffset;\n yield result.chunk;\n continue;\n }\n\n await waitForLogChange(fs, file);\n }\n}\n\nasync function wasModifiedSince(fs: LogStreamFs, file: string, since: Date): Promise<boolean> {\n if (fs.promises.stat === undefined) {\n return true;\n }\n\n try {\n const stat = await fs.promises.stat(file);\n return stat.mtimeMs >= since.getTime();\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n}\n\nexport async function waitForExit(\n env: LogStreamEnv,\n jobId: string,\n opts: { signal?: AbortSignal } = {}\n): Promise<{ exitCode: number }> {\n const fs = env.fs ?? nodeFs;\n const file = jobExitPath(jobId);\n\n while (true) {\n throwIfAborted(opts.signal);\n const contents = await readTextFileIfExists(fs, file);\n if (contents !== null) {\n const text = contents.trim();\n const exitCode = Number(text);\n if (text.length === 0 || !Number.isInteger(exitCode)) {\n throw new Error(`Invalid exit code in ${file}: ${contents}`);\n }\n return { exitCode };\n }\n\n await sleep(POLL_INTERVAL_MS, opts.signal);\n }\n}\n\nfunction jobLogPath(jobId: string): string {\n return `${JOB_DIR}/${jobId}.log`;\n}\n\nfunction jobExitPath(jobId: string): string {\n return `${JOB_DIR}/${jobId}.exit`;\n}\n\nasync function readLogChunk(\n fs: LogStreamFs,\n file: string,\n byteOffset: number\n): Promise<{ chunk: LogChunk; nextByteOffset: number } | null> {\n const contents = await readFileIfExists(fs, file);\n if (contents === null || byteOffset >= contents.byteLength) {\n return null;\n }\n\n return {\n chunk: {\n byteOffset,\n data: contents.subarray(byteOffset).toString(\"utf8\")\n },\n nextByteOffset: contents.byteLength\n };\n}\n\nasync function readTextFileIfExists(fs: LogStreamFs, file: string): Promise<string | null> {\n const contents = await readFileIfExists(fs, file);\n return contents?.toString(\"utf8\") ?? null;\n}\n\nasync function readFileIfExists(fs: LogStreamFs, file: string): Promise<Buffer | null> {\n try {\n const contents = await fs.promises.readFile(file);\n return Buffer.isBuffer(contents) ? contents : Buffer.from(contents);\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n}\n\nasync function waitForLogChange(fs: LogStreamFs, file: string): Promise<void> {\n const watch = fs.watch;\n if (typeof watch !== \"function\") {\n await sleep(POLL_INTERVAL_MS);\n return;\n }\n\n await new Promise<void>((resolve) => {\n let watcher: FSWatcher | null = null;\n const timer = setTimeout(done, POLL_INTERVAL_MS);\n\n function done(): void {\n clearTimeout(timer);\n watcher?.close();\n resolve();\n }\n\n try {\n watcher = watch(file, done);\n } catch {\n done();\n }\n });\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n let timer: NodeJS.Timeout | null = null;\n const abort = () => {\n if (timer !== null) {\n clearTimeout(timer);\n }\n reject(new Error(\"waitForExit aborted.\"));\n };\n\n if (signal?.aborted) {\n abort();\n return;\n }\n\n timer = setTimeout(() => {\n signal?.removeEventListener(\"abort\", abort);\n resolve();\n }, ms);\n signal?.addEventListener(\"abort\", abort, { once: true });\n });\n}\n\nfunction throwIfAborted(signal: AbortSignal | undefined): void {\n if (signal?.aborted) {\n throw new Error(\"waitForExit aborted.\");\n }\n}\n\nfunction shellQuote(value: string): string {\n return `'${value.replaceAll(\"'\", \"'\\\\''\")}'`;\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error;\n}\n", "import { randomBytes } from \"node:crypto\";\nimport { allAgents, resolveAgentId } from \"@poe-code/agent-defs\";\nimport type { StateManager } from \"@poe-code/poe-code-config\";\nimport type { RunHandle } from \"@poe-code/process-runner\";\nimport type { Readable } from \"node:stream\";\nimport { createBinaryExistsDetectors } from \"./binary-exists.js\";\nimport type { DownloadResult, ExecutionEnvFactory, OpenedEnv, OpenSpec } from \"./execution-env.js\";\nimport { waitForExit, wrapForLogTee, type LogStreamEnv } from \"./log-stream.js\";\n\nconst ULID_ALPHABET = \"0123456789ABCDEFGHJKMNPQRSTVWXYZ\";\n\nexport async function runPoeCommand(opts: {\n factory: ExecutionEnvFactory;\n openSpec: OpenSpec;\n detach: boolean;\n state: StateManager;\n signal?: AbortSignal;\n}): Promise<\n | {\n kind: \"sync\";\n exitCode: number;\n download: DownloadResult;\n stdout?: string;\n stderr?: string;\n }\n | { kind: \"detached\"; jobId: string; envId: string }\n> {\n const jobId = createUlid();\n const execution = opts.openSpec.execution;\n const wrapCommand = execution?.wrapForLogTee !== false;\n const pendingJob = opts.state.jobs.put({\n id: jobId,\n env_id: \"\",\n env_kind: opts.factory.type,\n tool: opts.openSpec.jobLabel.tool,\n argv: opts.openSpec.jobLabel.argv,\n cwd: opts.openSpec.cwd,\n started_at: \"\",\n status: \"pending\"\n });\n\n const opened = opts.factory.open(opts.openSpec);\n const env = isPromiseLike(opened) ? await opened : opened;\n let shouldClose = true;\n\n try {\n const upload = env.uploadWorkspace();\n await Promise.all([pendingJob, upload]);\n await configureE2bSpawnAgentIfAvailable({\n env,\n openSpec: opts.openSpec,\n factoryType: opts.factory.type\n });\n const argv = wrapCommand\n ? wrapForLogTee(opts.openSpec.jobLabel.argv, jobId)\n : opts.openSpec.jobLabel.argv;\n const handle = execution?.tty\n ? env.shell()\n : env.exec({\n command: argv[0],\n args: argv.slice(1),\n cwd: opts.openSpec.cwd,\n env: resolveExecutionEnv(opts.openSpec),\n stdin: execution?.stdin ?? \"inherit\",\n stdout: execution?.stdout ?? \"pipe\",\n stderr: execution?.stderr ?? \"pipe\",\n signal: opts.signal\n });\n\n if (execution?.input !== undefined) {\n writeExecutionInput(handle, execution.input);\n }\n\n const runningJob = opts.state.jobs.update(jobId, {\n status: \"running\",\n env_id: env.id,\n started_at: new Date().toISOString()\n });\n\n if (opts.detach) {\n await runningJob;\n setDetachedJobContext(env, {\n id: jobId,\n tool: opts.openSpec.jobLabel.tool,\n argv: opts.openSpec.jobLabel.argv\n });\n await env.detach();\n shouldClose = false;\n return { kind: \"detached\", jobId, envId: env.id };\n }\n\n const result = await runSync({\n env,\n handle,\n jobId,\n openSpec: opts.openSpec,\n signal: opts.signal,\n wrapCommand\n });\n await runningJob;\n shouldClose = false;\n\n await opts.state.jobs.update(jobId, {\n status: \"exited\",\n exit_code: result.exitCode,\n exited_at: new Date().toISOString()\n });\n\n return {\n kind: \"sync\",\n exitCode: result.exitCode,\n download: result.download,\n ...(result.stdout !== undefined ? { stdout: result.stdout } : {}),\n ...(result.stderr !== undefined ? { stderr: result.stderr } : {})\n };\n } finally {\n if (shouldClose) {\n await env.close();\n }\n }\n}\n\nexport interface PoeCommandSession {\n run(\n openSpec: OpenSpec,\n signal?: AbortSignal\n ): Promise<{\n kind: \"sync\";\n exitCode: number;\n download: DownloadResult;\n stdout?: string;\n stderr?: string;\n }>;\n close(): Promise<void>;\n}\n\nexport function createPoeCommandSession(opts: {\n factory: ExecutionEnvFactory;\n state: StateManager;\n}): PoeCommandSession {\n let env: OpenedEnv | null = null;\n let closed = false;\n\n async function getEnv(openSpec: OpenSpec): Promise<OpenedEnv> {\n if (closed) {\n throw new Error(\"Cannot run command after Poe command session is closed.\");\n }\n\n if (env !== null) {\n return env;\n }\n\n const opened = opts.factory.open(openSpec);\n env = isPromiseLike(opened) ? await opened : opened;\n await env.uploadWorkspace();\n return env;\n }\n\n return {\n async run(openSpec, signal) {\n const jobId = createUlid();\n const pendingJob = opts.state.jobs.put({\n id: jobId,\n env_id: \"\",\n env_kind: opts.factory.type,\n tool: openSpec.jobLabel.tool,\n argv: openSpec.jobLabel.argv,\n cwd: openSpec.cwd,\n started_at: \"\",\n status: \"pending\"\n });\n const currentEnv = await getEnv(openSpec);\n await pendingJob;\n await configureE2bSpawnAgentIfAvailable({\n env: currentEnv,\n openSpec,\n factoryType: opts.factory.type\n });\n const wrapCommand = openSpec.execution?.wrapForLogTee !== false;\n const argv = wrapCommand\n ? wrapForLogTee(openSpec.jobLabel.argv, jobId)\n : openSpec.jobLabel.argv;\n const handle = openSpec.execution?.tty\n ? currentEnv.shell()\n : currentEnv.exec({\n command: argv[0],\n args: argv.slice(1),\n cwd: openSpec.cwd,\n env: resolveExecutionEnv(openSpec),\n stdin: openSpec.execution?.stdin ?? \"inherit\",\n stdout: openSpec.execution?.stdout ?? \"pipe\",\n stderr: openSpec.execution?.stderr ?? \"pipe\",\n signal\n });\n\n if (openSpec.execution?.input !== undefined) {\n writeExecutionInput(handle, openSpec.execution.input);\n }\n\n await opts.state.jobs.update(jobId, {\n status: \"running\",\n env_id: currentEnv.id,\n started_at: new Date().toISOString()\n });\n\n const result = await runSync({\n env: currentEnv,\n handle,\n jobId,\n openSpec,\n signal,\n wrapCommand,\n closeAfterDownload: false\n });\n\n await opts.state.jobs.update(jobId, {\n status: \"exited\",\n exit_code: result.exitCode,\n exited_at: new Date().toISOString()\n });\n\n return {\n kind: \"sync\",\n exitCode: result.exitCode,\n download: result.download,\n ...(result.stdout !== undefined ? { stdout: result.stdout } : {}),\n ...(result.stderr !== undefined ? { stderr: result.stderr } : {})\n };\n },\n async close() {\n if (closed) {\n return;\n }\n closed = true;\n await env?.close();\n }\n };\n}\n\nasync function configureE2bSpawnAgentIfAvailable(opts: {\n env: OpenedEnv;\n openSpec: OpenSpec;\n factoryType: string;\n}): Promise<void> {\n if (opts.factoryType !== \"e2b\") {\n return;\n }\n\n const agentId = resolveAgentId(opts.openSpec.jobLabel.tool);\n const agent = allAgents.find((candidate) => candidate.id === agentId);\n const binaryName = agent?.binaryName;\n if (!agentId || !binaryName) {\n return;\n }\n\n const commandEnv = resolveExecutionEnv(opts.openSpec);\n const exists = await binaryExists(opts.env, {\n binaryName,\n cwd: opts.openSpec.cwd,\n env: commandEnv\n });\n if (!exists) {\n return;\n }\n\n const result = await runProbeCommand(opts.env, {\n command: \"poe-code\",\n args: [\"configure\", \"--yes\", \"--provider\", \"poe\", agentId],\n cwd: opts.openSpec.cwd,\n env: commandEnv\n });\n if (result.exitCode !== 0) {\n throw new Error(\n `Failed to configure ${agentId} for Poe inside E2B sandbox.\\n${formatProbeResult(result)}`\n );\n }\n}\n\nasync function binaryExists(\n env: OpenedEnv,\n opts: { binaryName: string; cwd: string; env: Record<string, string> | undefined }\n): Promise<boolean> {\n for (const detector of createBinaryExistsDetectors(opts.binaryName)) {\n const result = await runProbeCommand(env, {\n ...detector,\n cwd: opts.cwd,\n env: opts.env\n });\n if (detector.validate(result)) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction resolveExecutionEnv(openSpec: OpenSpec): Record<string, string> | undefined {\n const execution = openSpec.execution;\n return execution?.env ?? openSpec.env;\n}\n\nasync function runProbeCommand(\n env: OpenedEnv,\n spec: {\n command: string;\n args?: string[];\n cwd: string;\n env: Record<string, string> | undefined;\n }\n): Promise<{ exitCode: number; stdout: string; stderr: string }> {\n const handle = env.exec({\n command: spec.command,\n args: spec.args,\n cwd: spec.cwd,\n env: spec.env,\n stdin: \"ignore\",\n stdout: \"pipe\",\n stderr: \"pipe\"\n });\n const stdout = readStream(handle.stdout);\n const stderr = readStream(handle.stderr);\n const result = await handle.result;\n return {\n exitCode: result.exitCode,\n stdout: await stdout,\n stderr: await stderr\n };\n}\n\nfunction readStream(stream: Readable | null): Promise<string> {\n if (!stream) {\n return Promise.resolve(\"\");\n }\n return new Promise((resolve, reject) => {\n let output = \"\";\n stream.setEncoding(\"utf8\");\n stream.on(\"data\", (chunk) => {\n output += chunk.toString();\n });\n stream.on(\"error\", reject);\n stream.on(\"end\", () => resolve(output));\n });\n}\n\nfunction formatProbeResult(result: { exitCode: number; stdout: string; stderr: string }): string {\n return [\n `Exit code: ${result.exitCode}`,\n result.stdout.trim() ? `stdout:\\n${result.stdout.trim()}` : \"\",\n result.stderr.trim() ? `stderr:\\n${result.stderr.trim()}` : \"\"\n ]\n .filter(Boolean)\n .join(\"\\n\");\n}\n\nasync function runSync(opts: {\n env: OpenedEnv;\n handle: RunHandle;\n jobId: string;\n openSpec: OpenSpec;\n signal?: AbortSignal;\n wrapCommand: boolean;\n closeAfterDownload?: boolean;\n}): Promise<{ exitCode: number; download: DownloadResult; stdout?: string; stderr?: string }> {\n const execution = opts.openSpec.execution;\n const capture = execution?.captureOutput === true;\n const abort = createAbortSync(opts.signal, opts.handle, execution?.activityTimeoutMs);\n const streamState = capture\n ? captureRunStreams(opts.handle, execution, abort.resetActivityTimer)\n : pipeRunStreams(opts.handle);\n abort.resetActivityTimer();\n\n try {\n const { exitCode } = opts.wrapCommand\n ? await abort.waitForExit(opts.env, opts.jobId)\n : await abort.waitForHandle();\n const download = await opts.env.downloadWorkspace({\n conflictPolicy: opts.openSpec.runner?.download_conflict ?? \"refuse\"\n });\n if (opts.closeAfterDownload !== false) {\n await opts.env.close();\n }\n return {\n exitCode,\n download,\n ...(capture ? { stdout: streamState.stdout(), stderr: streamState.stderr() } : {})\n };\n } finally {\n abort.dispose();\n streamState.dispose();\n }\n}\n\nfunction pipeRunStreams(handle: RunHandle): {\n stdout(): string;\n stderr(): string;\n dispose(): void;\n} {\n handle.stdout?.pipe(process.stdout, { end: false });\n handle.stderr?.pipe(process.stderr, { end: false });\n return {\n stdout: () => \"\",\n stderr: () => \"\",\n dispose() {\n handle.stdout?.unpipe(process.stdout);\n handle.stderr?.unpipe(process.stderr);\n }\n };\n}\n\nfunction captureRunStreams(\n handle: RunHandle,\n execution: NonNullable<OpenSpec[\"execution\"]> | undefined,\n onActivity: () => void\n): {\n stdout(): string;\n stderr(): string;\n dispose(): void;\n} {\n let stdout = \"\";\n let stderr = \"\";\n const listeners: Array<() => void> = [];\n\n const bind = (stream: Readable | null, onChunk: (chunk: string) => void): void => {\n if (!stream) return;\n stream.setEncoding(\"utf8\");\n const listener = (chunk: string | Buffer) => {\n onActivity();\n onChunk(chunk.toString());\n };\n stream.on(\"data\", listener);\n listeners.push(() => {\n stream.off(\"data\", listener);\n });\n };\n\n bind(handle.stdout, (chunk) => {\n stdout += chunk;\n execution?.onStdout?.(chunk);\n });\n bind(handle.stderr, (chunk) => {\n stderr += chunk;\n execution?.onStderr?.(chunk);\n });\n\n return {\n stdout: () => stdout,\n stderr: () => stderr,\n dispose() {\n for (const remove of listeners) {\n remove();\n }\n }\n };\n}\n\nfunction createAbortSync(\n signal: AbortSignal | undefined,\n handle: RunHandle,\n activityTimeoutMs: number | undefined\n): {\n waitForExit(env: OpenedEnv, jobId: string): Promise<{ exitCode: number }>;\n waitForHandle(): Promise<{ exitCode: number }>;\n resetActivityTimer(): void;\n dispose(): void;\n} {\n let activityTimer: ReturnType<typeof setTimeout> | undefined;\n let timedOut = false;\n const resetActivityTimer = activityTimeoutMs\n ? () => {\n if (activityTimer) clearTimeout(activityTimer);\n activityTimer = setTimeout(() => {\n timedOut = true;\n handle.kill(\"SIGTERM\");\n notifyAbort?.();\n }, activityTimeoutMs);\n }\n : () => {};\n let notifyAbort: (() => void) | undefined;\n\n if (signal === undefined) {\n return {\n waitForExit: (env, jobId) => waitForExit(toLogStreamEnv(env), jobId),\n waitForHandle: async () => {\n const result = await handle.result;\n if (timedOut) {\n throw createActivityTimeoutError(activityTimeoutMs!);\n }\n return result;\n },\n resetActivityTimer,\n dispose() {\n if (activityTimer) clearTimeout(activityTimer);\n }\n };\n }\n\n const exitWaitController = new AbortController();\n let aborted = signal.aborted;\n const abortedPromise = new Promise<void>((resolve) => {\n notifyAbort = resolve;\n });\n const kill = () => {\n aborted = true;\n handle.kill(\"SIGTERM\");\n notifyAbort?.();\n };\n\n if (signal.aborted) {\n kill();\n } else {\n signal.addEventListener(\"abort\", kill, { once: true });\n }\n\n return {\n async waitForExit(env, jobId) {\n if (aborted) {\n return handle.result;\n }\n\n const exit = waitForExit(toLogStreamEnv(env), jobId, {\n signal: exitWaitController.signal\n }).then(\n (value) => ({ kind: \"exit\" as const, value }),\n (error: unknown) => ({ kind: \"error\" as const, error })\n );\n const result = await Promise.race([\n exit,\n abortedPromise.then(() => ({ kind: \"abort\" as const }))\n ]);\n\n if (result.kind === \"exit\") {\n return result.value;\n }\n\n if (result.kind === \"error\") {\n throw result.error;\n }\n\n exitWaitController.abort();\n return handle.result;\n },\n async waitForHandle() {\n const result = await Promise.race([\n handle.result.then((value) => ({ kind: \"exit\" as const, value })),\n abortedPromise.then(() => ({ kind: \"abort\" as const }))\n ]);\n\n if (result.kind === \"exit\") {\n if (aborted) {\n throw createAbortError();\n }\n if (timedOut) {\n throw createActivityTimeoutError(activityTimeoutMs!);\n }\n return result.value;\n }\n\n if (timedOut) {\n throw createActivityTimeoutError(activityTimeoutMs!);\n }\n throw createAbortError();\n },\n resetActivityTimer,\n dispose() {\n if (activityTimer) clearTimeout(activityTimer);\n exitWaitController.abort();\n signal.removeEventListener(\"abort\", kill);\n }\n };\n}\n\nfunction toLogStreamEnv(env: OpenedEnv): LogStreamEnv {\n const candidate = env as OpenedEnv & LogStreamEnv;\n return candidate.fs === undefined ? {} : { fs: candidate.fs };\n}\n\nfunction setDetachedJobContext(\n env: OpenedEnv,\n context: { id: string; tool: string; argv: string[] }\n): void {\n const candidate = env as OpenedEnv & {\n setDetachedJobContext?: (value: { id: string; tool: string; argv: string[] }) => void;\n };\n candidate.setDetachedJobContext?.(context);\n}\n\nfunction writeExecutionInput(handle: RunHandle, input: string | Buffer): void {\n const stdin = handle.stdin;\n if (stdin === null) {\n return;\n }\n\n stdin.on(\"error\", (error: NodeJS.ErrnoException) => {\n if (error.code !== \"EPIPE\") {\n throw error;\n }\n });\n stdin.setDefaultEncoding(\"utf8\");\n stdin.end(input);\n}\n\nfunction isPromiseLike<T>(value: T | Promise<T>): value is Promise<T> {\n return typeof (value as Promise<T>).then === \"function\";\n}\n\nfunction createAbortError(): Error {\n const error = new Error(\"Agent spawn aborted\");\n error.name = \"AbortError\";\n return error;\n}\n\nfunction createActivityTimeoutError(timeoutMs: number): Error {\n const error = new Error(`Agent spawn timed out after ${timeoutMs / 1000}s of inactivity`);\n error.name = \"ActivityTimeoutError\";\n return error;\n}\n\nfunction createUlid(): string {\n const time = BigInt(Date.now());\n const random = randomBytes(10);\n let randomValue = 0n;\n\n for (const byte of random) {\n randomValue = (randomValue << 8n) | BigInt(byte);\n }\n\n return encodeBase32(time, 10) + encodeBase32(randomValue, 16);\n}\n\nfunction encodeBase32(value: bigint, length: number): string {\n const chars = Array.from({ length }, () => \"0\");\n let remaining = value;\n\n for (let index = length - 1; index >= 0; index -= 1) {\n chars[index] = ULID_ALPHABET[Number(remaining & 31n)];\n remaining >>= 5n;\n }\n\n return chars.join(\"\");\n}\n", "export interface BinaryExistsDetectorResult {\n exitCode: number;\n stdout: string;\n}\n\nexport interface BinaryExistsDetector {\n command: string;\n args: string[];\n validate(result: BinaryExistsDetectorResult): boolean;\n}\n\nexport function createBinaryExistsDetectors(binaryName: string): BinaryExistsDetector[] {\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 return [\n {\n command: \"which\",\n args: [binaryName],\n validate: (result) => result.exitCode === 0\n },\n {\n command: \"where\",\n args: [binaryName],\n validate: (result) => result.exitCode === 0 && result.stdout.trim().length > 0\n },\n {\n command: \"sh\",\n args: [\"-c\", commonPaths.map((p) => `test -f \"${p}\"`).join(\" || \")],\n validate: (result) => result.exitCode === 0\n }\n ];\n}\n", "import { existsSync, readFileSync } from \"node:fs\";\nimport os from \"node:os\";\nimport {\n createStateManager,\n deepMergeDocuments,\n parseRuntime,\n resolveConfigPath,\n resolveProjectConfigPath,\n resolveRuntime,\n resolveScope,\n runtimeConfigScope,\n type RunnerScope,\n type ConfigDocument,\n type JobEntry,\n type JobListFilter,\n type ResolvedConfig,\n type StateManager\n} from \"@poe-code/poe-code-config\";\nimport { selectExecutionEnv, type OpenSpec } from \"./execution-env.js\";\n\nexport type RuntimeOverrideOptions = {\n runtime?: \"host\" | \"docker\" | \"e2b\";\n runtimeImage?: string;\n runtimeTemplate?: string;\n detach?: boolean;\n mountPoeCode?: boolean;\n runnerSync?: RunnerScope[\"sync\"];\n};\n\nexport function resolvePoeCommandExecution(input: {\n cwd: string;\n runtimeConfigCwd?: string;\n env: Record<string, string>;\n argv: string[];\n tool: string;\n runtime?: RuntimeOverrideOptions;\n context?: {\n homeDir?: string;\n state?: StateManager;\n };\n openSpec?: Partial<Pick<OpenSpec, \"execution\" | \"shellSpec\">>;\n}): {\n factory: ReturnType<typeof selectExecutionEnv>;\n openSpec: OpenSpec;\n detach: boolean;\n state: StateManager;\n} {\n const homeDir = input.context?.homeDir ?? os.homedir();\n const runtimeConfigCwd = input.runtimeConfigCwd ?? input.cwd;\n const loaded = loadRuntimeConfig(runtimeConfigCwd, homeDir);\n const config = applyRuntimeOverrides(loaded, input.runtime, runtimeConfigCwd);\n const resolved = resolveRuntime({ cwd: runtimeConfigCwd, config });\n const factory = selectExecutionEnv(resolved.runtime);\n const state = input.context?.state ?? loadState(homeDir);\n\n return {\n factory,\n detach: factory.supportsDetach === true && config.runner.detach,\n state,\n openSpec: {\n cwd: input.cwd,\n runtimeCwd: runtimeConfigCwd,\n runtime: resolved.runtime,\n runner: config.runner,\n state,\n env: input.env,\n uploadIgnoreFiles: config.runner.workspace?.exclude ?? [],\n jobLabel: {\n tool: input.tool,\n argv: input.argv\n },\n ...input.openSpec\n }\n };\n}\n\nexport interface LoadedRuntimeConfig extends ResolvedConfig {\n /** Raw merged runtime scope preserved for re-parsing when overrides change the type. */\n rawScope: Record<string, unknown>;\n}\n\nexport function applyRuntimeOverrides(\n config: ResolvedConfig | LoadedRuntimeConfig,\n overrides: RuntimeOverrideOptions | undefined,\n cwd = process.cwd()\n): ResolvedConfig {\n if (!overrides) {\n return { runtime: config.runtime, runner: config.runner };\n }\n\n const base: Record<string, unknown> =\n \"rawScope\" in config && config.rawScope\n ? { ...config.rawScope }\n : { ...(config.runtime as unknown as Record<string, unknown>) };\n\n const runtime = parseRuntime({\n ...base,\n ...(overrides.runtime !== undefined ? { type: overrides.runtime } : {}),\n ...(overrides.runtimeImage !== undefined ? { image: overrides.runtimeImage } : {}),\n ...(overrides.runtimeTemplate !== undefined\n ? { template_id: overrides.runtimeTemplate }\n : {}),\n ...(overrides.mountPoeCode === true\n ? { mounts: [...config.runtime.mounts, createPoeCodeMount(cwd)] }\n : {})\n });\n\n return {\n runtime,\n runner: {\n ...config.runner,\n ...(overrides.detach === true ? { detach: true } : {}),\n ...(overrides.runnerSync !== undefined ? { sync: overrides.runnerSync } : {})\n }\n };\n}\n\nfunction createPoeCodeMount(cwd: string): { source: string; target: string; readonly: boolean } {\n return {\n source: cwd,\n target: \"/usr/local/lib/poe-code\",\n readonly: true\n };\n}\n\nfunction loadRuntimeConfig(cwd: string, homeDir: string): LoadedRuntimeConfig {\n const document = deepMergeDocuments(\n readConfigDocument(resolveConfigPath(homeDir)),\n readConfigDocument(resolveProjectConfigPath(cwd))\n );\n const runtimeScope = resolveScope(runtimeConfigScope.schema, document.runtime, process.env);\n\n return {\n rawScope: { ...(runtimeScope as unknown as Record<string, unknown>) },\n runtime: parseRuntime(runtimeScope),\n runner: runtimeScope.runner\n };\n}\n\nfunction readConfigDocument(filePath: string): ConfigDocument {\n if (!existsSync(filePath)) {\n return {};\n }\n return JSON.parse(readFileSync(filePath, \"utf8\")) as ConfigDocument;\n}\n\nfunction loadState(homeDir: string): StateManager {\n if (process.env.VITEST === \"true\") {\n return createMemoryStateManager();\n }\n return createStateManager(homeDir);\n}\n\nfunction createMemoryStateManager(): StateManager {\n const jobs = new Map<string, JobEntry>();\n return {\n templates: {\n async get() {\n return null;\n },\n async put() {},\n async remove() {},\n async list() {\n return [];\n }\n },\n jobs: {\n async get(id) {\n return jobs.get(id) ?? null;\n },\n async put(entry) {\n jobs.set(entry.id, entry);\n },\n async update(id, patch) {\n const current = jobs.get(id);\n if (!current) {\n return null;\n }\n const updated = { ...current, ...patch, id };\n jobs.set(id, updated);\n return updated;\n },\n async list(filter?: JobListFilter) {\n const entries = Array.from(jobs.values());\n if (!filter) {\n return entries;\n }\n return entries.filter((entry) =>\n Object.entries(filter).every(([key, value]) => entry[key as keyof JobEntry] === value)\n );\n },\n async remove(id) {\n jobs.delete(id);\n }\n }\n };\n}\n", "import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport type { ResolvedConfig, SchemaField, ScopeDefinition } from \"./types.js\";\n\nexport interface RuntimeMount {\n source: string;\n target: string;\n readonly?: boolean;\n}\n\nexport interface RunnerScope {\n detach: boolean;\n upload_max_file_mb: number;\n download_conflict: \"refuse\" | \"overwrite\";\n sync: \"both\" | \"upload\" | \"none\";\n workspace?: {\n exclude?: string[];\n };\n}\n\ninterface SharedRuntimeFields {\n build_args: Record<string, string>;\n mounts: RuntimeMount[];\n link?: string;\n}\n\nexport interface HostRuntime extends SharedRuntimeFields {\n type: \"host\";\n}\n\nexport interface DockerRuntime extends SharedRuntimeFields {\n type: \"docker\";\n image?: string;\n dockerfile?: string;\n build_context?: string;\n engine?: \"docker\" | \"podman\";\n network?: string;\n extra_args?: string[];\n}\n\nexport interface E2bRuntime extends SharedRuntimeFields {\n type: \"e2b\";\n template_id?: string;\n from_template?: string;\n dockerfile?: string;\n build_context?: string;\n workspace_dir?: string;\n cpu?: number;\n memory_mb?: number;\n timeout_minutes?: number;\n preserve_after_exit_hours?: number;\n}\n\nexport type RuntimeConfig = HostRuntime | DockerRuntime | E2bRuntime;\nexport type RuntimeRunner = RuntimeConfig[\"type\"];\n\nconst defaultWorkspaceExclude = [\n \".git\",\n \"node_modules\",\n \"dist\",\n \".turbo\",\n \".next\",\n \".poe-code/state.json\"\n];\n\nexport interface RuntimeResolveResult {\n runtime: RuntimeConfig;\n runner: RuntimeRunner;\n dockerfilePath: string | null;\n buildContext: string | null;\n}\n\ntype RuntimeResolver = (input: { cwd: string; runtime: RuntimeConfig }) => RuntimeResolveResult;\n\nexport const runtimeConfigScope = {\n scope: \"runtime\",\n schema: {\n type: {\n type: \"string\",\n default: \"host\",\n doc: \"Runtime backend: host, docker, or e2b\"\n },\n build_args: {\n type: \"json\",\n default: {} as Record<string, string>,\n parse: parseBuildArgs,\n doc: \"Build arguments passed to the runtime image build\"\n },\n mounts: {\n type: \"json\",\n default: [] as RuntimeMount[],\n parse: parseMounts,\n doc: \"Additional runtime mounts\"\n },\n runner: {\n type: \"json\",\n default: createDefaultRunnerScope(),\n parse: parseRunner,\n doc: \"Runner process and workspace transfer settings\"\n },\n link: {\n type: \"string\",\n default: \"\",\n doc: \"Informational link for the runtime definition\"\n },\n image: {\n type: \"string\",\n default: \"\",\n doc: \"Prebuilt Docker image\"\n },\n dockerfile: {\n type: \"string\",\n default: \"\",\n doc: \"Path to the Dockerfile used for docker or e2b builds\"\n },\n build_context: {\n type: \"string\",\n default: \"\",\n doc: \"Path to the Docker build context\"\n },\n workspace_dir: {\n type: \"string\",\n default: \"/workspace\",\n doc: \"Sandbox-local workspace directory for E2B runtime upload, execution, and download\"\n },\n engine: {\n type: \"string\",\n default: \"\",\n doc: \"Container engine for Docker runtime\"\n },\n network: {\n type: \"string\",\n default: \"\",\n doc: \"Docker network\"\n },\n extra_args: {\n type: \"json\",\n default: undefined as string[] | undefined,\n parse: parseOptionalStringArray,\n doc: \"Extra Docker runtime arguments\"\n },\n template_id: {\n type: \"string\",\n default: \"\",\n doc: \"Prebuilt E2B template id\"\n },\n from_template: {\n type: \"string\",\n default: \"\",\n doc: \"Existing E2B template alias to extend instead of using the Dockerfile FROM image\"\n },\n cpu: {\n type: \"json\",\n default: undefined as number | undefined,\n parse: parseOptionalNumber,\n doc: \"E2B CPU count\"\n },\n memory_mb: {\n type: \"json\",\n default: undefined as number | undefined,\n parse: parseOptionalNumber,\n doc: \"E2B memory in megabytes\"\n },\n timeout_minutes: {\n type: \"json\",\n default: undefined as number | undefined,\n parse: parseOptionalNumber,\n doc: \"E2B timeout in minutes\"\n },\n preserve_after_exit_hours: {\n type: \"json\",\n default: undefined as number | undefined,\n parse: parseOptionalNumber,\n doc: \"Hours to keep an E2B sandbox alive after job exit\"\n }\n }\n} satisfies ScopeDefinition<Record<string, SchemaField>>;\n\nexport function parseRunner(raw: unknown): RunnerScope {\n if (raw === undefined) {\n return createDefaultRunnerScope();\n }\n const record = asRecord(raw);\n if (record === undefined) {\n throw new Error(\"runner: expected an object.\");\n }\n\n const uploadMaxFileMb =\n parseOptionalNumber(record.upload_max_file_mb, \"runner.upload_max_file_mb\") ?? 100;\n if (uploadMaxFileMb <= 0) {\n throw new Error(\"runner.upload_max_file_mb: expected a positive finite number.\");\n }\n\n return omitUndefined({\n detach: parseOptionalBoolean(record.detach, \"runner.detach\") ?? false,\n upload_max_file_mb: uploadMaxFileMb,\n download_conflict: parseDownloadConflict(record.download_conflict),\n sync: parseRunnerSync(record.sync),\n workspace: parseRunnerWorkspace(record.workspace)\n });\n}\n\nexport function parseRuntime(raw: unknown): RuntimeConfig {\n if (raw === undefined) {\n return {\n type: \"host\",\n build_args: {},\n mounts: []\n };\n }\n const record = asRecord(raw);\n if (record === undefined) {\n throw new Error(\"runtime: expected an object.\");\n }\n const type = parseRuntimeType(record.type);\n const shared = parseSharedRuntimeFields(record);\n\n if (type === \"docker\") {\n return omitUndefined({\n ...shared,\n type,\n image: parseOptionalString(record.image),\n dockerfile: parseOptionalString(record.dockerfile),\n build_context: parseOptionalString(record.build_context),\n engine: parseEngine(record.engine),\n network: parseOptionalString(record.network),\n extra_args: parseOptionalStringArray(record.extra_args)\n });\n }\n\n if (type === \"e2b\") {\n const preserveAfterExitHours = parseOptionalNumber(record.preserve_after_exit_hours) ?? 24;\n if (preserveAfterExitHours < 0 || preserveAfterExitHours > 168) {\n throw new Error(\"preserve_after_exit_hours: expected a number from 0 to 168.\");\n }\n\n return omitUndefined({\n ...shared,\n type,\n template_id: parseOptionalString(record.template_id),\n from_template: parseOptionalString(record.from_template),\n dockerfile: parseOptionalString(record.dockerfile),\n build_context: parseOptionalString(record.build_context),\n workspace_dir: parseWorkspaceDir(record.workspace_dir),\n cpu: parseOptionalNumber(record.cpu),\n memory_mb: parseOptionalNumber(record.memory_mb),\n timeout_minutes: parseOptionalNumber(record.timeout_minutes),\n preserve_after_exit_hours: preserveAfterExitHours\n });\n }\n\n return {\n ...shared,\n type\n };\n}\n\nexport function resolveRuntime({\n cwd,\n config\n}: {\n cwd: string;\n config: Pick<ResolvedConfig, \"runtime\">;\n}): RuntimeResolveResult {\n const runtime = config.runtime;\n return runtimeResolvers[runtime.type]({ cwd, runtime });\n}\n\nconst runtimeResolvers: Record<RuntimeConfig[\"type\"], RuntimeResolver> = {\n host({ runtime }) {\n return {\n runtime,\n runner: \"host\",\n dockerfilePath: null,\n buildContext: null\n };\n },\n docker({ cwd, runtime }) {\n const dockerRuntime = runtime as DockerRuntime;\n const { dockerfilePath, buildContext } = resolveRuntimeBuildPaths(cwd, dockerRuntime);\n\n if (dockerRuntime.image !== undefined) {\n return {\n runtime: dockerRuntime,\n runner: \"docker\",\n dockerfilePath: null,\n buildContext: null\n };\n }\n if (!existsSync(dockerfilePath)) {\n throw new Error(`Docker runtime requires image or a Dockerfile at ${dockerfilePath}.`);\n }\n return {\n runtime: dockerRuntime,\n runner: \"docker\",\n dockerfilePath,\n buildContext\n };\n },\n e2b({ cwd, runtime }) {\n const e2bRuntime = runtime as E2bRuntime;\n const { dockerfilePath, buildContext } = resolveRuntimeBuildPaths(cwd, e2bRuntime);\n\n if (e2bRuntime.template_id !== undefined) {\n return {\n runtime: e2bRuntime,\n runner: \"e2b\",\n dockerfilePath: null,\n buildContext: null\n };\n }\n if (!existsSync(dockerfilePath)) {\n throw new Error(`E2B runtime requires template_id or a Dockerfile at ${dockerfilePath}.`);\n }\n return {\n runtime: e2bRuntime,\n runner: \"e2b\",\n dockerfilePath,\n buildContext\n };\n }\n};\n\nfunction resolveRuntimeBuildPaths(\n cwd: string,\n runtime: DockerRuntime | E2bRuntime\n): { dockerfilePath: string; buildContext: string } {\n return {\n dockerfilePath: path.resolve(cwd, runtime.dockerfile ?? path.join(\".poe-code\", \"Dockerfile\")),\n buildContext: path.resolve(cwd, runtime.build_context ?? \".\")\n };\n}\n\nfunction parseSharedRuntimeFields(record: Record<string, unknown>): SharedRuntimeFields {\n return omitUndefined({\n build_args: parseBuildArgs(record.build_args),\n mounts: parseMounts(record.mounts),\n link: parseOptionalString(record.link)\n });\n}\n\nfunction parseRuntimeType(value: unknown): RuntimeConfig[\"type\"] {\n if (value === undefined) {\n return \"host\";\n }\n if (value === \"host\" || value === \"docker\" || value === \"e2b\") {\n return value;\n }\n throw new Error('type: expected \"host\", \"docker\", or \"e2b\".');\n}\n\nfunction parseWorkspaceDir(value: unknown): string {\n const workspaceDir = parseOptionalString(value) ?? \"/workspace\";\n if (!path.posix.isAbsolute(workspaceDir)) {\n throw new Error(\"workspace_dir: expected an absolute sandbox path.\");\n }\n let normalized = path.posix.normalize(workspaceDir);\n while (normalized.length > 1 && normalized.endsWith(\"/\")) {\n normalized = normalized.slice(0, -1);\n }\n return normalized;\n}\n\nfunction createDefaultRunnerScope(): RunnerScope {\n return {\n detach: false,\n upload_max_file_mb: 100,\n download_conflict: \"refuse\",\n sync: \"both\",\n workspace: {\n exclude: [...defaultWorkspaceExclude]\n }\n };\n}\n\nfunction parseRunnerWorkspace(value: unknown): RunnerScope[\"workspace\"] {\n if (value === undefined) {\n return {\n exclude: [...defaultWorkspaceExclude]\n };\n }\n const record = asRecord(value);\n if (record === undefined) {\n throw new Error(\"runner.workspace: expected an object.\");\n }\n\n return {\n exclude: parseOptionalStringArray(record.exclude, \"runner.workspace.exclude\") ?? [\n ...defaultWorkspaceExclude\n ]\n };\n}\n\nfunction parseDownloadConflict(value: unknown): RunnerScope[\"download_conflict\"] {\n if (value === undefined) {\n return \"refuse\";\n }\n if (value === \"refuse\" || value === \"overwrite\") {\n return value;\n }\n throw new Error('runner.download_conflict: expected \"refuse\" or \"overwrite\".');\n}\n\nfunction parseRunnerSync(value: unknown): RunnerScope[\"sync\"] {\n if (value === undefined) {\n return \"both\";\n }\n if (value === \"both\" || value === \"upload\" || value === \"none\") {\n return value;\n }\n throw new Error('runner.sync: expected \"both\", \"upload\", or \"none\".');\n}\n\nfunction parseBuildArgs(value: unknown): Record<string, string> {\n if (value === undefined) {\n return {};\n }\n const record = asRecord(value);\n if (record === undefined) {\n throw new Error(\"build_args: expected an object.\");\n }\n\n const parsed: Record<string, string> = {};\n for (const [key, entry] of Object.entries(record)) {\n if (typeof entry !== \"string\") {\n throw new Error(`build_args.${key}: expected a string.`);\n }\n parsed[key] = entry;\n }\n return parsed;\n}\n\nfunction parseMounts(value: unknown): RuntimeMount[] {\n if (value === undefined) {\n return [];\n }\n if (!Array.isArray(value)) {\n throw new Error(\"mounts: expected an array.\");\n }\n\n return value.map((entry, index) => {\n const record = asRecord(entry);\n if (record === undefined) {\n throw new Error(`mounts[${index}]: expected an object.`);\n }\n const source = record.source;\n const target = record.target;\n if (typeof source !== \"string\") {\n throw new Error(`mounts[${index}].source: expected a string.`);\n }\n if (typeof target !== \"string\") {\n throw new Error(`mounts[${index}].target: expected a string.`);\n }\n\n return omitUndefined({\n source,\n target,\n readonly: parseOptionalBoolean(record.readonly, `mounts[${index}].readonly`)\n });\n });\n}\n\nfunction parseOptionalString(value: unknown): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value !== \"string\") {\n throw new Error(\"expected a string.\");\n }\n if (value.length === 0) {\n return undefined;\n }\n return value;\n}\n\nfunction parseOptionalStringArray(value: unknown, key = \"\"): string[] | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (!Array.isArray(value)) {\n throw new Error(`${key ? `${key}: ` : \"\"}expected an array.`);\n }\n return value.map((entry, index) => {\n if (typeof entry !== \"string\") {\n throw new Error(`${key}[${index}]: expected a string.`);\n }\n return entry;\n });\n}\n\nfunction parseEngine(value: unknown): \"docker\" | \"podman\" | undefined {\n const engine = parseOptionalString(value);\n if (engine === undefined || engine === \"docker\" || engine === \"podman\") {\n return engine;\n }\n throw new Error('engine: expected \"docker\" or \"podman\".');\n}\n\nfunction parseOptionalNumber(value: unknown, key = \"\"): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new Error(`${key ? `${key}: ` : \"\"}expected a finite number.`);\n }\n return value;\n}\n\nfunction parseOptionalBoolean(value: unknown, key: string): boolean | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value !== \"boolean\") {\n throw new Error(`${key}: expected a boolean.`);\n }\n return value;\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n return value as Record<string, unknown>;\n}\n\nfunction omitUndefined<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(Object.entries(value).filter(([, entry]) => entry !== undefined)) as T;\n}\n", "import type {\n BraintrustIntegrationConfig,\n ScopeDefinition,\n ScopeSchema\n} from \"./types.js\";\n\nexport function defineScope<const S extends ScopeSchema>(\n scope: string,\n schema: S\n): ScopeDefinition<S> {\n return {\n scope,\n schema\n };\n}\n\nexport const integrationsConfigScope = defineScope(\"integrations\", {\n braintrust: {\n type: \"json\",\n default: {\n enabled: false\n } satisfies BraintrustIntegrationConfig,\n parse: parseBraintrustIntegrationConfig,\n doc: \"Braintrust integration configuration\"\n }\n});\n\nexport { runtimeConfigScope } from \"./runtime.js\";\n\nfunction parseBraintrustIntegrationConfig(value: unknown): BraintrustIntegrationConfig {\n if (!isRecord(value)) {\n throw new Error(\"expected an object\");\n }\n\n const enabled = value.enabled === undefined ? false : value.enabled;\n if (typeof enabled !== \"boolean\") {\n throw new Error(\"enabled must be a boolean\");\n }\n\n return {\n enabled,\n ...optionalStringEntry(\"apiKey\", value.apiKey),\n ...optionalStringEntry(\"apiUrl\", value.apiUrl),\n ...optionalStringEntry(\"project\", value.project)\n };\n}\n\nfunction optionalStringEntry(key: string, value: unknown): Record<string, string> {\n if (value === undefined) {\n return {};\n }\n\n if (typeof value !== \"string\") {\n throw new Error(`${key} must be a string`);\n }\n\n return { [key]: value };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n", "import { defineScope } from \"./schema.js\";\n\nexport const planConfigScope = defineScope(\"plan\", {\n plan_directory: {\n type: \"string\",\n default: \"docs/plans\",\n env: \"POE_PLAN_DIRECTORY\",\n doc: \"Directory where planning documents are stored\"\n }\n});\n", "import path from \"node:path\";\nimport { resolve, type FileSystem as ResolveFileSystem } from \"@poe-code/config-extends\";\nimport { createTimestamp, isNotFound, type FileSystem } from \"@poe-code/config-mutations\";\nimport type { ConfigDocument } from \"./types.js\";\n\nexport async function readDocument(fs: FileSystem, filePath: string): Promise<ConfigDocument> {\n const document = await readStoredDocument(fs, filePath);\n return document.data;\n}\n\nexport async function writeScope(\n fs: FileSystem,\n filePath: string,\n scope: string,\n values: Record<string, unknown>\n): Promise<void> {\n const document = await readDocument(fs, filePath);\n const normalizedValues = normalizeScopeValues(values);\n\n if (Object.keys(normalizedValues).length === 0) {\n delete document[scope];\n } else {\n document[scope] = normalizedValues;\n }\n\n await writeDocument(fs, filePath, document);\n}\n\nexport async function readMergedDocument(\n fs: FileSystem,\n globalPath: string,\n projectPath?: string\n): Promise<ConfigDocument> {\n const globalDocument = await readStoredDocument(fs, globalPath);\n if (!projectPath || projectPath === globalPath) {\n return globalDocument.data;\n }\n\n const projectDocument = await readStoredDocument(fs, projectPath);\n const resolved = await resolve(\n [\n {\n source: \"project\",\n filePath: projectPath,\n content: projectDocument.content\n },\n {\n source: \"base\",\n path: path.dirname(globalPath)\n }\n ],\n {\n fs: createResolvedConfigFs(fs, globalPath, globalDocument.content),\n autoExtend: true\n }\n );\n\n return normalizeDocument(resolved.data);\n}\n\nasync function readStoredDocument(\n fs: FileSystem,\n filePath: string\n): Promise<{ content: string; data: ConfigDocument }> {\n try {\n const raw = await fs.readFile(filePath, \"utf8\");\n return await parseStoredDocument(fs, filePath, raw);\n } catch (error) {\n if (isNotFound(error)) {\n return {\n content: EMPTY_DOCUMENT,\n data: {}\n };\n }\n\n throw error;\n }\n}\n\nasync function parseStoredDocument(\n fs: FileSystem,\n filePath: string,\n raw: string\n): Promise<{ content: string; data: ConfigDocument }> {\n try {\n return {\n content: raw,\n data: normalizeDocument(JSON.parse(raw))\n };\n } catch (error) {\n if (error instanceof SyntaxError) {\n await recoverInvalidDocument(fs, filePath, raw);\n return {\n content: EMPTY_DOCUMENT,\n data: {}\n };\n }\n throw error;\n }\n}\n\nfunction normalizeDocument(value: unknown): ConfigDocument {\n if (!isRecord(value)) {\n return {};\n }\n\n const document: ConfigDocument = {};\n for (const [scope, scopeValues] of Object.entries(value)) {\n const normalizedValues = normalizeScopeValues(scopeValues);\n if (Object.keys(normalizedValues).length > 0) {\n document[scope] = normalizedValues;\n }\n }\n\n return document;\n}\n\nfunction normalizeScopeValues(value: unknown): Record<string, unknown> {\n if (!isRecord(value)) {\n return {};\n }\n\n const normalized: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(value)) {\n if (entry !== undefined) {\n normalized[key] = entry;\n }\n }\n\n return normalized;\n}\n\nfunction createResolvedConfigFs(\n fs: FileSystem,\n globalPath: string,\n globalContent: string\n): ResolveFileSystem {\n return {\n readFile(filePath: string, _encoding: BufferEncoding) {\n if (filePath === globalPath) {\n return Promise.resolve(globalContent);\n }\n\n return fs.readFile(filePath, \"utf8\");\n }\n };\n}\n\nasync function writeDocument(\n fs: FileSystem,\n filePath: string,\n document: ConfigDocument\n): Promise<void> {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, `${JSON.stringify(document, null, 2)}\\n`, {\n encoding: \"utf8\"\n });\n}\n\nasync function recoverInvalidDocument(\n fs: FileSystem,\n filePath: string,\n content: string\n): Promise<void> {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n const backupPath = createInvalidBackupPath(filePath);\n await fs.writeFile(backupPath, content, { encoding: \"utf8\" });\n await fs.writeFile(filePath, EMPTY_DOCUMENT, { encoding: \"utf8\" });\n}\n\nfunction createInvalidBackupPath(filePath: string): string {\n const directory = path.dirname(filePath);\n const baseName = path.basename(filePath);\n return path.join(directory, `${baseName}.invalid-${createTimestamp()}.json`);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === \"object\" && !Array.isArray(value));\n}\n\nexport function resolveConfigPath(homeDir: string): string {\n return path.join(homeDir, \".poe-code\", \"config.json\");\n}\n\nexport function resolveServicesConfigPath(homeDir: string): string {\n return path.join(homeDir, \".config\", \"poe-code\", \"services.json\");\n}\n\nexport function resolveProjectConfigPath(cwd: string): string {\n return path.join(cwd, \".poe-code\", \"config.json\");\n}\n\nconst EMPTY_DOCUMENT = `${JSON.stringify({}, null, 2)}\\n`;\n", "import path from \"node:path\";\nimport type { FileSystem } from \"./types.js\";\n\nexport interface DiscoveredBase {\n content: string;\n filePath: string;\n}\n\nexport async function findBase(\n name: string,\n bases: string[],\n fs: FileSystem\n): Promise<DiscoveredBase> {\n const checkedPaths: string[] = [];\n\n for (const basePath of bases) {\n for (const extension of [\".md\", \".yaml\", \".yml\", \".json\"]) {\n const filePath = path.join(basePath, `${name}${extension}`);\n checkedPaths.push(filePath);\n\n try {\n return {\n content: await fs.readFile(filePath, \"utf8\"),\n filePath\n };\n } catch (error) {\n if (hasCode(error, \"ENOENT\")) {\n continue;\n }\n\n throw error;\n }\n }\n }\n\n throw new Error(`Base \"${name}\" not found.\\nChecked paths:\\n- ${checkedPaths.join(\"\\n- \")}`);\n}\n\nfunction hasCode(error: unknown, code: string): error is NodeJS.ErrnoException {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === code\n );\n}\n", "import path from \"node:path\";\nimport matter from \"gray-matter\";\nimport { parse as parseYaml } from \"yaml\";\nimport type { ParsedDocument } from \"./types.js\";\n\nexport function parseDocument(content: string, filePath: string): ParsedDocument {\n const normalizedContent = stripBom(content);\n const format = detectFormat(normalizedContent, filePath);\n const data =\n format === \"markdown\"\n ? parseMarkdown(normalizedContent)\n : toData(format === \"json\" ? JSON.parse(normalizedContent) : parseYaml(normalizedContent));\n const hasExtendsField = Object.hasOwn(data, \"extends\");\n const extendsValue = data.extends === true;\n\n delete data.extends;\n\n return {\n data,\n format,\n extends: extendsValue,\n hasExtendsField\n };\n}\n\nfunction detectFormat(\n content: string,\n filePath: string\n): ParsedDocument[\"format\"] {\n const extension = path.extname(filePath).toLowerCase();\n\n if (extension === \".md\") {\n return \"markdown\";\n }\n\n if (extension === \".yaml\" || extension === \".yml\") {\n return \"yaml\";\n }\n\n if (extension === \".json\") {\n return \"json\";\n }\n\n if (content.startsWith(\"{\")) {\n return \"json\";\n }\n\n if (content.startsWith(\"---\\n\") || content.startsWith(\"---\\r\\n\")) {\n return \"markdown\";\n }\n\n return \"yaml\";\n}\n\nfunction parseMarkdown(content: string): Record<string, unknown> {\n const document = matter(content);\n return {\n ...toData(document.data),\n prompt: document.content\n };\n}\n\nfunction toData(value: unknown): Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return {};\n }\n\n return { ...(value as Record<string, unknown>) };\n}\n\nfunction stripBom(content: string): string {\n if (!content.startsWith(\"\\uFEFF\")) {\n return content;\n }\n\n return content.slice(1);\n}\n", "import type { DataLayer } from \"./types.js\";\n\nexport interface MergeLayersResult {\n data: Record<string, unknown>;\n sources: Record<string, string>;\n}\n\nexport function mergeLayers(layers: DataLayer[]): MergeLayersResult {\n return mergeObjectLayers(layers, []);\n}\n\nfunction mergeObjectLayers(layers: DataLayer[], path: string[]): MergeLayersResult {\n const data: Record<string, unknown> = {};\n const sources: Record<string, string> = {};\n\n for (const key of collectKeys(layers)) {\n const resolved = resolveKey(layers, key, path);\n\n if (resolved === undefined) {\n continue;\n }\n\n data[key] = resolved.value;\n Object.assign(sources, resolved.sources);\n }\n\n return { data, sources };\n}\n\nfunction collectKeys(layers: DataLayer[]): string[] {\n const keys = new Set<string>();\n\n for (const layer of layers) {\n for (const key of Object.keys(layer.data)) {\n keys.add(key);\n }\n }\n\n return [...keys];\n}\n\nfunction resolveKey(\n layers: DataLayer[],\n key: string,\n path: string[]\n): { value: unknown; sources: Record<string, string> } | undefined {\n let winningSource: string | undefined;\n let winningValue: unknown;\n const objectLayers: DataLayer[] = [];\n\n for (const layer of layers) {\n const candidate = layer.data[key];\n\n if (!isWinningCandidate(key, candidate)) {\n continue;\n }\n\n if (winningSource === undefined) {\n winningSource = layer.source;\n winningValue = candidate;\n\n if (isPlainObject(candidate)) {\n objectLayers.push({\n source: layer.source,\n data: candidate\n });\n }\n\n continue;\n }\n\n if (isPlainObject(winningValue) && isPlainObject(candidate)) {\n objectLayers.push({\n source: layer.source,\n data: candidate\n });\n }\n }\n\n if (winningSource === undefined) {\n return undefined;\n }\n\n const fullPath = buildPath(path, key);\n\n if (isPlainObject(winningValue)) {\n const merged = mergeObjectLayers(objectLayers, [...path, key]);\n\n return {\n value: merged.data,\n sources: {\n [fullPath]: winningSource,\n ...merged.sources\n }\n };\n }\n\n return {\n value: cloneValue(winningValue),\n sources: {\n [fullPath]: winningSource\n }\n };\n}\n\nfunction isWinningCandidate(key: string, value: unknown): boolean {\n if (value === undefined) {\n return false;\n }\n\n if (key === \"prompt\" && value === \"\") {\n return false;\n }\n\n return true;\n}\n\nfunction buildPath(path: string[], key: string): string {\n return [...path, key].join(\".\");\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (value === null || Array.isArray(value) || typeof value !== \"object\") {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction cloneValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((entry) => cloneValue(entry));\n }\n\n if (!isPlainObject(value)) {\n return value;\n }\n\n const clone = Object.create(Object.getPrototypeOf(value)) as Record<string, unknown>;\n\n for (const [key, entry] of Object.entries(value)) {\n clone[key] = cloneValue(entry);\n }\n\n return clone;\n}\n", "import path from \"node:path\";\nimport { renderTemplate } from \"@poe-code/design-system\";\nimport { findBase } from \"./discover.js\";\nimport { mergeLayers } from \"./merge.js\";\nimport { parseDocument } from \"./parse.js\";\nimport type {\n BaseLayer,\n ChainLayer,\n DataLayer,\n DocumentLayer,\n ResolveOptions,\n ResolvedDocument\n} from \"./types.js\";\n\nconst MAX_EXTENDS_DEPTH = 5;\nconst YIELD_TOKEN = \"{{yield}}\";\n\ninterface ClassifiedChain {\n baseLayers: BaseLayer[];\n documentIndex: number;\n documentLayer: DocumentLayer;\n}\n\ninterface ResolvedBaseChain {\n chain: string[];\n layers: DataLayer[];\n}\n\nexport async function resolve(\n chain: ChainLayer[],\n options: ResolveOptions\n): Promise<ResolvedDocument> {\n const { baseLayers, documentIndex, documentLayer } = classifyChain(chain);\n const parsedDocument = parseDocument(documentLayer.content, documentLayer.filePath);\n const resolvedBase = shouldResolveBase(parsedDocument, options.autoExtend)\n ? await resolveBaseChain({\n name: documentLayer.baseName ?? getBaseName(documentLayer.filePath),\n baseLayers,\n options,\n optional: !parsedDocument.extends,\n visited: new Set([documentLayer.filePath]),\n depth: 1\n })\n : undefined;\n const composedPrompt = composePromptChain(\n {\n source: documentLayer.source,\n data: parsedDocument.data\n },\n resolvedBase?.layers ?? []\n );\n const merged = mergeLayers([\n ...collectDataLayers(chain.slice(0, documentIndex)),\n {\n source: documentLayer.source,\n data: withResolvedPrompt(parsedDocument.data, composedPrompt?.prompt)\n },\n ...stripResolvedBasePrompts(resolvedBase?.layers ?? [], composedPrompt?.consumedBaseIndexes ?? new Set<number>()),\n ...collectDataLayers(chain.slice(documentIndex + 1))\n ]);\n\n if (composedPrompt !== undefined && merged.sources.prompt === documentLayer.source && composedPrompt.source !== undefined) {\n merged.sources.prompt = composedPrompt.source;\n }\n\n return {\n data: merged.data,\n sources: merged.sources,\n chain: [documentLayer.filePath, ...(resolvedBase?.chain ?? [])]\n };\n}\n\nfunction classifyChain(chain: ChainLayer[]): ClassifiedChain {\n const baseLayers: BaseLayer[] = [];\n const documentLayers: Array<{ index: number; layer: DocumentLayer }> = [];\n\n for (const [index, layer] of chain.entries()) {\n if (isDataLayer(layer)) {\n continue;\n }\n\n if (isDocumentLayer(layer)) {\n documentLayers.push({ index, layer });\n continue;\n }\n\n if (isBaseLayer(layer)) {\n baseLayers.push(layer);\n }\n }\n\n if (documentLayers.length !== 1) {\n throw new Error(`Exactly one document layer is required, received ${documentLayers.length}.`);\n }\n\n return {\n baseLayers,\n documentIndex: documentLayers[0].index,\n documentLayer: documentLayers[0].layer\n };\n}\n\nasync function resolveBaseChain({\n name,\n baseLayers,\n options,\n optional,\n visited,\n depth\n}: {\n name: string;\n baseLayers: BaseLayer[];\n options: ResolveOptions;\n optional: boolean;\n visited: Set<string>;\n depth: number;\n}): Promise<ResolvedBaseChain | undefined> {\n if (depth > MAX_EXTENDS_DEPTH) {\n throw new Error(`Maximum extends depth exceeded (${MAX_EXTENDS_DEPTH}).`);\n }\n\n let discoveredBase;\n\n try {\n discoveredBase = await findBase(\n name,\n baseLayers.map((layer) => layer.path),\n options.fs\n );\n } catch (error) {\n if (optional && isBaseNotFoundError(error)) {\n return undefined;\n }\n\n throw error;\n }\n\n if (visited.has(discoveredBase.filePath)) {\n if (optional) {\n return undefined;\n }\n\n throw new Error(\n `Circular extends detected.\\nVisited files:\\n- ${[...visited, discoveredBase.filePath].join(\"\\n- \")}`\n );\n }\n\n const matchedBaseIndex = baseLayers.findIndex(\n (layer) => layer.path === path.dirname(discoveredBase.filePath)\n );\n\n if (matchedBaseIndex === -1) {\n throw new Error(`Resolved base is outside configured base paths: ${discoveredBase.filePath}`);\n }\n\n const parsedBase = parseDocument(discoveredBase.content, discoveredBase.filePath);\n const nextVisited = new Set(visited);\n nextVisited.add(discoveredBase.filePath);\n const nestedBase = parsedBase.extends\n ? await resolveBaseChain({\n name: getBaseName(discoveredBase.filePath),\n baseLayers: baseLayers.slice(matchedBaseIndex + 1),\n options,\n optional: false,\n visited: nextVisited,\n depth: depth + 1\n })\n : undefined;\n\n return {\n layers: [\n {\n source: baseLayers[matchedBaseIndex].source,\n data: parsedBase.data\n },\n ...(nestedBase?.layers ?? [])\n ],\n chain: [discoveredBase.filePath, ...(nestedBase?.chain ?? [])]\n };\n}\n\nfunction collectDataLayers(chain: ChainLayer[]): DataLayer[] {\n return chain.filter(isDataLayer);\n}\n\ninterface ComposedPromptResult {\n consumedBaseIndexes: Set<number>;\n prompt: string;\n source?: string;\n}\n\nfunction composePromptChain(\n documentLayer: DataLayer,\n baseLayers: DataLayer[]\n): ComposedPromptResult | undefined {\n const documentPrompt = documentLayer.data.prompt;\n\n if (documentPrompt !== undefined && typeof documentPrompt !== \"string\") {\n return undefined;\n }\n\n if (documentPrompt !== undefined) {\n assertValidYieldCount(documentPrompt);\n }\n\n let prompt = documentPrompt;\n let source = prompt === undefined || prompt === \"\" ? undefined : documentLayer.source;\n const consumedBaseIndexes = new Set<number>();\n\n for (const [index, layer] of baseLayers.entries()) {\n const candidate = layer.data.prompt;\n\n if (candidate === undefined) {\n continue;\n }\n\n if (typeof candidate !== \"string\") {\n break;\n }\n\n assertValidYieldCount(candidate);\n consumedBaseIndexes.add(index);\n prompt = composeAdjacentPrompts(prompt, candidate);\n\n if (source === undefined && candidate !== \"\") {\n source = layer.source;\n }\n }\n\n if (prompt !== undefined && prompt.includes(YIELD_TOKEN)) {\n throw new Error('Final resolved prompt contains an unresolved \"{{yield}}\" token.');\n }\n\n if (prompt === undefined) {\n return undefined;\n }\n\n return {\n consumedBaseIndexes,\n prompt,\n source\n };\n}\n\nfunction composeAdjacentPrompts(\n high: string | undefined,\n low: string\n): string {\n if (high === undefined || high === \"\") {\n return low.includes(YIELD_TOKEN) ? replaceYield(low, \"\") : low;\n }\n\n if (high.includes(YIELD_TOKEN)) {\n return replaceYield(high, low);\n }\n\n if (low.includes(YIELD_TOKEN)) {\n return replaceYield(low, high);\n }\n\n return high;\n}\n\nfunction replaceYield(\n prompt: string,\n replacement: string\n): string {\n return renderTemplate(prompt, {}, { yield: replacement, escape: \"none\" });\n}\n\nfunction assertValidYieldCount(prompt: string): void {\n if (countYieldTokens(prompt) > 1) {\n throw new Error('Prompt composition supports exactly one \"{{yield}}\" token per prompt.');\n }\n}\n\nfunction countYieldTokens(prompt: string): number {\n return prompt.split(YIELD_TOKEN).length - 1;\n}\n\nfunction withResolvedPrompt(\n data: Record<string, unknown>,\n prompt: string | undefined\n): Record<string, unknown> {\n if (prompt === undefined) {\n return data;\n }\n\n return {\n ...data,\n prompt\n };\n}\n\nfunction stripResolvedBasePrompts(\n layers: DataLayer[],\n consumedBaseIndexes: Set<number>\n): DataLayer[] {\n return layers.map((layer, index) => {\n if (!consumedBaseIndexes.has(index) || typeof layer.data.prompt !== \"string\") {\n return layer;\n }\n\n const { prompt: ignoredPrompt, ...data } = layer.data;\n\n void ignoredPrompt;\n\n return {\n source: layer.source,\n data\n };\n });\n}\n\nfunction getBaseName(filePath: string): string {\n return path.basename(filePath, path.extname(filePath));\n}\n\nfunction shouldResolveBase(\n parsedDocument: ReturnType<typeof parseDocument>,\n autoExtend: boolean | undefined\n): boolean {\n return parsedDocument.extends || (autoExtend === true && !parsedDocument.hasExtendsField);\n}\n\nfunction isBaseNotFoundError(error: unknown): error is Error {\n return (\n error instanceof Error &&\n error.message.startsWith('Base \"') &&\n error.message.includes('\" not found.\\nChecked paths:')\n );\n}\n\nfunction isDataLayer(layer: ChainLayer): layer is DataLayer {\n return \"data\" in layer;\n}\n\nfunction isDocumentLayer(layer: ChainLayer): layer is DocumentLayer {\n return \"filePath\" in layer && \"content\" in layer;\n}\n\nfunction isBaseLayer(layer: ChainLayer): layer is BaseLayer {\n return \"path\" in layer;\n}\n", "export interface ColorSupportEnv {\n NO_COLOR?: string;\n FORCE_COLOR?: string;\n TERM?: string;\n}\n\nexport interface ColorSupportStream {\n isTTY?: boolean;\n}\n\nexport function supportsColor(\n env: ColorSupportEnv = process.env as ColorSupportEnv,\n stream: ColorSupportStream = process.stdout\n): boolean {\n if (env.FORCE_COLOR !== undefined && env.FORCE_COLOR !== \"0\") {\n return true;\n }\n\n if (env.NO_COLOR !== undefined) {\n return false;\n }\n\n if (stream.isTTY !== true) {\n return false;\n }\n\n return typeof env.TERM === \"string\" && env.TERM.length > 0 && env.TERM !== \"dumb\";\n}\n", "import { supportsColor } from \"../internal/color-support.js\";\n\ntype AnsiStyleName =\n | \"reset\"\n | \"bold\"\n | \"dim\"\n | \"italic\"\n | \"underline\"\n | \"inverse\"\n | \"strikethrough\"\n | \"black\"\n | \"red\"\n | \"green\"\n | \"yellow\"\n | \"blue\"\n | \"magenta\"\n | \"cyan\"\n | \"white\"\n | \"gray\"\n | \"magentaBright\"\n | \"cyanBright\"\n | \"bgRed\"\n | \"bgGreen\"\n | \"bgYellow\"\n | \"bgBlue\"\n | \"bgMagenta\";\n\ninterface AnsiPair {\n open: string;\n}\n\nexport interface Color {\n (text: string): string;\n reset: Color;\n bold: Color;\n dim: Color;\n italic: Color;\n underline: Color;\n inverse: Color;\n strikethrough: Color;\n black: Color;\n red: Color;\n green: Color;\n yellow: Color;\n blue: Color;\n magenta: Color;\n cyan: Color;\n white: Color;\n gray: Color;\n magentaBright: Color;\n cyanBright: Color;\n bgRed: Color;\n bgGreen: Color;\n bgYellow: Color;\n bgBlue: Color;\n bgMagenta: Color;\n hex: (value: string) => Color;\n rgb: (red: number, green: number, blue: number) => Color;\n bgHex: (value: string) => Color;\n bgRgb: (red: number, green: number, blue: number) => Color;\n}\n\nconst reset = \"\\x1b[0m\";\n\nconst ansiStyles: Record<AnsiStyleName, AnsiPair> = {\n reset: { open: reset },\n bold: { open: \"\\x1b[1m\" },\n dim: { open: \"\\x1b[2m\" },\n italic: { open: \"\\x1b[3m\" },\n underline: { open: \"\\x1b[4m\" },\n inverse: { open: \"\\x1b[7m\" },\n strikethrough: { open: \"\\x1b[9m\" },\n black: { open: \"\\x1b[30m\" },\n red: { open: \"\\x1b[31m\" },\n green: { open: \"\\x1b[32m\" },\n yellow: { open: \"\\x1b[33m\" },\n blue: { open: \"\\x1b[34m\" },\n magenta: { open: \"\\x1b[35m\" },\n cyan: { open: \"\\x1b[36m\" },\n white: { open: \"\\x1b[37m\" },\n gray: { open: \"\\x1b[90m\" },\n magentaBright: { open: \"\\x1b[95m\" },\n cyanBright: { open: \"\\x1b[96m\" },\n bgRed: { open: \"\\x1b[41m\" },\n bgGreen: { open: \"\\x1b[42m\" },\n bgYellow: { open: \"\\x1b[43m\" },\n bgBlue: { open: \"\\x1b[44m\" },\n bgMagenta: { open: \"\\x1b[45m\" }\n};\n\nconst styleNames = Object.keys(ansiStyles) as AnsiStyleName[];\n\nfunction replaceAll(value: string, search: string, replacement: string): string {\n return value.split(search).join(replacement);\n}\n\nfunction applyStyles(text: string, styles: AnsiPair[]): string {\n if (!supportsColor() || styles.length === 0) {\n return text;\n }\n\n const open = styles.map((style) => style.open).join(\"\");\n const output = text.includes(reset) ? replaceAll(text, reset, `${reset}${open}`) : text;\n\n return `${open}${output}${reset}`;\n}\n\nfunction clampRgb(value: number): number {\n if (Number.isNaN(value)) {\n return 0;\n }\n\n return Math.min(255, Math.max(0, Math.round(value)));\n}\n\nfunction hexChannel(value: string, offset: number): number {\n return Number.parseInt(value.slice(offset, offset + 2), 16);\n}\n\nfunction normalizeHex(value: string): [number, number, number] {\n const normalized = value.startsWith(\"#\") ? value.slice(1) : value;\n\n if (normalized.length === 3) {\n const red = normalized[0]!;\n const green = normalized[1]!;\n const blue = normalized[2]!;\n\n return [\n Number.parseInt(`${red}${red}`, 16),\n Number.parseInt(`${green}${green}`, 16),\n Number.parseInt(`${blue}${blue}`, 16)\n ];\n }\n\n if (normalized.length === 6) {\n return [\n hexChannel(normalized, 0),\n hexChannel(normalized, 2),\n hexChannel(normalized, 4)\n ];\n }\n\n return [0, 0, 0];\n}\n\nfunction rgbStyle(red: number, green: number, blue: number): AnsiPair {\n return {\n open: `\\x1b[38;2;${clampRgb(red)};${clampRgb(green)};${clampRgb(blue)}m`\n };\n}\n\nfunction bgRgbStyle(red: number, green: number, blue: number): AnsiPair {\n return {\n open: `\\x1b[48;2;${clampRgb(red)};${clampRgb(green)};${clampRgb(blue)}m`\n };\n}\n\nfunction createColor(styles: AnsiPair[] = []): Color {\n const builder = ((text: string) => applyStyles(String(text), styles)) as Color;\n\n for (const name of styleNames) {\n Object.defineProperty(builder, name, {\n configurable: true,\n enumerable: true,\n get: () => createColor([...styles, ansiStyles[name]])\n });\n }\n\n builder.hex = (value: string) => {\n const [red, green, blue] = normalizeHex(value);\n return createColor([...styles, rgbStyle(red, green, blue)]);\n };\n\n builder.rgb = (red: number, green: number, blue: number) =>\n createColor([...styles, rgbStyle(red, green, blue)]);\n\n builder.bgHex = (value: string) => {\n const [red, green, blue] = normalizeHex(value);\n return createColor([...styles, bgRgbStyle(red, green, blue)]);\n };\n\n builder.bgRgb = (red: number, green: number, blue: number) =>\n createColor([...styles, bgRgbStyle(red, green, blue)]);\n\n return builder;\n}\n\nexport const color = createColor();\n", "import { color } from \"../components/color.js\";\n\nexport const brand = \"#a200ff\";\n\nexport const dark = {\n header: (text: string) => color.magentaBright.bold(text),\n divider: (text: string) => color.dim(text),\n prompt: (text: string) => color.cyan(text),\n number: (text: string) => color.cyanBright(text),\n intro: (text: string) => color.bgMagenta.white(` Poe - ${text} `),\n resolvedSymbol: color.magenta(\"\u25C7\"),\n errorSymbol: color.red(\"\u25A0\"),\n accent: (text: string) => color.cyan(text),\n muted: (text: string) => color.dim(text),\n success: (text: string) => color.green(text),\n warning: (text: string) => color.yellow(text),\n error: (text: string) => color.red(text),\n info: (text: string) => color.magenta(text),\n badge: (text: string) => color.bgYellow.black(` ${text} `)\n};\n\nexport const light = {\n header: (text: string) => color.hex(\"#a200ff\").bold(text),\n divider: (text: string) => color.hex(\"#666666\")(text),\n prompt: (text: string) => color.hex(\"#006699\").bold(text),\n number: (text: string) => color.hex(\"#0077cc\").bold(text),\n intro: (text: string) => color.bgHex(\"#a200ff\").white(` Poe - ${text} `),\n resolvedSymbol: color.hex(\"#a200ff\")(\"\u25C7\"),\n errorSymbol: color.hex(\"#cc0000\")(\"\u25A0\"),\n accent: (text: string) => color.hex(\"#006699\").bold(text),\n muted: (text: string) => color.hex(\"#666666\")(text),\n success: (text: string) => color.hex(\"#008800\")(text),\n warning: (text: string) => color.hex(\"#cc6600\")(text),\n error: (text: string) => color.hex(\"#cc0000\")(text),\n info: (text: string) => color.hex(\"#a200ff\")(text),\n badge: (text: string) => color.bgHex(\"#cc6600\").white(` ${text} `)\n};\n\nexport type ThemeName = \"dark\" | \"light\";\nexport type ThemePalette = typeof dark;\n", "import { AsyncLocalStorage } from \"node:async_hooks\";\n\nexport type OutputFormat = \"terminal\" | \"markdown\" | \"json\";\n\nconst VALID_FORMATS = new Set<OutputFormat>([\"terminal\", \"markdown\", \"json\"]);\nconst formatStorage = new AsyncLocalStorage<OutputFormat>();\n\nlet cached: OutputFormat | undefined;\n\nexport function resolveOutputFormat(\n env: { OUTPUT_FORMAT?: string } = process.env as { OUTPUT_FORMAT?: string }\n): OutputFormat {\n const scoped = formatStorage.getStore();\n if (scoped) {\n return scoped;\n }\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 withOutputFormat<T>(format: OutputFormat, fn: () => T): T {\n return formatStorage.run(format, fn);\n}\n\nexport function resetOutputFormatCache(): void {\n cached = undefined;\n}\n", "import { dark, light, type ThemeName, type ThemePalette } from \"../tokens/colors.js\";\n\nexport interface ThemeEnv {\n POE_CODE_THEME?: string;\n POE_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 ?? env.POE_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 { color } from \"./color.js\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { getTheme } from \"../internal/theme-detect.js\";\n\nexport const symbols = {\n get info(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"info\";\n if (format === \"markdown\") return \"(i)\";\n return color.magenta(\"\u25CF\");\n },\n get success(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"success\";\n if (format === \"markdown\") return \"[ok]\";\n return color.magenta(\"\u25C6\");\n },\n get resolved(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"resolved\";\n if (format === \"markdown\") return \">\";\n return getTheme().resolvedSymbol;\n },\n get errorResolved(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"error\";\n if (format === \"markdown\") return \"[!]\";\n return getTheme().errorSymbol;\n },\n get bar(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"\";\n if (format === \"markdown\") return \"|\";\n return \"\u2502\";\n },\n cornerTopRight: \"\u256E\",\n cornerBottomRight: \"\u256F\",\n get warning(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"warning\";\n if (format === \"markdown\") return \"[!]\";\n return \"\u25B2\";\n },\n get active(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"active\";\n if (format === \"markdown\") return \"[x]\";\n return \"\u25C6\";\n },\n get inactive(): string {\n const format = resolveOutputFormat();\n if (format === \"json\") return \"inactive\";\n if (format === \"markdown\") return \"[ ]\";\n return \"\u25CB\";\n }\n} as const;\n", "export function stripAnsi(value: string): string {\n return value.replace(/\\u001b\\[[0-9;]*m/g, \"\");\n}\n", "import { color } from \"../../components/color.js\";\nimport { symbols } from \"../../components/symbols.js\";\nimport { resolveOutputFormat } from \"../../internal/output-format.js\";\nimport { stripAnsi } from \"../../internal/strip-ansi.js\";\n\nexport interface LogMessageOptions {\n symbol?: string;\n secondarySymbol?: string;\n spacing?: number;\n withGuide?: boolean;\n}\n\nfunction writeTerminalMessage(\n msg: string,\n {\n symbol = color.gray(\"\u2502\"),\n secondarySymbol = color.gray(\"\u2502\"),\n spacing = 1,\n withGuide = true\n }: LogMessageOptions = {}\n): void {\n const lines: string[] = [];\n const showGuide = withGuide !== false;\n const contentLines = msg.split(\"\\n\");\n const prefix = showGuide ? `${symbol} ` : \"\";\n const continuationPrefix = showGuide ? `${secondarySymbol} ` : \"\";\n const emptyGuide = showGuide ? secondarySymbol : \"\";\n\n for (let index = 0; index < spacing; index += 1) {\n lines.push(emptyGuide);\n }\n\n if (contentLines.length === 0) {\n process.stdout.write(\"\\n\");\n return;\n }\n\n const [firstLine = \"\", ...continuationLines] = contentLines;\n if (firstLine.length > 0) {\n lines.push(`${prefix}${firstLine}`);\n } else {\n lines.push(showGuide ? symbol : \"\");\n }\n\n for (const line of continuationLines) {\n if (line.length > 0) {\n lines.push(`${continuationPrefix}${line}`);\n continue;\n }\n lines.push(emptyGuide);\n }\n\n process.stdout.write(`${lines.join(\"\\n\")}\\n`);\n}\n\nexport function message(msg: string, options?: LogMessageOptions): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`- ${stripAnsi(msg)}\\n`);\n return;\n }\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ level: \"message\", message: stripAnsi(msg) })}\\n`\n );\n return;\n }\n\n writeTerminalMessage(msg, options);\n}\n\nexport function info(msg: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`- **info:** ${stripAnsi(msg)}\\n`);\n return;\n }\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ level: \"info\", message: stripAnsi(msg) })}\\n`\n );\n return;\n }\n\n message(msg, { symbol: symbols.info });\n}\n\nexport function success(msg: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`- **success:** ${stripAnsi(msg)}\\n`);\n return;\n }\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ level: \"success\", message: stripAnsi(msg) })}\\n`\n );\n return;\n }\n\n message(msg, { symbol: symbols.success });\n}\n\nexport function warn(msg: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`- **warning:** ${stripAnsi(msg)}\\n`);\n return;\n }\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ level: \"warn\", message: stripAnsi(msg) })}\\n`\n );\n return;\n }\n\n message(msg, { symbol: color.yellow(\"\u25B2\") });\n}\n\nexport function error(msg: string): void {\n const format = resolveOutputFormat();\n if (format === \"markdown\") {\n process.stdout.write(`- **error:** ${stripAnsi(msg)}\\n`);\n return;\n }\n if (format === \"json\") {\n process.stdout.write(\n `${JSON.stringify({ level: \"error\", message: stripAnsi(msg) })}\\n`\n );\n return;\n }\n\n message(msg, { symbol: color.red(\"\u25A0\") });\n}\n\nexport const log = {\n info,\n success,\n message,\n warn,\n error\n};\n", "import { color } from \"./color.js\";\nimport { log } from \"../prompts/primitives/log.js\";\nimport { symbols } from \"./symbols.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 (level === \"success\") {\n log.success(message);\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.info(message);\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 ?? color.gray(\"\u2502\") });\n }\n };\n}\n\nexport const logger = createLogger();\n", "import type { ThemePalette } from \"../tokens/colors.js\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { stripAnsi } from \"../internal/strip-ansi.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\ntype TableAlignment = TableColumn[\"alignment\"] | \"center\";\n\ninterface ComputedColumn {\n name: string;\n title: string;\n alignment: TableAlignment;\n width: number;\n}\n\nconst reset = \"\\x1b[0m\";\nconst ellipsis = \"\u2026\";\nconst graphemeSegmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\n\nfunction isAnsiSequence(value: string, index: number): boolean {\n return value[index] === \"\\u001b\" && value[index + 1] === \"[\";\n}\n\nfunction readAnsiSequence(value: string, index: number): { sequence: string; nextIndex: number } {\n let nextIndex = index + 2;\n while (nextIndex < value.length && value[nextIndex] !== \"m\") {\n nextIndex += 1;\n }\n\n if (nextIndex < value.length) {\n nextIndex += 1;\n }\n\n return { sequence: value.slice(index, nextIndex), nextIndex };\n}\n\nfunction isCombiningCodePoint(codePoint: number): boolean {\n return (\n (codePoint >= 0x0300 && codePoint <= 0x036f) ||\n (codePoint >= 0x1ab0 && codePoint <= 0x1aff) ||\n (codePoint >= 0x1dc0 && codePoint <= 0x1dff) ||\n (codePoint >= 0x20d0 && codePoint <= 0x20ff) ||\n (codePoint >= 0xfe20 && codePoint <= 0xfe2f)\n );\n}\n\nfunction isWideCodePoint(codePoint: number): boolean {\n return (\n (codePoint >= 0x1100 && codePoint <= 0x115f) ||\n codePoint === 0x2329 ||\n codePoint === 0x232a ||\n (codePoint >= 0x2e80 && codePoint <= 0xa4cf && codePoint !== 0x303f) ||\n (codePoint >= 0xac00 && codePoint <= 0xd7a3) ||\n (codePoint >= 0xf900 && codePoint <= 0xfaff) ||\n (codePoint >= 0xfe10 && codePoint <= 0xfe19) ||\n (codePoint >= 0xfe30 && codePoint <= 0xfe6f) ||\n (codePoint >= 0xff00 && codePoint <= 0xff60) ||\n (codePoint >= 0xffe0 && codePoint <= 0xffe6) ||\n (codePoint >= 0x2600 && codePoint <= 0x27bf) ||\n (codePoint >= 0x1f300 && codePoint <= 0x1faff) ||\n (codePoint >= 0x20000 && codePoint <= 0x3fffd)\n );\n}\n\nfunction isEmojiClusterCodePoint(codePoint: number): boolean {\n return (\n (codePoint >= 0x1f1e6 && codePoint <= 0x1f1ff) ||\n (codePoint >= 0x1f300 && codePoint <= 0x1faff) ||\n (codePoint >= 0x2600 && codePoint <= 0x27bf)\n );\n}\n\nfunction codePointWidth(char: string): number {\n const codePoint = char.codePointAt(0) ?? 0;\n\n if (codePoint === 0 || codePoint < 0x20 || (codePoint >= 0x7f && codePoint < 0xa0)) {\n return 0;\n }\n\n if (\n codePoint === 0x200d ||\n (codePoint >= 0xfe00 && codePoint <= 0xfe0f) ||\n isCombiningCodePoint(codePoint)\n ) {\n return 0;\n }\n\n return isWideCodePoint(codePoint) ? 2 : 1;\n}\n\nfunction readPrintableCluster(value: string, index: number): string {\n const nextAnsiIndex = value.indexOf(\"\\u001b[\", index);\n const plainText = value.slice(index, nextAnsiIndex === -1 ? undefined : nextAnsiIndex);\n const firstSegment = graphemeSegmenter.segment(plainText)[Symbol.iterator]().next().value as\n | Intl.SegmentData\n | undefined;\n\n return firstSegment?.segment ?? Array.from(plainText)[0] ?? \"\";\n}\n\nfunction clusterWidth(cluster: string): number {\n const codePoints = Array.from(cluster).map((char) => char.codePointAt(0) ?? 0);\n const isEmojiCluster =\n codePoints.length > 1 &&\n codePoints.some(\n (codePoint) =>\n codePoint === 0x200d ||\n (codePoint >= 0xfe00 && codePoint <= 0xfe0f) ||\n isEmojiClusterCodePoint(codePoint)\n );\n\n if (isEmojiCluster) {\n return 2;\n }\n\n return codePoints.reduce((width, codePoint) => width + codePointWidth(String.fromCodePoint(codePoint)), 0);\n}\n\nfunction displayWidth(value: string): number {\n let width = 0;\n let index = 0;\n\n while (index < value.length) {\n if (isAnsiSequence(value, index)) {\n index = readAnsiSequence(value, index).nextIndex;\n continue;\n }\n\n const cluster = readPrintableCluster(value, index);\n width += clusterWidth(cluster);\n index += cluster.length;\n }\n\n return width;\n}\n\nfunction truncateToWidth(value: string, width: number): string {\n if (displayWidth(value) <= width) {\n return value;\n }\n\n if (width <= 0) {\n return \"\";\n }\n\n const targetWidth = width <= 1 ? 0 : width - displayWidth(ellipsis);\n let output = \"\";\n let currentWidth = 0;\n let index = 0;\n let sawAnsi = false;\n\n while (index < value.length) {\n if (isAnsiSequence(value, index)) {\n const ansi = readAnsiSequence(value, index);\n sawAnsi = true;\n output += ansi.sequence;\n index = ansi.nextIndex;\n continue;\n }\n\n const cluster = readPrintableCluster(value, index);\n const width = clusterWidth(cluster);\n if (currentWidth + width > targetWidth) {\n break;\n }\n\n output += cluster;\n currentWidth += width;\n index += cluster.length;\n }\n\n return `${output}${ellipsis}${sawAnsi ? reset : \"\"}`;\n}\n\nfunction padCell(value: string, width: number, alignment: TableAlignment): string {\n const visibleWidth = displayWidth(value);\n const padding = Math.max(0, width - visibleWidth);\n\n if (alignment === \"right\") {\n return `${\" \".repeat(padding)}${value}`;\n }\n\n if (alignment === \"center\") {\n const left = Math.floor(padding / 2);\n const right = padding - left;\n return `${\" \".repeat(left)}${value}${\" \".repeat(right)}`;\n }\n\n return `${value}${\" \".repeat(padding)}`;\n}\n\nfunction getAlignment(column: TableColumn): TableAlignment {\n const alignment = (column as { alignment: TableAlignment }).alignment;\n return alignment === \"right\" || alignment === \"center\" ? alignment : \"left\";\n}\n\nfunction getColumnWidth(column: TableColumn): number {\n const configuredMin = (column as { minLen?: number }).minLen;\n const minWidth = Math.max(1, configuredMin ?? 1);\n return Math.max(minWidth, column.maxLen);\n}\n\nfunction computeColumns(columns: TableColumn[]): ComputedColumn[] {\n return columns.map((column) => ({\n name: column.name,\n title: column.title,\n alignment: getAlignment(column),\n width: getColumnWidth(column)\n }));\n}\n\nfunction renderBorder(\n columns: ComputedColumn[],\n theme: ThemePalette,\n parts: { left: string; mid: string; right: string }\n): string {\n const horizontal = theme.muted(\"\u2500\");\n const segments = columns.map((column) => horizontal.repeat(column.width + 2));\n return [\n theme.muted(parts.left),\n segments.join(theme.muted(parts.mid)),\n theme.muted(parts.right)\n ].join(\"\");\n}\n\nfunction renderTerminalRow(values: string[], columns: ComputedColumn[], theme: ThemePalette): string {\n const vertical = theme.muted(\"\u2502\");\n const cells = values.map((value, index) => {\n const column = columns[index]!;\n const truncated = truncateToWidth(value, column.width);\n return ` ${padCell(truncated, column.width, column.alignment)} `;\n });\n\n return `${vertical}${cells.join(vertical)}${vertical}`;\n}\n\nfunction renderTableTerminal(options: RenderTableOptions): string {\n const { theme, columns, rows } = options;\n const computedColumns = computeColumns(columns);\n const separatorOptions = options as { rowSeparator?: boolean; rowSeparators?: boolean };\n const includeRowSeparators =\n separatorOptions.rowSeparator === true || separatorOptions.rowSeparators === true;\n\n const top = renderBorder(computedColumns, theme, { left: \"\u250C\", mid: \"\u252C\", right: \"\u2510\" });\n const header = renderTerminalRow(\n computedColumns.map((column) => theme.header(column.title)),\n computedColumns,\n theme\n );\n const headerBottom = renderBorder(computedColumns, theme, { left: \"\u251C\", mid: \"\u253C\", right: \"\u2524\" });\n const bottom = renderBorder(computedColumns, theme, { left: \"\u2514\", mid: \"\u2534\", right: \"\u2518\" });\n\n const renderedRows: string[] = [];\n for (const [index, row] of rows.entries()) {\n if (includeRowSeparators && index > 0) {\n renderedRows.push(headerBottom);\n }\n renderedRows.push(\n renderTerminalRow(\n computedColumns.map((column) => row[column.name] ?? \"\"),\n computedColumns,\n theme\n )\n );\n }\n\n return [top, header, headerBottom, ...renderedRows, bottom].join(\"\\n\");\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\n .map((c) => {\n const alignment = getAlignment(c);\n if (alignment === \"right\") {\n return \"---:\";\n }\n if (alignment === \"center\") {\n return \":---:\";\n }\n return \":---\";\n })\n .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", "export type TemplateEscape = \"html\" | \"none\";\n\nexport interface RenderTemplateOptions {\n escape?: TemplateEscape;\n yield?: string;\n}\n\ntype Token =\n | { type: \"text\"; value: string; start: number }\n | { type: \"name\" | \"unescaped\"; name: string; raw: string }\n | { type: \"section\" | \"inverted\"; name: string; children: Token[]; rawStart: number; rawEnd: number };\n\ninterface SectionFrame {\n token: Extract<Token, { type: \"section\" | \"inverted\" }>;\n parent: Token[];\n}\n\ninterface Context {\n view: unknown;\n parent?: Context;\n}\n\ntype Lambda = (...args: unknown[]) => unknown;\n\nconst HTML_ESCAPE: Record<string, string> = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\",\n \"/\": \"/\",\n \"`\": \"`\",\n \"=\": \"=\"\n};\n\nexport function renderTemplate(\n template: string,\n view: Record<string, unknown>,\n options: RenderTemplateOptions = {}\n): string {\n const prepared = options.yield === undefined\n ? template\n : template.split(\"{{yield}}\").join(options.yield);\n const tokens = parseTemplate(prepared);\n const escape = options.escape === \"none\" ? String : escapeHtml;\n const preserveMissing = options.yield !== undefined && options.escape === \"none\";\n\n return renderTokens(tokens, { view }, prepared, escape, preserveMissing);\n}\n\nfunction renderTemplateInContext(\n template: string,\n context: Context,\n escape: (value: string) => string,\n preserveMissing: boolean\n): string {\n return renderTokens(parseTemplate(template), context, template, escape, preserveMissing);\n}\n\nfunction parseTemplate(template: string): Token[] {\n const root: Token[] = [];\n const stack: SectionFrame[] = [];\n let tokens = root;\n let index = 0;\n\n while (index < template.length) {\n const open = template.indexOf(\"{{\", index);\n if (open === -1) {\n appendText(tokens, template.slice(index), index);\n break;\n }\n\n appendText(tokens, template.slice(index, open), index);\n\n const parsed = parseTag(template, open);\n const standalone = getStandalone(template, open, parsed.end, parsed.kind);\n if (standalone !== undefined) {\n trimTextAfter(tokens, standalone.lineStart);\n }\n\n if (parsed.kind === \"comment\") {\n index = standalone?.nextIndex ?? parsed.end;\n continue;\n }\n\n if (parsed.kind === \"partial\") {\n throw new Error(`Partials are not supported: \"${parsed.name}\"`);\n }\n\n if (parsed.kind === \"delimiter\") {\n throw new Error(\"Custom delimiters are not supported\");\n }\n\n if (parsed.kind === \"section\" || parsed.kind === \"inverted\") {\n const token: Token = {\n type: parsed.kind,\n name: parsed.name,\n children: [],\n rawStart: parsed.end,\n rawEnd: standalone?.lineStart ?? open\n };\n tokens.push(token);\n stack.push({ token, parent: tokens });\n tokens = token.children;\n index = standalone?.nextIndex ?? parsed.end;\n continue;\n }\n\n if (parsed.kind === \"close\") {\n const frame = stack.pop();\n if (frame === undefined) {\n throw new Error(`Closing unopened section \"${parsed.name}\"`);\n }\n if (frame.token.name !== parsed.name) {\n throw new Error(`Unclosed section \"${frame.token.name}\" before closing \"${parsed.name}\"`);\n }\n frame.token.rawEnd = open;\n tokens = frame.parent;\n index = standalone?.nextIndex ?? parsed.end;\n continue;\n }\n\n tokens.push({ type: parsed.kind, name: parsed.name, raw: template.slice(open, parsed.end) });\n index = parsed.end;\n }\n\n const frame = stack.pop();\n if (frame !== undefined) {\n throw new Error(`Unclosed section \"${frame.token.name}\"`);\n }\n\n return root;\n}\n\nfunction parseTag(template: string, open: number): {\n kind: \"name\" | \"unescaped\" | \"section\" | \"inverted\" | \"close\" | \"comment\" | \"partial\" | \"delimiter\";\n name: string;\n end: number;\n} {\n if (template.startsWith(\"{{{\", open)) {\n const close = template.indexOf(\"}}}\", open + 3);\n if (close === -1) {\n throw new Error(\"Unclosed unescaped tag\");\n }\n return { kind: \"unescaped\", name: template.slice(open + 3, close).trim(), end: close + 3 };\n }\n\n const close = template.indexOf(\"}}\", open + 2);\n if (close === -1) {\n throw new Error(\"Unclosed tag\");\n }\n\n const raw = template.slice(open + 2, close).trim();\n const sigil = raw[0];\n const name = sigil === undefined ? \"\" : raw.slice(1).trim();\n const end = close + 2;\n\n if (sigil === \"#\") return { kind: \"section\", name, end };\n if (sigil === \"^\") return { kind: \"inverted\", name, end };\n if (sigil === \"/\") return { kind: \"close\", name, end };\n if (sigil === \"!\") return { kind: \"comment\", name, end };\n if (sigil === \"&\") return { kind: \"unescaped\", name, end };\n if (sigil === \">\") return { kind: \"partial\", name, end };\n if (sigil === \"=\" && raw.endsWith(\"=\")) return { kind: \"delimiter\", name, end };\n\n return { kind: \"name\", name: raw, end };\n}\n\nfunction getStandalone(\n template: string,\n tagStart: number,\n tagEnd: number,\n kind: ReturnType<typeof parseTag>[\"kind\"]\n): { lineStart: number; nextIndex: number } | undefined {\n if (![\"section\", \"inverted\", \"close\", \"comment\", \"partial\", \"delimiter\"].includes(kind)) {\n return undefined;\n }\n\n const lineStart = template.lastIndexOf(\"\\n\", tagStart - 1) + 1;\n if (!isWhitespace(template.slice(lineStart, tagStart))) {\n return undefined;\n }\n\n let cursor = tagEnd;\n while (cursor < template.length && (template[cursor] === \" \" || template[cursor] === \"\\t\")) {\n cursor += 1;\n }\n\n if (template.startsWith(\"\\r\\n\", cursor)) {\n return { lineStart, nextIndex: cursor + 2 };\n }\n\n if (template[cursor] === \"\\n\") {\n return { lineStart, nextIndex: cursor + 1 };\n }\n\n if (cursor === template.length) {\n return { lineStart, nextIndex: cursor };\n }\n\n return undefined;\n}\n\nfunction renderTokens(\n tokens: Token[],\n context: Context,\n template: string,\n escape: (value: string) => string,\n preserveMissing: boolean\n): string {\n let output = \"\";\n\n for (const token of tokens) {\n switch (token.type) {\n case \"text\":\n output += token.value;\n continue;\n\n case \"name\":\n case \"unescaped\": {\n const value = lookup(context, token.name);\n if (value == null) {\n if (preserveMissing) {\n output += token.raw;\n }\n continue;\n }\n const rendered = String(value);\n output += token.type === \"name\" ? escape(rendered) : rendered;\n continue;\n }\n\n case \"inverted\": {\n const value = lookup(context, token.name);\n if (!value || (Array.isArray(value) && value.length === 0)) {\n output += renderTokens(token.children, context, template, escape, preserveMissing);\n }\n continue;\n }\n\n case \"section\": {\n const value = lookup(context, token.name);\n if (!value) {\n continue;\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n output += renderTokens(token.children, pushContext(context, item), template, escape, preserveMissing);\n }\n continue;\n }\n\n if (typeof value === \"function\") {\n const raw = template.slice(token.rawStart, token.rawEnd);\n const rendered = (value as Lambda).call(context.view, raw, (nextTemplate: string) =>\n renderTemplateInContext(nextTemplate, context, escape, preserveMissing)\n );\n if (rendered != null) {\n output += String(rendered);\n }\n continue;\n }\n\n if (typeof value === \"object\" || typeof value === \"string\" || typeof value === \"number\") {\n output += renderTokens(token.children, pushContext(context, value), template, escape, preserveMissing);\n continue;\n }\n\n output += renderTokens(token.children, context, template, escape, preserveMissing);\n }\n }\n }\n\n return output;\n}\n\nfunction lookup(context: Context, name: string): unknown {\n if (name === \".\") {\n return callLambda(context.view, context.view);\n }\n\n let cursor: Context | undefined = context;\n while (cursor !== undefined) {\n const result = name.includes(\".\")\n ? lookupDotted(cursor.view, name)\n : lookupName(cursor.view, name);\n\n if (result.hit) {\n return callLambda(result.value, cursor.view);\n }\n\n cursor = cursor.parent;\n }\n\n return undefined;\n}\n\nfunction lookupName(view: unknown, name: string): { hit: boolean; value: unknown } {\n if (!isPropertyContainer(view) || !hasProperty(view, name)) {\n return { hit: false, value: undefined };\n }\n\n return { hit: true, value: view[name] };\n}\n\nfunction lookupDotted(view: unknown, name: string): { hit: boolean; value: unknown } {\n const parts = name.split(\".\");\n let value = view;\n let hit = false;\n\n for (let index = 0; value != null && index < parts.length; index += 1) {\n const part = parts[index] ?? \"\";\n if (index === parts.length - 1) {\n hit = hasProperty(Object(value), part);\n }\n value = Object(value)[part as keyof typeof value];\n }\n\n return { hit, value };\n}\n\nfunction callLambda(value: unknown, view: unknown): unknown {\n return typeof value === \"function\" ? (value as Lambda).call(view) : value;\n}\n\nfunction pushContext(parent: Context, view: unknown): Context {\n return { view, parent };\n}\n\nfunction appendText(tokens: Token[], value: string, start: number): void {\n if (value === \"\") {\n return;\n }\n\n const previous = tokens[tokens.length - 1];\n if (previous?.type === \"text\") {\n previous.value += value;\n return;\n }\n\n tokens.push({ type: \"text\", value, start });\n}\n\nfunction trimTextAfter(tokens: Token[], lineStart: number): void {\n const previous = tokens[tokens.length - 1];\n if (previous?.type !== \"text\") {\n return;\n }\n\n const keep = Math.max(0, lineStart - previous.start);\n previous.value = previous.value.slice(0, keep);\n if (previous.value === \"\") {\n tokens.pop();\n }\n}\n\nfunction escapeHtml(value: string): string {\n return value.replace(/[&<>\"'`=/]/g, (char) => HTML_ESCAPE[char] ?? char);\n}\n\nfunction isWhitespace(value: string): boolean {\n return value.trim() === \"\";\n}\n\nfunction isPropertyContainer(value: unknown): value is Record<string, unknown> {\n return (typeof value === \"object\" && value !== null) || typeof value === \"function\";\n}\n\nfunction hasProperty(value: object, key: string): boolean {\n return key in value;\n}\n", "import { spawn } from \"node:child_process\";\nimport process from \"node:process\";\n\ninterface BrowserProcess {\n once(event: \"error\", listener: (error: Error) => void): this;\n once(event: \"spawn\", listener: () => void): this;\n unref(): void;\n}\n\ntype SpawnBrowserProcess = (\n command: string,\n args: string[],\n options: { detached: true; stdio: \"ignore\" }\n) => BrowserProcess;\n\nexport interface OpenExternalOptions {\n platform?: NodeJS.Platform;\n spawnProcess?: SpawnBrowserProcess;\n}\n\nexport async function openExternal(url: string, options: OpenExternalOptions = {}): Promise<void> {\n const parsed = new URL(url);\n const { command, args } = browserCommand(parsed.href, options.platform ?? process.platform);\n await launchBrowser(command, args, options.spawnProcess ?? spawn);\n}\n\nfunction browserCommand(url: string, platform: NodeJS.Platform): { command: string; args: string[] } {\n if (platform === \"darwin\") {\n return { command: \"open\", args: [url] };\n }\n\n if (platform === \"win32\") {\n return { command: \"cmd\", args: [\"/c\", \"start\", \"\", url] };\n }\n\n return { command: \"xdg-open\", args: [url] };\n}\n\nfunction launchBrowser(\n command: string,\n args: string[],\n spawnProcess: SpawnBrowserProcess\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawnProcess(command, args, { detached: true, stdio: \"ignore\" });\n\n child.once(\"error\", reject);\n child.once(\"spawn\", () => {\n child.unref();\n resolve();\n });\n });\n}\n", "import { AsyncLocalStorage } from \"node:async_hooks\";\n\nexport type AcpLineWriter = (line: string) => void;\n\nconst storage = new AsyncLocalStorage<AcpLineWriter>();\n\nconst defaultWriter: AcpLineWriter = (line) => {\n process.stdout.write(`${line}\\n`);\n};\n\n/**\n * Return the writer active in the current async context, or the default\n * stdout writer if none is bound.\n */\nexport function getAcpWriter(): AcpLineWriter {\n return storage.getStore() ?? defaultWriter;\n}\n\n/**\n * Run `fn` with `writer` bound as the active ACP line writer. All calls to\n * `renderAgentMessage`, `renderToolStart`, `renderAcpEvent`, etc. made inside\n * `fn` (or async work awaited from `fn`) will go through `writer` instead of\n * writing to `process.stdout`.\n */\nexport function withAcpWriter<T>(writer: AcpLineWriter, fn: () => Promise<T>): Promise<T> {\n return storage.run(writer, fn);\n}\n", "import readline from \"node:readline\";\nimport { PassThrough } from \"node:stream\";\nimport { cellToAnsi } from \"./buffer.js\";\nimport type { Cell } from \"./types.js\";\n\nexport type KeypressEvent = {\n name?: string;\n ch?: string;\n ctrl: boolean;\n meta: boolean;\n shift: boolean;\n};\n\nexport type TerminalDriver = {\n enterRawMode(): void;\n exitRawMode(): void;\n enterAltScreen(): void;\n exitAltScreen(): void;\n disableLineWrap(): void;\n enableLineWrap(): void;\n hideCursor(): void;\n showCursor(): void;\n moveTo(x: number, y: number): void;\n write(text: string): void;\n flush(changes: Array<{ x: number; y: number; cell: Cell }>): void;\n getSize(): { cols: number; rows: number };\n onResize(handler: () => void): () => void;\n onKeypress(handler: (key: KeypressEvent) => void): () => void;\n destroy(): void;\n};\n\ntype ReadlineKey = {\n sequence?: string;\n name?: string;\n ctrl?: boolean;\n meta?: boolean;\n shift?: boolean;\n};\n\ntype KeypressInput = NodeJS.ReadableStream & {\n on(event: \"keypress\", listener: (str: string | undefined, key: ReadlineKey) => void): KeypressInput;\n off(event: \"keypress\", listener: (str: string | undefined, key: ReadlineKey) => void): KeypressInput;\n};\n\ntype TerminalInput = NodeJS.ReadStream & KeypressInput & {\n setRawMode?: (mode: boolean) => void;\n};\n\ntype TerminalOutput = NodeJS.WriteStream & {\n columns?: number;\n rows?: number;\n on(event: \"resize\", listener: () => void): TerminalOutput;\n off(event: \"resize\", listener: () => void): TerminalOutput;\n};\n\nexport function createTerminalDriver(opts?: {\n stdin?: NodeJS.ReadStream;\n stdout?: NodeJS.WriteStream;\n}): TerminalDriver {\n const stdin = (opts?.stdin ?? process.stdin) as TerminalInput;\n const stdout = (opts?.stdout ?? process.stdout) as TerminalOutput;\n const resizeListeners = new Set<() => void>();\n const keypressListeners = new Set<(str: string | undefined, key: ReadlineKey) => void>();\n let rawMode = false;\n let altScreen = false;\n let lineWrapEnabled = true;\n let cursorHidden = false;\n let destroyed = false;\n\n readline.emitKeypressEvents(stdin);\n\n function enterRawMode(): void {\n if (destroyed || rawMode) {\n return;\n }\n\n stdin.setRawMode?.(true);\n stdin.resume();\n rawMode = true;\n }\n\n function exitRawMode(): void {\n if (destroyed || !rawMode) {\n return;\n }\n\n stdin.setRawMode?.(false);\n stdin.pause();\n rawMode = false;\n }\n\n function enterAltScreen(): void {\n if (destroyed || altScreen) {\n return;\n }\n\n write(\"\\u001b[?1049h\");\n altScreen = true;\n }\n\n function exitAltScreen(): void {\n if (destroyed || !altScreen) {\n return;\n }\n\n write(\"\\u001b[?1049l\");\n altScreen = false;\n }\n\n function disableLineWrap(): void {\n if (destroyed || !lineWrapEnabled) {\n return;\n }\n\n write(\"\\u001b[?7l\");\n lineWrapEnabled = false;\n }\n\n function enableLineWrap(): void {\n if (destroyed || lineWrapEnabled) {\n return;\n }\n\n write(\"\\u001b[?7h\");\n lineWrapEnabled = true;\n }\n\n function hideCursor(): void {\n if (destroyed || cursorHidden) {\n return;\n }\n\n write(\"\\u001b[?25l\");\n cursorHidden = true;\n }\n\n function showCursor(): void {\n if (destroyed || !cursorHidden) {\n return;\n }\n\n write(\"\\u001b[?25h\");\n cursorHidden = false;\n }\n\n function moveTo(x: number, y: number): void {\n if (destroyed) {\n return;\n }\n\n write(cursorPositionAnsi(x, y));\n }\n\n function write(text: string): void {\n if (destroyed || text.length === 0) {\n return;\n }\n\n stdout.write(text);\n }\n\n function flush(changes: Array<{ x: number; y: number; cell: Cell }>): void {\n if (destroyed || changes.length === 0) {\n return;\n }\n\n let output = \"\";\n\n for (const change of changes) {\n output += `${cursorPositionAnsi(change.x, change.y)}${cellToAnsi(change.cell)}`;\n }\n\n write(output);\n }\n\n function getSize(): { cols: number; rows: number } {\n return {\n cols: normalizeSize(stdout.columns),\n rows: normalizeSize(stdout.rows)\n };\n }\n\n function onResize(handler: () => void): () => void {\n if (destroyed) {\n return () => {};\n }\n\n const listener = () => {\n handler();\n };\n\n resizeListeners.add(listener);\n stdout.on(\"resize\", listener);\n\n return () => {\n if (!resizeListeners.delete(listener)) {\n return;\n }\n\n stdout.off(\"resize\", listener);\n };\n }\n\n function onKeypress(handler: (key: KeypressEvent) => void): () => void {\n if (destroyed) {\n return () => {};\n }\n\n const listener = (str: string | undefined, key: ReadlineKey) => {\n const event = toKeypressEvent(str, key);\n if (event !== undefined) {\n handler(event);\n }\n };\n\n keypressListeners.add(listener);\n stdin.on(\"keypress\", listener);\n\n return () => {\n if (!keypressListeners.delete(listener)) {\n return;\n }\n\n stdin.off(\"keypress\", listener);\n };\n }\n\n function destroy(): void {\n if (destroyed) {\n return;\n }\n\n for (const listener of keypressListeners) {\n stdin.off(\"keypress\", listener);\n }\n keypressListeners.clear();\n\n for (const listener of resizeListeners) {\n stdout.off(\"resize\", listener);\n }\n resizeListeners.clear();\n\n exitRawMode();\n enableLineWrap();\n exitAltScreen();\n showCursor();\n destroyed = true;\n }\n\n return {\n enterRawMode,\n exitRawMode,\n enterAltScreen,\n exitAltScreen,\n disableLineWrap,\n enableLineWrap,\n hideCursor,\n showCursor,\n moveTo,\n write,\n flush,\n getSize,\n onResize,\n onKeypress,\n destroy\n };\n}\n\nexport function parseKeypress(data: Buffer): KeypressEvent | undefined {\n if (data.length === 0) {\n return undefined;\n }\n\n const stream = new PassThrough();\n const stdin = stream as unknown as KeypressInput;\n let event: KeypressEvent | undefined;\n\n readline.emitKeypressEvents(stdin);\n stdin.on(\"keypress\", (str, key) => {\n event = toKeypressEvent(str, key);\n });\n stream.emit(\"data\", data);\n stream.destroy();\n\n return event;\n}\n\nfunction toKeypressEvent(str: string | undefined, key: ReadlineKey | undefined): KeypressEvent | undefined {\n const controlCharacter = controlCharacterToKeypress(key?.sequence);\n if (controlCharacter !== undefined) {\n return controlCharacter;\n }\n\n const ctrl = key?.ctrl ?? false;\n const meta = key?.meta ?? false;\n const shift = key?.shift ?? false;\n const ch = extractPrintableCharacter(str, key?.sequence);\n\n if (ch !== undefined) {\n return { ch, ctrl, meta, shift };\n }\n\n if (key?.name === undefined) {\n return undefined;\n }\n\n return {\n name: key.name,\n ctrl,\n meta,\n shift\n };\n}\n\nfunction extractPrintableCharacter(str: string | undefined, sequence: string | undefined): string | undefined {\n if (isPrintableCharacter(str)) {\n return str;\n }\n\n if (isSinglePrintableSequence(sequence)) {\n return sequence;\n }\n\n if (sequence === undefined || sequence.length <= 1 || sequence[0] !== \"\\u001b\") {\n return undefined;\n }\n\n const candidate = sequence.slice(1);\n return isPrintableCharacter(candidate) ? candidate : undefined;\n}\n\nfunction isSinglePrintableSequence(value: string | undefined): boolean {\n if (value === undefined || Array.from(value).length !== 1) {\n return false;\n }\n\n const codePoint = value.codePointAt(0);\n return codePoint !== undefined && codePoint >= 0x20 && codePoint !== 0x7f;\n}\n\nfunction isPrintableCharacter(value: string | undefined): value is string {\n if (value === undefined || Array.from(value).length !== 1) {\n return false;\n }\n\n const codePoint = value.codePointAt(0);\n return codePoint !== undefined && codePoint >= 0x20 && codePoint !== 0x7f;\n}\n\nfunction controlCharacterToKeypress(sequence: string | undefined): KeypressEvent | undefined {\n if (sequence === \"\\u001f\") {\n return { ch: \"/\", ctrl: true, meta: false, shift: false };\n }\n\n if (sequence !== undefined && sequence.length === 1) {\n const code = sequence.charCodeAt(0);\n if (code >= 1 && code <= 26 && code !== 9 && code !== 10 && code !== 13) {\n return {\n name: String.fromCharCode(code + 96),\n ctrl: true,\n meta: false,\n shift: false\n };\n }\n }\n\n return undefined;\n}\n\nfunction cursorPositionAnsi(x: number, y: number): string {\n return `\\u001b[${normalizeCoordinate(y) + 1};${normalizeCoordinate(x) + 1}H`;\n}\n\nfunction normalizeCoordinate(value: number): number {\n return Math.max(0, Math.floor(value));\n}\n\nfunction normalizeSize(value: number | undefined): number {\n if (value === undefined || !Number.isFinite(value)) {\n return 0;\n }\n\n return Math.max(0, Math.floor(value));\n}\n", "import { resolveBindings, type ResolvedBindings } from \"./keymap.js\";\n\nexport type Tone = \"success\" | \"warning\" | \"error\" | \"info\" | \"muted\";\n\nexport interface Row {\n id: string;\n title: string;\n subtitle?: string;\n badge?: { text: string; tone?: Tone };\n group?: string; // grouped rendering; rows with same group cluster under a header\n}\n\nexport interface DetailItem {\n id: string;\n title?: string; // absent => item fills pane with no cursor / no selection chrome\n subtitle?: string;\n badge?: { text: string; tone?: Tone };\n render: (ctx: DetailCtx) => string | Promise<string>;\n}\n\nexport interface Detail<R> {\n items: (row: Row, ctx: DetailCtx) => Promise<DetailItem[]>;\n actions?: Action<R>[]; // run against the focused detail item\n}\n\nexport interface DetailCtx { width: number; height: number; signal: AbortSignal; row: Row }\n\nexport interface Action<R> {\n id: string;\n label: string | (() => string); // function form re-evaluated when state changes\n key?: string | string[];\n predicate?: (ctx: ActionContext<R>) => boolean;\n handler: (ctx: ActionContext<R>) => void | Promise<void>;\n destructive?: boolean;\n primary?: boolean; // bound to Enter\n showInFooter?: boolean; // default true\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface ActionContext<R> {\n row: Row; // currently highlighted left-pane row\n rows: Row[]; // multi-select; falls back to [row] if no selection\n item?: DetailItem; // populated for actions declared under detail.actions\n filter: string;\n refresh: () => Promise<void>;\n suspendAnd: <T>(fn: () => Promise<T>) => Promise<T>;\n toast: (msg: string, tone?: Tone) => void;\n confirm: (prompt: string) => Promise<boolean>;\n exit: (after?: () => void | Promise<void>) => void;\n}\n\nexport interface ReorderContext {\n refresh: () => Promise<void>;\n toast: (msg: string, tone?: Tone) => void;\n}\n\nexport interface ExplorerConfig<R> {\n title: string;\n rows: () => Promise<Row[]>;\n refresh?: () => Promise<void>;\n detail: Detail<R>;\n actions: Action<R>[];\n reorder?: { onReorder: (orderedIds: string[], ctx?: ReorderContext) => void | Promise<void> };\n multiSelect?: boolean;\n keybindOverrides?: Record<string, string | string[]>;\n emptyHint?: string;\n initialFilter?: string;\n}\n\nexport const REGION_HEADER = 1 << 0;\nexport const REGION_LIST = 1 << 1;\nexport const REGION_DETAIL = 1 << 2;\nexport const REGION_FOOTER = 1 << 3;\nexport const REGION_MODAL = 1 << 4;\nexport const REGION_TOAST = 1 << 5;\nexport const REGION_ALL =\n REGION_HEADER |\n REGION_LIST |\n REGION_DETAIL |\n REGION_FOOTER |\n REGION_MODAL |\n REGION_TOAST;\n\nexport type Dirty = number;\n\nexport type ExplorerLayoutMode =\n | \"wide\"\n | \"medium\"\n | \"narrow-vertical\"\n | \"narrow-list-only\"\n | \"too-narrow\";\n\nexport interface ExplorerSize {\n cols: number;\n rows: number;\n}\n\nexport interface ExplorerState {\n title: string;\n emptyHint: string;\n rows: Row[];\n filtered: number[];\n matchPositions: Map<number, number[]>;\n cursor: number;\n filter: string;\n filterFocused: boolean;\n focused: \"list\" | \"detail\";\n detail: {\n rowId: string | null;\n items: DetailItem[] | null;\n cursor: number;\n scroll: number;\n token: number;\n loading: boolean;\n };\n selected: Set<string>;\n modal:\n | null\n | { kind: \"help\" }\n | { kind: \"confirm\"; action: Action<unknown>; rows: Row[]; resolver: (ok: boolean) => void }\n | { kind: \"palette\"; query: string; cursor: number };\n toast: { message: string; tone: Tone; expiresAt: number } | null;\n dirty: Dirty;\n size: ExplorerSize;\n layout: ExplorerLayoutMode;\n bindings: ResolvedBindings;\n actionState: Map<string, ActionStateEntry>;\n}\n\nexport interface ActionStateEntry {\n available: boolean;\n label: string;\n running?: boolean;\n action?: Action<unknown>;\n source?: \"row\" | \"detail\";\n}\n\nexport function createInitialState<R>(\n config: ExplorerConfig<R>,\n size: ExplorerSize\n): ExplorerState {\n const normalizedSize = {\n cols: normalizeSize(size.cols),\n rows: normalizeSize(size.rows)\n };\n\n return {\n title: config.title,\n emptyHint: config.emptyHint ?? \"No detail\",\n rows: [],\n filtered: [],\n matchPositions: new Map(),\n cursor: 0,\n filter: config.initialFilter ?? \"\",\n filterFocused: false,\n focused: \"list\",\n detail: {\n rowId: null,\n items: null,\n cursor: 0,\n scroll: 0,\n token: 0,\n loading: false\n },\n selected: new Set(),\n modal: null,\n toast: null,\n dirty: REGION_ALL,\n size: normalizedSize,\n layout: resolveExplorerLayoutMode(normalizedSize.cols),\n bindings: resolveBindings(config),\n actionState: createInitialActionState(config)\n };\n}\n\nfunction createInitialActionState<R>(\n config: ExplorerConfig<R>\n): Map<string, ActionStateEntry> {\n const state = new Map<string, ActionStateEntry>();\n\n for (const action of config.actions) {\n state.set(action.id, {\n available: true,\n label: typeof action.label === \"function\" ? action.id : action.label,\n action: action as Action<unknown>,\n source: \"row\"\n });\n }\n\n for (const action of config.detail.actions ?? []) {\n state.set(action.id, {\n available: true,\n label: typeof action.label === \"function\" ? action.id : action.label,\n action: action as Action<unknown>,\n source: \"detail\"\n });\n }\n\n return state;\n}\n\nexport function resolveExplorerLayoutMode(cols: number): ExplorerLayoutMode {\n if (cols < 40) {\n return \"too-narrow\";\n }\n\n if (cols < 80) {\n return \"narrow-list-only\";\n }\n\n if (cols < 100) {\n return \"narrow-vertical\";\n }\n\n if (cols < 120) {\n return \"medium\";\n }\n\n return \"wide\";\n}\n\nfunction normalizeSize(value: number): number {\n if (!Number.isFinite(value)) {\n return 0;\n }\n\n return Math.max(0, Math.floor(value));\n}\n", "import { color } from \"../components/color.js\";\nimport * as clack from \"@clack/prompts\";\nimport { resolveOutputFormat } from \"../internal/output-format.js\";\nimport { stripAnsi } from \"../internal/strip-ansi.js\";\nimport { cancel, isCancel } from \"./primitives/cancel.js\";\nimport { intro } from \"./primitives/intro.js\";\nimport { log } from \"./primitives/log.js\";\nimport { note } from \"./primitives/note.js\";\nimport { outro } from \"./primitives/outro.js\";\nimport { spinner } from \"./primitives/spinner.js\";\n\nexport { isCancel, cancel, log };\nexport { intro, outro, note, spinner };\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 process.stdout.write(`${color.gray(\"\u250C\")} ${title}\\n`);\n}\n\nexport interface SelectOptions<Value> {\n message: string;\n options: Array<{ value: Value; label: string; hint?: string }>;\n initialValue?: Value;\n}\n\nexport async function select<Value>(opts: SelectOptions<Value>): Promise<Value | symbol> {\n return clack.select(opts as Parameters<typeof clack.select<Value>>[0]);\n}\n\nexport type MultiselectOptions<Value> = Parameters<typeof clack.multiselect<Value>>[0];\n\n/**\n * Prompts the user to select one or more values from a list.\n *\n * Returns the selected values as an array, or a cancellation symbol if the\n * user cancels. Use `isCancel` to check for cancellation.\n *\n * @example\n * const result = await multiselect({\n * message: \"Pick workflows to run\",\n * options: [{ label: \"Fix Vulnerabilities\", value: \"fix-vulnerabilities\" }],\n * required: true\n * });\n * if (!isCancel(result)) {\n * // result is Value[]\n * }\n */\nexport async function multiselect<Value>(\n opts: MultiselectOptions<Value>\n): Promise<Value[] | symbol> {\n return clack.multiselect(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 as Parameters<typeof clack.text>[0]);\n}\n\nexport interface ConfirmOptions {\n message: string;\n initialValue?: boolean;\n}\n\nexport async function confirm(opts: ConfirmOptions): Promise<boolean | symbol> {\n return clack.confirm(opts as Parameters<typeof clack.confirm>[0]);\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 (isCancel(result)) {\n cancel(\"Operation cancelled.\");\n throw new PromptCancelledError();\n }\n return result === true;\n}\n\nexport interface PasswordOptions {\n message: string;\n validate?: (value: string) => string | undefined;\n}\n\nexport async function password(opts: PasswordOptions): Promise<string | symbol> {\n return clack.password(opts as Parameters<typeof clack.password>[0]);\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 interface WithSpinnerOptions<T> {\n message: string | (() => 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 const readMessage = () => (typeof message === \"function\" ? message() : message);\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(readMessage());\n\n const timer = setInterval(() => {\n s.message(`${readMessage()} [${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 { color } from \"../../components/color.js\";\nexport { isCancel } from \"@clack/prompts\";\nimport { resolveOutputFormat } from \"../../internal/output-format.js\";\n\nexport function cancel(msg = \"\"): void {\n if (resolveOutputFormat() !== \"terminal\") {\n return;\n }\n\n process.stdout.write(`${color.gray(\"\u2514\")} ${color.red(msg)}\\n\\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 { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\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 = parseYaml(content);\n if (parsed === null || parsed === undefined) {\n return {};\n }\n if (!isConfigObject(parsed)) {\n throw new Error(\"Expected YAML object.\");\n }\n return parsed;\n}\n\nfunction serialize(obj: ConfigObject): string {\n const serialized = stringifyYaml(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 if (isConfigObject(pattern) && Object.keys(pattern).length === 0) {\n delete result[key];\n changed = true;\n continue;\n }\n\n if (isConfigObject(pattern) && isConfigObject(current)) {\n const { changed: childChanged, result: childResult } = prune(current, pattern);\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 yamlFormat: ConfigFormat = {\n parse,\n serialize,\n merge,\n prune\n};\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 InferConfig,\n InferSchemaField,\n JsonSchemaField,\n SchemaField,\n ScopeSchema\n} from \"./types.js\";\n\nexport function resolveScope<S extends ScopeSchema>(\n schema: S,\n fileValues?: Record<string, unknown>,\n env: Record<string, string | undefined> = {}\n): InferConfig<S> {\n const resolved = {} as InferConfig<S>;\n\n for (const key of Object.keys(schema) as Array<keyof S & string>) {\n const field = schema[key];\n const envValue = resolveEnvValue(field, env, key);\n const fileValue = resolveFileValue(field, fileValues?.[key], key);\n resolved[key] = (envValue ?? fileValue ?? field.default) as InferConfig<S>[typeof key];\n }\n\n return resolved;\n}\n\nfunction resolveEnvValue<T extends SchemaField>(\n field: T,\n env: Record<string, string | undefined>,\n key: string\n): InferSchemaField<T> | undefined {\n if (!field.env) {\n return undefined;\n }\n\n const raw = env[field.env];\n if (raw === undefined) {\n return undefined;\n }\n\n return coerceValue(field, raw, key);\n}\n\nfunction resolveFileValue<T extends SchemaField>(\n field: T,\n value: unknown,\n key: string\n): InferSchemaField<T> | undefined {\n return coerceValue(field, value, key);\n}\n\nfunction coerceValue<T extends SchemaField>(\n field: T,\n value: unknown,\n key: string\n): InferSchemaField<T> | undefined {\n switch (field.type) {\n case \"string\":\n return typeof value === \"string\" ? value as InferSchemaField<T> : undefined;\n case \"number\":\n return coerceNumber(value) as InferSchemaField<T> | undefined;\n case \"boolean\":\n return coerceBoolean(value) as InferSchemaField<T> | undefined;\n case \"json\":\n return coerceJson(field, value, key) as InferSchemaField<T> | undefined;\n }\n}\n\nfunction coerceNumber(value: unknown): number | undefined {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n\n if (typeof value !== \"string\" || value.length === 0) {\n return undefined;\n }\n\n const parsed = Number(value);\n return Number.isNaN(parsed) ? undefined : parsed;\n}\n\nfunction coerceBoolean(value: unknown): boolean | undefined {\n if (typeof value === \"boolean\") {\n return value;\n }\n\n if (value === \"true\" || value === \"1\") {\n return true;\n }\n\n if (value === \"false\" || value === \"0\") {\n return false;\n }\n\n return undefined;\n}\n\nfunction coerceJson<T>(\n field: JsonSchemaField<T>,\n value: unknown,\n key: string\n): T | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n const parsedValue = parseJsonValue(value, key);\n try {\n return field.parse(parsedValue);\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Invalid JSON value.\";\n throw new Error(`Invalid config value for \"${key}\": ${message}`);\n }\n}\n\nfunction parseJsonValue(value: unknown, key: string): unknown {\n if (typeof value !== \"string\") {\n return value;\n }\n\n try {\n return JSON.parse(value);\n } catch {\n throw new Error(`Invalid config value for \"${key}\": expected valid JSON.`);\n }\n}\n", "import type { ConfigDocument } from \"./types.js\";\n\nexport function deepMergeDocuments(base: ConfigDocument, override: ConfigDocument): ConfigDocument {\n const merged: ConfigDocument = {};\n const scopes = new Set([...Object.keys(base), ...Object.keys(override)]);\n\n for (const scope of scopes) {\n const baseScope = base[scope] ?? {};\n const overrideScope = override[scope] ?? {};\n const nextScope = mergeScope(scope, baseScope, overrideScope);\n\n if (Object.keys(nextScope).length > 0) {\n merged[scope] = nextScope;\n }\n }\n\n return merged;\n}\n\nfunction mergeScope(\n scope: string,\n baseScope: Record<string, unknown>,\n overrideScope: Record<string, unknown>\n): Record<string, unknown> {\n if (scope === \"runtime\") {\n return mergeRuntimeScope(baseScope, overrideScope);\n }\n\n const scopeEntries = Object.entries(overrideScope).filter(([, value]) => value !== undefined);\n return {\n ...baseScope,\n ...Object.fromEntries(scopeEntries)\n };\n}\n\nfunction mergeRuntimeScope(\n baseScope: Record<string, unknown>,\n overrideScope: Record<string, unknown>,\n path: string[] = []\n): Record<string, unknown> {\n const merged: Record<string, unknown> = {};\n const keys = new Set([...Object.keys(baseScope), ...Object.keys(overrideScope)]);\n\n for (const key of keys) {\n const baseValue = baseScope[key];\n const overrideValue = overrideScope[key];\n if (overrideValue === undefined) {\n if (baseValue !== undefined) {\n merged[key] = baseValue;\n }\n continue;\n }\n\n if (\n isRuntimeConcatenativeArray([...path, key]) &&\n Array.isArray(baseValue) &&\n Array.isArray(overrideValue)\n ) {\n merged[key] = [...baseValue, ...overrideValue];\n continue;\n }\n\n if (isRecord(baseValue) && isRecord(overrideValue)) {\n merged[key] = mergeRuntimeScope(baseValue, overrideValue, [...path, key]);\n continue;\n }\n\n merged[key] = overrideValue;\n }\n\n return merged;\n}\n\nfunction isRuntimeConcatenativeArray(path: string[]): boolean {\n return path.join(\".\") === \"mounts\" || path.join(\".\") === \"runner.workspace.exclude\";\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === \"object\" && !Array.isArray(value));\n}\n", "import path from \"node:path\";\nimport { pathExists, type FileSystem } from \"@poe-code/config-mutations\";\nimport type { ConfigDocument, ConfigFieldType, ScopeDefinition, ScopeSchema } from \"./types.js\";\n\nexport interface EnvOverrides {\n entries: string[];\n document: ConfigDocument;\n}\n\nexport interface EditTargetOptions {\n global?: boolean;\n project?: boolean;\n}\n\nexport function collectEnvOverrides(\n scopes: ReadonlyArray<ScopeDefinition<ScopeSchema>>,\n env: Record<string, string | undefined>\n): EnvOverrides {\n const document: ConfigDocument = {};\n const entries: string[] = [];\n\n for (const definition of scopes) {\n const scopeResult = collectScopeEnvOverrides(definition, env);\n if (Object.keys(scopeResult.values).length === 0) {\n continue;\n }\n\n document[definition.scope] = scopeResult.values;\n entries.push(...scopeResult.entries);\n }\n\n return { entries, document };\n}\n\nexport async function resolveEditTarget(\n fs: FileSystem,\n configPath: string,\n projectConfigPath: string,\n options: EditTargetOptions\n): Promise<string> {\n if (options.global && options.project) {\n throw new Error(\"Choose either --global or --project, not both.\");\n }\n\n if (options.global) {\n return configPath;\n }\n if (options.project) {\n return projectConfigPath;\n }\n if (await pathExists(fs, projectConfigPath)) {\n return projectConfigPath;\n }\n return configPath;\n}\n\nexport async function initProjectConfig(\n fs: FileSystem,\n targetPath: string\n): Promise<\"created\" | \"already-exists\"> {\n if (await pathExists(fs, targetPath)) {\n return \"already-exists\";\n }\n\n await fs.mkdir(path.dirname(targetPath), { recursive: true });\n await fs.writeFile(targetPath, EMPTY_DOCUMENT, { encoding: \"utf8\" });\n return \"created\";\n}\n\nfunction collectScopeEnvOverrides<S extends ScopeSchema>(\n definition: ScopeDefinition<S>,\n env: Record<string, string | undefined>\n): {\n entries: string[];\n values: Record<string, unknown>;\n} {\n const entries: string[] = [];\n const values: Record<string, unknown> = {};\n\n for (const [key, field] of Object.entries(definition.schema) as Array<\n [keyof S & string, S[keyof S & string]]\n >) {\n if (!field.env) {\n continue;\n }\n\n const value = coerceEnvValue(field.type, env[field.env]);\n if (value === undefined) {\n continue;\n }\n\n values[key] = value;\n entries.push(` ${field.env} = ${String(value)}`);\n }\n\n return { entries, values };\n}\n\nfunction coerceEnvValue(\n type: ConfigFieldType,\n raw: string | undefined\n): unknown {\n if (raw === undefined) {\n return undefined;\n }\n\n if (type === \"string\") {\n return raw;\n }\n if (type === \"number\") {\n if (raw.length === 0) {\n return undefined;\n }\n const parsed = Number(raw);\n return Number.isNaN(parsed) ? undefined : parsed;\n }\n if (type === \"json\") {\n try {\n return JSON.parse(raw);\n } catch {\n return undefined;\n }\n }\n if (raw === \"true\" || raw === \"1\") {\n return true;\n }\n if (raw === \"false\" || raw === \"0\") {\n return false;\n }\n return undefined;\n}\n\nconst EMPTY_DOCUMENT = `${JSON.stringify({}, null, 2)}\\n`;\n", "import path from \"node:path\";\nimport { allAgents, resolveAgentId, type AgentDefinition } from \"@poe-code/agent-defs\";\nimport { createTimestamp, readFileIfExists, type FileSystem } from \"@poe-code/config-mutations\";\nimport {\n anthropicProvider,\n cloudflareProvider,\n poeProvider,\n ProviderRegistry,\n resolveApiShape,\n type ApiShapeId\n} from \"@poe-code/providers\";\nimport { readDocument, readMergedDocument, writeScope } from \"./store.js\";\n\nexport interface ConfigStoreOptions {\n fs: FileSystem;\n filePath: string;\n projectFilePath?: string;\n providerRegistry?: Pick<ProviderRegistry, \"get\">;\n warn?: (message: string) => void;\n}\n\nexport interface ConfiguredServiceMetadata {\n provider: string;\n apiShape?: ApiShapeId;\n files: string[];\n}\n\ninterface LegacyConfigDocument {\n apiKey?: string;\n configured_services?: Record<string, ConfiguredServiceMetadata>;\n}\n\nexport interface SaveConfiguredServiceOptions extends ConfigStoreOptions {\n service: string;\n metadata: ConfiguredServiceMetadata;\n}\n\nexport interface UnconfigureServiceOptions extends ConfigStoreOptions {\n service: string;\n}\n\nexport async function loadConfiguredServices(\n options: ConfigStoreOptions\n): Promise<Record<string, ConfiguredServiceMetadata>> {\n const { fs, filePath, projectFilePath } = options;\n await migrateLegacyCredentialsIfNeeded(fs, filePath);\n await migrateConfiguredServicesIfNeeded(options, filePath);\n if (projectFilePath && projectFilePath !== filePath) {\n await migrateConfiguredServicesIfNeeded(options, projectFilePath);\n }\n\n const document = await readMergedDocument(fs, filePath, projectFilePath);\n return normalizeConfiguredServices(document[configuredServicesScope]);\n}\n\nexport async function saveConfiguredService(options: SaveConfiguredServiceOptions): Promise<void> {\n const { fs, filePath, service, metadata } = options;\n await migrateLegacyCredentialsIfNeeded(fs, filePath);\n await migrateConfiguredServicesIfNeeded(options, filePath);\n\n const document = await readDocument(fs, filePath);\n const services = normalizeConfiguredServices(document[configuredServicesScope]);\n const registry = options.providerRegistry ?? defaultProviderRegistry;\n services[service] = normalizeConfiguredServiceMetadata({\n ...metadata,\n apiShape:\n metadata.apiShape ??\n deriveApiShape({\n service,\n provider: metadata.provider,\n registry,\n warn: options.warn ?? console.warn\n })\n });\n\n await writeScope(fs, filePath, configuredServicesScope, services);\n}\n\nexport async function unconfigureService(options: UnconfigureServiceOptions): Promise<boolean> {\n const { fs, filePath, service } = options;\n await migrateLegacyCredentialsIfNeeded(fs, filePath);\n\n const document = await readDocument(fs, filePath);\n const services = normalizeConfiguredServices(document[configuredServicesScope]);\n\n if (!(service in services)) {\n return false;\n }\n\n delete services[service];\n await writeScope(fs, filePath, configuredServicesScope, services);\n return true;\n}\n\nasync function migrateConfiguredServicesIfNeeded(\n options: ConfigStoreOptions,\n filePath: string\n): Promise<void> {\n const document = await readDocument(options.fs, filePath);\n const rawServices = document[configuredServicesScope];\n if (!isRecord(rawServices)) {\n return;\n }\n\n let needsMigration = false;\n const migrated: Record<string, unknown> = {};\n const registry = options.providerRegistry ?? defaultProviderRegistry;\n\n for (const [service, entry] of Object.entries(rawServices)) {\n if (!isRecord(entry)) {\n continue;\n }\n\n const provider = typeof entry.provider === \"string\" ? entry.provider : \"poe\";\n const normalizedEntry: Record<string, unknown> = {\n ...entry,\n provider\n };\n\n if (typeof entry.provider !== \"string\") {\n needsMigration = true;\n }\n\n if (typeof entry.apiShape !== \"string\") {\n const apiShape = deriveApiShape({\n service,\n provider,\n registry,\n warn: options.warn ?? console.warn\n });\n if (apiShape) {\n normalizedEntry.apiShape = apiShape;\n needsMigration = true;\n }\n }\n\n migrated[service] = normalizedEntry;\n }\n\n if (needsMigration) {\n await writeScope(options.fs, filePath, configuredServicesScope, migrated);\n }\n}\n\nfunction deriveApiShape(input: {\n service: string;\n provider: string;\n registry: Pick<ProviderRegistry, \"get\">;\n warn: (message: string) => void;\n}): ApiShapeId | undefined {\n const provider = input.registry.get(input.provider);\n const agent = resolveConfiguredAgent(input.service);\n const apiShape = provider && agent ? resolveApiShape(provider, agent) : undefined;\n if (!apiShape) {\n input.warn(\n `Unable to derive apiShape for configured service \"${input.service}\" with provider \"${input.provider}\".`\n );\n }\n return apiShape;\n}\n\nfunction resolveConfiguredAgent(service: string): AgentDefinition | undefined {\n const agentId = resolveAgentId(service);\n return agentId ? agentsById.get(agentId) : undefined;\n}\n\nfunction normalizeConfiguredServices(value: unknown): Record<string, ConfiguredServiceMetadata> {\n if (!isRecord(value)) {\n return {};\n }\n\n const entries: Record<string, ConfiguredServiceMetadata> = {};\n for (const [key, entry] of Object.entries(value)) {\n if (!isRecord(entry)) {\n continue;\n }\n\n entries[key] = normalizeConfiguredServiceMetadata({\n provider: typeof entry.provider === \"string\" ? entry.provider : \"poe\",\n apiShape: typeof entry.apiShape === \"string\" ? (entry.apiShape as ApiShapeId) : undefined,\n files: Array.isArray(entry.files) ? entry.files : []\n });\n }\n\n return entries;\n}\n\nfunction normalizeConfiguredServiceMetadata(\n metadata: ConfiguredServiceMetadata\n): ConfiguredServiceMetadata {\n const seen = new Set<string>();\n const files: string[] = [];\n\n for (const entry of metadata.files ?? []) {\n if (typeof entry !== \"string\" || entry.length === 0) {\n continue;\n }\n if (!seen.has(entry)) {\n files.push(entry);\n seen.add(entry);\n }\n }\n\n return omitUndefined({\n provider: metadata.provider,\n apiShape: metadata.apiShape,\n files\n });\n}\n\nasync function migrateLegacyCredentialsIfNeeded(fs: FileSystem, filePath: string): Promise<void> {\n const currentRaw = await readFileIfExists(fs, filePath);\n if (currentRaw !== null) {\n return;\n }\n\n await migrateLegacyCredentialsFile(fs, filePath);\n}\n\nasync function migrateLegacyCredentialsFile(fs: FileSystem, configPath: string): Promise<void> {\n const legacyPath = path.join(path.dirname(configPath), \"credentials.json\");\n const raw = await readFileIfExists(fs, legacyPath);\n if (raw === null) {\n return;\n }\n\n let legacyDocument: LegacyConfigDocument;\n try {\n legacyDocument = normalizeLegacyConfigDocument(JSON.parse(raw));\n } catch (error) {\n if (error instanceof SyntaxError) {\n await recoverInvalidConfig(fs, legacyPath, raw);\n await fs.unlink(legacyPath);\n return;\n }\n throw error;\n }\n\n if (legacyDocument.configured_services) {\n await writeScope(fs, configPath, configuredServicesScope, legacyDocument.configured_services);\n }\n\n if (legacyDocument.apiKey) {\n await writeScope(fs, configPath, CORE_SCOPE, {\n apiKey: legacyDocument.apiKey\n });\n }\n\n await fs.unlink(legacyPath);\n}\n\nfunction normalizeLegacyConfigDocument(value: unknown): LegacyConfigDocument {\n if (!isRecord(value)) {\n return {};\n }\n\n const document: LegacyConfigDocument = {};\n if (typeof value.apiKey === \"string\" && value.apiKey.length > 0) {\n document.apiKey = value.apiKey;\n }\n\n const services = normalizeConfiguredServices(value.configured_services);\n if (Object.keys(services).length > 0) {\n document.configured_services = services;\n }\n\n return document;\n}\n\nasync function recoverInvalidConfig(\n fs: FileSystem,\n filePath: string,\n content: string\n): Promise<void> {\n const backupPath = createInvalidBackupPath(filePath);\n await fs.writeFile(backupPath, content, { encoding: \"utf8\" });\n await fs.writeFile(filePath, EMPTY_DOCUMENT, { encoding: \"utf8\" });\n}\n\nfunction createInvalidBackupPath(filePath: string): string {\n const directory = path.dirname(filePath);\n const baseName = path.basename(filePath);\n return path.join(directory, `${baseName}.invalid-${createTimestamp()}.json`);\n}\n\nfunction omitUndefined<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(Object.entries(value).filter(([, entry]) => entry !== undefined)) as T;\n}\n\nfunction isRecord(value: unknown): value is Record<string, any> {\n return Boolean(value && typeof value === \"object\" && !Array.isArray(value));\n}\n\nconst agentsById = new Map(allAgents.map((agent) => [agent.id, agent]));\nconst defaultProviderRegistry = new ProviderRegistry([\n poeProvider,\n anthropicProvider,\n cloudflareProvider\n]);\nconst CORE_SCOPE = \"core\";\nconst configuredServicesScope = \"configured_services\";\nconst EMPTY_DOCUMENT = `${JSON.stringify({}, null, 2)}\\n`;\n", "import type { ApiKeyAuth, AuthProvider } from \"../types.js\";\nimport type { AuthStrategy, AuthStrategyContext } from \"./types.js\";\n\nexport interface ApiKeyLoginOptions {\n apiKey?: string;\n}\n\nfunction requireApiKeyAuth(provider: AuthProvider): ApiKeyAuth {\n if (provider.auth.kind !== \"api-key\") {\n throw new Error(\n `Provider ${provider.id} does not use api-key auth (got ${provider.auth.kind}).`\n );\n }\n return provider.auth;\n}\n\nasync function acquireApiKey(\n provider: AuthProvider,\n options: ApiKeyLoginOptions,\n context: AuthStrategyContext\n): Promise<string> {\n const auth = requireApiKeyAuth(provider);\n const candidate =\n options.apiKey ?? (await context.promptForSecret?.(auth.prompt));\n const trimmed = candidate?.trim();\n if (!trimmed) {\n throw new Error(\n `No API key available for provider \"${provider.id}\". Pass --api-key or run interactively.`\n );\n }\n return trimmed;\n}\n\nexport const apiKeyAuthStrategy: AuthStrategy<ApiKeyLoginOptions> = {\n async login(provider, options, context) {\n const apiKey = await acquireApiKey(provider, options, context);\n await context.secretStore.set(apiKey);\n return apiKey;\n },\n\n async logout(_provider, context) {\n await context.secretStore.delete();\n },\n\n async isLoggedIn(_provider, context) {\n const value = await context.secretStore.get();\n return typeof value === \"string\" && value.trim().length > 0;\n },\n\n async resolveCredential(provider, context) {\n requireApiKeyAuth(provider);\n const value = await context.secretStore.get();\n if (!value || value.trim().length === 0) {\n throw new Error(\n `No stored credential for provider \"${provider.id}\". Run \\`poe-code provider login ${provider.id}\\`.`\n );\n }\n return value;\n }\n};\n", "import type { ApiShapeId, AuthProvider } from \"./types.js\";\n\nexport function resolveApiShape(\n provider: AuthProvider,\n agent: { apiShapes?: readonly ApiShapeId[] }\n): ApiShapeId | undefined {\n if (!provider.apiShapes || !agent.apiShapes) {\n return undefined;\n }\n for (const shapeId of agent.apiShapes) {\n if (provider.apiShapes.some((shape) => shape.id === shapeId)) {\n return shapeId;\n }\n }\n return undefined;\n}\n", "import type { ApiShapeId, AuthProvider } from \"./types.js\";\nimport type { SecretStore } from \"auth-store\";\nimport { apiKeyAuthStrategy } from \"./auth/api-key.js\";\nimport type { ApiKeyLoginOptions } from \"./auth/api-key.js\";\nimport type { PromptForSecret } from \"./auth/types.js\";\nimport { resolveApiShape } from \"./compatibility.js\";\n\nexport interface LoginContext {\n promptForSecret?: PromptForSecret;\n envVars?: Record<string, string | undefined>;\n resolvePreferredLogin?: (input: {\n provider: AuthProvider;\n apiKey?: string;\n envValue?: string;\n }) => Promise<string>;\n}\n\nexport type ProviderStoreFactory = (providerId: string) => SecretStore;\n\nexport interface ProviderRegistryOptions {\n envVars?: Record<string, string | undefined>;\n}\n\nexport interface ProviderAgent {\n id: string;\n apiShapes?: readonly ApiShapeId[];\n}\n\nexport class ProviderRegistry {\n private readonly providers: readonly AuthProvider[];\n private readonly byId: ReadonlyMap<string, AuthProvider>;\n private readonly storeFactory?: ProviderStoreFactory;\n private readonly envVars: Record<string, string | undefined>;\n\n constructor(\n providers: readonly AuthProvider[],\n storeFactory?: ProviderStoreFactory,\n options?: ProviderRegistryOptions\n ) {\n const byId = new Map<string, AuthProvider>();\n for (const provider of providers) {\n if (byId.has(provider.id)) {\n throw new Error(`Duplicate provider id: ${provider.id}`);\n }\n byId.set(provider.id, provider);\n }\n this.providers = providers;\n this.byId = byId;\n this.storeFactory = storeFactory;\n this.envVars = options?.envVars ?? {};\n }\n\n list(): readonly AuthProvider[] {\n return this.providers;\n }\n\n get(id: string): AuthProvider | undefined {\n return this.byId.get(id);\n }\n\n forAgent(agent: ProviderAgent): readonly AuthProvider[] {\n return this.providers.filter((provider) => {\n return resolveApiShape(provider, agent) !== undefined;\n });\n }\n\n async isLoggedIn(id: string): Promise<boolean> {\n const provider = this.requireProvider(id);\n if (provider.auth.kind === \"api-key\") {\n const envValue = this.envVars[provider.auth.envVar];\n if (typeof envValue === \"string\" && envValue.trim().length > 0) {\n return true;\n }\n }\n const store = this.requireStore(id);\n const credential = await store.get();\n return credential !== null;\n }\n\n async login(id: string, options: ApiKeyLoginOptions, context?: LoginContext): Promise<void> {\n const provider = this.requireProvider(id);\n const store = this.requireStore(id);\n if (provider.auth.kind !== \"api-key\") {\n throw new Error(`Provider \"${id}\" does not use api-key auth.`);\n }\n const auth = provider.auth;\n const envApiKey = context?.envVars?.[auth.envVar];\n const resolvedApiKey =\n options.apiKey ??\n (typeof envApiKey === \"string\" && envApiKey.trim() ? envApiKey : undefined);\n if (auth.preferredLogin && context?.resolvePreferredLogin) {\n const apiKey = await context.resolvePreferredLogin({\n provider,\n apiKey: options.apiKey,\n envValue: typeof envApiKey === \"string\" ? envApiKey : undefined\n });\n await store.set(apiKey);\n return;\n }\n await apiKeyAuthStrategy.login(\n provider,\n { apiKey: resolvedApiKey },\n { secretStore: store, promptForSecret: context?.promptForSecret }\n );\n }\n\n async resolveCredential(\n id: string,\n options: ApiKeyLoginOptions = {},\n context?: Pick<LoginContext, \"envVars\">\n ): Promise<string> {\n const provider = this.requireProvider(id);\n if (provider.auth.kind !== \"api-key\") {\n throw new Error(`Provider \"${id}\" does not use api-key auth.`);\n }\n\n if (options.apiKey !== undefined) {\n return normalizeRequiredCredential(provider.id, options.apiKey);\n }\n\n const envVars = context?.envVars ?? this.envVars;\n const envApiKey = envVars[provider.auth.envVar];\n if (typeof envApiKey === \"string\" && envApiKey.trim().length > 0) {\n return envApiKey.trim();\n }\n\n const store = this.requireStore(id);\n return apiKeyAuthStrategy.resolveCredential(provider, { secretStore: store });\n }\n\n async logout(id: string): Promise<void> {\n this.requireProvider(id);\n const store = this.requireStore(id);\n await store.delete();\n }\n\n private requireProvider(id: string): AuthProvider {\n const provider = this.byId.get(id);\n if (!provider) {\n throw new Error(`Unknown provider: \"${id}\".`);\n }\n return provider;\n }\n\n private requireStore(id: string): SecretStore {\n if (!this.storeFactory) {\n throw new Error(`No store factory configured for ProviderRegistry.`);\n }\n return this.storeFactory(id);\n }\n}\n\nfunction normalizeRequiredCredential(providerId: string, value: string): string {\n const trimmed = value.trim();\n if (trimmed.length === 0) {\n throw new Error(`No API key available for provider \"${providerId}\".`);\n }\n return trimmed;\n}\n", "import type { AuthProvider } from \"../types.js\";\n\nexport const POE_PROVIDER_ID = \"poe\" as const;\n\nexport const poeProvider: AuthProvider = {\n id: POE_PROVIDER_ID,\n label: \"Poe\",\n summary: \"Route AI coding agents through Poe's API.\",\n baseUrl: \"https://api.poe.com\",\n agentBaseUrl: \"https://api.poe.com\",\n auth: {\n kind: \"api-key\",\n envVar: \"POE_API_KEY\",\n storageKey: \"provider:poe\",\n prompt: { title: \"Poe API key\" },\n preferredLogin: \"oauth\"\n },\n env: {\n ANTHROPIC_CUSTOM_HEADERS: {\n kind: \"providerCredential\",\n prefix: \"Authorization: Bearer \"\n }\n },\n apiShapes: [\n {\n id: \"openai-chat-completions\",\n defaultBaseUrl: \"https://api.poe.com/v1\"\n },\n {\n id: \"openai-responses\",\n defaultBaseUrl: \"https://api.poe.com/v1\"\n },\n {\n id: \"anthropic-messages\",\n defaultBaseUrl: \"https://api.poe.com/anthropic\"\n }\n ]\n};\n", "import type { AuthProvider } from \"../types.js\";\n\nexport const anthropicProvider: AuthProvider = {\n id: \"anthropic\",\n label: \"Anthropic\",\n summary: \"Route AI coding agents through Anthropic's API.\",\n baseUrl: \"https://api.anthropic.com\",\n auth: {\n kind: \"api-key\",\n envVar: \"ANTHROPIC_API_KEY\",\n storageKey: \"provider:anthropic\",\n prompt: { title: \"Anthropic API key\" }\n },\n env: {\n ANTHROPIC_API_KEY: { kind: \"providerCredential\" }\n },\n apiShapes: [\n {\n id: \"anthropic-messages\",\n defaultBaseUrl: \"https://api.anthropic.com\"\n }\n ]\n};\n", "import type { AuthProvider } from \"../types.js\";\n\nexport const cloudflareProvider: AuthProvider = {\n id: \"cloudflare\",\n label: \"Cloudflare AI Gateway\",\n summary: \"Route coding agents through Cloudflare AI Gateway.\",\n baseUrlEnvVar: \"CF_AIG_BASE_URL\",\n requiresBaseUrl: true,\n modelInput: { kind: \"freeform\" },\n auth: {\n kind: \"api-key\",\n envVar: \"CF_AIG_TOKEN\",\n storageKey: \"provider:cloudflare\",\n prompt: { title: \"Cloudflare AI Gateway token\" }\n },\n env: {\n ANTHROPIC_CUSTOM_HEADERS: {\n kind: \"providerCredential\",\n prefix: \"Authorization: Bearer \"\n }\n },\n apiShapes: [\n {\n id: \"openai-chat-completions\",\n baseUrlPath: \"compat\"\n },\n {\n id: \"openai-responses\",\n baseUrlPath: \"openai\"\n },\n {\n id: \"anthropic-messages\",\n baseUrlPath: \"anthropic\"\n },\n {\n id: \"google-generations\",\n baseUrlPath: \"google-ai-studio\"\n }\n ]\n};\n", "import os from \"node:os\";\nimport { createJobRegistry, type JobRegistry } from \"./jobs.js\";\nimport { createTemplateRegistry, type TemplateRegistry } from \"./templates.js\";\nimport type { StateFileSystem } from \"./fs.js\";\n\nexport interface StateManager {\n templates: TemplateRegistry;\n jobs: JobRegistry;\n}\n\nexport async function loadStateManager(homeDir: string = os.homedir()): Promise<StateManager> {\n return {\n templates: createTemplateRegistry(homeDir),\n jobs: createJobRegistry(homeDir)\n };\n}\n\nexport function createStateManager(homeDir: string, fs?: StateFileSystem): StateManager {\n return {\n templates: createTemplateRegistry(homeDir, fs),\n jobs: createJobRegistry(homeDir, fs)\n };\n}\n\nexport {\n createJobRegistry,\n type JobEntry,\n type JobListFilter,\n type JobRegistry,\n type JobStatus\n} from \"./jobs.js\";\nexport {\n createTemplateRegistry,\n type TemplateBackend,\n type TemplateEntry,\n type TemplateRegistry\n} from \"./templates.js\";\nexport type { StateFileSystem } from \"./fs.js\";\n", "import path from \"node:path\";\nimport { acquireFileLock, type FileLockFs } from \"@poe-code/file-lock\";\nimport { defaultStateFs, isNotFoundError, type StateFileSystem } from \"./fs.js\";\n\nexport type JobStatus = \"pending\" | \"running\" | \"exited\" | \"killed\" | \"lost\";\n\nexport interface JobEntry {\n id: string;\n env_id: string;\n env_kind: string;\n tool: string;\n argv: string[];\n cwd: string;\n started_at: string;\n status: JobStatus;\n exit_code?: number;\n exited_at?: string;\n log_file?: string;\n}\n\nexport interface JobListFilter {\n env_id?: string;\n env_kind?: string;\n tool?: string;\n status?: JobStatus;\n}\n\nexport interface JobRegistry {\n get(id: string): Promise<JobEntry | null>;\n put(entry: JobEntry): Promise<void>;\n update(id: string, patch: Partial<JobEntry>): Promise<JobEntry | null>;\n list(filter?: JobListFilter): Promise<JobEntry[]>;\n remove(id: string): Promise<void>;\n}\n\nexport function createJobRegistry(\n homeDir: string,\n fs: StateFileSystem = defaultStateFs\n): JobRegistry {\n const jobsDir = path.join(homeDir, \".poe-code\", \"state\", \"jobs\");\n\n function jobPath(id: string): string {\n assertSafeJobId(id);\n return path.join(jobsDir, `${id}.json`);\n }\n\n async function get(id: string): Promise<JobEntry | null> {\n try {\n return parseJobEntry(await fs.readFile(jobPath(id), \"utf8\"));\n } catch (error) {\n if (isNotFoundError(error)) {\n return null;\n }\n\n throw error;\n }\n }\n\n async function put(entry: JobEntry): Promise<void> {\n assertJobEntry(entry);\n const filePath = jobPath(entry.id);\n await fs.mkdir(jobsDir, { recursive: true });\n const release = await acquireFileLock(filePath, { fs: fs as unknown as FileLockFs });\n try {\n await writeJobAtomically(filePath, entry);\n } finally {\n await release();\n }\n }\n\n async function update(id: string, patch: Partial<JobEntry>): Promise<JobEntry | null> {\n const filePath = jobPath(id);\n await fs.mkdir(jobsDir, { recursive: true });\n const release = await acquireFileLock(filePath, { fs: fs as unknown as FileLockFs });\n try {\n const current = await get(id);\n if (current === null) {\n return null;\n }\n\n const updated = {\n ...current,\n ...patch,\n id: current.id\n };\n assertJobEntry(updated);\n await writeJobAtomically(filePath, updated);\n return updated;\n } finally {\n await release();\n }\n }\n\n async function list(filter: JobListFilter = {}): Promise<JobEntry[]> {\n let entries: string[];\n\n try {\n entries = await fs.readdir(jobsDir);\n } catch (error) {\n if (isNotFoundError(error)) {\n return [];\n }\n\n throw error;\n }\n\n const jobs: JobEntry[] = [];\n for (const entry of entries.sort()) {\n if (!entry.endsWith(\".json\")) {\n continue;\n }\n\n const filePath = path.join(jobsDir, entry);\n const stat = await fs.stat(filePath);\n if (!stat.isFile()) {\n continue;\n }\n\n const job = parseJobEntry(await fs.readFile(filePath, \"utf8\"));\n if (matchesFilter(job, filter)) {\n jobs.push(job);\n }\n }\n return jobs;\n }\n\n async function remove(id: string): Promise<void> {\n const filePath = jobPath(id);\n try {\n await fs.stat(jobsDir);\n } catch (error) {\n if (isNotFoundError(error)) {\n return;\n }\n\n throw error;\n }\n\n const release = await acquireFileLock(filePath, { fs: fs as unknown as FileLockFs });\n try {\n await fs.unlink(filePath);\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n } finally {\n await release();\n }\n }\n\n async function writeJobAtomically(filePath: string, entry: JobEntry): Promise<void> {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n const tempPath = `${filePath}.${process.pid}.${Date.now()}.${Math.random()\n .toString(36)\n .slice(2)}.tmp`;\n\n try {\n await fs.writeFile(tempPath, `${JSON.stringify(entry, null, 2)}\\n`, {\n encoding: \"utf8\"\n });\n await fs.rename(tempPath, filePath);\n } catch (error) {\n await removeTempFile(tempPath);\n throw error;\n }\n }\n\n async function removeTempFile(tempPath: string): Promise<void> {\n try {\n await fs.unlink(tempPath);\n } catch (error) {\n if (!isNotFoundError(error)) {\n throw error;\n }\n }\n }\n\n return {\n get,\n put,\n update,\n list,\n remove\n };\n}\n\nfunction assertSafeJobId(id: string): void {\n if (\n id.length === 0 ||\n id === \".\" ||\n id === \"..\" ||\n path.isAbsolute(id) ||\n id.includes(\"/\") ||\n id.includes(\"\\\\\") ||\n id.includes(\"\\0\")\n ) {\n throw new Error(\"Invalid job id.\");\n }\n}\n\nfunction assertJobEntry(entry: JobEntry): void {\n if (!isJobEntry(entry)) {\n throw new Error(\"Invalid job entry.\");\n }\n}\n\nfunction matchesFilter(job: JobEntry, filter: JobListFilter): boolean {\n return (\n (filter.env_id === undefined || job.env_id === filter.env_id) &&\n (filter.env_kind === undefined || job.env_kind === filter.env_kind) &&\n (filter.tool === undefined || job.tool === filter.tool) &&\n (filter.status === undefined || job.status === filter.status)\n );\n}\n\nfunction parseJobEntry(content: string): JobEntry {\n const parsed = JSON.parse(content) as unknown;\n if (!isJobEntry(parsed)) {\n throw new Error(\"Invalid job state file.\");\n }\n return parsed;\n}\n\nfunction isJobEntry(value: unknown): value is JobEntry {\n return (\n isRecord(value) &&\n typeof value.id === \"string\" &&\n typeof value.env_id === \"string\" &&\n typeof value.env_kind === \"string\" &&\n typeof value.tool === \"string\" &&\n Array.isArray(value.argv) &&\n value.argv.every((arg) => typeof arg === \"string\") &&\n typeof value.cwd === \"string\" &&\n typeof value.started_at === \"string\" &&\n isJobStatus(value.status) &&\n (value.exit_code === undefined || typeof value.exit_code === \"number\") &&\n (value.exited_at === undefined || typeof value.exited_at === \"string\") &&\n (value.log_file === undefined || typeof value.log_file === \"string\")\n );\n}\n\nfunction isJobStatus(value: unknown): value is JobStatus {\n return (\n value === \"pending\" ||\n value === \"running\" ||\n value === \"exited\" ||\n value === \"killed\" ||\n value === \"lost\"\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === \"object\" && !Array.isArray(value));\n}\n\nexport type { StateFileSystem } from \"./fs.js\";\n", "import * as nodeFs from \"node:fs/promises\";\n\nexport interface StateFileSystem {\n mkdir(path: string, options: { recursive: true }): Promise<unknown>;\n readFile(path: string, encoding: BufferEncoding): Promise<string>;\n writeFile(\n path: string,\n data: string,\n options?: BufferEncoding | { encoding?: BufferEncoding }\n ): Promise<void>;\n rename(oldPath: string, newPath: string): Promise<void>;\n readdir(path: string): Promise<string[]>;\n stat(path: string): Promise<{\n isFile(): boolean;\n mtimeMs: number;\n }>;\n unlink(path: string): Promise<void>;\n open(path: string, flags: string): Promise<{\n close(): Promise<void>;\n writeFile(\n data: string,\n options?: BufferEncoding | { encoding?: BufferEncoding }\n ): Promise<void>;\n }>;\n}\n\nexport const defaultStateFs = nodeFs as unknown as StateFileSystem;\n\nexport function isNotFoundError(error: unknown): boolean {\n return error instanceof Error && \"code\" in error && error.code === \"ENOENT\";\n}\n", "import path from \"node:path\";\nimport { acquireFileLock, type FileLockFs } from \"@poe-code/file-lock\";\nimport { defaultStateFs, isNotFoundError, type StateFileSystem } from \"./fs.js\";\n\nexport type TemplateBackend = \"docker\" | \"e2b\";\n\nexport interface TemplateEntry {\n hash: string;\n template_id?: string;\n image?: string;\n runtime_type: string;\n dockerfile_path: string;\n built_at: string;\n}\n\ntype TemplateState = Record<TemplateBackend, Record<string, TemplateEntry>>;\n\nexport interface TemplateRegistry {\n get(backend: TemplateBackend, hash: string): Promise<TemplateEntry | null>;\n put(backend: TemplateBackend, entry: TemplateEntry): Promise<void>;\n remove(backend: TemplateBackend, hash: string): Promise<void>;\n list(backend?: TemplateBackend): Promise<TemplateEntry[]>;\n}\n\nexport function createTemplateRegistry(\n homeDir: string,\n fs: StateFileSystem = defaultStateFs\n): TemplateRegistry {\n const filePath = path.join(homeDir, \".poe-code\", \"state\", \"templates.json\");\n\n async function readState(): Promise<TemplateState> {\n try {\n const raw = await fs.readFile(filePath, \"utf8\");\n return normalizeTemplateState(JSON.parse(raw));\n } catch (error) {\n if (isNotFoundError(error)) {\n return createEmptyState();\n }\n\n throw error;\n }\n }\n\n async function writeState(state: TemplateState): Promise<void> {\n await fs.writeFile(filePath, `${JSON.stringify(state, null, 2)}\\n`, {\n encoding: \"utf8\"\n });\n }\n\n async function updateState(mutator: (state: TemplateState) => void): Promise<void> {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n const release = await acquireFileLock(filePath, { fs: fs as unknown as FileLockFs });\n try {\n const state = await readState();\n mutator(state);\n await writeState(state);\n } finally {\n await release();\n }\n }\n\n async function get(backend: TemplateBackend, hash: string): Promise<TemplateEntry | null> {\n const state = await readState();\n return state[backend][hash] ?? null;\n }\n\n async function put(backend: TemplateBackend, entry: TemplateEntry): Promise<void> {\n await updateState((state) => {\n state[backend][entry.hash] = entry;\n });\n }\n\n async function remove(backend: TemplateBackend, hash: string): Promise<void> {\n await updateState((state) => {\n delete state[backend][hash];\n });\n }\n\n async function list(backend?: TemplateBackend): Promise<TemplateEntry[]> {\n const state = await readState();\n const entries =\n backend === undefined\n ? [...Object.values(state.docker), ...Object.values(state.e2b)]\n : Object.values(state[backend]);\n\n return entries.sort((left, right) => left.hash.localeCompare(right.hash));\n }\n\n return {\n get,\n put,\n remove,\n list\n };\n}\n\nfunction createEmptyState(): TemplateState {\n return {\n docker: {},\n e2b: {}\n };\n}\n\nfunction normalizeTemplateState(value: unknown): TemplateState {\n if (!isRecord(value)) {\n return createEmptyState();\n }\n\n return {\n docker: normalizeTemplateEntries(value.docker),\n e2b: normalizeTemplateEntries(value.e2b)\n };\n}\n\nfunction normalizeTemplateEntries(value: unknown): Record<string, TemplateEntry> {\n if (!isRecord(value)) {\n return {};\n }\n\n const entries: Record<string, TemplateEntry> = {};\n for (const [hash, entry] of Object.entries(value)) {\n if (isTemplateEntry(entry) && entry.hash === hash) {\n entries[hash] = entry;\n }\n }\n return entries;\n}\n\nfunction isTemplateEntry(value: unknown): value is TemplateEntry {\n return (\n isRecord(value) &&\n typeof value.hash === \"string\" &&\n typeof value.runtime_type === \"string\" &&\n typeof value.dockerfile_path === \"string\" &&\n typeof value.built_at === \"string\" &&\n (value.template_id === undefined || typeof value.template_id === \"string\") &&\n (value.image === undefined || typeof value.image === \"string\")\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === \"object\" && !Array.isArray(value));\n}\n\nexport type { StateFileSystem } from \"./fs.js\";\n", "import type { RunnerScope, RuntimeConfig } from \"@poe-code/poe-code-config\";\nimport type { RunHandle, Runner, RunSpec } from \"@poe-code/process-runner\";\nimport type { StateManager } from \"@poe-code/poe-code-config\";\n\nexport type { RuntimeConfig } from \"@poe-code/poe-code-config\";\nexport type { RunHandle, RunSpec } from \"@poe-code/process-runner\";\n\nexport type ExecutionEnvType = \"host\" | \"docker\" | \"e2b\";\nexport type JobStatus = \"running\" | \"exited\" | \"killed\" | \"lost\";\n\nexport interface ExecutionEnvFactory {\n readonly type: ExecutionEnvType;\n readonly supportsDetach?: boolean;\n open(spec: OpenSpec): Promise<OpenedEnv>;\n attach(envId: string, context?: AttachedJobContext): Promise<OpenedEnv>;\n}\n\nexport interface OpenSpec {\n cwd: string;\n runtimeCwd?: string;\n runtime: RuntimeConfig;\n runner?: RunnerScope;\n state?: StateManager;\n hostRunner?: Runner;\n env: Record<string, string>;\n uploadIgnoreFiles: string[];\n jobLabel: { tool: string; argv: string[] };\n execution?: {\n wrapForLogTee?: boolean;\n stdin?: RunSpec[\"stdin\"];\n stdout?: RunSpec[\"stdout\"];\n stderr?: RunSpec[\"stderr\"];\n env?: RunSpec[\"env\"];\n tty?: boolean;\n input?: string | Buffer;\n captureOutput?: boolean;\n activityTimeoutMs?: number;\n onStdout?(chunk: string): void;\n onStderr?(chunk: string): void;\n };\n shellSpec?: RunSpec;\n}\n\nexport interface UploadResult {\n files: number;\n bytes: number;\n skipped: { path: string; bytes: number; reason: \"max_size\" }[];\n}\n\nexport interface DownloadResult {\n files: number;\n bytes: number;\n conflicts: { path: string; reason: \"local_modified\" }[];\n}\n\nexport interface LogChunk {\n byteOffset: number;\n data: string;\n}\n\nexport interface AttachedJobContext {\n jobId: string;\n tool: string;\n argv: string[];\n cwd: string;\n}\n\nexport interface OpenedEnv {\n readonly id: string;\n readonly job: JobHandle | null;\n uploadWorkspace(): Promise<UploadResult>;\n downloadWorkspace(opts: { conflictPolicy: \"refuse\" | \"overwrite\" }): Promise<DownloadResult>;\n exec(spec: RunSpec): RunHandle;\n detach(): Promise<JobHandle>;\n shell(): RunHandle;\n close(): Promise<void>;\n}\n\nexport interface JobHandle {\n readonly id: string;\n readonly envId: string;\n readonly tool: string;\n readonly argv: string[];\n status(): Promise<JobStatus>;\n stream(opts?: { sinceByte?: number; since?: Date }): AsyncIterable<LogChunk>;\n wait(): Promise<{ exitCode: number }>;\n kill(signal?: NodeJS.Signals): Promise<void>;\n}\n\nconst executionEnvFactories = new Map<ExecutionEnvType, ExecutionEnvFactory>();\n\nexport function registerExecutionEnvFactory(factory: ExecutionEnvFactory): void {\n executionEnvFactories.set(factory.type, factory);\n}\n\nexport function selectExecutionEnv(runtime: RuntimeConfig): ExecutionEnvFactory {\n return selectExecutionEnvFactory(runtime.type);\n}\n\nexport function selectExecutionEnvFactory(type: ExecutionEnvType): ExecutionEnvFactory {\n const factory = executionEnvFactories.get(type);\n if (factory === undefined) {\n throw new Error(\n `No execution environment factory registered for runtime type \"${type}\".`\n );\n }\n return factory;\n}\n", "import { createHash } from \"node:crypto\";\nimport { promises as nodeFs } from \"node:fs\";\nimport path from \"node:path\";\nimport type { RunnerScope } from \"@poe-code/poe-code-config\";\nimport type { DownloadResult, UploadResult } from \"./execution-env.js\";\n\nexport type { DownloadResult, UploadResult } from \"./execution-env.js\";\n\nexport interface WorkspaceTransferDirent {\n name: string;\n isFile(): boolean;\n isDirectory(): boolean;\n}\n\nexport interface WorkspaceTransferStats {\n isFile(): boolean;\n isDirectory(): boolean;\n size: number;\n}\n\nexport interface WorkspaceTransferFileSystem {\n mkdir(path: string, options?: { recursive?: boolean }): Promise<void>;\n readdir(path: string, options: { withFileTypes: true }): Promise<WorkspaceTransferDirent[]>;\n readFile(path: string): Promise<Buffer>;\n readFile(path: string, encoding: BufferEncoding): Promise<string>;\n writeFile(path: string, data: string | Buffer): Promise<void>;\n stat(path: string): Promise<WorkspaceTransferStats>;\n rm?(path: string, options?: { recursive?: boolean; force?: boolean }): Promise<void>;\n unlink?(path: string): Promise<void>;\n rmdir?(path: string): Promise<void>;\n}\n\nexport interface WorkspaceTransferEnv {\n cwd: string;\n uploadDir: string;\n workspaceDir?: string;\n fs?: WorkspaceTransferFileSystem;\n remoteFs?: WorkspaceTransferFileSystem;\n}\n\nexport interface WorkspaceTransferOptions {\n runner?: RunnerScope;\n uploadMaxFileMb?: number;\n workspaceExclude?: string[];\n warn?: (message: string) => void;\n}\n\nexport interface WorkspaceDownloadOptions {\n conflictPolicy: \"refuse\" | \"overwrite\";\n}\n\ninterface UploadedFileState {\n hash: string;\n uploaded: boolean;\n}\n\ninterface FileEntry {\n path: string;\n absolutePath: string;\n bytes: number;\n content: Buffer;\n}\n\ninterface IgnoreRule {\n pattern: string;\n negate: boolean;\n directoryOnly: boolean;\n anchored: boolean;\n}\n\nconst uploadState = new WeakMap<object, Map<string, UploadedFileState>>();\n\nexport async function uploadWorkspace(\n env: WorkspaceTransferEnv,\n opts: WorkspaceTransferOptions\n): Promise<UploadResult> {\n const localFs = env.fs ?? (nodeFs as unknown as WorkspaceTransferFileSystem);\n const remoteFs = env.remoteFs ?? localFs;\n const workspaceDir = env.workspaceDir ?? \"/workspace\";\n const maxBytes = (opts.uploadMaxFileMb ?? opts.runner?.upload_max_file_mb ?? 100) * 1024 * 1024;\n const warn = opts.warn ?? console.warn;\n const allFiles = await listFiles(localFs, env.cwd);\n const state = new Map<string, UploadedFileState>();\n const gitignore = await readIgnoreFile(localFs, env.cwd, \".gitignore\", true);\n const poeCodeIgnore = await readIgnoreFile(localFs, env.cwd, \".poe-code-ignore\", false);\n const workspaceExclude = parseIgnoreLines(\n [...(opts.runner?.workspace?.exclude ?? []), ...(opts.workspaceExclude ?? [])],\n false\n );\n const entries: FileEntry[] = [];\n const skipped: UploadResult[\"skipped\"] = [];\n\n for (const file of allFiles) {\n const content = await localFs.readFile(file.absolutePath);\n state.set(file.path, {\n hash: hashBuffer(content),\n uploaded: false\n });\n\n if (\n isIgnoredByGit(file.path, gitignore) ||\n isIgnoredAdditively(file.path, poeCodeIgnore) ||\n isIgnoredAdditively(file.path, workspaceExclude)\n ) {\n continue;\n }\n\n if (file.bytes > maxBytes) {\n skipped.push({ path: file.path, bytes: file.bytes, reason: \"max_size\" });\n warn(`Skipping ${file.path}: ${file.bytes} bytes exceeds upload_max_file_mb.`);\n continue;\n }\n\n entries.push({ ...file, content });\n state.set(file.path, {\n hash: hashBuffer(content),\n uploaded: true\n });\n }\n\n await removeTree(remoteFs, workspaceDir);\n await remoteFs.mkdir(workspaceDir, { recursive: true });\n await remoteFs.mkdir(env.uploadDir, { recursive: true });\n await remoteFs.writeFile(path.join(env.uploadDir, \"workspace.tar\"), createTar(entries));\n\n for (const entry of entries) {\n const remotePath = path.join(workspaceDir, entry.path);\n await remoteFs.mkdir(path.dirname(remotePath), { recursive: true });\n await remoteFs.writeFile(remotePath, entry.content);\n }\n\n uploadState.set(env, state);\n\n return {\n files: entries.length,\n bytes: entries.reduce((sum, entry) => sum + entry.bytes, 0),\n skipped\n };\n}\n\nexport async function downloadWorkspace(\n env: WorkspaceTransferEnv,\n opts: WorkspaceDownloadOptions\n): Promise<DownloadResult> {\n const localFs = env.fs ?? (nodeFs as unknown as WorkspaceTransferFileSystem);\n const remoteFs = env.remoteFs ?? localFs;\n const workspaceDir = env.workspaceDir ?? \"/workspace\";\n const state = uploadState.get(env) ?? new Map<string, UploadedFileState>();\n const remoteFiles = await listFilesIfExists(remoteFs, workspaceDir);\n const remotePaths = new Set(remoteFiles.map((file) => file.path));\n const conflicts: DownloadResult[\"conflicts\"] = [];\n let files = 0;\n let bytes = 0;\n\n for (const remoteFile of remoteFiles) {\n const remoteContent = await remoteFs.readFile(remoteFile.absolutePath);\n const localPath = path.join(env.cwd, remoteFile.path);\n const conflict = await isDownloadConflict(\n localFs,\n localPath,\n remoteFile.path,\n remoteContent,\n state\n );\n\n if (conflict && opts.conflictPolicy === \"refuse\") {\n conflicts.push({ path: remoteFile.path, reason: \"local_modified\" });\n continue;\n }\n\n await localFs.mkdir(path.dirname(localPath), { recursive: true });\n await localFs.writeFile(localPath, remoteContent);\n state.set(remoteFile.path, {\n hash: hashBuffer(remoteContent),\n uploaded: true\n });\n files += 1;\n bytes += remoteContent.length;\n }\n\n for (const [relativePath, fileState] of state) {\n if (!fileState.uploaded || remotePaths.has(relativePath)) {\n continue;\n }\n\n const localPath = path.join(env.cwd, relativePath);\n const localContent = await readFileIfExists(localFs, localPath);\n if (localContent === null) {\n continue;\n }\n\n if (opts.conflictPolicy === \"refuse\" && hashBuffer(localContent) !== fileState.hash) {\n conflicts.push({ path: relativePath, reason: \"local_modified\" });\n continue;\n }\n\n await removeFile(localFs, localPath);\n }\n\n return { files, bytes, conflicts };\n}\n\nasync function listFilesIfExists(\n fs: WorkspaceTransferFileSystem,\n root: string\n): Promise<Omit<FileEntry, \"content\">[]> {\n try {\n return await listFiles(fs, root);\n } catch (error) {\n if (isNotFoundError(error)) {\n return [];\n }\n throw error;\n }\n}\n\nasync function listFiles(\n fs: WorkspaceTransferFileSystem,\n root: string\n): Promise<Omit<FileEntry, \"content\">[]> {\n const result: Omit<FileEntry, \"content\">[] = [];\n\n async function visit(dir: string): Promise<void> {\n const dirents = await fs.readdir(dir, { withFileTypes: true });\n for (const dirent of dirents.sort((left, right) => left.name.localeCompare(right.name))) {\n const absolutePath = path.join(dir, dirent.name);\n if (dirent.isDirectory()) {\n await visit(absolutePath);\n continue;\n }\n if (!dirent.isFile()) {\n continue;\n }\n\n const stats = await fs.stat(absolutePath);\n result.push({\n path: toRelativePath(root, absolutePath),\n absolutePath,\n bytes: stats.size\n });\n }\n }\n\n await visit(root);\n return result;\n}\n\nasync function readIgnoreFile(\n fs: WorkspaceTransferFileSystem,\n cwd: string,\n fileName: string,\n allowNegation: boolean\n): Promise<IgnoreRule[]> {\n const content = await readFileIfExists(fs, path.join(cwd, fileName));\n if (content === null) {\n return [];\n }\n return parseIgnoreLines(content.toString(\"utf8\").split(\"\\n\"), allowNegation);\n}\n\nfunction parseIgnoreLines(lines: string[], allowNegation: boolean): IgnoreRule[] {\n const rules: IgnoreRule[] = [];\n for (const rawLine of lines) {\n const line = rawLine.trim();\n if (line.length === 0 || line.startsWith(\"#\")) {\n continue;\n }\n\n const negate = allowNegation && line.startsWith(\"!\");\n const patternWithMarker = negate ? line.slice(1) : line;\n if (patternWithMarker.length === 0) {\n continue;\n }\n\n const anchored = patternWithMarker.startsWith(\"/\");\n const directoryOnly = patternWithMarker.endsWith(\"/\");\n const pattern = stripSlashes(\n directoryOnly ? patternWithMarker.slice(0, -1) : patternWithMarker\n );\n if (pattern.length > 0) {\n rules.push({ pattern, negate, directoryOnly, anchored });\n }\n }\n return rules;\n}\n\nfunction isIgnoredByGit(relativePath: string, rules: IgnoreRule[]): boolean {\n let ignored = false;\n for (const rule of rules) {\n if (matchesRule(relativePath, rule)) {\n ignored = !rule.negate;\n }\n }\n return ignored;\n}\n\nfunction isIgnoredAdditively(relativePath: string, rules: IgnoreRule[]): boolean {\n return rules.some((rule) => matchesRule(relativePath, rule));\n}\n\nfunction matchesRule(relativePath: string, rule: IgnoreRule): boolean {\n const normalizedPath = normalizeRelativePath(relativePath);\n const normalizedPattern = normalizeRelativePath(rule.pattern);\n if (rule.directoryOnly) {\n return pathMatchesDirectory(normalizedPath, normalizedPattern, rule.anchored);\n }\n\n if (rule.anchored || normalizedPattern.includes(\"/\")) {\n return matchPathSegments(normalizedPath.split(\"/\"), normalizedPattern.split(\"/\"));\n }\n\n return normalizedPath.split(\"/\").some((segment) => matchSegment(segment, normalizedPattern));\n}\n\nfunction pathMatchesDirectory(relativePath: string, pattern: string, anchored: boolean): boolean {\n if (anchored || pattern.includes(\"/\")) {\n return relativePath === pattern || relativePath.startsWith(`${pattern}/`);\n }\n\n const segments = relativePath.split(\"/\");\n return segments.some((segment, index) => {\n return matchSegment(segment, pattern) && index < segments.length - 1;\n });\n}\n\nfunction matchPathSegments(pathSegments: string[], patternSegments: string[]): boolean {\n if (pathSegments.length !== patternSegments.length) {\n return false;\n }\n\n return patternSegments.every((patternSegment, index) =>\n matchSegment(pathSegments[index] ?? \"\", patternSegment)\n );\n}\n\nfunction matchSegment(value: string, pattern: string): boolean {\n const patternParts = pattern.split(\"*\");\n if (patternParts.length === 1) {\n return value === pattern;\n }\n\n let offset = 0;\n for (const [index, part] of patternParts.entries()) {\n if (part.length === 0) {\n continue;\n }\n\n const foundAt = value.indexOf(part, offset);\n if (foundAt === -1) {\n return false;\n }\n\n if (index === 0 && foundAt !== 0) {\n return false;\n }\n\n offset = foundAt + part.length;\n }\n\n const lastPart = patternParts.at(-1) ?? \"\";\n return lastPart.length === 0 || value.endsWith(lastPart);\n}\n\nasync function isDownloadConflict(\n fs: WorkspaceTransferFileSystem,\n localPath: string,\n relativePath: string,\n remoteContent: Buffer,\n state: Map<string, UploadedFileState>\n): Promise<boolean> {\n const localContent = await readFileIfExists(fs, localPath);\n if (localContent === null) {\n return false;\n }\n\n const localHash = hashBuffer(localContent);\n const remoteHash = hashBuffer(remoteContent);\n const uploadedHash = state.get(relativePath)?.hash;\n const localChanged = uploadedHash === undefined || localHash !== uploadedHash;\n return localChanged && localHash !== remoteHash;\n}\n\nasync function readFileIfExists(\n fs: WorkspaceTransferFileSystem,\n filePath: string\n): Promise<Buffer | null> {\n try {\n return await fs.readFile(filePath);\n } catch (error) {\n if (isNotFoundError(error)) {\n return null;\n }\n throw error;\n }\n}\n\nasync function removeTree(fs: WorkspaceTransferFileSystem, targetPath: string): Promise<void> {\n if (fs.rm) {\n await fs.rm(targetPath, { recursive: true, force: true });\n return;\n }\n\n const stats = await statIfExists(fs, targetPath);\n if (stats === null) {\n return;\n }\n if (stats.isFile()) {\n await removeFile(fs, targetPath);\n return;\n }\n\n const dirents = await fs.readdir(targetPath, { withFileTypes: true });\n for (const dirent of dirents) {\n await removeTree(fs, path.join(targetPath, dirent.name));\n }\n if (fs.rmdir) {\n await fs.rmdir(targetPath);\n }\n}\n\nasync function removeFile(fs: WorkspaceTransferFileSystem, filePath: string): Promise<void> {\n if (fs.rm) {\n await fs.rm(filePath, { force: true });\n return;\n }\n if (fs.unlink) {\n await fs.unlink(filePath);\n }\n}\n\nasync function statIfExists(\n fs: WorkspaceTransferFileSystem,\n targetPath: string\n): Promise<WorkspaceTransferStats | null> {\n try {\n return await fs.stat(targetPath);\n } catch (error) {\n if (isNotFoundError(error)) {\n return null;\n }\n throw error;\n }\n}\n\nfunction createTar(entries: FileEntry[]): Buffer {\n const chunks: Buffer[] = [];\n for (const entry of entries) {\n chunks.push(createTarHeader(entry.path, entry.bytes));\n chunks.push(entry.content);\n chunks.push(Buffer.alloc(paddingFor(entry.bytes)));\n }\n chunks.push(Buffer.alloc(1024));\n return Buffer.concat(chunks);\n}\n\nfunction createTarHeader(name: string, size: number): Buffer {\n const header = Buffer.alloc(512);\n writeString(header, name, 0, 100);\n writeOctal(header, 0o644, 100, 8);\n writeOctal(header, 0, 108, 8);\n writeOctal(header, 0, 116, 8);\n writeOctal(header, size, 124, 12);\n writeOctal(header, 0, 136, 12);\n header.fill(32, 148, 156);\n header.write(\"0\", 156, 1, \"ascii\");\n header.write(\"ustar\", 257, 5, \"ascii\");\n header.write(\"00\", 263, 2, \"ascii\");\n writeOctal(header, checksum(header), 148, 8);\n return header;\n}\n\nfunction writeString(buffer: Buffer, value: string, offset: number, length: number): void {\n const text = Buffer.from(value);\n text.copy(buffer, offset, 0, Math.min(text.length, length));\n}\n\nfunction writeOctal(buffer: Buffer, value: number, offset: number, length: number): void {\n const text = value.toString(8).padStart(length - 1, \"0\");\n buffer.write(text.slice(0, length - 1), offset, length - 1, \"ascii\");\n buffer[offset + length - 1] = 0;\n}\n\nfunction checksum(buffer: Buffer): number {\n return buffer.reduce((sum, value) => sum + value, 0);\n}\n\nfunction paddingFor(size: number): number {\n const remainder = size % 512;\n return remainder === 0 ? 0 : 512 - remainder;\n}\n\nfunction hashBuffer(buffer: Buffer): string {\n return createHash(\"sha256\").update(buffer).digest(\"hex\");\n}\n\nfunction toRelativePath(root: string, absolutePath: string): string {\n return normalizeRelativePath(path.relative(root, absolutePath));\n}\n\nfunction normalizeRelativePath(value: string): string {\n return stripSlashes(value.split(path.sep).join(\"/\"));\n}\n\nfunction stripSlashes(value: string): string {\n let start = 0;\n let end = value.length;\n while (value[start] === \"/\") {\n start += 1;\n }\n while (value[end - 1] === \"/\") {\n end -= 1;\n }\n return value.slice(start, end);\n}\n\nfunction isNotFoundError(error: unknown): boolean {\n return typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\";\n}\n", "import path from \"node:path\";\nimport type { E2bRuntime } from \"@poe-code/poe-code-config\";\nimport type { ExecutionEnvFactory, OpenSpec, OpenedEnv } from \"@poe-code/agent-harness-tools\";\nimport { createSandbox, connectSandbox } from \"./sdk.js\";\nimport { buildE2bRuntimeTemplate } from \"./template-build.js\";\nimport { createOpenedE2bEnv } from \"./opened-env.js\";\nimport { resolveE2bApiKey } from \"./auth-scope.js\";\n\nexport const e2bExecutionEnvFactory: ExecutionEnvFactory = {\n type: \"e2b\",\n supportsDetach: true,\n async open(spec): Promise<OpenedEnv> {\n const runtime = parseE2bRuntime(spec.runtime);\n const runtimeCwd = spec.runtimeCwd ?? spec.cwd;\n const apiKey = await resolveE2bApiKey({ cwd: runtimeCwd });\n const templateId =\n runtime.template_id ??\n (\n await buildE2bRuntimeTemplate({\n runtime,\n dockerfilePath: path.resolve(\n runtimeCwd,\n runtime.dockerfile ?? path.join(\".poe-code\", \"Dockerfile\")\n ),\n buildContext: path.resolve(runtimeCwd, runtime.build_context ?? \".\"),\n state: spec.state,\n apiKey\n })\n ).templateId;\n const sandbox = await createSandbox({\n apiKey,\n templateId,\n env: spec.env,\n timeoutMinutes: runtime.timeout_minutes\n });\n\n return createOpenedE2bEnv({ sandbox, spec, runtime });\n },\n async attach(envId, context): Promise<OpenedEnv> {\n const cwd = context?.cwd ?? process.cwd();\n const apiKey = await resolveE2bApiKey({ cwd });\n const sandbox = await connectSandbox(envId, apiKey);\n return createOpenedE2bEnv({\n sandbox,\n spec: {\n cwd: context?.cwd ?? \"/workspace\",\n runtime: {\n type: \"e2b\",\n build_args: {},\n mounts: [],\n workspace_dir: \"/workspace\",\n preserve_after_exit_hours: 24\n },\n env: {},\n uploadIgnoreFiles: [],\n jobLabel: { tool: context?.tool ?? \"e2b\", argv: context?.argv ?? [] },\n ...(context?.jobId ? { detachedJobId: context.jobId } : {})\n } as OpenSpec & { detachedJobId?: string },\n runtime: {\n type: \"e2b\",\n build_args: {},\n mounts: [],\n workspace_dir: \"/workspace\",\n preserve_after_exit_hours: 24\n }\n });\n }\n};\n\nfunction parseE2bRuntime(runtime: unknown): E2bRuntime {\n if (!runtime || typeof runtime !== \"object\" || Array.isArray(runtime)) {\n throw new Error(\"e2b runtime must be an object\");\n }\n const record = runtime as Record<string, unknown>;\n if (record.type !== \"e2b\") {\n throw new Error('e2b runtime type must be \"e2b\"');\n }\n return record as unknown as E2bRuntime;\n}\n", "import { Template, Sandbox, TemplateBase } from \"e2b\";\nimport type { Readable } from \"node:stream\";\n\nexport interface E2bSandbox {\n readonly sandboxId: string;\n readonly commands: E2bCommands;\n readonly files: E2bFiles;\n readonly pty: E2bPty;\n setTimeout(timeoutMs: number): Promise<void>;\n kill(): Promise<void>;\n}\n\nexport interface E2bCommands {\n list(): Promise<E2bProcessInfo[]>;\n run(command: string, opts?: E2bCommandOptions): Promise<E2bCommandResult | E2bCommandHandle>;\n connect(pid: number, opts?: E2bCommandConnectOptions): Promise<E2bCommandHandle>;\n sendStdin(pid: number, data: string | Uint8Array): Promise<void>;\n closeStdin?(pid: number): Promise<void>;\n kill(pid: number): Promise<boolean>;\n}\n\nexport interface E2bPty {\n create(opts: E2bPtyOptions): Promise<E2bCommandHandle>;\n sendInput(pid: number, data: Uint8Array): Promise<void>;\n kill(pid: number): Promise<boolean>;\n}\n\nexport interface E2bFiles {\n read(path: string, opts: { format: \"bytes\" }): Promise<Uint8Array>;\n read(path: string): Promise<string>;\n write(path: string, data: string | ArrayBuffer | Blob | ReadableStream): Promise<unknown>;\n watchDir(\n path: string,\n onEvent: () => void | Promise<void>,\n opts?: { recursive?: boolean; onExit?: (error?: Error) => void | Promise<void> }\n ): Promise<{ stop(): Promise<void> }>;\n}\n\nexport interface E2bProcessInfo {\n pid: number;\n cmd: string;\n args: string[];\n}\n\nexport interface E2bCommandOptions {\n background?: boolean;\n cwd?: string;\n envs?: Record<string, string>;\n stdin?: boolean;\n timeoutMs?: number;\n onStdout?: (data: string) => void | Promise<void>;\n onStderr?: (data: string) => void | Promise<void>;\n}\n\nexport interface E2bPtyOptions {\n cols: number;\n rows: number;\n cwd?: string;\n envs?: Record<string, string>;\n timeoutMs?: number;\n onData: (data: Uint8Array) => void | Promise<void>;\n}\n\nexport interface E2bCommandConnectOptions {\n timeoutMs?: number;\n onStdout?: (data: string) => void | Promise<void>;\n onStderr?: (data: string) => void | Promise<void>;\n}\n\nexport interface E2bCommandResult {\n exitCode?: number;\n stdout?: string;\n stderr?: string;\n}\n\nexport interface E2bCommandHandle {\n readonly pid: number;\n wait(): Promise<E2bCommandResult>;\n kill(): Promise<boolean>;\n}\n\nexport interface CreateSandboxOptions {\n apiKey: string;\n templateId: string;\n env: Record<string, string>;\n timeoutMinutes?: number;\n}\n\nexport interface BuildTemplateOptions {\n apiKey: string;\n name: string;\n dockerfilePath: string;\n buildContext: string;\n cpu?: number;\n memoryMb?: number;\n fromTemplate?: string;\n onLog?: (entry: BuildLogEntry) => void;\n}\n\nexport interface BuildLogEntry {\n level: \"debug\" | \"info\" | \"warn\" | \"error\";\n message: string;\n timestamp: Date;\n}\n\nexport interface BuildTemplateResult {\n templateId: string;\n}\n\nexport interface SandboxInfo {\n sandboxId: string;\n}\n\nexport async function createSandbox(opts: CreateSandboxOptions): Promise<E2bSandbox> {\n return Sandbox.create(opts.templateId, {\n apiKey: opts.apiKey,\n envs: opts.env,\n ...(opts.timeoutMinutes === undefined ? {} : { timeoutMs: opts.timeoutMinutes * 60_000 })\n }) as Promise<E2bSandbox>;\n}\n\nexport async function connectSandbox(id: string, apiKey?: string): Promise<E2bSandbox> {\n return Sandbox.connect(id, apiKey === undefined ? undefined : { apiKey }) as Promise<E2bSandbox>;\n}\n\nexport async function buildTemplate(opts: BuildTemplateOptions): Promise<BuildTemplateResult> {\n const template = Template({ fileContextPath: opts.buildContext }).fromDockerfile(\n opts.dockerfilePath\n );\n if (opts.fromTemplate !== undefined && opts.fromTemplate.length > 0) {\n (template as TemplateBase).fromTemplate(opts.fromTemplate);\n }\n const result = await Template.build(template, opts.name, {\n apiKey: opts.apiKey,\n ...(opts.cpu === undefined ? {} : { cpuCount: opts.cpu }),\n ...(opts.memoryMb === undefined ? {} : { memoryMB: opts.memoryMb }),\n ...(opts.onLog ? { onBuildLogs: opts.onLog } : {})\n });\n return { templateId: result.templateId };\n}\n\nexport async function listSandboxes(apiKey?: string): Promise<SandboxInfo[]> {\n const paginator = Sandbox.list(apiKey === undefined ? undefined : { apiKey });\n const sandboxes: SandboxInfo[] = [];\n while (paginator.hasNext) {\n sandboxes.push(...((await paginator.nextItems()) as SandboxInfo[]));\n }\n return sandboxes;\n}\n\nexport function toArrayBuffer(buffer: Buffer): ArrayBuffer {\n const output = new ArrayBuffer(buffer.byteLength);\n new Uint8Array(output).set(buffer);\n return output;\n}\n\nexport async function readableToString(stream: Readable | null): Promise<string> {\n if (stream === null) {\n return \"\";\n }\n stream.setEncoding(\"utf8\");\n const chunks: string[] = [];\n for await (const chunk of stream) {\n chunks.push(String(chunk));\n }\n return chunks.join(\"\");\n}\n", "import { createHash } from \"node:crypto\";\nimport { readdir, readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { E2bRuntime, StateManager } from \"@poe-code/poe-code-config\";\nimport { buildTemplate, type BuildLogEntry } from \"./sdk.js\";\n\nexport interface BuildE2bRuntimeTemplateInput {\n runtime: E2bRuntime;\n dockerfilePath: string;\n buildContext: string;\n state?: Pick<StateManager, \"templates\">;\n apiKey: string;\n force?: boolean;\n onLog?: (entry: BuildLogEntry) => void;\n}\n\nexport interface BuildE2bRuntimeTemplateResult {\n backend: \"e2b\";\n hash: string;\n templateId: string;\n cached: boolean;\n}\n\nconst BUILD_LOG_TAIL_SIZE = 30;\n\nexport async function buildE2bRuntimeTemplate(\n input: BuildE2bRuntimeTemplateInput\n): Promise<BuildE2bRuntimeTemplateResult> {\n const dockerfileBytes = await readFile(input.dockerfilePath);\n const buildContextFiles = await readBuildContextFiles(input.buildContext);\n const hash = hashTemplate(dockerfileBytes, buildContextFiles, input.runtime.build_args);\n const cached = input.force === true ? null : await input.state?.templates.get(\"e2b\", hash);\n\n if (cached?.template_id !== undefined) {\n return { backend: \"e2b\", hash, templateId: cached.template_id, cached: true };\n }\n\n const tail: string[] = [];\n const onLog = (entry: BuildLogEntry): void => {\n tail.push(entry.message);\n if (tail.length > BUILD_LOG_TAIL_SIZE) {\n tail.shift();\n }\n input.onLog?.(entry);\n };\n\n let built;\n try {\n built = await buildTemplate({\n apiKey: input.apiKey,\n name: `poe-code-${hash.slice(0, 32)}`,\n dockerfilePath: input.dockerfilePath,\n buildContext: input.buildContext,\n cpu: input.runtime.cpu,\n memoryMb: input.runtime.memory_mb,\n fromTemplate: input.runtime.from_template,\n onLog\n });\n } catch (error) {\n throw decorateBuildError(error, tail);\n }\n\n await input.state?.templates.put(\"e2b\", {\n hash,\n template_id: built.templateId,\n runtime_type: \"e2b\",\n dockerfile_path: input.dockerfilePath,\n built_at: new Date().toISOString()\n });\n\n return { backend: \"e2b\", hash, templateId: built.templateId, cached: false };\n}\n\nfunction decorateBuildError(error: unknown, tail: string[]): Error {\n const original = error instanceof Error ? error : new Error(String(error));\n if (tail.length === 0) {\n return original;\n }\n const decorated = new Error(`${original.message}\\n\\nLast build output:\\n${tail.join(\"\\n\")}`);\n decorated.stack = original.stack;\n (decorated as Error & { cause?: unknown }).cause = original;\n return decorated;\n}\n\nfunction hashTemplate(\n dockerfileBytes: Buffer,\n buildContextFiles: BuildContextFile[],\n buildArgs: Record<string, string>\n): string {\n const hash = createHash(\"sha256\");\n hash.update(dockerfileBytes);\n hash.update(\"\\0\");\n for (const file of buildContextFiles) {\n hash.update(file.relativePath);\n hash.update(\"\\0\");\n hash.update(file.bytes);\n hash.update(\"\\0\");\n }\n for (const [key, value] of Object.entries(buildArgs).sort(([left], [right]) =>\n left.localeCompare(right)\n )) {\n hash.update(key);\n hash.update(\"=\");\n hash.update(value);\n hash.update(\"\\0\");\n }\n return hash.digest(\"hex\");\n}\n\ninterface BuildContextFile {\n relativePath: string;\n bytes: Buffer;\n}\n\nasync function readBuildContextFiles(buildContext: string): Promise<BuildContextFile[]> {\n const files: BuildContextFile[] = [];\n await collectBuildContextFiles(buildContext, \"\", files);\n return files.sort((left, right) => left.relativePath.localeCompare(right.relativePath));\n}\n\nasync function collectBuildContextFiles(\n buildContext: string,\n relativeDir: string,\n files: BuildContextFile[]\n): Promise<void> {\n const absoluteDir = path.join(buildContext, relativeDir);\n const entries = await readdir(absoluteDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const relativePath = path.join(relativeDir, entry.name);\n if (entry.isDirectory()) {\n await collectBuildContextFiles(buildContext, relativePath, files);\n continue;\n }\n if (!entry.isFile()) {\n continue;\n }\n files.push({\n relativePath: relativePath.split(path.sep).join(\"/\"),\n bytes: await readFile(path.join(buildContext, relativePath))\n });\n }\n}\n", "import { mkdtempSync, rmSync } from \"node:fs\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport path from \"node:path\";\nimport { PassThrough, Writable } from \"node:stream\";\nimport type { E2bRuntime } from \"@poe-code/poe-code-config\";\nimport type {\n LogStreamFs,\n OpenSpec,\n OpenedEnv,\n RunHandle,\n RunSpec\n} from \"@poe-code/agent-harness-tools\";\nimport { createHostRunner, type Runner } from \"@poe-code/process-runner\";\nimport { createE2bJobHandle, createE2bLogStreamFs } from \"./job-handle.js\";\nimport {\n readableToString,\n toArrayBuffer,\n type E2bCommandHandle,\n type E2bCommandResult,\n type E2bSandbox\n} from \"./sdk.js\";\n\nconst REMOTE_COMMAND_STDERR_TAIL_SIZE = 30;\n\ninterface DetachedJobContext {\n id: string;\n tool: string;\n argv: string[];\n}\n\nexport interface E2bOpenedEnv extends OpenedEnv {\n fs: LogStreamFs;\n setDetachedJobContext(context: DetachedJobContext): void;\n}\n\nexport function createOpenedE2bEnv(input: {\n sandbox: E2bSandbox;\n spec: OpenSpec;\n runtime: E2bRuntime;\n}): E2bOpenedEnv {\n const hostRunner = input.spec.hostRunner ?? createHostRunner();\n const hostWorkspaceDir = path.resolve(input.spec.cwd);\n const sandboxWorkspaceDir = normalizeSandboxWorkspaceDir(input.runtime.workspace_dir);\n let lastProcess: { started: Promise<E2bCommandHandle> } | null = null;\n let detachedJobContext: DetachedJobContext | null = null;\n const mapWorkspaceCwd = (cwd: string | undefined): string | undefined => {\n if (cwd === undefined) {\n return undefined;\n }\n if (path.isAbsolute(cwd) && path.resolve(cwd) === hostWorkspaceDir) {\n return sandboxWorkspaceDir;\n }\n return cwd;\n };\n\n const attachedJobId = (input.spec as OpenSpec & { detachedJobId?: string }).detachedJobId;\n const env: E2bOpenedEnv = {\n id: input.sandbox.sandboxId,\n job: attachedJobId\n ? createE2bJobHandle({\n sandbox: input.sandbox,\n envId: input.sandbox.sandboxId,\n jobId: attachedJobId,\n tool: input.spec.jobLabel.tool,\n argv: input.spec.jobLabel.argv,\n preserveAfterExitHours: input.runtime.preserve_after_exit_hours ?? 24\n })\n : null,\n fs: createE2bLogStreamFs(input.sandbox),\n setDetachedJobContext(context) {\n detachedJobContext = context;\n },\n async uploadWorkspace() {\n if (input.spec.runner?.sync === \"none\") {\n return { files: 0, bytes: 0, skipped: [] };\n }\n const tempDir = mkdtempSync(path.join(tmpdir(), \"poe-e2b-upload-\"));\n const archivePath = path.join(tempDir, \"workspace.tar\");\n try {\n await runOrThrow(hostRunner, {\n command: \"tar\",\n args: [\n ...input.spec.uploadIgnoreFiles.flatMap((ignored) => [\"--exclude\", ignored]),\n \"-cf\",\n archivePath,\n \"-C\",\n input.spec.cwd,\n \".\"\n ],\n stdout: \"pipe\",\n stderr: \"pipe\"\n });\n await input.sandbox.files.write(\n \"/tmp/poe-workspace-upload.tar\",\n toArrayBuffer(await readFile(archivePath))\n );\n await runRemoteOrThrow(\n input.sandbox,\n createUploadWorkspaceCommand(sandboxWorkspaceDir)\n );\n return { files: 0, bytes: 0, skipped: [] };\n } finally {\n rmSync(tempDir, { recursive: true, force: true });\n }\n },\n async downloadWorkspace(opts) {\n if (input.spec.runner?.sync === \"upload\" || input.spec.runner?.sync === \"none\") {\n return { files: 0, bytes: 0, conflicts: [] };\n }\n const tempDir = mkdtempSync(path.join(tmpdir(), \"poe-e2b-download-\"));\n const archivePath = path.join(tempDir, \"workspace.tar\");\n try {\n await runRemoteOrThrow(\n input.sandbox,\n `tar -cf /tmp/poe-workspace-download.tar -C ${shellQuote(sandboxWorkspaceDir)} .`\n );\n const archive = await input.sandbox.files.read(\"/tmp/poe-workspace-download.tar\", {\n format: \"bytes\"\n });\n await writeFile(archivePath, Buffer.from(archive));\n await runOrThrow(hostRunner, {\n command: \"tar\",\n args: [\n opts.conflictPolicy === \"refuse\" ? \"-xkf\" : \"-xf\",\n archivePath,\n \"-C\",\n input.spec.cwd\n ],\n stdout: \"pipe\",\n stderr: \"pipe\"\n });\n return { files: 0, bytes: archive.byteLength, conflicts: [] };\n } finally {\n rmSync(tempDir, { recursive: true, force: true });\n }\n },\n exec(spec) {\n const handle = runE2bCommand(input.sandbox, {\n ...spec,\n cwd: mapWorkspaceCwd(spec.cwd),\n env: resolveSandboxCommandEnv(spec.env)\n });\n lastProcess = { started: handle.started };\n return handle;\n },\n async detach() {\n if (detachedJobContext === null) {\n throw new Error(\"Cannot detach E2B environment before a job context is registered.\");\n }\n if (lastProcess === null) {\n throw new Error(\"Cannot detach E2B environment before a command is running.\");\n }\n const command = await lastProcess.started;\n const preserveAfterExitHours = input.runtime.preserve_after_exit_hours ?? 24;\n const preserveMs = preserveAfterExitHours * 60 * 60 * 1000;\n if (preserveMs > 0) {\n await input.sandbox.setTimeout(preserveMs);\n }\n return createE2bJobHandle({\n sandbox: input.sandbox,\n envId: input.sandbox.sandboxId,\n jobId: detachedJobContext.id,\n tool: detachedJobContext.tool,\n argv: detachedJobContext.argv,\n pid: command.pid,\n preserveAfterExitHours\n });\n },\n shell() {\n const shellSpec = input.spec.shellSpec;\n const command = shellSpec?.command ?? input.spec.env.SHELL ?? \"sh\";\n return runE2bPty(input.sandbox, {\n command,\n ...(shellSpec?.args ? { args: shellSpec.args } : {}),\n cwd: mapWorkspaceCwd(shellSpec?.cwd ?? input.spec.cwd),\n env: resolveSandboxCommandEnv(\n shellSpec && \"env\" in shellSpec ? shellSpec.env : input.spec.env\n ),\n stdin: \"inherit\",\n stdout: \"inherit\",\n stderr: \"inherit\",\n tty: true\n });\n },\n async close() {\n await input.sandbox.kill();\n }\n };\n\n return env;\n}\n\nfunction runE2bCommand(\n sandbox: E2bSandbox,\n spec: RunSpec\n): RunHandle & { e2bHandle: E2bCommandHandle | null; started: Promise<E2bCommandHandle> } {\n const stdout = spec.stdout === \"inherit\" ? null : new PassThrough();\n const stderr = spec.stderr === \"inherit\" ? null : new PassThrough();\n let e2bHandle: E2bCommandHandle | null = null;\n const command = shellCommand([spec.command, ...(spec.args ?? [])]);\n const started = sandbox.commands.run(command, {\n background: true,\n cwd: spec.cwd,\n envs: spec.env,\n stdin: spec.stdin === \"pipe\",\n onStdout(data) {\n stdout?.write(data);\n if (spec.stdout === \"inherit\") {\n process.stdout.write(data);\n }\n },\n onStderr(data) {\n stderr?.write(data);\n if (spec.stderr === \"inherit\") {\n process.stderr.write(data);\n }\n }\n }) as Promise<E2bCommandHandle>;\n const stdin =\n spec.stdin === \"pipe\"\n ? new Writable({\n write(chunk, _encoding, callback) {\n started\n .then((handle) =>\n sandbox.commands.sendStdin(\n handle.pid,\n Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk))\n )\n )\n .then(() => callback(), callback);\n },\n final(callback) {\n if (sandbox.commands.closeStdin === undefined) {\n callback();\n return;\n }\n started\n .then((handle) => sandbox.commands.closeStdin!(handle.pid))\n .then(() => callback(), callback);\n }\n })\n : null;\n const result = started\n .then((handle) => {\n e2bHandle = handle;\n return handle.wait();\n })\n .then(\n (result) => {\n stdout?.end();\n stderr?.end();\n return { exitCode: result.exitCode ?? 0 };\n },\n (error: unknown) => {\n stdout?.end();\n stderr?.end();\n if (isExitError(error)) {\n return { exitCode: error.exitCode };\n }\n return { exitCode: 1 };\n }\n );\n\n return {\n get pid() {\n return e2bHandle?.pid ?? null;\n },\n stdin,\n stdout,\n stderr,\n result,\n kill() {\n void e2bHandle?.kill();\n },\n get e2bHandle() {\n return e2bHandle;\n },\n started\n };\n}\n\nfunction runE2bPty(sandbox: E2bSandbox, spec: RunSpec): RunHandle {\n const stdout = new PassThrough();\n let handleRef: E2bCommandHandle | null = null;\n const stdin = new Writable({\n write(chunk, _encoding, callback) {\n if (handleRef === null) {\n callback(new Error(\"E2B PTY stdin is not ready.\"));\n return;\n }\n sandbox.pty\n .sendInput(handleRef.pid, Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk)))\n .then(() => callback(), callback);\n }\n });\n const started = sandbox.pty.create({\n cols: process.stdout.columns || 80,\n rows: process.stdout.rows || 24,\n cwd: spec.cwd,\n envs: spec.env,\n onData(data) {\n stdout.write(Buffer.from(data));\n if (spec.stdout === \"inherit\") {\n process.stdout.write(Buffer.from(data));\n }\n }\n });\n const result = started\n .then((handle) => {\n handleRef = handle;\n return handle.wait();\n })\n .then(\n (result) => {\n stdout.end();\n return { exitCode: result.exitCode ?? 0 };\n },\n () => {\n stdout.end();\n return { exitCode: 1 };\n }\n );\n\n return {\n get pid() {\n return handleRef?.pid ?? null;\n },\n stdin: spec.stdin === \"inherit\" ? process.stdin : stdin,\n stdout: spec.stdout === \"inherit\" ? null : stdout,\n stderr: null,\n result,\n kill() {\n void (handleRef === null ? undefined : sandbox.pty.kill(handleRef.pid));\n }\n };\n}\n\nasync function runRemoteOrThrow(sandbox: E2bSandbox, command: string): Promise<void> {\n const stdoutTail = createLineTail(REMOTE_COMMAND_STDERR_TAIL_SIZE);\n const stderrTail = createLineTail(REMOTE_COMMAND_STDERR_TAIL_SIZE);\n let result: E2bCommandResult | E2bCommandHandle;\n try {\n result = await sandbox.commands.run(command, {\n onStdout(data) {\n stdoutTail.push(data);\n },\n onStderr(data) {\n stderrTail.push(data);\n }\n });\n } catch (error) {\n appendRemoteCommandOutput(error, stdoutTail, stderrTail);\n if (isCommandExitError(error)) {\n throw decorateRemoteCommandError(error, command, stderrTail.values());\n }\n throw error;\n }\n appendRemoteCommandOutput(result, stdoutTail, stderrTail);\n if (\"exitCode\" in result && result.exitCode !== 0) {\n throw decorateRemoteCommandError(\n new Error(`E2B command failed with exit code ${result.exitCode}`),\n command,\n stderrTail.values()\n );\n }\n}\n\nfunction appendRemoteCommandOutput(\n source: unknown,\n stdoutTail: { push(chunk: string): void },\n stderrTail: { push(chunk: string): void }\n): void {\n if (!source || typeof source !== \"object\") {\n return;\n }\n const output = source as { stdout?: unknown; stderr?: unknown };\n if (typeof output.stdout === \"string\") {\n stdoutTail.push(output.stdout);\n }\n if (typeof output.stderr === \"string\") {\n stderrTail.push(output.stderr);\n }\n}\n\nfunction decorateRemoteCommandError(error: unknown, command: string, stderrTail: string[]): Error {\n const original = error instanceof Error ? error : new Error(String(error));\n const tail = stderrTail.length === 0 ? \"\" : `\\n\\nLast stderr output:\\n${stderrTail.join(\"\\n\")}`;\n const decorated = new Error(`E2B command failed: ${command}\\n${original.message}${tail}`);\n decorated.stack = original.stack;\n (decorated as Error & { cause?: unknown }).cause = original;\n return decorated;\n}\n\nfunction createLineTail(maxLines: number): { push(chunk: string): void; values(): string[] } {\n const lines: string[] = [];\n let pending = \"\";\n const appendLine = (line: string): void => {\n lines.push(trimTrailingCarriageReturn(line));\n while (lines.length > maxLines) {\n lines.shift();\n }\n };\n\n return {\n push(chunk) {\n pending += chunk;\n const parts = pending.split(\"\\n\");\n pending = parts.pop() ?? \"\";\n for (const line of parts) {\n appendLine(line);\n }\n },\n values() {\n const output = [...lines];\n if (pending.length > 0) {\n output.push(trimTrailingCarriageReturn(pending));\n }\n return output.slice(-maxLines);\n }\n };\n}\n\nfunction trimTrailingCarriageReturn(value: string): string {\n return value.endsWith(\"\\r\") ? value.slice(0, -1) : value;\n}\n\nasync function runOrThrow(runner: Runner, spec: RunSpec): Promise<void> {\n const handle = runner.exec(spec);\n const stderr = readableToString(handle.stderr);\n const result = await handle.result;\n if (result.exitCode !== 0) {\n throw new Error(\n `Command failed with exit code ${result.exitCode}: ${spec.command} ${(spec.args ?? []).join(\" \")}\\n${await stderr}`\n );\n }\n}\n\nfunction shellCommand(argv: string[]): string {\n return argv.map(shellQuote).join(\" \");\n}\n\nfunction shellQuote(value: string): string {\n return `'${value.replaceAll(\"'\", \"'\\\\''\")}'`;\n}\n\nfunction createUploadWorkspaceCommand(sandboxWorkspaceDir: string): string {\n const quotedWorkspaceDir = shellQuote(sandboxWorkspaceDir);\n return [\n `mkdir -p ${quotedWorkspaceDir} || { command -v sudo >/dev/null 2>&1 && sudo mkdir -p ${quotedWorkspaceDir} && sudo chown \"$(id -u):$(id -g)\" ${quotedWorkspaceDir}; }`,\n `test -w ${quotedWorkspaceDir} && tar -xf /tmp/poe-workspace-upload.tar -C ${quotedWorkspaceDir}`\n ].join(\"\\n\");\n}\n\nfunction resolveSandboxCommandEnv(\n env: Record<string, string> | undefined\n): Record<string, string> | undefined {\n if (env === undefined) {\n return undefined;\n }\n return {\n ...env,\n HOME: \"/home/user\"\n };\n}\n\nfunction normalizeSandboxWorkspaceDir(workspaceDir: string | undefined): string {\n const resolvedWorkspaceDir = workspaceDir ?? \"/workspace\";\n if (!path.posix.isAbsolute(resolvedWorkspaceDir)) {\n throw new Error(\"E2B runtime workspace_dir must be an absolute sandbox path.\");\n }\n let normalized = path.posix.normalize(resolvedWorkspaceDir);\n while (normalized.length > 1 && normalized.endsWith(\"/\")) {\n normalized = normalized.slice(0, -1);\n }\n return normalized;\n}\n\nfunction isExitError(error: unknown): error is { exitCode: number } {\n return Boolean(\n error &&\n typeof error === \"object\" &&\n typeof (error as { exitCode?: unknown }).exitCode === \"number\"\n );\n}\n\nfunction isCommandExitError(error: unknown): boolean {\n return (\n isExitError(error) ||\n Boolean(\n error &&\n typeof error === \"object\" &&\n (error as { name?: unknown }).name === \"CommandExitError\"\n )\n );\n}\n", "import path from \"node:path\";\nimport type { JobHandle, JobStatus, LogChunk } from \"@poe-code/agent-harness-tools\";\nimport { streamLogFile, waitForExit, type LogStreamFs } from \"@poe-code/agent-harness-tools\";\nimport type { E2bSandbox } from \"./sdk.js\";\n\nconst JOB_DIR = \"/tmp/poe-jobs\";\n\nexport function createE2bJobHandle(input: {\n sandbox: E2bSandbox;\n envId: string;\n jobId: string;\n tool: string;\n argv: string[];\n pid?: number;\n preserveAfterExitHours: number;\n}): JobHandle {\n const fs = createE2bLogStreamFs(input.sandbox);\n\n return {\n id: input.jobId,\n envId: input.envId,\n tool: input.tool,\n argv: input.argv,\n async status(): Promise<JobStatus> {\n const exit = await readExitCode(input.sandbox, input.jobId);\n if (exit !== null) {\n return \"exited\";\n }\n\n const processes = await input.sandbox.commands.list();\n const isRunning =\n input.pid === undefined\n ? processes.some((process) => processMentionsJob(process, input.jobId))\n : processes.some((process) => process.pid === input.pid);\n return isRunning ? \"running\" : \"lost\";\n },\n stream(opts = {}): AsyncIterable<LogChunk> {\n return streamLogFile({ fs }, input.jobId, opts);\n },\n async wait(): Promise<{ exitCode: number }> {\n const result = await waitForExit({ fs }, input.jobId);\n const preserveMs = input.preserveAfterExitHours * 60 * 60 * 1000;\n if (preserveMs > 0) {\n await input.sandbox.setTimeout(preserveMs);\n }\n return result;\n },\n async kill(): Promise<void> {\n const pids =\n input.pid === undefined\n ? (await input.sandbox.commands.list())\n .filter((process) => processMentionsJob(process, input.jobId))\n .map((process) => process.pid)\n : [input.pid];\n await Promise.all(pids.map((pid) => input.sandbox.commands.kill(pid)));\n }\n };\n}\n\nexport function createE2bLogStreamFs(sandbox: E2bSandbox): LogStreamFs {\n return {\n promises: {\n async readFile(filePath) {\n return Buffer.from(await sandbox.files.read(filePath, { format: \"bytes\" }));\n },\n async stat(filePath) {\n const result = await sandbox.commands.run(\n `stat -c %Y ${shellQuote(filePath)} 2>/dev/null || stat -f %m ${shellQuote(filePath)}`\n );\n if (!(\"stdout\" in result)) {\n throw new Error(`Unable to stat ${filePath}`);\n }\n const seconds = Number(result.stdout?.trim());\n if (!Number.isFinite(seconds)) {\n throw new Error(`Unable to stat ${filePath}`);\n }\n return { mtimeMs: seconds * 1000 };\n }\n },\n watch(filePath, listener) {\n let closed = false;\n let stop: (() => void) | null = null;\n void sandbox.files\n .watchDir(path.dirname(filePath), listener, { recursive: false })\n .then((handle) => {\n if (closed) {\n void handle.stop();\n return;\n }\n stop = () => {\n void handle.stop();\n };\n });\n return {\n close() {\n closed = true;\n stop?.();\n }\n } as ReturnType<NonNullable<LogStreamFs[\"watch\"]>>;\n }\n };\n}\n\nfunction processMentionsJob(process: { cmd: string; args: string[] }, jobId: string): boolean {\n const needle = `/tmp/poe-jobs/${jobId}`;\n return process.cmd.includes(needle) || process.args.some((arg) => arg.includes(needle));\n}\n\nfunction shellQuote(value: string): string {\n return `'${value.replaceAll(\"'\", \"'\\\\''\")}'`;\n}\n\nasync function readExitCode(sandbox: E2bSandbox, jobId: string): Promise<number | null> {\n try {\n const contents = await sandbox.files.read(`${JOB_DIR}/${jobId}.exit`);\n const exitCode = Number(contents.trim());\n return Number.isInteger(exitCode) ? exitCode : null;\n } catch {\n return null;\n }\n}\n", "import os from \"node:os\";\nimport { promises as nodeFs } from \"node:fs\";\nimport {\n defineScope,\n readMergedDocument,\n resolveConfigPath,\n resolveProjectConfigPath,\n resolveScope\n} from \"@poe-code/poe-code-config\";\nimport type { FileSystem } from \"@poe-code/config-mutations\";\n\nexport const e2bAuthScope = defineScope(\"e2b\", {\n api_key: {\n type: \"string\",\n default: \"\",\n doc: \"E2B API key\",\n env: \"E2B_API_KEY\"\n }\n});\n\nexport interface ResolveE2bApiKeyInput {\n cwd: string;\n homeDir?: string;\n fs?: FileSystem;\n env?: Record<string, string | undefined>;\n}\n\nexport async function resolveE2bApiKey(input: ResolveE2bApiKeyInput): Promise<string> {\n const homeDir = input.homeDir ?? os.homedir();\n const fs = input.fs ?? (nodeFs as unknown as FileSystem);\n const env = input.env ?? process.env;\n const document = await readMergedDocument(\n fs,\n resolveConfigPath(homeDir),\n resolveProjectConfigPath(input.cwd)\n );\n const resolved = resolveScope(e2bAuthScope.schema, document.e2b, env);\n if (resolved.api_key.length === 0) {\n throw new Error(\n \"No E2B API key. Set E2B_API_KEY or e2b.api_key in ~/.poe-code/config.json.\"\n );\n }\n return resolved.api_key;\n}\n", "import type { ExecutionEnvFactory } from \"@poe-code/agent-harness-tools\";\nimport { e2bExecutionEnvFactory as factory } from \"./factory.js\";\n\nexport const e2bExecutionEnvFactory: ExecutionEnvFactory = factory;\nexport { e2bAuthScope, resolveE2bApiKey } from \"./auth-scope.js\";\nexport {\n buildE2bRuntimeTemplate,\n type BuildE2bRuntimeTemplateInput,\n type BuildE2bRuntimeTemplateResult\n} from \"./template-build.js\";\n", "import type { OtelSink, OtelSpan, SpawnMode, SpawnResult } from \"../types.js\";\n\nexport const noopOtelSink: OtelSink = {\n startSpan: () => noopOtelSpan,\n recordException: () => undefined\n};\n\nconst noopOtelSpan: OtelSpan = {\n setAttribute: () => undefined,\n addEvent: () => undefined,\n end: () => undefined\n};\n\nexport function observeAgentSpawn(\n input: {\n agent: string;\n cwd?: string;\n mode?: SpawnMode;\n otelSink?: OtelSink;\n prompt: string;\n },\n operation: () => Promise<SpawnResult>\n): Promise<SpawnResult> {\n const span = safeStartSpan(input.otelSink, \"agent.spawn\", {\n agent: input.agent,\n mode: input.mode ?? \"yolo\",\n cwd: input.cwd ?? process.cwd()\n });\n safeAddEvent(span, \"prompt\", { prompt: input.prompt });\n\n return (async () => {\n try {\n const result = await operation();\n safeAddEvent(span, \"summary\", { summary: readSummary(result) });\n safeAddEvent(span, \"exit\", { exitCode: result.exitCode });\n return result;\n } catch (error) {\n safeRecordException(input.otelSink, span, error);\n throw error;\n } finally {\n safeEndSpan(span);\n }\n })();\n}\n\nfunction safeStartSpan(\n sink: OtelSink | undefined,\n name: string,\n attrs: Record<string, unknown>\n): OtelSpan {\n if (sink === undefined) {\n return noopOtelSpan;\n }\n\n try {\n return sink.startSpan(name, attrs);\n } catch (error) {\n warnOtelSinkFailure(\"startSpan\", error);\n return noopOtelSpan;\n }\n}\n\nfunction safeAddEvent(\n span: OtelSpan | undefined,\n name: string,\n attrs: Record<string, unknown>\n): void {\n if (span === undefined) {\n return;\n }\n\n try {\n span.addEvent(name, attrs);\n } catch (error) {\n warnOtelSinkFailure(\"addEvent\", error);\n }\n}\n\nfunction safeRecordException(sink: OtelSink | undefined, span: OtelSpan, error: unknown): void {\n if (sink === undefined) {\n return;\n }\n\n try {\n sink.recordException(span, error);\n } catch (recordError) {\n warnOtelSinkFailure(\"recordException\", recordError);\n }\n}\n\nfunction safeEndSpan(span: OtelSpan): void {\n try {\n span.end();\n } catch (error) {\n warnOtelSinkFailure(\"end\", error);\n }\n}\n\nfunction readSummary(result: SpawnResult): string {\n return result.stdout.trim() || result.stderr.trim();\n}\n\nfunction warnOtelSinkFailure(method: string, error: unknown): void {\n console.warn(`OpenTelemetry sink ${method} failed: ${readErrorMessage(error)}`);\n}\n\nfunction readErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\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 { AdapterType } from \"./adapters/index.js\";\nimport type { RuntimeOverrideOptions } from \"@poe-code/agent-harness-tools\";\nimport type { StateManager } from \"@poe-code/poe-code-config\";\nimport type { AcpMiddleware } from \"./acp/middleware.js\";\n\nexport type SpawnMode = \"yolo\" | \"edit\" | \"read\";\n\nexport type SpawnModeConfig = string[] | { args?: string[]; env?: Record<string, string> };\n\nexport function resolveModeConfig(modeConfig: SpawnModeConfig): {\n args: string[];\n env?: Record<string, string>;\n} {\n if (Array.isArray(modeConfig)) {\n return { args: modeConfig };\n }\n return {\n args: modeConfig.args ?? [],\n env: modeConfig.env && Object.keys(modeConfig.env).length > 0 ? modeConfig.env : undefined\n };\n}\n\nexport interface McpSpawnServer {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n /**\n * Maximum time in seconds the agent should wait for a single tool call\n * to this MCP server before timing out. Omit to use the agent's default.\n */\n timeout?: number;\n}\n\nexport type McpSpawnConfig = Record<string, McpSpawnServer>;\n\nexport type OtelSpan = {\n setAttribute(key: string, value: unknown): void;\n addEvent(name: string, attrs: Record<string, unknown>): void;\n end(): void;\n};\n\nexport interface OtelSink {\n startSpan(name: string, attrs: Record<string, unknown>): OtelSpan;\n recordException(span: ReturnType<OtelSink[\"startSpan\"]>, error: unknown): void;\n}\n\nexport interface HookBridgeOptions {\n from: string;\n strategy?: \"auto\" | \"symlink\" | \"transform\";\n scope?: \"project\" | \"user\" | \"merged\";\n}\n\nexport interface SpawnOptions {\n prompt: string;\n cwd?: string;\n model?: string;\n mode?: SpawnMode;\n args?: string[];\n mcpServers?: McpSpawnConfig;\n /** Skill references to bridge into the spawned agent for this run. */\n skills?: string[];\n /** Hooks to bridge from another agent configuration for this run. */\n hooks?: HookBridgeOptions;\n /** Resume a prior provider thread/session before sending the prompt. */\n resumeThreadId?: string;\n useStdin?: boolean;\n interactive?: boolean;\n signal?: AbortSignal;\n otelSink?: OtelSink;\n middlewares?: AcpMiddleware[];\n tee?: {\n stdout?: { write(chunk: string): void };\n stderr?: { write(chunk: string): void };\n };\n /**\n * Kill the spawned process after this many milliseconds of inactivity (no stdout data).\n * Resets on every chunk of stdout/stderr received. Disabled when undefined.\n */\n activityTimeoutMs?: number;\n /**\n * Full path for the spawn log file. When set, stdout (and stderr for CLI spawns)\n * are appended to this file, and the absolute path is returned in `SpawnResult.logFile`.\n * Takes precedence over `logDir` + `logFileName`.\n */\n logPath?: string;\n /**\n * Directory for the spawn log file. When set together with `logFileName`, stdout\n * (and stderr for CLI spawns) are appended to `<logDir>/<logFileName>`, and the\n * absolute path is returned in `SpawnResult.logFile`.\n */\n logDir?: string;\n /** Overrides the auto-generated log filename. Must be used together with `logDir`. */\n logFileName?: string;\n /** Per-invocation runtime/runner config overrides. */\n runtime?: RuntimeOverrideOptions[\"runtime\"];\n /** Docker image override for docker runtime. */\n runtimeImage?: string;\n /** E2B template override for e2b runtime. */\n runtimeTemplate?: string;\n /** Directory used to load runtime config/templates when different from cwd. */\n runtimeConfigCwd?: string;\n /** Run through a detached runtime job when the backend supports it. */\n detach?: boolean;\n /** Mount the local poe-code checkout into the runtime for development. */\n mountPoeCode?: boolean;\n /** Override runner workspace sync behavior. */\n runnerSync?: RuntimeOverrideOptions[\"runnerSync\"];\n}\n\nexport interface SpawnUsage {\n inputTokens: number;\n outputTokens: number;\n cachedTokens?: number;\n costUsd?: number;\n}\n\nexport interface SpawnResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n durationMs?: number;\n threadId?: string;\n usage?: SpawnUsage;\n logFile?: string;\n detached?: { jobId: string; envId: string };\n}\n\nexport interface AutonomousResult {\n summary?: string;\n log?: string;\n output?: string;\n stdout?: string;\n text?: string;\n logFile?: string;\n toolCalls?: unknown[];\n sessionResult?: {\n toolCalls?: unknown[];\n };\n}\n\nexport interface SpawnLogger {\n dryRun(message: string): void;\n}\n\nexport interface SpawnContext {\n dryRun?: boolean;\n logger?: SpawnLogger;\n homeDir?: string;\n state?: StateManager;\n}\n\nexport interface StdinMode {\n omitPrompt: boolean;\n extraArgs: string[];\n}\n\nexport interface InteractiveSpawnConfig {\n defaultArgs: string[];\n defaultArgsPosition?: \"beforePrompt\" | \"afterPrompt\";\n promptFlag?: string;\n}\n\nexport interface CliSpawnConfig {\n kind: \"cli\";\n agentId: string;\n adapter: AdapterType;\n promptFlag: string;\n defaultArgs: string[];\n defaultArgsPosition?: \"beforePrompt\" | \"afterPrompt\";\n modes: Record<SpawnMode, SpawnModeConfig>;\n stdinMode?: StdinMode;\n modelFlag?: string;\n /**\n * Controls whether the provider prefix is stripped from model IDs before passing to the CLI binary.\n *\n * When `true`: \"anthropic/claude-opus-4.6\" \u2192 \"claude-opus-4.6\", \"openai/gpt-5.2\" \u2192 \"gpt-5.2\"\n * When `false`: \"anthropic/claude-opus-4.6\" stays as-is, \"openai/gpt-5.2\" stays as-is\n *\n * Most CLI binaries only accept bare model IDs (e.g. `claude --model claude-opus-4.6`),\n * so they need `true`. OpenCode routes through poe and needs the full provider path, so it uses `false`.\n */\n modelStripProviderPrefix: boolean;\n /** Transform model ID before passing to CLI. Runs after provider prefix stripping (if enabled). */\n modelTransform?: (model: string) => string;\n /**\n * Transforms MCP server config into CLI args for this agent.\n * Presence of this function declares spawn-time MCP support.\n */\n mcpArgs?: (servers: McpSpawnConfig) => string[];\n /**\n * Transforms MCP server config into env vars for this agent.\n * Use instead of `mcpArgs` when the agent reads MCP config from the environment.\n */\n mcpEnv?: (servers: McpSpawnConfig) => Record<string, string>;\n /**\n * Controls where serialized MCP args are inserted relative to the command.\n *\n * - \"beforeCommand\": before the prompt/subcommand section (e.g. `codex -c ... exec \"prompt\"`)\n * - \"beforePrompt\": after `defaultArgs` but before the prompt/model section\n * - \"afterCommand\": after `defaultArgs` (default)\n */\n mcpArgsPosition?: \"beforeCommand\" | \"beforePrompt\" | \"afterCommand\";\n /**\n * @deprecated Prefer `mcpArgsPosition`.\n * When true, MCP args are placed before the subcommand (e.g. `codex -c ... exec \"prompt\"`).\n * When false/undefined, they are placed after defaultArgs (e.g. `claude -p \"prompt\" --mcp-servers ...`).\n */\n mcpArgsBeforeCommand?: boolean;\n interactive?: InteractiveSpawnConfig;\n resume?: ResumeSpec;\n}\n\nexport interface ResumeSpec {\n /** Args injected into the live spawn for non-interactive resume. */\n args: (threadId: string, cwd: string) => string[];\n /** Position of `args` relative to the prompt token. Default `afterPrompt`. */\n position?: \"beforePrompt\" | \"afterPrompt\";\n /**\n * Optional override for the printed copy-paste resume hint (e.g. an interactive\n * shell command). When omitted, the hint composes binaryName + `args`.\n */\n hintArgs?: (threadId: string, cwd: string) => string[];\n}\n\nexport interface FileSpawnConfig {\n kind: \"file\";\n agentId: string;\n launchCommand?: string;\n launchArgs?: string[];\n}\n\nexport interface AcpSpawnConfig {\n kind: \"acp\";\n agentId: string;\n /** Args passed to the agent binary to start its ACP server (e.g. [\"acp\"]). */\n acpArgs:\n | string[]\n | ((options: { model?: string; mode?: SpawnMode; mcpServers?: McpSpawnConfig }) => string[]);\n /** Environment variables required by the ACP server process. */\n env?: Record<string, string>;\n /** Whether to skip the ACP authenticate step (workaround for servers that advertise but don't implement auth). */\n skipAuth?: boolean;\n /** MCP server env serializer, same as CliSpawnConfig. */\n mcpEnv?: (servers: McpSpawnConfig) => Record<string, string>;\n}\n\nexport type SpawnConfig = CliSpawnConfig | FileSpawnConfig | AcpSpawnConfig;\n", "import type { McpSpawnConfig } from \"../types.js\";\n\ninterface JsonMcpServer {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n timeout?: number;\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 if (server.timeout !== undefined) {\n mapped.timeout = server.timeout;\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 serializeOpenCodeMcpEnv(servers: McpSpawnConfig): Record<string, string> {\n const mcp: Record<\n string,\n { type: \"local\"; command: string[]; environment?: Record<string, string> }\n > = {};\n for (const [name, server] of Object.entries(servers)) {\n const entry: {\n type: \"local\";\n command: string[];\n environment?: Record<string, string>;\n } = { type: \"local\", command: [server.command, ...(server.args ?? [])] };\n if (server.env && Object.keys(server.env).length > 0) {\n entry.environment = server.env;\n }\n mcp[name] = entry;\n }\n return { OPENCODE_CONFIG_CONTENT: JSON.stringify({ mcp }) };\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 if (server.timeout !== undefined) {\n args.push(\"-c\", `${prefix}.timeout=${server.timeout}`);\n }\n }\n\n return args;\n}\n\nexport function serializeGooseMcpArgs(servers: McpSpawnConfig): string[] {\n return Object.values(servers).flatMap((server) => [\n \"--with-extension\",\n [server.command, ...(server.args ?? [])].join(\" \")\n ]);\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 resume: {\n args: (threadId) => [\"--resume\", threadId]\n }\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 mcpArgsBeforeCommand: true,\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 resume: {\n args: (threadId) => [\"resume\", threadId],\n position: \"beforePrompt\",\n hintArgs: (threadId, cwd) => [\"resume\", \"-C\", cwd, threadId]\n }\n};\n", "import type { AcpSpawnConfig, CliSpawnConfig } from \"../types.js\";\nimport { serializeOpenCodeMcpEnv } from \"./mcp.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 resume: {\n args: (threadId) => [\"--session\", threadId],\n hintArgs: (threadId, cwd) => [cwd, \"--session\", threadId]\n },\n mcpEnv: serializeOpenCodeMcpEnv\n};\n\nexport const openCodeAcpSpawnConfig: AcpSpawnConfig = {\n kind: \"acp\",\n agentId: \"opencode\",\n acpArgs: [\"acp\"],\n skipAuth: true,\n mcpEnv: serializeOpenCodeMcpEnv,\n};\n", "import type { AcpSpawnConfig, 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 resume: {\n args: (threadId, cwd) => [\"--session\", threadId, \"--work-dir\", cwd]\n }\n};\n\nexport const kimiAcpSpawnConfig: AcpSpawnConfig = {\n kind: \"acp\",\n agentId: \"kimi\",\n acpArgs: [\"acp\"],\n};\n", "import type { AcpSpawnConfig, CliSpawnConfig } from \"../types.js\";\nimport { serializeGooseMcpArgs } from \"./mcp.js\";\n\nconst gooseFileSecretsEnv = { GOOSE_DISABLE_KEYRING: \"1\" };\n\nexport const gooseSpawnConfig: CliSpawnConfig = {\n kind: \"cli\",\n agentId: \"goose\",\n adapter: \"native\",\n promptFlag: \"--text\",\n modelFlag: \"--model\",\n modelStripProviderPrefix: false,\n defaultArgs: [\"run\", \"--output-format\", \"stream-json\"],\n defaultArgsPosition: \"beforePrompt\",\n mcpArgs: serializeGooseMcpArgs,\n mcpArgsPosition: \"beforePrompt\",\n modes: {\n yolo: { env: { ...gooseFileSecretsEnv, GOOSE_MODE: \"auto\" } },\n edit: { env: { ...gooseFileSecretsEnv, GOOSE_MODE: \"smart_approve\" } },\n read: { env: { ...gooseFileSecretsEnv, GOOSE_MODE: \"chat\" } }\n },\n stdinMode: {\n omitPrompt: true,\n extraArgs: [\"--instructions\", \"-\"]\n },\n interactive: {\n defaultArgs: [\"session\"],\n defaultArgsPosition: \"beforePrompt\"\n },\n resume: {\n args: (threadId) => [\"--resume\", \"--session-id\", threadId],\n hintArgs: (threadId) => [\"run\", \"--resume\", \"--session-id\", threadId, \"--text\", \"continue\"]\n }\n};\n\nexport const gooseAcpSpawnConfig: AcpSpawnConfig = {\n kind: \"acp\",\n agentId: \"goose\",\n acpArgs: [\"acp\"],\n env: gooseFileSecretsEnv,\n skipAuth: true\n};\n", "import type { AcpSpawnConfig } from \"../types.js\";\n\nexport const geminiCliAcpSpawnConfig: AcpSpawnConfig = {\n kind: \"acp\",\n agentId: \"gemini-cli\",\n acpArgs: ({ model, mcpServers }) => [\n \"--acp\",\n ...(model ? [\"--model\", model] : []),\n ...(mcpServers ? [\"--allowed-mcp-server-names\", Object.keys(mcpServers).join(\",\")] : []),\n ...(mcpServers ? [\"--skip-trust\"] : []),\n \"--yolo\"\n ],\n env: {\n GEMINI_SANDBOX: \"false\"\n },\n skipAuth: true\n};\n", "import { resolveAgentId } from \"@poe-code/agent-defs\";\nimport type { AcpSpawnConfig, SpawnConfig } from \"../types.js\";\nimport { claudeCodeSpawnConfig } from \"./claude-code.js\";\nimport { codexSpawnConfig } from \"./codex.js\";\nimport { openCodeSpawnConfig, openCodeAcpSpawnConfig } from \"./opencode.js\";\nimport { kimiSpawnConfig, kimiAcpSpawnConfig } from \"./kimi.js\";\nimport { gooseSpawnConfig, gooseAcpSpawnConfig } from \"./goose.js\";\nimport { geminiCliAcpSpawnConfig } from \"./gemini-cli.js\";\n\n// ACP adapter support (spawn streaming):\n// - Supported (has `adapter`): claude-code, codex, opencode, kimi, goose\nexport const allSpawnConfigs: readonly SpawnConfig[] = [\n claudeCodeSpawnConfig,\n codexSpawnConfig,\n openCodeSpawnConfig,\n kimiSpawnConfig,\n gooseSpawnConfig\n];\n\nconst lookup = new Map<string, SpawnConfig>();\n\nfor (const config of allSpawnConfigs) {\n lookup.set(config.agentId, config);\n}\n\nconst acpLookup = new Map<string, AcpSpawnConfig>();\nacpLookup.set(openCodeAcpSpawnConfig.agentId, openCodeAcpSpawnConfig);\nacpLookup.set(kimiAcpSpawnConfig.agentId, kimiAcpSpawnConfig);\nacpLookup.set(gooseAcpSpawnConfig.agentId, gooseAcpSpawnConfig);\nacpLookup.set(geminiCliAcpSpawnConfig.agentId, geminiCliAcpSpawnConfig);\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 getAcpSpawnConfig(input: string): AcpSpawnConfig | undefined {\n const resolvedId = resolveAgentId(input);\n if (!resolvedId) {\n return undefined;\n }\n return acpLookup.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\" || typeof config.mcpEnv === \"function\")\n );\n}\n\nexport function listMcpSupportedAgents(): string[] {\n const supported: string[] = [];\n\n for (const config of allSpawnConfigs) {\n if (\n config.kind !== \"cli\" ||\n (typeof config.mcpArgs !== \"function\" && typeof config.mcpEnv !== \"function\")\n ) {\n continue;\n }\n supported.push(config.agentId);\n }\n\n return supported;\n}\n", "import \"./register-factories.js\";\nimport { mkdirSync, openSync, writeSync, closeSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { runPoeCommand } from \"@poe-code/agent-harness-tools\";\nimport { resolveConfig } from \"./configs/resolve-config.js\";\nimport { getMcpArgs } from \"./mcp-args.js\";\nimport { stripModelNamespace } from \"./model-utils.js\";\nimport { observeAgentSpawn } from \"./observability/otel.js\";\nimport { createSpawnParallel } from \"./parallel.js\";\nimport { shouldSendPromptViaStdin } from \"./prompt-transport.js\";\nimport { createSpawnRetry } from \"./retry.js\";\nimport { resolveSpawnExecution } from \"./runtime.js\";\nimport { bridgeResourcesForRun, cleanupResourcesForRun } from \"./skill-bridge.js\";\nimport { spawnStreaming } from \"./acp/spawn.js\";\nimport {\n resolveModeConfig,\n type CliSpawnConfig,\n type McpSpawnConfig,\n type SpawnContext,\n type SpawnMode,\n type SpawnOptions,\n type SpawnResult,\n type StdinMode\n} from \"./types.js\";\n\nfunction createAbortError(): Error {\n const error = new Error(\"Agent spawn aborted\");\n error.name = \"AbortError\";\n return error;\n}\n\nexport function isActivityTimeoutError(error: unknown): boolean {\n return error instanceof Error && error.name === \"ActivityTimeoutError\";\n}\n\nexport interface BuildSpawnArgsOptions {\n prompt: string;\n model?: string;\n mode?: SpawnMode;\n args?: string[];\n mcpServers?: McpSpawnConfig;\n resumeThreadId?: string;\n cwd?: string;\n useStdin?: boolean;\n}\n\nexport interface BuildSpawnArgsResult {\n binaryName: string;\n args: string[];\n env?: Record<string, 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 getDefaultArgsPosition(config: CliSpawnConfig): \"beforePrompt\" | \"afterPrompt\" {\n return config.defaultArgsPosition ?? \"afterPrompt\";\n}\n\nfunction getMcpArgsPosition(\n config: CliSpawnConfig\n): \"beforeCommand\" | \"beforePrompt\" | \"afterCommand\" {\n if (config.mcpArgsPosition) {\n return config.mcpArgsPosition;\n }\n return config.mcpArgsBeforeCommand ? \"beforeCommand\" : \"afterCommand\";\n}\n\nfunction buildCliArgs(\n config: CliSpawnConfig,\n options: BuildSpawnArgsOptions,\n stdinMode?: StdinMode\n): { args: string[]; env?: Record<string, string> } {\n const mcpArgs = getMcpArgs(config, options.mcpServers);\n const resumeArgs = getResumeArgs(config, options);\n const defaultArgsPosition = getDefaultArgsPosition(config);\n const mcpArgsPosition = getMcpArgsPosition(config);\n const resumeArgsPosition = config.resume?.position ?? \"afterPrompt\";\n\n const args: string[] = [];\n\n if (mcpArgsPosition === \"beforeCommand\") {\n args.push(...mcpArgs);\n }\n\n if (defaultArgsPosition === \"beforePrompt\") {\n args.push(...config.defaultArgs);\n }\n\n if (mcpArgsPosition === \"beforePrompt\") {\n args.push(...mcpArgs);\n }\n\n if (stdinMode) {\n args.push(config.promptFlag);\n if (resumeArgsPosition === \"beforePrompt\") {\n args.push(...resumeArgs);\n }\n args.push(...(stdinMode.omitPrompt ? [] : [options.prompt]), ...stdinMode.extraArgs);\n } else {\n args.push(config.promptFlag);\n if (resumeArgsPosition === \"beforePrompt\") {\n args.push(...resumeArgs);\n }\n args.push(options.prompt);\n }\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 if (defaultArgsPosition === \"afterPrompt\") {\n args.push(...config.defaultArgs);\n }\n\n if (mcpArgsPosition === \"afterCommand\") {\n args.push(...mcpArgs);\n }\n\n const mode = resolveModeConfig(config.modes[options.mode ?? \"yolo\"]);\n args.push(...mode.args);\n\n if (options.args && options.args.length > 0) {\n if (resumeArgsPosition === \"afterPrompt\") {\n args.push(...resumeArgs);\n }\n args.push(...options.args);\n } else if (resumeArgsPosition === \"afterPrompt\") {\n args.push(...resumeArgs);\n }\n\n return { args, env: mode.env };\n}\n\nfunction getResumeArgs(\n config: CliSpawnConfig,\n options: Pick<BuildSpawnArgsOptions, \"resumeThreadId\" | \"cwd\">\n): string[] {\n if (!options.resumeThreadId) {\n return [];\n }\n\n if (!config.resume) {\n throw new Error(`Agent \"${config.agentId}\" does not support resumeThreadId.`);\n }\n\n return config.resume.args(options.resumeThreadId, options.cwd ?? process.cwd());\n}\n\nexport function buildSpawnArgs(\n agentId: string,\n options: BuildSpawnArgsOptions\n): BuildSpawnArgsResult {\n const { binaryName, spawnConfig } = resolveCliConfig(agentId);\n const stdinMode = shouldSendPromptViaStdin(spawnConfig, options)\n ? spawnConfig.stdinMode\n : undefined;\n const result = buildCliArgs(spawnConfig, options, stdinMode);\n return { binaryName, args: result.args, env: result.env };\n}\n\nexport async function spawn(\n agentId: string,\n options: SpawnOptions,\n context?: SpawnContext\n): Promise<SpawnResult> {\n return observeAgentSpawn(\n {\n agent: agentId,\n cwd: options.cwd,\n mode: options.mode,\n otelSink: options.otelSink,\n prompt: options.prompt\n },\n () => runSpawn(agentId, options, context)\n );\n}\n\nasync function runSpawn(\n agentId: string,\n options: SpawnOptions,\n context?: SpawnContext\n): Promise<SpawnResult> {\n if (options.signal?.aborted) {\n throw createAbortError();\n }\n\n const { agentId: resolvedId, binaryName, spawnConfig } = resolveCliConfig(agentId);\n\n const stdinMode = shouldSendPromptViaStdin(spawnConfig, options)\n ? spawnConfig.stdinMode\n : undefined;\n\n const { args: spawnArgs, env: modeEnv } = 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 cwd = options.cwd ?? process.cwd();\n const manifest = bridgeResourcesForRun(agentId, cwd, options.skills, options.hooks);\n let logFd: number | undefined;\n\n try {\n const logFilePath = resolveSpawnLogPath(options);\n logFd = logFilePath ? openSpawnLog(logFilePath) : undefined;\n\n const processEnv = modeEnv ? { ...process.env, ...modeEnv } : undefined;\n const argv = [binaryName, ...spawnArgs];\n const execution = resolveSpawnExecution({\n cwd,\n runtimeConfigCwd: options.runtimeConfigCwd,\n env: (processEnv ?? process.env) as Record<string, string>,\n argv,\n tool: resolvedId,\n runtime: {\n runtime: options.runtime,\n runtimeImage: options.runtimeImage,\n runtimeTemplate: options.runtimeTemplate,\n detach: options.detach,\n mountPoeCode: options.mountPoeCode,\n runnerSync: options.runnerSync\n },\n context,\n openSpec: {\n execution: {\n wrapForLogTee: false,\n stdin: stdinMode ? \"pipe\" : \"inherit\",\n stdout: \"pipe\",\n stderr: \"pipe\",\n env: processEnv as Record<string, string> | undefined,\n input: stdinMode ? options.prompt : undefined,\n captureOutput: true,\n activityTimeoutMs: options.activityTimeoutMs,\n onStdout(chunk: string) {\n options.tee?.stdout?.write(chunk);\n appendSpawnLog(logFd, chunk);\n },\n onStderr(chunk: string) {\n options.tee?.stderr?.write(chunk);\n appendSpawnLog(logFd, chunk);\n }\n }\n }\n });\n\n const result = await runPoeCommand({\n factory: execution.factory,\n openSpec: execution.openSpec,\n detach: execution.detach,\n state: execution.state,\n signal: options.signal\n });\n\n if (result.kind === \"detached\") {\n return {\n stdout: \"\",\n stderr: \"\",\n exitCode: 0,\n detached: { jobId: result.jobId, envId: result.envId },\n ...(logFilePath ? { logFile: logFilePath } : {})\n };\n }\n\n const captured = result as typeof result & { stdout?: string; stderr?: string };\n return {\n stdout: captured.stdout ?? \"\",\n stderr: captured.stderr ?? \"\",\n exitCode: result.exitCode,\n ...(logFilePath ? { logFile: logFilePath } : {})\n };\n } finally {\n closeSpawnLog(logFd);\n cleanupResourcesForRun(manifest);\n }\n}\n\nspawn.retry = createSpawnRetry<SpawnOptions, SpawnResult>((service, options) => {\n const handle = spawnStreaming({ ...options, agentId: service });\n return {\n events: handle.events,\n result: handle.done\n };\n});\n\nspawn.parallel = createSpawnParallel<string, SpawnOptions, SpawnResult>((service, options) => ({\n events: (async function* () {})(),\n result: spawn(service, options)\n}));\n\nfunction resolveSpawnLogPath(options: SpawnOptions): string | undefined {\n if (options.logPath) {\n return options.logPath;\n }\n if (!options.logDir || !options.logFileName) {\n return undefined;\n }\n return path.join(options.logDir, options.logFileName);\n}\n\nfunction openSpawnLog(filePath: string): number | undefined {\n try {\n mkdirSync(path.dirname(filePath), { recursive: true });\n return openSync(filePath, \"a\");\n } catch {\n return undefined;\n }\n}\n\nfunction appendSpawnLog(fd: number | undefined, chunk: string): void {\n if (fd === undefined) return;\n try {\n writeSync(fd, chunk);\n } catch {\n // ignore \u2014 logging is best-effort\n }\n}\n\nfunction closeSpawnLog(fd: number | undefined): void {\n if (fd === undefined) return;\n try {\n closeSync(fd);\n } catch {\n // ignore\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 && !config.mcpEnv) {\n throw new Error(formatUnsupportedMcpSpawnMessage(config.agentId));\n }\n if (!config.mcpArgs) {\n return [];\n }\n return config.mcpArgs(servers);\n}\n\nexport function getMcpEnv(\n config: CliSpawnConfig,\n servers?: McpSpawnConfig\n): Record<string, string> {\n if (!hasMcpServers(servers) || !config.mcpEnv) {\n return {};\n }\n return config.mcpEnv(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 type { AcpEvent } from \"./acp/types.js\";\nimport type { SpawnHandle } from \"./retry.js\";\n\nexport type SpawnParallelTuple<TService, TOptions> = readonly [\n service: TService,\n options: TOptions\n];\n\nexport type SpawnParallelThunk<TResult extends { exitCode: number }> = (\n signal?: AbortSignal\n) => SpawnHandle<TResult>;\n\nexport type SpawnParallelCall<\n TService,\n TOptions,\n TResult extends { exitCode: number }\n> = SpawnParallelTuple<TService, TOptions> | SpawnParallelThunk<TResult>;\n\nexport type SpawnParallelOptions = {\n maxConcurrent?: number;\n failFast?: boolean;\n signal?: AbortSignal;\n};\n\nexport class SpawnParallelError<TResult extends { exitCode: number }> extends Error {\n readonly index: number;\n readonly result: TResult;\n readonly results: Array<TResult | undefined>;\n\n constructor(index: number, result: TResult, results: Array<TResult | undefined>) {\n super(`spawn.parallel call ${index} failed with exit code ${result.exitCode}.`);\n this.name = \"SpawnParallelError\";\n this.index = index;\n this.result = result;\n this.results = results;\n }\n}\n\nexport function createSpawnParallel<\n TService,\n TOptions extends { signal?: AbortSignal },\n TResult extends { exitCode: number }\n>(\n spawnOnce: (service: TService, options: TOptions) => SpawnHandle<TResult>\n): (\n calls: Array<SpawnParallelCall<TService, TOptions, TResult>>,\n options?: SpawnParallelOptions\n) => Promise<TResult[]> {\n return async function parallel(calls, options = {}) {\n if (calls.length === 0) {\n return [];\n }\n\n const maxConcurrent = normalizeMaxConcurrent(options.maxConcurrent);\n const failFast = options.failFast ?? true;\n const group = new AbortController();\n const results: Array<TResult | undefined> = new Array(calls.length);\n const errors: unknown[] = [];\n let nextIndex = 0;\n let primaryFailure: unknown;\n\n const removeParentAbort = linkParentAbort(options.signal, group, (error) => {\n primaryFailure ??= error;\n });\n\n const worker = async () => {\n while (!primaryFailure) {\n const index = nextIndex;\n nextIndex += 1;\n\n if (index >= calls.length) {\n return;\n }\n\n try {\n const result = await runParallelCall(calls[index], spawnOnce, group.signal);\n results[index] = result;\n\n if (failFast && result.exitCode !== 0) {\n const error = new SpawnParallelError(index, result, results);\n primaryFailure ??= error;\n group.abort(error);\n return;\n }\n } catch (error) {\n if (failFast || group.signal.aborted) {\n primaryFailure ??= error;\n group.abort(error);\n return;\n }\n\n errors.push(error);\n }\n }\n };\n\n try {\n await Promise.allSettled(\n Array.from({ length: Math.min(maxConcurrent, calls.length) }, () => worker())\n );\n } finally {\n removeParentAbort();\n }\n\n if (primaryFailure) {\n throw primaryFailure;\n }\n\n if (errors.length > 0) {\n throw new AggregateError(errors, \"spawn.parallel failed before every call returned a result.\");\n }\n\n return results as TResult[];\n };\n}\n\nasync function runParallelCall<\n TService,\n TOptions extends { signal?: AbortSignal },\n TResult extends { exitCode: number }\n>(\n call: SpawnParallelCall<TService, TOptions, TResult>,\n spawnOnce: (service: TService, options: TOptions) => SpawnHandle<TResult>,\n signal: AbortSignal\n): Promise<TResult> {\n throwIfAborted(signal);\n\n if (typeof call === \"function\") {\n const handle = call(signal);\n const [result] = await Promise.all([handle.result, drainEvents(handle.events)]);\n return result;\n }\n\n if (!isSpawnTuple(call)) {\n throw new Error(\"spawn.parallel calls must be [service, options] tuples or spawn thunks.\");\n }\n\n const { options, cleanup } = withAbortSignal(call[1], signal);\n try {\n const handle = spawnOnce(call[0], options);\n const [result] = await Promise.all([handle.result, drainEvents(handle.events)]);\n return result;\n } finally {\n cleanup();\n }\n}\n\nasync function drainEvents(events: AsyncIterable<AcpEvent>): Promise<void> {\n for await (const ignoredEvent of events) {\n void ignoredEvent;\n // Drain the stream so streaming providers can complete while parallel returns results only.\n }\n}\n\nfunction normalizeMaxConcurrent(maxConcurrent: number | undefined): number {\n const value = maxConcurrent ?? 4;\n if (!Number.isInteger(value) || value < 1) {\n throw new Error(\"spawn.parallel maxConcurrent must be an integer greater than or equal to 1.\");\n }\n return value;\n}\n\nfunction isSpawnTuple<TService, TOptions>(\n call: SpawnParallelCall<TService, TOptions, { exitCode: number }>\n): call is SpawnParallelTuple<TService, TOptions> {\n return Array.isArray(call) && call.length === 2;\n}\n\nfunction withAbortSignal<TOptions extends { signal?: AbortSignal }>(\n options: TOptions,\n signal: AbortSignal\n): { options: TOptions; cleanup(): void } {\n if (!options.signal) {\n return {\n options: { ...options, signal },\n cleanup() {}\n };\n }\n\n const controller = new AbortController();\n const abort = () => {\n controller.abort();\n };\n\n if (signal.aborted || options.signal.aborted) {\n controller.abort();\n } else {\n signal.addEventListener(\"abort\", abort, { once: true });\n options.signal.addEventListener(\"abort\", abort, { once: true });\n }\n\n return {\n options: { ...options, signal: controller.signal },\n cleanup() {\n signal.removeEventListener(\"abort\", abort);\n options.signal?.removeEventListener(\"abort\", abort);\n }\n };\n}\n\nfunction linkParentAbort(\n parentSignal: AbortSignal | undefined,\n group: AbortController,\n setFailure: (error: Error) => void\n): () => void {\n if (!parentSignal) {\n return () => {};\n }\n\n const abort = () => {\n const error = createAbortError();\n setFailure(error);\n group.abort(error);\n };\n\n if (parentSignal.aborted) {\n abort();\n return () => {};\n }\n\n parentSignal.addEventListener(\"abort\", abort, { once: true });\n return () => parentSignal.removeEventListener(\"abort\", abort);\n}\n\nfunction throwIfAborted(signal: AbortSignal): void {\n if (signal.aborted) {\n throw createAbortError();\n }\n}\n\nfunction createAbortError(): Error {\n const error = new Error(\"Agent spawn parallel aborted\");\n error.name = \"AbortError\";\n return error;\n}\n", "import type { CliSpawnConfig } from \"./types.js\";\n\nexport function shouldSendPromptViaStdin(\n config: CliSpawnConfig,\n options: { prompt: string; useStdin?: boolean }\n): boolean {\n return !!config.stdinMode && (options.useStdin === true || options.prompt.includes(\"\\0\"));\n}\n", "import type { AcpEvent } from \"./acp/types.js\";\n\nexport type SpawnRetryOptions<TResult extends { exitCode: number }> = {\n maxAttempts: number;\n backoffMs: number;\n isRetryable?: (result: TResult) => boolean;\n};\n\nexport type SpawnHandle<TResult> = {\n events: AsyncIterable<AcpEvent>;\n result: Promise<TResult>;\n};\n\nexport type SpawnRetryFunction<\n TOptions extends { signal?: AbortSignal },\n TResult extends { exitCode: number }\n> = (\n service: string,\n options: TOptions,\n retryOptions: SpawnRetryOptions<TResult>\n) => SpawnHandle<TResult>;\n\ntype EventQueue<T> = AsyncIterable<T> & {\n push(value: T): void;\n close(): void;\n fail(error: unknown): void;\n};\n\nconst retryableExitCodes = new Set([1, 124, 125, 137]);\nconst maxBackoffMs = 30_000;\n\nexport function createSpawnRetry<\n TOptions extends { signal?: AbortSignal },\n TResult extends { exitCode: number }\n>(\n spawnOnce: (service: string, options: TOptions) => SpawnHandle<TResult>\n): SpawnRetryFunction<TOptions, TResult> {\n return (service, options, retryOptions) => {\n const normalizedRetryOptions = normalizeRetryOptions(retryOptions);\n const queue = createEventQueue<AcpEvent>();\n const result = runRetryingSpawn({\n service,\n options,\n retryOptions: normalizedRetryOptions,\n spawnOnce,\n emit: queue.push\n })\n .then((value) => {\n queue.close();\n return value;\n })\n .catch((error: unknown) => {\n queue.fail(error);\n throw error;\n });\n\n return {\n events: queue,\n result\n };\n };\n}\n\nexport function defaultIsRetryable(result: { exitCode: number }): boolean {\n return retryableExitCodes.has(result.exitCode);\n}\n\nexport function calculateBackoffMs(baseBackoffMs: number, completedAttempt: number): number {\n return Math.min(baseBackoffMs * 2 ** (completedAttempt - 1), maxBackoffMs);\n}\n\nfunction normalizeRetryOptions<TResult extends { exitCode: number }>(\n retryOptions: SpawnRetryOptions<TResult>\n): Required<SpawnRetryOptions<TResult>> {\n if (!Number.isInteger(retryOptions.maxAttempts) || retryOptions.maxAttempts < 1) {\n throw new Error(\"spawn.retry maxAttempts must be an integer greater than or equal to 1.\");\n }\n\n if (!Number.isFinite(retryOptions.backoffMs) || retryOptions.backoffMs < 0) {\n throw new Error(\"spawn.retry backoffMs must be a non-negative finite number.\");\n }\n\n return {\n maxAttempts: retryOptions.maxAttempts,\n backoffMs: retryOptions.backoffMs,\n isRetryable: retryOptions.isRetryable ?? defaultIsRetryable\n };\n}\n\nasync function runRetryingSpawn<\n TOptions extends { signal?: AbortSignal },\n TResult extends { exitCode: number }\n>(input: {\n service: string;\n options: TOptions;\n retryOptions: Required<SpawnRetryOptions<TResult>>;\n spawnOnce: (service: string, options: TOptions) => SpawnHandle<TResult>;\n emit: (event: AcpEvent) => void;\n}): Promise<TResult> {\n for (let attempt = 1; attempt <= input.retryOptions.maxAttempts; attempt += 1) {\n throwIfAborted(input.options.signal);\n\n const handle = input.spawnOnce(input.service, input.options);\n const events = forwardAttemptEvents(handle.events, attempt, input.emit);\n const result = await handle.result;\n await events;\n\n const isLastAttempt = attempt >= input.retryOptions.maxAttempts;\n if (result.exitCode === 0 || isLastAttempt || !input.retryOptions.isRetryable(result)) {\n return result;\n }\n\n const delayMs = calculateBackoffMs(input.retryOptions.backoffMs, attempt);\n input.emit(createWaitEvent(attempt, delayMs));\n await sleep(delayMs, input.options.signal);\n }\n\n throw new Error(\"spawn.retry reached an unreachable retry state.\");\n}\n\nasync function forwardAttemptEvents(\n events: AsyncIterable<AcpEvent>,\n attempt: number,\n emit: (event: AcpEvent) => void\n): Promise<void> {\n for await (const event of events) {\n emit(prefixEvent(event, attempt));\n }\n}\n\nfunction prefixEvent(event: AcpEvent, attempt: number): AcpEvent {\n const prefix = `attempt: ${attempt}`;\n\n if (event.event === \"agent_message\" || event.event === \"reasoning\") {\n return { ...event, text: `${prefix} ${event.text}` };\n }\n\n if (event.event === \"error\") {\n return { ...event, message: `${prefix} ${event.message}` };\n }\n\n if (event.event === \"tool_start\") {\n return { ...event, title: `${prefix} ${event.title}` };\n }\n\n if (event.event === \"tool_complete\") {\n return { ...event, path: `${prefix} ${event.path}` };\n }\n\n return {\n ...event,\n _meta: {\n ...(typeof event._meta === \"object\" && event._meta !== null ? event._meta : {}),\n attempt\n }\n };\n}\n\nfunction createWaitEvent(attempt: number, delayMs: number): AcpEvent {\n return {\n event: \"agent_message\",\n text: `attempt: ${attempt} wait ${delayMs}ms before retry`\n };\n}\n\nfunction sleep(delayMs: number, signal: AbortSignal | undefined): Promise<void> {\n throwIfAborted(signal);\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, delayMs);\n\n const onAbort = () => {\n clearTimeout(timeout);\n reject(createAbortError());\n };\n\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\nfunction throwIfAborted(signal: AbortSignal | undefined): void {\n if (signal?.aborted) {\n throw createAbortError();\n }\n}\n\nfunction createAbortError(): Error {\n const error = new Error(\"Agent spawn retry aborted\");\n error.name = \"AbortError\";\n return error;\n}\n\nfunction createEventQueue<T>(): EventQueue<T> {\n const values: T[] = [];\n const waiters: Array<{\n resolve(value: IteratorResult<T>): void;\n reject(error: unknown): void;\n }> = [];\n let closed = false;\n let failure: unknown;\n\n const next = (): Promise<IteratorResult<T>> => {\n if (values.length > 0) {\n return Promise.resolve({ value: values.shift() as T, done: false });\n }\n\n if (failure !== undefined) {\n return Promise.reject(failure);\n }\n\n if (closed) {\n return Promise.resolve({ value: undefined, done: true });\n }\n\n return new Promise((resolve, reject) => {\n waiters.push({ resolve, reject });\n });\n };\n\n return {\n push(value) {\n if (closed || failure !== undefined) {\n return;\n }\n\n const waiter = waiters.shift();\n if (waiter) {\n waiter.resolve({ value, done: false });\n return;\n }\n\n values.push(value);\n },\n close() {\n if (closed || failure !== undefined) {\n return;\n }\n\n closed = true;\n for (const waiter of waiters.splice(0)) {\n waiter.resolve({ value: undefined, done: true });\n }\n },\n fail(error) {\n if (closed || failure !== undefined) {\n return;\n }\n\n failure = error;\n for (const waiter of waiters.splice(0)) {\n waiter.reject(error);\n }\n },\n async *[Symbol.asyncIterator]() {\n while (true) {\n const item = await next();\n if (item.done) {\n return;\n }\n yield item.value;\n }\n }\n };\n}\n", "import crypto from \"node:crypto\";\nimport os from \"node:os\";\nimport {\n bridgeActiveSkills,\n cleanupBridgedSkills,\n type BridgeManifest\n} from \"@poe-code/agent-skill-config\";\nimport {\n bridgeHooks,\n cleanupBridgedHooks,\n type BridgeHookManifest\n} from \"@poe-code/agent-hook-config\";\nimport { logger } from \"@poe-code/design-system\";\nimport type { HookBridgeOptions } from \"./types.js\";\n\nexport interface BridgedRunManifest {\n skills?: BridgeManifest;\n hooks?: BridgeHookManifest;\n}\n\nexport function bridgeResourcesForRun(\n agentId: string,\n cwd: string,\n skills: string[] | undefined,\n hooks: HookBridgeOptions | undefined\n): BridgedRunManifest | undefined {\n if ((!skills || skills.length === 0) && !hooks) {\n return undefined;\n }\n\n const runId = crypto.randomUUID();\n const manifests: BridgedRunManifest = {};\n\n try {\n if (skills && skills.length > 0) {\n manifests.skills = bridgeActiveSkills(agentId, cwd, skills, os.homedir(), runId);\n for (const warning of manifests.skills.warnings) {\n logger.warn(warning.message);\n }\n }\n\n if (hooks) {\n manifests.hooks = bridgeHooks(hooks.from, agentId, cwd, os.homedir(), runId, {\n strategy: hooks.strategy === \"auto\" ? undefined : hooks.strategy,\n scope: hooks.scope\n });\n for (const drop of manifests.hooks.drops) {\n logger.warn(\n `Dropped bridged hook event \"${drop.source.event}\" with handler type \"${drop.source.handler.type}\": ${drop.detail}`\n );\n }\n }\n } catch (error) {\n cleanupResourcesForRun(manifests);\n throw error;\n }\n\n return manifests;\n}\n\nexport function cleanupResourcesForRun(manifest: BridgedRunManifest | undefined): void {\n if (!manifest) {\n return;\n }\n if (manifest.hooks) {\n cleanupBridgedHooks(manifest.hooks);\n }\n if (manifest.skills) {\n cleanupBridgedSkills(manifest.skills);\n }\n}\n", "import os from \"node:os\";\nimport path from \"node:path\";\nimport { resolveAgentId } from \"@poe-code/agent-defs\";\n\nexport interface AgentSkillConfig {\n globalSkillDir: string;\n localSkillDir: string;\n}\n\nexport type SkillScope = \"global\" | \"local\";\n\nconst agentSkillConfigs: Record<string, AgentSkillConfig> = {\n \"claude-code\": {\n globalSkillDir: \"~/.claude/skills\",\n localSkillDir: \".claude/skills\"\n },\n codex: {\n globalSkillDir: \"~/.codex/skills\",\n localSkillDir: \".codex/skills\"\n },\n \"gemini-cli\": {\n globalSkillDir: \"~/.gemini/skills\",\n localSkillDir: \".gemini/skills\"\n },\n opencode: {\n globalSkillDir: \"~/.config/opencode/skills\",\n localSkillDir: \".opencode/skills\"\n },\n goose: {\n globalSkillDir: \"~/.agents/skills\",\n localSkillDir: \".agents/skills\"\n }\n};\n\nexport const supportedAgents = Object.keys(agentSkillConfigs) as readonly string[];\n\nexport type AgentSupportStatus = \"supported\" | \"unsupported\" | \"unknown\";\n\nexport interface AgentSupportResult {\n status: AgentSupportStatus;\n input: string;\n id?: string;\n config?: AgentSkillConfig;\n}\n\nexport function resolveAgentSupport(\n input: string,\n registry: Record<string, AgentSkillConfig> = agentSkillConfigs\n): AgentSupportResult {\n const resolvedId = resolveAgentId(input);\n if (!resolvedId) {\n return { status: \"unknown\", input };\n }\n\n const config = registry[resolvedId];\n if (!config) {\n return { status: \"unsupported\", input, id: resolvedId };\n }\n\n return { status: \"supported\", input, id: resolvedId, config };\n}\n\nexport function getAgentConfig(agentId: string): AgentSkillConfig | undefined {\n const support = resolveAgentSupport(agentId);\n return support.status === \"supported\" ? support.config : undefined;\n}\n\nfunction expandHome(targetPath: string, homeDir: string = os.homedir()): string {\n if (!targetPath?.startsWith(\"~\")) {\n return targetPath;\n }\n\n if (targetPath === \"~\") {\n return homeDir;\n }\n\n // Handle ~./ -> ~/.\n if (targetPath.startsWith(\"~./\")) {\n targetPath = `~/.${targetPath.slice(3)}`;\n }\n\n let remainder = targetPath.slice(1);\n if (remainder.startsWith(\"/\") || remainder.startsWith(\"\\\\\")) {\n remainder = remainder.slice(1);\n } else if (remainder.startsWith(\".\")) {\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\nexport function resolveSkillDir(\n config: AgentSkillConfig,\n scope: SkillScope,\n cwd: string,\n homeDir?: string\n): string {\n if (scope === \"global\") {\n return path.resolve(expandHome(config.globalSkillDir, homeDir));\n }\n\n return path.resolve(cwd, config.localSkillDir);\n}\n", "import { readFile, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { TemplateLoader } from \"@poe-code/config-mutations\";\n\nconst TEMPLATE_IDS = [\"poe-generate.md\", \"terminal-pilot.md\"] as const;\ntype TemplateId = (typeof TEMPLATE_IDS)[number];\n\nconst cache = new Map<TemplateId, string>();\n\nasync function pathExists(target: string): Promise<boolean> {\n try {\n await stat(target);\n return true;\n } catch (error) {\n if (error && typeof error === \"object\" && \"code\" in error && error.code === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n}\n\nasync function findPackageRoot(entryFilePath: string): Promise<string> {\n let current = path.dirname(entryFilePath);\n while (true) {\n if (await pathExists(path.join(current, \"package.json\"))) {\n return current;\n }\n const parent = path.dirname(current);\n if (parent === current) {\n throw new Error(\"Unable to locate package root for agent-skill-config templates.\");\n }\n current = parent;\n }\n}\n\nasync function resolveTemplatePath(templateId: TemplateId): Promise<string> {\n const packageRoot = await findPackageRoot(fileURLToPath(import.meta.url));\n const candidates = [\n path.join(packageRoot, \"src\", \"templates\", templateId),\n path.join(packageRoot, \"dist\", \"templates\", templateId),\n path.join(packageRoot, \"dist\", \"templates\", \"skill\", templateId)\n ];\n\n for (const candidate of candidates) {\n if (await pathExists(candidate)) {\n return candidate;\n }\n }\n\n throw new Error(`Template not found: ${templateId}`);\n}\n\nfunction isKnownTemplate(templateId: string): templateId is TemplateId {\n return (TEMPLATE_IDS as readonly string[]).includes(templateId);\n}\n\nexport async function loadTemplate(templateId: string): Promise<string> {\n if (!isKnownTemplate(templateId)) {\n throw new Error(`Template not found: ${templateId}`);\n }\n\n const cached = cache.get(templateId);\n if (cached !== undefined) {\n return cached;\n }\n\n const resolved = await resolveTemplatePath(templateId);\n const content = await readFile(resolved, \"utf8\");\n cache.set(templateId, content);\n return content;\n}\n\nexport function createTemplateLoader(): TemplateLoader {\n return loadTemplate;\n}\n", "import { statSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { getAgentConfig, resolveAgentSupport, resolveSkillDir } from \"./configs.js\";\n\nexport interface SkillSource {\n kind: \"resolved\";\n ref: string;\n name: string;\n sourceAgentId?: string;\n sourcePath: string;\n scope: \"project\" | \"user\";\n}\n\nexport type SkillResolutionFailure =\n | { kind: \"malformed\"; ref: string }\n | { kind: \"unknown-agent\"; ref: string; agentInput: string }\n | { kind: \"not-found\"; ref: string; searchedPaths: string[] };\n\nexport type SkillResolution = SkillSource | SkillResolutionFailure;\n\ninterface SearchTier {\n scope: \"project\" | \"user\";\n sourcePath: string;\n}\n\nfunction isMalformedSegment(segment: string): boolean {\n return segment.length === 0 || segment !== segment.trim();\n}\n\nfunction isDirectory(targetPath: string): boolean {\n try {\n return statSync(targetPath).isDirectory();\n } catch {\n return false;\n }\n}\n\nfunction findSkill(\n ref: string,\n name: string,\n tiers: SearchTier[],\n sourceAgentId?: string\n): SkillResolution {\n for (const tier of tiers) {\n if (isDirectory(tier.sourcePath)) {\n return {\n kind: \"resolved\",\n ref,\n name,\n ...(sourceAgentId ? { sourceAgentId } : {}),\n sourcePath: tier.sourcePath,\n scope: tier.scope\n };\n }\n }\n\n return {\n kind: \"not-found\",\n ref,\n searchedPaths: tiers.map((tier) => tier.sourcePath)\n };\n}\n\nexport function resolveSkillReference(ref: string, cwd: string, homeDir: string): SkillResolution {\n const slashIndex = ref.indexOf(\"/\");\n const hasPrefix = slashIndex !== -1;\n\n if (\n ref.length === 0 ||\n ref !== ref.trim() ||\n (hasPrefix && ref.indexOf(\"/\", slashIndex + 1) !== -1)\n ) {\n return { kind: \"malformed\", ref };\n }\n\n if (!hasPrefix) {\n if (isMalformedSegment(ref)) {\n return { kind: \"malformed\", ref };\n }\n\n const tiers: SearchTier[] = [\n {\n scope: \"project\",\n sourcePath: path.resolve(cwd, \".poe-code/skills\", ref)\n },\n {\n scope: \"user\",\n sourcePath: path.resolve(homeDir, \".poe-code/skills\", ref)\n }\n ];\n\n return findSkill(ref, ref, tiers);\n }\n\n const agentInput = ref.slice(0, slashIndex);\n const name = ref.slice(slashIndex + 1);\n if (isMalformedSegment(agentInput) || isMalformedSegment(name)) {\n return { kind: \"malformed\", ref };\n }\n\n const support = resolveAgentSupport(agentInput);\n if (support.status !== \"supported\" || !support.id) {\n return { kind: \"unknown-agent\", ref, agentInput };\n }\n\n const config = getAgentConfig(support.id);\n if (!config) {\n return { kind: \"unknown-agent\", ref, agentInput };\n }\n\n const tiers: SearchTier[] = [\n {\n scope: \"project\",\n sourcePath: path.resolve(resolveSkillDir(config, \"local\", cwd), name)\n },\n {\n scope: \"user\",\n sourcePath: path.resolve(resolveSkillDir(config, \"global\", cwd, homeDir), name)\n }\n ];\n\n return findSkill(ref, name, tiers, support.id);\n}\n", "import { execFileSync } from \"node:child_process\";\nimport * as fs from \"node:fs\";\nimport path from \"node:path\";\n\nexport type GitDirRunner = (cwd: string) => string | undefined;\n\nconst defaultMarkerPrefix = \"poe-code-spawn-skills\";\n\nfunction defaultGitDirRunner(cwd: string): string | undefined {\n try {\n return execFileSync(\"git\", [\"rev-parse\", \"--git-dir\"], {\n cwd,\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"]\n }).trim();\n } catch {\n return undefined;\n }\n}\n\nlet gitDirRunner: GitDirRunner = defaultGitDirRunner;\n\nexport function setGitDirRunnerForTest(runner: GitDirRunner): () => void {\n const previous = gitDirRunner;\n gitDirRunner = runner;\n return () => {\n gitDirRunner = previous;\n };\n}\n\nfunction resolveExcludePath(cwd: string): string | undefined {\n const gitDir = gitDirRunner(cwd);\n if (gitDir === undefined || gitDir.length === 0) {\n return undefined;\n }\n\n return path.join(path.isAbsolute(gitDir) ? gitDir : path.resolve(cwd, gitDir), \"info/exclude\");\n}\n\nfunction markers(runId: string, markerPrefix: string): { begin: string; end: string } {\n return {\n begin: `# ${markerPrefix}:${runId} begin`,\n end: `# ${markerPrefix}:${runId} end`\n };\n}\n\nfunction readExcludeFile(excludePath: string): string | undefined {\n try {\n return fs.readFileSync(excludePath, \"utf8\");\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error;\n}\n\nfunction removeBlock(content: string, runId: string, markerPrefix: string): string {\n const { begin, end } = markers(runId, markerPrefix);\n const lines = content.split(\"\\n\");\n const result: string[] = [];\n\n for (let index = 0; index < lines.length; index += 1) {\n if (lines[index] === begin) {\n const endIndex = lines.indexOf(end, index + 1);\n if (endIndex !== -1) {\n index = endIndex;\n continue;\n }\n }\n\n result.push(lines[index]);\n }\n\n return result.join(\"\\n\");\n}\n\nfunction appendBlock(\n content: string | undefined,\n runId: string,\n entries: string[],\n markerPrefix: string\n): string {\n const { begin, end } = markers(runId, markerPrefix);\n const existing = content ?? \"\";\n const prefix = existing.length === 0 || existing.endsWith(\"\\n\") ? existing : `${existing}\\n`;\n return `${prefix}${[begin, ...entries, end, \"\"].join(\"\\n\")}`;\n}\n\nexport function appendExcludeBlock(\n cwd: string,\n runId: string,\n entries: string[],\n opts?: { markerPrefix?: string }\n): void {\n const excludePath = resolveExcludePath(cwd);\n if (excludePath === undefined) {\n return;\n }\n\n fs.mkdirSync(path.dirname(excludePath), { recursive: true });\n const content = readExcludeFile(excludePath);\n fs.writeFileSync(\n excludePath,\n appendBlock(content, runId, entries, opts?.markerPrefix ?? defaultMarkerPrefix),\n \"utf8\"\n );\n}\n\nexport function removeExcludeBlock(\n cwd: string,\n runId: string,\n opts?: { markerPrefix?: string }\n): void {\n const excludePath = resolveExcludePath(cwd);\n if (excludePath === undefined) {\n return;\n }\n\n const content = readExcludeFile(excludePath);\n if (content === undefined) {\n return;\n }\n\n fs.writeFileSync(\n excludePath,\n removeBlock(content, runId, opts?.markerPrefix ?? defaultMarkerPrefix),\n \"utf8\"\n );\n}\n", "import * as fs from \"node:fs\";\nimport path from \"node:path\";\nimport {\n getAgentConfig,\n resolveAgentSupport,\n resolveSkillDir,\n supportedAgents\n} from \"./configs.js\";\nimport { appendExcludeBlock, removeExcludeBlock } from \"./git-exclude.js\";\nimport { resolveSkillReference, type SkillResolutionFailure } from \"./resolve-skill-reference.js\";\n\nexport interface BridgeEntry {\n ref: string;\n sourcePath: string;\n targetPath: string;\n createdParents: string[];\n}\n\nexport type BridgeWarningKind =\n | \"local-collision\"\n | \"global-collision\"\n | \"self-reference\"\n | \"intra-batch-collision\";\n\nexport interface BridgeWarning {\n kind: BridgeWarningKind;\n ref: string;\n sourcePath: string;\n conflictingPath: string;\n message: string;\n}\n\nexport interface BridgeManifest {\n spawnAgentId: string;\n cwd: string;\n runId: string;\n entries: BridgeEntry[];\n warnings: BridgeWarning[];\n}\n\ntype ResolvedSkill = Extract<ReturnType<typeof resolveSkillReference>, { kind: \"resolved\" }>;\n\ninterface ResolvedBridgeSource {\n ref: string;\n source: ResolvedSkill;\n targetPath: string;\n globalTargetPath: string;\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error;\n}\n\nfunction pathExists(targetPath: string): boolean {\n try {\n fs.statSync(targetPath);\n return true;\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n}\n\nfunction isDirectory(targetPath: string): boolean {\n try {\n return fs.statSync(targetPath).isDirectory();\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n}\n\nfunction formatResolutionFailureError(failures: SkillResolutionFailure[]): Error {\n const malformed = failures.filter((failure) => failure.kind === \"malformed\");\n const unknownAgent = failures.filter((failure) => failure.kind === \"unknown-agent\");\n const notFound = failures.filter((failure) => failure.kind === \"not-found\");\n const lines = [\n `Failed to bridge active skills: ${failures.length} skill reference(s) could not be resolved.`\n ];\n\n if (malformed.length > 0) {\n lines.push(\"\", \"Malformed skill references:\");\n for (const failure of malformed) {\n lines.push(`- ${failure.ref}`);\n }\n lines.push('Expected syntax: \"<name>\" or \"<agentId>/<name>\".');\n }\n\n if (unknownAgent.length > 0) {\n lines.push(\"\", \"Unknown agent references:\");\n for (const failure of unknownAgent) {\n lines.push(`- ${failure.ref} (agent token: ${failure.agentInput})`);\n }\n lines.push(`Supported agents: ${supportedAgents.join(\", \")}.`);\n }\n\n if (notFound.length > 0) {\n lines.push(\"\", \"Not found skill references.\");\n for (const failure of notFound) {\n lines.push(`- ${failure.ref}`);\n lines.push(\" searched paths:\");\n for (const searchedPath of failure.searchedPaths) {\n lines.push(` - ${searchedPath}`);\n }\n }\n }\n\n return new Error(lines.join(\"\\n\"));\n}\n\nfunction copyDirectory(sourcePath: string, targetPath: string): void {\n fs.mkdirSync(targetPath, { recursive: true });\n for (const dirent of fs.readdirSync(sourcePath, { withFileTypes: true })) {\n const childSource = path.join(sourcePath, dirent.name);\n const childTarget = path.join(targetPath, dirent.name);\n\n if (dirent.isDirectory()) {\n copyDirectory(childSource, childTarget);\n continue;\n }\n\n if (dirent.isFile()) {\n fs.copyFileSync(childSource, childTarget);\n }\n }\n}\n\nfunction collectMissingParents(targetPath: string): string[] {\n const parents: string[] = [];\n let current = path.dirname(targetPath);\n\n while (!pathExists(current)) {\n parents.push(current);\n const parent = path.dirname(current);\n if (parent === current) {\n break;\n }\n current = parent;\n }\n\n return parents.reverse();\n}\n\nfunction removeDirectoryIfEmpty(targetPath: string): void {\n try {\n fs.rmdirSync(targetPath);\n } catch (error) {\n if (\n isNodeError(error) &&\n (error.code === \"ENOENT\" || error.code === \"ENOTEMPTY\" || error.code === \"EEXIST\")\n ) {\n return;\n }\n throw error;\n }\n}\n\nfunction removeTarget(targetPath: string): void {\n fs.rmSync(targetPath, { recursive: true, force: true });\n}\n\nfunction toCwdRelative(cwd: string, targetPath: string): string {\n return path.relative(cwd, targetPath);\n}\n\nfunction warning(\n kind: BridgeWarningKind,\n ref: string,\n sourcePath: string,\n conflictingPath: string\n): BridgeWarning {\n const messages: Record<BridgeWarningKind, string> = {\n \"intra-batch-collision\": `Skipping ${ref}: an earlier bridged skill already targets ${conflictingPath}.`,\n \"local-collision\": `Skipping ${ref}: local skill already exists at ${conflictingPath}.`,\n \"global-collision\": `Skipping ${ref}: global skill already exists at ${conflictingPath}.`,\n \"self-reference\": `Skipping ${ref}: spawning agent already sees this native skill at ${conflictingPath}.`\n };\n\n return {\n kind,\n ref,\n sourcePath,\n conflictingPath,\n message: messages[kind]\n };\n}\n\nexport function bridgeActiveSkills(\n spawnAgentId: string,\n cwd: string,\n refs: string[],\n homeDir: string,\n runId: string\n): BridgeManifest {\n const spawnConfig = getAgentConfig(spawnAgentId);\n const spawnSupport = resolveAgentSupport(spawnAgentId);\n if (!spawnConfig || spawnSupport.status !== \"supported\" || !spawnSupport.id) {\n throw new Error(\n `Unsupported spawn agent \"${spawnAgentId}\". Supported agents: ${supportedAgents.join(\", \")}.`\n );\n }\n\n const targetDir = resolveSkillDir(spawnConfig, \"local\", cwd);\n const globalTargetDir = resolveSkillDir(spawnConfig, \"global\", cwd, homeDir);\n const resolutions = refs.map((ref) => resolveSkillReference(ref, cwd, homeDir));\n const failures = resolutions.filter(\n (resolution): resolution is SkillResolutionFailure => resolution.kind !== \"resolved\"\n );\n if (failures.length > 0) {\n throw formatResolutionFailureError(failures);\n }\n\n const sources: ResolvedBridgeSource[] = resolutions.map((source, index) => ({\n ref: refs[index]!,\n source: source as ResolvedSkill,\n targetPath: path.resolve(targetDir, (source as ResolvedSkill).name),\n globalTargetPath: path.resolve(globalTargetDir, (source as ResolvedSkill).name)\n }));\n\n const entries: BridgeEntry[] = [];\n const warnings: BridgeWarning[] = [];\n const claimedTargets = new Set<string>();\n\n for (const item of sources) {\n if (claimedTargets.has(item.targetPath)) {\n warnings.push(\n warning(\"intra-batch-collision\", item.ref, item.source.sourcePath, item.targetPath)\n );\n continue;\n }\n\n if (item.source.sourceAgentId === spawnSupport.id) {\n warnings.push(\n warning(\"self-reference\", item.ref, item.source.sourcePath, item.source.sourcePath)\n );\n continue;\n }\n\n if (pathExists(item.targetPath)) {\n warnings.push(warning(\"local-collision\", item.ref, item.source.sourcePath, item.targetPath));\n continue;\n }\n\n if (isDirectory(item.globalTargetPath)) {\n warnings.push(\n warning(\"global-collision\", item.ref, item.source.sourcePath, item.globalTargetPath)\n );\n continue;\n }\n\n const createdParents = collectMissingParents(item.targetPath);\n fs.mkdirSync(path.dirname(item.targetPath), { recursive: true });\n copyDirectory(item.source.sourcePath, item.targetPath);\n claimedTargets.add(item.targetPath);\n entries.push({\n ref: item.ref,\n sourcePath: item.source.sourcePath,\n targetPath: item.targetPath,\n createdParents\n });\n }\n\n if (entries.length > 0) {\n appendExcludeBlock(\n cwd,\n runId,\n entries.map((entry) => toCwdRelative(cwd, entry.targetPath))\n );\n }\n\n return {\n spawnAgentId,\n cwd,\n runId,\n entries,\n warnings\n };\n}\n\nexport function cleanupBridgedSkills(manifest: BridgeManifest): void {\n for (const entry of manifest.entries) {\n removeTarget(entry.targetPath);\n for (const parent of [...entry.createdParents].reverse()) {\n removeDirectoryIfEmpty(parent);\n }\n }\n\n removeExcludeBlock(manifest.cwd, manifest.runId);\n}\n", "import os from \"node:os\";\nimport path from \"node:path\";\nimport { resolveAgentId } from \"@poe-code/agent-defs\";\n\nexport type HookFormat = \"claude-settings-json\" | \"codex-hooks-json\" | \"codex-config-toml\";\n\nexport type HookEvent =\n | \"SessionStart\"\n | \"SessionEnd\"\n | \"UserPromptSubmit\"\n | \"PreToolUse\"\n | \"PostToolUse\"\n | \"PermissionRequest\"\n | \"Stop\"\n | \"StopFailure\"\n | \"Notification\"\n | \"PreCompact\"\n | \"PostCompact\"\n | \"SubagentStart\"\n | \"SubagentStop\";\n\nexport type HookHandlerType = \"command\" | \"http\" | \"mcp_tool\" | \"prompt\" | \"agent\";\n\nexport interface AgentHookConfig {\n /** File where this agent reads hooks. Supports `~` expansion. */\n globalHookPath: string;\n /** Project-relative path, may be undefined for agents without project scope. */\n localHookPath?: string;\n format: HookFormat;\n /** Events the agent honors. Anything outside this set is dropped at bridge time. */\n supportedEvents: readonly HookEvent[];\n /** Handler types the agent executes. Anything outside this set is dropped. */\n supportedHandlerTypes: readonly HookHandlerType[];\n /**\n * Placeholders the agent recognizes. Bridge consults the source-agent\n * placeholder list to identify tokens that need rewriting and the\n * target-agent list as the canonical destination form.\n */\n placeholders: {\n /** Maps abstract token \u2192 concrete substring the agent recognizes. */\n projectDir: string;\n pluginRoot?: string;\n pluginData?: string;\n };\n}\n\nexport type HookScope = \"global\" | \"local\";\n\nconst agentHookConfigs: Record<string, AgentHookConfig> = {\n \"claude-code\": {\n globalHookPath: \"~/.claude/settings.json\",\n localHookPath: \".claude/settings.json\",\n format: \"claude-settings-json\",\n supportedEvents: [\n \"SessionStart\",\n \"SessionEnd\",\n \"UserPromptSubmit\",\n \"PreToolUse\",\n \"PostToolUse\",\n \"PermissionRequest\",\n \"Stop\",\n \"StopFailure\",\n \"Notification\",\n \"PreCompact\",\n \"PostCompact\",\n \"SubagentStart\",\n \"SubagentStop\"\n ],\n supportedHandlerTypes: [\"command\", \"http\", \"mcp_tool\", \"prompt\", \"agent\"],\n placeholders: {\n projectDir: \"${CLAUDE_PROJECT_DIR}\",\n pluginRoot: \"${CLAUDE_PLUGIN_ROOT}\",\n pluginData: \"${CLAUDE_PLUGIN_DATA}\"\n }\n },\n codex: {\n globalHookPath: \"~/.codex/hooks.json\",\n localHookPath: \".codex/hooks.json\",\n format: \"codex-hooks-json\",\n supportedEvents: [\n \"SessionStart\",\n \"UserPromptSubmit\",\n \"PreToolUse\",\n \"PostToolUse\",\n \"PermissionRequest\",\n \"Stop\"\n ],\n supportedHandlerTypes: [\"command\"],\n placeholders: {\n projectDir: \"$(git rev-parse --show-toplevel)\",\n pluginRoot: \"$PLUGIN_ROOT\",\n pluginData: \"$PLUGIN_DATA\"\n }\n }\n};\n\nexport const supportedHookAgents = Object.keys(agentHookConfigs) as readonly string[];\n\nexport type AgentSupportStatus = \"supported\" | \"unsupported\" | \"unknown\";\n\nexport interface AgentSupportResult {\n status: AgentSupportStatus;\n input: string;\n id?: string;\n config?: AgentHookConfig;\n}\n\nexport function resolveAgentSupport(\n input: string,\n registry: Record<string, AgentHookConfig> = agentHookConfigs\n): AgentSupportResult {\n const resolvedId = resolveAgentId(input);\n if (!resolvedId) {\n return { status: \"unknown\", input };\n }\n\n const config = registry[resolvedId];\n if (!config) {\n return { status: \"unsupported\", input, id: resolvedId };\n }\n\n return { status: \"supported\", input, id: resolvedId, config };\n}\n\nexport function getAgentConfig(agentId: string): AgentHookConfig | undefined {\n const support = resolveAgentSupport(agentId);\n return support.status === \"supported\" ? support.config : undefined;\n}\n\nfunction expandHome(targetPath: string, homeDir: string = os.homedir()): string {\n if (!targetPath?.startsWith(\"~\")) {\n return targetPath;\n }\n\n if (targetPath === \"~\") {\n return homeDir;\n }\n\n if (targetPath.startsWith(\"~./\")) {\n targetPath = `~/.${targetPath.slice(3)}`;\n }\n\n let remainder = targetPath.slice(1);\n if (remainder.startsWith(\"/\") || remainder.startsWith(\"\\\\\")) {\n remainder = remainder.slice(1);\n } else if (remainder.startsWith(\".\")) {\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\nexport function resolveHookPath(\n config: AgentHookConfig,\n scope: HookScope,\n cwd: string,\n homeDir?: string\n): string | undefined {\n if (scope === \"global\") {\n return path.resolve(expandHome(config.globalHookPath, homeDir));\n }\n\n return config.localHookPath ? path.resolve(cwd, config.localHookPath) : undefined;\n}\n", "import { readFileSync } from \"node:fs\";\nimport path from \"node:path\";\n\nexport interface SourceHookEntry {\n event: string;\n matcher?: string;\n handler: {\n type: string;\n command?: string;\n args?: string[];\n url?: string;\n headers?: Record<string, string>;\n server?: string;\n tool?: string;\n input?: Record<string, unknown>;\n prompt?: string;\n model?: string;\n timeout?: number;\n statusMessage?: string;\n if?: string;\n once?: boolean;\n shell?: string;\n };\n}\n\nexport interface HookReadResult {\n entries: SourceHookEntry[];\n /** Paths actually read, in order. Empty when no source files existed. */\n readPaths: string[];\n}\n\ninterface ClaudeMatcherGroup {\n matcher?: string;\n hooks: SourceHookEntry[\"handler\"][];\n}\n\ninterface ClaudeSettings {\n hooks?: Record<string, ClaudeMatcherGroup[]>;\n}\n\nfunction readSettingsFile(filePath: string): ClaudeSettings | undefined {\n let content: string;\n\n try {\n content = readFileSync(filePath, \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return undefined;\n }\n\n throw error;\n }\n\n try {\n return JSON.parse(content) as ClaudeSettings;\n } catch (error) {\n throw new Error(`Malformed JSON in ${filePath}`, { cause: error });\n }\n}\n\nexport function readClaudeHooks(\n cwd: string,\n homeDir: string,\n opts?: { scope?: \"project\" | \"user\" | \"merged\" }\n): HookReadResult {\n const projectPath = path.resolve(cwd, \".claude/settings.json\");\n const userPath = path.resolve(homeDir, \".claude/settings.json\");\n const scope = opts?.scope ?? \"merged\";\n const sourcePaths =\n scope === \"project\" ? [projectPath] : scope === \"user\" ? [userPath] : [userPath, projectPath];\n const result: HookReadResult = { entries: [], readPaths: [] };\n\n for (const sourcePath of sourcePaths) {\n const settings = readSettingsFile(sourcePath);\n if (settings === undefined) {\n continue;\n }\n\n result.readPaths.push(sourcePath);\n\n for (const [event, groups] of Object.entries(settings.hooks ?? {})) {\n for (const group of groups) {\n for (const handler of group.hooks) {\n result.entries.push({ event, matcher: group.matcher, handler });\n }\n }\n }\n }\n\n return result;\n}\n", "import {\n getAgentConfig,\n supportedHookAgents,\n type AgentHookConfig,\n type HookEvent,\n type HookHandlerType\n} from \"./configs.js\";\n\nexport interface EventMapping {\n /** Source event name as written by the source agent. */\n sourceEvent: string;\n /** Target event name. `null` means \"drop this hook entirely\". */\n targetEvent: HookEvent | null;\n /** Human-readable reason used in drop warnings. */\n dropReason?: string;\n}\n\nexport interface HandlerTypeRule {\n sourceType: string;\n allowed: boolean;\n dropReason?: string;\n}\n\nexport interface PlaceholderRewrite {\n /** Source placeholder, matched as an exact substring. */\n from: string;\n /** Target placeholder, substituted as an exact substring. */\n to: string;\n}\n\ntype PlaceholderKey = keyof AgentHookConfig[\"placeholders\"];\n\nfunction requireAgentConfig(agentId: string): AgentHookConfig {\n const config = getAgentConfig(agentId);\n if (!config) {\n throw new Error(`Unknown hook agent \"${agentId}\"`);\n }\n\n return config;\n}\n\nexport function getEventMappings(sourceAgentId: string, targetAgentId: string): EventMapping[] {\n const source = requireAgentConfig(sourceAgentId);\n const target = requireAgentConfig(targetAgentId);\n\n return source.supportedEvents.map((sourceEvent) => {\n if (target.supportedEvents.includes(sourceEvent)) {\n return { sourceEvent, targetEvent: sourceEvent };\n }\n\n return {\n sourceEvent,\n targetEvent: null,\n dropReason: `${targetAgentId} has no ${sourceEvent} hook`\n };\n });\n}\n\nexport function getHandlerTypeRules(targetAgentId: string): HandlerTypeRule[] {\n const target = requireAgentConfig(targetAgentId);\n const registeredTypes = supportedHookAgents.flatMap(\n (agentId) => requireAgentConfig(agentId).supportedHandlerTypes\n );\n const sourceTypes = [...new Set<HookHandlerType>(registeredTypes)];\n const supportedTypes = target.supportedHandlerTypes\n .map((handlerType) => `\"${handlerType}\"`)\n .join(\", \");\n\n return sourceTypes.map((sourceType) => {\n if (target.supportedHandlerTypes.includes(sourceType)) {\n return { sourceType, allowed: true };\n }\n\n return {\n sourceType,\n allowed: false,\n dropReason: `${targetAgentId} only honors handlers of type ${supportedTypes}`\n };\n });\n}\n\nexport function getPlaceholderRewrites(\n sourceAgentId: string,\n targetAgentId: string\n): PlaceholderRewrite[] {\n const source = requireAgentConfig(sourceAgentId);\n const target = requireAgentConfig(targetAgentId);\n\n return (Object.keys(source.placeholders) as PlaceholderKey[]).flatMap((key) => {\n const from = source.placeholders[key];\n const to = target.placeholders[key];\n\n if (!from || !to || from === to) {\n return [];\n }\n\n return [{ from, to }];\n });\n}\n", "import type { HookEvent } from \"./configs.js\";\nimport {\n getEventMappings,\n getHandlerTypeRules,\n getPlaceholderRewrites,\n type PlaceholderRewrite\n} from \"./event-mapping.js\";\nimport type { SourceHookEntry } from \"./read-hooks.js\";\n\nexport interface GeneratedHookEntry {\n event: HookEvent;\n matcher?: string;\n handler: {\n type: \"command\";\n command: string;\n args?: string[];\n timeout?: number;\n statusMessage: string;\n };\n /** Stable id derived from the source so two transform runs yield the same id for the same source entry. */\n generatedId: string;\n}\n\nexport interface HookDrop {\n reason: \"unsupported-event\" | \"unsupported-handler-type\";\n detail: string;\n source: SourceHookEntry;\n}\n\nexport interface TransformResult {\n entries: GeneratedHookEntry[];\n drops: HookDrop[];\n}\n\nfunction applyPlaceholderRewrites(value: string, rewrites: PlaceholderRewrite[]): string {\n return rewrites.reduce((rewrittenValue, rewrite) => {\n return rewrittenValue.replaceAll(rewrite.from, rewrite.to);\n }, value);\n}\n\nexport function transformHooks(\n source: SourceHookEntry[],\n sourceAgentId: string,\n targetAgentId: string,\n opts: { runId: string }\n): TransformResult {\n const eventMappings = getEventMappings(sourceAgentId, targetAgentId);\n const handlerRules = getHandlerTypeRules(targetAgentId);\n const placeholderRewrites = getPlaceholderRewrites(sourceAgentId, targetAgentId);\n const result: TransformResult = { entries: [], drops: [] };\n\n for (const sourceEntry of source) {\n const eventMapping = eventMappings.find((mapping) => mapping.sourceEvent === sourceEntry.event);\n if (!eventMapping || eventMapping.targetEvent === null) {\n result.drops.push({\n reason: \"unsupported-event\",\n detail: eventMapping?.dropReason ?? `${targetAgentId} has no ${sourceEntry.event} hook`,\n source: sourceEntry\n });\n continue;\n }\n\n const handlerRule = handlerRules.find((rule) => rule.sourceType === sourceEntry.handler.type);\n if (!handlerRule?.allowed) {\n result.drops.push({\n reason: \"unsupported-handler-type\",\n detail: `Unsupported handler type \"${sourceEntry.handler.type}\": ${handlerRule?.dropReason ?? `${targetAgentId} does not honor it`}`,\n source: sourceEntry\n });\n continue;\n }\n\n const handler: GeneratedHookEntry[\"handler\"] = {\n type: \"command\",\n command: applyPlaceholderRewrites(sourceEntry.handler.command ?? \"\", placeholderRewrites),\n statusMessage: `[generated:${opts.runId}] ${sourceEntry.handler.statusMessage ?? \"\"}`\n };\n\n if (sourceEntry.handler.args !== undefined) {\n handler.args = sourceEntry.handler.args.map((arg) =>\n applyPlaceholderRewrites(arg, placeholderRewrites)\n );\n }\n if (sourceEntry.handler.timeout !== undefined) {\n handler.timeout = sourceEntry.handler.timeout;\n }\n\n result.entries.push({\n event: eventMapping.targetEvent,\n matcher: sourceEntry.matcher,\n handler,\n generatedId: `generated-${opts.runId}-${result.entries.length}`\n });\n }\n\n return result;\n}\n", "import { mkdirSync, readFileSync, renameSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport type { SourceHookEntry } from \"./read-hooks.js\";\nimport type { GeneratedHookEntry } from \"./transform-hooks.js\";\n\nexport interface WriteResult {\n path: string;\n fileCreated: boolean;\n previousGeneratedRemoved: number;\n generatedWritten: number;\n}\n\ninterface CodexMatcherGroup {\n matcher?: string;\n hooks: SourceHookEntry[\"handler\"][];\n}\n\ninterface CodexHooksFile {\n hooks?: Record<string, CodexMatcherGroup[]>;\n}\n\nfunction isGeneratedHandler(handler: SourceHookEntry[\"handler\"]): boolean {\n return handler.statusMessage?.startsWith(\"[generated:\") ?? false;\n}\n\nfunction parseHooksFile(targetPath: string): { file: CodexHooksFile; fileCreated: boolean } {\n let content: string;\n\n try {\n content = readFileSync(targetPath, \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return { file: { hooks: {} }, fileCreated: true };\n }\n\n throw error;\n }\n\n try {\n return { file: JSON.parse(content) as CodexHooksFile, fileCreated: false };\n } catch (error) {\n throw new Error(`Malformed JSON in ${targetPath}`, { cause: error });\n }\n}\n\nfunction validateEntries(entries: GeneratedHookEntry[]): void {\n for (const entry of entries) {\n if (!isGeneratedHandler(entry.handler)) {\n throw new Error(\n `Generated hook entry \"${entry.generatedId}\" has statusMessage that must start with \"[generated:\"`\n );\n }\n }\n}\n\nfunction removeGeneratedHandlers(file: CodexHooksFile): number {\n let removed = 0;\n const hooks = file.hooks ?? (file.hooks = {});\n\n for (const [event, groups] of Object.entries(hooks)) {\n hooks[event] = groups.filter((group) => {\n const initialCount = group.hooks.length;\n const remainingHandlers = group.hooks.filter((handler) => {\n if (isGeneratedHandler(handler)) {\n removed += 1;\n return false;\n }\n\n return true;\n });\n\n group.hooks = remainingHandlers;\n return group.hooks.length > 0 || group.hooks.length === initialCount;\n });\n }\n\n return removed;\n}\n\nfunction appendEntries(file: CodexHooksFile, entries: GeneratedHookEntry[]): void {\n const hooks = file.hooks ?? (file.hooks = {});\n\n for (const entry of entries) {\n const groups = hooks[entry.event] ?? (hooks[entry.event] = []);\n let group = groups.find((candidate) => candidate.matcher === entry.matcher);\n\n if (!group) {\n group = entry.matcher === undefined ? { hooks: [] } : { matcher: entry.matcher, hooks: [] };\n groups.push(group);\n }\n\n group.hooks.push(entry.handler);\n }\n}\n\nexport function writeCodexHooks(\n targetPath: string,\n entries: GeneratedHookEntry[],\n _runId: string\n): WriteResult {\n const { file, fileCreated } = parseHooksFile(targetPath);\n validateEntries(entries);\n const previousGeneratedRemoved = removeGeneratedHandlers(file);\n appendEntries(file, entries);\n\n mkdirSync(path.dirname(targetPath), { recursive: true });\n const temporaryPath = `${targetPath}.tmp`;\n writeFileSync(temporaryPath, `${JSON.stringify(file, null, 2)}\\n`);\n renameSync(temporaryPath, targetPath);\n\n return {\n path: targetPath,\n fileCreated,\n previousGeneratedRemoved,\n generatedWritten: entries.length\n };\n}\n", "import {\n closeSync,\n lstatSync,\n mkdirSync,\n openSync,\n readlinkSync,\n readSync,\n symlinkSync,\n unlinkSync\n} from \"node:fs\";\nimport path from \"node:path\";\nimport { getAgentConfig, resolveHookPath, type AgentHookConfig } from \"./configs.js\";\n\nexport interface SymlinkResult {\n /** Where the symlink was placed. */\n symlinkPath: string;\n /** What the symlink points to. */\n targetPath: string;\n replaced: \"none\" | \"stale-symlink\" | \"generated-file\";\n}\n\ntype SymlinkScope = \"project\" | \"user\";\n\ninterface HookHandler {\n statusMessage?: unknown;\n}\n\ninterface HookGroup {\n hooks?: unknown;\n}\n\ninterface HooksFile {\n hooks?: unknown;\n}\n\nfunction requireAgentConfig(agentId: string): AgentHookConfig {\n const config = getAgentConfig(agentId);\n if (!config) {\n throw new Error(`No hook configuration found for agent \"${agentId}\"`);\n }\n\n return config;\n}\n\nfunction resolveScopedPath(\n config: AgentHookConfig,\n agentId: string,\n cwd: string,\n homeDir: string,\n scope: SymlinkScope\n): string {\n const targetPath = resolveHookPath(\n config,\n scope === \"project\" ? \"local\" : \"global\",\n cwd,\n homeDir\n );\n if (!targetPath) {\n throw new Error(`Agent \"${agentId}\" has no ${scope} hook path`);\n }\n\n return targetPath;\n}\n\nfunction readFirstKilobyte(filePath: string): string {\n const descriptor = openSync(filePath, \"r\");\n const buffer = Buffer.alloc(1024);\n\n try {\n const length = readSync(descriptor, buffer, 0, buffer.length, 0);\n return buffer.toString(\"utf8\", 0, length);\n } finally {\n closeSync(descriptor);\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isFullyGeneratedFile(filePath: string): boolean {\n let parsed: unknown;\n\n try {\n parsed = JSON.parse(readFirstKilobyte(filePath));\n } catch {\n return false;\n }\n\n if (!isRecord(parsed)) {\n return false;\n }\n\n if (Object.keys(parsed).some((key) => key !== \"hooks\")) {\n return false;\n }\n\n const hooks = (parsed as HooksFile).hooks;\n if (!isRecord(hooks)) {\n return false;\n }\n\n let handlerFound = false;\n for (const groups of Object.values(hooks)) {\n if (!Array.isArray(groups)) {\n return false;\n }\n\n for (const group of groups) {\n if (!isRecord(group) || !Array.isArray((group as HookGroup).hooks)) {\n return false;\n }\n\n for (const handler of (group as HookGroup).hooks as unknown[]) {\n if (!isRecord(handler)) {\n return false;\n }\n\n handlerFound = true;\n const statusMessage = (handler as HookHandler).statusMessage;\n if (typeof statusMessage !== \"string\" || !statusMessage.startsWith(\"[generated:\")) {\n return false;\n }\n }\n }\n }\n\n return handlerFound;\n}\n\nexport function symlinkHooks(\n sourceAgentId: string,\n targetAgentId: string,\n cwd: string,\n homeDir: string,\n scope: SymlinkScope\n): SymlinkResult {\n const source = requireAgentConfig(sourceAgentId);\n const target = requireAgentConfig(targetAgentId);\n\n if (source.format !== target.format) {\n throw new Error(\n `Cannot symlink hook formats \"${source.format}\" and \"${target.format}\"; use transformation instead`\n );\n }\n\n const targetPath = resolveScopedPath(source, sourceAgentId, cwd, homeDir, scope);\n const symlinkPath = resolveScopedPath(target, targetAgentId, cwd, homeDir, scope);\n let replaced: SymlinkResult[\"replaced\"] = \"none\";\n\n try {\n const existing = lstatSync(symlinkPath);\n if (existing.isSymbolicLink()) {\n if (readlinkSync(symlinkPath) === targetPath) {\n return { symlinkPath, targetPath, replaced };\n }\n\n unlinkSync(symlinkPath);\n replaced = \"stale-symlink\";\n } else if (existing.isFile() && isFullyGeneratedFile(symlinkPath)) {\n unlinkSync(symlinkPath);\n replaced = \"generated-file\";\n } else {\n throw new Error(`Refuse to replace user-authored hook file at ${symlinkPath}`);\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n\n mkdirSync(path.dirname(symlinkPath), { recursive: true });\n symlinkSync(targetPath, symlinkPath);\n\n return { symlinkPath, targetPath, replaced };\n}\n", "import * as fs from \"node:fs\";\nimport path from \"node:path\";\nimport { appendExcludeBlock, removeExcludeBlock } from \"@poe-code/agent-skill-config\";\nimport {\n resolveAgentSupport,\n resolveHookPath,\n supportedHookAgents,\n type AgentHookConfig\n} from \"./configs.js\";\nimport { readClaudeHooks } from \"./read-hooks.js\";\nimport { symlinkHooks } from \"./symlink-hooks.js\";\nimport { transformHooks, type HookDrop } from \"./transform-hooks.js\";\nimport { writeCodexHooks } from \"./write-hooks.js\";\n\nexport type BridgeStrategy = \"symlink\" | \"transform\";\n\nexport interface BridgeHookManifest {\n sourceAgentId: string;\n targetAgentId: string;\n cwd: string;\n runId: string;\n strategy: BridgeStrategy;\n writtenPath?: string;\n generatedEntryIds?: string[];\n drops: HookDrop[];\n symlinkPath?: string;\n symlinkTarget?: string;\n symlinkReplaced?: \"none\" | \"stale-symlink\" | \"generated-file\";\n createdParents?: string[];\n preExistingEvents?: string[];\n preExistingMatchers?: Array<{ event: string; matcher?: string }>;\n fileCreated?: boolean;\n}\n\ninterface CodexHookHandler {\n statusMessage?: string;\n}\n\ninterface CodexMatcherGroup {\n matcher?: string;\n hooks: CodexHookHandler[];\n}\n\ninterface CodexHooksFile {\n hooks?: Record<string, CodexMatcherGroup[]>;\n [key: string]: unknown;\n}\n\nconst hookExcludeMarkerPrefix = \"poe-code-spawn-hooks\";\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error;\n}\n\nfunction pathExists(targetPath: string): boolean {\n try {\n fs.lstatSync(targetPath);\n return true;\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n}\n\nfunction collectMissingParents(targetPath: string): string[] {\n const parents: string[] = [];\n let current = path.dirname(targetPath);\n\n while (!pathExists(current)) {\n parents.push(current);\n const parent = path.dirname(current);\n if (parent === current) {\n break;\n }\n current = parent;\n }\n\n return parents.reverse();\n}\n\nfunction removeDirectoryIfEmpty(targetPath: string): void {\n try {\n fs.rmdirSync(targetPath);\n } catch (error) {\n if (\n isNodeError(error) &&\n (error.code === \"ENOENT\" || error.code === \"ENOTEMPTY\" || error.code === \"EEXIST\")\n ) {\n return;\n }\n throw error;\n }\n}\n\nfunction requireSupport(input: string, role: \"source\" | \"target\") {\n const support = resolveAgentSupport(input);\n if (support.status !== \"supported\" || !support.id || !support.config) {\n throw new Error(\n `Unsupported ${role} hook agent \"${input}\". Supported hook agents: ${supportedHookAgents.join(\", \")}.`\n );\n }\n\n return { id: support.id, config: support.config };\n}\n\nfunction requireTargetPath(\n targetId: string,\n config: AgentHookConfig,\n cwd: string,\n homeDir: string\n) {\n const targetPath = resolveHookPath(config, \"local\", cwd, homeDir);\n if (!targetPath) {\n throw new Error(`Agent \"${targetId}\" has no project hook path`);\n }\n return targetPath;\n}\n\nfunction readCodexFile(targetPath: string): CodexHooksFile | undefined {\n let content: string;\n try {\n content = fs.readFileSync(targetPath, \"utf8\");\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\n\n try {\n return JSON.parse(content) as CodexHooksFile;\n } catch (error) {\n throw new Error(`Malformed JSON in ${targetPath}`, { cause: error });\n }\n}\n\nfunction writeCodexFile(targetPath: string, file: CodexHooksFile): void {\n fs.writeFileSync(targetPath, `${JSON.stringify(file, null, 2)}\\n`, \"utf8\");\n}\n\nfunction hasOnlyEmptyHooks(file: CodexHooksFile): boolean {\n return (\n Object.keys(file).every((key) => key === \"hooks\") &&\n Object.values(file.hooks ?? {}).every((groups) => groups.length === 0)\n );\n}\n\nfunction relativeToCwd(cwd: string, targetPath: string): string {\n return path.relative(cwd, targetPath);\n}\n\nfunction matcherKey(event: string, matcher: string | undefined): string {\n return `${event}\\u0000${matcher === undefined ? \"<undefined>\" : matcher}`;\n}\n\nexport function bridgeHooks(\n sourceAgentId: string,\n targetAgentId: string,\n cwd: string,\n homeDir: string,\n runId: string,\n opts?: { strategy?: BridgeStrategy; scope?: \"project\" | \"user\" | \"merged\" }\n): BridgeHookManifest {\n const source = requireSupport(sourceAgentId, \"source\");\n const target = requireSupport(targetAgentId, \"target\");\n const strategy =\n opts?.strategy ?? (source.config.format === target.config.format ? \"symlink\" : \"transform\");\n const manifest: BridgeHookManifest = {\n sourceAgentId,\n targetAgentId,\n cwd,\n runId,\n strategy,\n drops: []\n };\n\n if (strategy === \"symlink\") {\n const symlinkPath = requireTargetPath(target.id, target.config, cwd, homeDir);\n manifest.createdParents = collectMissingParents(symlinkPath);\n const result = symlinkHooks(source.id, target.id, cwd, homeDir, \"project\");\n manifest.symlinkPath = result.symlinkPath;\n manifest.symlinkTarget = result.targetPath;\n manifest.symlinkReplaced = result.replaced;\n appendExcludeBlock(cwd, runId, [relativeToCwd(cwd, result.symlinkPath)], {\n markerPrefix: hookExcludeMarkerPrefix\n });\n return manifest;\n }\n\n if (source.id !== \"claude-code\") {\n throw new Error(`Transforming hooks from \"${source.id}\" is not supported yet`);\n }\n\n if (target.config.format !== \"codex-hooks-json\") {\n throw new Error(\n `Transforming hooks to \"${target.id}\" is not supported yet; only codex-hook targets can be written`\n );\n }\n\n const targetPath = requireTargetPath(target.id, target.config, cwd, homeDir);\n const priorFile = readCodexFile(targetPath);\n const sourceHooks = readClaudeHooks(cwd, homeDir, { scope: opts?.scope ?? \"merged\" });\n const transformed = transformHooks(sourceHooks.entries, source.id, target.id, { runId });\n const createdParents = collectMissingParents(targetPath);\n const writeResult = writeCodexHooks(targetPath, transformed.entries, runId);\n\n manifest.writtenPath = targetPath;\n manifest.generatedEntryIds = transformed.entries.map((entry) => entry.generatedId);\n manifest.drops = transformed.drops;\n manifest.createdParents = createdParents;\n manifest.fileCreated = writeResult.fileCreated;\n manifest.preExistingEvents = Object.keys(priorFile?.hooks ?? {});\n manifest.preExistingMatchers = Object.entries(priorFile?.hooks ?? {}).flatMap(([event, groups]) =>\n groups.map((group) => ({\n event,\n ...(group.matcher === undefined ? {} : { matcher: group.matcher })\n }))\n );\n appendExcludeBlock(cwd, runId, [relativeToCwd(cwd, targetPath)], {\n markerPrefix: hookExcludeMarkerPrefix\n });\n\n return manifest;\n}\n\nexport function cleanupBridgedHooks(manifest: BridgeHookManifest): void {\n if (manifest.strategy === \"symlink\" && manifest.symlinkPath && manifest.symlinkTarget) {\n try {\n if (\n fs.lstatSync(manifest.symlinkPath).isSymbolicLink() &&\n fs.readlinkSync(manifest.symlinkPath) === manifest.symlinkTarget\n ) {\n fs.unlinkSync(manifest.symlinkPath);\n }\n } catch (error) {\n if (!isNodeError(error) || error.code !== \"ENOENT\") {\n throw error;\n }\n }\n\n for (const parent of [...(manifest.createdParents ?? [])].reverse()) {\n removeDirectoryIfEmpty(parent);\n }\n }\n\n if (manifest.strategy === \"transform\" && manifest.writtenPath) {\n const file = readCodexFile(manifest.writtenPath);\n if (file) {\n const generatedPrefix = `[generated:${manifest.runId}]`;\n const preExistingEvents = new Set(manifest.preExistingEvents ?? []);\n const preExistingMatchers = new Set(\n (manifest.preExistingMatchers ?? []).map((group) => matcherKey(group.event, group.matcher))\n );\n const hooks = file.hooks ?? {};\n\n for (const [event, groups] of Object.entries(hooks)) {\n hooks[event] = groups.filter((group) => {\n const priorLength = group.hooks.length;\n group.hooks = group.hooks.filter(\n (handler) => !handler.statusMessage?.startsWith(generatedPrefix)\n );\n return (\n group.hooks.length > 0 ||\n group.hooks.length === priorLength ||\n preExistingMatchers.has(matcherKey(event, group.matcher))\n );\n });\n\n if (hooks[event].length === 0 && !preExistingEvents.has(event)) {\n delete hooks[event];\n }\n }\n\n file.hooks = hooks;\n if (manifest.fileCreated && hasOnlyEmptyHooks(file)) {\n fs.unlinkSync(manifest.writtenPath);\n } else {\n writeCodexFile(manifest.writtenPath, file);\n }\n }\n\n for (const parent of [...(manifest.createdParents ?? [])].reverse()) {\n removeDirectoryIfEmpty(parent);\n }\n }\n\n removeExcludeBlock(manifest.cwd, manifest.runId, { markerPrefix: hookExcludeMarkerPrefix });\n}\n", "export function 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\nexport function isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0;\n}\n\nexport function extractThreadId(value: unknown): string | undefined {\n if (!value || typeof value !== \"object\") return;\n\n const obj = value as Record<string, unknown>;\n const maybeThreadId =\n (isNonEmptyString(obj.thread_id) && obj.thread_id) ||\n (isNonEmptyString(obj.threadId) && obj.threadId) ||\n (isNonEmptyString(obj.threadID) && obj.threadID) ||\n (isNonEmptyString(obj.session_id) && obj.session_id) ||\n (isNonEmptyString(obj.sessionId) && obj.sessionId) ||\n (isNonEmptyString(obj.sessionID) && obj.sessionID);\n\n return maybeThreadId || undefined;\n}\n", "import type { AcpEvent } from \"../acp/types.js\";\nimport { truncate, isNonEmptyString, extractThreadId } from \"./utils.js\";\n\nexport const TOOL_KIND_MAP: Record<string, string> = {\n Read: \"read\",\n Write: \"edit\",\n Edit: \"edit\",\n NotebookEdit: \"edit\",\n Bash: \"exec\",\n Glob: \"search\",\n Grep: \"search\",\n Task: \"think\"\n};\n\ntype ClaudeEvent = {\n type?: unknown;\n message?: unknown;\n thread_id?: unknown;\n threadId?: unknown;\n threadID?: unknown;\n session_id?: unknown;\n sessionId?: unknown;\n sessionID?: unknown;\n input_tokens?: unknown;\n output_tokens?: unknown;\n num_input_tokens?: unknown;\n num_output_tokens?: unknown;\n cost_usd?: unknown;\n usage?: unknown;\n};\n\ntype ClaudeMessage = {\n content?: unknown;\n};\n\ntype ClaudeContentBlock = {\n type?: unknown;\n text?: unknown;\n id?: unknown;\n name?: unknown;\n input?: unknown;\n tool_use_id?: unknown;\n content?: unknown;\n};\n\nconst TITLE_KEYS: Record<string, string[]> = {\n Bash: [\"command\"],\n Read: [\"file_path\"],\n Write: [\"file_path\"],\n Edit: [\"file_path\"],\n NotebookEdit: [\"notebook_path\"],\n Glob: [\"pattern\"],\n Grep: [\"pattern\"],\n Task: [\"description\", \"prompt\"]\n};\n\nfunction extractTitle(name: string, input: unknown): string {\n const keys = TITLE_KEYS[name];\n if (keys && input && typeof input === \"object\") {\n const obj = input as Record<string, unknown>;\n for (const key of keys) {\n const value = obj[key];\n if (typeof value === \"string\" && value.length > 0) {\n return truncate(value, 80);\n }\n }\n }\n return name;\n}\n\nexport async function* adaptClaude(\n lines: AsyncIterable<string>\n): AsyncGenerator<AcpEvent> {\n const toolKindsById = new Map<string, string>();\n let emittedSessionStart = false;\n\n for await (const rawLine of lines) {\n const line = rawLine.trim();\n if (!line) continue;\n\n // Claude Code can emit non-JSON informational lines (especially in verbose mode).\n // Ignore lines that don't look like JSON to avoid polluting output with adapter errors.\n const firstChar = line[0];\n if (firstChar !== \"{\" && firstChar !== \"[\") {\n continue;\n }\n\n let event: ClaudeEvent;\n try {\n event = JSON.parse(line) as ClaudeEvent;\n } catch (error) {\n const stack = error instanceof Error ? error.stack : undefined;\n yield {\n event: \"error\",\n message: `[adaptClaude] Malformed JSON line: ${truncate(line, 200)}`,\n stack\n };\n continue;\n }\n\n const eventType = event.type;\n if (!isNonEmptyString(eventType)) continue;\n\n if (!emittedSessionStart) {\n const threadId = extractThreadId(event);\n emittedSessionStart = true;\n yield { event: \"session_start\", threadId };\n }\n\n if (eventType === \"result\") {\n const usage = (event.usage ?? {}) as {\n input_tokens?: unknown;\n output_tokens?: unknown;\n cost_usd?: unknown;\n };\n\n const inputTokens =\n typeof usage.input_tokens === \"number\"\n ? usage.input_tokens\n : typeof event.input_tokens === \"number\"\n ? event.input_tokens\n : typeof event.num_input_tokens === \"number\"\n ? event.num_input_tokens\n : 0;\n const outputTokens =\n typeof usage.output_tokens === \"number\"\n ? usage.output_tokens\n : typeof event.output_tokens === \"number\"\n ? event.output_tokens\n : typeof event.num_output_tokens === \"number\"\n ? event.num_output_tokens\n : 0;\n const costUsd =\n typeof usage.cost_usd === \"number\"\n ? usage.cost_usd\n : typeof event.cost_usd === \"number\"\n ? event.cost_usd\n : undefined;\n\n yield { event: \"usage\", inputTokens, outputTokens, costUsd };\n continue;\n }\n\n if (eventType !== \"assistant\" && eventType !== \"user\") continue;\n\n const message = (event.message ?? null) as ClaudeMessage | null;\n if (!message || typeof message !== \"object\") continue;\n\n const content = (message.content ?? null) as unknown;\n if (!Array.isArray(content)) continue;\n\n for (const block of content) {\n const item = block as ClaudeContentBlock;\n if (!item || typeof item !== \"object\") continue;\n\n const blockType = item.type;\n if (!isNonEmptyString(blockType)) continue;\n\n if (eventType === \"assistant\") {\n if (blockType === \"text\" && isNonEmptyString(item.text)) {\n yield {\n event: \"agent_message\",\n text: item.text\n };\n continue;\n }\n\n if (blockType === \"tool_use\" && isNonEmptyString(item.id) && isNonEmptyString(item.name)) {\n const kind = TOOL_KIND_MAP[item.name] ?? \"other\";\n toolKindsById.set(item.id, kind);\n\n yield {\n event: \"tool_start\",\n id: item.id,\n kind,\n title: extractTitle(item.name, item.input),\n input: item.input\n };\n }\n\n continue;\n }\n\n if (eventType === \"user\") {\n if (!isNonEmptyString(item.tool_use_id)) continue;\n if (blockType !== \"tool_result\") continue;\n\n const kind = toolKindsById.get(item.tool_use_id);\n toolKindsById.delete(item.tool_use_id);\n\n let path: string;\n if (typeof item.content === \"string\") {\n path = item.content;\n } else {\n try {\n path = JSON.stringify(item.content);\n } catch {\n path = String(item.content);\n }\n }\n\n yield {\n event: \"tool_complete\",\n id: item.tool_use_id,\n kind,\n path\n };\n }\n }\n }\n}\n", "import type { AcpEvent } from \"../acp/types.js\";\nimport { truncate, isNonEmptyString, extractThreadId } from \"./utils.js\";\n\ntype CodexEvent = {\n type?: unknown;\n thread_id?: unknown;\n threadId?: unknown;\n threadID?: unknown;\n session_id?: unknown;\n sessionId?: unknown;\n sessionID?: unknown;\n usage?: unknown;\n item?: unknown;\n error?: unknown;\n message?: unknown;\n reason?: unknown;\n};\n\ntype CodexItem = {\n id?: unknown;\n type?: unknown;\n command?: unknown;\n path?: unknown;\n text?: unknown;\n content?: unknown;\n summary?: unknown;\n server?: unknown;\n tool?: unknown;\n arguments?: unknown;\n result?: unknown;\n};\n\nexport async function* adaptCodex(\n lines: AsyncIterable<string>\n): AsyncGenerator<AcpEvent> {\n const toolTitleById = new Map<string, string>();\n const toolKindById = new Map<string, string>();\n\n for await (const rawLine of lines) {\n const line = rawLine.trim();\n if (!line) continue;\n\n let event: CodexEvent;\n try {\n event = JSON.parse(line) as CodexEvent;\n } catch (error) {\n const stack = error instanceof Error ? error.stack : undefined;\n yield {\n event: \"error\",\n message: `[adaptCodex] Malformed JSON line: ${truncate(line, 200)}`,\n stack\n };\n continue;\n }\n\n const eventType = event.type;\n if (!isNonEmptyString(eventType)) continue;\n\n if (eventType === \"thread.started\") {\n const maybeThreadId = extractThreadId(event);\n yield { event: \"session_start\", threadId: maybeThreadId };\n continue;\n }\n\n if (eventType === \"turn.started\") {\n continue;\n }\n\n if (eventType === \"turn.completed\") {\n const usage = (event.usage ?? {}) as {\n input_tokens?: unknown;\n output_tokens?: unknown;\n cached_input_tokens?: unknown;\n };\n\n const inputTokens = typeof usage.input_tokens === \"number\" ? usage.input_tokens : 0;\n const outputTokens = typeof usage.output_tokens === \"number\" ? usage.output_tokens : 0;\n const cachedTokens =\n typeof usage.cached_input_tokens === \"number\" ? usage.cached_input_tokens : 0;\n\n yield { event: \"usage\", inputTokens, outputTokens, cachedTokens };\n continue;\n }\n\n if (eventType === \"turn.failed\") {\n const message = extractErrorMessage(event) ?? \"Turn failed\";\n yield { event: \"error\", message };\n continue;\n }\n\n const item = (event.item ?? null) as CodexItem | null;\n if (!item || typeof item !== \"object\") continue;\n\n const itemType = item.type;\n if (!isNonEmptyString(itemType)) continue;\n\n if (eventType === \"item.started\") {\n if (!isNonEmptyString(item.id)) continue;\n\n let kind: string | undefined;\n let title: string | undefined;\n\n if (itemType === \"command_execution\") {\n kind = \"exec\";\n title = truncate(isNonEmptyString(item.command) ? item.command : \"\", 80);\n } else if (itemType === \"file_edit\") {\n kind = \"edit\";\n title = isNonEmptyString(item.path) ? item.path : \"\";\n } else if (itemType === \"thinking\") {\n kind = \"think\";\n title = \"thinking...\";\n } else if (itemType === \"mcp_tool_call\") {\n const server = isNonEmptyString(item.server) ? item.server : \"unknown\";\n const tool = isNonEmptyString(item.tool) ? item.tool : \"unknown\";\n kind = \"other\";\n title = `${server}.${tool}`;\n }\n\n if (kind && title !== undefined) {\n toolTitleById.set(item.id, title);\n toolKindById.set(item.id, kind);\n yield { event: \"tool_start\", id: item.id, kind, title };\n }\n continue;\n }\n\n if (eventType === \"item.completed\") {\n if (itemType === \"agent_message\") {\n if (!isNonEmptyString(item.text)) continue;\n yield { event: \"agent_message\", text: item.text };\n continue;\n }\n\n if (itemType === \"reasoning\") {\n const text = isNonEmptyString(item.text)\n ? item.text\n : isNonEmptyString(item.content)\n ? item.content\n : isNonEmptyString(item.summary)\n ? item.summary\n : undefined;\n if (!text) continue;\n yield { event: \"reasoning\", text };\n continue;\n }\n\n if (!isNonEmptyString(item.id)) continue;\n\n if (itemType === \"command_execution\" || itemType === \"file_edit\" || itemType === \"mcp_tool_call\") {\n const kindFromStart = toolKindById.get(item.id);\n const kind =\n kindFromStart ??\n (itemType === \"command_execution\"\n ? \"exec\"\n : itemType === \"file_edit\"\n ? \"edit\"\n : \"other\");\n\n const titleFromEvent = isNonEmptyString(item.path)\n ? item.path\n : itemType === \"mcp_tool_call\"\n ? `${isNonEmptyString(item.server) ? item.server : \"unknown\"}.${isNonEmptyString(item.tool) ? item.tool : \"unknown\"}`\n : undefined;\n const path = titleFromEvent ?? toolTitleById.get(item.id) ?? \"\";\n\n toolTitleById.delete(item.id);\n toolKindById.delete(item.id);\n\n yield { event: \"tool_complete\", id: item.id, kind, path };\n }\n }\n }\n}\n\nfunction extractErrorMessage(event: CodexEvent): string | undefined {\n if (isNonEmptyString(event.message)) return event.message;\n\n const error = event.error;\n if (isNonEmptyString(error)) return error;\n if (typeof error === \"object\" && error !== null) {\n const errorObj = error as { message?: unknown };\n if (isNonEmptyString(errorObj.message)) return errorObj.message;\n }\n\n if (isNonEmptyString(event.reason)) return event.reason;\n return undefined;\n}\n", "import type { AcpEvent } from \"../acp/types.js\";\nimport { truncate, isNonEmptyString, extractThreadId } from \"./utils.js\";\n\ntype KimiEvent = {\n role?: unknown;\n content?: unknown;\n thread_id?: unknown;\n threadId?: unknown;\n threadID?: unknown;\n session_id?: unknown;\n sessionId?: unknown;\n sessionID?: unknown;\n};\n\nexport async function* adaptKimi(\n lines: AsyncIterable<string>\n): AsyncGenerator<AcpEvent> {\n let emittedSessionStart = false;\n\n for await (const rawLine of lines) {\n const line = rawLine.trim();\n if (!line) continue;\n\n let event: KimiEvent;\n try {\n event = JSON.parse(line) as KimiEvent;\n } catch (error) {\n const stack = error instanceof Error ? error.stack : undefined;\n yield {\n event: \"error\",\n message: `[adaptKimi] Malformed JSON line: ${truncate(line, 200)}`,\n stack\n };\n continue;\n }\n\n if (!event || typeof event !== \"object\") continue;\n\n if (!emittedSessionStart) {\n const threadId = extractThreadId(event);\n if (threadId) {\n emittedSessionStart = true;\n yield { event: \"session_start\", threadId };\n }\n }\n\n const role = event.role;\n if (!isNonEmptyString(role) || role !== \"assistant\") continue;\n\n const content = event.content;\n if (!isNonEmptyString(content)) continue;\n\n yield { event: \"agent_message\", text: content };\n }\n}\n", "import { truncate, isNonEmptyString } from \"./utils.js\";\n\ntype AcpEvent = { event: string } & Record<string, unknown>;\n\nexport async function* adaptNative(\n lines: AsyncIterable<string>\n): AsyncGenerator<AcpEvent> {\n for await (const rawLine of lines) {\n const line = rawLine.trim();\n if (!line) continue;\n\n let event: unknown;\n try {\n event = JSON.parse(line) as unknown;\n } catch (error) {\n const stack = error instanceof Error ? error.stack : undefined;\n yield {\n event: \"error\",\n message: `[adaptNative] Malformed JSON line: ${truncate(line, 200)}`,\n stack\n };\n continue;\n }\n\n const maybeEventType = (event as { event?: unknown } | null)?.event;\n if (!isNonEmptyString(maybeEventType)) {\n yield {\n event: \"error\",\n message: `[adaptNative] Line missing string \"event\" field: ${truncate(line, 200)}`\n };\n continue;\n }\n\n yield event as AcpEvent;\n }\n}\n", "import type { AcpEvent } from \"../acp/types.js\";\nimport { truncate, isNonEmptyString, extractThreadId } from \"./utils.js\";\n\ntype OpenCodeEvent = {\n type?: unknown;\n sessionID?: unknown;\n sessionId?: unknown;\n session_id?: unknown;\n threadId?: unknown;\n thread_id?: unknown;\n threadID?: unknown;\n part?: unknown;\n};\n\ntype OpenCodeTextPart = {\n type?: unknown;\n text?: unknown;\n};\n\ntype OpenCodeToolState = {\n status?: unknown;\n input?: unknown;\n output?: unknown;\n};\n\ntype OpenCodeToolPart = {\n type?: unknown;\n callID?: unknown;\n tool?: unknown;\n state?: unknown;\n};\n\ntype OpenCodeStepFinishPart = {\n tokens?: unknown;\n};\n\ntype OpenCodeTokens = {\n input?: unknown;\n output?: unknown;\n cache?: unknown;\n};\n\ntype OpenCodeTokenCache = {\n read?: unknown;\n write?: unknown;\n};\n\nfunction guessToolKind(toolName: string): string {\n const normalized = toolName.toLowerCase();\n\n if (normalized === \"bash\" || normalized === \"shell\" || normalized === \"sh\") return \"exec\";\n if (normalized.includes(\"read\")) return \"read\";\n if (normalized.includes(\"write\") || normalized.includes(\"edit\") || normalized.includes(\"patch\")) {\n return \"edit\";\n }\n if (\n normalized.includes(\"search\") ||\n normalized.includes(\"grep\") ||\n normalized.includes(\"glob\") ||\n normalized.includes(\"find\")\n ) {\n return \"search\";\n }\n if (normalized.includes(\"think\") || normalized.includes(\"task\")) return \"think\";\n\n return \"other\";\n}\n\nfunction safeStringify(value: unknown): string {\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nexport async function* adaptOpenCode(\n lines: AsyncIterable<string>\n): AsyncGenerator<AcpEvent> {\n let emittedSessionStart = false;\n const toolKindById = new Map<string, string>();\n\n for await (const rawLine of lines) {\n const line = rawLine.trim();\n if (!line) continue;\n\n let event: OpenCodeEvent;\n try {\n event = JSON.parse(line) as OpenCodeEvent;\n } catch (error) {\n const stack = error instanceof Error ? error.stack : undefined;\n yield {\n event: \"error\",\n message: `[adaptOpenCode] Malformed JSON line: ${truncate(line, 200)}`,\n stack\n };\n continue;\n }\n\n if (!event || typeof event !== \"object\") continue;\n\n const sessionID = extractThreadId(event);\n if (!emittedSessionStart && isNonEmptyString(sessionID)) {\n emittedSessionStart = true;\n yield { event: \"session_start\", threadId: sessionID };\n }\n\n const eventType = event.type;\n if (!isNonEmptyString(eventType)) continue;\n\n if (eventType === \"text\") {\n const part = (event.part ?? null) as OpenCodeTextPart | null;\n if (!part || typeof part !== \"object\") continue;\n if (!isNonEmptyString(part.text)) continue;\n yield { event: \"agent_message\", text: part.text };\n continue;\n }\n\n if (eventType === \"tool_use\") {\n const part = (event.part ?? null) as OpenCodeToolPart | null;\n if (!part || typeof part !== \"object\") continue;\n if (!isNonEmptyString(part.callID) || !isNonEmptyString(part.tool)) continue;\n\n const state = (part.state ?? null) as OpenCodeToolState | null;\n if (!state || typeof state !== \"object\") continue;\n\n const kind = guessToolKind(part.tool);\n const status = state.status;\n const terminal = status === \"completed\" || status === \"failed\";\n\n if (!toolKindById.has(part.callID)) {\n toolKindById.set(part.callID, kind);\n\n let title = part.tool;\n const maybeInput = state.input;\n if (kind === \"exec\" && maybeInput && typeof maybeInput === \"object\") {\n const command = (maybeInput as { command?: unknown }).command;\n if (isNonEmptyString(command)) {\n title = truncate(command, 80);\n }\n }\n\n yield {\n event: \"tool_start\",\n id: part.callID,\n kind,\n title,\n input: state.input\n };\n }\n\n if (terminal) {\n const kindFromStart = toolKindById.get(part.callID) ?? kind;\n toolKindById.delete(part.callID);\n\n yield {\n event: \"tool_complete\",\n id: part.callID,\n kind: kindFromStart,\n path: safeStringify(state.output)\n };\n }\n\n continue;\n }\n\n if (eventType === \"step_finish\") {\n const part = (event.part ?? null) as OpenCodeStepFinishPart | null;\n if (!part || typeof part !== \"object\") continue;\n\n const tokens = (part.tokens ?? null) as OpenCodeTokens | null;\n if (!tokens || typeof tokens !== \"object\") continue;\n\n const inputTokens = typeof tokens.input === \"number\" ? tokens.input : 0;\n const outputTokens = typeof tokens.output === \"number\" ? tokens.output : 0;\n\n const cache = (tokens.cache ?? null) as OpenCodeTokenCache | null;\n const cachedTokens =\n cache && typeof cache === \"object\" && typeof cache.read === \"number\" ? cache.read : undefined;\n\n if (inputTokens === 0 && outputTokens === 0 && cachedTokens === undefined) continue;\n\n yield { event: \"usage\", inputTokens, outputTokens, cachedTokens };\n continue;\n }\n }\n}\n", "import { adaptClaude } from \"./claude.js\";\nimport { adaptCodex } from \"./codex.js\";\nimport { adaptKimi } from \"./kimi.js\";\nimport { adaptNative } from \"./native.js\";\nimport { adaptOpenCode } from \"./opencode.js\";\nimport type { AcpEvent, SessionUpdate } from \"../acp/types.js\";\n\nexport { adaptCodex } from \"./codex.js\";\nexport { adaptClaude } from \"./claude.js\";\nexport { adaptKimi } from \"./kimi.js\";\nexport { adaptNative } from \"./native.js\";\nexport { adaptOpenCode } from \"./opencode.js\";\n\nexport type AdapterType = \"codex\" | \"claude\" | \"kimi\" | \"native\" | \"opencode\";\n\nexport type AdapterOutput = AcpEvent | SessionUpdate;\nexport type Adapter = (lines: AsyncIterable<string>) => AsyncGenerator<AdapterOutput>;\n\nconst adapters = {\n codex: adaptCodex,\n claude: adaptClaude,\n kimi: adaptKimi,\n native: adaptNative,\n opencode: adaptOpenCode\n} satisfies Record<AdapterType, Adapter>;\n\nexport function getAdapter(type: AdapterType): Adapter {\n const adapter = (adapters as Record<string, Adapter | undefined>)[type];\n if (!adapter) {\n throw new Error(`Unknown adapter \"${String(type)}\".`);\n }\n return adapter;\n}\n", "export function stampReceiveTime<E>(event: E, ts: number): E {\n if (event === null || typeof event !== \"object\") {\n return event;\n }\n\n const target = event as { _meta?: Record<string, unknown> };\n const existing = target._meta;\n if (existing && typeof existing.ts === \"number\") {\n return event;\n }\n\n target._meta = existing ? { ...existing, ts } : { ts };\n return event;\n}\n", "import type { SpawnMode, SpawnUsage } from \"../types.js\";\nimport type { AcpEvent } from \"./types.js\";\n\nexport interface SessionToolCall {\n id?: string;\n kind?: string;\n title?: string;\n input?: unknown;\n path?: string;\n}\n\nexport interface SessionResult {\n output: string;\n messages: string[];\n toolCalls: SessionToolCall[];\n}\n\nexport interface SpawnContext {\n sessionId: string;\n agent: string;\n logPath?: string;\n logDir?: string;\n logFileName?: string;\n events: AcpEvent[];\n usage: SpawnUsage;\n eventStream?: AsyncIterable<AcpEvent>;\n sessionResult?: SessionResult;\n threadId?: string;\n prompt?: string;\n model?: string;\n mode?: SpawnMode;\n cwd?: string;\n startedAt?: Date;\n logFile?: string;\n}\n\nexport type AcpMiddleware = (ctx: SpawnContext, next: () => Promise<void>) => Promise<void>;\n\nexport async function applyMiddlewares(\n middlewares: AcpMiddleware[],\n ctx: SpawnContext\n): Promise<void> {\n let index = -1;\n\n async function dispatch(position: number): Promise<void> {\n if (position <= index) {\n throw new Error(\"next() called multiple times\");\n }\n\n index = position;\n if (position === middlewares.length) {\n return;\n }\n\n const middleware = middlewares[position];\n if (typeof middleware !== \"function\") {\n throw new Error(`Invalid ACP middleware at index ${position}`);\n }\n\n await middleware(ctx, () => dispatch(position + 1));\n }\n\n await dispatch(0);\n}\n", "import \"../register-factories.js\";\nimport { runPoeCommand } from \"@poe-code/agent-harness-tools\";\nimport { getAdapter } from \"../adapters/index.js\";\nimport { stampReceiveTime } from \"./meta.js\";\nimport type { AcpEvent } from \"./types.js\";\nimport { resolveConfig } from \"../configs/resolve-config.js\";\nimport { getMcpArgs, getMcpEnv } from \"../mcp-args.js\";\nimport { stripModelNamespace } from \"../model-utils.js\";\nimport { observeAgentSpawn } from \"../observability/otel.js\";\nimport { shouldSendPromptViaStdin } from \"../prompt-transport.js\";\nimport { resolveSpawnExecution } from \"../runtime.js\";\nimport { bridgeResourcesForRun, cleanupResourcesForRun } from \"../skill-bridge.js\";\nimport {\n resolveModeConfig,\n type CliSpawnConfig,\n type SpawnOptions,\n type SpawnResult\n} from \"../types.js\";\nimport { applyMiddlewares, type SpawnContext } from \"./middleware.js\";\n\nfunction createAbortError(): Error {\n const error = new Error(\"Agent spawn aborted\");\n error.name = \"AbortError\";\n return error;\n}\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 accumulateUsage(ctx: SpawnContext, event: AcpEvent): void {\n if (event.event !== \"usage\") {\n return;\n }\n\n const usage = event as {\n inputTokens?: unknown;\n outputTokens?: unknown;\n cachedTokens?: unknown;\n costUsd?: unknown;\n };\n\n if (typeof usage.inputTokens === \"number\" && Number.isFinite(usage.inputTokens)) {\n ctx.usage.inputTokens += usage.inputTokens;\n }\n\n if (typeof usage.outputTokens === \"number\" && Number.isFinite(usage.outputTokens)) {\n ctx.usage.outputTokens += usage.outputTokens;\n }\n\n if (typeof usage.cachedTokens === \"number\" && Number.isFinite(usage.cachedTokens)) {\n ctx.usage.cachedTokens = (ctx.usage.cachedTokens ?? 0) + usage.cachedTokens;\n }\n\n if (typeof usage.costUsd === \"number\" && Number.isFinite(usage.costUsd)) {\n ctx.usage.costUsd = (ctx.usage.costUsd ?? 0) + usage.costUsd;\n }\n}\n\nfunction createLineQueue(): {\n push(chunk: string): void;\n close(): void;\n lines(): AsyncIterable<string>;\n} {\n const lines: string[] = [];\n const waiters: Array<{\n resolve(value: IteratorResult<string>): void;\n }> = [];\n let pending = \"\";\n let closed = false;\n\n const emit = (line: string): void => {\n const waiter = waiters.shift();\n if (waiter) {\n waiter.resolve({ done: false, value: line });\n return;\n }\n lines.push(line);\n };\n\n const finishWaiters = (): void => {\n while (waiters.length > 0) {\n const waiter = waiters.shift()!;\n waiter.resolve({ done: true, value: undefined });\n }\n };\n\n return {\n push(chunk: string): void {\n if (closed) return;\n pending += chunk;\n let newlineIndex = pending.indexOf(\"\\n\");\n while (newlineIndex !== -1) {\n const raw = pending.slice(0, newlineIndex);\n emit(raw.endsWith(\"\\r\") ? raw.slice(0, -1) : raw);\n pending = pending.slice(newlineIndex + 1);\n newlineIndex = pending.indexOf(\"\\n\");\n }\n },\n close(): void {\n if (closed) return;\n if (pending.length > 0) {\n emit(pending.endsWith(\"\\r\") ? pending.slice(0, -1) : pending);\n pending = \"\";\n }\n closed = true;\n finishWaiters();\n },\n lines(): AsyncIterable<string> {\n return {\n [Symbol.asyncIterator](): AsyncIterator<string> {\n return {\n next(): Promise<IteratorResult<string>> {\n if (lines.length > 0) {\n return Promise.resolve({ done: false, value: lines.shift()! });\n }\n if (closed) {\n return Promise.resolve({ done: true, value: undefined });\n }\n return new Promise((resolve) => {\n waiters.push({ resolve });\n });\n }\n };\n }\n };\n }\n };\n}\n\nfunction getDefaultArgsPosition(config: CliSpawnConfig): \"beforePrompt\" | \"afterPrompt\" {\n return config.defaultArgsPosition ?? \"afterPrompt\";\n}\n\nfunction getMcpArgsPosition(\n config: CliSpawnConfig\n): \"beforeCommand\" | \"beforePrompt\" | \"afterCommand\" {\n if (config.mcpArgsPosition) {\n return config.mcpArgsPosition;\n }\n return config.mcpArgsBeforeCommand ? \"beforeCommand\" : \"afterCommand\";\n}\n\nfunction getResumeArgs(\n config: CliSpawnConfig,\n options: Pick<SpawnStreamingOptions, \"resumeThreadId\" | \"cwd\">\n): string[] {\n if (!options.resumeThreadId) {\n return [];\n }\n\n if (!config.resume) {\n throw new Error(`Agent \"${config.agentId}\" does not support resumeThreadId.`);\n }\n\n return config.resume.args(options.resumeThreadId, options.cwd ?? process.cwd());\n}\n\nexport function spawnStreaming(options: SpawnStreamingOptions): SpawnStreamingResult {\n if (options.signal?.aborted) {\n throw createAbortError();\n }\n\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 mcpArgs = getMcpArgs(spawnConfig, options.mcpServers);\n const mcpEnvVars = getMcpEnv(spawnConfig, options.mcpServers);\n const resumeArgs = getResumeArgs(spawnConfig, options);\n const defaultArgsPosition = getDefaultArgsPosition(spawnConfig);\n const mcpArgsPosition = getMcpArgsPosition(spawnConfig);\n const resumeArgsPosition = spawnConfig.resume?.position ?? \"afterPrompt\";\n const args: string[] = [];\n\n if (mcpArgsPosition === \"beforeCommand\") {\n args.push(...mcpArgs);\n }\n\n if (defaultArgsPosition === \"beforePrompt\") {\n args.push(...spawnConfig.defaultArgs);\n }\n\n if (mcpArgsPosition === \"beforePrompt\") {\n args.push(...mcpArgs);\n }\n\n args.push(spawnConfig.promptFlag);\n\n if (resumeArgsPosition === \"beforePrompt\") {\n args.push(...resumeArgs);\n }\n\n const useStdin = shouldSendPromptViaStdin(spawnConfig, options);\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 if (defaultArgsPosition === \"afterPrompt\") {\n args.push(...spawnConfig.defaultArgs);\n }\n\n if (mcpArgsPosition === \"afterCommand\") {\n args.push(...mcpArgs);\n }\n\n const modeResolved = resolveModeConfig(spawnConfig.modes[options.mode ?? \"yolo\"]);\n args.push(...modeResolved.args);\n\n if (useStdin) {\n args.push(...spawnConfig.stdinMode!.extraArgs);\n }\n\n if (options.args && options.args.length > 0) {\n if (resumeArgsPosition === \"afterPrompt\") {\n args.push(...resumeArgs);\n }\n args.push(...options.args);\n } else if (resumeArgsPosition === \"afterPrompt\") {\n args.push(...resumeArgs);\n }\n\n const envOverrides = { ...mcpEnvVars, ...modeResolved.env };\n const processEnv =\n Object.keys(envOverrides).length > 0 ? { ...process.env, ...envOverrides } : undefined;\n const cwd = options.cwd ?? process.cwd();\n const queue = createLineQueue();\n const argv = [binaryName, ...args];\n const execution = resolveSpawnExecution({\n cwd,\n runtimeConfigCwd: options.runtimeConfigCwd,\n env: (processEnv ?? process.env) as Record<string, string>,\n argv,\n tool: agentId,\n runtime: {\n runtime: options.runtime,\n runtimeImage: options.runtimeImage,\n runtimeTemplate: options.runtimeTemplate,\n detach: options.detach,\n mountPoeCode: options.mountPoeCode,\n runnerSync: options.runnerSync\n },\n openSpec: {\n execution: {\n wrapForLogTee: false,\n stdin: \"pipe\",\n stdout: \"pipe\",\n stderr: \"pipe\",\n env: processEnv as Record<string, string> | undefined,\n input: useStdin ? options.prompt : \"\",\n captureOutput: true,\n activityTimeoutMs: options.activityTimeoutMs,\n onStdout(chunk: string) {\n queue.push(chunk);\n },\n onStderr(chunk: string) {\n if (options.tee?.stderr) options.tee.stderr.write(chunk);\n }\n }\n }\n });\n\n const result: SpawnResult = { stdout: \"\", stderr: \"\", exitCode: 1 };\n const adapter = getAdapter(spawnConfig.adapter);\n let resolveEventStreamDone: (() => void) | undefined;\n let rejectEventStreamDone: ((error: unknown) => void) | undefined;\n const eventStreamDone = new Promise<void>((resolve, reject) => {\n resolveEventStreamDone = resolve;\n rejectEventStreamDone = reject;\n });\n const eventQueue: AcpEvent[] = [];\n const waiters: Array<{\n resolve(result: IteratorResult<AcpEvent>): void;\n reject(error: unknown): void;\n }> = [];\n let eventsDone = false;\n let eventStreamError: unknown;\n const ctx: SpawnContext = {\n sessionId: \"unknown\",\n agent: agentId,\n ...(options.logPath !== undefined ? { logPath: options.logPath } : {}),\n ...(options.logDir !== undefined ? { logDir: options.logDir } : {}),\n ...(options.logFileName !== undefined ? { logFileName: options.logFileName } : {}),\n events: [],\n usage: {\n inputTokens: 0,\n outputTokens: 0\n },\n prompt: options.prompt,\n model: options.model,\n mode: options.mode,\n cwd: options.cwd ?? process.cwd(),\n startedAt: new Date()\n };\n\n const pushEvent = (event: AcpEvent): void => {\n if (eventsDone) return;\n if (event.event === \"session_start\") {\n const threadId = (event as { threadId?: unknown }).threadId;\n if (typeof threadId === \"string\" && threadId.length > 0) {\n ctx.threadId = threadId;\n ctx.sessionId = threadId;\n }\n }\n ctx.events.push(event);\n accumulateUsage(ctx, event);\n const waiter = waiters.shift();\n if (waiter) {\n waiter.resolve({ done: false, value: event });\n return;\n }\n eventQueue.push(event);\n };\n\n const completeEventStream = (): void => {\n if (eventsDone) return;\n eventsDone = true;\n while (waiters.length > 0) {\n waiters.shift()?.resolve({ done: true, value: undefined });\n }\n };\n\n const failEventStream = (error: unknown): void => {\n if (eventsDone) return;\n eventStreamError = error;\n eventsDone = true;\n while (waiters.length > 0) {\n waiters.shift()?.reject(error);\n }\n };\n\n ctx.eventStream = {\n [Symbol.asyncIterator](): AsyncIterator<AcpEvent> {\n return {\n next(): Promise<IteratorResult<AcpEvent>> {\n if (eventQueue.length > 0) {\n return Promise.resolve({ done: false, value: eventQueue.shift()! });\n }\n if (eventStreamError) {\n return Promise.reject(eventStreamError);\n }\n if (eventsDone) {\n return Promise.resolve({ done: true, value: undefined });\n }\n return new Promise((resolve, reject) => {\n waiters.push({ resolve, reject });\n });\n }\n };\n }\n };\n\n const manifest = bridgeResourcesForRun(options.agentId, cwd, options.skills, options.hooks);\n\n void (async () => {\n try {\n for await (const output of adapter(queue.lines())) {\n if (!isAcpEvent(output)) continue;\n pushEvent(stampReceiveTime(output, Date.now()));\n }\n completeEventStream();\n resolveEventStreamDone?.();\n } catch (error) {\n failEventStream(error);\n rejectEventStreamDone?.(error);\n }\n })();\n\n const done = (async (): Promise<SpawnResult> => {\n try {\n await applyMiddlewares(\n [\n ...(options.middlewares ?? []),\n async (_ctx, next) => {\n try {\n const runResult = await runPoeCommand({\n factory: execution.factory,\n openSpec: execution.openSpec,\n detach: execution.detach,\n state: execution.state,\n signal: options.signal\n });\n\n if (runResult.kind === \"detached\") {\n result.stdout = \"\";\n result.stderr = \"\";\n result.exitCode = 0;\n result.detached = { jobId: runResult.jobId, envId: runResult.envId };\n } else {\n result.stderr = runResult.stderr ?? \"\";\n result.exitCode = runResult.exitCode;\n }\n } finally {\n queue.close();\n }\n await eventStreamDone;\n await next();\n }\n ],\n ctx\n );\n\n return {\n ...result,\n ...(ctx.logFile && !result.logFile ? { logFile: ctx.logFile } : {})\n };\n } finally {\n cleanupResourcesForRun(manifest);\n }\n })();\n\n return {\n events: ctx.eventStream,\n done: observeAgentSpawn(\n {\n agent: agentId,\n cwd: options.cwd,\n mode: options.mode,\n otelSink: options.otelSink,\n prompt: options.prompt\n },\n () => done\n )\n };\n}\n", "import { renderAcpStream } from \"./acp/renderer.js\";\nimport type { AcpEvent } from \"./acp/types.js\";\nimport { isActivityTimeoutError } from \"./spawn.js\";\n\nconst DEFAULT_ACTIVITY_TIMEOUT_MS = 10 * 60 * 1000;\nconst DEFAULT_MAX_TIMEOUT_RETRIES = 3;\n\nexport interface StreamingSpawnReturn<TResult> {\n events: AsyncIterable<AcpEvent>;\n result: Promise<TResult>;\n}\n\nexport type StreamingSpawnFn<TOptions, TResult> = (\n service: string,\n options: TOptions\n) => StreamingSpawnReturn<TResult>;\n\nexport type AutonomousOptions<TOptions> = TOptions & {\n service: string;\n maxTimeoutRetries?: number;\n activityTimeoutMs?: number;\n};\n\n/**\n * Drive a streaming spawn end-to-end: pipe ACP events through `renderAcpStream`\n * (which routes through `withAcpWriter` if bound) and return the final result.\n * Retries on activity timeout up to `maxTimeoutRetries` attempts.\n *\n * Both the SDK `spawn.autonomous` and the superintendent loop consume this \u2014\n * callers supply a streaming spawn function whose `result` promise resolves\n * to their own result shape.\n */\nexport async function spawnAutonomous<\n TOptions extends { activityTimeoutMs?: number },\n TResult\n>(\n streamSpawn: StreamingSpawnFn<TOptions, TResult>,\n options: AutonomousOptions<TOptions>\n): Promise<TResult> {\n const {\n service,\n maxTimeoutRetries = DEFAULT_MAX_TIMEOUT_RETRIES,\n activityTimeoutMs = DEFAULT_ACTIVITY_TIMEOUT_MS,\n ...rest\n } = options;\n\n const spawnOptions = { ...rest, activityTimeoutMs } as unknown as TOptions;\n\n for (let attempt = 1; attempt <= maxTimeoutRetries; attempt += 1) {\n let result: Promise<TResult> | undefined;\n try {\n const stream = streamSpawn(service, spawnOptions);\n result = stream.result;\n // Attach to the final result immediately so a failed attempt can retry\n // without hanging behind ACP rendering that is still flushing.\n const [spawnResult] = await Promise.all([\n result,\n renderAcpStream(stream.events)\n ]);\n return spawnResult;\n } catch (error) {\n result?.catch(() => {});\n if (!isActivityTimeoutError(error) || attempt === maxTimeoutRetries) {\n throw error;\n }\n }\n }\n\n throw new Error(\"Unreachable\");\n}\n", "import path from \"node:path\";\nimport { homedir } from \"node:os\";\nimport type { Dirent } from \"node:fs\";\nimport { open, readdir } from \"node:fs/promises\";\nimport { createInterface } from \"node:readline\";\nimport type { SessionUpdate } from \"@poe-code/poe-acp-client\";\nimport { mapLegacyEventToSessionUpdates } from \"@poe-code/poe-acp-client\";\nimport { renderSessionUpdateStream } from \"./renderer.js\";\nimport type { AcpEvent } from \"./types.js\";\n\nconst DEFAULT_LOG_LIMIT = 80;\nconst JSONL_EXTENSION = \".jsonl\";\n\nexport interface LogEntry {\n path: string;\n filename: string;\n agent?: string;\n timestamp?: Date;\n}\n\ninterface ListSpawnLogsOptions {\n agent?: string;\n limit?: number;\n}\n\nfunction isDigitString(value: string, length: number): boolean {\n if (value.length !== length) return false;\n for (const char of value) {\n if (char < \"0\" || char > \"9\") return false;\n }\n return true;\n}\n\nfunction parseTimestamp(day: string, time: string, milliseconds: string): Date | undefined {\n if (!isDigitString(day, 8) || !isDigitString(time, 6) || !isDigitString(milliseconds, 3)) {\n return undefined;\n }\n\n const year = Number(day.slice(0, 4));\n const month = Number(day.slice(4, 6));\n const date = Number(day.slice(6, 8));\n const hours = Number(time.slice(0, 2));\n const minutes = Number(time.slice(2, 4));\n const seconds = Number(time.slice(4, 6));\n const millis = Number(milliseconds);\n\n const timestamp = new Date(Date.UTC(year, month - 1, date, hours, minutes, seconds, millis));\n\n if (\n Number.isNaN(timestamp.getTime()) ||\n timestamp.getUTCFullYear() !== year ||\n timestamp.getUTCMonth() !== month - 1 ||\n timestamp.getUTCDate() !== date ||\n timestamp.getUTCHours() !== hours ||\n timestamp.getUTCMinutes() !== minutes ||\n timestamp.getUTCSeconds() !== seconds ||\n timestamp.getUTCMilliseconds() !== millis\n ) {\n return undefined;\n }\n\n return timestamp;\n}\n\nfunction parseLogFilename(filename: string): { agent?: string; timestamp?: Date } {\n if (!filename.endsWith(JSONL_EXTENSION)) return {};\n\n const baseName = filename.slice(0, -JSONL_EXTENSION.length);\n const parts = baseName.split(\"-\");\n\n if (parts.length < 4) return {};\n\n const timestamp = parseTimestamp(parts[0], parts[1], parts[2]);\n const agent = parts.slice(3).join(\"-\");\n\n return {\n agent: agent.length > 0 ? agent : undefined,\n timestamp\n };\n}\n\nfunction normalizeLimit(limit: number | undefined): number {\n if (typeof limit !== \"number\" || !Number.isFinite(limit) || limit < 0) {\n return DEFAULT_LOG_LIMIT;\n }\n return Math.floor(limit);\n}\n\nfunction isSessionUpdate(parsed: unknown): parsed is SessionUpdate {\n return (\n typeof parsed === \"object\" &&\n parsed !== null &&\n \"sessionUpdate\" in parsed &&\n typeof (parsed as Record<string, unknown>).sessionUpdate === \"string\"\n );\n}\n\nfunction isLegacyEvent(parsed: unknown): parsed is AcpEvent {\n return (\n typeof parsed === \"object\" &&\n parsed !== null &&\n \"event\" in parsed &&\n typeof (parsed as Record<string, unknown>).event === \"string\"\n );\n}\n\nexport async function* readSpawnLog(filePath: string): AsyncIterable<SessionUpdate> {\n const fileHandle = await open(filePath, \"r\");\n const stream = fileHandle.createReadStream({ encoding: \"utf8\" });\n const reader = createInterface({\n input: stream,\n crlfDelay: Infinity\n });\n\n try {\n for await (const line of reader) {\n const trimmed = line.trim();\n if (trimmed.length === 0) continue;\n\n const parsed: unknown = JSON.parse(trimmed);\n\n if (isSessionUpdate(parsed)) {\n yield parsed;\n continue;\n }\n\n if (isLegacyEvent(parsed)) {\n for (const update of mapLegacyEventToSessionUpdates(parsed as { event: string } & Record<string, unknown>)) {\n yield update;\n }\n }\n }\n } finally {\n reader.close();\n if (!stream.destroyed) {\n stream.destroy();\n }\n await fileHandle.close().catch(() => {});\n }\n}\n\nexport async function listSpawnLogs(options: ListSpawnLogsOptions = {}): Promise<LogEntry[]> {\n const logDir = path.join(homedir(), \".poe-code\", \"spawn-logs\");\n const limit = normalizeLimit(options.limit);\n\n let entries: Dirent[];\n try {\n entries = await readdir(logDir, { withFileTypes: true });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return [];\n throw error;\n }\n\n const logs: LogEntry[] = [];\n\n for (const entry of entries) {\n if (!entry.isFile() || !entry.name.endsWith(JSONL_EXTENSION)) continue;\n\n const logEntry: LogEntry = {\n path: path.join(logDir, entry.name),\n filename: entry.name,\n ...parseLogFilename(entry.name)\n };\n\n if (options.agent && logEntry.agent !== options.agent) continue;\n\n logs.push(logEntry);\n }\n\n logs.sort((a, b) => (a.filename < b.filename ? 1 : a.filename > b.filename ? -1 : 0));\n return logs.slice(0, limit);\n}\n\nexport async function findLatestLog(agent?: string): Promise<string | undefined> {\n const [entry] = await listSpawnLogs({ agent, limit: 1 });\n return entry?.path;\n}\n\nexport async function pickRandomLog(agent?: string): Promise<string | undefined> {\n const entries = await listSpawnLogs({ agent });\n if (entries.length === 0) return undefined;\n return entries[Math.floor(Math.random() * entries.length)]?.path;\n}\n\nexport async function replaySpawnLog(filePath: string): Promise<void> {\n await renderSessionUpdateStream(readSpawnLog(filePath));\n}\n", "import path from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { mkdir, open, type FileHandle } from \"node:fs/promises\";\nimport type { AcpEvent } from \"../types.js\";\nimport type { AcpMiddleware, SpawnContext } from \"../middleware.js\";\n\nfunction pad(value: number, width: number): string {\n return String(value).padStart(width, \"0\");\n}\n\nfunction formatTimestamp(date: Date): { day: string; time: string; milliseconds: string } {\n const day = `${date.getUTCFullYear()}${pad(date.getUTCMonth() + 1, 2)}${pad(date.getUTCDate(), 2)}`;\n const time = `${pad(date.getUTCHours(), 2)}${pad(date.getUTCMinutes(), 2)}${pad(date.getUTCSeconds(), 2)}`;\n const milliseconds = pad(date.getUTCMilliseconds(), 3);\n return { day, time, milliseconds };\n}\n\nfunction normalizeAgent(agent: string): string {\n let normalized = \"\";\n for (const char of agent) {\n const code = char.charCodeAt(0);\n const isLower = code >= 97 && code <= 122;\n const isUpper = code >= 65 && code <= 90;\n const isDigit = code >= 48 && code <= 57;\n\n if (isLower || isUpper || isDigit || char === \"-\" || char === \"_\") {\n normalized += char;\n } else {\n normalized += \"-\";\n }\n }\n\n return normalized.length > 0 ? normalized : \"agent\";\n}\n\nfunction resolveStartedAt(value: Date | undefined): Date {\n if (!(value instanceof Date) || Number.isNaN(value.getTime())) {\n return new Date();\n }\n\n return value;\n}\n\nfunction resolveLogFilePath(ctx: SpawnContext): string {\n if (ctx.logPath) {\n return ctx.logPath;\n }\n const baseDir = ctx.logDir ?? path.join(homedir(), \".poe-code\", \"spawn-logs\");\n if (ctx.logFileName) {\n return path.join(baseDir, ctx.logFileName);\n }\n const startedAt = resolveStartedAt(ctx.startedAt);\n const { day, time, milliseconds } = formatTimestamp(startedAt);\n const fileName = `${day}-${time}-${milliseconds}-${normalizeAgent(ctx.agent)}.jsonl`;\n return path.join(baseDir, fileName);\n}\n\nclass SpawnLogWriter {\n private fileHandle: FileHandle | undefined;\n\n private isDisabled = false;\n\n readonly filePath: string;\n\n private readonly logDirPath: string;\n\n constructor(ctx: SpawnContext) {\n this.filePath = resolveLogFilePath(ctx);\n this.logDirPath = path.dirname(this.filePath);\n }\n\n async writeEvent(event: AcpEvent): Promise<void> {\n if (this.isDisabled) {\n return;\n }\n\n try {\n await this.ensureOpen();\n if (!this.fileHandle) {\n return;\n }\n\n const meta = (event as { _meta?: Record<string, unknown> })._meta;\n const toLog = meta?.raw ?? event;\n await this.fileHandle.appendFile(`${JSON.stringify(toLog)}\\n`, \"utf8\");\n } catch {\n this.isDisabled = true;\n await this.close();\n }\n }\n\n async close(): Promise<void> {\n if (!this.fileHandle) {\n return;\n }\n\n try {\n await this.fileHandle.close();\n } catch {\n // Ignore close errors to avoid disrupting event processing.\n } finally {\n this.fileHandle = undefined;\n }\n }\n\n private async ensureOpen(): Promise<void> {\n if (this.fileHandle || this.isDisabled) {\n return;\n }\n\n try {\n await mkdir(this.logDirPath, { recursive: true });\n this.fileHandle = await open(this.filePath, \"a\");\n } catch {\n this.isDisabled = true;\n }\n }\n}\n\nasync function writePreloadedEvents(writer: SpawnLogWriter, events: AcpEvent[]): Promise<void> {\n for (const event of events) {\n await writer.writeEvent(event);\n }\n}\n\nexport const spawnLog: AcpMiddleware = async (ctx, next) => {\n await next();\n\n const source = ctx.eventStream;\n const writer = new SpawnLogWriter(ctx);\n ctx.logFile = writer.filePath;\n\n await writePreloadedEvents(writer, ctx.events);\n\n if (!source) {\n await writer.close();\n return;\n }\n\n ctx.eventStream = (async function* () {\n try {\n for await (const event of source) {\n await writer.writeEvent(event);\n yield event;\n }\n } finally {\n await writer.close();\n }\n })();\n};\n", "import {\n agent as composableAgent,\n openaiChatCompletionsPlugin as composableOpenaiChatCompletionsPlugin,\n openaiResponsesPlugin as composableOpenaiResponsesPlugin,\n systemPromptPlugin as composableSystemPromptPlugin\n} from \"@poe-code/poe-agent\";\n\nexport type ToolResultTextPart = {\n type: \"text\";\n text: string;\n};\n\nexport type ToolResultImagePart = {\n type: \"image\";\n mimeType: string;\n data: string;\n};\n\nexport type ToolResultErrorPart = {\n type: \"error\";\n code: string;\n message: string;\n retriable: boolean;\n};\n\nexport type ToolResultPart = ToolResultTextPart | ToolResultImagePart | ToolResultErrorPart;\nexport type ToolResult = string | ToolResultPart | ToolResultPart[];\nexport type SpawnMode = \"yolo\" | \"edit\" | \"read\";\n\nexport type ChatMessage = {\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content: string | ToolResultPart[];\n reasoning_content?: string;\n reasoning?: string;\n thinking?: Array<{ text: string; signature?: string }>;\n redacted_thinking?: Array<{ data: string }>;\n reasoning_details?: unknown[];\n name?: string;\n toolCallId?: string;\n tool_calls?: Array<{\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n }>;\n};\n\nexport type AcpModelRequestMessage = Omit<ChatMessage, \"toolCallId\"> & {\n tool_call_id?: string;\n};\n\nexport type ToolCallRecord = {\n intentId: string;\n tool: string;\n args: unknown;\n status: \"success\" | \"error\";\n result?: unknown;\n error?: string;\n};\n\nexport type RunResult = {\n output: string;\n stdout: string;\n summary?: string;\n messages: ChatMessage[];\n toolCalls: ToolCallRecord[];\n usage?: UsageInfo;\n logFile?: string;\n exitCode: number;\n stderr: string;\n};\n\nexport type UsageInfo = {\n inputTokens: number;\n outputTokens: number;\n cachedTokens: number;\n cacheCreationTokens: number;\n};\n\nexport type ForkResult = {\n output: string;\n messages: ChatMessage[];\n};\n\nexport type ToolContext = {\n fork(prompt: string): Promise<ForkResult>;\n spawn(prompt: string): Promise<{ output: string; messages: ChatMessage[] }>;\n signal: AbortSignal;\n notify?(notification: { event: string; message?: string; data?: unknown }): void | Promise<void>;\n};\n\nexport type ToolEvent =\n | { type: \"message.delta\"; content: string }\n | { type: \"progress\"; message: string };\n\nexport type Tool = {\n name: string;\n description?: string;\n inputSchema?: unknown;\n visibility?: \"model\" | \"skill\" | \"internal\";\n policy?: {\n read: boolean;\n edit: boolean;\n validate?(args: unknown, mode: SpawnMode): string | void | Promise<string | void>;\n };\n call(\n args: unknown,\n context: ToolContext\n ): ToolResult | Promise<ToolResult> | AsyncGenerator<ToolEvent, ToolResult, void>;\n};\n\nexport type McpServerConfig = {\n name: string;\n command: string;\n args?: string[];\n env?: Record<string, string>;\n timeout?: number;\n visibility?: \"model\" | \"skill\";\n};\n\nexport type McpServerMap = Record<string, Omit<McpServerConfig, \"name\" | \"visibility\">>;\n\nexport type PromptContext = {\n baseSystemPrompt?: string;\n system?: string;\n userPrompt: string;\n metadata?: Record<string, unknown>;\n};\n\nexport type Logger = {\n debug?(message: string, data?: unknown): void;\n info?(message: string, data?: unknown): void;\n warn?(message: string, data?: unknown): void;\n error?(message: string, data?: unknown): void;\n};\n\nexport type ProviderStreamEvent =\n | { type: \"text\"; text: string }\n | { type: \"thinking\"; text: string; signature?: string }\n | { type: \"redacted_thinking\"; data: string }\n | { type: \"reasoning_details\"; payload: unknown }\n | { type: \"tool_use_delta\"; id: string; name?: string; argsDelta?: string }\n | { type: \"tool_use_complete\"; id: string; name: string; args: unknown }\n | { type: \"tool_use_json_parse_error\"; id: string; raw: string; error: string }\n | { type: \"usage\"; inputTokens: number; outputTokens: number; cachedTokens: number; cacheCreationTokens: number }\n | { type: \"stop\"; reason: \"end_turn\" | \"tool_use\" | \"max_tokens\" | \"error\" };\n\nexport type AcpModel = {\n complete(request: {\n messages: AcpModelRequestMessage[];\n tools: Array<{ name: string; description?: string; inputSchema?: unknown }>;\n signal: AbortSignal;\n }): Promise<{ events: AsyncIterable<ProviderStreamEvent> }>;\n};\n\nexport type ProviderContext = {\n fetch: typeof fetch;\n signal?: AbortSignal;\n logger?: Logger;\n options: unknown;\n};\n\nexport type Provider = {\n name: string;\n supports(modelId: string): boolean;\n createModel(modelId: string, context: ProviderContext): AcpModel | Promise<AcpModel>;\n};\n\nexport type ToolUseContext = {\n tool: string;\n args: unknown;\n intentId: string;\n result?: unknown;\n error?: string;\n session: Map<string, unknown>;\n messages: ChatMessage[];\n signal: AbortSignal;\n};\n\nexport type SessionStartContext = {\n session: Map<string, unknown>;\n messages: ChatMessage[];\n signal: AbortSignal;\n};\n\nexport type UserPromptSubmitContext = {\n prompt: string;\n messages: ChatMessage[];\n signal: AbortSignal;\n};\n\nexport type IterationContext = {\n iterationNumber: number;\n tokenCount: number;\n messages: ChatMessage[];\n signal: AbortSignal;\n fork(prompt: string): Promise<ForkResult>;\n complete(messages: ChatMessage[]): Promise<string>;\n};\n\nexport type PreCompactionContext = {\n tokenCount: number;\n force: boolean;\n messages: ChatMessage[];\n signal: AbortSignal;\n};\n\nexport type PostCompactionContext = {\n tokenCount: number;\n summary: string;\n droppedMessages: ChatMessage[];\n messages: ChatMessage[];\n signal: AbortSignal;\n};\n\nexport type NotificationContext = {\n event: string;\n message?: string;\n data?: unknown;\n messages: ChatMessage[];\n signal: AbortSignal;\n};\n\nexport type StopContext = {\n status: \"completed\" | \"error\";\n output?: string;\n error?: Error;\n toolCalls: ToolCallRecord[];\n messages: ChatMessage[];\n signal: AbortSignal;\n};\n\nexport type HookDecision = \"skip\" | \"abort\" | { reject: string } | void;\n\nexport type PluginApi = {\n addTool(tool: Tool): void;\n addMcp(config: McpServerConfig): void;\n getTool(name: string): Tool | undefined;\n};\n\nexport type AgentPlugin = {\n name: string;\n tools?: Tool[];\n providers?: Provider[];\n prompt?(context: PromptContext): PromptContext | Promise<PromptContext>;\n hooks?: {\n sessionStart?(context: SessionStartContext): HookDecision | Promise<HookDecision>;\n userPromptSubmit?(context: UserPromptSubmitContext): HookDecision | Promise<HookDecision>;\n preToolUse?(context: ToolUseContext): HookDecision | Promise<HookDecision>;\n postToolUse?(context: ToolUseContext): HookDecision | Promise<HookDecision>;\n preIteration?(context: IterationContext): HookDecision | Promise<HookDecision>;\n postIteration?(context: IterationContext): HookDecision | Promise<HookDecision>;\n preCompaction?(context: PreCompactionContext): HookDecision | Promise<HookDecision>;\n postCompaction?(context: PostCompactionContext): HookDecision | Promise<HookDecision>;\n notification?(context: NotificationContext): HookDecision | Promise<HookDecision>;\n stop?(context: StopContext): HookDecision | Promise<HookDecision>;\n };\n setup?(api: PluginApi): void | Promise<void>;\n dispose?(): void | Promise<void>;\n};\n\nexport type AcpEvent =\n | { type: \"message.delta\"; content: string }\n | { type: \"tool.intent\"; intentId: string; tool: string; args: unknown }\n | { type: \"tool.result\"; intentId: string; result: unknown }\n | { type: \"tool.error\"; intentId: string; error: string }\n | { type: \"progress\"; message: string }\n | { type: \"usage\"; usage: UsageInfo }\n | { type: \"session.complete\"; result: RunResult }\n | { type: \"session.error\"; error: Error };\n\nexport type AgentRunOptions = {\n signal?: AbortSignal;\n resume?: RunResult;\n skills?: string[];\n maxIterations?: number;\n apiKey?: string;\n baseUrl?: string;\n fetch?: typeof fetch;\n cwd?: string;\n baseSystemPrompt?: string;\n acpModel?: AcpModel;\n onStdout?: (chunk: string) => void;\n logPath?: string;\n};\n\nexport type AgentSession = {\n events: AsyncIterable<AcpEvent>;\n acknowledge(intentId: string, result: { status: \"success\" | \"error\"; result: unknown }): void;\n dispose(): Promise<void>;\n};\n\nexport type AgentBuilder = {\n model(model: string): AgentBuilder;\n use(plugin: AgentPlugin): AgentBuilder;\n tools(...tools: Tool[]): AgentBuilder;\n mcp(configs: McpServerMap): AgentBuilder;\n mcp(...configs: McpServerConfig[]): AgentBuilder;\n acp(prompt: string, options?: AgentRunOptions): Promise<AgentSession>;\n run(prompt: string, options?: AgentRunOptions): Promise<RunResult>;\n stream(prompt: string, options?: AgentRunOptions): AsyncIterable<AcpEvent>;\n};\n\nexport type OpenaiProviderPluginOptions = {\n baseUrl?: string;\n apiKey?: string;\n organization?: string;\n defaultHeaders?: Record<string, string>;\n timeout?: number;\n maxRetries?: number;\n};\n\nexport type OpenaiResponsesPluginOptions = OpenaiProviderPluginOptions & {\n project?: string;\n reasoningEffort?: \"minimal\" | \"low\" | \"medium\" | \"high\";\n reasoningSummary?: \"auto\" | \"concise\" | \"detailed\";\n include?: string[];\n};\n\nexport const agent = composableAgent as unknown as () => AgentBuilder;\nexport const openaiChatCompletionsPlugin = composableOpenaiChatCompletionsPlugin as unknown as (\n options?: OpenaiProviderPluginOptions\n) => AgentPlugin;\nexport const openaiResponsesPlugin = composableOpenaiResponsesPlugin as unknown as (\n options?: OpenaiResponsesPluginOptions\n) => AgentPlugin;\nexport const systemPromptPlugin = composableSystemPromptPlugin as unknown as () => AgentPlugin;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["fsPromises", "key", "key", "error", "message", "resolve", "error", "message", "isObjectRecord", "message", "isObjectRecord", "message", "error", "resolve", "spawn", "resolve", "error", "toError", "message", "path", "assertExtensionMethod", "error", "resolve", "fsPromises", "path", "isObjectRecord", "key", "path", "fs", "fsPromises", "content", "replaceAll", "text", "key", "isObjectRecord", "error", "spec", "homedir", "path", "error", "key", "cached", "resolve", "error", "message", "resolve", "spec", "toNonEmptyString", "cloneStringRecord", "message", "error", "key", "OpenAI", "DEFAULT_BASE_URL", "spec", "readOptionalStringRecord", "mergePluginOptions", "resolveClientApiKey", "resolveClientBaseUrl", "toNonEmptyString", "cloneStringRecord", "OpenAI", "normalizeToolInputSchema", "getOrCreateToolCallBuffer", "parseToolArguments", "extractUsage", "message", "error", "toNonNegativeInteger", "key", "spawn", "path", "path", "runCommand", "error", "spawn", "message", "toError", "resolve", "spec", "spec", "spec", "estimateTokenCount", "message", "spec", "fsPromises", "path", "path", "fs", "fsPromises", "error", "spec", "spec", "message", "key", "error", "spec", "error", "message", "normalizeName", "error", "normalizeActiveSkills", "errors", "error", "error", "message", "resolve", "handlers", "spawn", "path", "URL", "crypto", "crypto", "error", "JsonRpcMessageLayer", "isObjectRecord", "hasOwn", "message", "isRequestId", "spawn", "chunkToString", "resolve", "error", "message", "serializeJsonRpcMessage", "chunkToString", "normalizeLine", "readLines", "JsonRpcMessageLayer", "message", "serializeJsonRpcMessage", "resolve", "error", "readLines", "parseError", "isObjectRecord", "isRequestId", "hasOwn", "toRequestId", "invalidRequest", "isJsonRpcErrorObject", "isObjectRecord", "invalidRequest", "toRequestId", "hasOwn", "isRequestId", "isJsonRpcErrorObject", "assertNotAborted", "error", "message", "error", "path", "join", "error", "toError", "assertNotAborted", "resolve", "message", "appendFile", "spawnChildProcess", "path", "fsPromises", "path", "fsPromises", "execSync", "randomBytes", "path", "key", "randomBytes", "readFile", "path", "spawnChildProcess", "spec", "resolve", "bindAbortSignal", "spec", "path", "readFile", "cached", "key", "randomBytes", "spec", "path", "path", "fsPromises", "os", "message", "error", "resolve", "path", "fs", "stat", "path", "parseDocument", "TASK_SCHEMA_ID", "agent", "agent", "path", "shellQuote", "fs", "stat", "error", "throwIfAborted", "text", "sleep", "resolve", "randomBytes", "agent", "spec", "readStream", "resolve", "error", "createAbortError", "randomBytes", "existsSync", "readFileSync", "os", "path", "key", "isRecord", "key", "path", "path", "fs", "error", "path", "parseDocument", "path", "key", "isPlainObject", "path", "text", "open", "text", "spacing", "message", "open", "frame", "close", "lookup", "key", "spawn", "process", "AsyncLocalStorage", "PassThrough", "parseDocument", "error", "path", "parseYaml", "path", "error", "fs", "path", "error", "isRecord", "key", "fs", "path", "isRecord", "path", "key", "error", "message", "path", "key", "isRecord", "path", "EMPTY_DOCUMENT", "path", "agent", "agent", "agent", "EMPTY_DOCUMENT", "os", "path", "nodeFs", "isNotFoundError", "error", "fs", "path", "error", "isNotFoundError", "stat", "isRecord", "path", "fs", "path", "error", "isNotFoundError", "isRecord", "fs", "os", "existsSync", "readFileSync", "key", "createHash", "nodeFs", "path", "path", "createHash", "readFile", "path", "readFile", "cached", "error", "createHash", "key", "path", "mkdtempSync", "rmSync", "readFile", "tmpdir", "path", "PassThrough", "Writable", "path", "JOB_DIR", "fs", "process", "shellQuote", "path", "path", "mkdtempSync", "tmpdir", "runOrThrow", "readFile", "rmSync", "shellQuote", "spec", "PassThrough", "Writable", "result", "error", "os", "nodeFs", "os", "fs", "nodeFs", "spec", "path", "e2bExecutionEnvFactory", "e2bExecutionEnvFactory", "spec", "spawnChildProcess", "resolve", "error", "spawn", "key", "lookup", "mkdirSync", "openSync", "closeSync", "path", "agent", "errors", "error", "throwIfAborted", "createAbortError", "error", "throwIfAborted", "sleep", "resolve", "createAbortError", "crypto", "os", "os", "path", "supportedAgents", "os", "path", "readFile", "stat", "path", "fileURLToPath", "path", "tiers", "path", "fs", "path", "path", "error", "isNodeError", "fs", "path", "isNodeError", "error", "pathExists", "isDirectory", "supportedAgents", "path", "os", "path", "resolveAgentSupport", "getAgentConfig", "expandHome", "os", "path", "readFileSync", "path", "error", "getAgentConfig", "key", "mkdirSync", "readFileSync", "writeFileSync", "path", "error", "mkdirSync", "path", "requireAgentConfig", "getAgentConfig", "isRecord", "key", "error", "mkdirSync", "path", "fs", "path", "isNodeError", "error", "pathExists", "collectMissingParents", "path", "removeDirectoryIfEmpty", "resolveAgentSupport", "key", "crypto", "os", "warning", "error", "text", "key", "error", "message", "path", "error", "message", "text", "path", "error", "error", "error", "createAbortError", "error", "resolve", "createAbortError", "error", "getDefaultArgsPosition", "getMcpArgsPosition", "getResumeArgs", "spawn", "createAbortError", "path", "mkdirSync", "openSync", "closeSync", "path", "homedir", "open", "readdir", "path", "homedir", "mkdir", "open", "agent", "openaiChatCompletionsPlugin", "openaiResponsesPlugin", "systemPromptPlugin"]
|
|
7
|
+
}
|