@easynet/agent-tool 1.0.24 → 1.0.26

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 (49) hide show
  1. package/dist/api/extension/createExtension.d.ts +38 -0
  2. package/dist/api/extension/createExtension.d.ts.map +1 -0
  3. package/dist/api/extension/dynamicImportAdapter.d.ts +3 -2
  4. package/dist/api/extension/dynamicImportAdapter.d.ts.map +1 -1
  5. package/dist/api/extension/generateExtensionManifest.d.ts +29 -0
  6. package/dist/api/extension/generateExtensionManifest.d.ts.map +1 -0
  7. package/dist/api/extension/index.d.ts +4 -0
  8. package/dist/api/extension/index.d.ts.map +1 -1
  9. package/dist/api/extension/registerExtension.d.ts +6 -5
  10. package/dist/api/extension/registerExtension.d.ts.map +1 -1
  11. package/dist/api/extension/registerFromManifest.d.ts +2 -2
  12. package/dist/api/extension/registerFromManifest.d.ts.map +1 -1
  13. package/dist/api/main.cjs +14 -14
  14. package/dist/api/main.js +3 -3
  15. package/dist/api/runtimeFromConfig.d.ts +12 -10
  16. package/dist/api/runtimeFromConfig.d.ts.map +1 -1
  17. package/dist/{chunk-ZRDI2RKU.js → chunk-7J2DRVCV.js} +3 -3
  18. package/dist/{chunk-ZRDI2RKU.js.map → chunk-7J2DRVCV.js.map} +1 -1
  19. package/dist/{chunk-FWIMPZC2.cjs → chunk-EJSCDVKD.cjs} +14 -14
  20. package/dist/{chunk-FWIMPZC2.cjs.map → chunk-EJSCDVKD.cjs.map} +1 -1
  21. package/dist/{chunk-P2LVZGZ4.cjs → chunk-ETZKGTTF.cjs} +7 -7
  22. package/dist/{chunk-P2LVZGZ4.cjs.map → chunk-ETZKGTTF.cjs.map} +1 -1
  23. package/dist/{chunk-QP5FIRC2.js → chunk-GYUELFVR.js} +3 -3
  24. package/dist/{chunk-QP5FIRC2.js.map → chunk-GYUELFVR.js.map} +1 -1
  25. package/dist/{chunk-AH4NI4GN.cjs → chunk-PKUSCCS6.cjs} +84 -54
  26. package/dist/chunk-PKUSCCS6.cjs.map +1 -0
  27. package/dist/{chunk-BPHY6UVK.js → chunk-UUQGKFSG.js} +83 -53
  28. package/dist/chunk-UUQGKFSG.js.map +1 -0
  29. package/dist/{chunk-BOMOGAFZ.js → chunk-XRCHMWOC.js} +5 -4
  30. package/dist/chunk-XRCHMWOC.js.map +1 -0
  31. package/dist/{chunk-AT3N7SQK.cjs → chunk-ZOQWKN2O.cjs} +11 -10
  32. package/dist/chunk-ZOQWKN2O.cjs.map +1 -0
  33. package/dist/index.cjs +175 -73
  34. package/dist/index.cjs.map +1 -1
  35. package/dist/index.d.ts +2 -2
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +120 -21
  38. package/dist/index.js.map +1 -1
  39. package/dist/tools/function/scanner.d.ts.map +1 -1
  40. package/dist/utils/cli/index.cjs +20 -18
  41. package/dist/utils/cli/index.cjs.map +1 -1
  42. package/dist/utils/cli/index.d.ts.map +1 -1
  43. package/dist/utils/cli/index.js +6 -4
  44. package/dist/utils/cli/index.js.map +1 -1
  45. package/package.json +1 -1
  46. package/dist/chunk-AH4NI4GN.cjs.map +0 -1
  47. package/dist/chunk-AT3N7SQK.cjs.map +0 -1
  48. package/dist/chunk-BOMOGAFZ.js.map +0 -1
  49. package/dist/chunk-BPHY6UVK.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/security/ssrf.ts","../src/security/sandbox.ts","../src/api/extension/contextRunner.ts","../src/api/extension/dynamicImportAdapter.ts","../src/api/extension/loadToolYaml.ts","../src/api/extension/registerFromManifest.ts","../src/api/extension/resolvePackageRoot.ts","../src/api/extension/registerExtension.ts","../src/api/extension/groupPrefix.ts","../src/tools/mcp/MCPClientAdapter.ts","../src/tools/mcp/connectMCP.ts","../src/tools/mcp/MCPProcessManager.ts","../src/tools/mcp/registerMCPTools.ts"],"names":["createTaggedError","lookup","realpath","resolve","normalize","access","dirname","basename","path","AsyncLocalStorage","pathToFileURL","existsSync","readFileSync","yaml","statSync","createToolSpec","fileURLToPath","MCP_KIND","DEFAULT_INPUT_SCHEMA","DEFAULT_OUTPUT_SCHEMA","join","loadMCPTool"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAsBA,eAAsB,WAAA,CAAY,KAAa,OAAA,EAA2C;AACxF,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,IAAI,IAAI,GAAG,CAAA;AAAA,EACtB,CAAA,CAAA,MAAQ;AACN,IAAA,MAAMA,mCAAA;AAAA,MACJ,sBAAA;AAAA,MACA,gBAAgB,GAAG,CAAA,CAAA;AAAA,MACnB,EAAE,GAAA;AAAI,KACR;AAAA,EACF;AAGA,EAAA,IAAI,MAAA,CAAO,QAAA,KAAa,OAAA,IAAW,MAAA,CAAO,aAAa,QAAA,EAAU;AAC/D,IAAA,MAAMA,mCAAA;AAAA,MACJ,sBAAA;AAAA,MACA,CAAA,sBAAA,EAAyB,OAAO,QAAQ,CAAA,sCAAA,CAAA;AAAA,MACxC,EAAE,GAAA,EAAK,QAAA,EAAU,MAAA,CAAO,QAAA;AAAS,KACnC;AAAA,EACF;AAEA,EAAA,MAAM,WAAW,MAAA,CAAO,QAAA;AAExB,EAAA,IAAI,CAAC,aAAA,CAAc,QAAA,EAAU,OAAA,CAAQ,YAAY,CAAA,EAAG;AAClD,IAAA,MAAMA,mCAAA;AAAA,MACJ,sBAAA;AAAA,MACA,SAAS,QAAQ,CAAA,kCAAA,CAAA;AAAA,MACjB,EAAE,GAAA,EAAK,QAAA,EAAU,YAAA,EAAc,QAAQ,YAAA;AAAa,KACtD;AAAA,EACF;AACA,EAAA,IAAI,aAAA,CAAc,QAAA,EAAU,OAAA,CAAQ,YAAY,CAAA,EAAG;AACjD,IAAA,MAAMA,mCAAA;AAAA,MACJ,sBAAA;AAAA,MACA,SAAS,QAAQ,CAAA,8BAAA,CAAA;AAAA,MACjB,EAAE,GAAA,EAAK,QAAA,EAAU,YAAA,EAAc,QAAQ,YAAA;AAAa,KACtD;AAAA,EACF;AAGA,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAMC,gBAAO,QAAQ,CAAA;AACzC,IAAA,IAAI,kBAAA,CAAmB,OAAA,EAAS,OAAA,CAAQ,YAAY,CAAA,EAAG;AACrD,MAAA,MAAMD,mCAAA;AAAA,QACJ,sBAAA;AAAA,QACA,CAAA,MAAA,EAAS,QAAQ,CAAA,0BAAA,EAA6B,OAAO,CAAA,CAAA;AAAA,QACrD,EAAE,GAAA,EAAK,QAAA,EAAU,UAAA,EAAY,OAAA;AAAQ,OACvC;AAAA,IACF;AAAA,EACF,SAAS,GAAA,EAAK;AAEZ,IAAA,IAAI,GAAA,YAAe,KAAA,IAAU,GAAA,CAAY,IAAA,KAAS,sBAAA,EAAwB;AACxE,MAAA,MAAM,GAAA;AAAA,IACR;AAEA,IAAA,MAAMA,mCAAA;AAAA,MACJ,sBAAA;AAAA,MACA,CAAA,gCAAA,EAAmC,QAAQ,CAAA,GAAA,EAAM,GAAA,YAAe,QAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA;AAAA,MACjG,EAAE,KAAK,QAAA;AAAS,KAClB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAMA,SAAS,aAAA,CAAc,UAAkB,YAAA,EAAiC;AACxE,EAAA,KAAA,MAAW,WAAW,YAAA,EAAc;AAClC,IAAA,IAAI,YAAY,GAAA,EAAK;AACnB,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,EAAG;AAC5B,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA;AAC9B,MAAA,IAAI,QAAA,CAAS,SAAS,MAAM,CAAA,IAAK,aAAa,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,EAAG;AAC9D,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF,CAAA,MAAA,IAAW,aAAa,OAAA,EAAS;AAC/B,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAKA,SAAS,aAAA,CAAc,UAAkB,YAAA,EAAiC;AACxE,EAAA,KAAA,MAAW,WAAW,YAAA,EAAc;AAClC,IAAA,IAAI,YAAY,GAAA,EAAK;AACnB,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,EAAG;AAC5B,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA;AAC9B,MAAA,IAAI,QAAA,CAAS,SAAS,MAAM,CAAA,IAAK,aAAa,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,EAAG;AAC9D,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF,CAAA,MAAA,IAAW,aAAa,OAAA,EAAS;AAC/B,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAKO,SAAS,kBAAA,CAAmB,IAAY,KAAA,EAA0B;AAEvE,EAAA,MAAM,YAAA,GAAe,YAAY,EAAE,CAAA;AACnC,EAAA,IAAI,CAAC,cAAc,OAAO,KAAA;AAE1B,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AAEtB,MAAA,IAAI,CAAC,EAAA,CAAG,QAAA,CAAS,GAAG,CAAA,EAAG;AACvB,MAAA,IAAI,YAAA,CAAa,EAAA,EAAI,IAAI,CAAA,EAAG,OAAO,IAAA;AAAA,IACrC,CAAA,MAAO;AACL,MAAA,IAAI,YAAA,CAAa,YAAA,EAAc,IAAI,CAAA,EAAG,OAAO,IAAA;AAAA,IAC/C;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,YAAY,EAAA,EAA2B;AAE9C,EAAA,IAAI,EAAA,CAAG,UAAA,CAAW,SAAS,CAAA,EAAG;AAC5B,IAAA,OAAO,EAAA,CAAG,MAAM,CAAC,CAAA;AAAA,EACnB;AAEA,EAAA,IAAI,sBAAA,CAAuB,IAAA,CAAK,EAAE,CAAA,EAAG;AACnC,IAAA,OAAO,EAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,YAAA,CAAa,IAAY,IAAA,EAAuB;AACvD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,IAAA,CAAK,MAAM,GAAG,CAAA;AAC1C,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,SAAA,EAAW,OAAO,KAAA;AAElC,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,SAAA,EAAW,EAAE,CAAA;AACrC,EAAA,IAAI,MAAM,MAAM,CAAA,IAAK,SAAS,CAAA,IAAK,MAAA,GAAS,IAAI,OAAO,KAAA;AAEvD,EAAA,MAAM,KAAA,GAAQ,UAAU,EAAE,CAAA;AAC1B,EAAA,MAAM,OAAA,GAAU,UAAU,MAAM,CAAA;AAChC,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,OAAA,KAAY,IAAA,EAAM,OAAO,KAAA;AAE/C,EAAA,MAAM,OAAO,MAAA,KAAW,CAAA,GAAI,IAAK,EAAC,IAAM,KAAK,MAAA,KAAa,CAAA;AAC1D,EAAA,OAAA,CAAQ,KAAA,GAAQ,WAAW,OAAA,GAAU,IAAA,CAAA;AACvC;AAEA,SAAS,UAAU,EAAA,EAA2B;AAC5C,EAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,KAAA,CAAM,GAAG,CAAA;AAC1B,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC/B,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,IAAA,EAAM,EAAE,CAAA;AAC3B,IAAA,IAAI,MAAM,CAAC,CAAA,IAAK,IAAI,CAAA,IAAK,CAAA,GAAI,KAAK,OAAO,IAAA;AACzC,IAAA,GAAA,GAAO,OAAO,CAAA,GAAK,CAAA;AAAA,EACrB;AACA,EAAA,OAAO,GAAA,KAAQ,CAAA;AACjB;AAEA,SAAS,YAAA,CAAa,IAAY,IAAA,EAAuB;AAEvD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,IAAA,CAAK,MAAM,GAAG,CAAA;AAC1C,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,SAAA,EAAW,OAAO,KAAA;AAElC,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,SAAA,EAAW,EAAE,CAAA;AACrC,EAAA,IAAI,KAAA,CAAM,MAAM,CAAA,EAAG,OAAO,KAAA;AAE1B,EAAA,MAAM,OAAA,GAAU,WAAW,EAAE,CAAA;AAC7B,EAAA,MAAM,SAAA,GAAY,WAAW,MAAM,CAAA;AACnC,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,SAAA,EAAW,OAAO,KAAA;AAGnC,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AACvC,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,SAAA,IAAa,CAAA,GAAI,IAAI,CAAA,EAAA,EAAK;AAC5C,IAAA,IAAI,QAAQ,CAAC,CAAA,KAAM,SAAA,CAAU,CAAC,GAAG,OAAO,KAAA;AAAA,EAC1C;AAEA,EAAA,MAAM,gBAAgB,MAAA,GAAS,CAAA;AAC/B,EAAA,IAAI,aAAA,GAAgB,CAAA,IAAK,SAAA,GAAY,EAAA,EAAI;AACvC,IAAA,MAAM,IAAA,GAAQ,EAAC,IAAM,CAAA,GAAI,aAAA,GAAkB,GAAA;AAC3C,IAAA,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA,GAAK,IAAA,OAAW,UAAU,SAAS,CAAA,GAAK,OAAO,OAAO,KAAA;AAAA,EAC9E;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,WAAW,EAAA,EAA6B;AAE/C,EAAA,MAAM,OAAA,GAAU,EAAA,CAAG,OAAA,CAAQ,GAAG,CAAA;AAC9B,EAAA,IAAI,YAAY,EAAA,EAAI,EAAA,GAAK,EAAA,CAAG,KAAA,CAAM,GAAG,OAAO,CAAA;AAE5C,EAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,KAAA,CAAM,IAAI,CAAA;AAC3B,EAAA,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AAE7B,EAAA,MAAM,QAAkB,IAAI,KAAA,CAAM,EAAE,CAAA,CAAE,KAAK,CAAC,CAAA;AAE5C,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAA4B;AAC/C,IAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AACpB,IAAA,OAAO,MAAM,KAAA,CAAM,GAAG,CAAA,CAAE,OAAA,CAAQ,CAAC,GAAA,KAAQ;AACvC,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,GAAA,IAAO,GAAA,EAAK,EAAE,CAAA;AACnC,MAAA,OAAO,CAAE,GAAA,IAAO,CAAA,GAAK,GAAA,EAAM,MAAM,GAAI,CAAA;AAAA,IACvC,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,MAAM,QAAA,GAAW,WAAA,CAAY,KAAA,CAAM,CAAC,CAAE,CAAA;AACtC,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,EAAA,EAAI,OAAO,IAAA;AACnC,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAAO,WAAA,CAAY,KAAA,CAAM,CAAC,CAAE,CAAA;AAClC,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,KAAA,CAAM,CAAC,CAAE,CAAA;AAEnC,EAAA,IAAI,IAAA,CAAK,MAAA,GAAS,KAAA,CAAM,MAAA,GAAS,IAAI,OAAO,IAAA;AAE5C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,EAAQ,KAAK,KAAA,CAAM,CAAC,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA;AACvD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,CAAA,EAAA,EAAK,KAAA,CAAM,EAAA,GAAK,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,GAAI,MAAM,CAAC,CAAA;AAE7E,EAAA,OAAO,KAAA;AACT;AC3OA,eAAsB,oBAAA,CACpB,WACA,WAAA,EACiB;AAGjB,EAAA,IAAI,cAAA;AACJ,EAAA,IAAI;AACF,IAAA,cAAA,GAAiB,MAAME,mBAAA,CAASC,aAAA,CAAQ,WAAW,CAAC,CAAA;AAAA,EACtD,CAAA,CAAA,MAAQ;AACN,IAAA,cAAA,GAAiBC,eAAA,CAAUD,aAAA,CAAQ,WAAW,CAAC,CAAA;AAAA,EACjD;AAGA,EAAA,MAAM,QAAA,GAAWA,aAAA,CAAQ,cAAA,EAAgB,SAAS,CAAA;AAElD,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI;AAEF,IAAA,MAAME,kBAAO,QAAQ,CAAA;AACrB,IAAA,IAAA,GAAO,MAAMH,oBAAS,QAAQ,CAAA;AAAA,EAChC,CAAA,CAAA,MAAQ;AAEN,IAAA,MAAM,SAAA,GAAYI,cAAQ,QAAQ,CAAA;AAClC,IAAA,IAAI,UAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAMD,kBAAO,SAAS,CAAA;AACtB,MAAA,UAAA,GAAa,MAAMH,oBAAS,SAAS,CAAA;AAAA,IACvC,CAAA,CAAA,MAAQ;AAGN,MAAA,UAAA,GAAaE,gBAAU,SAAS,CAAA;AAAA,IAClC;AACA,IAAA,IAAA,GAAOD,aAAA,CAAQ,UAAA,EAAYI,cAAA,CAAS,QAAQ,CAAC,CAAA;AAAA,EAC/C;AAEA,EAAA,IAAI,CAAC,YAAA,CAAa,IAAA,EAAM,cAAc,CAAA,EAAG;AACvC,IAAA,MAAMP,mCAAA;AAAA,MACJ,sBAAA;AAAA,MACA,CAAA,MAAA,EAAS,SAAS,CAAA,eAAA,EAAkB,IAAI,+BAA+B,cAAc,CAAA,CAAA,CAAA;AAAA,MACrF,EAAE,SAAA,EAAW,YAAA,EAAc,IAAA,EAAM,aAAa,cAAA;AAAe,KAC/D;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,YAAA,CAAaQ,OAAc,IAAA,EAAuB;AACzD,EAAA,MAAM,cAAA,GAAiBJ,gBAAUI,KAAI,CAAA;AACrC,EAAA,MAAM,cAAA,GAAiBJ,gBAAU,IAAI,CAAA;AACrC,EAAA,OAAO,cAAA,KAAmB,cAAA,IAAkB,cAAA,CAAe,UAAA,CAAW,iBAAiB,GAAG,CAAA;AAC5F;AC/CO,SAAS,mBAAA,GAA2C;AACzD,EAAA,MAAM,OAAA,GAAU,IAAIK,6BAAA,EAAqB;AACzC,EAAA,OAAO;AAAA,IACL,OAAA,CAAQ,KAAQ,EAAA,EAA8C;AAC5D,MAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,EAAE,CAAA;AAAA,IAC5B,CAAA;AAAA,IACA,UAAA,GAAgB;AACd,MAAA,MAAM,GAAA,GAAM,QAAQ,QAAA,EAAS;AAC7B,MAAA,IAAI,QAAQ,MAAA,EAAW;AACrB,QAAA,MAAM,IAAI,MAAM,uEAAuE,CAAA;AAAA,MACzF;AACA,MAAA,OAAO,GAAA;AAAA,IACT;AAAA,GACF;AACF;ACJO,SAAS,2BACd,OAAA,EACa;AACb,EAAA,MAAM,EAAE,IAAA,EAAM,WAAA,EAAa,mBAAA,EAAqB,eAAc,GAAI,OAAA;AAClE,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,MAAM,MAAA,CACJ,IAAA,EACA,IAAA,EACA,OAAA,EAC6C;AAC7C,MAAA,MAAM,OAAO,IAAA,CAAK,KAAA;AAKlB,MAAA,MAAM,aAAa,IAAA,EAAM,UAAA;AACzB,MAAA,MAAM,aAAa,IAAA,EAAM,UAAA;AACzB,MAAA,IAAI,CAAC,UAAA,IAAc,CAAC,UAAA,EAAY;AAC9B,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,eAAA,EAAkB,IAAA,CAAK,IAAI,CAAA,6CAAA,CAA+C,CAAA;AAAA,MAC5F;AACA,MAAA,MAAM,WAAA,GAAc,IAAA,EAAM,WAAA,IAAe,EAAC;AAC1C,MAAA,MAAM,UAAA,GACJ,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,CAAE,MAAA,KAAW,CAAA,GAC/B,IAAA,GACD,EAAE,GAAG,WAAA,EAAa,GAAI,IAAA,EAAiC;AAC7D,MAAA,MAAM,aAAaD,sBAAA,CAAK,IAAA,CAAK,WAAA,EAAa,CAAA,EAAG,UAAU,CAAA,GAAA,CAAK,CAAA;AAC5D,MAAA,MAAM,GAAA,GAAM,MAAM,OAAOE,iBAAA,CAAc,UAAU,CAAA,CAAE,IAAA,CAAA;AACnD,MAAA,MAAM,OAAA,GAAU,IAAI,UAAU,CAAA;AAC9B,MAAA,IAAI,OAAO,YAAY,UAAA,EAAY;AACjC,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,kBAAkB,IAAA,CAAK,IAAI,CAAA,UAAA,EAAa,UAAU,UAAU,UAAU,CAAA,kBAAA;AAAA,SACxE;AAAA,MACF;AACA,MAAA,MAAM,GAAA,GAAM,oBAAoB,OAAO,CAAA;AACvC,MAAA,MAAM,MAAA,GAAS,MAAM,aAAA,CAAc,OAAA,CAAQ,KAAK,MAAM,OAAA,CAAQ,UAAU,CAAC,CAAA;AACzE,MAAA,OAAO,EAAE,QAAQ,MAAA,CAAO,MAAA,EAAQ,KAAK,EAAE,QAAA,EAAU,MAAA,CAAO,QAAA,EAAS,EAAE;AAAA,IACrE;AAAA,GACF;AACF;AC7CO,SAAS,YAAA,CACd,aACA,UAAA,EACqC;AACrC,EAAA,MAAM,GAAA,GAAMF,sBAAAA,CAAK,OAAA,CAAQ,UAAU,CAAA;AACnC,EAAA,MAAM,IAAA,GAAOA,sBAAAA,CAAK,QAAA,CAAS,UAAU,CAAA;AACrC,EAAA,MAAM,WAAWA,sBAAAA,CAAK,IAAA,CAAK,aAAa,GAAA,EAAK,CAAA,EAAG,IAAI,CAAA,UAAA,CAAY,CAAA;AAChE,EAAA,IAAI,CAACG,aAAA,CAAW,QAAQ,CAAA,EAAG,OAAO,MAAA;AAClC,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAMC,eAAA,CAAa,QAAA,EAAU,OAAO,CAAA;AAC1C,IAAA,MAAM,IAAA,GAAOC,qBAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAC1B,IAAA,IAAI,IAAA,IAAQ,QAAQ,OAAO,IAAA,KAAS,YAAY,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG,OAAO,KAAA,CAAA;AAC5E,IAAA,MAAM,GAAA,GAAM,IAAA;AACZ,IAAA,MAAM,OAAO,GAAA,EAAK,IAAA;AAClB,IAAA,MAAM,MAAM,IAAA,EAAM,IAAA;AAClB,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAG,GAAG,OAAO,KAAA,CAAA;AAChC,IAAA,MAAM,OAAO,GAAA,CAAI,IAAA;AAAA,MACf,CAAC,MAAe,CAAA,IAAK,IAAA,IAAQ,OAAO,CAAA,KAAM,QAAA,IAAa,EAA8B,IAAA,KAAS;AAAA,KAChG;AACA,IAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,UAAU,OAAO,KAAA,CAAA;AAC9C,IAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAI,GAAG,MAAK,GAAI,IAAA;AAC9B,IAAA,IAAI,OAAO,IAAA,CAAK,IAAI,CAAA,CAAE,MAAA,KAAW,GAAG,OAAO,KAAA,CAAA;AAC3C,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF;ACCO,SAAS,sBAAsB,iBAAA,EAAoD;AACxF,EAAA,MAAM,CAAA,GAAIL,sBAAAA,CAAK,OAAA,CAAQ,iBAAiB,CAAA;AACxC,EAAA,IAAI,YAAA;AACJ,EAAA,IAAIG,cAAW,CAAC,CAAA,IAAKG,YAAS,CAAC,CAAA,CAAE,QAAO,EAAG;AACzC,IAAA,YAAA,GAAe,CAAA;AAAA,EACjB,CAAA,MAAO;AACL,IAAA,MAAM,KAAA,GAAQN,sBAAAA,CAAK,IAAA,CAAK,CAAA,EAAG,0BAA0B,CAAA;AACrD,IAAA,MAAM,MAAA,GAASA,sBAAAA,CAAK,IAAA,CAAK,CAAA,EAAG,QAAQ,0BAA0B,CAAA;AAC9D,IAAA,YAAA,GAAeG,aAAAA,CAAW,KAAK,CAAA,GAAI,KAAA,GAAQ,MAAA;AAAA,EAC7C;AACA,EAAA,MAAM,GAAA,GAAMC,eAAAA,CAAa,YAAA,EAAc,OAAO,CAAA;AAC9C,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzB,IAAA,OAAO,EAAE,SAAS,MAAA,EAAO;AAAA,EAC3B;AACA,EAAA,OAAO,EAAE,MAAM,MAAA,CAAO,IAAA,EAAM,SAAS,MAAA,CAAO,KAAA,IAAS,EAAC,EAAE;AAC1D;AAMO,SAAS,yBAAA,CACd,UACA,OAAA,EACY;AACZ,EAAA,MAAM,EAAE,iBAAA,EAAmB,IAAA,EAAM,SAAS,IAAA,EAAM,YAAA,EAAc,aAAY,GAAI,OAAA;AAC9E,EAAA,MAAM,MAAA,GAAS,sBAAsB,iBAAiB,CAAA;AACtD,EAAA,MAAM,IAAA,GAAQ,OAAA,IAAW,MAAA,CAAO,IAAA,IAAQ,WAAA;AACxC,EAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AACvB,EAAA,MAAM,UAAU,IAAA,EAAM,MAAA,GAAS,IAAI,GAAA,CAAI,IAAI,CAAA,GAAI,IAAA;AAC/C,EAAA,MAAM,aAAyB,EAAC;AAEhC,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,IAAI,OAAOG,gCAAA,CAAe;AAAA,MACxB,MAAM,KAAA,CAAM,QAAA;AAAA,MACZ,IAAA;AAAA,MACA,aAAa,KAAA,CAAM,WAAA;AAAA,MACnB,aAAa,KAAA,CAAM,WAAA;AAAA,MACnB,cAAc,KAAA,CAAM,YAAA;AAAA,MACpB,cAAc,EAAC;AAAA,MACf,YAAY,KAAA,CAAM;AAAA,KACnB,CAAA;AACD,IAAA,IAAI,WAAW,CAAC,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAG;AACxC,IAAA,IAAI,YAAA,EAAc,MAAA,IAAU,CAAC,YAAA,CAAa,IAAA,CAAK,CAAC,MAAA,KAAW,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,MAAM,CAAC,CAAA,EAAG;AACxF,MAAA;AAAA,IACF;AACA,IAAA,MAAM,cACJ,WAAA,IAAe,IAAA,GAAO,aAAa,WAAA,EAAa,KAAA,CAAM,UAAU,CAAA,GAAI,MAAA;AACtE,IAAA,IAAA,GAAO;AAAA,MACL,GAAG,IAAA;AAAA,MACH,KAAA,EAAO;AAAA,QACL,GAAG,IAAA,CAAK,KAAA;AAAA,QACR,YAAY,KAAA,CAAM,UAAA;AAAA,QAClB,YAAY,KAAA,CAAM,UAAA;AAAA,QAClB,GAAI,WAAA,IAAe,IAAA,IAAQ,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,CAAE,MAAA,GAAS,CAAA,IAAK,EAAE,WAAA;AAAY;AAClF,KACF;AACA,IAAA,QAAA,CAAS,SAAS,IAAI,CAAA;AACtB,IAAA,UAAA,CAAW,KAAK,IAAI,CAAA;AAAA,EACtB;AACA,EAAA,OAAO,UAAA;AACT;ACpGO,SAAS,4BAA4B,aAAA,EAA+B;AACzE,EAAA,MAAM,GAAA,GAAM,aAAA,CAAc,UAAA,CAAW,OAAO,CAAA,GACxCP,sBAAAA,CAAK,OAAA,CAAQQ,iBAAA,CAAc,aAAa,CAAC,CAAA,GACzCR,sBAAAA,CAAK,QAAQ,aAAa,CAAA;AAC9B,EAAA,MAAM,IAAA,GAAOA,sBAAAA,CAAK,IAAA,CAAK,GAAA,EAAK,MAAM,CAAA;AAClC,EAAA,OAAOG,aAAAA,CAAW,IAAI,CAAA,GAAI,IAAA,GAAO,GAAA;AACnC;;;ACiBO,SAAS,iBAAA,CACd,UACA,OAAA,EACa;AACb,EAAA,MAAM,EAAE,aAAa,IAAA,EAAM,OAAA,EAAS,QAAQ,gBAAA,EAAkB,IAAA,EAAM,cAAa,GAAI,OAAA;AACrF,EAAA,MAAM,WAAA,GAAc,4BAA4B,WAAW,CAAA;AAC3D,EAAA,MAAM,gBAAgB,gBAAA,EAAiB;AACvC,EAAA,MAAM,MAAA,GAAS,sBAAsB,WAAW,CAAA;AAChD,EAAA,MAAM,IAAA,GAAO,OAAA,IAAW,MAAA,CAAO,IAAA,IAAQ,WAAA;AAEvC,EAAA,yBAAA,CAA0B,QAAA,EAAU;AAAA,IAClC,iBAAA,EAAmB,WAAA;AAAA,IACnB,IAAA;AAAA,IACA,IAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,UAAU,0BAAA,CAAqC;AAAA,IACnD,IAAA;AAAA,IACA,WAAA;AAAA,IACA,mBAAA,EAAqB,CAAC,OAAA,MAA0B,EAAE,SAAS,MAAA,EAAO,CAAA;AAAA,IAClE,aAAA,EAAe;AAAA,MACb,OAAA,CAAQ,KAAe,EAAA,EAAwC;AAC7D,QAAA,OAAO,aAAA,CAAc,OAAA,CAAQ,GAAA,EAAK,EAAE,CAAA;AAAA,MACtC;AAAA;AACF,GACD,CAAA;AACD,EAAA,OAAO,OAAA;AACT;;;ACvCO,SAAS,qBAAqB,OAAA,EAAuD;AAC1F,EAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,cAAA,EAAe,GAAI,OAAA;AACzC,EAAA,MAAM,UAAU,IAAA,EAAM,MAAA,GAAS,IAAI,GAAA,CAAI,IAAI,CAAA,GAAI,IAAA;AAC/C,EAAA,MAAM,YAAA,GACJ,CAAC,OAAA,IAAW,MAAA,EAAQ,SAAS,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,eAAe,CAAC,CAAC,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,GAAI,MAAA;AACtF,EAAA,OAAO;AAAA,IACL,GAAI,UAAU,EAAE,IAAA,EAAM,MAAM,IAAA,CAAK,OAAO,CAAA,EAAE,GAAI,EAAC;AAAA,IAC/C,GAAI,YAAA,EAAc,MAAA,GAAS,EAAE,YAAA,KAAiB;AAAC,GACjD;AACF;;;ACXA,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,GAAOM,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,UAAA,CAAK,OAAA,CAAQ,GAAA,EAAI,EAAG,UAAU,CAAA;AACtG,EAAA,MAAM,OAAA,GAAUd,cAAQ,UAAU,CAAA;AAClC,EAAA,MAAM,UAAA,GAAaC,eAAS,UAAU,CAAA;AACtC,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAYU,0BAAA;AAErC,EAAA,MAAM,MAAA,GAAS,MAAMI,6BAAA,CAAY,OAAA,EAAS,EAAE,MAAMJ,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":["import { lookup } from \"node:dns/promises\";\nimport { createTaggedError } from \"../core/runtime/Retry.js\";\n\n/**\n * Options for validateUrl. Unified rule: allow iff host is in allowedHosts AND not in blockedHosts.\n * - \"Default allow all + blocklist\": allowedHosts: [\"*\"], blockedHosts: [\"*.internal\", ...]\n * - \"Default disallow all + allowlist\": allowedHosts: [\"api.github.com\", ...], blockedHosts: []\n */\nexport interface ValidateUrlOptions {\n /** Allow only these hosts. Use [\"*\"] for allow-all. Supports \"*.example.com\", exact host. */\n allowedHosts: string[];\n /** Block these hosts even if allowed. Supports \"*.internal\", exact host. Merged with allowlist. */\n blockedHosts: string[];\n /** CIDR ranges to block (resolved IP). */\n blockedCidrs: string[];\n}\n\n/**\n * Validate a URL: allow iff (host in allowedHosts) AND (host not in blockedHosts). Then check blockedCidrs on resolved IP.\n *\n * @throws HTTP_DISALLOWED_HOST if the URL is blocked\n */\nexport async function validateUrl(url: string, options: ValidateUrlOptions): Promise<URL> {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n throw createTaggedError(\n \"HTTP_DISALLOWED_HOST\",\n `Invalid URL: ${url}`,\n { url },\n );\n }\n\n // Only allow http/https\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw createTaggedError(\n \"HTTP_DISALLOWED_HOST\",\n `Protocol not allowed: ${parsed.protocol}. Only http: and https: are supported.`,\n { url, protocol: parsed.protocol },\n );\n }\n\n const hostname = parsed.hostname;\n\n if (!isHostAllowed(hostname, options.allowedHosts)) {\n throw createTaggedError(\n \"HTTP_DISALLOWED_HOST\",\n `Host \"${hostname}\" is not in the allowed hosts list`,\n { url, hostname, allowedHosts: options.allowedHosts },\n );\n }\n if (isHostBlocked(hostname, options.blockedHosts)) {\n throw createTaggedError(\n \"HTTP_DISALLOWED_HOST\",\n `Host \"${hostname}\" is in the blocked hosts list`,\n { url, hostname, blockedHosts: options.blockedHosts },\n );\n }\n\n // DNS resolve and check against blocked CIDRs\n try {\n const { address } = await lookup(hostname);\n if (isIpInBlockedCidrs(address, options.blockedCidrs)) {\n throw createTaggedError(\n \"HTTP_DISALLOWED_HOST\",\n `Host \"${hostname}\" resolves to blocked IP: ${address}`,\n { url, hostname, resolvedIp: address },\n );\n }\n } catch (err) {\n // Re-throw our tagged errors\n if (err instanceof Error && (err as any).kind === \"HTTP_DISALLOWED_HOST\") {\n throw err;\n }\n // DNS resolution failure — block by default\n throw createTaggedError(\n \"HTTP_DISALLOWED_HOST\",\n `DNS resolution failed for host \"${hostname}\": ${err instanceof Error ? err.message : String(err)}`,\n { url, hostname },\n );\n }\n\n return parsed;\n}\n\n/**\n * Check if a hostname matches any entry in the allowed hosts list.\n * Supports: exact \"*\" (allow any host), wildcard prefix (e.g. \"*.github.com\"), or exact host.\n */\nfunction isHostAllowed(hostname: string, allowedHosts: string[]): boolean {\n for (const pattern of allowedHosts) {\n if (pattern === \"*\") {\n return true;\n }\n if (pattern.startsWith(\"*.\")) {\n const suffix = pattern.slice(1); // \".github.com\"\n if (hostname.endsWith(suffix) || hostname === pattern.slice(2)) {\n return true;\n }\n } else if (hostname === pattern) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Check if a hostname matches any entry in the blocked hosts list (same pattern rules as allowlist).\n */\nfunction isHostBlocked(hostname: string, blockedHosts: string[]): boolean {\n for (const pattern of blockedHosts) {\n if (pattern === \"*\") {\n return true;\n }\n if (pattern.startsWith(\"*.\")) {\n const suffix = pattern.slice(1);\n if (hostname.endsWith(suffix) || hostname === pattern.slice(2)) {\n return true;\n }\n } else if (hostname === pattern) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Check if an IPv4 address falls within any blocked CIDR range.\n */\nexport function isIpInBlockedCidrs(ip: string, cidrs: string[]): boolean {\n // Handle IPv4-mapped IPv6\n const normalizedIp = normalizeIp(ip);\n if (!normalizedIp) return false;\n\n for (const cidr of cidrs) {\n if (cidr.includes(\":\")) {\n // IPv6 CIDR — skip for IPv4 addresses\n if (!ip.includes(\":\")) continue;\n if (isIpv6InCidr(ip, cidr)) return true;\n } else {\n if (isIpv4InCidr(normalizedIp, cidr)) return true;\n }\n }\n return false;\n}\n\nfunction normalizeIp(ip: string): string | null {\n // Handle IPv4-mapped IPv6 (e.g. \"::ffff:127.0.0.1\")\n if (ip.startsWith(\"::ffff:\")) {\n return ip.slice(7);\n }\n // Pure IPv4\n if (/^\\d+\\.\\d+\\.\\d+\\.\\d+$/.test(ip)) {\n return ip;\n }\n return null;\n}\n\nfunction isIpv4InCidr(ip: string, cidr: string): boolean {\n const [cidrIp, prefixStr] = cidr.split(\"/\");\n if (!cidrIp || !prefixStr) return false;\n\n const prefix = parseInt(prefixStr, 10);\n if (isNaN(prefix) || prefix < 0 || prefix > 32) return false;\n\n const ipNum = ipv4ToNum(ip);\n const cidrNum = ipv4ToNum(cidrIp);\n if (ipNum === null || cidrNum === null) return false;\n\n const mask = prefix === 0 ? 0 : (~0 << (32 - prefix)) >>> 0;\n return (ipNum & mask) === (cidrNum & mask);\n}\n\nfunction ipv4ToNum(ip: string): number | null {\n const parts = ip.split(\".\");\n if (parts.length !== 4) return null;\n let num = 0;\n for (const part of parts) {\n const n = parseInt(part, 10);\n if (isNaN(n) || n < 0 || n > 255) return null;\n num = (num << 8) | n;\n }\n return num >>> 0;\n}\n\nfunction isIpv6InCidr(ip: string, cidr: string): boolean {\n // Simplified IPv6 CIDR matching for common cases (::1, fc00::, fe80::)\n const [cidrIp, prefixStr] = cidr.split(\"/\");\n if (!cidrIp || !prefixStr) return false;\n\n const prefix = parseInt(prefixStr, 10);\n if (isNaN(prefix)) return false;\n\n const ipBytes = expandIpv6(ip);\n const cidrBytes = expandIpv6(cidrIp);\n if (!ipBytes || !cidrBytes) return false;\n\n // Compare prefix bits\n const fullBytes = Math.floor(prefix / 8);\n for (let i = 0; i < fullBytes && i < 16; i++) {\n if (ipBytes[i] !== cidrBytes[i]) return false;\n }\n\n const remainingBits = prefix % 8;\n if (remainingBits > 0 && fullBytes < 16) {\n const mask = (~0 << (8 - remainingBits)) & 0xff;\n if ((ipBytes[fullBytes]! & mask) !== (cidrBytes[fullBytes]! & mask)) return false;\n }\n\n return true;\n}\n\nfunction expandIpv6(ip: string): number[] | null {\n // Remove zone ID\n const zoneIdx = ip.indexOf(\"%\");\n if (zoneIdx !== -1) ip = ip.slice(0, zoneIdx);\n\n const parts = ip.split(\"::\");\n if (parts.length > 2) return null;\n\n const bytes: number[] = new Array(16).fill(0);\n\n const expandGroup = (group: string): number[] => {\n if (!group) return [];\n return group.split(\":\").flatMap((hex) => {\n const val = parseInt(hex || \"0\", 16);\n return [(val >> 8) & 0xff, val & 0xff];\n });\n };\n\n if (parts.length === 1) {\n const expanded = expandGroup(parts[0]!);\n if (expanded.length !== 16) return null;\n return expanded;\n }\n\n const left = expandGroup(parts[0]!);\n const right = expandGroup(parts[1]!);\n\n if (left.length + right.length > 16) return null;\n\n for (let i = 0; i < left.length; i++) bytes[i] = left[i]!;\n for (let i = 0; i < right.length; i++) bytes[16 - right.length + i] = right[i]!;\n\n return bytes;\n}\n","import { resolve, normalize, dirname, basename } from \"node:path\";\nimport { realpath, access } from \"node:fs/promises\";\nimport { createTaggedError } from \"../core/runtime/Retry.js\";\n\n/**\n * Resolve an input path to an absolute path within the sandbox.\n * Throws PATH_OUTSIDE_SANDBOX if the resolved path escapes the sandbox root.\n *\n * For existing files: uses realpath to resolve symlinks.\n * For non-existing files (write targets): resolves the parent directory.\n */\nexport async function resolveSandboxedPath(\n inputPath: string,\n sandboxRoot: string,\n): Promise<string> {\n // Resolve the sandbox root itself with realpath to handle platform symlinks\n // (e.g. macOS /var -> /private/var)\n let normalizedRoot: string;\n try {\n normalizedRoot = await realpath(resolve(sandboxRoot));\n } catch {\n normalizedRoot = normalize(resolve(sandboxRoot));\n }\n\n // Resolve against sandbox root\n const resolved = resolve(normalizedRoot, inputPath);\n\n let real: string;\n try {\n // Try to resolve symlinks for existing paths\n await access(resolved);\n real = await realpath(resolved);\n } catch {\n // Path does not exist — resolve parent to check containment\n const parentDir = dirname(resolved);\n let realParent: string;\n try {\n await access(parentDir);\n realParent = await realpath(parentDir);\n } catch {\n // Parent also doesn't exist — use normalized resolved path\n // (will fail at actual FS operation if truly invalid)\n realParent = normalize(parentDir);\n }\n real = resolve(realParent, basename(resolved));\n }\n\n if (!isWithinRoot(real, normalizedRoot)) {\n throw createTaggedError(\n \"PATH_OUTSIDE_SANDBOX\",\n `Path \"${inputPath}\" resolves to \"${real}\" which is outside sandbox \"${normalizedRoot}\"`,\n { inputPath, resolvedPath: real, sandboxRoot: normalizedRoot },\n );\n }\n\n return real;\n}\n\nfunction isWithinRoot(path: string, root: string): boolean {\n const normalizedPath = normalize(path);\n const normalizedRoot = normalize(root);\n return normalizedPath === normalizedRoot || normalizedPath.startsWith(normalizedRoot + \"/\");\n}\n","/**\n * Generic context injection for extension tools (e.g. builtin).\n * Any extension that needs to inject config (sandbox, allowedHosts, etc.) into handlers uses this.\n */\nimport { AsyncLocalStorage } from \"node:async_hooks\";\n\nexport interface ContextRunner<T> {\n runWith(ctx: T, fn: () => Promise<unknown>): Promise<unknown>;\n getContext(): T;\n}\n\n/**\n * Create a context runner for an extension. Handlers call getContext() to read config.\n * Adapter calls runWith(ctx, () => handler(args)) so getContext() returns ctx.\n */\nexport function createContextRunner<T>(): ContextRunner<T> {\n const storage = new AsyncLocalStorage<T>();\n return {\n runWith(ctx: T, fn: () => Promise<unknown>): Promise<unknown> {\n return storage.run(ctx, fn);\n },\n getContext(): T {\n const ctx = storage.getStore();\n if (ctx === undefined) {\n throw new Error(\"Extension context not set; invoke only through the extension adapter.\");\n }\n return ctx;\n },\n };\n}\n","/**\n * Generic adapter for extensions that discover tools via manifest and load handlers by dynamic import.\n * Any extension (builtin, etc.) that uses @tool scan → manifest and runs handlers with injected context uses this.\n */\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type { ToolAdapter, ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport type { ExecContext } from \"../../core/types/ToolIntent.js\";\nimport type { Evidence } from \"../../core/types/ToolResult.js\";\n\nexport interface ExtensionToolResult {\n result: unknown;\n evidence: Evidence[];\n}\n\nexport interface DynamicImportAdapterOptions<TContext> {\n kind: string;\n packageRoot: string;\n getExtensionContext: (execCtx: ExecContext) => TContext;\n contextRunner: { runWith(ctx: TContext, fn: () => Promise<ExtensionToolResult>): Promise<ExtensionToolResult> };\n}\n\n/**\n * Create an adapter that loads handlers by spec._meta.sourcePath and exportName, then runs with extension context.\n */\nexport function createDynamicImportAdapter<TContext>(\n options: DynamicImportAdapterOptions<TContext>,\n): ToolAdapter {\n const { kind, packageRoot, getExtensionContext, contextRunner } = options;\n return {\n kind: kind as ToolAdapter[\"kind\"],\n async invoke(\n spec: ToolSpec,\n args: unknown,\n execCtx: ExecContext,\n ): Promise<{ result: unknown; raw?: unknown }> {\n const meta = spec._meta as {\n sourcePath?: string;\n exportName?: string;\n defaultArgs?: Record<string, unknown>;\n } | undefined;\n const sourcePath = meta?.sourcePath;\n const exportName = meta?.exportName;\n if (!sourcePath || !exportName) {\n throw new Error(`Extension tool ${spec.name} missing _meta.sourcePath or _meta.exportName`);\n }\n const defaultArgs = meta?.defaultArgs ?? {};\n const mergedArgs =\n Object.keys(defaultArgs).length === 0\n ? (args as Record<string, unknown>)\n : { ...defaultArgs, ...(args as Record<string, unknown>) };\n const modulePath = path.join(packageRoot, `${sourcePath}.js`);\n const mod = await import(pathToFileURL(modulePath).href);\n const handler = mod[exportName];\n if (typeof handler !== \"function\") {\n throw new Error(\n `Extension tool ${spec.name}: export \"${exportName}\" from ${sourcePath} is not a function`,\n );\n }\n const ctx = getExtensionContext(execCtx);\n const output = await contextRunner.runWith(ctx, () => handler(mergedArgs));\n return { result: output.result, raw: { evidence: output.evidence } };\n },\n };\n}\n","/**\n * Load per-tool default args/config from <base>.tool.yaml (framework-defined format).\n *\n * Supported YAML format:\n * tool:\n * list:\n * - name: fetchText\n * timeoutMs: 5000\n * maxBytes: 1048576\n * (find item where name === tool base name, use rest as defaultArgs)\n */\nimport { readFileSync, existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport yaml from \"js-yaml\";\n\n/**\n * Load tool.yaml for a given tool. Path: packageRoot / dirname(sourcePath) / basename(sourcePath).tool.yaml\n * Returns default args (and config) for the tool, or undefined if file missing or no matching entry.\n */\nexport function loadToolYaml(\n packageRoot: string,\n sourcePath: string,\n): Record<string, unknown> | undefined {\n const dir = path.dirname(sourcePath);\n const base = path.basename(sourcePath);\n const yamlPath = path.join(packageRoot, dir, `${base}.tool.yaml`);\n if (!existsSync(yamlPath)) return undefined;\n try {\n const raw = readFileSync(yamlPath, \"utf-8\");\n const data = yaml.load(raw) as unknown;\n if (data == null || typeof data !== \"object\" || Array.isArray(data)) return undefined;\n const obj = data as Record<string, unknown>;\n const list = obj?.tool as Record<string, unknown> | undefined;\n const arr = list?.list;\n if (!Array.isArray(arr)) return undefined;\n const item = arr.find(\n (e: unknown) => e != null && typeof e === \"object\" && (e as Record<string, unknown>).name === base,\n ) as Record<string, unknown> | undefined;\n if (!item || typeof item !== \"object\") return undefined;\n const { name: _n, ...rest } = item;\n if (Object.keys(rest).length === 0) return undefined;\n return rest;\n } catch {\n return undefined;\n }\n}\n","/**\n * Generic manifest-based registration for extensions.\n * Reads a JSON manifest (from @tool scan) and registers ToolSpecs with the registry.\n * Optional: when packageRoot is provided, loads <base>.tool.yaml per tool (tool.list format) and sets defaultArgs in _meta.\n */\nimport { readFileSync, existsSync, statSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { createToolSpec } from \"../../core/types/ToolSpec.js\";\nimport type { ToolSpec, HitlSideEffect } from \"../../core/types/ToolSpec.js\";\nimport type { ToolRegistry } from \"../../core/registry/ToolRegistry.js\";\nimport { loadToolYaml } from \"./loadToolYaml.js\";\n\n/** Manifest entry shape (convention for @tool scan output). */\nexport interface ExtensionManifestEntry {\n coreName: string;\n description: string;\n inputSchema: object;\n outputSchema: object;\n sourcePath: string;\n exportName: string;\n sideEffect: HitlSideEffect;\n}\n\n/** Loaded manifest: entries + optional kind from manifest file. */\nexport interface LoadedExtensionManifest {\n kind?: string;\n entries: ExtensionManifestEntry[];\n}\n\nexport interface RegisterFromManifestOptions {\n /** Path to manifest JSON (or directory containing core-tools-manifest.json). */\n manifestPathOrDir: string;\n /** Tool kind; if omitted, uses manifest.kind or \"extension\". */\n kind?: string;\n /** Filter: only register these tool names. */\n only?: string[];\n /** Filter: only register tools whose name starts with one of these prefixes. */\n namePrefixes?: string[];\n /** Extension package root (e.g. dist); when set, loads <base>.tool.yaml per tool and sets defaultArgs in _meta. */\n packageRoot?: string;\n}\n\n/**\n * Load manifest from path. Supports array or { kind?, tools: ExtensionManifestEntry[] }.\n * Returns entries + optional kind so framework can use dynamic kind from manifest.\n */\nexport function loadExtensionManifest(manifestPathOrDir: string): LoadedExtensionManifest {\n const p = path.resolve(manifestPathOrDir);\n let manifestPath: string;\n if (existsSync(p) && statSync(p).isFile()) {\n manifestPath = p;\n } else {\n const inDir = path.join(p, \"core-tools-manifest.json\");\n const inDist = path.join(p, \"dist\", \"core-tools-manifest.json\");\n manifestPath = existsSync(inDir) ? inDir : inDist;\n }\n const raw = readFileSync(manifestPath, \"utf-8\");\n const parsed = JSON.parse(raw) as ExtensionManifestEntry[] | { kind?: string; tools: ExtensionManifestEntry[] };\n if (Array.isArray(parsed)) {\n return { entries: parsed };\n }\n return { kind: parsed.kind, entries: parsed.tools ?? [] };\n}\n\n/**\n * Register tools from a manifest with the registry. Returns the list of registered specs.\n * Extension packages call this from their registerCoreTools (or equivalent) with their package root.\n */\nexport function registerToolsFromManifest(\n registry: ToolRegistry,\n options: RegisterFromManifestOptions,\n): ToolSpec[] {\n const { manifestPathOrDir, kind: kindOpt, only, namePrefixes, packageRoot } = options;\n const loaded = loadExtensionManifest(manifestPathOrDir);\n const kind = (kindOpt ?? loaded.kind ?? \"extension\") as ToolSpec[\"kind\"];\n const entries = loaded.entries;\n const onlySet = only?.length ? new Set(only) : null;\n const registered: ToolSpec[] = [];\n\n for (const entry of entries) {\n let spec = createToolSpec({\n name: entry.coreName,\n kind,\n description: entry.description,\n inputSchema: entry.inputSchema,\n outputSchema: entry.outputSchema,\n capabilities: [],\n sideEffect: entry.sideEffect,\n });\n if (onlySet && !onlySet.has(spec.name)) continue;\n if (namePrefixes?.length && !namePrefixes.some((prefix) => spec.name.startsWith(prefix))) {\n continue;\n }\n const defaultArgs =\n packageRoot != null ? loadToolYaml(packageRoot, entry.sourcePath) : undefined;\n spec = {\n ...spec,\n _meta: {\n ...spec._meta,\n sourcePath: entry.sourcePath,\n exportName: entry.exportName,\n ...(defaultArgs != null && Object.keys(defaultArgs).length > 0 && { defaultArgs }),\n },\n } as ToolSpec;\n registry.register(spec);\n registered.push(spec);\n }\n return registered;\n}\n","/**\n * Resolve extension package root for dynamic import (dist when built, else dir).\n * Accepts import.meta.url (file:) or a directory path (e.g. __dirname).\n */\nimport path from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\n\nexport function resolveExtensionPackageRoot(metaUrlOrPath: string): string {\n const dir = metaUrlOrPath.startsWith(\"file:\")\n ? path.dirname(fileURLToPath(metaUrlOrPath))\n : path.resolve(metaUrlOrPath);\n const dist = path.join(dir, \"dist\");\n return existsSync(dist) ? dist : dir;\n}\n","/**\n * One-shot: load manifest from package (dynamic scan), register all specs, create adapter.\n * Framework reads manifest (kind + tools); extension only passes packagePath, config, getContextRunner.\n */\nimport type { ToolAdapter } from \"../../core/types/ToolSpec.js\";\nimport type { ToolRegistry } from \"../../core/registry/ToolRegistry.js\";\nimport type { ExecContext } from \"../../core/types/ToolIntent.js\";\nimport type { ContextRunner } from \"./contextRunner.js\";\nimport { createDynamicImportAdapter } from \"./dynamicImportAdapter.js\";\nimport type { ExtensionToolResult } from \"./dynamicImportAdapter.js\";\nimport { registerToolsFromManifest, loadExtensionManifest } from \"./registerFromManifest.js\";\nimport { resolveExtensionPackageRoot } from \"./resolvePackageRoot.js\";\n\nexport interface RegisterExtensionOptions<TContext> {\n /** Package root (e.g. __dirname of extension's entry). Manifest is read from here. */\n packagePath: string;\n /** Tool kind; if omitted, uses manifest.kind or \"extension\". */\n kind?: string;\n /** Extension config; passed into context as { execCtx, config }. */\n config: unknown;\n /** Returns the context runner (extension's createContextRunner()). */\n getContextRunner: () => ContextRunner<TContext>;\n /** Filter: only register these tool names. */\n only?: string[];\n /** Filter: only register tools whose name starts with one of these prefixes. */\n namePrefixes?: string[];\n}\n\n/**\n * Load manifest from package (dynamic: kind + tools from file), register all specs, create and return adapter.\n */\nexport function registerExtension<TContext extends { execCtx: ExecContext; config: unknown }>(\n registry: ToolRegistry,\n options: RegisterExtensionOptions<TContext>,\n): ToolAdapter {\n const { packagePath, kind: kindOpt, config, getContextRunner, only, namePrefixes } = options;\n const packageRoot = resolveExtensionPackageRoot(packagePath);\n const contextRunner = getContextRunner();\n const loaded = loadExtensionManifest(packagePath);\n const kind = kindOpt ?? loaded.kind ?? \"extension\";\n\n registerToolsFromManifest(registry, {\n manifestPathOrDir: packagePath,\n kind,\n only,\n namePrefixes,\n packageRoot,\n });\n\n const adapter = createDynamicImportAdapter<TContext>({\n kind,\n packageRoot,\n getExtensionContext: (execCtx: ExecContext) => ({ execCtx, config } as TContext),\n contextRunner: {\n runWith(ctx: TContext, fn: () => Promise<ExtensionToolResult>) {\n return contextRunner.runWith(ctx, fn) as Promise<ExtensionToolResult>;\n },\n },\n });\n return adapter;\n}\n","/**\n * Convert \"groups\" + \"only\" options and a group→prefix map into only/namePrefixes for registerToolsFromManifest.\n * Extensions define their own group names and prefixes (e.g. fs -> \"core/fs.\").\n */\nexport interface GroupPrefixOptions {\n /** Only register tools in these groups (e.g. [\"fs\", \"http\"]). */\n groups?: string[];\n /** Only register these tool names. Takes precedence over groups. */\n only?: string[];\n /** Map group name -> name prefix (e.g. { fs: \"core/fs.\", http: \"core/http.\" }). */\n groupPrefixMap: Record<string, string>;\n}\n\nexport interface ResolvedOnlyNamePrefixes {\n only?: string[];\n namePrefixes?: string[];\n}\n\n/**\n * Resolve groups/only + groupPrefixMap to only and namePrefixes for registerToolsFromManifest.\n */\nexport function getGroupNamePrefixes(options: GroupPrefixOptions): ResolvedOnlyNamePrefixes {\n const { groups, only, groupPrefixMap } = options;\n const onlySet = only?.length ? new Set(only) : null;\n const namePrefixes =\n !onlySet && groups?.length ? groups.map((g) => groupPrefixMap[g]).filter(Boolean) : undefined;\n return {\n ...(onlySet ? { only: Array.from(onlySet) } : {}),\n ...(namePrefixes?.length ? { namePrefixes } : {}),\n };\n}\n","/**\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"]}
