@leo000001/claude-code-mcp 1.2.0 → 1.3.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/DESIGN.md CHANGED
@@ -47,7 +47,7 @@
47
47
  | `enableFileCheckpointing` | boolean | 否 | 启用文件检查点(跟踪文件变更) |
48
48
  | `includePartialMessages` | boolean | 否 | 包含部分/流式消息事件 |
49
49
  | `strictMcpConfig` | boolean | 否 | 严格验证 MCP 服务器配置 |
50
- | `settingSources` | string[] | 否 | 控制加载哪些文件系统设置 ("user"/"project"/"local") |
50
+ | `settingSources` | string[] | 否 | 控制加载哪些文件系统设置 ("user"/"project"/"local"),默认加载全部 `["user", "project", "local"]`,传 `[]` 可切换为 SDK 隔离模式 |
51
51
  | `debug` | boolean | 否 | 启用调试模式 |
52
52
  | `debugFile` | string | 否 | 调试日志文件路径(隐式启用调试模式) |
53
53
  | `env` | object | 否 | 传递给 Claude Code 进程的环境变量 |
package/README.md CHANGED
@@ -8,6 +8,7 @@ Inspired by the [Codex MCP](https://developers.openai.com/codex/guides/agents-sd
8
8
 
9
9
  - **4 tools** covering the full agent lifecycle: start, continue, manage, configure
10
10
  - **Session management** with resume and fork support
11
+ - **Local settings loaded by default** — automatically reads `~/.claude/settings.json`, `.claude/settings.json`, `.claude/settings.local.json`, and `CLAUDE.md` so the agent behaves like your local Claude Code CLI
11
12
  - **Fine-grained permissions** — tool whitelist/blacklist, permission modes
12
13
  - **Custom subagents** — define specialized agents per session
13
14
  - **Cost tracking** — per-session turn and cost accounting
@@ -21,6 +22,7 @@ This MCP server uses the [`@anthropic-ai/claude-agent-sdk`](https://www.npmjs.co
21
22
 
22
23
  - The SDK's bundled CLI version is determined by the SDK package version (e.g. SDK 0.2.38 = Claude Code 2.1.38)
23
24
  - **Configuration is shared** — the bundled CLI reads API keys and settings from `~/.claude/`, same as the system-installed `claude`
25
+ - **All local settings are loaded by default** — unlike the raw SDK (which defaults to isolation mode), this MCP server loads `user`, `project`, and `local` settings automatically, including `CLAUDE.md` project context. Pass `settingSources: []` to opt out
24
26
  - You must have Claude Code configured (API key set up) before using this MCP server: see [Claude Code documentation](https://docs.anthropic.com/en/docs/claude-code/overview)
25
27
 
26
28
  > **Note:** The bundled CLI version may differ from your system-installed `claude`. To check: `claude --version` (system) vs `npm ls @anthropic-ai/claude-agent-sdk` (SDK).
@@ -74,38 +76,38 @@ npm start
74
76
 
75
77
  Start a Claude Code agent that can read/write files, run commands, and more.
76
78
 
77
- | Parameter | Type | Required | Description |
78
- | ----------------------- | ------------------ | -------- | -------------------------------------------------------------------------------------------------------------------------- |
79
- | `prompt` | string | Yes | Task or question for Claude Code |
80
- | `cwd` | string | No | Working directory (defaults to server cwd) |
81
- | `allowedTools` | string[] | No | Auto-approved tools (skips permission prompts). In `"dontAsk"` mode this effectively acts as a whitelist |
82
- | `disallowedTools` | string[] | No | Tool blacklist |
83
- | `tools` | string[] \| object | No | Base set of available tools (array of names, or `{ type: "preset", preset: "claude_code" }`) |
84
- | `persistSession` | boolean | No | Persist session history to disk (`~/.claude/projects/`). Default: `true`. Set `false` to disable. |
85
- | `permissionMode` | string | No | Defaults to `"dontAsk"`. Options: `"default"`, `"acceptEdits"`, `"bypassPermissions"`, `"plan"`, `"delegate"`, `"dontAsk"` |
86
- | `maxTurns` | number | No | Maximum agentic turns |
87
- | `model` | string | No | Model to use (e.g. `"claude-sonnet-4-5-20250929"`) |
88
- | `systemPrompt` | string \| object | No | Custom system prompt (string or `{ type: "preset", preset: "claude_code", append?: "..." }`) |
89
- | `agents` | object | No | Custom subagent definitions |
90
- | `maxBudgetUsd` | number | No | Maximum budget in USD |
91
- | `timeout` | number | No | Timeout in milliseconds for this session |
92
- | `effort` | string | No | Effort level: `"low"`, `"medium"`, `"high"`, `"max"` |
93
- | `betas` | string[] | No | Beta features (e.g. `["context-1m-2025-08-07"]`) |
94
- | `additionalDirectories` | string[] | No | Additional directories the agent can access beyond cwd |
95
- | `outputFormat` | object | No | Structured output: `{ type: "json_schema", schema: {...} }`. Omit for plain text |
96
- | `thinking` | object | No | Thinking mode: `{ type: "adaptive" }`, `{ type: "enabled", budgetTokens: N }`, or `{ type: "disabled" }` |
97
- | `pathToClaudeCodeExecutable` | string | No | Path to a custom Claude Code executable |
98
- | `agent` | string | No | Main-thread agent name to apply custom agent system prompt, tool restrictions, and model |
99
- | `mcpServers` | object | No | MCP server configurations (key: server name, value: server config) |
100
- | `sandbox` | object | No | Sandbox settings for command execution isolation |
101
- | `fallbackModel` | string | No | Fallback model if the primary model fails or is unavailable |
102
- | `enableFileCheckpointing` | boolean | No | Enable file checkpointing to track file changes during the session |
103
- | `includePartialMessages` | boolean | No | Include partial/streaming message events in output |
104
- | `strictMcpConfig` | boolean | No | Enforce strict validation of MCP server configurations |
105
- | `settingSources` | string[] | No | Control which filesystem settings are loaded (`"user"`, `"project"`, `"local"`) |
106
- | `debug` | boolean | No | Enable debug mode for verbose logging |
107
- | `debugFile` | string | No | Write debug logs to a specific file path (implicitly enables debug mode) |
108
- | `env` | object | No | Environment variables passed to the Claude Code process |
79
+ | Parameter | Type | Required | Description |
80
+ | ---------------------------- | ------------------ | -------- | -------------------------------------------------------------------------------------------------------------------------- |
81
+ | `prompt` | string | Yes | Task or question for Claude Code |
82
+ | `cwd` | string | No | Working directory (defaults to server cwd) |
83
+ | `allowedTools` | string[] | No | Auto-approved tools (skips permission prompts). In `"dontAsk"` mode this effectively acts as a whitelist |
84
+ | `disallowedTools` | string[] | No | Tool blacklist |
85
+ | `tools` | string[] \| object | No | Base set of available tools (array of names, or `{ type: "preset", preset: "claude_code" }`) |
86
+ | `persistSession` | boolean | No | Persist session history to disk (`~/.claude/projects/`). Default: `true`. Set `false` to disable. |
87
+ | `permissionMode` | string | No | Defaults to `"dontAsk"`. Options: `"default"`, `"acceptEdits"`, `"bypassPermissions"`, `"plan"`, `"delegate"`, `"dontAsk"` |
88
+ | `maxTurns` | number | No | Maximum agentic turns |
89
+ | `model` | string | No | Model to use (e.g. `"claude-sonnet-4-5-20250929"`) |
90
+ | `systemPrompt` | string \| object | No | Custom system prompt (string or `{ type: "preset", preset: "claude_code", append?: "..." }`) |
91
+ | `agents` | object | No | Custom subagent definitions |
92
+ | `maxBudgetUsd` | number | No | Maximum budget in USD |
93
+ | `timeout` | number | No | Timeout in milliseconds for this session |
94
+ | `effort` | string | No | Effort level: `"low"`, `"medium"`, `"high"`, `"max"` |
95
+ | `betas` | string[] | No | Beta features (e.g. `["context-1m-2025-08-07"]`) |
96
+ | `additionalDirectories` | string[] | No | Additional directories the agent can access beyond cwd |
97
+ | `outputFormat` | object | No | Structured output: `{ type: "json_schema", schema: {...} }`. Omit for plain text |
98
+ | `thinking` | object | No | Thinking mode: `{ type: "adaptive" }`, `{ type: "enabled", budgetTokens: N }`, or `{ type: "disabled" }` |
99
+ | `pathToClaudeCodeExecutable` | string | No | Path to a custom Claude Code executable |
100
+ | `agent` | string | No | Main-thread agent name to apply custom agent system prompt, tool restrictions, and model |
101
+ | `mcpServers` | object | No | MCP server configurations (key: server name, value: server config) |
102
+ | `sandbox` | object | No | Sandbox settings for command execution isolation |
103
+ | `fallbackModel` | string | No | Fallback model if the primary model fails or is unavailable |
104
+ | `enableFileCheckpointing` | boolean | No | Enable file checkpointing to track file changes during the session |
105
+ | `includePartialMessages` | boolean | No | Include partial/streaming message events in output |
106
+ | `strictMcpConfig` | boolean | No | Enforce strict validation of MCP server configurations |
107
+ | `settingSources` | string[] | No | Which filesystem settings to load. Defaults to `["user", "project", "local"]` (loads all settings and CLAUDE.md). Pass `[]` for SDK isolation mode |
108
+ | `debug` | boolean | No | Enable debug mode for verbose logging |
109
+ | `debugFile` | string | No | Write debug logs to a specific file path (implicitly enables debug mode) |
110
+ | `env` | object | No | Environment variables passed to the Claude Code process |
109
111
 
110
112
  **Returns:** `{ sessionId, result, isError, durationMs, durationApiMs?, numTurns, totalCostUsd, sessionTotalTurns?, sessionTotalCostUsd?, structuredOutput?, stopReason?, errorSubtype?, usage?, modelUsage?, permissionDenials? }`
111
113
 
@@ -123,37 +125,37 @@ Continue an existing session with full context preserved.
123
125
  <details>
124
126
  <summary>Disk resume parameters (used when <code>CLAUDE_CODE_MCP_ALLOW_DISK_RESUME=1</code> and in-memory session is missing)</summary>
125
127
 
126
- | Parameter | Type | Description |
127
- | --- | --- | --- |
128
- | `cwd` | string | Working directory |
129
- | `allowedTools` | string[] | Auto-approved tools |
130
- | `disallowedTools` | string[] | Tool blacklist |
131
- | `tools` | string[] \| object | Base set of available tools |
132
- | `persistSession` | boolean | Persist session history to disk |
133
- | `permissionMode` | string | Permission mode |
134
- | `maxTurns` | number | Maximum agentic turns |
135
- | `model` | string | Model to use |
136
- | `systemPrompt` | string \| object | Custom system prompt |
137
- | `agents` | object | Custom subagent definitions |
138
- | `maxBudgetUsd` | number | Maximum budget in USD |
139
- | `effort` | string | Effort level |
140
- | `betas` | string[] | Beta features |
141
- | `additionalDirectories` | string[] | Additional directories |
142
- | `outputFormat` | object | Structured output format |
143
- | `thinking` | object | Thinking mode |
144
- | `resumeSessionAt` | string | Resume up to a specific message UUID |
145
- | `pathToClaudeCodeExecutable` | string | Path to Claude Code executable |
146
- | `agent` | string | Main-thread agent name |
147
- | `mcpServers` | object | MCP server configurations |
148
- | `sandbox` | object | Sandbox settings |
149
- | `fallbackModel` | string | Fallback model |
150
- | `enableFileCheckpointing` | boolean | Enable file checkpointing |
151
- | `includePartialMessages` | boolean | Include partial message events |
152
- | `strictMcpConfig` | boolean | Strict MCP config validation |
153
- | `settingSources` | string[] | Filesystem settings sources |
154
- | `debug` | boolean | Debug mode |
155
- | `debugFile` | string | Debug log file path |
156
- | `env` | object | Environment variables |
128
+ | Parameter | Type | Description |
129
+ | ---------------------------- | ------------------ | ------------------------------------ |
130
+ | `cwd` | string | Working directory |
131
+ | `allowedTools` | string[] | Auto-approved tools |
132
+ | `disallowedTools` | string[] | Tool blacklist |
133
+ | `tools` | string[] \| object | Base set of available tools |
134
+ | `persistSession` | boolean | Persist session history to disk |
135
+ | `permissionMode` | string | Permission mode |
136
+ | `maxTurns` | number | Maximum agentic turns |
137
+ | `model` | string | Model to use |
138
+ | `systemPrompt` | string \| object | Custom system prompt |
139
+ | `agents` | object | Custom subagent definitions |
140
+ | `maxBudgetUsd` | number | Maximum budget in USD |
141
+ | `effort` | string | Effort level |
142
+ | `betas` | string[] | Beta features |
143
+ | `additionalDirectories` | string[] | Additional directories |
144
+ | `outputFormat` | object | Structured output format |
145
+ | `thinking` | object | Thinking mode |
146
+ | `resumeSessionAt` | string | Resume up to a specific message UUID |
147
+ | `pathToClaudeCodeExecutable` | string | Path to Claude Code executable |
148
+ | `agent` | string | Main-thread agent name |
149
+ | `mcpServers` | object | MCP server configurations |
150
+ | `sandbox` | object | Sandbox settings |
151
+ | `fallbackModel` | string | Fallback model |
152
+ | `enableFileCheckpointing` | boolean | Enable file checkpointing |
153
+ | `includePartialMessages` | boolean | Include partial message events |
154
+ | `strictMcpConfig` | boolean | Strict MCP config validation |
155
+ | `settingSources` | string[] | Which filesystem settings to load (defaults to all) |
156
+ | `debug` | boolean | Debug mode |
157
+ | `debugFile` | string | Debug log file path |
158
+ | `env` | object | Environment variables |
157
159
 
158
160
  </details>
159
161
 
@@ -217,6 +219,7 @@ result = await mcp.call_tool("claude_code_session", {
217
219
 
218
220
  - **`permissionMode` defaults to `"dontAsk"`** — the agent will deny any operation not pre-approved, avoiding interactive prompts that would hang in MCP context.
219
221
  - **`bypassPermissions` is disabled by default.** Use the `claude_code_configure` tool with action `enable_bypass` to enable it at runtime.
222
+ - **Environment variables are inherited** — the spawned Claude Code process inherits all environment variables (including `ANTHROPIC_API_KEY`) from the parent process by default. The `env` parameter **merges** with `process.env` (user-provided values take precedence), so you can safely add or override individual variables without losing existing ones.
220
223
  - Use `tools` / `disallowedTools` to restrict the base set of tools the agent can use. Use `allowedTools` to auto-approve tools without prompting.
221
224
  - `maxTurns` and `maxBudgetUsd` prevent runaway execution.
222
225
  - Sessions auto-expire after 30 minutes of inactivity.
package/dist/index.js CHANGED
@@ -177,6 +177,7 @@ var EFFORT_LEVELS = ["low", "medium", "high", "max"];
177
177
  var AGENT_MODELS = ["sonnet", "opus", "haiku", "inherit"];
178
178
  var CONFIGURE_ACTIONS = ["enable_bypass", "disable_bypass", "get_config"];
179
179
  var SESSION_ACTIONS = ["list", "get", "cancel"];
180
+ var DEFAULT_SETTING_SOURCES = ["user", "project", "local"];
180
181
 
181
182
  // src/tools/claude-code.ts
182
183
  async function executeClaudeCode(input, sessionManager, serverCwd, allowBypass = false) {
@@ -260,9 +261,10 @@ async function executeClaudeCode(input, sessionManager, serverCwd, allowBypass =
260
261
  options.includePartialMessages = input.includePartialMessages;
261
262
  if (input.strictMcpConfig !== void 0) options.strictMcpConfig = input.strictMcpConfig;
262
263
  if (input.settingSources !== void 0) options.settingSources = input.settingSources;
264
+ else options.settingSources = DEFAULT_SETTING_SOURCES;
263
265
  if (input.debug !== void 0) options.debug = input.debug;
264
266
  if (input.debugFile !== void 0) options.debugFile = input.debugFile;
265
- if (input.env !== void 0) options.env = input.env;
267
+ if (input.env !== void 0) options.env = { ...process.env, ...input.env };
266
268
  if (effectivePermissionMode === "bypassPermissions") {
267
269
  options.allowDangerouslySkipPermissions = true;
268
270
  }
@@ -542,9 +544,10 @@ async function executeClaudeCodeReply(input, sessionManager, allowBypass = false
542
544
  options.includePartialMessages = session.includePartialMessages;
543
545
  if (session.strictMcpConfig !== void 0) options.strictMcpConfig = session.strictMcpConfig;
544
546
  if (session.settingSources !== void 0) options.settingSources = session.settingSources;
547
+ else options.settingSources = DEFAULT_SETTING_SOURCES;
545
548
  if (session.debug !== void 0) options.debug = session.debug;
546
549
  if (session.debugFile !== void 0) options.debugFile = session.debugFile;
547
- if (session.env !== void 0) options.env = session.env;
550
+ if (session.env !== void 0) options.env = { ...process.env, ...session.env };
548
551
  if (session.permissionMode === "bypassPermissions") {
549
552
  options.allowDangerouslySkipPermissions = true;
550
553
  }
@@ -853,9 +856,10 @@ async function executeClaudeCodeReplyDiskResume(input, sessionManager, allowBypa
853
856
  options.includePartialMessages = input.includePartialMessages;
854
857
  if (input.strictMcpConfig !== void 0) options.strictMcpConfig = input.strictMcpConfig;
855
858
  if (input.settingSources !== void 0) options.settingSources = input.settingSources;
859
+ else options.settingSources = DEFAULT_SETTING_SOURCES;
856
860
  if (input.debug !== void 0) options.debug = input.debug;
857
861
  if (input.debugFile !== void 0) options.debugFile = input.debugFile;
858
- if (input.env !== void 0) options.env = input.env;
862
+ if (input.env !== void 0) options.env = { ...process.env, ...input.env };
859
863
  if (effectivePermissionMode === "bypassPermissions") {
860
864
  options.allowDangerouslySkipPermissions = true;
861
865
  }
@@ -1113,7 +1117,7 @@ function executeClaudeCodeConfigure(input, config) {
1113
1117
  }
1114
1118
 
1115
1119
  // src/server.ts
1116
- var SERVER_VERSION = true ? "1.2.0" : "0.0.0-dev";
1120
+ var SERVER_VERSION = true ? "1.3.0" : "0.0.0-dev";
1117
1121
  function createServer(serverCwd, opts) {
1118
1122
  const parsePositiveInt = (value) => {
1119
1123
  if (value === void 0 || value.trim() === "") return void 0;
@@ -1142,7 +1146,8 @@ function createServer(serverCwd, opts) {
1142
1146
  `Start a new Claude Code agent session to perform coding tasks autonomously.
1143
1147
  The agent can read/write files, run commands, search code, and more.
1144
1148
  Returns a sessionId for continuing the conversation later.
1145
- Permission mode defaults to "dontAsk" (non-interactive, safe for MCP).`,
1149
+ Permission mode defaults to "dontAsk" (non-interactive, safe for MCP).
1150
+ By default, loads all local Claude settings (user, project, local) including CLAUDE.md for project context.`,
1146
1151
  {
1147
1152
  prompt: z.string().describe("The task or question for Claude Code"),
1148
1153
  cwd: z.string().optional().describe("Working directory (defaults to server cwd)"),
@@ -1214,10 +1219,12 @@ Permission mode defaults to "dontAsk" (non-interactive, safe for MCP).`,
1214
1219
  enableFileCheckpointing: z.boolean().optional().describe("Enable file checkpointing to track file changes during the session"),
1215
1220
  includePartialMessages: z.boolean().optional().describe("Include partial/streaming message events in output"),
1216
1221
  strictMcpConfig: z.boolean().optional().describe("Enforce strict validation of MCP server configurations"),
1217
- settingSources: z.array(z.enum(["user", "project", "local"])).optional().describe("Control which filesystem settings are loaded"),
1222
+ settingSources: z.array(z.enum(["user", "project", "local"])).optional().describe(
1223
+ '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).'
1224
+ ),
1218
1225
  debug: z.boolean().optional().describe("Enable debug mode for verbose logging"),
1219
1226
  debugFile: z.string().optional().describe("Write debug logs to a specific file path (implicitly enables debug mode)"),
1220
- env: z.record(z.string(), z.string().optional()).optional().describe("Environment variables passed to the Claude Code process")
1227
+ env: z.record(z.string(), z.string().optional()).optional().describe("Environment variables to merge with process.env and pass to the Claude Code process (user-provided values take precedence)")
1221
1228
  },
1222
1229
  async (args) => {
1223
1230
  try {
@@ -1321,10 +1328,12 @@ Permission mode defaults to "dontAsk" (non-interactive, safe for MCP).`,
1321
1328
  enableFileCheckpointing: z.boolean().optional().describe("Enable file checkpointing to track file changes during the session"),
1322
1329
  includePartialMessages: z.boolean().optional().describe("Include partial/streaming message events in output"),
1323
1330
  strictMcpConfig: z.boolean().optional().describe("Enforce strict validation of MCP server configurations"),
1324
- settingSources: z.array(z.enum(["user", "project", "local"])).optional().describe("Control which filesystem settings are loaded"),
1331
+ settingSources: z.array(z.enum(["user", "project", "local"])).optional().describe(
1332
+ '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).'
1333
+ ),
1325
1334
  debug: z.boolean().optional().describe("Enable debug mode for verbose logging"),
1326
1335
  debugFile: z.string().optional().describe("Write debug logs to a specific file path (implicitly enables debug mode)"),
1327
- env: z.record(z.string(), z.string().optional()).optional().describe("Environment variables passed to the Claude Code process")
1336
+ env: z.record(z.string(), z.string().optional()).optional().describe("Environment variables to merge with process.env and pass to the Claude Code process (user-provided values take precedence)")
1328
1337
  },
1329
1338
  async (args) => {
1330
1339
  try {
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/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\";\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 // 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 agent session to perform coding tasks autonomously.\nThe agent can read/write files, run commands, search code, and more.\nReturns a sessionId for continuing the conversation later.\nPermission mode defaults to \"dontAsk\" (non-interactive, safe for MCP).`,\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 \"Tools to auto-approve without prompting. In permissionMode='dontAsk', this effectively acts as a tool whitelist.\"\n ),\n disallowedTools: z.array(z.string()).optional().describe(\"Tool blacklist\"),\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 set of available tools (array of names, or preset)\"),\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(\"Permission mode for the session\"),\n maxTurns: z.number().int().positive().optional().describe(\"Maximum agentic turns\"),\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(\"Custom system prompt (string or preset with optional append)\"),\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(\"Custom subagent definitions\"),\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 \"Main-thread agent name to apply custom agent system prompt, tool restrictions, and model\"\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(\"Sandbox settings for command execution isolation\"),\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(\"Include partial/streaming message events in output\"),\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(\"Control which filesystem settings are loaded\"),\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(\"Environment variables passed to the Claude Code process\"),\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 with full context preserved.\n\tClaude remembers all files read, analysis done, and conversation history.`,\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(\"Fork to a new session (preserves original session state)\"),\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\n .string()\n .optional()\n .describe(\"Working directory (used only for disk resume when session is missing)\"),\n allowedTools: z\n .array(z.string())\n .optional()\n .describe(\"Auto-approved tools (used only for disk resume when session is missing)\"),\n disallowedTools: z\n .array(z.string())\n .optional()\n .describe(\"Tool blacklist (used only for disk resume when session is missing)\"),\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 set of available tools (array of names, or preset)\"),\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 (used only for disk resume when session is missing)\"),\n maxTurns: z.number().int().positive().optional().describe(\"Maximum agentic turns\"),\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(\"Custom system prompt (string or preset with optional append)\"),\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(\"Custom subagent definitions\"),\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(\"Resume only up to and including a specific message UUID (disk resume only)\"),\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 \"Main-thread agent name to apply custom agent system prompt, tool restrictions, and model\"\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(\"Sandbox settings for command execution isolation\"),\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(\"Include partial/streaming message events in output\"),\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(\"Control which filesystem settings are loaded\"),\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(\"Environment variables passed to the Claude Code process\"),\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: list all sessions, get status of a specific session, or cancel a running session.`,\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 \"Include sensitive fields (cwd, systemPrompt, agents, additionalDirectories) in responses. 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 (allow bypassPermissions mode), disable_bypass, get_config.`,\n {\n action: z.enum(CONFIGURE_ACTIONS).describe(\"Configuration action to perform\"),\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 { PublicSessionInfo, SessionInfo, PermissionMode, SessionStatus } 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 ?? \"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 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 /** Serialize session info for external consumption (strip internal fields) */\n toJSON(info: SessionInfo): Omit<SessionInfo, \"abortController\"> {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { abortController: _, ...rest } = info;\n return rest;\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","/**\r\n * claude_code tool - Start a new Claude Code agent session\r\n */\r\nimport { query, AbortError } from \"@anthropic-ai/claude-agent-sdk\";\r\nimport type { Options, SDKResultMessage } from \"@anthropic-ai/claude-agent-sdk\";\r\nimport type { SessionManager } from \"../session/manager.js\";\r\nimport type {\r\n AgentResult,\r\n AgentDefinition,\r\n PermissionMode,\r\n EffortLevel,\r\n McpServerConfig,\r\n SandboxSettings,\r\n SettingSource,\r\n} from \"../types.js\";\r\nimport { ErrorCode } from \"../types.js\";\r\n\r\nexport interface ClaudeCodeInput {\r\n prompt: string;\r\n cwd?: string;\r\n allowedTools?: string[];\r\n disallowedTools?: string[];\r\n permissionMode?: PermissionMode;\r\n maxTurns?: number;\r\n model?: string;\r\n systemPrompt?: string | { type: \"preset\"; preset: \"claude_code\"; append?: string };\r\n agents?: Record<string, AgentDefinition>;\r\n maxBudgetUsd?: number;\r\n effort?: EffortLevel;\r\n betas?: string[];\r\n additionalDirectories?: string[];\r\n outputFormat?: { type: \"json_schema\"; schema: Record<string, unknown> };\r\n thinking?:\r\n | { type: \"adaptive\" }\r\n | { type: \"enabled\"; budgetTokens: number }\r\n | { type: \"disabled\" };\r\n tools?: string[] | { type: \"preset\"; preset: \"claude_code\" };\r\n persistSession?: boolean;\r\n pathToClaudeCodeExecutable?: string;\r\n timeout?: number;\r\n agent?: string;\r\n mcpServers?: Record<string, McpServerConfig>;\r\n sandbox?: SandboxSettings;\r\n fallbackModel?: string;\r\n enableFileCheckpointing?: boolean;\r\n includePartialMessages?: boolean;\r\n strictMcpConfig?: boolean;\r\n settingSources?: SettingSource[];\r\n debug?: boolean;\r\n debugFile?: string;\r\n env?: Record<string, string | undefined>;\r\n}\r\n\r\nexport async function executeClaudeCode(\r\n input: ClaudeCodeInput,\r\n sessionManager: SessionManager,\r\n serverCwd: string,\r\n allowBypass = false\r\n): Promise<AgentResult> {\r\n const cwd = input.cwd !== undefined ? input.cwd : serverCwd;\r\n\r\n if (typeof cwd !== \"string\" || cwd.trim() === \"\") {\r\n return {\r\n sessionId: \"\",\r\n result: `Error [${ErrorCode.INVALID_ARGUMENT}]: cwd must be a non-empty string.`,\r\n isError: true,\r\n durationMs: 0,\r\n numTurns: 0,\r\n totalCostUsd: 0,\r\n };\r\n }\r\n\r\n let sessionId = \"\";\r\n let resultText = \"\";\r\n let isError = false;\r\n let durationMs = 0;\r\n let durationApiMs: number | undefined;\r\n let numTurns = 0;\r\n let totalCostUsd = 0;\r\n let sessionTotalTurns: number | undefined;\r\n let sessionTotalCostUsd: number | undefined;\r\n let structuredOutput: unknown;\r\n let stopReason: string | null | undefined;\r\n let errorSubtype: string | undefined;\r\n let usage: Record<string, unknown> | undefined;\r\n let modelUsage: Record<string, unknown> | undefined;\r\n let permissionDenials: AgentResult[\"permissionDenials\"] | undefined;\r\n let seenResult = false;\r\n let timedOut = false;\r\n\r\n // Security: block bypassPermissions unless explicitly allowed\r\n if (input.permissionMode === \"bypassPermissions\" && !allowBypass) {\r\n return {\r\n sessionId: \"\",\r\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.`,\r\n isError: true,\r\n durationMs: 0,\r\n numTurns: 0,\r\n totalCostUsd: 0,\r\n };\r\n }\r\n\r\n const abortController = new AbortController();\r\n\r\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\r\n try {\r\n if (input.timeout !== undefined) {\r\n timeoutId = setTimeout(() => {\r\n timedOut = true;\r\n abortController.abort();\r\n }, input.timeout);\r\n }\r\n\r\n // Build options for the Agent SDK query()\r\n // Default to \"dontAsk\" permission mode in MCP context (non-interactive)\r\n const effectivePermissionMode = input.permissionMode ?? \"dontAsk\";\r\n\r\n const options: Partial<Options> = {\r\n cwd,\r\n abortController,\r\n permissionMode: effectivePermissionMode,\r\n };\r\n\r\n if (input.allowedTools !== undefined) options.allowedTools = input.allowedTools;\r\n if (input.disallowedTools !== undefined) options.disallowedTools = input.disallowedTools;\r\n if (input.maxTurns !== undefined) options.maxTurns = input.maxTurns;\r\n if (input.model !== undefined) options.model = input.model;\r\n if (input.maxBudgetUsd !== undefined) options.maxBudgetUsd = input.maxBudgetUsd;\r\n if (input.agents !== undefined) options.agents = input.agents as Options[\"agents\"];\r\n if (input.effort !== undefined) options.effort = input.effort;\r\n if (input.betas !== undefined) options.betas = input.betas as Options[\"betas\"];\r\n if (input.additionalDirectories !== undefined)\r\n options.additionalDirectories = input.additionalDirectories;\r\n if (input.outputFormat !== undefined) options.outputFormat = input.outputFormat;\r\n if (input.thinking !== undefined) options.thinking = input.thinking;\r\n if (input.tools !== undefined) options.tools = input.tools;\r\n if (input.persistSession !== undefined) options.persistSession = input.persistSession;\r\n if (input.pathToClaudeCodeExecutable !== undefined)\r\n options.pathToClaudeCodeExecutable = input.pathToClaudeCodeExecutable;\r\n if (input.agent !== undefined) options.agent = input.agent;\r\n if (input.mcpServers !== undefined)\r\n options.mcpServers = input.mcpServers as Options[\"mcpServers\"];\r\n if (input.sandbox !== undefined) options.sandbox = input.sandbox;\r\n if (input.fallbackModel !== undefined) options.fallbackModel = input.fallbackModel;\r\n if (input.enableFileCheckpointing !== undefined)\r\n options.enableFileCheckpointing = input.enableFileCheckpointing;\r\n if (input.includePartialMessages !== undefined)\r\n options.includePartialMessages = input.includePartialMessages;\r\n if (input.strictMcpConfig !== undefined) options.strictMcpConfig = input.strictMcpConfig;\r\n if (input.settingSources !== undefined) options.settingSources = input.settingSources;\r\n if (input.debug !== undefined) options.debug = input.debug;\r\n if (input.debugFile !== undefined) options.debugFile = input.debugFile;\r\n if (input.env !== undefined) options.env = input.env;\r\n\r\n if (effectivePermissionMode === \"bypassPermissions\") {\r\n options.allowDangerouslySkipPermissions = true;\r\n }\r\n\r\n if (input.systemPrompt !== undefined) options.systemPrompt = input.systemPrompt;\r\n\r\n // No placeholder session - we create the session only after receiving the init message\r\n for await (const message of query({\r\n prompt: input.prompt,\r\n options,\r\n })) {\r\n if (message.type === \"system\" && message.subtype === \"init\") {\r\n if (sessionId) continue;\r\n sessionId = message.session_id;\r\n sessionManager.create({\r\n sessionId,\r\n cwd,\r\n model: input.model,\r\n permissionMode: effectivePermissionMode,\r\n allowedTools: input.allowedTools,\r\n disallowedTools: input.disallowedTools,\r\n tools: input.tools,\r\n maxTurns: input.maxTurns,\r\n systemPrompt: input.systemPrompt,\r\n agents: input.agents as Record<string, AgentDefinition> | undefined,\r\n maxBudgetUsd: input.maxBudgetUsd,\r\n effort: input.effort,\r\n betas: input.betas,\r\n additionalDirectories: input.additionalDirectories,\r\n outputFormat: input.outputFormat,\r\n thinking: input.thinking,\r\n persistSession: input.persistSession,\r\n pathToClaudeCodeExecutable: input.pathToClaudeCodeExecutable,\r\n agent: input.agent,\r\n mcpServers: input.mcpServers,\r\n sandbox: input.sandbox,\r\n fallbackModel: input.fallbackModel,\r\n enableFileCheckpointing: input.enableFileCheckpointing,\r\n includePartialMessages: input.includePartialMessages,\r\n strictMcpConfig: input.strictMcpConfig,\r\n settingSources: input.settingSources,\r\n debug: input.debug,\r\n debugFile: input.debugFile,\r\n env: input.env,\r\n abortController,\r\n });\r\n }\r\n\r\n if (message.type === \"result\") {\r\n if (seenResult) continue;\r\n seenResult = true;\r\n\r\n const result: SDKResultMessage = message;\r\n durationMs = result.duration_ms;\r\n durationApiMs = result.duration_api_ms;\r\n numTurns = result.num_turns;\r\n totalCostUsd = result.total_cost_usd;\r\n isError = result.is_error;\r\n stopReason = result.stop_reason;\r\n usage = result.usage;\r\n modelUsage = result.modelUsage;\r\n permissionDenials = result.permission_denials;\r\n\r\n if (result.subtype === \"success\") {\r\n resultText = result.result;\r\n structuredOutput = result.structured_output;\r\n } else {\r\n isError = true;\r\n errorSubtype = result.subtype;\r\n resultText =\r\n result.errors.map(String).join(\"\\n\") || `Error [${result.subtype}]: Unknown error`;\r\n }\r\n\r\n break;\r\n }\r\n }\r\n } catch (err: unknown) {\r\n isError = true;\r\n // Detect abort/cancellation errors\r\n const isAborted =\r\n abortController.signal.aborted ||\r\n err instanceof AbortError ||\r\n (err instanceof Error && err.name === \"AbortError\");\r\n if (isAborted) {\r\n resultText = timedOut\r\n ? `Error [${ErrorCode.TIMEOUT}]: Session timed out after ${input.timeout}ms.`\r\n : `Error [${ErrorCode.CANCELLED}]: Session was cancelled.`;\r\n } else {\r\n resultText = err instanceof Error ? err.message : String(err);\r\n }\r\n if (sessionId) {\r\n const current = sessionManager.get(sessionId);\r\n if (current) {\r\n // Don't overwrite terminal states; treat timeout as error (retryable)\r\n if (timedOut && current.status !== \"cancelled\" && current.status !== \"error\") {\r\n sessionManager.update(sessionId, { status: \"error\" });\r\n } else if (isAborted && current.status === \"running\") {\r\n sessionManager.update(sessionId, { status: \"cancelled\" });\r\n } else if (!isAborted && current.status !== \"cancelled\") {\r\n sessionManager.update(sessionId, { status: \"error\" });\r\n }\r\n }\r\n }\r\n } finally {\r\n if (timeoutId) clearTimeout(timeoutId);\r\n }\r\n\r\n // Some SDK abort paths end the stream without throwing. Ensure aborts become TIMEOUT/CANCELLED,\r\n // not an INTERNAL \"missing_result\" error.\r\n if (!seenResult && !isError && abortController.signal.aborted) {\r\n isError = true;\r\n resultText = timedOut\r\n ? `Error [${ErrorCode.TIMEOUT}]: Session timed out after ${input.timeout}ms.`\r\n : `Error [${ErrorCode.CANCELLED}]: Session was cancelled.`;\r\n }\r\n\r\n if (sessionId && !seenResult && !isError) {\r\n isError = true;\r\n errorSubtype = errorSubtype ?? \"missing_result\";\r\n const noResultMsg = `Error [${ErrorCode.INTERNAL}]: No result message received from agent.`;\r\n resultText = resultText ? `${noResultMsg} Original: ${resultText}` : noResultMsg;\r\n }\r\n\r\n // Update session to idle (or error), clear abortController\r\n // Preserve \"cancelled\" status if session was cancelled during execution\r\n if (sessionId) {\r\n const current = sessionManager.get(sessionId);\r\n if (current && current.status !== \"cancelled\") {\r\n sessionManager.update(sessionId, {\r\n status: isError ? \"error\" : \"idle\",\r\n totalTurns: numTurns,\r\n totalCostUsd,\r\n abortController: undefined,\r\n });\r\n const updated = sessionManager.get(sessionId);\r\n sessionTotalTurns = updated?.totalTurns;\r\n sessionTotalCostUsd = updated?.totalCostUsd;\r\n } else if (current) {\r\n // Session was cancelled — just clear the abortController and update totals\r\n sessionManager.update(sessionId, {\r\n totalTurns: numTurns,\r\n totalCostUsd,\r\n abortController: undefined,\r\n });\r\n const updated = sessionManager.get(sessionId);\r\n sessionTotalTurns = updated?.totalTurns;\r\n sessionTotalCostUsd = updated?.totalCostUsd;\r\n }\r\n } else {\r\n // No session ID means something went wrong regardless of result content\r\n isError = true;\r\n const noInitMsg = timedOut\r\n ? `Error [${ErrorCode.TIMEOUT}]: Session timed out after ${input.timeout}ms (no session ID received).`\r\n : `Error [${ErrorCode.INTERNAL}]: No session ID received from agent.`;\r\n resultText = resultText ? `${noInitMsg} Original: ${resultText}` : noInitMsg;\r\n }\r\n\r\n return {\r\n sessionId,\r\n result: resultText,\r\n isError,\r\n durationMs,\r\n durationApiMs,\r\n numTurns,\r\n totalCostUsd,\r\n sessionTotalTurns,\r\n sessionTotalCostUsd,\r\n structuredOutput,\r\n stopReason,\r\n errorSubtype,\r\n usage,\r\n modelUsage,\r\n permissionDenials,\r\n };\r\n}\r\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 */\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 settings for command execution isolation */\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/** 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 /** Main-thread agent name */\n agent?: string;\n /** MCP server configurations */\n mcpServers?: Record<string, McpServerConfig>;\n /** Sandbox settings for command execution isolation */\n sandbox?: SandboxSettings;\n /** Fallback model if the primary model fails */\n fallbackModel?: string;\n /** Enable file checkpointing to track file changes */\n enableFileCheckpointing?: boolean;\n /** Include partial/streaming message events */\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/** 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","/**\r\n * claude_code_reply tool - Continue an existing Claude Code session\r\n */\r\nimport { query, AbortError } from \"@anthropic-ai/claude-agent-sdk\";\r\nimport type { Options, SDKResultMessage } from \"@anthropic-ai/claude-agent-sdk\";\r\nimport type { SessionManager } from \"../session/manager.js\";\r\nimport type {\r\n AgentDefinition,\r\n AgentResult,\r\n EffortLevel,\r\n McpServerConfig,\r\n OutputFormat,\r\n PermissionMode,\r\n SandboxSettings,\r\n SettingSource,\r\n SystemPrompt,\r\n ThinkingConfig,\r\n ToolsConfig,\r\n} from \"../types.js\";\r\nimport { ErrorCode } from \"../types.js\";\r\n\r\nexport interface ClaudeCodeReplyInput {\r\n sessionId: string;\r\n prompt: string;\r\n forkSession?: boolean;\r\n timeout?: number;\r\n\r\n /**\r\n * Optional overrides used for \"disk resume\" when the in-memory session is missing.\r\n * Enabled only when `CLAUDE_CODE_MCP_ALLOW_DISK_RESUME=1`.\r\n */\r\n cwd?: string;\r\n allowedTools?: string[];\r\n disallowedTools?: string[];\r\n tools?: ToolsConfig;\r\n permissionMode?: PermissionMode;\r\n maxTurns?: number;\r\n model?: string;\r\n systemPrompt?: SystemPrompt;\r\n agents?: Record<string, AgentDefinition>;\r\n maxBudgetUsd?: number;\r\n effort?: EffortLevel;\r\n betas?: string[];\r\n additionalDirectories?: string[];\r\n outputFormat?: OutputFormat;\r\n thinking?: ThinkingConfig;\r\n persistSession?: boolean;\r\n resumeSessionAt?: string;\r\n pathToClaudeCodeExecutable?: string;\r\n agent?: string;\r\n mcpServers?: Record<string, McpServerConfig>;\r\n sandbox?: SandboxSettings;\r\n fallbackModel?: string;\r\n enableFileCheckpointing?: boolean;\r\n includePartialMessages?: boolean;\r\n strictMcpConfig?: boolean;\r\n settingSources?: SettingSource[];\r\n debug?: boolean;\r\n debugFile?: string;\r\n env?: Record<string, string | undefined>;\r\n}\r\n\r\nexport async function executeClaudeCodeReply(\r\n input: ClaudeCodeReplyInput,\r\n sessionManager: SessionManager,\r\n allowBypass = false\r\n): Promise<AgentResult> {\r\n const session = sessionManager.get(input.sessionId);\r\n if (!session) {\r\n const allowDiskResume = process.env.CLAUDE_CODE_MCP_ALLOW_DISK_RESUME === \"1\";\r\n if (!allowDiskResume) {\r\n return {\r\n sessionId: input.sessionId,\r\n result: `Error [${ErrorCode.SESSION_NOT_FOUND}]: Session '${input.sessionId}' not found or expired.`,\r\n isError: true,\r\n durationMs: 0,\r\n numTurns: 0,\r\n totalCostUsd: 0,\r\n };\r\n }\r\n\r\n return executeClaudeCodeReplyDiskResume(input, sessionManager, allowBypass);\r\n }\r\n\r\n if (session.status === \"running\") {\r\n return {\r\n sessionId: input.sessionId,\r\n result: `Error [${ErrorCode.SESSION_BUSY}]: Session is currently running. Wait for it to complete or cancel it.`,\r\n isError: true,\r\n durationMs: 0,\r\n numTurns: 0,\r\n totalCostUsd: 0,\r\n };\r\n }\r\n\r\n if (session.status === \"cancelled\") {\r\n return {\r\n sessionId: input.sessionId,\r\n result: `Error [${ErrorCode.CANCELLED}]: Session '${input.sessionId}' has been cancelled and cannot be resumed.`,\r\n isError: true,\r\n durationMs: 0,\r\n numTurns: 0,\r\n totalCostUsd: 0,\r\n };\r\n }\r\n\r\n // Security: block resume/fork of bypassPermissions sessions when bypass is disabled\r\n if (session.permissionMode === \"bypassPermissions\" && !allowBypass) {\r\n return {\r\n sessionId: input.sessionId,\r\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.`,\r\n isError: true,\r\n durationMs: 0,\r\n numTurns: 0,\r\n totalCostUsd: 0,\r\n };\r\n }\r\n\r\n // Atomically acquire the session (compare-and-set: idle/error → running)\r\n const originalStatus = session.status;\r\n const abortController = new AbortController();\r\n let timedOut = false;\r\n const acquired = sessionManager.tryAcquire(input.sessionId, originalStatus, abortController);\r\n if (!acquired) {\r\n const current = sessionManager.get(input.sessionId);\r\n if (!current) {\r\n return {\r\n sessionId: input.sessionId,\r\n result: `Error [${ErrorCode.SESSION_NOT_FOUND}]: Session '${input.sessionId}' not found or expired.`,\r\n isError: true,\r\n durationMs: 0,\r\n numTurns: 0,\r\n totalCostUsd: 0,\r\n };\r\n }\r\n // Another concurrent call acquired it first, or status changed\r\n return {\r\n sessionId: input.sessionId,\r\n result: `Error [${ErrorCode.SESSION_BUSY}]: Session is not available (status: ${current.status}).`,\r\n isError: true,\r\n durationMs: 0,\r\n numTurns: 0,\r\n totalCostUsd: 0,\r\n };\r\n }\r\n\r\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\r\n if (input.timeout !== undefined) {\r\n timeoutId = setTimeout(() => {\r\n timedOut = true;\r\n abortController.abort();\r\n }, input.timeout);\r\n }\r\n\r\n let resultText = \"\";\r\n let isError = false;\r\n let durationMs = 0;\r\n let durationApiMs: number | undefined;\r\n let numTurns = 0;\r\n let totalCostUsd = 0;\r\n let sessionTotalTurns: number | undefined;\r\n let sessionTotalCostUsd: number | undefined;\r\n let newSessionId = input.sessionId;\r\n let structuredOutput: unknown;\r\n let stopReason: string | null | undefined;\r\n let errorSubtype: string | undefined;\r\n let usage: Record<string, unknown> | undefined;\r\n let modelUsage: Record<string, unknown> | undefined;\r\n let permissionDenials: AgentResult[\"permissionDenials\"] | undefined;\r\n let seenResult = false;\r\n let forkSessionCreated = false;\r\n\r\n try {\r\n const options: Partial<Options> = {\r\n resume: input.sessionId,\r\n abortController,\r\n cwd: session.cwd,\r\n permissionMode: session.permissionMode,\r\n };\r\n\r\n if (session.allowedTools !== undefined) options.allowedTools = session.allowedTools;\r\n if (session.disallowedTools !== undefined) options.disallowedTools = session.disallowedTools;\r\n if (session.maxTurns !== undefined) options.maxTurns = session.maxTurns;\r\n if (session.model !== undefined) options.model = session.model;\r\n if (session.maxBudgetUsd !== undefined) options.maxBudgetUsd = session.maxBudgetUsd;\r\n if (session.agents !== undefined) options.agents = session.agents as Options[\"agents\"];\r\n if (session.effort !== undefined) options.effort = session.effort;\r\n if (session.betas !== undefined) options.betas = session.betas as Options[\"betas\"];\r\n if (session.additionalDirectories !== undefined)\r\n options.additionalDirectories = session.additionalDirectories;\r\n if (session.outputFormat !== undefined) options.outputFormat = session.outputFormat;\r\n if (session.thinking !== undefined) options.thinking = session.thinking;\r\n if (session.tools !== undefined) options.tools = session.tools;\r\n if (session.systemPrompt !== undefined) options.systemPrompt = session.systemPrompt;\r\n if (session.persistSession !== undefined) options.persistSession = session.persistSession;\r\n if (session.pathToClaudeCodeExecutable !== undefined)\r\n options.pathToClaudeCodeExecutable = session.pathToClaudeCodeExecutable;\r\n if (session.agent !== undefined) options.agent = session.agent;\r\n if (session.mcpServers !== undefined)\r\n options.mcpServers = session.mcpServers as Options[\"mcpServers\"];\r\n if (session.sandbox !== undefined) options.sandbox = session.sandbox;\r\n if (session.fallbackModel !== undefined) options.fallbackModel = session.fallbackModel;\r\n if (session.enableFileCheckpointing !== undefined)\r\n options.enableFileCheckpointing = session.enableFileCheckpointing;\r\n if (session.includePartialMessages !== undefined)\r\n options.includePartialMessages = session.includePartialMessages;\r\n if (session.strictMcpConfig !== undefined) options.strictMcpConfig = session.strictMcpConfig;\r\n if (session.settingSources !== undefined) options.settingSources = session.settingSources;\r\n if (session.debug !== undefined) options.debug = session.debug;\r\n if (session.debugFile !== undefined) options.debugFile = session.debugFile;\r\n if (session.env !== undefined) options.env = session.env;\r\n\r\n if (session.permissionMode === \"bypassPermissions\") {\r\n options.allowDangerouslySkipPermissions = true;\r\n }\r\n\r\n if (input.forkSession) {\r\n options.forkSession = true;\r\n }\r\n\r\n for await (const message of query({\r\n prompt: input.prompt,\r\n options,\r\n })) {\r\n // If forked, capture the new session ID\r\n if (input.forkSession && message.type === \"system\" && message.subtype === \"init\") {\r\n newSessionId = message.session_id;\r\n // Note: forked session shares abortController during this query() call.\r\n // This is correct — both run in the same SDK process. After completion,\r\n // each session's abortController is cleared independently.\r\n if (!forkSessionCreated && newSessionId !== input.sessionId) {\r\n sessionManager.create({\r\n sessionId: newSessionId,\r\n cwd: session.cwd,\r\n model: session.model,\r\n permissionMode: session.permissionMode,\r\n allowedTools: session.allowedTools,\r\n disallowedTools: session.disallowedTools,\r\n tools: session.tools,\r\n maxTurns: session.maxTurns,\r\n systemPrompt: session.systemPrompt,\r\n agents: session.agents,\r\n maxBudgetUsd: session.maxBudgetUsd,\r\n effort: session.effort,\r\n betas: session.betas,\r\n additionalDirectories: session.additionalDirectories,\r\n outputFormat: session.outputFormat,\r\n thinking: session.thinking,\r\n persistSession: session.persistSession,\r\n pathToClaudeCodeExecutable: session.pathToClaudeCodeExecutable,\r\n agent: session.agent,\r\n mcpServers: session.mcpServers,\r\n sandbox: session.sandbox,\r\n fallbackModel: session.fallbackModel,\r\n enableFileCheckpointing: session.enableFileCheckpointing,\r\n includePartialMessages: session.includePartialMessages,\r\n strictMcpConfig: session.strictMcpConfig,\r\n settingSources: session.settingSources,\r\n debug: session.debug,\r\n debugFile: session.debugFile,\r\n env: session.env,\r\n abortController,\r\n });\r\n forkSessionCreated = true;\r\n }\r\n }\r\n\r\n if (message.type === \"result\") {\r\n if (seenResult) continue;\r\n seenResult = true;\r\n\r\n const result: SDKResultMessage = message;\r\n durationMs = result.duration_ms;\r\n durationApiMs = result.duration_api_ms;\r\n numTurns = result.num_turns;\r\n totalCostUsd = result.total_cost_usd;\r\n isError = result.is_error;\r\n stopReason = result.stop_reason;\r\n usage = result.usage;\r\n modelUsage = result.modelUsage;\r\n permissionDenials = result.permission_denials;\r\n\r\n if (result.subtype === \"success\") {\r\n resultText = result.result;\r\n structuredOutput = result.structured_output;\r\n } else {\r\n isError = true;\r\n errorSubtype = result.subtype;\r\n resultText =\r\n result.errors.map(String).join(\"\\n\") || `Error [${result.subtype}]: Unknown error`;\r\n }\r\n\r\n break;\r\n }\r\n }\r\n } catch (err: unknown) {\r\n isError = true;\r\n const isAborted =\r\n abortController.signal.aborted ||\r\n err instanceof AbortError ||\r\n (err instanceof Error && err.name === \"AbortError\");\r\n if (isAborted) {\r\n resultText = timedOut\r\n ? `Error [${ErrorCode.TIMEOUT}]: Session timed out after ${input.timeout}ms.`\r\n : `Error [${ErrorCode.CANCELLED}]: Session was cancelled.`;\r\n } else {\r\n resultText = err instanceof Error ? err.message : String(err);\r\n }\r\n } finally {\r\n if (timeoutId) clearTimeout(timeoutId);\r\n }\r\n\r\n // Some SDK abort paths end the stream without throwing. Ensure aborts become TIMEOUT/CANCELLED,\r\n // not an INTERNAL \"missing_result\" error.\r\n if (!seenResult && !isError && abortController.signal.aborted) {\r\n isError = true;\r\n resultText = timedOut\r\n ? `Error [${ErrorCode.TIMEOUT}]: Session timed out after ${input.timeout}ms.`\r\n : `Error [${ErrorCode.CANCELLED}]: Session was cancelled.`;\r\n }\r\n\r\n if (!seenResult && !isError) {\r\n isError = true;\r\n errorSubtype = errorSubtype ?? \"missing_result\";\r\n const noResultMsg = `Error [${ErrorCode.INTERNAL}]: No result message received from agent.`;\r\n resultText = resultText ? `${noResultMsg} Original: ${resultText}` : noResultMsg;\r\n }\r\n\r\n // Update session state, clear abortController\r\n // Preserve \"cancelled\" status if session was cancelled during execution\r\n if (input.forkSession && newSessionId !== input.sessionId) {\r\n const forkedCurrent = sessionManager.get(newSessionId);\r\n if (forkedCurrent && forkedCurrent.status !== \"cancelled\") {\r\n sessionManager.update(newSessionId, {\r\n status: isError ? \"error\" : \"idle\",\r\n totalTurns: numTurns,\r\n totalCostUsd,\r\n abortController: undefined,\r\n });\r\n const updatedFork = sessionManager.get(newSessionId);\r\n sessionTotalTurns = updatedFork?.totalTurns;\r\n sessionTotalCostUsd = updatedFork?.totalCostUsd;\r\n } else if (forkedCurrent) {\r\n sessionManager.update(newSessionId, {\r\n totalTurns: numTurns,\r\n totalCostUsd,\r\n abortController: undefined,\r\n });\r\n const updatedFork = sessionManager.get(newSessionId);\r\n sessionTotalTurns = updatedFork?.totalTurns;\r\n sessionTotalCostUsd = updatedFork?.totalCostUsd;\r\n }\r\n // Restore original session to its pre-fork status (not always \"idle\")\r\n const origCurrent = sessionManager.get(input.sessionId);\r\n if (origCurrent && origCurrent.status !== \"cancelled\") {\r\n sessionManager.update(input.sessionId, {\r\n status: originalStatus,\r\n abortController: undefined,\r\n });\r\n } else if (origCurrent) {\r\n sessionManager.update(input.sessionId, {\r\n abortController: undefined,\r\n });\r\n }\r\n } else {\r\n const current = sessionManager.get(input.sessionId);\r\n if (current && current.status !== \"cancelled\") {\r\n sessionManager.update(input.sessionId, {\r\n status: isError ? \"error\" : \"idle\",\r\n totalTurns: (session.totalTurns ?? 0) + numTurns,\r\n totalCostUsd: (session.totalCostUsd ?? 0) + totalCostUsd,\r\n abortController: undefined,\r\n });\r\n const updated = sessionManager.get(input.sessionId);\r\n sessionTotalTurns = updated?.totalTurns;\r\n sessionTotalCostUsd = updated?.totalCostUsd;\r\n } else if (current) {\r\n sessionManager.update(input.sessionId, {\r\n totalTurns: (session.totalTurns ?? 0) + numTurns,\r\n totalCostUsd: (session.totalCostUsd ?? 0) + totalCostUsd,\r\n abortController: undefined,\r\n });\r\n const updated = sessionManager.get(input.sessionId);\r\n sessionTotalTurns = updated?.totalTurns;\r\n sessionTotalCostUsd = updated?.totalCostUsd;\r\n }\r\n }\r\n\r\n const targetSessionId = input.forkSession ? newSessionId : input.sessionId;\r\n\r\n // If fork was requested but no new session ID was received, flag as internal error\r\n if (input.forkSession && newSessionId === input.sessionId && !isError) {\r\n isError = true;\r\n const noForkMsg = `Error [${ErrorCode.INTERNAL}]: Fork requested but no new session ID received from agent.`;\r\n resultText = resultText ? `${noForkMsg} Original: ${resultText}` : noForkMsg;\r\n }\r\n\r\n return {\r\n sessionId: targetSessionId,\r\n result: resultText,\r\n isError,\r\n durationMs,\r\n durationApiMs,\r\n numTurns,\r\n totalCostUsd,\r\n sessionTotalTurns,\r\n sessionTotalCostUsd,\r\n structuredOutput,\r\n stopReason,\r\n errorSubtype,\r\n usage,\r\n modelUsage,\r\n permissionDenials,\r\n };\r\n}\r\n\r\nasync function executeClaudeCodeReplyDiskResume(\r\n input: ClaudeCodeReplyInput,\r\n sessionManager: SessionManager,\r\n allowBypass: boolean\r\n): Promise<AgentResult> {\r\n if (input.cwd !== undefined && (typeof input.cwd !== \"string\" || input.cwd.trim() === \"\")) {\r\n return {\r\n sessionId: input.sessionId,\r\n result: `Error [${ErrorCode.INVALID_ARGUMENT}]: cwd must be a non-empty string.`,\r\n isError: true,\r\n durationMs: 0,\r\n numTurns: 0,\r\n totalCostUsd: 0,\r\n };\r\n }\r\n\r\n const effectivePermissionMode = input.permissionMode ?? \"dontAsk\";\r\n\r\n if (effectivePermissionMode === \"bypassPermissions\" && !allowBypass) {\r\n return {\r\n sessionId: input.sessionId,\r\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.`,\r\n isError: true,\r\n durationMs: 0,\r\n numTurns: 0,\r\n totalCostUsd: 0,\r\n };\r\n }\r\n\r\n const abortController = new AbortController();\r\n let timedOut = false;\r\n\r\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\r\n if (input.timeout !== undefined) {\r\n timeoutId = setTimeout(() => {\r\n timedOut = true;\r\n abortController.abort();\r\n }, input.timeout);\r\n }\r\n\r\n let resultText = \"\";\r\n let isError = false;\r\n let durationMs = 0;\r\n let durationApiMs: number | undefined;\r\n let numTurns = 0;\r\n let totalCostUsd = 0;\r\n let sessionTotalTurns: number | undefined;\r\n let sessionTotalCostUsd: number | undefined;\r\n let newSessionId = input.sessionId;\r\n let structuredOutput: unknown;\r\n let stopReason: string | null | undefined;\r\n let errorSubtype: string | undefined;\r\n let usage: Record<string, unknown> | undefined;\r\n let modelUsage: Record<string, unknown> | undefined;\r\n let permissionDenials: AgentResult[\"permissionDenials\"] | undefined;\r\n let seenResult = false;\r\n\r\n // Create a placeholder in-memory session for non-fork resumes to support cancellation/status.\r\n if (!input.forkSession) {\r\n const existing = sessionManager.get(input.sessionId);\r\n if (!existing) {\r\n const cwd = input.cwd ?? process.cwd();\r\n if (typeof cwd !== \"string\" || cwd.trim() === \"\") {\r\n return {\r\n sessionId: input.sessionId,\r\n result: `Error [${ErrorCode.INVALID_ARGUMENT}]: cwd must be a non-empty string.`,\r\n isError: true,\r\n durationMs: 0,\r\n numTurns: 0,\r\n totalCostUsd: 0,\r\n };\r\n }\r\n try {\r\n sessionManager.create({\r\n sessionId: input.sessionId,\r\n cwd,\r\n model: input.model,\r\n permissionMode: effectivePermissionMode,\r\n allowedTools: input.allowedTools,\r\n disallowedTools: input.disallowedTools,\r\n tools: input.tools,\r\n maxTurns: input.maxTurns,\r\n systemPrompt: input.systemPrompt,\r\n agents: input.agents,\r\n maxBudgetUsd: input.maxBudgetUsd,\r\n effort: input.effort,\r\n betas: input.betas,\r\n additionalDirectories: input.additionalDirectories,\r\n outputFormat: input.outputFormat,\r\n thinking: input.thinking,\r\n persistSession: input.persistSession,\r\n pathToClaudeCodeExecutable: input.pathToClaudeCodeExecutable,\r\n agent: input.agent,\r\n mcpServers: input.mcpServers,\r\n sandbox: input.sandbox,\r\n fallbackModel: input.fallbackModel,\r\n enableFileCheckpointing: input.enableFileCheckpointing,\r\n includePartialMessages: input.includePartialMessages,\r\n strictMcpConfig: input.strictMcpConfig,\r\n settingSources: input.settingSources,\r\n debug: input.debug,\r\n debugFile: input.debugFile,\r\n env: input.env,\r\n abortController,\r\n });\r\n } catch {\r\n // Another concurrent call may have created it; fall back to regular reply behavior.\r\n return executeClaudeCodeReply(input, sessionManager, allowBypass);\r\n }\r\n }\r\n }\r\n\r\n try {\r\n const options: Partial<Options> = {\r\n resume: input.sessionId,\r\n abortController,\r\n permissionMode: effectivePermissionMode,\r\n };\r\n\r\n if (input.cwd !== undefined) options.cwd = input.cwd;\r\n if (input.allowedTools !== undefined) options.allowedTools = input.allowedTools;\r\n if (input.disallowedTools !== undefined) options.disallowedTools = input.disallowedTools;\r\n if (input.maxTurns !== undefined) options.maxTurns = input.maxTurns;\r\n if (input.model !== undefined) options.model = input.model;\r\n if (input.maxBudgetUsd !== undefined) options.maxBudgetUsd = input.maxBudgetUsd;\r\n if (input.agents !== undefined) options.agents = input.agents as Options[\"agents\"];\r\n if (input.effort !== undefined) options.effort = input.effort;\r\n if (input.betas !== undefined) options.betas = input.betas as Options[\"betas\"];\r\n if (input.additionalDirectories !== undefined)\r\n options.additionalDirectories = input.additionalDirectories;\r\n if (input.outputFormat !== undefined) options.outputFormat = input.outputFormat;\r\n if (input.thinking !== undefined) options.thinking = input.thinking;\r\n if (input.tools !== undefined) options.tools = input.tools;\r\n if (input.systemPrompt !== undefined) options.systemPrompt = input.systemPrompt;\r\n if (input.persistSession !== undefined) options.persistSession = input.persistSession;\r\n if (input.resumeSessionAt !== undefined) options.resumeSessionAt = input.resumeSessionAt;\r\n if (input.pathToClaudeCodeExecutable !== undefined)\r\n options.pathToClaudeCodeExecutable = input.pathToClaudeCodeExecutable;\r\n if (input.agent !== undefined) options.agent = input.agent;\r\n if (input.mcpServers !== undefined)\r\n options.mcpServers = input.mcpServers as Options[\"mcpServers\"];\r\n if (input.sandbox !== undefined) options.sandbox = input.sandbox;\r\n if (input.fallbackModel !== undefined) options.fallbackModel = input.fallbackModel;\r\n if (input.enableFileCheckpointing !== undefined)\r\n options.enableFileCheckpointing = input.enableFileCheckpointing;\r\n if (input.includePartialMessages !== undefined)\r\n options.includePartialMessages = input.includePartialMessages;\r\n if (input.strictMcpConfig !== undefined) options.strictMcpConfig = input.strictMcpConfig;\r\n if (input.settingSources !== undefined) options.settingSources = input.settingSources;\r\n if (input.debug !== undefined) options.debug = input.debug;\r\n if (input.debugFile !== undefined) options.debugFile = input.debugFile;\r\n if (input.env !== undefined) options.env = input.env;\r\n\r\n if (effectivePermissionMode === \"bypassPermissions\") {\r\n options.allowDangerouslySkipPermissions = true;\r\n }\r\n\r\n if (input.forkSession) {\r\n options.forkSession = true;\r\n }\r\n\r\n for await (const message of query({\r\n prompt: input.prompt,\r\n options,\r\n })) {\r\n if (message.type === \"system\" && message.subtype === \"init\") {\r\n // Security: block bypassPermissions if it was applied by the underlying CLI state\r\n if (message.permissionMode === \"bypassPermissions\" && !allowBypass) {\r\n isError = true;\r\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.`;\r\n abortController.abort();\r\n break;\r\n }\r\n\r\n if (input.forkSession) {\r\n newSessionId = message.session_id;\r\n if (newSessionId !== input.sessionId && !sessionManager.get(newSessionId)) {\r\n try {\r\n sessionManager.create({\r\n sessionId: newSessionId,\r\n cwd: message.cwd,\r\n model: message.model,\r\n permissionMode: effectivePermissionMode,\r\n allowedTools: input.allowedTools,\r\n disallowedTools: input.disallowedTools,\r\n tools: input.tools ?? message.tools,\r\n maxTurns: input.maxTurns,\r\n systemPrompt: input.systemPrompt,\r\n agents: input.agents,\r\n maxBudgetUsd: input.maxBudgetUsd,\r\n effort: input.effort,\r\n betas: input.betas ?? message.betas,\r\n additionalDirectories: input.additionalDirectories,\r\n outputFormat: input.outputFormat,\r\n thinking: input.thinking,\r\n persistSession: input.persistSession,\r\n pathToClaudeCodeExecutable: input.pathToClaudeCodeExecutable,\r\n agent: input.agent,\r\n mcpServers: input.mcpServers,\r\n sandbox: input.sandbox,\r\n fallbackModel: input.fallbackModel,\r\n enableFileCheckpointing: input.enableFileCheckpointing,\r\n includePartialMessages: input.includePartialMessages,\r\n strictMcpConfig: input.strictMcpConfig,\r\n settingSources: input.settingSources,\r\n debug: input.debug,\r\n debugFile: input.debugFile,\r\n env: input.env,\r\n abortController,\r\n });\r\n } catch {\r\n // If it already exists, treat as busy.\r\n isError = true;\r\n resultText = `Error [${ErrorCode.SESSION_BUSY}]: Session is not available (status: running).`;\r\n abortController.abort();\r\n break;\r\n }\r\n }\r\n } else {\r\n sessionManager.update(input.sessionId, {\r\n cwd: message.cwd,\r\n model: message.model,\r\n permissionMode: effectivePermissionMode,\r\n betas: input.betas ?? message.betas,\r\n tools: input.tools ?? message.tools,\r\n });\r\n }\r\n }\r\n\r\n if (message.type === \"result\") {\r\n if (seenResult) continue;\r\n seenResult = true;\r\n\r\n const result: SDKResultMessage = message;\r\n durationMs = result.duration_ms;\r\n durationApiMs = result.duration_api_ms;\r\n numTurns = result.num_turns;\r\n totalCostUsd = result.total_cost_usd;\r\n isError = result.is_error;\r\n stopReason = result.stop_reason;\r\n usage = result.usage;\r\n modelUsage = result.modelUsage;\r\n permissionDenials = result.permission_denials;\r\n\r\n if (result.subtype === \"success\") {\r\n resultText = result.result;\r\n structuredOutput = result.structured_output;\r\n } else {\r\n isError = true;\r\n errorSubtype = result.subtype;\r\n resultText =\r\n result.errors.map(String).join(\"\\n\") || `Error [${result.subtype}]: Unknown error`;\r\n }\r\n\r\n break;\r\n }\r\n }\r\n } catch (err: unknown) {\r\n isError = true;\r\n const isAborted =\r\n abortController.signal.aborted ||\r\n err instanceof AbortError ||\r\n (err instanceof Error && err.name === \"AbortError\");\r\n if (isAborted) {\r\n resultText = timedOut\r\n ? `Error [${ErrorCode.TIMEOUT}]: Session timed out after ${input.timeout}ms.`\r\n : `Error [${ErrorCode.CANCELLED}]: Session was cancelled.`;\r\n } else {\r\n resultText = err instanceof Error ? err.message : String(err);\r\n }\r\n } finally {\r\n if (timeoutId) clearTimeout(timeoutId);\r\n }\r\n\r\n // Some SDK abort paths end the stream without throwing. Ensure aborts become TIMEOUT/CANCELLED,\r\n // not an INTERNAL \"missing_result\" error.\r\n if (!seenResult && !isError && abortController.signal.aborted) {\r\n isError = true;\r\n resultText = timedOut\r\n ? `Error [${ErrorCode.TIMEOUT}]: Session timed out after ${input.timeout}ms.`\r\n : `Error [${ErrorCode.CANCELLED}]: Session was cancelled.`;\r\n }\r\n\r\n if (!seenResult && !isError) {\r\n isError = true;\r\n errorSubtype = errorSubtype ?? \"missing_result\";\r\n const noResultMsg = `Error [${ErrorCode.INTERNAL}]: No result message received from agent.`;\r\n resultText = resultText ? `${noResultMsg} Original: ${resultText}` : noResultMsg;\r\n }\r\n\r\n const targetSessionId = input.forkSession ? newSessionId : input.sessionId;\r\n\r\n // Update totals/status and clear abortController for tracked sessions.\r\n // Note: In disk-resume mode, the original session may not exist in memory (it was resumed\r\n // from disk). When forking, only the new forked session is tracked; the original session\r\n // has no in-memory state to clean up, which is the expected behavior.\r\n const tracked = sessionManager.get(targetSessionId);\r\n if (tracked) {\r\n const nextTurns = input.forkSession ? numTurns : (tracked.totalTurns ?? 0) + numTurns;\r\n const nextCost = input.forkSession ? totalCostUsd : (tracked.totalCostUsd ?? 0) + totalCostUsd;\r\n if (tracked.status !== \"cancelled\") {\r\n sessionManager.update(targetSessionId, {\r\n status: isError ? \"error\" : \"idle\",\r\n totalTurns: nextTurns,\r\n totalCostUsd: nextCost,\r\n abortController: undefined,\r\n });\r\n } else {\r\n sessionManager.update(targetSessionId, {\r\n totalTurns: nextTurns,\r\n totalCostUsd: nextCost,\r\n abortController: undefined,\r\n });\r\n }\r\n const updated = sessionManager.get(targetSessionId);\r\n sessionTotalTurns = updated?.totalTurns;\r\n sessionTotalCostUsd = updated?.totalCostUsd;\r\n }\r\n\r\n // If fork was requested but no new session ID was received, flag as internal error\r\n if (input.forkSession && newSessionId === input.sessionId && !isError) {\r\n isError = true;\r\n const noForkMsg = `Error [${ErrorCode.INTERNAL}]: Fork requested but no new session ID received from agent.`;\r\n resultText = resultText ? `${noForkMsg} Original: ${resultText}` : noForkMsg;\r\n }\r\n\r\n return {\r\n sessionId: targetSessionId,\r\n result: resultText,\r\n isError,\r\n durationMs,\r\n durationApiMs,\r\n numTurns,\r\n totalCostUsd,\r\n sessionTotalTurns,\r\n sessionTotalCostUsd,\r\n structuredOutput,\r\n stopReason,\r\n errorSubtype,\r\n usage,\r\n modelUsage,\r\n permissionDenials,\r\n };\r\n}\r\n","/**\n * claude_code_session tool - Manage sessions (list, get, cancel)\n */\nimport type { SessionManager } from \"../session/manager.js\";\nimport type { PublicSessionInfo, SessionInfo, SessionAction } 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 | Omit<SessionInfo, \"abortController\">>;\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.toJSON(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/tools/claude-code.ts","../src/types.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\";\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 // 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 agent session to perform coding tasks autonomously.\nThe agent can read/write files, run commands, search code, and more.\nReturns a sessionId for continuing the conversation later.\nPermission mode defaults to \"dontAsk\" (non-interactive, safe for MCP).\nBy default, loads all local Claude settings (user, project, local) including CLAUDE.md for project context.`,\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 \"Tools to auto-approve without prompting. In permissionMode='dontAsk', this effectively acts as a tool whitelist.\"\n ),\n disallowedTools: z.array(z.string()).optional().describe(\"Tool blacklist\"),\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 set of available tools (array of names, or preset)\"),\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(\"Permission mode for the session\"),\n maxTurns: z.number().int().positive().optional().describe(\"Maximum agentic turns\"),\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(\"Custom system prompt (string or preset with optional append)\"),\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(\"Custom subagent definitions\"),\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 \"Main-thread agent name to apply custom agent system prompt, tool restrictions, and model\"\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(\"Sandbox settings for command execution isolation\"),\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(\"Include partial/streaming message events in output\"),\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(\"Environment variables to merge with process.env and pass to the Claude Code process (user-provided values take precedence)\"),\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 with full context preserved.\n\tClaude remembers all files read, analysis done, and conversation history.`,\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(\"Fork to a new session (preserves original session state)\"),\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\n .string()\n .optional()\n .describe(\"Working directory (used only for disk resume when session is missing)\"),\n allowedTools: z\n .array(z.string())\n .optional()\n .describe(\"Auto-approved tools (used only for disk resume when session is missing)\"),\n disallowedTools: z\n .array(z.string())\n .optional()\n .describe(\"Tool blacklist (used only for disk resume when session is missing)\"),\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 set of available tools (array of names, or preset)\"),\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 (used only for disk resume when session is missing)\"),\n maxTurns: z.number().int().positive().optional().describe(\"Maximum agentic turns\"),\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(\"Custom system prompt (string or preset with optional append)\"),\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(\"Custom subagent definitions\"),\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(\"Resume only up to and including a specific message UUID (disk resume only)\"),\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 \"Main-thread agent name to apply custom agent system prompt, tool restrictions, and model\"\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(\"Sandbox settings for command execution isolation\"),\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(\"Include partial/streaming message events in output\"),\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(\"Environment variables to merge with process.env and pass to the Claude Code process (user-provided values take precedence)\"),\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: list all sessions, get status of a specific session, or cancel a running session.`,\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 \"Include sensitive fields (cwd, systemPrompt, agents, additionalDirectories) in responses. 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 (allow bypassPermissions mode), disable_bypass, get_config.`,\n {\n action: z.enum(CONFIGURE_ACTIONS).describe(\"Configuration action to perform\"),\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 { PublicSessionInfo, SessionInfo, PermissionMode, SessionStatus } 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 ?? \"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 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 /** Serialize session info for external consumption (strip internal fields) */\n toJSON(info: SessionInfo): Omit<SessionInfo, \"abortController\"> {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { abortController: _, ...rest } = info;\n return rest;\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\";\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,\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 = 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 */\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 settings for command execution isolation */\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 /** Main-thread agent name */\n agent?: string;\n /** MCP server configurations */\n mcpServers?: Record<string, McpServerConfig>;\n /** Sandbox settings for command execution isolation */\n sandbox?: SandboxSettings;\n /** Fallback model if the primary model fails */\n fallbackModel?: string;\n /** Enable file checkpointing to track file changes */\n enableFileCheckpointing?: boolean;\n /** Include partial/streaming message events */\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/** 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 * 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\";\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,\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 = 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,\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,\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 = 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 { PublicSessionInfo, SessionInfo, SessionAction } 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 | Omit<SessionInfo, \"abortController\">>;\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.toJSON(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":";;;AAMA,SAAS,4BAA4B;;;ACHrC,SAAS,iBAAiB;AAC1B,SAAS,SAAS;;;ACClB,IAAM,yBAAyB,KAAK,KAAK;AACzC,IAAM,iCAAiC,IAAI,KAAK,KAAK;AACrD,IAAM,8BAA8B;AAE7B,IAAM,iBAAN,MAAqB;AAAA,EAClB,WAAW,oBAAI,IAAyB;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,MAIT;AACD,SAAK,eACH,MAAM,iBAAiB,SAAY,KAAK,eAAe;AACzD,SAAK,sBACH,MAAM,wBAAwB,SAC1B,KAAK,sBACL;AACN,UAAM,oBACJ,MAAM,sBAAsB,SAAY,KAAK,oBAAoB;AAGnE,SAAK,eAAe,YAAY,MAAM,KAAK,QAAQ,GAAG,iBAAiB;AACvE,QAAI,KAAK,aAAa,OAAO;AAC3B,WAAK,aAAa,MAAM;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,OAAO,QA+BS;AACd,UAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,UAAM,WAAW,KAAK,SAAS,IAAI,OAAO,SAAS;AACnD,QAAI,UAAU;AACZ,YAAM,IAAI,MAAM,YAAY,OAAO,SAAS,6BAA6B,SAAS,MAAM,GAAG;AAAA,IAC7F;AACA,UAAM,OAAoB;AAAA,MACxB,WAAW,OAAO;AAAA,MAClB,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,KAAK,OAAO;AAAA,MACZ,OAAO,OAAO;AAAA,MACd,gBAAgB,OAAO,kBAAkB;AAAA,MACzC,cAAc,OAAO;AAAA,MACrB,iBAAiB,OAAO;AAAA,MACxB,OAAO,OAAO;AAAA,MACd,UAAU,OAAO;AAAA,MACjB,cAAc,OAAO;AAAA,MACrB,QAAQ,OAAO;AAAA,MACf,cAAc,OAAO;AAAA,MACrB,QAAQ,OAAO;AAAA,MACf,OAAO,OAAO;AAAA,MACd,uBAAuB,OAAO;AAAA,MAC9B,cAAc,OAAO;AAAA,MACrB,UAAU,OAAO;AAAA,MACjB,gBAAgB,OAAO;AAAA,MACvB,4BAA4B,OAAO;AAAA,MACnC,OAAO,OAAO;AAAA,MACd,YAAY,OAAO;AAAA,MACnB,SAAS,OAAO;AAAA,MAChB,eAAe,OAAO;AAAA,MACtB,yBAAyB,OAAO;AAAA,MAChC,wBAAwB,OAAO;AAAA,MAC/B,iBAAiB,OAAO;AAAA,MACxB,gBAAgB,OAAO;AAAA,MACvB,OAAO,OAAO;AAAA,MACd,WAAW,OAAO;AAAA,MAClB,KAAK,OAAO;AAAA,MACZ,iBAAiB,OAAO;AAAA,IAC1B;AACA,SAAK,SAAS,IAAI,OAAO,WAAW,IAAI;AACxC,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,WAA4C;AAC9C,WAAO,KAAK,SAAS,IAAI,SAAS;AAAA,EACpC;AAAA,EAEA,OAAsB;AACpB,WAAO,MAAM,KAAK,KAAK,SAAS,OAAO,CAAC;AAAA,EAC1C;AAAA,EAEA,OACE,WACA,OACyB;AACzB,UAAM,OAAO,KAAK,SAAS,IAAI,SAAS;AACxC,QAAI,CAAC,KAAM,QAAO;AAClB,WAAO,OAAO,MAAM,OAAO,EAAE,eAAc,oBAAI,KAAK,GAAE,YAAY,EAAE,CAAC;AACrE,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WACE,WACA,gBACA,iBACyB;AACzB,QAAI,mBAAmB,UAAU,mBAAmB,QAAS,QAAO;AACpE,UAAM,OAAO,KAAK,SAAS,IAAI,SAAS;AACxC,QAAI,CAAC,QAAQ,KAAK,WAAW,eAAgB,QAAO;AACpD,SAAK,SAAS;AACd,SAAK,kBAAkB;AACvB,SAAK,gBAAe,oBAAI,KAAK,GAAE,YAAY;AAC3C,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,WAA4B;AACjC,UAAM,OAAO,KAAK,SAAS,IAAI,SAAS;AACxC,QAAI,CAAC,KAAM,QAAO;AAClB,QAAI,KAAK,WAAW,UAAW,QAAO;AACtC,QAAI,KAAK,iBAAiB;AACxB,WAAK,gBAAgB,MAAM;AAAA,IAC7B;AACA,SAAK,SAAS;AACd,SAAK,gBAAe,oBAAI,KAAK,GAAE,YAAY;AAC3C,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,WAA4B;AACjC,WAAO,KAAK,SAAS,OAAO,SAAS;AAAA,EACvC;AAAA;AAAA,EAGQ,UAAgB;AACtB,UAAM,MAAM,KAAK,IAAI;AACrB,eAAW,CAAC,IAAI,IAAI,KAAK,KAAK,UAAU;AACtC,YAAM,aAAa,IAAI,KAAK,KAAK,YAAY,EAAE,QAAQ;AACvD,UAAI,OAAO,MAAM,UAAU,GAAG;AAE5B,aAAK,SAAS,OAAO,EAAE;AAAA,MACzB,WAAW,KAAK,WAAW,aAAa,MAAM,aAAa,KAAK,qBAAqB;AAEnF,YAAI,KAAK,gBAAiB,MAAK,gBAAgB,MAAM;AACrD,aAAK,SAAS;AACd,aAAK,gBAAe,oBAAI,KAAK,GAAE,YAAY;AAAA,MAC7C,WAAW,KAAK,WAAW,aAAa,MAAM,aAAa,KAAK,cAAc;AAC5E,aAAK,SAAS,OAAO,EAAE;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,OAAO,MAAyD;AAE9D,UAAM,EAAE,iBAAiB,GAAG,GAAG,KAAK,IAAI;AACxC,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,aAAa,MAAsC;AAEjD,UAAM;AAAA,MACJ,iBAAiB;AAAA,MACjB,KAAK;AAAA,MACL,cAAc;AAAA,MACd,QAAQ;AAAA,MACR,uBAAuB;AAAA,MACvB,4BAA4B;AAAA,MAC5B,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,gBAAgB;AAAA,MAChB,WAAW;AAAA,MACX,KAAK;AAAA,MACL,GAAG;AAAA,IACL,IAAI;AAEJ,WAAO;AAAA,EACT;AAAA,EAEA,UAAgB;AACd,kBAAc,KAAK,YAAY;AAC/B,eAAW,QAAQ,KAAK,SAAS,OAAO,GAAG;AACzC,UAAI,KAAK,WAAW,aAAa,KAAK,iBAAiB;AACrD,aAAK,gBAAgB,MAAM;AAAA,MAC7B;AACA,WAAK,SAAS;AAAA,IAChB;AAAA,EAGF;AACF;;;AC9NA,SAAS,OAAO,kBAAkB;;;ACK3B,IAAM,mBAAmB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAIO,IAAM,gBAAgB,CAAC,OAAO,UAAU,QAAQ,KAAK;AAIrD,IAAM,eAAe,CAAC,UAAU,QAAQ,SAAS,SAAS;AAI1D,IAAM,oBAAoB,CAAC,iBAAiB,kBAAkB,YAAY;AAI1E,IAAM,kBAAkB,CAAC,QAAQ,OAAO,QAAQ;AAwChD,IAAM,0BAA2C,CAAC,QAAQ,WAAW,OAAO;;;ADlBnF,eAAsB,kBACpB,OACA,gBACA,WACA,cAAc,OACQ;AACtB,QAAM,MAAM,MAAM,QAAQ,SAAY,MAAM,MAAM;AAElD,MAAI,OAAO,QAAQ,YAAY,IAAI,KAAK,MAAM,IAAI;AAChD,WAAO;AAAA,MACL,WAAW;AAAA,MACX,QAAQ,mDAAoC;AAAA,MAC5C,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,cAAc;AAAA,IAChB;AAAA,EACF;AAEA,MAAI,YAAY;AAChB,MAAI,aAAa;AACjB,MAAI,UAAU;AACd,MAAI,aAAa;AACjB,MAAI;AACJ,MAAI,WAAW;AACf,MAAI,eAAe;AACnB,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI,aAAa;AACjB,MAAI,WAAW;AAGf,MAAI,MAAM,mBAAmB,uBAAuB,CAAC,aAAa;AAChE,WAAO;AAAA,MACL,WAAW;AAAA,MACX,QAAQ,qDAAqC;AAAA,MAC7C,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,cAAc;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,kBAAkB,IAAI,gBAAgB;AAE5C,MAAI;AACJ,MAAI;AACF,QAAI,MAAM,YAAY,QAAW;AAC/B,kBAAY,WAAW,MAAM;AAC3B,mBAAW;AACX,wBAAgB,MAAM;AAAA,MACxB,GAAG,MAAM,OAAO;AAAA,IAClB;AAIA,UAAM,0BAA0B,MAAM,kBAAkB;AAExD,UAAM,UAA4B;AAAA,MAChC;AAAA,MACA;AAAA,MACA,gBAAgB;AAAA,IAClB;AAEA,QAAI,MAAM,iBAAiB,OAAW,SAAQ,eAAe,MAAM;AACnE,QAAI,MAAM,oBAAoB,OAAW,SAAQ,kBAAkB,MAAM;AACzE,QAAI,MAAM,aAAa,OAAW,SAAQ,WAAW,MAAM;AAC3D,QAAI,MAAM,UAAU,OAAW,SAAQ,QAAQ,MAAM;AACrD,QAAI,MAAM,iBAAiB,OAAW,SAAQ,eAAe,MAAM;AACnE,QAAI,MAAM,WAAW,OAAW,SAAQ,SAAS,MAAM;AACvD,QAAI,MAAM,WAAW,OAAW,SAAQ,SAAS,MAAM;AACvD,QAAI,MAAM,UAAU,OAAW,SAAQ,QAAQ,MAAM;AACrD,QAAI,MAAM,0BAA0B;AAClC,cAAQ,wBAAwB,MAAM;AACxC,QAAI,MAAM,iBAAiB,OAAW,SAAQ,eAAe,MAAM;AACnE,QAAI,MAAM,aAAa,OAAW,SAAQ,WAAW,MAAM;AAC3D,QAAI,MAAM,UAAU,OAAW,SAAQ,QAAQ,MAAM;AACrD,QAAI,MAAM,mBAAmB,OAAW,SAAQ,iBAAiB,MAAM;AACvE,QAAI,MAAM,+BAA+B;AACvC,cAAQ,6BAA6B,MAAM;AAC7C,QAAI,MAAM,UAAU,OAAW,SAAQ,QAAQ,MAAM;AACrD,QAAI,MAAM,eAAe;AACvB,cAAQ,aAAa,MAAM;AAC7B,QAAI,MAAM,YAAY,OAAW,SAAQ,UAAU,MAAM;AACzD,QAAI,MAAM,kBAAkB,OAAW,SAAQ,gBAAgB,MAAM;AACrE,QAAI,MAAM,4BAA4B;AACpC,cAAQ,0BAA0B,MAAM;AAC1C,QAAI,MAAM,2BAA2B;AACnC,cAAQ,yBAAyB,MAAM;AACzC,QAAI,MAAM,oBAAoB,OAAW,SAAQ,kBAAkB,MAAM;AACzE,QAAI,MAAM,mBAAmB,OAAW,SAAQ,iBAAiB,MAAM;AAAA,QAClE,SAAQ,iBAAiB;AAC9B,QAAI,MAAM,UAAU,OAAW,SAAQ,QAAQ,MAAM;AACrD,QAAI,MAAM,cAAc,OAAW,SAAQ,YAAY,MAAM;AAC7D,QAAI,MAAM,QAAQ,OAAW,SAAQ,MAAM,EAAE,GAAG,QAAQ,KAAK,GAAG,MAAM,IAAI;AAE1E,QAAI,4BAA4B,qBAAqB;AACnD,cAAQ,kCAAkC;AAAA,IAC5C;AAEA,QAAI,MAAM,iBAAiB,OAAW,SAAQ,eAAe,MAAM;AAGnE,qBAAiB,WAAW,MAAM;AAAA,MAChC,QAAQ,MAAM;AAAA,MACd;AAAA,IACF,CAAC,GAAG;AACF,UAAI,QAAQ,SAAS,YAAY,QAAQ,YAAY,QAAQ;AAC3D,YAAI,UAAW;AACf,oBAAY,QAAQ;AACpB,uBAAe,OAAO;AAAA,UACpB;AAAA,UACA;AAAA,UACA,OAAO,MAAM;AAAA,UACb,gBAAgB;AAAA,UAChB,cAAc,MAAM;AAAA,UACpB,iBAAiB,MAAM;AAAA,UACvB,OAAO,MAAM;AAAA,UACb,UAAU,MAAM;AAAA,UAChB,cAAc,MAAM;AAAA,UACpB,QAAQ,MAAM;AAAA,UACd,cAAc,MAAM;AAAA,UACpB,QAAQ,MAAM;AAAA,UACd,OAAO,MAAM;AAAA,UACb,uBAAuB,MAAM;AAAA,UAC7B,cAAc,MAAM;AAAA,UACpB,UAAU,MAAM;AAAA,UAChB,gBAAgB,MAAM;AAAA,UACtB,4BAA4B,MAAM;AAAA,UAClC,OAAO,MAAM;AAAA,UACb,YAAY,MAAM;AAAA,UAClB,SAAS,MAAM;AAAA,UACf,eAAe,MAAM;AAAA,UACrB,yBAAyB,MAAM;AAAA,UAC/B,wBAAwB,MAAM;AAAA,UAC9B,iBAAiB,MAAM;AAAA,UACvB,gBAAgB,MAAM;AAAA,UACtB,OAAO,MAAM;AAAA,UACb,WAAW,MAAM;AAAA,UACjB,KAAK,MAAM;AAAA,UACX;AAAA,QACF,CAAC;AAAA,MACH;AAEA,UAAI,QAAQ,SAAS,UAAU;AAC7B,YAAI,WAAY;AAChB,qBAAa;AAEb,cAAM,SAA2B;AACjC,qBAAa,OAAO;AACpB,wBAAgB,OAAO;AACvB,mBAAW,OAAO;AAClB,uBAAe,OAAO;AACtB,kBAAU,OAAO;AACjB,qBAAa,OAAO;AACpB,gBAAQ,OAAO;AACf,qBAAa,OAAO;AACpB,4BAAoB,OAAO;AAE3B,YAAI,OAAO,YAAY,WAAW;AAChC,uBAAa,OAAO;AACpB,6BAAmB,OAAO;AAAA,QAC5B,OAAO;AACL,oBAAU;AACV,yBAAe,OAAO;AACtB,uBACE,OAAO,OAAO,IAAI,MAAM,EAAE,KAAK,IAAI,KAAK,UAAU,OAAO,OAAO;AAAA,QACpE;AAEA;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,KAAc;AACrB,cAAU;AAEV,UAAM,YACJ,gBAAgB,OAAO,WACvB,eAAe,cACd,eAAe,SAAS,IAAI,SAAS;AACxC,QAAI,WAAW;AACb,mBAAa,WACT,iCAA2B,8BAA8B,MAAM,OAAO,QACtE,qCAA6B;AAAA,IACnC,OAAO;AACL,mBAAa,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,IAC9D;AACA,QAAI,WAAW;AACb,YAAM,UAAU,eAAe,IAAI,SAAS;AAC5C,UAAI,SAAS;AAEX,YAAI,YAAY,QAAQ,WAAW,eAAe,QAAQ,WAAW,SAAS;AAC5E,yBAAe,OAAO,WAAW,EAAE,QAAQ,QAAQ,CAAC;AAAA,QACtD,WAAW,aAAa,QAAQ,WAAW,WAAW;AACpD,yBAAe,OAAO,WAAW,EAAE,QAAQ,YAAY,CAAC;AAAA,QAC1D,WAAW,CAAC,aAAa,QAAQ,WAAW,aAAa;AACvD,yBAAe,OAAO,WAAW,EAAE,QAAQ,QAAQ,CAAC;AAAA,QACtD;AAAA,MACF;AAAA,IACF;AAAA,EACF,UAAE;AACA,QAAI,UAAW,cAAa,SAAS;AAAA,EACvC;AAIA,MAAI,CAAC,cAAc,CAAC,WAAW,gBAAgB,OAAO,SAAS;AAC7D,cAAU;AACV,iBAAa,WACT,iCAA2B,8BAA8B,MAAM,OAAO,QACtE,qCAA6B;AAAA,EACnC;AAEA,MAAI,aAAa,CAAC,cAAc,CAAC,SAAS;AACxC,cAAU;AACV,mBAAe,gBAAgB;AAC/B,UAAM,cAAc,mCAA4B;AAChD,iBAAa,aAAa,GAAG,WAAW,cAAc,UAAU,KAAK;AAAA,EACvE;AAIA,MAAI,WAAW;AACb,UAAM,UAAU,eAAe,IAAI,SAAS;AAC5C,QAAI,WAAW,QAAQ,WAAW,aAAa;AAC7C,qBAAe,OAAO,WAAW;AAAA,QAC/B,QAAQ,UAAU,UAAU;AAAA,QAC5B,YAAY;AAAA,QACZ;AAAA,QACA,iBAAiB;AAAA,MACnB,CAAC;AACD,YAAM,UAAU,eAAe,IAAI,SAAS;AAC5C,0BAAoB,SAAS;AAC7B,4BAAsB,SAAS;AAAA,IACjC,WAAW,SAAS;AAElB,qBAAe,OAAO,WAAW;AAAA,QAC/B,YAAY;AAAA,QACZ;AAAA,QACA,iBAAiB;AAAA,MACnB,CAAC;AACD,YAAM,UAAU,eAAe,IAAI,SAAS;AAC5C,0BAAoB,SAAS;AAC7B,4BAAsB,SAAS;AAAA,IACjC;AAAA,EACF,OAAO;AAEL,cAAU;AACV,UAAM,YAAY,WACd,iCAA2B,8BAA8B,MAAM,OAAO,iCACtE,mCAA4B;AAChC,iBAAa,aAAa,GAAG,SAAS,cAAc,UAAU,KAAK;AAAA,EACrE;AAEA,SAAO;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AEtUA,SAAS,SAAAA,QAAO,cAAAC,mBAAkB;AA2DlC,eAAsB,uBACpB,OACA,gBACA,cAAc,OACQ;AACtB,QAAM,UAAU,eAAe,IAAI,MAAM,SAAS;AAClD,MAAI,CAAC,SAAS;AACZ,UAAM,kBAAkB,QAAQ,IAAI,sCAAsC;AAC1E,QAAI,CAAC,iBAAiB;AACpB,aAAO;AAAA,QACL,WAAW,MAAM;AAAA,QACjB,QAAQ,qDAAqC,eAAe,MAAM,SAAS;AAAA,QAC3E,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,cAAc;AAAA,MAChB;AAAA,IACF;AAEA,WAAO,iCAAiC,OAAO,gBAAgB,WAAW;AAAA,EAC5E;AAEA,MAAI,QAAQ,WAAW,WAAW;AAChC,WAAO;AAAA,MACL,WAAW,MAAM;AAAA,MACjB,QAAQ,2CAAgC;AAAA,MACxC,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,cAAc;AAAA,IAChB;AAAA,EACF;AAEA,MAAI,QAAQ,WAAW,aAAa;AAClC,WAAO;AAAA,MACL,WAAW,MAAM;AAAA,MACjB,QAAQ,qCAA6B,eAAe,MAAM,SAAS;AAAA,MACnE,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,cAAc;AAAA,IAChB;AAAA,EACF;AAGA,MAAI,QAAQ,mBAAmB,uBAAuB,CAAC,aAAa;AAClE,WAAO;AAAA,MACL,WAAW,MAAM;AAAA,MACjB,QAAQ,qDAAqC;AAAA,MAC7C,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,cAAc;AAAA,IAChB;AAAA,EACF;AAGA,QAAM,iBAAiB,QAAQ;AAC/B,QAAM,kBAAkB,IAAI,gBAAgB;AAC5C,MAAI,WAAW;AACf,QAAM,WAAW,eAAe,WAAW,MAAM,WAAW,gBAAgB,eAAe;AAC3F,MAAI,CAAC,UAAU;AACb,UAAM,UAAU,eAAe,IAAI,MAAM,SAAS;AAClD,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,QACL,WAAW,MAAM;AAAA,QACjB,QAAQ,qDAAqC,eAAe,MAAM,SAAS;AAAA,QAC3E,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,cAAc;AAAA,MAChB;AAAA,IACF;AAEA,WAAO;AAAA,MACL,WAAW,MAAM;AAAA,MACjB,QAAQ,2CAAgC,wCAAwC,QAAQ,MAAM;AAAA,MAC9F,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,cAAc;AAAA,IAChB;AAAA,EACF;AAEA,MAAI;AACJ,MAAI,MAAM,YAAY,QAAW;AAC/B,gBAAY,WAAW,MAAM;AAC3B,iBAAW;AACX,sBAAgB,MAAM;AAAA,IACxB,GAAG,MAAM,OAAO;AAAA,EAClB;AAEA,MAAI,aAAa;AACjB,MAAI,UAAU;AACd,MAAI,aAAa;AACjB,MAAI;AACJ,MAAI,WAAW;AACf,MAAI,eAAe;AACnB,MAAI;AACJ,MAAI;AACJ,MAAI,eAAe,MAAM;AACzB,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI,aAAa;AACjB,MAAI,qBAAqB;AAEzB,MAAI;AACF,UAAM,UAA4B;AAAA,MAChC,QAAQ,MAAM;AAAA,MACd;AAAA,MACA,KAAK,QAAQ;AAAA,MACb,gBAAgB,QAAQ;AAAA,IAC1B;AAEA,QAAI,QAAQ,iBAAiB,OAAW,SAAQ,eAAe,QAAQ;AACvE,QAAI,QAAQ,oBAAoB,OAAW,SAAQ,kBAAkB,QAAQ;AAC7E,QAAI,QAAQ,aAAa,OAAW,SAAQ,WAAW,QAAQ;AAC/D,QAAI,QAAQ,UAAU,OAAW,SAAQ,QAAQ,QAAQ;AACzD,QAAI,QAAQ,iBAAiB,OAAW,SAAQ,eAAe,QAAQ;AACvE,QAAI,QAAQ,WAAW,OAAW,SAAQ,SAAS,QAAQ;AAC3D,QAAI,QAAQ,WAAW,OAAW,SAAQ,SAAS,QAAQ;AAC3D,QAAI,QAAQ,UAAU,OAAW,SAAQ,QAAQ,QAAQ;AACzD,QAAI,QAAQ,0BAA0B;AACpC,cAAQ,wBAAwB,QAAQ;AAC1C,QAAI,QAAQ,iBAAiB,OAAW,SAAQ,eAAe,QAAQ;AACvE,QAAI,QAAQ,aAAa,OAAW,SAAQ,WAAW,QAAQ;AAC/D,QAAI,QAAQ,UAAU,OAAW,SAAQ,QAAQ,QAAQ;AACzD,QAAI,QAAQ,iBAAiB,OAAW,SAAQ,eAAe,QAAQ;AACvE,QAAI,QAAQ,mBAAmB,OAAW,SAAQ,iBAAiB,QAAQ;AAC3E,QAAI,QAAQ,+BAA+B;AACzC,cAAQ,6BAA6B,QAAQ;AAC/C,QAAI,QAAQ,UAAU,OAAW,SAAQ,QAAQ,QAAQ;AACzD,QAAI,QAAQ,eAAe;AACzB,cAAQ,aAAa,QAAQ;AAC/B,QAAI,QAAQ,YAAY,OAAW,SAAQ,UAAU,QAAQ;AAC7D,QAAI,QAAQ,kBAAkB,OAAW,SAAQ,gBAAgB,QAAQ;AACzE,QAAI,QAAQ,4BAA4B;AACtC,cAAQ,0BAA0B,QAAQ;AAC5C,QAAI,QAAQ,2BAA2B;AACrC,cAAQ,yBAAyB,QAAQ;AAC3C,QAAI,QAAQ,oBAAoB,OAAW,SAAQ,kBAAkB,QAAQ;AAC7E,QAAI,QAAQ,mBAAmB,OAAW,SAAQ,iBAAiB,QAAQ;AAAA,QACtE,SAAQ,iBAAiB;AAC9B,QAAI,QAAQ,UAAU,OAAW,SAAQ,QAAQ,QAAQ;AACzD,QAAI,QAAQ,cAAc,OAAW,SAAQ,YAAY,QAAQ;AACjE,QAAI,QAAQ,QAAQ,OAAW,SAAQ,MAAM,EAAE,GAAG,QAAQ,KAAK,GAAG,QAAQ,IAAI;AAE9E,QAAI,QAAQ,mBAAmB,qBAAqB;AAClD,cAAQ,kCAAkC;AAAA,IAC5C;AAEA,QAAI,MAAM,aAAa;AACrB,cAAQ,cAAc;AAAA,IACxB;AAEA,qBAAiB,WAAWC,OAAM;AAAA,MAChC,QAAQ,MAAM;AAAA,MACd;AAAA,IACF,CAAC,GAAG;AAEF,UAAI,MAAM,eAAe,QAAQ,SAAS,YAAY,QAAQ,YAAY,QAAQ;AAChF,uBAAe,QAAQ;AAIvB,YAAI,CAAC,sBAAsB,iBAAiB,MAAM,WAAW;AAC3D,yBAAe,OAAO;AAAA,YACpB,WAAW;AAAA,YACX,KAAK,QAAQ;AAAA,YACb,OAAO,QAAQ;AAAA,YACf,gBAAgB,QAAQ;AAAA,YACxB,cAAc,QAAQ;AAAA,YACtB,iBAAiB,QAAQ;AAAA,YACzB,OAAO,QAAQ;AAAA,YACf,UAAU,QAAQ;AAAA,YAClB,cAAc,QAAQ;AAAA,YACtB,QAAQ,QAAQ;AAAA,YAChB,cAAc,QAAQ;AAAA,YACtB,QAAQ,QAAQ;AAAA,YAChB,OAAO,QAAQ;AAAA,YACf,uBAAuB,QAAQ;AAAA,YAC/B,cAAc,QAAQ;AAAA,YACtB,UAAU,QAAQ;AAAA,YAClB,gBAAgB,QAAQ;AAAA,YACxB,4BAA4B,QAAQ;AAAA,YACpC,OAAO,QAAQ;AAAA,YACf,YAAY,QAAQ;AAAA,YACpB,SAAS,QAAQ;AAAA,YACjB,eAAe,QAAQ;AAAA,YACvB,yBAAyB,QAAQ;AAAA,YACjC,wBAAwB,QAAQ;AAAA,YAChC,iBAAiB,QAAQ;AAAA,YACzB,gBAAgB,QAAQ;AAAA,YACxB,OAAO,QAAQ;AAAA,YACf,WAAW,QAAQ;AAAA,YACnB,KAAK,QAAQ;AAAA,YACb;AAAA,UACF,CAAC;AACD,+BAAqB;AAAA,QACvB;AAAA,MACF;AAEA,UAAI,QAAQ,SAAS,UAAU;AAC7B,YAAI,WAAY;AAChB,qBAAa;AAEb,cAAM,SAA2B;AACjC,qBAAa,OAAO;AACpB,wBAAgB,OAAO;AACvB,mBAAW,OAAO;AAClB,uBAAe,OAAO;AACtB,kBAAU,OAAO;AACjB,qBAAa,OAAO;AACpB,gBAAQ,OAAO;AACf,qBAAa,OAAO;AACpB,4BAAoB,OAAO;AAE3B,YAAI,OAAO,YAAY,WAAW;AAChC,uBAAa,OAAO;AACpB,6BAAmB,OAAO;AAAA,QAC5B,OAAO;AACL,oBAAU;AACV,yBAAe,OAAO;AACtB,uBACE,OAAO,OAAO,IAAI,MAAM,EAAE,KAAK,IAAI,KAAK,UAAU,OAAO,OAAO;AAAA,QACpE;AAEA;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,KAAc;AACrB,cAAU;AACV,UAAM,YACJ,gBAAgB,OAAO,WACvB,eAAeC,eACd,eAAe,SAAS,IAAI,SAAS;AACxC,QAAI,WAAW;AACb,mBAAa,WACT,iCAA2B,8BAA8B,MAAM,OAAO,QACtE,qCAA6B;AAAA,IACnC,OAAO;AACL,mBAAa,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,IAC9D;AAAA,EACF,UAAE;AACA,QAAI,UAAW,cAAa,SAAS;AAAA,EACvC;AAIA,MAAI,CAAC,cAAc,CAAC,WAAW,gBAAgB,OAAO,SAAS;AAC7D,cAAU;AACV,iBAAa,WACT,iCAA2B,8BAA8B,MAAM,OAAO,QACtE,qCAA6B;AAAA,EACnC;AAEA,MAAI,CAAC,cAAc,CAAC,SAAS;AAC3B,cAAU;AACV,mBAAe,gBAAgB;AAC/B,UAAM,cAAc,mCAA4B;AAChD,iBAAa,aAAa,GAAG,WAAW,cAAc,UAAU,KAAK;AAAA,EACvE;AAIA,MAAI,MAAM,eAAe,iBAAiB,MAAM,WAAW;AACzD,UAAM,gBAAgB,eAAe,IAAI,YAAY;AACrD,QAAI,iBAAiB,cAAc,WAAW,aAAa;AACzD,qBAAe,OAAO,cAAc;AAAA,QAClC,QAAQ,UAAU,UAAU;AAAA,QAC5B,YAAY;AAAA,QACZ;AAAA,QACA,iBAAiB;AAAA,MACnB,CAAC;AACD,YAAM,cAAc,eAAe,IAAI,YAAY;AACnD,0BAAoB,aAAa;AACjC,4BAAsB,aAAa;AAAA,IACrC,WAAW,eAAe;AACxB,qBAAe,OAAO,cAAc;AAAA,QAClC,YAAY;AAAA,QACZ;AAAA,QACA,iBAAiB;AAAA,MACnB,CAAC;AACD,YAAM,cAAc,eAAe,IAAI,YAAY;AACnD,0BAAoB,aAAa;AACjC,4BAAsB,aAAa;AAAA,IACrC;AAEA,UAAM,cAAc,eAAe,IAAI,MAAM,SAAS;AACtD,QAAI,eAAe,YAAY,WAAW,aAAa;AACrD,qBAAe,OAAO,MAAM,WAAW;AAAA,QACrC,QAAQ;AAAA,QACR,iBAAiB;AAAA,MACnB,CAAC;AAAA,IACH,WAAW,aAAa;AACtB,qBAAe,OAAO,MAAM,WAAW;AAAA,QACrC,iBAAiB;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,EACF,OAAO;AACL,UAAM,UAAU,eAAe,IAAI,MAAM,SAAS;AAClD,QAAI,WAAW,QAAQ,WAAW,aAAa;AAC7C,qBAAe,OAAO,MAAM,WAAW;AAAA,QACrC,QAAQ,UAAU,UAAU;AAAA,QAC5B,aAAa,QAAQ,cAAc,KAAK;AAAA,QACxC,eAAe,QAAQ,gBAAgB,KAAK;AAAA,QAC5C,iBAAiB;AAAA,MACnB,CAAC;AACD,YAAM,UAAU,eAAe,IAAI,MAAM,SAAS;AAClD,0BAAoB,SAAS;AAC7B,4BAAsB,SAAS;AAAA,IACjC,WAAW,SAAS;AAClB,qBAAe,OAAO,MAAM,WAAW;AAAA,QACrC,aAAa,QAAQ,cAAc,KAAK;AAAA,QACxC,eAAe,QAAQ,gBAAgB,KAAK;AAAA,QAC5C,iBAAiB;AAAA,MACnB,CAAC;AACD,YAAM,UAAU,eAAe,IAAI,MAAM,SAAS;AAClD,0BAAoB,SAAS;AAC7B,4BAAsB,SAAS;AAAA,IACjC;AAAA,EACF;AAEA,QAAM,kBAAkB,MAAM,cAAc,eAAe,MAAM;AAGjE,MAAI,MAAM,eAAe,iBAAiB,MAAM,aAAa,CAAC,SAAS;AACrE,cAAU;AACV,UAAM,YAAY,mCAA4B;AAC9C,iBAAa,aAAa,GAAG,SAAS,cAAc,UAAU,KAAK;AAAA,EACrE;AAEA,SAAO;AAAA,IACL,WAAW;AAAA,IACX,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAe,iCACb,OACA,gBACA,aACsB;AACtB,MAAI,MAAM,QAAQ,WAAc,OAAO,MAAM,QAAQ,YAAY,MAAM,IAAI,KAAK,MAAM,KAAK;AACzF,WAAO;AAAA,MACL,WAAW,MAAM;AAAA,MACjB,QAAQ,mDAAoC;AAAA,MAC5C,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,cAAc;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,0BAA0B,MAAM,kBAAkB;AAExD,MAAI,4BAA4B,uBAAuB,CAAC,aAAa;AACnE,WAAO;AAAA,MACL,WAAW,MAAM;AAAA,MACjB,QAAQ,qDAAqC;AAAA,MAC7C,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,cAAc;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,kBAAkB,IAAI,gBAAgB;AAC5C,MAAI,WAAW;AAEf,MAAI;AACJ,MAAI,MAAM,YAAY,QAAW;AAC/B,gBAAY,WAAW,MAAM;AAC3B,iBAAW;AACX,sBAAgB,MAAM;AAAA,IACxB,GAAG,MAAM,OAAO;AAAA,EAClB;AAEA,MAAI,aAAa;AACjB,MAAI,UAAU;AACd,MAAI,aAAa;AACjB,MAAI;AACJ,MAAI,WAAW;AACf,MAAI,eAAe;AACnB,MAAI;AACJ,MAAI;AACJ,MAAI,eAAe,MAAM;AACzB,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI,aAAa;AAGjB,MAAI,CAAC,MAAM,aAAa;AACtB,UAAM,WAAW,eAAe,IAAI,MAAM,SAAS;AACnD,QAAI,CAAC,UAAU;AACb,YAAM,MAAM,MAAM,OAAO,QAAQ,IAAI;AACrC,UAAI,OAAO,QAAQ,YAAY,IAAI,KAAK,MAAM,IAAI;AAChD,eAAO;AAAA,UACL,WAAW,MAAM;AAAA,UACjB,QAAQ,mDAAoC;AAAA,UAC5C,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,cAAc;AAAA,QAChB;AAAA,MACF;AACA,UAAI;AACF,uBAAe,OAAO;AAAA,UACpB,WAAW,MAAM;AAAA,UACjB;AAAA,UACA,OAAO,MAAM;AAAA,UACb,gBAAgB;AAAA,UAChB,cAAc,MAAM;AAAA,UACpB,iBAAiB,MAAM;AAAA,UACvB,OAAO,MAAM;AAAA,UACb,UAAU,MAAM;AAAA,UAChB,cAAc,MAAM;AAAA,UACpB,QAAQ,MAAM;AAAA,UACd,cAAc,MAAM;AAAA,UACpB,QAAQ,MAAM;AAAA,UACd,OAAO,MAAM;AAAA,UACb,uBAAuB,MAAM;AAAA,UAC7B,cAAc,MAAM;AAAA,UACpB,UAAU,MAAM;AAAA,UAChB,gBAAgB,MAAM;AAAA,UACtB,4BAA4B,MAAM;AAAA,UAClC,OAAO,MAAM;AAAA,UACb,YAAY,MAAM;AAAA,UAClB,SAAS,MAAM;AAAA,UACf,eAAe,MAAM;AAAA,UACrB,yBAAyB,MAAM;AAAA,UAC/B,wBAAwB,MAAM;AAAA,UAC9B,iBAAiB,MAAM;AAAA,UACvB,gBAAgB,MAAM;AAAA,UACtB,OAAO,MAAM;AAAA,UACb,WAAW,MAAM;AAAA,UACjB,KAAK,MAAM;AAAA,UACX;AAAA,QACF,CAAC;AAAA,MACH,QAAQ;AAEN,eAAO,uBAAuB,OAAO,gBAAgB,WAAW;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AAEA,MAAI;AACF,UAAM,UAA4B;AAAA,MAChC,QAAQ,MAAM;AAAA,MACd;AAAA,MACA,gBAAgB;AAAA,IAClB;AAEA,QAAI,MAAM,QAAQ,OAAW,SAAQ,MAAM,MAAM;AACjD,QAAI,MAAM,iBAAiB,OAAW,SAAQ,eAAe,MAAM;AACnE,QAAI,MAAM,oBAAoB,OAAW,SAAQ,kBAAkB,MAAM;AACzE,QAAI,MAAM,aAAa,OAAW,SAAQ,WAAW,MAAM;AAC3D,QAAI,MAAM,UAAU,OAAW,SAAQ,QAAQ,MAAM;AACrD,QAAI,MAAM,iBAAiB,OAAW,SAAQ,eAAe,MAAM;AACnE,QAAI,MAAM,WAAW,OAAW,SAAQ,SAAS,MAAM;AACvD,QAAI,MAAM,WAAW,OAAW,SAAQ,SAAS,MAAM;AACvD,QAAI,MAAM,UAAU,OAAW,SAAQ,QAAQ,MAAM;AACrD,QAAI,MAAM,0BAA0B;AAClC,cAAQ,wBAAwB,MAAM;AACxC,QAAI,MAAM,iBAAiB,OAAW,SAAQ,eAAe,MAAM;AACnE,QAAI,MAAM,aAAa,OAAW,SAAQ,WAAW,MAAM;AAC3D,QAAI,MAAM,UAAU,OAAW,SAAQ,QAAQ,MAAM;AACrD,QAAI,MAAM,iBAAiB,OAAW,SAAQ,eAAe,MAAM;AACnE,QAAI,MAAM,mBAAmB,OAAW,SAAQ,iBAAiB,MAAM;AACvE,QAAI,MAAM,oBAAoB,OAAW,SAAQ,kBAAkB,MAAM;AACzE,QAAI,MAAM,+BAA+B;AACvC,cAAQ,6BAA6B,MAAM;AAC7C,QAAI,MAAM,UAAU,OAAW,SAAQ,QAAQ,MAAM;AACrD,QAAI,MAAM,eAAe;AACvB,cAAQ,aAAa,MAAM;AAC7B,QAAI,MAAM,YAAY,OAAW,SAAQ,UAAU,MAAM;AACzD,QAAI,MAAM,kBAAkB,OAAW,SAAQ,gBAAgB,MAAM;AACrE,QAAI,MAAM,4BAA4B;AACpC,cAAQ,0BAA0B,MAAM;AAC1C,QAAI,MAAM,2BAA2B;AACnC,cAAQ,yBAAyB,MAAM;AACzC,QAAI,MAAM,oBAAoB,OAAW,SAAQ,kBAAkB,MAAM;AACzE,QAAI,MAAM,mBAAmB,OAAW,SAAQ,iBAAiB,MAAM;AAAA,QAClE,SAAQ,iBAAiB;AAC9B,QAAI,MAAM,UAAU,OAAW,SAAQ,QAAQ,MAAM;AACrD,QAAI,MAAM,cAAc,OAAW,SAAQ,YAAY,MAAM;AAC7D,QAAI,MAAM,QAAQ,OAAW,SAAQ,MAAM,EAAE,GAAG,QAAQ,KAAK,GAAG,MAAM,IAAI;AAE1E,QAAI,4BAA4B,qBAAqB;AACnD,cAAQ,kCAAkC;AAAA,IAC5C;AAEA,QAAI,MAAM,aAAa;AACrB,cAAQ,cAAc;AAAA,IACxB;AAEA,qBAAiB,WAAWD,OAAM;AAAA,MAChC,QAAQ,MAAM;AAAA,MACd;AAAA,IACF,CAAC,GAAG;AACF,UAAI,QAAQ,SAAS,YAAY,QAAQ,YAAY,QAAQ;AAE3D,YAAI,QAAQ,mBAAmB,uBAAuB,CAAC,aAAa;AAClE,oBAAU;AACV,uBAAa,qDAAqC;AAClD,0BAAgB,MAAM;AACtB;AAAA,QACF;AAEA,YAAI,MAAM,aAAa;AACrB,yBAAe,QAAQ;AACvB,cAAI,iBAAiB,MAAM,aAAa,CAAC,eAAe,IAAI,YAAY,GAAG;AACzE,gBAAI;AACF,6BAAe,OAAO;AAAA,gBACpB,WAAW;AAAA,gBACX,KAAK,QAAQ;AAAA,gBACb,OAAO,QAAQ;AAAA,gBACf,gBAAgB;AAAA,gBAChB,cAAc,MAAM;AAAA,gBACpB,iBAAiB,MAAM;AAAA,gBACvB,OAAO,MAAM,SAAS,QAAQ;AAAA,gBAC9B,UAAU,MAAM;AAAA,gBAChB,cAAc,MAAM;AAAA,gBACpB,QAAQ,MAAM;AAAA,gBACd,cAAc,MAAM;AAAA,gBACpB,QAAQ,MAAM;AAAA,gBACd,OAAO,MAAM,SAAS,QAAQ;AAAA,gBAC9B,uBAAuB,MAAM;AAAA,gBAC7B,cAAc,MAAM;AAAA,gBACpB,UAAU,MAAM;AAAA,gBAChB,gBAAgB,MAAM;AAAA,gBACtB,4BAA4B,MAAM;AAAA,gBAClC,OAAO,MAAM;AAAA,gBACb,YAAY,MAAM;AAAA,gBAClB,SAAS,MAAM;AAAA,gBACf,eAAe,MAAM;AAAA,gBACrB,yBAAyB,MAAM;AAAA,gBAC/B,wBAAwB,MAAM;AAAA,gBAC9B,iBAAiB,MAAM;AAAA,gBACvB,gBAAgB,MAAM;AAAA,gBACtB,OAAO,MAAM;AAAA,gBACb,WAAW,MAAM;AAAA,gBACjB,KAAK,MAAM;AAAA,gBACX;AAAA,cACF,CAAC;AAAA,YACH,QAAQ;AAEN,wBAAU;AACV,2BAAa,2CAAgC;AAC7C,8BAAgB,MAAM;AACtB;AAAA,YACF;AAAA,UACF;AAAA,QACF,OAAO;AACL,yBAAe,OAAO,MAAM,WAAW;AAAA,YACrC,KAAK,QAAQ;AAAA,YACb,OAAO,QAAQ;AAAA,YACf,gBAAgB;AAAA,YAChB,OAAO,MAAM,SAAS,QAAQ;AAAA,YAC9B,OAAO,MAAM,SAAS,QAAQ;AAAA,UAChC,CAAC;AAAA,QACH;AAAA,MACF;AAEA,UAAI,QAAQ,SAAS,UAAU;AAC7B,YAAI,WAAY;AAChB,qBAAa;AAEb,cAAM,SAA2B;AACjC,qBAAa,OAAO;AACpB,wBAAgB,OAAO;AACvB,mBAAW,OAAO;AAClB,uBAAe,OAAO;AACtB,kBAAU,OAAO;AACjB,qBAAa,OAAO;AACpB,gBAAQ,OAAO;AACf,qBAAa,OAAO;AACpB,4BAAoB,OAAO;AAE3B,YAAI,OAAO,YAAY,WAAW;AAChC,uBAAa,OAAO;AACpB,6BAAmB,OAAO;AAAA,QAC5B,OAAO;AACL,oBAAU;AACV,yBAAe,OAAO;AACtB,uBACE,OAAO,OAAO,IAAI,MAAM,EAAE,KAAK,IAAI,KAAK,UAAU,OAAO,OAAO;AAAA,QACpE;AAEA;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,KAAc;AACrB,cAAU;AACV,UAAM,YACJ,gBAAgB,OAAO,WACvB,eAAeC,eACd,eAAe,SAAS,IAAI,SAAS;AACxC,QAAI,WAAW;AACb,mBAAa,WACT,iCAA2B,8BAA8B,MAAM,OAAO,QACtE,qCAA6B;AAAA,IACnC,OAAO;AACL,mBAAa,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,IAC9D;AAAA,EACF,UAAE;AACA,QAAI,UAAW,cAAa,SAAS;AAAA,EACvC;AAIA,MAAI,CAAC,cAAc,CAAC,WAAW,gBAAgB,OAAO,SAAS;AAC7D,cAAU;AACV,iBAAa,WACT,iCAA2B,8BAA8B,MAAM,OAAO,QACtE,qCAA6B;AAAA,EACnC;AAEA,MAAI,CAAC,cAAc,CAAC,SAAS;AAC3B,cAAU;AACV,mBAAe,gBAAgB;AAC/B,UAAM,cAAc,mCAA4B;AAChD,iBAAa,aAAa,GAAG,WAAW,cAAc,UAAU,KAAK;AAAA,EACvE;AAEA,QAAM,kBAAkB,MAAM,cAAc,eAAe,MAAM;AAMjE,QAAM,UAAU,eAAe,IAAI,eAAe;AAClD,MAAI,SAAS;AACX,UAAM,YAAY,MAAM,cAAc,YAAY,QAAQ,cAAc,KAAK;AAC7E,UAAM,WAAW,MAAM,cAAc,gBAAgB,QAAQ,gBAAgB,KAAK;AAClF,QAAI,QAAQ,WAAW,aAAa;AAClC,qBAAe,OAAO,iBAAiB;AAAA,QACrC,QAAQ,UAAU,UAAU;AAAA,QAC5B,YAAY;AAAA,QACZ,cAAc;AAAA,QACd,iBAAiB;AAAA,MACnB,CAAC;AAAA,IACH,OAAO;AACL,qBAAe,OAAO,iBAAiB;AAAA,QACrC,YAAY;AAAA,QACZ,cAAc;AAAA,QACd,iBAAiB;AAAA,MACnB,CAAC;AAAA,IACH;AACA,UAAM,UAAU,eAAe,IAAI,eAAe;AAClD,wBAAoB,SAAS;AAC7B,0BAAsB,SAAS;AAAA,EACjC;AAGA,MAAI,MAAM,eAAe,iBAAiB,MAAM,aAAa,CAAC,SAAS;AACrE,cAAU;AACV,UAAM,YAAY,mCAA4B;AAC9C,iBAAa,aAAa,GAAG,SAAS,cAAc,UAAU,KAAK;AAAA,EACrE;AAEA,SAAO;AAAA,IACL,WAAW;AAAA,IACX,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACtuBO,SAAS,yBACd,OACA,gBACe;AACf,QAAM,gBAAgB,CAAC,MACrB,MAAM,mBAAmB,eAAe,OAAO,CAAC,IAAI,eAAe,aAAa,CAAC;AAEnF,UAAQ,MAAM,QAAQ;AAAA,IACpB,KAAK,QAAQ;AACX,YAAM,WAAW,eAAe,KAAK,EAAE,IAAI,CAAC,MAAM,cAAc,CAAC,CAAC;AAClE,aAAO,EAAE,SAAS;AAAA,IACpB;AAAA,IAEA,KAAK,OAAO;AACV,UAAI,CAAC,MAAM,WAAW;AACpB,eAAO;AAAA,UACL,UAAU,CAAC;AAAA,UACX,SAAS,mDAAoC;AAAA,UAC7C,SAAS;AAAA,QACX;AAAA,MACF;AACA,YAAM,UAAU,eAAe,IAAI,MAAM,SAAS;AAClD,UAAI,CAAC,SAAS;AACZ,eAAO;AAAA,UACL,UAAU,CAAC;AAAA,UACX,SAAS,qDAAqC,eAAe,MAAM,SAAS;AAAA,UAC5E,SAAS;AAAA,QACX;AAAA,MACF;AACA,aAAO,EAAE,UAAU,CAAC,cAAc,OAAO,CAAC,EAAE;AAAA,IAC9C;AAAA,IAEA,KAAK,UAAU;AACb,UAAI,CAAC,MAAM,WAAW;AACpB,eAAO;AAAA,UACL,UAAU,CAAC;AAAA,UACX,SAAS,mDAAoC;AAAA,UAC7C,SAAS;AAAA,QACX;AAAA,MACF;AACA,YAAM,YAAY,eAAe,OAAO,MAAM,SAAS;AACvD,UAAI,CAAC,WAAW;AACd,cAAM,UAAU,eAAe,IAAI,MAAM,SAAS;AAClD,YAAI,CAAC,SAAS;AACZ,iBAAO;AAAA,YACL,UAAU,CAAC;AAAA,YACX,SAAS,qDAAqC,eAAe,MAAM,SAAS;AAAA,YAC5E,SAAS;AAAA,UACX;AAAA,QACF;AACA,eAAO;AAAA,UACL,UAAU,CAAC,cAAc,OAAO,CAAC;AAAA,UACjC,SAAS,mDAAoC,eAAe,MAAM,SAAS,6BAA6B,QAAQ,MAAM;AAAA,UACtH,SAAS;AAAA,QACX;AAAA,MACF;AACA,YAAM,UAAU,eAAe,IAAI,MAAM,SAAS;AAClD,aAAO;AAAA,QACL,UAAU,UAAU,CAAC,cAAc,OAAO,CAAC,IAAI,CAAC;AAAA,QAChD,SAAS,YAAY,MAAM,SAAS;AAAA,MACtC;AAAA,IACF;AAAA,IAEA;AACE,aAAO;AAAA,QACL,UAAU,CAAC;AAAA,QACX,SAAS,mDAAoC,sBAAsB,MAAM,MAAM;AAAA,QAC/E,SAAS;AAAA,MACX;AAAA,EACJ;AACF;;;ACzEO,SAAS,2BACd,OACA,QACiB;AACjB,UAAQ,MAAM,QAAQ;AAAA,IACpB,KAAK;AACH,aAAO,eAAe,IAAI;AAC1B,aAAO;AAAA,QACL,aAAa;AAAA,QACb,SAAS;AAAA,MACX;AAAA,IAEF,KAAK;AACH,aAAO,eAAe,KAAK;AAC3B,aAAO;AAAA,QACL,aAAa;AAAA,QACb,SAAS;AAAA,MACX;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,aAAa,OAAO,eAAe;AAAA,QACnC,SAAS,qCAAqC,OAAO,eAAe,IAAI,YAAY,UAAU;AAAA,MAChG;AAAA,IAEF;AACE,aAAO;AAAA,QACL,aAAa,OAAO,eAAe;AAAA,QACnC,SAAS,mDAAoC,sBAAsB,MAAM,MAAM;AAAA,QAC/E,SAAS;AAAA,MACX;AAAA,EACJ;AACF;;;AN5BA,IAAM,iBAAiB,OAAyC,UAAkB;AAO3E,SAAS,aAAa,WAAmB,MAAiC;AAC/E,QAAM,mBAAmB,CAAC,UAAkD;AAC1E,QAAI,UAAU,UAAa,MAAM,KAAK,MAAM,GAAI,QAAO;AACvD,UAAM,SAAS,OAAO,SAAS,OAAO,EAAE;AACxC,QAAI,CAAC,OAAO,SAAS,MAAM,KAAK,UAAU,EAAG,QAAO;AACpD,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiB,IAAI,eAAe;AAAA,IACxC,cAAc,iBAAiB,QAAQ,IAAI,8BAA8B;AAAA,IACzE,qBAAqB,iBAAiB,QAAQ,IAAI,sCAAsC;AAAA,IACxF,mBAAmB,iBAAiB,QAAQ,IAAI,mCAAmC;AAAA,EACrF,CAAC;AACD,MAAI,cAAc,MAAM,eAAe;AAEvC,QAAM,SAAS;AAAA,IACb,gBAAgB,MAAM;AAAA,IACtB,gBAAgB,CAAC,MAAe;AAC9B,oBAAc;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,SAAS,IAAI,UAAU;AAAA,IAC3B,MAAM;AAAA,IACN,SAAS;AAAA,EACX,CAAC;AAGD,SAAO;AAAA,IACL;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA,IAKA;AAAA,MACE,QAAQ,EAAE,OAAO,EAAE,SAAS,sCAAsC;AAAA,MAClE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,4CAA4C;AAAA,MAChF,cAAc,EACX,MAAM,EAAE,OAAO,CAAC,EAChB,SAAS,EACT;AAAA,QACC;AAAA,MACF;AAAA,MACF,iBAAiB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,gBAAgB;AAAA,MACzE,OAAO,EACJ,MAAM;AAAA,QACL,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,QAClB,EAAE,OAAO;AAAA,UACP,MAAM,EAAE,QAAQ,QAAQ;AAAA,UACxB,QAAQ,EAAE,QAAQ,aAAa;AAAA,QACjC,CAAC;AAAA,MACH,CAAC,EACA,SAAS,EACT,SAAS,yDAAyD;AAAA,MACrE,gBAAgB,EACb,QAAQ,EACR,SAAS,EACT;AAAA,QACC;AAAA,MACF;AAAA,MACF,gBAAgB,EACb,KAAK,gBAAgB,EACrB,SAAS,EACT,SAAS,iCAAiC;AAAA,MAC7C,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,uBAAuB;AAAA,MACjF,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,iDAAiD;AAAA,MACvF,cAAc,EACX,MAAM;AAAA,QACL,EAAE,OAAO;AAAA,QACT,EAAE,OAAO;AAAA,UACP,MAAM,EAAE,QAAQ,QAAQ;AAAA,UACxB,QAAQ,EAAE,QAAQ,aAAa;AAAA,UAC/B,QAAQ,EACL,OAAO,EACP,SAAS,EACT,SAAS,iDAAiD;AAAA,QAC/D,CAAC;AAAA,MACH,CAAC,EACA,SAAS,EACT,SAAS,8DAA8D;AAAA,MAC1E,QAAQ,EACL;AAAA,QACC,EAAE,OAAO;AAAA,QACT,EAAE,OAAO;AAAA,UACP,aAAa,EAAE,OAAO;AAAA,UACtB,QAAQ,EAAE,OAAO;AAAA,UACjB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,UACpC,iBAAiB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,UAC9C,OAAO,EAAE,KAAK,YAAY,EAAE,SAAS;AAAA,UACrC,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,UAC/C,YAAY,EACT,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,EAC9D,SAAS;AAAA,UACZ,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,UACrC,qCAAqC,EAAE,OAAO,EAAE,SAAS;AAAA,QAC3D,CAAC;AAAA,MACH,EACC,SAAS,EACT,SAAS,6BAA6B;AAAA,MACzC,cAAc,EACX,OAAO,EACP,SAAS,EACT,SAAS,EACT,SAAS,wCAAwC;AAAA,MACpD,QAAQ,EACL,KAAK,aAAa,EAClB,SAAS,EACT;AAAA,QACC;AAAA,MACF;AAAA,MACF,OAAO,EACJ,MAAM,EAAE,OAAO,CAAC,EAChB,SAAS,EACT,SAAS,0DAA0D;AAAA,MACtE,uBAAuB,EACpB,MAAM,EAAE,OAAO,CAAC,EAChB,SAAS,EACT,SAAS,wDAAwD;AAAA,MACpE,cAAc,EACX,OAAO;AAAA,QACN,MAAM,EAAE,QAAQ,aAAa;AAAA,QAC7B,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,SAAS,mCAAmC;AAAA,MACxF,CAAC,EACA,SAAS,EACT,SAAS,wEAAwE;AAAA,MACpF,UAAU,EACP,MAAM;AAAA,QACL,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,UAAU,EAAE,CAAC;AAAA,QACxC,EAAE,OAAO;AAAA,UACP,MAAM,EAAE,QAAQ,SAAS;AAAA,UACzB,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,2BAA2B;AAAA,QAChF,CAAC;AAAA,QACD,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,UAAU,EAAE,CAAC;AAAA,MAC1C,CAAC,EACA,SAAS,EACT,SAAS,0EAA0E;AAAA,MACtF,SAAS,EACN,OAAO,EACP,IAAI,EACJ,SAAS,EACT,SAAS,EACT,SAAS,0CAA0C;AAAA,MACtD,4BAA4B,EACzB,OAAO,EACP,SAAS,EACT,SAAS,oCAAoC;AAAA,MAChD,OAAO,EACJ,OAAO,EACP,SAAS,EACT;AAAA,QACC;AAAA,MACF;AAAA,MACF,YAAY,EACT,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,CAAC,EACpD,SAAS,EACT,SAAS,oEAAoE;AAAA,MAChF,SAAS,EACN,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAC9B,SAAS,EACT,SAAS,kDAAkD;AAAA,MAC9D,eAAe,EACZ,OAAO,EACP,SAAS,EACT,SAAS,6DAA6D;AAAA,MACzE,yBAAyB,EACtB,QAAQ,EACR,SAAS,EACT,SAAS,oEAAoE;AAAA,MAChF,wBAAwB,EACrB,QAAQ,EACR,SAAS,EACT,SAAS,oDAAoD;AAAA,MAChE,iBAAiB,EACd,QAAQ,EACR,SAAS,EACT,SAAS,wDAAwD;AAAA,MACpE,gBAAgB,EACb,MAAM,EAAE,KAAK,CAAC,QAAQ,WAAW,OAAO,CAAC,CAAC,EAC1C,SAAS,EACT;AAAA,QACC;AAAA,MACF;AAAA,MACF,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,uCAAuC;AAAA,MAC9E,WAAW,EACR,OAAO,EACP,SAAS,EACT,SAAS,0EAA0E;AAAA,MACtF,KAAK,EACF,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,EAAE,SAAS,CAAC,EACxC,SAAS,EACT,SAAS,4HAA4H;AAAA,IAC1I;AAAA,IACA,OAAO,SAAS;AACd,UAAI;AACF,cAAM,SAAS,MAAM,kBAAkB,MAAM,gBAAgB,WAAW,WAAW;AACnF,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,YACtC;AAAA,UACF;AAAA,UACA,SAAS,OAAO;AAAA,QAClB;AAAA,MACF,SAAS,KAAc;AACrB,cAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,mCAA4B,MAAM,OAAO;AAAA,YACjD;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,MACE,WAAW,EACR,OAAO,EACP,SAAS,+DAA+D;AAAA,MAC3E,QAAQ,EAAE,OAAO,EAAE,SAAS,iCAAiC;AAAA,MAC7D,aAAa,EACV,QAAQ,EACR,SAAS,EACT,SAAS,0DAA0D;AAAA,MACtE,SAAS,EACN,OAAO,EACP,IAAI,EACJ,SAAS,EACT,SAAS,EACT,SAAS,wCAAwC;AAAA;AAAA;AAAA,MAIpD,KAAK,EACF,OAAO,EACP,SAAS,EACT,SAAS,uEAAuE;AAAA,MACnF,cAAc,EACX,MAAM,EAAE,OAAO,CAAC,EAChB,SAAS,EACT,SAAS,yEAAyE;AAAA,MACrF,iBAAiB,EACd,MAAM,EAAE,OAAO,CAAC,EAChB,SAAS,EACT,SAAS,oEAAoE;AAAA,MAChF,OAAO,EACJ,MAAM;AAAA,QACL,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,QAClB,EAAE,OAAO;AAAA,UACP,MAAM,EAAE,QAAQ,QAAQ;AAAA,UACxB,QAAQ,EAAE,QAAQ,aAAa;AAAA,QACjC,CAAC;AAAA,MACH,CAAC,EACA,SAAS,EACT,SAAS,yDAAyD;AAAA,MACrE,gBAAgB,EACb,QAAQ,EACR,SAAS,EACT,SAAS,sEAAsE;AAAA,MAClF,gBAAgB,EACb,KAAK,gBAAgB,EACrB,SAAS,EACT,SAAS,qEAAqE;AAAA,MACjF,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,uBAAuB;AAAA,MACjF,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,iDAAiD;AAAA,MACvF,cAAc,EACX,MAAM;AAAA,QACL,EAAE,OAAO;AAAA,QACT,EAAE,OAAO;AAAA,UACP,MAAM,EAAE,QAAQ,QAAQ;AAAA,UACxB,QAAQ,EAAE,QAAQ,aAAa;AAAA,UAC/B,QAAQ,EACL,OAAO,EACP,SAAS,EACT,SAAS,iDAAiD;AAAA,QAC/D,CAAC;AAAA,MACH,CAAC,EACA,SAAS,EACT,SAAS,8DAA8D;AAAA,MAC1E,QAAQ,EACL;AAAA,QACC,EAAE,OAAO;AAAA,QACT,EAAE,OAAO;AAAA,UACP,aAAa,EAAE,OAAO;AAAA,UACtB,QAAQ,EAAE,OAAO;AAAA,UACjB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,UACpC,iBAAiB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,UAC9C,OAAO,EAAE,KAAK,YAAY,EAAE,SAAS;AAAA,UACrC,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,UAC/C,YAAY,EACT,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,EAC9D,SAAS;AAAA,UACZ,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,UACrC,qCAAqC,EAAE,OAAO,EAAE,SAAS;AAAA,QAC3D,CAAC;AAAA,MACH,EACC,SAAS,EACT,SAAS,6BAA6B;AAAA,MACzC,cAAc,EACX,OAAO,EACP,SAAS,EACT,SAAS,EACT,SAAS,sCAAsC;AAAA,MAClD,QAAQ,EACL,KAAK,aAAa,EAClB,SAAS,EACT;AAAA,QACC;AAAA,MACF;AAAA,MACF,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,yBAAyB;AAAA,MACxE,uBAAuB,EACpB,MAAM,EAAE,OAAO,CAAC,EAChB,SAAS,EACT,SAAS,wDAAwD;AAAA,MACpE,cAAc,EACX,OAAO;AAAA,QACN,MAAM,EAAE,QAAQ,aAAa;AAAA,QAC7B,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,SAAS,mCAAmC;AAAA,MACxF,CAAC,EACA,SAAS,EACT,SAAS,wEAAwE;AAAA,MACpF,UAAU,EACP,MAAM;AAAA,QACL,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,UAAU,EAAE,CAAC;AAAA,QACxC,EAAE,OAAO;AAAA,UACP,MAAM,EAAE,QAAQ,SAAS;AAAA,UACzB,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,2BAA2B;AAAA,QAChF,CAAC;AAAA,QACD,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,UAAU,EAAE,CAAC;AAAA,MAC1C,CAAC,EACA,SAAS,EACT,SAAS,0EAA0E;AAAA,MACtF,iBAAiB,EACd,OAAO,EACP,SAAS,EACT,SAAS,4EAA4E;AAAA,MACxF,4BAA4B,EACzB,OAAO,EACP,SAAS,EACT,SAAS,oCAAoC;AAAA,MAChD,OAAO,EACJ,OAAO,EACP,SAAS,EACT;AAAA,QACC;AAAA,MACF;AAAA,MACF,YAAY,EACT,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,CAAC,EACpD,SAAS,EACT,SAAS,oEAAoE;AAAA,MAChF,SAAS,EACN,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAC9B,SAAS,EACT,SAAS,kDAAkD;AAAA,MAC9D,eAAe,EACZ,OAAO,EACP,SAAS,EACT,SAAS,6DAA6D;AAAA,MACzE,yBAAyB,EACtB,QAAQ,EACR,SAAS,EACT,SAAS,oEAAoE;AAAA,MAChF,wBAAwB,EACrB,QAAQ,EACR,SAAS,EACT,SAAS,oDAAoD;AAAA,MAChE,iBAAiB,EACd,QAAQ,EACR,SAAS,EACT,SAAS,wDAAwD;AAAA,MACpE,gBAAgB,EACb,MAAM,EAAE,KAAK,CAAC,QAAQ,WAAW,OAAO,CAAC,CAAC,EAC1C,SAAS,EACT;AAAA,QACC;AAAA,MACF;AAAA,MACF,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,uCAAuC;AAAA,MAC9E,WAAW,EACR,OAAO,EACP,SAAS,EACT,SAAS,0EAA0E;AAAA,MACtF,KAAK,EACF,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,EAAE,SAAS,CAAC,EACxC,SAAS,EACT,SAAS,4HAA4H;AAAA,IAC1I;AAAA,IACA,OAAO,SAAS;AACd,UAAI;AACF,cAAM,SAAS,MAAM,uBAAuB,MAAM,gBAAgB,WAAW;AAC7E,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,YACtC;AAAA,UACF;AAAA,UACA,SAAS,OAAO;AAAA,QAClB;AAAA,MACF,SAAS,KAAc;AACrB,cAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,mCAA4B,MAAM,OAAO;AAAA,YACjD;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,QAAQ,EAAE,KAAK,eAAe,EAAE,SAAS,+CAA+C;AAAA,MACxF,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,8CAA8C;AAAA,MACxF,kBAAkB,EACf,QAAQ,EACR,SAAS,EACT;AAAA,QACC;AAAA,MACF;AAAA,IACJ;AAAA,IACA,OAAO,SAAS;AACd,YAAM,iBAAiB,QAAQ,IAAI,oDAAoD;AACvF,UAAI,KAAK,oBAAoB,CAAC,gBAAgB;AAC5C,cAAMC,UAAS;AAAA,UACb,UAAU,CAAC;AAAA,UACX,SAAS,qDAAqC;AAAA,UAC9C,SAAS;AAAA,QACX;AACA,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,KAAK,UAAUA,SAAQ,MAAM,CAAC;AAAA,YACtC;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AACA,YAAM,SAAS,yBAAyB,MAAM,cAAc;AAC5D,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UACtC;AAAA,QACF;AAAA,QACA,SAAS,OAAO,WAAW;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,MACE,QAAQ,EAAE,KAAK,iBAAiB,EAAE,SAAS,iCAAiC;AAAA,IAC9E;AAAA,IACA,OAAO,SAAS;AACd,YAAM,SAAS,2BAA2B,MAAM,MAAM;AACtD,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UACtC;AAAA,QACF;AAAA,QACA,SAAS,OAAO,WAAW;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAGA,QAAM,gBAAgB,OAAO,MAAM,KAAK,MAAM;AAC9C,SAAO,QAAQ,YAAY;AACzB,mBAAe,QAAQ;AACvB,UAAM,cAAc;AAAA,EACtB;AAEA,SAAO;AACT;;;ADpgBA,eAAe,OAAsB;AACnC,QAAM,YAAY,QAAQ,IAAI;AAC9B,QAAM,SAAS,aAAa,SAAS;AACrC,QAAM,YAAY,IAAI,qBAAqB;AAG3C,MAAI,UAAU;AACd,QAAM,WAAW,YAAY;AAC3B,QAAI,QAAS;AACb,cAAU;AACV,QAAI;AACF,YAAM,OAAO,MAAM;AAAA,IACrB,QAAQ;AAAA,IAER;AAEA,YAAQ,WAAW;AACnB,eAAW,MAAM,QAAQ,KAAK,CAAC,GAAG,GAAG;AAAA,EACvC;AACA,UAAQ,GAAG,UAAU,QAAQ;AAC7B,UAAQ,GAAG,WAAW,QAAQ;AAE9B,QAAM,OAAO,QAAQ,SAAS;AAG9B,UAAQ,MAAM,wCAAwC,SAAS,GAAG;AACpE;AAEA,KAAK,EAAE,MAAM,CAAC,QAAQ;AACpB,UAAQ,MAAM,gBAAgB,GAAG;AACjC,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["query","AbortError","query","AbortError","result"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@leo000001/claude-code-mcp",
3
- "version": "1.2.0",
3
+ "version": "1.3.0",
4
4
  "description": "MCP server that wraps Claude Code (Claude Agent SDK) as tools for any MCP client",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",