@botbotgo/kit 1.0.106

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 (269) hide show
  1. package/README.md +65 -0
  2. package/config/build/build.sh +182 -0
  3. package/config/build/tsconfig.dts.json +34 -0
  4. package/config/build/tsup.config.ts +19 -0
  5. package/config/build/vitest.config.ts +29 -0
  6. package/config/tool.yaml +11 -0
  7. package/dist/agent-context.d.ts +3 -0
  8. package/dist/agent-context.d.ts.map +1 -0
  9. package/dist/api/adapters/LangChainToolsHub.d.ts +35 -0
  10. package/dist/api/adapters/LangChainToolsHub.d.ts.map +1 -0
  11. package/dist/api/createAgentTools.d.ts +52 -0
  12. package/dist/api/createAgentTools.d.ts.map +1 -0
  13. package/dist/api/expose/extension-init/index.d.ts +3 -0
  14. package/dist/api/expose/extension-init/index.d.ts.map +1 -0
  15. package/dist/api/expose/extension-init/initExtension.d.ts +21 -0
  16. package/dist/api/expose/extension-init/initExtension.d.ts.map +1 -0
  17. package/dist/api/expose/index.d.ts +16 -0
  18. package/dist/api/expose/index.d.ts.map +1 -0
  19. package/dist/api/expose/mcp-build/build.d.ts +21 -0
  20. package/dist/api/expose/mcp-build/build.d.ts.map +1 -0
  21. package/dist/api/expose/mcp-build/generator.d.ts +15 -0
  22. package/dist/api/expose/mcp-build/generator.d.ts.map +1 -0
  23. package/dist/api/expose/mcp-build/index.d.ts +8 -0
  24. package/dist/api/expose/mcp-build/index.d.ts.map +1 -0
  25. package/dist/api/expose/mcp-build/init.d.ts +17 -0
  26. package/dist/api/expose/mcp-build/init.d.ts.map +1 -0
  27. package/dist/api/expose/mcp-build/run.d.ts +17 -0
  28. package/dist/api/expose/mcp-build/run.d.ts.map +1 -0
  29. package/dist/api/expose/mcp-build/types.d.ts +25 -0
  30. package/dist/api/expose/mcp-build/types.d.ts.map +1 -0
  31. package/dist/api/expose/mcpServer.d.ts +74 -0
  32. package/dist/api/expose/mcpServer.d.ts.map +1 -0
  33. package/dist/api/expose/openapi.d.ts +23 -0
  34. package/dist/api/expose/openapi.d.ts.map +1 -0
  35. package/dist/api/expose/openapiHttp.d.ts +51 -0
  36. package/dist/api/expose/openapiHttp.d.ts.map +1 -0
  37. package/dist/api/extension/contextRunner.d.ts +10 -0
  38. package/dist/api/extension/contextRunner.d.ts.map +1 -0
  39. package/dist/api/extension/createExtension.d.ts +38 -0
  40. package/dist/api/extension/createExtension.d.ts.map +1 -0
  41. package/dist/api/extension/dynamicImportAdapter.d.ts +25 -0
  42. package/dist/api/extension/dynamicImportAdapter.d.ts.map +1 -0
  43. package/dist/api/extension/generateExtensionManifest.d.ts +29 -0
  44. package/dist/api/extension/generateExtensionManifest.d.ts.map +1 -0
  45. package/dist/api/extension/index.d.ts +23 -0
  46. package/dist/api/extension/index.d.ts.map +1 -0
  47. package/dist/api/extension/loadToolYaml.d.ts +7 -0
  48. package/dist/api/extension/loadToolYaml.d.ts.map +1 -0
  49. package/dist/api/extension/overrideWithConfig.d.ts +2 -0
  50. package/dist/api/extension/overrideWithConfig.d.ts.map +1 -0
  51. package/dist/api/extension/registerExtension.d.ts +32 -0
  52. package/dist/api/extension/registerExtension.d.ts.map +1 -0
  53. package/dist/api/extension/registerFromManifest.d.ts +43 -0
  54. package/dist/api/extension/registerFromManifest.d.ts.map +1 -0
  55. package/dist/api/extension/resolvePackageRoot.d.ts +2 -0
  56. package/dist/api/extension/resolvePackageRoot.d.ts.map +1 -0
  57. package/dist/api/extension/support/groupPrefix.d.ts +21 -0
  58. package/dist/api/extension/support/groupPrefix.d.ts.map +1 -0
  59. package/dist/api/extension/support/types.d.ts +15 -0
  60. package/dist/api/extension/support/types.d.ts.map +1 -0
  61. package/dist/api/register-tools.d.ts +17 -0
  62. package/dist/api/register-tools.d.ts.map +1 -0
  63. package/dist/api/resolveAgentSkillRoots.d.ts +7 -0
  64. package/dist/api/resolveAgentSkillRoots.d.ts.map +1 -0
  65. package/dist/api/runtimeFromConfig.d.ts +20 -0
  66. package/dist/api/runtimeFromConfig.d.ts.map +1 -0
  67. package/dist/api/runtimeFromConfig.helpers.d.ts +12 -0
  68. package/dist/api/runtimeFromConfig.helpers.d.ts.map +1 -0
  69. package/dist/api/runtimeFromConfig.types.d.ts +37 -0
  70. package/dist/api/runtimeFromConfig.types.d.ts.map +1 -0
  71. package/dist/build.cjs +30 -0
  72. package/dist/build.cjs.map +1 -0
  73. package/dist/build.d.ts +13 -0
  74. package/dist/build.d.ts.map +1 -0
  75. package/dist/build.js +5 -0
  76. package/dist/build.js.map +1 -0
  77. package/dist/canonicalCoreSchemas-PHGTNPN5.js +3 -0
  78. package/dist/canonicalCoreSchemas-PHGTNPN5.js.map +1 -0
  79. package/dist/canonicalCoreSchemas-TY7NCWCC.cjs +16 -0
  80. package/dist/canonicalCoreSchemas-TY7NCWCC.cjs.map +1 -0
  81. package/dist/chunk-4OOTCNR7.js +324 -0
  82. package/dist/chunk-4OOTCNR7.js.map +1 -0
  83. package/dist/chunk-4VKCWJHF.cjs +3043 -0
  84. package/dist/chunk-4VKCWJHF.cjs.map +1 -0
  85. package/dist/chunk-AGLGFQUW.cjs +259 -0
  86. package/dist/chunk-AGLGFQUW.cjs.map +1 -0
  87. package/dist/chunk-AZUXVVGV.cjs +1073 -0
  88. package/dist/chunk-AZUXVVGV.cjs.map +1 -0
  89. package/dist/chunk-BDUSB6GT.js +520 -0
  90. package/dist/chunk-BDUSB6GT.js.map +1 -0
  91. package/dist/chunk-BNIE2IKZ.cjs +100 -0
  92. package/dist/chunk-BNIE2IKZ.cjs.map +1 -0
  93. package/dist/chunk-BTHDNP3C.cjs +350 -0
  94. package/dist/chunk-BTHDNP3C.cjs.map +1 -0
  95. package/dist/chunk-GGFAGLDC.js +1049 -0
  96. package/dist/chunk-GGFAGLDC.js.map +1 -0
  97. package/dist/chunk-ITX6A2BT.js +92 -0
  98. package/dist/chunk-ITX6A2BT.js.map +1 -0
  99. package/dist/chunk-IVL4TBFB.js +248 -0
  100. package/dist/chunk-IVL4TBFB.js.map +1 -0
  101. package/dist/chunk-JH4ZF3FN.js +3013 -0
  102. package/dist/chunk-JH4ZF3FN.js.map +1 -0
  103. package/dist/chunk-JW4EMVTE.cjs +553 -0
  104. package/dist/chunk-JW4EMVTE.cjs.map +1 -0
  105. package/dist/chunk-NTWOVFEY.js +16 -0
  106. package/dist/chunk-NTWOVFEY.js.map +1 -0
  107. package/dist/chunk-UUNG3GL3.cjs +19 -0
  108. package/dist/chunk-UUNG3GL3.cjs.map +1 -0
  109. package/dist/core/registry/ToolRegistry.d.ts +68 -0
  110. package/dist/core/registry/ToolRegistry.d.ts.map +1 -0
  111. package/dist/core/runtime/Budget.d.ts +63 -0
  112. package/dist/core/runtime/Budget.d.ts.map +1 -0
  113. package/dist/core/runtime/Evidence.d.ts +19 -0
  114. package/dist/core/runtime/Evidence.d.ts.map +1 -0
  115. package/dist/core/runtime/PTCRuntime.d.ts +124 -0
  116. package/dist/core/runtime/PTCRuntime.d.ts.map +1 -0
  117. package/dist/core/runtime/PTCRuntimeObservability.d.ts +26 -0
  118. package/dist/core/runtime/PTCRuntimeObservability.d.ts.map +1 -0
  119. package/dist/core/runtime/PTCRuntimePipeline.d.ts +69 -0
  120. package/dist/core/runtime/PTCRuntimePipeline.d.ts.map +1 -0
  121. package/dist/core/runtime/PolicyEngine.d.ts +67 -0
  122. package/dist/core/runtime/PolicyEngine.d.ts.map +1 -0
  123. package/dist/core/runtime/Retry.d.ts +33 -0
  124. package/dist/core/runtime/Retry.d.ts.map +1 -0
  125. package/dist/core/runtime/SchemaValidator.d.ts +42 -0
  126. package/dist/core/runtime/SchemaValidator.d.ts.map +1 -0
  127. package/dist/core/runtime/toolObservation.d.ts +7 -0
  128. package/dist/core/runtime/toolObservation.d.ts.map +1 -0
  129. package/dist/core/types/Events.d.ts +99 -0
  130. package/dist/core/types/Events.d.ts.map +1 -0
  131. package/dist/core/types/ToolIntent.d.ts +40 -0
  132. package/dist/core/types/ToolIntent.d.ts.map +1 -0
  133. package/dist/core/types/ToolResult.d.ts +44 -0
  134. package/dist/core/types/ToolResult.d.ts.map +1 -0
  135. package/dist/core/types/ToolSpec.d.ts +116 -0
  136. package/dist/core/types/ToolSpec.d.ts.map +1 -0
  137. package/dist/core/types/ToolTypeHandler.d.ts +88 -0
  138. package/dist/core/types/ToolTypeHandler.d.ts.map +1 -0
  139. package/dist/core/types/index.d.ts +7 -0
  140. package/dist/core/types/index.d.ts.map +1 -0
  141. package/dist/index.cjs +399 -0
  142. package/dist/index.cjs.map +1 -0
  143. package/dist/index.d.ts +8 -0
  144. package/dist/index.d.ts.map +1 -0
  145. package/dist/index.js +394 -0
  146. package/dist/index.js.map +1 -0
  147. package/dist/observability/EventLog.d.ts +60 -0
  148. package/dist/observability/EventLog.d.ts.map +1 -0
  149. package/dist/observability/Logger.d.ts +33 -0
  150. package/dist/observability/Logger.d.ts.map +1 -0
  151. package/dist/observability/Metrics.d.ts +70 -0
  152. package/dist/observability/Metrics.d.ts.map +1 -0
  153. package/dist/observability/Tracing.d.ts +69 -0
  154. package/dist/observability/Tracing.d.ts.map +1 -0
  155. package/dist/sdk.cjs +493 -0
  156. package/dist/sdk.cjs.map +1 -0
  157. package/dist/sdk.d.ts +17 -0
  158. package/dist/sdk.d.ts.map +1 -0
  159. package/dist/sdk.js +443 -0
  160. package/dist/sdk.js.map +1 -0
  161. package/dist/security/sandbox.d.ts +10 -0
  162. package/dist/security/sandbox.d.ts.map +1 -0
  163. package/dist/security/ssrf.d.ts +24 -0
  164. package/dist/security/ssrf.d.ts.map +1 -0
  165. package/dist/templates/mcp-server.js +48 -0
  166. package/dist/templates/n8n-invoker.js +11 -0
  167. package/dist/templates/skill-invoker.js +11 -0
  168. package/dist/templates/tool-index.js +9 -0
  169. package/dist/tools/discoveryFactory.d.ts +117 -0
  170. package/dist/tools/discoveryFactory.d.ts.map +1 -0
  171. package/dist/tools/function/index.d.ts +10 -0
  172. package/dist/tools/function/index.d.ts.map +1 -0
  173. package/dist/tools/function/scanner.d.ts +29 -0
  174. package/dist/tools/function/scanner.d.ts.map +1 -0
  175. package/dist/tools/function/schemaFromTs.d.ts +16 -0
  176. package/dist/tools/function/schemaFromTs.d.ts.map +1 -0
  177. package/dist/tools/function/types.d.ts +20 -0
  178. package/dist/tools/function/types.d.ts.map +1 -0
  179. package/dist/tools/index.d.ts +13 -0
  180. package/dist/tools/index.d.ts.map +1 -0
  181. package/dist/tools/langchain/LangChainLoader.d.ts +7 -0
  182. package/dist/tools/langchain/LangChainLoader.d.ts.map +1 -0
  183. package/dist/tools/langchain/directoryApply.d.ts +5 -0
  184. package/dist/tools/langchain/directoryApply.d.ts.map +1 -0
  185. package/dist/tools/langchain/directoryLoad.d.ts +13 -0
  186. package/dist/tools/langchain/directoryLoad.d.ts.map +1 -0
  187. package/dist/tools/langchain/index.d.ts +3 -0
  188. package/dist/tools/langchain/index.d.ts.map +1 -0
  189. package/dist/tools/langchain/scanner.d.ts +8 -0
  190. package/dist/tools/langchain/scanner.d.ts.map +1 -0
  191. package/dist/tools/langchain/types.d.ts +5 -0
  192. package/dist/tools/langchain/types.d.ts.map +1 -0
  193. package/dist/tools/mcp/MCPClientAdapter.d.ts +34 -0
  194. package/dist/tools/mcp/MCPClientAdapter.d.ts.map +1 -0
  195. package/dist/tools/mcp/MCPLoader.d.ts +8 -0
  196. package/dist/tools/mcp/MCPLoader.d.ts.map +1 -0
  197. package/dist/tools/mcp/MCPProcessManager.d.ts +29 -0
  198. package/dist/tools/mcp/MCPProcessManager.d.ts.map +1 -0
  199. package/dist/tools/mcp/connectMCP.d.ts +47 -0
  200. package/dist/tools/mcp/connectMCP.d.ts.map +1 -0
  201. package/dist/tools/mcp/directoryApply.d.ts +10 -0
  202. package/dist/tools/mcp/directoryApply.d.ts.map +1 -0
  203. package/dist/tools/mcp/index.d.ts +16 -0
  204. package/dist/tools/mcp/index.d.ts.map +1 -0
  205. package/dist/tools/mcp/mcpSpecToToolSpec.d.ts +8 -0
  206. package/dist/tools/mcp/mcpSpecToToolSpec.d.ts.map +1 -0
  207. package/dist/tools/mcp/registerMCPTools.d.ts +24 -0
  208. package/dist/tools/mcp/registerMCPTools.d.ts.map +1 -0
  209. package/dist/tools/mcp/scanner.d.ts +8 -0
  210. package/dist/tools/mcp/scanner.d.ts.map +1 -0
  211. package/dist/tools/mcp/support/types.d.ts +3 -0
  212. package/dist/tools/mcp/support/types.d.ts.map +1 -0
  213. package/dist/tools/n8n/N8nLoader.d.ts +25 -0
  214. package/dist/tools/n8n/N8nLoader.d.ts.map +1 -0
  215. package/dist/tools/n8n/directoryApply.d.ts +10 -0
  216. package/dist/tools/n8n/directoryApply.d.ts.map +1 -0
  217. package/dist/tools/n8n/index.d.ts +6 -0
  218. package/dist/tools/n8n/index.d.ts.map +1 -0
  219. package/dist/tools/n8n/scanN8n.d.ts +20 -0
  220. package/dist/tools/n8n/scanN8n.d.ts.map +1 -0
  221. package/dist/tools/n8n/types.d.ts +18 -0
  222. package/dist/tools/n8n/types.d.ts.map +1 -0
  223. package/dist/tools/scanPackage.d.ts +42 -0
  224. package/dist/tools/scanPackage.d.ts.map +1 -0
  225. package/dist/tools/skill/SkillLoader.d.ts +20 -0
  226. package/dist/tools/skill/SkillLoader.d.ts.map +1 -0
  227. package/dist/tools/skill/SkillManifest.d.ts +79 -0
  228. package/dist/tools/skill/SkillManifest.d.ts.map +1 -0
  229. package/dist/tools/skill/SkillMdParser.d.ts +31 -0
  230. package/dist/tools/skill/SkillMdParser.d.ts.map +1 -0
  231. package/dist/tools/skill/directoryApply.d.ts +10 -0
  232. package/dist/tools/skill/directoryApply.d.ts.map +1 -0
  233. package/dist/tools/skill/index.d.ts +8 -0
  234. package/dist/tools/skill/index.d.ts.map +1 -0
  235. package/dist/tools/skill/scanSkill.d.ts +20 -0
  236. package/dist/tools/skill/scanSkill.d.ts.map +1 -0
  237. package/dist/tools/skill/types.d.ts +19 -0
  238. package/dist/tools/skill/types.d.ts.map +1 -0
  239. package/dist/tools/util/canonicalCoreSchemas.d.ts +15 -0
  240. package/dist/tools/util/canonicalCoreSchemas.d.ts.map +1 -0
  241. package/dist/tools/util/index.d.ts +13 -0
  242. package/dist/tools/util/index.d.ts.map +1 -0
  243. package/dist/tools/util/resolveEntry.d.ts +6 -0
  244. package/dist/tools/util/resolveEntry.d.ts.map +1 -0
  245. package/dist/tools/util/scanUtil.d.ts +9 -0
  246. package/dist/tools/util/scanUtil.d.ts.map +1 -0
  247. package/dist/tools/util/toolConfig.d.ts +38 -0
  248. package/dist/tools/util/toolConfig.d.ts.map +1 -0
  249. package/dist/tools/util/toolDescriptor.d.ts +117 -0
  250. package/dist/tools/util/toolDescriptor.d.ts.map +1 -0
  251. package/dist/utils/cli/help.d.ts +2 -0
  252. package/dist/utils/cli/help.d.ts.map +1 -0
  253. package/dist/utils/cli/index.cjs +700 -0
  254. package/dist/utils/cli/index.cjs.map +1 -0
  255. package/dist/utils/cli/index.d.ts +9 -0
  256. package/dist/utils/cli/index.d.ts.map +1 -0
  257. package/dist/utils/cli/index.js +677 -0
  258. package/dist/utils/cli/index.js.map +1 -0
  259. package/dist/utils/cli/toolRuntime.d.ts +19 -0
  260. package/dist/utils/cli/toolRuntime.d.ts.map +1 -0
  261. package/dist/utils/log.d.ts +2 -0
  262. package/dist/utils/log.d.ts.map +1 -0
  263. package/dist/utils/npmCache.d.ts +11 -0
  264. package/dist/utils/npmCache.d.ts.map +1 -0
  265. package/dist/utils/npmVersion.d.ts +10 -0
  266. package/dist/utils/npmVersion.d.ts.map +1 -0
  267. package/dist/utils/overrideWithConfig.d.ts +2 -0
  268. package/dist/utils/overrideWithConfig.d.ts.map +1 -0
  269. package/package.json +125 -0
