fourmis-agents-sdk 0.3.0 → 0.4.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.
Files changed (102) hide show
  1. package/dist/agent-loop.d.ts +21 -3
  2. package/dist/agent-loop.d.ts.map +1 -1
  3. package/dist/agent-loop.js +294 -90
  4. package/dist/agents/index.js +2798 -1857
  5. package/dist/agents/task-manager.js +15 -0
  6. package/dist/agents/tools.d.ts.map +1 -1
  7. package/dist/agents/tools.js +2798 -1857
  8. package/dist/agents/types.d.ts +4 -0
  9. package/dist/agents/types.d.ts.map +1 -1
  10. package/dist/api.d.ts +8 -5
  11. package/dist/api.d.ts.map +1 -1
  12. package/dist/api.js +2394 -886
  13. package/dist/auth/gemini-oauth.js +15 -0
  14. package/dist/auth/login-openai.js +15 -0
  15. package/dist/auth/openai-oauth.js +15 -0
  16. package/dist/hooks.d.ts +19 -1
  17. package/dist/hooks.d.ts.map +1 -1
  18. package/dist/hooks.js +42 -2
  19. package/dist/index.d.ts +10 -1
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +2407 -887
  22. package/dist/mcp/client.d.ts +7 -0
  23. package/dist/mcp/client.d.ts.map +1 -1
  24. package/dist/mcp/client.js +146 -12
  25. package/dist/mcp/index.js +146 -12
  26. package/dist/mcp/server.js +15 -0
  27. package/dist/mcp/types.d.ts +19 -1
  28. package/dist/mcp/types.d.ts.map +1 -1
  29. package/dist/memory/index.js +15 -0
  30. package/dist/memory/memory-handler.js +15 -0
  31. package/dist/permissions.d.ts.map +1 -1
  32. package/dist/permissions.js +22 -3
  33. package/dist/providers/anthropic.d.ts.map +1 -1
  34. package/dist/providers/anthropic.js +56 -2
  35. package/dist/providers/gemini.js +15 -0
  36. package/dist/providers/openai.js +15 -0
  37. package/dist/providers/registry.js +56 -2
  38. package/dist/providers/types.d.ts +4 -1
  39. package/dist/providers/types.d.ts.map +1 -1
  40. package/dist/query.d.ts +21 -2
  41. package/dist/query.d.ts.map +1 -1
  42. package/dist/query.js +84 -1
  43. package/dist/settings.js +15 -0
  44. package/dist/skills/frontmatter.d.ts +15 -0
  45. package/dist/skills/frontmatter.d.ts.map +1 -0
  46. package/dist/skills/frontmatter.js +66 -0
  47. package/dist/skills/index.d.ts +8 -0
  48. package/dist/skills/index.d.ts.map +1 -0
  49. package/dist/skills/index.js +326 -0
  50. package/dist/skills/skills.d.ts +94 -0
  51. package/dist/skills/skills.d.ts.map +1 -0
  52. package/dist/skills/skills.js +324 -0
  53. package/dist/tools/ask-user-question.d.ts +7 -0
  54. package/dist/tools/ask-user-question.d.ts.map +1 -0
  55. package/dist/tools/ask-user-question.js +63 -0
  56. package/dist/tools/bash.d.ts.map +1 -1
  57. package/dist/tools/bash.js +62 -2
  58. package/dist/tools/config.d.ts +7 -0
  59. package/dist/tools/config.d.ts.map +1 -0
  60. package/dist/tools/config.js +129 -0
  61. package/dist/tools/edit.js +15 -0
  62. package/dist/tools/exit-plan-mode.d.ts +7 -0
  63. package/dist/tools/exit-plan-mode.d.ts.map +1 -0
  64. package/dist/tools/exit-plan-mode.js +49 -0
  65. package/dist/tools/glob.js +15 -0
  66. package/dist/tools/grep.js +15 -0
  67. package/dist/tools/index.d.ts +7 -0
  68. package/dist/tools/index.d.ts.map +1 -1
  69. package/dist/tools/index.js +521 -9
  70. package/dist/tools/mcp-resources.js +15 -0
  71. package/dist/tools/notebook-edit.d.ts +7 -0
  72. package/dist/tools/notebook-edit.d.ts.map +1 -0
  73. package/dist/tools/notebook-edit.js +98 -0
  74. package/dist/tools/presets.d.ts +2 -1
  75. package/dist/tools/presets.d.ts.map +1 -1
  76. package/dist/tools/presets.js +37 -4
  77. package/dist/tools/read.d.ts.map +1 -1
  78. package/dist/tools/read.js +27 -1
  79. package/dist/tools/registry.d.ts +2 -0
  80. package/dist/tools/registry.d.ts.map +1 -1
  81. package/dist/tools/registry.js +25 -0
  82. package/dist/tools/todo-write.d.ts +7 -0
  83. package/dist/tools/todo-write.d.ts.map +1 -0
  84. package/dist/tools/todo-write.js +84 -0
  85. package/dist/tools/web-fetch.d.ts +6 -0
  86. package/dist/tools/web-fetch.d.ts.map +1 -0
  87. package/dist/tools/web-fetch.js +100 -0
  88. package/dist/tools/web-search.d.ts +7 -0
  89. package/dist/tools/web-search.d.ts.map +1 -0
  90. package/dist/tools/web-search.js +93 -0
  91. package/dist/tools/write.js +15 -0
  92. package/dist/types.d.ts +360 -42
  93. package/dist/types.d.ts.map +1 -1
  94. package/dist/types.js +15 -0
  95. package/dist/utils/cost.js +15 -0
  96. package/dist/utils/session-store.d.ts +1 -1
  97. package/dist/utils/session-store.d.ts.map +1 -1
  98. package/dist/utils/session-store.js +64 -2
  99. package/dist/utils/system-prompt.d.ts +4 -0
  100. package/dist/utils/system-prompt.d.ts.map +1 -1
  101. package/dist/utils/system-prompt.js +326 -6
  102. package/package.json +4 -2
