@leo000001/claude-code-mcp 1.4.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Changelog
2
2
 
3
- ## 1.1.0 (2026-02-11)
3
+ ## 1.4.0 (2026-02-11)
4
4
 
5
5
  ### Features
6
6
  - New tool: `claude_code_configure` for runtime bypass mode management (enable/disable without restart)
package/README.md CHANGED
@@ -1,17 +1,19 @@
1
1
  # claude-code-mcp
2
2
 
3
+ [![npm version](https://img.shields.io/npm/v/@leo000001/claude-code-mcp.svg)](https://www.npmjs.com/package/@leo000001/claude-code-mcp)
4
+ [![license](https://img.shields.io/npm/l/@leo000001/claude-code-mcp.svg)](https://github.com/xihuai18/claude-code-mcp/blob/main/LICENSE)
5
+ [![node](https://img.shields.io/node/v/@leo000001/claude-code-mcp.svg)](https://nodejs.org)
6
+
3
7
  MCP server that wraps [Claude Code (Claude Agent SDK)](https://docs.anthropic.com/en/docs/claude-code/overview) as tools, enabling any MCP client to invoke Claude Code for autonomous coding tasks.
4
8
 
5
9
  Inspired by the [Codex MCP](https://developers.openai.com/codex/guides/agents-sdk/) design philosophy — minimum tools, maximum capability.
6
10
 
7
- **npm package:** [@leo000001/claude-code-mcp](https://www.npmjs.com/package/@leo000001/claude-code-mcp)
8
-
9
11
  ## Features
10
12
 
11
13
  - **4 tools** covering the full agent lifecycle: start, continue, manage, configure
12
14
  - **Session management** with resume and fork support
13
15
  - **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
14
- - **Fine-grained permissions** — tool whitelist/blacklist, permission modes
16
+ - **Fine-grained permissions** — tool allow/deny lists, permission modes
15
17
  - **Custom subagents** — define specialized agents per session
16
18
  - **Cost tracking** — per-session turn and cost accounting
17
19
  - **Session cancellation** via AbortController
@@ -20,6 +22,8 @@ Inspired by the [Codex MCP](https://developers.openai.com/codex/guides/agents-sd
20
22
 
21
23
  ## Prerequisites
22
24
 
25
+ - **Node.js >= 18** is required.
26
+
23
27
  This MCP server uses the [`@anthropic-ai/claude-agent-sdk`](https://www.npmjs.com/package/@anthropic-ai/claude-agent-sdk) package, which **bundles its own Claude Code CLI** (`cli.js`). It does not use the `claude` binary from your system PATH.
24
28
 
25
29
  - The SDK's bundled CLI version is determined by the SDK package version (e.g. SDK 0.2.38 = Claude Code 2.1.38)
@@ -33,6 +37,12 @@ This MCP server uses the [`@anthropic-ai/claude-agent-sdk`](https://www.npmjs.co
33
37
 
34
38
  ### As an MCP server (recommended)
35
39
 
40
+ Install globally or use `npx` (no install needed):
41
+
42
+ ```bash
43
+ npm install -g @leo000001/claude-code-mcp
44
+ ```
45
+
36
46
  Add to your MCP client configuration (Claude Desktop, Cursor, etc.):
37
47
 
38
48
  ```json
@@ -40,7 +50,7 @@ Add to your MCP client configuration (Claude Desktop, Cursor, etc.):
40
50
  "mcpServers": {
41
51
  "claude-code": {
42
52
  "command": "npx",
43
- "args": ["@leo000001/claude-code-mcp"]
53
+ "args": ["-y", "@leo000001/claude-code-mcp"]
44
54
  }
45
55
  }
46
56
  }
@@ -76,21 +86,21 @@ npm start
76
86
 
77
87
  ### `claude_code` — Start a new session
78
88
 
79
- Start a Claude Code agent that can read/write files, run commands, and more.
89
+ Start a new Claude Code session. The agent autonomously performs coding tasks: reading/writing files, running shell commands, searching code, managing git, and interacting with APIs.
80
90
 
81
91
  | Parameter | Type | Required | Description |
82
92
  | ---------------------------- | ------------------ | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
83
93
  | `prompt` | string | Yes | Task or question for Claude Code |
84
94
  | `cwd` | string | No | Working directory (defaults to server cwd) |
85
- | `allowedTools` | string[] | No | Auto-approved tools (skips permission prompts). In `"dontAsk"` mode this effectively acts as a whitelist |
86
- | `disallowedTools` | string[] | No | Tool blacklist |
87
- | `tools` | string[] \| object | No | Base set of available tools (array of names, or `{ type: "preset", preset: "claude_code" }`) |
95
+ | `allowedTools` | string[] | No | List of tool names the agent can use without permission prompts. In `"dontAsk"` mode, only tools in this list are available. Example: `["Bash", "Read", "Write", "Edit"]` |
96
+ | `disallowedTools` | string[] | No | List of tool names the agent is forbidden from using. Takes precedence over `allowedTools` |
97
+ | `tools` | string[] \| object | No | Define the base tool set. Array of tool name strings, or `{ type: "preset", preset: "claude_code" }` for the default toolset. `allowedTools`/`disallowedTools` further filter on top of this |
88
98
  | `persistSession` | boolean | No | Persist session history to disk (`~/.claude/projects/`). Default: `true`. Set `false` to disable. |
89
- | `permissionMode` | string | No | Defaults to `"dontAsk"`. Options: `"default"`, `"acceptEdits"`, `"bypassPermissions"`, `"plan"`, `"delegate"`, `"dontAsk"` |
90
- | `maxTurns` | number | No | Maximum agentic turns |
99
+ | `permissionMode` | string | No | Controls how the agent handles tool permissions. Defaults to `"dontAsk"`. Options: `"default"`, `"acceptEdits"`, `"bypassPermissions"`, `"plan"`, `"delegate"`, `"dontAsk"` |
100
+ | `maxTurns` | number | No | Maximum number of agent reasoning steps. Each step may involve one or more tool calls |
91
101
  | `model` | string | No | Model to use (e.g. `"claude-sonnet-4-5-20250929"`) |
92
- | `systemPrompt` | string \| object | No | Custom system prompt (string or `{ type: "preset", preset: "claude_code", append?: "..." }`) |
93
- | `agents` | object | No | Custom subagent definitions |
102
+ | `systemPrompt` | string \| object | No | Override the agent's system prompt. Pass a string for full replacement, or `{ type: "preset", preset: "claude_code", append?: "..." }` to extend the default prompt |
103
+ | `agents` | object | No | Define custom sub-agents the main agent can delegate tasks to. Each key is the agent name; value specifies prompt, tools, model, etc. |
94
104
  | `maxBudgetUsd` | number | No | Maximum budget in USD |
95
105
  | `timeout` | number | No | Timeout in milliseconds for this session |
96
106
  | `effort` | string | No | Effort level: `"low"`, `"medium"`, `"high"`, `"max"` |
@@ -99,12 +109,12 @@ Start a Claude Code agent that can read/write files, run commands, and more.
99
109
  | `outputFormat` | object | No | Structured output: `{ type: "json_schema", schema: {...} }`. Omit for plain text |
100
110
  | `thinking` | object | No | Thinking mode: `{ type: "adaptive" }`, `{ type: "enabled", budgetTokens: N }`, or `{ type: "disabled" }` |
101
111
  | `pathToClaudeCodeExecutable` | string | No | Path to a custom Claude Code executable |
102
- | `agent` | string | No | Main-thread agent name to apply custom agent system prompt, tool restrictions, and model |
112
+ | `agent` | string | No | Name of a custom agent (defined in `agents`) to use as the primary agent, applying its system prompt, tool restrictions, and model |
103
113
  | `mcpServers` | object | No | MCP server configurations (key: server name, value: server config) |
104
- | `sandbox` | object | No | Sandbox settings for command execution isolation |
114
+ | `sandbox` | object | No | Sandbox configuration for isolating shell command execution (e.g., Docker container settings) |
105
115
  | `fallbackModel` | string | No | Fallback model if the primary model fails or is unavailable |
106
116
  | `enableFileCheckpointing` | boolean | No | Enable file checkpointing to track file changes during the session |
107
- | `includePartialMessages` | boolean | No | Include partial/streaming message events in output |
117
+ | `includePartialMessages` | boolean | No | When true, includes intermediate streaming messages in the response. Useful for real-time progress monitoring. Default: false |
108
118
  | `strictMcpConfig` | boolean | No | Enforce strict validation of MCP server configurations |
109
119
  | `settingSources` | string[] | No | Which filesystem settings to load. Defaults to `["user", "project", "local"]` (loads all settings and CLAUDE.md). Pass `[]` for SDK isolation mode |
110
120
  | `debug` | boolean | No | Enable debug mode for verbose logging |
@@ -115,13 +125,13 @@ Start a Claude Code agent that can read/write files, run commands, and more.
115
125
 
116
126
  ### `claude_code_reply` — Continue a session
117
127
 
118
- Continue an existing session with full context preserved.
128
+ Continue an existing session by sending a follow-up message. The agent retains full context from previous turns including files read, code analysis, and conversation history.
119
129
 
120
130
  | Parameter | Type | Required | Description |
121
131
  | ------------- | ------- | -------- | --------------------------------------------- |
122
132
  | `sessionId` | string | Yes | Session ID from a previous `claude_code` call |
123
133
  | `prompt` | string | Yes | Follow-up prompt |
124
- | `forkSession` | boolean | No | Fork to a new session (preserves original) |
134
+ | `forkSession` | boolean | No | Create a branched copy of this session. The original remains unchanged; the new session diverges from this point |
125
135
  | `timeout` | number | No | Timeout in milliseconds for this reply |
126
136
 
127
137
  <details>
@@ -130,15 +140,15 @@ Continue an existing session with full context preserved.
130
140
  | Parameter | Type | Description |
131
141
  | ---------------------------- | ------------------ | --------------------------------------------------- |
132
142
  | `cwd` | string | Working directory |
133
- | `allowedTools` | string[] | Auto-approved tools |
134
- | `disallowedTools` | string[] | Tool blacklist |
135
- | `tools` | string[] \| object | Base set of available tools |
143
+ | `allowedTools` | string[] | Auto-approved tool names (see `claude_code` tool) |
144
+ | `disallowedTools` | string[] | Forbidden tool names (see `claude_code` tool) |
145
+ | `tools` | string[] \| object | Base tool set (see `claude_code` tool) |
136
146
  | `persistSession` | boolean | Persist session history to disk |
137
147
  | `permissionMode` | string | Permission mode |
138
- | `maxTurns` | number | Maximum agentic turns |
148
+ | `maxTurns` | number | Maximum number of agent reasoning steps |
139
149
  | `model` | string | Model to use |
140
- | `systemPrompt` | string \| object | Custom system prompt |
141
- | `agents` | object | Custom subagent definitions |
150
+ | `systemPrompt` | string \| object | Override the agent's system prompt |
151
+ | `agents` | object | Custom sub-agent definitions (see `claude_code`) |
142
152
  | `maxBudgetUsd` | number | Maximum budget in USD |
143
153
  | `effort` | string | Effort level |
144
154
  | `betas` | string[] | Beta features |
@@ -147,12 +157,12 @@ Continue an existing session with full context preserved.
147
157
  | `thinking` | object | Thinking mode |
148
158
  | `resumeSessionAt` | string | Resume up to a specific message UUID |
149
159
  | `pathToClaudeCodeExecutable` | string | Path to Claude Code executable |
150
- | `agent` | string | Main-thread agent name |
160
+ | `agent` | string | Primary agent name (see `claude_code` tool) |
151
161
  | `mcpServers` | object | MCP server configurations |
152
- | `sandbox` | object | Sandbox settings |
162
+ | `sandbox` | object | Sandbox config for command isolation |
153
163
  | `fallbackModel` | string | Fallback model |
154
164
  | `enableFileCheckpointing` | boolean | Enable file checkpointing |
155
- | `includePartialMessages` | boolean | Include partial message events |
165
+ | `includePartialMessages` | boolean | Include intermediate streaming messages |
156
166
  | `strictMcpConfig` | boolean | Strict MCP config validation |
157
167
  | `settingSources` | string[] | Which filesystem settings to load (defaults to all) |
158
168
  | `debug` | boolean | Debug mode |
@@ -236,7 +246,7 @@ For JSON-based MCP clients (Claude Desktop, Cursor, etc.):
236
246
  "mcpServers": {
237
247
  "claude-code": {
238
248
  "command": "npx",
239
- "args": ["@leo000001/claude-code-mcp"],
249
+ "args": ["-y", "@leo000001/claude-code-mcp"],
240
250
  "env": {
241
251
  "CLAUDE_CODE_GIT_BASH_PATH": "C:\\Program Files\\Git\\bin\\bash.exe"
242
252
  }
@@ -273,10 +283,64 @@ setx CLAUDE_CODE_GIT_BASH_PATH "C:\Program Files\Git\bin\bash.exe"
273
283
  - **`permissionMode` defaults to `"dontAsk"`** — the agent will deny any operation not pre-approved, avoiding interactive prompts that would hang in MCP context.
274
284
  - **`bypassPermissions` is disabled by default.** Use the `claude_code_configure` tool with action `enable_bypass` to enable it at runtime.
275
285
  - **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.
276
- - Use `tools` / `disallowedTools` to restrict the base set of tools the agent can use. Use `allowedTools` to auto-approve tools without prompting.
286
+ - Use `tools` / `disallowedTools` to restrict the base set of tools the agent can use. Use `allowedTools` to specify which tools are auto-approved without prompting.
277
287
  - `maxTurns` and `maxBudgetUsd` prevent runaway execution.
278
288
  - Sessions auto-expire after 30 minutes of inactivity.
279
289
 
290
+ ## Environment Variables
291
+
292
+ All environment variables are optional. They are set on the MCP server process (not on the Claude Code child process — for that, use the `env` tool parameter).
293
+
294
+ | Variable | Description | Default |
295
+ | --- | --- | --- |
296
+ | `CLAUDE_CODE_GIT_BASH_PATH` | Path to `bash.exe` on Windows (see [Windows Support](#windows-support)) | Auto-detected |
297
+ | `CLAUDE_CODE_MCP_ALLOW_DISK_RESUME` | Set to `1` to allow `claude_code_reply` to resume from on-disk transcripts when the in-memory session is missing | `0` (disabled) |
298
+ | `CLAUDE_CODE_MCP_ALLOW_SENSITIVE_SESSION_DETAILS` | Set to `1` to allow `claude_code_session` to return `cwd`, `systemPrompt`, `agents`, `additionalDirectories` | `0` (disabled) |
299
+ | `CLAUDE_CODE_MCP_SESSION_TTL_MS` | Idle session time-to-live in milliseconds | `1800000` (30 min) |
300
+ | `CLAUDE_CODE_MCP_RUNNING_SESSION_MAX_MS` | Maximum wall-clock time for a running session before forced cleanup | `14400000` (4 hr) |
301
+ | `CLAUDE_CODE_MCP_CLEANUP_INTERVAL_MS` | How often the cleanup timer runs | `60000` (1 min) |
302
+
303
+ ### How to configure
304
+
305
+ **JSON-based MCP clients** (Claude Desktop, Cursor, etc.) — add an `"env"` block:
306
+
307
+ ```json
308
+ {
309
+ "mcpServers": {
310
+ "claude-code": {
311
+ "command": "npx",
312
+ "args": ["-y", "@leo000001/claude-code-mcp"],
313
+ "env": {
314
+ "CLAUDE_CODE_MCP_ALLOW_DISK_RESUME": "1",
315
+ "CLAUDE_CODE_MCP_SESSION_TTL_MS": "3600000"
316
+ }
317
+ }
318
+ }
319
+ }
320
+ ```
321
+
322
+ **OpenAI Codex CLI** — add an `[mcp_servers.claude-code.env]` section in `~/.codex/config.toml`:
323
+
324
+ ```toml
325
+ [mcp_servers.claude-code]
326
+ command = "npx"
327
+ args = ["-y", "@leo000001/claude-code-mcp"]
328
+
329
+ [mcp_servers.claude-code.env]
330
+ CLAUDE_CODE_MCP_ALLOW_DISK_RESUME = "1"
331
+ CLAUDE_CODE_MCP_SESSION_TTL_MS = "3600000"
332
+ ```
333
+
334
+ **System-wide** — set via your shell profile or OS settings so all processes inherit them:
335
+
336
+ ```bash
337
+ # bash / zsh
338
+ export CLAUDE_CODE_MCP_ALLOW_DISK_RESUME=1
339
+
340
+ # PowerShell (permanent, requires new terminal)
341
+ setx CLAUDE_CODE_MCP_ALLOW_DISK_RESUME 1
342
+ ```
343
+
280
344
  ## Development
281
345
 
282
346
  ```bash
package/dist/index.js CHANGED
@@ -1170,7 +1170,7 @@ function executeClaudeCodeConfigure(input, config) {
1170
1170
  }
1171
1171
 
1172
1172
  // src/server.ts
1173
- var SERVER_VERSION = true ? "1.4.0" : "0.0.0-dev";
1173
+ var SERVER_VERSION = true ? "1.5.0" : "0.0.0-dev";
1174
1174
  function createServer(serverCwd, opts) {
1175
1175
  const parsePositiveInt = (value) => {
1176
1176
  if (value === void 0 || value.trim() === "") return void 0;
@@ -1196,30 +1196,36 @@ function createServer(serverCwd, opts) {
1196
1196
  });
1197
1197
  server.tool(
1198
1198
  "claude_code",
1199
- `Start a new Claude Code agent session to perform coding tasks autonomously.
1200
- The agent can read/write files, run commands, search code, and more.
1201
- Returns a sessionId for continuing the conversation later.
1202
- Permission mode defaults to "dontAsk" (non-interactive, safe for MCP).
1203
- By default, loads all local Claude settings (user, project, local) including CLAUDE.md for project context.`,
1199
+ `Start a new Claude Code session. The agent autonomously performs coding tasks: reading/writing files, running shell commands, searching code, managing git, and interacting with APIs.
1200
+ Returns a sessionId that can be passed to claude_code_reply for multi-turn conversations.
1201
+ Defaults: permissionMode="dontAsk" (auto-approves allowed tools without prompting), loads all local Claude settings (user, project, local) including CLAUDE.md.`,
1204
1202
  {
1205
1203
  prompt: z.string().describe("The task or question for Claude Code"),
1206
1204
  cwd: z.string().optional().describe("Working directory (defaults to server cwd)"),
1207
1205
  allowedTools: z.array(z.string()).optional().describe(
1208
- "Tools to auto-approve without prompting. In permissionMode='dontAsk', this effectively acts as a tool whitelist."
1206
+ "List of tool names the agent can use without permission prompts. In the default 'dontAsk' mode, only tools in this list are available. Example: ['Bash', 'Read', 'Write', 'Edit']"
1207
+ ),
1208
+ disallowedTools: z.array(z.string()).optional().describe(
1209
+ "List of tool names the agent is forbidden from using. Takes precedence over allowedTools."
1209
1210
  ),
1210
- disallowedTools: z.array(z.string()).optional().describe("Tool blacklist"),
1211
1211
  tools: z.union([
1212
1212
  z.array(z.string()),
1213
1213
  z.object({
1214
1214
  type: z.literal("preset"),
1215
1215
  preset: z.literal("claude_code")
1216
1216
  })
1217
- ]).optional().describe("Base set of available tools (array of names, or preset)"),
1217
+ ]).optional().describe(
1218
+ "Define the base tool set for the session. Pass an array of tool name strings, or use {type: 'preset', preset: 'claude_code'} for the default Claude Code toolset. allowedTools/disallowedTools further filter on top of this base set."
1219
+ ),
1218
1220
  persistSession: z.boolean().optional().describe(
1219
1221
  "Persist session history to disk (~/.claude/projects). Default: true. Set false to disable persistence."
1220
1222
  ),
1221
- permissionMode: z.enum(PERMISSION_MODES).optional().describe("Permission mode for the session"),
1222
- maxTurns: z.number().int().positive().optional().describe("Maximum agentic turns"),
1223
+ permissionMode: z.enum(PERMISSION_MODES).optional().describe(
1224
+ "Controls how the agent handles tool permissions. 'dontAsk' (default): auto-approve tools in allowedTools without prompting. 'bypassPermissions': skip all permission checks (requires enable_bypass via claude_code_configure). 'plan': require approval before executing."
1225
+ ),
1226
+ maxTurns: z.number().int().positive().optional().describe(
1227
+ "Maximum number of agent reasoning steps. Each step may involve one or more tool calls. Limits how many iterations the agent performs before stopping."
1228
+ ),
1223
1229
  model: z.string().optional().describe("Model to use, e.g. 'claude-sonnet-4-5-20250929'"),
1224
1230
  systemPrompt: z.union([
1225
1231
  z.string(),
@@ -1228,7 +1234,9 @@ By default, loads all local Claude settings (user, project, local) including CLA
1228
1234
  preset: z.literal("claude_code"),
1229
1235
  append: z.string().optional().describe("Additional instructions to append to the preset")
1230
1236
  })
1231
- ]).optional().describe("Custom system prompt (string or preset with optional append)"),
1237
+ ]).optional().describe(
1238
+ "Override the agent's system prompt. Pass a string for full replacement, or use {type: 'preset', preset: 'claude_code', append: '...'} to extend the default Claude Code prompt with additional instructions."
1239
+ ),
1232
1240
  agents: z.record(
1233
1241
  z.string(),
1234
1242
  z.object({
@@ -1242,7 +1250,9 @@ By default, loads all local Claude settings (user, project, local) including CLA
1242
1250
  skills: z.array(z.string()).optional(),
1243
1251
  criticalSystemReminder_EXPERIMENTAL: z.string().optional()
1244
1252
  })
1245
- ).optional().describe("Custom subagent definitions"),
1253
+ ).optional().describe(
1254
+ "Define custom sub-agents that the main agent can delegate tasks to. Each key is the agent name; the value specifies its system prompt, available tools, model, and other constraints."
1255
+ ),
1246
1256
  maxBudgetUsd: z.number().positive().optional().describe("Maximum budget in USD for this session"),
1247
1257
  effort: z.enum(EFFORT_LEVELS).optional().describe(
1248
1258
  "Effort level: 'low' (fast), 'medium' (balanced), 'high' (thorough), 'max' (maximum)"
@@ -1264,13 +1274,17 @@ By default, loads all local Claude settings (user, project, local) including CLA
1264
1274
  timeout: z.number().int().positive().optional().describe("Timeout in milliseconds for this session"),
1265
1275
  pathToClaudeCodeExecutable: z.string().optional().describe("Path to the Claude Code executable"),
1266
1276
  agent: z.string().optional().describe(
1267
- "Main-thread agent name to apply custom agent system prompt, tool restrictions, and model"
1277
+ "Name of a custom agent (defined in 'agents' parameter) to use as the primary agent for this session, applying its system prompt, tool restrictions, and model override."
1268
1278
  ),
1269
1279
  mcpServers: z.record(z.string(), z.record(z.string(), z.unknown())).optional().describe("MCP server configurations (key: server name, value: server config)"),
1270
- sandbox: z.record(z.string(), z.unknown()).optional().describe("Sandbox settings for command execution isolation"),
1280
+ sandbox: z.record(z.string(), z.unknown()).optional().describe(
1281
+ "Sandbox configuration for isolating shell command execution (e.g., Docker container settings). Controls the execution environment for Bash tool calls."
1282
+ ),
1271
1283
  fallbackModel: z.string().optional().describe("Fallback model if the primary model fails or is unavailable"),
1272
1284
  enableFileCheckpointing: z.boolean().optional().describe("Enable file checkpointing to track file changes during the session"),
1273
- includePartialMessages: z.boolean().optional().describe("Include partial/streaming message events in output"),
1285
+ includePartialMessages: z.boolean().optional().describe(
1286
+ "When true, includes intermediate streaming messages in the response (e.g., partial tool outputs as they arrive). Useful for real-time progress monitoring. Default: false."
1287
+ ),
1274
1288
  strictMcpConfig: z.boolean().optional().describe("Enforce strict validation of MCP server configurations"),
1275
1289
  settingSources: z.array(z.enum(["user", "project", "local"])).optional().describe(
1276
1290
  '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).'
@@ -1309,28 +1323,32 @@ By default, loads all local Claude settings (user, project, local) including CLA
1309
1323
  );
1310
1324
  server.tool(
1311
1325
  "claude_code_reply",
1312
- `Continue an existing Claude Code session with full context preserved.
1313
- Claude remembers all files read, analysis done, and conversation history.`,
1326
+ `Continue an existing Claude Code session by sending a follow-up message. The agent retains full context from previous turns including files read, code analysis, and conversation history. Requires a sessionId returned by a previous claude_code call.
1327
+ Note: When CLAUDE_CODE_MCP_ALLOW_DISK_RESUME=1 is set and the in-memory session has expired, the agent can resume from disk-persisted history. Parameters marked "(disk resume fallback)" are only used in this scenario to reconstruct the session.`,
1314
1328
  {
1315
1329
  sessionId: z.string().describe("The session ID to continue (from a previous claude_code call)"),
1316
1330
  prompt: z.string().describe("Follow-up prompt or instruction"),
1317
- forkSession: z.boolean().optional().describe("Fork to a new session (preserves original session state)"),
1331
+ forkSession: z.boolean().optional().describe(
1332
+ "Create a branched copy of this session. The original session remains unchanged; the new session starts with the same context but diverges from this point. Useful for exploring alternative approaches."
1333
+ ),
1318
1334
  timeout: z.number().int().positive().optional().describe("Timeout in milliseconds for this reply"),
1319
1335
  // Optional disk-resume overrides (only used when CLAUDE_CODE_MCP_ALLOW_DISK_RESUME=1
1320
1336
  // and the in-memory session metadata is missing)
1321
- cwd: z.string().optional().describe("Working directory (used only for disk resume when session is missing)"),
1322
- allowedTools: z.array(z.string()).optional().describe("Auto-approved tools (used only for disk resume when session is missing)"),
1323
- disallowedTools: z.array(z.string()).optional().describe("Tool blacklist (used only for disk resume when session is missing)"),
1337
+ cwd: z.string().optional().describe("Working directory (disk resume fallback)"),
1338
+ allowedTools: z.array(z.string()).optional().describe(
1339
+ "Auto-approved tool names (disk resume fallback). See claude_code tool for details."
1340
+ ),
1341
+ disallowedTools: z.array(z.string()).optional().describe("Forbidden tool names (disk resume fallback). See claude_code tool for details."),
1324
1342
  tools: z.union([
1325
1343
  z.array(z.string()),
1326
1344
  z.object({
1327
1345
  type: z.literal("preset"),
1328
1346
  preset: z.literal("claude_code")
1329
1347
  })
1330
- ]).optional().describe("Base set of available tools (array of names, or preset)"),
1348
+ ]).optional().describe("Base tool set (disk resume fallback). See claude_code tool for details."),
1331
1349
  persistSession: z.boolean().optional().describe("Persist session history to disk (~/.claude/projects). Default: true."),
1332
- permissionMode: z.enum(PERMISSION_MODES).optional().describe("Permission mode (used only for disk resume when session is missing)"),
1333
- maxTurns: z.number().int().positive().optional().describe("Maximum agentic turns"),
1350
+ permissionMode: z.enum(PERMISSION_MODES).optional().describe("Permission mode (disk resume fallback). See claude_code tool for details."),
1351
+ maxTurns: z.number().int().positive().optional().describe("Maximum number of agent reasoning steps for this reply."),
1334
1352
  model: z.string().optional().describe("Model to use, e.g. 'claude-sonnet-4-5-20250929'"),
1335
1353
  systemPrompt: z.union([
1336
1354
  z.string(),
@@ -1339,7 +1357,7 @@ By default, loads all local Claude settings (user, project, local) including CLA
1339
1357
  preset: z.literal("claude_code"),
1340
1358
  append: z.string().optional().describe("Additional instructions to append to the preset")
1341
1359
  })
1342
- ]).optional().describe("Custom system prompt (string or preset with optional append)"),
1360
+ ]).optional().describe("Override the agent's system prompt. See claude_code tool for details."),
1343
1361
  agents: z.record(
1344
1362
  z.string(),
1345
1363
  z.object({
@@ -1353,7 +1371,7 @@ By default, loads all local Claude settings (user, project, local) including CLA
1353
1371
  skills: z.array(z.string()).optional(),
1354
1372
  criticalSystemReminder_EXPERIMENTAL: z.string().optional()
1355
1373
  })
1356
- ).optional().describe("Custom subagent definitions"),
1374
+ ).optional().describe("Define custom sub-agents. See claude_code tool for details."),
1357
1375
  maxBudgetUsd: z.number().positive().optional().describe("Maximum budget in USD for this reply"),
1358
1376
  effort: z.enum(EFFORT_LEVELS).optional().describe(
1359
1377
  "Effort level: 'low' (fast), 'medium' (balanced), 'high' (thorough), 'max' (maximum)"
@@ -1372,16 +1390,22 @@ By default, loads all local Claude settings (user, project, local) including CLA
1372
1390
  }),
1373
1391
  z.object({ type: z.literal("disabled") })
1374
1392
  ]).optional().describe("Thinking mode: 'adaptive' (auto), 'enabled' (with budget), or 'disabled'"),
1375
- resumeSessionAt: z.string().optional().describe("Resume only up to and including a specific message UUID (disk resume only)"),
1393
+ resumeSessionAt: z.string().optional().describe(
1394
+ "Resume only up to and including a specific message UUID (disk resume fallback only)"
1395
+ ),
1376
1396
  pathToClaudeCodeExecutable: z.string().optional().describe("Path to the Claude Code executable"),
1377
1397
  agent: z.string().optional().describe(
1378
- "Main-thread agent name to apply custom agent system prompt, tool restrictions, and model"
1398
+ "Name of a custom agent (defined in 'agents') to use as the primary agent. See claude_code tool for details."
1379
1399
  ),
1380
1400
  mcpServers: z.record(z.string(), z.record(z.string(), z.unknown())).optional().describe("MCP server configurations (key: server name, value: server config)"),
1381
- sandbox: z.record(z.string(), z.unknown()).optional().describe("Sandbox settings for command execution isolation"),
1401
+ sandbox: z.record(z.string(), z.unknown()).optional().describe(
1402
+ "Sandbox configuration for isolating shell command execution. See claude_code tool for details."
1403
+ ),
1382
1404
  fallbackModel: z.string().optional().describe("Fallback model if the primary model fails or is unavailable"),
1383
1405
  enableFileCheckpointing: z.boolean().optional().describe("Enable file checkpointing to track file changes during the session"),
1384
- includePartialMessages: z.boolean().optional().describe("Include partial/streaming message events in output"),
1406
+ includePartialMessages: z.boolean().optional().describe(
1407
+ "When true, includes intermediate streaming messages in the response (e.g., partial tool outputs as they arrive). Useful for real-time progress monitoring. Default: false."
1408
+ ),
1385
1409
  strictMcpConfig: z.boolean().optional().describe("Enforce strict validation of MCP server configurations"),
1386
1410
  settingSources: z.array(z.enum(["user", "project", "local"])).optional().describe(
1387
1411
  '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).'
@@ -1420,12 +1444,12 @@ By default, loads all local Claude settings (user, project, local) including CLA
1420
1444
  );
1421
1445
  server.tool(
1422
1446
  "claude_code_session",
1423
- `Manage Claude Code sessions: list all sessions, get status of a specific session, or cancel a running session.`,
1447
+ `Manage Claude Code sessions. Actions: 'list' returns all sessions with status and metadata; 'get' returns detailed info for a specific session (requires sessionId); 'cancel' terminates a running session (requires sessionId).`,
1424
1448
  {
1425
1449
  action: z.enum(SESSION_ACTIONS).describe("Action to perform: 'list', 'get', or 'cancel'"),
1426
1450
  sessionId: z.string().optional().describe("Session ID (required for 'get' and 'cancel')"),
1427
1451
  includeSensitive: z.boolean().optional().describe(
1428
- "Include sensitive fields (cwd, systemPrompt, agents, additionalDirectories) in responses. Default: false"
1452
+ "When true, includes sensitive fields (cwd, systemPrompt, agents, additionalDirectories) in the response. Requires CLAUDE_CODE_MCP_ALLOW_SENSITIVE_SESSION_DETAILS=1 env var. Default: false."
1429
1453
  )
1430
1454
  },
1431
1455
  async (args) => {
@@ -1461,9 +1485,11 @@ By default, loads all local Claude settings (user, project, local) including CLA
1461
1485
  server.tool(
1462
1486
  "claude_code_configure",
1463
1487
  `Configure the Claude Code MCP server at runtime.
1464
- Actions: enable_bypass (allow bypassPermissions mode), disable_bypass, get_config.`,
1488
+ Actions: 'enable_bypass' allows sessions to use permissionMode='bypassPermissions' (skips all tool permission checks \u2014 use with caution); 'disable_bypass' revokes this ability; 'get_config' returns the current server configuration.`,
1465
1489
  {
1466
- action: z.enum(CONFIGURE_ACTIONS).describe("Configuration action to perform")
1490
+ action: z.enum(CONFIGURE_ACTIONS).describe(
1491
+ "Action to perform: 'enable_bypass' | 'disable_bypass' | 'get_config'. See tool description for details."
1492
+ )
1467
1493
  },
1468
1494
  async (args) => {
1469
1495
  const result = executeClaudeCodeConfigure(args, config);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/server.ts","../src/session/manager.ts","../src/tools/claude-code.ts","../src/types.ts","../src/utils/windows.ts","../src/tools/claude-code-reply.ts","../src/tools/claude-code-session.ts","../src/tools/claude-code-configure.ts"],"sourcesContent":["/**\n * claude-code-mcp - MCP server entry point\n *\n * Starts the MCP server with stdio transport.\n * Usage: npx claude-code-mcp\n */\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { createServer } from \"./server.js\";\nimport { checkWindowsBashAvailability } from \"./utils/windows.js\";\n\nasync function main(): Promise<void> {\n const serverCwd = process.cwd();\n const server = createServer(serverCwd);\n const transport = new StdioServerTransport();\n\n // Handle graceful shutdown (idempotent)\n let closing = false;\n const shutdown = async () => {\n if (closing) return;\n closing = true;\n try {\n await server.close();\n } catch {\n // Ignore close errors during shutdown\n }\n // Allow stdio to flush before exiting\n process.exitCode = 0;\n setTimeout(() => process.exit(0), 100);\n };\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n await server.connect(transport);\n\n // Check Windows bash.exe availability and warn early\n checkWindowsBashAvailability();\n\n // Log to stderr (stdout is used for MCP communication)\n console.error(`claude-code-mcp server started (cwd: ${serverCwd})`);\n}\n\nmain().catch((err) => {\n console.error(\"Fatal error:\", err);\n process.exit(1);\n});\n","/**\n * MCP Server definition - registers tools and handles requests\n */\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { SessionManager } from \"./session/manager.js\";\nimport { executeClaudeCode } from \"./tools/claude-code.js\";\nimport { executeClaudeCodeReply } from \"./tools/claude-code-reply.js\";\nimport { executeClaudeCodeSession } from \"./tools/claude-code-session.js\";\nimport { executeClaudeCodeConfigure } from \"./tools/claude-code-configure.js\";\nimport {\n PERMISSION_MODES,\n EFFORT_LEVELS,\n AGENT_MODELS,\n CONFIGURE_ACTIONS,\n SESSION_ACTIONS,\n ErrorCode,\n} from \"./types.js\";\n\ndeclare const __PKG_VERSION__: string;\nconst SERVER_VERSION = typeof __PKG_VERSION__ !== \"undefined\" ? __PKG_VERSION__ : \"0.0.0-dev\";\n\nexport interface ServerOptions {\n /** Allow bypassPermissions mode (default: false, can be enabled via claude_code_configure tool) */\n allowBypass?: boolean;\n}\n\nexport function createServer(serverCwd: string, opts?: ServerOptions): McpServer {\n const parsePositiveInt = (value: string | undefined): number | undefined => {\n if (value === undefined || value.trim() === \"\") return undefined;\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed) || parsed <= 0) return undefined;\n return parsed;\n };\n\n const sessionManager = new SessionManager({\n sessionTtlMs: parsePositiveInt(process.env.CLAUDE_CODE_MCP_SESSION_TTL_MS),\n runningSessionMaxMs: parsePositiveInt(process.env.CLAUDE_CODE_MCP_RUNNING_SESSION_MAX_MS),\n cleanupIntervalMs: parsePositiveInt(process.env.CLAUDE_CODE_MCP_CLEANUP_INTERVAL_MS),\n });\n let allowBypass = opts?.allowBypass ?? false;\n\n const config = {\n getAllowBypass: () => allowBypass,\n setAllowBypass: (v: boolean) => {\n allowBypass = v;\n },\n };\n\n const server = new McpServer({\n name: \"claude-code-mcp\",\n version: SERVER_VERSION,\n });\n\n // Tool 1: claude_code - Start a new agent session\n server.tool(\n \"claude_code\",\n `Start a new Claude Code 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(\n \"Environment variables to merge with process.env and pass to the Claude Code process (user-provided values take precedence)\"\n ),\n },\n async (args) => {\n try {\n const result = await executeClaudeCode(args, sessionManager, serverCwd, allowBypass);\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n isError: result.isError,\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error [${ErrorCode.INTERNAL}]: ${message}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // Tool 2: claude_code_reply - Continue an existing session\n server.tool(\n \"claude_code_reply\",\n `Continue an existing Claude Code session 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(\n \"Environment variables to merge with process.env and pass to the Claude Code process (user-provided values take precedence)\"\n ),\n },\n async (args) => {\n try {\n const result = await executeClaudeCodeReply(args, sessionManager, allowBypass);\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n isError: result.isError,\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error [${ErrorCode.INTERNAL}]: ${message}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // Tool 3: claude_code_session - Manage sessions\n server.tool(\n \"claude_code_session\",\n `Manage Claude Code sessions: 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 ?? \"dontAsk\",\n allowedTools: params.allowedTools,\n disallowedTools: params.disallowedTools,\n tools: params.tools,\n maxTurns: params.maxTurns,\n systemPrompt: params.systemPrompt,\n agents: params.agents,\n maxBudgetUsd: params.maxBudgetUsd,\n effort: params.effort,\n betas: params.betas,\n additionalDirectories: params.additionalDirectories,\n outputFormat: params.outputFormat,\n thinking: params.thinking,\n persistSession: params.persistSession,\n pathToClaudeCodeExecutable: params.pathToClaudeCodeExecutable,\n agent: params.agent,\n mcpServers: params.mcpServers,\n sandbox: params.sandbox,\n fallbackModel: params.fallbackModel,\n enableFileCheckpointing: params.enableFileCheckpointing,\n includePartialMessages: params.includePartialMessages,\n strictMcpConfig: params.strictMcpConfig,\n settingSources: params.settingSources,\n debug: params.debug,\n debugFile: params.debugFile,\n env: params.env,\n abortController: params.abortController,\n };\n this.sessions.set(params.sessionId, info);\n return info;\n }\n\n get(sessionId: string): SessionInfo | undefined {\n return this.sessions.get(sessionId);\n }\n\n list(): SessionInfo[] {\n return Array.from(this.sessions.values());\n }\n\n update(\n sessionId: string,\n patch: Partial<Omit<SessionInfo, \"sessionId\" | \"createdAt\" | \"lastActiveAt\">>\n ): SessionInfo | undefined {\n const info = this.sessions.get(sessionId);\n if (!info) return undefined;\n Object.assign(info, patch, { lastActiveAt: new Date().toISOString() });\n return info;\n }\n\n /**\n * Atomically transition a session from an expected status to \"running\".\n * Returns the session if successful, undefined if the session doesn't exist\n * or its current status doesn't match `expectedStatus`.\n */\n tryAcquire(\n sessionId: string,\n expectedStatus: SessionStatus,\n abortController: AbortController\n ): SessionInfo | undefined {\n if (expectedStatus !== \"idle\" && expectedStatus !== \"error\") return undefined;\n const info = this.sessions.get(sessionId);\n if (!info || info.status !== expectedStatus) return undefined;\n info.status = \"running\";\n info.abortController = abortController;\n info.lastActiveAt = new Date().toISOString();\n return info;\n }\n\n cancel(sessionId: string): boolean {\n const info = this.sessions.get(sessionId);\n if (!info) return false;\n if (info.status !== \"running\") return false;\n if (info.abortController) {\n info.abortController.abort();\n }\n info.status = \"cancelled\";\n info.lastActiveAt = new Date().toISOString();\n return true;\n }\n\n delete(sessionId: string): boolean {\n return this.sessions.delete(sessionId);\n }\n\n /** Remove sessions that have been idle for too long, or stuck running too long */\n private cleanup(): void {\n const now = Date.now();\n for (const [id, info] of this.sessions) {\n const lastActive = new Date(info.lastActiveAt).getTime();\n if (Number.isNaN(lastActive)) {\n // Invalid timestamp — remove the session\n this.sessions.delete(id);\n } else if (info.status === \"running\" && now - lastActive > this.runningSessionMaxMs) {\n // Stuck running session — abort and mark as error\n if (info.abortController) info.abortController.abort();\n info.status = \"error\";\n info.lastActiveAt = new Date().toISOString();\n } else if (info.status !== \"running\" && now - lastActive > this.sessionTtlMs) {\n this.sessions.delete(id);\n }\n }\n }\n\n /** 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\";\nimport { enhanceWindowsError } from \"../utils/windows.js\";\n\nexport interface ClaudeCodeInput {\n prompt: string;\n cwd?: string;\n allowedTools?: string[];\n disallowedTools?: string[];\n permissionMode?: PermissionMode;\n maxTurns?: number;\n model?: string;\n systemPrompt?: string | { type: \"preset\"; preset: \"claude_code\"; append?: string };\n agents?: Record<string, AgentDefinition>;\n maxBudgetUsd?: number;\n effort?: EffortLevel;\n betas?: string[];\n additionalDirectories?: string[];\n outputFormat?: { type: \"json_schema\"; schema: Record<string, unknown> };\n thinking?:\n | { type: \"adaptive\" }\n | { type: \"enabled\"; budgetTokens: number }\n | { type: \"disabled\" };\n tools?: string[] | { type: \"preset\"; preset: \"claude_code\" };\n persistSession?: boolean;\n pathToClaudeCodeExecutable?: string;\n timeout?: number;\n agent?: string;\n mcpServers?: Record<string, McpServerConfig>;\n sandbox?: SandboxSettings;\n fallbackModel?: string;\n enableFileCheckpointing?: boolean;\n includePartialMessages?: boolean;\n strictMcpConfig?: boolean;\n settingSources?: SettingSource[];\n debug?: boolean;\n debugFile?: string;\n env?: Record<string, string | undefined>;\n}\n\nexport async function executeClaudeCode(\n input: ClaudeCodeInput,\n sessionManager: SessionManager,\n serverCwd: string,\n allowBypass = false\n): Promise<AgentResult> {\n const cwd = input.cwd !== undefined ? input.cwd : serverCwd;\n\n if (typeof cwd !== \"string\" || cwd.trim() === \"\") {\n return {\n sessionId: \"\",\n result: `Error [${ErrorCode.INVALID_ARGUMENT}]: cwd must be a non-empty string.`,\n isError: true,\n durationMs: 0,\n numTurns: 0,\n totalCostUsd: 0,\n };\n }\n\n let sessionId = \"\";\n let resultText = \"\";\n let isError = false;\n let durationMs = 0;\n let durationApiMs: number | undefined;\n let numTurns = 0;\n let totalCostUsd = 0;\n let sessionTotalTurns: number | undefined;\n let sessionTotalCostUsd: number | undefined;\n let structuredOutput: unknown;\n let stopReason: string | null | undefined;\n let errorSubtype: string | undefined;\n let usage: Record<string, unknown> | undefined;\n let modelUsage: Record<string, unknown> | undefined;\n let permissionDenials: AgentResult[\"permissionDenials\"] | undefined;\n let seenResult = false;\n let timedOut = false;\n\n // Security: block bypassPermissions unless explicitly allowed\n if (input.permissionMode === \"bypassPermissions\" && !allowBypass) {\n return {\n sessionId: \"\",\n result: `Error [${ErrorCode.PERMISSION_DENIED}]: bypassPermissions is disabled on this server. Use the claude_code_configure tool with action 'enable_bypass' to enable it.`,\n isError: true,\n durationMs: 0,\n numTurns: 0,\n totalCostUsd: 0,\n };\n }\n\n const abortController = new AbortController();\n\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n try {\n if (input.timeout !== undefined) {\n timeoutId = setTimeout(() => {\n timedOut = true;\n abortController.abort();\n }, input.timeout);\n }\n\n // Build options for the Agent SDK query()\n // Default to \"dontAsk\" permission mode in MCP context (non-interactive)\n const effectivePermissionMode = input.permissionMode ?? \"dontAsk\";\n\n const options: Partial<Options> = {\n cwd,\n abortController,\n permissionMode: effectivePermissionMode,\n };\n\n if (input.allowedTools !== undefined) options.allowedTools = input.allowedTools;\n if (input.disallowedTools !== undefined) options.disallowedTools = input.disallowedTools;\n if (input.maxTurns !== undefined) options.maxTurns = input.maxTurns;\n if (input.model !== undefined) options.model = input.model;\n if (input.maxBudgetUsd !== undefined) options.maxBudgetUsd = input.maxBudgetUsd;\n if (input.agents !== undefined) options.agents = input.agents as Options[\"agents\"];\n if (input.effort !== undefined) options.effort = input.effort;\n if (input.betas !== undefined) options.betas = input.betas as Options[\"betas\"];\n if (input.additionalDirectories !== undefined)\n options.additionalDirectories = input.additionalDirectories;\n if (input.outputFormat !== undefined) options.outputFormat = input.outputFormat;\n if (input.thinking !== undefined) options.thinking = input.thinking;\n if (input.tools !== undefined) options.tools = input.tools;\n if (input.persistSession !== undefined) options.persistSession = input.persistSession;\n if (input.pathToClaudeCodeExecutable !== undefined)\n options.pathToClaudeCodeExecutable = input.pathToClaudeCodeExecutable;\n if (input.agent !== undefined) options.agent = input.agent;\n if (input.mcpServers !== undefined)\n options.mcpServers = input.mcpServers as Options[\"mcpServers\"];\n if (input.sandbox !== undefined) options.sandbox = input.sandbox;\n if (input.fallbackModel !== undefined) options.fallbackModel = input.fallbackModel;\n if (input.enableFileCheckpointing !== undefined)\n options.enableFileCheckpointing = input.enableFileCheckpointing;\n if (input.includePartialMessages !== undefined)\n options.includePartialMessages = input.includePartialMessages;\n if (input.strictMcpConfig !== undefined) options.strictMcpConfig = input.strictMcpConfig;\n if (input.settingSources !== undefined) options.settingSources = input.settingSources;\n else options.settingSources = DEFAULT_SETTING_SOURCES;\n if (input.debug !== undefined) options.debug = input.debug;\n if (input.debugFile !== undefined) options.debugFile = input.debugFile;\n if (input.env !== undefined) options.env = { ...process.env, ...input.env };\n\n if (effectivePermissionMode === \"bypassPermissions\") {\n options.allowDangerouslySkipPermissions = true;\n }\n\n if (input.systemPrompt !== undefined) options.systemPrompt = input.systemPrompt;\n\n // No placeholder session - we create the session only after receiving the init message\n for await (const message of query({\n prompt: input.prompt,\n options,\n })) {\n if (message.type === \"system\" && message.subtype === \"init\") {\n if (sessionId) continue;\n sessionId = message.session_id;\n sessionManager.create({\n sessionId,\n cwd,\n model: input.model,\n permissionMode: effectivePermissionMode,\n allowedTools: input.allowedTools,\n disallowedTools: input.disallowedTools,\n tools: input.tools,\n maxTurns: input.maxTurns,\n systemPrompt: input.systemPrompt,\n agents: input.agents as Record<string, AgentDefinition> | undefined,\n maxBudgetUsd: input.maxBudgetUsd,\n effort: input.effort,\n betas: input.betas,\n additionalDirectories: input.additionalDirectories,\n outputFormat: input.outputFormat,\n thinking: input.thinking,\n persistSession: input.persistSession,\n pathToClaudeCodeExecutable: input.pathToClaudeCodeExecutable,\n agent: input.agent,\n mcpServers: input.mcpServers,\n sandbox: input.sandbox,\n fallbackModel: input.fallbackModel,\n enableFileCheckpointing: input.enableFileCheckpointing,\n includePartialMessages: input.includePartialMessages,\n strictMcpConfig: input.strictMcpConfig,\n settingSources: input.settingSources ?? DEFAULT_SETTING_SOURCES,\n debug: input.debug,\n debugFile: input.debugFile,\n env: input.env,\n abortController,\n });\n }\n\n if (message.type === \"result\") {\n if (seenResult) continue;\n seenResult = true;\n\n const result: SDKResultMessage = message;\n durationMs = result.duration_ms;\n durationApiMs = result.duration_api_ms;\n numTurns = result.num_turns;\n totalCostUsd = result.total_cost_usd;\n isError = result.is_error;\n stopReason = result.stop_reason;\n usage = result.usage;\n modelUsage = result.modelUsage;\n permissionDenials = result.permission_denials;\n\n if (result.subtype === \"success\") {\n resultText = result.result;\n structuredOutput = result.structured_output;\n } else {\n isError = true;\n errorSubtype = result.subtype;\n resultText =\n result.errors.map(String).join(\"\\n\") || `Error [${result.subtype}]: Unknown error`;\n }\n\n break;\n }\n }\n } catch (err: unknown) {\n isError = true;\n // Detect abort/cancellation errors\n const isAborted =\n abortController.signal.aborted ||\n err instanceof AbortError ||\n (err instanceof Error && err.name === \"AbortError\");\n if (isAborted) {\n resultText = timedOut\n ? `Error [${ErrorCode.TIMEOUT}]: Session timed out after ${input.timeout}ms.`\n : `Error [${ErrorCode.CANCELLED}]: Session was cancelled.`;\n } else {\n resultText = enhanceWindowsError(err instanceof Error ? err.message : String(err));\n }\n if (sessionId) {\n const current = sessionManager.get(sessionId);\n if (current) {\n // Don't overwrite terminal states; treat timeout as error (retryable)\n if (timedOut && current.status !== \"cancelled\" && current.status !== \"error\") {\n sessionManager.update(sessionId, { status: \"error\" });\n } else if (isAborted && current.status === \"running\") {\n sessionManager.update(sessionId, { status: \"cancelled\" });\n } else if (!isAborted && current.status !== \"cancelled\") {\n sessionManager.update(sessionId, { status: \"error\" });\n }\n }\n }\n } finally {\n if (timeoutId) clearTimeout(timeoutId);\n }\n\n // Some SDK abort paths end the stream without throwing. Ensure aborts become TIMEOUT/CANCELLED,\n // not an INTERNAL \"missing_result\" error.\n if (!seenResult && !isError && abortController.signal.aborted) {\n isError = true;\n resultText = timedOut\n ? `Error [${ErrorCode.TIMEOUT}]: Session timed out after ${input.timeout}ms.`\n : `Error [${ErrorCode.CANCELLED}]: Session was cancelled.`;\n }\n\n if (sessionId && !seenResult && !isError) {\n isError = true;\n errorSubtype = errorSubtype ?? \"missing_result\";\n const noResultMsg = `Error [${ErrorCode.INTERNAL}]: No result message received from agent.`;\n resultText = resultText ? `${noResultMsg} Original: ${resultText}` : noResultMsg;\n }\n\n // Update session to idle (or error), clear abortController\n // Preserve \"cancelled\" status if session was cancelled during execution\n if (sessionId) {\n const current = sessionManager.get(sessionId);\n if (current && current.status !== \"cancelled\") {\n sessionManager.update(sessionId, {\n status: isError ? \"error\" : \"idle\",\n totalTurns: numTurns,\n totalCostUsd,\n abortController: undefined,\n });\n const updated = sessionManager.get(sessionId);\n sessionTotalTurns = updated?.totalTurns;\n sessionTotalCostUsd = updated?.totalCostUsd;\n } else if (current) {\n // Session was cancelled — just clear the abortController and update totals\n sessionManager.update(sessionId, {\n totalTurns: numTurns,\n totalCostUsd,\n abortController: undefined,\n });\n const updated = sessionManager.get(sessionId);\n sessionTotalTurns = updated?.totalTurns;\n sessionTotalCostUsd = updated?.totalCostUsd;\n }\n } else {\n // No session ID means something went wrong regardless of result content\n isError = true;\n const noInitMsg = timedOut\n ? `Error [${ErrorCode.TIMEOUT}]: Session timed out after ${input.timeout}ms (no session ID received).`\n : `Error [${ErrorCode.INTERNAL}]: No session ID received from agent.`;\n resultText = resultText ? `${noInitMsg} Original: ${resultText}` : noInitMsg;\n }\n\n return {\n sessionId,\n result: resultText,\n isError,\n durationMs,\n durationApiMs,\n numTurns,\n totalCostUsd,\n sessionTotalTurns,\n sessionTotalCostUsd,\n structuredOutput,\n stopReason,\n errorSubtype,\n usage,\n modelUsage,\n permissionDenials,\n };\n}\n","/**\n * Type definitions for claude-code-mcp\n *\n * Shared constants are defined as tuples so both Zod schemas and\n * TypeScript types can derive from the same source of truth.\n */\n\n/** Permission modes supported by Claude Agent SDK */\nexport const PERMISSION_MODES = [\n \"default\",\n \"acceptEdits\",\n \"bypassPermissions\",\n \"plan\",\n \"delegate\",\n \"dontAsk\",\n] as const;\nexport type PermissionMode = (typeof PERMISSION_MODES)[number];\n\n/** Effort levels */\nexport const EFFORT_LEVELS = [\"low\", \"medium\", \"high\", \"max\"] as const;\nexport type EffortLevel = (typeof EFFORT_LEVELS)[number];\n\n/** Subagent model options */\nexport const AGENT_MODELS = [\"sonnet\", \"opus\", \"haiku\", \"inherit\"] as const;\nexport type AgentModel = (typeof AGENT_MODELS)[number];\n\n/** Configure tool actions */\nexport const CONFIGURE_ACTIONS = [\"enable_bypass\", \"disable_bypass\", \"get_config\"] as const;\nexport type ConfigureAction = (typeof CONFIGURE_ACTIONS)[number];\n\n/** Session management actions */\nexport const SESSION_ACTIONS = [\"list\", \"get\", \"cancel\"] as const;\nexport type SessionAction = (typeof SESSION_ACTIONS)[number];\n\n/** Session status */\nexport type SessionStatus = \"idle\" | \"running\" | \"cancelled\" | \"error\";\n\nexport type SystemPrompt = string | { type: \"preset\"; preset: \"claude_code\"; append?: string };\n\nexport type OutputFormat = { type: \"json_schema\"; schema: Record<string, unknown> };\n\nexport type ThinkingConfig =\n | { type: \"adaptive\" }\n | { type: \"enabled\"; budgetTokens: number }\n | { type: \"disabled\" };\n\nexport type ToolsConfig = string[] | { type: \"preset\"; preset: \"claude_code\" };\n\n/** Subagent definition */\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 * Windows-specific utilities for Git Bash detection\n */\nimport { existsSync } from \"node:fs\";\nimport { execSync } from \"node:child_process\";\nimport { join, dirname } from \"node:path\";\n\nexport function isWindows(): boolean {\n return process.platform === \"win32\";\n}\n\n/**\n * Attempt to locate bash.exe on Windows using the same logic as the Claude CLI:\n * 1. Check CLAUDE_CODE_GIT_BASH_PATH env var\n * 2. Find `git` in PATH and derive bash.exe from it\n *\n * Returns the resolved path, or null if not found.\n */\nexport function findGitBash(): string | null {\n if (process.env.CLAUDE_CODE_GIT_BASH_PATH) {\n if (existsSync(process.env.CLAUDE_CODE_GIT_BASH_PATH)) {\n return process.env.CLAUDE_CODE_GIT_BASH_PATH;\n }\n return null; // env var set but path doesn't exist\n }\n\n try {\n const gitPath = execSync(\"where git\", { encoding: \"utf8\" }).trim().split(/\\r?\\n/)[0];\n if (gitPath) {\n // git is typically at <root>/cmd/git.exe or <root>/mingw64/bin/git.exe\n // bash.exe is at <root>/bin/bash.exe\n const bashPath = join(dirname(gitPath), \"..\", \"..\", \"bin\", \"bash.exe\");\n if (existsSync(bashPath)) return bashPath;\n // Also try: git at <root>/bin/git.exe → same dir\n const bashPath2 = join(dirname(gitPath), \"bash.exe\");\n if (existsSync(bashPath2)) return bashPath2;\n }\n } catch {\n // `where git` failed — git not in PATH\n }\n\n return null;\n}\n\n/**\n * Log a startup warning if running on Windows without a detectable bash.exe.\n */\nexport function checkWindowsBashAvailability(): void {\n if (!isWindows()) return;\n\n const bashPath = findGitBash();\n if (bashPath) {\n console.error(`[windows] Git Bash detected: ${bashPath}`);\n return;\n }\n\n const hint = process.env.CLAUDE_CODE_GIT_BASH_PATH\n ? `CLAUDE_CODE_GIT_BASH_PATH is set to \"${process.env.CLAUDE_CODE_GIT_BASH_PATH}\" but the file does not exist.`\n : \"CLAUDE_CODE_GIT_BASH_PATH is not set and git was not found in PATH.\";\n\n console.error(\n `[windows] WARNING: ${hint}\\n` +\n ` The Claude Code CLI requires Git Bash on Windows.\\n` +\n ` Install Git for Windows (https://git-scm.com/downloads/win) and either:\\n` +\n ` 1. Add git to PATH, or\\n` +\n ` 2. Set CLAUDE_CODE_GIT_BASH_PATH to your bash.exe path\\n` +\n ` Example: CLAUDE_CODE_GIT_BASH_PATH=C:\\\\Program Files\\\\Git\\\\bin\\\\bash.exe\\n` +\n ` See README.md \"Windows Support\" section for MCP client config examples.`\n );\n}\n\nconst WINDOWS_BASH_HINT =\n \"\\n\\n[Windows] The Claude Code CLI requires Git Bash. \" +\n \"Set CLAUDE_CODE_GIT_BASH_PATH in your MCP server config or system environment. \" +\n 'See README.md \"Windows Support\" section for details.';\n\n/**\n * If the error looks like a Windows bash.exe issue, append a helpful hint.\n */\nexport function enhanceWindowsError(errorMessage: string): string {\n if (!isWindows()) return errorMessage;\n if (\n errorMessage.includes(\"git-bash\") ||\n errorMessage.includes(\"bash.exe\") ||\n errorMessage.includes(\"CLAUDE_CODE_GIT_BASH_PATH\")\n ) {\n return errorMessage + WINDOWS_BASH_HINT;\n }\n return errorMessage;\n}\n","/**\n * claude_code_reply tool - Continue an existing Claude Code session\n */\nimport { query, AbortError } from \"@anthropic-ai/claude-agent-sdk\";\nimport type { Options, SDKResultMessage } from \"@anthropic-ai/claude-agent-sdk\";\nimport type { SessionManager } from \"../session/manager.js\";\nimport type {\n AgentDefinition,\n AgentResult,\n EffortLevel,\n McpServerConfig,\n OutputFormat,\n PermissionMode,\n SandboxSettings,\n SettingSource,\n SystemPrompt,\n ThinkingConfig,\n ToolsConfig,\n} from \"../types.js\";\nimport { ErrorCode, DEFAULT_SETTING_SOURCES } from \"../types.js\";\nimport { enhanceWindowsError } from \"../utils/windows.js\";\n\nexport interface ClaudeCodeReplyInput {\n sessionId: string;\n prompt: string;\n forkSession?: boolean;\n timeout?: number;\n\n /**\n * Optional overrides used for \"disk resume\" when the in-memory session is missing.\n * Enabled only when `CLAUDE_CODE_MCP_ALLOW_DISK_RESUME=1`.\n */\n cwd?: string;\n allowedTools?: string[];\n disallowedTools?: string[];\n tools?: ToolsConfig;\n permissionMode?: PermissionMode;\n maxTurns?: number;\n model?: string;\n systemPrompt?: SystemPrompt;\n agents?: Record<string, AgentDefinition>;\n maxBudgetUsd?: number;\n effort?: EffortLevel;\n betas?: string[];\n additionalDirectories?: string[];\n outputFormat?: OutputFormat;\n thinking?: ThinkingConfig;\n persistSession?: boolean;\n resumeSessionAt?: string;\n pathToClaudeCodeExecutable?: string;\n agent?: string;\n mcpServers?: Record<string, McpServerConfig>;\n sandbox?: SandboxSettings;\n fallbackModel?: string;\n enableFileCheckpointing?: boolean;\n includePartialMessages?: boolean;\n strictMcpConfig?: boolean;\n settingSources?: SettingSource[];\n debug?: boolean;\n debugFile?: string;\n env?: Record<string, string | undefined>;\n}\n\nexport async function executeClaudeCodeReply(\n input: ClaudeCodeReplyInput,\n sessionManager: SessionManager,\n allowBypass = false\n): Promise<AgentResult> {\n const session = sessionManager.get(input.sessionId);\n if (!session) {\n const allowDiskResume = process.env.CLAUDE_CODE_MCP_ALLOW_DISK_RESUME === \"1\";\n if (!allowDiskResume) {\n return {\n sessionId: input.sessionId,\n result: `Error [${ErrorCode.SESSION_NOT_FOUND}]: Session '${input.sessionId}' not found or expired.`,\n isError: true,\n durationMs: 0,\n numTurns: 0,\n totalCostUsd: 0,\n };\n }\n\n return executeClaudeCodeReplyDiskResume(input, sessionManager, allowBypass);\n }\n\n if (session.status === \"running\") {\n return {\n sessionId: input.sessionId,\n result: `Error [${ErrorCode.SESSION_BUSY}]: Session is currently running. Wait for it to complete or cancel it.`,\n isError: true,\n durationMs: 0,\n numTurns: 0,\n totalCostUsd: 0,\n };\n }\n\n if (session.status === \"cancelled\") {\n return {\n sessionId: input.sessionId,\n result: `Error [${ErrorCode.CANCELLED}]: Session '${input.sessionId}' has been cancelled and cannot be resumed.`,\n isError: true,\n durationMs: 0,\n numTurns: 0,\n totalCostUsd: 0,\n };\n }\n\n // Security: block resume/fork of bypassPermissions sessions when bypass is disabled\n if (session.permissionMode === \"bypassPermissions\" && !allowBypass) {\n return {\n sessionId: input.sessionId,\n result: `Error [${ErrorCode.PERMISSION_DENIED}]: Cannot resume a bypassPermissions session while bypass is disabled. Use the claude_code_configure tool with action 'enable_bypass' first.`,\n isError: true,\n durationMs: 0,\n numTurns: 0,\n totalCostUsd: 0,\n };\n }\n\n // Atomically acquire the session (compare-and-set: idle/error → running)\n const originalStatus = session.status;\n const abortController = new AbortController();\n let timedOut = false;\n const acquired = sessionManager.tryAcquire(input.sessionId, originalStatus, abortController);\n if (!acquired) {\n const current = sessionManager.get(input.sessionId);\n if (!current) {\n return {\n sessionId: input.sessionId,\n result: `Error [${ErrorCode.SESSION_NOT_FOUND}]: Session '${input.sessionId}' not found or expired.`,\n isError: true,\n durationMs: 0,\n numTurns: 0,\n totalCostUsd: 0,\n };\n }\n // Another concurrent call acquired it first, or status changed\n return {\n sessionId: input.sessionId,\n result: `Error [${ErrorCode.SESSION_BUSY}]: Session is not available (status: ${current.status}).`,\n isError: true,\n durationMs: 0,\n numTurns: 0,\n totalCostUsd: 0,\n };\n }\n\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n if (input.timeout !== undefined) {\n timeoutId = setTimeout(() => {\n timedOut = true;\n abortController.abort();\n }, input.timeout);\n }\n\n let resultText = \"\";\n let isError = false;\n let durationMs = 0;\n let durationApiMs: number | undefined;\n let numTurns = 0;\n let totalCostUsd = 0;\n let sessionTotalTurns: number | undefined;\n let sessionTotalCostUsd: number | undefined;\n let newSessionId = input.sessionId;\n let structuredOutput: unknown;\n let stopReason: string | null | undefined;\n let errorSubtype: string | undefined;\n let usage: Record<string, unknown> | undefined;\n let modelUsage: Record<string, unknown> | undefined;\n let permissionDenials: AgentResult[\"permissionDenials\"] | undefined;\n let seenResult = false;\n let forkSessionCreated = false;\n\n try {\n const options: Partial<Options> = {\n resume: input.sessionId,\n abortController,\n cwd: session.cwd,\n permissionMode: session.permissionMode,\n };\n\n if (session.allowedTools !== undefined) options.allowedTools = session.allowedTools;\n if (session.disallowedTools !== undefined) options.disallowedTools = session.disallowedTools;\n if (session.maxTurns !== undefined) options.maxTurns = session.maxTurns;\n if (session.model !== undefined) options.model = session.model;\n if (session.maxBudgetUsd !== undefined) options.maxBudgetUsd = session.maxBudgetUsd;\n if (session.agents !== undefined) options.agents = session.agents as Options[\"agents\"];\n if (session.effort !== undefined) options.effort = session.effort;\n if (session.betas !== undefined) options.betas = session.betas as Options[\"betas\"];\n if (session.additionalDirectories !== undefined)\n options.additionalDirectories = session.additionalDirectories;\n if (session.outputFormat !== undefined) options.outputFormat = session.outputFormat;\n if (session.thinking !== undefined) options.thinking = session.thinking;\n if (session.tools !== undefined) options.tools = session.tools;\n if (session.systemPrompt !== undefined) options.systemPrompt = session.systemPrompt;\n if (session.persistSession !== undefined) options.persistSession = session.persistSession;\n if (session.pathToClaudeCodeExecutable !== undefined)\n options.pathToClaudeCodeExecutable = session.pathToClaudeCodeExecutable;\n if (session.agent !== undefined) options.agent = session.agent;\n if (session.mcpServers !== undefined)\n options.mcpServers = session.mcpServers as Options[\"mcpServers\"];\n if (session.sandbox !== undefined) options.sandbox = session.sandbox;\n if (session.fallbackModel !== undefined) options.fallbackModel = session.fallbackModel;\n if (session.enableFileCheckpointing !== undefined)\n options.enableFileCheckpointing = session.enableFileCheckpointing;\n if (session.includePartialMessages !== undefined)\n options.includePartialMessages = session.includePartialMessages;\n if (session.strictMcpConfig !== undefined) options.strictMcpConfig = session.strictMcpConfig;\n if (session.settingSources !== undefined) options.settingSources = session.settingSources;\n else options.settingSources = DEFAULT_SETTING_SOURCES;\n if (session.debug !== undefined) options.debug = session.debug;\n if (session.debugFile !== undefined) options.debugFile = session.debugFile;\n if (session.env !== undefined) options.env = { ...process.env, ...session.env };\n\n if (session.permissionMode === \"bypassPermissions\") {\n options.allowDangerouslySkipPermissions = true;\n }\n\n if (input.forkSession) {\n options.forkSession = true;\n }\n\n for await (const message of query({\n prompt: input.prompt,\n options,\n })) {\n // If forked, capture the new session ID\n if (input.forkSession && message.type === \"system\" && message.subtype === \"init\") {\n newSessionId = message.session_id;\n // Note: forked session shares abortController during this query() call.\n // This is correct — both run in the same SDK process. After completion,\n // each session's abortController is cleared independently.\n if (!forkSessionCreated && newSessionId !== input.sessionId) {\n sessionManager.create({\n sessionId: newSessionId,\n cwd: session.cwd,\n model: session.model,\n permissionMode: session.permissionMode,\n allowedTools: session.allowedTools,\n disallowedTools: session.disallowedTools,\n tools: session.tools,\n maxTurns: session.maxTurns,\n systemPrompt: session.systemPrompt,\n agents: session.agents,\n maxBudgetUsd: session.maxBudgetUsd,\n effort: session.effort,\n betas: session.betas,\n additionalDirectories: session.additionalDirectories,\n outputFormat: session.outputFormat,\n thinking: session.thinking,\n persistSession: session.persistSession,\n pathToClaudeCodeExecutable: session.pathToClaudeCodeExecutable,\n agent: session.agent,\n mcpServers: session.mcpServers,\n sandbox: session.sandbox,\n fallbackModel: session.fallbackModel,\n enableFileCheckpointing: session.enableFileCheckpointing,\n includePartialMessages: session.includePartialMessages,\n strictMcpConfig: session.strictMcpConfig,\n settingSources: session.settingSources ?? DEFAULT_SETTING_SOURCES,\n debug: session.debug,\n debugFile: session.debugFile,\n env: session.env,\n abortController,\n });\n forkSessionCreated = true;\n }\n }\n\n if (message.type === \"result\") {\n if (seenResult) continue;\n seenResult = true;\n\n const result: SDKResultMessage = message;\n durationMs = result.duration_ms;\n durationApiMs = result.duration_api_ms;\n numTurns = result.num_turns;\n totalCostUsd = result.total_cost_usd;\n isError = result.is_error;\n stopReason = result.stop_reason;\n usage = result.usage;\n modelUsage = result.modelUsage;\n permissionDenials = result.permission_denials;\n\n if (result.subtype === \"success\") {\n resultText = result.result;\n structuredOutput = result.structured_output;\n } else {\n isError = true;\n errorSubtype = result.subtype;\n resultText =\n result.errors.map(String).join(\"\\n\") || `Error [${result.subtype}]: Unknown error`;\n }\n\n break;\n }\n }\n } catch (err: unknown) {\n isError = true;\n const isAborted =\n abortController.signal.aborted ||\n err instanceof AbortError ||\n (err instanceof Error && err.name === \"AbortError\");\n if (isAborted) {\n resultText = timedOut\n ? `Error [${ErrorCode.TIMEOUT}]: Session timed out after ${input.timeout}ms.`\n : `Error [${ErrorCode.CANCELLED}]: Session was cancelled.`;\n } else {\n resultText = enhanceWindowsError(err instanceof Error ? err.message : String(err));\n }\n } finally {\n if (timeoutId) clearTimeout(timeoutId);\n }\n\n // Some SDK abort paths end the stream without throwing. Ensure aborts become TIMEOUT/CANCELLED,\n // not an INTERNAL \"missing_result\" error.\n if (!seenResult && !isError && abortController.signal.aborted) {\n isError = true;\n resultText = timedOut\n ? `Error [${ErrorCode.TIMEOUT}]: Session timed out after ${input.timeout}ms.`\n : `Error [${ErrorCode.CANCELLED}]: Session was cancelled.`;\n }\n\n if (!seenResult && !isError) {\n isError = true;\n errorSubtype = errorSubtype ?? \"missing_result\";\n const noResultMsg = `Error [${ErrorCode.INTERNAL}]: No result message received from agent.`;\n resultText = resultText ? `${noResultMsg} Original: ${resultText}` : noResultMsg;\n }\n\n // Update session state, clear abortController\n // Preserve \"cancelled\" status if session was cancelled during execution\n if (input.forkSession && newSessionId !== input.sessionId) {\n const forkedCurrent = sessionManager.get(newSessionId);\n if (forkedCurrent && forkedCurrent.status !== \"cancelled\") {\n sessionManager.update(newSessionId, {\n status: isError ? \"error\" : \"idle\",\n totalTurns: numTurns,\n totalCostUsd,\n abortController: undefined,\n });\n const updatedFork = sessionManager.get(newSessionId);\n sessionTotalTurns = updatedFork?.totalTurns;\n sessionTotalCostUsd = updatedFork?.totalCostUsd;\n } else if (forkedCurrent) {\n sessionManager.update(newSessionId, {\n totalTurns: numTurns,\n totalCostUsd,\n abortController: undefined,\n });\n const updatedFork = sessionManager.get(newSessionId);\n sessionTotalTurns = updatedFork?.totalTurns;\n sessionTotalCostUsd = updatedFork?.totalCostUsd;\n }\n // Restore original session to its pre-fork status (not always \"idle\")\n const origCurrent = sessionManager.get(input.sessionId);\n if (origCurrent && origCurrent.status !== \"cancelled\") {\n sessionManager.update(input.sessionId, {\n status: originalStatus,\n abortController: undefined,\n });\n } else if (origCurrent) {\n sessionManager.update(input.sessionId, {\n abortController: undefined,\n });\n }\n } else {\n const current = sessionManager.get(input.sessionId);\n if (current && current.status !== \"cancelled\") {\n sessionManager.update(input.sessionId, {\n status: isError ? \"error\" : \"idle\",\n totalTurns: (session.totalTurns ?? 0) + numTurns,\n totalCostUsd: (session.totalCostUsd ?? 0) + totalCostUsd,\n abortController: undefined,\n });\n const updated = sessionManager.get(input.sessionId);\n sessionTotalTurns = updated?.totalTurns;\n sessionTotalCostUsd = updated?.totalCostUsd;\n } else if (current) {\n sessionManager.update(input.sessionId, {\n totalTurns: (session.totalTurns ?? 0) + numTurns,\n totalCostUsd: (session.totalCostUsd ?? 0) + totalCostUsd,\n abortController: undefined,\n });\n const updated = sessionManager.get(input.sessionId);\n sessionTotalTurns = updated?.totalTurns;\n sessionTotalCostUsd = updated?.totalCostUsd;\n }\n }\n\n const targetSessionId = input.forkSession ? newSessionId : input.sessionId;\n\n // If fork was requested but no new session ID was received, flag as internal error\n if (input.forkSession && newSessionId === input.sessionId && !isError) {\n isError = true;\n const noForkMsg = `Error [${ErrorCode.INTERNAL}]: Fork requested but no new session ID received from agent.`;\n resultText = resultText ? `${noForkMsg} Original: ${resultText}` : noForkMsg;\n }\n\n return {\n sessionId: targetSessionId,\n result: resultText,\n isError,\n durationMs,\n durationApiMs,\n numTurns,\n totalCostUsd,\n sessionTotalTurns,\n sessionTotalCostUsd,\n structuredOutput,\n stopReason,\n errorSubtype,\n usage,\n modelUsage,\n permissionDenials,\n };\n}\n\nasync function executeClaudeCodeReplyDiskResume(\n input: ClaudeCodeReplyInput,\n sessionManager: SessionManager,\n allowBypass: boolean\n): Promise<AgentResult> {\n if (input.cwd !== undefined && (typeof input.cwd !== \"string\" || input.cwd.trim() === \"\")) {\n return {\n sessionId: input.sessionId,\n result: `Error [${ErrorCode.INVALID_ARGUMENT}]: cwd must be a non-empty string.`,\n isError: true,\n durationMs: 0,\n numTurns: 0,\n totalCostUsd: 0,\n };\n }\n\n const effectivePermissionMode = input.permissionMode ?? \"dontAsk\";\n\n if (effectivePermissionMode === \"bypassPermissions\" && !allowBypass) {\n return {\n sessionId: input.sessionId,\n result: `Error [${ErrorCode.PERMISSION_DENIED}]: bypassPermissions is disabled on this server. Use the claude_code_configure tool with action 'enable_bypass' to enable it.`,\n isError: true,\n durationMs: 0,\n numTurns: 0,\n totalCostUsd: 0,\n };\n }\n\n const abortController = new AbortController();\n let timedOut = false;\n\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n if (input.timeout !== undefined) {\n timeoutId = setTimeout(() => {\n timedOut = true;\n abortController.abort();\n }, input.timeout);\n }\n\n let resultText = \"\";\n let isError = false;\n let durationMs = 0;\n let durationApiMs: number | undefined;\n let numTurns = 0;\n let totalCostUsd = 0;\n let sessionTotalTurns: number | undefined;\n let sessionTotalCostUsd: number | undefined;\n let newSessionId = input.sessionId;\n let structuredOutput: unknown;\n let stopReason: string | null | undefined;\n let errorSubtype: string | undefined;\n let usage: Record<string, unknown> | undefined;\n let modelUsage: Record<string, unknown> | undefined;\n let permissionDenials: AgentResult[\"permissionDenials\"] | undefined;\n let seenResult = false;\n\n // Create a placeholder in-memory session for non-fork resumes to support cancellation/status.\n if (!input.forkSession) {\n const existing = sessionManager.get(input.sessionId);\n if (!existing) {\n const cwd = input.cwd ?? process.cwd();\n if (typeof cwd !== \"string\" || cwd.trim() === \"\") {\n return {\n sessionId: input.sessionId,\n result: `Error [${ErrorCode.INVALID_ARGUMENT}]: cwd must be a non-empty string.`,\n isError: true,\n durationMs: 0,\n numTurns: 0,\n totalCostUsd: 0,\n };\n }\n try {\n sessionManager.create({\n sessionId: input.sessionId,\n cwd,\n model: input.model,\n permissionMode: effectivePermissionMode,\n allowedTools: input.allowedTools,\n disallowedTools: input.disallowedTools,\n tools: input.tools,\n maxTurns: input.maxTurns,\n systemPrompt: input.systemPrompt,\n agents: input.agents,\n maxBudgetUsd: input.maxBudgetUsd,\n effort: input.effort,\n betas: input.betas,\n additionalDirectories: input.additionalDirectories,\n outputFormat: input.outputFormat,\n thinking: input.thinking,\n persistSession: input.persistSession,\n pathToClaudeCodeExecutable: input.pathToClaudeCodeExecutable,\n agent: input.agent,\n mcpServers: input.mcpServers,\n sandbox: input.sandbox,\n fallbackModel: input.fallbackModel,\n enableFileCheckpointing: input.enableFileCheckpointing,\n includePartialMessages: input.includePartialMessages,\n strictMcpConfig: input.strictMcpConfig,\n settingSources: input.settingSources ?? DEFAULT_SETTING_SOURCES,\n debug: input.debug,\n debugFile: input.debugFile,\n env: input.env,\n abortController,\n });\n } catch {\n // Another concurrent call may have created it; fall back to regular reply behavior.\n return executeClaudeCodeReply(input, sessionManager, allowBypass);\n }\n }\n }\n\n try {\n const options: Partial<Options> = {\n resume: input.sessionId,\n abortController,\n permissionMode: effectivePermissionMode,\n };\n\n if (input.cwd !== undefined) options.cwd = input.cwd;\n if (input.allowedTools !== undefined) options.allowedTools = input.allowedTools;\n if (input.disallowedTools !== undefined) options.disallowedTools = input.disallowedTools;\n if (input.maxTurns !== undefined) options.maxTurns = input.maxTurns;\n if (input.model !== undefined) options.model = input.model;\n if (input.maxBudgetUsd !== undefined) options.maxBudgetUsd = input.maxBudgetUsd;\n if (input.agents !== undefined) options.agents = input.agents as Options[\"agents\"];\n if (input.effort !== undefined) options.effort = input.effort;\n if (input.betas !== undefined) options.betas = input.betas as Options[\"betas\"];\n if (input.additionalDirectories !== undefined)\n options.additionalDirectories = input.additionalDirectories;\n if (input.outputFormat !== undefined) options.outputFormat = input.outputFormat;\n if (input.thinking !== undefined) options.thinking = input.thinking;\n if (input.tools !== undefined) options.tools = input.tools;\n if (input.systemPrompt !== undefined) options.systemPrompt = input.systemPrompt;\n if (input.persistSession !== undefined) options.persistSession = input.persistSession;\n if (input.resumeSessionAt !== undefined) options.resumeSessionAt = input.resumeSessionAt;\n if (input.pathToClaudeCodeExecutable !== undefined)\n options.pathToClaudeCodeExecutable = input.pathToClaudeCodeExecutable;\n if (input.agent !== undefined) options.agent = input.agent;\n if (input.mcpServers !== undefined)\n options.mcpServers = input.mcpServers as Options[\"mcpServers\"];\n if (input.sandbox !== undefined) options.sandbox = input.sandbox;\n if (input.fallbackModel !== undefined) options.fallbackModel = input.fallbackModel;\n if (input.enableFileCheckpointing !== undefined)\n options.enableFileCheckpointing = input.enableFileCheckpointing;\n if (input.includePartialMessages !== undefined)\n options.includePartialMessages = input.includePartialMessages;\n if (input.strictMcpConfig !== undefined) options.strictMcpConfig = input.strictMcpConfig;\n if (input.settingSources !== undefined) options.settingSources = input.settingSources;\n else options.settingSources = DEFAULT_SETTING_SOURCES;\n if (input.debug !== undefined) options.debug = input.debug;\n if (input.debugFile !== undefined) options.debugFile = input.debugFile;\n if (input.env !== undefined) options.env = { ...process.env, ...input.env };\n\n if (effectivePermissionMode === \"bypassPermissions\") {\n options.allowDangerouslySkipPermissions = true;\n }\n\n if (input.forkSession) {\n options.forkSession = true;\n }\n\n for await (const message of query({\n prompt: input.prompt,\n options,\n })) {\n if (message.type === \"system\" && message.subtype === \"init\") {\n // Security: block bypassPermissions if it was applied by the underlying CLI state\n if (message.permissionMode === \"bypassPermissions\" && !allowBypass) {\n isError = true;\n resultText = `Error [${ErrorCode.PERMISSION_DENIED}]: Cannot resume a bypassPermissions session while bypass is disabled. Use the claude_code_configure tool with action 'enable_bypass' first.`;\n abortController.abort();\n break;\n }\n\n if (input.forkSession) {\n newSessionId = message.session_id;\n if (newSessionId !== input.sessionId && !sessionManager.get(newSessionId)) {\n try {\n sessionManager.create({\n sessionId: newSessionId,\n cwd: message.cwd,\n model: message.model,\n permissionMode: effectivePermissionMode,\n allowedTools: input.allowedTools,\n disallowedTools: input.disallowedTools,\n tools: input.tools ?? message.tools,\n maxTurns: input.maxTurns,\n systemPrompt: input.systemPrompt,\n agents: input.agents,\n maxBudgetUsd: input.maxBudgetUsd,\n effort: input.effort,\n betas: input.betas ?? message.betas,\n additionalDirectories: input.additionalDirectories,\n outputFormat: input.outputFormat,\n thinking: input.thinking,\n persistSession: input.persistSession,\n pathToClaudeCodeExecutable: input.pathToClaudeCodeExecutable,\n agent: input.agent,\n mcpServers: input.mcpServers,\n sandbox: input.sandbox,\n fallbackModel: input.fallbackModel,\n enableFileCheckpointing: input.enableFileCheckpointing,\n includePartialMessages: input.includePartialMessages,\n strictMcpConfig: input.strictMcpConfig,\n settingSources: input.settingSources ?? DEFAULT_SETTING_SOURCES,\n debug: input.debug,\n debugFile: input.debugFile,\n env: input.env,\n abortController,\n });\n } catch {\n // If it already exists, treat as busy.\n isError = true;\n resultText = `Error [${ErrorCode.SESSION_BUSY}]: Session is not available (status: running).`;\n abortController.abort();\n break;\n }\n }\n } else {\n sessionManager.update(input.sessionId, {\n cwd: message.cwd,\n model: message.model,\n permissionMode: effectivePermissionMode,\n betas: input.betas ?? message.betas,\n tools: input.tools ?? message.tools,\n });\n }\n }\n\n if (message.type === \"result\") {\n if (seenResult) continue;\n seenResult = true;\n\n const result: SDKResultMessage = message;\n durationMs = result.duration_ms;\n durationApiMs = result.duration_api_ms;\n numTurns = result.num_turns;\n totalCostUsd = result.total_cost_usd;\n isError = result.is_error;\n stopReason = result.stop_reason;\n usage = result.usage;\n modelUsage = result.modelUsage;\n permissionDenials = result.permission_denials;\n\n if (result.subtype === \"success\") {\n resultText = result.result;\n structuredOutput = result.structured_output;\n } else {\n isError = true;\n errorSubtype = result.subtype;\n resultText =\n result.errors.map(String).join(\"\\n\") || `Error [${result.subtype}]: Unknown error`;\n }\n\n break;\n }\n }\n } catch (err: unknown) {\n isError = true;\n const isAborted =\n abortController.signal.aborted ||\n err instanceof AbortError ||\n (err instanceof Error && err.name === \"AbortError\");\n if (isAborted) {\n resultText = timedOut\n ? `Error [${ErrorCode.TIMEOUT}]: Session timed out after ${input.timeout}ms.`\n : `Error [${ErrorCode.CANCELLED}]: Session was cancelled.`;\n } else {\n resultText = enhanceWindowsError(err instanceof Error ? err.message : String(err));\n }\n } finally {\n if (timeoutId) clearTimeout(timeoutId);\n }\n\n // Some SDK abort paths end the stream without throwing. Ensure aborts become TIMEOUT/CANCELLED,\n // not an INTERNAL \"missing_result\" error.\n if (!seenResult && !isError && abortController.signal.aborted) {\n isError = true;\n resultText = timedOut\n ? `Error [${ErrorCode.TIMEOUT}]: Session timed out after ${input.timeout}ms.`\n : `Error [${ErrorCode.CANCELLED}]: Session was cancelled.`;\n }\n\n if (!seenResult && !isError) {\n isError = true;\n errorSubtype = errorSubtype ?? \"missing_result\";\n const noResultMsg = `Error [${ErrorCode.INTERNAL}]: No result message received from agent.`;\n resultText = resultText ? `${noResultMsg} Original: ${resultText}` : noResultMsg;\n }\n\n const targetSessionId = input.forkSession ? newSessionId : input.sessionId;\n\n // Update totals/status and clear abortController for tracked sessions.\n // Note: In disk-resume mode, the original session may not exist in memory (it was resumed\n // from disk). When forking, only the new forked session is tracked; the original session\n // has no in-memory state to clean up, which is the expected behavior.\n const tracked = sessionManager.get(targetSessionId);\n if (tracked) {\n const nextTurns = input.forkSession ? numTurns : (tracked.totalTurns ?? 0) + numTurns;\n const nextCost = input.forkSession ? totalCostUsd : (tracked.totalCostUsd ?? 0) + totalCostUsd;\n if (tracked.status !== \"cancelled\") {\n sessionManager.update(targetSessionId, {\n status: isError ? \"error\" : \"idle\",\n totalTurns: nextTurns,\n totalCostUsd: nextCost,\n abortController: undefined,\n });\n } else {\n sessionManager.update(targetSessionId, {\n totalTurns: nextTurns,\n totalCostUsd: nextCost,\n abortController: undefined,\n });\n }\n const updated = sessionManager.get(targetSessionId);\n sessionTotalTurns = updated?.totalTurns;\n sessionTotalCostUsd = updated?.totalCostUsd;\n }\n\n // If fork was requested but no new session ID was received, flag as internal error\n if (input.forkSession && newSessionId === input.sessionId && !isError) {\n isError = true;\n const noForkMsg = `Error [${ErrorCode.INTERNAL}]: Fork requested but no new session ID received from agent.`;\n resultText = resultText ? `${noForkMsg} Original: ${resultText}` : noForkMsg;\n }\n\n return {\n sessionId: targetSessionId,\n result: resultText,\n isError,\n durationMs,\n durationApiMs,\n numTurns,\n totalCostUsd,\n sessionTotalTurns,\n sessionTotalCostUsd,\n structuredOutput,\n stopReason,\n errorSubtype,\n usage,\n modelUsage,\n permissionDenials,\n };\n}\n","/**\n * claude_code_session tool - Manage sessions (list, get, cancel)\n */\nimport type { SessionManager } from \"../session/manager.js\";\nimport type { 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/utils/windows.ts","../src/tools/claude-code-reply.ts","../src/tools/claude-code-session.ts","../src/tools/claude-code-configure.ts"],"sourcesContent":["/**\n * claude-code-mcp - MCP server entry point\n *\n * Starts the MCP server with stdio transport.\n * Usage: npx claude-code-mcp\n */\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { createServer } from \"./server.js\";\nimport { checkWindowsBashAvailability } from \"./utils/windows.js\";\n\nasync function main(): Promise<void> {\n const serverCwd = process.cwd();\n const server = createServer(serverCwd);\n const transport = new StdioServerTransport();\n\n // Handle graceful shutdown (idempotent)\n let closing = false;\n const shutdown = async () => {\n if (closing) return;\n closing = true;\n try {\n await server.close();\n } catch {\n // Ignore close errors during shutdown\n }\n // Allow stdio to flush before exiting\n process.exitCode = 0;\n setTimeout(() => process.exit(0), 100);\n };\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n await server.connect(transport);\n\n // Check Windows bash.exe availability and warn early\n checkWindowsBashAvailability();\n\n // Log to stderr (stdout is used for MCP communication)\n console.error(`claude-code-mcp server started (cwd: ${serverCwd})`);\n}\n\nmain().catch((err) => {\n console.error(\"Fatal error:\", err);\n process.exit(1);\n});\n","/**\n * MCP Server definition - registers tools and handles requests\n */\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { SessionManager } from \"./session/manager.js\";\nimport { executeClaudeCode } from \"./tools/claude-code.js\";\nimport { executeClaudeCodeReply } from \"./tools/claude-code-reply.js\";\nimport { executeClaudeCodeSession } from \"./tools/claude-code-session.js\";\nimport { executeClaudeCodeConfigure } from \"./tools/claude-code-configure.js\";\nimport {\n PERMISSION_MODES,\n EFFORT_LEVELS,\n AGENT_MODELS,\n CONFIGURE_ACTIONS,\n SESSION_ACTIONS,\n ErrorCode,\n} from \"./types.js\";\n\ndeclare const __PKG_VERSION__: string;\nconst SERVER_VERSION = typeof __PKG_VERSION__ !== \"undefined\" ? __PKG_VERSION__ : \"0.0.0-dev\";\n\nexport interface ServerOptions {\n /** Allow bypassPermissions mode (default: false, can be enabled via claude_code_configure tool) */\n allowBypass?: boolean;\n}\n\nexport function createServer(serverCwd: string, opts?: ServerOptions): McpServer {\n const parsePositiveInt = (value: string | undefined): number | undefined => {\n if (value === undefined || value.trim() === \"\") return undefined;\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed) || parsed <= 0) return undefined;\n return parsed;\n };\n\n const sessionManager = new SessionManager({\n sessionTtlMs: parsePositiveInt(process.env.CLAUDE_CODE_MCP_SESSION_TTL_MS),\n runningSessionMaxMs: parsePositiveInt(process.env.CLAUDE_CODE_MCP_RUNNING_SESSION_MAX_MS),\n cleanupIntervalMs: parsePositiveInt(process.env.CLAUDE_CODE_MCP_CLEANUP_INTERVAL_MS),\n });\n let allowBypass = opts?.allowBypass ?? false;\n\n const config = {\n getAllowBypass: () => allowBypass,\n setAllowBypass: (v: boolean) => {\n allowBypass = v;\n },\n };\n\n const server = new McpServer({\n name: \"claude-code-mcp\",\n version: SERVER_VERSION,\n });\n\n // Tool 1: claude_code - Start a new agent session\n server.tool(\n \"claude_code\",\n `Start a new Claude Code session. The agent autonomously performs coding tasks: reading/writing files, running shell commands, searching code, managing git, and interacting with APIs.\nReturns a sessionId that can be passed to claude_code_reply for multi-turn conversations.\nDefaults: permissionMode=\"dontAsk\" (auto-approves allowed tools without prompting), loads all local Claude settings (user, project, local) including CLAUDE.md.`,\n {\n prompt: z.string().describe(\"The task or question for Claude Code\"),\n cwd: z.string().optional().describe(\"Working directory (defaults to server cwd)\"),\n allowedTools: z\n .array(z.string())\n .optional()\n .describe(\n \"List of tool names the agent can use without permission prompts. In the default 'dontAsk' mode, only tools in this list are available. Example: ['Bash', 'Read', 'Write', 'Edit']\"\n ),\n disallowedTools: z\n .array(z.string())\n .optional()\n .describe(\n \"List of tool names the agent is forbidden from using. Takes precedence over allowedTools.\"\n ),\n tools: z\n .union([\n z.array(z.string()),\n z.object({\n type: z.literal(\"preset\"),\n preset: z.literal(\"claude_code\"),\n }),\n ])\n .optional()\n .describe(\n \"Define the base tool set for the session. Pass an array of tool name strings, or use {type: 'preset', preset: 'claude_code'} for the default Claude Code toolset. allowedTools/disallowedTools further filter on top of this base set.\"\n ),\n persistSession: z\n .boolean()\n .optional()\n .describe(\n \"Persist session history to disk (~/.claude/projects). Default: true. Set false to disable persistence.\"\n ),\n permissionMode: z\n .enum(PERMISSION_MODES)\n .optional()\n .describe(\n \"Controls how the agent handles tool permissions. 'dontAsk' (default): auto-approve tools in allowedTools without prompting. 'bypassPermissions': skip all permission checks (requires enable_bypass via claude_code_configure). 'plan': require approval before executing.\"\n ),\n maxTurns: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\n \"Maximum number of agent reasoning steps. Each step may involve one or more tool calls. Limits how many iterations the agent performs before stopping.\"\n ),\n model: z.string().optional().describe(\"Model to use, e.g. 'claude-sonnet-4-5-20250929'\"),\n systemPrompt: z\n .union([\n z.string(),\n z.object({\n type: z.literal(\"preset\"),\n preset: z.literal(\"claude_code\"),\n append: z\n .string()\n .optional()\n .describe(\"Additional instructions to append to the preset\"),\n }),\n ])\n .optional()\n .describe(\n \"Override the agent's system prompt. Pass a string for full replacement, or use {type: 'preset', preset: 'claude_code', append: '...'} to extend the default Claude Code prompt with additional instructions.\"\n ),\n agents: z\n .record(\n z.string(),\n z.object({\n description: z.string(),\n prompt: z.string(),\n tools: z.array(z.string()).optional(),\n disallowedTools: z.array(z.string()).optional(),\n model: z.enum(AGENT_MODELS).optional(),\n maxTurns: z.number().int().positive().optional(),\n mcpServers: z\n .array(z.union([z.string(), z.record(z.string(), z.unknown())]))\n .optional(),\n skills: z.array(z.string()).optional(),\n criticalSystemReminder_EXPERIMENTAL: z.string().optional(),\n })\n )\n .optional()\n .describe(\n \"Define custom sub-agents that the main agent can delegate tasks to. Each key is the agent name; the value specifies its system prompt, available tools, model, and other constraints.\"\n ),\n maxBudgetUsd: z\n .number()\n .positive()\n .optional()\n .describe(\"Maximum budget in USD for this session\"),\n effort: z\n .enum(EFFORT_LEVELS)\n .optional()\n .describe(\n \"Effort level: 'low' (fast), 'medium' (balanced), 'high' (thorough), 'max' (maximum)\"\n ),\n betas: z\n .array(z.string())\n .optional()\n .describe(\"Beta features to enable (e.g. ['context-1m-2025-08-07'])\"),\n additionalDirectories: z\n .array(z.string())\n .optional()\n .describe(\"Additional directories the agent can access beyond cwd\"),\n outputFormat: z\n .object({\n type: z.literal(\"json_schema\"),\n schema: z.record(z.string(), z.unknown()).describe(\"JSON Schema for structured output\"),\n })\n .optional()\n .describe(\"Structured output format with JSON Schema (omit for plain text output)\"),\n thinking: z\n .union([\n z.object({ type: z.literal(\"adaptive\") }),\n z.object({\n type: z.literal(\"enabled\"),\n budgetTokens: z.number().int().positive().describe(\"Token budget for thinking\"),\n }),\n z.object({ type: z.literal(\"disabled\") }),\n ])\n .optional()\n .describe(\"Thinking mode: 'adaptive' (auto), 'enabled' (with budget), or 'disabled'\"),\n timeout: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"Timeout in milliseconds for this session\"),\n pathToClaudeCodeExecutable: z\n .string()\n .optional()\n .describe(\"Path to the Claude Code executable\"),\n agent: z\n .string()\n .optional()\n .describe(\n \"Name of a custom agent (defined in 'agents' parameter) to use as the primary agent for this session, applying its system prompt, tool restrictions, and model override.\"\n ),\n mcpServers: z\n .record(z.string(), z.record(z.string(), z.unknown()))\n .optional()\n .describe(\"MCP server configurations (key: server name, value: server config)\"),\n sandbox: z\n .record(z.string(), z.unknown())\n .optional()\n .describe(\n \"Sandbox configuration for isolating shell command execution (e.g., Docker container settings). Controls the execution environment for Bash tool calls.\"\n ),\n fallbackModel: z\n .string()\n .optional()\n .describe(\"Fallback model if the primary model fails or is unavailable\"),\n enableFileCheckpointing: z\n .boolean()\n .optional()\n .describe(\"Enable file checkpointing to track file changes during the session\"),\n includePartialMessages: z\n .boolean()\n .optional()\n .describe(\n \"When true, includes intermediate streaming messages in the response (e.g., partial tool outputs as they arrive). Useful for real-time progress monitoring. Default: false.\"\n ),\n strictMcpConfig: z\n .boolean()\n .optional()\n .describe(\"Enforce strict validation of MCP server configurations\"),\n settingSources: z\n .array(z.enum([\"user\", \"project\", \"local\"]))\n .optional()\n .describe(\n 'Control which filesystem settings are loaded. Defaults to [\"user\", \"project\", \"local\"] (loads all settings including ~/.claude/settings.json, .claude/settings.json, .claude/settings.local.json, and CLAUDE.md). Pass an empty array [] to disable all settings (SDK isolation mode).'\n ),\n debug: z.boolean().optional().describe(\"Enable debug mode for verbose logging\"),\n debugFile: z\n .string()\n .optional()\n .describe(\"Write debug logs to a specific file path (implicitly enables debug mode)\"),\n env: z\n .record(z.string(), z.string().optional())\n .optional()\n .describe(\n \"Environment variables to merge with process.env and pass to the Claude Code process (user-provided values take precedence)\"\n ),\n },\n async (args) => {\n try {\n const result = await executeClaudeCode(args, sessionManager, serverCwd, allowBypass);\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n isError: result.isError,\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error [${ErrorCode.INTERNAL}]: ${message}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // Tool 2: claude_code_reply - Continue an existing session\n server.tool(\n \"claude_code_reply\",\n `Continue an existing Claude Code session by sending a follow-up message. The agent retains full context from previous turns including files read, code analysis, and conversation history. Requires a sessionId returned by a previous claude_code call.\nNote: When CLAUDE_CODE_MCP_ALLOW_DISK_RESUME=1 is set and the in-memory session has expired, the agent can resume from disk-persisted history. Parameters marked \"(disk resume fallback)\" are only used in this scenario to reconstruct the session.`,\n {\n sessionId: z\n .string()\n .describe(\"The session ID to continue (from a previous claude_code call)\"),\n prompt: z.string().describe(\"Follow-up prompt or instruction\"),\n forkSession: z\n .boolean()\n .optional()\n .describe(\n \"Create a branched copy of this session. The original session remains unchanged; the new session starts with the same context but diverges from this point. Useful for exploring alternative approaches.\"\n ),\n timeout: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"Timeout in milliseconds for this reply\"),\n\n // Optional disk-resume overrides (only used when CLAUDE_CODE_MCP_ALLOW_DISK_RESUME=1\n // and the in-memory session metadata is missing)\n cwd: z.string().optional().describe(\"Working directory (disk resume fallback)\"),\n allowedTools: z\n .array(z.string())\n .optional()\n .describe(\n \"Auto-approved tool names (disk resume fallback). See claude_code tool for details.\"\n ),\n disallowedTools: z\n .array(z.string())\n .optional()\n .describe(\"Forbidden tool names (disk resume fallback). See claude_code tool for details.\"),\n tools: z\n .union([\n z.array(z.string()),\n z.object({\n type: z.literal(\"preset\"),\n preset: z.literal(\"claude_code\"),\n }),\n ])\n .optional()\n .describe(\"Base tool set (disk resume fallback). See claude_code tool for details.\"),\n persistSession: z\n .boolean()\n .optional()\n .describe(\"Persist session history to disk (~/.claude/projects). Default: true.\"),\n permissionMode: z\n .enum(PERMISSION_MODES)\n .optional()\n .describe(\"Permission mode (disk resume fallback). See claude_code tool for details.\"),\n maxTurns: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"Maximum number of agent reasoning steps for this reply.\"),\n model: z.string().optional().describe(\"Model to use, e.g. 'claude-sonnet-4-5-20250929'\"),\n systemPrompt: z\n .union([\n z.string(),\n z.object({\n type: z.literal(\"preset\"),\n preset: z.literal(\"claude_code\"),\n append: z\n .string()\n .optional()\n .describe(\"Additional instructions to append to the preset\"),\n }),\n ])\n .optional()\n .describe(\"Override the agent's system prompt. See claude_code tool for details.\"),\n agents: z\n .record(\n z.string(),\n z.object({\n description: z.string(),\n prompt: z.string(),\n tools: z.array(z.string()).optional(),\n disallowedTools: z.array(z.string()).optional(),\n model: z.enum(AGENT_MODELS).optional(),\n maxTurns: z.number().int().positive().optional(),\n mcpServers: z\n .array(z.union([z.string(), z.record(z.string(), z.unknown())]))\n .optional(),\n skills: z.array(z.string()).optional(),\n criticalSystemReminder_EXPERIMENTAL: z.string().optional(),\n })\n )\n .optional()\n .describe(\"Define custom sub-agents. See claude_code tool for details.\"),\n maxBudgetUsd: z\n .number()\n .positive()\n .optional()\n .describe(\"Maximum budget in USD for this reply\"),\n effort: z\n .enum(EFFORT_LEVELS)\n .optional()\n .describe(\n \"Effort level: 'low' (fast), 'medium' (balanced), 'high' (thorough), 'max' (maximum)\"\n ),\n betas: z.array(z.string()).optional().describe(\"Beta features to enable\"),\n additionalDirectories: z\n .array(z.string())\n .optional()\n .describe(\"Additional directories the agent can access beyond cwd\"),\n outputFormat: z\n .object({\n type: z.literal(\"json_schema\"),\n schema: z.record(z.string(), z.unknown()).describe(\"JSON Schema for structured output\"),\n })\n .optional()\n .describe(\"Structured output format with JSON Schema (omit for plain text output)\"),\n thinking: z\n .union([\n z.object({ type: z.literal(\"adaptive\") }),\n z.object({\n type: z.literal(\"enabled\"),\n budgetTokens: z.number().int().positive().describe(\"Token budget for thinking\"),\n }),\n z.object({ type: z.literal(\"disabled\") }),\n ])\n .optional()\n .describe(\"Thinking mode: 'adaptive' (auto), 'enabled' (with budget), or 'disabled'\"),\n resumeSessionAt: z\n .string()\n .optional()\n .describe(\n \"Resume only up to and including a specific message UUID (disk resume fallback only)\"\n ),\n pathToClaudeCodeExecutable: z\n .string()\n .optional()\n .describe(\"Path to the Claude Code executable\"),\n agent: z\n .string()\n .optional()\n .describe(\n \"Name of a custom agent (defined in 'agents') to use as the primary agent. See claude_code tool for details.\"\n ),\n mcpServers: z\n .record(z.string(), z.record(z.string(), z.unknown()))\n .optional()\n .describe(\"MCP server configurations (key: server name, value: server config)\"),\n sandbox: z\n .record(z.string(), z.unknown())\n .optional()\n .describe(\n \"Sandbox configuration for isolating shell command execution. See claude_code tool for details.\"\n ),\n fallbackModel: z\n .string()\n .optional()\n .describe(\"Fallback model if the primary model fails or is unavailable\"),\n enableFileCheckpointing: z\n .boolean()\n .optional()\n .describe(\"Enable file checkpointing to track file changes during the session\"),\n includePartialMessages: z\n .boolean()\n .optional()\n .describe(\n \"When true, includes intermediate streaming messages in the response (e.g., partial tool outputs as they arrive). Useful for real-time progress monitoring. Default: false.\"\n ),\n strictMcpConfig: z\n .boolean()\n .optional()\n .describe(\"Enforce strict validation of MCP server configurations\"),\n settingSources: z\n .array(z.enum([\"user\", \"project\", \"local\"]))\n .optional()\n .describe(\n 'Control which filesystem settings are loaded. Defaults to [\"user\", \"project\", \"local\"] (loads all settings including ~/.claude/settings.json, .claude/settings.json, .claude/settings.local.json, and CLAUDE.md). Pass an empty array [] to disable all settings (SDK isolation mode).'\n ),\n debug: z.boolean().optional().describe(\"Enable debug mode for verbose logging\"),\n debugFile: z\n .string()\n .optional()\n .describe(\"Write debug logs to a specific file path (implicitly enables debug mode)\"),\n env: z\n .record(z.string(), z.string().optional())\n .optional()\n .describe(\n \"Environment variables to merge with process.env and pass to the Claude Code process (user-provided values take precedence)\"\n ),\n },\n async (args) => {\n try {\n const result = await executeClaudeCodeReply(args, sessionManager, allowBypass);\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n isError: result.isError,\n };\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Error [${ErrorCode.INTERNAL}]: ${message}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n\n // Tool 3: claude_code_session - Manage sessions\n server.tool(\n \"claude_code_session\",\n `Manage Claude Code sessions. Actions: 'list' returns all sessions with status and metadata; 'get' returns detailed info for a specific session (requires sessionId); 'cancel' terminates a running session (requires sessionId).`,\n {\n action: z.enum(SESSION_ACTIONS).describe(\"Action to perform: 'list', 'get', or 'cancel'\"),\n sessionId: z.string().optional().describe(\"Session ID (required for 'get' and 'cancel')\"),\n includeSensitive: z\n .boolean()\n .optional()\n .describe(\n \"When true, includes sensitive fields (cwd, systemPrompt, agents, additionalDirectories) in the response. Requires CLAUDE_CODE_MCP_ALLOW_SENSITIVE_SESSION_DETAILS=1 env var. Default: false.\"\n ),\n },\n async (args) => {\n const allowSensitive = process.env.CLAUDE_CODE_MCP_ALLOW_SENSITIVE_SESSION_DETAILS === \"1\";\n if (args.includeSensitive && !allowSensitive) {\n const result = {\n sessions: [],\n message: `Error [${ErrorCode.PERMISSION_DENIED}]: includeSensitive is disabled. Set CLAUDE_CODE_MCP_ALLOW_SENSITIVE_SESSION_DETAILS=1 to enable.`,\n isError: true,\n };\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n isError: true,\n };\n }\n const result = executeClaudeCodeSession(args, sessionManager);\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n isError: result.isError ?? false,\n };\n }\n );\n\n // Tool 4: claude_code_configure - Runtime configuration\n server.tool(\n \"claude_code_configure\",\n `Configure the Claude Code MCP server at runtime.\nActions: 'enable_bypass' allows sessions to use permissionMode='bypassPermissions' (skips all tool permission checks — use with caution); 'disable_bypass' revokes this ability; 'get_config' returns the current server configuration.`,\n {\n action: z\n .enum(CONFIGURE_ACTIONS)\n .describe(\n \"Action to perform: 'enable_bypass' | 'disable_bypass' | 'get_config'. See tool description for details.\"\n ),\n },\n async (args) => {\n const result = executeClaudeCodeConfigure(args, config);\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify(result, null, 2),\n },\n ],\n isError: result.isError ?? false,\n };\n }\n );\n\n // Cleanup on server close\n const originalClose = server.close.bind(server);\n server.close = async () => {\n sessionManager.destroy();\n await originalClose();\n };\n\n return server;\n}\n","/**\n * Session Manager - tracks and manages Claude Code agent sessions\n */\nimport type { 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 ?? \"dontAsk\",\n allowedTools: params.allowedTools,\n disallowedTools: params.disallowedTools,\n tools: params.tools,\n maxTurns: params.maxTurns,\n systemPrompt: params.systemPrompt,\n agents: params.agents,\n maxBudgetUsd: params.maxBudgetUsd,\n effort: params.effort,\n betas: params.betas,\n additionalDirectories: params.additionalDirectories,\n outputFormat: params.outputFormat,\n thinking: params.thinking,\n persistSession: params.persistSession,\n pathToClaudeCodeExecutable: params.pathToClaudeCodeExecutable,\n agent: params.agent,\n mcpServers: params.mcpServers,\n sandbox: params.sandbox,\n fallbackModel: params.fallbackModel,\n enableFileCheckpointing: params.enableFileCheckpointing,\n includePartialMessages: params.includePartialMessages,\n strictMcpConfig: params.strictMcpConfig,\n settingSources: params.settingSources,\n debug: params.debug,\n debugFile: params.debugFile,\n env: params.env,\n abortController: params.abortController,\n };\n this.sessions.set(params.sessionId, info);\n return info;\n }\n\n get(sessionId: string): SessionInfo | undefined {\n return this.sessions.get(sessionId);\n }\n\n list(): SessionInfo[] {\n return Array.from(this.sessions.values());\n }\n\n update(\n sessionId: string,\n patch: Partial<Omit<SessionInfo, \"sessionId\" | \"createdAt\" | \"lastActiveAt\">>\n ): SessionInfo | undefined {\n const info = this.sessions.get(sessionId);\n if (!info) return undefined;\n Object.assign(info, patch, { lastActiveAt: new Date().toISOString() });\n return info;\n }\n\n /**\n * Atomically transition a session from an expected status to \"running\".\n * Returns the session if successful, undefined if the session doesn't exist\n * or its current status doesn't match `expectedStatus`.\n */\n tryAcquire(\n sessionId: string,\n expectedStatus: SessionStatus,\n abortController: AbortController\n ): SessionInfo | undefined {\n if (expectedStatus !== \"idle\" && expectedStatus !== \"error\") return undefined;\n const info = this.sessions.get(sessionId);\n if (!info || info.status !== expectedStatus) return undefined;\n info.status = \"running\";\n info.abortController = abortController;\n info.lastActiveAt = new Date().toISOString();\n return info;\n }\n\n cancel(sessionId: string): boolean {\n const info = this.sessions.get(sessionId);\n if (!info) return false;\n if (info.status !== \"running\") return false;\n if (info.abortController) {\n info.abortController.abort();\n }\n info.status = \"cancelled\";\n info.lastActiveAt = new Date().toISOString();\n return true;\n }\n\n delete(sessionId: string): boolean {\n return this.sessions.delete(sessionId);\n }\n\n /** Remove sessions that have been idle for too long, or stuck running too long */\n private cleanup(): void {\n const now = Date.now();\n for (const [id, info] of this.sessions) {\n const lastActive = new Date(info.lastActiveAt).getTime();\n if (Number.isNaN(lastActive)) {\n // Invalid timestamp — remove the session\n this.sessions.delete(id);\n } else if (info.status === \"running\" && now - lastActive > this.runningSessionMaxMs) {\n // Stuck running session — abort and mark as error\n if (info.abortController) info.abortController.abort();\n info.status = \"error\";\n info.lastActiveAt = new Date().toISOString();\n } else if (info.status !== \"running\" && now - lastActive > this.sessionTtlMs) {\n this.sessions.delete(id);\n }\n }\n }\n\n /** 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\";\nimport { enhanceWindowsError } from \"../utils/windows.js\";\n\nexport interface ClaudeCodeInput {\n prompt: string;\n cwd?: string;\n allowedTools?: string[];\n disallowedTools?: string[];\n permissionMode?: PermissionMode;\n maxTurns?: number;\n model?: string;\n systemPrompt?: string | { type: \"preset\"; preset: \"claude_code\"; append?: string };\n agents?: Record<string, AgentDefinition>;\n maxBudgetUsd?: number;\n effort?: EffortLevel;\n betas?: string[];\n additionalDirectories?: string[];\n outputFormat?: { type: \"json_schema\"; schema: Record<string, unknown> };\n thinking?:\n | { type: \"adaptive\" }\n | { type: \"enabled\"; budgetTokens: number }\n | { type: \"disabled\" };\n tools?: string[] | { type: \"preset\"; preset: \"claude_code\" };\n persistSession?: boolean;\n pathToClaudeCodeExecutable?: string;\n timeout?: number;\n agent?: string;\n mcpServers?: Record<string, McpServerConfig>;\n sandbox?: SandboxSettings;\n fallbackModel?: string;\n enableFileCheckpointing?: boolean;\n includePartialMessages?: boolean;\n strictMcpConfig?: boolean;\n settingSources?: SettingSource[];\n debug?: boolean;\n debugFile?: string;\n env?: Record<string, string | undefined>;\n}\n\nexport async function executeClaudeCode(\n input: ClaudeCodeInput,\n sessionManager: SessionManager,\n serverCwd: string,\n allowBypass = false\n): Promise<AgentResult> {\n const cwd = input.cwd !== undefined ? input.cwd : serverCwd;\n\n if (typeof cwd !== \"string\" || cwd.trim() === \"\") {\n return {\n sessionId: \"\",\n result: `Error [${ErrorCode.INVALID_ARGUMENT}]: cwd must be a non-empty string.`,\n isError: true,\n durationMs: 0,\n numTurns: 0,\n totalCostUsd: 0,\n };\n }\n\n let sessionId = \"\";\n let resultText = \"\";\n let isError = false;\n let durationMs = 0;\n let durationApiMs: number | undefined;\n let numTurns = 0;\n let totalCostUsd = 0;\n let sessionTotalTurns: number | undefined;\n let sessionTotalCostUsd: number | undefined;\n let structuredOutput: unknown;\n let stopReason: string | null | undefined;\n let errorSubtype: string | undefined;\n let usage: Record<string, unknown> | undefined;\n let modelUsage: Record<string, unknown> | undefined;\n let permissionDenials: AgentResult[\"permissionDenials\"] | undefined;\n let seenResult = false;\n let timedOut = false;\n\n // Security: block bypassPermissions unless explicitly allowed\n if (input.permissionMode === \"bypassPermissions\" && !allowBypass) {\n return {\n sessionId: \"\",\n result: `Error [${ErrorCode.PERMISSION_DENIED}]: bypassPermissions is disabled on this server. Use the claude_code_configure tool with action 'enable_bypass' to enable it.`,\n isError: true,\n durationMs: 0,\n numTurns: 0,\n totalCostUsd: 0,\n };\n }\n\n const abortController = new AbortController();\n\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n try {\n if (input.timeout !== undefined) {\n timeoutId = setTimeout(() => {\n timedOut = true;\n abortController.abort();\n }, input.timeout);\n }\n\n // Build options for the Agent SDK query()\n // Default to \"dontAsk\" permission mode in MCP context (non-interactive)\n const effectivePermissionMode = input.permissionMode ?? \"dontAsk\";\n\n const options: Partial<Options> = {\n cwd,\n abortController,\n permissionMode: effectivePermissionMode,\n };\n\n if (input.allowedTools !== undefined) options.allowedTools = input.allowedTools;\n if (input.disallowedTools !== undefined) options.disallowedTools = input.disallowedTools;\n if (input.maxTurns !== undefined) options.maxTurns = input.maxTurns;\n if (input.model !== undefined) options.model = input.model;\n if (input.maxBudgetUsd !== undefined) options.maxBudgetUsd = input.maxBudgetUsd;\n if (input.agents !== undefined) options.agents = input.agents as Options[\"agents\"];\n if (input.effort !== undefined) options.effort = input.effort;\n if (input.betas !== undefined) options.betas = input.betas as Options[\"betas\"];\n if (input.additionalDirectories !== undefined)\n options.additionalDirectories = input.additionalDirectories;\n if (input.outputFormat !== undefined) options.outputFormat = input.outputFormat;\n if (input.thinking !== undefined) options.thinking = input.thinking;\n if (input.tools !== undefined) options.tools = input.tools;\n if (input.persistSession !== undefined) options.persistSession = input.persistSession;\n if (input.pathToClaudeCodeExecutable !== undefined)\n options.pathToClaudeCodeExecutable = input.pathToClaudeCodeExecutable;\n if (input.agent !== undefined) options.agent = input.agent;\n if (input.mcpServers !== undefined)\n options.mcpServers = input.mcpServers as Options[\"mcpServers\"];\n if (input.sandbox !== undefined) options.sandbox = input.sandbox;\n if (input.fallbackModel !== undefined) options.fallbackModel = input.fallbackModel;\n if (input.enableFileCheckpointing !== undefined)\n options.enableFileCheckpointing = input.enableFileCheckpointing;\n if (input.includePartialMessages !== undefined)\n options.includePartialMessages = input.includePartialMessages;\n if (input.strictMcpConfig !== undefined) options.strictMcpConfig = input.strictMcpConfig;\n if (input.settingSources !== undefined) options.settingSources = input.settingSources;\n else options.settingSources = DEFAULT_SETTING_SOURCES;\n if (input.debug !== undefined) options.debug = input.debug;\n if (input.debugFile !== undefined) options.debugFile = input.debugFile;\n if (input.env !== undefined) options.env = { ...process.env, ...input.env };\n\n if (effectivePermissionMode === \"bypassPermissions\") {\n options.allowDangerouslySkipPermissions = true;\n }\n\n if (input.systemPrompt !== undefined) options.systemPrompt = input.systemPrompt;\n\n // No placeholder session - we create the session only after receiving the init message\n for await (const message of query({\n prompt: input.prompt,\n options,\n })) {\n if (message.type === \"system\" && message.subtype === \"init\") {\n if (sessionId) continue;\n sessionId = message.session_id;\n sessionManager.create({\n sessionId,\n cwd,\n model: input.model,\n permissionMode: effectivePermissionMode,\n allowedTools: input.allowedTools,\n disallowedTools: input.disallowedTools,\n tools: input.tools,\n maxTurns: input.maxTurns,\n systemPrompt: input.systemPrompt,\n agents: input.agents as Record<string, AgentDefinition> | undefined,\n maxBudgetUsd: input.maxBudgetUsd,\n effort: input.effort,\n betas: input.betas,\n additionalDirectories: input.additionalDirectories,\n outputFormat: input.outputFormat,\n thinking: input.thinking,\n persistSession: input.persistSession,\n pathToClaudeCodeExecutable: input.pathToClaudeCodeExecutable,\n agent: input.agent,\n mcpServers: input.mcpServers,\n sandbox: input.sandbox,\n fallbackModel: input.fallbackModel,\n enableFileCheckpointing: input.enableFileCheckpointing,\n includePartialMessages: input.includePartialMessages,\n strictMcpConfig: input.strictMcpConfig,\n settingSources: input.settingSources ?? DEFAULT_SETTING_SOURCES,\n debug: input.debug,\n debugFile: input.debugFile,\n env: input.env,\n abortController,\n });\n }\n\n if (message.type === \"result\") {\n if (seenResult) continue;\n seenResult = true;\n\n const result: SDKResultMessage = message;\n durationMs = result.duration_ms;\n durationApiMs = result.duration_api_ms;\n numTurns = result.num_turns;\n totalCostUsd = result.total_cost_usd;\n isError = result.is_error;\n stopReason = result.stop_reason;\n usage = result.usage;\n modelUsage = result.modelUsage;\n permissionDenials = result.permission_denials;\n\n if (result.subtype === \"success\") {\n resultText = result.result;\n structuredOutput = result.structured_output;\n } else {\n isError = true;\n errorSubtype = result.subtype;\n resultText =\n result.errors.map(String).join(\"\\n\") || `Error [${result.subtype}]: Unknown error`;\n }\n\n break;\n }\n }\n } catch (err: unknown) {\n isError = true;\n // Detect abort/cancellation errors\n const isAborted =\n abortController.signal.aborted ||\n err instanceof AbortError ||\n (err instanceof Error && err.name === \"AbortError\");\n if (isAborted) {\n resultText = timedOut\n ? `Error [${ErrorCode.TIMEOUT}]: Session timed out after ${input.timeout}ms.`\n : `Error [${ErrorCode.CANCELLED}]: Session was cancelled.`;\n } else {\n resultText = enhanceWindowsError(err instanceof Error ? err.message : String(err));\n }\n if (sessionId) {\n const current = sessionManager.get(sessionId);\n if (current) {\n // Don't overwrite terminal states; treat timeout as error (retryable)\n if (timedOut && current.status !== \"cancelled\" && current.status !== \"error\") {\n sessionManager.update(sessionId, { status: \"error\" });\n } else if (isAborted && current.status === \"running\") {\n sessionManager.update(sessionId, { status: \"cancelled\" });\n } else if (!isAborted && current.status !== \"cancelled\") {\n sessionManager.update(sessionId, { status: \"error\" });\n }\n }\n }\n } finally {\n if (timeoutId) clearTimeout(timeoutId);\n }\n\n // Some SDK abort paths end the stream without throwing. Ensure aborts become TIMEOUT/CANCELLED,\n // not an INTERNAL \"missing_result\" error.\n if (!seenResult && !isError && abortController.signal.aborted) {\n isError = true;\n resultText = timedOut\n ? `Error [${ErrorCode.TIMEOUT}]: Session timed out after ${input.timeout}ms.`\n : `Error [${ErrorCode.CANCELLED}]: Session was cancelled.`;\n }\n\n if (sessionId && !seenResult && !isError) {\n isError = true;\n errorSubtype = errorSubtype ?? \"missing_result\";\n const noResultMsg = `Error [${ErrorCode.INTERNAL}]: No result message received from agent.`;\n resultText = resultText ? `${noResultMsg} Original: ${resultText}` : noResultMsg;\n }\n\n // Update session to idle (or error), clear abortController\n // Preserve \"cancelled\" status if session was cancelled during execution\n if (sessionId) {\n const current = sessionManager.get(sessionId);\n if (current && current.status !== \"cancelled\") {\n sessionManager.update(sessionId, {\n status: isError ? \"error\" : \"idle\",\n totalTurns: numTurns,\n totalCostUsd,\n abortController: undefined,\n });\n const updated = sessionManager.get(sessionId);\n sessionTotalTurns = updated?.totalTurns;\n sessionTotalCostUsd = updated?.totalCostUsd;\n } else if (current) {\n // Session was cancelled — just clear the abortController and update totals\n sessionManager.update(sessionId, {\n totalTurns: numTurns,\n totalCostUsd,\n abortController: undefined,\n });\n const updated = sessionManager.get(sessionId);\n sessionTotalTurns = updated?.totalTurns;\n sessionTotalCostUsd = updated?.totalCostUsd;\n }\n } else {\n // No session ID means something went wrong regardless of result content\n isError = true;\n const noInitMsg = timedOut\n ? `Error [${ErrorCode.TIMEOUT}]: Session timed out after ${input.timeout}ms (no session ID received).`\n : `Error [${ErrorCode.INTERNAL}]: No session ID received from agent.`;\n resultText = resultText ? `${noInitMsg} Original: ${resultText}` : noInitMsg;\n }\n\n return {\n sessionId,\n result: resultText,\n isError,\n durationMs,\n durationApiMs,\n numTurns,\n totalCostUsd,\n sessionTotalTurns,\n sessionTotalCostUsd,\n structuredOutput,\n stopReason,\n errorSubtype,\n usage,\n modelUsage,\n permissionDenials,\n };\n}\n","/**\n * Type definitions for claude-code-mcp\n *\n * Shared constants are defined as tuples so both Zod schemas and\n * TypeScript types can derive from the same source of truth.\n */\n\n/** Permission modes supported by Claude Agent SDK */\nexport const PERMISSION_MODES = [\n \"default\",\n \"acceptEdits\",\n \"bypassPermissions\",\n \"plan\",\n \"delegate\",\n \"dontAsk\",\n] as const;\nexport type PermissionMode = (typeof PERMISSION_MODES)[number];\n\n/** Effort levels */\nexport const EFFORT_LEVELS = [\"low\", \"medium\", \"high\", \"max\"] as const;\nexport type EffortLevel = (typeof EFFORT_LEVELS)[number];\n\n/** Subagent model options */\nexport const AGENT_MODELS = [\"sonnet\", \"opus\", \"haiku\", \"inherit\"] as const;\nexport type AgentModel = (typeof AGENT_MODELS)[number];\n\n/** Configure tool actions */\nexport const CONFIGURE_ACTIONS = [\"enable_bypass\", \"disable_bypass\", \"get_config\"] as const;\nexport type ConfigureAction = (typeof CONFIGURE_ACTIONS)[number];\n\n/** Session management actions */\nexport const SESSION_ACTIONS = [\"list\", \"get\", \"cancel\"] as const;\nexport type SessionAction = (typeof SESSION_ACTIONS)[number];\n\n/** Session status */\nexport type SessionStatus = \"idle\" | \"running\" | \"cancelled\" | \"error\";\n\nexport type SystemPrompt = string | { type: \"preset\"; preset: \"claude_code\"; append?: string };\n\nexport type OutputFormat = { type: \"json_schema\"; schema: Record<string, unknown> };\n\nexport type ThinkingConfig =\n | { type: \"adaptive\" }\n | { type: \"enabled\"; budgetTokens: number }\n | { type: \"disabled\" };\n\nexport type ToolsConfig = string[] | { type: \"preset\"; preset: \"claude_code\" };\n\n/** Subagent definition */\nexport interface AgentDefinition {\n description: string;\n prompt: string;\n tools?: string[];\n disallowedTools?: string[];\n model?: AgentModel;\n maxTurns?: number;\n mcpServers?: (string | Record<string, unknown>)[];\n skills?: string[];\n criticalSystemReminder_EXPERIMENTAL?: string;\n}\n\n/** MCP server configuration for the SDK */\nexport type McpServerConfig = Record<string, unknown>;\n\n/** Sandbox configuration for isolating shell command execution */\nexport type SandboxSettings = Record<string, unknown>;\n\n/** Setting source for controlling which filesystem settings are loaded */\nexport type SettingSource = \"user\" | \"project\" | \"local\";\n\n/** Default setting sources — load all filesystem settings for ease of use */\nexport const DEFAULT_SETTING_SOURCES: SettingSource[] = [\"user\", \"project\", \"local\"];\n\n/** Session metadata stored by the session manager */\nexport interface SessionInfo {\n sessionId: string;\n status: SessionStatus;\n createdAt: string;\n lastActiveAt: string;\n totalTurns: number;\n totalCostUsd: number;\n cwd: string;\n model?: string;\n pathToClaudeCodeExecutable?: string;\n permissionMode: PermissionMode;\n allowedTools?: string[];\n disallowedTools?: string[];\n tools?: ToolsConfig;\n maxTurns?: number;\n systemPrompt?: SystemPrompt;\n agents?: Record<string, AgentDefinition>;\n maxBudgetUsd?: number;\n effort?: EffortLevel;\n betas?: string[];\n additionalDirectories?: string[];\n outputFormat?: OutputFormat;\n thinking?: ThinkingConfig;\n persistSession?: boolean;\n /** Primary agent name (from 'agents' definitions) */\n agent?: string;\n /** MCP server configurations (key: server name, value: server config) */\n mcpServers?: Record<string, McpServerConfig>;\n /** Sandbox configuration for isolating shell command execution */\n sandbox?: SandboxSettings;\n /** Fallback model if the primary model fails or is unavailable */\n fallbackModel?: string;\n /** Enable file checkpointing to track file changes */\n enableFileCheckpointing?: boolean;\n /** When true, includes intermediate streaming messages in the response */\n includePartialMessages?: boolean;\n /** Enforce strict validation of MCP server configurations */\n strictMcpConfig?: boolean;\n /** Control which filesystem settings are loaded */\n settingSources?: SettingSource[];\n /** Enable debug mode */\n debug?: boolean;\n /** Write debug logs to a specific file path */\n debugFile?: string;\n /** Environment variables passed to the Claude Code process */\n env?: Record<string, string | undefined>;\n abortController?: AbortController;\n}\n\n/** Session metadata safe to return by default (redacts paths and prompts) */\nexport interface PublicSessionInfo {\n sessionId: string;\n status: SessionStatus;\n createdAt: string;\n lastActiveAt: string;\n totalTurns: number;\n totalCostUsd: number;\n model?: string;\n permissionMode: PermissionMode;\n allowedTools?: string[];\n disallowedTools?: string[];\n tools?: ToolsConfig;\n maxTurns?: number;\n maxBudgetUsd?: number;\n effort?: EffortLevel;\n betas?: string[];\n outputFormat?: OutputFormat;\n thinking?: ThinkingConfig;\n persistSession?: boolean;\n agent?: string;\n fallbackModel?: string;\n enableFileCheckpointing?: boolean;\n includePartialMessages?: boolean;\n strictMcpConfig?: boolean;\n debug?: boolean;\n}\n\n/** Result returned from a claude_code or claude_code_reply call */\nexport interface AgentResult {\n sessionId: string;\n result: string;\n isError: boolean;\n durationMs: number;\n durationApiMs?: number;\n numTurns: number;\n totalCostUsd: number;\n sessionTotalTurns?: number;\n sessionTotalCostUsd?: number;\n structuredOutput?: unknown;\n stopReason?: string | null;\n errorSubtype?: string;\n usage?: Record<string, unknown>;\n modelUsage?: Record<string, unknown>;\n permissionDenials?: Array<{\n tool_name: string;\n tool_use_id: string;\n tool_input: Record<string, unknown>;\n }>;\n}\n\n/** Error codes for structured error responses */\nexport enum ErrorCode {\n INVALID_ARGUMENT = \"INVALID_ARGUMENT\",\n SESSION_NOT_FOUND = \"SESSION_NOT_FOUND\",\n SESSION_BUSY = \"SESSION_BUSY\",\n PERMISSION_DENIED = \"PERMISSION_DENIED\",\n TIMEOUT = \"TIMEOUT\",\n CANCELLED = \"CANCELLED\",\n INTERNAL = \"INTERNAL\",\n}\n","/**\n * Windows-specific utilities for Git Bash detection\n */\nimport { existsSync } from \"node:fs\";\nimport { execSync } from \"node:child_process\";\nimport { join, dirname } from \"node:path\";\n\nexport function isWindows(): boolean {\n return process.platform === \"win32\";\n}\n\n/**\n * Attempt to locate bash.exe on Windows using the same logic as the Claude CLI:\n * 1. Check CLAUDE_CODE_GIT_BASH_PATH env var\n * 2. Find `git` in PATH and derive bash.exe from it\n *\n * Returns the resolved path, or null if not found.\n */\nexport function findGitBash(): string | null {\n if (process.env.CLAUDE_CODE_GIT_BASH_PATH) {\n if (existsSync(process.env.CLAUDE_CODE_GIT_BASH_PATH)) {\n return process.env.CLAUDE_CODE_GIT_BASH_PATH;\n }\n return null; // env var set but path doesn't exist\n }\n\n try {\n const gitPath = execSync(\"where git\", { encoding: \"utf8\" }).trim().split(/\\r?\\n/)[0];\n if (gitPath) {\n // git is typically at <root>/cmd/git.exe or <root>/mingw64/bin/git.exe\n // bash.exe is at <root>/bin/bash.exe\n const bashPath = join(dirname(gitPath), \"..\", \"..\", \"bin\", \"bash.exe\");\n if (existsSync(bashPath)) return bashPath;\n // Also try: git at <root>/bin/git.exe → same dir\n const bashPath2 = join(dirname(gitPath), \"bash.exe\");\n if (existsSync(bashPath2)) return bashPath2;\n }\n } catch {\n // `where git` failed — git not in PATH\n }\n\n return null;\n}\n\n/**\n * Log a startup warning if running on Windows without a detectable bash.exe.\n */\nexport function checkWindowsBashAvailability(): void {\n if (!isWindows()) return;\n\n const bashPath = findGitBash();\n if (bashPath) {\n console.error(`[windows] Git Bash detected: ${bashPath}`);\n return;\n }\n\n const hint = process.env.CLAUDE_CODE_GIT_BASH_PATH\n ? `CLAUDE_CODE_GIT_BASH_PATH is set to \"${process.env.CLAUDE_CODE_GIT_BASH_PATH}\" but the file does not exist.`\n : \"CLAUDE_CODE_GIT_BASH_PATH is not set and git was not found in PATH.\";\n\n console.error(\n `[windows] WARNING: ${hint}\\n` +\n ` The Claude Code CLI requires Git Bash on Windows.\\n` +\n ` Install Git for Windows (https://git-scm.com/downloads/win) and either:\\n` +\n ` 1. Add git to PATH, or\\n` +\n ` 2. Set CLAUDE_CODE_GIT_BASH_PATH to your bash.exe path\\n` +\n ` Example: CLAUDE_CODE_GIT_BASH_PATH=C:\\\\Program Files\\\\Git\\\\bin\\\\bash.exe\\n` +\n ` See README.md \"Windows Support\" section for MCP client config examples.`\n );\n}\n\nconst WINDOWS_BASH_HINT =\n \"\\n\\n[Windows] The Claude Code CLI requires Git Bash. \" +\n \"Set CLAUDE_CODE_GIT_BASH_PATH in your MCP server config or system environment. \" +\n 'See README.md \"Windows Support\" section for details.';\n\n/**\n * If the error looks like a Windows bash.exe issue, append a helpful hint.\n */\nexport function enhanceWindowsError(errorMessage: string): string {\n if (!isWindows()) return errorMessage;\n if (\n errorMessage.includes(\"git-bash\") ||\n errorMessage.includes(\"bash.exe\") ||\n errorMessage.includes(\"CLAUDE_CODE_GIT_BASH_PATH\")\n ) {\n return errorMessage + WINDOWS_BASH_HINT;\n }\n return errorMessage;\n}\n","/**\n * claude_code_reply tool - Continue an existing Claude Code session\n */\nimport { query, AbortError } from \"@anthropic-ai/claude-agent-sdk\";\nimport type { Options, SDKResultMessage } from \"@anthropic-ai/claude-agent-sdk\";\nimport type { SessionManager } from \"../session/manager.js\";\nimport type {\n AgentDefinition,\n AgentResult,\n EffortLevel,\n McpServerConfig,\n OutputFormat,\n PermissionMode,\n SandboxSettings,\n SettingSource,\n SystemPrompt,\n ThinkingConfig,\n ToolsConfig,\n} from \"../types.js\";\nimport { ErrorCode, DEFAULT_SETTING_SOURCES } from \"../types.js\";\nimport { enhanceWindowsError } from \"../utils/windows.js\";\n\nexport interface ClaudeCodeReplyInput {\n sessionId: string;\n prompt: string;\n forkSession?: boolean;\n timeout?: number;\n\n /**\n * Optional overrides used for \"disk resume\" when the in-memory session is missing.\n * Enabled only when `CLAUDE_CODE_MCP_ALLOW_DISK_RESUME=1`.\n */\n cwd?: string;\n allowedTools?: string[];\n disallowedTools?: string[];\n tools?: ToolsConfig;\n permissionMode?: PermissionMode;\n maxTurns?: number;\n model?: string;\n systemPrompt?: SystemPrompt;\n agents?: Record<string, AgentDefinition>;\n maxBudgetUsd?: number;\n effort?: EffortLevel;\n betas?: string[];\n additionalDirectories?: string[];\n outputFormat?: OutputFormat;\n thinking?: ThinkingConfig;\n persistSession?: boolean;\n resumeSessionAt?: string;\n pathToClaudeCodeExecutable?: string;\n agent?: string;\n mcpServers?: Record<string, McpServerConfig>;\n sandbox?: SandboxSettings;\n fallbackModel?: string;\n enableFileCheckpointing?: boolean;\n includePartialMessages?: boolean;\n strictMcpConfig?: boolean;\n settingSources?: SettingSource[];\n debug?: boolean;\n debugFile?: string;\n env?: Record<string, string | undefined>;\n}\n\nexport async function executeClaudeCodeReply(\n input: ClaudeCodeReplyInput,\n sessionManager: SessionManager,\n allowBypass = false\n): Promise<AgentResult> {\n const session = sessionManager.get(input.sessionId);\n if (!session) {\n const allowDiskResume = process.env.CLAUDE_CODE_MCP_ALLOW_DISK_RESUME === \"1\";\n if (!allowDiskResume) {\n return {\n sessionId: input.sessionId,\n result: `Error [${ErrorCode.SESSION_NOT_FOUND}]: Session '${input.sessionId}' not found or expired.`,\n isError: true,\n durationMs: 0,\n numTurns: 0,\n totalCostUsd: 0,\n };\n }\n\n return executeClaudeCodeReplyDiskResume(input, sessionManager, allowBypass);\n }\n\n if (session.status === \"running\") {\n return {\n sessionId: input.sessionId,\n result: `Error [${ErrorCode.SESSION_BUSY}]: Session is currently running. Wait for it to complete or cancel it.`,\n isError: true,\n durationMs: 0,\n numTurns: 0,\n totalCostUsd: 0,\n };\n }\n\n if (session.status === \"cancelled\") {\n return {\n sessionId: input.sessionId,\n result: `Error [${ErrorCode.CANCELLED}]: Session '${input.sessionId}' has been cancelled and cannot be resumed.`,\n isError: true,\n durationMs: 0,\n numTurns: 0,\n totalCostUsd: 0,\n };\n }\n\n // Security: block resume/fork of bypassPermissions sessions when bypass is disabled\n if (session.permissionMode === \"bypassPermissions\" && !allowBypass) {\n return {\n sessionId: input.sessionId,\n result: `Error [${ErrorCode.PERMISSION_DENIED}]: Cannot resume a bypassPermissions session while bypass is disabled. Use the claude_code_configure tool with action 'enable_bypass' first.`,\n isError: true,\n durationMs: 0,\n numTurns: 0,\n totalCostUsd: 0,\n };\n }\n\n // Atomically acquire the session (compare-and-set: idle/error → running)\n const originalStatus = session.status;\n const abortController = new AbortController();\n let timedOut = false;\n const acquired = sessionManager.tryAcquire(input.sessionId, originalStatus, abortController);\n if (!acquired) {\n const current = sessionManager.get(input.sessionId);\n if (!current) {\n return {\n sessionId: input.sessionId,\n result: `Error [${ErrorCode.SESSION_NOT_FOUND}]: Session '${input.sessionId}' not found or expired.`,\n isError: true,\n durationMs: 0,\n numTurns: 0,\n totalCostUsd: 0,\n };\n }\n // Another concurrent call acquired it first, or status changed\n return {\n sessionId: input.sessionId,\n result: `Error [${ErrorCode.SESSION_BUSY}]: Session is not available (status: ${current.status}).`,\n isError: true,\n durationMs: 0,\n numTurns: 0,\n totalCostUsd: 0,\n };\n }\n\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n if (input.timeout !== undefined) {\n timeoutId = setTimeout(() => {\n timedOut = true;\n abortController.abort();\n }, input.timeout);\n }\n\n let resultText = \"\";\n let isError = false;\n let durationMs = 0;\n let durationApiMs: number | undefined;\n let numTurns = 0;\n let totalCostUsd = 0;\n let sessionTotalTurns: number | undefined;\n let sessionTotalCostUsd: number | undefined;\n let newSessionId = input.sessionId;\n let structuredOutput: unknown;\n let stopReason: string | null | undefined;\n let errorSubtype: string | undefined;\n let usage: Record<string, unknown> | undefined;\n let modelUsage: Record<string, unknown> | undefined;\n let permissionDenials: AgentResult[\"permissionDenials\"] | undefined;\n let seenResult = false;\n let forkSessionCreated = false;\n\n try {\n const options: Partial<Options> = {\n resume: input.sessionId,\n abortController,\n cwd: session.cwd,\n permissionMode: session.permissionMode,\n };\n\n if (session.allowedTools !== undefined) options.allowedTools = session.allowedTools;\n if (session.disallowedTools !== undefined) options.disallowedTools = session.disallowedTools;\n if (session.maxTurns !== undefined) options.maxTurns = session.maxTurns;\n if (session.model !== undefined) options.model = session.model;\n if (session.maxBudgetUsd !== undefined) options.maxBudgetUsd = session.maxBudgetUsd;\n if (session.agents !== undefined) options.agents = session.agents as Options[\"agents\"];\n if (session.effort !== undefined) options.effort = session.effort;\n if (session.betas !== undefined) options.betas = session.betas as Options[\"betas\"];\n if (session.additionalDirectories !== undefined)\n options.additionalDirectories = session.additionalDirectories;\n if (session.outputFormat !== undefined) options.outputFormat = session.outputFormat;\n if (session.thinking !== undefined) options.thinking = session.thinking;\n if (session.tools !== undefined) options.tools = session.tools;\n if (session.systemPrompt !== undefined) options.systemPrompt = session.systemPrompt;\n if (session.persistSession !== undefined) options.persistSession = session.persistSession;\n if (session.pathToClaudeCodeExecutable !== undefined)\n options.pathToClaudeCodeExecutable = session.pathToClaudeCodeExecutable;\n if (session.agent !== undefined) options.agent = session.agent;\n if (session.mcpServers !== undefined)\n options.mcpServers = session.mcpServers as Options[\"mcpServers\"];\n if (session.sandbox !== undefined) options.sandbox = session.sandbox;\n if (session.fallbackModel !== undefined) options.fallbackModel = session.fallbackModel;\n if (session.enableFileCheckpointing !== undefined)\n options.enableFileCheckpointing = session.enableFileCheckpointing;\n if (session.includePartialMessages !== undefined)\n options.includePartialMessages = session.includePartialMessages;\n if (session.strictMcpConfig !== undefined) options.strictMcpConfig = session.strictMcpConfig;\n if (session.settingSources !== undefined) options.settingSources = session.settingSources;\n else options.settingSources = DEFAULT_SETTING_SOURCES;\n if (session.debug !== undefined) options.debug = session.debug;\n if (session.debugFile !== undefined) options.debugFile = session.debugFile;\n if (session.env !== undefined) options.env = { ...process.env, ...session.env };\n\n if (session.permissionMode === \"bypassPermissions\") {\n options.allowDangerouslySkipPermissions = true;\n }\n\n if (input.forkSession) {\n options.forkSession = true;\n }\n\n for await (const message of query({\n prompt: input.prompt,\n options,\n })) {\n // If forked, capture the new session ID\n if (input.forkSession && message.type === \"system\" && message.subtype === \"init\") {\n newSessionId = message.session_id;\n // Note: forked session shares abortController during this query() call.\n // This is correct — both run in the same SDK process. After completion,\n // each session's abortController is cleared independently.\n if (!forkSessionCreated && newSessionId !== input.sessionId) {\n sessionManager.create({\n sessionId: newSessionId,\n cwd: session.cwd,\n model: session.model,\n permissionMode: session.permissionMode,\n allowedTools: session.allowedTools,\n disallowedTools: session.disallowedTools,\n tools: session.tools,\n maxTurns: session.maxTurns,\n systemPrompt: session.systemPrompt,\n agents: session.agents,\n maxBudgetUsd: session.maxBudgetUsd,\n effort: session.effort,\n betas: session.betas,\n additionalDirectories: session.additionalDirectories,\n outputFormat: session.outputFormat,\n thinking: session.thinking,\n persistSession: session.persistSession,\n pathToClaudeCodeExecutable: session.pathToClaudeCodeExecutable,\n agent: session.agent,\n mcpServers: session.mcpServers,\n sandbox: session.sandbox,\n fallbackModel: session.fallbackModel,\n enableFileCheckpointing: session.enableFileCheckpointing,\n includePartialMessages: session.includePartialMessages,\n strictMcpConfig: session.strictMcpConfig,\n settingSources: session.settingSources ?? DEFAULT_SETTING_SOURCES,\n debug: session.debug,\n debugFile: session.debugFile,\n env: session.env,\n abortController,\n });\n forkSessionCreated = true;\n }\n }\n\n if (message.type === \"result\") {\n if (seenResult) continue;\n seenResult = true;\n\n const result: SDKResultMessage = message;\n durationMs = result.duration_ms;\n durationApiMs = result.duration_api_ms;\n numTurns = result.num_turns;\n totalCostUsd = result.total_cost_usd;\n isError = result.is_error;\n stopReason = result.stop_reason;\n usage = result.usage;\n modelUsage = result.modelUsage;\n permissionDenials = result.permission_denials;\n\n if (result.subtype === \"success\") {\n resultText = result.result;\n structuredOutput = result.structured_output;\n } else {\n isError = true;\n errorSubtype = result.subtype;\n resultText =\n result.errors.map(String).join(\"\\n\") || `Error [${result.subtype}]: Unknown error`;\n }\n\n break;\n }\n }\n } catch (err: unknown) {\n isError = true;\n const isAborted =\n abortController.signal.aborted ||\n err instanceof AbortError ||\n (err instanceof Error && err.name === \"AbortError\");\n if (isAborted) {\n resultText = timedOut\n ? `Error [${ErrorCode.TIMEOUT}]: Session timed out after ${input.timeout}ms.`\n : `Error [${ErrorCode.CANCELLED}]: Session was cancelled.`;\n } else {\n resultText = enhanceWindowsError(err instanceof Error ? err.message : String(err));\n }\n } finally {\n if (timeoutId) clearTimeout(timeoutId);\n }\n\n // Some SDK abort paths end the stream without throwing. Ensure aborts become TIMEOUT/CANCELLED,\n // not an INTERNAL \"missing_result\" error.\n if (!seenResult && !isError && abortController.signal.aborted) {\n isError = true;\n resultText = timedOut\n ? `Error [${ErrorCode.TIMEOUT}]: Session timed out after ${input.timeout}ms.`\n : `Error [${ErrorCode.CANCELLED}]: Session was cancelled.`;\n }\n\n if (!seenResult && !isError) {\n isError = true;\n errorSubtype = errorSubtype ?? \"missing_result\";\n const noResultMsg = `Error [${ErrorCode.INTERNAL}]: No result message received from agent.`;\n resultText = resultText ? `${noResultMsg} Original: ${resultText}` : noResultMsg;\n }\n\n // Update session state, clear abortController\n // Preserve \"cancelled\" status if session was cancelled during execution\n if (input.forkSession && newSessionId !== input.sessionId) {\n const forkedCurrent = sessionManager.get(newSessionId);\n if (forkedCurrent && forkedCurrent.status !== \"cancelled\") {\n sessionManager.update(newSessionId, {\n status: isError ? \"error\" : \"idle\",\n totalTurns: numTurns,\n totalCostUsd,\n abortController: undefined,\n });\n const updatedFork = sessionManager.get(newSessionId);\n sessionTotalTurns = updatedFork?.totalTurns;\n sessionTotalCostUsd = updatedFork?.totalCostUsd;\n } else if (forkedCurrent) {\n sessionManager.update(newSessionId, {\n totalTurns: numTurns,\n totalCostUsd,\n abortController: undefined,\n });\n const updatedFork = sessionManager.get(newSessionId);\n sessionTotalTurns = updatedFork?.totalTurns;\n sessionTotalCostUsd = updatedFork?.totalCostUsd;\n }\n // Restore original session to its pre-fork status (not always \"idle\")\n const origCurrent = sessionManager.get(input.sessionId);\n if (origCurrent && origCurrent.status !== \"cancelled\") {\n sessionManager.update(input.sessionId, {\n status: originalStatus,\n abortController: undefined,\n });\n } else if (origCurrent) {\n sessionManager.update(input.sessionId, {\n abortController: undefined,\n });\n }\n } else {\n const current = sessionManager.get(input.sessionId);\n if (current && current.status !== \"cancelled\") {\n sessionManager.update(input.sessionId, {\n status: isError ? \"error\" : \"idle\",\n totalTurns: (session.totalTurns ?? 0) + numTurns,\n totalCostUsd: (session.totalCostUsd ?? 0) + totalCostUsd,\n abortController: undefined,\n });\n const updated = sessionManager.get(input.sessionId);\n sessionTotalTurns = updated?.totalTurns;\n sessionTotalCostUsd = updated?.totalCostUsd;\n } else if (current) {\n sessionManager.update(input.sessionId, {\n totalTurns: (session.totalTurns ?? 0) + numTurns,\n totalCostUsd: (session.totalCostUsd ?? 0) + totalCostUsd,\n abortController: undefined,\n });\n const updated = sessionManager.get(input.sessionId);\n sessionTotalTurns = updated?.totalTurns;\n sessionTotalCostUsd = updated?.totalCostUsd;\n }\n }\n\n const targetSessionId = input.forkSession ? newSessionId : input.sessionId;\n\n // If fork was requested but no new session ID was received, flag as internal error\n if (input.forkSession && newSessionId === input.sessionId && !isError) {\n isError = true;\n const noForkMsg = `Error [${ErrorCode.INTERNAL}]: Fork requested but no new session ID received from agent.`;\n resultText = resultText ? `${noForkMsg} Original: ${resultText}` : noForkMsg;\n }\n\n return {\n sessionId: targetSessionId,\n result: resultText,\n isError,\n durationMs,\n durationApiMs,\n numTurns,\n totalCostUsd,\n sessionTotalTurns,\n sessionTotalCostUsd,\n structuredOutput,\n stopReason,\n errorSubtype,\n usage,\n modelUsage,\n permissionDenials,\n };\n}\n\nasync function executeClaudeCodeReplyDiskResume(\n input: ClaudeCodeReplyInput,\n sessionManager: SessionManager,\n allowBypass: boolean\n): Promise<AgentResult> {\n if (input.cwd !== undefined && (typeof input.cwd !== \"string\" || input.cwd.trim() === \"\")) {\n return {\n sessionId: input.sessionId,\n result: `Error [${ErrorCode.INVALID_ARGUMENT}]: cwd must be a non-empty string.`,\n isError: true,\n durationMs: 0,\n numTurns: 0,\n totalCostUsd: 0,\n };\n }\n\n const effectivePermissionMode = input.permissionMode ?? \"dontAsk\";\n\n if (effectivePermissionMode === \"bypassPermissions\" && !allowBypass) {\n return {\n sessionId: input.sessionId,\n result: `Error [${ErrorCode.PERMISSION_DENIED}]: bypassPermissions is disabled on this server. Use the claude_code_configure tool with action 'enable_bypass' to enable it.`,\n isError: true,\n durationMs: 0,\n numTurns: 0,\n totalCostUsd: 0,\n };\n }\n\n const abortController = new AbortController();\n let timedOut = false;\n\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n if (input.timeout !== undefined) {\n timeoutId = setTimeout(() => {\n timedOut = true;\n abortController.abort();\n }, input.timeout);\n }\n\n let resultText = \"\";\n let isError = false;\n let durationMs = 0;\n let durationApiMs: number | undefined;\n let numTurns = 0;\n let totalCostUsd = 0;\n let sessionTotalTurns: number | undefined;\n let sessionTotalCostUsd: number | undefined;\n let newSessionId = input.sessionId;\n let structuredOutput: unknown;\n let stopReason: string | null | undefined;\n let errorSubtype: string | undefined;\n let usage: Record<string, unknown> | undefined;\n let modelUsage: Record<string, unknown> | undefined;\n let permissionDenials: AgentResult[\"permissionDenials\"] | undefined;\n let seenResult = false;\n\n // Create a placeholder in-memory session for non-fork resumes to support cancellation/status.\n if (!input.forkSession) {\n const existing = sessionManager.get(input.sessionId);\n if (!existing) {\n const cwd = input.cwd ?? process.cwd();\n if (typeof cwd !== \"string\" || cwd.trim() === \"\") {\n return {\n sessionId: input.sessionId,\n result: `Error [${ErrorCode.INVALID_ARGUMENT}]: cwd must be a non-empty string.`,\n isError: true,\n durationMs: 0,\n numTurns: 0,\n totalCostUsd: 0,\n };\n }\n try {\n sessionManager.create({\n sessionId: input.sessionId,\n cwd,\n model: input.model,\n permissionMode: effectivePermissionMode,\n allowedTools: input.allowedTools,\n disallowedTools: input.disallowedTools,\n tools: input.tools,\n maxTurns: input.maxTurns,\n systemPrompt: input.systemPrompt,\n agents: input.agents,\n maxBudgetUsd: input.maxBudgetUsd,\n effort: input.effort,\n betas: input.betas,\n additionalDirectories: input.additionalDirectories,\n outputFormat: input.outputFormat,\n thinking: input.thinking,\n persistSession: input.persistSession,\n pathToClaudeCodeExecutable: input.pathToClaudeCodeExecutable,\n agent: input.agent,\n mcpServers: input.mcpServers,\n sandbox: input.sandbox,\n fallbackModel: input.fallbackModel,\n enableFileCheckpointing: input.enableFileCheckpointing,\n includePartialMessages: input.includePartialMessages,\n strictMcpConfig: input.strictMcpConfig,\n settingSources: input.settingSources ?? DEFAULT_SETTING_SOURCES,\n debug: input.debug,\n debugFile: input.debugFile,\n env: input.env,\n abortController,\n });\n } catch {\n // Another concurrent call may have created it; fall back to regular reply behavior.\n return executeClaudeCodeReply(input, sessionManager, allowBypass);\n }\n }\n }\n\n try {\n const options: Partial<Options> = {\n resume: input.sessionId,\n abortController,\n permissionMode: effectivePermissionMode,\n };\n\n if (input.cwd !== undefined) options.cwd = input.cwd;\n if (input.allowedTools !== undefined) options.allowedTools = input.allowedTools;\n if (input.disallowedTools !== undefined) options.disallowedTools = input.disallowedTools;\n if (input.maxTurns !== undefined) options.maxTurns = input.maxTurns;\n if (input.model !== undefined) options.model = input.model;\n if (input.maxBudgetUsd !== undefined) options.maxBudgetUsd = input.maxBudgetUsd;\n if (input.agents !== undefined) options.agents = input.agents as Options[\"agents\"];\n if (input.effort !== undefined) options.effort = input.effort;\n if (input.betas !== undefined) options.betas = input.betas as Options[\"betas\"];\n if (input.additionalDirectories !== undefined)\n options.additionalDirectories = input.additionalDirectories;\n if (input.outputFormat !== undefined) options.outputFormat = input.outputFormat;\n if (input.thinking !== undefined) options.thinking = input.thinking;\n if (input.tools !== undefined) options.tools = input.tools;\n if (input.systemPrompt !== undefined) options.systemPrompt = input.systemPrompt;\n if (input.persistSession !== undefined) options.persistSession = input.persistSession;\n if (input.resumeSessionAt !== undefined) options.resumeSessionAt = input.resumeSessionAt;\n if (input.pathToClaudeCodeExecutable !== undefined)\n options.pathToClaudeCodeExecutable = input.pathToClaudeCodeExecutable;\n if (input.agent !== undefined) options.agent = input.agent;\n if (input.mcpServers !== undefined)\n options.mcpServers = input.mcpServers as Options[\"mcpServers\"];\n if (input.sandbox !== undefined) options.sandbox = input.sandbox;\n if (input.fallbackModel !== undefined) options.fallbackModel = input.fallbackModel;\n if (input.enableFileCheckpointing !== undefined)\n options.enableFileCheckpointing = input.enableFileCheckpointing;\n if (input.includePartialMessages !== undefined)\n options.includePartialMessages = input.includePartialMessages;\n if (input.strictMcpConfig !== undefined) options.strictMcpConfig = input.strictMcpConfig;\n if (input.settingSources !== undefined) options.settingSources = input.settingSources;\n else options.settingSources = DEFAULT_SETTING_SOURCES;\n if (input.debug !== undefined) options.debug = input.debug;\n if (input.debugFile !== undefined) options.debugFile = input.debugFile;\n if (input.env !== undefined) options.env = { ...process.env, ...input.env };\n\n if (effectivePermissionMode === \"bypassPermissions\") {\n options.allowDangerouslySkipPermissions = true;\n }\n\n if (input.forkSession) {\n options.forkSession = true;\n }\n\n for await (const message of query({\n prompt: input.prompt,\n options,\n })) {\n if (message.type === \"system\" && message.subtype === \"init\") {\n // Security: block bypassPermissions if it was applied by the underlying CLI state\n if (message.permissionMode === \"bypassPermissions\" && !allowBypass) {\n isError = true;\n resultText = `Error [${ErrorCode.PERMISSION_DENIED}]: Cannot resume a bypassPermissions session while bypass is disabled. Use the claude_code_configure tool with action 'enable_bypass' first.`;\n abortController.abort();\n break;\n }\n\n if (input.forkSession) {\n newSessionId = message.session_id;\n if (newSessionId !== input.sessionId && !sessionManager.get(newSessionId)) {\n try {\n sessionManager.create({\n sessionId: newSessionId,\n cwd: message.cwd,\n model: message.model,\n permissionMode: effectivePermissionMode,\n allowedTools: input.allowedTools,\n disallowedTools: input.disallowedTools,\n tools: input.tools ?? message.tools,\n maxTurns: input.maxTurns,\n systemPrompt: input.systemPrompt,\n agents: input.agents,\n maxBudgetUsd: input.maxBudgetUsd,\n effort: input.effort,\n betas: input.betas ?? message.betas,\n additionalDirectories: input.additionalDirectories,\n outputFormat: input.outputFormat,\n thinking: input.thinking,\n persistSession: input.persistSession,\n pathToClaudeCodeExecutable: input.pathToClaudeCodeExecutable,\n agent: input.agent,\n mcpServers: input.mcpServers,\n sandbox: input.sandbox,\n fallbackModel: input.fallbackModel,\n enableFileCheckpointing: input.enableFileCheckpointing,\n includePartialMessages: input.includePartialMessages,\n strictMcpConfig: input.strictMcpConfig,\n settingSources: input.settingSources ?? DEFAULT_SETTING_SOURCES,\n debug: input.debug,\n debugFile: input.debugFile,\n env: input.env,\n abortController,\n });\n } catch {\n // If it already exists, treat as busy.\n isError = true;\n resultText = `Error [${ErrorCode.SESSION_BUSY}]: Session is not available (status: running).`;\n abortController.abort();\n break;\n }\n }\n } else {\n sessionManager.update(input.sessionId, {\n cwd: message.cwd,\n model: message.model,\n permissionMode: effectivePermissionMode,\n betas: input.betas ?? message.betas,\n tools: input.tools ?? message.tools,\n });\n }\n }\n\n if (message.type === \"result\") {\n if (seenResult) continue;\n seenResult = true;\n\n const result: SDKResultMessage = message;\n durationMs = result.duration_ms;\n durationApiMs = result.duration_api_ms;\n numTurns = result.num_turns;\n totalCostUsd = result.total_cost_usd;\n isError = result.is_error;\n stopReason = result.stop_reason;\n usage = result.usage;\n modelUsage = result.modelUsage;\n permissionDenials = result.permission_denials;\n\n if (result.subtype === \"success\") {\n resultText = result.result;\n structuredOutput = result.structured_output;\n } else {\n isError = true;\n errorSubtype = result.subtype;\n resultText =\n result.errors.map(String).join(\"\\n\") || `Error [${result.subtype}]: Unknown error`;\n }\n\n break;\n }\n }\n } catch (err: unknown) {\n isError = true;\n const isAborted =\n abortController.signal.aborted ||\n err instanceof AbortError ||\n (err instanceof Error && err.name === \"AbortError\");\n if (isAborted) {\n resultText = timedOut\n ? `Error [${ErrorCode.TIMEOUT}]: Session timed out after ${input.timeout}ms.`\n : `Error [${ErrorCode.CANCELLED}]: Session was cancelled.`;\n } else {\n resultText = enhanceWindowsError(err instanceof Error ? err.message : String(err));\n }\n } finally {\n if (timeoutId) clearTimeout(timeoutId);\n }\n\n // Some SDK abort paths end the stream without throwing. Ensure aborts become TIMEOUT/CANCELLED,\n // not an INTERNAL \"missing_result\" error.\n if (!seenResult && !isError && abortController.signal.aborted) {\n isError = true;\n resultText = timedOut\n ? `Error [${ErrorCode.TIMEOUT}]: Session timed out after ${input.timeout}ms.`\n : `Error [${ErrorCode.CANCELLED}]: Session was cancelled.`;\n }\n\n if (!seenResult && !isError) {\n isError = true;\n errorSubtype = errorSubtype ?? \"missing_result\";\n const noResultMsg = `Error [${ErrorCode.INTERNAL}]: No result message received from agent.`;\n resultText = resultText ? `${noResultMsg} Original: ${resultText}` : noResultMsg;\n }\n\n const targetSessionId = input.forkSession ? newSessionId : input.sessionId;\n\n // Update totals/status and clear abortController for tracked sessions.\n // Note: In disk-resume mode, the original session may not exist in memory (it was resumed\n // from disk). When forking, only the new forked session is tracked; the original session\n // has no in-memory state to clean up, which is the expected behavior.\n const tracked = sessionManager.get(targetSessionId);\n if (tracked) {\n const nextTurns = input.forkSession ? numTurns : (tracked.totalTurns ?? 0) + numTurns;\n const nextCost = input.forkSession ? totalCostUsd : (tracked.totalCostUsd ?? 0) + totalCostUsd;\n if (tracked.status !== \"cancelled\") {\n sessionManager.update(targetSessionId, {\n status: isError ? \"error\" : \"idle\",\n totalTurns: nextTurns,\n totalCostUsd: nextCost,\n abortController: undefined,\n });\n } else {\n sessionManager.update(targetSessionId, {\n totalTurns: nextTurns,\n totalCostUsd: nextCost,\n abortController: undefined,\n });\n }\n const updated = sessionManager.get(targetSessionId);\n sessionTotalTurns = updated?.totalTurns;\n sessionTotalCostUsd = updated?.totalCostUsd;\n }\n\n // If fork was requested but no new session ID was received, flag as internal error\n if (input.forkSession && newSessionId === input.sessionId && !isError) {\n isError = true;\n const noForkMsg = `Error [${ErrorCode.INTERNAL}]: Fork requested but no new session ID received from agent.`;\n resultText = resultText ? `${noForkMsg} Original: ${resultText}` : noForkMsg;\n }\n\n return {\n sessionId: targetSessionId,\n result: resultText,\n isError,\n durationMs,\n durationApiMs,\n numTurns,\n totalCostUsd,\n sessionTotalTurns,\n sessionTotalCostUsd,\n structuredOutput,\n stopReason,\n errorSubtype,\n usage,\n modelUsage,\n permissionDenials,\n };\n}\n","/**\n * claude_code_session tool - Manage sessions (list, get, cancel)\n */\nimport type { SessionManager } from \"../session/manager.js\";\nimport type { 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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@leo000001/claude-code-mcp",
3
- "version": "1.4.0",
3
+ "version": "1.5.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",