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