@@ -3,12 +3,15 @@
3
3
  */
4
4
  import type { ToolImplementation, ToolResult } from "../tools/registry.js";
5
5
  import type { McpServerConfig, McpServerStatus, McpResourceInfo } from "./types.js";
6
+ import type { McpSetServersResult } from "../types.js";
6
7
  export declare class McpClientManager {
7
8
  private configs;
8
9
  private servers;
10
+ private disabled;
9
11
  constructor(configs: Record<string, McpServerConfig>);
10
12
  connectAll(): Promise<void>;
11
13
  private connectOne;
14
+ private toStatusConfig;
12
15
  /**
13
16
  * Get all MCP tools wrapped as ToolImplementation, namespaced as mcp__server__tool.
14
17
  */
@@ -19,6 +22,10 @@ export declare class McpClientManager {
19
22
  })[]>;
20
23
  readResource(serverName: string, uri: string): Promise<string>;
21
24
  status(): McpServerStatus[];
25
+ reconnectServer(serverName: string): Promise<void>;
26
+ toggleServer(serverName: string, enabled: boolean): Promise<void>;
27
+ setServers(servers: Record<string, McpServerConfig>): Promise<McpSetServersResult>;
28
+ private closeOne;
22
29
  closeAll(): Promise<void>;
23
30
  }
24
31
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/mcp/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EAEf,eAAe,EAChB,MAAM,YAAY,CAAC;AASpB,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,OAAO,CAAsC;gBAEzC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC;IAI9C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAKnB,UAAU;IA+DxB;;OAEG;IACH,QAAQ,IAAI,kBAAkB,EAAE;IAsB1B,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC;IA2BnF,aAAa,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,eAAe,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAC;IA4BrF,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAepE,MAAM,IAAI,eAAe,EAAE;IAcrB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAYhC"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/mcp/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EAEf,eAAe,EAChB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AASvD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,QAAQ,CAAqB;gBAEzB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC;IAI9C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAKnB,UAAU;IAkGxB,OAAO,CAAC,cAAc;IAOtB;;OAEG;IACH,QAAQ,IAAI,kBAAkB,EAAE;IAsB1B,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC;IA2BnF,aAAa,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,eAAe,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAC;IA4BrF,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAepE,MAAM,IAAI,eAAe,EAAE;IA0BrB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAalD,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BjE,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,OAAO,CAAC,mBAAmB,CAAC;YAmC1E,QAAQ;IAWhB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAMhC"}
@@ -1,5 +1,20 @@
1
1
  // @bun
