@posthog/agent 2.3.92 → 2.3.93
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent.js +1 -2
- package/dist/agent.js.map +1 -1
- package/dist/posthog-api.js +1 -1
- package/dist/posthog-api.js.map +1 -1
- package/dist/server/agent-server.js +1 -2
- package/dist/server/agent-server.js.map +1 -1
- package/dist/server/bin.cjs +1 -2
- package/dist/server/bin.cjs.map +1 -1
- package/package.json +1 -1
- package/src/adapters/claude/session/commands.ts +0 -1
package/dist/agent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/adapters/acp-connection.ts","../src/acp-extensions.ts","../src/gateway-models.ts","../src/utils/logger.ts","../src/utils/streams.ts","../src/adapters/claude/claude-agent.ts","../package.json","../src/utils/common.ts","../src/adapters/base-acp-agent.ts","../src/adapters/claude/conversion/acp-to-sdk.ts","../src/adapters/claude/conversion/sdk-to-acp.ts","../src/utils/acp-content.ts","../src/adapters/claude/hooks.ts","../src/adapters/claude/conversion/tool-use-to-acp.ts","../src/adapters/claude/mcp/tool-metadata.ts","../src/adapters/claude/plan/utils.ts","../src/adapters/claude/questions/utils.ts","../src/execution-mode.ts","../src/adapters/claude/tools.ts","../src/adapters/claude/permissions/permission-options.ts","../src/adapters/claude/permissions/permission-handlers.ts","../src/adapters/claude/session/commands.ts","../src/adapters/claude/session/mcp-config.ts","../src/adapters/claude/session/models.ts","../src/adapters/claude/session/options.ts","../src/adapters/claude/session/instructions.ts","../src/adapters/claude/session/settings.ts","../src/adapters/codex/spawn.ts","../src/utils/gateway.ts","../src/posthog-api.ts","../src/session-log-writer.ts","../src/agent.ts"],"sourcesContent":["import { AgentSideConnection, ndJsonStream } from \"@agentclientprotocol/sdk\";\nimport { POSTHOG_NOTIFICATIONS } from \"../acp-extensions\";\nimport { formatModelId } from \"../gateway-models\";\nimport type { SessionLogWriter } from \"../session-log-writer\";\nimport type { ProcessSpawnedCallback } from \"../types\";\nimport { Logger } from \"../utils/logger\";\nimport {\n createBidirectionalStreams,\n createTappedWritableStream,\n nodeReadableToWebReadable,\n nodeWritableToWebWritable,\n type StreamPair,\n} from \"../utils/streams\";\nimport { ClaudeAcpAgent } from \"./claude/claude-agent\";\nimport { type CodexProcessOptions, spawnCodexProcess } from \"./codex/spawn\";\n\ntype AgentAdapter = \"claude\" | \"codex\";\n\nexport type AcpConnectionConfig = {\n adapter?: AgentAdapter;\n logWriter?: SessionLogWriter;\n taskRunId?: string;\n taskId?: string;\n /** Deployment environment - \"local\" for desktop, \"cloud\" for cloud sandbox */\n deviceType?: \"local\" | \"cloud\";\n logger?: Logger;\n processCallbacks?: ProcessSpawnedCallback;\n codexOptions?: CodexProcessOptions;\n allowedModelIds?: Set<string>;\n};\n\nexport type AcpConnection = {\n agentConnection?: AgentSideConnection;\n clientStreams: StreamPair;\n cleanup: () => Promise<void>;\n};\n\nexport type InProcessAcpConnection = AcpConnection;\n\ntype ModelOption = { value?: string; name?: string };\ntype ModelGroup = { group?: string; name?: string; options?: ModelOption[] };\n\ntype ConfigOption = {\n id?: string;\n category?: string | null;\n currentValue?: string;\n options?: Array<ModelOption | ModelGroup>;\n};\n\nfunction isGroupedOptions(\n options: NonNullable<ConfigOption[\"options\"]>,\n): options is ModelGroup[] {\n return options.length > 0 && \"group\" in options[0];\n}\n\nfunction formatOption(o: ModelOption): ModelOption {\n if (!o.value) return o;\n return { ...o, name: formatModelId(o.value) };\n}\n\nfunction filterModelConfigOptions(\n msg: Record<string, unknown>,\n allowedModelIds: Set<string>,\n): Record<string, unknown> | null {\n const payload = msg as {\n method?: string;\n result?: { configOptions?: ConfigOption[] };\n params?: {\n update?: { sessionUpdate?: string; configOptions?: ConfigOption[] };\n };\n };\n\n const configOptions =\n payload.result?.configOptions ?? payload.params?.update?.configOptions;\n if (!configOptions) return null;\n\n const filtered = configOptions.map((opt) => {\n if (opt.category !== \"model\" || !opt.options) return opt;\n\n const options = opt.options;\n if (isGroupedOptions(options)) {\n const filteredOptions = options.map((group) => ({\n ...group,\n options: (group.options ?? [])\n .filter((o) => o?.value && allowedModelIds.has(o.value))\n .map(formatOption),\n }));\n const flat = filteredOptions.flatMap((g) => g.options ?? []);\n const currentAllowed =\n opt.currentValue && allowedModelIds.has(opt.currentValue);\n const nextCurrent =\n currentAllowed || flat.length === 0 ? opt.currentValue : flat[0]?.value;\n\n return {\n ...opt,\n currentValue: nextCurrent,\n options: filteredOptions,\n };\n }\n\n const valueOptions = options as ModelOption[];\n const filteredOptions = valueOptions\n .filter((o) => o?.value && allowedModelIds.has(o.value))\n .map(formatOption);\n const currentAllowed =\n opt.currentValue && allowedModelIds.has(opt.currentValue);\n const nextCurrent =\n currentAllowed || filteredOptions.length === 0\n ? opt.currentValue\n : filteredOptions[0]?.value;\n\n return {\n ...opt,\n currentValue: nextCurrent,\n options: filteredOptions,\n };\n });\n\n if (payload.result?.configOptions) {\n return { ...msg, result: { ...payload.result, configOptions: filtered } };\n }\n if (payload.params?.update?.configOptions) {\n return {\n ...msg,\n params: {\n ...payload.params,\n update: { ...payload.params.update, configOptions: filtered },\n },\n };\n }\n return null;\n}\n\nfunction extractReasoningEffort(\n configOptions: ConfigOption[] | undefined,\n): string | undefined {\n if (!configOptions) return undefined;\n const option = configOptions.find((opt) => opt.id === \"reasoning_effort\");\n return option?.currentValue ?? undefined;\n}\n\n/**\n * Creates an ACP connection with the specified agent framework.\n *\n * @param config - Configuration including framework selection\n * @returns Connection with agent and client streams\n */\nexport function createAcpConnection(\n config: AcpConnectionConfig = {},\n): AcpConnection {\n const adapterType = config.adapter ?? \"claude\";\n\n if (adapterType === \"codex\") {\n return createCodexConnection(config);\n }\n\n return createClaudeConnection(config);\n}\n\nfunction createClaudeConnection(config: AcpConnectionConfig): AcpConnection {\n const logger =\n config.logger?.child(\"AcpConnection\") ??\n new Logger({ debug: true, prefix: \"[AcpConnection]\" });\n const streams = createBidirectionalStreams();\n\n const { logWriter } = config;\n\n let agentWritable = streams.agent.writable;\n let clientWritable = streams.client.writable;\n\n if (config.taskRunId && logWriter) {\n if (!logWriter.isRegistered(config.taskRunId)) {\n logWriter.register(config.taskRunId, {\n taskId: config.taskId ?? config.taskRunId,\n runId: config.taskRunId,\n deviceType: config.deviceType,\n });\n }\n\n const taskRunId = config.taskRunId;\n agentWritable = createTappedWritableStream(streams.agent.writable, {\n onMessage: (line) => {\n logWriter.appendRawLine(taskRunId, line);\n },\n logger,\n });\n\n clientWritable = createTappedWritableStream(streams.client.writable, {\n onMessage: (line) => {\n logWriter.appendRawLine(taskRunId, line);\n },\n logger,\n });\n } else {\n logger.info(\"Tapped streams NOT enabled\", {\n hasTaskRunId: !!config.taskRunId,\n hasLogWriter: !!logWriter,\n });\n }\n\n const agentStream = ndJsonStream(agentWritable, streams.agent.readable);\n\n let agent: ClaudeAcpAgent | null = null;\n const agentConnection = new AgentSideConnection((client) => {\n agent = new ClaudeAcpAgent(client, config.processCallbacks);\n logger.info(`Created ${agent.adapterName} agent`);\n return agent;\n }, agentStream);\n\n return {\n agentConnection,\n clientStreams: {\n readable: streams.client.readable,\n writable: clientWritable,\n },\n cleanup: async () => {\n logger.info(\"Cleaning up ACP connection\");\n\n if (agent) {\n await agent.closeSession();\n }\n\n try {\n await streams.client.writable.close();\n } catch {\n // Stream may already be closed\n }\n try {\n await streams.agent.writable.close();\n } catch {\n // Stream may already be closed\n }\n },\n };\n}\n\nfunction createCodexConnection(config: AcpConnectionConfig): AcpConnection {\n const logger =\n config.logger?.child(\"CodexConnection\") ??\n new Logger({ debug: true, prefix: \"[CodexConnection]\" });\n\n const { logWriter } = config;\n const allowedModelIds = config.allowedModelIds;\n\n const codexProcess = spawnCodexProcess({\n ...config.codexOptions,\n logger,\n processCallbacks: config.processCallbacks,\n });\n\n let clientReadable = nodeReadableToWebReadable(codexProcess.stdout);\n let clientWritable = nodeWritableToWebWritable(codexProcess.stdin);\n\n let isLoadingSession = false;\n let loadRequestId: string | number | null = null;\n let newSessionRequestId: string | number | null = null;\n let sdkSessionEmitted = false;\n const reasoningEffortBySessionId = new Map<string, string>();\n let injectedConfigId = 0;\n\n const decoder = new TextDecoder();\n const encoder = new TextEncoder();\n let readBuffer = \"\";\n\n const taskRunId = config.taskRunId;\n\n const filteringReadable = clientReadable.pipeThrough(\n new TransformStream<Uint8Array, Uint8Array>({\n transform(chunk, controller) {\n readBuffer += decoder.decode(chunk, { stream: true });\n const lines = readBuffer.split(\"\\n\");\n readBuffer = lines.pop() ?? \"\";\n\n const outputLines: string[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) {\n outputLines.push(line);\n continue;\n }\n\n let shouldFilter = false;\n\n try {\n const msg = JSON.parse(trimmed);\n const sessionId =\n msg?.params?.sessionId ?? msg?.result?.sessionId ?? null;\n const configOptions =\n msg?.result?.configOptions ?? msg?.params?.update?.configOptions;\n if (sessionId && configOptions) {\n const effort = extractReasoningEffort(configOptions);\n if (effort) {\n reasoningEffortBySessionId.set(sessionId, effort);\n }\n }\n\n if (\n !sdkSessionEmitted &&\n newSessionRequestId !== null &&\n msg.id === newSessionRequestId &&\n \"result\" in msg\n ) {\n const sessionId = msg.result?.sessionId;\n if (sessionId && taskRunId) {\n const sdkSessionNotification = {\n jsonrpc: \"2.0\",\n method: POSTHOG_NOTIFICATIONS.SDK_SESSION,\n params: {\n taskRunId,\n sessionId,\n adapter: \"codex\",\n },\n };\n outputLines.push(JSON.stringify(sdkSessionNotification));\n sdkSessionEmitted = true;\n }\n newSessionRequestId = null;\n }\n\n if (isLoadingSession) {\n if (msg.id === loadRequestId && \"result\" in msg) {\n logger.debug(\"session/load complete, resuming stream\");\n isLoadingSession = false;\n loadRequestId = null;\n } else if (msg.method === \"session/update\") {\n shouldFilter = true;\n }\n }\n\n if (!shouldFilter && allowedModelIds && allowedModelIds.size > 0) {\n const updated = filterModelConfigOptions(msg, allowedModelIds);\n if (updated) {\n outputLines.push(JSON.stringify(updated));\n continue;\n }\n }\n } catch {\n // Not valid JSON, pass through\n }\n\n if (!shouldFilter) {\n outputLines.push(line);\n const isChunkNoise =\n trimmed.includes('\"sessionUpdate\":\"agent_message_chunk\"') ||\n trimmed.includes('\"sessionUpdate\":\"agent_thought_chunk\"');\n if (!isChunkNoise) {\n logger.debug(\"codex-acp stdout:\", trimmed);\n }\n }\n }\n\n if (outputLines.length > 0) {\n const output = `${outputLines.join(\"\\n\")}\\n`;\n controller.enqueue(encoder.encode(output));\n }\n },\n flush(controller) {\n if (readBuffer.trim()) {\n controller.enqueue(encoder.encode(readBuffer));\n }\n },\n }),\n );\n clientReadable = filteringReadable;\n\n const originalWritable = clientWritable;\n clientWritable = new WritableStream({\n write(chunk) {\n const text = decoder.decode(chunk, { stream: true });\n const trimmed = text.trim();\n logger.debug(\"codex-acp stdin:\", trimmed);\n\n try {\n const msg = JSON.parse(trimmed);\n if (\n msg.method === \"session/set_config_option\" &&\n msg.params?.configId === \"reasoning_effort\" &&\n msg.params?.sessionId &&\n msg.params?.value\n ) {\n reasoningEffortBySessionId.set(\n msg.params.sessionId,\n msg.params.value,\n );\n }\n if (msg.method === \"session/prompt\" && msg.params?.sessionId) {\n const effort = reasoningEffortBySessionId.get(msg.params.sessionId);\n if (effort) {\n const injection = {\n jsonrpc: \"2.0\",\n id: `reasoning_effort_${Date.now()}_${injectedConfigId++}`,\n method: \"session/set_config_option\",\n params: {\n sessionId: msg.params.sessionId,\n configId: \"reasoning_effort\",\n value: effort,\n },\n };\n const injectionLine = `${JSON.stringify(injection)}\\n`;\n const writer = originalWritable.getWriter();\n return writer\n .write(encoder.encode(injectionLine))\n .then(() => writer.releaseLock())\n .then(() => {\n const nextWriter = originalWritable.getWriter();\n return nextWriter\n .write(chunk)\n .finally(() => nextWriter.releaseLock());\n });\n }\n }\n if (msg.method === \"session/new\" && msg.id) {\n logger.debug(\"session/new detected, tracking request ID\");\n newSessionRequestId = msg.id;\n } else if (msg.method === \"session/load\" && msg.id) {\n logger.debug(\"session/load detected, pausing stream updates\");\n isLoadingSession = true;\n loadRequestId = msg.id;\n }\n } catch {\n // Not valid JSON\n }\n\n const writer = originalWritable.getWriter();\n return writer.write(chunk).finally(() => writer.releaseLock());\n },\n close() {\n const writer = originalWritable.getWriter();\n return writer.close().finally(() => writer.releaseLock());\n },\n });\n\n const shouldTapLogs = config.taskRunId && logWriter;\n\n if (shouldTapLogs && config.taskRunId) {\n const taskRunId = config.taskRunId;\n if (!logWriter.isRegistered(taskRunId)) {\n logWriter.register(taskRunId, {\n taskId: config.taskId ?? taskRunId,\n runId: taskRunId,\n });\n }\n\n clientWritable = createTappedWritableStream(clientWritable, {\n onMessage: (line) => {\n logWriter.appendRawLine(taskRunId, line);\n },\n logger,\n });\n\n const originalReadable = clientReadable;\n const logDecoder = new TextDecoder();\n let logBuffer = \"\";\n\n clientReadable = originalReadable.pipeThrough(\n new TransformStream<Uint8Array, Uint8Array>({\n transform(chunk, controller) {\n logBuffer += logDecoder.decode(chunk, { stream: true });\n const lines = logBuffer.split(\"\\n\");\n logBuffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (line.trim()) {\n logWriter.appendRawLine(taskRunId, line);\n }\n }\n\n controller.enqueue(chunk);\n },\n flush() {\n if (logBuffer.trim()) {\n logWriter.appendRawLine(taskRunId, logBuffer);\n }\n },\n }),\n );\n } else {\n logger.info(\"Tapped streams NOT enabled for Codex\", {\n hasTaskRunId: !!config.taskRunId,\n hasLogWriter: !!logWriter,\n });\n }\n\n return {\n agentConnection: undefined,\n clientStreams: {\n readable: clientReadable,\n writable: clientWritable,\n },\n cleanup: async () => {\n logger.info(\"Cleaning up Codex connection\");\n codexProcess.kill();\n\n try {\n await clientWritable.close();\n } catch {\n // Stream may already be closed\n }\n },\n };\n}\n","/**\n * PostHog-specific ACP extensions.\n *\n * These follow the ACP extensibility model:\n * - Custom notification methods are prefixed with `_posthog/`\n * - Custom data can be attached via `_meta` fields\n *\n * Note: When using `extNotification()` from the ACP SDK, it automatically\n * adds an extra underscore prefix (e.g., `_posthog/tree_snapshot` becomes\n * `__posthog/tree_snapshot` in the log). Code that reads logs should handle both.\n *\n * See: https://agentclientprotocol.com/docs/extensibility\n */\n\n/**\n * Custom notification methods for PostHog-specific events.\n * Used with AgentSideConnection.extNotification() or Client.extNotification()\n */\nexport const POSTHOG_NOTIFICATIONS = {\n /** Git branch was created for a task */\n BRANCH_CREATED: \"_posthog/branch_created\",\n\n /** Task run has started execution */\n RUN_STARTED: \"_posthog/run_started\",\n\n /** Task has completed (success or failure) */\n TASK_COMPLETE: \"_posthog/task_complete\",\n\n /** Agent finished processing a turn (prompt returned, waiting for next input) */\n TURN_COMPLETE: \"_posthog/turn_complete\",\n\n /** Error occurred during task execution */\n ERROR: \"_posthog/error\",\n\n /** Console/log output from the agent */\n CONSOLE: \"_posthog/console\",\n\n /** Maps taskRunId to agent's sessionId and adapter type (for resumption) */\n SDK_SESSION: \"_posthog/sdk_session\",\n\n /** Tree state snapshot captured (git tree hash + file archive) */\n TREE_SNAPSHOT: \"_posthog/tree_snapshot\",\n\n /** Agent mode changed (interactive/background) */\n MODE_CHANGE: \"_posthog/mode_change\",\n\n /** Request to resume a session from previous state */\n SESSION_RESUME: \"_posthog/session/resume\",\n\n /** User message sent from client to agent */\n USER_MESSAGE: \"_posthog/user_message\",\n\n /** Request to cancel current operation */\n CANCEL: \"_posthog/cancel\",\n\n /** Request to close the session */\n CLOSE: \"_posthog/close\",\n\n /** Agent status update (thinking, working, etc.) */\n STATUS: \"_posthog/status\",\n\n /** Task-level notification (progress, milestones) */\n TASK_NOTIFICATION: \"_posthog/task_notification\",\n\n /** Marks a boundary for log compaction */\n COMPACT_BOUNDARY: \"_posthog/compact_boundary\",\n} as const;\n","export interface GatewayModel {\n id: string;\n owned_by: string;\n context_window: number;\n supports_streaming: boolean;\n supports_vision: boolean;\n}\n\ninterface GatewayModelsResponse {\n object: \"list\";\n data: GatewayModel[];\n}\n\nexport interface FetchGatewayModelsOptions {\n gatewayUrl: string;\n}\n\nexport const DEFAULT_GATEWAY_MODEL = \"claude-opus-4-6\";\n\nexport const BLOCKED_MODELS = new Set([\"gpt-5-mini\", \"openai/gpt-5-mini\"]);\n\ntype ModelsListResponse =\n | {\n data?: Array<{ id?: string; owned_by?: string }>;\n models?: Array<{ id?: string; owned_by?: string }>;\n }\n | Array<{ id?: string; owned_by?: string }>;\n\nconst CACHE_TTL = 10 * 60 * 1000; // 10 minutes\n\nlet gatewayModelsCache: {\n models: GatewayModel[];\n expiry: number;\n url: string;\n} | null = null;\n\nexport async function fetchGatewayModels(\n options?: FetchGatewayModelsOptions,\n): Promise<GatewayModel[]> {\n const gatewayUrl = options?.gatewayUrl ?? process.env.ANTHROPIC_BASE_URL;\n if (!gatewayUrl) {\n return [];\n }\n\n if (\n gatewayModelsCache &&\n gatewayModelsCache.url === gatewayUrl &&\n Date.now() < gatewayModelsCache.expiry\n ) {\n return gatewayModelsCache.models;\n }\n\n const modelsUrl = `${gatewayUrl}/v1/models`;\n\n try {\n const response = await fetch(modelsUrl);\n\n if (!response.ok) {\n return [];\n }\n\n const data = (await response.json()) as GatewayModelsResponse;\n const models = (data.data ?? []).filter((m) => !BLOCKED_MODELS.has(m.id));\n gatewayModelsCache = {\n models,\n expiry: Date.now() + CACHE_TTL,\n url: gatewayUrl,\n };\n return models;\n } catch {\n return [];\n }\n}\n\nexport function isAnthropicModel(model: GatewayModel): boolean {\n if (model.owned_by) {\n return model.owned_by === \"anthropic\";\n }\n return model.id.startsWith(\"claude-\") || model.id.startsWith(\"anthropic/\");\n}\n\nexport interface ModelInfo {\n id: string;\n owned_by?: string;\n}\n\nlet modelsListCache: {\n models: ModelInfo[];\n expiry: number;\n url: string;\n} | null = null;\n\nexport async function fetchModelsList(\n options?: FetchGatewayModelsOptions,\n): Promise<ModelInfo[]> {\n const gatewayUrl = options?.gatewayUrl ?? process.env.ANTHROPIC_BASE_URL;\n if (!gatewayUrl) {\n return [];\n }\n\n if (\n modelsListCache &&\n modelsListCache.url === gatewayUrl &&\n Date.now() < modelsListCache.expiry\n ) {\n return modelsListCache.models;\n }\n\n try {\n const modelsUrl = `${gatewayUrl}/v1/models`;\n const response = await fetch(modelsUrl);\n if (!response.ok) {\n return [];\n }\n const data = (await response.json()) as ModelsListResponse;\n const models = Array.isArray(data)\n ? data\n : (data.data ?? data.models ?? []);\n const results: ModelInfo[] = [];\n for (const model of models) {\n const id = model?.id ? String(model.id) : \"\";\n if (!id) continue;\n results.push({ id, owned_by: model?.owned_by });\n }\n modelsListCache = {\n models: results,\n expiry: Date.now() + CACHE_TTL,\n url: gatewayUrl,\n };\n return results;\n } catch {\n return [];\n }\n}\n\nconst PROVIDER_NAMES: Record<string, string> = {\n anthropic: \"Anthropic\",\n openai: \"OpenAI\",\n \"google-vertex\": \"Gemini\",\n};\n\nexport function getProviderName(ownedBy: string): string {\n return PROVIDER_NAMES[ownedBy] ?? ownedBy;\n}\n\nconst PROVIDER_PREFIXES = [\"anthropic/\", \"openai/\", \"google-vertex/\"];\n\nexport function formatGatewayModelName(model: GatewayModel): string {\n return formatModelId(model.id);\n}\n\nexport function formatModelId(modelId: string): string {\n let cleanId = modelId;\n for (const prefix of PROVIDER_PREFIXES) {\n if (cleanId.startsWith(prefix)) {\n cleanId = cleanId.slice(prefix.length);\n break;\n }\n }\n\n cleanId = cleanId.replace(/(\\d)-(\\d)/g, \"$1.$2\");\n\n const words = cleanId.split(/[-_]/).map((word) => {\n if (word.match(/^[0-9.]+$/)) return word;\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n });\n\n return words.join(\" \");\n}\n","import type { LogLevel as LogLevelType, OnLogCallback } from \"../types\";\n\nexport interface LoggerConfig {\n debug?: boolean;\n prefix?: string;\n scope?: string;\n onLog?: OnLogCallback;\n}\n\nexport class Logger {\n private debugEnabled: boolean;\n private prefix: string;\n private scope: string;\n private onLog?: OnLogCallback;\n\n constructor(config: LoggerConfig = {}) {\n this.debugEnabled = config.debug ?? false;\n this.prefix = config.prefix ?? \"[PostHog Agent]\";\n this.scope = config.scope ?? \"agent\";\n this.onLog = config.onLog;\n }\n\n private formatMessage(\n level: string,\n message: string,\n data?: unknown,\n ): string {\n const timestamp = new Date().toISOString();\n const base = `${timestamp} ${this.prefix} [${level}] ${message}`;\n\n if (data !== undefined) {\n return `${base} ${JSON.stringify(data, null, 2)}`;\n }\n\n return base;\n }\n\n private emitLog(level: LogLevelType, message: string, data?: unknown) {\n if (this.onLog) {\n this.onLog(level, this.scope, message, data);\n return;\n }\n\n const shouldLog = this.debugEnabled || level === \"error\";\n\n if (shouldLog) {\n console[level](this.formatMessage(level.toLowerCase(), message, data));\n }\n }\n\n error(message: string, error?: Error | unknown) {\n const data =\n error instanceof Error\n ? { message: error.message, stack: error.stack }\n : error;\n\n this.emitLog(\"error\", message, data);\n }\n\n warn(message: string, data?: unknown) {\n this.emitLog(\"warn\", message, data);\n }\n\n info(message: string, data?: unknown) {\n this.emitLog(\"info\", message, data);\n }\n\n debug(message: string, data?: unknown) {\n this.emitLog(\"debug\", message, data);\n }\n\n child(childPrefix: string): Logger {\n return new Logger({\n debug: this.debugEnabled,\n prefix: `${this.prefix} [${childPrefix}]`,\n scope: `${this.scope}:${childPrefix}`,\n onLog: this.onLog,\n });\n }\n}\n","import type { Readable, Writable } from \"node:stream\";\nimport { ReadableStream, WritableStream } from \"node:stream/web\";\nimport type { Logger } from \"./logger\";\n\nexport class Pushable<T> implements AsyncIterable<T> {\n private queue: T[] = [];\n private resolvers: ((value: IteratorResult<T>) => void)[] = [];\n private done = false;\n\n push(item: T) {\n const resolve = this.resolvers.shift();\n if (resolve) {\n resolve({ value: item, done: false });\n } else {\n this.queue.push(item);\n }\n }\n\n end() {\n this.done = true;\n for (const resolve of this.resolvers) {\n resolve({ value: undefined as unknown as T, done: true });\n }\n this.resolvers = [];\n }\n\n [Symbol.asyncIterator](): AsyncIterator<T> {\n return {\n next: (): Promise<IteratorResult<T>> => {\n if (this.queue.length > 0) {\n const value = this.queue.shift() as T;\n return Promise.resolve({ value, done: false });\n }\n if (this.done) {\n return Promise.resolve({\n value: undefined as unknown as T,\n done: true,\n });\n }\n return new Promise<IteratorResult<T>>((resolve) => {\n this.resolvers.push(resolve);\n });\n },\n };\n }\n}\n\nexport type StreamPair = {\n readable: globalThis.ReadableStream<Uint8Array>;\n writable: globalThis.WritableStream<Uint8Array>;\n};\n\nexport type BidirectionalStreamPair = {\n client: StreamPair;\n agent: StreamPair;\n};\n\nfunction pushableToReadableStream(\n pushable: Pushable<Uint8Array>,\n): globalThis.ReadableStream<Uint8Array> {\n const iterator = pushable[Symbol.asyncIterator]();\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n const { value, done } = await iterator.next();\n if (done) {\n controller.close();\n } else {\n controller.enqueue(value);\n }\n },\n }) as unknown as globalThis.ReadableStream<Uint8Array>;\n}\n\nexport function createBidirectionalStreams(): BidirectionalStreamPair {\n const clientToAgentPushable = new Pushable<Uint8Array>();\n const agentToClientPushable = new Pushable<Uint8Array>();\n\n const clientToAgentReadable = pushableToReadableStream(clientToAgentPushable);\n const agentToClientReadable = pushableToReadableStream(agentToClientPushable);\n\n const clientToAgentWritable = new WritableStream<Uint8Array>({\n write(chunk) {\n clientToAgentPushable.push(chunk);\n },\n close() {\n clientToAgentPushable.end();\n },\n }) as globalThis.WritableStream<Uint8Array>;\n\n const agentToClientWritable = new WritableStream<Uint8Array>({\n write(chunk) {\n agentToClientPushable.push(chunk);\n },\n close() {\n agentToClientPushable.end();\n },\n }) as globalThis.WritableStream<Uint8Array>;\n\n return {\n client: {\n readable: agentToClientReadable,\n writable: clientToAgentWritable,\n },\n agent: {\n readable: clientToAgentReadable,\n writable: agentToClientWritable,\n },\n };\n}\n\ntype MessageCallback = (line: string) => void;\n\nexport interface TappedStreamOptions {\n onMessage: MessageCallback;\n logger?: Logger;\n}\n\nexport function createTappedWritableStream(\n underlying: WritableStream<Uint8Array>,\n options: TappedStreamOptions,\n): WritableStream<Uint8Array> {\n const { onMessage, logger } = options;\n const decoder = new TextDecoder();\n let buffer = \"\";\n let _messageCount = 0;\n\n return new WritableStream({\n async write(chunk: Uint8Array) {\n buffer += decoder.decode(chunk, { stream: true });\n\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (!line.trim()) continue;\n _messageCount++;\n\n onMessage(line);\n }\n\n try {\n const writer = underlying.getWriter();\n await writer.write(chunk);\n writer.releaseLock();\n } catch (err) {\n // Stream may be closed if subprocess crashed - log but don't throw\n logger?.error(\"ACP write error\", err);\n }\n },\n async close() {\n try {\n const writer = underlying.getWriter();\n await writer.close();\n writer.releaseLock();\n } catch {\n // Stream may already be closed\n }\n },\n async abort(reason: unknown) {\n logger?.warn(\"Tapped stream aborted\", { reason });\n try {\n const writer = underlying.getWriter();\n await writer.abort(reason);\n writer.releaseLock();\n } catch {\n // Stream may already be closed\n }\n },\n });\n}\n\nexport function nodeReadableToWebReadable(\n nodeStream: Readable,\n): globalThis.ReadableStream<Uint8Array> {\n return new ReadableStream<Uint8Array>({\n start(controller) {\n nodeStream.on(\"data\", (chunk: Buffer) => {\n controller.enqueue(new Uint8Array(chunk));\n });\n nodeStream.on(\"end\", () => {\n controller.close();\n });\n nodeStream.on(\"error\", (err) => {\n controller.error(err);\n });\n },\n cancel() {\n nodeStream.destroy();\n },\n }) as unknown as globalThis.ReadableStream<Uint8Array>;\n}\n\nexport function nodeWritableToWebWritable(\n nodeStream: Writable,\n): globalThis.WritableStream<Uint8Array> {\n return new WritableStream<Uint8Array>({\n write(chunk) {\n return new Promise((resolve, reject) => {\n const ok = nodeStream.write(Buffer.from(chunk), (err) => {\n if (err) reject(err);\n });\n if (ok) {\n resolve();\n } else {\n nodeStream.once(\"drain\", resolve);\n }\n });\n },\n close() {\n return new Promise((resolve) => {\n nodeStream.end(resolve);\n });\n },\n abort(reason) {\n nodeStream.destroy(\n reason instanceof Error ? reason : new Error(String(reason)),\n );\n },\n }) as globalThis.WritableStream<Uint8Array>;\n}\n","import { randomUUID } from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport {\n type ModelInfo as AcpModelInfo,\n type AgentSideConnection,\n type ClientCapabilities,\n type ForkSessionRequest,\n type ForkSessionResponse,\n type InitializeRequest,\n type InitializeResponse,\n type ListSessionsRequest,\n type ListSessionsResponse,\n type LoadSessionRequest,\n type LoadSessionResponse,\n type NewSessionRequest,\n type NewSessionResponse,\n type PromptRequest,\n type PromptResponse,\n RequestError,\n type ResumeSessionRequest,\n type ResumeSessionResponse,\n type SessionConfigOption,\n type SessionConfigOptionCategory,\n type SessionConfigSelectOption,\n type SessionModelState,\n type SessionModeState,\n type SetSessionConfigOptionRequest,\n type SetSessionConfigOptionResponse,\n type SetSessionModelRequest,\n type SetSessionModelResponse,\n type SetSessionModeRequest,\n type SetSessionModeResponse,\n type Usage,\n} from \"@agentclientprotocol/sdk\";\nimport {\n type CanUseTool,\n getSessionMessages,\n listSessions,\n type Query,\n query,\n type SDKUserMessage,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport { v7 as uuidv7 } from \"uuid\";\nimport packageJson from \"../../../package.json\" with { type: \"json\" };\nimport { unreachable, withTimeout } from \"../../utils/common\";\nimport { Logger } from \"../../utils/logger\";\nimport { Pushable } from \"../../utils/streams\";\nimport { BaseAcpAgent } from \"../base-acp-agent\";\nimport { promptToClaude } from \"./conversion/acp-to-sdk\";\nimport {\n handleResultMessage,\n handleStreamEvent,\n handleSystemMessage,\n handleUserAssistantMessage,\n} from \"./conversion/sdk-to-acp\";\nimport {\n fetchMcpToolMetadata,\n getConnectedMcpServerNames,\n} from \"./mcp/tool-metadata\";\nimport { canUseTool } from \"./permissions/permission-handlers\";\nimport { getAvailableSlashCommands } from \"./session/commands\";\nimport { parseMcpServers } from \"./session/mcp-config\";\nimport {\n DEFAULT_MODEL,\n getEffortOptions,\n resolveModelPreference,\n supports1MContext,\n toSdkModelId,\n} from \"./session/models\";\nimport {\n buildSessionOptions,\n buildSystemPrompt,\n type ProcessSpawnedInfo,\n} from \"./session/options\";\nimport { SettingsManager } from \"./session/settings\";\nimport {\n CODE_EXECUTION_MODES,\n type CodeExecutionMode,\n getAvailableModes,\n} from \"./tools\";\nimport type {\n BackgroundTerminal,\n EffortLevel,\n NewSessionMeta,\n Session,\n ToolUseCache,\n} from \"./types\";\n\nconst SESSION_VALIDATION_TIMEOUT_MS = 30_000;\nconst MAX_TITLE_LENGTH = 256;\nconst LOCAL_ONLY_COMMANDS = new Set([\"/context\", \"/heapdump\", \"/extra-usage\"]);\n\nfunction sanitizeTitle(text: string): string {\n const sanitized = text\n .replace(/[\\r\\n]+/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n if (sanitized.length <= MAX_TITLE_LENGTH) {\n return sanitized;\n }\n return `${sanitized.slice(0, MAX_TITLE_LENGTH - 1)}…`;\n}\n\nexport interface ClaudeAcpAgentOptions {\n onProcessSpawned?: (info: ProcessSpawnedInfo) => void;\n onProcessExited?: (pid: number) => void;\n onMcpServersReady?: (serverNames: string[]) => void;\n}\n\nexport class ClaudeAcpAgent extends BaseAcpAgent {\n readonly adapterName = \"claude\";\n declare session: Session;\n toolUseCache: ToolUseCache;\n backgroundTerminals: { [key: string]: BackgroundTerminal } = {};\n clientCapabilities?: ClientCapabilities;\n private options?: ClaudeAcpAgentOptions;\n\n constructor(client: AgentSideConnection, options?: ClaudeAcpAgentOptions) {\n super(client);\n this.options = options;\n this.toolUseCache = {};\n this.logger = new Logger({ debug: true, prefix: \"[ClaudeAcpAgent]\" });\n }\n\n async initialize(request: InitializeRequest): Promise<InitializeResponse> {\n this.clientCapabilities = request.clientCapabilities;\n\n return {\n protocolVersion: 1,\n agentCapabilities: {\n promptCapabilities: {\n image: true,\n embeddedContext: true,\n },\n mcpCapabilities: {\n http: true,\n sse: true,\n },\n loadSession: true,\n sessionCapabilities: {\n list: {},\n fork: {},\n resume: {},\n },\n _meta: {\n posthog: {\n resumeSession: true,\n },\n claudeCode: {\n promptQueueing: true,\n },\n },\n },\n agentInfo: {\n name: packageJson.name,\n title: \"Claude Agent\",\n version: packageJson.version,\n },\n authMethods: [],\n };\n }\n\n async newSession(params: NewSessionRequest): Promise<NewSessionResponse> {\n // Upstream Claude Code renames .claude.json to .claude.json.backup on logout.\n // If the backup exists but the original doesn't, the user is logged out.\n if (\n fs.existsSync(path.resolve(os.homedir(), \".claude.json.backup\")) &&\n !fs.existsSync(path.resolve(os.homedir(), \".claude.json\"))\n ) {\n throw RequestError.authRequired();\n }\n\n const response = await this.createSession(params, {\n // Revisit these meta values once we support resume\n resume: (params._meta as NewSessionMeta | undefined)?.claudeCode?.options\n ?.resume as string | undefined,\n });\n\n return response;\n }\n\n async unstable_forkSession(\n params: ForkSessionRequest,\n ): Promise<ForkSessionResponse> {\n return this.createSession(\n {\n cwd: params.cwd,\n mcpServers: params.mcpServers ?? [],\n _meta: params._meta,\n },\n { resume: params.sessionId, forkSession: true },\n );\n }\n\n async unstable_resumeSession(\n params: ResumeSessionRequest,\n ): Promise<ResumeSessionResponse> {\n // Reuse existing session if it matches\n const existing = this.getExistingSessionState(params.sessionId);\n if (existing) return existing;\n\n const response = await this.createSession(\n {\n cwd: params.cwd,\n mcpServers: params.mcpServers ?? [],\n _meta: params._meta,\n },\n {\n resume: params.sessionId,\n },\n );\n\n return response;\n }\n\n async loadSession(params: LoadSessionRequest): Promise<LoadSessionResponse> {\n // Reuse existing session if it matches\n const existing = this.getExistingSessionState(params.sessionId);\n if (existing) return existing;\n\n const response = await this.createSession(\n {\n cwd: params.cwd,\n mcpServers: params.mcpServers ?? [],\n _meta: params._meta,\n },\n { resume: params.sessionId, skipBackgroundFetches: true },\n );\n\n await this.replaySessionHistory(params.sessionId);\n\n // Send available commands after replay so they don't interleave with history\n this.deferBackgroundFetches(this.session.query);\n\n return {\n modes: response.modes,\n models: response.models,\n configOptions: response.configOptions,\n };\n }\n\n async listSessions(\n params: ListSessionsRequest,\n ): Promise<ListSessionsResponse> {\n const sdkSessions = await listSessions({ dir: params.cwd ?? undefined });\n const sessions = [];\n\n for (const session of sdkSessions) {\n if (!session.cwd) continue;\n sessions.push({\n sessionId: session.sessionId,\n cwd: session.cwd,\n title: sanitizeTitle(session.customTitle || session.summary || \"\"),\n updatedAt: new Date(session.lastModified).toISOString(),\n });\n }\n return {\n sessions,\n };\n }\n\n async unstable_listSessions(\n params: ListSessionsRequest,\n ): Promise<ListSessionsResponse> {\n return this.listSessions(params);\n }\n\n async prompt(params: PromptRequest): Promise<PromptResponse> {\n this.session.cancelled = false;\n this.session.interruptReason = undefined;\n this.session.accumulatedUsage = {\n inputTokens: 0,\n outputTokens: 0,\n cachedReadTokens: 0,\n cachedWriteTokens: 0,\n };\n\n const userMessage = promptToClaude(params);\n const promptUuid = randomUUID();\n userMessage.uuid = promptUuid;\n let promptReplayed = false;\n let isLocalOnlyCommand = false;\n\n // Detect local-only slash commands that return results without model invocation\n const msgContent = userMessage.message.content;\n let firstTextPart = \"\";\n if (typeof msgContent === \"string\") {\n firstTextPart = msgContent;\n } else if (Array.isArray(msgContent)) {\n for (const block of msgContent) {\n if (\"type\" in block && block.type === \"text\" && \"text\" in block) {\n firstTextPart = block.text as string;\n break;\n }\n }\n }\n const commandMatch = firstTextPart.match(/^(\\/\\S+)/);\n if (commandMatch && LOCAL_ONLY_COMMANDS.has(commandMatch[1])) {\n isLocalOnlyCommand = true;\n promptReplayed = true;\n }\n\n if (this.session.promptRunning) {\n this.session.input.push(userMessage);\n const order = this.session.nextPendingOrder++;\n const cancelled = await new Promise<boolean>((resolve) => {\n this.session.pendingMessages.set(promptUuid, { resolve, order });\n });\n if (cancelled) {\n return { stopReason: \"cancelled\" };\n }\n promptReplayed = true;\n } else {\n this.session.input.push(userMessage);\n }\n\n // Broadcast user message to client\n await this.broadcastUserMessage(params);\n\n this.session.promptRunning = true;\n let handedOff = false;\n let lastAssistantTotalUsage: number | null = null;\n if (this.session.lastContextWindowSize == null) {\n this.session.lastContextWindowSize = this.getContextWindowForModel(\n this.session.modelId ?? \"\",\n );\n this.logger.debug(\"Initial context window size from gateway\", {\n modelId: this.session.modelId,\n contextWindowSize: this.session.lastContextWindowSize,\n });\n }\n let lastContextWindowSize = this.session.lastContextWindowSize;\n\n const supportsTerminalOutput =\n (\n this.clientCapabilities?._meta as\n | ClientCapabilities[\"_meta\"]\n | undefined\n )?.terminal_output === true;\n\n const context = {\n session: this.session,\n sessionId: params.sessionId,\n client: this.client,\n toolUseCache: this.toolUseCache,\n fileContentCache: this.fileContentCache,\n logger: this.logger,\n supportsTerminalOutput,\n };\n\n try {\n while (true) {\n const { value: message, done } = await this.session.query.next();\n\n if (done || !message) {\n if (this.session.cancelled) {\n return {\n stopReason: \"cancelled\",\n _meta: this.session.interruptReason\n ? { interruptReason: this.session.interruptReason }\n : undefined,\n };\n }\n break;\n }\n\n switch (message.type) {\n case \"system\":\n if (message.subtype === \"compact_boundary\") {\n lastAssistantTotalUsage = 0;\n promptReplayed = true;\n }\n if (message.subtype === \"local_command_output\") {\n promptReplayed = true;\n }\n await handleSystemMessage(message, context);\n break;\n\n case \"result\": {\n // Skip results from background tasks that finished after our prompt started\n if (!promptReplayed) {\n this.logger.debug(\n \"Skipping background task result before prompt replay\",\n { sessionId: params.sessionId },\n );\n break;\n }\n\n if (this.session.cancelled) {\n return { stopReason: \"cancelled\" };\n }\n\n // Accumulate usage from this result\n this.session.accumulatedUsage.inputTokens +=\n message.usage.input_tokens;\n this.session.accumulatedUsage.outputTokens +=\n message.usage.output_tokens;\n this.session.accumulatedUsage.cachedReadTokens +=\n message.usage.cache_read_input_tokens;\n this.session.accumulatedUsage.cachedWriteTokens +=\n message.usage.cache_creation_input_tokens;\n\n // SDK can underreport context window (e.g. 200k for 1M models).\n // Use SDK value only if it's larger than what gateway reported.\n const contextWindows = Object.values(message.modelUsage).map(\n (m) => m.contextWindow,\n );\n if (contextWindows.length > 0) {\n const sdkContextWindow = Math.min(...contextWindows);\n if (sdkContextWindow > lastContextWindowSize) {\n lastContextWindowSize = sdkContextWindow;\n }\n }\n this.session.lastContextWindowSize = lastContextWindowSize;\n this.logger.debug(\"Context window size from result\", {\n sdkReported: contextWindows,\n resolved: lastContextWindowSize,\n modelId: this.session.modelId,\n });\n\n this.session.contextSize = lastContextWindowSize;\n if (lastAssistantTotalUsage !== null) {\n this.session.contextUsed = lastAssistantTotalUsage;\n }\n\n // Send usage_update notification\n if (lastAssistantTotalUsage !== null) {\n await this.client.sessionUpdate({\n sessionId: params.sessionId,\n update: {\n sessionUpdate: \"usage_update\",\n used: lastAssistantTotalUsage,\n size: lastContextWindowSize,\n cost: {\n amount: message.total_cost_usd,\n currency: \"USD\",\n },\n },\n });\n }\n\n await this.client.extNotification(\"_posthog/usage_update\", {\n sessionId: params.sessionId,\n used: {\n inputTokens: message.usage.input_tokens,\n outputTokens: message.usage.output_tokens,\n cachedReadTokens: message.usage.cache_read_input_tokens,\n cachedWriteTokens: message.usage.cache_creation_input_tokens,\n },\n cost: message.total_cost_usd,\n });\n\n const usage: Usage = {\n inputTokens: this.session.accumulatedUsage.inputTokens,\n outputTokens: this.session.accumulatedUsage.outputTokens,\n cachedReadTokens: this.session.accumulatedUsage.cachedReadTokens,\n cachedWriteTokens:\n this.session.accumulatedUsage.cachedWriteTokens,\n totalTokens:\n this.session.accumulatedUsage.inputTokens +\n this.session.accumulatedUsage.outputTokens +\n this.session.accumulatedUsage.cachedReadTokens +\n this.session.accumulatedUsage.cachedWriteTokens,\n };\n\n const result = handleResultMessage(message);\n if (result.error) throw result.error;\n\n // For local-only commands, forward the result text to the client\n if (\n isLocalOnlyCommand &&\n message.subtype === \"success\" &&\n message.result\n ) {\n await this.client.sessionUpdate({\n sessionId: params.sessionId,\n update: {\n sessionUpdate: \"agent_message_chunk\",\n content: { type: \"text\", text: message.result },\n },\n });\n }\n\n return { stopReason: result.stopReason ?? \"end_turn\", usage };\n }\n\n case \"stream_event\":\n await handleStreamEvent(message, context);\n break;\n\n case \"user\":\n case \"assistant\": {\n if (this.session.cancelled) {\n break;\n }\n\n // Check for prompt replay (our own message echoed back)\n if (message.type === \"user\" && \"uuid\" in message && message.uuid) {\n if (message.uuid === promptUuid) {\n promptReplayed = true;\n break;\n }\n\n const pending = this.session.pendingMessages.get(\n message.uuid as string,\n );\n if (pending) {\n pending.resolve(false);\n this.session.pendingMessages.delete(message.uuid as string);\n handedOff = true;\n // the current loop stops with end_turn,\n // the loop of the next prompt continues running\n return { stopReason: \"end_turn\" };\n }\n }\n\n // Skip replayed user messages that aren't pending prompts\n if (\n \"isReplay\" in message &&\n (message as Record<string, unknown>).isReplay\n ) {\n break;\n }\n\n // Store latest assistant usage (excluding subagents)\n if (\n \"usage\" in message.message &&\n message.parent_tool_use_id === null\n ) {\n const usage = (\n message.message as unknown as Record<string, unknown>\n ).usage as {\n input_tokens: number;\n output_tokens: number;\n cache_read_input_tokens: number;\n cache_creation_input_tokens: number;\n };\n lastAssistantTotalUsage =\n usage.input_tokens +\n usage.cache_read_input_tokens +\n usage.cache_creation_input_tokens;\n\n await this.client.sessionUpdate({\n sessionId: params.sessionId,\n update: {\n sessionUpdate: \"usage_update\",\n used: lastAssistantTotalUsage,\n size: lastContextWindowSize,\n cost: null,\n },\n });\n }\n\n const result = await handleUserAssistantMessage(message, context);\n if (result.error) throw result.error;\n if (result.shouldStop) {\n return { stopReason: \"end_turn\" };\n }\n break;\n }\n\n case \"tool_progress\":\n case \"auth_status\":\n case \"tool_use_summary\":\n case \"prompt_suggestion\":\n case \"rate_limit_event\":\n break;\n\n default:\n unreachable(message as never, this.logger);\n break;\n }\n }\n throw new Error(\"Session did not end in result\");\n } catch (error) {\n if (error instanceof RequestError || !(error instanceof Error)) {\n throw error;\n }\n const msg = error.message;\n if (\n msg.includes(\"ProcessTransport\") ||\n msg.includes(\"terminated process\") ||\n msg.includes(\"process exited with\") ||\n msg.includes(\"process terminated by signal\") ||\n msg.includes(\"Failed to write to process stdin\")\n ) {\n this.logger.error(`Process died: ${msg}`, {\n sessionId: this.sessionId,\n });\n this.session.settingsManager.dispose();\n this.session.input.end();\n throw RequestError.internalError(\n undefined,\n \"The Claude Agent process exited unexpectedly. Please start a new session.\",\n );\n }\n throw error;\n } finally {\n if (!handedOff) {\n this.session.promptRunning = false;\n // Resolve all remaining pending prompts so no callers get stuck.\n for (const [key, pending] of this.session.pendingMessages) {\n pending.resolve(true);\n this.session.pendingMessages.delete(key);\n }\n }\n }\n }\n\n // Called by BaseAcpAgent#cancel() to interrupt the session\n protected async interrupt(): Promise<void> {\n this.session.cancelled = true;\n for (const [, pending] of this.session.pendingMessages) {\n pending.resolve(true);\n }\n this.session.pendingMessages.clear();\n await this.session.query.interrupt();\n }\n\n async unstable_setSessionModel(\n params: SetSessionModelRequest,\n ): Promise<SetSessionModelResponse | undefined> {\n await this.session.query.setModel(toSdkModelId(params.modelId));\n this.session.modelId = params.modelId;\n this.session.lastContextWindowSize = this.getContextWindowForModel(\n params.modelId,\n );\n this.rebuildEffortConfigOption(params.modelId);\n await this.updateConfigOption(\"model\", params.modelId);\n return {};\n }\n\n async setSessionMode(\n params: SetSessionModeRequest,\n ): Promise<SetSessionModeResponse> {\n await this.applySessionMode(params.modeId);\n await this.updateConfigOption(\"mode\", params.modeId);\n return {};\n }\n\n async setSessionConfigOption(\n params: SetSessionConfigOptionRequest,\n ): Promise<SetSessionConfigOptionResponse> {\n const option = this.session.configOptions.find(\n (o) => o.id === params.configId,\n );\n if (!option) {\n throw new Error(`Unknown config option: ${params.configId}`);\n }\n\n if (typeof params.value !== \"string\") {\n throw new Error(\n `Invalid value type for config option ${params.configId}`,\n );\n }\n\n const allValues: { value: string; name?: string; description?: string }[] =\n \"options\" in option && Array.isArray(option.options)\n ? (option.options as Array<Record<string, unknown>>).flatMap((o) =>\n \"options\" in o && Array.isArray(o.options)\n ? (o.options as {\n value: string;\n name?: string;\n description?: string;\n }[])\n : [o as { value: string; name?: string; description?: string }],\n )\n : [];\n let validValue = allValues.find((o) => o.value === params.value);\n\n // For model options, fall back to alias resolution when exact match fails.\n // This lets callers use human-friendly aliases like \"opus\" or \"sonnet\"\n // instead of full model IDs like \"claude-opus-4-6\".\n if (!validValue && params.configId === \"model\") {\n const resolved = resolveModelPreference(params.value, allValues);\n if (resolved) {\n validValue = allValues.find((o) => o.value === resolved);\n }\n }\n\n if (!validValue) {\n throw new Error(\n `Invalid value for config option ${params.configId}: ${params.value}`,\n );\n }\n\n // Use the canonical option value so downstream code always receives the\n // model ID rather than the caller-supplied alias.\n const resolvedValue = validValue.value;\n\n if (params.configId === \"mode\") {\n await this.applySessionMode(resolvedValue);\n await this.client.sessionUpdate({\n sessionId: this.sessionId,\n update: {\n sessionUpdate: \"current_mode_update\",\n currentModeId: resolvedValue,\n },\n });\n } else if (params.configId === \"model\") {\n const sdkModelId = toSdkModelId(resolvedValue);\n await this.session.query.setModel(sdkModelId);\n this.session.modelId = resolvedValue;\n this.session.lastContextWindowSize =\n this.getContextWindowForModel(resolvedValue);\n this.rebuildEffortConfigOption(resolvedValue);\n } else if (params.configId === \"effort\") {\n const newEffort = resolvedValue as EffortLevel;\n this.session.effort = newEffort;\n this.session.queryOptions.effort = newEffort;\n }\n\n this.session.configOptions = this.session.configOptions.map((o) =>\n o.id === params.configId && typeof o.currentValue === \"string\"\n ? { ...o, currentValue: resolvedValue }\n : o,\n );\n\n return { configOptions: this.session.configOptions };\n }\n\n private async updateConfigOption(\n configId: string,\n value: string,\n ): Promise<void> {\n this.session.configOptions = this.session.configOptions.map((o) =>\n o.id === configId && typeof o.currentValue === \"string\"\n ? { ...o, currentValue: value }\n : o,\n );\n\n await this.client.sessionUpdate({\n sessionId: this.sessionId,\n update: {\n sessionUpdate: \"config_option_update\",\n configOptions: this.session.configOptions,\n },\n });\n }\n\n private async applySessionMode(modeId: string): Promise<void> {\n if (!CODE_EXECUTION_MODES.includes(modeId as CodeExecutionMode)) {\n throw new Error(\"Invalid Mode\");\n }\n const previousMode = this.session.permissionMode;\n this.session.permissionMode = modeId as CodeExecutionMode;\n try {\n await this.session.query.setPermissionMode(modeId as CodeExecutionMode);\n } catch (error) {\n this.session.permissionMode = previousMode;\n if (error instanceof Error) {\n if (!error.message) {\n error.message = \"Invalid Mode\";\n }\n throw error;\n }\n throw new Error(\"Invalid Mode\");\n }\n }\n\n private async createSession(\n params: {\n cwd: string;\n mcpServers: NewSessionRequest[\"mcpServers\"];\n _meta?: unknown;\n },\n creationOpts: {\n resume?: string;\n forkSession?: boolean;\n skipBackgroundFetches?: boolean;\n } = {},\n ): Promise<NewSessionResponse> {\n const { cwd } = params;\n const { resume, forkSession } = creationOpts;\n\n const isResume = !!resume;\n\n const meta = params._meta as NewSessionMeta | undefined;\n const taskId = meta?.persistence?.taskId;\n const effort = meta?.claudeCode?.options?.effort as EffortLevel | undefined;\n\n // We want to create a new session id unless it is resume,\n // but not resume + forkSession.\n let sessionId: string;\n if (forkSession) {\n sessionId = uuidv7();\n } else if (isResume) {\n sessionId = resume;\n } else {\n sessionId = uuidv7();\n }\n\n const input = new Pushable<SDKUserMessage>();\n\n const settingsManager = new SettingsManager(cwd);\n await settingsManager.initialize();\n\n const mcpServers = parseMcpServers(params);\n const systemPrompt = buildSystemPrompt(meta?.systemPrompt);\n\n this.logger.info(isResume ? \"Resuming session\" : \"Creating new session\", {\n sessionId,\n taskId,\n taskRunId: meta?.taskRunId,\n cwd,\n });\n\n const permissionMode: CodeExecutionMode =\n meta?.permissionMode &&\n CODE_EXECUTION_MODES.includes(meta.permissionMode as CodeExecutionMode)\n ? (meta.permissionMode as CodeExecutionMode)\n : \"default\";\n\n const options = buildSessionOptions({\n cwd,\n mcpServers,\n permissionMode,\n canUseTool: this.createCanUseTool(sessionId, meta?.allowedDomains),\n logger: this.logger,\n systemPrompt,\n userProvidedOptions: meta?.claudeCode?.options,\n sessionId,\n isResume,\n forkSession,\n additionalDirectories: [\n ...(meta?.claudeCode?.options?.additionalDirectories ?? []),\n ...(meta?.additionalRoots ?? []),\n ],\n disableBuiltInTools: meta?.disableBuiltInTools,\n settingsManager,\n onModeChange: this.createOnModeChange(),\n onProcessSpawned: this.options?.onProcessSpawned,\n onProcessExited: this.options?.onProcessExited,\n effort,\n });\n\n // Use the same abort controller that buildSessionOptions gave to the query\n const abortController = options.abortController as AbortController;\n\n const q = query({ prompt: input, options });\n\n const session: Session = {\n query: q,\n queryOptions: options,\n input,\n cancelled: false,\n settingsManager,\n permissionMode,\n abortController,\n accumulatedUsage: {\n inputTokens: 0,\n outputTokens: 0,\n cachedReadTokens: 0,\n cachedWriteTokens: 0,\n },\n effort,\n configOptions: [],\n promptRunning: false,\n pendingMessages: new Map(),\n nextPendingOrder: 0,\n\n // Custom properties\n cwd,\n notificationHistory: [],\n taskRunId: meta?.taskRunId,\n };\n this.session = session;\n this.sessionId = sessionId;\n\n this.logger.info(\n isResume\n ? \"Session query initialized, awaiting resumption\"\n : \"Session query initialized, awaiting initialization\",\n { sessionId, taskId, taskRunId: meta?.taskRunId },\n );\n\n try {\n const result = await withTimeout(\n q.initializationResult(),\n SESSION_VALIDATION_TIMEOUT_MS,\n );\n if (result.result === \"timeout\") {\n throw new Error(\n `Session ${isResume ? (forkSession ? \"fork\" : \"resumption\") : \"initialization\"} timed out for sessionId=${sessionId}`,\n );\n }\n } catch (err) {\n settingsManager.dispose();\n if (\n isResume &&\n err instanceof Error &&\n err.message === \"Query closed before response received\"\n ) {\n throw RequestError.resourceNotFound(sessionId);\n }\n this.logger.error(\n isResume\n ? forkSession\n ? \"Session fork failed\"\n : \"Session resumption failed\"\n : \"Session initialization failed\",\n {\n sessionId,\n taskId,\n taskRunId: meta?.taskRunId,\n error: err instanceof Error ? err.message : String(err),\n },\n );\n throw err;\n }\n\n if (meta?.taskRunId) {\n await this.client.extNotification(\"_posthog/sdk_session\", {\n taskRunId: meta.taskRunId,\n sessionId,\n adapter: \"claude\",\n });\n }\n\n // Resolve model: settings model takes priority, then gateway\n const settingsModel = settingsManager.getSettings().model;\n const modelOptions = await this.getModelConfigOptions();\n const resolvedModelId = settingsModel || modelOptions.currentModelId;\n session.modelId = resolvedModelId;\n session.lastContextWindowSize =\n this.getContextWindowForModel(resolvedModelId);\n\n const resolvedSdkModel = toSdkModelId(resolvedModelId);\n if (!isResume && resolvedSdkModel !== DEFAULT_MODEL) {\n await this.session.query.setModel(resolvedSdkModel);\n }\n\n if (supports1MContext(resolvedModelId)) {\n options.betas = [\"context-1m-2025-08-07\"];\n }\n\n const availableModes = getAvailableModes();\n const modes: SessionModeState = {\n currentModeId: permissionMode,\n availableModes: availableModes.map((mode) => ({\n id: mode.id,\n name: mode.name,\n description: mode.description ?? undefined,\n })),\n };\n\n const models: SessionModelState = {\n currentModelId: resolvedModelId,\n availableModels: modelOptions.options.map(\n (opt): AcpModelInfo => ({\n modelId: opt.value,\n name: opt.name,\n description: opt.description,\n }),\n ),\n };\n\n const configOptions = this.buildConfigOptions(\n permissionMode,\n modelOptions,\n effort ?? \"high\",\n );\n session.configOptions = configOptions;\n\n if (!creationOpts.skipBackgroundFetches) {\n this.deferBackgroundFetches(q);\n }\n\n this.logger.info(\n isResume\n ? \"Session resumed successfully\"\n : \"Session created successfully\",\n {\n sessionId,\n taskId,\n taskRunId: meta?.taskRunId,\n },\n );\n\n return { sessionId, modes, models, configOptions };\n }\n\n private createCanUseTool(\n sessionId: string,\n allowedDomains?: string[],\n ): CanUseTool {\n return async (toolName, toolInput, { suggestions, toolUseID, signal }) =>\n canUseTool({\n session: this.session,\n toolName,\n toolInput: toolInput as Record<string, unknown>,\n toolUseID,\n suggestions,\n signal,\n client: this.client,\n sessionId,\n fileContentCache: this.fileContentCache,\n logger: this.logger,\n updateConfigOption: (configId: string, value: string) =>\n this.updateConfigOption(configId, value),\n allowedDomains,\n });\n }\n\n private createOnModeChange() {\n return async (newMode: CodeExecutionMode) => {\n if (this.session) {\n this.session.permissionMode = newMode;\n }\n await this.updateConfigOption(\"mode\", newMode);\n };\n }\n\n private getExistingSessionState(\n sessionId: string,\n ): NewSessionResponse | null {\n if (this.sessionId !== sessionId || !this.session) return null;\n\n const availableModes = getAvailableModes();\n const modes: SessionModeState = {\n currentModeId: this.session.permissionMode,\n availableModes: availableModes.map((mode) => ({\n id: mode.id,\n name: mode.name,\n description: mode.description ?? undefined,\n })),\n };\n\n const modelOptions = this.session.configOptions.find(\n (o) => o.id === \"model\",\n );\n const models: SessionModelState = {\n currentModelId: this.session.modelId ?? DEFAULT_MODEL,\n availableModels:\n modelOptions && \"options\" in modelOptions\n ? (\n modelOptions.options as Array<{\n value: string;\n name: string;\n description?: string;\n }>\n ).map((opt) => ({\n modelId: opt.value,\n name: opt.name,\n description: opt.description,\n }))\n : [],\n };\n\n return {\n sessionId,\n modes,\n models,\n configOptions: this.session.configOptions,\n };\n }\n\n private buildConfigOptions(\n currentModeId: string,\n modelOptions: {\n currentModelId: string;\n options: SessionConfigSelectOption[];\n },\n currentEffort: EffortLevel = \"high\",\n ): SessionConfigOption[] {\n const modeOptions = getAvailableModes().map((mode) => ({\n value: mode.id,\n name: mode.name,\n description: mode.description ?? undefined,\n }));\n\n const configOptions: SessionConfigOption[] = [\n {\n id: \"mode\",\n name: \"Approval Preset\",\n type: \"select\",\n currentValue: currentModeId,\n options: modeOptions,\n category: \"mode\" as SessionConfigOptionCategory,\n description:\n \"Choose an approval and sandboxing preset for your session\",\n },\n {\n id: \"model\",\n name: \"Model\",\n type: \"select\",\n currentValue: modelOptions.currentModelId,\n options: modelOptions.options,\n category: \"model\" as SessionConfigOptionCategory,\n description: \"Choose which model Claude should use\",\n },\n ];\n\n const effortOptions = getEffortOptions(modelOptions.currentModelId);\n if (effortOptions) {\n configOptions.push({\n id: \"effort\",\n name: \"Effort\",\n type: \"select\",\n currentValue: currentEffort,\n options: effortOptions,\n category: \"thought_level\" as SessionConfigOptionCategory,\n description: \"Controls how much effort Claude puts into its response\",\n });\n }\n\n return configOptions;\n }\n\n private rebuildEffortConfigOption(modelId: string): void {\n const effortOptions = getEffortOptions(modelId);\n const existingEffort = this.session.configOptions.find(\n (o) => o.id === \"effort\",\n );\n\n if (!effortOptions) {\n this.session.configOptions = this.session.configOptions.filter(\n (o) => o.id !== \"effort\",\n );\n if (this.session.effort) {\n this.session.effort = undefined;\n this.session.queryOptions.effort = undefined;\n }\n return;\n }\n\n const rawCurrentValue = existingEffort?.currentValue;\n const currentValue =\n typeof rawCurrentValue === \"string\" ? rawCurrentValue : \"high\";\n const isValidValue = effortOptions.some((o) => o.value === currentValue);\n const resolvedValue = isValidValue ? currentValue : \"high\";\n\n if (resolvedValue !== currentValue && this.session.effort) {\n this.session.effort = resolvedValue as EffortLevel;\n this.session.queryOptions.effort = resolvedValue as EffortLevel;\n }\n\n const effortConfig: SessionConfigOption = {\n id: \"effort\",\n name: \"Effort\",\n type: \"select\",\n currentValue: resolvedValue,\n options: effortOptions,\n category: \"thought_level\" as SessionConfigOptionCategory,\n description: \"Controls how much effort Claude puts into its response\",\n };\n\n if (existingEffort) {\n this.session.configOptions = this.session.configOptions.map((o) =>\n o.id === \"effort\" ? effortConfig : o,\n );\n } else {\n this.session.configOptions.push(effortConfig);\n }\n }\n\n private async sendAvailableCommandsUpdate(): Promise<void> {\n const commands = await this.session.query.supportedCommands();\n await this.client.sessionUpdate({\n sessionId: this.sessionId,\n update: {\n sessionUpdate: \"available_commands_update\",\n availableCommands: getAvailableSlashCommands(commands),\n },\n });\n }\n\n private async replaySessionHistory(sessionId: string): Promise<void> {\n try {\n const messages = await getSessionMessages(sessionId, {\n dir: this.session.cwd,\n });\n\n const replayContext = {\n session: this.session,\n sessionId,\n client: this.client,\n toolUseCache: this.toolUseCache,\n fileContentCache: this.fileContentCache,\n logger: this.logger,\n registerHooks: false,\n };\n\n for (const msg of messages) {\n const sdkMessage = {\n type: msg.type,\n message: msg.message as {\n content: string | Array<{ type: string; text?: string }>;\n role: typeof msg.type;\n },\n parent_tool_use_id: msg.parent_tool_use_id,\n };\n await handleUserAssistantMessage(\n sdkMessage as Parameters<typeof handleUserAssistantMessage>[0],\n replayContext,\n );\n }\n } catch (err) {\n this.logger.warn(\"Failed to replay session history\", {\n sessionId,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n // ================================\n // EXTENSION METHODS\n // ================================\n\n /**\n * Fire-and-forget: fetch slash commands and MCP tool metadata in parallel.\n * Both populate caches used later — neither is needed to return configOptions.\n */\n private deferBackgroundFetches(q: Query): void {\n this.logger.info(\"Starting background fetches (commands + MCP metadata)\");\n Promise.all([\n new Promise<void>((resolve) => setTimeout(resolve, 10)).then(() =>\n this.sendAvailableCommandsUpdate(),\n ),\n fetchMcpToolMetadata(q, this.logger).then(() => {\n const serverNames = getConnectedMcpServerNames();\n if (serverNames.length > 0) {\n this.options?.onMcpServersReady?.(serverNames);\n }\n }),\n ]).catch((err) =>\n this.logger.error(\"Background fetch failed\", { error: err }),\n );\n }\n\n private async broadcastUserMessage(params: PromptRequest): Promise<void> {\n for (const chunk of params.prompt) {\n const notification = {\n sessionId: params.sessionId,\n update: {\n sessionUpdate: \"user_message_chunk\" as const,\n content: chunk,\n },\n };\n await this.client.sessionUpdate(notification);\n this.appendNotification(params.sessionId, notification);\n }\n }\n}\n","{\n \"name\": \"@posthog/agent\",\n \"version\": \"2.3.92\",\n \"repository\": \"https://github.com/PostHog/code\",\n \"description\": \"TypeScript agent framework wrapping Claude Agent SDK with Git-based task execution for PostHog\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n },\n \"./agent\": {\n \"types\": \"./dist/agent.d.ts\",\n \"import\": \"./dist/agent.js\"\n },\n \"./gateway-models\": {\n \"types\": \"./dist/gateway-models.d.ts\",\n \"import\": \"./dist/gateway-models.js\"\n },\n \"./posthog-api\": {\n \"types\": \"./dist/posthog-api.d.ts\",\n \"import\": \"./dist/posthog-api.js\"\n },\n \"./types\": {\n \"types\": \"./dist/types.d.ts\",\n \"import\": \"./dist/types.js\"\n },\n \"./adapters/claude/questions/utils\": {\n \"types\": \"./dist/adapters/claude/questions/utils.d.ts\",\n \"import\": \"./dist/adapters/claude/questions/utils.js\"\n },\n \"./adapters/claude/permissions/permission-options\": {\n \"types\": \"./dist/adapters/claude/permissions/permission-options.d.ts\",\n \"import\": \"./dist/adapters/claude/permissions/permission-options.js\"\n },\n \"./adapters/claude/tools\": {\n \"types\": \"./dist/adapters/claude/tools.d.ts\",\n \"import\": \"./dist/adapters/claude/tools.js\"\n },\n \"./adapters/claude/conversion/tool-use-to-acp\": {\n \"types\": \"./dist/adapters/claude/conversion/tool-use-to-acp.d.ts\",\n \"import\": \"./dist/adapters/claude/conversion/tool-use-to-acp.js\"\n },\n \"./adapters/claude/session/jsonl-hydration\": {\n \"types\": \"./dist/adapters/claude/session/jsonl-hydration.d.ts\",\n \"import\": \"./dist/adapters/claude/session/jsonl-hydration.js\"\n },\n \"./server\": {\n \"types\": \"./dist/server/agent-server.d.ts\",\n \"import\": \"./dist/server/agent-server.js\"\n }\n },\n \"bin\": {\n \"agent-server\": \"./dist/server/bin.cjs\"\n },\n \"type\": \"module\",\n \"keywords\": [\n \"posthog\",\n \"claude\",\n \"agent\",\n \"ai\",\n \"git\",\n \"typescript\"\n ],\n \"author\": \"PostHog\",\n \"license\": \"SEE LICENSE IN LICENSE\",\n \"scripts\": {\n \"build\": \"node ../../scripts/rimraf.mjs dist && tsup\",\n \"dev\": \"tsup --watch\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"typecheck\": \"pnpm exec tsc --noEmit\",\n \"prepublishOnly\": \"pnpm run build\",\n \"clean\": \"node ../../scripts/rimraf.mjs dist .turbo\"\n },\n \"engines\": {\n \"node\": \">=20.0.0\"\n },\n \"devDependencies\": {\n \"@posthog/shared\": \"workspace:*\",\n \"@posthog/git\": \"workspace:*\",\n \"@types/bun\": \"latest\",\n \"@types/tar\": \"^6.1.13\",\n \"msw\": \"^2.12.7\",\n \"tsup\": \"^8.5.1\",\n \"tsx\": \"^4.20.6\",\n \"typescript\": \"^5.5.0\",\n \"vitest\": \"^2.1.8\"\n },\n \"dependencies\": {\n \"@agentclientprotocol/sdk\": \"0.16.1\",\n \"@anthropic-ai/claude-agent-sdk\": \"0.2.76\",\n \"@anthropic-ai/sdk\": \"^0.78.0\",\n \"@hono/node-server\": \"^1.19.9\",\n \"@opentelemetry/api-logs\": \"^0.208.0\",\n \"@opentelemetry/exporter-logs-otlp-http\": \"^0.208.0\",\n \"@opentelemetry/resources\": \"^2.0.0\",\n \"@opentelemetry/sdk-logs\": \"^0.208.0\",\n \"@opentelemetry/semantic-conventions\": \"^1.28.0\",\n \"@types/jsonwebtoken\": \"^9.0.10\",\n \"commander\": \"^14.0.2\",\n \"hono\": \"^4.11.7\",\n \"jsonwebtoken\": \"^9.0.2\",\n \"minimatch\": \"^10.0.3\",\n \"tar\": \"^7.5.0\",\n \"uuid\": \"13.0.0\",\n \"yoga-wasm-web\": \"^0.3.3\",\n \"zod\": \"^3.24.1\"\n },\n \"files\": [\n \"dist/**/*\",\n \"src/**/*\",\n \"README.md\",\n \"CLAUDE.md\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","import type { Logger } from \"./logger\";\n\n/**\n * Races an operation against a timeout.\n * Returns success with the value if the operation completes in time,\n * or timeout if the operation takes longer than the specified duration.\n */\nexport async function withTimeout<T>(\n operation: Promise<T>,\n timeoutMs: number,\n): Promise<{ result: \"success\"; value: T } | { result: \"timeout\" }> {\n const timeoutPromise = new Promise<{ result: \"timeout\" }>((resolve) =>\n setTimeout(() => resolve({ result: \"timeout\" }), timeoutMs),\n );\n const operationPromise = operation.then((value) => ({\n result: \"success\" as const,\n value,\n }));\n return Promise.race([operationPromise, timeoutPromise]);\n}\n\nexport const IS_ROOT =\n typeof process !== \"undefined\" &&\n (process.geteuid?.() ?? process.getuid?.()) === 0;\n\nexport function unreachable(value: never, logger: Logger): void {\n let valueAsString: string;\n try {\n valueAsString = JSON.stringify(value);\n } catch {\n valueAsString = String(value);\n }\n logger.error(`Unexpected case: ${valueAsString}`);\n}\n","import type {\n Agent,\n AgentSideConnection,\n AuthenticateRequest,\n CancelNotification,\n InitializeRequest,\n InitializeResponse,\n NewSessionRequest,\n NewSessionResponse,\n PromptRequest,\n PromptResponse,\n ReadTextFileRequest,\n ReadTextFileResponse,\n SessionConfigSelectOption,\n SessionNotification,\n WriteTextFileRequest,\n WriteTextFileResponse,\n} from \"@agentclientprotocol/sdk\";\nimport {\n DEFAULT_GATEWAY_MODEL,\n fetchGatewayModels,\n formatGatewayModelName,\n type GatewayModel,\n isAnthropicModel,\n} from \"../gateway-models\";\nimport { Logger } from \"../utils/logger\";\nimport type { SettingsManager } from \"./claude/session/settings\";\n\nexport interface BaseSession {\n notificationHistory: SessionNotification[];\n cancelled: boolean;\n interruptReason?: string;\n abortController: AbortController;\n settingsManager: SettingsManager;\n}\n\nconst DEFAULT_CONTEXT_WINDOW = 200_000;\n\nexport abstract class BaseAcpAgent implements Agent {\n abstract readonly adapterName: string;\n protected session!: BaseSession;\n protected sessionId!: string;\n client: AgentSideConnection;\n logger: Logger;\n fileContentCache: { [key: string]: string } = {};\n protected gatewayModels: GatewayModel[] = [];\n\n constructor(client: AgentSideConnection) {\n this.client = client;\n this.logger = new Logger({ debug: true, prefix: \"[BaseAcpAgent]\" });\n }\n\n abstract initialize(request: InitializeRequest): Promise<InitializeResponse>;\n abstract newSession(params: NewSessionRequest): Promise<NewSessionResponse>;\n abstract prompt(params: PromptRequest): Promise<PromptResponse>;\n protected abstract interrupt(): Promise<void>;\n\n async cancel(params: CancelNotification): Promise<void> {\n if (this.sessionId !== params.sessionId) {\n throw new Error(\"Session ID mismatch\");\n }\n this.session.cancelled = true;\n const meta = params._meta as { interruptReason?: string } | undefined;\n if (meta?.interruptReason) {\n this.session.interruptReason = meta.interruptReason;\n }\n await this.interrupt();\n }\n\n async closeSession(): Promise<void> {\n try {\n // Abort first so in-flight HTTP requests are cancelled,\n // otherwise interrupt() deadlocks waiting for the query to stop\n // while the query waits on an API call that will never abort.\n this.session.abortController.abort();\n await this.cancel({ sessionId: this.sessionId });\n this.session.settingsManager.dispose();\n this.logger.info(\"Closed session\", { sessionId: this.sessionId });\n } catch (err) {\n this.logger.warn(\"Failed to close session\", {\n sessionId: this.sessionId,\n error: err,\n });\n }\n }\n\n hasSession(sessionId: string): boolean {\n return this.sessionId === sessionId;\n }\n\n appendNotification(\n sessionId: string,\n notification: SessionNotification,\n ): void {\n if (this.sessionId === sessionId) {\n this.session.notificationHistory.push(notification);\n }\n }\n\n async readTextFile(\n params: ReadTextFileRequest,\n ): Promise<ReadTextFileResponse> {\n const response = await this.client.readTextFile(params);\n if (!params.limit && !params.line) {\n this.fileContentCache[params.path] = response.content;\n }\n return response;\n }\n\n async writeTextFile(\n params: WriteTextFileRequest,\n ): Promise<WriteTextFileResponse> {\n const response = await this.client.writeTextFile(params);\n this.fileContentCache[params.path] = params.content;\n return response;\n }\n\n async authenticate(_params: AuthenticateRequest): Promise<void> {\n throw new Error(\"Method not implemented.\");\n }\n\n async getModelConfigOptions(currentModelOverride?: string): Promise<{\n currentModelId: string;\n options: SessionConfigSelectOption[];\n }> {\n this.gatewayModels = await fetchGatewayModels();\n\n const options = this.gatewayModels\n .filter((model) => isAnthropicModel(model))\n .map((model) => ({\n value: model.id,\n name: formatGatewayModelName(model),\n description: `Context: ${model.context_window.toLocaleString()} tokens`,\n }));\n\n const isAnthropicModelId = (modelId: string): boolean =>\n modelId.startsWith(\"claude-\") || modelId.startsWith(\"anthropic/\");\n\n let currentModelId = currentModelOverride ?? DEFAULT_GATEWAY_MODEL;\n\n if (!options.some((opt) => opt.value === currentModelId)) {\n if (!isAnthropicModelId(currentModelId)) {\n currentModelId = DEFAULT_GATEWAY_MODEL;\n }\n }\n\n if (!options.some((opt) => opt.value === currentModelId)) {\n options.unshift({\n value: currentModelId,\n name: currentModelId,\n description: \"Custom model\",\n });\n }\n\n return { currentModelId, options };\n }\n\n getContextWindowForModel(modelId: string): number {\n const match = this.gatewayModels.find((m) => m.id === modelId);\n return match?.context_window ?? DEFAULT_CONTEXT_WINDOW;\n }\n}\n","import * as path from \"node:path\";\nimport type { PromptRequest } from \"@agentclientprotocol/sdk\";\nimport type { SDKUserMessage } from \"@anthropic-ai/claude-agent-sdk\";\nimport type { ContentBlockParam } from \"@anthropic-ai/sdk/resources\";\n\ntype ImageMimeType = \"image/jpeg\" | \"image/png\" | \"image/gif\" | \"image/webp\";\n\nfunction sdkText(value: string): ContentBlockParam {\n return { type: \"text\", text: value };\n}\n\nfunction formatUriAsLink(uri: string): string {\n try {\n if (uri.startsWith(\"file://\")) {\n const filePath = uri.slice(7);\n const name = path.basename(filePath) || filePath;\n return `[@${name}](${uri})`;\n }\n if (uri.startsWith(\"zed://\")) {\n const name = path.basename(uri) || uri;\n return `[@${name}](${uri})`;\n }\n return uri;\n } catch {\n return uri;\n }\n}\n\nfunction transformMcpCommand(text: string): string {\n const mcpMatch = text.match(/^\\/mcp:([^:\\s]+):(\\S+)(\\s+.*)?$/);\n if (mcpMatch) {\n const [, server, command, args] = mcpMatch;\n return `/${server}:${command} (MCP)${args || \"\"}`;\n }\n return text;\n}\n\nfunction processPromptChunk(\n chunk: PromptRequest[\"prompt\"][number],\n content: ContentBlockParam[],\n context: ContentBlockParam[],\n): void {\n switch (chunk.type) {\n case \"text\":\n content.push(sdkText(transformMcpCommand(chunk.text)));\n break;\n\n case \"resource_link\":\n content.push(sdkText(formatUriAsLink(chunk.uri)));\n break;\n\n case \"resource\":\n if (\"text\" in chunk.resource) {\n content.push(sdkText(formatUriAsLink(chunk.resource.uri)));\n context.push(\n sdkText(\n `\\n<context ref=\"${chunk.resource.uri}\">\\n${chunk.resource.text}\\n</context>`,\n ),\n );\n }\n break;\n\n case \"image\":\n if (chunk.data) {\n content.push({\n type: \"image\",\n source: {\n type: \"base64\",\n data: chunk.data,\n media_type: chunk.mimeType as ImageMimeType,\n },\n });\n } else if (chunk.uri?.startsWith(\"http\")) {\n content.push({\n type: \"image\",\n source: { type: \"url\", url: chunk.uri },\n });\n }\n break;\n\n default:\n break;\n }\n}\n\nexport function promptToClaude(prompt: PromptRequest): SDKUserMessage {\n const content: ContentBlockParam[] = [];\n const context: ContentBlockParam[] = [];\n\n const prContext = (prompt._meta as Record<string, unknown> | undefined)\n ?.prContext;\n if (typeof prContext === \"string\") {\n content.push(sdkText(prContext));\n }\n\n for (const chunk of prompt.prompt) {\n processPromptChunk(chunk, content, context);\n }\n\n content.push(...context);\n\n return {\n type: \"user\",\n message: { role: \"user\", content },\n session_id: prompt.sessionId,\n parent_tool_use_id: null,\n };\n}\n","import type {\n AgentSideConnection,\n Role,\n SessionNotification,\n SessionUpdate,\n} from \"@agentclientprotocol/sdk\";\nimport { RequestError, type StopReason } from \"@agentclientprotocol/sdk\";\nimport type {\n SDKAssistantMessage,\n SDKMessage,\n SDKPartialAssistantMessage,\n SDKResultMessage,\n SDKUserMessage,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport type { ContentBlockParam } from \"@anthropic-ai/sdk/resources\";\nimport type {\n BetaContentBlock,\n BetaRawContentBlockDelta,\n} from \"@anthropic-ai/sdk/resources/beta.mjs\";\nimport { image, text } from \"../../../utils/acp-content\";\nimport { unreachable } from \"../../../utils/common\";\nimport type { Logger } from \"../../../utils/logger\";\nimport { registerHookCallback } from \"../hooks\";\nimport type { Session, ToolUpdateMeta, ToolUseCache } from \"../types\";\nimport {\n type ClaudePlanEntry,\n planEntries,\n toolInfoFromToolUse,\n toolUpdateFromEditToolResponse,\n toolUpdateFromToolResult,\n} from \"./tool-use-to-acp\";\n\ntype AnthropicContentChunk =\n | ContentBlockParam\n | BetaContentBlock\n | BetaRawContentBlockDelta;\n\ntype AnthropicMessageContent = string | Array<{ type: string; text?: string }>;\n\ninterface AnthropicMessageWithContent {\n type: Role;\n message: {\n content: AnthropicMessageContent;\n role?: Role;\n model?: string;\n };\n}\n\ntype ChunkHandlerContext = {\n sessionId: string;\n toolUseCache: ToolUseCache;\n fileContentCache: { [key: string]: string };\n client: AgentSideConnection;\n logger: Logger;\n parentToolCallId?: string;\n registerHooks?: boolean;\n supportsTerminalOutput?: boolean;\n cwd?: string;\n /** Raw MCP tool result from SDKUserMessage.tool_use_result (contains content, structuredContent, _meta) */\n mcpToolUseResult?: Record<string, unknown>;\n};\n\nexport interface MessageHandlerContext {\n session: Session;\n sessionId: string;\n client: AgentSideConnection;\n toolUseCache: ToolUseCache;\n fileContentCache: { [key: string]: string };\n logger: Logger;\n registerHooks?: boolean;\n supportsTerminalOutput?: boolean;\n}\n\nfunction messageUpdateType(role: Role) {\n return role === \"assistant\" ? \"agent_message_chunk\" : \"user_message_chunk\";\n}\n\nfunction toolMeta(\n toolName: string,\n toolResponse?: unknown,\n parentToolCallId?: string,\n): ToolUpdateMeta {\n const meta: ToolUpdateMeta[\"claudeCode\"] = { toolName };\n if (toolResponse !== undefined) meta.toolResponse = toolResponse;\n if (parentToolCallId) meta.parentToolCallId = parentToolCallId;\n return { claudeCode: meta };\n}\n\nfunction handleTextChunk(\n chunk: { text: string },\n role: Role,\n parentToolCallId?: string,\n): SessionUpdate {\n const update: SessionUpdate = {\n sessionUpdate: messageUpdateType(role),\n content: text(chunk.text),\n };\n if (parentToolCallId) {\n (update as Record<string, unknown>)._meta = toolMeta(\n \"__text__\",\n undefined,\n parentToolCallId,\n );\n }\n return update;\n}\n\nfunction handleImageChunk(\n chunk: {\n source: { type: string; data?: string; media_type?: string; url?: string };\n },\n role: Role,\n): SessionUpdate {\n return {\n sessionUpdate: messageUpdateType(role),\n content: image(\n chunk.source.type === \"base64\" ? (chunk.source.data ?? \"\") : \"\",\n chunk.source.type === \"base64\" ? (chunk.source.media_type ?? \"\") : \"\",\n chunk.source.type === \"url\" ? chunk.source.url : undefined,\n ),\n };\n}\n\nfunction handleThinkingChunk(\n chunk: { thinking: string },\n parentToolCallId?: string,\n): SessionUpdate {\n const update: SessionUpdate = {\n sessionUpdate: \"agent_thought_chunk\",\n content: text(chunk.thinking),\n };\n if (parentToolCallId) {\n (update as Record<string, unknown>)._meta = toolMeta(\n \"__thinking__\",\n undefined,\n parentToolCallId,\n );\n }\n return update;\n}\n\nfunction handleToolUseChunk(\n chunk: ToolUseCache[string],\n ctx: ChunkHandlerContext,\n): SessionUpdate | null {\n const alreadyCached = chunk.id in ctx.toolUseCache;\n ctx.toolUseCache[chunk.id] = chunk;\n\n if (chunk.name === \"TodoWrite\") {\n const input = chunk.input as { todos?: unknown[] };\n if (Array.isArray(input.todos)) {\n return {\n sessionUpdate: \"plan\",\n entries: planEntries(chunk.input as { todos: ClaudePlanEntry[] }),\n };\n }\n return null;\n }\n\n if (!alreadyCached && ctx.registerHooks !== false) {\n registerHookCallback(chunk.id, {\n onPostToolUseHook: async (toolUseId, _toolInput, toolResponse) => {\n const toolUse = ctx.toolUseCache[toolUseId];\n if (toolUse) {\n const editUpdate =\n toolUse.name === \"Edit\"\n ? toolUpdateFromEditToolResponse(toolResponse)\n : null;\n\n await ctx.client.sessionUpdate({\n sessionId: ctx.sessionId,\n update: {\n _meta: toolMeta(toolUse.name, toolResponse, ctx.parentToolCallId),\n toolCallId: toolUseId,\n sessionUpdate: \"tool_call_update\",\n ...(editUpdate ? editUpdate : {}),\n },\n });\n } else {\n ctx.logger.error(\n `Got a tool response for tool use that wasn't tracked: ${toolUseId}`,\n );\n }\n },\n });\n }\n\n let rawInput: Record<string, unknown> | undefined;\n try {\n rawInput = JSON.parse(JSON.stringify(chunk.input));\n } catch {\n // ignore\n }\n\n const toolInfo = toolInfoFromToolUse(chunk, {\n supportsTerminalOutput: ctx.supportsTerminalOutput,\n toolUseId: chunk.id,\n cachedFileContent: ctx.fileContentCache,\n cwd: ctx.cwd,\n });\n\n const meta: Record<string, unknown> = {\n ...toolMeta(chunk.name, undefined, ctx.parentToolCallId),\n };\n if (chunk.name === \"Bash\" && ctx.supportsTerminalOutput && !alreadyCached) {\n meta.terminal_info = { terminal_id: chunk.id };\n }\n\n if (alreadyCached) {\n return {\n _meta: meta,\n toolCallId: chunk.id,\n sessionUpdate: \"tool_call_update\" as const,\n rawInput,\n ...toolInfo,\n };\n }\n\n return {\n _meta: meta,\n toolCallId: chunk.id,\n sessionUpdate: \"tool_call\" as const,\n rawInput,\n status: \"pending\",\n ...toolInfo,\n };\n}\n\nfunction extractTextFromContent(content: unknown): string | null {\n if (Array.isArray(content)) {\n const parts: string[] = [];\n for (const item of content) {\n if (\n typeof item === \"object\" &&\n item !== null &&\n \"text\" in item &&\n typeof (item as Record<string, unknown>).text === \"string\"\n ) {\n parts.push((item as { text: string }).text);\n }\n }\n return parts.length > 0 ? parts.join(\"\") : null;\n }\n if (typeof content === \"string\") {\n return content;\n }\n return null;\n}\n\nfunction stripCatLineNumbers(text: string): string {\n return text.replace(/^ *\\d+[\\t→]/gm, \"\");\n}\n\nfunction updateFileContentCache(\n toolUse: { name: string; input: unknown },\n chunk: { content?: unknown },\n ctx: ChunkHandlerContext,\n): void {\n const input = toolUse.input as Record<string, unknown> | undefined;\n const filePath = input?.file_path ? String(input.file_path) : undefined;\n if (!filePath) return;\n\n if (toolUse.name === \"Read\" && !input?.limit && !input?.offset) {\n const fileText = extractTextFromContent(chunk.content);\n if (fileText !== null) {\n ctx.fileContentCache[filePath] = stripCatLineNumbers(fileText);\n }\n } else if (toolUse.name === \"Write\") {\n const content = input?.content;\n if (typeof content === \"string\") {\n ctx.fileContentCache[filePath] = content;\n }\n } else if (toolUse.name === \"Edit\") {\n const oldString = input?.old_string;\n const newString = input?.new_string;\n if (\n typeof oldString === \"string\" &&\n typeof newString === \"string\" &&\n filePath in ctx.fileContentCache\n ) {\n const current = ctx.fileContentCache[filePath];\n ctx.fileContentCache[filePath] = input?.replace_all\n ? current.replaceAll(oldString, newString)\n : current.replace(oldString, newString);\n }\n }\n}\n\nfunction handleToolResultChunk(\n chunk: AnthropicContentChunk & {\n tool_use_id: string;\n is_error?: boolean;\n content?: unknown;\n },\n ctx: ChunkHandlerContext,\n): SessionUpdate[] {\n const toolUse = ctx.toolUseCache[chunk.tool_use_id];\n if (!toolUse) {\n ctx.logger.error(\n `Got a tool result for tool use that wasn't tracked: ${chunk.tool_use_id}`,\n );\n return [];\n }\n\n if (toolUse.name === \"TodoWrite\") {\n return [];\n }\n\n if (!chunk.is_error) {\n updateFileContentCache(toolUse, chunk, ctx);\n }\n\n const { _meta: resultMeta, ...toolUpdate } = toolUpdateFromToolResult(\n chunk as Parameters<typeof toolUpdateFromToolResult>[0],\n toolUse,\n {\n supportsTerminalOutput: ctx.supportsTerminalOutput,\n toolUseId: chunk.tool_use_id,\n cachedFileContent: ctx.fileContentCache,\n },\n );\n\n const updates: SessionUpdate[] = [];\n\n if (resultMeta?.terminal_output) {\n const terminalOutputMeta: Record<string, unknown> = {\n terminal_output: resultMeta.terminal_output,\n };\n if (ctx.parentToolCallId) {\n terminalOutputMeta.claudeCode = {\n parentToolCallId: ctx.parentToolCallId,\n };\n }\n updates.push({\n _meta: terminalOutputMeta,\n toolCallId: chunk.tool_use_id,\n sessionUpdate: \"tool_call_update\" as const,\n });\n }\n\n const meta: Record<string, unknown> = {\n ...toolMeta(toolUse.name, undefined, ctx.parentToolCallId),\n ...(resultMeta?.terminal_exit\n ? { terminal_exit: resultMeta.terminal_exit }\n : {}),\n };\n\n updates.push({\n _meta: meta,\n toolCallId: chunk.tool_use_id,\n sessionUpdate: \"tool_call_update\",\n status: chunk.is_error ? \"failed\" : \"completed\",\n rawOutput: ctx.mcpToolUseResult\n ? { ...ctx.mcpToolUseResult, isError: chunk.is_error ?? false }\n : {\n content: Array.isArray(chunk.content)\n ? chunk.content\n : typeof chunk.content === \"string\"\n ? [{ type: \"text\" as const, text: chunk.content }]\n : [],\n isError: chunk.is_error ?? false,\n },\n ...toolUpdate,\n });\n\n return updates;\n}\n\nfunction processContentChunk(\n chunk: AnthropicContentChunk,\n role: Role,\n ctx: ChunkHandlerContext,\n): SessionUpdate[] {\n switch (chunk.type) {\n case \"text\":\n case \"text_delta\": {\n const update = handleTextChunk(chunk, role, ctx.parentToolCallId);\n return update ? [update] : [];\n }\n\n case \"image\": {\n const update = handleImageChunk(chunk, role);\n return update ? [update] : [];\n }\n\n case \"thinking\":\n case \"thinking_delta\": {\n const update = handleThinkingChunk(chunk, ctx.parentToolCallId);\n return update ? [update] : [];\n }\n\n case \"tool_use\":\n case \"server_tool_use\":\n case \"mcp_tool_use\": {\n const update = handleToolUseChunk(chunk as ToolUseCache[string], ctx);\n return update ? [update] : [];\n }\n\n case \"tool_result\":\n case \"tool_search_tool_result\":\n case \"web_fetch_tool_result\":\n case \"web_search_tool_result\":\n case \"code_execution_tool_result\":\n case \"bash_code_execution_tool_result\":\n case \"text_editor_code_execution_tool_result\":\n case \"mcp_tool_result\":\n return handleToolResultChunk(\n chunk as AnthropicContentChunk & {\n tool_use_id: string;\n is_error?: boolean;\n content?: unknown;\n },\n ctx,\n );\n\n case \"document\":\n case \"search_result\":\n case \"redacted_thinking\":\n case \"input_json_delta\":\n case \"citations_delta\":\n case \"signature_delta\":\n case \"container_upload\":\n case \"compaction\":\n case \"compaction_delta\":\n return [];\n\n default:\n unreachable(chunk as never, ctx.logger);\n return [];\n }\n}\n\nfunction toAcpNotifications(\n content:\n | string\n | ContentBlockParam[]\n | BetaContentBlock[]\n | BetaRawContentBlockDelta[],\n role: Role,\n sessionId: string,\n toolUseCache: ToolUseCache,\n fileContentCache: { [key: string]: string },\n client: AgentSideConnection,\n logger: Logger,\n parentToolCallId?: string,\n registerHooks?: boolean,\n supportsTerminalOutput?: boolean,\n cwd?: string,\n mcpToolUseResult?: Record<string, unknown>,\n): SessionNotification[] {\n if (typeof content === \"string\") {\n const update: SessionUpdate = {\n sessionUpdate: messageUpdateType(role),\n content: text(content),\n };\n if (parentToolCallId) {\n (update as Record<string, unknown>)._meta = toolMeta(\n \"__text__\",\n undefined,\n parentToolCallId,\n );\n }\n return [{ sessionId, update }];\n }\n\n const ctx: ChunkHandlerContext = {\n sessionId,\n toolUseCache,\n fileContentCache,\n client,\n logger,\n parentToolCallId,\n registerHooks,\n supportsTerminalOutput,\n cwd,\n mcpToolUseResult,\n };\n const output: SessionNotification[] = [];\n\n for (const chunk of content) {\n for (const update of processContentChunk(chunk, role, ctx)) {\n output.push({ sessionId, update });\n }\n }\n\n return output;\n}\n\nfunction streamEventToAcpNotifications(\n message: SDKPartialAssistantMessage,\n sessionId: string,\n toolUseCache: ToolUseCache,\n fileContentCache: { [key: string]: string },\n client: AgentSideConnection,\n logger: Logger,\n parentToolCallId?: string,\n registerHooks?: boolean,\n supportsTerminalOutput?: boolean,\n cwd?: string,\n): SessionNotification[] {\n const event = message.event;\n switch (event.type) {\n case \"content_block_start\":\n return toAcpNotifications(\n [event.content_block],\n \"assistant\",\n sessionId,\n toolUseCache,\n fileContentCache,\n client,\n logger,\n parentToolCallId,\n registerHooks,\n supportsTerminalOutput,\n cwd,\n );\n case \"content_block_delta\":\n return toAcpNotifications(\n [event.delta],\n \"assistant\",\n sessionId,\n toolUseCache,\n fileContentCache,\n client,\n logger,\n parentToolCallId,\n registerHooks,\n supportsTerminalOutput,\n cwd,\n );\n case \"message_start\":\n case \"message_delta\":\n case \"message_stop\":\n case \"content_block_stop\":\n return [];\n\n default:\n unreachable(event as never, logger);\n return [];\n }\n}\n\nexport async function handleSystemMessage(\n message: Extract<SDKMessage, { type: \"system\" }>,\n context: MessageHandlerContext,\n): Promise<void> {\n const { session, sessionId, client, logger } = context;\n\n switch (message.subtype) {\n case \"init\":\n break;\n case \"compact_boundary\":\n await client.extNotification(\"_posthog/compact_boundary\", {\n sessionId,\n trigger: message.compact_metadata.trigger,\n preTokens: message.compact_metadata.pre_tokens,\n contextSize: session.contextSize,\n });\n break;\n case \"hook_response\":\n logger.info(\"Hook response received\", {\n hookName: message.hook_name,\n hookEvent: message.hook_event,\n });\n break;\n case \"status\":\n if (message.status === \"compacting\") {\n logger.info(\"Session compacting started\", { sessionId });\n await client.extNotification(\"_posthog/status\", {\n sessionId,\n status: \"compacting\",\n });\n }\n break;\n case \"task_notification\": {\n logger.info(\"Task notification received\", {\n sessionId,\n taskId: message.task_id,\n status: message.status,\n summary: message.summary,\n });\n await client.extNotification(\"_posthog/task_notification\", {\n sessionId,\n taskId: message.task_id,\n status: message.status,\n summary: message.summary,\n outputFile: message.output_file,\n });\n break;\n }\n default:\n break;\n }\n}\n\nexport type ResultMessageHandlerResult = {\n shouldStop: boolean;\n stopReason?: StopReason;\n error?: Error;\n usage?: {\n inputTokens: number;\n outputTokens: number;\n cachedReadTokens: number;\n cachedWriteTokens: number;\n costUsd?: number;\n contextWindowSize?: number;\n };\n};\n\nexport function handleResultMessage(\n message: SDKResultMessage,\n): ResultMessageHandlerResult {\n const usage = extractUsageFromResult(message);\n\n switch (message.subtype) {\n case \"success\": {\n if (message.result.includes(\"Please run /login\")) {\n return {\n shouldStop: true,\n error: RequestError.authRequired(),\n usage,\n };\n }\n if ((message as Record<string, unknown>).stop_reason === \"max_tokens\") {\n return { shouldStop: true, stopReason: \"max_tokens\", usage };\n }\n if (message.is_error) {\n return {\n shouldStop: true,\n error: RequestError.internalError(undefined, message.result),\n usage,\n };\n }\n return { shouldStop: true, stopReason: \"end_turn\", usage };\n }\n case \"error_during_execution\":\n if ((message as Record<string, unknown>).stop_reason === \"max_tokens\") {\n return { shouldStop: true, stopReason: \"max_tokens\", usage };\n }\n if (message.is_error) {\n return {\n shouldStop: true,\n error: RequestError.internalError(\n undefined,\n message.errors.join(\", \") || message.subtype,\n ),\n usage,\n };\n }\n return { shouldStop: true, stopReason: \"end_turn\", usage };\n case \"error_max_budget_usd\":\n case \"error_max_turns\":\n case \"error_max_structured_output_retries\":\n if (message.is_error) {\n return {\n shouldStop: true,\n error: RequestError.internalError(\n undefined,\n message.errors.join(\", \") || message.subtype,\n ),\n usage,\n };\n }\n return { shouldStop: true, stopReason: \"max_turn_requests\", usage };\n default:\n return { shouldStop: false, usage };\n }\n}\n\nfunction extractUsageFromResult(\n message: SDKResultMessage,\n): ResultMessageHandlerResult[\"usage\"] {\n const msg = message as Record<string, unknown>;\n const msgUsage = msg.usage as Record<string, number> | undefined;\n if (!msgUsage) return undefined;\n\n const modelUsage = msg.modelUsage as\n | Record<string, { contextWindow: number }>\n | undefined;\n let contextWindowSize: number | undefined;\n if (modelUsage) {\n const contextWindows = Object.values(modelUsage).map(\n (m) => m.contextWindow,\n );\n if (contextWindows.length > 0) {\n contextWindowSize = Math.min(...contextWindows);\n }\n }\n\n return {\n inputTokens: msgUsage.input_tokens ?? 0,\n outputTokens: msgUsage.output_tokens ?? 0,\n cachedReadTokens: msgUsage.cache_read_input_tokens ?? 0,\n cachedWriteTokens: msgUsage.cache_creation_input_tokens ?? 0,\n costUsd:\n typeof msg.total_cost_usd === \"number\" ? msg.total_cost_usd : undefined,\n contextWindowSize,\n };\n}\n\nexport async function handleStreamEvent(\n message: SDKPartialAssistantMessage,\n context: MessageHandlerContext,\n): Promise<void> {\n const { sessionId, client, toolUseCache, fileContentCache, logger } = context;\n const parentToolCallId = message.parent_tool_use_id ?? undefined;\n\n for (const notification of streamEventToAcpNotifications(\n message,\n sessionId,\n toolUseCache,\n fileContentCache,\n client,\n logger,\n parentToolCallId,\n context.registerHooks,\n context.supportsTerminalOutput,\n context.session.cwd,\n )) {\n await client.sessionUpdate(notification);\n context.session.notificationHistory.push(notification);\n }\n}\n\nfunction hasLocalCommandStdout(content: AnthropicMessageContent): boolean {\n return (\n typeof content === \"string\" && content.includes(\"<local-command-stdout>\")\n );\n}\n\nfunction hasLocalCommandStderr(content: AnthropicMessageContent): boolean {\n return (\n typeof content === \"string\" && content.includes(\"<local-command-stderr>\")\n );\n}\n\nfunction isLoginRequiredMessage(message: AnthropicMessageWithContent): boolean {\n return (\n message.type === \"assistant\" &&\n message.message.model === \"<synthetic>\" &&\n Array.isArray(message.message.content) &&\n message.message.content.length === 1 &&\n message.message.content[0].type === \"text\" &&\n message.message.content[0].text?.includes(\"Please run /login\") === true\n );\n}\n\nfunction isPlainTextUserMessage(message: AnthropicMessageWithContent): boolean {\n const content = message.message.content;\n return (\n message.type === \"user\" &&\n (typeof content === \"string\" ||\n (Array.isArray(content) &&\n content.length === 1 &&\n content[0].type === \"text\"))\n );\n}\n\nfunction shouldSkipUserAssistantMessage(\n message: AnthropicMessageWithContent,\n): boolean {\n return (\n hasLocalCommandStdout(message.message.content) ||\n hasLocalCommandStderr(message.message.content) ||\n isLoginRequiredMessage(message)\n );\n}\n\nfunction logSpecialMessages(\n message: AnthropicMessageWithContent,\n logger: Logger,\n): void {\n const content = message.message.content;\n if (hasLocalCommandStdout(content) && typeof content === \"string\") {\n logger.info(content);\n }\n if (hasLocalCommandStderr(content) && typeof content === \"string\") {\n logger.error(content);\n }\n}\n\nfunction filterMessageContent(\n content: AnthropicMessageContent,\n): AnthropicMessageContent {\n if (!Array.isArray(content)) {\n return content;\n }\n return content.filter(\n (block) => block.type !== \"text\" && block.type !== \"thinking\",\n );\n}\n\nexport async function handleUserAssistantMessage(\n message: SDKUserMessage | SDKAssistantMessage,\n context: MessageHandlerContext,\n): Promise<{ shouldStop?: boolean; error?: Error }> {\n const { session, sessionId, client, toolUseCache, fileContentCache, logger } =\n context;\n\n if (shouldSkipUserAssistantMessage(message)) {\n logSpecialMessages(message, logger);\n\n if (isLoginRequiredMessage(message)) {\n return { shouldStop: true, error: RequestError.authRequired() };\n }\n return {};\n }\n\n // Skip plain text user messages (already displayed by the ACP client)\n if (isPlainTextUserMessage(message)) {\n return {};\n }\n\n const content = message.message.content;\n const contentToProcess =\n message.type === \"assistant\" ? filterMessageContent(content) : content;\n const parentToolCallId =\n \"parent_tool_use_id\" in message\n ? (message.parent_tool_use_id ?? undefined)\n : undefined;\n\n // Pass the raw MCP tool result (contains content, structuredContent, _meta)\n // so it can be forwarded as-is to the renderer for MCP Apps\n const mcpToolUseResult =\n message.type === \"user\" && message.tool_use_result != null\n ? (message.tool_use_result as Record<string, unknown>)\n : undefined;\n\n for (const notification of toAcpNotifications(\n contentToProcess as typeof content,\n message.message.role,\n sessionId,\n toolUseCache,\n fileContentCache,\n client,\n logger,\n parentToolCallId,\n context.registerHooks,\n context.supportsTerminalOutput,\n session.cwd,\n mcpToolUseResult,\n )) {\n await client.sessionUpdate(notification);\n session.notificationHistory.push(notification);\n }\n\n return {};\n}\n","import type { ContentBlock, ToolCallContent } from \"@agentclientprotocol/sdk\";\n\nexport function text(value: string): ContentBlock {\n return { type: \"text\", text: value };\n}\n\nexport function image(\n data: string,\n mimeType: string,\n uri?: string,\n): ContentBlock {\n return { type: \"image\", data, mimeType, uri };\n}\n\nexport function resourceLink(\n uri: string,\n name: string,\n options?: {\n mimeType?: string;\n title?: string;\n description?: string;\n size?: number | null;\n },\n): ContentBlock {\n return {\n type: \"resource_link\",\n uri,\n name,\n ...options,\n };\n}\n\nclass ToolContentBuilder {\n private items: ToolCallContent[] = [];\n\n text(value: string): this {\n this.items.push({ type: \"content\", content: text(value) });\n return this;\n }\n\n image(data: string, mimeType: string, uri?: string): this {\n this.items.push({ type: \"content\", content: image(data, mimeType, uri) });\n return this;\n }\n\n diff(path: string, oldText: string | null, newText: string): this {\n this.items.push({ type: \"diff\", path, oldText, newText });\n return this;\n }\n\n build(): ToolCallContent[] {\n return this.items;\n }\n}\n\nexport function toolContent(): ToolContentBuilder {\n return new ToolContentBuilder();\n}\n","import type { HookCallback, HookInput } from \"@anthropic-ai/claude-agent-sdk\";\nimport type { Logger } from \"../../utils/logger\";\nimport type { SettingsManager } from \"./session/settings\";\nimport type { CodeExecutionMode } from \"./tools\";\n\nconst toolUseCallbacks: {\n [toolUseId: string]: {\n onPostToolUseHook?: (\n toolUseID: string,\n toolInput: unknown,\n toolResponse: unknown,\n ) => Promise<void>;\n };\n} = {};\n\nexport const registerHookCallback = (\n toolUseID: string,\n {\n onPostToolUseHook,\n }: {\n onPostToolUseHook?: (\n toolUseID: string,\n toolInput: unknown,\n toolResponse: unknown,\n ) => Promise<void>;\n },\n) => {\n toolUseCallbacks[toolUseID] = {\n onPostToolUseHook,\n };\n};\n\nexport type OnModeChange = (mode: CodeExecutionMode) => Promise<void>;\n\ninterface CreatePostToolUseHookParams {\n onModeChange?: OnModeChange;\n logger?: Logger;\n}\n\nexport const createPostToolUseHook =\n ({ onModeChange, logger }: CreatePostToolUseHookParams): HookCallback =>\n async (\n input: HookInput,\n toolUseID: string | undefined,\n ): Promise<{ continue: boolean }> => {\n if (input.hook_event_name === \"PostToolUse\") {\n const toolName = input.tool_name;\n\n if (onModeChange && toolName === \"EnterPlanMode\") {\n await onModeChange(\"plan\");\n }\n\n if (toolUseID) {\n const onPostToolUseHook =\n toolUseCallbacks[toolUseID]?.onPostToolUseHook;\n if (onPostToolUseHook) {\n await onPostToolUseHook(\n toolUseID,\n input.tool_input,\n input.tool_response,\n );\n delete toolUseCallbacks[toolUseID];\n } else {\n logger?.error(\n `No onPostToolUseHook found for tool use ID: ${toolUseID}`,\n );\n delete toolUseCallbacks[toolUseID];\n }\n }\n }\n return { continue: true };\n };\n\nexport const createPreToolUseHook =\n (settingsManager: SettingsManager, logger: Logger): HookCallback =>\n async (input: HookInput, _toolUseID: string | undefined) => {\n if (input.hook_event_name !== \"PreToolUse\") {\n return { continue: true };\n }\n\n const toolName = input.tool_name;\n const toolInput = input.tool_input;\n const permissionCheck = settingsManager.checkPermission(\n toolName,\n toolInput,\n );\n\n if (permissionCheck.decision !== \"ask\") {\n logger.info(\n `[PreToolUseHook] Tool: ${toolName}, Decision: ${permissionCheck.decision}, Rule: ${permissionCheck.rule}`,\n );\n }\n\n switch (permissionCheck.decision) {\n case \"allow\":\n return {\n continue: true,\n hookSpecificOutput: {\n hookEventName: \"PreToolUse\" as const,\n permissionDecision: \"allow\" as const,\n permissionDecisionReason: `Allowed by settings rule: ${permissionCheck.rule}`,\n },\n };\n case \"deny\":\n return {\n continue: true,\n hookSpecificOutput: {\n hookEventName: \"PreToolUse\" as const,\n permissionDecision: \"deny\" as const,\n permissionDecisionReason: `Denied by settings rule: ${permissionCheck.rule}`,\n },\n };\n default:\n return { continue: true };\n }\n };\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type {\n PlanEntry,\n ToolCall,\n ToolCallContent,\n ToolCallLocation,\n ToolCallUpdate,\n ToolKind,\n} from \"@agentclientprotocol/sdk\";\nimport type {\n ToolResultBlockParam,\n ToolUseBlock,\n WebSearchToolResultBlockParam,\n} from \"@anthropic-ai/sdk/resources\";\nimport type {\n BetaBashCodeExecutionToolResultBlockParam,\n BetaCodeExecutionToolResultBlockParam,\n BetaRequestMCPToolResultBlockParam,\n BetaTextEditorCodeExecutionToolResultBlockParam,\n BetaToolSearchToolResultBlockParam,\n BetaWebFetchToolResultBlockParam,\n BetaWebSearchToolResultBlockParam,\n} from \"@anthropic-ai/sdk/resources/beta.mjs\";\n\nconst SYSTEM_REMINDER_REGEX =\n /\\s*<system-reminder>[\\s\\S]*?<\\/system-reminder>/g;\n\nfunction stripSystemReminders(value: string): string {\n return value.replace(SYSTEM_REMINDER_REGEX, \"\");\n}\n\nimport { resourceLink, text, toolContent } from \"../../../utils/acp-content\";\nimport { getMcpToolMetadata } from \"../mcp/tool-metadata\";\n\ntype ToolInfo = Pick<ToolCall, \"title\" | \"kind\" | \"content\" | \"locations\">;\n\n/**\n * Convert an absolute file path to a project-relative path for display.\n * Returns the original path if it's outside the project directory or if no cwd is provided.\n */\nexport function toDisplayPath(filePath: string, cwd?: string): string {\n if (!cwd) return filePath;\n const resolvedCwd = path.resolve(cwd);\n const resolvedFile = path.resolve(filePath);\n if (\n resolvedFile.startsWith(resolvedCwd + path.sep) ||\n resolvedFile === resolvedCwd\n ) {\n return path.relative(resolvedCwd, resolvedFile);\n }\n return filePath;\n}\n\nexport function toolInfoFromToolUse(\n toolUse: Pick<ToolUseBlock, \"name\" | \"input\">,\n options?: {\n supportsTerminalOutput?: boolean;\n toolUseId?: string;\n cachedFileContent?: Record<string, string>;\n cwd?: string;\n },\n): ToolInfo {\n const name = toolUse.name;\n const input = toolUse.input as Record<string, unknown> | undefined;\n\n switch (name) {\n case \"Task\":\n case \"Agent\":\n return {\n title: input?.description ? String(input.description) : name,\n kind: \"think\",\n content: input?.prompt\n ? toolContent().text(String(input.prompt)).build()\n : [],\n };\n\n case \"NotebookRead\":\n return {\n title: input?.notebook_path\n ? `Read Notebook ${String(input.notebook_path)}`\n : \"Read Notebook\",\n kind: \"read\",\n content: [],\n locations: input?.notebook_path\n ? [{ path: String(input.notebook_path) }]\n : [],\n };\n\n case \"NotebookEdit\":\n return {\n title: input?.notebook_path\n ? `Edit Notebook ${String(input.notebook_path)}`\n : \"Edit Notebook\",\n kind: \"edit\",\n content: input?.new_source\n ? toolContent().text(String(input.new_source)).build()\n : [],\n locations: input?.notebook_path\n ? [{ path: String(input.notebook_path) }]\n : [],\n };\n\n case \"Bash\":\n if (options?.supportsTerminalOutput && options?.toolUseId) {\n return {\n title: input?.description\n ? String(input.description)\n : \"Execute command\",\n kind: \"execute\",\n content: [{ type: \"terminal\", terminalId: options.toolUseId }],\n };\n }\n return {\n title: input?.description\n ? String(input.description)\n : \"Execute command\",\n kind: \"execute\",\n content: input?.command\n ? toolContent().text(String(input.command)).build()\n : [],\n };\n\n case \"BashOutput\":\n return {\n title: \"Tail Logs\",\n kind: \"execute\",\n content: [],\n };\n\n case \"KillShell\":\n return {\n title: \"Kill Process\",\n kind: \"execute\",\n content: [],\n };\n\n case \"Read\": {\n let limit = \"\";\n const inputLimit = input?.limit as number | undefined;\n const inputOffset = (input?.offset as number | undefined) ?? 1;\n if (inputLimit) {\n limit = ` (${inputOffset} - ${inputOffset + inputLimit - 1})`;\n } else if (inputOffset > 1) {\n limit = ` (from line ${inputOffset})`;\n }\n const displayPath = input?.file_path\n ? toDisplayPath(String(input.file_path), options?.cwd)\n : \"File\";\n return {\n title: `Read ${displayPath}${limit}`,\n kind: \"read\",\n locations: input?.file_path\n ? [\n {\n path: String(input.file_path),\n line: inputOffset,\n },\n ]\n : [],\n content: [],\n };\n }\n\n case \"LS\":\n return {\n title: `List the ${input?.path ? `\\`${String(input.path)}\\`` : \"current\"} directory's contents`,\n kind: \"search\",\n content: [],\n locations: [],\n };\n\n case \"Edit\": {\n const filePath = input?.file_path ? String(input.file_path) : undefined;\n const displayPath = filePath\n ? toDisplayPath(filePath, options?.cwd)\n : undefined;\n let oldText: string | null = input?.old_string\n ? String(input.old_string)\n : null;\n let newText: string = input?.new_string ? String(input.new_string) : \"\";\n\n // try to display a rich diff by first checking if file content is cached\n // and valid (old_text exists in the content), then fall back to reading\n // file from disk, then fall back to fragemented snippet diff\n if (filePath && oldText !== null) {\n const fileContent = resolveFileContent(\n filePath,\n oldText,\n options?.cachedFileContent,\n );\n if (fileContent) {\n const newContent = input?.replace_all\n ? fileContent.replaceAll(oldText, newText)\n : fileContent.replace(oldText, newText);\n oldText = fileContent;\n newText = newContent;\n }\n }\n\n return {\n title: displayPath ? `Edit \\`${displayPath}\\`` : \"Edit\",\n kind: \"edit\",\n content:\n input && filePath\n ? [\n {\n type: \"diff\",\n path: filePath,\n oldText,\n newText,\n },\n ]\n : [],\n locations: filePath ? [{ path: filePath }] : [],\n };\n }\n\n case \"Write\": {\n let contentResult: ToolCallContent[] = [];\n const writeFilePath = input?.file_path\n ? String(input.file_path)\n : undefined;\n const writeDisplayPath = writeFilePath\n ? toDisplayPath(writeFilePath, options?.cwd)\n : undefined;\n const contentStr = input?.content ? String(input.content) : undefined;\n if (writeFilePath) {\n const oldContent =\n options?.cachedFileContent &&\n writeFilePath in options.cachedFileContent\n ? options.cachedFileContent[writeFilePath]\n : null;\n contentResult = toolContent()\n .diff(writeFilePath, oldContent, contentStr ?? \"\")\n .build();\n } else if (contentStr) {\n contentResult = toolContent().text(contentStr).build();\n }\n return {\n title: writeDisplayPath ? `Write ${writeDisplayPath}` : \"Write\",\n kind: \"edit\",\n content: contentResult,\n locations: writeFilePath ? [{ path: writeFilePath }] : [],\n };\n }\n\n case \"Glob\": {\n let label = \"Find\";\n const pathStr = input?.path ? String(input.path) : undefined;\n if (pathStr) {\n label += ` \"${pathStr}\"`;\n }\n if (input?.pattern) {\n label += ` \"${String(input.pattern)}\"`;\n }\n return {\n title: label,\n kind: \"search\",\n content: [],\n locations: pathStr ? [{ path: pathStr }] : [],\n };\n }\n\n case \"Grep\": {\n let label = \"grep\";\n\n if (input?.[\"-i\"]) {\n label += \" -i\";\n }\n if (input?.[\"-n\"]) {\n label += \" -n\";\n }\n\n if (input?.[\"-A\"] !== undefined) {\n label += ` -A ${input[\"-A\"]}`;\n }\n if (input?.[\"-B\"] !== undefined) {\n label += ` -B ${input[\"-B\"]}`;\n }\n if (input?.[\"-C\"] !== undefined) {\n label += ` -C ${input[\"-C\"]}`;\n }\n\n if (input?.output_mode) {\n switch (input.output_mode) {\n case \"files_with_matches\":\n label += \" -l\";\n break;\n case \"count\":\n label += \" -c\";\n break;\n default:\n break;\n }\n }\n\n if (input?.head_limit !== undefined) {\n label += ` | head -${input.head_limit}`;\n }\n\n if (input?.glob) {\n label += ` --include=\"${String(input.glob)}\"`;\n }\n\n if (input?.type) {\n label += ` --type=${String(input.type)}`;\n }\n\n if (input?.multiline) {\n label += \" -P\";\n }\n\n if (input?.pattern) {\n label += ` \"${String(input.pattern)}\"`;\n }\n\n if (input?.path) {\n label += ` ${String(input.path)}`;\n }\n\n return {\n title: label,\n kind: \"search\",\n content: [],\n };\n }\n\n case \"WebFetch\":\n return {\n title: \"Fetch\",\n kind: \"fetch\",\n content: input?.url\n ? [\n {\n type: \"content\",\n content: resourceLink(String(input.url), String(input.url), {\n description: input?.prompt ? String(input.prompt) : undefined,\n }),\n },\n ]\n : [],\n };\n\n case \"WebSearch\": {\n let label = `\"${input?.query ? String(input.query) : \"\"}\"`;\n const allowedDomains = input?.allowed_domains as string[] | undefined;\n const blockedDomains = input?.blocked_domains as string[] | undefined;\n\n if (allowedDomains && allowedDomains.length > 0) {\n label += ` (allowed: ${allowedDomains.join(\", \")})`;\n }\n\n if (blockedDomains && blockedDomains.length > 0) {\n label += ` (blocked: ${blockedDomains.join(\", \")})`;\n }\n\n return {\n title: label,\n kind: \"fetch\",\n content: [],\n };\n }\n\n case \"TodoWrite\":\n return {\n title: Array.isArray(input?.todos)\n ? `Update TODOs: ${input.todos.map((todo: { content?: string }) => todo.content).join(\", \")}`\n : \"Update TODOs\",\n kind: \"think\",\n content: [],\n };\n\n case \"ExitPlanMode\":\n return {\n title: \"Ready to code?\",\n kind: \"switch_mode\",\n content: input?.plan\n ? toolContent().text(String(input.plan)).build()\n : [],\n };\n\n case \"AskUserQuestion\": {\n const questions = input?.questions as\n | Array<{ question?: string }>\n | undefined;\n return {\n title: questions?.[0]?.question || \"Question\",\n kind: \"other\" as ToolKind,\n content: questions\n ? toolContent()\n .text(JSON.stringify(questions, null, 2))\n .build()\n : [],\n };\n }\n\n case \"Other\": {\n let output: string;\n try {\n output = JSON.stringify(input, null, 2);\n } catch {\n output = typeof input === \"string\" ? input : \"{}\";\n }\n return {\n title: name || \"Unknown Tool\",\n kind: \"other\",\n content: toolContent().text(`\\`\\`\\`json\\n${output}\\`\\`\\``).build(),\n };\n }\n\n default: {\n if (name?.startsWith(\"mcp__\")) {\n return mcpToolInfo(name, input);\n }\n return {\n title: name || \"Unknown Tool\",\n kind: \"other\",\n content: [],\n };\n }\n }\n}\n\nfunction mcpToolInfo(\n name: string,\n _input: Record<string, unknown> | undefined,\n): ToolInfo {\n const metadata = getMcpToolMetadata(name);\n // Fallback: parse tool name from mcp__<server>__<tool> prefix\n const title =\n metadata?.name ?? (name.split(\"__\").slice(2).join(\"__\") || name);\n\n return {\n title,\n kind: \"other\",\n content: [],\n };\n}\n\ninterface StructuredPatchHunk {\n oldStart: number;\n oldLines: number;\n newStart: number;\n newLines: number;\n lines: string[];\n}\n\ninterface StructuredPatch {\n oldFileName: string;\n newFileName: string;\n hunks: StructuredPatchHunk[];\n}\n\nexport function toolUpdateFromEditToolResponse(\n toolResponse: unknown,\n): { content: ToolCallContent[]; locations: ToolCallLocation[] } | null {\n if (!toolResponse || typeof toolResponse !== \"object\") return null;\n const response = toolResponse as Record<string, unknown>;\n\n const patches = response.structuredPatch as StructuredPatch[] | undefined;\n if (!Array.isArray(patches) || patches.length === 0) return null;\n\n const content: ToolCallContent[] = [];\n const locations: ToolCallLocation[] = [];\n\n for (const patch of patches) {\n if (!patch.hunks || patch.hunks.length === 0) continue;\n\n const filePath = patch.newFileName || patch.oldFileName;\n\n const oldLines: string[] = [];\n const newLines: string[] = [];\n for (const hunk of patch.hunks) {\n for (const line of hunk.lines) {\n if (line.startsWith(\"-\")) {\n oldLines.push(line.slice(1));\n } else if (line.startsWith(\"+\")) {\n newLines.push(line.slice(1));\n } else if (line.startsWith(\" \")) {\n oldLines.push(line.slice(1));\n newLines.push(line.slice(1));\n }\n }\n }\n\n content.push({\n type: \"diff\",\n path: filePath,\n oldText: oldLines.join(\"\\n\"),\n newText: newLines.join(\"\\n\"),\n });\n\n const firstHunk = patch.hunks[0];\n locations.push({\n path: filePath,\n line: firstHunk.newStart,\n });\n }\n\n if (content.length === 0) return null;\n return { content, locations };\n}\n\nexport function toolUpdateFromToolResult(\n toolResult:\n | ToolResultBlockParam\n | BetaWebSearchToolResultBlockParam\n | BetaWebFetchToolResultBlockParam\n | WebSearchToolResultBlockParam\n | BetaCodeExecutionToolResultBlockParam\n | BetaBashCodeExecutionToolResultBlockParam\n | BetaTextEditorCodeExecutionToolResultBlockParam\n | BetaRequestMCPToolResultBlockParam\n | BetaToolSearchToolResultBlockParam,\n toolUse: Pick<ToolUseBlock, \"name\" | \"input\"> | undefined,\n options?: {\n supportsTerminalOutput?: boolean;\n toolUseId?: string;\n cachedFileContent?: Record<string, string>;\n },\n): Pick<ToolCallUpdate, \"title\" | \"content\" | \"locations\" | \"_meta\"> {\n if (\n \"is_error\" in toolResult &&\n toolResult.is_error &&\n toolResult.content &&\n (toolResult.content as unknown[]).length > 0\n ) {\n return toAcpContentUpdate(toolResult.content, true);\n }\n\n switch (toolUse?.name) {\n case \"Read\":\n if (Array.isArray(toolResult.content) && toolResult.content.length > 0) {\n return {\n content: toolResult.content.map((item) => {\n const itemObj = item as {\n type?: string;\n text?: string;\n source?: { data?: string; media_type?: string };\n };\n if (itemObj.type === \"text\") {\n return {\n type: \"content\" as const,\n content: text(\n markdownEscape(stripSystemReminders(itemObj.text ?? \"\")),\n ),\n };\n }\n if (itemObj.type === \"image\" && itemObj.source) {\n return {\n type: \"content\" as const,\n content: {\n type: \"image\" as const,\n data: itemObj.source.data ?? \"\",\n mimeType: itemObj.source.media_type ?? \"image/png\",\n },\n };\n }\n return {\n type: \"content\" as const,\n content: item as { type: \"text\"; text: string },\n };\n }),\n };\n } else if (\n typeof toolResult.content === \"string\" &&\n toolResult.content.length > 0\n ) {\n return {\n content: toolContent()\n .text(markdownEscape(stripSystemReminders(toolResult.content)))\n .build(),\n };\n }\n return {};\n\n case \"Bash\": {\n const result = toolResult.content;\n const terminalId =\n \"tool_use_id\" in toolResult ? String(toolResult.tool_use_id) : \"\";\n const isError = \"is_error\" in toolResult && toolResult.is_error;\n\n let output = \"\";\n let exitCode = isError ? 1 : 0;\n\n if (\n result &&\n typeof result === \"object\" &&\n \"type\" in result &&\n (result as { type: string }).type === \"bash_code_execution_result\"\n ) {\n const bashResult = result as {\n stdout?: string;\n stderr?: string;\n return_code: number;\n };\n output = [bashResult.stdout, bashResult.stderr]\n .filter(Boolean)\n .join(\"\\n\");\n exitCode = bashResult.return_code;\n } else if (typeof result === \"string\") {\n output = result;\n } else if (\n Array.isArray(result) &&\n result.length > 0 &&\n \"text\" in result[0] &&\n typeof result[0].text === \"string\"\n ) {\n output = result.map((c: { text?: string }) => c.text ?? \"\").join(\"\\n\");\n }\n\n if (options?.supportsTerminalOutput) {\n return {\n content: [{ type: \"terminal\" as const, terminalId }],\n _meta: {\n terminal_info: {\n terminal_id: terminalId,\n },\n terminal_output: {\n terminal_id: terminalId,\n data: output,\n },\n terminal_exit: {\n terminal_id: terminalId,\n exit_code: exitCode,\n signal: null,\n },\n },\n };\n }\n if (output.trim()) {\n return {\n content: toolContent()\n .text(`\\`\\`\\`console\\n${output.trimEnd()}\\n\\`\\`\\``)\n .build(),\n };\n }\n return {};\n }\n case \"Edit\":\n case \"Write\":\n return {};\n\n case \"ExitPlanMode\": {\n return { title: \"Exited Plan Mode\" };\n }\n case \"AskUserQuestion\": {\n const content = toolResult.content;\n if (Array.isArray(content) && content.length > 0) {\n const firstItem = content[0];\n if (\n typeof firstItem === \"object\" &&\n firstItem !== null &&\n \"text\" in firstItem\n ) {\n return {\n title: \"Answer received\",\n content: toolContent().text(String(firstItem.text)).build(),\n };\n }\n }\n return { title: \"Question answered\" };\n }\n case \"WebFetch\": {\n const input = toolUse?.input as Record<string, unknown> | undefined;\n const url = input?.url ? String(input.url) : \"\";\n const prompt = input?.prompt ? String(input.prompt) : undefined;\n\n const resultContent = toAcpContentUpdate(\n toolResult.content,\n \"is_error\" in toolResult ? toolResult.is_error : false,\n );\n\n const content: ToolCallContent[] = [];\n if (url) {\n content.push({\n type: \"content\",\n content: resourceLink(url, url, {\n description: prompt,\n }),\n });\n }\n if (resultContent.content) {\n content.push(...resultContent.content);\n }\n\n return { content };\n }\n default: {\n return toAcpContentUpdate(\n toolResult.content,\n \"is_error\" in toolResult ? toolResult.is_error : false,\n );\n }\n }\n}\n\nfunction itemToText(item: unknown): string | null {\n if (!item || typeof item !== \"object\") return null;\n const obj = item as Record<string, unknown>;\n // Standard text block\n if (obj.type === \"text\" && typeof obj.text === \"string\") {\n return stripSystemReminders(obj.text);\n }\n // Any other structured object — serialize it\n try {\n return JSON.stringify(obj, null, 2);\n } catch {\n return null;\n }\n}\n\nfunction toAcpContentUpdate(\n content: unknown,\n isError: boolean = false,\n): Pick<ToolCallUpdate, \"content\"> {\n if (Array.isArray(content) && content.length > 0) {\n const texts: string[] = [];\n for (const item of content) {\n const t = itemToText(item);\n if (t) texts.push(t);\n }\n if (texts.length > 0) {\n const combined = texts.join(\"\\n\");\n return {\n content: toolContent()\n .text(isError ? `\\`\\`\\`\\n${combined}\\n\\`\\`\\`` : combined)\n .build(),\n };\n }\n } else if (typeof content === \"string\" && content.length > 0) {\n return {\n content: toolContent()\n .text(isError ? `\\`\\`\\`\\n${content}\\n\\`\\`\\`` : content)\n .build(),\n };\n } else if (content && typeof content === \"object\") {\n try {\n const json = JSON.stringify(content, null, 2);\n if (json && json !== \"{}\") {\n return {\n content: toolContent().text(json).build(),\n };\n }\n } catch {\n // ignore serialization errors\n }\n }\n return {};\n}\n\nexport type ClaudePlanEntry = {\n content: string;\n status: \"pending\" | \"in_progress\" | \"completed\";\n activeForm: string;\n};\n\nexport function planEntries(input: { todos: ClaudePlanEntry[] }): PlanEntry[] {\n return input.todos.map((input) => ({\n content: input.content,\n status: input.status,\n priority: \"medium\",\n }));\n}\n\n/**\n * attempt to resolve full file contents for diff generation\n *\n * 1) check file content cache exists, and is valid (old_text in content)\n * 2) if missing or invalid, read file from disk\n * 3) if both fail, return null, we'll fall back to fragmented snippet diff\n */\nfunction resolveFileContent(\n filePath: string,\n oldText: string,\n cachedFileContent?: Record<string, string>,\n): string | null {\n if (cachedFileContent && filePath in cachedFileContent) {\n const cached = cachedFileContent[filePath];\n if (cached.includes(oldText)) {\n return cached;\n }\n }\n\n try {\n const content = fs.readFileSync(filePath, \"utf-8\");\n if (content.includes(oldText)) {\n return content;\n }\n } catch {\n return null;\n }\n\n return null;\n}\n\nfunction markdownEscape(text: string): string {\n let escapedText = \"```\";\n for (const [m] of text.matchAll(/^```+/gm)) {\n while (m.length >= escapedText.length) {\n escapedText += \"`\";\n }\n }\n return `${escapedText}\\n${text}${text.endsWith(\"\\n\") ? \"\" : \"\\n\"}${escapedText}`;\n}\n","import type { McpServerStatus, Query } from \"@anthropic-ai/claude-agent-sdk\";\nimport { Logger } from \"../../../utils/logger\";\n\nexport interface McpToolMetadata {\n readOnly: boolean;\n name: string;\n description?: string;\n}\n\nconst mcpToolMetadataCache: Map<string, McpToolMetadata> = new Map();\n\nconst PENDING_RETRY_INTERVAL_MS = 1_000;\nconst PENDING_MAX_RETRIES = 10;\n\nfunction buildToolKey(serverName: string, toolName: string): string {\n return `mcp__${serverName}__${toolName}`;\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function fetchMcpToolMetadata(\n q: Query,\n logger: Logger = new Logger({ debug: false, prefix: \"[McpToolMetadata]\" }),\n): Promise<void> {\n let retries = 0;\n\n while (retries <= PENDING_MAX_RETRIES) {\n let statuses: McpServerStatus[];\n try {\n statuses = await q.mcpServerStatus();\n } catch (error) {\n logger.error(\"Failed to fetch MCP server status\", {\n error: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n\n const pendingServers = statuses.filter((s) => s.status === \"pending\");\n\n for (const server of statuses) {\n if (server.status !== \"connected\" || !server.tools) {\n continue;\n }\n\n let readOnlyCount = 0;\n for (const tool of server.tools) {\n const toolKey = buildToolKey(server.name, tool.name);\n const readOnly = tool.annotations?.readOnly === true;\n\n mcpToolMetadataCache.set(toolKey, {\n readOnly,\n name: tool.name,\n description: tool.description,\n });\n if (readOnly) readOnlyCount++;\n }\n\n logger.info(\"Fetched MCP tool metadata\", {\n serverName: server.name,\n toolCount: server.tools.length,\n readOnlyCount,\n });\n }\n\n if (pendingServers.length === 0) {\n return;\n }\n\n retries++;\n if (retries > PENDING_MAX_RETRIES) {\n logger.warn(\"Gave up waiting for pending MCP servers\", {\n pendingServers: pendingServers.map((s) => s.name),\n });\n return;\n }\n\n logger.info(\"Waiting for pending MCP servers\", {\n pendingServers: pendingServers.map((s) => s.name),\n retry: retries,\n });\n await delay(PENDING_RETRY_INTERVAL_MS);\n }\n}\n\nexport function getMcpToolMetadata(\n toolName: string,\n): McpToolMetadata | undefined {\n return mcpToolMetadataCache.get(toolName);\n}\n\nexport function isMcpToolReadOnly(toolName: string): boolean {\n const metadata = mcpToolMetadataCache.get(toolName);\n return metadata?.readOnly === true;\n}\n\nexport function getConnectedMcpServerNames(): string[] {\n const names = new Set<string>();\n for (const key of mcpToolMetadataCache.keys()) {\n const parts = key.split(\"__\");\n if (parts.length >= 3) names.add(parts[1]);\n }\n return [...names];\n}\n\nexport function clearMcpToolMetadataCache(): void {\n mcpToolMetadataCache.clear();\n}\n","import * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { SessionNotification } from \"@agentclientprotocol/sdk\";\n\nfunction getClaudeConfigDir(): string {\n return process.env.CLAUDE_CONFIG_DIR || path.join(os.homedir(), \".claude\");\n}\n\nexport function getClaudePlansDir(): string {\n return path.join(getClaudeConfigDir(), \"plans\");\n}\n\nexport function isClaudePlanFilePath(filePath: string | undefined): boolean {\n if (!filePath) return false;\n const resolved = path.resolve(filePath);\n const plansDir = path.resolve(getClaudePlansDir());\n return resolved === plansDir || resolved.startsWith(plansDir + path.sep);\n}\n\nexport function isPlanReady(plan: string | undefined): boolean {\n if (!plan) return false;\n const trimmed = plan.trim();\n if (trimmed.length < 40) return false;\n return /(^|\\n)#{1,6}\\s+\\S/.test(trimmed);\n}\n\nexport function getLatestAssistantText(\n notifications: SessionNotification[],\n): string | null {\n const chunks: string[] = [];\n let started = false;\n\n for (let i = notifications.length - 1; i >= 0; i -= 1) {\n const update = notifications[i]?.update;\n if (!update) continue;\n\n if (update.sessionUpdate === \"agent_message_chunk\") {\n started = true;\n const content = update.content as {\n type?: string;\n text?: string;\n } | null;\n if (content?.type === \"text\" && content.text) {\n chunks.push(content.text);\n }\n continue;\n }\n\n if (started) {\n break;\n }\n }\n\n if (chunks.length === 0) return null;\n return chunks.reverse().join(\"\");\n}\n","import type { ToolCallContent, ToolKind } from \"@agentclientprotocol/sdk\";\nimport { z } from \"zod\";\nimport type { PermissionOption } from \"../permissions/permission-options\";\n\nexport const OPTION_PREFIX = \"option_\";\n\nexport const QuestionOptionSchema = z.object({\n label: z.string(),\n description: z.string().optional(),\n});\n\nexport const QuestionItemSchema = z.object({\n question: z.string(),\n header: z.string().optional(),\n options: z.array(QuestionOptionSchema),\n multiSelect: z.boolean().optional(),\n completed: z.boolean().optional(),\n});\n\nexport const QuestionMetaSchema = z.object({\n questions: z.array(QuestionItemSchema),\n});\n\nexport type QuestionOption = z.infer<typeof QuestionOptionSchema>;\nexport type QuestionItem = z.infer<typeof QuestionItemSchema>;\nexport type QuestionMeta = z.infer<typeof QuestionMetaSchema>;\n\nexport interface AskUserQuestionInput {\n questions?: QuestionItem[];\n question?: string;\n header?: string;\n options?: QuestionOption[];\n multiSelect?: boolean;\n}\n\nexport function normalizeAskUserQuestionInput(\n input: AskUserQuestionInput,\n): QuestionItem[] | null {\n if (input.questions && input.questions.length > 0) {\n return input.questions;\n }\n\n if (input.question) {\n return [\n {\n question: input.question,\n header: input.header,\n options: input.options || [],\n multiSelect: input.multiSelect,\n },\n ];\n }\n\n return null;\n}\n\ninterface QuestionToolCallData {\n toolCallId: string;\n title: string;\n kind: ToolKind;\n content: ToolCallContent[];\n _meta: {\n codeToolKind: \"question\";\n questions: QuestionItem[];\n };\n}\n\nexport function buildQuestionToolCallData(\n questions: QuestionItem[],\n): QuestionToolCallData {\n return {\n toolCallId: `question-${Date.now()}`,\n title: questions[0]?.question ?? \"Question\",\n kind: \"other\",\n content: [],\n _meta: {\n codeToolKind: \"question\",\n questions,\n },\n };\n}\n\nexport function buildQuestionOptions(\n question: QuestionItem,\n): PermissionOption[] {\n return question.options.map((opt, idx) => ({\n kind: \"allow_once\" as const,\n name: opt.label,\n optionId: `${OPTION_PREFIX}${idx}`,\n _meta: opt.description ? { description: opt.description } : undefined,\n }));\n}\n","import { IS_ROOT } from \"./utils/common\";\n\nexport interface ModeInfo {\n id: CodeExecutionMode;\n name: string;\n description: string;\n}\n\n// Helper constant that can easily be toggled for env/feature flag/etc\nconst ALLOW_BYPASS = !IS_ROOT;\n\nconst availableModes: ModeInfo[] = [\n {\n id: \"default\",\n name: \"Default\",\n description: \"Standard behavior, prompts for dangerous operations\",\n },\n {\n id: \"acceptEdits\",\n name: \"Accept Edits\",\n description: \"Auto-accept file edit operations\",\n },\n {\n id: \"plan\",\n name: \"Plan Mode\",\n description: \"Planning mode, no actual tool execution\",\n },\n // {\n // id: \"dontAsk\",\n // name: \"Don't Ask\",\n // description: \"Don't prompt for permissions, deny if not pre-approved\",\n // },\n];\n\nif (ALLOW_BYPASS) {\n availableModes.push({\n id: \"bypassPermissions\",\n name: \"Bypass Permissions\",\n description: \"Bypass all permission checks\",\n });\n}\n\n// Expose execution mode IDs in type-safe order for type checks\nexport const CODE_EXECUTION_MODES = [\n \"default\",\n \"acceptEdits\",\n \"plan\",\n // \"dontAsk\",\n \"bypassPermissions\",\n] as const;\n\nexport type CodeExecutionMode = (typeof CODE_EXECUTION_MODES)[number];\n\nexport function getAvailableModes(): ModeInfo[] {\n // When IS_ROOT, do not allow bypassPermissions\n return IS_ROOT\n ? availableModes.filter((m) => m.id !== \"bypassPermissions\")\n : availableModes;\n}\n","export {\n CODE_EXECUTION_MODES,\n type CodeExecutionMode,\n getAvailableModes,\n type ModeInfo,\n} from \"../../execution-mode\";\n\nimport type { CodeExecutionMode } from \"../../execution-mode\";\nimport { isMcpToolReadOnly } from \"./mcp/tool-metadata\";\n\nexport const READ_TOOLS: Set<string> = new Set([\"Read\", \"NotebookRead\"]);\n\nexport const WRITE_TOOLS: Set<string> = new Set([\n \"Edit\",\n \"Write\",\n \"NotebookEdit\",\n]);\n\nexport const BASH_TOOLS: Set<string> = new Set([\n \"Bash\",\n \"BashOutput\",\n \"KillShell\",\n]);\n\nexport const SEARCH_TOOLS: Set<string> = new Set([\"Glob\", \"Grep\", \"LS\"]);\n\nexport const WEB_TOOLS: Set<string> = new Set([\"WebSearch\", \"WebFetch\"]);\n\nexport const AGENT_TOOLS: Set<string> = new Set([\n \"Task\",\n \"Agent\",\n \"TodoWrite\",\n \"Skill\",\n]);\n\nconst BASE_ALLOWED_TOOLS = [\n ...READ_TOOLS,\n ...SEARCH_TOOLS,\n ...WEB_TOOLS,\n ...AGENT_TOOLS,\n];\n\nconst AUTO_ALLOWED_TOOLS: Record<string, Set<string>> = {\n default: new Set(BASE_ALLOWED_TOOLS),\n acceptEdits: new Set([...BASE_ALLOWED_TOOLS, ...WRITE_TOOLS]),\n plan: new Set(BASE_ALLOWED_TOOLS),\n // dontAsk: new Set(BASE_ALLOWED_TOOLS),\n};\n\nexport function isToolAllowedForMode(\n toolName: string,\n mode: CodeExecutionMode,\n): boolean {\n if (mode === \"bypassPermissions\") {\n return true;\n }\n if (AUTO_ALLOWED_TOOLS[mode]?.has(toolName) === true) {\n return true;\n }\n if (isMcpToolReadOnly(toolName)) {\n return true;\n }\n return false;\n}\n","import type { PermissionUpdate } from \"@anthropic-ai/claude-agent-sdk\";\nimport { IS_ROOT } from \"../../../utils/common\";\nimport { BASH_TOOLS, READ_TOOLS, SEARCH_TOOLS, WRITE_TOOLS } from \"../tools\";\n\nexport interface PermissionOption {\n kind: \"allow_once\" | \"allow_always\" | \"reject_once\" | \"reject_always\";\n name: string;\n optionId: string;\n _meta?: { description?: string; customInput?: boolean };\n}\n\nfunction permissionOptions(allowAlwaysLabel: string): PermissionOption[] {\n return [\n { kind: \"allow_once\", name: \"Yes\", optionId: \"allow\" },\n { kind: \"allow_always\", name: allowAlwaysLabel, optionId: \"allow_always\" },\n {\n kind: \"reject_once\",\n name: \"No, and tell the agent what to do differently\",\n optionId: \"reject\",\n _meta: { customInput: true },\n },\n ];\n}\n\nexport function buildPermissionOptions(\n toolName: string,\n toolInput: Record<string, unknown>,\n cwd?: string,\n suggestions?: PermissionUpdate[],\n): PermissionOption[] {\n if (BASH_TOOLS.has(toolName)) {\n const rawRuleContent = suggestions\n ?.flatMap((s) => (\"rules\" in s ? s.rules : []))\n .find((r) => r.toolName === \"Bash\" && r.ruleContent)?.ruleContent;\n const ruleContent = rawRuleContent?.replace(/:?\\*$/, \"\");\n\n const command = toolInput?.command as string | undefined;\n const cmdName = command?.split(/\\s+/)[0] ?? \"this command\";\n const cwdLabel = cwd ? ` in ${cwd}` : \"\";\n const label = ruleContent ?? `\\`${cmdName}\\` commands`;\n\n return permissionOptions(\n `Yes, and don't ask again for ${label}${cwdLabel}`,\n );\n }\n\n if (toolName === \"BashOutput\") {\n return permissionOptions(\"Yes, allow all background process reads\");\n }\n\n if (toolName === \"KillShell\") {\n return permissionOptions(\"Yes, allow killing processes\");\n }\n\n if (WRITE_TOOLS.has(toolName)) {\n return permissionOptions(\"Yes, allow all edits during this session\");\n }\n\n if (READ_TOOLS.has(toolName)) {\n return permissionOptions(\"Yes, allow all reads during this session\");\n }\n\n if (SEARCH_TOOLS.has(toolName)) {\n return permissionOptions(\"Yes, allow all searches during this session\");\n }\n\n if (toolName === \"WebFetch\") {\n const url = toolInput?.url as string | undefined;\n let domain = \"\";\n try {\n domain = url ? new URL(url).hostname : \"\";\n } catch {}\n return permissionOptions(\n domain\n ? `Yes, allow all fetches from ${domain}`\n : \"Yes, allow all fetches\",\n );\n }\n\n if (toolName === \"WebSearch\") {\n return permissionOptions(\"Yes, allow all web searches\");\n }\n\n if (toolName === \"Task\") {\n return permissionOptions(\"Yes, allow all sub-tasks\");\n }\n\n if (toolName === \"TodoWrite\") {\n return permissionOptions(\"Yes, allow all todo updates\");\n }\n\n return permissionOptions(\"Yes, always allow\");\n}\n\nconst ALLOW_BYPASS = !IS_ROOT || !!process.env.IS_SANDBOX;\n\nexport function buildExitPlanModePermissionOptions(): PermissionOption[] {\n const options: PermissionOption[] = [];\n\n if (ALLOW_BYPASS) {\n options.push({\n kind: \"allow_always\",\n name: \"Yes, bypass all permissions\",\n optionId: \"bypassPermissions\",\n });\n }\n\n options.push(\n {\n kind: \"allow_always\",\n name: \"Yes, and auto-accept edits\",\n optionId: \"acceptEdits\",\n },\n {\n kind: \"allow_once\",\n name: \"Yes, and manually approve edits\",\n optionId: \"default\",\n },\n {\n kind: \"reject_once\",\n name: \"No, and tell the agent what to do differently\",\n optionId: \"reject_with_feedback\",\n _meta: { customInput: true },\n },\n );\n\n return options;\n}\n","import type {\n AgentSideConnection,\n RequestPermissionResponse,\n} from \"@agentclientprotocol/sdk\";\nimport type { PermissionUpdate } from \"@anthropic-ai/claude-agent-sdk\";\nimport { text } from \"../../../utils/acp-content\";\nimport type { Logger } from \"../../../utils/logger\";\nimport { toolInfoFromToolUse } from \"../conversion/tool-use-to-acp\";\nimport {\n getClaudePlansDir,\n getLatestAssistantText,\n isClaudePlanFilePath,\n isPlanReady,\n} from \"../plan/utils\";\nimport {\n type AskUserQuestionInput,\n normalizeAskUserQuestionInput,\n OPTION_PREFIX,\n type QuestionItem,\n} from \"../questions/utils\";\nimport { isToolAllowedForMode, WRITE_TOOLS } from \"../tools\";\nimport type { Session } from \"../types\";\nimport {\n buildExitPlanModePermissionOptions,\n buildPermissionOptions,\n} from \"./permission-options\";\n\nexport type ToolPermissionResult =\n | {\n behavior: \"allow\";\n updatedInput: Record<string, unknown>;\n updatedPermissions?: PermissionUpdate[];\n }\n | {\n behavior: \"deny\";\n message: string;\n interrupt?: boolean;\n };\n\ninterface ToolHandlerContext {\n session: Session;\n toolName: string;\n toolInput: Record<string, unknown>;\n toolUseID: string;\n suggestions?: PermissionUpdate[];\n signal?: AbortSignal;\n client: AgentSideConnection;\n sessionId: string;\n fileContentCache: { [key: string]: string };\n logger: Logger;\n updateConfigOption: (configId: string, value: string) => Promise<void>;\n allowedDomains?: string[];\n}\n\nasync function emitToolDenial(\n context: ToolHandlerContext,\n message: string,\n): Promise<void> {\n context.logger.info(`[canUseTool] Tool denied: ${context.toolName}`, {\n message,\n });\n await context.client.sessionUpdate({\n sessionId: context.sessionId,\n update: {\n sessionUpdate: \"tool_call_update\",\n toolCallId: context.toolUseID,\n status: \"failed\",\n content: [{ type: \"content\", content: text(message) }],\n },\n });\n}\n\nfunction getPlanFromFile(\n session: Session,\n fileContentCache: { [key: string]: string },\n): string | undefined {\n return (\n session.lastPlanContent ||\n (session.lastPlanFilePath\n ? fileContentCache[session.lastPlanFilePath]\n : undefined)\n );\n}\n\nfunction ensurePlanInInput(\n toolInput: Record<string, unknown>,\n fallbackPlan: string | undefined,\n): Record<string, unknown> {\n const hasPlan = typeof (toolInput as { plan?: unknown })?.plan === \"string\";\n if (hasPlan || !fallbackPlan) {\n return toolInput;\n }\n return { ...toolInput, plan: fallbackPlan };\n}\n\nfunction extractPlanText(input: Record<string, unknown>): string | undefined {\n const plan = (input as { plan?: unknown })?.plan;\n return typeof plan === \"string\" ? plan : undefined;\n}\n\nasync function createPlanValidationError(\n message: string,\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n await emitToolDenial(context, message);\n return { behavior: \"deny\", message, interrupt: false };\n}\n\nasync function validatePlanContent(\n planText: string | undefined,\n context: ToolHandlerContext,\n): Promise<{ valid: true } | { valid: false; error: ToolPermissionResult }> {\n if (!planText) {\n const message = `Plan not ready. Provide the full markdown plan in ExitPlanMode or write it to ${getClaudePlansDir()} before requesting approval.`;\n return {\n valid: false,\n error: await createPlanValidationError(message, context),\n };\n }\n\n if (!isPlanReady(planText)) {\n const message =\n \"Plan not ready. Provide the full markdown plan in ExitPlanMode before requesting approval.\";\n return {\n valid: false,\n error: await createPlanValidationError(message, context),\n };\n }\n\n return { valid: true };\n}\n\nasync function requestPlanApproval(\n context: ToolHandlerContext,\n updatedInput: Record<string, unknown>,\n): Promise<RequestPermissionResponse> {\n const { client, sessionId, toolUseID } = context;\n\n const toolInfo = toolInfoFromToolUse({\n name: context.toolName,\n input: updatedInput,\n });\n\n return await client.requestPermission({\n options: buildExitPlanModePermissionOptions(),\n sessionId,\n toolCall: {\n toolCallId: toolUseID,\n title: toolInfo.title,\n kind: toolInfo.kind,\n content: toolInfo.content,\n locations: toolInfo.locations,\n rawInput: { ...updatedInput, toolName: context.toolName },\n },\n });\n}\n\nasync function applyPlanApproval(\n response: RequestPermissionResponse,\n context: ToolHandlerContext,\n updatedInput: Record<string, unknown>,\n): Promise<ToolPermissionResult> {\n const { session } = context;\n\n if (\n response.outcome?.outcome === \"selected\" &&\n (response.outcome.optionId === \"default\" ||\n response.outcome.optionId === \"acceptEdits\" ||\n response.outcome.optionId === \"bypassPermissions\")\n ) {\n session.permissionMode = response.outcome\n .optionId as typeof session.permissionMode;\n await session.query.setPermissionMode(response.outcome.optionId);\n await context.client.sessionUpdate({\n sessionId: context.sessionId,\n update: {\n sessionUpdate: \"current_mode_update\",\n currentModeId: response.outcome.optionId,\n },\n });\n await context.updateConfigOption(\"mode\", response.outcome.optionId);\n\n return {\n behavior: \"allow\",\n updatedInput,\n updatedPermissions: context.suggestions ?? [\n {\n type: \"setMode\",\n mode: response.outcome.optionId,\n destination: \"localSettings\",\n },\n ],\n };\n }\n\n const customInput = (response._meta as Record<string, unknown> | undefined)\n ?.customInput as string | undefined;\n const feedback = customInput?.trim();\n\n const message = feedback\n ? `User rejected the plan with feedback: ${feedback}`\n : \"User rejected the plan. Wait for the user to provide direction.\";\n await emitToolDenial(context, message);\n return { behavior: \"deny\", message, interrupt: !feedback };\n}\n\nasync function handleEnterPlanModeTool(\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n const { session, toolInput } = context;\n\n session.permissionMode = \"plan\";\n await session.query.setPermissionMode(\"plan\");\n await context.updateConfigOption(\"mode\", \"plan\");\n\n return {\n behavior: \"allow\",\n updatedInput: toolInput as Record<string, unknown>,\n };\n}\n\nasync function handleExitPlanModeTool(\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n const { session, toolInput, fileContentCache } = context;\n\n const planFromFile = getPlanFromFile(session, fileContentCache);\n const latestText = getLatestAssistantText(session.notificationHistory);\n const fallbackPlan = planFromFile || (latestText ?? undefined);\n const updatedInput = ensurePlanInInput(toolInput, fallbackPlan);\n const planText = extractPlanText(updatedInput);\n\n const validationResult = await validatePlanContent(planText, context);\n if (!validationResult.valid) {\n return validationResult.error;\n }\n\n const response = await requestPlanApproval(context, updatedInput);\n if (context.signal?.aborted || response.outcome?.outcome === \"cancelled\") {\n throw new Error(\"Tool use aborted\");\n }\n return await applyPlanApproval(response, context, updatedInput);\n}\n\nfunction buildQuestionOptions(question: QuestionItem) {\n return (question.options || []).map((opt, idx) => ({\n kind: \"allow_once\" as const,\n name: opt.label,\n optionId: `${OPTION_PREFIX}${idx}`,\n _meta: opt.description ? { description: opt.description } : undefined,\n }));\n}\n\nasync function handleAskUserQuestionTool(\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n const input = context.toolInput as AskUserQuestionInput;\n context.logger.info(\"[AskUserQuestion] Received input\", { input });\n const questions = normalizeAskUserQuestionInput(input);\n context.logger.info(\"[AskUserQuestion] Normalized questions\", { questions });\n\n if (!questions || questions.length === 0) {\n context.logger.warn(\"[AskUserQuestion] No questions found in input\");\n return {\n behavior: \"deny\",\n message: \"No questions provided\",\n };\n }\n\n const { client, sessionId, toolUseID, toolInput } = context;\n const firstQuestion = questions[0];\n const options = buildQuestionOptions(firstQuestion);\n\n const toolInfo = toolInfoFromToolUse({\n name: context.toolName,\n input: toolInput,\n });\n\n const response = await client.requestPermission({\n options,\n sessionId,\n toolCall: {\n toolCallId: toolUseID,\n title: firstQuestion.question,\n kind: \"other\",\n content: toolInfo.content,\n _meta: {\n codeToolKind: \"question\",\n questions,\n },\n },\n });\n\n if (context.signal?.aborted || response.outcome?.outcome === \"cancelled\") {\n throw new Error(\"Tool use aborted\");\n }\n\n if (response.outcome?.outcome !== \"selected\") {\n const customMessage = (\n response._meta as Record<string, unknown> | undefined\n )?.message;\n return {\n behavior: \"deny\",\n message:\n typeof customMessage === \"string\"\n ? customMessage\n : \"User cancelled the questions\",\n };\n }\n\n const answers = response._meta?.answers as Record<string, string> | undefined;\n if (!answers || Object.keys(answers).length === 0) {\n return {\n behavior: \"deny\",\n message: \"User did not provide answers\",\n };\n }\n\n return {\n behavior: \"allow\",\n updatedInput: {\n ...(context.toolInput as Record<string, unknown>),\n answers,\n },\n };\n}\n\nasync function handleDefaultPermissionFlow(\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n const {\n session,\n toolName,\n toolInput,\n toolUseID,\n client,\n sessionId,\n suggestions,\n } = context;\n\n const toolInfo = toolInfoFromToolUse({ name: toolName, input: toolInput });\n\n const options = buildPermissionOptions(\n toolName,\n toolInput as Record<string, unknown>,\n session?.cwd,\n suggestions,\n );\n\n const response = await client.requestPermission({\n options,\n sessionId,\n toolCall: {\n toolCallId: toolUseID,\n title: toolInfo.title,\n kind: toolInfo.kind,\n content: toolInfo.content,\n locations: toolInfo.locations,\n rawInput: { ...(toolInput as Record<string, unknown>), toolName },\n },\n });\n\n if (context.signal?.aborted || response.outcome?.outcome === \"cancelled\") {\n throw new Error(\"Tool use aborted\");\n }\n\n if (\n response.outcome?.outcome === \"selected\" &&\n (response.outcome.optionId === \"allow\" ||\n response.outcome.optionId === \"allow_always\")\n ) {\n if (response.outcome.optionId === \"allow_always\") {\n return {\n behavior: \"allow\",\n updatedInput: toolInput as Record<string, unknown>,\n updatedPermissions: suggestions ?? [\n {\n type: \"addRules\",\n rules: [{ toolName }],\n behavior: \"allow\",\n destination: \"localSettings\",\n },\n ],\n };\n }\n return {\n behavior: \"allow\",\n updatedInput: toolInput as Record<string, unknown>,\n };\n } else {\n const message = \"User refused permission to run tool\";\n await emitToolDenial(context, message);\n return {\n behavior: \"deny\",\n message,\n };\n }\n}\n\nfunction handlePlanFileException(\n context: ToolHandlerContext,\n): ToolPermissionResult | null {\n const { session, toolName, toolInput } = context;\n\n if (session.permissionMode !== \"plan\" || !WRITE_TOOLS.has(toolName)) {\n return null;\n }\n\n const filePath = (toolInput as { file_path?: string })?.file_path;\n if (!isClaudePlanFilePath(filePath)) {\n return null;\n }\n\n session.lastPlanFilePath = filePath;\n const content = (toolInput as { content?: string })?.content;\n if (typeof content === \"string\") {\n session.lastPlanContent = content;\n }\n\n return {\n behavior: \"allow\",\n updatedInput: toolInput as Record<string, unknown>,\n };\n}\n\nfunction extractDomainFromUrl(url: string): string | null {\n try {\n return new URL(url).hostname;\n } catch {\n return null;\n }\n}\n\nfunction isDomainAllowed(hostname: string, allowedDomains: string[]): boolean {\n return allowedDomains.some((pattern) => {\n if (pattern.startsWith(\"*.\")) {\n const suffix = pattern.slice(1); // \".example.com\"\n return hostname === pattern.slice(2) || hostname.endsWith(suffix);\n }\n return hostname === pattern;\n });\n}\n\nexport async function canUseTool(\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n const { toolName, toolInput, session, allowedDomains } = context;\n\n // Enforce domain allowlist for web tools\n if (allowedDomains && allowedDomains.length > 0) {\n if (toolName === \"WebFetch\" || toolName === \"WebSearch\") {\n const url = toolInput.url as string | undefined;\n if (url) {\n const hostname = extractDomainFromUrl(url);\n if (hostname && !isDomainAllowed(hostname, allowedDomains)) {\n const message = `Domain \"${hostname}\" is not in the allowed list: ${allowedDomains.join(\", \")}`;\n await emitToolDenial(context, message);\n return { behavior: \"deny\", message, interrupt: false };\n }\n }\n }\n }\n\n if (isToolAllowedForMode(toolName, session.permissionMode)) {\n return {\n behavior: \"allow\",\n updatedInput: toolInput as Record<string, unknown>,\n };\n }\n\n if (toolName === \"EnterPlanMode\") {\n return handleEnterPlanModeTool(context);\n }\n\n if (toolName === \"ExitPlanMode\") {\n return handleExitPlanModeTool(context);\n }\n\n if (toolName === \"AskUserQuestion\") {\n return handleAskUserQuestionTool(context);\n }\n\n const planFileResult = handlePlanFileException(context);\n if (planFileResult) {\n return planFileResult;\n }\n\n // if (session.permissionMode === \"dontAsk\") {\n // const message = \"Tool not pre-approved. Denied by dontAsk mode.\";\n // await emitToolDenial(context, message);\n // return { behavior: \"deny\", message, interrupt: false };\n // }\n\n return handleDefaultPermissionFlow(context);\n}\n","import type { AvailableCommand } from \"@agentclientprotocol/sdk\";\nimport type { SlashCommand } from \"@anthropic-ai/claude-agent-sdk\";\n\nconst UNSUPPORTED_COMMANDS = [\n \"clear\",\n \"context\",\n \"cost\",\n \"keybindings-help\",\n \"login\",\n \"logout\",\n \"output-style:new\",\n \"release-notes\",\n \"todos\",\n];\n\nexport function getAvailableSlashCommands(\n commands: SlashCommand[],\n): AvailableCommand[] {\n return commands\n .map((command) => {\n const input =\n command.argumentHint != null\n ? {\n hint: Array.isArray(command.argumentHint)\n ? command.argumentHint.join(\" \")\n : command.argumentHint,\n }\n : null;\n let name = command.name;\n if (command.name.endsWith(\" (MCP)\")) {\n name = `mcp:${name.replace(\" (MCP)\", \"\")}`;\n }\n return {\n name,\n description: command.description || \"\",\n input,\n };\n })\n .filter(\n (command: AvailableCommand) =>\n !UNSUPPORTED_COMMANDS.includes(command.name),\n );\n}\n","import type { NewSessionRequest } from \"@agentclientprotocol/sdk\";\nimport type { McpServerConfig } from \"@anthropic-ai/claude-agent-sdk\";\n\nexport function parseMcpServers(\n params: Pick<NewSessionRequest, \"mcpServers\">,\n): Record<string, McpServerConfig> {\n const mcpServers: Record<string, McpServerConfig> = {};\n if (!Array.isArray(params.mcpServers)) {\n return mcpServers;\n }\n\n for (const server of params.mcpServers) {\n if (\"type\" in server) {\n mcpServers[server.name] = {\n type: server.type,\n url: server.url,\n headers: server.headers\n ? Object.fromEntries(server.headers.map((e) => [e.name, e.value]))\n : undefined,\n };\n } else {\n mcpServers[server.name] = {\n type: \"stdio\",\n command: server.command,\n args: server.args,\n env: server.env\n ? Object.fromEntries(server.env.map((e) => [e.name, e.value]))\n : undefined,\n };\n }\n }\n\n return mcpServers;\n}\n","export const DEFAULT_MODEL = \"opus\";\n\nconst GATEWAY_TO_SDK_MODEL: Record<string, string> = {\n \"claude-opus-4-5\": \"opus\",\n \"claude-opus-4-6\": \"opus\",\n \"claude-sonnet-4-5\": \"sonnet\",\n \"claude-sonnet-4-6\": \"sonnet\",\n \"claude-haiku-4-5\": \"haiku\",\n};\n\nexport function toSdkModelId(modelId: string): string {\n return GATEWAY_TO_SDK_MODEL[modelId] ?? modelId;\n}\n\nconst MODELS_WITH_1M_CONTEXT = new Set([\n \"claude-opus-4-6\",\n \"claude-sonnet-4-6\",\n]);\n\nexport function supports1MContext(modelId: string): boolean {\n return MODELS_WITH_1M_CONTEXT.has(modelId);\n}\n\nconst MODELS_WITH_EFFORT = new Set([\n \"claude-opus-4-5\",\n \"claude-opus-4-6\",\n \"claude-sonnet-4-6\",\n]);\n\nconst MODELS_WITH_MAX_EFFORT = new Set([\"claude-opus-4-6\"]);\n\nexport function supportsEffort(modelId: string): boolean {\n return MODELS_WITH_EFFORT.has(modelId);\n}\n\nexport function supportsMaxEffort(modelId: string): boolean {\n return MODELS_WITH_MAX_EFFORT.has(modelId);\n}\n\ninterface EffortOption {\n value: string;\n name: string;\n}\n\nexport function getEffortOptions(modelId: string): EffortOption[] | null {\n if (!supportsEffort(modelId)) return null;\n\n const options: EffortOption[] = [\n { value: \"low\", name: \"Low\" },\n { value: \"medium\", name: \"Medium\" },\n { value: \"high\", name: \"High\" },\n ];\n\n if (supportsMaxEffort(modelId)) {\n options.push({ value: \"max\", name: \"Max\" });\n }\n\n return options;\n}\n\n// Model alias resolution — lets callers use human-friendly aliases like\n// \"opus\" or \"sonnet\" instead of full model IDs like \"claude-opus-4-6\".\n\nconst MODEL_CONTEXT_HINT_PATTERN = /\\[(\\d+m)\\]$/i;\n\nfunction tokenizeModelPreference(model: string): {\n tokens: string[];\n contextHint?: string;\n} {\n const lower = model.trim().toLowerCase();\n const contextHint = lower\n .match(MODEL_CONTEXT_HINT_PATTERN)?.[1]\n ?.toLowerCase();\n\n const normalized = lower.replace(MODEL_CONTEXT_HINT_PATTERN, \" $1 \");\n const rawTokens = normalized.split(/[^a-z0-9]+/).filter(Boolean);\n const tokens = rawTokens\n .map((token) => {\n if (token === \"opusplan\") return \"opus\";\n if (token === \"best\" || token === \"default\") return \"\";\n return token;\n })\n .filter((token) => token && token !== \"claude\")\n .filter((token) => /[a-z]/.test(token) || token.endsWith(\"m\"));\n\n return { tokens, contextHint };\n}\n\ninterface ModelOption {\n value: string;\n name?: string;\n description?: string;\n}\n\nfunction scoreModelMatch(\n model: ModelOption,\n tokens: string[],\n contextHint?: string,\n): number {\n const haystack = `${model.value} ${model.name ?? \"\"}`.toLowerCase();\n let score = 0;\n for (const token of tokens) {\n if (haystack.includes(token)) {\n score += token === contextHint ? 3 : 1;\n }\n }\n return score;\n}\n\nexport function resolveModelPreference(\n preference: string,\n options: ModelOption[],\n): string | null {\n const trimmed = preference.trim();\n if (!trimmed) return null;\n\n const lower = trimmed.toLowerCase();\n\n // Exact match on value or display name\n const directMatch = options.find(\n (o) =>\n o.value === trimmed ||\n o.value.toLowerCase() === lower ||\n (o.name && o.name.toLowerCase() === lower),\n );\n if (directMatch) return directMatch.value;\n\n // Substring match\n const includesMatch = options.find((o) => {\n const value = o.value.toLowerCase();\n const display = (o.name ?? \"\").toLowerCase();\n return (\n value.includes(lower) || display.includes(lower) || lower.includes(value)\n );\n });\n if (includesMatch) return includesMatch.value;\n\n // Tokenized matching for aliases like \"opus[1m]\"\n const { tokens, contextHint } = tokenizeModelPreference(trimmed);\n if (tokens.length === 0) return null;\n\n let bestMatch: ModelOption | null = null;\n let bestScore = 0;\n for (const model of options) {\n const score = scoreModelMatch(model, tokens, contextHint);\n if (0 < score && (!bestMatch || bestScore < score)) {\n bestMatch = model;\n bestScore = score;\n }\n }\n\n return bestMatch?.value ?? null;\n}\n","import { spawn } from \"node:child_process\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type {\n CanUseTool,\n McpServerConfig,\n Options,\n SpawnedProcess,\n SpawnOptions,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport { IS_ROOT } from \"../../../utils/common\";\nimport type { Logger } from \"../../../utils/logger\";\nimport {\n createPostToolUseHook,\n createPreToolUseHook,\n type OnModeChange,\n} from \"../hooks\";\nimport type { CodeExecutionMode } from \"../tools\";\nimport type { EffortLevel } from \"../types\";\nimport { APPENDED_INSTRUCTIONS } from \"./instructions\";\nimport { DEFAULT_MODEL } from \"./models\";\nimport type { SettingsManager } from \"./settings\";\n\nexport interface ProcessSpawnedInfo {\n pid: number;\n command: string;\n sessionId: string;\n}\n\nexport interface BuildOptionsParams {\n cwd: string;\n mcpServers: Record<string, McpServerConfig>;\n permissionMode: CodeExecutionMode;\n canUseTool: CanUseTool;\n logger: Logger;\n systemPrompt?: Options[\"systemPrompt\"];\n userProvidedOptions?: Options;\n sessionId: string;\n isResume: boolean;\n forkSession?: boolean;\n additionalDirectories?: string[];\n disableBuiltInTools?: boolean;\n settingsManager: SettingsManager;\n onModeChange?: OnModeChange;\n onProcessSpawned?: (info: ProcessSpawnedInfo) => void;\n onProcessExited?: (pid: number) => void;\n effort?: EffortLevel;\n}\n\nexport function buildSystemPrompt(\n customPrompt?: unknown,\n): Options[\"systemPrompt\"] {\n const defaultPrompt: Options[\"systemPrompt\"] = {\n type: \"preset\",\n preset: \"claude_code\",\n append: APPENDED_INSTRUCTIONS,\n };\n\n if (!customPrompt) {\n return defaultPrompt;\n }\n\n if (typeof customPrompt === \"string\") {\n return customPrompt + APPENDED_INSTRUCTIONS;\n }\n\n if (\n typeof customPrompt === \"object\" &&\n customPrompt !== null &&\n \"append\" in customPrompt &&\n typeof customPrompt.append === \"string\"\n ) {\n return {\n ...defaultPrompt,\n append: customPrompt.append + APPENDED_INSTRUCTIONS,\n };\n }\n\n return defaultPrompt;\n}\n\nfunction buildMcpServers(\n userServers: Record<string, McpServerConfig> | undefined,\n acpServers: Record<string, McpServerConfig>,\n): Record<string, McpServerConfig> {\n return {\n ...(userServers || {}),\n ...acpServers,\n };\n}\n\nfunction buildEnvironment(): Record<string, string> {\n return {\n ...process.env,\n ELECTRON_RUN_AS_NODE: \"1\",\n CLAUDE_CODE_ENABLE_ASK_USER_QUESTION_TOOL: \"true\",\n // Offload all MCP tools by default\n ENABLE_TOOL_SEARCH: \"auto:0\",\n };\n}\n\nfunction buildHooks(\n userHooks: Options[\"hooks\"],\n onModeChange: OnModeChange | undefined,\n settingsManager: SettingsManager,\n logger: Logger,\n): Options[\"hooks\"] {\n return {\n ...userHooks,\n PostToolUse: [\n ...(userHooks?.PostToolUse || []),\n {\n hooks: [createPostToolUseHook({ onModeChange, logger })],\n },\n ],\n PreToolUse: [\n ...(userHooks?.PreToolUse || []),\n {\n hooks: [createPreToolUseHook(settingsManager, logger)],\n },\n ],\n };\n}\n\nfunction getAbortController(\n userProvidedController: AbortController | undefined,\n): AbortController {\n const controller = userProvidedController ?? new AbortController();\n if (controller.signal.aborted) {\n throw new Error(\"Cancelled\");\n }\n return controller;\n}\n\nfunction buildSpawnWrapper(\n sessionId: string,\n onProcessSpawned: (info: ProcessSpawnedInfo) => void,\n onProcessExited?: (pid: number) => void,\n logger?: Logger,\n): (options: SpawnOptions) => SpawnedProcess {\n return (spawnOpts: SpawnOptions): SpawnedProcess => {\n const child = spawn(spawnOpts.command, spawnOpts.args, {\n cwd: spawnOpts.cwd,\n env: spawnOpts.env as NodeJS.ProcessEnv,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n if (child.pid) {\n onProcessSpawned({\n pid: child.pid,\n command: `${spawnOpts.command} ${spawnOpts.args.join(\" \")}`,\n sessionId,\n });\n }\n\n child.stderr?.on(\"data\", (data: Buffer) => {\n const msg = data.toString().trim();\n if (msg && logger) {\n logger.debug(`[claude-code:${child.pid}] stderr: ${msg}`);\n }\n });\n\n if (onProcessExited) {\n child.on(\"exit\", () => {\n if (child.pid) {\n onProcessExited(child.pid);\n }\n });\n }\n\n // Listen for abort signal\n if (spawnOpts.signal) {\n spawnOpts.signal.addEventListener(\"abort\", () => {\n child.kill(\"SIGTERM\");\n });\n }\n\n if (!child.stdin || !child.stdout) {\n throw new Error(\n `Failed to get stdio streams for spawned process (pid=${child.pid})`,\n );\n }\n\n return {\n stdin: child.stdin,\n stdout: child.stdout,\n get killed() {\n return child.killed;\n },\n get exitCode() {\n return child.exitCode;\n },\n kill(signal: NodeJS.Signals) {\n return child.kill(signal);\n },\n // biome-ignore lint/suspicious/noExplicitAny: ChildProcess event listener types require any[]\n on(event: \"exit\" | \"error\", listener: (...args: any[]) => void) {\n child.on(event, listener);\n },\n // biome-ignore lint/suspicious/noExplicitAny: ChildProcess event listener types require any[]\n once(event: \"exit\" | \"error\", listener: (...args: any[]) => void) {\n child.once(event, listener);\n },\n // biome-ignore lint/suspicious/noExplicitAny: ChildProcess event listener types require any[]\n off(event: \"exit\" | \"error\", listener: (...args: any[]) => void) {\n child.off(event, listener);\n },\n };\n };\n}\n\nfunction ensureLocalSettings(cwd: string): void {\n const claudeDir = path.join(cwd, \".claude\");\n const localSettingsPath = path.join(claudeDir, \"settings.local.json\");\n try {\n if (!fs.existsSync(localSettingsPath)) {\n fs.mkdirSync(claudeDir, { recursive: true });\n fs.writeFileSync(localSettingsPath, \"{}\\n\", { flag: \"wx\" });\n }\n } catch {\n // Best-effort — don't fail session creation if we can't write\n }\n}\n\nexport function buildSessionOptions(params: BuildOptionsParams): Options {\n ensureLocalSettings(params.cwd);\n\n // Resolve which built-in tools to expose.\n // Explicit tools array from userProvidedOptions takes precedence.\n // disableBuiltInTools is a legacy shorthand for tools: [] — kept for\n // backward compatibility but callers should prefer the tools array.\n const tools: Options[\"tools\"] =\n params.userProvidedOptions?.tools ??\n (params.disableBuiltInTools\n ? []\n : { type: \"preset\", preset: \"claude_code\" });\n\n const options: Options = {\n ...params.userProvidedOptions,\n betas: [\"context-1m-2025-08-07\"],\n systemPrompt: params.systemPrompt ?? buildSystemPrompt(),\n settingSources: [\"user\", \"project\", \"local\"],\n stderr: (err) => params.logger.error(err),\n cwd: params.cwd,\n includePartialMessages: true,\n allowDangerouslySkipPermissions: !IS_ROOT,\n permissionMode: params.permissionMode,\n canUseTool: params.canUseTool,\n executable: \"node\",\n tools,\n extraArgs: {\n ...params.userProvidedOptions?.extraArgs,\n \"replay-user-messages\": \"\",\n },\n mcpServers: buildMcpServers(\n params.userProvidedOptions?.mcpServers,\n params.mcpServers,\n ),\n env: buildEnvironment(),\n hooks: buildHooks(\n params.userProvidedOptions?.hooks,\n params.onModeChange,\n params.settingsManager,\n params.logger,\n ),\n abortController: getAbortController(\n params.userProvidedOptions?.abortController,\n ),\n ...(params.onProcessSpawned && {\n spawnClaudeCodeProcess: buildSpawnWrapper(\n params.sessionId,\n params.onProcessSpawned,\n params.onProcessExited,\n params.logger,\n ),\n }),\n };\n\n if (process.env.CLAUDE_CODE_EXECUTABLE) {\n options.pathToClaudeCodeExecutable = process.env.CLAUDE_CODE_EXECUTABLE;\n }\n\n if (params.isResume) {\n options.resume = params.sessionId;\n options.forkSession = params.forkSession ?? false;\n } else {\n options.sessionId = params.sessionId;\n options.model = DEFAULT_MODEL;\n }\n\n if (params.additionalDirectories) {\n options.additionalDirectories = params.additionalDirectories;\n }\n\n if (params.effort) {\n options.effort = params.effort;\n }\n\n clearStatsigCache();\n return options;\n}\n\nfunction clearStatsigCache(): void {\n const statsigPath = path.join(\n process.env.CLAUDE_CONFIG_DIR || path.join(os.homedir(), \".claude\"),\n \"statsig\",\n );\n fs.rm(statsigPath, { recursive: true, force: true }, () => {\n // Best-effort, ignore errors\n });\n}\n","const BRANCH_NAMING = `\n# Branch Naming\n\nWhen working in a detached HEAD state, create a descriptive branch name based on the work being done before committing. Do this automatically without asking the user.\n`;\n\nconst PLAN_MODE = `\n# Plan Mode\n\nOnly enter plan mode (EnterPlanMode) when the user is requesting a significant change in approach or direction mid-task. Do NOT enter plan mode for:\n- Confirmations or approvals (\"yes\", \"looks good\", \"continue\", \"go ahead\")\n- Minor clarifications or small adjustments\n- Answers to questions you asked (unless you are still in the initial planning phase and have not yet started executing)\n- Feedback that does not require replanning\n\nWhen in doubt, continue executing and incorporate the feedback inline.\n`;\n\nexport const APPENDED_INSTRUCTIONS = BRANCH_NAMING + PLAN_MODE;\n","import * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { minimatch } from \"minimatch\";\n\nconst ACP_TOOL_NAME_PREFIX = \"mcp__acp__\";\n\nconst acpToolNames = {\n read: `${ACP_TOOL_NAME_PREFIX}Read`,\n edit: `${ACP_TOOL_NAME_PREFIX}Edit`,\n write: `${ACP_TOOL_NAME_PREFIX}Write`,\n bash: `${ACP_TOOL_NAME_PREFIX}Bash`,\n};\n\nconst SHELL_OPERATORS = [\"&&\", \"||\", \";\", \"|\", \"$(\", \"`\", \"\\n\"];\n\nfunction containsShellOperator(str: string): boolean {\n return SHELL_OPERATORS.some((op) => str.includes(op));\n}\n\nconst FILE_EDITING_TOOLS = [acpToolNames.edit, acpToolNames.write];\n\nconst FILE_READING_TOOLS = [acpToolNames.read];\n\nconst TOOL_ARG_ACCESSORS: Record<\n string,\n (input: Record<string, unknown>) => string | undefined\n> = {\n [acpToolNames.read]: (input) => input?.file_path as string | undefined,\n [acpToolNames.edit]: (input) => input?.file_path as string | undefined,\n [acpToolNames.write]: (input) => input?.file_path as string | undefined,\n [acpToolNames.bash]: (input) => input?.command as string | undefined,\n};\n\ninterface ParsedRule {\n toolName: string;\n argument?: string;\n isWildcard?: boolean;\n}\n\nfunction parseRule(rule: string): ParsedRule {\n const match = rule.match(/^(\\w+)(?:\\((.+)\\))?$/);\n if (!match) {\n return { toolName: rule };\n }\n const toolName = match[1] ?? rule;\n const argument = match[2];\n if (argument?.endsWith(\":*\")) {\n return {\n toolName,\n argument: argument.slice(0, -2),\n isWildcard: true,\n };\n }\n return { toolName, argument };\n}\n\nfunction normalizePath(filePath: string, cwd: string): string {\n let resolved = filePath;\n if (resolved.startsWith(\"~/\")) {\n resolved = path.join(os.homedir(), resolved.slice(2));\n } else if (resolved.startsWith(\"./\")) {\n resolved = path.join(cwd, resolved.slice(2));\n } else if (!path.isAbsolute(resolved)) {\n resolved = path.join(cwd, resolved);\n }\n return path.normalize(resolved).replace(/\\\\/g, \"/\");\n}\n\nfunction matchesGlob(pattern: string, filePath: string, cwd: string): boolean {\n const normalizedPattern = normalizePath(pattern, cwd);\n const normalizedPath = normalizePath(filePath, cwd);\n return minimatch(normalizedPath, normalizedPattern, {\n dot: true,\n matchBase: false,\n nocase: process.platform === \"win32\",\n });\n}\n\nfunction matchesRule(\n rule: ParsedRule,\n toolName: string,\n toolInput: unknown,\n cwd: string,\n): boolean {\n const ruleAppliesToTool =\n (rule.toolName === \"Bash\" && toolName === acpToolNames.bash) ||\n (rule.toolName === \"Edit\" && FILE_EDITING_TOOLS.includes(toolName)) ||\n (rule.toolName === \"Read\" && FILE_READING_TOOLS.includes(toolName));\n\n if (!ruleAppliesToTool) {\n return false;\n }\n\n if (!rule.argument) {\n return true;\n }\n\n const argAccessor = TOOL_ARG_ACCESSORS[toolName];\n if (!argAccessor) {\n return true;\n }\n\n const actualArg = argAccessor(toolInput as Record<string, unknown>);\n if (!actualArg) {\n return false;\n }\n\n if (toolName === acpToolNames.bash) {\n if (rule.isWildcard) {\n if (!actualArg.startsWith(rule.argument)) {\n return false;\n }\n const remainder = actualArg.slice(rule.argument.length);\n if (containsShellOperator(remainder)) {\n return false;\n }\n return true;\n }\n return actualArg === rule.argument;\n }\n\n return matchesGlob(rule.argument, actualArg, cwd);\n}\n\nasync function loadSettingsFile(\n filePath: string | undefined,\n): Promise<ClaudeCodeSettings> {\n if (!filePath) {\n return {};\n }\n try {\n const content = await fs.promises.readFile(filePath, \"utf-8\");\n return JSON.parse(content) as ClaudeCodeSettings;\n } catch {\n return {};\n }\n}\n\nexport interface PermissionSettings {\n allow?: string[];\n deny?: string[];\n ask?: string[];\n additionalDirectories?: string[];\n defaultMode?: string;\n}\n\nexport interface ClaudeCodeSettings {\n permissions?: PermissionSettings;\n env?: Record<string, string>;\n model?: string;\n}\n\nexport type PermissionDecision = \"allow\" | \"deny\" | \"ask\";\n\nexport interface PermissionCheckResult {\n decision: PermissionDecision;\n rule?: string;\n source?: \"allow\" | \"deny\" | \"ask\";\n}\n\nexport function getManagedSettingsPath(): string {\n switch (process.platform) {\n case \"darwin\":\n return \"/Library/Application Support/ClaudeCode/managed-settings.json\";\n case \"linux\":\n return \"/etc/claude-code/managed-settings.json\";\n case \"win32\":\n return \"C:\\\\Program Files\\\\ClaudeCode\\\\managed-settings.json\";\n default:\n return \"/etc/claude-code/managed-settings.json\";\n }\n}\nexport class SettingsManager {\n private cwd: string;\n private userSettings: ClaudeCodeSettings = {};\n private projectSettings: ClaudeCodeSettings = {};\n private localSettings: ClaudeCodeSettings = {};\n private enterpriseSettings: ClaudeCodeSettings = {};\n private mergedSettings: ClaudeCodeSettings = {};\n private initialized = false;\n\n constructor(cwd: string) {\n this.cwd = cwd;\n }\n\n async initialize(): Promise<void> {\n if (this.initialized) {\n return;\n }\n await this.loadAllSettings();\n this.initialized = true;\n }\n\n private getUserSettingsPath(): string {\n const configDir =\n process.env.CLAUDE_CONFIG_DIR || path.join(os.homedir(), \".claude\");\n return path.join(configDir, \"settings.json\");\n }\n\n private getProjectSettingsPath(): string {\n return path.join(this.cwd, \".claude\", \"settings.json\");\n }\n\n private getLocalSettingsPath(): string {\n return path.join(this.cwd, \".claude\", \"settings.local.json\");\n }\n\n private async loadAllSettings(): Promise<void> {\n const [userSettings, projectSettings, localSettings, enterpriseSettings] =\n await Promise.all([\n loadSettingsFile(this.getUserSettingsPath()),\n loadSettingsFile(this.getProjectSettingsPath()),\n loadSettingsFile(this.getLocalSettingsPath()),\n loadSettingsFile(getManagedSettingsPath()),\n ]);\n this.userSettings = userSettings;\n this.projectSettings = projectSettings;\n this.localSettings = localSettings;\n this.enterpriseSettings = enterpriseSettings;\n this.mergeAllSettings();\n }\n\n private mergeAllSettings(): void {\n const allSettings = [\n this.userSettings,\n this.projectSettings,\n this.localSettings,\n this.enterpriseSettings,\n ];\n\n const permissions: PermissionSettings = {\n allow: [],\n deny: [],\n ask: [],\n };\n const merged: ClaudeCodeSettings = { permissions };\n\n for (const settings of allSettings) {\n if (settings.permissions) {\n if (settings.permissions.allow) {\n permissions.allow?.push(...settings.permissions.allow);\n }\n if (settings.permissions.deny) {\n permissions.deny?.push(...settings.permissions.deny);\n }\n if (settings.permissions.ask) {\n permissions.ask?.push(...settings.permissions.ask);\n }\n if (settings.permissions.additionalDirectories) {\n permissions.additionalDirectories = [\n ...(permissions.additionalDirectories || []),\n ...settings.permissions.additionalDirectories,\n ];\n }\n if (settings.permissions.defaultMode) {\n permissions.defaultMode = settings.permissions.defaultMode;\n }\n }\n if (settings.env) {\n merged.env = { ...merged.env, ...settings.env };\n }\n if (settings.model) {\n merged.model = settings.model;\n }\n }\n\n this.mergedSettings = merged;\n }\n\n checkPermission(toolName: string, toolInput: unknown): PermissionCheckResult {\n if (!toolName.startsWith(ACP_TOOL_NAME_PREFIX)) {\n return { decision: \"ask\" };\n }\n\n const permissions = this.mergedSettings.permissions;\n if (!permissions) {\n return { decision: \"ask\" };\n }\n\n for (const rule of permissions.deny || []) {\n const parsed = parseRule(rule);\n if (matchesRule(parsed, toolName, toolInput, this.cwd)) {\n return { decision: \"deny\", rule, source: \"deny\" };\n }\n }\n\n for (const rule of permissions.allow || []) {\n const parsed = parseRule(rule);\n if (matchesRule(parsed, toolName, toolInput, this.cwd)) {\n return { decision: \"allow\", rule, source: \"allow\" };\n }\n }\n\n for (const rule of permissions.ask || []) {\n const parsed = parseRule(rule);\n if (matchesRule(parsed, toolName, toolInput, this.cwd)) {\n return { decision: \"ask\", rule, source: \"ask\" };\n }\n }\n\n return { decision: \"ask\" };\n }\n\n getSettings(): ClaudeCodeSettings {\n return this.mergedSettings;\n }\n\n getCwd(): string {\n return this.cwd;\n }\n\n async setCwd(cwd: string): Promise<void> {\n if (this.cwd === cwd) {\n return;\n }\n this.dispose();\n this.cwd = cwd;\n this.initialized = false;\n await this.initialize();\n }\n\n dispose(): void {\n this.initialized = false;\n }\n}\n","import { type ChildProcess, spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { delimiter, dirname } from \"node:path\";\nimport type { Readable, Writable } from \"node:stream\";\nimport type { ProcessSpawnedCallback } from \"../../types\";\nimport { Logger } from \"../../utils/logger\";\n\nexport interface CodexProcessOptions {\n cwd?: string;\n apiBaseUrl?: string;\n apiKey?: string;\n model?: string;\n binaryPath?: string;\n logger?: Logger;\n processCallbacks?: ProcessSpawnedCallback;\n}\n\nexport interface CodexProcess {\n process: ChildProcess;\n stdin: Writable;\n stdout: Readable;\n kill: () => void;\n}\n\nfunction buildConfigArgs(options: CodexProcessOptions): string[] {\n const args: string[] = [];\n\n args.push(\"-c\", `features.remote_models=false`);\n\n if (options.apiBaseUrl) {\n args.push(\"-c\", `model_provider=\"posthog\"`);\n args.push(\"-c\", `model_providers.posthog.name=\"PostHog Gateway\"`);\n args.push(\"-c\", `model_providers.posthog.base_url=\"${options.apiBaseUrl}\"`);\n args.push(\"-c\", `model_providers.posthog.wire_api=\"responses\"`);\n args.push(\n \"-c\",\n `model_providers.posthog.env_key=\"POSTHOG_GATEWAY_API_KEY\"`,\n );\n }\n\n if (options.model) {\n args.push(\"-c\", `model=\"${options.model}\"`);\n }\n\n return args;\n}\n\nfunction findCodexBinary(options: CodexProcessOptions): {\n command: string;\n args: string[];\n} {\n const configArgs = buildConfigArgs(options);\n\n if (options.binaryPath && existsSync(options.binaryPath)) {\n return { command: options.binaryPath, args: configArgs };\n }\n\n if (options.binaryPath) {\n throw new Error(\n `codex-acp binary not found at ${options.binaryPath}. Run \"node apps/code/scripts/download-binaries.mjs\" to download it.`,\n );\n }\n\n return { command: \"npx\", args: [\"@zed-industries/codex-acp\", ...configArgs] };\n}\n\nexport function spawnCodexProcess(options: CodexProcessOptions): CodexProcess {\n const logger =\n options.logger ?? new Logger({ debug: true, prefix: \"[CodexSpawn]\" });\n\n const env: NodeJS.ProcessEnv = { ...process.env };\n\n delete env.ELECTRON_RUN_AS_NODE;\n delete env.ELECTRON_NO_ASAR;\n\n if (options.apiKey) {\n env.POSTHOG_GATEWAY_API_KEY = options.apiKey;\n }\n\n const { command, args } = findCodexBinary(options);\n\n if (options.binaryPath && existsSync(options.binaryPath)) {\n const binDir = dirname(options.binaryPath);\n env.PATH = `${binDir}${delimiter}${env.PATH ?? \"\"}`;\n }\n\n logger.info(\"Spawning codex-acp process\", {\n command,\n args,\n cwd: options.cwd,\n hasApiBaseUrl: !!options.apiBaseUrl,\n hasApiKey: !!options.apiKey,\n binaryPath: options.binaryPath,\n });\n\n const child = spawn(command, args, {\n cwd: options.cwd,\n env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n detached: process.platform !== \"win32\",\n });\n\n child.stderr?.on(\"data\", (data: Buffer) => {\n logger.warn(\"codex-acp stderr:\", data.toString());\n });\n\n child.on(\"error\", (err) => {\n logger.error(\"codex-acp process error:\", err);\n });\n\n child.on(\"exit\", (code, signal) => {\n logger.info(\"codex-acp process exited\", { code, signal });\n if (child.pid && options.processCallbacks?.onProcessExited) {\n options.processCallbacks.onProcessExited(child.pid);\n }\n });\n\n if (!child.stdin || !child.stdout) {\n throw new Error(\"Failed to get stdio streams from codex-acp process\");\n }\n\n if (child.pid && options.processCallbacks?.onProcessSpawned) {\n options.processCallbacks.onProcessSpawned({\n pid: child.pid,\n command,\n });\n }\n\n return {\n process: child,\n stdin: child.stdin,\n stdout: child.stdout,\n kill: () => {\n logger.info(\"Killing codex-acp process\", { pid: child.pid });\n child.stdin?.destroy();\n child.stdout?.destroy();\n child.stderr?.destroy();\n child.kill(\"SIGTERM\");\n },\n };\n}\n","export type GatewayProduct = \"posthog_code\" | \"background_agents\";\n\nexport function getLlmGatewayUrl(\n posthogHost: string,\n product: GatewayProduct = \"posthog_code\",\n): string {\n const url = new URL(posthogHost);\n const hostname = url.hostname;\n\n // Local development (normalize 127.0.0.1 to localhost)\n if (hostname === \"localhost\" || hostname === \"127.0.0.1\") {\n return `${url.protocol}//localhost:3308/${product}`;\n }\n\n // Docker containers accessing host\n if (hostname === \"host.docker.internal\") {\n return `${url.protocol}//host.docker.internal:3308/${product}`;\n }\n\n // Production - extract region from hostname, default to US\n const region = hostname.match(/^(us|eu)\\.posthog\\.com$/)?.[1] ?? \"us\";\n return `https://gateway.${region}.posthog.com/${product}`;\n}\n","import packageJson from \"../package.json\" with { type: \"json\" };\nimport type {\n ArtifactType,\n PostHogAPIConfig,\n StoredEntry,\n Task,\n TaskRun,\n TaskRunArtifact,\n} from \"./types\";\nimport { getLlmGatewayUrl } from \"./utils/gateway\";\n\nexport { getLlmGatewayUrl };\n\nconst DEFAULT_USER_AGENT = `posthog/agent.hog.dev; version: ${packageJson.version}`;\n\nexport interface TaskArtifactUploadPayload {\n name: string;\n type: ArtifactType;\n content: string;\n content_type?: string;\n}\n\nexport type TaskRunUpdate = Partial<\n Pick<\n TaskRun,\n | \"status\"\n | \"branch\"\n | \"stage\"\n | \"error_message\"\n | \"output\"\n | \"state\"\n | \"environment\"\n >\n>;\n\nexport class PostHogAPIClient {\n private config: PostHogAPIConfig;\n\n constructor(config: PostHogAPIConfig) {\n this.config = config;\n }\n\n private get baseUrl(): string {\n const host = this.config.apiUrl.endsWith(\"/\")\n ? this.config.apiUrl.slice(0, -1)\n : this.config.apiUrl;\n return host;\n }\n\n private get headers(): Record<string, string> {\n return {\n Authorization: `Bearer ${this.config.getApiKey()}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": this.config.userAgent ?? DEFAULT_USER_AGENT,\n };\n }\n\n private async apiRequest<T>(\n endpoint: string,\n options: RequestInit = {},\n ): Promise<T> {\n const url = `${this.baseUrl}${endpoint}`;\n\n const response = await fetch(url, {\n ...options,\n headers: {\n ...this.headers,\n ...options.headers,\n },\n });\n\n if (!response.ok) {\n let errorMessage: string;\n try {\n const errorResponse = await response.json();\n errorMessage = `Failed request: [${response.status}] ${JSON.stringify(errorResponse)}`;\n } catch {\n errorMessage = `Failed request: [${response.status}] ${response.statusText}`;\n }\n throw new Error(errorMessage);\n }\n\n return response.json();\n }\n\n private getTeamId(): number {\n return this.config.projectId;\n }\n\n getApiKey(): string {\n return this.config.getApiKey();\n }\n\n getLlmGatewayUrl(): string {\n return getLlmGatewayUrl(this.baseUrl);\n }\n\n async getTask(taskId: string): Promise<Task> {\n const teamId = this.getTeamId();\n return this.apiRequest<Task>(`/api/projects/${teamId}/tasks/${taskId}/`);\n }\n\n async getTaskRun(taskId: string, runId: string): Promise<TaskRun> {\n const teamId = this.getTeamId();\n return this.apiRequest<TaskRun>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/`,\n );\n }\n\n async updateTaskRun(\n taskId: string,\n runId: string,\n payload: TaskRunUpdate,\n ): Promise<TaskRun> {\n const teamId = this.getTeamId();\n return this.apiRequest<TaskRun>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/`,\n {\n method: \"PATCH\",\n body: JSON.stringify(payload),\n },\n );\n }\n\n async appendTaskRunLog(\n taskId: string,\n runId: string,\n entries: StoredEntry[],\n ): Promise<TaskRun> {\n const teamId = this.getTeamId();\n return this.apiRequest<TaskRun>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/append_log/`,\n {\n method: \"POST\",\n body: JSON.stringify({ entries }),\n },\n );\n }\n\n async relayMessage(\n taskId: string,\n runId: string,\n text: string,\n ): Promise<void> {\n const teamId = this.getTeamId();\n await this.apiRequest<{ status: string }>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/relay_message/`,\n {\n method: \"POST\",\n body: JSON.stringify({ text }),\n },\n );\n }\n\n async uploadTaskArtifacts(\n taskId: string,\n runId: string,\n artifacts: TaskArtifactUploadPayload[],\n ): Promise<TaskRunArtifact[]> {\n if (!artifacts.length) {\n return [];\n }\n\n const teamId = this.getTeamId();\n const response = await this.apiRequest<{ artifacts: TaskRunArtifact[] }>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/artifacts/`,\n {\n method: \"POST\",\n body: JSON.stringify({ artifacts }),\n },\n );\n\n return response.artifacts ?? [];\n }\n\n async getArtifactPresignedUrl(\n taskId: string,\n runId: string,\n storagePath: string,\n ): Promise<string | null> {\n const teamId = this.getTeamId();\n try {\n const response = await this.apiRequest<{\n url: string;\n expires_in: number;\n }>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/artifacts/presign/`,\n {\n method: \"POST\",\n body: JSON.stringify({ storage_path: storagePath }),\n },\n );\n return response.url;\n } catch {\n return null;\n }\n }\n\n /**\n * Download artifact content by storage path\n * Gets a presigned URL and fetches the content\n */\n async downloadArtifact(\n taskId: string,\n runId: string,\n storagePath: string,\n ): Promise<ArrayBuffer | null> {\n const url = await this.getArtifactPresignedUrl(taskId, runId, storagePath);\n if (!url) {\n return null;\n }\n\n try {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to download artifact: ${response.status}`);\n }\n return response.arrayBuffer();\n } catch {\n return null;\n }\n }\n\n /**\n * Fetch logs for a task run via the logs API endpoint\n * @param taskRun - The task run to fetch logs for\n * @returns Array of stored entries, or empty array if no logs available\n */\n async fetchTaskRunLogs(taskRun: TaskRun): Promise<StoredEntry[]> {\n const teamId = this.getTeamId();\n\n try {\n const response = await fetch(\n `${this.baseUrl}/api/projects/${teamId}/tasks/${taskRun.task}/runs/${taskRun.id}/logs`,\n { headers: this.headers },\n );\n\n if (!response.ok) {\n if (response.status === 404) {\n return [];\n }\n throw new Error(\n `Failed to fetch logs: ${response.status} ${response.statusText}`,\n );\n }\n\n const content = await response.text();\n\n if (!content.trim()) {\n return [];\n }\n\n // Parse newline-delimited JSON\n return content\n .trim()\n .split(\"\\n\")\n .map((line) => JSON.parse(line) as StoredEntry);\n } catch (error) {\n throw new Error(\n `Failed to fetch task run logs: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n}\n","import fs from \"node:fs\";\nimport fsp from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { SessionContext } from \"./otel-log-writer\";\nimport type { PostHogAPIClient } from \"./posthog-api\";\nimport type { StoredNotification } from \"./types\";\nimport { Logger } from \"./utils/logger\";\n\nexport interface SessionLogWriterOptions {\n /** PostHog API client for log persistence */\n posthogAPI?: PostHogAPIClient;\n /** Logger instance */\n logger?: Logger;\n /** Local cache path for instant log loading (e.g., ~/.posthog-code) */\n localCachePath?: string;\n}\n\ninterface ChunkBuffer {\n text: string;\n firstTimestamp: string;\n}\n\ninterface SessionState {\n context: SessionContext;\n chunkBuffer?: ChunkBuffer;\n lastAgentMessage?: string;\n currentTurnMessages: string[];\n}\n\nexport class SessionLogWriter {\n private static readonly FLUSH_DEBOUNCE_MS = 500;\n private static readonly FLUSH_MAX_INTERVAL_MS = 5000;\n private static readonly MAX_FLUSH_RETRIES = 10;\n private static readonly MAX_RETRY_DELAY_MS = 30_000;\n private static readonly SESSIONS_MAX_AGE_MS = 30 * 24 * 60 * 60 * 1000;\n\n private posthogAPI?: PostHogAPIClient;\n private pendingEntries: Map<string, StoredNotification[]> = new Map();\n private flushTimeouts: Map<string, NodeJS.Timeout> = new Map();\n private lastFlushAttemptTime: Map<string, number> = new Map();\n private retryCounts: Map<string, number> = new Map();\n private sessions: Map<string, SessionState> = new Map();\n\n private logger: Logger;\n private localCachePath?: string;\n\n constructor(options: SessionLogWriterOptions = {}) {\n this.posthogAPI = options.posthogAPI;\n this.localCachePath = options.localCachePath;\n this.logger =\n options.logger ??\n new Logger({ debug: false, prefix: \"[SessionLogWriter]\" });\n }\n\n async flushAll(): Promise<void> {\n const sessionIds = [...this.sessions.keys()];\n const flushPromises: Promise<void>[] = [];\n for (const sessionId of sessionIds) {\n flushPromises.push(this.flush(sessionId));\n }\n await Promise.all(flushPromises);\n }\n\n register(sessionId: string, context: SessionContext): void {\n if (this.sessions.has(sessionId)) {\n return;\n }\n\n this.logger.info(\"Session registered\", {\n taskId: context.taskId,\n runId: context.runId,\n });\n this.sessions.set(sessionId, { context, currentTurnMessages: [] });\n\n this.lastFlushAttemptTime.set(sessionId, Date.now());\n\n if (this.localCachePath) {\n const sessionDir = path.join(\n this.localCachePath,\n \"sessions\",\n context.runId,\n );\n try {\n fs.mkdirSync(sessionDir, { recursive: true });\n } catch (error) {\n this.logger.warn(\"Failed to create local cache directory\", {\n sessionDir,\n error,\n });\n }\n }\n }\n\n isRegistered(sessionId: string): boolean {\n return this.sessions.has(sessionId);\n }\n\n appendRawLine(sessionId: string, line: string): void {\n const session = this.sessions.get(sessionId);\n if (!session) {\n this.logger.warn(\"appendRawLine called for unregistered session\", {\n sessionId,\n });\n return;\n }\n\n try {\n const message = JSON.parse(line);\n const timestamp = new Date().toISOString();\n\n // Check if this is an agent_message_chunk event\n if (this.isAgentMessageChunk(message)) {\n const text = this.extractChunkText(message);\n if (text) {\n if (!session.chunkBuffer) {\n session.chunkBuffer = { text, firstTimestamp: timestamp };\n } else {\n session.chunkBuffer.text += text;\n }\n }\n // Don't emit chunk events\n return;\n }\n\n // Non-chunk event: flush any buffered chunks first\n this.emitCoalescedMessage(sessionId, session);\n\n const nonChunkAgentText = this.extractAgentMessageText(message);\n if (nonChunkAgentText) {\n session.lastAgentMessage = nonChunkAgentText;\n session.currentTurnMessages.push(nonChunkAgentText);\n }\n\n const entry: StoredNotification = {\n type: \"notification\",\n timestamp,\n notification: message,\n };\n\n this.writeToLocalCache(sessionId, entry);\n\n if (this.posthogAPI) {\n const pending = this.pendingEntries.get(sessionId) ?? [];\n pending.push(entry);\n this.pendingEntries.set(sessionId, pending);\n this.scheduleFlush(sessionId);\n }\n } catch {\n this.logger.warn(\"Failed to parse raw line for persistence\", {\n taskId: session.context.taskId,\n runId: session.context.runId,\n lineLength: line.length,\n });\n }\n }\n\n async flush(sessionId: string): Promise<void> {\n const session = this.sessions.get(sessionId);\n if (!session) {\n this.logger.warn(\"flush: no session found\", { sessionId });\n return;\n }\n\n // Emit any buffered chunks before flushing\n this.emitCoalescedMessage(sessionId, session);\n\n const pending = this.pendingEntries.get(sessionId);\n if (!this.posthogAPI || !pending?.length) {\n return;\n }\n\n this.pendingEntries.delete(sessionId);\n const timeout = this.flushTimeouts.get(sessionId);\n if (timeout) {\n clearTimeout(timeout);\n this.flushTimeouts.delete(sessionId);\n }\n\n this.lastFlushAttemptTime.set(sessionId, Date.now());\n\n try {\n await this.posthogAPI.appendTaskRunLog(\n session.context.taskId,\n session.context.runId,\n pending,\n );\n this.retryCounts.set(sessionId, 0);\n } catch (error) {\n const retryCount = (this.retryCounts.get(sessionId) ?? 0) + 1;\n this.retryCounts.set(sessionId, retryCount);\n\n if (retryCount >= SessionLogWriter.MAX_FLUSH_RETRIES) {\n this.logger.error(\n `Dropping ${pending.length} session log entries after ${retryCount} failed flush attempts`,\n {\n taskId: session.context.taskId,\n runId: session.context.runId,\n error,\n },\n );\n this.retryCounts.set(sessionId, 0);\n } else {\n if (retryCount === 1) {\n this.logger.warn(\n `Failed to persist session logs, will retry (up to ${SessionLogWriter.MAX_FLUSH_RETRIES} attempts)`,\n {\n taskId: session.context.taskId,\n runId: session.context.runId,\n error: error instanceof Error ? error.message : String(error),\n },\n );\n }\n const currentPending = this.pendingEntries.get(sessionId) ?? [];\n this.pendingEntries.set(sessionId, [...pending, ...currentPending]);\n this.scheduleFlush(sessionId);\n }\n }\n }\n\n private isAgentMessageChunk(message: Record<string, unknown>): boolean {\n if (message.method !== \"session/update\") return false;\n const params = message.params as Record<string, unknown> | undefined;\n const update = params?.update as Record<string, unknown> | undefined;\n return update?.sessionUpdate === \"agent_message_chunk\";\n }\n\n private extractChunkText(message: Record<string, unknown>): string {\n const params = message.params as Record<string, unknown> | undefined;\n const update = params?.update as Record<string, unknown> | undefined;\n const content = update?.content as\n | { type: string; text?: string }\n | undefined;\n if (content?.type === \"text\" && content.text) {\n return content.text;\n }\n return \"\";\n }\n\n private emitCoalescedMessage(sessionId: string, session: SessionState): void {\n if (!session.chunkBuffer) return;\n\n const { text, firstTimestamp } = session.chunkBuffer;\n session.chunkBuffer = undefined;\n session.lastAgentMessage = text;\n session.currentTurnMessages.push(text);\n\n const entry: StoredNotification = {\n type: \"notification\",\n timestamp: firstTimestamp,\n notification: {\n jsonrpc: \"2.0\",\n method: \"session/update\",\n params: {\n update: {\n sessionUpdate: \"agent_message\",\n content: { type: \"text\", text },\n },\n },\n },\n };\n\n this.writeToLocalCache(sessionId, entry);\n\n if (this.posthogAPI) {\n const pending = this.pendingEntries.get(sessionId) ?? [];\n pending.push(entry);\n this.pendingEntries.set(sessionId, pending);\n this.scheduleFlush(sessionId);\n }\n }\n\n getLastAgentMessage(sessionId: string): string | undefined {\n return this.sessions.get(sessionId)?.lastAgentMessage;\n }\n\n getFullAgentResponse(sessionId: string): string | undefined {\n const session = this.sessions.get(sessionId);\n if (!session || session.currentTurnMessages.length === 0) return undefined;\n return session.currentTurnMessages.join(\"\\n\\n\");\n }\n\n resetTurnMessages(sessionId: string): void {\n const session = this.sessions.get(sessionId);\n if (session) {\n session.currentTurnMessages = [];\n }\n }\n\n private extractAgentMessageText(\n message: Record<string, unknown>,\n ): string | null {\n if (message.method !== \"session/update\") {\n return null;\n }\n\n const params = message.params as Record<string, unknown> | undefined;\n const update = params?.update as Record<string, unknown> | undefined;\n if (update?.sessionUpdate !== \"agent_message\") {\n return null;\n }\n\n const content = update.content as\n | { type?: string; text?: string }\n | undefined;\n if (content?.type === \"text\" && typeof content.text === \"string\") {\n const trimmed = content.text.trim();\n return trimmed.length > 0 ? trimmed : null;\n }\n\n if (typeof update.message === \"string\") {\n const trimmed = update.message.trim();\n return trimmed.length > 0 ? trimmed : null;\n }\n\n return null;\n }\n\n private scheduleFlush(sessionId: string): void {\n const existing = this.flushTimeouts.get(sessionId);\n if (existing) clearTimeout(existing);\n\n const retryCount = this.retryCounts.get(sessionId) ?? 0;\n const lastAttempt = this.lastFlushAttemptTime.get(sessionId) ?? 0;\n const elapsed = Date.now() - lastAttempt;\n\n let delay: number;\n if (retryCount > 0) {\n // Exponential backoff on retries: FLUSH_DEBOUNCE_MS * 2^retryCount, capped\n delay = Math.min(\n SessionLogWriter.FLUSH_DEBOUNCE_MS * 2 ** retryCount,\n SessionLogWriter.MAX_RETRY_DELAY_MS,\n );\n } else if (elapsed >= SessionLogWriter.FLUSH_MAX_INTERVAL_MS) {\n // If we've been accumulating for longer than the max interval, flush immediately\n delay = 0;\n } else {\n delay = SessionLogWriter.FLUSH_DEBOUNCE_MS;\n }\n\n const timeout = setTimeout(() => this.flush(sessionId), delay);\n this.flushTimeouts.set(sessionId, timeout);\n }\n\n private writeToLocalCache(\n sessionId: string,\n entry: StoredNotification,\n ): void {\n if (!this.localCachePath) return;\n\n const session = this.sessions.get(sessionId);\n if (!session) return;\n\n const logPath = path.join(\n this.localCachePath,\n \"sessions\",\n session.context.runId,\n \"logs.ndjson\",\n );\n\n try {\n fs.appendFileSync(logPath, `${JSON.stringify(entry)}\\n`);\n } catch (error) {\n this.logger.warn(\"Failed to write to local cache\", {\n taskId: session.context.taskId,\n runId: session.context.runId,\n logPath,\n error,\n });\n }\n }\n\n static async cleanupOldSessions(localCachePath: string): Promise<number> {\n const sessionsDir = path.join(localCachePath, \"sessions\");\n let deleted = 0;\n try {\n const entries = await fsp.readdir(sessionsDir);\n const now = Date.now();\n for (const entry of entries) {\n const entryPath = path.join(sessionsDir, entry);\n try {\n const stats = await fsp.stat(entryPath);\n if (\n stats.isDirectory() &&\n now - stats.birthtimeMs > SessionLogWriter.SESSIONS_MAX_AGE_MS\n ) {\n await fsp.rm(entryPath, { recursive: true, force: true });\n deleted++;\n }\n } catch {\n // Skip entries we can't stat\n }\n }\n } catch {\n // Sessions dir may not exist yet\n }\n return deleted;\n }\n}\n","import {\n createAcpConnection,\n type InProcessAcpConnection,\n} from \"./adapters/acp-connection\";\nimport {\n BLOCKED_MODELS,\n DEFAULT_GATEWAY_MODEL,\n fetchModelsList,\n} from \"./gateway-models\";\nimport { PostHogAPIClient, type TaskRunUpdate } from \"./posthog-api\";\nimport { SessionLogWriter } from \"./session-log-writer\";\nimport type { AgentConfig, TaskExecutionOptions } from \"./types\";\nimport { Logger } from \"./utils/logger\";\n\nexport class Agent {\n private posthogAPI?: PostHogAPIClient;\n private logger: Logger;\n private acpConnection?: InProcessAcpConnection;\n private taskRunId?: string;\n private sessionLogWriter?: SessionLogWriter;\n\n constructor(config: AgentConfig) {\n this.logger = new Logger({\n debug: config.debug || false,\n prefix: \"[PostHog Agent]\",\n onLog: config.onLog,\n });\n\n if (config.posthog) {\n this.posthogAPI = new PostHogAPIClient(config.posthog);\n }\n\n if (config.posthog && !config.skipLogPersistence) {\n this.sessionLogWriter = new SessionLogWriter({\n posthogAPI: this.posthogAPI,\n logger: this.logger.child(\"SessionLogWriter\"),\n localCachePath: config.localCachePath,\n });\n\n if (config.localCachePath) {\n SessionLogWriter.cleanupOldSessions(config.localCachePath).catch(\n () => {},\n );\n }\n }\n }\n\n private _configureLlmGateway(overrideUrl?: string): {\n gatewayUrl: string;\n apiKey: string;\n } | null {\n if (!this.posthogAPI) {\n return null;\n }\n\n try {\n const gatewayUrl = overrideUrl ?? this.posthogAPI.getLlmGatewayUrl();\n const apiKey = this.posthogAPI.getApiKey();\n\n process.env.OPENAI_BASE_URL = `${gatewayUrl}/v1`;\n process.env.OPENAI_API_KEY = apiKey;\n process.env.ANTHROPIC_BASE_URL = gatewayUrl;\n process.env.ANTHROPIC_AUTH_TOKEN = apiKey;\n\n return { gatewayUrl, apiKey };\n } catch (error) {\n this.logger.error(\"Failed to configure LLM gateway\", error);\n throw error;\n }\n }\n\n async run(\n taskId: string,\n taskRunId: string,\n options: TaskExecutionOptions = {},\n ): Promise<InProcessAcpConnection> {\n const gatewayConfig = this._configureLlmGateway(options.gatewayUrl);\n this.logger.info(\"Configured LLM gateway\", {\n adapter: options.adapter,\n });\n this.taskRunId = taskRunId;\n\n let allowedModelIds: Set<string> | undefined;\n let sanitizedModel =\n options.model && !BLOCKED_MODELS.has(options.model)\n ? options.model\n : undefined;\n if (options.adapter === \"codex\" && gatewayConfig) {\n const models = await fetchModelsList({\n gatewayUrl: gatewayConfig.gatewayUrl,\n });\n const codexModelIds = models\n .filter((model) => {\n if (BLOCKED_MODELS.has(model.id)) return false;\n if (model.owned_by) {\n return model.owned_by === \"openai\";\n }\n return model.id.startsWith(\"gpt-\") || model.id.startsWith(\"openai/\");\n })\n .map((model) => model.id);\n\n if (codexModelIds.length > 0) {\n allowedModelIds = new Set(codexModelIds);\n }\n\n if (!sanitizedModel || !allowedModelIds?.has(sanitizedModel)) {\n sanitizedModel = codexModelIds[0];\n }\n }\n if (!sanitizedModel && options.adapter !== \"codex\") {\n sanitizedModel = DEFAULT_GATEWAY_MODEL;\n }\n\n this.acpConnection = createAcpConnection({\n adapter: options.adapter,\n logWriter: this.sessionLogWriter,\n taskRunId,\n taskId,\n deviceType: \"local\",\n logger: this.logger,\n processCallbacks: options.processCallbacks,\n allowedModelIds,\n codexOptions:\n options.adapter === \"codex\" && gatewayConfig\n ? {\n cwd: options.repositoryPath,\n apiBaseUrl: `${gatewayConfig.gatewayUrl}/v1`,\n apiKey: gatewayConfig.apiKey,\n binaryPath: options.codexBinaryPath,\n model: sanitizedModel,\n }\n : undefined,\n });\n\n return this.acpConnection;\n }\n\n async attachPullRequestToTask(\n taskId: string,\n prUrl: string,\n branchName?: string,\n ): Promise<void> {\n this.logger.info(\"Attaching PR to task run\", { taskId, prUrl, branchName });\n\n if (!this.posthogAPI || !this.taskRunId) {\n const error = new Error(\n \"PostHog API not configured or no active run. Cannot attach PR to task.\",\n );\n this.logger.error(\"PostHog API not configured\", error);\n throw error;\n }\n\n const updates: TaskRunUpdate = {\n output: { pr_url: prUrl },\n };\n if (branchName) {\n updates.branch = branchName;\n }\n\n await this.posthogAPI.updateTaskRun(taskId, this.taskRunId, updates);\n this.logger.debug(\"PR attached to task run\", {\n taskId,\n taskRunId: this.taskRunId,\n prUrl,\n });\n }\n\n getPosthogAPI(): PostHogAPIClient | undefined {\n return this.posthogAPI;\n }\n\n async flushAllLogs(): Promise<void> {\n await this.sessionLogWriter?.flushAll();\n }\n\n async cleanup(): Promise<void> {\n if (this.sessionLogWriter && this.taskRunId) {\n await this.sessionLogWriter.flush(this.taskRunId);\n }\n await this.acpConnection?.cleanup();\n }\n}\n"],"mappings":"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","names":["WritableStream","resolve","fs","os","path","RequestError","resolve","text","path","path","resolve","path","input","text","text","path","ALLOW_BYPASS","fs","os","path","fs","os","path","text","RequestError","resolve","availableModes","spawn","existsSync","existsSync","spawn","filteredOptions","currentAllowed","nextCurrent","sessionId","text","writer","taskRunId","text","fs","path","path","fs","text","delay"]}
|
|
1
|
+
{"version":3,"sources":["../src/adapters/acp-connection.ts","../src/acp-extensions.ts","../src/gateway-models.ts","../src/utils/logger.ts","../src/utils/streams.ts","../src/adapters/claude/claude-agent.ts","../package.json","../src/utils/common.ts","../src/adapters/base-acp-agent.ts","../src/adapters/claude/conversion/acp-to-sdk.ts","../src/adapters/claude/conversion/sdk-to-acp.ts","../src/utils/acp-content.ts","../src/adapters/claude/hooks.ts","../src/adapters/claude/conversion/tool-use-to-acp.ts","../src/adapters/claude/mcp/tool-metadata.ts","../src/adapters/claude/plan/utils.ts","../src/adapters/claude/questions/utils.ts","../src/execution-mode.ts","../src/adapters/claude/tools.ts","../src/adapters/claude/permissions/permission-options.ts","../src/adapters/claude/permissions/permission-handlers.ts","../src/adapters/claude/session/commands.ts","../src/adapters/claude/session/mcp-config.ts","../src/adapters/claude/session/models.ts","../src/adapters/claude/session/options.ts","../src/adapters/claude/session/instructions.ts","../src/adapters/claude/session/settings.ts","../src/adapters/codex/spawn.ts","../src/utils/gateway.ts","../src/posthog-api.ts","../src/session-log-writer.ts","../src/agent.ts"],"sourcesContent":["import { AgentSideConnection, ndJsonStream } from \"@agentclientprotocol/sdk\";\nimport { POSTHOG_NOTIFICATIONS } from \"../acp-extensions\";\nimport { formatModelId } from \"../gateway-models\";\nimport type { SessionLogWriter } from \"../session-log-writer\";\nimport type { ProcessSpawnedCallback } from \"../types\";\nimport { Logger } from \"../utils/logger\";\nimport {\n createBidirectionalStreams,\n createTappedWritableStream,\n nodeReadableToWebReadable,\n nodeWritableToWebWritable,\n type StreamPair,\n} from \"../utils/streams\";\nimport { ClaudeAcpAgent } from \"./claude/claude-agent\";\nimport { type CodexProcessOptions, spawnCodexProcess } from \"./codex/spawn\";\n\ntype AgentAdapter = \"claude\" | \"codex\";\n\nexport type AcpConnectionConfig = {\n adapter?: AgentAdapter;\n logWriter?: SessionLogWriter;\n taskRunId?: string;\n taskId?: string;\n /** Deployment environment - \"local\" for desktop, \"cloud\" for cloud sandbox */\n deviceType?: \"local\" | \"cloud\";\n logger?: Logger;\n processCallbacks?: ProcessSpawnedCallback;\n codexOptions?: CodexProcessOptions;\n allowedModelIds?: Set<string>;\n};\n\nexport type AcpConnection = {\n agentConnection?: AgentSideConnection;\n clientStreams: StreamPair;\n cleanup: () => Promise<void>;\n};\n\nexport type InProcessAcpConnection = AcpConnection;\n\ntype ModelOption = { value?: string; name?: string };\ntype ModelGroup = { group?: string; name?: string; options?: ModelOption[] };\n\ntype ConfigOption = {\n id?: string;\n category?: string | null;\n currentValue?: string;\n options?: Array<ModelOption | ModelGroup>;\n};\n\nfunction isGroupedOptions(\n options: NonNullable<ConfigOption[\"options\"]>,\n): options is ModelGroup[] {\n return options.length > 0 && \"group\" in options[0];\n}\n\nfunction formatOption(o: ModelOption): ModelOption {\n if (!o.value) return o;\n return { ...o, name: formatModelId(o.value) };\n}\n\nfunction filterModelConfigOptions(\n msg: Record<string, unknown>,\n allowedModelIds: Set<string>,\n): Record<string, unknown> | null {\n const payload = msg as {\n method?: string;\n result?: { configOptions?: ConfigOption[] };\n params?: {\n update?: { sessionUpdate?: string; configOptions?: ConfigOption[] };\n };\n };\n\n const configOptions =\n payload.result?.configOptions ?? payload.params?.update?.configOptions;\n if (!configOptions) return null;\n\n const filtered = configOptions.map((opt) => {\n if (opt.category !== \"model\" || !opt.options) return opt;\n\n const options = opt.options;\n if (isGroupedOptions(options)) {\n const filteredOptions = options.map((group) => ({\n ...group,\n options: (group.options ?? [])\n .filter((o) => o?.value && allowedModelIds.has(o.value))\n .map(formatOption),\n }));\n const flat = filteredOptions.flatMap((g) => g.options ?? []);\n const currentAllowed =\n opt.currentValue && allowedModelIds.has(opt.currentValue);\n const nextCurrent =\n currentAllowed || flat.length === 0 ? opt.currentValue : flat[0]?.value;\n\n return {\n ...opt,\n currentValue: nextCurrent,\n options: filteredOptions,\n };\n }\n\n const valueOptions = options as ModelOption[];\n const filteredOptions = valueOptions\n .filter((o) => o?.value && allowedModelIds.has(o.value))\n .map(formatOption);\n const currentAllowed =\n opt.currentValue && allowedModelIds.has(opt.currentValue);\n const nextCurrent =\n currentAllowed || filteredOptions.length === 0\n ? opt.currentValue\n : filteredOptions[0]?.value;\n\n return {\n ...opt,\n currentValue: nextCurrent,\n options: filteredOptions,\n };\n });\n\n if (payload.result?.configOptions) {\n return { ...msg, result: { ...payload.result, configOptions: filtered } };\n }\n if (payload.params?.update?.configOptions) {\n return {\n ...msg,\n params: {\n ...payload.params,\n update: { ...payload.params.update, configOptions: filtered },\n },\n };\n }\n return null;\n}\n\nfunction extractReasoningEffort(\n configOptions: ConfigOption[] | undefined,\n): string | undefined {\n if (!configOptions) return undefined;\n const option = configOptions.find((opt) => opt.id === \"reasoning_effort\");\n return option?.currentValue ?? undefined;\n}\n\n/**\n * Creates an ACP connection with the specified agent framework.\n *\n * @param config - Configuration including framework selection\n * @returns Connection with agent and client streams\n */\nexport function createAcpConnection(\n config: AcpConnectionConfig = {},\n): AcpConnection {\n const adapterType = config.adapter ?? \"claude\";\n\n if (adapterType === \"codex\") {\n return createCodexConnection(config);\n }\n\n return createClaudeConnection(config);\n}\n\nfunction createClaudeConnection(config: AcpConnectionConfig): AcpConnection {\n const logger =\n config.logger?.child(\"AcpConnection\") ??\n new Logger({ debug: true, prefix: \"[AcpConnection]\" });\n const streams = createBidirectionalStreams();\n\n const { logWriter } = config;\n\n let agentWritable = streams.agent.writable;\n let clientWritable = streams.client.writable;\n\n if (config.taskRunId && logWriter) {\n if (!logWriter.isRegistered(config.taskRunId)) {\n logWriter.register(config.taskRunId, {\n taskId: config.taskId ?? config.taskRunId,\n runId: config.taskRunId,\n deviceType: config.deviceType,\n });\n }\n\n const taskRunId = config.taskRunId;\n agentWritable = createTappedWritableStream(streams.agent.writable, {\n onMessage: (line) => {\n logWriter.appendRawLine(taskRunId, line);\n },\n logger,\n });\n\n clientWritable = createTappedWritableStream(streams.client.writable, {\n onMessage: (line) => {\n logWriter.appendRawLine(taskRunId, line);\n },\n logger,\n });\n } else {\n logger.info(\"Tapped streams NOT enabled\", {\n hasTaskRunId: !!config.taskRunId,\n hasLogWriter: !!logWriter,\n });\n }\n\n const agentStream = ndJsonStream(agentWritable, streams.agent.readable);\n\n let agent: ClaudeAcpAgent | null = null;\n const agentConnection = new AgentSideConnection((client) => {\n agent = new ClaudeAcpAgent(client, config.processCallbacks);\n logger.info(`Created ${agent.adapterName} agent`);\n return agent;\n }, agentStream);\n\n return {\n agentConnection,\n clientStreams: {\n readable: streams.client.readable,\n writable: clientWritable,\n },\n cleanup: async () => {\n logger.info(\"Cleaning up ACP connection\");\n\n if (agent) {\n await agent.closeSession();\n }\n\n try {\n await streams.client.writable.close();\n } catch {\n // Stream may already be closed\n }\n try {\n await streams.agent.writable.close();\n } catch {\n // Stream may already be closed\n }\n },\n };\n}\n\nfunction createCodexConnection(config: AcpConnectionConfig): AcpConnection {\n const logger =\n config.logger?.child(\"CodexConnection\") ??\n new Logger({ debug: true, prefix: \"[CodexConnection]\" });\n\n const { logWriter } = config;\n const allowedModelIds = config.allowedModelIds;\n\n const codexProcess = spawnCodexProcess({\n ...config.codexOptions,\n logger,\n processCallbacks: config.processCallbacks,\n });\n\n let clientReadable = nodeReadableToWebReadable(codexProcess.stdout);\n let clientWritable = nodeWritableToWebWritable(codexProcess.stdin);\n\n let isLoadingSession = false;\n let loadRequestId: string | number | null = null;\n let newSessionRequestId: string | number | null = null;\n let sdkSessionEmitted = false;\n const reasoningEffortBySessionId = new Map<string, string>();\n let injectedConfigId = 0;\n\n const decoder = new TextDecoder();\n const encoder = new TextEncoder();\n let readBuffer = \"\";\n\n const taskRunId = config.taskRunId;\n\n const filteringReadable = clientReadable.pipeThrough(\n new TransformStream<Uint8Array, Uint8Array>({\n transform(chunk, controller) {\n readBuffer += decoder.decode(chunk, { stream: true });\n const lines = readBuffer.split(\"\\n\");\n readBuffer = lines.pop() ?? \"\";\n\n const outputLines: string[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) {\n outputLines.push(line);\n continue;\n }\n\n let shouldFilter = false;\n\n try {\n const msg = JSON.parse(trimmed);\n const sessionId =\n msg?.params?.sessionId ?? msg?.result?.sessionId ?? null;\n const configOptions =\n msg?.result?.configOptions ?? msg?.params?.update?.configOptions;\n if (sessionId && configOptions) {\n const effort = extractReasoningEffort(configOptions);\n if (effort) {\n reasoningEffortBySessionId.set(sessionId, effort);\n }\n }\n\n if (\n !sdkSessionEmitted &&\n newSessionRequestId !== null &&\n msg.id === newSessionRequestId &&\n \"result\" in msg\n ) {\n const sessionId = msg.result?.sessionId;\n if (sessionId && taskRunId) {\n const sdkSessionNotification = {\n jsonrpc: \"2.0\",\n method: POSTHOG_NOTIFICATIONS.SDK_SESSION,\n params: {\n taskRunId,\n sessionId,\n adapter: \"codex\",\n },\n };\n outputLines.push(JSON.stringify(sdkSessionNotification));\n sdkSessionEmitted = true;\n }\n newSessionRequestId = null;\n }\n\n if (isLoadingSession) {\n if (msg.id === loadRequestId && \"result\" in msg) {\n logger.debug(\"session/load complete, resuming stream\");\n isLoadingSession = false;\n loadRequestId = null;\n } else if (msg.method === \"session/update\") {\n shouldFilter = true;\n }\n }\n\n if (!shouldFilter && allowedModelIds && allowedModelIds.size > 0) {\n const updated = filterModelConfigOptions(msg, allowedModelIds);\n if (updated) {\n outputLines.push(JSON.stringify(updated));\n continue;\n }\n }\n } catch {\n // Not valid JSON, pass through\n }\n\n if (!shouldFilter) {\n outputLines.push(line);\n const isChunkNoise =\n trimmed.includes('\"sessionUpdate\":\"agent_message_chunk\"') ||\n trimmed.includes('\"sessionUpdate\":\"agent_thought_chunk\"');\n if (!isChunkNoise) {\n logger.debug(\"codex-acp stdout:\", trimmed);\n }\n }\n }\n\n if (outputLines.length > 0) {\n const output = `${outputLines.join(\"\\n\")}\\n`;\n controller.enqueue(encoder.encode(output));\n }\n },\n flush(controller) {\n if (readBuffer.trim()) {\n controller.enqueue(encoder.encode(readBuffer));\n }\n },\n }),\n );\n clientReadable = filteringReadable;\n\n const originalWritable = clientWritable;\n clientWritable = new WritableStream({\n write(chunk) {\n const text = decoder.decode(chunk, { stream: true });\n const trimmed = text.trim();\n logger.debug(\"codex-acp stdin:\", trimmed);\n\n try {\n const msg = JSON.parse(trimmed);\n if (\n msg.method === \"session/set_config_option\" &&\n msg.params?.configId === \"reasoning_effort\" &&\n msg.params?.sessionId &&\n msg.params?.value\n ) {\n reasoningEffortBySessionId.set(\n msg.params.sessionId,\n msg.params.value,\n );\n }\n if (msg.method === \"session/prompt\" && msg.params?.sessionId) {\n const effort = reasoningEffortBySessionId.get(msg.params.sessionId);\n if (effort) {\n const injection = {\n jsonrpc: \"2.0\",\n id: `reasoning_effort_${Date.now()}_${injectedConfigId++}`,\n method: \"session/set_config_option\",\n params: {\n sessionId: msg.params.sessionId,\n configId: \"reasoning_effort\",\n value: effort,\n },\n };\n const injectionLine = `${JSON.stringify(injection)}\\n`;\n const writer = originalWritable.getWriter();\n return writer\n .write(encoder.encode(injectionLine))\n .then(() => writer.releaseLock())\n .then(() => {\n const nextWriter = originalWritable.getWriter();\n return nextWriter\n .write(chunk)\n .finally(() => nextWriter.releaseLock());\n });\n }\n }\n if (msg.method === \"session/new\" && msg.id) {\n logger.debug(\"session/new detected, tracking request ID\");\n newSessionRequestId = msg.id;\n } else if (msg.method === \"session/load\" && msg.id) {\n logger.debug(\"session/load detected, pausing stream updates\");\n isLoadingSession = true;\n loadRequestId = msg.id;\n }\n } catch {\n // Not valid JSON\n }\n\n const writer = originalWritable.getWriter();\n return writer.write(chunk).finally(() => writer.releaseLock());\n },\n close() {\n const writer = originalWritable.getWriter();\n return writer.close().finally(() => writer.releaseLock());\n },\n });\n\n const shouldTapLogs = config.taskRunId && logWriter;\n\n if (shouldTapLogs && config.taskRunId) {\n const taskRunId = config.taskRunId;\n if (!logWriter.isRegistered(taskRunId)) {\n logWriter.register(taskRunId, {\n taskId: config.taskId ?? taskRunId,\n runId: taskRunId,\n });\n }\n\n clientWritable = createTappedWritableStream(clientWritable, {\n onMessage: (line) => {\n logWriter.appendRawLine(taskRunId, line);\n },\n logger,\n });\n\n const originalReadable = clientReadable;\n const logDecoder = new TextDecoder();\n let logBuffer = \"\";\n\n clientReadable = originalReadable.pipeThrough(\n new TransformStream<Uint8Array, Uint8Array>({\n transform(chunk, controller) {\n logBuffer += logDecoder.decode(chunk, { stream: true });\n const lines = logBuffer.split(\"\\n\");\n logBuffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (line.trim()) {\n logWriter.appendRawLine(taskRunId, line);\n }\n }\n\n controller.enqueue(chunk);\n },\n flush() {\n if (logBuffer.trim()) {\n logWriter.appendRawLine(taskRunId, logBuffer);\n }\n },\n }),\n );\n } else {\n logger.info(\"Tapped streams NOT enabled for Codex\", {\n hasTaskRunId: !!config.taskRunId,\n hasLogWriter: !!logWriter,\n });\n }\n\n return {\n agentConnection: undefined,\n clientStreams: {\n readable: clientReadable,\n writable: clientWritable,\n },\n cleanup: async () => {\n logger.info(\"Cleaning up Codex connection\");\n codexProcess.kill();\n\n try {\n await clientWritable.close();\n } catch {\n // Stream may already be closed\n }\n },\n };\n}\n","/**\n * PostHog-specific ACP extensions.\n *\n * These follow the ACP extensibility model:\n * - Custom notification methods are prefixed with `_posthog/`\n * - Custom data can be attached via `_meta` fields\n *\n * Note: When using `extNotification()` from the ACP SDK, it automatically\n * adds an extra underscore prefix (e.g., `_posthog/tree_snapshot` becomes\n * `__posthog/tree_snapshot` in the log). Code that reads logs should handle both.\n *\n * See: https://agentclientprotocol.com/docs/extensibility\n */\n\n/**\n * Custom notification methods for PostHog-specific events.\n * Used with AgentSideConnection.extNotification() or Client.extNotification()\n */\nexport const POSTHOG_NOTIFICATIONS = {\n /** Git branch was created for a task */\n BRANCH_CREATED: \"_posthog/branch_created\",\n\n /** Task run has started execution */\n RUN_STARTED: \"_posthog/run_started\",\n\n /** Task has completed (success or failure) */\n TASK_COMPLETE: \"_posthog/task_complete\",\n\n /** Agent finished processing a turn (prompt returned, waiting for next input) */\n TURN_COMPLETE: \"_posthog/turn_complete\",\n\n /** Error occurred during task execution */\n ERROR: \"_posthog/error\",\n\n /** Console/log output from the agent */\n CONSOLE: \"_posthog/console\",\n\n /** Maps taskRunId to agent's sessionId and adapter type (for resumption) */\n SDK_SESSION: \"_posthog/sdk_session\",\n\n /** Tree state snapshot captured (git tree hash + file archive) */\n TREE_SNAPSHOT: \"_posthog/tree_snapshot\",\n\n /** Agent mode changed (interactive/background) */\n MODE_CHANGE: \"_posthog/mode_change\",\n\n /** Request to resume a session from previous state */\n SESSION_RESUME: \"_posthog/session/resume\",\n\n /** User message sent from client to agent */\n USER_MESSAGE: \"_posthog/user_message\",\n\n /** Request to cancel current operation */\n CANCEL: \"_posthog/cancel\",\n\n /** Request to close the session */\n CLOSE: \"_posthog/close\",\n\n /** Agent status update (thinking, working, etc.) */\n STATUS: \"_posthog/status\",\n\n /** Task-level notification (progress, milestones) */\n TASK_NOTIFICATION: \"_posthog/task_notification\",\n\n /** Marks a boundary for log compaction */\n COMPACT_BOUNDARY: \"_posthog/compact_boundary\",\n} as const;\n","export interface GatewayModel {\n id: string;\n owned_by: string;\n context_window: number;\n supports_streaming: boolean;\n supports_vision: boolean;\n}\n\ninterface GatewayModelsResponse {\n object: \"list\";\n data: GatewayModel[];\n}\n\nexport interface FetchGatewayModelsOptions {\n gatewayUrl: string;\n}\n\nexport const DEFAULT_GATEWAY_MODEL = \"claude-opus-4-6\";\n\nexport const BLOCKED_MODELS = new Set([\"gpt-5-mini\", \"openai/gpt-5-mini\"]);\n\ntype ModelsListResponse =\n | {\n data?: Array<{ id?: string; owned_by?: string }>;\n models?: Array<{ id?: string; owned_by?: string }>;\n }\n | Array<{ id?: string; owned_by?: string }>;\n\nconst CACHE_TTL = 10 * 60 * 1000; // 10 minutes\n\nlet gatewayModelsCache: {\n models: GatewayModel[];\n expiry: number;\n url: string;\n} | null = null;\n\nexport async function fetchGatewayModels(\n options?: FetchGatewayModelsOptions,\n): Promise<GatewayModel[]> {\n const gatewayUrl = options?.gatewayUrl ?? process.env.ANTHROPIC_BASE_URL;\n if (!gatewayUrl) {\n return [];\n }\n\n if (\n gatewayModelsCache &&\n gatewayModelsCache.url === gatewayUrl &&\n Date.now() < gatewayModelsCache.expiry\n ) {\n return gatewayModelsCache.models;\n }\n\n const modelsUrl = `${gatewayUrl}/v1/models`;\n\n try {\n const response = await fetch(modelsUrl);\n\n if (!response.ok) {\n return [];\n }\n\n const data = (await response.json()) as GatewayModelsResponse;\n const models = (data.data ?? []).filter((m) => !BLOCKED_MODELS.has(m.id));\n gatewayModelsCache = {\n models,\n expiry: Date.now() + CACHE_TTL,\n url: gatewayUrl,\n };\n return models;\n } catch {\n return [];\n }\n}\n\nexport function isAnthropicModel(model: GatewayModel): boolean {\n if (model.owned_by) {\n return model.owned_by === \"anthropic\";\n }\n return model.id.startsWith(\"claude-\") || model.id.startsWith(\"anthropic/\");\n}\n\nexport interface ModelInfo {\n id: string;\n owned_by?: string;\n}\n\nlet modelsListCache: {\n models: ModelInfo[];\n expiry: number;\n url: string;\n} | null = null;\n\nexport async function fetchModelsList(\n options?: FetchGatewayModelsOptions,\n): Promise<ModelInfo[]> {\n const gatewayUrl = options?.gatewayUrl ?? process.env.ANTHROPIC_BASE_URL;\n if (!gatewayUrl) {\n return [];\n }\n\n if (\n modelsListCache &&\n modelsListCache.url === gatewayUrl &&\n Date.now() < modelsListCache.expiry\n ) {\n return modelsListCache.models;\n }\n\n try {\n const modelsUrl = `${gatewayUrl}/v1/models`;\n const response = await fetch(modelsUrl);\n if (!response.ok) {\n return [];\n }\n const data = (await response.json()) as ModelsListResponse;\n const models = Array.isArray(data)\n ? data\n : (data.data ?? data.models ?? []);\n const results: ModelInfo[] = [];\n for (const model of models) {\n const id = model?.id ? String(model.id) : \"\";\n if (!id) continue;\n results.push({ id, owned_by: model?.owned_by });\n }\n modelsListCache = {\n models: results,\n expiry: Date.now() + CACHE_TTL,\n url: gatewayUrl,\n };\n return results;\n } catch {\n return [];\n }\n}\n\nconst PROVIDER_NAMES: Record<string, string> = {\n anthropic: \"Anthropic\",\n openai: \"OpenAI\",\n \"google-vertex\": \"Gemini\",\n};\n\nexport function getProviderName(ownedBy: string): string {\n return PROVIDER_NAMES[ownedBy] ?? ownedBy;\n}\n\nconst PROVIDER_PREFIXES = [\"anthropic/\", \"openai/\", \"google-vertex/\"];\n\nexport function formatGatewayModelName(model: GatewayModel): string {\n return formatModelId(model.id);\n}\n\nexport function formatModelId(modelId: string): string {\n let cleanId = modelId;\n for (const prefix of PROVIDER_PREFIXES) {\n if (cleanId.startsWith(prefix)) {\n cleanId = cleanId.slice(prefix.length);\n break;\n }\n }\n\n cleanId = cleanId.replace(/(\\d)-(\\d)/g, \"$1.$2\");\n\n const words = cleanId.split(/[-_]/).map((word) => {\n if (word.match(/^[0-9.]+$/)) return word;\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n });\n\n return words.join(\" \");\n}\n","import type { LogLevel as LogLevelType, OnLogCallback } from \"../types\";\n\nexport interface LoggerConfig {\n debug?: boolean;\n prefix?: string;\n scope?: string;\n onLog?: OnLogCallback;\n}\n\nexport class Logger {\n private debugEnabled: boolean;\n private prefix: string;\n private scope: string;\n private onLog?: OnLogCallback;\n\n constructor(config: LoggerConfig = {}) {\n this.debugEnabled = config.debug ?? false;\n this.prefix = config.prefix ?? \"[PostHog Agent]\";\n this.scope = config.scope ?? \"agent\";\n this.onLog = config.onLog;\n }\n\n private formatMessage(\n level: string,\n message: string,\n data?: unknown,\n ): string {\n const timestamp = new Date().toISOString();\n const base = `${timestamp} ${this.prefix} [${level}] ${message}`;\n\n if (data !== undefined) {\n return `${base} ${JSON.stringify(data, null, 2)}`;\n }\n\n return base;\n }\n\n private emitLog(level: LogLevelType, message: string, data?: unknown) {\n if (this.onLog) {\n this.onLog(level, this.scope, message, data);\n return;\n }\n\n const shouldLog = this.debugEnabled || level === \"error\";\n\n if (shouldLog) {\n console[level](this.formatMessage(level.toLowerCase(), message, data));\n }\n }\n\n error(message: string, error?: Error | unknown) {\n const data =\n error instanceof Error\n ? { message: error.message, stack: error.stack }\n : error;\n\n this.emitLog(\"error\", message, data);\n }\n\n warn(message: string, data?: unknown) {\n this.emitLog(\"warn\", message, data);\n }\n\n info(message: string, data?: unknown) {\n this.emitLog(\"info\", message, data);\n }\n\n debug(message: string, data?: unknown) {\n this.emitLog(\"debug\", message, data);\n }\n\n child(childPrefix: string): Logger {\n return new Logger({\n debug: this.debugEnabled,\n prefix: `${this.prefix} [${childPrefix}]`,\n scope: `${this.scope}:${childPrefix}`,\n onLog: this.onLog,\n });\n }\n}\n","import type { Readable, Writable } from \"node:stream\";\nimport { ReadableStream, WritableStream } from \"node:stream/web\";\nimport type { Logger } from \"./logger\";\n\nexport class Pushable<T> implements AsyncIterable<T> {\n private queue: T[] = [];\n private resolvers: ((value: IteratorResult<T>) => void)[] = [];\n private done = false;\n\n push(item: T) {\n const resolve = this.resolvers.shift();\n if (resolve) {\n resolve({ value: item, done: false });\n } else {\n this.queue.push(item);\n }\n }\n\n end() {\n this.done = true;\n for (const resolve of this.resolvers) {\n resolve({ value: undefined as unknown as T, done: true });\n }\n this.resolvers = [];\n }\n\n [Symbol.asyncIterator](): AsyncIterator<T> {\n return {\n next: (): Promise<IteratorResult<T>> => {\n if (this.queue.length > 0) {\n const value = this.queue.shift() as T;\n return Promise.resolve({ value, done: false });\n }\n if (this.done) {\n return Promise.resolve({\n value: undefined as unknown as T,\n done: true,\n });\n }\n return new Promise<IteratorResult<T>>((resolve) => {\n this.resolvers.push(resolve);\n });\n },\n };\n }\n}\n\nexport type StreamPair = {\n readable: globalThis.ReadableStream<Uint8Array>;\n writable: globalThis.WritableStream<Uint8Array>;\n};\n\nexport type BidirectionalStreamPair = {\n client: StreamPair;\n agent: StreamPair;\n};\n\nfunction pushableToReadableStream(\n pushable: Pushable<Uint8Array>,\n): globalThis.ReadableStream<Uint8Array> {\n const iterator = pushable[Symbol.asyncIterator]();\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n const { value, done } = await iterator.next();\n if (done) {\n controller.close();\n } else {\n controller.enqueue(value);\n }\n },\n }) as unknown as globalThis.ReadableStream<Uint8Array>;\n}\n\nexport function createBidirectionalStreams(): BidirectionalStreamPair {\n const clientToAgentPushable = new Pushable<Uint8Array>();\n const agentToClientPushable = new Pushable<Uint8Array>();\n\n const clientToAgentReadable = pushableToReadableStream(clientToAgentPushable);\n const agentToClientReadable = pushableToReadableStream(agentToClientPushable);\n\n const clientToAgentWritable = new WritableStream<Uint8Array>({\n write(chunk) {\n clientToAgentPushable.push(chunk);\n },\n close() {\n clientToAgentPushable.end();\n },\n }) as globalThis.WritableStream<Uint8Array>;\n\n const agentToClientWritable = new WritableStream<Uint8Array>({\n write(chunk) {\n agentToClientPushable.push(chunk);\n },\n close() {\n agentToClientPushable.end();\n },\n }) as globalThis.WritableStream<Uint8Array>;\n\n return {\n client: {\n readable: agentToClientReadable,\n writable: clientToAgentWritable,\n },\n agent: {\n readable: clientToAgentReadable,\n writable: agentToClientWritable,\n },\n };\n}\n\ntype MessageCallback = (line: string) => void;\n\nexport interface TappedStreamOptions {\n onMessage: MessageCallback;\n logger?: Logger;\n}\n\nexport function createTappedWritableStream(\n underlying: WritableStream<Uint8Array>,\n options: TappedStreamOptions,\n): WritableStream<Uint8Array> {\n const { onMessage, logger } = options;\n const decoder = new TextDecoder();\n let buffer = \"\";\n let _messageCount = 0;\n\n return new WritableStream({\n async write(chunk: Uint8Array) {\n buffer += decoder.decode(chunk, { stream: true });\n\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (!line.trim()) continue;\n _messageCount++;\n\n onMessage(line);\n }\n\n try {\n const writer = underlying.getWriter();\n await writer.write(chunk);\n writer.releaseLock();\n } catch (err) {\n // Stream may be closed if subprocess crashed - log but don't throw\n logger?.error(\"ACP write error\", err);\n }\n },\n async close() {\n try {\n const writer = underlying.getWriter();\n await writer.close();\n writer.releaseLock();\n } catch {\n // Stream may already be closed\n }\n },\n async abort(reason: unknown) {\n logger?.warn(\"Tapped stream aborted\", { reason });\n try {\n const writer = underlying.getWriter();\n await writer.abort(reason);\n writer.releaseLock();\n } catch {\n // Stream may already be closed\n }\n },\n });\n}\n\nexport function nodeReadableToWebReadable(\n nodeStream: Readable,\n): globalThis.ReadableStream<Uint8Array> {\n return new ReadableStream<Uint8Array>({\n start(controller) {\n nodeStream.on(\"data\", (chunk: Buffer) => {\n controller.enqueue(new Uint8Array(chunk));\n });\n nodeStream.on(\"end\", () => {\n controller.close();\n });\n nodeStream.on(\"error\", (err) => {\n controller.error(err);\n });\n },\n cancel() {\n nodeStream.destroy();\n },\n }) as unknown as globalThis.ReadableStream<Uint8Array>;\n}\n\nexport function nodeWritableToWebWritable(\n nodeStream: Writable,\n): globalThis.WritableStream<Uint8Array> {\n return new WritableStream<Uint8Array>({\n write(chunk) {\n return new Promise((resolve, reject) => {\n const ok = nodeStream.write(Buffer.from(chunk), (err) => {\n if (err) reject(err);\n });\n if (ok) {\n resolve();\n } else {\n nodeStream.once(\"drain\", resolve);\n }\n });\n },\n close() {\n return new Promise((resolve) => {\n nodeStream.end(resolve);\n });\n },\n abort(reason) {\n nodeStream.destroy(\n reason instanceof Error ? reason : new Error(String(reason)),\n );\n },\n }) as globalThis.WritableStream<Uint8Array>;\n}\n","import { randomUUID } from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport {\n type ModelInfo as AcpModelInfo,\n type AgentSideConnection,\n type ClientCapabilities,\n type ForkSessionRequest,\n type ForkSessionResponse,\n type InitializeRequest,\n type InitializeResponse,\n type ListSessionsRequest,\n type ListSessionsResponse,\n type LoadSessionRequest,\n type LoadSessionResponse,\n type NewSessionRequest,\n type NewSessionResponse,\n type PromptRequest,\n type PromptResponse,\n RequestError,\n type ResumeSessionRequest,\n type ResumeSessionResponse,\n type SessionConfigOption,\n type SessionConfigOptionCategory,\n type SessionConfigSelectOption,\n type SessionModelState,\n type SessionModeState,\n type SetSessionConfigOptionRequest,\n type SetSessionConfigOptionResponse,\n type SetSessionModelRequest,\n type SetSessionModelResponse,\n type SetSessionModeRequest,\n type SetSessionModeResponse,\n type Usage,\n} from \"@agentclientprotocol/sdk\";\nimport {\n type CanUseTool,\n getSessionMessages,\n listSessions,\n type Query,\n query,\n type SDKUserMessage,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport { v7 as uuidv7 } from \"uuid\";\nimport packageJson from \"../../../package.json\" with { type: \"json\" };\nimport { unreachable, withTimeout } from \"../../utils/common\";\nimport { Logger } from \"../../utils/logger\";\nimport { Pushable } from \"../../utils/streams\";\nimport { BaseAcpAgent } from \"../base-acp-agent\";\nimport { promptToClaude } from \"./conversion/acp-to-sdk\";\nimport {\n handleResultMessage,\n handleStreamEvent,\n handleSystemMessage,\n handleUserAssistantMessage,\n} from \"./conversion/sdk-to-acp\";\nimport {\n fetchMcpToolMetadata,\n getConnectedMcpServerNames,\n} from \"./mcp/tool-metadata\";\nimport { canUseTool } from \"./permissions/permission-handlers\";\nimport { getAvailableSlashCommands } from \"./session/commands\";\nimport { parseMcpServers } from \"./session/mcp-config\";\nimport {\n DEFAULT_MODEL,\n getEffortOptions,\n resolveModelPreference,\n supports1MContext,\n toSdkModelId,\n} from \"./session/models\";\nimport {\n buildSessionOptions,\n buildSystemPrompt,\n type ProcessSpawnedInfo,\n} from \"./session/options\";\nimport { SettingsManager } from \"./session/settings\";\nimport {\n CODE_EXECUTION_MODES,\n type CodeExecutionMode,\n getAvailableModes,\n} from \"./tools\";\nimport type {\n BackgroundTerminal,\n EffortLevel,\n NewSessionMeta,\n Session,\n ToolUseCache,\n} from \"./types\";\n\nconst SESSION_VALIDATION_TIMEOUT_MS = 30_000;\nconst MAX_TITLE_LENGTH = 256;\nconst LOCAL_ONLY_COMMANDS = new Set([\"/context\", \"/heapdump\", \"/extra-usage\"]);\n\nfunction sanitizeTitle(text: string): string {\n const sanitized = text\n .replace(/[\\r\\n]+/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n if (sanitized.length <= MAX_TITLE_LENGTH) {\n return sanitized;\n }\n return `${sanitized.slice(0, MAX_TITLE_LENGTH - 1)}…`;\n}\n\nexport interface ClaudeAcpAgentOptions {\n onProcessSpawned?: (info: ProcessSpawnedInfo) => void;\n onProcessExited?: (pid: number) => void;\n onMcpServersReady?: (serverNames: string[]) => void;\n}\n\nexport class ClaudeAcpAgent extends BaseAcpAgent {\n readonly adapterName = \"claude\";\n declare session: Session;\n toolUseCache: ToolUseCache;\n backgroundTerminals: { [key: string]: BackgroundTerminal } = {};\n clientCapabilities?: ClientCapabilities;\n private options?: ClaudeAcpAgentOptions;\n\n constructor(client: AgentSideConnection, options?: ClaudeAcpAgentOptions) {\n super(client);\n this.options = options;\n this.toolUseCache = {};\n this.logger = new Logger({ debug: true, prefix: \"[ClaudeAcpAgent]\" });\n }\n\n async initialize(request: InitializeRequest): Promise<InitializeResponse> {\n this.clientCapabilities = request.clientCapabilities;\n\n return {\n protocolVersion: 1,\n agentCapabilities: {\n promptCapabilities: {\n image: true,\n embeddedContext: true,\n },\n mcpCapabilities: {\n http: true,\n sse: true,\n },\n loadSession: true,\n sessionCapabilities: {\n list: {},\n fork: {},\n resume: {},\n },\n _meta: {\n posthog: {\n resumeSession: true,\n },\n claudeCode: {\n promptQueueing: true,\n },\n },\n },\n agentInfo: {\n name: packageJson.name,\n title: \"Claude Agent\",\n version: packageJson.version,\n },\n authMethods: [],\n };\n }\n\n async newSession(params: NewSessionRequest): Promise<NewSessionResponse> {\n // Upstream Claude Code renames .claude.json to .claude.json.backup on logout.\n // If the backup exists but the original doesn't, the user is logged out.\n if (\n fs.existsSync(path.resolve(os.homedir(), \".claude.json.backup\")) &&\n !fs.existsSync(path.resolve(os.homedir(), \".claude.json\"))\n ) {\n throw RequestError.authRequired();\n }\n\n const response = await this.createSession(params, {\n // Revisit these meta values once we support resume\n resume: (params._meta as NewSessionMeta | undefined)?.claudeCode?.options\n ?.resume as string | undefined,\n });\n\n return response;\n }\n\n async unstable_forkSession(\n params: ForkSessionRequest,\n ): Promise<ForkSessionResponse> {\n return this.createSession(\n {\n cwd: params.cwd,\n mcpServers: params.mcpServers ?? [],\n _meta: params._meta,\n },\n { resume: params.sessionId, forkSession: true },\n );\n }\n\n async unstable_resumeSession(\n params: ResumeSessionRequest,\n ): Promise<ResumeSessionResponse> {\n // Reuse existing session if it matches\n const existing = this.getExistingSessionState(params.sessionId);\n if (existing) return existing;\n\n const response = await this.createSession(\n {\n cwd: params.cwd,\n mcpServers: params.mcpServers ?? [],\n _meta: params._meta,\n },\n {\n resume: params.sessionId,\n },\n );\n\n return response;\n }\n\n async loadSession(params: LoadSessionRequest): Promise<LoadSessionResponse> {\n // Reuse existing session if it matches\n const existing = this.getExistingSessionState(params.sessionId);\n if (existing) return existing;\n\n const response = await this.createSession(\n {\n cwd: params.cwd,\n mcpServers: params.mcpServers ?? [],\n _meta: params._meta,\n },\n { resume: params.sessionId, skipBackgroundFetches: true },\n );\n\n await this.replaySessionHistory(params.sessionId);\n\n // Send available commands after replay so they don't interleave with history\n this.deferBackgroundFetches(this.session.query);\n\n return {\n modes: response.modes,\n models: response.models,\n configOptions: response.configOptions,\n };\n }\n\n async listSessions(\n params: ListSessionsRequest,\n ): Promise<ListSessionsResponse> {\n const sdkSessions = await listSessions({ dir: params.cwd ?? undefined });\n const sessions = [];\n\n for (const session of sdkSessions) {\n if (!session.cwd) continue;\n sessions.push({\n sessionId: session.sessionId,\n cwd: session.cwd,\n title: sanitizeTitle(session.customTitle || session.summary || \"\"),\n updatedAt: new Date(session.lastModified).toISOString(),\n });\n }\n return {\n sessions,\n };\n }\n\n async unstable_listSessions(\n params: ListSessionsRequest,\n ): Promise<ListSessionsResponse> {\n return this.listSessions(params);\n }\n\n async prompt(params: PromptRequest): Promise<PromptResponse> {\n this.session.cancelled = false;\n this.session.interruptReason = undefined;\n this.session.accumulatedUsage = {\n inputTokens: 0,\n outputTokens: 0,\n cachedReadTokens: 0,\n cachedWriteTokens: 0,\n };\n\n const userMessage = promptToClaude(params);\n const promptUuid = randomUUID();\n userMessage.uuid = promptUuid;\n let promptReplayed = false;\n let isLocalOnlyCommand = false;\n\n // Detect local-only slash commands that return results without model invocation\n const msgContent = userMessage.message.content;\n let firstTextPart = \"\";\n if (typeof msgContent === \"string\") {\n firstTextPart = msgContent;\n } else if (Array.isArray(msgContent)) {\n for (const block of msgContent) {\n if (\"type\" in block && block.type === \"text\" && \"text\" in block) {\n firstTextPart = block.text as string;\n break;\n }\n }\n }\n const commandMatch = firstTextPart.match(/^(\\/\\S+)/);\n if (commandMatch && LOCAL_ONLY_COMMANDS.has(commandMatch[1])) {\n isLocalOnlyCommand = true;\n promptReplayed = true;\n }\n\n if (this.session.promptRunning) {\n this.session.input.push(userMessage);\n const order = this.session.nextPendingOrder++;\n const cancelled = await new Promise<boolean>((resolve) => {\n this.session.pendingMessages.set(promptUuid, { resolve, order });\n });\n if (cancelled) {\n return { stopReason: \"cancelled\" };\n }\n promptReplayed = true;\n } else {\n this.session.input.push(userMessage);\n }\n\n // Broadcast user message to client\n await this.broadcastUserMessage(params);\n\n this.session.promptRunning = true;\n let handedOff = false;\n let lastAssistantTotalUsage: number | null = null;\n if (this.session.lastContextWindowSize == null) {\n this.session.lastContextWindowSize = this.getContextWindowForModel(\n this.session.modelId ?? \"\",\n );\n this.logger.debug(\"Initial context window size from gateway\", {\n modelId: this.session.modelId,\n contextWindowSize: this.session.lastContextWindowSize,\n });\n }\n let lastContextWindowSize = this.session.lastContextWindowSize;\n\n const supportsTerminalOutput =\n (\n this.clientCapabilities?._meta as\n | ClientCapabilities[\"_meta\"]\n | undefined\n )?.terminal_output === true;\n\n const context = {\n session: this.session,\n sessionId: params.sessionId,\n client: this.client,\n toolUseCache: this.toolUseCache,\n fileContentCache: this.fileContentCache,\n logger: this.logger,\n supportsTerminalOutput,\n };\n\n try {\n while (true) {\n const { value: message, done } = await this.session.query.next();\n\n if (done || !message) {\n if (this.session.cancelled) {\n return {\n stopReason: \"cancelled\",\n _meta: this.session.interruptReason\n ? { interruptReason: this.session.interruptReason }\n : undefined,\n };\n }\n break;\n }\n\n switch (message.type) {\n case \"system\":\n if (message.subtype === \"compact_boundary\") {\n lastAssistantTotalUsage = 0;\n promptReplayed = true;\n }\n if (message.subtype === \"local_command_output\") {\n promptReplayed = true;\n }\n await handleSystemMessage(message, context);\n break;\n\n case \"result\": {\n // Skip results from background tasks that finished after our prompt started\n if (!promptReplayed) {\n this.logger.debug(\n \"Skipping background task result before prompt replay\",\n { sessionId: params.sessionId },\n );\n break;\n }\n\n if (this.session.cancelled) {\n return { stopReason: \"cancelled\" };\n }\n\n // Accumulate usage from this result\n this.session.accumulatedUsage.inputTokens +=\n message.usage.input_tokens;\n this.session.accumulatedUsage.outputTokens +=\n message.usage.output_tokens;\n this.session.accumulatedUsage.cachedReadTokens +=\n message.usage.cache_read_input_tokens;\n this.session.accumulatedUsage.cachedWriteTokens +=\n message.usage.cache_creation_input_tokens;\n\n // SDK can underreport context window (e.g. 200k for 1M models).\n // Use SDK value only if it's larger than what gateway reported.\n const contextWindows = Object.values(message.modelUsage).map(\n (m) => m.contextWindow,\n );\n if (contextWindows.length > 0) {\n const sdkContextWindow = Math.min(...contextWindows);\n if (sdkContextWindow > lastContextWindowSize) {\n lastContextWindowSize = sdkContextWindow;\n }\n }\n this.session.lastContextWindowSize = lastContextWindowSize;\n this.logger.debug(\"Context window size from result\", {\n sdkReported: contextWindows,\n resolved: lastContextWindowSize,\n modelId: this.session.modelId,\n });\n\n this.session.contextSize = lastContextWindowSize;\n if (lastAssistantTotalUsage !== null) {\n this.session.contextUsed = lastAssistantTotalUsage;\n }\n\n // Send usage_update notification\n if (lastAssistantTotalUsage !== null) {\n await this.client.sessionUpdate({\n sessionId: params.sessionId,\n update: {\n sessionUpdate: \"usage_update\",\n used: lastAssistantTotalUsage,\n size: lastContextWindowSize,\n cost: {\n amount: message.total_cost_usd,\n currency: \"USD\",\n },\n },\n });\n }\n\n await this.client.extNotification(\"_posthog/usage_update\", {\n sessionId: params.sessionId,\n used: {\n inputTokens: message.usage.input_tokens,\n outputTokens: message.usage.output_tokens,\n cachedReadTokens: message.usage.cache_read_input_tokens,\n cachedWriteTokens: message.usage.cache_creation_input_tokens,\n },\n cost: message.total_cost_usd,\n });\n\n const usage: Usage = {\n inputTokens: this.session.accumulatedUsage.inputTokens,\n outputTokens: this.session.accumulatedUsage.outputTokens,\n cachedReadTokens: this.session.accumulatedUsage.cachedReadTokens,\n cachedWriteTokens:\n this.session.accumulatedUsage.cachedWriteTokens,\n totalTokens:\n this.session.accumulatedUsage.inputTokens +\n this.session.accumulatedUsage.outputTokens +\n this.session.accumulatedUsage.cachedReadTokens +\n this.session.accumulatedUsage.cachedWriteTokens,\n };\n\n const result = handleResultMessage(message);\n if (result.error) throw result.error;\n\n // For local-only commands, forward the result text to the client\n if (\n isLocalOnlyCommand &&\n message.subtype === \"success\" &&\n message.result\n ) {\n await this.client.sessionUpdate({\n sessionId: params.sessionId,\n update: {\n sessionUpdate: \"agent_message_chunk\",\n content: { type: \"text\", text: message.result },\n },\n });\n }\n\n return { stopReason: result.stopReason ?? \"end_turn\", usage };\n }\n\n case \"stream_event\":\n await handleStreamEvent(message, context);\n break;\n\n case \"user\":\n case \"assistant\": {\n if (this.session.cancelled) {\n break;\n }\n\n // Check for prompt replay (our own message echoed back)\n if (message.type === \"user\" && \"uuid\" in message && message.uuid) {\n if (message.uuid === promptUuid) {\n promptReplayed = true;\n break;\n }\n\n const pending = this.session.pendingMessages.get(\n message.uuid as string,\n );\n if (pending) {\n pending.resolve(false);\n this.session.pendingMessages.delete(message.uuid as string);\n handedOff = true;\n // the current loop stops with end_turn,\n // the loop of the next prompt continues running\n return { stopReason: \"end_turn\" };\n }\n }\n\n // Skip replayed user messages that aren't pending prompts\n if (\n \"isReplay\" in message &&\n (message as Record<string, unknown>).isReplay\n ) {\n break;\n }\n\n // Store latest assistant usage (excluding subagents)\n if (\n \"usage\" in message.message &&\n message.parent_tool_use_id === null\n ) {\n const usage = (\n message.message as unknown as Record<string, unknown>\n ).usage as {\n input_tokens: number;\n output_tokens: number;\n cache_read_input_tokens: number;\n cache_creation_input_tokens: number;\n };\n lastAssistantTotalUsage =\n usage.input_tokens +\n usage.cache_read_input_tokens +\n usage.cache_creation_input_tokens;\n\n await this.client.sessionUpdate({\n sessionId: params.sessionId,\n update: {\n sessionUpdate: \"usage_update\",\n used: lastAssistantTotalUsage,\n size: lastContextWindowSize,\n cost: null,\n },\n });\n }\n\n const result = await handleUserAssistantMessage(message, context);\n if (result.error) throw result.error;\n if (result.shouldStop) {\n return { stopReason: \"end_turn\" };\n }\n break;\n }\n\n case \"tool_progress\":\n case \"auth_status\":\n case \"tool_use_summary\":\n case \"prompt_suggestion\":\n case \"rate_limit_event\":\n break;\n\n default:\n unreachable(message as never, this.logger);\n break;\n }\n }\n throw new Error(\"Session did not end in result\");\n } catch (error) {\n if (error instanceof RequestError || !(error instanceof Error)) {\n throw error;\n }\n const msg = error.message;\n if (\n msg.includes(\"ProcessTransport\") ||\n msg.includes(\"terminated process\") ||\n msg.includes(\"process exited with\") ||\n msg.includes(\"process terminated by signal\") ||\n msg.includes(\"Failed to write to process stdin\")\n ) {\n this.logger.error(`Process died: ${msg}`, {\n sessionId: this.sessionId,\n });\n this.session.settingsManager.dispose();\n this.session.input.end();\n throw RequestError.internalError(\n undefined,\n \"The Claude Agent process exited unexpectedly. Please start a new session.\",\n );\n }\n throw error;\n } finally {\n if (!handedOff) {\n this.session.promptRunning = false;\n // Resolve all remaining pending prompts so no callers get stuck.\n for (const [key, pending] of this.session.pendingMessages) {\n pending.resolve(true);\n this.session.pendingMessages.delete(key);\n }\n }\n }\n }\n\n // Called by BaseAcpAgent#cancel() to interrupt the session\n protected async interrupt(): Promise<void> {\n this.session.cancelled = true;\n for (const [, pending] of this.session.pendingMessages) {\n pending.resolve(true);\n }\n this.session.pendingMessages.clear();\n await this.session.query.interrupt();\n }\n\n async unstable_setSessionModel(\n params: SetSessionModelRequest,\n ): Promise<SetSessionModelResponse | undefined> {\n await this.session.query.setModel(toSdkModelId(params.modelId));\n this.session.modelId = params.modelId;\n this.session.lastContextWindowSize = this.getContextWindowForModel(\n params.modelId,\n );\n this.rebuildEffortConfigOption(params.modelId);\n await this.updateConfigOption(\"model\", params.modelId);\n return {};\n }\n\n async setSessionMode(\n params: SetSessionModeRequest,\n ): Promise<SetSessionModeResponse> {\n await this.applySessionMode(params.modeId);\n await this.updateConfigOption(\"mode\", params.modeId);\n return {};\n }\n\n async setSessionConfigOption(\n params: SetSessionConfigOptionRequest,\n ): Promise<SetSessionConfigOptionResponse> {\n const option = this.session.configOptions.find(\n (o) => o.id === params.configId,\n );\n if (!option) {\n throw new Error(`Unknown config option: ${params.configId}`);\n }\n\n if (typeof params.value !== \"string\") {\n throw new Error(\n `Invalid value type for config option ${params.configId}`,\n );\n }\n\n const allValues: { value: string; name?: string; description?: string }[] =\n \"options\" in option && Array.isArray(option.options)\n ? (option.options as Array<Record<string, unknown>>).flatMap((o) =>\n \"options\" in o && Array.isArray(o.options)\n ? (o.options as {\n value: string;\n name?: string;\n description?: string;\n }[])\n : [o as { value: string; name?: string; description?: string }],\n )\n : [];\n let validValue = allValues.find((o) => o.value === params.value);\n\n // For model options, fall back to alias resolution when exact match fails.\n // This lets callers use human-friendly aliases like \"opus\" or \"sonnet\"\n // instead of full model IDs like \"claude-opus-4-6\".\n if (!validValue && params.configId === \"model\") {\n const resolved = resolveModelPreference(params.value, allValues);\n if (resolved) {\n validValue = allValues.find((o) => o.value === resolved);\n }\n }\n\n if (!validValue) {\n throw new Error(\n `Invalid value for config option ${params.configId}: ${params.value}`,\n );\n }\n\n // Use the canonical option value so downstream code always receives the\n // model ID rather than the caller-supplied alias.\n const resolvedValue = validValue.value;\n\n if (params.configId === \"mode\") {\n await this.applySessionMode(resolvedValue);\n await this.client.sessionUpdate({\n sessionId: this.sessionId,\n update: {\n sessionUpdate: \"current_mode_update\",\n currentModeId: resolvedValue,\n },\n });\n } else if (params.configId === \"model\") {\n const sdkModelId = toSdkModelId(resolvedValue);\n await this.session.query.setModel(sdkModelId);\n this.session.modelId = resolvedValue;\n this.session.lastContextWindowSize =\n this.getContextWindowForModel(resolvedValue);\n this.rebuildEffortConfigOption(resolvedValue);\n } else if (params.configId === \"effort\") {\n const newEffort = resolvedValue as EffortLevel;\n this.session.effort = newEffort;\n this.session.queryOptions.effort = newEffort;\n }\n\n this.session.configOptions = this.session.configOptions.map((o) =>\n o.id === params.configId && typeof o.currentValue === \"string\"\n ? { ...o, currentValue: resolvedValue }\n : o,\n );\n\n return { configOptions: this.session.configOptions };\n }\n\n private async updateConfigOption(\n configId: string,\n value: string,\n ): Promise<void> {\n this.session.configOptions = this.session.configOptions.map((o) =>\n o.id === configId && typeof o.currentValue === \"string\"\n ? { ...o, currentValue: value }\n : o,\n );\n\n await this.client.sessionUpdate({\n sessionId: this.sessionId,\n update: {\n sessionUpdate: \"config_option_update\",\n configOptions: this.session.configOptions,\n },\n });\n }\n\n private async applySessionMode(modeId: string): Promise<void> {\n if (!CODE_EXECUTION_MODES.includes(modeId as CodeExecutionMode)) {\n throw new Error(\"Invalid Mode\");\n }\n const previousMode = this.session.permissionMode;\n this.session.permissionMode = modeId as CodeExecutionMode;\n try {\n await this.session.query.setPermissionMode(modeId as CodeExecutionMode);\n } catch (error) {\n this.session.permissionMode = previousMode;\n if (error instanceof Error) {\n if (!error.message) {\n error.message = \"Invalid Mode\";\n }\n throw error;\n }\n throw new Error(\"Invalid Mode\");\n }\n }\n\n private async createSession(\n params: {\n cwd: string;\n mcpServers: NewSessionRequest[\"mcpServers\"];\n _meta?: unknown;\n },\n creationOpts: {\n resume?: string;\n forkSession?: boolean;\n skipBackgroundFetches?: boolean;\n } = {},\n ): Promise<NewSessionResponse> {\n const { cwd } = params;\n const { resume, forkSession } = creationOpts;\n\n const isResume = !!resume;\n\n const meta = params._meta as NewSessionMeta | undefined;\n const taskId = meta?.persistence?.taskId;\n const effort = meta?.claudeCode?.options?.effort as EffortLevel | undefined;\n\n // We want to create a new session id unless it is resume,\n // but not resume + forkSession.\n let sessionId: string;\n if (forkSession) {\n sessionId = uuidv7();\n } else if (isResume) {\n sessionId = resume;\n } else {\n sessionId = uuidv7();\n }\n\n const input = new Pushable<SDKUserMessage>();\n\n const settingsManager = new SettingsManager(cwd);\n await settingsManager.initialize();\n\n const mcpServers = parseMcpServers(params);\n const systemPrompt = buildSystemPrompt(meta?.systemPrompt);\n\n this.logger.info(isResume ? \"Resuming session\" : \"Creating new session\", {\n sessionId,\n taskId,\n taskRunId: meta?.taskRunId,\n cwd,\n });\n\n const permissionMode: CodeExecutionMode =\n meta?.permissionMode &&\n CODE_EXECUTION_MODES.includes(meta.permissionMode as CodeExecutionMode)\n ? (meta.permissionMode as CodeExecutionMode)\n : \"default\";\n\n const options = buildSessionOptions({\n cwd,\n mcpServers,\n permissionMode,\n canUseTool: this.createCanUseTool(sessionId, meta?.allowedDomains),\n logger: this.logger,\n systemPrompt,\n userProvidedOptions: meta?.claudeCode?.options,\n sessionId,\n isResume,\n forkSession,\n additionalDirectories: [\n ...(meta?.claudeCode?.options?.additionalDirectories ?? []),\n ...(meta?.additionalRoots ?? []),\n ],\n disableBuiltInTools: meta?.disableBuiltInTools,\n settingsManager,\n onModeChange: this.createOnModeChange(),\n onProcessSpawned: this.options?.onProcessSpawned,\n onProcessExited: this.options?.onProcessExited,\n effort,\n });\n\n // Use the same abort controller that buildSessionOptions gave to the query\n const abortController = options.abortController as AbortController;\n\n const q = query({ prompt: input, options });\n\n const session: Session = {\n query: q,\n queryOptions: options,\n input,\n cancelled: false,\n settingsManager,\n permissionMode,\n abortController,\n accumulatedUsage: {\n inputTokens: 0,\n outputTokens: 0,\n cachedReadTokens: 0,\n cachedWriteTokens: 0,\n },\n effort,\n configOptions: [],\n promptRunning: false,\n pendingMessages: new Map(),\n nextPendingOrder: 0,\n\n // Custom properties\n cwd,\n notificationHistory: [],\n taskRunId: meta?.taskRunId,\n };\n this.session = session;\n this.sessionId = sessionId;\n\n this.logger.info(\n isResume\n ? \"Session query initialized, awaiting resumption\"\n : \"Session query initialized, awaiting initialization\",\n { sessionId, taskId, taskRunId: meta?.taskRunId },\n );\n\n try {\n const result = await withTimeout(\n q.initializationResult(),\n SESSION_VALIDATION_TIMEOUT_MS,\n );\n if (result.result === \"timeout\") {\n throw new Error(\n `Session ${isResume ? (forkSession ? \"fork\" : \"resumption\") : \"initialization\"} timed out for sessionId=${sessionId}`,\n );\n }\n } catch (err) {\n settingsManager.dispose();\n if (\n isResume &&\n err instanceof Error &&\n err.message === \"Query closed before response received\"\n ) {\n throw RequestError.resourceNotFound(sessionId);\n }\n this.logger.error(\n isResume\n ? forkSession\n ? \"Session fork failed\"\n : \"Session resumption failed\"\n : \"Session initialization failed\",\n {\n sessionId,\n taskId,\n taskRunId: meta?.taskRunId,\n error: err instanceof Error ? err.message : String(err),\n },\n );\n throw err;\n }\n\n if (meta?.taskRunId) {\n await this.client.extNotification(\"_posthog/sdk_session\", {\n taskRunId: meta.taskRunId,\n sessionId,\n adapter: \"claude\",\n });\n }\n\n // Resolve model: settings model takes priority, then gateway\n const settingsModel = settingsManager.getSettings().model;\n const modelOptions = await this.getModelConfigOptions();\n const resolvedModelId = settingsModel || modelOptions.currentModelId;\n session.modelId = resolvedModelId;\n session.lastContextWindowSize =\n this.getContextWindowForModel(resolvedModelId);\n\n const resolvedSdkModel = toSdkModelId(resolvedModelId);\n if (!isResume && resolvedSdkModel !== DEFAULT_MODEL) {\n await this.session.query.setModel(resolvedSdkModel);\n }\n\n if (supports1MContext(resolvedModelId)) {\n options.betas = [\"context-1m-2025-08-07\"];\n }\n\n const availableModes = getAvailableModes();\n const modes: SessionModeState = {\n currentModeId: permissionMode,\n availableModes: availableModes.map((mode) => ({\n id: mode.id,\n name: mode.name,\n description: mode.description ?? undefined,\n })),\n };\n\n const models: SessionModelState = {\n currentModelId: resolvedModelId,\n availableModels: modelOptions.options.map(\n (opt): AcpModelInfo => ({\n modelId: opt.value,\n name: opt.name,\n description: opt.description,\n }),\n ),\n };\n\n const configOptions = this.buildConfigOptions(\n permissionMode,\n modelOptions,\n effort ?? \"high\",\n );\n session.configOptions = configOptions;\n\n if (!creationOpts.skipBackgroundFetches) {\n this.deferBackgroundFetches(q);\n }\n\n this.logger.info(\n isResume\n ? \"Session resumed successfully\"\n : \"Session created successfully\",\n {\n sessionId,\n taskId,\n taskRunId: meta?.taskRunId,\n },\n );\n\n return { sessionId, modes, models, configOptions };\n }\n\n private createCanUseTool(\n sessionId: string,\n allowedDomains?: string[],\n ): CanUseTool {\n return async (toolName, toolInput, { suggestions, toolUseID, signal }) =>\n canUseTool({\n session: this.session,\n toolName,\n toolInput: toolInput as Record<string, unknown>,\n toolUseID,\n suggestions,\n signal,\n client: this.client,\n sessionId,\n fileContentCache: this.fileContentCache,\n logger: this.logger,\n updateConfigOption: (configId: string, value: string) =>\n this.updateConfigOption(configId, value),\n allowedDomains,\n });\n }\n\n private createOnModeChange() {\n return async (newMode: CodeExecutionMode) => {\n if (this.session) {\n this.session.permissionMode = newMode;\n }\n await this.updateConfigOption(\"mode\", newMode);\n };\n }\n\n private getExistingSessionState(\n sessionId: string,\n ): NewSessionResponse | null {\n if (this.sessionId !== sessionId || !this.session) return null;\n\n const availableModes = getAvailableModes();\n const modes: SessionModeState = {\n currentModeId: this.session.permissionMode,\n availableModes: availableModes.map((mode) => ({\n id: mode.id,\n name: mode.name,\n description: mode.description ?? undefined,\n })),\n };\n\n const modelOptions = this.session.configOptions.find(\n (o) => o.id === \"model\",\n );\n const models: SessionModelState = {\n currentModelId: this.session.modelId ?? DEFAULT_MODEL,\n availableModels:\n modelOptions && \"options\" in modelOptions\n ? (\n modelOptions.options as Array<{\n value: string;\n name: string;\n description?: string;\n }>\n ).map((opt) => ({\n modelId: opt.value,\n name: opt.name,\n description: opt.description,\n }))\n : [],\n };\n\n return {\n sessionId,\n modes,\n models,\n configOptions: this.session.configOptions,\n };\n }\n\n private buildConfigOptions(\n currentModeId: string,\n modelOptions: {\n currentModelId: string;\n options: SessionConfigSelectOption[];\n },\n currentEffort: EffortLevel = \"high\",\n ): SessionConfigOption[] {\n const modeOptions = getAvailableModes().map((mode) => ({\n value: mode.id,\n name: mode.name,\n description: mode.description ?? undefined,\n }));\n\n const configOptions: SessionConfigOption[] = [\n {\n id: \"mode\",\n name: \"Approval Preset\",\n type: \"select\",\n currentValue: currentModeId,\n options: modeOptions,\n category: \"mode\" as SessionConfigOptionCategory,\n description:\n \"Choose an approval and sandboxing preset for your session\",\n },\n {\n id: \"model\",\n name: \"Model\",\n type: \"select\",\n currentValue: modelOptions.currentModelId,\n options: modelOptions.options,\n category: \"model\" as SessionConfigOptionCategory,\n description: \"Choose which model Claude should use\",\n },\n ];\n\n const effortOptions = getEffortOptions(modelOptions.currentModelId);\n if (effortOptions) {\n configOptions.push({\n id: \"effort\",\n name: \"Effort\",\n type: \"select\",\n currentValue: currentEffort,\n options: effortOptions,\n category: \"thought_level\" as SessionConfigOptionCategory,\n description: \"Controls how much effort Claude puts into its response\",\n });\n }\n\n return configOptions;\n }\n\n private rebuildEffortConfigOption(modelId: string): void {\n const effortOptions = getEffortOptions(modelId);\n const existingEffort = this.session.configOptions.find(\n (o) => o.id === \"effort\",\n );\n\n if (!effortOptions) {\n this.session.configOptions = this.session.configOptions.filter(\n (o) => o.id !== \"effort\",\n );\n if (this.session.effort) {\n this.session.effort = undefined;\n this.session.queryOptions.effort = undefined;\n }\n return;\n }\n\n const rawCurrentValue = existingEffort?.currentValue;\n const currentValue =\n typeof rawCurrentValue === \"string\" ? rawCurrentValue : \"high\";\n const isValidValue = effortOptions.some((o) => o.value === currentValue);\n const resolvedValue = isValidValue ? currentValue : \"high\";\n\n if (resolvedValue !== currentValue && this.session.effort) {\n this.session.effort = resolvedValue as EffortLevel;\n this.session.queryOptions.effort = resolvedValue as EffortLevel;\n }\n\n const effortConfig: SessionConfigOption = {\n id: \"effort\",\n name: \"Effort\",\n type: \"select\",\n currentValue: resolvedValue,\n options: effortOptions,\n category: \"thought_level\" as SessionConfigOptionCategory,\n description: \"Controls how much effort Claude puts into its response\",\n };\n\n if (existingEffort) {\n this.session.configOptions = this.session.configOptions.map((o) =>\n o.id === \"effort\" ? effortConfig : o,\n );\n } else {\n this.session.configOptions.push(effortConfig);\n }\n }\n\n private async sendAvailableCommandsUpdate(): Promise<void> {\n const commands = await this.session.query.supportedCommands();\n await this.client.sessionUpdate({\n sessionId: this.sessionId,\n update: {\n sessionUpdate: \"available_commands_update\",\n availableCommands: getAvailableSlashCommands(commands),\n },\n });\n }\n\n private async replaySessionHistory(sessionId: string): Promise<void> {\n try {\n const messages = await getSessionMessages(sessionId, {\n dir: this.session.cwd,\n });\n\n const replayContext = {\n session: this.session,\n sessionId,\n client: this.client,\n toolUseCache: this.toolUseCache,\n fileContentCache: this.fileContentCache,\n logger: this.logger,\n registerHooks: false,\n };\n\n for (const msg of messages) {\n const sdkMessage = {\n type: msg.type,\n message: msg.message as {\n content: string | Array<{ type: string; text?: string }>;\n role: typeof msg.type;\n },\n parent_tool_use_id: msg.parent_tool_use_id,\n };\n await handleUserAssistantMessage(\n sdkMessage as Parameters<typeof handleUserAssistantMessage>[0],\n replayContext,\n );\n }\n } catch (err) {\n this.logger.warn(\"Failed to replay session history\", {\n sessionId,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n // ================================\n // EXTENSION METHODS\n // ================================\n\n /**\n * Fire-and-forget: fetch slash commands and MCP tool metadata in parallel.\n * Both populate caches used later — neither is needed to return configOptions.\n */\n private deferBackgroundFetches(q: Query): void {\n this.logger.info(\"Starting background fetches (commands + MCP metadata)\");\n Promise.all([\n new Promise<void>((resolve) => setTimeout(resolve, 10)).then(() =>\n this.sendAvailableCommandsUpdate(),\n ),\n fetchMcpToolMetadata(q, this.logger).then(() => {\n const serverNames = getConnectedMcpServerNames();\n if (serverNames.length > 0) {\n this.options?.onMcpServersReady?.(serverNames);\n }\n }),\n ]).catch((err) =>\n this.logger.error(\"Background fetch failed\", { error: err }),\n );\n }\n\n private async broadcastUserMessage(params: PromptRequest): Promise<void> {\n for (const chunk of params.prompt) {\n const notification = {\n sessionId: params.sessionId,\n update: {\n sessionUpdate: \"user_message_chunk\" as const,\n content: chunk,\n },\n };\n await this.client.sessionUpdate(notification);\n this.appendNotification(params.sessionId, notification);\n }\n }\n}\n","{\n \"name\": \"@posthog/agent\",\n \"version\": \"2.3.93\",\n \"repository\": \"https://github.com/PostHog/code\",\n \"description\": \"TypeScript agent framework wrapping Claude Agent SDK with Git-based task execution for PostHog\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n },\n \"./agent\": {\n \"types\": \"./dist/agent.d.ts\",\n \"import\": \"./dist/agent.js\"\n },\n \"./gateway-models\": {\n \"types\": \"./dist/gateway-models.d.ts\",\n \"import\": \"./dist/gateway-models.js\"\n },\n \"./posthog-api\": {\n \"types\": \"./dist/posthog-api.d.ts\",\n \"import\": \"./dist/posthog-api.js\"\n },\n \"./types\": {\n \"types\": \"./dist/types.d.ts\",\n \"import\": \"./dist/types.js\"\n },\n \"./adapters/claude/questions/utils\": {\n \"types\": \"./dist/adapters/claude/questions/utils.d.ts\",\n \"import\": \"./dist/adapters/claude/questions/utils.js\"\n },\n \"./adapters/claude/permissions/permission-options\": {\n \"types\": \"./dist/adapters/claude/permissions/permission-options.d.ts\",\n \"import\": \"./dist/adapters/claude/permissions/permission-options.js\"\n },\n \"./adapters/claude/tools\": {\n \"types\": \"./dist/adapters/claude/tools.d.ts\",\n \"import\": \"./dist/adapters/claude/tools.js\"\n },\n \"./adapters/claude/conversion/tool-use-to-acp\": {\n \"types\": \"./dist/adapters/claude/conversion/tool-use-to-acp.d.ts\",\n \"import\": \"./dist/adapters/claude/conversion/tool-use-to-acp.js\"\n },\n \"./adapters/claude/session/jsonl-hydration\": {\n \"types\": \"./dist/adapters/claude/session/jsonl-hydration.d.ts\",\n \"import\": \"./dist/adapters/claude/session/jsonl-hydration.js\"\n },\n \"./server\": {\n \"types\": \"./dist/server/agent-server.d.ts\",\n \"import\": \"./dist/server/agent-server.js\"\n }\n },\n \"bin\": {\n \"agent-server\": \"./dist/server/bin.cjs\"\n },\n \"type\": \"module\",\n \"keywords\": [\n \"posthog\",\n \"claude\",\n \"agent\",\n \"ai\",\n \"git\",\n \"typescript\"\n ],\n \"author\": \"PostHog\",\n \"license\": \"SEE LICENSE IN LICENSE\",\n \"scripts\": {\n \"build\": \"node ../../scripts/rimraf.mjs dist && tsup\",\n \"dev\": \"tsup --watch\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"typecheck\": \"pnpm exec tsc --noEmit\",\n \"prepublishOnly\": \"pnpm run build\",\n \"clean\": \"node ../../scripts/rimraf.mjs dist .turbo\"\n },\n \"engines\": {\n \"node\": \">=20.0.0\"\n },\n \"devDependencies\": {\n \"@posthog/shared\": \"workspace:*\",\n \"@posthog/git\": \"workspace:*\",\n \"@types/bun\": \"latest\",\n \"@types/tar\": \"^6.1.13\",\n \"msw\": \"^2.12.7\",\n \"tsup\": \"^8.5.1\",\n \"tsx\": \"^4.20.6\",\n \"typescript\": \"^5.5.0\",\n \"vitest\": \"^2.1.8\"\n },\n \"dependencies\": {\n \"@agentclientprotocol/sdk\": \"0.16.1\",\n \"@anthropic-ai/claude-agent-sdk\": \"0.2.76\",\n \"@anthropic-ai/sdk\": \"^0.78.0\",\n \"@hono/node-server\": \"^1.19.9\",\n \"@opentelemetry/api-logs\": \"^0.208.0\",\n \"@opentelemetry/exporter-logs-otlp-http\": \"^0.208.0\",\n \"@opentelemetry/resources\": \"^2.0.0\",\n \"@opentelemetry/sdk-logs\": \"^0.208.0\",\n \"@opentelemetry/semantic-conventions\": \"^1.28.0\",\n \"@types/jsonwebtoken\": \"^9.0.10\",\n \"commander\": \"^14.0.2\",\n \"hono\": \"^4.11.7\",\n \"jsonwebtoken\": \"^9.0.2\",\n \"minimatch\": \"^10.0.3\",\n \"tar\": \"^7.5.0\",\n \"uuid\": \"13.0.0\",\n \"yoga-wasm-web\": \"^0.3.3\",\n \"zod\": \"^3.24.1\"\n },\n \"files\": [\n \"dist/**/*\",\n \"src/**/*\",\n \"README.md\",\n \"CLAUDE.md\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","import type { Logger } from \"./logger\";\n\n/**\n * Races an operation against a timeout.\n * Returns success with the value if the operation completes in time,\n * or timeout if the operation takes longer than the specified duration.\n */\nexport async function withTimeout<T>(\n operation: Promise<T>,\n timeoutMs: number,\n): Promise<{ result: \"success\"; value: T } | { result: \"timeout\" }> {\n const timeoutPromise = new Promise<{ result: \"timeout\" }>((resolve) =>\n setTimeout(() => resolve({ result: \"timeout\" }), timeoutMs),\n );\n const operationPromise = operation.then((value) => ({\n result: \"success\" as const,\n value,\n }));\n return Promise.race([operationPromise, timeoutPromise]);\n}\n\nexport const IS_ROOT =\n typeof process !== \"undefined\" &&\n (process.geteuid?.() ?? process.getuid?.()) === 0;\n\nexport function unreachable(value: never, logger: Logger): void {\n let valueAsString: string;\n try {\n valueAsString = JSON.stringify(value);\n } catch {\n valueAsString = String(value);\n }\n logger.error(`Unexpected case: ${valueAsString}`);\n}\n","import type {\n Agent,\n AgentSideConnection,\n AuthenticateRequest,\n CancelNotification,\n InitializeRequest,\n InitializeResponse,\n NewSessionRequest,\n NewSessionResponse,\n PromptRequest,\n PromptResponse,\n ReadTextFileRequest,\n ReadTextFileResponse,\n SessionConfigSelectOption,\n SessionNotification,\n WriteTextFileRequest,\n WriteTextFileResponse,\n} from \"@agentclientprotocol/sdk\";\nimport {\n DEFAULT_GATEWAY_MODEL,\n fetchGatewayModels,\n formatGatewayModelName,\n type GatewayModel,\n isAnthropicModel,\n} from \"../gateway-models\";\nimport { Logger } from \"../utils/logger\";\nimport type { SettingsManager } from \"./claude/session/settings\";\n\nexport interface BaseSession {\n notificationHistory: SessionNotification[];\n cancelled: boolean;\n interruptReason?: string;\n abortController: AbortController;\n settingsManager: SettingsManager;\n}\n\nconst DEFAULT_CONTEXT_WINDOW = 200_000;\n\nexport abstract class BaseAcpAgent implements Agent {\n abstract readonly adapterName: string;\n protected session!: BaseSession;\n protected sessionId!: string;\n client: AgentSideConnection;\n logger: Logger;\n fileContentCache: { [key: string]: string } = {};\n protected gatewayModels: GatewayModel[] = [];\n\n constructor(client: AgentSideConnection) {\n this.client = client;\n this.logger = new Logger({ debug: true, prefix: \"[BaseAcpAgent]\" });\n }\n\n abstract initialize(request: InitializeRequest): Promise<InitializeResponse>;\n abstract newSession(params: NewSessionRequest): Promise<NewSessionResponse>;\n abstract prompt(params: PromptRequest): Promise<PromptResponse>;\n protected abstract interrupt(): Promise<void>;\n\n async cancel(params: CancelNotification): Promise<void> {\n if (this.sessionId !== params.sessionId) {\n throw new Error(\"Session ID mismatch\");\n }\n this.session.cancelled = true;\n const meta = params._meta as { interruptReason?: string } | undefined;\n if (meta?.interruptReason) {\n this.session.interruptReason = meta.interruptReason;\n }\n await this.interrupt();\n }\n\n async closeSession(): Promise<void> {\n try {\n // Abort first so in-flight HTTP requests are cancelled,\n // otherwise interrupt() deadlocks waiting for the query to stop\n // while the query waits on an API call that will never abort.\n this.session.abortController.abort();\n await this.cancel({ sessionId: this.sessionId });\n this.session.settingsManager.dispose();\n this.logger.info(\"Closed session\", { sessionId: this.sessionId });\n } catch (err) {\n this.logger.warn(\"Failed to close session\", {\n sessionId: this.sessionId,\n error: err,\n });\n }\n }\n\n hasSession(sessionId: string): boolean {\n return this.sessionId === sessionId;\n }\n\n appendNotification(\n sessionId: string,\n notification: SessionNotification,\n ): void {\n if (this.sessionId === sessionId) {\n this.session.notificationHistory.push(notification);\n }\n }\n\n async readTextFile(\n params: ReadTextFileRequest,\n ): Promise<ReadTextFileResponse> {\n const response = await this.client.readTextFile(params);\n if (!params.limit && !params.line) {\n this.fileContentCache[params.path] = response.content;\n }\n return response;\n }\n\n async writeTextFile(\n params: WriteTextFileRequest,\n ): Promise<WriteTextFileResponse> {\n const response = await this.client.writeTextFile(params);\n this.fileContentCache[params.path] = params.content;\n return response;\n }\n\n async authenticate(_params: AuthenticateRequest): Promise<void> {\n throw new Error(\"Method not implemented.\");\n }\n\n async getModelConfigOptions(currentModelOverride?: string): Promise<{\n currentModelId: string;\n options: SessionConfigSelectOption[];\n }> {\n this.gatewayModels = await fetchGatewayModels();\n\n const options = this.gatewayModels\n .filter((model) => isAnthropicModel(model))\n .map((model) => ({\n value: model.id,\n name: formatGatewayModelName(model),\n description: `Context: ${model.context_window.toLocaleString()} tokens`,\n }));\n\n const isAnthropicModelId = (modelId: string): boolean =>\n modelId.startsWith(\"claude-\") || modelId.startsWith(\"anthropic/\");\n\n let currentModelId = currentModelOverride ?? DEFAULT_GATEWAY_MODEL;\n\n if (!options.some((opt) => opt.value === currentModelId)) {\n if (!isAnthropicModelId(currentModelId)) {\n currentModelId = DEFAULT_GATEWAY_MODEL;\n }\n }\n\n if (!options.some((opt) => opt.value === currentModelId)) {\n options.unshift({\n value: currentModelId,\n name: currentModelId,\n description: \"Custom model\",\n });\n }\n\n return { currentModelId, options };\n }\n\n getContextWindowForModel(modelId: string): number {\n const match = this.gatewayModels.find((m) => m.id === modelId);\n return match?.context_window ?? DEFAULT_CONTEXT_WINDOW;\n }\n}\n","import * as path from \"node:path\";\nimport type { PromptRequest } from \"@agentclientprotocol/sdk\";\nimport type { SDKUserMessage } from \"@anthropic-ai/claude-agent-sdk\";\nimport type { ContentBlockParam } from \"@anthropic-ai/sdk/resources\";\n\ntype ImageMimeType = \"image/jpeg\" | \"image/png\" | \"image/gif\" | \"image/webp\";\n\nfunction sdkText(value: string): ContentBlockParam {\n return { type: \"text\", text: value };\n}\n\nfunction formatUriAsLink(uri: string): string {\n try {\n if (uri.startsWith(\"file://\")) {\n const filePath = uri.slice(7);\n const name = path.basename(filePath) || filePath;\n return `[@${name}](${uri})`;\n }\n if (uri.startsWith(\"zed://\")) {\n const name = path.basename(uri) || uri;\n return `[@${name}](${uri})`;\n }\n return uri;\n } catch {\n return uri;\n }\n}\n\nfunction transformMcpCommand(text: string): string {\n const mcpMatch = text.match(/^\\/mcp:([^:\\s]+):(\\S+)(\\s+.*)?$/);\n if (mcpMatch) {\n const [, server, command, args] = mcpMatch;\n return `/${server}:${command} (MCP)${args || \"\"}`;\n }\n return text;\n}\n\nfunction processPromptChunk(\n chunk: PromptRequest[\"prompt\"][number],\n content: ContentBlockParam[],\n context: ContentBlockParam[],\n): void {\n switch (chunk.type) {\n case \"text\":\n content.push(sdkText(transformMcpCommand(chunk.text)));\n break;\n\n case \"resource_link\":\n content.push(sdkText(formatUriAsLink(chunk.uri)));\n break;\n\n case \"resource\":\n if (\"text\" in chunk.resource) {\n content.push(sdkText(formatUriAsLink(chunk.resource.uri)));\n context.push(\n sdkText(\n `\\n<context ref=\"${chunk.resource.uri}\">\\n${chunk.resource.text}\\n</context>`,\n ),\n );\n }\n break;\n\n case \"image\":\n if (chunk.data) {\n content.push({\n type: \"image\",\n source: {\n type: \"base64\",\n data: chunk.data,\n media_type: chunk.mimeType as ImageMimeType,\n },\n });\n } else if (chunk.uri?.startsWith(\"http\")) {\n content.push({\n type: \"image\",\n source: { type: \"url\", url: chunk.uri },\n });\n }\n break;\n\n default:\n break;\n }\n}\n\nexport function promptToClaude(prompt: PromptRequest): SDKUserMessage {\n const content: ContentBlockParam[] = [];\n const context: ContentBlockParam[] = [];\n\n const prContext = (prompt._meta as Record<string, unknown> | undefined)\n ?.prContext;\n if (typeof prContext === \"string\") {\n content.push(sdkText(prContext));\n }\n\n for (const chunk of prompt.prompt) {\n processPromptChunk(chunk, content, context);\n }\n\n content.push(...context);\n\n return {\n type: \"user\",\n message: { role: \"user\", content },\n session_id: prompt.sessionId,\n parent_tool_use_id: null,\n };\n}\n","import type {\n AgentSideConnection,\n Role,\n SessionNotification,\n SessionUpdate,\n} from \"@agentclientprotocol/sdk\";\nimport { RequestError, type StopReason } from \"@agentclientprotocol/sdk\";\nimport type {\n SDKAssistantMessage,\n SDKMessage,\n SDKPartialAssistantMessage,\n SDKResultMessage,\n SDKUserMessage,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport type { ContentBlockParam } from \"@anthropic-ai/sdk/resources\";\nimport type {\n BetaContentBlock,\n BetaRawContentBlockDelta,\n} from \"@anthropic-ai/sdk/resources/beta.mjs\";\nimport { image, text } from \"../../../utils/acp-content\";\nimport { unreachable } from \"../../../utils/common\";\nimport type { Logger } from \"../../../utils/logger\";\nimport { registerHookCallback } from \"../hooks\";\nimport type { Session, ToolUpdateMeta, ToolUseCache } from \"../types\";\nimport {\n type ClaudePlanEntry,\n planEntries,\n toolInfoFromToolUse,\n toolUpdateFromEditToolResponse,\n toolUpdateFromToolResult,\n} from \"./tool-use-to-acp\";\n\ntype AnthropicContentChunk =\n | ContentBlockParam\n | BetaContentBlock\n | BetaRawContentBlockDelta;\n\ntype AnthropicMessageContent = string | Array<{ type: string; text?: string }>;\n\ninterface AnthropicMessageWithContent {\n type: Role;\n message: {\n content: AnthropicMessageContent;\n role?: Role;\n model?: string;\n };\n}\n\ntype ChunkHandlerContext = {\n sessionId: string;\n toolUseCache: ToolUseCache;\n fileContentCache: { [key: string]: string };\n client: AgentSideConnection;\n logger: Logger;\n parentToolCallId?: string;\n registerHooks?: boolean;\n supportsTerminalOutput?: boolean;\n cwd?: string;\n /** Raw MCP tool result from SDKUserMessage.tool_use_result (contains content, structuredContent, _meta) */\n mcpToolUseResult?: Record<string, unknown>;\n};\n\nexport interface MessageHandlerContext {\n session: Session;\n sessionId: string;\n client: AgentSideConnection;\n toolUseCache: ToolUseCache;\n fileContentCache: { [key: string]: string };\n logger: Logger;\n registerHooks?: boolean;\n supportsTerminalOutput?: boolean;\n}\n\nfunction messageUpdateType(role: Role) {\n return role === \"assistant\" ? \"agent_message_chunk\" : \"user_message_chunk\";\n}\n\nfunction toolMeta(\n toolName: string,\n toolResponse?: unknown,\n parentToolCallId?: string,\n): ToolUpdateMeta {\n const meta: ToolUpdateMeta[\"claudeCode\"] = { toolName };\n if (toolResponse !== undefined) meta.toolResponse = toolResponse;\n if (parentToolCallId) meta.parentToolCallId = parentToolCallId;\n return { claudeCode: meta };\n}\n\nfunction handleTextChunk(\n chunk: { text: string },\n role: Role,\n parentToolCallId?: string,\n): SessionUpdate {\n const update: SessionUpdate = {\n sessionUpdate: messageUpdateType(role),\n content: text(chunk.text),\n };\n if (parentToolCallId) {\n (update as Record<string, unknown>)._meta = toolMeta(\n \"__text__\",\n undefined,\n parentToolCallId,\n );\n }\n return update;\n}\n\nfunction handleImageChunk(\n chunk: {\n source: { type: string; data?: string; media_type?: string; url?: string };\n },\n role: Role,\n): SessionUpdate {\n return {\n sessionUpdate: messageUpdateType(role),\n content: image(\n chunk.source.type === \"base64\" ? (chunk.source.data ?? \"\") : \"\",\n chunk.source.type === \"base64\" ? (chunk.source.media_type ?? \"\") : \"\",\n chunk.source.type === \"url\" ? chunk.source.url : undefined,\n ),\n };\n}\n\nfunction handleThinkingChunk(\n chunk: { thinking: string },\n parentToolCallId?: string,\n): SessionUpdate {\n const update: SessionUpdate = {\n sessionUpdate: \"agent_thought_chunk\",\n content: text(chunk.thinking),\n };\n if (parentToolCallId) {\n (update as Record<string, unknown>)._meta = toolMeta(\n \"__thinking__\",\n undefined,\n parentToolCallId,\n );\n }\n return update;\n}\n\nfunction handleToolUseChunk(\n chunk: ToolUseCache[string],\n ctx: ChunkHandlerContext,\n): SessionUpdate | null {\n const alreadyCached = chunk.id in ctx.toolUseCache;\n ctx.toolUseCache[chunk.id] = chunk;\n\n if (chunk.name === \"TodoWrite\") {\n const input = chunk.input as { todos?: unknown[] };\n if (Array.isArray(input.todos)) {\n return {\n sessionUpdate: \"plan\",\n entries: planEntries(chunk.input as { todos: ClaudePlanEntry[] }),\n };\n }\n return null;\n }\n\n if (!alreadyCached && ctx.registerHooks !== false) {\n registerHookCallback(chunk.id, {\n onPostToolUseHook: async (toolUseId, _toolInput, toolResponse) => {\n const toolUse = ctx.toolUseCache[toolUseId];\n if (toolUse) {\n const editUpdate =\n toolUse.name === \"Edit\"\n ? toolUpdateFromEditToolResponse(toolResponse)\n : null;\n\n await ctx.client.sessionUpdate({\n sessionId: ctx.sessionId,\n update: {\n _meta: toolMeta(toolUse.name, toolResponse, ctx.parentToolCallId),\n toolCallId: toolUseId,\n sessionUpdate: \"tool_call_update\",\n ...(editUpdate ? editUpdate : {}),\n },\n });\n } else {\n ctx.logger.error(\n `Got a tool response for tool use that wasn't tracked: ${toolUseId}`,\n );\n }\n },\n });\n }\n\n let rawInput: Record<string, unknown> | undefined;\n try {\n rawInput = JSON.parse(JSON.stringify(chunk.input));\n } catch {\n // ignore\n }\n\n const toolInfo = toolInfoFromToolUse(chunk, {\n supportsTerminalOutput: ctx.supportsTerminalOutput,\n toolUseId: chunk.id,\n cachedFileContent: ctx.fileContentCache,\n cwd: ctx.cwd,\n });\n\n const meta: Record<string, unknown> = {\n ...toolMeta(chunk.name, undefined, ctx.parentToolCallId),\n };\n if (chunk.name === \"Bash\" && ctx.supportsTerminalOutput && !alreadyCached) {\n meta.terminal_info = { terminal_id: chunk.id };\n }\n\n if (alreadyCached) {\n return {\n _meta: meta,\n toolCallId: chunk.id,\n sessionUpdate: \"tool_call_update\" as const,\n rawInput,\n ...toolInfo,\n };\n }\n\n return {\n _meta: meta,\n toolCallId: chunk.id,\n sessionUpdate: \"tool_call\" as const,\n rawInput,\n status: \"pending\",\n ...toolInfo,\n };\n}\n\nfunction extractTextFromContent(content: unknown): string | null {\n if (Array.isArray(content)) {\n const parts: string[] = [];\n for (const item of content) {\n if (\n typeof item === \"object\" &&\n item !== null &&\n \"text\" in item &&\n typeof (item as Record<string, unknown>).text === \"string\"\n ) {\n parts.push((item as { text: string }).text);\n }\n }\n return parts.length > 0 ? parts.join(\"\") : null;\n }\n if (typeof content === \"string\") {\n return content;\n }\n return null;\n}\n\nfunction stripCatLineNumbers(text: string): string {\n return text.replace(/^ *\\d+[\\t→]/gm, \"\");\n}\n\nfunction updateFileContentCache(\n toolUse: { name: string; input: unknown },\n chunk: { content?: unknown },\n ctx: ChunkHandlerContext,\n): void {\n const input = toolUse.input as Record<string, unknown> | undefined;\n const filePath = input?.file_path ? String(input.file_path) : undefined;\n if (!filePath) return;\n\n if (toolUse.name === \"Read\" && !input?.limit && !input?.offset) {\n const fileText = extractTextFromContent(chunk.content);\n if (fileText !== null) {\n ctx.fileContentCache[filePath] = stripCatLineNumbers(fileText);\n }\n } else if (toolUse.name === \"Write\") {\n const content = input?.content;\n if (typeof content === \"string\") {\n ctx.fileContentCache[filePath] = content;\n }\n } else if (toolUse.name === \"Edit\") {\n const oldString = input?.old_string;\n const newString = input?.new_string;\n if (\n typeof oldString === \"string\" &&\n typeof newString === \"string\" &&\n filePath in ctx.fileContentCache\n ) {\n const current = ctx.fileContentCache[filePath];\n ctx.fileContentCache[filePath] = input?.replace_all\n ? current.replaceAll(oldString, newString)\n : current.replace(oldString, newString);\n }\n }\n}\n\nfunction handleToolResultChunk(\n chunk: AnthropicContentChunk & {\n tool_use_id: string;\n is_error?: boolean;\n content?: unknown;\n },\n ctx: ChunkHandlerContext,\n): SessionUpdate[] {\n const toolUse = ctx.toolUseCache[chunk.tool_use_id];\n if (!toolUse) {\n ctx.logger.error(\n `Got a tool result for tool use that wasn't tracked: ${chunk.tool_use_id}`,\n );\n return [];\n }\n\n if (toolUse.name === \"TodoWrite\") {\n return [];\n }\n\n if (!chunk.is_error) {\n updateFileContentCache(toolUse, chunk, ctx);\n }\n\n const { _meta: resultMeta, ...toolUpdate } = toolUpdateFromToolResult(\n chunk as Parameters<typeof toolUpdateFromToolResult>[0],\n toolUse,\n {\n supportsTerminalOutput: ctx.supportsTerminalOutput,\n toolUseId: chunk.tool_use_id,\n cachedFileContent: ctx.fileContentCache,\n },\n );\n\n const updates: SessionUpdate[] = [];\n\n if (resultMeta?.terminal_output) {\n const terminalOutputMeta: Record<string, unknown> = {\n terminal_output: resultMeta.terminal_output,\n };\n if (ctx.parentToolCallId) {\n terminalOutputMeta.claudeCode = {\n parentToolCallId: ctx.parentToolCallId,\n };\n }\n updates.push({\n _meta: terminalOutputMeta,\n toolCallId: chunk.tool_use_id,\n sessionUpdate: \"tool_call_update\" as const,\n });\n }\n\n const meta: Record<string, unknown> = {\n ...toolMeta(toolUse.name, undefined, ctx.parentToolCallId),\n ...(resultMeta?.terminal_exit\n ? { terminal_exit: resultMeta.terminal_exit }\n : {}),\n };\n\n updates.push({\n _meta: meta,\n toolCallId: chunk.tool_use_id,\n sessionUpdate: \"tool_call_update\",\n status: chunk.is_error ? \"failed\" : \"completed\",\n rawOutput: ctx.mcpToolUseResult\n ? { ...ctx.mcpToolUseResult, isError: chunk.is_error ?? false }\n : {\n content: Array.isArray(chunk.content)\n ? chunk.content\n : typeof chunk.content === \"string\"\n ? [{ type: \"text\" as const, text: chunk.content }]\n : [],\n isError: chunk.is_error ?? false,\n },\n ...toolUpdate,\n });\n\n return updates;\n}\n\nfunction processContentChunk(\n chunk: AnthropicContentChunk,\n role: Role,\n ctx: ChunkHandlerContext,\n): SessionUpdate[] {\n switch (chunk.type) {\n case \"text\":\n case \"text_delta\": {\n const update = handleTextChunk(chunk, role, ctx.parentToolCallId);\n return update ? [update] : [];\n }\n\n case \"image\": {\n const update = handleImageChunk(chunk, role);\n return update ? [update] : [];\n }\n\n case \"thinking\":\n case \"thinking_delta\": {\n const update = handleThinkingChunk(chunk, ctx.parentToolCallId);\n return update ? [update] : [];\n }\n\n case \"tool_use\":\n case \"server_tool_use\":\n case \"mcp_tool_use\": {\n const update = handleToolUseChunk(chunk as ToolUseCache[string], ctx);\n return update ? [update] : [];\n }\n\n case \"tool_result\":\n case \"tool_search_tool_result\":\n case \"web_fetch_tool_result\":\n case \"web_search_tool_result\":\n case \"code_execution_tool_result\":\n case \"bash_code_execution_tool_result\":\n case \"text_editor_code_execution_tool_result\":\n case \"mcp_tool_result\":\n return handleToolResultChunk(\n chunk as AnthropicContentChunk & {\n tool_use_id: string;\n is_error?: boolean;\n content?: unknown;\n },\n ctx,\n );\n\n case \"document\":\n case \"search_result\":\n case \"redacted_thinking\":\n case \"input_json_delta\":\n case \"citations_delta\":\n case \"signature_delta\":\n case \"container_upload\":\n case \"compaction\":\n case \"compaction_delta\":\n return [];\n\n default:\n unreachable(chunk as never, ctx.logger);\n return [];\n }\n}\n\nfunction toAcpNotifications(\n content:\n | string\n | ContentBlockParam[]\n | BetaContentBlock[]\n | BetaRawContentBlockDelta[],\n role: Role,\n sessionId: string,\n toolUseCache: ToolUseCache,\n fileContentCache: { [key: string]: string },\n client: AgentSideConnection,\n logger: Logger,\n parentToolCallId?: string,\n registerHooks?: boolean,\n supportsTerminalOutput?: boolean,\n cwd?: string,\n mcpToolUseResult?: Record<string, unknown>,\n): SessionNotification[] {\n if (typeof content === \"string\") {\n const update: SessionUpdate = {\n sessionUpdate: messageUpdateType(role),\n content: text(content),\n };\n if (parentToolCallId) {\n (update as Record<string, unknown>)._meta = toolMeta(\n \"__text__\",\n undefined,\n parentToolCallId,\n );\n }\n return [{ sessionId, update }];\n }\n\n const ctx: ChunkHandlerContext = {\n sessionId,\n toolUseCache,\n fileContentCache,\n client,\n logger,\n parentToolCallId,\n registerHooks,\n supportsTerminalOutput,\n cwd,\n mcpToolUseResult,\n };\n const output: SessionNotification[] = [];\n\n for (const chunk of content) {\n for (const update of processContentChunk(chunk, role, ctx)) {\n output.push({ sessionId, update });\n }\n }\n\n return output;\n}\n\nfunction streamEventToAcpNotifications(\n message: SDKPartialAssistantMessage,\n sessionId: string,\n toolUseCache: ToolUseCache,\n fileContentCache: { [key: string]: string },\n client: AgentSideConnection,\n logger: Logger,\n parentToolCallId?: string,\n registerHooks?: boolean,\n supportsTerminalOutput?: boolean,\n cwd?: string,\n): SessionNotification[] {\n const event = message.event;\n switch (event.type) {\n case \"content_block_start\":\n return toAcpNotifications(\n [event.content_block],\n \"assistant\",\n sessionId,\n toolUseCache,\n fileContentCache,\n client,\n logger,\n parentToolCallId,\n registerHooks,\n supportsTerminalOutput,\n cwd,\n );\n case \"content_block_delta\":\n return toAcpNotifications(\n [event.delta],\n \"assistant\",\n sessionId,\n toolUseCache,\n fileContentCache,\n client,\n logger,\n parentToolCallId,\n registerHooks,\n supportsTerminalOutput,\n cwd,\n );\n case \"message_start\":\n case \"message_delta\":\n case \"message_stop\":\n case \"content_block_stop\":\n return [];\n\n default:\n unreachable(event as never, logger);\n return [];\n }\n}\n\nexport async function handleSystemMessage(\n message: Extract<SDKMessage, { type: \"system\" }>,\n context: MessageHandlerContext,\n): Promise<void> {\n const { session, sessionId, client, logger } = context;\n\n switch (message.subtype) {\n case \"init\":\n break;\n case \"compact_boundary\":\n await client.extNotification(\"_posthog/compact_boundary\", {\n sessionId,\n trigger: message.compact_metadata.trigger,\n preTokens: message.compact_metadata.pre_tokens,\n contextSize: session.contextSize,\n });\n break;\n case \"hook_response\":\n logger.info(\"Hook response received\", {\n hookName: message.hook_name,\n hookEvent: message.hook_event,\n });\n break;\n case \"status\":\n if (message.status === \"compacting\") {\n logger.info(\"Session compacting started\", { sessionId });\n await client.extNotification(\"_posthog/status\", {\n sessionId,\n status: \"compacting\",\n });\n }\n break;\n case \"task_notification\": {\n logger.info(\"Task notification received\", {\n sessionId,\n taskId: message.task_id,\n status: message.status,\n summary: message.summary,\n });\n await client.extNotification(\"_posthog/task_notification\", {\n sessionId,\n taskId: message.task_id,\n status: message.status,\n summary: message.summary,\n outputFile: message.output_file,\n });\n break;\n }\n default:\n break;\n }\n}\n\nexport type ResultMessageHandlerResult = {\n shouldStop: boolean;\n stopReason?: StopReason;\n error?: Error;\n usage?: {\n inputTokens: number;\n outputTokens: number;\n cachedReadTokens: number;\n cachedWriteTokens: number;\n costUsd?: number;\n contextWindowSize?: number;\n };\n};\n\nexport function handleResultMessage(\n message: SDKResultMessage,\n): ResultMessageHandlerResult {\n const usage = extractUsageFromResult(message);\n\n switch (message.subtype) {\n case \"success\": {\n if (message.result.includes(\"Please run /login\")) {\n return {\n shouldStop: true,\n error: RequestError.authRequired(),\n usage,\n };\n }\n if ((message as Record<string, unknown>).stop_reason === \"max_tokens\") {\n return { shouldStop: true, stopReason: \"max_tokens\", usage };\n }\n if (message.is_error) {\n return {\n shouldStop: true,\n error: RequestError.internalError(undefined, message.result),\n usage,\n };\n }\n return { shouldStop: true, stopReason: \"end_turn\", usage };\n }\n case \"error_during_execution\":\n if ((message as Record<string, unknown>).stop_reason === \"max_tokens\") {\n return { shouldStop: true, stopReason: \"max_tokens\", usage };\n }\n if (message.is_error) {\n return {\n shouldStop: true,\n error: RequestError.internalError(\n undefined,\n message.errors.join(\", \") || message.subtype,\n ),\n usage,\n };\n }\n return { shouldStop: true, stopReason: \"end_turn\", usage };\n case \"error_max_budget_usd\":\n case \"error_max_turns\":\n case \"error_max_structured_output_retries\":\n if (message.is_error) {\n return {\n shouldStop: true,\n error: RequestError.internalError(\n undefined,\n message.errors.join(\", \") || message.subtype,\n ),\n usage,\n };\n }\n return { shouldStop: true, stopReason: \"max_turn_requests\", usage };\n default:\n return { shouldStop: false, usage };\n }\n}\n\nfunction extractUsageFromResult(\n message: SDKResultMessage,\n): ResultMessageHandlerResult[\"usage\"] {\n const msg = message as Record<string, unknown>;\n const msgUsage = msg.usage as Record<string, number> | undefined;\n if (!msgUsage) return undefined;\n\n const modelUsage = msg.modelUsage as\n | Record<string, { contextWindow: number }>\n | undefined;\n let contextWindowSize: number | undefined;\n if (modelUsage) {\n const contextWindows = Object.values(modelUsage).map(\n (m) => m.contextWindow,\n );\n if (contextWindows.length > 0) {\n contextWindowSize = Math.min(...contextWindows);\n }\n }\n\n return {\n inputTokens: msgUsage.input_tokens ?? 0,\n outputTokens: msgUsage.output_tokens ?? 0,\n cachedReadTokens: msgUsage.cache_read_input_tokens ?? 0,\n cachedWriteTokens: msgUsage.cache_creation_input_tokens ?? 0,\n costUsd:\n typeof msg.total_cost_usd === \"number\" ? msg.total_cost_usd : undefined,\n contextWindowSize,\n };\n}\n\nexport async function handleStreamEvent(\n message: SDKPartialAssistantMessage,\n context: MessageHandlerContext,\n): Promise<void> {\n const { sessionId, client, toolUseCache, fileContentCache, logger } = context;\n const parentToolCallId = message.parent_tool_use_id ?? undefined;\n\n for (const notification of streamEventToAcpNotifications(\n message,\n sessionId,\n toolUseCache,\n fileContentCache,\n client,\n logger,\n parentToolCallId,\n context.registerHooks,\n context.supportsTerminalOutput,\n context.session.cwd,\n )) {\n await client.sessionUpdate(notification);\n context.session.notificationHistory.push(notification);\n }\n}\n\nfunction hasLocalCommandStdout(content: AnthropicMessageContent): boolean {\n return (\n typeof content === \"string\" && content.includes(\"<local-command-stdout>\")\n );\n}\n\nfunction hasLocalCommandStderr(content: AnthropicMessageContent): boolean {\n return (\n typeof content === \"string\" && content.includes(\"<local-command-stderr>\")\n );\n}\n\nfunction isLoginRequiredMessage(message: AnthropicMessageWithContent): boolean {\n return (\n message.type === \"assistant\" &&\n message.message.model === \"<synthetic>\" &&\n Array.isArray(message.message.content) &&\n message.message.content.length === 1 &&\n message.message.content[0].type === \"text\" &&\n message.message.content[0].text?.includes(\"Please run /login\") === true\n );\n}\n\nfunction isPlainTextUserMessage(message: AnthropicMessageWithContent): boolean {\n const content = message.message.content;\n return (\n message.type === \"user\" &&\n (typeof content === \"string\" ||\n (Array.isArray(content) &&\n content.length === 1 &&\n content[0].type === \"text\"))\n );\n}\n\nfunction shouldSkipUserAssistantMessage(\n message: AnthropicMessageWithContent,\n): boolean {\n return (\n hasLocalCommandStdout(message.message.content) ||\n hasLocalCommandStderr(message.message.content) ||\n isLoginRequiredMessage(message)\n );\n}\n\nfunction logSpecialMessages(\n message: AnthropicMessageWithContent,\n logger: Logger,\n): void {\n const content = message.message.content;\n if (hasLocalCommandStdout(content) && typeof content === \"string\") {\n logger.info(content);\n }\n if (hasLocalCommandStderr(content) && typeof content === \"string\") {\n logger.error(content);\n }\n}\n\nfunction filterMessageContent(\n content: AnthropicMessageContent,\n): AnthropicMessageContent {\n if (!Array.isArray(content)) {\n return content;\n }\n return content.filter(\n (block) => block.type !== \"text\" && block.type !== \"thinking\",\n );\n}\n\nexport async function handleUserAssistantMessage(\n message: SDKUserMessage | SDKAssistantMessage,\n context: MessageHandlerContext,\n): Promise<{ shouldStop?: boolean; error?: Error }> {\n const { session, sessionId, client, toolUseCache, fileContentCache, logger } =\n context;\n\n if (shouldSkipUserAssistantMessage(message)) {\n logSpecialMessages(message, logger);\n\n if (isLoginRequiredMessage(message)) {\n return { shouldStop: true, error: RequestError.authRequired() };\n }\n return {};\n }\n\n // Skip plain text user messages (already displayed by the ACP client)\n if (isPlainTextUserMessage(message)) {\n return {};\n }\n\n const content = message.message.content;\n const contentToProcess =\n message.type === \"assistant\" ? filterMessageContent(content) : content;\n const parentToolCallId =\n \"parent_tool_use_id\" in message\n ? (message.parent_tool_use_id ?? undefined)\n : undefined;\n\n // Pass the raw MCP tool result (contains content, structuredContent, _meta)\n // so it can be forwarded as-is to the renderer for MCP Apps\n const mcpToolUseResult =\n message.type === \"user\" && message.tool_use_result != null\n ? (message.tool_use_result as Record<string, unknown>)\n : undefined;\n\n for (const notification of toAcpNotifications(\n contentToProcess as typeof content,\n message.message.role,\n sessionId,\n toolUseCache,\n fileContentCache,\n client,\n logger,\n parentToolCallId,\n context.registerHooks,\n context.supportsTerminalOutput,\n session.cwd,\n mcpToolUseResult,\n )) {\n await client.sessionUpdate(notification);\n session.notificationHistory.push(notification);\n }\n\n return {};\n}\n","import type { ContentBlock, ToolCallContent } from \"@agentclientprotocol/sdk\";\n\nexport function text(value: string): ContentBlock {\n return { type: \"text\", text: value };\n}\n\nexport function image(\n data: string,\n mimeType: string,\n uri?: string,\n): ContentBlock {\n return { type: \"image\", data, mimeType, uri };\n}\n\nexport function resourceLink(\n uri: string,\n name: string,\n options?: {\n mimeType?: string;\n title?: string;\n description?: string;\n size?: number | null;\n },\n): ContentBlock {\n return {\n type: \"resource_link\",\n uri,\n name,\n ...options,\n };\n}\n\nclass ToolContentBuilder {\n private items: ToolCallContent[] = [];\n\n text(value: string): this {\n this.items.push({ type: \"content\", content: text(value) });\n return this;\n }\n\n image(data: string, mimeType: string, uri?: string): this {\n this.items.push({ type: \"content\", content: image(data, mimeType, uri) });\n return this;\n }\n\n diff(path: string, oldText: string | null, newText: string): this {\n this.items.push({ type: \"diff\", path, oldText, newText });\n return this;\n }\n\n build(): ToolCallContent[] {\n return this.items;\n }\n}\n\nexport function toolContent(): ToolContentBuilder {\n return new ToolContentBuilder();\n}\n","import type { HookCallback, HookInput } from \"@anthropic-ai/claude-agent-sdk\";\nimport type { Logger } from \"../../utils/logger\";\nimport type { SettingsManager } from \"./session/settings\";\nimport type { CodeExecutionMode } from \"./tools\";\n\nconst toolUseCallbacks: {\n [toolUseId: string]: {\n onPostToolUseHook?: (\n toolUseID: string,\n toolInput: unknown,\n toolResponse: unknown,\n ) => Promise<void>;\n };\n} = {};\n\nexport const registerHookCallback = (\n toolUseID: string,\n {\n onPostToolUseHook,\n }: {\n onPostToolUseHook?: (\n toolUseID: string,\n toolInput: unknown,\n toolResponse: unknown,\n ) => Promise<void>;\n },\n) => {\n toolUseCallbacks[toolUseID] = {\n onPostToolUseHook,\n };\n};\n\nexport type OnModeChange = (mode: CodeExecutionMode) => Promise<void>;\n\ninterface CreatePostToolUseHookParams {\n onModeChange?: OnModeChange;\n logger?: Logger;\n}\n\nexport const createPostToolUseHook =\n ({ onModeChange, logger }: CreatePostToolUseHookParams): HookCallback =>\n async (\n input: HookInput,\n toolUseID: string | undefined,\n ): Promise<{ continue: boolean }> => {\n if (input.hook_event_name === \"PostToolUse\") {\n const toolName = input.tool_name;\n\n if (onModeChange && toolName === \"EnterPlanMode\") {\n await onModeChange(\"plan\");\n }\n\n if (toolUseID) {\n const onPostToolUseHook =\n toolUseCallbacks[toolUseID]?.onPostToolUseHook;\n if (onPostToolUseHook) {\n await onPostToolUseHook(\n toolUseID,\n input.tool_input,\n input.tool_response,\n );\n delete toolUseCallbacks[toolUseID];\n } else {\n logger?.error(\n `No onPostToolUseHook found for tool use ID: ${toolUseID}`,\n );\n delete toolUseCallbacks[toolUseID];\n }\n }\n }\n return { continue: true };\n };\n\nexport const createPreToolUseHook =\n (settingsManager: SettingsManager, logger: Logger): HookCallback =>\n async (input: HookInput, _toolUseID: string | undefined) => {\n if (input.hook_event_name !== \"PreToolUse\") {\n return { continue: true };\n }\n\n const toolName = input.tool_name;\n const toolInput = input.tool_input;\n const permissionCheck = settingsManager.checkPermission(\n toolName,\n toolInput,\n );\n\n if (permissionCheck.decision !== \"ask\") {\n logger.info(\n `[PreToolUseHook] Tool: ${toolName}, Decision: ${permissionCheck.decision}, Rule: ${permissionCheck.rule}`,\n );\n }\n\n switch (permissionCheck.decision) {\n case \"allow\":\n return {\n continue: true,\n hookSpecificOutput: {\n hookEventName: \"PreToolUse\" as const,\n permissionDecision: \"allow\" as const,\n permissionDecisionReason: `Allowed by settings rule: ${permissionCheck.rule}`,\n },\n };\n case \"deny\":\n return {\n continue: true,\n hookSpecificOutput: {\n hookEventName: \"PreToolUse\" as const,\n permissionDecision: \"deny\" as const,\n permissionDecisionReason: `Denied by settings rule: ${permissionCheck.rule}`,\n },\n };\n default:\n return { continue: true };\n }\n };\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type {\n PlanEntry,\n ToolCall,\n ToolCallContent,\n ToolCallLocation,\n ToolCallUpdate,\n ToolKind,\n} from \"@agentclientprotocol/sdk\";\nimport type {\n ToolResultBlockParam,\n ToolUseBlock,\n WebSearchToolResultBlockParam,\n} from \"@anthropic-ai/sdk/resources\";\nimport type {\n BetaBashCodeExecutionToolResultBlockParam,\n BetaCodeExecutionToolResultBlockParam,\n BetaRequestMCPToolResultBlockParam,\n BetaTextEditorCodeExecutionToolResultBlockParam,\n BetaToolSearchToolResultBlockParam,\n BetaWebFetchToolResultBlockParam,\n BetaWebSearchToolResultBlockParam,\n} from \"@anthropic-ai/sdk/resources/beta.mjs\";\n\nconst SYSTEM_REMINDER_REGEX =\n /\\s*<system-reminder>[\\s\\S]*?<\\/system-reminder>/g;\n\nfunction stripSystemReminders(value: string): string {\n return value.replace(SYSTEM_REMINDER_REGEX, \"\");\n}\n\nimport { resourceLink, text, toolContent } from \"../../../utils/acp-content\";\nimport { getMcpToolMetadata } from \"../mcp/tool-metadata\";\n\ntype ToolInfo = Pick<ToolCall, \"title\" | \"kind\" | \"content\" | \"locations\">;\n\n/**\n * Convert an absolute file path to a project-relative path for display.\n * Returns the original path if it's outside the project directory or if no cwd is provided.\n */\nexport function toDisplayPath(filePath: string, cwd?: string): string {\n if (!cwd) return filePath;\n const resolvedCwd = path.resolve(cwd);\n const resolvedFile = path.resolve(filePath);\n if (\n resolvedFile.startsWith(resolvedCwd + path.sep) ||\n resolvedFile === resolvedCwd\n ) {\n return path.relative(resolvedCwd, resolvedFile);\n }\n return filePath;\n}\n\nexport function toolInfoFromToolUse(\n toolUse: Pick<ToolUseBlock, \"name\" | \"input\">,\n options?: {\n supportsTerminalOutput?: boolean;\n toolUseId?: string;\n cachedFileContent?: Record<string, string>;\n cwd?: string;\n },\n): ToolInfo {\n const name = toolUse.name;\n const input = toolUse.input as Record<string, unknown> | undefined;\n\n switch (name) {\n case \"Task\":\n case \"Agent\":\n return {\n title: input?.description ? String(input.description) : name,\n kind: \"think\",\n content: input?.prompt\n ? toolContent().text(String(input.prompt)).build()\n : [],\n };\n\n case \"NotebookRead\":\n return {\n title: input?.notebook_path\n ? `Read Notebook ${String(input.notebook_path)}`\n : \"Read Notebook\",\n kind: \"read\",\n content: [],\n locations: input?.notebook_path\n ? [{ path: String(input.notebook_path) }]\n : [],\n };\n\n case \"NotebookEdit\":\n return {\n title: input?.notebook_path\n ? `Edit Notebook ${String(input.notebook_path)}`\n : \"Edit Notebook\",\n kind: \"edit\",\n content: input?.new_source\n ? toolContent().text(String(input.new_source)).build()\n : [],\n locations: input?.notebook_path\n ? [{ path: String(input.notebook_path) }]\n : [],\n };\n\n case \"Bash\":\n if (options?.supportsTerminalOutput && options?.toolUseId) {\n return {\n title: input?.description\n ? String(input.description)\n : \"Execute command\",\n kind: \"execute\",\n content: [{ type: \"terminal\", terminalId: options.toolUseId }],\n };\n }\n return {\n title: input?.description\n ? String(input.description)\n : \"Execute command\",\n kind: \"execute\",\n content: input?.command\n ? toolContent().text(String(input.command)).build()\n : [],\n };\n\n case \"BashOutput\":\n return {\n title: \"Tail Logs\",\n kind: \"execute\",\n content: [],\n };\n\n case \"KillShell\":\n return {\n title: \"Kill Process\",\n kind: \"execute\",\n content: [],\n };\n\n case \"Read\": {\n let limit = \"\";\n const inputLimit = input?.limit as number | undefined;\n const inputOffset = (input?.offset as number | undefined) ?? 1;\n if (inputLimit) {\n limit = ` (${inputOffset} - ${inputOffset + inputLimit - 1})`;\n } else if (inputOffset > 1) {\n limit = ` (from line ${inputOffset})`;\n }\n const displayPath = input?.file_path\n ? toDisplayPath(String(input.file_path), options?.cwd)\n : \"File\";\n return {\n title: `Read ${displayPath}${limit}`,\n kind: \"read\",\n locations: input?.file_path\n ? [\n {\n path: String(input.file_path),\n line: inputOffset,\n },\n ]\n : [],\n content: [],\n };\n }\n\n case \"LS\":\n return {\n title: `List the ${input?.path ? `\\`${String(input.path)}\\`` : \"current\"} directory's contents`,\n kind: \"search\",\n content: [],\n locations: [],\n };\n\n case \"Edit\": {\n const filePath = input?.file_path ? String(input.file_path) : undefined;\n const displayPath = filePath\n ? toDisplayPath(filePath, options?.cwd)\n : undefined;\n let oldText: string | null = input?.old_string\n ? String(input.old_string)\n : null;\n let newText: string = input?.new_string ? String(input.new_string) : \"\";\n\n // try to display a rich diff by first checking if file content is cached\n // and valid (old_text exists in the content), then fall back to reading\n // file from disk, then fall back to fragemented snippet diff\n if (filePath && oldText !== null) {\n const fileContent = resolveFileContent(\n filePath,\n oldText,\n options?.cachedFileContent,\n );\n if (fileContent) {\n const newContent = input?.replace_all\n ? fileContent.replaceAll(oldText, newText)\n : fileContent.replace(oldText, newText);\n oldText = fileContent;\n newText = newContent;\n }\n }\n\n return {\n title: displayPath ? `Edit \\`${displayPath}\\`` : \"Edit\",\n kind: \"edit\",\n content:\n input && filePath\n ? [\n {\n type: \"diff\",\n path: filePath,\n oldText,\n newText,\n },\n ]\n : [],\n locations: filePath ? [{ path: filePath }] : [],\n };\n }\n\n case \"Write\": {\n let contentResult: ToolCallContent[] = [];\n const writeFilePath = input?.file_path\n ? String(input.file_path)\n : undefined;\n const writeDisplayPath = writeFilePath\n ? toDisplayPath(writeFilePath, options?.cwd)\n : undefined;\n const contentStr = input?.content ? String(input.content) : undefined;\n if (writeFilePath) {\n const oldContent =\n options?.cachedFileContent &&\n writeFilePath in options.cachedFileContent\n ? options.cachedFileContent[writeFilePath]\n : null;\n contentResult = toolContent()\n .diff(writeFilePath, oldContent, contentStr ?? \"\")\n .build();\n } else if (contentStr) {\n contentResult = toolContent().text(contentStr).build();\n }\n return {\n title: writeDisplayPath ? `Write ${writeDisplayPath}` : \"Write\",\n kind: \"edit\",\n content: contentResult,\n locations: writeFilePath ? [{ path: writeFilePath }] : [],\n };\n }\n\n case \"Glob\": {\n let label = \"Find\";\n const pathStr = input?.path ? String(input.path) : undefined;\n if (pathStr) {\n label += ` \"${pathStr}\"`;\n }\n if (input?.pattern) {\n label += ` \"${String(input.pattern)}\"`;\n }\n return {\n title: label,\n kind: \"search\",\n content: [],\n locations: pathStr ? [{ path: pathStr }] : [],\n };\n }\n\n case \"Grep\": {\n let label = \"grep\";\n\n if (input?.[\"-i\"]) {\n label += \" -i\";\n }\n if (input?.[\"-n\"]) {\n label += \" -n\";\n }\n\n if (input?.[\"-A\"] !== undefined) {\n label += ` -A ${input[\"-A\"]}`;\n }\n if (input?.[\"-B\"] !== undefined) {\n label += ` -B ${input[\"-B\"]}`;\n }\n if (input?.[\"-C\"] !== undefined) {\n label += ` -C ${input[\"-C\"]}`;\n }\n\n if (input?.output_mode) {\n switch (input.output_mode) {\n case \"files_with_matches\":\n label += \" -l\";\n break;\n case \"count\":\n label += \" -c\";\n break;\n default:\n break;\n }\n }\n\n if (input?.head_limit !== undefined) {\n label += ` | head -${input.head_limit}`;\n }\n\n if (input?.glob) {\n label += ` --include=\"${String(input.glob)}\"`;\n }\n\n if (input?.type) {\n label += ` --type=${String(input.type)}`;\n }\n\n if (input?.multiline) {\n label += \" -P\";\n }\n\n if (input?.pattern) {\n label += ` \"${String(input.pattern)}\"`;\n }\n\n if (input?.path) {\n label += ` ${String(input.path)}`;\n }\n\n return {\n title: label,\n kind: \"search\",\n content: [],\n };\n }\n\n case \"WebFetch\":\n return {\n title: \"Fetch\",\n kind: \"fetch\",\n content: input?.url\n ? [\n {\n type: \"content\",\n content: resourceLink(String(input.url), String(input.url), {\n description: input?.prompt ? String(input.prompt) : undefined,\n }),\n },\n ]\n : [],\n };\n\n case \"WebSearch\": {\n let label = `\"${input?.query ? String(input.query) : \"\"}\"`;\n const allowedDomains = input?.allowed_domains as string[] | undefined;\n const blockedDomains = input?.blocked_domains as string[] | undefined;\n\n if (allowedDomains && allowedDomains.length > 0) {\n label += ` (allowed: ${allowedDomains.join(\", \")})`;\n }\n\n if (blockedDomains && blockedDomains.length > 0) {\n label += ` (blocked: ${blockedDomains.join(\", \")})`;\n }\n\n return {\n title: label,\n kind: \"fetch\",\n content: [],\n };\n }\n\n case \"TodoWrite\":\n return {\n title: Array.isArray(input?.todos)\n ? `Update TODOs: ${input.todos.map((todo: { content?: string }) => todo.content).join(\", \")}`\n : \"Update TODOs\",\n kind: \"think\",\n content: [],\n };\n\n case \"ExitPlanMode\":\n return {\n title: \"Ready to code?\",\n kind: \"switch_mode\",\n content: input?.plan\n ? toolContent().text(String(input.plan)).build()\n : [],\n };\n\n case \"AskUserQuestion\": {\n const questions = input?.questions as\n | Array<{ question?: string }>\n | undefined;\n return {\n title: questions?.[0]?.question || \"Question\",\n kind: \"other\" as ToolKind,\n content: questions\n ? toolContent()\n .text(JSON.stringify(questions, null, 2))\n .build()\n : [],\n };\n }\n\n case \"Other\": {\n let output: string;\n try {\n output = JSON.stringify(input, null, 2);\n } catch {\n output = typeof input === \"string\" ? input : \"{}\";\n }\n return {\n title: name || \"Unknown Tool\",\n kind: \"other\",\n content: toolContent().text(`\\`\\`\\`json\\n${output}\\`\\`\\``).build(),\n };\n }\n\n default: {\n if (name?.startsWith(\"mcp__\")) {\n return mcpToolInfo(name, input);\n }\n return {\n title: name || \"Unknown Tool\",\n kind: \"other\",\n content: [],\n };\n }\n }\n}\n\nfunction mcpToolInfo(\n name: string,\n _input: Record<string, unknown> | undefined,\n): ToolInfo {\n const metadata = getMcpToolMetadata(name);\n // Fallback: parse tool name from mcp__<server>__<tool> prefix\n const title =\n metadata?.name ?? (name.split(\"__\").slice(2).join(\"__\") || name);\n\n return {\n title,\n kind: \"other\",\n content: [],\n };\n}\n\ninterface StructuredPatchHunk {\n oldStart: number;\n oldLines: number;\n newStart: number;\n newLines: number;\n lines: string[];\n}\n\ninterface StructuredPatch {\n oldFileName: string;\n newFileName: string;\n hunks: StructuredPatchHunk[];\n}\n\nexport function toolUpdateFromEditToolResponse(\n toolResponse: unknown,\n): { content: ToolCallContent[]; locations: ToolCallLocation[] } | null {\n if (!toolResponse || typeof toolResponse !== \"object\") return null;\n const response = toolResponse as Record<string, unknown>;\n\n const patches = response.structuredPatch as StructuredPatch[] | undefined;\n if (!Array.isArray(patches) || patches.length === 0) return null;\n\n const content: ToolCallContent[] = [];\n const locations: ToolCallLocation[] = [];\n\n for (const patch of patches) {\n if (!patch.hunks || patch.hunks.length === 0) continue;\n\n const filePath = patch.newFileName || patch.oldFileName;\n\n const oldLines: string[] = [];\n const newLines: string[] = [];\n for (const hunk of patch.hunks) {\n for (const line of hunk.lines) {\n if (line.startsWith(\"-\")) {\n oldLines.push(line.slice(1));\n } else if (line.startsWith(\"+\")) {\n newLines.push(line.slice(1));\n } else if (line.startsWith(\" \")) {\n oldLines.push(line.slice(1));\n newLines.push(line.slice(1));\n }\n }\n }\n\n content.push({\n type: \"diff\",\n path: filePath,\n oldText: oldLines.join(\"\\n\"),\n newText: newLines.join(\"\\n\"),\n });\n\n const firstHunk = patch.hunks[0];\n locations.push({\n path: filePath,\n line: firstHunk.newStart,\n });\n }\n\n if (content.length === 0) return null;\n return { content, locations };\n}\n\nexport function toolUpdateFromToolResult(\n toolResult:\n | ToolResultBlockParam\n | BetaWebSearchToolResultBlockParam\n | BetaWebFetchToolResultBlockParam\n | WebSearchToolResultBlockParam\n | BetaCodeExecutionToolResultBlockParam\n | BetaBashCodeExecutionToolResultBlockParam\n | BetaTextEditorCodeExecutionToolResultBlockParam\n | BetaRequestMCPToolResultBlockParam\n | BetaToolSearchToolResultBlockParam,\n toolUse: Pick<ToolUseBlock, \"name\" | \"input\"> | undefined,\n options?: {\n supportsTerminalOutput?: boolean;\n toolUseId?: string;\n cachedFileContent?: Record<string, string>;\n },\n): Pick<ToolCallUpdate, \"title\" | \"content\" | \"locations\" | \"_meta\"> {\n if (\n \"is_error\" in toolResult &&\n toolResult.is_error &&\n toolResult.content &&\n (toolResult.content as unknown[]).length > 0\n ) {\n return toAcpContentUpdate(toolResult.content, true);\n }\n\n switch (toolUse?.name) {\n case \"Read\":\n if (Array.isArray(toolResult.content) && toolResult.content.length > 0) {\n return {\n content: toolResult.content.map((item) => {\n const itemObj = item as {\n type?: string;\n text?: string;\n source?: { data?: string; media_type?: string };\n };\n if (itemObj.type === \"text\") {\n return {\n type: \"content\" as const,\n content: text(\n markdownEscape(stripSystemReminders(itemObj.text ?? \"\")),\n ),\n };\n }\n if (itemObj.type === \"image\" && itemObj.source) {\n return {\n type: \"content\" as const,\n content: {\n type: \"image\" as const,\n data: itemObj.source.data ?? \"\",\n mimeType: itemObj.source.media_type ?? \"image/png\",\n },\n };\n }\n return {\n type: \"content\" as const,\n content: item as { type: \"text\"; text: string },\n };\n }),\n };\n } else if (\n typeof toolResult.content === \"string\" &&\n toolResult.content.length > 0\n ) {\n return {\n content: toolContent()\n .text(markdownEscape(stripSystemReminders(toolResult.content)))\n .build(),\n };\n }\n return {};\n\n case \"Bash\": {\n const result = toolResult.content;\n const terminalId =\n \"tool_use_id\" in toolResult ? String(toolResult.tool_use_id) : \"\";\n const isError = \"is_error\" in toolResult && toolResult.is_error;\n\n let output = \"\";\n let exitCode = isError ? 1 : 0;\n\n if (\n result &&\n typeof result === \"object\" &&\n \"type\" in result &&\n (result as { type: string }).type === \"bash_code_execution_result\"\n ) {\n const bashResult = result as {\n stdout?: string;\n stderr?: string;\n return_code: number;\n };\n output = [bashResult.stdout, bashResult.stderr]\n .filter(Boolean)\n .join(\"\\n\");\n exitCode = bashResult.return_code;\n } else if (typeof result === \"string\") {\n output = result;\n } else if (\n Array.isArray(result) &&\n result.length > 0 &&\n \"text\" in result[0] &&\n typeof result[0].text === \"string\"\n ) {\n output = result.map((c: { text?: string }) => c.text ?? \"\").join(\"\\n\");\n }\n\n if (options?.supportsTerminalOutput) {\n return {\n content: [{ type: \"terminal\" as const, terminalId }],\n _meta: {\n terminal_info: {\n terminal_id: terminalId,\n },\n terminal_output: {\n terminal_id: terminalId,\n data: output,\n },\n terminal_exit: {\n terminal_id: terminalId,\n exit_code: exitCode,\n signal: null,\n },\n },\n };\n }\n if (output.trim()) {\n return {\n content: toolContent()\n .text(`\\`\\`\\`console\\n${output.trimEnd()}\\n\\`\\`\\``)\n .build(),\n };\n }\n return {};\n }\n case \"Edit\":\n case \"Write\":\n return {};\n\n case \"ExitPlanMode\": {\n return { title: \"Exited Plan Mode\" };\n }\n case \"AskUserQuestion\": {\n const content = toolResult.content;\n if (Array.isArray(content) && content.length > 0) {\n const firstItem = content[0];\n if (\n typeof firstItem === \"object\" &&\n firstItem !== null &&\n \"text\" in firstItem\n ) {\n return {\n title: \"Answer received\",\n content: toolContent().text(String(firstItem.text)).build(),\n };\n }\n }\n return { title: \"Question answered\" };\n }\n case \"WebFetch\": {\n const input = toolUse?.input as Record<string, unknown> | undefined;\n const url = input?.url ? String(input.url) : \"\";\n const prompt = input?.prompt ? String(input.prompt) : undefined;\n\n const resultContent = toAcpContentUpdate(\n toolResult.content,\n \"is_error\" in toolResult ? toolResult.is_error : false,\n );\n\n const content: ToolCallContent[] = [];\n if (url) {\n content.push({\n type: \"content\",\n content: resourceLink(url, url, {\n description: prompt,\n }),\n });\n }\n if (resultContent.content) {\n content.push(...resultContent.content);\n }\n\n return { content };\n }\n default: {\n return toAcpContentUpdate(\n toolResult.content,\n \"is_error\" in toolResult ? toolResult.is_error : false,\n );\n }\n }\n}\n\nfunction itemToText(item: unknown): string | null {\n if (!item || typeof item !== \"object\") return null;\n const obj = item as Record<string, unknown>;\n // Standard text block\n if (obj.type === \"text\" && typeof obj.text === \"string\") {\n return stripSystemReminders(obj.text);\n }\n // Any other structured object — serialize it\n try {\n return JSON.stringify(obj, null, 2);\n } catch {\n return null;\n }\n}\n\nfunction toAcpContentUpdate(\n content: unknown,\n isError: boolean = false,\n): Pick<ToolCallUpdate, \"content\"> {\n if (Array.isArray(content) && content.length > 0) {\n const texts: string[] = [];\n for (const item of content) {\n const t = itemToText(item);\n if (t) texts.push(t);\n }\n if (texts.length > 0) {\n const combined = texts.join(\"\\n\");\n return {\n content: toolContent()\n .text(isError ? `\\`\\`\\`\\n${combined}\\n\\`\\`\\`` : combined)\n .build(),\n };\n }\n } else if (typeof content === \"string\" && content.length > 0) {\n return {\n content: toolContent()\n .text(isError ? `\\`\\`\\`\\n${content}\\n\\`\\`\\`` : content)\n .build(),\n };\n } else if (content && typeof content === \"object\") {\n try {\n const json = JSON.stringify(content, null, 2);\n if (json && json !== \"{}\") {\n return {\n content: toolContent().text(json).build(),\n };\n }\n } catch {\n // ignore serialization errors\n }\n }\n return {};\n}\n\nexport type ClaudePlanEntry = {\n content: string;\n status: \"pending\" | \"in_progress\" | \"completed\";\n activeForm: string;\n};\n\nexport function planEntries(input: { todos: ClaudePlanEntry[] }): PlanEntry[] {\n return input.todos.map((input) => ({\n content: input.content,\n status: input.status,\n priority: \"medium\",\n }));\n}\n\n/**\n * attempt to resolve full file contents for diff generation\n *\n * 1) check file content cache exists, and is valid (old_text in content)\n * 2) if missing or invalid, read file from disk\n * 3) if both fail, return null, we'll fall back to fragmented snippet diff\n */\nfunction resolveFileContent(\n filePath: string,\n oldText: string,\n cachedFileContent?: Record<string, string>,\n): string | null {\n if (cachedFileContent && filePath in cachedFileContent) {\n const cached = cachedFileContent[filePath];\n if (cached.includes(oldText)) {\n return cached;\n }\n }\n\n try {\n const content = fs.readFileSync(filePath, \"utf-8\");\n if (content.includes(oldText)) {\n return content;\n }\n } catch {\n return null;\n }\n\n return null;\n}\n\nfunction markdownEscape(text: string): string {\n let escapedText = \"```\";\n for (const [m] of text.matchAll(/^```+/gm)) {\n while (m.length >= escapedText.length) {\n escapedText += \"`\";\n }\n }\n return `${escapedText}\\n${text}${text.endsWith(\"\\n\") ? \"\" : \"\\n\"}${escapedText}`;\n}\n","import type { McpServerStatus, Query } from \"@anthropic-ai/claude-agent-sdk\";\nimport { Logger } from \"../../../utils/logger\";\n\nexport interface McpToolMetadata {\n readOnly: boolean;\n name: string;\n description?: string;\n}\n\nconst mcpToolMetadataCache: Map<string, McpToolMetadata> = new Map();\n\nconst PENDING_RETRY_INTERVAL_MS = 1_000;\nconst PENDING_MAX_RETRIES = 10;\n\nfunction buildToolKey(serverName: string, toolName: string): string {\n return `mcp__${serverName}__${toolName}`;\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function fetchMcpToolMetadata(\n q: Query,\n logger: Logger = new Logger({ debug: false, prefix: \"[McpToolMetadata]\" }),\n): Promise<void> {\n let retries = 0;\n\n while (retries <= PENDING_MAX_RETRIES) {\n let statuses: McpServerStatus[];\n try {\n statuses = await q.mcpServerStatus();\n } catch (error) {\n logger.error(\"Failed to fetch MCP server status\", {\n error: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n\n const pendingServers = statuses.filter((s) => s.status === \"pending\");\n\n for (const server of statuses) {\n if (server.status !== \"connected\" || !server.tools) {\n continue;\n }\n\n let readOnlyCount = 0;\n for (const tool of server.tools) {\n const toolKey = buildToolKey(server.name, tool.name);\n const readOnly = tool.annotations?.readOnly === true;\n\n mcpToolMetadataCache.set(toolKey, {\n readOnly,\n name: tool.name,\n description: tool.description,\n });\n if (readOnly) readOnlyCount++;\n }\n\n logger.info(\"Fetched MCP tool metadata\", {\n serverName: server.name,\n toolCount: server.tools.length,\n readOnlyCount,\n });\n }\n\n if (pendingServers.length === 0) {\n return;\n }\n\n retries++;\n if (retries > PENDING_MAX_RETRIES) {\n logger.warn(\"Gave up waiting for pending MCP servers\", {\n pendingServers: pendingServers.map((s) => s.name),\n });\n return;\n }\n\n logger.info(\"Waiting for pending MCP servers\", {\n pendingServers: pendingServers.map((s) => s.name),\n retry: retries,\n });\n await delay(PENDING_RETRY_INTERVAL_MS);\n }\n}\n\nexport function getMcpToolMetadata(\n toolName: string,\n): McpToolMetadata | undefined {\n return mcpToolMetadataCache.get(toolName);\n}\n\nexport function isMcpToolReadOnly(toolName: string): boolean {\n const metadata = mcpToolMetadataCache.get(toolName);\n return metadata?.readOnly === true;\n}\n\nexport function getConnectedMcpServerNames(): string[] {\n const names = new Set<string>();\n for (const key of mcpToolMetadataCache.keys()) {\n const parts = key.split(\"__\");\n if (parts.length >= 3) names.add(parts[1]);\n }\n return [...names];\n}\n\nexport function clearMcpToolMetadataCache(): void {\n mcpToolMetadataCache.clear();\n}\n","import * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { SessionNotification } from \"@agentclientprotocol/sdk\";\n\nfunction getClaudeConfigDir(): string {\n return process.env.CLAUDE_CONFIG_DIR || path.join(os.homedir(), \".claude\");\n}\n\nexport function getClaudePlansDir(): string {\n return path.join(getClaudeConfigDir(), \"plans\");\n}\n\nexport function isClaudePlanFilePath(filePath: string | undefined): boolean {\n if (!filePath) return false;\n const resolved = path.resolve(filePath);\n const plansDir = path.resolve(getClaudePlansDir());\n return resolved === plansDir || resolved.startsWith(plansDir + path.sep);\n}\n\nexport function isPlanReady(plan: string | undefined): boolean {\n if (!plan) return false;\n const trimmed = plan.trim();\n if (trimmed.length < 40) return false;\n return /(^|\\n)#{1,6}\\s+\\S/.test(trimmed);\n}\n\nexport function getLatestAssistantText(\n notifications: SessionNotification[],\n): string | null {\n const chunks: string[] = [];\n let started = false;\n\n for (let i = notifications.length - 1; i >= 0; i -= 1) {\n const update = notifications[i]?.update;\n if (!update) continue;\n\n if (update.sessionUpdate === \"agent_message_chunk\") {\n started = true;\n const content = update.content as {\n type?: string;\n text?: string;\n } | null;\n if (content?.type === \"text\" && content.text) {\n chunks.push(content.text);\n }\n continue;\n }\n\n if (started) {\n break;\n }\n }\n\n if (chunks.length === 0) return null;\n return chunks.reverse().join(\"\");\n}\n","import type { ToolCallContent, ToolKind } from \"@agentclientprotocol/sdk\";\nimport { z } from \"zod\";\nimport type { PermissionOption } from \"../permissions/permission-options\";\n\nexport const OPTION_PREFIX = \"option_\";\n\nexport const QuestionOptionSchema = z.object({\n label: z.string(),\n description: z.string().optional(),\n});\n\nexport const QuestionItemSchema = z.object({\n question: z.string(),\n header: z.string().optional(),\n options: z.array(QuestionOptionSchema),\n multiSelect: z.boolean().optional(),\n completed: z.boolean().optional(),\n});\n\nexport const QuestionMetaSchema = z.object({\n questions: z.array(QuestionItemSchema),\n});\n\nexport type QuestionOption = z.infer<typeof QuestionOptionSchema>;\nexport type QuestionItem = z.infer<typeof QuestionItemSchema>;\nexport type QuestionMeta = z.infer<typeof QuestionMetaSchema>;\n\nexport interface AskUserQuestionInput {\n questions?: QuestionItem[];\n question?: string;\n header?: string;\n options?: QuestionOption[];\n multiSelect?: boolean;\n}\n\nexport function normalizeAskUserQuestionInput(\n input: AskUserQuestionInput,\n): QuestionItem[] | null {\n if (input.questions && input.questions.length > 0) {\n return input.questions;\n }\n\n if (input.question) {\n return [\n {\n question: input.question,\n header: input.header,\n options: input.options || [],\n multiSelect: input.multiSelect,\n },\n ];\n }\n\n return null;\n}\n\ninterface QuestionToolCallData {\n toolCallId: string;\n title: string;\n kind: ToolKind;\n content: ToolCallContent[];\n _meta: {\n codeToolKind: \"question\";\n questions: QuestionItem[];\n };\n}\n\nexport function buildQuestionToolCallData(\n questions: QuestionItem[],\n): QuestionToolCallData {\n return {\n toolCallId: `question-${Date.now()}`,\n title: questions[0]?.question ?? \"Question\",\n kind: \"other\",\n content: [],\n _meta: {\n codeToolKind: \"question\",\n questions,\n },\n };\n}\n\nexport function buildQuestionOptions(\n question: QuestionItem,\n): PermissionOption[] {\n return question.options.map((opt, idx) => ({\n kind: \"allow_once\" as const,\n name: opt.label,\n optionId: `${OPTION_PREFIX}${idx}`,\n _meta: opt.description ? { description: opt.description } : undefined,\n }));\n}\n","import { IS_ROOT } from \"./utils/common\";\n\nexport interface ModeInfo {\n id: CodeExecutionMode;\n name: string;\n description: string;\n}\n\n// Helper constant that can easily be toggled for env/feature flag/etc\nconst ALLOW_BYPASS = !IS_ROOT;\n\nconst availableModes: ModeInfo[] = [\n {\n id: \"default\",\n name: \"Default\",\n description: \"Standard behavior, prompts for dangerous operations\",\n },\n {\n id: \"acceptEdits\",\n name: \"Accept Edits\",\n description: \"Auto-accept file edit operations\",\n },\n {\n id: \"plan\",\n name: \"Plan Mode\",\n description: \"Planning mode, no actual tool execution\",\n },\n // {\n // id: \"dontAsk\",\n // name: \"Don't Ask\",\n // description: \"Don't prompt for permissions, deny if not pre-approved\",\n // },\n];\n\nif (ALLOW_BYPASS) {\n availableModes.push({\n id: \"bypassPermissions\",\n name: \"Bypass Permissions\",\n description: \"Bypass all permission checks\",\n });\n}\n\n// Expose execution mode IDs in type-safe order for type checks\nexport const CODE_EXECUTION_MODES = [\n \"default\",\n \"acceptEdits\",\n \"plan\",\n // \"dontAsk\",\n \"bypassPermissions\",\n] as const;\n\nexport type CodeExecutionMode = (typeof CODE_EXECUTION_MODES)[number];\n\nexport function getAvailableModes(): ModeInfo[] {\n // When IS_ROOT, do not allow bypassPermissions\n return IS_ROOT\n ? availableModes.filter((m) => m.id !== \"bypassPermissions\")\n : availableModes;\n}\n","export {\n CODE_EXECUTION_MODES,\n type CodeExecutionMode,\n getAvailableModes,\n type ModeInfo,\n} from \"../../execution-mode\";\n\nimport type { CodeExecutionMode } from \"../../execution-mode\";\nimport { isMcpToolReadOnly } from \"./mcp/tool-metadata\";\n\nexport const READ_TOOLS: Set<string> = new Set([\"Read\", \"NotebookRead\"]);\n\nexport const WRITE_TOOLS: Set<string> = new Set([\n \"Edit\",\n \"Write\",\n \"NotebookEdit\",\n]);\n\nexport const BASH_TOOLS: Set<string> = new Set([\n \"Bash\",\n \"BashOutput\",\n \"KillShell\",\n]);\n\nexport const SEARCH_TOOLS: Set<string> = new Set([\"Glob\", \"Grep\", \"LS\"]);\n\nexport const WEB_TOOLS: Set<string> = new Set([\"WebSearch\", \"WebFetch\"]);\n\nexport const AGENT_TOOLS: Set<string> = new Set([\n \"Task\",\n \"Agent\",\n \"TodoWrite\",\n \"Skill\",\n]);\n\nconst BASE_ALLOWED_TOOLS = [\n ...READ_TOOLS,\n ...SEARCH_TOOLS,\n ...WEB_TOOLS,\n ...AGENT_TOOLS,\n];\n\nconst AUTO_ALLOWED_TOOLS: Record<string, Set<string>> = {\n default: new Set(BASE_ALLOWED_TOOLS),\n acceptEdits: new Set([...BASE_ALLOWED_TOOLS, ...WRITE_TOOLS]),\n plan: new Set(BASE_ALLOWED_TOOLS),\n // dontAsk: new Set(BASE_ALLOWED_TOOLS),\n};\n\nexport function isToolAllowedForMode(\n toolName: string,\n mode: CodeExecutionMode,\n): boolean {\n if (mode === \"bypassPermissions\") {\n return true;\n }\n if (AUTO_ALLOWED_TOOLS[mode]?.has(toolName) === true) {\n return true;\n }\n if (isMcpToolReadOnly(toolName)) {\n return true;\n }\n return false;\n}\n","import type { PermissionUpdate } from \"@anthropic-ai/claude-agent-sdk\";\nimport { IS_ROOT } from \"../../../utils/common\";\nimport { BASH_TOOLS, READ_TOOLS, SEARCH_TOOLS, WRITE_TOOLS } from \"../tools\";\n\nexport interface PermissionOption {\n kind: \"allow_once\" | \"allow_always\" | \"reject_once\" | \"reject_always\";\n name: string;\n optionId: string;\n _meta?: { description?: string; customInput?: boolean };\n}\n\nfunction permissionOptions(allowAlwaysLabel: string): PermissionOption[] {\n return [\n { kind: \"allow_once\", name: \"Yes\", optionId: \"allow\" },\n { kind: \"allow_always\", name: allowAlwaysLabel, optionId: \"allow_always\" },\n {\n kind: \"reject_once\",\n name: \"No, and tell the agent what to do differently\",\n optionId: \"reject\",\n _meta: { customInput: true },\n },\n ];\n}\n\nexport function buildPermissionOptions(\n toolName: string,\n toolInput: Record<string, unknown>,\n cwd?: string,\n suggestions?: PermissionUpdate[],\n): PermissionOption[] {\n if (BASH_TOOLS.has(toolName)) {\n const rawRuleContent = suggestions\n ?.flatMap((s) => (\"rules\" in s ? s.rules : []))\n .find((r) => r.toolName === \"Bash\" && r.ruleContent)?.ruleContent;\n const ruleContent = rawRuleContent?.replace(/:?\\*$/, \"\");\n\n const command = toolInput?.command as string | undefined;\n const cmdName = command?.split(/\\s+/)[0] ?? \"this command\";\n const cwdLabel = cwd ? ` in ${cwd}` : \"\";\n const label = ruleContent ?? `\\`${cmdName}\\` commands`;\n\n return permissionOptions(\n `Yes, and don't ask again for ${label}${cwdLabel}`,\n );\n }\n\n if (toolName === \"BashOutput\") {\n return permissionOptions(\"Yes, allow all background process reads\");\n }\n\n if (toolName === \"KillShell\") {\n return permissionOptions(\"Yes, allow killing processes\");\n }\n\n if (WRITE_TOOLS.has(toolName)) {\n return permissionOptions(\"Yes, allow all edits during this session\");\n }\n\n if (READ_TOOLS.has(toolName)) {\n return permissionOptions(\"Yes, allow all reads during this session\");\n }\n\n if (SEARCH_TOOLS.has(toolName)) {\n return permissionOptions(\"Yes, allow all searches during this session\");\n }\n\n if (toolName === \"WebFetch\") {\n const url = toolInput?.url as string | undefined;\n let domain = \"\";\n try {\n domain = url ? new URL(url).hostname : \"\";\n } catch {}\n return permissionOptions(\n domain\n ? `Yes, allow all fetches from ${domain}`\n : \"Yes, allow all fetches\",\n );\n }\n\n if (toolName === \"WebSearch\") {\n return permissionOptions(\"Yes, allow all web searches\");\n }\n\n if (toolName === \"Task\") {\n return permissionOptions(\"Yes, allow all sub-tasks\");\n }\n\n if (toolName === \"TodoWrite\") {\n return permissionOptions(\"Yes, allow all todo updates\");\n }\n\n return permissionOptions(\"Yes, always allow\");\n}\n\nconst ALLOW_BYPASS = !IS_ROOT || !!process.env.IS_SANDBOX;\n\nexport function buildExitPlanModePermissionOptions(): PermissionOption[] {\n const options: PermissionOption[] = [];\n\n if (ALLOW_BYPASS) {\n options.push({\n kind: \"allow_always\",\n name: \"Yes, bypass all permissions\",\n optionId: \"bypassPermissions\",\n });\n }\n\n options.push(\n {\n kind: \"allow_always\",\n name: \"Yes, and auto-accept edits\",\n optionId: \"acceptEdits\",\n },\n {\n kind: \"allow_once\",\n name: \"Yes, and manually approve edits\",\n optionId: \"default\",\n },\n {\n kind: \"reject_once\",\n name: \"No, and tell the agent what to do differently\",\n optionId: \"reject_with_feedback\",\n _meta: { customInput: true },\n },\n );\n\n return options;\n}\n","import type {\n AgentSideConnection,\n RequestPermissionResponse,\n} from \"@agentclientprotocol/sdk\";\nimport type { PermissionUpdate } from \"@anthropic-ai/claude-agent-sdk\";\nimport { text } from \"../../../utils/acp-content\";\nimport type { Logger } from \"../../../utils/logger\";\nimport { toolInfoFromToolUse } from \"../conversion/tool-use-to-acp\";\nimport {\n getClaudePlansDir,\n getLatestAssistantText,\n isClaudePlanFilePath,\n isPlanReady,\n} from \"../plan/utils\";\nimport {\n type AskUserQuestionInput,\n normalizeAskUserQuestionInput,\n OPTION_PREFIX,\n type QuestionItem,\n} from \"../questions/utils\";\nimport { isToolAllowedForMode, WRITE_TOOLS } from \"../tools\";\nimport type { Session } from \"../types\";\nimport {\n buildExitPlanModePermissionOptions,\n buildPermissionOptions,\n} from \"./permission-options\";\n\nexport type ToolPermissionResult =\n | {\n behavior: \"allow\";\n updatedInput: Record<string, unknown>;\n updatedPermissions?: PermissionUpdate[];\n }\n | {\n behavior: \"deny\";\n message: string;\n interrupt?: boolean;\n };\n\ninterface ToolHandlerContext {\n session: Session;\n toolName: string;\n toolInput: Record<string, unknown>;\n toolUseID: string;\n suggestions?: PermissionUpdate[];\n signal?: AbortSignal;\n client: AgentSideConnection;\n sessionId: string;\n fileContentCache: { [key: string]: string };\n logger: Logger;\n updateConfigOption: (configId: string, value: string) => Promise<void>;\n allowedDomains?: string[];\n}\n\nasync function emitToolDenial(\n context: ToolHandlerContext,\n message: string,\n): Promise<void> {\n context.logger.info(`[canUseTool] Tool denied: ${context.toolName}`, {\n message,\n });\n await context.client.sessionUpdate({\n sessionId: context.sessionId,\n update: {\n sessionUpdate: \"tool_call_update\",\n toolCallId: context.toolUseID,\n status: \"failed\",\n content: [{ type: \"content\", content: text(message) }],\n },\n });\n}\n\nfunction getPlanFromFile(\n session: Session,\n fileContentCache: { [key: string]: string },\n): string | undefined {\n return (\n session.lastPlanContent ||\n (session.lastPlanFilePath\n ? fileContentCache[session.lastPlanFilePath]\n : undefined)\n );\n}\n\nfunction ensurePlanInInput(\n toolInput: Record<string, unknown>,\n fallbackPlan: string | undefined,\n): Record<string, unknown> {\n const hasPlan = typeof (toolInput as { plan?: unknown })?.plan === \"string\";\n if (hasPlan || !fallbackPlan) {\n return toolInput;\n }\n return { ...toolInput, plan: fallbackPlan };\n}\n\nfunction extractPlanText(input: Record<string, unknown>): string | undefined {\n const plan = (input as { plan?: unknown })?.plan;\n return typeof plan === \"string\" ? plan : undefined;\n}\n\nasync function createPlanValidationError(\n message: string,\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n await emitToolDenial(context, message);\n return { behavior: \"deny\", message, interrupt: false };\n}\n\nasync function validatePlanContent(\n planText: string | undefined,\n context: ToolHandlerContext,\n): Promise<{ valid: true } | { valid: false; error: ToolPermissionResult }> {\n if (!planText) {\n const message = `Plan not ready. Provide the full markdown plan in ExitPlanMode or write it to ${getClaudePlansDir()} before requesting approval.`;\n return {\n valid: false,\n error: await createPlanValidationError(message, context),\n };\n }\n\n if (!isPlanReady(planText)) {\n const message =\n \"Plan not ready. Provide the full markdown plan in ExitPlanMode before requesting approval.\";\n return {\n valid: false,\n error: await createPlanValidationError(message, context),\n };\n }\n\n return { valid: true };\n}\n\nasync function requestPlanApproval(\n context: ToolHandlerContext,\n updatedInput: Record<string, unknown>,\n): Promise<RequestPermissionResponse> {\n const { client, sessionId, toolUseID } = context;\n\n const toolInfo = toolInfoFromToolUse({\n name: context.toolName,\n input: updatedInput,\n });\n\n return await client.requestPermission({\n options: buildExitPlanModePermissionOptions(),\n sessionId,\n toolCall: {\n toolCallId: toolUseID,\n title: toolInfo.title,\n kind: toolInfo.kind,\n content: toolInfo.content,\n locations: toolInfo.locations,\n rawInput: { ...updatedInput, toolName: context.toolName },\n },\n });\n}\n\nasync function applyPlanApproval(\n response: RequestPermissionResponse,\n context: ToolHandlerContext,\n updatedInput: Record<string, unknown>,\n): Promise<ToolPermissionResult> {\n const { session } = context;\n\n if (\n response.outcome?.outcome === \"selected\" &&\n (response.outcome.optionId === \"default\" ||\n response.outcome.optionId === \"acceptEdits\" ||\n response.outcome.optionId === \"bypassPermissions\")\n ) {\n session.permissionMode = response.outcome\n .optionId as typeof session.permissionMode;\n await session.query.setPermissionMode(response.outcome.optionId);\n await context.client.sessionUpdate({\n sessionId: context.sessionId,\n update: {\n sessionUpdate: \"current_mode_update\",\n currentModeId: response.outcome.optionId,\n },\n });\n await context.updateConfigOption(\"mode\", response.outcome.optionId);\n\n return {\n behavior: \"allow\",\n updatedInput,\n updatedPermissions: context.suggestions ?? [\n {\n type: \"setMode\",\n mode: response.outcome.optionId,\n destination: \"localSettings\",\n },\n ],\n };\n }\n\n const customInput = (response._meta as Record<string, unknown> | undefined)\n ?.customInput as string | undefined;\n const feedback = customInput?.trim();\n\n const message = feedback\n ? `User rejected the plan with feedback: ${feedback}`\n : \"User rejected the plan. Wait for the user to provide direction.\";\n await emitToolDenial(context, message);\n return { behavior: \"deny\", message, interrupt: !feedback };\n}\n\nasync function handleEnterPlanModeTool(\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n const { session, toolInput } = context;\n\n session.permissionMode = \"plan\";\n await session.query.setPermissionMode(\"plan\");\n await context.updateConfigOption(\"mode\", \"plan\");\n\n return {\n behavior: \"allow\",\n updatedInput: toolInput as Record<string, unknown>,\n };\n}\n\nasync function handleExitPlanModeTool(\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n const { session, toolInput, fileContentCache } = context;\n\n const planFromFile = getPlanFromFile(session, fileContentCache);\n const latestText = getLatestAssistantText(session.notificationHistory);\n const fallbackPlan = planFromFile || (latestText ?? undefined);\n const updatedInput = ensurePlanInInput(toolInput, fallbackPlan);\n const planText = extractPlanText(updatedInput);\n\n const validationResult = await validatePlanContent(planText, context);\n if (!validationResult.valid) {\n return validationResult.error;\n }\n\n const response = await requestPlanApproval(context, updatedInput);\n if (context.signal?.aborted || response.outcome?.outcome === \"cancelled\") {\n throw new Error(\"Tool use aborted\");\n }\n return await applyPlanApproval(response, context, updatedInput);\n}\n\nfunction buildQuestionOptions(question: QuestionItem) {\n return (question.options || []).map((opt, idx) => ({\n kind: \"allow_once\" as const,\n name: opt.label,\n optionId: `${OPTION_PREFIX}${idx}`,\n _meta: opt.description ? { description: opt.description } : undefined,\n }));\n}\n\nasync function handleAskUserQuestionTool(\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n const input = context.toolInput as AskUserQuestionInput;\n context.logger.info(\"[AskUserQuestion] Received input\", { input });\n const questions = normalizeAskUserQuestionInput(input);\n context.logger.info(\"[AskUserQuestion] Normalized questions\", { questions });\n\n if (!questions || questions.length === 0) {\n context.logger.warn(\"[AskUserQuestion] No questions found in input\");\n return {\n behavior: \"deny\",\n message: \"No questions provided\",\n };\n }\n\n const { client, sessionId, toolUseID, toolInput } = context;\n const firstQuestion = questions[0];\n const options = buildQuestionOptions(firstQuestion);\n\n const toolInfo = toolInfoFromToolUse({\n name: context.toolName,\n input: toolInput,\n });\n\n const response = await client.requestPermission({\n options,\n sessionId,\n toolCall: {\n toolCallId: toolUseID,\n title: firstQuestion.question,\n kind: \"other\",\n content: toolInfo.content,\n _meta: {\n codeToolKind: \"question\",\n questions,\n },\n },\n });\n\n if (context.signal?.aborted || response.outcome?.outcome === \"cancelled\") {\n throw new Error(\"Tool use aborted\");\n }\n\n if (response.outcome?.outcome !== \"selected\") {\n const customMessage = (\n response._meta as Record<string, unknown> | undefined\n )?.message;\n return {\n behavior: \"deny\",\n message:\n typeof customMessage === \"string\"\n ? customMessage\n : \"User cancelled the questions\",\n };\n }\n\n const answers = response._meta?.answers as Record<string, string> | undefined;\n if (!answers || Object.keys(answers).length === 0) {\n return {\n behavior: \"deny\",\n message: \"User did not provide answers\",\n };\n }\n\n return {\n behavior: \"allow\",\n updatedInput: {\n ...(context.toolInput as Record<string, unknown>),\n answers,\n },\n };\n}\n\nasync function handleDefaultPermissionFlow(\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n const {\n session,\n toolName,\n toolInput,\n toolUseID,\n client,\n sessionId,\n suggestions,\n } = context;\n\n const toolInfo = toolInfoFromToolUse({ name: toolName, input: toolInput });\n\n const options = buildPermissionOptions(\n toolName,\n toolInput as Record<string, unknown>,\n session?.cwd,\n suggestions,\n );\n\n const response = await client.requestPermission({\n options,\n sessionId,\n toolCall: {\n toolCallId: toolUseID,\n title: toolInfo.title,\n kind: toolInfo.kind,\n content: toolInfo.content,\n locations: toolInfo.locations,\n rawInput: { ...(toolInput as Record<string, unknown>), toolName },\n },\n });\n\n if (context.signal?.aborted || response.outcome?.outcome === \"cancelled\") {\n throw new Error(\"Tool use aborted\");\n }\n\n if (\n response.outcome?.outcome === \"selected\" &&\n (response.outcome.optionId === \"allow\" ||\n response.outcome.optionId === \"allow_always\")\n ) {\n if (response.outcome.optionId === \"allow_always\") {\n return {\n behavior: \"allow\",\n updatedInput: toolInput as Record<string, unknown>,\n updatedPermissions: suggestions ?? [\n {\n type: \"addRules\",\n rules: [{ toolName }],\n behavior: \"allow\",\n destination: \"localSettings\",\n },\n ],\n };\n }\n return {\n behavior: \"allow\",\n updatedInput: toolInput as Record<string, unknown>,\n };\n } else {\n const message = \"User refused permission to run tool\";\n await emitToolDenial(context, message);\n return {\n behavior: \"deny\",\n message,\n };\n }\n}\n\nfunction handlePlanFileException(\n context: ToolHandlerContext,\n): ToolPermissionResult | null {\n const { session, toolName, toolInput } = context;\n\n if (session.permissionMode !== \"plan\" || !WRITE_TOOLS.has(toolName)) {\n return null;\n }\n\n const filePath = (toolInput as { file_path?: string })?.file_path;\n if (!isClaudePlanFilePath(filePath)) {\n return null;\n }\n\n session.lastPlanFilePath = filePath;\n const content = (toolInput as { content?: string })?.content;\n if (typeof content === \"string\") {\n session.lastPlanContent = content;\n }\n\n return {\n behavior: \"allow\",\n updatedInput: toolInput as Record<string, unknown>,\n };\n}\n\nfunction extractDomainFromUrl(url: string): string | null {\n try {\n return new URL(url).hostname;\n } catch {\n return null;\n }\n}\n\nfunction isDomainAllowed(hostname: string, allowedDomains: string[]): boolean {\n return allowedDomains.some((pattern) => {\n if (pattern.startsWith(\"*.\")) {\n const suffix = pattern.slice(1); // \".example.com\"\n return hostname === pattern.slice(2) || hostname.endsWith(suffix);\n }\n return hostname === pattern;\n });\n}\n\nexport async function canUseTool(\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n const { toolName, toolInput, session, allowedDomains } = context;\n\n // Enforce domain allowlist for web tools\n if (allowedDomains && allowedDomains.length > 0) {\n if (toolName === \"WebFetch\" || toolName === \"WebSearch\") {\n const url = toolInput.url as string | undefined;\n if (url) {\n const hostname = extractDomainFromUrl(url);\n if (hostname && !isDomainAllowed(hostname, allowedDomains)) {\n const message = `Domain \"${hostname}\" is not in the allowed list: ${allowedDomains.join(\", \")}`;\n await emitToolDenial(context, message);\n return { behavior: \"deny\", message, interrupt: false };\n }\n }\n }\n }\n\n if (isToolAllowedForMode(toolName, session.permissionMode)) {\n return {\n behavior: \"allow\",\n updatedInput: toolInput as Record<string, unknown>,\n };\n }\n\n if (toolName === \"EnterPlanMode\") {\n return handleEnterPlanModeTool(context);\n }\n\n if (toolName === \"ExitPlanMode\") {\n return handleExitPlanModeTool(context);\n }\n\n if (toolName === \"AskUserQuestion\") {\n return handleAskUserQuestionTool(context);\n }\n\n const planFileResult = handlePlanFileException(context);\n if (planFileResult) {\n return planFileResult;\n }\n\n // if (session.permissionMode === \"dontAsk\") {\n // const message = \"Tool not pre-approved. Denied by dontAsk mode.\";\n // await emitToolDenial(context, message);\n // return { behavior: \"deny\", message, interrupt: false };\n // }\n\n return handleDefaultPermissionFlow(context);\n}\n","import type { AvailableCommand } from \"@agentclientprotocol/sdk\";\nimport type { SlashCommand } from \"@anthropic-ai/claude-agent-sdk\";\n\nconst UNSUPPORTED_COMMANDS = [\n \"context\",\n \"cost\",\n \"keybindings-help\",\n \"login\",\n \"logout\",\n \"output-style:new\",\n \"release-notes\",\n \"todos\",\n];\n\nexport function getAvailableSlashCommands(\n commands: SlashCommand[],\n): AvailableCommand[] {\n return commands\n .map((command) => {\n const input =\n command.argumentHint != null\n ? {\n hint: Array.isArray(command.argumentHint)\n ? command.argumentHint.join(\" \")\n : command.argumentHint,\n }\n : null;\n let name = command.name;\n if (command.name.endsWith(\" (MCP)\")) {\n name = `mcp:${name.replace(\" (MCP)\", \"\")}`;\n }\n return {\n name,\n description: command.description || \"\",\n input,\n };\n })\n .filter(\n (command: AvailableCommand) =>\n !UNSUPPORTED_COMMANDS.includes(command.name),\n );\n}\n","import type { NewSessionRequest } from \"@agentclientprotocol/sdk\";\nimport type { McpServerConfig } from \"@anthropic-ai/claude-agent-sdk\";\n\nexport function parseMcpServers(\n params: Pick<NewSessionRequest, \"mcpServers\">,\n): Record<string, McpServerConfig> {\n const mcpServers: Record<string, McpServerConfig> = {};\n if (!Array.isArray(params.mcpServers)) {\n return mcpServers;\n }\n\n for (const server of params.mcpServers) {\n if (\"type\" in server) {\n mcpServers[server.name] = {\n type: server.type,\n url: server.url,\n headers: server.headers\n ? Object.fromEntries(server.headers.map((e) => [e.name, e.value]))\n : undefined,\n };\n } else {\n mcpServers[server.name] = {\n type: \"stdio\",\n command: server.command,\n args: server.args,\n env: server.env\n ? Object.fromEntries(server.env.map((e) => [e.name, e.value]))\n : undefined,\n };\n }\n }\n\n return mcpServers;\n}\n","export const DEFAULT_MODEL = \"opus\";\n\nconst GATEWAY_TO_SDK_MODEL: Record<string, string> = {\n \"claude-opus-4-5\": \"opus\",\n \"claude-opus-4-6\": \"opus\",\n \"claude-sonnet-4-5\": \"sonnet\",\n \"claude-sonnet-4-6\": \"sonnet\",\n \"claude-haiku-4-5\": \"haiku\",\n};\n\nexport function toSdkModelId(modelId: string): string {\n return GATEWAY_TO_SDK_MODEL[modelId] ?? modelId;\n}\n\nconst MODELS_WITH_1M_CONTEXT = new Set([\n \"claude-opus-4-6\",\n \"claude-sonnet-4-6\",\n]);\n\nexport function supports1MContext(modelId: string): boolean {\n return MODELS_WITH_1M_CONTEXT.has(modelId);\n}\n\nconst MODELS_WITH_EFFORT = new Set([\n \"claude-opus-4-5\",\n \"claude-opus-4-6\",\n \"claude-sonnet-4-6\",\n]);\n\nconst MODELS_WITH_MAX_EFFORT = new Set([\"claude-opus-4-6\"]);\n\nexport function supportsEffort(modelId: string): boolean {\n return MODELS_WITH_EFFORT.has(modelId);\n}\n\nexport function supportsMaxEffort(modelId: string): boolean {\n return MODELS_WITH_MAX_EFFORT.has(modelId);\n}\n\ninterface EffortOption {\n value: string;\n name: string;\n}\n\nexport function getEffortOptions(modelId: string): EffortOption[] | null {\n if (!supportsEffort(modelId)) return null;\n\n const options: EffortOption[] = [\n { value: \"low\", name: \"Low\" },\n { value: \"medium\", name: \"Medium\" },\n { value: \"high\", name: \"High\" },\n ];\n\n if (supportsMaxEffort(modelId)) {\n options.push({ value: \"max\", name: \"Max\" });\n }\n\n return options;\n}\n\n// Model alias resolution — lets callers use human-friendly aliases like\n// \"opus\" or \"sonnet\" instead of full model IDs like \"claude-opus-4-6\".\n\nconst MODEL_CONTEXT_HINT_PATTERN = /\\[(\\d+m)\\]$/i;\n\nfunction tokenizeModelPreference(model: string): {\n tokens: string[];\n contextHint?: string;\n} {\n const lower = model.trim().toLowerCase();\n const contextHint = lower\n .match(MODEL_CONTEXT_HINT_PATTERN)?.[1]\n ?.toLowerCase();\n\n const normalized = lower.replace(MODEL_CONTEXT_HINT_PATTERN, \" $1 \");\n const rawTokens = normalized.split(/[^a-z0-9]+/).filter(Boolean);\n const tokens = rawTokens\n .map((token) => {\n if (token === \"opusplan\") return \"opus\";\n if (token === \"best\" || token === \"default\") return \"\";\n return token;\n })\n .filter((token) => token && token !== \"claude\")\n .filter((token) => /[a-z]/.test(token) || token.endsWith(\"m\"));\n\n return { tokens, contextHint };\n}\n\ninterface ModelOption {\n value: string;\n name?: string;\n description?: string;\n}\n\nfunction scoreModelMatch(\n model: ModelOption,\n tokens: string[],\n contextHint?: string,\n): number {\n const haystack = `${model.value} ${model.name ?? \"\"}`.toLowerCase();\n let score = 0;\n for (const token of tokens) {\n if (haystack.includes(token)) {\n score += token === contextHint ? 3 : 1;\n }\n }\n return score;\n}\n\nexport function resolveModelPreference(\n preference: string,\n options: ModelOption[],\n): string | null {\n const trimmed = preference.trim();\n if (!trimmed) return null;\n\n const lower = trimmed.toLowerCase();\n\n // Exact match on value or display name\n const directMatch = options.find(\n (o) =>\n o.value === trimmed ||\n o.value.toLowerCase() === lower ||\n (o.name && o.name.toLowerCase() === lower),\n );\n if (directMatch) return directMatch.value;\n\n // Substring match\n const includesMatch = options.find((o) => {\n const value = o.value.toLowerCase();\n const display = (o.name ?? \"\").toLowerCase();\n return (\n value.includes(lower) || display.includes(lower) || lower.includes(value)\n );\n });\n if (includesMatch) return includesMatch.value;\n\n // Tokenized matching for aliases like \"opus[1m]\"\n const { tokens, contextHint } = tokenizeModelPreference(trimmed);\n if (tokens.length === 0) return null;\n\n let bestMatch: ModelOption | null = null;\n let bestScore = 0;\n for (const model of options) {\n const score = scoreModelMatch(model, tokens, contextHint);\n if (0 < score && (!bestMatch || bestScore < score)) {\n bestMatch = model;\n bestScore = score;\n }\n }\n\n return bestMatch?.value ?? null;\n}\n","import { spawn } from \"node:child_process\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type {\n CanUseTool,\n McpServerConfig,\n Options,\n SpawnedProcess,\n SpawnOptions,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport { IS_ROOT } from \"../../../utils/common\";\nimport type { Logger } from \"../../../utils/logger\";\nimport {\n createPostToolUseHook,\n createPreToolUseHook,\n type OnModeChange,\n} from \"../hooks\";\nimport type { CodeExecutionMode } from \"../tools\";\nimport type { EffortLevel } from \"../types\";\nimport { APPENDED_INSTRUCTIONS } from \"./instructions\";\nimport { DEFAULT_MODEL } from \"./models\";\nimport type { SettingsManager } from \"./settings\";\n\nexport interface ProcessSpawnedInfo {\n pid: number;\n command: string;\n sessionId: string;\n}\n\nexport interface BuildOptionsParams {\n cwd: string;\n mcpServers: Record<string, McpServerConfig>;\n permissionMode: CodeExecutionMode;\n canUseTool: CanUseTool;\n logger: Logger;\n systemPrompt?: Options[\"systemPrompt\"];\n userProvidedOptions?: Options;\n sessionId: string;\n isResume: boolean;\n forkSession?: boolean;\n additionalDirectories?: string[];\n disableBuiltInTools?: boolean;\n settingsManager: SettingsManager;\n onModeChange?: OnModeChange;\n onProcessSpawned?: (info: ProcessSpawnedInfo) => void;\n onProcessExited?: (pid: number) => void;\n effort?: EffortLevel;\n}\n\nexport function buildSystemPrompt(\n customPrompt?: unknown,\n): Options[\"systemPrompt\"] {\n const defaultPrompt: Options[\"systemPrompt\"] = {\n type: \"preset\",\n preset: \"claude_code\",\n append: APPENDED_INSTRUCTIONS,\n };\n\n if (!customPrompt) {\n return defaultPrompt;\n }\n\n if (typeof customPrompt === \"string\") {\n return customPrompt + APPENDED_INSTRUCTIONS;\n }\n\n if (\n typeof customPrompt === \"object\" &&\n customPrompt !== null &&\n \"append\" in customPrompt &&\n typeof customPrompt.append === \"string\"\n ) {\n return {\n ...defaultPrompt,\n append: customPrompt.append + APPENDED_INSTRUCTIONS,\n };\n }\n\n return defaultPrompt;\n}\n\nfunction buildMcpServers(\n userServers: Record<string, McpServerConfig> | undefined,\n acpServers: Record<string, McpServerConfig>,\n): Record<string, McpServerConfig> {\n return {\n ...(userServers || {}),\n ...acpServers,\n };\n}\n\nfunction buildEnvironment(): Record<string, string> {\n return {\n ...process.env,\n ELECTRON_RUN_AS_NODE: \"1\",\n CLAUDE_CODE_ENABLE_ASK_USER_QUESTION_TOOL: \"true\",\n // Offload all MCP tools by default\n ENABLE_TOOL_SEARCH: \"auto:0\",\n };\n}\n\nfunction buildHooks(\n userHooks: Options[\"hooks\"],\n onModeChange: OnModeChange | undefined,\n settingsManager: SettingsManager,\n logger: Logger,\n): Options[\"hooks\"] {\n return {\n ...userHooks,\n PostToolUse: [\n ...(userHooks?.PostToolUse || []),\n {\n hooks: [createPostToolUseHook({ onModeChange, logger })],\n },\n ],\n PreToolUse: [\n ...(userHooks?.PreToolUse || []),\n {\n hooks: [createPreToolUseHook(settingsManager, logger)],\n },\n ],\n };\n}\n\nfunction getAbortController(\n userProvidedController: AbortController | undefined,\n): AbortController {\n const controller = userProvidedController ?? new AbortController();\n if (controller.signal.aborted) {\n throw new Error(\"Cancelled\");\n }\n return controller;\n}\n\nfunction buildSpawnWrapper(\n sessionId: string,\n onProcessSpawned: (info: ProcessSpawnedInfo) => void,\n onProcessExited?: (pid: number) => void,\n logger?: Logger,\n): (options: SpawnOptions) => SpawnedProcess {\n return (spawnOpts: SpawnOptions): SpawnedProcess => {\n const child = spawn(spawnOpts.command, spawnOpts.args, {\n cwd: spawnOpts.cwd,\n env: spawnOpts.env as NodeJS.ProcessEnv,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n if (child.pid) {\n onProcessSpawned({\n pid: child.pid,\n command: `${spawnOpts.command} ${spawnOpts.args.join(\" \")}`,\n sessionId,\n });\n }\n\n child.stderr?.on(\"data\", (data: Buffer) => {\n const msg = data.toString().trim();\n if (msg && logger) {\n logger.debug(`[claude-code:${child.pid}] stderr: ${msg}`);\n }\n });\n\n if (onProcessExited) {\n child.on(\"exit\", () => {\n if (child.pid) {\n onProcessExited(child.pid);\n }\n });\n }\n\n // Listen for abort signal\n if (spawnOpts.signal) {\n spawnOpts.signal.addEventListener(\"abort\", () => {\n child.kill(\"SIGTERM\");\n });\n }\n\n if (!child.stdin || !child.stdout) {\n throw new Error(\n `Failed to get stdio streams for spawned process (pid=${child.pid})`,\n );\n }\n\n return {\n stdin: child.stdin,\n stdout: child.stdout,\n get killed() {\n return child.killed;\n },\n get exitCode() {\n return child.exitCode;\n },\n kill(signal: NodeJS.Signals) {\n return child.kill(signal);\n },\n // biome-ignore lint/suspicious/noExplicitAny: ChildProcess event listener types require any[]\n on(event: \"exit\" | \"error\", listener: (...args: any[]) => void) {\n child.on(event, listener);\n },\n // biome-ignore lint/suspicious/noExplicitAny: ChildProcess event listener types require any[]\n once(event: \"exit\" | \"error\", listener: (...args: any[]) => void) {\n child.once(event, listener);\n },\n // biome-ignore lint/suspicious/noExplicitAny: ChildProcess event listener types require any[]\n off(event: \"exit\" | \"error\", listener: (...args: any[]) => void) {\n child.off(event, listener);\n },\n };\n };\n}\n\nfunction ensureLocalSettings(cwd: string): void {\n const claudeDir = path.join(cwd, \".claude\");\n const localSettingsPath = path.join(claudeDir, \"settings.local.json\");\n try {\n if (!fs.existsSync(localSettingsPath)) {\n fs.mkdirSync(claudeDir, { recursive: true });\n fs.writeFileSync(localSettingsPath, \"{}\\n\", { flag: \"wx\" });\n }\n } catch {\n // Best-effort — don't fail session creation if we can't write\n }\n}\n\nexport function buildSessionOptions(params: BuildOptionsParams): Options {\n ensureLocalSettings(params.cwd);\n\n // Resolve which built-in tools to expose.\n // Explicit tools array from userProvidedOptions takes precedence.\n // disableBuiltInTools is a legacy shorthand for tools: [] — kept for\n // backward compatibility but callers should prefer the tools array.\n const tools: Options[\"tools\"] =\n params.userProvidedOptions?.tools ??\n (params.disableBuiltInTools\n ? []\n : { type: \"preset\", preset: \"claude_code\" });\n\n const options: Options = {\n ...params.userProvidedOptions,\n betas: [\"context-1m-2025-08-07\"],\n systemPrompt: params.systemPrompt ?? buildSystemPrompt(),\n settingSources: [\"user\", \"project\", \"local\"],\n stderr: (err) => params.logger.error(err),\n cwd: params.cwd,\n includePartialMessages: true,\n allowDangerouslySkipPermissions: !IS_ROOT,\n permissionMode: params.permissionMode,\n canUseTool: params.canUseTool,\n executable: \"node\",\n tools,\n extraArgs: {\n ...params.userProvidedOptions?.extraArgs,\n \"replay-user-messages\": \"\",\n },\n mcpServers: buildMcpServers(\n params.userProvidedOptions?.mcpServers,\n params.mcpServers,\n ),\n env: buildEnvironment(),\n hooks: buildHooks(\n params.userProvidedOptions?.hooks,\n params.onModeChange,\n params.settingsManager,\n params.logger,\n ),\n abortController: getAbortController(\n params.userProvidedOptions?.abortController,\n ),\n ...(params.onProcessSpawned && {\n spawnClaudeCodeProcess: buildSpawnWrapper(\n params.sessionId,\n params.onProcessSpawned,\n params.onProcessExited,\n params.logger,\n ),\n }),\n };\n\n if (process.env.CLAUDE_CODE_EXECUTABLE) {\n options.pathToClaudeCodeExecutable = process.env.CLAUDE_CODE_EXECUTABLE;\n }\n\n if (params.isResume) {\n options.resume = params.sessionId;\n options.forkSession = params.forkSession ?? false;\n } else {\n options.sessionId = params.sessionId;\n options.model = DEFAULT_MODEL;\n }\n\n if (params.additionalDirectories) {\n options.additionalDirectories = params.additionalDirectories;\n }\n\n if (params.effort) {\n options.effort = params.effort;\n }\n\n clearStatsigCache();\n return options;\n}\n\nfunction clearStatsigCache(): void {\n const statsigPath = path.join(\n process.env.CLAUDE_CONFIG_DIR || path.join(os.homedir(), \".claude\"),\n \"statsig\",\n );\n fs.rm(statsigPath, { recursive: true, force: true }, () => {\n // Best-effort, ignore errors\n });\n}\n","const BRANCH_NAMING = `\n# Branch Naming\n\nWhen working in a detached HEAD state, create a descriptive branch name based on the work being done before committing. Do this automatically without asking the user.\n`;\n\nconst PLAN_MODE = `\n# Plan Mode\n\nOnly enter plan mode (EnterPlanMode) when the user is requesting a significant change in approach or direction mid-task. Do NOT enter plan mode for:\n- Confirmations or approvals (\"yes\", \"looks good\", \"continue\", \"go ahead\")\n- Minor clarifications or small adjustments\n- Answers to questions you asked (unless you are still in the initial planning phase and have not yet started executing)\n- Feedback that does not require replanning\n\nWhen in doubt, continue executing and incorporate the feedback inline.\n`;\n\nexport const APPENDED_INSTRUCTIONS = BRANCH_NAMING + PLAN_MODE;\n","import * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { minimatch } from \"minimatch\";\n\nconst ACP_TOOL_NAME_PREFIX = \"mcp__acp__\";\n\nconst acpToolNames = {\n read: `${ACP_TOOL_NAME_PREFIX}Read`,\n edit: `${ACP_TOOL_NAME_PREFIX}Edit`,\n write: `${ACP_TOOL_NAME_PREFIX}Write`,\n bash: `${ACP_TOOL_NAME_PREFIX}Bash`,\n};\n\nconst SHELL_OPERATORS = [\"&&\", \"||\", \";\", \"|\", \"$(\", \"`\", \"\\n\"];\n\nfunction containsShellOperator(str: string): boolean {\n return SHELL_OPERATORS.some((op) => str.includes(op));\n}\n\nconst FILE_EDITING_TOOLS = [acpToolNames.edit, acpToolNames.write];\n\nconst FILE_READING_TOOLS = [acpToolNames.read];\n\nconst TOOL_ARG_ACCESSORS: Record<\n string,\n (input: Record<string, unknown>) => string | undefined\n> = {\n [acpToolNames.read]: (input) => input?.file_path as string | undefined,\n [acpToolNames.edit]: (input) => input?.file_path as string | undefined,\n [acpToolNames.write]: (input) => input?.file_path as string | undefined,\n [acpToolNames.bash]: (input) => input?.command as string | undefined,\n};\n\ninterface ParsedRule {\n toolName: string;\n argument?: string;\n isWildcard?: boolean;\n}\n\nfunction parseRule(rule: string): ParsedRule {\n const match = rule.match(/^(\\w+)(?:\\((.+)\\))?$/);\n if (!match) {\n return { toolName: rule };\n }\n const toolName = match[1] ?? rule;\n const argument = match[2];\n if (argument?.endsWith(\":*\")) {\n return {\n toolName,\n argument: argument.slice(0, -2),\n isWildcard: true,\n };\n }\n return { toolName, argument };\n}\n\nfunction normalizePath(filePath: string, cwd: string): string {\n let resolved = filePath;\n if (resolved.startsWith(\"~/\")) {\n resolved = path.join(os.homedir(), resolved.slice(2));\n } else if (resolved.startsWith(\"./\")) {\n resolved = path.join(cwd, resolved.slice(2));\n } else if (!path.isAbsolute(resolved)) {\n resolved = path.join(cwd, resolved);\n }\n return path.normalize(resolved).replace(/\\\\/g, \"/\");\n}\n\nfunction matchesGlob(pattern: string, filePath: string, cwd: string): boolean {\n const normalizedPattern = normalizePath(pattern, cwd);\n const normalizedPath = normalizePath(filePath, cwd);\n return minimatch(normalizedPath, normalizedPattern, {\n dot: true,\n matchBase: false,\n nocase: process.platform === \"win32\",\n });\n}\n\nfunction matchesRule(\n rule: ParsedRule,\n toolName: string,\n toolInput: unknown,\n cwd: string,\n): boolean {\n const ruleAppliesToTool =\n (rule.toolName === \"Bash\" && toolName === acpToolNames.bash) ||\n (rule.toolName === \"Edit\" && FILE_EDITING_TOOLS.includes(toolName)) ||\n (rule.toolName === \"Read\" && FILE_READING_TOOLS.includes(toolName));\n\n if (!ruleAppliesToTool) {\n return false;\n }\n\n if (!rule.argument) {\n return true;\n }\n\n const argAccessor = TOOL_ARG_ACCESSORS[toolName];\n if (!argAccessor) {\n return true;\n }\n\n const actualArg = argAccessor(toolInput as Record<string, unknown>);\n if (!actualArg) {\n return false;\n }\n\n if (toolName === acpToolNames.bash) {\n if (rule.isWildcard) {\n if (!actualArg.startsWith(rule.argument)) {\n return false;\n }\n const remainder = actualArg.slice(rule.argument.length);\n if (containsShellOperator(remainder)) {\n return false;\n }\n return true;\n }\n return actualArg === rule.argument;\n }\n\n return matchesGlob(rule.argument, actualArg, cwd);\n}\n\nasync function loadSettingsFile(\n filePath: string | undefined,\n): Promise<ClaudeCodeSettings> {\n if (!filePath) {\n return {};\n }\n try {\n const content = await fs.promises.readFile(filePath, \"utf-8\");\n return JSON.parse(content) as ClaudeCodeSettings;\n } catch {\n return {};\n }\n}\n\nexport interface PermissionSettings {\n allow?: string[];\n deny?: string[];\n ask?: string[];\n additionalDirectories?: string[];\n defaultMode?: string;\n}\n\nexport interface ClaudeCodeSettings {\n permissions?: PermissionSettings;\n env?: Record<string, string>;\n model?: string;\n}\n\nexport type PermissionDecision = \"allow\" | \"deny\" | \"ask\";\n\nexport interface PermissionCheckResult {\n decision: PermissionDecision;\n rule?: string;\n source?: \"allow\" | \"deny\" | \"ask\";\n}\n\nexport function getManagedSettingsPath(): string {\n switch (process.platform) {\n case \"darwin\":\n return \"/Library/Application Support/ClaudeCode/managed-settings.json\";\n case \"linux\":\n return \"/etc/claude-code/managed-settings.json\";\n case \"win32\":\n return \"C:\\\\Program Files\\\\ClaudeCode\\\\managed-settings.json\";\n default:\n return \"/etc/claude-code/managed-settings.json\";\n }\n}\nexport class SettingsManager {\n private cwd: string;\n private userSettings: ClaudeCodeSettings = {};\n private projectSettings: ClaudeCodeSettings = {};\n private localSettings: ClaudeCodeSettings = {};\n private enterpriseSettings: ClaudeCodeSettings = {};\n private mergedSettings: ClaudeCodeSettings = {};\n private initialized = false;\n\n constructor(cwd: string) {\n this.cwd = cwd;\n }\n\n async initialize(): Promise<void> {\n if (this.initialized) {\n return;\n }\n await this.loadAllSettings();\n this.initialized = true;\n }\n\n private getUserSettingsPath(): string {\n const configDir =\n process.env.CLAUDE_CONFIG_DIR || path.join(os.homedir(), \".claude\");\n return path.join(configDir, \"settings.json\");\n }\n\n private getProjectSettingsPath(): string {\n return path.join(this.cwd, \".claude\", \"settings.json\");\n }\n\n private getLocalSettingsPath(): string {\n return path.join(this.cwd, \".claude\", \"settings.local.json\");\n }\n\n private async loadAllSettings(): Promise<void> {\n const [userSettings, projectSettings, localSettings, enterpriseSettings] =\n await Promise.all([\n loadSettingsFile(this.getUserSettingsPath()),\n loadSettingsFile(this.getProjectSettingsPath()),\n loadSettingsFile(this.getLocalSettingsPath()),\n loadSettingsFile(getManagedSettingsPath()),\n ]);\n this.userSettings = userSettings;\n this.projectSettings = projectSettings;\n this.localSettings = localSettings;\n this.enterpriseSettings = enterpriseSettings;\n this.mergeAllSettings();\n }\n\n private mergeAllSettings(): void {\n const allSettings = [\n this.userSettings,\n this.projectSettings,\n this.localSettings,\n this.enterpriseSettings,\n ];\n\n const permissions: PermissionSettings = {\n allow: [],\n deny: [],\n ask: [],\n };\n const merged: ClaudeCodeSettings = { permissions };\n\n for (const settings of allSettings) {\n if (settings.permissions) {\n if (settings.permissions.allow) {\n permissions.allow?.push(...settings.permissions.allow);\n }\n if (settings.permissions.deny) {\n permissions.deny?.push(...settings.permissions.deny);\n }\n if (settings.permissions.ask) {\n permissions.ask?.push(...settings.permissions.ask);\n }\n if (settings.permissions.additionalDirectories) {\n permissions.additionalDirectories = [\n ...(permissions.additionalDirectories || []),\n ...settings.permissions.additionalDirectories,\n ];\n }\n if (settings.permissions.defaultMode) {\n permissions.defaultMode = settings.permissions.defaultMode;\n }\n }\n if (settings.env) {\n merged.env = { ...merged.env, ...settings.env };\n }\n if (settings.model) {\n merged.model = settings.model;\n }\n }\n\n this.mergedSettings = merged;\n }\n\n checkPermission(toolName: string, toolInput: unknown): PermissionCheckResult {\n if (!toolName.startsWith(ACP_TOOL_NAME_PREFIX)) {\n return { decision: \"ask\" };\n }\n\n const permissions = this.mergedSettings.permissions;\n if (!permissions) {\n return { decision: \"ask\" };\n }\n\n for (const rule of permissions.deny || []) {\n const parsed = parseRule(rule);\n if (matchesRule(parsed, toolName, toolInput, this.cwd)) {\n return { decision: \"deny\", rule, source: \"deny\" };\n }\n }\n\n for (const rule of permissions.allow || []) {\n const parsed = parseRule(rule);\n if (matchesRule(parsed, toolName, toolInput, this.cwd)) {\n return { decision: \"allow\", rule, source: \"allow\" };\n }\n }\n\n for (const rule of permissions.ask || []) {\n const parsed = parseRule(rule);\n if (matchesRule(parsed, toolName, toolInput, this.cwd)) {\n return { decision: \"ask\", rule, source: \"ask\" };\n }\n }\n\n return { decision: \"ask\" };\n }\n\n getSettings(): ClaudeCodeSettings {\n return this.mergedSettings;\n }\n\n getCwd(): string {\n return this.cwd;\n }\n\n async setCwd(cwd: string): Promise<void> {\n if (this.cwd === cwd) {\n return;\n }\n this.dispose();\n this.cwd = cwd;\n this.initialized = false;\n await this.initialize();\n }\n\n dispose(): void {\n this.initialized = false;\n }\n}\n","import { type ChildProcess, spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { delimiter, dirname } from \"node:path\";\nimport type { Readable, Writable } from \"node:stream\";\nimport type { ProcessSpawnedCallback } from \"../../types\";\nimport { Logger } from \"../../utils/logger\";\n\nexport interface CodexProcessOptions {\n cwd?: string;\n apiBaseUrl?: string;\n apiKey?: string;\n model?: string;\n binaryPath?: string;\n logger?: Logger;\n processCallbacks?: ProcessSpawnedCallback;\n}\n\nexport interface CodexProcess {\n process: ChildProcess;\n stdin: Writable;\n stdout: Readable;\n kill: () => void;\n}\n\nfunction buildConfigArgs(options: CodexProcessOptions): string[] {\n const args: string[] = [];\n\n args.push(\"-c\", `features.remote_models=false`);\n\n if (options.apiBaseUrl) {\n args.push(\"-c\", `model_provider=\"posthog\"`);\n args.push(\"-c\", `model_providers.posthog.name=\"PostHog Gateway\"`);\n args.push(\"-c\", `model_providers.posthog.base_url=\"${options.apiBaseUrl}\"`);\n args.push(\"-c\", `model_providers.posthog.wire_api=\"responses\"`);\n args.push(\n \"-c\",\n `model_providers.posthog.env_key=\"POSTHOG_GATEWAY_API_KEY\"`,\n );\n }\n\n if (options.model) {\n args.push(\"-c\", `model=\"${options.model}\"`);\n }\n\n return args;\n}\n\nfunction findCodexBinary(options: CodexProcessOptions): {\n command: string;\n args: string[];\n} {\n const configArgs = buildConfigArgs(options);\n\n if (options.binaryPath && existsSync(options.binaryPath)) {\n return { command: options.binaryPath, args: configArgs };\n }\n\n if (options.binaryPath) {\n throw new Error(\n `codex-acp binary not found at ${options.binaryPath}. Run \"node apps/code/scripts/download-binaries.mjs\" to download it.`,\n );\n }\n\n return { command: \"npx\", args: [\"@zed-industries/codex-acp\", ...configArgs] };\n}\n\nexport function spawnCodexProcess(options: CodexProcessOptions): CodexProcess {\n const logger =\n options.logger ?? new Logger({ debug: true, prefix: \"[CodexSpawn]\" });\n\n const env: NodeJS.ProcessEnv = { ...process.env };\n\n delete env.ELECTRON_RUN_AS_NODE;\n delete env.ELECTRON_NO_ASAR;\n\n if (options.apiKey) {\n env.POSTHOG_GATEWAY_API_KEY = options.apiKey;\n }\n\n const { command, args } = findCodexBinary(options);\n\n if (options.binaryPath && existsSync(options.binaryPath)) {\n const binDir = dirname(options.binaryPath);\n env.PATH = `${binDir}${delimiter}${env.PATH ?? \"\"}`;\n }\n\n logger.info(\"Spawning codex-acp process\", {\n command,\n args,\n cwd: options.cwd,\n hasApiBaseUrl: !!options.apiBaseUrl,\n hasApiKey: !!options.apiKey,\n binaryPath: options.binaryPath,\n });\n\n const child = spawn(command, args, {\n cwd: options.cwd,\n env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n detached: process.platform !== \"win32\",\n });\n\n child.stderr?.on(\"data\", (data: Buffer) => {\n logger.warn(\"codex-acp stderr:\", data.toString());\n });\n\n child.on(\"error\", (err) => {\n logger.error(\"codex-acp process error:\", err);\n });\n\n child.on(\"exit\", (code, signal) => {\n logger.info(\"codex-acp process exited\", { code, signal });\n if (child.pid && options.processCallbacks?.onProcessExited) {\n options.processCallbacks.onProcessExited(child.pid);\n }\n });\n\n if (!child.stdin || !child.stdout) {\n throw new Error(\"Failed to get stdio streams from codex-acp process\");\n }\n\n if (child.pid && options.processCallbacks?.onProcessSpawned) {\n options.processCallbacks.onProcessSpawned({\n pid: child.pid,\n command,\n });\n }\n\n return {\n process: child,\n stdin: child.stdin,\n stdout: child.stdout,\n kill: () => {\n logger.info(\"Killing codex-acp process\", { pid: child.pid });\n child.stdin?.destroy();\n child.stdout?.destroy();\n child.stderr?.destroy();\n child.kill(\"SIGTERM\");\n },\n };\n}\n","export type GatewayProduct = \"posthog_code\" | \"background_agents\";\n\nexport function getLlmGatewayUrl(\n posthogHost: string,\n product: GatewayProduct = \"posthog_code\",\n): string {\n const url = new URL(posthogHost);\n const hostname = url.hostname;\n\n // Local development (normalize 127.0.0.1 to localhost)\n if (hostname === \"localhost\" || hostname === \"127.0.0.1\") {\n return `${url.protocol}//localhost:3308/${product}`;\n }\n\n // Docker containers accessing host\n if (hostname === \"host.docker.internal\") {\n return `${url.protocol}//host.docker.internal:3308/${product}`;\n }\n\n // Production - extract region from hostname, default to US\n const region = hostname.match(/^(us|eu)\\.posthog\\.com$/)?.[1] ?? \"us\";\n return `https://gateway.${region}.posthog.com/${product}`;\n}\n","import packageJson from \"../package.json\" with { type: \"json\" };\nimport type {\n ArtifactType,\n PostHogAPIConfig,\n StoredEntry,\n Task,\n TaskRun,\n TaskRunArtifact,\n} from \"./types\";\nimport { getLlmGatewayUrl } from \"./utils/gateway\";\n\nexport { getLlmGatewayUrl };\n\nconst DEFAULT_USER_AGENT = `posthog/agent.hog.dev; version: ${packageJson.version}`;\n\nexport interface TaskArtifactUploadPayload {\n name: string;\n type: ArtifactType;\n content: string;\n content_type?: string;\n}\n\nexport type TaskRunUpdate = Partial<\n Pick<\n TaskRun,\n | \"status\"\n | \"branch\"\n | \"stage\"\n | \"error_message\"\n | \"output\"\n | \"state\"\n | \"environment\"\n >\n>;\n\nexport class PostHogAPIClient {\n private config: PostHogAPIConfig;\n\n constructor(config: PostHogAPIConfig) {\n this.config = config;\n }\n\n private get baseUrl(): string {\n const host = this.config.apiUrl.endsWith(\"/\")\n ? this.config.apiUrl.slice(0, -1)\n : this.config.apiUrl;\n return host;\n }\n\n private get headers(): Record<string, string> {\n return {\n Authorization: `Bearer ${this.config.getApiKey()}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": this.config.userAgent ?? DEFAULT_USER_AGENT,\n };\n }\n\n private async apiRequest<T>(\n endpoint: string,\n options: RequestInit = {},\n ): Promise<T> {\n const url = `${this.baseUrl}${endpoint}`;\n\n const response = await fetch(url, {\n ...options,\n headers: {\n ...this.headers,\n ...options.headers,\n },\n });\n\n if (!response.ok) {\n let errorMessage: string;\n try {\n const errorResponse = await response.json();\n errorMessage = `Failed request: [${response.status}] ${JSON.stringify(errorResponse)}`;\n } catch {\n errorMessage = `Failed request: [${response.status}] ${response.statusText}`;\n }\n throw new Error(errorMessage);\n }\n\n return response.json();\n }\n\n private getTeamId(): number {\n return this.config.projectId;\n }\n\n getApiKey(): string {\n return this.config.getApiKey();\n }\n\n getLlmGatewayUrl(): string {\n return getLlmGatewayUrl(this.baseUrl);\n }\n\n async getTask(taskId: string): Promise<Task> {\n const teamId = this.getTeamId();\n return this.apiRequest<Task>(`/api/projects/${teamId}/tasks/${taskId}/`);\n }\n\n async getTaskRun(taskId: string, runId: string): Promise<TaskRun> {\n const teamId = this.getTeamId();\n return this.apiRequest<TaskRun>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/`,\n );\n }\n\n async updateTaskRun(\n taskId: string,\n runId: string,\n payload: TaskRunUpdate,\n ): Promise<TaskRun> {\n const teamId = this.getTeamId();\n return this.apiRequest<TaskRun>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/`,\n {\n method: \"PATCH\",\n body: JSON.stringify(payload),\n },\n );\n }\n\n async appendTaskRunLog(\n taskId: string,\n runId: string,\n entries: StoredEntry[],\n ): Promise<TaskRun> {\n const teamId = this.getTeamId();\n return this.apiRequest<TaskRun>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/append_log/`,\n {\n method: \"POST\",\n body: JSON.stringify({ entries }),\n },\n );\n }\n\n async relayMessage(\n taskId: string,\n runId: string,\n text: string,\n ): Promise<void> {\n const teamId = this.getTeamId();\n await this.apiRequest<{ status: string }>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/relay_message/`,\n {\n method: \"POST\",\n body: JSON.stringify({ text }),\n },\n );\n }\n\n async uploadTaskArtifacts(\n taskId: string,\n runId: string,\n artifacts: TaskArtifactUploadPayload[],\n ): Promise<TaskRunArtifact[]> {\n if (!artifacts.length) {\n return [];\n }\n\n const teamId = this.getTeamId();\n const response = await this.apiRequest<{ artifacts: TaskRunArtifact[] }>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/artifacts/`,\n {\n method: \"POST\",\n body: JSON.stringify({ artifacts }),\n },\n );\n\n return response.artifacts ?? [];\n }\n\n async getArtifactPresignedUrl(\n taskId: string,\n runId: string,\n storagePath: string,\n ): Promise<string | null> {\n const teamId = this.getTeamId();\n try {\n const response = await this.apiRequest<{\n url: string;\n expires_in: number;\n }>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/artifacts/presign/`,\n {\n method: \"POST\",\n body: JSON.stringify({ storage_path: storagePath }),\n },\n );\n return response.url;\n } catch {\n return null;\n }\n }\n\n /**\n * Download artifact content by storage path\n * Gets a presigned URL and fetches the content\n */\n async downloadArtifact(\n taskId: string,\n runId: string,\n storagePath: string,\n ): Promise<ArrayBuffer | null> {\n const url = await this.getArtifactPresignedUrl(taskId, runId, storagePath);\n if (!url) {\n return null;\n }\n\n try {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to download artifact: ${response.status}`);\n }\n return response.arrayBuffer();\n } catch {\n return null;\n }\n }\n\n /**\n * Fetch logs for a task run via the logs API endpoint\n * @param taskRun - The task run to fetch logs for\n * @returns Array of stored entries, or empty array if no logs available\n */\n async fetchTaskRunLogs(taskRun: TaskRun): Promise<StoredEntry[]> {\n const teamId = this.getTeamId();\n\n try {\n const response = await fetch(\n `${this.baseUrl}/api/projects/${teamId}/tasks/${taskRun.task}/runs/${taskRun.id}/logs`,\n { headers: this.headers },\n );\n\n if (!response.ok) {\n if (response.status === 404) {\n return [];\n }\n throw new Error(\n `Failed to fetch logs: ${response.status} ${response.statusText}`,\n );\n }\n\n const content = await response.text();\n\n if (!content.trim()) {\n return [];\n }\n\n // Parse newline-delimited JSON\n return content\n .trim()\n .split(\"\\n\")\n .map((line) => JSON.parse(line) as StoredEntry);\n } catch (error) {\n throw new Error(\n `Failed to fetch task run logs: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n}\n","import fs from \"node:fs\";\nimport fsp from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { SessionContext } from \"./otel-log-writer\";\nimport type { PostHogAPIClient } from \"./posthog-api\";\nimport type { StoredNotification } from \"./types\";\nimport { Logger } from \"./utils/logger\";\n\nexport interface SessionLogWriterOptions {\n /** PostHog API client for log persistence */\n posthogAPI?: PostHogAPIClient;\n /** Logger instance */\n logger?: Logger;\n /** Local cache path for instant log loading (e.g., ~/.posthog-code) */\n localCachePath?: string;\n}\n\ninterface ChunkBuffer {\n text: string;\n firstTimestamp: string;\n}\n\ninterface SessionState {\n context: SessionContext;\n chunkBuffer?: ChunkBuffer;\n lastAgentMessage?: string;\n currentTurnMessages: string[];\n}\n\nexport class SessionLogWriter {\n private static readonly FLUSH_DEBOUNCE_MS = 500;\n private static readonly FLUSH_MAX_INTERVAL_MS = 5000;\n private static readonly MAX_FLUSH_RETRIES = 10;\n private static readonly MAX_RETRY_DELAY_MS = 30_000;\n private static readonly SESSIONS_MAX_AGE_MS = 30 * 24 * 60 * 60 * 1000;\n\n private posthogAPI?: PostHogAPIClient;\n private pendingEntries: Map<string, StoredNotification[]> = new Map();\n private flushTimeouts: Map<string, NodeJS.Timeout> = new Map();\n private lastFlushAttemptTime: Map<string, number> = new Map();\n private retryCounts: Map<string, number> = new Map();\n private sessions: Map<string, SessionState> = new Map();\n\n private logger: Logger;\n private localCachePath?: string;\n\n constructor(options: SessionLogWriterOptions = {}) {\n this.posthogAPI = options.posthogAPI;\n this.localCachePath = options.localCachePath;\n this.logger =\n options.logger ??\n new Logger({ debug: false, prefix: \"[SessionLogWriter]\" });\n }\n\n async flushAll(): Promise<void> {\n const sessionIds = [...this.sessions.keys()];\n const flushPromises: Promise<void>[] = [];\n for (const sessionId of sessionIds) {\n flushPromises.push(this.flush(sessionId));\n }\n await Promise.all(flushPromises);\n }\n\n register(sessionId: string, context: SessionContext): void {\n if (this.sessions.has(sessionId)) {\n return;\n }\n\n this.logger.info(\"Session registered\", {\n taskId: context.taskId,\n runId: context.runId,\n });\n this.sessions.set(sessionId, { context, currentTurnMessages: [] });\n\n this.lastFlushAttemptTime.set(sessionId, Date.now());\n\n if (this.localCachePath) {\n const sessionDir = path.join(\n this.localCachePath,\n \"sessions\",\n context.runId,\n );\n try {\n fs.mkdirSync(sessionDir, { recursive: true });\n } catch (error) {\n this.logger.warn(\"Failed to create local cache directory\", {\n sessionDir,\n error,\n });\n }\n }\n }\n\n isRegistered(sessionId: string): boolean {\n return this.sessions.has(sessionId);\n }\n\n appendRawLine(sessionId: string, line: string): void {\n const session = this.sessions.get(sessionId);\n if (!session) {\n this.logger.warn(\"appendRawLine called for unregistered session\", {\n sessionId,\n });\n return;\n }\n\n try {\n const message = JSON.parse(line);\n const timestamp = new Date().toISOString();\n\n // Check if this is an agent_message_chunk event\n if (this.isAgentMessageChunk(message)) {\n const text = this.extractChunkText(message);\n if (text) {\n if (!session.chunkBuffer) {\n session.chunkBuffer = { text, firstTimestamp: timestamp };\n } else {\n session.chunkBuffer.text += text;\n }\n }\n // Don't emit chunk events\n return;\n }\n\n // Non-chunk event: flush any buffered chunks first\n this.emitCoalescedMessage(sessionId, session);\n\n const nonChunkAgentText = this.extractAgentMessageText(message);\n if (nonChunkAgentText) {\n session.lastAgentMessage = nonChunkAgentText;\n session.currentTurnMessages.push(nonChunkAgentText);\n }\n\n const entry: StoredNotification = {\n type: \"notification\",\n timestamp,\n notification: message,\n };\n\n this.writeToLocalCache(sessionId, entry);\n\n if (this.posthogAPI) {\n const pending = this.pendingEntries.get(sessionId) ?? [];\n pending.push(entry);\n this.pendingEntries.set(sessionId, pending);\n this.scheduleFlush(sessionId);\n }\n } catch {\n this.logger.warn(\"Failed to parse raw line for persistence\", {\n taskId: session.context.taskId,\n runId: session.context.runId,\n lineLength: line.length,\n });\n }\n }\n\n async flush(sessionId: string): Promise<void> {\n const session = this.sessions.get(sessionId);\n if (!session) {\n this.logger.warn(\"flush: no session found\", { sessionId });\n return;\n }\n\n // Emit any buffered chunks before flushing\n this.emitCoalescedMessage(sessionId, session);\n\n const pending = this.pendingEntries.get(sessionId);\n if (!this.posthogAPI || !pending?.length) {\n return;\n }\n\n this.pendingEntries.delete(sessionId);\n const timeout = this.flushTimeouts.get(sessionId);\n if (timeout) {\n clearTimeout(timeout);\n this.flushTimeouts.delete(sessionId);\n }\n\n this.lastFlushAttemptTime.set(sessionId, Date.now());\n\n try {\n await this.posthogAPI.appendTaskRunLog(\n session.context.taskId,\n session.context.runId,\n pending,\n );\n this.retryCounts.set(sessionId, 0);\n } catch (error) {\n const retryCount = (this.retryCounts.get(sessionId) ?? 0) + 1;\n this.retryCounts.set(sessionId, retryCount);\n\n if (retryCount >= SessionLogWriter.MAX_FLUSH_RETRIES) {\n this.logger.error(\n `Dropping ${pending.length} session log entries after ${retryCount} failed flush attempts`,\n {\n taskId: session.context.taskId,\n runId: session.context.runId,\n error,\n },\n );\n this.retryCounts.set(sessionId, 0);\n } else {\n if (retryCount === 1) {\n this.logger.warn(\n `Failed to persist session logs, will retry (up to ${SessionLogWriter.MAX_FLUSH_RETRIES} attempts)`,\n {\n taskId: session.context.taskId,\n runId: session.context.runId,\n error: error instanceof Error ? error.message : String(error),\n },\n );\n }\n const currentPending = this.pendingEntries.get(sessionId) ?? [];\n this.pendingEntries.set(sessionId, [...pending, ...currentPending]);\n this.scheduleFlush(sessionId);\n }\n }\n }\n\n private isAgentMessageChunk(message: Record<string, unknown>): boolean {\n if (message.method !== \"session/update\") return false;\n const params = message.params as Record<string, unknown> | undefined;\n const update = params?.update as Record<string, unknown> | undefined;\n return update?.sessionUpdate === \"agent_message_chunk\";\n }\n\n private extractChunkText(message: Record<string, unknown>): string {\n const params = message.params as Record<string, unknown> | undefined;\n const update = params?.update as Record<string, unknown> | undefined;\n const content = update?.content as\n | { type: string; text?: string }\n | undefined;\n if (content?.type === \"text\" && content.text) {\n return content.text;\n }\n return \"\";\n }\n\n private emitCoalescedMessage(sessionId: string, session: SessionState): void {\n if (!session.chunkBuffer) return;\n\n const { text, firstTimestamp } = session.chunkBuffer;\n session.chunkBuffer = undefined;\n session.lastAgentMessage = text;\n session.currentTurnMessages.push(text);\n\n const entry: StoredNotification = {\n type: \"notification\",\n timestamp: firstTimestamp,\n notification: {\n jsonrpc: \"2.0\",\n method: \"session/update\",\n params: {\n update: {\n sessionUpdate: \"agent_message\",\n content: { type: \"text\", text },\n },\n },\n },\n };\n\n this.writeToLocalCache(sessionId, entry);\n\n if (this.posthogAPI) {\n const pending = this.pendingEntries.get(sessionId) ?? [];\n pending.push(entry);\n this.pendingEntries.set(sessionId, pending);\n this.scheduleFlush(sessionId);\n }\n }\n\n getLastAgentMessage(sessionId: string): string | undefined {\n return this.sessions.get(sessionId)?.lastAgentMessage;\n }\n\n getFullAgentResponse(sessionId: string): string | undefined {\n const session = this.sessions.get(sessionId);\n if (!session || session.currentTurnMessages.length === 0) return undefined;\n return session.currentTurnMessages.join(\"\\n\\n\");\n }\n\n resetTurnMessages(sessionId: string): void {\n const session = this.sessions.get(sessionId);\n if (session) {\n session.currentTurnMessages = [];\n }\n }\n\n private extractAgentMessageText(\n message: Record<string, unknown>,\n ): string | null {\n if (message.method !== \"session/update\") {\n return null;\n }\n\n const params = message.params as Record<string, unknown> | undefined;\n const update = params?.update as Record<string, unknown> | undefined;\n if (update?.sessionUpdate !== \"agent_message\") {\n return null;\n }\n\n const content = update.content as\n | { type?: string; text?: string }\n | undefined;\n if (content?.type === \"text\" && typeof content.text === \"string\") {\n const trimmed = content.text.trim();\n return trimmed.length > 0 ? trimmed : null;\n }\n\n if (typeof update.message === \"string\") {\n const trimmed = update.message.trim();\n return trimmed.length > 0 ? trimmed : null;\n }\n\n return null;\n }\n\n private scheduleFlush(sessionId: string): void {\n const existing = this.flushTimeouts.get(sessionId);\n if (existing) clearTimeout(existing);\n\n const retryCount = this.retryCounts.get(sessionId) ?? 0;\n const lastAttempt = this.lastFlushAttemptTime.get(sessionId) ?? 0;\n const elapsed = Date.now() - lastAttempt;\n\n let delay: number;\n if (retryCount > 0) {\n // Exponential backoff on retries: FLUSH_DEBOUNCE_MS * 2^retryCount, capped\n delay = Math.min(\n SessionLogWriter.FLUSH_DEBOUNCE_MS * 2 ** retryCount,\n SessionLogWriter.MAX_RETRY_DELAY_MS,\n );\n } else if (elapsed >= SessionLogWriter.FLUSH_MAX_INTERVAL_MS) {\n // If we've been accumulating for longer than the max interval, flush immediately\n delay = 0;\n } else {\n delay = SessionLogWriter.FLUSH_DEBOUNCE_MS;\n }\n\n const timeout = setTimeout(() => this.flush(sessionId), delay);\n this.flushTimeouts.set(sessionId, timeout);\n }\n\n private writeToLocalCache(\n sessionId: string,\n entry: StoredNotification,\n ): void {\n if (!this.localCachePath) return;\n\n const session = this.sessions.get(sessionId);\n if (!session) return;\n\n const logPath = path.join(\n this.localCachePath,\n \"sessions\",\n session.context.runId,\n \"logs.ndjson\",\n );\n\n try {\n fs.appendFileSync(logPath, `${JSON.stringify(entry)}\\n`);\n } catch (error) {\n this.logger.warn(\"Failed to write to local cache\", {\n taskId: session.context.taskId,\n runId: session.context.runId,\n logPath,\n error,\n });\n }\n }\n\n static async cleanupOldSessions(localCachePath: string): Promise<number> {\n const sessionsDir = path.join(localCachePath, \"sessions\");\n let deleted = 0;\n try {\n const entries = await fsp.readdir(sessionsDir);\n const now = Date.now();\n for (const entry of entries) {\n const entryPath = path.join(sessionsDir, entry);\n try {\n const stats = await fsp.stat(entryPath);\n if (\n stats.isDirectory() &&\n now - stats.birthtimeMs > SessionLogWriter.SESSIONS_MAX_AGE_MS\n ) {\n await fsp.rm(entryPath, { recursive: true, force: true });\n deleted++;\n }\n } catch {\n // Skip entries we can't stat\n }\n }\n } catch {\n // Sessions dir may not exist yet\n }\n return deleted;\n }\n}\n","import {\n createAcpConnection,\n type InProcessAcpConnection,\n} from \"./adapters/acp-connection\";\nimport {\n BLOCKED_MODELS,\n DEFAULT_GATEWAY_MODEL,\n fetchModelsList,\n} from \"./gateway-models\";\nimport { PostHogAPIClient, type TaskRunUpdate } from \"./posthog-api\";\nimport { SessionLogWriter } from \"./session-log-writer\";\nimport type { AgentConfig, TaskExecutionOptions } from \"./types\";\nimport { Logger } from \"./utils/logger\";\n\nexport class Agent {\n private posthogAPI?: PostHogAPIClient;\n private logger: Logger;\n private acpConnection?: InProcessAcpConnection;\n private taskRunId?: string;\n private sessionLogWriter?: SessionLogWriter;\n\n constructor(config: AgentConfig) {\n this.logger = new Logger({\n debug: config.debug || false,\n prefix: \"[PostHog Agent]\",\n onLog: config.onLog,\n });\n\n if (config.posthog) {\n this.posthogAPI = new PostHogAPIClient(config.posthog);\n }\n\n if (config.posthog && !config.skipLogPersistence) {\n this.sessionLogWriter = new SessionLogWriter({\n posthogAPI: this.posthogAPI,\n logger: this.logger.child(\"SessionLogWriter\"),\n localCachePath: config.localCachePath,\n });\n\n if (config.localCachePath) {\n SessionLogWriter.cleanupOldSessions(config.localCachePath).catch(\n () => {},\n );\n }\n }\n }\n\n private _configureLlmGateway(overrideUrl?: string): {\n gatewayUrl: string;\n apiKey: string;\n } | null {\n if (!this.posthogAPI) {\n return null;\n }\n\n try {\n const gatewayUrl = overrideUrl ?? this.posthogAPI.getLlmGatewayUrl();\n const apiKey = this.posthogAPI.getApiKey();\n\n process.env.OPENAI_BASE_URL = `${gatewayUrl}/v1`;\n process.env.OPENAI_API_KEY = apiKey;\n process.env.ANTHROPIC_BASE_URL = gatewayUrl;\n process.env.ANTHROPIC_AUTH_TOKEN = apiKey;\n\n return { gatewayUrl, apiKey };\n } catch (error) {\n this.logger.error(\"Failed to configure LLM gateway\", error);\n throw error;\n }\n }\n\n async run(\n taskId: string,\n taskRunId: string,\n options: TaskExecutionOptions = {},\n ): Promise<InProcessAcpConnection> {\n const gatewayConfig = this._configureLlmGateway(options.gatewayUrl);\n this.logger.info(\"Configured LLM gateway\", {\n adapter: options.adapter,\n });\n this.taskRunId = taskRunId;\n\n let allowedModelIds: Set<string> | undefined;\n let sanitizedModel =\n options.model && !BLOCKED_MODELS.has(options.model)\n ? options.model\n : undefined;\n if (options.adapter === \"codex\" && gatewayConfig) {\n const models = await fetchModelsList({\n gatewayUrl: gatewayConfig.gatewayUrl,\n });\n const codexModelIds = models\n .filter((model) => {\n if (BLOCKED_MODELS.has(model.id)) return false;\n if (model.owned_by) {\n return model.owned_by === \"openai\";\n }\n return model.id.startsWith(\"gpt-\") || model.id.startsWith(\"openai/\");\n })\n .map((model) => model.id);\n\n if (codexModelIds.length > 0) {\n allowedModelIds = new Set(codexModelIds);\n }\n\n if (!sanitizedModel || !allowedModelIds?.has(sanitizedModel)) {\n sanitizedModel = codexModelIds[0];\n }\n }\n if (!sanitizedModel && options.adapter !== \"codex\") {\n sanitizedModel = DEFAULT_GATEWAY_MODEL;\n }\n\n this.acpConnection = createAcpConnection({\n adapter: options.adapter,\n logWriter: this.sessionLogWriter,\n taskRunId,\n taskId,\n deviceType: \"local\",\n logger: this.logger,\n processCallbacks: options.processCallbacks,\n allowedModelIds,\n codexOptions:\n options.adapter === \"codex\" && gatewayConfig\n ? {\n cwd: options.repositoryPath,\n apiBaseUrl: `${gatewayConfig.gatewayUrl}/v1`,\n apiKey: gatewayConfig.apiKey,\n binaryPath: options.codexBinaryPath,\n model: sanitizedModel,\n }\n : undefined,\n });\n\n return this.acpConnection;\n }\n\n async attachPullRequestToTask(\n taskId: string,\n prUrl: string,\n branchName?: string,\n ): Promise<void> {\n this.logger.info(\"Attaching PR to task run\", { taskId, prUrl, branchName });\n\n if (!this.posthogAPI || !this.taskRunId) {\n const error = new Error(\n \"PostHog API not configured or no active run. Cannot attach PR to task.\",\n );\n this.logger.error(\"PostHog API not configured\", error);\n throw error;\n }\n\n const updates: TaskRunUpdate = {\n output: { pr_url: prUrl },\n };\n if (branchName) {\n updates.branch = branchName;\n }\n\n await this.posthogAPI.updateTaskRun(taskId, this.taskRunId, updates);\n this.logger.debug(\"PR attached to task run\", {\n taskId,\n taskRunId: this.taskRunId,\n prUrl,\n });\n }\n\n getPosthogAPI(): PostHogAPIClient | undefined {\n return this.posthogAPI;\n }\n\n async flushAllLogs(): Promise<void> {\n await this.sessionLogWriter?.flushAll();\n }\n\n async cleanup(): Promise<void> {\n if (this.sessionLogWriter && this.taskRunId) {\n await this.sessionLogWriter.flush(this.taskRunId);\n }\n await this.acpConnection?.cleanup();\n }\n}\n"],"mappings":"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","names":["WritableStream","resolve","fs","os","path","RequestError","resolve","text","path","path","resolve","path","input","text","text","path","ALLOW_BYPASS","fs","os","path","fs","os","path","text","RequestError","resolve","availableModes","spawn","existsSync","existsSync","spawn","filteredOptions","currentAllowed","nextCurrent","sessionId","text","writer","taskRunId","text","fs","path","path","fs","text","delay"]}
|