1
+ {"version":3,"sources":["../src/security/ssrf.ts","../src/security/sandbox.ts","../src/api/extension/contextRunner.ts","../src/api/extension/dynamicImportAdapter.ts","../src/api/extension/loadToolYaml.ts","../src/api/extension/registerFromManifest.ts","../src/api/extension/resolvePackageRoot.ts","../src/api/extension/registerExtension.ts","../src/api/extension/createExtension.ts","../src/api/extension/generateExtensionManifest.ts","../src/api/extension/groupPrefix.ts","../src/tools/mcp/MCPClientAdapter.ts","../src/tools/mcp/connectMCP.ts","../src/tools/mcp/MCPProcessManager.ts","../src/tools/mcp/registerMCPTools.ts"],"names":["createTaggedError","lookup","realpath","resolve","normalize","access","dirname","basename","path","AsyncLocalStorage","pathToFileURL","existsSync","readFileSync","yaml","statSync","createToolSpec","fileURLToPath","scanForTools","writeFileSync","readdirSync","copyFileSync","MCP_KIND","DEFAULT_INPUT_SCHEMA","DEFAULT_OUTPUT_SCHEMA","join","loadMCPTool"],"mappings":"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","file":"index.cjs","sourcesContent":["import { lookup } from \"node:dns/promises\";\nimport { createTaggedError } from \"../core/runtime/Retry.js\";\n\n/**\n * Options for validateUrl. Unified rule: allow iff host is in allowedHosts AND not in blockedHosts.\n * - \"Default allow all + blocklist\": allowedHosts: [\"*\"], blockedHosts: [\"*.internal\", ...]\n * - \"Default disallow all + allowlist\": allowedHosts: [\"api.github.com\", ...], blockedHosts: []\n */\nexport interface ValidateUrlOptions {\n /** Allow only these hosts. Use [\"*\"] for allow-all. Supports \"*.example.com\", exact host. */\n allowedHosts: string[];\n /** Block these hosts even if allowed. Supports \"*.internal\", exact host. Merged with allowlist. */\n blockedHosts: string[];\n /** CIDR ranges to block (resolved IP). */\n blockedCidrs: string[];\n}\n\n/**\n * Validate a URL: allow iff (host in allowedHosts) AND (host not in blockedHosts). Then check blockedCidrs on resolved IP.\n *\n * @throws HTTP_DISALLOWED_HOST if the URL is blocked\n */\nexport async function validateUrl(url: string, options: ValidateUrlOptions): Promise<URL> {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n throw createTaggedError(\n \"HTTP_DISALLOWED_HOST\",\n `Invalid URL: ${url}`,\n { url },\n );\n }\n\n // Only allow http/https\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw createTaggedError(\n \"HTTP_DISALLOWED_HOST\",\n `Protocol not allowed: ${parsed.protocol}. Only http: and https: are supported.`,\n { url, protocol: parsed.protocol },\n );\n }\n\n const hostname = parsed.hostname;\n\n if (!isHostAllowed(hostname, options.allowedHosts)) {\n throw createTaggedError(\n \"HTTP_DISALLOWED_HOST\",\n `Host \"${hostname}\" is not in the allowed hosts list`,\n { url, hostname, allowedHosts: options.allowedHosts },\n );\n }\n if (isHostBlocked(hostname, options.blockedHosts)) {\n throw createTaggedError(\n \"HTTP_DISALLOWED_HOST\",\n `Host \"${hostname}\" is in the blocked hosts list`,\n { url, hostname, blockedHosts: options.blockedHosts },\n );\n }\n\n // DNS resolve and check against blocked CIDRs\n try {\n const { address } = await lookup(hostname);\n if (isIpInBlockedCidrs(address, options.blockedCidrs)) {\n throw createTaggedError(\n \"HTTP_DISALLOWED_HOST\",\n `Host \"${hostname}\" resolves to blocked IP: ${address}`,\n { url, hostname, resolvedIp: address },\n );\n }\n } catch (err) {\n // Re-throw our tagged errors\n if (err instanceof Error && (err as any).kind === \"HTTP_DISALLOWED_HOST\") {\n throw err;\n }\n // DNS resolution failure — block by default\n throw createTaggedError(\n \"HTTP_DISALLOWED_HOST\",\n `DNS resolution failed for host \"${hostname}\": ${err instanceof Error ? err.message : String(err)}`,\n { url, hostname },\n );\n }\n\n return parsed;\n}\n\n/**\n * Check if a hostname matches any entry in the allowed hosts list.\n * Supports: exact \"*\" (allow any host), wildcard prefix (e.g. \"*.github.com\"), or exact host.\n */\nfunction isHostAllowed(hostname: string, allowedHosts: string[]): boolean {\n for (const pattern of allowedHosts) {\n if (pattern === \"*\") {\n return true;\n }\n if (pattern.startsWith(\"*.\")) {\n const suffix = pattern.slice(1); // \".github.com\"\n if (hostname.endsWith(suffix) || hostname === pattern.slice(2)) {\n return true;\n }\n } else if (hostname === pattern) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Check if a hostname matches any entry in the blocked hosts list (same pattern rules as allowlist).\n */\nfunction isHostBlocked(hostname: string, blockedHosts: string[]): boolean {\n for (const pattern of blockedHosts) {\n if (pattern === \"*\") {\n return true;\n }\n if (pattern.startsWith(\"*.\")) {\n const suffix = pattern.slice(1);\n if (hostname.endsWith(suffix) || hostname === pattern.slice(2)) {\n return true;\n }\n } else if (hostname === pattern) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Check if an IPv4 address falls within any blocked CIDR range.\n */\nexport function isIpInBlockedCidrs(ip: string, cidrs: string[]): boolean {\n // Handle IPv4-mapped IPv6\n const normalizedIp = normalizeIp(ip);\n if (!normalizedIp) return false;\n\n for (const cidr of cidrs) {\n if (cidr.includes(\":\")) {\n // IPv6 CIDR — skip for IPv4 addresses\n if (!ip.includes(\":\")) continue;\n if (isIpv6InCidr(ip, cidr)) return true;\n } else {\n if (isIpv4InCidr(normalizedIp, cidr)) return true;\n }\n }\n return false;\n}\n\nfunction normalizeIp(ip: string): string | null {\n // Handle IPv4-mapped IPv6 (e.g. \"::ffff:127.0.0.1\")\n if (ip.startsWith(\"::ffff:\")) {\n return ip.slice(7);\n }\n // Pure IPv4\n if (/^\\d+\\.\\d+\\.\\d+\\.\\d+$/.test(ip)) {\n return ip;\n }\n return null;\n}\n\nfunction isIpv4InCidr(ip: string, cidr: string): boolean {\n const [cidrIp, prefixStr] = cidr.split(\"/\");\n if (!cidrIp || !prefixStr) return false;\n\n const prefix = parseInt(prefixStr, 10);\n if (isNaN(prefix) || prefix < 0 || prefix > 32) return false;\n\n const ipNum = ipv4ToNum(ip);\n const cidrNum = ipv4ToNum(cidrIp);\n if (ipNum === null || cidrNum === null) return false;\n\n const mask = prefix === 0 ? 0 : (~0 << (32 - prefix)) >>> 0;\n return (ipNum & mask) === (cidrNum & mask);\n}\n\nfunction ipv4ToNum(ip: string): number | null {\n const parts = ip.split(\".\");\n if (parts.length !== 4) return null;\n let num = 0;\n for (const part of parts) {\n const n = parseInt(part, 10);\n if (isNaN(n) || n < 0 || n > 255) return null;\n num = (num << 8) | n;\n }\n return num >>> 0;\n}\n\nfunction isIpv6InCidr(ip: string, cidr: string): boolean {\n // Simplified IPv6 CIDR matching for common cases (::1, fc00::, fe80::)\n const [cidrIp, prefixStr] = cidr.split(\"/\");\n if (!cidrIp || !prefixStr) return false;\n\n const prefix = parseInt(prefixStr, 10);\n if (isNaN(prefix)) return false;\n\n const ipBytes = expandIpv6(ip);\n const cidrBytes = expandIpv6(cidrIp);\n if (!ipBytes || !cidrBytes) return false;\n\n // Compare prefix bits\n const fullBytes = Math.floor(prefix / 8);\n for (let i = 0; i < fullBytes && i < 16; i++) {\n if (ipBytes[i] !== cidrBytes[i]) return false;\n }\n\n const remainingBits = prefix % 8;\n if (remainingBits > 0 && fullBytes < 16) {\n const mask = (~0 << (8 - remainingBits)) & 0xff;\n if ((ipBytes[fullBytes]! & mask) !== (cidrBytes[fullBytes]! & mask)) return false;\n }\n\n return true;\n}\n\nfunction expandIpv6(ip: string): number[] | null {\n // Remove zone ID\n const zoneIdx = ip.indexOf(\"%\");\n if (zoneIdx !== -1) ip = ip.slice(0, zoneIdx);\n\n const parts = ip.split(\"::\");\n if (parts.length > 2) return null;\n\n const bytes: number[] = new Array(16).fill(0);\n\n const expandGroup = (group: string): number[] => {\n if (!group) return [];\n return group.split(\":\").flatMap((hex) => {\n const val = parseInt(hex || \"0\", 16);\n return [(val >> 8) & 0xff, val & 0xff];\n });\n };\n\n if (parts.length === 1) {\n const expanded = expandGroup(parts[0]!);\n if (expanded.length !== 16) return null;\n return expanded;\n }\n\n const left = expandGroup(parts[0]!);\n const right = expandGroup(parts[1]!);\n\n if (left.length + right.length > 16) return null;\n\n for (let i = 0; i < left.length; i++) bytes[i] = left[i]!;\n for (let i = 0; i < right.length; i++) bytes[16 - right.length + i] = right[i]!;\n\n return bytes;\n}\n","import { resolve, normalize, dirname, basename } from \"node:path\";\nimport { realpath, access } from \"node:fs/promises\";\nimport { createTaggedError } from \"../core/runtime/Retry.js\";\n\n/**\n * Resolve an input path to an absolute path within the sandbox.\n * Throws PATH_OUTSIDE_SANDBOX if the resolved path escapes the sandbox root.\n *\n * For existing files: uses realpath to resolve symlinks.\n * For non-existing files (write targets): resolves the parent directory.\n */\nexport async function resolveSandboxedPath(\n inputPath: string,\n sandboxRoot: string,\n): Promise<string> {\n // Resolve the sandbox root itself with realpath to handle platform symlinks\n // (e.g. macOS /var -> /private/var)\n let normalizedRoot: string;\n try {\n normalizedRoot = await realpath(resolve(sandboxRoot));\n } catch {\n normalizedRoot = normalize(resolve(sandboxRoot));\n }\n\n // Resolve against sandbox root\n const resolved = resolve(normalizedRoot, inputPath);\n\n let real: string;\n try {\n // Try to resolve symlinks for existing paths\n await access(resolved);\n real = await realpath(resolved);\n } catch {\n // Path does not exist — resolve parent to check containment\n const parentDir = dirname(resolved);\n let realParent: string;\n try {\n await access(parentDir);\n realParent = await realpath(parentDir);\n } catch {\n // Parent also doesn't exist — use normalized resolved path\n // (will fail at actual FS operation if truly invalid)\n realParent = normalize(parentDir);\n }\n real = resolve(realParent, basename(resolved));\n }\n\n if (!isWithinRoot(real, normalizedRoot)) {\n throw createTaggedError(\n \"PATH_OUTSIDE_SANDBOX\",\n `Path \"${inputPath}\" resolves to \"${real}\" which is outside sandbox \"${normalizedRoot}\"`,\n { inputPath, resolvedPath: real, sandboxRoot: normalizedRoot },\n );\n }\n\n return real;\n}\n\nfunction isWithinRoot(path: string, root: string): boolean {\n const normalizedPath = normalize(path);\n const normalizedRoot = normalize(root);\n return normalizedPath === normalizedRoot || normalizedPath.startsWith(normalizedRoot + \"/\");\n}\n","/**\n * Generic context injection for extension tools (e.g. builtin).\n * Any extension that needs to inject config (sandbox, allowedHosts, etc.) into handlers uses this.\n */\nimport { AsyncLocalStorage } from \"node:async_hooks\";\n\nexport interface ContextRunner<T> {\n runWith(ctx: T, fn: () => Promise<unknown>): Promise<unknown>;\n getContext(): T;\n}\n\n/**\n * Create a context runner for an extension. Handlers call getContext() to read config.\n * Adapter calls runWith(ctx, () => handler(args)) so getContext() returns ctx.\n */\nexport function createContextRunner<T>(): ContextRunner<T> {\n const storage = new AsyncLocalStorage<T>();\n return {\n runWith(ctx: T, fn: () => Promise<unknown>): Promise<unknown> {\n return storage.run(ctx, fn);\n },\n getContext(): T {\n const ctx = storage.getStore();\n if (ctx === undefined) {\n throw new Error(\"Extension context not set; invoke only through the extension adapter.\");\n }\n return ctx;\n },\n };\n}\n","/**\n * Generic adapter for extensions that discover tools via manifest and load handlers by dynamic import.\n * Any extension (builtin, etc.) that uses @tool scan → manifest and runs handlers with injected context uses this.\n */\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type { ToolAdapter, ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport type { ExecContext } from \"../../core/types/ToolIntent.js\";\nimport type { Evidence } from \"../../core/types/ToolResult.js\";\n\nexport interface ExtensionToolResult {\n result: unknown;\n evidence: Evidence[];\n}\n\nexport interface DynamicImportAdapterOptions<TContext> {\n kind: string;\n packageRoot: string;\n /** Build context from execCtx and (optional) tool spec. When spec is provided, config can be merged from spec._meta.defaultArgs. */\n getExtensionContext: (execCtx: ExecContext, spec: ToolSpec) => TContext;\n contextRunner: { runWith(ctx: TContext, fn: () => Promise<ExtensionToolResult>): Promise<ExtensionToolResult> };\n}\n\n/**\n * Create an adapter that loads handlers by spec._meta.sourcePath and exportName, then runs with extension context.\n */\nexport function createDynamicImportAdapter<TContext>(\n options: DynamicImportAdapterOptions<TContext>,\n): ToolAdapter {\n const { kind, packageRoot, getExtensionContext, contextRunner } = options;\n return {\n kind: kind as ToolAdapter[\"kind\"],\n async invoke(\n spec: ToolSpec,\n args: unknown,\n execCtx: ExecContext,\n ): Promise<{ result: unknown; raw?: unknown }> {\n const meta = spec._meta as {\n sourcePath?: string;\n exportName?: string;\n defaultArgs?: Record<string, unknown>;\n } | undefined;\n const sourcePath = meta?.sourcePath;\n const exportName = meta?.exportName;\n if (!sourcePath || !exportName) {\n throw new Error(`Extension tool ${spec.name} missing _meta.sourcePath or _meta.exportName`);\n }\n const defaultArgs = meta?.defaultArgs ?? {};\n const mergedArgs =\n Object.keys(defaultArgs).length === 0\n ? (args as Record<string, unknown>)\n : { ...defaultArgs, ...(args as Record<string, unknown>) };\n const modulePath = path.join(packageRoot, `${sourcePath}.js`);\n const mod = await import(pathToFileURL(modulePath).href);\n const handler = mod[exportName];\n if (typeof handler !== \"function\") {\n throw new Error(\n `Extension tool ${spec.name}: export \"${exportName}\" from ${sourcePath} is not a function`,\n );\n }\n const ctx = getExtensionContext(execCtx, spec);\n const output = await contextRunner.runWith(ctx, () => handler(mergedArgs));\n return { result: output.result, raw: { evidence: output.evidence } };\n },\n };\n}\n","/**\n * Load per-tool default args/config from <base>.tool.yaml (framework-defined format).\n *\n * Supported YAML format:\n * tool:\n * list:\n * - name: fetchText\n * timeoutMs: 5000\n * maxBytes: 1048576\n * (find item where name === tool base name, use rest as defaultArgs)\n */\nimport { readFileSync, existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport yaml from \"js-yaml\";\n\n/**\n * Load tool.yaml for a given tool. Path: packageRoot / dirname(sourcePath) / basename(sourcePath).tool.yaml\n * Returns default args (and config) for the tool, or undefined if file missing or no matching entry.\n */\nexport function loadToolYaml(\n packageRoot: string,\n sourcePath: string,\n): Record<string, unknown> | undefined {\n const dir = path.dirname(sourcePath);\n const base = path.basename(sourcePath);\n const yamlPath = path.join(packageRoot, dir, `${base}.tool.yaml`);\n if (!existsSync(yamlPath)) return undefined;\n try {\n const raw = readFileSync(yamlPath, \"utf-8\");\n const data = yaml.load(raw) as unknown;\n if (data == null || typeof data !== \"object\" || Array.isArray(data)) return undefined;\n const obj = data as Record<string, unknown>;\n const list = obj?.tool as Record<string, unknown> | undefined;\n const arr = list?.list;\n if (!Array.isArray(arr)) return undefined;\n const item = arr.find(\n (e: unknown) => e != null && typeof e === \"object\" && (e as Record<string, unknown>).name === base,\n ) as Record<string, unknown> | undefined;\n if (!item || typeof item !== \"object\") return undefined;\n const { name: _n, ...rest } = item;\n if (Object.keys(rest).length === 0) return undefined;\n return rest;\n } catch {\n return undefined;\n }\n}\n","/**\n * Generic manifest-based registration for extensions.\n * Reads a pre-built JSON manifest (extension produces it at build time; agent-tool does not scan @tool).\n * Registers ToolSpecs with the registry. When packageRoot is provided, loads <base>.tool.yaml per tool and sets defaultArgs in _meta.\n */\nimport { readFileSync, existsSync, statSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { createToolSpec } from \"../../core/types/ToolSpec.js\";\nimport type { ToolSpec, HitlSideEffect } from \"../../core/types/ToolSpec.js\";\nimport type { ToolRegistry } from \"../../core/registry/ToolRegistry.js\";\nimport { loadToolYaml } from \"./loadToolYaml.js\";\n\n/** Manifest entry shape (convention: extension build emits this, e.g. from @tool scan). */\nexport interface ExtensionManifestEntry {\n coreName: string;\n description: string;\n inputSchema: object;\n outputSchema: object;\n sourcePath: string;\n exportName: string;\n sideEffect: HitlSideEffect;\n}\n\n/** Loaded manifest: entries + optional kind from manifest file. */\nexport interface LoadedExtensionManifest {\n kind?: string;\n entries: ExtensionManifestEntry[];\n}\n\nexport interface RegisterFromManifestOptions {\n /** Path to manifest JSON (or directory containing core-tools-manifest.json). */\n manifestPathOrDir: string;\n /** Tool kind; if omitted, uses manifest.kind or \"extension\". */\n kind?: string;\n /** Filter: only register these tool names. */\n only?: string[];\n /** Filter: only register tools whose name starts with one of these prefixes. */\n namePrefixes?: string[];\n /** Extension package root (e.g. dist); when set, loads <base>.tool.yaml per tool and sets defaultArgs in _meta. */\n packageRoot?: string;\n}\n\n/**\n * Load manifest from path. Supports array or { kind?, tools: ExtensionManifestEntry[] }.\n * Returns entries + optional kind so framework can use dynamic kind from manifest.\n */\nexport function loadExtensionManifest(manifestPathOrDir: string): LoadedExtensionManifest {\n const p = path.resolve(manifestPathOrDir);\n let manifestPath: string;\n if (existsSync(p) && statSync(p).isFile()) {\n manifestPath = p;\n } else {\n const inDir = path.join(p, \"core-tools-manifest.json\");\n const inDist = path.join(p, \"dist\", \"core-tools-manifest.json\");\n manifestPath = existsSync(inDir) ? inDir : inDist;\n }\n const raw = readFileSync(manifestPath, \"utf-8\");\n const parsed = JSON.parse(raw) as ExtensionManifestEntry[] | { kind?: string; tools: ExtensionManifestEntry[] };\n if (Array.isArray(parsed)) {\n return { entries: parsed };\n }\n return { kind: parsed.kind, entries: parsed.tools ?? [] };\n}\n\n/**\n * Register tools from a manifest with the registry. Returns the list of registered specs.\n * Extension packages call this from their register (or equivalent) with their package root.\n */\nexport function registerToolsFromManifest(\n registry: ToolRegistry,\n options: RegisterFromManifestOptions,\n): ToolSpec[] {\n const { manifestPathOrDir, kind: kindOpt, only, namePrefixes, packageRoot } = options;\n const loaded = loadExtensionManifest(manifestPathOrDir);\n const kind = (kindOpt ?? loaded.kind ?? \"extension\") as ToolSpec[\"kind\"];\n const entries = loaded.entries;\n const onlySet = only?.length ? new Set(only) : null;\n const registered: ToolSpec[] = [];\n\n for (const entry of entries) {\n let spec = createToolSpec({\n name: entry.coreName,\n kind,\n description: entry.description,\n inputSchema: entry.inputSchema,\n outputSchema: entry.outputSchema,\n capabilities: [],\n sideEffect: entry.sideEffect,\n });\n if (onlySet && !onlySet.has(spec.name)) continue;\n if (namePrefixes?.length && !namePrefixes.some((prefix) => spec.name.startsWith(prefix))) {\n continue;\n }\n const defaultArgs =\n packageRoot != null ? loadToolYaml(packageRoot, entry.sourcePath) : undefined;\n spec = {\n ...spec,\n _meta: {\n ...spec._meta,\n sourcePath: entry.sourcePath,\n exportName: entry.exportName,\n ...(defaultArgs != null && Object.keys(defaultArgs).length > 0 && { defaultArgs }),\n },\n } as ToolSpec;\n registry.register(spec);\n registered.push(spec);\n }\n return registered;\n}\n","/**\n * Resolve extension package root for dynamic import (dist when built, else dir).\n * Accepts import.meta.url (file:) or a directory path (e.g. __dirname).\n */\nimport path from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\n\nexport function resolveExtensionPackageRoot(metaUrlOrPath: string): string {\n const dir = metaUrlOrPath.startsWith(\"file:\")\n ? path.dirname(fileURLToPath(metaUrlOrPath))\n : path.resolve(metaUrlOrPath);\n const dist = path.join(dir, \"dist\");\n return existsSync(dist) ? dist : dir;\n}\n","/**\n * One-shot: load pre-built manifest from package, register all specs, create adapter.\n * Framework does NOT scan source for @tool; it reads manifest (e.g. core-tools-manifest.json)\n * produced by the extension's build. Extension passes packagePath, config, getContextRunner.\n */\nimport type { ToolAdapter } from \"../../core/types/ToolSpec.js\";\nimport type { ToolRegistry } from \"../../core/registry/ToolRegistry.js\";\nimport type { ExecContext } from \"../../core/types/ToolIntent.js\";\nimport type { ContextRunner } from \"./contextRunner.js\";\nimport { createDynamicImportAdapter } from \"./dynamicImportAdapter.js\";\nimport type { ExtensionToolResult } from \"./dynamicImportAdapter.js\";\nimport { registerToolsFromManifest, loadExtensionManifest } from \"./registerFromManifest.js\";\nimport { resolveExtensionPackageRoot } from \"./resolvePackageRoot.js\";\n\nexport interface RegisterExtensionOptions<TContext> {\n /** Package root (e.g. __dirname of extension's entry). Manifest is read from here. */\n packagePath: string;\n /** Tool kind; if omitted, uses manifest.kind or \"extension\". */\n kind?: string;\n /** Optional default config; merged with each tool's tool.yaml (spec._meta.defaultArgs). Context config = { ...config, ...toolDefaultArgs }. */\n config?: unknown;\n /** Returns the context runner (extension's createContextRunner()). */\n getContextRunner: () => ContextRunner<TContext>;\n /** Filter: only register these tool names. */\n only?: string[];\n /** Filter: only register tools whose name starts with one of these prefixes. */\n namePrefixes?: string[];\n}\n\n/**\n * Load manifest from package (pre-built JSON; no @tool scanning). Register all specs, create and return adapter.\n */\nexport function registerExtension<TContext extends { execCtx: ExecContext; config: unknown }>(\n registry: ToolRegistry,\n options: RegisterExtensionOptions<TContext>,\n): ToolAdapter {\n const { packagePath, kind: kindOpt, config, getContextRunner, only, namePrefixes } = options;\n const packageRoot = resolveExtensionPackageRoot(packagePath);\n const contextRunner = getContextRunner();\n const loaded = loadExtensionManifest(packagePath);\n const kind = kindOpt ?? loaded.kind ?? \"extension\";\n\n registerToolsFromManifest(registry, {\n manifestPathOrDir: packagePath,\n kind,\n only,\n namePrefixes,\n packageRoot,\n });\n\n const adapter = createDynamicImportAdapter<TContext>({\n kind,\n packageRoot,\n getExtensionContext: (execCtx: ExecContext, spec: import(\"../../core/types/ToolSpec.js\").ToolSpec) =>\n ({\n execCtx,\n config: (config !== undefined\n ? { ...(config as Record<string, unknown>), ...((spec._meta as { defaultArgs?: Record<string, unknown> } | undefined)?.defaultArgs ?? {}) }\n : ((spec._meta as { defaultArgs?: Record<string, unknown> } | undefined)?.defaultArgs ?? {})) as TContext[\"config\"],\n }) as TContext,\n contextRunner: {\n runWith(ctx: TContext, fn: () => Promise<ExtensionToolResult>) {\n return contextRunner.runWith(ctx, fn) as Promise<ExtensionToolResult>;\n },\n },\n });\n return adapter;\n}\n","/**\n * One-shot extension bootstrap: context runner + register + getContext/runWith.\n * Config can be extension-level (buildConfig) or per-tool only (defaultConfig in opts, merged with tool.yaml).\n */\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { ToolAdapter } from \"../../core/types/ToolSpec.js\";\nimport type { ToolRegistry } from \"../../core/registry/ToolRegistry.js\";\nimport { createContextRunner } from \"./contextRunner.js\";\nimport { registerExtension } from \"./registerExtension.js\";\nimport type { ExtensionToolContext } from \"./types.js\";\n\n/** Pass import.meta so the framework derives packagePath (extension entry does not need path/fileURLToPath). */\nexport interface ImportMetaLike {\n url: string;\n}\n\n/** Options when config is built from userConfig (buildConfig). */\nexport interface CreateExtensionOptionsWithBuild<TConfig, TUserConfig> {\n packagePath?: string;\n importMeta?: ImportMetaLike;\n kind?: string;\n buildConfig: (userConfig: TUserConfig) => TConfig;\n}\n\n/** Options when config is per-tool only (each tool's tool.yaml). */\nexport interface CreateExtensionOptionsDefaultOnly {\n packagePath?: string;\n importMeta?: ImportMetaLike;\n kind?: string;\n}\n\n/** Register opts when using per-tool config only: filter tools by name. */\nexport interface RegisterOptionsDefaultOnly {\n only?: string[];\n namePrefixes?: string[];\n}\n\nexport type CreateExtensionOptions<TConfig, TUserConfig> =\n | CreateExtensionOptionsWithBuild<TConfig, TUserConfig>\n | (CreateExtensionOptionsDefaultOnly & { buildConfig?: never });\n\nexport interface CreateExtensionResult<TConfig, TUserConfig> {\n register(\n registry: ToolRegistry,\n userConfigOrOpts: TUserConfig,\n options?: { only?: string[]; namePrefixes?: string[] },\n ): ToolAdapter;\n getContext(): ExtensionToolContext<TConfig>;\n runWith<T>(ctx: ExtensionToolContext<TConfig>, fn: () => Promise<T>): Promise<T>;\n}\n\n/**\n * Create an extension. With buildConfig: register(registry, userConfig, opts?).\n * Without buildConfig: register(registry, opts?) where opts = { only?, namePrefixes? }; config comes only from each tool's tool.yaml.\n */\nfunction resolvePackagePath(options: { packagePath?: string; importMeta?: ImportMetaLike }): string {\n if (options.packagePath != null && options.packagePath !== \"\") return options.packagePath;\n if (options.importMeta?.url) return path.dirname(fileURLToPath(options.importMeta.url));\n throw new Error(\"createExtension: provide packagePath or importMeta\");\n}\n\nexport function createExtension<TConfig = Record<string, unknown>, TUserConfig = RegisterOptionsDefaultOnly>(\n options: CreateExtensionOptions<TConfig, TUserConfig>,\n): CreateExtensionResult<TConfig, TUserConfig> {\n const packagePath = resolvePackagePath(options);\n const kind = options.kind;\n const buildConfig = \"buildConfig\" in options ? options.buildConfig : undefined;\n type Ctx = ExtensionToolContext<TConfig>;\n const contextRunner = createContextRunner<Ctx>();\n\n return {\n register(registry, userConfigOrOpts, opts) {\n const config = buildConfig\n ? (buildConfig as (u: TUserConfig) => TConfig)(userConfigOrOpts as TUserConfig)\n : undefined;\n return registerExtension(registry, {\n packagePath,\n kind,\n config,\n getContextRunner: () => contextRunner,\n only: opts?.only ?? (userConfigOrOpts as RegisterOptionsDefaultOnly | undefined)?.only,\n namePrefixes: opts?.namePrefixes ?? (userConfigOrOpts as RegisterOptionsDefaultOnly | undefined)?.namePrefixes,\n });\n },\n getContext(): ExtensionToolContext<TConfig> {\n return contextRunner.getContext() as ExtensionToolContext<TConfig>;\n },\n runWith<T>(ctx: ExtensionToolContext<TConfig>, fn: () => Promise<T>): Promise<T> {\n return contextRunner.runWith(ctx, fn) as Promise<T>;\n },\n };\n}\n","/**\n * Build step: scan project for @tool, emit extension manifest (core-tools-manifest.json) and copy *.tool.yaml.\n * Extensions run this at build time; agent-tool reads the manifest when the extension's register is called.\n */\nimport { writeFileSync, mkdirSync, existsSync, readdirSync, copyFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { scanForTools } from \"../../tools/function/scanner.js\";\nimport type { ExtensionManifestEntry } from \"./registerFromManifest.js\";\nimport type { HitlSideEffect } from \"../../core/types/ToolSpec.js\";\n\nexport interface GenerateExtensionManifestOptions {\n /** Project root (default: process.cwd()). */\n projectRoot?: string;\n /** Output directory for manifest and copied tool.yaml (default: projectRoot/dist). */\n outDir?: string;\n /** Manifest kind (default: \"core\"). */\n kind?: string;\n /** Include globs for TS files (default: all .ts). */\n include?: string[];\n /** Path to tsconfig (default: projectRoot/tsconfig.json). */\n tsconfigPath?: string;\n /** Subdirs to copy *.tool.yaml from (default: all dirs under projectRoot that contain .tool.yaml). */\n copyToolYamlDirs?: string[];\n}\n\n/**\n * Scan project for @tool, write core-tools-manifest.json and copy *.tool.yaml to outDir.\n * Returns the written manifest path and number of tools.\n */\nexport function generateExtensionManifest(\n projectRoot: string = process.cwd(),\n options: GenerateExtensionManifestOptions = {},\n): { manifestPath: string; toolsCount: number; toolYamlCopied: number } {\n const root = path.resolve(projectRoot);\n const outDir = path.resolve(options.outDir ?? path.join(root, \"dist\"));\n const kind = options.kind ?? \"core\";\n\n const { specs, errors } = scanForTools({\n projectPath: root,\n include: options.include ?? [\"**/*.ts\"],\n tsconfigPath: options.tsconfigPath,\n });\n\n if (errors.length > 0) {\n console.warn(\"generateExtensionManifest: scan errors\", errors);\n }\n\n const entries: ExtensionManifestEntry[] = specs.map((spec) => {\n const sourcePathNoExt = (spec.sourcePath ?? \"\").replace(/\\.(ts|tsx)$/i, \"\");\n const coreName = `${kind}/${sourcePathNoExt.replace(/\\//g, \".\")}`;\n const sideEffect: HitlSideEffect =\n (spec._meta?.hitl?.sideEffect as HitlSideEffect) ?? \"none\";\n return {\n coreName,\n description: spec.description ?? sourcePathNoExt,\n inputSchema: spec.inputSchema ?? { type: \"object\", additionalProperties: true },\n outputSchema: spec.outputSchema ?? { type: \"object\", additionalProperties: true },\n sourcePath: sourcePathNoExt,\n exportName: spec.exportName ?? \"\",\n sideEffect,\n };\n });\n\n if (!existsSync(outDir)) mkdirSync(outDir, { recursive: true });\n const manifestPath = path.join(outDir, \"core-tools-manifest.json\");\n writeFileSync(\n manifestPath,\n JSON.stringify({ kind, tools: entries }, null, 2),\n \"utf-8\",\n );\n\n let toolYamlCopied = 0;\n const copyDirs = options.copyToolYamlDirs;\n if (copyDirs?.length) {\n for (const d of copyDirs) {\n const srcDir = path.join(root, d);\n const destDir = path.join(outDir, d);\n if (!existsSync(srcDir)) continue;\n try {\n for (const e of readdirSync(srcDir, { withFileTypes: true })) {\n if (e.isFile() && e.name.endsWith(\".tool.yaml\")) {\n if (!existsSync(destDir)) mkdirSync(destDir, { recursive: true });\n copyFileSync(path.join(srcDir, e.name), path.join(destDir, e.name));\n toolYamlCopied++;\n }\n }\n } catch {\n // ignore\n }\n }\n }\n\n return { manifestPath, toolsCount: entries.length, toolYamlCopied };\n}\n\n/**\n * Build step for extensions: scan src folder and subfolders, emit manifest, copy tool.yaml.\n * Call from extension's build script (e.g. tsx generate-manifest.ts).\n */\nexport function generateManifest(projectRoot: string = process.cwd()): void {\n const { manifestPath, toolsCount, toolYamlCopied } = generateExtensionManifest(projectRoot, {\n include: [\"src/**/*.ts\"],\n copyToolYamlDirs: [\"src\"],\n });\n console.log(`Wrote ${toolsCount} tools to ${path.relative(projectRoot, manifestPath)}`);\n if (toolYamlCopied > 0) console.log(`Copied ${toolYamlCopied} tool.yaml file(s) to dist`);\n}\n","/**\n * Convert \"groups\" + \"only\" options and a group→prefix map into only/namePrefixes for registerToolsFromManifest.\n * Extensions define their own group names and prefixes (e.g. fs -> \"core/fs.\").\n */\nexport interface GroupPrefixOptions {\n /** Only register tools in these groups (e.g. [\"fs\", \"http\"]). */\n groups?: string[];\n /** Only register these tool names. Takes precedence over groups. */\n only?: string[];\n /** Map group name -> name prefix (e.g. { fs: \"core/fs.\", http: \"core/http.\" }). */\n groupPrefixMap: Record<string, string>;\n}\n\nexport interface ResolvedOnlyNamePrefixes {\n only?: string[];\n namePrefixes?: string[];\n}\n\n/**\n * Resolve groups/only + groupPrefixMap to only and namePrefixes for registerToolsFromManifest.\n */\nexport function getGroupNamePrefixes(options: GroupPrefixOptions): ResolvedOnlyNamePrefixes {\n const { groups, only, groupPrefixMap } = options;\n const onlySet = only?.length ? new Set(only) : null;\n const namePrefixes =\n !onlySet && groups?.length ? groups.map((g) => groupPrefixMap[g]).filter(Boolean) : undefined;\n return {\n ...(onlySet ? { only: Array.from(onlySet) } : {}),\n ...(namePrefixes?.length ? { namePrefixes } : {}),\n };\n}\n","/**\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.d.ts CHANGED
@@ -44,8 +44,8 @@ export { createContextRunner } from "./api/extension/contextRunner.js";
44
44
  export type { ContextRunner } from "./api/extension/contextRunner.js";
45
45
  export { createDynamicImportAdapter } from "./api/extension/dynamicImportAdapter.js";
46
46
  export type { DynamicImportAdapterOptions, ExtensionToolResult, } from "./api/extension/dynamicImportAdapter.js";
47
- export { loadToolYaml, registerToolsFromManifest, loadExtensionManifest, resolveExtensionPackageRoot, getGroupNamePrefixes, registerExtension, } from "./api/extension/index.js";
48
- export type { ExtensionManifestEntry, LoadedExtensionManifest, RegisterFromManifestOptions, ExtensionToolContext, ExtensionToolHandler, GroupPrefixOptions, ResolvedOnlyNamePrefixes, RegisterExtensionOptions, } from "./api/extension/index.js";
47
+ export { createExtension, generateExtensionManifest, generateManifest, loadToolYaml, registerToolsFromManifest, loadExtensionManifest, resolveExtensionPackageRoot, getGroupNamePrefixes, registerExtension, } from "./api/extension/index.js";
48
+ export type { CreateExtensionOptions, CreateExtensionResult, GenerateExtensionManifestOptions, ImportMetaLike, RegisterOptionsDefaultOnly, ExtensionManifestEntry, LoadedExtensionManifest, RegisterFromManifestOptions, ExtensionToolContext, ExtensionToolHandler, GroupPrefixOptions, ResolvedOnlyNamePrefixes, RegisterExtensionOptions, } from "./api/extension/index.js";
49
49
  export { isNpmToolDescriptor, parseNpmToolDescriptor, resolveNpmToolDescriptor, resolveToolDescriptor, normalizeToolList, npmDescriptorToRegistryPrefix, } from "./tools/util/toolDescriptor.js";
50
50
  export type { NpmToolDescriptor } from "./tools/util/toolDescriptor.js";
51
51
  export { EventLog } from "./observability/EventLog.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,YAAY,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACvF,YAAY,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAC9E,YAAY,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAC;AACjE,YAAY,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,YAAY,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,YAAY,EACV,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,UAAU,EACV,WAAW,EACX,aAAa,EACb,WAAW,GACZ,MAAM,iCAAiC,CAAC;AAGzC,YAAY,EACV,QAAQ,EACR,UAAU,EACV,SAAS,EACT,cAAc,EACd,QAAQ,EACR,WAAW,EACX,qBAAqB,GACtB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,0BAA0B,CAAC;AAElC,YAAY,EACV,YAAY,EACZ,WAAW,EACX,UAAU,GACX,MAAM,4BAA4B,CAAC;AAEpC,YAAY,EACV,QAAQ,EACR,SAAS,EACT,UAAU,GACX,MAAM,4BAA4B,CAAC;AAEpC,YAAY,EACV,aAAa,EACb,SAAS,EACT,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,0BAA0B,EAC1B,wBAAwB,EACxB,uBAAuB,EACvB,UAAU,EACV,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,YAAY,GACb,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,YAAY,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACjF,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACtF,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC3F,YAAY,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACpF,YAAY,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAG3D,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC9F,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,YAAY,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAGvE,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,YAAY,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAGvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,YAAY,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,0BAA0B,EAAE,MAAM,yCAAyC,CAAC;AACrF,YAAY,EACV,2BAA2B,EAC3B,mBAAmB,GACpB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EACL,YAAY,EACZ,yBAAyB,EACzB,qBAAqB,EACrB,2BAA2B,EAC3B,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,sBAAsB,EACtB,uBAAuB,EACvB,2BAA2B,EAC3B,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,wBAAwB,EACxB,qBAAqB,EACrB,iBAAiB,EACjB,6BAA6B,GAC9B,MAAM,gCAAgC,CAAC;AACxC,YAAY,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAGxE,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACvD,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC1F,YAAY,EACV,MAAM,EACN,QAAQ,EACR,YAAY,EACZ,oBAAoB,GACrB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC/E,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAGlE,YAAY,EACV,gBAAgB,EAChB,aAAa,EACb,eAAe,GAChB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,gCAAgC,CAAC;AAMxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,YAAY,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EACL,cAAc,EACd,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACrB,KAAK,UAAU,GAChB,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EACL,UAAU,EACV,eAAe,EACf,0BAA0B,EAC1B,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,uBAAuB,EACvB,sBAAsB,EACtB,aAAa,EACb,gBAAgB,EAChB,UAAU,EACV,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,YAAY,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AACxE,YAAY,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAG9E,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,YAAY,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,oCAAoC,EAAE,MAAM,gCAAgC,CAAC;AAGtF,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,19 +1,19 @@
1
- export { LangChainToolsHub, createAgentTools } from './chunk-ZRDI2RKU.js';
2
- import { loadMCPTool } from './chunk-BOMOGAFZ.js';
3
- export { DirectoryScanner, DiscoveryError, SkillManifestError, buildFunctionToTool, buildMcpPackage, initProject, loadMCPTool, loadSkillDefinition, parseSkillMd, runGeneratedMCP, runMcpServer, scan, scanForTools, scanSkillResources, validateFrontmatter } from './chunk-BOMOGAFZ.js';
4
- import { MCP_KIND } from './chunk-BPHY6UVK.js';
5
- export { BudgetManager, EventLog, Metrics, PTCRuntime, PolicyDeniedError, PolicyEngine, SchemaValidationError, SchemaValidator, Tracing, buildEvidence, createLogger, ensurePackageInCache, expandToolDescriptorsToRegistryNames, getPackageEntryPath, importFromCache, isNpmToolDescriptor, loadToolConfig, normalizeToolList, npmDescriptorToRegistryPrefix, parseNpmToolDescriptor, resolveNpmToolDescriptor, resolveToolDescriptor, sanitizeForLog, summarizeForLog } from './chunk-BPHY6UVK.js';
1
+ export { LangChainToolsHub, createAgentTools } from './chunk-7J2DRVCV.js';
2
+ import { scanForTools, loadMCPTool } from './chunk-XRCHMWOC.js';
3
+ export { DirectoryScanner, DiscoveryError, SkillManifestError, buildFunctionToTool, buildMcpPackage, initProject, loadMCPTool, loadSkillDefinition, parseSkillMd, runGeneratedMCP, runMcpServer, scan, scanForTools, scanSkillResources, validateFrontmatter } from './chunk-XRCHMWOC.js';
4
+ import { MCP_KIND } from './chunk-UUQGKFSG.js';
5
+ export { BudgetManager, EventLog, Metrics, PTCRuntime, PolicyDeniedError, PolicyEngine, SchemaValidationError, SchemaValidator, Tracing, buildEvidence, createLogger, ensurePackageInCache, expandToolDescriptorsToRegistryNames, getPackageEntryPath, importFromCache, isNpmToolDescriptor, loadToolConfig, normalizeToolList, npmDescriptorToRegistryPrefix, parseNpmToolDescriptor, resolveNpmToolDescriptor, resolveToolDescriptor, sanitizeForLog, summarizeForLog } from './chunk-UUQGKFSG.js';
6
6
  import { createTaggedError } from './chunk-ZRHPGW7W.js';
7
7
  export { ToolRegistry, createTaggedError, isRetryable, withRetry } from './chunk-ZRHPGW7W.js';
8
8
  import './chunk-3MUOBLNB.js';
9
9
  import { createToolSpec, DEFAULT_OUTPUT_SCHEMA, DEFAULT_INPUT_SCHEMA } from './chunk-KDB3MY2H.js';
10
10
  export { DEFAULT_INPUT_SCHEMA, DEFAULT_OUTPUT_SCHEMA, createToolSpec, normalizeToolName } from './chunk-KDB3MY2H.js';
11
11
  import { lookup } from 'dns/promises';
12
- import path2, { resolve, normalize, dirname, basename, join } from 'path';
12
+ import path6, { resolve, normalize, dirname, basename, join } from 'path';
13
13
  import { realpath, access } from 'fs/promises';
14
14
  import { AsyncLocalStorage } from 'async_hooks';
15
15
  import { pathToFileURL, fileURLToPath } from 'url';
16
- import { existsSync, readFileSync, statSync } from 'fs';
16
+ import { existsSync, readFileSync, statSync, mkdirSync, writeFileSync, readdirSync, copyFileSync } from 'fs';
17
17
  import yaml from 'js-yaml';
18
18
 
19
19
  async function validateUrl(url, options) {
@@ -222,8 +222,8 @@ async function resolveSandboxedPath(inputPath, sandboxRoot) {
222
222
  }
223
223
  return real;
224
224
  }
225
- function isWithinRoot(path5, root) {
226
- const normalizedPath = normalize(path5);
225
+ function isWithinRoot(path7, root) {
226
+ const normalizedPath = normalize(path7);
227
227
  const normalizedRoot = normalize(root);
228
228
  return normalizedPath === normalizedRoot || normalizedPath.startsWith(normalizedRoot + "/");
229
229
  }
@@ -255,7 +255,7 @@ function createDynamicImportAdapter(options) {
255
255
  }
256
256
  const defaultArgs = meta?.defaultArgs ?? {};
257
257
  const mergedArgs = Object.keys(defaultArgs).length === 0 ? args : { ...defaultArgs, ...args };
258
- const modulePath = path2.join(packageRoot, `${sourcePath}.js`);
258
+ const modulePath = path6.join(packageRoot, `${sourcePath}.js`);
259
259
  const mod = await import(pathToFileURL(modulePath).href);
260
260
  const handler = mod[exportName];
261
261
  if (typeof handler !== "function") {
@@ -263,16 +263,16 @@ function createDynamicImportAdapter(options) {
263
263
  `Extension tool ${spec.name}: export "${exportName}" from ${sourcePath} is not a function`
264
264
  );
265
265
  }
266
- const ctx = getExtensionContext(execCtx);
266
+ const ctx = getExtensionContext(execCtx, spec);
267
267
  const output = await contextRunner.runWith(ctx, () => handler(mergedArgs));
268
268
  return { result: output.result, raw: { evidence: output.evidence } };
269
269
  }
270
270
  };
271
271
  }
