@posthog/agent 2.0.2 → 2.0.3
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-DBQY1BfC.d.ts → agent-kRbaLUfe.d.ts} +3 -0
- package/dist/agent.d.ts +1 -1
- package/dist/agent.js +60 -3
- package/dist/agent.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +72 -3
- package/dist/index.js.map +1 -1
- package/dist/server/agent-server.js +60 -3
- package/dist/server/agent-server.js.map +1 -1
- package/dist/server/{bin.js → bin.cjs} +283 -242
- package/dist/server/bin.cjs.map +1 -0
- package/package.json +4 -4
- package/src/sagas/resume-saga.test.ts +144 -0
- package/src/sagas/resume-saga.ts +23 -0
- package/src/sagas/test-fixtures.ts +9 -0
- package/src/session-log-writer.ts +81 -1
- package/dist/server/bin.d.ts +0 -1
- package/dist/server/bin.js.map +0 -1
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/conversion/tool-use-to-acp.ts","../src/adapters/claude/mcp/tool-metadata.ts","../src/adapters/claude/plan/utils.ts","../src/adapters/claude/questions/utils.ts","../src/execution-mode.ts","../src/adapters/claude/tools.ts","../src/adapters/claude/permissions/permission-options.ts","../src/adapters/claude/permissions/permission-handlers.ts","../src/adapters/claude/session/commands.ts","../src/adapters/claude/session/mcp-config.ts","../src/adapters/claude/session/models.ts","../src/adapters/claude/session/options.ts","../src/adapters/codex/spawn.ts","../src/utils/gateway.ts","../src/posthog-api.ts","../src/otel-log-writer.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\nexport type 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 agentWritable = createTappedWritableStream(streams.agent.writable, {\n onMessage: (line) => {\n logWriter.appendRawLine(config.taskRunId!, line);\n },\n logger,\n });\n\n clientWritable = createTappedWritableStream(streams.client.writable, {\n onMessage: (line) => {\n logWriter.appendRawLine(config.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, logWriter, 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) {\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\nexport type PostHogNotificationType =\n (typeof POSTHOG_NOTIFICATIONS)[keyof typeof POSTHOG_NOTIFICATIONS];\n\n// --- Payload types for each notification ---\n\nexport interface BranchCreatedPayload {\n branch: string;\n}\n\nexport interface RunStartedPayload {\n sessionId: string;\n runId: string;\n taskId?: string;\n}\n\nexport interface TaskCompletePayload {\n sessionId: string;\n taskId: string;\n}\n\nexport interface ErrorNotificationPayload {\n sessionId: string;\n message: string;\n error?: unknown;\n}\n\nexport interface ConsoleNotificationPayload {\n sessionId: string;\n level: \"debug\" | \"info\" | \"warn\" | \"error\";\n message: string;\n}\n\nexport interface SdkSessionPayload {\n taskRunId: string;\n sessionId: string;\n adapter: \"claude\" | \"codex\";\n}\n\nexport interface TreeSnapshotPayload {\n treeHash: string;\n baseCommit: string | null;\n archiveUrl?: string;\n changes: Array<{ path: string; status: \"A\" | \"M\" | \"D\" }>;\n timestamp: string;\n interrupted?: boolean;\n device?: {\n type: \"local\" | \"cloud\";\n name?: string;\n };\n}\n\nexport interface ModeChangePayload {\n mode: \"interactive\" | \"background\";\n previous_mode: \"interactive\" | \"background\";\n}\n\nexport interface SessionResumePayload {\n sessionId: string;\n fromSnapshot?: string;\n}\n\nexport interface UserMessagePayload {\n content: string;\n}\n\nexport interface StatusPayload {\n sessionId: string;\n status: string;\n message?: string;\n}\n\nexport interface TaskNotificationPayload {\n sessionId: string;\n type: string;\n message?: string;\n data?: Record<string, unknown>;\n}\n\nexport interface CompactBoundaryPayload {\n sessionId: string;\n timestamp: string;\n}\n\nexport type PostHogNotificationPayload =\n | BranchCreatedPayload\n | RunStartedPayload\n | TaskCompletePayload\n | ErrorNotificationPayload\n | ConsoleNotificationPayload\n | SdkSessionPayload\n | TreeSnapshotPayload\n | ModeChangePayload\n | SessionResumePayload\n | UserMessagePayload\n | StatusPayload\n | TaskNotificationPayload\n | CompactBoundaryPayload;\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 * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport {\n type AgentSideConnection,\n type AuthenticateRequest,\n type AvailableCommand,\n type ClientCapabilities,\n type InitializeRequest,\n type InitializeResponse,\n type LoadSessionRequest,\n type LoadSessionResponse,\n type NewSessionRequest,\n type NewSessionResponse,\n type PromptRequest,\n type PromptResponse,\n RequestError,\n type SessionConfigOption,\n type SessionConfigOptionCategory,\n type SessionConfigSelectOption,\n type SetSessionConfigOptionRequest,\n type SetSessionConfigOptionResponse,\n} from \"@agentclientprotocol/sdk\";\nimport {\n type CanUseTool,\n type Options,\n type Query,\n query,\n type SDKMessage,\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 type { SessionContext } from \"../../otel-log-writer.js\";\nimport type { SessionLogWriter } from \"../../session-log-writer.js\";\nimport { unreachable } 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 { toSdkModelId } from \"./session/models.js\";\nimport {\n buildSessionOptions,\n buildSystemPrompt,\n type ProcessSpawnedInfo,\n} from \"./session/options.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\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 logWriter?: SessionLogWriter;\n private processCallbacks?: ClaudeAcpAgentOptions;\n private lastSentConfigOptions?: SessionConfigOption[];\n\n constructor(\n client: AgentSideConnection,\n logWriter?: SessionLogWriter,\n processCallbacks?: ClaudeAcpAgentOptions,\n ) {\n super(client);\n this.logWriter = logWriter;\n this.processCallbacks = processCallbacks;\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 _meta: {\n posthog: {\n resumeSession: true,\n },\n },\n },\n agentInfo: {\n name: packageJson.name,\n title: \"Claude Code\",\n version: packageJson.version,\n },\n authMethods: [\n {\n id: \"claude-login\",\n name: \"Log in with Claude Code\",\n description: \"Run `claude /login` in the terminal\",\n },\n ],\n };\n }\n\n async authenticate(_params: AuthenticateRequest): Promise<void> {\n throw new Error(\"Method not implemented.\");\n }\n\n async newSession(params: NewSessionRequest): Promise<NewSessionResponse> {\n this.checkAuthStatus();\n\n const meta = params._meta as NewSessionMeta | undefined;\n const internalSessionId = uuidv7();\n const permissionMode: TwigExecutionMode = \"default\";\n\n const mcpServers = parseMcpServers(params);\n await fetchMcpToolMetadata(mcpServers, this.logger);\n\n const options = buildSessionOptions({\n cwd: params.cwd,\n mcpServers,\n permissionMode,\n canUseTool: this.createCanUseTool(internalSessionId),\n logger: this.logger,\n systemPrompt: buildSystemPrompt(meta?.systemPrompt),\n userProvidedOptions: meta?.claudeCode?.options,\n onModeChange: this.createOnModeChange(internalSessionId),\n onProcessSpawned: this.processCallbacks?.onProcessSpawned,\n onProcessExited: this.processCallbacks?.onProcessExited,\n });\n\n const input = new Pushable<SDKUserMessage>();\n const q = query({ prompt: input, options });\n\n const session = this.createSession(\n internalSessionId,\n q,\n input,\n permissionMode,\n params.cwd,\n options.abortController as AbortController,\n );\n session.taskRunId = meta?.taskRunId;\n this.registerPersistence(\n internalSessionId,\n meta as Record<string, unknown>,\n );\n const modelOptions = await this.getModelConfigOptions();\n session.modelId = modelOptions.currentModelId;\n await this.trySetModel(q, modelOptions.currentModelId);\n\n this.sendAvailableCommandsUpdate(\n internalSessionId,\n await getAvailableSlashCommands(q),\n );\n\n return {\n sessionId: internalSessionId,\n configOptions: await this.buildConfigOptions(modelOptions),\n };\n }\n\n async loadSession(params: LoadSessionRequest): Promise<LoadSessionResponse> {\n return this.resumeSession(params);\n }\n\n async resumeSession(\n params: LoadSessionRequest,\n ): Promise<LoadSessionResponse> {\n const { sessionId: internalSessionId } = params;\n if (this.sessionId === internalSessionId) {\n return {};\n }\n\n const meta = params._meta as NewSessionMeta | undefined;\n const mcpServers = parseMcpServers(params);\n await fetchMcpToolMetadata(mcpServers, this.logger);\n\n const { query: q, session } = await this.initializeQuery({\n internalSessionId,\n cwd: params.cwd,\n permissionMode: \"default\",\n mcpServers,\n systemPrompt: buildSystemPrompt(meta?.systemPrompt),\n userProvidedOptions: meta?.claudeCode?.options,\n sessionId: meta?.sessionId,\n additionalDirectories: meta?.claudeCode?.options?.additionalDirectories,\n });\n\n session.taskRunId = meta?.taskRunId;\n if (meta?.sessionId) {\n session.sessionId = meta.sessionId;\n }\n\n this.registerPersistence(\n internalSessionId,\n meta as Record<string, unknown>,\n );\n this.sendAvailableCommandsUpdate(\n internalSessionId,\n await getAvailableSlashCommands(q),\n );\n\n return {\n configOptions: await this.buildConfigOptions(),\n };\n }\n\n async prompt(params: PromptRequest): Promise<PromptResponse> {\n this.session.cancelled = false;\n this.session.interruptReason = undefined;\n\n await this.broadcastUserMessage(params);\n this.session.input.push(promptToClaude(params));\n\n return this.processMessages(params.sessionId);\n }\n\n async setSessionConfigOption(\n params: SetSessionConfigOptionRequest,\n ): Promise<SetSessionConfigOptionResponse> {\n const configId = params.configId;\n const value = params.value;\n\n if (configId === \"mode\") {\n const modeId = value as TwigExecutionMode;\n if (!TWIG_EXECUTION_MODES.includes(modeId)) {\n throw new Error(\"Invalid Mode\");\n }\n this.session.permissionMode = modeId;\n await this.session.query.setPermissionMode(modeId);\n } else if (configId === \"model\") {\n await this.setModelWithFallback(this.session.query, value);\n this.session.modelId = value;\n } else {\n throw new Error(\"Unsupported config option\");\n }\n\n await this.emitConfigOptionsUpdate();\n return { configOptions: await this.buildConfigOptions() };\n }\n\n protected async interruptSession(): Promise<void> {\n await this.session.query.interrupt();\n }\n\n async extMethod(\n method: string,\n params: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n if (method === \"_posthog/session/resume\") {\n const result = await this.resumeSession(\n params as unknown as LoadSessionRequest,\n );\n return {\n _meta: {\n configOptions: result.configOptions,\n },\n };\n }\n\n throw RequestError.methodNotFound(method);\n }\n\n private createSession(\n sessionId: string,\n q: Query,\n input: Pushable<SDKUserMessage>,\n permissionMode: TwigExecutionMode,\n cwd: string,\n abortController: AbortController,\n ): Session {\n const session: Session = {\n query: q,\n input,\n cancelled: false,\n permissionMode,\n cwd,\n notificationHistory: [],\n abortController,\n };\n this.session = session;\n this.sessionId = sessionId;\n return session;\n }\n\n private async initializeQuery(config: {\n internalSessionId: string;\n cwd: string;\n permissionMode: TwigExecutionMode;\n mcpServers: ReturnType<typeof parseMcpServers>;\n userProvidedOptions?: Options;\n systemPrompt?: Options[\"systemPrompt\"];\n sessionId?: string;\n additionalDirectories?: string[];\n }): Promise<{\n query: Query;\n input: Pushable<SDKUserMessage>;\n session: Session;\n }> {\n const input = new Pushable<SDKUserMessage>();\n\n const options = buildSessionOptions({\n cwd: config.cwd,\n mcpServers: config.mcpServers,\n permissionMode: config.permissionMode,\n canUseTool: this.createCanUseTool(config.internalSessionId),\n logger: this.logger,\n systemPrompt: config.systemPrompt,\n userProvidedOptions: config.userProvidedOptions,\n sessionId: config.sessionId,\n additionalDirectories: config.additionalDirectories,\n onModeChange: this.createOnModeChange(config.internalSessionId),\n onProcessSpawned: this.processCallbacks?.onProcessSpawned,\n onProcessExited: this.processCallbacks?.onProcessExited,\n });\n\n const q = query({ prompt: input, options });\n const abortController = options.abortController as AbortController;\n\n const session = this.createSession(\n config.internalSessionId,\n q,\n input,\n config.permissionMode,\n config.cwd,\n abortController,\n );\n\n return { query: q, input, session };\n }\n\n private createCanUseTool(sessionId: string): CanUseTool {\n return async (toolName, toolInput, { suggestions, toolUseID }) =>\n canUseTool({\n session: this.session,\n toolName,\n toolInput: toolInput as Record<string, unknown>,\n toolUseID,\n suggestions,\n client: this.client,\n sessionId,\n fileContentCache: this.fileContentCache,\n logger: this.logger,\n emitConfigOptionsUpdate: () => this.emitConfigOptionsUpdate(sessionId),\n });\n }\n\n private createOnModeChange(sessionId: string) {\n return async (newMode: TwigExecutionMode) => {\n if (this.session) {\n this.session.permissionMode = newMode;\n }\n await this.emitConfigOptionsUpdate(sessionId);\n };\n }\n\n private async buildConfigOptions(modelOptionsOverride?: {\n currentModelId: string;\n options: SessionConfigSelectOption[];\n }): Promise<SessionConfigOption[]> {\n const options: SessionConfigOption[] = [];\n\n const modeOptions = getAvailableModes().map((mode) => ({\n value: mode.id,\n name: mode.name,\n description: mode.description ?? undefined,\n }));\n\n options.push({\n id: \"mode\",\n name: \"Approval Preset\",\n type: \"select\",\n currentValue: this.session.permissionMode,\n options: modeOptions,\n category: \"mode\" as SessionConfigOptionCategory,\n description: \"Choose an approval and sandboxing preset for your session\",\n });\n\n const modelOptions =\n modelOptionsOverride ??\n (await this.getModelConfigOptions(this.session.modelId));\n this.session.modelId = modelOptions.currentModelId;\n\n options.push({\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 return options;\n }\n\n private async emitConfigOptionsUpdate(sessionId?: string): Promise<void> {\n const configOptions = await this.buildConfigOptions();\n const serialized = JSON.stringify(configOptions);\n if (\n this.lastSentConfigOptions &&\n JSON.stringify(this.lastSentConfigOptions) === serialized\n ) {\n return;\n }\n\n this.lastSentConfigOptions = configOptions;\n await this.client.sessionUpdate({\n sessionId: sessionId ?? this.sessionId,\n update: {\n sessionUpdate: \"config_option_update\",\n configOptions,\n },\n });\n }\n\n private checkAuthStatus() {\n const backupExists = fs.existsSync(\n path.resolve(os.homedir(), \".claude.json.backup\"),\n );\n const configExists = fs.existsSync(\n path.resolve(os.homedir(), \".claude.json\"),\n );\n if (backupExists && !configExists) {\n throw RequestError.authRequired();\n }\n }\n\n private async trySetModel(q: Query, modelId: string) {\n try {\n await this.setModelWithFallback(q, modelId);\n } catch (err) {\n this.logger.warn(\"Failed to set model\", { modelId, error: err });\n }\n }\n\n private async setModelWithFallback(q: Query, modelId: string): Promise<void> {\n try {\n await q.setModel(modelId);\n return;\n } catch (err) {\n const fallback = toSdkModelId(modelId);\n if (fallback === modelId) {\n throw err;\n }\n await q.setModel(fallback);\n }\n }\n\n private registerPersistence(\n sessionId: string,\n meta: Record<string, unknown> | undefined,\n ) {\n const persistence = meta?.persistence as SessionContext | undefined;\n if (persistence && this.logWriter) {\n this.logWriter.register(sessionId, persistence);\n }\n }\n\n private sendAvailableCommandsUpdate(\n sessionId: string,\n availableCommands: AvailableCommand[],\n ) {\n setTimeout(() => {\n this.client.sessionUpdate({\n sessionId,\n update: {\n sessionUpdate: \"available_commands_update\",\n availableCommands,\n },\n });\n }, 0);\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 private async processMessages(sessionId: string): Promise<PromptResponse> {\n const context = {\n session: this.session,\n sessionId,\n client: this.client,\n toolUseCache: this.toolUseCache,\n fileContentCache: this.fileContentCache,\n logger: this.logger,\n };\n\n while (true) {\n const { value: message, done } = await this.session.query.next();\n\n if (done || !message) {\n return this.handleSessionEnd();\n }\n\n const response = await this.handleMessage(message, context);\n if (response) {\n return response;\n }\n }\n }\n\n private handleSessionEnd(): PromptResponse {\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 throw new Error(\"Session did not end in result\");\n }\n\n private async handleMessage(\n message: SDKMessage,\n context: Parameters<typeof handleSystemMessage>[1],\n ): Promise<PromptResponse | null> {\n switch (message.type) {\n case \"system\":\n await handleSystemMessage(message, context);\n return null;\n\n case \"result\": {\n const result = handleResultMessage(message, context);\n if (result.error) throw result.error;\n if (result.shouldStop) {\n return {\n stopReason: result.stopReason as \"end_turn\" | \"max_turn_requests\",\n };\n }\n return null;\n }\n\n case \"stream_event\":\n await handleStreamEvent(message, context);\n return null;\n\n case \"user\":\n case \"assistant\": {\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 return null;\n }\n\n case \"tool_progress\":\n case \"auth_status\":\n return null;\n\n default:\n unreachable(message, this.logger);\n return null;\n }\n }\n}\n","{\n \"name\": \"@posthog/agent\",\n \"version\": \"2.0.2\",\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 \"./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.js\"\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\": \"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 },\n \"engines\": {\n \"node\": \">=20.0.0\"\n },\n \"devDependencies\": {\n \"@changesets/cli\": \"^2.27.8\",\n \"@types/bun\": \"latest\",\n \"@types/tar\": \"^6.1.13\",\n \"minimatch\": \"^10.0.3\",\n \"@posthog/shared\": \"workspace:*\",\n \"@twig/git\": \"workspace:*\",\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 \"@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 \"@agentclientprotocol/sdk\": \"^0.14.0\",\n \"@anthropic-ai/claude-agent-sdk\": \"0.2.12\",\n \"@anthropic-ai/sdk\": \"^0.71.0\",\n \"@hono/node-server\": \"^1.19.9\",\n \"@modelcontextprotocol/sdk\": \"^1.25.3\",\n \"@types/jsonwebtoken\": \"^9.0.10\",\n \"commander\": \"^14.0.2\",\n \"diff\": \"^8.0.2\",\n \"dotenv\": \"^17.2.3\",\n \"hono\": \"^4.11.7\",\n \"jsonwebtoken\": \"^9.0.2\",\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\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 = 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\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 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 ?? [];\n return models.filter((m) => !BLOCKED_MODELS.has(m.id));\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 async function fetchArrayModelIds(\n options?: FetchGatewayModelsOptions,\n): Promise<string[]> {\n const models = await fetchArrayModels(options);\n return models.map((model) => model.id);\n}\n\nexport interface ArrayModelInfo {\n id: string;\n owned_by?: string;\n}\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 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 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\";\n\nexport interface BaseSession {\n notificationHistory: SessionNotification[];\n cancelled: boolean;\n interruptReason?: string;\n abortController: AbortController;\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 interruptSession(): Promise<void>;\n\n async cancel(params: CancelNotification): Promise<void> {\n if (this.sessionId !== params.sessionId) {\n throw new Error(\"Session not found\");\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.interruptSession();\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.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 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} from \"@agentclientprotocol/sdk\";\nimport { RequestError } from \"@agentclientprotocol/sdk\";\nimport type {\n SDKPartialAssistantMessage,\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 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};\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}\n\nfunction messageUpdateType(role: Role) {\n return role === \"assistant\" ? \"agent_message_chunk\" : \"user_message_chunk\";\n}\n\nfunction toolMeta(toolName: string, toolResponse?: unknown): ToolUpdateMeta {\n return toolResponse\n ? { claudeCode: { toolName, toolResponse } }\n : { claudeCode: { toolName } };\n}\n\nfunction handleTextChunk(\n chunk: { text: string },\n role: Role,\n): SessionNotification[\"update\"] {\n return {\n sessionUpdate: messageUpdateType(role),\n content: text(chunk.text),\n };\n}\n\nfunction handleImageChunk(\n chunk: {\n source: { type: string; data?: string; media_type?: string; url?: string };\n },\n role: Role,\n): SessionNotification[\"update\"] {\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(chunk: {\n thinking: string;\n}): SessionNotification[\"update\"] {\n return {\n sessionUpdate: \"agent_thought_chunk\",\n content: text(chunk.thinking),\n };\n}\n\nfunction handleToolUseChunk(\n chunk: ToolUseCache[string],\n ctx: ChunkHandlerContext,\n): SessionNotification[\"update\"] | null {\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 registerHookCallback(chunk.id, {\n onPostToolUseHook: async (toolUseId, _toolInput, toolResponse) => {\n const toolUse = ctx.toolUseCache[toolUseId];\n if (toolUse) {\n await ctx.client.sessionUpdate({\n sessionId: ctx.sessionId,\n update: {\n _meta: toolMeta(toolUse.name, toolResponse),\n toolCallId: toolUseId,\n sessionUpdate: \"tool_call_update\",\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 let rawInput: Record<string, unknown> | undefined;\n try {\n rawInput = JSON.parse(JSON.stringify(chunk.input));\n } catch {\n // ignore\n }\n\n return {\n _meta: toolMeta(chunk.name),\n toolCallId: chunk.id,\n sessionUpdate: \"tool_call\",\n rawInput,\n status: \"pending\",\n ...toolInfoFromToolUse(chunk, ctx.fileContentCache, ctx.logger),\n };\n}\n\nfunction handleToolResultChunk(\n chunk: AnthropicContentChunk & { tool_use_id: string; is_error?: boolean },\n ctx: ChunkHandlerContext,\n): SessionNotification[\"update\"] | null {\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 null;\n }\n\n if (toolUse.name === \"TodoWrite\") {\n return null;\n }\n\n return {\n _meta: toolMeta(toolUse.name),\n toolCallId: chunk.tool_use_id,\n sessionUpdate: \"tool_call_update\",\n status: chunk.is_error ? \"failed\" : \"completed\",\n ...toolUpdateFromToolResult(\n chunk as Parameters<typeof toolUpdateFromToolResult>[0],\n toolUse,\n ),\n };\n}\n\nfunction processContentChunk(\n chunk: AnthropicContentChunk,\n role: Role,\n ctx: ChunkHandlerContext,\n): SessionNotification[\"update\"] | null {\n switch (chunk.type) {\n case \"text\":\n case \"text_delta\":\n return handleTextChunk(chunk, role);\n\n case \"image\":\n return handleImageChunk(chunk, role);\n\n case \"thinking\":\n case \"thinking_delta\":\n return handleThinkingChunk(chunk);\n\n case \"tool_use\":\n case \"server_tool_use\":\n case \"mcp_tool_use\":\n return handleToolUseChunk(chunk as ToolUseCache[string], ctx);\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 },\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 return null;\n\n default:\n unreachable(chunk, ctx.logger);\n return null;\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): SessionNotification[] {\n if (typeof content === \"string\") {\n return [\n {\n sessionId,\n update: {\n sessionUpdate: messageUpdateType(role),\n content: text(content),\n },\n },\n ];\n }\n\n const ctx: ChunkHandlerContext = {\n sessionId,\n toolUseCache,\n fileContentCache,\n client,\n logger,\n };\n const output: SessionNotification[] = [];\n\n for (const chunk of content) {\n const update = processContentChunk(chunk, role, ctx);\n if (update) {\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): 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 );\n case \"content_block_delta\":\n return toAcpNotifications(\n [event.delta],\n \"assistant\",\n sessionId,\n toolUseCache,\n fileContentCache,\n client,\n logger,\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, logger);\n return [];\n }\n}\n\nexport async function handleSystemMessage(\n message: any,\n context: MessageHandlerContext,\n): Promise<void> {\n const { session, sessionId, client, logger } = context;\n\n switch (message.subtype) {\n case \"init\":\n if (message.session_id && session && !session.sessionId) {\n session.sessionId = message.session_id;\n if (session.taskRunId) {\n await client.extNotification(\"_posthog/sdk_session\", {\n taskRunId: session.taskRunId,\n sessionId: message.session_id,\n adapter: \"claude\",\n });\n }\n }\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 function handleResultMessage(\n message: any,\n context: MessageHandlerContext,\n): { shouldStop: boolean; stopReason?: string; error?: Error } {\n const { session } = context;\n\n if (session.cancelled) {\n return {\n shouldStop: true,\n stopReason: \"cancelled\",\n };\n }\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 };\n }\n if (message.is_error) {\n return {\n shouldStop: true,\n error: RequestError.internalError(undefined, message.result),\n };\n }\n return { shouldStop: true, stopReason: \"end_turn\" };\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 };\n }\n return { shouldStop: true, stopReason: \"end_turn\" };\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 };\n }\n return { shouldStop: true, stopReason: \"max_turn_requests\" };\n default:\n return { shouldStop: false };\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\n for (const notification of streamEventToAcpNotifications(\n message,\n sessionId,\n toolUseCache,\n fileContentCache,\n client,\n logger,\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 isSimpleUserMessage(message: AnthropicMessageWithContent): boolean {\n return (\n message.type === \"user\" &&\n (typeof message.message.content === \"string\" ||\n (Array.isArray(message.message.content) &&\n message.message.content.length === 1 &&\n message.message.content[0].type === \"text\"))\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 shouldSkipUserAssistantMessage(\n message: AnthropicMessageWithContent,\n): boolean {\n return (\n hasLocalCommandStdout(message.message.content) ||\n hasLocalCommandStderr(message.message.content) ||\n isSimpleUserMessage(message) ||\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 | { type: \"assistant\"; message: any },\n context: MessageHandlerContext,\n): Promise<{ shouldStop?: boolean; error?: Error }> {\n const { session, sessionId, client, toolUseCache, fileContentCache, logger } =\n context;\n\n if (session.cancelled) {\n return {};\n }\n\n if (shouldSkipUserAssistantMessage(message)) {\n logSpecialMessages(message, logger);\n\n if (isLoginRequiredMessage(message)) {\n return { shouldStop: true, error: RequestError.authRequired() };\n }\n return {};\n }\n\n const content = message.message.content;\n const contentToProcess = filterMessageContent(content);\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 )) {\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 { 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}\n\nexport const createPostToolUseHook =\n ({ onModeChange }: 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 }\n }\n }\n return { continue: true };\n };\n","import type {\n PlanEntry,\n ToolCall,\n ToolCallContent,\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 { Logger } from \"../../../utils/logger.js\";\n\ninterface EditOperation {\n oldText: string;\n newText: string;\n replaceAll?: boolean;\n}\n\ninterface EditResult {\n newContent: string;\n lineNumbers: number[];\n}\n\nfunction replaceAndCalculateLocation(\n fileContent: string,\n edits: EditOperation[],\n): EditResult {\n let currentContent = fileContent;\n\n const randomHex = Array.from(crypto.getRandomValues(new Uint8Array(5)))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n const markerPrefix = `__REPLACE_MARKER_${randomHex}_`;\n let markerCounter = 0;\n const markers: string[] = [];\n\n for (const edit of edits) {\n if (edit.oldText === \"\") {\n throw new Error(\n `The provided \\`old_string\\` is empty.\\n\\nNo edits were applied.`,\n );\n }\n\n if (edit.replaceAll) {\n const parts: string[] = [];\n let lastIndex = 0;\n let searchIndex = 0;\n\n while (true) {\n const index = currentContent.indexOf(edit.oldText, searchIndex);\n if (index === -1) {\n if (searchIndex === 0) {\n throw new Error(\n `The provided \\`old_string\\` does not appear in the file: \"${edit.oldText}\".\\n\\nNo edits were applied.`,\n );\n }\n break;\n }\n\n parts.push(currentContent.substring(lastIndex, index));\n\n const marker = `${markerPrefix}${markerCounter++}__`;\n markers.push(marker);\n parts.push(marker + edit.newText);\n\n lastIndex = index + edit.oldText.length;\n searchIndex = lastIndex;\n }\n\n parts.push(currentContent.substring(lastIndex));\n currentContent = parts.join(\"\");\n } else {\n const index = currentContent.indexOf(edit.oldText);\n if (index === -1) {\n throw new Error(\n `The provided \\`old_string\\` does not appear in the file: \"${edit.oldText}\".\\n\\nNo edits were applied.`,\n );\n } else {\n const marker = `${markerPrefix}${markerCounter++}__`;\n markers.push(marker);\n currentContent =\n currentContent.substring(0, index) +\n marker +\n edit.newText +\n currentContent.substring(index + edit.oldText.length);\n }\n }\n }\n\n const lineNumbers: number[] = [];\n for (const marker of markers) {\n const index = currentContent.indexOf(marker);\n if (index !== -1) {\n const lineNumber = Math.max(\n 0,\n currentContent.substring(0, index).split(/\\r\\n|\\r|\\n/).length - 1,\n );\n lineNumbers.push(lineNumber);\n }\n }\n\n let finalContent = currentContent;\n for (const marker of markers) {\n finalContent = finalContent.replace(marker, \"\");\n }\n\n const uniqueLineNumbers = [...new Set(lineNumbers)].sort();\n\n return { newContent: finalContent, lineNumbers: uniqueLineNumbers };\n}\n\ntype ToolInfo = Pick<ToolCall, \"title\" | \"kind\" | \"content\" | \"locations\">;\n\nexport function toolInfoFromToolUse(\n toolUse: Pick<ToolUseBlock, \"name\" | \"input\">,\n cachedFileContent: { [key: string]: string },\n logger: Logger = new Logger({ debug: false, prefix: \"[ClaudeTools]\" }),\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 return {\n title: input?.description ? String(input.description) : \"Task\",\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 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) ?? 0;\n if (inputLimit) {\n limit = ` (${inputOffset + 1} - ${inputOffset + inputLimit})`;\n } else if (inputOffset) {\n limit = ` (from line ${inputOffset + 1})`;\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 = input?.old_string ? String(input.old_string) : null;\n let newText = input?.new_string ? String(input.new_string) : \"\";\n let affectedLines: number[] = [];\n\n if (path && oldText) {\n try {\n const oldContent = cachedFileContent[path] || \"\";\n const newContent = replaceAndCalculateLocation(oldContent, [\n {\n oldText,\n newText,\n replaceAll: false,\n },\n ]);\n oldText = oldContent;\n newText = newContent.newContent;\n affectedLines = newContent.lineNumbers;\n } catch (e) {\n logger.error(\"Failed to edit file\", e);\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\n ? affectedLines.length > 0\n ? affectedLines.map((line) => ({ line, path }))\n : [{ path }]\n : [],\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 contentResult = toolContent()\n .diff(filePath, null, 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 \"FilesWithMatches\":\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 label += ` \"${input?.pattern ? String(input.pattern) : \"\"}\"`;\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 return {\n title: name || \"Unknown Tool\",\n kind: \"other\",\n content: [],\n };\n }\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): Pick<ToolCallUpdate, \"title\" | \"content\" | \"locations\"> {\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 { type?: string; text?: string };\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 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 return toAcpContentUpdate(\n toolResult.content,\n \"is_error\" in toolResult ? toolResult.is_error : false,\n );\n }\n case \"Edit\":\n case \"Write\": {\n if (\n \"is_error\" in toolResult &&\n toolResult.is_error &&\n toolResult.content &&\n toolResult.content.length > 0\n ) {\n return toAcpContentUpdate(toolResult.content, true);\n }\n return {};\n }\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 default: {\n return toAcpContentUpdate(\n toolResult.content,\n \"is_error\" in toolResult ? toolResult.is_error : false,\n );\n }\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 return {\n content: content.map((item) => {\n const itemObj = item as { type?: string; text?: string };\n if (isError && itemObj.type === \"text\") {\n return {\n type: \"content\" as const,\n content: text(`\\`\\`\\`\\n${itemObj.text ?? \"\"}\\n\\`\\`\\``),\n };\n }\n return {\n type: \"content\" as const,\n content: item as { type: \"text\"; text: string },\n };\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 }\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 type { McpServerConfig } from \"@anthropic-ai/claude-agent-sdk\";\nimport { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { StreamableHTTPClientTransport } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport type { Tool } from \"@modelcontextprotocol/sdk/types.js\";\nimport { Logger } from \"../../../utils/logger.js\";\n\nexport interface McpToolMetadata {\n readOnly: boolean;\n}\n\nconst mcpToolMetadataCache: Map<string, McpToolMetadata> = new Map();\n\nfunction buildToolKey(serverName: string, toolName: string): string {\n return `mcp__${serverName}__${toolName}`;\n}\n\nfunction isHttpMcpServer(\n config: McpServerConfig,\n): config is McpServerConfig & { type: \"http\"; url: string } {\n return config.type === \"http\" && typeof (config as any).url === \"string\";\n}\n\nasync function fetchToolsFromHttpServer(\n _serverName: string,\n config: McpServerConfig & { type: \"http\"; url: string },\n): Promise<Tool[]> {\n const transport = new StreamableHTTPClientTransport(new URL(config.url), {\n requestInit: {\n headers: (config as any).headers || {},\n },\n });\n\n const client = new Client({\n name: \"twig-metadata-fetcher\",\n version: \"1.0.0\",\n });\n\n try {\n await client.connect(transport);\n const result = await client.listTools();\n return result.tools;\n } finally {\n await client.close().catch(() => {});\n }\n}\n\nfunction extractToolMetadata(tool: Tool): McpToolMetadata {\n return {\n readOnly: tool.annotations?.readOnlyHint === true,\n };\n}\n\nexport async function fetchMcpToolMetadata(\n mcpServers: Record<string, McpServerConfig>,\n logger: Logger = new Logger({ debug: false, prefix: \"[McpToolMetadata]\" }),\n): Promise<void> {\n const fetchPromises: Promise<void>[] = [];\n\n for (const [serverName, config] of Object.entries(mcpServers)) {\n if (!isHttpMcpServer(config)) {\n continue;\n }\n\n const fetchPromise = fetchToolsFromHttpServer(serverName, config)\n .then((tools) => {\n const toolCount = tools.length;\n const readOnlyCount = tools.filter(\n (t) => t.annotations?.readOnlyHint === true,\n ).length;\n\n for (const tool of tools) {\n const toolKey = buildToolKey(serverName, tool.name);\n mcpToolMetadataCache.set(toolKey, extractToolMetadata(tool));\n }\n\n logger.info(\"Fetched MCP tool metadata\", {\n serverName,\n toolCount,\n readOnlyCount,\n });\n })\n .catch((error) => {\n logger.error(\"Failed to fetch MCP tool metadata\", {\n serverName,\n error: error instanceof Error ? error.message : String(error),\n });\n });\n\n fetchPromises.push(fetchPromise);\n }\n\n await Promise.all(fetchPromises);\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 * 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\nconst MODES: ModeInfo[] = [\n {\n id: \"default\",\n name: \"Always Ask\",\n description: \"Prompts for permission on first use of each tool\",\n },\n {\n id: \"acceptEdits\",\n name: \"Accept Edits\",\n description: \"Automatically accepts file edit permissions for the session\",\n },\n {\n id: \"plan\",\n name: \"Plan Mode\",\n description: \"Claude can analyze but not modify files or execute commands\",\n },\n {\n id: \"bypassPermissions\",\n name: \"Bypass Permissions\",\n description: \"Skips all permission prompts\",\n },\n];\n\nexport const TWIG_EXECUTION_MODES = [\n \"default\",\n \"acceptEdits\",\n \"plan\",\n \"bypassPermissions\",\n] as const;\n\nexport type TwigExecutionMode = (typeof TWIG_EXECUTION_MODES)[number];\n\nexport function getAvailableModes(): ModeInfo[] {\n return IS_ROOT ? MODES.filter((m) => m.id !== \"bypassPermissions\") : MODES;\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\"]);\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};\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 { 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): PermissionOption[] {\n if (BASH_TOOLS.has(toolName)) {\n const command = toolInput?.command as string | undefined;\n const cmdName = command?.split(/\\s+/)[0] ?? \"this command\";\n const cwdLabel = cwd ? ` in ${cwd}` : \"\";\n return permissionOptions(\n `Yes, and don't ask again for \\`${cmdName}\\` commands${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 client: AgentSideConnection;\n sessionId: string;\n fileContentCache: { [key: string]: string };\n logger: Logger;\n emitConfigOptionsUpdate: () => 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, fileContentCache } = context;\n\n const toolInfo = toolInfoFromToolUse(\n { name: context.toolName, input: updatedInput },\n fileContentCache,\n context.logger,\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.emitConfigOptionsUpdate();\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, logger } = context;\n\n session.permissionMode = \"plan\";\n await session.query.setPermissionMode(\"plan\");\n await context.emitConfigOptionsUpdate();\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 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, fileContentCache } = context;\n const firstQuestion = questions[0];\n const options = buildQuestionOptions(firstQuestion);\n\n const toolInfo = toolInfoFromToolUse(\n { name: context.toolName, input: toolInput },\n fileContentCache,\n context.logger,\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 (response.outcome?.outcome !== \"selected\") {\n return {\n behavior: \"deny\",\n message: \"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 fileContentCache,\n suggestions,\n } = context;\n\n const toolInfo = toolInfoFromToolUse(\n { name: toolName, input: toolInput },\n fileContentCache,\n context.logger,\n );\n\n const options = buildPermissionOptions(\n toolName,\n toolInput as Record<string, unknown>,\n session?.cwd,\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 (\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 return handleDefaultPermissionFlow(context);\n}\n","import type { AvailableCommand } from \"@agentclientprotocol/sdk\";\nimport type { Query } from \"@anthropic-ai/claude-agent-sdk\";\n\nconst UNSUPPORTED_COMMANDS = [\n \"context\",\n \"cost\",\n \"login\",\n \"logout\",\n \"output-style:new\",\n \"release-notes\",\n \"todos\",\n];\n\nexport async function getAvailableSlashCommands(\n q: Query,\n): Promise<AvailableCommand[]> {\n const commands = await q.supportedCommands();\n\n return commands\n .map((command) => {\n const input = command.argumentHint\n ? { hint: command.argumentHint }\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 {\n LoadSessionRequest,\n NewSessionRequest,\n} from \"@agentclientprotocol/sdk\";\nimport type { McpServerConfig } from \"@anthropic-ai/claude-agent-sdk\";\n\nexport function parseMcpServers(\n params: NewSessionRequest | LoadSessionRequest,\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-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 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 { createPostToolUseHook, type OnModeChange } from \"../hooks.js\";\nimport type { TwigExecutionMode } from \"../tools.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: Options[\"canUseTool\"];\n logger: Logger;\n systemPrompt?: Options[\"systemPrompt\"];\n userProvidedOptions?: Options;\n sessionId?: string;\n additionalDirectories?: string[];\n onModeChange?: OnModeChange;\n onProcessSpawned?: (info: ProcessSpawnedInfo) => void;\n onProcessExited?: (pid: number) => void;\n}\n\nconst BRANCH_NAMING_INSTRUCTIONS = `\n# Branch Naming\n\nBefore pushing a \"workspace-*\" branch to origin, rename it to something descriptive based on the work done. 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 };\n}\n\nfunction buildHooks(\n userHooks: Options[\"hooks\"],\n onModeChange?: OnModeChange,\n): Options[\"hooks\"] {\n return {\n ...userHooks,\n PostToolUse: [\n ...(userHooks?.PostToolUse || []),\n {\n hooks: [createPostToolUseHook({ onModeChange })],\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): (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 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 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 on(event: \"exit\" | \"error\", listener: (...args: any[]) => void) {\n child.on(event, listener);\n },\n once(event: \"exit\" | \"error\", listener: (...args: any[]) => void) {\n child.once(event, listener);\n },\n off(event: \"exit\" | \"error\", listener: (...args: any[]) => void) {\n child.off(event, listener);\n },\n };\n };\n}\n\nexport function buildSessionOptions(params: BuildOptionsParams): Options {\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 mcpServers: buildMcpServers(\n params.userProvidedOptions?.mcpServers,\n params.mcpServers,\n ),\n env: buildEnvironment(),\n hooks: buildHooks(params.userProvidedOptions?.hooks, params.onModeChange),\n abortController: getAbortController(\n params.userProvidedOptions?.abortController,\n ),\n ...(params.onProcessSpawned && {\n spawnClaudeCodeProcess: buildSpawnWrapper(\n params.sessionId ?? \"unknown\",\n params.onProcessSpawned,\n params.onProcessExited,\n ),\n }),\n };\n\n if (process.env.CLAUDE_CODE_EXECUTABLE) {\n options.pathToClaudeCodeExecutable = process.env.CLAUDE_CODE_EXECUTABLE;\n }\n\n if (params.sessionId) {\n options.resume = params.sessionId;\n }\n\n if (params.additionalDirectories) {\n options.additionalDirectories = params.additionalDirectories;\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 try {\n if (fs.existsSync(statsigPath)) {\n fs.rmSync(statsigPath, { recursive: true, force: true });\n }\n } catch {\n // Ignore errors - cache clearing is best-effort\n }\n}\n","import { type ChildProcess, spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\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 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 // Prevent Electron's GPU/Chromium processes from interfering with child\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 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.debug(\"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 function getLlmGatewayUrl(posthogHost: string): 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/twig`;\n }\n\n // Docker containers accessing host\n if (hostname === \"host.docker.internal\") {\n return `${url.protocol}//host.docker.internal:3308/twig`;\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/twig`;\n}\n","import 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\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 };\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 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 { SeverityNumber } from \"@opentelemetry/api-logs\";\nimport { OTLPLogExporter } from \"@opentelemetry/exporter-logs-otlp-http\";\nimport { resourceFromAttributes } from \"@opentelemetry/resources\";\nimport {\n BatchLogRecordProcessor,\n LoggerProvider,\n} from \"@opentelemetry/sdk-logs\";\nimport { ATTR_SERVICE_NAME } from \"@opentelemetry/semantic-conventions\";\nimport type { StoredNotification } from \"./types.js\";\nimport type { Logger } from \"./utils/logger.js\";\n\nexport interface OtelLogConfig {\n /** PostHog ingest host, e.g., \"https://us.i.posthog.com\" */\n posthogHost: string;\n /** Project API key, e.g., \"phc_xxx\" */\n apiKey: string;\n /** Batch flush interval in ms (default: 500) */\n flushIntervalMs?: number;\n /** Override the logs endpoint path (default: /i/v1/agent-logs) */\n logsPath?: string;\n}\n\n/**\n * Session context for resource attributes.\n * These are set once per OTEL logger instance and indexed via resource_fingerprint\n */\nexport interface SessionContext {\n /** Parent task grouping - all runs for a task share this */\n taskId: string;\n /** Primary conversation identifier - all events in a run share this */\n runId: string;\n /** Deployment environment - \"local\" for desktop, \"cloud\" for cloud sandbox */\n deviceType?: \"local\" | \"cloud\";\n}\n\nexport class OtelLogWriter {\n private loggerProvider: LoggerProvider;\n private logger: ReturnType<LoggerProvider[\"getLogger\"]>;\n\n constructor(\n config: OtelLogConfig,\n sessionContext: SessionContext,\n _debugLogger?: Logger,\n ) {\n const logsPath = config.logsPath ?? \"/i/v1/agent-logs\";\n const exporter = new OTLPLogExporter({\n url: `${config.posthogHost}${logsPath}`,\n headers: { Authorization: `Bearer ${config.apiKey}` },\n });\n\n const processor = new BatchLogRecordProcessor(exporter, {\n scheduledDelayMillis: config.flushIntervalMs ?? 500,\n });\n\n // Resource attributes are set ONCE per session and indexed via resource_fingerprint\n // So we have fast queries by run_id/task_id in PostHog Logs UI\n this.loggerProvider = new LoggerProvider({\n resource: resourceFromAttributes({\n [ATTR_SERVICE_NAME]: \"twig-agent\",\n run_id: sessionContext.runId,\n task_id: sessionContext.taskId,\n device_type: sessionContext.deviceType ?? \"local\",\n }),\n processors: [processor],\n });\n\n this.logger = this.loggerProvider.getLogger(\"agent-session\");\n }\n\n /**\n * Emit an agent event to PostHog Logs via OTEL.\n */\n emit(entry: { notification: StoredNotification }): void {\n const { notification } = entry;\n const eventType = notification.notification.method;\n\n this.logger.emit({\n severityNumber: SeverityNumber.INFO,\n severityText: \"INFO\",\n body: JSON.stringify(notification),\n attributes: {\n event_type: eventType,\n },\n });\n }\n\n async flush(): Promise<void> {\n await this.loggerProvider.forceFlush();\n }\n\n async shutdown(): Promise<void> {\n await this.loggerProvider.shutdown();\n }\n}\n","import {\n type OtelLogConfig,\n OtelLogWriter,\n type SessionContext,\n} 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 /** OTEL config for creating writers per session */\n otelConfig?: OtelLogConfig;\n /** PostHog API client for S3 log persistence */\n posthogAPI?: PostHogAPIClient;\n /** Logger instance */\n logger?: Logger;\n}\n\ninterface SessionState {\n context: SessionContext;\n otelWriter?: OtelLogWriter;\n}\n\nexport class SessionLogWriter {\n private posthogAPI?: PostHogAPIClient;\n private otelConfig?: OtelLogConfig;\n private pendingEntries: Map<string, StoredNotification[]> = new Map();\n private flushTimeouts: Map<string, NodeJS.Timeout> = new Map();\n private sessions: Map<string, SessionState> = new Map();\n private logger: Logger;\n\n constructor(options: SessionLogWriterOptions = {}) {\n this.posthogAPI = options.posthogAPI;\n this.otelConfig = options.otelConfig;\n this.logger =\n options.logger ??\n new Logger({ debug: false, prefix: \"[SessionLogWriter]\" });\n }\n\n async flushAll(): Promise<void> {\n const flushPromises: Promise<void>[] = [];\n for (const sessionId of this.sessions.keys()) {\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 let otelWriter: OtelLogWriter | undefined;\n if (this.otelConfig) {\n // Create a dedicated OtelLogWriter for this session with resource attributes\n otelWriter = new OtelLogWriter(\n this.otelConfig,\n context,\n this.logger.child(`OtelWriter:${sessionId}`),\n );\n }\n\n this.sessions.set(sessionId, { context, otelWriter });\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 return;\n }\n\n try {\n const message = JSON.parse(line);\n const entry: StoredNotification = {\n type: \"notification\",\n timestamp: new Date().toISOString(),\n notification: message,\n };\n\n if (session.otelWriter) {\n session.otelWriter.emit({ notification: entry });\n }\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 sessionId,\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) return;\n\n if (session.otelWriter) {\n await session.otelWriter.flush();\n }\n\n const pending = this.pendingEntries.get(sessionId);\n if (!this.posthogAPI || !pending?.length) return;\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 try {\n await this.posthogAPI.appendTaskRunLog(\n session.context.taskId,\n session.context.runId,\n pending,\n );\n } catch (error) {\n this.logger.error(\"Failed to persist session logs:\", error);\n }\n }\n\n private scheduleFlush(sessionId: string): void {\n const existing = this.flushTimeouts.get(sessionId);\n if (existing) clearTimeout(existing);\n const timeout = setTimeout(() => this.flush(sessionId), 500);\n this.flushTimeouts.set(sessionId, timeout);\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 } 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 public debug: boolean;\n\n constructor(config: AgentConfig) {\n this.debug = config.debug || false;\n this.logger = new Logger({\n debug: this.debug,\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.otelTransport) {\n // OTEL pipeline: use OtelLogWriter only (no S3 writer)\n this.sessionLogWriter = new SessionLogWriter({\n otelConfig: {\n posthogHost: config.otelTransport.host,\n apiKey: config.otelTransport.apiKey,\n logsPath: config.otelTransport.logsPath,\n },\n logger: this.logger.child(\"SessionLogWriter\"),\n });\n } else if (config.posthog) {\n // Legacy: use S3 writer via PostHog API\n this.sessionLogWriter = new SessionLogWriter({\n posthogAPI: this.posthogAPI,\n logger: this.logger.child(\"SessionLogWriter\"),\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\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: any = {\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 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","text","path","path","input","text","os","path","RequestError","spawn","existsSync","existsSync","spawn","filteredOptions","currentAllowed","nextCurrent","sessionId","text","writer","taskRunId"]}
|
|
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/conversion/tool-use-to-acp.ts","../src/adapters/claude/mcp/tool-metadata.ts","../src/adapters/claude/plan/utils.ts","../src/adapters/claude/questions/utils.ts","../src/execution-mode.ts","../src/adapters/claude/tools.ts","../src/adapters/claude/permissions/permission-options.ts","../src/adapters/claude/permissions/permission-handlers.ts","../src/adapters/claude/session/commands.ts","../src/adapters/claude/session/mcp-config.ts","../src/adapters/claude/session/models.ts","../src/adapters/claude/session/options.ts","../src/adapters/codex/spawn.ts","../src/utils/gateway.ts","../src/posthog-api.ts","../src/otel-log-writer.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\nexport type 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 agentWritable = createTappedWritableStream(streams.agent.writable, {\n onMessage: (line) => {\n logWriter.appendRawLine(config.taskRunId!, line);\n },\n logger,\n });\n\n clientWritable = createTappedWritableStream(streams.client.writable, {\n onMessage: (line) => {\n logWriter.appendRawLine(config.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, logWriter, 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) {\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\nexport type PostHogNotificationType =\n (typeof POSTHOG_NOTIFICATIONS)[keyof typeof POSTHOG_NOTIFICATIONS];\n\n// --- Payload types for each notification ---\n\nexport interface BranchCreatedPayload {\n branch: string;\n}\n\nexport interface RunStartedPayload {\n sessionId: string;\n runId: string;\n taskId?: string;\n}\n\nexport interface TaskCompletePayload {\n sessionId: string;\n taskId: string;\n}\n\nexport interface ErrorNotificationPayload {\n sessionId: string;\n message: string;\n error?: unknown;\n}\n\nexport interface ConsoleNotificationPayload {\n sessionId: string;\n level: \"debug\" | \"info\" | \"warn\" | \"error\";\n message: string;\n}\n\nexport interface SdkSessionPayload {\n taskRunId: string;\n sessionId: string;\n adapter: \"claude\" | \"codex\";\n}\n\nexport interface TreeSnapshotPayload {\n treeHash: string;\n baseCommit: string | null;\n archiveUrl?: string;\n changes: Array<{ path: string; status: \"A\" | \"M\" | \"D\" }>;\n timestamp: string;\n interrupted?: boolean;\n device?: {\n type: \"local\" | \"cloud\";\n name?: string;\n };\n}\n\nexport interface ModeChangePayload {\n mode: \"interactive\" | \"background\";\n previous_mode: \"interactive\" | \"background\";\n}\n\nexport interface SessionResumePayload {\n sessionId: string;\n fromSnapshot?: string;\n}\n\nexport interface UserMessagePayload {\n content: string;\n}\n\nexport interface StatusPayload {\n sessionId: string;\n status: string;\n message?: string;\n}\n\nexport interface TaskNotificationPayload {\n sessionId: string;\n type: string;\n message?: string;\n data?: Record<string, unknown>;\n}\n\nexport interface CompactBoundaryPayload {\n sessionId: string;\n timestamp: string;\n}\n\nexport type PostHogNotificationPayload =\n | BranchCreatedPayload\n | RunStartedPayload\n | TaskCompletePayload\n | ErrorNotificationPayload\n | ConsoleNotificationPayload\n | SdkSessionPayload\n | TreeSnapshotPayload\n | ModeChangePayload\n | SessionResumePayload\n | UserMessagePayload\n | StatusPayload\n | TaskNotificationPayload\n | CompactBoundaryPayload;\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 * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport {\n type AgentSideConnection,\n type AuthenticateRequest,\n type AvailableCommand,\n type ClientCapabilities,\n type InitializeRequest,\n type InitializeResponse,\n type LoadSessionRequest,\n type LoadSessionResponse,\n type NewSessionRequest,\n type NewSessionResponse,\n type PromptRequest,\n type PromptResponse,\n RequestError,\n type SessionConfigOption,\n type SessionConfigOptionCategory,\n type SessionConfigSelectOption,\n type SetSessionConfigOptionRequest,\n type SetSessionConfigOptionResponse,\n} from \"@agentclientprotocol/sdk\";\nimport {\n type CanUseTool,\n type Options,\n type Query,\n query,\n type SDKMessage,\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 type { SessionContext } from \"../../otel-log-writer.js\";\nimport type { SessionLogWriter } from \"../../session-log-writer.js\";\nimport { unreachable } 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 { toSdkModelId } from \"./session/models.js\";\nimport {\n buildSessionOptions,\n buildSystemPrompt,\n type ProcessSpawnedInfo,\n} from \"./session/options.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\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 logWriter?: SessionLogWriter;\n private processCallbacks?: ClaudeAcpAgentOptions;\n private lastSentConfigOptions?: SessionConfigOption[];\n\n constructor(\n client: AgentSideConnection,\n logWriter?: SessionLogWriter,\n processCallbacks?: ClaudeAcpAgentOptions,\n ) {\n super(client);\n this.logWriter = logWriter;\n this.processCallbacks = processCallbacks;\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 _meta: {\n posthog: {\n resumeSession: true,\n },\n },\n },\n agentInfo: {\n name: packageJson.name,\n title: \"Claude Code\",\n version: packageJson.version,\n },\n authMethods: [\n {\n id: \"claude-login\",\n name: \"Log in with Claude Code\",\n description: \"Run `claude /login` in the terminal\",\n },\n ],\n };\n }\n\n async authenticate(_params: AuthenticateRequest): Promise<void> {\n throw new Error(\"Method not implemented.\");\n }\n\n async newSession(params: NewSessionRequest): Promise<NewSessionResponse> {\n this.checkAuthStatus();\n\n const meta = params._meta as NewSessionMeta | undefined;\n const internalSessionId = uuidv7();\n const permissionMode: TwigExecutionMode = \"default\";\n\n const mcpServers = parseMcpServers(params);\n await fetchMcpToolMetadata(mcpServers, this.logger);\n\n const options = buildSessionOptions({\n cwd: params.cwd,\n mcpServers,\n permissionMode,\n canUseTool: this.createCanUseTool(internalSessionId),\n logger: this.logger,\n systemPrompt: buildSystemPrompt(meta?.systemPrompt),\n userProvidedOptions: meta?.claudeCode?.options,\n onModeChange: this.createOnModeChange(internalSessionId),\n onProcessSpawned: this.processCallbacks?.onProcessSpawned,\n onProcessExited: this.processCallbacks?.onProcessExited,\n });\n\n const input = new Pushable<SDKUserMessage>();\n const q = query({ prompt: input, options });\n\n const session = this.createSession(\n internalSessionId,\n q,\n input,\n permissionMode,\n params.cwd,\n options.abortController as AbortController,\n );\n session.taskRunId = meta?.taskRunId;\n this.registerPersistence(\n internalSessionId,\n meta as Record<string, unknown>,\n );\n const modelOptions = await this.getModelConfigOptions();\n session.modelId = modelOptions.currentModelId;\n await this.trySetModel(q, modelOptions.currentModelId);\n\n this.sendAvailableCommandsUpdate(\n internalSessionId,\n await getAvailableSlashCommands(q),\n );\n\n return {\n sessionId: internalSessionId,\n configOptions: await this.buildConfigOptions(modelOptions),\n };\n }\n\n async loadSession(params: LoadSessionRequest): Promise<LoadSessionResponse> {\n return this.resumeSession(params);\n }\n\n async resumeSession(\n params: LoadSessionRequest,\n ): Promise<LoadSessionResponse> {\n const { sessionId: internalSessionId } = params;\n if (this.sessionId === internalSessionId) {\n return {};\n }\n\n const meta = params._meta as NewSessionMeta | undefined;\n const mcpServers = parseMcpServers(params);\n await fetchMcpToolMetadata(mcpServers, this.logger);\n\n const { query: q, session } = await this.initializeQuery({\n internalSessionId,\n cwd: params.cwd,\n permissionMode: \"default\",\n mcpServers,\n systemPrompt: buildSystemPrompt(meta?.systemPrompt),\n userProvidedOptions: meta?.claudeCode?.options,\n sessionId: meta?.sessionId,\n additionalDirectories: meta?.claudeCode?.options?.additionalDirectories,\n });\n\n session.taskRunId = meta?.taskRunId;\n if (meta?.sessionId) {\n session.sessionId = meta.sessionId;\n }\n\n this.registerPersistence(\n internalSessionId,\n meta as Record<string, unknown>,\n );\n this.sendAvailableCommandsUpdate(\n internalSessionId,\n await getAvailableSlashCommands(q),\n );\n\n return {\n configOptions: await this.buildConfigOptions(),\n };\n }\n\n async prompt(params: PromptRequest): Promise<PromptResponse> {\n this.session.cancelled = false;\n this.session.interruptReason = undefined;\n\n await this.broadcastUserMessage(params);\n this.session.input.push(promptToClaude(params));\n\n return this.processMessages(params.sessionId);\n }\n\n async setSessionConfigOption(\n params: SetSessionConfigOptionRequest,\n ): Promise<SetSessionConfigOptionResponse> {\n const configId = params.configId;\n const value = params.value;\n\n if (configId === \"mode\") {\n const modeId = value as TwigExecutionMode;\n if (!TWIG_EXECUTION_MODES.includes(modeId)) {\n throw new Error(\"Invalid Mode\");\n }\n this.session.permissionMode = modeId;\n await this.session.query.setPermissionMode(modeId);\n } else if (configId === \"model\") {\n await this.setModelWithFallback(this.session.query, value);\n this.session.modelId = value;\n } else {\n throw new Error(\"Unsupported config option\");\n }\n\n await this.emitConfigOptionsUpdate();\n return { configOptions: await this.buildConfigOptions() };\n }\n\n protected async interruptSession(): Promise<void> {\n await this.session.query.interrupt();\n }\n\n async extMethod(\n method: string,\n params: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n if (method === \"_posthog/session/resume\") {\n const result = await this.resumeSession(\n params as unknown as LoadSessionRequest,\n );\n return {\n _meta: {\n configOptions: result.configOptions,\n },\n };\n }\n\n throw RequestError.methodNotFound(method);\n }\n\n private createSession(\n sessionId: string,\n q: Query,\n input: Pushable<SDKUserMessage>,\n permissionMode: TwigExecutionMode,\n cwd: string,\n abortController: AbortController,\n ): Session {\n const session: Session = {\n query: q,\n input,\n cancelled: false,\n permissionMode,\n cwd,\n notificationHistory: [],\n abortController,\n };\n this.session = session;\n this.sessionId = sessionId;\n return session;\n }\n\n private async initializeQuery(config: {\n internalSessionId: string;\n cwd: string;\n permissionMode: TwigExecutionMode;\n mcpServers: ReturnType<typeof parseMcpServers>;\n userProvidedOptions?: Options;\n systemPrompt?: Options[\"systemPrompt\"];\n sessionId?: string;\n additionalDirectories?: string[];\n }): Promise<{\n query: Query;\n input: Pushable<SDKUserMessage>;\n session: Session;\n }> {\n const input = new Pushable<SDKUserMessage>();\n\n const options = buildSessionOptions({\n cwd: config.cwd,\n mcpServers: config.mcpServers,\n permissionMode: config.permissionMode,\n canUseTool: this.createCanUseTool(config.internalSessionId),\n logger: this.logger,\n systemPrompt: config.systemPrompt,\n userProvidedOptions: config.userProvidedOptions,\n sessionId: config.sessionId,\n additionalDirectories: config.additionalDirectories,\n onModeChange: this.createOnModeChange(config.internalSessionId),\n onProcessSpawned: this.processCallbacks?.onProcessSpawned,\n onProcessExited: this.processCallbacks?.onProcessExited,\n });\n\n const q = query({ prompt: input, options });\n const abortController = options.abortController as AbortController;\n\n const session = this.createSession(\n config.internalSessionId,\n q,\n input,\n config.permissionMode,\n config.cwd,\n abortController,\n );\n\n return { query: q, input, session };\n }\n\n private createCanUseTool(sessionId: string): CanUseTool {\n return async (toolName, toolInput, { suggestions, toolUseID }) =>\n canUseTool({\n session: this.session,\n toolName,\n toolInput: toolInput as Record<string, unknown>,\n toolUseID,\n suggestions,\n client: this.client,\n sessionId,\n fileContentCache: this.fileContentCache,\n logger: this.logger,\n emitConfigOptionsUpdate: () => this.emitConfigOptionsUpdate(sessionId),\n });\n }\n\n private createOnModeChange(sessionId: string) {\n return async (newMode: TwigExecutionMode) => {\n if (this.session) {\n this.session.permissionMode = newMode;\n }\n await this.emitConfigOptionsUpdate(sessionId);\n };\n }\n\n private async buildConfigOptions(modelOptionsOverride?: {\n currentModelId: string;\n options: SessionConfigSelectOption[];\n }): Promise<SessionConfigOption[]> {\n const options: SessionConfigOption[] = [];\n\n const modeOptions = getAvailableModes().map((mode) => ({\n value: mode.id,\n name: mode.name,\n description: mode.description ?? undefined,\n }));\n\n options.push({\n id: \"mode\",\n name: \"Approval Preset\",\n type: \"select\",\n currentValue: this.session.permissionMode,\n options: modeOptions,\n category: \"mode\" as SessionConfigOptionCategory,\n description: \"Choose an approval and sandboxing preset for your session\",\n });\n\n const modelOptions =\n modelOptionsOverride ??\n (await this.getModelConfigOptions(this.session.modelId));\n this.session.modelId = modelOptions.currentModelId;\n\n options.push({\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 return options;\n }\n\n private async emitConfigOptionsUpdate(sessionId?: string): Promise<void> {\n const configOptions = await this.buildConfigOptions();\n const serialized = JSON.stringify(configOptions);\n if (\n this.lastSentConfigOptions &&\n JSON.stringify(this.lastSentConfigOptions) === serialized\n ) {\n return;\n }\n\n this.lastSentConfigOptions = configOptions;\n await this.client.sessionUpdate({\n sessionId: sessionId ?? this.sessionId,\n update: {\n sessionUpdate: \"config_option_update\",\n configOptions,\n },\n });\n }\n\n private checkAuthStatus() {\n const backupExists = fs.existsSync(\n path.resolve(os.homedir(), \".claude.json.backup\"),\n );\n const configExists = fs.existsSync(\n path.resolve(os.homedir(), \".claude.json\"),\n );\n if (backupExists && !configExists) {\n throw RequestError.authRequired();\n }\n }\n\n private async trySetModel(q: Query, modelId: string) {\n try {\n await this.setModelWithFallback(q, modelId);\n } catch (err) {\n this.logger.warn(\"Failed to set model\", { modelId, error: err });\n }\n }\n\n private async setModelWithFallback(q: Query, modelId: string): Promise<void> {\n try {\n await q.setModel(modelId);\n return;\n } catch (err) {\n const fallback = toSdkModelId(modelId);\n if (fallback === modelId) {\n throw err;\n }\n await q.setModel(fallback);\n }\n }\n\n private registerPersistence(\n sessionId: string,\n meta: Record<string, unknown> | undefined,\n ) {\n const persistence = meta?.persistence as SessionContext | undefined;\n if (persistence && this.logWriter) {\n this.logWriter.register(sessionId, persistence);\n }\n }\n\n private sendAvailableCommandsUpdate(\n sessionId: string,\n availableCommands: AvailableCommand[],\n ) {\n setTimeout(() => {\n this.client.sessionUpdate({\n sessionId,\n update: {\n sessionUpdate: \"available_commands_update\",\n availableCommands,\n },\n });\n }, 0);\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 private async processMessages(sessionId: string): Promise<PromptResponse> {\n const context = {\n session: this.session,\n sessionId,\n client: this.client,\n toolUseCache: this.toolUseCache,\n fileContentCache: this.fileContentCache,\n logger: this.logger,\n };\n\n while (true) {\n const { value: message, done } = await this.session.query.next();\n\n if (done || !message) {\n return this.handleSessionEnd();\n }\n\n const response = await this.handleMessage(message, context);\n if (response) {\n return response;\n }\n }\n }\n\n private handleSessionEnd(): PromptResponse {\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 throw new Error(\"Session did not end in result\");\n }\n\n private async handleMessage(\n message: SDKMessage,\n context: Parameters<typeof handleSystemMessage>[1],\n ): Promise<PromptResponse | null> {\n switch (message.type) {\n case \"system\":\n await handleSystemMessage(message, context);\n return null;\n\n case \"result\": {\n const result = handleResultMessage(message, context);\n if (result.error) throw result.error;\n if (result.shouldStop) {\n return {\n stopReason: result.stopReason as \"end_turn\" | \"max_turn_requests\",\n };\n }\n return null;\n }\n\n case \"stream_event\":\n await handleStreamEvent(message, context);\n return null;\n\n case \"user\":\n case \"assistant\": {\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 return null;\n }\n\n case \"tool_progress\":\n case \"auth_status\":\n return null;\n\n default:\n unreachable(message, this.logger);\n return null;\n }\n }\n}\n","{\n \"name\": \"@posthog/agent\",\n \"version\": \"2.0.3\",\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 \"./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\": \"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 },\n \"engines\": {\n \"node\": \">=20.0.0\"\n },\n \"devDependencies\": {\n \"@changesets/cli\": \"^2.27.8\",\n \"@types/bun\": \"latest\",\n \"@types/tar\": \"^6.1.13\",\n \"minimatch\": \"^10.0.3\",\n \"@posthog/shared\": \"workspace:*\",\n \"@twig/git\": \"workspace:*\",\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 \"@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 \"@agentclientprotocol/sdk\": \"^0.14.0\",\n \"@anthropic-ai/claude-agent-sdk\": \"0.2.12\",\n \"@anthropic-ai/sdk\": \"^0.71.0\",\n \"@hono/node-server\": \"^1.19.9\",\n \"@modelcontextprotocol/sdk\": \"^1.25.3\",\n \"@types/jsonwebtoken\": \"^9.0.10\",\n \"commander\": \"^14.0.2\",\n \"diff\": \"^8.0.2\",\n \"dotenv\": \"^17.2.3\",\n \"hono\": \"^4.11.7\",\n \"jsonwebtoken\": \"^9.0.2\",\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\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 = 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\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 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 ?? [];\n return models.filter((m) => !BLOCKED_MODELS.has(m.id));\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 async function fetchArrayModelIds(\n options?: FetchGatewayModelsOptions,\n): Promise<string[]> {\n const models = await fetchArrayModels(options);\n return models.map((model) => model.id);\n}\n\nexport interface ArrayModelInfo {\n id: string;\n owned_by?: string;\n}\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 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 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\";\n\nexport interface BaseSession {\n notificationHistory: SessionNotification[];\n cancelled: boolean;\n interruptReason?: string;\n abortController: AbortController;\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 interruptSession(): Promise<void>;\n\n async cancel(params: CancelNotification): Promise<void> {\n if (this.sessionId !== params.sessionId) {\n throw new Error(\"Session not found\");\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.interruptSession();\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.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 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} from \"@agentclientprotocol/sdk\";\nimport { RequestError } from \"@agentclientprotocol/sdk\";\nimport type {\n SDKPartialAssistantMessage,\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 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};\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}\n\nfunction messageUpdateType(role: Role) {\n return role === \"assistant\" ? \"agent_message_chunk\" : \"user_message_chunk\";\n}\n\nfunction toolMeta(toolName: string, toolResponse?: unknown): ToolUpdateMeta {\n return toolResponse\n ? { claudeCode: { toolName, toolResponse } }\n : { claudeCode: { toolName } };\n}\n\nfunction handleTextChunk(\n chunk: { text: string },\n role: Role,\n): SessionNotification[\"update\"] {\n return {\n sessionUpdate: messageUpdateType(role),\n content: text(chunk.text),\n };\n}\n\nfunction handleImageChunk(\n chunk: {\n source: { type: string; data?: string; media_type?: string; url?: string };\n },\n role: Role,\n): SessionNotification[\"update\"] {\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(chunk: {\n thinking: string;\n}): SessionNotification[\"update\"] {\n return {\n sessionUpdate: \"agent_thought_chunk\",\n content: text(chunk.thinking),\n };\n}\n\nfunction handleToolUseChunk(\n chunk: ToolUseCache[string],\n ctx: ChunkHandlerContext,\n): SessionNotification[\"update\"] | null {\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 registerHookCallback(chunk.id, {\n onPostToolUseHook: async (toolUseId, _toolInput, toolResponse) => {\n const toolUse = ctx.toolUseCache[toolUseId];\n if (toolUse) {\n await ctx.client.sessionUpdate({\n sessionId: ctx.sessionId,\n update: {\n _meta: toolMeta(toolUse.name, toolResponse),\n toolCallId: toolUseId,\n sessionUpdate: \"tool_call_update\",\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 let rawInput: Record<string, unknown> | undefined;\n try {\n rawInput = JSON.parse(JSON.stringify(chunk.input));\n } catch {\n // ignore\n }\n\n return {\n _meta: toolMeta(chunk.name),\n toolCallId: chunk.id,\n sessionUpdate: \"tool_call\",\n rawInput,\n status: \"pending\",\n ...toolInfoFromToolUse(chunk, ctx.fileContentCache, ctx.logger),\n };\n}\n\nfunction handleToolResultChunk(\n chunk: AnthropicContentChunk & { tool_use_id: string; is_error?: boolean },\n ctx: ChunkHandlerContext,\n): SessionNotification[\"update\"] | null {\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 null;\n }\n\n if (toolUse.name === \"TodoWrite\") {\n return null;\n }\n\n return {\n _meta: toolMeta(toolUse.name),\n toolCallId: chunk.tool_use_id,\n sessionUpdate: \"tool_call_update\",\n status: chunk.is_error ? \"failed\" : \"completed\",\n ...toolUpdateFromToolResult(\n chunk as Parameters<typeof toolUpdateFromToolResult>[0],\n toolUse,\n ),\n };\n}\n\nfunction processContentChunk(\n chunk: AnthropicContentChunk,\n role: Role,\n ctx: ChunkHandlerContext,\n): SessionNotification[\"update\"] | null {\n switch (chunk.type) {\n case \"text\":\n case \"text_delta\":\n return handleTextChunk(chunk, role);\n\n case \"image\":\n return handleImageChunk(chunk, role);\n\n case \"thinking\":\n case \"thinking_delta\":\n return handleThinkingChunk(chunk);\n\n case \"tool_use\":\n case \"server_tool_use\":\n case \"mcp_tool_use\":\n return handleToolUseChunk(chunk as ToolUseCache[string], ctx);\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 },\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 return null;\n\n default:\n unreachable(chunk, ctx.logger);\n return null;\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): SessionNotification[] {\n if (typeof content === \"string\") {\n return [\n {\n sessionId,\n update: {\n sessionUpdate: messageUpdateType(role),\n content: text(content),\n },\n },\n ];\n }\n\n const ctx: ChunkHandlerContext = {\n sessionId,\n toolUseCache,\n fileContentCache,\n client,\n logger,\n };\n const output: SessionNotification[] = [];\n\n for (const chunk of content) {\n const update = processContentChunk(chunk, role, ctx);\n if (update) {\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): 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 );\n case \"content_block_delta\":\n return toAcpNotifications(\n [event.delta],\n \"assistant\",\n sessionId,\n toolUseCache,\n fileContentCache,\n client,\n logger,\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, logger);\n return [];\n }\n}\n\nexport async function handleSystemMessage(\n message: any,\n context: MessageHandlerContext,\n): Promise<void> {\n const { session, sessionId, client, logger } = context;\n\n switch (message.subtype) {\n case \"init\":\n if (message.session_id && session && !session.sessionId) {\n session.sessionId = message.session_id;\n if (session.taskRunId) {\n await client.extNotification(\"_posthog/sdk_session\", {\n taskRunId: session.taskRunId,\n sessionId: message.session_id,\n adapter: \"claude\",\n });\n }\n }\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 function handleResultMessage(\n message: any,\n context: MessageHandlerContext,\n): { shouldStop: boolean; stopReason?: string; error?: Error } {\n const { session } = context;\n\n if (session.cancelled) {\n return {\n shouldStop: true,\n stopReason: \"cancelled\",\n };\n }\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 };\n }\n if (message.is_error) {\n return {\n shouldStop: true,\n error: RequestError.internalError(undefined, message.result),\n };\n }\n return { shouldStop: true, stopReason: \"end_turn\" };\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 };\n }\n return { shouldStop: true, stopReason: \"end_turn\" };\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 };\n }\n return { shouldStop: true, stopReason: \"max_turn_requests\" };\n default:\n return { shouldStop: false };\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\n for (const notification of streamEventToAcpNotifications(\n message,\n sessionId,\n toolUseCache,\n fileContentCache,\n client,\n logger,\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 isSimpleUserMessage(message: AnthropicMessageWithContent): boolean {\n return (\n message.type === \"user\" &&\n (typeof message.message.content === \"string\" ||\n (Array.isArray(message.message.content) &&\n message.message.content.length === 1 &&\n message.message.content[0].type === \"text\"))\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 shouldSkipUserAssistantMessage(\n message: AnthropicMessageWithContent,\n): boolean {\n return (\n hasLocalCommandStdout(message.message.content) ||\n hasLocalCommandStderr(message.message.content) ||\n isSimpleUserMessage(message) ||\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 | { type: \"assistant\"; message: any },\n context: MessageHandlerContext,\n): Promise<{ shouldStop?: boolean; error?: Error }> {\n const { session, sessionId, client, toolUseCache, fileContentCache, logger } =\n context;\n\n if (session.cancelled) {\n return {};\n }\n\n if (shouldSkipUserAssistantMessage(message)) {\n logSpecialMessages(message, logger);\n\n if (isLoginRequiredMessage(message)) {\n return { shouldStop: true, error: RequestError.authRequired() };\n }\n return {};\n }\n\n const content = message.message.content;\n const contentToProcess = filterMessageContent(content);\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 )) {\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 { 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}\n\nexport const createPostToolUseHook =\n ({ onModeChange }: 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 }\n }\n }\n return { continue: true };\n };\n","import type {\n PlanEntry,\n ToolCall,\n ToolCallContent,\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 { Logger } from \"../../../utils/logger.js\";\n\ninterface EditOperation {\n oldText: string;\n newText: string;\n replaceAll?: boolean;\n}\n\ninterface EditResult {\n newContent: string;\n lineNumbers: number[];\n}\n\nfunction replaceAndCalculateLocation(\n fileContent: string,\n edits: EditOperation[],\n): EditResult {\n let currentContent = fileContent;\n\n const randomHex = Array.from(crypto.getRandomValues(new Uint8Array(5)))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n const markerPrefix = `__REPLACE_MARKER_${randomHex}_`;\n let markerCounter = 0;\n const markers: string[] = [];\n\n for (const edit of edits) {\n if (edit.oldText === \"\") {\n throw new Error(\n `The provided \\`old_string\\` is empty.\\n\\nNo edits were applied.`,\n );\n }\n\n if (edit.replaceAll) {\n const parts: string[] = [];\n let lastIndex = 0;\n let searchIndex = 0;\n\n while (true) {\n const index = currentContent.indexOf(edit.oldText, searchIndex);\n if (index === -1) {\n if (searchIndex === 0) {\n throw new Error(\n `The provided \\`old_string\\` does not appear in the file: \"${edit.oldText}\".\\n\\nNo edits were applied.`,\n );\n }\n break;\n }\n\n parts.push(currentContent.substring(lastIndex, index));\n\n const marker = `${markerPrefix}${markerCounter++}__`;\n markers.push(marker);\n parts.push(marker + edit.newText);\n\n lastIndex = index + edit.oldText.length;\n searchIndex = lastIndex;\n }\n\n parts.push(currentContent.substring(lastIndex));\n currentContent = parts.join(\"\");\n } else {\n const index = currentContent.indexOf(edit.oldText);\n if (index === -1) {\n throw new Error(\n `The provided \\`old_string\\` does not appear in the file: \"${edit.oldText}\".\\n\\nNo edits were applied.`,\n );\n } else {\n const marker = `${markerPrefix}${markerCounter++}__`;\n markers.push(marker);\n currentContent =\n currentContent.substring(0, index) +\n marker +\n edit.newText +\n currentContent.substring(index + edit.oldText.length);\n }\n }\n }\n\n const lineNumbers: number[] = [];\n for (const marker of markers) {\n const index = currentContent.indexOf(marker);\n if (index !== -1) {\n const lineNumber = Math.max(\n 0,\n currentContent.substring(0, index).split(/\\r\\n|\\r|\\n/).length - 1,\n );\n lineNumbers.push(lineNumber);\n }\n }\n\n let finalContent = currentContent;\n for (const marker of markers) {\n finalContent = finalContent.replace(marker, \"\");\n }\n\n const uniqueLineNumbers = [...new Set(lineNumbers)].sort();\n\n return { newContent: finalContent, lineNumbers: uniqueLineNumbers };\n}\n\ntype ToolInfo = Pick<ToolCall, \"title\" | \"kind\" | \"content\" | \"locations\">;\n\nexport function toolInfoFromToolUse(\n toolUse: Pick<ToolUseBlock, \"name\" | \"input\">,\n cachedFileContent: { [key: string]: string },\n logger: Logger = new Logger({ debug: false, prefix: \"[ClaudeTools]\" }),\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 return {\n title: input?.description ? String(input.description) : \"Task\",\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 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) ?? 0;\n if (inputLimit) {\n limit = ` (${inputOffset + 1} - ${inputOffset + inputLimit})`;\n } else if (inputOffset) {\n limit = ` (from line ${inputOffset + 1})`;\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 = input?.old_string ? String(input.old_string) : null;\n let newText = input?.new_string ? String(input.new_string) : \"\";\n let affectedLines: number[] = [];\n\n if (path && oldText) {\n try {\n const oldContent = cachedFileContent[path] || \"\";\n const newContent = replaceAndCalculateLocation(oldContent, [\n {\n oldText,\n newText,\n replaceAll: false,\n },\n ]);\n oldText = oldContent;\n newText = newContent.newContent;\n affectedLines = newContent.lineNumbers;\n } catch (e) {\n logger.error(\"Failed to edit file\", e);\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\n ? affectedLines.length > 0\n ? affectedLines.map((line) => ({ line, path }))\n : [{ path }]\n : [],\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 contentResult = toolContent()\n .diff(filePath, null, 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 \"FilesWithMatches\":\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 label += ` \"${input?.pattern ? String(input.pattern) : \"\"}\"`;\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 return {\n title: name || \"Unknown Tool\",\n kind: \"other\",\n content: [],\n };\n }\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): Pick<ToolCallUpdate, \"title\" | \"content\" | \"locations\"> {\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 { type?: string; text?: string };\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 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 return toAcpContentUpdate(\n toolResult.content,\n \"is_error\" in toolResult ? toolResult.is_error : false,\n );\n }\n case \"Edit\":\n case \"Write\": {\n if (\n \"is_error\" in toolResult &&\n toolResult.is_error &&\n toolResult.content &&\n toolResult.content.length > 0\n ) {\n return toAcpContentUpdate(toolResult.content, true);\n }\n return {};\n }\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 default: {\n return toAcpContentUpdate(\n toolResult.content,\n \"is_error\" in toolResult ? toolResult.is_error : false,\n );\n }\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 return {\n content: content.map((item) => {\n const itemObj = item as { type?: string; text?: string };\n if (isError && itemObj.type === \"text\") {\n return {\n type: \"content\" as const,\n content: text(`\\`\\`\\`\\n${itemObj.text ?? \"\"}\\n\\`\\`\\``),\n };\n }\n return {\n type: \"content\" as const,\n content: item as { type: \"text\"; text: string },\n };\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 }\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 type { McpServerConfig } from \"@anthropic-ai/claude-agent-sdk\";\nimport { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { StreamableHTTPClientTransport } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport type { Tool } from \"@modelcontextprotocol/sdk/types.js\";\nimport { Logger } from \"../../../utils/logger.js\";\n\nexport interface McpToolMetadata {\n readOnly: boolean;\n}\n\nconst mcpToolMetadataCache: Map<string, McpToolMetadata> = new Map();\n\nfunction buildToolKey(serverName: string, toolName: string): string {\n return `mcp__${serverName}__${toolName}`;\n}\n\nfunction isHttpMcpServer(\n config: McpServerConfig,\n): config is McpServerConfig & { type: \"http\"; url: string } {\n return config.type === \"http\" && typeof (config as any).url === \"string\";\n}\n\nasync function fetchToolsFromHttpServer(\n _serverName: string,\n config: McpServerConfig & { type: \"http\"; url: string },\n): Promise<Tool[]> {\n const transport = new StreamableHTTPClientTransport(new URL(config.url), {\n requestInit: {\n headers: (config as any).headers || {},\n },\n });\n\n const client = new Client({\n name: \"twig-metadata-fetcher\",\n version: \"1.0.0\",\n });\n\n try {\n await client.connect(transport);\n const result = await client.listTools();\n return result.tools;\n } finally {\n await client.close().catch(() => {});\n }\n}\n\nfunction extractToolMetadata(tool: Tool): McpToolMetadata {\n return {\n readOnly: tool.annotations?.readOnlyHint === true,\n };\n}\n\nexport async function fetchMcpToolMetadata(\n mcpServers: Record<string, McpServerConfig>,\n logger: Logger = new Logger({ debug: false, prefix: \"[McpToolMetadata]\" }),\n): Promise<void> {\n const fetchPromises: Promise<void>[] = [];\n\n for (const [serverName, config] of Object.entries(mcpServers)) {\n if (!isHttpMcpServer(config)) {\n continue;\n }\n\n const fetchPromise = fetchToolsFromHttpServer(serverName, config)\n .then((tools) => {\n const toolCount = tools.length;\n const readOnlyCount = tools.filter(\n (t) => t.annotations?.readOnlyHint === true,\n ).length;\n\n for (const tool of tools) {\n const toolKey = buildToolKey(serverName, tool.name);\n mcpToolMetadataCache.set(toolKey, extractToolMetadata(tool));\n }\n\n logger.info(\"Fetched MCP tool metadata\", {\n serverName,\n toolCount,\n readOnlyCount,\n });\n })\n .catch((error) => {\n logger.error(\"Failed to fetch MCP tool metadata\", {\n serverName,\n error: error instanceof Error ? error.message : String(error),\n });\n });\n\n fetchPromises.push(fetchPromise);\n }\n\n await Promise.all(fetchPromises);\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 * 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\nconst MODES: ModeInfo[] = [\n {\n id: \"default\",\n name: \"Always Ask\",\n description: \"Prompts for permission on first use of each tool\",\n },\n {\n id: \"acceptEdits\",\n name: \"Accept Edits\",\n description: \"Automatically accepts file edit permissions for the session\",\n },\n {\n id: \"plan\",\n name: \"Plan Mode\",\n description: \"Claude can analyze but not modify files or execute commands\",\n },\n {\n id: \"bypassPermissions\",\n name: \"Bypass Permissions\",\n description: \"Skips all permission prompts\",\n },\n];\n\nexport const TWIG_EXECUTION_MODES = [\n \"default\",\n \"acceptEdits\",\n \"plan\",\n \"bypassPermissions\",\n] as const;\n\nexport type TwigExecutionMode = (typeof TWIG_EXECUTION_MODES)[number];\n\nexport function getAvailableModes(): ModeInfo[] {\n return IS_ROOT ? MODES.filter((m) => m.id !== \"bypassPermissions\") : MODES;\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\"]);\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};\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 { 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): PermissionOption[] {\n if (BASH_TOOLS.has(toolName)) {\n const command = toolInput?.command as string | undefined;\n const cmdName = command?.split(/\\s+/)[0] ?? \"this command\";\n const cwdLabel = cwd ? ` in ${cwd}` : \"\";\n return permissionOptions(\n `Yes, and don't ask again for \\`${cmdName}\\` commands${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 client: AgentSideConnection;\n sessionId: string;\n fileContentCache: { [key: string]: string };\n logger: Logger;\n emitConfigOptionsUpdate: () => 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, fileContentCache } = context;\n\n const toolInfo = toolInfoFromToolUse(\n { name: context.toolName, input: updatedInput },\n fileContentCache,\n context.logger,\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.emitConfigOptionsUpdate();\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, logger } = context;\n\n session.permissionMode = \"plan\";\n await session.query.setPermissionMode(\"plan\");\n await context.emitConfigOptionsUpdate();\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 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, fileContentCache } = context;\n const firstQuestion = questions[0];\n const options = buildQuestionOptions(firstQuestion);\n\n const toolInfo = toolInfoFromToolUse(\n { name: context.toolName, input: toolInput },\n fileContentCache,\n context.logger,\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 (response.outcome?.outcome !== \"selected\") {\n return {\n behavior: \"deny\",\n message: \"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 fileContentCache,\n suggestions,\n } = context;\n\n const toolInfo = toolInfoFromToolUse(\n { name: toolName, input: toolInput },\n fileContentCache,\n context.logger,\n );\n\n const options = buildPermissionOptions(\n toolName,\n toolInput as Record<string, unknown>,\n session?.cwd,\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 (\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 return handleDefaultPermissionFlow(context);\n}\n","import type { AvailableCommand } from \"@agentclientprotocol/sdk\";\nimport type { Query } from \"@anthropic-ai/claude-agent-sdk\";\n\nconst UNSUPPORTED_COMMANDS = [\n \"context\",\n \"cost\",\n \"login\",\n \"logout\",\n \"output-style:new\",\n \"release-notes\",\n \"todos\",\n];\n\nexport async function getAvailableSlashCommands(\n q: Query,\n): Promise<AvailableCommand[]> {\n const commands = await q.supportedCommands();\n\n return commands\n .map((command) => {\n const input = command.argumentHint\n ? { hint: command.argumentHint }\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 {\n LoadSessionRequest,\n NewSessionRequest,\n} from \"@agentclientprotocol/sdk\";\nimport type { McpServerConfig } from \"@anthropic-ai/claude-agent-sdk\";\n\nexport function parseMcpServers(\n params: NewSessionRequest | LoadSessionRequest,\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-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 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 { createPostToolUseHook, type OnModeChange } from \"../hooks.js\";\nimport type { TwigExecutionMode } from \"../tools.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: Options[\"canUseTool\"];\n logger: Logger;\n systemPrompt?: Options[\"systemPrompt\"];\n userProvidedOptions?: Options;\n sessionId?: string;\n additionalDirectories?: string[];\n onModeChange?: OnModeChange;\n onProcessSpawned?: (info: ProcessSpawnedInfo) => void;\n onProcessExited?: (pid: number) => void;\n}\n\nconst BRANCH_NAMING_INSTRUCTIONS = `\n# Branch Naming\n\nBefore pushing a \"workspace-*\" branch to origin, rename it to something descriptive based on the work done. 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 };\n}\n\nfunction buildHooks(\n userHooks: Options[\"hooks\"],\n onModeChange?: OnModeChange,\n): Options[\"hooks\"] {\n return {\n ...userHooks,\n PostToolUse: [\n ...(userHooks?.PostToolUse || []),\n {\n hooks: [createPostToolUseHook({ onModeChange })],\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): (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 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 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 on(event: \"exit\" | \"error\", listener: (...args: any[]) => void) {\n child.on(event, listener);\n },\n once(event: \"exit\" | \"error\", listener: (...args: any[]) => void) {\n child.once(event, listener);\n },\n off(event: \"exit\" | \"error\", listener: (...args: any[]) => void) {\n child.off(event, listener);\n },\n };\n };\n}\n\nexport function buildSessionOptions(params: BuildOptionsParams): Options {\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 mcpServers: buildMcpServers(\n params.userProvidedOptions?.mcpServers,\n params.mcpServers,\n ),\n env: buildEnvironment(),\n hooks: buildHooks(params.userProvidedOptions?.hooks, params.onModeChange),\n abortController: getAbortController(\n params.userProvidedOptions?.abortController,\n ),\n ...(params.onProcessSpawned && {\n spawnClaudeCodeProcess: buildSpawnWrapper(\n params.sessionId ?? \"unknown\",\n params.onProcessSpawned,\n params.onProcessExited,\n ),\n }),\n };\n\n if (process.env.CLAUDE_CODE_EXECUTABLE) {\n options.pathToClaudeCodeExecutable = process.env.CLAUDE_CODE_EXECUTABLE;\n }\n\n if (params.sessionId) {\n options.resume = params.sessionId;\n }\n\n if (params.additionalDirectories) {\n options.additionalDirectories = params.additionalDirectories;\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 try {\n if (fs.existsSync(statsigPath)) {\n fs.rmSync(statsigPath, { recursive: true, force: true });\n }\n } catch {\n // Ignore errors - cache clearing is best-effort\n }\n}\n","import { type ChildProcess, spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\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 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 // Prevent Electron's GPU/Chromium processes from interfering with child\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 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.debug(\"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 function getLlmGatewayUrl(posthogHost: string): 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/twig`;\n }\n\n // Docker containers accessing host\n if (hostname === \"host.docker.internal\") {\n return `${url.protocol}//host.docker.internal:3308/twig`;\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/twig`;\n}\n","import 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\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 };\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 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 { SeverityNumber } from \"@opentelemetry/api-logs\";\nimport { OTLPLogExporter } from \"@opentelemetry/exporter-logs-otlp-http\";\nimport { resourceFromAttributes } from \"@opentelemetry/resources\";\nimport {\n BatchLogRecordProcessor,\n LoggerProvider,\n} from \"@opentelemetry/sdk-logs\";\nimport { ATTR_SERVICE_NAME } from \"@opentelemetry/semantic-conventions\";\nimport type { StoredNotification } from \"./types.js\";\nimport type { Logger } from \"./utils/logger.js\";\n\nexport interface OtelLogConfig {\n /** PostHog ingest host, e.g., \"https://us.i.posthog.com\" */\n posthogHost: string;\n /** Project API key, e.g., \"phc_xxx\" */\n apiKey: string;\n /** Batch flush interval in ms (default: 500) */\n flushIntervalMs?: number;\n /** Override the logs endpoint path (default: /i/v1/agent-logs) */\n logsPath?: string;\n}\n\n/**\n * Session context for resource attributes.\n * These are set once per OTEL logger instance and indexed via resource_fingerprint\n */\nexport interface SessionContext {\n /** Parent task grouping - all runs for a task share this */\n taskId: string;\n /** Primary conversation identifier - all events in a run share this */\n runId: string;\n /** Deployment environment - \"local\" for desktop, \"cloud\" for cloud sandbox */\n deviceType?: \"local\" | \"cloud\";\n}\n\nexport class OtelLogWriter {\n private loggerProvider: LoggerProvider;\n private logger: ReturnType<LoggerProvider[\"getLogger\"]>;\n\n constructor(\n config: OtelLogConfig,\n sessionContext: SessionContext,\n _debugLogger?: Logger,\n ) {\n const logsPath = config.logsPath ?? \"/i/v1/agent-logs\";\n const exporter = new OTLPLogExporter({\n url: `${config.posthogHost}${logsPath}`,\n headers: { Authorization: `Bearer ${config.apiKey}` },\n });\n\n const processor = new BatchLogRecordProcessor(exporter, {\n scheduledDelayMillis: config.flushIntervalMs ?? 500,\n });\n\n // Resource attributes are set ONCE per session and indexed via resource_fingerprint\n // So we have fast queries by run_id/task_id in PostHog Logs UI\n this.loggerProvider = new LoggerProvider({\n resource: resourceFromAttributes({\n [ATTR_SERVICE_NAME]: \"twig-agent\",\n run_id: sessionContext.runId,\n task_id: sessionContext.taskId,\n device_type: sessionContext.deviceType ?? \"local\",\n }),\n processors: [processor],\n });\n\n this.logger = this.loggerProvider.getLogger(\"agent-session\");\n }\n\n /**\n * Emit an agent event to PostHog Logs via OTEL.\n */\n emit(entry: { notification: StoredNotification }): void {\n const { notification } = entry;\n const eventType = notification.notification.method;\n\n this.logger.emit({\n severityNumber: SeverityNumber.INFO,\n severityText: \"INFO\",\n body: JSON.stringify(notification),\n attributes: {\n event_type: eventType,\n },\n });\n }\n\n async flush(): Promise<void> {\n await this.loggerProvider.forceFlush();\n }\n\n async shutdown(): Promise<void> {\n await this.loggerProvider.shutdown();\n }\n}\n","import {\n type OtelLogConfig,\n OtelLogWriter,\n type SessionContext,\n} 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 /** OTEL config for creating writers per session */\n otelConfig?: OtelLogConfig;\n /** PostHog API client for S3 log persistence */\n posthogAPI?: PostHogAPIClient;\n /** Logger instance */\n logger?: Logger;\n}\n\ninterface ChunkBuffer {\n text: string;\n firstTimestamp: string;\n}\n\ninterface SessionState {\n context: SessionContext;\n otelWriter?: OtelLogWriter;\n chunkBuffer?: ChunkBuffer;\n}\n\nexport class SessionLogWriter {\n private posthogAPI?: PostHogAPIClient;\n private otelConfig?: OtelLogConfig;\n private pendingEntries: Map<string, StoredNotification[]> = new Map();\n private flushTimeouts: Map<string, NodeJS.Timeout> = new Map();\n private sessions: Map<string, SessionState> = new Map();\n private logger: Logger;\n\n constructor(options: SessionLogWriterOptions = {}) {\n this.posthogAPI = options.posthogAPI;\n this.otelConfig = options.otelConfig;\n this.logger =\n options.logger ??\n new Logger({ debug: false, prefix: \"[SessionLogWriter]\" });\n }\n\n async flushAll(): Promise<void> {\n const flushPromises: Promise<void>[] = [];\n for (const sessionId of this.sessions.keys()) {\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 let otelWriter: OtelLogWriter | undefined;\n if (this.otelConfig) {\n // Create a dedicated OtelLogWriter for this session with resource attributes\n otelWriter = new OtelLogWriter(\n this.otelConfig,\n context,\n this.logger.child(`OtelWriter:${sessionId}`),\n );\n }\n\n this.sessions.set(sessionId, { context, otelWriter });\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 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 entry: StoredNotification = {\n type: \"notification\",\n timestamp,\n notification: message,\n };\n\n if (session.otelWriter) {\n session.otelWriter.emit({ notification: entry });\n }\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 sessionId,\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) return;\n\n // Emit any buffered chunks before flushing\n this.emitCoalescedMessage(sessionId, session);\n\n if (session.otelWriter) {\n await session.otelWriter.flush();\n }\n\n const pending = this.pendingEntries.get(sessionId);\n if (!this.posthogAPI || !pending?.length) return;\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 try {\n await this.posthogAPI.appendTaskRunLog(\n session.context.taskId,\n session.context.runId,\n pending,\n );\n } catch (error) {\n this.logger.error(\"Failed to persist session logs:\", error);\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\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 if (session.otelWriter) {\n session.otelWriter.emit({ notification: entry });\n }\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 private scheduleFlush(sessionId: string): void {\n const existing = this.flushTimeouts.get(sessionId);\n if (existing) clearTimeout(existing);\n const timeout = setTimeout(() => this.flush(sessionId), 500);\n this.flushTimeouts.set(sessionId, timeout);\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 } 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 public debug: boolean;\n\n constructor(config: AgentConfig) {\n this.debug = config.debug || false;\n this.logger = new Logger({\n debug: this.debug,\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.otelTransport) {\n // OTEL pipeline: use OtelLogWriter only (no S3 writer)\n this.sessionLogWriter = new SessionLogWriter({\n otelConfig: {\n posthogHost: config.otelTransport.host,\n apiKey: config.otelTransport.apiKey,\n logsPath: config.otelTransport.logsPath,\n },\n logger: this.logger.child(\"SessionLogWriter\"),\n });\n } else if (config.posthog) {\n // Legacy: use S3 writer via PostHog API\n this.sessionLogWriter = new SessionLogWriter({\n posthogAPI: this.posthogAPI,\n logger: this.logger.child(\"SessionLogWriter\"),\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\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: any = {\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 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","text","path","path","input","text","os","path","RequestError","spawn","existsSync","existsSync","spawn","filteredOptions","currentAllowed","nextCurrent","sessionId","text","writer","taskRunId","text"]}
|