@easynet/agent-tool 1.0.6 → 1.0.7

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 (47) hide show
  1. package/dist/api/main.cjs +14 -15
  2. package/dist/api/main.js +3 -4
  3. package/dist/api/runtimeFromConfig.d.ts +2 -0
  4. package/dist/api/runtimeFromConfig.d.ts.map +1 -1
  5. package/dist/{canonicalCoreSchemas-MI6NURRD.cjs → canonicalCoreSchemas-CTW6CCFY.cjs} +2 -3
  6. package/dist/{canonicalCoreSchemas-MI6NURRD.cjs.map → canonicalCoreSchemas-CTW6CCFY.cjs.map} +1 -1
  7. package/dist/canonicalCoreSchemas-YLHVHYJZ.js +3 -0
  8. package/dist/{canonicalCoreSchemas-MM5HFUT5.js.map → canonicalCoreSchemas-YLHVHYJZ.js.map} +1 -1
  9. package/dist/{chunk-BCDIVUGG.js → chunk-7LKHIMG3.js} +3 -3
  10. package/dist/{chunk-BCDIVUGG.js.map → chunk-7LKHIMG3.js.map} +1 -1
  11. package/dist/{chunk-HX57FKJD.js → chunk-FPRNWQMN.js} +3 -3
  12. package/dist/{chunk-HX57FKJD.js.map → chunk-FPRNWQMN.js.map} +1 -1
  13. package/dist/{chunk-TQBNZYB4.js → chunk-HEAHNLIZ.js} +140 -9
  14. package/dist/chunk-HEAHNLIZ.js.map +1 -0
  15. package/dist/{chunk-2MFY776F.js → chunk-HI65VG6J.js} +4 -4
  16. package/dist/{chunk-2MFY776F.js.map → chunk-HI65VG6J.js.map} +1 -1
  17. package/dist/{chunk-OFGOQZDI.cjs → chunk-JGFLYVXB.cjs} +9 -9
  18. package/dist/{chunk-OFGOQZDI.cjs.map → chunk-JGFLYVXB.cjs.map} +1 -1
  19. package/dist/{chunk-THSC7EOF.cjs → chunk-MG4YVODT.cjs} +141 -7
  20. package/dist/chunk-MG4YVODT.cjs.map +1 -0
  21. package/dist/{chunk-CDWQNC7O.cjs → chunk-NZIFY6CS.cjs} +8 -8
  22. package/dist/{chunk-CDWQNC7O.cjs.map → chunk-NZIFY6CS.cjs.map} +1 -1
  23. package/dist/{chunk-5UTVU3NX.cjs → chunk-R5DEK6YP.cjs} +12 -12
  24. package/dist/{chunk-5UTVU3NX.cjs.map → chunk-R5DEK6YP.cjs.map} +1 -1
  25. package/dist/core/index.cjs +0 -1
  26. package/dist/core/index.js +0 -1
  27. package/dist/core/runtime.cjs +0 -1
  28. package/dist/core/runtime.js +0 -1
  29. package/dist/index.cjs +56 -139
  30. package/dist/index.cjs.map +1 -1
  31. package/dist/index.js +6 -98
  32. package/dist/index.js.map +1 -1
  33. package/dist/tools/util/toolConfig.d.ts +1 -0
  34. package/dist/tools/util/toolConfig.d.ts.map +1 -1
  35. package/dist/utils/cli/index.cjs +21 -19
  36. package/dist/utils/cli/index.cjs.map +1 -1
  37. package/dist/utils/cli/index.d.ts.map +1 -1
  38. package/dist/utils/cli/index.js +9 -7
  39. package/dist/utils/cli/index.js.map +1 -1
  40. package/package.json +1 -1
  41. package/dist/canonicalCoreSchemas-MM5HFUT5.js +0 -4
  42. package/dist/chunk-DGUM43GV.js +0 -10
  43. package/dist/chunk-DGUM43GV.js.map +0 -1
  44. package/dist/chunk-JEQ2X3Z6.cjs +0 -12
  45. package/dist/chunk-JEQ2X3Z6.cjs.map +0 -1
  46. package/dist/chunk-THSC7EOF.cjs.map +0 -1
  47. package/dist/chunk-TQBNZYB4.js.map +0 -1
package/dist/index.cjs CHANGED
@@ -1,17 +1,12 @@
1
1
  'use strict';
2
2
 
3
- var chunk5UTVU3NX_cjs = require('./chunk-5UTVU3NX.cjs');
4
- var chunkOFGOQZDI_cjs = require('./chunk-OFGOQZDI.cjs');
5
- var chunkTHSC7EOF_cjs = require('./chunk-THSC7EOF.cjs');
3
+ var chunkR5DEK6YP_cjs = require('./chunk-R5DEK6YP.cjs');
4
+ var chunkJGFLYVXB_cjs = require('./chunk-JGFLYVXB.cjs');
5
+ var chunkMG4YVODT_cjs = require('./chunk-MG4YVODT.cjs');
6
6
  var chunkSOFUWEZ6_cjs = require('./chunk-SOFUWEZ6.cjs');
7
7
  var chunkZNJBRLKN_cjs = require('./chunk-ZNJBRLKN.cjs');
8
8
  require('./chunk-6F5JHLZ7.cjs');
9
- require('./chunk-JEQ2X3Z6.cjs');
10
9
  var path = require('path');
11
- var child_process = require('child_process');
12
- var fs = require('fs');
13
- var os = require('os');
14
- var url = require('url');
15
10
 
16
11
  // src/tools/mcp/MCPClientAdapter.ts
