@easynet/agent-tool 1.0.2 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/main.cjs +14 -14
- package/dist/api/main.js +3 -3
- package/dist/api/runtimeFromConfig.d.ts +13 -4
- package/dist/api/runtimeFromConfig.d.ts.map +1 -1
- package/dist/{chunk-FA2ZEICE.cjs → chunk-4U266P4H.cjs} +40 -14
- package/dist/chunk-4U266P4H.cjs.map +1 -0
- package/dist/{chunk-TBMWJWQ2.js → chunk-7SGI5EGB.js} +3 -3
- package/dist/{chunk-TBMWJWQ2.js.map → chunk-7SGI5EGB.js.map} +1 -1
- package/dist/{chunk-BZOKPJMP.cjs → chunk-KPKQ647P.cjs} +12 -12
- package/dist/{chunk-BZOKPJMP.cjs.map → chunk-KPKQ647P.cjs.map} +1 -1
- package/dist/{chunk-QVH6IQKQ.js → chunk-U55KMDXY.js} +3 -3
- package/dist/{chunk-QVH6IQKQ.js.map → chunk-U55KMDXY.js.map} +1 -1
- package/dist/{chunk-PJ4RUBZL.js → chunk-WOCVXQOW.js} +3 -3
- package/dist/{chunk-PJ4RUBZL.js.map → chunk-WOCVXQOW.js.map} +1 -1
- package/dist/{chunk-ZBNRHRGM.cjs → chunk-XJS3NKHW.cjs} +9 -9
- package/dist/{chunk-ZBNRHRGM.cjs.map → chunk-XJS3NKHW.cjs.map} +1 -1
- package/dist/{chunk-MGEQPAHV.cjs → chunk-YJSGSAS6.cjs} +7 -7
- package/dist/{chunk-MGEQPAHV.cjs.map → chunk-YJSGSAS6.cjs.map} +1 -1
- package/dist/{chunk-Q7KPGWC6.js → chunk-YMCAX4O6.js} +39 -14
- package/dist/chunk-YMCAX4O6.js.map +1 -0
- package/dist/index.cjs +56 -174
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +0 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -7
- package/dist/index.js.map +1 -1
- package/dist/utils/cli/index.cjs +15 -15
- package/dist/utils/cli/index.js +3 -3
- package/package.json +1 -3
- package/dist/chunk-FA2ZEICE.cjs.map +0 -1
- package/dist/chunk-Q7KPGWC6.js.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunk4U266P4H_cjs = require('./chunk-4U266P4H.cjs');
|
|
4
4
|
var chunk6F5JHLZ7_cjs = require('./chunk-6F5JHLZ7.cjs');
|
|
5
5
|
var http = require('http');
|
|
6
6
|
|
|
@@ -325,7 +325,7 @@ function listenOpenAPIHttpServer(server, options = {}) {
|
|
|
325
325
|
});
|
|
326
326
|
}
|
|
327
327
|
async function createHttpService(runtimeOrConfig, options = {}) {
|
|
328
|
-
const runtime = "invoke" in runtimeOrConfig && typeof runtimeOrConfig.invoke === "function" ? runtimeOrConfig : (await
|
|
328
|
+
const runtime = "invoke" in runtimeOrConfig && typeof runtimeOrConfig.invoke === "function" ? runtimeOrConfig : (await chunk4U266P4H_cjs.createRuntimeFromConfig(runtimeOrConfig)).runtime;
|
|
329
329
|
const server = createOpenAPIHttpServer(runtime, options);
|
|
330
330
|
const openApiSpec = toolsToOpenAPISpec(runtime.getRegistry(), {
|
|
331
331
|
title: options.title ?? "Tool API",
|
|
@@ -373,7 +373,7 @@ async function createMcpServerWithTools(runtime, options) {
|
|
|
373
373
|
async (args) => {
|
|
374
374
|
const ctx = ctxFactory();
|
|
375
375
|
const result = await runtime.invoke(
|
|
376
|
-
{ tool: spec.name, args: args ?? {}, purpose:
|
|
376
|
+
{ tool: spec.name, args: args ?? {}, purpose: chunk4U266P4H_cjs.MCP_KIND },
|
|
377
377
|
ctx
|
|
378
378
|
);
|
|
379
379
|
if (result.ok) {
|
|
@@ -395,7 +395,7 @@ async function createMcpServerWithTools(runtime, options) {
|
|
|
395
395
|
return { server };
|
|
396
396
|
}
|
|
397
397
|
async function createMCPServer(runtimeOrConfig, options = {}) {
|
|
398
|
-
const runtime = "invoke" in runtimeOrConfig && typeof runtimeOrConfig.invoke === "function" ? runtimeOrConfig : (await
|
|
398
|
+
const runtime = "invoke" in runtimeOrConfig && typeof runtimeOrConfig.invoke === "function" ? runtimeOrConfig : (await chunk4U266P4H_cjs.createRuntimeFromConfig(runtimeOrConfig)).runtime;
|
|
399
399
|
const { StdioServerTransport } = await import('@modelcontextprotocol/sdk/server/stdio.js');
|
|
400
400
|
const { server } = await createMcpServerWithTools(runtime, options);
|
|
401
401
|
return {
|
|
@@ -432,7 +432,7 @@ function createMCPStreamableHttpHandler(runtimeOrConfig, options = {}) {
|
|
|
432
432
|
};
|
|
433
433
|
}
|
|
434
434
|
return (async () => {
|
|
435
|
-
const { runtime } = await
|
|
435
|
+
const { runtime } = await chunk4U266P4H_cjs.createRuntimeFromConfig(runtimeOrConfig);
|
|
436
436
|
return createMCPStreamableHttpHandler(runtime, options);
|
|
437
437
|
})();
|
|
438
438
|
}
|
|
@@ -471,5 +471,5 @@ exports.createMCPServer = createMCPServer;
|
|
|
471
471
|
exports.createMCPServerStreamableHttp = createMCPServerStreamableHttp;
|
|
472
472
|
exports.createMCPStreamableHttpHandler = createMCPStreamableHttpHandler;
|
|
473
473
|
exports.runMCPServerOverStdio = runMCPServerOverStdio;
|
|
474
|
-
//# sourceMappingURL=chunk-
|
|
475
|
-
//# sourceMappingURL=chunk-
|
|
474
|
+
//# sourceMappingURL=chunk-YJSGSAS6.cjs.map
|
|
475
|
+
//# sourceMappingURL=chunk-YJSGSAS6.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api/expose/openapi.ts","../src/api/expose/openapiHttp.ts","../src/api/expose/mcpServer.ts"],"names":["enrichSpecWithCanonicalSchema","createServer","createRuntimeFromConfig","DEFAULT_CTX","MCP_KIND"],"mappings":";;;;;;;AAmBO,SAAS,eAAe,IAAA,EAAsB;AACnD,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAChC;AAGO,SAAS,eAAe,IAAA,EAAsB;AACnD,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA;AAC/B;AAGA,SAAS,cAAc,IAAA,EAAsB;AAC3C,EAAA,OAAO,CAAA,KAAA,EAAQ,IAAA,CAAK,OAAA,CAAQ,gBAAA,EAAkB,GAAG,CAAC,CAAA,CAAA;AACpD;AAEA,IAAM,YAAA,GAAe;AAAA,EACnB,IAAA,EAAM,QAAA;AAAA,EACN,UAAA,EAAY;AAAA,IACV,MAAA,EAAQ,EAAE,WAAA,EAAa,mBAAA,EAAqB,sBAAsB,IAAA;AAAK;AAE3E,CAAA;AACA,IAAM,WAAA,GAAc;AAAA,EAClB,IAAA,EAAM,QAAA;AAAA,EACN,UAAA,EAAY;AAAA,IACV,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,IACxB,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,IACvB,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAU,sBAAsB,IAAA;AAAK;AAE1D,CAAA;AAMO,SAAS,kBAAA,CACd,QAAA,EACA,OAAA,GAA8B,EAAC,EACN;AACzB,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,UAAA;AAC/B,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,OAAA;AACnC,EAAA,MAAM,YAAY,OAAA,CAAQ,QAAA,IAAY,EAAA,EAAI,OAAA,CAAQ,OAAO,EAAE,CAAA;AAC3D,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,QAAA,EAAS,CAAE,IAAIA,+CAA6B,CAAA;AAEnE,EAAA,MAAM,eAAA,GAAkB;AAAA,IACtB,IAAA,EAAM,QAAA;AAAA,IACN,QAAA,EAAU,CAAC,OAAO,CAAA;AAAA,IAClB,UAAA,EAAY;AAAA,MACV,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY;AAAA,YACV,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YACvB,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YAC9B,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA;AAAS;AACzB;AACF;AACF;AACF,GACF;AAEA,EAAA,MAAM,iBAAA,GAAoB;AAAA,IACxB,IAAA,EAAM,QAAA;AAAA,IACN,QAAA,EAAU,CAAC,MAAA,EAAQ,MAAM,CAAA;AAAA,IACzB,UAAA,EAAY;AAAA,MACV,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,kCAAA,EAAmC;AAAA,MACxE,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa,uEAAA;AAAA,QACb,oBAAA,EAAsB;AAAA;AACxB;AACF,GACF;AAEA,EAAA,MAAM,MAAA,GAAS,QAAA,GAAW,CAAA,EAAG,QAAQ,CAAA,CAAA,CAAA,GAAM,GAAA;AAC3C,EAAA,MAAM,KAAA,GAAiC;AAAA,IACrC,CAAC,CAAA,EAAG,MAAM,CAAA,KAAA,CAAO,GAAG;AAAA,MAClB,GAAA,EAAK;AAAA,QACH,OAAA,EAAS,YAAA;AAAA,QACT,WAAA,EAAa,qDAAA;AAAA,QACb,WAAA,EAAa,WAAA;AAAA,QACb,SAAA,EAAW;AAAA,UACT,KAAA,EAAO;AAAA,YACL,WAAA,EAAa,eAAA;AAAA,YACb,OAAA,EAAS;AAAA,cACP,kBAAA,EAAoB;AAAA,gBAClB,MAAA,EAAQ;AAAA;AACV;AACF;AACF;AACF;AACF,KACF;AAAA,IACA,CAAC,CAAA,EAAG,MAAM,CAAA,MAAA,CAAQ,GAAG;AAAA,MACnB,IAAA,EAAM;AAAA,QACJ,OAAA,EAAS,yBAAA;AAAA,QACT,WAAA,EAAa,gGAAA;AAAA,QACb,WAAA,EAAa,YAAA;AAAA,QACb,WAAA,EAAa;AAAA,UACX,QAAA,EAAU,IAAA;AAAA,UACV,OAAA,EAAS;AAAA,YACP,kBAAA,EAAoB;AAAA,cAClB,MAAA,EAAQ;AAAA;AACV;AACF,SACF;AAAA,QACA,SAAA,EAAW;AAAA,UACT,KAAA,EAAO;AAAA,YACL,WAAA,EAAa,aAAA;AAAA,YACb,SAAS,EAAE,kBAAA,EAAoB,EAAE,MAAA,EAAQ,cAAa;AAAE,WAC1D;AAAA,UACA,KAAA,EAAO;AAAA,YACL,WAAA,EAAa,aAAA;AAAA,YACb,SAAS,EAAE,kBAAA,EAAoB,EAAE,MAAA,EAAQ,aAAY;AAAE;AACzD;AACF;AACF;AACF,GACF;AAEA,EAAA,MAAM,gBAAoC,EAAC;AAC3C,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,MAAM,GAAA,GAAM,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA;AAChC,IAAA,aAAA,CAAc,IAAA,CAAK,CAAC,GAAA,EAAK,CAAA,CAAE,WAAqB,CAAC,CAAA;AACjD,IAAA,MAAM,IAAA,GAAO,cAAA,CAAe,CAAA,CAAE,IAAI,CAAA;AAClC,IAAA,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,OAAA,EAAU,IAAI,EAAE,CAAA,GAAI;AAAA,MACjC,IAAA,EAAM;AAAA,QACJ,OAAA,EAAS,CAAA,CAAE,WAAA,IAAe,CAAA,CAAE,IAAA;AAAA,QAC5B,WAAA,EAAa,CAAA,cAAA,EAAiB,CAAA,CAAE,IAAI,CAAA,6DAAA,CAAA;AAAA,QACpC,WAAA,EAAa,UAAU,GAAG,CAAA,CAAA;AAAA,QAC1B,WAAA,EAAa;AAAA,UACX,QAAA,EAAU,IAAA;AAAA,UACV,OAAA,EAAS;AAAA,YACP,kBAAA,EAAoB;AAAA,cAClB,MAAA,EAAQ,EAAE,IAAA,EAAM,CAAA,qBAAA,EAAwB,GAAG,CAAA,CAAA;AAAG;AAChD;AACF,SACF;AAAA,QACA,SAAA,EAAW;AAAA,UACT,KAAA,EAAO;AAAA,YACL,WAAA,EAAa,aAAA;AAAA,YACb,SAAS,EAAE,kBAAA,EAAoB,EAAE,MAAA,EAAQ,cAAa;AAAE,WAC1D;AAAA,UACA,KAAA,EAAO;AAAA,YACL,WAAA,EAAa,0CAAA;AAAA,YACb,SAAS,EAAE,kBAAA,EAAoB,EAAE,MAAA,EAAQ,aAAY;AAAE;AACzD;AACF;AACF,KACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,OAAA;AAAA,IACT,IAAA,EAAM,EAAE,KAAA,EAAO,OAAA,EAAQ;AAAA,IACvB,KAAA;AAAA,IACA,UAAA,EAAY;AAAA,MACV,OAAA,EAAS,MAAA,CAAO,WAAA,CAAY,aAAa;AAAA;AAC3C,GACF;AACF;;;AC3JA,IAAM,WAAA,GAA2B;AAAA,EAC/B,SAAA,EAAW,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,EACvE,MAAA,EAAQ,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAAA,EAC1B,WAAA,EAAa;AAAA,IACX,UAAA;AAAA,IAAY,SAAA;AAAA,IAAW,UAAA;AAAA,IAAY,SAAA;AAAA,IAAW,UAAA;AAAA,IAC9C,SAAA;AAAA,IAAW,UAAA;AAAA,IAAY;AAAA;AAE3B,CAAA;AAEA,SAAS,UAAU,GAAA,EAAwC;AACzD,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,GAAA,CAAI,GAAG,MAAA,EAAQ,CAAC,UAAU,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAA;AAC5C,IAAA,GAAA,CAAI,EAAA,CAAG,OAAO,MAAM;AAClB,MAAA,MAAM,MAAM,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA,CAAE,SAAS,OAAO,CAAA;AAClD,MAAA,IAAI,CAAC,GAAA,CAAI,IAAA,EAAK,EAAG;AACf,QAAA,OAAA,CAAQ,EAAE,CAAA;AACV,QAAA;AAAA,MACF;AACA,MAAA,IAAI;AACF,QAAA,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAY,CAAA;AAAA,MACpC,CAAA,CAAA,MAAQ;AACN,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,mBAAmB,CAAC,CAAA;AAAA,MACvC;AAAA,IACF,CAAC,CAAA;AACD,IAAA,GAAA,CAAI,EAAA,CAAG,SAAS,MAAM,CAAA;AAAA,EACxB,CAAC,CAAA;AACH;AAEA,SAAS,QAAA,CAAS,GAAA,EAAqB,MAAA,EAAgB,IAAA,EAAqB;AAC1E,EAAA,GAAA,CAAI,SAAA,CAAU,MAAA,EAAQ,EAAE,cAAA,EAAgB,oBAAoB,CAAA;AAC5D,EAAA,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AAC9B;AAGA,SAAS,cAAc,OAAA,EAAyB;AAC9C,EAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,OAAA,CAAQ,IAAA,EAAM,QAAQ,CAAA;AACrD,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAA,EAeO,cAAc,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAAA,CAAA;AAa9B;AASO,SAAS,uBAAA,CACd,OAAA,EACA,OAAA,GAAoC,EAAC,EACT;AAC5B,EAAA,MAAM,YAAY,OAAA,CAAQ,QAAA,IAAY,EAAA,EAAI,OAAA,CAAQ,OAAO,EAAE,CAAA;AAC3D,EAAA,MAAM,aAAa,OAAA,CAAQ,kBAAA,KAAuB,OAAO,EAAE,GAAG,WAAA,EAAY,CAAA,CAAA;AAE1E,EAAA,MAAM,MAAA,GAASC,iBAAA,CAAa,OAAO,GAAA,EAAsB,GAAA,KAAwB;AAC/E,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,IAAO,GAAA;AACvB,IAAA,MAAM,OAAO,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,GAAA;AAClC,IAAA,MAAM,IAAA,GAAO,QAAA,GAAY,IAAA,KAAS,QAAA,GAAW,EAAA,GAAK,KAAK,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA,IAAK,GAAA,GAAO,IAAA;AAEvF,IAAA,IAAI;AACF,MAAA,IAAI,IAAI,MAAA,KAAW,KAAA,KAAU,IAAA,KAAS,GAAA,IAAO,SAAS,UAAA,CAAA,EAAa;AACjE,QAAA,MAAM,QAAA,GAAW,QAAA,GAAW,CAAA,EAAG,QAAQ,CAAA,aAAA,CAAA,GAAkB,eAAA;AACzD,QAAA,MAAM,IAAA,GAAO,cAAc,QAAQ,CAAA;AACnC,QAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,4BAA4B,CAAA;AACjE,QAAA,GAAA,CAAI,IAAI,IAAI,CAAA;AACZ,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,IAAI,MAAA,KAAW,KAAA,KAAU,IAAA,KAAS,eAAA,IAAmB,SAAS,OAAA,CAAA,EAAU;AAC1E,QAAA,MAAM,IAAA,GAAO,kBAAA,CAAmB,OAAA,CAAQ,WAAA,EAAY,EAAG;AAAA,UACrD,KAAA,EAAO,UAAA;AAAA,UACP,OAAA,EAAS,OAAA;AAAA,UACT,UAAU,QAAA,IAAY,KAAA;AAAA,SACvB,CAAA;AACD,QAAA,QAAA,CAAS,GAAA,EAAK,KAAK,IAAI,CAAA;AACvB,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,GAAA,CAAI,MAAA,KAAW,KAAA,IAAS,IAAA,KAAS,QAAA,EAAU;AAC7C,QAAA,MAAM,EAAE,6BAAA,EAAAD,8BAAAA,EAA8B,GAAI,MAAM,OAAO,qCAA0C,CAAA;AACjG,QAAA,MAAM,QAAQ,OAAA,CAAQ,WAAA,GAAc,QAAA,EAAS,CAAE,IAAIA,8BAA6B,CAAA;AAChF,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,UAC9B,MAAM,CAAA,CAAE,IAAA;AAAA,UACR,aAAa,CAAA,CAAE,WAAA;AAAA,UACf,MAAM,CAAA,CAAE,IAAA;AAAA,UACR,aAAa,CAAA,CAAE;AAAA,SACjB,CAAE,CAAA;AACF,QAAA,QAAA,CAAS,GAAA,EAAK,GAAA,EAAK,EAAE,KAAA,EAAO,CAAA;AAC5B,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,GAAA,CAAI,MAAA,KAAW,MAAA,IAAU,IAAA,KAAS,SAAA,EAAW;AAC/C,QAAA,MAAM,IAAA,GAAQ,MAAM,SAAA,CAAU,GAAG,CAAA;AACjC,QAAA,MAAM,OAAO,IAAA,EAAM,IAAA;AACnB,QAAA,MAAM,IAAA,GAAO,IAAA,EAAM,IAAA,IAAQ,EAAC;AAC5B,QAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,CAAC,IAAA,CAAK,MAAK,EAAG;AAC5C,UAAA,QAAA,CAAS,KAAK,GAAA,EAAK,EAAE,OAAO,mCAAA,EAAqC,IAAA,EAAM,eAAe,CAAA;AACtF,UAAA;AAAA,QACF;AACA,QAAA,MAAM,GAAA,GAAM,WAAW,GAAG,CAAA;AAC1B,QAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,MAAA;AAAA,UAC3B,EAAE,IAAA,EAAM,IAAA,CAAK,MAAK,EAAG,IAAA,EAAM,SAAS,SAAA,EAAU;AAAA,UAC9C;AAAA,SACF;AACA,QAAA,IAAI,OAAO,EAAA,EAAI;AACb,UAAA,QAAA,CAAS,KAAK,GAAA,EAAK,EAAE,MAAA,EAAQ,MAAA,CAAO,QAAQ,CAAA;AAC5C,UAAA;AAAA,QACF;AACA,QAAA,QAAA,CAAS,KAAK,GAAA,EAAK;AAAA,UACjB,KAAA,EAAO,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,aAAA;AAAA,UAChC,IAAA,EAAM,OAAO,KAAA,EAAO,IAAA;AAAA,UACpB,OAAA,EAAS,OAAO,KAAA,EAAO;AAAA,SACxB,CAAA;AACD,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,GAAA,CAAI,MAAA,KAAW,MAAA,IAAU,IAAA,CAAK,UAAA,CAAW,UAAU,CAAA,IAAK,IAAA,CAAK,MAAA,GAAS,UAAA,CAAW,MAAA,EAAQ;AAC3F,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,MAAM,CAAA;AACzC,QAAA,MAAM,QAAA,GAAW,eAAe,IAAI,CAAA;AACpC,QAAA,IAAI,IAAA;AACJ,QAAA,IAAI;AACF,UAAA,IAAA,GAAO,MAAM,UAAU,GAAG,CAAA;AAAA,QAC5B,CAAA,CAAA,MAAQ;AACN,UAAA,QAAA,CAAS,KAAK,GAAA,EAAK,EAAE,OAAO,mBAAA,EAAqB,IAAA,EAAM,eAAe,CAAA;AACtE,UAAA;AAAA,QACF;AACA,QAAA,MAAM,GAAA,GAAM,WAAW,GAAG,CAAA;AAC1B,QAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,MAAA;AAAA,UAC3B,EAAE,MAAM,QAAA,EAAU,IAAA,EAAM,QAAQ,EAAC,EAAG,SAAS,SAAA,EAAU;AAAA,UACvD;AAAA,SACF;AACA,QAAA,IAAI,OAAO,EAAA,EAAI;AACb,UAAA,QAAA,CAAS,KAAK,GAAA,EAAK,EAAE,MAAA,EAAQ,MAAA,CAAO,QAAQ,CAAA;AAC5C,UAAA;AAAA,QACF;AACA,QAAA,QAAA,CAAS,KAAK,GAAA,EAAK;AAAA,UACjB,KAAA,EAAO,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,aAAA;AAAA,UAChC,IAAA,EAAM,OAAO,KAAA,EAAO,IAAA;AAAA,UACpB,OAAA,EAAS,OAAO,KAAA,EAAO;AAAA,SACxB,CAAA;AACD,QAAA;AAAA,MACF;AAEA,MAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,oBAAoB,CAAA;AACzD,MAAA,GAAA,CAAI,GAAA,CAAI,KAAK,SAAA,CAAU,EAAE,OAAO,WAAA,EAAa,IAAA,EAAM,IAAA,EAAM,CAAC,CAAA;AAAA,IAC5D,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,UAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC/D,MAAA,QAAA,CAAS,KAAK,GAAA,EAAK,EAAE,OAAO,OAAA,EAAS,IAAA,EAAM,kBAAkB,CAAA;AAAA,IAC/D;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;AAMO,SAAS,uBAAA,CACd,MAAA,EACA,OAAA,GAA4C,EAAC,EACJ;AACzC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,CAAA;AAC7B,IAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,WAAA;AAC7B,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM,IAAA,EAAM,MAAM;AAC9B,MAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,MAAA,MAAM,UAAA,GAAa,OAAO,IAAA,KAAS,QAAA,IAAY,MAAM,IAAA,IAAQ,IAAA,GAAO,KAAK,IAAA,GAAO,IAAA;AAChF,MAAA,OAAA,CAAQ,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,CAAA;AAAA,IACpC,CAAC,CAAA;AACD,IAAA,MAAA,CAAO,EAAA,CAAG,SAAS,MAAM,CAAA;AAAA,EAC3B,CAAC,CAAA;AACH;AAmCA,eAAsB,iBAAA,CACpB,eAAA,EACA,OAAA,GAAoC,EAAC,EACT;AAC5B,EAAA,MAAM,OAAA,GACJ,QAAA,IAAY,eAAA,IAAmB,OAAO,eAAA,CAAgB,MAAA,KAAW,UAAA,GAC5D,eAAA,GAAA,CACA,MAAME,yCAAA,CAAwB,eAAuC,CAAA,EAAG,OAAA;AAC/E,EAAA,MAAM,MAAA,GAAS,uBAAA,CAAwB,OAAA,EAAS,OAAO,CAAA;AACvD,EAAA,MAAM,WAAA,GAAc,kBAAA,CAAmB,OAAA,CAAQ,WAAA,EAAY,EAAG;AAAA,IAC5D,KAAA,EAAO,QAAQ,KAAA,IAAS,UAAA;AAAA,IACxB,OAAA,EAAS,QAAQ,OAAA,IAAW,OAAA;AAAA,IAC5B,UAAU,OAAA,CAAQ;AAAA,GACnB,CAAA;AACD,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,WAAA;AAAA,IACA,MAAA,EAAQ,CAAC,UAAA,KAAe,uBAAA,CAAwB,QAAQ,UAAU;AAAA,GACpE;AACF;;;AC/PA,IAAMC,YAAAA,GAA2B;AAAA,EAC/B,SAAA,EAAW,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,EACtE,MAAA,EAAQ,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAAA,EAC1B,WAAA,EAAa;AAAA,IACX,UAAA;AAAA,IAAY,SAAA;AAAA,IAAW,UAAA;AAAA,IAAY,SAAA;AAAA,IAAW,UAAA;AAAA,IAC9C,SAAA;AAAA,IAAW,UAAA;AAAA,IAAY;AAAA;AAE3B,CAAA;AA6BA,eAAe,wBAAA,CACb,SACA,OAAA,EACmH;AACnH,EAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,OAAO,yCAAyC,CAAA;AAC5E,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,YAAA;AAC7B,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,OAAA;AACnC,EAAA,MAAM,aAAa,OAAA,CAAQ,kBAAA,KAAuB,OAAO,EAAE,GAAGA,YAAAA,EAAY,CAAA,CAAA;AAE1E,EAAA,MAAM,SAAS,IAAI,SAAA,CAAU,EAAE,IAAA,EAAM,SAAS,CAAA;AAC9C,EAAA,MAAM,QAAA,GAAW,QAAQ,WAAA,EAAY;AACrC,EAAA,MAAM,KAAA,GAAQ,SAAS,QAAA,EAAS;AAEhC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAA,CAAO,YAAA;AAAA,MACL,IAAA,CAAK,IAAA;AAAA,MACL;AAAA,QACE,WAAA,EAAa,IAAA,CAAK,WAAA,IAAe,CAAA,MAAA,EAAS,KAAK,IAAI,CAAA,CAAA;AAAA,QACnD,aAAa,IAAA,CAAK,WAAA;AAAA,QAClB,OAAO,IAAA,CAAK;AAAA,OACd;AAAA,MACA,OAAO,IAAA,KAAkB;AACvB,QAAA,MAAM,MAAM,UAAA,EAAW;AACvB,QAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,MAAA;AAAA,UAC3B,EAAE,MAAM,IAAA,CAAK,IAAA,EAAM,MAAM,IAAA,IAAQ,EAAC,EAAG,OAAA,EAASC,0BAAA,EAAS;AAAA,UACvD;AAAA,SACF;AACA,QAAA,IAAI,OAAO,EAAA,EAAI;AACb,UAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,MAAM,CAAA,EAAG,CAAA,EAAE;AAAA,QAC5E;AACA,QAAA,MAAM,MAAM,MAAA,CAAO,KAAA;AACnB,QAAA,OAAO;AAAA,UACL,OAAA,EAAS;AAAA,YACP;AAAA,cACE,IAAA,EAAM,MAAA;AAAA,cACN,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,GAAA,EAAK,OAAA,IAAW,aAAA,EAAe,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM;AAAA;AAChF,WACF;AAAA,UACA,OAAA,EAAS;AAAA,SACX;AAAA,MACF;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,EAAE,MAAA,EAAO;AAClB;AAmBA,eAAsB,eAAA,CACpB,eAAA,EACA,OAAA,GAA4B,EAAC,EACH;AAC1B,EAAA,MAAM,OAAA,GACJ,QAAA,IAAY,eAAA,IAAmB,OAAO,eAAA,CAAgB,MAAA,KAAW,UAAA,GAC5D,eAAA,GAAA,CACA,MAAMF,yCAAA,CAAwB,eAAuC,CAAA,EAAG,OAAA;AAC/E,EAAA,MAAM,EAAE,oBAAA,EAAqB,GAAI,MAAM,OAAO,2CAA2C,CAAA;AAEzF,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAM,wBAAA,CAAyB,SAAS,OAAO,CAAA;AAElE,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,MAAM,YAAA,GAAe;AACnB,MAAA,MAAM,SAAA,GAAY,IAAI,oBAAA,EAAqB;AAC3C,MAAA,MAAM,MAAA,CAAO,QAAQ,SAAS,CAAA;AAAA,IAChC;AAAA,GACF;AACF;AAgBO,SAAS,8BAAA,CACd,eAAA,EACA,OAAA,GAA4B,EAAC,EACiC;AAC9D,EAAA,IAAI,QAAA,IAAY,eAAA,IAAmB,OAAO,eAAA,CAAgB,WAAW,UAAA,EAAY;AAC/E,IAAA,MAAM,OAAA,GAAU,eAAA;AAChB,IAAA,OAAO,eAAe,qBAAA,CACpB,GAAA,EACA,GAAA,EACA,UAAA,EACe;AACf,MAAA,MAAM,EAAE,6BAAA,EAA8B,GAAI,MAAM,OAAO,oDAAoD,CAAA;AAC3G,MAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAM,wBAAA,CAAyB,SAAS,OAAO,CAAA;AAClE,MAAA,MAAM,YAAY,IAAI,6BAAA,CAA8B,EAAE,kBAAA,EAAoB,QAAW,CAAA;AACrF,MAAA,MAAM,MAAA,CAAO,QAAQ,SAAS,CAAA;AAC9B,MAAA,MAAM,UAAU,MAAY;AAC1B,QAAA,SAAA,CAAU,KAAA,EAAM,CAAE,KAAA,CAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AAChC,QAAA,MAAA,CAAO,KAAA,EAAM,CAAE,KAAA,CAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AAC7B,QAAA,GAAA,CAAI,cAAA,CAAe,SAAS,OAAO,CAAA;AACnC,QAAA,GAAA,CAAI,cAAA,CAAe,UAAU,OAAO,CAAA;AAAA,MACtC,CAAA;AACA,MAAA,GAAA,CAAI,IAAA,CAAK,SAAS,OAAO,CAAA;AACzB,MAAA,GAAA,CAAI,IAAA,CAAK,UAAU,OAAO,CAAA;AAC1B,MAAA,MAAM,SAAA,CAAU,aAAA;AAAA,QAChB,GAAA;AAAA,QACA,GAAA;AAAA,QACA;AAAA,OACF;AAAA,IACA,CAAA;AAAA,EACF;AACA,EAAA,OAAA,CAAQ,YAA+C;AACrD,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAMA,0CAAwB,eAAuC,CAAA;AACzF,IAAA,OAAO,8BAAA,CAA+B,SAAS,OAAO,CAAA;AAAA,EACxD,CAAA,GAAG;AACL;AAyBA,eAAsB,6BAAA,CACpB,eAAA,EACA,OAAA,GAAgD,EAAC,EACT;AACxC,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,MAAA;AAC7B,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,WAAA;AAC7B,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,GAAA;AAC7B,EAAA,MAAM,EAAE,mBAAA,EAAoB,GAAI,MAAM,OAAO,6CAA6C,CAAA;AAC1F,EAAA,MAAM,OAAA,GACJ,QAAA,IAAY,eAAA,IAAmB,OAAO,gBAAgB,MAAA,KAAW,UAAA,GAC7D,8BAAA,CAA+B,eAAA,EAA+B,OAAO,CAAA,GACrE,MAAM,8BAAA,CAA+B,iBAAyC,OAAO,CAAA;AAC3F,EAAA,MAAM,GAAA,GAAM,mBAAA,CAAoB,EAAE,IAAA,EAAM,CAAA;AACxC,EAAA,GAAA,CAAI,IAAA,CAAK,MAAM,OAAO,CAAA;AAEtB,EAAA,OAAO;AAAA,IACL,GAAA;AAAA,IACA,IAAA;AAAA,IACA,MAAM,MAAA,CAAO,UAAA,EAAqB,UAAA,EAA6D;AAC7F,MAAA,MAAM,IAAI,UAAA,IAAc,IAAA;AACxB,MAAA,MAAM,IAAI,UAAA,IAAc,IAAA;AACxB,MAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,QAAA,MAAM,MAAA,GAAU,GAAA,CAEb,MAAA,CAAO,CAAA,EAAG,GAAG,MAAM;AACpB,UAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,UAAA,MAAM,UAAA,GACJ,OAAO,IAAA,KAAS,QAAA,IAAY,SAAS,IAAA,IAAQ,MAAA,IAAU,IAAA,GAAO,IAAA,CAAK,IAAA,GAAO,CAAA;AAC5E,UAAA,OAAA,CAAQ,EAAE,GAAA,EAAK,CAAA,OAAA,EAAU,CAAC,CAAA,CAAA,EAAI,UAAU,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,IAAA,EAAM,UAAA,EAAY,CAAA;AAAA,QACvE,CAAC,CAAA;AAAA,MACH,CAAC,CAAA;AAAA,IACH;AAAA,GACF;AACF;AAMA,eAAsB,qBAAA,CACpB,OAAA,EACA,OAAA,GAA4B,EAAC,EACH;AAC1B,EAAA,MAAM,MAAA,GAAS,MAAM,eAAA,CAAgB,OAAA,EAAS,OAAO,CAAA;AACrD,EAAA,MAAM,OAAO,YAAA,EAAa;AAC1B,EAAA,OAAO,MAAA;AACT","file":"chunk-MGEQPAHV.cjs","sourcesContent":["/**\n * Expose tools as OpenAPI (Swagger) spec and optional HTTP server.\n * Same tools can be used via LangChain, MCP, or REST.\n */\n\nimport type { ToolRegistry } from \"../../core/registry/ToolRegistry.js\";\nimport type { ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport { enrichSpecWithCanonicalSchema } from \"../../tools/util/canonicalCoreSchemas.js\";\n\nexport interface OpenAPISpecOptions {\n /** API title (default: \"Tool API\") */\n title?: string;\n /** API version (default: \"1.0.0\") */\n version?: string;\n /** Base path for the API (default: \"\") */\n basePath?: string;\n}\n\n/** Tool name to URL path segment: \"core/fs.readText\" -> \"core~fs.readText\" */\nexport function toolNameToSlug(name: string): string {\n return name.replace(/\\//g, \"~\");\n}\n\n/** URL path segment back to tool name: \"core~fs.readText\" -> \"core/fs.readText\" */\nexport function slugToToolName(slug: string): string {\n return slug.replace(/~/g, \"/\");\n}\n\n/** Safe schema key for components: \"core/fs.readText\" -> \"Tool_core_fs_readText\" */\nfunction toolSchemaKey(name: string): string {\n return `Tool_${name.replace(/[^a-zA-Z0-9_]/g, \"_\")}`;\n}\n\nconst resultSchema = {\n type: \"object\" as const,\n properties: {\n result: { description: \"Tool return value\", additionalProperties: true },\n },\n};\nconst errorSchema = {\n type: \"object\" as const,\n properties: {\n error: { type: \"string\" },\n kind: { type: \"string\" },\n details: { type: \"object\", additionalProperties: true },\n },\n};\n\n/**\n * Build OpenAPI 3.0 document from the tool registry.\n * GET /tools, POST /invoke (generic), and one POST /invoke/{toolSlug} per tool with that tool's input schema.\n */\nexport function toolsToOpenAPISpec(\n registry: ToolRegistry,\n options: OpenAPISpecOptions = {}\n): Record<string, unknown> {\n const title = options.title ?? \"Tool API\";\n const version = options.version ?? \"1.0.0\";\n const basePath = (options.basePath ?? \"\").replace(/\\/$/, \"\");\n const specs = registry.snapshot().map(enrichSpecWithCanonicalSchema);\n\n const toolNamesSchema = {\n type: \"object\",\n required: [\"tools\"],\n properties: {\n tools: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n name: { type: \"string\" },\n description: { type: \"string\" },\n kind: { type: \"string\" },\n },\n },\n },\n },\n };\n\n const invokeRequestBody = {\n type: \"object\",\n required: [\"tool\", \"args\"],\n properties: {\n tool: { type: \"string\", description: \"Tool name (e.g. from GET /tools)\" },\n args: {\n type: \"object\",\n description: \"Tool arguments (schema per tool; use per-tool paths for typed schema)\",\n additionalProperties: true,\n },\n },\n };\n\n const prefix = basePath ? `${basePath}/` : \"/\";\n const paths: Record<string, unknown> = {\n [`${prefix}tools`]: {\n get: {\n summary: \"List tools\",\n description: \"Returns all registered tool names and descriptions.\",\n operationId: \"listTools\",\n responses: {\n \"200\": {\n description: \"List of tools\",\n content: {\n \"application/json\": {\n schema: toolNamesSchema,\n },\n },\n },\n },\n },\n },\n [`${prefix}invoke`]: {\n post: {\n summary: \"Invoke a tool (generic)\",\n description: \"Call any tool by name with body { tool, args }. For typed schemas use POST /invoke/{toolSlug}.\",\n operationId: \"invokeTool\",\n requestBody: {\n required: true,\n content: {\n \"application/json\": {\n schema: invokeRequestBody,\n },\n },\n },\n responses: {\n \"200\": {\n description: \"Tool result\",\n content: { \"application/json\": { schema: resultSchema } },\n },\n \"400\": {\n description: \"Bad request\",\n content: { \"application/json\": { schema: errorSchema } },\n },\n },\n },\n },\n };\n\n const schemaEntries: [string, object][] = [];\n for (const s of specs) {\n const key = toolSchemaKey(s.name);\n schemaEntries.push([key, s.inputSchema as object]);\n const slug = toolNameToSlug(s.name);\n paths[`${prefix}invoke/${slug}`] = {\n post: {\n summary: s.description ?? s.name,\n description: `Invoke tool \\`${s.name}\\`. Request body is the tool's arguments (JSON Schema below).`,\n operationId: `invoke_${key}`,\n requestBody: {\n required: true,\n content: {\n \"application/json\": {\n schema: { $ref: `#/components/schemas/${key}` },\n },\n },\n },\n responses: {\n \"200\": {\n description: \"Tool result\",\n content: { \"application/json\": { schema: resultSchema } },\n },\n \"400\": {\n description: \"Bad request (invalid args or tool error)\",\n content: { \"application/json\": { schema: errorSchema } },\n },\n },\n },\n };\n }\n\n return {\n openapi: \"3.0.3\",\n info: { title, version },\n paths,\n components: {\n schemas: Object.fromEntries(schemaEntries),\n },\n };\n}\n","/**\n * HTTP server that exposes tools via OpenAPI (Swagger): GET / (Swagger UI), GET /openapi.json, GET /tools, POST /invoke.\n * All invokes go through PTCRuntime.invoke(intent, ctx). Uses Node's built-in http.\n */\n\nimport { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport type { PTCRuntime } from \"../../core/runtime/PTCRuntime.js\";\nimport type { ExecContext } from \"../../core/types/ToolIntent.js\";\nimport type { CreateRuntimeOptions } from \"../runtimeFromConfig.js\";\nimport { createRuntimeFromConfig } from \"../runtimeFromConfig.js\";\nimport { toolsToOpenAPISpec, slugToToolName } from \"./openapi.js\";\n\nexport interface OpenAPIHttpServerOptions {\n /** Port (default: 0 = let OS choose) */\n port?: number;\n /** Host (default: \"localhost\") */\n host?: string;\n /** Base path for routes (default: \"\") */\n basePath?: string;\n /** Build ExecContext for each request (default: minimal ctx) */\n execContextFactory?: (req: IncomingMessage) => ExecContext;\n}\n\nconst DEFAULT_CTX: ExecContext = {\n requestId: `http-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n taskId: `task-${Date.now()}`,\n permissions: [\n \"read:web\", \"read:fs\", \"write:fs\", \"read:db\", \"write:db\",\n \"network\", \"workflow\", \"danger:destructive\",\n ],\n};\n\nfunction parseBody(req: IncomingMessage): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk) => chunks.push(chunk));\n req.on(\"end\", () => {\n const raw = Buffer.concat(chunks).toString(\"utf-8\");\n if (!raw.trim()) {\n resolve({});\n return;\n }\n try {\n resolve(JSON.parse(raw) as unknown);\n } catch {\n reject(new Error(\"Invalid JSON body\"));\n }\n });\n req.on(\"error\", reject);\n });\n}\n\nfunction sendJson(res: ServerResponse, status: number, data: unknown): void {\n res.writeHead(status, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(data));\n}\n\n/** Build HTML for Swagger UI (CDN) pointing at the given spec URL. */\nfunction swaggerUiHtml(specUrl: string): string {\n const specUrlEscaped = specUrl.replace(/\"/g, \""\");\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Tool API – Swagger UI</title>\n <link rel=\"stylesheet\" href=\"https://unpkg.com/swagger-ui-dist@5/swagger-ui.css\">\n</head>\n<body>\n <div id=\"swagger-ui\"></div>\n <script src=\"https://unpkg.com/swagger-ui-dist@5/swagger-ui-bundle.js\" crossorigin></script>\n <script src=\"https://unpkg.com/swagger-ui-dist@5/swagger-ui-standalone-preset.js\" crossorigin></script>\n <script>\n window.onload = function() {\n window.ui = SwaggerUIBundle({\n url: \"${specUrlEscaped}\",\n dom_id: \"#swagger-ui\",\n deepLinking: true,\n presets: [\n SwaggerUIBundle.presets.apis,\n SwaggerUIStandalonePreset\n ],\n layout: \"StandaloneLayout\"\n });\n };\n </script>\n</body>\n</html>`;\n}\n\n/**\n * Create an HTTP server that exposes tools via OpenAPI-style routes.\n * - GET / or GET /swagger: Swagger UI (interactive docs)\n * - GET /openapi.json (or basePath/openapi.json): OpenAPI 3.0 spec\n * - GET /tools: list tools\n * - POST /invoke: body { tool, args } -> { result } or { error }\n */\nexport function createOpenAPIHttpServer(\n runtime: PTCRuntime,\n options: OpenAPIHttpServerOptions = {}\n): import(\"node:http\").Server {\n const basePath = (options.basePath ?? \"\").replace(/\\/$/, \"\");\n const ctxFactory = options.execContextFactory ?? (() => ({ ...DEFAULT_CTX }));\n\n const server = createServer(async (req: IncomingMessage, res: ServerResponse) => {\n const url = req.url ?? \"/\";\n const path = url.split(\"?\")[0] ?? \"/\";\n const norm = basePath ? (path === basePath ? \"\" : path.replace(basePath, \"\") || \"/\") : path;\n\n try {\n if (req.method === \"GET\" && (norm === \"/\" || norm === \"/swagger\")) {\n const specPath = basePath ? `${basePath}/openapi.json` : \"/openapi.json\";\n const html = swaggerUiHtml(specPath);\n res.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(html);\n return;\n }\n\n if (req.method === \"GET\" && (norm === \"/openapi.json\" || norm === \"/spec\")) {\n const spec = toolsToOpenAPISpec(runtime.getRegistry(), {\n title: \"Tool API\",\n version: \"1.0.0\",\n basePath: basePath || undefined,\n });\n sendJson(res, 200, spec);\n return;\n }\n\n if (req.method === \"GET\" && norm === \"/tools\") {\n const { enrichSpecWithCanonicalSchema } = await import(\"../../tools/util/canonicalCoreSchemas.js\");\n const specs = runtime.getRegistry().snapshot().map(enrichSpecWithCanonicalSchema);\n const tools = specs.map((s) => ({\n name: s.name,\n description: s.description,\n kind: s.kind,\n inputSchema: s.inputSchema,\n }));\n sendJson(res, 200, { tools });\n return;\n }\n\n if (req.method === \"POST\" && norm === \"/invoke\") {\n const body = (await parseBody(req)) as { tool?: string; args?: unknown };\n const tool = body?.tool;\n const args = body?.args ?? {};\n if (typeof tool !== \"string\" || !tool.trim()) {\n sendJson(res, 400, { error: \"Missing or invalid 'tool' in body\", kind: \"BAD_REQUEST\" });\n return;\n }\n const ctx = ctxFactory(req);\n const result = await runtime.invoke(\n { tool: tool.trim(), args, purpose: \"openapi\" },\n ctx\n );\n if (result.ok) {\n sendJson(res, 200, { result: result.result });\n return;\n }\n sendJson(res, 400, {\n error: result.error?.message ?? \"Tool failed\",\n kind: result.error?.kind,\n details: result.error?.details,\n });\n return;\n }\n\n if (req.method === \"POST\" && norm.startsWith(\"/invoke/\") && norm.length > \"/invoke/\".length) {\n const slug = norm.slice(\"/invoke/\".length);\n const toolName = slugToToolName(slug);\n let args: unknown;\n try {\n args = await parseBody(req);\n } catch {\n sendJson(res, 400, { error: \"Invalid JSON body\", kind: \"BAD_REQUEST\" });\n return;\n }\n const ctx = ctxFactory(req);\n const result = await runtime.invoke(\n { tool: toolName, args: args ?? {}, purpose: \"openapi\" },\n ctx\n );\n if (result.ok) {\n sendJson(res, 200, { result: result.result });\n return;\n }\n sendJson(res, 400, {\n error: result.error?.message ?? \"Tool failed\",\n kind: result.error?.kind,\n details: result.error?.details,\n });\n return;\n }\n\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Not found\", path: norm }));\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n sendJson(res, 500, { error: message, kind: \"INTERNAL_ERROR\" });\n }\n });\n\n return server;\n}\n\n/**\n * Start the OpenAPI HTTP server on the given port/host.\n * Call after createOpenAPIHttpServer if you did not pass port in options.\n */\nexport function listenOpenAPIHttpServer(\n server: import(\"node:http\").Server,\n options: { port?: number; host?: string } = {}\n): Promise<{ port: number; host: string }> {\n return new Promise((resolve, reject) => {\n const port = options.port ?? 0;\n const host = options.host ?? \"localhost\";\n server.listen(port, host, () => {\n const addr = server.address();\n const actualPort = typeof addr === \"object\" && addr?.port != null ? addr.port : port;\n resolve({ port: actualPort, host });\n });\n server.on(\"error\", reject);\n });\n}\n\nexport interface HttpServiceResult {\n /** Node HTTP server (call .close() when done) */\n server: import(\"node:http\").Server;\n /** OpenAPI 3.0 spec document (for Swagger UI etc.) */\n openApiSpec: Record<string, unknown>;\n /** Start listening; returns { port, host } */\n listen: (options?: { port?: number; host?: string }) => Promise<{ port: number; host: string }>;\n}\n\nexport interface CreateHttpServiceOptions extends OpenAPIHttpServerOptions {\n /** API title for OpenAPI spec (default: \"Tool API\") */\n title?: string;\n /** API version for OpenAPI spec (default: \"1.0.0\") */\n version?: string;\n}\n\n/**\n * Create HTTP service that exposes tools via OpenAPI (Swagger).\n * Returns server, OpenAPI spec, and a listen() helper.\n */\nexport function createHttpService(\n runtime: PTCRuntime,\n options?: CreateHttpServiceOptions\n): Promise<HttpServiceResult>;\n\n/**\n * Create HTTP service from config (async: loads tools from projectPath when set).\n */\nexport function createHttpService(\n config: CreateRuntimeOptions,\n options?: CreateHttpServiceOptions\n): Promise<HttpServiceResult>;\n\nexport async function createHttpService(\n runtimeOrConfig: PTCRuntime | CreateRuntimeOptions,\n options: CreateHttpServiceOptions = {}\n): Promise<HttpServiceResult> {\n const runtime: PTCRuntime =\n \"invoke\" in runtimeOrConfig && typeof runtimeOrConfig.invoke === \"function\"\n ? (runtimeOrConfig as PTCRuntime)\n : (await createRuntimeFromConfig(runtimeOrConfig as CreateRuntimeOptions)).runtime;\n const server = createOpenAPIHttpServer(runtime, options);\n const openApiSpec = toolsToOpenAPISpec(runtime.getRegistry(), {\n title: options.title ?? \"Tool API\",\n version: options.version ?? \"1.0.0\",\n basePath: options.basePath,\n });\n return {\n server,\n openApiSpec,\n listen: (listenOpts) => listenOpenAPIHttpServer(server, listenOpts),\n };\n}\n","/**\n * Expose tools as an MCP server (stdio or Streamable HTTP). All invokes go through PTCRuntime.invoke(intent, ctx).\n * Requires @modelcontextprotocol/sdk.\n */\n\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport type { PTCRuntime } from \"../../core/runtime/PTCRuntime.js\";\nimport type { ExecContext } from \"../../core/types/ToolIntent.js\";\nimport type { CreateRuntimeOptions } from \"../runtimeFromConfig.js\";\nimport { createRuntimeFromConfig } from \"../runtimeFromConfig.js\";\nimport { MCP_KIND } from \"../../tools/mcp/types.js\";\n\nexport interface MCPServerOptions {\n /** Server name (default: \"agent-tool\") */\n name?: string;\n /** Server version (default: \"1.0.0\") */\n version?: string;\n /** Build ExecContext for each tool call (default: minimal ctx) */\n execContextFactory?: () => ExecContext;\n}\n\nconst DEFAULT_CTX: ExecContext = {\n requestId: `mcp-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n taskId: `task-${Date.now()}`,\n permissions: [\n \"read:web\", \"read:fs\", \"write:fs\", \"read:db\", \"write:db\",\n \"network\", \"workflow\", \"danger:destructive\",\n ],\n};\n\nexport interface MCPServerResult {\n /** The MCP server instance */\n server: { connect(transport: unknown): Promise<void>; close?(): Promise<void> };\n /** Call this to start listening on stdio (for in-process MCP service) */\n connectStdio: () => Promise<void>;\n}\n\n/** Request handler for Streamable HTTP: (req, res, parsedBody?) => Promise<void>. Use with Express app.post(path, handler) and express.json(). */\nexport type MCPStreamableHttpHandler = (\n req: IncomingMessage,\n res: ServerResponse,\n parsedBody?: unknown\n) => Promise<void>;\n\nexport interface MCPServerStreamableHttpResult {\n /** Express app with POST /mcp (or path) wired to Streamable HTTP handler */\n app: { post: (path: string, handler: MCPStreamableHttpHandler) => void };\n /** Path mounted (e.g. \"/mcp\") */\n path: string;\n /** Start HTTP server; returns when listening. Use createMCPStreamableHttpHandler + your own server if you prefer. */\n listen: (port?: number, host?: string) => Promise<{ url: string; port: number }>;\n}\n\n/**\n * Create a configured McpServer with all tools from the given runtime (no transport connected).\n * Used by createMCPServer (stdio) and createMCPStreamableHttpHandler (Streamable HTTP).\n */\nasync function createMcpServerWithTools(\n runtime: PTCRuntime,\n options: MCPServerOptions\n): Promise<{ server: InstanceType<Awaited<typeof import(\"@modelcontextprotocol/sdk/server/mcp.js\")>[\"McpServer\"]> }> {\n const { McpServer } = await import(\"@modelcontextprotocol/sdk/server/mcp.js\");\n const name = options.name ?? \"agent-tool\";\n const version = options.version ?? \"1.0.0\";\n const ctxFactory = options.execContextFactory ?? (() => ({ ...DEFAULT_CTX }));\n\n const server = new McpServer({ name, version });\n const registry = runtime.getRegistry();\n const specs = registry.snapshot();\n\n for (const spec of specs) {\n server.registerTool(\n spec.name,\n {\n description: spec.description ?? `Tool: ${spec.name}`,\n inputSchema: spec.inputSchema,\n _meta: spec._meta,\n } as Parameters<typeof server.registerTool>[1],\n async (args: unknown) => {\n const ctx = ctxFactory();\n const result = await runtime.invoke(\n { tool: spec.name, args: args ?? {}, purpose: MCP_KIND },\n ctx\n );\n if (result.ok) {\n return { content: [{ type: \"text\", text: JSON.stringify(result.result) }] };\n }\n const err = result.error;\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({ error: err?.message ?? \"Tool failed\", kind: err?.kind }),\n },\n ],\n isError: true,\n };\n }\n );\n }\n return { server };\n}\n\n/**\n * Create an MCP server that serves all tools from the given PTCRuntime.\n * Register tools with the server; then call connectStdio() to listen on stdio (for Cursor/Claude).\n */\nexport function createMCPServer(\n runtime: PTCRuntime,\n options?: MCPServerOptions\n): Promise<MCPServerResult>;\n\n/**\n * Create an MCP server from config (async: loads tools from projectPath when set).\n */\nexport function createMCPServer(\n config: CreateRuntimeOptions,\n options?: MCPServerOptions\n): Promise<MCPServerResult>;\n\nexport async function createMCPServer(\n runtimeOrConfig: PTCRuntime | CreateRuntimeOptions,\n options: MCPServerOptions = {}\n): Promise<MCPServerResult> {\n const runtime: PTCRuntime =\n \"invoke\" in runtimeOrConfig && typeof runtimeOrConfig.invoke === \"function\"\n ? (runtimeOrConfig as PTCRuntime)\n : (await createRuntimeFromConfig(runtimeOrConfig as CreateRuntimeOptions)).runtime;\n const { StdioServerTransport } = await import(\"@modelcontextprotocol/sdk/server/stdio.js\");\n\n const { server } = await createMcpServerWithTools(runtime, options);\n\n return {\n server,\n async connectStdio() {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n },\n };\n}\n\n/**\n * Create a request handler for MCP Streamable HTTP (stateless). Use with Express: app.use(express.json()); app.post(\"/mcp\", handler).\n * Each request gets a new server and transport; supports SSE and direct HTTP responses per MCP Streamable HTTP spec.\n */\nexport function createMCPStreamableHttpHandler(\n runtime: PTCRuntime,\n options?: MCPServerOptions\n): MCPStreamableHttpHandler;\n\nexport function createMCPStreamableHttpHandler(\n config: CreateRuntimeOptions,\n options?: MCPServerOptions\n): Promise<MCPStreamableHttpHandler>;\n\nexport function createMCPStreamableHttpHandler(\n runtimeOrConfig: PTCRuntime | CreateRuntimeOptions,\n options: MCPServerOptions = {}\n): MCPStreamableHttpHandler | Promise<MCPStreamableHttpHandler> {\n if (\"invoke\" in runtimeOrConfig && typeof runtimeOrConfig.invoke === \"function\") {\n const runtime = runtimeOrConfig as PTCRuntime;\n return async function streamableHttpHandler(\n req: IncomingMessage,\n res: ServerResponse,\n parsedBody?: unknown\n ): Promise<void> {\n const { StreamableHTTPServerTransport } = await import(\"@modelcontextprotocol/sdk/server/streamableHttp.js\");\n const { server } = await createMcpServerWithTools(runtime, options);\n const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });\n await server.connect(transport);\n const onClose = (): void => {\n transport.close().catch(() => {});\n server.close().catch(() => {});\n res.removeListener(\"close\", onClose);\n res.removeListener(\"finish\", onClose);\n };\n res.once(\"close\", onClose);\n res.once(\"finish\", onClose);\n await transport.handleRequest(\n req as IncomingMessage & { auth?: import(\"@modelcontextprotocol/sdk/server/auth/types.js\").AuthInfo },\n res,\n parsedBody\n );\n };\n }\n return (async (): Promise<MCPStreamableHttpHandler> => {\n const { runtime } = await createRuntimeFromConfig(runtimeOrConfig as CreateRuntimeOptions);\n return createMCPStreamableHttpHandler(runtime, options) as MCPStreamableHttpHandler;\n })();\n}\n\nexport interface CreateMCPServerStreamableHttpOptions extends MCPServerOptions {\n /** Path for MCP endpoint (default: \"/mcp\") */\n path?: string;\n /** Host to bind (default: \"127.0.0.1\") */\n host?: string;\n /** Port (default: 3000) */\n port?: number;\n}\n\n/**\n * Create an Express app with MCP Streamable HTTP handler mounted at path. Requires @modelcontextprotocol/sdk (which uses express).\n * Returns app and listen(port?, host?) to start the HTTP server.\n */\nexport function createMCPServerStreamableHttp(\n runtime: PTCRuntime,\n options?: CreateMCPServerStreamableHttpOptions\n): Promise<MCPServerStreamableHttpResult>;\n\nexport function createMCPServerStreamableHttp(\n config: CreateRuntimeOptions,\n options?: CreateMCPServerStreamableHttpOptions\n): Promise<MCPServerStreamableHttpResult>;\n\nexport async function createMCPServerStreamableHttp(\n runtimeOrConfig: PTCRuntime | CreateRuntimeOptions,\n options: CreateMCPServerStreamableHttpOptions = {}\n): Promise<MCPServerStreamableHttpResult> {\n const path = options.path ?? \"/mcp\";\n const host = options.host ?? \"127.0.0.1\";\n const port = options.port ?? 3000;\n const { createMcpExpressApp } = await import(\"@modelcontextprotocol/sdk/server/express.js\");\n const handler =\n \"invoke\" in runtimeOrConfig && typeof runtimeOrConfig.invoke === \"function\"\n ? createMCPStreamableHttpHandler(runtimeOrConfig as PTCRuntime, options)\n : await createMCPStreamableHttpHandler(runtimeOrConfig as CreateRuntimeOptions, options);\n const app = createMcpExpressApp({ host });\n app.post(path, handler);\n\n return {\n app,\n path,\n async listen(listenPort?: number, listenHost?: string): Promise<{ url: string; port: number }> {\n const p = listenPort ?? port;\n const h = listenHost ?? host;\n return new Promise((resolve, reject) => {\n const server = (app as {\n listen: (port: number, host: string, cb?: () => void) => import(\"node:http\").Server;\n }).listen(p, h, () => {\n const addr = server.address();\n const actualPort =\n typeof addr === \"object\" && addr !== null && \"port\" in addr ? addr.port : p;\n resolve({ url: `http://${h}:${actualPort}${path}`, port: actualPort });\n });\n });\n },\n };\n}\n\n/**\n * Run MCP server over stdio using the given runtime.\n * Call this when your process should act as an MCP server (e.g. for Cursor/Claude to connect).\n */\nexport async function runMCPServerOverStdio(\n runtime: PTCRuntime,\n options: MCPServerOptions = {}\n): Promise<MCPServerResult> {\n const result = await createMCPServer(runtime, options);\n await result.connectStdio();\n return result;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/api/expose/openapi.ts","../src/api/expose/openapiHttp.ts","../src/api/expose/mcpServer.ts"],"names":["enrichSpecWithCanonicalSchema","createServer","createRuntimeFromConfig","DEFAULT_CTX","MCP_KIND"],"mappings":"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","file":"chunk-YJSGSAS6.cjs","sourcesContent":["/**\n * Expose tools as OpenAPI (Swagger) spec and optional HTTP server.\n * Same tools can be used via LangChain, MCP, or REST.\n */\n\nimport type { ToolRegistry } from \"../../core/registry/ToolRegistry.js\";\nimport type { ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport { enrichSpecWithCanonicalSchema } from \"../../tools/util/canonicalCoreSchemas.js\";\n\nexport interface OpenAPISpecOptions {\n /** API title (default: \"Tool API\") */\n title?: string;\n /** API version (default: \"1.0.0\") */\n version?: string;\n /** Base path for the API (default: \"\") */\n basePath?: string;\n}\n\n/** Tool name to URL path segment: \"core/fs.readText\" -> \"core~fs.readText\" */\nexport function toolNameToSlug(name: string): string {\n return name.replace(/\\//g, \"~\");\n}\n\n/** URL path segment back to tool name: \"core~fs.readText\" -> \"core/fs.readText\" */\nexport function slugToToolName(slug: string): string {\n return slug.replace(/~/g, \"/\");\n}\n\n/** Safe schema key for components: \"core/fs.readText\" -> \"Tool_core_fs_readText\" */\nfunction toolSchemaKey(name: string): string {\n return `Tool_${name.replace(/[^a-zA-Z0-9_]/g, \"_\")}`;\n}\n\nconst resultSchema = {\n type: \"object\" as const,\n properties: {\n result: { description: \"Tool return value\", additionalProperties: true },\n },\n};\nconst errorSchema = {\n type: \"object\" as const,\n properties: {\n error: { type: \"string\" },\n kind: { type: \"string\" },\n details: { type: \"object\", additionalProperties: true },\n },\n};\n\n/**\n * Build OpenAPI 3.0 document from the tool registry.\n * GET /tools, POST /invoke (generic), and one POST /invoke/{toolSlug} per tool with that tool's input schema.\n */\nexport function toolsToOpenAPISpec(\n registry: ToolRegistry,\n options: OpenAPISpecOptions = {}\n): Record<string, unknown> {\n const title = options.title ?? \"Tool API\";\n const version = options.version ?? \"1.0.0\";\n const basePath = (options.basePath ?? \"\").replace(/\\/$/, \"\");\n const specs = registry.snapshot().map(enrichSpecWithCanonicalSchema);\n\n const toolNamesSchema = {\n type: \"object\",\n required: [\"tools\"],\n properties: {\n tools: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n name: { type: \"string\" },\n description: { type: \"string\" },\n kind: { type: \"string\" },\n },\n },\n },\n },\n };\n\n const invokeRequestBody = {\n type: \"object\",\n required: [\"tool\", \"args\"],\n properties: {\n tool: { type: \"string\", description: \"Tool name (e.g. from GET /tools)\" },\n args: {\n type: \"object\",\n description: \"Tool arguments (schema per tool; use per-tool paths for typed schema)\",\n additionalProperties: true,\n },\n },\n };\n\n const prefix = basePath ? `${basePath}/` : \"/\";\n const paths: Record<string, unknown> = {\n [`${prefix}tools`]: {\n get: {\n summary: \"List tools\",\n description: \"Returns all registered tool names and descriptions.\",\n operationId: \"listTools\",\n responses: {\n \"200\": {\n description: \"List of tools\",\n content: {\n \"application/json\": {\n schema: toolNamesSchema,\n },\n },\n },\n },\n },\n },\n [`${prefix}invoke`]: {\n post: {\n summary: \"Invoke a tool (generic)\",\n description: \"Call any tool by name with body { tool, args }. For typed schemas use POST /invoke/{toolSlug}.\",\n operationId: \"invokeTool\",\n requestBody: {\n required: true,\n content: {\n \"application/json\": {\n schema: invokeRequestBody,\n },\n },\n },\n responses: {\n \"200\": {\n description: \"Tool result\",\n content: { \"application/json\": { schema: resultSchema } },\n },\n \"400\": {\n description: \"Bad request\",\n content: { \"application/json\": { schema: errorSchema } },\n },\n },\n },\n },\n };\n\n const schemaEntries: [string, object][] = [];\n for (const s of specs) {\n const key = toolSchemaKey(s.name);\n schemaEntries.push([key, s.inputSchema as object]);\n const slug = toolNameToSlug(s.name);\n paths[`${prefix}invoke/${slug}`] = {\n post: {\n summary: s.description ?? s.name,\n description: `Invoke tool \\`${s.name}\\`. Request body is the tool's arguments (JSON Schema below).`,\n operationId: `invoke_${key}`,\n requestBody: {\n required: true,\n content: {\n \"application/json\": {\n schema: { $ref: `#/components/schemas/${key}` },\n },\n },\n },\n responses: {\n \"200\": {\n description: \"Tool result\",\n content: { \"application/json\": { schema: resultSchema } },\n },\n \"400\": {\n description: \"Bad request (invalid args or tool error)\",\n content: { \"application/json\": { schema: errorSchema } },\n },\n },\n },\n };\n }\n\n return {\n openapi: \"3.0.3\",\n info: { title, version },\n paths,\n components: {\n schemas: Object.fromEntries(schemaEntries),\n },\n };\n}\n","/**\n * HTTP server that exposes tools via OpenAPI (Swagger): GET / (Swagger UI), GET /openapi.json, GET /tools, POST /invoke.\n * All invokes go through PTCRuntime.invoke(intent, ctx). Uses Node's built-in http.\n */\n\nimport { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport type { PTCRuntime } from \"../../core/runtime/PTCRuntime.js\";\nimport type { ExecContext } from \"../../core/types/ToolIntent.js\";\nimport type { CreateRuntimeOptions } from \"../runtimeFromConfig.js\";\nimport { createRuntimeFromConfig } from \"../runtimeFromConfig.js\";\nimport { toolsToOpenAPISpec, slugToToolName } from \"./openapi.js\";\n\nexport interface OpenAPIHttpServerOptions {\n /** Port (default: 0 = let OS choose) */\n port?: number;\n /** Host (default: \"localhost\") */\n host?: string;\n /** Base path for routes (default: \"\") */\n basePath?: string;\n /** Build ExecContext for each request (default: minimal ctx) */\n execContextFactory?: (req: IncomingMessage) => ExecContext;\n}\n\nconst DEFAULT_CTX: ExecContext = {\n requestId: `http-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n taskId: `task-${Date.now()}`,\n permissions: [\n \"read:web\", \"read:fs\", \"write:fs\", \"read:db\", \"write:db\",\n \"network\", \"workflow\", \"danger:destructive\",\n ],\n};\n\nfunction parseBody(req: IncomingMessage): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk) => chunks.push(chunk));\n req.on(\"end\", () => {\n const raw = Buffer.concat(chunks).toString(\"utf-8\");\n if (!raw.trim()) {\n resolve({});\n return;\n }\n try {\n resolve(JSON.parse(raw) as unknown);\n } catch {\n reject(new Error(\"Invalid JSON body\"));\n }\n });\n req.on(\"error\", reject);\n });\n}\n\nfunction sendJson(res: ServerResponse, status: number, data: unknown): void {\n res.writeHead(status, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(data));\n}\n\n/** Build HTML for Swagger UI (CDN) pointing at the given spec URL. */\nfunction swaggerUiHtml(specUrl: string): string {\n const specUrlEscaped = specUrl.replace(/\"/g, \""\");\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Tool API – Swagger UI</title>\n <link rel=\"stylesheet\" href=\"https://unpkg.com/swagger-ui-dist@5/swagger-ui.css\">\n</head>\n<body>\n <div id=\"swagger-ui\"></div>\n <script src=\"https://unpkg.com/swagger-ui-dist@5/swagger-ui-bundle.js\" crossorigin></script>\n <script src=\"https://unpkg.com/swagger-ui-dist@5/swagger-ui-standalone-preset.js\" crossorigin></script>\n <script>\n window.onload = function() {\n window.ui = SwaggerUIBundle({\n url: \"${specUrlEscaped}\",\n dom_id: \"#swagger-ui\",\n deepLinking: true,\n presets: [\n SwaggerUIBundle.presets.apis,\n SwaggerUIStandalonePreset\n ],\n layout: \"StandaloneLayout\"\n });\n };\n </script>\n</body>\n</html>`;\n}\n\n/**\n * Create an HTTP server that exposes tools via OpenAPI-style routes.\n * - GET / or GET /swagger: Swagger UI (interactive docs)\n * - GET /openapi.json (or basePath/openapi.json): OpenAPI 3.0 spec\n * - GET /tools: list tools\n * - POST /invoke: body { tool, args } -> { result } or { error }\n */\nexport function createOpenAPIHttpServer(\n runtime: PTCRuntime,\n options: OpenAPIHttpServerOptions = {}\n): import(\"node:http\").Server {\n const basePath = (options.basePath ?? \"\").replace(/\\/$/, \"\");\n const ctxFactory = options.execContextFactory ?? (() => ({ ...DEFAULT_CTX }));\n\n const server = createServer(async (req: IncomingMessage, res: ServerResponse) => {\n const url = req.url ?? \"/\";\n const path = url.split(\"?\")[0] ?? \"/\";\n const norm = basePath ? (path === basePath ? \"\" : path.replace(basePath, \"\") || \"/\") : path;\n\n try {\n if (req.method === \"GET\" && (norm === \"/\" || norm === \"/swagger\")) {\n const specPath = basePath ? `${basePath}/openapi.json` : \"/openapi.json\";\n const html = swaggerUiHtml(specPath);\n res.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(html);\n return;\n }\n\n if (req.method === \"GET\" && (norm === \"/openapi.json\" || norm === \"/spec\")) {\n const spec = toolsToOpenAPISpec(runtime.getRegistry(), {\n title: \"Tool API\",\n version: \"1.0.0\",\n basePath: basePath || undefined,\n });\n sendJson(res, 200, spec);\n return;\n }\n\n if (req.method === \"GET\" && norm === \"/tools\") {\n const { enrichSpecWithCanonicalSchema } = await import(\"../../tools/util/canonicalCoreSchemas.js\");\n const specs = runtime.getRegistry().snapshot().map(enrichSpecWithCanonicalSchema);\n const tools = specs.map((s) => ({\n name: s.name,\n description: s.description,\n kind: s.kind,\n inputSchema: s.inputSchema,\n }));\n sendJson(res, 200, { tools });\n return;\n }\n\n if (req.method === \"POST\" && norm === \"/invoke\") {\n const body = (await parseBody(req)) as { tool?: string; args?: unknown };\n const tool = body?.tool;\n const args = body?.args ?? {};\n if (typeof tool !== \"string\" || !tool.trim()) {\n sendJson(res, 400, { error: \"Missing or invalid 'tool' in body\", kind: \"BAD_REQUEST\" });\n return;\n }\n const ctx = ctxFactory(req);\n const result = await runtime.invoke(\n { tool: tool.trim(), args, purpose: \"openapi\" },\n ctx\n );\n if (result.ok) {\n sendJson(res, 200, { result: result.result });\n return;\n }\n sendJson(res, 400, {\n error: result.error?.message ?? \"Tool failed\",\n kind: result.error?.kind,\n details: result.error?.details,\n });\n return;\n }\n\n if (req.method === \"POST\" && norm.startsWith(\"/invoke/\") && norm.length > \"/invoke/\".length) {\n const slug = norm.slice(\"/invoke/\".length);\n const toolName = slugToToolName(slug);\n let args: unknown;\n try {\n args = await parseBody(req);\n } catch {\n sendJson(res, 400, { error: \"Invalid JSON body\", kind: \"BAD_REQUEST\" });\n return;\n }\n const ctx = ctxFactory(req);\n const result = await runtime.invoke(\n { tool: toolName, args: args ?? {}, purpose: \"openapi\" },\n ctx\n );\n if (result.ok) {\n sendJson(res, 200, { result: result.result });\n return;\n }\n sendJson(res, 400, {\n error: result.error?.message ?? \"Tool failed\",\n kind: result.error?.kind,\n details: result.error?.details,\n });\n return;\n }\n\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Not found\", path: norm }));\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n sendJson(res, 500, { error: message, kind: \"INTERNAL_ERROR\" });\n }\n });\n\n return server;\n}\n\n/**\n * Start the OpenAPI HTTP server on the given port/host.\n * Call after createOpenAPIHttpServer if you did not pass port in options.\n */\nexport function listenOpenAPIHttpServer(\n server: import(\"node:http\").Server,\n options: { port?: number; host?: string } = {}\n): Promise<{ port: number; host: string }> {\n return new Promise((resolve, reject) => {\n const port = options.port ?? 0;\n const host = options.host ?? \"localhost\";\n server.listen(port, host, () => {\n const addr = server.address();\n const actualPort = typeof addr === \"object\" && addr?.port != null ? addr.port : port;\n resolve({ port: actualPort, host });\n });\n server.on(\"error\", reject);\n });\n}\n\nexport interface HttpServiceResult {\n /** Node HTTP server (call .close() when done) */\n server: import(\"node:http\").Server;\n /** OpenAPI 3.0 spec document (for Swagger UI etc.) */\n openApiSpec: Record<string, unknown>;\n /** Start listening; returns { port, host } */\n listen: (options?: { port?: number; host?: string }) => Promise<{ port: number; host: string }>;\n}\n\nexport interface CreateHttpServiceOptions extends OpenAPIHttpServerOptions {\n /** API title for OpenAPI spec (default: \"Tool API\") */\n title?: string;\n /** API version for OpenAPI spec (default: \"1.0.0\") */\n version?: string;\n}\n\n/**\n * Create HTTP service that exposes tools via OpenAPI (Swagger).\n * Returns server, OpenAPI spec, and a listen() helper.\n */\nexport function createHttpService(\n runtime: PTCRuntime,\n options?: CreateHttpServiceOptions\n): Promise<HttpServiceResult>;\n\n/**\n * Create HTTP service from config (async: loads tools from projectPath when set).\n */\nexport function createHttpService(\n config: CreateRuntimeOptions,\n options?: CreateHttpServiceOptions\n): Promise<HttpServiceResult>;\n\nexport async function createHttpService(\n runtimeOrConfig: PTCRuntime | CreateRuntimeOptions,\n options: CreateHttpServiceOptions = {}\n): Promise<HttpServiceResult> {\n const runtime: PTCRuntime =\n \"invoke\" in runtimeOrConfig && typeof runtimeOrConfig.invoke === \"function\"\n ? (runtimeOrConfig as PTCRuntime)\n : (await createRuntimeFromConfig(runtimeOrConfig as CreateRuntimeOptions)).runtime;\n const server = createOpenAPIHttpServer(runtime, options);\n const openApiSpec = toolsToOpenAPISpec(runtime.getRegistry(), {\n title: options.title ?? \"Tool API\",\n version: options.version ?? \"1.0.0\",\n basePath: options.basePath,\n });\n return {\n server,\n openApiSpec,\n listen: (listenOpts) => listenOpenAPIHttpServer(server, listenOpts),\n };\n}\n","/**\n * Expose tools as an MCP server (stdio or Streamable HTTP). All invokes go through PTCRuntime.invoke(intent, ctx).\n * Requires @modelcontextprotocol/sdk.\n */\n\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport type { PTCRuntime } from \"../../core/runtime/PTCRuntime.js\";\nimport type { ExecContext } from \"../../core/types/ToolIntent.js\";\nimport type { CreateRuntimeOptions } from \"../runtimeFromConfig.js\";\nimport { createRuntimeFromConfig } from \"../runtimeFromConfig.js\";\nimport { MCP_KIND } from \"../../tools/mcp/types.js\";\n\nexport interface MCPServerOptions {\n /** Server name (default: \"agent-tool\") */\n name?: string;\n /** Server version (default: \"1.0.0\") */\n version?: string;\n /** Build ExecContext for each tool call (default: minimal ctx) */\n execContextFactory?: () => ExecContext;\n}\n\nconst DEFAULT_CTX: ExecContext = {\n requestId: `mcp-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n taskId: `task-${Date.now()}`,\n permissions: [\n \"read:web\", \"read:fs\", \"write:fs\", \"read:db\", \"write:db\",\n \"network\", \"workflow\", \"danger:destructive\",\n ],\n};\n\nexport interface MCPServerResult {\n /** The MCP server instance */\n server: { connect(transport: unknown): Promise<void>; close?(): Promise<void> };\n /** Call this to start listening on stdio (for in-process MCP service) */\n connectStdio: () => Promise<void>;\n}\n\n/** Request handler for Streamable HTTP: (req, res, parsedBody?) => Promise<void>. Use with Express app.post(path, handler) and express.json(). */\nexport type MCPStreamableHttpHandler = (\n req: IncomingMessage,\n res: ServerResponse,\n parsedBody?: unknown\n) => Promise<void>;\n\nexport interface MCPServerStreamableHttpResult {\n /** Express app with POST /mcp (or path) wired to Streamable HTTP handler */\n app: { post: (path: string, handler: MCPStreamableHttpHandler) => void };\n /** Path mounted (e.g. \"/mcp\") */\n path: string;\n /** Start HTTP server; returns when listening. Use createMCPStreamableHttpHandler + your own server if you prefer. */\n listen: (port?: number, host?: string) => Promise<{ url: string; port: number }>;\n}\n\n/**\n * Create a configured McpServer with all tools from the given runtime (no transport connected).\n * Used by createMCPServer (stdio) and createMCPStreamableHttpHandler (Streamable HTTP).\n */\nasync function createMcpServerWithTools(\n runtime: PTCRuntime,\n options: MCPServerOptions\n): Promise<{ server: InstanceType<Awaited<typeof import(\"@modelcontextprotocol/sdk/server/mcp.js\")>[\"McpServer\"]> }> {\n const { McpServer } = await import(\"@modelcontextprotocol/sdk/server/mcp.js\");\n const name = options.name ?? \"agent-tool\";\n const version = options.version ?? \"1.0.0\";\n const ctxFactory = options.execContextFactory ?? (() => ({ ...DEFAULT_CTX }));\n\n const server = new McpServer({ name, version });\n const registry = runtime.getRegistry();\n const specs = registry.snapshot();\n\n for (const spec of specs) {\n server.registerTool(\n spec.name,\n {\n description: spec.description ?? `Tool: ${spec.name}`,\n inputSchema: spec.inputSchema,\n _meta: spec._meta,\n } as Parameters<typeof server.registerTool>[1],\n async (args: unknown) => {\n const ctx = ctxFactory();\n const result = await runtime.invoke(\n { tool: spec.name, args: args ?? {}, purpose: MCP_KIND },\n ctx\n );\n if (result.ok) {\n return { content: [{ type: \"text\", text: JSON.stringify(result.result) }] };\n }\n const err = result.error;\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({ error: err?.message ?? \"Tool failed\", kind: err?.kind }),\n },\n ],\n isError: true,\n };\n }\n );\n }\n return { server };\n}\n\n/**\n * Create an MCP server that serves all tools from the given PTCRuntime.\n * Register tools with the server; then call connectStdio() to listen on stdio (for Cursor/Claude).\n */\nexport function createMCPServer(\n runtime: PTCRuntime,\n options?: MCPServerOptions\n): Promise<MCPServerResult>;\n\n/**\n * Create an MCP server from config (async: loads tools from projectPath when set).\n */\nexport function createMCPServer(\n config: CreateRuntimeOptions,\n options?: MCPServerOptions\n): Promise<MCPServerResult>;\n\nexport async function createMCPServer(\n runtimeOrConfig: PTCRuntime | CreateRuntimeOptions,\n options: MCPServerOptions = {}\n): Promise<MCPServerResult> {\n const runtime: PTCRuntime =\n \"invoke\" in runtimeOrConfig && typeof runtimeOrConfig.invoke === \"function\"\n ? (runtimeOrConfig as PTCRuntime)\n : (await createRuntimeFromConfig(runtimeOrConfig as CreateRuntimeOptions)).runtime;\n const { StdioServerTransport } = await import(\"@modelcontextprotocol/sdk/server/stdio.js\");\n\n const { server } = await createMcpServerWithTools(runtime, options);\n\n return {\n server,\n async connectStdio() {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n },\n };\n}\n\n/**\n * Create a request handler for MCP Streamable HTTP (stateless). Use with Express: app.use(express.json()); app.post(\"/mcp\", handler).\n * Each request gets a new server and transport; supports SSE and direct HTTP responses per MCP Streamable HTTP spec.\n */\nexport function createMCPStreamableHttpHandler(\n runtime: PTCRuntime,\n options?: MCPServerOptions\n): MCPStreamableHttpHandler;\n\nexport function createMCPStreamableHttpHandler(\n config: CreateRuntimeOptions,\n options?: MCPServerOptions\n): Promise<MCPStreamableHttpHandler>;\n\nexport function createMCPStreamableHttpHandler(\n runtimeOrConfig: PTCRuntime | CreateRuntimeOptions,\n options: MCPServerOptions = {}\n): MCPStreamableHttpHandler | Promise<MCPStreamableHttpHandler> {\n if (\"invoke\" in runtimeOrConfig && typeof runtimeOrConfig.invoke === \"function\") {\n const runtime = runtimeOrConfig as PTCRuntime;\n return async function streamableHttpHandler(\n req: IncomingMessage,\n res: ServerResponse,\n parsedBody?: unknown\n ): Promise<void> {\n const { StreamableHTTPServerTransport } = await import(\"@modelcontextprotocol/sdk/server/streamableHttp.js\");\n const { server } = await createMcpServerWithTools(runtime, options);\n const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });\n await server.connect(transport);\n const onClose = (): void => {\n transport.close().catch(() => {});\n server.close().catch(() => {});\n res.removeListener(\"close\", onClose);\n res.removeListener(\"finish\", onClose);\n };\n res.once(\"close\", onClose);\n res.once(\"finish\", onClose);\n await transport.handleRequest(\n req as IncomingMessage & { auth?: import(\"@modelcontextprotocol/sdk/server/auth/types.js\").AuthInfo },\n res,\n parsedBody\n );\n };\n }\n return (async (): Promise<MCPStreamableHttpHandler> => {\n const { runtime } = await createRuntimeFromConfig(runtimeOrConfig as CreateRuntimeOptions);\n return createMCPStreamableHttpHandler(runtime, options) as MCPStreamableHttpHandler;\n })();\n}\n\nexport interface CreateMCPServerStreamableHttpOptions extends MCPServerOptions {\n /** Path for MCP endpoint (default: \"/mcp\") */\n path?: string;\n /** Host to bind (default: \"127.0.0.1\") */\n host?: string;\n /** Port (default: 3000) */\n port?: number;\n}\n\n/**\n * Create an Express app with MCP Streamable HTTP handler mounted at path. Requires @modelcontextprotocol/sdk (which uses express).\n * Returns app and listen(port?, host?) to start the HTTP server.\n */\nexport function createMCPServerStreamableHttp(\n runtime: PTCRuntime,\n options?: CreateMCPServerStreamableHttpOptions\n): Promise<MCPServerStreamableHttpResult>;\n\nexport function createMCPServerStreamableHttp(\n config: CreateRuntimeOptions,\n options?: CreateMCPServerStreamableHttpOptions\n): Promise<MCPServerStreamableHttpResult>;\n\nexport async function createMCPServerStreamableHttp(\n runtimeOrConfig: PTCRuntime | CreateRuntimeOptions,\n options: CreateMCPServerStreamableHttpOptions = {}\n): Promise<MCPServerStreamableHttpResult> {\n const path = options.path ?? \"/mcp\";\n const host = options.host ?? \"127.0.0.1\";\n const port = options.port ?? 3000;\n const { createMcpExpressApp } = await import(\"@modelcontextprotocol/sdk/server/express.js\");\n const handler =\n \"invoke\" in runtimeOrConfig && typeof runtimeOrConfig.invoke === \"function\"\n ? createMCPStreamableHttpHandler(runtimeOrConfig as PTCRuntime, options)\n : await createMCPStreamableHttpHandler(runtimeOrConfig as CreateRuntimeOptions, options);\n const app = createMcpExpressApp({ host });\n app.post(path, handler);\n\n return {\n app,\n path,\n async listen(listenPort?: number, listenHost?: string): Promise<{ url: string; port: number }> {\n const p = listenPort ?? port;\n const h = listenHost ?? host;\n return new Promise((resolve, reject) => {\n const server = (app as {\n listen: (port: number, host: string, cb?: () => void) => import(\"node:http\").Server;\n }).listen(p, h, () => {\n const addr = server.address();\n const actualPort =\n typeof addr === \"object\" && addr !== null && \"port\" in addr ? addr.port : p;\n resolve({ url: `http://${h}:${actualPort}${path}`, port: actualPort });\n });\n });\n },\n };\n}\n\n/**\n * Run MCP server over stdio using the given runtime.\n * Call this when your process should act as an MCP server (e.g. for Cursor/Claude to connect).\n */\nexport async function runMCPServerOverStdio(\n runtime: PTCRuntime,\n options: MCPServerOptions = {}\n): Promise<MCPServerResult> {\n const result = await createMCPServer(runtime, options);\n await result.connectStdio();\n return result;\n}\n"]}
|
|
@@ -8,8 +8,7 @@ import pTimeout from 'p-timeout';
|
|
|
8
8
|
import { readFileSync, existsSync } from 'fs';
|
|
9
9
|
import { resolve, dirname, join } from 'path';
|
|
10
10
|
import yaml from 'js-yaml';
|
|
11
|
-
import {
|
|
12
|
-
import { registerExampleTools } from '@easynet/agent-tool-example-tools';
|
|
11
|
+
import { createRequire } from 'module';
|
|
13
12
|
|
|
14
13
|
var SchemaValidator = class {
|
|
15
14
|
ajv;
|
|
@@ -1547,23 +1546,49 @@ function findAndLoadToolConfig(dir) {
|
|
|
1547
1546
|
}
|
|
1548
1547
|
return {};
|
|
1549
1548
|
}
|
|
1549
|
+
var require2 = createRequire(import.meta.url);
|
|
1550
|
+
function loadBuiltinTools() {
|
|
1551
|
+
try {
|
|
1552
|
+
return require2("@easynet/agent-tool-builtin-tools");
|
|
1553
|
+
} catch {
|
|
1554
|
+
return null;
|
|
1555
|
+
}
|
|
1556
|
+
}
|
|
1557
|
+
function loadExampleTools() {
|
|
1558
|
+
try {
|
|
1559
|
+
return require2("@easynet/agent-tool-example-tools");
|
|
1560
|
+
} catch {
|
|
1561
|
+
return null;
|
|
1562
|
+
}
|
|
1563
|
+
}
|
|
1550
1564
|
function createRuntimeFromConfigSync(options = {}) {
|
|
1551
1565
|
const registry = new ToolRegistry();
|
|
1552
1566
|
if (options.coreTools !== void 0) {
|
|
1553
|
-
const
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
1567
|
+
const builtin = loadBuiltinTools();
|
|
1568
|
+
if (builtin) {
|
|
1569
|
+
const coreAdapter = builtin.registerCoreTools(registry, options.coreTools);
|
|
1570
|
+
const runtime3 = new PTCRuntime({ registry });
|
|
1571
|
+
runtime3.registerAdapter(coreAdapter);
|
|
1572
|
+
if (options.exampleTools !== void 0) {
|
|
1573
|
+
const example = loadExampleTools();
|
|
1574
|
+
if (example) {
|
|
1575
|
+
const exampleAdapter = example.registerExampleTools(registry, options.exampleTools);
|
|
1576
|
+
runtime3.registerAdapter(exampleAdapter);
|
|
1577
|
+
}
|
|
1578
|
+
}
|
|
1579
|
+
return { runtime: runtime3, registry };
|
|
1559
1580
|
}
|
|
1581
|
+
const runtime2 = new PTCRuntime({ registry });
|
|
1560
1582
|
return { runtime: runtime2, registry };
|
|
1561
1583
|
}
|
|
1562
1584
|
if (options.exampleTools !== void 0) {
|
|
1563
|
-
const
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
|
|
1585
|
+
const example = loadExampleTools();
|
|
1586
|
+
if (example) {
|
|
1587
|
+
const exampleAdapter = example.registerExampleTools(registry, options.exampleTools);
|
|
1588
|
+
const runtime2 = new PTCRuntime({ registry });
|
|
1589
|
+
runtime2.registerAdapter(exampleAdapter);
|
|
1590
|
+
return { runtime: runtime2, registry };
|
|
1591
|
+
}
|
|
1567
1592
|
}
|
|
1568
1593
|
const runtime = new PTCRuntime({ registry });
|
|
1569
1594
|
return { runtime, registry };
|
|
@@ -1580,5 +1605,5 @@ var LANGCHAIN_KIND = "langchain";
|
|
|
1580
1605
|
var LANGCHAIN_DIR_NAME = "langchain";
|
|
1581
1606
|
|
|
1582
1607
|
export { BudgetManager, EventLog, LANGCHAIN_DIR_NAME, LANGCHAIN_KIND, MCP_KIND, Metrics, PTCRuntime, PolicyDeniedError, PolicyEngine, SchemaValidationError, SchemaValidator, Tracing, buildEvidence, createLogger, createRuntimeFromConfig, createRuntimeFromConfigSync, expandToolDescriptorsToRegistryNames, findAndLoadToolConfig, getDisplayScope, isNpmToolDescriptor, loadToolConfig, normalizeToolList, parseNpmToolDescriptor, resolveNpmToolDescriptor, resolveSandboxedPath, resolveToolDescriptor, sanitizeForLog, summarizeForLog };
|
|
1583
|
-
//# sourceMappingURL=chunk-
|
|
1584
|
-
//# sourceMappingURL=chunk-
|
|
1608
|
+
//# sourceMappingURL=chunk-YMCAX4O6.js.map
|
|
1609
|
+
//# sourceMappingURL=chunk-YMCAX4O6.js.map
|