@@ -0,0 +1,100 @@
1
+ 'use strict';
2
+
3
+ var chunkJW4EMVTE_cjs = require('./chunk-JW4EMVTE.cjs');
4
+ var fs = require('fs');
5
+ var path = require('path');
6
+ var config = require('@botbotgo/common/config');
7
+
8
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
9
+
10
+ var path__default = /*#__PURE__*/_interopDefault(path);
11
+
12
+ function loadToolYaml(packageRoot, sourcePath) {
13
+ const dir = path__default.default.dirname(sourcePath);
14
+ const base = path__default.default.basename(sourcePath);
15
+ const dirPath = path__default.default.join(packageRoot, dir);
16
+ const yamlPath = fs.existsSync(path__default.default.join(dirPath, `${base}.tool.yaml`)) ? path__default.default.join(dirPath, `${base}.tool.yaml`) : path__default.default.join(dirPath, `${base}.example.yaml`);
17
+ if (!fs.existsSync(yamlPath)) return void 0;
18
+ try {
19
+ const raw = fs.readFileSync(yamlPath, "utf-8");
20
+ const data = config.parseYamlContent(raw, { substituteEnv: false });
21
+ if (data == null || typeof data !== "object" || Array.isArray(data)) return void 0;
22
+ const obj = data;
23
+ const toolBlock = obj?.tool;
24
+ const arr = toolBlock?.list;
25
+ if (!Array.isArray(arr)) return void 0;
26
+ const defaults = toolBlock?.defaults != null && typeof toolBlock.defaults === "object" && !Array.isArray(toolBlock.defaults) ? toolBlock.defaults : {};
27
+ const item = arr.find(
28
+ (e) => e != null && typeof e === "object" && e.name === base
29
+ );
30
+ if (!item || typeof item !== "object") return void 0;
31
+ const { name: _n, ...rest } = item;
32
+ const merged = { ...defaults, ...rest };
33
+ if (Object.keys(merged).length === 0) return void 0;
34
+ return merged;
35
+ } catch {
36
+ return void 0;
37
+ }
38
+ }
39
+ function loadExtensionManifest(manifestPathOrDir) {
40
+ const p = path__default.default.resolve(manifestPathOrDir);
41
+ let manifestPath;
42
+ if (fs.existsSync(p) && fs.statSync(p).isFile()) {
43
+ manifestPath = p;
44
+ } else {
45
+ const inDir = path__default.default.join(p, "core-tools-manifest.json");
46
+ const inDist = path__default.default.join(p, "dist", "core-tools-manifest.json");
47
+ manifestPath = fs.existsSync(inDir) ? inDir : inDist;
48
+ }
49
+ const raw = fs.readFileSync(manifestPath, "utf-8");
50
+ const parsed = JSON.parse(raw);
51
+ if (Array.isArray(parsed)) {
52
+ return { entries: parsed };
53
+ }
54
+ return { kind: parsed.kind, entries: parsed.tools ?? [] };
55
+ }
56
+ function registerToolsFromManifest(registry, options) {
57
+ const { manifestPathOrDir, kind: kindOpt, only, namePrefixes, packageRoot } = options;
58
+ const loaded = loadExtensionManifest(manifestPathOrDir);
59
+ const kind = kindOpt ?? loaded.kind ?? "extension";
60
+ const entries = loaded.entries;
61
+ const onlySet = only?.length ? new Set(only) : null;
62
+ const registered = [];
63
+ for (const entry of entries) {
64
+ const toolName = entry.name ?? (entry.coreName != null ? entry.coreName.replace(/^[^/]+\//, "").replace(/^src\./, "") : entry.sourcePath.replace(/^src\//, "").replace(/\//g, "."));
65
+ let spec = chunkJW4EMVTE_cjs.createToolSpec({
66
+ name: toolName,
67
+ kind,
68
+ description: entry.description,
69
+ inputSchema: entry.inputSchema,
70
+ outputSchema: entry.outputSchema,
71
+ capabilities: [],
72
+ sideEffect: entry.sideEffect
73
+ });
74
+ if (onlySet && !onlySet.has(spec.name)) continue;
75
+ if (namePrefixes?.length && !namePrefixes.some((prefix) => spec.name.startsWith(prefix))) {
76
+ continue;
77
+ }
78
+ const defaultArgs = packageRoot != null ? loadToolYaml(packageRoot, entry.sourcePath) : void 0;
79
+ spec = {
80
+ ...spec,
81
+ _meta: {
82
+ ...spec._meta,
83
+ sourcePath: entry.sourcePath,
84
+ exportName: entry.exportName,
85
+ shortName: toolName,
86
+ ...packageRoot != null && { packageRoot },
87
+ ...defaultArgs != null && Object.keys(defaultArgs).length > 0 && { defaultArgs }
88
+ }
89
+ };
90
+ registry.register(spec);
91
+ registered.push(spec);
92
+ }
93
+ return registered;
94
+ }
95
+
96
+ exports.loadExtensionManifest = loadExtensionManifest;
97
+ exports.loadToolYaml = loadToolYaml;
98
+ exports.registerToolsFromManifest = registerToolsFromManifest;
99
+ //# sourceMappingURL=chunk-BNIE2IKZ.cjs.map
100
+ //# sourceMappingURL=chunk-BNIE2IKZ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/api/extension/loadToolYaml.ts","../src/api/extension/registerFromManifest.ts"],"names":["path","existsSync","readFileSync","parseYamlContent","statSync","createToolSpec"],"mappings":"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","file":"chunk-BNIE2IKZ.cjs","sourcesContent":["/**\n * Load per-tool default args/config from <base>.tool.yaml (framework-defined format).\n *\n * Supported YAML format:\n * tool:\n * defaults: # optional; same level as list; merged into every tool's defaultArgs\n * sandboxRoot: \"\"\n * maxBytes: 5242880\n * list:\n * - name: fetchText\n * timeoutMs: 5000\n * maxBytes: 1048576\n * (find item where name === tool base name; result = { ...defaults, ...item } minus name)\n */\nimport { readFileSync, existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { parseYamlContent } from \"@botbotgo/common/config\";\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 * If tool.defaults exists (same level as tool.list), it is merged first; list item fields override.\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 dirPath = path.join(packageRoot, dir);\n const yamlPath = existsSync(path.join(dirPath, `${base}.tool.yaml`))\n ? path.join(dirPath, `${base}.tool.yaml`)\n : path.join(dirPath, `${base}.example.yaml`);\n if (!existsSync(yamlPath)) return undefined;\n try {\n const raw = readFileSync(yamlPath, \"utf-8\");\n const data = parseYamlContent<unknown>(raw, { substituteEnv: false });\n if (data == null || typeof data !== \"object\" || Array.isArray(data)) return undefined;\n const obj = data as Record<string, unknown>;\n const toolBlock = obj?.tool as Record<string, unknown> | undefined;\n const arr = toolBlock?.list;\n if (!Array.isArray(arr)) return undefined;\n const defaults =\n toolBlock?.defaults != null &&\n typeof toolBlock.defaults === \"object\" &&\n !Array.isArray(toolBlock.defaults)\n ? (toolBlock.defaults as Record<string, unknown>)\n : {};\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 const merged = { ...defaults, ...rest };\n if (Object.keys(merged).length === 0) return undefined;\n return merged;\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 /** Tool name (e.g. \"exec.runCommand\"). Legacy manifests may have coreName instead. */\n name?: string;\n /** @deprecated Use name instead. Legacy: e.g. \"core/src.exec.runCommand\". */\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 const toolName =\n entry.name ??\n (entry.coreName != null\n ? entry.coreName.replace(/^[^/]+\\//, \"\").replace(/^src\\./, \"\")\n : entry.sourcePath.replace(/^src\\//, \"\").replace(/\\//g, \".\"));\n let spec = createToolSpec({\n name: toolName,\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 shortName: toolName,\n ...(packageRoot != null && { packageRoot }),\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"]}
@@ -0,0 +1,350 @@
1
+ 'use strict';
2
+
3
+ var chunkAZUXVVGV_cjs = require('./chunk-AZUXVVGV.cjs');
4
+ var chunkJW4EMVTE_cjs = require('./chunk-JW4EMVTE.cjs');
5
+ var fs2 = require('fs/promises');
6
+ var path3 = require('path');
7
+ var url = require('url');
8
+ var child_process = require('child_process');
9
+
10
+ var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
11
+ function _interopNamespace(e) {
12
+ if (e && e.__esModule) return e;
13
+ var n = Object.create(null);
14
+ if (e) {
15
+ Object.keys(e).forEach(function (k) {
16
+ if (k !== 'default') {
17
+ var d = Object.getOwnPropertyDescriptor(e, k);
18
+ Object.defineProperty(n, k, d.get ? d : {
19
+ enumerable: true,
20
+ get: function () { return e[k]; }
21
+ });
22
+ }
23
+ });
24
+ }
25
+ n.default = e;
26
+ return Object.freeze(n);
27
+ }
28
+
29
+ var fs2__namespace = /*#__PURE__*/_interopNamespace(fs2);
30
+ var path3__namespace = /*#__PURE__*/_interopNamespace(path3);
31
+
32
+ var TEMPLATES = {
33
+ "package.json": `{
34
+ "name": "my-mcp-tools",
35
+ "version": "1.0.0",
36
+ "private": true,
37
+ "type": "module",
38
+ "scripts": {
39
+ "build": "node build.mjs",
40
+ "start": "node start.mjs"
41
+ },
42
+ "devDependencies": {
43
+ "@botbotgo/kit": "latest"
44
+ }
45
+ }
46
+ `,
47
+ "build.mjs": `import { buildMCPPackage } from "@botbotgo/kit/build";
48
+
49
+ const result = await buildMCPPackage({ outDir: "dist" });
50
+ console.log("Built", result.toolCount, "tool(s) ->", result.outDir);
51
+ `,
52
+ "start.mjs": `import { runMCPServer } from "@botbotgo/kit/build";
53
+
54
+ const { process: child } = await runMCPServer({ path: "./dist" });
55
+ child.stdin?.pipe(process.stdin);
56
+ child.stdout?.pipe(process.stdout);
57
+ child.stderr?.pipe(process.stderr);
58
+ process.stdin?.ref();
59
+ child.on("close", (code) => process.exit(code ?? 0));
60
+ `,
61
+ "tsconfig.json": `{
62
+ "compilerOptions": {
63
+ "target": "ES2022",
64
+ "module": "ESNext",
65
+ "strict": true,
66
+ "skipLibCheck": true,
67
+ "noEmit": true
68
+ },
69
+ "include": ["src/**/*.ts"]
70
+ }
71
+ `,
72
+ "src/tools/example.ts": `/**
73
+ * Add two numbers.
74
+ * @tool
75
+ */
76
+ export async function add(a: number, b: number): Promise<number> {
77
+ return a + b;
78
+ }
79
+ `,
80
+ "skills/hello-skill/SKILL.md": `---
81
+ name: hello-skill
82
+ description: Say hello with a name.
83
+ ---
84
+
85
+ # Hello Skill
86
+
87
+ Returns a greeting for the given name.
88
+ `,
89
+ "skills/hello-skill/handler.js": `export default async function handler(args, ctx) {
90
+ const name = args?.name ?? "World";
91
+ return { message: \`Hello, \${name}!\` };
92
+ }
93
+ `,
94
+ "README.md": `# MCP Tool Project
95
+
96
+ Scaffolded by \`agent-tool init\`. Workflow:
97
+
98
+ 1. **init** \u2014 create project template (you are here)
99
+ 2. **npm install** \u2014 install dependencies
100
+ 3. **npm run build** \u2014 generate MCP package under \`dist/\`
101
+ 4. **npm start** \u2014 start the MCP server for testing
102
+
103
+ ## Quick start
104
+
105
+ \`\`\`bash
106
+ npm install
107
+ npm run build
108
+ npm start
109
+ \`\`\`
110
+
111
+ Edit \`src/tools/*.ts\` (add \`@tool\` JSDoc) and/or \`skills/*/SKILL.md\`, then \`npm run build\` again.
112
+ `
113
+ };
114
+ async function initProject(options = {}) {
115
+ const targetPath = path3__namespace.resolve(options.targetPath ?? process.cwd());
116
+ const filesCreated = [];
117
+ await fs2__namespace.mkdir(targetPath, { recursive: true });
118
+ for (const [relPath, content] of Object.entries(TEMPLATES)) {
119
+ const fullPath = path3__namespace.join(targetPath, relPath);
120
+ await fs2__namespace.mkdir(path3__namespace.dirname(fullPath), { recursive: true });
121
+ try {
122
+ await fs2__namespace.access(fullPath);
123
+ if (relPath === "package.json") continue;
124
+ } catch {
125
+ }
126
+ await fs2__namespace.writeFile(fullPath, content, "utf8");
127
+ filesCreated.push(relPath);
128
+ }
129
+ return { targetPath, filesCreated };
130
+ }
131
+ async function scanForAllTools(projectPath, options = {}) {
132
+ const include = options.include ?? ["**/*.ts"];
133
+ const tsconfigPath = options.tsconfigPath;
134
+ const includeN8n = options.includeN8n === true;
135
+ const opts = { include, tsconfigPath };
136
+ const results = await Promise.all([
137
+ chunkAZUXVVGV_cjs.discoverTools("function", projectPath, opts),
138
+ chunkAZUXVVGV_cjs.discoverTools("skill", projectPath, opts),
139
+ ...includeN8n ? [chunkAZUXVVGV_cjs.discoverTools("n8n", projectPath, opts)] : []
140
+ ]);
141
+ const specs = results.flatMap((r) => r.specs);
142
+ const errors = results.flatMap((r) => r.errors);
143
+ const warnings = results.flatMap((r) => r.warnings ?? []);
144
+ return { specs, errors, warnings };
145
+ }
146
+ var __dirname$1 = path3__namespace.dirname(url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('chunk-BTHDNP3C.cjs', document.baseURI).href))));
147
+ async function loadTemplate(name) {
148
+ for (const dir of [
149
+ path3__namespace.join(__dirname$1, "templates"),
150
+ path3__namespace.join(__dirname$1, "..", "templates")
151
+ ]) {
152
+ try {
153
+ return await fs2__namespace.readFile(path3__namespace.join(dir, name), "utf-8");
154
+ } catch {
155
+ continue;
156
+ }
157
+ }
158
+ throw new Error(`Template not found: ${name}. Tried templates/ next to generator and ../templates.`);
159
+ }
160
+ var TEMPLATE_NAMES = {
161
+ mcpServer: "mcp-server.js",
162
+ toolIndex: "tool-index.js",
163
+ skillInvoker: "skill-invoker.js",
164
+ n8nInvoker: "n8n-invoker.js"
165
+ };
166
+ function buildToolIndexCases(specs, fromGeneratedToProject) {
167
+ return specs.map((s) => {
168
+ const modPath = path3__namespace.join(fromGeneratedToProject, s._meta.sourcePath).replace(/\\/g, "/");
169
+ return ` case "${s.name}": return (await import("${modPath}")).${s._meta.exportName};`;
170
+ }).join("\n");
171
+ }
172
+ function buildSkillInvokerCases(specs, fromGeneratedToProject) {
173
+ return specs.map((s) => {
174
+ const handlerPath = path3__namespace.join(fromGeneratedToProject, s._meta.sourcePath, "handler").replace(/\\/g, "/");
175
+ const descEscaped = (s.description ?? "").replace(/"/g, '\\"');
176
+ return ` case "${s.name}": {
177
+ const mod = await import("${handlerPath}.js")
178
+ .catch(() => import("${handlerPath}.mjs"))
179
+ .catch(() => null);
180
+ if (!mod) return { result: null, error: "No handler" };
181
+ const fn = mod.default ?? mod.handler;
182
+ if (typeof fn !== "function") return { result: null, error: "No handler" };
183
+ const ctx = { requestId: "mcp", taskId: "mcp", skill: { name: "${s.name}", description: "${descEscaped}", instructions: "", resources: [], readResource: async () => "", getResourcesByType: () => [], dirPath: "" } };
184
+ const out = await fn(args, ctx);
185
+ return out?.result !== undefined ? out.result : out;
186
+ }`;
187
+ }).join("\n");
188
+ }
189
+ function buildN8nInvokerCases(specs) {
190
+ return specs.map((s) => {
191
+ const webhookUrl = s.endpoint;
192
+ const url = webhookUrl ? `"${webhookUrl}"` : "process.env.N8N_WEBHOOK_" + s.name.replace(/[^a-zA-Z0-9]/g, "_").toUpperCase() + " ?? null";
193
+ return ` case "${s.name}": {
194
+ const url = ${url};
195
+ if (!url) throw new Error("n8n webhook not configured for ${s.name}. Set N8N_WEBHOOK_* or add webhook to workflow.");
196
+ const res = await fetch(url, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(args) });
197
+ if (!res.ok) throw new Error("n8n request failed: " + res.status);
198
+ return res.json().catch(() => ({}));
199
+ }`;
200
+ }).join("\n");
201
+ }
202
+ async function generate(options) {
203
+ const { specs, outDir, projectPath } = options;
204
+ await fs2__namespace.mkdir(outDir, { recursive: true });
205
+ const functionSpecs = specs.filter(
206
+ (s) => s.kind === chunkJW4EMVTE_cjs.FUNCTION_KIND && s._meta?.sourcePath != null && s._meta?.exportName != null
207
+ );
208
+ const skillSpecs = specs.filter(
209
+ (s) => s.kind === chunkJW4EMVTE_cjs.SKILL_KIND && s._meta?.sourcePath != null
210
+ );
211
+ const n8nSpecs = specs.filter((s) => s.kind === chunkJW4EMVTE_cjs.N8N_KIND);
212
+ const toolSpecsJson = specs.map((s) => ({
213
+ kind: s.kind,
214
+ name: s.name,
215
+ description: s.description,
216
+ inputSchema: s.inputSchema,
217
+ ...s.kind === chunkJW4EMVTE_cjs.FUNCTION_KIND && s._meta?.sourcePath != null && s._meta?.exportName != null && {
218
+ outputSchema: s.outputSchema ?? { type: "object", additionalProperties: true },
219
+ sourcePath: s._meta.sourcePath,
220
+ exportName: s._meta.exportName
221
+ },
222
+ _meta: s._meta,
223
+ ...s.kind === chunkJW4EMVTE_cjs.SKILL_KIND && s._meta?.sourcePath != null && { sourcePath: s._meta.sourcePath },
224
+ ...s.kind === chunkJW4EMVTE_cjs.N8N_KIND && {
225
+ sourcePath: s._meta?.sourcePath,
226
+ webhookUrl: s.endpoint
227
+ }
228
+ }));
229
+ await fs2__namespace.writeFile(
230
+ path3__namespace.join(outDir, "tool-specs.json"),
231
+ JSON.stringify(toolSpecsJson, null, 2),
232
+ "utf-8"
233
+ );
234
+ const configJson = { projectPath: path3__namespace.resolve(projectPath) };
235
+ await fs2__namespace.writeFile(path3__namespace.join(outDir, "config.json"), JSON.stringify(configJson, null, 2), "utf-8");
236
+ const rel = path3__namespace.relative(outDir, projectPath) || ".";
237
+ const fromGeneratedToProject = rel.split(path3__namespace.sep).length ? rel : ".";
238
+ const [mcpServerTemplate, toolIndexTemplate, skillInvokerTemplate, n8nInvokerTemplate] = await Promise.all([
239
+ loadTemplate(TEMPLATE_NAMES.mcpServer),
240
+ loadTemplate(TEMPLATE_NAMES.toolIndex),
241
+ loadTemplate(TEMPLATE_NAMES.skillInvoker),
242
+ loadTemplate(TEMPLATE_NAMES.n8nInvoker)
243
+ ]);
244
+ const toolIndexTs = toolIndexTemplate.replace("{{CASES}}", buildToolIndexCases(functionSpecs, fromGeneratedToProject));
245
+ await fs2__namespace.writeFile(path3__namespace.join(outDir, "tool-index.ts"), toolIndexTs, "utf-8");
246
+ const skillCases = buildSkillInvokerCases(skillSpecs, fromGeneratedToProject);
247
+ const skillDefaultCase = skillSpecs.length === 0 ? "default: throw new Error('Unknown skill: ' + name);" : 'default: throw new Error("Unknown skill: " + name);';
248
+ const skillInvokerTs = skillInvokerTemplate.replace("{{CASES}}", skillCases).replace("{{DEFAULT_CASE}}", skillDefaultCase);
249
+ await fs2__namespace.writeFile(path3__namespace.join(outDir, "skill-invoker.ts"), skillInvokerTs, "utf-8");
250
+ const n8nCases = buildN8nInvokerCases(n8nSpecs);
251
+ const n8nDefaultCase = n8nSpecs.length === 0 ? "default: throw new Error('Unknown n8n tool: ' + name);" : 'default: throw new Error("Unknown n8n tool: " + name);';
252
+ const n8nInvokerTs = n8nInvokerTemplate.replace("{{CASES}}", n8nCases).replace("{{DEFAULT_CASE}}", n8nDefaultCase);
253
+ await fs2__namespace.writeFile(path3__namespace.join(outDir, "n8n-invoker.ts"), n8nInvokerTs, "utf-8");
254
+ await fs2__namespace.writeFile(path3__namespace.join(outDir, "mcp-server.ts"), mcpServerTemplate, "utf-8");
255
+ const mcpJson = {
256
+ command: "npx",
257
+ args: ["-y", "tsx", path3__namespace.join(outDir, "mcp-server.ts")]
258
+ };
259
+ await fs2__namespace.writeFile(path3__namespace.join(outDir, "mcp.json"), JSON.stringify(mcpJson, null, 2), "utf-8");
260
+ const packageJson = {
261
+ name: "function-tools-mcp",
262
+ version: "1.0.0",
263
+ type: "module",
264
+ description: "MCP server generated from @tool functions, SKILL.md, and workflow.json",
265
+ main: "mcp-server.ts",
266
+ scripts: { start: "npx tsx mcp-server.ts" },
267
+ dependencies: {
268
+ "@modelcontextprotocol/sdk": "^1.25.3",
269
+ typescript: ">=5.0.0",
270
+ tsx: ">=4.0.0"
271
+ }
272
+ };
273
+ await fs2__namespace.writeFile(path3__namespace.join(outDir, "package.json"), JSON.stringify(packageJson, null, 2), "utf-8");
274
+ return {
275
+ entryPath: path3__namespace.join(outDir, "mcp-server.ts"),
276
+ mcpJsonPath: path3__namespace.join(outDir, "mcp.json")
277
+ };
278
+ }
279
+
280
+ // src/api/expose/mcp-build/build.ts
281
+ async function buildMCPPackage(options = {}) {
282
+ const projectPath = path3__namespace.resolve(options.projectPath ?? process.cwd());
283
+ const outDir = path3__namespace.resolve(projectPath, options.outDir ?? "dist");
284
+ const include = options.include ?? ["**/*.ts"];
285
+ const tsconfigPath = options.tsconfigPath;
286
+ const scanResult = await scanForAllTools(projectPath, {
287
+ include,
288
+ tsconfigPath,
289
+ includeN8n: options.includeN8n
290
+ });
291
+ if (scanResult.errors.length > 0) {
292
+ const msg = scanResult.errors.map((e) => `${e.file}: ${e.message}`).join("; ");
293
+ throw new Error(`Scan failed: ${msg}`);
294
+ }
295
+ const allSpecs = scanResult.specs;
296
+ if (allSpecs.length === 0) {
297
+ throw new Error(
298
+ "No tools found. Add @tool functions (JSDoc), SKILL.md directories, or workflow.json directories."
299
+ );
300
+ }
301
+ const { entryPath, mcpJsonPath } = await generate({
302
+ specs: allSpecs,
303
+ outDir,
304
+ projectPath
305
+ });
306
+ return {
307
+ outDir,
308
+ toolCount: allSpecs.length,
309
+ entryPath,
310
+ mcpJsonPath
311
+ };
312
+ }
313
+ async function runMCPServer(options = {}) {
314
+ const base = options.path ?? process.cwd();
315
+ const candidates = [
316
+ path3__namespace.join(base, "mcp-server.ts"),
317
+ path3__namespace.join(base, "mcp-server.js"),
318
+ path3__namespace.join(base, "dist", "mcp-server.ts"),
319
+ path3__namespace.join(base, "dist", "mcp-server.js"),
320
+ path3__namespace.join(base, "generated", "mcp-server.ts"),
321
+ path3__namespace.join(base, "generated", "mcp-server.js")
322
+ ];
323
+ let entry = "";
324
+ for (const p of candidates) {
325
+ try {
326
+ await fs2__namespace.access(p);
327
+ entry = p;
328
+ break;
329
+ } catch {
330
+ }
331
+ }
332
+ if (!entry) {
333
+ throw new Error(
334
+ `MCP entrypoint not found. Run "agent-tool build" first, or pass --path to a directory containing mcp-server.ts. Tried: ${candidates.join(", ")}`
335
+ );
336
+ }
337
+ const dir = path3__namespace.dirname(entry);
338
+ const child = child_process.spawn("npx", ["-y", "tsx", path3__namespace.basename(entry)], {
339
+ cwd: dir,
340
+ stdio: ["pipe", "pipe", "inherit"],
341
+ shell: false
342
+ });
343
+ return { process: child };
344
+ }
345
+
346
+ exports.buildMCPPackage = buildMCPPackage;
347
+ exports.initProject = initProject;
348
+ exports.runMCPServer = runMCPServer;
349
+ //# sourceMappingURL=chunk-BTHDNP3C.cjs.map
350
+ //# sourceMappingURL=chunk-BTHDNP3C.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/api/expose/mcp-build/init.ts","../src/tools/scanPackage.ts","../src/api/expose/mcp-build/generator.ts","../src/api/expose/mcp-build/build.ts","../src/api/expose/mcp-build/run.ts"],"names":["path","fs","discoverTools","__dirname","path3","fileURLToPath","fs2","FUNCTION_KIND","SKILL_KIND","N8N_KIND","path4","path5","fs3","spawn"],"mappings":"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","file":"chunk-BTHDNP3C.cjs","sourcesContent":["/**\n * Scaffold a new MCP tool project: @tool TS, SKILL sample, tsconfig, README.\n * Use: init → build → run.\n */\n\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\n\nexport interface InitOptions {\n /** Target directory to create project (default: cwd). */\n targetPath?: string;\n}\n\nconst TEMPLATES = {\n \"package.json\": `{\n \"name\": \"my-mcp-tools\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"type\": \"module\",\n \"scripts\": {\n \"build\": \"node build.mjs\",\n \"start\": \"node start.mjs\"\n },\n \"devDependencies\": {\n \"@botbotgo/kit\": \"latest\"\n }\n}\n`,\n \"build.mjs\": `import { buildMCPPackage } from \"@botbotgo/kit/build\";\n\nconst result = await buildMCPPackage({ outDir: \"dist\" });\nconsole.log(\"Built\", result.toolCount, \"tool(s) ->\", result.outDir);\n`,\n \"start.mjs\": `import { runMCPServer } from \"@botbotgo/kit/build\";\n\nconst { process: child } = await runMCPServer({ path: \"./dist\" });\nchild.stdin?.pipe(process.stdin);\nchild.stdout?.pipe(process.stdout);\nchild.stderr?.pipe(process.stderr);\nprocess.stdin?.ref();\nchild.on(\"close\", (code) => process.exit(code ?? 0));\n`,\n \"tsconfig.json\": `{\n \"compilerOptions\": {\n \"target\": \"ES2022\",\n \"module\": \"ESNext\",\n \"strict\": true,\n \"skipLibCheck\": true,\n \"noEmit\": true\n },\n \"include\": [\"src/**/*.ts\"]\n}\n`,\n \"src/tools/example.ts\": `/**\n * Add two numbers.\n * @tool\n */\nexport async function add(a: number, b: number): Promise<number> {\n return a + b;\n}\n`,\n \"skills/hello-skill/SKILL.md\": `---\nname: hello-skill\ndescription: Say hello with a name.\n---\n\n# Hello Skill\n\nReturns a greeting for the given name.\n`,\n \"skills/hello-skill/handler.js\": `export default async function handler(args, ctx) {\n const name = args?.name ?? \"World\";\n return { message: \\`Hello, \\${name}!\\` };\n}\n`,\n \"README.md\": `# MCP Tool Project\n\nScaffolded by \\`agent-tool init\\`. Workflow:\n\n1. **init** — create project template (you are here)\n2. **npm install** — install dependencies\n3. **npm run build** — generate MCP package under \\`dist/\\`\n4. **npm start** — start the MCP server for testing\n\n## Quick start\n\n\\`\\`\\`bash\nnpm install\nnpm run build\nnpm start\n\\`\\`\\`\n\nEdit \\`src/tools/*.ts\\` (add \\`@tool\\` JSDoc) and/or \\`skills/*/SKILL.md\\`, then \\`npm run build\\` again.\n`,\n};\n\n/**\n * Create project template at targetPath. Writes tsconfig, src/tools/example.ts,\n * skills/hello-skill (SKILL.md + handler.js), and README.\n */\nexport async function initProject(options: InitOptions = {}): Promise<{ targetPath: string; filesCreated: string[] }> {\n const targetPath = path.resolve(options.targetPath ?? process.cwd());\n const filesCreated: string[] = [];\n\n await fs.mkdir(targetPath, { recursive: true });\n\n for (const [relPath, content] of Object.entries(TEMPLATES)) {\n const fullPath = path.join(targetPath, relPath);\n await fs.mkdir(path.dirname(fullPath), { recursive: true });\n try {\n await fs.access(fullPath);\n if (relPath === \"package.json\") continue; // skip so we don't overwrite existing\n } catch {\n // file doesn't exist, write it\n }\n await fs.writeFile(fullPath, content, \"utf8\");\n filesCreated.push(relPath);\n }\n\n return { targetPath, filesCreated };\n}\n","/**\n * Scan package for tools: scanForAllTools, scanPackageForTools, registerPackageTools.\n * Aggregates function/skill/n8n discovery and optional directory discovery.\n */\n\nimport * as path from \"node:path\";\nimport type { ToolSpec } from \"../core/types/ToolSpec.js\";\nimport {\n discoverTools,\n DirectoryScanner,\n type DiscoverToolsOptions,\n} from \"./discoveryFactory.js\";\n\nexport interface ScanAllToolsResult {\n specs: ToolSpec[];\n errors: Array<{ file: string; message: string }>;\n warnings: Array<{ file: string; message: string }>;\n}\n\nexport interface ScanAllToolsOptions {\n include?: string[];\n tsconfigPath?: string;\n includeN8n?: boolean;\n}\n\nexport async function scanForAllTools(\n projectPath: string,\n options: ScanAllToolsOptions = {},\n): Promise<ScanAllToolsResult> {\n const include = options.include ?? [\"**/*.ts\"];\n const tsconfigPath = options.tsconfigPath;\n const includeN8n = options.includeN8n === true;\n const opts: DiscoverToolsOptions = { include, tsconfigPath };\n\n const results = await Promise.all([\n discoverTools(\"function\", projectPath, opts),\n discoverTools(\"skill\", projectPath, opts),\n ...(includeN8n ? [discoverTools(\"n8n\", projectPath, opts)] : []),\n ]);\n const specs = results.flatMap((r) => r.specs);\n const errors = results.flatMap((r) => r.errors);\n const warnings = results.flatMap((r) => r.warnings ?? []);\n\n return { specs, errors, warnings };\n}\n\nexport interface ScanPackageResult {\n specs: ToolSpec[];\n errors: Array<{ file: string; message: string }>;\n warnings: Array<{ file: string; message: string }>;\n}\n\nexport interface ScanPackageOptions extends ScanAllToolsOptions {\n includeDirectoryDiscovery?: boolean;\n namespace?: string;\n}\n\nexport async function scanPackageForTools(\n packagePath: string,\n options: ScanPackageOptions = {},\n): Promise<ScanPackageResult> {\n const root = path.resolve(packagePath);\n const includeDirectoryDiscovery = options.includeDirectoryDiscovery !== false;\n const namespace = options.namespace ?? \"pkg\";\n\n const errors: Array<{ file: string; message: string }> = [];\n const warnings: Array<{ file: string; message: string }> = [];\n\n const scanResult = await scanForAllTools(root, {\n include: options.include,\n tsconfigPath: options.tsconfigPath,\n includeN8n: options.includeN8n,\n });\n errors.push(...scanResult.errors);\n warnings.push(...scanResult.warnings);\n\n let dirSpecs: ToolSpec[] = [];\n if (includeDirectoryDiscovery) {\n const scanner = new DirectoryScanner({\n roots: [root],\n namespace,\n onError: (dir, err) => errors.push({ file: dir, message: err.message }),\n });\n try {\n dirSpecs = await scanner.scan();\n } catch (err) {\n errors.push({\n file: root,\n message: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n const byName = new Map<string, ToolSpec>();\n for (const spec of dirSpecs) byName.set(spec.name, spec);\n for (const spec of scanResult.specs) {\n if (!byName.has(spec.name)) byName.set(spec.name, spec);\n }\n\n return { specs: Array.from(byName.values()), errors, warnings };\n}\n\nexport async function registerPackageTools(\n registry: { bulkRegister: (specs: ToolSpec[]) => void },\n packagePath: string,\n options: ScanPackageOptions = {},\n): Promise<ScanPackageResult> {\n const result = await scanPackageForTools(packagePath, options);\n if (result.specs.length > 0) registry.bulkRegister(result.specs);\n return result;\n}\n","/**\n * Generate MCP server entrypoint, tool-specs.json, invokers for function/skill/n8n.\n * Accepts unified ToolSpec[] (reads _meta.sourcePath/exportName, endpoint for codegen).\n */\n\nimport * as path from \"node:path\";\nimport * as fs from \"node:fs/promises\";\nimport { fileURLToPath } from \"node:url\";\nimport type { ToolSpec } from \"../../../core/types/ToolSpec.js\";\nimport { FUNCTION_KIND } from \"../../../tools/function/types.js\";\nimport { SKILL_KIND } from \"../../../tools/skill/types.js\";\nimport { N8N_KIND } from \"../../../tools/n8n/types.js\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\n/** Function spec with required codegen fields (from ToolSpec._meta). */\ninterface FunctionSpecForCodegen extends ToolSpec {\n kind: \"function\";\n _meta: { sourcePath: string; exportName: string; projectPath?: string };\n}\n\n/** Skill spec with required codegen fields. */\ninterface SkillSpecForCodegen extends ToolSpec {\n kind: \"skill\";\n _meta: { sourcePath: string; projectPath?: string };\n}\n\n/** N8n spec with endpoint (webhook URL) and _meta.sourcePath. */\ninterface N8nSpecForCodegen extends ToolSpec {\n kind: \"n8n\";\n endpoint?: string;\n _meta?: { sourcePath?: string };\n}\n\nasync function loadTemplate(name: string): Promise<string> {\n for (const dir of [\n path.join(__dirname, \"templates\"),\n path.join(__dirname, \"..\", \"templates\"),\n ]) {\n try {\n return await fs.readFile(path.join(dir, name), \"utf-8\");\n } catch {\n continue;\n }\n }\n throw new Error(`Template not found: ${name}. Tried templates/ next to generator and ../templates.`);\n}\n\nconst TEMPLATE_NAMES = {\n mcpServer: \"mcp-server.js\",\n toolIndex: \"tool-index.js\",\n skillInvoker: \"skill-invoker.js\",\n n8nInvoker: \"n8n-invoker.js\",\n} as const;\n\nfunction buildToolIndexCases(specs: FunctionSpecForCodegen[], fromGeneratedToProject: string): string {\n return specs\n .map((s) => {\n const modPath = path.join(fromGeneratedToProject, s._meta.sourcePath).replace(/\\\\/g, \"/\");\n return ` case \"${s.name}\": return (await import(\"${modPath}\")).${s._meta.exportName};`;\n })\n .join(\"\\n\");\n}\n\nfunction buildSkillInvokerCases(specs: SkillSpecForCodegen[], fromGeneratedToProject: string): string {\n return specs\n .map((s) => {\n const handlerPath = path.join(fromGeneratedToProject, s._meta.sourcePath, \"handler\").replace(/\\\\/g, \"/\");\n const descEscaped = (s.description ?? \"\").replace(/\"/g, '\\\\\"');\n return ` case \"${s.name}\": {\n const mod = await import(\"${handlerPath}.js\")\n .catch(() => import(\"${handlerPath}.mjs\"))\n .catch(() => null);\n if (!mod) return { result: null, error: \"No handler\" };\n const fn = mod.default ?? mod.handler;\n if (typeof fn !== \"function\") return { result: null, error: \"No handler\" };\n const ctx = { requestId: \"mcp\", taskId: \"mcp\", skill: { name: \"${s.name}\", description: \"${descEscaped}\", instructions: \"\", resources: [], readResource: async () => \"\", getResourcesByType: () => [], dirPath: \"\" } };\n const out = await fn(args, ctx);\n return out?.result !== undefined ? out.result : out;\n }`;\n })\n .join(\"\\n\");\n}\n\nfunction buildN8nInvokerCases(specs: N8nSpecForCodegen[]): string {\n return specs\n .map((s) => {\n const webhookUrl = s.endpoint;\n const url =\n webhookUrl\n ? `\"${webhookUrl}\"`\n : \"process.env.N8N_WEBHOOK_\" + s.name.replace(/[^a-zA-Z0-9]/g, \"_\").toUpperCase() + \" ?? null\";\n return ` case \"${s.name}\": {\n const url = ${url};\n if (!url) throw new Error(\"n8n webhook not configured for ${s.name}. Set N8N_WEBHOOK_* or add webhook to workflow.\");\n const res = await fetch(url, { method: \"POST\", headers: { \"Content-Type\": \"application/json\" }, body: JSON.stringify(args) });\n if (!res.ok) throw new Error(\"n8n request failed: \" + res.status);\n return res.json().catch(() => ({}));\n }`;\n })\n .join(\"\\n\");\n}\n\n/** Write generated files into outDir. projectPath is the folder containing source. */\nexport async function generate(options: {\n specs: ToolSpec[];\n outDir: string;\n projectPath: string;\n}): Promise<{ entryPath: string; mcpJsonPath: string }> {\n const { specs, outDir, projectPath } = options;\n await fs.mkdir(outDir, { recursive: true });\n\n const functionSpecs = specs.filter(\n (s): s is FunctionSpecForCodegen =>\n s.kind === FUNCTION_KIND && s._meta?.sourcePath != null && s._meta?.exportName != null,\n );\n const skillSpecs = specs.filter(\n (s): s is SkillSpecForCodegen => s.kind === SKILL_KIND && s._meta?.sourcePath != null,\n );\n const n8nSpecs = specs.filter((s): s is N8nSpecForCodegen => s.kind === N8N_KIND);\n\n const toolSpecsJson = specs.map((s) => ({\n kind: s.kind,\n name: s.name,\n description: s.description,\n inputSchema: s.inputSchema,\n ...(s.kind === FUNCTION_KIND && s._meta?.sourcePath != null && s._meta?.exportName != null && {\n outputSchema: s.outputSchema ?? { type: \"object\", additionalProperties: true },\n sourcePath: s._meta.sourcePath,\n exportName: s._meta.exportName,\n }),\n _meta: s._meta,\n ...(s.kind === SKILL_KIND && s._meta?.sourcePath != null && { sourcePath: s._meta.sourcePath }),\n ...(s.kind === N8N_KIND && {\n sourcePath: s._meta?.sourcePath,\n webhookUrl: s.endpoint,\n }),\n }));\n await fs.writeFile(\n path.join(outDir, \"tool-specs.json\"),\n JSON.stringify(toolSpecsJson, null, 2),\n \"utf-8\",\n );\n\n const configJson = { projectPath: path.resolve(projectPath) };\n await fs.writeFile(path.join(outDir, \"config.json\"), JSON.stringify(configJson, null, 2), \"utf-8\");\n\n const rel = path.relative(outDir, projectPath) || \".\";\n const fromGeneratedToProject = rel.split(path.sep).length ? rel : \".\";\n\n const [mcpServerTemplate, toolIndexTemplate, skillInvokerTemplate, n8nInvokerTemplate] = await Promise.all([\n loadTemplate(TEMPLATE_NAMES.mcpServer),\n loadTemplate(TEMPLATE_NAMES.toolIndex),\n loadTemplate(TEMPLATE_NAMES.skillInvoker),\n loadTemplate(TEMPLATE_NAMES.n8nInvoker),\n ]);\n\n const toolIndexTs = toolIndexTemplate.replace(\"{{CASES}}\", buildToolIndexCases(functionSpecs, fromGeneratedToProject));\n await fs.writeFile(path.join(outDir, \"tool-index.ts\"), toolIndexTs, \"utf-8\");\n\n const skillCases = buildSkillInvokerCases(skillSpecs, fromGeneratedToProject);\n const skillDefaultCase =\n skillSpecs.length === 0 ? \"default: throw new Error('Unknown skill: ' + name);\" : 'default: throw new Error(\"Unknown skill: \" + name);';\n const skillInvokerTs = skillInvokerTemplate.replace(\"{{CASES}}\", skillCases).replace(\"{{DEFAULT_CASE}}\", skillDefaultCase);\n await fs.writeFile(path.join(outDir, \"skill-invoker.ts\"), skillInvokerTs, \"utf-8\");\n\n const n8nCases = buildN8nInvokerCases(n8nSpecs);\n const n8nDefaultCase =\n n8nSpecs.length === 0 ? \"default: throw new Error('Unknown n8n tool: ' + name);\" : 'default: throw new Error(\"Unknown n8n tool: \" + name);';\n const n8nInvokerTs = n8nInvokerTemplate.replace(\"{{CASES}}\", n8nCases).replace(\"{{DEFAULT_CASE}}\", n8nDefaultCase);\n await fs.writeFile(path.join(outDir, \"n8n-invoker.ts\"), n8nInvokerTs, \"utf-8\");\n\n await fs.writeFile(path.join(outDir, \"mcp-server.ts\"), mcpServerTemplate, \"utf-8\");\n\n const mcpJson = {\n command: \"npx\",\n args: [\"-y\", \"tsx\", path.join(outDir, \"mcp-server.ts\")],\n };\n await fs.writeFile(path.join(outDir, \"mcp.json\"), JSON.stringify(mcpJson, null, 2), \"utf-8\");\n\n const packageJson = {\n name: \"function-tools-mcp\",\n version: \"1.0.0\",\n type: \"module\",\n description: \"MCP server generated from @tool functions, SKILL.md, and workflow.json\",\n main: \"mcp-server.ts\",\n scripts: { start: \"npx tsx mcp-server.ts\" },\n dependencies: {\n \"@modelcontextprotocol/sdk\": \"^1.25.3\",\n typescript: \">=5.0.0\",\n tsx: \">=4.0.0\",\n },\n };\n await fs.writeFile(path.join(outDir, \"package.json\"), JSON.stringify(packageJson, null, 2), \"utf-8\");\n\n return {\n entryPath: path.join(outDir, \"mcp-server.ts\"),\n mcpJsonPath: path.join(outDir, \"mcp.json\"),\n };\n}\n","/**\n * MCP build: scan project for @tool, SKILL, n8n; generate MCP entrypoint and npm package.\n */\n\nimport * as path from \"node:path\";\nimport { scanForAllTools } from \"../../../tools/scanPackage.js\";\nimport { generate } from \"./generator.js\";\nimport type { BuildResult } from \"./types.js\";\nimport type { ToolSpec } from \"../../../core/types/ToolSpec.js\";\n\nexport interface BuildOptions {\n /** Project root (folder to scan; default: cwd). */\n projectPath?: string;\n /** Output directory for generated files (default: projectPath/dist). */\n outDir?: string;\n /** Glob patterns for TS files (default: [\"**\\/*.ts\"]). Used for @tool (TypeScript) scanning only. */\n include?: string[];\n /** Path to tsconfig.json (default: projectPath/tsconfig.json). Used for @tool scanning only. */\n tsconfigPath?: string;\n /** Include n8n (workflow.json) tools. Default false: we do not start or install n8n-local; set true if you use n8n. */\n includeN8n?: boolean;\n}\n\n/**\n * Scan project for all tools (@tool, SKILL, n8n); generate MCP server + tool-specs + invokers (npm package).\n */\nexport async function buildMCPPackage(options: BuildOptions = {}): Promise<BuildResult> {\n const projectPath = path.resolve(options.projectPath ?? process.cwd());\n const outDir = path.resolve(projectPath, options.outDir ?? \"dist\");\n const include = options.include ?? [\"**/*.ts\"];\n const tsconfigPath = options.tsconfigPath;\n\n const scanResult = await scanForAllTools(projectPath, {\n include,\n tsconfigPath,\n includeN8n: options.includeN8n,\n });\n\n if (scanResult.errors.length > 0) {\n const msg = scanResult.errors.map((e) => `${e.file}: ${e.message}`).join(\"; \");\n throw new Error(`Scan failed: ${msg}`);\n }\n\n const allSpecs: ToolSpec[] = scanResult.specs;\n\n if (allSpecs.length === 0) {\n throw new Error(\n \"No tools found. Add @tool functions (JSDoc), SKILL.md directories, or workflow.json directories.\",\n );\n }\n\n const { entryPath, mcpJsonPath } = await generate({\n specs: allSpecs,\n outDir,\n projectPath,\n });\n\n return {\n outDir,\n toolCount: allSpecs.length,\n entryPath,\n mcpJsonPath,\n };\n}\n","/**\n * Run step: start the generated MCP server (stdio) for testing. Spawns entrypoint via npx tsx.\n */\n\nimport { spawn } from \"node:child_process\";\nimport * as path from \"node:path\";\nimport * as fs from \"node:fs/promises\";\n\nexport interface RunOptions {\n /** Directory containing generated mcp-server (default: cwd or cwd/dist). */\n path?: string;\n}\n\n/**\n * Start the MCP server from the given directory.\n * Expects mcp-server.ts and tool-specs.json there; runs via npx tsx mcp-server.ts.\n * Returns a child process; caller should handle stdin/stdout and cleanup.\n */\nexport async function runMCPServer(options: RunOptions = {}): Promise<{ process: ReturnType<typeof spawn> }> {\n const base = options.path ?? process.cwd();\n const candidates = [\n path.join(base, \"mcp-server.ts\"),\n path.join(base, \"mcp-server.js\"),\n path.join(base, \"dist\", \"mcp-server.ts\"),\n path.join(base, \"dist\", \"mcp-server.js\"),\n path.join(base, \"generated\", \"mcp-server.ts\"),\n path.join(base, \"generated\", \"mcp-server.js\"),\n ];\n let entry = \"\";\n for (const p of candidates) {\n try {\n await fs.access(p);\n entry = p;\n break;\n } catch {\n // continue\n }\n }\n if (!entry) {\n throw new Error(\n `MCP entrypoint not found. Run \"agent-tool build\" first, or pass --path to a directory containing mcp-server.ts. Tried: ${candidates.join(\", \")}`,\n );\n }\n\n const dir = path.dirname(entry);\n const child = spawn(\"npx\", [\"-y\", \"tsx\", path.basename(entry)], {\n cwd: dir,\n stdio: [\"pipe\", \"pipe\", \"inherit\"],\n shell: false,\n });\n\n return { process: child };\n}\n"]}