@posthog/agent 2.0.0 → 2.0.2

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.
Files changed (131) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +221 -219
  3. package/dist/adapters/claude/conversion/tool-use-to-acp.d.ts +21 -0
  4. package/dist/adapters/claude/conversion/tool-use-to-acp.js +547 -0
  5. package/dist/adapters/claude/conversion/tool-use-to-acp.js.map +1 -0
  6. package/dist/adapters/claude/permissions/permission-options.d.ts +13 -0
  7. package/dist/adapters/claude/permissions/permission-options.js +117 -0
  8. package/dist/adapters/claude/permissions/permission-options.js.map +1 -0
  9. package/dist/adapters/claude/questions/utils.d.ts +132 -0
  10. package/dist/adapters/claude/questions/utils.js +63 -0
  11. package/dist/adapters/claude/questions/utils.js.map +1 -0
  12. package/dist/adapters/claude/tools.d.ts +18 -0
  13. package/dist/adapters/claude/tools.js +95 -0
  14. package/dist/adapters/claude/tools.js.map +1 -0
  15. package/dist/agent-DBQY1BfC.d.ts +123 -0
  16. package/dist/agent.d.ts +5 -0
  17. package/dist/agent.js +3656 -0
  18. package/dist/agent.js.map +1 -0
  19. package/dist/claude-cli/cli.js +3695 -2746
  20. package/dist/claude-cli/vendor/ripgrep/COPYING +3 -0
  21. package/dist/claude-cli/vendor/ripgrep/arm64-darwin/rg +0 -0
  22. package/dist/claude-cli/vendor/ripgrep/arm64-darwin/ripgrep.node +0 -0
  23. package/dist/claude-cli/vendor/ripgrep/arm64-linux/rg +0 -0
  24. package/dist/claude-cli/vendor/ripgrep/arm64-linux/ripgrep.node +0 -0
  25. package/dist/claude-cli/vendor/ripgrep/x64-darwin/rg +0 -0
  26. package/dist/claude-cli/vendor/ripgrep/x64-darwin/ripgrep.node +0 -0
  27. package/dist/claude-cli/vendor/ripgrep/x64-linux/rg +0 -0
  28. package/dist/claude-cli/vendor/ripgrep/x64-linux/ripgrep.node +0 -0
  29. package/dist/claude-cli/vendor/ripgrep/x64-win32/rg.exe +0 -0
  30. package/dist/claude-cli/vendor/ripgrep/x64-win32/ripgrep.node +0 -0
  31. package/dist/gateway-models.d.ts +24 -0
  32. package/dist/gateway-models.js +93 -0
  33. package/dist/gateway-models.js.map +1 -0
  34. package/dist/index.d.ts +170 -1157
  35. package/dist/index.js +9373 -5135
  36. package/dist/index.js.map +1 -1
  37. package/dist/logger-DDBiMOOD.d.ts +24 -0
  38. package/dist/posthog-api.d.ts +40 -0
  39. package/dist/posthog-api.js +175 -0
  40. package/dist/posthog-api.js.map +1 -0
  41. package/dist/server/agent-server.d.ts +41 -0
  42. package/dist/server/agent-server.js +10503 -0
  43. package/dist/server/agent-server.js.map +1 -0
  44. package/dist/server/bin.d.ts +1 -0
  45. package/dist/server/bin.js +10558 -0
  46. package/dist/server/bin.js.map +1 -0
  47. package/dist/types.d.ts +129 -0
  48. package/dist/types.js +1 -0
  49. package/dist/types.js.map +1 -0
  50. package/package.json +65 -13
  51. package/src/acp-extensions.ts +98 -16
  52. package/src/adapters/acp-connection.ts +494 -0
  53. package/src/adapters/base-acp-agent.ts +150 -0
  54. package/src/adapters/claude/claude-agent.ts +596 -0
  55. package/src/adapters/claude/conversion/acp-to-sdk.ts +102 -0
  56. package/src/adapters/claude/conversion/sdk-to-acp.ts +571 -0
  57. package/src/adapters/claude/conversion/tool-use-to-acp.ts +618 -0
  58. package/src/adapters/claude/hooks.ts +64 -0
  59. package/src/adapters/claude/mcp/tool-metadata.ts +102 -0
  60. package/src/adapters/claude/permissions/permission-handlers.ts +433 -0
  61. package/src/adapters/claude/permissions/permission-options.ts +103 -0
  62. package/src/adapters/claude/plan/utils.ts +56 -0
  63. package/src/adapters/claude/questions/utils.ts +92 -0
  64. package/src/adapters/claude/session/commands.ts +38 -0
  65. package/src/adapters/claude/session/mcp-config.ts +37 -0
  66. package/src/adapters/claude/session/models.ts +12 -0
  67. package/src/adapters/claude/session/options.ts +236 -0
  68. package/src/adapters/claude/tool-meta.ts +143 -0
  69. package/src/adapters/claude/tools.ts +53 -688
  70. package/src/adapters/claude/types.ts +61 -0
  71. package/src/adapters/codex/spawn.ts +130 -0
  72. package/src/agent.ts +96 -587
  73. package/src/execution-mode.ts +43 -0
  74. package/src/gateway-models.ts +135 -0
  75. package/src/index.ts +79 -0
  76. package/src/otel-log-writer.test.ts +105 -0
  77. package/src/otel-log-writer.ts +94 -0
  78. package/src/posthog-api.ts +75 -235
  79. package/src/resume.ts +115 -0
  80. package/src/sagas/apply-snapshot-saga.test.ts +690 -0
  81. package/src/sagas/apply-snapshot-saga.ts +88 -0
  82. package/src/sagas/capture-tree-saga.test.ts +892 -0
  83. package/src/sagas/capture-tree-saga.ts +141 -0
  84. package/src/sagas/resume-saga.test.ts +558 -0
  85. package/src/sagas/resume-saga.ts +332 -0
  86. package/src/sagas/test-fixtures.ts +250 -0
  87. package/src/server/agent-server.test.ts +220 -0
  88. package/src/server/agent-server.ts +748 -0
  89. package/src/server/bin.ts +88 -0
  90. package/src/server/jwt.ts +65 -0
  91. package/src/server/schemas.ts +47 -0
  92. package/src/server/types.ts +13 -0
  93. package/src/server/utils/retry.test.ts +122 -0
  94. package/src/server/utils/retry.ts +61 -0
  95. package/src/server/utils/sse-parser.test.ts +93 -0
  96. package/src/server/utils/sse-parser.ts +46 -0
  97. package/src/session-log-writer.test.ts +140 -0
  98. package/src/session-log-writer.ts +137 -0
  99. package/src/test/assertions.ts +114 -0
  100. package/src/test/controllers/sse-controller.ts +107 -0
  101. package/src/test/fixtures/api.ts +111 -0
  102. package/src/test/fixtures/config.ts +33 -0
  103. package/src/test/fixtures/notifications.ts +92 -0
  104. package/src/test/mocks/claude-sdk.ts +251 -0
  105. package/src/test/mocks/msw-handlers.ts +48 -0
  106. package/src/test/setup.ts +114 -0
  107. package/src/test/wait.ts +41 -0
  108. package/src/tree-tracker.ts +173 -0
  109. package/src/types.ts +54 -137
  110. package/src/utils/acp-content.ts +58 -0
  111. package/src/utils/async-mutex.test.ts +104 -0
  112. package/src/utils/async-mutex.ts +31 -0
  113. package/src/utils/common.ts +15 -0
  114. package/src/utils/gateway.ts +9 -6
  115. package/src/utils/logger.ts +0 -30
  116. package/src/utils/streams.ts +220 -0
  117. package/CLAUDE.md +0 -331
  118. package/src/adapters/claude/claude.ts +0 -1947
  119. package/src/adapters/claude/mcp-server.ts +0 -810
  120. package/src/adapters/claude/utils.ts +0 -267
  121. package/src/adapters/connection.ts +0 -95
  122. package/src/file-manager.ts +0 -273
  123. package/src/git-manager.ts +0 -577
  124. package/src/schemas.ts +0 -241
  125. package/src/session-store.ts +0 -259
  126. package/src/task-manager.ts +0 -163
  127. package/src/todo-manager.ts +0 -180
  128. package/src/tools/registry.ts +0 -134
  129. package/src/tools/types.ts +0 -133
  130. package/src/utils/tapped-stream.ts +0 -60
  131. package/src/worktree-manager.ts +0 -974
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/acp-extensions.ts","../src/adapters/connection.ts","../src/utils/logger.ts","../src/utils/tapped-stream.ts","../src/adapters/claude/claude.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/utils/gateway.ts","../src/posthog-api.ts","../src/session-store.ts","../src/task-manager.ts","../src/types.ts","../src/schemas.ts","../src/todo-manager.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 /** Git branch was created */\n BRANCH_CREATED: \"_posthog/branch_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 BranchCreatedPayload {\n branch: 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 | BranchCreatedPayload\n | RunStartedPayload\n | TaskCompletePayload\n | ErrorNotificationPayload\n | ConsoleNotificationPayload\n | SdkSessionPayload;\n","/**\n * Shared ACP connection factory.\n *\n * Creates ACP connections for the Claude Code agent.\n */\n\nimport { AgentSideConnection, ndJsonStream } from \"@agentclientprotocol/sdk\";\nimport type { SessionStore } from \"@/session-store.js\";\nimport { Logger } from \"@/utils/logger.js\";\nimport { createTappedWritableStream } from \"@/utils/tapped-stream.js\";\nimport { ClaudeAcpAgent } from \"./claude/claude.js\";\nimport { createBidirectionalStreams, type StreamPair } from \"./claude/utils.js\";\n\nexport type AgentFramework = \"claude\";\n\nexport type AcpConnectionConfig = {\n framework?: AgentFramework;\n sessionStore?: SessionStore;\n sessionId?: string;\n taskId?: string;\n};\n\nexport type InProcessAcpConnection = {\n agentConnection: AgentSideConnection;\n clientStreams: StreamPair;\n};\n\n/**\n * Creates an ACP connection with the specified agent framework.\n *\n * @param config - Configuration including framework selection\n * @returns Connection with agent and client streams\n */\nexport function createAcpConnection(\n config: AcpConnectionConfig = {},\n): InProcessAcpConnection {\n const logger = new Logger({ debug: true, prefix: \"[AcpConnection]\" });\n const streams = createBidirectionalStreams();\n\n const { sessionStore, framework = \"claude\" } = 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 // Create the Claude agent\n const agentConnection = new AgentSideConnection((client) => {\n logger.info(\"Creating Claude agent\");\n return new ClaudeAcpAgent(client, sessionStore);\n }, agentStream);\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 * 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 type 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 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 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 { Pushable, unreachable } 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 getClaudeConfigDir(): string {\n return process.env.CLAUDE_CONFIG_DIR || path.join(os.homedir(), \".claude\");\n}\n\nfunction getClaudePlansDir(): string {\n return path.join(getClaudeConfigDir(), \"plans\");\n}\n\nfunction isClaudePlanFilePath(filePath: string | undefined): boolean {\n if (!filePath) return false;\n const resolved = path.resolve(filePath);\n const plansDir = path.resolve(getClaudePlansDir());\n return resolved === plansDir || resolved.startsWith(plansDir + path.sep);\n}\n\n/**\n * Whitelist of command prefixes that are considered read-only.\n * These commands can be used in plan mode since they don't modify files or state.\n */\nconst READ_ONLY_COMMAND_PREFIXES = [\n // File listing and info\n \"ls\",\n \"find\",\n \"tree\",\n \"stat\",\n \"file\",\n \"wc\",\n \"du\",\n \"df\",\n // File reading (non-modifying)\n \"cat\",\n \"head\",\n \"tail\",\n \"less\",\n \"more\",\n \"bat\",\n // Search\n \"grep\",\n \"rg\",\n \"ag\",\n \"ack\",\n \"fzf\",\n // Git read operations\n \"git status\",\n \"git log\",\n \"git diff\",\n \"git show\",\n \"git branch\",\n \"git remote\",\n \"git fetch\",\n \"git rev-parse\",\n \"git ls-files\",\n \"git blame\",\n \"git shortlog\",\n \"git describe\",\n \"git tag -l\",\n \"git tag --list\",\n // System info\n \"pwd\",\n \"whoami\",\n \"which\",\n \"where\",\n \"type\",\n \"printenv\",\n \"env\",\n \"echo\",\n \"printf\",\n \"date\",\n \"uptime\",\n \"uname\",\n \"id\",\n \"groups\",\n // Process info\n \"ps\",\n \"top\",\n \"htop\",\n \"pgrep\",\n \"lsof\",\n // Network read-only\n \"curl\",\n \"wget\",\n \"ping\",\n \"host\",\n \"dig\",\n \"nslookup\",\n // Package managers (info only)\n \"npm list\",\n \"npm ls\",\n \"npm view\",\n \"npm info\",\n \"npm outdated\",\n \"pnpm list\",\n \"pnpm ls\",\n \"pnpm why\",\n \"yarn list\",\n \"yarn why\",\n \"yarn info\",\n // Other read-only\n \"jq\",\n \"yq\",\n \"xargs\",\n \"sort\",\n \"uniq\",\n \"tr\",\n \"cut\",\n \"awk\",\n \"sed -n\",\n];\n\n/**\n * Checks if a bash command is read-only based on a whitelist of command prefixes.\n * Used to allow safe bash commands in plan mode.\n */\nfunction isReadOnlyBashCommand(command: string): boolean {\n const trimmed = command.trim();\n return READ_ONLY_COMMAND_PREFIXES.some(\n (prefix) =>\n trimmed === prefix ||\n trimmed.startsWith(`${prefix} `) ||\n trimmed.startsWith(`${prefix}\\t`),\n );\n}\n\nfunction clearStatsigCache(): void {\n const statsigPath = path.join(getClaudeConfigDir(), \"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 lastPlanFilePath?: string;\n lastPlanContent?: 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: unknown;\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 private getLatestAssistantText(\n notifications: SessionNotification[],\n ): string | null {\n const chunks: string[] = [];\n let started = false;\n\n for (let i = notifications.length - 1; i >= 0; i -= 1) {\n const update = notifications[i]?.update;\n if (!update) continue;\n\n if (update.sessionUpdate === \"agent_message_chunk\") {\n started = true;\n const content = update.content as {\n type?: string;\n text?: string;\n } | null;\n if (content?.type === \"text\" && content.text) {\n chunks.push(content.text);\n }\n continue;\n }\n\n if (started) {\n break;\n }\n }\n\n if (chunks.length === 0) return null;\n return chunks.reverse().join(\"\");\n }\n\n private isPlanReady(plan: string | undefined): boolean {\n if (!plan) return false;\n const trimmed = plan.trim();\n if (trimmed.length < 40) return false;\n return /(^|\\n)#{1,6}\\s+\\S/.test(trimmed);\n }\n\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: { description: string; name: string; id: string } = {\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 // Use initialModeId from _meta if provided (e.g., \"plan\" for plan mode), otherwise default\n const initialModeId = (\n params._meta as { initialModeId?: string } | undefined\n )?.initialModeId;\n const ourPermissionMode = (initialModeId ?? \"default\") as PermissionMode;\n const sdkPermissionMode: PermissionMode = ourPermissionMode;\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 // Use the requested permission mode (including plan mode)\n permissionMode: sdkPermissionMode,\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 // Enable AskUserQuestion tool via environment variable (required by SDK feature flag)\n env: {\n ...process.env,\n ELECTRON_RUN_AS_NODE: \"1\",\n CLAUDE_CODE_ENABLE_ASK_USER_QUESTION_TOOL: \"true\",\n },\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 // AskUserQuestion must be explicitly allowed for the agent to use it\n const allowedTools: string[] = [\"AskUserQuestion\"];\n const disallowedTools: string[] = [];\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 // ExitPlanMode should only be available during plan mode\n if (ourPermissionMode !== \"plan\") {\n disallowedTools.push(\"ExitPlanMode\");\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, ourPermissionMode);\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: ourPermissionMode,\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 session = this.sessions[params.sessionId];\n const { query, input } = session;\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, prompt: params.prompt }));\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 { subtype?: string }).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 // Text/thinking is streamed via stream_event, so skip them here to avoid duplication.\n const content = message.message.content;\n const contentToProcess = Array.isArray(content)\n ? content.filter(\n (block) => block.type !== \"text\" && block.type !== \"thinking\",\n )\n : content;\n\n for (const notification of toAcpNotifications(\n contentToProcess as typeof 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 // Helper to emit a tool denial notification so the UI shows the reason\n const emitToolDenial = async (message: string) => {\n this.logger.info(`[canUseTool] Tool denied: ${toolName}`, { message });\n await this.client.sessionUpdate({\n sessionId,\n update: {\n sessionUpdate: \"tool_call_update\",\n toolCallId: toolUseID,\n status: \"failed\",\n content: [\n {\n type: \"content\",\n content: {\n type: \"text\",\n text: message,\n },\n },\n ],\n },\n });\n };\n\n if (toolName === \"ExitPlanMode\") {\n // If we're already not in plan mode, just allow the tool without prompting\n // This handles the case where mode was already changed by a previous ExitPlanMode call\n // (Claude may call ExitPlanMode again after writing the plan file)\n if (session.permissionMode !== \"plan\") {\n return {\n behavior: \"allow\",\n updatedInput: toolInput,\n };\n }\n\n let updatedInput = toolInput;\n const planFromFile =\n session.lastPlanContent ||\n (session.lastPlanFilePath\n ? this.fileContentCache[session.lastPlanFilePath]\n : undefined);\n const hasPlan =\n typeof (toolInput as { plan?: unknown } | undefined)?.plan ===\n \"string\";\n if (!hasPlan) {\n const fallbackPlan = planFromFile\n ? planFromFile\n : this.getLatestAssistantText(session.notificationHistory);\n if (fallbackPlan) {\n updatedInput = {\n ...(toolInput as Record<string, unknown>),\n plan: fallbackPlan,\n };\n }\n }\n\n const planText =\n typeof (updatedInput as { plan?: unknown } | undefined)?.plan ===\n \"string\"\n ? String((updatedInput as { plan?: unknown }).plan)\n : undefined;\n if (!planText) {\n const message = `Plan not ready. Provide the full markdown plan in ExitPlanMode or write it to ${getClaudePlansDir()} before requesting approval.`;\n await emitToolDenial(message);\n return {\n behavior: \"deny\",\n message,\n interrupt: false,\n };\n }\n if (!this.isPlanReady(planText)) {\n const message =\n \"Plan not ready. Provide the full markdown plan in ExitPlanMode before requesting approval.\";\n await emitToolDenial(message);\n return {\n behavior: \"deny\",\n message,\n interrupt: false,\n };\n }\n\n // ExitPlanMode is a signal to show the permission dialog\n // The plan content should already be in the agent's text response\n // Note: The SDK's ExitPlanMode tool includes a plan parameter, so ensure it is present\n\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: { ...updatedInput, toolName },\n title: toolInfoFromToolUse(\n { name: toolName, input: updatedInput },\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,\n updatedPermissions: suggestions ?? [\n {\n type: \"setMode\",\n mode: response.outcome.optionId,\n destination: \"session\",\n },\n ],\n };\n } else {\n // User chose \"No, keep planning\" - stay in plan mode and let agent continue\n const message =\n \"User wants to continue planning. Please refine your plan based on any feedback provided, or ask clarifying questions if needed.\";\n await emitToolDenial(message);\n return {\n behavior: \"deny\",\n message,\n interrupt: false,\n };\n }\n }\n\n // AskUserQuestion always prompts user - never auto-approve\n if (toolName === \"AskUserQuestion\") {\n interface QuestionItem {\n question: string;\n header?: string;\n options: Array<{ label: string; description?: string }>;\n multiSelect?: boolean;\n }\n interface AskUserQuestionInput {\n // Full format: array of questions with options\n questions?: QuestionItem[];\n // Simple format: just a question string (used when Claude doesn't have proper schema)\n question?: string;\n header?: string;\n options?: Array<{ label: string; description?: string }>;\n multiSelect?: boolean;\n }\n const input = toolInput as AskUserQuestionInput;\n\n // Normalize to questions array format\n // Support both: { questions: [...] } and { question: \"...\" }\n let questions: QuestionItem[];\n if (input.questions && input.questions.length > 0) {\n // Full format with questions array\n questions = input.questions;\n } else if (input.question) {\n // Simple format - convert to array\n // If no options provided, just use \"Other\" for free-form input\n questions = [\n {\n question: input.question,\n header: input.header,\n options: input.options || [],\n multiSelect: input.multiSelect,\n },\n ];\n } else {\n return {\n behavior: \"deny\",\n message: \"No questions provided\",\n interrupt: true,\n };\n }\n\n // Collect all answers from all questions\n const allAnswers: Record<string, string | string[]> = {};\n\n for (let i = 0; i < questions.length; i++) {\n const question = questions[i];\n\n // Convert question options to permission options\n const options = (question.options || []).map(\n (opt: { label: string; description?: string }, idx: number) => ({\n kind: \"allow_once\" as const,\n name: opt.label,\n optionId: `option_${idx}`,\n description: opt.description,\n }),\n );\n\n // Add \"Other\" option for free-form response\n options.push({\n kind: \"allow_once\" as const,\n name: \"Other\",\n optionId: \"other\",\n description: \"Provide a custom response\",\n });\n\n const response = await this.client.requestPermission({\n options,\n sessionId,\n toolCall: {\n toolCallId: toolUseID,\n rawInput: {\n ...toolInput,\n toolName,\n // Include full question data for UI rendering\n currentQuestion: question,\n questionIndex: i,\n totalQuestions: questions.length,\n },\n // Use the full question text as title for the selection input\n title: question.question,\n },\n });\n\n if (response.outcome?.outcome === \"selected\") {\n const selectedOptionId = response.outcome.optionId;\n // Type assertion for extended outcome fields\n const extendedOutcome = response.outcome as {\n optionId: string;\n selectedOptionIds?: string[];\n customInput?: string;\n };\n\n if (selectedOptionId === \"other\" && extendedOutcome.customInput) {\n // \"Other\" was selected with custom text\n allAnswers[question.question] = extendedOutcome.customInput;\n } else if (selectedOptionId === \"other\") {\n // \"Other\" was selected but no custom text - just record \"other\"\n allAnswers[question.question] = \"other\";\n } else if (\n question.multiSelect &&\n extendedOutcome.selectedOptionIds\n ) {\n // Multi-select: collect all selected option labels\n const selectedLabels = extendedOutcome.selectedOptionIds\n .map((id: string) => {\n const idx = parseInt(id.replace(\"option_\", \"\"), 10);\n return question.options?.[idx]?.label;\n })\n .filter(Boolean) as string[];\n allAnswers[question.question] = selectedLabels;\n } else {\n // Single select\n const selectedIdx = parseInt(\n selectedOptionId.replace(\"option_\", \"\"),\n 10,\n );\n const selectedOption = question.options?.[selectedIdx];\n allAnswers[question.question] =\n selectedOption?.label || selectedOptionId;\n }\n } else {\n // User cancelled or did not answer\n return {\n behavior: \"deny\",\n message: \"User did not complete all questions\",\n interrupt: true,\n };\n }\n }\n\n // Return all answers in updatedInput\n return {\n behavior: \"allow\",\n updatedInput: {\n ...toolInput,\n answers: allAnswers,\n },\n };\n }\n\n // In plan mode, deny write/edit tools except for Claude's plan files\n // This includes both MCP-wrapped tools and built-in SDK tools\n const WRITE_TOOL_NAMES = [\n ...EDIT_TOOL_NAMES,\n \"Edit\",\n \"Write\",\n \"NotebookEdit\",\n ];\n if (\n session.permissionMode === \"plan\" &&\n WRITE_TOOL_NAMES.includes(toolName)\n ) {\n // Allow writes to Claude Code's plan files\n const filePath = (toolInput as { file_path?: string })?.file_path;\n const isPlanFile = isClaudePlanFilePath(filePath);\n\n if (isPlanFile) {\n session.lastPlanFilePath = filePath;\n const content = (toolInput as { content?: string })?.content;\n if (typeof content === \"string\") {\n session.lastPlanContent = content;\n }\n return {\n behavior: \"allow\",\n updatedInput: toolInput,\n };\n }\n\n const message =\n \"Cannot use write tools in plan mode. Use ExitPlanMode to request permission to make changes.\";\n await emitToolDenial(message);\n return {\n behavior: \"deny\",\n message,\n interrupt: false,\n };\n }\n\n // In plan mode, handle Bash separately - allow read-only commands\n if (\n session.permissionMode === \"plan\" &&\n (toolName === \"Bash\" || toolName === toolNames.bash)\n ) {\n const command = (toolInput as { command?: string })?.command ?? \"\";\n if (!isReadOnlyBashCommand(command)) {\n const message =\n \"Cannot run write/modify bash commands in plan mode. Use ExitPlanMode to request permission to make changes.\";\n await emitToolDenial(message);\n return {\n behavior: \"deny\",\n message,\n interrupt: false,\n };\n }\n // Read-only bash commands are allowed - fall through to normal permission flow\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 const message = \"User refused permission to run tool\";\n await emitToolDenial(message);\n return {\n behavior: \"deny\",\n message,\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 if (method === \"session/setMode\") {\n const { sessionId, modeId } = params as {\n sessionId: string;\n modeId: string;\n };\n await this.setSessionMode({ sessionId, modeId });\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: ContentBlockParam[] = [];\n const context: ContentBlockParam[] = [];\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 as\n | \"image/jpeg\"\n | \"image/png\"\n | \"image/gif\"\n | \"image/webp\",\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\n// Note: createAcpConnection has been moved to ../connection.ts\n// Import from there instead:\n// import { createAcpConnection } from \"../connection.js\";\n","{\n \"name\": \"@posthog/agent\",\n \"version\": \"2.0.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\ninterface ToolUse {\n name: string;\n input?: unknown;\n}\n\nexport function toolInfoFromToolUse(\n toolUse: ToolUse,\n cachedFileContent: { [key: string]: string },\n logger: Logger = new Logger({ debug: false, prefix: \"[ClaudeTools]\" }),\n): ToolInfo {\n const name = toolUse.name;\n // Cast input to allow property access - each case handles its expected properties\n const input = toolUse.input as Record<string, unknown> | undefined;\n\n switch (name) {\n case \"Task\":\n return {\n title: input?.description ? String(input.description) : \"Task\",\n kind: \"think\",\n content: input?.prompt\n ? [\n {\n type: \"content\",\n content: { type: \"text\", text: String(input.prompt) },\n },\n ]\n : [],\n };\n\n case \"NotebookRead\":\n return {\n title: input?.notebook_path\n ? `Read Notebook ${String(input.notebook_path)}`\n : \"Read Notebook\",\n kind: \"read\",\n content: [],\n locations: input?.notebook_path\n ? [{ path: String(input.notebook_path) }]\n : [],\n };\n\n case \"NotebookEdit\":\n return {\n title: input?.notebook_path\n ? `Edit Notebook ${String(input.notebook_path)}`\n : \"Edit Notebook\",\n kind: \"edit\",\n content: input?.new_source\n ? [\n {\n type: \"content\",\n content: { type: \"text\", text: String(input.new_source) },\n },\n ]\n : [],\n locations: input?.notebook_path\n ? [{ path: String(input.notebook_path) }]\n : [],\n };\n\n case \"Bash\":\n case toolNames.bash:\n return {\n title: input?.command\n ? `\\`${String(input.command).replaceAll(\"`\", \"\\\\`\")}\\``\n : \"Terminal\",\n kind: \"execute\",\n content: input?.description\n ? [\n {\n type: \"content\",\n content: { type: \"text\", text: String(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 const inputLimit = input?.limit as number | undefined;\n const inputOffset = (input?.offset as number | undefined) ?? 0;\n if (inputLimit) {\n limit = ` (${inputOffset + 1} - ${inputOffset + inputLimit})`;\n } else if (inputOffset) {\n limit = ` (from line ${inputOffset + 1})`;\n }\n return {\n title: `Read ${input?.file_path ? String(input.file_path) : \"File\"}${limit}`,\n kind: \"read\",\n locations: input?.file_path\n ? [\n {\n path: String(input.file_path),\n line: inputOffset,\n },\n ]\n : [],\n content: [],\n };\n }\n\n case \"Read\":\n return {\n title: \"Read File\",\n kind: \"read\",\n content: [],\n locations: input?.file_path\n ? [\n {\n path: String(input.file_path),\n line: (input?.offset as number | undefined) ?? 0,\n },\n ]\n : [],\n };\n\n case \"LS\":\n return {\n title: `List the ${input?.path ? `\\`${String(input.path)}\\`` : \"current\"} directory's contents`,\n kind: \"search\",\n content: [],\n locations: [],\n };\n\n case toolNames.edit:\n case \"Edit\": {\n const path = input?.file_path ? String(input.file_path) : undefined;\n let oldText = input?.old_string ? String(input.old_string) : null;\n let newText = input?.new_string ? String(input.new_string) : \"\";\n let affectedLines: number[] = [];\n\n if (path && oldText) {\n try {\n const oldContent = cachedFileContent[path] || \"\";\n const newContent = replaceAndCalculateLocation(oldContent, [\n {\n oldText,\n newText,\n replaceAll: false,\n },\n ]);\n oldText = oldContent;\n newText = newContent.newContent;\n affectedLines = newContent.lineNumbers;\n } catch (e) {\n logger.error(\"Failed to edit file\", e);\n }\n }\n return {\n title: path ? `Edit \\`${path}\\`` : \"Edit\",\n kind: \"edit\",\n content:\n input && path\n ? [\n {\n type: \"diff\",\n path,\n oldText,\n newText,\n },\n ]\n : [],\n locations: path\n ? affectedLines.length > 0\n ? affectedLines.map((line) => ({ line, path }))\n : [{ path }]\n : [],\n };\n }\n\n case toolNames.write: {\n let contentResult: ToolCallContent[] = [];\n const filePath = input?.file_path ? String(input.file_path) : undefined;\n const contentStr = input?.content ? String(input.content) : undefined;\n if (filePath) {\n contentResult = [\n {\n type: \"diff\",\n path: filePath,\n oldText: null,\n newText: contentStr ?? \"\",\n },\n ];\n } else if (contentStr) {\n contentResult = [\n {\n type: \"content\",\n content: { type: \"text\", text: contentStr },\n },\n ];\n }\n return {\n title: filePath ? `Write ${filePath}` : \"Write\",\n kind: \"edit\",\n content: contentResult,\n locations: filePath ? [{ path: filePath }] : [],\n };\n }\n\n case \"Write\": {\n const filePath = input?.file_path ? String(input.file_path) : undefined;\n const contentStr = input?.content ? String(input.content) : \"\";\n return {\n title: filePath ? `Write ${filePath}` : \"Write\",\n kind: \"edit\",\n content: filePath\n ? [\n {\n type: \"diff\",\n path: filePath,\n oldText: null,\n newText: contentStr,\n },\n ]\n : [],\n locations: filePath ? [{ path: filePath }] : [],\n };\n }\n\n case \"Glob\": {\n let label = \"Find\";\n const pathStr = input?.path ? String(input.path) : undefined;\n if (pathStr) {\n label += ` \\`${pathStr}\\``;\n }\n if (input?.pattern) {\n label += ` \\`${String(input.pattern)}\\``;\n }\n return {\n title: label,\n kind: \"search\",\n content: [],\n locations: pathStr ? [{ path: pathStr }] : [],\n };\n }\n\n case \"Grep\": {\n let label = \"grep\";\n\n if (input?.[\"-i\"]) {\n label += \" -i\";\n }\n if (input?.[\"-n\"]) {\n label += \" -n\";\n }\n\n if (input?.[\"-A\"] !== undefined) {\n label += ` -A ${input[\"-A\"]}`;\n }\n if (input?.[\"-B\"] !== undefined) {\n label += ` -B ${input[\"-B\"]}`;\n }\n if (input?.[\"-C\"] !== undefined) {\n label += ` -C ${input[\"-C\"]}`;\n }\n\n if (input?.output_mode) {\n switch (input.output_mode) {\n case \"FilesWithMatches\":\n label += \" -l\";\n break;\n case \"Count\":\n label += \" -c\";\n break;\n default:\n break;\n }\n }\n\n if (input?.head_limit !== undefined) {\n label += ` | head -${input.head_limit}`;\n }\n\n if (input?.glob) {\n label += ` --include=\"${String(input.glob)}\"`;\n }\n\n if (input?.type) {\n label += ` --type=${String(input.type)}`;\n }\n\n if (input?.multiline) {\n label += \" -P\";\n }\n\n label += ` \"${input?.pattern ? String(input.pattern) : \"\"}\"`;\n\n if (input?.path) {\n label += ` ${String(input.path)}`;\n }\n\n return {\n title: label,\n kind: \"search\",\n content: [],\n };\n }\n\n case \"WebFetch\":\n return {\n title: input?.url ? `Fetch ${String(input.url)}` : \"Fetch\",\n kind: \"fetch\",\n content: input?.prompt\n ? [\n {\n type: \"content\",\n content: { type: \"text\", text: String(input.prompt) },\n },\n ]\n : [],\n };\n\n case \"WebSearch\": {\n let label = `\"${input?.query ? String(input.query) : \"\"}\"`;\n const allowedDomains = input?.allowed_domains as string[] | undefined;\n const blockedDomains = input?.blocked_domains as string[] | undefined;\n\n if (allowedDomains && allowedDomains.length > 0) {\n label += ` (allowed: ${allowedDomains.join(\", \")})`;\n }\n\n if (blockedDomains && blockedDomains.length > 0) {\n label += ` (blocked: ${blockedDomains.join(\", \")})`;\n }\n\n return {\n title: label,\n kind: \"fetch\",\n content: [],\n };\n }\n\n case \"TodoWrite\":\n return {\n title: Array.isArray(input?.todos)\n ? `Update TODOs: ${input.todos.map((todo: { content?: string }) => todo.content).join(\", \")}`\n : \"Update TODOs\",\n kind: \"think\",\n content: [],\n };\n\n case \"ExitPlanMode\":\n return {\n title: \"Ready to code?\",\n kind: \"switch_mode\",\n content: input?.plan\n ? [\n {\n type: \"content\",\n content: { type: \"text\", text: String(input.plan) },\n },\n ]\n : [],\n };\n\n case \"AskUserQuestion\": {\n const questions = input?.questions as\n | Array<{ question?: string }>\n | undefined;\n return {\n title: questions?.[0]?.question || \"Question\",\n kind: \"ask\" as ToolKind,\n content: questions\n ? [\n {\n type: \"content\",\n content: {\n type: \"text\",\n text: JSON.stringify(questions, null, 2),\n },\n },\n ]\n : [],\n };\n }\n\n case \"Other\": {\n let output: string;\n try {\n output = JSON.stringify(input, null, 2);\n } catch {\n output = typeof input === \"string\" ? input : \"{}\";\n }\n return {\n title: name || \"Unknown Tool\",\n kind: \"other\",\n content: [\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: ToolUse | 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((item) => {\n const itemObj = item as { type?: string; text?: string };\n if (itemObj.type === \"text\") {\n return {\n type: \"content\" as const,\n content: {\n type: \"text\" as const,\n text: markdownEscape(\n (itemObj.text ?? \"\").replace(SYSTEM_REMINDER, \"\"),\n ),\n },\n };\n }\n // For non-text content, return as-is with proper typing\n return {\n type: \"content\" as const,\n content: item as { type: \"text\"; text: string },\n };\n }),\n };\n } else if (\n typeof toolResult.content === \"string\" &&\n toolResult.content.length > 0\n ) {\n return {\n content: [\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 case \"AskUserQuestion\": {\n // The answer is returned in the tool result\n const content = toolResult.content;\n if (Array.isArray(content) && content.length > 0) {\n const firstItem = content[0];\n if (\n typeof firstItem === \"object\" &&\n firstItem !== null &&\n \"text\" in firstItem\n ) {\n return {\n title: \"Answer received\",\n content: [\n {\n type: \"content\",\n content: { type: \"text\", text: String(firstItem.text) },\n },\n ],\n };\n }\n }\n return { title: \"Question answered\" };\n }\n default: {\n return toAcpContentUpdate(\n toolResult.content,\n \"is_error\" in toolResult ? toolResult.is_error : false,\n );\n }\n }\n}\n\nfunction toAcpContentUpdate(\n content: unknown,\n isError: boolean = false,\n): { content?: ToolCallContent[] } {\n if (Array.isArray(content) && content.length > 0) {\n return {\n content: content.map((item) => {\n const itemObj = item as { type?: string; text?: string };\n if (isError && itemObj.type === \"text\") {\n return {\n type: \"content\" as const,\n content: {\n type: \"text\" as const,\n text: `\\`\\`\\`\\n${itemObj.text ?? \"\"}\\n\\`\\`\\``,\n },\n };\n }\n return {\n type: \"content\" as const,\n content: item as { type: \"text\"; text: string },\n };\n }),\n };\n } else if (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/connection.js\";\nimport { PostHogFileManager } from \"./file-manager.js\";\nimport { GitManager } from \"./git-manager.js\";\nimport { PostHogAPIClient } from \"./posthog-api.js\";\nimport { SessionStore } from \"./session-store.js\";\nimport { TaskManager } from \"./task-manager.js\";\nimport type {\n AgentConfig,\n CanUseTool,\n StoredNotification,\n Task,\n TaskExecutionOptions,\n} from \"./types.js\";\nimport { Logger } from \"./utils/logger.js\";\n\n/**\n * Type for sending ACP notifications\n */\ntype SendNotification = (\n method: string,\n params: Record<string, unknown>,\n) => Promise<void>;\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 logger: Logger;\n private acpConnection?: InProcessAcpConnection;\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.getPosthogApiKey) {\n headers.Authorization = `Bearer ${config.getPosthogApiKey()}`;\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\n if (\n config.posthogApiUrl &&\n config.getPosthogApiKey &&\n config.posthogProjectId\n ) {\n this.posthogAPI = new PostHogAPIClient({\n apiUrl: config.posthogApiUrl,\n getApiKey: config.getPosthogApiKey,\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\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 this.ensureGeminiGatewayEnv(gatewayUrl, apiKey);\n } catch (error) {\n this.logger.error(\"Failed to configure LLM gateway\", error);\n throw error;\n }\n }\n\n /**\n * @deprecated Use runTaskV2() for local execution or runTaskCloud() for cloud execution.\n * This method used the old workflow system which has been removed.\n */\n async runTask(\n _taskId: string,\n _taskRunId: string,\n _options: import(\"./types.js\").TaskExecutionOptions = {},\n ): Promise<void> {\n throw new Error(\n \"runTask() is deprecated. Use runTaskV2() for local execution or runTaskCloud() for cloud execution.\",\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 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 framework: options.framework,\n sessionStore: this.sessionStore,\n sessionId: taskRunId,\n taskId,\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 if (!options.isReconnect) {\n await sendNotification(POSTHOG_NOTIFICATIONS.RUN_STARTED, {\n sessionId: taskRunId,\n runId: taskRunId,\n });\n }\n\n // Only fetch task when we need the slug for git branch creation\n if (!options.skipGitBranch) {\n const task = options.task ?? (await this.fetchTask(taskId));\n const taskSlug = (task as any).slug || task.id;\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 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 private ensureGeminiGatewayEnv(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.GEMINI_BASE_URL = resolvedGatewayUrl;\n }\n\n if (resolvedToken) {\n process.env.GEMINI_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\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 { 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 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 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 logger: Logger;\n\n constructor(config: GitConfig) {\n this.repositoryPath = config.repositoryPath;\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 allowEmpty?: boolean;\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 },\n ): string {\n let command = `commit -m \"${this.escapeShellArg(message)}\"`;\n\n if (options?.allowEmpty) {\n command += \" --allow-empty\";\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}\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}`;\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","export function getLlmGatewayUrl(posthogHost: string): string {\n const url = new URL(posthogHost);\n const hostname = url.hostname;\n\n if (hostname === \"localhost\" || hostname === \"127.0.0.1\") {\n return `${url.protocol}//localhost:3308`;\n }\n\n // Extract region from hostname (us.posthog.com, eu.posthog.com)\n // app.posthog.com is legacy US\n const regionMatch = hostname.match(/^(us|eu)\\.posthog\\.com$/);\n const region = regionMatch ? regionMatch[1] : \"us\";\n\n return `https://gateway.${region}.posthog.com`;\n}\n","import type {\n PostHogAPIConfig,\n PostHogResource,\n StoredEntry,\n Task,\n TaskArtifactUploadPayload,\n TaskRun,\n TaskRunArtifact,\n UrlMention,\n} from \"./types.js\";\nimport { getLlmGatewayUrl } from \"./utils/gateway.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.getApiKey()}`,\n \"Content-Type\": \"application/json\",\n };\n }\n\n private async apiRequest<T>(\n endpoint: string,\n options: RequestInit = {},\n ): Promise<T> {\n const url = `${this.baseUrl}${endpoint}`;\n\n const response = await fetch(url, {\n ...options,\n headers: {\n ...this.headers,\n ...options.headers,\n },\n });\n\n if (!response.ok) {\n let errorMessage: string;\n try {\n const errorResponse = await response.json();\n errorMessage = `Failed request: [${response.status}] ${JSON.stringify(errorResponse)}`;\n } catch {\n errorMessage = `Failed request: [${response.status}] ${response.statusText}`;\n }\n throw new Error(errorMessage);\n }\n\n return response.json();\n }\n\n 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.getApiKey();\n }\n\n getLlmGatewayUrl(): string {\n return getLlmGatewayUrl(this.baseUrl);\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 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 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 framework?: \"claude\"; // Agent framework to use (defaults to \"claude\")\n task?: Task; // Pre-fetched task to avoid redundant API call\n isReconnect?: boolean; // Session recreation - skip RUN_STARTED notification\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 getPosthogApiKey?: () => 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 getApiKey: () => 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// 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 { 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 { 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 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 AskUserQuestion: {\n name: \"AskUserQuestion\",\n category: \"assistant\",\n description: \"Ask the user a clarifying question with options\",\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 { 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 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(args: string[]): Promise<string> {\n try {\n const { stdout } = await execFileAsync(\"git\", args, {\n cwd: this.mainRepoPath,\n });\n return stdout.trim();\n } catch (error) {\n throw new Error(`Git command failed: git ${args.join(\" \")}\\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 all methods in parallel for speed\n const [symbolicRef, mainExists, masterExists] = await Promise.allSettled([\n this.runGitCommand([\"symbolic-ref\", \"refs/remotes/origin/HEAD\"]),\n this.runGitCommand([\"rev-parse\", \"--verify\", \"main\"]),\n this.runGitCommand([\"rev-parse\", \"--verify\", \"master\"]),\n ]);\n\n // Prefer symbolic ref (most accurate)\n if (symbolicRef.status === \"fulfilled\") {\n return symbolicRef.value.replace(\"refs/remotes/origin/\", \"\");\n }\n\n // Fallback to main if it exists\n if (mainExists.status === \"fulfilled\") {\n return \"main\";\n }\n\n // Fallback to master if it exists\n if (masterExists.status === \"fulfilled\") {\n return \"master\";\n }\n\n throw new Error(\n \"Cannot determine default branch. No main or master branch found.\",\n );\n }\n\n async createWorktree(options?: {\n baseBranch?: string;\n }): Promise<WorktreeInfo> {\n const totalStart = Date.now();\n\n // Run setup tasks in parallel for speed\n const setupPromises: Promise<unknown>[] = [];\n\n // Only modify .git/info/exclude when using in-repo storage\n if (!this.usesExternalPath()) {\n setupPromises.push(this.ensureArrayDirIgnored());\n } else {\n // Ensure the worktree folder exists when using external path\n const folderPath = this.getWorktreeFolderPath();\n setupPromises.push(fs.mkdir(folderPath, { recursive: true }));\n }\n\n // Generate unique worktree name (in parallel with above)\n const worktreeNamePromise = this.generateUniqueWorktreeName();\n setupPromises.push(worktreeNamePromise);\n\n // Get default branch in parallel if not provided\n const baseBranchPromise = options?.baseBranch\n ? Promise.resolve(options.baseBranch)\n : this.getDefaultBranch();\n setupPromises.push(baseBranchPromise);\n\n // Wait for all setup to complete\n await Promise.all(setupPromises);\n const setupTime = Date.now() - totalStart;\n\n const worktreeName = await worktreeNamePromise;\n const baseBranch = await baseBranchPromise;\n const worktreePath = this.getWorktreePath(worktreeName);\n const branchName = `array/${worktreeName}`;\n\n this.logger.info(\"Creating worktree\", {\n worktreeName,\n worktreePath,\n branchName,\n baseBranch,\n external: this.usesExternalPath(),\n setupTimeMs: setupTime,\n });\n\n // Create the worktree with a new branch\n const gitStart = Date.now();\n if (this.usesExternalPath()) {\n // Use absolute path for external worktrees\n await this.runGitCommand([\n \"worktree\",\n \"add\",\n \"--quiet\",\n \"-b\",\n branchName,\n worktreePath,\n 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\",\n \"add\",\n \"--quiet\",\n \"-b\",\n branchName,\n relativePath,\n baseBranch,\n ]);\n }\n const gitTime = Date.now() - gitStart;\n\n const createdAt = new Date().toISOString();\n\n this.logger.info(\"Worktree created successfully\", {\n worktreeName,\n worktreePath,\n branchName,\n setupTimeMs: setupTime,\n gitWorktreeAddMs: gitTime,\n totalMs: Date.now() - totalStart,\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([\n \"worktree\",\n \"list\",\n \"--porcelain\",\n ]);\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([\n \"worktree\",\n \"list\",\n \"--porcelain\",\n ]);\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 execFileAsync(\n \"git\",\n [\"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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ACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;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;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,E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","names":["LogLevel","WritableStream","resolve","resolve","WritableStream","resolve","status","unreachable","path","input","query","session","response","server","path","update","ndJsonStream","fs","join","z","join","fs","z","randomBytes","resolve","PermissionMode","ndJsonStream","resolve","z","fs","path","promisify","promisify","stat"]}
1
+ {"version":3,"sources":["../../../node_modules/ms/index.js","../../../node_modules/debug/src/common.js","../../../node_modules/debug/src/browser.js","../../../node_modules/has-flag/index.js","../../../node_modules/supports-color/index.js","../../../node_modules/debug/src/node.js","../../../node_modules/debug/src/index.js","../../../node_modules/@kwsites/file-exists/src/index.ts","../../../node_modules/@kwsites/file-exists/index.ts","../../../node_modules/@kwsites/promise-deferred/src/index.ts","../src/acp-extensions.ts","../src/adapters/acp-connection.ts","../src/utils/logger.ts","../src/utils/streams.ts","../src/adapters/claude/claude-agent.ts","../package.json","../src/utils/common.ts","../src/gateway-models.ts","../src/adapters/base-acp-agent.ts","../src/adapters/claude/conversion/acp-to-sdk.ts","../src/adapters/claude/conversion/sdk-to-acp.ts","../src/utils/acp-content.ts","../src/adapters/claude/hooks.ts","../src/adapters/claude/conversion/tool-use-to-acp.ts","../src/adapters/claude/mcp/tool-metadata.ts","../src/adapters/claude/plan/utils.ts","../src/adapters/claude/questions/utils.ts","../src/execution-mode.ts","../src/adapters/claude/tools.ts","../src/adapters/claude/permissions/permission-options.ts","../src/adapters/claude/permissions/permission-handlers.ts","../src/adapters/claude/session/commands.ts","../src/adapters/claude/session/mcp-config.ts","../src/adapters/claude/session/models.ts","../src/adapters/claude/session/options.ts","../src/adapters/codex/spawn.ts","../src/utils/gateway.ts","../src/posthog-api.ts","../src/otel-log-writer.ts","../src/session-log-writer.ts","../src/agent.ts","../../shared/src/saga.ts","../../git/src/queries.ts","../../../node_modules/simple-git/src/lib/args/pathspec.ts","../../../node_modules/simple-git/src/lib/errors/git-error.ts","../../../node_modules/simple-git/src/lib/errors/git-response-error.ts","../../../node_modules/simple-git/src/lib/errors/task-configuration-error.ts","../../../node_modules/simple-git/src/lib/utils/util.ts","../../../node_modules/simple-git/src/lib/utils/argument-filters.ts","../../../node_modules/simple-git/src/lib/utils/exit-codes.ts","../../../node_modules/simple-git/src/lib/utils/git-output-streams.ts","../../../node_modules/simple-git/src/lib/utils/line-parser.ts","../../../node_modules/simple-git/src/lib/utils/simple-git-options.ts","../../../node_modules/simple-git/src/lib/utils/task-options.ts","../../../node_modules/simple-git/src/lib/utils/task-parser.ts","../../../node_modules/simple-git/src/lib/utils/index.ts","../../../node_modules/simple-git/src/lib/tasks/check-is-repo.ts","../../../node_modules/simple-git/src/lib/responses/CleanSummary.ts","../../../node_modules/simple-git/src/lib/tasks/task.ts","../../../node_modules/simple-git/src/lib/tasks/clean.ts","../../../node_modules/simple-git/src/lib/responses/ConfigList.ts","../../../node_modules/simple-git/src/lib/tasks/config.ts","../../../node_modules/simple-git/src/lib/tasks/diff-name-status.ts","../../../node_modules/simple-git/src/lib/tasks/grep.ts","../../../node_modules/simple-git/src/lib/tasks/reset.ts","../../../node_modules/simple-git/src/lib/git-logger.ts","../../../node_modules/simple-git/src/lib/runners/tasks-pending-queue.ts","../../../node_modules/simple-git/src/lib/runners/git-executor-chain.ts","../../../node_modules/simple-git/src/lib/runners/git-executor.ts","../../../node_modules/simple-git/src/lib/task-callback.ts","../../../node_modules/simple-git/src/lib/tasks/change-working-directory.ts","../../../node_modules/simple-git/src/lib/tasks/checkout.ts","../../../node_modules/simple-git/src/lib/tasks/count-objects.ts","../../../node_modules/simple-git/src/lib/parsers/parse-commit.ts","../../../node_modules/simple-git/src/lib/tasks/commit.ts","../../../node_modules/simple-git/src/lib/tasks/first-commit.ts","../../../node_modules/simple-git/src/lib/tasks/hash-object.ts","../../../node_modules/simple-git/src/lib/responses/InitSummary.ts","../../../node_modules/simple-git/src/lib/tasks/init.ts","../../../node_modules/simple-git/src/lib/args/log-format.ts","../../../node_modules/simple-git/src/lib/responses/DiffSummary.ts","../../../node_modules/simple-git/src/lib/parsers/parse-diff-summary.ts","../../../node_modules/simple-git/src/lib/parsers/parse-list-log-summary.ts","../../../node_modules/simple-git/src/lib/tasks/diff.ts","../../../node_modules/simple-git/src/lib/tasks/log.ts","../../../node_modules/simple-git/src/lib/responses/MergeSummary.ts","../../../node_modules/simple-git/src/lib/responses/PullSummary.ts","../../../node_modules/simple-git/src/lib/parsers/parse-remote-objects.ts","../../../node_modules/simple-git/src/lib/parsers/parse-remote-messages.ts","../../../node_modules/simple-git/src/lib/parsers/parse-pull.ts","../../../node_modules/simple-git/src/lib/parsers/parse-merge.ts","../../../node_modules/simple-git/src/lib/tasks/merge.ts","../../../node_modules/simple-git/src/lib/parsers/parse-push.ts","../../../node_modules/simple-git/src/lib/tasks/push.ts","../../../node_modules/simple-git/src/lib/tasks/show.ts","../../../node_modules/simple-git/src/lib/responses/FileStatusSummary.ts","../../../node_modules/simple-git/src/lib/responses/StatusSummary.ts","../../../node_modules/simple-git/src/lib/tasks/status.ts","../../../node_modules/simple-git/src/lib/tasks/version.ts","../../../node_modules/simple-git/src/lib/simple-git-api.ts","../../../node_modules/simple-git/src/lib/runners/scheduler.ts","../../../node_modules/simple-git/src/lib/tasks/apply-patch.ts","../../../node_modules/simple-git/src/lib/responses/BranchDeleteSummary.ts","../../../node_modules/simple-git/src/lib/parsers/parse-branch-delete.ts","../../../node_modules/simple-git/src/lib/responses/BranchSummary.ts","../../../node_modules/simple-git/src/lib/parsers/parse-branch.ts","../../../node_modules/simple-git/src/lib/tasks/branch.ts","../../../node_modules/simple-git/src/lib/responses/CheckIgnore.ts","../../../node_modules/simple-git/src/lib/tasks/check-ignore.ts","../../../node_modules/simple-git/src/lib/tasks/clone.ts","../../../node_modules/simple-git/src/lib/parsers/parse-fetch.ts","../../../node_modules/simple-git/src/lib/tasks/fetch.ts","../../../node_modules/simple-git/src/lib/parsers/parse-move.ts","../../../node_modules/simple-git/src/lib/tasks/move.ts","../../../node_modules/simple-git/src/lib/tasks/pull.ts","../../../node_modules/simple-git/src/lib/responses/GetRemoteSummary.ts","../../../node_modules/simple-git/src/lib/tasks/remote.ts","../../../node_modules/simple-git/src/lib/tasks/stash-list.ts","../../../node_modules/simple-git/src/lib/tasks/sub-module.ts","../../../node_modules/simple-git/src/lib/responses/TagList.ts","../../../node_modules/simple-git/src/lib/tasks/tag.ts","../../../node_modules/simple-git/src/git.js","../../../node_modules/simple-git/src/lib/api.ts","../../../node_modules/simple-git/src/lib/errors/git-construct-error.ts","../../../node_modules/simple-git/src/lib/errors/git-plugin-error.ts","../../../node_modules/simple-git/src/lib/plugins/abort-plugin.ts","../../../node_modules/simple-git/src/lib/plugins/block-unsafe-operations-plugin.ts","../../../node_modules/simple-git/src/lib/plugins/command-config-prefixing-plugin.ts","../../../node_modules/simple-git/src/lib/plugins/completion-detection.plugin.ts","../../../node_modules/simple-git/src/lib/plugins/custom-binary.plugin.ts","../../../node_modules/simple-git/src/lib/plugins/error-detection.plugin.ts","../../../node_modules/simple-git/src/lib/plugins/plugin-store.ts","../../../node_modules/simple-git/src/lib/plugins/progress-monitor-plugin.ts","../../../node_modules/simple-git/src/lib/plugins/spawn-options-plugin.ts","../../../node_modules/simple-git/src/lib/plugins/timout-plugin.ts","../../../node_modules/simple-git/src/lib/plugins/suffix-paths.plugin.ts","../../../node_modules/simple-git/src/lib/git-factory.ts","../../../node_modules/simple-git/src/lib/runners/promise-wrapped.ts","../../../node_modules/simple-git/src/esm.mjs","../../git/src/client.ts","../../git/src/lock-detector.ts","../../git/src/rw-lock.ts","../../git/src/operation-manager.ts","../src/sagas/apply-snapshot-saga.ts","../../git/src/sagas/tree.ts","../../git/src/git-saga.ts","../src/sagas/capture-tree-saga.ts","../src/tree-tracker.ts","../src/sagas/resume-saga.ts","../src/resume.ts"],"sourcesContent":["/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar w = d * 7;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n * - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function (val, options) {\n options = options || {};\n var type = typeof val;\n if (type === 'string' && val.length > 0) {\n return parse(val);\n } else if (type === 'number' && isFinite(val)) {\n return options.long ? fmtLong(val) : fmtShort(val);\n }\n throw new Error(\n 'val is not a non-empty string or a valid number. val=' +\n JSON.stringify(val)\n );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n str = String(str);\n if (str.length > 100) {\n return;\n }\n var match = /^(-?(?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(\n str\n );\n if (!match) {\n return;\n }\n var n = parseFloat(match[1]);\n var type = (match[2] || 'ms').toLowerCase();\n switch (type) {\n case 'years':\n case 'year':\n case 'yrs':\n case 'yr':\n case 'y':\n return n * y;\n case 'weeks':\n case 'week':\n case 'w':\n return n * w;\n case 'days':\n case 'day':\n case 'd':\n return n * d;\n case 'hours':\n case 'hour':\n case 'hrs':\n case 'hr':\n case 'h':\n return n * h;\n case 'minutes':\n case 'minute':\n case 'mins':\n case 'min':\n case 'm':\n return n * m;\n case 'seconds':\n case 'second':\n case 'secs':\n case 'sec':\n case 's':\n return n * s;\n case 'milliseconds':\n case 'millisecond':\n case 'msecs':\n case 'msec':\n case 'ms':\n return n;\n default:\n return undefined;\n }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return Math.round(ms / d) + 'd';\n }\n if (msAbs >= h) {\n return Math.round(ms / h) + 'h';\n }\n if (msAbs >= m) {\n return Math.round(ms / m) + 'm';\n }\n if (msAbs >= s) {\n return Math.round(ms / s) + 's';\n }\n return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return plural(ms, msAbs, d, 'day');\n }\n if (msAbs >= h) {\n return plural(ms, msAbs, h, 'hour');\n }\n if (msAbs >= m) {\n return plural(ms, msAbs, m, 'minute');\n }\n if (msAbs >= s) {\n return plural(ms, msAbs, s, 'second');\n }\n return ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, msAbs, n, name) {\n var isPlural = msAbs >= n * 1.5;\n return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');\n}\n","\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n */\n\nfunction setup(env) {\n\tcreateDebug.debug = createDebug;\n\tcreateDebug.default = createDebug;\n\tcreateDebug.coerce = coerce;\n\tcreateDebug.disable = disable;\n\tcreateDebug.enable = enable;\n\tcreateDebug.enabled = enabled;\n\tcreateDebug.humanize = require('ms');\n\tcreateDebug.destroy = destroy;\n\n\tObject.keys(env).forEach(key => {\n\t\tcreateDebug[key] = env[key];\n\t});\n\n\t/**\n\t* The currently active debug mode names, and names to skip.\n\t*/\n\n\tcreateDebug.names = [];\n\tcreateDebug.skips = [];\n\n\t/**\n\t* Map of special \"%n\" handling functions, for the debug \"format\" argument.\n\t*\n\t* Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n\t*/\n\tcreateDebug.formatters = {};\n\n\t/**\n\t* Selects a color for a debug namespace\n\t* @param {String} namespace The namespace string for the debug instance to be colored\n\t* @return {Number|String} An ANSI color code for the given namespace\n\t* @api private\n\t*/\n\tfunction selectColor(namespace) {\n\t\tlet hash = 0;\n\n\t\tfor (let i = 0; i < namespace.length; i++) {\n\t\t\thash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n\t\t\thash |= 0; // Convert to 32bit integer\n\t\t}\n\n\t\treturn createDebug.colors[Math.abs(hash) % createDebug.colors.length];\n\t}\n\tcreateDebug.selectColor = selectColor;\n\n\t/**\n\t* Create a debugger with the given `namespace`.\n\t*\n\t* @param {String} namespace\n\t* @return {Function}\n\t* @api public\n\t*/\n\tfunction createDebug(namespace) {\n\t\tlet prevTime;\n\t\tlet enableOverride = null;\n\t\tlet namespacesCache;\n\t\tlet enabledCache;\n\n\t\tfunction debug(...args) {\n\t\t\t// Disabled?\n\t\t\tif (!debug.enabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst self = debug;\n\n\t\t\t// Set `diff` timestamp\n\t\t\tconst curr = Number(new Date());\n\t\t\tconst ms = curr - (prevTime || curr);\n\t\t\tself.diff = ms;\n\t\t\tself.prev = prevTime;\n\t\t\tself.curr = curr;\n\t\t\tprevTime = curr;\n\n\t\t\targs[0] = createDebug.coerce(args[0]);\n\n\t\t\tif (typeof args[0] !== 'string') {\n\t\t\t\t// Anything else let's inspect with %O\n\t\t\t\targs.unshift('%O');\n\t\t\t}\n\n\t\t\t// Apply any `formatters` transformations\n\t\t\tlet index = 0;\n\t\t\targs[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {\n\t\t\t\t// If we encounter an escaped % then don't increase the array index\n\t\t\t\tif (match === '%%') {\n\t\t\t\t\treturn '%';\n\t\t\t\t}\n\t\t\t\tindex++;\n\t\t\t\tconst formatter = createDebug.formatters[format];\n\t\t\t\tif (typeof formatter === 'function') {\n\t\t\t\t\tconst val = args[index];\n\t\t\t\t\tmatch = formatter.call(self, val);\n\n\t\t\t\t\t// Now we need to remove `args[index]` since it's inlined in the `format`\n\t\t\t\t\targs.splice(index, 1);\n\t\t\t\t\tindex--;\n\t\t\t\t}\n\t\t\t\treturn match;\n\t\t\t});\n\n\t\t\t// Apply env-specific formatting (colors, etc.)\n\t\t\tcreateDebug.formatArgs.call(self, args);\n\n\t\t\tconst logFn = self.log || createDebug.log;\n\t\t\tlogFn.apply(self, args);\n\t\t}\n\n\t\tdebug.namespace = namespace;\n\t\tdebug.useColors = createDebug.useColors();\n\t\tdebug.color = createDebug.selectColor(namespace);\n\t\tdebug.extend = extend;\n\t\tdebug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.\n\n\t\tObject.defineProperty(debug, 'enabled', {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: false,\n\t\t\tget: () => {\n\t\t\t\tif (enableOverride !== null) {\n\t\t\t\t\treturn enableOverride;\n\t\t\t\t}\n\t\t\t\tif (namespacesCache !== createDebug.namespaces) {\n\t\t\t\t\tnamespacesCache = createDebug.namespaces;\n\t\t\t\t\tenabledCache = createDebug.enabled(namespace);\n\t\t\t\t}\n\n\t\t\t\treturn enabledCache;\n\t\t\t},\n\t\t\tset: v => {\n\t\t\t\tenableOverride = v;\n\t\t\t}\n\t\t});\n\n\t\t// Env-specific initialization logic for debug instances\n\t\tif (typeof createDebug.init === 'function') {\n\t\t\tcreateDebug.init(debug);\n\t\t}\n\n\t\treturn debug;\n\t}\n\n\tfunction extend(namespace, delimiter) {\n\t\tconst newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);\n\t\tnewDebug.log = this.log;\n\t\treturn newDebug;\n\t}\n\n\t/**\n\t* Enables a debug mode by namespaces. This can include modes\n\t* separated by a colon and wildcards.\n\t*\n\t* @param {String} namespaces\n\t* @api public\n\t*/\n\tfunction enable(namespaces) {\n\t\tcreateDebug.save(namespaces);\n\t\tcreateDebug.namespaces = namespaces;\n\n\t\tcreateDebug.names = [];\n\t\tcreateDebug.skips = [];\n\n\t\tconst split = (typeof namespaces === 'string' ? namespaces : '')\n\t\t\t.trim()\n\t\t\t.replace(/\\s+/g, ',')\n\t\t\t.split(',')\n\t\t\t.filter(Boolean);\n\n\t\tfor (const ns of split) {\n\t\t\tif (ns[0] === '-') {\n\t\t\t\tcreateDebug.skips.push(ns.slice(1));\n\t\t\t} else {\n\t\t\t\tcreateDebug.names.push(ns);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Checks if the given string matches a namespace template, honoring\n\t * asterisks as wildcards.\n\t *\n\t * @param {String} search\n\t * @param {String} template\n\t * @return {Boolean}\n\t */\n\tfunction matchesTemplate(search, template) {\n\t\tlet searchIndex = 0;\n\t\tlet templateIndex = 0;\n\t\tlet starIndex = -1;\n\t\tlet matchIndex = 0;\n\n\t\twhile (searchIndex < search.length) {\n\t\t\tif (templateIndex < template.length && (template[templateIndex] === search[searchIndex] || template[templateIndex] === '*')) {\n\t\t\t\t// Match character or proceed with wildcard\n\t\t\t\tif (template[templateIndex] === '*') {\n\t\t\t\t\tstarIndex = templateIndex;\n\t\t\t\t\tmatchIndex = searchIndex;\n\t\t\t\t\ttemplateIndex++; // Skip the '*'\n\t\t\t\t} else {\n\t\t\t\t\tsearchIndex++;\n\t\t\t\t\ttemplateIndex++;\n\t\t\t\t}\n\t\t\t} else if (starIndex !== -1) { // eslint-disable-line no-negated-condition\n\t\t\t\t// Backtrack to the last '*' and try to match more characters\n\t\t\t\ttemplateIndex = starIndex + 1;\n\t\t\t\tmatchIndex++;\n\t\t\t\tsearchIndex = matchIndex;\n\t\t\t} else {\n\t\t\t\treturn false; // No match\n\t\t\t}\n\t\t}\n\n\t\t// Handle trailing '*' in template\n\t\twhile (templateIndex < template.length && template[templateIndex] === '*') {\n\t\t\ttemplateIndex++;\n\t\t}\n\n\t\treturn templateIndex === template.length;\n\t}\n\n\t/**\n\t* Disable debug output.\n\t*\n\t* @return {String} namespaces\n\t* @api public\n\t*/\n\tfunction disable() {\n\t\tconst namespaces = [\n\t\t\t...createDebug.names,\n\t\t\t...createDebug.skips.map(namespace => '-' + namespace)\n\t\t].join(',');\n\t\tcreateDebug.enable('');\n\t\treturn namespaces;\n\t}\n\n\t/**\n\t* Returns true if the given mode name is enabled, false otherwise.\n\t*\n\t* @param {String} name\n\t* @return {Boolean}\n\t* @api public\n\t*/\n\tfunction enabled(name) {\n\t\tfor (const skip of createDebug.skips) {\n\t\t\tif (matchesTemplate(name, skip)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tfor (const ns of createDebug.names) {\n\t\t\tif (matchesTemplate(name, ns)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t* Coerce `val`.\n\t*\n\t* @param {Mixed} val\n\t* @return {Mixed}\n\t* @api private\n\t*/\n\tfunction coerce(val) {\n\t\tif (val instanceof Error) {\n\t\t\treturn val.stack || val.message;\n\t\t}\n\t\treturn val;\n\t}\n\n\t/**\n\t* XXX DO NOT USE. This is a temporary stub function.\n\t* XXX It WILL be removed in the next major release.\n\t*/\n\tfunction destroy() {\n\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t}\n\n\tcreateDebug.enable(createDebug.load());\n\n\treturn createDebug;\n}\n\nmodule.exports = setup;\n","/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\n\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = localstorage();\nexports.destroy = (() => {\n\tlet warned = false;\n\n\treturn () => {\n\t\tif (!warned) {\n\t\t\twarned = true;\n\t\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t\t}\n\t};\n})();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n\t'#0000CC',\n\t'#0000FF',\n\t'#0033CC',\n\t'#0033FF',\n\t'#0066CC',\n\t'#0066FF',\n\t'#0099CC',\n\t'#0099FF',\n\t'#00CC00',\n\t'#00CC33',\n\t'#00CC66',\n\t'#00CC99',\n\t'#00CCCC',\n\t'#00CCFF',\n\t'#3300CC',\n\t'#3300FF',\n\t'#3333CC',\n\t'#3333FF',\n\t'#3366CC',\n\t'#3366FF',\n\t'#3399CC',\n\t'#3399FF',\n\t'#33CC00',\n\t'#33CC33',\n\t'#33CC66',\n\t'#33CC99',\n\t'#33CCCC',\n\t'#33CCFF',\n\t'#6600CC',\n\t'#6600FF',\n\t'#6633CC',\n\t'#6633FF',\n\t'#66CC00',\n\t'#66CC33',\n\t'#9900CC',\n\t'#9900FF',\n\t'#9933CC',\n\t'#9933FF',\n\t'#99CC00',\n\t'#99CC33',\n\t'#CC0000',\n\t'#CC0033',\n\t'#CC0066',\n\t'#CC0099',\n\t'#CC00CC',\n\t'#CC00FF',\n\t'#CC3300',\n\t'#CC3333',\n\t'#CC3366',\n\t'#CC3399',\n\t'#CC33CC',\n\t'#CC33FF',\n\t'#CC6600',\n\t'#CC6633',\n\t'#CC9900',\n\t'#CC9933',\n\t'#CCCC00',\n\t'#CCCC33',\n\t'#FF0000',\n\t'#FF0033',\n\t'#FF0066',\n\t'#FF0099',\n\t'#FF00CC',\n\t'#FF00FF',\n\t'#FF3300',\n\t'#FF3333',\n\t'#FF3366',\n\t'#FF3399',\n\t'#FF33CC',\n\t'#FF33FF',\n\t'#FF6600',\n\t'#FF6633',\n\t'#FF9900',\n\t'#FF9933',\n\t'#FFCC00',\n\t'#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\n// eslint-disable-next-line complexity\nfunction useColors() {\n\t// NB: In an Electron preload script, document will be defined but not fully\n\t// initialized. Since we know we're in Chrome, we'll just detect this case\n\t// explicitly\n\tif (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n\t\treturn true;\n\t}\n\n\t// Internet Explorer and Edge do not support colors.\n\tif (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n\t\treturn false;\n\t}\n\n\tlet m;\n\n\t// Is webkit? http://stackoverflow.com/a/16459606/376773\n\t// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\t// eslint-disable-next-line no-return-assign\n\treturn (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n\t\t// Is firebug? http://stackoverflow.com/a/398120/376773\n\t\t(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n\t\t// Is firefox >= v31?\n\t\t// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && (m = navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/)) && parseInt(m[1], 10) >= 31) ||\n\t\t// Double check webkit in userAgent just in case we are in a worker\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\targs[0] = (this.useColors ? '%c' : '') +\n\t\tthis.namespace +\n\t\t(this.useColors ? ' %c' : ' ') +\n\t\targs[0] +\n\t\t(this.useColors ? '%c ' : ' ') +\n\t\t'+' + module.exports.humanize(this.diff);\n\n\tif (!this.useColors) {\n\t\treturn;\n\t}\n\n\tconst c = 'color: ' + this.color;\n\targs.splice(1, 0, c, 'color: inherit');\n\n\t// The final \"%c\" is somewhat tricky, because there could be other\n\t// arguments passed either before or after the %c, so we need to\n\t// figure out the correct index to insert the CSS into\n\tlet index = 0;\n\tlet lastC = 0;\n\targs[0].replace(/%[a-zA-Z%]/g, match => {\n\t\tif (match === '%%') {\n\t\t\treturn;\n\t\t}\n\t\tindex++;\n\t\tif (match === '%c') {\n\t\t\t// We only are interested in the *last* %c\n\t\t\t// (the user may have provided their own)\n\t\t\tlastC = index;\n\t\t}\n\t});\n\n\targs.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.debug()` when available.\n * No-op when `console.debug` is not a \"function\".\n * If `console.debug` is not available, falls back\n * to `console.log`.\n *\n * @api public\n */\nexports.log = console.debug || console.log || (() => {});\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\ttry {\n\t\tif (namespaces) {\n\t\t\texports.storage.setItem('debug', namespaces);\n\t\t} else {\n\t\t\texports.storage.removeItem('debug');\n\t\t}\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\nfunction load() {\n\tlet r;\n\ttry {\n\t\tr = exports.storage.getItem('debug') || exports.storage.getItem('DEBUG') ;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n\n\t// If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\tif (!r && typeof process !== 'undefined' && 'env' in process) {\n\t\tr = process.env.DEBUG;\n\t}\n\n\treturn r;\n}\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n\ttry {\n\t\t// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context\n\t\t// The Browser also has localStorage in the global context.\n\t\treturn localStorage;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nformatters.j = function (v) {\n\ttry {\n\t\treturn JSON.stringify(v);\n\t} catch (error) {\n\t\treturn '[UnexpectedJSONParseError]: ' + error.message;\n\t}\n};\n","'use strict';\n\nmodule.exports = (flag, argv = process.argv) => {\n\tconst prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');\n\tconst position = argv.indexOf(prefix + flag);\n\tconst terminatorPosition = argv.indexOf('--');\n\treturn position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);\n};\n","'use strict';\nconst os = require('os');\nconst tty = require('tty');\nconst hasFlag = require('has-flag');\n\nconst {env} = process;\n\nlet forceColor;\nif (hasFlag('no-color') ||\n\thasFlag('no-colors') ||\n\thasFlag('color=false') ||\n\thasFlag('color=never')) {\n\tforceColor = 0;\n} else if (hasFlag('color') ||\n\thasFlag('colors') ||\n\thasFlag('color=true') ||\n\thasFlag('color=always')) {\n\tforceColor = 1;\n}\n\nif ('FORCE_COLOR' in env) {\n\tif (env.FORCE_COLOR === 'true') {\n\t\tforceColor = 1;\n\t} else if (env.FORCE_COLOR === 'false') {\n\t\tforceColor = 0;\n\t} else {\n\t\tforceColor = env.FORCE_COLOR.length === 0 ? 1 : Math.min(parseInt(env.FORCE_COLOR, 10), 3);\n\t}\n}\n\nfunction translateLevel(level) {\n\tif (level === 0) {\n\t\treturn false;\n\t}\n\n\treturn {\n\t\tlevel,\n\t\thasBasic: true,\n\t\thas256: level >= 2,\n\t\thas16m: level >= 3\n\t};\n}\n\nfunction supportsColor(haveStream, streamIsTTY) {\n\tif (forceColor === 0) {\n\t\treturn 0;\n\t}\n\n\tif (hasFlag('color=16m') ||\n\t\thasFlag('color=full') ||\n\t\thasFlag('color=truecolor')) {\n\t\treturn 3;\n\t}\n\n\tif (hasFlag('color=256')) {\n\t\treturn 2;\n\t}\n\n\tif (haveStream && !streamIsTTY && forceColor === undefined) {\n\t\treturn 0;\n\t}\n\n\tconst min = forceColor || 0;\n\n\tif (env.TERM === 'dumb') {\n\t\treturn min;\n\t}\n\n\tif (process.platform === 'win32') {\n\t\t// Windows 10 build 10586 is the first Windows release that supports 256 colors.\n\t\t// Windows 10 build 14931 is the first release that supports 16m/TrueColor.\n\t\tconst osRelease = os.release().split('.');\n\t\tif (\n\t\t\tNumber(osRelease[0]) >= 10 &&\n\t\t\tNumber(osRelease[2]) >= 10586\n\t\t) {\n\t\t\treturn Number(osRelease[2]) >= 14931 ? 3 : 2;\n\t\t}\n\n\t\treturn 1;\n\t}\n\n\tif ('CI' in env) {\n\t\tif (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI', 'GITHUB_ACTIONS', 'BUILDKITE'].some(sign => sign in env) || env.CI_NAME === 'codeship') {\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn min;\n\t}\n\n\tif ('TEAMCITY_VERSION' in env) {\n\t\treturn /^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;\n\t}\n\n\tif (env.COLORTERM === 'truecolor') {\n\t\treturn 3;\n\t}\n\n\tif ('TERM_PROGRAM' in env) {\n\t\tconst version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);\n\n\t\tswitch (env.TERM_PROGRAM) {\n\t\t\tcase 'iTerm.app':\n\t\t\t\treturn version >= 3 ? 3 : 2;\n\t\t\tcase 'Apple_Terminal':\n\t\t\t\treturn 2;\n\t\t\t// No default\n\t\t}\n\t}\n\n\tif (/-256(color)?$/i.test(env.TERM)) {\n\t\treturn 2;\n\t}\n\n\tif (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {\n\t\treturn 1;\n\t}\n\n\tif ('COLORTERM' in env) {\n\t\treturn 1;\n\t}\n\n\treturn min;\n}\n\nfunction getSupportLevel(stream) {\n\tconst level = supportsColor(stream, stream && stream.isTTY);\n\treturn translateLevel(level);\n}\n\nmodule.exports = {\n\tsupportsColor: getSupportLevel,\n\tstdout: translateLevel(supportsColor(true, tty.isatty(1))),\n\tstderr: translateLevel(supportsColor(true, tty.isatty(2)))\n};\n","/**\n * Module dependencies.\n */\n\nconst tty = require('tty');\nconst util = require('util');\n\n/**\n * This is the Node.js implementation of `debug()`.\n */\n\nexports.init = init;\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.destroy = util.deprecate(\n\t() => {},\n\t'Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'\n);\n\n/**\n * Colors.\n */\n\nexports.colors = [6, 2, 3, 4, 5, 1];\n\ntry {\n\t// Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json)\n\t// eslint-disable-next-line import/no-extraneous-dependencies\n\tconst supportsColor = require('supports-color');\n\n\tif (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) {\n\t\texports.colors = [\n\t\t\t20,\n\t\t\t21,\n\t\t\t26,\n\t\t\t27,\n\t\t\t32,\n\t\t\t33,\n\t\t\t38,\n\t\t\t39,\n\t\t\t40,\n\t\t\t41,\n\t\t\t42,\n\t\t\t43,\n\t\t\t44,\n\t\t\t45,\n\t\t\t56,\n\t\t\t57,\n\t\t\t62,\n\t\t\t63,\n\t\t\t68,\n\t\t\t69,\n\t\t\t74,\n\t\t\t75,\n\t\t\t76,\n\t\t\t77,\n\t\t\t78,\n\t\t\t79,\n\t\t\t80,\n\t\t\t81,\n\t\t\t92,\n\t\t\t93,\n\t\t\t98,\n\t\t\t99,\n\t\t\t112,\n\t\t\t113,\n\t\t\t128,\n\t\t\t129,\n\t\t\t134,\n\t\t\t135,\n\t\t\t148,\n\t\t\t149,\n\t\t\t160,\n\t\t\t161,\n\t\t\t162,\n\t\t\t163,\n\t\t\t164,\n\t\t\t165,\n\t\t\t166,\n\t\t\t167,\n\t\t\t168,\n\t\t\t169,\n\t\t\t170,\n\t\t\t171,\n\t\t\t172,\n\t\t\t173,\n\t\t\t178,\n\t\t\t179,\n\t\t\t184,\n\t\t\t185,\n\t\t\t196,\n\t\t\t197,\n\t\t\t198,\n\t\t\t199,\n\t\t\t200,\n\t\t\t201,\n\t\t\t202,\n\t\t\t203,\n\t\t\t204,\n\t\t\t205,\n\t\t\t206,\n\t\t\t207,\n\t\t\t208,\n\t\t\t209,\n\t\t\t214,\n\t\t\t215,\n\t\t\t220,\n\t\t\t221\n\t\t];\n\t}\n} catch (error) {\n\t// Swallow - we only care if `supports-color` is available; it doesn't have to be.\n}\n\n/**\n * Build up the default `inspectOpts` object from the environment variables.\n *\n * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js\n */\n\nexports.inspectOpts = Object.keys(process.env).filter(key => {\n\treturn /^debug_/i.test(key);\n}).reduce((obj, key) => {\n\t// Camel-case\n\tconst prop = key\n\t\t.substring(6)\n\t\t.toLowerCase()\n\t\t.replace(/_([a-z])/g, (_, k) => {\n\t\t\treturn k.toUpperCase();\n\t\t});\n\n\t// Coerce string value into JS value\n\tlet val = process.env[key];\n\tif (/^(yes|on|true|enabled)$/i.test(val)) {\n\t\tval = true;\n\t} else if (/^(no|off|false|disabled)$/i.test(val)) {\n\t\tval = false;\n\t} else if (val === 'null') {\n\t\tval = null;\n\t} else {\n\t\tval = Number(val);\n\t}\n\n\tobj[prop] = val;\n\treturn obj;\n}, {});\n\n/**\n * Is stdout a TTY? Colored output is enabled when `true`.\n */\n\nfunction useColors() {\n\treturn 'colors' in exports.inspectOpts ?\n\t\tBoolean(exports.inspectOpts.colors) :\n\t\ttty.isatty(process.stderr.fd);\n}\n\n/**\n * Adds ANSI color escape codes if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\tconst {namespace: name, useColors} = this;\n\n\tif (useColors) {\n\t\tconst c = this.color;\n\t\tconst colorCode = '\\u001B[3' + (c < 8 ? c : '8;5;' + c);\n\t\tconst prefix = ` ${colorCode};1m${name} \\u001B[0m`;\n\n\t\targs[0] = prefix + args[0].split('\\n').join('\\n' + prefix);\n\t\targs.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\\u001B[0m');\n\t} else {\n\t\targs[0] = getDate() + name + ' ' + args[0];\n\t}\n}\n\nfunction getDate() {\n\tif (exports.inspectOpts.hideDate) {\n\t\treturn '';\n\t}\n\treturn new Date().toISOString() + ' ';\n}\n\n/**\n * Invokes `util.formatWithOptions()` with the specified arguments and writes to stderr.\n */\n\nfunction log(...args) {\n\treturn process.stderr.write(util.formatWithOptions(exports.inspectOpts, ...args) + '\\n');\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\tif (namespaces) {\n\t\tprocess.env.DEBUG = namespaces;\n\t} else {\n\t\t// If you set a process.env field to null or undefined, it gets cast to the\n\t\t// string 'null' or 'undefined'. Just delete instead.\n\t\tdelete process.env.DEBUG;\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n\treturn process.env.DEBUG;\n}\n\n/**\n * Init logic for `debug` instances.\n *\n * Create a new `inspectOpts` object in case `useColors` is set\n * differently for a particular `debug` instance.\n */\n\nfunction init(debug) {\n\tdebug.inspectOpts = {};\n\n\tconst keys = Object.keys(exports.inspectOpts);\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tdebug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %o to `util.inspect()`, all on a single line.\n */\n\nformatters.o = function (v) {\n\tthis.inspectOpts.colors = this.useColors;\n\treturn util.inspect(v, this.inspectOpts)\n\t\t.split('\\n')\n\t\t.map(str => str.trim())\n\t\t.join(' ');\n};\n\n/**\n * Map %O to `util.inspect()`, allowing multiple lines if needed.\n */\n\nformatters.O = function (v) {\n\tthis.inspectOpts.colors = this.useColors;\n\treturn util.inspect(v, this.inspectOpts);\n};\n","/**\n * Detect Electron renderer / nwjs process, which is node, but we should\n * treat as a browser.\n */\n\nif (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) {\n\tmodule.exports = require('./browser.js');\n} else {\n\tmodule.exports = require('./node.js');\n}\n",null,null,null,"/**\n * PostHog-specific ACP extensions.\n *\n * These follow the ACP extensibility model:\n * - Custom notification methods are prefixed with `_posthog/`\n * - Custom data can be attached via `_meta` fields\n *\n * Note: When using `extNotification()` from the ACP SDK, it automatically\n * adds an extra underscore prefix (e.g., `_posthog/tree_snapshot` becomes\n * `__posthog/tree_snapshot` in the log). Code that reads logs should handle both.\n *\n * See: https://agentclientprotocol.com/docs/extensibility\n */\n\n/**\n * Custom notification methods for PostHog-specific events.\n * Used with AgentSideConnection.extNotification() or Client.extNotification()\n */\nexport const POSTHOG_NOTIFICATIONS = {\n /** Git branch was created for a task */\n BRANCH_CREATED: \"_posthog/branch_created\",\n\n /** Task run has started execution */\n RUN_STARTED: \"_posthog/run_started\",\n\n /** Task has completed (success or failure) */\n TASK_COMPLETE: \"_posthog/task_complete\",\n\n /** Error occurred during task execution */\n ERROR: \"_posthog/error\",\n\n /** Console/log output from the agent */\n CONSOLE: \"_posthog/console\",\n\n /** Maps taskRunId to agent's sessionId and adapter type (for resumption) */\n SDK_SESSION: \"_posthog/sdk_session\",\n\n /** Tree state snapshot captured (git tree hash + file archive) */\n TREE_SNAPSHOT: \"_posthog/tree_snapshot\",\n\n /** Agent mode changed (interactive/background) */\n MODE_CHANGE: \"_posthog/mode_change\",\n\n /** Request to resume a session from previous state */\n SESSION_RESUME: \"_posthog/session/resume\",\n\n /** User message sent from client to agent */\n USER_MESSAGE: \"_posthog/user_message\",\n\n /** Request to cancel current operation */\n CANCEL: \"_posthog/cancel\",\n\n /** Request to close the session */\n CLOSE: \"_posthog/close\",\n\n /** Agent status update (thinking, working, etc.) */\n STATUS: \"_posthog/status\",\n\n /** Task-level notification (progress, milestones) */\n TASK_NOTIFICATION: \"_posthog/task_notification\",\n\n /** Marks a boundary for log compaction */\n COMPACT_BOUNDARY: \"_posthog/compact_boundary\",\n} as const;\n\nexport type PostHogNotificationType =\n (typeof POSTHOG_NOTIFICATIONS)[keyof typeof POSTHOG_NOTIFICATIONS];\n\n// --- Payload types for each notification ---\n\nexport interface BranchCreatedPayload {\n branch: string;\n}\n\nexport interface RunStartedPayload {\n sessionId: string;\n runId: string;\n taskId?: string;\n}\n\nexport interface TaskCompletePayload {\n sessionId: string;\n taskId: string;\n}\n\nexport interface ErrorNotificationPayload {\n sessionId: string;\n message: string;\n error?: unknown;\n}\n\nexport interface ConsoleNotificationPayload {\n sessionId: string;\n level: \"debug\" | \"info\" | \"warn\" | \"error\";\n message: string;\n}\n\nexport interface SdkSessionPayload {\n taskRunId: string;\n sessionId: string;\n adapter: \"claude\" | \"codex\";\n}\n\nexport interface TreeSnapshotPayload {\n treeHash: string;\n baseCommit: string | null;\n archiveUrl?: string;\n changes: Array<{ path: string; status: \"A\" | \"M\" | \"D\" }>;\n timestamp: string;\n interrupted?: boolean;\n device?: {\n type: \"local\" | \"cloud\";\n name?: string;\n };\n}\n\nexport interface ModeChangePayload {\n mode: \"interactive\" | \"background\";\n previous_mode: \"interactive\" | \"background\";\n}\n\nexport interface SessionResumePayload {\n sessionId: string;\n fromSnapshot?: string;\n}\n\nexport interface UserMessagePayload {\n content: string;\n}\n\nexport interface StatusPayload {\n sessionId: string;\n status: string;\n message?: string;\n}\n\nexport interface TaskNotificationPayload {\n sessionId: string;\n type: string;\n message?: string;\n data?: Record<string, unknown>;\n}\n\nexport interface CompactBoundaryPayload {\n sessionId: string;\n timestamp: string;\n}\n\nexport type PostHogNotificationPayload =\n | BranchCreatedPayload\n | RunStartedPayload\n | TaskCompletePayload\n | ErrorNotificationPayload\n | ConsoleNotificationPayload\n | SdkSessionPayload\n | TreeSnapshotPayload\n | ModeChangePayload\n | SessionResumePayload\n | UserMessagePayload\n | StatusPayload\n | TaskNotificationPayload\n | CompactBoundaryPayload;\n","import { AgentSideConnection, ndJsonStream } from \"@agentclientprotocol/sdk\";\nimport { POSTHOG_NOTIFICATIONS } from \"../acp-extensions.js\";\nimport type { SessionLogWriter } from \"../session-log-writer.js\";\nimport type { ProcessSpawnedCallback } from \"../types.js\";\nimport { Logger } from \"../utils/logger.js\";\nimport {\n createBidirectionalStreams,\n createTappedWritableStream,\n nodeReadableToWebReadable,\n nodeWritableToWebWritable,\n type StreamPair,\n} from \"../utils/streams.js\";\nimport { ClaudeAcpAgent } from \"./claude/claude-agent.js\";\nimport { type CodexProcessOptions, spawnCodexProcess } from \"./codex/spawn.js\";\n\nexport type AgentAdapter = \"claude\" | \"codex\";\n\nexport type AcpConnectionConfig = {\n adapter?: AgentAdapter;\n logWriter?: SessionLogWriter;\n taskRunId?: string;\n taskId?: string;\n /** Deployment environment - \"local\" for desktop, \"cloud\" for cloud sandbox */\n deviceType?: \"local\" | \"cloud\";\n logger?: Logger;\n processCallbacks?: ProcessSpawnedCallback;\n codexOptions?: CodexProcessOptions;\n allowedModelIds?: Set<string>;\n};\n\nexport type AcpConnection = {\n agentConnection?: AgentSideConnection;\n clientStreams: StreamPair;\n cleanup: () => Promise<void>;\n};\n\nexport type InProcessAcpConnection = AcpConnection;\n\ntype ConfigOption = {\n id?: string;\n category?: string | null;\n currentValue?: string;\n options?: Array<\n { value?: string } | { group?: string; options?: Array<{ value?: string }> }\n >;\n};\n\nfunction isGroupedOptions(\n options: NonNullable<ConfigOption[\"options\"]>,\n): options is Array<{ group?: string; options?: Array<{ value?: string }> }> {\n return options.length > 0 && \"group\" in options[0];\n}\n\nfunction filterModelConfigOptions(\n msg: Record<string, unknown>,\n allowedModelIds: Set<string>,\n): Record<string, unknown> | null {\n const payload = msg as {\n method?: string;\n result?: { configOptions?: ConfigOption[] };\n params?: {\n update?: { sessionUpdate?: string; configOptions?: ConfigOption[] };\n };\n };\n\n const configOptions =\n payload.result?.configOptions ?? payload.params?.update?.configOptions;\n if (!configOptions) return null;\n\n const filtered = configOptions.map((opt) => {\n if (opt.category !== \"model\" || !opt.options) return opt;\n\n const options = opt.options;\n if (isGroupedOptions(options)) {\n const filteredOptions = options.map((group) => ({\n ...group,\n options: (group.options ?? []).filter(\n (o) => o?.value && allowedModelIds.has(o.value),\n ),\n }));\n const flat = filteredOptions.flatMap((g) => g.options ?? []);\n const currentAllowed =\n opt.currentValue && allowedModelIds.has(opt.currentValue);\n const nextCurrent =\n currentAllowed || flat.length === 0 ? opt.currentValue : flat[0]?.value;\n\n return {\n ...opt,\n currentValue: nextCurrent,\n options: filteredOptions,\n };\n }\n\n const valueOptions = options as Array<{ value?: string }>;\n const filteredOptions = valueOptions.filter(\n (o) => o?.value && allowedModelIds.has(o.value),\n );\n const currentAllowed =\n opt.currentValue && allowedModelIds.has(opt.currentValue);\n const nextCurrent =\n currentAllowed || filteredOptions.length === 0\n ? opt.currentValue\n : filteredOptions[0]?.value;\n\n return {\n ...opt,\n currentValue: nextCurrent,\n options: filteredOptions,\n };\n });\n\n if (payload.result?.configOptions) {\n return { ...msg, result: { ...payload.result, configOptions: filtered } };\n }\n if (payload.params?.update?.configOptions) {\n return {\n ...msg,\n params: {\n ...payload.params,\n update: { ...payload.params.update, configOptions: filtered },\n },\n };\n }\n return null;\n}\n\nfunction extractReasoningEffort(\n configOptions: ConfigOption[] | undefined,\n): string | undefined {\n if (!configOptions) return undefined;\n const option = configOptions.find((opt) => opt.id === \"reasoning_effort\");\n return option?.currentValue ?? undefined;\n}\n\n/**\n * Creates an ACP connection with the specified agent framework.\n *\n * @param config - Configuration including framework selection\n * @returns Connection with agent and client streams\n */\nexport function createAcpConnection(\n config: AcpConnectionConfig = {},\n): AcpConnection {\n const adapterType = config.adapter ?? \"claude\";\n\n if (adapterType === \"codex\") {\n return createCodexConnection(config);\n }\n\n return createClaudeConnection(config);\n}\n\nfunction createClaudeConnection(config: AcpConnectionConfig): AcpConnection {\n const logger =\n config.logger?.child(\"AcpConnection\") ??\n new Logger({ debug: true, prefix: \"[AcpConnection]\" });\n const streams = createBidirectionalStreams();\n\n const { logWriter } = config;\n\n let agentWritable = streams.agent.writable;\n let clientWritable = streams.client.writable;\n\n if (config.taskRunId && logWriter) {\n if (!logWriter.isRegistered(config.taskRunId)) {\n logWriter.register(config.taskRunId, {\n taskId: config.taskId ?? config.taskRunId,\n runId: config.taskRunId,\n deviceType: config.deviceType,\n });\n }\n\n agentWritable = createTappedWritableStream(streams.agent.writable, {\n onMessage: (line) => {\n logWriter.appendRawLine(config.taskRunId!, line);\n },\n logger,\n });\n\n clientWritable = createTappedWritableStream(streams.client.writable, {\n onMessage: (line) => {\n logWriter.appendRawLine(config.taskRunId!, line);\n },\n logger,\n });\n } else {\n logger.info(\"Tapped streams NOT enabled\", {\n hasTaskRunId: !!config.taskRunId,\n hasLogWriter: !!logWriter,\n });\n }\n\n const agentStream = ndJsonStream(agentWritable, streams.agent.readable);\n\n let agent: ClaudeAcpAgent | null = null;\n const agentConnection = new AgentSideConnection((client) => {\n agent = new ClaudeAcpAgent(client, logWriter, config.processCallbacks);\n logger.info(`Created ${agent.adapterName} agent`);\n return agent;\n }, agentStream);\n\n return {\n agentConnection,\n clientStreams: {\n readable: streams.client.readable,\n writable: clientWritable,\n },\n cleanup: async () => {\n logger.info(\"Cleaning up ACP connection\");\n\n if (agent) {\n await agent.closeSession();\n }\n\n try {\n await streams.client.writable.close();\n } catch {\n // Stream may already be closed\n }\n try {\n await streams.agent.writable.close();\n } catch {\n // Stream may already be closed\n }\n },\n };\n}\n\nfunction createCodexConnection(config: AcpConnectionConfig): AcpConnection {\n const logger =\n config.logger?.child(\"CodexConnection\") ??\n new Logger({ debug: true, prefix: \"[CodexConnection]\" });\n\n const { logWriter } = config;\n const allowedModelIds = config.allowedModelIds;\n\n const codexProcess = spawnCodexProcess({\n ...config.codexOptions,\n logger,\n processCallbacks: config.processCallbacks,\n });\n\n let clientReadable = nodeReadableToWebReadable(codexProcess.stdout);\n let clientWritable = nodeWritableToWebWritable(codexProcess.stdin);\n\n let isLoadingSession = false;\n let loadRequestId: string | number | null = null;\n let newSessionRequestId: string | number | null = null;\n let sdkSessionEmitted = false;\n const reasoningEffortBySessionId = new Map<string, string>();\n let injectedConfigId = 0;\n\n const decoder = new TextDecoder();\n const encoder = new TextEncoder();\n let readBuffer = \"\";\n\n const taskRunId = config.taskRunId;\n\n const filteringReadable = clientReadable.pipeThrough(\n new TransformStream<Uint8Array, Uint8Array>({\n transform(chunk, controller) {\n readBuffer += decoder.decode(chunk, { stream: true });\n const lines = readBuffer.split(\"\\n\");\n readBuffer = lines.pop() ?? \"\";\n\n const outputLines: string[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) {\n outputLines.push(line);\n continue;\n }\n\n let shouldFilter = false;\n\n try {\n const msg = JSON.parse(trimmed);\n const sessionId =\n msg?.params?.sessionId ?? msg?.result?.sessionId ?? null;\n const configOptions =\n msg?.result?.configOptions ?? msg?.params?.update?.configOptions;\n if (sessionId && configOptions) {\n const effort = extractReasoningEffort(configOptions);\n if (effort) {\n reasoningEffortBySessionId.set(sessionId, effort);\n }\n }\n\n if (\n !sdkSessionEmitted &&\n newSessionRequestId !== null &&\n msg.id === newSessionRequestId &&\n \"result\" in msg\n ) {\n const sessionId = msg.result?.sessionId;\n if (sessionId && taskRunId) {\n const sdkSessionNotification = {\n jsonrpc: \"2.0\",\n method: POSTHOG_NOTIFICATIONS.SDK_SESSION,\n params: {\n taskRunId,\n sessionId,\n adapter: \"codex\",\n },\n };\n outputLines.push(JSON.stringify(sdkSessionNotification));\n sdkSessionEmitted = true;\n }\n newSessionRequestId = null;\n }\n\n if (isLoadingSession) {\n if (msg.id === loadRequestId && \"result\" in msg) {\n logger.debug(\"session/load complete, resuming stream\");\n isLoadingSession = false;\n loadRequestId = null;\n } else if (msg.method === \"session/update\") {\n shouldFilter = true;\n }\n }\n\n if (!shouldFilter && allowedModelIds && allowedModelIds.size > 0) {\n const updated = filterModelConfigOptions(msg, allowedModelIds);\n if (updated) {\n outputLines.push(JSON.stringify(updated));\n continue;\n }\n }\n } catch {\n // Not valid JSON, pass through\n }\n\n if (!shouldFilter) {\n outputLines.push(line);\n const isChunkNoise =\n trimmed.includes('\"sessionUpdate\":\"agent_message_chunk\"') ||\n trimmed.includes('\"sessionUpdate\":\"agent_thought_chunk\"');\n if (!isChunkNoise) {\n logger.debug(\"codex-acp stdout:\", trimmed);\n }\n }\n }\n\n if (outputLines.length > 0) {\n const output = `${outputLines.join(\"\\n\")}\\n`;\n controller.enqueue(encoder.encode(output));\n }\n },\n flush(controller) {\n if (readBuffer.trim()) {\n controller.enqueue(encoder.encode(readBuffer));\n }\n },\n }),\n );\n clientReadable = filteringReadable;\n\n const originalWritable = clientWritable;\n clientWritable = new WritableStream({\n write(chunk) {\n const text = decoder.decode(chunk, { stream: true });\n const trimmed = text.trim();\n logger.debug(\"codex-acp stdin:\", trimmed);\n\n try {\n const msg = JSON.parse(trimmed);\n if (\n msg.method === \"session/set_config_option\" &&\n msg.params?.configId === \"reasoning_effort\" &&\n msg.params?.sessionId &&\n msg.params?.value\n ) {\n reasoningEffortBySessionId.set(\n msg.params.sessionId,\n msg.params.value,\n );\n }\n if (msg.method === \"session/prompt\" && msg.params?.sessionId) {\n const effort = reasoningEffortBySessionId.get(msg.params.sessionId);\n if (effort) {\n const injection = {\n jsonrpc: \"2.0\",\n id: `reasoning_effort_${Date.now()}_${injectedConfigId++}`,\n method: \"session/set_config_option\",\n params: {\n sessionId: msg.params.sessionId,\n configId: \"reasoning_effort\",\n value: effort,\n },\n };\n const injectionLine = `${JSON.stringify(injection)}\\n`;\n const writer = originalWritable.getWriter();\n return writer\n .write(encoder.encode(injectionLine))\n .then(() => writer.releaseLock())\n .then(() => {\n const nextWriter = originalWritable.getWriter();\n return nextWriter\n .write(chunk)\n .finally(() => nextWriter.releaseLock());\n });\n }\n }\n if (msg.method === \"session/new\" && msg.id) {\n logger.debug(\"session/new detected, tracking request ID\");\n newSessionRequestId = msg.id;\n } else if (msg.method === \"session/load\" && msg.id) {\n logger.debug(\"session/load detected, pausing stream updates\");\n isLoadingSession = true;\n loadRequestId = msg.id;\n }\n } catch {\n // Not valid JSON\n }\n\n const writer = originalWritable.getWriter();\n return writer.write(chunk).finally(() => writer.releaseLock());\n },\n close() {\n const writer = originalWritable.getWriter();\n return writer.close().finally(() => writer.releaseLock());\n },\n });\n\n const shouldTapLogs = config.taskRunId && logWriter;\n\n if (shouldTapLogs) {\n const taskRunId = config.taskRunId!;\n if (!logWriter.isRegistered(taskRunId)) {\n logWriter.register(taskRunId, {\n taskId: config.taskId ?? taskRunId,\n runId: taskRunId,\n });\n }\n\n clientWritable = createTappedWritableStream(clientWritable, {\n onMessage: (line) => {\n logWriter.appendRawLine(taskRunId, line);\n },\n logger,\n });\n\n const originalReadable = clientReadable;\n const logDecoder = new TextDecoder();\n let logBuffer = \"\";\n\n clientReadable = originalReadable.pipeThrough(\n new TransformStream<Uint8Array, Uint8Array>({\n transform(chunk, controller) {\n logBuffer += logDecoder.decode(chunk, { stream: true });\n const lines = logBuffer.split(\"\\n\");\n logBuffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (line.trim()) {\n logWriter.appendRawLine(taskRunId, line);\n }\n }\n\n controller.enqueue(chunk);\n },\n flush() {\n if (logBuffer.trim()) {\n logWriter.appendRawLine(taskRunId, logBuffer);\n }\n },\n }),\n );\n } else {\n logger.info(\"Tapped streams NOT enabled for Codex\", {\n hasTaskRunId: !!config.taskRunId,\n hasLogWriter: !!logWriter,\n });\n }\n\n return {\n agentConnection: undefined,\n clientStreams: {\n readable: clientReadable,\n writable: clientWritable,\n },\n cleanup: async () => {\n logger.info(\"Cleaning up Codex connection\");\n codexProcess.kill();\n\n try {\n await clientWritable.close();\n } catch {\n // Stream may already be closed\n }\n },\n };\n}\n","import type { LogLevel as LogLevelType, OnLogCallback } from \"../types.js\";\n\nexport interface LoggerConfig {\n debug?: boolean;\n prefix?: string;\n scope?: string;\n onLog?: OnLogCallback;\n}\n\nexport class Logger {\n private debugEnabled: boolean;\n private prefix: string;\n private scope: string;\n private onLog?: OnLogCallback;\n\n constructor(config: LoggerConfig = {}) {\n this.debugEnabled = config.debug ?? false;\n this.prefix = config.prefix ?? \"[PostHog Agent]\";\n this.scope = config.scope ?? \"agent\";\n this.onLog = config.onLog;\n }\n\n private formatMessage(\n level: string,\n message: string,\n data?: unknown,\n ): string {\n const timestamp = new Date().toISOString();\n const base = `${timestamp} ${this.prefix} [${level}] ${message}`;\n\n if (data !== undefined) {\n return `${base} ${JSON.stringify(data, null, 2)}`;\n }\n\n return base;\n }\n\n private emitLog(level: LogLevelType, message: string, data?: unknown) {\n if (this.onLog) {\n this.onLog(level, this.scope, message, data);\n return;\n }\n\n const shouldLog = this.debugEnabled || level === \"error\";\n\n if (shouldLog) {\n console[level](this.formatMessage(level.toLowerCase(), message, data));\n }\n }\n\n error(message: string, error?: Error | unknown) {\n const data =\n error instanceof Error\n ? { message: error.message, stack: error.stack }\n : error;\n\n this.emitLog(\"error\", message, data);\n }\n\n warn(message: string, data?: unknown) {\n this.emitLog(\"warn\", message, data);\n }\n\n info(message: string, data?: unknown) {\n this.emitLog(\"info\", message, data);\n }\n\n debug(message: string, data?: unknown) {\n this.emitLog(\"debug\", message, data);\n }\n\n child(childPrefix: string): Logger {\n return new Logger({\n debug: this.debugEnabled,\n prefix: `${this.prefix} [${childPrefix}]`,\n scope: `${this.scope}:${childPrefix}`,\n onLog: this.onLog,\n });\n }\n}\n","import type { Readable, Writable } from \"node:stream\";\nimport { ReadableStream, WritableStream } from \"node:stream/web\";\nimport type { Logger } from \"./logger.js\";\n\nexport class Pushable<T> implements AsyncIterable<T> {\n private queue: T[] = [];\n private resolvers: ((value: IteratorResult<T>) => void)[] = [];\n private done = false;\n\n push(item: T) {\n const resolve = this.resolvers.shift();\n if (resolve) {\n resolve({ value: item, done: false });\n } else {\n this.queue.push(item);\n }\n }\n\n end() {\n this.done = true;\n for (const resolve of this.resolvers) {\n resolve({ value: undefined as unknown as T, done: true });\n }\n this.resolvers = [];\n }\n\n [Symbol.asyncIterator](): AsyncIterator<T> {\n return {\n next: (): Promise<IteratorResult<T>> => {\n if (this.queue.length > 0) {\n const value = this.queue.shift() as T;\n return Promise.resolve({ value, done: false });\n }\n if (this.done) {\n return Promise.resolve({\n value: undefined as unknown as T,\n done: true,\n });\n }\n return new Promise<IteratorResult<T>>((resolve) => {\n this.resolvers.push(resolve);\n });\n },\n };\n }\n}\n\nexport type StreamPair = {\n readable: globalThis.ReadableStream<Uint8Array>;\n writable: globalThis.WritableStream<Uint8Array>;\n};\n\nexport type BidirectionalStreamPair = {\n client: StreamPair;\n agent: StreamPair;\n};\n\nfunction pushableToReadableStream(\n pushable: Pushable<Uint8Array>,\n): globalThis.ReadableStream<Uint8Array> {\n const iterator = pushable[Symbol.asyncIterator]();\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n const { value, done } = await iterator.next();\n if (done) {\n controller.close();\n } else {\n controller.enqueue(value);\n }\n },\n }) as unknown as globalThis.ReadableStream<Uint8Array>;\n}\n\nexport function createBidirectionalStreams(): BidirectionalStreamPair {\n const clientToAgentPushable = new Pushable<Uint8Array>();\n const agentToClientPushable = new Pushable<Uint8Array>();\n\n const clientToAgentReadable = pushableToReadableStream(clientToAgentPushable);\n const agentToClientReadable = pushableToReadableStream(agentToClientPushable);\n\n const clientToAgentWritable = new WritableStream<Uint8Array>({\n write(chunk) {\n clientToAgentPushable.push(chunk);\n },\n close() {\n clientToAgentPushable.end();\n },\n }) as globalThis.WritableStream<Uint8Array>;\n\n const agentToClientWritable = new WritableStream<Uint8Array>({\n write(chunk) {\n agentToClientPushable.push(chunk);\n },\n close() {\n agentToClientPushable.end();\n },\n }) as globalThis.WritableStream<Uint8Array>;\n\n return {\n client: {\n readable: agentToClientReadable,\n writable: clientToAgentWritable,\n },\n agent: {\n readable: clientToAgentReadable,\n writable: agentToClientWritable,\n },\n };\n}\n\ntype MessageCallback = (line: string) => void;\n\nexport interface TappedStreamOptions {\n onMessage: MessageCallback;\n logger?: Logger;\n}\n\nexport function createTappedWritableStream(\n underlying: WritableStream<Uint8Array>,\n options: TappedStreamOptions,\n): WritableStream<Uint8Array> {\n const { onMessage, logger } = options;\n const decoder = new TextDecoder();\n let buffer = \"\";\n let _messageCount = 0;\n\n return new WritableStream({\n async write(chunk: Uint8Array) {\n buffer += decoder.decode(chunk, { stream: true });\n\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (!line.trim()) continue;\n _messageCount++;\n\n onMessage(line);\n }\n\n try {\n const writer = underlying.getWriter();\n await writer.write(chunk);\n writer.releaseLock();\n } catch (err) {\n // Stream may be closed if subprocess crashed - log but don't throw\n logger?.error(\"ACP write error\", err);\n }\n },\n async close() {\n try {\n const writer = underlying.getWriter();\n await writer.close();\n writer.releaseLock();\n } catch {\n // Stream may already be closed\n }\n },\n async abort(reason: unknown) {\n logger?.warn(\"Tapped stream aborted\", { reason });\n try {\n const writer = underlying.getWriter();\n await writer.abort(reason);\n writer.releaseLock();\n } catch {\n // Stream may already be closed\n }\n },\n });\n}\n\nexport function nodeReadableToWebReadable(\n nodeStream: Readable,\n): globalThis.ReadableStream<Uint8Array> {\n return new ReadableStream<Uint8Array>({\n start(controller) {\n nodeStream.on(\"data\", (chunk: Buffer) => {\n controller.enqueue(new Uint8Array(chunk));\n });\n nodeStream.on(\"end\", () => {\n controller.close();\n });\n nodeStream.on(\"error\", (err) => {\n controller.error(err);\n });\n },\n cancel() {\n nodeStream.destroy();\n },\n }) as unknown as globalThis.ReadableStream<Uint8Array>;\n}\n\nexport function nodeWritableToWebWritable(\n nodeStream: Writable,\n): globalThis.WritableStream<Uint8Array> {\n return new WritableStream<Uint8Array>({\n write(chunk) {\n return new Promise((resolve, reject) => {\n const ok = nodeStream.write(Buffer.from(chunk), (err) => {\n if (err) reject(err);\n });\n if (ok) {\n resolve();\n } else {\n nodeStream.once(\"drain\", resolve);\n }\n });\n },\n close() {\n return new Promise((resolve) => {\n nodeStream.end(resolve);\n });\n },\n abort(reason) {\n nodeStream.destroy(\n reason instanceof Error ? reason : new Error(String(reason)),\n );\n },\n }) as globalThis.WritableStream<Uint8Array>;\n}\n","import * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport {\n type AgentSideConnection,\n type AuthenticateRequest,\n type AvailableCommand,\n type ClientCapabilities,\n type InitializeRequest,\n type InitializeResponse,\n type LoadSessionRequest,\n type LoadSessionResponse,\n type NewSessionRequest,\n type NewSessionResponse,\n type PromptRequest,\n type PromptResponse,\n RequestError,\n type SessionConfigOption,\n type SessionConfigOptionCategory,\n type SessionConfigSelectOption,\n type SetSessionConfigOptionRequest,\n type SetSessionConfigOptionResponse,\n} from \"@agentclientprotocol/sdk\";\nimport {\n type CanUseTool,\n type Options,\n type Query,\n query,\n type SDKMessage,\n type SDKUserMessage,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport { v7 as uuidv7 } from \"uuid\";\nimport packageJson from \"../../../package.json\" with { type: \"json\" };\nimport type { SessionContext } from \"../../otel-log-writer.js\";\nimport type { SessionLogWriter } from \"../../session-log-writer.js\";\nimport { unreachable } from \"../../utils/common.js\";\nimport { Logger } from \"../../utils/logger.js\";\nimport { Pushable } from \"../../utils/streams.js\";\nimport { BaseAcpAgent } from \"../base-acp-agent.js\";\nimport { promptToClaude } from \"./conversion/acp-to-sdk.js\";\nimport {\n handleResultMessage,\n handleStreamEvent,\n handleSystemMessage,\n handleUserAssistantMessage,\n} from \"./conversion/sdk-to-acp.js\";\nimport { fetchMcpToolMetadata } from \"./mcp/tool-metadata.js\";\nimport { canUseTool } from \"./permissions/permission-handlers.js\";\nimport { getAvailableSlashCommands } from \"./session/commands.js\";\nimport { parseMcpServers } from \"./session/mcp-config.js\";\nimport { toSdkModelId } from \"./session/models.js\";\nimport {\n buildSessionOptions,\n buildSystemPrompt,\n type ProcessSpawnedInfo,\n} from \"./session/options.js\";\nimport {\n getAvailableModes,\n TWIG_EXECUTION_MODES,\n type TwigExecutionMode,\n} from \"./tools.js\";\nimport type {\n BackgroundTerminal,\n NewSessionMeta,\n Session,\n ToolUseCache,\n} from \"./types.js\";\n\nexport interface ClaudeAcpAgentOptions {\n onProcessSpawned?: (info: ProcessSpawnedInfo) => void;\n onProcessExited?: (pid: number) => void;\n}\n\nexport class ClaudeAcpAgent extends BaseAcpAgent {\n readonly adapterName = \"claude\";\n declare session: Session;\n toolUseCache: ToolUseCache;\n backgroundTerminals: { [key: string]: BackgroundTerminal } = {};\n clientCapabilities?: ClientCapabilities;\n private logWriter?: SessionLogWriter;\n private processCallbacks?: ClaudeAcpAgentOptions;\n private lastSentConfigOptions?: SessionConfigOption[];\n\n constructor(\n client: AgentSideConnection,\n logWriter?: SessionLogWriter,\n processCallbacks?: ClaudeAcpAgentOptions,\n ) {\n super(client);\n this.logWriter = logWriter;\n this.processCallbacks = processCallbacks;\n this.toolUseCache = {};\n this.logger = new Logger({ debug: true, prefix: \"[ClaudeAcpAgent]\" });\n }\n\n async initialize(request: InitializeRequest): Promise<InitializeResponse> {\n this.clientCapabilities = request.clientCapabilities;\n\n return {\n protocolVersion: 1,\n agentCapabilities: {\n promptCapabilities: {\n image: true,\n embeddedContext: true,\n },\n mcpCapabilities: {\n http: true,\n sse: true,\n },\n loadSession: true,\n _meta: {\n posthog: {\n resumeSession: true,\n },\n },\n },\n agentInfo: {\n name: packageJson.name,\n title: \"Claude Code\",\n version: packageJson.version,\n },\n authMethods: [\n {\n id: \"claude-login\",\n name: \"Log in with Claude Code\",\n description: \"Run `claude /login` in the terminal\",\n },\n ],\n };\n }\n\n async authenticate(_params: AuthenticateRequest): Promise<void> {\n throw new Error(\"Method not implemented.\");\n }\n\n async newSession(params: NewSessionRequest): Promise<NewSessionResponse> {\n this.checkAuthStatus();\n\n const meta = params._meta as NewSessionMeta | undefined;\n const internalSessionId = uuidv7();\n const permissionMode: TwigExecutionMode = \"default\";\n\n const mcpServers = parseMcpServers(params);\n await fetchMcpToolMetadata(mcpServers, this.logger);\n\n const options = buildSessionOptions({\n cwd: params.cwd,\n mcpServers,\n permissionMode,\n canUseTool: this.createCanUseTool(internalSessionId),\n logger: this.logger,\n systemPrompt: buildSystemPrompt(meta?.systemPrompt),\n userProvidedOptions: meta?.claudeCode?.options,\n onModeChange: this.createOnModeChange(internalSessionId),\n onProcessSpawned: this.processCallbacks?.onProcessSpawned,\n onProcessExited: this.processCallbacks?.onProcessExited,\n });\n\n const input = new Pushable<SDKUserMessage>();\n const q = query({ prompt: input, options });\n\n const session = this.createSession(\n internalSessionId,\n q,\n input,\n permissionMode,\n params.cwd,\n options.abortController as AbortController,\n );\n session.taskRunId = meta?.taskRunId;\n this.registerPersistence(\n internalSessionId,\n meta as Record<string, unknown>,\n );\n const modelOptions = await this.getModelConfigOptions();\n session.modelId = modelOptions.currentModelId;\n await this.trySetModel(q, modelOptions.currentModelId);\n\n this.sendAvailableCommandsUpdate(\n internalSessionId,\n await getAvailableSlashCommands(q),\n );\n\n return {\n sessionId: internalSessionId,\n configOptions: await this.buildConfigOptions(modelOptions),\n };\n }\n\n async loadSession(params: LoadSessionRequest): Promise<LoadSessionResponse> {\n return this.resumeSession(params);\n }\n\n async resumeSession(\n params: LoadSessionRequest,\n ): Promise<LoadSessionResponse> {\n const { sessionId: internalSessionId } = params;\n if (this.sessionId === internalSessionId) {\n return {};\n }\n\n const meta = params._meta as NewSessionMeta | undefined;\n const mcpServers = parseMcpServers(params);\n await fetchMcpToolMetadata(mcpServers, this.logger);\n\n const { query: q, session } = await this.initializeQuery({\n internalSessionId,\n cwd: params.cwd,\n permissionMode: \"default\",\n mcpServers,\n systemPrompt: buildSystemPrompt(meta?.systemPrompt),\n userProvidedOptions: meta?.claudeCode?.options,\n sessionId: meta?.sessionId,\n additionalDirectories: meta?.claudeCode?.options?.additionalDirectories,\n });\n\n session.taskRunId = meta?.taskRunId;\n if (meta?.sessionId) {\n session.sessionId = meta.sessionId;\n }\n\n this.registerPersistence(\n internalSessionId,\n meta as Record<string, unknown>,\n );\n this.sendAvailableCommandsUpdate(\n internalSessionId,\n await getAvailableSlashCommands(q),\n );\n\n return {\n configOptions: await this.buildConfigOptions(),\n };\n }\n\n async prompt(params: PromptRequest): Promise<PromptResponse> {\n this.session.cancelled = false;\n this.session.interruptReason = undefined;\n\n await this.broadcastUserMessage(params);\n this.session.input.push(promptToClaude(params));\n\n return this.processMessages(params.sessionId);\n }\n\n async setSessionConfigOption(\n params: SetSessionConfigOptionRequest,\n ): Promise<SetSessionConfigOptionResponse> {\n const configId = params.configId;\n const value = params.value;\n\n if (configId === \"mode\") {\n const modeId = value as TwigExecutionMode;\n if (!TWIG_EXECUTION_MODES.includes(modeId)) {\n throw new Error(\"Invalid Mode\");\n }\n this.session.permissionMode = modeId;\n await this.session.query.setPermissionMode(modeId);\n } else if (configId === \"model\") {\n await this.setModelWithFallback(this.session.query, value);\n this.session.modelId = value;\n } else {\n throw new Error(\"Unsupported config option\");\n }\n\n await this.emitConfigOptionsUpdate();\n return { configOptions: await this.buildConfigOptions() };\n }\n\n protected async interruptSession(): Promise<void> {\n await this.session.query.interrupt();\n }\n\n async extMethod(\n method: string,\n params: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n if (method === \"_posthog/session/resume\") {\n const result = await this.resumeSession(\n params as unknown as LoadSessionRequest,\n );\n return {\n _meta: {\n configOptions: result.configOptions,\n },\n };\n }\n\n throw RequestError.methodNotFound(method);\n }\n\n private createSession(\n sessionId: string,\n q: Query,\n input: Pushable<SDKUserMessage>,\n permissionMode: TwigExecutionMode,\n cwd: string,\n abortController: AbortController,\n ): Session {\n const session: Session = {\n query: q,\n input,\n cancelled: false,\n permissionMode,\n cwd,\n notificationHistory: [],\n abortController,\n };\n this.session = session;\n this.sessionId = sessionId;\n return session;\n }\n\n private async initializeQuery(config: {\n internalSessionId: string;\n cwd: string;\n permissionMode: TwigExecutionMode;\n mcpServers: ReturnType<typeof parseMcpServers>;\n userProvidedOptions?: Options;\n systemPrompt?: Options[\"systemPrompt\"];\n sessionId?: string;\n additionalDirectories?: string[];\n }): Promise<{\n query: Query;\n input: Pushable<SDKUserMessage>;\n session: Session;\n }> {\n const input = new Pushable<SDKUserMessage>();\n\n const options = buildSessionOptions({\n cwd: config.cwd,\n mcpServers: config.mcpServers,\n permissionMode: config.permissionMode,\n canUseTool: this.createCanUseTool(config.internalSessionId),\n logger: this.logger,\n systemPrompt: config.systemPrompt,\n userProvidedOptions: config.userProvidedOptions,\n sessionId: config.sessionId,\n additionalDirectories: config.additionalDirectories,\n onModeChange: this.createOnModeChange(config.internalSessionId),\n onProcessSpawned: this.processCallbacks?.onProcessSpawned,\n onProcessExited: this.processCallbacks?.onProcessExited,\n });\n\n const q = query({ prompt: input, options });\n const abortController = options.abortController as AbortController;\n\n const session = this.createSession(\n config.internalSessionId,\n q,\n input,\n config.permissionMode,\n config.cwd,\n abortController,\n );\n\n return { query: q, input, session };\n }\n\n private createCanUseTool(sessionId: string): CanUseTool {\n return async (toolName, toolInput, { suggestions, toolUseID }) =>\n canUseTool({\n session: this.session,\n toolName,\n toolInput: toolInput as Record<string, unknown>,\n toolUseID,\n suggestions,\n client: this.client,\n sessionId,\n fileContentCache: this.fileContentCache,\n logger: this.logger,\n emitConfigOptionsUpdate: () => this.emitConfigOptionsUpdate(sessionId),\n });\n }\n\n private createOnModeChange(sessionId: string) {\n return async (newMode: TwigExecutionMode) => {\n if (this.session) {\n this.session.permissionMode = newMode;\n }\n await this.emitConfigOptionsUpdate(sessionId);\n };\n }\n\n private async buildConfigOptions(modelOptionsOverride?: {\n currentModelId: string;\n options: SessionConfigSelectOption[];\n }): Promise<SessionConfigOption[]> {\n const options: SessionConfigOption[] = [];\n\n const modeOptions = getAvailableModes().map((mode) => ({\n value: mode.id,\n name: mode.name,\n description: mode.description ?? undefined,\n }));\n\n options.push({\n id: \"mode\",\n name: \"Approval Preset\",\n type: \"select\",\n currentValue: this.session.permissionMode,\n options: modeOptions,\n category: \"mode\" as SessionConfigOptionCategory,\n description: \"Choose an approval and sandboxing preset for your session\",\n });\n\n const modelOptions =\n modelOptionsOverride ??\n (await this.getModelConfigOptions(this.session.modelId));\n this.session.modelId = modelOptions.currentModelId;\n\n options.push({\n id: \"model\",\n name: \"Model\",\n type: \"select\",\n currentValue: modelOptions.currentModelId,\n options: modelOptions.options,\n category: \"model\" as SessionConfigOptionCategory,\n description: \"Choose which model Claude should use\",\n });\n\n return options;\n }\n\n private async emitConfigOptionsUpdate(sessionId?: string): Promise<void> {\n const configOptions = await this.buildConfigOptions();\n const serialized = JSON.stringify(configOptions);\n if (\n this.lastSentConfigOptions &&\n JSON.stringify(this.lastSentConfigOptions) === serialized\n ) {\n return;\n }\n\n this.lastSentConfigOptions = configOptions;\n await this.client.sessionUpdate({\n sessionId: sessionId ?? this.sessionId,\n update: {\n sessionUpdate: \"config_option_update\",\n configOptions,\n },\n });\n }\n\n private checkAuthStatus() {\n const backupExists = fs.existsSync(\n path.resolve(os.homedir(), \".claude.json.backup\"),\n );\n const configExists = fs.existsSync(\n path.resolve(os.homedir(), \".claude.json\"),\n );\n if (backupExists && !configExists) {\n throw RequestError.authRequired();\n }\n }\n\n private async trySetModel(q: Query, modelId: string) {\n try {\n await this.setModelWithFallback(q, modelId);\n } catch (err) {\n this.logger.warn(\"Failed to set model\", { modelId, error: err });\n }\n }\n\n private async setModelWithFallback(q: Query, modelId: string): Promise<void> {\n try {\n await q.setModel(modelId);\n return;\n } catch (err) {\n const fallback = toSdkModelId(modelId);\n if (fallback === modelId) {\n throw err;\n }\n await q.setModel(fallback);\n }\n }\n\n private registerPersistence(\n sessionId: string,\n meta: Record<string, unknown> | undefined,\n ) {\n const persistence = meta?.persistence as SessionContext | undefined;\n if (persistence && this.logWriter) {\n this.logWriter.register(sessionId, persistence);\n }\n }\n\n private sendAvailableCommandsUpdate(\n sessionId: string,\n availableCommands: AvailableCommand[],\n ) {\n setTimeout(() => {\n this.client.sessionUpdate({\n sessionId,\n update: {\n sessionUpdate: \"available_commands_update\",\n availableCommands,\n },\n });\n }, 0);\n }\n\n private async broadcastUserMessage(params: PromptRequest): Promise<void> {\n for (const chunk of params.prompt) {\n const notification = {\n sessionId: params.sessionId,\n update: {\n sessionUpdate: \"user_message_chunk\" as const,\n content: chunk,\n },\n };\n await this.client.sessionUpdate(notification);\n this.appendNotification(params.sessionId, notification);\n }\n }\n\n private async processMessages(sessionId: string): Promise<PromptResponse> {\n const context = {\n session: this.session,\n sessionId,\n client: this.client,\n toolUseCache: this.toolUseCache,\n fileContentCache: this.fileContentCache,\n logger: this.logger,\n };\n\n while (true) {\n const { value: message, done } = await this.session.query.next();\n\n if (done || !message) {\n return this.handleSessionEnd();\n }\n\n const response = await this.handleMessage(message, context);\n if (response) {\n return response;\n }\n }\n }\n\n private handleSessionEnd(): PromptResponse {\n if (this.session.cancelled) {\n return {\n stopReason: \"cancelled\",\n _meta: this.session.interruptReason\n ? { interruptReason: this.session.interruptReason }\n : undefined,\n };\n }\n throw new Error(\"Session did not end in result\");\n }\n\n private async handleMessage(\n message: SDKMessage,\n context: Parameters<typeof handleSystemMessage>[1],\n ): Promise<PromptResponse | null> {\n switch (message.type) {\n case \"system\":\n await handleSystemMessage(message, context);\n return null;\n\n case \"result\": {\n const result = handleResultMessage(message, context);\n if (result.error) throw result.error;\n if (result.shouldStop) {\n return {\n stopReason: result.stopReason as \"end_turn\" | \"max_turn_requests\",\n };\n }\n return null;\n }\n\n case \"stream_event\":\n await handleStreamEvent(message, context);\n return null;\n\n case \"user\":\n case \"assistant\": {\n const result = await handleUserAssistantMessage(message, context);\n if (result.error) throw result.error;\n if (result.shouldStop) {\n return { stopReason: \"end_turn\" };\n }\n return null;\n }\n\n case \"tool_progress\":\n case \"auth_status\":\n return null;\n\n default:\n unreachable(message, this.logger);\n return null;\n }\n }\n}\n","{\n \"name\": \"@posthog/agent\",\n \"version\": \"2.0.2\",\n \"repository\": \"https://github.com/PostHog/twig\",\n \"description\": \"TypeScript agent framework wrapping Claude Agent SDK with Git-based task execution for PostHog\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n },\n \"./agent\": {\n \"types\": \"./dist/agent.d.ts\",\n \"import\": \"./dist/agent.js\"\n },\n \"./gateway-models\": {\n \"types\": \"./dist/gateway-models.d.ts\",\n \"import\": \"./dist/gateway-models.js\"\n },\n \"./posthog-api\": {\n \"types\": \"./dist/posthog-api.d.ts\",\n \"import\": \"./dist/posthog-api.js\"\n },\n \"./types\": {\n \"types\": \"./dist/types.d.ts\",\n \"import\": \"./dist/types.js\"\n },\n \"./adapters/claude/questions/utils\": {\n \"types\": \"./dist/adapters/claude/questions/utils.d.ts\",\n \"import\": \"./dist/adapters/claude/questions/utils.js\"\n },\n \"./adapters/claude/permissions/permission-options\": {\n \"types\": \"./dist/adapters/claude/permissions/permission-options.d.ts\",\n \"import\": \"./dist/adapters/claude/permissions/permission-options.js\"\n },\n \"./adapters/claude/tools\": {\n \"types\": \"./dist/adapters/claude/tools.d.ts\",\n \"import\": \"./dist/adapters/claude/tools.js\"\n },\n \"./adapters/claude/conversion/tool-use-to-acp\": {\n \"types\": \"./dist/adapters/claude/conversion/tool-use-to-acp.d.ts\",\n \"import\": \"./dist/adapters/claude/conversion/tool-use-to-acp.js\"\n },\n \"./server\": {\n \"types\": \"./dist/server/agent-server.d.ts\",\n \"import\": \"./dist/server/agent-server.js\"\n }\n },\n \"bin\": {\n \"agent-server\": \"./dist/server/bin.js\"\n },\n \"type\": \"module\",\n \"keywords\": [\n \"posthog\",\n \"claude\",\n \"agent\",\n \"ai\",\n \"git\",\n \"typescript\"\n ],\n \"author\": \"PostHog\",\n \"license\": \"SEE LICENSE IN LICENSE\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"typecheck\": \"pnpm exec tsc --noEmit\",\n \"prepublishOnly\": \"pnpm run build\"\n },\n \"engines\": {\n \"node\": \">=20.0.0\"\n },\n \"devDependencies\": {\n \"@changesets/cli\": \"^2.27.8\",\n \"@types/bun\": \"latest\",\n \"@types/tar\": \"^6.1.13\",\n \"minimatch\": \"^10.0.3\",\n \"@posthog/shared\": \"workspace:*\",\n \"@twig/git\": \"workspace:*\",\n \"msw\": \"^2.12.7\",\n \"tsup\": \"^8.5.1\",\n \"tsx\": \"^4.20.6\",\n \"typescript\": \"^5.5.0\",\n \"vitest\": \"^2.1.8\"\n },\n \"dependencies\": {\n \"@opentelemetry/api-logs\": \"^0.208.0\",\n \"@opentelemetry/exporter-logs-otlp-http\": \"^0.208.0\",\n \"@opentelemetry/resources\": \"^2.0.0\",\n \"@opentelemetry/sdk-logs\": \"^0.208.0\",\n \"@opentelemetry/semantic-conventions\": \"^1.28.0\",\n \"@agentclientprotocol/sdk\": \"^0.14.0\",\n \"@anthropic-ai/claude-agent-sdk\": \"0.2.12\",\n \"@anthropic-ai/sdk\": \"^0.71.0\",\n \"@hono/node-server\": \"^1.19.9\",\n \"@modelcontextprotocol/sdk\": \"^1.25.3\",\n \"@types/jsonwebtoken\": \"^9.0.10\",\n \"commander\": \"^14.0.2\",\n \"diff\": \"^8.0.2\",\n \"dotenv\": \"^17.2.3\",\n \"hono\": \"^4.11.7\",\n \"jsonwebtoken\": \"^9.0.2\",\n \"tar\": \"^7.5.0\",\n \"uuid\": \"13.0.0\",\n \"yoga-wasm-web\": \"^0.3.3\",\n \"zod\": \"^3.24.1\"\n },\n \"files\": [\n \"dist/**/*\",\n \"src/**/*\",\n \"README.md\",\n \"CLAUDE.md\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","import type { Logger } from \"./logger.js\";\n\nexport const IS_ROOT =\n typeof process !== \"undefined\" &&\n (process.geteuid?.() ?? process.getuid?.()) === 0;\n\nexport function unreachable(value: never, logger: Logger): void {\n let valueAsString: string;\n try {\n valueAsString = JSON.stringify(value);\n } catch {\n valueAsString = value;\n }\n logger.error(`Unexpected case: ${valueAsString}`);\n}\n","export interface GatewayModel {\n id: string;\n owned_by: string;\n context_window: number;\n supports_streaming: boolean;\n supports_vision: boolean;\n}\n\ninterface GatewayModelsResponse {\n object: \"list\";\n data: GatewayModel[];\n}\n\nexport interface FetchGatewayModelsOptions {\n gatewayUrl: string;\n}\n\nexport const DEFAULT_GATEWAY_MODEL = \"claude-opus-4-6\";\n\nexport const BLOCKED_MODELS = new Set([\"gpt-5-mini\", \"openai/gpt-5-mini\"]);\n\ntype ArrayModelsResponse =\n | {\n data?: Array<{ id?: string; owned_by?: string }>;\n models?: Array<{ id?: string; owned_by?: string }>;\n }\n | Array<{ id?: string; owned_by?: string }>;\n\nexport async function fetchGatewayModels(\n options?: FetchGatewayModelsOptions,\n): Promise<GatewayModel[]> {\n const gatewayUrl = options?.gatewayUrl ?? process.env.ANTHROPIC_BASE_URL;\n if (!gatewayUrl) {\n return [];\n }\n\n const modelsUrl = `${gatewayUrl}/v1/models`;\n\n try {\n const response = await fetch(modelsUrl);\n\n if (!response.ok) {\n return [];\n }\n\n const data = (await response.json()) as GatewayModelsResponse;\n const models = data.data ?? [];\n return models.filter((m) => !BLOCKED_MODELS.has(m.id));\n } catch {\n return [];\n }\n}\n\nexport function isAnthropicModel(model: GatewayModel): boolean {\n if (model.owned_by) {\n return model.owned_by === \"anthropic\";\n }\n return model.id.startsWith(\"claude-\") || model.id.startsWith(\"anthropic/\");\n}\n\nexport async function fetchArrayModelIds(\n options?: FetchGatewayModelsOptions,\n): Promise<string[]> {\n const models = await fetchArrayModels(options);\n return models.map((model) => model.id);\n}\n\nexport interface ArrayModelInfo {\n id: string;\n owned_by?: string;\n}\n\nexport async function fetchArrayModels(\n options?: FetchGatewayModelsOptions,\n): Promise<ArrayModelInfo[]> {\n const gatewayUrl = options?.gatewayUrl ?? process.env.ANTHROPIC_BASE_URL;\n if (!gatewayUrl) {\n return [];\n }\n\n try {\n const base = new URL(gatewayUrl);\n base.pathname = \"/array/v1/models\";\n base.search = \"\";\n base.hash = \"\";\n const response = await fetch(base.toString());\n if (!response.ok) {\n return [];\n }\n const data = (await response.json()) as ArrayModelsResponse;\n const models = Array.isArray(data)\n ? data\n : (data.data ?? data.models ?? []);\n const results: ArrayModelInfo[] = [];\n for (const model of models) {\n const id = model?.id ? String(model.id) : \"\";\n if (!id) continue;\n results.push({ id, owned_by: model?.owned_by });\n }\n return results;\n } catch {\n return [];\n }\n}\n\nconst PROVIDER_NAMES: Record<string, string> = {\n anthropic: \"Anthropic\",\n openai: \"OpenAI\",\n \"google-vertex\": \"Gemini\",\n};\n\nexport function getProviderName(ownedBy: string): string {\n return PROVIDER_NAMES[ownedBy] ?? ownedBy;\n}\n\nconst PROVIDER_PREFIXES = [\"anthropic/\", \"openai/\", \"google-vertex/\"];\n\nexport function formatGatewayModelName(model: GatewayModel): string {\n let cleanId = model.id;\n for (const prefix of PROVIDER_PREFIXES) {\n if (cleanId.startsWith(prefix)) {\n cleanId = cleanId.slice(prefix.length);\n break;\n }\n }\n\n cleanId = cleanId.replace(/(\\d)-(\\d)/g, \"$1.$2\");\n\n const words = cleanId.split(/[-_]/).map((word) => {\n if (word.match(/^[0-9.]+$/)) return word;\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n });\n\n return words.join(\" \");\n}\n","import type {\n Agent,\n AgentSideConnection,\n AuthenticateRequest,\n CancelNotification,\n InitializeRequest,\n InitializeResponse,\n NewSessionRequest,\n NewSessionResponse,\n PromptRequest,\n PromptResponse,\n ReadTextFileRequest,\n ReadTextFileResponse,\n SessionConfigSelectOption,\n SessionNotification,\n WriteTextFileRequest,\n WriteTextFileResponse,\n} from \"@agentclientprotocol/sdk\";\nimport {\n DEFAULT_GATEWAY_MODEL,\n fetchGatewayModels,\n formatGatewayModelName,\n isAnthropicModel,\n} from \"../gateway-models.js\";\nimport { Logger } from \"../utils/logger.js\";\n\nexport interface BaseSession {\n notificationHistory: SessionNotification[];\n cancelled: boolean;\n interruptReason?: string;\n abortController: AbortController;\n}\n\nexport abstract class BaseAcpAgent implements Agent {\n abstract readonly adapterName: string;\n protected session!: BaseSession;\n protected sessionId!: string;\n client: AgentSideConnection;\n logger: Logger;\n fileContentCache: { [key: string]: string } = {};\n\n constructor(client: AgentSideConnection) {\n this.client = client;\n this.logger = new Logger({ debug: true, prefix: \"[BaseAcpAgent]\" });\n }\n\n abstract initialize(request: InitializeRequest): Promise<InitializeResponse>;\n abstract newSession(params: NewSessionRequest): Promise<NewSessionResponse>;\n abstract prompt(params: PromptRequest): Promise<PromptResponse>;\n protected abstract interruptSession(): Promise<void>;\n\n async cancel(params: CancelNotification): Promise<void> {\n if (this.sessionId !== params.sessionId) {\n throw new Error(\"Session not found\");\n }\n this.session.cancelled = true;\n const meta = params._meta as { interruptReason?: string } | undefined;\n if (meta?.interruptReason) {\n this.session.interruptReason = meta.interruptReason;\n }\n await this.interruptSession();\n }\n\n async closeSession(): Promise<void> {\n try {\n // Abort first so in-flight HTTP requests are cancelled,\n // otherwise interrupt() deadlocks waiting for the query to stop\n // while the query waits on an API call that will never abort.\n this.session.abortController.abort();\n await this.cancel({ sessionId: this.sessionId });\n this.logger.info(\"Closed session\", { sessionId: this.sessionId });\n } catch (err) {\n this.logger.warn(\"Failed to close session\", {\n sessionId: this.sessionId,\n error: err,\n });\n }\n }\n\n hasSession(sessionId: string): boolean {\n return this.sessionId === sessionId;\n }\n\n appendNotification(\n sessionId: string,\n notification: SessionNotification,\n ): void {\n if (this.sessionId === sessionId) {\n this.session.notificationHistory.push(notification);\n }\n }\n\n async readTextFile(\n params: ReadTextFileRequest,\n ): Promise<ReadTextFileResponse> {\n const response = await this.client.readTextFile(params);\n if (!params.limit && !params.line) {\n this.fileContentCache[params.path] = response.content;\n }\n return response;\n }\n\n async writeTextFile(\n params: WriteTextFileRequest,\n ): Promise<WriteTextFileResponse> {\n const response = await this.client.writeTextFile(params);\n this.fileContentCache[params.path] = params.content;\n return response;\n }\n\n async authenticate(_params: AuthenticateRequest): Promise<void> {\n throw new Error(\"Method not implemented.\");\n }\n\n async getModelConfigOptions(currentModelOverride?: string): Promise<{\n currentModelId: string;\n options: SessionConfigSelectOption[];\n }> {\n const gatewayModels = await fetchGatewayModels();\n\n const options = gatewayModels\n .filter((model) => isAnthropicModel(model))\n .map((model) => ({\n value: model.id,\n name: formatGatewayModelName(model),\n description: `Context: ${model.context_window.toLocaleString()} tokens`,\n }));\n\n const isAnthropicModelId = (modelId: string): boolean =>\n modelId.startsWith(\"claude-\") || modelId.startsWith(\"anthropic/\");\n\n let currentModelId = currentModelOverride ?? DEFAULT_GATEWAY_MODEL;\n\n if (!options.some((opt) => opt.value === currentModelId)) {\n if (!isAnthropicModelId(currentModelId)) {\n currentModelId = DEFAULT_GATEWAY_MODEL;\n }\n }\n\n if (!options.some((opt) => opt.value === currentModelId)) {\n options.unshift({\n value: currentModelId,\n name: currentModelId,\n description: \"Custom model\",\n });\n }\n\n return { currentModelId, options };\n }\n}\n","import type { PromptRequest } from \"@agentclientprotocol/sdk\";\nimport type { SDKUserMessage } from \"@anthropic-ai/claude-agent-sdk\";\nimport type { ContentBlockParam } from \"@anthropic-ai/sdk/resources\";\n\ntype ImageMimeType = \"image/jpeg\" | \"image/png\" | \"image/gif\" | \"image/webp\";\n\nfunction sdkText(value: string): ContentBlockParam {\n return { type: \"text\", text: value };\n}\n\nfunction formatUriAsLink(uri: string): string {\n try {\n if (uri.startsWith(\"file://\")) {\n const filePath = uri.slice(7);\n const name = filePath.split(\"/\").pop() || filePath;\n return `[@${name}](${uri})`;\n }\n if (uri.startsWith(\"zed://\")) {\n const parts = uri.split(\"/\");\n const name = parts[parts.length - 1] || uri;\n return `[@${name}](${uri})`;\n }\n return uri;\n } catch {\n return uri;\n }\n}\n\nfunction transformMcpCommand(text: string): string {\n const mcpMatch = text.match(/^\\/mcp:([^:\\s]+):(\\S+)(\\s+.*)?$/);\n if (mcpMatch) {\n const [, server, command, args] = mcpMatch;\n return `/${server}:${command} (MCP)${args || \"\"}`;\n }\n return text;\n}\n\nfunction processPromptChunk(\n chunk: PromptRequest[\"prompt\"][number],\n content: ContentBlockParam[],\n context: ContentBlockParam[],\n): void {\n switch (chunk.type) {\n case \"text\":\n content.push(sdkText(transformMcpCommand(chunk.text)));\n break;\n\n case \"resource_link\":\n content.push(sdkText(formatUriAsLink(chunk.uri)));\n break;\n\n case \"resource\":\n if (\"text\" in chunk.resource) {\n content.push(sdkText(formatUriAsLink(chunk.resource.uri)));\n context.push(\n sdkText(\n `\\n<context ref=\"${chunk.resource.uri}\">\\n${chunk.resource.text}\\n</context>`,\n ),\n );\n }\n break;\n\n case \"image\":\n if (chunk.data) {\n content.push({\n type: \"image\",\n source: {\n type: \"base64\",\n data: chunk.data,\n media_type: chunk.mimeType as ImageMimeType,\n },\n });\n } else if (chunk.uri?.startsWith(\"http\")) {\n content.push({\n type: \"image\",\n source: { type: \"url\", url: chunk.uri },\n });\n }\n break;\n\n default:\n break;\n }\n}\n\nexport function promptToClaude(prompt: PromptRequest): SDKUserMessage {\n const content: ContentBlockParam[] = [];\n const context: ContentBlockParam[] = [];\n\n for (const chunk of prompt.prompt) {\n processPromptChunk(chunk, content, context);\n }\n\n content.push(...context);\n\n return {\n type: \"user\",\n message: { role: \"user\", content },\n session_id: prompt.sessionId,\n parent_tool_use_id: null,\n };\n}\n","import type {\n AgentSideConnection,\n Role,\n SessionNotification,\n} from \"@agentclientprotocol/sdk\";\nimport { RequestError } from \"@agentclientprotocol/sdk\";\nimport type {\n SDKPartialAssistantMessage,\n SDKUserMessage,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport type { ContentBlockParam } from \"@anthropic-ai/sdk/resources\";\nimport type {\n BetaContentBlock,\n BetaRawContentBlockDelta,\n} from \"@anthropic-ai/sdk/resources/beta.mjs\";\nimport { image, text } from \"../../../utils/acp-content.js\";\nimport { unreachable } from \"../../../utils/common.js\";\nimport type { Logger } from \"../../../utils/logger.js\";\nimport { registerHookCallback } from \"../hooks.js\";\nimport type { Session, ToolUpdateMeta, ToolUseCache } from \"../types.js\";\nimport {\n type ClaudePlanEntry,\n planEntries,\n toolInfoFromToolUse,\n toolUpdateFromToolResult,\n} from \"./tool-use-to-acp.js\";\n\ntype AnthropicContentChunk =\n | ContentBlockParam\n | BetaContentBlock\n | BetaRawContentBlockDelta;\n\ntype AnthropicMessageContent = string | Array<{ type: string; text?: string }>;\n\ninterface AnthropicMessageWithContent {\n type: Role;\n message: {\n content: AnthropicMessageContent;\n role?: Role;\n model?: string;\n };\n}\n\ntype ChunkHandlerContext = {\n sessionId: string;\n toolUseCache: ToolUseCache;\n fileContentCache: { [key: string]: string };\n client: AgentSideConnection;\n logger: Logger;\n};\n\nexport interface MessageHandlerContext {\n session: Session;\n sessionId: string;\n client: AgentSideConnection;\n toolUseCache: ToolUseCache;\n fileContentCache: { [key: string]: string };\n logger: Logger;\n}\n\nfunction messageUpdateType(role: Role) {\n return role === \"assistant\" ? \"agent_message_chunk\" : \"user_message_chunk\";\n}\n\nfunction toolMeta(toolName: string, toolResponse?: unknown): ToolUpdateMeta {\n return toolResponse\n ? { claudeCode: { toolName, toolResponse } }\n : { claudeCode: { toolName } };\n}\n\nfunction handleTextChunk(\n chunk: { text: string },\n role: Role,\n): SessionNotification[\"update\"] {\n return {\n sessionUpdate: messageUpdateType(role),\n content: text(chunk.text),\n };\n}\n\nfunction handleImageChunk(\n chunk: {\n source: { type: string; data?: string; media_type?: string; url?: string };\n },\n role: Role,\n): SessionNotification[\"update\"] {\n return {\n sessionUpdate: messageUpdateType(role),\n content: image(\n chunk.source.type === \"base64\" ? (chunk.source.data ?? \"\") : \"\",\n chunk.source.type === \"base64\" ? (chunk.source.media_type ?? \"\") : \"\",\n chunk.source.type === \"url\" ? chunk.source.url : undefined,\n ),\n };\n}\n\nfunction handleThinkingChunk(chunk: {\n thinking: string;\n}): SessionNotification[\"update\"] {\n return {\n sessionUpdate: \"agent_thought_chunk\",\n content: text(chunk.thinking),\n };\n}\n\nfunction handleToolUseChunk(\n chunk: ToolUseCache[string],\n ctx: ChunkHandlerContext,\n): SessionNotification[\"update\"] | null {\n ctx.toolUseCache[chunk.id] = chunk;\n\n if (chunk.name === \"TodoWrite\") {\n const input = chunk.input as { todos?: unknown[] };\n if (Array.isArray(input.todos)) {\n return {\n sessionUpdate: \"plan\",\n entries: planEntries(chunk.input as { todos: ClaudePlanEntry[] }),\n };\n }\n return null;\n }\n\n registerHookCallback(chunk.id, {\n onPostToolUseHook: async (toolUseId, _toolInput, toolResponse) => {\n const toolUse = ctx.toolUseCache[toolUseId];\n if (toolUse) {\n await ctx.client.sessionUpdate({\n sessionId: ctx.sessionId,\n update: {\n _meta: toolMeta(toolUse.name, toolResponse),\n toolCallId: toolUseId,\n sessionUpdate: \"tool_call_update\",\n },\n });\n } else {\n ctx.logger.error(\n `Got a tool response for tool use that wasn't tracked: ${toolUseId}`,\n );\n }\n },\n });\n\n let rawInput: Record<string, unknown> | undefined;\n try {\n rawInput = JSON.parse(JSON.stringify(chunk.input));\n } catch {\n // ignore\n }\n\n return {\n _meta: toolMeta(chunk.name),\n toolCallId: chunk.id,\n sessionUpdate: \"tool_call\",\n rawInput,\n status: \"pending\",\n ...toolInfoFromToolUse(chunk, ctx.fileContentCache, ctx.logger),\n };\n}\n\nfunction handleToolResultChunk(\n chunk: AnthropicContentChunk & { tool_use_id: string; is_error?: boolean },\n ctx: ChunkHandlerContext,\n): SessionNotification[\"update\"] | null {\n const toolUse = ctx.toolUseCache[chunk.tool_use_id];\n if (!toolUse) {\n ctx.logger.error(\n `Got a tool result for tool use that wasn't tracked: ${chunk.tool_use_id}`,\n );\n return null;\n }\n\n if (toolUse.name === \"TodoWrite\") {\n return null;\n }\n\n return {\n _meta: toolMeta(toolUse.name),\n toolCallId: chunk.tool_use_id,\n sessionUpdate: \"tool_call_update\",\n status: chunk.is_error ? \"failed\" : \"completed\",\n ...toolUpdateFromToolResult(\n chunk as Parameters<typeof toolUpdateFromToolResult>[0],\n toolUse,\n ),\n };\n}\n\nfunction processContentChunk(\n chunk: AnthropicContentChunk,\n role: Role,\n ctx: ChunkHandlerContext,\n): SessionNotification[\"update\"] | null {\n switch (chunk.type) {\n case \"text\":\n case \"text_delta\":\n return handleTextChunk(chunk, role);\n\n case \"image\":\n return handleImageChunk(chunk, role);\n\n case \"thinking\":\n case \"thinking_delta\":\n return handleThinkingChunk(chunk);\n\n case \"tool_use\":\n case \"server_tool_use\":\n case \"mcp_tool_use\":\n return handleToolUseChunk(chunk as ToolUseCache[string], ctx);\n\n case \"tool_result\":\n case \"tool_search_tool_result\":\n case \"web_fetch_tool_result\":\n case \"web_search_tool_result\":\n case \"code_execution_tool_result\":\n case \"bash_code_execution_tool_result\":\n case \"text_editor_code_execution_tool_result\":\n case \"mcp_tool_result\":\n return handleToolResultChunk(\n chunk as AnthropicContentChunk & {\n tool_use_id: string;\n is_error?: boolean;\n },\n ctx,\n );\n\n case \"document\":\n case \"search_result\":\n case \"redacted_thinking\":\n case \"input_json_delta\":\n case \"citations_delta\":\n case \"signature_delta\":\n case \"container_upload\":\n return null;\n\n default:\n unreachable(chunk, ctx.logger);\n return null;\n }\n}\n\nfunction toAcpNotifications(\n content:\n | string\n | ContentBlockParam[]\n | BetaContentBlock[]\n | BetaRawContentBlockDelta[],\n role: Role,\n sessionId: string,\n toolUseCache: ToolUseCache,\n fileContentCache: { [key: string]: string },\n client: AgentSideConnection,\n logger: Logger,\n): SessionNotification[] {\n if (typeof content === \"string\") {\n return [\n {\n sessionId,\n update: {\n sessionUpdate: messageUpdateType(role),\n content: text(content),\n },\n },\n ];\n }\n\n const ctx: ChunkHandlerContext = {\n sessionId,\n toolUseCache,\n fileContentCache,\n client,\n logger,\n };\n const output: SessionNotification[] = [];\n\n for (const chunk of content) {\n const update = processContentChunk(chunk, role, ctx);\n if (update) {\n output.push({ sessionId, update });\n }\n }\n\n return output;\n}\n\nfunction streamEventToAcpNotifications(\n message: SDKPartialAssistantMessage,\n sessionId: string,\n toolUseCache: ToolUseCache,\n fileContentCache: { [key: string]: string },\n client: AgentSideConnection,\n logger: Logger,\n): SessionNotification[] {\n const event = message.event;\n switch (event.type) {\n case \"content_block_start\":\n return toAcpNotifications(\n [event.content_block],\n \"assistant\",\n sessionId,\n toolUseCache,\n fileContentCache,\n client,\n logger,\n );\n case \"content_block_delta\":\n return toAcpNotifications(\n [event.delta],\n \"assistant\",\n sessionId,\n toolUseCache,\n fileContentCache,\n client,\n logger,\n );\n case \"message_start\":\n case \"message_delta\":\n case \"message_stop\":\n case \"content_block_stop\":\n return [];\n\n default:\n unreachable(event, logger);\n return [];\n }\n}\n\nexport async function handleSystemMessage(\n message: any,\n context: MessageHandlerContext,\n): Promise<void> {\n const { session, sessionId, client, logger } = context;\n\n switch (message.subtype) {\n case \"init\":\n if (message.session_id && session && !session.sessionId) {\n session.sessionId = message.session_id;\n if (session.taskRunId) {\n await client.extNotification(\"_posthog/sdk_session\", {\n taskRunId: session.taskRunId,\n sessionId: message.session_id,\n adapter: \"claude\",\n });\n }\n }\n break;\n case \"compact_boundary\":\n await client.extNotification(\"_posthog/compact_boundary\", {\n sessionId,\n trigger: message.compact_metadata.trigger,\n preTokens: message.compact_metadata.pre_tokens,\n });\n break;\n case \"hook_response\":\n logger.info(\"Hook response received\", {\n hookName: message.hook_name,\n hookEvent: message.hook_event,\n });\n break;\n case \"status\":\n if (message.status === \"compacting\") {\n logger.info(\"Session compacting started\", { sessionId });\n await client.extNotification(\"_posthog/status\", {\n sessionId,\n status: \"compacting\",\n });\n }\n break;\n case \"task_notification\": {\n logger.info(\"Task notification received\", {\n sessionId,\n taskId: message.task_id,\n status: message.status,\n summary: message.summary,\n });\n await client.extNotification(\"_posthog/task_notification\", {\n sessionId,\n taskId: message.task_id,\n status: message.status,\n summary: message.summary,\n outputFile: message.output_file,\n });\n break;\n }\n default:\n break;\n }\n}\n\nexport function handleResultMessage(\n message: any,\n context: MessageHandlerContext,\n): { shouldStop: boolean; stopReason?: string; error?: Error } {\n const { session } = context;\n\n if (session.cancelled) {\n return {\n shouldStop: true,\n stopReason: \"cancelled\",\n };\n }\n\n switch (message.subtype) {\n case \"success\": {\n if (message.result.includes(\"Please run /login\")) {\n return {\n shouldStop: true,\n error: RequestError.authRequired(),\n };\n }\n if (message.is_error) {\n return {\n shouldStop: true,\n error: RequestError.internalError(undefined, message.result),\n };\n }\n return { shouldStop: true, stopReason: \"end_turn\" };\n }\n case \"error_during_execution\":\n if (message.is_error) {\n return {\n shouldStop: true,\n error: RequestError.internalError(\n undefined,\n message.errors.join(\", \") || message.subtype,\n ),\n };\n }\n return { shouldStop: true, stopReason: \"end_turn\" };\n case \"error_max_budget_usd\":\n case \"error_max_turns\":\n case \"error_max_structured_output_retries\":\n if (message.is_error) {\n return {\n shouldStop: true,\n error: RequestError.internalError(\n undefined,\n message.errors.join(\", \") || message.subtype,\n ),\n };\n }\n return { shouldStop: true, stopReason: \"max_turn_requests\" };\n default:\n return { shouldStop: false };\n }\n}\n\nexport async function handleStreamEvent(\n message: SDKPartialAssistantMessage,\n context: MessageHandlerContext,\n): Promise<void> {\n const { sessionId, client, toolUseCache, fileContentCache, logger } = context;\n\n for (const notification of streamEventToAcpNotifications(\n message,\n sessionId,\n toolUseCache,\n fileContentCache,\n client,\n logger,\n )) {\n await client.sessionUpdate(notification);\n context.session.notificationHistory.push(notification);\n }\n}\n\nfunction hasLocalCommandStdout(content: AnthropicMessageContent): boolean {\n return (\n typeof content === \"string\" && content.includes(\"<local-command-stdout>\")\n );\n}\n\nfunction hasLocalCommandStderr(content: AnthropicMessageContent): boolean {\n return (\n typeof content === \"string\" && content.includes(\"<local-command-stderr>\")\n );\n}\n\nfunction isSimpleUserMessage(message: AnthropicMessageWithContent): boolean {\n return (\n message.type === \"user\" &&\n (typeof message.message.content === \"string\" ||\n (Array.isArray(message.message.content) &&\n message.message.content.length === 1 &&\n message.message.content[0].type === \"text\"))\n );\n}\n\nfunction isLoginRequiredMessage(message: AnthropicMessageWithContent): boolean {\n return (\n message.type === \"assistant\" &&\n message.message.model === \"<synthetic>\" &&\n Array.isArray(message.message.content) &&\n message.message.content.length === 1 &&\n message.message.content[0].type === \"text\" &&\n message.message.content[0].text?.includes(\"Please run /login\") === true\n );\n}\n\nfunction shouldSkipUserAssistantMessage(\n message: AnthropicMessageWithContent,\n): boolean {\n return (\n hasLocalCommandStdout(message.message.content) ||\n hasLocalCommandStderr(message.message.content) ||\n isSimpleUserMessage(message) ||\n isLoginRequiredMessage(message)\n );\n}\n\nfunction logSpecialMessages(\n message: AnthropicMessageWithContent,\n logger: Logger,\n): void {\n const content = message.message.content;\n if (hasLocalCommandStdout(content) && typeof content === \"string\") {\n logger.info(content);\n }\n if (hasLocalCommandStderr(content) && typeof content === \"string\") {\n logger.error(content);\n }\n}\n\nfunction filterMessageContent(\n content: AnthropicMessageContent,\n): AnthropicMessageContent {\n if (!Array.isArray(content)) {\n return content;\n }\n return content.filter(\n (block) => block.type !== \"text\" && block.type !== \"thinking\",\n );\n}\n\nexport async function handleUserAssistantMessage(\n message: SDKUserMessage | { type: \"assistant\"; message: any },\n context: MessageHandlerContext,\n): Promise<{ shouldStop?: boolean; error?: Error }> {\n const { session, sessionId, client, toolUseCache, fileContentCache, logger } =\n context;\n\n if (session.cancelled) {\n return {};\n }\n\n if (shouldSkipUserAssistantMessage(message)) {\n logSpecialMessages(message, logger);\n\n if (isLoginRequiredMessage(message)) {\n return { shouldStop: true, error: RequestError.authRequired() };\n }\n return {};\n }\n\n const content = message.message.content;\n const contentToProcess = filterMessageContent(content);\n\n for (const notification of toAcpNotifications(\n contentToProcess as typeof content,\n message.message.role,\n sessionId,\n toolUseCache,\n fileContentCache,\n client,\n logger,\n )) {\n await client.sessionUpdate(notification);\n session.notificationHistory.push(notification);\n }\n\n return {};\n}\n","import type { ContentBlock, ToolCallContent } from \"@agentclientprotocol/sdk\";\n\nexport function text(value: string): ContentBlock {\n return { type: \"text\", text: value };\n}\n\nexport function image(\n data: string,\n mimeType: string,\n uri?: string,\n): ContentBlock {\n return { type: \"image\", data, mimeType, uri };\n}\n\nexport function resourceLink(\n uri: string,\n name: string,\n options?: {\n mimeType?: string;\n title?: string;\n description?: string;\n size?: bigint;\n },\n): ContentBlock {\n return {\n type: \"resource_link\",\n uri,\n name,\n ...options,\n };\n}\n\nclass ToolContentBuilder {\n private items: ToolCallContent[] = [];\n\n text(value: string): this {\n this.items.push({ type: \"content\", content: text(value) });\n return this;\n }\n\n image(data: string, mimeType: string, uri?: string): this {\n this.items.push({ type: \"content\", content: image(data, mimeType, uri) });\n return this;\n }\n\n diff(path: string, oldText: string | null, newText: string): this {\n this.items.push({ type: \"diff\", path, oldText, newText });\n return this;\n }\n\n build(): ToolCallContent[] {\n return this.items;\n }\n}\n\nexport function toolContent(): ToolContentBuilder {\n return new ToolContentBuilder();\n}\n","import type { HookCallback, HookInput } from \"@anthropic-ai/claude-agent-sdk\";\nimport type { TwigExecutionMode } from \"./tools.js\";\n\nconst toolUseCallbacks: {\n [toolUseId: string]: {\n onPostToolUseHook?: (\n toolUseID: string,\n toolInput: unknown,\n toolResponse: unknown,\n ) => Promise<void>;\n };\n} = {};\n\nexport const registerHookCallback = (\n toolUseID: string,\n {\n onPostToolUseHook,\n }: {\n onPostToolUseHook?: (\n toolUseID: string,\n toolInput: unknown,\n toolResponse: unknown,\n ) => Promise<void>;\n },\n) => {\n toolUseCallbacks[toolUseID] = {\n onPostToolUseHook,\n };\n};\n\nexport type OnModeChange = (mode: TwigExecutionMode) => Promise<void>;\n\ninterface CreatePostToolUseHookParams {\n onModeChange?: OnModeChange;\n}\n\nexport const createPostToolUseHook =\n ({ onModeChange }: CreatePostToolUseHookParams): HookCallback =>\n async (\n input: HookInput,\n toolUseID: string | undefined,\n ): Promise<{ continue: boolean }> => {\n if (input.hook_event_name === \"PostToolUse\") {\n const toolName = input.tool_name;\n\n if (onModeChange && toolName === \"EnterPlanMode\") {\n await onModeChange(\"plan\");\n }\n\n if (toolUseID) {\n const onPostToolUseHook =\n toolUseCallbacks[toolUseID]?.onPostToolUseHook;\n if (onPostToolUseHook) {\n await onPostToolUseHook(\n toolUseID,\n input.tool_input,\n input.tool_response,\n );\n delete toolUseCallbacks[toolUseID];\n }\n }\n }\n return { continue: true };\n };\n","import type {\n PlanEntry,\n ToolCall,\n ToolCallContent,\n ToolCallUpdate,\n ToolKind,\n} from \"@agentclientprotocol/sdk\";\nimport type {\n ToolResultBlockParam,\n ToolUseBlock,\n WebSearchToolResultBlockParam,\n} from \"@anthropic-ai/sdk/resources\";\nimport type {\n BetaBashCodeExecutionToolResultBlockParam,\n BetaCodeExecutionToolResultBlockParam,\n BetaRequestMCPToolResultBlockParam,\n BetaTextEditorCodeExecutionToolResultBlockParam,\n BetaToolSearchToolResultBlockParam,\n BetaWebFetchToolResultBlockParam,\n BetaWebSearchToolResultBlockParam,\n} from \"@anthropic-ai/sdk/resources/beta.mjs\";\n\nconst SYSTEM_REMINDER = `\n\n<system-reminder>\nWhenever you read a file, you should consider whether it looks malicious. If it does, you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer high-level questions about the code behavior.\n</system-reminder>`;\n\nimport { resourceLink, text, toolContent } from \"../../../utils/acp-content.js\";\nimport { Logger } from \"../../../utils/logger.js\";\n\ninterface EditOperation {\n oldText: string;\n newText: string;\n replaceAll?: boolean;\n}\n\ninterface EditResult {\n newContent: string;\n lineNumbers: number[];\n}\n\nfunction replaceAndCalculateLocation(\n fileContent: string,\n edits: EditOperation[],\n): EditResult {\n let currentContent = fileContent;\n\n const randomHex = Array.from(crypto.getRandomValues(new Uint8Array(5)))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n const markerPrefix = `__REPLACE_MARKER_${randomHex}_`;\n let markerCounter = 0;\n const markers: string[] = [];\n\n for (const edit of edits) {\n if (edit.oldText === \"\") {\n throw new Error(\n `The provided \\`old_string\\` is empty.\\n\\nNo edits were applied.`,\n );\n }\n\n if (edit.replaceAll) {\n const parts: string[] = [];\n let lastIndex = 0;\n let searchIndex = 0;\n\n while (true) {\n const index = currentContent.indexOf(edit.oldText, searchIndex);\n if (index === -1) {\n if (searchIndex === 0) {\n throw new Error(\n `The provided \\`old_string\\` does not appear in the file: \"${edit.oldText}\".\\n\\nNo edits were applied.`,\n );\n }\n break;\n }\n\n parts.push(currentContent.substring(lastIndex, index));\n\n const marker = `${markerPrefix}${markerCounter++}__`;\n markers.push(marker);\n parts.push(marker + edit.newText);\n\n lastIndex = index + edit.oldText.length;\n searchIndex = lastIndex;\n }\n\n parts.push(currentContent.substring(lastIndex));\n currentContent = parts.join(\"\");\n } else {\n const index = currentContent.indexOf(edit.oldText);\n if (index === -1) {\n throw new Error(\n `The provided \\`old_string\\` does not appear in the file: \"${edit.oldText}\".\\n\\nNo edits were applied.`,\n );\n } else {\n const marker = `${markerPrefix}${markerCounter++}__`;\n markers.push(marker);\n currentContent =\n currentContent.substring(0, index) +\n marker +\n edit.newText +\n currentContent.substring(index + edit.oldText.length);\n }\n }\n }\n\n const lineNumbers: number[] = [];\n for (const marker of markers) {\n const index = currentContent.indexOf(marker);\n if (index !== -1) {\n const lineNumber = Math.max(\n 0,\n currentContent.substring(0, index).split(/\\r\\n|\\r|\\n/).length - 1,\n );\n lineNumbers.push(lineNumber);\n }\n }\n\n let finalContent = currentContent;\n for (const marker of markers) {\n finalContent = finalContent.replace(marker, \"\");\n }\n\n const uniqueLineNumbers = [...new Set(lineNumbers)].sort();\n\n return { newContent: finalContent, lineNumbers: uniqueLineNumbers };\n}\n\ntype ToolInfo = Pick<ToolCall, \"title\" | \"kind\" | \"content\" | \"locations\">;\n\nexport function toolInfoFromToolUse(\n toolUse: Pick<ToolUseBlock, \"name\" | \"input\">,\n cachedFileContent: { [key: string]: string },\n logger: Logger = new Logger({ debug: false, prefix: \"[ClaudeTools]\" }),\n): ToolInfo {\n const name = toolUse.name;\n const input = toolUse.input as Record<string, unknown> | undefined;\n\n switch (name) {\n case \"Task\":\n return {\n title: input?.description ? String(input.description) : \"Task\",\n kind: \"think\",\n content: input?.prompt\n ? toolContent().text(String(input.prompt)).build()\n : [],\n };\n\n case \"NotebookRead\":\n return {\n title: input?.notebook_path\n ? `Read Notebook ${String(input.notebook_path)}`\n : \"Read Notebook\",\n kind: \"read\",\n content: [],\n locations: input?.notebook_path\n ? [{ path: String(input.notebook_path) }]\n : [],\n };\n\n case \"NotebookEdit\":\n return {\n title: input?.notebook_path\n ? `Edit Notebook ${String(input.notebook_path)}`\n : \"Edit Notebook\",\n kind: \"edit\",\n content: input?.new_source\n ? toolContent().text(String(input.new_source)).build()\n : [],\n locations: input?.notebook_path\n ? [{ path: String(input.notebook_path) }]\n : [],\n };\n\n case \"Bash\":\n return {\n title: input?.description\n ? String(input.description)\n : \"Execute command\",\n kind: \"execute\",\n content: input?.command\n ? toolContent().text(String(input.command)).build()\n : [],\n };\n\n case \"BashOutput\":\n return {\n title: \"Tail Logs\",\n kind: \"execute\",\n content: [],\n };\n\n case \"KillShell\":\n return {\n title: \"Kill Process\",\n kind: \"execute\",\n content: [],\n };\n\n case \"Read\": {\n let limit = \"\";\n const inputLimit = input?.limit as number | undefined;\n const inputOffset = (input?.offset as number | undefined) ?? 0;\n if (inputLimit) {\n limit = ` (${inputOffset + 1} - ${inputOffset + inputLimit})`;\n } else if (inputOffset) {\n limit = ` (from line ${inputOffset + 1})`;\n }\n return {\n title: `Read ${input?.file_path ? String(input.file_path) : \"File\"}${limit}`,\n kind: \"read\",\n locations: input?.file_path\n ? [\n {\n path: String(input.file_path),\n line: inputOffset,\n },\n ]\n : [],\n content: [],\n };\n }\n\n case \"LS\":\n return {\n title: `List the ${input?.path ? `\\`${String(input.path)}\\`` : \"current\"} directory's contents`,\n kind: \"search\",\n content: [],\n locations: [],\n };\n\n case \"Edit\": {\n const path = input?.file_path ? String(input.file_path) : undefined;\n let oldText = input?.old_string ? String(input.old_string) : null;\n let newText = input?.new_string ? String(input.new_string) : \"\";\n let affectedLines: number[] = [];\n\n if (path && oldText) {\n try {\n const oldContent = cachedFileContent[path] || \"\";\n const newContent = replaceAndCalculateLocation(oldContent, [\n {\n oldText,\n newText,\n replaceAll: false,\n },\n ]);\n oldText = oldContent;\n newText = newContent.newContent;\n affectedLines = newContent.lineNumbers;\n } catch (e) {\n logger.error(\"Failed to edit file\", e);\n }\n }\n return {\n title: path ? `Edit \\`${path}\\`` : \"Edit\",\n kind: \"edit\",\n content:\n input && path\n ? [\n {\n type: \"diff\",\n path,\n oldText,\n newText,\n },\n ]\n : [],\n locations: path\n ? affectedLines.length > 0\n ? affectedLines.map((line) => ({ line, path }))\n : [{ path }]\n : [],\n };\n }\n\n case \"Write\": {\n let contentResult: ToolCallContent[] = [];\n const filePath = input?.file_path ? String(input.file_path) : undefined;\n const contentStr = input?.content ? String(input.content) : undefined;\n if (filePath) {\n contentResult = toolContent()\n .diff(filePath, null, contentStr ?? \"\")\n .build();\n } else if (contentStr) {\n contentResult = toolContent().text(contentStr).build();\n }\n return {\n title: filePath ? `Write ${filePath}` : \"Write\",\n kind: \"edit\",\n content: contentResult,\n locations: filePath ? [{ path: filePath }] : [],\n };\n }\n\n case \"Glob\": {\n let label = \"Find\";\n const pathStr = input?.path ? String(input.path) : undefined;\n if (pathStr) {\n label += ` \"${pathStr}\"`;\n }\n if (input?.pattern) {\n label += ` \"${String(input.pattern)}\"`;\n }\n return {\n title: label,\n kind: \"search\",\n content: [],\n locations: pathStr ? [{ path: pathStr }] : [],\n };\n }\n\n case \"Grep\": {\n let label = \"grep\";\n\n if (input?.[\"-i\"]) {\n label += \" -i\";\n }\n if (input?.[\"-n\"]) {\n label += \" -n\";\n }\n\n if (input?.[\"-A\"] !== undefined) {\n label += ` -A ${input[\"-A\"]}`;\n }\n if (input?.[\"-B\"] !== undefined) {\n label += ` -B ${input[\"-B\"]}`;\n }\n if (input?.[\"-C\"] !== undefined) {\n label += ` -C ${input[\"-C\"]}`;\n }\n\n if (input?.output_mode) {\n switch (input.output_mode) {\n case \"FilesWithMatches\":\n label += \" -l\";\n break;\n case \"Count\":\n label += \" -c\";\n break;\n default:\n break;\n }\n }\n\n if (input?.head_limit !== undefined) {\n label += ` | head -${input.head_limit}`;\n }\n\n if (input?.glob) {\n label += ` --include=\"${String(input.glob)}\"`;\n }\n\n if (input?.type) {\n label += ` --type=${String(input.type)}`;\n }\n\n if (input?.multiline) {\n label += \" -P\";\n }\n\n label += ` \"${input?.pattern ? String(input.pattern) : \"\"}\"`;\n\n if (input?.path) {\n label += ` ${String(input.path)}`;\n }\n\n return {\n title: label,\n kind: \"search\",\n content: [],\n };\n }\n\n case \"WebFetch\":\n return {\n title: \"Fetch\",\n kind: \"fetch\",\n content: input?.url\n ? [\n {\n type: \"content\",\n content: resourceLink(String(input.url), String(input.url), {\n description: input?.prompt ? String(input.prompt) : undefined,\n }),\n },\n ]\n : [],\n };\n\n case \"WebSearch\": {\n let label = `\"${input?.query ? String(input.query) : \"\"}\"`;\n const allowedDomains = input?.allowed_domains as string[] | undefined;\n const blockedDomains = input?.blocked_domains as string[] | undefined;\n\n if (allowedDomains && allowedDomains.length > 0) {\n label += ` (allowed: ${allowedDomains.join(\", \")})`;\n }\n\n if (blockedDomains && blockedDomains.length > 0) {\n label += ` (blocked: ${blockedDomains.join(\", \")})`;\n }\n\n return {\n title: label,\n kind: \"fetch\",\n content: [],\n };\n }\n\n case \"TodoWrite\":\n return {\n title: Array.isArray(input?.todos)\n ? `Update TODOs: ${input.todos.map((todo: { content?: string }) => todo.content).join(\", \")}`\n : \"Update TODOs\",\n kind: \"think\",\n content: [],\n };\n\n case \"ExitPlanMode\":\n return {\n title: \"Ready to code?\",\n kind: \"switch_mode\",\n content: input?.plan\n ? toolContent().text(String(input.plan)).build()\n : [],\n };\n\n case \"AskUserQuestion\": {\n const questions = input?.questions as\n | Array<{ question?: string }>\n | undefined;\n return {\n title: questions?.[0]?.question || \"Question\",\n kind: \"other\" as ToolKind,\n content: questions\n ? toolContent()\n .text(JSON.stringify(questions, null, 2))\n .build()\n : [],\n };\n }\n\n case \"Other\": {\n let output: string;\n try {\n output = JSON.stringify(input, null, 2);\n } catch {\n output = typeof input === \"string\" ? input : \"{}\";\n }\n return {\n title: name || \"Unknown Tool\",\n kind: \"other\",\n content: toolContent().text(`\\`\\`\\`json\\n${output}\\`\\`\\``).build(),\n };\n }\n\n default:\n return {\n title: name || \"Unknown Tool\",\n kind: \"other\",\n content: [],\n };\n }\n}\n\nexport function toolUpdateFromToolResult(\n toolResult:\n | ToolResultBlockParam\n | BetaWebSearchToolResultBlockParam\n | BetaWebFetchToolResultBlockParam\n | WebSearchToolResultBlockParam\n | BetaCodeExecutionToolResultBlockParam\n | BetaBashCodeExecutionToolResultBlockParam\n | BetaTextEditorCodeExecutionToolResultBlockParam\n | BetaRequestMCPToolResultBlockParam\n | BetaToolSearchToolResultBlockParam,\n toolUse: Pick<ToolUseBlock, \"name\" | \"input\"> | undefined,\n): Pick<ToolCallUpdate, \"title\" | \"content\" | \"locations\"> {\n switch (toolUse?.name) {\n case \"Read\":\n if (Array.isArray(toolResult.content) && toolResult.content.length > 0) {\n return {\n content: toolResult.content.map((item) => {\n const itemObj = item as { type?: string; text?: string };\n if (itemObj.type === \"text\") {\n return {\n type: \"content\" as const,\n content: text(\n markdownEscape(\n (itemObj.text ?? \"\").replace(SYSTEM_REMINDER, \"\"),\n ),\n ),\n };\n }\n return {\n type: \"content\" as const,\n content: item as { type: \"text\"; text: string },\n };\n }),\n };\n } else if (\n typeof toolResult.content === \"string\" &&\n toolResult.content.length > 0\n ) {\n return {\n content: toolContent()\n .text(\n markdownEscape(toolResult.content.replace(SYSTEM_REMINDER, \"\")),\n )\n .build(),\n };\n }\n return {};\n\n case \"Bash\": {\n return toAcpContentUpdate(\n toolResult.content,\n \"is_error\" in toolResult ? toolResult.is_error : false,\n );\n }\n case \"Edit\":\n case \"Write\": {\n if (\n \"is_error\" in toolResult &&\n toolResult.is_error &&\n toolResult.content &&\n toolResult.content.length > 0\n ) {\n return toAcpContentUpdate(toolResult.content, true);\n }\n return {};\n }\n\n case \"ExitPlanMode\": {\n return { title: \"Exited Plan Mode\" };\n }\n case \"AskUserQuestion\": {\n const content = toolResult.content;\n if (Array.isArray(content) && content.length > 0) {\n const firstItem = content[0];\n if (\n typeof firstItem === \"object\" &&\n firstItem !== null &&\n \"text\" in firstItem\n ) {\n return {\n title: \"Answer received\",\n content: toolContent().text(String(firstItem.text)).build(),\n };\n }\n }\n return { title: \"Question answered\" };\n }\n default: {\n return toAcpContentUpdate(\n toolResult.content,\n \"is_error\" in toolResult ? toolResult.is_error : false,\n );\n }\n }\n}\n\nfunction toAcpContentUpdate(\n content: unknown,\n isError: boolean = false,\n): Pick<ToolCallUpdate, \"content\"> {\n if (Array.isArray(content) && content.length > 0) {\n return {\n content: content.map((item) => {\n const itemObj = item as { type?: string; text?: string };\n if (isError && itemObj.type === \"text\") {\n return {\n type: \"content\" as const,\n content: text(`\\`\\`\\`\\n${itemObj.text ?? \"\"}\\n\\`\\`\\``),\n };\n }\n return {\n type: \"content\" as const,\n content: item as { type: \"text\"; text: string },\n };\n }),\n };\n } else if (typeof content === \"string\" && content.length > 0) {\n return {\n content: toolContent()\n .text(isError ? `\\`\\`\\`\\n${content}\\n\\`\\`\\`` : content)\n .build(),\n };\n }\n return {};\n}\n\nexport type ClaudePlanEntry = {\n content: string;\n status: \"pending\" | \"in_progress\" | \"completed\";\n activeForm: string;\n};\n\nexport function planEntries(input: { todos: ClaudePlanEntry[] }): PlanEntry[] {\n return input.todos.map((input) => ({\n content: input.content,\n status: input.status,\n priority: \"medium\",\n }));\n}\n\nfunction markdownEscape(text: string): string {\n let escapedText = \"```\";\n for (const [m] of text.matchAll(/^```+/gm)) {\n while (m.length >= escapedText.length) {\n escapedText += \"`\";\n }\n }\n return `${escapedText}\\n${text}${text.endsWith(\"\\n\") ? \"\" : \"\\n\"}${escapedText}`;\n}\n","import type { McpServerConfig } from \"@anthropic-ai/claude-agent-sdk\";\nimport { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { StreamableHTTPClientTransport } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport type { Tool } from \"@modelcontextprotocol/sdk/types.js\";\nimport { Logger } from \"../../../utils/logger.js\";\n\nexport interface McpToolMetadata {\n readOnly: boolean;\n}\n\nconst mcpToolMetadataCache: Map<string, McpToolMetadata> = new Map();\n\nfunction buildToolKey(serverName: string, toolName: string): string {\n return `mcp__${serverName}__${toolName}`;\n}\n\nfunction isHttpMcpServer(\n config: McpServerConfig,\n): config is McpServerConfig & { type: \"http\"; url: string } {\n return config.type === \"http\" && typeof (config as any).url === \"string\";\n}\n\nasync function fetchToolsFromHttpServer(\n _serverName: string,\n config: McpServerConfig & { type: \"http\"; url: string },\n): Promise<Tool[]> {\n const transport = new StreamableHTTPClientTransport(new URL(config.url), {\n requestInit: {\n headers: (config as any).headers || {},\n },\n });\n\n const client = new Client({\n name: \"twig-metadata-fetcher\",\n version: \"1.0.0\",\n });\n\n try {\n await client.connect(transport);\n const result = await client.listTools();\n return result.tools;\n } finally {\n await client.close().catch(() => {});\n }\n}\n\nfunction extractToolMetadata(tool: Tool): McpToolMetadata {\n return {\n readOnly: tool.annotations?.readOnlyHint === true,\n };\n}\n\nexport async function fetchMcpToolMetadata(\n mcpServers: Record<string, McpServerConfig>,\n logger: Logger = new Logger({ debug: false, prefix: \"[McpToolMetadata]\" }),\n): Promise<void> {\n const fetchPromises: Promise<void>[] = [];\n\n for (const [serverName, config] of Object.entries(mcpServers)) {\n if (!isHttpMcpServer(config)) {\n continue;\n }\n\n const fetchPromise = fetchToolsFromHttpServer(serverName, config)\n .then((tools) => {\n const toolCount = tools.length;\n const readOnlyCount = tools.filter(\n (t) => t.annotations?.readOnlyHint === true,\n ).length;\n\n for (const tool of tools) {\n const toolKey = buildToolKey(serverName, tool.name);\n mcpToolMetadataCache.set(toolKey, extractToolMetadata(tool));\n }\n\n logger.info(\"Fetched MCP tool metadata\", {\n serverName,\n toolCount,\n readOnlyCount,\n });\n })\n .catch((error) => {\n logger.error(\"Failed to fetch MCP tool metadata\", {\n serverName,\n error: error instanceof Error ? error.message : String(error),\n });\n });\n\n fetchPromises.push(fetchPromise);\n }\n\n await Promise.all(fetchPromises);\n}\n\nexport function isMcpToolReadOnly(toolName: string): boolean {\n const metadata = mcpToolMetadataCache.get(toolName);\n return metadata?.readOnly === true;\n}\n\nexport function clearMcpToolMetadataCache(): void {\n mcpToolMetadataCache.clear();\n}\n","import * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { SessionNotification } from \"@agentclientprotocol/sdk\";\n\nfunction getClaudeConfigDir(): string {\n return process.env.CLAUDE_CONFIG_DIR || path.join(os.homedir(), \".claude\");\n}\n\nexport function getClaudePlansDir(): string {\n return path.join(getClaudeConfigDir(), \"plans\");\n}\n\nexport function isClaudePlanFilePath(filePath: string | undefined): boolean {\n if (!filePath) return false;\n const resolved = path.resolve(filePath);\n const plansDir = path.resolve(getClaudePlansDir());\n return resolved === plansDir || resolved.startsWith(plansDir + path.sep);\n}\n\nexport function isPlanReady(plan: string | undefined): boolean {\n if (!plan) return false;\n const trimmed = plan.trim();\n if (trimmed.length < 40) return false;\n return /(^|\\n)#{1,6}\\s+\\S/.test(trimmed);\n}\n\nexport function getLatestAssistantText(\n notifications: SessionNotification[],\n): string | null {\n const chunks: string[] = [];\n let started = false;\n\n for (let i = notifications.length - 1; i >= 0; i -= 1) {\n const update = notifications[i]?.update;\n if (!update) continue;\n\n if (update.sessionUpdate === \"agent_message_chunk\") {\n started = true;\n const content = update.content as {\n type?: string;\n text?: string;\n } | null;\n if (content?.type === \"text\" && content.text) {\n chunks.push(content.text);\n }\n continue;\n }\n\n if (started) {\n break;\n }\n }\n\n if (chunks.length === 0) return null;\n return chunks.reverse().join(\"\");\n}\n","import type { ToolCallContent, ToolKind } from \"@agentclientprotocol/sdk\";\nimport { z } from \"zod\";\nimport type { PermissionOption } from \"../permissions/permission-options.js\";\n\nexport const OPTION_PREFIX = \"option_\";\n\nexport const QuestionOptionSchema = z.object({\n label: z.string(),\n description: z.string().optional(),\n});\n\nexport const QuestionItemSchema = z.object({\n question: z.string(),\n header: z.string().optional(),\n options: z.array(QuestionOptionSchema),\n multiSelect: z.boolean().optional(),\n completed: z.boolean().optional(),\n});\n\nexport const QuestionMetaSchema = z.object({\n questions: z.array(QuestionItemSchema),\n});\n\nexport type QuestionOption = z.infer<typeof QuestionOptionSchema>;\nexport type QuestionItem = z.infer<typeof QuestionItemSchema>;\nexport type QuestionMeta = z.infer<typeof QuestionMetaSchema>;\n\nexport interface AskUserQuestionInput {\n questions?: QuestionItem[];\n question?: string;\n header?: string;\n options?: QuestionOption[];\n multiSelect?: boolean;\n}\n\nexport function normalizeAskUserQuestionInput(\n input: AskUserQuestionInput,\n): QuestionItem[] | null {\n if (input.questions && input.questions.length > 0) {\n return input.questions;\n }\n\n if (input.question) {\n return [\n {\n question: input.question,\n header: input.header,\n options: input.options || [],\n multiSelect: input.multiSelect,\n },\n ];\n }\n\n return null;\n}\n\ninterface QuestionToolCallData {\n toolCallId: string;\n title: string;\n kind: ToolKind;\n content: ToolCallContent[];\n _meta: {\n twigToolKind: \"question\";\n questions: QuestionItem[];\n };\n}\n\nexport function buildQuestionToolCallData(\n questions: QuestionItem[],\n): QuestionToolCallData {\n return {\n toolCallId: `question-${Date.now()}`,\n title: questions[0]?.question ?? \"Question\",\n kind: \"other\",\n content: [],\n _meta: {\n twigToolKind: \"question\",\n questions,\n },\n };\n}\n\nexport function buildQuestionOptions(\n question: QuestionItem,\n): PermissionOption[] {\n return question.options.map((opt, idx) => ({\n kind: \"allow_once\" as const,\n name: opt.label,\n optionId: `${OPTION_PREFIX}${idx}`,\n _meta: opt.description ? { description: opt.description } : undefined,\n }));\n}\n","import { IS_ROOT } from \"./utils/common.js\";\n\nexport interface ModeInfo {\n id: TwigExecutionMode;\n name: string;\n description: string;\n}\n\nconst MODES: ModeInfo[] = [\n {\n id: \"default\",\n name: \"Always Ask\",\n description: \"Prompts for permission on first use of each tool\",\n },\n {\n id: \"acceptEdits\",\n name: \"Accept Edits\",\n description: \"Automatically accepts file edit permissions for the session\",\n },\n {\n id: \"plan\",\n name: \"Plan Mode\",\n description: \"Claude can analyze but not modify files or execute commands\",\n },\n {\n id: \"bypassPermissions\",\n name: \"Bypass Permissions\",\n description: \"Skips all permission prompts\",\n },\n];\n\nexport const TWIG_EXECUTION_MODES = [\n \"default\",\n \"acceptEdits\",\n \"plan\",\n \"bypassPermissions\",\n] as const;\n\nexport type TwigExecutionMode = (typeof TWIG_EXECUTION_MODES)[number];\n\nexport function getAvailableModes(): ModeInfo[] {\n return IS_ROOT ? MODES.filter((m) => m.id !== \"bypassPermissions\") : MODES;\n}\n","export {\n getAvailableModes,\n type ModeInfo,\n TWIG_EXECUTION_MODES,\n type TwigExecutionMode,\n} from \"../../execution-mode.js\";\n\nimport type { TwigExecutionMode } from \"../../execution-mode.js\";\nimport { isMcpToolReadOnly } from \"./mcp/tool-metadata.js\";\n\nexport const READ_TOOLS: Set<string> = new Set([\"Read\", \"NotebookRead\"]);\n\nexport const WRITE_TOOLS: Set<string> = new Set([\n \"Edit\",\n \"Write\",\n \"NotebookEdit\",\n]);\n\nexport const BASH_TOOLS: Set<string> = new Set([\n \"Bash\",\n \"BashOutput\",\n \"KillShell\",\n]);\n\nexport const SEARCH_TOOLS: Set<string> = new Set([\"Glob\", \"Grep\", \"LS\"]);\n\nexport const WEB_TOOLS: Set<string> = new Set([\"WebSearch\", \"WebFetch\"]);\n\nexport const AGENT_TOOLS: Set<string> = new Set([\"Task\", \"TodoWrite\"]);\n\nconst BASE_ALLOWED_TOOLS = [\n ...READ_TOOLS,\n ...SEARCH_TOOLS,\n ...WEB_TOOLS,\n ...AGENT_TOOLS,\n];\n\nconst AUTO_ALLOWED_TOOLS: Record<string, Set<string>> = {\n default: new Set(BASE_ALLOWED_TOOLS),\n acceptEdits: new Set([...BASE_ALLOWED_TOOLS, ...WRITE_TOOLS]),\n plan: new Set(BASE_ALLOWED_TOOLS),\n};\n\nexport function isToolAllowedForMode(\n toolName: string,\n mode: TwigExecutionMode,\n): boolean {\n if (mode === \"bypassPermissions\") {\n return true;\n }\n if (AUTO_ALLOWED_TOOLS[mode]?.has(toolName) === true) {\n return true;\n }\n if (isMcpToolReadOnly(toolName)) {\n return true;\n }\n return false;\n}\n","import { BASH_TOOLS, READ_TOOLS, SEARCH_TOOLS, WRITE_TOOLS } from \"../tools.js\";\n\nexport interface PermissionOption {\n kind: \"allow_once\" | \"allow_always\" | \"reject_once\" | \"reject_always\";\n name: string;\n optionId: string;\n _meta?: { description?: string; customInput?: boolean };\n}\n\nfunction permissionOptions(allowAlwaysLabel: string): PermissionOption[] {\n return [\n { kind: \"allow_once\", name: \"Yes\", optionId: \"allow\" },\n { kind: \"allow_always\", name: allowAlwaysLabel, optionId: \"allow_always\" },\n {\n kind: \"reject_once\",\n name: \"No, and tell the agent what to do differently\",\n optionId: \"reject\",\n _meta: { customInput: true },\n },\n ];\n}\n\nexport function buildPermissionOptions(\n toolName: string,\n toolInput: Record<string, unknown>,\n cwd?: string,\n): PermissionOption[] {\n if (BASH_TOOLS.has(toolName)) {\n const command = toolInput?.command as string | undefined;\n const cmdName = command?.split(/\\s+/)[0] ?? \"this command\";\n const cwdLabel = cwd ? ` in ${cwd}` : \"\";\n return permissionOptions(\n `Yes, and don't ask again for \\`${cmdName}\\` commands${cwdLabel}`,\n );\n }\n\n if (toolName === \"BashOutput\") {\n return permissionOptions(\"Yes, allow all background process reads\");\n }\n\n if (toolName === \"KillShell\") {\n return permissionOptions(\"Yes, allow killing processes\");\n }\n\n if (WRITE_TOOLS.has(toolName)) {\n return permissionOptions(\"Yes, allow all edits during this session\");\n }\n\n if (READ_TOOLS.has(toolName)) {\n return permissionOptions(\"Yes, allow all reads during this session\");\n }\n\n if (SEARCH_TOOLS.has(toolName)) {\n return permissionOptions(\"Yes, allow all searches during this session\");\n }\n\n if (toolName === \"WebFetch\") {\n const url = toolInput?.url as string | undefined;\n let domain = \"\";\n try {\n domain = url ? new URL(url).hostname : \"\";\n } catch {}\n return permissionOptions(\n domain\n ? `Yes, allow all fetches from ${domain}`\n : \"Yes, allow all fetches\",\n );\n }\n\n if (toolName === \"WebSearch\") {\n return permissionOptions(\"Yes, allow all web searches\");\n }\n\n if (toolName === \"Task\") {\n return permissionOptions(\"Yes, allow all sub-tasks\");\n }\n\n if (toolName === \"TodoWrite\") {\n return permissionOptions(\"Yes, allow all todo updates\");\n }\n\n return permissionOptions(\"Yes, always allow\");\n}\n\nexport function buildExitPlanModePermissionOptions(): PermissionOption[] {\n return [\n {\n kind: \"allow_always\",\n name: \"Yes, and auto-accept edits\",\n optionId: \"acceptEdits\",\n },\n {\n kind: \"allow_once\",\n name: \"Yes, and manually approve edits\",\n optionId: \"default\",\n },\n {\n kind: \"reject_once\",\n name: \"No, keep planning\",\n optionId: \"plan\",\n },\n ];\n}\n","import type {\n AgentSideConnection,\n RequestPermissionResponse,\n} from \"@agentclientprotocol/sdk\";\nimport type { PermissionUpdate } from \"@anthropic-ai/claude-agent-sdk\";\nimport { text } from \"../../../utils/acp-content.js\";\nimport type { Logger } from \"../../../utils/logger.js\";\nimport { toolInfoFromToolUse } from \"../conversion/tool-use-to-acp.js\";\nimport {\n getClaudePlansDir,\n getLatestAssistantText,\n isClaudePlanFilePath,\n isPlanReady,\n} from \"../plan/utils.js\";\nimport {\n type AskUserQuestionInput,\n normalizeAskUserQuestionInput,\n OPTION_PREFIX,\n type QuestionItem,\n} from \"../questions/utils.js\";\nimport { isToolAllowedForMode, WRITE_TOOLS } from \"../tools.js\";\nimport type { Session } from \"../types.js\";\nimport {\n buildExitPlanModePermissionOptions,\n buildPermissionOptions,\n} from \"./permission-options.js\";\n\nexport type ToolPermissionResult =\n | {\n behavior: \"allow\";\n updatedInput: Record<string, unknown>;\n updatedPermissions?: PermissionUpdate[];\n }\n | {\n behavior: \"deny\";\n message: string;\n interrupt: boolean;\n };\n\ninterface ToolHandlerContext {\n session: Session;\n toolName: string;\n toolInput: Record<string, unknown>;\n toolUseID: string;\n suggestions?: PermissionUpdate[];\n client: AgentSideConnection;\n sessionId: string;\n fileContentCache: { [key: string]: string };\n logger: Logger;\n emitConfigOptionsUpdate: () => Promise<void>;\n}\n\nasync function emitToolDenial(\n context: ToolHandlerContext,\n message: string,\n): Promise<void> {\n context.logger.info(`[canUseTool] Tool denied: ${context.toolName}`, {\n message,\n });\n await context.client.sessionUpdate({\n sessionId: context.sessionId,\n update: {\n sessionUpdate: \"tool_call_update\",\n toolCallId: context.toolUseID,\n status: \"failed\",\n content: [{ type: \"content\", content: text(message) }],\n },\n });\n}\n\nfunction getPlanFromFile(\n session: Session,\n fileContentCache: { [key: string]: string },\n): string | undefined {\n return (\n session.lastPlanContent ||\n (session.lastPlanFilePath\n ? fileContentCache[session.lastPlanFilePath]\n : undefined)\n );\n}\n\nfunction ensurePlanInInput(\n toolInput: Record<string, unknown>,\n fallbackPlan: string | undefined,\n): Record<string, unknown> {\n const hasPlan = typeof (toolInput as { plan?: unknown })?.plan === \"string\";\n if (hasPlan || !fallbackPlan) {\n return toolInput;\n }\n return { ...toolInput, plan: fallbackPlan };\n}\n\nfunction extractPlanText(input: Record<string, unknown>): string | undefined {\n const plan = (input as { plan?: unknown })?.plan;\n return typeof plan === \"string\" ? plan : undefined;\n}\n\nasync function createPlanValidationError(\n message: string,\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n await emitToolDenial(context, message);\n return { behavior: \"deny\", message, interrupt: false };\n}\n\nasync function validatePlanContent(\n planText: string | undefined,\n context: ToolHandlerContext,\n): Promise<{ valid: true } | { valid: false; error: ToolPermissionResult }> {\n if (!planText) {\n const message = `Plan not ready. Provide the full markdown plan in ExitPlanMode or write it to ${getClaudePlansDir()} before requesting approval.`;\n return {\n valid: false,\n error: await createPlanValidationError(message, context),\n };\n }\n\n if (!isPlanReady(planText)) {\n const message =\n \"Plan not ready. Provide the full markdown plan in ExitPlanMode before requesting approval.\";\n return {\n valid: false,\n error: await createPlanValidationError(message, context),\n };\n }\n\n return { valid: true };\n}\n\nasync function requestPlanApproval(\n context: ToolHandlerContext,\n updatedInput: Record<string, unknown>,\n): Promise<RequestPermissionResponse> {\n const { client, sessionId, toolUseID, fileContentCache } = context;\n\n const toolInfo = toolInfoFromToolUse(\n { name: context.toolName, input: updatedInput },\n fileContentCache,\n context.logger,\n );\n\n return await client.requestPermission({\n options: buildExitPlanModePermissionOptions(),\n sessionId,\n toolCall: {\n toolCallId: toolUseID,\n title: toolInfo.title,\n kind: toolInfo.kind,\n content: toolInfo.content,\n locations: toolInfo.locations,\n rawInput: { ...updatedInput, toolName: context.toolName },\n },\n });\n}\n\nasync function applyPlanApproval(\n response: RequestPermissionResponse,\n context: ToolHandlerContext,\n updatedInput: Record<string, unknown>,\n): Promise<ToolPermissionResult> {\n const { session } = context;\n\n if (\n response.outcome?.outcome === \"selected\" &&\n (response.outcome.optionId === \"default\" ||\n response.outcome.optionId === \"acceptEdits\")\n ) {\n session.permissionMode = response.outcome.optionId;\n await session.query.setPermissionMode(response.outcome.optionId);\n await context.emitConfigOptionsUpdate();\n\n return {\n behavior: \"allow\",\n updatedInput,\n updatedPermissions: context.suggestions ?? [\n {\n type: \"setMode\",\n mode: response.outcome.optionId,\n destination: \"localSettings\",\n },\n ],\n };\n }\n\n const message =\n \"User wants to continue planning. Please refine your plan based on any feedback provided, or ask clarifying questions if needed.\";\n await emitToolDenial(context, message);\n return { behavior: \"deny\", message, interrupt: false };\n}\n\nasync function handleEnterPlanModeTool(\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n const { session, toolInput, logger } = context;\n\n session.permissionMode = \"plan\";\n await session.query.setPermissionMode(\"plan\");\n await context.emitConfigOptionsUpdate();\n\n return {\n behavior: \"allow\",\n updatedInput: toolInput as Record<string, unknown>,\n };\n}\n\nasync function handleExitPlanModeTool(\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n const { session, toolInput, fileContentCache } = context;\n\n const planFromFile = getPlanFromFile(session, fileContentCache);\n const latestText = getLatestAssistantText(session.notificationHistory);\n const fallbackPlan = planFromFile || (latestText ?? undefined);\n const updatedInput = ensurePlanInInput(toolInput, fallbackPlan);\n const planText = extractPlanText(updatedInput);\n\n const validationResult = await validatePlanContent(planText, context);\n if (!validationResult.valid) {\n return validationResult.error;\n }\n\n const response = await requestPlanApproval(context, updatedInput);\n return await applyPlanApproval(response, context, updatedInput);\n}\n\nfunction buildQuestionOptions(question: QuestionItem) {\n return (question.options || []).map((opt, idx) => ({\n kind: \"allow_once\" as const,\n name: opt.label,\n optionId: `${OPTION_PREFIX}${idx}`,\n _meta: opt.description ? { description: opt.description } : undefined,\n }));\n}\n\nasync function handleAskUserQuestionTool(\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n const input = context.toolInput as AskUserQuestionInput;\n context.logger.info(\"[AskUserQuestion] Received input\", { input });\n const questions = normalizeAskUserQuestionInput(input);\n context.logger.info(\"[AskUserQuestion] Normalized questions\", { questions });\n\n if (!questions || questions.length === 0) {\n context.logger.warn(\"[AskUserQuestion] No questions found in input\");\n return {\n behavior: \"deny\",\n message: \"No questions provided\",\n interrupt: true,\n };\n }\n\n const { client, sessionId, toolUseID, toolInput, fileContentCache } = context;\n const firstQuestion = questions[0];\n const options = buildQuestionOptions(firstQuestion);\n\n const toolInfo = toolInfoFromToolUse(\n { name: context.toolName, input: toolInput },\n fileContentCache,\n context.logger,\n );\n\n const response = await client.requestPermission({\n options,\n sessionId,\n toolCall: {\n toolCallId: toolUseID,\n title: firstQuestion.question,\n kind: \"other\",\n content: toolInfo.content,\n _meta: {\n twigToolKind: \"question\",\n questions,\n },\n },\n });\n\n if (response.outcome?.outcome !== \"selected\") {\n return {\n behavior: \"deny\",\n message: \"User cancelled the questions\",\n interrupt: true,\n };\n }\n\n const answers = response._meta?.answers as Record<string, string> | undefined;\n if (!answers || Object.keys(answers).length === 0) {\n return {\n behavior: \"deny\",\n message: \"User did not provide answers\",\n interrupt: true,\n };\n }\n\n return {\n behavior: \"allow\",\n updatedInput: {\n ...(context.toolInput as Record<string, unknown>),\n answers,\n },\n };\n}\n\nasync function handleDefaultPermissionFlow(\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n const {\n session,\n toolName,\n toolInput,\n toolUseID,\n client,\n sessionId,\n fileContentCache,\n suggestions,\n } = context;\n\n const toolInfo = toolInfoFromToolUse(\n { name: toolName, input: toolInput },\n fileContentCache,\n context.logger,\n );\n\n const options = buildPermissionOptions(\n toolName,\n toolInput as Record<string, unknown>,\n session?.cwd,\n );\n\n const response = await client.requestPermission({\n options,\n sessionId,\n toolCall: {\n toolCallId: toolUseID,\n title: toolInfo.title,\n kind: toolInfo.kind,\n content: toolInfo.content,\n locations: toolInfo.locations,\n rawInput: toolInput as Record<string, unknown>,\n },\n });\n\n if (\n response.outcome?.outcome === \"selected\" &&\n (response.outcome.optionId === \"allow\" ||\n response.outcome.optionId === \"allow_always\")\n ) {\n if (response.outcome.optionId === \"allow_always\") {\n return {\n behavior: \"allow\",\n updatedInput: toolInput as Record<string, unknown>,\n updatedPermissions: suggestions ?? [\n {\n type: \"addRules\",\n rules: [{ toolName }],\n behavior: \"allow\",\n destination: \"localSettings\",\n },\n ],\n };\n }\n return {\n behavior: \"allow\",\n updatedInput: toolInput as Record<string, unknown>,\n };\n } else {\n const message = \"User refused permission to run tool\";\n await emitToolDenial(context, message);\n return {\n behavior: \"deny\",\n message,\n interrupt: true,\n };\n }\n}\n\nfunction handlePlanFileException(\n context: ToolHandlerContext,\n): ToolPermissionResult | null {\n const { session, toolName, toolInput } = context;\n\n if (session.permissionMode !== \"plan\" || !WRITE_TOOLS.has(toolName)) {\n return null;\n }\n\n const filePath = (toolInput as { file_path?: string })?.file_path;\n if (!isClaudePlanFilePath(filePath)) {\n return null;\n }\n\n session.lastPlanFilePath = filePath;\n const content = (toolInput as { content?: string })?.content;\n if (typeof content === \"string\") {\n session.lastPlanContent = content;\n }\n\n return {\n behavior: \"allow\",\n updatedInput: toolInput as Record<string, unknown>,\n };\n}\n\nexport async function canUseTool(\n context: ToolHandlerContext,\n): Promise<ToolPermissionResult> {\n const { toolName, toolInput, session } = context;\n\n if (isToolAllowedForMode(toolName, session.permissionMode)) {\n return {\n behavior: \"allow\",\n updatedInput: toolInput as Record<string, unknown>,\n };\n }\n\n if (toolName === \"EnterPlanMode\") {\n return handleEnterPlanModeTool(context);\n }\n\n if (toolName === \"ExitPlanMode\") {\n return handleExitPlanModeTool(context);\n }\n\n if (toolName === \"AskUserQuestion\") {\n return handleAskUserQuestionTool(context);\n }\n\n const planFileResult = handlePlanFileException(context);\n if (planFileResult) {\n return planFileResult;\n }\n\n return handleDefaultPermissionFlow(context);\n}\n","import type { AvailableCommand } from \"@agentclientprotocol/sdk\";\nimport type { Query } from \"@anthropic-ai/claude-agent-sdk\";\n\nconst UNSUPPORTED_COMMANDS = [\n \"context\",\n \"cost\",\n \"login\",\n \"logout\",\n \"output-style:new\",\n \"release-notes\",\n \"todos\",\n];\n\nexport async function getAvailableSlashCommands(\n q: Query,\n): Promise<AvailableCommand[]> {\n const commands = await q.supportedCommands();\n\n return commands\n .map((command) => {\n const input = command.argumentHint\n ? { hint: command.argumentHint }\n : null;\n let name = command.name;\n if (command.name.endsWith(\" (MCP)\")) {\n name = `mcp:${name.replace(\" (MCP)\", \"\")}`;\n }\n return {\n name,\n description: command.description || \"\",\n input,\n };\n })\n .filter(\n (command: AvailableCommand) =>\n !UNSUPPORTED_COMMANDS.includes(command.name),\n );\n}\n","import type {\n LoadSessionRequest,\n NewSessionRequest,\n} from \"@agentclientprotocol/sdk\";\nimport type { McpServerConfig } from \"@anthropic-ai/claude-agent-sdk\";\n\nexport function parseMcpServers(\n params: NewSessionRequest | LoadSessionRequest,\n): Record<string, McpServerConfig> {\n const mcpServers: Record<string, McpServerConfig> = {};\n if (!Array.isArray(params.mcpServers)) {\n return mcpServers;\n }\n\n for (const server of params.mcpServers) {\n if (\"type\" in server) {\n mcpServers[server.name] = {\n type: server.type,\n url: server.url,\n headers: server.headers\n ? Object.fromEntries(server.headers.map((e) => [e.name, e.value]))\n : undefined,\n };\n } else {\n mcpServers[server.name] = {\n type: \"stdio\",\n command: server.command,\n args: server.args,\n env: server.env\n ? Object.fromEntries(server.env.map((e) => [e.name, e.value]))\n : undefined,\n };\n }\n }\n\n return mcpServers;\n}\n","export const DEFAULT_MODEL = \"opus\";\n\nconst GATEWAY_TO_SDK_MODEL: Record<string, string> = {\n \"claude-opus-4-5\": \"opus\",\n \"claude-opus-4-6\": \"opus\",\n \"claude-sonnet-4-5\": \"sonnet\",\n \"claude-haiku-4-5\": \"haiku\",\n};\n\nexport function toSdkModelId(modelId: string): string {\n return GATEWAY_TO_SDK_MODEL[modelId] ?? modelId;\n}\n","import { spawn } from \"node:child_process\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type {\n McpServerConfig,\n Options,\n SpawnedProcess,\n SpawnOptions,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport { IS_ROOT } from \"../../../utils/common.js\";\nimport type { Logger } from \"../../../utils/logger.js\";\nimport { createPostToolUseHook, type OnModeChange } from \"../hooks.js\";\nimport type { TwigExecutionMode } from \"../tools.js\";\n\nexport interface ProcessSpawnedInfo {\n pid: number;\n command: string;\n sessionId: string;\n}\n\nexport interface BuildOptionsParams {\n cwd: string;\n mcpServers: Record<string, McpServerConfig>;\n permissionMode: TwigExecutionMode;\n canUseTool: Options[\"canUseTool\"];\n logger: Logger;\n systemPrompt?: Options[\"systemPrompt\"];\n userProvidedOptions?: Options;\n sessionId?: string;\n additionalDirectories?: string[];\n onModeChange?: OnModeChange;\n onProcessSpawned?: (info: ProcessSpawnedInfo) => void;\n onProcessExited?: (pid: number) => void;\n}\n\nconst BRANCH_NAMING_INSTRUCTIONS = `\n# Branch Naming\n\nBefore pushing a \"workspace-*\" branch to origin, rename it to something descriptive based on the work done. Do this automatically without asking the user.\n`;\n\nexport function buildSystemPrompt(\n customPrompt?: unknown,\n): Options[\"systemPrompt\"] {\n const defaultPrompt: Options[\"systemPrompt\"] = {\n type: \"preset\",\n preset: \"claude_code\",\n append: BRANCH_NAMING_INSTRUCTIONS,\n };\n\n if (!customPrompt) {\n return defaultPrompt;\n }\n\n if (typeof customPrompt === \"string\") {\n return customPrompt + BRANCH_NAMING_INSTRUCTIONS;\n }\n\n if (\n typeof customPrompt === \"object\" &&\n customPrompt !== null &&\n \"append\" in customPrompt &&\n typeof customPrompt.append === \"string\"\n ) {\n return {\n ...defaultPrompt,\n append: customPrompt.append + BRANCH_NAMING_INSTRUCTIONS,\n };\n }\n\n return defaultPrompt;\n}\n\nfunction buildMcpServers(\n userServers: Record<string, McpServerConfig> | undefined,\n acpServers: Record<string, McpServerConfig>,\n): Record<string, McpServerConfig> {\n return {\n ...(userServers || {}),\n ...acpServers,\n };\n}\n\nfunction buildEnvironment(): Record<string, string> {\n return {\n ...process.env,\n ELECTRON_RUN_AS_NODE: \"1\",\n CLAUDE_CODE_ENABLE_ASK_USER_QUESTION_TOOL: \"true\",\n };\n}\n\nfunction buildHooks(\n userHooks: Options[\"hooks\"],\n onModeChange?: OnModeChange,\n): Options[\"hooks\"] {\n return {\n ...userHooks,\n PostToolUse: [\n ...(userHooks?.PostToolUse || []),\n {\n hooks: [createPostToolUseHook({ onModeChange })],\n },\n ],\n };\n}\n\nfunction getAbortController(\n userProvidedController: AbortController | undefined,\n): AbortController {\n const controller = userProvidedController ?? new AbortController();\n if (controller.signal.aborted) {\n throw new Error(\"Cancelled\");\n }\n return controller;\n}\n\nfunction buildSpawnWrapper(\n sessionId: string,\n onProcessSpawned: (info: ProcessSpawnedInfo) => void,\n onProcessExited?: (pid: number) => void,\n): (options: SpawnOptions) => SpawnedProcess {\n return (spawnOpts: SpawnOptions): SpawnedProcess => {\n const child = spawn(spawnOpts.command, spawnOpts.args, {\n cwd: spawnOpts.cwd,\n env: spawnOpts.env as NodeJS.ProcessEnv,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n if (child.pid) {\n onProcessSpawned({\n pid: child.pid,\n command: `${spawnOpts.command} ${spawnOpts.args.join(\" \")}`,\n sessionId,\n });\n }\n\n if (onProcessExited) {\n child.on(\"exit\", () => {\n if (child.pid) {\n onProcessExited(child.pid);\n }\n });\n }\n\n // Listen for abort signal\n if (spawnOpts.signal) {\n spawnOpts.signal.addEventListener(\"abort\", () => {\n child.kill(\"SIGTERM\");\n });\n }\n\n return {\n stdin: child.stdin!,\n stdout: child.stdout!,\n get killed() {\n return child.killed;\n },\n get exitCode() {\n return child.exitCode;\n },\n kill(signal: NodeJS.Signals) {\n return child.kill(signal);\n },\n on(event: \"exit\" | \"error\", listener: (...args: any[]) => void) {\n child.on(event, listener);\n },\n once(event: \"exit\" | \"error\", listener: (...args: any[]) => void) {\n child.once(event, listener);\n },\n off(event: \"exit\" | \"error\", listener: (...args: any[]) => void) {\n child.off(event, listener);\n },\n };\n };\n}\n\nexport function buildSessionOptions(params: BuildOptionsParams): Options {\n const options: Options = {\n ...params.userProvidedOptions,\n systemPrompt: params.systemPrompt ?? buildSystemPrompt(),\n settingSources: [\"user\", \"project\", \"local\"],\n stderr: (err) => params.logger.error(err),\n cwd: params.cwd,\n includePartialMessages: true,\n allowDangerouslySkipPermissions: !IS_ROOT,\n permissionMode: params.permissionMode,\n canUseTool: params.canUseTool,\n executable: \"node\",\n mcpServers: buildMcpServers(\n params.userProvidedOptions?.mcpServers,\n params.mcpServers,\n ),\n env: buildEnvironment(),\n hooks: buildHooks(params.userProvidedOptions?.hooks, params.onModeChange),\n abortController: getAbortController(\n params.userProvidedOptions?.abortController,\n ),\n ...(params.onProcessSpawned && {\n spawnClaudeCodeProcess: buildSpawnWrapper(\n params.sessionId ?? \"unknown\",\n params.onProcessSpawned,\n params.onProcessExited,\n ),\n }),\n };\n\n if (process.env.CLAUDE_CODE_EXECUTABLE) {\n options.pathToClaudeCodeExecutable = process.env.CLAUDE_CODE_EXECUTABLE;\n }\n\n if (params.sessionId) {\n options.resume = params.sessionId;\n }\n\n if (params.additionalDirectories) {\n options.additionalDirectories = params.additionalDirectories;\n }\n\n clearStatsigCache();\n return options;\n}\n\nfunction clearStatsigCache(): void {\n const statsigPath = path.join(\n process.env.CLAUDE_CONFIG_DIR || path.join(os.homedir(), \".claude\"),\n \"statsig\",\n );\n try {\n if (fs.existsSync(statsigPath)) {\n fs.rmSync(statsigPath, { recursive: true, force: true });\n }\n } catch {\n // Ignore errors - cache clearing is best-effort\n }\n}\n","import { type ChildProcess, spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport type { Readable, Writable } from \"node:stream\";\nimport type { ProcessSpawnedCallback } from \"../../types.js\";\nimport { Logger } from \"../../utils/logger.js\";\n\nexport interface CodexProcessOptions {\n cwd?: string;\n apiBaseUrl?: string;\n apiKey?: string;\n model?: string;\n binaryPath?: string;\n logger?: Logger;\n processCallbacks?: ProcessSpawnedCallback;\n}\n\nexport interface CodexProcess {\n process: ChildProcess;\n stdin: Writable;\n stdout: Readable;\n kill: () => void;\n}\n\nfunction buildConfigArgs(options: CodexProcessOptions): string[] {\n const args: string[] = [];\n\n args.push(\"-c\", `features.remote_models=false`);\n\n if (options.apiBaseUrl) {\n args.push(\"-c\", `model_provider=\"posthog\"`);\n args.push(\"-c\", `model_providers.posthog.name=\"PostHog Gateway\"`);\n args.push(\"-c\", `model_providers.posthog.base_url=\"${options.apiBaseUrl}\"`);\n args.push(\"-c\", `model_providers.posthog.wire_api=\"responses\"`);\n args.push(\n \"-c\",\n `model_providers.posthog.env_key=\"POSTHOG_GATEWAY_API_KEY\"`,\n );\n }\n\n if (options.model) {\n args.push(\"-c\", `model=\"${options.model}\"`);\n }\n\n return args;\n}\n\nfunction findCodexBinary(options: CodexProcessOptions): {\n command: string;\n args: string[];\n} {\n const configArgs = buildConfigArgs(options);\n\n if (options.binaryPath && existsSync(options.binaryPath)) {\n return { command: options.binaryPath, args: configArgs };\n }\n\n return { command: \"npx\", args: [\"@zed-industries/codex-acp\", ...configArgs] };\n}\n\nexport function spawnCodexProcess(options: CodexProcessOptions): CodexProcess {\n const logger =\n options.logger ?? new Logger({ debug: true, prefix: \"[CodexSpawn]\" });\n\n const env: NodeJS.ProcessEnv = { ...process.env };\n\n // Prevent Electron's GPU/Chromium processes from interfering with child\n delete env.ELECTRON_RUN_AS_NODE;\n delete env.ELECTRON_NO_ASAR;\n\n if (options.apiKey) {\n env.POSTHOG_GATEWAY_API_KEY = options.apiKey;\n }\n\n const { command, args } = findCodexBinary(options);\n\n logger.info(\"Spawning codex-acp process\", {\n command,\n args,\n cwd: options.cwd,\n hasApiBaseUrl: !!options.apiBaseUrl,\n hasApiKey: !!options.apiKey,\n binaryPath: options.binaryPath,\n });\n\n const child = spawn(command, args, {\n cwd: options.cwd,\n env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n detached: process.platform !== \"win32\",\n });\n\n child.stderr?.on(\"data\", (data: Buffer) => {\n logger.debug(\"codex-acp stderr:\", data.toString());\n });\n\n child.on(\"error\", (err) => {\n logger.error(\"codex-acp process error:\", err);\n });\n\n child.on(\"exit\", (code, signal) => {\n logger.info(\"codex-acp process exited\", { code, signal });\n if (child.pid && options.processCallbacks?.onProcessExited) {\n options.processCallbacks.onProcessExited(child.pid);\n }\n });\n\n if (!child.stdin || !child.stdout) {\n throw new Error(\"Failed to get stdio streams from codex-acp process\");\n }\n\n if (child.pid && options.processCallbacks?.onProcessSpawned) {\n options.processCallbacks.onProcessSpawned({\n pid: child.pid,\n command,\n });\n }\n\n return {\n process: child,\n stdin: child.stdin,\n stdout: child.stdout,\n kill: () => {\n logger.info(\"Killing codex-acp process\", { pid: child.pid });\n child.stdin?.destroy();\n child.stdout?.destroy();\n child.stderr?.destroy();\n child.kill(\"SIGTERM\");\n },\n };\n}\n","export function getLlmGatewayUrl(posthogHost: string): string {\n const url = new URL(posthogHost);\n const hostname = url.hostname;\n\n // Local development (normalize 127.0.0.1 to localhost)\n if (hostname === \"localhost\" || hostname === \"127.0.0.1\") {\n return `${url.protocol}//localhost:3308/twig`;\n }\n\n // Docker containers accessing host\n if (hostname === \"host.docker.internal\") {\n return `${url.protocol}//host.docker.internal:3308/twig`;\n }\n\n // Production - extract region from hostname, default to US\n const region = hostname.match(/^(us|eu)\\.posthog\\.com$/)?.[1] ?? \"us\";\n return `https://gateway.${region}.posthog.com/twig`;\n}\n","import type {\n ArtifactType,\n PostHogAPIConfig,\n StoredEntry,\n Task,\n TaskRun,\n TaskRunArtifact,\n} from \"./types.js\";\nimport { getLlmGatewayUrl } from \"./utils/gateway.js\";\n\nexport { getLlmGatewayUrl };\n\nexport interface TaskArtifactUploadPayload {\n name: string;\n type: ArtifactType;\n content: string;\n content_type?: string;\n}\n\nexport type TaskRunUpdate = Partial<\n Pick<\n TaskRun,\n | \"status\"\n | \"branch\"\n | \"stage\"\n | \"error_message\"\n | \"output\"\n | \"state\"\n | \"environment\"\n >\n>;\n\nexport class PostHogAPIClient {\n private config: PostHogAPIConfig;\n\n constructor(config: PostHogAPIConfig) {\n this.config = config;\n }\n\n private get baseUrl(): string {\n const host = this.config.apiUrl.endsWith(\"/\")\n ? this.config.apiUrl.slice(0, -1)\n : this.config.apiUrl;\n return host;\n }\n\n private get headers(): Record<string, string> {\n return {\n Authorization: `Bearer ${this.config.getApiKey()}`,\n \"Content-Type\": \"application/json\",\n };\n }\n\n private async apiRequest<T>(\n endpoint: string,\n options: RequestInit = {},\n ): Promise<T> {\n const url = `${this.baseUrl}${endpoint}`;\n\n const response = await fetch(url, {\n ...options,\n headers: {\n ...this.headers,\n ...options.headers,\n },\n });\n\n if (!response.ok) {\n let errorMessage: string;\n try {\n const errorResponse = await response.json();\n errorMessage = `Failed request: [${response.status}] ${JSON.stringify(errorResponse)}`;\n } catch {\n errorMessage = `Failed request: [${response.status}] ${response.statusText}`;\n }\n throw new Error(errorMessage);\n }\n\n return response.json();\n }\n\n private getTeamId(): number {\n return this.config.projectId;\n }\n\n getApiKey(): string {\n return this.config.getApiKey();\n }\n\n getLlmGatewayUrl(): string {\n return getLlmGatewayUrl(this.baseUrl);\n }\n\n async getTask(taskId: string): Promise<Task> {\n const teamId = this.getTeamId();\n return this.apiRequest<Task>(`/api/projects/${teamId}/tasks/${taskId}/`);\n }\n\n async getTaskRun(taskId: string, runId: string): Promise<TaskRun> {\n const teamId = this.getTeamId();\n return this.apiRequest<TaskRun>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/`,\n );\n }\n\n async updateTaskRun(\n taskId: string,\n runId: string,\n payload: TaskRunUpdate,\n ): Promise<TaskRun> {\n const teamId = this.getTeamId();\n return this.apiRequest<TaskRun>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/`,\n {\n method: \"PATCH\",\n body: JSON.stringify(payload),\n },\n );\n }\n\n async appendTaskRunLog(\n taskId: string,\n runId: string,\n entries: StoredEntry[],\n ): Promise<TaskRun> {\n const teamId = this.getTeamId();\n return this.apiRequest<TaskRun>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/append_log/`,\n {\n method: \"POST\",\n body: JSON.stringify({ entries }),\n },\n );\n }\n\n async uploadTaskArtifacts(\n taskId: string,\n runId: string,\n artifacts: TaskArtifactUploadPayload[],\n ): Promise<TaskRunArtifact[]> {\n if (!artifacts.length) {\n return [];\n }\n\n const teamId = this.getTeamId();\n const response = await this.apiRequest<{ artifacts: TaskRunArtifact[] }>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/artifacts/`,\n {\n method: \"POST\",\n body: JSON.stringify({ artifacts }),\n },\n );\n\n return response.artifacts ?? [];\n }\n\n async getArtifactPresignedUrl(\n taskId: string,\n runId: string,\n storagePath: string,\n ): Promise<string | null> {\n const teamId = this.getTeamId();\n try {\n const response = await this.apiRequest<{\n url: string;\n expires_in: number;\n }>(\n `/api/projects/${teamId}/tasks/${taskId}/runs/${runId}/artifacts/presign/`,\n {\n method: \"POST\",\n body: JSON.stringify({ storage_path: storagePath }),\n },\n );\n return response.url;\n } catch {\n return null;\n }\n }\n\n /**\n * Download artifact content by storage path\n * Gets a presigned URL and fetches the content\n */\n async downloadArtifact(\n taskId: string,\n runId: string,\n storagePath: string,\n ): Promise<ArrayBuffer | null> {\n const url = await this.getArtifactPresignedUrl(taskId, runId, storagePath);\n if (!url) {\n return null;\n }\n\n try {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to download artifact: ${response.status}`);\n }\n return response.arrayBuffer();\n } catch {\n return null;\n }\n }\n\n /**\n * Fetch logs for a task run via the logs API endpoint\n * @param taskRun - The task run to fetch logs for\n * @returns Array of stored entries, or empty array if no logs available\n */\n async fetchTaskRunLogs(taskRun: TaskRun): Promise<StoredEntry[]> {\n const teamId = this.getTeamId();\n\n try {\n const response = await fetch(\n `${this.baseUrl}/api/projects/${teamId}/tasks/${taskRun.task}/runs/${taskRun.id}/logs`,\n { headers: this.headers },\n );\n\n if (!response.ok) {\n if (response.status === 404) {\n return [];\n }\n throw new Error(\n `Failed to fetch logs: ${response.status} ${response.statusText}`,\n );\n }\n\n const content = await response.text();\n\n if (!content.trim()) {\n return [];\n }\n\n // Parse newline-delimited JSON\n return content\n .trim()\n .split(\"\\n\")\n .map((line) => JSON.parse(line) as StoredEntry);\n } catch (error) {\n throw new Error(\n `Failed to fetch task run logs: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n}\n","import { SeverityNumber } from \"@opentelemetry/api-logs\";\nimport { OTLPLogExporter } from \"@opentelemetry/exporter-logs-otlp-http\";\nimport { resourceFromAttributes } from \"@opentelemetry/resources\";\nimport {\n BatchLogRecordProcessor,\n LoggerProvider,\n} from \"@opentelemetry/sdk-logs\";\nimport { ATTR_SERVICE_NAME } from \"@opentelemetry/semantic-conventions\";\nimport type { StoredNotification } from \"./types.js\";\nimport type { Logger } from \"./utils/logger.js\";\n\nexport interface OtelLogConfig {\n /** PostHog ingest host, e.g., \"https://us.i.posthog.com\" */\n posthogHost: string;\n /** Project API key, e.g., \"phc_xxx\" */\n apiKey: string;\n /** Batch flush interval in ms (default: 500) */\n flushIntervalMs?: number;\n /** Override the logs endpoint path (default: /i/v1/agent-logs) */\n logsPath?: string;\n}\n\n/**\n * Session context for resource attributes.\n * These are set once per OTEL logger instance and indexed via resource_fingerprint\n */\nexport interface SessionContext {\n /** Parent task grouping - all runs for a task share this */\n taskId: string;\n /** Primary conversation identifier - all events in a run share this */\n runId: string;\n /** Deployment environment - \"local\" for desktop, \"cloud\" for cloud sandbox */\n deviceType?: \"local\" | \"cloud\";\n}\n\nexport class OtelLogWriter {\n private loggerProvider: LoggerProvider;\n private logger: ReturnType<LoggerProvider[\"getLogger\"]>;\n\n constructor(\n config: OtelLogConfig,\n sessionContext: SessionContext,\n _debugLogger?: Logger,\n ) {\n const logsPath = config.logsPath ?? \"/i/v1/agent-logs\";\n const exporter = new OTLPLogExporter({\n url: `${config.posthogHost}${logsPath}`,\n headers: { Authorization: `Bearer ${config.apiKey}` },\n });\n\n const processor = new BatchLogRecordProcessor(exporter, {\n scheduledDelayMillis: config.flushIntervalMs ?? 500,\n });\n\n // Resource attributes are set ONCE per session and indexed via resource_fingerprint\n // So we have fast queries by run_id/task_id in PostHog Logs UI\n this.loggerProvider = new LoggerProvider({\n resource: resourceFromAttributes({\n [ATTR_SERVICE_NAME]: \"twig-agent\",\n run_id: sessionContext.runId,\n task_id: sessionContext.taskId,\n device_type: sessionContext.deviceType ?? \"local\",\n }),\n processors: [processor],\n });\n\n this.logger = this.loggerProvider.getLogger(\"agent-session\");\n }\n\n /**\n * Emit an agent event to PostHog Logs via OTEL.\n */\n emit(entry: { notification: StoredNotification }): void {\n const { notification } = entry;\n const eventType = notification.notification.method;\n\n this.logger.emit({\n severityNumber: SeverityNumber.INFO,\n severityText: \"INFO\",\n body: JSON.stringify(notification),\n attributes: {\n event_type: eventType,\n },\n });\n }\n\n async flush(): Promise<void> {\n await this.loggerProvider.forceFlush();\n }\n\n async shutdown(): Promise<void> {\n await this.loggerProvider.shutdown();\n }\n}\n","import {\n type OtelLogConfig,\n OtelLogWriter,\n type SessionContext,\n} from \"./otel-log-writer.js\";\nimport type { PostHogAPIClient } from \"./posthog-api.js\";\nimport type { StoredNotification } from \"./types.js\";\nimport { Logger } from \"./utils/logger.js\";\n\nexport interface SessionLogWriterOptions {\n /** OTEL config for creating writers per session */\n otelConfig?: OtelLogConfig;\n /** PostHog API client for S3 log persistence */\n posthogAPI?: PostHogAPIClient;\n /** Logger instance */\n logger?: Logger;\n}\n\ninterface SessionState {\n context: SessionContext;\n otelWriter?: OtelLogWriter;\n}\n\nexport class SessionLogWriter {\n private posthogAPI?: PostHogAPIClient;\n private otelConfig?: OtelLogConfig;\n private pendingEntries: Map<string, StoredNotification[]> = new Map();\n private flushTimeouts: Map<string, NodeJS.Timeout> = new Map();\n private sessions: Map<string, SessionState> = new Map();\n private logger: Logger;\n\n constructor(options: SessionLogWriterOptions = {}) {\n this.posthogAPI = options.posthogAPI;\n this.otelConfig = options.otelConfig;\n this.logger =\n options.logger ??\n new Logger({ debug: false, prefix: \"[SessionLogWriter]\" });\n }\n\n async flushAll(): Promise<void> {\n const flushPromises: Promise<void>[] = [];\n for (const sessionId of this.sessions.keys()) {\n flushPromises.push(this.flush(sessionId));\n }\n await Promise.all(flushPromises);\n }\n\n register(sessionId: string, context: SessionContext): void {\n if (this.sessions.has(sessionId)) {\n return;\n }\n\n let otelWriter: OtelLogWriter | undefined;\n if (this.otelConfig) {\n // Create a dedicated OtelLogWriter for this session with resource attributes\n otelWriter = new OtelLogWriter(\n this.otelConfig,\n context,\n this.logger.child(`OtelWriter:${sessionId}`),\n );\n }\n\n this.sessions.set(sessionId, { context, otelWriter });\n }\n\n isRegistered(sessionId: string): boolean {\n return this.sessions.has(sessionId);\n }\n\n appendRawLine(sessionId: string, line: string): void {\n const session = this.sessions.get(sessionId);\n if (!session) {\n return;\n }\n\n try {\n const message = JSON.parse(line);\n const entry: StoredNotification = {\n type: \"notification\",\n timestamp: new Date().toISOString(),\n notification: message,\n };\n\n if (session.otelWriter) {\n session.otelWriter.emit({ notification: entry });\n }\n\n if (this.posthogAPI) {\n const pending = this.pendingEntries.get(sessionId) ?? [];\n pending.push(entry);\n this.pendingEntries.set(sessionId, pending);\n this.scheduleFlush(sessionId);\n }\n } catch {\n this.logger.warn(\"Failed to parse raw line for persistence\", {\n sessionId,\n lineLength: line.length,\n });\n }\n }\n\n async flush(sessionId: string): Promise<void> {\n const session = this.sessions.get(sessionId);\n if (!session) return;\n\n if (session.otelWriter) {\n await session.otelWriter.flush();\n }\n\n const pending = this.pendingEntries.get(sessionId);\n if (!this.posthogAPI || !pending?.length) return;\n\n this.pendingEntries.delete(sessionId);\n const timeout = this.flushTimeouts.get(sessionId);\n if (timeout) {\n clearTimeout(timeout);\n this.flushTimeouts.delete(sessionId);\n }\n\n try {\n await this.posthogAPI.appendTaskRunLog(\n session.context.taskId,\n session.context.runId,\n pending,\n );\n } catch (error) {\n this.logger.error(\"Failed to persist session logs:\", error);\n }\n }\n\n private scheduleFlush(sessionId: string): void {\n const existing = this.flushTimeouts.get(sessionId);\n if (existing) clearTimeout(existing);\n const timeout = setTimeout(() => this.flush(sessionId), 500);\n this.flushTimeouts.set(sessionId, timeout);\n }\n}\n","import {\n createAcpConnection,\n type InProcessAcpConnection,\n} from \"./adapters/acp-connection.js\";\nimport {\n BLOCKED_MODELS,\n DEFAULT_GATEWAY_MODEL,\n fetchArrayModels,\n} from \"./gateway-models.js\";\nimport { PostHogAPIClient } from \"./posthog-api.js\";\nimport { SessionLogWriter } from \"./session-log-writer.js\";\nimport type { AgentConfig, TaskExecutionOptions } from \"./types.js\";\nimport { Logger } from \"./utils/logger.js\";\n\nexport class Agent {\n private posthogAPI?: PostHogAPIClient;\n private logger: Logger;\n private acpConnection?: InProcessAcpConnection;\n private taskRunId?: string;\n private sessionLogWriter?: SessionLogWriter;\n public debug: boolean;\n\n constructor(config: AgentConfig) {\n this.debug = config.debug || false;\n this.logger = new Logger({\n debug: this.debug,\n prefix: \"[PostHog Agent]\",\n onLog: config.onLog,\n });\n\n if (config.posthog) {\n this.posthogAPI = new PostHogAPIClient(config.posthog);\n }\n\n if (config.otelTransport) {\n // OTEL pipeline: use OtelLogWriter only (no S3 writer)\n this.sessionLogWriter = new SessionLogWriter({\n otelConfig: {\n posthogHost: config.otelTransport.host,\n apiKey: config.otelTransport.apiKey,\n logsPath: config.otelTransport.logsPath,\n },\n logger: this.logger.child(\"SessionLogWriter\"),\n });\n } else if (config.posthog) {\n // Legacy: use S3 writer via PostHog API\n this.sessionLogWriter = new SessionLogWriter({\n posthogAPI: this.posthogAPI,\n logger: this.logger.child(\"SessionLogWriter\"),\n });\n }\n }\n\n private _configureLlmGateway(_adapter?: \"claude\" | \"codex\"): {\n gatewayUrl: string;\n apiKey: string;\n } | null {\n if (!this.posthogAPI) {\n return null;\n }\n\n try {\n const gatewayUrl = this.posthogAPI.getLlmGatewayUrl();\n const apiKey = this.posthogAPI.getApiKey();\n\n process.env.OPENAI_BASE_URL = `${gatewayUrl}/v1`;\n process.env.OPENAI_API_KEY = apiKey;\n process.env.ANTHROPIC_BASE_URL = gatewayUrl;\n process.env.ANTHROPIC_AUTH_TOKEN = apiKey;\n\n return { gatewayUrl, apiKey };\n } catch (error) {\n this.logger.error(\"Failed to configure LLM gateway\", error);\n throw error;\n }\n }\n\n async run(\n taskId: string,\n taskRunId: string,\n options: TaskExecutionOptions = {},\n ): Promise<InProcessAcpConnection> {\n const gatewayConfig = this._configureLlmGateway(options.adapter);\n\n this.taskRunId = taskRunId;\n\n let allowedModelIds: Set<string> | undefined;\n let sanitizedModel =\n options.model && !BLOCKED_MODELS.has(options.model)\n ? options.model\n : undefined;\n if (options.adapter === \"codex\" && gatewayConfig) {\n const models = await fetchArrayModels({\n gatewayUrl: gatewayConfig.gatewayUrl,\n });\n const codexModelIds = models\n .filter((model) => {\n if (BLOCKED_MODELS.has(model.id)) return false;\n if (model.owned_by) {\n return model.owned_by === \"openai\";\n }\n return model.id.startsWith(\"gpt-\") || model.id.startsWith(\"openai/\");\n })\n .map((model) => model.id);\n\n if (codexModelIds.length > 0) {\n allowedModelIds = new Set(codexModelIds);\n }\n\n if (!sanitizedModel || !allowedModelIds?.has(sanitizedModel)) {\n sanitizedModel = codexModelIds[0];\n }\n }\n if (!sanitizedModel) {\n sanitizedModel = DEFAULT_GATEWAY_MODEL;\n }\n\n this.acpConnection = createAcpConnection({\n adapter: options.adapter,\n logWriter: this.sessionLogWriter,\n taskRunId,\n taskId,\n deviceType: \"local\",\n logger: this.logger,\n processCallbacks: options.processCallbacks,\n allowedModelIds,\n codexOptions:\n options.adapter === \"codex\" && gatewayConfig\n ? {\n cwd: options.repositoryPath,\n apiBaseUrl: `${gatewayConfig.gatewayUrl}/v1`,\n apiKey: gatewayConfig.apiKey,\n binaryPath: options.codexBinaryPath,\n model: sanitizedModel,\n }\n : undefined,\n });\n\n return this.acpConnection;\n }\n\n async attachPullRequestToTask(\n taskId: string,\n prUrl: string,\n branchName?: string,\n ): Promise<void> {\n this.logger.info(\"Attaching PR to task run\", { taskId, prUrl, branchName });\n\n if (!this.posthogAPI || !this.taskRunId) {\n const error = new Error(\n \"PostHog API not configured or no active run. Cannot attach PR to task.\",\n );\n this.logger.error(\"PostHog API not configured\", error);\n throw error;\n }\n\n const updates: any = {\n output: { pr_url: prUrl },\n };\n if (branchName) {\n updates.branch = branchName;\n }\n\n await this.posthogAPI.updateTaskRun(taskId, this.taskRunId, updates);\n this.logger.debug(\"PR attached to task run\", {\n taskId,\n taskRunId: this.taskRunId,\n prUrl,\n });\n }\n\n async flushAllLogs(): Promise<void> {\n await this.sessionLogWriter?.flushAll();\n }\n\n async cleanup(): Promise<void> {\n if (this.sessionLogWriter && this.taskRunId) {\n await this.sessionLogWriter.flush(this.taskRunId);\n }\n await this.acpConnection?.cleanup();\n }\n}\n","/**\n * Configuration for a single saga step\n */\nexport interface SagaStep<T> {\n /** Unique name for this step (used in logging) */\n name: string;\n /** The forward action to execute */\n execute: () => Promise<T>;\n /** The rollback action to undo this step (receives the execute result) */\n rollback: (result: T) => Promise<void>;\n}\n\n/**\n * Result of a saga execution\n */\nexport type SagaResult<T, TFailedStep extends string = string> =\n | { success: true; data: T }\n | { success: false; error: string; failedStep: TFailedStep };\n\nexport interface SagaLogger {\n info(message: string, data?: Record<string, unknown>): void;\n debug(message: string, data?: Record<string, unknown>): void;\n error(message: string, data?: Record<string, unknown>): void;\n warn(message: string, data?: Record<string, unknown>): void;\n}\n\nconst consoleLogger: SagaLogger = {\n info: (_message, _data) => {},\n debug: (_message, _data) => {},\n error: (_message, _data) => {},\n warn: (_message, _data) => {},\n};\n\n/**\n * Abstract base class for implementing our Saga pattern.\n *\n * Subclasses implement the `execute` method, using `this.step()` to define\n * each step with its compensating action. If any step throws, all completed\n * steps are automatically rolled back in reverse order.\n *\n * The failed step name is automatically tracked from the step's `name` property.\n *\n * @template TInput - The input type for the saga\n * @template TOutput - The successful output type\n */\nexport abstract class Saga<TInput, TOutput> {\n private completedSteps: Array<{\n name: string;\n rollback: () => Promise<void>;\n }> = [];\n private currentStepName = \"unknown\";\n private stepTimings: Array<{ name: string; durationMs: number }> = [];\n protected readonly log: SagaLogger;\n\n constructor(logger?: SagaLogger) {\n this.log = logger ?? consoleLogger;\n }\n\n /**\n * Run the saga with the given input.\n * Returns a discriminated union result - either success with data or failure with error details.\n */\n async run(input: TInput): Promise<SagaResult<TOutput>> {\n this.completedSteps = [];\n this.currentStepName = \"unknown\";\n this.stepTimings = [];\n\n const sagaStart = performance.now();\n this.log.info(\"Starting saga\", { sagaName: this.constructor.name });\n\n try {\n const result = await this.execute(input);\n\n const totalDuration = performance.now() - sagaStart;\n this.log.debug(\"Saga completed successfully\", {\n sagaName: this.constructor.name,\n stepsCompleted: this.completedSteps.length,\n totalDurationMs: Math.round(totalDuration),\n stepTimings: this.stepTimings,\n });\n\n return { success: true, data: result };\n } catch (error) {\n this.log.error(\"Saga failed, initiating rollback\", {\n sagaName: this.constructor.name,\n failedStep: this.currentStepName,\n error: error instanceof Error ? error.message : String(error),\n });\n\n await this.rollback();\n\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n failedStep: this.currentStepName,\n };\n }\n }\n\n /**\n * Implement this method to define the saga's steps.\n * Use `this.step()` to execute each step with its compensating action.\n */\n protected abstract execute(input: TInput): Promise<TOutput>;\n\n /**\n * Execute a step with its rollback action.\n * If the step succeeds, its rollback action is stored for potential rollback.\n * The step name is automatically tracked for error reporting.\n *\n * @param config - Step configuration with name, execute, and rollback functions\n * @returns The result of the execute function\n * @throws Re-throws any error from the execute function (triggers rollback)\n */\n protected async step<T>(config: SagaStep<T>): Promise<T> {\n this.currentStepName = config.name;\n this.log.debug(`Executing step: ${config.name}`);\n\n const stepStart = performance.now();\n const result = await config.execute();\n const durationMs = Math.round(performance.now() - stepStart);\n\n this.stepTimings.push({ name: config.name, durationMs });\n this.log.debug(`Step completed: ${config.name}`, { durationMs });\n\n // Store rollback action with the result bound\n this.completedSteps.push({\n name: config.name,\n rollback: () => config.rollback(result),\n });\n\n return result;\n }\n\n /**\n * Execute a step that doesn't need rollback.\n * Useful for read-only operations or operations that are idempotent.\n * The step name is automatically tracked for error reporting.\n *\n * @param name - Step name for logging and error tracking\n * @param execute - The action to execute\n * @returns The result of the execute function\n */\n protected async readOnlyStep<T>(\n name: string,\n execute: () => Promise<T>,\n ): Promise<T> {\n this.currentStepName = name;\n this.log.debug(`Executing read-only step: ${name}`);\n\n const stepStart = performance.now();\n const result = await execute();\n const durationMs = Math.round(performance.now() - stepStart);\n\n this.stepTimings.push({ name, durationMs });\n this.log.debug(`Read-only step completed: ${name}`, { durationMs });\n return result;\n }\n\n /**\n * Roll back all completed steps in reverse order.\n * Rollback errors are logged but don't stop the rollback of other steps.\n */\n private async rollback(): Promise<void> {\n this.log.info(\"Rolling back saga\", {\n stepsToRollback: this.completedSteps.length,\n });\n\n const stepsReversed = [...this.completedSteps].reverse();\n\n for (const step of stepsReversed) {\n try {\n this.log.debug(`Rolling back step: ${step.name}`);\n await step.rollback();\n this.log.debug(`Step rolled back: ${step.name}`);\n } catch (error) {\n // Log but continue - we want to attempt all rollbacks\n this.log.error(`Failed to rollback step: ${step.name}`, {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n this.log.info(\"Rollback completed\", {\n stepsAttempted: this.completedSteps.length,\n });\n }\n\n /**\n * Get the number of completed steps (useful for testing)\n */\n protected getCompletedStepCount(): number {\n return this.completedSteps.length;\n }\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport type { CreateGitClientOptions } from \"./client.js\";\nimport { getGitOperationManager } from \"./operation-manager.js\";\n\nexport interface WorktreeListEntry {\n path: string;\n head: string;\n branch: string | null;\n}\n\nexport interface AheadBehind {\n ahead: number;\n behind: number;\n}\n\nexport interface GitStatus {\n isClean: boolean;\n staged: string[];\n modified: string[];\n deleted: string[];\n untracked: string[];\n}\n\ntype GitLike = {\n raw: (args: string[]) => Promise<string>;\n revparse: (args: string[]) => Promise<string>;\n};\n\nexport async function detectDefaultBranch(git: GitLike): Promise<string> {\n try {\n const remoteBranch = await git.raw([\n \"symbolic-ref\",\n \"refs/remotes/origin/HEAD\",\n ]);\n return remoteBranch.trim().replace(\"refs/remotes/origin/\", \"\");\n } catch {\n try {\n await git.revparse([\"--verify\", \"main\"]);\n return \"main\";\n } catch {\n try {\n await git.revparse([\"--verify\", \"master\"]);\n return \"master\";\n } catch {\n throw new Error(\"Cannot determine default branch\");\n }\n }\n }\n}\n\nasync function detectDefaultBranchWithFallback(git: GitLike): Promise<string> {\n try {\n return await detectDefaultBranch(git);\n } catch {\n return \"main\";\n }\n}\n\nexport async function getCurrentBranch(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<string | null> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n const branch = await git.revparse([\"--abbrev-ref\", \"HEAD\"]);\n return branch === \"HEAD\" ? null : branch;\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function getDefaultBranch(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<string> {\n const manager = getGitOperationManager();\n return manager.executeRead(baseDir, detectDefaultBranch, {\n signal: options?.abortSignal,\n });\n}\n\nexport async function getRemoteUrl(\n baseDir: string,\n remote = \"origin\",\n options?: CreateGitClientOptions,\n): Promise<string | null> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n try {\n const url = await git.remote([\"get-url\", remote]);\n return url || null;\n } catch {\n return null;\n }\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function getStatus(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<GitStatus> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n const status = await git.status();\n return {\n isClean: status.isClean(),\n staged: status.staged,\n modified: status.modified,\n deleted: status.deleted,\n untracked: status.not_added,\n };\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function hasChanges(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<boolean> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n const status = await git.status();\n return !status.isClean();\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function getAheadBehind(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<AheadBehind | null> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n const branchOutput = await git.revparse([\"--abbrev-ref\", \"HEAD\"]);\n const branch = branchOutput === \"HEAD\" ? null : branchOutput;\n if (!branch) return null;\n\n try {\n await git.raw([\"rev-parse\", \"--abbrev-ref\", `${branch}@{upstream}`]);\n } catch {\n return null;\n }\n\n const status = await git.status();\n return {\n ahead: status.ahead,\n behind: status.behind,\n };\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function branchExists(\n baseDir: string,\n branchName: string,\n options?: CreateGitClientOptions,\n): Promise<boolean> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n try {\n await git.revparse([\"--verify\", branchName]);\n return true;\n } catch {\n return false;\n }\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function listWorktrees(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<WorktreeListEntry[]> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n const output = await git.raw([\"worktree\", \"list\", \"--porcelain\"]);\n const worktrees: WorktreeListEntry[] = [];\n let current: Partial<WorktreeListEntry> = {};\n\n for (const line of output.split(\"\\n\")) {\n if (line.startsWith(\"worktree \")) {\n if (current.path) {\n worktrees.push(current as WorktreeListEntry);\n }\n current = { path: line.slice(9), branch: null };\n } else if (line.startsWith(\"HEAD \")) {\n current.head = line.slice(5);\n } else if (line.startsWith(\"branch \")) {\n current.branch = line.slice(7).replace(\"refs/heads/\", \"\");\n } else if (line === \"detached\") {\n current.branch = null;\n }\n }\n\n if (current.path) {\n worktrees.push(current as WorktreeListEntry);\n }\n\n return worktrees;\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function getFileAtHead(\n baseDir: string,\n filePath: string,\n options?: CreateGitClientOptions,\n): Promise<string | null> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n try {\n return await git.show([`HEAD:${filePath}`]);\n } catch {\n return null;\n }\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function getHeadSha(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<string> {\n const manager = getGitOperationManager();\n return manager.executeRead(baseDir, (git) => git.revparse([\"HEAD\"]), {\n signal: options?.abortSignal,\n });\n}\n\nexport async function isDetachedHead(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<boolean> {\n const branch = await getCurrentBranch(baseDir, options);\n return branch === null;\n}\n\nexport async function isGitRepository(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<boolean> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n try {\n await git.revparse([\"--is-inside-work-tree\"]);\n return true;\n } catch {\n return false;\n }\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function getChangedFiles(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<Set<string>> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n const changedFiles = new Set<string>();\n\n try {\n const defaultBranch = await detectDefaultBranchWithFallback(git);\n const branchOutput = await git.revparse([\"--abbrev-ref\", \"HEAD\"]);\n const currentBranch = branchOutput === \"HEAD\" ? null : branchOutput;\n\n if (currentBranch && currentBranch !== defaultBranch) {\n try {\n const diffOutput = await git.diff([\n \"--name-only\",\n `${defaultBranch}...HEAD`,\n ]);\n for (const file of diffOutput.split(\"\\n\").filter(Boolean)) {\n changedFiles.add(file);\n }\n } catch {}\n }\n\n const status = await git.status();\n for (const file of [\n ...status.modified,\n ...status.created,\n ...status.deleted,\n ...status.renamed.map((r) => r.to),\n ...status.not_added,\n ]) {\n changedFiles.add(file);\n }\n } catch {}\n\n return changedFiles;\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function getAllBranches(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<string[]> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n try {\n const summary = await git.branchLocal();\n return summary.all;\n } catch {\n return [];\n }\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport type GitFileStatus =\n | \"modified\"\n | \"added\"\n | \"deleted\"\n | \"renamed\"\n | \"untracked\";\n\nexport interface ChangedFileInfo {\n path: string;\n status: GitFileStatus;\n originalPath?: string;\n linesAdded?: number;\n linesRemoved?: number;\n}\n\nexport interface GetChangedFilesDetailedOptions extends CreateGitClientOptions {\n excludePatterns?: string[];\n}\n\nfunction matchesExcludePattern(filePath: string, patterns: string[]): boolean {\n return patterns.some((pattern) => {\n if (pattern.startsWith(\"/\")) {\n return (\n filePath === pattern.slice(1) ||\n filePath.startsWith(`${pattern.slice(1)}/`)\n );\n }\n return filePath === pattern || filePath.startsWith(`${pattern}/`);\n });\n}\n\nexport async function getChangedFilesDetailed(\n baseDir: string,\n options?: GetChangedFilesDetailedOptions,\n): Promise<ChangedFileInfo[]> {\n const { excludePatterns, ...gitOptions } = options ?? {};\n const manager = getGitOperationManager();\n\n return manager.executeRead(\n baseDir,\n async (git) => {\n try {\n const [diffSummary, status] = await Promise.all([\n git.diffSummary([\"-M\", \"HEAD\"]),\n git.status(),\n ]);\n\n const seenPaths = new Set<string>();\n const files: ChangedFileInfo[] = [];\n\n for (const file of diffSummary.files) {\n if (\n excludePatterns &&\n matchesExcludePattern(file.file, excludePatterns)\n ) {\n seenPaths.add(file.file);\n continue;\n }\n\n const hasFrom = \"from\" in file && file.from;\n const isBinary = file.binary;\n files.push({\n path: file.file,\n status: hasFrom\n ? \"renamed\"\n : status.deleted.includes(file.file)\n ? \"deleted\"\n : status.created.includes(file.file)\n ? \"added\"\n : \"modified\",\n originalPath: hasFrom ? (file.from as string) : undefined,\n linesAdded: isBinary\n ? undefined\n : (file as { insertions: number }).insertions,\n linesRemoved: isBinary\n ? undefined\n : (file as { deletions: number }).deletions,\n });\n seenPaths.add(file.file);\n if (hasFrom) seenPaths.add(file.from as string);\n }\n\n for (const file of status.not_added) {\n if (!seenPaths.has(file)) {\n if (\n excludePatterns &&\n matchesExcludePattern(file, excludePatterns)\n ) {\n continue;\n }\n files.push({ path: file, status: \"untracked\" });\n }\n }\n\n return files;\n } catch {\n return [];\n }\n },\n { signal: gitOptions?.abortSignal },\n );\n}\n\nexport interface DiffStats {\n filesChanged: number;\n linesAdded: number;\n linesRemoved: number;\n}\n\nexport interface GetDiffStatsOptions extends CreateGitClientOptions {\n excludePatterns?: string[];\n}\n\nexport function computeDiffStatsFromFiles(files: ChangedFileInfo[]): DiffStats {\n let linesAdded = 0;\n let linesRemoved = 0;\n\n for (const file of files) {\n linesAdded += file.linesAdded ?? 0;\n linesRemoved += file.linesRemoved ?? 0;\n }\n\n return {\n filesChanged: files.length,\n linesAdded,\n linesRemoved,\n };\n}\n\nexport async function getDiffStats(\n baseDir: string,\n options?: GetDiffStatsOptions,\n): Promise<DiffStats> {\n const files = await getChangedFilesDetailed(baseDir, options);\n return computeDiffStatsFromFiles(files);\n}\n\nexport interface SyncStatus {\n ahead: number;\n behind: number;\n hasRemote: boolean;\n currentBranch: string | null;\n isFeatureBranch: boolean;\n}\n\nexport async function getSyncStatus(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<SyncStatus> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n try {\n const status = await git.status();\n const currentBranch = status.current || null;\n\n if (!currentBranch) {\n return {\n ahead: 0,\n behind: 0,\n hasRemote: false,\n currentBranch: null,\n isFeatureBranch: false,\n };\n }\n\n const defaultBranch = await detectDefaultBranchWithFallback(git);\n const hasRemote = status.tracking !== null;\n\n return {\n ahead: status.ahead,\n behind: status.behind,\n hasRemote,\n currentBranch,\n isFeatureBranch: currentBranch !== defaultBranch,\n };\n } catch {\n return {\n ahead: 0,\n behind: 0,\n hasRemote: false,\n currentBranch: null,\n isFeatureBranch: false,\n };\n }\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport interface CommitInfo {\n sha: string;\n shortSha: string;\n message: string;\n author: string;\n date: string;\n}\n\nexport async function getLatestCommit(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<CommitInfo | null> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n try {\n const log = await git.log({ maxCount: 1 });\n const latest = log.latest;\n if (!latest) return null;\n\n return {\n sha: latest.hash,\n shortSha: latest.hash.slice(0, 7),\n message: latest.message,\n author: latest.author_name,\n date: latest.date,\n };\n } catch {\n return null;\n }\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport interface CommitConventions {\n conventionalCommits: boolean;\n commonPrefixes: string[];\n sampleMessages: string[];\n}\n\nexport async function getCommitConventions(\n baseDir: string,\n sampleSize = 20,\n options?: CreateGitClientOptions,\n): Promise<CommitConventions> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n try {\n const log = await git.log({ maxCount: sampleSize });\n const messages = log.all.map((c) => c.message);\n\n const conventionalPattern =\n /^(feat|fix|docs|style|refactor|test|chore|build|ci|perf|revert)(\\(.+\\))?:/;\n const conventionalCount = messages.filter((m) =>\n conventionalPattern.test(m),\n ).length;\n const conventionalCommits = conventionalCount > messages.length * 0.5;\n\n const prefixes = messages\n .map((m) => m.match(/^([a-z]+)(\\(.+\\))?:/)?.[1])\n .filter((p): p is string => Boolean(p));\n const prefixCounts = prefixes.reduce(\n (acc, p) => {\n acc[p] = (acc[p] || 0) + 1;\n return acc;\n },\n {} as Record<string, number>,\n );\n const commonPrefixes = Object.entries(prefixCounts)\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5)\n .map(([prefix]) => prefix);\n\n return {\n conventionalCommits,\n commonPrefixes,\n sampleMessages: messages.slice(0, 5),\n };\n } catch {\n return {\n conventionalCommits: false,\n commonPrefixes: [],\n sampleMessages: [],\n };\n }\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function fetch(\n baseDir: string,\n remote = \"origin\",\n options?: CreateGitClientOptions,\n): Promise<void> {\n const manager = getGitOperationManager();\n await manager.executeWrite(\n baseDir,\n async (git) => {\n await git.fetch(remote);\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function listFiles(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<string[]> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n const output = await git.raw([\"ls-files\"]);\n return output.split(\"\\n\").filter(Boolean);\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function listUntrackedFiles(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<string[]> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n const output = await git.raw([\n \"ls-files\",\n \"--others\",\n \"--exclude-standard\",\n ]);\n return output.split(\"\\n\").filter(Boolean);\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function listAllFiles(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<string[]> {\n const [tracked, untracked] = await Promise.all([\n listFiles(baseDir, options),\n listUntrackedFiles(baseDir, options),\n ]);\n return [...tracked, ...untracked];\n}\n\nexport async function hasTrackedFiles(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<boolean> {\n const files = await listFiles(baseDir, options);\n return files.length > 0;\n}\n\nexport async function getStagedDiff(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<string> {\n const manager = getGitOperationManager();\n return manager.executeRead(baseDir, (git) => git.diff([\"--cached\", \"HEAD\"]), {\n signal: options?.abortSignal,\n });\n}\n\nexport async function getUnstagedDiff(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<string> {\n const manager = getGitOperationManager();\n return manager.executeRead(baseDir, (git) => git.diff(), {\n signal: options?.abortSignal,\n });\n}\n\nexport async function isCommitOnRemote(\n baseDir: string,\n commit: string,\n options?: CreateGitClientOptions,\n): Promise<boolean> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n try {\n const output = await git.branch([\"-r\", \"--contains\", commit]);\n return output.all.length > 0;\n } catch {\n return false;\n }\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function resolveGitDir(\n baseDir: string,\n options?: CreateGitClientOptions,\n): Promise<string> {\n const manager = getGitOperationManager();\n return manager.executeRead(\n baseDir,\n async (git) => {\n const gitDir = await git.revparse([\"--git-dir\"]);\n return path.resolve(baseDir, gitDir);\n },\n { signal: options?.abortSignal },\n );\n}\n\nexport async function addToLocalExclude(\n baseDir: string,\n pattern: string,\n options?: CreateGitClientOptions,\n): Promise<void> {\n const gitDir = await resolveGitDir(baseDir, options);\n const excludePath = path.join(gitDir, \"info\", \"exclude\");\n\n let content = \"\";\n try {\n content = await fs.readFile(excludePath, \"utf-8\");\n } catch {}\n\n const normalizedPattern = pattern.startsWith(\"/\") ? pattern : `/${pattern}`;\n const patternWithoutSlash = pattern.replace(/^\\//, \"\");\n if (\n content.includes(normalizedPattern) ||\n content.includes(patternWithoutSlash)\n ) {\n return;\n }\n\n const infoDir = path.join(gitDir, \"info\");\n await fs.mkdir(infoDir, { recursive: true });\n\n const newContent = content.trimEnd()\n ? `${content.trimEnd()}\\n${pattern}\\n`\n : `${pattern}\\n`;\n await fs.writeFile(excludePath, newContent);\n}\n","const cache = new WeakMap<String, string[]>();\n\nexport function pathspec(...paths: string[]) {\n const key = new String(paths);\n cache.set(key, paths);\n\n return key as string;\n}\n\nexport function isPathSpec(path: string | unknown): path is string {\n return path instanceof String && cache.has(path);\n}\n\nexport function toPaths(pathSpec: string): string[] {\n return cache.get(pathSpec) || [];\n}\n","import type { SimpleGitTask } from '../types';\n\n/**\n * The `GitError` is thrown when the underlying `git` process throws a\n * fatal exception (eg an `ENOENT` exception when attempting to use a\n * non-writable directory as the root for your repo), and acts as the\n * base class for more specific errors thrown by the parsing of the\n * git response or errors in the configuration of the task about to\n * be run.\n *\n * When an exception is thrown, pending tasks in the same instance will\n * not be executed. The recommended way to run a series of tasks that\n * can independently fail without needing to prevent future tasks from\n * running is to catch them individually:\n *\n * ```typescript\n import { gitP, SimpleGit, GitError, PullResult } from 'simple-git';\n\n function catchTask (e: GitError) {\n return e.\n }\n\n const git = gitP(repoWorkingDir);\n const pulled: PullResult | GitError = await git.pull().catch(catchTask);\n const pushed: string | GitError = await git.pushTags().catch(catchTask);\n ```\n */\nexport class GitError extends Error {\n constructor(\n public task?: SimpleGitTask<any>,\n message?: string\n ) {\n super(message);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { GitError } from './git-error';\n\n/**\n * The `GitResponseError` is the wrapper for a parsed response that is treated as\n * a fatal error, for example attempting a `merge` can leave the repo in a corrupted\n * state when there are conflicts so the task will reject rather than resolve.\n *\n * For example, catching the merge conflict exception:\n *\n * ```typescript\n import { gitP, SimpleGit, GitResponseError, MergeSummary } from 'simple-git';\n\n const git = gitP(repoRoot);\n const mergeOptions: string[] = ['--no-ff', 'other-branch'];\n const mergeSummary: MergeSummary = await git.merge(mergeOptions)\n .catch((e: GitResponseError<MergeSummary>) => e.git);\n\n if (mergeSummary.failed) {\n // deal with the error\n }\n ```\n */\nexport class GitResponseError<T = any> extends GitError {\n constructor(\n /**\n * `.git` access the parsed response that is treated as being an error\n */\n public readonly git: T,\n message?: string\n ) {\n super(undefined, message || String(git));\n }\n}\n","import { GitError } from './git-error';\n\n/**\n * The `TaskConfigurationError` is thrown when a command was incorrectly\n * configured. An error of this kind means that no attempt was made to\n * run your command through the underlying `git` binary.\n *\n * Check the `.message` property for more detail on why your configuration\n * resulted in an error.\n */\nexport class TaskConfigurationError extends GitError {\n constructor(message?: string) {\n super(undefined, message);\n }\n}\n","import { Buffer } from 'node:buffer';\nimport { exists, FOLDER } from '@kwsites/file-exists';\nimport type { Maybe } from '../types';\nimport { filterHasLength } from './argument-filters';\n\ntype Callable = (...args: unknown[]) => unknown;\n\nexport const NULL = '\\0';\n\nexport const NOOP: Callable = () => {};\n\n/**\n * Returns either the source argument when it is a `Function`, or the default\n * `NOOP` function constant\n */\nexport function asFunction<T>(source: T | unknown): Callable {\n if (typeof source !== 'function') {\n return NOOP;\n }\n return source as Callable;\n}\n\n/**\n * Determines whether the supplied argument is both a function, and is not\n * the `NOOP` function.\n */\nexport function isUserFunction<T extends Function>(source: T | unknown): source is T {\n return typeof source === 'function' && source !== NOOP;\n}\n\nexport function splitOn(input: string, char: string): [string, string] {\n const index = input.indexOf(char);\n if (index <= 0) {\n return [input, ''];\n }\n\n return [input.substr(0, index), input.substr(index + 1)];\n}\n\nexport function first<T extends unknown[]>(input: T, offset?: number): Maybe<T[number]>;\nexport function first<T extends IArguments>(input: T, offset?: number): Maybe<unknown>;\nexport function first(input: unknown[] | IArguments, offset = 0): Maybe<unknown> {\n return isArrayLike(input) && input.length > offset ? input[offset] : undefined;\n}\n\nexport function last<T extends unknown[]>(input: T, offset?: number): Maybe<T[number]>;\nexport function last<T extends IArguments>(input: T, offset?: number): Maybe<unknown>;\nexport function last<T>(input: T, offset?: number): Maybe<unknown>;\nexport function last(input: unknown, offset = 0) {\n if (isArrayLike(input) && input.length > offset) {\n return input[input.length - 1 - offset];\n }\n}\n\ntype ArrayLike<T> = T[] | IArguments | { [index: number]: T; length: number };\n\nfunction isArrayLike(input: unknown): input is ArrayLike<unknown> {\n return filterHasLength(input);\n}\n\nexport function toLinesWithContent(input = '', trimmed = true, separator = '\\n'): string[] {\n return input.split(separator).reduce((output, line) => {\n const lineContent = trimmed ? line.trim() : line;\n if (lineContent) {\n output.push(lineContent);\n }\n return output;\n }, [] as string[]);\n}\n\ntype LineWithContentCallback<T = void> = (line: string) => T;\n\nexport function forEachLineWithContent<T>(\n input: string,\n callback: LineWithContentCallback<T>\n): T[] {\n return toLinesWithContent(input, true).map((line) => callback(line));\n}\n\nexport function folderExists(path: string): boolean {\n return exists(path, FOLDER);\n}\n\n/**\n * Adds `item` into the `target` `Array` or `Set` when it is not already present and returns the `item`.\n */\nexport function append<T>(target: T[] | Set<T>, item: T): typeof item {\n if (Array.isArray(target)) {\n if (!target.includes(item)) {\n target.push(item);\n }\n } else {\n target.add(item);\n }\n return item;\n}\n\n/**\n * Adds `item` into the `target` `Array` when it is not already present and returns the `target`.\n */\nexport function including<T>(target: T[], item: T): typeof target {\n if (Array.isArray(target) && !target.includes(item)) {\n target.push(item);\n }\n\n return target;\n}\n\nexport function remove<T>(target: Set<T> | T[], item: T): T {\n if (Array.isArray(target)) {\n const index = target.indexOf(item);\n if (index >= 0) {\n target.splice(index, 1);\n }\n } else {\n target.delete(item);\n }\n return item;\n}\n\nexport const objectToString = Object.prototype.toString.call.bind(Object.prototype.toString) as (\n input: unknown\n) => string;\n\nexport function asArray<T>(source: T | T[]): T[] {\n return Array.isArray(source) ? source : [source];\n}\n\nexport function asCamelCase(str: string) {\n return str.replace(/[\\s-]+(.)/g, (_all, chr) => {\n return chr.toUpperCase();\n });\n}\n\nexport function asStringArray<T>(source: T | T[]): string[] {\n return asArray(source).map((item) => {\n return item instanceof String ? (item as string) : String(item);\n });\n}\n\nexport function asNumber(source: string | null | undefined, onNaN = 0) {\n if (source == null) {\n return onNaN;\n }\n\n const num = parseInt(source, 10);\n return Number.isNaN(num) ? onNaN : num;\n}\n\nexport function prefixedArray<T>(input: T[], prefix: T): T[] {\n const output: T[] = [];\n for (let i = 0, max = input.length; i < max; i++) {\n output.push(prefix, input[i]);\n }\n return output;\n}\n\nexport function bufferToString(input: Buffer | Buffer[]): string {\n return (Array.isArray(input) ? Buffer.concat(input) : input).toString('utf-8');\n}\n\n/**\n * Get a new object from a source object with only the listed properties.\n */\nexport function pick<T, K extends keyof T>(source: T, properties: readonly K[]) {\n const out: Partial<Pick<T, K>> = {};\n\n properties.forEach((key) => {\n if (source[key] !== undefined) {\n out[key] = source[key];\n }\n });\n\n return out;\n}\n\nexport function delay(duration = 0): Promise<void> {\n return new Promise((done) => setTimeout(done, duration));\n}\n\nexport function orVoid<T>(input: T | false) {\n if (input === false) {\n return undefined;\n }\n return input;\n}\n","import { isPathSpec } from '../args/pathspec';\nimport type { Maybe, Options, Primitives } from '../types';\nimport { objectToString } from './util';\n\nexport type ArgumentFilterPredicate<T> = (input: T | unknown) => input is T;\n\nexport function filterType<T, K>(\n input: K,\n filter: ArgumentFilterPredicate<T>\n): K extends T ? T : undefined;\nexport function filterType<T, K>(input: K, filter: ArgumentFilterPredicate<T>, def: T): T;\nexport function filterType<T, K>(input: K, filter: ArgumentFilterPredicate<T>, def?: T): Maybe<T> {\n if (filter(input)) {\n return input;\n }\n return arguments.length > 2 ? def : undefined;\n}\n\nexport const filterArray: ArgumentFilterPredicate<Array<unknown>> = (\n input\n): input is Array<unknown> => {\n return Array.isArray(input);\n};\n\nexport function filterPrimitives(\n input: unknown,\n omit?: Array<'boolean' | 'string' | 'number'>\n): input is Primitives {\n const type = isPathSpec(input) ? 'string' : typeof input;\n\n return (\n /number|string|boolean/.test(type) &&\n (!omit || !omit.includes(type as 'boolean' | 'string' | 'number'))\n );\n}\n\nexport const filterNumber: ArgumentFilterPredicate<number> = (input: unknown): input is number => {\n return typeof input === 'number';\n};\n\nexport const filterString: ArgumentFilterPredicate<string> = (input: unknown): input is string => {\n return typeof input === 'string';\n};\n\nexport const filterStringOrStringArray: ArgumentFilterPredicate<string | string[]> = (\n input\n): input is string | string[] => {\n return filterString(input) || (Array.isArray(input) && input.every(filterString));\n};\n\nexport function filterPlainObject<T extends Options>(input: T | unknown): input is T;\nexport function filterPlainObject<T extends Record<string, unknown>>(\n input: T | unknown\n): input is T {\n return !!input && objectToString(input) === '[object Object]';\n}\n\nexport function filterFunction(input: unknown): input is (...args: unknown[]) => unknown {\n return typeof input === 'function';\n}\n\nexport const filterHasLength: ArgumentFilterPredicate<{ length: number }> = (\n input\n): input is { length: number } => {\n if (input == null || 'number|boolean|function'.includes(typeof input)) {\n return false;\n }\n\n return typeof (input as { length?: number }).length === 'number';\n};\n","/**\n * Known process exit codes used by the task parsers to determine whether an error\n * was one they can automatically handle\n */\nexport enum ExitCodes {\n SUCCESS,\n ERROR,\n NOT_FOUND = -2,\n UNCLEAN = 128,\n}\n","import { TaskResponseFormat } from '../types';\n\nexport class GitOutputStreams<T extends TaskResponseFormat = Buffer> {\n constructor(\n public readonly stdOut: T,\n public readonly stdErr: T\n ) {}\n\n asStrings(): GitOutputStreams<string> {\n return new GitOutputStreams(this.stdOut.toString('utf8'), this.stdErr.toString('utf8'));\n }\n}\n","function useMatchesDefault() {\n throw new Error(`LineParser:useMatches not implemented`);\n}\n\nexport class LineParser<T> {\n protected matches: string[] = [];\n protected useMatches: (target: T, match: string[]) => boolean | void = useMatchesDefault;\n\n private _regExp: RegExp[];\n\n constructor(\n regExp: RegExp | RegExp[],\n useMatches?: (target: T, match: string[]) => boolean | void\n ) {\n this._regExp = Array.isArray(regExp) ? regExp : [regExp];\n if (useMatches) {\n this.useMatches = useMatches;\n }\n }\n\n parse = (line: (offset: number) => string | undefined, target: T): boolean => {\n this.resetMatches();\n\n if (!this._regExp.every((reg, index) => this.addMatch(reg, index, line(index)))) {\n return false;\n }\n\n return this.useMatches(target, this.prepareMatches()) !== false;\n };\n\n protected resetMatches() {\n this.matches.length = 0;\n }\n\n protected prepareMatches() {\n return this.matches;\n }\n\n protected addMatch(reg: RegExp, index: number, line?: string) {\n const matched = line && reg.exec(line);\n if (matched) {\n this.pushMatch(index, matched);\n }\n\n return !!matched;\n }\n\n protected pushMatch(_index: number, matched: string[]) {\n this.matches.push(...matched.slice(1));\n }\n}\n\nexport class RemoteLineParser<T> extends LineParser<T> {\n protected addMatch(reg: RegExp, index: number, line?: string): boolean {\n return /^remote:\\s/.test(String(line)) && super.addMatch(reg, index, line);\n }\n\n protected pushMatch(index: number, matched: string[]) {\n if (index > 0 || matched.length > 1) {\n super.pushMatch(index, matched);\n }\n }\n}\n","import { SimpleGitOptions } from '../types';\n\nconst defaultOptions: Omit<SimpleGitOptions, 'baseDir'> = {\n binary: 'git',\n maxConcurrentProcesses: 5,\n config: [],\n trimmed: false,\n};\n\nexport function createInstanceConfig(\n ...options: Array<Partial<SimpleGitOptions> | undefined>\n): SimpleGitOptions {\n const baseDir = process.cwd();\n const config: SimpleGitOptions = Object.assign(\n { baseDir, ...defaultOptions },\n ...options.filter((o) => typeof o === 'object' && o)\n );\n\n config.baseDir = config.baseDir || baseDir;\n config.trimmed = config.trimmed === true;\n\n return config;\n}\n","import {\n filterArray,\n filterFunction,\n filterPlainObject,\n filterPrimitives,\n filterType,\n} from './argument-filters';\nimport { asFunction, asStringArray, isUserFunction, last } from './util';\nimport { Maybe, Options } from '../types';\nimport { isPathSpec } from '../args/pathspec';\n\nexport function appendTaskOptions<T extends Options = Options>(\n options: Maybe<T>,\n commands: string[] = []\n): string[] {\n if (!filterPlainObject<Options>(options)) {\n return commands;\n }\n\n return Object.keys(options).reduce((commands: string[], key: string) => {\n const value = options[key];\n\n if (isPathSpec(value)) {\n commands.push(value);\n } else if (filterPrimitives(value, ['boolean'])) {\n commands.push(key + '=' + value);\n } else if (Array.isArray(value)) {\n for (const v of value) {\n if (!filterPrimitives(v, ['string', 'number'])) {\n commands.push(key + '=' + v);\n }\n }\n } else {\n commands.push(key);\n }\n\n return commands;\n }, commands);\n}\n\nexport function getTrailingOptions(\n args: IArguments,\n initialPrimitive = 0,\n objectOnly = false\n): string[] {\n const command: string[] = [];\n\n for (let i = 0, max = initialPrimitive < 0 ? args.length : initialPrimitive; i < max; i++) {\n if ('string|number'.includes(typeof args[i])) {\n command.push(String(args[i]));\n }\n }\n\n appendTaskOptions(trailingOptionsArgument(args), command);\n if (!objectOnly) {\n command.push(...trailingArrayArgument(args));\n }\n\n return command;\n}\n\nfunction trailingArrayArgument(args: IArguments) {\n const hasTrailingCallback = typeof last(args) === 'function';\n return asStringArray(filterType(last(args, hasTrailingCallback ? 1 : 0), filterArray, []));\n}\n\n/**\n * Given any number of arguments, returns the trailing options argument, ignoring a trailing function argument\n * if there is one. When not found, the return value is null.\n */\nexport function trailingOptionsArgument(args: IArguments): Maybe<Options> {\n const hasTrailingCallback = filterFunction(last(args));\n return filterType(last(args, hasTrailingCallback ? 1 : 0), filterPlainObject);\n}\n\n/**\n * Returns either the source argument when it is a `Function`, or the default\n * `NOOP` function constant\n */\nexport function trailingFunctionArgument(\n args: unknown[] | IArguments | unknown,\n includeNoop = true\n): Maybe<(...args: unknown[]) => unknown> {\n const callback = asFunction(last(args));\n return includeNoop || isUserFunction(callback) ? callback : undefined;\n}\n","import type { MaybeArray, TaskParser, TaskResponseFormat } from '../types';\nimport { GitOutputStreams } from './git-output-streams';\nimport { LineParser } from './line-parser';\nimport { asArray, toLinesWithContent } from './util';\n\nexport function callTaskParser<INPUT extends TaskResponseFormat, RESPONSE>(\n parser: TaskParser<INPUT, RESPONSE>,\n streams: GitOutputStreams<INPUT>\n) {\n return parser(streams.stdOut, streams.stdErr);\n}\n\nexport function parseStringResponse<T>(\n result: T,\n parsers: LineParser<T>[],\n texts: MaybeArray<string>,\n trim = true\n): T {\n asArray(texts).forEach((text) => {\n for (let lines = toLinesWithContent(text, trim), i = 0, max = lines.length; i < max; i++) {\n const line = (offset = 0) => {\n if (i + offset >= max) {\n return;\n }\n return lines[i + offset];\n };\n\n parsers.some(({ parse }) => parse(line, result));\n }\n });\n\n return result;\n}\n","export * from './argument-filters';\nexport * from './exit-codes';\nexport * from './git-output-streams';\nexport * from './line-parser';\nexport * from './simple-git-options';\nexport * from './task-options';\nexport * from './task-parser';\nexport * from './util';\n","import { ExitCodes } from '../utils';\nimport { Maybe, StringTask } from '../types';\n\nexport enum CheckRepoActions {\n BARE = 'bare',\n IN_TREE = 'tree',\n IS_REPO_ROOT = 'root',\n}\n\nconst onError: StringTask<boolean>['onError'] = ({ exitCode }, error, done, fail) => {\n if (exitCode === ExitCodes.UNCLEAN && isNotRepoMessage(error)) {\n return done(Buffer.from('false'));\n }\n\n fail(error);\n};\n\nconst parser: StringTask<boolean>['parser'] = (text) => {\n return text.trim() === 'true';\n};\n\nexport function checkIsRepoTask(action: Maybe<CheckRepoActions>): StringTask<boolean> {\n switch (action) {\n case CheckRepoActions.BARE:\n return checkIsBareRepoTask();\n case CheckRepoActions.IS_REPO_ROOT:\n return checkIsRepoRootTask();\n }\n\n const commands = ['rev-parse', '--is-inside-work-tree'];\n\n return {\n commands,\n format: 'utf-8',\n onError,\n parser,\n };\n}\n\nexport function checkIsRepoRootTask(): StringTask<boolean> {\n const commands = ['rev-parse', '--git-dir'];\n\n return {\n commands,\n format: 'utf-8',\n onError,\n parser(path) {\n return /^\\.(git)?$/.test(path.trim());\n },\n };\n}\n\nexport function checkIsBareRepoTask(): StringTask<boolean> {\n const commands = ['rev-parse', '--is-bare-repository'];\n\n return {\n commands,\n format: 'utf-8',\n onError,\n parser,\n };\n}\n\nfunction isNotRepoMessage(error: Error): boolean {\n return /(Not a git repository|Kein Git-Repository)/i.test(String(error));\n}\n","import { CleanSummary } from '../../../typings';\nimport { toLinesWithContent } from '../utils';\n\nexport class CleanResponse implements CleanSummary {\n public paths: string[] = [];\n public files: string[] = [];\n public folders: string[] = [];\n\n constructor(public readonly dryRun: boolean) {}\n}\n\nconst removalRegexp = /^[a-z]+\\s*/i;\nconst dryRunRemovalRegexp = /^[a-z]+\\s+[a-z]+\\s*/i;\nconst isFolderRegexp = /\\/$/;\n\nexport function cleanSummaryParser(dryRun: boolean, text: string): CleanSummary {\n const summary = new CleanResponse(dryRun);\n const regexp = dryRun ? dryRunRemovalRegexp : removalRegexp;\n\n toLinesWithContent(text).forEach((line) => {\n const removed = line.replace(regexp, '');\n\n summary.paths.push(removed);\n (isFolderRegexp.test(removed) ? summary.folders : summary.files).push(removed);\n });\n\n return summary;\n}\n","import { TaskConfigurationError } from '../errors/task-configuration-error';\nimport type { BufferTask, EmptyTaskParser, SimpleGitTask, StringTask } from '../types';\n\nexport const EMPTY_COMMANDS: [] = [];\n\nexport type EmptyTask = {\n commands: typeof EMPTY_COMMANDS;\n format: 'empty';\n parser: EmptyTaskParser;\n onError?: undefined;\n};\n\nexport function adhocExecTask(parser: EmptyTaskParser): EmptyTask {\n return {\n commands: EMPTY_COMMANDS,\n format: 'empty',\n parser,\n };\n}\n\nexport function configurationErrorTask(error: Error | string): EmptyTask {\n return {\n commands: EMPTY_COMMANDS,\n format: 'empty',\n parser() {\n throw typeof error === 'string' ? new TaskConfigurationError(error) : error;\n },\n };\n}\n\nexport function straightThroughStringTask(commands: string[], trimmed = false): StringTask<string> {\n return {\n commands,\n format: 'utf-8',\n parser(text) {\n return trimmed ? String(text).trim() : text;\n },\n };\n}\n\nexport function straightThroughBufferTask(commands: string[]): BufferTask<Buffer> {\n return {\n commands,\n format: 'buffer',\n parser(buffer) {\n return buffer;\n },\n };\n}\n\nexport function isBufferTask<R>(task: SimpleGitTask<R>): task is BufferTask<R> {\n return task.format === 'buffer';\n}\n\nexport function isEmptyTask<R>(task: SimpleGitTask<R>): task is EmptyTask {\n return task.format === 'empty' || !task.commands.length;\n}\n","import { CleanSummary } from '../../../typings';\nimport { cleanSummaryParser } from '../responses/CleanSummary';\nimport { Maybe, StringTask } from '../types';\nimport { asStringArray } from '../utils';\nimport { configurationErrorTask } from './task';\n\nexport const CONFIG_ERROR_INTERACTIVE_MODE = 'Git clean interactive mode is not supported';\nexport const CONFIG_ERROR_MODE_REQUIRED = 'Git clean mode parameter (\"n\" or \"f\") is required';\nexport const CONFIG_ERROR_UNKNOWN_OPTION = 'Git clean unknown option found in: ';\n\n/**\n * All supported option switches available for use in a `git.clean` operation\n */\nexport enum CleanOptions {\n DRY_RUN = 'n',\n FORCE = 'f',\n IGNORED_INCLUDED = 'x',\n IGNORED_ONLY = 'X',\n EXCLUDING = 'e',\n QUIET = 'q',\n RECURSIVE = 'd',\n}\n\n/**\n * The two modes `git.clean` can run in - one of these must be supplied in order\n * for the command to not throw a `TaskConfigurationError`\n */\nexport type CleanMode = CleanOptions.FORCE | CleanOptions.DRY_RUN;\n\nconst CleanOptionValues: Set<string> = new Set([\n 'i',\n ...asStringArray(Object.values(CleanOptions as any)),\n]);\n\nexport function cleanWithOptionsTask(mode: CleanMode | string, customArgs: string[]) {\n const { cleanMode, options, valid } = getCleanOptions(mode);\n\n if (!cleanMode) {\n return configurationErrorTask(CONFIG_ERROR_MODE_REQUIRED);\n }\n\n if (!valid.options) {\n return configurationErrorTask(CONFIG_ERROR_UNKNOWN_OPTION + JSON.stringify(mode));\n }\n\n options.push(...customArgs);\n\n if (options.some(isInteractiveMode)) {\n return configurationErrorTask(CONFIG_ERROR_INTERACTIVE_MODE);\n }\n\n return cleanTask(cleanMode, options);\n}\n\nexport function cleanTask(mode: CleanMode, customArgs: string[]): StringTask<CleanSummary> {\n const commands: string[] = ['clean', `-${mode}`, ...customArgs];\n\n return {\n commands,\n format: 'utf-8',\n parser(text: string): CleanSummary {\n return cleanSummaryParser(mode === CleanOptions.DRY_RUN, text);\n },\n };\n}\n\nexport function isCleanOptionsArray(input: string[]): input is CleanOptions[] {\n return Array.isArray(input) && input.every((test) => CleanOptionValues.has(test));\n}\n\nfunction getCleanOptions(input: string) {\n let cleanMode: Maybe<CleanMode>;\n let options: string[] = [];\n let valid = { cleanMode: false, options: true };\n\n input\n .replace(/[^a-z]i/g, '')\n .split('')\n .forEach((char) => {\n if (isCleanMode(char)) {\n cleanMode = char;\n valid.cleanMode = true;\n } else {\n valid.options = valid.options && isKnownOption((options[options.length] = `-${char}`));\n }\n });\n\n return {\n cleanMode,\n options,\n valid,\n };\n}\n\nfunction isCleanMode(cleanMode?: string): cleanMode is CleanMode {\n return cleanMode === CleanOptions.FORCE || cleanMode === CleanOptions.DRY_RUN;\n}\n\nfunction isKnownOption(option: string): boolean {\n return /^-[a-z]$/i.test(option) && CleanOptionValues.has(option.charAt(1));\n}\n\nfunction isInteractiveMode(option: string): boolean {\n if (/^-[^\\-]/.test(option)) {\n return option.indexOf('i') > 0;\n }\n\n return option === '--interactive';\n}\n","import { ConfigGetResult, ConfigListSummary, ConfigValues } from '../../../typings';\nimport { last, splitOn } from '../utils';\n\nexport class ConfigList implements ConfigListSummary {\n public files: string[] = [];\n public values: { [fileName: string]: ConfigValues } = Object.create(null);\n\n private _all: ConfigValues | undefined;\n\n public get all(): ConfigValues {\n if (!this._all) {\n this._all = this.files.reduce((all: ConfigValues, file: string) => {\n return Object.assign(all, this.values[file]);\n }, {});\n }\n\n return this._all;\n }\n\n public addFile(file: string): ConfigValues {\n if (!(file in this.values)) {\n const latest = last(this.files);\n this.values[file] = latest ? Object.create(this.values[latest]) : {};\n\n this.files.push(file);\n }\n\n return this.values[file];\n }\n\n public addValue(file: string, key: string, value: string) {\n const values = this.addFile(file);\n\n if (!Object.hasOwn(values, key)) {\n values[key] = value;\n } else if (Array.isArray(values[key])) {\n (values[key] as string[]).push(value);\n } else {\n values[key] = [values[key] as string, value];\n }\n\n this._all = undefined;\n }\n}\n\nexport function configListParser(text: string): ConfigList {\n const config = new ConfigList();\n\n for (const item of configParser(text)) {\n config.addValue(item.file, String(item.key), item.value);\n }\n\n return config;\n}\n\nexport function configGetParser(text: string, key: string): ConfigGetResult {\n let value: string | null = null;\n const values: string[] = [];\n const scopes: Map<string, string[]> = new Map();\n\n for (const item of configParser(text, key)) {\n if (item.key !== key) {\n continue;\n }\n\n values.push((value = item.value));\n\n if (!scopes.has(item.file)) {\n scopes.set(item.file, []);\n }\n\n scopes.get(item.file)!.push(value);\n }\n\n return {\n key,\n paths: Array.from(scopes.keys()),\n scopes,\n value,\n values,\n };\n}\n\nfunction configFilePath(filePath: string): string {\n return filePath.replace(/^(file):/, '');\n}\n\nfunction* configParser(text: string, requestedKey: string | null = null) {\n const lines = text.split('\\0');\n\n for (let i = 0, max = lines.length - 1; i < max; ) {\n const file = configFilePath(lines[i++]);\n\n let value = lines[i++];\n let key = requestedKey;\n\n if (value.includes('\\n')) {\n const line = splitOn(value, '\\n');\n key = line[0];\n value = line[1];\n }\n\n yield { file, key, value };\n }\n}\n","import type { ConfigGetResult, ConfigListSummary, SimpleGit } from '../../../typings';\nimport { configGetParser, configListParser } from '../responses/ConfigList';\nimport type { SimpleGitApi } from '../simple-git-api';\nimport type { StringTask } from '../types';\nimport { trailingFunctionArgument } from '../utils';\n\nexport enum GitConfigScope {\n system = 'system',\n global = 'global',\n local = 'local',\n worktree = 'worktree',\n}\n\nfunction asConfigScope<T extends GitConfigScope | undefined>(\n scope: GitConfigScope | unknown,\n fallback: T\n): GitConfigScope | T {\n if (typeof scope === 'string' && Object.hasOwn(GitConfigScope, scope)) {\n return scope as GitConfigScope;\n }\n return fallback;\n}\n\nfunction addConfigTask(\n key: string,\n value: string,\n append: boolean,\n scope: GitConfigScope\n): StringTask<string> {\n const commands: string[] = ['config', `--${scope}`];\n\n if (append) {\n commands.push('--add');\n }\n\n commands.push(key, value);\n\n return {\n commands,\n format: 'utf-8',\n parser(text: string): string {\n return text;\n },\n };\n}\n\nfunction getConfigTask(key: string, scope?: GitConfigScope): StringTask<ConfigGetResult> {\n const commands: string[] = ['config', '--null', '--show-origin', '--get-all', key];\n\n if (scope) {\n commands.splice(1, 0, `--${scope}`);\n }\n\n return {\n commands,\n format: 'utf-8',\n parser(text) {\n return configGetParser(text, key);\n },\n };\n}\n\nfunction listConfigTask(scope?: GitConfigScope): StringTask<ConfigListSummary> {\n const commands = ['config', '--list', '--show-origin', '--null'];\n\n if (scope) {\n commands.push(`--${scope}`);\n }\n\n return {\n commands,\n format: 'utf-8',\n parser(text: string) {\n return configListParser(text);\n },\n };\n}\n\nexport default function (): Pick<SimpleGit, 'addConfig' | 'getConfig' | 'listConfig'> {\n return {\n addConfig(this: SimpleGitApi, key: string, value: string, ...rest: unknown[]) {\n return this._runTask(\n addConfigTask(\n key,\n value,\n rest[0] === true,\n asConfigScope(rest[1], GitConfigScope.local)\n ),\n trailingFunctionArgument(arguments)\n );\n },\n\n getConfig(this: SimpleGitApi, key: string, scope?: GitConfigScope) {\n return this._runTask(\n getConfigTask(key, asConfigScope(scope, undefined)),\n trailingFunctionArgument(arguments)\n );\n },\n\n listConfig(this: SimpleGitApi, ...rest: unknown[]) {\n return this._runTask(\n listConfigTask(asConfigScope(rest[0], undefined)),\n trailingFunctionArgument(arguments)\n );\n },\n };\n}\n","export enum DiffNameStatus {\n ADDED = 'A',\n COPIED = 'C',\n DELETED = 'D',\n MODIFIED = 'M',\n RENAMED = 'R',\n CHANGED = 'T',\n UNMERGED = 'U',\n UNKNOWN = 'X',\n BROKEN = 'B',\n}\n\nconst diffNameStatus = new Set(Object.values(DiffNameStatus));\n\nexport function isDiffNameStatus(input: string): input is DiffNameStatus {\n return diffNameStatus.has(input as DiffNameStatus);\n}\n","import { GrepResult, SimpleGit } from '../../../typings';\nimport { SimpleGitApi } from '../simple-git-api';\nimport {\n asNumber,\n forEachLineWithContent,\n getTrailingOptions,\n NULL,\n prefixedArray,\n trailingFunctionArgument,\n} from '../utils';\n\nimport { configurationErrorTask } from './task';\n\nconst disallowedOptions = ['-h'];\n\nconst Query = Symbol('grepQuery');\n\nexport interface GitGrepQuery extends Iterable<string> {\n /** Adds one or more terms to be grouped as an \"and\" to any other terms */\n and(...and: string[]): this;\n\n /** Adds one or more search terms - git.grep will \"or\" this to other terms */\n param(...param: string[]): this;\n}\n\nclass GrepQuery implements GitGrepQuery {\n private [Query]: string[] = [];\n\n *[Symbol.iterator]() {\n for (const query of this[Query]) {\n yield query;\n }\n }\n\n and(...and: string[]) {\n and.length && this[Query].push('--and', '(', ...prefixedArray(and, '-e'), ')');\n return this;\n }\n\n param(...param: string[]) {\n this[Query].push(...prefixedArray(param, '-e'));\n return this;\n }\n}\n\n/**\n * Creates a new builder for a `git.grep` query with optional params\n */\nexport function grepQueryBuilder(...params: string[]): GitGrepQuery {\n return new GrepQuery().param(...params);\n}\n\nfunction parseGrep(grep: string): GrepResult {\n const paths: GrepResult['paths'] = new Set<string>();\n const results: GrepResult['results'] = {};\n\n forEachLineWithContent(grep, (input) => {\n const [path, line, preview] = input.split(NULL);\n paths.add(path);\n (results[path] = results[path] || []).push({\n line: asNumber(line),\n path,\n preview,\n });\n });\n\n return {\n paths,\n results,\n };\n}\n\nexport default function (): Pick<SimpleGit, 'grep'> {\n return {\n grep(this: SimpleGitApi, searchTerm: string | GitGrepQuery) {\n const then = trailingFunctionArgument(arguments);\n const options = getTrailingOptions(arguments);\n\n for (const option of disallowedOptions) {\n if (options.includes(option)) {\n return this._runTask(\n configurationErrorTask(`git.grep: use of \"${option}\" is not supported.`),\n then\n );\n }\n }\n\n if (typeof searchTerm === 'string') {\n searchTerm = grepQueryBuilder().param(searchTerm);\n }\n\n const commands = ['grep', '--null', '-n', '--full-name', ...options, ...searchTerm];\n\n return this._runTask(\n {\n commands,\n format: 'utf-8',\n parser(stdOut) {\n return parseGrep(stdOut);\n },\n },\n then\n );\n },\n };\n}\n","import type { Maybe, OptionFlags, Options } from '../types';\nimport { asStringArray } from '../utils';\nimport { straightThroughStringTask } from './task';\n\nexport enum ResetMode {\n MIXED = 'mixed',\n SOFT = 'soft',\n HARD = 'hard',\n MERGE = 'merge',\n KEEP = 'keep',\n}\n\nconst validResetModes = asStringArray(Object.values(ResetMode));\n\nexport type ResetOptions = Options &\n OptionFlags<'-q' | '--quiet' | '--no-quiet' | '--pathspec-from-nul'> &\n OptionFlags<'--pathspec-from-file', string>;\n\nexport function resetTask(mode: Maybe<ResetMode>, customArgs: string[]) {\n const commands: string[] = ['reset'];\n if (isValidResetMode(mode)) {\n commands.push(`--${mode}`);\n }\n commands.push(...customArgs);\n\n return straightThroughStringTask(commands);\n}\n\nexport function getResetMode(mode: ResetMode | unknown): Maybe<ResetMode> {\n if (isValidResetMode(mode)) {\n return mode;\n }\n\n switch (typeof mode) {\n case 'string':\n case 'undefined':\n return ResetMode.SOFT;\n }\n\n return;\n}\n\nfunction isValidResetMode(mode: ResetMode | unknown): mode is ResetMode {\n return typeof mode === 'string' && validResetModes.includes(mode);\n}\n","import debug, { Debugger } from 'debug';\nimport {\n append,\n filterHasLength,\n filterString,\n filterType,\n NOOP,\n objectToString,\n remove,\n} from './utils';\nimport { Maybe } from './types';\n\ndebug.formatters.L = (value: any) => String(filterHasLength(value) ? value.length : '-');\ndebug.formatters.B = (value: Buffer) => {\n if (Buffer.isBuffer(value)) {\n return value.toString('utf8');\n }\n return objectToString(value);\n};\n\ntype OutputLoggingHandler = (message: string, ...args: any[]) => void;\n\nfunction createLog() {\n return debug('simple-git');\n}\n\nexport interface OutputLogger extends OutputLoggingHandler {\n readonly label: string;\n\n info: OutputLoggingHandler;\n step(nextStep?: string): OutputLogger;\n sibling(name: string): OutputLogger;\n}\n\nfunction prefixedLogger(\n to: Debugger,\n prefix: string,\n forward?: OutputLoggingHandler\n): OutputLoggingHandler {\n if (!prefix || !String(prefix).replace(/\\s*/, '')) {\n return !forward\n ? to\n : (message, ...args) => {\n to(message, ...args);\n forward(message, ...args);\n };\n }\n\n return (message, ...args) => {\n to(`%s ${message}`, prefix, ...args);\n if (forward) {\n forward(message, ...args);\n }\n };\n}\n\nfunction childLoggerName(\n name: Maybe<string>,\n childDebugger: Maybe<Debugger>,\n { namespace: parentNamespace }: Debugger\n): string {\n if (typeof name === 'string') {\n return name;\n }\n const childNamespace = (childDebugger && childDebugger.namespace) || '';\n\n if (childNamespace.startsWith(parentNamespace)) {\n return childNamespace.substr(parentNamespace.length + 1);\n }\n\n return childNamespace || parentNamespace;\n}\n\nexport function createLogger(\n label: string,\n verbose?: string | Debugger,\n initialStep?: string,\n infoDebugger = createLog()\n): OutputLogger {\n const labelPrefix = (label && `[${label}]`) || '';\n\n const spawned: OutputLogger[] = [];\n const debugDebugger: Maybe<Debugger> =\n typeof verbose === 'string' ? infoDebugger.extend(verbose) : verbose;\n const key = childLoggerName(filterType(verbose, filterString), debugDebugger, infoDebugger);\n\n return step(initialStep);\n\n function sibling(name: string, initial?: string) {\n return append(\n spawned,\n createLogger(label, key.replace(/^[^:]+/, name), initial, infoDebugger)\n );\n }\n\n function step(phase?: string) {\n const stepPrefix = (phase && `[${phase}]`) || '';\n const debug = (debugDebugger && prefixedLogger(debugDebugger, stepPrefix)) || NOOP;\n const info = prefixedLogger(infoDebugger, `${labelPrefix} ${stepPrefix}`, debug);\n\n return Object.assign(debugDebugger ? debug : info, {\n label,\n sibling,\n info,\n step,\n });\n }\n}\n\n/**\n * The `GitLogger` is used by the main `SimpleGit` runner to handle logging\n * any warnings or errors.\n */\nexport class GitLogger {\n public error: OutputLoggingHandler;\n\n public warn: OutputLoggingHandler;\n\n constructor(private _out: Debugger = createLog()) {\n this.error = prefixedLogger(_out, '[ERROR]');\n this.warn = prefixedLogger(_out, '[WARN]');\n }\n\n silent(silence = false) {\n if (silence !== this._out.enabled) {\n return;\n }\n\n const { namespace } = this._out;\n const env = (process.env.DEBUG || '').split(',').filter((s) => !!s);\n const hasOn = env.includes(namespace);\n const hasOff = env.includes(`-${namespace}`);\n\n // enabling the log\n if (!silence) {\n if (hasOff) {\n remove(env, `-${namespace}`);\n } else {\n env.push(namespace);\n }\n } else {\n if (hasOn) {\n remove(env, namespace);\n } else {\n env.push(`-${namespace}`);\n }\n }\n\n debug.enable(env.join(','));\n }\n}\n","import { SimpleGitTask } from '../types';\nimport { GitError } from '../errors/git-error';\nimport { createLogger, OutputLogger } from '../git-logger';\n\ntype AnySimpleGitTask = SimpleGitTask<any>;\n\ntype TaskInProgress = {\n name: string;\n logger: OutputLogger;\n task: AnySimpleGitTask;\n};\n\nexport class TasksPendingQueue {\n private _queue: Map<AnySimpleGitTask, TaskInProgress> = new Map();\n\n constructor(private logLabel = 'GitExecutor') {}\n\n private withProgress(task: AnySimpleGitTask) {\n return this._queue.get(task);\n }\n\n private createProgress(task: AnySimpleGitTask): TaskInProgress {\n const name = TasksPendingQueue.getName(task.commands[0]);\n const logger = createLogger(this.logLabel, name);\n\n return {\n task,\n logger,\n name,\n };\n }\n\n push(task: AnySimpleGitTask): TaskInProgress {\n const progress = this.createProgress(task);\n progress.logger('Adding task to the queue, commands = %o', task.commands);\n\n this._queue.set(task, progress);\n\n return progress;\n }\n\n fatal(err: GitError) {\n for (const [task, { logger }] of Array.from(this._queue.entries())) {\n if (task === err.task) {\n logger.info(`Failed %o`, err);\n logger(\n `Fatal exception, any as-yet un-started tasks run through this executor will not be attempted`\n );\n } else {\n logger.info(\n `A fatal exception occurred in a previous task, the queue has been purged: %o`,\n err.message\n );\n }\n\n this.complete(task);\n }\n\n if (this._queue.size !== 0) {\n throw new Error(`Queue size should be zero after fatal: ${this._queue.size}`);\n }\n }\n\n complete(task: AnySimpleGitTask) {\n const progress = this.withProgress(task);\n if (progress) {\n this._queue.delete(task);\n }\n }\n\n attempt(task: AnySimpleGitTask): TaskInProgress {\n const progress = this.withProgress(task);\n if (!progress) {\n throw new GitError(undefined, 'TasksPendingQueue: attempt called for an unknown task');\n }\n progress.logger('Starting task');\n\n return progress;\n }\n\n static getName(name = 'empty') {\n return `task:${name}:${++TasksPendingQueue.counter}`;\n }\n\n private static counter = 0;\n}\n","import { spawn, SpawnOptions } from 'child_process';\nimport { GitError } from '../errors/git-error';\nimport { OutputLogger } from '../git-logger';\nimport { PluginStore } from '../plugins';\nimport { EmptyTask, isBufferTask, isEmptyTask } from '../tasks/task';\nimport {\n GitExecutorResult,\n Maybe,\n outputHandler,\n RunnableTask,\n SimpleGitExecutor,\n SimpleGitTask,\n} from '../types';\nimport { callTaskParser, first, GitOutputStreams, objectToString } from '../utils';\nimport { Scheduler } from './scheduler';\nimport { TasksPendingQueue } from './tasks-pending-queue';\n\nexport class GitExecutorChain implements SimpleGitExecutor {\n private _chain: Promise<any> = Promise.resolve();\n private _queue = new TasksPendingQueue();\n private _cwd: string | undefined;\n\n public get cwd() {\n return this._cwd || this._executor.cwd;\n }\n\n public set cwd(cwd: string) {\n this._cwd = cwd;\n }\n\n public get env() {\n return this._executor.env;\n }\n\n public get outputHandler() {\n return this._executor.outputHandler;\n }\n\n constructor(\n private _executor: SimpleGitExecutor,\n private _scheduler: Scheduler,\n private _plugins: PluginStore\n ) {}\n\n public chain() {\n return this;\n }\n\n public push<R>(task: SimpleGitTask<R>): Promise<R> {\n this._queue.push(task);\n\n return (this._chain = this._chain.then(() => this.attemptTask(task)));\n }\n\n private async attemptTask<R>(task: SimpleGitTask<R>): Promise<void | R> {\n const onScheduleComplete = await this._scheduler.next();\n const onQueueComplete = () => this._queue.complete(task);\n\n try {\n const { logger } = this._queue.attempt(task);\n return (await (isEmptyTask(task)\n ? this.attemptEmptyTask(task, logger)\n : this.attemptRemoteTask(task, logger))) as R;\n } catch (e) {\n throw this.onFatalException(task, e as Error);\n } finally {\n onQueueComplete();\n onScheduleComplete();\n }\n }\n\n private onFatalException<R>(task: SimpleGitTask<R>, e: Error) {\n const gitError =\n e instanceof GitError ? Object.assign(e, { task }) : new GitError(task, e && String(e));\n\n this._chain = Promise.resolve();\n this._queue.fatal(gitError);\n\n return gitError;\n }\n\n private async attemptRemoteTask<R>(task: RunnableTask<R>, logger: OutputLogger) {\n const binary = this._plugins.exec('spawn.binary', '', pluginContext(task, task.commands));\n const args = this._plugins.exec(\n 'spawn.args',\n [...task.commands],\n pluginContext(task, task.commands)\n );\n\n const raw = await this.gitResponse(\n task,\n binary,\n args,\n this.outputHandler,\n logger.step('SPAWN')\n );\n const outputStreams = await this.handleTaskData(task, args, raw, logger.step('HANDLE'));\n\n logger(`passing response to task's parser as a %s`, task.format);\n\n if (isBufferTask(task)) {\n return callTaskParser(task.parser, outputStreams);\n }\n\n return callTaskParser(task.parser, outputStreams.asStrings());\n }\n\n private async attemptEmptyTask(task: EmptyTask, logger: OutputLogger) {\n logger(`empty task bypassing child process to call to task's parser`);\n return task.parser(this);\n }\n\n private handleTaskData<R>(\n task: SimpleGitTask<R>,\n args: string[],\n result: GitExecutorResult,\n logger: OutputLogger\n ): Promise<GitOutputStreams> {\n const { exitCode, rejection, stdOut, stdErr } = result;\n\n return new Promise((done, fail) => {\n logger(`Preparing to handle process response exitCode=%d stdOut=`, exitCode);\n\n const { error } = this._plugins.exec(\n 'task.error',\n { error: rejection },\n {\n ...pluginContext(task, args),\n ...result,\n }\n );\n\n if (error && task.onError) {\n logger.info(`exitCode=%s handling with custom error handler`);\n\n return task.onError(\n result,\n error,\n (newStdOut) => {\n logger.info(`custom error handler treated as success`);\n logger(`custom error returned a %s`, objectToString(newStdOut));\n\n done(\n new GitOutputStreams(\n Array.isArray(newStdOut) ? Buffer.concat(newStdOut) : newStdOut,\n Buffer.concat(stdErr)\n )\n );\n },\n fail\n );\n }\n\n if (error) {\n logger.info(\n `handling as error: exitCode=%s stdErr=%s rejection=%o`,\n exitCode,\n stdErr.length,\n rejection\n );\n return fail(error);\n }\n\n logger.info(`retrieving task output complete`);\n done(new GitOutputStreams(Buffer.concat(stdOut), Buffer.concat(stdErr)));\n });\n }\n\n private async gitResponse<R>(\n task: SimpleGitTask<R>,\n command: string,\n args: string[],\n outputHandler: Maybe<outputHandler>,\n logger: OutputLogger\n ): Promise<GitExecutorResult> {\n const outputLogger = logger.sibling('output');\n const spawnOptions: SpawnOptions = this._plugins.exec(\n 'spawn.options',\n {\n cwd: this.cwd,\n env: this.env,\n windowsHide: true,\n },\n pluginContext(task, task.commands)\n );\n\n return new Promise((done) => {\n const stdOut: Buffer[] = [];\n const stdErr: Buffer[] = [];\n\n logger.info(`%s %o`, command, args);\n logger('%O', spawnOptions);\n\n let rejection = this._beforeSpawn(task, args);\n if (rejection) {\n return done({\n stdOut,\n stdErr,\n exitCode: 9901,\n rejection,\n });\n }\n\n this._plugins.exec('spawn.before', undefined, {\n ...pluginContext(task, args),\n kill(reason) {\n rejection = reason || rejection;\n },\n });\n\n const spawned = spawn(command, args, spawnOptions);\n\n spawned.stdout!.on(\n 'data',\n onDataReceived(stdOut, 'stdOut', logger, outputLogger.step('stdOut'))\n );\n spawned.stderr!.on(\n 'data',\n onDataReceived(stdErr, 'stdErr', logger, outputLogger.step('stdErr'))\n );\n\n spawned.on('error', onErrorReceived(stdErr, logger));\n\n if (outputHandler) {\n logger(`Passing child process stdOut/stdErr to custom outputHandler`);\n outputHandler(command, spawned.stdout!, spawned.stderr!, [...args]);\n }\n\n this._plugins.exec('spawn.after', undefined, {\n ...pluginContext(task, args),\n spawned,\n close(exitCode: number, reason?: Error) {\n done({\n stdOut,\n stdErr,\n exitCode,\n rejection: rejection || reason,\n });\n },\n kill(reason: Error) {\n if (spawned.killed) {\n return;\n }\n\n rejection = reason;\n spawned.kill('SIGINT');\n },\n });\n });\n }\n\n private _beforeSpawn<R>(task: SimpleGitTask<R>, args: string[]) {\n let rejection: Maybe<Error>;\n this._plugins.exec('spawn.before', undefined, {\n ...pluginContext(task, args),\n kill(reason) {\n rejection = reason || rejection;\n },\n });\n\n return rejection;\n }\n}\n\nfunction pluginContext<R>(task: SimpleGitTask<R>, commands: string[]) {\n return {\n method: first(task.commands) || '',\n commands,\n };\n}\n\nfunction onErrorReceived(target: Buffer[], logger: OutputLogger) {\n return (err: Error) => {\n logger(`[ERROR] child process exception %o`, err);\n target.push(Buffer.from(String(err.stack), 'ascii'));\n };\n}\n\nfunction onDataReceived(\n target: Buffer[],\n name: string,\n logger: OutputLogger,\n output: OutputLogger\n) {\n return (buffer: Buffer) => {\n logger(`%s received %L bytes`, name, buffer);\n output(`%B`, buffer);\n target.push(buffer);\n };\n}\n","import type { PluginStore } from '../plugins';\nimport type { GitExecutorEnv, outputHandler, SimpleGitExecutor, SimpleGitTask } from '../types';\n\nimport { GitExecutorChain } from './git-executor-chain';\nimport { Scheduler } from './scheduler';\n\nexport class GitExecutor implements SimpleGitExecutor {\n private _chain = new GitExecutorChain(this, this._scheduler, this._plugins);\n\n public env: GitExecutorEnv;\n public outputHandler?: outputHandler;\n\n constructor(\n public cwd: string,\n private _scheduler: Scheduler,\n private _plugins: PluginStore\n ) {}\n\n chain(): SimpleGitExecutor {\n return new GitExecutorChain(this, this._scheduler, this._plugins);\n }\n\n push<R>(task: SimpleGitTask<R>): Promise<R> {\n return this._chain.push(task);\n }\n}\n","import { GitError } from './errors/git-error';\nimport { GitResponseError } from './errors/git-response-error';\nimport { SimpleGitTask, SimpleGitTaskCallback } from './types';\nimport { NOOP } from './utils';\n\nexport function taskCallback<R>(\n task: SimpleGitTask<R>,\n response: Promise<R>,\n callback: SimpleGitTaskCallback<R> = NOOP\n) {\n const onSuccess = (data: R) => {\n callback(null, data);\n };\n\n const onError = (err: GitError | GitResponseError) => {\n if (err?.task === task) {\n callback(\n err instanceof GitResponseError ? addDeprecationNoticeToError(err) : err,\n undefined as any\n );\n }\n };\n\n response.then(onSuccess, onError);\n}\n\nfunction addDeprecationNoticeToError(err: GitResponseError) {\n let log = (name: string) => {\n console.warn(\n `simple-git deprecation notice: accessing GitResponseError.${name} should be GitResponseError.git.${name}, this will no longer be available in version 3`\n );\n log = NOOP;\n };\n\n return Object.create(err, Object.getOwnPropertyNames(err.git).reduce(descriptorReducer, {}));\n\n function descriptorReducer(all: PropertyDescriptorMap, name: string): typeof all {\n if (name in err) {\n return all;\n }\n\n all[name] = {\n enumerable: false,\n configurable: false,\n get() {\n log(name);\n return err.git[name];\n },\n };\n\n return all;\n }\n}\n","import { folderExists } from '../utils';\nimport { SimpleGitExecutor } from '../types';\nimport { adhocExecTask } from './task';\n\nexport function changeWorkingDirectoryTask(directory: string, root?: SimpleGitExecutor) {\n return adhocExecTask((instance: SimpleGitExecutor) => {\n if (!folderExists(directory)) {\n throw new Error(`Git.cwd: cannot change to non-directory \"${directory}\"`);\n }\n\n return ((root || instance).cwd = directory);\n });\n}\n","import type { SimpleGit } from '../../../typings';\nimport type { SimpleGitApi } from '../simple-git-api';\nimport { getTrailingOptions, remove, trailingFunctionArgument } from '../utils';\nimport { straightThroughStringTask } from './task';\n\nfunction checkoutTask(args: string[]) {\n const commands = ['checkout', ...args];\n if (commands[1] === '-b' && commands.includes('-B')) {\n commands[1] = remove(commands, '-B');\n }\n\n return straightThroughStringTask(commands);\n}\n\nexport default function (): Pick<SimpleGit, 'checkout' | 'checkoutBranch' | 'checkoutLocalBranch'> {\n return {\n checkout(this: SimpleGitApi) {\n return this._runTask(\n checkoutTask(getTrailingOptions(arguments, 1)),\n trailingFunctionArgument(arguments)\n );\n },\n\n checkoutBranch(this: SimpleGitApi, branchName, startPoint) {\n return this._runTask(\n checkoutTask(['-b', branchName, startPoint, ...getTrailingOptions(arguments)]),\n trailingFunctionArgument(arguments)\n );\n },\n\n checkoutLocalBranch(this: SimpleGitApi, branchName) {\n return this._runTask(\n checkoutTask(['-b', branchName, ...getTrailingOptions(arguments)]),\n trailingFunctionArgument(arguments)\n );\n },\n };\n}\n","import type { SimpleGitApi } from '../simple-git-api';\nimport type { SimpleGit } from '../../../typings';\nimport { asCamelCase, asNumber, LineParser, parseStringResponse } from '../utils';\n\nexport interface CountObjectsResult {\n count: number;\n size: number;\n inPack: number;\n packs: number;\n sizePack: number;\n prunePackable: number;\n garbage: number;\n sizeGarbage: number;\n}\n\nfunction countObjectsResponse(): CountObjectsResult {\n return {\n count: 0,\n garbage: 0,\n inPack: 0,\n packs: 0,\n prunePackable: 0,\n size: 0,\n sizeGarbage: 0,\n sizePack: 0,\n };\n}\n\nconst parser: LineParser<CountObjectsResult> = new LineParser(\n /([a-z-]+): (\\d+)$/,\n (result, [key, value]) => {\n const property = asCamelCase(key);\n if (Object.hasOwn(result, property)) {\n result[property as keyof typeof result] = asNumber(value);\n }\n }\n);\n\nexport default function (): Pick<SimpleGit, 'countObjects'> {\n return {\n countObjects(this: SimpleGitApi) {\n return this._runTask({\n commands: ['count-objects', '--verbose'],\n format: 'utf-8',\n parser(stdOut: string) {\n return parseStringResponse(countObjectsResponse(), [parser], stdOut);\n },\n });\n },\n };\n}\n","import { CommitResult } from '../../../typings';\nimport { LineParser, parseStringResponse } from '../utils';\n\nconst parsers: LineParser<CommitResult>[] = [\n new LineParser(/^\\[([^\\s]+)( \\([^)]+\\))? ([^\\]]+)/, (result, [branch, root, commit]) => {\n result.branch = branch;\n result.commit = commit;\n result.root = !!root;\n }),\n new LineParser(/\\s*Author:\\s(.+)/i, (result, [author]) => {\n const parts = author.split('<');\n const email = parts.pop();\n\n if (!email || !email.includes('@')) {\n return;\n }\n\n result.author = {\n email: email.substr(0, email.length - 1),\n name: parts.join('<').trim(),\n };\n }),\n new LineParser(\n /(\\d+)[^,]*(?:,\\s*(\\d+)[^,]*)(?:,\\s*(\\d+))/g,\n (result, [changes, insertions, deletions]) => {\n result.summary.changes = parseInt(changes, 10) || 0;\n result.summary.insertions = parseInt(insertions, 10) || 0;\n result.summary.deletions = parseInt(deletions, 10) || 0;\n }\n ),\n new LineParser(\n /^(\\d+)[^,]*(?:,\\s*(\\d+)[^(]+\\(([+-]))?/,\n (result, [changes, lines, direction]) => {\n result.summary.changes = parseInt(changes, 10) || 0;\n const count = parseInt(lines, 10) || 0;\n if (direction === '-') {\n result.summary.deletions = count;\n } else if (direction === '+') {\n result.summary.insertions = count;\n }\n }\n ),\n];\n\nexport function parseCommitResult(stdOut: string): CommitResult {\n const result: CommitResult = {\n author: null,\n branch: '',\n commit: '',\n root: false,\n summary: {\n changes: 0,\n insertions: 0,\n deletions: 0,\n },\n };\n return parseStringResponse(result, parsers, stdOut);\n}\n","import type { CommitResult, SimpleGit } from '../../../typings';\nimport type { SimpleGitApi } from '../simple-git-api';\nimport type { StringTask } from '../types';\nimport { parseCommitResult } from '../parsers/parse-commit';\nimport {\n asArray,\n asStringArray,\n filterArray,\n filterStringOrStringArray,\n filterType,\n getTrailingOptions,\n prefixedArray,\n trailingFunctionArgument,\n} from '../utils';\nimport { configurationErrorTask } from './task';\n\nexport function commitTask(\n message: string[],\n files: string[],\n customArgs: string[]\n): StringTask<CommitResult> {\n const commands: string[] = [\n '-c',\n 'core.abbrev=40',\n 'commit',\n ...prefixedArray(message, '-m'),\n ...files,\n ...customArgs,\n ];\n\n return {\n commands,\n format: 'utf-8',\n parser: parseCommitResult,\n };\n}\n\nexport default function (): Pick<SimpleGit, 'commit'> {\n return {\n commit(this: SimpleGitApi, message: string | string[], ...rest: unknown[]) {\n const next = trailingFunctionArgument(arguments);\n const task =\n rejectDeprecatedSignatures(message) ||\n commitTask(\n asArray(message),\n asArray(filterType(rest[0], filterStringOrStringArray, [])),\n [\n ...asStringArray(filterType(rest[1], filterArray, [])),\n ...getTrailingOptions(arguments, 0, true),\n ]\n );\n\n return this._runTask(task, next);\n },\n };\n\n function rejectDeprecatedSignatures(message?: unknown) {\n return (\n !filterStringOrStringArray(message) &&\n configurationErrorTask(\n `git.commit: requires the commit message to be supplied as a string/string[]`\n )\n );\n }\n}\n","import { Response, SimpleGit } from '../../../typings';\nimport { SimpleGitApi } from '../simple-git-api';\nimport { trailingFunctionArgument } from '../utils';\nimport { straightThroughStringTask } from './task';\n\nexport default function (): Pick<SimpleGit, 'firstCommit'> {\n return {\n firstCommit(this: SimpleGitApi): Response<string> {\n return this._runTask(\n straightThroughStringTask(['rev-list', '--max-parents=0', 'HEAD'], true),\n trailingFunctionArgument(arguments)\n );\n },\n };\n}\n","import { straightThroughStringTask } from './task';\nimport { StringTask } from '../types';\n\n/**\n * Task used by `git.hashObject`\n */\nexport function hashObjectTask(filePath: string, write: boolean): StringTask<string> {\n const commands = ['hash-object', filePath];\n if (write) {\n commands.push('-w');\n }\n\n return straightThroughStringTask(commands, true);\n}\n","import { InitResult } from '../../../typings';\n\nexport class InitSummary implements InitResult {\n constructor(\n public readonly bare: boolean,\n public readonly path: string,\n public readonly existing: boolean,\n public readonly gitDir: string\n ) {}\n}\n\nconst initResponseRegex = /^Init.+ repository in (.+)$/;\nconst reInitResponseRegex = /^Rein.+ in (.+)$/;\n\nexport function parseInit(bare: boolean, path: string, text: string) {\n const response = String(text).trim();\n let result;\n\n if ((result = initResponseRegex.exec(response))) {\n return new InitSummary(bare, path, false, result[1]);\n }\n\n if ((result = reInitResponseRegex.exec(response))) {\n return new InitSummary(bare, path, true, result[1]);\n }\n\n let gitDir = '';\n const tokens = response.split(' ');\n while (tokens.length) {\n const token = tokens.shift();\n if (token === 'in') {\n gitDir = tokens.join(' ');\n break;\n }\n }\n\n return new InitSummary(bare, path, /^re/i.test(response), gitDir);\n}\n","import { InitResult } from '../../../typings';\nimport { parseInit } from '../responses/InitSummary';\nimport { StringTask } from '../types';\n\nconst bareCommand = '--bare';\n\nfunction hasBareCommand(command: string[]) {\n return command.includes(bareCommand);\n}\n\nexport function initTask(bare = false, path: string, customArgs: string[]): StringTask<InitResult> {\n const commands = ['init', ...customArgs];\n if (bare && !hasBareCommand(commands)) {\n commands.splice(1, 0, bareCommand);\n }\n\n return {\n commands,\n format: 'utf-8',\n parser(text: string): InitResult {\n return parseInit(commands.includes('--bare'), path, text);\n },\n };\n}\n","export enum LogFormat {\n NONE = '',\n STAT = '--stat',\n NUM_STAT = '--numstat',\n NAME_ONLY = '--name-only',\n NAME_STATUS = '--name-status',\n}\n\nconst logFormatRegex = /^--(stat|numstat|name-only|name-status)(=|$)/;\n\nexport function logFormatFromCommand(customArgs: string[]) {\n for (let i = 0; i < customArgs.length; i++) {\n const format = logFormatRegex.exec(customArgs[i]);\n if (format) {\n return `--${format[1]}` as LogFormat;\n }\n }\n\n return LogFormat.NONE;\n}\n\nexport function isLogFormat(customArg: string | unknown) {\n return logFormatRegex.test(customArg as string);\n}\n","import { DiffResult, DiffResultBinaryFile, DiffResultTextFile } from '../../../typings';\n\n/***\n * The DiffSummary is returned as a response to getting `git().status()`\n */\nexport class DiffSummary implements DiffResult {\n changed = 0;\n deletions = 0;\n insertions = 0;\n\n files: Array<DiffResultTextFile | DiffResultBinaryFile> = [];\n}\n","import { DiffResult } from '../../../typings';\nimport { LogFormat } from '../args/log-format';\nimport { DiffSummary } from '../responses/DiffSummary';\nimport { isDiffNameStatus } from '../tasks/diff-name-status';\nimport { asNumber, LineParser, orVoid, parseStringResponse } from '../utils';\n\nconst statParser = [\n new LineParser<DiffResult>(\n /^(.+)\\s+\\|\\s+(\\d+)(\\s+[+\\-]+)?$/,\n (result, [file, changes, alterations = '']) => {\n result.files.push({\n file: file.trim(),\n changes: asNumber(changes),\n insertions: alterations.replace(/[^+]/g, '').length,\n deletions: alterations.replace(/[^-]/g, '').length,\n binary: false,\n });\n }\n ),\n new LineParser<DiffResult>(\n /^(.+) \\|\\s+Bin ([0-9.]+) -> ([0-9.]+) ([a-z]+)/,\n (result, [file, before, after]) => {\n result.files.push({\n file: file.trim(),\n before: asNumber(before),\n after: asNumber(after),\n binary: true,\n });\n }\n ),\n new LineParser<DiffResult>(\n /(\\d+) files? changed\\s*((?:, \\d+ [^,]+){0,2})/,\n (result, [changed, summary]) => {\n const inserted = /(\\d+) i/.exec(summary);\n const deleted = /(\\d+) d/.exec(summary);\n\n result.changed = asNumber(changed);\n result.insertions = asNumber(inserted?.[1]);\n result.deletions = asNumber(deleted?.[1]);\n }\n ),\n];\n\nconst numStatParser = [\n new LineParser<DiffResult>(\n /(\\d+)\\t(\\d+)\\t(.+)$/,\n (result, [changesInsert, changesDelete, file]) => {\n const insertions = asNumber(changesInsert);\n const deletions = asNumber(changesDelete);\n\n result.changed++;\n result.insertions += insertions;\n result.deletions += deletions;\n\n result.files.push({\n file,\n changes: insertions + deletions,\n insertions,\n deletions,\n binary: false,\n });\n }\n ),\n new LineParser<DiffResult>(/-\\t-\\t(.+)$/, (result, [file]) => {\n result.changed++;\n\n result.files.push({\n file,\n after: 0,\n before: 0,\n binary: true,\n });\n }),\n];\n\nconst nameOnlyParser = [\n new LineParser<DiffResult>(/(.+)$/, (result, [file]) => {\n result.changed++;\n result.files.push({\n file,\n changes: 0,\n insertions: 0,\n deletions: 0,\n binary: false,\n });\n }),\n];\n\nconst nameStatusParser = [\n new LineParser<DiffResult>(\n /([ACDMRTUXB])([0-9]{0,3})\\t(.[^\\t]*)(\\t(.[^\\t]*))?$/,\n (result, [status, similarity, from, _to, to]) => {\n result.changed++;\n result.files.push({\n file: to ?? from,\n changes: 0,\n insertions: 0,\n deletions: 0,\n binary: false,\n status: orVoid(isDiffNameStatus(status) && status),\n from: orVoid(!!to && from !== to && from),\n similarity: asNumber(similarity),\n });\n }\n ),\n];\n\nconst diffSummaryParsers: Record<LogFormat, LineParser<DiffResult>[]> = {\n [LogFormat.NONE]: statParser,\n [LogFormat.STAT]: statParser,\n [LogFormat.NUM_STAT]: numStatParser,\n [LogFormat.NAME_STATUS]: nameStatusParser,\n [LogFormat.NAME_ONLY]: nameOnlyParser,\n};\n\nexport function getDiffParser(format = LogFormat.NONE) {\n const parser = diffSummaryParsers[format];\n\n return (stdOut: string) => parseStringResponse(new DiffSummary(), parser, stdOut, false);\n}\n","import { ListLogLine, LogResult } from '../../../typings';\nimport { toLinesWithContent } from '../utils';\nimport { getDiffParser } from './parse-diff-summary';\nimport { LogFormat } from '../args/log-format';\n\nexport const START_BOUNDARY = 'òòòòòò ';\n\nexport const COMMIT_BOUNDARY = ' òò';\n\nexport const SPLITTER = ' ò ';\n\nconst defaultFieldNames = ['hash', 'date', 'message', 'refs', 'author_name', 'author_email'];\n\nfunction lineBuilder(tokens: string[], fields: string[]): any {\n return fields.reduce(\n (line, field, index) => {\n line[field] = tokens[index] || '';\n return line;\n },\n Object.create({ diff: null }) as any\n );\n}\n\nexport function createListLogSummaryParser<T = any>(\n splitter = SPLITTER,\n fields = defaultFieldNames,\n logFormat = LogFormat.NONE\n) {\n const parseDiffResult = getDiffParser(logFormat);\n\n return function (stdOut: string): LogResult<T> {\n const all: ReadonlyArray<T & ListLogLine> = toLinesWithContent(\n stdOut.trim(),\n false,\n START_BOUNDARY\n ).map(function (item) {\n const lineDetail = item.split(COMMIT_BOUNDARY);\n const listLogLine: T & ListLogLine = lineBuilder(lineDetail[0].split(splitter), fields);\n\n if (lineDetail.length > 1 && !!lineDetail[1].trim()) {\n listLogLine.diff = parseDiffResult(lineDetail[1]);\n }\n\n return listLogLine;\n });\n\n return {\n all,\n latest: (all.length && all[0]) || null,\n total: all.length,\n };\n };\n}\n","import { StringTask } from '../types';\nimport { DiffResult } from '../../../typings';\nimport { isLogFormat, LogFormat, logFormatFromCommand } from '../args/log-format';\nimport { getDiffParser } from '../parsers/parse-diff-summary';\nimport { configurationErrorTask, EmptyTask } from './task';\n\nexport function diffSummaryTask(customArgs: string[]): StringTask<DiffResult> | EmptyTask {\n let logFormat = logFormatFromCommand(customArgs);\n\n const commands = ['diff'];\n\n if (logFormat === LogFormat.NONE) {\n logFormat = LogFormat.STAT;\n commands.push('--stat=4096');\n }\n\n commands.push(...customArgs);\n\n return (\n validateLogFormatConfig(commands) || {\n commands,\n format: 'utf-8',\n parser: getDiffParser(logFormat),\n }\n );\n}\n\nexport function validateLogFormatConfig(customArgs: unknown[]): EmptyTask | void {\n const flags = customArgs.filter(isLogFormat);\n\n if (flags.length > 1) {\n return configurationErrorTask(\n `Summary flags are mutually exclusive - pick one of ${flags.join(',')}`\n );\n }\n\n if (flags.length && customArgs.includes('-z')) {\n return configurationErrorTask(\n `Summary flag ${flags} parsing is not compatible with null termination option '-z'`\n );\n }\n}\n","import type { LogResult, Options, SimpleGit } from '../../../typings';\nimport { logFormatFromCommand } from '../args/log-format';\nimport { pathspec } from '../args/pathspec';\nimport {\n COMMIT_BOUNDARY,\n createListLogSummaryParser,\n SPLITTER,\n START_BOUNDARY,\n} from '../parsers/parse-list-log-summary';\nimport {\n appendTaskOptions,\n asStringArray,\n filterArray,\n filterPlainObject,\n filterString,\n filterType,\n trailingFunctionArgument,\n trailingOptionsArgument,\n} from '../utils';\nimport { SimpleGitApi } from '../simple-git-api';\nimport { configurationErrorTask } from './task';\nimport { validateLogFormatConfig } from './diff';\nimport { StringTask } from '../types';\n\nenum excludeOptions {\n '--pretty',\n 'max-count',\n 'maxCount',\n 'n',\n 'file',\n 'format',\n 'from',\n 'to',\n 'splitter',\n 'symmetric',\n 'mailMap',\n 'multiLine',\n 'strictDate',\n}\n\nexport interface DefaultLogFields {\n hash: string;\n date: string;\n message: string;\n refs: string;\n body: string;\n author_name: string;\n author_email: string;\n}\n\nexport type LogOptions<T = DefaultLogFields> = {\n file?: string;\n format?: T;\n from?: string;\n mailMap?: boolean;\n maxCount?: number;\n multiLine?: boolean;\n splitter?: string;\n strictDate?: boolean;\n symmetric?: boolean;\n to?: string;\n};\n\ninterface ParsedLogOptions {\n fields: string[];\n splitter: string;\n commands: string[];\n}\n\nfunction prettyFormat(\n format: Record<string, string | unknown>,\n splitter: string\n): [string[], string] {\n const fields: string[] = [];\n const formatStr: string[] = [];\n\n Object.keys(format).forEach((field) => {\n fields.push(field);\n formatStr.push(String(format[field]));\n });\n\n return [fields, formatStr.join(splitter)];\n}\n\nfunction userOptions<T extends Options>(input: T): Options {\n return Object.keys(input).reduce((out, key) => {\n if (!(key in excludeOptions)) {\n out[key] = input[key];\n }\n return out;\n }, {} as Options);\n}\n\nexport function parseLogOptions<T extends Options>(\n opt: Options | LogOptions<T> = {},\n customArgs: string[] = []\n): ParsedLogOptions {\n const splitter = filterType(opt.splitter, filterString, SPLITTER);\n const format = filterPlainObject(opt.format)\n ? opt.format\n : {\n hash: '%H',\n date: opt.strictDate === false ? '%ai' : '%aI',\n message: '%s',\n refs: '%D',\n body: opt.multiLine ? '%B' : '%b',\n author_name: opt.mailMap !== false ? '%aN' : '%an',\n author_email: opt.mailMap !== false ? '%aE' : '%ae',\n };\n\n const [fields, formatStr] = prettyFormat(format, splitter);\n\n const suffix: string[] = [];\n const command: string[] = [\n `--pretty=format:${START_BOUNDARY}${formatStr}${COMMIT_BOUNDARY}`,\n ...customArgs,\n ];\n\n const maxCount: number | undefined = (opt as any).n || (opt as any)['max-count'] || opt.maxCount;\n if (maxCount) {\n command.push(`--max-count=${maxCount}`);\n }\n\n if (opt.from || opt.to) {\n const rangeOperator = opt.symmetric !== false ? '...' : '..';\n suffix.push(`${opt.from || ''}${rangeOperator}${opt.to || ''}`);\n }\n\n if (filterString(opt.file)) {\n command.push('--follow', pathspec(opt.file));\n }\n\n appendTaskOptions(userOptions(opt as Options), command);\n\n return {\n fields,\n splitter,\n commands: [...command, ...suffix],\n };\n}\n\nexport function logTask<T>(\n splitter: string,\n fields: string[],\n customArgs: string[]\n): StringTask<LogResult<T>> {\n const parser = createListLogSummaryParser(splitter, fields, logFormatFromCommand(customArgs));\n\n return {\n commands: ['log', ...customArgs],\n format: 'utf-8',\n parser,\n };\n}\n\nexport default function (): Pick<SimpleGit, 'log'> {\n return {\n log<T extends Options>(this: SimpleGitApi, ...rest: unknown[]) {\n const next = trailingFunctionArgument(arguments);\n const options = parseLogOptions<T>(\n trailingOptionsArgument(arguments),\n asStringArray(filterType(arguments[0], filterArray, []))\n );\n const task =\n rejectDeprecatedSignatures(...rest) ||\n validateLogFormatConfig(options.commands) ||\n createLogTask(options);\n\n return this._runTask(task, next);\n },\n };\n\n function createLogTask(options: ParsedLogOptions) {\n return logTask(options.splitter, options.fields, options.commands);\n }\n\n function rejectDeprecatedSignatures(from?: unknown, to?: unknown) {\n return (\n filterString(from) &&\n filterString(to) &&\n configurationErrorTask(\n `git.log(string, string) should be replaced with git.log({ from: string, to: string })`\n )\n );\n }\n}\n","import {\n MergeConflict,\n MergeConflictDeletion,\n MergeDetail,\n MergeResultStatus,\n} from '../../../typings';\n\nexport class MergeSummaryConflict implements MergeConflict {\n constructor(\n public readonly reason: string,\n public readonly file: string | null = null,\n public readonly meta?: MergeConflictDeletion\n ) {}\n\n toString() {\n return `${this.file}:${this.reason}`;\n }\n}\n\nexport class MergeSummaryDetail implements MergeDetail {\n public conflicts: MergeConflict[] = [];\n public merges: string[] = [];\n public result: MergeResultStatus = 'success';\n\n get failed() {\n return this.conflicts.length > 0;\n }\n\n get reason() {\n return this.result;\n }\n\n toString() {\n if (this.conflicts.length) {\n return `CONFLICTS: ${this.conflicts.join(', ')}`;\n }\n\n return 'OK';\n }\n}\n","import {\n PullDetailFileChanges,\n PullDetailSummary,\n PullFailedResult,\n PullResult,\n} from '../../../typings';\n\nexport class PullSummary implements PullResult {\n public remoteMessages = {\n all: [],\n };\n public created = [];\n public deleted: string[] = [];\n public files: string[] = [];\n public deletions: PullDetailFileChanges = {};\n public insertions: PullDetailFileChanges = {};\n public summary: PullDetailSummary = {\n changes: 0,\n deletions: 0,\n insertions: 0,\n };\n}\n\nexport class PullFailedSummary implements PullFailedResult {\n remote = '';\n hash = {\n local: '',\n remote: '',\n };\n branch = {\n local: '',\n remote: '',\n };\n message = '';\n\n toString() {\n return this.message;\n }\n}\n","import {\n RemoteMessageResult,\n RemoteMessages,\n RemoteMessagesObjectEnumeration,\n} from '../../../typings';\nimport { asNumber, RemoteLineParser } from '../utils';\n\nfunction objectEnumerationResult<T extends RemoteMessages = RemoteMessages>(\n remoteMessages: T\n): RemoteMessagesObjectEnumeration {\n return (remoteMessages.objects = remoteMessages.objects || {\n compressing: 0,\n counting: 0,\n enumerating: 0,\n packReused: 0,\n reused: { count: 0, delta: 0 },\n total: { count: 0, delta: 0 },\n });\n}\n\nfunction asObjectCount(source: string) {\n const count = /^\\s*(\\d+)/.exec(source);\n const delta = /delta (\\d+)/i.exec(source);\n\n return {\n count: asNumber((count && count[1]) || '0'),\n delta: asNumber((delta && delta[1]) || '0'),\n };\n}\n\nexport const remoteMessagesObjectParsers: RemoteLineParser<RemoteMessageResult<RemoteMessages>>[] =\n [\n new RemoteLineParser(\n /^remote:\\s*(enumerating|counting|compressing) objects: (\\d+),/i,\n (result, [action, count]) => {\n const key = action.toLowerCase();\n const enumeration = objectEnumerationResult(result.remoteMessages);\n\n Object.assign(enumeration, { [key]: asNumber(count) });\n }\n ),\n new RemoteLineParser(\n /^remote:\\s*(enumerating|counting|compressing) objects: \\d+% \\(\\d+\\/(\\d+)\\),/i,\n (result, [action, count]) => {\n const key = action.toLowerCase();\n const enumeration = objectEnumerationResult(result.remoteMessages);\n\n Object.assign(enumeration, { [key]: asNumber(count) });\n }\n ),\n new RemoteLineParser(\n /total ([^,]+), reused ([^,]+), pack-reused (\\d+)/i,\n (result, [total, reused, packReused]) => {\n const objects = objectEnumerationResult(result.remoteMessages);\n objects.total = asObjectCount(total);\n objects.reused = asObjectCount(reused);\n objects.packReused = asNumber(packReused);\n }\n ),\n ];\n","import { PushResultRemoteMessages, RemoteMessageResult, RemoteMessages } from '../../../typings';\nimport { asNumber, parseStringResponse, RemoteLineParser } from '../utils';\nimport { remoteMessagesObjectParsers } from './parse-remote-objects';\n\nconst parsers: RemoteLineParser<RemoteMessageResult<PushResultRemoteMessages | RemoteMessages>>[] =\n [\n new RemoteLineParser(/^remote:\\s*(.+)$/, (result, [text]) => {\n result.remoteMessages.all.push(text.trim());\n return false;\n }),\n ...remoteMessagesObjectParsers,\n new RemoteLineParser(\n [/create a (?:pull|merge) request/i, /\\s(https?:\\/\\/\\S+)$/],\n (result, [pullRequestUrl]) => {\n (result.remoteMessages as PushResultRemoteMessages).pullRequestUrl = pullRequestUrl;\n }\n ),\n new RemoteLineParser(\n [/found (\\d+) vulnerabilities.+\\(([^)]+)\\)/i, /\\s(https?:\\/\\/\\S+)$/],\n (result, [count, summary, url]) => {\n (result.remoteMessages as PushResultRemoteMessages).vulnerabilities = {\n count: asNumber(count),\n summary,\n url,\n };\n }\n ),\n ];\n\nexport function parseRemoteMessages<T extends RemoteMessages = RemoteMessages>(\n _stdOut: string,\n stdErr: string\n): RemoteMessageResult {\n return parseStringResponse({ remoteMessages: new RemoteMessageSummary() as T }, parsers, stdErr);\n}\n\nexport class RemoteMessageSummary implements RemoteMessages {\n public readonly all: string[] = [];\n}\n","import { PullDetail, PullFailedResult, PullResult, RemoteMessages } from '../../../typings';\nimport { PullFailedSummary, PullSummary } from '../responses/PullSummary';\nimport { TaskParser } from '../types';\nimport { append, LineParser, parseStringResponse } from '../utils';\nimport { parseRemoteMessages } from './parse-remote-messages';\n\nconst FILE_UPDATE_REGEX = /^\\s*(.+?)\\s+\\|\\s+\\d+\\s*(\\+*)(-*)/;\nconst SUMMARY_REGEX = /(\\d+)\\D+((\\d+)\\D+\\(\\+\\))?(\\D+(\\d+)\\D+\\(-\\))?/;\nconst ACTION_REGEX = /^(create|delete) mode \\d+ (.+)/;\n\nconst parsers: LineParser<PullResult>[] = [\n new LineParser(FILE_UPDATE_REGEX, (result, [file, insertions, deletions]) => {\n result.files.push(file);\n\n if (insertions) {\n result.insertions[file] = insertions.length;\n }\n\n if (deletions) {\n result.deletions[file] = deletions.length;\n }\n }),\n new LineParser(SUMMARY_REGEX, (result, [changes, , insertions, , deletions]) => {\n if (insertions !== undefined || deletions !== undefined) {\n result.summary.changes = +changes || 0;\n result.summary.insertions = +insertions || 0;\n result.summary.deletions = +deletions || 0;\n return true;\n }\n return false;\n }),\n new LineParser(ACTION_REGEX, (result, [action, file]) => {\n append(result.files, file);\n append(action === 'create' ? result.created : result.deleted, file);\n }),\n];\n\nconst errorParsers: LineParser<PullFailedResult>[] = [\n new LineParser(/^from\\s(.+)$/i, (result, [remote]) => void (result.remote = remote)),\n new LineParser(/^fatal:\\s(.+)$/, (result, [message]) => void (result.message = message)),\n new LineParser(\n /([a-z0-9]+)\\.\\.([a-z0-9]+)\\s+(\\S+)\\s+->\\s+(\\S+)$/,\n (result, [hashLocal, hashRemote, branchLocal, branchRemote]) => {\n result.branch.local = branchLocal;\n result.hash.local = hashLocal;\n result.branch.remote = branchRemote;\n result.hash.remote = hashRemote;\n }\n ),\n];\n\nexport const parsePullDetail: TaskParser<string, PullDetail> = (stdOut, stdErr) => {\n return parseStringResponse(new PullSummary(), parsers, [stdOut, stdErr]);\n};\n\nexport const parsePullResult: TaskParser<string, PullResult> = (stdOut, stdErr) => {\n return Object.assign(\n new PullSummary(),\n parsePullDetail(stdOut, stdErr),\n parseRemoteMessages<RemoteMessages>(stdOut, stdErr)\n );\n};\n\nexport function parsePullErrorResult(stdOut: string, stdErr: string) {\n const pullError = parseStringResponse(new PullFailedSummary(), errorParsers, [stdOut, stdErr]);\n\n return pullError.message && pullError;\n}\n","import { MergeDetail, MergeResult } from '../../../typings';\nimport { MergeSummaryConflict, MergeSummaryDetail } from '../responses/MergeSummary';\nimport { TaskParser } from '../types';\nimport { LineParser, parseStringResponse } from '../utils';\nimport { parsePullResult } from './parse-pull';\n\nconst parsers: LineParser<MergeDetail>[] = [\n new LineParser(/^Auto-merging\\s+(.+)$/, (summary, [autoMerge]) => {\n summary.merges.push(autoMerge);\n }),\n new LineParser(/^CONFLICT\\s+\\((.+)\\): Merge conflict in (.+)$/, (summary, [reason, file]) => {\n summary.conflicts.push(new MergeSummaryConflict(reason, file));\n }),\n new LineParser(\n /^CONFLICT\\s+\\((.+\\/delete)\\): (.+) deleted in (.+) and/,\n (summary, [reason, file, deleteRef]) => {\n summary.conflicts.push(new MergeSummaryConflict(reason, file, { deleteRef }));\n }\n ),\n new LineParser(/^CONFLICT\\s+\\((.+)\\):/, (summary, [reason]) => {\n summary.conflicts.push(new MergeSummaryConflict(reason, null));\n }),\n new LineParser(/^Automatic merge failed;\\s+(.+)$/, (summary, [result]) => {\n summary.result = result;\n }),\n];\n\n/**\n * Parse the complete response from `git.merge`\n */\nexport const parseMergeResult: TaskParser<string, MergeResult> = (stdOut, stdErr) => {\n return Object.assign(parseMergeDetail(stdOut, stdErr), parsePullResult(stdOut, stdErr));\n};\n\n/**\n * Parse the merge specific detail (ie: not the content also available in the pull detail) from `git.mnerge`\n * @param stdOut\n */\nexport const parseMergeDetail: TaskParser<string, MergeDetail> = (stdOut) => {\n return parseStringResponse(new MergeSummaryDetail(), parsers, stdOut);\n};\n","import { MergeResult } from '../../../typings';\nimport { GitResponseError } from '../errors/git-response-error';\nimport { parseMergeResult } from '../parsers/parse-merge';\nimport { StringTask } from '../types';\nimport { configurationErrorTask, EmptyTask } from './task';\n\nexport function mergeTask(customArgs: string[]): EmptyTask | StringTask<MergeResult> {\n if (!customArgs.length) {\n return configurationErrorTask('Git.merge requires at least one option');\n }\n\n return {\n commands: ['merge', ...customArgs],\n format: 'utf-8',\n parser(stdOut, stdErr): MergeResult {\n const merge = parseMergeResult(stdOut, stdErr);\n if (merge.failed) {\n throw new GitResponseError(merge);\n }\n\n return merge;\n },\n };\n}\n","import {\n PushDetail,\n PushResult,\n PushResultPushedItem,\n PushResultRemoteMessages,\n} from '../../../typings';\nimport { TaskParser } from '../types';\nimport { LineParser, parseStringResponse } from '../utils';\nimport { parseRemoteMessages } from './parse-remote-messages';\n\nfunction pushResultPushedItem(local: string, remote: string, status: string): PushResultPushedItem {\n const deleted = status.includes('deleted');\n const tag = status.includes('tag') || /^refs\\/tags/.test(local);\n const alreadyUpdated = !status.includes('new');\n\n return {\n deleted,\n tag,\n branch: !tag,\n new: !alreadyUpdated,\n alreadyUpdated,\n local,\n remote,\n };\n}\n\nconst parsers: LineParser<PushDetail>[] = [\n new LineParser(/^Pushing to (.+)$/, (result, [repo]) => {\n result.repo = repo;\n }),\n new LineParser(/^updating local tracking ref '(.+)'/, (result, [local]) => {\n result.ref = {\n ...(result.ref || {}),\n local,\n };\n }),\n new LineParser(/^[=*-]\\s+([^:]+):(\\S+)\\s+\\[(.+)]$/, (result, [local, remote, type]) => {\n result.pushed.push(pushResultPushedItem(local, remote, type));\n }),\n new LineParser(\n /^Branch '([^']+)' set up to track remote branch '([^']+)' from '([^']+)'/,\n (result, [local, remote, remoteName]) => {\n result.branch = {\n ...(result.branch || {}),\n local,\n remote,\n remoteName,\n };\n }\n ),\n new LineParser(\n /^([^:]+):(\\S+)\\s+([a-z0-9]+)\\.\\.([a-z0-9]+)$/,\n (result, [local, remote, from, to]) => {\n result.update = {\n head: {\n local,\n remote,\n },\n hash: {\n from,\n to,\n },\n };\n }\n ),\n];\n\nexport const parsePushResult: TaskParser<string, PushResult> = (stdOut, stdErr) => {\n const pushDetail = parsePushDetail(stdOut, stdErr);\n const responseDetail = parseRemoteMessages<PushResultRemoteMessages>(stdOut, stdErr);\n\n return {\n ...pushDetail,\n ...responseDetail,\n };\n};\n\nexport const parsePushDetail: TaskParser<string, PushDetail> = (stdOut, stdErr) => {\n return parseStringResponse({ pushed: [] }, parsers, [stdOut, stdErr]);\n};\n","import { PushResult } from '../../../typings';\nimport { parsePushResult as parser } from '../parsers/parse-push';\nimport { StringTask } from '../types';\nimport { append, remove } from '../utils';\n\ntype PushRef = { remote?: string; branch?: string };\n\nexport function pushTagsTask(ref: PushRef = {}, customArgs: string[]): StringTask<PushResult> {\n append(customArgs, '--tags');\n return pushTask(ref, customArgs);\n}\n\nexport function pushTask(ref: PushRef = {}, customArgs: string[]): StringTask<PushResult> {\n const commands = ['push', ...customArgs];\n if (ref.branch) {\n commands.splice(1, 0, ref.branch);\n }\n if (ref.remote) {\n commands.splice(1, 0, ref.remote);\n }\n\n remove(commands, '-v');\n append(commands, '--verbose');\n append(commands, '--porcelain');\n\n return {\n commands,\n format: 'utf-8',\n parser,\n };\n}\n","import { SimpleGit } from '../../../typings';\nimport { SimpleGitApi } from '../simple-git-api';\nimport { getTrailingOptions, trailingFunctionArgument } from '../utils';\nimport { straightThroughBufferTask, straightThroughStringTask } from './task';\n\nexport default function (): Pick<SimpleGit, 'showBuffer' | 'show'> {\n return {\n showBuffer(this: SimpleGitApi) {\n const commands = ['show', ...getTrailingOptions(arguments, 1)];\n if (!commands.includes('--binary')) {\n commands.splice(1, 0, '--binary');\n }\n\n return this._runTask(\n straightThroughBufferTask(commands),\n trailingFunctionArgument(arguments)\n );\n },\n\n show(this: SimpleGitApi) {\n const commands = ['show', ...getTrailingOptions(arguments, 1)];\n return this._runTask(\n straightThroughStringTask(commands),\n trailingFunctionArgument(arguments)\n );\n },\n };\n}\n","import { FileStatusResult } from '../../../typings';\n\nexport const fromPathRegex = /^(.+)\\0(.+)$/;\n\nexport class FileStatusSummary implements FileStatusResult {\n public readonly from: string | undefined;\n\n constructor(\n public path: string,\n public index: string,\n public working_dir: string\n ) {\n if (index === 'R' || working_dir === 'R') {\n const detail = fromPathRegex.exec(path) || [null, path, path];\n this.from = detail[2] || '';\n this.path = detail[1] || '';\n }\n }\n}\n","import { StatusResult } from '../../../typings';\nimport { append, filterString, filterType, NULL } from '../utils';\nimport { FileStatusSummary } from './FileStatusSummary';\n\ntype StatusLineParser = (result: StatusResult, file: string) => void;\n\nexport class StatusSummary implements StatusResult {\n public not_added = [];\n public conflicted = [];\n public created = [];\n public deleted = [];\n public ignored = undefined;\n public modified = [];\n public renamed = [];\n public files = [];\n public staged = [];\n public ahead = 0;\n public behind = 0;\n public current = null;\n public tracking = null;\n public detached = false;\n\n public isClean = () => {\n return !this.files.length;\n };\n}\n\nenum PorcelainFileStatus {\n ADDED = 'A',\n DELETED = 'D',\n MODIFIED = 'M',\n RENAMED = 'R',\n COPIED = 'C',\n UNMERGED = 'U',\n UNTRACKED = '?',\n IGNORED = '!',\n NONE = ' ',\n}\n\nfunction renamedFile(line: string) {\n const [to, from] = line.split(NULL);\n\n return {\n from: from || to,\n to,\n };\n}\n\nfunction parser(\n indexX: PorcelainFileStatus,\n indexY: PorcelainFileStatus,\n handler: StatusLineParser\n): [string, StatusLineParser] {\n return [`${indexX}${indexY}`, handler];\n}\n\nfunction conflicts(indexX: PorcelainFileStatus, ...indexY: PorcelainFileStatus[]) {\n return indexY.map((y) => parser(indexX, y, (result, file) => append(result.conflicted, file)));\n}\n\nconst parsers: Map<string, StatusLineParser> = new Map([\n parser(PorcelainFileStatus.NONE, PorcelainFileStatus.ADDED, (result, file) =>\n append(result.created, file)\n ),\n parser(PorcelainFileStatus.NONE, PorcelainFileStatus.DELETED, (result, file) =>\n append(result.deleted, file)\n ),\n parser(PorcelainFileStatus.NONE, PorcelainFileStatus.MODIFIED, (result, file) =>\n append(result.modified, file)\n ),\n\n parser(\n PorcelainFileStatus.ADDED,\n PorcelainFileStatus.NONE,\n (result, file) => append(result.created, file) && append(result.staged, file)\n ),\n parser(\n PorcelainFileStatus.ADDED,\n PorcelainFileStatus.MODIFIED,\n (result, file) =>\n append(result.created, file) &&\n append(result.staged, file) &&\n append(result.modified, file)\n ),\n\n parser(\n PorcelainFileStatus.DELETED,\n PorcelainFileStatus.NONE,\n (result, file) => append(result.deleted, file) && append(result.staged, file)\n ),\n\n parser(\n PorcelainFileStatus.MODIFIED,\n PorcelainFileStatus.NONE,\n (result, file) => append(result.modified, file) && append(result.staged, file)\n ),\n parser(\n PorcelainFileStatus.MODIFIED,\n PorcelainFileStatus.MODIFIED,\n (result, file) => append(result.modified, file) && append(result.staged, file)\n ),\n\n parser(PorcelainFileStatus.RENAMED, PorcelainFileStatus.NONE, (result, file) => {\n append(result.renamed, renamedFile(file));\n }),\n parser(PorcelainFileStatus.RENAMED, PorcelainFileStatus.MODIFIED, (result, file) => {\n const renamed = renamedFile(file);\n append(result.renamed, renamed);\n append(result.modified, renamed.to);\n }),\n parser(PorcelainFileStatus.IGNORED, PorcelainFileStatus.IGNORED, (_result, _file) => {\n append((_result.ignored = _result.ignored || []), _file);\n }),\n\n parser(PorcelainFileStatus.UNTRACKED, PorcelainFileStatus.UNTRACKED, (result, file) =>\n append(result.not_added, file)\n ),\n\n ...conflicts(PorcelainFileStatus.ADDED, PorcelainFileStatus.ADDED, PorcelainFileStatus.UNMERGED),\n ...conflicts(\n PorcelainFileStatus.DELETED,\n PorcelainFileStatus.DELETED,\n PorcelainFileStatus.UNMERGED\n ),\n ...conflicts(\n PorcelainFileStatus.UNMERGED,\n PorcelainFileStatus.ADDED,\n PorcelainFileStatus.DELETED,\n PorcelainFileStatus.UNMERGED\n ),\n\n [\n '##',\n (result, line) => {\n const aheadReg = /ahead (\\d+)/;\n const behindReg = /behind (\\d+)/;\n const currentReg = /^(.+?(?=(?:\\.{3}|\\s|$)))/;\n const trackingReg = /\\.{3}(\\S*)/;\n const onEmptyBranchReg = /\\son\\s(\\S+?)(?=\\.{3}|$)/;\n\n let regexResult = aheadReg.exec(line);\n result.ahead = (regexResult && +regexResult[1]) || 0;\n\n regexResult = behindReg.exec(line);\n result.behind = (regexResult && +regexResult[1]) || 0;\n\n regexResult = currentReg.exec(line);\n result.current = filterType(regexResult?.[1], filterString, null);\n\n regexResult = trackingReg.exec(line);\n result.tracking = filterType(regexResult?.[1], filterString, null);\n\n regexResult = onEmptyBranchReg.exec(line);\n if (regexResult) {\n result.current = filterType(regexResult?.[1], filterString, result.current);\n }\n\n result.detached = /\\(no branch\\)/.test(line);\n },\n ],\n]);\n\nexport const parseStatusSummary = function (text: string): StatusResult {\n const lines = text.split(NULL);\n const status = new StatusSummary();\n\n for (let i = 0, l = lines.length; i < l; ) {\n let line = lines[i++].trim();\n\n if (!line) {\n continue;\n }\n\n if (line.charAt(0) === PorcelainFileStatus.RENAMED) {\n line += NULL + (lines[i++] || '');\n }\n\n splitLine(status, line);\n }\n\n return status;\n};\n\nfunction splitLine(result: StatusResult, lineStr: string) {\n const trimmed = lineStr.trim();\n switch (' ') {\n case trimmed.charAt(2):\n return data(trimmed.charAt(0), trimmed.charAt(1), trimmed.substr(3));\n case trimmed.charAt(1):\n return data(PorcelainFileStatus.NONE, trimmed.charAt(0), trimmed.substr(2));\n default:\n return;\n }\n\n function data(index: string, workingDir: string, path: string) {\n const raw = `${index}${workingDir}`;\n const handler = parsers.get(raw);\n\n if (handler) {\n handler(result, path);\n }\n\n if (raw !== '##' && raw !== '!!') {\n result.files.push(new FileStatusSummary(path, index, workingDir));\n }\n }\n}\n","import { StatusResult } from '../../../typings';\nimport { parseStatusSummary } from '../responses/StatusSummary';\nimport { StringTask } from '../types';\n\nconst ignoredOptions = ['--null', '-z'];\n\nexport function statusTask(customArgs: string[]): StringTask<StatusResult> {\n const commands = [\n 'status',\n '--porcelain',\n '-b',\n '-u',\n '--null',\n ...customArgs.filter((arg) => !ignoredOptions.includes(arg)),\n ];\n\n return {\n format: 'utf-8',\n commands,\n parser(text: string) {\n return parseStatusSummary(text);\n },\n };\n}\n","import type { SimpleGitApi } from '../simple-git-api';\nimport type { SimpleGit } from '../../../typings';\nimport { asNumber, ExitCodes, LineParser, parseStringResponse } from '../utils';\n\nexport interface VersionResult {\n major: number;\n minor: number;\n patch: number | string;\n agent: string;\n installed: boolean;\n}\n\nconst NOT_INSTALLED = 'installed=false';\n\nfunction versionResponse(\n major = 0,\n minor = 0,\n patch: string | number = 0,\n agent = '',\n installed = true\n): VersionResult {\n return Object.defineProperty(\n {\n major,\n minor,\n patch,\n agent,\n installed,\n },\n 'toString',\n {\n value() {\n return `${this.major}.${this.minor}.${this.patch}`;\n },\n configurable: false,\n enumerable: false,\n }\n );\n}\n\nfunction notInstalledResponse() {\n return versionResponse(0, 0, 0, '', false);\n}\n\nexport default function (): Pick<SimpleGit, 'version'> {\n return {\n version(this: SimpleGitApi) {\n return this._runTask({\n commands: ['--version'],\n format: 'utf-8',\n parser: versionParser,\n onError(result, error, done, fail) {\n if (result.exitCode === ExitCodes.NOT_FOUND) {\n return done(Buffer.from(NOT_INSTALLED));\n }\n\n fail(error);\n },\n });\n },\n };\n}\n\nconst parsers: LineParser<VersionResult>[] = [\n new LineParser(\n /version (\\d+)\\.(\\d+)\\.(\\d+)(?:\\s*\\((.+)\\))?/,\n (result, [major, minor, patch, agent = '']) => {\n Object.assign(\n result,\n versionResponse(asNumber(major), asNumber(minor), asNumber(patch), agent)\n );\n }\n ),\n new LineParser(\n /version (\\d+)\\.(\\d+)\\.(\\D+)(.+)?$/,\n (result, [major, minor, patch, agent = '']) => {\n Object.assign(result, versionResponse(asNumber(major), asNumber(minor), patch, agent));\n }\n ),\n];\n\nfunction versionParser(stdOut: string) {\n if (stdOut === NOT_INSTALLED) {\n return notInstalledResponse();\n }\n\n return parseStringResponse(versionResponse(0, 0, 0, stdOut), parsers, stdOut);\n}\n","import { SimpleGitBase } from '../../typings';\nimport { taskCallback } from './task-callback';\nimport { changeWorkingDirectoryTask } from './tasks/change-working-directory';\nimport checkout from './tasks/checkout';\nimport countObjects from './tasks/count-objects';\nimport commit from './tasks/commit';\nimport config from './tasks/config';\nimport firstCommit from './tasks/first-commit';\nimport grep from './tasks/grep';\nimport { hashObjectTask } from './tasks/hash-object';\nimport { initTask } from './tasks/init';\nimport log from './tasks/log';\nimport { mergeTask } from './tasks/merge';\nimport { pushTask } from './tasks/push';\nimport show from './tasks/show';\nimport { statusTask } from './tasks/status';\nimport { configurationErrorTask, straightThroughStringTask } from './tasks/task';\nimport version from './tasks/version';\nimport { outputHandler, SimpleGitExecutor, SimpleGitTask, SimpleGitTaskCallback } from './types';\nimport {\n asArray,\n filterString,\n filterType,\n getTrailingOptions,\n trailingFunctionArgument,\n} from './utils';\n\nexport class SimpleGitApi implements SimpleGitBase {\n constructor(private _executor: SimpleGitExecutor) {}\n\n protected _runTask<T>(task: SimpleGitTask<T>, then?: SimpleGitTaskCallback<T>) {\n const chain = this._executor.chain();\n const promise = chain.push(task);\n\n if (then) {\n taskCallback(task, promise, then);\n }\n\n return Object.create(this, {\n then: { value: promise.then.bind(promise) },\n catch: { value: promise.catch.bind(promise) },\n _executor: { value: chain },\n });\n }\n\n add(files: string | string[]) {\n return this._runTask(\n straightThroughStringTask(['add', ...asArray(files)]),\n trailingFunctionArgument(arguments)\n );\n }\n\n cwd(directory: string | { path: string; root?: boolean }) {\n const next = trailingFunctionArgument(arguments);\n\n if (typeof directory === 'string') {\n return this._runTask(changeWorkingDirectoryTask(directory, this._executor), next);\n }\n\n if (typeof directory?.path === 'string') {\n return this._runTask(\n changeWorkingDirectoryTask(\n directory.path,\n (directory.root && this._executor) || undefined\n ),\n next\n );\n }\n\n return this._runTask(\n configurationErrorTask('Git.cwd: workingDirectory must be supplied as a string'),\n next\n );\n }\n\n hashObject(path: string, write: boolean | unknown) {\n return this._runTask(\n hashObjectTask(path, write === true),\n trailingFunctionArgument(arguments)\n );\n }\n\n init(bare?: boolean | unknown) {\n return this._runTask(\n initTask(bare === true, this._executor.cwd, getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n }\n\n merge() {\n return this._runTask(\n mergeTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n }\n\n mergeFromTo(remote: string, branch: string) {\n if (!(filterString(remote) && filterString(branch))) {\n return this._runTask(\n configurationErrorTask(\n `Git.mergeFromTo requires that the 'remote' and 'branch' arguments are supplied as strings`\n )\n );\n }\n\n return this._runTask(\n mergeTask([remote, branch, ...getTrailingOptions(arguments)]),\n trailingFunctionArgument(arguments, false)\n );\n }\n\n outputHandler(handler: outputHandler) {\n this._executor.outputHandler = handler;\n return this;\n }\n\n push() {\n const task = pushTask(\n {\n remote: filterType(arguments[0], filterString),\n branch: filterType(arguments[1], filterString),\n },\n getTrailingOptions(arguments)\n );\n\n return this._runTask(task, trailingFunctionArgument(arguments));\n }\n\n stash() {\n return this._runTask(\n straightThroughStringTask(['stash', ...getTrailingOptions(arguments)]),\n trailingFunctionArgument(arguments)\n );\n }\n\n status() {\n return this._runTask(\n statusTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n }\n}\n\nObject.assign(\n SimpleGitApi.prototype,\n checkout(),\n commit(),\n config(),\n countObjects(),\n firstCommit(),\n grep(),\n log(),\n show(),\n version()\n);\n","import { append, remove } from '../utils';\nimport { createDeferred, DeferredPromise } from '@kwsites/promise-deferred';\nimport { createLogger } from '../git-logger';\n\ntype ScheduleCompleteCallback = () => void;\ntype ScheduledTask = Pick<DeferredPromise<ScheduleCompleteCallback>, 'promise' | 'done'> & {\n id: number;\n};\n\nconst createScheduledTask: () => ScheduledTask = (() => {\n let id = 0;\n return () => {\n id++;\n const { promise, done } = createDeferred<ScheduleCompleteCallback>();\n\n return {\n promise,\n done,\n id,\n };\n };\n})();\n\nexport class Scheduler {\n private logger = createLogger('', 'scheduler');\n private pending: ScheduledTask[] = [];\n private running: ScheduledTask[] = [];\n\n constructor(private concurrency = 2) {\n this.logger(`Constructed, concurrency=%s`, concurrency);\n }\n\n private schedule() {\n if (!this.pending.length || this.running.length >= this.concurrency) {\n this.logger(\n `Schedule attempt ignored, pending=%s running=%s concurrency=%s`,\n this.pending.length,\n this.running.length,\n this.concurrency\n );\n return;\n }\n\n const task = append(this.running, this.pending.shift()!);\n this.logger(`Attempting id=%s`, task.id);\n task.done(() => {\n this.logger(`Completing id=`, task.id);\n remove(this.running, task);\n this.schedule();\n });\n }\n\n next(): Promise<ScheduleCompleteCallback> {\n const { promise, id } = append(this.pending, createScheduledTask());\n this.logger(`Scheduling id=%s`, id);\n\n this.schedule();\n\n return promise;\n }\n}\n","import { straightThroughStringTask } from './task';\nimport { OptionFlags, Options, StringTask } from '../types';\n\nexport type ApplyOptions = Options &\n OptionFlags<\n | '--stat'\n | '--numstat'\n | '--summary'\n | '--check'\n | '--index'\n | '--intent-to-add'\n | '--3way'\n | '--apply'\n | '--no-add'\n | '-R'\n | '--reverse'\n | '--allow-binary-replacement'\n | '--binary'\n | '--reject'\n | '-z'\n | '--inaccurate-eof'\n | '--recount'\n | '--cached'\n | '--ignore-space-change'\n | '--ignore-whitespace'\n | '--verbose'\n | '--unsafe-paths'\n > &\n OptionFlags<'--whitespace', 'nowarn' | 'warn' | 'fix' | 'error' | 'error-all'> &\n OptionFlags<'--build-fake-ancestor' | '--exclude' | '--include' | '--directory', string> &\n OptionFlags<'-p' | '-C', number>;\n\nexport function applyPatchTask(patches: string[], customArgs: string[]): StringTask<string> {\n return straightThroughStringTask(['apply', ...customArgs, ...patches]);\n}\n","import {\n BranchMultiDeleteResult,\n BranchSingleDeleteFailure,\n BranchSingleDeleteResult,\n BranchSingleDeleteSuccess,\n} from '../../../typings';\n\nexport class BranchDeletionBatch implements BranchMultiDeleteResult {\n all: BranchSingleDeleteResult[] = [];\n branches: { [branchName: string]: BranchSingleDeleteResult } = {};\n errors: BranchSingleDeleteResult[] = [];\n\n get success(): boolean {\n return !this.errors.length;\n }\n}\n\nexport function branchDeletionSuccess(branch: string, hash: string): BranchSingleDeleteSuccess {\n return {\n branch,\n hash,\n success: true,\n };\n}\n\nexport function branchDeletionFailure(branch: string): BranchSingleDeleteFailure {\n return {\n branch,\n hash: null,\n success: false,\n };\n}\n\nexport function isSingleBranchDeleteFailure(\n test: BranchSingleDeleteResult\n): test is BranchSingleDeleteSuccess {\n return test.success;\n}\n","import { BranchMultiDeleteResult } from '../../../typings';\nimport {\n BranchDeletionBatch,\n branchDeletionFailure,\n branchDeletionSuccess,\n} from '../responses/BranchDeleteSummary';\nimport { TaskParser } from '../types';\nimport { ExitCodes, LineParser, parseStringResponse } from '../utils';\n\nconst deleteSuccessRegex = /(\\S+)\\s+\\(\\S+\\s([^)]+)\\)/;\nconst deleteErrorRegex = /^error[^']+'([^']+)'/m;\n\nconst parsers: LineParser<BranchMultiDeleteResult>[] = [\n new LineParser(deleteSuccessRegex, (result, [branch, hash]) => {\n const deletion = branchDeletionSuccess(branch, hash);\n\n result.all.push(deletion);\n result.branches[branch] = deletion;\n }),\n new LineParser(deleteErrorRegex, (result, [branch]) => {\n const deletion = branchDeletionFailure(branch);\n\n result.errors.push(deletion);\n result.all.push(deletion);\n result.branches[branch] = deletion;\n }),\n];\n\nexport const parseBranchDeletions: TaskParser<string, BranchMultiDeleteResult> = (\n stdOut,\n stdErr\n) => {\n return parseStringResponse(new BranchDeletionBatch(), parsers, [stdOut, stdErr]);\n};\n\nexport function hasBranchDeletionError(data: string, processExitCode: ExitCodes): boolean {\n return processExitCode === ExitCodes.ERROR && deleteErrorRegex.test(data);\n}\n","import type { BranchSummary, BranchSummaryBranch } from '../../../typings';\n\nexport enum BranchStatusIdentifier {\n CURRENT = '*',\n LINKED = '+',\n}\n\nexport class BranchSummaryResult implements BranchSummary {\n public all: string[] = [];\n public branches: { [p: string]: BranchSummaryBranch } = {};\n public current: string = '';\n public detached: boolean = false;\n\n push(\n status: BranchStatusIdentifier | unknown,\n detached: boolean,\n name: string,\n commit: string,\n label: string\n ) {\n if (status === BranchStatusIdentifier.CURRENT) {\n this.detached = detached;\n this.current = name;\n }\n\n this.all.push(name);\n this.branches[name] = {\n current: status === BranchStatusIdentifier.CURRENT,\n linkedWorkTree: status === BranchStatusIdentifier.LINKED,\n name,\n commit,\n label,\n };\n }\n}\n","import type { BranchSummary } from '../../../typings';\nimport { BranchStatusIdentifier, BranchSummaryResult } from '../responses/BranchSummary';\nimport { LineParser, parseStringResponse } from '../utils';\n\nconst parsers: LineParser<BranchSummaryResult>[] = [\n new LineParser(\n /^([*+]\\s)?\\((?:HEAD )?detached (?:from|at) (\\S+)\\)\\s+([a-z0-9]+)\\s(.*)$/,\n (result, [current, name, commit, label]) => {\n result.push(branchStatus(current), true, name, commit, label);\n }\n ),\n new LineParser(\n /^([*+]\\s)?(\\S+)\\s+([a-z0-9]+)\\s?(.*)$/s,\n (result, [current, name, commit, label]) => {\n result.push(branchStatus(current), false, name, commit, label);\n }\n ),\n];\n\nconst currentBranchParser = new LineParser<BranchSummaryResult>(/^(\\S+)$/s, (result, [name]) => {\n result.push(BranchStatusIdentifier.CURRENT, false, name, '', '');\n});\n\nfunction branchStatus(input?: string) {\n return input ? input.charAt(0) : '';\n}\n\nexport function parseBranchSummary(stdOut: string, currentOnly = false): BranchSummary {\n return parseStringResponse(\n new BranchSummaryResult(),\n currentOnly ? [currentBranchParser] : parsers,\n stdOut\n );\n}\n","import { BranchMultiDeleteResult, BranchSingleDeleteResult, BranchSummary } from '../../../typings';\nimport { StringTask } from '../types';\nimport { GitResponseError } from '../errors/git-response-error';\nimport { hasBranchDeletionError, parseBranchDeletions } from '../parsers/parse-branch-delete';\nimport { parseBranchSummary } from '../parsers/parse-branch';\nimport { bufferToString } from '../utils';\n\nexport function containsDeleteBranchCommand(commands: string[]) {\n const deleteCommands = ['-d', '-D', '--delete'];\n return commands.some((command) => deleteCommands.includes(command));\n}\n\nexport function branchTask(\n customArgs: string[]\n): StringTask<BranchSummary | BranchSingleDeleteResult> {\n const isDelete = containsDeleteBranchCommand(customArgs);\n const isCurrentOnly = customArgs.includes('--show-current');\n\n const commands = ['branch', ...customArgs];\n\n if (commands.length === 1) {\n commands.push('-a');\n }\n\n if (!commands.includes('-v')) {\n commands.splice(1, 0, '-v');\n }\n\n return {\n format: 'utf-8',\n commands,\n parser(stdOut, stdErr) {\n if (isDelete) {\n return parseBranchDeletions(stdOut, stdErr).all[0];\n }\n\n return parseBranchSummary(stdOut, isCurrentOnly);\n },\n };\n}\n\nexport function branchLocalTask(): StringTask<BranchSummary> {\n return {\n format: 'utf-8',\n commands: ['branch', '-v'],\n parser(stdOut) {\n return parseBranchSummary(stdOut);\n },\n };\n}\n\nexport function deleteBranchesTask(\n branches: string[],\n forceDelete = false\n): StringTask<BranchMultiDeleteResult> {\n return {\n format: 'utf-8',\n commands: ['branch', '-v', forceDelete ? '-D' : '-d', ...branches],\n parser(stdOut, stdErr) {\n return parseBranchDeletions(stdOut, stdErr);\n },\n onError({ exitCode, stdOut }, error, done, fail) {\n if (!hasBranchDeletionError(String(error), exitCode)) {\n return fail(error);\n }\n\n done(stdOut);\n },\n };\n}\n\nexport function deleteBranchTask(\n branch: string,\n forceDelete = false\n): StringTask<BranchSingleDeleteResult> {\n const task: StringTask<BranchSingleDeleteResult> = {\n format: 'utf-8',\n commands: ['branch', '-v', forceDelete ? '-D' : '-d', branch],\n parser(stdOut, stdErr) {\n return parseBranchDeletions(stdOut, stdErr).branches[branch]!;\n },\n onError({ exitCode, stdErr, stdOut }, error, _, fail) {\n if (!hasBranchDeletionError(String(error), exitCode)) {\n return fail(error);\n }\n\n throw new GitResponseError(\n task.parser(bufferToString(stdOut), bufferToString(stdErr)),\n String(error)\n );\n },\n };\n\n return task;\n}\n","import { normalize } from 'node:path';\n\n/**\n * Parser for the `check-ignore` command - returns each file as a string array\n */\nexport const parseCheckIgnore = (text: string): string[] => {\n return text.split(/\\n/g).map(toPath).filter(Boolean);\n};\n\nfunction toPath(input: string) {\n const path = input.trim().replace(/^[\"']|[\"']$/g, '');\n return path && normalize(path);\n}\n","import { StringTask } from '../types';\nimport { parseCheckIgnore } from '../responses/CheckIgnore';\n\nexport function checkIgnoreTask(paths: string[]): StringTask<string[]> {\n return {\n commands: ['check-ignore', ...paths],\n format: 'utf-8',\n parser: parseCheckIgnore,\n };\n}\n","import { configurationErrorTask, EmptyTask, straightThroughStringTask } from './task';\nimport { OptionFlags, Options, StringTask } from '../types';\nimport { append, filterString } from '../utils';\n\nexport type CloneOptions = Options &\n OptionFlags<\n | '--bare'\n | '--dissociate'\n | '--mirror'\n | '--no-checkout'\n | '--no-remote-submodules'\n | '--no-shallow-submodules'\n | '--no-single-branch'\n | '--no-tags'\n | '--remote-submodules'\n | '--single-branch'\n | '--shallow-submodules'\n | '--verbose'\n > &\n OptionFlags<'--depth' | '-j' | '--jobs', number> &\n OptionFlags<\n | '--branch'\n | '--origin'\n | '--recurse-submodules'\n | '--separate-git-dir'\n | '--shallow-exclude'\n | '--shallow-since'\n | '--template',\n string\n >;\n\nfunction disallowedCommand(command: string) {\n return /^--upload-pack(=|$)/.test(command);\n}\n\nexport function cloneTask(\n repo: string | undefined,\n directory: string | undefined,\n customArgs: string[]\n): StringTask<string> | EmptyTask {\n const commands = ['clone', ...customArgs];\n\n filterString(repo) && commands.push(repo);\n filterString(directory) && commands.push(directory);\n\n const banned = commands.find(disallowedCommand);\n if (banned) {\n return configurationErrorTask(`git.fetch: potential exploit argument blocked.`);\n }\n\n return straightThroughStringTask(commands);\n}\n\nexport function cloneMirrorTask(\n repo: string | undefined,\n directory: string | undefined,\n customArgs: string[]\n) {\n append(customArgs, '--mirror');\n\n return cloneTask(repo, directory, customArgs);\n}\n","import { FetchResult } from '../../../typings';\nimport { LineParser, parseStringResponse } from '../utils';\n\nconst parsers: LineParser<FetchResult>[] = [\n new LineParser(/From (.+)$/, (result, [remote]) => {\n result.remote = remote;\n }),\n new LineParser(/\\* \\[new branch]\\s+(\\S+)\\s*-> (.+)$/, (result, [name, tracking]) => {\n result.branches.push({\n name,\n tracking,\n });\n }),\n new LineParser(/\\* \\[new tag]\\s+(\\S+)\\s*-> (.+)$/, (result, [name, tracking]) => {\n result.tags.push({\n name,\n tracking,\n });\n }),\n new LineParser(/- \\[deleted]\\s+\\S+\\s*-> (.+)$/, (result, [tracking]) => {\n result.deleted.push({\n tracking,\n });\n }),\n new LineParser(\n /\\s*([^.]+)\\.\\.(\\S+)\\s+(\\S+)\\s*-> (.+)$/,\n (result, [from, to, name, tracking]) => {\n result.updated.push({\n name,\n tracking,\n to,\n from,\n });\n }\n ),\n];\n\nexport function parseFetchResult(stdOut: string, stdErr: string): FetchResult {\n const result: FetchResult = {\n raw: stdOut,\n remote: null,\n branches: [],\n tags: [],\n updated: [],\n deleted: [],\n };\n return parseStringResponse(result, parsers, [stdOut, stdErr]);\n}\n","import { FetchResult } from '../../../typings';\nimport { parseFetchResult } from '../parsers/parse-fetch';\nimport { StringTask } from '../types';\n\nimport { configurationErrorTask, EmptyTask } from './task';\n\nfunction disallowedCommand(command: string) {\n return /^--upload-pack(=|$)/.test(command);\n}\n\nexport function fetchTask(\n remote: string,\n branch: string,\n customArgs: string[]\n): StringTask<FetchResult> | EmptyTask {\n const commands = ['fetch', ...customArgs];\n if (remote && branch) {\n commands.push(remote, branch);\n }\n\n const banned = commands.find(disallowedCommand);\n if (banned) {\n return configurationErrorTask(`git.fetch: potential exploit argument blocked.`);\n }\n\n return {\n commands,\n format: 'utf-8',\n parser: parseFetchResult,\n };\n}\n","import { MoveResult } from '../../../typings';\nimport { LineParser, parseStringResponse } from '../utils';\n\nconst parsers: LineParser<MoveResult>[] = [\n new LineParser(/^Renaming (.+) to (.+)$/, (result, [from, to]) => {\n result.moves.push({ from, to });\n }),\n];\n\nexport function parseMoveResult(stdOut: string): MoveResult {\n return parseStringResponse({ moves: [] }, parsers, stdOut);\n}\n","import { MoveResult } from '../../../typings';\nimport { parseMoveResult } from '../parsers/parse-move';\nimport { StringTask } from '../types';\nimport { asArray } from '../utils';\n\nexport function moveTask(from: string | string[], to: string): StringTask<MoveResult> {\n return {\n commands: ['mv', '-v', ...asArray(from), to],\n format: 'utf-8',\n parser: parseMoveResult,\n };\n}\n","import { PullResult } from '../../../typings';\nimport { GitResponseError } from '../errors/git-response-error';\nimport { parsePullErrorResult, parsePullResult } from '../parsers/parse-pull';\nimport { Maybe, StringTask } from '../types';\nimport { bufferToString } from '../utils';\n\nexport function pullTask(\n remote: Maybe<string>,\n branch: Maybe<string>,\n customArgs: string[]\n): StringTask<PullResult> {\n const commands: string[] = ['pull', ...customArgs];\n if (remote && branch) {\n commands.splice(1, 0, remote, branch);\n }\n\n return {\n commands,\n format: 'utf-8',\n parser(stdOut, stdErr): PullResult {\n return parsePullResult(stdOut, stdErr);\n },\n onError(result, _error, _done, fail) {\n const pullError = parsePullErrorResult(\n bufferToString(result.stdOut),\n bufferToString(result.stdErr)\n );\n if (pullError) {\n return fail(new GitResponseError(pullError));\n }\n\n fail(_error);\n },\n };\n}\n","import { forEachLineWithContent } from '../utils';\n\nexport interface RemoteWithoutRefs {\n name: string;\n}\n\nexport interface RemoteWithRefs extends RemoteWithoutRefs {\n refs: {\n fetch: string;\n push: string;\n };\n}\n\nexport function parseGetRemotes(text: string): RemoteWithoutRefs[] {\n const remotes: { [name: string]: RemoteWithoutRefs } = {};\n\n forEach(text, ([name]) => (remotes[name] = { name }));\n\n return Object.values(remotes);\n}\n\nexport function parseGetRemotesVerbose(text: string): RemoteWithRefs[] {\n const remotes: { [name: string]: RemoteWithRefs } = {};\n\n forEach(text, ([name, url, purpose]) => {\n if (!Object.hasOwn(remotes, name)) {\n remotes[name] = {\n name: name,\n refs: { fetch: '', push: '' },\n };\n }\n\n if (purpose && url) {\n remotes[name].refs[purpose.replace(/[^a-z]/g, '') as keyof RemoteWithRefs['refs']] = url;\n }\n });\n\n return Object.values(remotes);\n}\n\nfunction forEach(text: string, handler: (line: string[]) => void) {\n forEachLineWithContent(text, (line) => handler(line.split(/\\s+/)));\n}\n","import {\n parseGetRemotes,\n parseGetRemotesVerbose,\n type RemoteWithoutRefs,\n type RemoteWithRefs,\n} from '../responses/GetRemoteSummary';\nimport type { StringTask } from '../types';\nimport { straightThroughStringTask } from './task';\n\nexport function addRemoteTask(\n remoteName: string,\n remoteRepo: string,\n customArgs: string[]\n): StringTask<string> {\n return straightThroughStringTask(['remote', 'add', ...customArgs, remoteName, remoteRepo]);\n}\n\nexport function getRemotesTask(verbose: true): StringTask<RemoteWithRefs[]>;\nexport function getRemotesTask(verbose: false): StringTask<RemoteWithoutRefs[]>;\nexport function getRemotesTask(\n verbose: boolean\n): StringTask<RemoteWithRefs[] | RemoteWithoutRefs[]> {\n const commands = ['remote'];\n if (verbose) {\n commands.push('-v');\n }\n\n return {\n commands,\n format: 'utf-8',\n parser: verbose ? parseGetRemotesVerbose : parseGetRemotes,\n };\n}\n\nexport function listRemotesTask(customArgs: string[]): StringTask<string> {\n const commands = [...customArgs];\n if (commands[0] !== 'ls-remote') {\n commands.unshift('ls-remote');\n }\n\n return straightThroughStringTask(commands);\n}\n\nexport function remoteTask(customArgs: string[]): StringTask<string> {\n const commands = [...customArgs];\n if (commands[0] !== 'remote') {\n commands.unshift('remote');\n }\n\n return straightThroughStringTask(commands);\n}\n\nexport function removeRemoteTask(remoteName: string) {\n return straightThroughStringTask(['remote', 'remove', remoteName]);\n}\n","import { LogOptions, LogResult } from '../../../typings';\nimport { logFormatFromCommand } from '../args/log-format';\nimport { createListLogSummaryParser } from '../parsers/parse-list-log-summary';\nimport type { StringTask } from '../types';\nimport { validateLogFormatConfig } from './diff';\nimport { parseLogOptions } from './log';\nimport type { EmptyTask } from './task';\n\nexport function stashListTask(\n opt: LogOptions = {},\n customArgs: string[]\n): EmptyTask | StringTask<LogResult> {\n const options = parseLogOptions<any>(opt);\n const commands = ['stash', 'list', ...options.commands, ...customArgs];\n const parser = createListLogSummaryParser(\n options.splitter,\n options.fields,\n logFormatFromCommand(commands)\n );\n\n return (\n validateLogFormatConfig(commands) || {\n commands,\n format: 'utf-8',\n parser,\n }\n );\n}\n","import { StringTask } from '../types';\nimport { straightThroughStringTask } from './task';\n\nexport function addSubModuleTask(repo: string, path: string): StringTask<string> {\n return subModuleTask(['add', repo, path]);\n}\n\nexport function initSubModuleTask(customArgs: string[]): StringTask<string> {\n return subModuleTask(['init', ...customArgs]);\n}\n\nexport function subModuleTask(customArgs: string[]): StringTask<string> {\n const commands = [...customArgs];\n if (commands[0] !== 'submodule') {\n commands.unshift('submodule');\n }\n\n return straightThroughStringTask(commands);\n}\n\nexport function updateSubModuleTask(customArgs: string[]): StringTask<string> {\n return subModuleTask(['update', ...customArgs]);\n}\n","import { TagResult } from '../../../typings';\n\nexport class TagList implements TagResult {\n constructor(\n public readonly all: string[],\n public readonly latest: string | undefined\n ) {}\n}\n\nexport const parseTagList = function (data: string, customSort = false) {\n const tags = data.split('\\n').map(trimmed).filter(Boolean);\n\n if (!customSort) {\n tags.sort(function (tagA, tagB) {\n const partsA = tagA.split('.');\n const partsB = tagB.split('.');\n\n if (partsA.length === 1 || partsB.length === 1) {\n return singleSorted(toNumber(partsA[0]), toNumber(partsB[0]));\n }\n\n for (let i = 0, l = Math.max(partsA.length, partsB.length); i < l; i++) {\n const diff = sorted(toNumber(partsA[i]), toNumber(partsB[i]));\n\n if (diff) {\n return diff;\n }\n }\n\n return 0;\n });\n }\n\n const latest = customSort ? tags[0] : [...tags].reverse().find((tag) => tag.indexOf('.') >= 0);\n\n return new TagList(tags, latest);\n};\n\nfunction singleSorted(a: number, b: number): number {\n const aIsNum = Number.isNaN(a);\n const bIsNum = Number.isNaN(b);\n\n if (aIsNum !== bIsNum) {\n return aIsNum ? 1 : -1;\n }\n\n return aIsNum ? sorted(a, b) : 0;\n}\n\nfunction sorted(a: number, b: number) {\n return a === b ? 0 : a > b ? 1 : -1;\n}\n\nfunction trimmed(input: string) {\n return input.trim();\n}\n\nfunction toNumber(input: string | undefined) {\n if (typeof input === 'string') {\n return parseInt(input.replace(/^\\D+/g, ''), 10) || 0;\n }\n\n return 0;\n}\n","import { TagResult } from '../../../typings';\nimport { parseTagList } from '../responses/TagList';\nimport { StringTask } from '../types';\n\n/**\n * Task used by `git.tags`\n */\nexport function tagListTask(customArgs: string[] = []): StringTask<TagResult> {\n const hasCustomSort = customArgs.some((option) => /^--sort=/.test(option));\n\n return {\n format: 'utf-8',\n commands: ['tag', '-l', ...customArgs],\n parser(text: string) {\n return parseTagList(text, hasCustomSort);\n },\n };\n}\n\n/**\n * Task used by `git.addTag`\n */\nexport function addTagTask(name: string): StringTask<{ name: string }> {\n return {\n format: 'utf-8',\n commands: ['tag', name],\n parser() {\n return { name };\n },\n };\n}\n\n/**\n * Task used by `git.addTag`\n */\nexport function addAnnotatedTagTask(\n name: string,\n tagMessage: string\n): StringTask<{ name: string }> {\n return {\n format: 'utf-8',\n commands: ['tag', '-a', '-m', tagMessage, name],\n parser() {\n return { name };\n },\n };\n}\n","const { GitExecutor } = require('./lib/runners/git-executor');\nconst { SimpleGitApi } = require('./lib/simple-git-api');\n\nconst { Scheduler } = require('./lib/runners/scheduler');\nconst { configurationErrorTask } = require('./lib/tasks/task');\nconst {\n asArray,\n filterArray,\n filterPrimitives,\n filterString,\n filterStringOrStringArray,\n filterType,\n getTrailingOptions,\n trailingFunctionArgument,\n trailingOptionsArgument,\n} = require('./lib/utils');\nconst { applyPatchTask } = require('./lib/tasks/apply-patch');\nconst {\n branchTask,\n branchLocalTask,\n deleteBranchesTask,\n deleteBranchTask,\n} = require('./lib/tasks/branch');\nconst { checkIgnoreTask } = require('./lib/tasks/check-ignore');\nconst { checkIsRepoTask } = require('./lib/tasks/check-is-repo');\nconst { cloneTask, cloneMirrorTask } = require('./lib/tasks/clone');\nconst { cleanWithOptionsTask, isCleanOptionsArray } = require('./lib/tasks/clean');\nconst { diffSummaryTask } = require('./lib/tasks/diff');\nconst { fetchTask } = require('./lib/tasks/fetch');\nconst { moveTask } = require('./lib/tasks/move');\nconst { pullTask } = require('./lib/tasks/pull');\nconst { pushTagsTask } = require('./lib/tasks/push');\nconst {\n addRemoteTask,\n getRemotesTask,\n listRemotesTask,\n remoteTask,\n removeRemoteTask,\n} = require('./lib/tasks/remote');\nconst { getResetMode, resetTask } = require('./lib/tasks/reset');\nconst { stashListTask } = require('./lib/tasks/stash-list');\nconst {\n addSubModuleTask,\n initSubModuleTask,\n subModuleTask,\n updateSubModuleTask,\n} = require('./lib/tasks/sub-module');\nconst { addAnnotatedTagTask, addTagTask, tagListTask } = require('./lib/tasks/tag');\nconst { straightThroughBufferTask, straightThroughStringTask } = require('./lib/tasks/task');\n\nfunction Git(options, plugins) {\n this._plugins = plugins;\n this._executor = new GitExecutor(\n options.baseDir,\n new Scheduler(options.maxConcurrentProcesses),\n plugins\n );\n\n this._trimmed = options.trimmed;\n}\n\n(Git.prototype = Object.create(SimpleGitApi.prototype)).constructor = Git;\n\n/**\n * Sets the path to a custom git binary, should either be `git` when there is an installation of git available on\n * the system path, or a fully qualified path to the executable.\n */\nGit.prototype.customBinary = function (command) {\n this._plugins.reconfigure('binary', command);\n return this;\n};\n\n/**\n * Sets an environment variable for the spawned child process, either supply both a name and value as strings or\n * a single object to entirely replace the current environment variables.\n *\n * @param {string|Object} name\n * @param {string} [value]\n * @returns {Git}\n */\nGit.prototype.env = function (name, value) {\n if (arguments.length === 1 && typeof name === 'object') {\n this._executor.env = name;\n } else {\n (this._executor.env = this._executor.env || {})[name] = value;\n }\n\n return this;\n};\n\n/**\n * List the stash(s) of the local repo\n */\nGit.prototype.stashList = function (options) {\n return this._runTask(\n stashListTask(\n trailingOptionsArgument(arguments) || {},\n (filterArray(options) && options) || []\n ),\n trailingFunctionArgument(arguments)\n );\n};\n\nfunction createCloneTask(api, task, repoPath, localPath) {\n if (typeof repoPath !== 'string') {\n return configurationErrorTask(`git.${api}() requires a string 'repoPath'`);\n }\n\n return task(repoPath, filterType(localPath, filterString), getTrailingOptions(arguments));\n}\n\n/**\n * Clone a git repo\n */\nGit.prototype.clone = function () {\n return this._runTask(\n createCloneTask('clone', cloneTask, ...arguments),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Mirror a git repo\n */\nGit.prototype.mirror = function () {\n return this._runTask(\n createCloneTask('mirror', cloneMirrorTask, ...arguments),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Moves one or more files to a new destination.\n *\n * @see https://git-scm.com/docs/git-mv\n *\n * @param {string|string[]} from\n * @param {string} to\n */\nGit.prototype.mv = function (from, to) {\n return this._runTask(moveTask(from, to), trailingFunctionArgument(arguments));\n};\n\n/**\n * Internally uses pull and tags to get the list of tags then checks out the latest tag.\n *\n * @param {Function} [then]\n */\nGit.prototype.checkoutLatestTag = function (then) {\n var git = this;\n return this.pull(function () {\n git.tags(function (err, tags) {\n git.checkout(tags.latest, then);\n });\n });\n};\n\n/**\n * Pull the updated contents of the current repo\n */\nGit.prototype.pull = function (remote, branch, options, then) {\n return this._runTask(\n pullTask(\n filterType(remote, filterString),\n filterType(branch, filterString),\n getTrailingOptions(arguments)\n ),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Fetch the updated contents of the current repo.\n *\n * @example\n * .fetch('upstream', 'master') // fetches from master on remote named upstream\n * .fetch(function () {}) // runs fetch against default remote and branch and calls function\n *\n * @param {string} [remote]\n * @param {string} [branch]\n */\nGit.prototype.fetch = function (remote, branch) {\n return this._runTask(\n fetchTask(\n filterType(remote, filterString),\n filterType(branch, filterString),\n getTrailingOptions(arguments)\n ),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Disables/enables the use of the console for printing warnings and errors, by default messages are not shown in\n * a production environment.\n *\n * @param {boolean} silence\n * @returns {Git}\n */\nGit.prototype.silent = function (silence) {\n console.warn(\n 'simple-git deprecation notice: git.silent: logging should be configured using the `debug` library / `DEBUG` environment variable, this will be an error in version 3'\n );\n return this;\n};\n\n/**\n * List all tags. When using git 2.7.0 or above, include an options object with `\"--sort\": \"property-name\"` to\n * sort the tags by that property instead of using the default semantic versioning sort.\n *\n * Note, supplying this option when it is not supported by your Git version will cause the operation to fail.\n *\n * @param {Object} [options]\n * @param {Function} [then]\n */\nGit.prototype.tags = function (options, then) {\n return this._runTask(\n tagListTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Rebases the current working copy. Options can be supplied either as an array of string parameters\n * to be sent to the `git rebase` command, or a standard options object.\n */\nGit.prototype.rebase = function () {\n return this._runTask(\n straightThroughStringTask(['rebase', ...getTrailingOptions(arguments)]),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Reset a repo\n */\nGit.prototype.reset = function (mode) {\n return this._runTask(\n resetTask(getResetMode(mode), getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Revert one or more commits in the local working copy\n */\nGit.prototype.revert = function (commit) {\n const next = trailingFunctionArgument(arguments);\n\n if (typeof commit !== 'string') {\n return this._runTask(configurationErrorTask('Commit must be a string'), next);\n }\n\n return this._runTask(\n straightThroughStringTask(['revert', ...getTrailingOptions(arguments, 0, true), commit]),\n next\n );\n};\n\n/**\n * Add a lightweight tag to the head of the current branch\n */\nGit.prototype.addTag = function (name) {\n const task =\n typeof name === 'string'\n ? addTagTask(name)\n : configurationErrorTask('Git.addTag requires a tag name');\n\n return this._runTask(task, trailingFunctionArgument(arguments));\n};\n\n/**\n * Add an annotated tag to the head of the current branch\n */\nGit.prototype.addAnnotatedTag = function (tagName, tagMessage) {\n return this._runTask(\n addAnnotatedTagTask(tagName, tagMessage),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Delete a local branch\n */\nGit.prototype.deleteLocalBranch = function (branchName, forceDelete, then) {\n return this._runTask(\n deleteBranchTask(branchName, typeof forceDelete === 'boolean' ? forceDelete : false),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Delete one or more local branches\n */\nGit.prototype.deleteLocalBranches = function (branchNames, forceDelete, then) {\n return this._runTask(\n deleteBranchesTask(branchNames, typeof forceDelete === 'boolean' ? forceDelete : false),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * List all branches\n *\n * @param {Object | string[]} [options]\n * @param {Function} [then]\n */\nGit.prototype.branch = function (options, then) {\n return this._runTask(\n branchTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Return list of local branches\n *\n * @param {Function} [then]\n */\nGit.prototype.branchLocal = function (then) {\n return this._runTask(branchLocalTask(), trailingFunctionArgument(arguments));\n};\n\n/**\n * Executes any command against the git binary.\n */\nGit.prototype.raw = function (commands) {\n const createRestCommands = !Array.isArray(commands);\n const command = [].slice.call(createRestCommands ? arguments : commands, 0);\n\n for (let i = 0; i < command.length && createRestCommands; i++) {\n if (!filterPrimitives(command[i])) {\n command.splice(i, command.length - i);\n break;\n }\n }\n\n command.push(...getTrailingOptions(arguments, 0, true));\n\n var next = trailingFunctionArgument(arguments);\n\n if (!command.length) {\n return this._runTask(\n configurationErrorTask('Raw: must supply one or more command to execute'),\n next\n );\n }\n\n return this._runTask(straightThroughStringTask(command, this._trimmed), next);\n};\n\nGit.prototype.submoduleAdd = function (repo, path, then) {\n return this._runTask(addSubModuleTask(repo, path), trailingFunctionArgument(arguments));\n};\n\nGit.prototype.submoduleUpdate = function (args, then) {\n return this._runTask(\n updateSubModuleTask(getTrailingOptions(arguments, true)),\n trailingFunctionArgument(arguments)\n );\n};\n\nGit.prototype.submoduleInit = function (args, then) {\n return this._runTask(\n initSubModuleTask(getTrailingOptions(arguments, true)),\n trailingFunctionArgument(arguments)\n );\n};\n\nGit.prototype.subModule = function (options, then) {\n return this._runTask(\n subModuleTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\nGit.prototype.listRemote = function () {\n return this._runTask(\n listRemotesTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Adds a remote to the list of remotes.\n */\nGit.prototype.addRemote = function (remoteName, remoteRepo, then) {\n return this._runTask(\n addRemoteTask(remoteName, remoteRepo, getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Removes an entry by name from the list of remotes.\n */\nGit.prototype.removeRemote = function (remoteName, then) {\n return this._runTask(removeRemoteTask(remoteName), trailingFunctionArgument(arguments));\n};\n\n/**\n * Gets the currently available remotes, setting the optional verbose argument to true includes additional\n * detail on the remotes themselves.\n */\nGit.prototype.getRemotes = function (verbose, then) {\n return this._runTask(getRemotesTask(verbose === true), trailingFunctionArgument(arguments));\n};\n\n/**\n * Call any `git remote` function with arguments passed as an array of strings.\n *\n * @param {string[]} options\n * @param {Function} [then]\n */\nGit.prototype.remote = function (options, then) {\n return this._runTask(\n remoteTask(getTrailingOptions(arguments)),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Call any `git tag` function with arguments passed as an array of strings.\n *\n * @param {string[]} options\n * @param {Function} [then]\n */\nGit.prototype.tag = function (options, then) {\n const command = getTrailingOptions(arguments);\n\n if (command[0] !== 'tag') {\n command.unshift('tag');\n }\n\n return this._runTask(straightThroughStringTask(command), trailingFunctionArgument(arguments));\n};\n\n/**\n * Updates repository server info\n *\n * @param {Function} [then]\n */\nGit.prototype.updateServerInfo = function (then) {\n return this._runTask(\n straightThroughStringTask(['update-server-info']),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Pushes the current tag changes to a remote which can be either a URL or named remote. When not specified uses the\n * default configured remote spec.\n *\n * @param {string} [remote]\n * @param {Function} [then]\n */\nGit.prototype.pushTags = function (remote, then) {\n const task = pushTagsTask(\n { remote: filterType(remote, filterString) },\n getTrailingOptions(arguments)\n );\n\n return this._runTask(task, trailingFunctionArgument(arguments));\n};\n\n/**\n * Removes the named files from source control.\n */\nGit.prototype.rm = function (files) {\n return this._runTask(\n straightThroughStringTask(['rm', '-f', ...asArray(files)]),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Removes the named files from source control but keeps them on disk rather than deleting them entirely. To\n * completely remove the files, use `rm`.\n *\n * @param {string|string[]} files\n */\nGit.prototype.rmKeepLocal = function (files) {\n return this._runTask(\n straightThroughStringTask(['rm', '--cached', ...asArray(files)]),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n * Returns a list of objects in a tree based on commit hash. Passing in an object hash returns the object's content,\n * size, and type.\n *\n * Passing \"-p\" will instruct cat-file to determine the object type, and display its formatted contents.\n *\n * @param {string[]} [options]\n * @param {Function} [then]\n */\nGit.prototype.catFile = function (options, then) {\n return this._catFile('utf-8', arguments);\n};\n\nGit.prototype.binaryCatFile = function () {\n return this._catFile('buffer', arguments);\n};\n\nGit.prototype._catFile = function (format, args) {\n var handler = trailingFunctionArgument(args);\n var command = ['cat-file'];\n var options = args[0];\n\n if (typeof options === 'string') {\n return this._runTask(\n configurationErrorTask('Git.catFile: options must be supplied as an array of strings'),\n handler\n );\n }\n\n if (Array.isArray(options)) {\n command.push.apply(command, options);\n }\n\n const task =\n format === 'buffer' ? straightThroughBufferTask(command) : straightThroughStringTask(command);\n\n return this._runTask(task, handler);\n};\n\nGit.prototype.diff = function (options, then) {\n const task = filterString(options)\n ? configurationErrorTask(\n 'git.diff: supplying options as a single string is no longer supported, switch to an array of strings'\n )\n : straightThroughStringTask(['diff', ...getTrailingOptions(arguments)]);\n\n return this._runTask(task, trailingFunctionArgument(arguments));\n};\n\nGit.prototype.diffSummary = function () {\n return this._runTask(\n diffSummaryTask(getTrailingOptions(arguments, 1)),\n trailingFunctionArgument(arguments)\n );\n};\n\nGit.prototype.applyPatch = function (patches) {\n const task = !filterStringOrStringArray(patches)\n ? configurationErrorTask(\n `git.applyPatch requires one or more string patches as the first argument`\n )\n : applyPatchTask(asArray(patches), getTrailingOptions([].slice.call(arguments, 1)));\n\n return this._runTask(task, trailingFunctionArgument(arguments));\n};\n\nGit.prototype.revparse = function () {\n const commands = ['rev-parse', ...getTrailingOptions(arguments, true)];\n return this._runTask(\n straightThroughStringTask(commands, true),\n trailingFunctionArgument(arguments)\n );\n};\n\n/**\n */\nGit.prototype.clean = function (mode, options, then) {\n const usingCleanOptionsArray = isCleanOptionsArray(mode);\n const cleanMode =\n (usingCleanOptionsArray && mode.join('')) || filterType(mode, filterString) || '';\n const customArgs = getTrailingOptions([].slice.call(arguments, usingCleanOptionsArray ? 1 : 0));\n\n return this._runTask(\n cleanWithOptionsTask(cleanMode, customArgs),\n trailingFunctionArgument(arguments)\n );\n};\n\nGit.prototype.exec = function (then) {\n const task = {\n commands: [],\n format: 'utf-8',\n parser() {\n if (typeof then === 'function') {\n then();\n }\n },\n };\n\n return this._runTask(task);\n};\n\n/**\n * Clears the queue of pending commands and returns the wrapper instance for chaining.\n *\n * @returns {Git}\n */\nGit.prototype.clearQueue = function () {\n // TODO:\n // this._executor.clear();\n return this;\n};\n\n/**\n * Check if a pathname or pathnames are excluded by .gitignore\n *\n * @param {string|string[]} pathnames\n * @param {Function} [then]\n */\nGit.prototype.checkIgnore = function (pathnames, then) {\n return this._runTask(\n checkIgnoreTask(asArray(filterType(pathnames, filterStringOrStringArray, []))),\n trailingFunctionArgument(arguments)\n );\n};\n\nGit.prototype.checkIsRepo = function (checkType, then) {\n return this._runTask(\n checkIsRepoTask(filterType(checkType, filterString)),\n trailingFunctionArgument(arguments)\n );\n};\n\nmodule.exports = Git;\n","import { pathspec } from './args/pathspec';\nimport { GitConstructError } from './errors/git-construct-error';\nimport { GitError } from './errors/git-error';\nimport { GitPluginError } from './errors/git-plugin-error';\nimport { GitResponseError } from './errors/git-response-error';\nimport { TaskConfigurationError } from './errors/task-configuration-error';\nimport { CheckRepoActions } from './tasks/check-is-repo';\nimport { CleanOptions } from './tasks/clean';\nimport { GitConfigScope } from './tasks/config';\nimport { DiffNameStatus } from './tasks/diff-name-status';\nimport { grepQueryBuilder } from './tasks/grep';\nimport { ResetMode } from './tasks/reset';\n\nexport {\n CheckRepoActions,\n CleanOptions,\n DiffNameStatus,\n GitConfigScope,\n GitConstructError,\n GitError,\n GitPluginError,\n GitResponseError,\n ResetMode,\n TaskConfigurationError,\n grepQueryBuilder,\n pathspec,\n};\n","import { GitError } from './git-error';\nimport { SimpleGitOptions } from '../types';\n\n/**\n * The `GitConstructError` is thrown when an error occurs in the constructor\n * of the `simple-git` instance itself. Most commonly as a result of using\n * a `baseDir` option that points to a folder that either does not exist,\n * or cannot be read by the user the node script is running as.\n *\n * Check the `.message` property for more detail including the properties\n * passed to the constructor.\n */\nexport class GitConstructError extends GitError {\n constructor(\n public readonly config: SimpleGitOptions,\n message: string\n ) {\n super(undefined, message);\n }\n}\n","import { SimpleGitOptions, SimpleGitTask } from '../types';\nimport { GitError } from './git-error';\n\nexport class GitPluginError extends GitError {\n constructor(\n public task?: SimpleGitTask<any>,\n public readonly plugin?: keyof SimpleGitOptions,\n message?: string\n ) {\n super(task, message);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { SimpleGitOptions } from '../types';\nimport { SimpleGitPlugin } from './simple-git-plugin';\nimport { GitPluginError } from '../errors/git-plugin-error';\n\nexport function abortPlugin(signal: SimpleGitOptions['abort']) {\n if (!signal) {\n return;\n }\n\n const onSpawnAfter: SimpleGitPlugin<'spawn.after'> = {\n type: 'spawn.after',\n action(_data, context) {\n function kill() {\n context.kill(new GitPluginError(undefined, 'abort', 'Abort signal received'));\n }\n\n signal.addEventListener('abort', kill);\n\n context.spawned.on('close', () => signal.removeEventListener('abort', kill));\n },\n };\n\n const onSpawnBefore: SimpleGitPlugin<'spawn.before'> = {\n type: 'spawn.before',\n action(_data, context) {\n if (signal.aborted) {\n context.kill(new GitPluginError(undefined, 'abort', 'Abort already signaled'));\n }\n },\n };\n\n return [onSpawnBefore, onSpawnAfter];\n}\n","import type { SimpleGitPlugin } from './simple-git-plugin';\n\nimport { GitPluginError } from '../errors/git-plugin-error';\nimport type { SimpleGitPluginConfig } from '../types';\n\nfunction isConfigSwitch(arg: string | unknown) {\n return typeof arg === 'string' && arg.trim().toLowerCase() === '-c';\n}\n\nfunction preventProtocolOverride(arg: string, next: string) {\n if (!isConfigSwitch(arg)) {\n return;\n }\n\n if (!/^\\s*protocol(.[a-z]+)?.allow/.test(next)) {\n return;\n }\n\n throw new GitPluginError(\n undefined,\n 'unsafe',\n 'Configuring protocol.allow is not permitted without enabling allowUnsafeExtProtocol'\n );\n}\n\nfunction preventUploadPack(arg: string, method: string) {\n if (/^\\s*--(upload|receive)-pack/.test(arg)) {\n throw new GitPluginError(\n undefined,\n 'unsafe',\n `Use of --upload-pack or --receive-pack is not permitted without enabling allowUnsafePack`\n );\n }\n\n if (method === 'clone' && /^\\s*-u\\b/.test(arg)) {\n throw new GitPluginError(\n undefined,\n 'unsafe',\n `Use of clone with option -u is not permitted without enabling allowUnsafePack`\n );\n }\n\n if (method === 'push' && /^\\s*--exec\\b/.test(arg)) {\n throw new GitPluginError(\n undefined,\n 'unsafe',\n `Use of push with option --exec is not permitted without enabling allowUnsafePack`\n );\n }\n}\n\nexport function blockUnsafeOperationsPlugin({\n allowUnsafeProtocolOverride = false,\n allowUnsafePack = false,\n}: SimpleGitPluginConfig['unsafe'] = {}): SimpleGitPlugin<'spawn.args'> {\n return {\n type: 'spawn.args',\n action(args, context) {\n args.forEach((current, index) => {\n const next = index < args.length ? args[index + 1] : '';\n\n allowUnsafeProtocolOverride || preventProtocolOverride(current, next);\n allowUnsafePack || preventUploadPack(current, context.method);\n });\n\n return args;\n },\n };\n}\n","import { prefixedArray } from '../utils';\nimport { SimpleGitPlugin } from './simple-git-plugin';\n\nexport function commandConfigPrefixingPlugin(\n configuration: string[]\n): SimpleGitPlugin<'spawn.args'> {\n const prefix = prefixedArray(configuration, '-c');\n\n return {\n type: 'spawn.args',\n action(data) {\n return [...prefix, ...data];\n },\n };\n}\n","import { deferred, DeferredPromise } from '@kwsites/promise-deferred';\nimport { SimpleGitPluginConfig } from '../types';\nimport { delay } from '../utils';\nimport { SimpleGitPlugin } from './simple-git-plugin';\n\nconst never = deferred().promise;\n\nexport function completionDetectionPlugin({\n onClose = true,\n onExit = 50,\n}: SimpleGitPluginConfig['completion'] = {}): SimpleGitPlugin<'spawn.after'> {\n function createEvents() {\n let exitCode = -1;\n const events = {\n close: deferred(),\n closeTimeout: deferred(),\n exit: deferred(),\n exitTimeout: deferred(),\n };\n\n const result = Promise.race([\n onClose === false ? never : events.closeTimeout.promise,\n onExit === false ? never : events.exitTimeout.promise,\n ]);\n\n configureTimeout(onClose, events.close, events.closeTimeout);\n configureTimeout(onExit, events.exit, events.exitTimeout);\n\n return {\n close(code: number) {\n exitCode = code;\n events.close.done();\n },\n exit(code: number) {\n exitCode = code;\n events.exit.done();\n },\n get exitCode() {\n return exitCode;\n },\n result,\n };\n }\n\n function configureTimeout(\n flag: boolean | number,\n event: DeferredPromise<void>,\n timeout: DeferredPromise<void>\n ) {\n if (flag === false) {\n return;\n }\n\n (flag === true ? event.promise : event.promise.then(() => delay(flag))).then(timeout.done);\n }\n\n return {\n type: 'spawn.after',\n async action(_data, { spawned, close }) {\n const events = createEvents();\n\n let deferClose = true;\n let quickClose = () => void (deferClose = false);\n\n spawned.stdout?.on('data', quickClose);\n spawned.stderr?.on('data', quickClose);\n spawned.on('error', quickClose);\n\n spawned.on('close', (code: number) => events.close(code));\n spawned.on('exit', (code: number) => events.exit(code));\n\n try {\n await events.result;\n if (deferClose) {\n await delay(50);\n }\n close(events.exitCode);\n } catch (err) {\n close(events.exitCode, err as Error);\n }\n },\n };\n}\n","import type { SimpleGitOptions } from '../types';\n\nimport { GitPluginError } from '../errors/git-plugin-error';\nimport { asArray } from '../utils';\nimport { PluginStore } from './plugin-store';\n\nconst WRONG_NUMBER_ERR = `Invalid value supplied for custom binary, requires a single string or an array containing either one or two strings`;\nconst WRONG_CHARS_ERR = `Invalid value supplied for custom binary, restricted characters must be removed or supply the unsafe.allowUnsafeCustomBinary option`;\n\nfunction isBadArgument(arg: string) {\n return !arg || !/^([a-z]:)?([a-z0-9/.\\\\_-]+)$/i.test(arg);\n}\n\nfunction toBinaryConfig(\n input: string[],\n allowUnsafe: boolean\n): { binary: string; prefix?: string } {\n if (input.length < 1 || input.length > 2) {\n throw new GitPluginError(undefined, 'binary', WRONG_NUMBER_ERR);\n }\n\n const isBad = input.some(isBadArgument);\n if (isBad) {\n if (allowUnsafe) {\n console.warn(WRONG_CHARS_ERR);\n } else {\n throw new GitPluginError(undefined, 'binary', WRONG_CHARS_ERR);\n }\n }\n\n const [binary, prefix] = input;\n return {\n binary,\n prefix,\n };\n}\n\nexport function customBinaryPlugin(\n plugins: PluginStore,\n input: SimpleGitOptions['binary'] = ['git'],\n allowUnsafe = false\n) {\n let config = toBinaryConfig(asArray(input), allowUnsafe);\n\n plugins.on('binary', (input) => {\n config = toBinaryConfig(asArray(input), allowUnsafe);\n });\n\n plugins.append('spawn.binary', () => {\n return config.binary;\n });\n\n plugins.append('spawn.args', (data) => {\n return config.prefix ? [config.prefix, ...data] : data;\n });\n}\n","import { GitError } from '../errors/git-error';\nimport { GitExecutorResult, SimpleGitPluginConfig } from '../types';\nimport { SimpleGitPlugin } from './simple-git-plugin';\n\ntype TaskResult = Omit<GitExecutorResult, 'rejection'>;\n\nfunction isTaskError(result: TaskResult) {\n return !!(result.exitCode && result.stdErr.length);\n}\n\nfunction getErrorMessage(result: TaskResult) {\n return Buffer.concat([...result.stdOut, ...result.stdErr]);\n}\n\nexport function errorDetectionHandler(\n overwrite = false,\n isError = isTaskError,\n errorMessage: (result: TaskResult) => Buffer | Error = getErrorMessage\n) {\n return (error: Buffer | Error | undefined, result: TaskResult) => {\n if ((!overwrite && error) || !isError(result)) {\n return error;\n }\n\n return errorMessage(result);\n };\n}\n\nexport function errorDetectionPlugin(\n config: SimpleGitPluginConfig['errors']\n): SimpleGitPlugin<'task.error'> {\n return {\n type: 'task.error',\n action(data, context) {\n const error = config(data.error, {\n stdErr: context.stdErr,\n stdOut: context.stdOut,\n exitCode: context.exitCode,\n });\n\n if (Buffer.isBuffer(error)) {\n return { error: new GitError(undefined, error.toString('utf-8')) };\n }\n\n return {\n error,\n };\n },\n };\n}\n","import { EventEmitter } from 'node:events';\n\nimport type {\n SimpleGitPlugin,\n SimpleGitPluginType,\n SimpleGitPluginTypes,\n} from './simple-git-plugin';\nimport { append, asArray } from '../utils';\nimport type { SimpleGitPluginConfig } from '../types';\n\nexport class PluginStore {\n private plugins: Set<SimpleGitPlugin<SimpleGitPluginType>> = new Set();\n private events = new EventEmitter();\n\n on<K extends keyof SimpleGitPluginConfig>(\n type: K,\n listener: (data: SimpleGitPluginConfig[K]) => void\n ) {\n this.events.on(type, listener);\n }\n\n reconfigure<K extends keyof SimpleGitPluginConfig>(type: K, data: SimpleGitPluginConfig[K]) {\n this.events.emit(type, data);\n }\n\n public append<T extends SimpleGitPluginType>(type: T, action: SimpleGitPlugin<T>['action']) {\n const plugin = append(this.plugins, { type, action });\n\n return () => this.plugins.delete(plugin);\n }\n\n public add<T extends SimpleGitPluginType>(\n plugin: void | SimpleGitPlugin<T> | SimpleGitPlugin<T>[]\n ) {\n const plugins: SimpleGitPlugin<T>[] = [];\n\n asArray(plugin).forEach((plugin) => plugin && this.plugins.add(append(plugins, plugin)));\n\n return () => {\n plugins.forEach((plugin) => this.plugins.delete(plugin));\n };\n }\n\n public exec<T extends SimpleGitPluginType>(\n type: T,\n data: SimpleGitPluginTypes[T]['data'],\n context: SimpleGitPluginTypes[T]['context']\n ): typeof data {\n let output = data;\n const contextual = Object.freeze(Object.create(context));\n\n for (const plugin of this.plugins) {\n if (plugin.type === type) {\n output = plugin.action(output, contextual);\n }\n }\n\n return output;\n }\n}\n","import { SimpleGitOptions } from '../types';\nimport { asNumber, including } from '../utils';\n\nimport { SimpleGitPlugin } from './simple-git-plugin';\n\nexport function progressMonitorPlugin(progress: Exclude<SimpleGitOptions['progress'], void>) {\n const progressCommand = '--progress';\n const progressMethods = ['checkout', 'clone', 'fetch', 'pull', 'push'];\n\n const onProgress: SimpleGitPlugin<'spawn.after'> = {\n type: 'spawn.after',\n action(_data, context) {\n if (!context.commands.includes(progressCommand)) {\n return;\n }\n\n context.spawned.stderr?.on('data', (chunk: Buffer) => {\n const message = /^([\\s\\S]+?):\\s*(\\d+)% \\((\\d+)\\/(\\d+)\\)/.exec(chunk.toString('utf8'));\n if (!message) {\n return;\n }\n\n progress({\n method: context.method,\n stage: progressEventStage(message[1]),\n progress: asNumber(message[2]),\n processed: asNumber(message[3]),\n total: asNumber(message[4]),\n });\n });\n },\n };\n\n const onArgs: SimpleGitPlugin<'spawn.args'> = {\n type: 'spawn.args',\n action(args, context) {\n if (!progressMethods.includes(context.method)) {\n return args;\n }\n\n return including(args, progressCommand);\n },\n };\n\n return [onArgs, onProgress];\n}\n\nfunction progressEventStage(input: string) {\n return String(input.toLowerCase().split(' ', 1)) || 'unknown';\n}\n","import { SpawnOptions } from 'child_process';\nimport { pick } from '../utils';\nimport { SimpleGitPlugin } from './simple-git-plugin';\n\nexport function spawnOptionsPlugin(\n spawnOptions: Partial<SpawnOptions>\n): SimpleGitPlugin<'spawn.options'> {\n const options = pick(spawnOptions, ['uid', 'gid']);\n\n return {\n type: 'spawn.options',\n action(data) {\n return { ...options, ...data };\n },\n };\n}\n","import type { SimpleGitPlugin } from './simple-git-plugin';\n\nimport type { SimpleGitOptions } from '../types';\nimport { GitPluginError } from '../errors/git-plugin-error';\n\nexport function timeoutPlugin({\n block,\n stdErr = true,\n stdOut = true,\n}: Exclude<SimpleGitOptions['timeout'], undefined>): SimpleGitPlugin<'spawn.after'> | void {\n if (block > 0) {\n return {\n type: 'spawn.after',\n action(_data, context) {\n let timeout: NodeJS.Timeout;\n\n function wait() {\n timeout && clearTimeout(timeout);\n timeout = setTimeout(kill, block);\n }\n\n function stop() {\n context.spawned.stdout?.off('data', wait);\n context.spawned.stderr?.off('data', wait);\n context.spawned.off('exit', stop);\n context.spawned.off('close', stop);\n timeout && clearTimeout(timeout);\n }\n\n function kill() {\n stop();\n context.kill(new GitPluginError(undefined, 'timeout', `block timeout reached`));\n }\n\n stdOut && context.spawned.stdout?.on('data', wait);\n stdErr && context.spawned.stderr?.on('data', wait);\n context.spawned.on('exit', stop);\n context.spawned.on('close', stop);\n\n wait();\n },\n };\n }\n}\n","import { SimpleGitPlugin } from './simple-git-plugin';\nimport { isPathSpec, toPaths } from '../args/pathspec';\n\nexport function suffixPathsPlugin(): SimpleGitPlugin<'spawn.args'> {\n return {\n type: 'spawn.args',\n action(data) {\n const prefix: string[] = [];\n let suffix: undefined | string[];\n function append(args: string[]) {\n (suffix = suffix || []).push(...args);\n }\n\n for (let i = 0; i < data.length; i++) {\n const param = data[i];\n\n if (isPathSpec(param)) {\n append(toPaths(param));\n continue;\n }\n\n if (param === '--') {\n append(\n data.slice(i + 1).flatMap((item) => (isPathSpec(item) && toPaths(item)) || item)\n );\n break;\n }\n\n prefix.push(param);\n }\n\n return !suffix ? prefix : [...prefix, '--', ...suffix.map(String)];\n },\n };\n}\n","import { SimpleGitFactory } from '../../typings';\n\nimport * as api from './api';\nimport {\n abortPlugin,\n blockUnsafeOperationsPlugin,\n commandConfigPrefixingPlugin,\n completionDetectionPlugin,\n customBinaryPlugin,\n errorDetectionHandler,\n errorDetectionPlugin,\n PluginStore,\n progressMonitorPlugin,\n spawnOptionsPlugin,\n timeoutPlugin,\n} from './plugins';\nimport { suffixPathsPlugin } from './plugins/suffix-paths.plugin';\nimport { createInstanceConfig, folderExists } from './utils';\nimport { SimpleGitOptions } from './types';\n\nconst Git = require('../git');\n\n/**\n * Adds the necessary properties to the supplied object to enable it for use as\n * the default export of a module.\n *\n * Eg: `module.exports = esModuleFactory({ something () {} })`\n */\nexport function esModuleFactory<T>(defaultExport: T) {\n return Object.defineProperties(defaultExport, {\n __esModule: { value: true },\n default: { value: defaultExport },\n }) as T & { __esModule: true; default: T };\n}\n\nexport function gitExportFactory(factory: SimpleGitFactory) {\n return Object.assign(factory.bind(null), api);\n}\n\nexport function gitInstanceFactory(\n baseDir?: string | Partial<SimpleGitOptions>,\n options?: Partial<SimpleGitOptions>\n) {\n const plugins = new PluginStore();\n const config = createInstanceConfig(\n (baseDir && (typeof baseDir === 'string' ? { baseDir } : baseDir)) || {},\n options\n );\n\n if (!folderExists(config.baseDir)) {\n throw new api.GitConstructError(\n config,\n `Cannot use simple-git on a directory that does not exist`\n );\n }\n\n if (Array.isArray(config.config)) {\n plugins.add(commandConfigPrefixingPlugin(config.config));\n }\n\n plugins.add(blockUnsafeOperationsPlugin(config.unsafe));\n plugins.add(suffixPathsPlugin());\n plugins.add(completionDetectionPlugin(config.completion));\n config.abort && plugins.add(abortPlugin(config.abort));\n config.progress && plugins.add(progressMonitorPlugin(config.progress));\n config.timeout && plugins.add(timeoutPlugin(config.timeout));\n config.spawnOptions && plugins.add(spawnOptionsPlugin(config.spawnOptions));\n\n plugins.add(errorDetectionPlugin(errorDetectionHandler(true)));\n config.errors && plugins.add(errorDetectionPlugin(config.errors));\n\n customBinaryPlugin(plugins, config.binary, config.unsafe?.allowUnsafeCustomBinary);\n\n return new Git(config, plugins);\n}\n","import { SimpleGit, SimpleGitOptions } from '../../../typings';\n\nimport { GitResponseError } from '../errors/git-response-error';\nimport { gitInstanceFactory } from '../git-factory';\nimport { SimpleGitTaskCallback } from '../types';\n\nconst functionNamesBuilderApi = ['customBinary', 'env', 'outputHandler', 'silent'];\n\nconst functionNamesPromiseApi = [\n 'add',\n 'addAnnotatedTag',\n 'addConfig',\n 'addRemote',\n 'addTag',\n 'applyPatch',\n 'binaryCatFile',\n 'branch',\n 'branchLocal',\n 'catFile',\n 'checkIgnore',\n 'checkIsRepo',\n 'checkout',\n 'checkoutBranch',\n 'checkoutLatestTag',\n 'checkoutLocalBranch',\n 'clean',\n 'clone',\n 'commit',\n 'cwd',\n 'deleteLocalBranch',\n 'deleteLocalBranches',\n 'diff',\n 'diffSummary',\n 'exec',\n 'fetch',\n 'getRemotes',\n 'init',\n 'listConfig',\n 'listRemote',\n 'log',\n 'merge',\n 'mergeFromTo',\n 'mirror',\n 'mv',\n 'pull',\n 'push',\n 'pushTags',\n 'raw',\n 'rebase',\n 'remote',\n 'removeRemote',\n 'reset',\n 'revert',\n 'revparse',\n 'rm',\n 'rmKeepLocal',\n 'show',\n 'stash',\n 'stashList',\n 'status',\n 'subModule',\n 'submoduleAdd',\n 'submoduleInit',\n 'submoduleUpdate',\n 'tag',\n 'tags',\n 'updateServerInfo',\n];\n\nexport function gitP(\n ...args: [] | [string] | [Partial<SimpleGitOptions>] | [string, Partial<SimpleGitOptions>]\n): SimpleGit {\n let git: any;\n\n let chain = Promise.resolve();\n\n try {\n git = gitInstanceFactory(...args);\n } catch (e) {\n chain = Promise.reject(e);\n }\n\n function builderReturn() {\n return promiseApi;\n }\n\n function chainReturn() {\n return chain;\n }\n\n const promiseApi = [...functionNamesBuilderApi, ...functionNamesPromiseApi].reduce(\n (api: any, name: string) => {\n const isAsync = functionNamesPromiseApi.includes(name);\n\n const valid = isAsync ? asyncWrapper(name, git) : syncWrapper(name, git, api);\n const alternative = isAsync ? chainReturn : builderReturn;\n\n Object.defineProperty(api, name, {\n enumerable: false,\n configurable: false,\n value: git ? valid : alternative,\n });\n\n return api;\n },\n {}\n );\n\n return promiseApi as SimpleGit;\n\n function asyncWrapper(fn: string, git: any): (...args: any[]) => Promise<any> {\n return function (...args: any[]) {\n if (typeof args[args.length] === 'function') {\n throw new TypeError(\n 'Promise interface requires that handlers are not supplied inline, ' +\n 'trailing function not allowed in call to ' +\n fn\n );\n }\n\n return chain.then(function () {\n return new Promise(function (resolve, reject) {\n const callback: SimpleGitTaskCallback = (err: Error | null, result?: any) => {\n if (err) {\n return reject(toError(err));\n }\n\n resolve(result);\n };\n args.push(callback);\n\n git[fn].apply(git, args);\n });\n });\n };\n }\n\n function syncWrapper(fn: string, git: any, api: SimpleGit) {\n return (...args: any[]) => {\n git[fn](...args);\n\n return api;\n };\n }\n}\n\nfunction toError(error: Error | string | any): Error {\n if (error instanceof Error) {\n return error;\n }\n\n if (typeof error === 'string') {\n return new Error(error);\n }\n\n return new GitResponseError(error);\n}\n","import { gitInstanceFactory } from './lib/git-factory';\n\nexport { gitP } from './lib/runners/promise-wrapped';\nexport * from './lib/api';\n\nexport const simpleGit = gitInstanceFactory;\n\nexport default gitInstanceFactory;\n","import { type SimpleGit, type SimpleGitOptions, simpleGit } from \"simple-git\";\n\nexport type GitClient = SimpleGit;\n\nexport interface CreateGitClientOptions extends Partial<SimpleGitOptions> {\n abortSignal?: AbortSignal;\n}\n\nexport function createGitClient(\n baseDir?: string,\n options?: CreateGitClientOptions,\n): GitClient {\n const { abortSignal: signal, ...rest } = options ?? {};\n return simpleGit({\n baseDir,\n maxConcurrentProcesses: 6,\n trimmed: true,\n abort: signal,\n ...rest,\n });\n}\n","import { execFile } from \"node:child_process\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\n\nconst execFileAsync = promisify(execFile);\n\nexport interface LockInfo {\n path: string;\n ageMs: number;\n}\n\nexport async function getIndexLockPath(repoPath: string): Promise<string> {\n try {\n const { stdout } = await execFileAsync(\n \"git\",\n [\"rev-parse\", \"--git-path\", \"index.lock\"],\n { cwd: repoPath },\n );\n return path.resolve(repoPath, stdout.trim());\n } catch {\n return path.join(repoPath, \".git\", \"index.lock\");\n }\n}\n\nexport async function getLockInfo(repoPath: string): Promise<LockInfo | null> {\n const lockPath = await getIndexLockPath(repoPath);\n try {\n const stat = await fs.stat(lockPath);\n return {\n path: lockPath,\n ageMs: Date.now() - stat.mtimeMs,\n };\n } catch {\n return null;\n }\n}\n\nexport async function removeLock(repoPath: string): Promise<void> {\n const lockPath = await getIndexLockPath(repoPath);\n await fs.rm(lockPath, { force: true });\n}\n\nexport async function isLocked(repoPath: string): Promise<boolean> {\n return (await getLockInfo(repoPath)) !== null;\n}\n\nexport async function waitForUnlock(\n repoPath: string,\n timeoutMs = 10000,\n intervalMs = 100,\n): Promise<boolean> {\n const start = Date.now();\n while (Date.now() - start < timeoutMs) {\n if (!(await isLocked(repoPath))) return true;\n await new Promise((r) => setTimeout(r, intervalMs));\n }\n return false;\n}\n","export class AsyncReaderWriterLock {\n private readers = 0;\n private writer = false;\n private writerWaiting = false;\n private readQueue: Array<() => void> = [];\n private writeQueue: Array<() => void> = [];\n\n async acquireRead(): Promise<void> {\n if (!this.writer && !this.writerWaiting) {\n this.readers++;\n return;\n }\n return new Promise((resolve) => {\n this.readQueue.push(() => {\n this.readers++;\n resolve();\n });\n });\n }\n\n releaseRead(): void {\n this.readers--;\n this.processQueue();\n }\n\n async acquireWrite(): Promise<void> {\n if (!this.writer && this.readers === 0) {\n this.writer = true;\n return;\n }\n this.writerWaiting = true;\n return new Promise((resolve) => {\n this.writeQueue.push(() => {\n this.writerWaiting = this.writeQueue.length > 0;\n this.writer = true;\n resolve();\n });\n });\n }\n\n releaseWrite(): void {\n this.writer = false;\n this.processQueue();\n }\n\n private processQueue(): void {\n if (this.writer || this.readers > 0) return;\n\n if (this.writeQueue.length > 0) {\n const next = this.writeQueue.shift()!;\n next();\n } else {\n while (this.readQueue.length > 0 && !this.writerWaiting) {\n const next = this.readQueue.shift()!;\n next();\n }\n }\n }\n}\n","import { createGitClient, type GitClient } from \"./client.js\";\nimport { removeLock, waitForUnlock } from \"./lock-detector.js\";\nimport { AsyncReaderWriterLock } from \"./rw-lock.js\";\n\ninterface RepoState {\n lock: AsyncReaderWriterLock;\n client: GitClient;\n lastAccess: number;\n}\n\nexport interface ExecuteOptions {\n signal?: AbortSignal;\n timeoutMs?: number;\n waitForExternalLock?: boolean;\n}\n\nclass GitOperationManagerImpl {\n private repoStates = new Map<string, RepoState>();\n private cleanupInterval: ReturnType<typeof setInterval> | null = null;\n private static readonly CLEANUP_INTERVAL_MS = 60000;\n private static readonly IDLE_TIMEOUT_MS = 300000;\n\n constructor() {\n this.cleanupInterval = setInterval(\n () => this.cleanupIdleRepos(),\n GitOperationManagerImpl.CLEANUP_INTERVAL_MS,\n );\n }\n\n private getRepoState(repoPath: string): RepoState {\n let state = this.repoStates.get(repoPath);\n if (!state) {\n state = {\n lock: new AsyncReaderWriterLock(),\n client: createGitClient(repoPath),\n lastAccess: Date.now(),\n };\n this.repoStates.set(repoPath, state);\n }\n state.lastAccess = Date.now();\n return state;\n }\n\n private cleanupIdleRepos(): void {\n const now = Date.now();\n for (const [repoPath, state] of this.repoStates) {\n if (now - state.lastAccess > GitOperationManagerImpl.IDLE_TIMEOUT_MS) {\n this.repoStates.delete(repoPath);\n }\n }\n }\n\n async executeRead<T>(\n repoPath: string,\n operation: (git: GitClient) => Promise<T>,\n options?: ExecuteOptions,\n ): Promise<T> {\n const state = this.getRepoState(repoPath);\n\n if (options?.signal) {\n const scopedGit = createGitClient(repoPath, {\n abortSignal: options.signal,\n });\n return operation(scopedGit.env({ GIT_OPTIONAL_LOCKS: \"0\" }));\n }\n\n const git = state.client.env({ GIT_OPTIONAL_LOCKS: \"0\" });\n return operation(git);\n }\n\n async executeWrite<T>(\n repoPath: string,\n operation: (git: GitClient) => Promise<T>,\n options?: ExecuteOptions,\n ): Promise<T> {\n const state = this.getRepoState(repoPath);\n\n if (options?.waitForExternalLock !== false) {\n const unlocked = await waitForUnlock(\n repoPath,\n options?.timeoutMs ?? 10000,\n );\n if (!unlocked) {\n throw new Error(`Git repository is locked: ${repoPath}`);\n }\n }\n\n await state.lock.acquireWrite();\n try {\n if (options?.signal) {\n const scopedGit = createGitClient(repoPath, {\n abortSignal: options.signal,\n });\n return await operation(scopedGit);\n }\n\n return await operation(state.client);\n } catch (error) {\n if (options?.signal?.aborted) {\n await removeLock(repoPath).catch(() => {});\n }\n throw error;\n } finally {\n state.lock.releaseWrite();\n }\n }\n\n destroy(): void {\n if (this.cleanupInterval) {\n clearInterval(this.cleanupInterval);\n this.cleanupInterval = null;\n }\n this.repoStates.clear();\n }\n}\n\nlet instance: GitOperationManagerImpl | null = null;\n\nexport function getGitOperationManager(): GitOperationManagerImpl {\n if (!instance) {\n instance = new GitOperationManagerImpl();\n }\n return instance;\n}\n\nexport function resetGitOperationManager(): void {\n if (instance) {\n instance.destroy();\n instance = null;\n }\n}\n\nexport type GitOperationManager = GitOperationManagerImpl;\n","import { mkdir, rm, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { Saga } from \"@posthog/shared\";\nimport { ApplyTreeSaga as GitApplyTreeSaga } from \"@twig/git/sagas/tree\";\nimport type { PostHogAPIClient } from \"../posthog-api.js\";\nimport type { TreeSnapshot } from \"../types.js\";\n\nexport interface ApplySnapshotInput {\n snapshot: TreeSnapshot;\n repositoryPath: string;\n apiClient: PostHogAPIClient;\n taskId: string;\n runId: string;\n}\n\nexport interface ApplySnapshotOutput {\n treeHash: string;\n}\n\nexport class ApplySnapshotSaga extends Saga<\n ApplySnapshotInput,\n ApplySnapshotOutput\n> {\n private archivePath: string | null = null;\n\n protected async execute(\n input: ApplySnapshotInput,\n ): Promise<ApplySnapshotOutput> {\n const { snapshot, repositoryPath, apiClient, taskId, runId } = input;\n const tmpDir = join(repositoryPath, \".posthog\", \"tmp\");\n\n if (!snapshot.archiveUrl) {\n throw new Error(\"Cannot apply snapshot: no archive URL\");\n }\n\n await this.step({\n name: \"create_tmp_dir\",\n execute: () => mkdir(tmpDir, { recursive: true }),\n rollback: async () => {},\n });\n\n this.archivePath = join(tmpDir, `${snapshot.treeHash}.tar.gz`);\n await this.step({\n name: \"download_archive\",\n execute: async () => {\n const arrayBuffer = await apiClient.downloadArtifact(\n taskId,\n runId,\n snapshot.archiveUrl!,\n );\n if (!arrayBuffer) {\n throw new Error(\"Failed to download archive\");\n }\n const base64Content = Buffer.from(arrayBuffer).toString(\"utf-8\");\n const binaryContent = Buffer.from(base64Content, \"base64\");\n await writeFile(this.archivePath!, binaryContent);\n },\n rollback: async () => {\n if (this.archivePath) {\n await rm(this.archivePath, { force: true }).catch(() => {});\n }\n },\n });\n\n const gitApplySaga = new GitApplyTreeSaga(this.log);\n const applyResult = await gitApplySaga.run({\n baseDir: repositoryPath,\n treeHash: snapshot.treeHash,\n baseCommit: snapshot.baseCommit,\n changes: snapshot.changes,\n archivePath: this.archivePath,\n });\n\n if (!applyResult.success) {\n throw new Error(`Failed to apply tree: ${applyResult.error}`);\n }\n\n await rm(this.archivePath, { force: true }).catch(() => {});\n\n this.log.info(\"Tree snapshot applied\", {\n treeHash: snapshot.treeHash,\n totalChanges: snapshot.changes.length,\n deletedFiles: snapshot.changes.filter((c) => c.status === \"D\").length,\n });\n\n return { treeHash: snapshot.treeHash };\n }\n}\n","import { existsSync } from \"node:fs\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport * as tar from \"tar\";\nimport type { GitClient } from \"../client.js\";\nimport { GitSaga, type GitSagaInput } from \"../git-saga.js\";\nimport { getHeadSha } from \"../queries.js\";\n\nexport type FileStatus = \"A\" | \"M\" | \"D\";\n\nexport interface FileChange {\n path: string;\n status: FileStatus;\n}\n\nexport interface TreeSnapshot {\n treeHash: string;\n baseCommit: string | null;\n changes: FileChange[];\n timestamp: string;\n}\n\nexport interface CaptureTreeInput extends GitSagaInput {\n lastTreeHash?: string | null;\n archivePath?: string;\n}\n\nexport interface CaptureTreeOutput {\n snapshot: TreeSnapshot | null;\n archivePath?: string;\n changed: boolean;\n}\n\nexport class CaptureTreeSaga extends GitSaga<\n CaptureTreeInput,\n CaptureTreeOutput\n> {\n private tempIndexPath: string | null = null;\n\n protected async executeGitOperations(\n input: CaptureTreeInput,\n ): Promise<CaptureTreeOutput> {\n const { baseDir, lastTreeHash, archivePath, signal } = input;\n const tmpDir = path.join(baseDir, \".git\", \"twig-tmp\");\n\n await this.step({\n name: \"create_tmp_dir\",\n execute: () => fs.mkdir(tmpDir, { recursive: true }),\n rollback: async () => {},\n });\n\n this.tempIndexPath = path.join(tmpDir, `index-${Date.now()}`);\n const tempIndexGit = this.git.env({\n ...process.env,\n GIT_INDEX_FILE: this.tempIndexPath,\n });\n\n await this.step({\n name: \"init_temp_index\",\n execute: () => tempIndexGit.raw([\"read-tree\", \"HEAD\"]),\n rollback: async () => {\n if (this.tempIndexPath) {\n await fs.rm(this.tempIndexPath, { force: true }).catch(() => {});\n }\n },\n });\n\n await this.readOnlyStep(\"stage_files\", () =>\n tempIndexGit.raw([\"add\", \"-A\"]),\n );\n\n const treeHash = await this.readOnlyStep(\"write_tree\", () =>\n tempIndexGit.raw([\"write-tree\"]),\n );\n\n if (lastTreeHash && treeHash === lastTreeHash) {\n this.log.debug(\"No changes since last capture\", { treeHash });\n await fs.rm(this.tempIndexPath, { force: true }).catch(() => {});\n return { snapshot: null, changed: false };\n }\n\n const baseCommit = await this.readOnlyStep(\"get_base_commit\", async () => {\n try {\n return await getHeadSha(baseDir, { abortSignal: signal });\n } catch {\n return null;\n }\n });\n\n const changes = await this.readOnlyStep(\"get_changes\", () =>\n this.getChanges(this.git, baseCommit, treeHash),\n );\n\n await fs.rm(this.tempIndexPath, { force: true }).catch(() => {});\n\n const snapshot: TreeSnapshot = {\n treeHash,\n baseCommit,\n changes,\n timestamp: new Date().toISOString(),\n };\n\n let createdArchivePath: string | undefined;\n if (archivePath) {\n createdArchivePath = await this.createArchive(\n baseDir,\n archivePath,\n changes,\n );\n }\n\n this.log.info(\"Tree captured\", {\n treeHash,\n changes: changes.length,\n archived: !!createdArchivePath,\n });\n\n return { snapshot, archivePath: createdArchivePath, changed: true };\n }\n\n private async createArchive(\n baseDir: string,\n archivePath: string,\n changes: FileChange[],\n ): Promise<string | undefined> {\n const filesToArchive = changes\n .filter((c) => c.status !== \"D\")\n .map((c) => c.path);\n\n if (filesToArchive.length === 0) {\n return undefined;\n }\n\n const existingFiles = filesToArchive.filter((f) =>\n existsSync(path.join(baseDir, f)),\n );\n\n if (existingFiles.length === 0) {\n return undefined;\n }\n\n await this.step({\n name: \"create_archive\",\n execute: async () => {\n const archiveDir = path.dirname(archivePath);\n await fs.mkdir(archiveDir, { recursive: true });\n await tar.create(\n {\n gzip: true,\n file: archivePath,\n cwd: baseDir,\n },\n existingFiles,\n );\n },\n rollback: async () => {\n await fs.rm(archivePath, { force: true }).catch(() => {});\n },\n });\n\n return archivePath;\n }\n\n private async getChanges(\n git: GitClient,\n fromRef: string | null,\n toRef: string,\n ): Promise<FileChange[]> {\n if (!fromRef) {\n const stdout = await git.raw([\"ls-tree\", \"-r\", \"--name-only\", toRef]);\n return stdout\n .split(\"\\n\")\n .filter((p) => p.trim())\n .map((p) => ({ path: p, status: \"A\" as FileStatus }));\n }\n\n const stdout = await git.raw([\n \"diff-tree\",\n \"-r\",\n \"--name-status\",\n fromRef,\n toRef,\n ]);\n\n const changes: FileChange[] = [];\n for (const line of stdout.split(\"\\n\")) {\n if (!line.trim()) continue;\n const [status, filePath] = line.split(\"\\t\");\n if (!filePath) continue;\n\n let normalizedStatus: FileStatus;\n if (status === \"D\") {\n normalizedStatus = \"D\";\n } else if (status === \"A\") {\n normalizedStatus = \"A\";\n } else {\n normalizedStatus = \"M\";\n }\n\n changes.push({ path: filePath, status: normalizedStatus });\n }\n\n return changes;\n }\n}\n\nexport interface ApplyTreeInput extends GitSagaInput {\n treeHash: string;\n baseCommit?: string | null;\n changes: FileChange[];\n archivePath?: string;\n}\n\nexport interface ApplyTreeOutput {\n treeHash: string;\n checkoutPerformed: boolean;\n}\n\nexport class ApplyTreeSaga extends GitSaga<ApplyTreeInput, ApplyTreeOutput> {\n private originalHead: string | null = null;\n private originalBranch: string | null = null;\n private extractedFiles: string[] = [];\n private fileBackups: Map<string, Buffer> = new Map();\n\n protected async executeGitOperations(\n input: ApplyTreeInput,\n ): Promise<ApplyTreeOutput> {\n const { baseDir, treeHash, baseCommit, changes, archivePath } = input;\n\n const headInfo = await this.readOnlyStep(\"get_current_head\", async () => {\n let head: string | null = null;\n let branch: string | null = null;\n\n try {\n head = await this.git.revparse([\"HEAD\"]);\n } catch {\n head = null;\n }\n\n try {\n branch = await this.git.raw([\"symbolic-ref\", \"--short\", \"HEAD\"]);\n } catch {\n branch = null;\n }\n\n return { head, branch };\n });\n this.originalHead = headInfo.head;\n this.originalBranch = headInfo.branch;\n\n let checkoutPerformed = false;\n\n if (baseCommit && baseCommit !== this.originalHead) {\n await this.readOnlyStep(\"check_working_tree\", async () => {\n const status = await this.git.status();\n if (!status.isClean()) {\n const changedFiles =\n status.modified.length +\n status.staged.length +\n status.deleted.length;\n throw new Error(\n `Cannot apply tree: ${changedFiles} uncommitted change(s) exist. ` +\n `Commit or stash your changes first.`,\n );\n }\n });\n\n await this.step({\n name: \"checkout_base\",\n execute: async () => {\n await this.git.checkout(baseCommit);\n checkoutPerformed = true;\n this.log.warn(\n \"Applied tree from different commit - now in detached HEAD state\",\n {\n originalHead: this.originalHead,\n originalBranch: this.originalBranch,\n baseCommit,\n },\n );\n },\n rollback: async () => {\n try {\n if (this.originalBranch) {\n await this.git.checkout(this.originalBranch);\n } else if (this.originalHead) {\n await this.git.checkout(this.originalHead);\n }\n } catch (error) {\n this.log.warn(\"Failed to rollback checkout\", { error });\n }\n },\n });\n }\n\n if (archivePath) {\n const filesToExtract = changes\n .filter((c) => c.status !== \"D\")\n .map((c) => c.path);\n\n await this.readOnlyStep(\"backup_existing_files\", async () => {\n for (const filePath of filesToExtract) {\n const fullPath = path.join(baseDir, filePath);\n try {\n const content = await fs.readFile(fullPath);\n this.fileBackups.set(filePath, content);\n } catch {}\n }\n });\n\n await this.step({\n name: \"extract_archive\",\n execute: async () => {\n await tar.extract({\n file: archivePath,\n cwd: baseDir,\n });\n this.extractedFiles = filesToExtract;\n },\n rollback: async () => {\n for (const filePath of this.extractedFiles) {\n const fullPath = path.join(baseDir, filePath);\n const backup = this.fileBackups.get(filePath);\n if (backup) {\n const dir = path.dirname(fullPath);\n await fs.mkdir(dir, { recursive: true }).catch(() => {});\n await fs.writeFile(fullPath, backup).catch(() => {});\n } else {\n await fs.rm(fullPath, { force: true }).catch(() => {});\n }\n }\n },\n });\n }\n\n for (const change of changes.filter((c) => c.status === \"D\")) {\n const fullPath = path.join(baseDir, change.path);\n\n const backupContent = await this.readOnlyStep(\n `backup_${change.path}`,\n async () => {\n try {\n return await fs.readFile(fullPath);\n } catch {\n return null;\n }\n },\n );\n\n await this.step({\n name: `delete_${change.path}`,\n execute: async () => {\n await fs.rm(fullPath, { force: true });\n this.log.debug(`Deleted file: ${change.path}`);\n },\n rollback: async () => {\n if (backupContent) {\n const dir = path.dirname(fullPath);\n await fs.mkdir(dir, { recursive: true }).catch(() => {});\n await fs.writeFile(fullPath, backupContent).catch(() => {});\n }\n },\n });\n }\n\n const deletedCount = changes.filter((c) => c.status === \"D\").length;\n this.log.info(\"Tree applied\", {\n treeHash,\n totalChanges: changes.length,\n deletedFiles: deletedCount,\n checkoutPerformed,\n });\n\n return { treeHash, checkoutPerformed };\n }\n}\n\nexport interface ReadTreeInput extends GitSagaInput {\n treeHash: string;\n}\n\nexport interface ReadTreeOutput {\n files: string[];\n}\n\nexport class ReadTreeSaga extends GitSaga<ReadTreeInput, ReadTreeOutput> {\n protected async executeGitOperations(\n input: ReadTreeInput,\n ): Promise<ReadTreeOutput> {\n const { treeHash } = input;\n\n const stdout = await this.readOnlyStep(\"ls_tree\", () =>\n this.git.raw([\"ls-tree\", \"-r\", \"--name-only\", treeHash]),\n );\n\n const files = stdout.split(\"\\n\").filter((f) => f.trim());\n return { files };\n }\n}\n","import { Saga } from \"@posthog/shared\";\nimport type { GitClient } from \"./client.js\";\nimport { getGitOperationManager } from \"./operation-manager.js\";\n\nexport interface GitSagaInput {\n baseDir: string;\n signal?: AbortSignal;\n}\n\nexport abstract class GitSaga<\n TInput extends GitSagaInput,\n TOutput,\n> extends Saga<TInput, TOutput> {\n private _git: GitClient | null = null;\n\n protected get git(): GitClient {\n if (!this._git) {\n throw new Error(\"git client accessed before execute() was called\");\n }\n return this._git;\n }\n\n protected async execute(input: TInput): Promise<TOutput> {\n const manager = getGitOperationManager();\n\n return manager.executeWrite(\n input.baseDir,\n async (git) => {\n this._git = git;\n return this.executeGitOperations(input);\n },\n { signal: input.signal },\n );\n }\n\n protected abstract executeGitOperations(input: TInput): Promise<TOutput>;\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { Saga } from \"@posthog/shared\";\nimport { CaptureTreeSaga as GitCaptureTreeSaga } from \"@twig/git/sagas/tree\";\nimport type { PostHogAPIClient } from \"../posthog-api.js\";\nimport type { TreeSnapshot } from \"../types.js\";\n\nexport interface CaptureTreeInput {\n repositoryPath: string;\n taskId: string;\n runId: string;\n apiClient?: PostHogAPIClient;\n lastTreeHash: string | null;\n interrupted?: boolean;\n}\n\nexport interface CaptureTreeOutput {\n snapshot: TreeSnapshot | null;\n newTreeHash: string | null;\n}\n\nexport class CaptureTreeSaga extends Saga<CaptureTreeInput, CaptureTreeOutput> {\n protected async execute(input: CaptureTreeInput): Promise<CaptureTreeOutput> {\n const {\n repositoryPath,\n lastTreeHash,\n interrupted,\n apiClient,\n taskId,\n runId,\n } = input;\n const tmpDir = join(repositoryPath, \".posthog\", \"tmp\");\n\n if (existsSync(join(repositoryPath, \".gitmodules\"))) {\n this.log.warn(\n \"Repository has submodules - snapshot may not capture submodule state\",\n );\n }\n\n const shouldArchive = !!apiClient;\n const archivePath = shouldArchive\n ? join(tmpDir, `tree-${Date.now()}.tar.gz`)\n : undefined;\n\n const gitCaptureSaga = new GitCaptureTreeSaga(this.log);\n const captureResult = await gitCaptureSaga.run({\n baseDir: repositoryPath,\n lastTreeHash,\n archivePath,\n });\n\n if (!captureResult.success) {\n throw new Error(`Failed to capture tree: ${captureResult.error}`);\n }\n\n const {\n snapshot: gitSnapshot,\n archivePath: createdArchivePath,\n changed,\n } = captureResult.data;\n\n if (!changed || !gitSnapshot) {\n this.log.debug(\"No changes since last capture\", { lastTreeHash });\n return { snapshot: null, newTreeHash: lastTreeHash };\n }\n\n let archiveUrl: string | undefined;\n if (apiClient && createdArchivePath) {\n try {\n archiveUrl = await this.uploadArchive(\n createdArchivePath,\n gitSnapshot.treeHash,\n apiClient,\n taskId,\n runId,\n );\n } finally {\n await rm(createdArchivePath, { force: true }).catch(() => {});\n }\n }\n\n const snapshot: TreeSnapshot = {\n treeHash: gitSnapshot.treeHash,\n baseCommit: gitSnapshot.baseCommit,\n changes: gitSnapshot.changes,\n timestamp: gitSnapshot.timestamp,\n interrupted,\n archiveUrl,\n };\n\n this.log.info(\"Tree captured\", {\n treeHash: snapshot.treeHash,\n changes: snapshot.changes.length,\n interrupted,\n archiveUrl,\n });\n\n return { snapshot, newTreeHash: snapshot.treeHash };\n }\n\n private async uploadArchive(\n archivePath: string,\n treeHash: string,\n apiClient: PostHogAPIClient,\n taskId: string,\n runId: string,\n ): Promise<string | undefined> {\n const archiveUrl = await this.step({\n name: \"upload_archive\",\n execute: async () => {\n const archiveContent = await readFile(archivePath);\n const base64Content = archiveContent.toString(\"base64\");\n\n const artifacts = await apiClient.uploadTaskArtifacts(taskId, runId, [\n {\n name: `trees/${treeHash}.tar.gz`,\n type: \"tree_snapshot\",\n content: base64Content,\n content_type: \"application/gzip\",\n },\n ]);\n\n if (artifacts.length > 0 && artifacts[0].storage_path) {\n this.log.info(\"Tree archive uploaded\", {\n storagePath: artifacts[0].storage_path,\n treeHash,\n });\n return artifacts[0].storage_path;\n }\n\n return undefined;\n },\n rollback: async () => {\n await rm(archivePath, { force: true }).catch(() => {});\n },\n });\n\n return archiveUrl;\n }\n}\n","/**\n * TreeTracker - Git tree-based state capture for cloud/local sync\n *\n * Captures the entire working state as a git tree hash + archive:\n * - Atomic state snapshots (no partial syncs)\n * - Efficient delta detection using git's diffing\n * - Simpler resume logic (restore tree, continue)\n *\n * Uses Saga pattern for atomic operations with automatic rollback on failure.\n * Uses a temporary git index to avoid modifying the user's staging area.\n */\n\nimport { isCommitOnRemote as gitIsCommitOnRemote } from \"@twig/git/queries\";\nimport type { PostHogAPIClient } from \"./posthog-api.js\";\nimport { ApplySnapshotSaga } from \"./sagas/apply-snapshot-saga.js\";\nimport { CaptureTreeSaga } from \"./sagas/capture-tree-saga.js\";\nimport type { TreeSnapshot } from \"./types.js\";\nimport { Logger } from \"./utils/logger.js\";\n\nexport type { TreeSnapshot };\n\nexport interface TreeTrackerConfig {\n repositoryPath: string;\n taskId: string;\n runId: string;\n apiClient?: PostHogAPIClient;\n logger?: Logger;\n}\n\nexport class TreeTracker {\n private repositoryPath: string;\n private taskId: string;\n private runId: string;\n private apiClient?: PostHogAPIClient;\n private logger: Logger;\n private lastTreeHash: string | null = null;\n\n constructor(config: TreeTrackerConfig) {\n this.repositoryPath = config.repositoryPath;\n this.taskId = config.taskId;\n this.runId = config.runId;\n this.apiClient = config.apiClient;\n this.logger =\n config.logger || new Logger({ debug: false, prefix: \"[TreeTracker]\" });\n }\n\n /**\n * Capture current working tree state as a snapshot.\n * Uses a temporary index to avoid modifying user's staging area.\n * Uses Saga pattern for atomic operation with automatic cleanup on failure.\n */\n async captureTree(options?: {\n interrupted?: boolean;\n }): Promise<TreeSnapshot | null> {\n const saga = new CaptureTreeSaga(this.logger);\n\n const result = await saga.run({\n repositoryPath: this.repositoryPath,\n taskId: this.taskId,\n runId: this.runId,\n apiClient: this.apiClient,\n lastTreeHash: this.lastTreeHash,\n interrupted: options?.interrupted,\n });\n\n if (!result.success) {\n this.logger.error(\"Failed to capture tree\", {\n error: result.error,\n failedStep: result.failedStep,\n });\n throw new Error(\n `Failed to capture tree at step '${result.failedStep}': ${result.error}`,\n );\n }\n\n // Only update lastTreeHash on success\n if (result.data.newTreeHash !== null) {\n this.lastTreeHash = result.data.newTreeHash;\n }\n\n return result.data.snapshot;\n }\n\n /**\n * Download and apply a tree snapshot.\n * Uses Saga pattern for atomic operation with rollback on failure.\n */\n async applyTreeSnapshot(snapshot: TreeSnapshot): Promise<void> {\n if (!this.apiClient) {\n throw new Error(\"Cannot apply snapshot: API client not configured\");\n }\n\n if (!snapshot.archiveUrl) {\n this.logger.warn(\"Cannot apply snapshot: no archive URL\", {\n treeHash: snapshot.treeHash,\n changes: snapshot.changes.length,\n });\n throw new Error(\"Cannot apply snapshot: no archive URL\");\n }\n\n const saga = new ApplySnapshotSaga(this.logger);\n\n const result = await saga.run({\n snapshot,\n repositoryPath: this.repositoryPath,\n apiClient: this.apiClient,\n taskId: this.taskId,\n runId: this.runId,\n });\n\n if (!result.success) {\n this.logger.error(\"Failed to apply tree snapshot\", {\n error: result.error,\n failedStep: result.failedStep,\n treeHash: snapshot.treeHash,\n });\n throw new Error(\n `Failed to apply snapshot at step '${result.failedStep}': ${result.error}`,\n );\n }\n\n // Only update lastTreeHash on success\n this.lastTreeHash = result.data.treeHash;\n }\n\n /**\n * Get the last captured tree hash.\n */\n getLastTreeHash(): string | null {\n return this.lastTreeHash;\n }\n\n /**\n * Set the last tree hash (used when resuming).\n */\n setLastTreeHash(hash: string | null): void {\n this.lastTreeHash = hash;\n }\n}\n\n/**\n * Check if a commit is available on any remote branch.\n * Used to validate that cloud can fetch the base commit during handoff.\n */\nexport async function isCommitOnRemote(\n commit: string,\n cwd: string,\n): Promise<boolean> {\n return gitIsCommitOnRemote(cwd, commit);\n}\n\n/**\n * Validate that a snapshot can be handed off to cloud execution.\n * Cloud needs to be able to fetch the baseCommit from a remote.\n *\n * @throws Error if the snapshot cannot be restored on cloud\n */\nexport async function validateForCloudHandoff(\n snapshot: TreeSnapshot,\n repositoryPath: string,\n): Promise<void> {\n if (!snapshot.baseCommit) {\n throw new Error(\"Cannot hand off to cloud: no base commit\");\n }\n\n const onRemote = await isCommitOnRemote(snapshot.baseCommit, repositoryPath);\n if (!onRemote) {\n throw new Error(\n `Cannot hand off to cloud: commit ${snapshot.baseCommit.slice(0, 7)} is not pushed. ` +\n `Run 'git push' to push your branch first.`,\n );\n }\n}\n","import type { ContentBlock } from \"@agentclientprotocol/sdk\";\nimport { Saga } from \"@posthog/shared\";\nimport { POSTHOG_NOTIFICATIONS } from \"../acp-extensions.js\";\nimport type { PostHogAPIClient } from \"../posthog-api.js\";\nimport { TreeTracker } from \"../tree-tracker.js\";\nimport type {\n DeviceInfo,\n StoredNotification,\n TreeSnapshotEvent,\n} from \"../types.js\";\nimport { Logger } from \"../utils/logger.js\";\n\nexport interface ConversationTurn {\n role: \"user\" | \"assistant\";\n content: ContentBlock[];\n toolCalls?: ToolCallInfo[];\n}\n\nexport interface ToolCallInfo {\n toolCallId: string;\n toolName: string;\n input: unknown;\n result?: unknown;\n}\n\nexport interface ResumeInput {\n taskId: string;\n runId: string;\n repositoryPath: string;\n apiClient: PostHogAPIClient;\n logger?: Logger;\n}\n\nexport interface ResumeOutput {\n conversation: ConversationTurn[];\n latestSnapshot: TreeSnapshotEvent | null;\n snapshotApplied: boolean;\n interrupted: boolean;\n lastDevice?: DeviceInfo;\n logEntryCount: number;\n}\n\nexport class ResumeSaga extends Saga<ResumeInput, ResumeOutput> {\n protected async execute(input: ResumeInput): Promise<ResumeOutput> {\n const { taskId, runId, repositoryPath, apiClient } = input;\n const logger =\n input.logger || new Logger({ debug: false, prefix: \"[Resume]\" });\n\n // Step 1: Fetch task run (read-only)\n const taskRun = await this.readOnlyStep(\"fetch_task_run\", () =>\n apiClient.getTaskRun(taskId, runId),\n );\n\n if (!taskRun.log_url) {\n this.log.info(\"No log URL found, starting fresh\");\n return this.emptyResult();\n }\n\n // Step 2: Fetch log entries (read-only)\n const entries = await this.readOnlyStep(\"fetch_logs\", () =>\n apiClient.fetchTaskRunLogs(taskRun),\n );\n\n if (entries.length === 0) {\n this.log.info(\"No log entries found, starting fresh\");\n return this.emptyResult();\n }\n\n this.log.info(\"Fetched log entries\", { count: entries.length });\n\n // Step 3: Find latest snapshot (read-only, pure computation)\n const latestSnapshot = await this.readOnlyStep(\"find_snapshot\", () =>\n Promise.resolve(this.findLatestTreeSnapshot(entries)),\n );\n\n // Step 4: Apply snapshot if present (wrapped in step for consistent logging)\n // Note: We use a try/catch inside the step because snapshot failure should NOT fail the saga\n let snapshotApplied = false;\n if (latestSnapshot?.archiveUrl) {\n this.log.info(\"Found tree snapshot\", {\n treeHash: latestSnapshot.treeHash,\n hasArchiveUrl: true,\n changes: latestSnapshot.changes?.length ?? 0,\n interrupted: latestSnapshot.interrupted,\n });\n\n await this.step({\n name: \"apply_snapshot\",\n execute: async () => {\n const treeTracker = new TreeTracker({\n repositoryPath,\n taskId,\n runId,\n apiClient,\n logger: logger.child(\"TreeTracker\"),\n });\n\n try {\n await treeTracker.applyTreeSnapshot(latestSnapshot);\n treeTracker.setLastTreeHash(latestSnapshot.treeHash);\n snapshotApplied = true;\n this.log.info(\"Tree snapshot applied successfully\", {\n treeHash: latestSnapshot.treeHash,\n });\n } catch (error) {\n // Log but don't fail - continue with conversation rebuild\n // ApplySnapshotSaga handles its own rollback internally\n this.log.warn(\n \"Failed to apply tree snapshot, continuing without it\",\n {\n error: error instanceof Error ? error.message : String(error),\n treeHash: latestSnapshot.treeHash,\n },\n );\n }\n },\n rollback: async () => {\n // Inner ApplySnapshotSaga handles its own rollback\n },\n });\n } else if (latestSnapshot) {\n this.log.warn(\n \"Snapshot found but has no archive URL - files cannot be restored\",\n {\n treeHash: latestSnapshot.treeHash,\n changes: latestSnapshot.changes?.length ?? 0,\n },\n );\n }\n\n // Step 5: Rebuild conversation (read-only, pure computation)\n const conversation = await this.readOnlyStep(\"rebuild_conversation\", () =>\n Promise.resolve(this.rebuildConversation(entries)),\n );\n\n // Step 6: Find device info (read-only, pure computation)\n const lastDevice = await this.readOnlyStep(\"find_device\", () =>\n Promise.resolve(this.findLastDeviceInfo(entries)),\n );\n\n this.log.info(\"Resume state rebuilt\", {\n turns: conversation.length,\n hasSnapshot: !!latestSnapshot,\n snapshotApplied,\n interrupted: latestSnapshot?.interrupted ?? false,\n });\n\n return {\n conversation,\n latestSnapshot,\n snapshotApplied,\n interrupted: latestSnapshot?.interrupted ?? false,\n lastDevice,\n logEntryCount: entries.length,\n };\n }\n\n private emptyResult(): ResumeOutput {\n return {\n conversation: [],\n latestSnapshot: null,\n snapshotApplied: false,\n interrupted: false,\n logEntryCount: 0,\n };\n }\n\n private findLatestTreeSnapshot(\n entries: StoredNotification[],\n ): TreeSnapshotEvent | null {\n const sdkPrefixedMethod = `_${POSTHOG_NOTIFICATIONS.TREE_SNAPSHOT}`;\n\n for (let i = entries.length - 1; i >= 0; i--) {\n const entry = entries[i];\n const method = entry.notification?.method;\n if (\n method === sdkPrefixedMethod ||\n method === POSTHOG_NOTIFICATIONS.TREE_SNAPSHOT\n ) {\n const params = entry.notification.params as\n | TreeSnapshotEvent\n | undefined;\n if (params?.treeHash) {\n return params;\n }\n }\n }\n return null;\n }\n\n private findLastDeviceInfo(\n entries: StoredNotification[],\n ): DeviceInfo | undefined {\n for (let i = entries.length - 1; i >= 0; i--) {\n const entry = entries[i];\n const params = entry.notification?.params as\n | { device?: DeviceInfo }\n | undefined;\n if (params?.device) {\n return params.device;\n }\n }\n return undefined;\n }\n\n private rebuildConversation(\n entries: StoredNotification[],\n ): ConversationTurn[] {\n const turns: ConversationTurn[] = [];\n let currentAssistantContent: ContentBlock[] = [];\n let currentToolCalls: ToolCallInfo[] = [];\n\n for (const entry of entries) {\n const method = entry.notification?.method;\n const params = entry.notification?.params as Record<string, unknown>;\n\n if (method === \"session/update\" && params?.update) {\n const update = params.update as Record<string, unknown>;\n const sessionUpdate = update.sessionUpdate as string;\n\n switch (sessionUpdate) {\n case \"user_message\":\n case \"user_message_chunk\": {\n if (\n currentAssistantContent.length > 0 ||\n currentToolCalls.length > 0\n ) {\n turns.push({\n role: \"assistant\",\n content: currentAssistantContent,\n toolCalls:\n currentToolCalls.length > 0 ? currentToolCalls : undefined,\n });\n currentAssistantContent = [];\n currentToolCalls = [];\n }\n\n const content = update.content as ContentBlock | ContentBlock[];\n const contentArray = Array.isArray(content) ? content : [content];\n turns.push({\n role: \"user\",\n content: contentArray,\n });\n break;\n }\n\n case \"agent_message_chunk\": {\n const content = update.content as ContentBlock | undefined;\n if (content) {\n if (\n content.type === \"text\" &&\n currentAssistantContent.length > 0 &&\n currentAssistantContent[currentAssistantContent.length - 1]\n .type === \"text\"\n ) {\n const lastBlock = currentAssistantContent[\n currentAssistantContent.length - 1\n ] as { type: \"text\"; text: string };\n lastBlock.text += (\n content as { type: \"text\"; text: string }\n ).text;\n } else {\n currentAssistantContent.push(content);\n }\n }\n break;\n }\n\n case \"tool_call\":\n case \"tool_call_update\": {\n const meta = (update._meta as Record<string, unknown>)\n ?.claudeCode as Record<string, unknown> | undefined;\n if (meta) {\n const toolCallId = meta.toolCallId as string | undefined;\n const toolName = meta.toolName as string | undefined;\n const toolInput = meta.toolInput;\n const toolResponse = meta.toolResponse;\n\n if (toolCallId && toolName) {\n let toolCall = currentToolCalls.find(\n (tc) => tc.toolCallId === toolCallId,\n );\n if (!toolCall) {\n toolCall = {\n toolCallId,\n toolName,\n input: toolInput,\n };\n currentToolCalls.push(toolCall);\n }\n\n if (toolResponse !== undefined) {\n toolCall.result = toolResponse;\n }\n }\n }\n break;\n }\n\n case \"tool_result\": {\n const meta = (update._meta as Record<string, unknown>)\n ?.claudeCode as Record<string, unknown> | undefined;\n if (meta) {\n const toolCallId = meta.toolCallId as string | undefined;\n const toolResponse = meta.toolResponse;\n\n if (toolCallId) {\n const toolCall = currentToolCalls.find(\n (tc) => tc.toolCallId === toolCallId,\n );\n if (toolCall && toolResponse !== undefined) {\n toolCall.result = toolResponse;\n }\n }\n }\n break;\n }\n }\n }\n }\n\n if (currentAssistantContent.length > 0 || currentToolCalls.length > 0) {\n turns.push({\n role: \"assistant\",\n content: currentAssistantContent,\n toolCalls: currentToolCalls.length > 0 ? currentToolCalls : undefined,\n });\n }\n\n return turns;\n }\n}\n","/**\n * Resume - Restore agent state from persisted log\n *\n * Handles resuming a task from any point:\n * - Fetches log via the PostHog API\n * - Finds latest tree_snapshot event\n * - Rebuilds conversation from log events\n * - Restores working tree from snapshot\n *\n * Uses Saga pattern for atomic operations with clear success/failure tracking.\n *\n * The log is the single source of truth for:\n * - Conversation history (user_message, agent_message_chunk, tool_call, tool_result)\n * - Working tree state (tree_snapshot events)\n * - Session metadata (device info, mode changes)\n */\n\nimport type { ContentBlock } from \"@agentclientprotocol/sdk\";\nimport type { PostHogAPIClient } from \"./posthog-api.js\";\nimport { ResumeSaga } from \"./sagas/resume-saga.js\";\nimport type { DeviceInfo, TreeSnapshotEvent } from \"./types.js\";\nimport { Logger } from \"./utils/logger.js\";\n\nexport interface ResumeState {\n conversation: ConversationTurn[];\n latestSnapshot: TreeSnapshotEvent | null;\n /** Whether the tree snapshot was successfully applied (files restored) */\n snapshotApplied: boolean;\n interrupted: boolean;\n lastDevice?: DeviceInfo;\n logEntryCount: number;\n}\n\nexport interface ConversationTurn {\n role: \"user\" | \"assistant\";\n content: ContentBlock[];\n toolCalls?: ToolCallInfo[];\n}\n\nexport interface ToolCallInfo {\n toolCallId: string;\n toolName: string;\n input: unknown;\n result?: unknown;\n}\n\nexport interface ResumeConfig {\n taskId: string;\n runId: string;\n repositoryPath: string;\n apiClient: PostHogAPIClient;\n logger?: Logger;\n}\n\n/**\n * Resume a task from its persisted log.\n * Returns the rebuilt state for the agent to continue from.\n *\n * Uses Saga pattern internally for atomic operations.\n * Note: snapshotApplied field indicates if files were actually restored -\n * even if latestSnapshot is non-null, files may not have been restored if\n * the snapshot had no archive URL or download/extraction failed.\n */\nexport async function resumeFromLog(\n config: ResumeConfig,\n): Promise<ResumeState> {\n const logger =\n config.logger || new Logger({ debug: false, prefix: \"[Resume]\" });\n\n logger.info(\"Resuming from log\", {\n taskId: config.taskId,\n runId: config.runId,\n });\n\n const saga = new ResumeSaga(logger);\n\n const result = await saga.run({\n taskId: config.taskId,\n runId: config.runId,\n repositoryPath: config.repositoryPath,\n apiClient: config.apiClient,\n logger,\n });\n\n if (!result.success) {\n logger.error(\"Failed to resume from log\", {\n error: result.error,\n failedStep: result.failedStep,\n });\n throw new Error(\n `Failed to resume at step '${result.failedStep}': ${result.error}`,\n );\n }\n\n return {\n conversation: result.data.conversation as ConversationTurn[],\n latestSnapshot: result.data.latestSnapshot,\n snapshotApplied: result.data.snapshotApplied,\n interrupted: result.data.interrupted,\n lastDevice: result.data.lastDevice,\n logEntryCount: result.data.logEntryCount,\n };\n}\n\n/**\n * Convert resumed conversation back to API format for continuation.\n */\nexport function conversationToPromptHistory(\n conversation: ConversationTurn[],\n): Array<{ role: \"user\" | \"assistant\"; content: ContentBlock[] }> {\n return conversation.map((turn) => ({\n role: turn.role,\n content: turn.content,\n }));\n}\n"],"mappings":"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","names":["debug","os","useColors","debug","path","exists","__export","deferred","WritableStream","resolve","fs","os","path","RequestError","text","path","path","input","text","trimmed","os","path","RequestError","spawn","existsSync","existsSync","spawn","filteredOptions","currentAllowed","nextCurrent","trimmed","sessionId","text","writer","taskRunId","fs","path","import_promise_deferred","Buffer","spawn","path","trimmed","ExitCodes","commands","parser","parsers","text","CheckRepoActions","CleanOptions","append","GitConfigScope","DiffNameStatus","query","ResetMode","debug","onError","instance","excludeOptions","disallowedCommand","__commonJS","GitExecutor","SimpleGitApi","Scheduler","configurationErrorTask","asArray","filterArray","filterPrimitives","filterString","filterStringOrStringArray","filterType","getTrailingOptions","trailingFunctionArgument","trailingOptionsArgument","applyPatchTask","branchTask","branchLocalTask","deleteBranchesTask","deleteBranchTask","checkIgnoreTask","checkIsRepoTask","cloneTask","cloneMirrorTask","cleanWithOptionsTask","isCleanOptionsArray","diffSummaryTask","fetchTask","moveTask","pullTask","pushTagsTask","addRemoteTask","getRemotesTask","listRemotesTask","remoteTask","removeRemoteTask","getResetMode","resetTask","stashListTask","addSubModuleTask","initSubModuleTask","subModuleTask","updateSubModuleTask","addAnnotatedTagTask","addTagTask","tagListTask","straightThroughBufferTask","straightThroughStringTask","Git","input","plugin","fs","path","resolve","mkdir","rm","writeFile","join","existsSync","fs","path","existsSync","stdout","join","mkdir","writeFile","rm","existsSync","readFile","rm","join","CaptureTreeSaga","join","existsSync","rm","readFile","CaptureTreeSaga","isCommitOnRemote"]}