272
272
  function loadToolYaml(packageRoot, sourcePath) {
273
- const dir = path2.dirname(sourcePath);
274
- const base = path2.basename(sourcePath);
275
- const yamlPath = path2.join(packageRoot, dir, `${base}.tool.yaml`);
273
+ const dir = path6.dirname(sourcePath);
274
+ const base = path6.basename(sourcePath);
275
+ const yamlPath = path6.join(packageRoot, dir, `${base}.tool.yaml`);
276
276
  if (!existsSync(yamlPath)) return void 0;
277
277
  try {
278
278
  const raw = readFileSync(yamlPath, "utf-8");
@@ -293,14 +293,16 @@ function loadToolYaml(packageRoot, sourcePath) {
293
293
  return void 0;
294
294
  }
295
295
  }
296
+
297
+ // src/api/extension/registerFromManifest.ts
296
298
  function loadExtensionManifest(manifestPathOrDir) {
297
- const p = path2.resolve(manifestPathOrDir);
299
+ const p = path6.resolve(manifestPathOrDir);
298
300
  let manifestPath;
299
301
  if (existsSync(p) && statSync(p).isFile()) {
300
302
  manifestPath = p;
301
303
  } else {
302
- const inDir = path2.join(p, "core-tools-manifest.json");
303
- const inDist = path2.join(p, "dist", "core-tools-manifest.json");
304
+ const inDir = path6.join(p, "core-tools-manifest.json");
305
+ const inDist = path6.join(p, "dist", "core-tools-manifest.json");
304
306
  manifestPath = existsSync(inDir) ? inDir : inDist;
305
307
  }
306
308
  const raw = readFileSync(manifestPath, "utf-8");
@@ -347,8 +349,8 @@ function registerToolsFromManifest(registry, options) {
347
349
  return registered;
348
350
  }
349
351
  function resolveExtensionPackageRoot(metaUrlOrPath) {
350
- const dir = metaUrlOrPath.startsWith("file:") ? path2.dirname(fileURLToPath(metaUrlOrPath)) : path2.resolve(metaUrlOrPath);
351
- const dist = path2.join(dir, "dist");
352
+ const dir = metaUrlOrPath.startsWith("file:") ? path6.dirname(fileURLToPath(metaUrlOrPath)) : path6.resolve(metaUrlOrPath);
353
+ const dist = path6.join(dir, "dist");
352
354
  return existsSync(dist) ? dist : dir;
353
355
  }
354
356
 
@@ -369,7 +371,10 @@ function registerExtension(registry, options) {
369
371
  const adapter = createDynamicImportAdapter({
370
372
  kind,
371
373
  packageRoot,
372
- getExtensionContext: (execCtx) => ({ execCtx, config }),
374
+ getExtensionContext: (execCtx, spec) => ({
375
+ execCtx,
376
+ config: config !== void 0 ? { ...config, ...spec._meta?.defaultArgs ?? {} } : spec._meta?.defaultArgs ?? {}
377
+ }),
373
378
  contextRunner: {
374
379
  runWith(ctx, fn) {
375
380
  return contextRunner.runWith(ctx, fn);
@@ -379,6 +384,100 @@ function registerExtension(registry, options) {
379
384
  return adapter;
380
385
  }
381
386
 
387
+ // src/api/extension/createExtension.ts
388
+ function resolvePackagePath(options) {
389
+ if (options.packagePath != null && options.packagePath !== "") return options.packagePath;
390
+ if (options.importMeta?.url) return path6.dirname(fileURLToPath(options.importMeta.url));
391
+ throw new Error("createExtension: provide packagePath or importMeta");
392
+ }
393
+ function createExtension(options) {
394
+ const packagePath = resolvePackagePath(options);
395
+ const kind = options.kind;
396
+ const buildConfig = "buildConfig" in options ? options.buildConfig : void 0;
397
+ const contextRunner = createContextRunner();
398
+ return {
399
+ register(registry, userConfigOrOpts, opts) {
400
+ const config = buildConfig ? buildConfig(userConfigOrOpts) : void 0;
401
+ return registerExtension(registry, {
402
+ packagePath,
403
+ kind,
404
+ config,
405
+ getContextRunner: () => contextRunner,
406
+ only: opts?.only ?? userConfigOrOpts?.only,
407
+ namePrefixes: opts?.namePrefixes ?? userConfigOrOpts?.namePrefixes
408
+ });
409
+ },
410
+ getContext() {
411
+ return contextRunner.getContext();
412
+ },
413
+ runWith(ctx, fn) {
414
+ return contextRunner.runWith(ctx, fn);
415
+ }
416
+ };
417
+ }
418
+ function generateExtensionManifest(projectRoot = process.cwd(), options = {}) {
419
+ const root = path6.resolve(projectRoot);
420
+ const outDir = path6.resolve(options.outDir ?? path6.join(root, "dist"));
421
+ const kind = options.kind ?? "core";
422
+ const { specs, errors } = scanForTools({
423
+ projectPath: root,
424
+ include: options.include ?? ["**/*.ts"],
425
+ tsconfigPath: options.tsconfigPath
426
+ });
427
+ if (errors.length > 0) {
428
+ console.warn("generateExtensionManifest: scan errors", errors);
429
+ }
430
+ const entries = specs.map((spec) => {
431
+ const sourcePathNoExt = (spec.sourcePath ?? "").replace(/\.(ts|tsx)$/i, "");
432
+ const coreName = `${kind}/${sourcePathNoExt.replace(/\//g, ".")}`;
433
+ const sideEffect = spec._meta?.hitl?.sideEffect ?? "none";
434
+ return {
435
+ coreName,
436
+ description: spec.description ?? sourcePathNoExt,
437
+ inputSchema: spec.inputSchema ?? { type: "object", additionalProperties: true },
438
+ outputSchema: spec.outputSchema ?? { type: "object", additionalProperties: true },
439
+ sourcePath: sourcePathNoExt,
440
+ exportName: spec.exportName ?? "",
441
+ sideEffect
442
+ };
443
+ });
444
+ if (!existsSync(outDir)) mkdirSync(outDir, { recursive: true });
445
+ const manifestPath = path6.join(outDir, "core-tools-manifest.json");
446
+ writeFileSync(
447
+ manifestPath,
448
+ JSON.stringify({ kind, tools: entries }, null, 2),
449
+ "utf-8"
450
+ );
451
+ let toolYamlCopied = 0;
452
+ const copyDirs = options.copyToolYamlDirs;
453
+ if (copyDirs?.length) {
454
+ for (const d of copyDirs) {
455
+ const srcDir = path6.join(root, d);
456
+ const destDir = path6.join(outDir, d);
457
+ if (!existsSync(srcDir)) continue;
458
+ try {
459
+ for (const e of readdirSync(srcDir, { withFileTypes: true })) {
460
+ if (e.isFile() && e.name.endsWith(".tool.yaml")) {
461
+ if (!existsSync(destDir)) mkdirSync(destDir, { recursive: true });
462
+ copyFileSync(path6.join(srcDir, e.name), path6.join(destDir, e.name));
463
+ toolYamlCopied++;
464
+ }
465
+ }
466
+ } catch {
467
+ }
468
+ }
469
+ }
470
+ return { manifestPath, toolsCount: entries.length, toolYamlCopied };
471
+ }
472
+ function generateManifest(projectRoot = process.cwd()) {
473
+ const { manifestPath, toolsCount, toolYamlCopied } = generateExtensionManifest(projectRoot, {
474
+ include: ["src/**/*.ts"],
475
+ copyToolYamlDirs: ["src"]
476
+ });
477
+ console.log(`Wrote ${toolsCount} tools to ${path6.relative(projectRoot, manifestPath)}`);
478
+ if (toolYamlCopied > 0) console.log(`Copied ${toolYamlCopied} tool.yaml file(s) to dist`);
479
+ }
480
+
382
481
  // src/api/extension/groupPrefix.ts
383
482
  function getGroupNamePrefixes(options) {
384
483
  const { groups, only, groupPrefixMap } = options;
@@ -499,6 +598,6 @@ async function registerMCPToolsFromConfig(runtime, registry, options = {}) {
499
598
  return { transport };
500
599
  }
501
600
 
502
- export { MCPClientAdapter, MCPProcessManager, connectMCP, createContextRunner, createDynamicImportAdapter, getGroupNamePrefixes, isIpInBlockedCidrs, loadExtensionManifest, loadToolYaml, mcpToolsToSpecs, registerExtension, registerMCPToolsFromConfig, registerToolsFromManifest, resolveExtensionPackageRoot, resolveSandboxedPath, validateUrl };
601
+ export { MCPClientAdapter, MCPProcessManager, connectMCP, createContextRunner, createDynamicImportAdapter, createExtension, generateExtensionManifest, generateManifest, getGroupNamePrefixes, isIpInBlockedCidrs, loadExtensionManifest, loadToolYaml, mcpToolsToSpecs, registerExtension, registerMCPToolsFromConfig, registerToolsFromManifest, resolveExtensionPackageRoot, resolveSandboxedPath, validateUrl };
503
602
  //# sourceMappingURL=index.js.map
504
603
  //# sourceMappingURL=index.js.map