2
+ var __create = Object.create;
3
+ var __getProtoOf = Object.getPrototypeOf;
2
4
  var __defProp = Object.defineProperty;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __toESM = (mod, isNodeMode, target) => {
8
+ target = mod != null ? __create(__getProtoOf(mod)) : {};
9
+ const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
10
+ for (let key of __getOwnPropNames(mod))
11
+ if (!__hasOwnProp.call(to, key))
12
+ __defProp(to, key, {
13
+ get: () => mod[key],
14
+ enumerable: true
15
+ });
16
+ return to;
17
+ };
3
18
  var __export = (target, all) => {
4
19
  for (var name in all)
5
20
  __defProp(target, name, {
@@ -19,14 +34,29 @@ import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js";
19
34
  class McpClientManager {
20
35
  configs;
21
36
  servers = new Map;
37
+ disabled = new Set;
22
38
  constructor(configs) {
23
- this.configs = configs;
39
+ this.configs = { ...configs };
24
40
  }
25
41
  async connectAll() {
26
42
  const entries = Object.entries(this.configs);
27
43
  await Promise.all(entries.map(([name, config]) => this.connectOne(name, config)));
28
44
  }
29
45
  async connectOne(name, config) {
46
+ if (this.disabled.has(name)) {
47
+ this.servers.set(name, {
48
+ name,
49
+ client: null,
50
+ tools: [],
51
+ status: {
52
+ name,
53
+ status: "disabled",
54
+ config: this.toStatusConfig(config),
55
+ scope: config.type === "sdk" ? "sdk" : "session"
56
+ }
57
+ });
58
+ return;
59
+ }
30
60
  try {
31
61
  const client = new Client({ name: `fourmis-${name}`, version: "1.0.0" });
32
62
  if (config.type === "sdk") {
@@ -60,13 +90,25 @@ class McpClientManager {
60
90
  const tools = (toolsResult.tools ?? []).map((t) => ({
61
91
  name: t.name,
62
92
  description: t.description,
63
- inputSchema: t.inputSchema
93
+ inputSchema: t.inputSchema,
94
+ annotations: t.annotations ? {
95
+ readOnly: t.annotations.readOnly,
96
+ destructive: t.annotations.destructive,
97
+ openWorld: t.annotations.openWorld
98
+ } : undefined
64
99
  }));
65
100
  this.servers.set(name, {
66
101
  name,
67
102
  client,
68
103
  tools,
69
- status: { name, status: "connected", tools }
104
+ status: {
105
+ name,
106
+ status: "connected",
107
+ tools,
108
+ serverInfo: { name, version: "1.0.0" },
109
+ config: this.toStatusConfig(config),
110
+ scope: config.type === "sdk" ? "sdk" : "session"
111
+ }
70
112
  });
71
113
  } catch (err) {
72
114
  const error = err instanceof Error ? err.message : String(err);
@@ -74,10 +116,22 @@ class McpClientManager {
74
116
  name,
75
117
  client: null,
76
118
  tools: [],
77
- status: { name, status: "failed", error }
119
+ status: {
120
+ name,
121
+ status: "failed",
122
+ error,
123
+ config: this.toStatusConfig(config),
124
+ scope: config.type === "sdk" ? "sdk" : "session"
125
+ }
78
126
  });
79
127
  }
80
128
  }
129
+ toStatusConfig(config) {
130
+ if (config.type === "sdk") {
131
+ return { type: "sdk", name: config.name };
132
+ }
133
+ return config;
134
+ }
81
135
  getTools() {
82
136
  const result = [];
83
137
  for (const [serverName, server] of this.servers) {
@@ -155,24 +209,104 @@ class McpClientManager {
155
209
  }
156
210
  status() {
157
211
  const result = [];
158
- for (const [name] of Object.entries(this.configs)) {
212
+ for (const [name, config] of Object.entries(this.configs)) {
159
213
  const server = this.servers.get(name);
160
214
  if (server) {
161
215
  result.push(server.status);
216
+ } else if (this.disabled.has(name)) {
217
+ result.push({
218
+ name,
219
+ status: "disabled",
220
+ config: this.toStatusConfig(config),
221
+ scope: config.type === "sdk" ? "sdk" : "session"
222
+ });
162
223
  } else {
163
- result.push({ name, status: "pending" });
224
+ result.push({
225
+ name,
226
+ status: "pending",
227
+ config: this.toStatusConfig(config),
228
+ scope: config.type === "sdk" ? "sdk" : "session"
229
+ });
164
230
  }
165
231
  }
166
232
  return result;
167
233
  }
168
- async closeAll() {
169
- for (const [, server] of this.servers) {
170
- if (server.client) {
171
- try {
172
- await server.client.close();
173
- } catch {}
234
+ async reconnectServer(serverName) {
235
+ const config = this.configs[serverName];
236
+ if (!config) {
237
+ throw new Error(`MCP server "${serverName}" is not configured`);
238
+ }
239
+ await this.closeOne(serverName);
240
+ await this.connectOne(serverName, config);
241
+ const status = this.servers.get(serverName)?.status;
242
+ if (!status || status.status !== "connected") {
243
+ throw new Error(status?.error ?? `Failed to reconnect MCP server "${serverName}"`);
244
+ }
245
+ }
246
+ async toggleServer(serverName, enabled) {
247
+ const config = this.configs[serverName];
248
+ if (!config) {
249
+ throw new Error(`MCP server "${serverName}" is not configured`);
250
+ }
251
+ if (!enabled) {
252
+ this.disabled.add(serverName);
253
+ await this.closeOne(serverName);
254
+ this.servers.set(serverName, {
255
+ name: serverName,
256
+ client: null,
257
+ tools: [],
258
+ status: {
259
+ name: serverName,
260
+ status: "disabled",
261
+ config: this.toStatusConfig(config),
262
+ scope: config.type === "sdk" ? "sdk" : "session"
263
+ }
264
+ });
265
+ return;
266
+ }
267
+ this.disabled.delete(serverName);
268
+ await this.reconnectServer(serverName);
269
+ }
270
+ async setServers(servers) {
271
+ const prevNames = new Set(Object.keys(this.configs));
272
+ const nextNames = new Set(Object.keys(servers));
273
+ const added = [...nextNames].filter((n) => !prevNames.has(n));
274
+ const removed = [...prevNames].filter((n) => !nextNames.has(n));
275
+ const errors = {};
276
+ for (const name of removed) {
277
+ await this.closeOne(name);
278
+ delete this.configs[name];
279
+ this.disabled.delete(name);
280
+ this.servers.delete(name);
281
+ }
282
+ for (const [name, config] of Object.entries(servers)) {
283
+ const prev = this.configs[name];
284
+ this.configs[name] = config;
285
+ if (this.disabled.has(name))
286
+ continue;
287
+ if (!prev || JSON.stringify(this.toStatusConfig(prev)) !== JSON.stringify(this.toStatusConfig(config))) {
288
+ await this.closeOne(name);
289
+ await this.connectOne(name, config);
290
+ }
291
+ const status = this.servers.get(name)?.status;
292
+ if (!status || status.status === "failed") {
293
+ errors[name] = status?.error ?? "Failed to connect";
174
294
  }
175
295
  }
296
+ return { added, removed, errors };
297
+ }
298
+ async closeOne(serverName) {
299
+ const existing = this.servers.get(serverName);
300
+ if (existing?.client) {
301
+ try {
302
+ await existing.client.close();
303
+ } catch {}
304
+ }
305
+ }
306
+ async closeAll() {
307
+ for (const [name] of this.servers) {
308
+ await this.closeOne(name);
309
+ }
176
310
  this.servers.clear();
177
311
  }
178
312
  }
package/dist/mcp/index.js CHANGED
@@ -1,5 +1,20 @@
1
1
  // @bun
2
+ var __create = Object.create;
3
+ var __getProtoOf = Object.getPrototypeOf;
2
4
  var __defProp = Object.defineProperty;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __toESM = (mod, isNodeMode, target) => {
8
+ target = mod != null ? __create(__getProtoOf(mod)) : {};
9
+ const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
10
+ for (let key of __getOwnPropNames(mod))
11
+ if (!__hasOwnProp.call(to, key))
12
+ __defProp(to, key, {
13
+ get: () => mod[key],
14
+ enumerable: true
15
+ });
16
+ return to;
17
+ };
3
18
  var __export = (target, all) => {
4
19
  for (var name in all)
5
20
  __defProp(target, name, {
@@ -19,14 +34,29 @@ import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js";
19
34
  class McpClientManager {
20
35
  configs;
21
36
  servers = new Map;
37
+ disabled = new Set;
22
38
  constructor(configs) {
23
- this.configs = configs;
39
+ this.configs = { ...configs };
24
40
  }
25
41
  async connectAll() {
26
42
  const entries = Object.entries(this.configs);
27
43
  await Promise.all(entries.map(([name, config]) => this.connectOne(name, config)));
28
44
  }
29
45
  async connectOne(name, config) {
46
+ if (this.disabled.has(name)) {
47
+ this.servers.set(name, {
48
+ name,
49
+ client: null,
50
+ tools: [],
51
+ status: {
52
+ name,
53
+ status: "disabled",
54
+ config: this.toStatusConfig(config),
55
+ scope: config.type === "sdk" ? "sdk" : "session"
56
+ }
57
+ });
58
+ return;
59
+ }
30
60
  try {
31
61
  const client = new Client({ name: `fourmis-${name}`, version: "1.0.0" });
32
62
  if (config.type === "sdk") {
@@ -60,13 +90,25 @@ class McpClientManager {
60
90
  const tools = (toolsResult.tools ?? []).map((t) => ({
61
91
  name: t.name,
62
92
  description: t.description,
63
- inputSchema: t.inputSchema
93
+ inputSchema: t.inputSchema,
94
+ annotations: t.annotations ? {
95
+ readOnly: t.annotations.readOnly,
96
+ destructive: t.annotations.destructive,
97
+ openWorld: t.annotations.openWorld
98
+ } : undefined
64
99
  }));
65
100
  this.servers.set(name, {
66
101
  name,
67
102
  client,
68
103
  tools,
69
- status: { name, status: "connected", tools }
104
+ status: {
105
+ name,
106
+ status: "connected",
107
+ tools,
108
+ serverInfo: { name, version: "1.0.0" },
109
+ config: this.toStatusConfig(config),
110
+ scope: config.type === "sdk" ? "sdk" : "session"
111
+ }
70
112
  });
71
113
  } catch (err) {
72
114
  const error = err instanceof Error ? err.message : String(err);
@@ -74,10 +116,22 @@ class McpClientManager {
74
116
  name,
75
117
  client: null,
76
118
  tools: [],
77
- status: { name, status: "failed", error }
119
+ status: {
120
+ name,
121
+ status: "failed",
122
+ error,
123
+ config: this.toStatusConfig(config),
124
+ scope: config.type === "sdk" ? "sdk" : "session"
125
+ }
78
126
  });
79
127
  }
80
128
  }
129
+ toStatusConfig(config) {
130
+ if (config.type === "sdk") {
131
+ return { type: "sdk", name: config.name };
132
+ }
133
+ return config;
134
+ }
81
135
  getTools() {
82
136
  const result = [];
83
137
  for (const [serverName, server] of this.servers) {
@@ -155,24 +209,104 @@ class McpClientManager {
155
209
  }
156
210
  status() {
157
211
  const result = [];
158
- for (const [name] of Object.entries(this.configs)) {
212
+ for (const [name, config] of Object.entries(this.configs)) {
159
213
  const server = this.servers.get(name);
160
214
  if (server) {
161
215
  result.push(server.status);
216
+ } else if (this.disabled.has(name)) {
217
+ result.push({
218
+ name,
219
+ status: "disabled",
220
+ config: this.toStatusConfig(config),
221
+ scope: config.type === "sdk" ? "sdk" : "session"
222
+ });
162
223
  } else {
163
- result.push({ name, status: "pending" });
224
+ result.push({
225
+ name,
226
+ status: "pending",
227
+ config: this.toStatusConfig(config),
228
+ scope: config.type === "sdk" ? "sdk" : "session"
229
+ });
164
230
  }
165
231
  }
166
232
  return result;
167
233
  }
168
- async closeAll() {
169
- for (const [, server] of this.servers) {
170
- if (server.client) {
171
- try {
172
- await server.client.close();
173
- } catch {}
234
+ async reconnectServer(serverName) {
235
+ const config = this.configs[serverName];
236
+ if (!config) {
237
+ throw new Error(`MCP server "${serverName}" is not configured`);
238
+ }
239
+ await this.closeOne(serverName);
240
+ await this.connectOne(serverName, config);
241
+ const status = this.servers.get(serverName)?.status;
242
+ if (!status || status.status !== "connected") {
243
+ throw new Error(status?.error ?? `Failed to reconnect MCP server "${serverName}"`);
244
+ }
245
+ }
246
+ async toggleServer(serverName, enabled) {
247
+ const config = this.configs[serverName];
248
+ if (!config) {
249
+ throw new Error(`MCP server "${serverName}" is not configured`);
250
+ }
251
+ if (!enabled) {
252
+ this.disabled.add(serverName);
253
+ await this.closeOne(serverName);
254
+ this.servers.set(serverName, {
255
+ name: serverName,
256
+ client: null,
257
+ tools: [],
258
+ status: {
259
+ name: serverName,
260
+ status: "disabled",
261
+ config: this.toStatusConfig(config),
262
+ scope: config.type === "sdk" ? "sdk" : "session"
263
+ }
264
+ });
265
+ return;
266
+ }
267
+ this.disabled.delete(serverName);
268
+ await this.reconnectServer(serverName);
269
+ }
270
+ async setServers(servers) {
271
+ const prevNames = new Set(Object.keys(this.configs));
272
+ const nextNames = new Set(Object.keys(servers));
273
+ const added = [...nextNames].filter((n) => !prevNames.has(n));
274
+ const removed = [...prevNames].filter((n) => !nextNames.has(n));
275
+ const errors = {};
276
+ for (const name of removed) {
277
+ await this.closeOne(name);
278
+ delete this.configs[name];
279
+ this.disabled.delete(name);
280
+ this.servers.delete(name);
281
+ }
282
+ for (const [name, config] of Object.entries(servers)) {
283
+ const prev = this.configs[name];
284
+ this.configs[name] = config;
285
+ if (this.disabled.has(name))
286
+ continue;
287
+ if (!prev || JSON.stringify(this.toStatusConfig(prev)) !== JSON.stringify(this.toStatusConfig(config))) {
288
+ await this.closeOne(name);
289
+ await this.connectOne(name, config);
290
+ }
291
+ const status = this.servers.get(name)?.status;
292
+ if (!status || status.status === "failed") {
293
+ errors[name] = status?.error ?? "Failed to connect";
174
294
  }
175
295
  }
296
+ return { added, removed, errors };
297
+ }
298
+ async closeOne(serverName) {
299
+ const existing = this.servers.get(serverName);
300
+ if (existing?.client) {
301
+ try {
302
+ await existing.client.close();
303
+ } catch {}
304
+ }
305
+ }
306
+ async closeAll() {
307
+ for (const [name] of this.servers) {
308
+ await this.closeOne(name);
309
+ }
176
310
  this.servers.clear();
177
311
  }
178
312
  }
@@ -1,5 +1,20 @@
1
1
  // @bun
2
+ var __create = Object.create;
3
+ var __getProtoOf = Object.getPrototypeOf;
2
4
  var __defProp = Object.defineProperty;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __toESM = (mod, isNodeMode, target) => {
8
+ target = mod != null ? __create(__getProtoOf(mod)) : {};
9
+ const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
10
+ for (let key of __getOwnPropNames(mod))
11
+ if (!__hasOwnProp.call(to, key))
12
+ __defProp(to, key, {
13
+ get: () => mod[key],
14
+ enumerable: true
15
+ });
16
+ return to;
17
+ };
3
18
  var __export = (target, all) => {
4
19
  for (var name in all)
5
20
  __defProp(target, name, {
@@ -21,16 +21,28 @@ export type McpHttpConfig = {
21
21
  url: string;
22
22
  headers?: Record<string, string>;
23
23
  };
24
+ export type McpClaudeAIProxyConfig = {
25
+ type: "claudeai-proxy";
26
+ url: string;
27
+ id: string;
28
+ };
24
29
  export type McpSdkConfig = {
25
30
  type: "sdk";
26
31
  name: string;
27
32
  instance: McpServerInstance;
28
33
  };
29
34
  export type McpServerConfig = McpStdioConfig | McpSseConfig | McpHttpConfig | McpSdkConfig;
35
+ export type McpServerConfigForProcessTransport = McpStdioConfig | McpSseConfig | McpHttpConfig | Omit<McpSdkConfig, "instance">;
36
+ export type McpServerStatusConfig = McpServerConfigForProcessTransport | McpClaudeAIProxyConfig;
30
37
  export type McpToolInfo = {
31
38
  name: string;
32
39
  description?: string;
33
40
  inputSchema?: Record<string, unknown>;
41
+ annotations?: {
42
+ readOnly?: boolean;
43
+ destructive?: boolean;
44
+ openWorld?: boolean;
45
+ };
34
46
  };
35
47
  export type McpResourceInfo = {
36
48
  uri: string;
@@ -40,7 +52,13 @@ export type McpResourceInfo = {
40
52
  };
41
53
  export type McpServerStatus = {
42
54
  name: string;
43
- status: "connected" | "failed" | "pending" | "disabled";
55
+ status: "connected" | "failed" | "needs-auth" | "pending" | "disabled";
56
+ serverInfo?: {
57
+ name: string;
58
+ version: string;
59
+ };
60
+ config?: McpServerStatusConfig;
61
+ scope?: string;
44
62
  tools?: McpToolInfo[];
45
63
  error?: string;
46
64
  };
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/mcp/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,0EAA0E;AAC1E,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5C;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,KAAK,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,KAAK,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,iBAAiB,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,cAAc,GAAG,YAAY,GAAG,aAAa,GAAG,YAAY,CAAC;AAE3F,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;IACxD,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/mcp/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,0EAA0E;AAC1E,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5C;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,KAAK,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,gBAAgB,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,KAAK,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,iBAAiB,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,cAAc,GAAG,YAAY,GAAG,aAAa,GAAG,YAAY,CAAC;AAE3F,MAAM,MAAM,kCAAkC,GAC1C,cAAc,GACd,YAAY,GACZ,aAAa,GACb,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;AAEnC,MAAM,MAAM,qBAAqB,GAAG,kCAAkC,GAAG,sBAAsB,CAAC;AAEhG,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,WAAW,CAAC,EAAE;QACZ,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,YAAY,GAAG,SAAS,GAAG,UAAU,CAAC;IACvE,UAAU,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,MAAM,CAAC,EAAE,qBAAqB,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC"}
@@ -1,5 +1,20 @@
1
1
  // @bun
2
+ var __create = Object.create;
3
+ var __getProtoOf = Object.getPrototypeOf;
2
4
  var __defProp = Object.defineProperty;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __toESM = (mod, isNodeMode, target) => {
8
+ target = mod != null ? __create(__getProtoOf(mod)) : {};
9
+ const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
10
+ for (let key of __getOwnPropNames(mod))
11
+ if (!__hasOwnProp.call(to, key))
12
+ __defProp(to, key, {
13
+ get: () => mod[key],
14
+ enumerable: true
15
+ });
16
+ return to;
17
+ };
3
18
  var __export = (target, all) => {
4
19
  for (var name in all)
5
20
  __defProp(target, name, {
@@ -1,5 +1,20 @@
1
1
  // @bun
2
+ var __create = Object.create;
3
+ var __getProtoOf = Object.getPrototypeOf;
2
4
  var __defProp = Object.defineProperty;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __toESM = (mod, isNodeMode, target) => {
8
+ target = mod != null ? __create(__getProtoOf(mod)) : {};
9
+ const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
10
+ for (let key of __getOwnPropNames(mod))
11
+ if (!__hasOwnProp.call(to, key))
12
+ __defProp(to, key, {
13
+ get: () => mod[key],
14
+ enumerable: true
15
+ });
16
+ return to;
17
+ };
3
18
  var __export = (target, all) => {
4
19
  for (var name in all)
5
20
  __defProp(target, name, {
@@ -1 +1 @@
1
- {"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../src/permissions.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,iBAAiB,EAGlB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AA+CrD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,IAAI,CAAiB;IAC7B,OAAO,CAAC,UAAU,CAAC,CAAa;IAChC,OAAO,CAAC,UAAU,CAAmB;IACrC,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,eAAe,CAAC,CAAkB;gBAGxC,IAAI,GAAE,cAA0B,EAChC,UAAU,CAAC,EAAE,UAAU,EACvB,WAAW,CAAC,EAAE,iBAAiB,EAC/B,eAAe,CAAC,EAAE,eAAe;IAS7B,KAAK,CACT,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,EAAE;QAAE,MAAM,EAAE,WAAW,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GACpE,OAAO,CAAC,gBAAgB,CAAC;IAoF5B,iEAAiE;IACjE,OAAO,CAAC,sBAAsB;IAiD9B,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAInC,OAAO,IAAI,cAAc;CAG1B"}
1
+ {"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../src/permissions.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,iBAAiB,EAGlB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AA+CrD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,IAAI,CAAiB;IAC7B,OAAO,CAAC,UAAU,CAAC,CAAa;IAChC,OAAO,CAAC,UAAU,CAAmB;IACrC,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,eAAe,CAAC,CAAkB;gBAGxC,IAAI,GAAE,cAA0B,EAChC,UAAU,CAAC,EAAE,UAAU,EACvB,WAAW,CAAC,EAAE,iBAAiB,EAC/B,eAAe,CAAC,EAAE,eAAe;IAS7B,KAAK,CACT,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,EAAE;QAAE,MAAM,EAAE,WAAW,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GACpE,OAAO,CAAC,gBAAgB,CAAC;IAwF5B,iEAAiE;IACjE,OAAO,CAAC,sBAAsB;IAiD9B,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAInC,OAAO,IAAI,cAAc;CAG1B"}
@@ -1,5 +1,20 @@
1
1
  // @bun
2
+ var __create = Object.create;
3
+ var __getProtoOf = Object.getPrototypeOf;
2
4
  var __defProp = Object.defineProperty;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __toESM = (mod, isNodeMode, target) => {
8
+ target = mod != null ? __create(__getProtoOf(mod)) : {};
9
+ const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
10
+ for (let key of __getOwnPropNames(mod))
11
+ if (!__hasOwnProp.call(to, key))
12
+ __defProp(to, key, {
13
+ get: () => mod[key],
14
+ enumerable: true
15
+ });
16
+ return to;
17
+ };
3
18
  var __export = (target, all) => {
4
19
  for (var name in all)
5
20
  __defProp(target, name, {
@@ -13,8 +28,8 @@ var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
13
28
  var __require = import.meta.require;
14
29
 
15
30
  // src/permissions.ts
16
- var SAFE_TOOLS = new Set(["Read", "Glob", "Grep"]);
17
- var EDIT_TOOLS = new Set(["Write", "Edit"]);
31
+ var SAFE_TOOLS = new Set(["Read", "Glob", "Grep", "WebFetch", "WebSearch"]);
32
+ var EDIT_TOOLS = new Set(["Write", "Edit", "NotebookEdit", "TodoWrite", "Config"]);
18
33
  var FS_COMMANDS = ["mkdir", "touch", "rm", "mv", "cp"];
19
34
  var DELEGATE_TOOLS = new Set(["Teammate", "Task", "TaskOutput", "TaskStop"]);
20
35
  function normalizeRules(rules) {
@@ -94,7 +109,11 @@ class PermissionManager {
94
109
  }
95
110
  }
96
111
  if (this.canUseTool) {
97
- const result = await this.canUseTool(toolName, input, options);
112
+ const result = await this.canUseTool(toolName, input, {
113
+ ...options,
114
+ toolUseID: options.toolUseId,
115
+ agentID: options.agentId
116
+ });
98
117
  if (result.behavior === "allow" && result.updatedPermissions) {
99
118
  this.applyPermissionUpdates(result.updatedPermissions);
100
119
  }
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EACV,eAAe,EACf,WAAW,EACX,SAAS,EACT,eAAe,EAIhB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAiB9C,qBAAa,gBAAiB,YAAW,eAAe;IACtD,IAAI,SAAe;IACnB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,SAAS,CAAU;gBAEf,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;IAwBpD,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC;IAmJ5D,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,MAAM;IAIvD,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAIvC,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO;IAgBlD,OAAO,CAAC,eAAe;IAiCvB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,aAAa;CActB"}
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EACV,eAAe,EACf,WAAW,EACX,SAAS,EACT,eAAe,EAIhB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAiB9C,qBAAa,gBAAiB,YAAW,eAAe;IACtD,IAAI,SAAe;IACnB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,SAAS,CAAU;gBAEf,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;IAwBpD,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC;IA2L5D,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,MAAM;IAIvD,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAIvC,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO;IAiBlD,OAAO,CAAC,eAAe;IAiCvB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,aAAa;CActB"}