@posthog/agent 2.0.1 → 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 +62 -5
- package/dist/agent.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +6223 -94
- package/dist/index.js.map +1 -1
- package/dist/server/agent-server.js +6206 -97
- package/dist/server/agent-server.js.map +1 -1
- package/dist/server/bin.cjs +10599 -0
- package/dist/server/bin.cjs.map +1 -0
- package/package.json +6 -6
- 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 +0 -4507
- package/dist/server/bin.js.map +0 -1
package/dist/server/bin.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/server/bin.ts","../../src/server/agent-server.ts","../../src/acp-extensions.ts","../../src/adapters/acp-connection.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/tree-tracker.ts","../../src/sagas/apply-snapshot-saga.ts","../../src/sagas/capture-tree-saga.ts","../../src/utils/async-mutex.ts","../../src/server/jwt.ts","../../src/server/schemas.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from \"commander\";\nimport { z } from \"zod\";\nimport { AgentServer } from \"./agent-server.js\";\n\nconst envSchema = z.object({\n JWT_PUBLIC_KEY: z\n .string({\n required_error:\n \"JWT_PUBLIC_KEY is required for authenticating client connections\",\n })\n .min(1, \"JWT_PUBLIC_KEY cannot be empty\"),\n POSTHOG_API_URL: z\n .string({\n required_error:\n \"POSTHOG_API_URL is required for LLM gateway communication\",\n })\n .url(\"POSTHOG_API_URL must be a valid URL\"),\n POSTHOG_PERSONAL_API_KEY: z\n .string({\n required_error:\n \"POSTHOG_PERSONAL_API_KEY is required for authenticating with PostHog services\",\n })\n .min(1, \"POSTHOG_PERSONAL_API_KEY cannot be empty\"),\n POSTHOG_PROJECT_ID: z\n .string({\n required_error:\n \"POSTHOG_PROJECT_ID is required for routing requests to the correct project\",\n })\n .regex(/^\\d+$/, \"POSTHOG_PROJECT_ID must be a numeric string\")\n .transform((val) => parseInt(val, 10)),\n});\n\nconst program = new Command();\n\nprogram\n .name(\"agent-server\")\n .description(\"PostHog cloud agent server - runs in sandbox environments\")\n .option(\"--port <port>\", \"HTTP server port\", \"3001\")\n .option(\n \"--mode <mode>\",\n \"Execution mode: interactive or background\",\n \"interactive\",\n )\n .requiredOption(\"--repositoryPath <path>\", \"Path to the repository\")\n .requiredOption(\"--taskId <id>\", \"Task ID\")\n .requiredOption(\"--runId <id>\", \"Task run ID\")\n .action(async (options) => {\n const envResult = envSchema.safeParse(process.env);\n\n if (!envResult.success) {\n const errors = envResult.error.issues\n .map((issue) => ` - ${issue.message}`)\n .join(\"\\n\");\n program.error(`Environment validation failed:\\n${errors}`);\n return;\n }\n\n const env = envResult.data;\n\n const mode = options.mode === \"background\" ? \"background\" : \"interactive\";\n\n const server = new AgentServer({\n port: parseInt(options.port, 10),\n jwtPublicKey: env.JWT_PUBLIC_KEY,\n repositoryPath: options.repositoryPath,\n apiUrl: env.POSTHOG_API_URL,\n apiKey: env.POSTHOG_PERSONAL_API_KEY,\n projectId: env.POSTHOG_PROJECT_ID,\n mode,\n taskId: options.taskId,\n runId: options.runId,\n });\n\n process.on(\"SIGINT\", async () => {\n await server.stop();\n process.exit(0);\n });\n\n process.on(\"SIGTERM\", async () => {\n await server.stop();\n process.exit(0);\n });\n\n await server.start();\n });\n\nprogram.parse();\n","import {\n ClientSideConnection,\n ndJsonStream,\n PROTOCOL_VERSION,\n} from \"@agentclientprotocol/sdk\";\nimport { type ServerType, serve } from \"@hono/node-server\";\nimport { Hono } from \"hono\";\nimport { POSTHOG_NOTIFICATIONS } from \"../acp-extensions.js\";\nimport {\n createAcpConnection,\n type InProcessAcpConnection,\n} from \"../adapters/acp-connection.js\";\nimport { PostHogAPIClient } from \"../posthog-api.js\";\nimport { SessionLogWriter } from \"../session-log-writer.js\";\nimport { TreeTracker } from \"../tree-tracker.js\";\nimport type { AgentMode, DeviceInfo, TreeSnapshotEvent } from \"../types.js\";\nimport { AsyncMutex } from \"../utils/async-mutex.js\";\nimport { getLlmGatewayUrl } from \"../utils/gateway.js\";\nimport { Logger } from \"../utils/logger.js\";\nimport { type JwtPayload, JwtValidationError, validateJwt } from \"./jwt.js\";\nimport { jsonRpcRequestSchema, validateCommandParams } from \"./schemas.js\";\nimport type { AgentServerConfig } from \"./types.js\";\n\ntype MessageCallback = (message: unknown) => void;\n\nclass NdJsonTap {\n private decoder = new TextDecoder();\n private buffer = \"\";\n\n constructor(private onMessage: MessageCallback) {}\n\n process(chunk: Uint8Array): void {\n this.buffer += this.decoder.decode(chunk, { stream: true });\n const lines = this.buffer.split(\"\\n\");\n this.buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (!line.trim()) continue;\n try {\n this.onMessage(JSON.parse(line));\n } catch {\n // Not valid JSON, skip\n }\n }\n }\n}\n\nfunction createTappedReadableStream(\n underlying: ReadableStream<Uint8Array>,\n onMessage: MessageCallback,\n logger?: Logger,\n): ReadableStream<Uint8Array> {\n const reader = underlying.getReader();\n const tap = new NdJsonTap(onMessage);\n\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n try {\n const { value, done } = await reader.read();\n if (done) {\n controller.close();\n return;\n }\n tap.process(value);\n controller.enqueue(value);\n } catch (error) {\n logger?.debug(\"Read failed, closing stream\", error);\n controller.close();\n }\n },\n cancel() {\n reader.releaseLock();\n },\n });\n}\n\nfunction createTappedWritableStream(\n underlying: WritableStream<Uint8Array>,\n onMessage: MessageCallback,\n logger?: Logger,\n): WritableStream<Uint8Array> {\n const tap = new NdJsonTap(onMessage);\n const mutex = new AsyncMutex();\n\n return new WritableStream<Uint8Array>({\n async write(chunk) {\n tap.process(chunk);\n await mutex.acquire();\n try {\n const writer = underlying.getWriter();\n await writer.write(chunk);\n writer.releaseLock();\n } catch (error) {\n logger?.debug(\"Write failed (stream may be closed)\", error);\n } finally {\n mutex.release();\n }\n },\n async close() {\n await mutex.acquire();\n try {\n const writer = underlying.getWriter();\n await writer.close();\n writer.releaseLock();\n } catch (error) {\n logger?.debug(\"Close failed (stream may be closed)\", error);\n } finally {\n mutex.release();\n }\n },\n async abort(reason) {\n await mutex.acquire();\n try {\n const writer = underlying.getWriter();\n await writer.abort(reason);\n writer.releaseLock();\n } catch (error) {\n logger?.debug(\"Abort failed (stream may be closed)\", error);\n } finally {\n mutex.release();\n }\n },\n });\n}\n\ninterface SseController {\n send: (data: unknown) => void;\n close: () => void;\n}\n\ninterface ActiveSession {\n payload: JwtPayload;\n acpConnection: InProcessAcpConnection;\n clientConnection: ClientSideConnection;\n treeTracker: TreeTracker;\n sseController: SseController | null;\n deviceInfo: DeviceInfo;\n logWriter: SessionLogWriter;\n}\n\nexport class AgentServer {\n private config: AgentServerConfig;\n private logger: Logger;\n private server: ServerType | null = null;\n private session: ActiveSession | null = null;\n private app: Hono;\n private posthogAPI: PostHogAPIClient;\n\n constructor(config: AgentServerConfig) {\n this.config = config;\n this.logger = new Logger({ debug: true, prefix: \"[AgentServer]\" });\n this.posthogAPI = new PostHogAPIClient({\n apiUrl: config.apiUrl,\n projectId: config.projectId,\n getApiKey: () => config.apiKey,\n });\n this.app = this.createApp();\n }\n\n private getEffectiveMode(payload: JwtPayload): AgentMode {\n return payload.mode ?? this.config.mode;\n }\n\n private createApp(): Hono {\n const app = new Hono();\n\n app.get(\"/health\", (c) => {\n return c.json({ status: \"ok\", hasSession: !!this.session });\n });\n\n app.get(\"/events\", async (c) => {\n let payload: JwtPayload;\n\n try {\n payload = this.authenticateRequest(c.req.header.bind(c.req));\n } catch (error) {\n return c.json(\n {\n error:\n error instanceof JwtValidationError\n ? error.message\n : \"Invalid token\",\n code:\n error instanceof JwtValidationError\n ? error.code\n : \"invalid_token\",\n },\n 401,\n );\n }\n\n const stream = new ReadableStream({\n start: async (controller) => {\n const sseController: SseController = {\n send: (data: unknown) => {\n try {\n controller.enqueue(\n new TextEncoder().encode(`data: ${JSON.stringify(data)}\\n\\n`),\n );\n } catch (error) {\n this.logger.debug(\n \"SSE send failed (stream may be closed)\",\n error,\n );\n }\n },\n close: () => {\n try {\n controller.close();\n } catch (error) {\n this.logger.debug(\"SSE close failed (already closed)\", error);\n }\n },\n };\n\n if (!this.session || this.session.payload.run_id !== payload.run_id) {\n await this.initializeSession(payload, sseController);\n } else {\n this.session.sseController = sseController;\n }\n\n this.sendSseEvent(sseController, {\n type: \"connected\",\n run_id: payload.run_id,\n });\n },\n cancel: () => {\n this.logger.info(\"SSE connection closed\");\n if (this.session?.sseController) {\n this.session.sseController = null;\n }\n },\n });\n\n return new Response(stream, {\n headers: {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n },\n });\n });\n\n app.post(\"/command\", async (c) => {\n let payload: JwtPayload;\n\n try {\n payload = this.authenticateRequest(c.req.header.bind(c.req));\n } catch (error) {\n return c.json(\n {\n error:\n error instanceof JwtValidationError\n ? error.message\n : \"Invalid token\",\n },\n 401,\n );\n }\n\n if (!this.session || this.session.payload.run_id !== payload.run_id) {\n return c.json({ error: \"No active session for this run\" }, 400);\n }\n\n const rawBody = await c.req.json().catch(() => null);\n const parseResult = jsonRpcRequestSchema.safeParse(rawBody);\n\n if (!parseResult.success) {\n return c.json({ error: \"Invalid JSON-RPC request\" }, 400);\n }\n\n const command = parseResult.data;\n const paramsValidation = validateCommandParams(\n command.method,\n command.params ?? {},\n );\n\n if (!paramsValidation.success) {\n return c.json(\n {\n jsonrpc: \"2.0\",\n id: command.id,\n error: {\n code: -32602,\n message: paramsValidation.error,\n },\n },\n 200,\n );\n }\n\n try {\n const result = await this.executeCommand(\n command.method,\n (command.params as Record<string, unknown>) || {},\n );\n return c.json({\n jsonrpc: \"2.0\",\n id: command.id,\n result,\n });\n } catch (error) {\n return c.json({\n jsonrpc: \"2.0\",\n id: command.id,\n error: {\n code: -32000,\n message: error instanceof Error ? error.message : \"Unknown error\",\n },\n });\n }\n });\n\n app.notFound((c) => {\n return c.json({ error: \"Not found\" }, 404);\n });\n\n return app;\n }\n\n async start(): Promise<void> {\n await new Promise<void>((resolve) => {\n this.server = serve(\n {\n fetch: this.app.fetch,\n port: this.config.port,\n },\n () => {\n this.logger.info(`HTTP server listening on port ${this.config.port}`);\n resolve();\n },\n );\n });\n\n await this.autoInitializeSession();\n }\n\n private async autoInitializeSession(): Promise<void> {\n const { taskId, runId, mode, projectId } = this.config;\n\n this.logger.info(\"Auto-initializing session\", { taskId, runId, mode });\n\n // Create a synthetic payload from config (no JWT needed for auto-init)\n const payload: JwtPayload = {\n task_id: taskId,\n run_id: runId,\n team_id: projectId,\n user_id: 0, // System-initiated\n distinct_id: \"agent-server\",\n mode,\n };\n\n await this.initializeSession(payload, null);\n }\n\n async stop(): Promise<void> {\n this.logger.info(\"Stopping agent server...\");\n\n if (this.session) {\n await this.cleanupSession();\n }\n\n if (this.server) {\n this.server.close();\n this.server = null;\n }\n\n this.logger.info(\"Agent server stopped\");\n }\n\n private authenticateRequest(\n getHeader: (name: string) => string | undefined,\n ): JwtPayload {\n // Always require JWT validation - never trust unverified headers\n if (!this.config.jwtPublicKey) {\n throw new JwtValidationError(\n \"Server not configured with JWT public key\",\n \"server_error\",\n );\n }\n\n const authHeader = getHeader(\"authorization\");\n if (!authHeader?.startsWith(\"Bearer \")) {\n throw new JwtValidationError(\n \"Missing authorization header\",\n \"invalid_token\",\n );\n }\n\n const token = authHeader.slice(7);\n return validateJwt(token, this.config.jwtPublicKey);\n }\n\n private async executeCommand(\n method: string,\n params: Record<string, unknown>,\n ): Promise<unknown> {\n if (!this.session) {\n throw new Error(\"No active session\");\n }\n\n switch (method) {\n case POSTHOG_NOTIFICATIONS.USER_MESSAGE:\n case \"user_message\": {\n const content = params.content as string;\n\n this.logger.info(\n `Processing user message: ${content.substring(0, 100)}...`,\n );\n\n const result = await this.session.clientConnection.prompt({\n sessionId: this.session.payload.run_id,\n prompt: [{ type: \"text\", text: content }],\n });\n\n return { stopReason: result.stopReason };\n }\n\n case POSTHOG_NOTIFICATIONS.CANCEL:\n case \"cancel\": {\n this.logger.info(\"Cancel requested\");\n await this.session.clientConnection.cancel({\n sessionId: this.session.payload.run_id,\n });\n return { cancelled: true };\n }\n\n case POSTHOG_NOTIFICATIONS.CLOSE:\n case \"close\": {\n this.logger.info(\"Close requested\");\n await this.cleanupSession();\n return { closed: true };\n }\n\n default:\n throw new Error(`Unknown method: ${method}`);\n }\n }\n\n private async initializeSession(\n payload: JwtPayload,\n sseController: SseController | null,\n ): Promise<void> {\n if (this.session) {\n await this.cleanupSession();\n }\n\n this.logger.info(\"Initializing session\", {\n runId: payload.run_id,\n taskId: payload.task_id,\n });\n\n const deviceInfo: DeviceInfo = {\n type: \"cloud\",\n name: process.env.HOSTNAME || \"cloud-sandbox\",\n };\n\n this.configureEnvironment();\n\n const treeTracker = new TreeTracker({\n repositoryPath: this.config.repositoryPath,\n taskId: payload.task_id,\n runId: payload.run_id,\n logger: new Logger({ debug: true, prefix: \"[TreeTracker]\" }),\n });\n\n const _posthogAPI = new PostHogAPIClient({\n apiUrl: this.config.apiUrl,\n projectId: this.config.projectId,\n getApiKey: () => this.config.apiKey,\n });\n\n const logWriter = new SessionLogWriter({\n otelConfig: {\n posthogHost: this.config.apiUrl,\n apiKey: this.config.apiKey,\n logsPath: \"/i/v1/agent-logs\",\n },\n logger: new Logger({ debug: true, prefix: \"[SessionLogWriter]\" }),\n });\n\n const acpConnection = createAcpConnection({\n taskRunId: payload.run_id,\n taskId: payload.task_id,\n deviceType: deviceInfo.type,\n logWriter,\n });\n\n // Tap both streams to broadcast all ACP messages via SSE (mimics local transport)\n const onAcpMessage = (message: unknown) => {\n this.broadcastEvent({\n type: \"notification\",\n timestamp: new Date().toISOString(),\n notification: message,\n });\n };\n\n const tappedReadable = createTappedReadableStream(\n acpConnection.clientStreams.readable as ReadableStream<Uint8Array>,\n onAcpMessage,\n this.logger,\n );\n\n const tappedWritable = createTappedWritableStream(\n acpConnection.clientStreams.writable as WritableStream<Uint8Array>,\n onAcpMessage,\n this.logger,\n );\n\n const clientStream = ndJsonStream(tappedWritable, tappedReadable);\n\n const clientConnection = new ClientSideConnection(\n () => this.createCloudClient(payload),\n clientStream,\n );\n\n await clientConnection.initialize({\n protocolVersion: PROTOCOL_VERSION,\n clientCapabilities: {},\n });\n\n await clientConnection.newSession({\n cwd: this.config.repositoryPath,\n mcpServers: [],\n _meta: { sessionId: payload.run_id },\n });\n\n this.session = {\n payload,\n acpConnection,\n clientConnection,\n treeTracker,\n sseController,\n deviceInfo,\n logWriter,\n };\n\n this.logger.info(\"Session initialized successfully\");\n\n await this.sendInitialTaskMessage(payload);\n }\n\n private async sendInitialTaskMessage(payload: JwtPayload): Promise<void> {\n if (!this.session) return;\n\n try {\n this.logger.info(\"Fetching task details\", { taskId: payload.task_id });\n const task = await this.posthogAPI.getTask(payload.task_id);\n\n if (!task.description) {\n this.logger.warn(\"Task has no description, skipping initial message\");\n return;\n }\n\n this.logger.info(\"Sending initial task message\", {\n taskId: payload.task_id,\n descriptionLength: task.description.length,\n });\n\n const result = await this.session.clientConnection.prompt({\n sessionId: payload.run_id,\n prompt: [{ type: \"text\", text: task.description }],\n });\n\n this.logger.info(\"Initial task message completed\", {\n stopReason: result.stopReason,\n });\n\n // Only auto-complete for background mode\n const mode = this.getEffectiveMode(payload);\n if (mode === \"background\") {\n await this.signalTaskComplete(payload, result.stopReason);\n } else {\n this.logger.info(\"Interactive mode - staying open for conversation\");\n }\n } catch (error) {\n this.logger.error(\"Failed to send initial task message\", error);\n // Signal failure for background mode\n const mode = this.getEffectiveMode(payload);\n if (mode === \"background\") {\n await this.signalTaskComplete(payload, \"error\");\n }\n }\n }\n\n private async signalTaskComplete(\n payload: JwtPayload,\n stopReason: string,\n ): Promise<void> {\n const status =\n stopReason === \"cancelled\"\n ? \"cancelled\"\n : stopReason === \"error\"\n ? \"failed\"\n : \"completed\";\n\n try {\n await this.posthogAPI.updateTaskRun(payload.task_id, payload.run_id, {\n status,\n error_message: stopReason === \"error\" ? \"Agent error\" : undefined,\n });\n this.logger.info(\"Task completion signaled\", { status, stopReason });\n } catch (error) {\n this.logger.error(\"Failed to signal task completion\", error);\n }\n }\n\n private configureEnvironment(): void {\n const { apiKey, apiUrl, projectId } = this.config;\n const gatewayUrl = process.env.LLM_GATEWAY_URL || getLlmGatewayUrl(apiUrl);\n const openaiBaseUrl = gatewayUrl.endsWith(\"/v1\")\n ? gatewayUrl\n : `${gatewayUrl}/v1`;\n\n Object.assign(process.env, {\n // PostHog\n POSTHOG_API_KEY: apiKey,\n POSTHOG_API_URL: apiUrl,\n POSTHOG_API_HOST: apiUrl,\n POSTHOG_AUTH_HEADER: `Bearer ${apiKey}`,\n POSTHOG_PROJECT_ID: String(projectId),\n // Anthropic\n ANTHROPIC_API_KEY: apiKey,\n ANTHROPIC_AUTH_TOKEN: apiKey,\n ANTHROPIC_BASE_URL: gatewayUrl,\n // OpenAI (for models like GPT-4, o1, etc.)\n OPENAI_API_KEY: apiKey,\n OPENAI_BASE_URL: openaiBaseUrl,\n // Generic gateway\n LLM_GATEWAY_URL: gatewayUrl,\n });\n }\n\n private createCloudClient(payload: JwtPayload) {\n const mode = this.getEffectiveMode(payload);\n\n return {\n requestPermission: async (params: {\n options: Array<{ kind: string; optionId: string }>;\n }) => {\n // Background mode: always auto-approve permissions\n // Interactive mode: also auto-approve for now (user can monitor via SSE)\n // Future: interactive mode could pause and wait for user approval via SSE\n this.logger.debug(\"Permission request\", {\n mode,\n options: params.options,\n });\n\n const allowOption = params.options.find(\n (o) => o.kind === \"allow_once\" || o.kind === \"allow_always\",\n );\n return {\n outcome: {\n outcome: \"selected\" as const,\n optionId: allowOption?.optionId ?? params.options[0].optionId,\n },\n };\n },\n sessionUpdate: async (params: {\n sessionId: string;\n update?: Record<string, unknown>;\n }) => {\n // session/update notifications flow through the tapped stream (like local transport)\n // Only handle tree state capture for file changes here\n if (params.update?.sessionUpdate === \"tool_call_update\") {\n const meta = (params.update?._meta as Record<string, unknown>)\n ?.claudeCode as Record<string, unknown> | undefined;\n const toolName = meta?.toolName as string | undefined;\n const toolResponse = meta?.toolResponse as\n | Record<string, unknown>\n | undefined;\n\n if (\n (toolName === \"Write\" || toolName === \"Edit\") &&\n toolResponse?.filePath\n ) {\n await this.captureTreeState();\n }\n }\n },\n };\n }\n\n private async cleanupSession(): Promise<void> {\n if (!this.session) return;\n\n this.logger.info(\"Cleaning up session\");\n\n try {\n await this.captureTreeState();\n } catch (error) {\n this.logger.error(\"Failed to capture final tree state\", error);\n }\n\n try {\n await this.session.logWriter.flush(this.session.payload.run_id);\n } catch (error) {\n this.logger.error(\"Failed to flush session logs\", error);\n }\n\n try {\n await this.session.acpConnection.cleanup();\n } catch (error) {\n this.logger.error(\"Failed to cleanup ACP connection\", error);\n }\n\n if (this.session.sseController) {\n this.session.sseController.close();\n }\n\n this.session = null;\n }\n\n private async captureTreeState(): Promise<void> {\n if (!this.session?.treeTracker) return;\n\n try {\n const snapshot = await this.session.treeTracker.captureTree({});\n if (snapshot) {\n const snapshotWithDevice: TreeSnapshotEvent = {\n ...snapshot,\n device: this.session.deviceInfo,\n };\n this.broadcastEvent({\n type: \"notification\",\n timestamp: new Date().toISOString(),\n notification: {\n jsonrpc: \"2.0\",\n method: POSTHOG_NOTIFICATIONS.TREE_SNAPSHOT,\n params: snapshotWithDevice,\n },\n });\n }\n } catch (error) {\n this.logger.error(\"Failed to capture tree state\", error);\n }\n }\n\n private broadcastEvent(event: Record<string, unknown>): void {\n if (this.session?.sseController) {\n this.sendSseEvent(this.session.sseController, event);\n }\n }\n\n private sendSseEvent(controller: SseController, data: unknown): void {\n controller.send(data);\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 { 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","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.1\",\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 \"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 \"@posthog/shared\": \"workspace:*\",\n \"@twig/git\": \"workspace:*\",\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","/**\n * TreeTracker - Git tree-based state capture for cloud/local sync\n *\n * Captures the entire working state as a git tree hash + archive:\n * - Atomic state snapshots (no partial syncs)\n * - Efficient delta detection using git's diffing\n * - Simpler resume logic (restore tree, continue)\n *\n * Uses Saga pattern for atomic operations with automatic rollback on failure.\n * Uses a temporary git index to avoid modifying the user's staging area.\n */\n\nimport { isCommitOnRemote as gitIsCommitOnRemote } from \"@twig/git/queries\";\nimport type { PostHogAPIClient } from \"./posthog-api.js\";\nimport { ApplySnapshotSaga } from \"./sagas/apply-snapshot-saga.js\";\nimport { CaptureTreeSaga } from \"./sagas/capture-tree-saga.js\";\nimport type { TreeSnapshot } from \"./types.js\";\nimport { Logger } from \"./utils/logger.js\";\n\nexport type { TreeSnapshot };\n\nexport interface TreeTrackerConfig {\n repositoryPath: string;\n taskId: string;\n runId: string;\n apiClient?: PostHogAPIClient;\n logger?: Logger;\n}\n\nexport class TreeTracker {\n private repositoryPath: string;\n private taskId: string;\n private runId: string;\n private apiClient?: PostHogAPIClient;\n private logger: Logger;\n private lastTreeHash: string | null = null;\n\n constructor(config: TreeTrackerConfig) {\n this.repositoryPath = config.repositoryPath;\n this.taskId = config.taskId;\n this.runId = config.runId;\n this.apiClient = config.apiClient;\n this.logger =\n config.logger || new Logger({ debug: false, prefix: \"[TreeTracker]\" });\n }\n\n /**\n * Capture current working tree state as a snapshot.\n * Uses a temporary index to avoid modifying user's staging area.\n * Uses Saga pattern for atomic operation with automatic cleanup on failure.\n */\n async captureTree(options?: {\n interrupted?: boolean;\n }): Promise<TreeSnapshot | null> {\n const saga = new CaptureTreeSaga(this.logger);\n\n const result = await saga.run({\n repositoryPath: this.repositoryPath,\n taskId: this.taskId,\n runId: this.runId,\n apiClient: this.apiClient,\n lastTreeHash: this.lastTreeHash,\n interrupted: options?.interrupted,\n });\n\n if (!result.success) {\n this.logger.error(\"Failed to capture tree\", {\n error: result.error,\n failedStep: result.failedStep,\n });\n throw new Error(\n `Failed to capture tree at step '${result.failedStep}': ${result.error}`,\n );\n }\n\n // Only update lastTreeHash on success\n if (result.data.newTreeHash !== null) {\n this.lastTreeHash = result.data.newTreeHash;\n }\n\n return result.data.snapshot;\n }\n\n /**\n * Download and apply a tree snapshot.\n * Uses Saga pattern for atomic operation with rollback on failure.\n */\n async applyTreeSnapshot(snapshot: TreeSnapshot): Promise<void> {\n if (!this.apiClient) {\n throw new Error(\"Cannot apply snapshot: API client not configured\");\n }\n\n if (!snapshot.archiveUrl) {\n this.logger.warn(\"Cannot apply snapshot: no archive URL\", {\n treeHash: snapshot.treeHash,\n changes: snapshot.changes.length,\n });\n throw new Error(\"Cannot apply snapshot: no archive URL\");\n }\n\n const saga = new ApplySnapshotSaga(this.logger);\n\n const result = await saga.run({\n snapshot,\n repositoryPath: this.repositoryPath,\n apiClient: this.apiClient,\n taskId: this.taskId,\n runId: this.runId,\n });\n\n if (!result.success) {\n this.logger.error(\"Failed to apply tree snapshot\", {\n error: result.error,\n failedStep: result.failedStep,\n treeHash: snapshot.treeHash,\n });\n throw new Error(\n `Failed to apply snapshot at step '${result.failedStep}': ${result.error}`,\n );\n }\n\n // Only update lastTreeHash on success\n this.lastTreeHash = result.data.treeHash;\n }\n\n /**\n * Get the last captured tree hash.\n */\n getLastTreeHash(): string | null {\n return this.lastTreeHash;\n }\n\n /**\n * Set the last tree hash (used when resuming).\n */\n setLastTreeHash(hash: string | null): void {\n this.lastTreeHash = hash;\n }\n}\n\n/**\n * Check if a commit is available on any remote branch.\n * Used to validate that cloud can fetch the base commit during handoff.\n */\nexport async function isCommitOnRemote(\n commit: string,\n cwd: string,\n): Promise<boolean> {\n return gitIsCommitOnRemote(cwd, commit);\n}\n\n/**\n * Validate that a snapshot can be handed off to cloud execution.\n * Cloud needs to be able to fetch the baseCommit from a remote.\n *\n * @throws Error if the snapshot cannot be restored on cloud\n */\nexport async function validateForCloudHandoff(\n snapshot: TreeSnapshot,\n repositoryPath: string,\n): Promise<void> {\n if (!snapshot.baseCommit) {\n throw new Error(\"Cannot hand off to cloud: no base commit\");\n }\n\n const onRemote = await isCommitOnRemote(snapshot.baseCommit, repositoryPath);\n if (!onRemote) {\n throw new Error(\n `Cannot hand off to cloud: commit ${snapshot.baseCommit.slice(0, 7)} is not pushed. ` +\n `Run 'git push' to push your branch first.`,\n );\n }\n}\n","import { mkdir, rm, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { Saga } from \"@posthog/shared\";\nimport { ApplyTreeSaga as GitApplyTreeSaga } from \"@twig/git/sagas/tree\";\nimport type { PostHogAPIClient } from \"../posthog-api.js\";\nimport type { TreeSnapshot } from \"../types.js\";\n\nexport interface ApplySnapshotInput {\n snapshot: TreeSnapshot;\n repositoryPath: string;\n apiClient: PostHogAPIClient;\n taskId: string;\n runId: string;\n}\n\nexport interface ApplySnapshotOutput {\n treeHash: string;\n}\n\nexport class ApplySnapshotSaga extends Saga<\n ApplySnapshotInput,\n ApplySnapshotOutput\n> {\n private archivePath: string | null = null;\n\n protected async execute(\n input: ApplySnapshotInput,\n ): Promise<ApplySnapshotOutput> {\n const { snapshot, repositoryPath, apiClient, taskId, runId } = input;\n const tmpDir = join(repositoryPath, \".posthog\", \"tmp\");\n\n if (!snapshot.archiveUrl) {\n throw new Error(\"Cannot apply snapshot: no archive URL\");\n }\n\n await this.step({\n name: \"create_tmp_dir\",\n execute: () => mkdir(tmpDir, { recursive: true }),\n rollback: async () => {},\n });\n\n this.archivePath = join(tmpDir, `${snapshot.treeHash}.tar.gz`);\n await this.step({\n name: \"download_archive\",\n execute: async () => {\n const arrayBuffer = await apiClient.downloadArtifact(\n taskId,\n runId,\n snapshot.archiveUrl!,\n );\n if (!arrayBuffer) {\n throw new Error(\"Failed to download archive\");\n }\n const base64Content = Buffer.from(arrayBuffer).toString(\"utf-8\");\n const binaryContent = Buffer.from(base64Content, \"base64\");\n await writeFile(this.archivePath!, binaryContent);\n },\n rollback: async () => {\n if (this.archivePath) {\n await rm(this.archivePath, { force: true }).catch(() => {});\n }\n },\n });\n\n const gitApplySaga = new GitApplyTreeSaga(this.log);\n const applyResult = await gitApplySaga.run({\n baseDir: repositoryPath,\n treeHash: snapshot.treeHash,\n baseCommit: snapshot.baseCommit,\n changes: snapshot.changes,\n archivePath: this.archivePath,\n });\n\n if (!applyResult.success) {\n throw new Error(`Failed to apply tree: ${applyResult.error}`);\n }\n\n await rm(this.archivePath, { force: true }).catch(() => {});\n\n this.log.info(\"Tree snapshot applied\", {\n treeHash: snapshot.treeHash,\n totalChanges: snapshot.changes.length,\n deletedFiles: snapshot.changes.filter((c) => c.status === \"D\").length,\n });\n\n return { treeHash: snapshot.treeHash };\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { Saga } from \"@posthog/shared\";\nimport { CaptureTreeSaga as GitCaptureTreeSaga } from \"@twig/git/sagas/tree\";\nimport type { PostHogAPIClient } from \"../posthog-api.js\";\nimport type { TreeSnapshot } from \"../types.js\";\n\nexport interface CaptureTreeInput {\n repositoryPath: string;\n taskId: string;\n runId: string;\n apiClient?: PostHogAPIClient;\n lastTreeHash: string | null;\n interrupted?: boolean;\n}\n\nexport interface CaptureTreeOutput {\n snapshot: TreeSnapshot | null;\n newTreeHash: string | null;\n}\n\nexport class CaptureTreeSaga extends Saga<CaptureTreeInput, CaptureTreeOutput> {\n protected async execute(input: CaptureTreeInput): Promise<CaptureTreeOutput> {\n const {\n repositoryPath,\n lastTreeHash,\n interrupted,\n apiClient,\n taskId,\n runId,\n } = input;\n const tmpDir = join(repositoryPath, \".posthog\", \"tmp\");\n\n if (existsSync(join(repositoryPath, \".gitmodules\"))) {\n this.log.warn(\n \"Repository has submodules - snapshot may not capture submodule state\",\n );\n }\n\n const shouldArchive = !!apiClient;\n const archivePath = shouldArchive\n ? join(tmpDir, `tree-${Date.now()}.tar.gz`)\n : undefined;\n\n const gitCaptureSaga = new GitCaptureTreeSaga(this.log);\n const captureResult = await gitCaptureSaga.run({\n baseDir: repositoryPath,\n lastTreeHash,\n archivePath,\n });\n\n if (!captureResult.success) {\n throw new Error(`Failed to capture tree: ${captureResult.error}`);\n }\n\n const {\n snapshot: gitSnapshot,\n archivePath: createdArchivePath,\n changed,\n } = captureResult.data;\n\n if (!changed || !gitSnapshot) {\n this.log.debug(\"No changes since last capture\", { lastTreeHash });\n return { snapshot: null, newTreeHash: lastTreeHash };\n }\n\n let archiveUrl: string | undefined;\n if (apiClient && createdArchivePath) {\n try {\n archiveUrl = await this.uploadArchive(\n createdArchivePath,\n gitSnapshot.treeHash,\n apiClient,\n taskId,\n runId,\n );\n } finally {\n await rm(createdArchivePath, { force: true }).catch(() => {});\n }\n }\n\n const snapshot: TreeSnapshot = {\n treeHash: gitSnapshot.treeHash,\n baseCommit: gitSnapshot.baseCommit,\n changes: gitSnapshot.changes,\n timestamp: gitSnapshot.timestamp,\n interrupted,\n archiveUrl,\n };\n\n this.log.info(\"Tree captured\", {\n treeHash: snapshot.treeHash,\n changes: snapshot.changes.length,\n interrupted,\n archiveUrl,\n });\n\n return { snapshot, newTreeHash: snapshot.treeHash };\n }\n\n private async uploadArchive(\n archivePath: string,\n treeHash: string,\n apiClient: PostHogAPIClient,\n taskId: string,\n runId: string,\n ): Promise<string | undefined> {\n const archiveUrl = await this.step({\n name: \"upload_archive\",\n execute: async () => {\n const archiveContent = await readFile(archivePath);\n const base64Content = archiveContent.toString(\"base64\");\n\n const artifacts = await apiClient.uploadTaskArtifacts(taskId, runId, [\n {\n name: `trees/${treeHash}.tar.gz`,\n type: \"tree_snapshot\",\n content: base64Content,\n content_type: \"application/gzip\",\n },\n ]);\n\n if (artifacts.length > 0 && artifacts[0].storage_path) {\n this.log.info(\"Tree archive uploaded\", {\n storagePath: artifacts[0].storage_path,\n treeHash,\n });\n return artifacts[0].storage_path;\n }\n\n return undefined;\n },\n rollback: async () => {\n await rm(archivePath, { force: true }).catch(() => {});\n },\n });\n\n return archiveUrl;\n }\n}\n","export class AsyncMutex {\n private locked = false;\n private queue: Array<() => void> = [];\n\n async acquire(): Promise<void> {\n if (!this.locked) {\n this.locked = true;\n return;\n }\n return new Promise((resolve) => {\n this.queue.push(resolve);\n });\n }\n\n release(): void {\n const next = this.queue.shift();\n if (next) {\n next();\n } else {\n this.locked = false;\n }\n }\n\n isLocked(): boolean {\n return this.locked;\n }\n\n get queueLength(): number {\n return this.queue.length;\n }\n}\n","import jwt from \"jsonwebtoken\";\nimport { z } from \"zod\";\n\nexport const SANDBOX_CONNECTION_AUDIENCE = \"posthog:sandbox_connection\";\n\nexport const userDataSchema = z.object({\n run_id: z.string(),\n task_id: z.string(),\n team_id: z.number(),\n user_id: z.number(),\n distinct_id: z.string(),\n mode: z.enum([\"interactive\", \"background\"]).optional().default(\"interactive\"),\n});\n\nconst jwtPayloadSchema = userDataSchema.extend({\n exp: z.number(),\n iat: z.number().optional(),\n aud: z.string().optional(),\n});\n\nexport type JwtPayload = z.infer<typeof userDataSchema>;\n\nexport class JwtValidationError extends Error {\n constructor(\n message: string,\n public code:\n | \"invalid_token\"\n | \"expired\"\n | \"invalid_signature\"\n | \"server_error\",\n ) {\n super(message);\n this.name = \"JwtValidationError\";\n }\n}\n\nexport function validateJwt(token: string, publicKey: string): JwtPayload {\n try {\n const decoded = jwt.verify(token, publicKey, {\n algorithms: [\"RS256\"],\n audience: SANDBOX_CONNECTION_AUDIENCE,\n });\n\n const result = jwtPayloadSchema.safeParse(decoded);\n if (!result.success) {\n throw new JwtValidationError(\n `Missing required fields: ${result.error.message}`,\n \"invalid_token\",\n );\n }\n\n return result.data;\n } catch (error) {\n if (error instanceof JwtValidationError) {\n throw error;\n }\n if (error instanceof jwt.TokenExpiredError) {\n throw new JwtValidationError(\"Token expired\", \"expired\");\n }\n if (error instanceof jwt.JsonWebTokenError) {\n throw new JwtValidationError(\"Invalid signature\", \"invalid_signature\");\n }\n throw new JwtValidationError(\"Invalid token\", \"invalid_token\");\n }\n}\n","import { z } from \"zod\";\n\nexport const jsonRpcRequestSchema = z.object({\n jsonrpc: z.literal(\"2.0\"),\n method: z.string(),\n params: z.record(z.unknown()).optional(),\n id: z.union([z.string(), z.number()]).optional(),\n});\n\nexport type JsonRpcRequest = z.infer<typeof jsonRpcRequestSchema>;\n\nexport const userMessageParamsSchema = z.object({\n content: z.string().min(1, \"Content is required\"),\n});\n\nexport const commandParamsSchemas = {\n user_message: userMessageParamsSchema,\n \"posthog/user_message\": userMessageParamsSchema,\n cancel: z.object({}).optional(),\n \"posthog/cancel\": z.object({}).optional(),\n close: z.object({}).optional(),\n \"posthog/close\": z.object({}).optional(),\n} as const;\n\nexport type CommandMethod = keyof typeof commandParamsSchemas;\n\nexport function validateCommandParams(\n method: string,\n params: unknown,\n): { success: true; data: unknown } | { success: false; error: string } {\n const schema =\n commandParamsSchemas[method as CommandMethod] ??\n commandParamsSchemas[\n method.replace(\"posthog/\", \"\") as keyof typeof commandParamsSchemas\n ];\n\n if (!schema) {\n return { success: false, error: `Unknown method: ${method}` };\n }\n\n const result = schema.safeParse(params);\n if (!result.success) {\n return { success: false, error: result.error.message };\n }\n\n return { success: true, data: result.data };\n}\n"],"mappings":"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","names":["z","ndJsonStream","ReadableStream","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","join","existsSync","rm","join","Saga","resolve","z","z","createTappedWritableStream","resolve","ndJsonStream","z"]}
|