poe-code 3.0.72-beta.2 → 3.0.73
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/cli/commands/agent.d.ts +3 -0
- package/dist/cli/commands/agent.js +77 -0
- package/dist/cli/commands/agent.js.map +1 -0
- package/dist/cli/commands/ralph.js +14 -13
- package/dist/cli/commands/ralph.js.map +1 -1
- package/dist/cli/program.js +7 -0
- package/dist/cli/program.js.map +1 -1
- package/dist/index.js +16881 -19757
- package/dist/index.js.map +4 -4
- package/dist/providers/poe-agent.d.ts +20 -0
- package/dist/providers/poe-agent.js +3930 -0
- package/dist/providers/poe-agent.js.map +7 -0
- package/dist/sdk/spawn.js +17 -0
- package/dist/sdk/spawn.js.map +1 -1
- package/package.json +4 -2
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/templates/python/env.hbs", "../../src/templates/python/main.py.hbs", "../../src/templates/python/requirements.txt.hbs", "../../src/templates/codex/config.toml.hbs", "../../packages/auth/src/encrypted-file-auth-store.ts", "../../packages/auth/src/keychain-auth-store.ts", "../../packages/auth/src/create-auth-store.ts", "../../packages/auth/src/index.ts", "../../packages/poe-agent/src/chat.ts", "../../packages/poe-agent/src/system-prompt.ts", "../../packages/poe-agent/src/tool-executor.ts", "../../packages/poe-agent/src/agent-session.ts", "../../packages/poe-agent/src/index.ts", "../../src/cli/constants.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-acp-client/src/stream-helpers.ts", "../../packages/config-mutations/src/execution/apply-mutation.ts", "../../packages/config-mutations/src/formats/json.ts", "../../packages/config-mutations/src/formats/toml.ts", "../../packages/config-mutations/src/formats/index.ts", "../../packages/config-mutations/src/execution/path-utils.ts", "../../packages/config-mutations/src/fs-utils.ts", "../../packages/config-mutations/src/execution/run-mutations.ts", "../../packages/config-mutations/src/template/render.ts", "../../src/services/service-install.ts", "../../src/providers/create-provider.ts", "../../src/providers/poe-agent.ts"],
|
|
4
|
+
"sourcesContent": ["POE_API_KEY={{apiKey}}\nPOE_BASE_URL=https://api.poe.com/v1\nMODEL={{model}}\n", "import os\nfrom openai import OpenAI\nfrom dotenv import load_dotenv\n\nload_dotenv()\n\nclient = OpenAI(\n api_key=os.getenv(\"POE_API_KEY\"),\n base_url=os.getenv(\"POE_BASE_URL\")\n)\n\nresponse = client.chat.completions.create(\n model=os.getenv(\"MODEL\", \"{{model}}\"),\n messages=[{\"role\": \"user\", \"content\": \"Tell me a joke\"}]\n)\n\nprint(response.choices[0].message.content)\n", "openai>=1.0.0\npython-dotenv>=1.0.0\n", "model_provider = \"poe\"\nmodel = \"{{{model}}}\"\nmodel_reasoning_effort = \"{{reasoningEffort}}\"\nmodel_verbosity = \"medium\"\n\n[model_providers.poe]\nname = \"poe\"\nbase_url = \"{{{baseUrl}}}\"\nwire_api = \"responses\"\nexperimental_bearer_token = \"{{apiKey}}\"\n", "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 { AuthStore } from \"./types.js\";\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_SALT = \"poe-code:encrypted-file-auth-store:v1\";\nconst ENCRYPTION_FILE_MODE = 0o600;\n\ninterface EncryptedCredentialDocument {\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 EncryptedFileAuthStoreFileSystem {\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 EncryptedFileAuthStoreInput {\n fs?: EncryptedFileAuthStoreFileSystem;\n filePath?: string;\n getMachineIdentity?: () => MachineIdentity | Promise<MachineIdentity>;\n getHomeDirectory?: () => string;\n getRandomBytes?: (size: number) => Buffer;\n}\n\nexport class EncryptedFileAuthStore implements AuthStore {\n private readonly fs: EncryptedFileAuthStoreFileSystem;\n private readonly filePath: 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: EncryptedFileAuthStoreInput = {}) {\n this.fs = input.fs ?? fs;\n this.filePath = input.filePath ?? path.join(\n (input.getHomeDirectory ?? homedir)(),\n \".poe-code\",\n \"credentials.enc\"\n );\n this.getMachineIdentity = input.getMachineIdentity ?? defaultMachineIdentity;\n this.getRandomBytes = input.getRandomBytes ?? randomBytes;\n }\n\n async getApiKey(): 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 setApiKey(apiKey: 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(apiKey, \"utf8\"),\n cipher.final()\n ]);\n const authTag = cipher.getAuthTag();\n\n const document: EncryptedCredentialDocument = {\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 deleteApiKey(): 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);\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): Promise<Buffer> {\n const machineIdentity = await getMachineIdentity();\n const secret = `${machineIdentity.hostname}:${machineIdentity.username}`;\n\n return await new Promise<Buffer>((resolve, reject) => {\n scrypt(secret, ENCRYPTION_SALT, ENCRYPTION_KEY_BYTES, (error, derivedKey) => {\n if (error) {\n reject(error);\n return;\n }\n resolve(Buffer.from(derivedKey));\n });\n });\n}\n\nfunction parseEncryptedDocument(raw: string): EncryptedCredentialDocument | 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 { AuthStore } from \"./types.js\";\n\nconst SECURITY_CLI = \"security\";\nconst KEYCHAIN_SERVICE = \"poe-code\";\nconst KEYCHAIN_ACCOUNT = \"api-key\";\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 KeychainAuthStoreInput {\n runCommand?: KeychainCommandRunner;\n service?: string;\n account?: string;\n}\n\nexport class KeychainAuthStore implements AuthStore {\n private readonly runCommand: KeychainCommandRunner;\n private readonly service: string;\n private readonly account: string;\n\n constructor(input: KeychainAuthStoreInput = {}) {\n this.runCommand = input.runCommand ?? runSecurityCommand;\n this.service = input.service ?? KEYCHAIN_SERVICE;\n this.account = input.account ?? KEYCHAIN_ACCOUNT;\n }\n\n async getApiKey(): Promise<string | null> {\n const result = await this.executeSecurityCommand(\n [\"find-generic-password\", \"-s\", this.service, \"-a\", this.account, \"-w\"],\n \"read API key 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 API key from macOS Keychain\", result);\n }\n\n async setApiKey(apiKey: 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 apiKey,\n \"-U\"\n ],\n \"store API key in macOS Keychain\"\n );\n\n if (result.exitCode !== 0) {\n throw createSecurityCliFailure(\"store API key in macOS Keychain\", result);\n }\n }\n\n async deleteApiKey(): Promise<void> {\n const result = await this.executeSecurityCommand(\n [\"delete-generic-password\", \"-s\", this.service, \"-a\", this.account],\n \"delete API key from macOS Keychain\"\n );\n\n if (result.exitCode === 0 || isKeychainEntryNotFound(result)) {\n return;\n }\n\n throw createSecurityCliFailure(\"delete API key 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 { promises as nodeFs } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport path from \"node:path\";\nimport type {\n AuthBackend,\n AuthStoreWarningLogger,\n CreateAuthStoreInput,\n CreateAuthStoreResult,\n LegacyCredentialsMigrationFileSystem\n} from \"./types.js\";\nimport { EncryptedFileAuthStore } from \"./encrypted-file-auth-store.js\";\nimport { KeychainAuthStore } from \"./keychain-auth-store.js\";\n\nconst AUTH_BACKEND_ENV_VAR = \"POE_AUTH_BACKEND\";\nconst MACOS_PLATFORM = \"darwin\";\nconst LEGACY_CREDENTIALS_RELATIVE_PATH = \".poe-code/credentials.json\";\n\ninterface LegacyMigrationContext {\n fs: LegacyCredentialsMigrationFileSystem;\n filePath: string;\n logWarning: AuthStoreWarningLogger;\n}\n\ntype LegacyCredentialsDocument = Record<string, unknown> & {\n apiKey?: unknown;\n};\n\nconst authStoreFactories: Record<\n AuthBackend,\n (input: CreateAuthStoreInput) => CreateAuthStoreResult[\"store\"]\n> = {\n file: (input) => new EncryptedFileAuthStore(input.fileStore),\n keychain: (input) => new KeychainAuthStore(input.keychainStore)\n};\n\nexport function createAuthStore(\n input: CreateAuthStoreInput = {}\n): CreateAuthStoreResult {\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 `POE_AUTH_BACKEND=keychain is only supported on macOS. Current platform: ${platform}`\n );\n }\n\n const store = authStoreFactories[backend](input);\n\n return {\n backend,\n store: enableLegacyCredentialsMigration(store, input)\n };\n}\n\nfunction resolveBackend(input: CreateAuthStoreInput): AuthBackend {\n const configuredBackend =\n input.backend ?? input.env?.[AUTH_BACKEND_ENV_VAR] ?? process.env[AUTH_BACKEND_ENV_VAR];\n\n if (configuredBackend === \"keychain\") {\n return \"keychain\";\n }\n\n return \"file\";\n}\n\nfunction enableLegacyCredentialsMigration(\n store: CreateAuthStoreResult[\"store\"],\n input: CreateAuthStoreInput\n): CreateAuthStoreResult[\"store\"] {\n const migrationContext = createLegacyMigrationContext(input);\n const readApiKeyFromStore = store.getApiKey.bind(store);\n let hasCheckedLegacyCredentials = false;\n let legacyMigrationPromise: Promise<string | null> | null = null;\n\n store.getApiKey = async (): Promise<string | null> => {\n const storedApiKey = await readApiKeyFromStore();\n if (isNonEmptyString(storedApiKey)) {\n return storedApiKey;\n }\n\n if (hasCheckedLegacyCredentials) {\n return null;\n }\n\n if (!legacyMigrationPromise) {\n legacyMigrationPromise = migrateLegacyApiKey(store, migrationContext)\n .finally(() => {\n hasCheckedLegacyCredentials = true;\n legacyMigrationPromise = null;\n });\n }\n\n return legacyMigrationPromise;\n };\n\n return store;\n}\n\nasync function migrateLegacyApiKey(\n store: CreateAuthStoreResult[\"store\"],\n migrationContext: LegacyMigrationContext\n): Promise<string | null> {\n const legacyCredentials = await loadLegacyCredentials(\n migrationContext.fs,\n migrationContext.filePath\n );\n\n if (!legacyCredentials || !isNonEmptyString(legacyCredentials.apiKey)) {\n return null;\n }\n\n const plaintextApiKey = legacyCredentials.apiKey;\n\n try {\n await store.setApiKey(plaintextApiKey);\n delete legacyCredentials.apiKey;\n await saveLegacyCredentials(\n migrationContext.fs,\n migrationContext.filePath,\n legacyCredentials\n );\n } catch (error) {\n migrationContext.logWarning(\n `Failed to migrate plaintext API key from ${migrationContext.filePath}.`,\n error\n );\n }\n\n return plaintextApiKey;\n}\n\nfunction createLegacyMigrationContext(\n input: CreateAuthStoreInput\n): LegacyMigrationContext {\n const legacyCredentialsInput = input.legacyCredentials;\n const getHomeDirectory = legacyCredentialsInput?.getHomeDirectory ?? homedir;\n\n return {\n fs: legacyCredentialsInput?.fs ?? input.fileStore?.fs ?? nodeFs,\n filePath: legacyCredentialsInput?.filePath ?? path.join(\n getHomeDirectory(),\n LEGACY_CREDENTIALS_RELATIVE_PATH\n ),\n logWarning: legacyCredentialsInput?.logWarning ?? defaultMigrationWarning\n };\n}\n\nasync function loadLegacyCredentials(\n fs: LegacyCredentialsMigrationFileSystem,\n filePath: string\n): Promise<LegacyCredentialsDocument | null> {\n let raw: string;\n try {\n raw = await fs.readFile(filePath, \"utf8\");\n } catch (error) {\n if (isNotFoundError(error)) {\n return null;\n }\n return null;\n }\n\n try {\n const parsed = JSON.parse(raw);\n if (!isRecord(parsed)) {\n return null;\n }\n return parsed;\n } catch {\n return null;\n }\n}\n\nasync function saveLegacyCredentials(\n fs: LegacyCredentialsMigrationFileSystem,\n filePath: string,\n document: Record<string, unknown>\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\nfunction defaultMigrationWarning(message: string, error: unknown): void {\n const details = toErrorDetails(error);\n\n if (details.length > 0) {\n console.warn(`${message} ${details}`);\n return;\n }\n\n console.warn(message);\n}\n\nfunction toErrorDetails(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n\n return typeof error === \"string\" ? error : \"\";\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\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", "export { createAuthStore } from \"./create-auth-store.js\";\nexport { EncryptedFileAuthStore } from \"./encrypted-file-auth-store.js\";\nexport { KeychainAuthStore } from \"./keychain-auth-store.js\";\nexport type {\n AuthStore,\n AuthBackend,\n AuthStoreWarningLogger,\n CreateAuthStoreInput,\n CreateAuthStoreResult,\n LegacyCredentialsMigrationFileSystem,\n LegacyCredentialsMigrationInput\n} from \"./types.js\";\nexport type {\n MachineIdentity,\n EncryptedFileAuthStoreInput,\n EncryptedFileAuthStoreFileSystem\n} from \"./encrypted-file-auth-store.js\";\nexport type {\n KeychainAuthStoreInput,\n KeychainCommandRunner,\n KeychainCommandResult\n} from \"./keychain-auth-store.js\";\n", "export interface ToolCall {\n id: string;\n type: \"function\";\n function: {\n name: string;\n arguments: string;\n };\n}\n\nexport interface ChatMessage {\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content: string;\n tool_calls?: ToolCall[];\n tool_call_id?: string;\n name?: string;\n}\n\nexport interface Tool {\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: {\n type: \"object\";\n properties: Record<string, unknown>;\n required?: string[];\n };\n };\n}\n\nexport interface ChatCompletionRequest {\n model: string;\n messages: ChatMessage[];\n tools?: Tool[];\n}\n\nexport interface ChatCompletionResponse {\n choices: Array<{\n message: ChatMessage;\n }>;\n}\n\nexport interface ToolExecutor {\n executeTool(name: string, args: Record<string, unknown>): Promise<string>;\n}\n\nexport type ToolCallPhase = \"started\" | \"completed\" | \"failed\";\n\nexport interface ToolCallLifecycleEvent {\n phase: ToolCallPhase;\n toolCallId: string;\n toolName: string;\n args: Record<string, unknown>;\n result?: string;\n error?: string;\n}\n\nexport type ToolCallCallback = (event: ToolCallLifecycleEvent) => void;\n\ntype FetchFn = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;\n\nexport interface PoeChatServiceOptions {\n apiKey: string;\n model: string;\n baseUrl?: string;\n fetch?: FetchFn;\n systemPrompt?: string;\n toolExecutor?: ToolExecutor;\n onToolCall?: ToolCallCallback;\n maxToolCallIterations?: number;\n}\n\nexport interface SendMessageOptions {\n tools?: Tool[];\n signal?: AbortSignal;\n}\n\nexport class PoeChatService {\n private readonly apiKey: string;\n private readonly model: string;\n private readonly fetchFn: FetchFn;\n private readonly chatCompletionsUrl: string;\n private readonly toolExecutor?: ToolExecutor;\n private readonly maxToolCallIterations: number;\n private conversationHistory: ChatMessage[] = [];\n private readonly toolCallCallback?: ToolCallCallback;\n\n constructor(options: PoeChatServiceOptions) {\n this.apiKey = options.apiKey;\n this.model = options.model;\n this.fetchFn = options.fetch ?? globalThis.fetch;\n this.chatCompletionsUrl = toChatCompletionsUrl(options.baseUrl ?? \"https://api.poe.com\");\n this.toolExecutor = options.toolExecutor;\n this.toolCallCallback = options.onToolCall;\n this.maxToolCallIterations = options.maxToolCallIterations ?? 100;\n\n if (options.systemPrompt) {\n this.conversationHistory.push({\n role: \"system\",\n content: options.systemPrompt,\n });\n }\n }\n\n clearConversationHistory(): void {\n this.conversationHistory = [];\n }\n\n async sendMessage(userMessage: string, options?: SendMessageOptions): Promise<ChatMessage> {\n this.conversationHistory.push({\n role: \"user\",\n content: userMessage,\n });\n\n let iterationCount = 0;\n while (iterationCount < this.maxToolCallIterations) {\n const response = await this.requestCompletion(options?.tools, options?.signal);\n const assistantMessage = response.choices[0]?.message;\n\n if (!assistantMessage) {\n throw new Error(\"Poe API response did not include an assistant message\");\n }\n\n this.conversationHistory.push(assistantMessage);\n\n const hasToolCalls =\n assistantMessage.tool_calls && assistantMessage.tool_calls.length > 0 && this.toolExecutor;\n\n if (!hasToolCalls) {\n return assistantMessage;\n }\n\n await this.executeToolCalls(assistantMessage.tool_calls as ToolCall[]);\n iterationCount += 1;\n }\n\n throw new Error(\"Maximum tool call iterations reached\");\n }\n\n private async requestCompletion(tools?: Tool[], signal?: AbortSignal): Promise<ChatCompletionResponse> {\n const requestBody: ChatCompletionRequest = {\n model: this.model,\n messages: this.conversationHistory,\n };\n\n if (tools && tools.length > 0) {\n requestBody.tools = tools;\n }\n\n const response = await this.fetchFn(this.chatCompletionsUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(requestBody),\n signal,\n });\n\n if (!response.ok) {\n const errorBody = await readResponseText(response);\n const details = errorBody || response.statusText || \"Unknown error\";\n throw new Error(`Poe API request failed (${response.status}): ${details}`);\n }\n\n const payload = (await response.json()) as ChatCompletionResponse;\n if (!Array.isArray(payload.choices)) {\n throw new Error(\"Poe API response had invalid choices payload\");\n }\n\n return payload;\n }\n\n private async executeToolCalls(toolCalls: ToolCall[]): Promise<void> {\n if (!this.toolExecutor) {\n return;\n }\n\n for (const toolCall of toolCalls) {\n let args: Record<string, unknown> = {};\n\n try {\n args = parseToolArguments(toolCall.function.arguments);\n this.emitToolCallEvent({\n phase: \"started\",\n toolCallId: toolCall.id,\n toolName: toolCall.function.name,\n args,\n });\n\n const result = await this.toolExecutor.executeTool(toolCall.function.name, args);\n this.emitToolCallEvent({\n phase: \"completed\",\n toolCallId: toolCall.id,\n toolName: toolCall.function.name,\n args,\n result,\n });\n\n this.conversationHistory.push({\n role: \"tool\",\n tool_call_id: toolCall.id,\n name: toolCall.function.name,\n content: result,\n });\n } catch (error) {\n const message = getErrorMessage(error);\n this.emitToolCallEvent({\n phase: \"failed\",\n toolCallId: toolCall.id,\n toolName: toolCall.function.name,\n args,\n error: message,\n });\n\n this.conversationHistory.push({\n role: \"tool\",\n tool_call_id: toolCall.id,\n name: toolCall.function.name,\n content: `Error: ${message}`,\n });\n }\n }\n }\n\n private emitToolCallEvent(event: ToolCallLifecycleEvent): void {\n if (this.toolCallCallback) {\n this.toolCallCallback(event);\n }\n }\n}\n\nfunction toChatCompletionsUrl(baseUrl: string): string {\n const trimmedBaseUrl = baseUrl.endsWith(\"/\") ? baseUrl.slice(0, -1) : baseUrl;\n\n if (trimmedBaseUrl.endsWith(\"/v1\")) {\n return `${trimmedBaseUrl}/chat/completions`;\n }\n\n return `${trimmedBaseUrl}/v1/chat/completions`;\n}\n\nfunction parseToolArguments(rawArguments: string): Record<string, unknown> {\n const parsed = JSON.parse(rawArguments) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(\"Tool call arguments must be a JSON object\");\n }\n\n return parsed as Record<string, unknown>;\n}\n\nasync function readResponseText(response: Response): Promise<string | undefined> {\n try {\n const text = await response.text();\n return text.trim() || undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction getErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n\n return String(error);\n}\n\n", "import { readFileSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\n\nconst systemPromptUrl = new URL(\"./SYSTEM_PROMPT.md\", import.meta.url);\n\nexport async function loadSystemPrompt(): Promise<string> {\n return readFile(systemPromptUrl, \"utf8\");\n}\n\nexport function loadSystemPromptSync(): string {\n return readFileSync(systemPromptUrl, \"utf8\");\n}\n", "import { exec as execCallback } from \"node:child_process\";\nimport fsPromises from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type { Tool, ToolExecutor } from \"./chat.js\";\n\nconst exec = promisify(execCallback);\n\ntype FetchFn = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;\n\nexport type ToolExecutorFileSystem = Pick<\n typeof fsPromises,\n \"mkdir\" | \"readFile\" | \"readdir\" | \"writeFile\"\n>;\n\nexport type RunCommandFn = (command: string, cwd: string) => Promise<string>;\n\nexport type SearchWebFn = (query: string) => Promise<string>;\n\nexport interface DefaultToolExecutorOptions {\n cwd?: string;\n allowedPaths?: string[];\n fs?: ToolExecutorFileSystem;\n runCommand?: RunCommandFn;\n searchWeb?: SearchWebFn;\n fetch?: FetchFn;\n}\n\ninterface DuckDuckGoTopic {\n Text?: string;\n Topics?: DuckDuckGoTopic[];\n}\n\ninterface DuckDuckGoPayload {\n AbstractText?: string;\n RelatedTopics?: DuckDuckGoTopic[];\n}\n\nexport class DefaultToolExecutor implements ToolExecutor {\n private readonly cwd: string;\n private readonly allowedPaths: string[];\n private readonly fs: ToolExecutorFileSystem;\n private readonly runCommandFn: RunCommandFn;\n private readonly searchWebFn: SearchWebFn;\n\n constructor(options: DefaultToolExecutorOptions = {}) {\n this.cwd = path.resolve(options.cwd ?? process.cwd());\n this.allowedPaths = (options.allowedPaths ?? [this.cwd]).map(allowedPath =>\n path.resolve(this.cwd, allowedPath),\n );\n this.fs = options.fs ?? fsPromises;\n this.runCommandFn = options.runCommand ?? defaultRunCommand;\n\n const fetchFn = options.fetch ?? globalThis.fetch;\n this.searchWebFn = options.searchWeb ?? (query => defaultSearchWeb(query, fetchFn));\n }\n\n async executeTool(name: string, args: Record<string, unknown>): Promise<string> {\n switch (name) {\n case \"read_file\":\n return this.executeReadFile(args);\n case \"edit_file\":\n return this.executeEditFile(args);\n case \"list_files\":\n return this.executeListFiles(args);\n case \"run_command\":\n return this.executeRunCommand(args);\n case \"search_web\":\n return this.executeSearchWeb(args);\n default:\n throw new Error(`Unsupported tool: ${name}`);\n }\n }\n\n getAvailableTools(): Tool[] {\n return [\n {\n type: \"function\",\n function: {\n name: \"read_file\",\n description: \"Read UTF-8 content from a file.\",\n parameters: {\n type: \"object\",\n properties: {\n path: {\n type: \"string\",\n description: \"Path to the file to read.\",\n },\n },\n required: [\"path\"],\n },\n },\n },\n {\n type: \"function\",\n function: {\n name: \"edit_file\",\n description:\n \"Edit or create files. Use 'str_replace' to replace exact text in an existing file (old_str must appear exactly once). Use 'create' to create a new file (fails if file already exists).\",\n parameters: {\n type: \"object\",\n properties: {\n command: {\n type: \"string\",\n enum: [\"str_replace\", \"create\"],\n description: \"Operation to perform.\",\n },\n path: {\n type: \"string\",\n description: \"File path.\",\n },\n old_str: {\n type: \"string\",\n description: \"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 file_text: {\n type: \"string\",\n description: \"Full file content (create only).\",\n },\n },\n required: [\"command\", \"path\"],\n },\n },\n },\n {\n type: \"function\",\n function: {\n name: \"list_files\",\n description: \"List files in a directory.\",\n parameters: {\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 },\n },\n {\n type: \"function\",\n function: {\n name: \"run_command\",\n description: \"Run a shell command.\",\n parameters: {\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 },\n required: [\"command\"],\n },\n },\n },\n {\n type: \"function\",\n function: {\n name: \"search_web\",\n description: \"Search the web for a query.\",\n parameters: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"Search query.\",\n },\n },\n required: [\"query\"],\n },\n },\n },\n ];\n }\n\n private async executeReadFile(args: Record<string, unknown>): Promise<string> {\n const filePath = this.resolveAllowedPath(getRequiredString(args, \"path\"));\n return this.fs.readFile(filePath, \"utf8\");\n }\n\n private async executeEditFile(args: Record<string, unknown>): Promise<string> {\n const command = getRequiredString(args, \"command\");\n const filePath = this.resolveAllowedPath(getRequiredString(args, \"path\"));\n const displayedPath = path.relative(this.cwd, filePath) || path.basename(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 content = await this.fs.readFile(filePath, \"utf8\");\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 (count > 1) {\n throw new Error(`old_str appears ${count} times \u2014 must be unique`);\n }\n\n await this.fs.writeFile(filePath, content.replace(oldStr, newStr), \"utf8\");\n return `Edited file: ${displayedPath}`;\n }\n\n if (command === \"create\") {\n const fileText = getRequiredString(args, \"file_text\", true);\n\n if (await this.fileExists(filePath)) {\n throw new Error(\"File already exists \u2014 use str_replace to edit\");\n }\n\n await this.fs.mkdir(path.dirname(filePath), { recursive: true });\n await this.fs.writeFile(filePath, fileText, \"utf8\");\n return `Created file: ${displayedPath}`;\n }\n\n throw new Error(`Unknown edit_file command: ${command}`);\n }\n\n private async executeListFiles(args: Record<string, unknown>): Promise<string> {\n const rawPath = getOptionalString(args, \"path\") ?? \".\";\n const directoryPath = this.resolveAllowedPath(rawPath);\n const entries = await this.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 private async executeRunCommand(args: Record<string, unknown>): Promise<string> {\n const command = getRequiredString(args, \"command\");\n const commandCwdArg = getOptionalString(args, \"cwd\");\n const commandCwd = commandCwdArg ? this.resolveAllowedPath(commandCwdArg) : this.cwd;\n\n return this.runCommandFn(command, commandCwd);\n }\n\n private async executeSearchWeb(args: Record<string, unknown>): Promise<string> {\n const query = getRequiredString(args, \"query\");\n return this.searchWebFn(query);\n }\n\n private resolveAllowedPath(inputPath: string): string {\n const resolvedPath = path.resolve(this.cwd, inputPath);\n const isAllowed = this.allowedPaths.some(allowedPath => {\n if (allowedPath === resolvedPath) return true;\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\n private async fileExists(filePath: string): Promise<boolean> {\n try {\n await this.fs.readFile(filePath, \"utf8\");\n return true;\n } catch {\n return false;\n }\n }\n}\n\nfunction getRequiredString(\n args: Record<string, unknown>,\n key: string,\n allowEmptyString = false,\n): string {\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\nfunction getOptionalString(args: Record<string, unknown>, key: string): string | undefined {\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\nfunction countOccurrences(text: string, search: string): number {\n let count = 0;\n let index = 0;\n while ((index = text.indexOf(search, index)) !== -1) {\n count++;\n index += search.length;\n }\n return count;\n}\n\nasync function defaultRunCommand(command: string, cwd: string): Promise<string> {\n try {\n const result = await exec(command, {\n cwd,\n timeout: 30_000,\n maxBuffer: 1024 * 1024,\n });\n\n const combinedOutput = [result.stdout, result.stderr]\n .map(output => output.trim())\n .filter(output => output.length > 0)\n .join(\"\\n\");\n\n return combinedOutput || \"Command completed with no output\";\n } catch (error) {\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(`Command failed: ${stderr.trim()}`);\n }\n\n const stdout = Reflect.get(error, \"stdout\");\n if (typeof stdout === \"string\" && stdout.trim().length > 0) {\n throw new Error(`Command failed: ${stdout.trim()}`);\n }\n\n throw new Error(`Command failed: ${error.message}`);\n }\n\n throw new Error(`Command failed: ${String(error)}`);\n }\n}\n\nasync function defaultSearchWeb(query: string, fetchFn: FetchFn): 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());\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) continue;\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", "import { createAuthStore } from \"@poe-code/auth\";\nimport type {\n SessionUpdate,\n ToolCall as AcpToolCall,\n ToolCallUpdate as AcpToolCallUpdate,\n} from \"@poe-code/agent-spawn\";\nimport {\n PoeChatService,\n type ChatMessage,\n type PoeChatServiceOptions,\n type ToolCallLifecycleEvent,\n} from \"./chat.js\";\nimport { loadSystemPrompt } from \"./system-prompt.js\";\nimport { DefaultToolExecutor } from \"./tool-executor.js\";\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 CreateAgentSessionOptions {\n model?: string;\n apiKey?: string;\n cwd?: string;\n allowedPaths?: string[];\n baseUrl?: string;\n fetch?: PoeChatServiceOptions[\"fetch\"];\n maxToolCallIterations?: number;\n}\n\ntype Disposable = {\n dispose(): Promise<void> | void;\n};\n\nexport async function createAgentSession(\n options: CreateAgentSessionOptions = {},\n): Promise<AgentSession> {\n const model = resolveRequiredModel(options.model);\n const apiKey = await resolveApiKey(options.apiKey);\n const systemPrompt = await loadSystemPrompt();\n\n const toolExecutor = new DefaultToolExecutor({\n cwd: options.cwd,\n allowedPaths: options.allowedPaths,\n });\n const tools = toolExecutor.getAvailableTools();\n\n let currentOnSessionUpdate: SessionUpdateCallback | undefined;\n\n const chatService = new PoeChatService({\n apiKey,\n model,\n baseUrl: options.baseUrl,\n fetch: options.fetch,\n systemPrompt,\n toolExecutor,\n maxToolCallIterations: options.maxToolCallIterations,\n onToolCall: event => {\n if (!currentOnSessionUpdate) return;\n for (const update of mapToolLifecycleEventToSessionUpdates(event)) {\n currentOnSessionUpdate(update);\n }\n },\n });\n\n let disposed = false;\n\n return {\n async sendMessage(prompt: string, sendOptions?: AgentSessionSendMessageOptions): Promise<ChatMessage> {\n if (disposed) {\n throw new Error(\"Agent session is already disposed.\");\n }\n\n currentOnSessionUpdate = sendOptions?.onSessionUpdate;\n\n const response = await chatService.sendMessage(prompt, {\n tools,\n signal: sendOptions?.signal,\n });\n\n if (currentOnSessionUpdate && response.role === \"assistant\" && response.content.length > 0) {\n currentOnSessionUpdate({\n sessionUpdate: \"agent_message_chunk\",\n content: {\n type: \"text\",\n text: response.content,\n },\n });\n }\n\n return response;\n },\n\n async dispose(): Promise<void> {\n if (disposed) {\n return;\n }\n\n disposed = true;\n chatService.clearConversationHistory();\n\n const disposableToolExecutor = toolExecutor as unknown as Partial<Disposable>;\n if (typeof disposableToolExecutor.dispose === \"function\") {\n await disposableToolExecutor.dispose();\n }\n },\n };\n}\n\nasync function resolveApiKey(explicitApiKey: string | undefined): Promise<string> {\n const normalizedExplicitApiKey = normalizeNonEmptyString(explicitApiKey);\n if (normalizedExplicitApiKey) {\n return normalizedExplicitApiKey;\n }\n\n const { store } = createAuthStore();\n const storedApiKey = normalizeNonEmptyString(await store.getApiKey());\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 resolveRequiredModel(model: string | undefined): string {\n const normalizedModel = normalizeNonEmptyString(model);\n if (normalizedModel) {\n return normalizedModel;\n }\n\n throw new Error(\"Missing model. Provide a non-empty model to createAgentSession.\");\n}\n\nfunction 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 mapToolLifecycleEventToSessionUpdates(event: ToolCallLifecycleEvent): SessionUpdate[] {\n if (event.phase === \"started\") {\n const toolCall: AcpToolCall = {\n sessionUpdate: \"tool_call\",\n toolCallId: event.toolCallId,\n title: event.toolName,\n kind: \"execute\",\n status: \"pending\",\n rawInput: event.args,\n };\n const inProgressUpdate: AcpToolCallUpdate = {\n sessionUpdate: \"tool_call_update\",\n toolCallId: event.toolCallId,\n kind: \"execute\",\n status: \"in_progress\",\n };\n\n return [toolCall, inProgressUpdate];\n }\n\n const terminalUpdate: AcpToolCallUpdate = {\n sessionUpdate: \"tool_call_update\",\n toolCallId: event.toolCallId,\n kind: \"execute\",\n status: event.phase === \"completed\" ? \"completed\" : \"failed\",\n };\n\n if (event.phase === \"completed\" && event.result !== undefined) {\n terminalUpdate.rawOutput = event.result;\n }\n\n if (event.phase === \"failed\" && event.error !== undefined) {\n terminalUpdate.rawOutput = event.error;\n }\n\n return [terminalUpdate];\n}\n", "export {\n createAgentSession,\n type AgentSession,\n type CreateAgentSessionOptions,\n} from \"./agent-session.js\";\n", "export const FRONTIER_MODELS = [\n \"anthropic/claude-opus-4.6\",\n \"anthropic/claude-sonnet-4.6\",\n \"openai/gpt-5.3-codex\",\n \"openai/gpt-5.2\",\n \"google/gemini-3-pro\"\n] as const;\n\nexport const DEFAULT_FRONTIER_MODEL = \"anthropic/claude-sonnet-4.6\";\n\nexport const DEFAULT_TEXT_MODEL = \"anthropic/claude-sonnet-4.6\";\nexport const DEFAULT_IMAGE_BOT = \"google/nano-banana-pro\";\nexport const DEFAULT_AUDIO_BOT = \"elevenlabs/elevenlabs-v3\";\nexport const DEFAULT_VIDEO_BOT = \"google/veo-3.1\";\n\nexport const CLAUDE_CODE_VARIANTS = {\n haiku: \"anthropic/claude-haiku-4.5\",\n sonnet: \"anthropic/claude-sonnet-4.6\",\n opus: \"anthropic/claude-opus-4.6\"\n} as const;\n\nexport const DEFAULT_CLAUDE_CODE_MODEL = CLAUDE_CODE_VARIANTS.sonnet;\n\n/**\n * Extracts the model ID from a namespaced model slug (lowercase).\n * e.g., \"anthropic/claude-sonnet-4.6\" -> \"claude-sonnet-4.6\"\n */\nexport function stripModelNamespace(model: string): string {\n const slashIndex = model.indexOf(\"/\");\n const id = slashIndex === -1 ? model : model.slice(slashIndex + 1);\n return id.toLowerCase();\n}\n\nexport const CODEX_MODELS = [\n \"openai/gpt-5.3-codex\",\n \"openai/gpt-5.2-codex\",\n \"openai/gpt-5.2\",\n \"openai/gpt-5.2-chat\",\n \"openai/gpt-5.2-pro\",\n \"openai/gpt-5.1\",\n \"openai/gpt-5.1-codex-mini\"\n] as const;\nexport const DEFAULT_CODEX_MODEL = CODEX_MODELS[0];\n\nexport const KIMI_MODELS = [\n \"novitaai/kimi-k2.5\",\n \"novitaai/kimi-k2-thinking\",\n] as const;\nexport const DEFAULT_KIMI_MODEL = KIMI_MODELS[0];\n\nexport const DEFAULT_REASONING = \"medium\";\nexport const PROVIDER_NAME = \"poe\";\nexport const FEEDBACK_URL = \"https://github.com/poe-platform/poe-code/issues\";\n", "import { 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}\n\nexport interface AcpClientProcessOptions extends AcpClientSharedOptions {\n command: string;\n args?: readonly string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n requestTimeoutMs?: number;\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 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 requestTimeoutMs: options.requestTimeoutMs,\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.permissionHandler = options.handlers?.permission ?? options.permissionHandler;\n this.fsHandler = options.handlers?.fs ?? options.fsHandler;\n this.terminalHandler = options.handlers?.terminal ?? options.terminalHandler;\n\n this.transport.onRequest(\n \"session/request_permission\",\n async (params: RequestPermissionRequest): Promise<RequestPermissionResponse> => {\n if (!this.permissionHandler) {\n return {\n outcome: { outcome: \"cancelled\" },\n };\n }\n\n const outcome = await this.permissionHandler({\n toolCall: params.toolCall,\n options: params.options,\n });\n return { outcome };\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 this.lifecycleState = this.availableAuthMethods.length > 0 ? \"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 requestTimeoutMs?: number;\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 requestTimeoutMs,\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.layer = new JsonRpcMessageLayer({\n input: this.child.stdout,\n output: this.child.stdin,\n requestTimeoutMs,\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 timeoutMs?: number;\n}\n\nexport interface JsonRpcMessageLayerOptions {\n input: Readable;\n output: Writable;\n requestTimeoutMs?: number;\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 timeout: ReturnType<typeof setTimeout> | null;\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 readonly defaultTimeoutMs: number;\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.defaultTimeoutMs = options.requestTimeoutMs ?? 30_000;\n this.nextRequestId = options.firstRequestId ?? 1;\n\n if (!Number.isFinite(this.defaultTimeoutMs) || this.defaultTimeoutMs < 0) {\n throw new Error(\"requestTimeoutMs must be a non-negative finite number\");\n }\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 timeoutMs = options.timeoutMs ?? this.defaultTimeoutMs;\n if (!Number.isFinite(timeoutMs) || timeoutMs < 0) {\n throw new Error(\"timeoutMs must be a non-negative finite number\");\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 const timeout = setTimeout(() => {\n this.pending.delete(id);\n reject(\n new Error(`JSON-RPC request \"${method}\" timed out after ${timeoutMs}ms`)\n );\n }, timeoutMs);\n\n this.pending.set(id, {\n method,\n resolve,\n reject,\n timeout,\n });\n\n try {\n this.sendMessage(request);\n } catch (error) {\n clearTimeout(timeout);\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 if (pending.timeout !== null) {\n clearTimeout(pending.timeout);\n }\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 if (pending.timeout !== null) {\n clearTimeout(pending.timeout);\n }\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 type {\n AgentMessageChunk,\n AgentThoughtChunk,\n SessionInfoUpdate,\n SessionUpdate,\n SessionUpdateNotification,\n ToolCall,\n ToolCallStatus,\n ToolCallUpdate,\n ToolKind,\n UsageUpdate,\n UserMessageChunk,\n} from \"./types.js\";\n\ntype SessionUpdateStreamItem = SessionUpdateNotification | SessionUpdate;\n\ntype MessageUpdate = UserMessageChunk | AgentMessageChunk | AgentThoughtChunk;\n\nexport interface ToolCallSummary {\n toolCallId: string;\n title: string;\n kind?: ToolKind;\n status?: ToolCallStatus;\n rawInput?: unknown;\n rawOutput?: unknown;\n}\n\nexport type LegacyInternalEvent = { event: string } & Record<string, unknown>;\n\nexport async function extractMessagesFromSessionUpdateStream(\n stream: AsyncIterable<SessionUpdateStreamItem> | Iterable<SessionUpdateStreamItem>,\n): Promise<MessageUpdate[]> {\n const updates: MessageUpdate[] = [];\n\n for await (const entry of stream) {\n const update = toSessionUpdate(entry);\n if (\n update.sessionUpdate === \"user_message_chunk\" ||\n update.sessionUpdate === \"agent_message_chunk\" ||\n update.sessionUpdate === \"agent_thought_chunk\"\n ) {\n updates.push(update);\n }\n }\n\n return updates;\n}\n\nexport async function extractUsageFromSessionUpdateStream(\n stream: AsyncIterable<SessionUpdateStreamItem> | Iterable<SessionUpdateStreamItem>,\n): Promise<UsageUpdate[]> {\n const updates: UsageUpdate[] = [];\n\n for await (const entry of stream) {\n const update = toSessionUpdate(entry);\n if (update.sessionUpdate === \"usage_update\") {\n updates.push(update);\n }\n }\n\n return updates;\n}\n\nexport async function extractToolCallSummariesFromSessionUpdateStream(\n stream: AsyncIterable<SessionUpdateStreamItem> | Iterable<SessionUpdateStreamItem>,\n): Promise<ToolCallSummary[]> {\n const summaries = new Map<string, ToolCallSummary>();\n\n for await (const entry of stream) {\n const update = toSessionUpdate(entry);\n\n if (update.sessionUpdate === \"tool_call\") {\n const summary: ToolCallSummary = {\n toolCallId: update.toolCallId,\n title: update.title,\n };\n\n if (update.kind !== undefined) {\n summary.kind = update.kind;\n }\n\n if (update.status !== undefined) {\n summary.status = update.status;\n }\n\n if (update.rawInput !== undefined) {\n summary.rawInput = update.rawInput;\n }\n\n if (update.rawOutput !== undefined) {\n summary.rawOutput = update.rawOutput;\n }\n\n summaries.set(update.toolCallId, summary);\n continue;\n }\n\n if (update.sessionUpdate === \"tool_call_update\") {\n const existing = summaries.get(update.toolCallId);\n const summary: ToolCallSummary = existing ?? {\n toolCallId: update.toolCallId,\n title: toTitle(update.title, update.toolCallId),\n };\n\n if (update.title !== null && update.title !== undefined && update.title.length > 0) {\n summary.title = update.title;\n }\n\n if (update.kind !== null && update.kind !== undefined) {\n summary.kind = update.kind;\n }\n\n if (update.status !== null && update.status !== undefined) {\n summary.status = update.status;\n }\n\n if (update.rawInput !== undefined) {\n summary.rawInput = update.rawInput;\n }\n\n if (update.rawOutput !== undefined) {\n summary.rawOutput = update.rawOutput;\n }\n\n summaries.set(update.toolCallId, summary);\n }\n }\n\n return Array.from(summaries.values());\n}\n\nexport function mapLegacyEventToSessionUpdates(\n event: LegacyInternalEvent,\n): SessionUpdate[] {\n switch (event.event) {\n case \"session_start\":\n return mapSessionStart(event);\n case \"agent_message\":\n return mapAgentMessage(event);\n case \"reasoning\":\n return mapReasoning(event);\n case \"tool_start\":\n return mapToolStart(event);\n case \"tool_complete\":\n return mapToolComplete(event);\n case \"usage\":\n return mapUsage(event);\n default:\n return [];\n }\n}\n\nfunction toSessionUpdate(entry: SessionUpdateStreamItem): SessionUpdate {\n if (isSessionUpdateNotification(entry)) {\n return entry.params.update;\n }\n\n return entry;\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 toTitle(value: string | null | undefined, fallback: string): string {\n if (typeof value === \"string\" && value.length > 0) {\n return value;\n }\n\n return fallback;\n}\n\nfunction mapSessionStart(event: LegacyInternalEvent): SessionInfoUpdate[] {\n const threadId = readString(event.threadId);\n if (!threadId) {\n return [];\n }\n\n return [{ sessionUpdate: \"session_info_update\", _meta: { threadId } }];\n}\n\nfunction mapAgentMessage(event: LegacyInternalEvent): AgentMessageChunk[] {\n const text = readString(event.text);\n if (!text) {\n return [];\n }\n\n return [{ sessionUpdate: \"agent_message_chunk\", content: { type: \"text\", text } }];\n}\n\nfunction mapReasoning(event: LegacyInternalEvent): AgentThoughtChunk[] {\n const text = readString(event.text);\n if (!text) {\n return [];\n }\n\n return [{ sessionUpdate: \"agent_thought_chunk\", content: { type: \"text\", text } }];\n}\n\nfunction mapToolStart(event: LegacyInternalEvent): SessionUpdate[] {\n const toolCallId = readString(event.id) ?? readString(event.toolCallId);\n if (!toolCallId) {\n return [];\n }\n\n const kind = toToolKind(event.kind);\n\n const toolCall: ToolCall = {\n sessionUpdate: \"tool_call\",\n toolCallId,\n title: readString(event.title) ?? toolCallId,\n status: \"pending\",\n };\n\n const toolCallUpdate: ToolCallUpdate = {\n sessionUpdate: \"tool_call_update\",\n toolCallId,\n status: \"in_progress\",\n };\n\n if (kind) {\n toolCall.kind = kind;\n toolCallUpdate.kind = kind;\n }\n\n if (\"input\" in event) {\n toolCall.rawInput = event.input;\n } else if (\"rawInput\" in event) {\n toolCall.rawInput = event.rawInput;\n }\n\n return [toolCall, toolCallUpdate];\n}\n\nfunction mapToolComplete(event: LegacyInternalEvent): ToolCallUpdate[] {\n const toolCallId = readString(event.id) ?? readString(event.toolCallId);\n if (!toolCallId) {\n return [];\n }\n\n const toolCallUpdate: ToolCallUpdate = {\n sessionUpdate: \"tool_call_update\",\n toolCallId,\n status: toToolCallStatus(event.status) ?? \"completed\",\n };\n\n const kind = toToolKind(event.kind);\n if (kind) {\n toolCallUpdate.kind = kind;\n }\n\n if (\"output\" in event) {\n toolCallUpdate.rawOutput = event.output;\n } else if (\"path\" in event) {\n toolCallUpdate.rawOutput = event.path;\n } else if (\"rawOutput\" in event) {\n toolCallUpdate.rawOutput = event.rawOutput;\n }\n\n return [toolCallUpdate];\n}\n\nfunction mapUsage(event: LegacyInternalEvent): UsageUpdate[] {\n const inputTokens = readNumber(event.inputTokens) ?? 0;\n const outputTokens = readNumber(event.outputTokens) ?? 0;\n const cachedTokens = readNumber(event.cachedTokens) ?? 0;\n\n const usage: UsageUpdate = {\n sessionUpdate: \"usage_update\",\n used: inputTokens + outputTokens,\n size: inputTokens + outputTokens + cachedTokens,\n };\n\n const costUsd = readNumber(event.costUsd);\n if (costUsd !== undefined) {\n usage.cost = {\n amount: costUsd,\n currency: \"USD\",\n };\n }\n\n return [usage];\n}\n\nfunction toToolKind(value: unknown): ToolKind | undefined {\n if (value === \"exec\" || value === \"execute\") {\n return \"execute\";\n }\n\n if (value === \"read\") {\n return \"read\";\n }\n\n if (value === \"write\" || value === \"edit\" || value === \"delete\" || value === \"move\") {\n return \"write\";\n }\n\n if (\n value === \"other\" ||\n value === \"search\" ||\n value === \"think\" ||\n value === \"fetch\" ||\n value === \"switch_mode\"\n ) {\n return \"other\";\n }\n\n return undefined;\n}\n\nfunction toToolCallStatus(value: unknown): ToolCallStatus | undefined {\n if (\n value === \"pending\" ||\n value === \"in_progress\" ||\n value === \"completed\" ||\n value === \"failed\" ||\n value === \"cancelled\"\n ) {\n return value;\n }\n\n return undefined;\n}\n\nfunction readNumber(value: unknown): number | undefined {\n return typeof value === \"number\" ? value : undefined;\n}\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n", "import Mustache from \"mustache\";\nimport type {\n Mutation,\n MutationContext,\n MutationOutcome,\n MutationDetails,\n ConfigObject,\n MutationOptions,\n ValueResolver,\n FileSystem\n} from \"../types.js\";\nimport { getConfigFormat, detectFormat } from \"../formats/index.js\";\nimport { resolvePath } from \"./path-utils.js\";\nimport {\n isNotFound,\n readFileIfExists,\n pathExists,\n createTimestamp\n} from \"../fs-utils.js\";\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction resolveValue<T>(\n resolver: ValueResolver<T>,\n options: MutationOptions\n): T {\n if (typeof resolver === \"function\") {\n return (resolver as (ctx: MutationOptions) => T)(options);\n }\n return resolver;\n}\n\nfunction createInvalidDocumentBackupPath(targetPath: string): string {\n const ext = targetPath.includes(\".\") ? targetPath.split(\".\").pop() : \"bak\";\n return `${targetPath}.invalid-${createTimestamp()}.${ext}`;\n}\n\nasync function backupInvalidDocument(\n fs: FileSystem,\n targetPath: string,\n content: string\n): Promise<void> {\n const backupPath = createInvalidDocumentBackupPath(targetPath);\n await fs.writeFile(backupPath, content, { encoding: \"utf8\" });\n}\n\nfunction describeMutation(kind: string, targetPath?: string): string {\n const displayPath = targetPath ?? \"target\";\n switch (kind) {\n case \"ensureDirectory\":\n return `Create ${displayPath}`;\n case \"removeDirectory\":\n return `Remove directory ${displayPath}`;\n case \"backup\":\n return `Backup ${displayPath}`;\n case \"templateWrite\":\n return `Write ${displayPath}`;\n case \"chmod\":\n return `Set permissions on ${displayPath}`;\n case \"removeFile\":\n return `Remove ${displayPath}`;\n case \"configMerge\":\n case \"configPrune\":\n case \"configTransform\":\n case \"templateMergeToml\":\n case \"templateMergeJson\":\n return `Update ${displayPath}`;\n default:\n return \"Operation\";\n }\n}\n\nfunction pruneKeysByPrefix(\n table: ConfigObject,\n prefix: string\n): ConfigObject {\n const result: ConfigObject = {};\n for (const [key, value] of Object.entries(table)) {\n if (!key.startsWith(prefix)) {\n result[key] = value;\n }\n }\n return result;\n}\n\nfunction isConfigObject(value: unknown): value is ConfigObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction mergeWithPruneByPrefix(\n base: ConfigObject,\n patch: ConfigObject,\n pruneByPrefix?: Record<string, string>\n): ConfigObject {\n const result: ConfigObject = { ...base };\n const prefixMap = pruneByPrefix ?? {};\n\n for (const [key, value] of Object.entries(patch)) {\n const current = result[key];\n const prefix = prefixMap[key];\n\n if (isConfigObject(current) && isConfigObject(value)) {\n if (prefix) {\n const pruned = pruneKeysByPrefix(current, prefix);\n result[key] = { ...pruned, ...value };\n } else {\n result[key] = mergeWithPruneByPrefix(\n current,\n value as ConfigObject,\n prefixMap\n );\n }\n continue;\n }\n result[key] = value;\n }\n return result;\n}\n\n// ============================================================================\n// Apply Mutation\n// ============================================================================\n\nexport async function applyMutation(\n mutation: Mutation,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n switch (mutation.kind) {\n case \"ensureDirectory\":\n return applyEnsureDirectory(mutation, context, options);\n case \"removeDirectory\":\n return applyRemoveDirectory(mutation, context, options);\n case \"removeFile\":\n return applyRemoveFile(mutation, context, options);\n case \"chmod\":\n return applyChmod(mutation, context, options);\n case \"backup\":\n return applyBackup(mutation, context, options);\n case \"configMerge\":\n return applyConfigMerge(mutation, context, options);\n case \"configPrune\":\n return applyConfigPrune(mutation, context, options);\n case \"configTransform\":\n return applyConfigTransform(mutation, context, options);\n case \"templateWrite\":\n return applyTemplateWrite(mutation, context, options);\n case \"templateMergeToml\":\n return applyTemplateMerge(mutation, context, options, \"toml\");\n case \"templateMergeJson\":\n return applyTemplateMerge(mutation, context, options, \"json\");\n default: {\n const never: never = mutation;\n throw new Error(`Unknown mutation kind: ${(never as Mutation).kind}`);\n }\n }\n}\n\n// ============================================================================\n// File Mutation Handlers\n// ============================================================================\n\nasync function applyEnsureDirectory(\n mutation: Extract<Mutation, { kind: \"ensureDirectory\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.path, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const existed = await pathExists(context.fs, targetPath);\n\n if (!context.dryRun) {\n await context.fs.mkdir(targetPath, { recursive: true });\n }\n\n return {\n outcome: {\n changed: !existed,\n effect: \"mkdir\",\n detail: existed ? \"noop\" : \"create\"\n },\n details\n };\n}\n\nasync function applyRemoveDirectory(\n mutation: Extract<Mutation, { kind: \"removeDirectory\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.path, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const existed = await pathExists(context.fs, targetPath);\n if (!existed) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (typeof context.fs.rm !== \"function\") {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (mutation.force) {\n if (!context.dryRun) {\n await context.fs.rm(targetPath, { recursive: true, force: true });\n }\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n }\n\n const entries = await context.fs.readdir(targetPath);\n if (entries.length > 0) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n await context.fs.rm(targetPath, { recursive: true, force: true });\n }\n\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n}\n\nasync function applyRemoveFile(\n mutation: Extract<Mutation, { kind: \"removeFile\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n try {\n const content = await context.fs.readFile(targetPath, \"utf8\");\n const trimmed = content.trim();\n\n // Check whenContentMatches guard\n if (mutation.whenContentMatches && !mutation.whenContentMatches.test(trimmed)) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n // Check whenEmpty guard\n if (mutation.whenEmpty && trimmed.length > 0) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n await context.fs.unlink(targetPath);\n }\n\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n } catch (error) {\n if (isNotFound(error)) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n throw error;\n }\n}\n\nasync function applyChmod(\n mutation: Extract<Mutation, { kind: \"chmod\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n if (typeof context.fs.chmod !== \"function\") {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n try {\n const stat = await context.fs.stat(targetPath);\n const currentMode = typeof stat.mode === \"number\" ? stat.mode & 0o777 : null;\n\n if (currentMode === mutation.mode) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n await context.fs.chmod(targetPath, mutation.mode);\n }\n\n return {\n outcome: { changed: true, effect: \"chmod\", detail: \"update\" },\n details\n };\n } catch (error) {\n if (isNotFound(error)) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n throw error;\n }\n}\n\nasync function applyBackup(\n mutation: Extract<Mutation, { kind: \"backup\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const content = await readFileIfExists(context.fs, targetPath);\n if (content === null) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n if (!context.dryRun) {\n const backupPath = `${targetPath}.backup-${createTimestamp()}`;\n await context.fs.writeFile(backupPath, content, { encoding: \"utf8\" });\n }\n\n return {\n outcome: { changed: true, effect: \"copy\", detail: \"backup\" },\n details\n };\n}\n\n// ============================================================================\n// Config Mutation Handlers\n// ============================================================================\n\nasync function applyConfigMerge(\n mutation: Extract<Mutation, { kind: \"configMerge\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const formatName = mutation.format ?? detectFormat(rawPath);\n if (!formatName) {\n throw new Error(\n `Cannot detect config format for \"${rawPath}\". Provide explicit format option.`\n );\n }\n const format = getConfigFormat(formatName);\n\n const rawContent = await readFileIfExists(context.fs, targetPath);\n let current: ConfigObject;\n try {\n current = rawContent === null ? {} : format.parse(rawContent);\n } catch {\n // Invalid file - backup and start fresh\n if (rawContent !== null) {\n await backupInvalidDocument(context.fs, targetPath, rawContent);\n }\n current = {};\n }\n\n const value = resolveValue(mutation.value, options);\n\n // Use mergeWithPruneByPrefix for TOML files with pruneByPrefix option\n let merged: ConfigObject;\n if (mutation.pruneByPrefix) {\n merged = mergeWithPruneByPrefix(current, value, mutation.pruneByPrefix);\n } else {\n merged = format.merge(current, value);\n }\n\n const serialized = format.serialize(merged);\n const changed = serialized !== rawContent;\n\n if (changed && !context.dryRun) {\n await context.fs.writeFile(targetPath, serialized, { encoding: \"utf8\" });\n }\n\n return {\n outcome: {\n changed,\n effect: changed ? \"write\" : \"none\",\n detail: changed ? (rawContent === null ? \"create\" : \"update\") : \"noop\"\n },\n details\n };\n}\n\nasync function applyConfigPrune(\n mutation: Extract<Mutation, { kind: \"configPrune\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const rawContent = await readFileIfExists(context.fs, targetPath);\n if (rawContent === null) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n const formatName = mutation.format ?? detectFormat(rawPath);\n if (!formatName) {\n throw new Error(\n `Cannot detect config format for \"${rawPath}\". Provide explicit format option.`\n );\n }\n const format = getConfigFormat(formatName);\n\n let current: ConfigObject;\n try {\n current = format.parse(rawContent);\n } catch {\n // Invalid file - can't prune, leave as-is\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n // Check onlyIf guard\n if (mutation.onlyIf && !mutation.onlyIf(current, options)) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n const shape = resolveValue(mutation.shape, options);\n const { changed, result } = format.prune(current, shape);\n\n if (!changed) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n // Delete file if empty\n if (Object.keys(result).length === 0) {\n if (!context.dryRun) {\n await context.fs.unlink(targetPath);\n }\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n }\n\n const serialized = format.serialize(result);\n if (!context.dryRun) {\n await context.fs.writeFile(targetPath, serialized, { encoding: \"utf8\" });\n }\n\n return {\n outcome: { changed: true, effect: \"write\", detail: \"update\" },\n details\n };\n}\n\nasync function applyConfigTransform(\n mutation: Extract<Mutation, { kind: \"configTransform\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const formatName = mutation.format ?? detectFormat(rawPath);\n if (!formatName) {\n throw new Error(\n `Cannot detect config format for \"${rawPath}\". Provide explicit format option.`\n );\n }\n const format = getConfigFormat(formatName);\n\n const rawContent = await readFileIfExists(context.fs, targetPath);\n let current: ConfigObject;\n try {\n current = rawContent === null ? {} : format.parse(rawContent);\n } catch {\n if (rawContent !== null) {\n await backupInvalidDocument(context.fs, targetPath, rawContent);\n }\n current = {};\n }\n\n const { content: transformed, changed } = mutation.transform(current, options);\n\n if (!changed) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n\n // Delete file if null\n if (transformed === null) {\n if (rawContent === null) {\n return {\n outcome: { changed: false, effect: \"none\", detail: \"noop\" },\n details\n };\n }\n if (!context.dryRun) {\n await context.fs.unlink(targetPath);\n }\n return {\n outcome: { changed: true, effect: \"delete\", detail: \"delete\" },\n details\n };\n }\n\n const serialized = format.serialize(transformed);\n if (!context.dryRun) {\n await context.fs.writeFile(targetPath, serialized, { encoding: \"utf8\" });\n }\n\n return {\n outcome: {\n changed: true,\n effect: \"write\",\n detail: rawContent === null ? \"create\" : \"update\"\n },\n details\n };\n}\n\n// ============================================================================\n// Template Mutation Handlers\n// ============================================================================\n\nasync function applyTemplateWrite(\n mutation: Extract<Mutation, { kind: \"templateWrite\" }>,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n if (!context.templates) {\n throw new Error(\n \"Template mutations require a templates loader. \" +\n \"Provide templates function to runMutations context.\"\n );\n }\n\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const template = await context.templates(mutation.templateId);\n const templateContext = mutation.context\n ? resolveValue(mutation.context, options)\n : {};\n const rendered = Mustache.render(template, templateContext);\n\n const existed = await pathExists(context.fs, targetPath);\n\n if (!context.dryRun) {\n await context.fs.writeFile(targetPath, rendered, { encoding: \"utf8\" });\n }\n\n return {\n outcome: {\n changed: true,\n effect: \"write\",\n detail: existed ? \"update\" : \"create\"\n },\n details\n };\n}\n\nasync function applyTemplateMerge(\n mutation: Extract<Mutation, { kind: \"templateMergeToml\" | \"templateMergeJson\" }>,\n context: MutationContext,\n options: MutationOptions,\n formatName: \"toml\" | \"json\"\n): Promise<{ outcome: MutationOutcome; details: MutationDetails }> {\n if (!context.templates) {\n throw new Error(\n \"Template mutations require a templates loader. \" +\n \"Provide templates function to runMutations context.\"\n );\n }\n\n const rawPath = resolveValue(mutation.target, options);\n const targetPath = resolvePath(rawPath, context.homeDir, context.pathMapper);\n\n const details: MutationDetails = {\n kind: mutation.kind,\n label: mutation.label ?? describeMutation(mutation.kind, targetPath),\n targetPath\n };\n\n const format = getConfigFormat(formatName);\n\n // Load and render template\n const template = await context.templates(mutation.templateId);\n const templateContext = mutation.context\n ? resolveValue(mutation.context, options)\n : {};\n const rendered = Mustache.render(template, templateContext);\n\n // Parse rendered template\n let templateDoc: ConfigObject;\n try {\n templateDoc = format.parse(rendered);\n } catch (error) {\n throw new Error(\n `Failed to parse rendered template \"${mutation.templateId}\" as ${formatName.toUpperCase()}: ${error}`,\n { cause: error }\n );\n }\n\n // Read and parse existing file\n const rawContent = await readFileIfExists(context.fs, targetPath);\n let current: ConfigObject;\n try {\n current = rawContent === null ? {} : format.parse(rawContent);\n } catch {\n if (rawContent !== null) {\n await backupInvalidDocument(context.fs, targetPath, rawContent);\n }\n current = {};\n }\n\n // Merge\n const merged = format.merge(current, templateDoc);\n const serialized = format.serialize(merged);\n const changed = serialized !== rawContent;\n\n if (changed && !context.dryRun) {\n await context.fs.writeFile(targetPath, serialized, { encoding: \"utf8\" });\n }\n\n return {\n outcome: {\n changed,\n effect: changed ? \"write\" : \"none\",\n detail: changed ? (rawContent === null ? \"create\" : \"update\") : \"noop\"\n },\n details\n };\n}\n", "import * as jsonc from \"jsonc-parser\";\nimport type { ConfigFormat, ConfigObject, ConfigValue } from \"../types.js\";\n\nfunction isConfigObject(value: unknown): value is ConfigObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction detectIndent(content: string): string {\n const match = content.match(/^[\\t ]+/m);\n if (match) {\n return match[0];\n }\n return \" \";\n}\n\nfunction parse(content: string): ConfigObject {\n if (!content || content.trim() === \"\") {\n return {};\n }\n const errors: jsonc.ParseError[] = [];\n const parsed = jsonc.parse(content, errors, {\n allowTrailingComma: true,\n disallowComments: false\n });\n if (errors.length > 0) {\n throw new Error(`JSON parse error: ${jsonc.printParseErrorCode(errors[0].error)}`);\n }\n if (parsed === null || parsed === undefined) {\n return {};\n }\n if (!isConfigObject(parsed)) {\n throw new Error(\"Expected JSON object.\");\n }\n return parsed;\n}\n\nfunction serialize(obj: ConfigObject): string {\n return `${JSON.stringify(obj, null, 2)}\\n`;\n}\n\nfunction merge(base: ConfigObject, patch: ConfigObject): ConfigObject {\n const result: ConfigObject = { ...base };\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n const existing = result[key];\n if (isConfigObject(existing) && isConfigObject(value)) {\n result[key] = merge(existing, value);\n continue;\n }\n result[key] = value as ConfigValue;\n }\n return result;\n}\n\nfunction prune(\n obj: ConfigObject,\n shape: ConfigObject\n): { changed: boolean; result: ConfigObject } {\n let changed = false;\n const result: ConfigObject = { ...obj };\n\n for (const [key, pattern] of Object.entries(shape)) {\n if (!(key in result)) {\n continue;\n }\n\n const current = result[key];\n\n // Empty object pattern means \"delete this key entirely\"\n if (isConfigObject(pattern) && Object.keys(pattern).length === 0) {\n delete result[key];\n changed = true;\n continue;\n }\n\n // Non-empty object pattern with object current: recurse\n if (isConfigObject(pattern) && isConfigObject(current)) {\n const { changed: childChanged, result: childResult } = prune(\n current,\n pattern\n );\n if (childChanged) {\n changed = true;\n }\n if (Object.keys(childResult).length === 0) {\n delete result[key];\n } else {\n result[key] = childResult;\n }\n continue;\n }\n\n delete result[key];\n changed = true;\n }\n\n return { changed, result };\n}\n\n/**\n * Modify JSON content at a specific path while preserving comments and formatting.\n * Uses jsonc-parser's modify() for targeted updates.\n *\n * @param content - The original JSON content (may include comments)\n * @param path - JSON path array, e.g. [\"mcpServers\", \"my-server\"]\n * @param value - The value to set (or undefined to remove)\n * @returns The modified JSON content with comments preserved\n */\nfunction modifyAtPath(\n content: string,\n path: (string | number)[],\n value: ConfigValue | undefined\n): string {\n const indent = detectIndent(content);\n const formattingOptions: jsonc.FormattingOptions = {\n tabSize: indent === \"\\t\" ? 1 : indent.length,\n insertSpaces: indent !== \"\\t\",\n eol: \"\\n\"\n };\n\n const edits = jsonc.modify(content, path, value, { formattingOptions });\n let result = jsonc.applyEdits(content, edits);\n\n if (!result.endsWith(\"\\n\")) {\n result += \"\\n\";\n }\n\n return result;\n}\n\n/**\n * Merge a patch into JSON content while preserving comments and formatting.\n * Uses jsonc.modify() for each top-level key to preserve existing comments.\n *\n * @param content - The original JSON content (may include comments)\n * @param patch - Object with values to merge\n * @returns The modified JSON content with comments preserved\n */\nfunction mergePreservingComments(\n content: string,\n patch: ConfigObject\n): string {\n let result = content || \"{}\";\n\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n result = modifyAtPath(result, [key], value);\n }\n\n return result;\n}\n\n/**\n * Remove a key from JSON content while preserving comments and formatting.\n *\n * @param content - The original JSON content\n * @param path - JSON path array to the key to remove\n * @returns The modified JSON content with comments preserved\n */\nfunction removeAtPath(content: string, path: (string | number)[]): string {\n return modifyAtPath(content, path, undefined);\n}\n\nexport { detectIndent, modifyAtPath, mergePreservingComments, removeAtPath };\n\nexport const jsonFormat: ConfigFormat = {\n parse,\n serialize,\n merge,\n prune\n};\n", "import { parse as parseToml, stringify as stringifyToml } from \"smol-toml\";\nimport type { ConfigFormat, ConfigObject, ConfigValue } from \"../types.js\";\n\nfunction isConfigObject(value: unknown): value is ConfigObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction parse(content: string): ConfigObject {\n if (!content || content.trim() === \"\") {\n return {};\n }\n const parsed = parseToml(content);\n if (!isConfigObject(parsed)) {\n throw new Error(\"Expected TOML document to be a table.\");\n }\n return parsed as ConfigObject;\n}\n\nfunction serialize(obj: ConfigObject): string {\n const serialized = stringifyToml(obj);\n return serialized.endsWith(\"\\n\") ? serialized : `${serialized}\\n`;\n}\n\nfunction merge(base: ConfigObject, patch: ConfigObject): ConfigObject {\n const result: ConfigObject = { ...base };\n for (const [key, value] of Object.entries(patch)) {\n if (value === undefined) {\n continue;\n }\n const existing = result[key];\n if (isConfigObject(existing) && isConfigObject(value)) {\n result[key] = merge(existing, value);\n continue;\n }\n result[key] = value as ConfigValue;\n }\n return result;\n}\n\nfunction prune(\n obj: ConfigObject,\n shape: ConfigObject\n): { changed: boolean; result: ConfigObject } {\n let changed = false;\n const result: ConfigObject = { ...obj };\n\n for (const [key, pattern] of Object.entries(shape)) {\n if (!(key in result)) {\n continue;\n }\n\n const current = result[key];\n\n // Empty object pattern means \"delete this key entirely\"\n if (isConfigObject(pattern) && Object.keys(pattern).length === 0) {\n delete result[key];\n changed = true;\n continue;\n }\n\n // Non-empty object pattern with object current: recurse\n if (isConfigObject(pattern) && isConfigObject(current)) {\n const { changed: childChanged, result: childResult } = prune(\n current,\n pattern\n );\n if (childChanged) {\n changed = true;\n }\n if (Object.keys(childResult).length === 0) {\n delete result[key];\n } else {\n result[key] = childResult;\n }\n continue;\n }\n\n delete result[key];\n changed = true;\n }\n\n return { changed, result };\n}\n\nexport const tomlFormat: ConfigFormat = {\n parse,\n serialize,\n merge,\n prune\n};\n", "import type { ConfigFormat } from \"../types.js\";\nimport { jsonFormat } from \"./json.js\";\nimport { tomlFormat } from \"./toml.js\";\n\nexport type FormatName = \"json\" | \"toml\";\n\nconst formatRegistry: Record<FormatName, ConfigFormat> = {\n json: jsonFormat,\n toml: tomlFormat\n};\n\nconst extensionMap: Record<string, FormatName> = {\n \".json\": \"json\",\n \".toml\": \"toml\"\n};\n\n/**\n * Get a format handler by path (auto-detect from extension) or explicit format name.\n */\nexport function getConfigFormat(pathOrFormat: string): ConfigFormat {\n // Check if it's an explicit format name\n if (pathOrFormat in formatRegistry) {\n return formatRegistry[pathOrFormat as FormatName];\n }\n\n // Try to detect from extension\n const ext = getExtension(pathOrFormat);\n const formatName = extensionMap[ext];\n\n if (!formatName) {\n throw new Error(\n `Unsupported config format. Cannot detect format from \"${pathOrFormat}\". ` +\n `Supported extensions: ${Object.keys(extensionMap).join(\", \")}. ` +\n `Supported format names: ${Object.keys(formatRegistry).join(\", \")}.`\n );\n }\n\n return formatRegistry[formatName];\n}\n\n/**\n * Detect format name from a file path.\n */\nexport function detectFormat(path: string): FormatName | undefined {\n const ext = getExtension(path);\n return extensionMap[ext];\n}\n\nfunction getExtension(path: string): string {\n const lastDot = path.lastIndexOf(\".\");\n if (lastDot === -1) {\n return \"\";\n }\n return path.slice(lastDot).toLowerCase();\n}\n\nexport { jsonFormat } from \"./json.js\";\nexport { tomlFormat } from \"./toml.js\";\n", "import path from \"node:path\";\nimport type { PathMapper } from \"../types.js\";\n\n/**\n * Expand ~ shortcut to the provided home directory.\n */\nexport function expandHome(targetPath: string, homeDir: string): string {\n if (!targetPath?.startsWith(\"~\")) {\n return targetPath;\n }\n\n // Handle ~./ -> ~/.\n if (targetPath.startsWith(\"~./\")) {\n targetPath = `~/.${targetPath.slice(3)}`;\n }\n\n let remainder = targetPath.slice(1);\n\n // Remove leading slash or backslash\n if (remainder.startsWith(\"/\") || remainder.startsWith(\"\\\\\")) {\n remainder = remainder.slice(1);\n } else if (remainder.startsWith(\".\")) {\n // Handle ~/.\n remainder = remainder.slice(1);\n if (remainder.startsWith(\"/\") || remainder.startsWith(\"\\\\\")) {\n remainder = remainder.slice(1);\n }\n }\n\n return remainder.length === 0 ? homeDir : path.join(homeDir, remainder);\n}\n\n/**\n * Validate that a path is home-relative (starts with ~).\n * Throws if the path is not home-relative.\n */\nexport function validateHomePath(targetPath: string): void {\n if (typeof targetPath !== \"string\" || targetPath.length === 0) {\n throw new Error(\"Target path must be a non-empty string.\");\n }\n\n if (!targetPath.startsWith(\"~\")) {\n throw new Error(\n `All target paths must be home-relative (start with ~). Received: \"${targetPath}\"`\n );\n }\n}\n\n/**\n * Resolve a path with optional path mapping for isolated configurations.\n * 1. Validates the path starts with ~\n * 2. Expands ~ to home directory\n * 3. If pathMapper is provided, maps the directory portion and reconstructs the path\n */\nexport function resolvePath(\n rawPath: string,\n homeDir: string,\n pathMapper?: PathMapper\n): string {\n validateHomePath(rawPath);\n const expanded = expandHome(rawPath, homeDir);\n\n if (!pathMapper) {\n return expanded;\n }\n\n // Map the directory portion\n const rawDirectory = path.dirname(expanded);\n const mappedDirectory = pathMapper.mapTargetDirectory({\n targetDirectory: rawDirectory\n });\n const filename = path.basename(expanded);\n\n return filename.length === 0 ? mappedDirectory : path.join(mappedDirectory, filename);\n}\n", "import type { FileSystem } from \"./types.js\";\n\n/**\n * Check if an error is a \"file not found\" (ENOENT) error.\n */\nexport function isNotFound(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error as { code?: string }).code === \"ENOENT\"\n );\n}\n\n/**\n * Read a file if it exists, returning null if not found.\n */\nexport async function readFileIfExists(\n fs: FileSystem,\n target: string\n): Promise<string | null> {\n try {\n return await fs.readFile(target, \"utf8\");\n } catch (error) {\n if (isNotFound(error)) {\n return null;\n }\n throw error;\n }\n}\n\n/**\n * Check if a path exists (file or directory).\n */\nexport async function pathExists(\n fs: FileSystem,\n target: string\n): Promise<boolean> {\n try {\n await fs.stat(target);\n return true;\n } catch (error) {\n if (isNotFound(error)) {\n return false;\n }\n throw error;\n }\n}\n\n/**\n * Create an ISO timestamp safe for use in filenames.\n * Replaces colons and dots with dashes.\n */\nexport function createTimestamp(): string {\n return new Date().toISOString().replaceAll(\":\", \"-\").replaceAll(\".\", \"-\");\n}\n", "import type {\n Mutation,\n MutationContext,\n MutationResult,\n MutationOptions\n} from \"../types.js\";\nimport { applyMutation } from \"./apply-mutation.js\";\n\n/**\n * Execute an array of mutations in order.\n *\n * All dependencies must be injected - no defaults, no globals.\n */\nexport async function runMutations(\n mutations: Mutation[],\n context: MutationContext,\n options?: MutationOptions\n): Promise<MutationResult> {\n const effects: MutationResult[\"effects\"] = [];\n let anyChanged = false;\n const resolverOptions = options ?? {};\n\n for (const mutation of mutations) {\n const { outcome } = await executeMutation(\n mutation,\n context,\n resolverOptions\n );\n effects.push(outcome);\n if (outcome.changed) {\n anyChanged = true;\n }\n }\n\n return {\n changed: anyChanged,\n effects\n };\n}\n\nasync function executeMutation(\n mutation: Mutation,\n context: MutationContext,\n options: MutationOptions\n): Promise<{ outcome: MutationResult[\"effects\"][number]; details: { kind: string; label: string; targetPath?: string } }> {\n // Call onStart observer\n context.observers?.onStart?.({\n kind: mutation.kind,\n label: mutation.label ?? mutation.kind,\n targetPath: undefined // Will be resolved during apply\n });\n\n try {\n const { outcome, details } = await applyMutation(mutation, context, options);\n\n // Call onComplete observer\n context.observers?.onComplete?.(details, outcome);\n\n return { outcome, details };\n } catch (error) {\n // Call onError observer\n context.observers?.onError?.(\n {\n kind: mutation.kind,\n label: mutation.label ?? mutation.kind,\n targetPath: undefined\n },\n error\n );\n\n // Re-throw the error\n throw error;\n }\n}\n", "import Mustache from \"mustache\";\n\nexport type TemplateVariables = Record<string, string | number | boolean | string[]>;\n\n// Disable HTML escaping - we're rendering prompts, not HTML\nconst originalEscape = Mustache.escape;\n\n/**\n * Render a mustache template with the given variables.\n * Arrays are automatically joined with newlines.\n * HTML escaping is disabled.\n */\nexport function renderTemplate(\n template: string,\n variables: TemplateVariables\n): string {\n // Pre-process variables to handle arrays\n const processed: Record<string, string | number | boolean> = {};\n for (const [key, value] of Object.entries(variables)) {\n if (Array.isArray(value)) {\n processed[key] = value.join(\"\\n\");\n } else {\n processed[key] = value;\n }\n }\n\n // Temporarily disable HTML escaping\n Mustache.escape = (text: string) => text;\n try {\n return Mustache.render(template, processed);\n } finally {\n Mustache.escape = originalEscape;\n }\n}\n", "import type {\n CommandRunner,\n CommandCheckContext,\n CommandCheck\n} from \"../utils/command-checks.js\";\n\nexport interface InstallContext {\n isDryRun: boolean;\n runCommand: CommandRunner;\n logger: (message: string) => void;\n platform: NodeJS.Platform;\n}\n\nexport interface InstallCommand {\n id: string;\n command: string;\n args: string[];\n platforms?: NodeJS.Platform[];\n}\n\nexport interface ServiceInstallDefinition {\n id: string;\n summary: string;\n check: CommandCheck;\n steps: InstallCommand[];\n postChecks?: CommandCheck[];\n successMessage?: string;\n}\n\nexport async function runServiceInstall(\n definition: ServiceInstallDefinition,\n context: InstallContext\n): Promise<boolean> {\n const checkContext: CommandCheckContext = {\n isDryRun: context.isDryRun,\n runCommand: context.runCommand\n };\n\n let needsInstall = false;\n try {\n await definition.check.run(checkContext);\n context.logger(`${definition.summary} already installed.`);\n } catch (error) {\n const detail =\n error instanceof Error ? error.message : String(error);\n context.logger(`${definition.summary} not detected: ${detail}`);\n needsInstall = true;\n }\n\n if (!needsInstall) {\n return false;\n }\n\n if (context.isDryRun) {\n logInstallDryRun(definition, context);\n return true;\n }\n\n const platformSteps = filterStepsByPlatform(definition.steps, context.platform);\n for (const step of platformSteps) {\n await runInstallStep(step, context);\n }\n\n await definition.check.run(checkContext);\n\n if (definition.postChecks) {\n for (const postCheck of definition.postChecks) {\n await postCheck.run(checkContext);\n }\n }\n\n context.logger(\n definition.successMessage ?? `${definition.summary} installed.`\n );\n return true;\n}\n\nfunction describeInstallCommand(step: InstallCommand): string {\n return `[${step.id}] ${formatCommand(step.command, step.args)}`;\n}\n\nfunction formatCommand(command: string, args: string[]): string {\n return [command, ...args.map(quoteIfNeeded)].join(\" \");\n}\n\nfunction quoteIfNeeded(value: string): string {\n if (value.length === 0) {\n return '\"\"';\n }\n if (value.includes(\" \") || value.includes(\"\\t\") || value.includes(\"\\n\")) {\n return `\"${value.replaceAll('\"', '\\\\\"')}\"`;\n }\n return value;\n}\n\nfunction filterStepsByPlatform(\n steps: InstallCommand[],\n platform: NodeJS.Platform\n): InstallCommand[] {\n return steps.filter(\n (step) => !step.platforms || step.platforms.includes(platform)\n );\n}\n\nfunction logInstallDryRun(\n definition: ServiceInstallDefinition,\n context: InstallContext\n): void {\n context.logger(`Dry run: would install ${definition.summary}.`);\n const platformSteps = filterStepsByPlatform(definition.steps, context.platform);\n for (const step of platformSteps) {\n context.logger(`Dry run: ${describeInstallCommand(step)}`);\n }\n}\n\nasync function runInstallStep(\n step: InstallCommand,\n context: InstallContext\n): Promise<void> {\n context.logger(`Running ${describeInstallCommand(step)}`);\n const result = await context.runCommand(step.command, step.args);\n if (result.exitCode !== 0) {\n const stderr = result.stderr.trim();\n const suffix = stderr.length > 0 ? `: ${stderr}` : \"\";\n throw new Error(\n `${describeInstallCommand(step)} failed with exit code ${result.exitCode}${suffix}`\n );\n }\n}\n", "import type {\n ProviderService,\n ProviderContext,\n ProviderBranding,\n ProviderConfigurePrompts,\n ProviderIsolatedEnv\n} from \"../cli/service-registry.js\";\nimport {\n runMutations,\n type Mutation,\n type MutationObservers\n} from \"@poe-code/config-mutations\";\nimport {\n runServiceInstall,\n type ServiceInstallDefinition\n} from \"../services/service-install.js\";\n// Template imports are lazy to avoid breaking tsc output when imported\n// by generate-bin-wrappers.mjs (Node.js can't resolve .hbs as ESM modules)\nconst templateImports: Record<string, () => Promise<{ default: string }>> = {\n \"python/env.hbs\": () => import(\"../templates/python/env.hbs\"),\n \"python/main.py.hbs\": () => import(\"../templates/python/main.py.hbs\"),\n \"python/requirements.txt.hbs\": () => import(\"../templates/python/requirements.txt.hbs\"),\n \"codex/config.toml.hbs\": () => import(\"../templates/codex/config.toml.hbs\"),\n};\n\nasync function loadTemplate(templateId: string): Promise<string> {\n const loader = templateImports[templateId];\n if (!loader) {\n throw new Error(`Template not found: ${templateId}`);\n }\n const module = await loader();\n return module.default;\n}\n\ninterface ManifestVersionDefinition {\n configure: Mutation[];\n unconfigure?: Mutation[];\n}\n\nexport interface ServiceRunOptions {\n observers?: MutationObservers;\n}\n\ninterface CreateProviderOptions<\n ConfigureOptions,\n UnconfigureOptions,\n SpawnOptions\n> {\n name: string;\n aliases?: string[];\n label: string;\n id: string;\n summary: string;\n branding?: ProviderBranding;\n disabled?: boolean;\n supportsStdinPrompt?: boolean;\n configurePrompts?: ProviderConfigurePrompts;\n postConfigureMessages?: string[];\n isolatedEnv?: ProviderIsolatedEnv;\n manifest: ManifestVersionDefinition;\n install?: ServiceInstallDefinition;\n test?: ProviderService<ConfigureOptions, UnconfigureOptions, SpawnOptions>[\"test\"];\n spawn?: ProviderService<\n ConfigureOptions,\n UnconfigureOptions,\n SpawnOptions\n >[\"spawn\"];\n}\n\nexport function createProvider<\n ConfigureOptions = any,\n UnconfigureOptions = ConfigureOptions,\n SpawnOptions = any\n>(\n opts: CreateProviderOptions<ConfigureOptions, UnconfigureOptions, SpawnOptions>\n): ProviderService<ConfigureOptions, UnconfigureOptions, SpawnOptions> {\n const provider: ProviderService<\n ConfigureOptions,\n UnconfigureOptions,\n SpawnOptions\n > = {\n id: opts.id,\n summary: opts.summary,\n name: opts.name,\n aliases: opts.aliases,\n label: opts.label,\n branding: opts.branding,\n disabled: opts.disabled,\n supportsStdinPrompt: opts.supportsStdinPrompt,\n configurePrompts: opts.configurePrompts,\n postConfigureMessages: opts.postConfigureMessages,\n isolatedEnv: opts.isolatedEnv,\n async configure(context, runOptions) {\n await runMutations(opts.manifest.configure, {\n fs: context.fs,\n homeDir: context.env.homeDir,\n observers: runOptions?.observers,\n templates: loadTemplate,\n pathMapper: context.pathMapper\n }, context.options as Record<string, unknown>);\n context.command.flushDryRun({ emitIfEmpty: false });\n },\n async unconfigure(context, runOptions) {\n if (!opts.manifest.unconfigure) {\n return false;\n }\n const result = await runMutations(opts.manifest.unconfigure, {\n fs: context.fs,\n homeDir: context.env.homeDir,\n observers: runOptions?.observers,\n templates: loadTemplate,\n pathMapper: context.pathMapper\n }, context.options as Record<string, unknown>);\n context.command.flushDryRun({ emitIfEmpty: false });\n return result.changed;\n }\n };\n\n if (opts.install) {\n provider.install = createInstallRunner(opts.install);\n }\n\n if (opts.test) {\n provider.test = opts.test;\n }\n\n if (opts.spawn) {\n provider.spawn = opts.spawn;\n }\n\n return provider;\n}\n\nfunction createInstallRunner(definition: ServiceInstallDefinition) {\n return async (context: ProviderContext): Promise<void> => {\n await runServiceInstall(definition, {\n isDryRun: context.logger.context.dryRun,\n runCommand: context.command.runCommand,\n logger: (message) => context.logger.verbose(message),\n platform: context.env.platform\n });\n };\n}\n", "import { DEFAULT_FRONTIER_MODEL } from \"../cli/constants.js\";\nimport type { AcpEvent, SessionUpdate as LegacySessionUpdate } from \"@poe-code/agent-spawn\";\nimport {\n AcpClient,\n generateRunReportFromSessionUpdateStream,\n type AcpTransportClosedEvent,\n type ContentBlock,\n type InitializeResponse,\n type NewSessionResponse,\n type PromptResponse,\n type SessionNotification,\n type SessionUpdate,\n type SessionUpdateNotification,\n type ToolCallStatus,\n type ToolKind,\n} from \"@poe-code/poe-acp-client\";\nimport { createProvider } from \"./create-provider.js\";\nimport type {\n EmptyProviderOptions,\n ProviderSpawnOptions\n} from \"./spawn-options.js\";\n\ninterface AgentSessionRuntime {\n sendMessage(\n prompt: string,\n options?: { onSessionUpdate?: (update: LegacySessionUpdate) => void }\n ): Promise<{ content: string }>;\n dispose(): Promise<void>;\n}\n\ninterface EventQueue<T> extends AsyncIterable<T> {\n push(value: T): void;\n complete(): void;\n}\n\ninterface PoeAgentLifecycleOptions {\n prompt: string;\n model: string;\n cwd: string;\n onEvent?: (event: AcpEvent) => void;\n}\n\ninterface PoeAgentSpawnResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n threadId?: string;\n sessionId?: string;\n}\n\ninterface ToolRenderState {\n startedToolCalls: Set<string>;\n toolCallKinds: Map<string, string>;\n toolCallTitles: Map<string, string>;\n}\n\ninterface InMemoryAcpTransport {\n closed: Promise<AcpTransportClosedEvent>;\n sendRequest<TResult = unknown>(method: string, params?: unknown): Promise<TResult>;\n sendNotification(method: string, params?: unknown): void;\n onRequest(\n method: string,\n handler: (params: unknown, context: { id: string | number | null; method: string }) => unknown\n ): void;\n onNotification(\n method: string,\n handler: (params: unknown, context: { method: string }) => void | Promise<void>\n ): void;\n dispose(reason?: Error): void;\n}\n\nfunction createEventQueue<T>(): EventQueue<T> {\n const values: T[] = [];\n const waiters: Array<(value: IteratorResult<T>) => void> = [];\n let completed = false;\n\n return {\n push(value: T): void {\n if (completed) {\n return;\n }\n\n const waiter = waiters.shift();\n if (waiter) {\n waiter({ done: false, value });\n return;\n }\n\n values.push(value);\n },\n complete(): void {\n if (completed) {\n return;\n }\n completed = true;\n while (waiters.length > 0) {\n const waiter = waiters.shift();\n waiter?.({ done: true, value: undefined });\n }\n },\n [Symbol.asyncIterator](): AsyncIterator<T> {\n return {\n next(): Promise<IteratorResult<T>> {\n if (values.length > 0) {\n const value = values.shift() as T;\n return Promise.resolve({ done: false, value });\n }\n\n if (completed) {\n return Promise.resolve({ done: true, value: undefined });\n }\n\n return new Promise<IteratorResult<T>>((resolve) => {\n waiters.push(resolve);\n });\n },\n };\n },\n };\n}\n\nfunction createToolRenderState(): ToolRenderState {\n return {\n startedToolCalls: new Set<string>(),\n toolCallKinds: new Map<string, string>(),\n toolCallTitles: new Map<string, string>(),\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\nfunction toErrorStack(value: unknown): string | undefined {\n if (value instanceof Error && typeof value.stack === \"string\" && value.stack.length > 0) {\n return value.stack;\n }\n\n return undefined;\n}\n\nfunction mapLegacyToolKind(kind: unknown): ToolKind | undefined {\n if (kind === \"read\") {\n return \"read\";\n }\n\n if (kind === \"execute\") {\n return \"execute\";\n }\n\n if (kind === \"edit\" || kind === \"delete\" || kind === \"move\") {\n return \"write\";\n }\n\n if (\n kind === \"other\"\n || kind === \"search\"\n || kind === \"think\"\n || kind === \"fetch\"\n || kind === \"switch_mode\"\n ) {\n return \"other\";\n }\n\n return undefined;\n}\n\nfunction mapLegacyToolStatus(status: unknown): ToolCallStatus | undefined {\n if (\n status === \"pending\"\n || status === \"in_progress\"\n || status === \"completed\"\n || status === \"failed\"\n || status === \"cancelled\"\n ) {\n return status;\n }\n\n return undefined;\n}\n\nfunction normalizeSessionUpdate(update: LegacySessionUpdate): SessionUpdate {\n if (update.sessionUpdate === \"agent_message_chunk\" || update.sessionUpdate === \"agent_thought_chunk\") {\n return {\n sessionUpdate: update.sessionUpdate,\n content: update.content,\n };\n }\n\n if (update.sessionUpdate === \"tool_call\") {\n const normalized: SessionUpdate = {\n sessionUpdate: \"tool_call\",\n toolCallId: update.toolCallId,\n title: update.title,\n };\n\n const kind = mapLegacyToolKind(update.kind);\n if (kind !== undefined) {\n normalized.kind = kind;\n }\n\n const status = mapLegacyToolStatus(update.status);\n if (status !== undefined) {\n normalized.status = status;\n }\n\n if (update.rawInput !== undefined) {\n normalized.rawInput = update.rawInput;\n }\n\n if (update._meta !== undefined) {\n normalized._meta = update._meta;\n }\n\n return normalized;\n }\n\n const normalized: SessionUpdate = {\n sessionUpdate: \"tool_call_update\",\n toolCallId: update.toolCallId,\n };\n\n const kind = mapLegacyToolKind(update.kind);\n if (kind !== undefined) {\n normalized.kind = kind;\n }\n\n const status = mapLegacyToolStatus(update.status);\n if (status !== undefined) {\n normalized.status = status;\n }\n\n if (update.rawOutput !== undefined) {\n normalized.rawOutput = update.rawOutput;\n }\n\n if (update._meta !== undefined) {\n normalized._meta = update._meta;\n }\n\n return normalized;\n}\n\nfunction toRenderKind(kind: ToolKind | undefined): string {\n if (kind === \"execute\") {\n return \"exec\";\n }\n\n if (kind === \"write\") {\n return \"edit\";\n }\n\n if (kind === \"read\") {\n return \"read\";\n }\n\n return \"other\";\n}\n\nfunction toToolOutput(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n\n if (value === undefined) {\n return \"\";\n }\n\n try {\n const serialized = JSON.stringify(value);\n if (typeof serialized === \"string\") {\n return serialized;\n }\n } catch {\n // Fall through to String(value) if serialization fails.\n }\n\n return String(value);\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 toEventsFromSessionUpdate(\n notification: SessionUpdateNotification,\n state: ToolRenderState\n): AcpEvent[] {\n const update = notification.params.update;\n\n if (update.sessionUpdate === \"agent_message_chunk\" && update.content.type === \"text\") {\n return [{ event: \"agent_message\", text: update.content.text }];\n }\n\n if (update.sessionUpdate === \"agent_thought_chunk\" && update.content.type === \"text\") {\n return [{ event: \"reasoning\", text: update.content.text }];\n }\n\n if (update.sessionUpdate === \"usage_update\") {\n const cachedTokens = Math.max(0, update.size - update.used);\n const usage: AcpEvent = {\n event: \"usage\",\n inputTokens: update.used,\n outputTokens: 0,\n };\n\n if (cachedTokens > 0) {\n usage.cachedTokens = cachedTokens;\n }\n\n if (update.cost && update.cost.currency === \"USD\") {\n usage.costUsd = update.cost.amount;\n }\n\n return [usage];\n }\n\n if (update.sessionUpdate === \"tool_call\") {\n const renderKind = toRenderKind(update.kind);\n state.toolCallKinds.set(update.toolCallId, renderKind);\n state.toolCallTitles.set(update.toolCallId, update.title);\n\n if (state.startedToolCalls.has(update.toolCallId)) {\n return [];\n }\n\n state.startedToolCalls.add(update.toolCallId);\n return [{\n event: \"tool_start\",\n kind: renderKind,\n title: update.title,\n id: update.toolCallId,\n }];\n }\n\n if (update.sessionUpdate === \"tool_call_update\") {\n const renderKind = toRenderKind(update.kind ?? undefined)\n || state.toolCallKinds.get(update.toolCallId)\n || \"other\";\n state.toolCallKinds.set(update.toolCallId, renderKind);\n\n const events: AcpEvent[] = [];\n const toolTitle = state.toolCallTitles.get(update.toolCallId) ?? update.toolCallId;\n const status = update.status;\n\n const shouldStart = !state.startedToolCalls.has(update.toolCallId)\n && (status === \"pending\" || status === \"in_progress\");\n if (shouldStart) {\n state.startedToolCalls.add(update.toolCallId);\n events.push({\n event: \"tool_start\",\n kind: renderKind,\n title: toolTitle,\n id: update.toolCallId,\n });\n }\n\n if (status === \"completed\" || status === \"failed\" || status === \"cancelled\") {\n if (!state.startedToolCalls.has(update.toolCallId)) {\n state.startedToolCalls.add(update.toolCallId);\n events.push({\n event: \"tool_start\",\n kind: renderKind,\n title: toolTitle,\n id: update.toolCallId,\n });\n }\n\n events.push({\n event: \"tool_complete\",\n kind: renderKind,\n path: toToolOutput(update.rawOutput),\n id: update.toolCallId,\n });\n }\n\n return events;\n }\n\n return [];\n}\n\nfunction emitEvent(\n callback: ((event: AcpEvent) => void) | undefined,\n event: AcpEvent\n): void {\n if (!callback) {\n return;\n }\n\n callback(event);\n}\n\nfunction createInMemoryAcpTransport(options: {\n model: string;\n cwd: string;\n}): InMemoryAcpTransport {\n const sessions = new Map<string, AgentSessionRuntime>();\n const notificationHandlers = new Map<string, Array<(params: unknown, context: { method: string }) => void | Promise<void>>>();\n const requestHandlers = new Map<\n string,\n Array<(params: unknown, context: { id: string | number | null; method: string }) => unknown>\n >();\n\n let sessionCounter = 0;\n let closed = false;\n let resolveClosed: ((event: AcpTransportClosedEvent) => void) | undefined;\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 entries = Array.from(sessions.values());\n sessions.clear();\n\n void Promise.all(entries.map(async (session) => {\n await session.dispose();\n })).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 };\n const response: InitializeResponse = {\n protocolVersion: request.protocolVersion ?? 1,\n agentInfo: { name: \"poe-agent\", version: \"0.0.1\" },\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 };\n const { createAgentSession } = await import(\"@poe-code/poe-agent\");\n const session = await createAgentSession({\n model: options.model,\n cwd: request.cwd || options.cwd,\n });\n const sessionId = `poe-agent-session-${sessionCounter + 1}`;\n sessionCounter += 1;\n sessions.set(sessionId, session as AgentSessionRuntime);\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 promptText = toPromptText(request.prompt);\n await session.sendMessage(promptText, {\n onSessionUpdate: (legacyUpdate) => {\n const normalizedUpdate = normalizeSessionUpdate(legacyUpdate);\n\n const handlers = notificationHandlers.get(\"session/update\");\n if (!handlers || handlers.length === 0) {\n return;\n }\n\n const notification: SessionNotification = {\n sessionId: request.sessionId,\n update: normalizedUpdate,\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 const sessionId = (params as { sessionId?: string } | undefined)?.sessionId;\n if (sessionId && sessions.has(sessionId)) {\n const session = sessions.get(sessionId);\n sessions.delete(sessionId);\n void session?.dispose();\n }\n }\n },\n onRequest(\n method: string,\n handler: (params: unknown, context: { id: string | number | null; method: string }) => unknown\n ): void {\n const current = requestHandlers.get(method) ?? [];\n requestHandlers.set(method, [...current, handler]);\n },\n onNotification(\n method: string,\n handler: (params: unknown, context: { method: string }) => void | Promise<void>\n ): void {\n const current = notificationHandlers.get(method) ?? [];\n notificationHandlers.set(method, [...current, handler]);\n },\n dispose(reason?: Error): void {\n closeTransport(reason ?? new Error(\"ACP in-memory transport disposed\"));\n },\n };\n}\n\nasync function runPoeAgentAcpLifecycle(\n options: PoeAgentLifecycleOptions\n): Promise<PoeAgentSpawnResult> {\n const sessionUpdates: SessionUpdateNotification[] = [];\n const toolState = createToolRenderState();\n let sessionId = \"\";\n let assistantText = \"\";\n\n const transport = createInMemoryAcpTransport({\n model: options.model,\n cwd: options.cwd,\n });\n\n const client = new AcpClient({ transport });\n\n try {\n await client.initialize();\n const session = await client.newSession(options.cwd, []);\n sessionId = session.sessionId;\n\n emitEvent(options.onEvent, {\n event: \"session_start\",\n threadId: sessionId,\n });\n\n const turn = client.prompt(sessionId, [{ type: \"text\", text: options.prompt }]);\n for await (const notification of turn) {\n sessionUpdates.push(notification);\n\n const update = notification.params.update;\n if (update.sessionUpdate === \"agent_message_chunk\" && update.content.type === \"text\") {\n assistantText += update.content.text;\n }\n\n for (const event of toEventsFromSessionUpdate(notification, toolState)) {\n emitEvent(options.onEvent, event);\n }\n }\n\n const promptResponse = await turn.response;\n await generateRunReportFromSessionUpdateStream(sessionUpdates, {\n runId: sessionId,\n exitStatus: promptResponse.stopReason === \"completed\" ? \"success\" : \"failed\",\n });\n\n return {\n stdout: assistantText.length > 0 ? `${assistantText}\\n` : \"\",\n stderr: \"\",\n exitCode: promptResponse.stopReason === \"completed\" ? 0 : 1,\n threadId: sessionId,\n sessionId,\n };\n } catch (error) {\n emitEvent(options.onEvent, {\n event: \"error\",\n message: toErrorMessage(error),\n ...(toErrorStack(error) ? { stack: toErrorStack(error) } : {}),\n });\n throw error;\n } finally {\n await client.dispose();\n }\n}\n\nexport function spawnPoeAgentWithAcp(options: {\n prompt: string;\n model?: string;\n cwd?: string;\n}): { events: AsyncIterable<AcpEvent>; done: Promise<PoeAgentSpawnResult> } {\n const queue = createEventQueue<AcpEvent>();\n const model = options.model ?? DEFAULT_FRONTIER_MODEL;\n const cwd = options.cwd ?? process.cwd();\n\n const done = runPoeAgentAcpLifecycle({\n prompt: options.prompt,\n model,\n cwd,\n onEvent: (event) => {\n queue.push(event);\n },\n }).finally(() => {\n queue.complete();\n });\n\n return {\n events: queue,\n done,\n };\n}\n\nexport const poeAgentService = createProvider<\n EmptyProviderOptions,\n EmptyProviderOptions,\n ProviderSpawnOptions\n>({\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 supportsStdinPrompt: true,\n manifest: {\n configure: []\n },\n async spawn(context, options) {\n const result = await runPoeAgentAcpLifecycle({\n prompt: options.prompt,\n model: options.model ?? DEFAULT_FRONTIER_MODEL,\n cwd: options.cwd ?? context.env.cwd,\n });\n\n return {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n };\n }\n});\n\nexport const provider = poeAgentService;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["homedir", "path", "homedir", "path", "fs", "isNotFoundError", "isRecord", "fsPromises", "path", "init_src", "isObjectRecord", "spawn", "path", "assertExtensionMethod", "isSessionUpdateNotification", "isSessionUpdateNotification", "parse", "parse", "isConfigObject", "parse", "serialize", "merge", "prune", "path", "fs", "fs", "isConfigObject", "Mustache", "provider", "toErrorMessage", "normalized", "kind", "status", "createAgentSession", "handlers"]
|
|
7
|
+
}
|