@leo000001/claude-code-mcp 2.0.3 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +53 -3
- package/CONTRIBUTING.md +10 -1
- package/NOTICE.md +27 -0
- package/README.md +68 -17
- package/SECURITY.md +4 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1204 -376
- package/dist/index.js.map +1 -1
- package/package.json +14 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/server.ts","../src/utils/permission-updated-input.ts","../src/utils/normalize-tool-input.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","../src/resources/register-resources.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 { registerResources } from \"./resources/register-resources.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 registerResources(server, { toolCache });\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","export function normalizePermissionUpdatedInput(input: unknown): Record<string, unknown> {\n if (input && typeof input === \"object\" && !Array.isArray(input)) {\n return input as Record<string, unknown>;\n }\n return { input };\n}\n","function normalizeMsysToWindowsPath(path: string): string | undefined {\n // NOTE: This assumes callers have already confirmed the runtime is Windows.\n // We intentionally do not normalize on non-win32 platforms (e.g. WSL) where\n // `/mnt/c/...` is a real POSIX path.\n // Already a Windows drive path or UNC.\n if (/^[a-zA-Z]:[\\\\/]/.test(path) || path.startsWith(\"\\\\\\\\\")) return undefined;\n\n // MSYS-style UNC: //server/share/path -> \\\\server\\share\\path\n // Guard against accidental matches like //d/... by requiring server name length >= 2.\n if (path.startsWith(\"//\")) {\n const m = path.match(/^\\/\\/([^/]{2,})\\/(.*)$/);\n if (m) {\n const host = m[1]!;\n const rest = m[2] ?? \"\";\n return `\\\\\\\\${host}\\\\${rest.replace(/\\//g, \"\\\\\")}`;\n }\n }\n\n // Cygwin-style: /cygdrive/c/path -> C:\\path\n const cyg = path.match(/^\\/cygdrive\\/([a-zA-Z])\\/(.*)$/);\n if (cyg) {\n const drive = cyg[1]!.toUpperCase();\n const rest = cyg[2] ?? \"\";\n return `${drive}:\\\\${rest.replace(/\\//g, \"\\\\\")}`;\n }\n\n const m = path.match(/^\\/(?:mnt\\/)?([a-zA-Z])\\/(.*)$/);\n if (!m) return undefined;\n const drive = m[1]!.toUpperCase();\n const rest = m[2] ?? \"\";\n return `${drive}:\\\\${rest.replace(/\\//g, \"\\\\\")}`;\n}\n\nexport function normalizeToolInput(\n toolName: string,\n input: Record<string, unknown>,\n platform: NodeJS.Platform = process.platform\n): Record<string, unknown> {\n if (platform !== \"win32\") return input;\n if (toolName !== \"NotebookEdit\") return input;\n\n const filePath = input.file_path;\n if (typeof filePath !== \"string\") return input;\n\n const normalized = normalizeMsysToWindowsPath(filePath);\n if (!normalized) return input;\n\n return { ...input, file_path: normalized };\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\";\nimport { normalizePermissionUpdatedInput } from \"../utils/permission-updated-input.js\";\nimport { normalizeToolInput } from \"../utils/normalize-tool-input.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 private platform: NodeJS.Platform;\n\n constructor(opts?: { platform?: NodeJS.Platform }) {\n this.platform = opts?.platform ?? process.platform;\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 inferredExpiresAt = new Date(Date.now() + timeoutMs).toISOString();\n const record: PermissionRequestRecord = {\n ...req,\n timeoutMs,\n expiresAt: inferredExpiresAt,\n };\n\n const timeoutId = setTimeout(() => {\n this.finishRequest(\n sessionId,\n record.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(record.requestId, { record, finish, timeoutId });\n info.status = \"waiting_permission\";\n info.lastActiveAt = new Date().toISOString();\n\n this.pushEvent(sessionId, {\n type: \"permission_request\",\n data: record,\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 if (finalResult.behavior === \"allow\") {\n const updatedInput = (finalResult as { updatedInput?: unknown }).updatedInput;\n const validRecord =\n updatedInput !== null &&\n updatedInput !== undefined &&\n typeof updatedInput === \"object\" &&\n !Array.isArray(updatedInput);\n if (!validRecord) {\n finalResult = {\n ...finalResult,\n updatedInput: normalizePermissionUpdatedInput(pending.record.input),\n };\n } else {\n // Caller-provided updatedInput should be normalized consistently with our tool input normalization.\n finalResult = {\n ...finalResult,\n updatedInput: normalizeToolInput(\n pending.record.toolName,\n updatedInput as Record<string, unknown>,\n this.platform\n ),\n };\n }\n }\n\n if (pending.timeoutId) clearTimeout(pending.timeoutId);\n state.pendingPermissions.delete(requestId);\n\n const eventData: Record<string, unknown> = {\n requestId,\n toolName: pending.record.toolName,\n behavior: finalResult.behavior,\n source,\n };\n if (finalResult.behavior === \"deny\") {\n eventData.message = finalResult.message;\n eventData.interrupt = finalResult.interrupt;\n }\n\n this.pushEvent(sessionId, {\n type: \"permission_result\",\n data: eventData,\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 /** Timeout for this permission request in milliseconds (informational). */\n timeoutMs?: number;\n /** ISO timestamp when the permission request will auto-deny (informational). */\n expiresAt?: 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 timeoutMs?: number;\n expiresAt?: string;\n /** Best-effort ms remaining until expiresAt (computed at poll time). */\n remainingMs?: number;\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 { normalizePermissionUpdatedInput } from \"../utils/permission-updated-input.js\";\nimport { normalizeToolInput } from \"../utils/normalize-tool-input.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 /** For tests only: override platform-dependent behavior. */\n platform?: NodeJS.Platform;\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 /** For tests only: override platform-dependent behavior. */\n platform?: NodeJS.Platform;\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 const normalizedInput = normalizeToolInput(toolName, input, params.platform);\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 {\n behavior: \"allow\",\n updatedInput: normalizePermissionUpdatedInput(normalizedInput),\n };\n }\n }\n\n const requestId = `${options.toolUseID}:${toolName}:${Date.now()}:${Math.random()\n .toString(16)\n .slice(2)}`;\n const createdAt = new Date().toISOString();\n const timeoutMs = params.permissionRequestTimeoutMs;\n const expiresAt = new Date(Date.now() + timeoutMs).toISOString();\n const record: PermissionRequestRecord = {\n requestId,\n toolName,\n input: normalizedInput,\n summary: summarizePermission(toolName, normalizedInput),\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,\n timeoutMs,\n expiresAt,\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: {\n description:\n \"Read the contents of a file given its path (large files may hit per-call size caps; use offset/limit or Grep chunking).\",\n category: \"file_read\",\n },\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 (replace_all is substring-based).\",\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:\n \"Edit individual cells in Jupyter notebooks (.ipynb files) (expects native Windows paths; this server normalizes /d/... when possible).\",\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 TeamDelete: {\n description:\n \"Delete a team and its resources (may require all active members to shutdown_approved; cleanup may complete asynchronously).\",\n category: \"agent\",\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 \"- Permission prompts auto-deny on timeout; use claude_code_check actions[].expiresAt/remainingMs\\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 \"\\nSecurity: You MUST configure allowedTools/disallowedTools based on your own permission scope. \" +\n \"Only allow tools that you yourself are authorized to perform — \" +\n \"do not grant the agent broader permissions than you have. \" +\n \"For example, if you lack write access to a directory, do not include Write/Edit in allowedTools. \" +\n \"When in doubt, leave both lists empty and review each permission request individually via claude_code_check.\\n\\n\";\n desc +=\n \"Use `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 const expiresMs = req.expiresAt ? Date.parse(req.expiresAt) : Number.NaN;\n const remainingMs = Number.isFinite(expiresMs)\n ? Math.max(0, expiresMs - Date.now())\n : undefined;\n return {\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 timeoutMs: req.timeoutMs,\n expiresAt: req.expiresAt,\n remainingMs,\n };\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","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ReadResourceResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { ToolDiscoveryCache } from \"../tools/tool-discovery.js\";\n\nconst RESOURCE_SCHEME = \"claude-code-mcp\";\n\nconst RESOURCE_URIS = {\n serverInfo: `${RESOURCE_SCHEME}:///server-info`,\n internalTools: `${RESOURCE_SCHEME}:///internal-tools`,\n gotchas: `${RESOURCE_SCHEME}:///gotchas`,\n} as const;\n\nfunction asTextResource(uri: URL, text: string, mimeType: string): ReadResourceResult {\n return {\n contents: [\n {\n uri: uri.toString(),\n text,\n mimeType,\n },\n ],\n };\n}\n\nexport function registerResources(\n server: McpServer,\n deps: { toolCache: ToolDiscoveryCache }\n): void {\n const serverInfoUri = new URL(RESOURCE_URIS.serverInfo);\n server.registerResource(\n \"server_info\",\n serverInfoUri.toString(),\n {\n title: \"Server Info\",\n description: \"Static server metadata (version/platform/runtime).\",\n mimeType: \"application/json\",\n },\n () =>\n asTextResource(\n serverInfoUri,\n JSON.stringify(\n {\n name: \"claude-code-mcp\",\n node: process.version,\n platform: process.platform,\n arch: process.arch,\n resources: Object.values(RESOURCE_URIS),\n toolCatalogCount: deps.toolCache.getTools().length,\n },\n null,\n 2\n ),\n \"application/json\"\n )\n );\n\n const toolsUri = new URL(RESOURCE_URIS.internalTools);\n server.registerResource(\n \"internal_tools\",\n toolsUri.toString(),\n {\n title: \"Internal Tools\",\n description: \"Claude Code internal tool catalog (static + runtime-discovered).\",\n mimeType: \"application/json\",\n },\n () =>\n asTextResource(\n toolsUri,\n JSON.stringify({ tools: deps.toolCache.getTools() }, null, 2),\n \"application/json\"\n )\n );\n\n const gotchasUri = new URL(RESOURCE_URIS.gotchas);\n server.registerResource(\n \"gotchas\",\n gotchasUri.toString(),\n {\n title: \"Gotchas\",\n description: \"Practical limits and gotchas when using Claude Code via this MCP server.\",\n mimeType: \"text/markdown\",\n },\n () =>\n asTextResource(\n gotchasUri,\n [\n \"# claude-code-mcp: gotchas\",\n \"\",\n \"- Permission approvals have a timeout (default 60s) and auto-deny (`actions[].expiresAt`/`remainingMs`).\",\n \"- `Read` has a per-call size cap in practice (often ~256KB); for large files use `offset`/`limit` or chunk with `Grep`.\",\n \"- `Edit` with `replace_all=true` is substring replacement; if no match is found the tool returns an error.\",\n \"- `NotebookEdit` expects native Windows paths; this server normalizes MSYS paths like `/d/...` when possible.\",\n \"- `TeamDelete` may require members to reach `shutdown_approved`; cleanup can be asynchronous during shutdown.\",\n '- Skills may become available later in the same session (early calls may show \"Unknown\").',\n \"- Some internal features (e.g. ToolSearch) may not appear in `availableTools` because it is derived from SDK `system/init.tools`.\",\n \"\",\n ].join(\"\\n\"),\n \"text/markdown\"\n )\n );\n}\n"],"mappings":"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","names":["path","m","rest","drive","options","event","sessionId","abortController","options"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/server.ts","../src/utils/permission-updated-input.ts","../src/utils/normalize-windows-path.ts","../src/utils/normalize-tool-input.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/utils/session-create.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","../src/resources/register-resources.ts","../src/utils/runtime-errors.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 { createServerContext } from \"./server.js\";\nimport { isBenignRuntimeError } from \"./utils/runtime-errors.js\";\nimport { checkWindowsBashAvailability } from \"./utils/windows.js\";\n\nconst STDIN_SHUTDOWN_CHECK_MS = 750;\nconst STDIN_SHUTDOWN_MAX_WAIT_MS = process.platform === \"win32\" ? 15_000 : 10_000;\n\nfunction summarizeSessions(ctx: ReturnType<typeof createServerContext>): {\n total: number;\n running: number;\n waitingPermission: number;\n terminal: number;\n} {\n const sessions = ctx.sessionManager.list();\n const running = sessions.filter((s) => s.status === \"running\").length;\n const waitingPermission = sessions.filter((s) => s.status === \"waiting_permission\").length;\n return {\n total: sessions.length,\n running,\n waitingPermission,\n terminal: sessions.length - running - waitingPermission,\n };\n}\n\nasync function main(): Promise<void> {\n const serverCwd = process.cwd();\n const ctx = createServerContext(serverCwd);\n const server = ctx.server;\n const sessionManager = ctx.sessionManager;\n const transport = new StdioServerTransport();\n\n // Handle graceful shutdown (idempotent)\n let closing = false;\n let lastExitCode = 0;\n let stdinClosedAt: number | undefined;\n let stdinClosedReason: \"end\" | \"close\" | undefined;\n let stdinShutdownTimer: ReturnType<typeof setTimeout> | undefined;\n const onStdinEnd = () => handleStdinTerminated(\"end\");\n const onStdinClose = () => handleStdinTerminated(\"close\");\n\n const clearStdinShutdownTimer = () => {\n if (stdinShutdownTimer) {\n clearTimeout(stdinShutdownTimer);\n stdinShutdownTimer = undefined;\n }\n };\n\n const shutdown = async (reason = \"unknown\") => {\n if (closing) return;\n closing = true;\n clearStdinShutdownTimer();\n if (typeof process.stdin.off === \"function\") {\n process.stdin.off(\"error\", handleStdinError);\n process.stdin.off(\"end\", onStdinEnd);\n process.stdin.off(\"close\", onStdinClose);\n }\n const forceExitMs = process.platform === \"win32\" ? 10_000 : 5_000;\n const forceExitTimer = setTimeout(() => process.exit(lastExitCode), forceExitMs);\n if (forceExitTimer.unref) forceExitTimer.unref();\n const sessionSummary = summarizeSessions(ctx);\n try {\n if (server?.isConnected()) {\n await server.sendLoggingMessage({\n level: \"info\",\n data: { event: \"server_stopping\", reason, ...sessionSummary },\n });\n }\n sessionManager.destroy();\n await server.close();\n } catch {\n // Ignore close errors during shutdown\n }\n process.exitCode = lastExitCode;\n try {\n await new Promise<void>((resolve) => process.stderr.write(\"\", () => resolve()));\n } catch {\n // ignore flush errors\n } finally {\n clearTimeout(forceExitTimer);\n }\n };\n function handleStdinError(error: Error) {\n console.error(\"stdin error:\", error);\n lastExitCode = 1;\n void shutdown(\"stdin_error\");\n }\n\n function hasActiveSessions(): boolean {\n return sessionManager\n .list()\n .some((s) => s.status === \"running\" || s.status === \"waiting_permission\");\n }\n\n const evaluateStdinTermination = () => {\n if (closing || stdinClosedAt === undefined) return;\n\n const stdinUnavailable =\n process.stdin.destroyed || process.stdin.readableEnded || !process.stdin.readable;\n if (!stdinUnavailable) {\n // Defensive: if the stream recovered, drop this shutdown attempt.\n stdinClosedAt = undefined;\n stdinClosedReason = undefined;\n return;\n }\n\n const elapsedMs = Date.now() - stdinClosedAt;\n const active = hasActiveSessions();\n const connected = server.isConnected();\n\n if (!active && !connected) {\n void shutdown(`stdin_${stdinClosedReason ?? \"closed\"}`);\n return;\n }\n\n if (elapsedMs >= STDIN_SHUTDOWN_MAX_WAIT_MS) {\n // Last-resort shutdown: stdio is gone and this process can no longer serve requests.\n void shutdown(`stdin_${stdinClosedReason ?? \"closed\"}_timeout`);\n return;\n }\n\n stdinShutdownTimer = setTimeout(evaluateStdinTermination, STDIN_SHUTDOWN_CHECK_MS);\n if (stdinShutdownTimer.unref) stdinShutdownTimer.unref();\n };\n\n function handleStdinTerminated(event: \"end\" | \"close\") {\n if (closing) return;\n if (stdinClosedAt === undefined) {\n stdinClosedAt = Date.now();\n stdinClosedReason = event;\n console.error(`[lifecycle] stdin ${event} observed; entering guarded shutdown checks`);\n }\n clearStdinShutdownTimer();\n stdinShutdownTimer = setTimeout(evaluateStdinTermination, STDIN_SHUTDOWN_CHECK_MS);\n if (stdinShutdownTimer.unref) stdinShutdownTimer.unref();\n }\n\n const handleUnexpectedError = (error: unknown) => {\n if (isBenignRuntimeError(error)) {\n console.error(\"Ignored benign runtime abort:\", error);\n return;\n }\n console.error(\"Unhandled runtime error:\", error);\n lastExitCode = 1;\n void shutdown(\"runtime_error\");\n };\n process.on(\"SIGINT\", () => {\n void shutdown(\"SIGINT\");\n });\n process.on(\"SIGTERM\", () => {\n void shutdown(\"SIGTERM\");\n });\n process.on(\"SIGHUP\", () => {\n void shutdown(\"SIGHUP\");\n });\n process.on(\"beforeExit\", () => {\n void shutdown(\"beforeExit\");\n });\n process.on(\"uncaughtException\", handleUnexpectedError);\n process.on(\"unhandledRejection\", handleUnexpectedError);\n // Windows console: Ctrl+Break emits SIGBREAK (unsupported on POSIX).\n if (process.platform === \"win32\") {\n process.on(\"SIGBREAK\", () => {\n void shutdown(\"SIGBREAK\");\n });\n }\n if (typeof process.stdin.resume === \"function\") {\n process.stdin.resume();\n }\n // Keep stdin in Buffer mode for MCP stdio framing.\n // Setting stdin encoding would convert chunks to strings and break the transport parser.\n process.stdin.on(\"error\", handleStdinError);\n // Guarded shutdown: some clients can transiently trigger stdio close-like signals.\n // We only exit after checking connection/session state.\n process.stdin.on(\"end\", onStdinEnd);\n process.stdin.on(\"close\", onStdinClose);\n\n await server.connect(transport);\n server.sendToolListChanged();\n server.sendResourceListChanged();\n\n // Check Windows bash.exe availability and warn early\n checkWindowsBashAvailability();\n\n // Log to MCP notifications (and stderr as a fallback).\n try {\n if (transport && server) {\n await server.sendLoggingMessage({\n level: \"info\",\n data: { event: \"server_started\", cwd: serverCwd },\n });\n }\n } catch {\n // ignore logging failures (client may not support logging)\n }\n console.error(`claude-code-mcp server started (transport=stdio, 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 { registerResources } from \"./resources/register-resources.js\";\nimport {\n EFFORT_LEVELS,\n AGENT_MODELS,\n CHECK_ACTIONS,\n CHECK_RESPONSE_MODES,\n SESSION_ACTIONS,\n ErrorCode as LocalErrorCode,\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 createServerContext(serverCwd: string): {\n server: McpServer;\n sessionManager: SessionManager;\n toolCache: ToolDiscoveryCache;\n} {\n const sessionManager = new SessionManager();\n\n const server = new McpServer(\n {\n name: \"claude-code-mcp\",\n version: SERVER_VERSION,\n title: \"Claude Code MCP\",\n description:\n \"MCP server that runs Claude Code via the Claude Agent SDK with async polling and interactive permissions.\",\n websiteUrl: \"https://github.com/xihuai18/claude-code-mcp\",\n icons: [],\n },\n {\n capabilities: {\n logging: {},\n tools: { listChanged: true },\n resources: { listChanged: true },\n },\n }\n );\n\n // Dynamic tool catalog cache + dynamic claude_code tool description updates.\n // `server.tool(...)` returns a RegisteredTool with an `update()` method.\n const claudeCodeToolRef: {\n current?: { update: (updates: { description?: string }) => void };\n } = {};\n const toolCache = new ToolDiscoveryCache(undefined, (tools) => {\n try {\n claudeCodeToolRef.current?.update({ description: buildInternalToolsDescription(tools) });\n if (server.isConnected()) {\n server.sendToolListChanged();\n }\n } catch {\n // ignore update errors\n }\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().describe(\"Default: inherit\"),\n disallowedTools: z.array(z.string()).optional().describe(\"Default: none\"),\n model: z.enum(AGENT_MODELS).optional().describe(\"Default: inherit\"),\n maxTurns: z.number().int().positive().optional().describe(\"Default: none\"),\n mcpServers: z\n .array(z.union([z.string(), z.record(z.string(), z.unknown())]))\n .optional()\n .describe(\"Default: inherit\"),\n skills: z.array(z.string()).optional().describe(\"Default: none\"),\n criticalSystemReminder_EXPERIMENTAL: z.string().optional().describe(\"Default: none\"),\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(\"Default: none\"),\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 effortOptionSchema = z.enum(EFFORT_LEVELS).optional();\n const thinkingOptionSchema = thinkingSchema.optional();\n\n const outputFormatSchema = z.object({\n type: z.literal(\"json_schema\"),\n schema: z.record(z.string(), z.unknown()),\n });\n\n const sharedOptionFieldsSchemaShape = {\n tools: toolsConfigSchema.optional().describe(\"Tool set. Default: SDK\"),\n persistSession: z.boolean().optional().describe(\"Default: true\"),\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 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 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.boolean().optional().describe(\"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\"),\n debug: z.boolean().optional().describe(\"Default: false\"),\n debugFile: z.string().optional().describe(\"Default: none\"),\n env: z.record(z.string(), z.string().optional()).optional().describe(\"Default: none\"),\n } as const;\n\n const advancedOptionFieldsSchemaShape = {\n ...sharedOptionFieldsSchemaShape,\n effort: effortOptionSchema.describe(\"Deprecated, use top-level. Default: SDK\"),\n thinking: thinkingOptionSchema.describe(\"Deprecated, use top-level. Default: SDK\"),\n } as const;\n\n const diskResumeOptionFieldsSchemaShape = {\n ...sharedOptionFieldsSchemaShape,\n effort: effortOptionSchema.describe(\"Default: SDK\"),\n thinking: thinkingOptionSchema.describe(\"Default: SDK\"),\n } as const;\n\n /** Advanced options shared by claude_code (and reused in diskResumeConfig). */\n const advancedOptionsSchema = z\n .object({\n ...advancedOptionFieldsSchemaShape,\n sessionInitTimeoutMs: z.number().int().positive().optional().describe(\"Default: 10000\"),\n })\n .optional()\n .describe(\"Default: none\");\n\n const diskResumeConfigSchema = z\n .object({\n resumeToken: z.string(),\n cwd: z.string(),\n allowedTools: z.array(z.string()).optional().describe(\"Default: []\"),\n disallowedTools: z.array(z.string()).optional().describe(\"Default: []\"),\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 resumeSessionAt: z.string().optional().describe(\"Default: none\"),\n ...diskResumeOptionFieldsSchemaShape,\n })\n .optional()\n .describe(\"Default: none\");\n\n const startResultSchema = z\n .object({\n sessionId: z.string(),\n status: z.enum([\"running\", \"error\"]),\n pollInterval: z.number().optional(),\n resumeToken: z.string().optional(),\n compatWarnings: z.array(z.string()).optional(),\n error: z.string().optional(),\n })\n .passthrough();\n\n const sessionResultSchema = z\n .object({\n sessions: z.array(z.record(z.string(), z.unknown())),\n message: z.string().optional(),\n isError: z.boolean().optional(),\n })\n .passthrough();\n\n const checkEventSchema = z\n .object({\n id: z.number().int().nonnegative(),\n type: z.string(),\n data: z.unknown(),\n timestamp: z.string(),\n })\n .passthrough();\n\n const checkActionSchema = z\n .object({\n type: z.string(),\n requestId: z.string().optional(),\n toolName: z.string().optional(),\n input: z.record(z.string(), z.unknown()).optional(),\n summary: z.string().optional(),\n })\n .passthrough();\n\n const checkResultSchema = z\n .object({\n sessionId: z.string(),\n status: z.string(),\n pollInterval: z.number().optional(),\n cursorResetTo: z.number().optional(),\n truncated: z.boolean().optional(),\n truncatedFields: z.array(z.string()).optional(),\n events: z.array(checkEventSchema),\n nextCursor: z.number().optional(),\n availableTools: z.array(z.record(z.string(), z.unknown())).optional(),\n toolValidation: z\n .object({\n runtimeToolsKnown: z.boolean(),\n unknownAllowedTools: z.array(z.string()),\n unknownDisallowedTools: z.array(z.string()),\n })\n .optional(),\n compatWarnings: z.array(z.string()).optional(),\n actions: z.array(checkActionSchema).optional(),\n result: z.unknown().optional(),\n cancelledAt: z.string().optional(),\n cancelledReason: z.string().optional(),\n cancelledSource: z.string().optional(),\n lastEventId: z.number().optional(),\n lastToolUseId: z.string().optional(),\n isError: z.boolean().optional(),\n error: z.string().optional(),\n })\n .passthrough();\n\n // Tool 1: claude_code - Start a new agent session\n claudeCodeToolRef.current = server.registerTool(\n \"claude_code\",\n {\n description: buildInternalToolsDescription(toolCache.getTools()),\n inputSchema: {\n prompt: z.string().describe(\"Prompt\"),\n cwd: z.string().optional().describe(\"Working dir. Default: server cwd\"),\n allowedTools: z.array(z.string()).optional().describe(\"Default: []\"),\n disallowedTools: z.array(z.string()).optional().describe(\"Default: []\"),\n maxTurns: z.number().int().positive().optional().describe(\"Default: SDK\"),\n model: z.string().optional().describe(\"Default: SDK\"),\n effort: effortOptionSchema.describe(\"Default: SDK\"),\n thinking: thinkingOptionSchema.describe(\"Default: SDK\"),\n systemPrompt: systemPromptSchema.optional().describe(\"Default: SDK\"),\n permissionRequestTimeoutMs: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"Default: 60000\"),\n sessionInitTimeoutMs: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"Deprecated, use advanced.sessionInitTimeoutMs. Default: 10000\"),\n advanced: advancedOptionsSchema,\n },\n outputSchema: startResultSchema,\n annotations: {\n readOnlyHint: false,\n destructiveHint: true,\n idempotentHint: false,\n openWorldHint: true,\n },\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 structuredContent: result as unknown as Record<string, unknown>,\n isError,\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n const errorResult = {\n sessionId: \"\",\n status: \"error\" as const,\n error: `Error [${LocalErrorCode.INTERNAL}]: ${message}`,\n };\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify(errorResult, null, 2),\n },\n ],\n structuredContent: errorResult as unknown as Record<string, unknown>,\n isError: true,\n };\n }\n }\n );\n\n // Tool 2: claude_code_reply - Continue an existing session\n server.registerTool(\n \"claude_code_reply\",\n {\n description:\n \"Send a follow-up to an existing session. Returns immediately; use claude_code_check to poll.\",\n inputSchema: {\n sessionId: z.string().describe(\"Session ID\"),\n prompt: z.string().describe(\"Prompt\"),\n forkSession: z.boolean().optional().describe(\"Default: false\"),\n effort: effortOptionSchema.describe(\"Default: SDK\"),\n thinking: thinkingOptionSchema.describe(\"Default: SDK\"),\n sessionInitTimeoutMs: z.number().int().positive().optional().describe(\"Default: 10000\"),\n permissionRequestTimeoutMs: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"Default: 60000\"),\n diskResumeConfig: diskResumeConfigSchema,\n },\n outputSchema: startResultSchema,\n annotations: {\n readOnlyHint: false,\n destructiveHint: true,\n idempotentHint: false,\n openWorldHint: true,\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 structuredContent: result as unknown as Record<string, unknown>,\n isError,\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n const errorResult = {\n sessionId: \"\",\n status: \"error\" as const,\n error: `Error [${LocalErrorCode.INTERNAL}]: ${message}`,\n };\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify(errorResult, null, 2),\n },\n ],\n structuredContent: errorResult as unknown as Record<string, unknown>,\n isError: true,\n };\n }\n }\n );\n\n // Tool 3: claude_code_session - Manage sessions\n server.registerTool(\n \"claude_code_session\",\n {\n description: \"List, inspect, or cancel sessions.\",\n inputSchema: {\n action: z.enum(SESSION_ACTIONS),\n sessionId: z.string().optional().describe(\"Required for get/cancel\"),\n includeSensitive: z.boolean().optional().describe(\"Default: false\"),\n },\n outputSchema: sessionResultSchema,\n annotations: {\n readOnlyHint: false,\n destructiveHint: true,\n idempotentHint: false,\n openWorldHint: false,\n },\n },\n async (args, extra) => {\n try {\n const result = executeClaudeCodeSession(args, sessionManager, extra.signal);\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n structuredContent: result as unknown as Record<string, unknown>,\n isError: result.isError ?? false,\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n const errorResult = {\n sessions: [],\n message: `Error [${LocalErrorCode.INTERNAL}]: ${message}`,\n isError: true,\n };\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify(errorResult, null, 2),\n },\n ],\n structuredContent: errorResult as unknown as Record<string, unknown>,\n isError: true,\n };\n }\n }\n );\n\n // Tool 4: claude_code_check - Poll events + respond to permission requests\n server.registerTool(\n \"claude_code_check\",\n {\n description: \"Poll session events or respond to permission requests.\",\n inputSchema: {\n action: z.enum(CHECK_ACTIONS),\n sessionId: z.string().describe(\"Session ID\"),\n cursor: z.number().int().nonnegative().optional().describe(\"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(\"Default: 200 (minimal), unlimited (full)\"),\n\n requestId: z.string().optional().describe(\"Permission request ID\"),\n decision: z.enum([\"allow\", \"deny\"]).optional().describe(\"Decision\"),\n denyMessage: z.string().optional().describe(\"Default: 'Permission denied by caller'\"),\n interrupt: z.boolean().optional().describe(\"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 maxBytes: z.number().int().positive().optional().describe(\"Default: unlimited\"),\n })\n .optional()\n .describe(\"Default: none\"),\n\n permissionOptions: z\n .object({\n updatedInput: z.record(z.string(), z.unknown()).optional().describe(\"Default: none\"),\n updatedPermissions: z\n .array(z.record(z.string(), z.unknown()))\n .optional()\n .describe(\"Default: none\"),\n })\n .optional()\n .describe(\"Default: none\"),\n },\n outputSchema: checkResultSchema,\n annotations: {\n readOnlyHint: false,\n destructiveHint: true,\n idempotentHint: false,\n openWorldHint: false,\n },\n },\n async (args, extra) => {\n try {\n const result = executeClaudeCodeCheck(args, sessionManager, toolCache, extra.signal);\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 structuredContent: result as unknown as Record<string, unknown>,\n isError,\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n const errorResult = {\n sessionId: args.sessionId ?? \"\",\n status: \"error\",\n events: [] as unknown[],\n isError: true,\n error: `Error [${LocalErrorCode.INTERNAL}]: ${message}`,\n };\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify(errorResult, null, 2),\n },\n ],\n structuredContent: errorResult as unknown as Record<string, unknown>,\n isError: true,\n };\n }\n }\n );\n\n registerResources(server, { toolCache });\n\n return { server, sessionManager, toolCache };\n}\n\nexport function createServer(serverCwd: string): McpServer {\n return createServerContext(serverCwd).server;\n}\n","export function normalizePermissionUpdatedInput(input: unknown): Record<string, unknown> {\n if (input && typeof input === \"object\" && !Array.isArray(input)) {\n return input as Record<string, unknown>;\n }\n return { input };\n}\n","import path from \"node:path\";\nimport os from \"node:os\";\n\nfunction maybeAddWindowsLongPathPrefix(value: string): string {\n if (value.startsWith(\"\\\\\\\\?\\\\\") || value.startsWith(\"\\\\\\\\.\\\\\") || value.length < 240)\n return value;\n return path.win32.toNamespacedPath(value);\n}\n\nfunction expandTilde(value: string, platform: NodeJS.Platform): string {\n if (value === \"~\") return os.homedir();\n if (!value.startsWith(\"~\")) return value;\n const next = value[1];\n if (next !== \"/\" && next !== \"\\\\\") return value;\n const rest = value.slice(2);\n const join = platform === \"win32\" ? path.win32.join : path.posix.join;\n return join(os.homedir(), rest);\n}\n\nfunction normalizeMsysToWindowsPathInner(rawPath: string): string | undefined {\n // NOTE: This assumes callers have already confirmed the runtime is Windows.\n // We intentionally do not normalize on non-win32 platforms (e.g. WSL) where\n // `/mnt/c/...` can be a real POSIX path.\n //\n // Already a Windows drive path or UNC.\n if (/^[a-zA-Z]:[\\\\/]/.test(rawPath) || rawPath.startsWith(\"\\\\\\\\\")) return undefined;\n\n // MSYS-style UNC: //server/share/path -> \\\\server\\share\\path\n // Guard against accidental matches like //d/... by requiring server name length >= 2.\n if (rawPath.startsWith(\"//\")) {\n const m = rawPath.match(/^\\/\\/([^/]{2,})\\/(.*)$/);\n if (m) {\n const host = m[1]!;\n const rest = m[2] ?? \"\";\n return `\\\\\\\\${host}\\\\${rest.replace(/\\//g, \"\\\\\")}`;\n }\n }\n\n // Cygwin-style: /cygdrive/c/path -> C:\\path\n const cyg = rawPath.match(/^\\/cygdrive\\/([a-zA-Z])\\/(.*)$/);\n if (cyg) {\n const drive = cyg[1]!.toUpperCase();\n const rest = cyg[2] ?? \"\";\n return `${drive}:\\\\${rest.replace(/\\//g, \"\\\\\")}`;\n }\n\n // MSYS/WSL-style: /c/path or /mnt/c/path -> C:\\path\n const m = rawPath.match(/^\\/(?:mnt\\/)?([a-zA-Z])\\/(.*)$/);\n if (!m) return undefined;\n const drive = m[1]!.toUpperCase();\n const rest = m[2] ?? \"\";\n return `${drive}:\\\\${rest.replace(/\\//g, \"\\\\\")}`;\n}\n\nexport function normalizeMsysToWindowsPath(rawPath: string): string | undefined {\n const converted = normalizeMsysToWindowsPathInner(rawPath);\n if (!converted) return undefined;\n return path.win32.normalize(converted);\n}\n\nexport function normalizeWindowsPathLike(\n value: string,\n platform: NodeJS.Platform = process.platform\n): string {\n const expanded = expandTilde(value, platform);\n if (platform !== \"win32\") return expanded;\n const converted = normalizeMsysToWindowsPath(expanded);\n // If we didn't actually convert anything, avoid treating POSIX-style absolute paths\n // (e.g. \"/extra\" or \"//d/path\") as Windows-rooted or UNC paths.\n if (!converted && expanded.startsWith(\"/\")) return expanded;\n const normalized = path.win32.normalize(converted ?? expanded);\n return maybeAddWindowsLongPathPrefix(normalized);\n}\n\nexport function normalizeWindowsPathArray(\n values: string[],\n platform: NodeJS.Platform = process.platform\n): string[] {\n return values.map((v) => normalizeWindowsPathLike(v, platform));\n}\n","import { normalizeWindowsPathLike } from \"./normalize-windows-path.js\";\n\nexport function normalizeToolInput(\n _toolName: string,\n input: Record<string, unknown>,\n platform: NodeJS.Platform = process.platform\n): Record<string, unknown> {\n if (platform !== \"win32\") return input;\n\n const filePath = input.file_path;\n if (typeof filePath !== \"string\") return input;\n\n const normalized = normalizeWindowsPathLike(filePath, platform);\n return normalized === filePath ? input : { ...input, file_path: normalized };\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\";\nimport { normalizePermissionUpdatedInput } from \"../utils/permission-updated-input.js\";\nimport { normalizeToolInput } from \"../utils/normalize-tool-input.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;\nconst DEFAULT_MAX_SESSIONS = 128;\nconst DEFAULT_MAX_PENDING_PERMISSIONS_PER_SESSION = 64;\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 drainingSessions = new Map<string, number>();\n private cleanupTimer: ReturnType<typeof setInterval>;\n private sessionTtlMs = DEFAULT_SESSION_TTL_MS;\n private runningSessionMaxMs = DEFAULT_RUNNING_SESSION_MAX_MS;\n private platform: NodeJS.Platform;\n private maxSessions: number;\n private maxPendingPermissionsPerSession: number;\n\n constructor(opts?: {\n platform?: NodeJS.Platform;\n maxSessions?: number;\n maxPendingPermissionsPerSession?: number;\n }) {\n this.platform = opts?.platform ?? process.platform;\n const envRaw = process.env.CLAUDE_CODE_MCP_MAX_SESSIONS;\n const envParsed =\n typeof envRaw === \"string\" && envRaw.trim() !== \"\" ? Number.parseInt(envRaw, 10) : NaN;\n const configured = opts?.maxSessions ?? (Number.isFinite(envParsed) ? envParsed : undefined);\n this.maxSessions =\n typeof configured === \"number\"\n ? configured <= 0\n ? Number.POSITIVE_INFINITY\n : configured\n : DEFAULT_MAX_SESSIONS;\n\n const maxPendingEnvRaw = process.env.CLAUDE_CODE_MCP_MAX_PENDING_PERMISSIONS;\n const maxPendingEnvParsed =\n typeof maxPendingEnvRaw === \"string\" && maxPendingEnvRaw.trim() !== \"\"\n ? Number.parseInt(maxPendingEnvRaw, 10)\n : NaN;\n const maxPendingConfigured =\n opts?.maxPendingPermissionsPerSession ??\n (Number.isFinite(maxPendingEnvParsed) ? maxPendingEnvParsed : undefined);\n this.maxPendingPermissionsPerSession =\n typeof maxPendingConfigured === \"number\"\n ? maxPendingConfigured <= 0\n ? Number.POSITIVE_INFINITY\n : maxPendingConfigured\n : DEFAULT_MAX_PENDING_PERMISSIONS_PER_SESSION;\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 getSessionCount(): number {\n return this.sessions.size;\n }\n\n getMaxSessions(): number {\n return this.maxSessions;\n }\n\n getMaxPendingPermissionsPerSession(): number {\n return this.maxPendingPermissionsPerSession;\n }\n\n hasCapacityFor(additionalSessions: number): boolean {\n if (additionalSessions <= 0) return true;\n return this.sessions.size + additionalSessions <= this.maxSessions;\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 // `cancel()` already aborts the running query below. Avoid sending an additional\n // interrupt=true control response while the stream is being torn down, which can race\n // into SDK-level \"Operation aborted\" write errors on stdio clients.\n { behavior: \"deny\", message: \"Session cancelled\", interrupt: false },\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 { restoreRunning: false }\n );\n this.drainingSessions.delete(sessionId);\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 if (info.status !== \"running\" && info.status !== \"waiting_permission\") {\n try {\n finish({\n behavior: \"deny\",\n message: `Session is not accepting permission requests (status: ${info.status}).`,\n interrupt: true,\n });\n } catch {\n // ignore finish errors\n }\n return false;\n }\n if (this.isDraining(sessionId)) {\n try {\n finish({\n behavior: \"deny\",\n message: \"Session is finishing pending permission requests.\",\n interrupt: true,\n });\n } catch {\n // ignore finish errors\n }\n return false;\n }\n\n if (!state.pendingPermissions.has(req.requestId)) {\n if (state.pendingPermissions.size >= this.maxPendingPermissionsPerSession) {\n const deny: PermissionResult = {\n behavior: \"deny\",\n message: \"Too many pending permission requests for this session.\",\n interrupt: false,\n };\n this.pushEvent(sessionId, {\n type: \"permission_result\",\n data: {\n requestId: req.requestId,\n toolName: req.toolName,\n behavior: \"deny\",\n source: \"policy\",\n message: deny.message,\n interrupt: deny.interrupt,\n },\n timestamp: new Date().toISOString(),\n });\n try {\n finish(deny);\n } catch {\n // ignore finish errors\n }\n return false;\n }\n const inferredExpiresAt = new Date(Date.now() + timeoutMs).toISOString();\n const record: PermissionRequestRecord = {\n ...req,\n timeoutMs,\n expiresAt: inferredExpiresAt,\n };\n\n const timeoutId = setTimeout(() => {\n this.finishRequest(\n sessionId,\n record.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(record.requestId, { record, finish, timeoutId });\n info.status = \"waiting_permission\";\n info.lastActiveAt = new Date().toISOString();\n\n this.pushEvent(sessionId, {\n type: \"permission_request\",\n data: record,\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 if (finalResult.behavior === \"allow\") {\n const updatedInput = (finalResult as { updatedInput?: unknown }).updatedInput;\n const validRecord =\n updatedInput !== null &&\n updatedInput !== undefined &&\n typeof updatedInput === \"object\" &&\n !Array.isArray(updatedInput);\n if (!validRecord) {\n finalResult = {\n ...finalResult,\n updatedInput: normalizePermissionUpdatedInput(pending.record.input),\n };\n } else {\n // Caller-provided updatedInput should be normalized consistently with our tool input normalization.\n finalResult = {\n ...finalResult,\n updatedInput: normalizeToolInput(\n pending.record.toolName,\n updatedInput as Record<string, unknown>,\n this.platform\n ),\n };\n }\n }\n\n if (pending.timeoutId) clearTimeout(pending.timeoutId);\n state.pendingPermissions.delete(requestId);\n\n const eventData: Record<string, unknown> = {\n requestId,\n toolName: pending.record.toolName,\n behavior: finalResult.behavior,\n source,\n };\n if (finalResult.behavior === \"deny\") {\n eventData.message = finalResult.message;\n eventData.interrupt = finalResult.interrupt;\n } else {\n const allow = finalResult as Record<string, unknown>;\n if (allow.updatedInput !== undefined) eventData.updatedInput = allow.updatedInput;\n if (allow.updatedPermissions !== undefined)\n eventData.updatedPermissions = allow.updatedPermissions;\n }\n\n this.pushEvent(sessionId, {\n type: \"permission_result\",\n data: eventData,\n timestamp: new Date().toISOString(),\n });\n\n try {\n pending.finish(finalResult);\n } catch {\n // ignore finish errors\n }\n\n if (\n info.status === \"waiting_permission\" &&\n state.pendingPermissions.size === 0 &&\n !this.isDraining(sessionId)\n ) {\n info.status = \"running\";\n info.lastActiveAt = new Date().toISOString();\n }\n\n return true;\n }\n\n finishAllPending(\n sessionId: string,\n result: PermissionResult,\n source: FinishSource,\n opts?: { restoreRunning?: boolean }\n ): void {\n const state = this.runtime.get(sessionId);\n if (!state) return;\n if (state.pendingPermissions.size === 0) return;\n\n this.beginDraining(sessionId);\n try {\n // Drain until empty so requests created during finish callbacks are also resolved.\n while (state.pendingPermissions.size > 0) {\n const next = state.pendingPermissions.keys().next();\n if (next.done || typeof next.value !== \"string\") break;\n\n const requestId = next.value;\n const handled = this.finishRequest(sessionId, requestId, result, source);\n if (!handled) {\n const pending = state.pendingPermissions.get(requestId);\n if (pending?.timeoutId) clearTimeout(pending.timeoutId);\n state.pendingPermissions.delete(requestId);\n try {\n pending?.finish(result);\n } catch {\n // ignore finish errors\n }\n }\n }\n } finally {\n this.endDraining(sessionId);\n }\n\n const restoreRunning = opts?.restoreRunning ?? true;\n const info = this.sessions.get(sessionId);\n if (\n restoreRunning &&\n info &&\n info.status === \"waiting_permission\" &&\n state.pendingPermissions.size === 0\n ) {\n info.status = \"running\";\n info.lastActiveAt = new Date().toISOString();\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 { restoreRunning: false }\n );\n // Invalid timestamp — remove the session\n this.drainingSessions.delete(id);\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.cancelledAt = info.cancelledAt ?? new Date().toISOString();\n info.cancelledReason = info.cancelledReason ?? \"Session timed out\";\n info.cancelledSource = info.cancelledSource ?? \"cleanup\";\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 { restoreRunning: false }\n );\n if (info.abortController) info.abortController.abort();\n info.cancelledAt = info.cancelledAt ?? new Date().toISOString();\n info.cancelledReason = info.cancelledReason ?? \"Session timed out\";\n info.cancelledSource = info.cancelledSource ?? \"cleanup\";\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 { restoreRunning: false }\n );\n this.drainingSessions.delete(id);\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 { restoreRunning: false }\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 private isDraining(sessionId: string): boolean {\n return (this.drainingSessions.get(sessionId) ?? 0) > 0;\n }\n\n private beginDraining(sessionId: string): void {\n this.drainingSessions.set(sessionId, (this.drainingSessions.get(sessionId) ?? 0) + 1);\n }\n\n private endDraining(sessionId: string): void {\n const current = this.drainingSessions.get(sessionId) ?? 0;\n if (current <= 1) {\n this.drainingSessions.delete(sessionId);\n return;\n }\n this.drainingSessions.set(sessionId, current - 1);\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 /** Timeout for this permission request in milliseconds (informational). */\n timeoutMs?: number;\n /** ISO timestamp when the permission request will auto-deny (informational). */\n expiresAt?: string;\n}\n\nexport type FinishFn = (result: PermissionResult) => void;\n\nexport type FinishSource =\n | \"respond\"\n | \"timeout\"\n | \"cancel\"\n | \"cleanup\"\n | \"destroy\"\n | \"signal\"\n | \"policy\";\n\nexport interface SessionStartResult {\n sessionId: string;\n status: \"running\";\n pollInterval: number;\n resumeToken?: string;\n compatWarnings?: 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 toolValidation?: {\n runtimeToolsKnown: boolean;\n unknownAllowedTools: string[];\n unknownDisallowedTools: string[];\n };\n compatWarnings?: string[];\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 timeoutMs?: number;\n expiresAt?: string;\n /** Best-effort ms remaining until expiresAt (computed at poll time). */\n remainingMs?: number;\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 RESOURCE_EXHAUSTED = \"RESOURCE_EXHAUSTED\",\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 { normalizePermissionUpdatedInput } from \"../utils/permission-updated-input.js\";\nimport { normalizeToolInput } from \"../utils/normalize-tool-input.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\nconst DEFAULT_PERMISSION_REQUEST_TIMEOUT_MS = 60_000;\nexport const MAX_PERMISSION_REQUEST_TIMEOUT_MS = 5 * 60_000;\n\nexport const MAX_PREINIT_BUFFER_MESSAGES = 200;\n\nexport type ErrorClass = \"abort\" | \"transient\" | \"fatal\";\n\nexport function clampPermissionRequestTimeoutMs(ms: number): number {\n if (!Number.isFinite(ms) || ms <= 0) return DEFAULT_PERMISSION_REQUEST_TIMEOUT_MS;\n return Math.min(ms, MAX_PERMISSION_REQUEST_TIMEOUT_MS);\n}\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 /** For tests only: override platform-dependent behavior. */\n platform?: NodeJS.Platform;\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 /** For tests only: override platform-dependent behavior. */\n platform?: NodeJS.Platform;\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 sessionTotalTurns = (result as unknown as { session_total_turns?: unknown })\n .session_total_turns;\n const sessionTotalCostUsd = (result as unknown as { session_total_cost_usd?: unknown })\n .session_total_cost_usd;\n\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 sessionTotalTurns: typeof sessionTotalTurns === \"number\" ? sessionTotalTurns : undefined,\n sessionTotalCostUsd: typeof sessionTotalCostUsd === \"number\" ? sessionTotalCostUsd : undefined,\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 const permissionRequestTimeoutMs = clampPermissionRequestTimeoutMs(\n params.permissionRequestTimeoutMs\n );\n\n const canUseTool: CanUseTool = async (toolName, input, options) => {\n const sessionId = await getSessionId();\n const normalizedInput = normalizeToolInput(toolName, input, params.platform);\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 {\n behavior: \"allow\",\n updatedInput: normalizePermissionUpdatedInput(normalizedInput),\n };\n }\n }\n\n const requestId = `${options.toolUseID}:${toolName}:${Date.now()}:${Math.random()\n .toString(16)\n .slice(2)}`;\n const createdAt = new Date().toISOString();\n const timeoutMs = permissionRequestTimeoutMs;\n const expiresAt = new Date(Date.now() + timeoutMs).toISOString();\n const record: PermissionRequestRecord = {\n requestId,\n toolName,\n input: normalizedInput,\n summary: summarizePermission(toolName, normalizedInput),\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,\n timeoutMs,\n expiresAt,\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 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({\n behavior: \"deny\",\n message: \"Session no longer exists.\",\n interrupt: true,\n });\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 let preInitDropped = 0;\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 if (preInitDropped > 0) {\n params.sessionManager.pushEvent(activeSessionId, {\n type: \"progress\",\n data: { type: \"pre_init_dropped\", dropped: preInitDropped },\n timestamp: new Date().toISOString(),\n });\n }\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 if (preInit.length > MAX_PREINIT_BUFFER_MESSAGES) {\n preInit.shift();\n preInitDropped++;\n }\n continue;\n }\n\n if (message.type === \"result\") {\n const sessionId = message.session_id ?? (await getSessionId());\n const agentResult = sdkResultToAgentResult(message);\n const current = params.sessionManager.get(sessionId);\n const previousTotalTurns = current?.totalTurns ?? 0;\n const previousTotalCostUsd = current?.totalCostUsd ?? 0;\n const computedTotalTurns = previousTotalTurns + agentResult.numTurns;\n const computedTotalCostUsd = previousTotalCostUsd + agentResult.totalCostUsd;\n const sessionTotalTurns =\n typeof agentResult.sessionTotalTurns === \"number\"\n ? Math.max(agentResult.sessionTotalTurns, computedTotalTurns)\n : computedTotalTurns;\n const sessionTotalCostUsd =\n typeof agentResult.sessionTotalCostUsd === \"number\"\n ? Math.max(agentResult.sessionTotalCostUsd, computedTotalCostUsd)\n : computedTotalCostUsd;\n const resultWithSessionTotals: AgentResult = {\n ...agentResult,\n sessionTotalTurns,\n sessionTotalCostUsd,\n };\n const stored: StoredAgentResult = {\n type: agentResult.isError ? \"error\" : \"result\",\n result: resultWithSessionTotals,\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: resultWithSessionTotals,\n timestamp: new Date().toISOString(),\n });\n\n if (current && current.status !== \"cancelled\") {\n params.sessionManager.update(sessionId, {\n status: agentResult.isError ? \"error\" : \"idle\",\n totalTurns: sessionTotalTurns,\n totalCostUsd: sessionTotalCostUsd,\n abortController: undefined,\n });\n } else if (current) {\n params.sessionManager.update(sessionId, {\n totalTurns: sessionTotalTurns,\n totalCostUsd: sessionTotalCostUsd,\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, isAbsolute } = path.win32;\nconst LONG_PATH_PREFIX = \"\\\\\\\\?\\\\\";\nconst UNC_LONG_PATH_PREFIX = \"\\\\\\\\?\\\\UNC\\\\\";\n\nexport function isWindows(): boolean {\n return process.platform === \"win32\";\n}\n\nfunction normalizeMaybeQuotedPath(raw: string): string {\n return normalize(raw.trim().replace(/^\"|\"$/g, \"\"));\n}\n\nfunction existsSyncSafe(candidate: string): boolean {\n try {\n return existsSync(candidate);\n } catch {\n return false;\n }\n}\n\nfunction ensureLongPathPrefix(normalized: string): string {\n if (!normalized || normalized.startsWith(LONG_PATH_PREFIX)) return normalized;\n if (!isAbsolute(normalized)) return normalized;\n if (normalized.startsWith(\"\\\\\\\\\")) {\n return `${UNC_LONG_PATH_PREFIX}${normalized.slice(2)}`;\n }\n return `${LONG_PATH_PREFIX}${normalized}`;\n}\n\nfunction existsPath(raw?: string): boolean {\n if (!raw) return false;\n const normalized = normalizeMaybeQuotedPath(raw);\n if (existsSyncSafe(normalized)) return true;\n const longPath = ensureLongPathPrefix(normalized);\n if (longPath === normalized) return false;\n return existsSyncSafe(longPath);\n}\n\nfunction tryWhere(exe: string): string[] {\n try {\n const output = execSync(`where ${exe}`, {\n encoding: \"utf8\",\n timeout: 2000,\n windowsHide: true,\n });\n return output\n .split(/\\r?\\n/)\n .map((l) => l.trim())\n .filter(Boolean)\n .map((p) => normalizeMaybeQuotedPath(p));\n } catch {\n return [];\n }\n}\n\nfunction pathEntries(): string[] {\n const raw = process.env.PATH;\n if (typeof raw !== \"string\" || raw.trim() === \"\") return [];\n return raw\n .split(path.delimiter)\n .map((p) => p.trim().replace(/^\"|\"$/g, \"\"))\n .filter(Boolean)\n .map((p) => normalizeMaybeQuotedPath(p));\n}\n\nfunction tryFromPath(exeNames: string[]): string[] {\n const results: string[] = [];\n for (const dir of pathEntries()) {\n for (const exe of exeNames) {\n const full = normalize(path.win32.join(dir, exe));\n if (existsPath(full)) results.push(full);\n }\n }\n return results;\n}\n\nfunction firstExisting(candidates: string[]): string | null {\n for (const p of candidates) {\n if (p && existsPath(p)) return p;\n }\n return null;\n}\n\nfunction isWindowsSystemBash(pathLike: string): boolean {\n const p = normalizeMaybeQuotedPath(pathLike).toLowerCase();\n return (\n p.endsWith(\"\\\\windows\\\\system32\\\\bash.exe\") ||\n p.endsWith(\"\\\\windows\\\\syswow64\\\\bash.exe\") ||\n p.includes(\"\\\\windows\\\\system32\\\\bash.exe\") ||\n p.includes(\"\\\\windows\\\\syswow64\\\\bash.exe\")\n );\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 = normalizeMaybeQuotedPath(envPathRaw);\n if (existsPath(envPath)) return envPath;\n // Env var set but path doesn't exist — continue best-effort detection\n }\n\n // Common Git for Windows install locations (works even if PATH is missing).\n const programFilesRoots = [\n process.env.ProgramW6432,\n process.env.ProgramFiles,\n process.env[\"ProgramFiles(x86)\"],\n ].filter((v): v is string => typeof v === \"string\" && v.trim() !== \"\");\n const defaultCandidates: string[] = [];\n for (const root of programFilesRoots) {\n const base = join(normalizeMaybeQuotedPath(root), \"Git\");\n defaultCandidates.push(join(base, \"bin\", \"bash.exe\"));\n defaultCandidates.push(join(base, \"usr\", \"bin\", \"bash.exe\"));\n }\n const fromDefault = firstExisting(defaultCandidates);\n if (fromDefault) return fromDefault;\n\n try {\n const gitCandidates = [...tryFromPath([\"git.exe\", \"git.cmd\", \"git.bat\"]), ...tryWhere(\"git\")];\n for (const gitPath of gitCandidates) {\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 normalizedPath = normalize(bashPath);\n if (existsPath(normalizedPath)) return normalizedPath;\n }\n }\n } catch {\n // `where git` failed — git not in PATH\n }\n\n // If bash.exe is already on PATH, use it (avoid the WSL system bash.exe).\n const fromWhereBash = firstExisting(\n [...tryFromPath([\"bash.exe\"]), ...tryWhere(\"bash\")].filter(\n (p) => p.toLowerCase().endsWith(\"\\\\bash.exe\") && !isWindowsSystemBash(p)\n )\n );\n if (fromWhereBash) return fromWhereBash;\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 envPathRaw = process.env.CLAUDE_CODE_GIT_BASH_PATH;\n const envPath =\n envPathRaw && envPathRaw.trim() !== \"\" ? normalizeMaybeQuotedPath(envPathRaw) : null;\n const envValid = !!(envPath && existsPath(envPath));\n\n const bashPath = findGitBash();\n if (bashPath) {\n // Ensure child processes can reliably locate bash.exe even when started\n // from GUI clients that don't inherit a full PATH environment.\n if (!envValid) {\n process.env.CLAUDE_CODE_GIT_BASH_PATH = bashPath;\n if (envPathRaw && envPathRaw.trim() !== \"\") {\n console.error(\n `[windows] WARNING: CLAUDE_CODE_GIT_BASH_PATH is set to \"${envPathRaw}\" but the file does not exist.`\n );\n }\n console.error(`[windows] Git Bash detected: ${bashPath} (set CLAUDE_CODE_GIT_BASH_PATH)`);\n } else {\n console.error(`[windows] Git Bash detected: ${bashPath}`);\n }\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 const lower = errorMessage.toLowerCase();\n const looksLikeMissingBash =\n (lower.includes(\"enoent\") && (lower.includes(\"bash\") || lower.includes(\"git-bash\"))) ||\n lower.includes(\"claude code on windows requires git-bash\");\n if (looksLikeMissingBash || lower.includes(\"claude_code_git_bash_path\")) {\n return errorMessage + WINDOWS_BASH_HINT;\n }\n return errorMessage;\n}\n","import { createHmac } from \"node:crypto\";\n\nexport function getResumeSecrets(): string[] {\n const raw = process.env.CLAUDE_CODE_MCP_RESUME_SECRET;\n if (typeof raw !== \"string\") return [];\n return raw\n .split(\",\")\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n}\n\nexport function getResumeSecret(): string | undefined {\n return getResumeSecrets()[0];\n}\n\nexport function computeResumeToken(sessionId: string, secret: string): string {\n return createHmac(\"sha256\", secret).update(sessionId).digest(\"base64url\");\n}\n\nexport function isValidResumeToken(sessionId: string, token: string, secrets: string[]): boolean {\n for (const secret of secrets) {\n if (computeResumeToken(sessionId, secret) === token) return true;\n }\n return false;\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\";\nimport { normalizeWindowsPathArray, normalizeWindowsPathLike } from \"./normalize-windows-path.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: normalizeWindowsPathLike(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 = normalizeWindowsPathArray(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 = normalizeWindowsPathLike(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 = normalizeWindowsPathLike(src.debugFile);\n if (src.env !== undefined) opts.env = { ...process.env, ...src.env };\n\n return opts;\n}\n","import type { SessionManager } from \"../session/manager.js\";\nimport type { PermissionMode } from \"../types.js\";\nimport { DEFAULT_SETTING_SOURCES } from \"../types.js\";\nimport type { OptionSource } from \"./build-options.js\";\n\nexport type SessionCreateParams = Parameters<SessionManager[\"create\"]>[0];\n\nexport function toSessionCreateParams(input: {\n sessionId: string;\n source: OptionSource;\n abortController: AbortController;\n permissionMode?: PermissionMode;\n}): SessionCreateParams {\n const src = input.source;\n return {\n sessionId: input.sessionId,\n cwd: src.cwd,\n model: src.model,\n permissionMode: input.permissionMode,\n allowedTools: src.allowedTools,\n disallowedTools: src.disallowedTools,\n tools: src.tools,\n maxTurns: src.maxTurns,\n systemPrompt: src.systemPrompt,\n agents: src.agents,\n maxBudgetUsd: src.maxBudgetUsd,\n effort: src.effort,\n betas: src.betas,\n additionalDirectories: src.additionalDirectories,\n outputFormat: src.outputFormat,\n thinking: src.thinking,\n persistSession: src.persistSession,\n pathToClaudeCodeExecutable: src.pathToClaudeCodeExecutable,\n agent: src.agent,\n mcpServers: src.mcpServers,\n sandbox: src.sandbox,\n fallbackModel: src.fallbackModel,\n enableFileCheckpointing: src.enableFileCheckpointing,\n includePartialMessages: src.includePartialMessages,\n strictMcpConfig: src.strictMcpConfig,\n settingSources: src.settingSources ?? DEFAULT_SETTING_SOURCES,\n debug: src.debug,\n debugFile: src.debugFile,\n env: src.env,\n abortController: input.abortController,\n };\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 ThinkingConfig,\n} from \"../types.js\";\nimport { 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\";\nimport { toSessionCreateParams } from \"../utils/session-create.js\";\nimport {\n normalizeWindowsPathArray,\n normalizeWindowsPathLike,\n} from \"../utils/normalize-windows-path.js\";\n\n/**\n * Low-frequency / SDK-passthrough options grouped under `advanced`.\n * `effort` and `thinking` are promoted to top-level (advanced aliases are kept for compatibility).\n */\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 /** @deprecated Use top-level `effort` instead. */\n effort?: EffortLevel;\n betas?: string[];\n additionalDirectories?: string[];\n outputFormat?: { type: \"json_schema\"; schema: Record<string, unknown> };\n /** @deprecated Use top-level `thinking` instead. */\n thinking?: ThinkingConfig;\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 effort?: EffortLevel;\n thinking?: ThinkingConfig;\n systemPrompt?: string | { type: \"preset\"; preset: \"claude_code\"; append?: string };\n /** Timeout waiting for permission decision (default 60000ms) */\n permissionRequestTimeoutMs?: number;\n /** @deprecated Use `advanced.sessionInitTimeoutMs` instead. */\n sessionInitTimeoutMs?: 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 if (!sessionManager.hasCapacityFor(1)) {\n return {\n sessionId: \"\",\n status: \"error\",\n error: `Error [${ErrorCode.RESOURCE_EXHAUSTED}]: Too many sessions (limit: ${sessionManager.getMaxSessions()}).`,\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 ?? input.sessionInitTimeoutMs ?? 10_000;\n const compatWarnings: string[] = [];\n if (input.sessionInitTimeoutMs !== undefined) {\n compatWarnings.push(\n \"Top-level sessionInitTimeoutMs for claude_code is a compatibility alias; prefer advanced.sessionInitTimeoutMs.\"\n );\n }\n if (\n input.sessionInitTimeoutMs !== undefined &&\n adv.sessionInitTimeoutMs !== undefined &&\n input.sessionInitTimeoutMs !== adv.sessionInitTimeoutMs\n ) {\n compatWarnings.push(\n `Both advanced.sessionInitTimeoutMs (${adv.sessionInitTimeoutMs}) and top-level sessionInitTimeoutMs (${input.sessionInitTimeoutMs}) were provided; using advanced.sessionInitTimeoutMs.`\n );\n }\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 effort: input.effort ?? adv.effort,\n thinking: input.thinking ?? adv.thinking,\n };\n const normalizedFlat = {\n ...flat,\n cwd: normalizeWindowsPathLike(flat.cwd),\n additionalDirectories:\n flat.additionalDirectories !== undefined\n ? normalizeWindowsPathArray(flat.additionalDirectories)\n : undefined,\n debugFile: flat.debugFile !== undefined ? normalizeWindowsPathLike(flat.debugFile) : undefined,\n pathToClaudeCodeExecutable:\n flat.pathToClaudeCodeExecutable !== undefined\n ? normalizeWindowsPathLike(flat.pathToClaudeCodeExecutable)\n : undefined,\n };\n\n try {\n const handle = consumeQuery({\n mode: \"start\",\n prompt: input.prompt,\n abortController,\n options: buildOptions(normalizedFlat),\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 toSessionCreateParams({\n sessionId: init.session_id,\n source: normalizedFlat,\n permissionMode: \"default\",\n abortController,\n })\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 compatWarnings: compatWarnings.length > 0 ? compatWarnings : 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 { ErrorCode } from \"../types.js\";\nimport { consumeQuery } from \"./query-consumer.js\";\nimport type { ToolDiscoveryCache } from \"./tool-discovery.js\";\nimport {\n computeResumeToken,\n getResumeSecret,\n getResumeSecrets,\n isValidResumeToken,\n} from \"../utils/resume-token.js\";\nimport { raceWithAbort } from \"../utils/race-with-abort.js\";\nimport { buildOptions } from \"../utils/build-options.js\";\nimport type { OptionSource } from \"../utils/build-options.js\";\nimport { toSessionCreateParams } from \"../utils/session-create.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 effort?: EffortLevel;\n thinking?: ThinkingConfig;\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 if (!sessionManager.hasCapacityFor(1)) {\n return {\n sessionId: input.sessionId,\n status: \"error\",\n error: `Error [${ErrorCode.RESOURCE_EXHAUSTED}]: Too many sessions (limit: ${sessionManager.getMaxSessions()}).`,\n };\n }\n\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 resumeSecrets = getResumeSecrets();\n const resumeSecret = resumeSecrets[0];\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 if (!isValidResumeToken(input.sessionId, dr.resumeToken, resumeSecrets)) {\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 if (input.effort !== undefined) options.effort = input.effort;\n if (input.thinking !== undefined) options.thinking = input.thinking;\n\n const { resumeToken: _resumeToken, ...rest } = dr;\n void _resumeToken;\n const source: OptionSource = {\n ...(rest as OptionSource),\n cwd: options.cwd ?? dr.cwd ?? \"\",\n additionalDirectories:\n (options.additionalDirectories as string[] | undefined) ??\n (rest as OptionSource).additionalDirectories,\n debugFile: (options.debugFile as string | undefined) ?? (rest as OptionSource).debugFile,\n pathToClaudeCodeExecutable:\n (options.pathToClaudeCodeExecutable as string | undefined) ??\n (rest as OptionSource).pathToClaudeCodeExecutable,\n effort: input.effort ?? (rest as OptionSource).effort,\n thinking: input.thinking ?? (rest as OptionSource).thinking,\n };\n sessionManager.create(\n toSessionCreateParams({\n sessionId: input.sessionId,\n source,\n permissionMode: \"default\",\n abortController,\n })\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 session = acquired;\n const options = buildOptions(session);\n if (input.forkSession) options.forkSession = true;\n\n if (input.forkSession && !sessionManager.hasCapacityFor(1)) {\n sessionManager.update(input.sessionId, { status: originalStatus, abortController: undefined });\n return {\n sessionId: input.sessionId,\n status: \"error\",\n error: `Error [${ErrorCode.RESOURCE_EXHAUSTED}]: Too many sessions (limit: ${sessionManager.getMaxSessions()}).`,\n };\n }\n\n const sourceOverrides: Pick<OptionSource, \"effort\" | \"thinking\"> = {\n effort: input.effort ?? session.effort,\n thinking: input.thinking ?? session.thinking,\n };\n if (input.effort !== undefined) options.effort = input.effort;\n if (input.thinking !== undefined) options.thinking = input.thinking;\n if (!input.forkSession && (input.effort !== undefined || input.thinking !== undefined)) {\n const patch: Partial<Pick<OptionSource, \"effort\" | \"thinking\">> = {};\n if (input.effort !== undefined) patch.effort = input.effort;\n if (input.thinking !== undefined) patch.thinking = input.thinking;\n sessionManager.update(input.sessionId, patch);\n }\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 // Restore original session state as soon as we have the fork's session ID.\n // Forking should not affect the original session (including its AbortController).\n sessionManager.update(input.sessionId, {\n status: originalStatus,\n abortController: undefined,\n });\n\n if (!sessionManager.get(init.session_id)) {\n sessionManager.create(\n toSessionCreateParams({\n sessionId: init.session_id,\n source: { ...session, ...sourceOverrides },\n permissionMode: \"default\",\n abortController,\n })\n );\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\">;\ntype ToolDiscoveryUpdatedCallback = (tools: ToolInfo[]) => void;\n\nexport const TOOL_CATALOG: Record<string, ToolCatalogEntry> = {\n Bash: {\n description: \"Run shell commands\",\n category: \"execute\",\n },\n Read: {\n description: \"Read file contents (large files: use offset/limit or Grep)\",\n category: \"file_read\",\n },\n Write: {\n description: \"Create or overwrite files\",\n category: \"file_write\",\n },\n Edit: {\n description: \"Targeted edits (replace_all is substring-based)\",\n category: \"file_write\",\n },\n Glob: {\n description: \"Find files by glob pattern\",\n category: \"file_read\",\n },\n Grep: {\n description: \"Search file contents (regex)\",\n category: \"file_read\",\n },\n NotebookEdit: {\n description: \"Edit Jupyter notebook cells (Windows paths normalized)\",\n category: \"file_write\",\n },\n WebFetch: {\n description: \"Fetch web page or API content\",\n category: \"network\",\n },\n WebSearch: { description: \"Web search\", category: \"network\" },\n Task: {\n description: \"Spawn subagent (must be in allowedTools)\",\n category: \"agent\",\n },\n TaskOutput: { description: \"Get subagent output\", category: \"agent\" },\n TaskStop: { description: \"Cancel subagent\", category: \"agent\" },\n TodoWrite: {\n description: \"Task/todo checklist\",\n category: \"agent\",\n },\n AskUserQuestion: {\n description: \"Ask user a question\",\n category: \"interaction\",\n },\n TeamDelete: {\n description: \"Delete team (may need shutdown_approved first)\",\n category: \"agent\",\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 private onUpdated?: ToolDiscoveryUpdatedCallback;\n\n constructor(initial?: ToolInfo[], onUpdated?: ToolDiscoveryUpdatedCallback) {\n this.cached = initial ?? defaultCatalogTools();\n this.onUpdated = onUpdated;\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) {\n this.cached = next;\n try {\n this.onUpdated?.(this.cached);\n } catch {\n // ignore observer errors (stdout is reserved for MCP)\n }\n }\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 Claude Code session and return sessionId.\\n\" +\n \"Use claude_code_check to poll events/results and handle permissions.\\n\\n\";\n desc += \"Internal tools (authoritative list: includeTools=true in claude_code_check):\\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 \"\\nPermission control: allowedTools auto-approves; disallowedTools always denies; others require approval.\\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 PermissionRequestRecord,\n PermissionResult,\n PermissionUpdate,\n SessionInfo,\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 maxBytes?: number;\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 uniqSorted(values: string[] | undefined): string[] {\n if (!Array.isArray(values) || values.length === 0) return [];\n const filtered = values\n .filter((v): v is string => typeof v === \"string\")\n .map((v) => v.trim())\n .filter(Boolean);\n return Array.from(new Set(filtered)).sort((a, b) => a.localeCompare(b));\n}\n\nfunction detectPathCompatibilityWarnings(session: SessionInfo | undefined): string[] {\n if (!session) return [];\n const cwd = session.cwd;\n if (typeof cwd !== \"string\" || cwd.trim() === \"\") return [];\n\n const warnings: string[] = [];\n if (process.platform === \"win32\" && cwd.startsWith(\"/\") && !cwd.startsWith(\"//\")) {\n warnings.push(\n `cwd '${cwd}' looks POSIX-style on Windows. Consider using a Windows path (e.g. C:\\\\\\\\repo) to avoid path compatibility issues.`\n );\n }\n if (process.platform !== \"win32\" && /^[a-zA-Z]:[\\\\/]/.test(cwd)) {\n warnings.push(\n `cwd '${cwd}' looks Windows-style on ${process.platform}. This may indicate cross-platform path mismatch (for example WSL boundary).`\n );\n }\n if (process.platform !== \"win32\" && cwd.startsWith(\"\\\\\\\\\")) {\n warnings.push(\n `cwd '${cwd}' looks like a Windows UNC path on ${process.platform}. Confirm MCP client/server run on the same platform.`\n );\n }\n return warnings;\n}\n\nfunction isPosixHomePath(value: string): boolean {\n return /^\\/home\\/[^/]+(?:\\/|$)/.test(value);\n}\n\nfunction detectPendingPermissionPathWarnings(\n pending: PermissionRequestRecord[],\n session: SessionInfo | undefined\n): string[] {\n if (process.platform !== \"win32\" || pending.length === 0) return [];\n\n const cwd = session?.cwd;\n const cwdHint =\n typeof cwd === \"string\" && cwd.trim() !== \"\" ? ` under cwd '${cwd}'` : \" under the current cwd\";\n\n const warnings: string[] = [];\n for (const req of pending) {\n const candidates: string[] = [];\n if (typeof req.blockedPath === \"string\") candidates.push(req.blockedPath);\n const filePath = req.input.file_path;\n if (typeof filePath === \"string\") candidates.push(filePath);\n\n const badPath = candidates.find((p) => isPosixHomePath(p));\n if (!badPath) continue;\n warnings.push(\n `Permission request '${req.requestId}' uses POSIX home path '${badPath}' on Windows. Prefer an absolute Windows path${cwdHint} to avoid out-of-bounds permission prompts.`\n );\n }\n return warnings;\n}\n\nfunction computeToolValidation(\n session: SessionInfo | undefined,\n initTools: string[] | undefined\n): { summary?: CheckResult[\"toolValidation\"]; warnings: string[] } {\n if (!session) return { summary: undefined, warnings: [] };\n const allowedTools = uniqSorted(session.allowedTools);\n const disallowedTools = uniqSorted(session.disallowedTools);\n if (allowedTools.length === 0 && disallowedTools.length === 0) {\n return { summary: undefined, warnings: [] };\n }\n\n if (!Array.isArray(initTools) || initTools.length === 0) {\n return {\n summary: {\n runtimeToolsKnown: false,\n unknownAllowedTools: [],\n unknownDisallowedTools: [],\n },\n warnings: [\n \"Runtime tool list is not available yet; unknown allowedTools/disallowedTools names cannot be validated until system/init tools arrive.\",\n ],\n };\n }\n\n const runtime = new Set(\n initTools\n .filter((name): name is string => typeof name === \"string\")\n .map((name) => name.trim())\n .filter(Boolean)\n );\n const unknownAllowedTools = allowedTools.filter((name) => !runtime.has(name));\n const unknownDisallowedTools = disallowedTools.filter((name) => !runtime.has(name));\n const warnings: string[] = [];\n if (unknownAllowedTools.length > 0) {\n warnings.push(\n `Unknown allowedTools (not present in runtime tools): ${unknownAllowedTools.join(\", \")}.`\n );\n }\n if (unknownDisallowedTools.length > 0) {\n warnings.push(\n `Unknown disallowedTools (not present in runtime tools): ${unknownDisallowedTools.join(\", \")}.`\n );\n }\n return {\n summary: {\n runtimeToolsKnown: true,\n unknownAllowedTools,\n unknownDisallowedTools,\n },\n warnings,\n };\n}\n\nfunction byteLength(value: unknown): number {\n return new TextEncoder().encode(JSON.stringify(value)).length;\n}\n\nfunction capEventsByBytes<T>(events: T[], maxBytes?: number): { events: T[]; truncated: boolean } {\n if (!Number.isFinite(maxBytes) || typeof maxBytes !== \"number\" || maxBytes <= 0) {\n return { events, truncated: false };\n }\n const budget = Math.floor(maxBytes);\n const kept: T[] = [];\n let bytes = 2; // \"[]\"\n for (const evt of events) {\n const evtBytes = byteLength(evt);\n const separatorBytes = kept.length === 0 ? 0 : 1; // \",\"\n if (bytes + separatorBytes + evtBytes > budget) break;\n kept.push(evt);\n bytes += separatorBytes + evtBytes;\n }\n return { events: kept, truncated: kept.length < events.length };\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 maxBytes = po.maxBytes;\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 let 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 = sessionManager.getInitTools(sessionId);\n const availableTools = includeTools && initTools ? discoverToolsFromInit(initTools) : undefined;\n const toolValidation = computeToolValidation(session, initTools);\n const compatWarnings = Array.from(\n new Set([\n ...toolValidation.warnings,\n ...detectPathCompatibilityWarnings(session),\n ...detectPendingPermissionPathWarnings(pending, session),\n ])\n );\n\n const shapedEvents = toEvents(outputEvents, {\n includeUsage,\n includeModelUsage,\n includeStructuredOutput,\n slim: responseMode === \"minimal\",\n });\n const cappedEvents = capEventsByBytes(shapedEvents, maxBytes);\n if (cappedEvents.truncated) {\n truncated = true;\n truncatedFields.push(\"events_bytes\");\n nextCursor =\n cappedEvents.events.length > 0\n ? cappedEvents.events[cappedEvents.events.length - 1].id + 1\n : (cursorResetTo ?? input.cursor ?? 0);\n }\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: cappedEvents.events,\n nextCursor,\n availableTools,\n toolValidation: toolValidation.summary,\n compatWarnings: compatWarnings.length > 0 ? compatWarnings : undefined,\n actions:\n includeActions && status === \"waiting_permission\"\n ? pending.map((req) => {\n const expiresMs = req.expiresAt ? Date.parse(req.expiresAt) : Number.NaN;\n const remainingMs = Number.isFinite(expiresMs)\n ? Math.max(0, expiresMs - Date.now())\n : undefined;\n return {\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 timeoutMs: req.timeoutMs,\n expiresAt: req.expiresAt,\n remainingMs,\n };\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 requestSignal?: AbortSignal\n): ClaudeCodeCheckResult {\n if (requestSignal?.aborted) {\n return {\n sessionId: input.sessionId ?? \"\",\n error: `Error [${ErrorCode.CANCELLED}]: request was cancelled.`,\n isError: true,\n };\n }\n\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 requestSignal?: AbortSignal\n): SessionResult {\n if (requestSignal?.aborted) {\n return {\n sessions: [],\n message: `Error [${ErrorCode.CANCELLED}]: request was cancelled.`,\n isError: true,\n };\n }\n\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","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ReadResourceResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { ToolDiscoveryCache } from \"../tools/tool-discovery.js\";\n\nconst RESOURCE_SCHEME = \"claude-code-mcp\";\n\nexport const RESOURCE_URIS = {\n serverInfo: `${RESOURCE_SCHEME}:///server-info`,\n internalTools: `${RESOURCE_SCHEME}:///internal-tools`,\n gotchas: `${RESOURCE_SCHEME}:///gotchas`,\n compatReport: `${RESOURCE_SCHEME}:///compat-report`,\n} as const;\n\nfunction asTextResource(uri: URL, text: string, mimeType: string): ReadResourceResult {\n return {\n contents: [\n {\n uri: uri.toString(),\n text,\n mimeType,\n },\n ],\n };\n}\n\nexport function registerResources(\n server: McpServer,\n deps: { toolCache: ToolDiscoveryCache }\n): void {\n const serverInfoUri = new URL(RESOURCE_URIS.serverInfo);\n server.registerResource(\n \"server_info\",\n serverInfoUri.toString(),\n {\n title: \"Server Info\",\n description: \"Server metadata (version/platform/runtime).\",\n mimeType: \"application/json\",\n },\n () =>\n asTextResource(\n serverInfoUri,\n JSON.stringify(\n {\n name: \"claude-code-mcp\",\n node: process.version,\n platform: process.platform,\n arch: process.arch,\n resources: Object.values(RESOURCE_URIS),\n toolCatalogCount: deps.toolCache.getTools().length,\n },\n null,\n 2\n ),\n \"application/json\"\n )\n );\n\n const toolsUri = new URL(RESOURCE_URIS.internalTools);\n server.registerResource(\n \"internal_tools\",\n toolsUri.toString(),\n {\n title: \"Internal Tools\",\n description: \"Claude Code internal tool catalog (runtime-aware).\",\n mimeType: \"application/json\",\n },\n () =>\n asTextResource(\n toolsUri,\n JSON.stringify({ tools: deps.toolCache.getTools() }, null, 2),\n \"application/json\"\n )\n );\n\n const gotchasUri = new URL(RESOURCE_URIS.gotchas);\n server.registerResource(\n \"gotchas\",\n gotchasUri.toString(),\n {\n title: \"Gotchas\",\n description: \"Practical limits and gotchas when using Claude Code via this MCP server.\",\n mimeType: \"text/markdown\",\n },\n () =>\n asTextResource(\n gotchasUri,\n [\n \"# claude-code-mcp: gotchas\",\n \"\",\n \"- Permission approvals have a timeout (default 60s, server-clamped to 5min) and auto-deny (`actions[].expiresAt`/`remainingMs`).\",\n \"- `Read` has a per-call size cap in practice (often ~256KB); for large files use `offset`/`limit` or chunk with `Grep`.\",\n \"- `Edit` with `replace_all=true` is substring replacement; if no match is found the tool returns an error.\",\n \"- On Windows, this server normalizes common MSYS-style paths (e.g. `/d/...`, `/mnt/c/...`, `/cygdrive/c/...`, `//server/share/...`) for `cwd`, `additionalDirectories`, and tool inputs that include `file_path`.\",\n \"- `TeamDelete` may require members to reach `shutdown_approved`; cleanup can be asynchronous during shutdown.\",\n '- Skills may become available later in the same session (early calls may show \"Unknown\").',\n \"- Some internal features (e.g. ToolSearch) may not appear in `availableTools` because it is derived from SDK `system/init.tools`.\",\n \"\",\n ].join(\"\\n\"),\n \"text/markdown\"\n )\n );\n\n const compatReportUri = new URL(RESOURCE_URIS.compatReport);\n server.registerResource(\n \"compat_report\",\n compatReportUri.toString(),\n {\n title: \"Compatibility Report\",\n description: \"Compatibility diagnostics for MCP clients and local runtime assumptions.\",\n mimeType: \"application/json\",\n },\n () => {\n const runtimeWarnings: string[] = [];\n if (process.platform === \"win32\" && !process.env.CLAUDE_CODE_GIT_BASH_PATH) {\n runtimeWarnings.push(\n \"CLAUDE_CODE_GIT_BASH_PATH is not set. Auto-detection exists, but explicit path is more reliable for GUI-launched MCP clients.\"\n );\n }\n return asTextResource(\n compatReportUri,\n JSON.stringify(\n {\n transport: \"stdio\",\n samePlatformRequired: true,\n runtime: {\n node: process.version,\n platform: process.platform,\n arch: process.arch,\n },\n features: {\n resources: true,\n toolsListChanged: true,\n resourcesListChanged: true,\n prompts: false,\n completions: false,\n },\n guidance: [\n \"Some clients cache tool descriptions at connect time. Prefer claude_code_check(pollOptions.includeTools=true) for runtime-authoritative tool lists.\",\n \"Use allowedTools/disallowedTools only with exact runtime tool names.\",\n \"This server assumes MCP client and server run on the same machine/platform.\",\n ],\n toolCatalogCount: deps.toolCache.getTools().length,\n runtimeWarnings,\n },\n null,\n 2\n ),\n \"application/json\"\n );\n }\n );\n}\n","const BENIGN_CODES = new Set([\n \"EPIPE\",\n \"ECONNRESET\",\n \"ERR_STREAM_WRITE_AFTER_END\",\n \"ERR_STREAM_DESTROYED\",\n \"ABORT_ERR\",\n]);\n\nconst BENIGN_MESSAGE_PATTERNS = [\n \"operation aborted\",\n \"request was cancelled\",\n \"transport closed\",\n \"write after end\",\n \"stream was destroyed\",\n \"cannot call write after a stream was destroyed\",\n \"the pipe is being closed\",\n];\n\n/**\n * Errors in this category are expected during teardown/cancel races and should\n * not force the MCP server process to exit.\n */\nexport function isBenignRuntimeError(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n\n const withCode = error as Error & { code?: unknown };\n const code = typeof withCode.code === \"string\" ? withCode.code : undefined;\n if (code && BENIGN_CODES.has(code)) return true;\n\n if (error.name === \"AbortError\") return true;\n\n const message = error.message.toLowerCase();\n return BENIGN_MESSAGE_PATTERNS.some((pattern) => message.includes(pattern));\n}\n"],"mappings":"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","names":["join","m","rest","drive","path","options","event","sessionId","abortController","options"]}
|