@leo000001/claude-code-mcp 2.0.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/server.ts","../src/session/manager.ts","../src/types.ts","../src/tools/query-consumer.ts","../src/utils/windows.ts","../src/utils/resume-token.ts","../src/utils/race-with-abort.ts","../src/utils/build-options.ts","../src/tools/claude-code.ts","../src/tools/claude-code-reply.ts","../src/tools/tool-discovery.ts","../src/tools/claude-code-check.ts","../src/tools/claude-code-session.ts"],"sourcesContent":["/**\n * claude-code-mcp - MCP server entry point\n *\n * Starts the MCP server with stdio transport.\n * Usage: npx claude-code-mcp\n */\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { createServer } from \"./server.js\";\nimport { checkWindowsBashAvailability } from \"./utils/windows.js\";\n\nasync function main(): Promise<void> {\n const serverCwd = process.cwd();\n const server = createServer(serverCwd);\n const transport = new StdioServerTransport();\n\n // Handle graceful shutdown (idempotent)\n let closing = false;\n const shutdown = async () => {\n if (closing) return;\n closing = true;\n try {\n await server.close();\n } catch {\n // Ignore close errors during shutdown\n }\n // Allow stdio to flush before exiting\n process.exitCode = 0;\n setTimeout(() => process.exit(0), 100);\n };\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n await server.connect(transport);\n\n // Check Windows bash.exe availability and warn early\n checkWindowsBashAvailability();\n\n // Log to stderr (stdout is used for MCP communication)\n console.error(`claude-code-mcp server started (cwd: ${serverCwd})`);\n}\n\nmain().catch((err) => {\n console.error(\"Fatal error:\", err);\n process.exit(1);\n});\n","/**\n * MCP Server definition - registers tools and handles requests\n */\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { SessionManager } from \"./session/manager.js\";\nimport { executeClaudeCode } from \"./tools/claude-code.js\";\nimport { executeClaudeCodeReply } from \"./tools/claude-code-reply.js\";\nimport { executeClaudeCodeCheck } from \"./tools/claude-code-check.js\";\nimport { executeClaudeCodeSession } from \"./tools/claude-code-session.js\";\nimport { buildInternalToolsDescription, ToolDiscoveryCache } from \"./tools/tool-discovery.js\";\nimport {\n EFFORT_LEVELS,\n AGENT_MODELS,\n CHECK_ACTIONS,\n CHECK_RESPONSE_MODES,\n SESSION_ACTIONS,\n ErrorCode,\n} from \"./types.js\";\n\ndeclare const __PKG_VERSION__: string;\nconst SERVER_VERSION = typeof __PKG_VERSION__ !== \"undefined\" ? __PKG_VERSION__ : \"0.0.0-dev\";\n\nexport function createServer(serverCwd: string): McpServer {\n const sessionManager = new SessionManager();\n const toolCache = new ToolDiscoveryCache();\n\n const server = new McpServer({\n name: \"claude-code-mcp\",\n version: SERVER_VERSION,\n });\n\n // ── Shared Zod fragments ──────────────────────────────────────────────\n const agentDefinitionSchema = z.object({\n description: z.string(),\n prompt: z.string(),\n tools: z.array(z.string()).optional(),\n disallowedTools: z.array(z.string()).optional(),\n model: z.enum(AGENT_MODELS).optional(),\n maxTurns: z.number().int().positive().optional(),\n mcpServers: z.array(z.union([z.string(), z.record(z.string(), z.unknown())])).optional(),\n skills: z.array(z.string()).optional(),\n criticalSystemReminder_EXPERIMENTAL: z.string().optional(),\n });\n\n const systemPromptSchema = z.union([\n z.string(),\n z.object({\n type: z.literal(\"preset\"),\n preset: z.literal(\"claude_code\"),\n append: z.string().optional().describe(\"Additional instructions to append to the preset\"),\n }),\n ]);\n\n const toolsConfigSchema = z.union([\n z.array(z.string()),\n z.object({\n type: z.literal(\"preset\"),\n preset: z.literal(\"claude_code\"),\n }),\n ]);\n\n const thinkingSchema = z.union([\n z.object({ type: z.literal(\"adaptive\") }),\n z.object({\n type: z.literal(\"enabled\"),\n budgetTokens: z.number().int().positive().describe(\"Token budget for thinking\"),\n }),\n z.object({ type: z.literal(\"disabled\") }),\n ]);\n\n const outputFormatSchema = z.object({\n type: z.literal(\"json_schema\"),\n schema: z.record(z.string(), z.unknown()).describe(\"JSON Schema for structured output\"),\n });\n\n /** Advanced options shared by claude_code (and reused in diskResumeConfig). */\n const advancedOptionsSchema = z\n .object({\n tools: toolsConfigSchema\n .optional()\n .describe(\n \"Define the base tool set visible to the agent. Default: omitted (SDK/Claude Code default). Pass an array of tool names, or {type: 'preset', preset: 'claude_code'} for the default set.\"\n ),\n persistSession: z\n .boolean()\n .optional()\n .describe(\"Persist session history to disk (~/.claude/projects). Default: true.\"),\n sessionInitTimeoutMs: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"How long to wait (in ms) for the agent process to initialize. Default: 10000.\"),\n agents: z\n .record(z.string(), agentDefinitionSchema)\n .optional()\n .describe(\n \"Define custom sub-agents the main agent can delegate tasks to. Each key is the agent name.\"\n ),\n agent: z\n .string()\n .optional()\n .describe(\"Name of a custom agent (defined in 'agents') to use as the primary agent.\"),\n maxBudgetUsd: z\n .number()\n .positive()\n .optional()\n .describe(\"Maximum budget in USD for this session.\"),\n effort: z\n .enum(EFFORT_LEVELS)\n .optional()\n .describe(\"Effort level: 'low' | 'medium' | 'high' | 'max'.\"),\n betas: z.array(z.string()).optional().describe(\"Beta features to enable.\"),\n additionalDirectories: z\n .array(z.string())\n .optional()\n .describe(\"Additional directories the agent can access beyond cwd.\"),\n outputFormat: outputFormatSchema\n .optional()\n .describe(\"Structured output format with JSON Schema.\"),\n thinking: thinkingSchema\n .optional()\n .describe(\"Thinking mode: 'adaptive' | 'enabled' (with budget) | 'disabled'.\"),\n pathToClaudeCodeExecutable: z\n .string()\n .optional()\n .describe(\"Path to the Claude Code executable. Default: SDK-bundled.\"),\n mcpServers: z\n .record(z.string(), z.record(z.string(), z.unknown()))\n .optional()\n .describe(\"MCP server configurations (key: server name, value: server config).\"),\n sandbox: z\n .record(z.string(), z.unknown())\n .optional()\n .describe(\"Sandbox configuration for isolating shell command execution.\"),\n fallbackModel: z\n .string()\n .optional()\n .describe(\"Fallback model if the primary model fails or is unavailable.\"),\n enableFileCheckpointing: z\n .boolean()\n .optional()\n .describe(\"Enable file checkpointing to track file changes. Default: false.\"),\n includePartialMessages: z\n .boolean()\n .optional()\n .describe(\"Include intermediate messages as events in claude_code_check. Default: false.\"),\n strictMcpConfig: z\n .boolean()\n .optional()\n .describe(\"Enforce strict validation of MCP server configurations. Default: false.\"),\n settingSources: z\n .array(z.enum([\"user\", \"project\", \"local\"]))\n .optional()\n .describe(\n \"Which local config files to load. Default: ['user', 'project', 'local']. Pass [] to disable all.\"\n ),\n debug: z.boolean().optional().describe(\"Enable debug mode. Default: false.\"),\n debugFile: z\n .string()\n .optional()\n .describe(\"Write debug logs to a file path (implicitly enables debug mode).\"),\n env: z\n .record(z.string(), z.string().optional())\n .optional()\n .describe(\"Environment variables to merge with process.env.\"),\n })\n .optional()\n .describe(\n \"Low-frequency SDK options. All fields are optional with sensible defaults. Most callers can omit this entirely.\"\n );\n\n // Tool 1: claude_code - Start a new agent session\n server.tool(\n \"claude_code\",\n buildInternalToolsDescription(toolCache.getTools()),\n {\n prompt: z.string().describe(\"The task or question for Claude Code\"),\n cwd: z.string().optional().describe(\"Working directory. Default: server cwd.\"),\n allowedTools: z\n .array(z.string())\n .optional()\n .describe(\n \"Tools the agent can use without asking for permission. Default: [] (no auto-approvals). Example: ['Bash', 'Read', 'Write', 'Edit']. Tools not listed here or in disallowedTools will trigger a permission request via claude_code_check.\"\n ),\n disallowedTools: z\n .array(z.string())\n .optional()\n .describe(\n \"Tools the agent is forbidden from using. Default: [] (none). Takes priority over allowedTools.\"\n ),\n maxTurns: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"Maximum number of reasoning steps the agent can take.\"),\n model: z.string().optional().describe(\"Model to use, e.g. 'claude-sonnet-4-5-20250929'.\"),\n systemPrompt: systemPromptSchema\n .optional()\n .describe(\n \"Override the agent's system prompt. Pass a string for full replacement, or use {type: 'preset', preset: 'claude_code', append: '...'} to extend the default.\"\n ),\n permissionRequestTimeoutMs: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\n \"How long to wait (in ms) for a permission decision via claude_code_check before auto-denying. Default: 60000.\"\n ),\n advanced: advancedOptionsSchema,\n },\n async (args, extra) => {\n try {\n const result = await executeClaudeCode(\n args,\n sessionManager,\n serverCwd,\n toolCache,\n extra.signal\n );\n const isError = typeof (result as { error?: unknown }).error === \"string\";\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n isError,\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error [${ErrorCode.INTERNAL}]: ${message}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // Tool 2: claude_code_reply - Continue an existing session\n server.tool(\n \"claude_code_reply\",\n `Send a follow-up message to an existing Claude Code session.\n\nThe agent retains full context from previous turns (files read, code analyzed, conversation history). Returns immediately — use claude_code_check to poll for the result.\n\nSupports session forking (forkSession=true) to explore alternative approaches without modifying the original session.\n\nDefaults:\n- forkSession: false\n- sessionInitTimeoutMs: 10000 (only used when forkSession=true)\n- permissionRequestTimeoutMs: 60000\n- Disk resume: disabled unless CLAUDE_CODE_MCP_ALLOW_DISK_RESUME=1\n\nDisk resume: If the server restarted and the session is no longer in memory, set CLAUDE_CODE_MCP_ALLOW_DISK_RESUME=1 to let the agent resume from its on-disk transcript. Pass diskResumeConfig with resumeToken and session parameters.`,\n {\n sessionId: z\n .string()\n .describe(\"The session ID to continue (from a previous claude_code call)\"),\n prompt: z.string().describe(\"Follow-up prompt or instruction\"),\n forkSession: z\n .boolean()\n .optional()\n .describe(\n \"Branch this session into a new copy that diverges from the current point. The original session remains unchanged. Default: false.\"\n ),\n sessionInitTimeoutMs: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"How long to wait (in ms) for a forked session to initialize. Default: 10000.\"),\n permissionRequestTimeoutMs: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\n \"How long to wait (in ms) for a permission decision via claude_code_check before auto-denying. Default: 60000.\"\n ),\n diskResumeConfig: z\n .object({\n resumeToken: z\n .string()\n .optional()\n .describe(\n \"Resume token returned by claude_code / claude_code_reply. Required for disk resume.\"\n ),\n cwd: z.string().optional().describe(\"Working directory. Required for disk resume.\"),\n allowedTools: z\n .array(z.string())\n .optional()\n .describe(\"Tools the agent can use without permission.\"),\n disallowedTools: z\n .array(z.string())\n .optional()\n .describe(\"Tools the agent is forbidden from using.\"),\n tools: toolsConfigSchema.optional().describe(\"Which tools the agent can see.\"),\n persistSession: z\n .boolean()\n .optional()\n .describe(\"Persist session history to disk. Default: true.\"),\n maxTurns: z.number().int().positive().optional().describe(\"Maximum reasoning steps.\"),\n model: z.string().optional().describe(\"Model to use.\"),\n systemPrompt: systemPromptSchema\n .optional()\n .describe(\"Override the agent's system prompt.\"),\n agents: z\n .record(z.string(), agentDefinitionSchema)\n .optional()\n .describe(\"Define custom sub-agents.\"),\n agent: z.string().optional().describe(\"Name of a custom agent to use as primary.\"),\n maxBudgetUsd: z.number().positive().optional().describe(\"Maximum budget in USD.\"),\n effort: z.enum(EFFORT_LEVELS).optional().describe(\"Effort level.\"),\n betas: z.array(z.string()).optional().describe(\"Beta features to enable.\"),\n additionalDirectories: z\n .array(z.string())\n .optional()\n .describe(\"Additional accessible directories.\"),\n outputFormat: outputFormatSchema.optional().describe(\"Structured output format.\"),\n thinking: thinkingSchema.optional().describe(\"Thinking mode configuration.\"),\n resumeSessionAt: z\n .string()\n .optional()\n .describe(\"Resume only up to a specific message UUID.\"),\n pathToClaudeCodeExecutable: z\n .string()\n .optional()\n .describe(\"Path to the Claude Code executable.\"),\n mcpServers: z\n .record(z.string(), z.record(z.string(), z.unknown()))\n .optional()\n .describe(\"MCP server configurations.\"),\n sandbox: z.record(z.string(), z.unknown()).optional().describe(\"Sandbox configuration.\"),\n fallbackModel: z.string().optional().describe(\"Fallback model.\"),\n enableFileCheckpointing: z\n .boolean()\n .optional()\n .describe(\"Enable file checkpointing. Default: false.\"),\n includePartialMessages: z\n .boolean()\n .optional()\n .describe(\"Include intermediate messages as events. Default: false.\"),\n strictMcpConfig: z\n .boolean()\n .optional()\n .describe(\"Enforce strict MCP validation. Default: false.\"),\n settingSources: z\n .array(z.enum([\"user\", \"project\", \"local\"]))\n .optional()\n .describe(\"Which local config files to load.\"),\n debug: z.boolean().optional().describe(\"Enable debug mode. Default: false.\"),\n debugFile: z.string().optional().describe(\"Write debug logs to a file path.\"),\n env: z\n .record(z.string(), z.string().optional())\n .optional()\n .describe(\"Environment variables to merge with process.env.\"),\n })\n .optional()\n .describe(\n \"Disk resume fallback configuration. Only needed when CLAUDE_CODE_MCP_ALLOW_DISK_RESUME=1 and the in-memory session is missing. Contains resumeToken + all session config overrides.\"\n ),\n },\n async (args, extra) => {\n try {\n const result = await executeClaudeCodeReply(args, sessionManager, toolCache, extra.signal);\n const isError = typeof (result as { error?: unknown }).error === \"string\";\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n isError,\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error [${ErrorCode.INTERNAL}]: ${message}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // Tool 3: claude_code_session - Manage sessions\n server.tool(\n \"claude_code_session\",\n `List, inspect, or cancel Claude Code sessions.\n\n- action=\"list\": Get all sessions with their status, cost, turn count, and settings.\n- action=\"get\": Get full details for one session (pass sessionId). Add includeSensitive=true to also see cwd, systemPrompt, agents, and additionalDirectories.\n- action=\"cancel\": Stop a running session immediately (pass sessionId).`,\n {\n action: z.enum(SESSION_ACTIONS).describe(\"Action to perform: 'list', 'get', or 'cancel'\"),\n sessionId: z.string().optional().describe(\"Session ID (required for 'get' and 'cancel')\"),\n includeSensitive: z\n .boolean()\n .optional()\n .describe(\n \"When true, includes sensitive fields (cwd, systemPrompt, agents, additionalDirectories) in the response. Default: false.\"\n ),\n },\n async (args) => {\n const result = executeClaudeCodeSession(args, sessionManager);\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n isError: result.isError ?? false,\n };\n }\n );\n\n // Tool 4: claude_code_check - Poll events + respond to permission requests\n server.tool(\n \"claude_code_check\",\n `Query a running session for new events, retrieve the final result, or respond to permission requests.\n\nTwo actions:\n\nDefaults (poll):\n- responseMode: \"minimal\"\n- minimal mode strips verbose fields from assistant messages (usage, model, id, cache_control) and filters out noisy progress events (tool_progress, auth_status)\n- maxEvents: 200 in minimal mode (unlimited in full mode unless maxEvents is set)\n\naction=\"poll\" — Retrieve events since the last poll.\n Returns events (agent output, progress updates, permission requests, errors, final result).\n Pass the cursor from the previous poll's nextCursor for incremental updates. Omit cursor to get all buffered events.\n If the agent is waiting for permission, the response includes an \"actions\" array with pending requests.\n\naction=\"respond_permission\" — Approve or deny a pending permission request.\n Pass the requestId from the actions array, plus decision=\"allow\" or decision=\"deny\".\n Approving resumes agent execution. Denying (with optional interrupt=true) can halt the entire session.\n The response also includes the latest poll state (events, status, etc.), so a separate poll call is not needed.`,\n {\n action: z.enum(CHECK_ACTIONS).describe('Action to perform: \"poll\" or \"respond_permission\"'),\n sessionId: z.string().describe(\"Session ID to check\"),\n cursor: z\n .number()\n .int()\n .nonnegative()\n .optional()\n .describe(\n \"Event cursor for incremental polling. Pass nextCursor from the previous poll response.\"\n ),\n responseMode: z\n .enum(CHECK_RESPONSE_MODES)\n .optional()\n .describe(\"Response shaping preset. 'minimal' reduces payload size. Default: 'minimal'.\"),\n maxEvents: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\n \"Max number of events to return per poll (pagination via nextCursor). Default: 200 in minimal mode.\"\n ),\n\n requestId: z\n .string()\n .optional()\n .describe(\n \"The permission request ID to respond to (from the actions array). Required for respond_permission.\"\n ),\n decision: z\n .enum([\"allow\", \"deny\"])\n .optional()\n .describe(\n \"Whether to approve or reject the permission request. Required for respond_permission.\"\n ),\n denyMessage: z\n .string()\n .optional()\n .describe(\n \"Reason for denying, shown to the agent. Only used with decision='deny'. Default: 'Permission denied by caller'.\"\n ),\n interrupt: z\n .boolean()\n .optional()\n .describe(\n \"When true with decision='deny', stops the entire agent session. Default: false.\"\n ),\n\n pollOptions: z\n .object({\n includeTools: z\n .boolean()\n .optional()\n .describe(\"Include availableTools array from session init. Default: false.\"),\n includeEvents: z\n .boolean()\n .optional()\n .describe(\n \"When false, omits the events array (nextCursor still advances). Default: true.\"\n ),\n includeActions: z\n .boolean()\n .optional()\n .describe(\"When false, omits actions[] even if waiting_permission. Default: true.\"),\n includeResult: z\n .boolean()\n .optional()\n .describe(\"When false, omits the top-level result when idle/error. Default: true.\"),\n includeUsage: z\n .boolean()\n .optional()\n .describe(\"Include AgentResult.usage. Default: true in full mode, false in minimal.\"),\n includeModelUsage: z\n .boolean()\n .optional()\n .describe(\n \"Include AgentResult.modelUsage. Default: true in full mode, false in minimal.\"\n ),\n includeStructuredOutput: z\n .boolean()\n .optional()\n .describe(\n \"Include AgentResult.structuredOutput. Default: true in full mode, false in minimal.\"\n ),\n includeTerminalEvents: z\n .boolean()\n .optional()\n .describe(\n \"Include terminal result/error events in events stream. Default: true in full, false in minimal.\"\n ),\n includeProgressEvents: z\n .boolean()\n .optional()\n .describe(\n \"Include progress events (tool_progress, auth_status). Default: true in full, false in minimal.\"\n ),\n })\n .optional()\n .describe(\n \"Fine-grained poll control. Overrides responseMode defaults for individual fields. Most callers can omit this.\"\n ),\n\n permissionOptions: z\n .object({\n updatedInput: z\n .record(z.string(), z.unknown())\n .optional()\n .describe(\n \"Modified tool input to use instead of the original. Only with decision='allow'.\"\n ),\n updatedPermissions: z\n .array(z.record(z.string(), z.unknown()))\n .optional()\n .describe(\"Permission rule updates to apply. Only with decision='allow'.\"),\n })\n .optional()\n .describe(\n \"Advanced permission response options. Only used with respond_permission + decision='allow'.\"\n ),\n },\n async (args) => {\n const result = executeClaudeCodeCheck(args, sessionManager, toolCache);\n const isError = (result as { isError?: boolean }).isError === true;\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n isError,\n };\n }\n );\n\n // Cleanup on server close\n const originalClose = server.close.bind(server);\n server.close = async () => {\n sessionManager.destroy();\n await originalClose();\n };\n\n return server;\n}\n","/**\n * Session Manager - tracks and manages Claude Code agent sessions\n */\nimport type {\n EventBuffer,\n FinishFn,\n FinishSource,\n PermissionRequestRecord,\n PermissionResult,\n PublicSessionInfo,\n SensitiveSessionInfo,\n SessionInfo,\n PermissionMode,\n SessionEvent,\n SessionStatus,\n StoredAgentResult,\n} from \"../types.js\";\n\nconst DEFAULT_SESSION_TTL_MS = 30 * 60 * 1000; // 30 minutes idle timeout\nconst DEFAULT_RUNNING_SESSION_MAX_MS = 4 * 60 * 60 * 1000; // 4 hours max for running sessions\nconst DEFAULT_CLEANUP_INTERVAL_MS = 60_000;\n\nconst DEFAULT_EVENT_BUFFER_MAX_SIZE = 1000;\nconst DEFAULT_EVENT_BUFFER_HARD_MAX_SIZE = 2000;\n\ntype PendingPermission = {\n record: PermissionRequestRecord;\n finish: FinishFn;\n timeoutId?: ReturnType<typeof setTimeout>;\n};\n\ntype SessionRuntimeState = {\n buffer: EventBuffer;\n pendingPermissions: Map<string, PendingPermission>;\n storedResult?: StoredAgentResult;\n initTools?: string[];\n};\n\nexport class SessionManager {\n private sessions = new Map<string, SessionInfo>();\n private runtime = new Map<string, SessionRuntimeState>();\n private cleanupTimer: ReturnType<typeof setInterval>;\n private sessionTtlMs = DEFAULT_SESSION_TTL_MS;\n private runningSessionMaxMs = DEFAULT_RUNNING_SESSION_MAX_MS;\n\n constructor() {\n // Periodically clean up expired sessions\n this.cleanupTimer = setInterval(() => this.cleanup(), DEFAULT_CLEANUP_INTERVAL_MS);\n if (this.cleanupTimer.unref) {\n this.cleanupTimer.unref();\n }\n }\n\n create(params: {\n sessionId: string;\n cwd: string;\n model?: string;\n permissionMode?: PermissionMode;\n allowedTools?: SessionInfo[\"allowedTools\"];\n disallowedTools?: SessionInfo[\"disallowedTools\"];\n tools?: SessionInfo[\"tools\"];\n maxTurns?: SessionInfo[\"maxTurns\"];\n systemPrompt?: SessionInfo[\"systemPrompt\"];\n agents?: SessionInfo[\"agents\"];\n maxBudgetUsd?: SessionInfo[\"maxBudgetUsd\"];\n effort?: SessionInfo[\"effort\"];\n betas?: SessionInfo[\"betas\"];\n additionalDirectories?: SessionInfo[\"additionalDirectories\"];\n outputFormat?: SessionInfo[\"outputFormat\"];\n thinking?: SessionInfo[\"thinking\"];\n persistSession?: SessionInfo[\"persistSession\"];\n pathToClaudeCodeExecutable?: SessionInfo[\"pathToClaudeCodeExecutable\"];\n agent?: SessionInfo[\"agent\"];\n mcpServers?: SessionInfo[\"mcpServers\"];\n sandbox?: SessionInfo[\"sandbox\"];\n fallbackModel?: SessionInfo[\"fallbackModel\"];\n enableFileCheckpointing?: SessionInfo[\"enableFileCheckpointing\"];\n includePartialMessages?: SessionInfo[\"includePartialMessages\"];\n strictMcpConfig?: SessionInfo[\"strictMcpConfig\"];\n settingSources?: SessionInfo[\"settingSources\"];\n debug?: SessionInfo[\"debug\"];\n debugFile?: SessionInfo[\"debugFile\"];\n env?: SessionInfo[\"env\"];\n abortController?: AbortController;\n }): SessionInfo {\n const now = new Date().toISOString();\n const existing = this.sessions.get(params.sessionId);\n if (existing) {\n throw new Error(`Session '${params.sessionId}' already exists (status: ${existing.status})`);\n }\n const info: SessionInfo = {\n sessionId: params.sessionId,\n status: \"running\",\n createdAt: now,\n lastActiveAt: now,\n totalTurns: 0,\n totalCostUsd: 0,\n cwd: params.cwd,\n model: params.model,\n permissionMode: params.permissionMode ?? \"default\",\n allowedTools: params.allowedTools,\n disallowedTools: params.disallowedTools,\n tools: params.tools,\n maxTurns: params.maxTurns,\n systemPrompt: params.systemPrompt,\n agents: params.agents,\n maxBudgetUsd: params.maxBudgetUsd,\n effort: params.effort,\n betas: params.betas,\n additionalDirectories: params.additionalDirectories,\n outputFormat: params.outputFormat,\n thinking: params.thinking,\n persistSession: params.persistSession,\n pathToClaudeCodeExecutable: params.pathToClaudeCodeExecutable,\n agent: params.agent,\n mcpServers: params.mcpServers,\n sandbox: params.sandbox,\n fallbackModel: params.fallbackModel,\n enableFileCheckpointing: params.enableFileCheckpointing,\n includePartialMessages: params.includePartialMessages,\n strictMcpConfig: params.strictMcpConfig,\n settingSources: params.settingSources,\n debug: params.debug,\n debugFile: params.debugFile,\n env: params.env,\n abortController: params.abortController,\n };\n this.sessions.set(params.sessionId, info);\n this.runtime.set(params.sessionId, {\n buffer: {\n events: [],\n maxSize: DEFAULT_EVENT_BUFFER_MAX_SIZE,\n hardMaxSize: DEFAULT_EVENT_BUFFER_HARD_MAX_SIZE,\n nextId: 0,\n },\n pendingPermissions: new Map(),\n });\n return info;\n }\n\n get(sessionId: string): SessionInfo | undefined {\n return this.sessions.get(sessionId);\n }\n\n updateStatus(sessionId: string, status: SessionStatus): SessionInfo | undefined {\n return this.update(sessionId, { status });\n }\n\n list(): SessionInfo[] {\n return Array.from(this.sessions.values());\n }\n\n update(\n sessionId: string,\n patch: Partial<Omit<SessionInfo, \"sessionId\" | \"createdAt\" | \"lastActiveAt\">>\n ): SessionInfo | undefined {\n const info = this.sessions.get(sessionId);\n if (!info) return undefined;\n Object.assign(info, patch, { lastActiveAt: new Date().toISOString() });\n return info;\n }\n\n /**\n * Atomically transition a session from an expected status to \"running\".\n * Returns the session if successful, undefined if the session doesn't exist\n * or its current status doesn't match `expectedStatus`.\n */\n tryAcquire(\n sessionId: string,\n expectedStatus: SessionStatus,\n abortController: AbortController\n ): SessionInfo | undefined {\n if (expectedStatus !== \"idle\" && expectedStatus !== \"error\") return undefined;\n const info = this.sessions.get(sessionId);\n if (!info || info.status !== expectedStatus) return undefined;\n info.status = \"running\";\n info.abortController = abortController;\n info.lastActiveAt = new Date().toISOString();\n // M5 fix: clear stale result/error events at the idle/error → running\n // transition so the new run's event stream starts clean.\n this.clearTerminalEvents(sessionId);\n return info;\n }\n\n cancel(sessionId: string, opts?: { reason?: string; source?: string }): boolean {\n const info = this.sessions.get(sessionId);\n if (!info) return false;\n if (info.status !== \"running\" && info.status !== \"waiting_permission\") return false;\n\n if (info.status === \"waiting_permission\") {\n this.finishAllPending(\n sessionId,\n { behavior: \"deny\", message: \"Session cancelled\", interrupt: true },\n \"cancel\"\n );\n }\n if (info.abortController) {\n info.abortController.abort();\n }\n info.status = \"cancelled\";\n info.cancelledAt = new Date().toISOString();\n info.cancelledReason = opts?.reason ?? \"Session cancelled\";\n info.cancelledSource = opts?.source ?? \"cancel\";\n info.lastActiveAt = new Date().toISOString();\n return true;\n }\n\n delete(sessionId: string): boolean {\n this.finishAllPending(\n sessionId,\n { behavior: \"deny\", message: \"Session deleted\", interrupt: true },\n \"cleanup\"\n );\n this.runtime.delete(sessionId);\n return this.sessions.delete(sessionId);\n }\n\n setResult(sessionId: string, result: StoredAgentResult): void {\n const state = this.runtime.get(sessionId);\n if (!state) return;\n state.storedResult = result;\n }\n\n getResult(sessionId: string): StoredAgentResult | undefined {\n return this.runtime.get(sessionId)?.storedResult;\n }\n\n setInitTools(sessionId: string, tools: string[]): void {\n const state = this.runtime.get(sessionId);\n if (!state) return;\n state.initTools = tools;\n }\n\n getInitTools(sessionId: string): string[] | undefined {\n return this.runtime.get(sessionId)?.initTools;\n }\n\n pushEvent(\n sessionId: string,\n event: Omit<SessionEvent, \"id\" | \"pinned\"> & { pinned?: boolean }\n ): SessionEvent | undefined {\n const state = this.runtime.get(sessionId);\n if (!state) return undefined;\n const full = SessionManager.pushEvent(state.buffer, event, (requestId) =>\n state.pendingPermissions.has(requestId)\n );\n const info = this.sessions.get(sessionId);\n if (info) {\n info.lastActiveAt = new Date().toISOString();\n\n const data = event.data as Record<string, unknown> | null;\n const toolUseId =\n (typeof data?.tool_use_id === \"string\" && data.tool_use_id) ||\n (typeof data?.toolUseID === \"string\" && data.toolUseID) ||\n (typeof data?.parent_tool_use_id === \"string\" && data.parent_tool_use_id) ||\n undefined;\n if (toolUseId) info.lastToolUseId = toolUseId;\n }\n return full;\n }\n\n getLastEventId(sessionId: string): number | undefined {\n const state = this.runtime.get(sessionId);\n if (!state) return undefined;\n return state.buffer.nextId > 0 ? state.buffer.nextId - 1 : undefined;\n }\n\n readEvents(\n sessionId: string,\n cursor?: number\n ): {\n events: SessionEvent[];\n nextCursor: number;\n cursorResetTo?: number;\n } {\n const state = this.runtime.get(sessionId);\n if (!state) return { events: [], nextCursor: cursor ?? 0 };\n return SessionManager.readEvents(state.buffer, cursor);\n }\n\n clearTerminalEvents(sessionId: string): void {\n const state = this.runtime.get(sessionId);\n if (!state) return;\n SessionManager.clearTerminalEvents(state.buffer);\n }\n\n setPendingPermission(\n sessionId: string,\n req: PermissionRequestRecord,\n finish: FinishFn,\n timeoutMs: number\n ): boolean {\n const state = this.runtime.get(sessionId);\n const info = this.sessions.get(sessionId);\n if (!state || !info) return false;\n\n if (!state.pendingPermissions.has(req.requestId)) {\n const timeoutId = setTimeout(() => {\n this.finishRequest(\n sessionId,\n req.requestId,\n {\n behavior: \"deny\",\n message: `Permission request timed out after ${timeoutMs}ms.`,\n interrupt: false,\n },\n \"timeout\"\n );\n }, timeoutMs);\n\n state.pendingPermissions.set(req.requestId, { record: req, finish, timeoutId });\n info.status = \"waiting_permission\";\n info.lastActiveAt = new Date().toISOString();\n\n this.pushEvent(sessionId, {\n type: \"permission_request\",\n data: req,\n timestamp: new Date().toISOString(),\n });\n return true;\n }\n return false;\n }\n\n getPendingPermissionCount(sessionId: string): number {\n return this.runtime.get(sessionId)?.pendingPermissions.size ?? 0;\n }\n\n listPendingPermissions(sessionId: string): PermissionRequestRecord[] {\n const state = this.runtime.get(sessionId);\n if (!state) return [];\n return Array.from(state.pendingPermissions.values())\n .map((p) => p.record)\n .sort((a, b) => a.createdAt.localeCompare(b.createdAt));\n }\n\n finishRequest(\n sessionId: string,\n requestId: string,\n result: PermissionResult,\n source: FinishSource\n ): boolean {\n const state = this.runtime.get(sessionId);\n const info = this.sessions.get(sessionId);\n if (!state || !info) return false;\n\n const pending = state.pendingPermissions.get(requestId);\n if (!pending) return false;\n\n let finalResult = result;\n if (finalResult.behavior === \"allow\") {\n const disallowed = info.disallowedTools;\n if (\n Array.isArray(disallowed) &&\n disallowed.includes(pending.record.toolName) &&\n pending.record.toolName.trim() !== \"\"\n ) {\n finalResult = {\n behavior: \"deny\",\n message: `Tool '${pending.record.toolName}' is disallowed by session policy.`,\n interrupt: false,\n };\n }\n }\n\n if (pending.timeoutId) clearTimeout(pending.timeoutId);\n state.pendingPermissions.delete(requestId);\n\n this.pushEvent(sessionId, {\n type: \"permission_result\",\n data: { requestId, behavior: finalResult.behavior, source },\n timestamp: new Date().toISOString(),\n });\n\n try {\n pending.finish(finalResult);\n } catch {\n // ignore finish errors\n }\n\n if (info.status === \"waiting_permission\" && state.pendingPermissions.size === 0) {\n info.status = \"running\";\n info.lastActiveAt = new Date().toISOString();\n }\n\n return true;\n }\n\n finishAllPending(sessionId: string, result: PermissionResult, source: FinishSource): void {\n const state = this.runtime.get(sessionId);\n if (!state) return;\n for (const requestId of Array.from(state.pendingPermissions.keys())) {\n this.finishRequest(sessionId, requestId, result, source);\n }\n }\n\n /** Remove sessions that have been idle for too long, or stuck running too long */\n private cleanup(): void {\n const now = Date.now();\n for (const [id, info] of this.sessions) {\n const lastActive = new Date(info.lastActiveAt).getTime();\n if (Number.isNaN(lastActive)) {\n this.finishAllPending(\n id,\n { behavior: \"deny\", message: \"Session expired\", interrupt: true },\n \"cleanup\"\n );\n // Invalid timestamp — remove the session\n this.sessions.delete(id);\n this.runtime.delete(id);\n } else if (info.status === \"running\" && now - lastActive > this.runningSessionMaxMs) {\n // Stuck running session — abort and mark as error\n if (info.abortController) info.abortController.abort();\n info.status = \"error\";\n info.lastActiveAt = new Date().toISOString();\n } else if (\n info.status === \"waiting_permission\" &&\n now - lastActive > this.runningSessionMaxMs\n ) {\n this.finishAllPending(\n id,\n { behavior: \"deny\", message: \"Session timed out\", interrupt: true },\n \"cleanup\"\n );\n if (info.abortController) info.abortController.abort();\n info.status = \"error\";\n info.lastActiveAt = new Date().toISOString();\n } else if (\n info.status !== \"running\" &&\n info.status !== \"waiting_permission\" &&\n now - lastActive > this.sessionTtlMs\n ) {\n this.finishAllPending(\n id,\n { behavior: \"deny\", message: \"Session expired\", interrupt: true },\n \"cleanup\"\n );\n this.sessions.delete(id);\n this.runtime.delete(id);\n }\n }\n }\n\n /**\n * Serialize session info for external consumption.\n * Prefer explicit serializers below. This method is kept for backward compatibility\n * but returns the redacted public shape.\n */\n toJSON(info: SessionInfo): PublicSessionInfo {\n return this.toPublicJSON(info);\n }\n\n /** Serialize session info when includeSensitive=true (still excludes secrets like env) */\n toSensitiveJSON(info: SessionInfo): SensitiveSessionInfo {\n const base = this.toPublicJSON(info);\n return {\n ...base,\n cwd: info.cwd,\n systemPrompt: info.systemPrompt,\n agents: info.agents,\n additionalDirectories: info.additionalDirectories,\n };\n }\n\n /** Serialize session info for listing/inspection (redacts sensitive fields) */\n toPublicJSON(info: SessionInfo): PublicSessionInfo {\n /* eslint-disable @typescript-eslint/no-unused-vars */\n const {\n abortController: _abortController,\n cwd: _cwd,\n systemPrompt: _systemPrompt,\n agents: _agents,\n additionalDirectories: _additionalDirectories,\n pathToClaudeCodeExecutable: _pathToClaudeCodeExecutable,\n mcpServers: _mcpServers,\n sandbox: _sandbox,\n settingSources: _settingSources,\n debugFile: _debugFile,\n env: _env,\n ...rest\n } = info;\n /* eslint-enable @typescript-eslint/no-unused-vars */\n return rest;\n }\n\n destroy(): void {\n clearInterval(this.cleanupTimer);\n for (const info of this.sessions.values()) {\n this.finishAllPending(\n info.sessionId,\n { behavior: \"deny\", message: \"Server shutting down\", interrupt: true },\n \"destroy\"\n );\n // M6 fix: explicitly abort any session that has an active consumer,\n // regardless of whether it is \"running\" or \"waiting_permission\".\n if (\n (info.status === \"running\" || info.status === \"waiting_permission\") &&\n info.abortController\n ) {\n info.abortController.abort();\n }\n info.status = \"cancelled\";\n info.cancelledAt = info.cancelledAt ?? new Date().toISOString();\n info.cancelledReason = info.cancelledReason ?? \"Server shutting down\";\n info.cancelledSource = info.cancelledSource ?? \"destroy\";\n info.lastActiveAt = new Date().toISOString();\n }\n // Don't clear immediately — in-flight operations may still reference sessions.\n // Sessions will be garbage-collected when the process exits.\n }\n\n private static pushEvent(\n buffer: EventBuffer,\n event: Omit<SessionEvent, \"id\" | \"pinned\"> & { pinned?: boolean },\n isActivePermissionRequest?: (requestId: string) => boolean\n ): SessionEvent {\n const pinned =\n event.pinned ??\n (event.type === \"permission_request\" ||\n event.type === \"permission_result\" ||\n event.type === \"result\" ||\n event.type === \"error\");\n\n const full: SessionEvent = {\n id: buffer.nextId++,\n type: event.type,\n data: event.data,\n timestamp: event.timestamp,\n pinned,\n };\n\n buffer.events.push(full);\n\n while (buffer.events.length > buffer.maxSize) {\n const idx = buffer.events.findIndex((e) => !e.pinned);\n if (idx !== -1) {\n buffer.events.splice(idx, 1);\n continue;\n }\n\n // If everything is pinned, prefer dropping old permission-related events first.\n const pinnedDropIdx = buffer.events.findIndex((e) => {\n if (e.type === \"permission_result\") return true;\n if (e.type === \"permission_request\") {\n const requestId = (e.data as { requestId?: unknown } | null)?.requestId;\n if (typeof requestId !== \"string\") return true;\n return isActivePermissionRequest ? !isActivePermissionRequest(requestId) : true;\n }\n return false;\n });\n if (pinnedDropIdx === -1) break;\n buffer.events.splice(pinnedDropIdx, 1);\n }\n\n while (buffer.events.length > buffer.hardMaxSize) {\n const idx = buffer.events.findIndex((e) => {\n if (e.type === \"permission_request\") {\n const requestId = (e.data as { requestId?: unknown } | null)?.requestId;\n if (typeof requestId !== \"string\") return true;\n return isActivePermissionRequest ? !isActivePermissionRequest(requestId) : true;\n }\n if (e.type === \"permission_result\") return true;\n return false;\n });\n if (idx === -1) break;\n buffer.events.splice(idx, 1);\n }\n\n return full;\n }\n\n private static readEvents(\n buffer: EventBuffer,\n cursor?: number\n ): { events: SessionEvent[]; nextCursor: number; cursorResetTo?: number } {\n let cursorResetTo: number | undefined;\n if (cursor != null) {\n const earliest = buffer.events[0]?.id;\n if (earliest != null && earliest > cursor) cursorResetTo = earliest;\n if (earliest == null && buffer.nextId > cursor) cursorResetTo = buffer.nextId;\n }\n\n const startFrom = cursorResetTo ?? cursor ?? 0;\n const filtered = buffer.events.filter((e) => e.id >= startFrom);\n const nextCursor = filtered.length > 0 ? filtered[filtered.length - 1].id + 1 : startFrom;\n\n return { events: filtered, nextCursor, cursorResetTo };\n }\n\n private static clearTerminalEvents(buffer: EventBuffer): void {\n buffer.events = buffer.events.filter((e) => e.type !== \"result\" && e.type !== \"error\");\n }\n}\n","/**\n * Type definitions for claude-code-mcp\n *\n * Shared constants are defined as tuples so both Zod schemas and\n * TypeScript types can derive from the same source of truth.\n */\n\nimport type {\n PermissionResult as SDKPermissionResult,\n PermissionUpdate as SDKPermissionUpdate,\n} from \"@anthropic-ai/claude-agent-sdk\";\n\n/** Permission modes supported by Claude Agent SDK */\nexport const PERMISSION_MODES = [\"default\", \"acceptEdits\", \"plan\", \"delegate\", \"dontAsk\"] as const;\nexport type PermissionMode = (typeof PERMISSION_MODES)[number];\n\n/** Effort levels */\nexport const EFFORT_LEVELS = [\"low\", \"medium\", \"high\", \"max\"] as const;\nexport type EffortLevel = (typeof EFFORT_LEVELS)[number];\n\n/** Subagent model options */\nexport const AGENT_MODELS = [\"sonnet\", \"opus\", \"haiku\", \"inherit\"] as const;\nexport type AgentModel = (typeof AGENT_MODELS)[number];\n\n/** Session management actions */\nexport const SESSION_ACTIONS = [\"list\", \"get\", \"cancel\"] as const;\nexport type SessionAction = (typeof SESSION_ACTIONS)[number];\n\n/** Session status */\nexport type SessionStatus = \"idle\" | \"running\" | \"waiting_permission\" | \"cancelled\" | \"error\";\n\nexport type SystemPrompt = string | { type: \"preset\"; preset: \"claude_code\"; append?: string };\n\nexport type OutputFormat = { type: \"json_schema\"; schema: Record<string, unknown> };\n\nexport type ThinkingConfig =\n | { type: \"adaptive\" }\n | { type: \"enabled\"; budgetTokens: number }\n | { type: \"disabled\" };\n\nexport type ToolsConfig = string[] | { type: \"preset\"; preset: \"claude_code\" };\n\n/** Subagent definition (mirrors the Zod schema in server.ts) */\nexport interface AgentDefinition {\n description: string;\n prompt: string;\n tools?: string[];\n disallowedTools?: string[];\n model?: AgentModel;\n maxTurns?: number;\n mcpServers?: (string | Record<string, unknown>)[];\n skills?: string[];\n criticalSystemReminder_EXPERIMENTAL?: string;\n}\n\n/** MCP server configuration for the SDK */\nexport type McpServerConfig = Record<string, unknown>;\n\n/** Sandbox configuration for isolating shell command execution */\nexport type SandboxSettings = Record<string, unknown>;\n\n/** Setting source for controlling which filesystem settings are loaded */\nexport type SettingSource = \"user\" | \"project\" | \"local\";\n\n/** Default setting sources — load all filesystem settings for ease of use */\nexport const DEFAULT_SETTING_SOURCES: SettingSource[] = [\"user\", \"project\", \"local\"];\n\n/** Session metadata stored by the session manager */\nexport interface SessionInfo {\n sessionId: string;\n status: SessionStatus;\n createdAt: string;\n lastActiveAt: string;\n cancelledAt?: string;\n cancelledReason?: string;\n cancelledSource?: string;\n totalTurns: number;\n totalCostUsd: number;\n cwd: string;\n model?: string;\n pathToClaudeCodeExecutable?: string;\n permissionMode: PermissionMode;\n allowedTools?: string[];\n disallowedTools?: string[];\n tools?: ToolsConfig;\n maxTurns?: number;\n systemPrompt?: SystemPrompt;\n agents?: Record<string, AgentDefinition>;\n maxBudgetUsd?: number;\n effort?: EffortLevel;\n betas?: string[];\n additionalDirectories?: string[];\n outputFormat?: OutputFormat;\n thinking?: ThinkingConfig;\n persistSession?: boolean;\n /** Primary agent name (from 'agents' definitions) */\n agent?: string;\n /** MCP server configurations (key: server name, value: server config) */\n mcpServers?: Record<string, McpServerConfig>;\n /** Sandbox configuration for isolating shell command execution */\n sandbox?: SandboxSettings;\n /** Fallback model if the primary model fails or is unavailable */\n fallbackModel?: string;\n /** Enable file checkpointing to track file changes */\n enableFileCheckpointing?: boolean;\n /** When true, includes intermediate streaming messages in the response */\n includePartialMessages?: boolean;\n /** Enforce strict validation of MCP server configurations */\n strictMcpConfig?: boolean;\n /** Control which filesystem settings are loaded */\n settingSources?: SettingSource[];\n /** Enable debug mode */\n debug?: boolean;\n /** Write debug logs to a specific file path */\n debugFile?: string;\n /** Environment variables passed to the Claude Code process */\n env?: Record<string, string | undefined>;\n /** Last seen tool use id (best-effort) */\n lastToolUseId?: string;\n abortController?: AbortController;\n}\n\n/** Session metadata safe to return by default (redacts paths and prompts) */\nexport interface PublicSessionInfo {\n sessionId: string;\n status: SessionStatus;\n createdAt: string;\n lastActiveAt: string;\n cancelledAt?: string;\n cancelledReason?: string;\n cancelledSource?: string;\n totalTurns: number;\n totalCostUsd: number;\n model?: string;\n permissionMode: PermissionMode;\n allowedTools?: string[];\n disallowedTools?: string[];\n tools?: ToolsConfig;\n maxTurns?: number;\n maxBudgetUsd?: number;\n effort?: EffortLevel;\n betas?: string[];\n outputFormat?: OutputFormat;\n thinking?: ThinkingConfig;\n persistSession?: boolean;\n agent?: string;\n fallbackModel?: string;\n enableFileCheckpointing?: boolean;\n includePartialMessages?: boolean;\n strictMcpConfig?: boolean;\n debug?: boolean;\n lastToolUseId?: string;\n}\n\n/** Session metadata returned when includeSensitive=true (still excludes secrets like env) */\nexport interface SensitiveSessionInfo extends PublicSessionInfo {\n cwd: string;\n systemPrompt?: SystemPrompt;\n agents?: Record<string, AgentDefinition>;\n additionalDirectories?: string[];\n}\n\n/** Result returned from a claude_code or claude_code_reply call */\nexport interface AgentResult {\n sessionId: string;\n result: string;\n isError: boolean;\n durationMs: number;\n durationApiMs?: number;\n numTurns: number;\n totalCostUsd: number;\n sessionTotalTurns?: number;\n sessionTotalCostUsd?: number;\n structuredOutput?: unknown;\n stopReason?: string | null;\n errorSubtype?: string;\n usage?: Record<string, unknown>;\n modelUsage?: Record<string, unknown>;\n permissionDenials?: Array<{\n tool_name: string;\n tool_use_id: string;\n tool_input: Record<string, unknown>;\n }>;\n}\n\nexport const CHECK_ACTIONS = [\"poll\", \"respond_permission\"] as const;\nexport type CheckAction = (typeof CHECK_ACTIONS)[number];\n\nexport const CHECK_RESPONSE_MODES = [\"minimal\", \"full\"] as const;\nexport type CheckResponseMode = (typeof CHECK_RESPONSE_MODES)[number];\n\nexport type PermissionDecision = \"allow\" | \"deny\";\n\n/**\n * Permission updates suggested by the SDK (shape is SDK-defined and may evolve).\n * We treat it as opaque JSON and forward it to callers.\n */\nexport type PermissionUpdate = SDKPermissionUpdate;\nexport type PermissionResult = SDKPermissionResult;\n\nexport interface ToolInfo {\n name: string;\n description: string;\n category?: string;\n}\n\nexport type SessionEventType =\n | \"output\"\n | \"progress\"\n | \"permission_request\"\n | \"permission_result\"\n | \"result\"\n | \"error\";\n\nexport interface SessionEvent {\n id: number;\n type: SessionEventType;\n data: unknown;\n timestamp: string;\n pinned: boolean;\n}\n\nexport interface EventBuffer {\n events: SessionEvent[];\n maxSize: number;\n hardMaxSize: number;\n nextId: number;\n}\n\nexport interface PermissionRequestRecord {\n requestId: string;\n toolName: string;\n input: Record<string, unknown>;\n summary: string;\n decisionReason?: string;\n blockedPath?: string;\n toolUseID: string;\n agentID?: string;\n suggestions?: PermissionUpdate[];\n description?: string;\n createdAt: string;\n}\n\nexport type FinishFn = (result: PermissionResult) => void;\n\nexport type FinishSource = \"respond\" | \"timeout\" | \"cancel\" | \"cleanup\" | \"destroy\" | \"signal\";\n\nexport interface SessionStartResult {\n sessionId: string;\n status: \"running\";\n pollInterval: number;\n resumeToken?: string;\n}\n\nexport type StoredAgentResult =\n | { type: \"result\"; result: AgentResult; createdAt: string }\n | { type: \"error\"; result: AgentResult; createdAt: string };\n\nexport interface CheckResult {\n sessionId: string;\n status: SessionStatus;\n pollInterval?: number;\n cursorResetTo?: number;\n truncated?: boolean;\n truncatedFields?: string[];\n events: Array<{\n id: number;\n type: SessionEventType;\n data: unknown;\n timestamp: string;\n }>;\n nextCursor?: number;\n availableTools?: ToolInfo[];\n actions?: Array<{\n type: \"permission\";\n requestId: string;\n toolName: string;\n input: Record<string, unknown>;\n summary: string;\n decisionReason?: string;\n blockedPath?: string;\n toolUseID: string;\n agentID?: string;\n suggestions?: PermissionUpdate[];\n description?: string;\n createdAt: string;\n }>;\n result?: AgentResult;\n cancelledAt?: string;\n cancelledReason?: string;\n cancelledSource?: string;\n lastEventId?: number;\n lastToolUseId?: string;\n}\n\n/** Error codes for structured error responses */\nexport enum ErrorCode {\n INVALID_ARGUMENT = \"INVALID_ARGUMENT\",\n SESSION_NOT_FOUND = \"SESSION_NOT_FOUND\",\n SESSION_BUSY = \"SESSION_BUSY\",\n PERMISSION_REQUEST_NOT_FOUND = \"PERMISSION_REQUEST_NOT_FOUND\",\n PERMISSION_DENIED = \"PERMISSION_DENIED\",\n TIMEOUT = \"TIMEOUT\",\n CANCELLED = \"CANCELLED\",\n INTERNAL = \"INTERNAL\",\n}\n","import { AbortError, query } from \"@anthropic-ai/claude-agent-sdk\";\nimport type {\n CanUseTool,\n Options,\n SDKMessage,\n SDKResultMessage,\n SDKSystemMessage,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport type { SessionManager } from \"../session/manager.js\";\nimport type {\n AgentResult,\n PermissionRequestRecord,\n PermissionResult,\n StoredAgentResult,\n} from \"../types.js\";\nimport { ErrorCode } from \"../types.js\";\nimport { enhanceWindowsError } from \"../utils/windows.js\";\nimport type { ToolDiscoveryCache } from \"./tool-discovery.js\";\n\nexport type ConsumeQueryMode = \"start\" | \"resume\" | \"disk-resume\";\n\n// --- C1: Error classification and retry constants ---\n\nconst MAX_TRANSIENT_RETRIES = 3;\nconst INITIAL_RETRY_DELAY_MS = 1000;\n\nexport type ErrorClass = \"abort\" | \"transient\" | \"fatal\";\n\nexport function classifyError(err: unknown, abortSignal: AbortSignal): ErrorClass {\n if (abortSignal.aborted) return \"abort\";\n if (err instanceof AbortError || (err instanceof Error && err.name === \"AbortError\")) {\n return \"abort\";\n }\n if (\n err instanceof Error &&\n (err.message.includes(\"ECONNRESET\") ||\n err.message.includes(\"ETIMEDOUT\") ||\n err.message.includes(\"ECONNREFUSED\") ||\n err.message.includes(\"ENOTFOUND\") ||\n err.message.includes(\"EAI_AGAIN\") ||\n err.message.includes(\"EPIPE\") ||\n err.message.includes(\"stream ended unexpectedly\") ||\n err.message.includes(\"socket hang up\"))\n ) {\n return \"transient\";\n }\n return \"fatal\";\n}\n\ntype QueryLike = AsyncIterable<SDKMessage> & { close?: () => void; interrupt?: () => void };\n\nexport type ConsumeQueryParams =\n | {\n mode: \"start\";\n prompt: string;\n abortController: AbortController;\n options: Partial<Options>;\n permissionRequestTimeoutMs: number;\n sessionInitTimeoutMs: number;\n sessionManager: SessionManager;\n toolCache?: ToolDiscoveryCache;\n onInit?: (init: SDKSystemMessage) => void;\n }\n | {\n mode: \"resume\" | \"disk-resume\";\n sessionId: string;\n prompt: string;\n abortController: AbortController;\n options: Partial<Options>;\n permissionRequestTimeoutMs: number;\n sessionInitTimeoutMs: number;\n waitForInitSessionId?: boolean;\n sessionManager: SessionManager;\n toolCache?: ToolDiscoveryCache;\n onInit?: (init: SDKSystemMessage) => void;\n };\n\nexport type ConsumeQueryHandle = {\n sdkSessionIdPromise: Promise<string>;\n done: Promise<void>;\n close: () => void;\n interrupt: () => void;\n};\n\nfunction isSystemInitMessage(msg: SDKMessage): msg is SDKSystemMessage {\n return msg.type === \"system\" && msg.subtype === \"init\";\n}\n\nfunction summarizePermission(toolName: string, input: Record<string, unknown>): string {\n const keys = Object.keys(input ?? {}).slice(0, 5);\n const suffix = keys.length > 0 ? ` (keys: ${keys.join(\", \")})` : \"\";\n return `${toolName} permission request${suffix}`;\n}\n\nfunction describeTool(toolName: string, toolCache?: ToolDiscoveryCache): string | undefined {\n const tools = toolCache?.getTools();\n const found = tools?.find((t) => t.name === toolName);\n return found?.description;\n}\n\nfunction sdkResultToAgentResult(result: SDKResultMessage): AgentResult {\n const base = {\n sessionId: result.session_id,\n durationMs: result.duration_ms,\n durationApiMs: result.duration_api_ms,\n numTurns: result.num_turns,\n totalCostUsd: result.total_cost_usd,\n stopReason: result.stop_reason,\n usage: result.usage,\n modelUsage: result.modelUsage,\n permissionDenials: result.permission_denials,\n };\n\n if (result.subtype === \"success\") {\n return {\n ...base,\n result: result.result,\n structuredOutput: result.structured_output,\n isError: false,\n };\n }\n\n const errors =\n Array.isArray(result.errors) && result.errors.length > 0\n ? result.errors.map(String).join(\"\\n\")\n : `Error [${result.subtype}]: Unknown error`;\n\n return {\n ...base,\n result: errors,\n isError: true,\n errorSubtype: result.subtype,\n };\n}\n\nfunction errorToAgentResult(sessionId: string, err: unknown): AgentResult {\n const message =\n err instanceof Error ? enhanceWindowsError(err.message) : enhanceWindowsError(String(err));\n return {\n sessionId,\n result: `Error [${ErrorCode.INTERNAL}]: ${message}`,\n isError: true,\n durationMs: 0,\n numTurns: 0,\n totalCostUsd: 0,\n };\n}\n\nfunction messageToEvent(msg: SDKMessage): { type: \"output\" | \"progress\"; data: unknown } | null {\n if (msg.type === \"assistant\") {\n return {\n type: \"output\",\n data: {\n type: \"assistant\",\n message: msg.message,\n parent_tool_use_id: msg.parent_tool_use_id,\n error: msg.error,\n },\n };\n }\n\n if (msg.type === \"tool_use_summary\") {\n return { type: \"progress\", data: { type: \"tool_use_summary\", summary: msg.summary } };\n }\n\n if (msg.type === \"tool_progress\") {\n return {\n type: \"progress\",\n data: {\n type: \"tool_progress\",\n tool_use_id: msg.tool_use_id,\n tool_name: msg.tool_name,\n elapsed_time_seconds: msg.elapsed_time_seconds,\n },\n };\n }\n\n if (msg.type === \"auth_status\") {\n return {\n type: \"progress\",\n data: {\n type: \"auth_status\",\n isAuthenticating: msg.isAuthenticating,\n output: msg.output,\n error: msg.error,\n },\n };\n }\n\n if (msg.type === \"system\" && msg.subtype === \"status\") {\n return {\n type: \"progress\",\n data: { type: \"status\", status: msg.status, permissionMode: msg.permissionMode },\n };\n }\n\n if (msg.type === \"system\" && msg.subtype === \"task_notification\") {\n return {\n type: \"progress\",\n data: {\n type: \"task_notification\",\n task_id: msg.task_id,\n status: msg.status,\n summary: msg.summary,\n output_file: msg.output_file,\n },\n };\n }\n\n return null;\n}\n\nexport function consumeQuery(params: ConsumeQueryParams): ConsumeQueryHandle {\n let resolveSessionId!: (id: string) => void;\n let rejectSessionId!: (err: Error) => void;\n const sdkSessionIdPromise = new Promise<string>((resolve, reject) => {\n resolveSessionId = resolve;\n rejectSessionId = reject;\n });\n const waitForInitSessionId =\n params.mode !== \"start\" ? (params.waitForInitSessionId ?? false) : false;\n const shouldWaitForInit = params.mode === \"start\" || waitForInitSessionId;\n\n let sessionIdResolved = false;\n let activeSessionId = \"\";\n if (params.mode !== \"start\" && !waitForInitSessionId) {\n sessionIdResolved = true;\n activeSessionId = params.sessionId;\n resolveSessionId(activeSessionId);\n }\n\n const getSessionId = async (): Promise<string> => {\n if (activeSessionId) return activeSessionId;\n activeSessionId = await sdkSessionIdPromise;\n return activeSessionId;\n };\n\n let initTimeoutId: ReturnType<typeof setTimeout> | undefined;\n\n const canUseTool: CanUseTool = async (toolName, input, options) => {\n const sessionId = await getSessionId();\n\n // Keep MCP permission behavior consistent with the SDK options semantics:\n // - disallowedTools: hard deny\n // - allowedTools: auto-allow (but still prompt if the SDK provides a blockedPath)\n // Note: we still pass allowedTools/disallowedTools to the SDK via options; this is a\n // defensive fast-path in case the SDK calls canUseTool for all tool uses.\n const sessionInfo = params.sessionManager.get(sessionId);\n if (sessionInfo) {\n if (\n Array.isArray(sessionInfo.disallowedTools) &&\n sessionInfo.disallowedTools.includes(toolName)\n ) {\n return { behavior: \"deny\", message: `Tool '${toolName}' is disallowed by session policy.` };\n }\n\n if (\n !options.blockedPath &&\n Array.isArray(sessionInfo.allowedTools) &&\n sessionInfo.allowedTools.includes(toolName)\n ) {\n return { behavior: \"allow\" };\n }\n }\n\n const requestId = `${options.toolUseID}:${toolName}:${Date.now()}:${Math.random()\n .toString(16)\n .slice(2)}`;\n const record: PermissionRequestRecord = {\n requestId,\n toolName,\n input,\n summary: summarizePermission(toolName, input),\n description: describeTool(toolName, params.toolCache),\n decisionReason: options.decisionReason,\n blockedPath: options.blockedPath,\n toolUseID: options.toolUseID,\n agentID: options.agentID,\n suggestions: options.suggestions,\n createdAt: new Date().toISOString(),\n };\n\n return await new Promise<PermissionResult>((resolve) => {\n let finished = false;\n const abortListener = () => {\n params.sessionManager.finishRequest(\n sessionId,\n requestId,\n { behavior: \"deny\", message: \"Session cancelled\", interrupt: true },\n \"signal\"\n );\n };\n const finish: (result: PermissionResult) => void = (result) => {\n if (finished) return;\n finished = true;\n options.signal.removeEventListener(\"abort\", abortListener);\n resolve(result);\n };\n\n const registered = params.sessionManager.setPendingPermission(\n sessionId,\n record,\n finish,\n params.permissionRequestTimeoutMs\n );\n\n // If the session was deleted/missing, resolve immediately with deny\n // to prevent the Promise from hanging forever.\n if (!registered) {\n finish({ behavior: \"deny\", message: \"Session no longer exists.\", interrupt: true });\n return;\n }\n\n options.signal.addEventListener(\"abort\", abortListener, { once: true });\n\n // M1 fix: if the signal was already aborted before we registered the\n // listener, the \"abort\" event won't fire. Check synchronously so the\n // Promise resolves immediately instead of waiting for the timeout.\n if (options.signal.aborted) {\n abortListener();\n }\n });\n };\n\n const options: Partial<Options> = {\n ...params.options,\n abortController: params.abortController,\n permissionMode: \"default\",\n canUseTool,\n };\n\n const startQuery = (opts: Partial<Options>): QueryLike =>\n query({\n prompt: params.prompt,\n options: opts,\n }) as unknown as QueryLike;\n\n if (params.mode === \"resume\" || params.mode === \"disk-resume\") {\n options.resume = params.sessionId;\n }\n\n let activeQuery: QueryLike = startQuery(options);\n\n const close = (): void => {\n try {\n activeQuery.close?.();\n } finally {\n params.abortController.abort();\n }\n };\n\n const interrupt = (): void => {\n activeQuery.interrupt?.();\n };\n\n const done = (async (): Promise<void> => {\n const preInit: SDKMessage[] = [];\n\n if (shouldWaitForInit) {\n initTimeoutId = setTimeout(() => {\n close();\n rejectSessionId(\n new Error(\n `Error [${ErrorCode.TIMEOUT}]: session init timed out after ${params.sessionInitTimeoutMs}ms.`\n )\n );\n }, params.sessionInitTimeoutMs);\n }\n\n let retryCount = 0;\n let currentStream: QueryLike = activeQuery;\n\n // Outer loop: retries on transient errors (C1 fix)\n while (true) {\n try {\n for await (const message of currentStream) {\n if (isSystemInitMessage(message)) {\n params.toolCache?.updateFromInit(message.tools);\n params.onInit?.(message);\n params.sessionManager.setInitTools(message.session_id, message.tools);\n\n activeSessionId = message.session_id;\n if (!sessionIdResolved && shouldWaitForInit) {\n sessionIdResolved = true;\n resolveSessionId(activeSessionId);\n if (initTimeoutId) clearTimeout(initTimeoutId);\n\n for (const buffered of preInit) {\n const event = messageToEvent(buffered);\n if (!event) continue;\n params.sessionManager.pushEvent(activeSessionId, {\n type: event.type,\n data: event.data,\n timestamp: new Date().toISOString(),\n });\n }\n preInit.length = 0;\n }\n\n continue;\n }\n\n if (shouldWaitForInit && !sessionIdResolved) {\n preInit.push(message);\n continue;\n }\n\n if (message.type === \"result\") {\n const sessionId = message.session_id ?? (await getSessionId());\n const agentResult = sdkResultToAgentResult(message);\n const stored: StoredAgentResult = {\n type: agentResult.isError ? \"error\" : \"result\",\n result: agentResult,\n createdAt: new Date().toISOString(),\n };\n params.sessionManager.setResult(sessionId, stored);\n\n // Keep only the most recent terminal event (sessions can have multiple replies).\n params.sessionManager.clearTerminalEvents(sessionId);\n params.sessionManager.pushEvent(sessionId, {\n type: agentResult.isError ? \"error\" : \"result\",\n data: agentResult,\n timestamp: new Date().toISOString(),\n });\n\n const current = params.sessionManager.get(sessionId);\n if (current && current.status !== \"cancelled\") {\n params.sessionManager.update(sessionId, {\n status: agentResult.isError ? \"error\" : \"idle\",\n totalTurns: agentResult.numTurns,\n totalCostUsd: agentResult.totalCostUsd,\n abortController: undefined,\n });\n } else if (current) {\n params.sessionManager.update(sessionId, {\n totalTurns: agentResult.numTurns,\n totalCostUsd: agentResult.totalCostUsd,\n abortController: undefined,\n });\n }\n\n return;\n }\n\n const sessionId = message.session_id ?? (await getSessionId());\n const event = messageToEvent(message);\n if (event) {\n params.sessionManager.pushEvent(sessionId, {\n type: event.type,\n data: event.data,\n timestamp: new Date().toISOString(),\n });\n }\n }\n\n // Stream ended normally without a result message\n if (shouldWaitForInit && !sessionIdResolved) {\n rejectSessionId(\n new Error(\n `Error [${ErrorCode.INTERNAL}]: query stream ended before receiving session init.`\n )\n );\n } else if (activeSessionId) {\n const sessionId = activeSessionId;\n const current = params.sessionManager.get(sessionId);\n if (current && current.status !== \"cancelled\") {\n params.sessionManager.finishAllPending(\n sessionId,\n {\n behavior: \"deny\",\n message: \"Session ended before permission was resolved.\",\n interrupt: true,\n },\n \"cleanup\"\n );\n const agentResult = errorToAgentResult(\n sessionId,\n \"No result message received from agent.\"\n );\n const stored: StoredAgentResult = {\n type: \"error\",\n result: agentResult,\n createdAt: new Date().toISOString(),\n };\n params.sessionManager.setResult(sessionId, stored);\n params.sessionManager.clearTerminalEvents(sessionId);\n params.sessionManager.pushEvent(sessionId, {\n type: \"error\",\n data: agentResult,\n timestamp: new Date().toISOString(),\n });\n params.sessionManager.update(sessionId, {\n status: \"error\",\n abortController: undefined,\n });\n }\n }\n return; // normal exit\n } catch (err: unknown) {\n const errClass = classifyError(err, params.abortController.signal);\n\n // Before init: no session to retry, just reject and bail.\n if (shouldWaitForInit && !sessionIdResolved) {\n rejectSessionId(\n new Error(\n errClass === \"abort\"\n ? `Error [${ErrorCode.CANCELLED}]: session was cancelled before init.`\n : `Error [${ErrorCode.INTERNAL}]: ${enhanceWindowsError(err instanceof Error ? err.message : String(err))}`\n )\n );\n return;\n }\n\n if (!activeSessionId) return;\n const sessionId = activeSessionId;\n\n // C1: transient errors → resume retry with exponential backoff\n if (errClass === \"transient\" && retryCount < MAX_TRANSIENT_RETRIES) {\n retryCount++;\n const delay = INITIAL_RETRY_DELAY_MS * Math.pow(2, retryCount - 1);\n params.sessionManager.pushEvent(sessionId, {\n type: \"progress\",\n data: {\n type: \"retry\",\n attempt: retryCount,\n maxRetries: MAX_TRANSIENT_RETRIES,\n delayMs: delay,\n error: err instanceof Error ? err.message : String(err),\n },\n timestamp: new Date().toISOString(),\n });\n await new Promise<void>((r) => {\n const timer = setTimeout(r, delay);\n const onAbort = () => {\n clearTimeout(timer);\n r();\n };\n params.abortController.signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n if (params.abortController.signal.aborted) return;\n\n // Rebuild query with resume to continue from where we left off.\n // Pending permissions are lost; SDK will re-issue canUseTool calls.\n params.sessionManager.finishAllPending(\n sessionId,\n { behavior: \"deny\", message: \"Retrying after transient error.\", interrupt: false },\n \"cleanup\"\n );\n const retryOpts: Partial<Options> = {\n ...options,\n resume: sessionId,\n };\n currentStream = startQuery(retryOpts);\n activeQuery = currentStream;\n continue; // retry the while loop\n }\n\n // abort or fatal: record error and stop\n const current = params.sessionManager.get(sessionId);\n if (current && current.status !== \"cancelled\") {\n params.sessionManager.finishAllPending(\n sessionId,\n {\n behavior: \"deny\",\n message: \"Session failed before permission was resolved.\",\n interrupt: true,\n },\n \"cleanup\"\n );\n const agentResult =\n errClass === \"abort\"\n ? {\n sessionId,\n result: `Error [${ErrorCode.CANCELLED}]: Session was cancelled.`,\n isError: true,\n durationMs: 0,\n numTurns: 0,\n totalCostUsd: 0,\n }\n : errorToAgentResult(sessionId, err);\n\n params.sessionManager.setResult(sessionId, {\n type: \"error\",\n result: agentResult,\n createdAt: new Date().toISOString(),\n });\n\n params.sessionManager.clearTerminalEvents(sessionId);\n params.sessionManager.pushEvent(sessionId, {\n type: \"error\",\n data: agentResult,\n timestamp: new Date().toISOString(),\n });\n\n params.sessionManager.update(sessionId, { status: \"error\", abortController: undefined });\n }\n return; // fatal/abort exit\n } finally {\n if (initTimeoutId) clearTimeout(initTimeoutId);\n }\n }\n })();\n\n return { sdkSessionIdPromise, done, close, interrupt };\n}\n","/**\n * Windows-specific utilities for Git Bash detection\n */\nimport { existsSync } from \"node:fs\";\nimport { execSync } from \"node:child_process\";\nimport path from \"node:path\";\n\n// Always use win32 path semantics in this module so that the logic works\n// correctly even when the test-suite runs on a non-Windows CI host.\nconst { join, dirname, normalize } = path.win32;\n\nexport function isWindows(): boolean {\n return process.platform === \"win32\";\n}\n\n/**\n * Attempt to locate bash.exe on Windows using the same logic as the Claude CLI:\n * 1. Check CLAUDE_CODE_GIT_BASH_PATH env var\n * 2. Find `git` in PATH and derive bash.exe from it\n *\n * Returns the resolved path, or null if not found.\n */\nexport function findGitBash(): string | null {\n const envPathRaw = process.env.CLAUDE_CODE_GIT_BASH_PATH;\n if (envPathRaw && envPathRaw.trim() !== \"\") {\n // Users sometimes include quotes in JSON/env config.\n const envPath = normalize(envPathRaw.trim().replace(/^\"|\"$/g, \"\"));\n if (existsSync(envPath)) return envPath;\n return null; // env var set but path doesn't exist\n }\n\n try {\n const output = execSync(\"where git\", { encoding: \"utf8\" });\n const gitCandidates = output\n .split(/\\r?\\n/)\n .map((l) => l.trim())\n .filter(Boolean);\n\n for (const gitPathRaw of gitCandidates) {\n const gitPath = normalize(gitPathRaw.replace(/^\"|\"$/g, \"\"));\n if (!gitPath) continue;\n\n const gitDir = dirname(gitPath);\n const gitDirLower = gitDir.toLowerCase();\n\n // Determine plausible Git roots from common layouts.\n // Layouts seen in the wild:\n // <root>\\cmd\\git.exe -> bash at <root>\\bin\\bash.exe\n // <root>\\bin\\git.exe -> bash at <root>\\bin\\bash.exe\n // <root>\\mingw64\\bin\\git.exe -> bash at <root>\\usr\\bin\\bash.exe (or <root>\\bin\\bash.exe)\n const roots = new Set<string>();\n roots.add(gitDir);\n roots.add(join(gitDir, \"..\"));\n roots.add(join(gitDir, \"..\", \"..\"));\n\n if (gitDirLower.endsWith(\"\\\\cmd\") || gitDirLower.endsWith(\"\\\\bin\")) {\n roots.add(join(gitDir, \"..\"));\n }\n if (gitDirLower.endsWith(\"\\\\mingw64\\\\bin\")) {\n roots.add(join(gitDir, \"..\", \"..\"));\n }\n\n const bashCandidates: string[] = [];\n for (const root of roots) {\n // Common Git for Windows locations\n bashCandidates.push(join(root, \"bin\", \"bash.exe\"));\n bashCandidates.push(join(root, \"usr\", \"bin\", \"bash.exe\"));\n // Some layouts may place bash.exe adjacent\n bashCandidates.push(join(root, \"bash.exe\"));\n // Some portable installs\n bashCandidates.push(join(root, \"mingw64\", \"bin\", \"bash.exe\"));\n }\n\n for (const bashPath of bashCandidates) {\n const normalized = normalize(bashPath);\n if (existsSync(normalized)) return normalized;\n }\n }\n } catch {\n // `where git` failed — git not in PATH\n }\n\n return null;\n}\n\n/**\n * Log a startup warning if running on Windows without a detectable bash.exe.\n */\nexport function checkWindowsBashAvailability(): void {\n if (!isWindows()) return;\n\n const bashPath = findGitBash();\n if (bashPath) {\n console.error(`[windows] Git Bash detected: ${bashPath}`);\n return;\n }\n\n const hint = process.env.CLAUDE_CODE_GIT_BASH_PATH\n ? `CLAUDE_CODE_GIT_BASH_PATH is set to \"${process.env.CLAUDE_CODE_GIT_BASH_PATH}\" but the file does not exist.`\n : \"CLAUDE_CODE_GIT_BASH_PATH is not set and git was not found in PATH.\";\n\n console.error(\n `[windows] WARNING: ${hint}\\n` +\n ` The Claude Code CLI requires Git Bash on Windows.\\n` +\n ` Install Git for Windows (https://git-scm.com/downloads/win) and either:\\n` +\n ` 1. Add git to PATH, or\\n` +\n ` 2. Set CLAUDE_CODE_GIT_BASH_PATH to your bash.exe path\\n` +\n ` Example: CLAUDE_CODE_GIT_BASH_PATH=C:\\\\Program Files\\\\Git\\\\bin\\\\bash.exe\\n` +\n ` See README.md \"Windows Support\" section for MCP client config examples.`\n );\n}\n\nconst WINDOWS_BASH_HINT =\n \"\\n\\n[Windows] The Claude Code CLI requires Git Bash. \" +\n \"Set CLAUDE_CODE_GIT_BASH_PATH in your MCP server config or system environment. \" +\n 'See README.md \"Windows Support\" section for details.';\n\n/**\n * If the error looks like a Windows bash.exe issue, append a helpful hint.\n */\nexport function enhanceWindowsError(errorMessage: string): string {\n if (!isWindows()) return errorMessage;\n if (\n errorMessage.includes(\"git-bash\") ||\n errorMessage.includes(\"bash.exe\") ||\n errorMessage.includes(\"CLAUDE_CODE_GIT_BASH_PATH\")\n ) {\n return errorMessage + WINDOWS_BASH_HINT;\n }\n return errorMessage;\n}\n","import { createHmac } from \"node:crypto\";\n\nexport function getResumeSecret(): string | undefined {\n const secret = process.env.CLAUDE_CODE_MCP_RESUME_SECRET;\n if (typeof secret !== \"string\") return undefined;\n const trimmed = secret.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nexport function computeResumeToken(sessionId: string, secret: string): string {\n return createHmac(\"sha256\", secret).update(sessionId).digest(\"base64url\");\n}\n","/**\n * Race a promise against an AbortSignal — resolves/rejects the promise\n * or rejects early when the signal fires.\n */\nimport { ErrorCode } from \"../types.js\";\n\nexport function raceWithAbort<T>(\n promise: Promise<T>,\n signal: AbortSignal | undefined,\n onAbort: () => void\n): Promise<T> {\n if (!signal) return promise;\n if (signal.aborted) {\n try {\n onAbort();\n } catch {\n /* best-effort */\n }\n return Promise.reject(new Error(`Error [${ErrorCode.CANCELLED}]: request was cancelled.`));\n }\n return new Promise<T>((resolve, reject) => {\n const abortListener = () => {\n try {\n onAbort();\n } catch {\n /* best-effort */\n }\n reject(new Error(`Error [${ErrorCode.CANCELLED}]: request was cancelled.`));\n };\n signal.addEventListener(\"abort\", abortListener, { once: true });\n promise.then(resolve, reject).finally(() => signal.removeEventListener(\"abort\", abortListener));\n });\n}\n","/**\n * Shared helper to build SDK query options from a flat source object.\n *\n * All three call-sites (claude-code start, reply from session, disk-resume)\n * share the same field-by-field copy logic. This function centralises it so\n * a newly-added Options field only needs to be wired once.\n */\nimport type { Options } from \"@anthropic-ai/claude-agent-sdk\";\nimport type {\n AgentDefinition,\n EffortLevel,\n McpServerConfig,\n OutputFormat,\n SandboxSettings,\n SettingSource,\n SystemPrompt,\n ThinkingConfig,\n ToolsConfig,\n} from \"../types.js\";\nimport { DEFAULT_SETTING_SOURCES } from \"../types.js\";\n\n/** Superset of fields that any of the three call-sites may provide. */\nexport interface OptionSource {\n cwd: string;\n allowedTools?: string[];\n disallowedTools?: string[];\n tools?: ToolsConfig;\n maxTurns?: number;\n model?: string;\n systemPrompt?: SystemPrompt;\n agents?: Record<string, AgentDefinition>;\n maxBudgetUsd?: number;\n effort?: EffortLevel;\n betas?: string[];\n additionalDirectories?: string[];\n outputFormat?: OutputFormat;\n thinking?: ThinkingConfig;\n persistSession?: boolean;\n resumeSessionAt?: string;\n pathToClaudeCodeExecutable?: string;\n agent?: string;\n mcpServers?: Record<string, McpServerConfig>;\n sandbox?: SandboxSettings;\n fallbackModel?: string;\n enableFileCheckpointing?: boolean;\n includePartialMessages?: boolean;\n strictMcpConfig?: boolean;\n settingSources?: SettingSource[];\n debug?: boolean;\n debugFile?: string;\n env?: Record<string, string | undefined>;\n}\n\n/**\n * Build SDK `Partial<Options>` from a flat source object.\n *\n * Only copies fields that are explicitly defined (not `undefined`) so that\n * SDK defaults are preserved for omitted fields.\n */\nexport function buildOptions(src: OptionSource): Partial<Options> {\n const opts: Partial<Options> = { cwd: src.cwd };\n\n if (src.allowedTools !== undefined) opts.allowedTools = src.allowedTools;\n if (src.disallowedTools !== undefined) opts.disallowedTools = src.disallowedTools;\n if (src.tools !== undefined) opts.tools = src.tools;\n if (src.maxTurns !== undefined) opts.maxTurns = src.maxTurns;\n if (src.model !== undefined) opts.model = src.model;\n if (src.systemPrompt !== undefined) opts.systemPrompt = src.systemPrompt;\n if (src.agents !== undefined) opts.agents = src.agents as Options[\"agents\"];\n if (src.maxBudgetUsd !== undefined) opts.maxBudgetUsd = src.maxBudgetUsd;\n if (src.effort !== undefined) opts.effort = src.effort;\n if (src.betas !== undefined) opts.betas = src.betas as Options[\"betas\"];\n if (src.additionalDirectories !== undefined)\n opts.additionalDirectories = src.additionalDirectories;\n if (src.outputFormat !== undefined) opts.outputFormat = src.outputFormat;\n if (src.thinking !== undefined) opts.thinking = src.thinking;\n if (src.persistSession !== undefined) opts.persistSession = src.persistSession;\n if (src.resumeSessionAt !== undefined) opts.resumeSessionAt = src.resumeSessionAt;\n if (src.pathToClaudeCodeExecutable !== undefined)\n opts.pathToClaudeCodeExecutable = src.pathToClaudeCodeExecutable;\n if (src.agent !== undefined) opts.agent = src.agent;\n if (src.mcpServers !== undefined) opts.mcpServers = src.mcpServers as Options[\"mcpServers\"];\n if (src.sandbox !== undefined) opts.sandbox = src.sandbox;\n if (src.fallbackModel !== undefined) opts.fallbackModel = src.fallbackModel;\n if (src.enableFileCheckpointing !== undefined)\n opts.enableFileCheckpointing = src.enableFileCheckpointing;\n if (src.includePartialMessages !== undefined)\n opts.includePartialMessages = src.includePartialMessages;\n if (src.strictMcpConfig !== undefined) opts.strictMcpConfig = src.strictMcpConfig;\n if (src.settingSources !== undefined) opts.settingSources = src.settingSources;\n else opts.settingSources = DEFAULT_SETTING_SOURCES;\n if (src.debug !== undefined) opts.debug = src.debug;\n if (src.debugFile !== undefined) opts.debugFile = src.debugFile;\n if (src.env !== undefined) opts.env = { ...process.env, ...src.env };\n\n return opts;\n}\n","/**\n * claude_code tool - Start a new Claude Code agent session\n */\nimport type { SessionManager } from \"../session/manager.js\";\nimport type {\n AgentDefinition,\n EffortLevel,\n McpServerConfig,\n SandboxSettings,\n SessionStartResult,\n SettingSource,\n} from \"../types.js\";\nimport { ErrorCode, DEFAULT_SETTING_SOURCES } from \"../types.js\";\nimport { consumeQuery } from \"./query-consumer.js\";\nimport type { ToolDiscoveryCache } from \"./tool-discovery.js\";\nimport { computeResumeToken, getResumeSecret } from \"../utils/resume-token.js\";\nimport { raceWithAbort } from \"../utils/race-with-abort.js\";\nimport { buildOptions } from \"../utils/build-options.js\";\n\n/** Low-frequency / SDK-passthrough options grouped under `advanced`. */\nexport interface ClaudeCodeAdvancedOptions {\n tools?: string[] | { type: \"preset\"; preset: \"claude_code\" };\n persistSession?: boolean;\n sessionInitTimeoutMs?: number;\n agents?: Record<string, AgentDefinition>;\n agent?: string;\n maxBudgetUsd?: number;\n effort?: EffortLevel;\n betas?: string[];\n additionalDirectories?: string[];\n outputFormat?: { type: \"json_schema\"; schema: Record<string, unknown> };\n thinking?:\n | { type: \"adaptive\" }\n | { type: \"enabled\"; budgetTokens: number }\n | { type: \"disabled\" };\n pathToClaudeCodeExecutable?: string;\n mcpServers?: Record<string, McpServerConfig>;\n sandbox?: SandboxSettings;\n fallbackModel?: string;\n enableFileCheckpointing?: boolean;\n includePartialMessages?: boolean;\n strictMcpConfig?: boolean;\n settingSources?: SettingSource[];\n debug?: boolean;\n debugFile?: string;\n env?: Record<string, string | undefined>;\n}\n\nexport interface ClaudeCodeInput {\n prompt: string;\n cwd?: string;\n allowedTools?: string[];\n disallowedTools?: string[];\n maxTurns?: number;\n model?: string;\n systemPrompt?: string | { type: \"preset\"; preset: \"claude_code\"; append?: string };\n /** Timeout waiting for permission decision (default 60000ms) */\n permissionRequestTimeoutMs?: number;\n /** Low-frequency SDK options. All fields are optional and have sensible defaults. */\n advanced?: ClaudeCodeAdvancedOptions;\n}\n\nexport type ClaudeCodeStartResult =\n | SessionStartResult\n | { sessionId: string; status: \"error\"; error: string };\n\nexport async function executeClaudeCode(\n input: ClaudeCodeInput,\n sessionManager: SessionManager,\n serverCwd: string,\n toolCache?: ToolDiscoveryCache,\n requestSignal?: AbortSignal\n): Promise<ClaudeCodeStartResult> {\n const cwd = input.cwd !== undefined ? input.cwd : serverCwd;\n\n if (typeof cwd !== \"string\" || cwd.trim() === \"\") {\n return {\n sessionId: \"\",\n status: \"error\",\n error: `Error [${ErrorCode.INVALID_ARGUMENT}]: cwd must be a non-empty string.`,\n };\n }\n\n const abortController = new AbortController();\n const adv = input.advanced ?? {};\n\n const permissionRequestTimeoutMs = input.permissionRequestTimeoutMs ?? 60_000;\n const sessionInitTimeoutMs = adv.sessionInitTimeoutMs ?? 10_000;\n\n // Flatten top-level + advanced into a single object for buildOptions / sessionManager.\n const flat = {\n cwd,\n allowedTools: input.allowedTools,\n disallowedTools: input.disallowedTools,\n maxTurns: input.maxTurns,\n model: input.model,\n systemPrompt: input.systemPrompt,\n ...adv,\n };\n\n try {\n const handle = consumeQuery({\n mode: \"start\",\n prompt: input.prompt,\n abortController,\n options: buildOptions(flat),\n permissionRequestTimeoutMs,\n sessionInitTimeoutMs,\n sessionManager,\n toolCache,\n onInit: (init) => {\n // Idempotent: on transient retry the SDK may re-send init for the same session.\n if (sessionManager.get(init.session_id)) return;\n sessionManager.create({\n sessionId: init.session_id,\n cwd,\n model: input.model,\n permissionMode: \"default\",\n allowedTools: input.allowedTools,\n disallowedTools: input.disallowedTools,\n tools: adv.tools,\n maxTurns: input.maxTurns,\n systemPrompt: input.systemPrompt,\n agents: adv.agents as Record<string, AgentDefinition> | undefined,\n maxBudgetUsd: adv.maxBudgetUsd,\n effort: adv.effort,\n betas: adv.betas,\n additionalDirectories: adv.additionalDirectories,\n outputFormat: adv.outputFormat,\n thinking: adv.thinking,\n persistSession: adv.persistSession,\n pathToClaudeCodeExecutable: adv.pathToClaudeCodeExecutable,\n agent: adv.agent,\n mcpServers: adv.mcpServers,\n sandbox: adv.sandbox,\n fallbackModel: adv.fallbackModel,\n enableFileCheckpointing: adv.enableFileCheckpointing,\n includePartialMessages: adv.includePartialMessages,\n strictMcpConfig: adv.strictMcpConfig,\n settingSources: adv.settingSources ?? DEFAULT_SETTING_SOURCES,\n debug: adv.debug,\n debugFile: adv.debugFile,\n env: adv.env,\n abortController,\n });\n },\n });\n\n const sessionId = await raceWithAbort(handle.sdkSessionIdPromise, requestSignal, () =>\n abortController.abort()\n );\n\n const resumeSecret = getResumeSecret();\n return {\n sessionId,\n status: \"running\",\n pollInterval: 3000,\n resumeToken: resumeSecret ? computeResumeToken(sessionId, resumeSecret) : undefined,\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n sessionId: \"\",\n status: \"error\",\n error: message.includes(\"Error [\") ? message : `Error [${ErrorCode.INTERNAL}]: ${message}`,\n };\n }\n}\n","/**\n * claude_code_reply tool - Continue an existing Claude Code session (async)\n */\nimport type { SessionManager } from \"../session/manager.js\";\nimport type {\n AgentDefinition,\n EffortLevel,\n McpServerConfig,\n OutputFormat,\n SandboxSettings,\n SessionStartResult,\n SettingSource,\n SystemPrompt,\n ThinkingConfig,\n ToolsConfig,\n} from \"../types.js\";\nimport { DEFAULT_SETTING_SOURCES, ErrorCode } from \"../types.js\";\nimport { consumeQuery } from \"./query-consumer.js\";\nimport type { ToolDiscoveryCache } from \"./tool-discovery.js\";\nimport { computeResumeToken, getResumeSecret } from \"../utils/resume-token.js\";\nimport { raceWithAbort } from \"../utils/race-with-abort.js\";\nimport { buildOptions } from \"../utils/build-options.js\";\n\n/** Disk resume fallback configuration — only used when the in-memory session is missing. */\nexport interface DiskResumeConfig {\n resumeToken?: string;\n cwd?: string;\n allowedTools?: string[];\n disallowedTools?: string[];\n tools?: ToolsConfig;\n persistSession?: boolean;\n maxTurns?: number;\n model?: string;\n systemPrompt?: SystemPrompt;\n agents?: Record<string, AgentDefinition>;\n agent?: string;\n maxBudgetUsd?: number;\n effort?: EffortLevel;\n betas?: string[];\n additionalDirectories?: string[];\n outputFormat?: OutputFormat;\n thinking?: ThinkingConfig;\n resumeSessionAt?: string;\n pathToClaudeCodeExecutable?: string;\n mcpServers?: Record<string, McpServerConfig>;\n sandbox?: SandboxSettings;\n fallbackModel?: string;\n enableFileCheckpointing?: boolean;\n includePartialMessages?: boolean;\n strictMcpConfig?: boolean;\n settingSources?: SettingSource[];\n debug?: boolean;\n debugFile?: string;\n env?: Record<string, string | undefined>;\n}\n\nexport interface ClaudeCodeReplyInput {\n sessionId: string;\n prompt: string;\n forkSession?: boolean;\n\n /** Timeout waiting for fork init (default 10000ms, only used when forkSession=true) */\n sessionInitTimeoutMs?: number;\n /** Timeout waiting for permission decision (default 60000ms) */\n permissionRequestTimeoutMs?: number;\n\n /**\n * Disk resume fallback configuration. Only used when `CLAUDE_CODE_MCP_ALLOW_DISK_RESUME=1`\n * and the in-memory session is missing. Contains resumeToken + all session config overrides.\n */\n diskResumeConfig?: DiskResumeConfig;\n}\n\nexport type ClaudeCodeReplyStartResult =\n | SessionStartResult\n | { sessionId: string; status: \"error\"; error: string };\n\nfunction toStartError(\n sessionId: string,\n err: unknown\n): {\n agentResult: {\n sessionId: string;\n result: string;\n isError: true;\n durationMs: 0;\n numTurns: 0;\n totalCostUsd: 0;\n };\n errorText: string;\n} {\n const message = err instanceof Error ? err.message : String(err);\n const errorText = message.includes(\"Error [\")\n ? message\n : `Error [${ErrorCode.INTERNAL}]: ${message}`;\n return {\n agentResult: {\n sessionId,\n result: errorText,\n isError: true,\n durationMs: 0,\n numTurns: 0,\n totalCostUsd: 0,\n },\n errorText,\n };\n}\n\nfunction buildOptionsFromDiskResume(dr: DiskResumeConfig): ReturnType<typeof buildOptions> {\n if (dr.cwd === undefined || typeof dr.cwd !== \"string\" || dr.cwd.trim() === \"\") {\n throw new Error(`Error [${ErrorCode.INVALID_ARGUMENT}]: cwd must be provided for disk resume.`);\n }\n return buildOptions(dr as Parameters<typeof buildOptions>[0]);\n}\n\nexport async function executeClaudeCodeReply(\n input: ClaudeCodeReplyInput,\n sessionManager: SessionManager,\n toolCache?: ToolDiscoveryCache,\n requestSignal?: AbortSignal\n): Promise<ClaudeCodeReplyStartResult> {\n const permissionRequestTimeoutMs = input.permissionRequestTimeoutMs ?? 60_000;\n const sessionInitTimeoutMs = input.sessionInitTimeoutMs ?? 10_000;\n\n const existing = sessionManager.get(input.sessionId);\n if (!existing) {\n const allowDiskResume = process.env.CLAUDE_CODE_MCP_ALLOW_DISK_RESUME === \"1\";\n if (!allowDiskResume) {\n return {\n sessionId: input.sessionId,\n status: \"error\",\n error: `Error [${ErrorCode.SESSION_NOT_FOUND}]: Session '${input.sessionId}' not found or expired.`,\n };\n }\n\n const resumeSecret = getResumeSecret();\n if (!resumeSecret) {\n return {\n sessionId: input.sessionId,\n status: \"error\",\n error: `Error [${ErrorCode.PERMISSION_DENIED}]: Disk resume is enabled but CLAUDE_CODE_MCP_RESUME_SECRET is not set.`,\n };\n }\n\n const dr = input.diskResumeConfig ?? {};\n if (typeof dr.resumeToken !== \"string\" || dr.resumeToken.trim() === \"\") {\n return {\n sessionId: input.sessionId,\n status: \"error\",\n error: `Error [${ErrorCode.PERMISSION_DENIED}]: resumeToken is required for disk resume fallback.`,\n };\n }\n const expectedToken = computeResumeToken(input.sessionId, resumeSecret);\n if (dr.resumeToken !== expectedToken) {\n return {\n sessionId: input.sessionId,\n status: \"error\",\n error: `Error [${ErrorCode.PERMISSION_DENIED}]: Invalid resumeToken for session '${input.sessionId}'.`,\n };\n }\n\n try {\n const abortController = new AbortController();\n const options = buildOptionsFromDiskResume(dr);\n\n sessionManager.create({\n sessionId: input.sessionId,\n cwd: options.cwd ?? dr.cwd ?? \"\",\n model: dr.model,\n permissionMode: \"default\",\n allowedTools: dr.allowedTools,\n disallowedTools: dr.disallowedTools,\n tools: dr.tools,\n maxTurns: dr.maxTurns,\n systemPrompt: dr.systemPrompt,\n agents: dr.agents,\n maxBudgetUsd: dr.maxBudgetUsd,\n effort: dr.effort,\n betas: dr.betas,\n additionalDirectories: dr.additionalDirectories,\n outputFormat: dr.outputFormat,\n thinking: dr.thinking,\n persistSession: dr.persistSession,\n pathToClaudeCodeExecutable: dr.pathToClaudeCodeExecutable,\n agent: dr.agent,\n mcpServers: dr.mcpServers,\n sandbox: dr.sandbox,\n fallbackModel: dr.fallbackModel,\n enableFileCheckpointing: dr.enableFileCheckpointing,\n includePartialMessages: dr.includePartialMessages,\n strictMcpConfig: dr.strictMcpConfig,\n settingSources: dr.settingSources ?? DEFAULT_SETTING_SOURCES,\n debug: dr.debug,\n debugFile: dr.debugFile,\n env: dr.env,\n abortController,\n });\n\n try {\n consumeQuery({\n mode: \"disk-resume\",\n sessionId: input.sessionId,\n prompt: input.prompt,\n abortController,\n options,\n permissionRequestTimeoutMs,\n sessionInitTimeoutMs,\n sessionManager,\n toolCache,\n });\n } catch (err: unknown) {\n const { agentResult, errorText } = toStartError(input.sessionId, err);\n sessionManager.setResult(input.sessionId, {\n type: \"error\",\n result: agentResult,\n createdAt: new Date().toISOString(),\n });\n sessionManager.pushEvent(input.sessionId, {\n type: \"error\",\n data: agentResult,\n timestamp: new Date().toISOString(),\n });\n sessionManager.update(input.sessionId, { status: \"error\", abortController: undefined });\n return { sessionId: input.sessionId, status: \"error\", error: errorText };\n }\n\n return {\n sessionId: input.sessionId,\n status: \"running\",\n pollInterval: 3000,\n resumeToken: computeResumeToken(input.sessionId, resumeSecret),\n };\n } catch (err: unknown) {\n const { agentResult, errorText } = toStartError(input.sessionId, err);\n if (sessionManager.get(input.sessionId)) {\n sessionManager.setResult(input.sessionId, {\n type: \"error\",\n result: agentResult,\n createdAt: new Date().toISOString(),\n });\n sessionManager.pushEvent(input.sessionId, {\n type: \"error\",\n data: agentResult,\n timestamp: new Date().toISOString(),\n });\n sessionManager.update(input.sessionId, { status: \"error\", abortController: undefined });\n }\n return {\n sessionId: input.sessionId,\n status: \"error\",\n error: errorText,\n };\n }\n }\n\n if (existing.status === \"running\" || existing.status === \"waiting_permission\") {\n return {\n sessionId: input.sessionId,\n status: \"error\",\n error: `Error [${ErrorCode.SESSION_BUSY}]: Session is not available (status: ${existing.status}).`,\n };\n }\n\n if (existing.status === \"cancelled\") {\n return {\n sessionId: input.sessionId,\n status: \"error\",\n error: `Error [${ErrorCode.CANCELLED}]: Session '${input.sessionId}' has been cancelled and cannot be resumed.`,\n };\n }\n\n const originalStatus = existing.status;\n const abortController = new AbortController();\n const acquired = sessionManager.tryAcquire(input.sessionId, originalStatus, abortController);\n if (!acquired) {\n const current = sessionManager.get(input.sessionId);\n return {\n sessionId: input.sessionId,\n status: \"error\",\n error: current\n ? `Error [${ErrorCode.SESSION_BUSY}]: Session is not available (status: ${current.status}).`\n : `Error [${ErrorCode.SESSION_NOT_FOUND}]: Session '${input.sessionId}' not found or expired.`,\n };\n }\n\n const options = buildOptions(existing);\n if (input.forkSession) options.forkSession = true;\n\n try {\n const handle = consumeQuery({\n mode: \"resume\",\n sessionId: input.sessionId,\n prompt: input.prompt,\n abortController,\n options,\n permissionRequestTimeoutMs,\n sessionInitTimeoutMs,\n waitForInitSessionId: !!input.forkSession,\n sessionManager,\n toolCache,\n onInit: (init) => {\n if (!input.forkSession) return;\n if (init.session_id === input.sessionId) return;\n\n if (!sessionManager.get(init.session_id)) {\n sessionManager.create({\n sessionId: init.session_id,\n cwd: existing.cwd,\n model: existing.model,\n permissionMode: \"default\",\n allowedTools: existing.allowedTools,\n disallowedTools: existing.disallowedTools,\n tools: existing.tools,\n maxTurns: existing.maxTurns,\n systemPrompt: existing.systemPrompt,\n agents: existing.agents,\n maxBudgetUsd: existing.maxBudgetUsd,\n effort: existing.effort,\n betas: existing.betas,\n additionalDirectories: existing.additionalDirectories,\n outputFormat: existing.outputFormat,\n thinking: existing.thinking,\n persistSession: existing.persistSession,\n pathToClaudeCodeExecutable: existing.pathToClaudeCodeExecutable,\n agent: existing.agent,\n mcpServers: existing.mcpServers,\n sandbox: existing.sandbox,\n fallbackModel: existing.fallbackModel,\n enableFileCheckpointing: existing.enableFileCheckpointing,\n includePartialMessages: existing.includePartialMessages,\n strictMcpConfig: existing.strictMcpConfig,\n settingSources: existing.settingSources ?? DEFAULT_SETTING_SOURCES,\n debug: existing.debug,\n debugFile: existing.debugFile,\n env: existing.env,\n abortController,\n });\n }\n\n // Restore original session state (fork should not affect the original session).\n sessionManager.update(input.sessionId, {\n status: originalStatus,\n abortController: undefined,\n });\n },\n });\n\n const sessionId = input.forkSession\n ? await raceWithAbort(handle.sdkSessionIdPromise, requestSignal, () =>\n abortController.abort()\n )\n : input.sessionId;\n if (input.forkSession && sessionId === input.sessionId) {\n return {\n sessionId: input.sessionId,\n status: \"error\",\n error: `Error [${ErrorCode.INTERNAL}]: Fork requested but no new session ID received from agent.`,\n };\n }\n\n const resumeSecret = getResumeSecret();\n return {\n sessionId,\n status: \"running\",\n pollInterval: 3000,\n resumeToken: resumeSecret ? computeResumeToken(sessionId, resumeSecret) : undefined,\n };\n } catch (err: unknown) {\n const { agentResult, errorText } = toStartError(input.sessionId, err);\n if (input.forkSession) {\n sessionManager.update(input.sessionId, {\n status: originalStatus,\n abortController: undefined,\n });\n } else {\n sessionManager.setResult(input.sessionId, {\n type: \"error\",\n result: agentResult,\n createdAt: new Date().toISOString(),\n });\n sessionManager.pushEvent(input.sessionId, {\n type: \"error\",\n data: agentResult,\n timestamp: new Date().toISOString(),\n });\n sessionManager.update(input.sessionId, { status: \"error\", abortController: undefined });\n }\n return {\n sessionId: input.sessionId,\n status: \"error\",\n error: errorText,\n };\n }\n}\n","import type { ToolInfo } from \"../types.js\";\n\ntype ToolCatalogEntry = Omit<ToolInfo, \"name\">;\n\nexport const TOOL_CATALOG: Record<string, ToolCatalogEntry> = {\n Bash: {\n description: \"Run shell commands (e.g. npm install, git commit, ls) in the project directory.\",\n category: \"execute\",\n },\n Read: { description: \"Read the contents of a file given its path.\", category: \"file_read\" },\n Write: {\n description: \"Create a new file or completely replace an existing file's contents.\",\n category: \"file_write\",\n },\n Edit: {\n description:\n \"Make targeted changes to specific parts of an existing file without rewriting the whole file.\",\n category: \"file_write\",\n },\n Glob: {\n description: \"Find files by name pattern (e.g. '**/*.ts' finds all TypeScript files).\",\n category: \"file_read\",\n },\n Grep: {\n description: \"Search inside files for text or regex patterns (like grep/ripgrep).\",\n category: \"file_read\",\n },\n NotebookEdit: {\n description: \"Edit individual cells in Jupyter notebooks (.ipynb files).\",\n category: \"file_write\",\n },\n WebFetch: {\n description: \"Download and read the content of a web page or API endpoint.\",\n category: \"network\",\n },\n WebSearch: { description: \"Search the web and return relevant results.\", category: \"network\" },\n Task: {\n description:\n \"Spawn a subagent to handle a subtask independently (requires this tool to be in allowedTools).\",\n category: \"agent\",\n },\n TaskOutput: { description: \"Get the output from a background subagent task.\", category: \"agent\" },\n TaskStop: { description: \"Cancel a running background subagent task.\", category: \"agent\" },\n TodoWrite: {\n description: \"Create and update a structured task/todo checklist.\",\n category: \"agent\",\n },\n AskUserQuestion: {\n description: \"Ask the user a question and wait for their answer before continuing.\",\n category: \"interaction\",\n },\n};\n\nfunction uniq<T>(items: T[]): T[] {\n return Array.from(new Set(items));\n}\n\nexport function discoverToolsFromInit(initTools: string[]): ToolInfo[] {\n const names = uniq(initTools.filter((t) => typeof t === \"string\" && t.trim() !== \"\"));\n return names.map((name) => ({\n name,\n description: TOOL_CATALOG[name]?.description ?? name,\n category: TOOL_CATALOG[name]?.category,\n }));\n}\n\nexport function defaultCatalogTools(): ToolInfo[] {\n return Object.keys(TOOL_CATALOG)\n .sort((a, b) => a.localeCompare(b))\n .map((name) => ({ name, ...TOOL_CATALOG[name] }));\n}\n\nexport class ToolDiscoveryCache {\n private cached: ToolInfo[];\n\n constructor(initial?: ToolInfo[]) {\n this.cached = initial ?? defaultCatalogTools();\n }\n\n getTools(): ToolInfo[] {\n return this.cached;\n }\n\n updateFromInit(initTools: string[]): { updated: boolean; tools: ToolInfo[] } {\n const discovered = discoverToolsFromInit(initTools);\n const next = mergeToolLists(discovered, defaultCatalogTools());\n const updated = JSON.stringify(next) !== JSON.stringify(this.cached);\n if (updated) this.cached = next;\n return { updated, tools: this.cached };\n }\n}\n\nexport function mergeToolLists(primary: ToolInfo[], fallback: ToolInfo[]): ToolInfo[] {\n const byName = new Map<string, ToolInfo>();\n for (const t of fallback) byName.set(t.name, t);\n for (const t of primary) byName.set(t.name, t);\n return Array.from(byName.values()).sort((a, b) => a.name.localeCompare(b.name));\n}\n\nfunction groupByCategory(tools: ToolInfo[]): Record<string, ToolInfo[]> {\n const grouped: Record<string, ToolInfo[]> = {};\n for (const tool of tools) {\n const category = tool.category ?? \"other\";\n grouped[category] ??= [];\n grouped[category].push(tool);\n }\n for (const category of Object.keys(grouped)) {\n grouped[category].sort((a, b) => a.name.localeCompare(b.name));\n }\n return grouped;\n}\n\nexport function buildInternalToolsDescription(tools: ToolInfo[]): string {\n const grouped = groupByCategory(tools);\n const categories = Object.keys(grouped).sort((a, b) => a.localeCompare(b));\n\n let desc =\n \"Start a new Claude Code agent session.\\n\\n\" +\n \"Launches an autonomous coding agent that can read/write files, run shell commands, search code, \" +\n \"manage git, access the web, and more. \" +\n \"Returns immediately with a sessionId — the agent runs asynchronously in the background.\\n\\n\" +\n \"Workflow:\\n\" +\n '1. Call claude_code with a prompt → returns { sessionId, status: \"running\", pollInterval }\\n' +\n '2. Poll with claude_code_check (action=\"poll\") to receive progress events and the final result\\n' +\n '3. If the agent needs permission for a tool call, approve or deny via claude_code_check (action=\"respond_permission\")\\n\\n';\n\n desc +=\n \"Defaults:\\n\" +\n \"- settingSources: ['user', 'project', 'local'] (loads ~/.claude/settings.json, .claude/settings.json, .claude/settings.local.json, and CLAUDE.md)\\n\" +\n \"- persistSession: true\\n\" +\n \"- sessionInitTimeoutMs: 10000\\n\" +\n \"- permissionRequestTimeoutMs: 60000\\n\" +\n \"- allowedTools/disallowedTools: [] (none)\\n\" +\n \"- resumeToken: omitted unless CLAUDE_CODE_MCP_RESUME_SECRET is set on the server\\n\\n\";\n desc +=\n \"Internal tools available to the agent (use allowedTools/disallowedTools to control approval policy; \" +\n \"authoritative list returned by claude_code_check with includeTools=true):\\n\";\n\n for (const category of categories) {\n desc += `\\n[${category}]\\n`;\n for (const tool of grouped[category]) {\n desc += `- ${tool.name}: ${tool.description}\\n`;\n }\n }\n\n desc +=\n \"\\nUse `allowedTools` to pre-approve tools (no permission prompts). \" +\n \"Use `disallowedTools` to permanently block specific tools. \" +\n 'Any tool not in either list will pause the session (status: \"waiting_permission\") until approved or denied via claude_code_check.\\n';\n return desc;\n}\n","/**\n * claude_code_check tool - Poll session events and respond to permission requests (v2 baseline)\n */\nimport type { SessionManager } from \"../session/manager.js\";\nimport type {\n AgentResult,\n CheckAction,\n CheckResult,\n CheckResponseMode,\n PermissionDecision,\n PermissionResult,\n PermissionUpdate,\n SessionEventType,\n SessionStatus,\n} from \"../types.js\";\nimport { ErrorCode } from \"../types.js\";\nimport type { ToolDiscoveryCache } from \"./tool-discovery.js\";\nimport { discoverToolsFromInit } from \"./tool-discovery.js\";\n\n/** Fine-grained poll control options (most callers just use responseMode). */\nexport interface PollOptions {\n includeTools?: boolean;\n includeEvents?: boolean;\n includeActions?: boolean;\n includeResult?: boolean;\n includeUsage?: boolean;\n includeModelUsage?: boolean;\n includeStructuredOutput?: boolean;\n includeTerminalEvents?: boolean;\n includeProgressEvents?: boolean;\n}\n\n/** Advanced permission response options. */\nexport interface PermissionResponseOptions {\n updatedInput?: Record<string, unknown>;\n updatedPermissions?: Array<Record<string, unknown>>;\n}\n\nexport interface ClaudeCodeCheckInput {\n action: CheckAction;\n sessionId: string;\n cursor?: number;\n\n /**\n * Response shaping. Defaults to \"minimal\" to reduce payload size.\n * Use \"full\" to include verbose fields like usage/modelUsage.\n */\n responseMode?: CheckResponseMode;\n /** Max number of events to return per poll (pagination via nextCursor). */\n maxEvents?: number;\n\n /** Fine-grained poll control. Overrides responseMode defaults for individual fields. */\n pollOptions?: PollOptions;\n\n requestId?: string;\n decision?: PermissionDecision;\n denyMessage?: string;\n interrupt?: boolean;\n\n /** Advanced permission response options (only with decision='allow'). */\n permissionOptions?: PermissionResponseOptions;\n}\n\nexport type ClaudeCodeCheckResult =\n | CheckResult\n | { sessionId: string; error: string; isError: true };\n\nfunction pollIntervalForStatus(status: SessionStatus): number | undefined {\n if (status === \"waiting_permission\") return 1000;\n if (status === \"running\") return 3000;\n return undefined;\n}\n\nfunction toPermissionResult(params: {\n decision: PermissionDecision;\n updatedInput?: Record<string, unknown>;\n updatedPermissions?: Array<Record<string, unknown>>;\n denyMessage?: string;\n interrupt?: boolean;\n}): PermissionResult {\n if (params.decision === \"allow\") {\n return {\n behavior: \"allow\",\n updatedInput: params.updatedInput,\n updatedPermissions: params.updatedPermissions as unknown as PermissionUpdate[] | undefined,\n };\n }\n return {\n behavior: \"deny\",\n message: params.denyMessage ?? \"Permission denied by caller\",\n interrupt: params.interrupt,\n };\n}\n\n/**\n * Slim down an assistant output event's message object in minimal mode.\n * Strips verbose API fields (usage, model, id, type, stop_sequence) and\n * cache_control metadata from content blocks, keeping only the essentials.\n */\nfunction slimAssistantData(data: unknown): unknown {\n if (!data || typeof data !== \"object\") return data;\n const d = data as Record<string, unknown>;\n if (d.type !== \"assistant\") return data;\n\n const msg = d.message;\n if (!msg || typeof msg !== \"object\") return data;\n const m = msg as Record<string, unknown>;\n\n // Strip verbose fields from the message object\n const slimmed: Record<string, unknown> = {};\n if (m.role !== undefined) slimmed.role = m.role;\n if (m.stop_reason !== undefined) slimmed.stop_reason = m.stop_reason;\n\n // Slim content blocks: remove cache_control and other metadata\n if (Array.isArray(m.content)) {\n slimmed.content = (m.content as Array<Record<string, unknown>>).map((block) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { cache_control, ...rest } = block;\n return rest;\n });\n }\n\n return {\n type: d.type,\n message: slimmed,\n ...(d.parent_tool_use_id ? { parent_tool_use_id: d.parent_tool_use_id } : {}),\n ...(d.error ? { error: d.error } : {}),\n };\n}\n\nfunction toEvents(\n events: Array<{ id: number; type: SessionEventType; data: unknown; timestamp: string }>,\n opts: {\n includeUsage: boolean;\n includeModelUsage: boolean;\n includeStructuredOutput: boolean;\n slim: boolean;\n }\n): CheckResult[\"events\"] {\n return events.map((e) => {\n if ((e.type === \"result\" || e.type === \"error\") && isAgentResult(e.data)) {\n const redacted = redactAgentResult(e.data, opts);\n return { id: e.id, type: e.type, data: redacted, timestamp: e.timestamp };\n }\n // In minimal mode, slim down assistant output events\n if (opts.slim && e.type === \"output\") {\n return { id: e.id, type: e.type, data: slimAssistantData(e.data), timestamp: e.timestamp };\n }\n return { id: e.id, type: e.type, data: e.data, timestamp: e.timestamp };\n });\n}\n\nfunction buildResult(\n sessionManager: SessionManager,\n toolCache: ToolDiscoveryCache | undefined,\n input: ClaudeCodeCheckInput\n): CheckResult {\n const responseMode: CheckResponseMode = input.responseMode ?? \"minimal\";\n const po = input.pollOptions ?? {};\n const includeTools = po.includeTools;\n const includeEvents = po.includeEvents ?? true;\n const includeActions = po.includeActions ?? true;\n const includeResult = po.includeResult ?? true;\n const includeUsage = po.includeUsage ?? responseMode === \"full\";\n const includeModelUsage = po.includeModelUsage ?? responseMode === \"full\";\n const includeStructuredOutput = po.includeStructuredOutput ?? responseMode === \"full\";\n const includeTerminalEvents = po.includeTerminalEvents ?? responseMode === \"full\";\n const includeProgressEvents = po.includeProgressEvents ?? responseMode === \"full\";\n const maxEvents = input.maxEvents ?? (responseMode === \"minimal\" ? 200 : undefined);\n\n const sessionId = input.sessionId;\n const session = sessionManager.get(sessionId);\n const status: SessionStatus = session?.status ?? \"error\";\n\n const {\n events: rawEvents,\n nextCursor: rawNextCursor,\n cursorResetTo,\n } = sessionManager.readEvents(sessionId, input.cursor);\n\n let truncated = false;\n const truncatedFields: string[] = [];\n\n // Apply pagination by event count (caller should continue with nextCursor).\n const windowEvents =\n maxEvents !== undefined && rawEvents.length > maxEvents\n ? rawEvents.slice(0, maxEvents)\n : rawEvents;\n const nextCursor =\n maxEvents !== undefined && rawEvents.length > maxEvents\n ? windowEvents.length > 0\n ? windowEvents[windowEvents.length - 1].id + 1\n : rawNextCursor\n : rawNextCursor;\n if (maxEvents !== undefined && rawEvents.length > maxEvents) {\n truncated = true;\n truncatedFields.push(\"events\");\n }\n\n const outputEvents = (() => {\n if (!includeEvents) return [] as typeof windowEvents;\n\n let filtered = windowEvents;\n\n // Avoid duplicating terminal result/error both in events and top-level result.\n if (!includeTerminalEvents && includeResult && (status === \"idle\" || status === \"error\")) {\n filtered = filtered.filter((e) => e.type !== \"result\" && e.type !== \"error\");\n }\n\n // In minimal mode, filter out noisy progress events (tool_progress, auth_status).\n if (!includeProgressEvents) {\n filtered = filtered.filter((e) => {\n if (e.type !== \"progress\") return true;\n const d = e.data as Record<string, unknown> | null;\n const progressType = d?.type;\n return progressType !== \"tool_progress\" && progressType !== \"auth_status\";\n });\n }\n\n return filtered;\n })();\n\n const pending =\n status === \"waiting_permission\" ? sessionManager.listPendingPermissions(sessionId) : [];\n const stored =\n status === \"idle\" || status === \"error\" ? sessionManager.getResult(sessionId) : undefined;\n\n const initTools = includeTools ? sessionManager.getInitTools(sessionId) : undefined;\n const availableTools = includeTools && initTools ? discoverToolsFromInit(initTools) : undefined;\n\n return {\n sessionId,\n status,\n pollInterval: pollIntervalForStatus(status),\n cursorResetTo,\n truncated: truncated ? true : undefined,\n truncatedFields: truncatedFields.length > 0 ? truncatedFields : undefined,\n events: toEvents(outputEvents, {\n includeUsage,\n includeModelUsage,\n includeStructuredOutput,\n slim: responseMode === \"minimal\",\n }),\n nextCursor,\n availableTools,\n actions:\n includeActions && status === \"waiting_permission\"\n ? pending.map((req) => ({\n type: \"permission\" as const,\n requestId: req.requestId,\n toolName: req.toolName,\n input: req.input,\n summary: req.summary,\n decisionReason: req.decisionReason,\n blockedPath: req.blockedPath,\n toolUseID: req.toolUseID,\n agentID: req.agentID,\n suggestions: req.suggestions,\n description: req.description,\n createdAt: req.createdAt,\n }))\n : undefined,\n result:\n includeResult && stored?.result\n ? redactAgentResult(stored.result, {\n includeUsage,\n includeModelUsage,\n includeStructuredOutput,\n slim: responseMode === \"minimal\",\n })\n : undefined,\n cancelledAt: session?.cancelledAt,\n cancelledReason: session?.cancelledReason,\n cancelledSource: session?.cancelledSource,\n lastEventId: responseMode === \"full\" ? sessionManager.getLastEventId(sessionId) : undefined,\n lastToolUseId: responseMode === \"full\" ? session?.lastToolUseId : undefined,\n };\n}\n\nfunction isAgentResult(value: unknown): value is AgentResult {\n if (!value || typeof value !== \"object\") return false;\n const v = value as Record<string, unknown>;\n return (\n typeof v.sessionId === \"string\" &&\n typeof v.result === \"string\" &&\n typeof v.isError === \"boolean\" &&\n typeof v.durationMs === \"number\" &&\n typeof v.numTurns === \"number\" &&\n typeof v.totalCostUsd === \"number\"\n );\n}\n\nfunction redactAgentResult(\n result: AgentResult,\n opts: {\n includeUsage: boolean;\n includeModelUsage: boolean;\n includeStructuredOutput: boolean;\n slim?: boolean;\n }\n): AgentResult {\n const {\n usage,\n modelUsage,\n structuredOutput,\n durationApiMs,\n sessionTotalTurns,\n sessionTotalCostUsd,\n ...rest\n } = result;\n\n return {\n ...rest,\n durationApiMs: opts.slim ? undefined : durationApiMs,\n sessionTotalTurns: opts.slim ? undefined : sessionTotalTurns,\n sessionTotalCostUsd: opts.slim ? undefined : sessionTotalCostUsd,\n usage: opts.includeUsage ? usage : undefined,\n modelUsage: opts.includeModelUsage ? modelUsage : undefined,\n structuredOutput: opts.includeStructuredOutput ? structuredOutput : undefined,\n };\n}\n\nexport function executeClaudeCodeCheck(\n input: ClaudeCodeCheckInput,\n sessionManager: SessionManager,\n toolCache?: ToolDiscoveryCache\n): ClaudeCodeCheckResult {\n if (typeof input.sessionId !== \"string\" || input.sessionId.trim() === \"\") {\n return {\n sessionId: \"\",\n error: `Error [${ErrorCode.INVALID_ARGUMENT}]: sessionId must be a non-empty string.`,\n isError: true,\n };\n }\n\n const session = sessionManager.get(input.sessionId);\n if (!session) {\n return {\n sessionId: input.sessionId,\n error: `Error [${ErrorCode.SESSION_NOT_FOUND}]: Session '${input.sessionId}' not found or expired.`,\n isError: true,\n };\n }\n\n if (input.action === \"poll\") {\n return buildResult(sessionManager, toolCache, input);\n }\n\n // respond_permission\n if (typeof input.requestId !== \"string\" || input.requestId.trim() === \"\") {\n return {\n sessionId: input.sessionId,\n error: `Error [${ErrorCode.INVALID_ARGUMENT}]: requestId is required for respond_permission.`,\n isError: true,\n };\n }\n if (input.decision !== \"allow\" && input.decision !== \"deny\") {\n return {\n sessionId: input.sessionId,\n error: `Error [${ErrorCode.INVALID_ARGUMENT}]: decision must be 'allow' or 'deny'.`,\n isError: true,\n };\n }\n\n const ok = sessionManager.finishRequest(\n input.sessionId,\n input.requestId,\n toPermissionResult({\n decision: input.decision,\n updatedInput: input.permissionOptions?.updatedInput,\n updatedPermissions: input.permissionOptions?.updatedPermissions,\n denyMessage: input.denyMessage,\n interrupt: input.interrupt,\n }),\n \"respond\"\n );\n if (!ok) {\n return {\n sessionId: input.sessionId,\n error: `Error [${ErrorCode.PERMISSION_REQUEST_NOT_FOUND}]: requestId '${input.requestId}' not found (already finished or expired).`,\n isError: true,\n };\n }\n\n return buildResult(sessionManager, toolCache, input);\n}\n","/**\n * claude_code_session tool - Manage sessions (list, get, cancel)\n */\nimport type { SessionManager } from \"../session/manager.js\";\nimport type {\n PublicSessionInfo,\n SensitiveSessionInfo,\n SessionInfo,\n SessionAction,\n} from \"../types.js\";\nimport { ErrorCode } from \"../types.js\";\n\nexport interface ClaudeCodeSessionInput {\n action: SessionAction;\n sessionId?: string;\n includeSensitive?: boolean;\n}\n\nexport interface SessionResult {\n sessions: Array<PublicSessionInfo | SensitiveSessionInfo>;\n message?: string;\n isError?: boolean;\n}\n\nexport function executeClaudeCodeSession(\n input: ClaudeCodeSessionInput,\n sessionManager: SessionManager\n): SessionResult {\n const toSessionJson = (s: SessionInfo) =>\n input.includeSensitive ? sessionManager.toSensitiveJSON(s) : sessionManager.toPublicJSON(s);\n\n switch (input.action) {\n case \"list\": {\n const sessions = sessionManager.list().map((s) => toSessionJson(s));\n return { sessions };\n }\n\n case \"get\": {\n if (!input.sessionId) {\n return {\n sessions: [],\n message: `Error [${ErrorCode.INVALID_ARGUMENT}]: sessionId is required for 'get' action.`,\n isError: true,\n };\n }\n const session = sessionManager.get(input.sessionId);\n if (!session) {\n return {\n sessions: [],\n message: `Error [${ErrorCode.SESSION_NOT_FOUND}]: Session '${input.sessionId}' not found.`,\n isError: true,\n };\n }\n return { sessions: [toSessionJson(session)] };\n }\n\n case \"cancel\": {\n if (!input.sessionId) {\n return {\n sessions: [],\n message: `Error [${ErrorCode.INVALID_ARGUMENT}]: sessionId is required for 'cancel' action.`,\n isError: true,\n };\n }\n const cancelled = sessionManager.cancel(input.sessionId, {\n reason: \"Cancelled by caller\",\n source: \"claude_code_session\",\n });\n if (!cancelled) {\n const session = sessionManager.get(input.sessionId);\n if (!session) {\n return {\n sessions: [],\n message: `Error [${ErrorCode.SESSION_NOT_FOUND}]: Session '${input.sessionId}' not found.`,\n isError: true,\n };\n }\n return {\n sessions: [toSessionJson(session)],\n message: `Error [${ErrorCode.INVALID_ARGUMENT}]: Session '${input.sessionId}' is not running (status: ${session.status}).`,\n isError: true,\n };\n }\n const updated = sessionManager.get(input.sessionId);\n return {\n sessions: updated ? [toSessionJson(updated)] : [],\n message: `Session '${input.sessionId}' cancelled.`,\n };\n }\n\n default:\n return {\n sessions: [],\n message: `Error [${ErrorCode.INVALID_ARGUMENT}]: Unknown action '${input.action}'. Use 'list', 'get', or 'cancel'.`,\n isError: true,\n };\n }\n}\n"],"mappings":"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","names":["options","event","sessionId","abortController","options"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/server.ts","../src/session/manager.ts","../src/types.ts","../src/tools/query-consumer.ts","../src/utils/windows.ts","../src/utils/resume-token.ts","../src/utils/race-with-abort.ts","../src/utils/build-options.ts","../src/tools/claude-code.ts","../src/tools/claude-code-reply.ts","../src/tools/tool-discovery.ts","../src/tools/claude-code-check.ts","../src/tools/claude-code-session.ts"],"sourcesContent":["/**\n * claude-code-mcp - MCP server entry point\n *\n * Starts the MCP server with stdio transport.\n * Usage: npx claude-code-mcp\n */\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { createServer } from \"./server.js\";\nimport { checkWindowsBashAvailability } from \"./utils/windows.js\";\n\nasync function main(): Promise<void> {\n const serverCwd = process.cwd();\n const server = createServer(serverCwd);\n const transport = new StdioServerTransport();\n\n // Handle graceful shutdown (idempotent)\n let closing = false;\n const shutdown = async () => {\n if (closing) return;\n closing = true;\n try {\n await server.close();\n } catch {\n // Ignore close errors during shutdown\n }\n // Allow stdio to flush before exiting\n process.exitCode = 0;\n setTimeout(() => process.exit(0), 100);\n };\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n await server.connect(transport);\n\n // Check Windows bash.exe availability and warn early\n checkWindowsBashAvailability();\n\n // Log to stderr (stdout is used for MCP communication)\n console.error(`claude-code-mcp server started (cwd: ${serverCwd})`);\n}\n\nmain().catch((err) => {\n console.error(\"Fatal error:\", err);\n process.exit(1);\n});\n","/**\n * MCP Server definition - registers tools and handles requests\n */\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { SessionManager } from \"./session/manager.js\";\nimport { executeClaudeCode } from \"./tools/claude-code.js\";\nimport { executeClaudeCodeReply } from \"./tools/claude-code-reply.js\";\nimport { executeClaudeCodeCheck } from \"./tools/claude-code-check.js\";\nimport { executeClaudeCodeSession } from \"./tools/claude-code-session.js\";\nimport { buildInternalToolsDescription, ToolDiscoveryCache } from \"./tools/tool-discovery.js\";\nimport {\n EFFORT_LEVELS,\n AGENT_MODELS,\n CHECK_ACTIONS,\n CHECK_RESPONSE_MODES,\n SESSION_ACTIONS,\n ErrorCode,\n} from \"./types.js\";\n\ndeclare const __PKG_VERSION__: string;\nconst SERVER_VERSION = typeof __PKG_VERSION__ !== \"undefined\" ? __PKG_VERSION__ : \"0.0.0-dev\";\n\nexport function createServer(serverCwd: string): McpServer {\n const sessionManager = new SessionManager();\n const toolCache = new ToolDiscoveryCache();\n\n const server = new McpServer({\n name: \"claude-code-mcp\",\n version: SERVER_VERSION,\n });\n\n // ── Shared Zod fragments ──────────────────────────────────────────────\n const agentDefinitionSchema = z.object({\n description: z.string(),\n prompt: z.string(),\n tools: z.array(z.string()).optional(),\n disallowedTools: z.array(z.string()).optional(),\n model: z.enum(AGENT_MODELS).optional(),\n maxTurns: z.number().int().positive().optional(),\n mcpServers: z.array(z.union([z.string(), z.record(z.string(), z.unknown())])).optional(),\n skills: z.array(z.string()).optional(),\n criticalSystemReminder_EXPERIMENTAL: z.string().optional(),\n });\n\n const systemPromptSchema = z.union([\n z.string(),\n z.object({\n type: z.literal(\"preset\"),\n preset: z.literal(\"claude_code\"),\n append: z.string().optional().describe(\"Appended to preset prompt\"),\n }),\n ]);\n\n const toolsConfigSchema = z.union([\n z.array(z.string()),\n z.object({\n type: z.literal(\"preset\"),\n preset: z.literal(\"claude_code\"),\n }),\n ]);\n\n const thinkingSchema = z.union([\n z.object({ type: z.literal(\"adaptive\") }),\n z.object({\n type: z.literal(\"enabled\"),\n budgetTokens: z.number().int().positive(),\n }),\n z.object({ type: z.literal(\"disabled\") }),\n ]);\n\n const outputFormatSchema = z.object({\n type: z.literal(\"json_schema\"),\n schema: z.record(z.string(), z.unknown()),\n });\n\n /** Advanced options shared by claude_code (and reused in diskResumeConfig). */\n const advancedOptionsSchema = z\n .object({\n tools: toolsConfigSchema.optional().describe(\"Visible tool set. Default: SDK\"),\n persistSession: z.boolean().optional().describe(\"Default: true\"),\n sessionInitTimeoutMs: z.number().int().positive().optional().describe(\"Default: 10000\"),\n agents: z\n .record(z.string(), agentDefinitionSchema)\n .optional()\n .describe(\"Sub-agent definitions. Default: none\"),\n agent: z.string().optional().describe(\"Primary agent name (from 'agents'). Default: none\"),\n maxBudgetUsd: z.number().positive().optional().describe(\"Default: none\"),\n effort: z.enum(EFFORT_LEVELS).optional().describe(\"Default: SDK\"),\n betas: z.array(z.string()).optional().describe(\"Default: none\"),\n additionalDirectories: z.array(z.string()).optional().describe(\"Default: none\"),\n outputFormat: outputFormatSchema.optional().describe(\"Default: none (plain text)\"),\n thinking: thinkingSchema.optional().describe(\"Default: SDK\"),\n pathToClaudeCodeExecutable: z.string().optional().describe(\"Default: SDK-bundled\"),\n mcpServers: z\n .record(z.string(), z.record(z.string(), z.unknown()))\n .optional()\n .describe(\"Default: none\"),\n sandbox: z.record(z.string(), z.unknown()).optional().describe(\"Default: none\"),\n fallbackModel: z.string().optional().describe(\"Default: none\"),\n enableFileCheckpointing: z.boolean().optional().describe(\"Default: false\"),\n includePartialMessages: z\n .boolean()\n .optional()\n .describe(\"Stream events to claude_code_check. Default: false\"),\n strictMcpConfig: z.boolean().optional().describe(\"Default: false\"),\n settingSources: z\n .array(z.enum([\"user\", \"project\", \"local\"]))\n .optional()\n .describe(\"Default: ['user','project','local']. [] = isolation mode\"),\n debug: z.boolean().optional().describe(\"Default: false\"),\n debugFile: z.string().optional().describe(\"Enables debug. Default: none\"),\n env: z\n .record(z.string(), z.string().optional())\n .optional()\n .describe(\"Merged with process.env. Default: none\"),\n })\n .optional()\n .describe(\"Low-frequency SDK options (all optional)\");\n\n // Tool 1: claude_code - Start a new agent session\n server.tool(\n \"claude_code\",\n buildInternalToolsDescription(toolCache.getTools()),\n {\n prompt: z.string().describe(\"Task or question\"),\n cwd: z.string().optional().describe(\"Working directory. Default: server cwd\"),\n allowedTools: z\n .array(z.string())\n .optional()\n .describe(\"Auto-approved tools, e.g. ['Bash','Read','Write','Edit']. Default: []\"),\n disallowedTools: z\n .array(z.string())\n .optional()\n .describe(\"Forbidden tools (priority over allowedTools). Default: []\"),\n maxTurns: z.number().int().positive().optional().describe(\"Default: SDK\"),\n model: z.string().optional().describe(\"e.g. 'opus'. Default: SDK\"),\n systemPrompt: systemPromptSchema.optional().describe(\"Default: SDK\"),\n permissionRequestTimeoutMs: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"Auto-deny timeout (ms). Default: 60000\"),\n advanced: advancedOptionsSchema,\n },\n async (args, extra) => {\n try {\n const result = await executeClaudeCode(\n args,\n sessionManager,\n serverCwd,\n toolCache,\n extra.signal\n );\n const isError = typeof (result as { error?: unknown }).error === \"string\";\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n isError,\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error [${ErrorCode.INTERNAL}]: ${message}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // Tool 2: claude_code_reply - Continue an existing session\n server.tool(\n \"claude_code_reply\",\n `Send a follow-up message to an existing Claude Code session.\n\nThe agent retains full context from previous turns (files read, code analyzed, conversation history). Returns immediately — use claude_code_check to poll for the result.\n\nSupports session forking (forkSession=true) to explore alternative approaches without modifying the original session.\n\nDefaults:\n- forkSession: false\n- sessionInitTimeoutMs: 10000 (only used when forkSession=true)\n- permissionRequestTimeoutMs: 60000\n- Disk resume: disabled unless CLAUDE_CODE_MCP_ALLOW_DISK_RESUME=1\n\nDisk resume: If the server restarted and the session is no longer in memory, set CLAUDE_CODE_MCP_ALLOW_DISK_RESUME=1 to let the agent resume from its on-disk transcript. Pass diskResumeConfig with resumeToken and session parameters.`,\n {\n sessionId: z.string().describe(\"Session ID from claude_code\"),\n prompt: z.string().describe(\"Follow-up message\"),\n forkSession: z.boolean().optional().describe(\"Branch into new session copy. Default: false\"),\n sessionInitTimeoutMs: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"Fork init timeout (ms). Default: 10000\"),\n permissionRequestTimeoutMs: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"Auto-deny timeout (ms). Default: 60000\"),\n diskResumeConfig: z\n .object({\n resumeToken: z.string().optional().describe(\"Required\"),\n cwd: z.string().optional().describe(\"Required\"),\n allowedTools: z.array(z.string()).optional().describe(\"Default: []\"),\n disallowedTools: z.array(z.string()).optional().describe(\"Default: []\"),\n tools: toolsConfigSchema.optional().describe(\"Default: SDK\"),\n persistSession: z.boolean().optional().describe(\"Default: true\"),\n maxTurns: z.number().int().positive().optional().describe(\"Default: SDK\"),\n model: z.string().optional().describe(\"Default: SDK\"),\n systemPrompt: systemPromptSchema.optional().describe(\"Default: SDK\"),\n agents: z.record(z.string(), agentDefinitionSchema).optional().describe(\"Default: none\"),\n agent: z.string().optional().describe(\"Default: none\"),\n maxBudgetUsd: z.number().positive().optional().describe(\"Default: none\"),\n effort: z.enum(EFFORT_LEVELS).optional().describe(\"Default: SDK\"),\n betas: z.array(z.string()).optional().describe(\"Default: none\"),\n additionalDirectories: z.array(z.string()).optional().describe(\"Default: none\"),\n outputFormat: outputFormatSchema.optional().describe(\"Default: none\"),\n thinking: thinkingSchema.optional().describe(\"Default: SDK\"),\n resumeSessionAt: z\n .string()\n .optional()\n .describe(\"Resume to specific message UUID. Default: none\"),\n pathToClaudeCodeExecutable: z.string().optional().describe(\"Default: SDK-bundled\"),\n mcpServers: z\n .record(z.string(), z.record(z.string(), z.unknown()))\n .optional()\n .describe(\"Default: none\"),\n sandbox: z.record(z.string(), z.unknown()).optional().describe(\"Default: none\"),\n fallbackModel: z.string().optional().describe(\"Default: none\"),\n enableFileCheckpointing: z.boolean().optional().describe(\"Default: false\"),\n includePartialMessages: z\n .boolean()\n .optional()\n .describe(\"Stream events to claude_code_check. Default: false\"),\n strictMcpConfig: z.boolean().optional().describe(\"Default: false\"),\n settingSources: z\n .array(z.enum([\"user\", \"project\", \"local\"]))\n .optional()\n .describe(\"Default: ['user','project','local']. [] = isolation mode\"),\n debug: z.boolean().optional().describe(\"Default: false\"),\n debugFile: z.string().optional().describe(\"Enables debug. Default: none\"),\n env: z.record(z.string(), z.string().optional()).optional().describe(\"Default: none\"),\n })\n .optional()\n .describe(\n \"Disk resume config (needs CLAUDE_CODE_MCP_ALLOW_DISK_RESUME=1). Requires resumeToken + cwd.\"\n ),\n },\n async (args, extra) => {\n try {\n const result = await executeClaudeCodeReply(args, sessionManager, toolCache, extra.signal);\n const isError = typeof (result as { error?: unknown }).error === \"string\";\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n isError,\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error [${ErrorCode.INTERNAL}]: ${message}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // Tool 3: claude_code_session - Manage sessions\n server.tool(\n \"claude_code_session\",\n `List, inspect, or cancel Claude Code sessions.\n\n- action=\"list\": Get all sessions with their status, cost, turn count, and settings.\n- action=\"get\": Get full details for one session (pass sessionId). Add includeSensitive=true to also see cwd, systemPrompt, agents, and additionalDirectories.\n- action=\"cancel\": Stop a running session immediately (pass sessionId).`,\n {\n action: z.enum(SESSION_ACTIONS),\n sessionId: z.string().optional().describe(\"Required for 'get' and 'cancel'\"),\n includeSensitive: z\n .boolean()\n .optional()\n .describe(\"Include cwd/systemPrompt/agents/additionalDirectories. Default: false\"),\n },\n async (args) => {\n const result = executeClaudeCodeSession(args, sessionManager);\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n isError: result.isError ?? false,\n };\n }\n );\n\n // Tool 4: claude_code_check - Poll events + respond to permission requests\n server.tool(\n \"claude_code_check\",\n `Query a running session for new events, retrieve the final result, or respond to permission requests.\n\nTwo actions:\n\nDefaults (poll):\n- responseMode: \"minimal\"\n- minimal mode strips verbose fields from assistant messages (usage, model, id, cache_control) and filters out noisy progress events (tool_progress, auth_status)\n- maxEvents: 200 in minimal mode (unlimited in full mode unless maxEvents is set)\n\naction=\"poll\" — Retrieve events since the last poll.\n Returns events (agent output, progress updates, permission requests, errors, final result).\n Pass the cursor from the previous poll's nextCursor for incremental updates. Omit cursor to get all buffered events.\n If the agent is waiting for permission, the response includes an \"actions\" array with pending requests.\n\naction=\"respond_permission\" — Approve or deny a pending permission request.\n Pass the requestId from the actions array, plus decision=\"allow\" or decision=\"deny\".\n Approving resumes agent execution. Denying (with optional interrupt=true) can halt the entire session.\n The response also includes the latest poll state (events, status, etc.), so a separate poll call is not needed.`,\n {\n action: z.enum(CHECK_ACTIONS),\n sessionId: z.string().describe(\"Target session ID\"),\n cursor: z\n .number()\n .int()\n .nonnegative()\n .optional()\n .describe(\"Event offset for incremental poll. Default: 0\"),\n responseMode: z.enum(CHECK_RESPONSE_MODES).optional().describe(\"Default: 'minimal'\"),\n maxEvents: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"Events per poll. Default: 200 (minimal)\"),\n\n requestId: z.string().optional().describe(\"Permission request ID (from actions[])\"),\n decision: z.enum([\"allow\", \"deny\"]).optional().describe(\"For respond_permission\"),\n denyMessage: z\n .string()\n .optional()\n .describe(\"Reason shown to agent on deny. Default: 'Permission denied by caller'\"),\n interrupt: z.boolean().optional().describe(\"Stop session on deny. Default: false\"),\n\n pollOptions: z\n .object({\n includeTools: z.boolean().optional().describe(\"Default: false\"),\n includeEvents: z.boolean().optional().describe(\"Default: true\"),\n includeActions: z.boolean().optional().describe(\"Default: true\"),\n includeResult: z.boolean().optional().describe(\"Default: true\"),\n includeUsage: z.boolean().optional().describe(\"Default: full=true, minimal=false\"),\n includeModelUsage: z.boolean().optional().describe(\"Default: full=true, minimal=false\"),\n includeStructuredOutput: z\n .boolean()\n .optional()\n .describe(\"Default: full=true, minimal=false\"),\n includeTerminalEvents: z\n .boolean()\n .optional()\n .describe(\"Default: full=true, minimal=false\"),\n includeProgressEvents: z\n .boolean()\n .optional()\n .describe(\"Default: full=true, minimal=false\"),\n })\n .optional()\n .describe(\"Override responseMode defaults\"),\n\n permissionOptions: z\n .object({\n updatedInput: z\n .record(z.string(), z.unknown())\n .optional()\n .describe(\"Replace tool input on allow. Default: none\"),\n updatedPermissions: z\n .array(z.record(z.string(), z.unknown()))\n .optional()\n .describe(\"Update permission rules on allow. Default: none\"),\n })\n .optional()\n .describe(\"Allow-only: modify tool input or update rules\"),\n },\n async (args) => {\n const result = executeClaudeCodeCheck(args, sessionManager, toolCache);\n const isError = (result as { isError?: boolean }).isError === true;\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n isError,\n };\n }\n );\n\n // Cleanup on server close\n const originalClose = server.close.bind(server);\n server.close = async () => {\n sessionManager.destroy();\n await originalClose();\n };\n\n return server;\n}\n","/**\n * Session Manager - tracks and manages Claude Code agent sessions\n */\nimport type {\n EventBuffer,\n FinishFn,\n FinishSource,\n PermissionRequestRecord,\n PermissionResult,\n PublicSessionInfo,\n SensitiveSessionInfo,\n SessionInfo,\n PermissionMode,\n SessionEvent,\n SessionStatus,\n StoredAgentResult,\n} from \"../types.js\";\n\nconst DEFAULT_SESSION_TTL_MS = 30 * 60 * 1000; // 30 minutes idle timeout\nconst DEFAULT_RUNNING_SESSION_MAX_MS = 4 * 60 * 60 * 1000; // 4 hours max for running sessions\nconst DEFAULT_CLEANUP_INTERVAL_MS = 60_000;\n\nconst DEFAULT_EVENT_BUFFER_MAX_SIZE = 1000;\nconst DEFAULT_EVENT_BUFFER_HARD_MAX_SIZE = 2000;\n\ntype PendingPermission = {\n record: PermissionRequestRecord;\n finish: FinishFn;\n timeoutId?: ReturnType<typeof setTimeout>;\n};\n\ntype SessionRuntimeState = {\n buffer: EventBuffer;\n pendingPermissions: Map<string, PendingPermission>;\n storedResult?: StoredAgentResult;\n initTools?: string[];\n};\n\nexport class SessionManager {\n private sessions = new Map<string, SessionInfo>();\n private runtime = new Map<string, SessionRuntimeState>();\n private cleanupTimer: ReturnType<typeof setInterval>;\n private sessionTtlMs = DEFAULT_SESSION_TTL_MS;\n private runningSessionMaxMs = DEFAULT_RUNNING_SESSION_MAX_MS;\n\n constructor() {\n // Periodically clean up expired sessions\n this.cleanupTimer = setInterval(() => this.cleanup(), DEFAULT_CLEANUP_INTERVAL_MS);\n if (this.cleanupTimer.unref) {\n this.cleanupTimer.unref();\n }\n }\n\n create(params: {\n sessionId: string;\n cwd: string;\n model?: string;\n permissionMode?: PermissionMode;\n allowedTools?: SessionInfo[\"allowedTools\"];\n disallowedTools?: SessionInfo[\"disallowedTools\"];\n tools?: SessionInfo[\"tools\"];\n maxTurns?: SessionInfo[\"maxTurns\"];\n systemPrompt?: SessionInfo[\"systemPrompt\"];\n agents?: SessionInfo[\"agents\"];\n maxBudgetUsd?: SessionInfo[\"maxBudgetUsd\"];\n effort?: SessionInfo[\"effort\"];\n betas?: SessionInfo[\"betas\"];\n additionalDirectories?: SessionInfo[\"additionalDirectories\"];\n outputFormat?: SessionInfo[\"outputFormat\"];\n thinking?: SessionInfo[\"thinking\"];\n persistSession?: SessionInfo[\"persistSession\"];\n pathToClaudeCodeExecutable?: SessionInfo[\"pathToClaudeCodeExecutable\"];\n agent?: SessionInfo[\"agent\"];\n mcpServers?: SessionInfo[\"mcpServers\"];\n sandbox?: SessionInfo[\"sandbox\"];\n fallbackModel?: SessionInfo[\"fallbackModel\"];\n enableFileCheckpointing?: SessionInfo[\"enableFileCheckpointing\"];\n includePartialMessages?: SessionInfo[\"includePartialMessages\"];\n strictMcpConfig?: SessionInfo[\"strictMcpConfig\"];\n settingSources?: SessionInfo[\"settingSources\"];\n debug?: SessionInfo[\"debug\"];\n debugFile?: SessionInfo[\"debugFile\"];\n env?: SessionInfo[\"env\"];\n abortController?: AbortController;\n }): SessionInfo {\n const now = new Date().toISOString();\n const existing = this.sessions.get(params.sessionId);\n if (existing) {\n throw new Error(`Session '${params.sessionId}' already exists (status: ${existing.status})`);\n }\n const info: SessionInfo = {\n sessionId: params.sessionId,\n status: \"running\",\n createdAt: now,\n lastActiveAt: now,\n totalTurns: 0,\n totalCostUsd: 0,\n cwd: params.cwd,\n model: params.model,\n permissionMode: params.permissionMode ?? \"default\",\n allowedTools: params.allowedTools,\n disallowedTools: params.disallowedTools,\n tools: params.tools,\n maxTurns: params.maxTurns,\n systemPrompt: params.systemPrompt,\n agents: params.agents,\n maxBudgetUsd: params.maxBudgetUsd,\n effort: params.effort,\n betas: params.betas,\n additionalDirectories: params.additionalDirectories,\n outputFormat: params.outputFormat,\n thinking: params.thinking,\n persistSession: params.persistSession,\n pathToClaudeCodeExecutable: params.pathToClaudeCodeExecutable,\n agent: params.agent,\n mcpServers: params.mcpServers,\n sandbox: params.sandbox,\n fallbackModel: params.fallbackModel,\n enableFileCheckpointing: params.enableFileCheckpointing,\n includePartialMessages: params.includePartialMessages,\n strictMcpConfig: params.strictMcpConfig,\n settingSources: params.settingSources,\n debug: params.debug,\n debugFile: params.debugFile,\n env: params.env,\n abortController: params.abortController,\n };\n this.sessions.set(params.sessionId, info);\n this.runtime.set(params.sessionId, {\n buffer: {\n events: [],\n maxSize: DEFAULT_EVENT_BUFFER_MAX_SIZE,\n hardMaxSize: DEFAULT_EVENT_BUFFER_HARD_MAX_SIZE,\n nextId: 0,\n },\n pendingPermissions: new Map(),\n });\n return info;\n }\n\n get(sessionId: string): SessionInfo | undefined {\n return this.sessions.get(sessionId);\n }\n\n updateStatus(sessionId: string, status: SessionStatus): SessionInfo | undefined {\n return this.update(sessionId, { status });\n }\n\n list(): SessionInfo[] {\n return Array.from(this.sessions.values());\n }\n\n update(\n sessionId: string,\n patch: Partial<Omit<SessionInfo, \"sessionId\" | \"createdAt\" | \"lastActiveAt\">>\n ): SessionInfo | undefined {\n const info = this.sessions.get(sessionId);\n if (!info) return undefined;\n Object.assign(info, patch, { lastActiveAt: new Date().toISOString() });\n return info;\n }\n\n /**\n * Atomically transition a session from an expected status to \"running\".\n * Returns the session if successful, undefined if the session doesn't exist\n * or its current status doesn't match `expectedStatus`.\n */\n tryAcquire(\n sessionId: string,\n expectedStatus: SessionStatus,\n abortController: AbortController\n ): SessionInfo | undefined {\n if (expectedStatus !== \"idle\" && expectedStatus !== \"error\") return undefined;\n const info = this.sessions.get(sessionId);\n if (!info || info.status !== expectedStatus) return undefined;\n info.status = \"running\";\n info.abortController = abortController;\n info.lastActiveAt = new Date().toISOString();\n // M5 fix: clear stale result/error events at the idle/error → running\n // transition so the new run's event stream starts clean.\n this.clearTerminalEvents(sessionId);\n return info;\n }\n\n cancel(sessionId: string, opts?: { reason?: string; source?: string }): boolean {\n const info = this.sessions.get(sessionId);\n if (!info) return false;\n if (info.status !== \"running\" && info.status !== \"waiting_permission\") return false;\n\n if (info.status === \"waiting_permission\") {\n this.finishAllPending(\n sessionId,\n { behavior: \"deny\", message: \"Session cancelled\", interrupt: true },\n \"cancel\"\n );\n }\n if (info.abortController) {\n info.abortController.abort();\n }\n info.status = \"cancelled\";\n info.cancelledAt = new Date().toISOString();\n info.cancelledReason = opts?.reason ?? \"Session cancelled\";\n info.cancelledSource = opts?.source ?? \"cancel\";\n info.lastActiveAt = new Date().toISOString();\n return true;\n }\n\n delete(sessionId: string): boolean {\n this.finishAllPending(\n sessionId,\n { behavior: \"deny\", message: \"Session deleted\", interrupt: true },\n \"cleanup\"\n );\n this.runtime.delete(sessionId);\n return this.sessions.delete(sessionId);\n }\n\n setResult(sessionId: string, result: StoredAgentResult): void {\n const state = this.runtime.get(sessionId);\n if (!state) return;\n state.storedResult = result;\n }\n\n getResult(sessionId: string): StoredAgentResult | undefined {\n return this.runtime.get(sessionId)?.storedResult;\n }\n\n setInitTools(sessionId: string, tools: string[]): void {\n const state = this.runtime.get(sessionId);\n if (!state) return;\n state.initTools = tools;\n }\n\n getInitTools(sessionId: string): string[] | undefined {\n return this.runtime.get(sessionId)?.initTools;\n }\n\n pushEvent(\n sessionId: string,\n event: Omit<SessionEvent, \"id\" | \"pinned\"> & { pinned?: boolean }\n ): SessionEvent | undefined {\n const state = this.runtime.get(sessionId);\n if (!state) return undefined;\n const full = SessionManager.pushEvent(state.buffer, event, (requestId) =>\n state.pendingPermissions.has(requestId)\n );\n const info = this.sessions.get(sessionId);\n if (info) {\n info.lastActiveAt = new Date().toISOString();\n\n const data = event.data as Record<string, unknown> | null;\n const toolUseId =\n (typeof data?.tool_use_id === \"string\" && data.tool_use_id) ||\n (typeof data?.toolUseID === \"string\" && data.toolUseID) ||\n (typeof data?.parent_tool_use_id === \"string\" && data.parent_tool_use_id) ||\n undefined;\n if (toolUseId) info.lastToolUseId = toolUseId;\n }\n return full;\n }\n\n getLastEventId(sessionId: string): number | undefined {\n const state = this.runtime.get(sessionId);\n if (!state) return undefined;\n return state.buffer.nextId > 0 ? state.buffer.nextId - 1 : undefined;\n }\n\n readEvents(\n sessionId: string,\n cursor?: number\n ): {\n events: SessionEvent[];\n nextCursor: number;\n cursorResetTo?: number;\n } {\n const state = this.runtime.get(sessionId);\n if (!state) return { events: [], nextCursor: cursor ?? 0 };\n return SessionManager.readEvents(state.buffer, cursor);\n }\n\n clearTerminalEvents(sessionId: string): void {\n const state = this.runtime.get(sessionId);\n if (!state) return;\n SessionManager.clearTerminalEvents(state.buffer);\n }\n\n setPendingPermission(\n sessionId: string,\n req: PermissionRequestRecord,\n finish: FinishFn,\n timeoutMs: number\n ): boolean {\n const state = this.runtime.get(sessionId);\n const info = this.sessions.get(sessionId);\n if (!state || !info) return false;\n\n if (!state.pendingPermissions.has(req.requestId)) {\n const timeoutId = setTimeout(() => {\n this.finishRequest(\n sessionId,\n req.requestId,\n {\n behavior: \"deny\",\n message: `Permission request timed out after ${timeoutMs}ms.`,\n interrupt: false,\n },\n \"timeout\"\n );\n }, timeoutMs);\n\n state.pendingPermissions.set(req.requestId, { record: req, finish, timeoutId });\n info.status = \"waiting_permission\";\n info.lastActiveAt = new Date().toISOString();\n\n this.pushEvent(sessionId, {\n type: \"permission_request\",\n data: req,\n timestamp: new Date().toISOString(),\n });\n return true;\n }\n return false;\n }\n\n getPendingPermissionCount(sessionId: string): number {\n return this.runtime.get(sessionId)?.pendingPermissions.size ?? 0;\n }\n\n listPendingPermissions(sessionId: string): PermissionRequestRecord[] {\n const state = this.runtime.get(sessionId);\n if (!state) return [];\n return Array.from(state.pendingPermissions.values())\n .map((p) => p.record)\n .sort((a, b) => a.createdAt.localeCompare(b.createdAt));\n }\n\n finishRequest(\n sessionId: string,\n requestId: string,\n result: PermissionResult,\n source: FinishSource\n ): boolean {\n const state = this.runtime.get(sessionId);\n const info = this.sessions.get(sessionId);\n if (!state || !info) return false;\n\n const pending = state.pendingPermissions.get(requestId);\n if (!pending) return false;\n\n let finalResult = result;\n if (finalResult.behavior === \"allow\") {\n const disallowed = info.disallowedTools;\n if (\n Array.isArray(disallowed) &&\n disallowed.includes(pending.record.toolName) &&\n pending.record.toolName.trim() !== \"\"\n ) {\n finalResult = {\n behavior: \"deny\",\n message: `Tool '${pending.record.toolName}' is disallowed by session policy.`,\n interrupt: false,\n };\n }\n }\n\n if (pending.timeoutId) clearTimeout(pending.timeoutId);\n state.pendingPermissions.delete(requestId);\n\n this.pushEvent(sessionId, {\n type: \"permission_result\",\n data: { requestId, behavior: finalResult.behavior, source },\n timestamp: new Date().toISOString(),\n });\n\n try {\n pending.finish(finalResult);\n } catch {\n // ignore finish errors\n }\n\n if (info.status === \"waiting_permission\" && state.pendingPermissions.size === 0) {\n info.status = \"running\";\n info.lastActiveAt = new Date().toISOString();\n }\n\n return true;\n }\n\n finishAllPending(sessionId: string, result: PermissionResult, source: FinishSource): void {\n const state = this.runtime.get(sessionId);\n if (!state) return;\n for (const requestId of Array.from(state.pendingPermissions.keys())) {\n this.finishRequest(sessionId, requestId, result, source);\n }\n }\n\n /** Remove sessions that have been idle for too long, or stuck running too long */\n private cleanup(): void {\n const now = Date.now();\n for (const [id, info] of this.sessions) {\n const lastActive = new Date(info.lastActiveAt).getTime();\n if (Number.isNaN(lastActive)) {\n this.finishAllPending(\n id,\n { behavior: \"deny\", message: \"Session expired\", interrupt: true },\n \"cleanup\"\n );\n // Invalid timestamp — remove the session\n this.sessions.delete(id);\n this.runtime.delete(id);\n } else if (info.status === \"running\" && now - lastActive > this.runningSessionMaxMs) {\n // Stuck running session — abort and mark as error\n if (info.abortController) info.abortController.abort();\n info.status = \"error\";\n info.lastActiveAt = new Date().toISOString();\n } else if (\n info.status === \"waiting_permission\" &&\n now - lastActive > this.runningSessionMaxMs\n ) {\n this.finishAllPending(\n id,\n { behavior: \"deny\", message: \"Session timed out\", interrupt: true },\n \"cleanup\"\n );\n if (info.abortController) info.abortController.abort();\n info.status = \"error\";\n info.lastActiveAt = new Date().toISOString();\n } else if (\n info.status !== \"running\" &&\n info.status !== \"waiting_permission\" &&\n now - lastActive > this.sessionTtlMs\n ) {\n this.finishAllPending(\n id,\n { behavior: \"deny\", message: \"Session expired\", interrupt: true },\n \"cleanup\"\n );\n this.sessions.delete(id);\n this.runtime.delete(id);\n }\n }\n }\n\n /**\n * Serialize session info for external consumption.\n * Prefer explicit serializers below. This method is kept for backward compatibility\n * but returns the redacted public shape.\n */\n toJSON(info: SessionInfo): PublicSessionInfo {\n return this.toPublicJSON(info);\n }\n\n /** Serialize session info when includeSensitive=true (still excludes secrets like env) */\n toSensitiveJSON(info: SessionInfo): SensitiveSessionInfo {\n const base = this.toPublicJSON(info);\n return {\n ...base,\n cwd: info.cwd,\n systemPrompt: info.systemPrompt,\n agents: info.agents,\n additionalDirectories: info.additionalDirectories,\n };\n }\n\n /** Serialize session info for listing/inspection (redacts sensitive fields) */\n toPublicJSON(info: SessionInfo): PublicSessionInfo {\n /* eslint-disable @typescript-eslint/no-unused-vars */\n const {\n abortController: _abortController,\n cwd: _cwd,\n systemPrompt: _systemPrompt,\n agents: _agents,\n additionalDirectories: _additionalDirectories,\n pathToClaudeCodeExecutable: _pathToClaudeCodeExecutable,\n mcpServers: _mcpServers,\n sandbox: _sandbox,\n settingSources: _settingSources,\n debugFile: _debugFile,\n env: _env,\n ...rest\n } = info;\n /* eslint-enable @typescript-eslint/no-unused-vars */\n return rest;\n }\n\n destroy(): void {\n clearInterval(this.cleanupTimer);\n for (const info of this.sessions.values()) {\n this.finishAllPending(\n info.sessionId,\n { behavior: \"deny\", message: \"Server shutting down\", interrupt: true },\n \"destroy\"\n );\n // M6 fix: explicitly abort any session that has an active consumer,\n // regardless of whether it is \"running\" or \"waiting_permission\".\n if (\n (info.status === \"running\" || info.status === \"waiting_permission\") &&\n info.abortController\n ) {\n info.abortController.abort();\n }\n info.status = \"cancelled\";\n info.cancelledAt = info.cancelledAt ?? new Date().toISOString();\n info.cancelledReason = info.cancelledReason ?? \"Server shutting down\";\n info.cancelledSource = info.cancelledSource ?? \"destroy\";\n info.lastActiveAt = new Date().toISOString();\n }\n // Don't clear immediately — in-flight operations may still reference sessions.\n // Sessions will be garbage-collected when the process exits.\n }\n\n private static pushEvent(\n buffer: EventBuffer,\n event: Omit<SessionEvent, \"id\" | \"pinned\"> & { pinned?: boolean },\n isActivePermissionRequest?: (requestId: string) => boolean\n ): SessionEvent {\n const pinned =\n event.pinned ??\n (event.type === \"permission_request\" ||\n event.type === \"permission_result\" ||\n event.type === \"result\" ||\n event.type === \"error\");\n\n const full: SessionEvent = {\n id: buffer.nextId++,\n type: event.type,\n data: event.data,\n timestamp: event.timestamp,\n pinned,\n };\n\n buffer.events.push(full);\n\n while (buffer.events.length > buffer.maxSize) {\n const idx = buffer.events.findIndex((e) => !e.pinned);\n if (idx !== -1) {\n buffer.events.splice(idx, 1);\n continue;\n }\n\n // If everything is pinned, prefer dropping old permission-related events first.\n const pinnedDropIdx = buffer.events.findIndex((e) => {\n if (e.type === \"permission_result\") return true;\n if (e.type === \"permission_request\") {\n const requestId = (e.data as { requestId?: unknown } | null)?.requestId;\n if (typeof requestId !== \"string\") return true;\n return isActivePermissionRequest ? !isActivePermissionRequest(requestId) : true;\n }\n return false;\n });\n if (pinnedDropIdx === -1) break;\n buffer.events.splice(pinnedDropIdx, 1);\n }\n\n while (buffer.events.length > buffer.hardMaxSize) {\n const idx = buffer.events.findIndex((e) => {\n if (e.type === \"permission_request\") {\n const requestId = (e.data as { requestId?: unknown } | null)?.requestId;\n if (typeof requestId !== \"string\") return true;\n return isActivePermissionRequest ? !isActivePermissionRequest(requestId) : true;\n }\n if (e.type === \"permission_result\") return true;\n return false;\n });\n if (idx === -1) break;\n buffer.events.splice(idx, 1);\n }\n\n return full;\n }\n\n private static readEvents(\n buffer: EventBuffer,\n cursor?: number\n ): { events: SessionEvent[]; nextCursor: number; cursorResetTo?: number } {\n let cursorResetTo: number | undefined;\n if (cursor != null) {\n const earliest = buffer.events[0]?.id;\n if (earliest != null && earliest > cursor) cursorResetTo = earliest;\n if (earliest == null && buffer.nextId > cursor) cursorResetTo = buffer.nextId;\n }\n\n const startFrom = cursorResetTo ?? cursor ?? 0;\n const filtered = buffer.events.filter((e) => e.id >= startFrom);\n const nextCursor = filtered.length > 0 ? filtered[filtered.length - 1].id + 1 : startFrom;\n\n return { events: filtered, nextCursor, cursorResetTo };\n }\n\n private static clearTerminalEvents(buffer: EventBuffer): void {\n buffer.events = buffer.events.filter((e) => e.type !== \"result\" && e.type !== \"error\");\n }\n}\n","/**\n * Type definitions for claude-code-mcp\n *\n * Shared constants are defined as tuples so both Zod schemas and\n * TypeScript types can derive from the same source of truth.\n */\n\nimport type {\n PermissionResult as SDKPermissionResult,\n PermissionUpdate as SDKPermissionUpdate,\n} from \"@anthropic-ai/claude-agent-sdk\";\n\n/** Permission modes supported by Claude Agent SDK */\nexport const PERMISSION_MODES = [\"default\", \"acceptEdits\", \"plan\", \"delegate\", \"dontAsk\"] as const;\nexport type PermissionMode = (typeof PERMISSION_MODES)[number];\n\n/** Effort levels */\nexport const EFFORT_LEVELS = [\"low\", \"medium\", \"high\", \"max\"] as const;\nexport type EffortLevel = (typeof EFFORT_LEVELS)[number];\n\n/** Subagent model options */\nexport const AGENT_MODELS = [\"sonnet\", \"opus\", \"haiku\", \"inherit\"] as const;\nexport type AgentModel = (typeof AGENT_MODELS)[number];\n\n/** Session management actions */\nexport const SESSION_ACTIONS = [\"list\", \"get\", \"cancel\"] as const;\nexport type SessionAction = (typeof SESSION_ACTIONS)[number];\n\n/** Session status */\nexport type SessionStatus = \"idle\" | \"running\" | \"waiting_permission\" | \"cancelled\" | \"error\";\n\nexport type SystemPrompt = string | { type: \"preset\"; preset: \"claude_code\"; append?: string };\n\nexport type OutputFormat = { type: \"json_schema\"; schema: Record<string, unknown> };\n\nexport type ThinkingConfig =\n | { type: \"adaptive\" }\n | { type: \"enabled\"; budgetTokens: number }\n | { type: \"disabled\" };\n\nexport type ToolsConfig = string[] | { type: \"preset\"; preset: \"claude_code\" };\n\n/** Subagent definition (mirrors the Zod schema in server.ts) */\nexport interface AgentDefinition {\n description: string;\n prompt: string;\n tools?: string[];\n disallowedTools?: string[];\n model?: AgentModel;\n maxTurns?: number;\n mcpServers?: (string | Record<string, unknown>)[];\n skills?: string[];\n criticalSystemReminder_EXPERIMENTAL?: string;\n}\n\n/** MCP server configuration for the SDK */\nexport type McpServerConfig = Record<string, unknown>;\n\n/** Sandbox configuration for isolating shell command execution */\nexport type SandboxSettings = Record<string, unknown>;\n\n/** Setting source for controlling which filesystem settings are loaded */\nexport type SettingSource = \"user\" | \"project\" | \"local\";\n\n/** Default setting sources — load all filesystem settings for ease of use */\nexport const DEFAULT_SETTING_SOURCES: SettingSource[] = [\"user\", \"project\", \"local\"];\n\n/** Session metadata stored by the session manager */\nexport interface SessionInfo {\n sessionId: string;\n status: SessionStatus;\n createdAt: string;\n lastActiveAt: string;\n cancelledAt?: string;\n cancelledReason?: string;\n cancelledSource?: string;\n totalTurns: number;\n totalCostUsd: number;\n cwd: string;\n model?: string;\n pathToClaudeCodeExecutable?: string;\n permissionMode: PermissionMode;\n allowedTools?: string[];\n disallowedTools?: string[];\n tools?: ToolsConfig;\n maxTurns?: number;\n systemPrompt?: SystemPrompt;\n agents?: Record<string, AgentDefinition>;\n maxBudgetUsd?: number;\n effort?: EffortLevel;\n betas?: string[];\n additionalDirectories?: string[];\n outputFormat?: OutputFormat;\n thinking?: ThinkingConfig;\n persistSession?: boolean;\n /** Primary agent name (from 'agents' definitions) */\n agent?: string;\n /** MCP server configurations (key: server name, value: server config) */\n mcpServers?: Record<string, McpServerConfig>;\n /** Sandbox configuration for isolating shell command execution */\n sandbox?: SandboxSettings;\n /** Fallback model if the primary model fails or is unavailable */\n fallbackModel?: string;\n /** Enable file checkpointing to track file changes */\n enableFileCheckpointing?: boolean;\n /** When true, includes intermediate streaming messages in the response */\n includePartialMessages?: boolean;\n /** Enforce strict validation of MCP server configurations */\n strictMcpConfig?: boolean;\n /** Control which filesystem settings are loaded */\n settingSources?: SettingSource[];\n /** Enable debug mode */\n debug?: boolean;\n /** Write debug logs to a specific file path */\n debugFile?: string;\n /** Environment variables passed to the Claude Code process */\n env?: Record<string, string | undefined>;\n /** Last seen tool use id (best-effort) */\n lastToolUseId?: string;\n abortController?: AbortController;\n}\n\n/** Session metadata safe to return by default (redacts paths and prompts) */\nexport interface PublicSessionInfo {\n sessionId: string;\n status: SessionStatus;\n createdAt: string;\n lastActiveAt: string;\n cancelledAt?: string;\n cancelledReason?: string;\n cancelledSource?: string;\n totalTurns: number;\n totalCostUsd: number;\n model?: string;\n permissionMode: PermissionMode;\n allowedTools?: string[];\n disallowedTools?: string[];\n tools?: ToolsConfig;\n maxTurns?: number;\n maxBudgetUsd?: number;\n effort?: EffortLevel;\n betas?: string[];\n outputFormat?: OutputFormat;\n thinking?: ThinkingConfig;\n persistSession?: boolean;\n agent?: string;\n fallbackModel?: string;\n enableFileCheckpointing?: boolean;\n includePartialMessages?: boolean;\n strictMcpConfig?: boolean;\n debug?: boolean;\n lastToolUseId?: string;\n}\n\n/** Session metadata returned when includeSensitive=true (still excludes secrets like env) */\nexport interface SensitiveSessionInfo extends PublicSessionInfo {\n cwd: string;\n systemPrompt?: SystemPrompt;\n agents?: Record<string, AgentDefinition>;\n additionalDirectories?: string[];\n}\n\n/** Result returned from a claude_code or claude_code_reply call */\nexport interface AgentResult {\n sessionId: string;\n result: string;\n isError: boolean;\n durationMs: number;\n durationApiMs?: number;\n numTurns: number;\n totalCostUsd: number;\n sessionTotalTurns?: number;\n sessionTotalCostUsd?: number;\n structuredOutput?: unknown;\n stopReason?: string | null;\n errorSubtype?: string;\n usage?: Record<string, unknown>;\n modelUsage?: Record<string, unknown>;\n permissionDenials?: Array<{\n tool_name: string;\n tool_use_id: string;\n tool_input: Record<string, unknown>;\n }>;\n}\n\nexport const CHECK_ACTIONS = [\"poll\", \"respond_permission\"] as const;\nexport type CheckAction = (typeof CHECK_ACTIONS)[number];\n\nexport const CHECK_RESPONSE_MODES = [\"minimal\", \"full\"] as const;\nexport type CheckResponseMode = (typeof CHECK_RESPONSE_MODES)[number];\n\nexport type PermissionDecision = \"allow\" | \"deny\";\n\n/**\n * Permission updates suggested by the SDK (shape is SDK-defined and may evolve).\n * We treat it as opaque JSON and forward it to callers.\n */\nexport type PermissionUpdate = SDKPermissionUpdate;\nexport type PermissionResult = SDKPermissionResult;\n\nexport interface ToolInfo {\n name: string;\n description: string;\n category?: string;\n}\n\nexport type SessionEventType =\n | \"output\"\n | \"progress\"\n | \"permission_request\"\n | \"permission_result\"\n | \"result\"\n | \"error\";\n\nexport interface SessionEvent {\n id: number;\n type: SessionEventType;\n data: unknown;\n timestamp: string;\n pinned: boolean;\n}\n\nexport interface EventBuffer {\n events: SessionEvent[];\n maxSize: number;\n hardMaxSize: number;\n nextId: number;\n}\n\nexport interface PermissionRequestRecord {\n requestId: string;\n toolName: string;\n input: Record<string, unknown>;\n summary: string;\n decisionReason?: string;\n blockedPath?: string;\n toolUseID: string;\n agentID?: string;\n suggestions?: PermissionUpdate[];\n description?: string;\n createdAt: string;\n}\n\nexport type FinishFn = (result: PermissionResult) => void;\n\nexport type FinishSource = \"respond\" | \"timeout\" | \"cancel\" | \"cleanup\" | \"destroy\" | \"signal\";\n\nexport interface SessionStartResult {\n sessionId: string;\n status: \"running\";\n pollInterval: number;\n resumeToken?: string;\n}\n\nexport type StoredAgentResult =\n | { type: \"result\"; result: AgentResult; createdAt: string }\n | { type: \"error\"; result: AgentResult; createdAt: string };\n\nexport interface CheckResult {\n sessionId: string;\n status: SessionStatus;\n pollInterval?: number;\n cursorResetTo?: number;\n truncated?: boolean;\n truncatedFields?: string[];\n events: Array<{\n id: number;\n type: SessionEventType;\n data: unknown;\n timestamp: string;\n }>;\n nextCursor?: number;\n availableTools?: ToolInfo[];\n actions?: Array<{\n type: \"permission\";\n requestId: string;\n toolName: string;\n input: Record<string, unknown>;\n summary: string;\n decisionReason?: string;\n blockedPath?: string;\n toolUseID: string;\n agentID?: string;\n suggestions?: PermissionUpdate[];\n description?: string;\n createdAt: string;\n }>;\n result?: AgentResult;\n cancelledAt?: string;\n cancelledReason?: string;\n cancelledSource?: string;\n lastEventId?: number;\n lastToolUseId?: string;\n}\n\n/** Error codes for structured error responses */\nexport enum ErrorCode {\n INVALID_ARGUMENT = \"INVALID_ARGUMENT\",\n SESSION_NOT_FOUND = \"SESSION_NOT_FOUND\",\n SESSION_BUSY = \"SESSION_BUSY\",\n PERMISSION_REQUEST_NOT_FOUND = \"PERMISSION_REQUEST_NOT_FOUND\",\n PERMISSION_DENIED = \"PERMISSION_DENIED\",\n TIMEOUT = \"TIMEOUT\",\n CANCELLED = \"CANCELLED\",\n INTERNAL = \"INTERNAL\",\n}\n","import { AbortError, query } from \"@anthropic-ai/claude-agent-sdk\";\nimport type {\n CanUseTool,\n Options,\n SDKMessage,\n SDKResultMessage,\n SDKSystemMessage,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport type { SessionManager } from \"../session/manager.js\";\nimport type {\n AgentResult,\n PermissionRequestRecord,\n PermissionResult,\n StoredAgentResult,\n} from \"../types.js\";\nimport { ErrorCode } from \"../types.js\";\nimport { enhanceWindowsError } from \"../utils/windows.js\";\nimport type { ToolDiscoveryCache } from \"./tool-discovery.js\";\n\nexport type ConsumeQueryMode = \"start\" | \"resume\" | \"disk-resume\";\n\n// --- C1: Error classification and retry constants ---\n\nconst MAX_TRANSIENT_RETRIES = 3;\nconst INITIAL_RETRY_DELAY_MS = 1000;\n\nexport type ErrorClass = \"abort\" | \"transient\" | \"fatal\";\n\nexport function classifyError(err: unknown, abortSignal: AbortSignal): ErrorClass {\n if (abortSignal.aborted) return \"abort\";\n if (err instanceof AbortError || (err instanceof Error && err.name === \"AbortError\")) {\n return \"abort\";\n }\n if (\n err instanceof Error &&\n (err.message.includes(\"ECONNRESET\") ||\n err.message.includes(\"ETIMEDOUT\") ||\n err.message.includes(\"ECONNREFUSED\") ||\n err.message.includes(\"ENOTFOUND\") ||\n err.message.includes(\"EAI_AGAIN\") ||\n err.message.includes(\"EPIPE\") ||\n err.message.includes(\"stream ended unexpectedly\") ||\n err.message.includes(\"socket hang up\"))\n ) {\n return \"transient\";\n }\n return \"fatal\";\n}\n\ntype QueryLike = AsyncIterable<SDKMessage> & { close?: () => void; interrupt?: () => void };\n\nexport type ConsumeQueryParams =\n | {\n mode: \"start\";\n prompt: string;\n abortController: AbortController;\n options: Partial<Options>;\n permissionRequestTimeoutMs: number;\n sessionInitTimeoutMs: number;\n sessionManager: SessionManager;\n toolCache?: ToolDiscoveryCache;\n onInit?: (init: SDKSystemMessage) => void;\n }\n | {\n mode: \"resume\" | \"disk-resume\";\n sessionId: string;\n prompt: string;\n abortController: AbortController;\n options: Partial<Options>;\n permissionRequestTimeoutMs: number;\n sessionInitTimeoutMs: number;\n waitForInitSessionId?: boolean;\n sessionManager: SessionManager;\n toolCache?: ToolDiscoveryCache;\n onInit?: (init: SDKSystemMessage) => void;\n };\n\nexport type ConsumeQueryHandle = {\n sdkSessionIdPromise: Promise<string>;\n done: Promise<void>;\n close: () => void;\n interrupt: () => void;\n};\n\nfunction isSystemInitMessage(msg: SDKMessage): msg is SDKSystemMessage {\n return msg.type === \"system\" && msg.subtype === \"init\";\n}\n\nfunction summarizePermission(toolName: string, input: Record<string, unknown>): string {\n const keys = Object.keys(input ?? {}).slice(0, 5);\n const suffix = keys.length > 0 ? ` (keys: ${keys.join(\", \")})` : \"\";\n return `${toolName} permission request${suffix}`;\n}\n\nfunction describeTool(toolName: string, toolCache?: ToolDiscoveryCache): string | undefined {\n const tools = toolCache?.getTools();\n const found = tools?.find((t) => t.name === toolName);\n return found?.description;\n}\n\nfunction sdkResultToAgentResult(result: SDKResultMessage): AgentResult {\n const base = {\n sessionId: result.session_id,\n durationMs: result.duration_ms,\n durationApiMs: result.duration_api_ms,\n numTurns: result.num_turns,\n totalCostUsd: result.total_cost_usd,\n stopReason: result.stop_reason,\n usage: result.usage,\n modelUsage: result.modelUsage,\n permissionDenials: result.permission_denials,\n };\n\n if (result.subtype === \"success\") {\n return {\n ...base,\n result: result.result,\n structuredOutput: result.structured_output,\n isError: false,\n };\n }\n\n const errors =\n Array.isArray(result.errors) && result.errors.length > 0\n ? result.errors.map(String).join(\"\\n\")\n : `Error [${result.subtype}]: Unknown error`;\n\n return {\n ...base,\n result: errors,\n isError: true,\n errorSubtype: result.subtype,\n };\n}\n\nfunction errorToAgentResult(sessionId: string, err: unknown): AgentResult {\n const message =\n err instanceof Error ? enhanceWindowsError(err.message) : enhanceWindowsError(String(err));\n return {\n sessionId,\n result: `Error [${ErrorCode.INTERNAL}]: ${message}`,\n isError: true,\n durationMs: 0,\n numTurns: 0,\n totalCostUsd: 0,\n };\n}\n\nfunction messageToEvent(msg: SDKMessage): { type: \"output\" | \"progress\"; data: unknown } | null {\n if (msg.type === \"assistant\") {\n return {\n type: \"output\",\n data: {\n type: \"assistant\",\n message: msg.message,\n parent_tool_use_id: msg.parent_tool_use_id,\n error: msg.error,\n },\n };\n }\n\n if (msg.type === \"tool_use_summary\") {\n return { type: \"progress\", data: { type: \"tool_use_summary\", summary: msg.summary } };\n }\n\n if (msg.type === \"tool_progress\") {\n return {\n type: \"progress\",\n data: {\n type: \"tool_progress\",\n tool_use_id: msg.tool_use_id,\n tool_name: msg.tool_name,\n elapsed_time_seconds: msg.elapsed_time_seconds,\n },\n };\n }\n\n if (msg.type === \"auth_status\") {\n return {\n type: \"progress\",\n data: {\n type: \"auth_status\",\n isAuthenticating: msg.isAuthenticating,\n output: msg.output,\n error: msg.error,\n },\n };\n }\n\n if (msg.type === \"system\" && msg.subtype === \"status\") {\n return {\n type: \"progress\",\n data: { type: \"status\", status: msg.status, permissionMode: msg.permissionMode },\n };\n }\n\n if (msg.type === \"system\" && msg.subtype === \"task_notification\") {\n return {\n type: \"progress\",\n data: {\n type: \"task_notification\",\n task_id: msg.task_id,\n status: msg.status,\n summary: msg.summary,\n output_file: msg.output_file,\n },\n };\n }\n\n return null;\n}\n\nexport function consumeQuery(params: ConsumeQueryParams): ConsumeQueryHandle {\n let resolveSessionId!: (id: string) => void;\n let rejectSessionId!: (err: Error) => void;\n const sdkSessionIdPromise = new Promise<string>((resolve, reject) => {\n resolveSessionId = resolve;\n rejectSessionId = reject;\n });\n const waitForInitSessionId =\n params.mode !== \"start\" ? (params.waitForInitSessionId ?? false) : false;\n const shouldWaitForInit = params.mode === \"start\" || waitForInitSessionId;\n\n let sessionIdResolved = false;\n let activeSessionId = \"\";\n if (params.mode !== \"start\" && !waitForInitSessionId) {\n sessionIdResolved = true;\n activeSessionId = params.sessionId;\n resolveSessionId(activeSessionId);\n }\n\n const getSessionId = async (): Promise<string> => {\n if (activeSessionId) return activeSessionId;\n activeSessionId = await sdkSessionIdPromise;\n return activeSessionId;\n };\n\n let initTimeoutId: ReturnType<typeof setTimeout> | undefined;\n\n const canUseTool: CanUseTool = async (toolName, input, options) => {\n const sessionId = await getSessionId();\n\n // Keep MCP permission behavior consistent with the SDK options semantics:\n // - disallowedTools: hard deny\n // - allowedTools: auto-allow (but still prompt if the SDK provides a blockedPath)\n // Note: we still pass allowedTools/disallowedTools to the SDK via options; this is a\n // defensive fast-path in case the SDK calls canUseTool for all tool uses.\n const sessionInfo = params.sessionManager.get(sessionId);\n if (sessionInfo) {\n if (\n Array.isArray(sessionInfo.disallowedTools) &&\n sessionInfo.disallowedTools.includes(toolName)\n ) {\n return { behavior: \"deny\", message: `Tool '${toolName}' is disallowed by session policy.` };\n }\n\n if (\n !options.blockedPath &&\n Array.isArray(sessionInfo.allowedTools) &&\n sessionInfo.allowedTools.includes(toolName)\n ) {\n return { behavior: \"allow\" };\n }\n }\n\n const requestId = `${options.toolUseID}:${toolName}:${Date.now()}:${Math.random()\n .toString(16)\n .slice(2)}`;\n const record: PermissionRequestRecord = {\n requestId,\n toolName,\n input,\n summary: summarizePermission(toolName, input),\n description: describeTool(toolName, params.toolCache),\n decisionReason: options.decisionReason,\n blockedPath: options.blockedPath,\n toolUseID: options.toolUseID,\n agentID: options.agentID,\n suggestions: options.suggestions,\n createdAt: new Date().toISOString(),\n };\n\n return await new Promise<PermissionResult>((resolve) => {\n let finished = false;\n const abortListener = () => {\n params.sessionManager.finishRequest(\n sessionId,\n requestId,\n { behavior: \"deny\", message: \"Session cancelled\", interrupt: true },\n \"signal\"\n );\n };\n const finish: (result: PermissionResult) => void = (result) => {\n if (finished) return;\n finished = true;\n options.signal.removeEventListener(\"abort\", abortListener);\n resolve(result);\n };\n\n const registered = params.sessionManager.setPendingPermission(\n sessionId,\n record,\n finish,\n params.permissionRequestTimeoutMs\n );\n\n // If the session was deleted/missing, resolve immediately with deny\n // to prevent the Promise from hanging forever.\n if (!registered) {\n finish({ behavior: \"deny\", message: \"Session no longer exists.\", interrupt: true });\n return;\n }\n\n options.signal.addEventListener(\"abort\", abortListener, { once: true });\n\n // M1 fix: if the signal was already aborted before we registered the\n // listener, the \"abort\" event won't fire. Check synchronously so the\n // Promise resolves immediately instead of waiting for the timeout.\n if (options.signal.aborted) {\n abortListener();\n }\n });\n };\n\n const options: Partial<Options> = {\n ...params.options,\n abortController: params.abortController,\n permissionMode: \"default\",\n canUseTool,\n };\n\n const startQuery = (opts: Partial<Options>): QueryLike =>\n query({\n prompt: params.prompt,\n options: opts,\n }) as unknown as QueryLike;\n\n if (params.mode === \"resume\" || params.mode === \"disk-resume\") {\n options.resume = params.sessionId;\n }\n\n let activeQuery: QueryLike = startQuery(options);\n\n const close = (): void => {\n try {\n activeQuery.close?.();\n } finally {\n params.abortController.abort();\n }\n };\n\n const interrupt = (): void => {\n activeQuery.interrupt?.();\n };\n\n const done = (async (): Promise<void> => {\n const preInit: SDKMessage[] = [];\n\n if (shouldWaitForInit) {\n initTimeoutId = setTimeout(() => {\n close();\n rejectSessionId(\n new Error(\n `Error [${ErrorCode.TIMEOUT}]: session init timed out after ${params.sessionInitTimeoutMs}ms.`\n )\n );\n }, params.sessionInitTimeoutMs);\n }\n\n let retryCount = 0;\n let currentStream: QueryLike = activeQuery;\n\n // Outer loop: retries on transient errors (C1 fix)\n while (true) {\n try {\n for await (const message of currentStream) {\n if (isSystemInitMessage(message)) {\n params.toolCache?.updateFromInit(message.tools);\n params.onInit?.(message);\n params.sessionManager.setInitTools(message.session_id, message.tools);\n\n activeSessionId = message.session_id;\n if (!sessionIdResolved && shouldWaitForInit) {\n sessionIdResolved = true;\n resolveSessionId(activeSessionId);\n if (initTimeoutId) clearTimeout(initTimeoutId);\n\n for (const buffered of preInit) {\n const event = messageToEvent(buffered);\n if (!event) continue;\n params.sessionManager.pushEvent(activeSessionId, {\n type: event.type,\n data: event.data,\n timestamp: new Date().toISOString(),\n });\n }\n preInit.length = 0;\n }\n\n continue;\n }\n\n if (shouldWaitForInit && !sessionIdResolved) {\n preInit.push(message);\n continue;\n }\n\n if (message.type === \"result\") {\n const sessionId = message.session_id ?? (await getSessionId());\n const agentResult = sdkResultToAgentResult(message);\n const stored: StoredAgentResult = {\n type: agentResult.isError ? \"error\" : \"result\",\n result: agentResult,\n createdAt: new Date().toISOString(),\n };\n params.sessionManager.setResult(sessionId, stored);\n\n // Keep only the most recent terminal event (sessions can have multiple replies).\n params.sessionManager.clearTerminalEvents(sessionId);\n params.sessionManager.pushEvent(sessionId, {\n type: agentResult.isError ? \"error\" : \"result\",\n data: agentResult,\n timestamp: new Date().toISOString(),\n });\n\n const current = params.sessionManager.get(sessionId);\n if (current && current.status !== \"cancelled\") {\n params.sessionManager.update(sessionId, {\n status: agentResult.isError ? \"error\" : \"idle\",\n totalTurns: agentResult.numTurns,\n totalCostUsd: agentResult.totalCostUsd,\n abortController: undefined,\n });\n } else if (current) {\n params.sessionManager.update(sessionId, {\n totalTurns: agentResult.numTurns,\n totalCostUsd: agentResult.totalCostUsd,\n abortController: undefined,\n });\n }\n\n return;\n }\n\n const sessionId = message.session_id ?? (await getSessionId());\n const event = messageToEvent(message);\n if (event) {\n params.sessionManager.pushEvent(sessionId, {\n type: event.type,\n data: event.data,\n timestamp: new Date().toISOString(),\n });\n }\n }\n\n // Stream ended normally without a result message\n if (shouldWaitForInit && !sessionIdResolved) {\n rejectSessionId(\n new Error(\n `Error [${ErrorCode.INTERNAL}]: query stream ended before receiving session init.`\n )\n );\n } else if (activeSessionId) {\n const sessionId = activeSessionId;\n const current = params.sessionManager.get(sessionId);\n if (current && current.status !== \"cancelled\") {\n params.sessionManager.finishAllPending(\n sessionId,\n {\n behavior: \"deny\",\n message: \"Session ended before permission was resolved.\",\n interrupt: true,\n },\n \"cleanup\"\n );\n const agentResult = errorToAgentResult(\n sessionId,\n \"No result message received from agent.\"\n );\n const stored: StoredAgentResult = {\n type: \"error\",\n result: agentResult,\n createdAt: new Date().toISOString(),\n };\n params.sessionManager.setResult(sessionId, stored);\n params.sessionManager.clearTerminalEvents(sessionId);\n params.sessionManager.pushEvent(sessionId, {\n type: \"error\",\n data: agentResult,\n timestamp: new Date().toISOString(),\n });\n params.sessionManager.update(sessionId, {\n status: \"error\",\n abortController: undefined,\n });\n }\n }\n return; // normal exit\n } catch (err: unknown) {\n const errClass = classifyError(err, params.abortController.signal);\n\n // Before init: no session to retry, just reject and bail.\n if (shouldWaitForInit && !sessionIdResolved) {\n rejectSessionId(\n new Error(\n errClass === \"abort\"\n ? `Error [${ErrorCode.CANCELLED}]: session was cancelled before init.`\n : `Error [${ErrorCode.INTERNAL}]: ${enhanceWindowsError(err instanceof Error ? err.message : String(err))}`\n )\n );\n return;\n }\n\n if (!activeSessionId) return;\n const sessionId = activeSessionId;\n\n // C1: transient errors → resume retry with exponential backoff\n if (errClass === \"transient\" && retryCount < MAX_TRANSIENT_RETRIES) {\n retryCount++;\n const delay = INITIAL_RETRY_DELAY_MS * Math.pow(2, retryCount - 1);\n params.sessionManager.pushEvent(sessionId, {\n type: \"progress\",\n data: {\n type: \"retry\",\n attempt: retryCount,\n maxRetries: MAX_TRANSIENT_RETRIES,\n delayMs: delay,\n error: err instanceof Error ? err.message : String(err),\n },\n timestamp: new Date().toISOString(),\n });\n await new Promise<void>((r) => {\n const timer = setTimeout(r, delay);\n const onAbort = () => {\n clearTimeout(timer);\n r();\n };\n params.abortController.signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n if (params.abortController.signal.aborted) return;\n\n // Rebuild query with resume to continue from where we left off.\n // Pending permissions are lost; SDK will re-issue canUseTool calls.\n params.sessionManager.finishAllPending(\n sessionId,\n { behavior: \"deny\", message: \"Retrying after transient error.\", interrupt: false },\n \"cleanup\"\n );\n const retryOpts: Partial<Options> = {\n ...options,\n resume: sessionId,\n };\n currentStream = startQuery(retryOpts);\n activeQuery = currentStream;\n continue; // retry the while loop\n }\n\n // abort or fatal: record error and stop\n const current = params.sessionManager.get(sessionId);\n if (current && current.status !== \"cancelled\") {\n params.sessionManager.finishAllPending(\n sessionId,\n {\n behavior: \"deny\",\n message: \"Session failed before permission was resolved.\",\n interrupt: true,\n },\n \"cleanup\"\n );\n const agentResult =\n errClass === \"abort\"\n ? {\n sessionId,\n result: `Error [${ErrorCode.CANCELLED}]: Session was cancelled.`,\n isError: true,\n durationMs: 0,\n numTurns: 0,\n totalCostUsd: 0,\n }\n : errorToAgentResult(sessionId, err);\n\n params.sessionManager.setResult(sessionId, {\n type: \"error\",\n result: agentResult,\n createdAt: new Date().toISOString(),\n });\n\n params.sessionManager.clearTerminalEvents(sessionId);\n params.sessionManager.pushEvent(sessionId, {\n type: \"error\",\n data: agentResult,\n timestamp: new Date().toISOString(),\n });\n\n params.sessionManager.update(sessionId, { status: \"error\", abortController: undefined });\n }\n return; // fatal/abort exit\n } finally {\n if (initTimeoutId) clearTimeout(initTimeoutId);\n }\n }\n })();\n\n return { sdkSessionIdPromise, done, close, interrupt };\n}\n","/**\n * Windows-specific utilities for Git Bash detection\n */\nimport { existsSync } from \"node:fs\";\nimport { execSync } from \"node:child_process\";\nimport path from \"node:path\";\n\n// Always use win32 path semantics in this module so that the logic works\n// correctly even when the test-suite runs on a non-Windows CI host.\nconst { join, dirname, normalize } = path.win32;\n\nexport function isWindows(): boolean {\n return process.platform === \"win32\";\n}\n\n/**\n * Attempt to locate bash.exe on Windows using the same logic as the Claude CLI:\n * 1. Check CLAUDE_CODE_GIT_BASH_PATH env var\n * 2. Find `git` in PATH and derive bash.exe from it\n *\n * Returns the resolved path, or null if not found.\n */\nexport function findGitBash(): string | null {\n const envPathRaw = process.env.CLAUDE_CODE_GIT_BASH_PATH;\n if (envPathRaw && envPathRaw.trim() !== \"\") {\n // Users sometimes include quotes in JSON/env config.\n const envPath = normalize(envPathRaw.trim().replace(/^\"|\"$/g, \"\"));\n if (existsSync(envPath)) return envPath;\n return null; // env var set but path doesn't exist\n }\n\n try {\n const output = execSync(\"where git\", { encoding: \"utf8\" });\n const gitCandidates = output\n .split(/\\r?\\n/)\n .map((l) => l.trim())\n .filter(Boolean);\n\n for (const gitPathRaw of gitCandidates) {\n const gitPath = normalize(gitPathRaw.replace(/^\"|\"$/g, \"\"));\n if (!gitPath) continue;\n\n const gitDir = dirname(gitPath);\n const gitDirLower = gitDir.toLowerCase();\n\n // Determine plausible Git roots from common layouts.\n // Layouts seen in the wild:\n // <root>\\cmd\\git.exe -> bash at <root>\\bin\\bash.exe\n // <root>\\bin\\git.exe -> bash at <root>\\bin\\bash.exe\n // <root>\\mingw64\\bin\\git.exe -> bash at <root>\\usr\\bin\\bash.exe (or <root>\\bin\\bash.exe)\n const roots = new Set<string>();\n roots.add(gitDir);\n roots.add(join(gitDir, \"..\"));\n roots.add(join(gitDir, \"..\", \"..\"));\n\n if (gitDirLower.endsWith(\"\\\\cmd\") || gitDirLower.endsWith(\"\\\\bin\")) {\n roots.add(join(gitDir, \"..\"));\n }\n if (gitDirLower.endsWith(\"\\\\mingw64\\\\bin\")) {\n roots.add(join(gitDir, \"..\", \"..\"));\n }\n\n const bashCandidates: string[] = [];\n for (const root of roots) {\n // Common Git for Windows locations\n bashCandidates.push(join(root, \"bin\", \"bash.exe\"));\n bashCandidates.push(join(root, \"usr\", \"bin\", \"bash.exe\"));\n // Some layouts may place bash.exe adjacent\n bashCandidates.push(join(root, \"bash.exe\"));\n // Some portable installs\n bashCandidates.push(join(root, \"mingw64\", \"bin\", \"bash.exe\"));\n }\n\n for (const bashPath of bashCandidates) {\n const normalized = normalize(bashPath);\n if (existsSync(normalized)) return normalized;\n }\n }\n } catch {\n // `where git` failed — git not in PATH\n }\n\n return null;\n}\n\n/**\n * Log a startup warning if running on Windows without a detectable bash.exe.\n */\nexport function checkWindowsBashAvailability(): void {\n if (!isWindows()) return;\n\n const bashPath = findGitBash();\n if (bashPath) {\n console.error(`[windows] Git Bash detected: ${bashPath}`);\n return;\n }\n\n const hint = process.env.CLAUDE_CODE_GIT_BASH_PATH\n ? `CLAUDE_CODE_GIT_BASH_PATH is set to \"${process.env.CLAUDE_CODE_GIT_BASH_PATH}\" but the file does not exist.`\n : \"CLAUDE_CODE_GIT_BASH_PATH is not set and git was not found in PATH.\";\n\n console.error(\n `[windows] WARNING: ${hint}\\n` +\n ` The Claude Code CLI requires Git Bash on Windows.\\n` +\n ` Install Git for Windows (https://git-scm.com/downloads/win) and either:\\n` +\n ` 1. Add git to PATH, or\\n` +\n ` 2. Set CLAUDE_CODE_GIT_BASH_PATH to your bash.exe path\\n` +\n ` Example: CLAUDE_CODE_GIT_BASH_PATH=C:\\\\Program Files\\\\Git\\\\bin\\\\bash.exe\\n` +\n ` See README.md \"Windows Support\" section for MCP client config examples.`\n );\n}\n\nconst WINDOWS_BASH_HINT =\n \"\\n\\n[Windows] The Claude Code CLI requires Git Bash. \" +\n \"Set CLAUDE_CODE_GIT_BASH_PATH in your MCP server config or system environment. \" +\n 'See README.md \"Windows Support\" section for details.';\n\n/**\n * If the error looks like a Windows bash.exe issue, append a helpful hint.\n */\nexport function enhanceWindowsError(errorMessage: string): string {\n if (!isWindows()) return errorMessage;\n if (\n errorMessage.includes(\"git-bash\") ||\n errorMessage.includes(\"bash.exe\") ||\n errorMessage.includes(\"CLAUDE_CODE_GIT_BASH_PATH\")\n ) {\n return errorMessage + WINDOWS_BASH_HINT;\n }\n return errorMessage;\n}\n","import { createHmac } from \"node:crypto\";\n\nexport function getResumeSecret(): string | undefined {\n const secret = process.env.CLAUDE_CODE_MCP_RESUME_SECRET;\n if (typeof secret !== \"string\") return undefined;\n const trimmed = secret.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nexport function computeResumeToken(sessionId: string, secret: string): string {\n return createHmac(\"sha256\", secret).update(sessionId).digest(\"base64url\");\n}\n","/**\n * Race a promise against an AbortSignal — resolves/rejects the promise\n * or rejects early when the signal fires.\n */\nimport { ErrorCode } from \"../types.js\";\n\nexport function raceWithAbort<T>(\n promise: Promise<T>,\n signal: AbortSignal | undefined,\n onAbort: () => void\n): Promise<T> {\n if (!signal) return promise;\n if (signal.aborted) {\n try {\n onAbort();\n } catch {\n /* best-effort */\n }\n return Promise.reject(new Error(`Error [${ErrorCode.CANCELLED}]: request was cancelled.`));\n }\n return new Promise<T>((resolve, reject) => {\n const abortListener = () => {\n try {\n onAbort();\n } catch {\n /* best-effort */\n }\n reject(new Error(`Error [${ErrorCode.CANCELLED}]: request was cancelled.`));\n };\n signal.addEventListener(\"abort\", abortListener, { once: true });\n promise.then(resolve, reject).finally(() => signal.removeEventListener(\"abort\", abortListener));\n });\n}\n","/**\n * Shared helper to build SDK query options from a flat source object.\n *\n * All three call-sites (claude-code start, reply from session, disk-resume)\n * share the same field-by-field copy logic. This function centralises it so\n * a newly-added Options field only needs to be wired once.\n */\nimport type { Options } from \"@anthropic-ai/claude-agent-sdk\";\nimport type {\n AgentDefinition,\n EffortLevel,\n McpServerConfig,\n OutputFormat,\n SandboxSettings,\n SettingSource,\n SystemPrompt,\n ThinkingConfig,\n ToolsConfig,\n} from \"../types.js\";\nimport { DEFAULT_SETTING_SOURCES } from \"../types.js\";\n\n/** Superset of fields that any of the three call-sites may provide. */\nexport interface OptionSource {\n cwd: string;\n allowedTools?: string[];\n disallowedTools?: string[];\n tools?: ToolsConfig;\n maxTurns?: number;\n model?: string;\n systemPrompt?: SystemPrompt;\n agents?: Record<string, AgentDefinition>;\n maxBudgetUsd?: number;\n effort?: EffortLevel;\n betas?: string[];\n additionalDirectories?: string[];\n outputFormat?: OutputFormat;\n thinking?: ThinkingConfig;\n persistSession?: boolean;\n resumeSessionAt?: string;\n pathToClaudeCodeExecutable?: string;\n agent?: string;\n mcpServers?: Record<string, McpServerConfig>;\n sandbox?: SandboxSettings;\n fallbackModel?: string;\n enableFileCheckpointing?: boolean;\n includePartialMessages?: boolean;\n strictMcpConfig?: boolean;\n settingSources?: SettingSource[];\n debug?: boolean;\n debugFile?: string;\n env?: Record<string, string | undefined>;\n}\n\n/**\n * Build SDK `Partial<Options>` from a flat source object.\n *\n * Only copies fields that are explicitly defined (not `undefined`) so that\n * SDK defaults are preserved for omitted fields.\n */\nexport function buildOptions(src: OptionSource): Partial<Options> {\n const opts: Partial<Options> = { cwd: src.cwd };\n\n if (src.allowedTools !== undefined) opts.allowedTools = src.allowedTools;\n if (src.disallowedTools !== undefined) opts.disallowedTools = src.disallowedTools;\n if (src.tools !== undefined) opts.tools = src.tools;\n if (src.maxTurns !== undefined) opts.maxTurns = src.maxTurns;\n if (src.model !== undefined) opts.model = src.model;\n if (src.systemPrompt !== undefined) opts.systemPrompt = src.systemPrompt;\n if (src.agents !== undefined) opts.agents = src.agents as Options[\"agents\"];\n if (src.maxBudgetUsd !== undefined) opts.maxBudgetUsd = src.maxBudgetUsd;\n if (src.effort !== undefined) opts.effort = src.effort;\n if (src.betas !== undefined) opts.betas = src.betas as Options[\"betas\"];\n if (src.additionalDirectories !== undefined)\n opts.additionalDirectories = src.additionalDirectories;\n if (src.outputFormat !== undefined) opts.outputFormat = src.outputFormat;\n if (src.thinking !== undefined) opts.thinking = src.thinking;\n if (src.persistSession !== undefined) opts.persistSession = src.persistSession;\n if (src.resumeSessionAt !== undefined) opts.resumeSessionAt = src.resumeSessionAt;\n if (src.pathToClaudeCodeExecutable !== undefined)\n opts.pathToClaudeCodeExecutable = src.pathToClaudeCodeExecutable;\n if (src.agent !== undefined) opts.agent = src.agent;\n if (src.mcpServers !== undefined) opts.mcpServers = src.mcpServers as Options[\"mcpServers\"];\n if (src.sandbox !== undefined) opts.sandbox = src.sandbox;\n if (src.fallbackModel !== undefined) opts.fallbackModel = src.fallbackModel;\n if (src.enableFileCheckpointing !== undefined)\n opts.enableFileCheckpointing = src.enableFileCheckpointing;\n if (src.includePartialMessages !== undefined)\n opts.includePartialMessages = src.includePartialMessages;\n if (src.strictMcpConfig !== undefined) opts.strictMcpConfig = src.strictMcpConfig;\n if (src.settingSources !== undefined) opts.settingSources = src.settingSources;\n else opts.settingSources = DEFAULT_SETTING_SOURCES;\n if (src.debug !== undefined) opts.debug = src.debug;\n if (src.debugFile !== undefined) opts.debugFile = src.debugFile;\n if (src.env !== undefined) opts.env = { ...process.env, ...src.env };\n\n return opts;\n}\n","/**\n * claude_code tool - Start a new Claude Code agent session\n */\nimport type { SessionManager } from \"../session/manager.js\";\nimport type {\n AgentDefinition,\n EffortLevel,\n McpServerConfig,\n SandboxSettings,\n SessionStartResult,\n SettingSource,\n} from \"../types.js\";\nimport { ErrorCode, DEFAULT_SETTING_SOURCES } from \"../types.js\";\nimport { consumeQuery } from \"./query-consumer.js\";\nimport type { ToolDiscoveryCache } from \"./tool-discovery.js\";\nimport { computeResumeToken, getResumeSecret } from \"../utils/resume-token.js\";\nimport { raceWithAbort } from \"../utils/race-with-abort.js\";\nimport { buildOptions } from \"../utils/build-options.js\";\n\n/** Low-frequency / SDK-passthrough options grouped under `advanced`. */\nexport interface ClaudeCodeAdvancedOptions {\n tools?: string[] | { type: \"preset\"; preset: \"claude_code\" };\n persistSession?: boolean;\n sessionInitTimeoutMs?: number;\n agents?: Record<string, AgentDefinition>;\n agent?: string;\n maxBudgetUsd?: number;\n effort?: EffortLevel;\n betas?: string[];\n additionalDirectories?: string[];\n outputFormat?: { type: \"json_schema\"; schema: Record<string, unknown> };\n thinking?:\n | { type: \"adaptive\" }\n | { type: \"enabled\"; budgetTokens: number }\n | { type: \"disabled\" };\n pathToClaudeCodeExecutable?: string;\n mcpServers?: Record<string, McpServerConfig>;\n sandbox?: SandboxSettings;\n fallbackModel?: string;\n enableFileCheckpointing?: boolean;\n includePartialMessages?: boolean;\n strictMcpConfig?: boolean;\n settingSources?: SettingSource[];\n debug?: boolean;\n debugFile?: string;\n env?: Record<string, string | undefined>;\n}\n\nexport interface ClaudeCodeInput {\n prompt: string;\n cwd?: string;\n allowedTools?: string[];\n disallowedTools?: string[];\n maxTurns?: number;\n model?: string;\n systemPrompt?: string | { type: \"preset\"; preset: \"claude_code\"; append?: string };\n /** Timeout waiting for permission decision (default 60000ms) */\n permissionRequestTimeoutMs?: number;\n /** Low-frequency SDK options. All fields are optional and have sensible defaults. */\n advanced?: ClaudeCodeAdvancedOptions;\n}\n\nexport type ClaudeCodeStartResult =\n | SessionStartResult\n | { sessionId: string; status: \"error\"; error: string };\n\nexport async function executeClaudeCode(\n input: ClaudeCodeInput,\n sessionManager: SessionManager,\n serverCwd: string,\n toolCache?: ToolDiscoveryCache,\n requestSignal?: AbortSignal\n): Promise<ClaudeCodeStartResult> {\n const cwd = input.cwd !== undefined ? input.cwd : serverCwd;\n\n if (typeof cwd !== \"string\" || cwd.trim() === \"\") {\n return {\n sessionId: \"\",\n status: \"error\",\n error: `Error [${ErrorCode.INVALID_ARGUMENT}]: cwd must be a non-empty string.`,\n };\n }\n\n const abortController = new AbortController();\n const adv = input.advanced ?? {};\n\n const permissionRequestTimeoutMs = input.permissionRequestTimeoutMs ?? 60_000;\n const sessionInitTimeoutMs = adv.sessionInitTimeoutMs ?? 10_000;\n\n // Flatten top-level + advanced into a single object for buildOptions / sessionManager.\n const flat = {\n cwd,\n allowedTools: input.allowedTools,\n disallowedTools: input.disallowedTools,\n maxTurns: input.maxTurns,\n model: input.model,\n systemPrompt: input.systemPrompt,\n ...adv,\n };\n\n try {\n const handle = consumeQuery({\n mode: \"start\",\n prompt: input.prompt,\n abortController,\n options: buildOptions(flat),\n permissionRequestTimeoutMs,\n sessionInitTimeoutMs,\n sessionManager,\n toolCache,\n onInit: (init) => {\n // Idempotent: on transient retry the SDK may re-send init for the same session.\n if (sessionManager.get(init.session_id)) return;\n sessionManager.create({\n sessionId: init.session_id,\n cwd,\n model: input.model,\n permissionMode: \"default\",\n allowedTools: input.allowedTools,\n disallowedTools: input.disallowedTools,\n tools: adv.tools,\n maxTurns: input.maxTurns,\n systemPrompt: input.systemPrompt,\n agents: adv.agents as Record<string, AgentDefinition> | undefined,\n maxBudgetUsd: adv.maxBudgetUsd,\n effort: adv.effort,\n betas: adv.betas,\n additionalDirectories: adv.additionalDirectories,\n outputFormat: adv.outputFormat,\n thinking: adv.thinking,\n persistSession: adv.persistSession,\n pathToClaudeCodeExecutable: adv.pathToClaudeCodeExecutable,\n agent: adv.agent,\n mcpServers: adv.mcpServers,\n sandbox: adv.sandbox,\n fallbackModel: adv.fallbackModel,\n enableFileCheckpointing: adv.enableFileCheckpointing,\n includePartialMessages: adv.includePartialMessages,\n strictMcpConfig: adv.strictMcpConfig,\n settingSources: adv.settingSources ?? DEFAULT_SETTING_SOURCES,\n debug: adv.debug,\n debugFile: adv.debugFile,\n env: adv.env,\n abortController,\n });\n },\n });\n\n const sessionId = await raceWithAbort(handle.sdkSessionIdPromise, requestSignal, () =>\n abortController.abort()\n );\n\n const resumeSecret = getResumeSecret();\n return {\n sessionId,\n status: \"running\",\n pollInterval: 3000,\n resumeToken: resumeSecret ? computeResumeToken(sessionId, resumeSecret) : undefined,\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n sessionId: \"\",\n status: \"error\",\n error: message.includes(\"Error [\") ? message : `Error [${ErrorCode.INTERNAL}]: ${message}`,\n };\n }\n}\n","/**\n * claude_code_reply tool - Continue an existing Claude Code session (async)\n */\nimport type { SessionManager } from \"../session/manager.js\";\nimport type {\n AgentDefinition,\n EffortLevel,\n McpServerConfig,\n OutputFormat,\n SandboxSettings,\n SessionStartResult,\n SettingSource,\n SystemPrompt,\n ThinkingConfig,\n ToolsConfig,\n} from \"../types.js\";\nimport { DEFAULT_SETTING_SOURCES, ErrorCode } from \"../types.js\";\nimport { consumeQuery } from \"./query-consumer.js\";\nimport type { ToolDiscoveryCache } from \"./tool-discovery.js\";\nimport { computeResumeToken, getResumeSecret } from \"../utils/resume-token.js\";\nimport { raceWithAbort } from \"../utils/race-with-abort.js\";\nimport { buildOptions } from \"../utils/build-options.js\";\n\n/** Disk resume fallback configuration — only used when the in-memory session is missing. */\nexport interface DiskResumeConfig {\n resumeToken?: string;\n cwd?: string;\n allowedTools?: string[];\n disallowedTools?: string[];\n tools?: ToolsConfig;\n persistSession?: boolean;\n maxTurns?: number;\n model?: string;\n systemPrompt?: SystemPrompt;\n agents?: Record<string, AgentDefinition>;\n agent?: string;\n maxBudgetUsd?: number;\n effort?: EffortLevel;\n betas?: string[];\n additionalDirectories?: string[];\n outputFormat?: OutputFormat;\n thinking?: ThinkingConfig;\n resumeSessionAt?: string;\n pathToClaudeCodeExecutable?: string;\n mcpServers?: Record<string, McpServerConfig>;\n sandbox?: SandboxSettings;\n fallbackModel?: string;\n enableFileCheckpointing?: boolean;\n includePartialMessages?: boolean;\n strictMcpConfig?: boolean;\n settingSources?: SettingSource[];\n debug?: boolean;\n debugFile?: string;\n env?: Record<string, string | undefined>;\n}\n\nexport interface ClaudeCodeReplyInput {\n sessionId: string;\n prompt: string;\n forkSession?: boolean;\n\n /** Timeout waiting for fork init (default 10000ms, only used when forkSession=true) */\n sessionInitTimeoutMs?: number;\n /** Timeout waiting for permission decision (default 60000ms) */\n permissionRequestTimeoutMs?: number;\n\n /**\n * Disk resume fallback configuration. Only used when `CLAUDE_CODE_MCP_ALLOW_DISK_RESUME=1`\n * and the in-memory session is missing. Contains resumeToken + all session config overrides.\n */\n diskResumeConfig?: DiskResumeConfig;\n}\n\nexport type ClaudeCodeReplyStartResult =\n | SessionStartResult\n | { sessionId: string; status: \"error\"; error: string };\n\nfunction toStartError(\n sessionId: string,\n err: unknown\n): {\n agentResult: {\n sessionId: string;\n result: string;\n isError: true;\n durationMs: 0;\n numTurns: 0;\n totalCostUsd: 0;\n };\n errorText: string;\n} {\n const message = err instanceof Error ? err.message : String(err);\n const errorText = message.includes(\"Error [\")\n ? message\n : `Error [${ErrorCode.INTERNAL}]: ${message}`;\n return {\n agentResult: {\n sessionId,\n result: errorText,\n isError: true,\n durationMs: 0,\n numTurns: 0,\n totalCostUsd: 0,\n },\n errorText,\n };\n}\n\nfunction buildOptionsFromDiskResume(dr: DiskResumeConfig): ReturnType<typeof buildOptions> {\n if (dr.cwd === undefined || typeof dr.cwd !== \"string\" || dr.cwd.trim() === \"\") {\n throw new Error(`Error [${ErrorCode.INVALID_ARGUMENT}]: cwd must be provided for disk resume.`);\n }\n return buildOptions(dr as Parameters<typeof buildOptions>[0]);\n}\n\nexport async function executeClaudeCodeReply(\n input: ClaudeCodeReplyInput,\n sessionManager: SessionManager,\n toolCache?: ToolDiscoveryCache,\n requestSignal?: AbortSignal\n): Promise<ClaudeCodeReplyStartResult> {\n const permissionRequestTimeoutMs = input.permissionRequestTimeoutMs ?? 60_000;\n const sessionInitTimeoutMs = input.sessionInitTimeoutMs ?? 10_000;\n\n const existing = sessionManager.get(input.sessionId);\n if (!existing) {\n const allowDiskResume = process.env.CLAUDE_CODE_MCP_ALLOW_DISK_RESUME === \"1\";\n if (!allowDiskResume) {\n return {\n sessionId: input.sessionId,\n status: \"error\",\n error: `Error [${ErrorCode.SESSION_NOT_FOUND}]: Session '${input.sessionId}' not found or expired.`,\n };\n }\n\n const resumeSecret = getResumeSecret();\n if (!resumeSecret) {\n return {\n sessionId: input.sessionId,\n status: \"error\",\n error: `Error [${ErrorCode.PERMISSION_DENIED}]: Disk resume is enabled but CLAUDE_CODE_MCP_RESUME_SECRET is not set.`,\n };\n }\n\n const dr = input.diskResumeConfig ?? {};\n if (typeof dr.resumeToken !== \"string\" || dr.resumeToken.trim() === \"\") {\n return {\n sessionId: input.sessionId,\n status: \"error\",\n error: `Error [${ErrorCode.PERMISSION_DENIED}]: resumeToken is required for disk resume fallback.`,\n };\n }\n const expectedToken = computeResumeToken(input.sessionId, resumeSecret);\n if (dr.resumeToken !== expectedToken) {\n return {\n sessionId: input.sessionId,\n status: \"error\",\n error: `Error [${ErrorCode.PERMISSION_DENIED}]: Invalid resumeToken for session '${input.sessionId}'.`,\n };\n }\n\n try {\n const abortController = new AbortController();\n const options = buildOptionsFromDiskResume(dr);\n\n sessionManager.create({\n sessionId: input.sessionId,\n cwd: options.cwd ?? dr.cwd ?? \"\",\n model: dr.model,\n permissionMode: \"default\",\n allowedTools: dr.allowedTools,\n disallowedTools: dr.disallowedTools,\n tools: dr.tools,\n maxTurns: dr.maxTurns,\n systemPrompt: dr.systemPrompt,\n agents: dr.agents,\n maxBudgetUsd: dr.maxBudgetUsd,\n effort: dr.effort,\n betas: dr.betas,\n additionalDirectories: dr.additionalDirectories,\n outputFormat: dr.outputFormat,\n thinking: dr.thinking,\n persistSession: dr.persistSession,\n pathToClaudeCodeExecutable: dr.pathToClaudeCodeExecutable,\n agent: dr.agent,\n mcpServers: dr.mcpServers,\n sandbox: dr.sandbox,\n fallbackModel: dr.fallbackModel,\n enableFileCheckpointing: dr.enableFileCheckpointing,\n includePartialMessages: dr.includePartialMessages,\n strictMcpConfig: dr.strictMcpConfig,\n settingSources: dr.settingSources ?? DEFAULT_SETTING_SOURCES,\n debug: dr.debug,\n debugFile: dr.debugFile,\n env: dr.env,\n abortController,\n });\n\n try {\n consumeQuery({\n mode: \"disk-resume\",\n sessionId: input.sessionId,\n prompt: input.prompt,\n abortController,\n options,\n permissionRequestTimeoutMs,\n sessionInitTimeoutMs,\n sessionManager,\n toolCache,\n });\n } catch (err: unknown) {\n const { agentResult, errorText } = toStartError(input.sessionId, err);\n sessionManager.setResult(input.sessionId, {\n type: \"error\",\n result: agentResult,\n createdAt: new Date().toISOString(),\n });\n sessionManager.pushEvent(input.sessionId, {\n type: \"error\",\n data: agentResult,\n timestamp: new Date().toISOString(),\n });\n sessionManager.update(input.sessionId, { status: \"error\", abortController: undefined });\n return { sessionId: input.sessionId, status: \"error\", error: errorText };\n }\n\n return {\n sessionId: input.sessionId,\n status: \"running\",\n pollInterval: 3000,\n resumeToken: computeResumeToken(input.sessionId, resumeSecret),\n };\n } catch (err: unknown) {\n const { agentResult, errorText } = toStartError(input.sessionId, err);\n if (sessionManager.get(input.sessionId)) {\n sessionManager.setResult(input.sessionId, {\n type: \"error\",\n result: agentResult,\n createdAt: new Date().toISOString(),\n });\n sessionManager.pushEvent(input.sessionId, {\n type: \"error\",\n data: agentResult,\n timestamp: new Date().toISOString(),\n });\n sessionManager.update(input.sessionId, { status: \"error\", abortController: undefined });\n }\n return {\n sessionId: input.sessionId,\n status: \"error\",\n error: errorText,\n };\n }\n }\n\n if (existing.status === \"running\" || existing.status === \"waiting_permission\") {\n return {\n sessionId: input.sessionId,\n status: \"error\",\n error: `Error [${ErrorCode.SESSION_BUSY}]: Session is not available (status: ${existing.status}).`,\n };\n }\n\n if (existing.status === \"cancelled\") {\n return {\n sessionId: input.sessionId,\n status: \"error\",\n error: `Error [${ErrorCode.CANCELLED}]: Session '${input.sessionId}' has been cancelled and cannot be resumed.`,\n };\n }\n\n const originalStatus = existing.status;\n const abortController = new AbortController();\n const acquired = sessionManager.tryAcquire(input.sessionId, originalStatus, abortController);\n if (!acquired) {\n const current = sessionManager.get(input.sessionId);\n return {\n sessionId: input.sessionId,\n status: \"error\",\n error: current\n ? `Error [${ErrorCode.SESSION_BUSY}]: Session is not available (status: ${current.status}).`\n : `Error [${ErrorCode.SESSION_NOT_FOUND}]: Session '${input.sessionId}' not found or expired.`,\n };\n }\n\n const options = buildOptions(existing);\n if (input.forkSession) options.forkSession = true;\n\n try {\n const handle = consumeQuery({\n mode: \"resume\",\n sessionId: input.sessionId,\n prompt: input.prompt,\n abortController,\n options,\n permissionRequestTimeoutMs,\n sessionInitTimeoutMs,\n waitForInitSessionId: !!input.forkSession,\n sessionManager,\n toolCache,\n onInit: (init) => {\n if (!input.forkSession) return;\n if (init.session_id === input.sessionId) return;\n\n if (!sessionManager.get(init.session_id)) {\n sessionManager.create({\n sessionId: init.session_id,\n cwd: existing.cwd,\n model: existing.model,\n permissionMode: \"default\",\n allowedTools: existing.allowedTools,\n disallowedTools: existing.disallowedTools,\n tools: existing.tools,\n maxTurns: existing.maxTurns,\n systemPrompt: existing.systemPrompt,\n agents: existing.agents,\n maxBudgetUsd: existing.maxBudgetUsd,\n effort: existing.effort,\n betas: existing.betas,\n additionalDirectories: existing.additionalDirectories,\n outputFormat: existing.outputFormat,\n thinking: existing.thinking,\n persistSession: existing.persistSession,\n pathToClaudeCodeExecutable: existing.pathToClaudeCodeExecutable,\n agent: existing.agent,\n mcpServers: existing.mcpServers,\n sandbox: existing.sandbox,\n fallbackModel: existing.fallbackModel,\n enableFileCheckpointing: existing.enableFileCheckpointing,\n includePartialMessages: existing.includePartialMessages,\n strictMcpConfig: existing.strictMcpConfig,\n settingSources: existing.settingSources ?? DEFAULT_SETTING_SOURCES,\n debug: existing.debug,\n debugFile: existing.debugFile,\n env: existing.env,\n abortController,\n });\n }\n\n // Restore original session state (fork should not affect the original session).\n sessionManager.update(input.sessionId, {\n status: originalStatus,\n abortController: undefined,\n });\n },\n });\n\n const sessionId = input.forkSession\n ? await raceWithAbort(handle.sdkSessionIdPromise, requestSignal, () =>\n abortController.abort()\n )\n : input.sessionId;\n if (input.forkSession && sessionId === input.sessionId) {\n return {\n sessionId: input.sessionId,\n status: \"error\",\n error: `Error [${ErrorCode.INTERNAL}]: Fork requested but no new session ID received from agent.`,\n };\n }\n\n const resumeSecret = getResumeSecret();\n return {\n sessionId,\n status: \"running\",\n pollInterval: 3000,\n resumeToken: resumeSecret ? computeResumeToken(sessionId, resumeSecret) : undefined,\n };\n } catch (err: unknown) {\n const { agentResult, errorText } = toStartError(input.sessionId, err);\n if (input.forkSession) {\n sessionManager.update(input.sessionId, {\n status: originalStatus,\n abortController: undefined,\n });\n } else {\n sessionManager.setResult(input.sessionId, {\n type: \"error\",\n result: agentResult,\n createdAt: new Date().toISOString(),\n });\n sessionManager.pushEvent(input.sessionId, {\n type: \"error\",\n data: agentResult,\n timestamp: new Date().toISOString(),\n });\n sessionManager.update(input.sessionId, { status: \"error\", abortController: undefined });\n }\n return {\n sessionId: input.sessionId,\n status: \"error\",\n error: errorText,\n };\n }\n}\n","import type { ToolInfo } from \"../types.js\";\n\ntype ToolCatalogEntry = Omit<ToolInfo, \"name\">;\n\nexport const TOOL_CATALOG: Record<string, ToolCatalogEntry> = {\n Bash: {\n description: \"Run shell commands (e.g. npm install, git commit, ls) in the project directory.\",\n category: \"execute\",\n },\n Read: { description: \"Read the contents of a file given its path.\", category: \"file_read\" },\n Write: {\n description: \"Create a new file or completely replace an existing file's contents.\",\n category: \"file_write\",\n },\n Edit: {\n description:\n \"Make targeted changes to specific parts of an existing file without rewriting the whole file.\",\n category: \"file_write\",\n },\n Glob: {\n description: \"Find files by name pattern (e.g. '**/*.ts' finds all TypeScript files).\",\n category: \"file_read\",\n },\n Grep: {\n description: \"Search inside files for text or regex patterns (like grep/ripgrep).\",\n category: \"file_read\",\n },\n NotebookEdit: {\n description: \"Edit individual cells in Jupyter notebooks (.ipynb files).\",\n category: \"file_write\",\n },\n WebFetch: {\n description: \"Download and read the content of a web page or API endpoint.\",\n category: \"network\",\n },\n WebSearch: { description: \"Search the web and return relevant results.\", category: \"network\" },\n Task: {\n description:\n \"Spawn a subagent to handle a subtask independently (requires this tool to be in allowedTools).\",\n category: \"agent\",\n },\n TaskOutput: { description: \"Get the output from a background subagent task.\", category: \"agent\" },\n TaskStop: { description: \"Cancel a running background subagent task.\", category: \"agent\" },\n TodoWrite: {\n description: \"Create and update a structured task/todo checklist.\",\n category: \"agent\",\n },\n AskUserQuestion: {\n description: \"Ask the user a question and wait for their answer before continuing.\",\n category: \"interaction\",\n },\n};\n\nfunction uniq<T>(items: T[]): T[] {\n return Array.from(new Set(items));\n}\n\nexport function discoverToolsFromInit(initTools: string[]): ToolInfo[] {\n const names = uniq(initTools.filter((t) => typeof t === \"string\" && t.trim() !== \"\"));\n return names.map((name) => ({\n name,\n description: TOOL_CATALOG[name]?.description ?? name,\n category: TOOL_CATALOG[name]?.category,\n }));\n}\n\nexport function defaultCatalogTools(): ToolInfo[] {\n return Object.keys(TOOL_CATALOG)\n .sort((a, b) => a.localeCompare(b))\n .map((name) => ({ name, ...TOOL_CATALOG[name] }));\n}\n\nexport class ToolDiscoveryCache {\n private cached: ToolInfo[];\n\n constructor(initial?: ToolInfo[]) {\n this.cached = initial ?? defaultCatalogTools();\n }\n\n getTools(): ToolInfo[] {\n return this.cached;\n }\n\n updateFromInit(initTools: string[]): { updated: boolean; tools: ToolInfo[] } {\n const discovered = discoverToolsFromInit(initTools);\n const next = mergeToolLists(discovered, defaultCatalogTools());\n const updated = JSON.stringify(next) !== JSON.stringify(this.cached);\n if (updated) this.cached = next;\n return { updated, tools: this.cached };\n }\n}\n\nexport function mergeToolLists(primary: ToolInfo[], fallback: ToolInfo[]): ToolInfo[] {\n const byName = new Map<string, ToolInfo>();\n for (const t of fallback) byName.set(t.name, t);\n for (const t of primary) byName.set(t.name, t);\n return Array.from(byName.values()).sort((a, b) => a.name.localeCompare(b.name));\n}\n\nfunction groupByCategory(tools: ToolInfo[]): Record<string, ToolInfo[]> {\n const grouped: Record<string, ToolInfo[]> = {};\n for (const tool of tools) {\n const category = tool.category ?? \"other\";\n grouped[category] ??= [];\n grouped[category].push(tool);\n }\n for (const category of Object.keys(grouped)) {\n grouped[category].sort((a, b) => a.name.localeCompare(b.name));\n }\n return grouped;\n}\n\nexport function buildInternalToolsDescription(tools: ToolInfo[]): string {\n const grouped = groupByCategory(tools);\n const categories = Object.keys(grouped).sort((a, b) => a.localeCompare(b));\n\n let desc =\n \"Start a new Claude Code agent session.\\n\\n\" +\n \"Launches an autonomous coding agent that can read/write files, run shell commands, search code, \" +\n \"manage git, access the web, and more. \" +\n \"Returns immediately with a sessionId — the agent runs asynchronously in the background.\\n\\n\" +\n \"Workflow:\\n\" +\n '1. Call claude_code with a prompt → returns { sessionId, status: \"running\", pollInterval }\\n' +\n '2. Poll with claude_code_check (action=\"poll\") to receive progress events and the final result\\n' +\n '3. If the agent needs permission for a tool call, approve or deny via claude_code_check (action=\"respond_permission\")\\n\\n';\n\n desc +=\n \"Defaults:\\n\" +\n \"- settingSources: ['user', 'project', 'local'] (loads ~/.claude/settings.json, .claude/settings.json, .claude/settings.local.json, and CLAUDE.md)\\n\" +\n \"- persistSession: true\\n\" +\n \"- sessionInitTimeoutMs: 10000\\n\" +\n \"- permissionRequestTimeoutMs: 60000\\n\" +\n \"- allowedTools/disallowedTools: [] (none)\\n\" +\n \"- resumeToken: omitted unless CLAUDE_CODE_MCP_RESUME_SECRET is set on the server\\n\\n\";\n desc +=\n \"Internal tools available to the agent (use allowedTools/disallowedTools to control approval policy; \" +\n \"authoritative list returned by claude_code_check with includeTools=true):\\n\";\n\n for (const category of categories) {\n desc += `\\n[${category}]\\n`;\n for (const tool of grouped[category]) {\n desc += `- ${tool.name}: ${tool.description}\\n`;\n }\n }\n\n desc +=\n \"\\nUse `allowedTools` to pre-approve tools (no permission prompts). \" +\n \"Use `disallowedTools` to permanently block specific tools. \" +\n 'Any tool not in either list will pause the session (status: \"waiting_permission\") until approved or denied via claude_code_check.\\n';\n return desc;\n}\n","/**\n * claude_code_check tool - Poll session events and respond to permission requests (v2 baseline)\n */\nimport type { SessionManager } from \"../session/manager.js\";\nimport type {\n AgentResult,\n CheckAction,\n CheckResult,\n CheckResponseMode,\n PermissionDecision,\n PermissionResult,\n PermissionUpdate,\n SessionEventType,\n SessionStatus,\n} from \"../types.js\";\nimport { ErrorCode } from \"../types.js\";\nimport type { ToolDiscoveryCache } from \"./tool-discovery.js\";\nimport { discoverToolsFromInit } from \"./tool-discovery.js\";\n\n/** Fine-grained poll control options (most callers just use responseMode). */\nexport interface PollOptions {\n includeTools?: boolean;\n includeEvents?: boolean;\n includeActions?: boolean;\n includeResult?: boolean;\n includeUsage?: boolean;\n includeModelUsage?: boolean;\n includeStructuredOutput?: boolean;\n includeTerminalEvents?: boolean;\n includeProgressEvents?: boolean;\n}\n\n/** Advanced permission response options. */\nexport interface PermissionResponseOptions {\n updatedInput?: Record<string, unknown>;\n updatedPermissions?: Array<Record<string, unknown>>;\n}\n\nexport interface ClaudeCodeCheckInput {\n action: CheckAction;\n sessionId: string;\n cursor?: number;\n\n /**\n * Response shaping. Defaults to \"minimal\" to reduce payload size.\n * Use \"full\" to include verbose fields like usage/modelUsage.\n */\n responseMode?: CheckResponseMode;\n /** Max number of events to return per poll (pagination via nextCursor). */\n maxEvents?: number;\n\n /** Fine-grained poll control. Overrides responseMode defaults for individual fields. */\n pollOptions?: PollOptions;\n\n requestId?: string;\n decision?: PermissionDecision;\n denyMessage?: string;\n interrupt?: boolean;\n\n /** Advanced permission response options (only with decision='allow'). */\n permissionOptions?: PermissionResponseOptions;\n}\n\nexport type ClaudeCodeCheckResult =\n | CheckResult\n | { sessionId: string; error: string; isError: true };\n\nfunction pollIntervalForStatus(status: SessionStatus): number | undefined {\n if (status === \"waiting_permission\") return 1000;\n if (status === \"running\") return 3000;\n return undefined;\n}\n\nfunction toPermissionResult(params: {\n decision: PermissionDecision;\n updatedInput?: Record<string, unknown>;\n updatedPermissions?: Array<Record<string, unknown>>;\n denyMessage?: string;\n interrupt?: boolean;\n}): PermissionResult {\n if (params.decision === \"allow\") {\n return {\n behavior: \"allow\",\n updatedInput: params.updatedInput,\n updatedPermissions: params.updatedPermissions as unknown as PermissionUpdate[] | undefined,\n };\n }\n return {\n behavior: \"deny\",\n message: params.denyMessage ?? \"Permission denied by caller\",\n interrupt: params.interrupt,\n };\n}\n\n/**\n * Slim down an assistant output event's message object in minimal mode.\n * Strips verbose API fields (usage, model, id, type, stop_sequence) and\n * cache_control metadata from content blocks, keeping only the essentials.\n */\nfunction slimAssistantData(data: unknown): unknown {\n if (!data || typeof data !== \"object\") return data;\n const d = data as Record<string, unknown>;\n if (d.type !== \"assistant\") return data;\n\n const msg = d.message;\n if (!msg || typeof msg !== \"object\") return data;\n const m = msg as Record<string, unknown>;\n\n // Strip verbose fields from the message object\n const slimmed: Record<string, unknown> = {};\n if (m.role !== undefined) slimmed.role = m.role;\n if (m.stop_reason !== undefined) slimmed.stop_reason = m.stop_reason;\n\n // Slim content blocks: remove cache_control and other metadata\n if (Array.isArray(m.content)) {\n slimmed.content = (m.content as Array<Record<string, unknown>>).map((block) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { cache_control, ...rest } = block;\n return rest;\n });\n }\n\n return {\n type: d.type,\n message: slimmed,\n ...(d.parent_tool_use_id ? { parent_tool_use_id: d.parent_tool_use_id } : {}),\n ...(d.error ? { error: d.error } : {}),\n };\n}\n\nfunction toEvents(\n events: Array<{ id: number; type: SessionEventType; data: unknown; timestamp: string }>,\n opts: {\n includeUsage: boolean;\n includeModelUsage: boolean;\n includeStructuredOutput: boolean;\n slim: boolean;\n }\n): CheckResult[\"events\"] {\n return events.map((e) => {\n if ((e.type === \"result\" || e.type === \"error\") && isAgentResult(e.data)) {\n const redacted = redactAgentResult(e.data, opts);\n return { id: e.id, type: e.type, data: redacted, timestamp: e.timestamp };\n }\n // In minimal mode, slim down assistant output events\n if (opts.slim && e.type === \"output\") {\n return { id: e.id, type: e.type, data: slimAssistantData(e.data), timestamp: e.timestamp };\n }\n return { id: e.id, type: e.type, data: e.data, timestamp: e.timestamp };\n });\n}\n\nfunction buildResult(\n sessionManager: SessionManager,\n toolCache: ToolDiscoveryCache | undefined,\n input: ClaudeCodeCheckInput\n): CheckResult {\n const responseMode: CheckResponseMode = input.responseMode ?? \"minimal\";\n const po = input.pollOptions ?? {};\n const includeTools = po.includeTools;\n const includeEvents = po.includeEvents ?? true;\n const includeActions = po.includeActions ?? true;\n const includeResult = po.includeResult ?? true;\n const includeUsage = po.includeUsage ?? responseMode === \"full\";\n const includeModelUsage = po.includeModelUsage ?? responseMode === \"full\";\n const includeStructuredOutput = po.includeStructuredOutput ?? responseMode === \"full\";\n const includeTerminalEvents = po.includeTerminalEvents ?? responseMode === \"full\";\n const includeProgressEvents = po.includeProgressEvents ?? responseMode === \"full\";\n const maxEvents = input.maxEvents ?? (responseMode === \"minimal\" ? 200 : undefined);\n\n const sessionId = input.sessionId;\n const session = sessionManager.get(sessionId);\n const status: SessionStatus = session?.status ?? \"error\";\n\n const {\n events: rawEvents,\n nextCursor: rawNextCursor,\n cursorResetTo,\n } = sessionManager.readEvents(sessionId, input.cursor);\n\n let truncated = false;\n const truncatedFields: string[] = [];\n\n // Apply pagination by event count (caller should continue with nextCursor).\n const windowEvents =\n maxEvents !== undefined && rawEvents.length > maxEvents\n ? rawEvents.slice(0, maxEvents)\n : rawEvents;\n const nextCursor =\n maxEvents !== undefined && rawEvents.length > maxEvents\n ? windowEvents.length > 0\n ? windowEvents[windowEvents.length - 1].id + 1\n : rawNextCursor\n : rawNextCursor;\n if (maxEvents !== undefined && rawEvents.length > maxEvents) {\n truncated = true;\n truncatedFields.push(\"events\");\n }\n\n const outputEvents = (() => {\n if (!includeEvents) return [] as typeof windowEvents;\n\n let filtered = windowEvents;\n\n // Avoid duplicating terminal result/error both in events and top-level result.\n if (!includeTerminalEvents && includeResult && (status === \"idle\" || status === \"error\")) {\n filtered = filtered.filter((e) => e.type !== \"result\" && e.type !== \"error\");\n }\n\n // In minimal mode, filter out noisy progress events (tool_progress, auth_status).\n if (!includeProgressEvents) {\n filtered = filtered.filter((e) => {\n if (e.type !== \"progress\") return true;\n const d = e.data as Record<string, unknown> | null;\n const progressType = d?.type;\n return progressType !== \"tool_progress\" && progressType !== \"auth_status\";\n });\n }\n\n return filtered;\n })();\n\n const pending =\n status === \"waiting_permission\" ? sessionManager.listPendingPermissions(sessionId) : [];\n const stored =\n status === \"idle\" || status === \"error\" ? sessionManager.getResult(sessionId) : undefined;\n\n const initTools = includeTools ? sessionManager.getInitTools(sessionId) : undefined;\n const availableTools = includeTools && initTools ? discoverToolsFromInit(initTools) : undefined;\n\n return {\n sessionId,\n status,\n pollInterval: pollIntervalForStatus(status),\n cursorResetTo,\n truncated: truncated ? true : undefined,\n truncatedFields: truncatedFields.length > 0 ? truncatedFields : undefined,\n events: toEvents(outputEvents, {\n includeUsage,\n includeModelUsage,\n includeStructuredOutput,\n slim: responseMode === \"minimal\",\n }),\n nextCursor,\n availableTools,\n actions:\n includeActions && status === \"waiting_permission\"\n ? pending.map((req) => ({\n type: \"permission\" as const,\n requestId: req.requestId,\n toolName: req.toolName,\n input: req.input,\n summary: req.summary,\n decisionReason: req.decisionReason,\n blockedPath: req.blockedPath,\n toolUseID: req.toolUseID,\n agentID: req.agentID,\n suggestions: req.suggestions,\n description: req.description,\n createdAt: req.createdAt,\n }))\n : undefined,\n result:\n includeResult && stored?.result\n ? redactAgentResult(stored.result, {\n includeUsage,\n includeModelUsage,\n includeStructuredOutput,\n slim: responseMode === \"minimal\",\n })\n : undefined,\n cancelledAt: session?.cancelledAt,\n cancelledReason: session?.cancelledReason,\n cancelledSource: session?.cancelledSource,\n lastEventId: responseMode === \"full\" ? sessionManager.getLastEventId(sessionId) : undefined,\n lastToolUseId: responseMode === \"full\" ? session?.lastToolUseId : undefined,\n };\n}\n\nfunction isAgentResult(value: unknown): value is AgentResult {\n if (!value || typeof value !== \"object\") return false;\n const v = value as Record<string, unknown>;\n return (\n typeof v.sessionId === \"string\" &&\n typeof v.result === \"string\" &&\n typeof v.isError === \"boolean\" &&\n typeof v.durationMs === \"number\" &&\n typeof v.numTurns === \"number\" &&\n typeof v.totalCostUsd === \"number\"\n );\n}\n\nfunction redactAgentResult(\n result: AgentResult,\n opts: {\n includeUsage: boolean;\n includeModelUsage: boolean;\n includeStructuredOutput: boolean;\n slim?: boolean;\n }\n): AgentResult {\n const {\n usage,\n modelUsage,\n structuredOutput,\n durationApiMs,\n sessionTotalTurns,\n sessionTotalCostUsd,\n ...rest\n } = result;\n\n return {\n ...rest,\n durationApiMs: opts.slim ? undefined : durationApiMs,\n sessionTotalTurns: opts.slim ? undefined : sessionTotalTurns,\n sessionTotalCostUsd: opts.slim ? undefined : sessionTotalCostUsd,\n usage: opts.includeUsage ? usage : undefined,\n modelUsage: opts.includeModelUsage ? modelUsage : undefined,\n structuredOutput: opts.includeStructuredOutput ? structuredOutput : undefined,\n };\n}\n\nexport function executeClaudeCodeCheck(\n input: ClaudeCodeCheckInput,\n sessionManager: SessionManager,\n toolCache?: ToolDiscoveryCache\n): ClaudeCodeCheckResult {\n if (typeof input.sessionId !== \"string\" || input.sessionId.trim() === \"\") {\n return {\n sessionId: \"\",\n error: `Error [${ErrorCode.INVALID_ARGUMENT}]: sessionId must be a non-empty string.`,\n isError: true,\n };\n }\n\n const session = sessionManager.get(input.sessionId);\n if (!session) {\n return {\n sessionId: input.sessionId,\n error: `Error [${ErrorCode.SESSION_NOT_FOUND}]: Session '${input.sessionId}' not found or expired.`,\n isError: true,\n };\n }\n\n if (input.action === \"poll\") {\n return buildResult(sessionManager, toolCache, input);\n }\n\n // respond_permission\n if (typeof input.requestId !== \"string\" || input.requestId.trim() === \"\") {\n return {\n sessionId: input.sessionId,\n error: `Error [${ErrorCode.INVALID_ARGUMENT}]: requestId is required for respond_permission.`,\n isError: true,\n };\n }\n if (input.decision !== \"allow\" && input.decision !== \"deny\") {\n return {\n sessionId: input.sessionId,\n error: `Error [${ErrorCode.INVALID_ARGUMENT}]: decision must be 'allow' or 'deny'.`,\n isError: true,\n };\n }\n\n const ok = sessionManager.finishRequest(\n input.sessionId,\n input.requestId,\n toPermissionResult({\n decision: input.decision,\n updatedInput: input.permissionOptions?.updatedInput,\n updatedPermissions: input.permissionOptions?.updatedPermissions,\n denyMessage: input.denyMessage,\n interrupt: input.interrupt,\n }),\n \"respond\"\n );\n if (!ok) {\n return {\n sessionId: input.sessionId,\n error: `Error [${ErrorCode.PERMISSION_REQUEST_NOT_FOUND}]: requestId '${input.requestId}' not found (already finished or expired).`,\n isError: true,\n };\n }\n\n return buildResult(sessionManager, toolCache, input);\n}\n","/**\n * claude_code_session tool - Manage sessions (list, get, cancel)\n */\nimport type { SessionManager } from \"../session/manager.js\";\nimport type {\n PublicSessionInfo,\n SensitiveSessionInfo,\n SessionInfo,\n SessionAction,\n} from \"../types.js\";\nimport { ErrorCode } from \"../types.js\";\n\nexport interface ClaudeCodeSessionInput {\n action: SessionAction;\n sessionId?: string;\n includeSensitive?: boolean;\n}\n\nexport interface SessionResult {\n sessions: Array<PublicSessionInfo | SensitiveSessionInfo>;\n message?: string;\n isError?: boolean;\n}\n\nexport function executeClaudeCodeSession(\n input: ClaudeCodeSessionInput,\n sessionManager: SessionManager\n): SessionResult {\n const toSessionJson = (s: SessionInfo) =>\n input.includeSensitive ? sessionManager.toSensitiveJSON(s) : sessionManager.toPublicJSON(s);\n\n switch (input.action) {\n case \"list\": {\n const sessions = sessionManager.list().map((s) => toSessionJson(s));\n return { sessions };\n }\n\n case \"get\": {\n if (!input.sessionId) {\n return {\n sessions: [],\n message: `Error [${ErrorCode.INVALID_ARGUMENT}]: sessionId is required for 'get' action.`,\n isError: true,\n };\n }\n const session = sessionManager.get(input.sessionId);\n if (!session) {\n return {\n sessions: [],\n message: `Error [${ErrorCode.SESSION_NOT_FOUND}]: Session '${input.sessionId}' not found.`,\n isError: true,\n };\n }\n return { sessions: [toSessionJson(session)] };\n }\n\n case \"cancel\": {\n if (!input.sessionId) {\n return {\n sessions: [],\n message: `Error [${ErrorCode.INVALID_ARGUMENT}]: sessionId is required for 'cancel' action.`,\n isError: true,\n };\n }\n const cancelled = sessionManager.cancel(input.sessionId, {\n reason: \"Cancelled by caller\",\n source: \"claude_code_session\",\n });\n if (!cancelled) {\n const session = sessionManager.get(input.sessionId);\n if (!session) {\n return {\n sessions: [],\n message: `Error [${ErrorCode.SESSION_NOT_FOUND}]: Session '${input.sessionId}' not found.`,\n isError: true,\n };\n }\n return {\n sessions: [toSessionJson(session)],\n message: `Error [${ErrorCode.INVALID_ARGUMENT}]: Session '${input.sessionId}' is not running (status: ${session.status}).`,\n isError: true,\n };\n }\n const updated = sessionManager.get(input.sessionId);\n return {\n sessions: updated ? [toSessionJson(updated)] : [],\n message: `Session '${input.sessionId}' cancelled.`,\n };\n }\n\n default:\n return {\n sessions: [],\n message: `Error [${ErrorCode.INVALID_ARGUMENT}]: Unknown action '${input.action}'. Use 'list', 'get', or 'cancel'.`,\n isError: true,\n };\n }\n}\n"],"mappings":"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","names":["options","event","sessionId","abortController","options"]}