17
12
  function textFromCallToolResult(result) {
@@ -26,7 +21,7 @@ var MCPClientAdapter = class {
26
21
  constructor(client) {
27
22
  this.client = client;
28
23
  }
29
- kind = chunkTHSC7EOF_cjs.MCP_KIND;
24
+ kind = chunkMG4YVODT_cjs.MCP_KIND;
30
25
  async invoke(spec, args, _ctx) {
31
26
  const params = args != null && typeof args === "object" && !Array.isArray(args) ? args : {};
32
27
  const result = await this.client.callTool({ name: spec.name, arguments: params });
@@ -67,7 +62,7 @@ function mcpToolsToSpecs(tools) {
67
62
  return tools.map((t) => ({
68
63
  name: t.name,
69
64
  version: "1.0.0",
70
- kind: chunkTHSC7EOF_cjs.MCP_KIND,
65
+ kind: chunkMG4YVODT_cjs.MCP_KIND,
71
66
  description: t.description ?? `MCP tool: ${t.name}`,
72
67
  inputSchema: t.inputSchema ?? chunkSOFUWEZ6_cjs.DEFAULT_INPUT_SCHEMA,
73
68
  outputSchema: chunkSOFUWEZ6_cjs.DEFAULT_OUTPUT_SCHEMA,
@@ -107,8 +102,8 @@ async function registerMCPToolsFromConfig(runtime, registry, options = {}) {
107
102
  const configPath = options.configPath ?? process.env.MCP_CONFIG_PATH ?? path.join(process.cwd(), "mcp.json");
108
103
  const dirPath = path.dirname(configPath);
109
104
  const entryPoint = path.basename(configPath);
110
- const toolName = options.toolName ?? chunkTHSC7EOF_cjs.MCP_KIND;
111
- const loaded = await chunkOFGOQZDI_cjs.loadMCPTool(dirPath, { kind: chunkTHSC7EOF_cjs.MCP_KIND, name: toolName, entryPoint });
105
+ const toolName = options.toolName ?? chunkMG4YVODT_cjs.MCP_KIND;
106
+ const loaded = await chunkJGFLYVXB_cjs.loadMCPTool(dirPath, { kind: chunkMG4YVODT_cjs.MCP_KIND, name: toolName, entryPoint });
112
107
  if (!loaded.mcpConfig) {
113
108
  throw new Error("mcp.json must have command or url");
114
109
  }
@@ -121,241 +116,166 @@ async function registerMCPToolsFromConfig(runtime, registry, options = {}) {
121
116
  runtime.registerAdapter(new MCPClientAdapter(client));
122
117
  return { transport };
123
118
  }
124
- var DEFAULT_CACHE_BASE = path.join(os.homedir(), ".agent", "cache");
125
- function packagePathSegments(name) {
126
- const withoutScope = name.replace(/^@/, "");
127
- return withoutScope.split("/").filter(Boolean);
128
- }
129
- function resolveCacheDir(cacheBase, packageName, version) {
130
- const segments = packagePathSegments(packageName);
131
- return path.join(cacheBase, ...segments, version);
132
- }
133
- function getVersionFromTarball(tgzName) {
134
- const base = tgzName.replace(/\.tgz$/i, "");
135
- const match = base.match(/-(\d+\.\d+\.\d+(-[a-zA-Z0-9.-]+)?)$/);
136
- return match ? match[1] : base;
137
- }
138
- function ensurePackageInCache(packageName, version = "latest", options = {}) {
139
- const cacheBase = options.cacheBase ?? DEFAULT_CACHE_BASE;
140
- const packDest = path.join(cacheBase, ".pack-tmp", packageName.replace(/@/g, "").replace(/\//g, "_"));
141
- fs.mkdirSync(packDest, { recursive: true });
142
- try {
143
- child_process.execSync(`npm pack ${packageName}@${version} --pack-destination "${packDest}"`, {
144
- cwd: process.cwd(),
145
- stdio: "pipe",
146
- encoding: "utf-8"
147
- });
148
- const files = fs.readdirSync(packDest);
149
- const tgz = files.find((f) => f.endsWith(".tgz"));
150
- if (!tgz) {
151
- throw new Error(`npm pack did not produce a .tgz in ${packDest}`);
152
- }
153
- const resolvedVersion = getVersionFromTarball(tgz);
154
- const cacheDir = resolveCacheDir(cacheBase, packageName, resolvedVersion);
155
- const packageJsonPath = path.join(cacheDir, "package.json");
156
- const nodeModulesPath = path.join(cacheDir, "node_modules");
157
- if (fs.existsSync(packageJsonPath) && fs.existsSync(nodeModulesPath)) {
158
- options.afterInstall?.(cacheDir, packageName);
159
- fs.rmSync(packDest, { recursive: true, force: true });
160
- return cacheDir;
161
- }
162
- const extractDir = path.join(packDest, "extract");
163
- fs.mkdirSync(extractDir, { recursive: true });
164
- child_process.execSync(`tar -xzf "${path.join(packDest, tgz)}" -C "${extractDir}"`, {
165
- stdio: "pipe",
166
- encoding: "utf-8"
167
- });
168
- const extractedPackage = path.join(extractDir, "package");
169
- if (!fs.existsSync(extractedPackage)) {
170
- throw new Error(`Extracted tarball did not contain "package" dir in ${extractDir}`);
171
- }
172
- fs.mkdirSync(path.join(cacheDir, ".."), { recursive: true });
173
- if (fs.existsSync(cacheDir)) {
174
- fs.rmSync(cacheDir, { recursive: true, force: true });
175
- }
176
- fs.renameSync(extractedPackage, cacheDir);
177
- child_process.execSync("npm install", {
178
- cwd: cacheDir,
179
- stdio: "pipe",
180
- encoding: "utf-8"
181
- });
182
- options.afterInstall?.(cacheDir, packageName);
183
- return cacheDir;
184
- } finally {
185
- if (fs.existsSync(packDest)) {
186
- fs.rmSync(packDest, { recursive: true, force: true });
187
- }
188
- }
189
- }
190
- function getPackageEntryPath(packageRoot) {
191
- const pkgPath = path.join(packageRoot, "package.json");
192
- if (!fs.existsSync(pkgPath)) {
193
- throw new Error(`No package.json in ${packageRoot}`);
194
- }
195
- const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
196
- const main = pkg.main ?? "dist/index.js";
197
- const entry = path.join(packageRoot, main);
198
- if (!fs.existsSync(entry)) {
199
- throw new Error(`Entry not found: ${entry}`);
200
- }
201
- return entry;
202
- }
203
- async function importFromCache(packageRoot) {
204
- const entryPath = getPackageEntryPath(packageRoot);
205
- const fileUrl = url.pathToFileURL(entryPath).href;
206
- return import(
207
- /* @vite-ignore */
208
- fileUrl
209
- );
210
- }
211
119
 
212
120
  Object.defineProperty(exports, "LangChainToolsHub", {
213
121
  enumerable: true,
214
- get: function () { return chunk5UTVU3NX_cjs.LangChainToolsHub; }
122
+ get: function () { return chunkR5DEK6YP_cjs.LangChainToolsHub; }
215
123
  });
216
124
  Object.defineProperty(exports, "createAgentTools", {
217
125
  enumerable: true,
218
- get: function () { return chunk5UTVU3NX_cjs.createAgentTools; }
126
+ get: function () { return chunkR5DEK6YP_cjs.createAgentTools; }
219
127
  });
220
128
  Object.defineProperty(exports, "DirectoryScanner", {
221
129
  enumerable: true,
222
- get: function () { return chunkOFGOQZDI_cjs.DirectoryScanner; }
130
+ get: function () { return chunkJGFLYVXB_cjs.DirectoryScanner; }
223
131
  });
224
132
  Object.defineProperty(exports, "DiscoveryError", {
225
133
  enumerable: true,
226
- get: function () { return chunkOFGOQZDI_cjs.DiscoveryError; }
134
+ get: function () { return chunkJGFLYVXB_cjs.DiscoveryError; }
227
135
  });
228
136
  Object.defineProperty(exports, "SkillManifestError", {
229
137
  enumerable: true,
230
- get: function () { return chunkOFGOQZDI_cjs.SkillManifestError; }
138
+ get: function () { return chunkJGFLYVXB_cjs.SkillManifestError; }
231
139
  });
232
140
  Object.defineProperty(exports, "buildFunctionToTool", {
233
141
  enumerable: true,
234
- get: function () { return chunkOFGOQZDI_cjs.buildFunctionToTool; }
142
+ get: function () { return chunkJGFLYVXB_cjs.buildFunctionToTool; }
235
143
  });
236
144
  Object.defineProperty(exports, "buildMcpPackage", {
237
145
  enumerable: true,
238
- get: function () { return chunkOFGOQZDI_cjs.buildMcpPackage; }
146
+ get: function () { return chunkJGFLYVXB_cjs.buildMcpPackage; }
239
147
  });
240
148
  Object.defineProperty(exports, "initProject", {
241
149
  enumerable: true,
242
- get: function () { return chunkOFGOQZDI_cjs.initProject; }
150
+ get: function () { return chunkJGFLYVXB_cjs.initProject; }
243
151
  });
244
152
  Object.defineProperty(exports, "loadMCPTool", {
245
153
  enumerable: true,
246
- get: function () { return chunkOFGOQZDI_cjs.loadMCPTool; }
154
+ get: function () { return chunkJGFLYVXB_cjs.loadMCPTool; }
247
155
  });
248
156
  Object.defineProperty(exports, "loadSkillDefinition", {
249
157
  enumerable: true,
250
- get: function () { return chunkOFGOQZDI_cjs.loadSkillDefinition; }
158
+ get: function () { return chunkJGFLYVXB_cjs.loadSkillDefinition; }
251
159
  });
252
160
  Object.defineProperty(exports, "parseSkillMd", {
253
161
  enumerable: true,
254
- get: function () { return chunkOFGOQZDI_cjs.parseSkillMd; }
162
+ get: function () { return chunkJGFLYVXB_cjs.parseSkillMd; }
255
163
  });
256
164
  Object.defineProperty(exports, "runGeneratedMCP", {
257
165
  enumerable: true,
258
- get: function () { return chunkOFGOQZDI_cjs.runGeneratedMCP; }
166
+ get: function () { return chunkJGFLYVXB_cjs.runGeneratedMCP; }
259
167
  });
260
168
  Object.defineProperty(exports, "runMcpServer", {
261
169
  enumerable: true,
262
- get: function () { return chunkOFGOQZDI_cjs.runMcpServer; }
170
+ get: function () { return chunkJGFLYVXB_cjs.runMcpServer; }
263
171
  });
264
172
  Object.defineProperty(exports, "scan", {
265
173
  enumerable: true,
266
- get: function () { return chunkOFGOQZDI_cjs.scan; }
174
+ get: function () { return chunkJGFLYVXB_cjs.scan; }
267
175
  });
268
176
  Object.defineProperty(exports, "scanForTools", {
269
177
  enumerable: true,
270
- get: function () { return chunkOFGOQZDI_cjs.scanForTools; }
178
+ get: function () { return chunkJGFLYVXB_cjs.scanForTools; }
271
179
  });
272
180
  Object.defineProperty(exports, "scanSkillResources", {
273
181
  enumerable: true,
274
- get: function () { return chunkOFGOQZDI_cjs.scanSkillResources; }
182
+ get: function () { return chunkJGFLYVXB_cjs.scanSkillResources; }
275
183
  });
276
184
  Object.defineProperty(exports, "validateFrontmatter", {
277
185
  enumerable: true,
278
- get: function () { return chunkOFGOQZDI_cjs.validateFrontmatter; }
186
+ get: function () { return chunkJGFLYVXB_cjs.validateFrontmatter; }
279
187
  });
280
188
  Object.defineProperty(exports, "BudgetManager", {
281
189
  enumerable: true,
282
- get: function () { return chunkTHSC7EOF_cjs.BudgetManager; }
190
+ get: function () { return chunkMG4YVODT_cjs.BudgetManager; }
283
191
  });
284
192
  Object.defineProperty(exports, "EventLog", {
285
193
  enumerable: true,
286
- get: function () { return chunkTHSC7EOF_cjs.EventLog; }
194
+ get: function () { return chunkMG4YVODT_cjs.EventLog; }
287
195
  });
288
196
  Object.defineProperty(exports, "Metrics", {
289
197
  enumerable: true,
290
- get: function () { return chunkTHSC7EOF_cjs.Metrics; }
198
+ get: function () { return chunkMG4YVODT_cjs.Metrics; }
291
199
  });
292
200
  Object.defineProperty(exports, "PTCRuntime", {
293
201
  enumerable: true,
294
- get: function () { return chunkTHSC7EOF_cjs.PTCRuntime; }
202
+ get: function () { return chunkMG4YVODT_cjs.PTCRuntime; }
295
203
  });
296
204
  Object.defineProperty(exports, "PolicyDeniedError", {
297
205
  enumerable: true,
298
- get: function () { return chunkTHSC7EOF_cjs.PolicyDeniedError; }
206
+ get: function () { return chunkMG4YVODT_cjs.PolicyDeniedError; }
299
207
  });
300
208
  Object.defineProperty(exports, "PolicyEngine", {
301
209
  enumerable: true,
302
- get: function () { return chunkTHSC7EOF_cjs.PolicyEngine; }
210
+ get: function () { return chunkMG4YVODT_cjs.PolicyEngine; }
303
211
  });
304
212
  Object.defineProperty(exports, "SchemaValidationError", {
305
213
  enumerable: true,
306
- get: function () { return chunkTHSC7EOF_cjs.SchemaValidationError; }
214
+ get: function () { return chunkMG4YVODT_cjs.SchemaValidationError; }
307
215
  });
308
216
  Object.defineProperty(exports, "SchemaValidator", {
309
217
  enumerable: true,
310
- get: function () { return chunkTHSC7EOF_cjs.SchemaValidator; }
218
+ get: function () { return chunkMG4YVODT_cjs.SchemaValidator; }
311
219
  });
312
220
  Object.defineProperty(exports, "Tracing", {
313
221
  enumerable: true,
314
- get: function () { return chunkTHSC7EOF_cjs.Tracing; }
222
+ get: function () { return chunkMG4YVODT_cjs.Tracing; }
315
223
  });
316
224
  Object.defineProperty(exports, "buildEvidence", {
317
225
  enumerable: true,
318
- get: function () { return chunkTHSC7EOF_cjs.buildEvidence; }
226
+ get: function () { return chunkMG4YVODT_cjs.buildEvidence; }
319
227
  });
320
228
  Object.defineProperty(exports, "createLogger", {
321
229
  enumerable: true,
322
- get: function () { return chunkTHSC7EOF_cjs.createLogger; }
230
+ get: function () { return chunkMG4YVODT_cjs.createLogger; }
231
+ });
232
+ Object.defineProperty(exports, "ensurePackageInCache", {
233
+ enumerable: true,
234
+ get: function () { return chunkMG4YVODT_cjs.ensurePackageInCache; }
323
235
  });
324
236
  Object.defineProperty(exports, "expandToolDescriptorsToRegistryNames", {
325
237
  enumerable: true,
326
- get: function () { return chunkTHSC7EOF_cjs.expandToolDescriptorsToRegistryNames; }
238
+ get: function () { return chunkMG4YVODT_cjs.expandToolDescriptorsToRegistryNames; }
239
+ });
240
+ Object.defineProperty(exports, "getPackageEntryPath", {
241
+ enumerable: true,
242
+ get: function () { return chunkMG4YVODT_cjs.getPackageEntryPath; }
243
+ });
244
+ Object.defineProperty(exports, "importFromCache", {
245
+ enumerable: true,
246
+ get: function () { return chunkMG4YVODT_cjs.importFromCache; }
327
247
  });
328
248
  Object.defineProperty(exports, "isNpmToolDescriptor", {
329
249
  enumerable: true,
330
- get: function () { return chunkTHSC7EOF_cjs.isNpmToolDescriptor; }
250
+ get: function () { return chunkMG4YVODT_cjs.isNpmToolDescriptor; }
331
251
  });
332
252
  Object.defineProperty(exports, "loadToolConfig", {
333
253
  enumerable: true,
334
- get: function () { return chunkTHSC7EOF_cjs.loadToolConfig; }
254
+ get: function () { return chunkMG4YVODT_cjs.loadToolConfig; }
335
255
  });
336
256
  Object.defineProperty(exports, "normalizeToolList", {
337
257
  enumerable: true,
338
- get: function () { return chunkTHSC7EOF_cjs.normalizeToolList; }
258
+ get: function () { return chunkMG4YVODT_cjs.normalizeToolList; }
339
259
  });
340
260
  Object.defineProperty(exports, "parseNpmToolDescriptor", {
341
261
  enumerable: true,
342
- get: function () { return chunkTHSC7EOF_cjs.parseNpmToolDescriptor; }
262
+ get: function () { return chunkMG4YVODT_cjs.parseNpmToolDescriptor; }
343
263
  });
344
264
  Object.defineProperty(exports, "resolveNpmToolDescriptor", {
345
265
  enumerable: true,
346
- get: function () { return chunkTHSC7EOF_cjs.resolveNpmToolDescriptor; }
266
+ get: function () { return chunkMG4YVODT_cjs.resolveNpmToolDescriptor; }
347
267
  });
348
268
  Object.defineProperty(exports, "resolveToolDescriptor", {
349
269
  enumerable: true,
350
- get: function () { return chunkTHSC7EOF_cjs.resolveToolDescriptor; }
270
+ get: function () { return chunkMG4YVODT_cjs.resolveToolDescriptor; }
351
271
  });
352
272
  Object.defineProperty(exports, "sanitizeForLog", {
353
273
  enumerable: true,
354
- get: function () { return chunkTHSC7EOF_cjs.sanitizeForLog; }
274
+ get: function () { return chunkMG4YVODT_cjs.sanitizeForLog; }
355
275
  });
356
276
  Object.defineProperty(exports, "summarizeForLog", {
357
277
  enumerable: true,
358
- get: function () { return chunkTHSC7EOF_cjs.summarizeForLog; }
278
+ get: function () { return chunkMG4YVODT_cjs.summarizeForLog; }
359
279
  });
360
280
  Object.defineProperty(exports, "DEFAULT_INPUT_SCHEMA", {
361
281
  enumerable: true,
@@ -388,9 +308,6 @@ Object.defineProperty(exports, "withRetry", {
388
308
  exports.MCPClientAdapter = MCPClientAdapter;
389
309
  exports.MCPProcessManager = MCPProcessManager;
390
310
  exports.connectMCP = connectMCP;
391
- exports.ensurePackageInCache = ensurePackageInCache;
392
- exports.getPackageEntryPath = getPackageEntryPath;
393
- exports.importFromCache = importFromCache;
394
311
  exports.mcpToolsToSpecs = mcpToolsToSpecs;
395
312
  exports.registerMCPToolsFromConfig = registerMCPToolsFromConfig;
396
313
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/tools/mcp/MCPClientAdapter.ts","../src/tools/mcp/connectMCP.ts","../src/tools/mcp/MCPProcessManager.ts","../src/tools/mcp/registerMCPTools.ts","../src/utils/npmCache.ts"],"names":["MCP_KIND","DEFAULT_INPUT_SCHEMA","DEFAULT_OUTPUT_SCHEMA","join","dirname","basename","loadMCPTool","homedir","mkdirSync","execSync","readdirSync","existsSync","rmSync","renameSync","readFileSync","pathToFileURL"],"mappings":";;;;;;;;;;;;;;;;AAmBA,SAAS,uBAAuB,MAAA,EAAgC;AAC9D,EAAA,IAAI,MAAA,CAAO,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,QAAQ,MAAA,CAAO,OAAA,CAClB,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,CAAA,CAAE,QAAQ,IAAI,CAAA,CACjD,IAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AACpB,IAAA,IAAI,KAAA,CAAM,MAAA,EAAQ,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EAC1C;AACA,EAAA,IAAI,OAAO,UAAA,KAAe,MAAA,SAAkB,IAAA,CAAK,SAAA,CAAU,OAAO,UAAU,CAAA;AAC5E,EAAA,OAAO,IAAA,CAAK,UAAU,MAAM,CAAA;AAC9B;AAMO,IAAM,mBAAN,MAA8C;AAAA,EAGnD,YAA6B,MAAA,EAAuB;AAAvB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAwB;AAAA,EAF5C,IAAA,GAAOA,0BAAA;AAAA,EAIhB,MAAM,MAAA,CACJ,IAAA,EACA,IAAA,EACA,IAAA,EAC6C;AAC7C,IAAA,MAAM,MAAA,GAAS,IAAA,IAAQ,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GACzE,IAAA,GACD,EAAC;AACL,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,CAAA;AAChF,IAAA,MAAM,IAAA,GAAO,uBAAuB,MAAM,CAAA;AAC1C,IAAA,IAAI,WAAA,GAAuB,IAAA;AAC3B,IAAA,IAAI;AACF,MAAA,WAAA,GAAc,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,IAC/B,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,OAAO,EAAE,MAAA,EAAQ,WAAA,EAAa,GAAA,EAAK,MAAA,EAAO;AAAA,EAC5C;AACF;;;ACfA,eAAsB,WAAW,cAAA,EAA8D;AAC7F,EAAA,IAAI,cAAA,CAAe,IAAA,KAAS,OAAA,IAAW,CAAC,eAAe,OAAA,EAAS;AAC9D,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,qEAAA,EAAwE,eAAe,IAAI,CAAA;AAAA,KAC7F;AAAA,EACF;AAEA,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAM,OAAO,kCAAkC,CAAA;AAClE,EAAA,MAAM,EAAE,oBAAA,EAAqB,GAAI,MAAM,OACrC,2CACF,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe;AAAA,IACnB,SAAS,cAAA,CAAe,OAAA;AAAA,IACxB,IAAA,EAAM,cAAA,CAAe,IAAA,IAAQ,EAAC;AAAA,IAC9B,KAAK,cAAA,CAAe,GAAA;AAAA,IACpB,KAAK,cAAA,CAAe;AAAA,GACtB;AACA,EAAA,MAAM,SAAA,GAAY,IAAI,oBAAA,CAAqB,YAAY,CAAA;AACvD,EAAA,MAAM,MAAA,GAAS,IAAI,MAAA,CAAO,EAAE,MAAM,YAAA,EAAc,OAAA,EAAS,SAAS,CAAA;AAClE,EAAA,MAAM,MAAA,CAAO,QAAQ,SAAS,CAAA;AAC9B,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA;AAAA,GACF;AACF;AAKO,SAAS,gBAAgB,KAAA,EAAiC;AAC/D,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACvB,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,OAAA,EAAS,OAAA;AAAA,IACT,IAAA,EAAMA,0BAAA;AAAA,IACN,WAAA,EAAa,CAAA,CAAE,WAAA,IAAe,CAAA,UAAA,EAAa,EAAE,IAAI,CAAA,CAAA;AAAA,IACjD,WAAA,EAAa,EAAE,WAAA,IAAeC,sCAAA;AAAA,IAC9B,YAAA,EAAcC,uCAAA;AAAA,IACd,cAAc;AAAC,GACjB,CAAE,CAAA;AACJ;;;AC3DO,IAAM,oBAAN,MAAwB;AAAA,EACZ,WAAA,uBAAkB,GAAA,EAA+B;AAAA,EAElE,iBAAA,CAAkB,UAAkB,MAAA,EAA4C;AAC9E,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA;AAC5C,IAAA,IAAI,QAAQ,OAAO,MAAA;AACnB,IAAA,MAAM,IAAA,GAA0B,OAAO,GAAA,GACnC,EAAE,MAAM,KAAA,EAAO,GAAA,EAAK,MAAA,CAAO,GAAA,EAAI,GAC/B;AAAA,MACE,IAAA,EAAM,OAAA;AAAA,MACN,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,KAAK,MAAA,CAAO;AAAA,KACd;AACJ,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,QAAA,EAAU,IAAI,CAAA;AACnC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAO,QAAA,EAA2B;AAChC,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,QAAQ,CAAA;AAAA,EACzC;AAAA,EAEA,YAAA,GAAyB;AACvB,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA;AAAA,EACpC;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AAAA,EACzB;AACF;;;ACvBA,eAAsB,0BAAA,CACpB,OAAA,EACA,QAAA,EACA,OAAA,GAAmC,EAAC,EACH;AACjC,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,UAAA,IAAc,OAAA,CAAQ,GAAA,CAAI,mBAAmBC,SAAA,CAAK,OAAA,CAAQ,GAAA,EAAI,EAAG,UAAU,CAAA;AACtG,EAAA,MAAM,OAAA,GAAUC,aAAQ,UAAU,CAAA;AAClC,EAAA,MAAM,UAAA,GAAaC,cAAS,UAAU,CAAA;AACtC,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAYL,0BAAA;AAErC,EAAA,MAAM,MAAA,GAAS,MAAMM,6BAAA,CAAY,OAAA,EAAS,EAAE,MAAMN,0BAAA,EAAU,IAAA,EAAM,QAAA,EAAU,UAAA,EAAY,CAAA;AACxF,EAAA,IAAI,CAAC,OAAO,SAAA,EAAW;AACrB,IAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,EACrD;AACA,EAAA,MAAM,OAAA,GAAU,IAAI,iBAAA,EAAkB;AACtC,EAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,iBAAA,CAAkB,QAAA,EAAU,OAAO,SAAS,CAAA;AAE3E,EAAA,MAAM,EAAE,MAAA,EAAQ,SAAA,EAAU,GAAI,MAAM,WAAW,cAAc,CAAA;AAC7D,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,OAAO,SAAA,EAAU;AACzC,EAAA,MAAM,KAAA,GAAQ,gBAAgB,KAAK,CAAA;AACnC,EAAA,QAAA,CAAS,aAAa,KAAK,CAAA;AAC3B,EAAA,OAAA,CAAQ,eAAA,CAAgB,IAAI,gBAAA,CAAiB,MAAM,CAAC,CAAA;AAEpD,EAAA,OAAO,EAAE,SAAA,EAAU;AACrB;ACjCA,IAAM,kBAAA,GAAqBG,SAAAA,CAAKI,UAAA,EAAQ,EAAG,UAAU,OAAO,CAAA;AAK5D,SAAS,oBAAoB,IAAA,EAAwB;AACnD,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA;AAC1C,EAAA,OAAO,YAAA,CAAa,KAAA,CAAM,GAAG,CAAA,CAAE,OAAO,OAAO,CAAA;AAC/C;AAKA,SAAS,eAAA,CAAgB,SAAA,EAAmB,WAAA,EAAqB,OAAA,EAAyB;AACxF,EAAA,MAAM,QAAA,GAAW,oBAAoB,WAAW,CAAA;AAChD,EAAA,OAAOJ,SAAAA,CAAK,SAAA,EAAW,GAAG,QAAA,EAAU,OAAO,CAAA;AAC7C;AAMA,SAAS,sBAAsB,OAAA,EAAyB;AACtD,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA;AAC1C,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,qCAAqC,CAAA;AAC9D,EAAA,OAAO,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,GAAK,IAAA;AAC7B;AAOO,SAAS,qBACd,WAAA,EACA,OAAA,GAAkB,QAAA,EAClB,OAAA,GAAuC,EAAC,EAChC;AACR,EAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,IAAa,kBAAA;AACvC,EAAA,MAAM,QAAA,GAAWA,SAAAA,CAAK,SAAA,EAAW,WAAA,EAAa,WAAA,CAAY,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAC,CAAA;AAC/F,EAAAK,YAAA,CAAU,QAAA,EAAU,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAEvC,EAAA,IAAI;AACF,IAAAC,sBAAA,CAAS,YAAY,WAAW,CAAA,CAAA,EAAI,OAAO,CAAA,qBAAA,EAAwB,QAAQ,CAAA,CAAA,CAAA,EAAK;AAAA,MAC9E,GAAA,EAAK,QAAQ,GAAA,EAAI;AAAA,MACjB,KAAA,EAAO,MAAA;AAAA,MACP,QAAA,EAAU;AAAA,KACX,CAAA;AAED,IAAA,MAAM,KAAA,GAAQC,eAAY,QAAQ,CAAA;AAClC,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,QAAA,CAAS,MAAM,CAAC,CAAA;AAChD,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mCAAA,EAAsC,QAAQ,CAAA,CAAE,CAAA;AAAA,IAClE;AAEA,IAAA,MAAM,eAAA,GAAkB,sBAAsB,GAAG,CAAA;AACjD,IAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,SAAA,EAAW,WAAA,EAAa,eAAe,CAAA;AACxE,IAAA,MAAM,eAAA,GAAkBP,SAAAA,CAAK,QAAA,EAAU,cAAc,CAAA;AACrD,IAAA,MAAM,eAAA,GAAkBA,SAAAA,CAAK,QAAA,EAAU,cAAc,CAAA;AAErD,IAAA,IAAIQ,aAAA,CAAW,eAAe,CAAA,IAAKA,aAAA,CAAW,eAAe,CAAA,EAAG;AAC9D,MAAA,OAAA,CAAQ,YAAA,GAAe,UAAU,WAAW,CAAA;AAC5C,MAAAC,SAAA,CAAO,UAAU,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AACjD,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,MAAM,UAAA,GAAaT,SAAAA,CAAK,QAAA,EAAU,SAAS,CAAA;AAC3C,IAAAK,YAAA,CAAU,UAAA,EAAY,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AACzC,IAAAC,sBAAA,CAAS,aAAaN,SAAAA,CAAK,QAAA,EAAU,GAAG,CAAC,CAAA,MAAA,EAAS,UAAU,CAAA,CAAA,CAAA,EAAK;AAAA,MAC/D,KAAA,EAAO,MAAA;AAAA,MACP,QAAA,EAAU;AAAA,KACX,CAAA;AAED,IAAA,MAAM,gBAAA,GAAmBA,SAAAA,CAAK,UAAA,EAAY,SAAS,CAAA;AACnD,IAAA,IAAI,CAACQ,aAAA,CAAW,gBAAgB,CAAA,EAAG;AACjC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mDAAA,EAAsD,UAAU,CAAA,CAAE,CAAA;AAAA,IACpF;AAEA,IAAAH,YAAA,CAAUL,UAAK,QAAA,EAAU,IAAI,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACnD,IAAA,IAAIQ,aAAA,CAAW,QAAQ,CAAA,EAAG;AACxB,MAAAC,SAAA,CAAO,UAAU,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAA,IACnD;AACA,IAAAC,aAAA,CAAW,kBAAkB,QAAQ,CAAA;AAErC,IAAAJ,sBAAA,CAAS,aAAA,EAAe;AAAA,MACtB,GAAA,EAAK,QAAA;AAAA,MACL,KAAA,EAAO,MAAA;AAAA,MACP,QAAA,EAAU;AAAA,KACX,CAAA;AAED,IAAA,OAAA,CAAQ,YAAA,GAAe,UAAU,WAAW,CAAA;AAC5C,IAAA,OAAO,QAAA;AAAA,EACT,CAAA,SAAE;AACA,IAAA,IAAIE,aAAA,CAAW,QAAQ,CAAA,EAAG;AACxB,MAAAC,SAAA,CAAO,UAAU,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAA,IACnD;AAAA,EACF;AACF;AAKO,SAAS,oBAAoB,WAAA,EAA6B;AAC/D,EAAA,MAAM,OAAA,GAAUT,SAAAA,CAAK,WAAA,EAAa,cAAc,CAAA;AAChD,EAAA,IAAI,CAACQ,aAAA,CAAW,OAAO,CAAA,EAAG;AACxB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,WAAW,CAAA,CAAE,CAAA;AAAA,EACrD;AACA,EAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAMG,eAAA,CAAa,OAAA,EAAS,OAAO,CAAC,CAAA;AACrD,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,IAAQ,eAAA;AACzB,EAAA,MAAM,KAAA,GAAQX,SAAAA,CAAK,WAAA,EAAa,IAAI,CAAA;AACpC,EAAA,IAAI,CAACQ,aAAA,CAAW,KAAK,CAAA,EAAG;AACtB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,KAAK,CAAA,CAAE,CAAA;AAAA,EAC7C;AACA,EAAA,OAAO,KAAA;AACT;AAKA,eAAsB,gBAAgB,WAAA,EAAuC;AAC3E,EAAA,MAAM,SAAA,GAAY,oBAAoB,WAAW,CAAA;AACjD,EAAA,MAAM,OAAA,GAAUI,iBAAA,CAAc,SAAS,CAAA,CAAE,IAAA;AACzC,EAAA,OAAO;AAAA;AAAA,IAA0B;AAAA,GAAA;AACnC","file":"index.cjs","sourcesContent":["/**\n * ToolAdapter for MCP tools: holds SDK Client reference, invoke() calls client.callTool.\n * Framework-level support so scripts use registerMCPToolsFromConfig instead of inline MCP logic.\n */\n\nimport type { ToolAdapter, ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport type { ExecContext } from \"../../core/types/ToolIntent.js\";\nimport { MCP_KIND } from \"./types.js\";\n\n/** SDK Client type (avoid hard typing on @modelcontextprotocol/sdk in this file for optional dep). */\nexport interface MCPClientLike {\n callTool(params: { name: string; arguments: Record<string, unknown> }): Promise<CallToolResult>;\n}\n\nexport interface CallToolResult {\n content?: Array<{ type: string; text?: string }>;\n toolResult?: unknown;\n}\n\nfunction textFromCallToolResult(result: CallToolResult): string {\n if (result.content?.length) {\n const parts = result.content\n .filter((c) => c.type === \"text\" && c.text != null)\n .map((c) => c.text);\n if (parts.length) return parts.join(\"\\n\");\n }\n if (result.toolResult !== undefined) return JSON.stringify(result.toolResult);\n return JSON.stringify(result);\n}\n\n/**\n * Adapter that invokes MCP tools via the SDK Client (callTool).\n * Register with runtime after connecting and listing tools; specs must have kind MCP_KIND.\n */\nexport class MCPClientAdapter implements ToolAdapter {\n readonly kind = MCP_KIND;\n\n constructor(private readonly client: MCPClientLike) {}\n\n async invoke(\n spec: ToolSpec,\n args: unknown,\n _ctx: ExecContext\n ): Promise<{ result: unknown; raw?: unknown }> {\n const params = args != null && typeof args === \"object\" && !Array.isArray(args)\n ? (args as Record<string, unknown>)\n : {};\n const result = await this.client.callTool({ name: spec.name, arguments: params });\n const text = textFromCallToolResult(result);\n let resultValue: unknown = text;\n try {\n resultValue = JSON.parse(text) as unknown;\n } catch {\n // keep as string\n }\n return { result: resultValue, raw: result };\n }\n}\n","/**\n * Connect to an MCP server via stdio using MCPConnectionInfo.\n * Framework-level: uses @modelcontextprotocol/sdk Client + StdioClientTransport.\n */\n\nimport type { MCPConnectionInfo } from \"./MCPProcessManager.js\";\nimport type { ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport { DEFAULT_INPUT_SCHEMA, DEFAULT_OUTPUT_SCHEMA } from \"../../core/types/ToolSpec.js\";\nimport { MCP_KIND } from \"./types.js\";\n\nexport interface MCPConnectResult {\n /** SDK Client; use listTools() and callTool(). */\n client: MCPClientLike;\n /** Transport; call close() when done. */\n transport: MCPTransportLike;\n}\n\nexport interface MCPClientLike {\n connect(transport: MCPTransportLike): Promise<void>;\n listTools(params?: unknown): Promise<{ tools: MCPToolDef[] }>;\n callTool(params: { name: string; arguments: Record<string, unknown> }): Promise<CallToolResult>;\n}\n\nexport interface MCPTransportLike {\n close(): Promise<void>;\n}\n\nexport interface MCPToolDef {\n name: string;\n description?: string;\n inputSchema?: object;\n}\n\nexport interface CallToolResult {\n content?: Array<{ type: string; text?: string }>;\n toolResult?: unknown;\n}\n\n/**\n * Connect to MCP server via stdio. Only stdio is supported; url/SSE not implemented here.\n * Requires @modelcontextprotocol/sdk. Returns client and transport; caller must call transport.close() when done.\n */\nexport async function connectMCP(connectionInfo: MCPConnectionInfo): Promise<MCPConnectResult> {\n if (connectionInfo.type !== \"stdio\" || !connectionInfo.command) {\n throw new Error(\n `MCP stdio requires connectionInfo.type \"stdio\" and command; got type=${connectionInfo.type}`\n );\n }\n\n const { Client } = await import(\"@modelcontextprotocol/sdk/client\");\n const { StdioClientTransport } = await import(\n \"@modelcontextprotocol/sdk/client/stdio.js\"\n );\n\n const serverParams = {\n command: connectionInfo.command,\n args: connectionInfo.args ?? [],\n env: connectionInfo.env,\n cwd: connectionInfo.cwd,\n };\n const transport = new StdioClientTransport(serverParams);\n const client = new Client({ name: \"agent-tool\", version: \"1.0.0\" });\n await client.connect(transport);\n return {\n client: client as unknown as MCPClientLike,\n transport: transport as unknown as MCPTransportLike,\n };\n}\n\n/**\n * Convert MCP listTools() result to ToolSpec[] (kind MCP_KIND) for registry.\n */\nexport function mcpToolsToSpecs(tools: MCPToolDef[]): ToolSpec[] {\n return tools.map((t) => ({\n name: t.name,\n version: \"1.0.0\",\n kind: MCP_KIND,\n description: t.description ?? `MCP tool: ${t.name}`,\n inputSchema: t.inputSchema ?? DEFAULT_INPUT_SCHEMA,\n outputSchema: DEFAULT_OUTPUT_SCHEMA,\n capabilities: [],\n }));\n}\n","import type { MCPServerConfig } from \"../discoveryFactory.js\";\n\n/**\n * Connection info for an MCP server.\n */\nexport interface MCPConnectionInfo {\n /** Transport type: \"url\" for SSE/HTTP, \"stdio\" for command-based */\n type: \"url\" | \"stdio\";\n /** SSE/HTTP URL (when type=\"url\") */\n url?: string;\n /** Command to spawn (when type=\"stdio\") */\n command?: string;\n /** Command arguments (when type=\"stdio\") */\n args?: string[];\n /** Environment variables (when type=\"stdio\") */\n env?: Record<string, string>;\n /** Working directory when spawning (when type=\"stdio\") */\n cwd?: string;\n}\n\n/**\n * Manages MCP server connection information extracted from directory discovery.\n */\nexport class MCPProcessManager {\n private readonly connections = new Map<string, MCPConnectionInfo>();\n\n getConnectionInfo(toolName: string, config: MCPServerConfig): MCPConnectionInfo {\n const cached = this.connections.get(toolName);\n if (cached) return cached;\n const info: MCPConnectionInfo = config.url\n ? { type: \"url\", url: config.url }\n : {\n type: \"stdio\",\n command: config.command!,\n args: config.args,\n env: config.env,\n cwd: config.cwd,\n };\n this.connections.set(toolName, info);\n return info;\n }\n\n remove(toolName: string): boolean {\n return this.connections.delete(toolName);\n }\n\n getToolNames(): string[] {\n return [...this.connections.keys()];\n }\n\n dispose(): void {\n this.connections.clear();\n }\n}\n","/**\n * High-level API: load mcp.json, connect to MCP server, register tools with runtime.\n * Framework-level so scripts call registerMCPToolsFromConfig() instead of inline MCP logic.\n */\n\nimport { basename, dirname, join } from \"node:path\";\nimport type { PTCRuntime } from \"../../core/runtime/PTCRuntime.js\";\nimport type { ToolRegistry } from \"../../core/registry/ToolRegistry.js\";\nimport { MCP_KIND } from \"./types.js\";\nimport { loadMCPTool } from \"./MCPLoader.js\";\nimport { MCPProcessManager } from \"./MCPProcessManager.js\";\nimport { connectMCP, mcpToolsToSpecs } from \"./connectMCP.js\";\nimport { MCPClientAdapter } from \"./MCPClientAdapter.js\";\n\nexport interface RegisterMCPToolsOptions {\n /** Path to mcp.json (or dir containing it). Default: process.env.MCP_CONFIG_PATH or \"mcp.json\" in cwd. */\n configPath?: string;\n /** Tool name for getConnectionInfo (default \"mcp\"). */\n toolName?: string;\n}\n\nexport interface RegisterMCPToolsResult {\n /** Transport; caller must call transport.close() when done. */\n transport: { close(): Promise<void> };\n}\n\n/**\n * Load mcp config (from configPath or MCP_CONFIG_PATH), connect via stdio, list tools,\n * register ToolSpec[] with registry and MCPClientAdapter with runtime. Returns transport for cleanup.\n */\nexport async function registerMCPToolsFromConfig(\n runtime: PTCRuntime,\n registry: ToolRegistry,\n options: RegisterMCPToolsOptions = {}\n): Promise<RegisterMCPToolsResult> {\n const configPath = options.configPath ?? process.env.MCP_CONFIG_PATH ?? join(process.cwd(), \"mcp.json\");\n const dirPath = dirname(configPath);\n const entryPoint = basename(configPath);\n const toolName = options.toolName ?? MCP_KIND;\n\n const loaded = await loadMCPTool(dirPath, { kind: MCP_KIND, name: toolName, entryPoint });\n if (!loaded.mcpConfig) {\n throw new Error(\"mcp.json must have command or url\");\n }\n const manager = new MCPProcessManager();\n const connectionInfo = manager.getConnectionInfo(toolName, loaded.mcpConfig);\n\n const { client, transport } = await connectMCP(connectionInfo);\n const { tools } = await client.listTools();\n const specs = mcpToolsToSpecs(tools);\n registry.bulkRegister(specs);\n runtime.registerAdapter(new MCPClientAdapter(client));\n\n return { transport };\n}\n","/**\n * Framework: resolve an npm package into a local cache folder (like Maven .m2).\n * Cache root: ~/.agent/cache/, organized by package path and version.\n * Packs the package, extracts it, runs npm install in that directory so each\n * downloaded package has its own node_modules—no sharing with the host project—\n * to avoid package conflicts.\n */\n\nimport { execSync } from \"node:child_process\";\nimport { readFileSync, readdirSync, mkdirSync, rmSync, renameSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { pathToFileURL } from \"node:url\";\n\nexport interface EnsurePackageInCacheOptions {\n /** Custom cache root (default: ~/.agent/cache) */\n cacheBase?: string;\n /** Called after npm install; use to add symlinks/aliases in cacheDir/node_modules */\n afterInstall?: (cacheDir: string, packageName: string) => void;\n}\n\nconst DEFAULT_CACHE_BASE = join(homedir(), \".agent\", \"cache\");\n\n/**\n * Package path for cache dir: @scope/name -> scope/name (path segments).\n */\nfunction packagePathSegments(name: string): string[] {\n const withoutScope = name.replace(/^@/, \"\");\n return withoutScope.split(\"/\").filter(Boolean);\n}\n\n/**\n * Resolve cache dir: cacheBase/scope/packageName/version (e.g. ~/.agent/cache/easynet/agent-tool-buildin/0.0.1).\n */\nfunction resolveCacheDir(cacheBase: string, packageName: string, version: string): string {\n const segments = packagePathSegments(packageName);\n return join(cacheBase, ...segments, version);\n}\n\n/**\n * Extract version from packed tarball name (e.g. easynet-agent-tool-buildin-0.0.1.tgz -> 0.0.1)\n * or read from extracted package/package.json.\n */\nfunction getVersionFromTarball(tgzName: string): string {\n const base = tgzName.replace(/\\.tgz$/i, \"\");\n const match = base.match(/-(\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9.-]+)?)$/);\n return match ? match[1]! : base;\n}\n\n/**\n * Ensure the npm package is in the cache: pack, extract, npm install.\n * Returns the package root path (with its own node_modules).\n * Cache layout: ~/.agent/cache/<scope>/<name>/<version>/ (like Maven .m2).\n */\nexport function ensurePackageInCache(\n packageName: string,\n version: string = \"latest\",\n options: EnsurePackageInCacheOptions = {},\n): string {\n const cacheBase = options.cacheBase ?? DEFAULT_CACHE_BASE;\n const packDest = join(cacheBase, \".pack-tmp\", packageName.replace(/@/g, \"\").replace(/\\//g, \"_\"));\n mkdirSync(packDest, { recursive: true });\n\n try {\n execSync(`npm pack ${packageName}@${version} --pack-destination \"${packDest}\"`, {\n cwd: process.cwd(),\n stdio: \"pipe\",\n encoding: \"utf-8\",\n });\n\n const files = readdirSync(packDest);\n const tgz = files.find((f) => f.endsWith(\".tgz\"));\n if (!tgz) {\n throw new Error(`npm pack did not produce a .tgz in ${packDest}`);\n }\n\n const resolvedVersion = getVersionFromTarball(tgz);\n const cacheDir = resolveCacheDir(cacheBase, packageName, resolvedVersion);\n const packageJsonPath = join(cacheDir, \"package.json\");\n const nodeModulesPath = join(cacheDir, \"node_modules\");\n\n if (existsSync(packageJsonPath) && existsSync(nodeModulesPath)) {\n options.afterInstall?.(cacheDir, packageName);\n rmSync(packDest, { recursive: true, force: true });\n return cacheDir;\n }\n\n const extractDir = join(packDest, \"extract\");\n mkdirSync(extractDir, { recursive: true });\n execSync(`tar -xzf \"${join(packDest, tgz)}\" -C \"${extractDir}\"`, {\n stdio: \"pipe\",\n encoding: \"utf-8\",\n });\n\n const extractedPackage = join(extractDir, \"package\");\n if (!existsSync(extractedPackage)) {\n throw new Error(`Extracted tarball did not contain \"package\" dir in ${extractDir}`);\n }\n\n mkdirSync(join(cacheDir, \"..\"), { recursive: true });\n if (existsSync(cacheDir)) {\n rmSync(cacheDir, { recursive: true, force: true });\n }\n renameSync(extractedPackage, cacheDir);\n\n execSync(\"npm install\", {\n cwd: cacheDir,\n stdio: \"pipe\",\n encoding: \"utf-8\",\n });\n\n options.afterInstall?.(cacheDir, packageName);\n return cacheDir;\n } finally {\n if (existsSync(packDest)) {\n rmSync(packDest, { recursive: true, force: true });\n }\n }\n}\n\n/**\n * Resolve the package entry point (main or dist/index.js).\n */\nexport function getPackageEntryPath(packageRoot: string): string {\n const pkgPath = join(packageRoot, \"package.json\");\n if (!existsSync(pkgPath)) {\n throw new Error(`No package.json in ${packageRoot}`);\n }\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as { main?: string; exports?: unknown };\n const main = pkg.main ?? \"dist/index.js\";\n const entry = join(packageRoot, main);\n if (!existsSync(entry)) {\n throw new Error(`Entry not found: ${entry}`);\n }\n return entry;\n}\n\n/**\n * Dynamic import from a cached package (file URL so Node resolves the package's node_modules).\n */\nexport async function importFromCache(packageRoot: string): Promise<unknown> {\n const entryPath = getPackageEntryPath(packageRoot);\n const fileUrl = pathToFileURL(entryPath).href;\n return import(/* @vite-ignore */ fileUrl);\n}\n"]}
1
+ {"version":3,"sources":["../src/tools/mcp/MCPClientAdapter.ts","../src/tools/mcp/connectMCP.ts","../src/tools/mcp/MCPProcessManager.ts","../src/tools/mcp/registerMCPTools.ts"],"names":["MCP_KIND","DEFAULT_INPUT_SCHEMA","DEFAULT_OUTPUT_SCHEMA","join","dirname","basename","loadMCPTool"],"mappings":";;;;;;;;;;;AAmBA,SAAS,uBAAuB,MAAA,EAAgC;AAC9D,EAAA,IAAI,MAAA,CAAO,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,QAAQ,MAAA,CAAO,OAAA,CAClB,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,CAAA,CAAE,QAAQ,IAAI,CAAA,CACjD,IAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AACpB,IAAA,IAAI,KAAA,CAAM,MAAA,EAAQ,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EAC1C;AACA,EAAA,IAAI,OAAO,UAAA,KAAe,MAAA,SAAkB,IAAA,CAAK,SAAA,CAAU,OAAO,UAAU,CAAA;AAC5E,EAAA,OAAO,IAAA,CAAK,UAAU,MAAM,CAAA;AAC9B;AAMO,IAAM,mBAAN,MAA8C;AAAA,EAGnD,YAA6B,MAAA,EAAuB;AAAvB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAwB;AAAA,EAF5C,IAAA,GAAOA,0BAAA;AAAA,EAIhB,MAAM,MAAA,CACJ,IAAA,EACA,IAAA,EACA,IAAA,EAC6C;AAC7C,IAAA,MAAM,MAAA,GAAS,IAAA,IAAQ,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GACzE,IAAA,GACD,EAAC;AACL,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,CAAA;AAChF,IAAA,MAAM,IAAA,GAAO,uBAAuB,MAAM,CAAA;AAC1C,IAAA,IAAI,WAAA,GAAuB,IAAA;AAC3B,IAAA,IAAI;AACF,MAAA,WAAA,GAAc,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,IAC/B,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,OAAO,EAAE,MAAA,EAAQ,WAAA,EAAa,GAAA,EAAK,MAAA,EAAO;AAAA,EAC5C;AACF;;;ACfA,eAAsB,WAAW,cAAA,EAA8D;AAC7F,EAAA,IAAI,cAAA,CAAe,IAAA,KAAS,OAAA,IAAW,CAAC,eAAe,OAAA,EAAS;AAC9D,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,qEAAA,EAAwE,eAAe,IAAI,CAAA;AAAA,KAC7F;AAAA,EACF;AAEA,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAM,OAAO,kCAAkC,CAAA;AAClE,EAAA,MAAM,EAAE,oBAAA,EAAqB,GAAI,MAAM,OACrC,2CACF,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe;AAAA,IACnB,SAAS,cAAA,CAAe,OAAA;AAAA,IACxB,IAAA,EAAM,cAAA,CAAe,IAAA,IAAQ,EAAC;AAAA,IAC9B,KAAK,cAAA,CAAe,GAAA;AAAA,IACpB,KAAK,cAAA,CAAe;AAAA,GACtB;AACA,EAAA,MAAM,SAAA,GAAY,IAAI,oBAAA,CAAqB,YAAY,CAAA;AACvD,EAAA,MAAM,MAAA,GAAS,IAAI,MAAA,CAAO,EAAE,MAAM,YAAA,EAAc,OAAA,EAAS,SAAS,CAAA;AAClE,EAAA,MAAM,MAAA,CAAO,QAAQ,SAAS,CAAA;AAC9B,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA;AAAA,GACF;AACF;AAKO,SAAS,gBAAgB,KAAA,EAAiC;AAC/D,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACvB,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,OAAA,EAAS,OAAA;AAAA,IACT,IAAA,EAAMA,0BAAA;AAAA,IACN,WAAA,EAAa,CAAA,CAAE,WAAA,IAAe,CAAA,UAAA,EAAa,EAAE,IAAI,CAAA,CAAA;AAAA,IACjD,WAAA,EAAa,EAAE,WAAA,IAAeC,sCAAA;AAAA,IAC9B,YAAA,EAAcC,uCAAA;AAAA,IACd,cAAc;AAAC,GACjB,CAAE,CAAA;AACJ;;;AC3DO,IAAM,oBAAN,MAAwB;AAAA,EACZ,WAAA,uBAAkB,GAAA,EAA+B;AAAA,EAElE,iBAAA,CAAkB,UAAkB,MAAA,EAA4C;AAC9E,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA;AAC5C,IAAA,IAAI,QAAQ,OAAO,MAAA;AACnB,IAAA,MAAM,IAAA,GAA0B,OAAO,GAAA,GACnC,EAAE,MAAM,KAAA,EAAO,GAAA,EAAK,MAAA,CAAO,GAAA,EAAI,GAC/B;AAAA,MACE,IAAA,EAAM,OAAA;AAAA,MACN,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,KAAK,MAAA,CAAO;AAAA,KACd;AACJ,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,QAAA,EAAU,IAAI,CAAA;AACnC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAO,QAAA,EAA2B;AAChC,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,QAAQ,CAAA;AAAA,EACzC;AAAA,EAEA,YAAA,GAAyB;AACvB,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA;AAAA,EACpC;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AAAA,EACzB;AACF;;;ACvBA,eAAsB,0BAAA,CACpB,OAAA,EACA,QAAA,EACA,OAAA,GAAmC,EAAC,EACH;AACjC,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,UAAA,IAAc,OAAA,CAAQ,GAAA,CAAI,mBAAmBC,SAAA,CAAK,OAAA,CAAQ,GAAA,EAAI,EAAG,UAAU,CAAA;AACtG,EAAA,MAAM,OAAA,GAAUC,aAAQ,UAAU,CAAA;AAClC,EAAA,MAAM,UAAA,GAAaC,cAAS,UAAU,CAAA;AACtC,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAYL,0BAAA;AAErC,EAAA,MAAM,MAAA,GAAS,MAAMM,6BAAA,CAAY,OAAA,EAAS,EAAE,MAAMN,0BAAA,EAAU,IAAA,EAAM,QAAA,EAAU,UAAA,EAAY,CAAA;AACxF,EAAA,IAAI,CAAC,OAAO,SAAA,EAAW;AACrB,IAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,EACrD;AACA,EAAA,MAAM,OAAA,GAAU,IAAI,iBAAA,EAAkB;AACtC,EAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,iBAAA,CAAkB,QAAA,EAAU,OAAO,SAAS,CAAA;AAE3E,EAAA,MAAM,EAAE,MAAA,EAAQ,SAAA,EAAU,GAAI,MAAM,WAAW,cAAc,CAAA;AAC7D,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,OAAO,SAAA,EAAU;AACzC,EAAA,MAAM,KAAA,GAAQ,gBAAgB,KAAK,CAAA;AACnC,EAAA,QAAA,CAAS,aAAa,KAAK,CAAA;AAC3B,EAAA,OAAA,CAAQ,eAAA,CAAgB,IAAI,gBAAA,CAAiB,MAAM,CAAC,CAAA;AAEpD,EAAA,OAAO,EAAE,SAAA,EAAU;AACrB","file":"index.cjs","sourcesContent":["/**\n * ToolAdapter for MCP tools: holds SDK Client reference, invoke() calls client.callTool.\n * Framework-level support so scripts use registerMCPToolsFromConfig instead of inline MCP logic.\n */\n\nimport type { ToolAdapter, ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport type { ExecContext } from \"../../core/types/ToolIntent.js\";\nimport { MCP_KIND } from \"./types.js\";\n\n/** SDK Client type (avoid hard typing on @modelcontextprotocol/sdk in this file for optional dep). */\nexport interface MCPClientLike {\n callTool(params: { name: string; arguments: Record<string, unknown> }): Promise<CallToolResult>;\n}\n\nexport interface CallToolResult {\n content?: Array<{ type: string; text?: string }>;\n toolResult?: unknown;\n}\n\nfunction textFromCallToolResult(result: CallToolResult): string {\n if (result.content?.length) {\n const parts = result.content\n .filter((c) => c.type === \"text\" && c.text != null)\n .map((c) => c.text);\n if (parts.length) return parts.join(\"\\n\");\n }\n if (result.toolResult !== undefined) return JSON.stringify(result.toolResult);\n return JSON.stringify(result);\n}\n\n/**\n * Adapter that invokes MCP tools via the SDK Client (callTool).\n * Register with runtime after connecting and listing tools; specs must have kind MCP_KIND.\n */\nexport class MCPClientAdapter implements ToolAdapter {\n readonly kind = MCP_KIND;\n\n constructor(private readonly client: MCPClientLike) {}\n\n async invoke(\n spec: ToolSpec,\n args: unknown,\n _ctx: ExecContext\n ): Promise<{ result: unknown; raw?: unknown }> {\n const params = args != null && typeof args === \"object\" && !Array.isArray(args)\n ? (args as Record<string, unknown>)\n : {};\n const result = await this.client.callTool({ name: spec.name, arguments: params });\n const text = textFromCallToolResult(result);\n let resultValue: unknown = text;\n try {\n resultValue = JSON.parse(text) as unknown;\n } catch {\n // keep as string\n }\n return { result: resultValue, raw: result };\n }\n}\n","/**\n * Connect to an MCP server via stdio using MCPConnectionInfo.\n * Framework-level: uses @modelcontextprotocol/sdk Client + StdioClientTransport.\n */\n\nimport type { MCPConnectionInfo } from \"./MCPProcessManager.js\";\nimport type { ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport { DEFAULT_INPUT_SCHEMA, DEFAULT_OUTPUT_SCHEMA } from \"../../core/types/ToolSpec.js\";\nimport { MCP_KIND } from \"./types.js\";\n\nexport interface MCPConnectResult {\n /** SDK Client; use listTools() and callTool(). */\n client: MCPClientLike;\n /** Transport; call close() when done. */\n transport: MCPTransportLike;\n}\n\nexport interface MCPClientLike {\n connect(transport: MCPTransportLike): Promise<void>;\n listTools(params?: unknown): Promise<{ tools: MCPToolDef[] }>;\n callTool(params: { name: string; arguments: Record<string, unknown> }): Promise<CallToolResult>;\n}\n\nexport interface MCPTransportLike {\n close(): Promise<void>;\n}\n\nexport interface MCPToolDef {\n name: string;\n description?: string;\n inputSchema?: object;\n}\n\nexport interface CallToolResult {\n content?: Array<{ type: string; text?: string }>;\n toolResult?: unknown;\n}\n\n/**\n * Connect to MCP server via stdio. Only stdio is supported; url/SSE not implemented here.\n * Requires @modelcontextprotocol/sdk. Returns client and transport; caller must call transport.close() when done.\n */\nexport async function connectMCP(connectionInfo: MCPConnectionInfo): Promise<MCPConnectResult> {\n if (connectionInfo.type !== \"stdio\" || !connectionInfo.command) {\n throw new Error(\n `MCP stdio requires connectionInfo.type \"stdio\" and command; got type=${connectionInfo.type}`\n );\n }\n\n const { Client } = await import(\"@modelcontextprotocol/sdk/client\");\n const { StdioClientTransport } = await import(\n \"@modelcontextprotocol/sdk/client/stdio.js\"\n );\n\n const serverParams = {\n command: connectionInfo.command,\n args: connectionInfo.args ?? [],\n env: connectionInfo.env,\n cwd: connectionInfo.cwd,\n };\n const transport = new StdioClientTransport(serverParams);\n const client = new Client({ name: \"agent-tool\", version: \"1.0.0\" });\n await client.connect(transport);\n return {\n client: client as unknown as MCPClientLike,\n transport: transport as unknown as MCPTransportLike,\n };\n}\n\n/**\n * Convert MCP listTools() result to ToolSpec[] (kind MCP_KIND) for registry.\n */\nexport function mcpToolsToSpecs(tools: MCPToolDef[]): ToolSpec[] {\n return tools.map((t) => ({\n name: t.name,\n version: \"1.0.0\",\n kind: MCP_KIND,\n description: t.description ?? `MCP tool: ${t.name}`,\n inputSchema: t.inputSchema ?? DEFAULT_INPUT_SCHEMA,\n outputSchema: DEFAULT_OUTPUT_SCHEMA,\n capabilities: [],\n }));\n}\n","import type { MCPServerConfig } from \"../discoveryFactory.js\";\n\n/**\n * Connection info for an MCP server.\n */\nexport interface MCPConnectionInfo {\n /** Transport type: \"url\" for SSE/HTTP, \"stdio\" for command-based */\n type: \"url\" | \"stdio\";\n /** SSE/HTTP URL (when type=\"url\") */\n url?: string;\n /** Command to spawn (when type=\"stdio\") */\n command?: string;\n /** Command arguments (when type=\"stdio\") */\n args?: string[];\n /** Environment variables (when type=\"stdio\") */\n env?: Record<string, string>;\n /** Working directory when spawning (when type=\"stdio\") */\n cwd?: string;\n}\n\n/**\n * Manages MCP server connection information extracted from directory discovery.\n */\nexport class MCPProcessManager {\n private readonly connections = new Map<string, MCPConnectionInfo>();\n\n getConnectionInfo(toolName: string, config: MCPServerConfig): MCPConnectionInfo {\n const cached = this.connections.get(toolName);\n if (cached) return cached;\n const info: MCPConnectionInfo = config.url\n ? { type: \"url\", url: config.url }\n : {\n type: \"stdio\",\n command: config.command!,\n args: config.args,\n env: config.env,\n cwd: config.cwd,\n };\n this.connections.set(toolName, info);\n return info;\n }\n\n remove(toolName: string): boolean {\n return this.connections.delete(toolName);\n }\n\n getToolNames(): string[] {\n return [...this.connections.keys()];\n }\n\n dispose(): void {\n this.connections.clear();\n }\n}\n","/**\n * High-level API: load mcp.json, connect to MCP server, register tools with runtime.\n * Framework-level so scripts call registerMCPToolsFromConfig() instead of inline MCP logic.\n */\n\nimport { basename, dirname, join } from \"node:path\";\nimport type { PTCRuntime } from \"../../core/runtime/PTCRuntime.js\";\nimport type { ToolRegistry } from \"../../core/registry/ToolRegistry.js\";\nimport { MCP_KIND } from \"./types.js\";\nimport { loadMCPTool } from \"./MCPLoader.js\";\nimport { MCPProcessManager } from \"./MCPProcessManager.js\";\nimport { connectMCP, mcpToolsToSpecs } from \"./connectMCP.js\";\nimport { MCPClientAdapter } from \"./MCPClientAdapter.js\";\n\nexport interface RegisterMCPToolsOptions {\n /** Path to mcp.json (or dir containing it). Default: process.env.MCP_CONFIG_PATH or \"mcp.json\" in cwd. */\n configPath?: string;\n /** Tool name for getConnectionInfo (default \"mcp\"). */\n toolName?: string;\n}\n\nexport interface RegisterMCPToolsResult {\n /** Transport; caller must call transport.close() when done. */\n transport: { close(): Promise<void> };\n}\n\n/**\n * Load mcp config (from configPath or MCP_CONFIG_PATH), connect via stdio, list tools,\n * register ToolSpec[] with registry and MCPClientAdapter with runtime. Returns transport for cleanup.\n */\nexport async function registerMCPToolsFromConfig(\n runtime: PTCRuntime,\n registry: ToolRegistry,\n options: RegisterMCPToolsOptions = {}\n): Promise<RegisterMCPToolsResult> {\n const configPath = options.configPath ?? process.env.MCP_CONFIG_PATH ?? join(process.cwd(), \"mcp.json\");\n const dirPath = dirname(configPath);\n const entryPoint = basename(configPath);\n const toolName = options.toolName ?? MCP_KIND;\n\n const loaded = await loadMCPTool(dirPath, { kind: MCP_KIND, name: toolName, entryPoint });\n if (!loaded.mcpConfig) {\n throw new Error(\"mcp.json must have command or url\");\n }\n const manager = new MCPProcessManager();\n const connectionInfo = manager.getConnectionInfo(toolName, loaded.mcpConfig);\n\n const { client, transport } = await connectMCP(connectionInfo);\n const { tools } = await client.listTools();\n const specs = mcpToolsToSpecs(tools);\n registry.bulkRegister(specs);\n runtime.registerAdapter(new MCPClientAdapter(client));\n\n return { transport };\n}\n"]}
package/dist/index.js CHANGED
@@ -1,18 +1,13 @@
1
- export { LangChainToolsHub, createAgentTools } from './chunk-BCDIVUGG.js';
2
- import { loadMCPTool } from './chunk-HX57FKJD.js';
3
- export { DirectoryScanner, DiscoveryError, SkillManifestError, buildFunctionToTool, buildMcpPackage, initProject, loadMCPTool, loadSkillDefinition, parseSkillMd, runGeneratedMCP, runMcpServer, scan, scanForTools, scanSkillResources, validateFrontmatter } from './chunk-HX57FKJD.js';
4
- import { MCP_KIND } from './chunk-TQBNZYB4.js';
5
- export { BudgetManager, EventLog, Metrics, PTCRuntime, PolicyDeniedError, PolicyEngine, SchemaValidationError, SchemaValidator, Tracing, buildEvidence, createLogger, expandToolDescriptorsToRegistryNames, isNpmToolDescriptor, loadToolConfig, normalizeToolList, parseNpmToolDescriptor, resolveNpmToolDescriptor, resolveToolDescriptor, sanitizeForLog, summarizeForLog } from './chunk-TQBNZYB4.js';
1
+ export { LangChainToolsHub, createAgentTools } from './chunk-7LKHIMG3.js';
2
+ import { loadMCPTool } from './chunk-FPRNWQMN.js';
3
+ export { DirectoryScanner, DiscoveryError, SkillManifestError, buildFunctionToTool, buildMcpPackage, initProject, loadMCPTool, loadSkillDefinition, parseSkillMd, runGeneratedMCP, runMcpServer, scan, scanForTools, scanSkillResources, validateFrontmatter } from './chunk-FPRNWQMN.js';
4
+ import { MCP_KIND } from './chunk-HEAHNLIZ.js';
5
+ export { BudgetManager, EventLog, Metrics, PTCRuntime, PolicyDeniedError, PolicyEngine, SchemaValidationError, SchemaValidator, Tracing, buildEvidence, createLogger, ensurePackageInCache, expandToolDescriptorsToRegistryNames, getPackageEntryPath, importFromCache, isNpmToolDescriptor, loadToolConfig, normalizeToolList, parseNpmToolDescriptor, resolveNpmToolDescriptor, resolveToolDescriptor, sanitizeForLog, summarizeForLog } from './chunk-HEAHNLIZ.js';
6
6
  import { DEFAULT_OUTPUT_SCHEMA, DEFAULT_INPUT_SCHEMA } from './chunk-5SWSNVMI.js';
7
7
  export { DEFAULT_INPUT_SCHEMA, DEFAULT_OUTPUT_SCHEMA, createToolSpec } from './chunk-5SWSNVMI.js';
8
8
  export { ToolRegistry, createTaggedError, isRetryable, withRetry } from './chunk-AE6FSNGY.js';
9
9
  import './chunk-FR2CXERF.js';
10
- import './chunk-DGUM43GV.js';
11
10
  import { join, dirname, basename } from 'path';
12
- import { execSync } from 'child_process';
13
- import { mkdirSync, readdirSync, existsSync, rmSync, renameSync, readFileSync } from 'fs';
14
- import { homedir } from 'os';
15
- import { pathToFileURL } from 'url';
16
11
 
17
12
  // src/tools/mcp/MCPClientAdapter.ts
18
13
  function textFromCallToolResult(result) {
@@ -122,94 +117,7 @@ async function registerMCPToolsFromConfig(runtime, registry, options = {}) {
122
117
  runtime.registerAdapter(new MCPClientAdapter(client));
123
118
  return { transport };
124
119
  }
125
- var DEFAULT_CACHE_BASE = join(homedir(), ".agent", "cache");
126
- function packagePathSegments(name) {
127
- const withoutScope = name.replace(/^@/, "");
128
- return withoutScope.split("/").filter(Boolean);
129
- }
130
- function resolveCacheDir(cacheBase, packageName, version) {
131
- const segments = packagePathSegments(packageName);
132
- return join(cacheBase, ...segments, version);
133
- }
134
- function getVersionFromTarball(tgzName) {
135
- const base = tgzName.replace(/\.tgz$/i, "");
136
- const match = base.match(/-(\d+\.\d+\.\d+(-[a-zA-Z0-9.-]+)?)$/);
137
- return match ? match[1] : base;
138
- }
139
- function ensurePackageInCache(packageName, version = "latest", options = {}) {
140
- const cacheBase = options.cacheBase ?? DEFAULT_CACHE_BASE;
141
- const packDest = join(cacheBase, ".pack-tmp", packageName.replace(/@/g, "").replace(/\//g, "_"));
142
- mkdirSync(packDest, { recursive: true });
143
- try {
144
- execSync(`npm pack ${packageName}@${version} --pack-destination "${packDest}"`, {
145
- cwd: process.cwd(),
146
- stdio: "pipe",
147
- encoding: "utf-8"
148
- });
149
- const files = readdirSync(packDest);
150
- const tgz = files.find((f) => f.endsWith(".tgz"));
151
- if (!tgz) {
152
- throw new Error(`npm pack did not produce a .tgz in ${packDest}`);
153
- }
154
- const resolvedVersion = getVersionFromTarball(tgz);
155
- const cacheDir = resolveCacheDir(cacheBase, packageName, resolvedVersion);
156
- const packageJsonPath = join(cacheDir, "package.json");
157
- const nodeModulesPath = join(cacheDir, "node_modules");
158
- if (existsSync(packageJsonPath) && existsSync(nodeModulesPath)) {
159
- options.afterInstall?.(cacheDir, packageName);
160
- rmSync(packDest, { recursive: true, force: true });
161
- return cacheDir;
162
- }
163
- const extractDir = join(packDest, "extract");
164
- mkdirSync(extractDir, { recursive: true });
165
- execSync(`tar -xzf "${join(packDest, tgz)}" -C "${extractDir}"`, {
166
- stdio: "pipe",
167
- encoding: "utf-8"
168
- });
169
- const extractedPackage = join(extractDir, "package");
170
- if (!existsSync(extractedPackage)) {
171
- throw new Error(`Extracted tarball did not contain "package" dir in ${extractDir}`);
172
- }
173
- mkdirSync(join(cacheDir, ".."), { recursive: true });
174
- if (existsSync(cacheDir)) {
175
- rmSync(cacheDir, { recursive: true, force: true });
176
- }
177
- renameSync(extractedPackage, cacheDir);
178
- execSync("npm install", {
179
- cwd: cacheDir,
180
- stdio: "pipe",
181
- encoding: "utf-8"
182
- });
183
- options.afterInstall?.(cacheDir, packageName);
184
- return cacheDir;
185
- } finally {
186
- if (existsSync(packDest)) {
187
- rmSync(packDest, { recursive: true, force: true });
188
- }
189
- }
190
- }
191
- function getPackageEntryPath(packageRoot) {
192
- const pkgPath = join(packageRoot, "package.json");
193
- if (!existsSync(pkgPath)) {
194
- throw new Error(`No package.json in ${packageRoot}`);
195
- }
196
- const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
197
- const main = pkg.main ?? "dist/index.js";
198
- const entry = join(packageRoot, main);
199
- if (!existsSync(entry)) {
200
- throw new Error(`Entry not found: ${entry}`);
201
- }
202
- return entry;
203
- }
204
- async function importFromCache(packageRoot) {
205
- const entryPath = getPackageEntryPath(packageRoot);
206
- const fileUrl = pathToFileURL(entryPath).href;
207
- return import(
208
- /* @vite-ignore */
209
- fileUrl
210
- );
211
- }
212
120
 
213
- export { MCPClientAdapter, MCPProcessManager, connectMCP, ensurePackageInCache, getPackageEntryPath, importFromCache, mcpToolsToSpecs, registerMCPToolsFromConfig };
121
+ export { MCPClientAdapter, MCPProcessManager, connectMCP, mcpToolsToSpecs, registerMCPToolsFromConfig };
214
122
  //# sourceMappingURL=index.js.map
215
123
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/tools/mcp/MCPClientAdapter.ts","../src/tools/mcp/connectMCP.ts","../src/tools/mcp/MCPProcessManager.ts","../src/tools/mcp/registerMCPTools.ts","../src/utils/npmCache.ts"],"names":["join"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * ToolAdapter for MCP tools: holds SDK Client reference, invoke() calls client.callTool.\n * Framework-level support so scripts use registerMCPToolsFromConfig instead of inline MCP logic.\n */\n\nimport type { ToolAdapter, ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport type { ExecContext } from \"../../core/types/ToolIntent.js\";\nimport { MCP_KIND } from \"./types.js\";\n\n/** SDK Client type (avoid hard typing on @modelcontextprotocol/sdk in this file for optional dep). */\nexport interface MCPClientLike {\n callTool(params: { name: string; arguments: Record<string, unknown> }): Promise<CallToolResult>;\n}\n\nexport interface CallToolResult {\n content?: Array<{ type: string; text?: string }>;\n toolResult?: unknown;\n}\n\nfunction textFromCallToolResult(result: CallToolResult): string {\n if (result.content?.length) {\n const parts = result.content\n .filter((c) => c.type === \"text\" && c.text != null)\n .map((c) => c.text);\n if (parts.length) return parts.join(\"\\n\");\n }\n if (result.toolResult !== undefined) return JSON.stringify(result.toolResult);\n return JSON.stringify(result);\n}\n\n/**\n * Adapter that invokes MCP tools via the SDK Client (callTool).\n * Register with runtime after connecting and listing tools; specs must have kind MCP_KIND.\n */\nexport class MCPClientAdapter implements ToolAdapter {\n readonly kind = MCP_KIND;\n\n constructor(private readonly client: MCPClientLike) {}\n\n async invoke(\n spec: ToolSpec,\n args: unknown,\n _ctx: ExecContext\n ): Promise<{ result: unknown; raw?: unknown }> {\n const params = args != null && typeof args === \"object\" && !Array.isArray(args)\n ? (args as Record<string, unknown>)\n : {};\n const result = await this.client.callTool({ name: spec.name, arguments: params });\n const text = textFromCallToolResult(result);\n let resultValue: unknown = text;\n try {\n resultValue = JSON.parse(text) as unknown;\n } catch {\n // keep as string\n }\n return { result: resultValue, raw: result };\n }\n}\n","/**\n * Connect to an MCP server via stdio using MCPConnectionInfo.\n * Framework-level: uses @modelcontextprotocol/sdk Client + StdioClientTransport.\n */\n\nimport type { MCPConnectionInfo } from \"./MCPProcessManager.js\";\nimport type { ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport { DEFAULT_INPUT_SCHEMA, DEFAULT_OUTPUT_SCHEMA } from \"../../core/types/ToolSpec.js\";\nimport { MCP_KIND } from \"./types.js\";\n\nexport interface MCPConnectResult {\n /** SDK Client; use listTools() and callTool(). */\n client: MCPClientLike;\n /** Transport; call close() when done. */\n transport: MCPTransportLike;\n}\n\nexport interface MCPClientLike {\n connect(transport: MCPTransportLike): Promise<void>;\n listTools(params?: unknown): Promise<{ tools: MCPToolDef[] }>;\n callTool(params: { name: string; arguments: Record<string, unknown> }): Promise<CallToolResult>;\n}\n\nexport interface MCPTransportLike {\n close(): Promise<void>;\n}\n\nexport interface MCPToolDef {\n name: string;\n description?: string;\n inputSchema?: object;\n}\n\nexport interface CallToolResult {\n content?: Array<{ type: string; text?: string }>;\n toolResult?: unknown;\n}\n\n/**\n * Connect to MCP server via stdio. Only stdio is supported; url/SSE not implemented here.\n * Requires @modelcontextprotocol/sdk. Returns client and transport; caller must call transport.close() when done.\n */\nexport async function connectMCP(connectionInfo: MCPConnectionInfo): Promise<MCPConnectResult> {\n if (connectionInfo.type !== \"stdio\" || !connectionInfo.command) {\n throw new Error(\n `MCP stdio requires connectionInfo.type \"stdio\" and command; got type=${connectionInfo.type}`\n );\n }\n\n const { Client } = await import(\"@modelcontextprotocol/sdk/client\");\n const { StdioClientTransport } = await import(\n \"@modelcontextprotocol/sdk/client/stdio.js\"\n );\n\n const serverParams = {\n command: connectionInfo.command,\n args: connectionInfo.args ?? [],\n env: connectionInfo.env,\n cwd: connectionInfo.cwd,\n };\n const transport = new StdioClientTransport(serverParams);\n const client = new Client({ name: \"agent-tool\", version: \"1.0.0\" });\n await client.connect(transport);\n return {\n client: client as unknown as MCPClientLike,\n transport: transport as unknown as MCPTransportLike,\n };\n}\n\n/**\n * Convert MCP listTools() result to ToolSpec[] (kind MCP_KIND) for registry.\n */\nexport function mcpToolsToSpecs(tools: MCPToolDef[]): ToolSpec[] {\n return tools.map((t) => ({\n name: t.name,\n version: \"1.0.0\",\n kind: MCP_KIND,\n description: t.description ?? `MCP tool: ${t.name}`,\n inputSchema: t.inputSchema ?? DEFAULT_INPUT_SCHEMA,\n outputSchema: DEFAULT_OUTPUT_SCHEMA,\n capabilities: [],\n }));\n}\n","import type { MCPServerConfig } from \"../discoveryFactory.js\";\n\n/**\n * Connection info for an MCP server.\n */\nexport interface MCPConnectionInfo {\n /** Transport type: \"url\" for SSE/HTTP, \"stdio\" for command-based */\n type: \"url\" | \"stdio\";\n /** SSE/HTTP URL (when type=\"url\") */\n url?: string;\n /** Command to spawn (when type=\"stdio\") */\n command?: string;\n /** Command arguments (when type=\"stdio\") */\n args?: string[];\n /** Environment variables (when type=\"stdio\") */\n env?: Record<string, string>;\n /** Working directory when spawning (when type=\"stdio\") */\n cwd?: string;\n}\n\n/**\n * Manages MCP server connection information extracted from directory discovery.\n */\nexport class MCPProcessManager {\n private readonly connections = new Map<string, MCPConnectionInfo>();\n\n getConnectionInfo(toolName: string, config: MCPServerConfig): MCPConnectionInfo {\n const cached = this.connections.get(toolName);\n if (cached) return cached;\n const info: MCPConnectionInfo = config.url\n ? { type: \"url\", url: config.url }\n : {\n type: \"stdio\",\n command: config.command!,\n args: config.args,\n env: config.env,\n cwd: config.cwd,\n };\n this.connections.set(toolName, info);\n return info;\n }\n\n remove(toolName: string): boolean {\n return this.connections.delete(toolName);\n }\n\n getToolNames(): string[] {\n return [...this.connections.keys()];\n }\n\n dispose(): void {\n this.connections.clear();\n }\n}\n","/**\n * High-level API: load mcp.json, connect to MCP server, register tools with runtime.\n * Framework-level so scripts call registerMCPToolsFromConfig() instead of inline MCP logic.\n */\n\nimport { basename, dirname, join } from \"node:path\";\nimport type { PTCRuntime } from \"../../core/runtime/PTCRuntime.js\";\nimport type { ToolRegistry } from \"../../core/registry/ToolRegistry.js\";\nimport { MCP_KIND } from \"./types.js\";\nimport { loadMCPTool } from \"./MCPLoader.js\";\nimport { MCPProcessManager } from \"./MCPProcessManager.js\";\nimport { connectMCP, mcpToolsToSpecs } from \"./connectMCP.js\";\nimport { MCPClientAdapter } from \"./MCPClientAdapter.js\";\n\nexport interface RegisterMCPToolsOptions {\n /** Path to mcp.json (or dir containing it). Default: process.env.MCP_CONFIG_PATH or \"mcp.json\" in cwd. */\n configPath?: string;\n /** Tool name for getConnectionInfo (default \"mcp\"). */\n toolName?: string;\n}\n\nexport interface RegisterMCPToolsResult {\n /** Transport; caller must call transport.close() when done. */\n transport: { close(): Promise<void> };\n}\n\n/**\n * Load mcp config (from configPath or MCP_CONFIG_PATH), connect via stdio, list tools,\n * register ToolSpec[] with registry and MCPClientAdapter with runtime. Returns transport for cleanup.\n */\nexport async function registerMCPToolsFromConfig(\n runtime: PTCRuntime,\n registry: ToolRegistry,\n options: RegisterMCPToolsOptions = {}\n): Promise<RegisterMCPToolsResult> {\n const configPath = options.configPath ?? process.env.MCP_CONFIG_PATH ?? join(process.cwd(), \"mcp.json\");\n const dirPath = dirname(configPath);\n const entryPoint = basename(configPath);\n const toolName = options.toolName ?? MCP_KIND;\n\n const loaded = await loadMCPTool(dirPath, { kind: MCP_KIND, name: toolName, entryPoint });\n if (!loaded.mcpConfig) {\n throw new Error(\"mcp.json must have command or url\");\n }\n const manager = new MCPProcessManager();\n const connectionInfo = manager.getConnectionInfo(toolName, loaded.mcpConfig);\n\n const { client, transport } = await connectMCP(connectionInfo);\n const { tools } = await client.listTools();\n const specs = mcpToolsToSpecs(tools);\n registry.bulkRegister(specs);\n runtime.registerAdapter(new MCPClientAdapter(client));\n\n return { transport };\n}\n","/**\n * Framework: resolve an npm package into a local cache folder (like Maven .m2).\n * Cache root: ~/.agent/cache/, organized by package path and version.\n * Packs the package, extracts it, runs npm install in that directory so each\n * downloaded package has its own node_modules—no sharing with the host project—\n * to avoid package conflicts.\n */\n\nimport { execSync } from \"node:child_process\";\nimport { readFileSync, readdirSync, mkdirSync, rmSync, renameSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { pathToFileURL } from \"node:url\";\n\nexport interface EnsurePackageInCacheOptions {\n /** Custom cache root (default: ~/.agent/cache) */\n cacheBase?: string;\n /** Called after npm install; use to add symlinks/aliases in cacheDir/node_modules */\n afterInstall?: (cacheDir: string, packageName: string) => void;\n}\n\nconst DEFAULT_CACHE_BASE = join(homedir(), \".agent\", \"cache\");\n\n/**\n * Package path for cache dir: @scope/name -> scope/name (path segments).\n */\nfunction packagePathSegments(name: string): string[] {\n const withoutScope = name.replace(/^@/, \"\");\n return withoutScope.split(\"/\").filter(Boolean);\n}\n\n/**\n * Resolve cache dir: cacheBase/scope/packageName/version (e.g. ~/.agent/cache/easynet/agent-tool-buildin/0.0.1).\n */\nfunction resolveCacheDir(cacheBase: string, packageName: string, version: string): string {\n const segments = packagePathSegments(packageName);\n return join(cacheBase, ...segments, version);\n}\n\n/**\n * Extract version from packed tarball name (e.g. easynet-agent-tool-buildin-0.0.1.tgz -> 0.0.1)\n * or read from extracted package/package.json.\n */\nfunction getVersionFromTarball(tgzName: string): string {\n const base = tgzName.replace(/\\.tgz$/i, \"\");\n const match = base.match(/-(\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9.-]+)?)$/);\n return match ? match[1]! : base;\n}\n\n/**\n * Ensure the npm package is in the cache: pack, extract, npm install.\n * Returns the package root path (with its own node_modules).\n * Cache layout: ~/.agent/cache/<scope>/<name>/<version>/ (like Maven .m2).\n */\nexport function ensurePackageInCache(\n packageName: string,\n version: string = \"latest\",\n options: EnsurePackageInCacheOptions = {},\n): string {\n const cacheBase = options.cacheBase ?? DEFAULT_CACHE_BASE;\n const packDest = join(cacheBase, \".pack-tmp\", packageName.replace(/@/g, \"\").replace(/\\//g, \"_\"));\n mkdirSync(packDest, { recursive: true });\n\n try {\n execSync(`npm pack ${packageName}@${version} --pack-destination \"${packDest}\"`, {\n cwd: process.cwd(),\n stdio: \"pipe\",\n encoding: \"utf-8\",\n });\n\n const files = readdirSync(packDest);\n const tgz = files.find((f) => f.endsWith(\".tgz\"));\n if (!tgz) {\n throw new Error(`npm pack did not produce a .tgz in ${packDest}`);\n }\n\n const resolvedVersion = getVersionFromTarball(tgz);\n const cacheDir = resolveCacheDir(cacheBase, packageName, resolvedVersion);\n const packageJsonPath = join(cacheDir, \"package.json\");\n const nodeModulesPath = join(cacheDir, \"node_modules\");\n\n if (existsSync(packageJsonPath) && existsSync(nodeModulesPath)) {\n options.afterInstall?.(cacheDir, packageName);\n rmSync(packDest, { recursive: true, force: true });\n return cacheDir;\n }\n\n const extractDir = join(packDest, \"extract\");\n mkdirSync(extractDir, { recursive: true });\n execSync(`tar -xzf \"${join(packDest, tgz)}\" -C \"${extractDir}\"`, {\n stdio: \"pipe\",\n encoding: \"utf-8\",\n });\n\n const extractedPackage = join(extractDir, \"package\");\n if (!existsSync(extractedPackage)) {\n throw new Error(`Extracted tarball did not contain \"package\" dir in ${extractDir}`);\n }\n\n mkdirSync(join(cacheDir, \"..\"), { recursive: true });\n if (existsSync(cacheDir)) {\n rmSync(cacheDir, { recursive: true, force: true });\n }\n renameSync(extractedPackage, cacheDir);\n\n execSync(\"npm install\", {\n cwd: cacheDir,\n stdio: \"pipe\",\n encoding: \"utf-8\",\n });\n\n options.afterInstall?.(cacheDir, packageName);\n return cacheDir;\n } finally {\n if (existsSync(packDest)) {\n rmSync(packDest, { recursive: true, force: true });\n }\n }\n}\n\n/**\n * Resolve the package entry point (main or dist/index.js).\n */\nexport function getPackageEntryPath(packageRoot: string): string {\n const pkgPath = join(packageRoot, \"package.json\");\n if (!existsSync(pkgPath)) {\n throw new Error(`No package.json in ${packageRoot}`);\n }\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as { main?: string; exports?: unknown };\n const main = pkg.main ?? \"dist/index.js\";\n const entry = join(packageRoot, main);\n if (!existsSync(entry)) {\n throw new Error(`Entry not found: ${entry}`);\n }\n return entry;\n}\n\n/**\n * Dynamic import from a cached package (file URL so Node resolves the package's node_modules).\n */\nexport async function importFromCache(packageRoot: string): Promise<unknown> {\n const entryPath = getPackageEntryPath(packageRoot);\n const fileUrl = pathToFileURL(entryPath).href;\n return import(/* @vite-ignore */ fileUrl);\n}\n"]}
1
+ {"version":3,"sources":["../src/tools/mcp/MCPClientAdapter.ts","../src/tools/mcp/connectMCP.ts","../src/tools/mcp/MCPProcessManager.ts","../src/tools/mcp/registerMCPTools.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * ToolAdapter for MCP tools: holds SDK Client reference, invoke() calls client.callTool.\n * Framework-level support so scripts use registerMCPToolsFromConfig instead of inline MCP logic.\n */\n\nimport type { ToolAdapter, ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport type { ExecContext } from \"../../core/types/ToolIntent.js\";\nimport { MCP_KIND } from \"./types.js\";\n\n/** SDK Client type (avoid hard typing on @modelcontextprotocol/sdk in this file for optional dep). */\nexport interface MCPClientLike {\n callTool(params: { name: string; arguments: Record<string, unknown> }): Promise<CallToolResult>;\n}\n\nexport interface CallToolResult {\n content?: Array<{ type: string; text?: string }>;\n toolResult?: unknown;\n}\n\nfunction textFromCallToolResult(result: CallToolResult): string {\n if (result.content?.length) {\n const parts = result.content\n .filter((c) => c.type === \"text\" && c.text != null)\n .map((c) => c.text);\n if (parts.length) return parts.join(\"\\n\");\n }\n if (result.toolResult !== undefined) return JSON.stringify(result.toolResult);\n return JSON.stringify(result);\n}\n\n/**\n * Adapter that invokes MCP tools via the SDK Client (callTool).\n * Register with runtime after connecting and listing tools; specs must have kind MCP_KIND.\n */\nexport class MCPClientAdapter implements ToolAdapter {\n readonly kind = MCP_KIND;\n\n constructor(private readonly client: MCPClientLike) {}\n\n async invoke(\n spec: ToolSpec,\n args: unknown,\n _ctx: ExecContext\n ): Promise<{ result: unknown; raw?: unknown }> {\n const params = args != null && typeof args === \"object\" && !Array.isArray(args)\n ? (args as Record<string, unknown>)\n : {};\n const result = await this.client.callTool({ name: spec.name, arguments: params });\n const text = textFromCallToolResult(result);\n let resultValue: unknown = text;\n try {\n resultValue = JSON.parse(text) as unknown;\n } catch {\n // keep as string\n }\n return { result: resultValue, raw: result };\n }\n}\n","/**\n * Connect to an MCP server via stdio using MCPConnectionInfo.\n * Framework-level: uses @modelcontextprotocol/sdk Client + StdioClientTransport.\n */\n\nimport type { MCPConnectionInfo } from \"./MCPProcessManager.js\";\nimport type { ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport { DEFAULT_INPUT_SCHEMA, DEFAULT_OUTPUT_SCHEMA } from \"../../core/types/ToolSpec.js\";\nimport { MCP_KIND } from \"./types.js\";\n\nexport interface MCPConnectResult {\n /** SDK Client; use listTools() and callTool(). */\n client: MCPClientLike;\n /** Transport; call close() when done. */\n transport: MCPTransportLike;\n}\n\nexport interface MCPClientLike {\n connect(transport: MCPTransportLike): Promise<void>;\n listTools(params?: unknown): Promise<{ tools: MCPToolDef[] }>;\n callTool(params: { name: string; arguments: Record<string, unknown> }): Promise<CallToolResult>;\n}\n\nexport interface MCPTransportLike {\n close(): Promise<void>;\n}\n\nexport interface MCPToolDef {\n name: string;\n description?: string;\n inputSchema?: object;\n}\n\nexport interface CallToolResult {\n content?: Array<{ type: string; text?: string }>;\n toolResult?: unknown;\n}\n\n/**\n * Connect to MCP server via stdio. Only stdio is supported; url/SSE not implemented here.\n * Requires @modelcontextprotocol/sdk. Returns client and transport; caller must call transport.close() when done.\n */\nexport async function connectMCP(connectionInfo: MCPConnectionInfo): Promise<MCPConnectResult> {\n if (connectionInfo.type !== \"stdio\" || !connectionInfo.command) {\n throw new Error(\n `MCP stdio requires connectionInfo.type \"stdio\" and command; got type=${connectionInfo.type}`\n );\n }\n\n const { Client } = await import(\"@modelcontextprotocol/sdk/client\");\n const { StdioClientTransport } = await import(\n \"@modelcontextprotocol/sdk/client/stdio.js\"\n );\n\n const serverParams = {\n command: connectionInfo.command,\n args: connectionInfo.args ?? [],\n env: connectionInfo.env,\n cwd: connectionInfo.cwd,\n };\n const transport = new StdioClientTransport(serverParams);\n const client = new Client({ name: \"agent-tool\", version: \"1.0.0\" });\n await client.connect(transport);\n return {\n client: client as unknown as MCPClientLike,\n transport: transport as unknown as MCPTransportLike,\n };\n}\n\n/**\n * Convert MCP listTools() result to ToolSpec[] (kind MCP_KIND) for registry.\n */\nexport function mcpToolsToSpecs(tools: MCPToolDef[]): ToolSpec[] {\n return tools.map((t) => ({\n name: t.name,\n version: \"1.0.0\",\n kind: MCP_KIND,\n description: t.description ?? `MCP tool: ${t.name}`,\n inputSchema: t.inputSchema ?? DEFAULT_INPUT_SCHEMA,\n outputSchema: DEFAULT_OUTPUT_SCHEMA,\n capabilities: [],\n }));\n}\n","import type { MCPServerConfig } from \"../discoveryFactory.js\";\n\n/**\n * Connection info for an MCP server.\n */\nexport interface MCPConnectionInfo {\n /** Transport type: \"url\" for SSE/HTTP, \"stdio\" for command-based */\n type: \"url\" | \"stdio\";\n /** SSE/HTTP URL (when type=\"url\") */\n url?: string;\n /** Command to spawn (when type=\"stdio\") */\n command?: string;\n /** Command arguments (when type=\"stdio\") */\n args?: string[];\n /** Environment variables (when type=\"stdio\") */\n env?: Record<string, string>;\n /** Working directory when spawning (when type=\"stdio\") */\n cwd?: string;\n}\n\n/**\n * Manages MCP server connection information extracted from directory discovery.\n */\nexport class MCPProcessManager {\n private readonly connections = new Map<string, MCPConnectionInfo>();\n\n getConnectionInfo(toolName: string, config: MCPServerConfig): MCPConnectionInfo {\n const cached = this.connections.get(toolName);\n if (cached) return cached;\n const info: MCPConnectionInfo = config.url\n ? { type: \"url\", url: config.url }\n : {\n type: \"stdio\",\n command: config.command!,\n args: config.args,\n env: config.env,\n cwd: config.cwd,\n };\n this.connections.set(toolName, info);\n return info;\n }\n\n remove(toolName: string): boolean {\n return this.connections.delete(toolName);\n }\n\n getToolNames(): string[] {\n return [...this.connections.keys()];\n }\n\n dispose(): void {\n this.connections.clear();\n }\n}\n","/**\n * High-level API: load mcp.json, connect to MCP server, register tools with runtime.\n * Framework-level so scripts call registerMCPToolsFromConfig() instead of inline MCP logic.\n */\n\nimport { basename, dirname, join } from \"node:path\";\nimport type { PTCRuntime } from \"../../core/runtime/PTCRuntime.js\";\nimport type { ToolRegistry } from \"../../core/registry/ToolRegistry.js\";\nimport { MCP_KIND } from \"./types.js\";\nimport { loadMCPTool } from \"./MCPLoader.js\";\nimport { MCPProcessManager } from \"./MCPProcessManager.js\";\nimport { connectMCP, mcpToolsToSpecs } from \"./connectMCP.js\";\nimport { MCPClientAdapter } from \"./MCPClientAdapter.js\";\n\nexport interface RegisterMCPToolsOptions {\n /** Path to mcp.json (or dir containing it). Default: process.env.MCP_CONFIG_PATH or \"mcp.json\" in cwd. */\n configPath?: string;\n /** Tool name for getConnectionInfo (default \"mcp\"). */\n toolName?: string;\n}\n\nexport interface RegisterMCPToolsResult {\n /** Transport; caller must call transport.close() when done. */\n transport: { close(): Promise<void> };\n}\n\n/**\n * Load mcp config (from configPath or MCP_CONFIG_PATH), connect via stdio, list tools,\n * register ToolSpec[] with registry and MCPClientAdapter with runtime. Returns transport for cleanup.\n */\nexport async function registerMCPToolsFromConfig(\n runtime: PTCRuntime,\n registry: ToolRegistry,\n options: RegisterMCPToolsOptions = {}\n): Promise<RegisterMCPToolsResult> {\n const configPath = options.configPath ?? process.env.MCP_CONFIG_PATH ?? join(process.cwd(), \"mcp.json\");\n const dirPath = dirname(configPath);\n const entryPoint = basename(configPath);\n const toolName = options.toolName ?? MCP_KIND;\n\n const loaded = await loadMCPTool(dirPath, { kind: MCP_KIND, name: toolName, entryPoint });\n if (!loaded.mcpConfig) {\n throw new Error(\"mcp.json must have command or url\");\n }\n const manager = new MCPProcessManager();\n const connectionInfo = manager.getConnectionInfo(toolName, loaded.mcpConfig);\n\n const { client, transport } = await connectMCP(connectionInfo);\n const { tools } = await client.listTools();\n const specs = mcpToolsToSpecs(tools);\n registry.bulkRegister(specs);\n runtime.registerAdapter(new MCPClientAdapter(client));\n\n return { transport };\n}\n"]}