@posthog/agent 1.28.0 → 1.29.0

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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/acp-extensions.ts","../src/adapters/claude/claude.ts","../src/utils/logger.ts","../src/utils/tapped-stream.ts","../package.json","../src/adapters/claude/mcp-server.ts","../src/adapters/claude/utils.ts","../src/adapters/claude/tools.ts","../src/agent.ts","../src/file-manager.ts","../src/git-manager.ts","../src/posthog-api.ts","../src/prompt-builder.ts","../src/session-store.ts","../src/task-manager.ts","../src/template-manager.ts","../src/workflow/steps/build.ts","../src/agents/execution.ts","../src/todo-manager.ts","../src/types.ts","../src/workflow/utils.ts","../src/workflow/steps/finalize.ts","../src/workflow/steps/plan.ts","../src/agents/planning.ts","../src/workflow/steps/research.ts","../src/agents/research.ts","../src/workflow/config.ts","../src/schemas.ts","../src/tools/registry.ts","../src/worktree-manager.ts"],"sourcesContent":["/**\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 * 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 /** Artifact produced during task execution (research, plan, etc.) */\n ARTIFACT: \"_posthog/artifact\",\n /** Phase has started (research, plan, build, etc.) */\n PHASE_START: \"_posthog/phase_start\",\n /** Phase has completed */\n PHASE_COMPLETE: \"_posthog/phase_complete\",\n /** Git branch was created */\n BRANCH_CREATED: \"_posthog/branch_created\",\n /** Pull request was created */\n PR_CREATED: \"_posthog/pr_created\",\n /** Task run has started */\n RUN_STARTED: \"_posthog/run_started\",\n /** Task has completed */\n TASK_COMPLETE: \"_posthog/task_complete\",\n /** Error occurred during task execution */\n ERROR: \"_posthog/error\",\n /** Console/log output */\n CONSOLE: \"_posthog/console\",\n /** SDK session ID notification (for resumption) */\n SDK_SESSION: \"_posthog/sdk_session\",\n} as const;\n\nexport type PostHogNotificationType =\n (typeof POSTHOG_NOTIFICATIONS)[keyof typeof POSTHOG_NOTIFICATIONS];\n\nexport interface ArtifactNotificationPayload {\n sessionId: string;\n kind:\n | \"research_evaluation\"\n | \"research_questions\"\n | \"plan\"\n | \"pr_body\"\n | string;\n content: unknown;\n}\n\nexport interface PhaseNotificationPayload {\n sessionId: string;\n phase: \"research\" | \"plan\" | \"build\" | \"finalize\" | string;\n [key: string]: unknown;\n}\n\nexport interface BranchCreatedPayload {\n sessionId: string;\n branch: string;\n}\n\n/**\n * Payload for PR created notification\n */\nexport interface PrCreatedPayload {\n sessionId: string;\n prUrl: string;\n}\n\nexport interface RunStartedPayload {\n sessionId: string;\n runId: string;\n taskId?: string;\n}\n\n/**\n * Payload for task complete notification\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\n/**\n * Console output for a session\n */\nexport interface ConsoleNotificationPayload {\n sessionId: string;\n level: \"debug\" | \"info\" | \"warn\" | \"error\";\n message: string;\n}\n\n/**\n * Maps a session ID to a SDKs session ID\n */\nexport interface SdkSessionPayload {\n sessionId: string;\n sdkSessionId: string;\n}\n\nexport type PostHogNotificationPayload =\n | ArtifactNotificationPayload\n | PhaseNotificationPayload\n | BranchCreatedPayload\n | PrCreatedPayload\n | RunStartedPayload\n | TaskCompletePayload\n | ErrorNotificationPayload\n | ConsoleNotificationPayload\n | SdkSessionPayload;\n","/**\n * The claude adapter has been based on the original claude-code-acp adapter,\n * and could use some cleanup.\n *\n * https://github.com/zed-industries/claude-code-acp\n */\n\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport {\n type Agent,\n AgentSideConnection,\n type AuthenticateRequest,\n type AvailableCommand,\n type CancelNotification,\n type ClientCapabilities,\n type InitializeRequest,\n type InitializeResponse,\n type LoadSessionRequest,\n type LoadSessionResponse,\n type NewSessionRequest,\n type NewSessionResponse,\n ndJsonStream,\n type PromptRequest,\n type PromptResponse,\n type ReadTextFileRequest,\n type ReadTextFileResponse,\n RequestError,\n type SessionModelState,\n type SessionNotification,\n type SetSessionModelRequest,\n type SetSessionModeRequest,\n type SetSessionModeResponse,\n type TerminalHandle,\n type TerminalOutputResponse,\n type WriteTextFileRequest,\n type WriteTextFileResponse,\n} from \"@agentclientprotocol/sdk\";\nimport {\n type CanUseTool,\n type McpServerConfig,\n type Options,\n type PermissionMode,\n type Query,\n query,\n type SDKPartialAssistantMessage,\n type 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 { v7 as uuidv7 } from \"uuid\";\nimport type {\n SessionPersistenceConfig,\n SessionStore,\n} from \"@/session-store.js\";\nimport { Logger } from \"@/utils/logger.js\";\nimport { createTappedWritableStream } from \"@/utils/tapped-stream.js\";\nimport packageJson from \"../../../package.json\" with { type: \"json\" };\nimport { createMcpServer, EDIT_TOOL_NAMES, toolNames } from \"./mcp-server.js\";\nimport {\n type ClaudePlanEntry,\n createPostToolUseHook,\n planEntries,\n registerHookCallback,\n toolInfoFromToolUse,\n toolUpdateFromToolResult,\n} from \"./tools.js\";\nimport {\n createBidirectionalStreams,\n Pushable,\n type StreamPair,\n unreachable,\n} from \"./utils.js\";\n\n/**\n * Clears the statsig cache to work around a claude-agent-sdk bug where cached\n * tool definitions include input_examples which causes API errors.\n * See: https://github.com/anthropics/claude-code/issues/11678\n */\nfunction clearStatsigCache(): void {\n const configDir =\n process.env.CLAUDE_CONFIG_DIR || path.join(os.homedir(), \".claude\");\n const statsigPath = path.join(configDir, \"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\ntype Session = {\n query: Query;\n input: Pushable<SDKUserMessage>;\n cancelled: boolean;\n permissionMode: PermissionMode;\n notificationHistory: SessionNotification[];\n sdkSessionId?: string;\n};\n\ntype BackgroundTerminal =\n | {\n handle: TerminalHandle;\n status: \"started\";\n lastOutput: TerminalOutputResponse | null;\n }\n | {\n status: \"aborted\" | \"exited\" | \"killed\" | \"timedOut\";\n pendingOutput: TerminalOutputResponse;\n };\n\n/**\n * Extra metadata that can be given to Claude Code when creating a new session.\n */\nexport type NewSessionMeta = {\n claudeCode?: {\n /**\n * Options forwarded to Claude Code when starting a new session.\n * Those parameters will be ignored and managed by ACP:\n * - cwd\n * - includePartialMessages\n * - allowDangerouslySkipPermissions\n * - permissionMode\n * - canUseTool\n * - executable\n * Those parameters will be used and updated to work with ACP:\n * - hooks (merged with ACP's hooks)\n * - mcpServers (merged with ACP's mcpServers)\n */\n options?: Options;\n };\n};\n\n/**\n * Extra metadata that the agent provides for each tool_call / tool_update update.\n */\nexport type ToolUpdateMeta = {\n claudeCode?: {\n /* The name of the tool that was used in Claude Code. */\n toolName: string;\n /* The structured output provided by Claude Code. */\n toolResponse?: unknown;\n };\n};\n\ntype ToolUseCache = {\n [key: string]: {\n type: \"tool_use\" | \"server_tool_use\" | \"mcp_tool_use\";\n id: string;\n name: string;\n input: any;\n };\n};\n\n// Bypass Permissions doesn't work if we are a root/sudo user\nconst IS_ROOT = (process.geteuid?.() ?? process.getuid?.()) === 0;\n\n// Implement the ACP Agent interface\nexport class ClaudeAcpAgent implements Agent {\n sessions: {\n [key: string]: Session;\n };\n client: AgentSideConnection;\n toolUseCache: ToolUseCache;\n fileContentCache: { [key: string]: string };\n backgroundTerminals: { [key: string]: BackgroundTerminal } = {};\n clientCapabilities?: ClientCapabilities;\n logger: Logger = new Logger({ debug: true, prefix: \"[ClaudeAcpAgent]\" });\n sessionStore?: SessionStore;\n\n constructor(client: AgentSideConnection, sessionStore?: SessionStore) {\n this.sessions = {};\n this.client = client;\n this.toolUseCache = {};\n this.fileContentCache = {};\n this.sessionStore = sessionStore;\n }\n\n createSession(\n sessionId: string,\n q: Query,\n input: Pushable<SDKUserMessage>,\n permissionMode: PermissionMode,\n ): Session {\n const session: Session = {\n query: q,\n input,\n cancelled: false,\n permissionMode,\n notificationHistory: [],\n };\n this.sessions[sessionId] = session;\n return session;\n }\n\n appendNotification(\n sessionId: string,\n notification: SessionNotification,\n ): void {\n // In-memory only - S3 persistence is now automatic via tapped stream\n this.sessions[sessionId]?.notificationHistory.push(notification);\n }\n\n async initialize(request: InitializeRequest): Promise<InitializeResponse> {\n this.clientCapabilities = request.clientCapabilities;\n\n // Default authMethod\n const authMethod: any = {\n description: \"Run `claude /login` in the terminal\",\n name: \"Log in with Claude Code\",\n id: \"claude-login\",\n };\n\n // If client supports terminal-auth capability, use that instead.\n // if (request.clientCapabilities?._meta?.[\"terminal-auth\"] === true) {\n // const cliPath = fileURLToPath(import.meta.resolve(\"@anthropic-ai/claude-agent-sdk/cli.js\"));\n\n // authMethod._meta = {\n // \"terminal-auth\": {\n // command: \"node\",\n // args: [cliPath, \"/login\"],\n // label: \"Claude Code Login\",\n // },\n // };\n // }\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: [authMethod],\n };\n }\n async newSession(params: NewSessionRequest): Promise<NewSessionResponse> {\n if (\n fs.existsSync(path.resolve(os.homedir(), \".claude.json.backup\")) &&\n !fs.existsSync(path.resolve(os.homedir(), \".claude.json\"))\n ) {\n throw RequestError.authRequired();\n }\n\n // Allow caller to specify sessionId via _meta (e.g. taskRunId in our case)\n const sessionId =\n (params._meta as { sessionId?: string } | undefined)?.sessionId ||\n uuidv7();\n const input = new Pushable<SDKUserMessage>();\n\n const mcpServers: Record<string, McpServerConfig> = {};\n if (Array.isArray(params.mcpServers)) {\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\n // Only add the acp MCP server if built-in tools are not disabled\n if (!params._meta?.disableBuiltInTools) {\n const server = createMcpServer(this, sessionId, this.clientCapabilities);\n mcpServers.acp = {\n type: \"sdk\",\n name: \"acp\",\n instance: server,\n };\n }\n\n let systemPrompt: Options[\"systemPrompt\"] = {\n type: \"preset\",\n preset: \"claude_code\",\n };\n if (params._meta?.systemPrompt) {\n const customPrompt = params._meta.systemPrompt;\n if (typeof customPrompt === \"string\") {\n systemPrompt = customPrompt;\n } else if (\n typeof customPrompt === \"object\" &&\n \"append\" in customPrompt &&\n typeof customPrompt.append === \"string\"\n ) {\n systemPrompt.append = customPrompt.append;\n }\n }\n\n const permissionMode = \"default\";\n\n // Extract options from _meta if provided\n const userProvidedOptions = (params._meta as NewSessionMeta | undefined)\n ?.claudeCode?.options;\n\n const options: Options = {\n systemPrompt,\n settingSources: [\"user\", \"project\", \"local\"],\n stderr: (err) => this.logger.error(err),\n ...userProvidedOptions,\n // Override certain fields that must be controlled by ACP\n cwd: params.cwd,\n includePartialMessages: true,\n mcpServers: { ...(userProvidedOptions?.mcpServers || {}), ...mcpServers },\n // If we want bypassPermissions to be an option, we have to allow it here.\n // But it doesn't work in root mode, so we only activate it if it will work.\n allowDangerouslySkipPermissions: !IS_ROOT,\n permissionMode,\n canUseTool: this.canUseTool(sessionId),\n // Use \"node\" to resolve via PATH where a symlink to Electron exists.\n // This avoids launching the Electron binary directly from the app bundle,\n // which can cause dock icons to appear on macOS even with ELECTRON_RUN_AS_NODE.\n executable: \"node\",\n // Prevent spawned Electron processes from showing in dock/tray.\n // Must merge with process.env since SDK replaces rather than merges.\n env: { ...process.env, ELECTRON_RUN_AS_NODE: \"1\" },\n ...(process.env.CLAUDE_CODE_EXECUTABLE && {\n pathToClaudeCodeExecutable: process.env.CLAUDE_CODE_EXECUTABLE,\n }),\n hooks: {\n ...userProvidedOptions?.hooks,\n PostToolUse: [\n ...(userProvidedOptions?.hooks?.PostToolUse || []),\n {\n hooks: [createPostToolUseHook(this.logger)],\n },\n ],\n },\n };\n\n const allowedTools = [];\n const disallowedTools = [];\n\n // Check if built-in tools should be disabled\n const disableBuiltInTools = params._meta?.disableBuiltInTools === true;\n\n if (!disableBuiltInTools) {\n if (this.clientCapabilities?.fs?.readTextFile) {\n allowedTools.push(toolNames.read);\n disallowedTools.push(\"Read\");\n }\n if (this.clientCapabilities?.fs?.writeTextFile) {\n disallowedTools.push(\"Write\", \"Edit\");\n }\n if (this.clientCapabilities?.terminal) {\n allowedTools.push(toolNames.bashOutput, toolNames.killShell);\n disallowedTools.push(\"Bash\", \"BashOutput\", \"KillShell\");\n }\n } else {\n // When built-in tools are disabled, explicitly disallow all of them\n disallowedTools.push(\n toolNames.read,\n toolNames.write,\n toolNames.edit,\n toolNames.bash,\n toolNames.bashOutput,\n toolNames.killShell,\n \"Read\",\n \"Write\",\n \"Edit\",\n \"Bash\",\n \"BashOutput\",\n \"KillShell\",\n \"Glob\",\n \"Grep\",\n \"Task\",\n \"TodoWrite\",\n \"ExitPlanMode\",\n \"WebSearch\",\n \"WebFetch\",\n \"AskUserQuestion\",\n \"SlashCommand\",\n \"Skill\",\n \"NotebookEdit\",\n );\n }\n\n if (allowedTools.length > 0) {\n options.allowedTools = allowedTools;\n }\n if (disallowedTools.length > 0) {\n options.disallowedTools = disallowedTools;\n }\n\n // Handle abort controller from meta options\n const abortController = userProvidedOptions?.abortController;\n if (abortController?.signal.aborted) {\n throw new Error(\"Cancelled\");\n }\n\n // Clear statsig cache before creating query to avoid input_examples bug\n clearStatsigCache();\n\n const q = query({\n prompt: input,\n options,\n });\n\n this.createSession(sessionId, q, input, permissionMode);\n\n // Register for S3 persistence if config provided\n const persistence = params._meta?.persistence as\n | SessionPersistenceConfig\n | undefined;\n if (persistence && this.sessionStore) {\n this.sessionStore.register(sessionId, persistence);\n }\n\n const availableCommands = await getAvailableSlashCommands(q);\n const models = await getAvailableModels(q);\n\n // Needs to happen after we return the session\n setTimeout(() => {\n this.client.sessionUpdate({\n sessionId,\n update: {\n sessionUpdate: \"available_commands_update\",\n availableCommands,\n },\n });\n }, 0);\n\n const availableModes = [\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:\n \"Automatically accepts file edit permissions for the session\",\n },\n {\n id: \"plan\",\n name: \"Plan Mode\",\n description:\n \"Claude can analyze but not modify files or execute commands\",\n },\n ];\n // Only works in non-root mode\n if (!IS_ROOT) {\n availableModes.push({\n id: \"bypassPermissions\",\n name: \"Bypass Permissions\",\n description: \"Skips all permission prompts\",\n });\n }\n\n return {\n sessionId,\n models,\n modes: {\n currentModeId: permissionMode,\n availableModes,\n },\n };\n }\n\n async authenticate(_params: AuthenticateRequest): Promise<void> {\n throw new Error(\"Method not implemented.\");\n }\n\n async prompt(params: PromptRequest): Promise<PromptResponse> {\n if (!this.sessions[params.sessionId]) {\n throw new Error(\"Session not found\");\n }\n\n this.sessions[params.sessionId].cancelled = false;\n\n const { query, input } = this.sessions[params.sessionId];\n\n // Capture and store user message for replay\n for (const chunk of params.prompt) {\n const userNotification: SessionNotification = {\n sessionId: params.sessionId,\n update: {\n sessionUpdate: \"user_message_chunk\",\n content: chunk,\n },\n };\n await this.client.sessionUpdate(userNotification);\n this.appendNotification(params.sessionId, userNotification);\n }\n\n input.push(promptToClaude(params));\n while (true) {\n const { value: message, done } = await query.next();\n if (done || !message) {\n if (this.sessions[params.sessionId].cancelled) {\n return { stopReason: \"cancelled\" };\n }\n break;\n }\n this.logger.debug(\"SDK message received\", {\n type: message.type,\n subtype: (message as any).subtype,\n });\n\n switch (message.type) {\n case \"system\":\n switch (message.subtype) {\n case \"init\":\n // Capture SDK session ID and notify client for persistence\n if (message.session_id) {\n const session = this.sessions[params.sessionId];\n if (session && !session.sdkSessionId) {\n session.sdkSessionId = message.session_id;\n this.client.extNotification(\"_posthog/sdk_session\", {\n sessionId: params.sessionId,\n sdkSessionId: message.session_id,\n });\n }\n }\n break;\n case \"compact_boundary\":\n case \"hook_response\":\n case \"status\":\n // Todo: process via status api: https://docs.claude.com/en/docs/claude-code/hooks#hook-output\n break;\n default:\n unreachable(message, this.logger);\n break;\n }\n break;\n case \"result\": {\n if (this.sessions[params.sessionId].cancelled) {\n return { stopReason: \"cancelled\" };\n }\n\n switch (message.subtype) {\n case \"success\": {\n if (message.result.includes(\"Please run /login\")) {\n throw RequestError.authRequired();\n }\n if (message.is_error) {\n throw RequestError.internalError(undefined, message.result);\n }\n return { stopReason: \"end_turn\" };\n }\n case \"error_during_execution\":\n if (message.is_error) {\n throw RequestError.internalError(\n undefined,\n message.errors.join(\", \") || message.subtype,\n );\n }\n return { 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 throw RequestError.internalError(\n undefined,\n message.errors.join(\", \") || message.subtype,\n );\n }\n return { stopReason: \"max_turn_requests\" };\n default:\n unreachable(message, this.logger);\n break;\n }\n break;\n }\n case \"stream_event\": {\n this.logger.debug(\"Stream event\", { eventType: message.event?.type });\n for (const notification of streamEventToAcpNotifications(\n message,\n params.sessionId,\n this.toolUseCache,\n this.fileContentCache,\n this.client,\n this.logger,\n )) {\n await this.client.sessionUpdate(notification);\n this.appendNotification(params.sessionId, notification);\n }\n break;\n }\n case \"user\":\n case \"assistant\": {\n if (this.sessions[params.sessionId].cancelled) {\n break;\n }\n\n // Slash commands like /compact can generate invalid output... doesn't match\n // their own docs: https://docs.anthropic.com/en/docs/claude-code/sdk/sdk-slash-commands#%2Fcompact-compact-conversation-history\n if (\n typeof message.message.content === \"string\" &&\n message.message.content.includes(\"<local-command-stdout>\")\n ) {\n this.logger.info(message.message.content);\n break;\n }\n\n if (\n typeof message.message.content === \"string\" &&\n message.message.content.includes(\"<local-command-stderr>\")\n ) {\n this.logger.error(message.message.content);\n break;\n }\n // Skip these user messages for now, since they seem to just be messages we don't want in the feed\n if (\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 break;\n }\n\n if (\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\")\n ) {\n throw RequestError.authRequired();\n }\n\n // For assistant messages, text/thinking are normally streamed via stream_event.\n // But some gateways (like LiteLLM) don't stream, so we process all content.\n const content = message.message.content;\n\n for (const notification of toAcpNotifications(\n content,\n message.message.role,\n params.sessionId,\n this.toolUseCache,\n this.fileContentCache,\n this.client,\n this.logger,\n )) {\n await this.client.sessionUpdate(notification);\n this.appendNotification(params.sessionId, notification);\n }\n break;\n }\n case \"tool_progress\":\n break;\n case \"auth_status\":\n break;\n default:\n unreachable(message, this.logger);\n break;\n }\n }\n throw new Error(\"Session did not end in result\");\n }\n\n async cancel(params: CancelNotification): Promise<void> {\n if (!this.sessions[params.sessionId]) {\n throw new Error(\"Session not found\");\n }\n this.sessions[params.sessionId].cancelled = true;\n await this.sessions[params.sessionId].query.interrupt();\n }\n\n async setSessionModel(params: SetSessionModelRequest) {\n if (!this.sessions[params.sessionId]) {\n throw new Error(\"Session not found\");\n }\n await this.sessions[params.sessionId].query.setModel(params.modelId);\n }\n\n async setSessionMode(\n params: SetSessionModeRequest,\n ): Promise<SetSessionModeResponse> {\n if (!this.sessions[params.sessionId]) {\n throw new Error(\"Session not found\");\n }\n\n switch (params.modeId) {\n case \"default\":\n case \"acceptEdits\":\n case \"bypassPermissions\":\n case \"plan\":\n this.sessions[params.sessionId].permissionMode = params.modeId;\n try {\n await this.sessions[params.sessionId].query.setPermissionMode(\n params.modeId,\n );\n } catch (error) {\n const errorMessage =\n error instanceof Error && error.message\n ? error.message\n : \"Invalid Mode\";\n\n throw new Error(errorMessage);\n }\n return {};\n default:\n throw new Error(\"Invalid Mode\");\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 /**\n * Load session delegates to resumeSession since we have no need to replay history.\n * Client is responsible for fetching and rendering history from S3.\n */\n async loadSession(params: LoadSessionRequest): Promise<LoadSessionResponse> {\n return this.resumeSession(params);\n }\n\n canUseTool(sessionId: string): CanUseTool {\n return async (toolName, toolInput, { suggestions, toolUseID }) => {\n const session = this.sessions[sessionId];\n if (!session) {\n return {\n behavior: \"deny\",\n message: \"Session not found\",\n interrupt: true,\n };\n }\n\n if (toolName === \"ExitPlanMode\") {\n const response = await this.client.requestPermission({\n options: [\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 sessionId,\n toolCall: {\n toolCallId: toolUseID,\n rawInput: toolInput,\n title: toolInfoFromToolUse(\n { name: toolName, input: toolInput },\n this.fileContentCache,\n this.logger,\n ).title,\n },\n });\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 this.client.sessionUpdate({\n sessionId,\n update: {\n sessionUpdate: \"current_mode_update\",\n currentModeId: response.outcome.optionId,\n },\n });\n\n return {\n behavior: \"allow\",\n updatedInput: toolInput,\n updatedPermissions: suggestions ?? [\n {\n type: \"setMode\",\n mode: response.outcome.optionId,\n destination: \"session\",\n },\n ],\n };\n } else {\n return {\n behavior: \"deny\",\n message: \"User rejected request to exit plan mode.\",\n interrupt: true,\n };\n }\n }\n\n if (\n session.permissionMode === \"bypassPermissions\" ||\n (session.permissionMode === \"acceptEdits\" &&\n EDIT_TOOL_NAMES.includes(toolName))\n ) {\n return {\n behavior: \"allow\",\n updatedInput: toolInput,\n updatedPermissions: suggestions ?? [\n {\n type: \"addRules\",\n rules: [{ toolName }],\n behavior: \"allow\",\n destination: \"session\",\n },\n ],\n };\n }\n\n const response = await this.client.requestPermission({\n options: [\n {\n kind: \"allow_always\",\n name: \"Always Allow\",\n optionId: \"allow_always\",\n },\n { kind: \"allow_once\", name: \"Allow\", optionId: \"allow\" },\n { kind: \"reject_once\", name: \"Reject\", optionId: \"reject\" },\n ],\n sessionId,\n toolCall: {\n toolCallId: toolUseID,\n rawInput: toolInput,\n title: toolInfoFromToolUse(\n { name: toolName, input: toolInput },\n this.fileContentCache,\n this.logger,\n ).title,\n },\n });\n if (\n response.outcome?.outcome === \"selected\" &&\n (response.outcome.optionId === \"allow\" ||\n response.outcome.optionId === \"allow_always\")\n ) {\n // If Claude Code has suggestions, it will update their settings already\n if (response.outcome.optionId === \"allow_always\") {\n return {\n behavior: \"allow\",\n updatedInput: toolInput,\n updatedPermissions: suggestions ?? [\n {\n type: \"addRules\",\n rules: [{ toolName }],\n behavior: \"allow\",\n destination: \"session\",\n },\n ],\n };\n }\n return {\n behavior: \"allow\",\n updatedInput: toolInput,\n };\n } else {\n return {\n behavior: \"deny\",\n message: \"User refused permission to run tool\",\n interrupt: true,\n };\n }\n };\n }\n\n /**\n * Handle custom extension methods.\n * Per ACP spec, extension methods start with underscore.\n */\n async extMethod(\n method: string,\n params: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n if (method === \"_posthog/session/resume\") {\n await this.resumeSession(params as unknown as LoadSessionRequest);\n return {};\n }\n\n throw RequestError.methodNotFound(method);\n }\n\n /**\n * Resume a session without replaying history.\n * Client is responsible for fetching and rendering history from S3.\n * This basically implemetns the ACP session/resume RFD:\n * https://agentclientprotocol.com/rfds/session-resume\n */\n async resumeSession(\n params: LoadSessionRequest,\n ): Promise<LoadSessionResponse> {\n this.logger.info(\"[RESUME] Resuming session\", { params });\n const { sessionId } = params;\n\n // Extract persistence config and SDK session ID from _meta\n const persistence = params._meta?.persistence as\n | SessionPersistenceConfig\n | undefined;\n const sdkSessionId = params._meta?.sdkSessionId as string | undefined;\n\n if (!this.sessions[sessionId]) {\n const input = new Pushable<SDKUserMessage>();\n\n const mcpServers: Record<string, McpServerConfig> = {};\n if (Array.isArray(params.mcpServers)) {\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(\n server.headers.map((e) => [e.name, e.value]),\n )\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\n const server = createMcpServer(this, sessionId, this.clientCapabilities);\n mcpServers.acp = {\n type: \"sdk\",\n name: \"acp\",\n instance: server,\n };\n\n const permissionMode = \"default\";\n\n this.logger.info(\"Resuming session\", {\n cwd: params.cwd,\n sdkSessionId,\n persistence,\n });\n const options: Options = {\n cwd: params.cwd,\n includePartialMessages: true,\n mcpServers,\n systemPrompt: { type: \"preset\", preset: \"claude_code\" },\n settingSources: [\"user\", \"project\", \"local\"],\n allowDangerouslySkipPermissions: !IS_ROOT,\n permissionMode,\n canUseTool: this.canUseTool(sessionId),\n stderr: (err) => this.logger.error(err),\n // Use \"node\" to resolve via PATH where a symlink to Electron exists.\n // This avoids launching the Electron binary directly from the app bundle,\n // which can cause dock icons to appear on macOS even with ELECTRON_RUN_AS_NODE.\n executable: \"node\",\n // Prevent spawned Electron processes from showing in dock/tray.\n // Must merge with process.env since SDK replaces rather than merges.\n env: { ...process.env, ELECTRON_RUN_AS_NODE: \"1\" },\n ...(process.env.CLAUDE_CODE_EXECUTABLE && {\n pathToClaudeCodeExecutable: process.env.CLAUDE_CODE_EXECUTABLE,\n }),\n // Resume from SDK session if available\n ...(sdkSessionId && { resume: sdkSessionId }),\n hooks: {\n PostToolUse: [\n {\n hooks: [createPostToolUseHook(this.logger)],\n },\n ],\n },\n };\n\n // Clear statsig cache before creating query to avoid input_examples bug\n clearStatsigCache();\n\n const q = query({\n prompt: input,\n options,\n });\n\n const availableCommands = await getAvailableSlashCommands(q);\n\n const newSession = this.createSession(\n sessionId,\n q,\n input,\n permissionMode,\n );\n\n // Store SDK session ID if resuming\n if (sdkSessionId) {\n newSession.sdkSessionId = sdkSessionId;\n }\n\n // Register for future persistence\n if (persistence && this.sessionStore) {\n this.sessionStore.register(sessionId, persistence);\n }\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 return {};\n }\n}\n\nasync function getAvailableModels(query: Query): Promise<SessionModelState> {\n const models = await query.supportedModels();\n\n // Query doesn't give us access to the currently selected model, so we just choose the first model in the list.\n const currentModel = models[0];\n await query.setModel(currentModel.value);\n\n const availableModels = models.map((model) => ({\n modelId: model.value,\n name: model.displayName,\n description: model.description,\n }));\n\n return {\n availableModels,\n currentModelId: currentModel.value,\n };\n}\n\nasync function getAvailableSlashCommands(\n query: Query,\n): Promise<AvailableCommand[]> {\n const UNSUPPORTED_COMMANDS = [\n \"context\",\n \"cost\",\n \"login\",\n \"logout\",\n \"output-style:new\",\n \"release-notes\",\n \"todos\",\n ];\n const commands = await query.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\nfunction formatUriAsLink(uri: string): string {\n try {\n if (uri.startsWith(\"file://\")) {\n const path = uri.slice(7); // Remove \"file://\"\n const name = path.split(\"/\").pop() || path;\n return `[@${name}](${uri})`;\n } else 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\nexport function promptToClaude(prompt: PromptRequest): SDKUserMessage {\n const content: any[] = [];\n const context: any[] = [];\n\n for (const chunk of prompt.prompt) {\n switch (chunk.type) {\n case \"text\": {\n let text = chunk.text;\n // change /mcp:server:command args -> /server:command (MCP) args\n const mcpMatch = text.match(/^\\/mcp:([^:\\s]+):(\\S+)(\\s+.*)?$/);\n if (mcpMatch) {\n const [, server, command, args] = mcpMatch;\n text = `/${server}:${command} (MCP)${args || \"\"}`;\n }\n content.push({ type: \"text\", text });\n break;\n }\n case \"resource_link\": {\n const formattedUri = formatUriAsLink(chunk.uri);\n content.push({\n type: \"text\",\n text: formattedUri,\n });\n break;\n }\n case \"resource\": {\n if (\"text\" in chunk.resource) {\n const formattedUri = formatUriAsLink(chunk.resource.uri);\n content.push({\n type: \"text\",\n text: formattedUri,\n });\n context.push({\n type: \"text\",\n text: `\\n<context ref=\"${chunk.resource.uri}\">\\n${chunk.resource.text}\\n</context>`,\n });\n }\n // Ignore blob resources (unsupported)\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,\n },\n });\n } else if (chunk.uri?.startsWith(\"http\")) {\n content.push({\n type: \"image\",\n source: {\n type: \"url\",\n url: chunk.uri,\n },\n });\n }\n break;\n // Ignore audio and other unsupported types\n default:\n break;\n }\n }\n\n content.push(...context);\n\n return {\n type: \"user\",\n message: {\n role: \"user\",\n content: content,\n },\n session_id: prompt.sessionId,\n parent_tool_use_id: null,\n };\n}\n\n/**\n * Convert an SDKAssistantMessage (Claude) to a SessionNotification (ACP).\n * Only handles text, image, and thinking chunks for now.\n */\nexport function toAcpNotifications(\n content:\n | string\n | ContentBlockParam[]\n | BetaContentBlock[]\n | BetaRawContentBlockDelta[],\n role: \"assistant\" | \"user\",\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:\n role === \"assistant\" ? \"agent_message_chunk\" : \"user_message_chunk\",\n content: {\n type: \"text\",\n text: content,\n },\n },\n },\n ];\n }\n\n const output = [];\n // Only handle the first chunk for streaming; extend as needed for batching\n for (const chunk of content) {\n let update: SessionNotification[\"update\"] | null = null;\n switch (chunk.type) {\n case \"text\":\n case \"text_delta\":\n update = {\n sessionUpdate:\n role === \"assistant\" ? \"agent_message_chunk\" : \"user_message_chunk\",\n content: {\n type: \"text\",\n text: chunk.text,\n },\n };\n break;\n case \"image\":\n update = {\n sessionUpdate:\n role === \"assistant\" ? \"agent_message_chunk\" : \"user_message_chunk\",\n content: {\n type: \"image\",\n data: chunk.source.type === \"base64\" ? chunk.source.data : \"\",\n mimeType:\n chunk.source.type === \"base64\" ? chunk.source.media_type : \"\",\n uri: chunk.source.type === \"url\" ? chunk.source.url : undefined,\n },\n };\n break;\n case \"thinking\":\n case \"thinking_delta\":\n update = {\n sessionUpdate: \"agent_thought_chunk\",\n content: {\n type: \"text\",\n text: chunk.thinking,\n },\n };\n break;\n case \"tool_use\":\n case \"server_tool_use\":\n case \"mcp_tool_use\": {\n toolUseCache[chunk.id] = chunk;\n if (chunk.name === \"TodoWrite\") {\n // @ts-expect-error - sometimes input is empty object\n if (Array.isArray(chunk.input.todos)) {\n update = {\n sessionUpdate: \"plan\",\n entries: planEntries(chunk.input as { todos: ClaudePlanEntry[] }),\n };\n }\n } else {\n // Register hook callback to receive the structured output from the hook\n registerHookCallback(chunk.id, {\n onPostToolUseHook: async (toolUseId, _toolInput, toolResponse) => {\n const toolUse = toolUseCache[toolUseId];\n if (toolUse) {\n const update: SessionNotification[\"update\"] = {\n _meta: {\n claudeCode: {\n toolResponse,\n toolName: toolUse.name,\n },\n } satisfies ToolUpdateMeta,\n toolCallId: toolUseId,\n sessionUpdate: \"tool_call_update\",\n };\n await client.sessionUpdate({\n sessionId,\n update,\n });\n } else {\n logger.error(\n `[claude-code-acp] 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 if we can't turn it to JSON\n }\n update = {\n _meta: {\n claudeCode: {\n toolName: chunk.name,\n },\n } satisfies ToolUpdateMeta,\n toolCallId: chunk.id,\n sessionUpdate: \"tool_call\",\n rawInput,\n status: \"pending\",\n ...toolInfoFromToolUse(chunk, fileContentCache, logger),\n };\n }\n break;\n }\n\n case \"tool_result\":\n case \"tool_search_tool_result\":\n case \"web_fetch_tool_result\":\n case \"web_search_tool_result\":\n case \"code_execution_tool_result\":\n case \"bash_code_execution_tool_result\":\n case \"text_editor_code_execution_tool_result\":\n case \"mcp_tool_result\": {\n const toolUse = toolUseCache[chunk.tool_use_id];\n if (!toolUse) {\n logger.error(\n `[claude-code-acp] Got a tool result for tool use that wasn't tracked: ${chunk.tool_use_id}`,\n );\n break;\n }\n\n if (toolUse.name !== \"TodoWrite\") {\n update = {\n _meta: {\n claudeCode: {\n toolName: toolUse.name,\n },\n } satisfies ToolUpdateMeta,\n toolCallId: chunk.tool_use_id,\n sessionUpdate: \"tool_call_update\",\n status:\n \"is_error\" in chunk && chunk.is_error ? \"failed\" : \"completed\",\n ...toolUpdateFromToolResult(chunk, toolUseCache[chunk.tool_use_id]),\n };\n }\n break;\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 break;\n\n default:\n unreachable(chunk, logger);\n break;\n }\n if (update) {\n output.push({ sessionId, update });\n }\n }\n\n return output;\n}\n\nexport function 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 // No content\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 type AcpConnectionConfig = {\n sessionStore?: SessionStore;\n sessionId?: string;\n taskId?: string;\n};\n\nexport type InProcessAcpConnection = {\n agentConnection: AgentSideConnection;\n clientStreams: StreamPair;\n};\n\nexport function createAcpConnection(\n config: AcpConnectionConfig = {},\n): InProcessAcpConnection {\n const logger = new Logger({ debug: true, prefix: \"[AcpConnection]\" });\n const streams = createBidirectionalStreams();\n\n const { sessionStore } = config;\n\n // Tap both streams for automatic persistence\n // All messages (bidirectional) will be persisted as they flow through\n let agentWritable = streams.agent.writable;\n let clientWritable = streams.client.writable;\n\n if (config.sessionId && sessionStore) {\n // Register session for persistence BEFORE tapping streams\n // This ensures all messages from the start get persisted\n if (!sessionStore.isRegistered(config.sessionId)) {\n sessionStore.register(config.sessionId, {\n taskId: config.taskId ?? config.sessionId,\n runId: config.sessionId,\n logUrl: \"\", // Will be updated when we get the real logUrl\n });\n }\n\n // Tap agent→client stream\n agentWritable = createTappedWritableStream(streams.agent.writable, {\n onMessage: (line) => {\n sessionStore.appendRawLine(config.sessionId!, line);\n },\n logger,\n });\n\n // Tap client→agent stream\n clientWritable = createTappedWritableStream(streams.client.writable, {\n onMessage: (line) => {\n sessionStore.appendRawLine(config.sessionId!, line);\n },\n logger,\n });\n } else {\n logger.info(\"Tapped streams NOT enabled\", {\n hasSessionId: !!config.sessionId,\n hasSessionStore: !!sessionStore,\n });\n }\n\n const agentStream = ndJsonStream(agentWritable, streams.agent.readable);\n\n const agentConnection = new AgentSideConnection(\n (client) => new ClaudeAcpAgent(client, sessionStore),\n agentStream,\n );\n\n return {\n agentConnection,\n clientStreams: {\n readable: streams.client.readable,\n writable: clientWritable,\n },\n };\n}\n","import type { LogLevel as LogLevelType, OnLogCallback } from \"../types.js\";\n\n/**\n * Simple logger utility with configurable debug mode and external log forwarding\n */\nexport enum LogLevel {\n ERROR = 0,\n WARN = 1,\n INFO = 2,\n DEBUG = 3,\n}\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 setDebug(enabled: boolean) {\n this.debugEnabled = enabled;\n }\n\n setOnLog(onLog: OnLogCallback | undefined) {\n this.onLog = 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 log(level: LogLevelType, message: string, data?: unknown, scope?: string) {\n const originalScope = this.scope;\n if (scope) {\n this.scope = scope;\n }\n this.emitLog(level, message, data);\n this.scope = originalScope;\n }\n\n /**\n * Create a child logger with additional prefix and scope\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 { Logger } from \"./logger.js\";\n\ntype MessageCallback = (line: string) => void;\n\nexport interface TappedStreamOptions {\n onMessage: MessageCallback;\n logger?: Logger;\n}\n\n/**\n * Creates a WritableStream wrapper that taps all newline-delimited messages,\n * forwarding each complete line for persistence.\n *\n * This aligns with ACP's transport model - all messages flow through\n * newline-delimited JSON-RPC streams, so we intercept at the transport layer\n * and persist everything.\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 // Decode and buffer\n buffer += decoder.decode(chunk, { stream: true });\n\n // Process complete lines (newline-delimited)\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 // Forward to underlying stream\n const writer = underlying.getWriter();\n await writer.write(chunk);\n writer.releaseLock();\n },\n async close() {\n const writer = underlying.getWriter();\n await writer.close();\n writer.releaseLock();\n },\n async abort(reason: unknown) {\n logger?.warn(\"Tapped stream aborted\", { reason });\n const writer = underlying.getWriter();\n await writer.abort(reason);\n writer.releaseLock();\n },\n });\n}\n","{\n \"name\": \"@posthog/agent\",\n \"version\": \"1.28.0\",\n \"repository\": \"https://github.com/PostHog/array\",\n \"description\": \"TypeScript agent framework wrapping Claude Agent SDK with Git-based task execution for PostHog\",\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.js\"\n }\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 \"typecheck\": \"pnpm exec tsc --noEmit\",\n \"example\": \"tsx example.ts\",\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 \"minimatch\": \"^10.0.3\",\n \"tsup\": \"^8.5.1\",\n \"tsx\": \"^4.20.6\",\n \"typescript\": \"^5.5.0\"\n },\n \"dependencies\": {\n \"@agentclientprotocol/sdk\": \"^0.5.1\",\n \"@anthropic-ai/claude-agent-sdk\": \"^0.1.55\",\n \"@anthropic-ai/sdk\": \"^0.71.0\",\n \"@modelcontextprotocol/sdk\": \"^1.23.0\",\n \"diff\": \"^8.0.2\",\n \"dotenv\": \"^17.2.3\",\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 { randomBytes } from \"node:crypto\";\nimport type {\n ClientCapabilities,\n TerminalOutputResponse,\n} from \"@agentclientprotocol/sdk\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport * as diff from \"diff\";\nimport { z } from \"zod\";\nimport { Logger } from \"@/utils/logger.js\";\nimport type { ClaudeAcpAgent } from \"./claude.js\";\nimport { extractLinesWithByteLimit, sleep, unreachable } from \"./utils.js\";\n\nexport const 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\nconst defaults = { maxFileSize: 50000, linesToRead: 2000 };\n\nconst unqualifiedToolNames = {\n read: \"Read\",\n edit: \"Edit\",\n write: \"Write\",\n bash: \"Bash\",\n killShell: \"KillShell\",\n bashOutput: \"BashOutput\",\n};\n\nconst SERVER_PREFIX = \"mcp__acp__\";\nexport const toolNames = {\n read: SERVER_PREFIX + unqualifiedToolNames.read,\n edit: SERVER_PREFIX + unqualifiedToolNames.edit,\n write: SERVER_PREFIX + unqualifiedToolNames.write,\n bash: SERVER_PREFIX + unqualifiedToolNames.bash,\n killShell: SERVER_PREFIX + unqualifiedToolNames.killShell,\n bashOutput: SERVER_PREFIX + unqualifiedToolNames.bashOutput,\n};\n\nexport const EDIT_TOOL_NAMES = [toolNames.edit, toolNames.write];\n\nexport function createMcpServer(\n agent: ClaudeAcpAgent,\n sessionId: string,\n clientCapabilities: ClientCapabilities | undefined,\n): McpServer {\n // Create MCP server\n const server = new McpServer(\n { name: \"acp\", version: \"1.0.0\" },\n { capabilities: { tools: {} } },\n );\n\n if (clientCapabilities?.fs?.readTextFile) {\n server.registerTool(\n unqualifiedToolNames.read,\n {\n title: unqualifiedToolNames.read,\n description: `Reads the content of the given file in the project.\n\nIn sessions with ${toolNames.read} always use it instead of Read as it contains the most up-to-date contents.\n\nReads a file from the local filesystem. If the User provides a path to a file assume that path is valid. It is okay to read a file that does not exist; an error will be returned.\n\nUsage:\n- The file_path parameter must be an absolute path, not a relative path\n- By default, it reads up to ${defaults.linesToRead} lines starting from the beginning of the file\n- You can optionally specify a line offset and limit (especially handy for long files), but it's recommended to read the whole file by not providing these parameters\n- Any files larger than ${defaults.maxFileSize} bytes will be truncated\n- This tool allows Claude Code to read images (eg PNG, JPG, etc). When reading an image file the contents are presented visually as Claude Code is a multimodal LLM.\n- This tool can only read files, not directories. To read a directory, use an ls command via the ${toolNames.bash} tool.\n- You have the capability to call multiple tools in a single response. It is always better to speculatively read multiple files as a batch that are potentially useful.`,\n inputSchema: {\n file_path: z\n .string()\n .describe(\"The absolute path to the file to read\"),\n offset: z\n .number()\n .optional()\n .default(1)\n .describe(\n \"The line number to start reading from. Only provide if the file is too large to read at once\",\n ),\n limit: z\n .number()\n .optional()\n .default(defaults.linesToRead)\n .describe(\n `The number of lines to read. Only provide if the file is too large to read at once.`,\n ),\n },\n annotations: {\n title: \"Read file\",\n readOnlyHint: true,\n destructiveHint: false,\n openWorldHint: false,\n idempotentHint: false,\n },\n },\n async (input) => {\n try {\n const session = agent.sessions[sessionId];\n if (!session) {\n return {\n content: [\n {\n type: \"text\",\n text: \"The user has left the building\",\n },\n ],\n };\n }\n\n const readResponse = await agent.readTextFile({\n sessionId,\n path: input.file_path,\n line: input.offset,\n limit: input.limit,\n });\n\n if (typeof readResponse?.content !== \"string\") {\n throw new Error(`No file contents for ${input.file_path}.`);\n }\n\n // Extract lines with byte limit enforcement\n const result = extractLinesWithByteLimit(\n readResponse.content,\n defaults.maxFileSize,\n );\n\n // Construct informative message about what was read\n let readInfo = \"\";\n if (input.offset > 1 || result.wasLimited) {\n readInfo = \"\\n\\n<file-read-info>\";\n\n if (result.wasLimited) {\n readInfo += `Read ${result.linesRead} lines (hit 50KB limit). `;\n } else {\n readInfo += `Read lines ${input.offset}-${result.linesRead}. `;\n }\n\n if (result.wasLimited) {\n readInfo += `Continue with offset=${result.linesRead}.`;\n }\n\n readInfo += \"</file-read-info>\";\n }\n\n return {\n content: [\n {\n type: \"text\",\n text: result.content + readInfo + SYSTEM_REMINDER,\n },\n ],\n };\n } catch (error: any) {\n return {\n content: [\n {\n type: \"text\",\n text: `Reading file failed: ${error.message}`,\n },\n ],\n };\n }\n },\n );\n }\n\n if (clientCapabilities?.fs?.writeTextFile) {\n server.registerTool(\n unqualifiedToolNames.write,\n {\n title: unqualifiedToolNames.write,\n description: `Writes a file to the local filesystem..\n\nIn sessions with ${toolNames.write} always use it instead of Write as it will\nallow the user to conveniently review changes.\n\nUsage:\n- This tool will overwrite the existing file if there is one at the provided path.\n- If this is an existing file, you MUST use the ${toolNames.read} tool first to read the file's contents. This tool will fail if you did not read the file first.\n- ALWAYS prefer editing existing files in the codebase. NEVER write new files unless explicitly required.\n- NEVER proactively create documentation files (*.md) or README files. Only create documentation files if explicitly requested by the User.\n- Only use emojis if the user explicitly requests it. Avoid writing emojis to files unless asked.`,\n inputSchema: {\n file_path: z\n .string()\n .describe(\n \"The absolute path to the file to write (must be absolute, not relative)\",\n ),\n content: z.string().describe(\"The content to write to the file\"),\n },\n annotations: {\n title: \"Write file\",\n readOnlyHint: false,\n destructiveHint: false,\n openWorldHint: false,\n idempotentHint: false,\n },\n },\n async (input) => {\n try {\n const session = agent.sessions[sessionId];\n if (!session) {\n return {\n content: [\n {\n type: \"text\",\n text: \"The user has left the building\",\n },\n ],\n };\n }\n await agent.writeTextFile({\n sessionId,\n path: input.file_path,\n content: input.content,\n });\n\n return {\n content: [],\n };\n } catch (error: any) {\n return {\n content: [\n {\n type: \"text\",\n text: `Writing file failed: ${error.message}`,\n },\n ],\n };\n }\n },\n );\n\n server.registerTool(\n unqualifiedToolNames.edit,\n {\n title: unqualifiedToolNames.edit,\n description: `Performs exact string replacements in files.\n\nIn sessions with ${toolNames.edit} always use it instead of Edit as it will\nallow the user to conveniently review changes.\n\nUsage:\n- You must use your \\`${toolNames.read}\\` tool at least once in the conversation before editing. This tool will error if you attempt an edit without reading the file.\n- When editing text from Read tool output, ensure you preserve the exact indentation (tabs/spaces) as it appears.\n- ALWAYS prefer editing existing files in the codebase. NEVER write new files unless explicitly required.\n- Only use emojis if the user explicitly requests it. Avoid adding emojis to files unless asked.\n- The edit will FAIL if \\`old_string\\` is not unique in the file. Either provide a larger string with more surrounding context to make it unique or use \\`replace_all\\` to change every instance of \\`old_string\\`.\n- Use \\`replace_all\\` for replacing and renaming strings across the file. This parameter is useful if you want to rename a variable for instance.`,\n inputSchema: {\n file_path: z\n .string()\n .describe(\"The absolute path to the file to modify\"),\n old_string: z.string().describe(\"The text to replace\"),\n new_string: z\n .string()\n .describe(\n \"The text to replace it with (must be different from old_string)\",\n ),\n replace_all: z\n .boolean()\n .default(false)\n .optional()\n .describe(\"Replace all occurences of old_string (default false)\"),\n },\n annotations: {\n title: \"Edit file\",\n readOnlyHint: false,\n destructiveHint: false,\n openWorldHint: false,\n idempotentHint: false,\n },\n },\n async (input) => {\n try {\n const session = agent.sessions[sessionId];\n if (!session) {\n return {\n content: [\n {\n type: \"text\",\n text: \"The user has left the building\",\n },\n ],\n };\n }\n\n const readResponse = await agent.readTextFile({\n sessionId,\n path: input.file_path,\n });\n\n if (typeof readResponse?.content !== \"string\") {\n throw new Error(`No file contents for ${input.file_path}.`);\n }\n\n const { newContent } = replaceAndCalculateLocation(\n readResponse.content,\n [\n {\n oldText: input.old_string,\n newText: input.new_string,\n replaceAll: input.replace_all,\n },\n ],\n );\n\n const patch = diff.createPatch(\n input.file_path,\n readResponse.content,\n newContent,\n );\n\n await agent.writeTextFile({\n sessionId,\n path: input.file_path,\n content: newContent,\n });\n\n return {\n content: [\n {\n type: \"text\",\n text: patch,\n },\n ],\n };\n } catch (error: any) {\n return {\n content: [\n {\n type: \"text\",\n text: `Editing file failed: ${error?.message ?? String(error)}`,\n },\n ],\n };\n }\n },\n );\n }\n\n if (agent.clientCapabilities?.terminal) {\n server.registerTool(\n unqualifiedToolNames.bash,\n {\n title: unqualifiedToolNames.bash,\n description: `Executes a bash command\n\nIn sessions with ${toolNames.bash} always use it instead of Bash`,\n inputSchema: {\n command: z.string().describe(\"The command to execute\"),\n timeout: z\n .number()\n .default(2 * 60 * 1000)\n .describe(\n `Optional timeout in milliseconds (max ${2 * 60 * 1000})`,\n ),\n description: z\n .string()\n .optional()\n .describe(`Clear, concise description of what this command does in 5-10 words, in active voice. Examples:\nInput: ls\nOutput: List files in current directory\n\nInput: git status\nOutput: Show working tree status\n\nInput: npm install\nOutput: Install package dependencies\n\nInput: mkdir foo\nOutput: Create directory 'foo'`),\n run_in_background: z\n .boolean()\n .default(false)\n .describe(\n `Set to true to run this command in the background. The tool returns an \\`id\\` that can be used with the \\`${toolNames.bashOutput}\\` tool to retrieve the current output, or the \\`${toolNames.killShell}\\` tool to stop it early.`,\n ),\n },\n },\n async (input, extra) => {\n const session = agent.sessions[sessionId];\n if (!session) {\n return {\n content: [\n {\n type: \"text\",\n text: \"The user has left the building\",\n },\n ],\n };\n }\n\n const toolCallId = extra._meta?.[\"claudecode/toolUseId\"];\n\n if (typeof toolCallId !== \"string\") {\n throw new Error(\"No tool call ID found\");\n }\n\n if (\n !agent.clientCapabilities?.terminal ||\n !agent.client.createTerminal\n ) {\n throw new Error(\"unreachable\");\n }\n\n const handle = await agent.client.createTerminal({\n command: input.command,\n env: [{ name: \"CLAUDECODE\", value: \"1\" }],\n sessionId,\n outputByteLimit: 32_000,\n });\n\n await agent.client.sessionUpdate({\n sessionId,\n update: {\n sessionUpdate: \"tool_call_update\",\n toolCallId,\n status: \"in_progress\",\n title: input.description,\n content: [{ type: \"terminal\", terminalId: handle.id }],\n },\n });\n\n const abortPromise = new Promise((resolve) => {\n if (extra.signal.aborted) {\n resolve(null);\n } else {\n extra.signal.addEventListener(\"abort\", () => {\n resolve(null);\n });\n }\n });\n\n const statusPromise = Promise.race([\n handle\n .waitForExit()\n .then((exitStatus) => ({ status: \"exited\" as const, exitStatus })),\n abortPromise.then(() => ({\n status: \"aborted\" as const,\n exitStatus: null,\n })),\n sleep(input.timeout).then(async () => {\n if (agent.backgroundTerminals[handle.id]?.status === \"started\") {\n await handle.kill();\n }\n return { status: \"timedOut\" as const, exitStatus: null };\n }),\n ]);\n\n if (input.run_in_background) {\n agent.backgroundTerminals[handle.id] = {\n handle,\n lastOutput: null,\n status: \"started\",\n };\n\n statusPromise.then(async ({ status, exitStatus }) => {\n const bgTerm = agent.backgroundTerminals[handle.id];\n\n if (bgTerm.status !== \"started\") {\n return;\n }\n\n const currentOutput = await handle.currentOutput();\n\n agent.backgroundTerminals[handle.id] = {\n status,\n pendingOutput: {\n ...currentOutput,\n output: stripCommonPrefix(\n bgTerm.lastOutput?.output ?? \"\",\n currentOutput.output,\n ),\n exitStatus: exitStatus ?? currentOutput.exitStatus,\n },\n };\n\n return handle.release();\n });\n\n return {\n content: [\n {\n type: \"text\",\n text: `Command started in background with id: ${handle.id}`,\n },\n ],\n };\n }\n\n await using terminal = handle;\n\n const { status } = await statusPromise;\n\n if (status === \"aborted\") {\n return {\n content: [{ type: \"text\", text: \"Tool cancelled by user\" }],\n };\n }\n\n const output = await terminal.currentOutput();\n\n return {\n content: [{ type: \"text\", text: toolCommandOutput(status, output) }],\n };\n },\n );\n\n server.registerTool(\n unqualifiedToolNames.bashOutput,\n {\n title: unqualifiedToolNames.bashOutput,\n description: `- Retrieves output from a running or completed background bash shell\n- Takes a shell_id parameter identifying the shell\n- Always returns only new output since the last check\n- Returns stdout and stderr output along with shell status\n- Use this tool when you need to monitor or check the output of a long-running shell\n\nIn sessions with ${toolNames.bashOutput} always use it instead of BashOutput.`,\n inputSchema: {\n shell_id: z\n .string()\n .describe(\n `The id of the background bash command as returned by \\`${toolNames.bash}\\``,\n ),\n },\n },\n async (input) => {\n const bgTerm = agent.backgroundTerminals[input.shell_id];\n\n if (!bgTerm) {\n throw new Error(`Unknown shell ${input.shell_id}`);\n }\n\n if (bgTerm.status === \"started\") {\n const newOutput = await bgTerm.handle.currentOutput();\n const strippedOutput = stripCommonPrefix(\n bgTerm.lastOutput?.output ?? \"\",\n newOutput.output,\n );\n bgTerm.lastOutput = newOutput;\n\n return {\n content: [\n {\n type: \"text\",\n text: toolCommandOutput(bgTerm.status, {\n ...newOutput,\n output: strippedOutput,\n }),\n },\n ],\n };\n } else {\n return {\n content: [\n {\n type: \"text\",\n text: toolCommandOutput(bgTerm.status, bgTerm.pendingOutput),\n },\n ],\n };\n }\n },\n );\n\n server.registerTool(\n unqualifiedToolNames.killShell,\n {\n title: unqualifiedToolNames.killShell,\n description: `- Kills a running background bash shell by its ID\n- Takes a shell_id parameter identifying the shell to kill\n- Returns a success or failure status\n- Use this tool when you need to terminate a long-running shell\n\nIn sessions with ${toolNames.killShell} always use it instead of KillShell.`,\n inputSchema: {\n shell_id: z\n .string()\n .describe(\n `The id of the background bash command as returned by \\`${toolNames.bash}\\``,\n ),\n },\n },\n async (input) => {\n const bgTerm = agent.backgroundTerminals[input.shell_id];\n\n if (!bgTerm) {\n throw new Error(`Unknown shell ${input.shell_id}`);\n }\n\n switch (bgTerm.status) {\n case \"started\": {\n await bgTerm.handle.kill();\n const currentOutput = await bgTerm.handle.currentOutput();\n agent.backgroundTerminals[bgTerm.handle.id] = {\n status: \"killed\",\n pendingOutput: {\n ...currentOutput,\n output: stripCommonPrefix(\n bgTerm.lastOutput?.output ?? \"\",\n currentOutput.output,\n ),\n },\n };\n await bgTerm.handle.release();\n\n return {\n content: [{ type: \"text\", text: \"Command killed successfully.\" }],\n };\n }\n case \"aborted\":\n return {\n content: [{ type: \"text\", text: \"Command aborted by user.\" }],\n };\n case \"exited\":\n return {\n content: [{ type: \"text\", text: \"Command had already exited.\" }],\n };\n case \"killed\":\n return {\n content: [{ type: \"text\", text: \"Command was already killed.\" }],\n };\n case \"timedOut\":\n return {\n content: [{ type: \"text\", text: \"Command killed by timeout.\" }],\n };\n default: {\n unreachable(bgTerm, new Logger({ prefix: \"[McpServer]\" }));\n throw new Error(\"Unexpected background terminal status\");\n }\n }\n },\n );\n }\n\n return server;\n}\n\nfunction stripCommonPrefix(a: string, b: string): string {\n let i = 0;\n while (i < a.length && i < b.length && a[i] === b[i]) {\n i++;\n }\n return b.slice(i);\n}\n\nfunction toolCommandOutput(\n status: \"started\" | \"aborted\" | \"exited\" | \"killed\" | \"timedOut\",\n output: TerminalOutputResponse,\n): string {\n const { exitStatus, output: commandOutput, truncated } = output;\n\n let toolOutput = \"\";\n\n switch (status) {\n case \"started\":\n case \"exited\": {\n if (exitStatus && (exitStatus.exitCode ?? null) === null) {\n toolOutput += `Interrupted by the user. `;\n }\n break;\n }\n case \"killed\":\n toolOutput += `Killed. `;\n break;\n case \"timedOut\":\n toolOutput += `Timed out. `;\n break;\n case \"aborted\":\n break;\n default: {\n const unreachable: never = status;\n return unreachable;\n }\n }\n\n if (exitStatus) {\n if (typeof exitStatus.exitCode === \"number\") {\n toolOutput += `Exited with code ${exitStatus.exitCode}.`;\n }\n\n if (typeof exitStatus.signal === \"string\") {\n toolOutput += `Signal \\`${exitStatus.signal}\\`. `;\n }\n\n toolOutput += \"Final output:\\n\\n\";\n } else {\n toolOutput += \"New output:\\n\\n\";\n }\n\n toolOutput += commandOutput;\n\n if (truncated) {\n toolOutput += `\\n\\nCommand output was too long, so it was truncated to ${commandOutput.length} bytes.`;\n }\n\n return toolOutput;\n}\n\n/**\n * Replace text in a file and calculate the line numbers where the edits occurred.\n *\n * @param fileContent - The full file content\n * @param edits - Array of edit operations to apply sequentially\n * @returns the new content and the line numbers where replacements occurred in the final content\n */\nexport function replaceAndCalculateLocation(\n fileContent: string,\n edits: Array<{\n oldText: string;\n newText: string;\n replaceAll?: boolean;\n }>,\n): { newContent: string; lineNumbers: number[] } {\n let currentContent = fileContent;\n\n // Use unique markers to track where replacements happen\n const markerPrefix = `__REPLACE_MARKER_${randomBytes(5).toString(\"hex\")}_`;\n let markerCounter = 0;\n const markers: string[] = [];\n\n // Apply edits sequentially, inserting markers at replacement positions\n for (const edit of edits) {\n // Skip empty oldText\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 // Replace all occurrences with marker + newText\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 // Add content before the match\n parts.push(currentContent.substring(lastIndex, index));\n\n // Add marker and replacement\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 // Add remaining content\n parts.push(currentContent.substring(lastIndex));\n currentContent = parts.join(\"\");\n } else {\n // Replace first occurrence only\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 // Find line numbers where markers appear in the content\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 // Remove all markers from the final content\n let finalContent = currentContent;\n for (const marker of markers) {\n finalContent = finalContent.replace(marker, \"\");\n }\n\n // Dedupe and sort line numbers\n const uniqueLineNumbers = [...new Set(lineNumbers)].sort();\n\n return { newContent: finalContent, lineNumbers: uniqueLineNumbers };\n}\n","// A pushable async iterable: allows you to push items and consume them with for-await.\n\nimport { readFileSync } from \"node:fs\";\nimport { platform } from \"node:os\";\nimport type { Readable, Writable } from \"node:stream\";\nimport { ReadableStream, WritableStream } from \"node:stream/web\";\nimport type { Logger } from \"@/utils/logger.js\";\n\n// Useful for bridging push-based and async-iterator-based code.\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\n// Helper to convert Node.js streams to Web Streams\nexport function nodeToWebWritable(\n nodeStream: Writable,\n): WritableStream<Uint8Array> {\n return new WritableStream<Uint8Array>({\n write(chunk) {\n return new Promise<void>((resolve, reject) => {\n nodeStream.write(Buffer.from(chunk), (err) => {\n if (err) {\n reject(err);\n } else {\n resolve();\n }\n });\n });\n },\n });\n}\n\nexport function nodeToWebReadable(\n nodeStream: Readable,\n): 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\", () => controller.close());\n nodeStream.on(\"error\", (err) => controller.error(err));\n },\n });\n}\n\nexport function unreachable(value: never, logger: Logger) {\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\nexport function sleep(time: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, time));\n}\n\ninterface ManagedSettings {\n permissions?: {\n allow?: string[];\n deny?: string[];\n };\n env?: Record<string, string>;\n}\n\n// Following the rules in https://docs.anthropic.com/en/docs/claude-code/settings#settings-files\n// This can be removed once the SDK supports it natively.\nfunction getManagedSettingsPath(): string {\n const os = platform();\n switch (os) {\n case \"darwin\":\n return \"/Library/Application Support/ClaudeCode/managed-settings.json\";\n case \"linux\": // including WSL\n return \"/etc/claude-code/managed-settings.json\";\n case \"win32\":\n return \"C:\\\\ProgramData\\\\ClaudeCode\\\\managed-settings.json\";\n default:\n return \"/etc/claude-code/managed-settings.json\";\n }\n}\n\nexport function loadManagedSettings(): ManagedSettings | null {\n try {\n return JSON.parse(\n readFileSync(getManagedSettingsPath(), \"utf8\"),\n ) as ManagedSettings;\n } catch {\n return null;\n }\n}\n\nexport function applyEnvironmentSettings(settings: ManagedSettings): void {\n if (settings.env) {\n for (const [key, value] of Object.entries(settings.env)) {\n process.env[key] = value;\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\nexport interface ExtractLinesResult {\n content: string;\n wasLimited: boolean;\n linesRead: number;\n}\n\n/**\n * Extracts lines from file content with byte limit enforcement.\n *\n * @param fullContent - The complete file content\n * @param maxContentLength - Maximum number of UTF-16 Code Units to return\n * @returns Object containing extracted content and metadata\n */\nexport function extractLinesWithByteLimit(\n fullContent: string,\n maxContentLength: number,\n): ExtractLinesResult {\n if (fullContent === \"\") {\n return {\n content: \"\",\n wasLimited: false,\n linesRead: 1,\n };\n }\n\n let linesSeen = 0;\n let index = 0;\n linesSeen = 0;\n\n let contentLength = 0;\n let wasLimited = false;\n\n while (true) {\n const nextIndex = fullContent.indexOf(\"\\n\", index);\n\n if (nextIndex < 0) {\n // Last line in file (no trailing newline)\n if (linesSeen > 0 && fullContent.length > maxContentLength) {\n wasLimited = true;\n break;\n }\n linesSeen += 1;\n contentLength = fullContent.length;\n break;\n } else {\n // Line with newline - include up to the newline\n const newContentLength = nextIndex + 1;\n if (linesSeen > 0 && newContentLength > maxContentLength) {\n wasLimited = true;\n break;\n }\n linesSeen += 1;\n contentLength = newContentLength;\n index = newContentLength;\n }\n }\n\n return {\n content: fullContent.slice(0, contentLength),\n wasLimited,\n linesRead: linesSeen,\n };\n}\n","import type {\n PlanEntry,\n ToolCallContent,\n ToolCallLocation,\n ToolKind,\n} from \"@agentclientprotocol/sdk\";\nimport type { HookCallback, HookInput } from \"@anthropic-ai/claude-agent-sdk\";\nimport type {\n ToolResultBlockParam,\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\";\nimport { Logger } from \"@/utils/logger.js\";\nimport {\n replaceAndCalculateLocation,\n SYSTEM_REMINDER,\n toolNames,\n} from \"./mcp-server.js\";\n\ninterface ToolInfo {\n title: string;\n kind: ToolKind;\n content: ToolCallContent[];\n locations?: ToolCallLocation[];\n}\n\ninterface ToolUpdate {\n title?: string;\n content?: ToolCallContent[];\n locations?: ToolCallLocation[];\n}\n\nexport function toolInfoFromToolUse(\n toolUse: any,\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;\n\n switch (name) {\n case \"Task\":\n return {\n title: input?.description ? input.description : \"Task\",\n kind: \"think\",\n content: input?.prompt\n ? [\n {\n type: \"content\",\n content: { type: \"text\", text: input.prompt },\n },\n ]\n : [],\n };\n\n case \"NotebookRead\":\n return {\n title: input?.notebook_path\n ? `Read Notebook ${input.notebook_path}`\n : \"Read Notebook\",\n kind: \"read\",\n content: [],\n locations: input?.notebook_path ? [{ path: input.notebook_path }] : [],\n };\n\n case \"NotebookEdit\":\n return {\n title: input?.notebook_path\n ? `Edit Notebook ${input.notebook_path}`\n : \"Edit Notebook\",\n kind: \"edit\",\n content: input?.new_source\n ? [\n {\n type: \"content\",\n content: { type: \"text\", text: input.new_source },\n },\n ]\n : [],\n locations: input?.notebook_path ? [{ path: input.notebook_path }] : [],\n };\n\n case \"Bash\":\n case toolNames.bash:\n return {\n title: input?.command\n ? `\\`${input.command.replaceAll(\"`\", \"\\\\`\")}\\``\n : \"Terminal\",\n kind: \"execute\",\n content: input?.description\n ? [\n {\n type: \"content\",\n content: { type: \"text\", text: input.description },\n },\n ]\n : [],\n };\n\n case \"BashOutput\":\n case toolNames.bashOutput:\n return {\n title: \"Tail Logs\",\n kind: \"execute\",\n content: [],\n };\n\n case \"KillShell\":\n case toolNames.killShell:\n return {\n title: \"Kill Process\",\n kind: \"execute\",\n content: [],\n };\n\n case toolNames.read: {\n let limit = \"\";\n if (input.limit) {\n limit =\n \" (\" +\n ((input.offset ?? 0) + 1) +\n \" - \" +\n ((input.offset ?? 0) + input.limit) +\n \")\";\n } else if (input.offset) {\n limit = ` (from line ${input.offset + 1})`;\n }\n return {\n title: `Read ${input.file_path ?? \"File\"}${limit}`,\n kind: \"read\",\n locations: input.file_path\n ? [\n {\n path: input.file_path,\n line: input.offset ?? 0,\n },\n ]\n : [],\n content: [],\n };\n }\n\n case \"Read\":\n return {\n title: \"Read File\",\n kind: \"read\",\n content: [],\n locations: input.file_path\n ? [\n {\n path: input.file_path,\n line: input.offset ?? 0,\n },\n ]\n : [],\n };\n\n case \"LS\":\n return {\n title: `List the ${input?.path ? `\\`${input.path}\\`` : \"current\"} directory's contents`,\n kind: \"search\",\n content: [],\n locations: [],\n };\n\n case toolNames.edit:\n case \"Edit\": {\n const path = input?.file_path ?? input?.file_path;\n let oldText = input.old_string ?? null;\n let newText = 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 toolNames.write: {\n let content: ToolCallContent[] = [];\n if (input?.file_path) {\n content = [\n {\n type: \"diff\",\n path: input.file_path,\n oldText: null,\n newText: input.content,\n },\n ];\n } else if (input?.content) {\n content = [\n {\n type: \"content\",\n content: { type: \"text\", text: input.content },\n },\n ];\n }\n return {\n title: input?.file_path ? `Write ${input.file_path}` : \"Write\",\n kind: \"edit\",\n content,\n locations: input?.file_path ? [{ path: input.file_path }] : [],\n };\n }\n\n case \"Write\":\n return {\n title: input?.file_path ? `Write ${input.file_path}` : \"Write\",\n kind: \"edit\",\n content: input?.file_path\n ? [\n {\n type: \"diff\",\n path: input.file_path,\n oldText: null,\n newText: input.content,\n },\n ]\n : [],\n locations: input?.file_path ? [{ path: input.file_path }] : [],\n };\n\n case \"Glob\": {\n let label = \"Find\";\n if (input.path) {\n label += ` \\`${input.path}\\``;\n }\n if (input.pattern) {\n label += ` \\`${input.pattern}\\``;\n }\n return {\n title: label,\n kind: \"search\",\n content: [],\n locations: input.path ? [{ path: input.path }] : [],\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=\"${input.glob}\"`;\n }\n\n if (input.type) {\n label += ` --type=${input.type}`;\n }\n\n if (input.multiline) {\n label += \" -P\";\n }\n\n label += ` \"${input.pattern}\"`;\n\n if (input.path) {\n label += ` ${input.path}`;\n }\n\n return {\n title: label,\n kind: \"search\",\n content: [],\n };\n }\n\n case \"WebFetch\":\n return {\n title: input?.url ? `Fetch ${input.url}` : \"Fetch\",\n kind: \"fetch\",\n content: input?.prompt\n ? [\n {\n type: \"content\",\n content: { type: \"text\", text: input.prompt },\n },\n ]\n : [],\n };\n\n case \"WebSearch\": {\n let label = `\"${input.query}\"`;\n\n if (input.allowed_domains && input.allowed_domains.length > 0) {\n label += ` (allowed: ${input.allowed_domains.join(\", \")})`;\n }\n\n if (input.blocked_domains && input.blocked_domains.length > 0) {\n label += ` (blocked: ${input.blocked_domains.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: any) => 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 ? [{ type: \"content\", content: { type: \"text\", text: input.plan } }]\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: [\n {\n type: \"content\",\n content: {\n type: \"text\",\n text: `\\`\\`\\`json\\n${output}\\`\\`\\``,\n },\n },\n ],\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: any | undefined,\n): ToolUpdate {\n switch (toolUse?.name) {\n case \"Read\":\n case toolNames.read:\n if (Array.isArray(toolResult.content) && toolResult.content.length > 0) {\n return {\n content: toolResult.content.map((content: any) => ({\n type: \"content\",\n content:\n content.type === \"text\"\n ? {\n type: \"text\",\n text: markdownEscape(\n content.text.replace(SYSTEM_REMINDER, \"\"),\n ),\n }\n : content,\n })),\n };\n } else if (\n typeof toolResult.content === \"string\" &&\n toolResult.content.length > 0\n ) {\n return {\n content: [\n {\n type: \"content\",\n content: {\n type: \"text\",\n text: markdownEscape(\n toolResult.content.replace(SYSTEM_REMINDER, \"\"),\n ),\n },\n },\n ],\n };\n }\n return {};\n\n case toolNames.bash:\n case \"edit\":\n case \"Edit\":\n case toolNames.edit:\n case toolNames.write:\n case \"Write\": {\n if (\n \"is_error\" in toolResult &&\n toolResult.is_error &&\n toolResult.content &&\n toolResult.content.length > 0\n ) {\n // Only return errors\n return toAcpContentUpdate(toolResult.content, true);\n }\n return {};\n }\n\n case \"ExitPlanMode\": {\n return { title: \"Exited Plan Mode\" };\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: any,\n isError: boolean = false,\n): { content?: ToolCallContent[] } {\n if (Array.isArray(content) && content.length > 0) {\n return {\n content: content.map((content: any) => ({\n type: \"content\",\n content:\n isError && content.type === \"text\"\n ? {\n ...content,\n text: `\\`\\`\\`\\n${content.text}\\n\\`\\`\\``,\n }\n : content,\n })),\n };\n } else if (typeof content === \"string\" && content.length > 0) {\n return {\n content: [\n {\n type: \"content\",\n content: {\n type: \"text\",\n text: isError ? `\\`\\`\\`\\n${content}\\n\\`\\`\\`` : content,\n },\n },\n ],\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\nexport function 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\n/* A global variable to store callbacks that should be executed when receiving hooks from Claude Code */\nconst toolUseCallbacks: {\n [toolUseId: string]: {\n onPostToolUseHook?: (\n toolUseID: string,\n toolInput: unknown,\n toolResponse: unknown,\n ) => Promise<void>;\n };\n} = {};\n\n/* Setup callbacks that will be called when receiving hooks from Claude Code */\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\n/* A callback for Claude Code that is called when receiving a PostToolUse hook */\nexport const createPostToolUseHook =\n (\n logger: Logger = new Logger({ prefix: \"[createPostToolUseHook]\" }),\n ): HookCallback =>\n async (\n input: HookInput,\n toolUseID: string | undefined,\n ): Promise<{ continue: boolean }> => {\n if (input.hook_event_name === \"PostToolUse\" && toolUseID) {\n const onPostToolUseHook = toolUseCallbacks[toolUseID]?.onPostToolUseHook;\n if (onPostToolUseHook) {\n await onPostToolUseHook(\n toolUseID,\n input.tool_input,\n input.tool_response,\n );\n delete toolUseCallbacks[toolUseID]; // Cleanup after execution\n } else {\n logger.error(\n `No onPostToolUseHook found for tool use ID: ${toolUseID}`,\n );\n delete toolUseCallbacks[toolUseID];\n }\n }\n return { continue: true };\n };\n","import {\n type Client,\n ClientSideConnection,\n type ContentBlock,\n ndJsonStream,\n PROTOCOL_VERSION,\n} from \"@agentclientprotocol/sdk\";\nimport { POSTHOG_NOTIFICATIONS } from \"./acp-extensions.js\";\nimport {\n createAcpConnection,\n type InProcessAcpConnection,\n} from \"./adapters/claude/claude.js\";\nimport { PostHogFileManager } from \"./file-manager.js\";\nimport { GitManager } from \"./git-manager.js\";\nimport { PostHogAPIClient } from \"./posthog-api.js\";\nimport { PromptBuilder } from \"./prompt-builder.js\";\nimport { SessionStore } from \"./session-store.js\";\nimport { TaskManager } from \"./task-manager.js\";\nimport { TemplateManager } from \"./template-manager.js\";\nimport type {\n AgentConfig,\n CanUseTool,\n StoredNotification,\n Task,\n TaskExecutionOptions,\n} from \"./types.js\";\nimport { Logger } from \"./utils/logger.js\";\nimport { TASK_WORKFLOW } from \"./workflow/config.js\";\nimport type { SendNotification, WorkflowRuntime } from \"./workflow/types.js\";\n\nexport class Agent {\n private workingDirectory: string;\n private taskManager: TaskManager;\n private posthogAPI?: PostHogAPIClient;\n private fileManager: PostHogFileManager;\n private gitManager: GitManager;\n private templateManager: TemplateManager;\n private logger: Logger;\n private acpConnection?: InProcessAcpConnection;\n private promptBuilder: PromptBuilder;\n private mcpServers?: Record<string, any>;\n private canUseTool?: CanUseTool;\n private currentRunId?: string;\n private sessionStore?: SessionStore;\n public debug: boolean;\n\n constructor(config: AgentConfig) {\n this.workingDirectory = config.workingDirectory || process.cwd();\n this.canUseTool = config.canUseTool;\n this.debug = config.debug || false;\n\n // Build default PostHog MCP server configuration\n const posthogMcpUrl =\n config.posthogMcpUrl ||\n process.env.POSTHOG_MCP_URL ||\n \"https://mcp.posthog.com/mcp\";\n\n // Add auth if API key provided\n const headers: Record<string, string> = {};\n if (config.posthogApiKey) {\n headers.Authorization = `Bearer ${config.posthogApiKey}`;\n }\n\n const defaultMcpServers = {\n posthog: {\n type: \"http\" as const,\n url: posthogMcpUrl,\n ...(Object.keys(headers).length > 0 ? { headers } : {}),\n },\n };\n\n // Merge default PostHog MCP with user-provided servers (user config takes precedence)\n this.mcpServers = {\n ...defaultMcpServers,\n ...config.mcpServers,\n };\n this.logger = new Logger({\n debug: this.debug,\n prefix: \"[PostHog Agent]\",\n onLog: config.onLog,\n });\n this.taskManager = new TaskManager();\n\n this.fileManager = new PostHogFileManager(\n this.workingDirectory,\n this.logger.child(\"FileManager\"),\n );\n this.gitManager = new GitManager({\n repositoryPath: this.workingDirectory,\n logger: this.logger.child(\"GitManager\"),\n });\n this.templateManager = new TemplateManager();\n\n if (\n config.posthogApiUrl &&\n config.posthogApiKey &&\n config.posthogProjectId\n ) {\n this.posthogAPI = new PostHogAPIClient({\n apiUrl: config.posthogApiUrl,\n apiKey: config.posthogApiKey,\n projectId: config.posthogProjectId,\n });\n\n // Create SessionStore from the API client for ACP connection\n this.sessionStore = new SessionStore(\n this.posthogAPI,\n this.logger.child(\"SessionStore\"),\n );\n }\n\n this.promptBuilder = new PromptBuilder({\n getTaskFiles: (taskId: string) => this.getTaskFiles(taskId),\n generatePlanTemplate: (vars) => this.templateManager.generatePlan(vars),\n posthogClient: this.posthogAPI,\n logger: this.logger.child(\"PromptBuilder\"),\n });\n }\n\n /**\n * Enable or disable debug logging\n */\n setDebug(enabled: boolean) {\n this.debug = enabled;\n this.logger.setDebug(enabled);\n }\n\n /**\n * Configure LLM gateway environment variables for Claude Code CLI\n */\n private async _configureLlmGateway(): Promise<void> {\n if (!this.posthogAPI) {\n return;\n }\n\n try {\n const gatewayUrl = this.posthogAPI.getLlmGatewayUrl();\n const apiKey = this.posthogAPI.getApiKey();\n process.env.ANTHROPIC_BASE_URL = gatewayUrl;\n process.env.ANTHROPIC_AUTH_TOKEN = apiKey;\n this.ensureOpenAIGatewayEnv(gatewayUrl, apiKey);\n } catch (error) {\n this.logger.error(\"Failed to configure LLM gateway\", error);\n throw error;\n }\n }\n\n private getOrCreateConnection(): InProcessAcpConnection {\n if (!this.acpConnection) {\n this.acpConnection = createAcpConnection({\n sessionStore: this.sessionStore,\n });\n }\n return this.acpConnection;\n }\n\n // Adaptive task execution orchestrated via workflow steps\n async runTask(\n taskId: string,\n taskRunId: string,\n options: import(\"./types.js\").TaskExecutionOptions = {},\n ): Promise<void> {\n // await this._configureLlmGateway();\n\n const task = await this.fetchTask(taskId);\n const cwd = options.repositoryPath || this.workingDirectory;\n const isCloudMode = options.isCloudMode ?? false;\n const taskSlug = (task as any).slug || task.id;\n\n // Use taskRunId as sessionId - they are the same identifier\n this.currentRunId = taskRunId;\n\n this.logger.info(\"Starting adaptive task execution\", {\n taskId: task.id,\n taskSlug,\n taskRunId,\n isCloudMode,\n });\n\n const connection = this.getOrCreateConnection();\n\n // Create sendNotification using ACP connection's extNotification\n const sendNotification: SendNotification = async (method, params) => {\n this.logger.debug(`Notification: ${method}`, params);\n await connection.agentConnection.extNotification?.(method, params);\n };\n\n await sendNotification(POSTHOG_NOTIFICATIONS.RUN_STARTED, {\n sessionId: taskRunId,\n runId: taskRunId,\n });\n\n await this.prepareTaskBranch(taskSlug, isCloudMode, sendNotification);\n\n let taskError: Error | undefined;\n try {\n const workflowContext: WorkflowRuntime = {\n task,\n taskSlug,\n runId: taskRunId,\n cwd,\n isCloudMode,\n options,\n logger: this.logger,\n fileManager: this.fileManager,\n gitManager: this.gitManager,\n promptBuilder: this.promptBuilder,\n connection: connection.agentConnection,\n sessionId: taskRunId,\n sendNotification,\n mcpServers: this.mcpServers,\n posthogAPI: this.posthogAPI,\n stepResults: {},\n };\n\n for (const step of TASK_WORKFLOW) {\n const result = await step.run({ step, context: workflowContext });\n if (result.halt) {\n return;\n }\n }\n\n const shouldCreatePR = options.createPR ?? isCloudMode;\n if (shouldCreatePR) {\n await this.ensurePullRequest(\n task,\n workflowContext.stepResults,\n sendNotification,\n );\n }\n\n this.logger.info(\"Task execution complete\", { taskId: task.id });\n await sendNotification(POSTHOG_NOTIFICATIONS.TASK_COMPLETE, {\n sessionId: taskRunId,\n taskId: task.id,\n });\n } catch (error) {\n taskError = error instanceof Error ? error : new Error(String(error));\n this.logger.error(\"Task execution failed\", {\n taskId: task.id,\n error: taskError.message,\n });\n await sendNotification(POSTHOG_NOTIFICATIONS.ERROR, {\n sessionId: taskRunId,\n message: taskError.message,\n });\n throw taskError;\n }\n }\n\n /**\n * Creates an in-process ACP connection for client communication.\n * Sets up git branch for the task, configures LLM gateway.\n * The client handles all prompting/querying via the returned streams.\n *\n * @returns InProcessAcpConnection with clientStreams for the client to use\n */\n async runTaskV2(\n taskId: string,\n taskRunId: string,\n options: import(\"./types.js\").TaskExecutionOptions = {},\n ): Promise<InProcessAcpConnection> {\n await this._configureLlmGateway();\n\n const task = await this.fetchTask(taskId);\n const taskSlug = (task as any).slug || task.id;\n const isCloudMode = options.isCloudMode ?? false;\n const _cwd = options.repositoryPath || this.workingDirectory;\n\n // Use taskRunId as sessionId - they are the same identifier\n this.currentRunId = taskRunId;\n\n this.acpConnection = createAcpConnection({\n sessionStore: this.sessionStore,\n sessionId: taskRunId,\n taskId: task.id,\n });\n\n const sendNotification: SendNotification = async (method, params) => {\n this.logger.debug(`Notification: ${method}`, params);\n await this.acpConnection?.agentConnection.extNotification?.(\n method,\n params,\n );\n };\n\n await sendNotification(POSTHOG_NOTIFICATIONS.RUN_STARTED, {\n sessionId: taskRunId,\n runId: taskRunId,\n });\n\n if (!options.skipGitBranch) {\n try {\n await this.prepareTaskBranch(taskSlug, isCloudMode, sendNotification);\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n this.logger.error(\"Failed to prepare task branch\", {\n error: errorMessage,\n });\n await sendNotification(POSTHOG_NOTIFICATIONS.ERROR, {\n sessionId: taskRunId,\n message: errorMessage,\n });\n throw error;\n }\n }\n\n return this.acpConnection;\n }\n\n // PostHog task operations\n async fetchTask(taskId: string): Promise<Task> {\n if (!this.posthogAPI) {\n const error = new Error(\n \"PostHog API not configured. Provide posthogApiUrl and posthogApiKey in constructor.\",\n );\n this.logger.error(\"PostHog API not configured\", error);\n throw error;\n }\n return this.posthogAPI.fetchTask(taskId);\n }\n\n getPostHogClient(): PostHogAPIClient | undefined {\n return this.posthogAPI;\n }\n\n /**\n * Send a notification to a cloud task run's S3 log.\n * The cloud runner will pick up new notifications via interrupt polling.\n */\n async sendNotification(\n taskId: string,\n runId: string,\n notification: StoredNotification,\n ): Promise<void> {\n if (!this.posthogAPI) {\n throw new Error(\n \"PostHog API not configured. Cannot send notification to cloud task.\",\n );\n }\n\n await this.posthogAPI.appendTaskRunLog(taskId, runId, [notification]);\n this.logger.debug(\"Notification sent to cloud task\", {\n taskId,\n runId,\n method: notification.notification.method,\n });\n }\n\n async getTaskFiles(taskId: string): Promise<any[]> {\n this.logger.debug(\"Getting task files\", { taskId });\n const files = await this.fileManager.getTaskFiles(taskId);\n this.logger.debug(\"Found task files\", { taskId, fileCount: files.length });\n return files;\n }\n\n async createPullRequest(\n taskId: string,\n branchName: string,\n taskTitle: string,\n taskDescription: string,\n customBody?: string,\n ): Promise<string> {\n this.logger.info(\"Creating pull request\", {\n taskId,\n branchName,\n taskTitle,\n });\n\n const defaultBody = `## Task Details\n**Task ID**: ${taskId}\n**Description**: ${taskDescription}\n\n## Changes\nThis PR implements the changes described in the task.\n\nGenerated by PostHog Agent`;\n const prBody = customBody || defaultBody;\n\n const prUrl = await this.gitManager.createPullRequest(\n branchName,\n taskTitle,\n prBody,\n );\n\n this.logger.info(\"Pull request created\", { taskId, prUrl });\n return prUrl;\n }\n\n async attachPullRequestToTask(\n taskId: string,\n prUrl: string,\n branchName?: string,\n ): Promise<void> {\n this.logger.info(\"Attaching PR to task run\", { taskId, prUrl, branchName });\n\n if (!this.posthogAPI || !this.currentRunId) {\n const error = new Error(\n \"PostHog API not configured or no active run. Cannot attach PR to task.\",\n );\n this.logger.error(\"PostHog API not configured\", error);\n throw error;\n }\n\n const updates: any = {\n output: { pr_url: prUrl },\n };\n if (branchName) {\n updates.branch = branchName;\n }\n\n await this.posthogAPI.updateTaskRun(taskId, this.currentRunId, updates);\n this.logger.debug(\"PR attached to task run\", {\n taskId,\n runId: this.currentRunId,\n prUrl,\n });\n }\n\n async updateTaskBranch(taskId: string, branchName: string): Promise<void> {\n this.logger.info(\"Updating task run branch\", { taskId, branchName });\n\n if (!this.posthogAPI || !this.currentRunId) {\n const error = new Error(\n \"PostHog API not configured or no active run. Cannot update branch.\",\n );\n this.logger.error(\"PostHog API not configured\", error);\n throw error;\n }\n\n await this.posthogAPI.updateTaskRun(taskId, this.currentRunId, {\n branch: branchName,\n });\n this.logger.debug(\"Task run branch updated\", {\n taskId,\n runId: this.currentRunId,\n branchName,\n });\n }\n\n // Execution management\n cancelTask(taskId: string): void {\n // Find the execution for this task and cancel it\n for (const [executionId, execution] of this.taskManager.executionStates) {\n if (execution.taskId === taskId && execution.status === \"running\") {\n this.taskManager.cancelExecution(executionId);\n break;\n }\n }\n }\n\n getTaskExecutionStatus(taskId: string): string | null {\n // Find the execution for this task\n for (const execution of this.taskManager.executionStates.values()) {\n if (execution.taskId === taskId) {\n return execution.status;\n }\n }\n return null;\n }\n\n private async prepareTaskBranch(\n taskSlug: string,\n isCloudMode: boolean,\n sendNotification: SendNotification,\n ): Promise<void> {\n if (await this.gitManager.hasChanges()) {\n throw new Error(\n \"Cannot start task with uncommitted changes. Please commit or stash your changes first.\",\n );\n }\n\n // If we're running in a worktree, we're already on the correct branch\n // (the worktree was created with its own branch). Skip branch creation.\n const isWorktree = await this.gitManager.isWorktree();\n if (isWorktree) {\n const currentBranch = await this.gitManager.getCurrentBranch();\n this.logger.info(\"Running in worktree, using existing branch\", {\n branch: currentBranch,\n });\n await sendNotification(POSTHOG_NOTIFICATIONS.BRANCH_CREATED, {\n branch: currentBranch,\n });\n return;\n }\n\n await this.gitManager.resetToDefaultBranchIfNeeded();\n\n const existingBranch = await this.gitManager.getTaskBranch(taskSlug);\n if (!existingBranch) {\n const branchName = await this.gitManager.createTaskBranch(taskSlug);\n await sendNotification(POSTHOG_NOTIFICATIONS.BRANCH_CREATED, {\n branch: branchName,\n });\n\n await this.gitManager.addAllPostHogFiles();\n\n // Only commit if there are changes or we're in cloud mode\n if (isCloudMode) {\n await this.gitManager.commitAndPush(`Initialize task ${taskSlug}`, {\n allowEmpty: true,\n });\n } else {\n // Check if there are any changes before committing\n const hasChanges = await this.gitManager.hasStagedChanges();\n if (hasChanges) {\n await this.gitManager.commitChanges(`Initialize task ${taskSlug}`);\n }\n }\n } else {\n this.logger.info(\"Switching to existing task branch\", {\n branch: existingBranch,\n });\n await this.gitManager.switchToBranch(existingBranch);\n }\n }\n\n private ensureOpenAIGatewayEnv(gatewayUrl?: string, token?: string): void {\n const resolvedGatewayUrl = gatewayUrl || process.env.ANTHROPIC_BASE_URL;\n const resolvedToken = token || process.env.ANTHROPIC_AUTH_TOKEN;\n\n if (resolvedGatewayUrl) {\n process.env.OPENAI_BASE_URL = resolvedGatewayUrl;\n }\n\n if (resolvedToken) {\n process.env.OPENAI_API_KEY = resolvedToken;\n }\n }\n\n async runTaskCloud(\n taskId: string,\n taskRunId: string,\n options: TaskExecutionOptions = {},\n ): Promise<void> {\n await this._configureLlmGateway();\n\n const task = await this.fetchTask(taskId);\n const cwd = options.repositoryPath || this.workingDirectory;\n const taskSlug = (task as any).slug || task.id;\n\n this.currentRunId = taskRunId;\n\n this.logger.info(\"Starting cloud task execution\", {\n taskId: task.id,\n taskSlug,\n taskRunId,\n cwd,\n });\n\n if (!this.sessionStore) {\n throw new Error(\n \"SessionStore required for cloud mode. Ensure PostHog API credentials are configured.\",\n );\n }\n\n // Start session in SessionStore (updates task run status to in_progress)\n const taskRun = await this.sessionStore.start(taskRunId, taskId, taskRunId);\n this.logger.debug(\"Session started\", {\n taskRunId,\n logUrl: taskRun?.log_url,\n });\n\n // Create internal ACP connection with S3 persistence\n const acpConnection = createAcpConnection({\n sessionStore: this.sessionStore,\n sessionId: taskRunId,\n taskId: task.id,\n });\n\n // Create client connection using the client-side streams\n const clientStream = ndJsonStream(\n acpConnection.clientStreams.writable as WritableStream<Uint8Array>,\n acpConnection.clientStreams.readable as ReadableStream<Uint8Array>,\n );\n\n // Create auto-approving client for headless cloud mode\n const cloudClient: Client = {\n async requestPermission(params) {\n const allowOption = params.options.find(\n (o) => o.kind === \"allow_once\" || o.kind === \"allow_always\",\n );\n return {\n outcome: {\n outcome: \"selected\",\n optionId: allowOption?.optionId ?? params.options[0].optionId,\n },\n };\n },\n async sessionUpdate(_params) {\n // Notifications are already being persisted to S3 via tapped streams\n },\n };\n\n const clientConnection = new ClientSideConnection(\n (_agent) => cloudClient,\n clientStream,\n );\n\n try {\n // Initialize the connection\n await clientConnection.initialize({\n protocolVersion: PROTOCOL_VERSION,\n clientCapabilities: {},\n });\n\n // Create new session\n await clientConnection.newSession({\n cwd,\n mcpServers: [],\n _meta: { sessionId: taskRunId },\n });\n\n // Prepare git branch if not skipped\n if (!options.skipGitBranch) {\n const sendNotification: SendNotification = async (method, params) => {\n this.logger.debug(`Notification: ${method}`, params);\n await acpConnection.agentConnection.extNotification?.(method, params);\n };\n await this.prepareTaskBranch(taskSlug, true, sendNotification);\n }\n\n // Build initial prompt from task description\n const initialPrompt: ContentBlock[] = [\n {\n type: \"text\",\n text: `# Task: ${task.title}\\n\\n${task.description}`,\n },\n ];\n\n // Track the last known log entry count for interrupt polling\n let lastKnownEntryCount = 0;\n let isPolling = true;\n\n // Start interrupt polling in background\n const pollForInterrupts = async () => {\n while (isPolling) {\n await new Promise((resolve) => setTimeout(resolve, 2000)); // Poll every 2 seconds\n if (!isPolling) break;\n\n try {\n const newEntries = await this.sessionStore?.pollForNewEntries(\n taskRunId,\n lastKnownEntryCount,\n );\n\n for (const entry of newEntries ?? []) {\n lastKnownEntryCount++;\n // Look for user_message notifications\n if (\n entry.notification?.method === \"sessionUpdate\" &&\n (entry.notification?.params as any)?.sessionUpdate ===\n \"user_message\"\n ) {\n const content = (entry.notification?.params as any)?.content;\n if (content) {\n this.logger.info(\"Processing user interrupt\", { content });\n // Send as new prompt - will be processed after current prompt completes\n await clientConnection.prompt({\n sessionId: taskRunId,\n prompt: Array.isArray(content) ? content : [content],\n });\n }\n }\n }\n } catch (err) {\n this.logger.warn(\"Interrupt polling error\", { error: err });\n }\n }\n };\n\n // Start polling in background (don't await)\n const pollingPromise = pollForInterrupts();\n\n // Send initial prompt and wait for completion\n this.logger.info(\"Sending initial prompt to agent\");\n const result = await clientConnection.prompt({\n sessionId: taskRunId,\n prompt: initialPrompt,\n });\n\n // Stop interrupt polling\n isPolling = false;\n await pollingPromise;\n\n this.logger.info(\"Task execution complete\", {\n taskId: task.id,\n stopReason: result.stopReason,\n });\n\n const branchName = await this.gitManager.getCurrentBranch();\n const hasChanges = await this.gitManager.hasChanges();\n const shouldCreatePR = options.createPR ?? false;\n\n if (hasChanges) {\n this.logger.info(\"Committing uncommitted changes\", { taskId: task.id });\n await this.gitManager.commitImplementation(\n task.id,\n task.title,\n task.description ?? undefined,\n );\n }\n\n const defaultBranch = await this.gitManager.getDefaultBranch();\n if (branchName !== defaultBranch) {\n this.logger.info(\"Pushing branch\", { branchName, taskId: task.id });\n await this.gitManager.pushBranch(branchName);\n\n if (shouldCreatePR) {\n this.logger.info(\"Creating PR\", { branchName, taskId: task.id });\n\n const prUrl = await this.createPullRequest(\n task.id,\n branchName,\n task.title,\n task.description ?? \"\",\n );\n\n this.logger.info(\"PR created\", { prUrl, taskId: task.id });\n\n try {\n await this.attachPullRequestToTask(task.id, prUrl, branchName);\n } catch (err) {\n this.logger.warn(\"Could not attach PR to task\", {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n }\n\n await this.sessionStore.complete(taskRunId);\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n this.logger.error(\"Cloud task execution failed\", {\n taskId: task.id,\n error: errorMessage,\n });\n await this.sessionStore.fail(taskRunId, errorMessage);\n throw error;\n }\n }\n\n private async ensurePullRequest(\n task: Task,\n stepResults: Record<string, any>,\n sendNotification: SendNotification,\n ): Promise<void> {\n const latestRun = task.latest_run;\n const existingPr =\n latestRun?.output && typeof latestRun.output === \"object\"\n ? (latestRun.output as any).pr_url\n : null;\n\n if (existingPr) {\n this.logger.info(\"PR already exists, skipping creation\", {\n taskId: task.id,\n prUrl: existingPr,\n });\n return;\n }\n\n const buildResult = stepResults.build;\n if (!buildResult?.commitCreated) {\n this.logger.warn(\n \"Build step did not produce a commit; skipping PR creation\",\n { taskId: task.id },\n );\n return;\n }\n\n const branchName = await this.gitManager.getCurrentBranch();\n const finalizeResult = stepResults.finalize;\n const prBody = finalizeResult?.prBody;\n\n const prUrl = await this.createPullRequest(\n task.id,\n branchName,\n task.title,\n task.description ?? \"\",\n prBody,\n );\n\n await sendNotification(POSTHOG_NOTIFICATIONS.PR_CREATED, { prUrl });\n\n try {\n await this.attachPullRequestToTask(task.id, prUrl, branchName);\n this.logger.info(\"PR attached to task successfully\", {\n taskId: task.id,\n prUrl,\n });\n } catch (error) {\n this.logger.warn(\"Could not attach PR to task\", {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n}\n\nexport type {\n AgentConfig,\n ExecutionResult,\n SupportingFile,\n Task,\n} from \"./types.js\";\nexport { PermissionMode } from \"./types.js\";\n","import { promises as fs } from \"node:fs\";\nimport { extname, join } from \"node:path\";\nimport z from \"zod\";\nimport type { ResearchEvaluation, SupportingFile } from \"./types.js\";\nimport { Logger } from \"./utils/logger.js\";\n\nexport interface TaskFile {\n name: string;\n content: string;\n type: \"plan\" | \"context\" | \"reference\" | \"output\" | \"artifact\";\n}\n\nexport interface LocalArtifact {\n name: string;\n content: string;\n type: TaskFile[\"type\"];\n contentType: string;\n size: number;\n}\n\nexport class PostHogFileManager {\n private repositoryPath: string;\n private logger: Logger;\n\n constructor(repositoryPath: string, logger?: Logger) {\n this.repositoryPath = repositoryPath;\n this.logger =\n logger || new Logger({ debug: false, prefix: \"[FileManager]\" });\n }\n\n private getTaskDirectory(taskId: string): string {\n return join(this.repositoryPath, \".posthog\", taskId);\n }\n\n private getTaskFilePath(taskId: string, fileName: string): string {\n return join(this.getTaskDirectory(taskId), fileName);\n }\n\n async ensureTaskDirectory(taskId: string): Promise<void> {\n const taskDir = this.getTaskDirectory(taskId);\n try {\n await fs.access(taskDir);\n } catch {\n await fs.mkdir(taskDir, { recursive: true });\n }\n }\n\n async writeTaskFile(taskId: string, file: TaskFile): Promise<void> {\n await this.ensureTaskDirectory(taskId);\n const filePath = this.getTaskFilePath(taskId, file.name);\n\n this.logger.debug(\"Writing task file\", {\n filePath,\n contentLength: file.content.length,\n contentType: typeof file.content,\n });\n\n await fs.writeFile(filePath, file.content, \"utf8\");\n\n this.logger.debug(\"File written successfully\", { filePath });\n }\n\n async readTaskFile(taskId: string, fileName: string): Promise<string | null> {\n try {\n const filePath = this.getTaskFilePath(taskId, fileName);\n return await fs.readFile(filePath, \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n }\n\n async listTaskFiles(taskId: string): Promise<string[]> {\n try {\n const taskDir = this.getTaskDirectory(taskId);\n const files = await fs.readdir(taskDir);\n return files.filter((file) => !file.startsWith(\".\"));\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return [];\n }\n throw error;\n }\n }\n\n async deleteTaskFile(taskId: string, fileName: string): Promise<void> {\n try {\n const filePath = this.getTaskFilePath(taskId, fileName);\n await fs.unlink(filePath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n }\n\n async taskDirectoryExists(taskId: string): Promise<boolean> {\n try {\n const taskDir = this.getTaskDirectory(taskId);\n await fs.access(taskDir);\n return true;\n } catch {\n return false;\n }\n }\n\n async cleanupTaskDirectory(taskId: string): Promise<void> {\n try {\n const taskDir = this.getTaskDirectory(taskId);\n await fs.rm(taskDir, { recursive: true, force: true });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n }\n\n // Convenience methods for common file types\n async writePlan(taskId: string, plan: string): Promise<void> {\n this.logger.debug(\"Writing plan\", {\n taskId,\n planLength: plan.length,\n contentPreview: plan.substring(0, 200),\n });\n\n await this.writeTaskFile(taskId, {\n name: \"plan.md\",\n content: plan,\n type: \"plan\",\n });\n\n this.logger.info(\"Plan file written\", { taskId });\n }\n\n async readPlan(taskId: string): Promise<string | null> {\n return await this.readTaskFile(taskId, \"plan.md\");\n }\n\n async writeContext(taskId: string, context: string): Promise<void> {\n await this.writeTaskFile(taskId, {\n name: \"context.md\",\n content: context,\n type: \"context\",\n });\n }\n\n async readContext(taskId: string): Promise<string | null> {\n return await this.readTaskFile(taskId, \"context.md\");\n }\n\n async writeRequirements(taskId: string, requirements: string): Promise<void> {\n await this.writeTaskFile(taskId, {\n name: \"requirements.md\",\n content: requirements,\n type: \"reference\",\n });\n }\n\n async readRequirements(taskId: string): Promise<string | null> {\n return await this.readTaskFile(taskId, \"requirements.md\");\n }\n\n async writeResearch(taskId: string, data: ResearchEvaluation): Promise<void> {\n this.logger.debug(\"Writing research\", {\n taskId,\n score: data.actionabilityScore,\n hasQuestions: !!data.questions,\n questionCount: data.questions?.length ?? 0,\n answered: data.answered ?? false,\n });\n\n await this.writeTaskFile(taskId, {\n name: \"research.json\",\n content: JSON.stringify(data, null, 2),\n type: \"artifact\",\n });\n\n this.logger.info(\"Research file written\", {\n taskId,\n score: data.actionabilityScore,\n hasQuestions: !!data.questions,\n answered: data.answered ?? false,\n });\n }\n\n async readResearch(taskId: string): Promise<ResearchEvaluation | null> {\n try {\n const content = await this.readTaskFile(taskId, \"research.json\");\n return content ? (JSON.parse(content) as ResearchEvaluation) : null;\n } catch (error) {\n this.logger.debug(\"Failed to parse research.json\", { error });\n return null;\n }\n }\n\n async writeTodos(taskId: string, data: unknown): Promise<void> {\n const todos = z.object({\n metadata: z.object({\n total: z.number(),\n completed: z.number(),\n }),\n });\n\n const validatedData = todos.parse(data);\n this.logger.debug(\"Writing todos\", {\n taskId,\n total: validatedData.metadata?.total ?? 0,\n completed: validatedData.metadata?.completed ?? 0,\n });\n\n await this.writeTaskFile(taskId, {\n name: \"todos.json\",\n content: JSON.stringify(validatedData, null, 2),\n type: \"artifact\",\n });\n\n this.logger.info(\"Todos file written\", {\n taskId,\n total: validatedData.metadata?.total ?? 0,\n completed: validatedData.metadata?.completed ?? 0,\n });\n }\n\n async readTodos(taskId: string): Promise<unknown | null> {\n try {\n const content = await this.readTaskFile(taskId, \"todos.json\");\n return content ? JSON.parse(content) : null;\n } catch (error) {\n this.logger.debug(\"Failed to parse todos.json\", { error });\n return null;\n }\n }\n\n async getTaskFiles(taskId: string): Promise<SupportingFile[]> {\n const fileNames = await this.listTaskFiles(taskId);\n const files: SupportingFile[] = [];\n\n for (const fileName of fileNames) {\n const content = await this.readTaskFile(taskId, fileName);\n if (content !== null) {\n // Determine type based on file name\n const type = this.resolveFileType(fileName);\n\n files.push({\n name: fileName,\n content,\n type,\n created_at: new Date().toISOString(), // Could be enhanced with file stats\n });\n }\n }\n\n return files;\n }\n\n async collectTaskArtifacts(taskId: string): Promise<LocalArtifact[]> {\n const fileNames = await this.listTaskFiles(taskId);\n const artifacts: LocalArtifact[] = [];\n\n for (const fileName of fileNames) {\n const content = await this.readTaskFile(taskId, fileName);\n if (content === null) {\n continue;\n }\n\n const type = this.resolveFileType(fileName);\n const contentType = this.inferContentType(fileName);\n const size = Buffer.byteLength(content, \"utf8\");\n\n artifacts.push({\n name: fileName,\n content,\n type,\n contentType,\n size,\n });\n }\n\n return artifacts;\n }\n\n private resolveFileType(fileName: string): TaskFile[\"type\"] {\n if (fileName === \"plan.md\") return \"plan\";\n if (fileName === \"context.md\") return \"context\";\n if (fileName === \"requirements.md\") return \"reference\";\n if (fileName.startsWith(\"output_\")) return \"output\";\n if (fileName.endsWith(\".md\")) return \"reference\";\n return \"artifact\";\n }\n\n private inferContentType(fileName: string): string {\n const extension = extname(fileName).toLowerCase();\n switch (extension) {\n case \".md\":\n return \"text/markdown\";\n case \".json\":\n return \"application/json\";\n case \".txt\":\n return \"text/plain\";\n default:\n return \"text/plain\";\n }\n }\n}\n","import { exec } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { Logger } from \"./utils/logger.js\";\n\nconst execAsync = promisify(exec);\n\nexport interface GitConfig {\n repositoryPath: string;\n authorName?: string;\n authorEmail?: string;\n logger?: Logger;\n}\n\nexport interface BranchInfo {\n name: string;\n exists: boolean;\n isCurrentBranch: boolean;\n}\n\nexport class GitManager {\n private repositoryPath: string;\n private authorName?: string;\n private authorEmail?: string;\n private logger: Logger;\n\n constructor(config: GitConfig) {\n this.repositoryPath = config.repositoryPath;\n this.authorName = config.authorName;\n this.authorEmail = config.authorEmail;\n this.logger =\n config.logger || new Logger({ debug: false, prefix: \"[GitManager]\" });\n }\n\n private escapeShellArg(str: string): string {\n return str\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\"/g, '\\\\\"')\n .replace(/`/g, \"\\\\`\")\n .replace(/\\$/g, \"\\\\$\");\n }\n\n private async runGitCommand(command: string): Promise<string> {\n try {\n const { stdout } = await execAsync(\n `cd \"${this.repositoryPath}\" && git ${command}`,\n );\n return stdout.trim();\n } catch (error) {\n throw new Error(`Git command failed: ${command}\\n${error}`);\n }\n }\n\n private async runCommand(command: string): Promise<string> {\n try {\n const { stdout } = await execAsync(\n `cd \"${this.repositoryPath}\" && ${command}`,\n );\n return stdout.trim();\n } catch (error) {\n throw new Error(`Command failed: ${command}\\n${error}`);\n }\n }\n\n async isGitRepository(): Promise<boolean> {\n try {\n await this.runGitCommand(\"rev-parse --git-dir\");\n return true;\n } catch {\n return false;\n }\n }\n\n async getCurrentBranch(): Promise<string> {\n return await this.runGitCommand(\"branch --show-current\");\n }\n\n async getDefaultBranch(): Promise<string> {\n try {\n // Try to get the default branch from remote\n const remoteBranch = await this.runGitCommand(\n \"symbolic-ref refs/remotes/origin/HEAD\",\n );\n return remoteBranch.replace(\"refs/remotes/origin/\", \"\");\n } catch {\n // Fallback: check if main exists, otherwise use master\n if (await this.branchExists(\"main\")) {\n return \"main\";\n } else if (await this.branchExists(\"master\")) {\n return \"master\";\n } else {\n throw new Error(\n \"Cannot determine default branch. No main or master branch found.\",\n );\n }\n }\n }\n\n async branchExists(branchName: string): Promise<boolean> {\n try {\n await this.runGitCommand(`rev-parse --verify ${branchName}`);\n return true;\n } catch {\n return false;\n }\n }\n\n async createBranch(branchName: string, baseBranch?: string): Promise<void> {\n const base = baseBranch || (await this.getCurrentBranch());\n await this.runGitCommand(`checkout -b ${branchName} ${base}`);\n }\n\n async switchToBranch(branchName: string): Promise<void> {\n await this.runGitCommand(`checkout ${branchName}`);\n }\n\n async resetToDefaultBranchIfNeeded(): Promise<boolean> {\n const currentBranch = await this.getCurrentBranch();\n const defaultBranch = await this.getDefaultBranch();\n\n if (currentBranch === defaultBranch) {\n this.logger.debug(\"Already on default branch\", { branch: defaultBranch });\n return true;\n }\n\n if (await this.hasChanges()) {\n this.logger.warn(\"Skipping branch reset - uncommitted changes present\", {\n currentBranch,\n defaultBranch,\n });\n return false;\n }\n\n await this.switchToBranch(defaultBranch);\n this.logger.info(\"Reset to default branch\", {\n from: currentBranch,\n to: defaultBranch,\n });\n return true;\n }\n\n async createOrSwitchToBranch(\n branchName: string,\n baseBranch?: string,\n ): Promise<void> {\n await this.ensureCleanWorkingDirectory(\"switching branches\");\n\n const exists = await this.branchExists(branchName);\n if (exists) {\n await this.switchToBranch(branchName);\n } else {\n await this.createBranch(branchName, baseBranch);\n }\n }\n\n async addFiles(paths: string[]): Promise<void> {\n const pathList = paths.map((p) => `\"${this.escapeShellArg(p)}\"`).join(\" \");\n await this.runGitCommand(`add ${pathList}`);\n }\n\n async addAllPostHogFiles(): Promise<void> {\n try {\n // Use -A flag to add all changes (including new files) and ignore errors if directory is empty\n await this.runGitCommand(\"add -A .posthog/\");\n } catch (error) {\n // If the directory doesn't exist or has no files, that's fine - just log and continue\n this.logger.debug(\"No PostHog files to add\", { error });\n }\n }\n\n async commitChanges(\n message: string,\n options?: {\n authorName?: string;\n authorEmail?: string;\n },\n ): Promise<string> {\n const command = this.buildCommitCommand(message, options);\n return await this.runGitCommand(command);\n }\n\n async hasChanges(): Promise<boolean> {\n try {\n const status = await this.runGitCommand(\"status --porcelain\");\n if (!status || status.trim().length === 0) {\n return false;\n }\n\n const lines = status.split(\"\\n\").filter((line) => {\n const trimmed = line.trim();\n return trimmed.length > 0 && !trimmed.includes(\".posthog/\");\n });\n\n return lines.length > 0;\n } catch {\n return false;\n }\n }\n\n async hasStagedChanges(): Promise<boolean> {\n try {\n const status = await this.runGitCommand(\"diff --cached --name-only\");\n return status.length > 0;\n } catch {\n return false;\n }\n }\n\n // Helper: Centralized safety check for uncommitted changes\n private async ensureCleanWorkingDirectory(operation: string): Promise<void> {\n if (await this.hasChanges()) {\n throw new Error(\n `Uncommitted changes detected. Please commit or stash changes before ${operation}.`,\n );\n }\n }\n\n private async generateUniqueBranchName(baseName: string): Promise<string> {\n if (!(await this.branchExists(baseName))) {\n return baseName;\n }\n\n let counter = 1;\n let uniqueName = `${baseName}-${counter}`;\n while (await this.branchExists(uniqueName)) {\n counter++;\n uniqueName = `${baseName}-${counter}`;\n }\n return uniqueName;\n }\n\n private async ensureOnDefaultBranch(): Promise<string> {\n const defaultBranch = await this.getDefaultBranch();\n const currentBranch = await this.getCurrentBranch();\n\n if (currentBranch !== defaultBranch) {\n await this.ensureCleanWorkingDirectory(\"switching to default branch\");\n await this.switchToBranch(defaultBranch);\n }\n\n return defaultBranch;\n }\n\n private buildCommitCommand(\n message: string,\n options?: {\n allowEmpty?: boolean;\n authorName?: string;\n authorEmail?: string;\n },\n ): string {\n let command = `commit -m \"${this.escapeShellArg(message)}\"`;\n\n if (options?.allowEmpty) {\n command += \" --allow-empty\";\n }\n\n const authorName = options?.authorName || this.authorName;\n const authorEmail = options?.authorEmail || this.authorEmail;\n\n if (authorName && authorEmail) {\n command += ` --author=\"${authorName} <${authorEmail}>\"`;\n }\n\n return command;\n }\n\n async getRemoteUrl(): Promise<string | null> {\n try {\n return await this.runGitCommand(\"remote get-url origin\");\n } catch {\n return null;\n }\n }\n\n async pushBranch(branchName: string, force: boolean = false): Promise<void> {\n const forceFlag = force ? \"--force\" : \"\";\n await this.runGitCommand(`push ${forceFlag} -u origin ${branchName}`);\n }\n\n /**\n * Tracks whether commits were made during an operation by comparing HEAD SHA\n * before and after. Returns an object with methods to finalize the operation.\n *\n * Usage:\n * const tracker = await gitManager.trackCommitsDuring();\n * // ... do work that might create commits ...\n * const result = await tracker.finalize({ commitMessage: 'fallback message', push: true });\n */\n async trackCommitsDuring(): Promise<{\n finalize: (options: {\n commitMessage: string;\n push?: boolean;\n }) => Promise<{ commitCreated: boolean; pushedBranch: boolean }>;\n }> {\n const initialSha = await this.getCommitSha(\"HEAD\");\n\n return {\n finalize: async (options) => {\n const currentSha = await this.getCommitSha(\"HEAD\");\n const externalCommitsCreated = initialSha !== currentSha;\n const hasUncommittedChanges = await this.hasChanges();\n\n // If no commits and no changes, nothing to do\n if (!externalCommitsCreated && !hasUncommittedChanges) {\n return { commitCreated: false, pushedBranch: false };\n }\n\n let commitCreated = externalCommitsCreated;\n\n // Commit any remaining uncommitted changes\n if (hasUncommittedChanges) {\n await this.runGitCommand(\"add .\");\n const hasStagedChanges = await this.hasStagedChanges();\n\n if (hasStagedChanges) {\n await this.commitChanges(options.commitMessage);\n commitCreated = true;\n }\n }\n\n // Push if requested and commits were made\n let pushedBranch = false;\n if (options.push && commitCreated) {\n const currentBranch = await this.getCurrentBranch();\n await this.pushBranch(currentBranch);\n pushedBranch = true;\n this.logger.info(\"Pushed branch after operation\", {\n branch: currentBranch,\n });\n }\n\n return { commitCreated, pushedBranch };\n },\n };\n }\n\n async createTaskBranch(taskSlug: string): Promise<string> {\n const branchName = `posthog/task-${taskSlug}`;\n\n // Ensure we're on default branch before creating task branch\n const defaultBranch = await this.ensureOnDefaultBranch();\n\n this.logger.info(\"Creating task branch from default branch\", {\n branchName,\n taskSlug,\n baseBranch: defaultBranch,\n });\n\n await this.createOrSwitchToBranch(branchName, defaultBranch);\n\n return branchName;\n }\n\n async createTaskPlanningBranch(\n taskId: string,\n baseBranch?: string,\n ): Promise<string> {\n const baseName = `posthog/task-${taskId}-planning`;\n const branchName = await this.generateUniqueBranchName(baseName);\n\n this.logger.debug(\"Creating unique planning branch\", {\n branchName,\n taskId,\n });\n\n const base = baseBranch || (await this.ensureOnDefaultBranch());\n await this.createBranch(branchName, base);\n\n return branchName;\n }\n\n async createTaskImplementationBranch(\n taskId: string,\n planningBranchName?: string,\n ): Promise<string> {\n const baseName = `posthog/task-${taskId}-implementation`;\n const branchName = await this.generateUniqueBranchName(baseName);\n\n this.logger.debug(\"Creating unique implementation branch\", {\n branchName,\n taskId,\n currentBranch: await this.getCurrentBranch(),\n });\n\n // Determine base branch: explicit param > current planning branch > default\n let baseBranch = planningBranchName;\n\n if (!baseBranch) {\n const currentBranch = await this.getCurrentBranch();\n if (currentBranch.includes(\"-planning\")) {\n baseBranch = currentBranch;\n this.logger.debug(\"Using current planning branch\", { baseBranch });\n } else {\n baseBranch = await this.ensureOnDefaultBranch();\n this.logger.debug(\"Using default branch\", { baseBranch });\n }\n }\n\n this.logger.debug(\"Creating implementation branch from base\", {\n baseBranch,\n branchName,\n });\n await this.createBranch(branchName, baseBranch);\n\n this.logger.info(\"Implementation branch created\", {\n branchName,\n currentBranch: await this.getCurrentBranch(),\n });\n\n return branchName;\n }\n\n async commitPlan(taskId: string, taskTitle: string): Promise<string> {\n const currentBranch = await this.getCurrentBranch();\n this.logger.debug(\"Committing plan\", { taskId, currentBranch });\n\n await this.addAllPostHogFiles();\n\n const hasChanges = await this.hasStagedChanges();\n this.logger.debug(\"Checking for staged changes\", { hasChanges });\n\n if (!hasChanges) {\n this.logger.info(\"No plan changes to commit\", { taskId });\n return \"No changes to commit\";\n }\n\n const message = `📋 Add plan for task: ${taskTitle}\n\nTask ID: ${taskId}\nGenerated by PostHog Agent\n\nThis commit contains the implementation plan and supporting documentation\nfor the task. Review the plan before proceeding with implementation.`;\n\n const result = await this.commitChanges(message);\n this.logger.info(\"Plan committed\", { taskId, taskTitle });\n return result;\n }\n\n async commitImplementation(\n taskId: string,\n taskTitle: string,\n planSummary?: string,\n ): Promise<string> {\n await this.runGitCommand(\"add .\");\n\n const hasChanges = await this.hasStagedChanges();\n if (!hasChanges) {\n this.logger.warn(\"No implementation changes to commit\", { taskId });\n return \"No changes to commit\";\n }\n\n let message = `✨ Implement task: ${taskTitle}\n\nTask ID: ${taskId}\nGenerated by PostHog Agent`;\n\n if (planSummary) {\n message += `\\n\\nPlan Summary:\\n${planSummary}`;\n }\n\n message += `\\n\\nThis commit implements the changes described in the task plan.`;\n\n const result = await this.commitChanges(message);\n this.logger.info(\"Implementation committed\", { taskId, taskTitle });\n return result;\n }\n\n async deleteBranch(\n branchName: string,\n force: boolean = false,\n ): Promise<void> {\n const forceFlag = force ? \"-D\" : \"-d\";\n await this.runGitCommand(`branch ${forceFlag} ${branchName}`);\n }\n\n async deleteRemoteBranch(branchName: string): Promise<void> {\n await this.runGitCommand(`push origin --delete ${branchName}`);\n }\n\n async getBranchInfo(branchName: string): Promise<BranchInfo> {\n const exists = await this.branchExists(branchName);\n const currentBranch = await this.getCurrentBranch();\n\n return {\n name: branchName,\n exists,\n isCurrentBranch: branchName === currentBranch,\n };\n }\n\n async getCommitSha(ref: string = \"HEAD\"): Promise<string> {\n return await this.runGitCommand(`rev-parse ${ref}`);\n }\n\n async getCommitMessage(ref: string = \"HEAD\"): Promise<string> {\n return await this.runGitCommand(`log -1 --pretty=%B ${ref}`);\n }\n\n async createPullRequest(\n branchName: string,\n title: string,\n body: string,\n baseBranch?: string,\n ): Promise<string> {\n const currentBranch = await this.getCurrentBranch();\n if (currentBranch !== branchName) {\n await this.ensureCleanWorkingDirectory(\"creating PR\");\n await this.switchToBranch(branchName);\n }\n\n await this.pushBranch(branchName);\n\n let command = `gh pr create --title \"${this.escapeShellArg(title)}\" --body \"${this.escapeShellArg(body)}\"`;\n\n if (baseBranch) {\n command += ` --base ${baseBranch}`;\n }\n\n try {\n const prUrl = await this.runCommand(command);\n return prUrl.trim();\n } catch (error) {\n throw new Error(`Failed to create PR: ${error}`);\n }\n }\n\n async getTaskBranch(taskSlug: string): Promise<string | null> {\n try {\n // Get all branches matching the task slug pattern\n const branches = await this.runGitCommand(\"branch --list --all\");\n const branchPattern = `posthog/task-${taskSlug}`;\n\n // Look for exact match or with counter suffix\n const lines = branches\n .split(\"\\n\")\n .map((l) => l.trim().replace(/^\\*\\s+/, \"\"));\n for (const line of lines) {\n const cleanBranch = line.replace(\"remotes/origin/\", \"\");\n if (cleanBranch.startsWith(branchPattern)) {\n return cleanBranch;\n }\n }\n\n return null;\n } catch (error) {\n this.logger.debug(\"Failed to get task branch\", { taskSlug, error });\n return null;\n }\n }\n\n async commitAndPush(\n message: string,\n options?: { allowEmpty?: boolean },\n ): Promise<void> {\n const hasChanges = await this.hasStagedChanges();\n\n if (!hasChanges && !options?.allowEmpty) {\n this.logger.debug(\"No changes to commit, skipping\");\n return;\n }\n\n const command = this.buildCommitCommand(message, options);\n await this.runGitCommand(command);\n\n // Push to origin\n const currentBranch = await this.getCurrentBranch();\n await this.pushBranch(currentBranch);\n\n this.logger.info(\"Committed and pushed changes\", {\n branch: currentBranch,\n message,\n });\n }\n\n async isWorktree(): Promise<boolean> {\n try {\n // In a worktree, .git is a file pointing to the main repo's .git/worktrees/{name}\n // In a normal repo, .git is a directory\n const result = await this.runGitCommand(\n \"rev-parse --git-common-dir --git-dir\",\n );\n const lines = result.split(\"\\n\");\n if (lines.length >= 2) {\n const commonDir = lines[0].trim();\n const gitDir = lines[1].trim();\n // If they're different, we're in a worktree\n return commonDir !== gitDir;\n }\n return false;\n } catch {\n return false;\n }\n }\n}\n","import type {\n PostHogAPIConfig,\n PostHogResource,\n StoredEntry,\n Task,\n TaskArtifactUploadPayload,\n TaskRun,\n TaskRunArtifact,\n UrlMention,\n} from \"./types.js\";\n\ninterface PostHogApiResponse<T> {\n results?: T[];\n count?: number;\n next?: string | null;\n previous?: string | null;\n}\n\nexport type TaskRunUpdate = Partial<\n Pick<\n TaskRun,\n \"status\" | \"branch\" | \"stage\" | \"error_message\" | \"output\" | \"state\"\n >\n>;\n\nexport type TaskCreatePayload = Pick<Task, \"description\"> &\n Partial<Pick<Task, \"title\" | \"repository\" | \"origin_product\">>;\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.apiKey}`,\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 getTeamId(): number {\n return this.config.projectId;\n }\n\n getBaseUrl(): string {\n return this.baseUrl;\n }\n\n getApiKey(): string {\n return this.config.apiKey;\n }\n\n getLlmGatewayUrl(): string {\n const teamId = this.getTeamId();\n return `${this.baseUrl}/api/projects/${teamId}/llm_gateway`;\n }\n\n async fetchTask(taskId: string): Promise<Task> {\n const teamId = this.getTeamId();\n return this.apiRequest<Task>(`/api/projects/${teamId}/tasks/${taskId}/`);\n }\n\n async listTasks(filters?: {\n repository?: string;\n organization?: string;\n origin_product?: string;\n }): Promise<Task[]> {\n const teamId = this.getTeamId();\n const url = new URL(`${this.baseUrl}/api/projects/${teamId}/tasks/`);\n\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n if (value) url.searchParams.append(key, value);\n });\n }\n\n const response = await this.apiRequest<PostHogApiResponse<Task>>(\n url.pathname + url.search,\n );\n\n return response.results || [];\n }\n\n async updateTask(taskId: string, updates: Partial<Task>): Promise<Task> {\n const teamId = this.getTeamId();\n return this.apiRequest<Task>(`/api/projects/${teamId}/tasks/${taskId}/`, {\n method: \"PATCH\",\n body: JSON.stringify(updates),\n });\n }\n\n async createTask(payload: TaskCreatePayload): Promise<Task> {\n const teamId = this.getTeamId();\n return this.apiRequest<Task>(`/api/projects/${teamId}/tasks/`, {\n method: \"POST\",\n body: JSON.stringify({\n origin_product: \"user_created\",\n ...payload,\n }),\n });\n }\n\n // TaskRun methods\n async listTaskRuns(taskId: string): Promise<TaskRun[]> {\n const teamId = this.getTeamId();\n const response = await this.apiRequest<PostHogApiResponse<TaskRun>>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/`,\n );\n return response.results || [];\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 createTaskRun(\n taskId: string,\n payload?: Partial<\n Omit<\n TaskRun,\n | \"id\"\n | \"task\"\n | \"team\"\n | \"created_at\"\n | \"updated_at\"\n | \"completed_at\"\n | \"artifacts\"\n >\n >,\n ): Promise<TaskRun> {\n const teamId = this.getTeamId();\n return this.apiRequest<TaskRun>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/`,\n {\n method: \"POST\",\n body: JSON.stringify(payload || {}),\n },\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 setTaskRunOutput(\n taskId: string,\n runId: string,\n output: Record<string, unknown>,\n ): Promise<TaskRun> {\n const teamId = this.getTeamId();\n return this.apiRequest<TaskRun>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/set_output/`,\n {\n method: \"PATCH\",\n body: JSON.stringify({ output }),\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 /**\n * Fetch logs from S3 using presigned URL from TaskRun\n * @param taskRun - The task run containing the log_url\n * @returns Array of stored entries, or empty array if no logs available\n */\n async fetchTaskRunLogs(taskRun: TaskRun): Promise<StoredEntry[]> {\n if (!taskRun.log_url) {\n return [];\n }\n\n try {\n const response = await fetch(taskRun.log_url);\n\n if (!response.ok) {\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 /**\n * Fetch error details from PostHog error tracking\n */\n async fetchErrorDetails(\n errorId: string,\n projectId?: string,\n ): Promise<PostHogResource> {\n const teamId = projectId ? parseInt(projectId, 10) : this.getTeamId();\n\n try {\n const errorData = await this.apiRequest<Record<string, unknown>>(\n `/api/projects/${teamId}/error_tracking/${errorId}/`,\n );\n\n // Format error details for agent consumption\n const content = this.formatErrorContent(errorData);\n\n return {\n type: \"error\",\n id: errorId,\n url: `${this.baseUrl}/project/${teamId}/error_tracking/${errorId}`,\n title:\n (typeof errorData.exception_type === \"string\"\n ? errorData.exception_type\n : undefined) || \"Unknown Error\",\n content,\n metadata: {\n exception_type: errorData.exception_type,\n first_seen: errorData.first_seen,\n last_seen: errorData.last_seen,\n volume: errorData.volume,\n users_affected: errorData.users_affected,\n },\n };\n } catch (error) {\n throw new Error(`Failed to fetch error details for ${errorId}: ${error}`);\n }\n }\n\n /**\n * Generic resource fetcher by URL or ID\n */\n async fetchResourceByUrl(urlMention: UrlMention): Promise<PostHogResource> {\n switch (urlMention.type) {\n case \"error\": {\n if (!urlMention.id) {\n throw new Error(\"Error ID is required for error resources\");\n }\n // Extract project ID from URL if available, otherwise use default team\n let projectId: string | undefined;\n if (urlMention.url) {\n const projectIdMatch = urlMention.url.match(/\\/project\\/(\\d+)\\//);\n projectId = projectIdMatch ? projectIdMatch[1] : undefined;\n }\n return this.fetchErrorDetails(urlMention.id, projectId);\n }\n\n case \"experiment\":\n case \"insight\":\n case \"feature_flag\":\n throw new Error(\n `Resource type '${urlMention.type}' not yet implemented`,\n );\n\n case \"generic\":\n // Return a minimal resource for generic URLs\n return {\n type: \"generic\",\n id: \"\",\n url: urlMention.url,\n title: \"Generic Resource\",\n content: `Generic resource: ${urlMention.url}`,\n metadata: {},\n };\n\n default:\n throw new Error(`Unknown resource type: ${urlMention.type}`);\n }\n }\n\n /**\n * Format error data for agent consumption\n */\n private formatErrorContent(errorData: Record<string, unknown>): string {\n const sections = [];\n\n if (errorData.exception_type) {\n sections.push(`**Error Type**: ${errorData.exception_type}`);\n }\n\n if (errorData.exception_message) {\n sections.push(`**Message**: ${errorData.exception_message}`);\n }\n\n if (errorData.stack_trace) {\n sections.push(\n `**Stack Trace**:\\n\\`\\`\\`\\n${errorData.stack_trace}\\n\\`\\`\\``,\n );\n }\n\n if (errorData.volume) {\n sections.push(`**Volume**: ${errorData.volume} occurrences`);\n }\n\n if (errorData.users_affected) {\n sections.push(`**Users Affected**: ${errorData.users_affected}`);\n }\n\n if (errorData.first_seen && errorData.last_seen) {\n sections.push(`**First Seen**: ${errorData.first_seen}`);\n sections.push(`**Last Seen**: ${errorData.last_seen}`);\n }\n\n if (errorData.properties && Object.keys(errorData.properties).length > 0) {\n sections.push(\n `**Properties**: ${JSON.stringify(errorData.properties, null, 2)}`,\n );\n }\n\n return sections.join(\"\\n\\n\");\n }\n}\n","import { promises as fs } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { TemplateVariables } from \"./template-manager.js\";\nimport type {\n PostHogResource,\n ResourceType,\n SupportingFile,\n Task,\n UrlMention,\n} from \"./types.js\";\nimport { Logger } from \"./utils/logger.js\";\n\nexport interface PromptBuilderDeps {\n getTaskFiles: (taskId: string) => Promise<SupportingFile[]>;\n generatePlanTemplate: (vars: TemplateVariables) => Promise<string>;\n posthogClient?: {\n fetchResourceByUrl: (mention: UrlMention) => Promise<PostHogResource>;\n };\n logger?: Logger;\n}\n\nexport class PromptBuilder {\n private getTaskFiles: PromptBuilderDeps[\"getTaskFiles\"];\n private generatePlanTemplate: PromptBuilderDeps[\"generatePlanTemplate\"];\n private posthogClient?: PromptBuilderDeps[\"posthogClient\"];\n private logger: Logger;\n\n constructor(deps: PromptBuilderDeps) {\n this.getTaskFiles = deps.getTaskFiles;\n this.generatePlanTemplate = deps.generatePlanTemplate;\n this.posthogClient = deps.posthogClient;\n this.logger =\n deps.logger || new Logger({ debug: false, prefix: \"[PromptBuilder]\" });\n }\n\n /**\n * Extract file paths from XML tags in description\n * Format: <file path=\"relative/path.ts\" />\n */\n private extractFilePaths(description: string): string[] {\n const fileTagRegex = /<file\\s+path=\"([^\"]+)\"\\s*\\/>/g;\n const paths: string[] = [];\n let match: RegExpExecArray | null;\n\n match = fileTagRegex.exec(description);\n while (match !== null) {\n paths.push(match[1]);\n match = fileTagRegex.exec(description);\n }\n\n return paths;\n }\n\n /**\n * Read file contents from repository\n */\n private async readFileContent(\n repositoryPath: string,\n filePath: string,\n ): Promise<string | null> {\n try {\n const fullPath = join(repositoryPath, filePath);\n const content = await fs.readFile(fullPath, \"utf8\");\n return content;\n } catch (error) {\n this.logger.warn(`Failed to read referenced file: ${filePath}`, {\n error,\n });\n return null;\n }\n }\n\n /**\n * Extract URL mentions from XML tags in description\n * Formats: <error id=\"...\" />, <experiment id=\"...\" />, <url href=\"...\" />\n */\n private extractUrlMentions(description: string): UrlMention[] {\n const mentions: UrlMention[] = [];\n\n // PostHog resource mentions: <error id=\"...\" />, <experiment id=\"...\" />, etc.\n const resourceRegex =\n /<(error|experiment|insight|feature_flag)\\s+id=\"([^\"]+)\"\\s*\\/>/g;\n let match: RegExpExecArray | null;\n\n match = resourceRegex.exec(description);\n while (match !== null) {\n const [, type, id] = match;\n mentions.push({\n url: \"\", // Will be reconstructed if needed\n type: type as ResourceType,\n id,\n label: this.generateUrlLabel(\"\", type as ResourceType),\n });\n match = resourceRegex.exec(description);\n }\n\n // Generic URL mentions: <url href=\"...\" />\n const urlRegex = /<url\\s+href=\"([^\"]+)\"\\s*\\/>/g;\n match = urlRegex.exec(description);\n while (match !== null) {\n const [, url] = match;\n mentions.push({\n url,\n type: \"generic\",\n label: this.generateUrlLabel(url, \"generic\"),\n });\n match = urlRegex.exec(description);\n }\n\n return mentions;\n }\n\n /**\n * Generate a display label for a URL mention\n */\n private generateUrlLabel(url: string, type: string): string {\n try {\n const urlObj = new URL(url);\n switch (type) {\n case \"error\": {\n const errorMatch = url.match(/error_tracking\\/([a-f0-9-]+)/);\n return errorMatch ? `Error ${errorMatch[1].slice(0, 8)}...` : \"Error\";\n }\n case \"experiment\": {\n const expMatch = url.match(/experiments\\/(\\d+)/);\n return expMatch ? `Experiment #${expMatch[1]}` : \"Experiment\";\n }\n case \"insight\":\n return \"Insight\";\n case \"feature_flag\":\n return \"Feature Flag\";\n default:\n return urlObj.hostname;\n }\n } catch {\n return \"URL\";\n }\n }\n\n /**\n * Process URL references and fetch their content\n */\n private async processUrlReferences(\n description: string,\n ): Promise<{ description: string; referencedResources: PostHogResource[] }> {\n const urlMentions = this.extractUrlMentions(description);\n const referencedResources: PostHogResource[] = [];\n\n if (urlMentions.length === 0 || !this.posthogClient) {\n return { description, referencedResources };\n }\n\n // Fetch all referenced resources\n for (const mention of urlMentions) {\n try {\n const resource = await this.posthogClient.fetchResourceByUrl(mention);\n referencedResources.push(resource);\n } catch (error) {\n this.logger.warn(`Failed to fetch resource from URL: ${mention.url}`, {\n error,\n });\n // Add a placeholder resource for failed fetches\n referencedResources.push({\n type: mention.type,\n id: mention.id || \"\",\n url: mention.url,\n title: mention.label || \"Unknown Resource\",\n content: `Failed to fetch resource from ${mention.url}: ${error}`,\n metadata: {},\n });\n }\n }\n\n // Replace URL tags with just the label for readability\n let processedDescription = description;\n for (const mention of urlMentions) {\n if (mention.type === \"generic\") {\n // Generic URLs: <url href=\"...\" />\n const escapedUrl = mention.url.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n processedDescription = processedDescription.replace(\n new RegExp(`<url\\\\s+href=\"${escapedUrl}\"\\\\s*/>`, \"g\"),\n `@${mention.label}`,\n );\n } else {\n // PostHog resources: <error id=\"...\" />, <experiment id=\"...\" />, etc.\n const escapedType = mention.type.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const escapedId = mention.id\n ? mention.id.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\n : \"\";\n processedDescription = processedDescription.replace(\n new RegExp(`<${escapedType}\\\\s+id=\"${escapedId}\"\\\\s*/>`, \"g\"),\n `@${mention.label}`,\n );\n }\n }\n\n return { description: processedDescription, referencedResources };\n }\n\n /**\n * Process description to extract file tags and read contents\n * Returns processed description and referenced file contents\n */\n private async processFileReferences(\n description: string,\n repositoryPath?: string,\n ): Promise<{\n description: string;\n referencedFiles: Array<{ path: string; content: string }>;\n }> {\n const filePaths = this.extractFilePaths(description);\n const referencedFiles: Array<{ path: string; content: string }> = [];\n\n if (filePaths.length === 0 || !repositoryPath) {\n return { description, referencedFiles };\n }\n\n // Read all referenced files\n for (const filePath of filePaths) {\n const content = await this.readFileContent(repositoryPath, filePath);\n if (content !== null) {\n referencedFiles.push({ path: filePath, content });\n }\n }\n\n // Replace file tags with just the filename for readability\n let processedDescription = description;\n for (const filePath of filePaths) {\n const fileName = filePath.split(\"/\").pop() || filePath;\n processedDescription = processedDescription.replace(\n new RegExp(\n `<file\\\\s+path=\"${filePath.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}\"\\\\s*/>`,\n \"g\",\n ),\n `@${fileName}`,\n );\n }\n\n return { description: processedDescription, referencedFiles };\n }\n\n async buildResearchPrompt(\n task: Task,\n repositoryPath?: string,\n ): Promise<string> {\n // Process file references in description\n const { description: descriptionAfterFiles, referencedFiles } =\n await this.processFileReferences(task.description, repositoryPath);\n\n // Process URL references in description\n const { description: processedDescription, referencedResources } =\n await this.processUrlReferences(descriptionAfterFiles);\n\n let prompt = \"<task>\\n\";\n prompt += `<title>${task.title}</title>\\n`;\n prompt += `<description>${processedDescription}</description>\\n`;\n\n if (task.repository) {\n prompt += `<repository>${task.repository}</repository>\\n`;\n }\n prompt += \"</task>\\n\";\n\n // Add referenced files from @ mentions\n if (referencedFiles.length > 0) {\n prompt += \"\\n<referenced_files>\\n\";\n for (const file of referencedFiles) {\n prompt += `<file path=\"${file.path}\">\\n\\`\\`\\`\\n${file.content}\\n\\`\\`\\`\\n</file>\\n`;\n }\n prompt += \"</referenced_files>\\n\";\n }\n\n // Add referenced resources from URL mentions\n if (referencedResources.length > 0) {\n prompt += \"\\n<referenced_resources>\\n\";\n for (const resource of referencedResources) {\n prompt += `<resource type=\"${resource.type}\" url=\"${resource.url}\">\\n`;\n prompt += `<title>${resource.title}</title>\\n`;\n prompt += `<content>${resource.content}</content>\\n`;\n prompt += \"</resource>\\n\";\n }\n prompt += \"</referenced_resources>\\n\";\n }\n\n try {\n const taskFiles = await this.getTaskFiles(task.id);\n const contextFiles = taskFiles.filter(\n (f: SupportingFile) => f.type === \"context\" || f.type === \"reference\",\n );\n if (contextFiles.length > 0) {\n prompt += \"\\n<supporting_files>\\n\";\n for (const file of contextFiles) {\n prompt += `<file name=\"${file.name}\" type=\"${file.type}\">\\n${file.content}\\n</file>\\n`;\n }\n prompt += \"</supporting_files>\\n\";\n }\n } catch (_error) {\n this.logger.debug(\"No existing task files found for research\", {\n taskId: task.id,\n });\n }\n\n return prompt;\n }\n\n async buildPlanningPrompt(\n task: Task,\n repositoryPath?: string,\n ): Promise<string> {\n // Process file references in description\n const { description: descriptionAfterFiles, referencedFiles } =\n await this.processFileReferences(task.description, repositoryPath);\n\n // Process URL references in description\n const { description: processedDescription, referencedResources } =\n await this.processUrlReferences(descriptionAfterFiles);\n\n let prompt = \"<task>\\n\";\n prompt += `<title>${task.title}</title>\\n`;\n prompt += `<description>${processedDescription}</description>\\n`;\n\n if (task.repository) {\n prompt += `<repository>${task.repository}</repository>\\n`;\n }\n prompt += \"</task>\\n\";\n\n // Add referenced files from @ mentions\n if (referencedFiles.length > 0) {\n prompt += \"\\n<referenced_files>\\n\";\n for (const file of referencedFiles) {\n prompt += `<file path=\"${file.path}\">\\n\\`\\`\\`\\n${file.content}\\n\\`\\`\\`\\n</file>\\n`;\n }\n prompt += \"</referenced_files>\\n\";\n }\n\n // Add referenced resources from URL mentions\n if (referencedResources.length > 0) {\n prompt += \"\\n<referenced_resources>\\n\";\n for (const resource of referencedResources) {\n prompt += `<resource type=\"${resource.type}\" url=\"${resource.url}\">\\n`;\n prompt += `<title>${resource.title}</title>\\n`;\n prompt += `<content>${resource.content}</content>\\n`;\n prompt += \"</resource>\\n\";\n }\n prompt += \"</referenced_resources>\\n\";\n }\n\n try {\n const taskFiles = await this.getTaskFiles(task.id);\n const contextFiles = taskFiles.filter(\n (f: SupportingFile) => f.type === \"context\" || f.type === \"reference\",\n );\n if (contextFiles.length > 0) {\n prompt += \"\\n<supporting_files>\\n\";\n for (const file of contextFiles) {\n prompt += `<file name=\"${file.name}\" type=\"${file.type}\">\\n${file.content}\\n</file>\\n`;\n }\n prompt += \"</supporting_files>\\n\";\n }\n } catch (_error) {\n this.logger.debug(\"No existing task files found for planning\", {\n taskId: task.id,\n });\n }\n\n const templateVariables = {\n task_id: task.id,\n task_title: task.title,\n task_description: processedDescription,\n date: new Date().toISOString().split(\"T\")[0],\n repository: task.repository || \"\",\n };\n\n const planTemplate = await this.generatePlanTemplate(templateVariables);\n\n prompt += \"\\n<instructions>\\n\";\n prompt +=\n \"Analyze the codebase and create a detailed implementation plan. Use the template structure below, filling each section with specific, actionable information.\\n\";\n prompt += \"</instructions>\\n\\n\";\n prompt += \"<plan_template>\\n\";\n prompt += planTemplate;\n prompt += \"\\n</plan_template>\";\n\n return prompt;\n }\n\n async buildExecutionPrompt(\n task: Task,\n repositoryPath?: string,\n ): Promise<string> {\n // Process file references in description\n const { description: descriptionAfterFiles, referencedFiles } =\n await this.processFileReferences(task.description, repositoryPath);\n\n // Process URL references in description\n const { description: processedDescription, referencedResources } =\n await this.processUrlReferences(descriptionAfterFiles);\n\n let prompt = \"<task>\\n\";\n prompt += `<title>${task.title}</title>\\n`;\n prompt += `<description>${processedDescription}</description>\\n`;\n\n if (task.repository) {\n prompt += `<repository>${task.repository}</repository>\\n`;\n }\n prompt += \"</task>\\n\";\n\n // Add referenced files from @ mentions\n if (referencedFiles.length > 0) {\n prompt += \"\\n<referenced_files>\\n\";\n for (const file of referencedFiles) {\n prompt += `<file path=\"${file.path}\">\\n\\`\\`\\`\\n${file.content}\\n\\`\\`\\`\\n</file>\\n`;\n }\n prompt += \"</referenced_files>\\n\";\n }\n\n // Add referenced resources from URL mentions\n if (referencedResources.length > 0) {\n prompt += \"\\n<referenced_resources>\\n\";\n for (const resource of referencedResources) {\n prompt += `<resource type=\"${resource.type}\" url=\"${resource.url}\">\\n`;\n prompt += `<title>${resource.title}</title>\\n`;\n prompt += `<content>${resource.content}</content>\\n`;\n prompt += \"</resource>\\n\";\n }\n prompt += \"</referenced_resources>\\n\";\n }\n\n try {\n const taskFiles = await this.getTaskFiles(task.id);\n const hasPlan = taskFiles.some((f: SupportingFile) => f.type === \"plan\");\n const todosFile = taskFiles.find(\n (f: SupportingFile) => f.name === \"todos.json\",\n );\n\n if (taskFiles.length > 0) {\n prompt += \"\\n<context>\\n\";\n for (const file of taskFiles) {\n if (file.type === \"plan\") {\n prompt += `<plan>\\n${file.content}\\n</plan>\\n`;\n } else if (file.name === \"todos.json\") {\n } else {\n prompt += `<file name=\"${file.name}\" type=\"${file.type}\">\\n${file.content}\\n</file>\\n`;\n }\n }\n prompt += \"</context>\\n\";\n }\n\n // Add todos context if resuming work\n if (todosFile) {\n try {\n const todos = JSON.parse(todosFile.content);\n if (todos.items && todos.items.length > 0) {\n prompt += \"\\n<previous_todos>\\n\";\n prompt +=\n \"You previously created the following todo list for this task:\\n\\n\";\n for (const item of todos.items) {\n const statusIcon =\n item.status === \"completed\"\n ? \"✓\"\n : item.status === \"in_progress\"\n ? \"▶\"\n : \"○\";\n prompt += `${statusIcon} [${item.status}] ${item.content}\\n`;\n }\n prompt += `\\nProgress: ${todos.metadata.completed}/${todos.metadata.total} completed\\n`;\n prompt +=\n \"\\nYou can reference this list when resuming work or create an updated list as needed.\\n\";\n prompt += \"</previous_todos>\\n\";\n }\n } catch (error) {\n this.logger.debug(\"Failed to parse todos.json for context\", {\n error,\n });\n }\n }\n\n prompt += \"\\n<instructions>\\n\";\n if (hasPlan) {\n prompt +=\n \"Implement the changes described in the execution plan. Follow the plan step-by-step and make the necessary file modifications.\\n\";\n } else {\n prompt +=\n \"Implement the changes described in the task. Make the necessary file modifications to complete the task.\\n\";\n }\n prompt += \"</instructions>\";\n } catch (_error) {\n this.logger.debug(\"No supporting files found for execution\", {\n taskId: task.id,\n });\n prompt += \"\\n<instructions>\\n\";\n prompt += \"Implement the changes described in the task.\\n\";\n prompt += \"</instructions>\";\n }\n\n return prompt;\n }\n}\n","import type { PostHogAPIClient, TaskRunUpdate } from \"./posthog-api.js\";\nimport type { StoredNotification, TaskRun } from \"./types.js\";\nimport { Logger } from \"./utils/logger.js\";\n\nexport interface SessionPersistenceConfig {\n taskId: string;\n runId: string;\n logUrl: string;\n sdkSessionId?: string;\n}\n\nexport class SessionStore {\n private posthogAPI?: PostHogAPIClient;\n private pendingEntries: Map<string, StoredNotification[]> = new Map();\n private flushTimeouts: Map<string, NodeJS.Timeout> = new Map();\n private configs: Map<string, SessionPersistenceConfig> = new Map();\n private logger: Logger;\n\n constructor(posthogAPI?: PostHogAPIClient, logger?: Logger) {\n this.posthogAPI = posthogAPI;\n this.logger =\n logger ?? new Logger({ debug: false, prefix: \"[SessionStore]\" });\n\n // Flush all pending on process exit\n const flushAllAndExit = async () => {\n const flushPromises: Promise<void>[] = [];\n for (const sessionId of this.configs.keys()) {\n flushPromises.push(this.flush(sessionId));\n }\n await Promise.all(flushPromises);\n process.exit(0);\n };\n\n process.on(\"beforeExit\", () => {\n flushAllAndExit().catch((e) => this.logger.error(\"Flush failed:\", e));\n });\n process.on(\"SIGINT\", () => {\n flushAllAndExit().catch((e) => this.logger.error(\"Flush failed:\", e));\n });\n process.on(\"SIGTERM\", () => {\n flushAllAndExit().catch((e) => this.logger.error(\"Flush failed:\", e));\n });\n }\n\n /** Register a session for persistence */\n register(sessionId: string, config: SessionPersistenceConfig): void {\n this.configs.set(sessionId, config);\n }\n\n /** Unregister and flush pending */\n async unregister(sessionId: string): Promise<void> {\n await this.flush(sessionId);\n this.configs.delete(sessionId);\n }\n\n /** Check if a session is registered for persistence */\n isRegistered(sessionId: string): boolean {\n return this.configs.has(sessionId);\n }\n\n /**\n * Append a raw JSON-RPC line for persistence.\n * Parses and wraps as StoredNotification for the API.\n */\n appendRawLine(sessionId: string, line: string): void {\n const config = this.configs.get(sessionId);\n if (!config) {\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 const pending = this.pendingEntries.get(sessionId) ?? [];\n pending.push(entry);\n this.pendingEntries.set(sessionId, pending);\n\n this.scheduleFlush(sessionId);\n } catch {\n this.logger.warn(\"Failed to parse raw line for persistence\", {\n sessionId,\n lineLength: line.length,\n });\n }\n }\n\n /** Load raw JSON-RPC messages from S3 */\n async load(logUrl: string): Promise<StoredNotification[]> {\n const response = await fetch(logUrl);\n\n if (!response.ok) {\n return [];\n }\n\n const content = await response.text();\n if (!content.trim()) return [];\n\n return content\n .trim()\n .split(\"\\n\")\n .map((line) => {\n try {\n return JSON.parse(line) as StoredNotification;\n } catch {\n return null;\n }\n })\n .filter((entry): entry is StoredNotification => entry !== null);\n }\n\n /**\n * Poll S3 for new entries since last check.\n * Used for interrupt handling in cloud mode.\n */\n async pollForNewEntries(\n sessionId: string,\n lastKnownCount: number,\n ): Promise<StoredNotification[]> {\n const config = this.configs.get(sessionId);\n if (!config?.logUrl) return [];\n\n const entries = await this.load(config.logUrl);\n return entries.slice(lastKnownCount);\n }\n\n /** Force flush pending entries */\n async flush(sessionId: string): Promise<void> {\n const config = this.configs.get(sessionId);\n const pending = this.pendingEntries.get(sessionId);\n\n if (!config || !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 if (!this.posthogAPI) {\n this.logger.debug(\"No PostHog API configured, skipping flush\");\n return;\n }\n\n try {\n await this.posthogAPI.appendTaskRunLog(\n config.taskId,\n config.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 /** Get the persistence config for a session */\n getConfig(sessionId: string): SessionPersistenceConfig | undefined {\n return this.configs.get(sessionId);\n }\n\n /**\n * Start a session for persistence.\n * Loads the task run and updates status to \"in_progress\".\n */\n async start(\n sessionId: string,\n taskId: string,\n runId: string,\n ): Promise<TaskRun | undefined> {\n if (!this.posthogAPI) {\n this.logger.debug(\n \"No PostHog API configured, registering session without persistence\",\n );\n this.register(sessionId, {\n taskId,\n runId,\n logUrl: \"\",\n });\n return undefined;\n }\n\n const taskRun = await this.posthogAPI.getTaskRun(taskId, runId);\n\n this.register(sessionId, {\n taskId,\n runId,\n logUrl: taskRun.log_url,\n });\n\n await this.updateTaskRun(sessionId, { status: \"in_progress\" });\n\n return taskRun;\n }\n\n /**\n * Mark a session as completed.\n */\n async complete(sessionId: string): Promise<void> {\n await this.flush(sessionId);\n await this.updateTaskRun(sessionId, { status: \"completed\" });\n }\n\n /**\n * Mark a session as failed.\n */\n async fail(sessionId: string, error: Error | string): Promise<void> {\n await this.flush(sessionId);\n const message = typeof error === \"string\" ? error : error.message;\n await this.updateTaskRun(sessionId, {\n status: \"failed\",\n error_message: message,\n });\n this.logger.error(\"Session failed\", { sessionId, error: message });\n }\n\n /**\n * Update the task run associated with a session.\n */\n async updateTaskRun(\n sessionId: string,\n update: TaskRunUpdate,\n ): Promise<TaskRun | undefined> {\n const config = this.configs.get(sessionId);\n if (!config) {\n this.logger.error(\n `Cannot update task run: session ${sessionId} not registered`,\n );\n return undefined;\n }\n\n if (!this.posthogAPI) {\n this.logger.debug(\"No PostHog API configured, skipping task run update\");\n return undefined;\n }\n\n try {\n return await this.posthogAPI.updateTaskRun(\n config.taskId,\n config.runId,\n update,\n );\n } catch (error) {\n this.logger.error(\"Failed to update task run:\", error);\n return undefined;\n }\n }\n}\n","import { randomBytes } from \"node:crypto\";\n\nexport interface TaskExecutionState {\n taskId: string;\n status: \"running\" | \"completed\" | \"failed\" | \"canceled\" | \"timeout\";\n mode: \"plan_only\" | \"plan_and_build\" | \"build_only\";\n result?: unknown;\n startedAt: number;\n completedAt?: number;\n abortController?: AbortController;\n}\n\nexport class TaskManager {\n public executionStates = new Map<string, TaskExecutionState>();\n private defaultTimeout = 10 * 60 * 1000; // 10 minutes\n\n generateExecutionId(): string {\n return randomBytes(16).toString(\"hex\");\n }\n\n startExecution(\n taskId: string,\n mode: \"plan_only\" | \"plan_and_build\" | \"build_only\",\n executionId: string = this.generateExecutionId(),\n ): TaskExecutionState {\n const executionState: TaskExecutionState = {\n taskId,\n status: \"running\",\n mode,\n startedAt: Date.now(),\n abortController: new AbortController(),\n };\n\n this.executionStates.set(executionId, executionState);\n this.scheduleTimeout(executionId);\n\n return executionState;\n }\n\n async waitForCompletion(executionId: string): Promise<unknown> {\n const execution = this.executionStates.get(executionId);\n if (!execution) {\n throw new Error(`Execution ${executionId} not found`);\n }\n\n if (execution.result && execution.status === \"completed\") {\n return execution.result;\n }\n\n return new Promise((resolve, reject) => {\n const checkInterval = setInterval(() => {\n const currentExecution = this.executionStates.get(executionId);\n if (!currentExecution) {\n clearInterval(checkInterval);\n reject(new Error(`Execution ${executionId} disappeared`));\n return;\n }\n\n if (\n currentExecution.status === \"completed\" &&\n currentExecution.result\n ) {\n clearInterval(checkInterval);\n resolve(currentExecution.result);\n } else if (\n currentExecution.status === \"failed\" ||\n currentExecution.status === \"canceled\" ||\n currentExecution.status === \"timeout\"\n ) {\n clearInterval(checkInterval);\n reject(\n new Error(`Execution ${executionId} ${currentExecution.status}`),\n );\n }\n }, 100);\n });\n }\n\n completeExecution(executionId: string, result: unknown): void {\n const execution = this.executionStates.get(executionId);\n if (!execution) {\n throw new Error(`Execution ${executionId} not found`);\n }\n\n execution.status = \"completed\";\n execution.result = result;\n execution.completedAt = Date.now();\n }\n\n failExecution(executionId: string, error: Error): void {\n const execution = this.executionStates.get(executionId);\n if (!execution) {\n throw new Error(`Execution ${executionId} not found`);\n }\n\n execution.status = \"failed\";\n execution.completedAt = Date.now();\n execution.result = {\n error: error.message,\n status: \"failed\",\n };\n }\n\n cancelExecution(executionId: string): void {\n const execution = this.executionStates.get(executionId);\n if (!execution) {\n throw new Error(`Execution ${executionId} not found`);\n }\n\n execution.status = \"canceled\";\n execution.completedAt = Date.now();\n execution.abortController?.abort();\n\n if (!execution.result) {\n execution.result = {\n status: \"canceled\",\n message: \"Execution was canceled\",\n };\n }\n }\n\n getExecution(executionId: string): TaskExecutionState | undefined {\n return this.executionStates.get(executionId);\n }\n\n getAbortSignal(executionId: string): AbortSignal | undefined {\n return this.executionStates.get(executionId)?.abortController?.signal;\n }\n\n getAbortController(executionId: string): AbortController | undefined {\n return this.executionStates.get(executionId)?.abortController;\n }\n\n private scheduleTimeout(\n executionId: string,\n timeout: number = this.defaultTimeout,\n ): void {\n setTimeout(() => {\n const execution = this.executionStates.get(executionId);\n if (execution && execution.status === \"running\") {\n execution.status = \"timeout\";\n execution.completedAt = Date.now();\n execution.abortController?.abort();\n\n if (!execution.result) {\n execution.result = {\n status: \"timeout\",\n message: \"Execution timed out\",\n };\n }\n }\n }, timeout);\n }\n\n cleanup(olderThan: number = 60 * 60 * 1000): void {\n const cutoff = Date.now() - olderThan;\n for (const [executionId, execution] of this.executionStates) {\n if (execution.completedAt && execution.completedAt < cutoff) {\n this.executionStates.delete(executionId);\n }\n }\n }\n}\n","import { existsSync, promises as fs } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { Logger } from \"./utils/logger\";\n\nconst logger = new Logger({ prefix: \"[TemplateManager]\" });\n\nexport interface TemplateVariables {\n task_id: string;\n task_title: string;\n task_description?: string;\n date: string;\n repository?: string;\n [key: string]: string | undefined;\n}\n\nexport class TemplateManager {\n private templatesDir: string;\n\n constructor() {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n\n // Exhaustive list of possible template locations\n const candidateDirs = [\n // Standard build output (dist/src/template-manager.js -> dist/templates)\n join(__dirname, \"..\", \"templates\"),\n\n // If preserveModules creates nested structure (dist/src/template-manager.js -> dist/src/templates)\n join(__dirname, \"templates\"),\n\n // Development scenarios (src/template-manager.ts -> src/templates)\n join(__dirname, \"..\", \"..\", \"src\", \"templates\"),\n\n // Package root templates directory\n join(__dirname, \"..\", \"..\", \"templates\"),\n\n // When node_modules symlink or installed (node_modules/@posthog/agent/dist/src/... -> node_modules/@posthog/agent/dist/templates)\n join(__dirname, \"..\", \"..\", \"dist\", \"templates\"),\n\n // When consumed from node_modules deep in tree\n join(__dirname, \"..\", \"..\", \"..\", \"templates\"),\n join(__dirname, \"..\", \"..\", \"..\", \"dist\", \"templates\"),\n join(__dirname, \"..\", \"..\", \"..\", \"src\", \"templates\"),\n\n // When bundled by Vite/Webpack (e.g., .vite/build/index.js -> node_modules/@posthog/agent/dist/templates)\n // Try to find node_modules from current location\n join(\n __dirname,\n \"..\",\n \"node_modules\",\n \"@posthog\",\n \"agent\",\n \"dist\",\n \"templates\",\n ),\n join(\n __dirname,\n \"..\",\n \"..\",\n \"node_modules\",\n \"@posthog\",\n \"agent\",\n \"dist\",\n \"templates\",\n ),\n join(\n __dirname,\n \"..\",\n \"..\",\n \"..\",\n \"node_modules\",\n \"@posthog\",\n \"agent\",\n \"dist\",\n \"templates\",\n ),\n ];\n\n const resolvedDir = candidateDirs.find((dir) => existsSync(dir));\n\n if (!resolvedDir) {\n logger.error(\"Could not find templates directory.\");\n logger.error(`Current file: ${__filename}`);\n logger.error(`Current dir: ${__dirname}`);\n logger.error(\n `Tried: ${candidateDirs.map((d) => `\\n - ${d} (exists: ${existsSync(d)})`).join(\"\")}`,\n );\n }\n\n this.templatesDir = resolvedDir ?? candidateDirs[0];\n }\n\n private async loadTemplate(templateName: string): Promise<string> {\n try {\n const templatePath = join(this.templatesDir, templateName);\n return await fs.readFile(templatePath, \"utf8\");\n } catch (error) {\n throw new Error(\n `Failed to load template ${templateName} from ${this.templatesDir}: ${error}`,\n );\n }\n }\n\n private substituteVariables(\n template: string,\n variables: TemplateVariables,\n ): string {\n let result = template;\n\n for (const [key, value] of Object.entries(variables)) {\n if (value !== undefined) {\n const placeholder = new RegExp(`{{${key}}}`, \"g\");\n result = result.replace(placeholder, value);\n }\n }\n\n result = result.replace(/{{[^}]+}}/g, \"[PLACEHOLDER]\");\n\n return result;\n }\n\n async generatePlan(variables: TemplateVariables): Promise<string> {\n const template = await this.loadTemplate(\"plan-template.md\");\n return this.substituteVariables(template, {\n ...variables,\n date: variables.date || new Date().toISOString().split(\"T\")[0],\n });\n }\n\n async generateCustomFile(\n templateName: string,\n variables: TemplateVariables,\n ): Promise<string> {\n const template = await this.loadTemplate(templateName);\n return this.substituteVariables(template, {\n ...variables,\n date: variables.date || new Date().toISOString().split(\"T\")[0],\n });\n }\n\n async createTaskStructure(\n taskId: string,\n taskTitle: string,\n options?: {\n includePlan?: boolean;\n additionalFiles?: Array<{\n name: string;\n template?: string;\n content?: string;\n }>;\n },\n ): Promise<\n Array<{\n name: string;\n content: string;\n type: \"plan\" | \"context\" | \"reference\" | \"output\";\n }>\n > {\n const files: Array<{\n name: string;\n content: string;\n type: \"plan\" | \"context\" | \"reference\" | \"output\";\n }> = [];\n\n const variables: TemplateVariables = {\n task_id: taskId,\n task_title: taskTitle,\n date: new Date().toISOString().split(\"T\")[0],\n };\n\n // Generate plan file if requested\n if (options?.includePlan !== false) {\n const planContent = await this.generatePlan(variables);\n files.push({\n name: \"plan.md\",\n content: planContent,\n type: \"plan\",\n });\n }\n\n if (options?.additionalFiles) {\n for (const file of options.additionalFiles) {\n let content: string;\n\n if (file.template) {\n content = await this.generateCustomFile(file.template, variables);\n } else if (file.content) {\n content = this.substituteVariables(file.content, variables);\n } else {\n content = `# ${file.name}\\n\\nPlaceholder content for ${file.name}`;\n }\n\n files.push({\n name: file.name,\n content,\n type: file.name.includes(\"context\") ? \"context\" : \"reference\",\n });\n }\n }\n\n return files;\n }\n\n generatePostHogReadme(): string {\n return `# PostHog Task Files\n\nThis directory contains task-related files generated by the PostHog Agent.\n\n## Structure\n\nEach task has its own subdirectory: \\`.posthog/{task-id}/\\`\n\n### Common Files\n\n- **plan.md** - Implementation plan generated during planning phase\n- **Supporting files** - Any additional files added for task context\n- **artifacts/** - Generated files, outputs, and temporary artifacts\n\n### Usage\n\nThese files are:\n- Version controlled alongside your code\n- Used by the PostHog Agent for context\n- Available for review in pull requests\n- Organized by task ID for easy reference\n\n### Gitignore\n\nCustomize \\`.posthog/.gitignore\\` to control which files are committed:\n- Include plans and documentation by default\n- Exclude temporary files and sensitive data\n- Customize based on your team's needs\n\n---\n\n*Generated by PostHog Agent*\n`;\n }\n}\n","import { query } from \"@anthropic-ai/claude-agent-sdk\";\nimport { POSTHOG_NOTIFICATIONS } from \"../../acp-extensions.js\";\nimport { EXECUTION_SYSTEM_PROMPT } from \"../../agents/execution.js\";\nimport { TodoManager } from \"../../todo-manager.js\";\nimport { PermissionMode } from \"../../types.js\";\nimport type { WorkflowStepRunner } from \"../types.js\";\n\nexport const buildStep: WorkflowStepRunner = async ({ step, context }) => {\n const {\n task,\n cwd,\n options,\n logger,\n promptBuilder,\n sessionId,\n mcpServers,\n gitManager,\n sendNotification,\n } = context;\n\n const stepLogger = logger.child(\"BuildStep\");\n\n const latestRun = task.latest_run;\n const prExists =\n latestRun?.output && typeof latestRun.output === \"object\"\n ? (latestRun.output as Record<string, unknown>).pr_url\n : null;\n\n if (prExists) {\n stepLogger.info(\"PR already exists, skipping build phase\", {\n taskId: task.id,\n });\n return { status: \"skipped\" };\n }\n\n stepLogger.info(\"Starting build phase\", { taskId: task.id });\n await sendNotification(POSTHOG_NOTIFICATIONS.PHASE_START, {\n sessionId,\n phase: \"build\",\n });\n\n const executionPrompt = await promptBuilder.buildExecutionPrompt(task, cwd);\n const fullPrompt = `${EXECUTION_SYSTEM_PROMPT}\\n\\n${executionPrompt}`;\n\n const configuredPermissionMode =\n options.permissionMode ??\n (typeof step.permissionMode === \"string\"\n ? (step.permissionMode as PermissionMode)\n : step.permissionMode) ??\n PermissionMode.ACCEPT_EDITS;\n\n const baseOptions: Record<string, unknown> = {\n model: step.model,\n cwd,\n permissionMode: configuredPermissionMode,\n settingSources: [\"local\"],\n mcpServers,\n // Allow all tools for build phase - full read/write access needed for implementation\n allowedTools: [\n \"Task\",\n \"Bash\",\n \"BashOutput\",\n \"KillBash\",\n \"Edit\",\n \"Read\",\n \"Write\",\n \"Glob\",\n \"Grep\",\n \"NotebookEdit\",\n \"WebFetch\",\n \"WebSearch\",\n \"ListMcpResources\",\n \"ReadMcpResource\",\n \"TodoWrite\",\n ],\n };\n\n // Add fine-grained permission hook if provided\n if (options.canUseTool) {\n baseOptions.canUseTool = options.canUseTool;\n }\n\n const response = query({\n prompt: fullPrompt,\n options: { ...baseOptions, ...(options.queryOverrides || {}) },\n });\n\n // Track commits made during Claude Code execution\n const commitTracker = await gitManager.trackCommitsDuring();\n\n // Track todos from TodoWrite tool calls\n const todoManager = new TodoManager(context.fileManager, stepLogger);\n\n try {\n for await (const message of response) {\n const todoList = await todoManager.checkAndPersistFromMessage(\n message,\n task.id,\n );\n if (todoList) {\n await sendNotification(POSTHOG_NOTIFICATIONS.ARTIFACT, {\n sessionId,\n kind: \"todos\",\n content: todoList,\n });\n }\n }\n } catch (error) {\n stepLogger.error(\"Error during build step query\", error);\n throw error;\n }\n\n // Finalize: commit any remaining changes and optionally push\n const { commitCreated, pushedBranch } = await commitTracker.finalize({\n commitMessage: `Implementation for ${task.title}`,\n push: step.push,\n });\n\n context.stepResults[step.id] = { commitCreated };\n\n if (!commitCreated) {\n stepLogger.warn(\"No changes to commit in build phase\", { taskId: task.id });\n } else {\n stepLogger.info(\"Build commits finalized\", {\n taskId: task.id,\n pushedBranch,\n });\n }\n\n await sendNotification(POSTHOG_NOTIFICATIONS.PHASE_COMPLETE, {\n sessionId,\n phase: \"build\",\n });\n return { status: \"completed\" };\n};\n","export const EXECUTION_SYSTEM_PROMPT = `<role>\nPostHog AI Execution Agent — autonomously implement tasks as merge-ready code following project conventions.\n</role>\n\n<context>\nYou have access to local repository files and PostHog MCP server. Work primarily with local files for implementation. Commit changes regularly.\n</context>\n\n<constraints>\n- Follow existing code style, patterns, and conventions found in the repository\n- Minimize new external dependencies — only add when necessary\n- Implement structured logging and error handling (never log secrets)\n- Avoid destructive shell commands\n- Create/update .gitignore to exclude build artifacts, dependencies, and temp files\n</constraints>\n\n<approach>\n1. Review the implementation plan if provided, or create your own todo list\n2. Execute changes step by step\n3. Test thoroughly and verify functionality\n4. Commit changes with clear messages\n</approach>\n\n<checklist>\nBefore completing the task, verify:\n- .gitignore includes build artifacts, node_modules, __pycache__, etc.\n- Dependency files (package.json, requirements.txt) use exact versions\n- Code compiles and tests pass\n- Added or updated relevant tests\n- Captured meaningful events with PostHog SDK where appropriate\n- Wrapped new logic in PostHog feature flags where appropriate\n- Updated documentation, README, or type hints as needed\n</checklist>\n\n<output_format>\nProvide a concise summary of changes made when finished.\n</output_format>`;\n","import type { PostHogFileManager } from \"./file-manager.js\";\nimport { Logger } from \"./utils/logger.js\";\n\nexport interface TodoItem {\n content: string;\n status: \"pending\" | \"in_progress\" | \"completed\";\n activeForm: string;\n}\n\nexport interface TodoList {\n items: TodoItem[];\n metadata: {\n total: number;\n pending: number;\n in_progress: number;\n completed: number;\n last_updated: string;\n };\n}\n\nexport class TodoManager {\n private fileManager: PostHogFileManager;\n private logger: Logger;\n\n constructor(fileManager: PostHogFileManager, logger?: Logger) {\n this.fileManager = fileManager;\n this.logger =\n logger || new Logger({ debug: false, prefix: \"[TodoManager]\" });\n }\n\n async readTodos(taskId: string): Promise<TodoList | null> {\n try {\n const content = await this.fileManager.readTaskFile(taskId, \"todos.json\");\n if (!content) {\n return null;\n }\n\n const parsed = JSON.parse(content) as TodoList;\n this.logger.debug(\"Loaded todos\", {\n taskId,\n total: parsed.metadata.total,\n pending: parsed.metadata.pending,\n in_progress: parsed.metadata.in_progress,\n completed: parsed.metadata.completed,\n });\n\n return parsed;\n } catch (error) {\n this.logger.debug(\"Failed to read todos.json\", {\n taskId,\n error: error instanceof Error ? error.message : String(error),\n });\n return null;\n }\n }\n\n async writeTodos(taskId: string, todos: TodoList): Promise<void> {\n this.logger.debug(\"Writing todos\", {\n taskId,\n total: todos.metadata.total,\n pending: todos.metadata.pending,\n in_progress: todos.metadata.in_progress,\n completed: todos.metadata.completed,\n });\n\n await this.fileManager.writeTaskFile(taskId, {\n name: \"todos.json\",\n content: JSON.stringify(todos, null, 2),\n type: \"artifact\",\n });\n\n this.logger.info(\"Todos saved\", {\n taskId,\n total: todos.metadata.total,\n completed: todos.metadata.completed,\n });\n }\n\n parseTodoWriteInput(toolInput: Record<string, unknown>): TodoList {\n const items: TodoItem[] = [];\n\n if (toolInput.todos && Array.isArray(toolInput.todos)) {\n for (const todo of toolInput.todos) {\n items.push({\n content: todo.content || \"\",\n status: todo.status || \"pending\",\n activeForm: todo.activeForm || todo.content || \"\",\n });\n }\n }\n\n const metadata = this.calculateMetadata(items);\n\n return { items, metadata };\n }\n\n private calculateMetadata(items: TodoItem[]): TodoList[\"metadata\"] {\n const total = items.length;\n const pending = items.filter((t) => t.status === \"pending\").length;\n const in_progress = items.filter((t) => t.status === \"in_progress\").length;\n const completed = items.filter((t) => t.status === \"completed\").length;\n\n return {\n total,\n pending,\n in_progress,\n completed,\n last_updated: new Date().toISOString(),\n };\n }\n\n async getTodoContext(taskId: string): Promise<string> {\n const todos = await this.readTodos(taskId);\n if (!todos || todos.items.length === 0) {\n return \"\";\n }\n\n const lines: string[] = [\"## Previous Todo List\\n\"];\n lines.push(\"You previously created the following todo list:\\n\");\n\n for (const item of todos.items) {\n const statusIcon =\n item.status === \"completed\"\n ? \"✓\"\n : item.status === \"in_progress\"\n ? \"▶\"\n : \"○\";\n lines.push(`${statusIcon} [${item.status}] ${item.content}`);\n }\n\n lines.push(\n `\\nProgress: ${todos.metadata.completed}/${todos.metadata.total} completed\\n`,\n );\n\n return lines.join(\"\\n\");\n }\n\n // check for TodoWrite tool call and persist if found\n async checkAndPersistFromMessage(\n message: Record<string, unknown>,\n taskId: string,\n ): Promise<TodoList | null> {\n if (\n message.type !== \"assistant\" ||\n typeof message.message !== \"object\" ||\n !message.message ||\n !(\"content\" in message.message) ||\n !Array.isArray(message.message.content)\n ) {\n return null;\n }\n\n for (const block of message.message.content) {\n if (block.type === \"tool_use\" && block.name === \"TodoWrite\") {\n try {\n this.logger.info(\"TodoWrite detected, persisting todos\", { taskId });\n\n const todoList = this.parseTodoWriteInput(block.input);\n await this.writeTodos(taskId, todoList);\n\n this.logger.info(\"Persisted todos successfully\", {\n taskId,\n total: todoList.metadata.total,\n completed: todoList.metadata.completed,\n });\n\n return todoList;\n } catch (error) {\n this.logger.error(\"Failed to persist todos\", {\n taskId,\n error: error instanceof Error ? error.message : String(error),\n });\n return null;\n }\n }\n }\n\n return null;\n }\n}\n","// import and export to keep a single type file\n\nimport type { SessionNotification } from \"@agentclientprotocol/sdk\";\nimport type {\n CanUseTool,\n PermissionResult,\n} from \"@anthropic-ai/claude-agent-sdk\";\nexport type { CanUseTool, PermissionResult, SessionNotification };\n\n/**\n * Stored custom notification following ACP extensibility model.\n * Custom notifications use underscore-prefixed methods (e.g., `_posthog/phase_start`).\n * See: https://agentclientprotocol.com/docs/extensibility\n */\nexport interface StoredNotification {\n type: \"notification\";\n /** When this notification was stored */\n timestamp: string;\n /** JSON-RPC 2.0 notification (no id field = notification, not request) */\n notification: {\n jsonrpc: \"2.0\";\n method: string;\n params?: Record<string, unknown>;\n };\n}\n\n/**\n * Type alias for stored log entries.\n */\nexport type StoredEntry = StoredNotification;\n\n// PostHog Task model (matches Array's OpenAPI schema)\nexport interface Task {\n id: string;\n task_number?: number;\n slug?: string;\n title: string;\n description: string;\n origin_product:\n | \"error_tracking\"\n | \"eval_clusters\"\n | \"user_created\"\n | \"support_queue\"\n | \"session_summaries\";\n github_integration?: number | null;\n repository: string; // Format: \"organization/repository\" (e.g., \"posthog/posthog-js\")\n json_schema?: Record<string, unknown> | null; // JSON schema for task output validation\n created_at: string;\n updated_at: string;\n created_by?: {\n id: number;\n uuid: string;\n distinct_id: string;\n first_name: string;\n email: string;\n };\n latest_run?: TaskRun;\n}\n\n// Log entry structure for TaskRun.log\n\nexport type ArtifactType =\n | \"plan\"\n | \"context\"\n | \"reference\"\n | \"output\"\n | \"artifact\";\n\nexport interface TaskRunArtifact {\n name: string;\n type: ArtifactType;\n size?: number;\n content_type?: string;\n storage_path?: string;\n uploaded_at?: string;\n}\n\nexport type TaskRunStatus =\n | \"not_started\"\n | \"queued\"\n | \"in_progress\"\n | \"completed\"\n | \"failed\"\n | \"cancelled\";\n\nexport type TaskRunEnvironment = \"local\" | \"cloud\";\n\n// TaskRun model - represents individual execution runs of tasks\nexport interface TaskRun {\n id: string;\n task: string; // Task ID\n team: number;\n branch: string | null;\n stage: string | null; // Current stage (e.g., 'research', 'plan', 'build')\n environment: TaskRunEnvironment;\n status: TaskRunStatus;\n log_url: string;\n error_message: string | null;\n output: Record<string, unknown> | null; // Structured output (PR URL, commit SHA, etc.)\n state: Record<string, unknown>; // Intermediate run state (defaults to {}, never null)\n artifacts?: TaskRunArtifact[];\n created_at: string;\n updated_at: string;\n completed_at: string | null;\n}\n\nexport interface SupportingFile {\n name: string;\n content: string;\n type: ArtifactType;\n created_at: string;\n}\n\nexport interface TaskArtifactUploadPayload {\n name: string;\n type: ArtifactType;\n content: string;\n content_type?: string;\n}\n\nexport enum PermissionMode {\n PLAN = \"plan\",\n DEFAULT = \"default\",\n ACCEPT_EDITS = \"acceptEdits\",\n BYPASS = \"bypassPermissions\",\n}\n\nexport interface ExecutionOptions {\n repositoryPath?: string;\n permissionMode?: PermissionMode;\n}\n\nexport interface TaskExecutionOptions {\n repositoryPath?: string;\n permissionMode?: PermissionMode;\n isCloudMode?: boolean; // Determines local vs cloud behavior (local pauses after each phase)\n createPR?: boolean; // Whether to create PR after build (defaults to false)\n autoProgress?: boolean;\n queryOverrides?: Record<string, unknown>;\n // Fine-grained permission control (only applied to build phase)\n // See: https://docs.claude.com/en/api/agent-sdk/permissions\n canUseTool?: CanUseTool;\n skipGitBranch?: boolean; // Skip creating a task-specific git branch\n}\n\nexport interface ExecutionResult {\n // biome-ignore lint/suspicious/noExplicitAny: Results array contains varying SDK response types\n results: any[];\n}\n\nexport interface PlanResult {\n plan: string;\n}\n\nexport interface TaskExecutionResult {\n task: Task;\n plan?: string;\n executionResult?: ExecutionResult;\n}\n\n// MCP Server configuration types (re-exported from Claude SDK for convenience)\nexport type McpServerConfig =\n | {\n type?: \"stdio\";\n command: string;\n args?: string[];\n env?: Record<string, string>;\n }\n | {\n type: \"sse\";\n url: string;\n headers?: Record<string, string>;\n }\n | {\n type: \"http\";\n url: string;\n headers?: Record<string, string>;\n }\n | {\n type: \"sdk\";\n name: string;\n // biome-ignore lint/suspicious/noExplicitAny: McpServer instance type from external SDK\n instance?: any;\n };\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport type OnLogCallback = (\n level: LogLevel,\n scope: string,\n message: string,\n data?: unknown,\n) => void;\n\nexport interface AgentConfig {\n workingDirectory?: string;\n\n // PostHog API configuration (optional - enables PostHog integration when provided)\n posthogApiUrl?: string;\n posthogApiKey?: string;\n posthogProjectId?: number;\n\n // PostHog MCP configuration\n posthogMcpUrl?: string;\n\n // MCP Server configuration\n // Additional MCP servers (PostHog MCP is always included by default)\n // You can override the PostHog MCP config by providing mcpServers.posthog\n mcpServers?: Record<string, McpServerConfig>;\n\n // Logging configuration\n debug?: boolean;\n onLog?: OnLogCallback;\n\n // Fine-grained permission control for direct run() calls\n // See: https://docs.claude.com/en/api/agent-sdk/permissions\n canUseTool?: CanUseTool;\n}\n\nexport interface PostHogAPIConfig {\n apiUrl: string;\n apiKey: string;\n projectId: number;\n}\n\n// URL mention types\nexport type ResourceType =\n | \"error\"\n | \"experiment\"\n | \"insight\"\n | \"feature_flag\"\n | \"generic\";\n\nexport interface PostHogResource {\n type: ResourceType;\n id: string;\n url: string;\n title?: string;\n content: string;\n // biome-ignore lint/suspicious/noExplicitAny: Metadata contains varying resource-specific fields\n metadata?: Record<string, any>;\n}\n\nexport interface UrlMention {\n url: string;\n type: ResourceType;\n id?: string;\n label?: string;\n}\n\n// Research evaluation types\nexport interface ResearchQuestion {\n id: string;\n question: string;\n options: string[];\n}\n\nexport interface ResearchAnswer {\n questionId: string;\n selectedOption: string;\n customInput?: string;\n}\n\nexport interface ResearchEvaluation {\n actionabilityScore: number; // 0-1 confidence score\n context: string; // brief summary for planning\n keyFiles: string[]; // files needing modification\n blockers?: string[]; // what's preventing full confidence\n questions?: ResearchQuestion[]; // only if score < 0.7\n answered?: boolean; // whether questions have been answered\n answers?: ResearchAnswer[]; // user's answers to questions\n}\n\n// Worktree types for parallel task development\nexport interface WorktreeInfo {\n worktreePath: string;\n worktreeName: string;\n branchName: string;\n baseBranch: string;\n createdAt: string;\n}\n","import type { WorkflowRuntime, WorkflowStepDefinition } from \"./types.js\";\n\ninterface FinalizeGitOptions {\n commitMessage: string;\n allowEmptyCommit?: boolean;\n}\n\n/**\n * Commits (and optionally pushes) any staged changes according to the step configuration.\n * Returns true if a commit was created.\n */\nexport async function finalizeStepGitActions(\n context: WorkflowRuntime,\n step: WorkflowStepDefinition,\n options: FinalizeGitOptions,\n): Promise<boolean> {\n if (!step.commit) {\n return false;\n }\n\n const { gitManager, logger } = context;\n const hasStagedChanges = await gitManager.hasStagedChanges();\n\n if (!hasStagedChanges && !options.allowEmptyCommit) {\n logger.debug(\"No staged changes to commit for step\", { stepId: step.id });\n return false;\n }\n\n try {\n await gitManager.commitChanges(options.commitMessage);\n logger.info(\"Committed changes for step\", {\n stepId: step.id,\n message: options.commitMessage,\n });\n } catch (error) {\n logger.error(\"Failed to commit changes for step\", {\n stepId: step.id,\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n\n if (step.push) {\n const branchName = await gitManager.getCurrentBranch();\n await gitManager.pushBranch(branchName);\n logger.info(\"Pushed branch after step\", {\n stepId: step.id,\n branch: branchName,\n });\n }\n\n return true;\n}\n","import type { LocalArtifact } from \"../../file-manager.js\";\nimport type { Task, TaskRunArtifact } from \"../../types.js\";\nimport type { WorkflowStepRunner } from \"../types.js\";\nimport { finalizeStepGitActions } from \"../utils.js\";\n\nconst MAX_SNIPPET_LENGTH = 1200;\n\nexport const finalizeStep: WorkflowStepRunner = async ({ step, context }) => {\n const { task, logger, fileManager, gitManager, posthogAPI, runId } = context;\n\n const stepLogger = logger.child(\"FinalizeStep\");\n const artifacts = await fileManager.collectTaskArtifacts(task.id);\n let uploadedArtifacts: TaskRunArtifact[] | undefined;\n\n if (artifacts.length && posthogAPI && runId) {\n try {\n const payload = artifacts.map((artifact) => ({\n name: artifact.name,\n type: artifact.type,\n content: artifact.content,\n content_type: artifact.contentType,\n }));\n uploadedArtifacts = await posthogAPI.uploadTaskArtifacts(\n task.id,\n runId,\n payload,\n );\n stepLogger.info(\"Uploaded task artifacts to PostHog\", {\n taskId: task.id,\n uploadedCount: uploadedArtifacts.length,\n });\n } catch (error) {\n stepLogger.warn(\"Failed to upload task artifacts\", {\n taskId: task.id,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n } else {\n stepLogger.debug(\"Skipping artifact upload\", {\n hasArtifacts: artifacts.length > 0,\n hasPostHogApi: Boolean(posthogAPI),\n runId,\n });\n }\n\n const prBody = buildPullRequestBody(task, artifacts, uploadedArtifacts);\n await fileManager.cleanupTaskDirectory(task.id);\n await gitManager.addAllPostHogFiles();\n\n // Commit the deletion of artifacts\n await finalizeStepGitActions(context, step, {\n commitMessage: `Cleanup task artifacts for ${task.title}`,\n allowEmptyCommit: true,\n });\n\n context.stepResults[step.id] = {\n prBody,\n uploadedArtifacts,\n artifactCount: artifacts.length,\n };\n\n return { status: \"completed\" };\n};\n\nfunction buildPullRequestBody(\n task: Task,\n artifacts: LocalArtifact[],\n uploaded?: TaskRunArtifact[],\n): string {\n const lines: string[] = [];\n const taskSlug = (task as unknown as Record<string, unknown>).slug || task.id;\n\n lines.push(\"## Task context\");\n lines.push(`- **Task**: ${taskSlug}`);\n lines.push(`- **Title**: ${task.title}`);\n lines.push(`- **Origin**: ${task.origin_product}`);\n\n if (task.description) {\n lines.push(\"\");\n lines.push(`> ${task.description.trim().split(\"\\n\").join(\"\\n> \")}`);\n }\n\n const usedFiles = new Set<string>();\n\n const contextArtifact = artifacts.find(\n (artifact) => artifact.name === \"context.md\",\n );\n if (contextArtifact) {\n lines.push(\"\");\n lines.push(\"### Task prompt\");\n lines.push(contextArtifact.content);\n usedFiles.add(contextArtifact.name);\n }\n\n const researchArtifact = artifacts.find(\n (artifact) => artifact.name === \"research.json\",\n );\n if (researchArtifact) {\n usedFiles.add(researchArtifact.name);\n const researchSection = formatResearchSection(researchArtifact.content);\n if (researchSection) {\n lines.push(\"\");\n lines.push(researchSection);\n }\n }\n\n const planArtifact = artifacts.find(\n (artifact) => artifact.name === \"plan.md\",\n );\n if (planArtifact) {\n lines.push(\"\");\n lines.push(\"### Implementation plan\");\n lines.push(planArtifact.content);\n usedFiles.add(planArtifact.name);\n }\n\n const todoArtifact = artifacts.find(\n (artifact) => artifact.name === \"todos.json\",\n );\n if (todoArtifact) {\n const summary = summarizeTodos(todoArtifact.content);\n if (summary) {\n lines.push(\"\");\n lines.push(\"### Todo list\");\n lines.push(summary);\n }\n usedFiles.add(todoArtifact.name);\n }\n\n const remainingArtifacts = artifacts.filter(\n (artifact) => !usedFiles.has(artifact.name),\n );\n if (remainingArtifacts.length) {\n lines.push(\"\");\n lines.push(\"### Additional artifacts\");\n for (const artifact of remainingArtifacts) {\n lines.push(`#### ${artifact.name}`);\n lines.push(renderCodeFence(artifact.content));\n }\n }\n\n const artifactList =\n uploaded ??\n artifacts.map((artifact) => ({\n name: artifact.name,\n type: artifact.type,\n }));\n\n if (artifactList.length) {\n lines.push(\"\");\n lines.push(\"### Uploaded artifacts\");\n for (const artifact of artifactList) {\n const rawStoragePath =\n \"storage_path\" in artifact\n ? (artifact as Record<string, unknown>).storage_path\n : undefined;\n const storagePath =\n typeof rawStoragePath === \"string\" ? rawStoragePath : undefined;\n const storage =\n storagePath && storagePath.trim().length > 0\n ? ` – \\`${storagePath.trim()}\\``\n : \"\";\n lines.push(`- ${artifact.name} (${artifact.type})${storage}`);\n }\n }\n\n return lines.join(\"\\n\\n\");\n}\n\nfunction renderCodeFence(content: string): string {\n const snippet = truncate(content, MAX_SNIPPET_LENGTH);\n return [\"```\", snippet, \"```\"].join(\"\\n\");\n}\n\nfunction truncate(value: string, maxLength: number): string {\n if (value.length <= maxLength) {\n return value;\n }\n return `${value.slice(0, maxLength)}\\n…`;\n}\n\nfunction formatResearchSection(content: string): string | null {\n try {\n const parsed = JSON.parse(content);\n const sections: string[] = [];\n\n if (parsed.context) {\n sections.push(\"### Research summary\");\n sections.push(parsed.context);\n }\n\n if (parsed.questions?.length) {\n sections.push(\"\");\n sections.push(\"### Questions needing answers\");\n for (const question of parsed.questions) {\n sections.push(`- ${question.question ?? question}`);\n }\n }\n\n if (parsed.answers?.length) {\n sections.push(\"\");\n sections.push(\"### Answers provided\");\n for (const answer of parsed.answers) {\n const questionId = answer.questionId\n ? ` (Q: ${answer.questionId})`\n : \"\";\n sections.push(\n `- ${answer.selectedOption || answer.customInput || \"answer\"}${questionId}`,\n );\n }\n }\n\n return sections.length ? sections.join(\"\\n\") : null;\n } catch {\n return null;\n }\n}\n\nfunction summarizeTodos(content: string): string | null {\n try {\n const data = JSON.parse(content);\n const total = data?.metadata?.total ?? data?.items?.length;\n const completed =\n data?.metadata?.completed ??\n data?.items?.filter(\n (item: { status?: string }) => item.status === \"completed\",\n ).length;\n\n const lines = [`Progress: ${completed}/${total} completed`];\n\n if (data?.items?.length) {\n for (const item of data.items) {\n lines.push(`- [${item.status}] ${item.content}`);\n }\n }\n\n return lines.join(\"\\n\");\n } catch {\n return null;\n }\n}\n","import { query } from \"@anthropic-ai/claude-agent-sdk\";\nimport { POSTHOG_NOTIFICATIONS } from \"../../acp-extensions.js\";\nimport { PLANNING_SYSTEM_PROMPT } from \"../../agents/planning.js\";\nimport { TodoManager } from \"../../todo-manager.js\";\nimport type { WorkflowStepRunner } from \"../types.js\";\nimport { finalizeStepGitActions } from \"../utils.js\";\n\nexport const planStep: WorkflowStepRunner = async ({ step, context }) => {\n const {\n task,\n cwd,\n isCloudMode,\n options,\n logger,\n fileManager,\n gitManager,\n promptBuilder,\n sessionId,\n mcpServers,\n sendNotification,\n } = context;\n\n const stepLogger = logger.child(\"PlanStep\");\n\n const existingPlan = await fileManager.readPlan(task.id);\n if (existingPlan) {\n stepLogger.info(\"Plan already exists, skipping step\", { taskId: task.id });\n return { status: \"skipped\" };\n }\n\n const researchData = await fileManager.readResearch(task.id);\n if (researchData?.questions && !researchData.answered) {\n stepLogger.info(\"Waiting for answered research questions\", {\n taskId: task.id,\n });\n await sendNotification(POSTHOG_NOTIFICATIONS.PHASE_COMPLETE, {\n sessionId,\n phase: \"research_questions\",\n });\n return { status: \"skipped\", halt: true };\n }\n\n stepLogger.info(\"Starting planning phase\", { taskId: task.id });\n await sendNotification(POSTHOG_NOTIFICATIONS.PHASE_START, {\n sessionId,\n phase: \"planning\",\n });\n let researchContext = \"\";\n if (researchData) {\n researchContext += `## Research Context\\n\\n${researchData.context}\\n\\n`;\n if (researchData.keyFiles.length > 0) {\n researchContext += `**Key Files:**\\n${researchData.keyFiles.map((f) => `- ${f}`).join(\"\\n\")}\\n\\n`;\n }\n if (researchData.blockers && researchData.blockers.length > 0) {\n researchContext += `**Considerations:**\\n${researchData.blockers.map((b) => `- ${b}`).join(\"\\n\")}\\n\\n`;\n }\n\n // Add answered questions if they exist\n if (\n researchData.questions &&\n researchData.answers &&\n researchData.answered\n ) {\n researchContext += `## Implementation Decisions\\n\\n`;\n for (const question of researchData.questions) {\n const answer = researchData.answers.find(\n (a) => a.questionId === question.id,\n );\n\n researchContext += `### ${question.question}\\n\\n`;\n if (answer) {\n researchContext += `**Selected:** ${answer.selectedOption}\\n`;\n if (answer.customInput) {\n researchContext += `**Details:** ${answer.customInput}\\n`;\n }\n } else {\n researchContext += `**Selected:** Not answered\\n`;\n }\n researchContext += `\\n`;\n }\n }\n }\n\n const planningPrompt = await promptBuilder.buildPlanningPrompt(task, cwd);\n const fullPrompt = `${PLANNING_SYSTEM_PROMPT}\\n\\n${planningPrompt}\\n\\n${researchContext}`;\n\n const baseOptions: Record<string, unknown> = {\n model: step.model,\n cwd,\n permissionMode: \"plan\",\n settingSources: [\"local\"],\n mcpServers,\n // Allow research tools: read-only operations, web search, MCP resources, and ExitPlanMode\n allowedTools: [\n \"Read\",\n \"Glob\",\n \"Grep\",\n \"WebFetch\",\n \"WebSearch\",\n \"ListMcpResources\",\n \"ReadMcpResource\",\n \"ExitPlanMode\",\n \"TodoWrite\",\n \"BashOutput\",\n ],\n };\n\n const response = query({\n prompt: fullPrompt,\n options: { ...baseOptions, ...(options.queryOverrides || {}) },\n });\n\n const todoManager = new TodoManager(fileManager, stepLogger);\n\n let planContent = \"\";\n try {\n for await (const message of response) {\n const todoList = await todoManager.checkAndPersistFromMessage(\n message,\n task.id,\n );\n if (todoList) {\n await sendNotification(POSTHOG_NOTIFICATIONS.ARTIFACT, {\n sessionId,\n kind: \"todos\",\n content: todoList,\n });\n }\n\n // Extract text content for plan\n if (message.type === \"assistant\" && message.message?.content) {\n for (const block of message.message.content) {\n if (block.type === \"text\" && block.text) {\n planContent += `${block.text}\\n`;\n }\n }\n }\n }\n } catch (error) {\n stepLogger.error(\"Error during plan step query\", error);\n throw error;\n }\n\n if (planContent.trim()) {\n await fileManager.writePlan(task.id, planContent.trim());\n stepLogger.info(\"Plan completed\", { taskId: task.id });\n }\n\n await gitManager.addAllPostHogFiles();\n await finalizeStepGitActions(context, step, {\n commitMessage: `Planning phase for ${task.title}`,\n });\n\n if (!isCloudMode) {\n await sendNotification(POSTHOG_NOTIFICATIONS.PHASE_COMPLETE, {\n sessionId,\n phase: \"planning\",\n });\n return { status: \"completed\", halt: true };\n }\n\n await sendNotification(POSTHOG_NOTIFICATIONS.PHASE_COMPLETE, {\n sessionId,\n phase: \"planning\",\n });\n return { status: \"completed\" };\n};\n","export const PLANNING_SYSTEM_PROMPT = `<role>\nPostHog AI Planning Agent — analyze codebases and create actionable implementation plans.\n</role>\n\n<constraints>\n- Read-only: analyze files, search code, explore structure\n- No modifications or edits\n- Output ONLY the plan markdown — no preamble, no acknowledgment, no meta-commentary\n</constraints>\n\n<objective>\nCreate a detailed, actionable implementation plan that an execution agent can follow to complete the task successfully.\n</objective>\n\n<process>\n1. Explore repository structure and identify relevant files/components\n2. Understand existing patterns, conventions, and dependencies\n3. Break down task requirements and identify technical constraints\n4. Define step-by-step implementation approach\n5. Specify files to modify/create with exact paths\n6. Identify testing requirements and potential risks\n</process>\n\n<output_format>\nOutput the plan DIRECTLY as markdown with NO preamble text. Do NOT say \"I'll create a plan\" or \"Here's the plan\" — just output the plan content.\n\nRequired sections (follow the template provided in the task prompt):\n- Summary: Brief overview of approach\n- Files to Create/Modify: Specific paths and purposes\n- Implementation Steps: Ordered list of actions\n- Testing Strategy: How to verify it works\n- Considerations: Dependencies, risks, edge cases\n</output_format>\n\n<examples>\n<bad_example>\n\"Sure! I'll create a detailed implementation plan for you to add authentication. Here's what we'll do...\"\nReason: No preamble — output the plan directly\n</bad_example>\n\n<good_example>\n\"# Implementation Plan\n\n## Summary\nAdd JWT-based authentication to API endpoints using existing middleware pattern...\n\n## Files to Modify\n- src/middleware/auth.ts: Add JWT verification\n...\"\nReason: Direct plan output with no meta-commentary\n</good_example>\n</examples>\n\n<context_integration>\nIf research findings, context files, or reference materials are provided:\n- Incorporate research findings into your analysis\n- Follow patterns and approaches identified in research\n- Build upon or refine any existing planning work\n- Reference specific files and components mentioned in context\n</context_integration>`;\n","import { query } from \"@anthropic-ai/claude-agent-sdk\";\nimport { POSTHOG_NOTIFICATIONS } from \"../../acp-extensions.js\";\nimport { RESEARCH_SYSTEM_PROMPT } from \"../../agents/research.js\";\nimport type { ResearchEvaluation } from \"../../types.js\";\nimport type { WorkflowStepRunner } from \"../types.js\";\nimport { finalizeStepGitActions } from \"../utils.js\";\n\nexport const researchStep: WorkflowStepRunner = async ({ step, context }) => {\n const {\n task,\n cwd,\n isCloudMode,\n options,\n logger,\n fileManager,\n gitManager,\n promptBuilder,\n sessionId,\n mcpServers,\n sendNotification,\n } = context;\n\n const stepLogger = logger.child(\"ResearchStep\");\n\n const existingResearch = await fileManager.readResearch(task.id);\n if (existingResearch) {\n stepLogger.info(\"Research already exists\", {\n taskId: task.id,\n hasQuestions: !!existingResearch.questions,\n answered: existingResearch.answered,\n });\n\n // If there are unanswered questions, re-emit them so UI can prompt user\n if (existingResearch.questions && !existingResearch.answered) {\n stepLogger.info(\"Re-emitting unanswered research questions\", {\n taskId: task.id,\n questionCount: existingResearch.questions.length,\n });\n\n await sendNotification(POSTHOG_NOTIFICATIONS.ARTIFACT, {\n sessionId,\n kind: \"research_questions\",\n content: existingResearch.questions,\n });\n\n // In local mode, halt to allow user to answer\n if (!isCloudMode) {\n await sendNotification(POSTHOG_NOTIFICATIONS.PHASE_COMPLETE, {\n sessionId,\n phase: \"research\",\n });\n return { status: \"skipped\", halt: true };\n }\n }\n\n return { status: \"skipped\" };\n }\n\n stepLogger.info(\"Starting research phase\", { taskId: task.id });\n await sendNotification(POSTHOG_NOTIFICATIONS.PHASE_START, {\n sessionId,\n phase: \"research\",\n });\n\n const researchPrompt = await promptBuilder.buildResearchPrompt(task, cwd);\n const fullPrompt = `${RESEARCH_SYSTEM_PROMPT}\\n\\n${researchPrompt}`;\n\n const baseOptions: Record<string, unknown> = {\n model: step.model,\n cwd,\n permissionMode: \"plan\",\n settingSources: [\"local\"],\n mcpServers,\n // Allow research tools: read-only operations, web search, and MCP resources\n allowedTools: [\n \"Read\",\n \"Glob\",\n \"Grep\",\n \"WebFetch\",\n \"WebSearch\",\n \"ListMcpResources\",\n \"ReadMcpResource\",\n \"TodoWrite\",\n \"BashOutput\",\n ],\n };\n\n const response = query({\n prompt: fullPrompt,\n options: { ...baseOptions, ...(options.queryOverrides || {}) },\n });\n\n let jsonContent = \"\";\n try {\n for await (const message of response) {\n // Extract text content from assistant messages\n if (message.type === \"assistant\" && message.message?.content) {\n for (const c of message.message.content) {\n if (c.type === \"text\" && c.text) {\n jsonContent += c.text;\n }\n }\n }\n }\n } catch (error) {\n stepLogger.error(\"Error during research step query\", error);\n throw error;\n }\n\n if (!jsonContent.trim()) {\n stepLogger.error(\"No JSON output from research agent\", { taskId: task.id });\n await sendNotification(POSTHOG_NOTIFICATIONS.ERROR, {\n sessionId,\n message: \"Research agent returned no output\",\n });\n return { status: \"completed\", halt: true };\n }\n\n // Parse JSON response\n let evaluation: ResearchEvaluation;\n try {\n // Extract JSON from potential markdown code blocks or other wrapping\n const jsonMatch = jsonContent.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) {\n throw new Error(\"No JSON object found in response\");\n }\n evaluation = JSON.parse(jsonMatch[0]);\n stepLogger.info(\"Parsed research evaluation\", {\n taskId: task.id,\n score: evaluation.actionabilityScore,\n hasQuestions: !!evaluation.questions,\n });\n } catch (error) {\n stepLogger.error(\"Failed to parse research JSON\", {\n taskId: task.id,\n error: error instanceof Error ? error.message : String(error),\n content: jsonContent.substring(0, 500),\n });\n await sendNotification(POSTHOG_NOTIFICATIONS.ERROR, {\n sessionId,\n message: `Failed to parse research JSON: ${\n error instanceof Error ? error.message : String(error)\n }`,\n });\n return { status: \"completed\", halt: true };\n }\n\n // Add answered/answers fields to evaluation\n if (evaluation.questions && evaluation.questions.length > 0) {\n evaluation.answered = false;\n evaluation.answers = undefined;\n }\n\n // Always write research.json\n await fileManager.writeResearch(task.id, evaluation);\n stepLogger.info(\"Research evaluation written\", {\n taskId: task.id,\n score: evaluation.actionabilityScore,\n hasQuestions: !!evaluation.questions,\n });\n\n await sendNotification(POSTHOG_NOTIFICATIONS.ARTIFACT, {\n sessionId,\n kind: \"research_evaluation\",\n content: evaluation,\n });\n\n await gitManager.addAllPostHogFiles();\n await finalizeStepGitActions(context, step, {\n commitMessage: `Research phase for ${task.title}`,\n });\n\n // Log whether questions need answering\n if (\n evaluation.actionabilityScore < 0.7 &&\n evaluation.questions &&\n evaluation.questions.length > 0\n ) {\n stepLogger.info(\"Actionability score below threshold, questions needed\", {\n taskId: task.id,\n score: evaluation.actionabilityScore,\n questionCount: evaluation.questions.length,\n });\n\n await sendNotification(POSTHOG_NOTIFICATIONS.ARTIFACT, {\n sessionId,\n kind: \"research_questions\",\n content: evaluation.questions,\n });\n } else {\n stepLogger.info(\"Actionability score acceptable, proceeding to planning\", {\n taskId: task.id,\n score: evaluation.actionabilityScore,\n });\n }\n\n // In local mode, always halt after research for user review\n if (!isCloudMode) {\n await sendNotification(POSTHOG_NOTIFICATIONS.PHASE_COMPLETE, {\n sessionId,\n phase: \"research\",\n });\n return { status: \"completed\", halt: true };\n }\n\n // In cloud mode, check if questions need answering\n const researchData = await fileManager.readResearch(task.id);\n if (researchData?.questions && !researchData.answered) {\n // Questions need answering - halt for user input in cloud mode too\n await sendNotification(POSTHOG_NOTIFICATIONS.PHASE_COMPLETE, {\n sessionId,\n phase: \"research\",\n });\n return { status: \"completed\", halt: true };\n }\n\n // No questions or questions already answered - proceed to planning\n await sendNotification(POSTHOG_NOTIFICATIONS.PHASE_COMPLETE, {\n sessionId,\n phase: \"research\",\n });\n return { status: \"completed\" };\n};\n","export const RESEARCH_SYSTEM_PROMPT = `<role>\nPostHog AI Research Agent — analyze codebases to evaluate task actionability and identify missing information.\n</role>\n\n<constraints>\n- Read-only: analyze files, search code, explore structure\n- No modifications or code changes\n- Output structured JSON only\n</constraints>\n\n<objective>\nYour PRIMARY goal is to evaluate whether a task is actionable and assign an actionability score.\n\nCalculate an actionabilityScore (0-1) based on:\n- **Task clarity** (0.4 weight): Is the task description specific and unambiguous?\n- **Codebase context** (0.3 weight): Can you locate the relevant code and patterns?\n- **Architectural decisions** (0.2 weight): Are the implementation approaches clear?\n- **Dependencies** (0.1 weight): Are required dependencies and constraints understood?\n\nIf actionabilityScore < 0.7, generate specific clarifying questions to increase confidence.\n\nQuestions must present complete implementation choices, NOT request information from the user:\noptions: array of strings\n- GOOD: options: [\"Use Redux Toolkit (matches pattern in src/store/)\", \"Zustand (lighter weight)\"]\n- BAD: \"Tell me which state management library to use\"\n- GOOD: options: [\"Place in Button.tsx (existing component)\", \"create NewButton.tsx (separate concerns)?\"]\n- BAD: \"Where should I put this code?\"\n\nDO NOT ask questions like \"how should I fix this\" or \"tell me the pattern\" — present concrete options that can be directly chosen and acted upon.\n</objective>\n\n<process>\n1. Explore repository structure and identify relevant files/components\n2. Understand existing patterns, conventions, and dependencies\n3. Calculate actionabilityScore based on clarity, context, architecture, and dependencies\n4. Identify key files that will need modification\n5. If score < 0.7: generate 2-4 specific questions to resolve blockers\n6. Output JSON matching ResearchEvaluation schema\n</process>\n\n<output_format>\nOutput ONLY valid JSON with no markdown wrappers, no preamble, no explanation:\n\n{\n \"actionabilityScore\": 0.85,\n \"context\": \"Brief 2-3 sentence summary of the task and implementation approach\",\n \"keyFiles\": [\"path/to/file1.ts\", \"path/to/file2.ts\"],\n \"blockers\": [\"Optional: what's preventing full confidence\"],\n \"questions\": [\n {\n \"id\": \"q1\",\n \"question\": \"Specific architectural decision needed?\",\n \"options\": [\n \"First approach with concrete details\",\n \"Alternative approach with concrete details\",\n \"Third option if needed\"\n ]\n }\n ]\n}\n\nRules:\n- actionabilityScore: number between 0 and 1\n- context: concise summary for planning phase\n- keyFiles: array of file paths that need modification\n- blockers: optional array explaining confidence gaps\n- questions: ONLY include if actionabilityScore < 0.7\n- Each question must have 2-3 options (maximum 3)\n- Max 3 questions total\n- Options must be complete, actionable choices that require NO additional user input\n- NEVER use options like \"Tell me the pattern\", \"Show me examples\", \"Specify the approach\"\n- Each option must be a full implementation decision that can be directly acted upon\n</output_format>\n\n<scoring_examples>\n<example score=\"0.9\">\nTask: \"Fix typo in login button text\"\nReasoning: Completely clear task, found exact component, no architectural decisions\n</example>\n\n<example score=\"0.75\">\nTask: \"Add caching to API endpoints\"\nReasoning: Clear goal, found endpoints, but multiple caching strategies possible\n</example>\n\n<example score=\"0.55\">\nTask: \"Improve performance\"\nReasoning: Vague task, unclear scope, needs questions about which areas to optimize\nQuestions needed: Which features are slow? What metrics define success?\n</example>\n\n<example score=\"0.3\">\nTask: \"Add the new feature\"\nReasoning: Extremely vague, no context, cannot locate relevant code\nQuestions needed: What feature? Which product area? What should it do?\n</example>\n</scoring_examples>\n\n<question_examples>\n<good_example>\n{\n \"id\": \"q1\",\n \"question\": \"Which caching layer should we use for API responses?\",\n \"options\": [\n \"Redis with 1-hour TTL (existing infrastructure, requires Redis client setup)\",\n \"In-memory LRU cache with 100MB limit (simpler, single-server only)\",\n \"HTTP Cache-Control headers only (minimal backend changes, relies on browser/CDN)\"\n ]\n}\nReason: Each option is a complete, actionable decision with concrete details\n</good_example>\n\n<good_example>\n{\n \"id\": \"q2\",\n \"question\": \"Where should the new analytics tracking code be placed?\",\n \"options\": [\n \"In the existing UserAnalytics.ts module alongside page view tracking\",\n \"Create a new EventTracking.ts module in src/analytics/ for all event tracking\",\n \"Add directly to each component that needs tracking (no centralized module)\"\n ]\n}\nReason: Specific file paths and architectural patterns, no user input needed\n</good_example>\n\n<bad_example>\n{\n \"id\": \"q1\", \n \"question\": \"How should I implement this?\",\n \"options\": [\"One way\", \"Another way\"]\n}\nReason: Too vague, doesn't explain the tradeoffs or provide concrete details\n</bad_example>\n\n<bad_example>\n{\n \"id\": \"q2\",\n \"question\": \"Which pattern should we follow for state management?\",\n \"options\": [\n \"Tell me which pattern the codebase currently uses\",\n \"Show me examples of state management\",\n \"Whatever you think is best\"\n ]\n}\nReason: Options request user input instead of being actionable choices. Should be concrete patterns like \"Zustand stores (matching existing patterns in src/stores/)\" or \"React Context (simpler, no new dependencies)\"\n</bad_example>\n\n<bad_example>\n{\n \"id\": \"q3\",\n \"question\": \"What color scheme should the button use?\",\n \"options\": [\n \"Use the existing theme colors\",\n \"Let me specify custom colors\",\n \"Match the design system\"\n ]\n}\nReason: \"Let me specify\" requires user input. Should be \"Primary blue (#0066FF, existing theme)\" or \"Secondary gray (#6B7280, existing theme)\"\n</bad_example>\n</question_examples>`;\n","import { buildStep } from \"./steps/build.js\";\nimport { finalizeStep } from \"./steps/finalize.js\";\nimport { planStep } from \"./steps/plan.js\";\nimport { researchStep } from \"./steps/research.js\";\nimport type { WorkflowDefinition } from \"./types.js\";\n\nconst MODELS = {\n SONNET: \"claude-sonnet-4-5\",\n HAIKU: \"claude-haiku-4-5\",\n};\n\nexport const TASK_WORKFLOW: WorkflowDefinition = [\n {\n id: \"research\",\n name: \"Research\",\n agent: \"research\",\n model: MODELS.HAIKU,\n permissionMode: \"plan\",\n commit: true,\n push: true,\n run: researchStep,\n },\n {\n id: \"plan\",\n name: \"Plan\",\n agent: \"planning\",\n model: MODELS.SONNET,\n permissionMode: \"plan\",\n commit: true,\n push: true,\n run: planStep,\n },\n {\n id: \"build\",\n name: \"Build\",\n agent: \"execution\",\n model: MODELS.SONNET,\n permissionMode: \"acceptEdits\",\n commit: true,\n push: true,\n run: buildStep,\n },\n {\n id: \"finalize\",\n name: \"Finalize\",\n agent: \"system\", // not used\n model: MODELS.HAIKU, // not used\n permissionMode: \"plan\", // not used\n commit: true,\n push: true,\n run: finalizeStep,\n },\n];\n","import { z } from \"zod\";\n\n// Base event schema with timestamp\nconst BaseEventSchema = z.object({\n ts: z.number(),\n});\n\n// Streaming content events\nexport const TokenEventSchema = BaseEventSchema.extend({\n type: z.literal(\"token\"),\n content: z.string(),\n contentType: z.enum([\"text\", \"thinking\", \"tool_input\"]).optional(),\n});\n\nexport const ContentBlockStartEventSchema = BaseEventSchema.extend({\n type: z.literal(\"content_block_start\"),\n index: z.number(),\n contentType: z.enum([\"text\", \"tool_use\", \"thinking\"]),\n toolName: z.string().optional(),\n toolId: z.string().optional(),\n});\n\nexport const ContentBlockStopEventSchema = BaseEventSchema.extend({\n type: z.literal(\"content_block_stop\"),\n index: z.number(),\n});\n\n// Tool events\nexport const ToolCallEventSchema = BaseEventSchema.extend({\n type: z.literal(\"tool_call\"),\n toolName: z.string(),\n callId: z.string(),\n args: z.record(z.string(), z.unknown()),\n parentToolUseId: z.string().nullable().optional(),\n tool: z.unknown().optional(),\n category: z.unknown().optional(),\n});\n\nexport const ToolResultEventSchema = BaseEventSchema.extend({\n type: z.literal(\"tool_result\"),\n toolName: z.string(),\n callId: z.string(),\n result: z.unknown(),\n isError: z.boolean().optional(),\n parentToolUseId: z.string().nullable().optional(),\n tool: z.unknown().optional(),\n category: z.unknown().optional(),\n});\n\n// Message lifecycle events\nexport const MessageStartEventSchema = BaseEventSchema.extend({\n type: z.literal(\"message_start\"),\n messageId: z.string().optional(),\n model: z.string().optional(),\n});\n\nexport const MessageDeltaEventSchema = BaseEventSchema.extend({\n type: z.literal(\"message_delta\"),\n stopReason: z.string().optional(),\n stopSequence: z.string().optional(),\n usage: z\n .object({\n outputTokens: z.number(),\n })\n .optional(),\n});\n\nexport const MessageStopEventSchema = BaseEventSchema.extend({\n type: z.literal(\"message_stop\"),\n});\n\n// User message events\nexport const UserMessageEventSchema = BaseEventSchema.extend({\n type: z.literal(\"user_message\"),\n content: z.string(),\n isSynthetic: z.boolean().optional(),\n});\n\n// System events\nexport const StatusEventSchema = BaseEventSchema.extend({\n type: z.literal(\"status\"),\n phase: z.string(),\n kind: z.string().optional(),\n branch: z.string().optional(),\n prUrl: z.string().optional(),\n taskId: z.string().optional(),\n messageId: z.string().optional(),\n model: z.string().optional(),\n}).passthrough(); // Allow additional fields\n\nexport const InitEventSchema = BaseEventSchema.extend({\n type: z.literal(\"init\"),\n model: z.string(),\n tools: z.array(z.string()),\n permissionMode: z.string(),\n cwd: z.string(),\n apiKeySource: z.string(),\n agents: z.array(z.string()).optional(),\n slashCommands: z.array(z.string()).optional(),\n outputStyle: z.string().optional(),\n mcpServers: z\n .array(z.object({ name: z.string(), status: z.string() }))\n .optional(),\n});\n\n// Console event for log-style output\nexport const ConsoleEventSchema = BaseEventSchema.extend({\n type: z.literal(\"console\"),\n level: z.enum([\"debug\", \"info\", \"warn\", \"error\"]),\n message: z.string(),\n});\n\nexport const CompactBoundaryEventSchema = BaseEventSchema.extend({\n type: z.literal(\"compact_boundary\"),\n trigger: z.enum([\"manual\", \"auto\"]),\n preTokens: z.number(),\n});\n\n// Result events\nexport const DoneEventSchema = BaseEventSchema.extend({\n type: z.literal(\"done\"),\n result: z.string().optional(),\n durationMs: z.number().optional(),\n durationApiMs: z.number().optional(),\n numTurns: z.number().optional(),\n totalCostUsd: z.number().optional(),\n usage: z.unknown().optional(),\n modelUsage: z\n .record(\n z.string(),\n z.object({\n inputTokens: z.number(),\n outputTokens: z.number(),\n cacheReadInputTokens: z.number(),\n cacheCreationInputTokens: z.number(),\n webSearchRequests: z.number(),\n costUSD: z.number(),\n contextWindow: z.number(),\n }),\n )\n .optional(),\n permissionDenials: z\n .array(\n z.object({\n tool_name: z.string(),\n tool_use_id: z.string(),\n tool_input: z.record(z.string(), z.unknown()),\n }),\n )\n .optional(),\n});\n\nexport const ErrorEventSchema = BaseEventSchema.extend({\n type: z.literal(\"error\"),\n message: z.string(),\n error: z.unknown().optional(),\n errorType: z.string().optional(),\n context: z.record(z.string(), z.unknown()).optional(),\n sdkError: z.unknown().optional(),\n});\n\n// Metric and artifact events\nexport const MetricEventSchema = BaseEventSchema.extend({\n type: z.literal(\"metric\"),\n key: z.string(),\n value: z.number(),\n unit: z.string().optional(),\n});\n\nexport const ArtifactEventSchema = BaseEventSchema.extend({\n type: z.literal(\"artifact\"),\n kind: z.string(),\n content: z.unknown(),\n});\n\nexport const RawSDKEventSchema = BaseEventSchema.extend({\n type: z.literal(\"raw_sdk_event\"),\n sdkMessage: z.unknown(),\n});\n\nexport const AgentEventSchema = z.discriminatedUnion(\"type\", [\n TokenEventSchema,\n ContentBlockStartEventSchema,\n ContentBlockStopEventSchema,\n ToolCallEventSchema,\n ToolResultEventSchema,\n MessageStartEventSchema,\n MessageDeltaEventSchema,\n MessageStopEventSchema,\n UserMessageEventSchema,\n StatusEventSchema,\n InitEventSchema,\n ConsoleEventSchema,\n CompactBoundaryEventSchema,\n DoneEventSchema,\n ErrorEventSchema,\n MetricEventSchema,\n ArtifactEventSchema,\n RawSDKEventSchema,\n]);\n\nexport type TokenEvent = z.infer<typeof TokenEventSchema>;\nexport type ContentBlockStartEvent = z.infer<\n typeof ContentBlockStartEventSchema\n>;\nexport type ContentBlockStopEvent = z.infer<typeof ContentBlockStopEventSchema>;\nexport type ToolCallEvent = z.infer<typeof ToolCallEventSchema>;\nexport type ToolResultEvent = z.infer<typeof ToolResultEventSchema>;\nexport type MessageStartEvent = z.infer<typeof MessageStartEventSchema>;\nexport type MessageDeltaEvent = z.infer<typeof MessageDeltaEventSchema>;\nexport type MessageStopEvent = z.infer<typeof MessageStopEventSchema>;\nexport type UserMessageEvent = z.infer<typeof UserMessageEventSchema>;\nexport type StatusEvent = z.infer<typeof StatusEventSchema>;\nexport type InitEvent = z.infer<typeof InitEventSchema>;\nexport type ConsoleEvent = z.infer<typeof ConsoleEventSchema>;\nexport type CompactBoundaryEvent = z.infer<typeof CompactBoundaryEventSchema>;\nexport type DoneEvent = z.infer<typeof DoneEventSchema>;\nexport type ErrorEvent = z.infer<typeof ErrorEventSchema>;\nexport type MetricEvent = z.infer<typeof MetricEventSchema>;\nexport type ArtifactEvent = z.infer<typeof ArtifactEventSchema>;\nexport type RawSDKEvent = z.infer<typeof RawSDKEventSchema>;\nexport type AgentEvent = z.infer<typeof AgentEventSchema>;\n\n/**\n * Parse and validate an AgentEvent from unknown input.\n * Returns the parsed event if valid, or null if invalid.\n */\nexport function parseAgentEvent(input: unknown): AgentEvent | null {\n const result = AgentEventSchema.safeParse(input);\n return result.success ? result.data : null;\n}\n\n/**\n * Parse and validate multiple AgentEvents from an array of unknown inputs.\n * Invalid entries are discarded.\n */\nexport function parseAgentEvents(inputs: unknown[]): AgentEvent[] {\n return inputs\n .map((input) => parseAgentEvent(input))\n .filter((event): event is AgentEvent => event !== null);\n}\n","import type { Tool } from \"./types.js\";\n\n/**\n * Registry of all known tools with their metadata.\n * Maps tool names to their definitions.\n */\nconst TOOL_DEFINITIONS: Record<string, Tool> = {\n // Filesystem tools\n Read: {\n name: \"Read\",\n category: \"filesystem\",\n description: \"Read file contents from the filesystem\",\n },\n Write: {\n name: \"Write\",\n category: \"filesystem\",\n description: \"Write content to a file\",\n },\n Edit: {\n name: \"Edit\",\n category: \"filesystem\",\n description: \"Edit file with find and replace operations\",\n },\n Glob: {\n name: \"Glob\",\n category: \"filesystem\",\n description: \"Find files matching a pattern\",\n },\n NotebookEdit: {\n name: \"NotebookEdit\",\n category: \"filesystem\",\n description: \"Edit Jupyter notebook cells\",\n },\n\n // Shell tools\n Bash: {\n name: \"Bash\",\n category: \"shell\",\n description: \"Execute bash commands\",\n },\n BashOutput: {\n name: \"BashOutput\",\n category: \"shell\",\n description: \"Read output from a background bash process\",\n },\n KillShell: {\n name: \"KillShell\",\n category: \"shell\",\n description: \"Terminate a background bash process\",\n },\n\n // Web tools\n WebFetch: {\n name: \"WebFetch\",\n category: \"web\",\n description: \"Fetch content from a URL\",\n },\n WebSearch: {\n name: \"WebSearch\",\n category: \"web\",\n description: \"Search the web\",\n },\n\n // Search tools\n Grep: {\n name: \"Grep\",\n category: \"search\",\n description: \"Search file contents using patterns\",\n },\n\n // Assistant tools\n Task: {\n name: \"Task\",\n category: \"assistant\",\n description: \"Launch a specialized agent for a sub-task\",\n },\n TodoWrite: {\n name: \"TodoWrite\",\n category: \"assistant\",\n description: \"Manage task list and track progress\",\n },\n ExitPlanMode: {\n name: \"ExitPlanMode\",\n category: \"assistant\",\n description: \"Exit plan mode and present plan to user\",\n },\n SlashCommand: {\n name: \"SlashCommand\",\n category: \"assistant\",\n description: \"Execute a slash command\",\n },\n};\n\n/**\n * Tool registry for looking up tool definitions by name.\n * Provides metadata about tools for UI consumption.\n */\nexport class ToolRegistry {\n /**\n * Get tool definition by name.\n * Returns undefined if tool is not recognized.\n */\n get(name: string): Tool | undefined {\n return TOOL_DEFINITIONS[name];\n }\n\n /**\n * Get all registered tools.\n */\n getAll(): Tool[] {\n return Object.values(TOOL_DEFINITIONS);\n }\n\n /**\n * Check if a tool name is registered.\n */\n has(name: string): boolean {\n return name in TOOL_DEFINITIONS;\n }\n\n /**\n * Get all tools in a specific category.\n */\n getByCategory(category: string): Tool[] {\n return Object.values(TOOL_DEFINITIONS).filter(\n (tool) => tool.category === category,\n );\n }\n}\n","import { exec, execFile } from \"node:child_process\";\nimport * as crypto from \"node:crypto\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type { WorktreeInfo } from \"./types.js\";\nimport { Logger } from \"./utils/logger.js\";\n\nconst execAsync = promisify(exec);\nconst execFileAsync = promisify(execFile);\n\nexport interface WorktreeConfig {\n mainRepoPath: string;\n worktreeBasePath?: string;\n logger?: Logger;\n}\n\nconst ADJECTIVES = [\n \"swift\",\n \"bright\",\n \"calm\",\n \"bold\",\n \"gentle\",\n \"quick\",\n \"soft\",\n \"warm\",\n \"cool\",\n \"wise\",\n \"keen\",\n \"brave\",\n \"clear\",\n \"crisp\",\n \"deep\",\n \"fair\",\n \"fine\",\n \"free\",\n \"glad\",\n \"good\",\n \"grand\",\n \"great\",\n \"happy\",\n \"kind\",\n \"light\",\n \"lively\",\n \"neat\",\n \"nice\",\n \"plain\",\n \"proud\",\n \"pure\",\n \"rare\",\n \"rich\",\n \"safe\",\n \"sharp\",\n \"shy\",\n \"simple\",\n \"slim\",\n \"smart\",\n \"smooth\",\n \"solid\",\n \"sound\",\n \"spare\",\n \"stable\",\n \"steady\",\n \"still\",\n \"strong\",\n \"sure\",\n \"sweet\",\n \"tall\",\n \"agile\",\n \"ancient\",\n \"autumn\",\n \"azure\",\n \"cosmic\",\n \"daring\",\n \"dawn\",\n \"dusty\",\n \"eager\",\n \"early\",\n \"endless\",\n \"fading\",\n \"fallen\",\n \"famous\",\n \"feral\",\n \"fierce\",\n \"fleet\",\n \"foggy\",\n \"forest\",\n \"frozen\",\n \"gleeful\",\n \"golden\",\n \"hazy\",\n \"hidden\",\n \"hollow\",\n \"humble\",\n \"hushed\",\n \"icy\",\n \"inner\",\n \"late\",\n \"lazy\",\n \"little\",\n \"lone\",\n \"long\",\n \"lost\",\n \"lucky\",\n \"lunar\",\n \"magic\",\n \"mellow\",\n \"mighty\",\n \"misty\",\n \"modest\",\n \"mossy\",\n \"mystic\",\n \"nimble\",\n \"noble\",\n \"ocean\",\n \"outer\",\n \"pale\",\n \"paper\",\n \"patient\",\n \"peaceful\",\n \"phantom\",\n \"polite\",\n \"primal\",\n \"quiet\",\n \"rapid\",\n \"restless\",\n \"rising\",\n \"roaming\",\n \"rocky\",\n \"rustic\",\n \"sacred\",\n \"sandy\",\n \"secret\",\n \"serene\",\n \"shadow\",\n \"shining\",\n \"silent\",\n \"silky\",\n \"silver\",\n \"sleek\",\n \"snowy\",\n \"solar\",\n \"solemn\",\n \"spring\",\n \"starry\",\n \"stormy\",\n \"summer\",\n \"sunny\",\n \"tender\",\n \"thorny\",\n \"tiny\",\n \"tranquil\",\n \"twilight\",\n \"upward\",\n \"velvet\",\n \"vivid\",\n \"wandering\",\n \"wary\",\n \"wild\",\n \"windy\",\n \"winter\",\n \"wispy\",\n \"young\",\n];\n\nconst COLORS = [\n \"blue\",\n \"red\",\n \"green\",\n \"amber\",\n \"coral\",\n \"jade\",\n \"pearl\",\n \"ruby\",\n \"sage\",\n \"teal\",\n \"gold\",\n \"silver\",\n \"bronze\",\n \"copper\",\n \"ivory\",\n \"onyx\",\n \"opal\",\n \"rose\",\n \"slate\",\n \"violet\",\n \"aqua\",\n \"azure\",\n \"beige\",\n \"black\",\n \"brass\",\n \"brick\",\n \"brown\",\n \"cedar\",\n \"charcoal\",\n \"cherry\",\n \"chestnut\",\n \"chrome\",\n \"cider\",\n \"cinnamon\",\n \"citrus\",\n \"clay\",\n \"cloud\",\n \"cobalt\",\n \"cocoa\",\n \"cream\",\n \"crimson\",\n \"crystal\",\n \"cyan\",\n \"denim\",\n \"dusk\",\n \"ebony\",\n \"ember\",\n \"emerald\",\n \"fern\",\n \"flame\",\n \"flint\",\n \"forest\",\n \"frost\",\n \"garnet\",\n \"ginger\",\n \"glacier\",\n \"granite\",\n \"grape\",\n \"gray\",\n \"hazel\",\n \"honey\",\n \"indigo\",\n \"iron\",\n \"lapis\",\n \"lava\",\n \"lavender\",\n \"lemon\",\n \"lilac\",\n \"lime\",\n \"magenta\",\n \"mahogany\",\n \"maple\",\n \"marble\",\n \"maroon\",\n \"mauve\",\n \"midnight\",\n \"mint\",\n \"mocha\",\n \"moss\",\n \"mustard\",\n \"navy\",\n \"nickel\",\n \"obsidian\",\n \"ochre\",\n \"olive\",\n \"orange\",\n \"orchid\",\n \"peach\",\n \"pine\",\n \"pink\",\n \"plum\",\n \"porcelain\",\n \"purple\",\n \"quartz\",\n \"rust\",\n \"saffron\",\n \"salmon\",\n \"sand\",\n \"sapphire\",\n \"scarlet\",\n \"sepia\",\n \"shadow\",\n \"sienna\",\n \"smoke\",\n \"snow\",\n \"steel\",\n \"stone\",\n \"storm\",\n \"sunset\",\n \"tan\",\n \"tangerine\",\n \"taupe\",\n \"terra\",\n \"timber\",\n \"topaz\",\n \"turquoise\",\n \"umber\",\n \"vanilla\",\n \"walnut\",\n \"wheat\",\n \"white\",\n \"wine\",\n \"yellow\",\n];\n\nconst ANIMALS = [\n \"fox\",\n \"owl\",\n \"bear\",\n \"wolf\",\n \"hawk\",\n \"deer\",\n \"lynx\",\n \"otter\",\n \"raven\",\n \"falcon\",\n \"badger\",\n \"beaver\",\n \"bison\",\n \"bobcat\",\n \"crane\",\n \"eagle\",\n \"ferret\",\n \"finch\",\n \"gopher\",\n \"heron\",\n \"jaguar\",\n \"koala\",\n \"lemur\",\n \"marten\",\n \"mink\",\n \"moose\",\n \"newt\",\n \"ocelot\",\n \"osprey\",\n \"panda\",\n \"parrot\",\n \"pelican\",\n \"puma\",\n \"quail\",\n \"rabbit\",\n \"raccoon\",\n \"salmon\",\n \"seal\",\n \"shark\",\n \"shrew\",\n \"sloth\",\n \"snake\",\n \"spider\",\n \"squid\",\n \"stork\",\n \"swan\",\n \"tiger\",\n \"toucan\",\n \"turtle\",\n \"whale\",\n \"albatross\",\n \"ant\",\n \"antelope\",\n \"armadillo\",\n \"baboon\",\n \"bat\",\n \"bee\",\n \"beetle\",\n \"buffalo\",\n \"butterfly\",\n \"camel\",\n \"cardinal\",\n \"caribou\",\n \"catfish\",\n \"cheetah\",\n \"chipmunk\",\n \"cicada\",\n \"clam\",\n \"cobra\",\n \"condor\",\n \"corgi\",\n \"cougar\",\n \"coyote\",\n \"crab\",\n \"cricket\",\n \"crow\",\n \"dolphin\",\n \"donkey\",\n \"dove\",\n \"dragonfly\",\n \"duck\",\n \"eel\",\n \"egret\",\n \"elephant\",\n \"elk\",\n \"emu\",\n \"firefly\",\n \"flamingo\",\n \"frog\",\n \"gazelle\",\n \"gecko\",\n \"gibbon\",\n \"giraffe\",\n \"goat\",\n \"goose\",\n \"gorilla\",\n \"grasshopper\",\n \"grouse\",\n \"gull\",\n \"hamster\",\n \"hare\",\n \"hedgehog\",\n \"hippo\",\n \"hornet\",\n \"horse\",\n \"hound\",\n \"hummingbird\",\n \"hyena\",\n \"ibis\",\n \"iguana\",\n \"impala\",\n \"jackal\",\n \"jay\",\n \"jellyfish\",\n \"kangaroo\",\n \"kestrel\",\n \"kingfisher\",\n \"kite\",\n \"kiwi\",\n \"lark\",\n \"leopard\",\n \"lion\",\n \"lizard\",\n \"llama\",\n \"lobster\",\n \"loon\",\n \"macaw\",\n \"magpie\",\n \"mallard\",\n \"mammoth\",\n \"manatee\",\n \"mantis\",\n \"marlin\",\n \"marmot\",\n \"meerkat\",\n \"mockingbird\",\n \"mole\",\n \"mongoose\",\n \"monkey\",\n \"moth\",\n \"mouse\",\n \"mule\",\n \"narwhal\",\n \"nightingale\",\n \"octopus\",\n \"opossum\",\n \"orangutan\",\n \"oriole\",\n \"ostrich\",\n \"oyster\",\n \"panther\",\n \"peacock\",\n \"penguin\",\n \"pheasant\",\n \"pig\",\n \"pigeon\",\n \"pike\",\n \"piranha\",\n \"platypus\",\n \"pony\",\n \"porcupine\",\n \"porpoise\",\n \"python\",\n \"raven\",\n \"ray\",\n \"reindeer\",\n \"rhino\",\n \"robin\",\n \"rooster\",\n \"salamander\",\n \"sandpiper\",\n \"sardine\",\n \"scorpion\",\n \"seagull\",\n \"seahorse\",\n \"skunk\",\n \"snail\",\n \"sparrow\",\n \"squirrel\",\n \"starfish\",\n \"starling\",\n \"stingray\",\n \"swallow\",\n \"tapir\",\n \"termite\",\n \"tern\",\n \"toad\",\n \"trout\",\n \"tuna\",\n \"viper\",\n \"vulture\",\n \"walrus\",\n \"wasp\",\n \"weasel\",\n \"wombat\",\n \"woodpecker\",\n \"wren\",\n \"yak\",\n \"zebra\",\n];\n\nconst WORKTREE_FOLDER_NAME = \".array\";\n\nexport class WorktreeManager {\n private mainRepoPath: string;\n private worktreeBasePath: string | null;\n private repoName: string;\n private logger: Logger;\n\n constructor(config: WorktreeConfig) {\n this.mainRepoPath = config.mainRepoPath;\n this.worktreeBasePath = config.worktreeBasePath || null;\n this.repoName = path.basename(config.mainRepoPath);\n this.logger =\n config.logger ||\n new Logger({ debug: false, prefix: \"[WorktreeManager]\" });\n }\n\n private usesExternalPath(): boolean {\n return this.worktreeBasePath !== null;\n }\n\n private async runGitCommand(command: string): Promise<string> {\n try {\n const { stdout } = await execAsync(`git ${command}`, {\n cwd: this.mainRepoPath,\n });\n return stdout.trim();\n } catch (error) {\n throw new Error(`Git command failed: ${command}\\n${error}`);\n }\n }\n\n private randomElement<T>(array: T[]): T {\n return array[crypto.randomInt(array.length)];\n }\n\n generateWorktreeName(): string {\n const adjective = this.randomElement(ADJECTIVES);\n const color = this.randomElement(COLORS);\n const animal = this.randomElement(ANIMALS);\n return `${adjective}-${color}-${animal}`;\n }\n\n private getWorktreeFolderPath(): string {\n if (this.worktreeBasePath) {\n return path.join(this.worktreeBasePath, this.repoName);\n }\n return path.join(this.mainRepoPath, WORKTREE_FOLDER_NAME);\n }\n\n private getWorktreePath(name: string): string {\n return path.join(this.getWorktreeFolderPath(), name);\n }\n\n async worktreeExists(name: string): Promise<boolean> {\n const worktreePath = this.getWorktreePath(name);\n try {\n await fs.access(worktreePath);\n return true;\n } catch {\n return false;\n }\n }\n\n async ensureArrayDirIgnored(): Promise<void> {\n // Use .git/info/exclude instead of .gitignore to avoid modifying tracked files\n const excludePath = path.join(this.mainRepoPath, \".git\", \"info\", \"exclude\");\n const ignorePattern = `/${WORKTREE_FOLDER_NAME}/`;\n\n let content = \"\";\n try {\n content = await fs.readFile(excludePath, \"utf-8\");\n } catch {\n // File doesn't exist or .git/info doesn't exist\n }\n\n // Check if pattern is already present\n if (\n content.includes(`/${WORKTREE_FOLDER_NAME}/`) ||\n content.includes(`/${WORKTREE_FOLDER_NAME}`)\n ) {\n this.logger.debug(\"Exclude file already contains .array folder pattern\");\n return;\n }\n\n // Ensure .git/info directory exists\n const infoDir = path.join(this.mainRepoPath, \".git\", \"info\");\n await fs.mkdir(infoDir, { recursive: true });\n\n // Append the pattern\n const newContent = `${content.trimEnd()}\\n\\n# Array worktrees\\n${ignorePattern}\\n`;\n await fs.writeFile(excludePath, newContent);\n this.logger.info(\"Added .array folder to .git/info/exclude\");\n }\n\n private async generateUniqueWorktreeName(): Promise<string> {\n let name = this.generateWorktreeName();\n let attempts = 0;\n const maxAttempts = 100;\n\n while ((await this.worktreeExists(name)) && attempts < maxAttempts) {\n name = this.generateWorktreeName();\n attempts++;\n }\n\n if (attempts >= maxAttempts) {\n // Fallback: append timestamp\n name = `${this.generateWorktreeName()}-${Date.now()}`;\n }\n\n return name;\n }\n\n private async getDefaultBranch(): Promise<string> {\n try {\n const remoteBranch = await this.runGitCommand(\n \"symbolic-ref refs/remotes/origin/HEAD\",\n );\n return remoteBranch.replace(\"refs/remotes/origin/\", \"\");\n } catch {\n // Fallback: check if main exists, otherwise use master\n try {\n await this.runGitCommand(\"rev-parse --verify main\");\n return \"main\";\n } catch {\n try {\n await this.runGitCommand(\"rev-parse --verify master\");\n return \"master\";\n } catch {\n throw new Error(\n \"Cannot determine default branch. No main or master branch found.\",\n );\n }\n }\n }\n }\n\n async createWorktree(): Promise<WorktreeInfo> {\n // Only modify .git/info/exclude when using in-repo storage\n if (!this.usesExternalPath()) {\n await this.ensureArrayDirIgnored();\n }\n\n // Ensure the worktree folder exists when using external path\n if (this.usesExternalPath()) {\n const folderPath = this.getWorktreeFolderPath();\n await fs.mkdir(folderPath, { recursive: true });\n }\n\n // Generate unique worktree name\n const worktreeName = await this.generateUniqueWorktreeName();\n const worktreePath = this.getWorktreePath(worktreeName);\n const branchName = `array/${worktreeName}`;\n const baseBranch = await this.getDefaultBranch();\n\n this.logger.info(\"Creating worktree\", {\n worktreeName,\n worktreePath,\n branchName,\n baseBranch,\n external: this.usesExternalPath(),\n });\n\n // Create the worktree with a new branch\n if (this.usesExternalPath()) {\n // Use absolute path for external worktrees\n await this.runGitCommand(\n `worktree add -b \"${branchName}\" \"${worktreePath}\" \"${baseBranch}\"`,\n );\n } else {\n // Use relative path from repo root for in-repo worktrees\n const relativePath = `${WORKTREE_FOLDER_NAME}/${worktreeName}`;\n await this.runGitCommand(\n `worktree add -b \"${branchName}\" \"./${relativePath}\" \"${baseBranch}\"`,\n );\n }\n\n const createdAt = new Date().toISOString();\n\n this.logger.info(\"Worktree created successfully\", {\n worktreeName,\n worktreePath,\n branchName,\n });\n\n return {\n worktreePath,\n worktreeName,\n branchName,\n baseBranch,\n createdAt,\n };\n }\n\n async deleteWorktree(worktreePath: string): Promise<void> {\n const resolvedWorktreePath = path.resolve(worktreePath);\n const resolvedMainRepoPath = path.resolve(this.mainRepoPath);\n\n // Safety check 1: Never delete the main repo path\n if (resolvedWorktreePath === resolvedMainRepoPath) {\n const error = new Error(\n \"Cannot delete worktree: path matches main repo path\",\n );\n this.logger.error(\"Safety check failed\", { worktreePath, error });\n throw error;\n }\n\n // Safety check 2: Never delete a parent of the main repo path\n if (\n resolvedMainRepoPath.startsWith(resolvedWorktreePath) &&\n resolvedMainRepoPath !== resolvedWorktreePath\n ) {\n const error = new Error(\n \"Cannot delete worktree: path is a parent of main repo path\",\n );\n this.logger.error(\"Safety check failed\", { worktreePath, error });\n throw error;\n }\n\n // Safety check 3: Check for .git directory (indicates main repo)\n try {\n const gitPath = path.join(resolvedWorktreePath, \".git\");\n const stat = await fs.stat(gitPath);\n if (stat.isDirectory()) {\n const error = new Error(\n \"Cannot delete worktree: path appears to be a main repository (contains .git directory)\",\n );\n this.logger.error(\"Safety check failed\", { worktreePath, error });\n throw error;\n }\n } catch (error) {\n // If .git doesn't exist or we can't read it, proceed (unless it was the directory check above)\n if (\n error instanceof Error &&\n error.message.includes(\"Cannot delete worktree\")\n ) {\n throw error;\n }\n }\n\n this.logger.info(\"Deleting worktree\", { worktreePath });\n\n try {\n // First, try to remove the worktree via git using execFileAsync for safety\n await execFileAsync(\n \"git\",\n [\"worktree\", \"remove\", worktreePath, \"--force\"],\n {\n cwd: this.mainRepoPath,\n },\n );\n this.logger.info(\"Worktree deleted successfully\", { worktreePath });\n } catch (error) {\n this.logger.warn(\n \"Git worktree remove failed, attempting manual cleanup\",\n {\n worktreePath,\n error,\n },\n );\n\n // Manual cleanup if git command fails\n try {\n await fs.rm(worktreePath, { recursive: true, force: true });\n // Also prune the worktree list\n await this.runGitCommand(\"worktree prune\");\n this.logger.info(\"Worktree cleaned up manually\", { worktreePath });\n } catch (cleanupError) {\n this.logger.error(\"Failed to cleanup worktree\", {\n worktreePath,\n cleanupError,\n });\n throw cleanupError;\n }\n }\n }\n\n async getWorktreeInfo(worktreePath: string): Promise<WorktreeInfo | null> {\n try {\n // Parse the worktree list to find info about this worktree\n const output = await this.runGitCommand(\"worktree list --porcelain\");\n const worktrees = this.parseWorktreeList(output);\n\n const worktree = worktrees.find((w) => w.worktreePath === worktreePath);\n return worktree || null;\n } catch (error) {\n this.logger.debug(\"Failed to get worktree info\", { worktreePath, error });\n return null;\n }\n }\n\n async listWorktrees(): Promise<WorktreeInfo[]> {\n try {\n const output = await this.runGitCommand(\"worktree list --porcelain\");\n return this.parseWorktreeList(output);\n } catch (error) {\n this.logger.debug(\"Failed to list worktrees\", { error });\n return [];\n }\n }\n\n private parseWorktreeList(output: string): WorktreeInfo[] {\n const worktrees: WorktreeInfo[] = [];\n const entries = output.split(\"\\n\\n\").filter((e) => e.trim());\n const worktreeFolderPath = this.getWorktreeFolderPath();\n\n for (const entry of entries) {\n const lines = entry.split(\"\\n\");\n let worktreePath = \"\";\n let branchName = \"\";\n\n for (const line of lines) {\n if (line.startsWith(\"worktree \")) {\n worktreePath = line.replace(\"worktree \", \"\");\n } else if (line.startsWith(\"branch refs/heads/\")) {\n branchName = line.replace(\"branch refs/heads/\", \"\");\n }\n }\n\n // Include worktrees that:\n // 1. Are in our worktree folder (external or in-repo)\n // 2. Have a posthog/ branch prefix (our naming convention)\n const isInWorktreeFolder = worktreePath?.startsWith(worktreeFolderPath);\n const isArrayBranch =\n branchName?.startsWith(\"array/\") || branchName?.startsWith(\"posthog/\");\n\n if (worktreePath && branchName && (isInWorktreeFolder || isArrayBranch)) {\n const worktreeName = path.basename(worktreePath);\n worktrees.push({\n worktreePath,\n worktreeName,\n branchName,\n baseBranch: \"\",\n createdAt: \"\",\n });\n }\n }\n\n return worktrees;\n }\n\n async isWorktree(repoPath: string): Promise<boolean> {\n try {\n const { stdout } = await execAsync(\n \"git rev-parse --is-inside-work-tree\",\n { cwd: repoPath },\n );\n if (stdout.trim() !== \"true\") {\n return false;\n }\n\n // Check if there's a .git file (worktrees have a .git file, not a .git directory)\n const gitPath = path.join(repoPath, \".git\");\n const stat = await fs.stat(gitPath);\n return stat.isFile(); // Worktrees have .git as a file, main repos have .git as a directory\n } catch {\n return false;\n }\n }\n\n async getMainRepoPathFromWorktree(\n worktreePath: string,\n ): Promise<string | null> {\n try {\n const gitFilePath = path.join(worktreePath, \".git\");\n const content = await fs.readFile(gitFilePath, \"utf-8\");\n\n // The .git file in a worktree contains: gitdir: /path/to/main/.git/worktrees/name\n const match = content.match(/gitdir:\\s*(.+)/);\n if (match) {\n const gitDir = match[1].trim();\n // Go up from .git/worktrees/name to get the main repo path\n // The gitdir points to something like: /main/repo/.git/worktrees/worktree-name\n const mainGitDir = path.resolve(gitDir, \"..\", \"..\", \"..\");\n return mainGitDir;\n }\n return null;\n } catch {\n return null;\n }\n }\n\n async cleanupOrphanedWorktrees(associatedWorktreePaths: string[]): Promise<{\n deleted: string[];\n errors: Array<{ path: string; error: string }>;\n }> {\n this.logger.info(\"Starting cleanup of orphaned worktrees\");\n\n const allWorktrees = await this.listWorktrees();\n const deleted: string[] = [];\n const errors: Array<{ path: string; error: string }> = [];\n\n const associatedPathsSet = new Set(\n associatedWorktreePaths.map((p) => path.resolve(p)),\n );\n\n for (const worktree of allWorktrees) {\n const resolvedPath = path.resolve(worktree.worktreePath);\n\n if (!associatedPathsSet.has(resolvedPath)) {\n this.logger.info(\"Found orphaned worktree\", {\n path: worktree.worktreePath,\n });\n\n try {\n await this.deleteWorktree(worktree.worktreePath);\n deleted.push(worktree.worktreePath);\n this.logger.info(\"Deleted orphaned worktree\", {\n path: worktree.worktreePath,\n });\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n errors.push({\n path: worktree.worktreePath,\n error: errorMessage,\n });\n this.logger.error(\"Failed to delete orphaned worktree\", {\n path: worktree.worktreePath,\n error: errorMessage,\n });\n }\n }\n }\n\n this.logger.info(\"Cleanup completed\", {\n deleted: deleted.length,\n errors: errors.length,\n });\n\n return { deleted, errors };\n }\n}\n"],"mappings":"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AA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,SAAS;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,UAAU;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AA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","names":["LogLevel","logger","WritableStream","resolve","logger","resolve","WritableStream","resolve","status","unreachable","logger","path","content","input","query","response","server","path","logger","update","ndJsonStream","fs","join","z","logger","join","fs","z","fs","join","join","fs","logger","randomBytes","resolve","existsSync","fs","join","join","existsSync","fs","query","logger","PermissionMode","logger","query","logger","logger","query","logger","query","query","logger","query","ndJsonStream","resolve","z","exec","fs","path","promisify","execAsync","promisify","exec","stat"]}
1
+ {"version":3,"sources":["../src/acp-extensions.ts","../src/adapters/claude/claude.ts","../src/utils/logger.ts","../src/utils/tapped-stream.ts","../package.json","../src/adapters/claude/mcp-server.ts","../src/adapters/claude/utils.ts","../src/adapters/claude/tools.ts","../src/agent.ts","../src/file-manager.ts","../src/git-manager.ts","../src/posthog-api.ts","../src/prompt-builder.ts","../src/session-store.ts","../src/task-manager.ts","../src/template-manager.ts","../src/workflow/steps/build.ts","../src/agents/execution.ts","../src/todo-manager.ts","../src/types.ts","../src/workflow/utils.ts","../src/workflow/steps/finalize.ts","../src/workflow/steps/plan.ts","../src/agents/planning.ts","../src/workflow/steps/research.ts","../src/agents/research.ts","../src/workflow/config.ts","../src/schemas.ts","../src/tools/registry.ts","../src/worktree-manager.ts"],"sourcesContent":["/**\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 * 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 /** Artifact produced during task execution (research, plan, etc.) */\n ARTIFACT: \"_posthog/artifact\",\n /** Phase has started (research, plan, build, etc.) */\n PHASE_START: \"_posthog/phase_start\",\n /** Phase has completed */\n PHASE_COMPLETE: \"_posthog/phase_complete\",\n /** Git branch was created */\n BRANCH_CREATED: \"_posthog/branch_created\",\n /** Pull request was created */\n PR_CREATED: \"_posthog/pr_created\",\n /** Task run has started */\n RUN_STARTED: \"_posthog/run_started\",\n /** Task has completed */\n TASK_COMPLETE: \"_posthog/task_complete\",\n /** Error occurred during task execution */\n ERROR: \"_posthog/error\",\n /** Console/log output */\n CONSOLE: \"_posthog/console\",\n /** SDK session ID notification (for resumption) */\n SDK_SESSION: \"_posthog/sdk_session\",\n} as const;\n\nexport type PostHogNotificationType =\n (typeof POSTHOG_NOTIFICATIONS)[keyof typeof POSTHOG_NOTIFICATIONS];\n\nexport interface ArtifactNotificationPayload {\n sessionId: string;\n kind:\n | \"research_evaluation\"\n | \"research_questions\"\n | \"plan\"\n | \"pr_body\"\n | string;\n content: unknown;\n}\n\nexport interface PhaseNotificationPayload {\n sessionId: string;\n phase: \"research\" | \"plan\" | \"build\" | \"finalize\" | string;\n [key: string]: unknown;\n}\n\nexport interface BranchCreatedPayload {\n sessionId: string;\n branch: string;\n}\n\n/**\n * Payload for PR created notification\n */\nexport interface PrCreatedPayload {\n sessionId: string;\n prUrl: string;\n}\n\nexport interface RunStartedPayload {\n sessionId: string;\n runId: string;\n taskId?: string;\n}\n\n/**\n * Payload for task complete notification\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\n/**\n * Console output for a session\n */\nexport interface ConsoleNotificationPayload {\n sessionId: string;\n level: \"debug\" | \"info\" | \"warn\" | \"error\";\n message: string;\n}\n\n/**\n * Maps a session ID to a SDKs session ID\n */\nexport interface SdkSessionPayload {\n sessionId: string;\n sdkSessionId: string;\n}\n\nexport type PostHogNotificationPayload =\n | ArtifactNotificationPayload\n | PhaseNotificationPayload\n | BranchCreatedPayload\n | PrCreatedPayload\n | RunStartedPayload\n | TaskCompletePayload\n | ErrorNotificationPayload\n | ConsoleNotificationPayload\n | SdkSessionPayload;\n","/**\n * The claude adapter has been based on the original claude-code-acp adapter,\n * and could use some cleanup.\n *\n * https://github.com/zed-industries/claude-code-acp\n */\n\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport {\n type Agent,\n AgentSideConnection,\n type AuthenticateRequest,\n type AvailableCommand,\n type CancelNotification,\n type ClientCapabilities,\n type InitializeRequest,\n type InitializeResponse,\n type LoadSessionRequest,\n type LoadSessionResponse,\n type NewSessionRequest,\n type NewSessionResponse,\n ndJsonStream,\n type PromptRequest,\n type PromptResponse,\n type ReadTextFileRequest,\n type ReadTextFileResponse,\n RequestError,\n type SessionModelState,\n type SessionNotification,\n type SetSessionModelRequest,\n type SetSessionModeRequest,\n type SetSessionModeResponse,\n type TerminalHandle,\n type TerminalOutputResponse,\n type WriteTextFileRequest,\n type WriteTextFileResponse,\n} from \"@agentclientprotocol/sdk\";\nimport {\n type CanUseTool,\n type McpServerConfig,\n type Options,\n type PermissionMode,\n type Query,\n query,\n type SDKPartialAssistantMessage,\n type 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 { v7 as uuidv7 } from \"uuid\";\nimport type {\n SessionPersistenceConfig,\n SessionStore,\n} from \"@/session-store.js\";\nimport { Logger } from \"@/utils/logger.js\";\nimport { createTappedWritableStream } from \"@/utils/tapped-stream.js\";\nimport packageJson from \"../../../package.json\" with { type: \"json\" };\nimport { createMcpServer, EDIT_TOOL_NAMES, toolNames } from \"./mcp-server.js\";\nimport {\n type ClaudePlanEntry,\n createPostToolUseHook,\n planEntries,\n registerHookCallback,\n toolInfoFromToolUse,\n toolUpdateFromToolResult,\n} from \"./tools.js\";\nimport {\n createBidirectionalStreams,\n Pushable,\n type StreamPair,\n unreachable,\n} from \"./utils.js\";\n\n/**\n * Clears the statsig cache to work around a claude-agent-sdk bug where cached\n * tool definitions include input_examples which causes API errors.\n * See: https://github.com/anthropics/claude-code/issues/11678\n */\nfunction clearStatsigCache(): void {\n const configDir =\n process.env.CLAUDE_CONFIG_DIR || path.join(os.homedir(), \".claude\");\n const statsigPath = path.join(configDir, \"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\ntype Session = {\n query: Query;\n input: Pushable<SDKUserMessage>;\n cancelled: boolean;\n permissionMode: PermissionMode;\n notificationHistory: SessionNotification[];\n sdkSessionId?: string;\n};\n\ntype BackgroundTerminal =\n | {\n handle: TerminalHandle;\n status: \"started\";\n lastOutput: TerminalOutputResponse | null;\n }\n | {\n status: \"aborted\" | \"exited\" | \"killed\" | \"timedOut\";\n pendingOutput: TerminalOutputResponse;\n };\n\n/**\n * Extra metadata that can be given to Claude Code when creating a new session.\n */\nexport type NewSessionMeta = {\n claudeCode?: {\n /**\n * Options forwarded to Claude Code when starting a new session.\n * Those parameters will be ignored and managed by ACP:\n * - cwd\n * - includePartialMessages\n * - allowDangerouslySkipPermissions\n * - permissionMode\n * - canUseTool\n * - executable\n * Those parameters will be used and updated to work with ACP:\n * - hooks (merged with ACP's hooks)\n * - mcpServers (merged with ACP's mcpServers)\n */\n options?: Options;\n };\n /** Initial model to use for the session (e.g., 'claude-opus-4-5', 'gpt-5.1') */\n model?: string;\n};\n\n/**\n * Extra metadata that the agent provides for each tool_call / tool_update update.\n */\nexport type ToolUpdateMeta = {\n claudeCode?: {\n /* The name of the tool that was used in Claude Code. */\n toolName: string;\n /* The structured output provided by Claude Code. */\n toolResponse?: unknown;\n };\n};\n\ntype ToolUseCache = {\n [key: string]: {\n type: \"tool_use\" | \"server_tool_use\" | \"mcp_tool_use\";\n id: string;\n name: string;\n input: any;\n };\n};\n\n// Bypass Permissions doesn't work if we are a root/sudo user\nconst IS_ROOT = (process.geteuid?.() ?? process.getuid?.()) === 0;\n\n// Implement the ACP Agent interface\nexport class ClaudeAcpAgent implements Agent {\n sessions: {\n [key: string]: Session;\n };\n client: AgentSideConnection;\n toolUseCache: ToolUseCache;\n fileContentCache: { [key: string]: string };\n backgroundTerminals: { [key: string]: BackgroundTerminal } = {};\n clientCapabilities?: ClientCapabilities;\n logger: Logger = new Logger({ debug: true, prefix: \"[ClaudeAcpAgent]\" });\n sessionStore?: SessionStore;\n\n constructor(client: AgentSideConnection, sessionStore?: SessionStore) {\n this.sessions = {};\n this.client = client;\n this.toolUseCache = {};\n this.fileContentCache = {};\n this.sessionStore = sessionStore;\n }\n\n createSession(\n sessionId: string,\n q: Query,\n input: Pushable<SDKUserMessage>,\n permissionMode: PermissionMode,\n ): Session {\n const session: Session = {\n query: q,\n input,\n cancelled: false,\n permissionMode,\n notificationHistory: [],\n };\n this.sessions[sessionId] = session;\n return session;\n }\n\n appendNotification(\n sessionId: string,\n notification: SessionNotification,\n ): void {\n // In-memory only - S3 persistence is now automatic via tapped stream\n this.sessions[sessionId]?.notificationHistory.push(notification);\n }\n\n async initialize(request: InitializeRequest): Promise<InitializeResponse> {\n this.clientCapabilities = request.clientCapabilities;\n\n // Default authMethod\n const authMethod: any = {\n description: \"Run `claude /login` in the terminal\",\n name: \"Log in with Claude Code\",\n id: \"claude-login\",\n };\n\n // If client supports terminal-auth capability, use that instead.\n // if (request.clientCapabilities?._meta?.[\"terminal-auth\"] === true) {\n // const cliPath = fileURLToPath(import.meta.resolve(\"@anthropic-ai/claude-agent-sdk/cli.js\"));\n\n // authMethod._meta = {\n // \"terminal-auth\": {\n // command: \"node\",\n // args: [cliPath, \"/login\"],\n // label: \"Claude Code Login\",\n // },\n // };\n // }\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: [authMethod],\n };\n }\n async newSession(params: NewSessionRequest): Promise<NewSessionResponse> {\n if (\n fs.existsSync(path.resolve(os.homedir(), \".claude.json.backup\")) &&\n !fs.existsSync(path.resolve(os.homedir(), \".claude.json\"))\n ) {\n throw RequestError.authRequired();\n }\n\n // Allow caller to specify sessionId via _meta (e.g. taskRunId in our case)\n const sessionId =\n (params._meta as { sessionId?: string } | undefined)?.sessionId ||\n uuidv7();\n const input = new Pushable<SDKUserMessage>();\n\n const mcpServers: Record<string, McpServerConfig> = {};\n if (Array.isArray(params.mcpServers)) {\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\n // Only add the acp MCP server if built-in tools are not disabled\n if (!params._meta?.disableBuiltInTools) {\n const server = createMcpServer(this, sessionId, this.clientCapabilities);\n mcpServers.acp = {\n type: \"sdk\",\n name: \"acp\",\n instance: server,\n };\n }\n\n let systemPrompt: Options[\"systemPrompt\"] = {\n type: \"preset\",\n preset: \"claude_code\",\n };\n if (params._meta?.systemPrompt) {\n const customPrompt = params._meta.systemPrompt;\n if (typeof customPrompt === \"string\") {\n systemPrompt = customPrompt;\n } else if (\n typeof customPrompt === \"object\" &&\n \"append\" in customPrompt &&\n typeof customPrompt.append === \"string\"\n ) {\n systemPrompt.append = customPrompt.append;\n }\n }\n\n const permissionMode = \"default\";\n\n // Extract options from _meta if provided\n const userProvidedOptions = (params._meta as NewSessionMeta | undefined)\n ?.claudeCode?.options;\n\n const options: Options = {\n systemPrompt,\n settingSources: [\"user\", \"project\", \"local\"],\n stderr: (err) => this.logger.error(err),\n ...userProvidedOptions,\n // Override certain fields that must be controlled by ACP\n cwd: params.cwd,\n includePartialMessages: true,\n mcpServers: { ...(userProvidedOptions?.mcpServers || {}), ...mcpServers },\n // If we want bypassPermissions to be an option, we have to allow it here.\n // But it doesn't work in root mode, so we only activate it if it will work.\n allowDangerouslySkipPermissions: !IS_ROOT,\n permissionMode,\n canUseTool: this.canUseTool(sessionId),\n // Use \"node\" to resolve via PATH where a symlink to Electron exists.\n // This avoids launching the Electron binary directly from the app bundle,\n // which can cause dock icons to appear on macOS even with ELECTRON_RUN_AS_NODE.\n executable: \"node\",\n // Prevent spawned Electron processes from showing in dock/tray.\n // Must merge with process.env since SDK replaces rather than merges.\n env: { ...process.env, ELECTRON_RUN_AS_NODE: \"1\" },\n ...(process.env.CLAUDE_CODE_EXECUTABLE && {\n pathToClaudeCodeExecutable: process.env.CLAUDE_CODE_EXECUTABLE,\n }),\n hooks: {\n ...userProvidedOptions?.hooks,\n PostToolUse: [\n ...(userProvidedOptions?.hooks?.PostToolUse || []),\n {\n hooks: [createPostToolUseHook(this.logger)],\n },\n ],\n },\n };\n\n const allowedTools = [];\n const disallowedTools = [];\n\n // Check if built-in tools should be disabled\n const disableBuiltInTools = params._meta?.disableBuiltInTools === true;\n\n if (!disableBuiltInTools) {\n if (this.clientCapabilities?.fs?.readTextFile) {\n allowedTools.push(toolNames.read);\n disallowedTools.push(\"Read\");\n }\n if (this.clientCapabilities?.fs?.writeTextFile) {\n disallowedTools.push(\"Write\", \"Edit\");\n }\n if (this.clientCapabilities?.terminal) {\n allowedTools.push(toolNames.bashOutput, toolNames.killShell);\n disallowedTools.push(\"Bash\", \"BashOutput\", \"KillShell\");\n }\n } else {\n // When built-in tools are disabled, explicitly disallow all of them\n disallowedTools.push(\n toolNames.read,\n toolNames.write,\n toolNames.edit,\n toolNames.bash,\n toolNames.bashOutput,\n toolNames.killShell,\n \"Read\",\n \"Write\",\n \"Edit\",\n \"Bash\",\n \"BashOutput\",\n \"KillShell\",\n \"Glob\",\n \"Grep\",\n \"Task\",\n \"TodoWrite\",\n \"ExitPlanMode\",\n \"WebSearch\",\n \"WebFetch\",\n \"AskUserQuestion\",\n \"SlashCommand\",\n \"Skill\",\n \"NotebookEdit\",\n );\n }\n\n if (allowedTools.length > 0) {\n options.allowedTools = allowedTools;\n }\n if (disallowedTools.length > 0) {\n options.disallowedTools = disallowedTools;\n }\n\n // Handle abort controller from meta options\n const abortController = userProvidedOptions?.abortController;\n if (abortController?.signal.aborted) {\n throw new Error(\"Cancelled\");\n }\n\n // Clear statsig cache before creating query to avoid input_examples bug\n clearStatsigCache();\n\n const q = query({\n prompt: input,\n options,\n });\n\n this.createSession(sessionId, q, input, permissionMode);\n\n // Register for S3 persistence if config provided\n const persistence = params._meta?.persistence as\n | SessionPersistenceConfig\n | undefined;\n if (persistence && this.sessionStore) {\n this.sessionStore.register(sessionId, persistence);\n }\n\n const availableCommands = await getAvailableSlashCommands(q);\n const models = await getAvailableModels(q);\n\n // Set initial model if provided via _meta (must be after getAvailableModels which resets to default)\n const requestedModel = (params._meta as NewSessionMeta | undefined)?.model;\n if (requestedModel) {\n try {\n await q.setModel(requestedModel);\n this.logger.info(\"Set initial model\", { model: requestedModel });\n } catch (err) {\n this.logger.warn(\"Failed to set initial model, using default\", {\n requestedModel,\n error: err,\n });\n }\n }\n\n // Needs to happen after we return the session\n setTimeout(() => {\n this.client.sessionUpdate({\n sessionId,\n update: {\n sessionUpdate: \"available_commands_update\",\n availableCommands,\n },\n });\n }, 0);\n\n const availableModes = [\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:\n \"Automatically accepts file edit permissions for the session\",\n },\n {\n id: \"plan\",\n name: \"Plan Mode\",\n description:\n \"Claude can analyze but not modify files or execute commands\",\n },\n ];\n // Only works in non-root mode\n if (!IS_ROOT) {\n availableModes.push({\n id: \"bypassPermissions\",\n name: \"Bypass Permissions\",\n description: \"Skips all permission prompts\",\n });\n }\n\n return {\n sessionId,\n models,\n modes: {\n currentModeId: permissionMode,\n availableModes,\n },\n };\n }\n\n async authenticate(_params: AuthenticateRequest): Promise<void> {\n throw new Error(\"Method not implemented.\");\n }\n\n async prompt(params: PromptRequest): Promise<PromptResponse> {\n if (!this.sessions[params.sessionId]) {\n throw new Error(\"Session not found\");\n }\n\n this.sessions[params.sessionId].cancelled = false;\n\n const { query, input } = this.sessions[params.sessionId];\n\n // Capture and store user message for replay\n for (const chunk of params.prompt) {\n const userNotification: SessionNotification = {\n sessionId: params.sessionId,\n update: {\n sessionUpdate: \"user_message_chunk\",\n content: chunk,\n },\n };\n await this.client.sessionUpdate(userNotification);\n this.appendNotification(params.sessionId, userNotification);\n }\n\n input.push(promptToClaude(params));\n while (true) {\n const { value: message, done } = await query.next();\n if (done || !message) {\n if (this.sessions[params.sessionId].cancelled) {\n return { stopReason: \"cancelled\" };\n }\n break;\n }\n this.logger.debug(\"SDK message received\", {\n type: message.type,\n subtype: (message as any).subtype,\n });\n\n switch (message.type) {\n case \"system\":\n switch (message.subtype) {\n case \"init\":\n // Capture SDK session ID and notify client for persistence\n if (message.session_id) {\n const session = this.sessions[params.sessionId];\n if (session && !session.sdkSessionId) {\n session.sdkSessionId = message.session_id;\n this.client.extNotification(\"_posthog/sdk_session\", {\n sessionId: params.sessionId,\n sdkSessionId: message.session_id,\n });\n }\n }\n break;\n case \"compact_boundary\":\n case \"hook_response\":\n case \"status\":\n // Todo: process via status api: https://docs.claude.com/en/docs/claude-code/hooks#hook-output\n break;\n default:\n unreachable(message, this.logger);\n break;\n }\n break;\n case \"result\": {\n if (this.sessions[params.sessionId].cancelled) {\n return { stopReason: \"cancelled\" };\n }\n\n switch (message.subtype) {\n case \"success\": {\n if (message.result.includes(\"Please run /login\")) {\n throw RequestError.authRequired();\n }\n if (message.is_error) {\n throw RequestError.internalError(undefined, message.result);\n }\n return { stopReason: \"end_turn\" };\n }\n case \"error_during_execution\":\n if (message.is_error) {\n throw RequestError.internalError(\n undefined,\n message.errors.join(\", \") || message.subtype,\n );\n }\n return { 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 throw RequestError.internalError(\n undefined,\n message.errors.join(\", \") || message.subtype,\n );\n }\n return { stopReason: \"max_turn_requests\" };\n default:\n unreachable(message, this.logger);\n break;\n }\n break;\n }\n case \"stream_event\": {\n this.logger.debug(\"Stream event\", { eventType: message.event?.type });\n for (const notification of streamEventToAcpNotifications(\n message,\n params.sessionId,\n this.toolUseCache,\n this.fileContentCache,\n this.client,\n this.logger,\n )) {\n await this.client.sessionUpdate(notification);\n this.appendNotification(params.sessionId, notification);\n }\n break;\n }\n case \"user\":\n case \"assistant\": {\n if (this.sessions[params.sessionId].cancelled) {\n break;\n }\n\n // Slash commands like /compact can generate invalid output... doesn't match\n // their own docs: https://docs.anthropic.com/en/docs/claude-code/sdk/sdk-slash-commands#%2Fcompact-compact-conversation-history\n if (\n typeof message.message.content === \"string\" &&\n message.message.content.includes(\"<local-command-stdout>\")\n ) {\n this.logger.info(message.message.content);\n break;\n }\n\n if (\n typeof message.message.content === \"string\" &&\n message.message.content.includes(\"<local-command-stderr>\")\n ) {\n this.logger.error(message.message.content);\n break;\n }\n // Skip these user messages for now, since they seem to just be messages we don't want in the feed\n if (\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 break;\n }\n\n if (\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\")\n ) {\n throw RequestError.authRequired();\n }\n\n // For assistant messages, text/thinking are normally streamed via stream_event.\n // But some gateways (like LiteLLM) don't stream, so we process all content.\n const content = message.message.content;\n\n for (const notification of toAcpNotifications(\n content,\n message.message.role,\n params.sessionId,\n this.toolUseCache,\n this.fileContentCache,\n this.client,\n this.logger,\n )) {\n await this.client.sessionUpdate(notification);\n this.appendNotification(params.sessionId, notification);\n }\n break;\n }\n case \"tool_progress\":\n break;\n case \"auth_status\":\n break;\n default:\n unreachable(message, this.logger);\n break;\n }\n }\n throw new Error(\"Session did not end in result\");\n }\n\n async cancel(params: CancelNotification): Promise<void> {\n if (!this.sessions[params.sessionId]) {\n throw new Error(\"Session not found\");\n }\n this.sessions[params.sessionId].cancelled = true;\n await this.sessions[params.sessionId].query.interrupt();\n }\n\n async setSessionModel(params: SetSessionModelRequest) {\n if (!this.sessions[params.sessionId]) {\n throw new Error(\"Session not found\");\n }\n await this.sessions[params.sessionId].query.setModel(params.modelId);\n }\n\n async setSessionMode(\n params: SetSessionModeRequest,\n ): Promise<SetSessionModeResponse> {\n if (!this.sessions[params.sessionId]) {\n throw new Error(\"Session not found\");\n }\n\n switch (params.modeId) {\n case \"default\":\n case \"acceptEdits\":\n case \"bypassPermissions\":\n case \"plan\":\n this.sessions[params.sessionId].permissionMode = params.modeId;\n try {\n await this.sessions[params.sessionId].query.setPermissionMode(\n params.modeId,\n );\n } catch (error) {\n const errorMessage =\n error instanceof Error && error.message\n ? error.message\n : \"Invalid Mode\";\n\n throw new Error(errorMessage);\n }\n return {};\n default:\n throw new Error(\"Invalid Mode\");\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 /**\n * Load session delegates to resumeSession since we have no need to replay history.\n * Client is responsible for fetching and rendering history from S3.\n */\n async loadSession(params: LoadSessionRequest): Promise<LoadSessionResponse> {\n return this.resumeSession(params);\n }\n\n canUseTool(sessionId: string): CanUseTool {\n return async (toolName, toolInput, { suggestions, toolUseID }) => {\n const session = this.sessions[sessionId];\n if (!session) {\n return {\n behavior: \"deny\",\n message: \"Session not found\",\n interrupt: true,\n };\n }\n\n if (toolName === \"ExitPlanMode\") {\n const response = await this.client.requestPermission({\n options: [\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 sessionId,\n toolCall: {\n toolCallId: toolUseID,\n rawInput: toolInput,\n title: toolInfoFromToolUse(\n { name: toolName, input: toolInput },\n this.fileContentCache,\n this.logger,\n ).title,\n },\n });\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 this.client.sessionUpdate({\n sessionId,\n update: {\n sessionUpdate: \"current_mode_update\",\n currentModeId: response.outcome.optionId,\n },\n });\n\n return {\n behavior: \"allow\",\n updatedInput: toolInput,\n updatedPermissions: suggestions ?? [\n {\n type: \"setMode\",\n mode: response.outcome.optionId,\n destination: \"session\",\n },\n ],\n };\n } else {\n return {\n behavior: \"deny\",\n message: \"User rejected request to exit plan mode.\",\n interrupt: true,\n };\n }\n }\n\n if (\n session.permissionMode === \"bypassPermissions\" ||\n (session.permissionMode === \"acceptEdits\" &&\n EDIT_TOOL_NAMES.includes(toolName))\n ) {\n return {\n behavior: \"allow\",\n updatedInput: toolInput,\n updatedPermissions: suggestions ?? [\n {\n type: \"addRules\",\n rules: [{ toolName }],\n behavior: \"allow\",\n destination: \"session\",\n },\n ],\n };\n }\n\n const response = await this.client.requestPermission({\n options: [\n {\n kind: \"allow_always\",\n name: \"Always Allow\",\n optionId: \"allow_always\",\n },\n { kind: \"allow_once\", name: \"Allow\", optionId: \"allow\" },\n { kind: \"reject_once\", name: \"Reject\", optionId: \"reject\" },\n ],\n sessionId,\n toolCall: {\n toolCallId: toolUseID,\n rawInput: toolInput,\n title: toolInfoFromToolUse(\n { name: toolName, input: toolInput },\n this.fileContentCache,\n this.logger,\n ).title,\n },\n });\n if (\n response.outcome?.outcome === \"selected\" &&\n (response.outcome.optionId === \"allow\" ||\n response.outcome.optionId === \"allow_always\")\n ) {\n // If Claude Code has suggestions, it will update their settings already\n if (response.outcome.optionId === \"allow_always\") {\n return {\n behavior: \"allow\",\n updatedInput: toolInput,\n updatedPermissions: suggestions ?? [\n {\n type: \"addRules\",\n rules: [{ toolName }],\n behavior: \"allow\",\n destination: \"session\",\n },\n ],\n };\n }\n return {\n behavior: \"allow\",\n updatedInput: toolInput,\n };\n } else {\n return {\n behavior: \"deny\",\n message: \"User refused permission to run tool\",\n interrupt: true,\n };\n }\n };\n }\n\n /**\n * Handle custom extension methods.\n * Per ACP spec, extension methods start with underscore.\n */\n async extMethod(\n method: string,\n params: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n if (method === \"_posthog/session/resume\") {\n await this.resumeSession(params as unknown as LoadSessionRequest);\n return {};\n }\n\n if (method === \"session/setModel\") {\n const { sessionId, modelId } = params as {\n sessionId: string;\n modelId: string;\n };\n await this.setSessionModel({ sessionId, modelId });\n return {};\n }\n\n throw RequestError.methodNotFound(method);\n }\n\n /**\n * Resume a session without replaying history.\n * Client is responsible for fetching and rendering history from S3.\n * This basically implemetns the ACP session/resume RFD:\n * https://agentclientprotocol.com/rfds/session-resume\n */\n async resumeSession(\n params: LoadSessionRequest,\n ): Promise<LoadSessionResponse> {\n this.logger.info(\"[RESUME] Resuming session\", { params });\n const { sessionId } = params;\n\n // Extract persistence config and SDK session ID from _meta\n const persistence = params._meta?.persistence as\n | SessionPersistenceConfig\n | undefined;\n const sdkSessionId = params._meta?.sdkSessionId as string | undefined;\n\n if (!this.sessions[sessionId]) {\n const input = new Pushable<SDKUserMessage>();\n\n const mcpServers: Record<string, McpServerConfig> = {};\n if (Array.isArray(params.mcpServers)) {\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(\n server.headers.map((e) => [e.name, e.value]),\n )\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\n const server = createMcpServer(this, sessionId, this.clientCapabilities);\n mcpServers.acp = {\n type: \"sdk\",\n name: \"acp\",\n instance: server,\n };\n\n const permissionMode = \"default\";\n\n this.logger.info(\"Resuming session\", {\n cwd: params.cwd,\n sdkSessionId,\n persistence,\n });\n const options: Options = {\n cwd: params.cwd,\n includePartialMessages: true,\n mcpServers,\n systemPrompt: { type: \"preset\", preset: \"claude_code\" },\n settingSources: [\"user\", \"project\", \"local\"],\n allowDangerouslySkipPermissions: !IS_ROOT,\n permissionMode,\n canUseTool: this.canUseTool(sessionId),\n stderr: (err) => this.logger.error(err),\n // Use \"node\" to resolve via PATH where a symlink to Electron exists.\n // This avoids launching the Electron binary directly from the app bundle,\n // which can cause dock icons to appear on macOS even with ELECTRON_RUN_AS_NODE.\n executable: \"node\",\n // Prevent spawned Electron processes from showing in dock/tray.\n // Must merge with process.env since SDK replaces rather than merges.\n env: { ...process.env, ELECTRON_RUN_AS_NODE: \"1\" },\n ...(process.env.CLAUDE_CODE_EXECUTABLE && {\n pathToClaudeCodeExecutable: process.env.CLAUDE_CODE_EXECUTABLE,\n }),\n // Resume from SDK session if available\n ...(sdkSessionId && { resume: sdkSessionId }),\n hooks: {\n PostToolUse: [\n {\n hooks: [createPostToolUseHook(this.logger)],\n },\n ],\n },\n };\n\n // Clear statsig cache before creating query to avoid input_examples bug\n clearStatsigCache();\n\n const q = query({\n prompt: input,\n options,\n });\n\n const availableCommands = await getAvailableSlashCommands(q);\n\n const newSession = this.createSession(\n sessionId,\n q,\n input,\n permissionMode,\n );\n\n // Store SDK session ID if resuming\n if (sdkSessionId) {\n newSession.sdkSessionId = sdkSessionId;\n }\n\n // Register for future persistence\n if (persistence && this.sessionStore) {\n this.sessionStore.register(sessionId, persistence);\n }\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 return {};\n }\n}\n\nasync function getAvailableModels(query: Query): Promise<SessionModelState> {\n const models = await query.supportedModels();\n\n // Query doesn't give us access to the currently selected model, so we just choose the first model in the list.\n const currentModel = models[0];\n await query.setModel(currentModel.value);\n\n const availableModels = models.map((model) => ({\n modelId: model.value,\n name: model.displayName,\n description: model.description,\n }));\n\n return {\n availableModels,\n currentModelId: currentModel.value,\n };\n}\n\nasync function getAvailableSlashCommands(\n query: Query,\n): Promise<AvailableCommand[]> {\n const UNSUPPORTED_COMMANDS = [\n \"context\",\n \"cost\",\n \"login\",\n \"logout\",\n \"output-style:new\",\n \"release-notes\",\n \"todos\",\n ];\n const commands = await query.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\nfunction formatUriAsLink(uri: string): string {\n try {\n if (uri.startsWith(\"file://\")) {\n const path = uri.slice(7); // Remove \"file://\"\n const name = path.split(\"/\").pop() || path;\n return `[@${name}](${uri})`;\n } else 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\nexport function promptToClaude(prompt: PromptRequest): SDKUserMessage {\n const content: any[] = [];\n const context: any[] = [];\n\n for (const chunk of prompt.prompt) {\n switch (chunk.type) {\n case \"text\": {\n let text = chunk.text;\n // change /mcp:server:command args -> /server:command (MCP) args\n const mcpMatch = text.match(/^\\/mcp:([^:\\s]+):(\\S+)(\\s+.*)?$/);\n if (mcpMatch) {\n const [, server, command, args] = mcpMatch;\n text = `/${server}:${command} (MCP)${args || \"\"}`;\n }\n content.push({ type: \"text\", text });\n break;\n }\n case \"resource_link\": {\n const formattedUri = formatUriAsLink(chunk.uri);\n content.push({\n type: \"text\",\n text: formattedUri,\n });\n break;\n }\n case \"resource\": {\n if (\"text\" in chunk.resource) {\n const formattedUri = formatUriAsLink(chunk.resource.uri);\n content.push({\n type: \"text\",\n text: formattedUri,\n });\n context.push({\n type: \"text\",\n text: `\\n<context ref=\"${chunk.resource.uri}\">\\n${chunk.resource.text}\\n</context>`,\n });\n }\n // Ignore blob resources (unsupported)\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,\n },\n });\n } else if (chunk.uri?.startsWith(\"http\")) {\n content.push({\n type: \"image\",\n source: {\n type: \"url\",\n url: chunk.uri,\n },\n });\n }\n break;\n // Ignore audio and other unsupported types\n default:\n break;\n }\n }\n\n content.push(...context);\n\n return {\n type: \"user\",\n message: {\n role: \"user\",\n content: content,\n },\n session_id: prompt.sessionId,\n parent_tool_use_id: null,\n };\n}\n\n/**\n * Convert an SDKAssistantMessage (Claude) to a SessionNotification (ACP).\n * Only handles text, image, and thinking chunks for now.\n */\nexport function toAcpNotifications(\n content:\n | string\n | ContentBlockParam[]\n | BetaContentBlock[]\n | BetaRawContentBlockDelta[],\n role: \"assistant\" | \"user\",\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:\n role === \"assistant\" ? \"agent_message_chunk\" : \"user_message_chunk\",\n content: {\n type: \"text\",\n text: content,\n },\n },\n },\n ];\n }\n\n const output = [];\n // Only handle the first chunk for streaming; extend as needed for batching\n for (const chunk of content) {\n let update: SessionNotification[\"update\"] | null = null;\n switch (chunk.type) {\n case \"text\":\n case \"text_delta\":\n update = {\n sessionUpdate:\n role === \"assistant\" ? \"agent_message_chunk\" : \"user_message_chunk\",\n content: {\n type: \"text\",\n text: chunk.text,\n },\n };\n break;\n case \"image\":\n update = {\n sessionUpdate:\n role === \"assistant\" ? \"agent_message_chunk\" : \"user_message_chunk\",\n content: {\n type: \"image\",\n data: chunk.source.type === \"base64\" ? chunk.source.data : \"\",\n mimeType:\n chunk.source.type === \"base64\" ? chunk.source.media_type : \"\",\n uri: chunk.source.type === \"url\" ? chunk.source.url : undefined,\n },\n };\n break;\n case \"thinking\":\n case \"thinking_delta\":\n update = {\n sessionUpdate: \"agent_thought_chunk\",\n content: {\n type: \"text\",\n text: chunk.thinking,\n },\n };\n break;\n case \"tool_use\":\n case \"server_tool_use\":\n case \"mcp_tool_use\": {\n toolUseCache[chunk.id] = chunk;\n if (chunk.name === \"TodoWrite\") {\n // @ts-expect-error - sometimes input is empty object\n if (Array.isArray(chunk.input.todos)) {\n update = {\n sessionUpdate: \"plan\",\n entries: planEntries(chunk.input as { todos: ClaudePlanEntry[] }),\n };\n }\n } else {\n // Register hook callback to receive the structured output from the hook\n registerHookCallback(chunk.id, {\n onPostToolUseHook: async (toolUseId, _toolInput, toolResponse) => {\n const toolUse = toolUseCache[toolUseId];\n if (toolUse) {\n const update: SessionNotification[\"update\"] = {\n _meta: {\n claudeCode: {\n toolResponse,\n toolName: toolUse.name,\n },\n } satisfies ToolUpdateMeta,\n toolCallId: toolUseId,\n sessionUpdate: \"tool_call_update\",\n };\n await client.sessionUpdate({\n sessionId,\n update,\n });\n } else {\n logger.error(\n `[claude-code-acp] 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 if we can't turn it to JSON\n }\n update = {\n _meta: {\n claudeCode: {\n toolName: chunk.name,\n },\n } satisfies ToolUpdateMeta,\n toolCallId: chunk.id,\n sessionUpdate: \"tool_call\",\n rawInput,\n status: \"pending\",\n ...toolInfoFromToolUse(chunk, fileContentCache, logger),\n };\n }\n break;\n }\n\n case \"tool_result\":\n case \"tool_search_tool_result\":\n case \"web_fetch_tool_result\":\n case \"web_search_tool_result\":\n case \"code_execution_tool_result\":\n case \"bash_code_execution_tool_result\":\n case \"text_editor_code_execution_tool_result\":\n case \"mcp_tool_result\": {\n const toolUse = toolUseCache[chunk.tool_use_id];\n if (!toolUse) {\n logger.error(\n `[claude-code-acp] Got a tool result for tool use that wasn't tracked: ${chunk.tool_use_id}`,\n );\n break;\n }\n\n if (toolUse.name !== \"TodoWrite\") {\n update = {\n _meta: {\n claudeCode: {\n toolName: toolUse.name,\n },\n } satisfies ToolUpdateMeta,\n toolCallId: chunk.tool_use_id,\n sessionUpdate: \"tool_call_update\",\n status:\n \"is_error\" in chunk && chunk.is_error ? \"failed\" : \"completed\",\n ...toolUpdateFromToolResult(chunk, toolUseCache[chunk.tool_use_id]),\n };\n }\n break;\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 break;\n\n default:\n unreachable(chunk, logger);\n break;\n }\n if (update) {\n output.push({ sessionId, update });\n }\n }\n\n return output;\n}\n\nexport function 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 // No content\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 type AcpConnectionConfig = {\n sessionStore?: SessionStore;\n sessionId?: string;\n taskId?: string;\n};\n\nexport type InProcessAcpConnection = {\n agentConnection: AgentSideConnection;\n clientStreams: StreamPair;\n};\n\nexport function createAcpConnection(\n config: AcpConnectionConfig = {},\n): InProcessAcpConnection {\n const logger = new Logger({ debug: true, prefix: \"[AcpConnection]\" });\n const streams = createBidirectionalStreams();\n\n const { sessionStore } = config;\n\n // Tap both streams for automatic persistence\n // All messages (bidirectional) will be persisted as they flow through\n let agentWritable = streams.agent.writable;\n let clientWritable = streams.client.writable;\n\n if (config.sessionId && sessionStore) {\n // Register session for persistence BEFORE tapping streams\n // This ensures all messages from the start get persisted\n if (!sessionStore.isRegistered(config.sessionId)) {\n sessionStore.register(config.sessionId, {\n taskId: config.taskId ?? config.sessionId,\n runId: config.sessionId,\n logUrl: \"\", // Will be updated when we get the real logUrl\n });\n }\n\n // Tap agent→client stream\n agentWritable = createTappedWritableStream(streams.agent.writable, {\n onMessage: (line) => {\n sessionStore.appendRawLine(config.sessionId!, line);\n },\n logger,\n });\n\n // Tap client→agent stream\n clientWritable = createTappedWritableStream(streams.client.writable, {\n onMessage: (line) => {\n sessionStore.appendRawLine(config.sessionId!, line);\n },\n logger,\n });\n } else {\n logger.info(\"Tapped streams NOT enabled\", {\n hasSessionId: !!config.sessionId,\n hasSessionStore: !!sessionStore,\n });\n }\n\n const agentStream = ndJsonStream(agentWritable, streams.agent.readable);\n\n const agentConnection = new AgentSideConnection(\n (client) => new ClaudeAcpAgent(client, sessionStore),\n agentStream,\n );\n\n return {\n agentConnection,\n clientStreams: {\n readable: streams.client.readable,\n writable: clientWritable,\n },\n };\n}\n","import type { LogLevel as LogLevelType, OnLogCallback } from \"../types.js\";\n\n/**\n * Simple logger utility with configurable debug mode and external log forwarding\n */\nexport enum LogLevel {\n ERROR = 0,\n WARN = 1,\n INFO = 2,\n DEBUG = 3,\n}\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 setDebug(enabled: boolean) {\n this.debugEnabled = enabled;\n }\n\n setOnLog(onLog: OnLogCallback | undefined) {\n this.onLog = 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 log(level: LogLevelType, message: string, data?: unknown, scope?: string) {\n const originalScope = this.scope;\n if (scope) {\n this.scope = scope;\n }\n this.emitLog(level, message, data);\n this.scope = originalScope;\n }\n\n /**\n * Create a child logger with additional prefix and scope\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 { Logger } from \"./logger.js\";\n\ntype MessageCallback = (line: string) => void;\n\nexport interface TappedStreamOptions {\n onMessage: MessageCallback;\n logger?: Logger;\n}\n\n/**\n * Creates a WritableStream wrapper that taps all newline-delimited messages,\n * forwarding each complete line for persistence.\n *\n * This aligns with ACP's transport model - all messages flow through\n * newline-delimited JSON-RPC streams, so we intercept at the transport layer\n * and persist everything.\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 // Decode and buffer\n buffer += decoder.decode(chunk, { stream: true });\n\n // Process complete lines (newline-delimited)\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 // Forward to underlying stream\n const writer = underlying.getWriter();\n await writer.write(chunk);\n writer.releaseLock();\n },\n async close() {\n const writer = underlying.getWriter();\n await writer.close();\n writer.releaseLock();\n },\n async abort(reason: unknown) {\n logger?.warn(\"Tapped stream aborted\", { reason });\n const writer = underlying.getWriter();\n await writer.abort(reason);\n writer.releaseLock();\n },\n });\n}\n","{\n \"name\": \"@posthog/agent\",\n \"version\": \"1.29.0\",\n \"repository\": \"https://github.com/PostHog/array\",\n \"description\": \"TypeScript agent framework wrapping Claude Agent SDK with Git-based task execution for PostHog\",\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.js\"\n }\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 \"typecheck\": \"pnpm exec tsc --noEmit\",\n \"example\": \"tsx example.ts\",\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 \"minimatch\": \"^10.0.3\",\n \"tsup\": \"^8.5.1\",\n \"tsx\": \"^4.20.6\",\n \"typescript\": \"^5.5.0\"\n },\n \"dependencies\": {\n \"@agentclientprotocol/sdk\": \"^0.5.1\",\n \"@anthropic-ai/claude-agent-sdk\": \"^0.1.55\",\n \"@anthropic-ai/sdk\": \"^0.71.0\",\n \"@modelcontextprotocol/sdk\": \"^1.23.0\",\n \"diff\": \"^8.0.2\",\n \"dotenv\": \"^17.2.3\",\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 { randomBytes } from \"node:crypto\";\nimport type {\n ClientCapabilities,\n TerminalOutputResponse,\n} from \"@agentclientprotocol/sdk\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport * as diff from \"diff\";\nimport { z } from \"zod\";\nimport { Logger } from \"@/utils/logger.js\";\nimport type { ClaudeAcpAgent } from \"./claude.js\";\nimport { extractLinesWithByteLimit, sleep, unreachable } from \"./utils.js\";\n\nexport const 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\nconst defaults = { maxFileSize: 50000, linesToRead: 2000 };\n\nconst unqualifiedToolNames = {\n read: \"Read\",\n edit: \"Edit\",\n write: \"Write\",\n bash: \"Bash\",\n killShell: \"KillShell\",\n bashOutput: \"BashOutput\",\n};\n\nconst SERVER_PREFIX = \"mcp__acp__\";\nexport const toolNames = {\n read: SERVER_PREFIX + unqualifiedToolNames.read,\n edit: SERVER_PREFIX + unqualifiedToolNames.edit,\n write: SERVER_PREFIX + unqualifiedToolNames.write,\n bash: SERVER_PREFIX + unqualifiedToolNames.bash,\n killShell: SERVER_PREFIX + unqualifiedToolNames.killShell,\n bashOutput: SERVER_PREFIX + unqualifiedToolNames.bashOutput,\n};\n\nexport const EDIT_TOOL_NAMES = [toolNames.edit, toolNames.write];\n\nexport function createMcpServer(\n agent: ClaudeAcpAgent,\n sessionId: string,\n clientCapabilities: ClientCapabilities | undefined,\n): McpServer {\n // Create MCP server\n const server = new McpServer(\n { name: \"acp\", version: \"1.0.0\" },\n { capabilities: { tools: {} } },\n );\n\n if (clientCapabilities?.fs?.readTextFile) {\n server.registerTool(\n unqualifiedToolNames.read,\n {\n title: unqualifiedToolNames.read,\n description: `Reads the content of the given file in the project.\n\nIn sessions with ${toolNames.read} always use it instead of Read as it contains the most up-to-date contents.\n\nReads a file from the local filesystem. If the User provides a path to a file assume that path is valid. It is okay to read a file that does not exist; an error will be returned.\n\nUsage:\n- The file_path parameter must be an absolute path, not a relative path\n- By default, it reads up to ${defaults.linesToRead} lines starting from the beginning of the file\n- You can optionally specify a line offset and limit (especially handy for long files), but it's recommended to read the whole file by not providing these parameters\n- Any files larger than ${defaults.maxFileSize} bytes will be truncated\n- This tool allows Claude Code to read images (eg PNG, JPG, etc). When reading an image file the contents are presented visually as Claude Code is a multimodal LLM.\n- This tool can only read files, not directories. To read a directory, use an ls command via the ${toolNames.bash} tool.\n- You have the capability to call multiple tools in a single response. It is always better to speculatively read multiple files as a batch that are potentially useful.`,\n inputSchema: {\n file_path: z\n .string()\n .describe(\"The absolute path to the file to read\"),\n offset: z\n .number()\n .optional()\n .default(1)\n .describe(\n \"The line number to start reading from. Only provide if the file is too large to read at once\",\n ),\n limit: z\n .number()\n .optional()\n .default(defaults.linesToRead)\n .describe(\n `The number of lines to read. Only provide if the file is too large to read at once.`,\n ),\n },\n annotations: {\n title: \"Read file\",\n readOnlyHint: true,\n destructiveHint: false,\n openWorldHint: false,\n idempotentHint: false,\n },\n },\n async (input) => {\n try {\n const session = agent.sessions[sessionId];\n if (!session) {\n return {\n content: [\n {\n type: \"text\",\n text: \"The user has left the building\",\n },\n ],\n };\n }\n\n const readResponse = await agent.readTextFile({\n sessionId,\n path: input.file_path,\n line: input.offset,\n limit: input.limit,\n });\n\n if (typeof readResponse?.content !== \"string\") {\n throw new Error(`No file contents for ${input.file_path}.`);\n }\n\n // Extract lines with byte limit enforcement\n const result = extractLinesWithByteLimit(\n readResponse.content,\n defaults.maxFileSize,\n );\n\n // Construct informative message about what was read\n let readInfo = \"\";\n if (input.offset > 1 || result.wasLimited) {\n readInfo = \"\\n\\n<file-read-info>\";\n\n if (result.wasLimited) {\n readInfo += `Read ${result.linesRead} lines (hit 50KB limit). `;\n } else {\n readInfo += `Read lines ${input.offset}-${result.linesRead}. `;\n }\n\n if (result.wasLimited) {\n readInfo += `Continue with offset=${result.linesRead}.`;\n }\n\n readInfo += \"</file-read-info>\";\n }\n\n return {\n content: [\n {\n type: \"text\",\n text: result.content + readInfo + SYSTEM_REMINDER,\n },\n ],\n };\n } catch (error: any) {\n return {\n content: [\n {\n type: \"text\",\n text: `Reading file failed: ${error.message}`,\n },\n ],\n };\n }\n },\n );\n }\n\n if (clientCapabilities?.fs?.writeTextFile) {\n server.registerTool(\n unqualifiedToolNames.write,\n {\n title: unqualifiedToolNames.write,\n description: `Writes a file to the local filesystem..\n\nIn sessions with ${toolNames.write} always use it instead of Write as it will\nallow the user to conveniently review changes.\n\nUsage:\n- This tool will overwrite the existing file if there is one at the provided path.\n- If this is an existing file, you MUST use the ${toolNames.read} tool first to read the file's contents. This tool will fail if you did not read the file first.\n- ALWAYS prefer editing existing files in the codebase. NEVER write new files unless explicitly required.\n- NEVER proactively create documentation files (*.md) or README files. Only create documentation files if explicitly requested by the User.\n- Only use emojis if the user explicitly requests it. Avoid writing emojis to files unless asked.`,\n inputSchema: {\n file_path: z\n .string()\n .describe(\n \"The absolute path to the file to write (must be absolute, not relative)\",\n ),\n content: z.string().describe(\"The content to write to the file\"),\n },\n annotations: {\n title: \"Write file\",\n readOnlyHint: false,\n destructiveHint: false,\n openWorldHint: false,\n idempotentHint: false,\n },\n },\n async (input) => {\n try {\n const session = agent.sessions[sessionId];\n if (!session) {\n return {\n content: [\n {\n type: \"text\",\n text: \"The user has left the building\",\n },\n ],\n };\n }\n await agent.writeTextFile({\n sessionId,\n path: input.file_path,\n content: input.content,\n });\n\n return {\n content: [],\n };\n } catch (error: any) {\n return {\n content: [\n {\n type: \"text\",\n text: `Writing file failed: ${error.message}`,\n },\n ],\n };\n }\n },\n );\n\n server.registerTool(\n unqualifiedToolNames.edit,\n {\n title: unqualifiedToolNames.edit,\n description: `Performs exact string replacements in files.\n\nIn sessions with ${toolNames.edit} always use it instead of Edit as it will\nallow the user to conveniently review changes.\n\nUsage:\n- You must use your \\`${toolNames.read}\\` tool at least once in the conversation before editing. This tool will error if you attempt an edit without reading the file.\n- When editing text from Read tool output, ensure you preserve the exact indentation (tabs/spaces) as it appears.\n- ALWAYS prefer editing existing files in the codebase. NEVER write new files unless explicitly required.\n- Only use emojis if the user explicitly requests it. Avoid adding emojis to files unless asked.\n- The edit will FAIL if \\`old_string\\` is not unique in the file. Either provide a larger string with more surrounding context to make it unique or use \\`replace_all\\` to change every instance of \\`old_string\\`.\n- Use \\`replace_all\\` for replacing and renaming strings across the file. This parameter is useful if you want to rename a variable for instance.`,\n inputSchema: {\n file_path: z\n .string()\n .describe(\"The absolute path to the file to modify\"),\n old_string: z.string().describe(\"The text to replace\"),\n new_string: z\n .string()\n .describe(\n \"The text to replace it with (must be different from old_string)\",\n ),\n replace_all: z\n .boolean()\n .default(false)\n .optional()\n .describe(\"Replace all occurences of old_string (default false)\"),\n },\n annotations: {\n title: \"Edit file\",\n readOnlyHint: false,\n destructiveHint: false,\n openWorldHint: false,\n idempotentHint: false,\n },\n },\n async (input) => {\n try {\n const session = agent.sessions[sessionId];\n if (!session) {\n return {\n content: [\n {\n type: \"text\",\n text: \"The user has left the building\",\n },\n ],\n };\n }\n\n const readResponse = await agent.readTextFile({\n sessionId,\n path: input.file_path,\n });\n\n if (typeof readResponse?.content !== \"string\") {\n throw new Error(`No file contents for ${input.file_path}.`);\n }\n\n const { newContent } = replaceAndCalculateLocation(\n readResponse.content,\n [\n {\n oldText: input.old_string,\n newText: input.new_string,\n replaceAll: input.replace_all,\n },\n ],\n );\n\n const patch = diff.createPatch(\n input.file_path,\n readResponse.content,\n newContent,\n );\n\n await agent.writeTextFile({\n sessionId,\n path: input.file_path,\n content: newContent,\n });\n\n return {\n content: [\n {\n type: \"text\",\n text: patch,\n },\n ],\n };\n } catch (error: any) {\n return {\n content: [\n {\n type: \"text\",\n text: `Editing file failed: ${error?.message ?? String(error)}`,\n },\n ],\n };\n }\n },\n );\n }\n\n if (agent.clientCapabilities?.terminal) {\n server.registerTool(\n unqualifiedToolNames.bash,\n {\n title: unqualifiedToolNames.bash,\n description: `Executes a bash command\n\nIn sessions with ${toolNames.bash} always use it instead of Bash`,\n inputSchema: {\n command: z.string().describe(\"The command to execute\"),\n timeout: z\n .number()\n .default(2 * 60 * 1000)\n .describe(\n `Optional timeout in milliseconds (max ${2 * 60 * 1000})`,\n ),\n description: z\n .string()\n .optional()\n .describe(`Clear, concise description of what this command does in 5-10 words, in active voice. Examples:\nInput: ls\nOutput: List files in current directory\n\nInput: git status\nOutput: Show working tree status\n\nInput: npm install\nOutput: Install package dependencies\n\nInput: mkdir foo\nOutput: Create directory 'foo'`),\n run_in_background: z\n .boolean()\n .default(false)\n .describe(\n `Set to true to run this command in the background. The tool returns an \\`id\\` that can be used with the \\`${toolNames.bashOutput}\\` tool to retrieve the current output, or the \\`${toolNames.killShell}\\` tool to stop it early.`,\n ),\n },\n },\n async (input, extra) => {\n const session = agent.sessions[sessionId];\n if (!session) {\n return {\n content: [\n {\n type: \"text\",\n text: \"The user has left the building\",\n },\n ],\n };\n }\n\n const toolCallId = extra._meta?.[\"claudecode/toolUseId\"];\n\n if (typeof toolCallId !== \"string\") {\n throw new Error(\"No tool call ID found\");\n }\n\n if (\n !agent.clientCapabilities?.terminal ||\n !agent.client.createTerminal\n ) {\n throw new Error(\"unreachable\");\n }\n\n const handle = await agent.client.createTerminal({\n command: input.command,\n env: [{ name: \"CLAUDECODE\", value: \"1\" }],\n sessionId,\n outputByteLimit: 32_000,\n });\n\n await agent.client.sessionUpdate({\n sessionId,\n update: {\n sessionUpdate: \"tool_call_update\",\n toolCallId,\n status: \"in_progress\",\n title: input.description,\n content: [{ type: \"terminal\", terminalId: handle.id }],\n },\n });\n\n const abortPromise = new Promise((resolve) => {\n if (extra.signal.aborted) {\n resolve(null);\n } else {\n extra.signal.addEventListener(\"abort\", () => {\n resolve(null);\n });\n }\n });\n\n const statusPromise = Promise.race([\n handle\n .waitForExit()\n .then((exitStatus) => ({ status: \"exited\" as const, exitStatus })),\n abortPromise.then(() => ({\n status: \"aborted\" as const,\n exitStatus: null,\n })),\n sleep(input.timeout).then(async () => {\n if (agent.backgroundTerminals[handle.id]?.status === \"started\") {\n await handle.kill();\n }\n return { status: \"timedOut\" as const, exitStatus: null };\n }),\n ]);\n\n if (input.run_in_background) {\n agent.backgroundTerminals[handle.id] = {\n handle,\n lastOutput: null,\n status: \"started\",\n };\n\n statusPromise.then(async ({ status, exitStatus }) => {\n const bgTerm = agent.backgroundTerminals[handle.id];\n\n if (bgTerm.status !== \"started\") {\n return;\n }\n\n const currentOutput = await handle.currentOutput();\n\n agent.backgroundTerminals[handle.id] = {\n status,\n pendingOutput: {\n ...currentOutput,\n output: stripCommonPrefix(\n bgTerm.lastOutput?.output ?? \"\",\n currentOutput.output,\n ),\n exitStatus: exitStatus ?? currentOutput.exitStatus,\n },\n };\n\n return handle.release();\n });\n\n return {\n content: [\n {\n type: \"text\",\n text: `Command started in background with id: ${handle.id}`,\n },\n ],\n };\n }\n\n await using terminal = handle;\n\n const { status } = await statusPromise;\n\n if (status === \"aborted\") {\n return {\n content: [{ type: \"text\", text: \"Tool cancelled by user\" }],\n };\n }\n\n const output = await terminal.currentOutput();\n\n return {\n content: [{ type: \"text\", text: toolCommandOutput(status, output) }],\n };\n },\n );\n\n server.registerTool(\n unqualifiedToolNames.bashOutput,\n {\n title: unqualifiedToolNames.bashOutput,\n description: `- Retrieves output from a running or completed background bash shell\n- Takes a shell_id parameter identifying the shell\n- Always returns only new output since the last check\n- Returns stdout and stderr output along with shell status\n- Use this tool when you need to monitor or check the output of a long-running shell\n\nIn sessions with ${toolNames.bashOutput} always use it instead of BashOutput.`,\n inputSchema: {\n shell_id: z\n .string()\n .describe(\n `The id of the background bash command as returned by \\`${toolNames.bash}\\``,\n ),\n },\n },\n async (input) => {\n const bgTerm = agent.backgroundTerminals[input.shell_id];\n\n if (!bgTerm) {\n throw new Error(`Unknown shell ${input.shell_id}`);\n }\n\n if (bgTerm.status === \"started\") {\n const newOutput = await bgTerm.handle.currentOutput();\n const strippedOutput = stripCommonPrefix(\n bgTerm.lastOutput?.output ?? \"\",\n newOutput.output,\n );\n bgTerm.lastOutput = newOutput;\n\n return {\n content: [\n {\n type: \"text\",\n text: toolCommandOutput(bgTerm.status, {\n ...newOutput,\n output: strippedOutput,\n }),\n },\n ],\n };\n } else {\n return {\n content: [\n {\n type: \"text\",\n text: toolCommandOutput(bgTerm.status, bgTerm.pendingOutput),\n },\n ],\n };\n }\n },\n );\n\n server.registerTool(\n unqualifiedToolNames.killShell,\n {\n title: unqualifiedToolNames.killShell,\n description: `- Kills a running background bash shell by its ID\n- Takes a shell_id parameter identifying the shell to kill\n- Returns a success or failure status\n- Use this tool when you need to terminate a long-running shell\n\nIn sessions with ${toolNames.killShell} always use it instead of KillShell.`,\n inputSchema: {\n shell_id: z\n .string()\n .describe(\n `The id of the background bash command as returned by \\`${toolNames.bash}\\``,\n ),\n },\n },\n async (input) => {\n const bgTerm = agent.backgroundTerminals[input.shell_id];\n\n if (!bgTerm) {\n throw new Error(`Unknown shell ${input.shell_id}`);\n }\n\n switch (bgTerm.status) {\n case \"started\": {\n await bgTerm.handle.kill();\n const currentOutput = await bgTerm.handle.currentOutput();\n agent.backgroundTerminals[bgTerm.handle.id] = {\n status: \"killed\",\n pendingOutput: {\n ...currentOutput,\n output: stripCommonPrefix(\n bgTerm.lastOutput?.output ?? \"\",\n currentOutput.output,\n ),\n },\n };\n await bgTerm.handle.release();\n\n return {\n content: [{ type: \"text\", text: \"Command killed successfully.\" }],\n };\n }\n case \"aborted\":\n return {\n content: [{ type: \"text\", text: \"Command aborted by user.\" }],\n };\n case \"exited\":\n return {\n content: [{ type: \"text\", text: \"Command had already exited.\" }],\n };\n case \"killed\":\n return {\n content: [{ type: \"text\", text: \"Command was already killed.\" }],\n };\n case \"timedOut\":\n return {\n content: [{ type: \"text\", text: \"Command killed by timeout.\" }],\n };\n default: {\n unreachable(bgTerm, new Logger({ prefix: \"[McpServer]\" }));\n throw new Error(\"Unexpected background terminal status\");\n }\n }\n },\n );\n }\n\n return server;\n}\n\nfunction stripCommonPrefix(a: string, b: string): string {\n let i = 0;\n while (i < a.length && i < b.length && a[i] === b[i]) {\n i++;\n }\n return b.slice(i);\n}\n\nfunction toolCommandOutput(\n status: \"started\" | \"aborted\" | \"exited\" | \"killed\" | \"timedOut\",\n output: TerminalOutputResponse,\n): string {\n const { exitStatus, output: commandOutput, truncated } = output;\n\n let toolOutput = \"\";\n\n switch (status) {\n case \"started\":\n case \"exited\": {\n if (exitStatus && (exitStatus.exitCode ?? null) === null) {\n toolOutput += `Interrupted by the user. `;\n }\n break;\n }\n case \"killed\":\n toolOutput += `Killed. `;\n break;\n case \"timedOut\":\n toolOutput += `Timed out. `;\n break;\n case \"aborted\":\n break;\n default: {\n const unreachable: never = status;\n return unreachable;\n }\n }\n\n if (exitStatus) {\n if (typeof exitStatus.exitCode === \"number\") {\n toolOutput += `Exited with code ${exitStatus.exitCode}.`;\n }\n\n if (typeof exitStatus.signal === \"string\") {\n toolOutput += `Signal \\`${exitStatus.signal}\\`. `;\n }\n\n toolOutput += \"Final output:\\n\\n\";\n } else {\n toolOutput += \"New output:\\n\\n\";\n }\n\n toolOutput += commandOutput;\n\n if (truncated) {\n toolOutput += `\\n\\nCommand output was too long, so it was truncated to ${commandOutput.length} bytes.`;\n }\n\n return toolOutput;\n}\n\n/**\n * Replace text in a file and calculate the line numbers where the edits occurred.\n *\n * @param fileContent - The full file content\n * @param edits - Array of edit operations to apply sequentially\n * @returns the new content and the line numbers where replacements occurred in the final content\n */\nexport function replaceAndCalculateLocation(\n fileContent: string,\n edits: Array<{\n oldText: string;\n newText: string;\n replaceAll?: boolean;\n }>,\n): { newContent: string; lineNumbers: number[] } {\n let currentContent = fileContent;\n\n // Use unique markers to track where replacements happen\n const markerPrefix = `__REPLACE_MARKER_${randomBytes(5).toString(\"hex\")}_`;\n let markerCounter = 0;\n const markers: string[] = [];\n\n // Apply edits sequentially, inserting markers at replacement positions\n for (const edit of edits) {\n // Skip empty oldText\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 // Replace all occurrences with marker + newText\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 // Add content before the match\n parts.push(currentContent.substring(lastIndex, index));\n\n // Add marker and replacement\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 // Add remaining content\n parts.push(currentContent.substring(lastIndex));\n currentContent = parts.join(\"\");\n } else {\n // Replace first occurrence only\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 // Find line numbers where markers appear in the content\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 // Remove all markers from the final content\n let finalContent = currentContent;\n for (const marker of markers) {\n finalContent = finalContent.replace(marker, \"\");\n }\n\n // Dedupe and sort line numbers\n const uniqueLineNumbers = [...new Set(lineNumbers)].sort();\n\n return { newContent: finalContent, lineNumbers: uniqueLineNumbers };\n}\n","// A pushable async iterable: allows you to push items and consume them with for-await.\n\nimport { readFileSync } from \"node:fs\";\nimport { platform } from \"node:os\";\nimport type { Readable, Writable } from \"node:stream\";\nimport { ReadableStream, WritableStream } from \"node:stream/web\";\nimport type { Logger } from \"@/utils/logger.js\";\n\n// Useful for bridging push-based and async-iterator-based code.\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\n// Helper to convert Node.js streams to Web Streams\nexport function nodeToWebWritable(\n nodeStream: Writable,\n): WritableStream<Uint8Array> {\n return new WritableStream<Uint8Array>({\n write(chunk) {\n return new Promise<void>((resolve, reject) => {\n nodeStream.write(Buffer.from(chunk), (err) => {\n if (err) {\n reject(err);\n } else {\n resolve();\n }\n });\n });\n },\n });\n}\n\nexport function nodeToWebReadable(\n nodeStream: Readable,\n): 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\", () => controller.close());\n nodeStream.on(\"error\", (err) => controller.error(err));\n },\n });\n}\n\nexport function unreachable(value: never, logger: Logger) {\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\nexport function sleep(time: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, time));\n}\n\ninterface ManagedSettings {\n permissions?: {\n allow?: string[];\n deny?: string[];\n };\n env?: Record<string, string>;\n}\n\n// Following the rules in https://docs.anthropic.com/en/docs/claude-code/settings#settings-files\n// This can be removed once the SDK supports it natively.\nfunction getManagedSettingsPath(): string {\n const os = platform();\n switch (os) {\n case \"darwin\":\n return \"/Library/Application Support/ClaudeCode/managed-settings.json\";\n case \"linux\": // including WSL\n return \"/etc/claude-code/managed-settings.json\";\n case \"win32\":\n return \"C:\\\\ProgramData\\\\ClaudeCode\\\\managed-settings.json\";\n default:\n return \"/etc/claude-code/managed-settings.json\";\n }\n}\n\nexport function loadManagedSettings(): ManagedSettings | null {\n try {\n return JSON.parse(\n readFileSync(getManagedSettingsPath(), \"utf8\"),\n ) as ManagedSettings;\n } catch {\n return null;\n }\n}\n\nexport function applyEnvironmentSettings(settings: ManagedSettings): void {\n if (settings.env) {\n for (const [key, value] of Object.entries(settings.env)) {\n process.env[key] = value;\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\nexport interface ExtractLinesResult {\n content: string;\n wasLimited: boolean;\n linesRead: number;\n}\n\n/**\n * Extracts lines from file content with byte limit enforcement.\n *\n * @param fullContent - The complete file content\n * @param maxContentLength - Maximum number of UTF-16 Code Units to return\n * @returns Object containing extracted content and metadata\n */\nexport function extractLinesWithByteLimit(\n fullContent: string,\n maxContentLength: number,\n): ExtractLinesResult {\n if (fullContent === \"\") {\n return {\n content: \"\",\n wasLimited: false,\n linesRead: 1,\n };\n }\n\n let linesSeen = 0;\n let index = 0;\n linesSeen = 0;\n\n let contentLength = 0;\n let wasLimited = false;\n\n while (true) {\n const nextIndex = fullContent.indexOf(\"\\n\", index);\n\n if (nextIndex < 0) {\n // Last line in file (no trailing newline)\n if (linesSeen > 0 && fullContent.length > maxContentLength) {\n wasLimited = true;\n break;\n }\n linesSeen += 1;\n contentLength = fullContent.length;\n break;\n } else {\n // Line with newline - include up to the newline\n const newContentLength = nextIndex + 1;\n if (linesSeen > 0 && newContentLength > maxContentLength) {\n wasLimited = true;\n break;\n }\n linesSeen += 1;\n contentLength = newContentLength;\n index = newContentLength;\n }\n }\n\n return {\n content: fullContent.slice(0, contentLength),\n wasLimited,\n linesRead: linesSeen,\n };\n}\n","import type {\n PlanEntry,\n ToolCallContent,\n ToolCallLocation,\n ToolKind,\n} from \"@agentclientprotocol/sdk\";\nimport type { HookCallback, HookInput } from \"@anthropic-ai/claude-agent-sdk\";\nimport type {\n ToolResultBlockParam,\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\";\nimport { Logger } from \"@/utils/logger.js\";\nimport {\n replaceAndCalculateLocation,\n SYSTEM_REMINDER,\n toolNames,\n} from \"./mcp-server.js\";\n\ninterface ToolInfo {\n title: string;\n kind: ToolKind;\n content: ToolCallContent[];\n locations?: ToolCallLocation[];\n}\n\ninterface ToolUpdate {\n title?: string;\n content?: ToolCallContent[];\n locations?: ToolCallLocation[];\n}\n\nexport function toolInfoFromToolUse(\n toolUse: any,\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;\n\n switch (name) {\n case \"Task\":\n return {\n title: input?.description ? input.description : \"Task\",\n kind: \"think\",\n content: input?.prompt\n ? [\n {\n type: \"content\",\n content: { type: \"text\", text: input.prompt },\n },\n ]\n : [],\n };\n\n case \"NotebookRead\":\n return {\n title: input?.notebook_path\n ? `Read Notebook ${input.notebook_path}`\n : \"Read Notebook\",\n kind: \"read\",\n content: [],\n locations: input?.notebook_path ? [{ path: input.notebook_path }] : [],\n };\n\n case \"NotebookEdit\":\n return {\n title: input?.notebook_path\n ? `Edit Notebook ${input.notebook_path}`\n : \"Edit Notebook\",\n kind: \"edit\",\n content: input?.new_source\n ? [\n {\n type: \"content\",\n content: { type: \"text\", text: input.new_source },\n },\n ]\n : [],\n locations: input?.notebook_path ? [{ path: input.notebook_path }] : [],\n };\n\n case \"Bash\":\n case toolNames.bash:\n return {\n title: input?.command\n ? `\\`${input.command.replaceAll(\"`\", \"\\\\`\")}\\``\n : \"Terminal\",\n kind: \"execute\",\n content: input?.description\n ? [\n {\n type: \"content\",\n content: { type: \"text\", text: input.description },\n },\n ]\n : [],\n };\n\n case \"BashOutput\":\n case toolNames.bashOutput:\n return {\n title: \"Tail Logs\",\n kind: \"execute\",\n content: [],\n };\n\n case \"KillShell\":\n case toolNames.killShell:\n return {\n title: \"Kill Process\",\n kind: \"execute\",\n content: [],\n };\n\n case toolNames.read: {\n let limit = \"\";\n if (input.limit) {\n limit =\n \" (\" +\n ((input.offset ?? 0) + 1) +\n \" - \" +\n ((input.offset ?? 0) + input.limit) +\n \")\";\n } else if (input.offset) {\n limit = ` (from line ${input.offset + 1})`;\n }\n return {\n title: `Read ${input.file_path ?? \"File\"}${limit}`,\n kind: \"read\",\n locations: input.file_path\n ? [\n {\n path: input.file_path,\n line: input.offset ?? 0,\n },\n ]\n : [],\n content: [],\n };\n }\n\n case \"Read\":\n return {\n title: \"Read File\",\n kind: \"read\",\n content: [],\n locations: input.file_path\n ? [\n {\n path: input.file_path,\n line: input.offset ?? 0,\n },\n ]\n : [],\n };\n\n case \"LS\":\n return {\n title: `List the ${input?.path ? `\\`${input.path}\\`` : \"current\"} directory's contents`,\n kind: \"search\",\n content: [],\n locations: [],\n };\n\n case toolNames.edit:\n case \"Edit\": {\n const path = input?.file_path ?? input?.file_path;\n let oldText = input.old_string ?? null;\n let newText = 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 toolNames.write: {\n let content: ToolCallContent[] = [];\n if (input?.file_path) {\n content = [\n {\n type: \"diff\",\n path: input.file_path,\n oldText: null,\n newText: input.content,\n },\n ];\n } else if (input?.content) {\n content = [\n {\n type: \"content\",\n content: { type: \"text\", text: input.content },\n },\n ];\n }\n return {\n title: input?.file_path ? `Write ${input.file_path}` : \"Write\",\n kind: \"edit\",\n content,\n locations: input?.file_path ? [{ path: input.file_path }] : [],\n };\n }\n\n case \"Write\":\n return {\n title: input?.file_path ? `Write ${input.file_path}` : \"Write\",\n kind: \"edit\",\n content: input?.file_path\n ? [\n {\n type: \"diff\",\n path: input.file_path,\n oldText: null,\n newText: input.content,\n },\n ]\n : [],\n locations: input?.file_path ? [{ path: input.file_path }] : [],\n };\n\n case \"Glob\": {\n let label = \"Find\";\n if (input.path) {\n label += ` \\`${input.path}\\``;\n }\n if (input.pattern) {\n label += ` \\`${input.pattern}\\``;\n }\n return {\n title: label,\n kind: \"search\",\n content: [],\n locations: input.path ? [{ path: input.path }] : [],\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=\"${input.glob}\"`;\n }\n\n if (input.type) {\n label += ` --type=${input.type}`;\n }\n\n if (input.multiline) {\n label += \" -P\";\n }\n\n label += ` \"${input.pattern}\"`;\n\n if (input.path) {\n label += ` ${input.path}`;\n }\n\n return {\n title: label,\n kind: \"search\",\n content: [],\n };\n }\n\n case \"WebFetch\":\n return {\n title: input?.url ? `Fetch ${input.url}` : \"Fetch\",\n kind: \"fetch\",\n content: input?.prompt\n ? [\n {\n type: \"content\",\n content: { type: \"text\", text: input.prompt },\n },\n ]\n : [],\n };\n\n case \"WebSearch\": {\n let label = `\"${input.query}\"`;\n\n if (input.allowed_domains && input.allowed_domains.length > 0) {\n label += ` (allowed: ${input.allowed_domains.join(\", \")})`;\n }\n\n if (input.blocked_domains && input.blocked_domains.length > 0) {\n label += ` (blocked: ${input.blocked_domains.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: any) => 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 ? [{ type: \"content\", content: { type: \"text\", text: input.plan } }]\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: [\n {\n type: \"content\",\n content: {\n type: \"text\",\n text: `\\`\\`\\`json\\n${output}\\`\\`\\``,\n },\n },\n ],\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: any | undefined,\n): ToolUpdate {\n switch (toolUse?.name) {\n case \"Read\":\n case toolNames.read:\n if (Array.isArray(toolResult.content) && toolResult.content.length > 0) {\n return {\n content: toolResult.content.map((content: any) => ({\n type: \"content\",\n content:\n content.type === \"text\"\n ? {\n type: \"text\",\n text: markdownEscape(\n content.text.replace(SYSTEM_REMINDER, \"\"),\n ),\n }\n : content,\n })),\n };\n } else if (\n typeof toolResult.content === \"string\" &&\n toolResult.content.length > 0\n ) {\n return {\n content: [\n {\n type: \"content\",\n content: {\n type: \"text\",\n text: markdownEscape(\n toolResult.content.replace(SYSTEM_REMINDER, \"\"),\n ),\n },\n },\n ],\n };\n }\n return {};\n\n case toolNames.bash:\n case \"edit\":\n case \"Edit\":\n case toolNames.edit:\n case toolNames.write:\n case \"Write\": {\n if (\n \"is_error\" in toolResult &&\n toolResult.is_error &&\n toolResult.content &&\n toolResult.content.length > 0\n ) {\n // Only return errors\n return toAcpContentUpdate(toolResult.content, true);\n }\n return {};\n }\n\n case \"ExitPlanMode\": {\n return { title: \"Exited Plan Mode\" };\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: any,\n isError: boolean = false,\n): { content?: ToolCallContent[] } {\n if (Array.isArray(content) && content.length > 0) {\n return {\n content: content.map((content: any) => ({\n type: \"content\",\n content:\n isError && content.type === \"text\"\n ? {\n ...content,\n text: `\\`\\`\\`\\n${content.text}\\n\\`\\`\\``,\n }\n : content,\n })),\n };\n } else if (typeof content === \"string\" && content.length > 0) {\n return {\n content: [\n {\n type: \"content\",\n content: {\n type: \"text\",\n text: isError ? `\\`\\`\\`\\n${content}\\n\\`\\`\\`` : content,\n },\n },\n ],\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\nexport function 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\n/* A global variable to store callbacks that should be executed when receiving hooks from Claude Code */\nconst toolUseCallbacks: {\n [toolUseId: string]: {\n onPostToolUseHook?: (\n toolUseID: string,\n toolInput: unknown,\n toolResponse: unknown,\n ) => Promise<void>;\n };\n} = {};\n\n/* Setup callbacks that will be called when receiving hooks from Claude Code */\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\n/* A callback for Claude Code that is called when receiving a PostToolUse hook */\nexport const createPostToolUseHook =\n (\n logger: Logger = new Logger({ prefix: \"[createPostToolUseHook]\" }),\n ): HookCallback =>\n async (\n input: HookInput,\n toolUseID: string | undefined,\n ): Promise<{ continue: boolean }> => {\n if (input.hook_event_name === \"PostToolUse\" && toolUseID) {\n const onPostToolUseHook = toolUseCallbacks[toolUseID]?.onPostToolUseHook;\n if (onPostToolUseHook) {\n await onPostToolUseHook(\n toolUseID,\n input.tool_input,\n input.tool_response,\n );\n delete toolUseCallbacks[toolUseID]; // Cleanup after execution\n } else {\n logger.error(\n `No onPostToolUseHook found for tool use ID: ${toolUseID}`,\n );\n delete toolUseCallbacks[toolUseID];\n }\n }\n return { continue: true };\n };\n","import {\n type Client,\n ClientSideConnection,\n type ContentBlock,\n ndJsonStream,\n PROTOCOL_VERSION,\n} from \"@agentclientprotocol/sdk\";\nimport { POSTHOG_NOTIFICATIONS } from \"./acp-extensions.js\";\nimport {\n createAcpConnection,\n type InProcessAcpConnection,\n} from \"./adapters/claude/claude.js\";\nimport { PostHogFileManager } from \"./file-manager.js\";\nimport { GitManager } from \"./git-manager.js\";\nimport { PostHogAPIClient } from \"./posthog-api.js\";\nimport { PromptBuilder } from \"./prompt-builder.js\";\nimport { SessionStore } from \"./session-store.js\";\nimport { TaskManager } from \"./task-manager.js\";\nimport { TemplateManager } from \"./template-manager.js\";\nimport type {\n AgentConfig,\n CanUseTool,\n StoredNotification,\n Task,\n TaskExecutionOptions,\n} from \"./types.js\";\nimport { Logger } from \"./utils/logger.js\";\nimport { TASK_WORKFLOW } from \"./workflow/config.js\";\nimport type { SendNotification, WorkflowRuntime } from \"./workflow/types.js\";\n\nexport class Agent {\n private workingDirectory: string;\n private taskManager: TaskManager;\n private posthogAPI?: PostHogAPIClient;\n private fileManager: PostHogFileManager;\n private gitManager: GitManager;\n private templateManager: TemplateManager;\n private logger: Logger;\n private acpConnection?: InProcessAcpConnection;\n private promptBuilder: PromptBuilder;\n private mcpServers?: Record<string, any>;\n private canUseTool?: CanUseTool;\n private currentRunId?: string;\n private sessionStore?: SessionStore;\n public debug: boolean;\n\n constructor(config: AgentConfig) {\n this.workingDirectory = config.workingDirectory || process.cwd();\n this.canUseTool = config.canUseTool;\n this.debug = config.debug || false;\n\n // Build default PostHog MCP server configuration\n const posthogMcpUrl =\n config.posthogMcpUrl ||\n process.env.POSTHOG_MCP_URL ||\n \"https://mcp.posthog.com/mcp\";\n\n // Add auth if API key provided\n const headers: Record<string, string> = {};\n if (config.posthogApiKey) {\n headers.Authorization = `Bearer ${config.posthogApiKey}`;\n }\n\n const defaultMcpServers = {\n posthog: {\n type: \"http\" as const,\n url: posthogMcpUrl,\n ...(Object.keys(headers).length > 0 ? { headers } : {}),\n },\n };\n\n // Merge default PostHog MCP with user-provided servers (user config takes precedence)\n this.mcpServers = {\n ...defaultMcpServers,\n ...config.mcpServers,\n };\n this.logger = new Logger({\n debug: this.debug,\n prefix: \"[PostHog Agent]\",\n onLog: config.onLog,\n });\n this.taskManager = new TaskManager();\n\n this.fileManager = new PostHogFileManager(\n this.workingDirectory,\n this.logger.child(\"FileManager\"),\n );\n this.gitManager = new GitManager({\n repositoryPath: this.workingDirectory,\n logger: this.logger.child(\"GitManager\"),\n });\n this.templateManager = new TemplateManager();\n\n if (\n config.posthogApiUrl &&\n config.posthogApiKey &&\n config.posthogProjectId\n ) {\n this.posthogAPI = new PostHogAPIClient({\n apiUrl: config.posthogApiUrl,\n apiKey: config.posthogApiKey,\n projectId: config.posthogProjectId,\n });\n\n // Create SessionStore from the API client for ACP connection\n this.sessionStore = new SessionStore(\n this.posthogAPI,\n this.logger.child(\"SessionStore\"),\n );\n }\n\n this.promptBuilder = new PromptBuilder({\n getTaskFiles: (taskId: string) => this.getTaskFiles(taskId),\n generatePlanTemplate: (vars) => this.templateManager.generatePlan(vars),\n posthogClient: this.posthogAPI,\n logger: this.logger.child(\"PromptBuilder\"),\n });\n }\n\n /**\n * Enable or disable debug logging\n */\n setDebug(enabled: boolean) {\n this.debug = enabled;\n this.logger.setDebug(enabled);\n }\n\n /**\n * Configure LLM gateway environment variables for Claude Code CLI\n */\n private async _configureLlmGateway(): Promise<void> {\n if (!this.posthogAPI) {\n return;\n }\n\n try {\n const gatewayUrl = this.posthogAPI.getLlmGatewayUrl();\n const apiKey = this.posthogAPI.getApiKey();\n process.env.ANTHROPIC_BASE_URL = gatewayUrl;\n process.env.ANTHROPIC_AUTH_TOKEN = apiKey;\n this.ensureOpenAIGatewayEnv(gatewayUrl, apiKey);\n } catch (error) {\n this.logger.error(\"Failed to configure LLM gateway\", error);\n throw error;\n }\n }\n\n private getOrCreateConnection(): InProcessAcpConnection {\n if (!this.acpConnection) {\n this.acpConnection = createAcpConnection({\n sessionStore: this.sessionStore,\n });\n }\n return this.acpConnection;\n }\n\n // Adaptive task execution orchestrated via workflow steps\n async runTask(\n taskId: string,\n taskRunId: string,\n options: import(\"./types.js\").TaskExecutionOptions = {},\n ): Promise<void> {\n // await this._configureLlmGateway();\n\n const task = await this.fetchTask(taskId);\n const cwd = options.repositoryPath || this.workingDirectory;\n const isCloudMode = options.isCloudMode ?? false;\n const taskSlug = (task as any).slug || task.id;\n\n // Use taskRunId as sessionId - they are the same identifier\n this.currentRunId = taskRunId;\n\n this.logger.info(\"Starting adaptive task execution\", {\n taskId: task.id,\n taskSlug,\n taskRunId,\n isCloudMode,\n });\n\n const connection = this.getOrCreateConnection();\n\n // Create sendNotification using ACP connection's extNotification\n const sendNotification: SendNotification = async (method, params) => {\n this.logger.debug(`Notification: ${method}`, params);\n await connection.agentConnection.extNotification?.(method, params);\n };\n\n await sendNotification(POSTHOG_NOTIFICATIONS.RUN_STARTED, {\n sessionId: taskRunId,\n runId: taskRunId,\n });\n\n await this.prepareTaskBranch(taskSlug, isCloudMode, sendNotification);\n\n let taskError: Error | undefined;\n try {\n const workflowContext: WorkflowRuntime = {\n task,\n taskSlug,\n runId: taskRunId,\n cwd,\n isCloudMode,\n options,\n logger: this.logger,\n fileManager: this.fileManager,\n gitManager: this.gitManager,\n promptBuilder: this.promptBuilder,\n connection: connection.agentConnection,\n sessionId: taskRunId,\n sendNotification,\n mcpServers: this.mcpServers,\n posthogAPI: this.posthogAPI,\n stepResults: {},\n };\n\n for (const step of TASK_WORKFLOW) {\n const result = await step.run({ step, context: workflowContext });\n if (result.halt) {\n return;\n }\n }\n\n const shouldCreatePR = options.createPR ?? isCloudMode;\n if (shouldCreatePR) {\n await this.ensurePullRequest(\n task,\n workflowContext.stepResults,\n sendNotification,\n );\n }\n\n this.logger.info(\"Task execution complete\", { taskId: task.id });\n await sendNotification(POSTHOG_NOTIFICATIONS.TASK_COMPLETE, {\n sessionId: taskRunId,\n taskId: task.id,\n });\n } catch (error) {\n taskError = error instanceof Error ? error : new Error(String(error));\n this.logger.error(\"Task execution failed\", {\n taskId: task.id,\n error: taskError.message,\n });\n await sendNotification(POSTHOG_NOTIFICATIONS.ERROR, {\n sessionId: taskRunId,\n message: taskError.message,\n });\n throw taskError;\n }\n }\n\n /**\n * Creates an in-process ACP connection for client communication.\n * Sets up git branch for the task, configures LLM gateway.\n * The client handles all prompting/querying via the returned streams.\n *\n * @returns InProcessAcpConnection with clientStreams for the client to use\n */\n async runTaskV2(\n taskId: string,\n taskRunId: string,\n options: import(\"./types.js\").TaskExecutionOptions = {},\n ): Promise<InProcessAcpConnection> {\n await this._configureLlmGateway();\n\n const task = await this.fetchTask(taskId);\n const taskSlug = (task as any).slug || task.id;\n const isCloudMode = options.isCloudMode ?? false;\n const _cwd = options.repositoryPath || this.workingDirectory;\n\n // Use taskRunId as sessionId - they are the same identifier\n this.currentRunId = taskRunId;\n\n this.acpConnection = createAcpConnection({\n sessionStore: this.sessionStore,\n sessionId: taskRunId,\n taskId: task.id,\n });\n\n const sendNotification: SendNotification = async (method, params) => {\n this.logger.debug(`Notification: ${method}`, params);\n await this.acpConnection?.agentConnection.extNotification?.(\n method,\n params,\n );\n };\n\n await sendNotification(POSTHOG_NOTIFICATIONS.RUN_STARTED, {\n sessionId: taskRunId,\n runId: taskRunId,\n });\n\n if (!options.skipGitBranch) {\n try {\n await this.prepareTaskBranch(taskSlug, isCloudMode, sendNotification);\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n this.logger.error(\"Failed to prepare task branch\", {\n error: errorMessage,\n });\n await sendNotification(POSTHOG_NOTIFICATIONS.ERROR, {\n sessionId: taskRunId,\n message: errorMessage,\n });\n throw error;\n }\n }\n\n return this.acpConnection;\n }\n\n // PostHog task operations\n async fetchTask(taskId: string): Promise<Task> {\n if (!this.posthogAPI) {\n const error = new Error(\n \"PostHog API not configured. Provide posthogApiUrl and posthogApiKey in constructor.\",\n );\n this.logger.error(\"PostHog API not configured\", error);\n throw error;\n }\n return this.posthogAPI.fetchTask(taskId);\n }\n\n getPostHogClient(): PostHogAPIClient | undefined {\n return this.posthogAPI;\n }\n\n /**\n * Send a notification to a cloud task run's S3 log.\n * The cloud runner will pick up new notifications via interrupt polling.\n */\n async sendNotification(\n taskId: string,\n runId: string,\n notification: StoredNotification,\n ): Promise<void> {\n if (!this.posthogAPI) {\n throw new Error(\n \"PostHog API not configured. Cannot send notification to cloud task.\",\n );\n }\n\n await this.posthogAPI.appendTaskRunLog(taskId, runId, [notification]);\n this.logger.debug(\"Notification sent to cloud task\", {\n taskId,\n runId,\n method: notification.notification.method,\n });\n }\n\n async getTaskFiles(taskId: string): Promise<any[]> {\n this.logger.debug(\"Getting task files\", { taskId });\n const files = await this.fileManager.getTaskFiles(taskId);\n this.logger.debug(\"Found task files\", { taskId, fileCount: files.length });\n return files;\n }\n\n async createPullRequest(\n taskId: string,\n branchName: string,\n taskTitle: string,\n taskDescription: string,\n customBody?: string,\n ): Promise<string> {\n this.logger.info(\"Creating pull request\", {\n taskId,\n branchName,\n taskTitle,\n });\n\n const defaultBody = `## Task Details\n**Task ID**: ${taskId}\n**Description**: ${taskDescription}\n\n## Changes\nThis PR implements the changes described in the task.\n\nGenerated by PostHog Agent`;\n const prBody = customBody || defaultBody;\n\n const prUrl = await this.gitManager.createPullRequest(\n branchName,\n taskTitle,\n prBody,\n );\n\n this.logger.info(\"Pull request created\", { taskId, prUrl });\n return prUrl;\n }\n\n async attachPullRequestToTask(\n taskId: string,\n prUrl: string,\n branchName?: string,\n ): Promise<void> {\n this.logger.info(\"Attaching PR to task run\", { taskId, prUrl, branchName });\n\n if (!this.posthogAPI || !this.currentRunId) {\n const error = new Error(\n \"PostHog API not configured or no active run. Cannot attach PR to task.\",\n );\n this.logger.error(\"PostHog API not configured\", error);\n throw error;\n }\n\n const updates: any = {\n output: { pr_url: prUrl },\n };\n if (branchName) {\n updates.branch = branchName;\n }\n\n await this.posthogAPI.updateTaskRun(taskId, this.currentRunId, updates);\n this.logger.debug(\"PR attached to task run\", {\n taskId,\n runId: this.currentRunId,\n prUrl,\n });\n }\n\n async updateTaskBranch(taskId: string, branchName: string): Promise<void> {\n this.logger.info(\"Updating task run branch\", { taskId, branchName });\n\n if (!this.posthogAPI || !this.currentRunId) {\n const error = new Error(\n \"PostHog API not configured or no active run. Cannot update branch.\",\n );\n this.logger.error(\"PostHog API not configured\", error);\n throw error;\n }\n\n await this.posthogAPI.updateTaskRun(taskId, this.currentRunId, {\n branch: branchName,\n });\n this.logger.debug(\"Task run branch updated\", {\n taskId,\n runId: this.currentRunId,\n branchName,\n });\n }\n\n // Execution management\n cancelTask(taskId: string): void {\n // Find the execution for this task and cancel it\n for (const [executionId, execution] of this.taskManager.executionStates) {\n if (execution.taskId === taskId && execution.status === \"running\") {\n this.taskManager.cancelExecution(executionId);\n break;\n }\n }\n }\n\n getTaskExecutionStatus(taskId: string): string | null {\n // Find the execution for this task\n for (const execution of this.taskManager.executionStates.values()) {\n if (execution.taskId === taskId) {\n return execution.status;\n }\n }\n return null;\n }\n\n private async prepareTaskBranch(\n taskSlug: string,\n isCloudMode: boolean,\n sendNotification: SendNotification,\n ): Promise<void> {\n if (await this.gitManager.hasChanges()) {\n throw new Error(\n \"Cannot start task with uncommitted changes. Please commit or stash your changes first.\",\n );\n }\n\n // If we're running in a worktree, we're already on the correct branch\n // (the worktree was created with its own branch). Skip branch creation.\n const isWorktree = await this.gitManager.isWorktree();\n if (isWorktree) {\n const currentBranch = await this.gitManager.getCurrentBranch();\n this.logger.info(\"Running in worktree, using existing branch\", {\n branch: currentBranch,\n });\n await sendNotification(POSTHOG_NOTIFICATIONS.BRANCH_CREATED, {\n branch: currentBranch,\n });\n return;\n }\n\n await this.gitManager.resetToDefaultBranchIfNeeded();\n\n const existingBranch = await this.gitManager.getTaskBranch(taskSlug);\n if (!existingBranch) {\n const branchName = await this.gitManager.createTaskBranch(taskSlug);\n await sendNotification(POSTHOG_NOTIFICATIONS.BRANCH_CREATED, {\n branch: branchName,\n });\n\n await this.gitManager.addAllPostHogFiles();\n\n // Only commit if there are changes or we're in cloud mode\n if (isCloudMode) {\n await this.gitManager.commitAndPush(`Initialize task ${taskSlug}`, {\n allowEmpty: true,\n });\n } else {\n // Check if there are any changes before committing\n const hasChanges = await this.gitManager.hasStagedChanges();\n if (hasChanges) {\n await this.gitManager.commitChanges(`Initialize task ${taskSlug}`);\n }\n }\n } else {\n this.logger.info(\"Switching to existing task branch\", {\n branch: existingBranch,\n });\n await this.gitManager.switchToBranch(existingBranch);\n }\n }\n\n private ensureOpenAIGatewayEnv(gatewayUrl?: string, token?: string): void {\n const resolvedGatewayUrl = gatewayUrl || process.env.ANTHROPIC_BASE_URL;\n const resolvedToken = token || process.env.ANTHROPIC_AUTH_TOKEN;\n\n if (resolvedGatewayUrl) {\n process.env.OPENAI_BASE_URL = resolvedGatewayUrl;\n }\n\n if (resolvedToken) {\n process.env.OPENAI_API_KEY = resolvedToken;\n }\n }\n\n async runTaskCloud(\n taskId: string,\n taskRunId: string,\n options: TaskExecutionOptions = {},\n ): Promise<void> {\n await this._configureLlmGateway();\n\n const task = await this.fetchTask(taskId);\n const cwd = options.repositoryPath || this.workingDirectory;\n const taskSlug = (task as any).slug || task.id;\n\n this.currentRunId = taskRunId;\n\n this.logger.info(\"Starting cloud task execution\", {\n taskId: task.id,\n taskSlug,\n taskRunId,\n cwd,\n });\n\n if (!this.sessionStore) {\n throw new Error(\n \"SessionStore required for cloud mode. Ensure PostHog API credentials are configured.\",\n );\n }\n\n // Start session in SessionStore (updates task run status to in_progress)\n const taskRun = await this.sessionStore.start(taskRunId, taskId, taskRunId);\n this.logger.debug(\"Session started\", {\n taskRunId,\n logUrl: taskRun?.log_url,\n });\n\n // Create internal ACP connection with S3 persistence\n const acpConnection = createAcpConnection({\n sessionStore: this.sessionStore,\n sessionId: taskRunId,\n taskId: task.id,\n });\n\n // Create client connection using the client-side streams\n const clientStream = ndJsonStream(\n acpConnection.clientStreams.writable as WritableStream<Uint8Array>,\n acpConnection.clientStreams.readable as ReadableStream<Uint8Array>,\n );\n\n // Create auto-approving client for headless cloud mode\n const cloudClient: Client = {\n async requestPermission(params) {\n const allowOption = params.options.find(\n (o) => o.kind === \"allow_once\" || o.kind === \"allow_always\",\n );\n return {\n outcome: {\n outcome: \"selected\",\n optionId: allowOption?.optionId ?? params.options[0].optionId,\n },\n };\n },\n async sessionUpdate(_params) {\n // Notifications are already being persisted to S3 via tapped streams\n },\n };\n\n const clientConnection = new ClientSideConnection(\n (_agent) => cloudClient,\n clientStream,\n );\n\n try {\n // Initialize the connection\n await clientConnection.initialize({\n protocolVersion: PROTOCOL_VERSION,\n clientCapabilities: {},\n });\n\n // Create new session\n await clientConnection.newSession({\n cwd,\n mcpServers: [],\n _meta: { sessionId: taskRunId },\n });\n\n // Prepare git branch if not skipped\n if (!options.skipGitBranch) {\n const sendNotification: SendNotification = async (method, params) => {\n this.logger.debug(`Notification: ${method}`, params);\n await acpConnection.agentConnection.extNotification?.(method, params);\n };\n await this.prepareTaskBranch(taskSlug, true, sendNotification);\n }\n\n // Build initial prompt from task description\n const initialPrompt: ContentBlock[] = [\n {\n type: \"text\",\n text: `# Task: ${task.title}\\n\\n${task.description}`,\n },\n ];\n\n // Track the last known log entry count for interrupt polling\n let lastKnownEntryCount = 0;\n let isPolling = true;\n\n // Start interrupt polling in background\n const pollForInterrupts = async () => {\n while (isPolling) {\n await new Promise((resolve) => setTimeout(resolve, 2000)); // Poll every 2 seconds\n if (!isPolling) break;\n\n try {\n const newEntries = await this.sessionStore?.pollForNewEntries(\n taskRunId,\n lastKnownEntryCount,\n );\n\n for (const entry of newEntries ?? []) {\n lastKnownEntryCount++;\n // Look for user_message notifications\n if (\n entry.notification?.method === \"sessionUpdate\" &&\n (entry.notification?.params as any)?.sessionUpdate ===\n \"user_message\"\n ) {\n const content = (entry.notification?.params as any)?.content;\n if (content) {\n this.logger.info(\"Processing user interrupt\", { content });\n // Send as new prompt - will be processed after current prompt completes\n await clientConnection.prompt({\n sessionId: taskRunId,\n prompt: Array.isArray(content) ? content : [content],\n });\n }\n }\n }\n } catch (err) {\n this.logger.warn(\"Interrupt polling error\", { error: err });\n }\n }\n };\n\n // Start polling in background (don't await)\n const pollingPromise = pollForInterrupts();\n\n // Send initial prompt and wait for completion\n this.logger.info(\"Sending initial prompt to agent\");\n const result = await clientConnection.prompt({\n sessionId: taskRunId,\n prompt: initialPrompt,\n });\n\n // Stop interrupt polling\n isPolling = false;\n await pollingPromise;\n\n this.logger.info(\"Task execution complete\", {\n taskId: task.id,\n stopReason: result.stopReason,\n });\n\n const branchName = await this.gitManager.getCurrentBranch();\n const hasChanges = await this.gitManager.hasChanges();\n const shouldCreatePR = options.createPR ?? false;\n\n if (hasChanges) {\n this.logger.info(\"Committing uncommitted changes\", { taskId: task.id });\n await this.gitManager.commitImplementation(\n task.id,\n task.title,\n task.description ?? undefined,\n );\n }\n\n const defaultBranch = await this.gitManager.getDefaultBranch();\n if (branchName !== defaultBranch) {\n this.logger.info(\"Pushing branch\", { branchName, taskId: task.id });\n await this.gitManager.pushBranch(branchName);\n\n if (shouldCreatePR) {\n this.logger.info(\"Creating PR\", { branchName, taskId: task.id });\n\n const prUrl = await this.createPullRequest(\n task.id,\n branchName,\n task.title,\n task.description ?? \"\",\n );\n\n this.logger.info(\"PR created\", { prUrl, taskId: task.id });\n\n try {\n await this.attachPullRequestToTask(task.id, prUrl, branchName);\n } catch (err) {\n this.logger.warn(\"Could not attach PR to task\", {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n }\n\n await this.sessionStore.complete(taskRunId);\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n this.logger.error(\"Cloud task execution failed\", {\n taskId: task.id,\n error: errorMessage,\n });\n await this.sessionStore.fail(taskRunId, errorMessage);\n throw error;\n }\n }\n\n private async ensurePullRequest(\n task: Task,\n stepResults: Record<string, any>,\n sendNotification: SendNotification,\n ): Promise<void> {\n const latestRun = task.latest_run;\n const existingPr =\n latestRun?.output && typeof latestRun.output === \"object\"\n ? (latestRun.output as any).pr_url\n : null;\n\n if (existingPr) {\n this.logger.info(\"PR already exists, skipping creation\", {\n taskId: task.id,\n prUrl: existingPr,\n });\n return;\n }\n\n const buildResult = stepResults.build;\n if (!buildResult?.commitCreated) {\n this.logger.warn(\n \"Build step did not produce a commit; skipping PR creation\",\n { taskId: task.id },\n );\n return;\n }\n\n const branchName = await this.gitManager.getCurrentBranch();\n const finalizeResult = stepResults.finalize;\n const prBody = finalizeResult?.prBody;\n\n const prUrl = await this.createPullRequest(\n task.id,\n branchName,\n task.title,\n task.description ?? \"\",\n prBody,\n );\n\n await sendNotification(POSTHOG_NOTIFICATIONS.PR_CREATED, { prUrl });\n\n try {\n await this.attachPullRequestToTask(task.id, prUrl, branchName);\n this.logger.info(\"PR attached to task successfully\", {\n taskId: task.id,\n prUrl,\n });\n } catch (error) {\n this.logger.warn(\"Could not attach PR to task\", {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n}\n\nexport type {\n AgentConfig,\n ExecutionResult,\n SupportingFile,\n Task,\n} from \"./types.js\";\nexport { PermissionMode } from \"./types.js\";\n","import { promises as fs } from \"node:fs\";\nimport { extname, join } from \"node:path\";\nimport z from \"zod\";\nimport type { ResearchEvaluation, SupportingFile } from \"./types.js\";\nimport { Logger } from \"./utils/logger.js\";\n\nexport interface TaskFile {\n name: string;\n content: string;\n type: \"plan\" | \"context\" | \"reference\" | \"output\" | \"artifact\";\n}\n\nexport interface LocalArtifact {\n name: string;\n content: string;\n type: TaskFile[\"type\"];\n contentType: string;\n size: number;\n}\n\nexport class PostHogFileManager {\n private repositoryPath: string;\n private logger: Logger;\n\n constructor(repositoryPath: string, logger?: Logger) {\n this.repositoryPath = repositoryPath;\n this.logger =\n logger || new Logger({ debug: false, prefix: \"[FileManager]\" });\n }\n\n private getTaskDirectory(taskId: string): string {\n return join(this.repositoryPath, \".posthog\", taskId);\n }\n\n private getTaskFilePath(taskId: string, fileName: string): string {\n return join(this.getTaskDirectory(taskId), fileName);\n }\n\n async ensureTaskDirectory(taskId: string): Promise<void> {\n const taskDir = this.getTaskDirectory(taskId);\n try {\n await fs.access(taskDir);\n } catch {\n await fs.mkdir(taskDir, { recursive: true });\n }\n }\n\n async writeTaskFile(taskId: string, file: TaskFile): Promise<void> {\n await this.ensureTaskDirectory(taskId);\n const filePath = this.getTaskFilePath(taskId, file.name);\n\n this.logger.debug(\"Writing task file\", {\n filePath,\n contentLength: file.content.length,\n contentType: typeof file.content,\n });\n\n await fs.writeFile(filePath, file.content, \"utf8\");\n\n this.logger.debug(\"File written successfully\", { filePath });\n }\n\n async readTaskFile(taskId: string, fileName: string): Promise<string | null> {\n try {\n const filePath = this.getTaskFilePath(taskId, fileName);\n return await fs.readFile(filePath, \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n }\n\n async listTaskFiles(taskId: string): Promise<string[]> {\n try {\n const taskDir = this.getTaskDirectory(taskId);\n const files = await fs.readdir(taskDir);\n return files.filter((file) => !file.startsWith(\".\"));\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return [];\n }\n throw error;\n }\n }\n\n async deleteTaskFile(taskId: string, fileName: string): Promise<void> {\n try {\n const filePath = this.getTaskFilePath(taskId, fileName);\n await fs.unlink(filePath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n }\n\n async taskDirectoryExists(taskId: string): Promise<boolean> {\n try {\n const taskDir = this.getTaskDirectory(taskId);\n await fs.access(taskDir);\n return true;\n } catch {\n return false;\n }\n }\n\n async cleanupTaskDirectory(taskId: string): Promise<void> {\n try {\n const taskDir = this.getTaskDirectory(taskId);\n await fs.rm(taskDir, { recursive: true, force: true });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n }\n\n // Convenience methods for common file types\n async writePlan(taskId: string, plan: string): Promise<void> {\n this.logger.debug(\"Writing plan\", {\n taskId,\n planLength: plan.length,\n contentPreview: plan.substring(0, 200),\n });\n\n await this.writeTaskFile(taskId, {\n name: \"plan.md\",\n content: plan,\n type: \"plan\",\n });\n\n this.logger.info(\"Plan file written\", { taskId });\n }\n\n async readPlan(taskId: string): Promise<string | null> {\n return await this.readTaskFile(taskId, \"plan.md\");\n }\n\n async writeContext(taskId: string, context: string): Promise<void> {\n await this.writeTaskFile(taskId, {\n name: \"context.md\",\n content: context,\n type: \"context\",\n });\n }\n\n async readContext(taskId: string): Promise<string | null> {\n return await this.readTaskFile(taskId, \"context.md\");\n }\n\n async writeRequirements(taskId: string, requirements: string): Promise<void> {\n await this.writeTaskFile(taskId, {\n name: \"requirements.md\",\n content: requirements,\n type: \"reference\",\n });\n }\n\n async readRequirements(taskId: string): Promise<string | null> {\n return await this.readTaskFile(taskId, \"requirements.md\");\n }\n\n async writeResearch(taskId: string, data: ResearchEvaluation): Promise<void> {\n this.logger.debug(\"Writing research\", {\n taskId,\n score: data.actionabilityScore,\n hasQuestions: !!data.questions,\n questionCount: data.questions?.length ?? 0,\n answered: data.answered ?? false,\n });\n\n await this.writeTaskFile(taskId, {\n name: \"research.json\",\n content: JSON.stringify(data, null, 2),\n type: \"artifact\",\n });\n\n this.logger.info(\"Research file written\", {\n taskId,\n score: data.actionabilityScore,\n hasQuestions: !!data.questions,\n answered: data.answered ?? false,\n });\n }\n\n async readResearch(taskId: string): Promise<ResearchEvaluation | null> {\n try {\n const content = await this.readTaskFile(taskId, \"research.json\");\n return content ? (JSON.parse(content) as ResearchEvaluation) : null;\n } catch (error) {\n this.logger.debug(\"Failed to parse research.json\", { error });\n return null;\n }\n }\n\n async writeTodos(taskId: string, data: unknown): Promise<void> {\n const todos = z.object({\n metadata: z.object({\n total: z.number(),\n completed: z.number(),\n }),\n });\n\n const validatedData = todos.parse(data);\n this.logger.debug(\"Writing todos\", {\n taskId,\n total: validatedData.metadata?.total ?? 0,\n completed: validatedData.metadata?.completed ?? 0,\n });\n\n await this.writeTaskFile(taskId, {\n name: \"todos.json\",\n content: JSON.stringify(validatedData, null, 2),\n type: \"artifact\",\n });\n\n this.logger.info(\"Todos file written\", {\n taskId,\n total: validatedData.metadata?.total ?? 0,\n completed: validatedData.metadata?.completed ?? 0,\n });\n }\n\n async readTodos(taskId: string): Promise<unknown | null> {\n try {\n const content = await this.readTaskFile(taskId, \"todos.json\");\n return content ? JSON.parse(content) : null;\n } catch (error) {\n this.logger.debug(\"Failed to parse todos.json\", { error });\n return null;\n }\n }\n\n async getTaskFiles(taskId: string): Promise<SupportingFile[]> {\n const fileNames = await this.listTaskFiles(taskId);\n const files: SupportingFile[] = [];\n\n for (const fileName of fileNames) {\n const content = await this.readTaskFile(taskId, fileName);\n if (content !== null) {\n // Determine type based on file name\n const type = this.resolveFileType(fileName);\n\n files.push({\n name: fileName,\n content,\n type,\n created_at: new Date().toISOString(), // Could be enhanced with file stats\n });\n }\n }\n\n return files;\n }\n\n async collectTaskArtifacts(taskId: string): Promise<LocalArtifact[]> {\n const fileNames = await this.listTaskFiles(taskId);\n const artifacts: LocalArtifact[] = [];\n\n for (const fileName of fileNames) {\n const content = await this.readTaskFile(taskId, fileName);\n if (content === null) {\n continue;\n }\n\n const type = this.resolveFileType(fileName);\n const contentType = this.inferContentType(fileName);\n const size = Buffer.byteLength(content, \"utf8\");\n\n artifacts.push({\n name: fileName,\n content,\n type,\n contentType,\n size,\n });\n }\n\n return artifacts;\n }\n\n private resolveFileType(fileName: string): TaskFile[\"type\"] {\n if (fileName === \"plan.md\") return \"plan\";\n if (fileName === \"context.md\") return \"context\";\n if (fileName === \"requirements.md\") return \"reference\";\n if (fileName.startsWith(\"output_\")) return \"output\";\n if (fileName.endsWith(\".md\")) return \"reference\";\n return \"artifact\";\n }\n\n private inferContentType(fileName: string): string {\n const extension = extname(fileName).toLowerCase();\n switch (extension) {\n case \".md\":\n return \"text/markdown\";\n case \".json\":\n return \"application/json\";\n case \".txt\":\n return \"text/plain\";\n default:\n return \"text/plain\";\n }\n }\n}\n","import { exec } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { Logger } from \"./utils/logger.js\";\n\nconst execAsync = promisify(exec);\n\nexport interface GitConfig {\n repositoryPath: string;\n authorName?: string;\n authorEmail?: string;\n logger?: Logger;\n}\n\nexport interface BranchInfo {\n name: string;\n exists: boolean;\n isCurrentBranch: boolean;\n}\n\nexport class GitManager {\n private repositoryPath: string;\n private authorName?: string;\n private authorEmail?: string;\n private logger: Logger;\n\n constructor(config: GitConfig) {\n this.repositoryPath = config.repositoryPath;\n this.authorName = config.authorName;\n this.authorEmail = config.authorEmail;\n this.logger =\n config.logger || new Logger({ debug: false, prefix: \"[GitManager]\" });\n }\n\n private escapeShellArg(str: string): string {\n return str\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\"/g, '\\\\\"')\n .replace(/`/g, \"\\\\`\")\n .replace(/\\$/g, \"\\\\$\");\n }\n\n private async runGitCommand(command: string): Promise<string> {\n try {\n const { stdout } = await execAsync(\n `cd \"${this.repositoryPath}\" && git ${command}`,\n );\n return stdout.trim();\n } catch (error) {\n throw new Error(`Git command failed: ${command}\\n${error}`);\n }\n }\n\n private async runCommand(command: string): Promise<string> {\n try {\n const { stdout } = await execAsync(\n `cd \"${this.repositoryPath}\" && ${command}`,\n );\n return stdout.trim();\n } catch (error) {\n throw new Error(`Command failed: ${command}\\n${error}`);\n }\n }\n\n async isGitRepository(): Promise<boolean> {\n try {\n await this.runGitCommand(\"rev-parse --git-dir\");\n return true;\n } catch {\n return false;\n }\n }\n\n async getCurrentBranch(): Promise<string> {\n return await this.runGitCommand(\"branch --show-current\");\n }\n\n async getDefaultBranch(): Promise<string> {\n try {\n // Try to get the default branch from remote\n const remoteBranch = await this.runGitCommand(\n \"symbolic-ref refs/remotes/origin/HEAD\",\n );\n return remoteBranch.replace(\"refs/remotes/origin/\", \"\");\n } catch {\n // Fallback: check if main exists, otherwise use master\n if (await this.branchExists(\"main\")) {\n return \"main\";\n } else if (await this.branchExists(\"master\")) {\n return \"master\";\n } else {\n throw new Error(\n \"Cannot determine default branch. No main or master branch found.\",\n );\n }\n }\n }\n\n async branchExists(branchName: string): Promise<boolean> {\n try {\n await this.runGitCommand(`rev-parse --verify ${branchName}`);\n return true;\n } catch {\n return false;\n }\n }\n\n async createBranch(branchName: string, baseBranch?: string): Promise<void> {\n const base = baseBranch || (await this.getCurrentBranch());\n await this.runGitCommand(`checkout -b ${branchName} ${base}`);\n }\n\n async switchToBranch(branchName: string): Promise<void> {\n await this.runGitCommand(`checkout ${branchName}`);\n }\n\n async resetToDefaultBranchIfNeeded(): Promise<boolean> {\n const currentBranch = await this.getCurrentBranch();\n const defaultBranch = await this.getDefaultBranch();\n\n if (currentBranch === defaultBranch) {\n this.logger.debug(\"Already on default branch\", { branch: defaultBranch });\n return true;\n }\n\n if (await this.hasChanges()) {\n this.logger.warn(\"Skipping branch reset - uncommitted changes present\", {\n currentBranch,\n defaultBranch,\n });\n return false;\n }\n\n await this.switchToBranch(defaultBranch);\n this.logger.info(\"Reset to default branch\", {\n from: currentBranch,\n to: defaultBranch,\n });\n return true;\n }\n\n async createOrSwitchToBranch(\n branchName: string,\n baseBranch?: string,\n ): Promise<void> {\n await this.ensureCleanWorkingDirectory(\"switching branches\");\n\n const exists = await this.branchExists(branchName);\n if (exists) {\n await this.switchToBranch(branchName);\n } else {\n await this.createBranch(branchName, baseBranch);\n }\n }\n\n async addFiles(paths: string[]): Promise<void> {\n const pathList = paths.map((p) => `\"${this.escapeShellArg(p)}\"`).join(\" \");\n await this.runGitCommand(`add ${pathList}`);\n }\n\n async addAllPostHogFiles(): Promise<void> {\n try {\n // Use -A flag to add all changes (including new files) and ignore errors if directory is empty\n await this.runGitCommand(\"add -A .posthog/\");\n } catch (error) {\n // If the directory doesn't exist or has no files, that's fine - just log and continue\n this.logger.debug(\"No PostHog files to add\", { error });\n }\n }\n\n async commitChanges(\n message: string,\n options?: {\n authorName?: string;\n authorEmail?: string;\n },\n ): Promise<string> {\n const command = this.buildCommitCommand(message, options);\n return await this.runGitCommand(command);\n }\n\n async hasChanges(): Promise<boolean> {\n try {\n const status = await this.runGitCommand(\"status --porcelain\");\n if (!status || status.trim().length === 0) {\n return false;\n }\n\n const lines = status.split(\"\\n\").filter((line) => {\n const trimmed = line.trim();\n return trimmed.length > 0 && !trimmed.includes(\".posthog/\");\n });\n\n return lines.length > 0;\n } catch {\n return false;\n }\n }\n\n async hasStagedChanges(): Promise<boolean> {\n try {\n const status = await this.runGitCommand(\"diff --cached --name-only\");\n return status.length > 0;\n } catch {\n return false;\n }\n }\n\n // Helper: Centralized safety check for uncommitted changes\n private async ensureCleanWorkingDirectory(operation: string): Promise<void> {\n if (await this.hasChanges()) {\n throw new Error(\n `Uncommitted changes detected. Please commit or stash changes before ${operation}.`,\n );\n }\n }\n\n private async generateUniqueBranchName(baseName: string): Promise<string> {\n if (!(await this.branchExists(baseName))) {\n return baseName;\n }\n\n let counter = 1;\n let uniqueName = `${baseName}-${counter}`;\n while (await this.branchExists(uniqueName)) {\n counter++;\n uniqueName = `${baseName}-${counter}`;\n }\n return uniqueName;\n }\n\n private async ensureOnDefaultBranch(): Promise<string> {\n const defaultBranch = await this.getDefaultBranch();\n const currentBranch = await this.getCurrentBranch();\n\n if (currentBranch !== defaultBranch) {\n await this.ensureCleanWorkingDirectory(\"switching to default branch\");\n await this.switchToBranch(defaultBranch);\n }\n\n return defaultBranch;\n }\n\n private buildCommitCommand(\n message: string,\n options?: {\n allowEmpty?: boolean;\n authorName?: string;\n authorEmail?: string;\n },\n ): string {\n let command = `commit -m \"${this.escapeShellArg(message)}\"`;\n\n if (options?.allowEmpty) {\n command += \" --allow-empty\";\n }\n\n const authorName = options?.authorName || this.authorName;\n const authorEmail = options?.authorEmail || this.authorEmail;\n\n if (authorName && authorEmail) {\n command += ` --author=\"${authorName} <${authorEmail}>\"`;\n }\n\n return command;\n }\n\n async getRemoteUrl(): Promise<string | null> {\n try {\n return await this.runGitCommand(\"remote get-url origin\");\n } catch {\n return null;\n }\n }\n\n async pushBranch(branchName: string, force: boolean = false): Promise<void> {\n const forceFlag = force ? \"--force\" : \"\";\n await this.runGitCommand(`push ${forceFlag} -u origin ${branchName}`);\n }\n\n /**\n * Tracks whether commits were made during an operation by comparing HEAD SHA\n * before and after. Returns an object with methods to finalize the operation.\n *\n * Usage:\n * const tracker = await gitManager.trackCommitsDuring();\n * // ... do work that might create commits ...\n * const result = await tracker.finalize({ commitMessage: 'fallback message', push: true });\n */\n async trackCommitsDuring(): Promise<{\n finalize: (options: {\n commitMessage: string;\n push?: boolean;\n }) => Promise<{ commitCreated: boolean; pushedBranch: boolean }>;\n }> {\n const initialSha = await this.getCommitSha(\"HEAD\");\n\n return {\n finalize: async (options) => {\n const currentSha = await this.getCommitSha(\"HEAD\");\n const externalCommitsCreated = initialSha !== currentSha;\n const hasUncommittedChanges = await this.hasChanges();\n\n // If no commits and no changes, nothing to do\n if (!externalCommitsCreated && !hasUncommittedChanges) {\n return { commitCreated: false, pushedBranch: false };\n }\n\n let commitCreated = externalCommitsCreated;\n\n // Commit any remaining uncommitted changes\n if (hasUncommittedChanges) {\n await this.runGitCommand(\"add .\");\n const hasStagedChanges = await this.hasStagedChanges();\n\n if (hasStagedChanges) {\n await this.commitChanges(options.commitMessage);\n commitCreated = true;\n }\n }\n\n // Push if requested and commits were made\n let pushedBranch = false;\n if (options.push && commitCreated) {\n const currentBranch = await this.getCurrentBranch();\n await this.pushBranch(currentBranch);\n pushedBranch = true;\n this.logger.info(\"Pushed branch after operation\", {\n branch: currentBranch,\n });\n }\n\n return { commitCreated, pushedBranch };\n },\n };\n }\n\n async createTaskBranch(taskSlug: string): Promise<string> {\n const branchName = `posthog/task-${taskSlug}`;\n\n // Ensure we're on default branch before creating task branch\n const defaultBranch = await this.ensureOnDefaultBranch();\n\n this.logger.info(\"Creating task branch from default branch\", {\n branchName,\n taskSlug,\n baseBranch: defaultBranch,\n });\n\n await this.createOrSwitchToBranch(branchName, defaultBranch);\n\n return branchName;\n }\n\n async createTaskPlanningBranch(\n taskId: string,\n baseBranch?: string,\n ): Promise<string> {\n const baseName = `posthog/task-${taskId}-planning`;\n const branchName = await this.generateUniqueBranchName(baseName);\n\n this.logger.debug(\"Creating unique planning branch\", {\n branchName,\n taskId,\n });\n\n const base = baseBranch || (await this.ensureOnDefaultBranch());\n await this.createBranch(branchName, base);\n\n return branchName;\n }\n\n async createTaskImplementationBranch(\n taskId: string,\n planningBranchName?: string,\n ): Promise<string> {\n const baseName = `posthog/task-${taskId}-implementation`;\n const branchName = await this.generateUniqueBranchName(baseName);\n\n this.logger.debug(\"Creating unique implementation branch\", {\n branchName,\n taskId,\n currentBranch: await this.getCurrentBranch(),\n });\n\n // Determine base branch: explicit param > current planning branch > default\n let baseBranch = planningBranchName;\n\n if (!baseBranch) {\n const currentBranch = await this.getCurrentBranch();\n if (currentBranch.includes(\"-planning\")) {\n baseBranch = currentBranch;\n this.logger.debug(\"Using current planning branch\", { baseBranch });\n } else {\n baseBranch = await this.ensureOnDefaultBranch();\n this.logger.debug(\"Using default branch\", { baseBranch });\n }\n }\n\n this.logger.debug(\"Creating implementation branch from base\", {\n baseBranch,\n branchName,\n });\n await this.createBranch(branchName, baseBranch);\n\n this.logger.info(\"Implementation branch created\", {\n branchName,\n currentBranch: await this.getCurrentBranch(),\n });\n\n return branchName;\n }\n\n async commitPlan(taskId: string, taskTitle: string): Promise<string> {\n const currentBranch = await this.getCurrentBranch();\n this.logger.debug(\"Committing plan\", { taskId, currentBranch });\n\n await this.addAllPostHogFiles();\n\n const hasChanges = await this.hasStagedChanges();\n this.logger.debug(\"Checking for staged changes\", { hasChanges });\n\n if (!hasChanges) {\n this.logger.info(\"No plan changes to commit\", { taskId });\n return \"No changes to commit\";\n }\n\n const message = `📋 Add plan for task: ${taskTitle}\n\nTask ID: ${taskId}\nGenerated by PostHog Agent\n\nThis commit contains the implementation plan and supporting documentation\nfor the task. Review the plan before proceeding with implementation.`;\n\n const result = await this.commitChanges(message);\n this.logger.info(\"Plan committed\", { taskId, taskTitle });\n return result;\n }\n\n async commitImplementation(\n taskId: string,\n taskTitle: string,\n planSummary?: string,\n ): Promise<string> {\n await this.runGitCommand(\"add .\");\n\n const hasChanges = await this.hasStagedChanges();\n if (!hasChanges) {\n this.logger.warn(\"No implementation changes to commit\", { taskId });\n return \"No changes to commit\";\n }\n\n let message = `✨ Implement task: ${taskTitle}\n\nTask ID: ${taskId}\nGenerated by PostHog Agent`;\n\n if (planSummary) {\n message += `\\n\\nPlan Summary:\\n${planSummary}`;\n }\n\n message += `\\n\\nThis commit implements the changes described in the task plan.`;\n\n const result = await this.commitChanges(message);\n this.logger.info(\"Implementation committed\", { taskId, taskTitle });\n return result;\n }\n\n async deleteBranch(\n branchName: string,\n force: boolean = false,\n ): Promise<void> {\n const forceFlag = force ? \"-D\" : \"-d\";\n await this.runGitCommand(`branch ${forceFlag} ${branchName}`);\n }\n\n async deleteRemoteBranch(branchName: string): Promise<void> {\n await this.runGitCommand(`push origin --delete ${branchName}`);\n }\n\n async getBranchInfo(branchName: string): Promise<BranchInfo> {\n const exists = await this.branchExists(branchName);\n const currentBranch = await this.getCurrentBranch();\n\n return {\n name: branchName,\n exists,\n isCurrentBranch: branchName === currentBranch,\n };\n }\n\n async getCommitSha(ref: string = \"HEAD\"): Promise<string> {\n return await this.runGitCommand(`rev-parse ${ref}`);\n }\n\n async getCommitMessage(ref: string = \"HEAD\"): Promise<string> {\n return await this.runGitCommand(`log -1 --pretty=%B ${ref}`);\n }\n\n async createPullRequest(\n branchName: string,\n title: string,\n body: string,\n baseBranch?: string,\n ): Promise<string> {\n const currentBranch = await this.getCurrentBranch();\n if (currentBranch !== branchName) {\n await this.ensureCleanWorkingDirectory(\"creating PR\");\n await this.switchToBranch(branchName);\n }\n\n await this.pushBranch(branchName);\n\n let command = `gh pr create --title \"${this.escapeShellArg(title)}\" --body \"${this.escapeShellArg(body)}\"`;\n\n if (baseBranch) {\n command += ` --base ${baseBranch}`;\n }\n\n try {\n const prUrl = await this.runCommand(command);\n return prUrl.trim();\n } catch (error) {\n throw new Error(`Failed to create PR: ${error}`);\n }\n }\n\n async getTaskBranch(taskSlug: string): Promise<string | null> {\n try {\n // Get all branches matching the task slug pattern\n const branches = await this.runGitCommand(\"branch --list --all\");\n const branchPattern = `posthog/task-${taskSlug}`;\n\n // Look for exact match or with counter suffix\n const lines = branches\n .split(\"\\n\")\n .map((l) => l.trim().replace(/^\\*\\s+/, \"\"));\n for (const line of lines) {\n const cleanBranch = line.replace(\"remotes/origin/\", \"\");\n if (cleanBranch.startsWith(branchPattern)) {\n return cleanBranch;\n }\n }\n\n return null;\n } catch (error) {\n this.logger.debug(\"Failed to get task branch\", { taskSlug, error });\n return null;\n }\n }\n\n async commitAndPush(\n message: string,\n options?: { allowEmpty?: boolean },\n ): Promise<void> {\n const hasChanges = await this.hasStagedChanges();\n\n if (!hasChanges && !options?.allowEmpty) {\n this.logger.debug(\"No changes to commit, skipping\");\n return;\n }\n\n const command = this.buildCommitCommand(message, options);\n await this.runGitCommand(command);\n\n // Push to origin\n const currentBranch = await this.getCurrentBranch();\n await this.pushBranch(currentBranch);\n\n this.logger.info(\"Committed and pushed changes\", {\n branch: currentBranch,\n message,\n });\n }\n\n async isWorktree(): Promise<boolean> {\n try {\n // In a worktree, .git is a file pointing to the main repo's .git/worktrees/{name}\n // In a normal repo, .git is a directory\n const result = await this.runGitCommand(\n \"rev-parse --git-common-dir --git-dir\",\n );\n const lines = result.split(\"\\n\");\n if (lines.length >= 2) {\n const commonDir = lines[0].trim();\n const gitDir = lines[1].trim();\n // If they're different, we're in a worktree\n return commonDir !== gitDir;\n }\n return false;\n } catch {\n return false;\n }\n }\n}\n","import type {\n PostHogAPIConfig,\n PostHogResource,\n StoredEntry,\n Task,\n TaskArtifactUploadPayload,\n TaskRun,\n TaskRunArtifact,\n UrlMention,\n} from \"./types.js\";\n\ninterface PostHogApiResponse<T> {\n results?: T[];\n count?: number;\n next?: string | null;\n previous?: string | null;\n}\n\nexport type TaskRunUpdate = Partial<\n Pick<\n TaskRun,\n \"status\" | \"branch\" | \"stage\" | \"error_message\" | \"output\" | \"state\"\n >\n>;\n\nexport type TaskCreatePayload = Pick<Task, \"description\"> &\n Partial<Pick<Task, \"title\" | \"repository\" | \"origin_product\">>;\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.apiKey}`,\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 getTeamId(): number {\n return this.config.projectId;\n }\n\n getBaseUrl(): string {\n return this.baseUrl;\n }\n\n getApiKey(): string {\n return this.config.apiKey;\n }\n\n getLlmGatewayUrl(): string {\n const teamId = this.getTeamId();\n return `${this.baseUrl}/api/projects/${teamId}/llm_gateway`;\n }\n\n async fetchTask(taskId: string): Promise<Task> {\n const teamId = this.getTeamId();\n return this.apiRequest<Task>(`/api/projects/${teamId}/tasks/${taskId}/`);\n }\n\n async listTasks(filters?: {\n repository?: string;\n organization?: string;\n origin_product?: string;\n }): Promise<Task[]> {\n const teamId = this.getTeamId();\n const url = new URL(`${this.baseUrl}/api/projects/${teamId}/tasks/`);\n\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n if (value) url.searchParams.append(key, value);\n });\n }\n\n const response = await this.apiRequest<PostHogApiResponse<Task>>(\n url.pathname + url.search,\n );\n\n return response.results || [];\n }\n\n async updateTask(taskId: string, updates: Partial<Task>): Promise<Task> {\n const teamId = this.getTeamId();\n return this.apiRequest<Task>(`/api/projects/${teamId}/tasks/${taskId}/`, {\n method: \"PATCH\",\n body: JSON.stringify(updates),\n });\n }\n\n async createTask(payload: TaskCreatePayload): Promise<Task> {\n const teamId = this.getTeamId();\n return this.apiRequest<Task>(`/api/projects/${teamId}/tasks/`, {\n method: \"POST\",\n body: JSON.stringify({\n origin_product: \"user_created\",\n ...payload,\n }),\n });\n }\n\n // TaskRun methods\n async listTaskRuns(taskId: string): Promise<TaskRun[]> {\n const teamId = this.getTeamId();\n const response = await this.apiRequest<PostHogApiResponse<TaskRun>>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/`,\n );\n return response.results || [];\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 createTaskRun(\n taskId: string,\n payload?: Partial<\n Omit<\n TaskRun,\n | \"id\"\n | \"task\"\n | \"team\"\n | \"created_at\"\n | \"updated_at\"\n | \"completed_at\"\n | \"artifacts\"\n >\n >,\n ): Promise<TaskRun> {\n const teamId = this.getTeamId();\n return this.apiRequest<TaskRun>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/`,\n {\n method: \"POST\",\n body: JSON.stringify(payload || {}),\n },\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 setTaskRunOutput(\n taskId: string,\n runId: string,\n output: Record<string, unknown>,\n ): Promise<TaskRun> {\n const teamId = this.getTeamId();\n return this.apiRequest<TaskRun>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/set_output/`,\n {\n method: \"PATCH\",\n body: JSON.stringify({ output }),\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 /**\n * Fetch logs from S3 using presigned URL from TaskRun\n * @param taskRun - The task run containing the log_url\n * @returns Array of stored entries, or empty array if no logs available\n */\n async fetchTaskRunLogs(taskRun: TaskRun): Promise<StoredEntry[]> {\n if (!taskRun.log_url) {\n return [];\n }\n\n try {\n const response = await fetch(taskRun.log_url);\n\n if (!response.ok) {\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 /**\n * Fetch error details from PostHog error tracking\n */\n async fetchErrorDetails(\n errorId: string,\n projectId?: string,\n ): Promise<PostHogResource> {\n const teamId = projectId ? parseInt(projectId, 10) : this.getTeamId();\n\n try {\n const errorData = await this.apiRequest<Record<string, unknown>>(\n `/api/projects/${teamId}/error_tracking/${errorId}/`,\n );\n\n // Format error details for agent consumption\n const content = this.formatErrorContent(errorData);\n\n return {\n type: \"error\",\n id: errorId,\n url: `${this.baseUrl}/project/${teamId}/error_tracking/${errorId}`,\n title:\n (typeof errorData.exception_type === \"string\"\n ? errorData.exception_type\n : undefined) || \"Unknown Error\",\n content,\n metadata: {\n exception_type: errorData.exception_type,\n first_seen: errorData.first_seen,\n last_seen: errorData.last_seen,\n volume: errorData.volume,\n users_affected: errorData.users_affected,\n },\n };\n } catch (error) {\n throw new Error(`Failed to fetch error details for ${errorId}: ${error}`);\n }\n }\n\n /**\n * Generic resource fetcher by URL or ID\n */\n async fetchResourceByUrl(urlMention: UrlMention): Promise<PostHogResource> {\n switch (urlMention.type) {\n case \"error\": {\n if (!urlMention.id) {\n throw new Error(\"Error ID is required for error resources\");\n }\n // Extract project ID from URL if available, otherwise use default team\n let projectId: string | undefined;\n if (urlMention.url) {\n const projectIdMatch = urlMention.url.match(/\\/project\\/(\\d+)\\//);\n projectId = projectIdMatch ? projectIdMatch[1] : undefined;\n }\n return this.fetchErrorDetails(urlMention.id, projectId);\n }\n\n case \"experiment\":\n case \"insight\":\n case \"feature_flag\":\n throw new Error(\n `Resource type '${urlMention.type}' not yet implemented`,\n );\n\n case \"generic\":\n // Return a minimal resource for generic URLs\n return {\n type: \"generic\",\n id: \"\",\n url: urlMention.url,\n title: \"Generic Resource\",\n content: `Generic resource: ${urlMention.url}`,\n metadata: {},\n };\n\n default:\n throw new Error(`Unknown resource type: ${urlMention.type}`);\n }\n }\n\n /**\n * Format error data for agent consumption\n */\n private formatErrorContent(errorData: Record<string, unknown>): string {\n const sections = [];\n\n if (errorData.exception_type) {\n sections.push(`**Error Type**: ${errorData.exception_type}`);\n }\n\n if (errorData.exception_message) {\n sections.push(`**Message**: ${errorData.exception_message}`);\n }\n\n if (errorData.stack_trace) {\n sections.push(\n `**Stack Trace**:\\n\\`\\`\\`\\n${errorData.stack_trace}\\n\\`\\`\\``,\n );\n }\n\n if (errorData.volume) {\n sections.push(`**Volume**: ${errorData.volume} occurrences`);\n }\n\n if (errorData.users_affected) {\n sections.push(`**Users Affected**: ${errorData.users_affected}`);\n }\n\n if (errorData.first_seen && errorData.last_seen) {\n sections.push(`**First Seen**: ${errorData.first_seen}`);\n sections.push(`**Last Seen**: ${errorData.last_seen}`);\n }\n\n if (errorData.properties && Object.keys(errorData.properties).length > 0) {\n sections.push(\n `**Properties**: ${JSON.stringify(errorData.properties, null, 2)}`,\n );\n }\n\n return sections.join(\"\\n\\n\");\n }\n}\n","import { promises as fs } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { TemplateVariables } from \"./template-manager.js\";\nimport type {\n PostHogResource,\n ResourceType,\n SupportingFile,\n Task,\n UrlMention,\n} from \"./types.js\";\nimport { Logger } from \"./utils/logger.js\";\n\nexport interface PromptBuilderDeps {\n getTaskFiles: (taskId: string) => Promise<SupportingFile[]>;\n generatePlanTemplate: (vars: TemplateVariables) => Promise<string>;\n posthogClient?: {\n fetchResourceByUrl: (mention: UrlMention) => Promise<PostHogResource>;\n };\n logger?: Logger;\n}\n\nexport class PromptBuilder {\n private getTaskFiles: PromptBuilderDeps[\"getTaskFiles\"];\n private generatePlanTemplate: PromptBuilderDeps[\"generatePlanTemplate\"];\n private posthogClient?: PromptBuilderDeps[\"posthogClient\"];\n private logger: Logger;\n\n constructor(deps: PromptBuilderDeps) {\n this.getTaskFiles = deps.getTaskFiles;\n this.generatePlanTemplate = deps.generatePlanTemplate;\n this.posthogClient = deps.posthogClient;\n this.logger =\n deps.logger || new Logger({ debug: false, prefix: \"[PromptBuilder]\" });\n }\n\n /**\n * Extract file paths from XML tags in description\n * Format: <file path=\"relative/path.ts\" />\n */\n private extractFilePaths(description: string): string[] {\n const fileTagRegex = /<file\\s+path=\"([^\"]+)\"\\s*\\/>/g;\n const paths: string[] = [];\n let match: RegExpExecArray | null;\n\n match = fileTagRegex.exec(description);\n while (match !== null) {\n paths.push(match[1]);\n match = fileTagRegex.exec(description);\n }\n\n return paths;\n }\n\n /**\n * Read file contents from repository\n */\n private async readFileContent(\n repositoryPath: string,\n filePath: string,\n ): Promise<string | null> {\n try {\n const fullPath = join(repositoryPath, filePath);\n const content = await fs.readFile(fullPath, \"utf8\");\n return content;\n } catch (error) {\n this.logger.warn(`Failed to read referenced file: ${filePath}`, {\n error,\n });\n return null;\n }\n }\n\n /**\n * Extract URL mentions from XML tags in description\n * Formats: <error id=\"...\" />, <experiment id=\"...\" />, <url href=\"...\" />\n */\n private extractUrlMentions(description: string): UrlMention[] {\n const mentions: UrlMention[] = [];\n\n // PostHog resource mentions: <error id=\"...\" />, <experiment id=\"...\" />, etc.\n const resourceRegex =\n /<(error|experiment|insight|feature_flag)\\s+id=\"([^\"]+)\"\\s*\\/>/g;\n let match: RegExpExecArray | null;\n\n match = resourceRegex.exec(description);\n while (match !== null) {\n const [, type, id] = match;\n mentions.push({\n url: \"\", // Will be reconstructed if needed\n type: type as ResourceType,\n id,\n label: this.generateUrlLabel(\"\", type as ResourceType),\n });\n match = resourceRegex.exec(description);\n }\n\n // Generic URL mentions: <url href=\"...\" />\n const urlRegex = /<url\\s+href=\"([^\"]+)\"\\s*\\/>/g;\n match = urlRegex.exec(description);\n while (match !== null) {\n const [, url] = match;\n mentions.push({\n url,\n type: \"generic\",\n label: this.generateUrlLabel(url, \"generic\"),\n });\n match = urlRegex.exec(description);\n }\n\n return mentions;\n }\n\n /**\n * Generate a display label for a URL mention\n */\n private generateUrlLabel(url: string, type: string): string {\n try {\n const urlObj = new URL(url);\n switch (type) {\n case \"error\": {\n const errorMatch = url.match(/error_tracking\\/([a-f0-9-]+)/);\n return errorMatch ? `Error ${errorMatch[1].slice(0, 8)}...` : \"Error\";\n }\n case \"experiment\": {\n const expMatch = url.match(/experiments\\/(\\d+)/);\n return expMatch ? `Experiment #${expMatch[1]}` : \"Experiment\";\n }\n case \"insight\":\n return \"Insight\";\n case \"feature_flag\":\n return \"Feature Flag\";\n default:\n return urlObj.hostname;\n }\n } catch {\n return \"URL\";\n }\n }\n\n /**\n * Process URL references and fetch their content\n */\n private async processUrlReferences(\n description: string,\n ): Promise<{ description: string; referencedResources: PostHogResource[] }> {\n const urlMentions = this.extractUrlMentions(description);\n const referencedResources: PostHogResource[] = [];\n\n if (urlMentions.length === 0 || !this.posthogClient) {\n return { description, referencedResources };\n }\n\n // Fetch all referenced resources\n for (const mention of urlMentions) {\n try {\n const resource = await this.posthogClient.fetchResourceByUrl(mention);\n referencedResources.push(resource);\n } catch (error) {\n this.logger.warn(`Failed to fetch resource from URL: ${mention.url}`, {\n error,\n });\n // Add a placeholder resource for failed fetches\n referencedResources.push({\n type: mention.type,\n id: mention.id || \"\",\n url: mention.url,\n title: mention.label || \"Unknown Resource\",\n content: `Failed to fetch resource from ${mention.url}: ${error}`,\n metadata: {},\n });\n }\n }\n\n // Replace URL tags with just the label for readability\n let processedDescription = description;\n for (const mention of urlMentions) {\n if (mention.type === \"generic\") {\n // Generic URLs: <url href=\"...\" />\n const escapedUrl = mention.url.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n processedDescription = processedDescription.replace(\n new RegExp(`<url\\\\s+href=\"${escapedUrl}\"\\\\s*/>`, \"g\"),\n `@${mention.label}`,\n );\n } else {\n // PostHog resources: <error id=\"...\" />, <experiment id=\"...\" />, etc.\n const escapedType = mention.type.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const escapedId = mention.id\n ? mention.id.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\n : \"\";\n processedDescription = processedDescription.replace(\n new RegExp(`<${escapedType}\\\\s+id=\"${escapedId}\"\\\\s*/>`, \"g\"),\n `@${mention.label}`,\n );\n }\n }\n\n return { description: processedDescription, referencedResources };\n }\n\n /**\n * Process description to extract file tags and read contents\n * Returns processed description and referenced file contents\n */\n private async processFileReferences(\n description: string,\n repositoryPath?: string,\n ): Promise<{\n description: string;\n referencedFiles: Array<{ path: string; content: string }>;\n }> {\n const filePaths = this.extractFilePaths(description);\n const referencedFiles: Array<{ path: string; content: string }> = [];\n\n if (filePaths.length === 0 || !repositoryPath) {\n return { description, referencedFiles };\n }\n\n // Read all referenced files\n for (const filePath of filePaths) {\n const content = await this.readFileContent(repositoryPath, filePath);\n if (content !== null) {\n referencedFiles.push({ path: filePath, content });\n }\n }\n\n // Replace file tags with just the filename for readability\n let processedDescription = description;\n for (const filePath of filePaths) {\n const fileName = filePath.split(\"/\").pop() || filePath;\n processedDescription = processedDescription.replace(\n new RegExp(\n `<file\\\\s+path=\"${filePath.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}\"\\\\s*/>`,\n \"g\",\n ),\n `@${fileName}`,\n );\n }\n\n return { description: processedDescription, referencedFiles };\n }\n\n async buildResearchPrompt(\n task: Task,\n repositoryPath?: string,\n ): Promise<string> {\n // Process file references in description\n const { description: descriptionAfterFiles, referencedFiles } =\n await this.processFileReferences(task.description, repositoryPath);\n\n // Process URL references in description\n const { description: processedDescription, referencedResources } =\n await this.processUrlReferences(descriptionAfterFiles);\n\n let prompt = \"<task>\\n\";\n prompt += `<title>${task.title}</title>\\n`;\n prompt += `<description>${processedDescription}</description>\\n`;\n\n if (task.repository) {\n prompt += `<repository>${task.repository}</repository>\\n`;\n }\n prompt += \"</task>\\n\";\n\n // Add referenced files from @ mentions\n if (referencedFiles.length > 0) {\n prompt += \"\\n<referenced_files>\\n\";\n for (const file of referencedFiles) {\n prompt += `<file path=\"${file.path}\">\\n\\`\\`\\`\\n${file.content}\\n\\`\\`\\`\\n</file>\\n`;\n }\n prompt += \"</referenced_files>\\n\";\n }\n\n // Add referenced resources from URL mentions\n if (referencedResources.length > 0) {\n prompt += \"\\n<referenced_resources>\\n\";\n for (const resource of referencedResources) {\n prompt += `<resource type=\"${resource.type}\" url=\"${resource.url}\">\\n`;\n prompt += `<title>${resource.title}</title>\\n`;\n prompt += `<content>${resource.content}</content>\\n`;\n prompt += \"</resource>\\n\";\n }\n prompt += \"</referenced_resources>\\n\";\n }\n\n try {\n const taskFiles = await this.getTaskFiles(task.id);\n const contextFiles = taskFiles.filter(\n (f: SupportingFile) => f.type === \"context\" || f.type === \"reference\",\n );\n if (contextFiles.length > 0) {\n prompt += \"\\n<supporting_files>\\n\";\n for (const file of contextFiles) {\n prompt += `<file name=\"${file.name}\" type=\"${file.type}\">\\n${file.content}\\n</file>\\n`;\n }\n prompt += \"</supporting_files>\\n\";\n }\n } catch (_error) {\n this.logger.debug(\"No existing task files found for research\", {\n taskId: task.id,\n });\n }\n\n return prompt;\n }\n\n async buildPlanningPrompt(\n task: Task,\n repositoryPath?: string,\n ): Promise<string> {\n // Process file references in description\n const { description: descriptionAfterFiles, referencedFiles } =\n await this.processFileReferences(task.description, repositoryPath);\n\n // Process URL references in description\n const { description: processedDescription, referencedResources } =\n await this.processUrlReferences(descriptionAfterFiles);\n\n let prompt = \"<task>\\n\";\n prompt += `<title>${task.title}</title>\\n`;\n prompt += `<description>${processedDescription}</description>\\n`;\n\n if (task.repository) {\n prompt += `<repository>${task.repository}</repository>\\n`;\n }\n prompt += \"</task>\\n\";\n\n // Add referenced files from @ mentions\n if (referencedFiles.length > 0) {\n prompt += \"\\n<referenced_files>\\n\";\n for (const file of referencedFiles) {\n prompt += `<file path=\"${file.path}\">\\n\\`\\`\\`\\n${file.content}\\n\\`\\`\\`\\n</file>\\n`;\n }\n prompt += \"</referenced_files>\\n\";\n }\n\n // Add referenced resources from URL mentions\n if (referencedResources.length > 0) {\n prompt += \"\\n<referenced_resources>\\n\";\n for (const resource of referencedResources) {\n prompt += `<resource type=\"${resource.type}\" url=\"${resource.url}\">\\n`;\n prompt += `<title>${resource.title}</title>\\n`;\n prompt += `<content>${resource.content}</content>\\n`;\n prompt += \"</resource>\\n\";\n }\n prompt += \"</referenced_resources>\\n\";\n }\n\n try {\n const taskFiles = await this.getTaskFiles(task.id);\n const contextFiles = taskFiles.filter(\n (f: SupportingFile) => f.type === \"context\" || f.type === \"reference\",\n );\n if (contextFiles.length > 0) {\n prompt += \"\\n<supporting_files>\\n\";\n for (const file of contextFiles) {\n prompt += `<file name=\"${file.name}\" type=\"${file.type}\">\\n${file.content}\\n</file>\\n`;\n }\n prompt += \"</supporting_files>\\n\";\n }\n } catch (_error) {\n this.logger.debug(\"No existing task files found for planning\", {\n taskId: task.id,\n });\n }\n\n const templateVariables = {\n task_id: task.id,\n task_title: task.title,\n task_description: processedDescription,\n date: new Date().toISOString().split(\"T\")[0],\n repository: task.repository || \"\",\n };\n\n const planTemplate = await this.generatePlanTemplate(templateVariables);\n\n prompt += \"\\n<instructions>\\n\";\n prompt +=\n \"Analyze the codebase and create a detailed implementation plan. Use the template structure below, filling each section with specific, actionable information.\\n\";\n prompt += \"</instructions>\\n\\n\";\n prompt += \"<plan_template>\\n\";\n prompt += planTemplate;\n prompt += \"\\n</plan_template>\";\n\n return prompt;\n }\n\n async buildExecutionPrompt(\n task: Task,\n repositoryPath?: string,\n ): Promise<string> {\n // Process file references in description\n const { description: descriptionAfterFiles, referencedFiles } =\n await this.processFileReferences(task.description, repositoryPath);\n\n // Process URL references in description\n const { description: processedDescription, referencedResources } =\n await this.processUrlReferences(descriptionAfterFiles);\n\n let prompt = \"<task>\\n\";\n prompt += `<title>${task.title}</title>\\n`;\n prompt += `<description>${processedDescription}</description>\\n`;\n\n if (task.repository) {\n prompt += `<repository>${task.repository}</repository>\\n`;\n }\n prompt += \"</task>\\n\";\n\n // Add referenced files from @ mentions\n if (referencedFiles.length > 0) {\n prompt += \"\\n<referenced_files>\\n\";\n for (const file of referencedFiles) {\n prompt += `<file path=\"${file.path}\">\\n\\`\\`\\`\\n${file.content}\\n\\`\\`\\`\\n</file>\\n`;\n }\n prompt += \"</referenced_files>\\n\";\n }\n\n // Add referenced resources from URL mentions\n if (referencedResources.length > 0) {\n prompt += \"\\n<referenced_resources>\\n\";\n for (const resource of referencedResources) {\n prompt += `<resource type=\"${resource.type}\" url=\"${resource.url}\">\\n`;\n prompt += `<title>${resource.title}</title>\\n`;\n prompt += `<content>${resource.content}</content>\\n`;\n prompt += \"</resource>\\n\";\n }\n prompt += \"</referenced_resources>\\n\";\n }\n\n try {\n const taskFiles = await this.getTaskFiles(task.id);\n const hasPlan = taskFiles.some((f: SupportingFile) => f.type === \"plan\");\n const todosFile = taskFiles.find(\n (f: SupportingFile) => f.name === \"todos.json\",\n );\n\n if (taskFiles.length > 0) {\n prompt += \"\\n<context>\\n\";\n for (const file of taskFiles) {\n if (file.type === \"plan\") {\n prompt += `<plan>\\n${file.content}\\n</plan>\\n`;\n } else if (file.name === \"todos.json\") {\n } else {\n prompt += `<file name=\"${file.name}\" type=\"${file.type}\">\\n${file.content}\\n</file>\\n`;\n }\n }\n prompt += \"</context>\\n\";\n }\n\n // Add todos context if resuming work\n if (todosFile) {\n try {\n const todos = JSON.parse(todosFile.content);\n if (todos.items && todos.items.length > 0) {\n prompt += \"\\n<previous_todos>\\n\";\n prompt +=\n \"You previously created the following todo list for this task:\\n\\n\";\n for (const item of todos.items) {\n const statusIcon =\n item.status === \"completed\"\n ? \"✓\"\n : item.status === \"in_progress\"\n ? \"▶\"\n : \"○\";\n prompt += `${statusIcon} [${item.status}] ${item.content}\\n`;\n }\n prompt += `\\nProgress: ${todos.metadata.completed}/${todos.metadata.total} completed\\n`;\n prompt +=\n \"\\nYou can reference this list when resuming work or create an updated list as needed.\\n\";\n prompt += \"</previous_todos>\\n\";\n }\n } catch (error) {\n this.logger.debug(\"Failed to parse todos.json for context\", {\n error,\n });\n }\n }\n\n prompt += \"\\n<instructions>\\n\";\n if (hasPlan) {\n prompt +=\n \"Implement the changes described in the execution plan. Follow the plan step-by-step and make the necessary file modifications.\\n\";\n } else {\n prompt +=\n \"Implement the changes described in the task. Make the necessary file modifications to complete the task.\\n\";\n }\n prompt += \"</instructions>\";\n } catch (_error) {\n this.logger.debug(\"No supporting files found for execution\", {\n taskId: task.id,\n });\n prompt += \"\\n<instructions>\\n\";\n prompt += \"Implement the changes described in the task.\\n\";\n prompt += \"</instructions>\";\n }\n\n return prompt;\n }\n}\n","import type { PostHogAPIClient, TaskRunUpdate } from \"./posthog-api.js\";\nimport type { StoredNotification, TaskRun } from \"./types.js\";\nimport { Logger } from \"./utils/logger.js\";\n\nexport interface SessionPersistenceConfig {\n taskId: string;\n runId: string;\n logUrl: string;\n sdkSessionId?: string;\n}\n\nexport class SessionStore {\n private posthogAPI?: PostHogAPIClient;\n private pendingEntries: Map<string, StoredNotification[]> = new Map();\n private flushTimeouts: Map<string, NodeJS.Timeout> = new Map();\n private configs: Map<string, SessionPersistenceConfig> = new Map();\n private logger: Logger;\n\n constructor(posthogAPI?: PostHogAPIClient, logger?: Logger) {\n this.posthogAPI = posthogAPI;\n this.logger =\n logger ?? new Logger({ debug: false, prefix: \"[SessionStore]\" });\n\n // Flush all pending on process exit\n const flushAllAndExit = async () => {\n const flushPromises: Promise<void>[] = [];\n for (const sessionId of this.configs.keys()) {\n flushPromises.push(this.flush(sessionId));\n }\n await Promise.all(flushPromises);\n process.exit(0);\n };\n\n process.on(\"beforeExit\", () => {\n flushAllAndExit().catch((e) => this.logger.error(\"Flush failed:\", e));\n });\n process.on(\"SIGINT\", () => {\n flushAllAndExit().catch((e) => this.logger.error(\"Flush failed:\", e));\n });\n process.on(\"SIGTERM\", () => {\n flushAllAndExit().catch((e) => this.logger.error(\"Flush failed:\", e));\n });\n }\n\n /** Register a session for persistence */\n register(sessionId: string, config: SessionPersistenceConfig): void {\n this.configs.set(sessionId, config);\n }\n\n /** Unregister and flush pending */\n async unregister(sessionId: string): Promise<void> {\n await this.flush(sessionId);\n this.configs.delete(sessionId);\n }\n\n /** Check if a session is registered for persistence */\n isRegistered(sessionId: string): boolean {\n return this.configs.has(sessionId);\n }\n\n /**\n * Append a raw JSON-RPC line for persistence.\n * Parses and wraps as StoredNotification for the API.\n */\n appendRawLine(sessionId: string, line: string): void {\n const config = this.configs.get(sessionId);\n if (!config) {\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 const pending = this.pendingEntries.get(sessionId) ?? [];\n pending.push(entry);\n this.pendingEntries.set(sessionId, pending);\n\n this.scheduleFlush(sessionId);\n } catch {\n this.logger.warn(\"Failed to parse raw line for persistence\", {\n sessionId,\n lineLength: line.length,\n });\n }\n }\n\n /** Load raw JSON-RPC messages from S3 */\n async load(logUrl: string): Promise<StoredNotification[]> {\n const response = await fetch(logUrl);\n\n if (!response.ok) {\n return [];\n }\n\n const content = await response.text();\n if (!content.trim()) return [];\n\n return content\n .trim()\n .split(\"\\n\")\n .map((line) => {\n try {\n return JSON.parse(line) as StoredNotification;\n } catch {\n return null;\n }\n })\n .filter((entry): entry is StoredNotification => entry !== null);\n }\n\n /**\n * Poll S3 for new entries since last check.\n * Used for interrupt handling in cloud mode.\n */\n async pollForNewEntries(\n sessionId: string,\n lastKnownCount: number,\n ): Promise<StoredNotification[]> {\n const config = this.configs.get(sessionId);\n if (!config?.logUrl) return [];\n\n const entries = await this.load(config.logUrl);\n return entries.slice(lastKnownCount);\n }\n\n /** Force flush pending entries */\n async flush(sessionId: string): Promise<void> {\n const config = this.configs.get(sessionId);\n const pending = this.pendingEntries.get(sessionId);\n\n if (!config || !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 if (!this.posthogAPI) {\n this.logger.debug(\"No PostHog API configured, skipping flush\");\n return;\n }\n\n try {\n await this.posthogAPI.appendTaskRunLog(\n config.taskId,\n config.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 /** Get the persistence config for a session */\n getConfig(sessionId: string): SessionPersistenceConfig | undefined {\n return this.configs.get(sessionId);\n }\n\n /**\n * Start a session for persistence.\n * Loads the task run and updates status to \"in_progress\".\n */\n async start(\n sessionId: string,\n taskId: string,\n runId: string,\n ): Promise<TaskRun | undefined> {\n if (!this.posthogAPI) {\n this.logger.debug(\n \"No PostHog API configured, registering session without persistence\",\n );\n this.register(sessionId, {\n taskId,\n runId,\n logUrl: \"\",\n });\n return undefined;\n }\n\n const taskRun = await this.posthogAPI.getTaskRun(taskId, runId);\n\n this.register(sessionId, {\n taskId,\n runId,\n logUrl: taskRun.log_url,\n });\n\n await this.updateTaskRun(sessionId, { status: \"in_progress\" });\n\n return taskRun;\n }\n\n /**\n * Mark a session as completed.\n */\n async complete(sessionId: string): Promise<void> {\n await this.flush(sessionId);\n await this.updateTaskRun(sessionId, { status: \"completed\" });\n }\n\n /**\n * Mark a session as failed.\n */\n async fail(sessionId: string, error: Error | string): Promise<void> {\n await this.flush(sessionId);\n const message = typeof error === \"string\" ? error : error.message;\n await this.updateTaskRun(sessionId, {\n status: \"failed\",\n error_message: message,\n });\n this.logger.error(\"Session failed\", { sessionId, error: message });\n }\n\n /**\n * Update the task run associated with a session.\n */\n async updateTaskRun(\n sessionId: string,\n update: TaskRunUpdate,\n ): Promise<TaskRun | undefined> {\n const config = this.configs.get(sessionId);\n if (!config) {\n this.logger.error(\n `Cannot update task run: session ${sessionId} not registered`,\n );\n return undefined;\n }\n\n if (!this.posthogAPI) {\n this.logger.debug(\"No PostHog API configured, skipping task run update\");\n return undefined;\n }\n\n try {\n return await this.posthogAPI.updateTaskRun(\n config.taskId,\n config.runId,\n update,\n );\n } catch (error) {\n this.logger.error(\"Failed to update task run:\", error);\n return undefined;\n }\n }\n}\n","import { randomBytes } from \"node:crypto\";\n\nexport interface TaskExecutionState {\n taskId: string;\n status: \"running\" | \"completed\" | \"failed\" | \"canceled\" | \"timeout\";\n mode: \"plan_only\" | \"plan_and_build\" | \"build_only\";\n result?: unknown;\n startedAt: number;\n completedAt?: number;\n abortController?: AbortController;\n}\n\nexport class TaskManager {\n public executionStates = new Map<string, TaskExecutionState>();\n private defaultTimeout = 10 * 60 * 1000; // 10 minutes\n\n generateExecutionId(): string {\n return randomBytes(16).toString(\"hex\");\n }\n\n startExecution(\n taskId: string,\n mode: \"plan_only\" | \"plan_and_build\" | \"build_only\",\n executionId: string = this.generateExecutionId(),\n ): TaskExecutionState {\n const executionState: TaskExecutionState = {\n taskId,\n status: \"running\",\n mode,\n startedAt: Date.now(),\n abortController: new AbortController(),\n };\n\n this.executionStates.set(executionId, executionState);\n this.scheduleTimeout(executionId);\n\n return executionState;\n }\n\n async waitForCompletion(executionId: string): Promise<unknown> {\n const execution = this.executionStates.get(executionId);\n if (!execution) {\n throw new Error(`Execution ${executionId} not found`);\n }\n\n if (execution.result && execution.status === \"completed\") {\n return execution.result;\n }\n\n return new Promise((resolve, reject) => {\n const checkInterval = setInterval(() => {\n const currentExecution = this.executionStates.get(executionId);\n if (!currentExecution) {\n clearInterval(checkInterval);\n reject(new Error(`Execution ${executionId} disappeared`));\n return;\n }\n\n if (\n currentExecution.status === \"completed\" &&\n currentExecution.result\n ) {\n clearInterval(checkInterval);\n resolve(currentExecution.result);\n } else if (\n currentExecution.status === \"failed\" ||\n currentExecution.status === \"canceled\" ||\n currentExecution.status === \"timeout\"\n ) {\n clearInterval(checkInterval);\n reject(\n new Error(`Execution ${executionId} ${currentExecution.status}`),\n );\n }\n }, 100);\n });\n }\n\n completeExecution(executionId: string, result: unknown): void {\n const execution = this.executionStates.get(executionId);\n if (!execution) {\n throw new Error(`Execution ${executionId} not found`);\n }\n\n execution.status = \"completed\";\n execution.result = result;\n execution.completedAt = Date.now();\n }\n\n failExecution(executionId: string, error: Error): void {\n const execution = this.executionStates.get(executionId);\n if (!execution) {\n throw new Error(`Execution ${executionId} not found`);\n }\n\n execution.status = \"failed\";\n execution.completedAt = Date.now();\n execution.result = {\n error: error.message,\n status: \"failed\",\n };\n }\n\n cancelExecution(executionId: string): void {\n const execution = this.executionStates.get(executionId);\n if (!execution) {\n throw new Error(`Execution ${executionId} not found`);\n }\n\n execution.status = \"canceled\";\n execution.completedAt = Date.now();\n execution.abortController?.abort();\n\n if (!execution.result) {\n execution.result = {\n status: \"canceled\",\n message: \"Execution was canceled\",\n };\n }\n }\n\n getExecution(executionId: string): TaskExecutionState | undefined {\n return this.executionStates.get(executionId);\n }\n\n getAbortSignal(executionId: string): AbortSignal | undefined {\n return this.executionStates.get(executionId)?.abortController?.signal;\n }\n\n getAbortController(executionId: string): AbortController | undefined {\n return this.executionStates.get(executionId)?.abortController;\n }\n\n private scheduleTimeout(\n executionId: string,\n timeout: number = this.defaultTimeout,\n ): void {\n setTimeout(() => {\n const execution = this.executionStates.get(executionId);\n if (execution && execution.status === \"running\") {\n execution.status = \"timeout\";\n execution.completedAt = Date.now();\n execution.abortController?.abort();\n\n if (!execution.result) {\n execution.result = {\n status: \"timeout\",\n message: \"Execution timed out\",\n };\n }\n }\n }, timeout);\n }\n\n cleanup(olderThan: number = 60 * 60 * 1000): void {\n const cutoff = Date.now() - olderThan;\n for (const [executionId, execution] of this.executionStates) {\n if (execution.completedAt && execution.completedAt < cutoff) {\n this.executionStates.delete(executionId);\n }\n }\n }\n}\n","import { existsSync, promises as fs } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { Logger } from \"./utils/logger\";\n\nconst logger = new Logger({ prefix: \"[TemplateManager]\" });\n\nexport interface TemplateVariables {\n task_id: string;\n task_title: string;\n task_description?: string;\n date: string;\n repository?: string;\n [key: string]: string | undefined;\n}\n\nexport class TemplateManager {\n private templatesDir: string;\n\n constructor() {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n\n // Exhaustive list of possible template locations\n const candidateDirs = [\n // Standard build output (dist/src/template-manager.js -> dist/templates)\n join(__dirname, \"..\", \"templates\"),\n\n // If preserveModules creates nested structure (dist/src/template-manager.js -> dist/src/templates)\n join(__dirname, \"templates\"),\n\n // Development scenarios (src/template-manager.ts -> src/templates)\n join(__dirname, \"..\", \"..\", \"src\", \"templates\"),\n\n // Package root templates directory\n join(__dirname, \"..\", \"..\", \"templates\"),\n\n // When node_modules symlink or installed (node_modules/@posthog/agent/dist/src/... -> node_modules/@posthog/agent/dist/templates)\n join(__dirname, \"..\", \"..\", \"dist\", \"templates\"),\n\n // When consumed from node_modules deep in tree\n join(__dirname, \"..\", \"..\", \"..\", \"templates\"),\n join(__dirname, \"..\", \"..\", \"..\", \"dist\", \"templates\"),\n join(__dirname, \"..\", \"..\", \"..\", \"src\", \"templates\"),\n\n // When bundled by Vite/Webpack (e.g., .vite/build/index.js -> node_modules/@posthog/agent/dist/templates)\n // Try to find node_modules from current location\n join(\n __dirname,\n \"..\",\n \"node_modules\",\n \"@posthog\",\n \"agent\",\n \"dist\",\n \"templates\",\n ),\n join(\n __dirname,\n \"..\",\n \"..\",\n \"node_modules\",\n \"@posthog\",\n \"agent\",\n \"dist\",\n \"templates\",\n ),\n join(\n __dirname,\n \"..\",\n \"..\",\n \"..\",\n \"node_modules\",\n \"@posthog\",\n \"agent\",\n \"dist\",\n \"templates\",\n ),\n ];\n\n const resolvedDir = candidateDirs.find((dir) => existsSync(dir));\n\n if (!resolvedDir) {\n logger.error(\"Could not find templates directory.\");\n logger.error(`Current file: ${__filename}`);\n logger.error(`Current dir: ${__dirname}`);\n logger.error(\n `Tried: ${candidateDirs.map((d) => `\\n - ${d} (exists: ${existsSync(d)})`).join(\"\")}`,\n );\n }\n\n this.templatesDir = resolvedDir ?? candidateDirs[0];\n }\n\n private async loadTemplate(templateName: string): Promise<string> {\n try {\n const templatePath = join(this.templatesDir, templateName);\n return await fs.readFile(templatePath, \"utf8\");\n } catch (error) {\n throw new Error(\n `Failed to load template ${templateName} from ${this.templatesDir}: ${error}`,\n );\n }\n }\n\n private substituteVariables(\n template: string,\n variables: TemplateVariables,\n ): string {\n let result = template;\n\n for (const [key, value] of Object.entries(variables)) {\n if (value !== undefined) {\n const placeholder = new RegExp(`{{${key}}}`, \"g\");\n result = result.replace(placeholder, value);\n }\n }\n\n result = result.replace(/{{[^}]+}}/g, \"[PLACEHOLDER]\");\n\n return result;\n }\n\n async generatePlan(variables: TemplateVariables): Promise<string> {\n const template = await this.loadTemplate(\"plan-template.md\");\n return this.substituteVariables(template, {\n ...variables,\n date: variables.date || new Date().toISOString().split(\"T\")[0],\n });\n }\n\n async generateCustomFile(\n templateName: string,\n variables: TemplateVariables,\n ): Promise<string> {\n const template = await this.loadTemplate(templateName);\n return this.substituteVariables(template, {\n ...variables,\n date: variables.date || new Date().toISOString().split(\"T\")[0],\n });\n }\n\n async createTaskStructure(\n taskId: string,\n taskTitle: string,\n options?: {\n includePlan?: boolean;\n additionalFiles?: Array<{\n name: string;\n template?: string;\n content?: string;\n }>;\n },\n ): Promise<\n Array<{\n name: string;\n content: string;\n type: \"plan\" | \"context\" | \"reference\" | \"output\";\n }>\n > {\n const files: Array<{\n name: string;\n content: string;\n type: \"plan\" | \"context\" | \"reference\" | \"output\";\n }> = [];\n\n const variables: TemplateVariables = {\n task_id: taskId,\n task_title: taskTitle,\n date: new Date().toISOString().split(\"T\")[0],\n };\n\n // Generate plan file if requested\n if (options?.includePlan !== false) {\n const planContent = await this.generatePlan(variables);\n files.push({\n name: \"plan.md\",\n content: planContent,\n type: \"plan\",\n });\n }\n\n if (options?.additionalFiles) {\n for (const file of options.additionalFiles) {\n let content: string;\n\n if (file.template) {\n content = await this.generateCustomFile(file.template, variables);\n } else if (file.content) {\n content = this.substituteVariables(file.content, variables);\n } else {\n content = `# ${file.name}\\n\\nPlaceholder content for ${file.name}`;\n }\n\n files.push({\n name: file.name,\n content,\n type: file.name.includes(\"context\") ? \"context\" : \"reference\",\n });\n }\n }\n\n return files;\n }\n\n generatePostHogReadme(): string {\n return `# PostHog Task Files\n\nThis directory contains task-related files generated by the PostHog Agent.\n\n## Structure\n\nEach task has its own subdirectory: \\`.posthog/{task-id}/\\`\n\n### Common Files\n\n- **plan.md** - Implementation plan generated during planning phase\n- **Supporting files** - Any additional files added for task context\n- **artifacts/** - Generated files, outputs, and temporary artifacts\n\n### Usage\n\nThese files are:\n- Version controlled alongside your code\n- Used by the PostHog Agent for context\n- Available for review in pull requests\n- Organized by task ID for easy reference\n\n### Gitignore\n\nCustomize \\`.posthog/.gitignore\\` to control which files are committed:\n- Include plans and documentation by default\n- Exclude temporary files and sensitive data\n- Customize based on your team's needs\n\n---\n\n*Generated by PostHog Agent*\n`;\n }\n}\n","import { query } from \"@anthropic-ai/claude-agent-sdk\";\nimport { POSTHOG_NOTIFICATIONS } from \"../../acp-extensions.js\";\nimport { EXECUTION_SYSTEM_PROMPT } from \"../../agents/execution.js\";\nimport { TodoManager } from \"../../todo-manager.js\";\nimport { PermissionMode } from \"../../types.js\";\nimport type { WorkflowStepRunner } from \"../types.js\";\n\nexport const buildStep: WorkflowStepRunner = async ({ step, context }) => {\n const {\n task,\n cwd,\n options,\n logger,\n promptBuilder,\n sessionId,\n mcpServers,\n gitManager,\n sendNotification,\n } = context;\n\n const stepLogger = logger.child(\"BuildStep\");\n\n const latestRun = task.latest_run;\n const prExists =\n latestRun?.output && typeof latestRun.output === \"object\"\n ? (latestRun.output as Record<string, unknown>).pr_url\n : null;\n\n if (prExists) {\n stepLogger.info(\"PR already exists, skipping build phase\", {\n taskId: task.id,\n });\n return { status: \"skipped\" };\n }\n\n stepLogger.info(\"Starting build phase\", { taskId: task.id });\n await sendNotification(POSTHOG_NOTIFICATIONS.PHASE_START, {\n sessionId,\n phase: \"build\",\n });\n\n const executionPrompt = await promptBuilder.buildExecutionPrompt(task, cwd);\n const fullPrompt = `${EXECUTION_SYSTEM_PROMPT}\\n\\n${executionPrompt}`;\n\n const configuredPermissionMode =\n options.permissionMode ??\n (typeof step.permissionMode === \"string\"\n ? (step.permissionMode as PermissionMode)\n : step.permissionMode) ??\n PermissionMode.ACCEPT_EDITS;\n\n const baseOptions: Record<string, unknown> = {\n model: step.model,\n cwd,\n permissionMode: configuredPermissionMode,\n settingSources: [\"local\"],\n mcpServers,\n // Allow all tools for build phase - full read/write access needed for implementation\n allowedTools: [\n \"Task\",\n \"Bash\",\n \"BashOutput\",\n \"KillBash\",\n \"Edit\",\n \"Read\",\n \"Write\",\n \"Glob\",\n \"Grep\",\n \"NotebookEdit\",\n \"WebFetch\",\n \"WebSearch\",\n \"ListMcpResources\",\n \"ReadMcpResource\",\n \"TodoWrite\",\n ],\n };\n\n // Add fine-grained permission hook if provided\n if (options.canUseTool) {\n baseOptions.canUseTool = options.canUseTool;\n }\n\n const response = query({\n prompt: fullPrompt,\n options: { ...baseOptions, ...(options.queryOverrides || {}) },\n });\n\n // Track commits made during Claude Code execution\n const commitTracker = await gitManager.trackCommitsDuring();\n\n // Track todos from TodoWrite tool calls\n const todoManager = new TodoManager(context.fileManager, stepLogger);\n\n try {\n for await (const message of response) {\n const todoList = await todoManager.checkAndPersistFromMessage(\n message,\n task.id,\n );\n if (todoList) {\n await sendNotification(POSTHOG_NOTIFICATIONS.ARTIFACT, {\n sessionId,\n kind: \"todos\",\n content: todoList,\n });\n }\n }\n } catch (error) {\n stepLogger.error(\"Error during build step query\", error);\n throw error;\n }\n\n // Finalize: commit any remaining changes and optionally push\n const { commitCreated, pushedBranch } = await commitTracker.finalize({\n commitMessage: `Implementation for ${task.title}`,\n push: step.push,\n });\n\n context.stepResults[step.id] = { commitCreated };\n\n if (!commitCreated) {\n stepLogger.warn(\"No changes to commit in build phase\", { taskId: task.id });\n } else {\n stepLogger.info(\"Build commits finalized\", {\n taskId: task.id,\n pushedBranch,\n });\n }\n\n await sendNotification(POSTHOG_NOTIFICATIONS.PHASE_COMPLETE, {\n sessionId,\n phase: \"build\",\n });\n return { status: \"completed\" };\n};\n","export const EXECUTION_SYSTEM_PROMPT = `<role>\nPostHog AI Execution Agent — autonomously implement tasks as merge-ready code following project conventions.\n</role>\n\n<context>\nYou have access to local repository files and PostHog MCP server. Work primarily with local files for implementation. Commit changes regularly.\n</context>\n\n<constraints>\n- Follow existing code style, patterns, and conventions found in the repository\n- Minimize new external dependencies — only add when necessary\n- Implement structured logging and error handling (never log secrets)\n- Avoid destructive shell commands\n- Create/update .gitignore to exclude build artifacts, dependencies, and temp files\n</constraints>\n\n<approach>\n1. Review the implementation plan if provided, or create your own todo list\n2. Execute changes step by step\n3. Test thoroughly and verify functionality\n4. Commit changes with clear messages\n</approach>\n\n<checklist>\nBefore completing the task, verify:\n- .gitignore includes build artifacts, node_modules, __pycache__, etc.\n- Dependency files (package.json, requirements.txt) use exact versions\n- Code compiles and tests pass\n- Added or updated relevant tests\n- Captured meaningful events with PostHog SDK where appropriate\n- Wrapped new logic in PostHog feature flags where appropriate\n- Updated documentation, README, or type hints as needed\n</checklist>\n\n<output_format>\nProvide a concise summary of changes made when finished.\n</output_format>`;\n","import type { PostHogFileManager } from \"./file-manager.js\";\nimport { Logger } from \"./utils/logger.js\";\n\nexport interface TodoItem {\n content: string;\n status: \"pending\" | \"in_progress\" | \"completed\";\n activeForm: string;\n}\n\nexport interface TodoList {\n items: TodoItem[];\n metadata: {\n total: number;\n pending: number;\n in_progress: number;\n completed: number;\n last_updated: string;\n };\n}\n\nexport class TodoManager {\n private fileManager: PostHogFileManager;\n private logger: Logger;\n\n constructor(fileManager: PostHogFileManager, logger?: Logger) {\n this.fileManager = fileManager;\n this.logger =\n logger || new Logger({ debug: false, prefix: \"[TodoManager]\" });\n }\n\n async readTodos(taskId: string): Promise<TodoList | null> {\n try {\n const content = await this.fileManager.readTaskFile(taskId, \"todos.json\");\n if (!content) {\n return null;\n }\n\n const parsed = JSON.parse(content) as TodoList;\n this.logger.debug(\"Loaded todos\", {\n taskId,\n total: parsed.metadata.total,\n pending: parsed.metadata.pending,\n in_progress: parsed.metadata.in_progress,\n completed: parsed.metadata.completed,\n });\n\n return parsed;\n } catch (error) {\n this.logger.debug(\"Failed to read todos.json\", {\n taskId,\n error: error instanceof Error ? error.message : String(error),\n });\n return null;\n }\n }\n\n async writeTodos(taskId: string, todos: TodoList): Promise<void> {\n this.logger.debug(\"Writing todos\", {\n taskId,\n total: todos.metadata.total,\n pending: todos.metadata.pending,\n in_progress: todos.metadata.in_progress,\n completed: todos.metadata.completed,\n });\n\n await this.fileManager.writeTaskFile(taskId, {\n name: \"todos.json\",\n content: JSON.stringify(todos, null, 2),\n type: \"artifact\",\n });\n\n this.logger.info(\"Todos saved\", {\n taskId,\n total: todos.metadata.total,\n completed: todos.metadata.completed,\n });\n }\n\n parseTodoWriteInput(toolInput: Record<string, unknown>): TodoList {\n const items: TodoItem[] = [];\n\n if (toolInput.todos && Array.isArray(toolInput.todos)) {\n for (const todo of toolInput.todos) {\n items.push({\n content: todo.content || \"\",\n status: todo.status || \"pending\",\n activeForm: todo.activeForm || todo.content || \"\",\n });\n }\n }\n\n const metadata = this.calculateMetadata(items);\n\n return { items, metadata };\n }\n\n private calculateMetadata(items: TodoItem[]): TodoList[\"metadata\"] {\n const total = items.length;\n const pending = items.filter((t) => t.status === \"pending\").length;\n const in_progress = items.filter((t) => t.status === \"in_progress\").length;\n const completed = items.filter((t) => t.status === \"completed\").length;\n\n return {\n total,\n pending,\n in_progress,\n completed,\n last_updated: new Date().toISOString(),\n };\n }\n\n async getTodoContext(taskId: string): Promise<string> {\n const todos = await this.readTodos(taskId);\n if (!todos || todos.items.length === 0) {\n return \"\";\n }\n\n const lines: string[] = [\"## Previous Todo List\\n\"];\n lines.push(\"You previously created the following todo list:\\n\");\n\n for (const item of todos.items) {\n const statusIcon =\n item.status === \"completed\"\n ? \"✓\"\n : item.status === \"in_progress\"\n ? \"▶\"\n : \"○\";\n lines.push(`${statusIcon} [${item.status}] ${item.content}`);\n }\n\n lines.push(\n `\\nProgress: ${todos.metadata.completed}/${todos.metadata.total} completed\\n`,\n );\n\n return lines.join(\"\\n\");\n }\n\n // check for TodoWrite tool call and persist if found\n async checkAndPersistFromMessage(\n message: Record<string, unknown>,\n taskId: string,\n ): Promise<TodoList | null> {\n if (\n message.type !== \"assistant\" ||\n typeof message.message !== \"object\" ||\n !message.message ||\n !(\"content\" in message.message) ||\n !Array.isArray(message.message.content)\n ) {\n return null;\n }\n\n for (const block of message.message.content) {\n if (block.type === \"tool_use\" && block.name === \"TodoWrite\") {\n try {\n this.logger.info(\"TodoWrite detected, persisting todos\", { taskId });\n\n const todoList = this.parseTodoWriteInput(block.input);\n await this.writeTodos(taskId, todoList);\n\n this.logger.info(\"Persisted todos successfully\", {\n taskId,\n total: todoList.metadata.total,\n completed: todoList.metadata.completed,\n });\n\n return todoList;\n } catch (error) {\n this.logger.error(\"Failed to persist todos\", {\n taskId,\n error: error instanceof Error ? error.message : String(error),\n });\n return null;\n }\n }\n }\n\n return null;\n }\n}\n","// import and export to keep a single type file\n\nimport type { SessionNotification } from \"@agentclientprotocol/sdk\";\nimport type {\n CanUseTool,\n PermissionResult,\n} from \"@anthropic-ai/claude-agent-sdk\";\nexport type { CanUseTool, PermissionResult, SessionNotification };\n\n/**\n * Stored custom notification following ACP extensibility model.\n * Custom notifications use underscore-prefixed methods (e.g., `_posthog/phase_start`).\n * See: https://agentclientprotocol.com/docs/extensibility\n */\nexport interface StoredNotification {\n type: \"notification\";\n /** When this notification was stored */\n timestamp: string;\n /** JSON-RPC 2.0 notification (no id field = notification, not request) */\n notification: {\n jsonrpc: \"2.0\";\n method: string;\n params?: Record<string, unknown>;\n };\n}\n\n/**\n * Type alias for stored log entries.\n */\nexport type StoredEntry = StoredNotification;\n\n// PostHog Task model (matches Array's OpenAPI schema)\nexport interface Task {\n id: string;\n task_number?: number;\n slug?: string;\n title: string;\n description: string;\n origin_product:\n | \"error_tracking\"\n | \"eval_clusters\"\n | \"user_created\"\n | \"support_queue\"\n | \"session_summaries\";\n github_integration?: number | null;\n repository: string; // Format: \"organization/repository\" (e.g., \"posthog/posthog-js\")\n json_schema?: Record<string, unknown> | null; // JSON schema for task output validation\n created_at: string;\n updated_at: string;\n created_by?: {\n id: number;\n uuid: string;\n distinct_id: string;\n first_name: string;\n email: string;\n };\n latest_run?: TaskRun;\n}\n\n// Log entry structure for TaskRun.log\n\nexport type ArtifactType =\n | \"plan\"\n | \"context\"\n | \"reference\"\n | \"output\"\n | \"artifact\";\n\nexport interface TaskRunArtifact {\n name: string;\n type: ArtifactType;\n size?: number;\n content_type?: string;\n storage_path?: string;\n uploaded_at?: string;\n}\n\nexport type TaskRunStatus =\n | \"not_started\"\n | \"queued\"\n | \"in_progress\"\n | \"completed\"\n | \"failed\"\n | \"cancelled\";\n\nexport type TaskRunEnvironment = \"local\" | \"cloud\";\n\n// TaskRun model - represents individual execution runs of tasks\nexport interface TaskRun {\n id: string;\n task: string; // Task ID\n team: number;\n branch: string | null;\n stage: string | null; // Current stage (e.g., 'research', 'plan', 'build')\n environment: TaskRunEnvironment;\n status: TaskRunStatus;\n log_url: string;\n error_message: string | null;\n output: Record<string, unknown> | null; // Structured output (PR URL, commit SHA, etc.)\n state: Record<string, unknown>; // Intermediate run state (defaults to {}, never null)\n artifacts?: TaskRunArtifact[];\n created_at: string;\n updated_at: string;\n completed_at: string | null;\n}\n\nexport interface SupportingFile {\n name: string;\n content: string;\n type: ArtifactType;\n created_at: string;\n}\n\nexport interface TaskArtifactUploadPayload {\n name: string;\n type: ArtifactType;\n content: string;\n content_type?: string;\n}\n\nexport enum PermissionMode {\n PLAN = \"plan\",\n DEFAULT = \"default\",\n ACCEPT_EDITS = \"acceptEdits\",\n BYPASS = \"bypassPermissions\",\n}\n\nexport interface ExecutionOptions {\n repositoryPath?: string;\n permissionMode?: PermissionMode;\n}\n\nexport interface TaskExecutionOptions {\n repositoryPath?: string;\n permissionMode?: PermissionMode;\n isCloudMode?: boolean; // Determines local vs cloud behavior (local pauses after each phase)\n createPR?: boolean; // Whether to create PR after build (defaults to false)\n autoProgress?: boolean;\n queryOverrides?: Record<string, unknown>;\n // Fine-grained permission control (only applied to build phase)\n // See: https://docs.claude.com/en/api/agent-sdk/permissions\n canUseTool?: CanUseTool;\n skipGitBranch?: boolean; // Skip creating a task-specific git branch\n}\n\nexport interface ExecutionResult {\n // biome-ignore lint/suspicious/noExplicitAny: Results array contains varying SDK response types\n results: any[];\n}\n\nexport interface PlanResult {\n plan: string;\n}\n\nexport interface TaskExecutionResult {\n task: Task;\n plan?: string;\n executionResult?: ExecutionResult;\n}\n\n// MCP Server configuration types (re-exported from Claude SDK for convenience)\nexport type McpServerConfig =\n | {\n type?: \"stdio\";\n command: string;\n args?: string[];\n env?: Record<string, string>;\n }\n | {\n type: \"sse\";\n url: string;\n headers?: Record<string, string>;\n }\n | {\n type: \"http\";\n url: string;\n headers?: Record<string, string>;\n }\n | {\n type: \"sdk\";\n name: string;\n // biome-ignore lint/suspicious/noExplicitAny: McpServer instance type from external SDK\n instance?: any;\n };\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport type OnLogCallback = (\n level: LogLevel,\n scope: string,\n message: string,\n data?: unknown,\n) => void;\n\nexport interface AgentConfig {\n workingDirectory?: string;\n\n // PostHog API configuration (optional - enables PostHog integration when provided)\n posthogApiUrl?: string;\n posthogApiKey?: string;\n posthogProjectId?: number;\n\n // PostHog MCP configuration\n posthogMcpUrl?: string;\n\n // MCP Server configuration\n // Additional MCP servers (PostHog MCP is always included by default)\n // You can override the PostHog MCP config by providing mcpServers.posthog\n mcpServers?: Record<string, McpServerConfig>;\n\n // Logging configuration\n debug?: boolean;\n onLog?: OnLogCallback;\n\n // Fine-grained permission control for direct run() calls\n // See: https://docs.claude.com/en/api/agent-sdk/permissions\n canUseTool?: CanUseTool;\n}\n\nexport interface PostHogAPIConfig {\n apiUrl: string;\n apiKey: string;\n projectId: number;\n}\n\n// URL mention types\nexport type ResourceType =\n | \"error\"\n | \"experiment\"\n | \"insight\"\n | \"feature_flag\"\n | \"generic\";\n\nexport interface PostHogResource {\n type: ResourceType;\n id: string;\n url: string;\n title?: string;\n content: string;\n // biome-ignore lint/suspicious/noExplicitAny: Metadata contains varying resource-specific fields\n metadata?: Record<string, any>;\n}\n\nexport interface UrlMention {\n url: string;\n type: ResourceType;\n id?: string;\n label?: string;\n}\n\n// Research evaluation types\nexport interface ResearchQuestion {\n id: string;\n question: string;\n options: string[];\n}\n\nexport interface ResearchAnswer {\n questionId: string;\n selectedOption: string;\n customInput?: string;\n}\n\nexport interface ResearchEvaluation {\n actionabilityScore: number; // 0-1 confidence score\n context: string; // brief summary for planning\n keyFiles: string[]; // files needing modification\n blockers?: string[]; // what's preventing full confidence\n questions?: ResearchQuestion[]; // only if score < 0.7\n answered?: boolean; // whether questions have been answered\n answers?: ResearchAnswer[]; // user's answers to questions\n}\n\n// Worktree types for parallel task development\nexport interface WorktreeInfo {\n worktreePath: string;\n worktreeName: string;\n branchName: string;\n baseBranch: string;\n createdAt: string;\n}\n","import type { WorkflowRuntime, WorkflowStepDefinition } from \"./types.js\";\n\ninterface FinalizeGitOptions {\n commitMessage: string;\n allowEmptyCommit?: boolean;\n}\n\n/**\n * Commits (and optionally pushes) any staged changes according to the step configuration.\n * Returns true if a commit was created.\n */\nexport async function finalizeStepGitActions(\n context: WorkflowRuntime,\n step: WorkflowStepDefinition,\n options: FinalizeGitOptions,\n): Promise<boolean> {\n if (!step.commit) {\n return false;\n }\n\n const { gitManager, logger } = context;\n const hasStagedChanges = await gitManager.hasStagedChanges();\n\n if (!hasStagedChanges && !options.allowEmptyCommit) {\n logger.debug(\"No staged changes to commit for step\", { stepId: step.id });\n return false;\n }\n\n try {\n await gitManager.commitChanges(options.commitMessage);\n logger.info(\"Committed changes for step\", {\n stepId: step.id,\n message: options.commitMessage,\n });\n } catch (error) {\n logger.error(\"Failed to commit changes for step\", {\n stepId: step.id,\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n\n if (step.push) {\n const branchName = await gitManager.getCurrentBranch();\n await gitManager.pushBranch(branchName);\n logger.info(\"Pushed branch after step\", {\n stepId: step.id,\n branch: branchName,\n });\n }\n\n return true;\n}\n","import type { LocalArtifact } from \"../../file-manager.js\";\nimport type { Task, TaskRunArtifact } from \"../../types.js\";\nimport type { WorkflowStepRunner } from \"../types.js\";\nimport { finalizeStepGitActions } from \"../utils.js\";\n\nconst MAX_SNIPPET_LENGTH = 1200;\n\nexport const finalizeStep: WorkflowStepRunner = async ({ step, context }) => {\n const { task, logger, fileManager, gitManager, posthogAPI, runId } = context;\n\n const stepLogger = logger.child(\"FinalizeStep\");\n const artifacts = await fileManager.collectTaskArtifacts(task.id);\n let uploadedArtifacts: TaskRunArtifact[] | undefined;\n\n if (artifacts.length && posthogAPI && runId) {\n try {\n const payload = artifacts.map((artifact) => ({\n name: artifact.name,\n type: artifact.type,\n content: artifact.content,\n content_type: artifact.contentType,\n }));\n uploadedArtifacts = await posthogAPI.uploadTaskArtifacts(\n task.id,\n runId,\n payload,\n );\n stepLogger.info(\"Uploaded task artifacts to PostHog\", {\n taskId: task.id,\n uploadedCount: uploadedArtifacts.length,\n });\n } catch (error) {\n stepLogger.warn(\"Failed to upload task artifacts\", {\n taskId: task.id,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n } else {\n stepLogger.debug(\"Skipping artifact upload\", {\n hasArtifacts: artifacts.length > 0,\n hasPostHogApi: Boolean(posthogAPI),\n runId,\n });\n }\n\n const prBody = buildPullRequestBody(task, artifacts, uploadedArtifacts);\n await fileManager.cleanupTaskDirectory(task.id);\n await gitManager.addAllPostHogFiles();\n\n // Commit the deletion of artifacts\n await finalizeStepGitActions(context, step, {\n commitMessage: `Cleanup task artifacts for ${task.title}`,\n allowEmptyCommit: true,\n });\n\n context.stepResults[step.id] = {\n prBody,\n uploadedArtifacts,\n artifactCount: artifacts.length,\n };\n\n return { status: \"completed\" };\n};\n\nfunction buildPullRequestBody(\n task: Task,\n artifacts: LocalArtifact[],\n uploaded?: TaskRunArtifact[],\n): string {\n const lines: string[] = [];\n const taskSlug = (task as unknown as Record<string, unknown>).slug || task.id;\n\n lines.push(\"## Task context\");\n lines.push(`- **Task**: ${taskSlug}`);\n lines.push(`- **Title**: ${task.title}`);\n lines.push(`- **Origin**: ${task.origin_product}`);\n\n if (task.description) {\n lines.push(\"\");\n lines.push(`> ${task.description.trim().split(\"\\n\").join(\"\\n> \")}`);\n }\n\n const usedFiles = new Set<string>();\n\n const contextArtifact = artifacts.find(\n (artifact) => artifact.name === \"context.md\",\n );\n if (contextArtifact) {\n lines.push(\"\");\n lines.push(\"### Task prompt\");\n lines.push(contextArtifact.content);\n usedFiles.add(contextArtifact.name);\n }\n\n const researchArtifact = artifacts.find(\n (artifact) => artifact.name === \"research.json\",\n );\n if (researchArtifact) {\n usedFiles.add(researchArtifact.name);\n const researchSection = formatResearchSection(researchArtifact.content);\n if (researchSection) {\n lines.push(\"\");\n lines.push(researchSection);\n }\n }\n\n const planArtifact = artifacts.find(\n (artifact) => artifact.name === \"plan.md\",\n );\n if (planArtifact) {\n lines.push(\"\");\n lines.push(\"### Implementation plan\");\n lines.push(planArtifact.content);\n usedFiles.add(planArtifact.name);\n }\n\n const todoArtifact = artifacts.find(\n (artifact) => artifact.name === \"todos.json\",\n );\n if (todoArtifact) {\n const summary = summarizeTodos(todoArtifact.content);\n if (summary) {\n lines.push(\"\");\n lines.push(\"### Todo list\");\n lines.push(summary);\n }\n usedFiles.add(todoArtifact.name);\n }\n\n const remainingArtifacts = artifacts.filter(\n (artifact) => !usedFiles.has(artifact.name),\n );\n if (remainingArtifacts.length) {\n lines.push(\"\");\n lines.push(\"### Additional artifacts\");\n for (const artifact of remainingArtifacts) {\n lines.push(`#### ${artifact.name}`);\n lines.push(renderCodeFence(artifact.content));\n }\n }\n\n const artifactList =\n uploaded ??\n artifacts.map((artifact) => ({\n name: artifact.name,\n type: artifact.type,\n }));\n\n if (artifactList.length) {\n lines.push(\"\");\n lines.push(\"### Uploaded artifacts\");\n for (const artifact of artifactList) {\n const rawStoragePath =\n \"storage_path\" in artifact\n ? (artifact as Record<string, unknown>).storage_path\n : undefined;\n const storagePath =\n typeof rawStoragePath === \"string\" ? rawStoragePath : undefined;\n const storage =\n storagePath && storagePath.trim().length > 0\n ? ` – \\`${storagePath.trim()}\\``\n : \"\";\n lines.push(`- ${artifact.name} (${artifact.type})${storage}`);\n }\n }\n\n return lines.join(\"\\n\\n\");\n}\n\nfunction renderCodeFence(content: string): string {\n const snippet = truncate(content, MAX_SNIPPET_LENGTH);\n return [\"```\", snippet, \"```\"].join(\"\\n\");\n}\n\nfunction truncate(value: string, maxLength: number): string {\n if (value.length <= maxLength) {\n return value;\n }\n return `${value.slice(0, maxLength)}\\n…`;\n}\n\nfunction formatResearchSection(content: string): string | null {\n try {\n const parsed = JSON.parse(content);\n const sections: string[] = [];\n\n if (parsed.context) {\n sections.push(\"### Research summary\");\n sections.push(parsed.context);\n }\n\n if (parsed.questions?.length) {\n sections.push(\"\");\n sections.push(\"### Questions needing answers\");\n for (const question of parsed.questions) {\n sections.push(`- ${question.question ?? question}`);\n }\n }\n\n if (parsed.answers?.length) {\n sections.push(\"\");\n sections.push(\"### Answers provided\");\n for (const answer of parsed.answers) {\n const questionId = answer.questionId\n ? ` (Q: ${answer.questionId})`\n : \"\";\n sections.push(\n `- ${answer.selectedOption || answer.customInput || \"answer\"}${questionId}`,\n );\n }\n }\n\n return sections.length ? sections.join(\"\\n\") : null;\n } catch {\n return null;\n }\n}\n\nfunction summarizeTodos(content: string): string | null {\n try {\n const data = JSON.parse(content);\n const total = data?.metadata?.total ?? data?.items?.length;\n const completed =\n data?.metadata?.completed ??\n data?.items?.filter(\n (item: { status?: string }) => item.status === \"completed\",\n ).length;\n\n const lines = [`Progress: ${completed}/${total} completed`];\n\n if (data?.items?.length) {\n for (const item of data.items) {\n lines.push(`- [${item.status}] ${item.content}`);\n }\n }\n\n return lines.join(\"\\n\");\n } catch {\n return null;\n }\n}\n","import { query } from \"@anthropic-ai/claude-agent-sdk\";\nimport { POSTHOG_NOTIFICATIONS } from \"../../acp-extensions.js\";\nimport { PLANNING_SYSTEM_PROMPT } from \"../../agents/planning.js\";\nimport { TodoManager } from \"../../todo-manager.js\";\nimport type { WorkflowStepRunner } from \"../types.js\";\nimport { finalizeStepGitActions } from \"../utils.js\";\n\nexport const planStep: WorkflowStepRunner = async ({ step, context }) => {\n const {\n task,\n cwd,\n isCloudMode,\n options,\n logger,\n fileManager,\n gitManager,\n promptBuilder,\n sessionId,\n mcpServers,\n sendNotification,\n } = context;\n\n const stepLogger = logger.child(\"PlanStep\");\n\n const existingPlan = await fileManager.readPlan(task.id);\n if (existingPlan) {\n stepLogger.info(\"Plan already exists, skipping step\", { taskId: task.id });\n return { status: \"skipped\" };\n }\n\n const researchData = await fileManager.readResearch(task.id);\n if (researchData?.questions && !researchData.answered) {\n stepLogger.info(\"Waiting for answered research questions\", {\n taskId: task.id,\n });\n await sendNotification(POSTHOG_NOTIFICATIONS.PHASE_COMPLETE, {\n sessionId,\n phase: \"research_questions\",\n });\n return { status: \"skipped\", halt: true };\n }\n\n stepLogger.info(\"Starting planning phase\", { taskId: task.id });\n await sendNotification(POSTHOG_NOTIFICATIONS.PHASE_START, {\n sessionId,\n phase: \"planning\",\n });\n let researchContext = \"\";\n if (researchData) {\n researchContext += `## Research Context\\n\\n${researchData.context}\\n\\n`;\n if (researchData.keyFiles.length > 0) {\n researchContext += `**Key Files:**\\n${researchData.keyFiles.map((f) => `- ${f}`).join(\"\\n\")}\\n\\n`;\n }\n if (researchData.blockers && researchData.blockers.length > 0) {\n researchContext += `**Considerations:**\\n${researchData.blockers.map((b) => `- ${b}`).join(\"\\n\")}\\n\\n`;\n }\n\n // Add answered questions if they exist\n if (\n researchData.questions &&\n researchData.answers &&\n researchData.answered\n ) {\n researchContext += `## Implementation Decisions\\n\\n`;\n for (const question of researchData.questions) {\n const answer = researchData.answers.find(\n (a) => a.questionId === question.id,\n );\n\n researchContext += `### ${question.question}\\n\\n`;\n if (answer) {\n researchContext += `**Selected:** ${answer.selectedOption}\\n`;\n if (answer.customInput) {\n researchContext += `**Details:** ${answer.customInput}\\n`;\n }\n } else {\n researchContext += `**Selected:** Not answered\\n`;\n }\n researchContext += `\\n`;\n }\n }\n }\n\n const planningPrompt = await promptBuilder.buildPlanningPrompt(task, cwd);\n const fullPrompt = `${PLANNING_SYSTEM_PROMPT}\\n\\n${planningPrompt}\\n\\n${researchContext}`;\n\n const baseOptions: Record<string, unknown> = {\n model: step.model,\n cwd,\n permissionMode: \"plan\",\n settingSources: [\"local\"],\n mcpServers,\n // Allow research tools: read-only operations, web search, MCP resources, and ExitPlanMode\n allowedTools: [\n \"Read\",\n \"Glob\",\n \"Grep\",\n \"WebFetch\",\n \"WebSearch\",\n \"ListMcpResources\",\n \"ReadMcpResource\",\n \"ExitPlanMode\",\n \"TodoWrite\",\n \"BashOutput\",\n ],\n };\n\n const response = query({\n prompt: fullPrompt,\n options: { ...baseOptions, ...(options.queryOverrides || {}) },\n });\n\n const todoManager = new TodoManager(fileManager, stepLogger);\n\n let planContent = \"\";\n try {\n for await (const message of response) {\n const todoList = await todoManager.checkAndPersistFromMessage(\n message,\n task.id,\n );\n if (todoList) {\n await sendNotification(POSTHOG_NOTIFICATIONS.ARTIFACT, {\n sessionId,\n kind: \"todos\",\n content: todoList,\n });\n }\n\n // Extract text content for plan\n if (message.type === \"assistant\" && message.message?.content) {\n for (const block of message.message.content) {\n if (block.type === \"text\" && block.text) {\n planContent += `${block.text}\\n`;\n }\n }\n }\n }\n } catch (error) {\n stepLogger.error(\"Error during plan step query\", error);\n throw error;\n }\n\n if (planContent.trim()) {\n await fileManager.writePlan(task.id, planContent.trim());\n stepLogger.info(\"Plan completed\", { taskId: task.id });\n }\n\n await gitManager.addAllPostHogFiles();\n await finalizeStepGitActions(context, step, {\n commitMessage: `Planning phase for ${task.title}`,\n });\n\n if (!isCloudMode) {\n await sendNotification(POSTHOG_NOTIFICATIONS.PHASE_COMPLETE, {\n sessionId,\n phase: \"planning\",\n });\n return { status: \"completed\", halt: true };\n }\n\n await sendNotification(POSTHOG_NOTIFICATIONS.PHASE_COMPLETE, {\n sessionId,\n phase: \"planning\",\n });\n return { status: \"completed\" };\n};\n","export const PLANNING_SYSTEM_PROMPT = `<role>\nPostHog AI Planning Agent — analyze codebases and create actionable implementation plans.\n</role>\n\n<constraints>\n- Read-only: analyze files, search code, explore structure\n- No modifications or edits\n- Output ONLY the plan markdown — no preamble, no acknowledgment, no meta-commentary\n</constraints>\n\n<objective>\nCreate a detailed, actionable implementation plan that an execution agent can follow to complete the task successfully.\n</objective>\n\n<process>\n1. Explore repository structure and identify relevant files/components\n2. Understand existing patterns, conventions, and dependencies\n3. Break down task requirements and identify technical constraints\n4. Define step-by-step implementation approach\n5. Specify files to modify/create with exact paths\n6. Identify testing requirements and potential risks\n</process>\n\n<output_format>\nOutput the plan DIRECTLY as markdown with NO preamble text. Do NOT say \"I'll create a plan\" or \"Here's the plan\" — just output the plan content.\n\nRequired sections (follow the template provided in the task prompt):\n- Summary: Brief overview of approach\n- Files to Create/Modify: Specific paths and purposes\n- Implementation Steps: Ordered list of actions\n- Testing Strategy: How to verify it works\n- Considerations: Dependencies, risks, edge cases\n</output_format>\n\n<examples>\n<bad_example>\n\"Sure! I'll create a detailed implementation plan for you to add authentication. Here's what we'll do...\"\nReason: No preamble — output the plan directly\n</bad_example>\n\n<good_example>\n\"# Implementation Plan\n\n## Summary\nAdd JWT-based authentication to API endpoints using existing middleware pattern...\n\n## Files to Modify\n- src/middleware/auth.ts: Add JWT verification\n...\"\nReason: Direct plan output with no meta-commentary\n</good_example>\n</examples>\n\n<context_integration>\nIf research findings, context files, or reference materials are provided:\n- Incorporate research findings into your analysis\n- Follow patterns and approaches identified in research\n- Build upon or refine any existing planning work\n- Reference specific files and components mentioned in context\n</context_integration>`;\n","import { query } from \"@anthropic-ai/claude-agent-sdk\";\nimport { POSTHOG_NOTIFICATIONS } from \"../../acp-extensions.js\";\nimport { RESEARCH_SYSTEM_PROMPT } from \"../../agents/research.js\";\nimport type { ResearchEvaluation } from \"../../types.js\";\nimport type { WorkflowStepRunner } from \"../types.js\";\nimport { finalizeStepGitActions } from \"../utils.js\";\n\nexport const researchStep: WorkflowStepRunner = async ({ step, context }) => {\n const {\n task,\n cwd,\n isCloudMode,\n options,\n logger,\n fileManager,\n gitManager,\n promptBuilder,\n sessionId,\n mcpServers,\n sendNotification,\n } = context;\n\n const stepLogger = logger.child(\"ResearchStep\");\n\n const existingResearch = await fileManager.readResearch(task.id);\n if (existingResearch) {\n stepLogger.info(\"Research already exists\", {\n taskId: task.id,\n hasQuestions: !!existingResearch.questions,\n answered: existingResearch.answered,\n });\n\n // If there are unanswered questions, re-emit them so UI can prompt user\n if (existingResearch.questions && !existingResearch.answered) {\n stepLogger.info(\"Re-emitting unanswered research questions\", {\n taskId: task.id,\n questionCount: existingResearch.questions.length,\n });\n\n await sendNotification(POSTHOG_NOTIFICATIONS.ARTIFACT, {\n sessionId,\n kind: \"research_questions\",\n content: existingResearch.questions,\n });\n\n // In local mode, halt to allow user to answer\n if (!isCloudMode) {\n await sendNotification(POSTHOG_NOTIFICATIONS.PHASE_COMPLETE, {\n sessionId,\n phase: \"research\",\n });\n return { status: \"skipped\", halt: true };\n }\n }\n\n return { status: \"skipped\" };\n }\n\n stepLogger.info(\"Starting research phase\", { taskId: task.id });\n await sendNotification(POSTHOG_NOTIFICATIONS.PHASE_START, {\n sessionId,\n phase: \"research\",\n });\n\n const researchPrompt = await promptBuilder.buildResearchPrompt(task, cwd);\n const fullPrompt = `${RESEARCH_SYSTEM_PROMPT}\\n\\n${researchPrompt}`;\n\n const baseOptions: Record<string, unknown> = {\n model: step.model,\n cwd,\n permissionMode: \"plan\",\n settingSources: [\"local\"],\n mcpServers,\n // Allow research tools: read-only operations, web search, and MCP resources\n allowedTools: [\n \"Read\",\n \"Glob\",\n \"Grep\",\n \"WebFetch\",\n \"WebSearch\",\n \"ListMcpResources\",\n \"ReadMcpResource\",\n \"TodoWrite\",\n \"BashOutput\",\n ],\n };\n\n const response = query({\n prompt: fullPrompt,\n options: { ...baseOptions, ...(options.queryOverrides || {}) },\n });\n\n let jsonContent = \"\";\n try {\n for await (const message of response) {\n // Extract text content from assistant messages\n if (message.type === \"assistant\" && message.message?.content) {\n for (const c of message.message.content) {\n if (c.type === \"text\" && c.text) {\n jsonContent += c.text;\n }\n }\n }\n }\n } catch (error) {\n stepLogger.error(\"Error during research step query\", error);\n throw error;\n }\n\n if (!jsonContent.trim()) {\n stepLogger.error(\"No JSON output from research agent\", { taskId: task.id });\n await sendNotification(POSTHOG_NOTIFICATIONS.ERROR, {\n sessionId,\n message: \"Research agent returned no output\",\n });\n return { status: \"completed\", halt: true };\n }\n\n // Parse JSON response\n let evaluation: ResearchEvaluation;\n try {\n // Extract JSON from potential markdown code blocks or other wrapping\n const jsonMatch = jsonContent.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) {\n throw new Error(\"No JSON object found in response\");\n }\n evaluation = JSON.parse(jsonMatch[0]);\n stepLogger.info(\"Parsed research evaluation\", {\n taskId: task.id,\n score: evaluation.actionabilityScore,\n hasQuestions: !!evaluation.questions,\n });\n } catch (error) {\n stepLogger.error(\"Failed to parse research JSON\", {\n taskId: task.id,\n error: error instanceof Error ? error.message : String(error),\n content: jsonContent.substring(0, 500),\n });\n await sendNotification(POSTHOG_NOTIFICATIONS.ERROR, {\n sessionId,\n message: `Failed to parse research JSON: ${\n error instanceof Error ? error.message : String(error)\n }`,\n });\n return { status: \"completed\", halt: true };\n }\n\n // Add answered/answers fields to evaluation\n if (evaluation.questions && evaluation.questions.length > 0) {\n evaluation.answered = false;\n evaluation.answers = undefined;\n }\n\n // Always write research.json\n await fileManager.writeResearch(task.id, evaluation);\n stepLogger.info(\"Research evaluation written\", {\n taskId: task.id,\n score: evaluation.actionabilityScore,\n hasQuestions: !!evaluation.questions,\n });\n\n await sendNotification(POSTHOG_NOTIFICATIONS.ARTIFACT, {\n sessionId,\n kind: \"research_evaluation\",\n content: evaluation,\n });\n\n await gitManager.addAllPostHogFiles();\n await finalizeStepGitActions(context, step, {\n commitMessage: `Research phase for ${task.title}`,\n });\n\n // Log whether questions need answering\n if (\n evaluation.actionabilityScore < 0.7 &&\n evaluation.questions &&\n evaluation.questions.length > 0\n ) {\n stepLogger.info(\"Actionability score below threshold, questions needed\", {\n taskId: task.id,\n score: evaluation.actionabilityScore,\n questionCount: evaluation.questions.length,\n });\n\n await sendNotification(POSTHOG_NOTIFICATIONS.ARTIFACT, {\n sessionId,\n kind: \"research_questions\",\n content: evaluation.questions,\n });\n } else {\n stepLogger.info(\"Actionability score acceptable, proceeding to planning\", {\n taskId: task.id,\n score: evaluation.actionabilityScore,\n });\n }\n\n // In local mode, always halt after research for user review\n if (!isCloudMode) {\n await sendNotification(POSTHOG_NOTIFICATIONS.PHASE_COMPLETE, {\n sessionId,\n phase: \"research\",\n });\n return { status: \"completed\", halt: true };\n }\n\n // In cloud mode, check if questions need answering\n const researchData = await fileManager.readResearch(task.id);\n if (researchData?.questions && !researchData.answered) {\n // Questions need answering - halt for user input in cloud mode too\n await sendNotification(POSTHOG_NOTIFICATIONS.PHASE_COMPLETE, {\n sessionId,\n phase: \"research\",\n });\n return { status: \"completed\", halt: true };\n }\n\n // No questions or questions already answered - proceed to planning\n await sendNotification(POSTHOG_NOTIFICATIONS.PHASE_COMPLETE, {\n sessionId,\n phase: \"research\",\n });\n return { status: \"completed\" };\n};\n","export const RESEARCH_SYSTEM_PROMPT = `<role>\nPostHog AI Research Agent — analyze codebases to evaluate task actionability and identify missing information.\n</role>\n\n<constraints>\n- Read-only: analyze files, search code, explore structure\n- No modifications or code changes\n- Output structured JSON only\n</constraints>\n\n<objective>\nYour PRIMARY goal is to evaluate whether a task is actionable and assign an actionability score.\n\nCalculate an actionabilityScore (0-1) based on:\n- **Task clarity** (0.4 weight): Is the task description specific and unambiguous?\n- **Codebase context** (0.3 weight): Can you locate the relevant code and patterns?\n- **Architectural decisions** (0.2 weight): Are the implementation approaches clear?\n- **Dependencies** (0.1 weight): Are required dependencies and constraints understood?\n\nIf actionabilityScore < 0.7, generate specific clarifying questions to increase confidence.\n\nQuestions must present complete implementation choices, NOT request information from the user:\noptions: array of strings\n- GOOD: options: [\"Use Redux Toolkit (matches pattern in src/store/)\", \"Zustand (lighter weight)\"]\n- BAD: \"Tell me which state management library to use\"\n- GOOD: options: [\"Place in Button.tsx (existing component)\", \"create NewButton.tsx (separate concerns)?\"]\n- BAD: \"Where should I put this code?\"\n\nDO NOT ask questions like \"how should I fix this\" or \"tell me the pattern\" — present concrete options that can be directly chosen and acted upon.\n</objective>\n\n<process>\n1. Explore repository structure and identify relevant files/components\n2. Understand existing patterns, conventions, and dependencies\n3. Calculate actionabilityScore based on clarity, context, architecture, and dependencies\n4. Identify key files that will need modification\n5. If score < 0.7: generate 2-4 specific questions to resolve blockers\n6. Output JSON matching ResearchEvaluation schema\n</process>\n\n<output_format>\nOutput ONLY valid JSON with no markdown wrappers, no preamble, no explanation:\n\n{\n \"actionabilityScore\": 0.85,\n \"context\": \"Brief 2-3 sentence summary of the task and implementation approach\",\n \"keyFiles\": [\"path/to/file1.ts\", \"path/to/file2.ts\"],\n \"blockers\": [\"Optional: what's preventing full confidence\"],\n \"questions\": [\n {\n \"id\": \"q1\",\n \"question\": \"Specific architectural decision needed?\",\n \"options\": [\n \"First approach with concrete details\",\n \"Alternative approach with concrete details\",\n \"Third option if needed\"\n ]\n }\n ]\n}\n\nRules:\n- actionabilityScore: number between 0 and 1\n- context: concise summary for planning phase\n- keyFiles: array of file paths that need modification\n- blockers: optional array explaining confidence gaps\n- questions: ONLY include if actionabilityScore < 0.7\n- Each question must have 2-3 options (maximum 3)\n- Max 3 questions total\n- Options must be complete, actionable choices that require NO additional user input\n- NEVER use options like \"Tell me the pattern\", \"Show me examples\", \"Specify the approach\"\n- Each option must be a full implementation decision that can be directly acted upon\n</output_format>\n\n<scoring_examples>\n<example score=\"0.9\">\nTask: \"Fix typo in login button text\"\nReasoning: Completely clear task, found exact component, no architectural decisions\n</example>\n\n<example score=\"0.75\">\nTask: \"Add caching to API endpoints\"\nReasoning: Clear goal, found endpoints, but multiple caching strategies possible\n</example>\n\n<example score=\"0.55\">\nTask: \"Improve performance\"\nReasoning: Vague task, unclear scope, needs questions about which areas to optimize\nQuestions needed: Which features are slow? What metrics define success?\n</example>\n\n<example score=\"0.3\">\nTask: \"Add the new feature\"\nReasoning: Extremely vague, no context, cannot locate relevant code\nQuestions needed: What feature? Which product area? What should it do?\n</example>\n</scoring_examples>\n\n<question_examples>\n<good_example>\n{\n \"id\": \"q1\",\n \"question\": \"Which caching layer should we use for API responses?\",\n \"options\": [\n \"Redis with 1-hour TTL (existing infrastructure, requires Redis client setup)\",\n \"In-memory LRU cache with 100MB limit (simpler, single-server only)\",\n \"HTTP Cache-Control headers only (minimal backend changes, relies on browser/CDN)\"\n ]\n}\nReason: Each option is a complete, actionable decision with concrete details\n</good_example>\n\n<good_example>\n{\n \"id\": \"q2\",\n \"question\": \"Where should the new analytics tracking code be placed?\",\n \"options\": [\n \"In the existing UserAnalytics.ts module alongside page view tracking\",\n \"Create a new EventTracking.ts module in src/analytics/ for all event tracking\",\n \"Add directly to each component that needs tracking (no centralized module)\"\n ]\n}\nReason: Specific file paths and architectural patterns, no user input needed\n</good_example>\n\n<bad_example>\n{\n \"id\": \"q1\", \n \"question\": \"How should I implement this?\",\n \"options\": [\"One way\", \"Another way\"]\n}\nReason: Too vague, doesn't explain the tradeoffs or provide concrete details\n</bad_example>\n\n<bad_example>\n{\n \"id\": \"q2\",\n \"question\": \"Which pattern should we follow for state management?\",\n \"options\": [\n \"Tell me which pattern the codebase currently uses\",\n \"Show me examples of state management\",\n \"Whatever you think is best\"\n ]\n}\nReason: Options request user input instead of being actionable choices. Should be concrete patterns like \"Zustand stores (matching existing patterns in src/stores/)\" or \"React Context (simpler, no new dependencies)\"\n</bad_example>\n\n<bad_example>\n{\n \"id\": \"q3\",\n \"question\": \"What color scheme should the button use?\",\n \"options\": [\n \"Use the existing theme colors\",\n \"Let me specify custom colors\",\n \"Match the design system\"\n ]\n}\nReason: \"Let me specify\" requires user input. Should be \"Primary blue (#0066FF, existing theme)\" or \"Secondary gray (#6B7280, existing theme)\"\n</bad_example>\n</question_examples>`;\n","import { buildStep } from \"./steps/build.js\";\nimport { finalizeStep } from \"./steps/finalize.js\";\nimport { planStep } from \"./steps/plan.js\";\nimport { researchStep } from \"./steps/research.js\";\nimport type { WorkflowDefinition } from \"./types.js\";\n\nconst MODELS = {\n SONNET: \"claude-sonnet-4-5\",\n HAIKU: \"claude-haiku-4-5\",\n};\n\nexport const TASK_WORKFLOW: WorkflowDefinition = [\n {\n id: \"research\",\n name: \"Research\",\n agent: \"research\",\n model: MODELS.HAIKU,\n permissionMode: \"plan\",\n commit: true,\n push: true,\n run: researchStep,\n },\n {\n id: \"plan\",\n name: \"Plan\",\n agent: \"planning\",\n model: MODELS.SONNET,\n permissionMode: \"plan\",\n commit: true,\n push: true,\n run: planStep,\n },\n {\n id: \"build\",\n name: \"Build\",\n agent: \"execution\",\n model: MODELS.SONNET,\n permissionMode: \"acceptEdits\",\n commit: true,\n push: true,\n run: buildStep,\n },\n {\n id: \"finalize\",\n name: \"Finalize\",\n agent: \"system\", // not used\n model: MODELS.HAIKU, // not used\n permissionMode: \"plan\", // not used\n commit: true,\n push: true,\n run: finalizeStep,\n },\n];\n","import { z } from \"zod\";\n\n// Base event schema with timestamp\nconst BaseEventSchema = z.object({\n ts: z.number(),\n});\n\n// Streaming content events\nexport const TokenEventSchema = BaseEventSchema.extend({\n type: z.literal(\"token\"),\n content: z.string(),\n contentType: z.enum([\"text\", \"thinking\", \"tool_input\"]).optional(),\n});\n\nexport const ContentBlockStartEventSchema = BaseEventSchema.extend({\n type: z.literal(\"content_block_start\"),\n index: z.number(),\n contentType: z.enum([\"text\", \"tool_use\", \"thinking\"]),\n toolName: z.string().optional(),\n toolId: z.string().optional(),\n});\n\nexport const ContentBlockStopEventSchema = BaseEventSchema.extend({\n type: z.literal(\"content_block_stop\"),\n index: z.number(),\n});\n\n// Tool events\nexport const ToolCallEventSchema = BaseEventSchema.extend({\n type: z.literal(\"tool_call\"),\n toolName: z.string(),\n callId: z.string(),\n args: z.record(z.string(), z.unknown()),\n parentToolUseId: z.string().nullable().optional(),\n tool: z.unknown().optional(),\n category: z.unknown().optional(),\n});\n\nexport const ToolResultEventSchema = BaseEventSchema.extend({\n type: z.literal(\"tool_result\"),\n toolName: z.string(),\n callId: z.string(),\n result: z.unknown(),\n isError: z.boolean().optional(),\n parentToolUseId: z.string().nullable().optional(),\n tool: z.unknown().optional(),\n category: z.unknown().optional(),\n});\n\n// Message lifecycle events\nexport const MessageStartEventSchema = BaseEventSchema.extend({\n type: z.literal(\"message_start\"),\n messageId: z.string().optional(),\n model: z.string().optional(),\n});\n\nexport const MessageDeltaEventSchema = BaseEventSchema.extend({\n type: z.literal(\"message_delta\"),\n stopReason: z.string().optional(),\n stopSequence: z.string().optional(),\n usage: z\n .object({\n outputTokens: z.number(),\n })\n .optional(),\n});\n\nexport const MessageStopEventSchema = BaseEventSchema.extend({\n type: z.literal(\"message_stop\"),\n});\n\n// User message events\nexport const UserMessageEventSchema = BaseEventSchema.extend({\n type: z.literal(\"user_message\"),\n content: z.string(),\n isSynthetic: z.boolean().optional(),\n});\n\n// System events\nexport const StatusEventSchema = BaseEventSchema.extend({\n type: z.literal(\"status\"),\n phase: z.string(),\n kind: z.string().optional(),\n branch: z.string().optional(),\n prUrl: z.string().optional(),\n taskId: z.string().optional(),\n messageId: z.string().optional(),\n model: z.string().optional(),\n}).passthrough(); // Allow additional fields\n\nexport const InitEventSchema = BaseEventSchema.extend({\n type: z.literal(\"init\"),\n model: z.string(),\n tools: z.array(z.string()),\n permissionMode: z.string(),\n cwd: z.string(),\n apiKeySource: z.string(),\n agents: z.array(z.string()).optional(),\n slashCommands: z.array(z.string()).optional(),\n outputStyle: z.string().optional(),\n mcpServers: z\n .array(z.object({ name: z.string(), status: z.string() }))\n .optional(),\n});\n\n// Console event for log-style output\nexport const ConsoleEventSchema = BaseEventSchema.extend({\n type: z.literal(\"console\"),\n level: z.enum([\"debug\", \"info\", \"warn\", \"error\"]),\n message: z.string(),\n});\n\nexport const CompactBoundaryEventSchema = BaseEventSchema.extend({\n type: z.literal(\"compact_boundary\"),\n trigger: z.enum([\"manual\", \"auto\"]),\n preTokens: z.number(),\n});\n\n// Result events\nexport const DoneEventSchema = BaseEventSchema.extend({\n type: z.literal(\"done\"),\n result: z.string().optional(),\n durationMs: z.number().optional(),\n durationApiMs: z.number().optional(),\n numTurns: z.number().optional(),\n totalCostUsd: z.number().optional(),\n usage: z.unknown().optional(),\n modelUsage: z\n .record(\n z.string(),\n z.object({\n inputTokens: z.number(),\n outputTokens: z.number(),\n cacheReadInputTokens: z.number(),\n cacheCreationInputTokens: z.number(),\n webSearchRequests: z.number(),\n costUSD: z.number(),\n contextWindow: z.number(),\n }),\n )\n .optional(),\n permissionDenials: z\n .array(\n z.object({\n tool_name: z.string(),\n tool_use_id: z.string(),\n tool_input: z.record(z.string(), z.unknown()),\n }),\n )\n .optional(),\n});\n\nexport const ErrorEventSchema = BaseEventSchema.extend({\n type: z.literal(\"error\"),\n message: z.string(),\n error: z.unknown().optional(),\n errorType: z.string().optional(),\n context: z.record(z.string(), z.unknown()).optional(),\n sdkError: z.unknown().optional(),\n});\n\n// Metric and artifact events\nexport const MetricEventSchema = BaseEventSchema.extend({\n type: z.literal(\"metric\"),\n key: z.string(),\n value: z.number(),\n unit: z.string().optional(),\n});\n\nexport const ArtifactEventSchema = BaseEventSchema.extend({\n type: z.literal(\"artifact\"),\n kind: z.string(),\n content: z.unknown(),\n});\n\nexport const RawSDKEventSchema = BaseEventSchema.extend({\n type: z.literal(\"raw_sdk_event\"),\n sdkMessage: z.unknown(),\n});\n\nexport const AgentEventSchema = z.discriminatedUnion(\"type\", [\n TokenEventSchema,\n ContentBlockStartEventSchema,\n ContentBlockStopEventSchema,\n ToolCallEventSchema,\n ToolResultEventSchema,\n MessageStartEventSchema,\n MessageDeltaEventSchema,\n MessageStopEventSchema,\n UserMessageEventSchema,\n StatusEventSchema,\n InitEventSchema,\n ConsoleEventSchema,\n CompactBoundaryEventSchema,\n DoneEventSchema,\n ErrorEventSchema,\n MetricEventSchema,\n ArtifactEventSchema,\n RawSDKEventSchema,\n]);\n\nexport type TokenEvent = z.infer<typeof TokenEventSchema>;\nexport type ContentBlockStartEvent = z.infer<\n typeof ContentBlockStartEventSchema\n>;\nexport type ContentBlockStopEvent = z.infer<typeof ContentBlockStopEventSchema>;\nexport type ToolCallEvent = z.infer<typeof ToolCallEventSchema>;\nexport type ToolResultEvent = z.infer<typeof ToolResultEventSchema>;\nexport type MessageStartEvent = z.infer<typeof MessageStartEventSchema>;\nexport type MessageDeltaEvent = z.infer<typeof MessageDeltaEventSchema>;\nexport type MessageStopEvent = z.infer<typeof MessageStopEventSchema>;\nexport type UserMessageEvent = z.infer<typeof UserMessageEventSchema>;\nexport type StatusEvent = z.infer<typeof StatusEventSchema>;\nexport type InitEvent = z.infer<typeof InitEventSchema>;\nexport type ConsoleEvent = z.infer<typeof ConsoleEventSchema>;\nexport type CompactBoundaryEvent = z.infer<typeof CompactBoundaryEventSchema>;\nexport type DoneEvent = z.infer<typeof DoneEventSchema>;\nexport type ErrorEvent = z.infer<typeof ErrorEventSchema>;\nexport type MetricEvent = z.infer<typeof MetricEventSchema>;\nexport type ArtifactEvent = z.infer<typeof ArtifactEventSchema>;\nexport type RawSDKEvent = z.infer<typeof RawSDKEventSchema>;\nexport type AgentEvent = z.infer<typeof AgentEventSchema>;\n\n/**\n * Parse and validate an AgentEvent from unknown input.\n * Returns the parsed event if valid, or null if invalid.\n */\nexport function parseAgentEvent(input: unknown): AgentEvent | null {\n const result = AgentEventSchema.safeParse(input);\n return result.success ? result.data : null;\n}\n\n/**\n * Parse and validate multiple AgentEvents from an array of unknown inputs.\n * Invalid entries are discarded.\n */\nexport function parseAgentEvents(inputs: unknown[]): AgentEvent[] {\n return inputs\n .map((input) => parseAgentEvent(input))\n .filter((event): event is AgentEvent => event !== null);\n}\n","import type { Tool } from \"./types.js\";\n\n/**\n * Registry of all known tools with their metadata.\n * Maps tool names to their definitions.\n */\nconst TOOL_DEFINITIONS: Record<string, Tool> = {\n // Filesystem tools\n Read: {\n name: \"Read\",\n category: \"filesystem\",\n description: \"Read file contents from the filesystem\",\n },\n Write: {\n name: \"Write\",\n category: \"filesystem\",\n description: \"Write content to a file\",\n },\n Edit: {\n name: \"Edit\",\n category: \"filesystem\",\n description: \"Edit file with find and replace operations\",\n },\n Glob: {\n name: \"Glob\",\n category: \"filesystem\",\n description: \"Find files matching a pattern\",\n },\n NotebookEdit: {\n name: \"NotebookEdit\",\n category: \"filesystem\",\n description: \"Edit Jupyter notebook cells\",\n },\n\n // Shell tools\n Bash: {\n name: \"Bash\",\n category: \"shell\",\n description: \"Execute bash commands\",\n },\n BashOutput: {\n name: \"BashOutput\",\n category: \"shell\",\n description: \"Read output from a background bash process\",\n },\n KillShell: {\n name: \"KillShell\",\n category: \"shell\",\n description: \"Terminate a background bash process\",\n },\n\n // Web tools\n WebFetch: {\n name: \"WebFetch\",\n category: \"web\",\n description: \"Fetch content from a URL\",\n },\n WebSearch: {\n name: \"WebSearch\",\n category: \"web\",\n description: \"Search the web\",\n },\n\n // Search tools\n Grep: {\n name: \"Grep\",\n category: \"search\",\n description: \"Search file contents using patterns\",\n },\n\n // Assistant tools\n Task: {\n name: \"Task\",\n category: \"assistant\",\n description: \"Launch a specialized agent for a sub-task\",\n },\n TodoWrite: {\n name: \"TodoWrite\",\n category: \"assistant\",\n description: \"Manage task list and track progress\",\n },\n ExitPlanMode: {\n name: \"ExitPlanMode\",\n category: \"assistant\",\n description: \"Exit plan mode and present plan to user\",\n },\n SlashCommand: {\n name: \"SlashCommand\",\n category: \"assistant\",\n description: \"Execute a slash command\",\n },\n};\n\n/**\n * Tool registry for looking up tool definitions by name.\n * Provides metadata about tools for UI consumption.\n */\nexport class ToolRegistry {\n /**\n * Get tool definition by name.\n * Returns undefined if tool is not recognized.\n */\n get(name: string): Tool | undefined {\n return TOOL_DEFINITIONS[name];\n }\n\n /**\n * Get all registered tools.\n */\n getAll(): Tool[] {\n return Object.values(TOOL_DEFINITIONS);\n }\n\n /**\n * Check if a tool name is registered.\n */\n has(name: string): boolean {\n return name in TOOL_DEFINITIONS;\n }\n\n /**\n * Get all tools in a specific category.\n */\n getByCategory(category: string): Tool[] {\n return Object.values(TOOL_DEFINITIONS).filter(\n (tool) => tool.category === category,\n );\n }\n}\n","import { exec, execFile } from \"node:child_process\";\nimport * as crypto from \"node:crypto\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type { WorktreeInfo } from \"./types.js\";\nimport { Logger } from \"./utils/logger.js\";\n\nconst execAsync = promisify(exec);\nconst execFileAsync = promisify(execFile);\n\nexport interface WorktreeConfig {\n mainRepoPath: string;\n worktreeBasePath?: string;\n logger?: Logger;\n}\n\nconst ADJECTIVES = [\n \"swift\",\n \"bright\",\n \"calm\",\n \"bold\",\n \"gentle\",\n \"quick\",\n \"soft\",\n \"warm\",\n \"cool\",\n \"wise\",\n \"keen\",\n \"brave\",\n \"clear\",\n \"crisp\",\n \"deep\",\n \"fair\",\n \"fine\",\n \"free\",\n \"glad\",\n \"good\",\n \"grand\",\n \"great\",\n \"happy\",\n \"kind\",\n \"light\",\n \"lively\",\n \"neat\",\n \"nice\",\n \"plain\",\n \"proud\",\n \"pure\",\n \"rare\",\n \"rich\",\n \"safe\",\n \"sharp\",\n \"shy\",\n \"simple\",\n \"slim\",\n \"smart\",\n \"smooth\",\n \"solid\",\n \"sound\",\n \"spare\",\n \"stable\",\n \"steady\",\n \"still\",\n \"strong\",\n \"sure\",\n \"sweet\",\n \"tall\",\n \"agile\",\n \"ancient\",\n \"autumn\",\n \"azure\",\n \"cosmic\",\n \"daring\",\n \"dawn\",\n \"dusty\",\n \"eager\",\n \"early\",\n \"endless\",\n \"fading\",\n \"fallen\",\n \"famous\",\n \"feral\",\n \"fierce\",\n \"fleet\",\n \"foggy\",\n \"forest\",\n \"frozen\",\n \"gleeful\",\n \"golden\",\n \"hazy\",\n \"hidden\",\n \"hollow\",\n \"humble\",\n \"hushed\",\n \"icy\",\n \"inner\",\n \"late\",\n \"lazy\",\n \"little\",\n \"lone\",\n \"long\",\n \"lost\",\n \"lucky\",\n \"lunar\",\n \"magic\",\n \"mellow\",\n \"mighty\",\n \"misty\",\n \"modest\",\n \"mossy\",\n \"mystic\",\n \"nimble\",\n \"noble\",\n \"ocean\",\n \"outer\",\n \"pale\",\n \"paper\",\n \"patient\",\n \"peaceful\",\n \"phantom\",\n \"polite\",\n \"primal\",\n \"quiet\",\n \"rapid\",\n \"restless\",\n \"rising\",\n \"roaming\",\n \"rocky\",\n \"rustic\",\n \"sacred\",\n \"sandy\",\n \"secret\",\n \"serene\",\n \"shadow\",\n \"shining\",\n \"silent\",\n \"silky\",\n \"silver\",\n \"sleek\",\n \"snowy\",\n \"solar\",\n \"solemn\",\n \"spring\",\n \"starry\",\n \"stormy\",\n \"summer\",\n \"sunny\",\n \"tender\",\n \"thorny\",\n \"tiny\",\n \"tranquil\",\n \"twilight\",\n \"upward\",\n \"velvet\",\n \"vivid\",\n \"wandering\",\n \"wary\",\n \"wild\",\n \"windy\",\n \"winter\",\n \"wispy\",\n \"young\",\n];\n\nconst COLORS = [\n \"blue\",\n \"red\",\n \"green\",\n \"amber\",\n \"coral\",\n \"jade\",\n \"pearl\",\n \"ruby\",\n \"sage\",\n \"teal\",\n \"gold\",\n \"silver\",\n \"bronze\",\n \"copper\",\n \"ivory\",\n \"onyx\",\n \"opal\",\n \"rose\",\n \"slate\",\n \"violet\",\n \"aqua\",\n \"azure\",\n \"beige\",\n \"black\",\n \"brass\",\n \"brick\",\n \"brown\",\n \"cedar\",\n \"charcoal\",\n \"cherry\",\n \"chestnut\",\n \"chrome\",\n \"cider\",\n \"cinnamon\",\n \"citrus\",\n \"clay\",\n \"cloud\",\n \"cobalt\",\n \"cocoa\",\n \"cream\",\n \"crimson\",\n \"crystal\",\n \"cyan\",\n \"denim\",\n \"dusk\",\n \"ebony\",\n \"ember\",\n \"emerald\",\n \"fern\",\n \"flame\",\n \"flint\",\n \"forest\",\n \"frost\",\n \"garnet\",\n \"ginger\",\n \"glacier\",\n \"granite\",\n \"grape\",\n \"gray\",\n \"hazel\",\n \"honey\",\n \"indigo\",\n \"iron\",\n \"lapis\",\n \"lava\",\n \"lavender\",\n \"lemon\",\n \"lilac\",\n \"lime\",\n \"magenta\",\n \"mahogany\",\n \"maple\",\n \"marble\",\n \"maroon\",\n \"mauve\",\n \"midnight\",\n \"mint\",\n \"mocha\",\n \"moss\",\n \"mustard\",\n \"navy\",\n \"nickel\",\n \"obsidian\",\n \"ochre\",\n \"olive\",\n \"orange\",\n \"orchid\",\n \"peach\",\n \"pine\",\n \"pink\",\n \"plum\",\n \"porcelain\",\n \"purple\",\n \"quartz\",\n \"rust\",\n \"saffron\",\n \"salmon\",\n \"sand\",\n \"sapphire\",\n \"scarlet\",\n \"sepia\",\n \"shadow\",\n \"sienna\",\n \"smoke\",\n \"snow\",\n \"steel\",\n \"stone\",\n \"storm\",\n \"sunset\",\n \"tan\",\n \"tangerine\",\n \"taupe\",\n \"terra\",\n \"timber\",\n \"topaz\",\n \"turquoise\",\n \"umber\",\n \"vanilla\",\n \"walnut\",\n \"wheat\",\n \"white\",\n \"wine\",\n \"yellow\",\n];\n\nconst ANIMALS = [\n \"fox\",\n \"owl\",\n \"bear\",\n \"wolf\",\n \"hawk\",\n \"deer\",\n \"lynx\",\n \"otter\",\n \"raven\",\n \"falcon\",\n \"badger\",\n \"beaver\",\n \"bison\",\n \"bobcat\",\n \"crane\",\n \"eagle\",\n \"ferret\",\n \"finch\",\n \"gopher\",\n \"heron\",\n \"jaguar\",\n \"koala\",\n \"lemur\",\n \"marten\",\n \"mink\",\n \"moose\",\n \"newt\",\n \"ocelot\",\n \"osprey\",\n \"panda\",\n \"parrot\",\n \"pelican\",\n \"puma\",\n \"quail\",\n \"rabbit\",\n \"raccoon\",\n \"salmon\",\n \"seal\",\n \"shark\",\n \"shrew\",\n \"sloth\",\n \"snake\",\n \"spider\",\n \"squid\",\n \"stork\",\n \"swan\",\n \"tiger\",\n \"toucan\",\n \"turtle\",\n \"whale\",\n \"albatross\",\n \"ant\",\n \"antelope\",\n \"armadillo\",\n \"baboon\",\n \"bat\",\n \"bee\",\n \"beetle\",\n \"buffalo\",\n \"butterfly\",\n \"camel\",\n \"cardinal\",\n \"caribou\",\n \"catfish\",\n \"cheetah\",\n \"chipmunk\",\n \"cicada\",\n \"clam\",\n \"cobra\",\n \"condor\",\n \"corgi\",\n \"cougar\",\n \"coyote\",\n \"crab\",\n \"cricket\",\n \"crow\",\n \"dolphin\",\n \"donkey\",\n \"dove\",\n \"dragonfly\",\n \"duck\",\n \"eel\",\n \"egret\",\n \"elephant\",\n \"elk\",\n \"emu\",\n \"firefly\",\n \"flamingo\",\n \"frog\",\n \"gazelle\",\n \"gecko\",\n \"gibbon\",\n \"giraffe\",\n \"goat\",\n \"goose\",\n \"gorilla\",\n \"grasshopper\",\n \"grouse\",\n \"gull\",\n \"hamster\",\n \"hare\",\n \"hedgehog\",\n \"hippo\",\n \"hornet\",\n \"horse\",\n \"hound\",\n \"hummingbird\",\n \"hyena\",\n \"ibis\",\n \"iguana\",\n \"impala\",\n \"jackal\",\n \"jay\",\n \"jellyfish\",\n \"kangaroo\",\n \"kestrel\",\n \"kingfisher\",\n \"kite\",\n \"kiwi\",\n \"lark\",\n \"leopard\",\n \"lion\",\n \"lizard\",\n \"llama\",\n \"lobster\",\n \"loon\",\n \"macaw\",\n \"magpie\",\n \"mallard\",\n \"mammoth\",\n \"manatee\",\n \"mantis\",\n \"marlin\",\n \"marmot\",\n \"meerkat\",\n \"mockingbird\",\n \"mole\",\n \"mongoose\",\n \"monkey\",\n \"moth\",\n \"mouse\",\n \"mule\",\n \"narwhal\",\n \"nightingale\",\n \"octopus\",\n \"opossum\",\n \"orangutan\",\n \"oriole\",\n \"ostrich\",\n \"oyster\",\n \"panther\",\n \"peacock\",\n \"penguin\",\n \"pheasant\",\n \"pig\",\n \"pigeon\",\n \"pike\",\n \"piranha\",\n \"platypus\",\n \"pony\",\n \"porcupine\",\n \"porpoise\",\n \"python\",\n \"raven\",\n \"ray\",\n \"reindeer\",\n \"rhino\",\n \"robin\",\n \"rooster\",\n \"salamander\",\n \"sandpiper\",\n \"sardine\",\n \"scorpion\",\n \"seagull\",\n \"seahorse\",\n \"skunk\",\n \"snail\",\n \"sparrow\",\n \"squirrel\",\n \"starfish\",\n \"starling\",\n \"stingray\",\n \"swallow\",\n \"tapir\",\n \"termite\",\n \"tern\",\n \"toad\",\n \"trout\",\n \"tuna\",\n \"viper\",\n \"vulture\",\n \"walrus\",\n \"wasp\",\n \"weasel\",\n \"wombat\",\n \"woodpecker\",\n \"wren\",\n \"yak\",\n \"zebra\",\n];\n\nconst WORKTREE_FOLDER_NAME = \".array\";\n\nexport class WorktreeManager {\n private mainRepoPath: string;\n private worktreeBasePath: string | null;\n private repoName: string;\n private logger: Logger;\n\n constructor(config: WorktreeConfig) {\n this.mainRepoPath = config.mainRepoPath;\n this.worktreeBasePath = config.worktreeBasePath || null;\n this.repoName = path.basename(config.mainRepoPath);\n this.logger =\n config.logger ||\n new Logger({ debug: false, prefix: \"[WorktreeManager]\" });\n }\n\n private usesExternalPath(): boolean {\n return this.worktreeBasePath !== null;\n }\n\n private async runGitCommand(command: string): Promise<string> {\n try {\n const { stdout } = await execAsync(`git ${command}`, {\n cwd: this.mainRepoPath,\n });\n return stdout.trim();\n } catch (error) {\n throw new Error(`Git command failed: ${command}\\n${error}`);\n }\n }\n\n private randomElement<T>(array: T[]): T {\n return array[crypto.randomInt(array.length)];\n }\n\n generateWorktreeName(): string {\n const adjective = this.randomElement(ADJECTIVES);\n const color = this.randomElement(COLORS);\n const animal = this.randomElement(ANIMALS);\n return `${adjective}-${color}-${animal}`;\n }\n\n private getWorktreeFolderPath(): string {\n if (this.worktreeBasePath) {\n return path.join(this.worktreeBasePath, this.repoName);\n }\n return path.join(this.mainRepoPath, WORKTREE_FOLDER_NAME);\n }\n\n private getWorktreePath(name: string): string {\n return path.join(this.getWorktreeFolderPath(), name);\n }\n\n async worktreeExists(name: string): Promise<boolean> {\n const worktreePath = this.getWorktreePath(name);\n try {\n await fs.access(worktreePath);\n return true;\n } catch {\n return false;\n }\n }\n\n async ensureArrayDirIgnored(): Promise<void> {\n // Use .git/info/exclude instead of .gitignore to avoid modifying tracked files\n const excludePath = path.join(this.mainRepoPath, \".git\", \"info\", \"exclude\");\n const ignorePattern = `/${WORKTREE_FOLDER_NAME}/`;\n\n let content = \"\";\n try {\n content = await fs.readFile(excludePath, \"utf-8\");\n } catch {\n // File doesn't exist or .git/info doesn't exist\n }\n\n // Check if pattern is already present\n if (\n content.includes(`/${WORKTREE_FOLDER_NAME}/`) ||\n content.includes(`/${WORKTREE_FOLDER_NAME}`)\n ) {\n this.logger.debug(\"Exclude file already contains .array folder pattern\");\n return;\n }\n\n // Ensure .git/info directory exists\n const infoDir = path.join(this.mainRepoPath, \".git\", \"info\");\n await fs.mkdir(infoDir, { recursive: true });\n\n // Append the pattern\n const newContent = `${content.trimEnd()}\\n\\n# Array worktrees\\n${ignorePattern}\\n`;\n await fs.writeFile(excludePath, newContent);\n this.logger.info(\"Added .array folder to .git/info/exclude\");\n }\n\n private async generateUniqueWorktreeName(): Promise<string> {\n let name = this.generateWorktreeName();\n let attempts = 0;\n const maxAttempts = 100;\n\n while ((await this.worktreeExists(name)) && attempts < maxAttempts) {\n name = this.generateWorktreeName();\n attempts++;\n }\n\n if (attempts >= maxAttempts) {\n // Fallback: append timestamp\n name = `${this.generateWorktreeName()}-${Date.now()}`;\n }\n\n return name;\n }\n\n private async getDefaultBranch(): Promise<string> {\n try {\n const remoteBranch = await this.runGitCommand(\n \"symbolic-ref refs/remotes/origin/HEAD\",\n );\n return remoteBranch.replace(\"refs/remotes/origin/\", \"\");\n } catch {\n // Fallback: check if main exists, otherwise use master\n try {\n await this.runGitCommand(\"rev-parse --verify main\");\n return \"main\";\n } catch {\n try {\n await this.runGitCommand(\"rev-parse --verify master\");\n return \"master\";\n } catch {\n throw new Error(\n \"Cannot determine default branch. No main or master branch found.\",\n );\n }\n }\n }\n }\n\n async createWorktree(options?: {\n baseBranch?: string;\n }): Promise<WorktreeInfo> {\n // Only modify .git/info/exclude when using in-repo storage\n if (!this.usesExternalPath()) {\n await this.ensureArrayDirIgnored();\n }\n\n // Ensure the worktree folder exists when using external path\n if (this.usesExternalPath()) {\n const folderPath = this.getWorktreeFolderPath();\n await fs.mkdir(folderPath, { recursive: true });\n }\n\n // Generate unique worktree name\n const worktreeName = await this.generateUniqueWorktreeName();\n const worktreePath = this.getWorktreePath(worktreeName);\n const branchName = `array/${worktreeName}`;\n const baseBranch = options?.baseBranch ?? (await this.getDefaultBranch());\n\n this.logger.info(\"Creating worktree\", {\n worktreeName,\n worktreePath,\n branchName,\n baseBranch,\n external: this.usesExternalPath(),\n });\n\n // Create the worktree with a new branch\n if (this.usesExternalPath()) {\n // Use absolute path for external worktrees\n await this.runGitCommand(\n `worktree add -b \"${branchName}\" \"${worktreePath}\" \"${baseBranch}\"`,\n );\n } else {\n // Use relative path from repo root for in-repo worktrees\n const relativePath = `${WORKTREE_FOLDER_NAME}/${worktreeName}`;\n await this.runGitCommand(\n `worktree add -b \"${branchName}\" \"./${relativePath}\" \"${baseBranch}\"`,\n );\n }\n\n const createdAt = new Date().toISOString();\n\n this.logger.info(\"Worktree created successfully\", {\n worktreeName,\n worktreePath,\n branchName,\n });\n\n return {\n worktreePath,\n worktreeName,\n branchName,\n baseBranch,\n createdAt,\n };\n }\n\n async deleteWorktree(worktreePath: string): Promise<void> {\n const resolvedWorktreePath = path.resolve(worktreePath);\n const resolvedMainRepoPath = path.resolve(this.mainRepoPath);\n\n // Safety check 1: Never delete the main repo path\n if (resolvedWorktreePath === resolvedMainRepoPath) {\n const error = new Error(\n \"Cannot delete worktree: path matches main repo path\",\n );\n this.logger.error(\"Safety check failed\", { worktreePath, error });\n throw error;\n }\n\n // Safety check 2: Never delete a parent of the main repo path\n if (\n resolvedMainRepoPath.startsWith(resolvedWorktreePath) &&\n resolvedMainRepoPath !== resolvedWorktreePath\n ) {\n const error = new Error(\n \"Cannot delete worktree: path is a parent of main repo path\",\n );\n this.logger.error(\"Safety check failed\", { worktreePath, error });\n throw error;\n }\n\n // Safety check 3: Check for .git directory (indicates main repo)\n try {\n const gitPath = path.join(resolvedWorktreePath, \".git\");\n const stat = await fs.stat(gitPath);\n if (stat.isDirectory()) {\n const error = new Error(\n \"Cannot delete worktree: path appears to be a main repository (contains .git directory)\",\n );\n this.logger.error(\"Safety check failed\", { worktreePath, error });\n throw error;\n }\n } catch (error) {\n // If .git doesn't exist or we can't read it, proceed (unless it was the directory check above)\n if (\n error instanceof Error &&\n error.message.includes(\"Cannot delete worktree\")\n ) {\n throw error;\n }\n }\n\n this.logger.info(\"Deleting worktree\", { worktreePath });\n\n try {\n // First, try to remove the worktree via git using execFileAsync for safety\n await execFileAsync(\n \"git\",\n [\"worktree\", \"remove\", worktreePath, \"--force\"],\n {\n cwd: this.mainRepoPath,\n },\n );\n this.logger.info(\"Worktree deleted successfully\", { worktreePath });\n } catch (error) {\n this.logger.warn(\n \"Git worktree remove failed, attempting manual cleanup\",\n {\n worktreePath,\n error,\n },\n );\n\n // Manual cleanup if git command fails\n try {\n await fs.rm(worktreePath, { recursive: true, force: true });\n // Also prune the worktree list\n await this.runGitCommand(\"worktree prune\");\n this.logger.info(\"Worktree cleaned up manually\", { worktreePath });\n } catch (cleanupError) {\n this.logger.error(\"Failed to cleanup worktree\", {\n worktreePath,\n cleanupError,\n });\n throw cleanupError;\n }\n }\n }\n\n async getWorktreeInfo(worktreePath: string): Promise<WorktreeInfo | null> {\n try {\n // Parse the worktree list to find info about this worktree\n const output = await this.runGitCommand(\"worktree list --porcelain\");\n const worktrees = this.parseWorktreeList(output);\n\n const worktree = worktrees.find((w) => w.worktreePath === worktreePath);\n return worktree || null;\n } catch (error) {\n this.logger.debug(\"Failed to get worktree info\", { worktreePath, error });\n return null;\n }\n }\n\n async listWorktrees(): Promise<WorktreeInfo[]> {\n try {\n const output = await this.runGitCommand(\"worktree list --porcelain\");\n return this.parseWorktreeList(output);\n } catch (error) {\n this.logger.debug(\"Failed to list worktrees\", { error });\n return [];\n }\n }\n\n private parseWorktreeList(output: string): WorktreeInfo[] {\n const worktrees: WorktreeInfo[] = [];\n const entries = output.split(\"\\n\\n\").filter((e) => e.trim());\n const worktreeFolderPath = this.getWorktreeFolderPath();\n\n for (const entry of entries) {\n const lines = entry.split(\"\\n\");\n let worktreePath = \"\";\n let branchName = \"\";\n\n for (const line of lines) {\n if (line.startsWith(\"worktree \")) {\n worktreePath = line.replace(\"worktree \", \"\");\n } else if (line.startsWith(\"branch refs/heads/\")) {\n branchName = line.replace(\"branch refs/heads/\", \"\");\n }\n }\n\n // Include worktrees that:\n // 1. Are in our worktree folder (external or in-repo)\n // 2. Have a posthog/ branch prefix (our naming convention)\n const isInWorktreeFolder = worktreePath?.startsWith(worktreeFolderPath);\n const isArrayBranch =\n branchName?.startsWith(\"array/\") || branchName?.startsWith(\"posthog/\");\n\n if (worktreePath && branchName && (isInWorktreeFolder || isArrayBranch)) {\n const worktreeName = path.basename(worktreePath);\n worktrees.push({\n worktreePath,\n worktreeName,\n branchName,\n baseBranch: \"\",\n createdAt: \"\",\n });\n }\n }\n\n return worktrees;\n }\n\n async isWorktree(repoPath: string): Promise<boolean> {\n try {\n const { stdout } = await execAsync(\n \"git rev-parse --is-inside-work-tree\",\n { cwd: repoPath },\n );\n if (stdout.trim() !== \"true\") {\n return false;\n }\n\n // Check if there's a .git file (worktrees have a .git file, not a .git directory)\n const gitPath = path.join(repoPath, \".git\");\n const stat = await fs.stat(gitPath);\n return stat.isFile(); // Worktrees have .git as a file, main repos have .git as a directory\n } catch {\n return false;\n }\n }\n\n async getMainRepoPathFromWorktree(\n worktreePath: string,\n ): Promise<string | null> {\n try {\n const gitFilePath = path.join(worktreePath, \".git\");\n const content = await fs.readFile(gitFilePath, \"utf-8\");\n\n // The .git file in a worktree contains: gitdir: /path/to/main/.git/worktrees/name\n const match = content.match(/gitdir:\\s*(.+)/);\n if (match) {\n const gitDir = match[1].trim();\n // Go up from .git/worktrees/name to get the main repo path\n // The gitdir points to something like: /main/repo/.git/worktrees/worktree-name\n const mainGitDir = path.resolve(gitDir, \"..\", \"..\", \"..\");\n return mainGitDir;\n }\n return null;\n } catch {\n return null;\n }\n }\n\n async cleanupOrphanedWorktrees(associatedWorktreePaths: string[]): Promise<{\n deleted: string[];\n errors: Array<{ path: string; error: string }>;\n }> {\n this.logger.info(\"Starting cleanup of orphaned worktrees\");\n\n const allWorktrees = await this.listWorktrees();\n const deleted: string[] = [];\n const errors: Array<{ path: string; error: string }> = [];\n\n const associatedPathsSet = new Set(\n associatedWorktreePaths.map((p) => path.resolve(p)),\n );\n\n for (const worktree of allWorktrees) {\n const resolvedPath = path.resolve(worktree.worktreePath);\n\n if (!associatedPathsSet.has(resolvedPath)) {\n this.logger.info(\"Found orphaned worktree\", {\n path: worktree.worktreePath,\n });\n\n try {\n await this.deleteWorktree(worktree.worktreePath);\n deleted.push(worktree.worktreePath);\n this.logger.info(\"Deleted orphaned worktree\", {\n path: worktree.worktreePath,\n });\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n errors.push({\n path: worktree.worktreePath,\n error: errorMessage,\n });\n this.logger.error(\"Failed to delete orphaned worktree\", {\n path: worktree.worktreePath,\n error: errorMessage,\n });\n }\n }\n }\n\n this.logger.info(\"Cleanup completed\", {\n deleted: deleted.length,\n errors: errors.length,\n });\n\n return { deleted, errors };\n }\n}\n"],"mappings":"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AAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,SAAS;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,UAAU;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;A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","names":["LogLevel","logger","WritableStream","resolve","logger","resolve","WritableStream","resolve","status","unreachable","logger","path","content","input","query","response","server","path","logger","update","ndJsonStream","fs","join","z","logger","join","fs","z","fs","join","join","fs","logger","randomBytes","resolve","existsSync","fs","join","join","existsSync","fs","query","logger","PermissionMode","logger","query","logger","logger","query","logger","query","query","logger","query","ndJsonStream","resolve","z","exec","fs","path","promisify","execAsync","promisify","exec","stat"]}