@leo000001/claude-code-mcp 2.4.0 → 2.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +2 -1
- package/README.md +53 -57
- package/dist/index.js +6 -21
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/server.ts","../src/utils/normalize-windows-path.ts","../src/utils/normalize-tool-input.ts","../src/session/manager.ts","../src/tools/claude-code.ts","../src/types.ts","../src/tools/query-consumer.ts","../src/utils/windows.ts","../src/utils/permission-updated-input.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-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 notifyInternalToolsResourceChanged = () => {\n if (!server.isConnected()) return;\n // Prefer the stable high-level API to avoid coupling to internal SDK fields.\n // This notifies clients to refresh resources when the runtime tool catalog changes.\n server.sendResourceListChanged();\n };\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 notifyInternalToolsResourceChanged();\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 strictAllowedTools: z.boolean().optional().describe(\"Default: false\"),\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 strictAllowedTools: z.boolean().optional().describe(\"Default: false\"),\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, clamped to 300000\"),\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, clamped to 300000\"),\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, cancel, or interrupt sessions.\",\n inputSchema: {\n action: z.enum(SESSION_ACTIONS),\n sessionId: z.string().optional().describe(\"Required for get/cancel/interrupt\"),\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\n .enum(CHECK_RESPONSE_MODES)\n .optional()\n .describe(\"Default: 'minimal'. Use 'delta_compact' for lightweight polling.\"),\n maxEvents: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"Default: 200 (minimal), unlimited (full/delta_compact)\"),\n\n requestId: z.string().optional().describe(\"Default: none\"),\n decision: z\n .enum([\"allow\", \"deny\", \"allow_for_session\"])\n .optional()\n .describe(\"Default: none\"),\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\n .boolean()\n .optional()\n .describe(\"Default: full=true, minimal/delta_compact=false\"),\n includeModelUsage: z\n .boolean()\n .optional()\n .describe(\"Default: full=true, minimal/delta_compact=false\"),\n includeStructuredOutput: z\n .boolean()\n .optional()\n .describe(\"Default: full=true, minimal/delta_compact=false\"),\n includeTerminalEvents: z\n .boolean()\n .optional()\n .describe(\"Default: full=true, minimal/delta_compact=false\"),\n includeProgressEvents: z\n .boolean()\n .optional()\n .describe(\"Default: full=true, minimal/delta_compact=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, version: SERVER_VERSION, sessionManager });\n\n return { server, sessionManager, toolCache };\n}\n\nexport function createServer(serverCwd: string): McpServer {\n return createServerContext(serverCwd).server;\n}\n","import path from \"node:path\";\nimport os from \"node:os\";\n\nconst TOOL_INPUT_PATH_FIELDS = [\n \"file_path\",\n \"path\",\n \"directory\",\n \"folder\",\n \"cwd\",\n \"dest\",\n \"destination\",\n \"source\",\n \"target\",\n] as const;\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 convertMsysToWindowsPath(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 = convertMsysToWindowsPath(rawPath);\n if (!converted) return undefined;\n return path.win32.normalize(converted);\n}\n\nexport function isUnsupportedPosixAbsolutePath(\n value: string,\n platform: NodeJS.Platform = process.platform\n): boolean {\n if (platform !== \"win32\") return false;\n if (!value.startsWith(\"/\")) return false;\n return convertMsysToWindowsPath(value) === undefined;\n}\n\nexport function hasUnsupportedPosixAbsoluteFilePath(\n input: Record<string, unknown>,\n platform: NodeJS.Platform = process.platform\n): boolean {\n const filePath = input.file_path;\n if (typeof filePath !== \"string\") return false;\n return isUnsupportedPosixAbsolutePath(filePath, platform);\n}\n\nfunction extractPosixHomePathFromCommand(command: string): string | undefined {\n const match = command.match(/\\/home\\/[^/\\s\"'`]+(?:\\/[^\\s\"'`]*)?/);\n return match?.[0];\n}\n\nexport function findUnsupportedPosixPathInToolInput(\n input: Record<string, unknown>,\n platform: NodeJS.Platform = process.platform\n): string | undefined {\n if (platform !== \"win32\") return undefined;\n\n for (const key of TOOL_INPUT_PATH_FIELDS) {\n const value = input[key];\n if (typeof value !== \"string\") continue;\n if (isUnsupportedPosixAbsolutePath(value, platform)) return value;\n }\n\n const command = input.command;\n if (typeof command !== \"string\") return undefined;\n const embeddedHomePath = extractPosixHomePathFromCommand(command);\n if (!embeddedHomePath) return undefined;\n return isUnsupportedPosixAbsolutePath(embeddedHomePath, platform) ? embeddedHomePath : undefined;\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 { normalizeToolInput } from \"../utils/normalize-tool-input.js\";\nimport { findUnsupportedPosixPathInToolInput } from \"../utils/normalize-windows-path.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\nfunction parsePositiveInt(raw: string | undefined): number | undefined {\n if (typeof raw !== \"string\" || raw.trim() === \"\") return undefined;\n const parsed = Number.parseInt(raw, 10);\n if (!Number.isFinite(parsed) || parsed <= 0) return undefined;\n return parsed;\n}\n\nfunction normalizePositiveNumber(value: number | undefined): number | undefined {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) return undefined;\n return Math.trunc(value);\n}\n\nfunction normalizeToolPolicyNames(values: string[] | undefined): string[] {\n if (!Array.isArray(values) || values.length === 0) return [];\n return values\n .filter((value): value is string => typeof value === \"string\")\n .map((value) => value.trim())\n .filter((value) => value !== \"\");\n}\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 private eventBufferMaxSize: number;\n private eventBufferHardMaxSize: number;\n private destroyed = false;\n\n constructor(opts?: {\n platform?: NodeJS.Platform;\n maxSessions?: number;\n maxPendingPermissionsPerSession?: number;\n eventBufferMaxSize?: number;\n eventBufferHardMaxSize?: 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\n const configuredEventBufferMaxSize =\n normalizePositiveNumber(opts?.eventBufferMaxSize) ??\n parsePositiveInt(process.env.CLAUDE_CODE_MCP_EVENT_BUFFER_MAX_SIZE);\n const configuredEventBufferHardMaxSize =\n normalizePositiveNumber(opts?.eventBufferHardMaxSize) ??\n parsePositiveInt(process.env.CLAUDE_CODE_MCP_EVENT_BUFFER_HARD_MAX_SIZE);\n\n this.eventBufferMaxSize = configuredEventBufferMaxSize ?? DEFAULT_EVENT_BUFFER_MAX_SIZE;\n const initialHardMaxSize =\n configuredEventBufferHardMaxSize ?? DEFAULT_EVENT_BUFFER_HARD_MAX_SIZE;\n this.eventBufferHardMaxSize = Math.max(this.eventBufferMaxSize, initialHardMaxSize);\n if (initialHardMaxSize < this.eventBufferMaxSize) {\n console.error(\n `[config] CLAUDE_CODE_MCP_EVENT_BUFFER_HARD_MAX_SIZE (${initialHardMaxSize}) is smaller than maxSize (${this.eventBufferMaxSize}); clamped to ${this.eventBufferHardMaxSize}.`\n );\n }\n\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 if (this.destroyed) return 0;\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 getEventBufferConfig(): { maxSize: number; hardMaxSize: number } {\n return {\n maxSize: this.eventBufferMaxSize,\n hardMaxSize: this.eventBufferHardMaxSize,\n };\n }\n\n getSessionTtlMs(): number {\n return this.sessionTtlMs;\n }\n\n getRunningSessionMaxMs(): number {\n return this.runningSessionMaxMs;\n }\n\n hasCapacityFor(additionalSessions: number): boolean {\n if (this.destroyed) return false;\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 strictAllowedTools?: SessionInfo[\"strictAllowedTools\"];\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 queryInterrupt?: SessionInfo[\"queryInterrupt\"];\n }): SessionInfo {\n if (this.destroyed) {\n throw new Error(\"SessionManager is destroyed and no longer accepts new sessions.\");\n }\n\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 strictAllowedTools: params.strictAllowedTools,\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 queryInterrupt: params.queryInterrupt,\n };\n this.sessions.set(params.sessionId, info);\n this.runtime.set(params.sessionId, {\n buffer: {\n events: [],\n maxSize: this.eventBufferMaxSize,\n hardMaxSize: this.eventBufferHardMaxSize,\n nextId: 0,\n },\n pendingPermissions: new Map(),\n });\n return info;\n }\n\n get(sessionId: string): SessionInfo | undefined {\n if (this.destroyed) return 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 if (this.destroyed) return [];\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 if (this.destroyed) return 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's status from expectedStatus to \"running\".\n * This only covers synchronous state mutation within SessionManager.\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 (this.destroyed) return 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.queryInterrupt = undefined;\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 if (this.destroyed) return false;\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.queryInterrupt) {\n try {\n info.queryInterrupt();\n } catch {\n // ignore interrupt errors\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.queryInterrupt = undefined;\n info.lastActiveAt = new Date().toISOString();\n return true;\n }\n\n interrupt(sessionId: string, opts?: { reason?: string; source?: string }): boolean {\n if (this.destroyed) return false;\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: opts?.reason ?? \"Session interrupted\", interrupt: true },\n \"interrupt\"\n );\n }\n\n if (info.queryInterrupt) {\n try {\n info.queryInterrupt();\n } catch {\n // ignore interrupt errors\n }\n }\n if (info.abortController) {\n info.abortController.abort();\n }\n\n this.pushEvent(sessionId, {\n type: \"progress\",\n data: {\n type: \"interrupted\",\n reason: opts?.reason ?? \"Session interrupted\",\n source: opts?.source ?? \"interrupt\",\n },\n timestamp: new Date().toISOString(),\n });\n info.lastActiveAt = new Date().toISOString();\n return true;\n }\n\n delete(sessionId: string): boolean {\n if (this.destroyed) return false;\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 if (this.destroyed) return;\n const state = this.runtime.get(sessionId);\n if (!state) return;\n state.storedResult = result;\n }\n\n getResult(sessionId: string): StoredAgentResult | undefined {\n if (this.destroyed) return undefined;\n return this.runtime.get(sessionId)?.storedResult;\n }\n\n setInitTools(sessionId: string, tools: string[]): void {\n if (this.destroyed) return;\n const state = this.runtime.get(sessionId);\n if (!state) return;\n state.initTools = tools;\n }\n\n getInitTools(sessionId: string): string[] | undefined {\n if (this.destroyed) return 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 if (this.destroyed) return 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 if (this.destroyed) return 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 if (this.destroyed) return { events: [], nextCursor: cursor ?? 0 };\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 if (this.destroyed) return;\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 if (this.destroyed) return false;\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 if (this.destroyed) return 0;\n return this.runtime.get(sessionId)?.pendingPermissions.size ?? 0;\n }\n\n getEventCount(sessionId: string): number {\n if (this.destroyed) return 0;\n return this.runtime.get(sessionId)?.buffer.events.length ?? 0;\n }\n\n getCurrentCursor(sessionId: string): number | undefined {\n if (this.destroyed) return undefined;\n const state = this.runtime.get(sessionId);\n if (!state) return undefined;\n return state.buffer.nextId;\n }\n\n getRemainingTtlMs(sessionId: string): number | undefined {\n if (this.destroyed) return undefined;\n const session = this.sessions.get(sessionId);\n if (!session) return undefined;\n const lastActiveMs = Date.parse(session.lastActiveAt);\n if (!Number.isFinite(lastActiveMs)) return undefined;\n const limitMs =\n session.status === \"running\" || session.status === \"waiting_permission\"\n ? this.runningSessionMaxMs\n : this.sessionTtlMs;\n return Math.max(0, limitMs - (Date.now() - lastActiveMs));\n }\n\n getRuntimeToolStats(): {\n sessionsWithInitTools: number;\n runtimeDiscoveredUniqueCount: number;\n } {\n if (this.destroyed) {\n return { sessionsWithInitTools: 0, runtimeDiscoveredUniqueCount: 0 };\n }\n const unique = new Set<string>();\n let sessionsWithInitTools = 0;\n for (const state of this.runtime.values()) {\n if (!Array.isArray(state.initTools) || state.initTools.length === 0) continue;\n sessionsWithInitTools += 1;\n for (const tool of state.initTools) {\n if (typeof tool === \"string\" && tool.trim() !== \"\") {\n unique.add(tool);\n }\n }\n }\n return {\n sessionsWithInitTools,\n runtimeDiscoveredUniqueCount: unique.size,\n };\n }\n\n listPendingPermissions(sessionId: string): PermissionRequestRecord[] {\n if (this.destroyed) return [];\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 getPendingPermission(sessionId: string, requestId: string): PermissionRequestRecord | undefined {\n if (this.destroyed) return undefined;\n const state = this.runtime.get(sessionId);\n return state?.pendingPermissions.get(requestId)?.record;\n }\n\n allowToolForSession(sessionId: string, toolName: string): boolean {\n if (this.destroyed) return false;\n const info = this.sessions.get(sessionId);\n if (!info) return false;\n const normalized = toolName.trim();\n if (normalized === \"\") return false;\n const disallowed = normalizeToolPolicyNames(info.disallowedTools);\n if (disallowed.includes(normalized)) {\n return false;\n }\n const allowed = Array.isArray(info.allowedTools) ? [...info.allowedTools] : [];\n if (!allowed.includes(normalized)) {\n allowed.push(normalized);\n info.allowedTools = allowed;\n info.lastActiveAt = new Date().toISOString();\n }\n return true;\n }\n\n finishRequest(\n sessionId: string,\n requestId: string,\n result: PermissionResult,\n source: FinishSource\n ): boolean {\n if (this.destroyed) return false;\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 = normalizeToolPolicyNames(info.disallowedTools);\n const pendingToolName = pending.record.toolName.trim();\n if (pendingToolName !== \"\" && disallowed.includes(pendingToolName)) {\n finalResult = {\n behavior: \"deny\",\n message: `Tool '${pendingToolName}' 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 const normalizedUpdatedInput = validRecord\n ? normalizeToolInput(\n pending.record.toolName,\n updatedInput as Record<string, unknown>,\n this.platform\n )\n : normalizeToolInput(pending.record.toolName, pending.record.input, this.platform);\n\n const unsupportedPath = findUnsupportedPosixPathInToolInput(\n normalizedUpdatedInput,\n this.platform\n );\n if (unsupportedPath) {\n finalResult = {\n behavior: \"deny\",\n message: `Tool '${pending.record.toolName}' attempted to allow an unsupported POSIX path '${\n unsupportedPath\n }' on Windows.`,\n interrupt: false,\n };\n } else {\n finalResult = {\n ...finalResult,\n updatedInput: normalizedUpdatedInput,\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 if (this.destroyed) return;\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 if (this.destroyed) return;\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 cancelled (timeout).\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.queryInterrupt = undefined;\n info.status = \"cancelled\";\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.queryInterrupt = undefined;\n info.status = \"cancelled\";\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 // Deleting current entries during Map iteration is safe in JavaScript.\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 queryInterrupt: _queryInterrupt,\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 if (this.destroyed) return;\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.queryInterrupt = undefined;\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 this.drainingSessions.clear();\n this.runtime.clear();\n this.sessions.clear();\n this.destroyed = true;\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 SessionManager.evictEventsToLimits(buffer, isActivePermissionRequest);\n\n return full;\n }\n\n private static evictEventsToLimits(\n buffer: EventBuffer,\n isActivePermissionRequest?: (requestId: string) => boolean\n ): void {\n if (buffer.events.length <= buffer.maxSize && buffer.events.length <= buffer.hardMaxSize) {\n return;\n }\n\n const droppedIds = new Set<number>();\n let remaining = buffer.events.length;\n\n const dropOldestMatching = (count: number, predicate: (e: SessionEvent) => boolean): number => {\n if (count <= 0) return 0;\n let dropped = 0;\n for (const event of buffer.events) {\n if (dropped >= count) break;\n if (droppedIds.has(event.id)) continue;\n if (!predicate(event)) continue;\n droppedIds.add(event.id);\n dropped += 1;\n }\n if (dropped > 0) {\n remaining -= dropped;\n }\n return dropped;\n };\n\n const isDroppablePermissionEvent = (event: SessionEvent): boolean => {\n if (event.type === \"permission_result\") return true;\n if (event.type !== \"permission_request\") return false;\n const requestId = (event.data as { requestId?: unknown } | null)?.requestId;\n if (typeof requestId !== \"string\") return true;\n return isActivePermissionRequest ? !isActivePermissionRequest(requestId) : true;\n };\n\n // Soft limit: prefer dropping unpinned events first.\n let toDropForSoftLimit = remaining - buffer.maxSize;\n if (toDropForSoftLimit > 0) {\n toDropForSoftLimit -= dropOldestMatching(toDropForSoftLimit, (event) => !event.pinned);\n }\n if (toDropForSoftLimit > 0) {\n toDropForSoftLimit -= dropOldestMatching(toDropForSoftLimit, isDroppablePermissionEvent);\n }\n\n // Hard limit: only drop permission-related pinned events that are safe to evict.\n let toDropForHardLimit = remaining - buffer.hardMaxSize;\n if (toDropForHardLimit > 0) {\n toDropForHardLimit -= dropOldestMatching(toDropForHardLimit, isDroppablePermissionEvent);\n }\n\n if (droppedIds.size > 0) {\n buffer.events = buffer.events.filter((event) => !droppedIds.has(event.id));\n }\n }\n\n private static lowerBoundByEventId(events: SessionEvent[], startFrom: number): number {\n let left = 0;\n let right = events.length;\n while (left < right) {\n const mid = Math.floor((left + right) / 2);\n if (events[mid]!.id < startFrom) left = mid + 1;\n else right = mid;\n }\n return left;\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 startIndex = SessionManager.lowerBoundByEventId(buffer.events, startFrom);\n const filtered = buffer.events.slice(startIndex);\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 * claude_code tool - Start a new Claude Code agent session\n */\nimport { existsSync, statSync } from \"node:fs\";\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 strictAllowedTools?: 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 strictAllowedTools?: boolean;\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 cwdProvided = input.cwd !== undefined;\n const cwd = cwdProvided ? 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 const normalizedCwd = normalizeWindowsPathLike(cwd);\n if (cwdProvided && !existsSync(normalizedCwd)) {\n return {\n sessionId: \"\",\n status: \"error\",\n error: `Error [${ErrorCode.INVALID_ARGUMENT}]: cwd path does not exist: ${normalizedCwd}`,\n };\n }\n if (cwdProvided) {\n try {\n if (!statSync(normalizedCwd).isDirectory()) {\n return {\n sessionId: \"\",\n status: \"error\",\n error: `Error [${ErrorCode.INVALID_ARGUMENT}]: cwd must be a directory: ${normalizedCwd}`,\n };\n }\n } catch (err: unknown) {\n const detail = err instanceof Error ? ` (${err.message})` : \"\";\n return {\n sessionId: \"\",\n status: \"error\",\n error: `Error [${ErrorCode.INVALID_ARGUMENT}]: cwd is not accessible: ${normalizedCwd}${detail}`,\n };\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: normalizedCwd,\n allowedTools: input.allowedTools,\n disallowedTools: input.disallowedTools,\n strictAllowedTools: input.strictAllowedTools ?? adv.strictAllowedTools,\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 queryInterrupt: () => {\n handle.interrupt();\n },\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 * 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\", \"interrupt\"] 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 strictAllowedTools?: boolean;\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 strictAllowedTools?: boolean;\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 /** Runtime-only handle used to interrupt the active query turn. */\n queryInterrupt?: () => void;\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 strictAllowedTools?: boolean;\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 pendingPermissionCount?: number;\n eventCount?: number;\n currentCursor?: number;\n lastEventId?: number;\n ttlMs?: number;\n lastError?: string;\n lastErrorAt?: string;\n redactions?: Array<{\n field: string;\n reason: string;\n }>;\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\", \"delta_compact\"] as const;\nexport type CheckResponseMode = (typeof CHECK_RESPONSE_MODES)[number];\n\nexport type PermissionDecision = \"allow\" | \"deny\" | \"allow_for_session\";\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 * Internal tool approval is controlled by a combination of tools visibility,\n * allowedTools/disallowedTools, and runtime permission callbacks.\n */\n permissionModel?: \"policy_controlled\";\n /**\n * Whether machine-validated input schemas are available via discovery.\n */\n schemaAvailability?: \"none\";\n availabilityConditions?: string[];\n platformConstraints?: string[];\n notes?: 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 | \"interrupt\"\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 {\n findUnsupportedPosixPathInToolInput,\n isUnsupportedPosixAbsolutePath,\n} from \"../utils/normalize-windows-path.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 normalizePolicyToolNames(tools: string[] | undefined): string[] {\n if (!Array.isArray(tools) || tools.length === 0) return [];\n return tools\n .filter((tool): tool is string => typeof tool === \"string\")\n .map((tool) => tool.trim())\n .filter((tool) => tool !== \"\");\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 normalizedToolName = toolName.trim();\n const normalizedInput = normalizeToolInput(toolName, input, params.platform);\n const unsupportedPath = findUnsupportedPosixPathInToolInput(normalizedInput, params.platform);\n if (unsupportedPath) {\n return {\n behavior: \"deny\",\n message: `Tool '${normalizedToolName || toolName}' requested unsupported POSIX path '${\n unsupportedPath\n }' on Windows.`,\n interrupt: false,\n };\n }\n if (\n typeof options.blockedPath === \"string\" &&\n isUnsupportedPosixAbsolutePath(options.blockedPath, params.platform)\n ) {\n return {\n behavior: \"deny\",\n message: `Tool '${normalizedToolName || toolName}' requested blocked path '${options.blockedPath}' that is unsupported on Windows.`,\n interrupt: false,\n };\n }\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 const disallowedTools = normalizePolicyToolNames(sessionInfo.disallowedTools);\n const allowedTools = normalizePolicyToolNames(sessionInfo.allowedTools);\n if (normalizedToolName !== \"\" && disallowedTools.includes(normalizedToolName)) {\n return {\n behavior: \"deny\",\n message: `Tool '${normalizedToolName}' is disallowed by session policy.`,\n };\n }\n\n if (\n sessionInfo.strictAllowedTools === true &&\n normalizedToolName !== \"\" &&\n allowedTools.length > 0 &&\n !allowedTools.includes(normalizedToolName)\n ) {\n return {\n behavior: \"deny\",\n message: `Tool '${normalizedToolName}' is not in allowedTools under strictAllowedTools policy.`,\n interrupt: false,\n };\n }\n\n if (\n !options.blockedPath &&\n normalizedToolName !== \"\" &&\n allowedTools.includes(normalizedToolName)\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 queryInterrupt: undefined,\n });\n } else if (current) {\n params.sessionManager.update(sessionId, {\n totalTurns: sessionTotalTurns,\n totalCostUsd: sessionTotalCostUsd,\n abortController: undefined,\n queryInterrupt: 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 queryInterrupt: 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, {\n status: \"error\",\n abortController: undefined,\n queryInterrupt: undefined,\n });\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","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 { createHmac, timingSafeEqual } 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\nfunction timingSafeEqualText(a: string, b: string): boolean {\n const left = Buffer.from(a, \"utf8\");\n const rightRaw = Buffer.from(b, \"utf8\");\n const right = Buffer.alloc(left.length);\n rightRaw.copy(right, 0, 0, left.length);\n const sameLength = rightRaw.length === left.length;\n return timingSafeEqual(left, right) && sameLength;\n}\n\nexport function isValidResumeToken(sessionId: string, token: string, secrets: string[]): boolean {\n for (const secret of secrets) {\n const computed = computeResumeToken(sessionId, secret);\n if (timingSafeEqualText(computed, 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 strictAllowedTools?: 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 queryInterrupt?: () => void;\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 strictAllowedTools: src.strictAllowedTools,\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 queryInterrupt: input.queryInterrupt,\n };\n}\n","/**\n * claude_code_reply tool - Continue an existing Claude Code session (async)\n */\nimport { existsSync, statSync } from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\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\";\nimport { normalizeWindowsPathLike } from \"../utils/normalize-windows-path.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 strictAllowedTools?: 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 normalizeAndAssertCwd(cwd: string, contextLabel: string): string {\n const normalizedCwd = normalizeWindowsPathLike(cwd);\n const resolvedCwd = resolvePortableTmpAlias(normalizedCwd);\n if (!existsSync(resolvedCwd)) {\n throw new Error(\n `Error [${ErrorCode.INVALID_ARGUMENT}]: ${contextLabel} path does not exist: ${resolvedCwd}`\n );\n }\n try {\n const stat = statSync(resolvedCwd);\n if (!stat.isDirectory()) {\n throw new Error(\n `Error [${ErrorCode.INVALID_ARGUMENT}]: ${contextLabel} must be a directory: ${resolvedCwd}`\n );\n }\n } catch (err: unknown) {\n if (err instanceof Error && err.message.includes(\"Error [\")) throw err;\n const detail = err instanceof Error ? ` (${err.message})` : \"\";\n throw new Error(\n `Error [${ErrorCode.INVALID_ARGUMENT}]: ${contextLabel} is not accessible: ${resolvedCwd}${detail}`\n );\n }\n return resolvedCwd;\n}\n\nfunction resolvePortableTmpAlias(cwd: string): string {\n if (process.platform !== \"win32\") return cwd;\n\n const normalized = cwd.replace(/\\\\/g, \"/\");\n if (normalized === \"/tmp\") return os.tmpdir();\n if (normalized.startsWith(\"/tmp/\")) {\n return path.join(os.tmpdir(), normalized.slice(\"/tmp/\".length));\n }\n return cwd;\n}\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 const normalizedCwd = normalizeAndAssertCwd(dr.cwd, \"disk resume cwd\");\n return buildOptions({\n ...dr,\n cwd: normalizedCwd,\n } 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 const handle = 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 sessionManager.update(input.sessionId, {\n queryInterrupt: () => {\n handle.interrupt();\n },\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, {\n status: \"error\",\n abortController: undefined,\n queryInterrupt: undefined,\n });\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, {\n status: \"error\",\n abortController: undefined,\n queryInterrupt: undefined,\n });\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 normalizedCwd = normalizeAndAssertCwd(session.cwd, \"session cwd\");\n const options = buildOptions(session);\n options.cwd = normalizedCwd;\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 queryInterrupt: 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 queryInterrupt: () => {\n handle.interrupt();\n },\n })\n );\n }\n },\n });\n if (!input.forkSession) {\n sessionManager.update(input.sessionId, {\n queryInterrupt: () => {\n handle.interrupt();\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 queryInterrupt: 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, {\n status: \"error\",\n abortController: undefined,\n queryInterrupt: undefined,\n });\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\nconst DEFAULT_PERMISSION_MODEL: ToolInfo[\"permissionModel\"] = \"policy_controlled\";\nconst DEFAULT_SCHEMA_AVAILABILITY: ToolInfo[\"schemaAvailability\"] = \"none\";\n\nexport const TOOL_CATALOG: Record<string, ToolCatalogEntry> = {\n Bash: {\n description: \"Run shell commands\",\n category: \"execute\",\n notes: [\"Execution may require permission approval depending on session policy.\"],\n },\n Read: {\n description: \"Read file contents (large files: use offset/limit or Grep)\",\n category: \"file_read\",\n notes: [\"Large reads are often capped by the backend; use offset/limit when needed.\"],\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 availabilityConditions: [\"Requires Task to be visible and approved by session policy.\"],\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 notes: [\"Team cleanup can be asynchronous during shutdown.\"],\n },\n};\n\nfunction uniq<T>(items: T[]): T[] {\n return Array.from(new Set(items));\n}\n\nfunction withToolDefaults(tool: ToolInfo): ToolInfo {\n return {\n ...tool,\n permissionModel: tool.permissionModel ?? DEFAULT_PERMISSION_MODEL,\n schemaAvailability: tool.schemaAvailability ?? DEFAULT_SCHEMA_AVAILABILITY,\n };\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 withToolDefaults({\n name,\n description: TOOL_CATALOG[name]?.description ?? name,\n category: TOOL_CATALOG[name]?.category,\n availabilityConditions: TOOL_CATALOG[name]?.availabilityConditions,\n platformConstraints: TOOL_CATALOG[name]?.platformConstraints,\n notes: TOOL_CATALOG[name]?.notes,\n })\n );\n}\n\nexport function defaultCatalogTools(): ToolInfo[] {\n return Object.keys(TOOL_CATALOG)\n .sort((a, b) => a.localeCompare(b))\n .map((name) => withToolDefaults({ 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 * Use \"delta_compact\" for high-frequency status polling.\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'/'allow_for_session'). */\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\" || params.decision === \"allow_for_session\") {\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\nfunction appendAllowForSessionUpdate(\n updates: Array<Record<string, unknown>> | undefined,\n toolName: string | undefined\n): Array<Record<string, unknown>> | undefined {\n const normalizedToolName = toolName?.trim();\n if (!normalizedToolName) return updates;\n return [\n ...(updates ?? []),\n {\n type: \"addRules\",\n behavior: \"allow\",\n destination: \"session\",\n rules: [{ toolName: normalizedToolName }],\n },\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\n // Check additionalDirectories for POSIX paths on Windows\n if (process.platform === \"win32\" && Array.isArray(session.additionalDirectories)) {\n for (const dir of session.additionalDirectories) {\n if (typeof dir === \"string\" && dir.startsWith(\"/\") && !dir.startsWith(\"//\")) {\n warnings.push(\n `additionalDirectories contains POSIX-style path '${dir}' on Windows. Consider using a Windows path to avoid path compatibility issues.`\n );\n }\n }\n }\n\n return warnings;\n}\n\nfunction isPosixHomePath(value: string): boolean {\n return /^\\/home\\/[^/\\s]+(?:\\/|$)/.test(value);\n}\n\nfunction extractPosixHomePath(value: string): string | undefined {\n const match = value.match(/\\/home\\/[^/\\s\"'`]+(?:\\/[^\\s\"'`]*)?/);\n return match?.[0];\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 // Check additional path-like fields in req.input (avoid content/body fields that may contain false positives)\n const pathFields = [\n \"path\",\n \"directory\",\n \"folder\",\n \"cwd\",\n \"dest\",\n \"destination\",\n \"source\",\n \"target\",\n ];\n for (const field of pathFields) {\n const val = req.input[field];\n if (typeof val === \"string\") candidates.push(val);\n }\n // Also check command field for embedded POSIX home paths.\n const command = req.input.command;\n if (typeof command === \"string\") {\n const embeddedPath = extractPosixHomePath(command);\n if (embeddedPath) candidates.push(embeddedPath);\n }\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 const warnings: string[] = [];\n if (allowedTools.length > 0 && session.strictAllowedTools !== true) {\n warnings.push(\n \"allowedTools currently acts as pre-approval only. Set strictAllowedTools=true to enforce a strict allowlist.\"\n );\n }\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 ...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 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 compactMode = responseMode === \"delta_compact\";\n const po = input.pollOptions ?? {};\n const includeTools = po.includeTools;\n const includeEvents = po.includeEvents ?? !compactMode;\n const includeActions = po.includeActions ?? true;\n const includeResult = po.includeResult ?? !compactMode;\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\" || responseMode === \"delta_compact\",\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\" || responseMode === \"delta_compact\",\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 (\n input.decision !== \"allow\" &&\n input.decision !== \"deny\" &&\n input.decision !== \"allow_for_session\"\n ) {\n return {\n sessionId: input.sessionId,\n error: `Error [${ErrorCode.INVALID_ARGUMENT}]: decision must be 'allow', 'deny', or 'allow_for_session'.`,\n isError: true,\n };\n }\n\n const pendingRequest =\n input.decision === \"allow_for_session\"\n ? sessionManager.getPendingPermission(input.sessionId, input.requestId)\n : undefined;\n const updatedPermissions =\n input.decision === \"allow_for_session\"\n ? appendAllowForSessionUpdate(\n input.permissionOptions?.updatedPermissions,\n pendingRequest?.toolName\n )\n : input.permissionOptions?.updatedPermissions;\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,\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 if (input.decision === \"allow_for_session\" && pendingRequest?.toolName) {\n sessionManager.allowToolForSession(input.sessionId, pendingRequest.toolName);\n }\n\n return buildResult(sessionManager, toolCache, input);\n}\n","/**\n * claude_code_session tool - Manage sessions (list, get, cancel, interrupt)\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\nconst ALWAYS_REDACTED_FIELDS = [\n \"env\",\n \"mcpServers\",\n \"sandbox\",\n \"debugFile\",\n \"pathToClaudeCodeExecutable\",\n] as const;\n\nconst CONDITIONAL_REDACTED_FIELDS = [\n \"cwd\",\n \"systemPrompt\",\n \"agents\",\n \"additionalDirectories\",\n] as const;\n\nfunction buildRedactions(includeSensitive?: boolean): PublicSessionInfo[\"redactions\"] {\n const redactions: PublicSessionInfo[\"redactions\"] = [];\n for (const field of ALWAYS_REDACTED_FIELDS) {\n redactions?.push({ field, reason: \"secret_or_internal\" });\n }\n if (!includeSensitive) {\n for (const field of CONDITIONAL_REDACTED_FIELDS) {\n redactions?.push({ field, reason: \"sensitive_by_default\" });\n }\n }\n return redactions;\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): PublicSessionInfo | SensitiveSessionInfo => {\n const base = input.includeSensitive\n ? sessionManager.toSensitiveJSON(s)\n : sessionManager.toPublicJSON(s);\n const stored = sessionManager.getResult(s.sessionId);\n const lastError = stored?.type === \"error\" ? stored.result.result : undefined;\n const lastErrorAt = stored?.type === \"error\" ? stored.createdAt : undefined;\n return {\n ...base,\n pendingPermissionCount: sessionManager.getPendingPermissionCount(s.sessionId),\n eventCount: sessionManager.getEventCount(s.sessionId),\n currentCursor: sessionManager.getCurrentCursor(s.sessionId),\n lastEventId: sessionManager.getLastEventId(s.sessionId),\n ttlMs: sessionManager.getRemainingTtlMs(s.sessionId),\n lastError,\n lastErrorAt,\n redactions: buildRedactions(input.includeSensitive),\n };\n };\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 case \"interrupt\": {\n if (!input.sessionId) {\n return {\n sessions: [],\n message: `Error [${ErrorCode.INVALID_ARGUMENT}]: sessionId is required for 'interrupt' action.`,\n isError: true,\n };\n }\n const interrupted = sessionManager.interrupt(input.sessionId, {\n reason: \"Interrupted by caller\",\n source: \"claude_code_session\",\n });\n if (!interrupted) {\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}' interrupted.`,\n };\n }\n\n default:\n return {\n sessions: [],\n message: `Error [${ErrorCode.INVALID_ARGUMENT}]: Unknown action '${input.action}'. Use 'list', 'get', 'cancel', or 'interrupt'.`,\n isError: true,\n };\n }\n}\n","import { ResourceTemplate, type McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ReadResourceResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport { createHash } from \"node:crypto\";\nimport type { SessionManager } from \"../session/manager.js\";\nimport { ErrorCode, type PublicSessionInfo } from \"../types.js\";\nimport {\n defaultCatalogTools,\n discoverToolsFromInit,\n type ToolDiscoveryCache,\n} 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 quickstart: `${RESOURCE_SCHEME}:///quickstart`,\n errors: `${RESOURCE_SCHEME}:///errors`,\n compatReport: `${RESOURCE_SCHEME}:///compat-report`,\n} as const;\n\nconst RESOURCE_TEMPLATES = {\n sessionById: `${RESOURCE_SCHEME}:///session/{sessionId}`,\n runtimeTools: `${RESOURCE_SCHEME}:///tools/runtime{?sessionId}`,\n compatDiff: `${RESOURCE_SCHEME}:///compat/diff{?client}`,\n} as const;\n\ntype GotchaSeverity = \"low\" | \"medium\" | \"high\";\ntype GotchaEntry = {\n id: string;\n title: string;\n severity: GotchaSeverity;\n appliesTo: string[];\n symptom: string;\n detection: string;\n remedy: string;\n example?: string;\n};\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\nfunction asJsonResource(uri: URL, value: unknown): ReadResourceResult {\n return asTextResource(uri, JSON.stringify(value, null, 2), \"application/json\");\n}\n\nfunction serializeLimit(limit: number): number | \"unlimited\" {\n return Number.isFinite(limit) ? limit : \"unlimited\";\n}\n\nfunction computeEtag(value: unknown): string {\n return createHash(\"sha256\").update(JSON.stringify(value)).digest(\"hex\").slice(0, 16);\n}\n\nfunction extractSingleVariable(value: string | string[] | null | undefined): string | undefined {\n if (typeof value === \"string\" && value.trim() !== \"\") return value;\n if (Array.isArray(value) && typeof value[0] === \"string\" && value[0].trim() !== \"\")\n return value[0];\n return undefined;\n}\n\nfunction buildSessionRedactions(includeSensitive: boolean): PublicSessionInfo[\"redactions\"] {\n const redactions: PublicSessionInfo[\"redactions\"] = [\n { field: \"env\", reason: \"secret_or_internal\" },\n { field: \"mcpServers\", reason: \"secret_or_internal\" },\n { field: \"sandbox\", reason: \"secret_or_internal\" },\n { field: \"debugFile\", reason: \"secret_or_internal\" },\n { field: \"pathToClaudeCodeExecutable\", reason: \"secret_or_internal\" },\n ];\n if (!includeSensitive) {\n redactions.push(\n { field: \"cwd\", reason: \"sensitive_by_default\" },\n { field: \"systemPrompt\", reason: \"sensitive_by_default\" },\n { field: \"agents\", reason: \"sensitive_by_default\" },\n { field: \"additionalDirectories\", reason: \"sensitive_by_default\" }\n );\n }\n return redactions;\n}\n\nfunction buildGotchasEntries(): GotchaEntry[] {\n return [\n {\n id: \"permission-timeout\",\n title: \"Permission requests auto-deny on timeout\",\n severity: \"high\",\n appliesTo: [\"claude_code_check.actions\", \"permission workflow\"],\n symptom:\n \"Session waits for approval, then tool call is denied without explicit caller decision.\",\n detection:\n \"Observe actions[].expiresAt/remainingMs and permission_result with source=timeout.\",\n remedy:\n \"Poll more frequently and respond before timeout; increase permissionRequestTimeoutMs if needed.\",\n example: \"Default timeout is 60000ms and server-clamped to 300000ms.\",\n },\n {\n id: \"read-size-cap\",\n title: \"Read may cap response size\",\n severity: \"medium\",\n appliesTo: [\"Read tool\"],\n symptom: \"Large file reads are truncated or fail.\",\n detection: \"Read responses are incomplete for large files.\",\n remedy: \"Use offset/limit paging or chunk with Grep.\",\n },\n {\n id: \"edit-replace-all\",\n title: \"Edit replace_all uses substring matching\",\n severity: \"medium\",\n appliesTo: [\"Edit tool\"],\n symptom: \"replace_all=true fails unexpectedly.\",\n detection: \"Tool returns error when no exact substring match is found.\",\n remedy: \"Validate exact match text first; prefer smaller targeted replacements.\",\n },\n {\n id: \"windows-path-normalization\",\n title: \"Windows path normalization applies to common MSYS-style paths\",\n severity: \"medium\",\n appliesTo: [\"Windows\", \"cwd\", \"additionalDirectories\", \"file_path\"],\n symptom: \"Permission/path behavior differs from raw input path text.\",\n detection: \"Compare submitted path with effective path in logs/permission prompts.\",\n remedy:\n \"Use absolute native Windows paths when possible; avoid relying on implicit conversion behavior.\",\n example: \"/d/... /mnt/c/... /cygdrive/c/... //server/share/... are normalized on Windows.\",\n },\n {\n id: \"team-delete-async-cleanup\",\n title: \"TeamDelete cleanup can be asynchronous\",\n severity: \"low\",\n appliesTo: [\"TeamDelete\"],\n symptom: \"Immediate follow-up calls still see active members.\",\n detection: \"TeamDelete reports shutdown_approved or active member transitions.\",\n remedy: \"Retry after short delay; wait for shutdown state to settle.\",\n },\n {\n id: \"skills-late-availability\",\n title: \"Skills may become available later in a session\",\n severity: \"low\",\n appliesTo: [\"Skills\"],\n symptom: \"Early calls show unknown skill/tool errors.\",\n detection: \"Later calls in same session succeed without config changes.\",\n remedy: \"Retry after initialization events are complete.\",\n },\n {\n id: \"tool-count-sources-differ\",\n title: \"toolCatalogCount and availableTools have different sources\",\n severity: \"medium\",\n appliesTo: [\"internal-tools\", \"claude_code_check.availableTools\", \"compat-report\"],\n symptom: \"Tool counts appear inconsistent (for example 15 vs 28).\",\n detection: \"Compare compat-report.toolCounts and session-level availableTools.\",\n remedy:\n \"Treat catalog count as server-known baseline and availableTools as session runtime view from system/init.tools.\",\n },\n {\n id: \"available-tools-not-exhaustive\",\n title: \"availableTools may omit internal features\",\n severity: \"low\",\n appliesTo: [\"claude_code_check.availableTools\"],\n symptom: \"A known feature is callable but not listed in availableTools.\",\n detection: \"Feature works while missing from availableTools list.\",\n remedy: \"Use availableTools as runtime hint, not exhaustive capability proof.\",\n example: \"Some internal features (e.g. ToolSearch) may not appear.\",\n },\n ];\n}\n\nfunction asVersionedPayload(params: {\n schemaVersion: string;\n stability: \"stable\" | \"experimental\";\n payload: Record<string, unknown>;\n}): Record<string, unknown> {\n const updatedAt = new Date().toISOString();\n return {\n ...params.payload,\n schemaVersion: params.schemaVersion,\n updatedAt,\n etag: computeEtag(params.payload),\n stability: params.stability,\n };\n}\n\nexport function registerResources(\n server: McpServer,\n deps: { toolCache: ToolDiscoveryCache; version: string; sessionManager: SessionManager }\n): void {\n const startedAt = new Date().toISOString();\n const resourceSchemaVersion = \"1.3\";\n const mcpProtocolVersion = \"2025-03-26\";\n const gotchasEntries = buildGotchasEntries();\n const catalogToolNames = new Set(defaultCatalogTools().map((tool) => tool.name));\n const staticResourceUris = Object.values(RESOURCE_URIS);\n const templateUris = Object.values(RESOURCE_TEMPLATES);\n\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 asJsonResource(\n serverInfoUri,\n (() => {\n const base: Record<string, unknown> = {\n name: \"claude-code-mcp\",\n version: deps.version,\n node: process.version,\n platform: process.platform,\n arch: process.arch,\n mcpProtocolVersion,\n startedAt,\n uptimeSec: Math.floor(process.uptime()),\n resources: staticResourceUris,\n resourceTemplates: templateUris,\n toolCatalogCount: deps.toolCache.getTools().length,\n capabilities: {\n resources: true,\n toolsListChanged: true,\n resourcesListChanged: true,\n prompts: false,\n completions: false,\n },\n limits: {\n maxSessions: serializeLimit(deps.sessionManager.getMaxSessions()),\n maxPendingPermissionsPerSession: serializeLimit(\n deps.sessionManager.getMaxPendingPermissionsPerSession()\n ),\n eventBuffer: deps.sessionManager.getEventBufferConfig(),\n pollDefaults: {\n runningMs: 3000,\n waitingPermissionMs: 1000,\n },\n },\n };\n if (typeof process.env.CLAUDE_CODE_MCP_BUILD_COMMIT === \"string\") {\n const commit = process.env.CLAUDE_CODE_MCP_BUILD_COMMIT.trim();\n if (commit !== \"\") base.buildCommit = commit;\n }\n return asVersionedPayload({\n schemaVersion: resourceSchemaVersion,\n stability: \"stable\",\n payload: base,\n });\n })()\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 asJsonResource(\n toolsUri,\n (() => {\n const base: Record<string, unknown> = {\n tools: deps.toolCache.getTools(),\n toolCatalogCount: deps.toolCache.getTools().length,\n };\n return asVersionedPayload({\n schemaVersion: resourceSchemaVersion,\n stability: \"stable\",\n payload: base,\n });\n })()\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 ...gotchasEntries.map((entry) => `- ${entry.title}. ${entry.remedy}`),\n \"\",\n ].join(\"\\n\"),\n \"text/markdown\"\n )\n );\n\n const compatReportUri = new URL(RESOURCE_URIS.compatReport);\n\n const quickstartUri = new URL(RESOURCE_URIS.quickstart);\n server.registerResource(\n \"quickstart\",\n quickstartUri.toString(),\n {\n title: \"Quickstart\",\n description: \"Minimal async polling flow for claude_code / claude_code_check.\",\n mimeType: \"text/markdown\",\n },\n () =>\n asTextResource(\n quickstartUri,\n [\n \"# claude-code-mcp quickstart\",\n \"\",\n \"1. Call `claude_code` with `{ prompt }` and keep `sessionId`.\",\n \"2. Poll with `claude_code_check(action='poll')` using `nextCursor`.\",\n \"3. If actions are returned, respond with `claude_code_check(action='respond_permission')`.\",\n \"4. Continue polling until status becomes `idle` / `error` / `cancelled`.\",\n \"\",\n \"Notes:\",\n \"- `respond_user_input` is not supported on this backend.\",\n \"- `allowedTools` is pre-approval by default; set `strictAllowedTools=true` for strict allowlist behavior.\",\n \"- Prefer `responseMode='delta_compact'` for high-frequency polling.\",\n ].join(\"\\n\"),\n \"text/markdown\"\n )\n );\n\n const errorsUri = new URL(RESOURCE_URIS.errors);\n server.registerResource(\n \"errors\",\n errorsUri.toString(),\n {\n title: \"Errors\",\n description: \"Structured error codes and remediation hints.\",\n mimeType: \"application/json\",\n },\n () => {\n const codes = Object.values(ErrorCode);\n const hints = {\n [ErrorCode.INVALID_ARGUMENT]: \"Validate required fields and enum values.\",\n [ErrorCode.SESSION_NOT_FOUND]: \"Session may be expired or server-restarted.\",\n [ErrorCode.SESSION_BUSY]: \"Wait for running/waiting_permission session to settle.\",\n [ErrorCode.PERMISSION_REQUEST_NOT_FOUND]:\n \"The permission request was already finished/expired.\",\n [ErrorCode.PERMISSION_DENIED]: \"Check token/secrets/policy restrictions.\",\n [ErrorCode.RESOURCE_EXHAUSTED]: \"Reduce session count or increase server limits.\",\n [ErrorCode.TIMEOUT]: \"Increase timeout or poll/respond more frequently.\",\n [ErrorCode.CANCELLED]: \"Request/session was cancelled by caller or shutdown.\",\n [ErrorCode.INTERNAL]: \"Inspect server logs and runtime environment.\",\n };\n return asJsonResource(\n errorsUri,\n asVersionedPayload({\n schemaVersion: resourceSchemaVersion,\n stability: \"stable\",\n payload: {\n codes,\n hints,\n },\n })\n );\n }\n );\n\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 const diskResumeEnabled = process.env.CLAUDE_CODE_MCP_ALLOW_DISK_RESUME === \"1\";\n const resumeSecretConfigured =\n typeof process.env.CLAUDE_CODE_MCP_RESUME_SECRET === \"string\" &&\n process.env.CLAUDE_CODE_MCP_RESUME_SECRET.trim() !== \"\";\n const runtimeToolStats = deps.sessionManager.getRuntimeToolStats();\n const toolCatalogCount = deps.toolCache.getTools().length;\n const detectedMismatches: string[] = [];\n if (\n runtimeToolStats.sessionsWithInitTools > 0 &&\n runtimeToolStats.runtimeDiscoveredUniqueCount < toolCatalogCount\n ) {\n detectedMismatches.push(\n \"Runtime discovered tools are fewer than catalog tools; some features may be hidden or not surfaced in system/init.tools.\"\n );\n }\n const updatedAt = new Date().toISOString();\n const base = {\n transport: \"stdio\",\n samePlatformRequired: true,\n packageVersion: deps.version,\n runtime: {\n node: process.version,\n platform: process.platform,\n arch: process.arch,\n },\n limits: {\n maxSessions: serializeLimit(deps.sessionManager.getMaxSessions()),\n maxPendingPermissionsPerSession: serializeLimit(\n deps.sessionManager.getMaxPendingPermissionsPerSession()\n ),\n eventBuffer: deps.sessionManager.getEventBufferConfig(),\n },\n diskResume: {\n enabled: diskResumeEnabled,\n resumeSecretConfigured,\n },\n features: {\n resources: true,\n resourceTemplates: true,\n toolsListChanged: true,\n resourcesListChanged: true,\n sessionInterrupt: true,\n allowForSessionDecision: true,\n respondUserInput: false,\n prompts: false,\n completions: false,\n },\n recommendedSettings: {\n responseMode: \"delta_compact\",\n poll: {\n runningMs: 3000,\n waitingPermissionMs: 1000,\n cursorStrategy: \"Persist nextCursor and de-duplicate by event.id.\",\n },\n timeouts: {\n sessionInitTimeoutMs: 10000,\n permissionRequestTimeoutMs: 60000,\n permissionRequestTimeoutMaxMs: 300000,\n },\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 \"Set strictAllowedTools=true when you need allowedTools to behave as a strict allowlist.\",\n \"This server assumes MCP client and server run on the same machine/platform.\",\n \"For high-frequency status checks, prefer responseMode='delta_compact'.\",\n \"respond_user_input is not supported on this backend; use poll/respond_permission flow.\",\n ],\n toolCounts: {\n catalogCount: toolCatalogCount,\n sessionsWithInitTools: runtimeToolStats.sessionsWithInitTools,\n runtimeDiscoveredUniqueCount: runtimeToolStats.runtimeDiscoveredUniqueCount,\n explain:\n \"catalogCount is server catalog size; runtimeDiscoveredUniqueCount is union of system/init.tools across active sessions.\",\n },\n toolCatalogCount,\n detectedMismatches,\n runtimeWarnings,\n resourceTemplates: templateUris,\n };\n const healthScore = Math.max(\n 0,\n 100 - runtimeWarnings.length * 10 - detectedMismatches.length * 15\n );\n\n return asJsonResource(\n compatReportUri,\n asVersionedPayload({\n schemaVersion: resourceSchemaVersion,\n stability: \"stable\",\n payload: {\n ...base,\n healthScore,\n updatedAt,\n },\n })\n );\n }\n );\n\n server.registerResource(\n \"session_snapshot_template\",\n new ResourceTemplate(RESOURCE_TEMPLATES.sessionById, { list: undefined }),\n {\n title: \"Session Snapshot Template\",\n description: \"Read lightweight session diagnostics by sessionId.\",\n mimeType: \"application/json\",\n },\n (uri, variables) => {\n const sessionId =\n extractSingleVariable(variables.sessionId) ??\n extractSingleVariable(uri.searchParams.get(\"sessionId\"));\n const payload =\n typeof sessionId !== \"string\" || sessionId.trim() === \"\"\n ? {\n found: false,\n message: \"sessionId is required in URI template variable.\",\n }\n : (() => {\n const session = deps.sessionManager.get(sessionId);\n if (!session) {\n return {\n sessionId,\n found: false,\n message: `Session '${sessionId}' not found.`,\n };\n }\n const base = deps.sessionManager.toPublicJSON(session);\n const stored = deps.sessionManager.getResult(sessionId);\n return {\n sessionId,\n found: true,\n session: {\n ...base,\n pendingPermissionCount: deps.sessionManager.getPendingPermissionCount(sessionId),\n eventCount: deps.sessionManager.getEventCount(sessionId),\n currentCursor: deps.sessionManager.getCurrentCursor(sessionId),\n lastEventId: deps.sessionManager.getLastEventId(sessionId),\n ttlMs: deps.sessionManager.getRemainingTtlMs(sessionId),\n lastError: stored?.type === \"error\" ? stored.result.result : undefined,\n lastErrorAt: stored?.type === \"error\" ? stored.createdAt : undefined,\n redactions: buildSessionRedactions(false),\n },\n };\n })();\n\n return asJsonResource(\n uri,\n asVersionedPayload({\n schemaVersion: resourceSchemaVersion,\n stability: \"stable\",\n payload: payload as Record<string, unknown>,\n })\n );\n }\n );\n\n server.registerResource(\n \"runtime_tools_template\",\n new ResourceTemplate(RESOURCE_TEMPLATES.runtimeTools, { list: undefined }),\n {\n title: \"Runtime Tools Template\",\n description: \"Read runtime tool view globally or for a specific sessionId.\",\n mimeType: \"application/json\",\n },\n (uri, variables) => {\n const sessionId =\n extractSingleVariable(variables.sessionId) ??\n extractSingleVariable(uri.searchParams.get(\"sessionId\"));\n const internalToolCount = catalogToolNames.size;\n const payload = (() => {\n if (typeof sessionId === \"string\" && sessionId.trim() !== \"\") {\n const session = deps.sessionManager.get(sessionId);\n if (!session) {\n return {\n sessionId,\n source: \"session_not_found\",\n availableTools: [],\n toolCounts: {\n internalToolCount,\n runtimeAvailableCount: 0,\n sessionAugmentedToolCount: 0,\n },\n };\n }\n const initTools = deps.sessionManager.getInitTools(sessionId) ?? [];\n const discovered = discoverToolsFromInit(initTools);\n const sessionAugmentedToolCount = discovered.filter(\n (tool) => !catalogToolNames.has(tool.name)\n ).length;\n return {\n sessionId,\n source: initTools.length > 0 ? \"session_runtime\" : \"session_without_init\",\n availableTools: discovered,\n toolCounts: {\n internalToolCount,\n runtimeAvailableCount: discovered.length,\n sessionAugmentedToolCount,\n },\n };\n }\n const catalog = deps.toolCache.getTools();\n const sessionAugmentedToolCount = catalog.filter(\n (tool) => !catalogToolNames.has(tool.name)\n ).length;\n return {\n source: \"catalog\",\n availableTools: catalog,\n toolCounts: {\n internalToolCount,\n runtimeAvailableCount: catalog.length,\n sessionAugmentedToolCount,\n },\n };\n })();\n\n return asJsonResource(\n uri,\n asVersionedPayload({\n schemaVersion: resourceSchemaVersion,\n stability: \"stable\",\n payload: payload as Record<string, unknown>,\n })\n );\n }\n );\n\n server.registerResource(\n \"compat_diff_template\",\n new ResourceTemplate(RESOURCE_TEMPLATES.compatDiff, { list: undefined }),\n {\n title: \"Compatibility Diff Template\",\n description: \"Returns client-specific compatibility guidance and recommended settings.\",\n mimeType: \"application/json\",\n },\n (uri, variables) => {\n const clientRaw =\n extractSingleVariable(variables.client) ??\n extractSingleVariable(uri.searchParams.get(\"client\"));\n const clientFingerprint = (clientRaw ?? \"unknown\").trim();\n const key = clientFingerprint.toLowerCase();\n const profile = (() => {\n if (key.includes(\"codex\")) {\n return {\n clientFamily: \"codex\",\n detectedMismatches: [] as string[],\n recommendations: [\n \"Prefer responseMode='delta_compact' for fast status loops.\",\n \"Enable pollOptions.includeTools=true when exact runtime tool names are required.\",\n ],\n };\n }\n if (key.includes(\"claude\")) {\n return {\n clientFamily: \"claude\",\n detectedMismatches: [] as string[],\n recommendations: [\n \"Use resources and resource templates for low-latency diagnostics.\",\n \"Use allowedTools/disallowedTools with exact runtime names.\",\n \"Enable strictAllowedTools when running in locked-down governance mode.\",\n ],\n };\n }\n if (key.includes(\"cursor\")) {\n return {\n clientFamily: \"cursor\",\n detectedMismatches: [\n \"Verify that resources/list and resourceTemplates/list are refreshed after list_changed notifications.\",\n ],\n recommendations: [\n \"Prefer claude_code_check polling as source of truth for runtime state.\",\n \"Fallback to tool calls if resource template support is partial.\",\n ],\n };\n }\n return {\n clientFamily: \"generic\",\n detectedMismatches: [] as string[],\n recommendations: [\n \"Persist nextCursor and de-duplicate by event.id.\",\n \"Use responseMode='delta_compact' for high-frequency polling, full mode only for diagnostics.\",\n ],\n };\n })();\n\n return asJsonResource(\n uri,\n asVersionedPayload({\n schemaVersion: resourceSchemaVersion,\n stability: \"experimental\",\n payload: {\n clientFingerprint,\n ...profile,\n recommendedSettings: {\n responseMode: \"delta_compact\",\n poll: {\n runningMs: 3000,\n waitingPermissionMs: 1000,\n cursorStrategy: \"Persist nextCursor and de-duplicate by event.id.\",\n },\n },\n },\n })\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","existsSync","ErrorCode","path","options","event","sessionId","existsSync","existsSync","statSync","os","path","existsSync","statSync","os","path","abortController","options","sessionAugmentedToolCount"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/server.ts","../src/utils/normalize-windows-path.ts","../src/utils/normalize-tool-input.ts","../src/session/manager.ts","../src/tools/claude-code.ts","../src/types.ts","../src/tools/query-consumer.ts","../src/utils/windows.ts","../src/utils/permission-updated-input.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-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 notifyInternalToolsResourceChanged = () => {\n if (!server.isConnected()) return;\n // Prefer the stable high-level API to avoid coupling to internal SDK fields.\n // This notifies clients to refresh resources when the runtime tool catalog changes.\n server.sendResourceListChanged();\n };\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 notifyInternalToolsResourceChanged();\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 } 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 strictAllowedTools: z.boolean().optional().describe(\"Default: false\"),\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 strictAllowedTools: z.boolean().optional().describe(\"Default: false\"),\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, clamped to 300000\"),\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, clamped to 300000\"),\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, cancel, or interrupt sessions.\",\n inputSchema: {\n action: z.enum(SESSION_ACTIONS),\n sessionId: z.string().optional().describe(\"Required for get/cancel/interrupt\"),\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\n .enum(CHECK_RESPONSE_MODES)\n .optional()\n .describe(\"Default: 'minimal'. Use 'delta_compact' for lightweight polling.\"),\n maxEvents: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"Default: 200 (minimal), unlimited (full/delta_compact)\"),\n\n requestId: z.string().optional().describe(\"Default: none\"),\n decision: z\n .enum([\"allow\", \"deny\", \"allow_for_session\"])\n .optional()\n .describe(\"Default: none\"),\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\n .boolean()\n .optional()\n .describe(\"Default: full=true, minimal/delta_compact=false\"),\n includeModelUsage: z\n .boolean()\n .optional()\n .describe(\"Default: full=true, minimal/delta_compact=false\"),\n includeStructuredOutput: z\n .boolean()\n .optional()\n .describe(\"Default: full=true, minimal/delta_compact=false\"),\n includeTerminalEvents: z\n .boolean()\n .optional()\n .describe(\"Default: full=true, minimal/delta_compact=false\"),\n includeProgressEvents: z\n .boolean()\n .optional()\n .describe(\"Default: full=true, minimal/delta_compact=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, version: SERVER_VERSION, sessionManager });\n\n return { server, sessionManager, toolCache };\n}\n\nexport function createServer(serverCwd: string): McpServer {\n return createServerContext(serverCwd).server;\n}\n","import path from \"node:path\";\nimport os from \"node:os\";\n\nconst TOOL_INPUT_PATH_FIELDS = [\n \"file_path\",\n \"path\",\n \"directory\",\n \"folder\",\n \"cwd\",\n \"dest\",\n \"destination\",\n \"source\",\n \"target\",\n] as const;\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 convertMsysToWindowsPath(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 = convertMsysToWindowsPath(rawPath);\n if (!converted) return undefined;\n return path.win32.normalize(converted);\n}\n\nexport function isUnsupportedPosixAbsolutePath(\n value: string,\n platform: NodeJS.Platform = process.platform\n): boolean {\n if (platform !== \"win32\") return false;\n if (!value.startsWith(\"/\")) return false;\n return convertMsysToWindowsPath(value) === undefined;\n}\n\nexport function hasUnsupportedPosixAbsoluteFilePath(\n input: Record<string, unknown>,\n platform: NodeJS.Platform = process.platform\n): boolean {\n const filePath = input.file_path;\n if (typeof filePath !== \"string\") return false;\n return isUnsupportedPosixAbsolutePath(filePath, platform);\n}\n\nfunction extractPosixHomePathFromCommand(command: string): string | undefined {\n const match = command.match(/\\/home\\/[^/\\s\"'`]+(?:\\/[^\\s\"'`]*)?/);\n return match?.[0];\n}\n\nexport function findUnsupportedPosixPathInToolInput(\n input: Record<string, unknown>,\n platform: NodeJS.Platform = process.platform\n): string | undefined {\n if (platform !== \"win32\") return undefined;\n\n for (const key of TOOL_INPUT_PATH_FIELDS) {\n const value = input[key];\n if (typeof value !== \"string\") continue;\n if (isUnsupportedPosixAbsolutePath(value, platform)) return value;\n }\n\n const command = input.command;\n if (typeof command !== \"string\") return undefined;\n const embeddedHomePath = extractPosixHomePathFromCommand(command);\n if (!embeddedHomePath) return undefined;\n return isUnsupportedPosixAbsolutePath(embeddedHomePath, platform) ? embeddedHomePath : undefined;\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 { normalizeToolInput } from \"../utils/normalize-tool-input.js\";\nimport { findUnsupportedPosixPathInToolInput } from \"../utils/normalize-windows-path.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\nfunction parsePositiveInt(raw: string | undefined): number | undefined {\n if (typeof raw !== \"string\" || raw.trim() === \"\") return undefined;\n const parsed = Number.parseInt(raw, 10);\n if (!Number.isFinite(parsed) || parsed <= 0) return undefined;\n return parsed;\n}\n\nfunction normalizePositiveNumber(value: number | undefined): number | undefined {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) return undefined;\n return Math.trunc(value);\n}\n\nfunction normalizeToolPolicyNames(values: string[] | undefined): string[] {\n if (!Array.isArray(values) || values.length === 0) return [];\n return values\n .filter((value): value is string => typeof value === \"string\")\n .map((value) => value.trim())\n .filter((value) => value !== \"\");\n}\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 private eventBufferMaxSize: number;\n private eventBufferHardMaxSize: number;\n private destroyed = false;\n\n constructor(opts?: {\n platform?: NodeJS.Platform;\n maxSessions?: number;\n maxPendingPermissionsPerSession?: number;\n eventBufferMaxSize?: number;\n eventBufferHardMaxSize?: 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\n const configuredEventBufferMaxSize =\n normalizePositiveNumber(opts?.eventBufferMaxSize) ??\n parsePositiveInt(process.env.CLAUDE_CODE_MCP_EVENT_BUFFER_MAX_SIZE);\n const configuredEventBufferHardMaxSize =\n normalizePositiveNumber(opts?.eventBufferHardMaxSize) ??\n parsePositiveInt(process.env.CLAUDE_CODE_MCP_EVENT_BUFFER_HARD_MAX_SIZE);\n\n this.eventBufferMaxSize = configuredEventBufferMaxSize ?? DEFAULT_EVENT_BUFFER_MAX_SIZE;\n const initialHardMaxSize =\n configuredEventBufferHardMaxSize ?? DEFAULT_EVENT_BUFFER_HARD_MAX_SIZE;\n this.eventBufferHardMaxSize = Math.max(this.eventBufferMaxSize, initialHardMaxSize);\n if (initialHardMaxSize < this.eventBufferMaxSize) {\n console.error(\n `[config] CLAUDE_CODE_MCP_EVENT_BUFFER_HARD_MAX_SIZE (${initialHardMaxSize}) is smaller than maxSize (${this.eventBufferMaxSize}); clamped to ${this.eventBufferHardMaxSize}.`\n );\n }\n\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 if (this.destroyed) return 0;\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 getEventBufferConfig(): { maxSize: number; hardMaxSize: number } {\n return {\n maxSize: this.eventBufferMaxSize,\n hardMaxSize: this.eventBufferHardMaxSize,\n };\n }\n\n getSessionTtlMs(): number {\n return this.sessionTtlMs;\n }\n\n getRunningSessionMaxMs(): number {\n return this.runningSessionMaxMs;\n }\n\n hasCapacityFor(additionalSessions: number): boolean {\n if (this.destroyed) return false;\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 strictAllowedTools?: SessionInfo[\"strictAllowedTools\"];\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 queryInterrupt?: SessionInfo[\"queryInterrupt\"];\n }): SessionInfo {\n if (this.destroyed) {\n throw new Error(\"SessionManager is destroyed and no longer accepts new sessions.\");\n }\n\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 strictAllowedTools: params.strictAllowedTools,\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 queryInterrupt: params.queryInterrupt,\n };\n this.sessions.set(params.sessionId, info);\n this.runtime.set(params.sessionId, {\n buffer: {\n events: [],\n maxSize: this.eventBufferMaxSize,\n hardMaxSize: this.eventBufferHardMaxSize,\n nextId: 0,\n },\n pendingPermissions: new Map(),\n });\n return info;\n }\n\n get(sessionId: string): SessionInfo | undefined {\n if (this.destroyed) return 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 if (this.destroyed) return [];\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 if (this.destroyed) return 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's status from expectedStatus to \"running\".\n * This only covers synchronous state mutation within SessionManager.\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 (this.destroyed) return 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.queryInterrupt = undefined;\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 if (this.destroyed) return false;\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.queryInterrupt) {\n try {\n info.queryInterrupt();\n } catch {\n // ignore interrupt errors\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.queryInterrupt = undefined;\n info.lastActiveAt = new Date().toISOString();\n return true;\n }\n\n interrupt(sessionId: string, opts?: { reason?: string; source?: string }): boolean {\n if (this.destroyed) return false;\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: opts?.reason ?? \"Session interrupted\", interrupt: true },\n \"interrupt\"\n );\n }\n\n if (info.queryInterrupt) {\n try {\n info.queryInterrupt();\n } catch {\n // ignore interrupt errors\n }\n }\n if (info.abortController) {\n info.abortController.abort();\n }\n\n this.pushEvent(sessionId, {\n type: \"progress\",\n data: {\n type: \"interrupted\",\n reason: opts?.reason ?? \"Session interrupted\",\n source: opts?.source ?? \"interrupt\",\n },\n timestamp: new Date().toISOString(),\n });\n info.lastActiveAt = new Date().toISOString();\n return true;\n }\n\n delete(sessionId: string): boolean {\n if (this.destroyed) return false;\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 if (this.destroyed) return;\n const state = this.runtime.get(sessionId);\n if (!state) return;\n state.storedResult = result;\n }\n\n getResult(sessionId: string): StoredAgentResult | undefined {\n if (this.destroyed) return undefined;\n return this.runtime.get(sessionId)?.storedResult;\n }\n\n setInitTools(sessionId: string, tools: string[]): void {\n if (this.destroyed) return;\n const state = this.runtime.get(sessionId);\n if (!state) return;\n state.initTools = tools;\n }\n\n getInitTools(sessionId: string): string[] | undefined {\n if (this.destroyed) return 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 if (this.destroyed) return 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 if (this.destroyed) return 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 if (this.destroyed) return { events: [], nextCursor: cursor ?? 0 };\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 if (this.destroyed) return;\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 if (this.destroyed) return false;\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 if (this.destroyed) return 0;\n return this.runtime.get(sessionId)?.pendingPermissions.size ?? 0;\n }\n\n getEventCount(sessionId: string): number {\n if (this.destroyed) return 0;\n return this.runtime.get(sessionId)?.buffer.events.length ?? 0;\n }\n\n getCurrentCursor(sessionId: string): number | undefined {\n if (this.destroyed) return undefined;\n const state = this.runtime.get(sessionId);\n if (!state) return undefined;\n return state.buffer.nextId;\n }\n\n getRemainingTtlMs(sessionId: string): number | undefined {\n if (this.destroyed) return undefined;\n const session = this.sessions.get(sessionId);\n if (!session) return undefined;\n const lastActiveMs = Date.parse(session.lastActiveAt);\n if (!Number.isFinite(lastActiveMs)) return undefined;\n const limitMs =\n session.status === \"running\" || session.status === \"waiting_permission\"\n ? this.runningSessionMaxMs\n : this.sessionTtlMs;\n return Math.max(0, limitMs - (Date.now() - lastActiveMs));\n }\n\n getRuntimeToolStats(): {\n sessionsWithInitTools: number;\n runtimeDiscoveredUniqueCount: number;\n } {\n if (this.destroyed) {\n return { sessionsWithInitTools: 0, runtimeDiscoveredUniqueCount: 0 };\n }\n const unique = new Set<string>();\n let sessionsWithInitTools = 0;\n for (const state of this.runtime.values()) {\n if (!Array.isArray(state.initTools) || state.initTools.length === 0) continue;\n sessionsWithInitTools += 1;\n for (const tool of state.initTools) {\n if (typeof tool === \"string\" && tool.trim() !== \"\") {\n unique.add(tool);\n }\n }\n }\n return {\n sessionsWithInitTools,\n runtimeDiscoveredUniqueCount: unique.size,\n };\n }\n\n listPendingPermissions(sessionId: string): PermissionRequestRecord[] {\n if (this.destroyed) return [];\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 getPendingPermission(sessionId: string, requestId: string): PermissionRequestRecord | undefined {\n if (this.destroyed) return undefined;\n const state = this.runtime.get(sessionId);\n return state?.pendingPermissions.get(requestId)?.record;\n }\n\n allowToolForSession(sessionId: string, toolName: string): boolean {\n if (this.destroyed) return false;\n const info = this.sessions.get(sessionId);\n if (!info) return false;\n const normalized = toolName.trim();\n if (normalized === \"\") return false;\n const disallowed = normalizeToolPolicyNames(info.disallowedTools);\n if (disallowed.includes(normalized)) {\n return false;\n }\n const allowed = Array.isArray(info.allowedTools) ? [...info.allowedTools] : [];\n if (!allowed.includes(normalized)) {\n allowed.push(normalized);\n info.allowedTools = allowed;\n info.lastActiveAt = new Date().toISOString();\n }\n return true;\n }\n\n finishRequest(\n sessionId: string,\n requestId: string,\n result: PermissionResult,\n source: FinishSource\n ): boolean {\n if (this.destroyed) return false;\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 = normalizeToolPolicyNames(info.disallowedTools);\n const pendingToolName = pending.record.toolName.trim();\n if (pendingToolName !== \"\" && disallowed.includes(pendingToolName)) {\n finalResult = {\n behavior: \"deny\",\n message: `Tool '${pendingToolName}' 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 const normalizedUpdatedInput = validRecord\n ? normalizeToolInput(\n pending.record.toolName,\n updatedInput as Record<string, unknown>,\n this.platform\n )\n : normalizeToolInput(pending.record.toolName, pending.record.input, this.platform);\n\n const unsupportedPath = findUnsupportedPosixPathInToolInput(\n normalizedUpdatedInput,\n this.platform\n );\n if (unsupportedPath) {\n finalResult = {\n behavior: \"deny\",\n message: `Tool '${pending.record.toolName}' attempted to allow an unsupported POSIX path '${\n unsupportedPath\n }' on Windows.`,\n interrupt: false,\n };\n } else {\n finalResult = {\n ...finalResult,\n updatedInput: normalizedUpdatedInput,\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 if (this.destroyed) return;\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 if (this.destroyed) return;\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 cancelled (timeout).\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.queryInterrupt = undefined;\n info.status = \"cancelled\";\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.queryInterrupt = undefined;\n info.status = \"cancelled\";\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 // Deleting current entries during Map iteration is safe in JavaScript.\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 queryInterrupt: _queryInterrupt,\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 if (this.destroyed) return;\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.queryInterrupt = undefined;\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 this.drainingSessions.clear();\n this.runtime.clear();\n this.sessions.clear();\n this.destroyed = true;\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 SessionManager.evictEventsToLimits(buffer, isActivePermissionRequest);\n\n return full;\n }\n\n private static evictEventsToLimits(\n buffer: EventBuffer,\n isActivePermissionRequest?: (requestId: string) => boolean\n ): void {\n if (buffer.events.length <= buffer.maxSize && buffer.events.length <= buffer.hardMaxSize) {\n return;\n }\n\n const droppedIds = new Set<number>();\n let remaining = buffer.events.length;\n\n const dropOldestMatching = (count: number, predicate: (e: SessionEvent) => boolean): number => {\n if (count <= 0) return 0;\n let dropped = 0;\n for (const event of buffer.events) {\n if (dropped >= count) break;\n if (droppedIds.has(event.id)) continue;\n if (!predicate(event)) continue;\n droppedIds.add(event.id);\n dropped += 1;\n }\n if (dropped > 0) {\n remaining -= dropped;\n }\n return dropped;\n };\n\n const isDroppablePermissionEvent = (event: SessionEvent): boolean => {\n if (event.type === \"permission_result\") return true;\n if (event.type !== \"permission_request\") return false;\n const requestId = (event.data as { requestId?: unknown } | null)?.requestId;\n if (typeof requestId !== \"string\") return true;\n return isActivePermissionRequest ? !isActivePermissionRequest(requestId) : true;\n };\n\n // Soft limit: prefer dropping unpinned events first.\n let toDropForSoftLimit = remaining - buffer.maxSize;\n if (toDropForSoftLimit > 0) {\n toDropForSoftLimit -= dropOldestMatching(toDropForSoftLimit, (event) => !event.pinned);\n }\n if (toDropForSoftLimit > 0) {\n toDropForSoftLimit -= dropOldestMatching(toDropForSoftLimit, isDroppablePermissionEvent);\n }\n\n // Hard limit: only drop permission-related pinned events that are safe to evict.\n let toDropForHardLimit = remaining - buffer.hardMaxSize;\n if (toDropForHardLimit > 0) {\n toDropForHardLimit -= dropOldestMatching(toDropForHardLimit, isDroppablePermissionEvent);\n }\n\n if (droppedIds.size > 0) {\n buffer.events = buffer.events.filter((event) => !droppedIds.has(event.id));\n }\n }\n\n private static lowerBoundByEventId(events: SessionEvent[], startFrom: number): number {\n let left = 0;\n let right = events.length;\n while (left < right) {\n const mid = Math.floor((left + right) / 2);\n if (events[mid]!.id < startFrom) left = mid + 1;\n else right = mid;\n }\n return left;\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 startIndex = SessionManager.lowerBoundByEventId(buffer.events, startFrom);\n const filtered = buffer.events.slice(startIndex);\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 * claude_code tool - Start a new Claude Code agent session\n */\nimport { existsSync, statSync } from \"node:fs\";\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 */\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 betas?: string[];\n additionalDirectories?: string[];\n outputFormat?: { type: \"json_schema\"; schema: Record<string, unknown> };\n pathToClaudeCodeExecutable?: string;\n mcpServers?: Record<string, McpServerConfig>;\n sandbox?: SandboxSettings;\n fallbackModel?: string;\n enableFileCheckpointing?: boolean;\n includePartialMessages?: boolean;\n strictMcpConfig?: boolean;\n strictAllowedTools?: 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 strictAllowedTools?: boolean;\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 /** 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 cwdProvided = input.cwd !== undefined;\n const cwd = cwdProvided ? 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 const normalizedCwd = normalizeWindowsPathLike(cwd);\n if (cwdProvided && !existsSync(normalizedCwd)) {\n return {\n sessionId: \"\",\n status: \"error\",\n error: `Error [${ErrorCode.INVALID_ARGUMENT}]: cwd path does not exist: ${normalizedCwd}`,\n };\n }\n if (cwdProvided) {\n try {\n if (!statSync(normalizedCwd).isDirectory()) {\n return {\n sessionId: \"\",\n status: \"error\",\n error: `Error [${ErrorCode.INVALID_ARGUMENT}]: cwd must be a directory: ${normalizedCwd}`,\n };\n }\n } catch (err: unknown) {\n const detail = err instanceof Error ? ` (${err.message})` : \"\";\n return {\n sessionId: \"\",\n status: \"error\",\n error: `Error [${ErrorCode.INVALID_ARGUMENT}]: cwd is not accessible: ${normalizedCwd}${detail}`,\n };\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 ?? 10_000;\n\n // Flatten top-level + advanced into a single object for buildOptions / sessionManager.\n const flat = {\n cwd: normalizedCwd,\n allowedTools: input.allowedTools,\n disallowedTools: input.disallowedTools,\n strictAllowedTools: input.strictAllowedTools ?? adv.strictAllowedTools,\n maxTurns: input.maxTurns,\n model: input.model,\n systemPrompt: input.systemPrompt,\n ...adv,\n effort: input.effort,\n thinking: input.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 queryInterrupt: () => {\n handle.interrupt();\n },\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 };\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 * 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\", \"interrupt\"] 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 strictAllowedTools?: boolean;\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 strictAllowedTools?: boolean;\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 /** Runtime-only handle used to interrupt the active query turn. */\n queryInterrupt?: () => void;\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 strictAllowedTools?: boolean;\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 pendingPermissionCount?: number;\n eventCount?: number;\n currentCursor?: number;\n lastEventId?: number;\n ttlMs?: number;\n lastError?: string;\n lastErrorAt?: string;\n redactions?: Array<{\n field: string;\n reason: string;\n }>;\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\", \"delta_compact\"] as const;\nexport type CheckResponseMode = (typeof CHECK_RESPONSE_MODES)[number];\n\nexport type PermissionDecision = \"allow\" | \"deny\" | \"allow_for_session\";\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 * Internal tool approval is controlled by a combination of tools visibility,\n * allowedTools/disallowedTools, and runtime permission callbacks.\n */\n permissionModel?: \"policy_controlled\";\n /**\n * Whether machine-validated input schemas are available via discovery.\n */\n schemaAvailability?: \"none\";\n availabilityConditions?: string[];\n platformConstraints?: string[];\n notes?: 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 | \"interrupt\"\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 {\n findUnsupportedPosixPathInToolInput,\n isUnsupportedPosixAbsolutePath,\n} from \"../utils/normalize-windows-path.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 normalizePolicyToolNames(tools: string[] | undefined): string[] {\n if (!Array.isArray(tools) || tools.length === 0) return [];\n return tools\n .filter((tool): tool is string => typeof tool === \"string\")\n .map((tool) => tool.trim())\n .filter((tool) => tool !== \"\");\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 normalizedToolName = toolName.trim();\n const normalizedInput = normalizeToolInput(toolName, input, params.platform);\n const unsupportedPath = findUnsupportedPosixPathInToolInput(normalizedInput, params.platform);\n if (unsupportedPath) {\n return {\n behavior: \"deny\",\n message: `Tool '${normalizedToolName || toolName}' requested unsupported POSIX path '${\n unsupportedPath\n }' on Windows.`,\n interrupt: false,\n };\n }\n if (\n typeof options.blockedPath === \"string\" &&\n isUnsupportedPosixAbsolutePath(options.blockedPath, params.platform)\n ) {\n return {\n behavior: \"deny\",\n message: `Tool '${normalizedToolName || toolName}' requested blocked path '${options.blockedPath}' that is unsupported on Windows.`,\n interrupt: false,\n };\n }\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 const disallowedTools = normalizePolicyToolNames(sessionInfo.disallowedTools);\n const allowedTools = normalizePolicyToolNames(sessionInfo.allowedTools);\n if (normalizedToolName !== \"\" && disallowedTools.includes(normalizedToolName)) {\n return {\n behavior: \"deny\",\n message: `Tool '${normalizedToolName}' is disallowed by session policy.`,\n };\n }\n\n if (\n sessionInfo.strictAllowedTools === true &&\n normalizedToolName !== \"\" &&\n allowedTools.length > 0 &&\n !allowedTools.includes(normalizedToolName)\n ) {\n return {\n behavior: \"deny\",\n message: `Tool '${normalizedToolName}' is not in allowedTools under strictAllowedTools policy.`,\n interrupt: false,\n };\n }\n\n if (\n !options.blockedPath &&\n normalizedToolName !== \"\" &&\n allowedTools.includes(normalizedToolName)\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 queryInterrupt: undefined,\n });\n } else if (current) {\n params.sessionManager.update(sessionId, {\n totalTurns: sessionTotalTurns,\n totalCostUsd: sessionTotalCostUsd,\n abortController: undefined,\n queryInterrupt: 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 queryInterrupt: 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, {\n status: \"error\",\n abortController: undefined,\n queryInterrupt: undefined,\n });\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","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 { createHmac, timingSafeEqual } 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\nfunction timingSafeEqualText(a: string, b: string): boolean {\n const left = Buffer.from(a, \"utf8\");\n const rightRaw = Buffer.from(b, \"utf8\");\n const right = Buffer.alloc(left.length);\n rightRaw.copy(right, 0, 0, left.length);\n const sameLength = rightRaw.length === left.length;\n return timingSafeEqual(left, right) && sameLength;\n}\n\nexport function isValidResumeToken(sessionId: string, token: string, secrets: string[]): boolean {\n for (const secret of secrets) {\n const computed = computeResumeToken(sessionId, secret);\n if (timingSafeEqualText(computed, 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 strictAllowedTools?: 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 queryInterrupt?: () => void;\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 strictAllowedTools: src.strictAllowedTools,\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 queryInterrupt: input.queryInterrupt,\n };\n}\n","/**\n * claude_code_reply tool - Continue an existing Claude Code session (async)\n */\nimport { existsSync, statSync } from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\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\";\nimport { normalizeWindowsPathLike } from \"../utils/normalize-windows-path.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 strictAllowedTools?: 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 normalizeAndAssertCwd(cwd: string, contextLabel: string): string {\n const normalizedCwd = normalizeWindowsPathLike(cwd);\n const resolvedCwd = resolvePortableTmpAlias(normalizedCwd);\n if (!existsSync(resolvedCwd)) {\n throw new Error(\n `Error [${ErrorCode.INVALID_ARGUMENT}]: ${contextLabel} path does not exist: ${resolvedCwd}`\n );\n }\n try {\n const stat = statSync(resolvedCwd);\n if (!stat.isDirectory()) {\n throw new Error(\n `Error [${ErrorCode.INVALID_ARGUMENT}]: ${contextLabel} must be a directory: ${resolvedCwd}`\n );\n }\n } catch (err: unknown) {\n if (err instanceof Error && err.message.includes(\"Error [\")) throw err;\n const detail = err instanceof Error ? ` (${err.message})` : \"\";\n throw new Error(\n `Error [${ErrorCode.INVALID_ARGUMENT}]: ${contextLabel} is not accessible: ${resolvedCwd}${detail}`\n );\n }\n return resolvedCwd;\n}\n\nfunction resolvePortableTmpAlias(cwd: string): string {\n if (process.platform !== \"win32\") return cwd;\n\n const normalized = cwd.replace(/\\\\/g, \"/\");\n if (normalized === \"/tmp\") return os.tmpdir();\n if (normalized.startsWith(\"/tmp/\")) {\n return path.join(os.tmpdir(), normalized.slice(\"/tmp/\".length));\n }\n return cwd;\n}\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 const normalizedCwd = normalizeAndAssertCwd(dr.cwd, \"disk resume cwd\");\n return buildOptions({\n ...dr,\n cwd: normalizedCwd,\n } 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 const handle = 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 sessionManager.update(input.sessionId, {\n queryInterrupt: () => {\n handle.interrupt();\n },\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, {\n status: \"error\",\n abortController: undefined,\n queryInterrupt: undefined,\n });\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, {\n status: \"error\",\n abortController: undefined,\n queryInterrupt: undefined,\n });\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 normalizedCwd = normalizeAndAssertCwd(session.cwd, \"session cwd\");\n const options = buildOptions(session);\n options.cwd = normalizedCwd;\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 queryInterrupt: 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 queryInterrupt: () => {\n handle.interrupt();\n },\n })\n );\n }\n },\n });\n if (!input.forkSession) {\n sessionManager.update(input.sessionId, {\n queryInterrupt: () => {\n handle.interrupt();\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 queryInterrupt: 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, {\n status: \"error\",\n abortController: undefined,\n queryInterrupt: undefined,\n });\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\nconst DEFAULT_PERMISSION_MODEL: ToolInfo[\"permissionModel\"] = \"policy_controlled\";\nconst DEFAULT_SCHEMA_AVAILABILITY: ToolInfo[\"schemaAvailability\"] = \"none\";\n\nexport const TOOL_CATALOG: Record<string, ToolCatalogEntry> = {\n Bash: {\n description: \"Run shell commands\",\n category: \"execute\",\n notes: [\"Execution may require permission approval depending on session policy.\"],\n },\n Read: {\n description: \"Read file contents (large files: use offset/limit or Grep)\",\n category: \"file_read\",\n notes: [\"Large reads are often capped by the backend; use offset/limit when needed.\"],\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 availabilityConditions: [\"Requires Task to be visible and approved by session policy.\"],\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 notes: [\"Team cleanup can be asynchronous during shutdown.\"],\n },\n};\n\nfunction uniq<T>(items: T[]): T[] {\n return Array.from(new Set(items));\n}\n\nfunction withToolDefaults(tool: ToolInfo): ToolInfo {\n return {\n ...tool,\n permissionModel: tool.permissionModel ?? DEFAULT_PERMISSION_MODEL,\n schemaAvailability: tool.schemaAvailability ?? DEFAULT_SCHEMA_AVAILABILITY,\n };\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 withToolDefaults({\n name,\n description: TOOL_CATALOG[name]?.description ?? name,\n category: TOOL_CATALOG[name]?.category,\n availabilityConditions: TOOL_CATALOG[name]?.availabilityConditions,\n platformConstraints: TOOL_CATALOG[name]?.platformConstraints,\n notes: TOOL_CATALOG[name]?.notes,\n })\n );\n}\n\nexport function defaultCatalogTools(): ToolInfo[] {\n return Object.keys(TOOL_CATALOG)\n .sort((a, b) => a.localeCompare(b))\n .map((name) => withToolDefaults({ 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 * Use \"delta_compact\" for high-frequency status polling.\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'/'allow_for_session'). */\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\" || params.decision === \"allow_for_session\") {\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\nfunction appendAllowForSessionUpdate(\n updates: Array<Record<string, unknown>> | undefined,\n toolName: string | undefined\n): Array<Record<string, unknown>> | undefined {\n const normalizedToolName = toolName?.trim();\n if (!normalizedToolName) return updates;\n return [\n ...(updates ?? []),\n {\n type: \"addRules\",\n behavior: \"allow\",\n destination: \"session\",\n rules: [{ toolName: normalizedToolName }],\n },\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\n // Check additionalDirectories for POSIX paths on Windows\n if (process.platform === \"win32\" && Array.isArray(session.additionalDirectories)) {\n for (const dir of session.additionalDirectories) {\n if (typeof dir === \"string\" && dir.startsWith(\"/\") && !dir.startsWith(\"//\")) {\n warnings.push(\n `additionalDirectories contains POSIX-style path '${dir}' on Windows. Consider using a Windows path to avoid path compatibility issues.`\n );\n }\n }\n }\n\n return warnings;\n}\n\nfunction isPosixHomePath(value: string): boolean {\n return /^\\/home\\/[^/\\s]+(?:\\/|$)/.test(value);\n}\n\nfunction extractPosixHomePath(value: string): string | undefined {\n const match = value.match(/\\/home\\/[^/\\s\"'`]+(?:\\/[^\\s\"'`]*)?/);\n return match?.[0];\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 // Check additional path-like fields in req.input (avoid content/body fields that may contain false positives)\n const pathFields = [\n \"path\",\n \"directory\",\n \"folder\",\n \"cwd\",\n \"dest\",\n \"destination\",\n \"source\",\n \"target\",\n ];\n for (const field of pathFields) {\n const val = req.input[field];\n if (typeof val === \"string\") candidates.push(val);\n }\n // Also check command field for embedded POSIX home paths.\n const command = req.input.command;\n if (typeof command === \"string\") {\n const embeddedPath = extractPosixHomePath(command);\n if (embeddedPath) candidates.push(embeddedPath);\n }\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 const warnings: string[] = [];\n if (allowedTools.length > 0 && session.strictAllowedTools !== true) {\n warnings.push(\n \"allowedTools currently acts as pre-approval only. Set strictAllowedTools=true to enforce a strict allowlist.\"\n );\n }\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 ...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 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 compactMode = responseMode === \"delta_compact\";\n const po = input.pollOptions ?? {};\n const includeTools = po.includeTools;\n const includeEvents = po.includeEvents ?? !compactMode;\n const includeActions = po.includeActions ?? true;\n const includeResult = po.includeResult ?? !compactMode;\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\" || responseMode === \"delta_compact\",\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\" || responseMode === \"delta_compact\",\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 (\n input.decision !== \"allow\" &&\n input.decision !== \"deny\" &&\n input.decision !== \"allow_for_session\"\n ) {\n return {\n sessionId: input.sessionId,\n error: `Error [${ErrorCode.INVALID_ARGUMENT}]: decision must be 'allow', 'deny', or 'allow_for_session'.`,\n isError: true,\n };\n }\n\n const pendingRequest =\n input.decision === \"allow_for_session\"\n ? sessionManager.getPendingPermission(input.sessionId, input.requestId)\n : undefined;\n const updatedPermissions =\n input.decision === \"allow_for_session\"\n ? appendAllowForSessionUpdate(\n input.permissionOptions?.updatedPermissions,\n pendingRequest?.toolName\n )\n : input.permissionOptions?.updatedPermissions;\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,\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 if (input.decision === \"allow_for_session\" && pendingRequest?.toolName) {\n sessionManager.allowToolForSession(input.sessionId, pendingRequest.toolName);\n }\n\n return buildResult(sessionManager, toolCache, input);\n}\n","/**\n * claude_code_session tool - Manage sessions (list, get, cancel, interrupt)\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\nconst ALWAYS_REDACTED_FIELDS = [\n \"env\",\n \"mcpServers\",\n \"sandbox\",\n \"debugFile\",\n \"pathToClaudeCodeExecutable\",\n] as const;\n\nconst CONDITIONAL_REDACTED_FIELDS = [\n \"cwd\",\n \"systemPrompt\",\n \"agents\",\n \"additionalDirectories\",\n] as const;\n\nfunction buildRedactions(includeSensitive?: boolean): PublicSessionInfo[\"redactions\"] {\n const redactions: PublicSessionInfo[\"redactions\"] = [];\n for (const field of ALWAYS_REDACTED_FIELDS) {\n redactions?.push({ field, reason: \"secret_or_internal\" });\n }\n if (!includeSensitive) {\n for (const field of CONDITIONAL_REDACTED_FIELDS) {\n redactions?.push({ field, reason: \"sensitive_by_default\" });\n }\n }\n return redactions;\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): PublicSessionInfo | SensitiveSessionInfo => {\n const base = input.includeSensitive\n ? sessionManager.toSensitiveJSON(s)\n : sessionManager.toPublicJSON(s);\n const stored = sessionManager.getResult(s.sessionId);\n const lastError = stored?.type === \"error\" ? stored.result.result : undefined;\n const lastErrorAt = stored?.type === \"error\" ? stored.createdAt : undefined;\n return {\n ...base,\n pendingPermissionCount: sessionManager.getPendingPermissionCount(s.sessionId),\n eventCount: sessionManager.getEventCount(s.sessionId),\n currentCursor: sessionManager.getCurrentCursor(s.sessionId),\n lastEventId: sessionManager.getLastEventId(s.sessionId),\n ttlMs: sessionManager.getRemainingTtlMs(s.sessionId),\n lastError,\n lastErrorAt,\n redactions: buildRedactions(input.includeSensitive),\n };\n };\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 case \"interrupt\": {\n if (!input.sessionId) {\n return {\n sessions: [],\n message: `Error [${ErrorCode.INVALID_ARGUMENT}]: sessionId is required for 'interrupt' action.`,\n isError: true,\n };\n }\n const interrupted = sessionManager.interrupt(input.sessionId, {\n reason: \"Interrupted by caller\",\n source: \"claude_code_session\",\n });\n if (!interrupted) {\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}' interrupted.`,\n };\n }\n\n default:\n return {\n sessions: [],\n message: `Error [${ErrorCode.INVALID_ARGUMENT}]: Unknown action '${input.action}'. Use 'list', 'get', 'cancel', or 'interrupt'.`,\n isError: true,\n };\n }\n}\n","import { ResourceTemplate, type McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ReadResourceResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport { createHash } from \"node:crypto\";\nimport type { SessionManager } from \"../session/manager.js\";\nimport { ErrorCode, type PublicSessionInfo } from \"../types.js\";\nimport {\n defaultCatalogTools,\n discoverToolsFromInit,\n type ToolDiscoveryCache,\n} 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 quickstart: `${RESOURCE_SCHEME}:///quickstart`,\n errors: `${RESOURCE_SCHEME}:///errors`,\n compatReport: `${RESOURCE_SCHEME}:///compat-report`,\n} as const;\n\nconst RESOURCE_TEMPLATES = {\n sessionById: `${RESOURCE_SCHEME}:///session/{sessionId}`,\n runtimeTools: `${RESOURCE_SCHEME}:///tools/runtime{?sessionId}`,\n compatDiff: `${RESOURCE_SCHEME}:///compat/diff{?client}`,\n} as const;\n\ntype GotchaSeverity = \"low\" | \"medium\" | \"high\";\ntype GotchaEntry = {\n id: string;\n title: string;\n severity: GotchaSeverity;\n appliesTo: string[];\n symptom: string;\n detection: string;\n remedy: string;\n example?: string;\n};\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\nfunction asJsonResource(uri: URL, value: unknown): ReadResourceResult {\n return asTextResource(uri, JSON.stringify(value, null, 2), \"application/json\");\n}\n\nfunction serializeLimit(limit: number): number | \"unlimited\" {\n return Number.isFinite(limit) ? limit : \"unlimited\";\n}\n\nfunction computeEtag(value: unknown): string {\n return createHash(\"sha256\").update(JSON.stringify(value)).digest(\"hex\").slice(0, 16);\n}\n\nfunction extractSingleVariable(value: string | string[] | null | undefined): string | undefined {\n if (typeof value === \"string\" && value.trim() !== \"\") return value;\n if (Array.isArray(value) && typeof value[0] === \"string\" && value[0].trim() !== \"\")\n return value[0];\n return undefined;\n}\n\nfunction buildSessionRedactions(includeSensitive: boolean): PublicSessionInfo[\"redactions\"] {\n const redactions: PublicSessionInfo[\"redactions\"] = [\n { field: \"env\", reason: \"secret_or_internal\" },\n { field: \"mcpServers\", reason: \"secret_or_internal\" },\n { field: \"sandbox\", reason: \"secret_or_internal\" },\n { field: \"debugFile\", reason: \"secret_or_internal\" },\n { field: \"pathToClaudeCodeExecutable\", reason: \"secret_or_internal\" },\n ];\n if (!includeSensitive) {\n redactions.push(\n { field: \"cwd\", reason: \"sensitive_by_default\" },\n { field: \"systemPrompt\", reason: \"sensitive_by_default\" },\n { field: \"agents\", reason: \"sensitive_by_default\" },\n { field: \"additionalDirectories\", reason: \"sensitive_by_default\" }\n );\n }\n return redactions;\n}\n\nfunction buildGotchasEntries(): GotchaEntry[] {\n return [\n {\n id: \"permission-timeout\",\n title: \"Permission requests auto-deny on timeout\",\n severity: \"high\",\n appliesTo: [\"claude_code_check.actions\", \"permission workflow\"],\n symptom:\n \"Session waits for approval, then tool call is denied without explicit caller decision.\",\n detection:\n \"Observe actions[].expiresAt/remainingMs and permission_result with source=timeout.\",\n remedy:\n \"Poll more frequently and respond before timeout; increase permissionRequestTimeoutMs if needed.\",\n example: \"Default timeout is 60000ms and server-clamped to 300000ms.\",\n },\n {\n id: \"read-size-cap\",\n title: \"Read may cap response size\",\n severity: \"medium\",\n appliesTo: [\"Read tool\"],\n symptom: \"Large file reads are truncated or fail.\",\n detection: \"Read responses are incomplete for large files.\",\n remedy: \"Use offset/limit paging or chunk with Grep.\",\n },\n {\n id: \"edit-replace-all\",\n title: \"Edit replace_all uses substring matching\",\n severity: \"medium\",\n appliesTo: [\"Edit tool\"],\n symptom: \"replace_all=true fails unexpectedly.\",\n detection: \"Tool returns error when no exact substring match is found.\",\n remedy: \"Validate exact match text first; prefer smaller targeted replacements.\",\n },\n {\n id: \"windows-path-normalization\",\n title: \"Windows path normalization applies to common MSYS-style paths\",\n severity: \"medium\",\n appliesTo: [\"Windows\", \"cwd\", \"additionalDirectories\", \"file_path\"],\n symptom: \"Permission/path behavior differs from raw input path text.\",\n detection: \"Compare submitted path with effective path in logs/permission prompts.\",\n remedy:\n \"Use absolute native Windows paths when possible; avoid relying on implicit conversion behavior.\",\n example: \"/d/... /mnt/c/... /cygdrive/c/... //server/share/... are normalized on Windows.\",\n },\n {\n id: \"team-delete-async-cleanup\",\n title: \"TeamDelete cleanup can be asynchronous\",\n severity: \"low\",\n appliesTo: [\"TeamDelete\"],\n symptom: \"Immediate follow-up calls still see active members.\",\n detection: \"TeamDelete reports shutdown_approved or active member transitions.\",\n remedy: \"Retry after short delay; wait for shutdown state to settle.\",\n },\n {\n id: \"skills-late-availability\",\n title: \"Skills may become available later in a session\",\n severity: \"low\",\n appliesTo: [\"Skills\"],\n symptom: \"Early calls show unknown skill/tool errors.\",\n detection: \"Later calls in same session succeed without config changes.\",\n remedy: \"Retry after initialization events are complete.\",\n },\n {\n id: \"tool-count-sources-differ\",\n title: \"toolCatalogCount and availableTools have different sources\",\n severity: \"medium\",\n appliesTo: [\"internal-tools\", \"claude_code_check.availableTools\", \"compat-report\"],\n symptom: \"Tool counts appear inconsistent (for example 15 vs 28).\",\n detection: \"Compare compat-report.toolCounts and session-level availableTools.\",\n remedy:\n \"Treat catalog count as server-known baseline and availableTools as session runtime view from system/init.tools.\",\n },\n {\n id: \"available-tools-not-exhaustive\",\n title: \"availableTools may omit internal features\",\n severity: \"low\",\n appliesTo: [\"claude_code_check.availableTools\"],\n symptom: \"A known feature is callable but not listed in availableTools.\",\n detection: \"Feature works while missing from availableTools list.\",\n remedy: \"Use availableTools as runtime hint, not exhaustive capability proof.\",\n example: \"Some internal features (e.g. ToolSearch) may not appear.\",\n },\n ];\n}\n\nfunction asVersionedPayload(params: {\n schemaVersion: string;\n stability: \"stable\" | \"experimental\";\n payload: Record<string, unknown>;\n}): Record<string, unknown> {\n const updatedAt = new Date().toISOString();\n return {\n ...params.payload,\n schemaVersion: params.schemaVersion,\n updatedAt,\n etag: computeEtag(params.payload),\n stability: params.stability,\n };\n}\n\nexport function registerResources(\n server: McpServer,\n deps: { toolCache: ToolDiscoveryCache; version: string; sessionManager: SessionManager }\n): void {\n const startedAt = new Date().toISOString();\n const resourceSchemaVersion = \"1.3\";\n const mcpProtocolVersion = \"2025-03-26\";\n const gotchasEntries = buildGotchasEntries();\n const catalogToolNames = new Set(defaultCatalogTools().map((tool) => tool.name));\n const staticResourceUris = Object.values(RESOURCE_URIS);\n const templateUris = Object.values(RESOURCE_TEMPLATES);\n\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 asJsonResource(\n serverInfoUri,\n (() => {\n const base: Record<string, unknown> = {\n name: \"claude-code-mcp\",\n version: deps.version,\n node: process.version,\n platform: process.platform,\n arch: process.arch,\n mcpProtocolVersion,\n startedAt,\n uptimeSec: Math.floor(process.uptime()),\n resources: staticResourceUris,\n resourceTemplates: templateUris,\n toolCatalogCount: deps.toolCache.getTools().length,\n capabilities: {\n resources: true,\n toolsListChanged: true,\n resourcesListChanged: true,\n prompts: false,\n completions: false,\n },\n limits: {\n maxSessions: serializeLimit(deps.sessionManager.getMaxSessions()),\n maxPendingPermissionsPerSession: serializeLimit(\n deps.sessionManager.getMaxPendingPermissionsPerSession()\n ),\n eventBuffer: deps.sessionManager.getEventBufferConfig(),\n pollDefaults: {\n runningMs: 3000,\n waitingPermissionMs: 1000,\n },\n },\n };\n if (typeof process.env.CLAUDE_CODE_MCP_BUILD_COMMIT === \"string\") {\n const commit = process.env.CLAUDE_CODE_MCP_BUILD_COMMIT.trim();\n if (commit !== \"\") base.buildCommit = commit;\n }\n return asVersionedPayload({\n schemaVersion: resourceSchemaVersion,\n stability: \"stable\",\n payload: base,\n });\n })()\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 asJsonResource(\n toolsUri,\n (() => {\n const base: Record<string, unknown> = {\n tools: deps.toolCache.getTools(),\n toolCatalogCount: deps.toolCache.getTools().length,\n };\n return asVersionedPayload({\n schemaVersion: resourceSchemaVersion,\n stability: \"stable\",\n payload: base,\n });\n })()\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 ...gotchasEntries.map((entry) => `- ${entry.title}. ${entry.remedy}`),\n \"\",\n ].join(\"\\n\"),\n \"text/markdown\"\n )\n );\n\n const compatReportUri = new URL(RESOURCE_URIS.compatReport);\n\n const quickstartUri = new URL(RESOURCE_URIS.quickstart);\n server.registerResource(\n \"quickstart\",\n quickstartUri.toString(),\n {\n title: \"Quickstart\",\n description: \"Minimal async polling flow for claude_code / claude_code_check.\",\n mimeType: \"text/markdown\",\n },\n () =>\n asTextResource(\n quickstartUri,\n [\n \"# claude-code-mcp quickstart\",\n \"\",\n \"1. Call `claude_code` with `{ prompt }` and keep `sessionId`.\",\n \"2. Poll with `claude_code_check(action='poll')` using `nextCursor`.\",\n \"3. If actions are returned, respond with `claude_code_check(action='respond_permission')`.\",\n \"4. Continue polling until status becomes `idle` / `error` / `cancelled`.\",\n \"\",\n \"Notes:\",\n \"- `respond_user_input` is not supported on this backend.\",\n \"- `allowedTools` is pre-approval by default; set `strictAllowedTools=true` for strict allowlist behavior.\",\n \"- Prefer `responseMode='delta_compact'` for high-frequency polling.\",\n ].join(\"\\n\"),\n \"text/markdown\"\n )\n );\n\n const errorsUri = new URL(RESOURCE_URIS.errors);\n server.registerResource(\n \"errors\",\n errorsUri.toString(),\n {\n title: \"Errors\",\n description: \"Structured error codes and remediation hints.\",\n mimeType: \"application/json\",\n },\n () => {\n const codes = Object.values(ErrorCode);\n const hints = {\n [ErrorCode.INVALID_ARGUMENT]: \"Validate required fields and enum values.\",\n [ErrorCode.SESSION_NOT_FOUND]: \"Session may be expired or server-restarted.\",\n [ErrorCode.SESSION_BUSY]: \"Wait for running/waiting_permission session to settle.\",\n [ErrorCode.PERMISSION_REQUEST_NOT_FOUND]:\n \"The permission request was already finished/expired.\",\n [ErrorCode.PERMISSION_DENIED]: \"Check token/secrets/policy restrictions.\",\n [ErrorCode.RESOURCE_EXHAUSTED]: \"Reduce session count or increase server limits.\",\n [ErrorCode.TIMEOUT]: \"Increase timeout or poll/respond more frequently.\",\n [ErrorCode.CANCELLED]: \"Request/session was cancelled by caller or shutdown.\",\n [ErrorCode.INTERNAL]: \"Inspect server logs and runtime environment.\",\n };\n return asJsonResource(\n errorsUri,\n asVersionedPayload({\n schemaVersion: resourceSchemaVersion,\n stability: \"stable\",\n payload: {\n codes,\n hints,\n },\n })\n );\n }\n );\n\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 const diskResumeEnabled = process.env.CLAUDE_CODE_MCP_ALLOW_DISK_RESUME === \"1\";\n const resumeSecretConfigured =\n typeof process.env.CLAUDE_CODE_MCP_RESUME_SECRET === \"string\" &&\n process.env.CLAUDE_CODE_MCP_RESUME_SECRET.trim() !== \"\";\n const runtimeToolStats = deps.sessionManager.getRuntimeToolStats();\n const toolCatalogCount = deps.toolCache.getTools().length;\n const detectedMismatches: string[] = [];\n if (\n runtimeToolStats.sessionsWithInitTools > 0 &&\n runtimeToolStats.runtimeDiscoveredUniqueCount < toolCatalogCount\n ) {\n detectedMismatches.push(\n \"Runtime discovered tools are fewer than catalog tools; some features may be hidden or not surfaced in system/init.tools.\"\n );\n }\n const updatedAt = new Date().toISOString();\n const base = {\n transport: \"stdio\",\n samePlatformRequired: true,\n packageVersion: deps.version,\n runtime: {\n node: process.version,\n platform: process.platform,\n arch: process.arch,\n },\n limits: {\n maxSessions: serializeLimit(deps.sessionManager.getMaxSessions()),\n maxPendingPermissionsPerSession: serializeLimit(\n deps.sessionManager.getMaxPendingPermissionsPerSession()\n ),\n eventBuffer: deps.sessionManager.getEventBufferConfig(),\n },\n diskResume: {\n enabled: diskResumeEnabled,\n resumeSecretConfigured,\n },\n features: {\n resources: true,\n resourceTemplates: true,\n toolsListChanged: true,\n resourcesListChanged: true,\n sessionInterrupt: true,\n allowForSessionDecision: true,\n respondUserInput: false,\n prompts: false,\n completions: false,\n },\n recommendedSettings: {\n responseMode: \"delta_compact\",\n poll: {\n runningMs: 3000,\n waitingPermissionMs: 1000,\n cursorStrategy: \"Persist nextCursor and de-duplicate by event.id.\",\n },\n timeouts: {\n sessionInitTimeoutMs: 10000,\n permissionRequestTimeoutMs: 60000,\n permissionRequestTimeoutMaxMs: 300000,\n },\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 \"Set strictAllowedTools=true when you need allowedTools to behave as a strict allowlist.\",\n \"This server assumes MCP client and server run on the same machine/platform.\",\n \"For high-frequency status checks, prefer responseMode='delta_compact'.\",\n \"respond_user_input is not supported on this backend; use poll/respond_permission flow.\",\n ],\n toolCounts: {\n catalogCount: toolCatalogCount,\n sessionsWithInitTools: runtimeToolStats.sessionsWithInitTools,\n runtimeDiscoveredUniqueCount: runtimeToolStats.runtimeDiscoveredUniqueCount,\n explain:\n \"catalogCount is server catalog size; runtimeDiscoveredUniqueCount is union of system/init.tools across active sessions.\",\n },\n toolCatalogCount,\n detectedMismatches,\n runtimeWarnings,\n resourceTemplates: templateUris,\n };\n const healthScore = Math.max(\n 0,\n 100 - runtimeWarnings.length * 10 - detectedMismatches.length * 15\n );\n\n return asJsonResource(\n compatReportUri,\n asVersionedPayload({\n schemaVersion: resourceSchemaVersion,\n stability: \"stable\",\n payload: {\n ...base,\n healthScore,\n updatedAt,\n },\n })\n );\n }\n );\n\n server.registerResource(\n \"session_snapshot_template\",\n new ResourceTemplate(RESOURCE_TEMPLATES.sessionById, { list: undefined }),\n {\n title: \"Session Snapshot Template\",\n description: \"Read lightweight session diagnostics by sessionId.\",\n mimeType: \"application/json\",\n },\n (uri, variables) => {\n const sessionId =\n extractSingleVariable(variables.sessionId) ??\n extractSingleVariable(uri.searchParams.get(\"sessionId\"));\n const payload =\n typeof sessionId !== \"string\" || sessionId.trim() === \"\"\n ? {\n found: false,\n message: \"sessionId is required in URI template variable.\",\n }\n : (() => {\n const session = deps.sessionManager.get(sessionId);\n if (!session) {\n return {\n sessionId,\n found: false,\n message: `Session '${sessionId}' not found.`,\n };\n }\n const base = deps.sessionManager.toPublicJSON(session);\n const stored = deps.sessionManager.getResult(sessionId);\n return {\n sessionId,\n found: true,\n session: {\n ...base,\n pendingPermissionCount: deps.sessionManager.getPendingPermissionCount(sessionId),\n eventCount: deps.sessionManager.getEventCount(sessionId),\n currentCursor: deps.sessionManager.getCurrentCursor(sessionId),\n lastEventId: deps.sessionManager.getLastEventId(sessionId),\n ttlMs: deps.sessionManager.getRemainingTtlMs(sessionId),\n lastError: stored?.type === \"error\" ? stored.result.result : undefined,\n lastErrorAt: stored?.type === \"error\" ? stored.createdAt : undefined,\n redactions: buildSessionRedactions(false),\n },\n };\n })();\n\n return asJsonResource(\n uri,\n asVersionedPayload({\n schemaVersion: resourceSchemaVersion,\n stability: \"stable\",\n payload: payload as Record<string, unknown>,\n })\n );\n }\n );\n\n server.registerResource(\n \"runtime_tools_template\",\n new ResourceTemplate(RESOURCE_TEMPLATES.runtimeTools, { list: undefined }),\n {\n title: \"Runtime Tools Template\",\n description: \"Read runtime tool view globally or for a specific sessionId.\",\n mimeType: \"application/json\",\n },\n (uri, variables) => {\n const sessionId =\n extractSingleVariable(variables.sessionId) ??\n extractSingleVariable(uri.searchParams.get(\"sessionId\"));\n const internalToolCount = catalogToolNames.size;\n const payload = (() => {\n if (typeof sessionId === \"string\" && sessionId.trim() !== \"\") {\n const session = deps.sessionManager.get(sessionId);\n if (!session) {\n return {\n sessionId,\n source: \"session_not_found\",\n availableTools: [],\n toolCounts: {\n internalToolCount,\n runtimeAvailableCount: 0,\n sessionAugmentedToolCount: 0,\n },\n };\n }\n const initTools = deps.sessionManager.getInitTools(sessionId) ?? [];\n const discovered = discoverToolsFromInit(initTools);\n const sessionAugmentedToolCount = discovered.filter(\n (tool) => !catalogToolNames.has(tool.name)\n ).length;\n return {\n sessionId,\n source: initTools.length > 0 ? \"session_runtime\" : \"session_without_init\",\n availableTools: discovered,\n toolCounts: {\n internalToolCount,\n runtimeAvailableCount: discovered.length,\n sessionAugmentedToolCount,\n },\n };\n }\n const catalog = deps.toolCache.getTools();\n const sessionAugmentedToolCount = catalog.filter(\n (tool) => !catalogToolNames.has(tool.name)\n ).length;\n return {\n source: \"catalog\",\n availableTools: catalog,\n toolCounts: {\n internalToolCount,\n runtimeAvailableCount: catalog.length,\n sessionAugmentedToolCount,\n },\n };\n })();\n\n return asJsonResource(\n uri,\n asVersionedPayload({\n schemaVersion: resourceSchemaVersion,\n stability: \"stable\",\n payload: payload as Record<string, unknown>,\n })\n );\n }\n );\n\n server.registerResource(\n \"compat_diff_template\",\n new ResourceTemplate(RESOURCE_TEMPLATES.compatDiff, { list: undefined }),\n {\n title: \"Compatibility Diff Template\",\n description: \"Returns client-specific compatibility guidance and recommended settings.\",\n mimeType: \"application/json\",\n },\n (uri, variables) => {\n const clientRaw =\n extractSingleVariable(variables.client) ??\n extractSingleVariable(uri.searchParams.get(\"client\"));\n const clientFingerprint = (clientRaw ?? \"unknown\").trim();\n const key = clientFingerprint.toLowerCase();\n const profile = (() => {\n if (key.includes(\"codex\")) {\n return {\n clientFamily: \"codex\",\n detectedMismatches: [] as string[],\n recommendations: [\n \"Prefer responseMode='delta_compact' for fast status loops.\",\n \"Enable pollOptions.includeTools=true when exact runtime tool names are required.\",\n ],\n };\n }\n if (key.includes(\"claude\")) {\n return {\n clientFamily: \"claude\",\n detectedMismatches: [] as string[],\n recommendations: [\n \"Use resources and resource templates for low-latency diagnostics.\",\n \"Use allowedTools/disallowedTools with exact runtime names.\",\n \"Enable strictAllowedTools when running in locked-down governance mode.\",\n ],\n };\n }\n if (key.includes(\"cursor\")) {\n return {\n clientFamily: \"cursor\",\n detectedMismatches: [\n \"Verify that resources/list and resourceTemplates/list are refreshed after list_changed notifications.\",\n ],\n recommendations: [\n \"Prefer claude_code_check polling as source of truth for runtime state.\",\n \"Fallback to tool calls if resource template support is partial.\",\n ],\n };\n }\n return {\n clientFamily: \"generic\",\n detectedMismatches: [] as string[],\n recommendations: [\n \"Persist nextCursor and de-duplicate by event.id.\",\n \"Use responseMode='delta_compact' for high-frequency polling, full mode only for diagnostics.\",\n ],\n };\n })();\n\n return asJsonResource(\n uri,\n asVersionedPayload({\n schemaVersion: resourceSchemaVersion,\n stability: \"experimental\",\n payload: {\n clientFingerprint,\n ...profile,\n recommendedSettings: {\n responseMode: \"delta_compact\",\n poll: {\n runningMs: 3000,\n waitingPermissionMs: 1000,\n cursorStrategy: \"Persist nextCursor and de-duplicate by event.id.\",\n },\n },\n },\n })\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","existsSync","ErrorCode","path","options","event","sessionId","existsSync","existsSync","statSync","os","path","existsSync","statSync","os","path","abortController","options","sessionAugmentedToolCount"]}
|