@posthog/agent 2.1.152 → 2.1.157
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 -1
- 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.d.ts +36 -0
- package/dist/server/agent-server.js +14 -3
- package/dist/server/agent-server.js.map +1 -1
- package/dist/server/bin.cjs +41 -5
- package/dist/server/bin.cjs.map +1 -1
- package/package.json +1 -1
- package/src/server/agent-server.test.ts +28 -0
- package/src/server/agent-server.ts +2 -2
- package/src/server/bin.ts +31 -0
- package/src/server/schemas.test.ts +117 -0
- package/src/server/schemas.ts +16 -0
- package/src/server/types.ts +3 -0
package/dist/agent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/adapters/acp-connection.ts","../src/acp-extensions.ts","../src/utils/logger.ts","../src/utils/streams.ts","../src/adapters/claude/claude-agent.ts","../package.json","../src/utils/common.ts","../src/gateway-models.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/mcp/tool-metadata.ts","../src/adapters/claude/conversion/tool-use-to-acp.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/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.js\";\nimport type { SessionLogWriter } from \"../session-log-writer.js\";\nimport type { ProcessSpawnedCallback } from \"../types.js\";\nimport { Logger } from \"../utils/logger.js\";\nimport {\n createBidirectionalStreams,\n createTappedWritableStream,\n nodeReadableToWebReadable,\n nodeWritableToWebWritable,\n type StreamPair,\n} from \"../utils/streams.js\";\nimport { ClaudeAcpAgent } from \"./claude/claude-agent.js\";\nimport { type CodexProcessOptions, spawnCodexProcess } from \"./codex/spawn.js\";\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 ConfigOption = {\n id?: string;\n category?: string | null;\n currentValue?: string;\n options?: Array<\n { value?: string } | { group?: string; options?: Array<{ value?: string }> }\n >;\n};\n\nfunction isGroupedOptions(\n options: NonNullable<ConfigOption[\"options\"]>,\n): options is Array<{ group?: string; options?: Array<{ value?: string }> }> {\n return options.length > 0 && \"group\" in options[0];\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 ?? []).filter(\n (o) => o?.value && allowedModelIds.has(o.value),\n ),\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 Array<{ value?: string }>;\n const filteredOptions = valueOptions.filter(\n (o) => o?.value && allowedModelIds.has(o.value),\n );\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 /** 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","import type { LogLevel as LogLevelType, OnLogCallback } from \"../types.js\";\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.js\";\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.js\";\nimport { Logger } from \"../../utils/logger.js\";\nimport { Pushable } from \"../../utils/streams.js\";\nimport { BaseAcpAgent } from \"../base-acp-agent.js\";\nimport { promptToClaude } from \"./conversion/acp-to-sdk.js\";\nimport {\n handleResultMessage,\n handleStreamEvent,\n handleSystemMessage,\n handleUserAssistantMessage,\n} from \"./conversion/sdk-to-acp.js\";\nimport { fetchMcpToolMetadata } from \"./mcp/tool-metadata.js\";\nimport { canUseTool } from \"./permissions/permission-handlers.js\";\nimport { getAvailableSlashCommands } from \"./session/commands.js\";\nimport { parseMcpServers } from \"./session/mcp-config.js\";\nimport { DEFAULT_MODEL, toSdkModelId } from \"./session/models.js\";\nimport {\n buildSessionOptions,\n buildSystemPrompt,\n type ProcessSpawnedInfo,\n} from \"./session/options.js\";\nimport { SettingsManager } from \"./session/settings.js\";\nimport {\n getAvailableModes,\n TWIG_EXECUTION_MODES,\n type TwigExecutionMode,\n} from \"./tools.js\";\nimport type {\n BackgroundTerminal,\n NewSessionMeta,\n Session,\n ToolUseCache,\n} from \"./types.js\";\n\nconst SESSION_VALIDATION_TIMEOUT_MS = 10_000;\nconst MAX_TITLE_LENGTH = 256;\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}\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 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 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 unstable_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 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\n if (this.session.promptRunning) {\n const uuid = randomUUID();\n userMessage.uuid = uuid;\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(uuid, { resolve, order });\n });\n if (cancelled) {\n return { stopReason: \"cancelled\" };\n }\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\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 }\n await handleSystemMessage(message, context);\n break;\n\n case \"result\": {\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 // Calculate context window size from modelUsage (minimum across all models used)\n const contextWindows = Object.values(message.modelUsage).map(\n (m) => m.contextWindow,\n );\n const contextWindowSize =\n contextWindows.length > 0 ? Math.min(...contextWindows) : 200000;\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 as unknown as bigint,\n size: contextWindowSize as unknown as bigint,\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 // Build usage for PromptResponse\n // ACP SDK types declare these as bigint but JSON.stringify can't\n // serialize BigInt. Token counts never exceed MAX_SAFE_INTEGER so\n // we pass plain numbers and cast to satisfy the type system.\n const 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 } as unknown as Usage;\n\n const result = handleResultMessage(message);\n if (result.error) throw result.error;\n\n switch (message.subtype) {\n case \"error_max_budget_usd\":\n case \"error_max_turns\":\n case \"error_max_structured_output_retries\":\n return { stopReason: \"max_turn_requests\", usage };\n default:\n return { stopReason: \"end_turn\", usage };\n }\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 queued prompt replay\n if (message.type === \"user\" && \"uuid\" in message && message.uuid) {\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 // 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.output_tokens +\n usage.cache_read_input_tokens +\n usage.cache_creation_input_tokens;\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 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 } 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 const sdkModelId = toSdkModelId(params.modelId);\n await this.session.query.setModel(sdkModelId);\n this.session.modelId = 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 const allValues: { value: 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 { value: string }[])\n : [o as { value: string }],\n )\n : [];\n const validValue = allValues.find((o) => o.value === params.value);\n if (!validValue) {\n throw new Error(\n `Invalid value for config option ${params.configId}: ${params.value}`,\n );\n }\n\n if (params.configId === \"mode\") {\n await this.applySessionMode(params.value);\n await this.client.sessionUpdate({\n sessionId: this.sessionId,\n update: {\n sessionUpdate: \"current_mode_update\",\n currentModeId: params.value,\n },\n });\n } else if (params.configId === \"model\") {\n const sdkModelId = toSdkModelId(params.value);\n await this.session.query.setModel(sdkModelId);\n this.session.modelId = params.value;\n }\n\n this.session.configOptions = this.session.configOptions.map((o) =>\n o.id === params.configId ? { ...o, currentValue: params.value } : 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 ? { ...o, currentValue: value } : 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 (!TWIG_EXECUTION_MODES.includes(modeId as TwigExecutionMode)) {\n throw new Error(\"Invalid Mode\");\n }\n const previousMode = this.session.permissionMode;\n this.session.permissionMode = modeId as TwigExecutionMode;\n try {\n await this.session.query.setPermissionMode(modeId as TwigExecutionMode);\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\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: TwigExecutionMode =\n meta?.permissionMode &&\n TWIG_EXECUTION_MODES.includes(meta.permissionMode as TwigExecutionMode)\n ? (meta.permissionMode as TwigExecutionMode)\n : \"default\";\n\n const options = buildSessionOptions({\n cwd,\n mcpServers,\n permissionMode,\n canUseTool: this.createCanUseTool(sessionId),\n logger: this.logger,\n systemPrompt,\n userProvidedOptions: meta?.claudeCode?.options,\n sessionId,\n isResume,\n forkSession,\n additionalDirectories: meta?.claudeCode?.options?.additionalDirectories,\n disableBuiltInTools: meta?.disableBuiltInTools,\n settingsManager,\n onModeChange: this.createOnModeChange(),\n onProcessSpawned: this.options?.onProcessSpawned,\n onProcessExited: this.options?.onProcessExited,\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 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 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 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\n if (!isResume) {\n const resolvedSdkModel = toSdkModelId(resolvedModelId);\n if (resolvedSdkModel !== DEFAULT_MODEL) {\n await this.session.query.setModel(resolvedSdkModel);\n }\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(permissionMode, modelOptions);\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(sessionId: string): 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 });\n }\n\n private createOnModeChange() {\n return async (newMode: TwigExecutionMode) => {\n if (this.session) {\n this.session.permissionMode = newMode;\n }\n await this.updateConfigOption(\"mode\", newMode);\n };\n }\n\n private buildConfigOptions(\n currentModeId: string,\n modelOptions: {\n currentModelId: string;\n options: SessionConfigSelectOption[];\n },\n ): SessionConfigOption[] {\n const modeOptions = getAvailableModes().map((mode) => ({\n value: mode.id,\n name: mode.name,\n description: mode.description ?? undefined,\n }));\n\n return [\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\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 Promise.all([\n new Promise<void>((resolve) => setTimeout(resolve, 10)).then(() =>\n this.sendAvailableCommandsUpdate(),\n ),\n fetchMcpToolMetadata(q, this.logger),\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.1.152\",\n \"repository\": \"https://github.com/PostHog/twig\",\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\": \"rm -rf 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\": \"rm -rf dist .turbo\"\n },\n \"engines\": {\n \"node\": \">=20.0.0\"\n },\n \"devDependencies\": {\n \"@posthog/shared\": \"workspace:*\",\n \"@twig/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.14.0\",\n \"@anthropic-ai/claude-agent-sdk\": \"0.2.63\",\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.js\";\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","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 ArrayModelsResponse =\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 ArrayModelInfo {\n id: string;\n owned_by?: string;\n}\n\nlet arrayModelsCache: {\n models: ArrayModelInfo[];\n expiry: number;\n url: string;\n} | null = null;\n\nexport async function fetchArrayModels(\n options?: FetchGatewayModelsOptions,\n): Promise<ArrayModelInfo[]> {\n const gatewayUrl = options?.gatewayUrl ?? process.env.ANTHROPIC_BASE_URL;\n if (!gatewayUrl) {\n return [];\n }\n\n if (\n arrayModelsCache &&\n arrayModelsCache.url === gatewayUrl &&\n Date.now() < arrayModelsCache.expiry\n ) {\n return arrayModelsCache.models;\n }\n\n try {\n const base = new URL(gatewayUrl);\n base.pathname = \"/array/v1/models\";\n base.search = \"\";\n base.hash = \"\";\n const response = await fetch(base.toString());\n if (!response.ok) {\n return [];\n }\n const data = (await response.json()) as ArrayModelsResponse;\n const models = Array.isArray(data)\n ? data\n : (data.data ?? data.models ?? []);\n const results: ArrayModelInfo[] = [];\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 arrayModelsCache = {\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 let cleanId = model.id;\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 {\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 isAnthropicModel,\n} from \"../gateway-models.js\";\nimport { Logger } from \"../utils/logger.js\";\nimport type { SettingsManager } from \"./claude/session/settings.js\";\n\nexport interface BaseSession {\n notificationHistory: SessionNotification[];\n cancelled: boolean;\n interruptReason?: string;\n abortController: AbortController;\n settingsManager: SettingsManager;\n}\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\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 const gatewayModels = await fetchGatewayModels();\n\n const options = 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","import 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 = filePath.split(\"/\").pop() || filePath;\n return `[@${name}](${uri})`;\n }\n if (uri.startsWith(\"zed://\")) {\n const parts = uri.split(\"/\");\n const name = parts[parts.length - 1] || 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 } 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.js\";\nimport { unreachable } from \"../../../utils/common.js\";\nimport type { Logger } from \"../../../utils/logger.js\";\nimport { registerHookCallback } from \"../hooks.js\";\nimport type { Session, ToolUpdateMeta, ToolUseCache } from \"../types.js\";\nimport {\n type ClaudePlanEntry,\n planEntries,\n toolInfoFromToolUse,\n toolUpdateFromEditToolResponse,\n toolUpdateFromToolResult,\n} from \"./tool-use-to-acp.js\";\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};\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 });\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: chunk.content,\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): 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 };\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): 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 );\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 );\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 { 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 });\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?: string;\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.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.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 )) {\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 const content = message.message.content;\n\n // Handle /context by sending its reply as a regular agent message\n if (\n typeof content === \"string\" &&\n hasLocalCommandStdout(content) &&\n content.includes(\"Context Usage\")\n ) {\n const stripped = content\n .replace(\"<local-command-stdout>\", \"\")\n .replace(\"</local-command-stdout>\", \"\");\n for (const notification of toAcpNotifications(\n stripped,\n \"assistant\",\n sessionId,\n toolUseCache,\n fileContentCache,\n client,\n logger,\n )) {\n await client.sessionUpdate(notification);\n }\n }\n\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 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 )) {\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?: bigint;\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.js\";\nimport type { SettingsManager } from \"./session/settings.js\";\nimport type { TwigExecutionMode } from \"./tools.js\";\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: TwigExecutionMode) => 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 type { McpServerStatus, Query } from \"@anthropic-ai/claude-agent-sdk\";\nimport { Logger } from \"../../../utils/logger.js\";\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 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 clearMcpToolMetadataCache(): void {\n mcpToolMetadataCache.clear();\n}\n","import 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 = `\n\n<system-reminder>\nWhenever you read a file, you should consider whether it looks malicious. If it does, you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer high-level questions about the code behavior.\n</system-reminder>`;\n\nimport { resourceLink, text, toolContent } from \"../../../utils/acp-content.js\";\nimport { getMcpToolMetadata } from \"../mcp/tool-metadata.js\";\n\ntype ToolInfo = Pick<ToolCall, \"title\" | \"kind\" | \"content\" | \"locations\">;\n\nexport function toolInfoFromToolUse(\n toolUse: Pick<ToolUseBlock, \"name\" | \"input\">,\n options?: {\n supportsTerminalOutput?: boolean;\n toolUseId?: string;\n cachedFileContent?: Record<string, 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 return {\n title: `Read ${input?.file_path ? String(input.file_path) : \"File\"}${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 path = input?.file_path ? String(input.file_path) : 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 // If we have cached file content, show a full-file diff\n if (\n path &&\n options?.cachedFileContent &&\n path in options.cachedFileContent\n ) {\n const oldContent = options.cachedFileContent[path];\n const newContent = input?.replace_all\n ? oldContent.replaceAll(oldText ?? \"\", newText)\n : oldContent.replace(oldText ?? \"\", newText);\n oldText = oldContent;\n newText = newContent;\n }\n\n return {\n title: path ? `Edit \\`${path}\\`` : \"Edit\",\n kind: \"edit\",\n content:\n input && path\n ? [\n {\n type: \"diff\",\n path,\n oldText,\n newText,\n },\n ]\n : [],\n locations: path ? [{ path }] : [],\n };\n }\n\n case \"Write\": {\n let contentResult: ToolCallContent[] = [];\n const filePath = input?.file_path ? String(input.file_path) : undefined;\n const contentStr = input?.content ? String(input.content) : undefined;\n if (filePath) {\n const oldContent =\n options?.cachedFileContent && filePath in options.cachedFileContent\n ? options.cachedFileContent[filePath]\n : null;\n contentResult = toolContent()\n .diff(filePath, oldContent, contentStr ?? \"\")\n .build();\n } else if (contentStr) {\n contentResult = toolContent().text(contentStr).build();\n }\n return {\n title: filePath ? `Write ${filePath}` : \"Write\",\n kind: \"edit\",\n content: contentResult,\n locations: filePath ? [{ path: filePath }] : [],\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(\n (itemObj.text ?? \"\").replace(SYSTEM_REMINDER, \"\"),\n ),\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(\n markdownEscape(toolResult.content.replace(SYSTEM_REMINDER, \"\")),\n )\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 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\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 * 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.js\";\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 twigToolKind: \"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 twigToolKind: \"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.js\";\n\nexport interface ModeInfo {\n id: TwigExecutionMode;\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 TWIG_EXECUTION_MODES = [\n \"default\",\n \"acceptEdits\",\n \"plan\",\n // \"dontAsk\",\n \"bypassPermissions\",\n] as const;\n\nexport type TwigExecutionMode = (typeof TWIG_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 getAvailableModes,\n type ModeInfo,\n TWIG_EXECUTION_MODES,\n type TwigExecutionMode,\n} from \"../../execution-mode.js\";\n\nimport type { TwigExecutionMode } from \"../../execution-mode.js\";\nimport { isMcpToolReadOnly } from \"./mcp/tool-metadata.js\";\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([\"Task\", \"TodoWrite\", \"Skill\"]);\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: TwigExecutionMode,\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 { BASH_TOOLS, READ_TOOLS, SEARCH_TOOLS, WRITE_TOOLS } from \"../tools.js\";\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\nexport function buildExitPlanModePermissionOptions(): PermissionOption[] {\n return [\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, keep planning\",\n optionId: \"plan\",\n },\n ];\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.js\";\nimport type { Logger } from \"../../../utils/logger.js\";\nimport { toolInfoFromToolUse } from \"../conversion/tool-use-to-acp.js\";\nimport {\n getClaudePlansDir,\n getLatestAssistantText,\n isClaudePlanFilePath,\n isPlanReady,\n} from \"../plan/utils.js\";\nimport {\n type AskUserQuestionInput,\n normalizeAskUserQuestionInput,\n OPTION_PREFIX,\n type QuestionItem,\n} from \"../questions/utils.js\";\nimport { isToolAllowedForMode, WRITE_TOOLS } from \"../tools.js\";\nimport type { Session } from \"../types.js\";\nimport {\n buildExitPlanModePermissionOptions,\n buildPermissionOptions,\n} from \"./permission-options.js\";\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}\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 ) {\n session.permissionMode = response.outcome.optionId;\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 message =\n \"User wants to continue planning. Please refine your plan based on any feedback provided, or ask clarifying questions if needed.\";\n await emitToolDenial(context, message);\n return { behavior: \"deny\", message, interrupt: false };\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 interrupt: true,\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 twigToolKind: \"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 interrupt: true,\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 interrupt: true,\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>,\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 interrupt: true,\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\nexport async function canUseTool(\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n const { toolName, toolInput, session } = context;\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","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.js\";\nimport type { Logger } from \"../../../utils/logger.js\";\nimport {\n createPostToolUseHook,\n createPreToolUseHook,\n type OnModeChange,\n} from \"../hooks.js\";\nimport type { TwigExecutionMode } from \"../tools.js\";\nimport { DEFAULT_MODEL } from \"./models.js\";\nimport type { SettingsManager } from \"./settings.js\";\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: TwigExecutionMode;\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}\n\nconst BRANCH_NAMING_INSTRUCTIONS = `\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\nexport function buildSystemPrompt(\n customPrompt?: unknown,\n): Options[\"systemPrompt\"] {\n const defaultPrompt: Options[\"systemPrompt\"] = {\n type: \"preset\",\n preset: \"claude_code\",\n append: BRANCH_NAMING_INSTRUCTIONS,\n };\n\n if (!customPrompt) {\n return defaultPrompt;\n }\n\n if (typeof customPrompt === \"string\") {\n return customPrompt + BRANCH_NAMING_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 + BRANCH_NAMING_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 const options: Options = {\n ...params.userProvidedOptions,\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: { type: \"preset\", preset: \"claude_code\" },\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.disableBuiltInTools) {\n const builtInTools = [\n \"Read\",\n \"Write\",\n \"Edit\",\n \"Bash\",\n \"Glob\",\n \"Grep\",\n \"Task\",\n \"TodoWrite\",\n \"ExitPlanMode\",\n \"WebSearch\",\n \"WebFetch\",\n \"SlashCommand\",\n \"Skill\",\n \"NotebookEdit\",\n ];\n options.disallowedTools = [\n ...(options.disallowedTools ?? []),\n ...builtInTools,\n ];\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","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.js\";\nimport { Logger } from \"../../utils/logger.js\";\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/twig/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.js\";\nimport { getLlmGatewayUrl } from \"./utils/gateway.js\";\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.js\";\nimport type { PostHogAPIClient } from \"./posthog-api.js\";\nimport type { StoredNotification } from \"./types.js\";\nimport { Logger } from \"./utils/logger.js\";\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., ~/.twig) */\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}\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 });\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 }\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\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 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.js\";\nimport {\n BLOCKED_MODELS,\n DEFAULT_GATEWAY_MODEL,\n fetchArrayModels,\n} from \"./gateway-models.js\";\nimport { PostHogAPIClient, type TaskRunUpdate } from \"./posthog-api.js\";\nimport { SessionLogWriter } from \"./session-log-writer.js\";\nimport type { AgentConfig, TaskExecutionOptions } from \"./types.js\";\nimport { Logger } from \"./utils/logger.js\";\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(_adapter?: \"claude\" | \"codex\"): {\n gatewayUrl: string;\n apiKey: string;\n } | null {\n if (!this.posthogAPI) {\n return null;\n }\n\n try {\n const gatewayUrl = 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.adapter);\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 fetchArrayModels({\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) {\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","resolve","path","input","text","text","content","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/utils/logger.ts","../src/utils/streams.ts","../src/adapters/claude/claude-agent.ts","../package.json","../src/utils/common.ts","../src/gateway-models.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/mcp/tool-metadata.ts","../src/adapters/claude/conversion/tool-use-to-acp.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/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.js\";\nimport type { SessionLogWriter } from \"../session-log-writer.js\";\nimport type { ProcessSpawnedCallback } from \"../types.js\";\nimport { Logger } from \"../utils/logger.js\";\nimport {\n createBidirectionalStreams,\n createTappedWritableStream,\n nodeReadableToWebReadable,\n nodeWritableToWebWritable,\n type StreamPair,\n} from \"../utils/streams.js\";\nimport { ClaudeAcpAgent } from \"./claude/claude-agent.js\";\nimport { type CodexProcessOptions, spawnCodexProcess } from \"./codex/spawn.js\";\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 ConfigOption = {\n id?: string;\n category?: string | null;\n currentValue?: string;\n options?: Array<\n { value?: string } | { group?: string; options?: Array<{ value?: string }> }\n >;\n};\n\nfunction isGroupedOptions(\n options: NonNullable<ConfigOption[\"options\"]>,\n): options is Array<{ group?: string; options?: Array<{ value?: string }> }> {\n return options.length > 0 && \"group\" in options[0];\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 ?? []).filter(\n (o) => o?.value && allowedModelIds.has(o.value),\n ),\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 Array<{ value?: string }>;\n const filteredOptions = valueOptions.filter(\n (o) => o?.value && allowedModelIds.has(o.value),\n );\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 /** 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","import type { LogLevel as LogLevelType, OnLogCallback } from \"../types.js\";\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.js\";\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.js\";\nimport { Logger } from \"../../utils/logger.js\";\nimport { Pushable } from \"../../utils/streams.js\";\nimport { BaseAcpAgent } from \"../base-acp-agent.js\";\nimport { promptToClaude } from \"./conversion/acp-to-sdk.js\";\nimport {\n handleResultMessage,\n handleStreamEvent,\n handleSystemMessage,\n handleUserAssistantMessage,\n} from \"./conversion/sdk-to-acp.js\";\nimport { fetchMcpToolMetadata } from \"./mcp/tool-metadata.js\";\nimport { canUseTool } from \"./permissions/permission-handlers.js\";\nimport { getAvailableSlashCommands } from \"./session/commands.js\";\nimport { parseMcpServers } from \"./session/mcp-config.js\";\nimport { DEFAULT_MODEL, toSdkModelId } from \"./session/models.js\";\nimport {\n buildSessionOptions,\n buildSystemPrompt,\n type ProcessSpawnedInfo,\n} from \"./session/options.js\";\nimport { SettingsManager } from \"./session/settings.js\";\nimport {\n getAvailableModes,\n TWIG_EXECUTION_MODES,\n type TwigExecutionMode,\n} from \"./tools.js\";\nimport type {\n BackgroundTerminal,\n NewSessionMeta,\n Session,\n ToolUseCache,\n} from \"./types.js\";\n\nconst SESSION_VALIDATION_TIMEOUT_MS = 10_000;\nconst MAX_TITLE_LENGTH = 256;\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}\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 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 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 unstable_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 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\n if (this.session.promptRunning) {\n const uuid = randomUUID();\n userMessage.uuid = uuid;\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(uuid, { resolve, order });\n });\n if (cancelled) {\n return { stopReason: \"cancelled\" };\n }\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\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 }\n await handleSystemMessage(message, context);\n break;\n\n case \"result\": {\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 // Calculate context window size from modelUsage (minimum across all models used)\n const contextWindows = Object.values(message.modelUsage).map(\n (m) => m.contextWindow,\n );\n const contextWindowSize =\n contextWindows.length > 0 ? Math.min(...contextWindows) : 200000;\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 as unknown as bigint,\n size: contextWindowSize as unknown as bigint,\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 // Build usage for PromptResponse\n // ACP SDK types declare these as bigint but JSON.stringify can't\n // serialize BigInt. Token counts never exceed MAX_SAFE_INTEGER so\n // we pass plain numbers and cast to satisfy the type system.\n const 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 } as unknown as Usage;\n\n const result = handleResultMessage(message);\n if (result.error) throw result.error;\n\n switch (message.subtype) {\n case \"error_max_budget_usd\":\n case \"error_max_turns\":\n case \"error_max_structured_output_retries\":\n return { stopReason: \"max_turn_requests\", usage };\n default:\n return { stopReason: \"end_turn\", usage };\n }\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 queued prompt replay\n if (message.type === \"user\" && \"uuid\" in message && message.uuid) {\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 // 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.output_tokens +\n usage.cache_read_input_tokens +\n usage.cache_creation_input_tokens;\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 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 } 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 const sdkModelId = toSdkModelId(params.modelId);\n await this.session.query.setModel(sdkModelId);\n this.session.modelId = 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 const allValues: { value: 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 { value: string }[])\n : [o as { value: string }],\n )\n : [];\n const validValue = allValues.find((o) => o.value === params.value);\n if (!validValue) {\n throw new Error(\n `Invalid value for config option ${params.configId}: ${params.value}`,\n );\n }\n\n if (params.configId === \"mode\") {\n await this.applySessionMode(params.value);\n await this.client.sessionUpdate({\n sessionId: this.sessionId,\n update: {\n sessionUpdate: \"current_mode_update\",\n currentModeId: params.value,\n },\n });\n } else if (params.configId === \"model\") {\n const sdkModelId = toSdkModelId(params.value);\n await this.session.query.setModel(sdkModelId);\n this.session.modelId = params.value;\n }\n\n this.session.configOptions = this.session.configOptions.map((o) =>\n o.id === params.configId ? { ...o, currentValue: params.value } : 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 ? { ...o, currentValue: value } : 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 (!TWIG_EXECUTION_MODES.includes(modeId as TwigExecutionMode)) {\n throw new Error(\"Invalid Mode\");\n }\n const previousMode = this.session.permissionMode;\n this.session.permissionMode = modeId as TwigExecutionMode;\n try {\n await this.session.query.setPermissionMode(modeId as TwigExecutionMode);\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\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: TwigExecutionMode =\n meta?.permissionMode &&\n TWIG_EXECUTION_MODES.includes(meta.permissionMode as TwigExecutionMode)\n ? (meta.permissionMode as TwigExecutionMode)\n : \"default\";\n\n const options = buildSessionOptions({\n cwd,\n mcpServers,\n permissionMode,\n canUseTool: this.createCanUseTool(sessionId),\n logger: this.logger,\n systemPrompt,\n userProvidedOptions: meta?.claudeCode?.options,\n sessionId,\n isResume,\n forkSession,\n additionalDirectories: meta?.claudeCode?.options?.additionalDirectories,\n disableBuiltInTools: meta?.disableBuiltInTools,\n settingsManager,\n onModeChange: this.createOnModeChange(),\n onProcessSpawned: this.options?.onProcessSpawned,\n onProcessExited: this.options?.onProcessExited,\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 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 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 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\n if (!isResume) {\n const resolvedSdkModel = toSdkModelId(resolvedModelId);\n if (resolvedSdkModel !== DEFAULT_MODEL) {\n await this.session.query.setModel(resolvedSdkModel);\n }\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(permissionMode, modelOptions);\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(sessionId: string): 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 });\n }\n\n private createOnModeChange() {\n return async (newMode: TwigExecutionMode) => {\n if (this.session) {\n this.session.permissionMode = newMode;\n }\n await this.updateConfigOption(\"mode\", newMode);\n };\n }\n\n private buildConfigOptions(\n currentModeId: string,\n modelOptions: {\n currentModelId: string;\n options: SessionConfigSelectOption[];\n },\n ): SessionConfigOption[] {\n const modeOptions = getAvailableModes().map((mode) => ({\n value: mode.id,\n name: mode.name,\n description: mode.description ?? undefined,\n }));\n\n return [\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\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 Promise.all([\n new Promise<void>((resolve) => setTimeout(resolve, 10)).then(() =>\n this.sendAvailableCommandsUpdate(),\n ),\n fetchMcpToolMetadata(q, this.logger),\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.1.157\",\n \"repository\": \"https://github.com/PostHog/twig\",\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\": \"rm -rf 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\": \"rm -rf dist .turbo\"\n },\n \"engines\": {\n \"node\": \">=20.0.0\"\n },\n \"devDependencies\": {\n \"@posthog/shared\": \"workspace:*\",\n \"@twig/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.14.0\",\n \"@anthropic-ai/claude-agent-sdk\": \"0.2.63\",\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.js\";\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","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 ArrayModelsResponse =\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 ArrayModelInfo {\n id: string;\n owned_by?: string;\n}\n\nlet arrayModelsCache: {\n models: ArrayModelInfo[];\n expiry: number;\n url: string;\n} | null = null;\n\nexport async function fetchArrayModels(\n options?: FetchGatewayModelsOptions,\n): Promise<ArrayModelInfo[]> {\n const gatewayUrl = options?.gatewayUrl ?? process.env.ANTHROPIC_BASE_URL;\n if (!gatewayUrl) {\n return [];\n }\n\n if (\n arrayModelsCache &&\n arrayModelsCache.url === gatewayUrl &&\n Date.now() < arrayModelsCache.expiry\n ) {\n return arrayModelsCache.models;\n }\n\n try {\n const base = new URL(gatewayUrl);\n base.pathname = \"/array/v1/models\";\n base.search = \"\";\n base.hash = \"\";\n const response = await fetch(base.toString());\n if (!response.ok) {\n return [];\n }\n const data = (await response.json()) as ArrayModelsResponse;\n const models = Array.isArray(data)\n ? data\n : (data.data ?? data.models ?? []);\n const results: ArrayModelInfo[] = [];\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 arrayModelsCache = {\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 let cleanId = model.id;\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 {\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 isAnthropicModel,\n} from \"../gateway-models.js\";\nimport { Logger } from \"../utils/logger.js\";\nimport type { SettingsManager } from \"./claude/session/settings.js\";\n\nexport interface BaseSession {\n notificationHistory: SessionNotification[];\n cancelled: boolean;\n interruptReason?: string;\n abortController: AbortController;\n settingsManager: SettingsManager;\n}\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\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 const gatewayModels = await fetchGatewayModels();\n\n const options = 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","import 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 = filePath.split(\"/\").pop() || filePath;\n return `[@${name}](${uri})`;\n }\n if (uri.startsWith(\"zed://\")) {\n const parts = uri.split(\"/\");\n const name = parts[parts.length - 1] || 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 } 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.js\";\nimport { unreachable } from \"../../../utils/common.js\";\nimport type { Logger } from \"../../../utils/logger.js\";\nimport { registerHookCallback } from \"../hooks.js\";\nimport type { Session, ToolUpdateMeta, ToolUseCache } from \"../types.js\";\nimport {\n type ClaudePlanEntry,\n planEntries,\n toolInfoFromToolUse,\n toolUpdateFromEditToolResponse,\n toolUpdateFromToolResult,\n} from \"./tool-use-to-acp.js\";\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};\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 });\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: chunk.content,\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): 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 };\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): 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 );\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 );\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 { 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 });\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?: string;\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.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.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 )) {\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 const content = message.message.content;\n\n // Handle /context by sending its reply as a regular agent message\n if (\n typeof content === \"string\" &&\n hasLocalCommandStdout(content) &&\n content.includes(\"Context Usage\")\n ) {\n const stripped = content\n .replace(\"<local-command-stdout>\", \"\")\n .replace(\"</local-command-stdout>\", \"\");\n for (const notification of toAcpNotifications(\n stripped,\n \"assistant\",\n sessionId,\n toolUseCache,\n fileContentCache,\n client,\n logger,\n )) {\n await client.sessionUpdate(notification);\n }\n }\n\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 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 )) {\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?: bigint;\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.js\";\nimport type { SettingsManager } from \"./session/settings.js\";\nimport type { TwigExecutionMode } from \"./tools.js\";\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: TwigExecutionMode) => 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 type { McpServerStatus, Query } from \"@anthropic-ai/claude-agent-sdk\";\nimport { Logger } from \"../../../utils/logger.js\";\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 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 clearMcpToolMetadataCache(): void {\n mcpToolMetadataCache.clear();\n}\n","import 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 = `\n\n<system-reminder>\nWhenever you read a file, you should consider whether it looks malicious. If it does, you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer high-level questions about the code behavior.\n</system-reminder>`;\n\nimport { resourceLink, text, toolContent } from \"../../../utils/acp-content.js\";\nimport { getMcpToolMetadata } from \"../mcp/tool-metadata.js\";\n\ntype ToolInfo = Pick<ToolCall, \"title\" | \"kind\" | \"content\" | \"locations\">;\n\nexport function toolInfoFromToolUse(\n toolUse: Pick<ToolUseBlock, \"name\" | \"input\">,\n options?: {\n supportsTerminalOutput?: boolean;\n toolUseId?: string;\n cachedFileContent?: Record<string, 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 return {\n title: `Read ${input?.file_path ? String(input.file_path) : \"File\"}${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 path = input?.file_path ? String(input.file_path) : 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 // If we have cached file content, show a full-file diff\n if (\n path &&\n options?.cachedFileContent &&\n path in options.cachedFileContent\n ) {\n const oldContent = options.cachedFileContent[path];\n const newContent = input?.replace_all\n ? oldContent.replaceAll(oldText ?? \"\", newText)\n : oldContent.replace(oldText ?? \"\", newText);\n oldText = oldContent;\n newText = newContent;\n }\n\n return {\n title: path ? `Edit \\`${path}\\`` : \"Edit\",\n kind: \"edit\",\n content:\n input && path\n ? [\n {\n type: \"diff\",\n path,\n oldText,\n newText,\n },\n ]\n : [],\n locations: path ? [{ path }] : [],\n };\n }\n\n case \"Write\": {\n let contentResult: ToolCallContent[] = [];\n const filePath = input?.file_path ? String(input.file_path) : undefined;\n const contentStr = input?.content ? String(input.content) : undefined;\n if (filePath) {\n const oldContent =\n options?.cachedFileContent && filePath in options.cachedFileContent\n ? options.cachedFileContent[filePath]\n : null;\n contentResult = toolContent()\n .diff(filePath, oldContent, contentStr ?? \"\")\n .build();\n } else if (contentStr) {\n contentResult = toolContent().text(contentStr).build();\n }\n return {\n title: filePath ? `Write ${filePath}` : \"Write\",\n kind: \"edit\",\n content: contentResult,\n locations: filePath ? [{ path: filePath }] : [],\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(\n (itemObj.text ?? \"\").replace(SYSTEM_REMINDER, \"\"),\n ),\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(\n markdownEscape(toolResult.content.replace(SYSTEM_REMINDER, \"\")),\n )\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 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\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 * 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.js\";\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 twigToolKind: \"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 twigToolKind: \"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.js\";\n\nexport interface ModeInfo {\n id: TwigExecutionMode;\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 TWIG_EXECUTION_MODES = [\n \"default\",\n \"acceptEdits\",\n \"plan\",\n // \"dontAsk\",\n \"bypassPermissions\",\n] as const;\n\nexport type TwigExecutionMode = (typeof TWIG_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 getAvailableModes,\n type ModeInfo,\n TWIG_EXECUTION_MODES,\n type TwigExecutionMode,\n} from \"../../execution-mode.js\";\n\nimport type { TwigExecutionMode } from \"../../execution-mode.js\";\nimport { isMcpToolReadOnly } from \"./mcp/tool-metadata.js\";\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([\"Task\", \"TodoWrite\", \"Skill\"]);\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: TwigExecutionMode,\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 { BASH_TOOLS, READ_TOOLS, SEARCH_TOOLS, WRITE_TOOLS } from \"../tools.js\";\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\nexport function buildExitPlanModePermissionOptions(): PermissionOption[] {\n return [\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, keep planning\",\n optionId: \"plan\",\n },\n ];\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.js\";\nimport type { Logger } from \"../../../utils/logger.js\";\nimport { toolInfoFromToolUse } from \"../conversion/tool-use-to-acp.js\";\nimport {\n getClaudePlansDir,\n getLatestAssistantText,\n isClaudePlanFilePath,\n isPlanReady,\n} from \"../plan/utils.js\";\nimport {\n type AskUserQuestionInput,\n normalizeAskUserQuestionInput,\n OPTION_PREFIX,\n type QuestionItem,\n} from \"../questions/utils.js\";\nimport { isToolAllowedForMode, WRITE_TOOLS } from \"../tools.js\";\nimport type { Session } from \"../types.js\";\nimport {\n buildExitPlanModePermissionOptions,\n buildPermissionOptions,\n} from \"./permission-options.js\";\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}\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 ) {\n session.permissionMode = response.outcome.optionId;\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 message =\n \"User wants to continue planning. Please refine your plan based on any feedback provided, or ask clarifying questions if needed.\";\n await emitToolDenial(context, message);\n return { behavior: \"deny\", message, interrupt: false };\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 interrupt: true,\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 twigToolKind: \"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 interrupt: true,\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 interrupt: true,\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>,\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 interrupt: true,\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\nexport async function canUseTool(\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n const { toolName, toolInput, session } = context;\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","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.js\";\nimport type { Logger } from \"../../../utils/logger.js\";\nimport {\n createPostToolUseHook,\n createPreToolUseHook,\n type OnModeChange,\n} from \"../hooks.js\";\nimport type { TwigExecutionMode } from \"../tools.js\";\nimport { DEFAULT_MODEL } from \"./models.js\";\nimport type { SettingsManager } from \"./settings.js\";\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: TwigExecutionMode;\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}\n\nconst BRANCH_NAMING_INSTRUCTIONS = `\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\nexport function buildSystemPrompt(\n customPrompt?: unknown,\n): Options[\"systemPrompt\"] {\n const defaultPrompt: Options[\"systemPrompt\"] = {\n type: \"preset\",\n preset: \"claude_code\",\n append: BRANCH_NAMING_INSTRUCTIONS,\n };\n\n if (!customPrompt) {\n return defaultPrompt;\n }\n\n if (typeof customPrompt === \"string\") {\n return customPrompt + BRANCH_NAMING_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 + BRANCH_NAMING_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 const options: Options = {\n ...params.userProvidedOptions,\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: { type: \"preset\", preset: \"claude_code\" },\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.disableBuiltInTools) {\n const builtInTools = [\n \"Read\",\n \"Write\",\n \"Edit\",\n \"Bash\",\n \"Glob\",\n \"Grep\",\n \"Task\",\n \"TodoWrite\",\n \"ExitPlanMode\",\n \"WebSearch\",\n \"WebFetch\",\n \"SlashCommand\",\n \"Skill\",\n \"NotebookEdit\",\n ];\n options.disallowedTools = [\n ...(options.disallowedTools ?? []),\n ...builtInTools,\n ];\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","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.js\";\nimport { Logger } from \"../../utils/logger.js\";\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/twig/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.js\";\nimport { getLlmGatewayUrl } from \"./utils/gateway.js\";\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.js\";\nimport type { PostHogAPIClient } from \"./posthog-api.js\";\nimport type { StoredNotification } from \"./types.js\";\nimport { Logger } from \"./utils/logger.js\";\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., ~/.twig) */\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}\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 });\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 }\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\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 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.js\";\nimport {\n BLOCKED_MODELS,\n DEFAULT_GATEWAY_MODEL,\n fetchArrayModels,\n} from \"./gateway-models.js\";\nimport { PostHogAPIClient, type TaskRunUpdate } from \"./posthog-api.js\";\nimport { SessionLogWriter } from \"./session-log-writer.js\";\nimport type { AgentConfig, TaskExecutionOptions } from \"./types.js\";\nimport { Logger } from \"./utils/logger.js\";\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(_adapter?: \"claude\" | \"codex\"): {\n gatewayUrl: string;\n apiKey: string;\n } | null {\n if (!this.posthogAPI) {\n return null;\n }\n\n try {\n const gatewayUrl = 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.adapter);\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 fetchArrayModels({\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) {\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","resolve","path","input","text","text","content","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"]}
|