@easynet/agent-tool 1.0.72 → 1.0.74

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 (58) hide show
  1. package/README.md +5 -5
  2. package/dist/api/adapters/LangChainToolsHub.d.ts +1 -1
  3. package/dist/api/createAgentTools.d.ts +4 -0
  4. package/dist/api/createAgentTools.d.ts.map +1 -1
  5. package/dist/api/expose/index.d.ts +1 -1
  6. package/dist/api/expose/openapi.d.ts.map +1 -1
  7. package/dist/api/expose/openapiHttp.d.ts.map +1 -1
  8. package/dist/api/main.cjs +23 -19
  9. package/dist/api/main.d.ts +4 -3
  10. package/dist/api/main.d.ts.map +1 -1
  11. package/dist/api/main.js +4 -4
  12. package/dist/api/runtimeFromConfig.d.ts.map +1 -1
  13. package/dist/build.cjs +8 -8
  14. package/dist/build.js +3 -3
  15. package/dist/{chunk-OG5ZSXQ5.cjs → chunk-33N4Y6IS.cjs} +13 -13
  16. package/dist/{chunk-OG5ZSXQ5.cjs.map → chunk-33N4Y6IS.cjs.map} +1 -1
  17. package/dist/{chunk-J5EPH2QO.js → chunk-ECHW6AWF.js} +37 -8
  18. package/dist/chunk-ECHW6AWF.js.map +1 -0
  19. package/dist/{chunk-YPGF5Y2Y.js → chunk-GSOJCOKN.js} +3 -3
  20. package/dist/{chunk-YPGF5Y2Y.js.map → chunk-GSOJCOKN.js.map} +1 -1
  21. package/dist/{chunk-45S2HPVU.js → chunk-HEVWKBBQ.js} +87 -60
  22. package/dist/chunk-HEVWKBBQ.js.map +1 -0
  23. package/dist/{chunk-VSFIF3WJ.js → chunk-JYADGZQP.js} +254 -261
  24. package/dist/chunk-JYADGZQP.js.map +1 -0
  25. package/dist/{chunk-DTLALP7X.cjs → chunk-KTQTDKWU.cjs} +57 -27
  26. package/dist/chunk-KTQTDKWU.cjs.map +1 -0
  27. package/dist/{chunk-JNIWNSCQ.cjs → chunk-LHKEJNKL.cjs} +87 -60
  28. package/dist/chunk-LHKEJNKL.cjs.map +1 -0
  29. package/dist/{chunk-WO4LZKPQ.cjs → chunk-OKKBKZWK.cjs} +4 -4
  30. package/dist/{chunk-WO4LZKPQ.cjs.map → chunk-OKKBKZWK.cjs.map} +1 -1
  31. package/dist/{chunk-YRFUGA3C.js → chunk-Q6W32HAP.js} +3 -3
  32. package/dist/{chunk-YRFUGA3C.js.map → chunk-Q6W32HAP.js.map} +1 -1
  33. package/dist/{chunk-3AM4SGUY.cjs → chunk-SE6IMOIE.cjs} +258 -265
  34. package/dist/chunk-SE6IMOIE.cjs.map +1 -0
  35. package/dist/{chunk-NMZ4IMEW.cjs → chunk-TBDSFXNG.cjs} +14 -14
  36. package/dist/{chunk-NMZ4IMEW.cjs.map → chunk-TBDSFXNG.cjs.map} +1 -1
  37. package/dist/{chunk-5J27MF7S.js → chunk-VYULM6NC.js} +4 -4
  38. package/dist/{chunk-5J27MF7S.js.map → chunk-VYULM6NC.js.map} +1 -1
  39. package/dist/core/runtime/PTCRuntime.d.ts +3 -0
  40. package/dist/core/runtime/PTCRuntime.d.ts.map +1 -1
  41. package/dist/extension.cjs +14 -14
  42. package/dist/extension.js +2 -2
  43. package/dist/index.cjs +41 -37
  44. package/dist/index.cjs.map +1 -1
  45. package/dist/index.d.ts +2 -2
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +7 -7
  48. package/dist/index.js.map +1 -1
  49. package/dist/tools/function/scanner.d.ts.map +1 -1
  50. package/dist/utils/cli/index.cjs +18 -18
  51. package/dist/utils/cli/index.js +4 -4
  52. package/package.json +1 -1
  53. package/dist/chunk-3AM4SGUY.cjs.map +0 -1
  54. package/dist/chunk-45S2HPVU.js.map +0 -1
  55. package/dist/chunk-DTLALP7X.cjs.map +0 -1
  56. package/dist/chunk-J5EPH2QO.js.map +0 -1
  57. package/dist/chunk-JNIWNSCQ.cjs.map +0 -1
  58. package/dist/chunk-VSFIF3WJ.js.map +0 -1
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
- var chunk3AM4SGUY_cjs = require('./chunk-3AM4SGUY.cjs');
3
+ var chunkSE6IMOIE_cjs = require('./chunk-SE6IMOIE.cjs');
4
4
  var chunkUUNG3GL3_cjs = require('./chunk-UUNG3GL3.cjs');
5
- var chunkOG5ZSXQ5_cjs = require('./chunk-OG5ZSXQ5.cjs');
5
+ var chunk33N4Y6IS_cjs = require('./chunk-33N4Y6IS.cjs');
6
6
  var tools = require('@langchain/core/tools');
7
7
  var agentCommon = require('@easynet/agent-common');
8
8
 
@@ -27,7 +27,7 @@ function buildIntent(toolName, inputSchema, args) {
27
27
  return {
28
28
  tool: toolName,
29
29
  args: hasArgsWrapper(inputSchema) ? { args } : args,
30
- purpose: chunkOG5ZSXQ5_cjs.LANGCHAIN_KIND
30
+ purpose: chunk33N4Y6IS_cjs.LANGCHAIN_KIND
31
31
  };
32
32
  }
33
33
  function normalizeArgs(args) {
@@ -118,10 +118,10 @@ function mergeHostLists(a, b) {
118
118
  function runtimeOptionsFromConfig(opts) {
119
119
  const coreTools = opts.coreTools ?? { sandboxRoot: process.cwd(), allowedHosts: [], enableSandboxValidation: false };
120
120
  if (opts.configFilePath) {
121
- const toolConfig = chunk3AM4SGUY_cjs.loadToolConfig(opts.configFilePath);
121
+ const toolConfig = chunkSE6IMOIE_cjs.loadToolConfig(opts.configFilePath);
122
122
  const updates = {};
123
123
  if (toolConfig.sandboxedPath && typeof toolConfig.sandboxedPath === "string") {
124
- updates.sandboxRoot = chunk3AM4SGUY_cjs.resolveSandboxedPath(opts.configFilePath, toolConfig.sandboxedPath);
124
+ updates.sandboxRoot = chunkSE6IMOIE_cjs.resolveSandboxedPath(opts.configFilePath, toolConfig.sandboxedPath);
125
125
  }
126
126
  if (typeof toolConfig.enableSandboxValidation === "boolean") {
127
127
  updates.enableSandboxValidation = toolConfig.enableSandboxValidation;
@@ -144,7 +144,7 @@ function runtimeOptionsFromConfig(opts) {
144
144
  const packageDefaults = { ...coreTools.packageDefaults };
145
145
  if (toolConfig.packageToolDefaults != null && Object.keys(toolConfig.packageToolDefaults).length > 0) {
146
146
  for (const [descriptor, pkgConfig] of Object.entries(toolConfig.packageToolDefaults)) {
147
- const prefix = descriptor.startsWith("file:") ? chunk3AM4SGUY_cjs.fileDescriptorToPackagePrefix(descriptor) : chunk3AM4SGUY_cjs.npmDescriptorToPackagePrefixWithVersion(descriptor);
147
+ const prefix = descriptor.startsWith("file:") ? chunkSE6IMOIE_cjs.fileDescriptorToPackagePrefix(descriptor) : chunkSE6IMOIE_cjs.npmDescriptorToPackagePrefixWithVersion(descriptor);
148
148
  if (!prefix) continue;
149
149
  const pkgDefaults = pkgConfig?.defaults != null && typeof pkgConfig.defaults === "object" && !Array.isArray(pkgConfig.defaults) ? pkgConfig.defaults : {};
150
150
  if (Object.keys(pkgDefaults).length > 0) {
@@ -172,39 +172,67 @@ function runtimeOptionsFromConfig(opts) {
172
172
  return { ...opts, coreTools };
173
173
  }
174
174
  function createAgentTools(options) {
175
+ const registry = createAgentToolsRegistry(options);
176
+ return registry.getAgentTools();
177
+ }
178
+ function createAgentToolsRegistry(options) {
175
179
  const opts = typeof options === "string" ? { configFilePath: options } : options ?? {};
176
180
  const runtimeOpts = runtimeOptionsFromConfig(opts);
177
- const { runtime } = chunk3AM4SGUY_cjs.createRuntimeFromConfigSync(runtimeOpts);
181
+ const { runtime } = chunkSE6IMOIE_cjs.createRuntimeFromConfigSync(runtimeOpts);
178
182
  const hub = new LangChainToolsHub(runtime);
179
183
  if (opts.configFilePath) {
180
- const toolConfig = chunk3AM4SGUY_cjs.loadToolConfig(opts.configFilePath);
184
+ const toolConfig = chunkSE6IMOIE_cjs.loadToolConfig(opts.configFilePath);
181
185
  const names = Array.isArray(toolConfig.tools) ? toolConfig.tools : [];
182
186
  if (names.length > 0) {
183
187
  const registryNames = runtime.getRegistry().snapshot().map((s) => s.name);
184
- const allBarePackages = names.every((n) => chunk3AM4SGUY_cjs.isBarePackageDescriptor(String(n)));
188
+ const allBarePackages = names.every((n) => chunkSE6IMOIE_cjs.isBarePackageDescriptor(String(n)));
185
189
  if (allBarePackages) {
186
- return hub.getLangChainTools();
190
+ const allTools = hub.getLangChainTools();
191
+ return {
192
+ getAgentTools(id) {
193
+ if (!id) return allTools;
194
+ const picked = allTools.filter((tool) => tool.name === id);
195
+ if (picked.length === 0) throw new Error(`agent-tool cannot find tool id: ${id}`);
196
+ return picked;
197
+ }
198
+ };
187
199
  }
188
- const expanded = chunk3AM4SGUY_cjs.expandToolDescriptorsToRegistryNames(names, registryNames);
189
- return hub.getLangChainToolsForNames(expanded);
200
+ const expanded = chunkSE6IMOIE_cjs.expandToolDescriptorsToRegistryNames(names, registryNames);
201
+ const tools2 = hub.getLangChainToolsForNames(expanded);
202
+ return {
203
+ getAgentTools(id) {
204
+ if (!id) return tools2;
205
+ const picked = tools2.filter((tool) => tool.name === id);
206
+ if (picked.length === 0) throw new Error(`agent-tool cannot find tool id: ${id}`);
207
+ return picked;
208
+ }
209
+ };
190
210
  }
191
211
  }
192
- return hub.getLangChainTools();
212
+ const tools = hub.getLangChainTools();
213
+ return {
214
+ getAgentTools(id) {
215
+ if (!id) return tools;
216
+ const picked = tools.filter((tool) => tool.name === id);
217
+ if (picked.length === 0) throw new Error(`agent-tool cannot find tool id: ${id}`);
218
+ return picked;
219
+ }
220
+ };
193
221
  }
194
222
  async function createLangChainToolsAsync(options = {}) {
195
223
  const runtimeOpts = runtimeOptionsFromConfig(options);
196
- const { runtime } = await chunk3AM4SGUY_cjs.createRuntimeFromConfig(runtimeOpts);
224
+ const { runtime } = await chunkSE6IMOIE_cjs.createRuntimeFromConfig(runtimeOpts);
197
225
  const hub = new LangChainToolsHub(runtime);
198
226
  if (options.configFilePath) {
199
- const toolConfig = chunk3AM4SGUY_cjs.loadToolConfig(options.configFilePath);
227
+ const toolConfig = chunkSE6IMOIE_cjs.loadToolConfig(options.configFilePath);
200
228
  const names = Array.isArray(toolConfig.tools) ? toolConfig.tools : [];
201
229
  if (names.length > 0) {
202
230
  const registryNames = runtime.getRegistry().snapshot().map((s) => s.name);
203
- const allBarePackages = names.every((n) => chunk3AM4SGUY_cjs.isBarePackageDescriptor(String(n)));
231
+ const allBarePackages = names.every((n) => chunkSE6IMOIE_cjs.isBarePackageDescriptor(String(n)));
204
232
  if (allBarePackages) {
205
233
  return hub.getLangChainTools();
206
234
  }
207
- const expanded = chunk3AM4SGUY_cjs.expandToolDescriptorsToRegistryNames(names, registryNames);
235
+ const expanded = chunkSE6IMOIE_cjs.expandToolDescriptorsToRegistryNames(names, registryNames);
208
236
  return hub.getLangChainToolsForNames(expanded);
209
237
  }
210
238
  }
@@ -214,28 +242,30 @@ async function createLangChainToolsAsync(options = {}) {
214
242
  // src/api/main.ts
215
243
  var langchainApi = {
216
244
  createAgentTools,
245
+ createAgentToolsRegistry,
217
246
  createLangChainToolsAsync
218
247
  };
219
248
  var runtimeApi = {
220
- createRuntimeFromConfig: chunk3AM4SGUY_cjs.createRuntimeFromConfig,
221
- createRuntimeFromConfigSync: chunk3AM4SGUY_cjs.createRuntimeFromConfigSync
249
+ createRuntimeFromConfig: chunkSE6IMOIE_cjs.createRuntimeFromConfig,
250
+ createRuntimeFromConfigSync: chunkSE6IMOIE_cjs.createRuntimeFromConfigSync
222
251
  };
223
252
  var mcpApi = {
224
- createMCPServer: chunk3AM4SGUY_cjs.createMCPServer,
225
- runMCPServerOverStdio: chunk3AM4SGUY_cjs.runMCPServerOverStdio,
226
- createMCPStreamableHttpHandler: chunk3AM4SGUY_cjs.createMCPStreamableHttpHandler,
227
- createMCPServerStreamableHttp: chunk3AM4SGUY_cjs.createMCPServerStreamableHttp
253
+ createMCPServer: chunkSE6IMOIE_cjs.createMCPServer,
254
+ runMCPServerOverStdio: chunkSE6IMOIE_cjs.runMCPServerOverStdio,
255
+ createMCPStreamableHttpHandler: chunkSE6IMOIE_cjs.createMCPStreamableHttpHandler,
256
+ createMCPServerStreamableHttp: chunkSE6IMOIE_cjs.createMCPServerStreamableHttp
228
257
  };
229
258
  var openApi = {
230
- createOpenAPIServer: chunk3AM4SGUY_cjs.createHttpService,
231
- createHttpService: chunk3AM4SGUY_cjs.createHttpService
259
+ createOpenAPIServer: chunkSE6IMOIE_cjs.createHttpService,
260
+ createHttpService: chunkSE6IMOIE_cjs.createHttpService
232
261
  };
233
262
 
234
263
  exports.createAgentTools = createAgentTools;
264
+ exports.createAgentToolsRegistry = createAgentToolsRegistry;
235
265
  exports.createLangChainToolsAsync = createLangChainToolsAsync;
236
266
  exports.langchainApi = langchainApi;
237
267
  exports.mcpApi = mcpApi;
238
268
  exports.openApi = openApi;
239
269
  exports.runtimeApi = runtimeApi;
240
- //# sourceMappingURL=chunk-DTLALP7X.cjs.map
241
- //# sourceMappingURL=chunk-DTLALP7X.cjs.map
270
+ //# sourceMappingURL=chunk-KTQTDKWU.cjs.map
271
+ //# sourceMappingURL=chunk-KTQTDKWU.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/api/adapters/LangChainToolsHub.ts","../src/api/createAgentTools.ts","../src/api/main.ts"],"names":["LANGCHAIN_KIND","stripNullishObjectFields","enrichSpecWithCanonicalSchema","DynamicStructuredTool","loadToolConfig","resolveSandboxedPath","fileDescriptorToPackagePrefix","npmDescriptorToPackagePrefixWithVersion","createRuntimeFromConfigSync","isBarePackageDescriptor","expandToolDescriptorsToRegistryNames","tools","createRuntimeFromConfig","createMCPServer","runMCPServerOverStdio","createMCPStreamableHttpHandler","createMCPServerStreamableHttp","createHttpService"],"mappings":"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","file":"chunk-KTQTDKWU.cjs","sourcesContent":["/**\n * Exposes all tools from a ToolRegistry + PTCRuntime as LangChain tools\n * for local agent use (e.g. with createReactAgent, AgentExecutor).\n *\n * For most users, use createAgentToolsRegistry().getAgentTools() which loads from tools.yaml and returns\n * StructuredTool[]. Use LangChainToolsHub when you need a custom runtime or ctxFactory.\n *\n * Use: new LangChainToolsHub(runtime, ctxFactory).getLangChainTools()\n */\n\nimport { DynamicStructuredTool, type StructuredToolInterface } from \"@langchain/core/tools\";\nimport { stripNullishObjectFields } from \"@easynet/agent-common\";\nimport type { PTCRuntime } from \"../../core/runtime/PTCRuntime.js\";\nimport type { ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport type { ToolResult } from \"../../core/types/ToolResult.js\";\nimport type { ExecContext } from \"../../core/types/ToolIntent.js\";\nimport type { ToolIntent } from \"../../core/types/ToolIntent.js\";\nimport { enrichSpecWithCanonicalSchema } from \"../../tools/util/canonicalCoreSchemas.js\";\nimport { LANGCHAIN_KIND } from \"../../tools/langchain/types.js\";\n\n/**\n * If inputSchema wraps all params in a single \"args\" object (manifest convention),\n * returns that inner args schema; otherwise returns null.\n */\nfunction getArgsSchemaIfWrapped(inputSchema: object): Record<string, unknown> | null {\n const s = inputSchema as Record<string, unknown>;\n if (s?.type !== \"object\" || !s.properties || typeof s.properties !== \"object\") return null;\n const args = (s.properties as Record<string, unknown>).args;\n if (\n args != null &&\n typeof args === \"object\" &&\n (args as Record<string, unknown>).type === \"object\" &&\n (args as Record<string, unknown>).properties != null\n ) {\n return args as Record<string, unknown>;\n }\n return null;\n}\n\n/**\n * True when inputSchema wraps all params in a single \"args\" object (manifest convention).\n */\nfunction hasArgsWrapper(inputSchema: object): boolean {\n return getArgsSchemaIfWrapped(inputSchema) !== null;\n}\n\n/**\n * If inputSchema is { type: \"object\", properties: { args: { type: \"object\", properties: {...} } } },\n * return the inner args schema so the LLM can pass { path: \".\" } instead of { args: { path: \".\" } }.\n */\nfunction schemaForLangChain(inputSchema: object): Record<string, unknown> {\n const wrapped = getArgsSchemaIfWrapped(inputSchema);\n if (wrapped !== null) return wrapped;\n return inputSchema as Record<string, unknown>;\n}\n\nfunction buildIntent(\n toolName: string,\n inputSchema: object,\n args: Record<string, unknown>,\n): ToolIntent {\n return {\n tool: toolName,\n args: hasArgsWrapper(inputSchema) ? { args } : args,\n purpose: LANGCHAIN_KIND,\n };\n}\n\nfunction normalizeArgs(args: Record<string, unknown> | undefined): Record<string, unknown> {\n return stripNullishObjectFields(args ?? {}) as Record<string, unknown>;\n}\n\nfunction serializeToolResult(result: ToolResult): string {\n if (result.ok) {\n return typeof result.result === \"string\"\n ? result.result\n : JSON.stringify(result.result);\n }\n\n const err = result.error;\n const message = err?.message ?? \"Tool failed\";\n const details = err?.details;\n return JSON.stringify(\n details != null ? { error: message, details } : { error: message },\n );\n}\n\nexport type ExecContextFactory = () => ExecContext;\n\nconst DEFAULT_CTX_FACTORY: ExecContextFactory = () => ({\n requestId: `lc-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n taskId: `task-${Date.now()}`,\n permissions: [\n \"read:web\",\n \"read:fs\",\n \"write:fs\",\n \"read:db\",\n \"write:db\",\n \"network\",\n \"workflow\",\n \"danger:destructive\",\n ],\n});\n\n/**\n * Hub that wraps PTCRuntime and exposes every registered tool as a LangChain\n * StructuredTool (DynamicStructuredTool), so local agents (LangChain AgentExecutor,\n * createReactAgent, etc.) can use the same tools as MCP and OpenAPI.\n */\nexport class LangChainToolsHub {\n constructor(\n private readonly runtime: PTCRuntime,\n private readonly ctxFactory: ExecContextFactory = DEFAULT_CTX_FACTORY,\n ) {}\n\n /**\n * Returns all registered tools as LangChain StructuredTool[].\n * Each tool invokes the runtime through the full pipeline (policy, HITL, etc.).\n */\n getLangChainTools(): StructuredToolInterface[] {\n const registry = this.runtime.getRegistry();\n const specs = registry.snapshot();\n\n return specs.map((spec) => this.specToLangChainTool(spec));\n }\n\n /**\n * Returns LangChain tools for a subset of tools (by name or query).\n */\n getLangChainToolsForNames(toolNames: string[]): StructuredToolInterface[] {\n const registry = this.runtime.getRegistry();\n const set = new Set(toolNames);\n const specs = registry.snapshot().filter((s) => set.has(s.name));\n return specs.map((spec) => this.specToLangChainTool(spec));\n }\n\n private specToLangChainTool(spec: ToolSpec): DynamicStructuredTool {\n const runtime = this.runtime;\n const ctxFactory = this.ctxFactory;\n const enriched = enrichSpecWithCanonicalSchema(spec);\n\n const schema = schemaForLangChain(enriched.inputSchema);\n return new DynamicStructuredTool({\n name: spec.name,\n description: spec.description ?? `Tool: ${spec.name}`,\n schema,\n func: async (args: Record<string, unknown>): Promise<string> => {\n const normalizedArgs = normalizeArgs(args);\n const intent = buildIntent(spec.name, enriched.inputSchema, normalizedArgs);\n const ctx = ctxFactory();\n const result = await runtime.invoke(intent, ctx);\n return serializeToolResult(result);\n },\n });\n }\n}\n","/**\n * Create LangChain tools from config (sync or async). Uses PTCRuntime + registry\n * and exposes tools via LangChainToolsHub. All invokes go through PTC Intent.\n */\n\nimport { loadToolConfig, resolveSandboxedPath } from \"../tools/util/toolConfig.js\";\nimport {\n expandToolDescriptorsToRegistryNames,\n isBarePackageDescriptor,\n npmDescriptorToPackagePrefixWithVersion,\n fileDescriptorToPackagePrefix,\n} from \"../tools/util/toolDescriptor.js\";\nimport { createRuntimeFromConfigSync, createRuntimeFromConfig } from \"./runtimeFromConfig.js\";\nimport type { CreateRuntimeOptions } from \"./runtimeFromConfig.js\";\nimport { LangChainToolsHub } from \"./adapters/LangChainToolsHub.js\";\nimport type { StructuredToolInterface } from \"@langchain/core/tools\";\n\nexport interface CreateAgentToolsOptions extends CreateRuntimeOptions {\n /** Path to tool.yaml; when set, only tools listed there are returned; sandboxedPath from it is used as sandboxRoot */\n configFilePath?: string;\n /** Project path for async loading (use createLangChainToolsAsync) */\n projectPath?: string;\n}\n\nexport interface AgentToolsRegistry {\n getAgentTools(id?: string): StructuredToolInterface[];\n}\n\n/** Merge host lists from multiple sources (e.g. tool.yaml + programmatic). Union, dedup, preserves order. */\nfunction mergeHostLists(a?: string[], b?: string[]): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const list of [a ?? [], b ?? []]) {\n for (const h of list) {\n if (!seen.has(h)) {\n seen.add(h);\n out.push(h);\n }\n }\n }\n return out;\n}\n\nfunction runtimeOptionsFromConfig(opts: CreateAgentToolsOptions): CreateRuntimeOptions {\n const coreTools = opts.coreTools ?? { sandboxRoot: process.cwd(), allowedHosts: [], enableSandboxValidation: false };\n if (opts.configFilePath) {\n const toolConfig = loadToolConfig(opts.configFilePath);\n const updates: {\n sandboxRoot?: string;\n enableSandboxValidation?: boolean;\n allowedHosts?: string[];\n blockedHosts?: string[];\n blockedCidrs?: string[];\n toolOverrides?: Record<string, Record<string, unknown>>;\n packageDefaults?: Record<string, Record<string, unknown>>;\n } = {};\n if (toolConfig.sandboxedPath && typeof toolConfig.sandboxedPath === \"string\") {\n updates.sandboxRoot = resolveSandboxedPath(opts.configFilePath, toolConfig.sandboxedPath);\n }\n if (typeof toolConfig.enableSandboxValidation === \"boolean\") {\n updates.enableSandboxValidation = toolConfig.enableSandboxValidation;\n } else if (coreTools.enableSandboxValidation == null) {\n updates.enableSandboxValidation = false;\n }\n // Smart merge: union of allowedHosts and blockedHosts from yaml + programmatic (both lists always applied)\n updates.allowedHosts = mergeHostLists(coreTools.allowedHosts, toolConfig.allowedHosts);\n updates.blockedHosts = mergeHostLists(coreTools.blockedHosts, toolConfig.blockedHosts);\n if (Array.isArray(toolConfig.blockedCidrs) && toolConfig.blockedCidrs.length > 0) {\n updates.blockedCidrs = toolConfig.blockedCidrs;\n } else if (coreTools.blockedCidrs?.length) {\n updates.blockedCidrs = coreTools.blockedCidrs;\n }\n let hasToolDefaults = false;\n const flatOverrides: Record<string, Record<string, unknown>> = { ...coreTools.toolOverrides };\n if (toolConfig.toolDefaults != null && Object.keys(toolConfig.toolDefaults).length > 0) {\n Object.assign(flatOverrides, toolConfig.toolDefaults);\n hasToolDefaults = true;\n }\n const packageDefaults: Record<string, Record<string, unknown>> = { ...coreTools.packageDefaults };\n if (toolConfig.packageToolDefaults != null && Object.keys(toolConfig.packageToolDefaults).length > 0) {\n for (const [descriptor, pkgConfig] of Object.entries(toolConfig.packageToolDefaults)) {\n const prefix = descriptor.startsWith(\"file:\")\n ? fileDescriptorToPackagePrefix(descriptor)\n : npmDescriptorToPackagePrefixWithVersion(descriptor);\n if (!prefix) continue;\n const pkgDefaults =\n pkgConfig?.defaults != null && typeof pkgConfig.defaults === \"object\" && !Array.isArray(pkgConfig.defaults)\n ? (pkgConfig.defaults as Record<string, unknown>)\n : {};\n if (Object.keys(pkgDefaults).length > 0) {\n packageDefaults[prefix] = pkgDefaults;\n }\n const toolConfigs = pkgConfig?.tools != null && typeof pkgConfig.tools === \"object\" && !Array.isArray(pkgConfig.tools) ? pkgConfig.tools : {};\n for (const [toolName, config] of Object.entries(toolConfigs)) {\n if (config != null && typeof config === \"object\") {\n hasToolDefaults = true;\n flatOverrides[`${prefix}::${toolName}`] = { ...pkgDefaults, ...(config as Record<string, unknown>) };\n }\n }\n }\n if (Object.keys(packageDefaults).length > 0) {\n updates.packageDefaults = packageDefaults;\n }\n }\n if (hasToolDefaults) {\n updates.toolOverrides = flatOverrides;\n }\n if (Object.keys(updates).length > 0) {\n return { ...opts, coreTools: { ...coreTools, ...updates } };\n }\n }\n return { ...opts, coreTools };\n}\n\n/**\n * Create LangChain tools synchronously. When configFilePath is set, returns only\n * tools listed in that file (and that exist in the registry). If tool.yaml has\n * sandboxedPath, fs tools can only access that directory.\n */\nexport function createAgentTools(\n options?: CreateAgentToolsOptions | string\n): StructuredToolInterface[] {\n const registry = createAgentToolsRegistry(options);\n return registry.getAgentTools();\n}\n\nexport function createAgentToolsRegistry(\n options?: CreateAgentToolsOptions | string\n): AgentToolsRegistry {\n const opts: CreateAgentToolsOptions =\n typeof options === \"string\" ? { configFilePath: options } : options ?? {};\n const runtimeOpts = runtimeOptionsFromConfig(opts);\n const { runtime } = createRuntimeFromConfigSync(runtimeOpts);\n const hub = new LangChainToolsHub(runtime);\n\n if (opts.configFilePath) {\n const toolConfig = loadToolConfig(opts.configFilePath);\n const names = Array.isArray(toolConfig.tools) ? toolConfig.tools : [];\n if (names.length > 0) {\n const registryNames = runtime.getRegistry().snapshot().map((s) => s.name);\n const allBarePackages = names.every((n) => isBarePackageDescriptor(String(n)));\n if (allBarePackages) {\n const allTools = hub.getLangChainTools();\n return {\n getAgentTools(id?: string): StructuredToolInterface[] {\n if (!id) return allTools;\n const picked = allTools.filter((tool) => tool.name === id);\n if (picked.length === 0) throw new Error(`agent-tool cannot find tool id: ${id}`);\n return picked;\n },\n };\n }\n const expanded = expandToolDescriptorsToRegistryNames(names, registryNames);\n const tools = hub.getLangChainToolsForNames(expanded);\n return {\n getAgentTools(id?: string): StructuredToolInterface[] {\n if (!id) return tools;\n const picked = tools.filter((tool) => tool.name === id);\n if (picked.length === 0) throw new Error(`agent-tool cannot find tool id: ${id}`);\n return picked;\n },\n };\n }\n }\n\n const tools = hub.getLangChainTools();\n return {\n getAgentTools(id?: string): StructuredToolInterface[] {\n if (!id) return tools;\n const picked = tools.filter((tool) => tool.name === id);\n if (picked.length === 0) throw new Error(`agent-tool cannot find tool id: ${id}`);\n return picked;\n },\n };\n}\n\n/**\n * Create LangChain tools asynchronously. Use when projectPath is set to load\n * tools from the project before building the tool list.\n */\nexport async function createLangChainToolsAsync(\n options: CreateAgentToolsOptions = {}\n): Promise<StructuredToolInterface[]> {\n const runtimeOpts = runtimeOptionsFromConfig(options);\n const { runtime } = await createRuntimeFromConfig(runtimeOpts);\n const hub = new LangChainToolsHub(runtime);\n\n if (options.configFilePath) {\n const toolConfig = loadToolConfig(options.configFilePath);\n const names = Array.isArray(toolConfig.tools) ? toolConfig.tools : [];\n if (names.length > 0) {\n const registryNames = runtime.getRegistry().snapshot().map((s) => s.name);\n const allBarePackages = names.every((n) => isBarePackageDescriptor(String(n)));\n if (allBarePackages) {\n return hub.getLangChainTools();\n }\n const expanded = expandToolDescriptorsToRegistryNames(names, registryNames);\n return hub.getLangChainToolsForNames(expanded);\n }\n }\n\n return hub.getLangChainTools();\n}\n","/**\n * Public API: three create functions (config-driven) + runtime.\n *\n * 1. createLangChainTools(config?) → LangChain tools (createReactAgent / AgentExecutor)\n * 2. createMCPServer(runtime | config, options?) → MCP server (stdio, Cursor / Claude)\n * 3. createOpenAPIServer(runtime | config, options?) → HTTP + OpenAPI/Swagger (GET /tools, POST /invoke)\n *\n * All tool invokes go through PTC Intent (runtime.invoke(intent, ctx)) for policy, budget, observability.\n * Use createRuntimeFromConfig(config) when you need the runtime for multiple servers.\n */\n\nexport { createAgentTools, createAgentToolsRegistry, createLangChainToolsAsync } from \"./createAgentTools.js\";\nexport type { AgentToolsRegistry, CreateAgentToolsOptions } from \"./createAgentTools.js\";\n\nexport { createHttpService } from \"./expose/openapiHttp.js\";\nexport type {\n CreateHttpServiceOptions,\n HttpServiceResult,\n OpenAPIHttpServerOptions,\n} from \"./expose/openapiHttp.js\";\n/** Alias: OpenAPI server with Swagger support */\nexport { createHttpService as createOpenAPIServer } from \"./expose/openapiHttp.js\";\n\nexport {\n createMCPServer,\n runMCPServerOverStdio,\n createMCPStreamableHttpHandler,\n createMCPServerStreamableHttp,\n} from \"./expose/mcpServer.js\";\nexport type {\n MCPServerOptions,\n MCPServerResult,\n MCPStreamableHttpHandler,\n MCPServerStreamableHttpResult,\n CreateMCPServerStreamableHttpOptions,\n} from \"./expose/mcpServer.js\";\n\nexport { createRuntimeFromConfig, createRuntimeFromConfigSync } from \"./runtimeFromConfig.js\";\nexport type { CreateRuntimeOptions, CreateRuntimeResult } from \"./runtimeFromConfig.js\";\n\nexport { PTCRuntime } from \"../core/runtime/PTCRuntime.js\";\nexport type { PTCRuntimeConfig } from \"../core/runtime/PTCRuntime.js\";\n\nimport { createAgentTools, createAgentToolsRegistry, createLangChainToolsAsync } from \"./createAgentTools.js\";\nimport { createHttpService } from \"./expose/openapiHttp.js\";\nimport {\n createMCPServer,\n runMCPServerOverStdio,\n createMCPStreamableHttpHandler,\n createMCPServerStreamableHttp,\n} from \"./expose/mcpServer.js\";\nimport { createRuntimeFromConfig, createRuntimeFromConfigSync } from \"./runtimeFromConfig.js\";\n\n/**\n * Facade: grouped API for lower import complexity in callers.\n */\nexport const langchainApi = {\n createAgentTools,\n createAgentToolsRegistry,\n createLangChainToolsAsync,\n} as const;\n\n/**\n * Facade: grouped runtime creation helpers.\n */\nexport const runtimeApi = {\n createRuntimeFromConfig,\n createRuntimeFromConfigSync,\n} as const;\n\n/**\n * Facade: grouped MCP server helpers.\n */\nexport const mcpApi = {\n createMCPServer,\n runMCPServerOverStdio,\n createMCPStreamableHttpHandler,\n createMCPServerStreamableHttp,\n} as const;\n\n/**\n * Facade: grouped OpenAPI/HTTP helpers.\n */\nexport const openApi = {\n createOpenAPIServer: createHttpService,\n createHttpService,\n} as const;\n"]}
@@ -245,31 +245,33 @@ function scanForTools(options) {
245
245
  const include = options.include ?? ["**/*.ts"];
246
246
  const errors = [];
247
247
  const warnings = [];
248
- let config;
249
- let configPathResolved = path__namespace.resolve(projectPath, tsconfigPath);
248
+ const config = loadParsedCommandLine({
249
+ projectPath,
250
+ tsconfigPath,
251
+ include,
252
+ errors});
253
+ if (!config) return { specs: [], errors, warnings };
254
+ const program = ts2__namespace.createProgram(config.fileNames, config.options);
255
+ const typeChecker = program.getTypeChecker();
256
+ const specs = [];
257
+ const configFileSet = new Set(config.fileNames.map((f) => path__namespace.resolve(f)));
258
+ collectToolSpecsFromProgram({
259
+ program,
260
+ typeChecker,
261
+ projectPath,
262
+ warnings,
263
+ configFileSet,
264
+ specs
265
+ });
266
+ return { specs, errors, warnings };
267
+ }
268
+ function loadParsedCommandLine(input) {
269
+ let configPathResolved = path__namespace.resolve(input.projectPath, input.tsconfigPath);
250
270
  if (!fs__namespace.existsSync(configPathResolved)) {
251
- configPathResolved = path__namespace.join(projectPath, "tsconfig.json");
271
+ configPathResolved = path__namespace.join(input.projectPath, "tsconfig.json");
252
272
  }
253
- if (fs__namespace.existsSync(configPathResolved)) {
254
- const configFile = ts2__namespace.readConfigFile(configPathResolved, ts2__namespace.sys.readFile);
255
- if (configFile.error) {
256
- errors.push({ file: configPathResolved, message: String(configFile.error.messageText) });
257
- return { specs: [], errors, warnings };
258
- }
259
- const parsed = ts2__namespace.parseJsonConfigFileContent(
260
- configFile.config,
261
- ts2__namespace.sys,
262
- path__namespace.dirname(configPathResolved)
263
- );
264
- if (parsed.errors.length) {
265
- for (const e of parsed.errors) {
266
- errors.push({ file: e.file?.fileName ?? "tsconfig", message: String(e.messageText) });
267
- }
268
- return { specs: [], errors, warnings };
269
- }
270
- config = parsed;
271
- } else {
272
- config = {
273
+ if (!fs__namespace.existsSync(configPathResolved)) {
274
+ return {
273
275
  options: {
274
276
  target: ts2__namespace.ScriptTarget.ES2022,
275
277
  module: ts2__namespace.ModuleKind.ESNext,
@@ -278,50 +280,75 @@ function scanForTools(options) {
278
280
  skipLibCheck: true,
279
281
  noEmit: true
280
282
  },
281
- fileNames: resolveGlob(projectPath, include),
283
+ fileNames: resolveGlob(input.projectPath, input.include),
282
284
  errors: []
283
285
  };
284
286
  }
285
- const program = ts2__namespace.createProgram(config.fileNames, config.options);
286
- const typeChecker = program.getTypeChecker();
287
- const specs = [];
288
- for (const sourceFile of program.getSourceFiles()) {
287
+ const configFile = ts2__namespace.readConfigFile(configPathResolved, ts2__namespace.sys.readFile);
288
+ if (configFile.error) {
289
+ input.errors.push({ file: configPathResolved, message: String(configFile.error.messageText) });
290
+ return null;
291
+ }
292
+ const parsed = ts2__namespace.parseJsonConfigFileContent(
293
+ configFile.config,
294
+ ts2__namespace.sys,
295
+ path__namespace.dirname(configPathResolved)
296
+ );
297
+ if (parsed.errors.length === 0) return parsed;
298
+ for (const e of parsed.errors) {
299
+ input.errors.push({ file: e.file?.fileName ?? "tsconfig", message: String(e.messageText) });
300
+ }
301
+ return null;
302
+ }
303
+ function collectToolSpecsFromProgram(input) {
304
+ for (const sourceFile of input.program.getSourceFiles()) {
289
305
  const fileName = sourceFile.fileName;
290
306
  if (fileName.includes("node_modules") || fileName.endsWith(".d.ts")) continue;
291
- if (!config.fileNames.some((f) => path__namespace.resolve(f) === path__namespace.resolve(fileName))) continue;
307
+ if (!input.configFileSet.has(path__namespace.resolve(fileName))) continue;
292
308
  ts2__namespace.forEachChild(sourceFile, (node) => {
293
- const decl = getExportedFunctionDeclaration(node);
294
- if (!decl) return;
295
- const func = decl.func;
296
- const name = decl.name;
297
- if (!name) return;
298
- const host = getJSDocHost(func);
299
- if (!hasToolTag(host)) return;
300
- const jsDoc = getJSDocComments(host);
301
- const description = getDescription(jsDoc);
302
- if (!description) {
303
- warnings.push({ file: fileName, message: `Tool ${name}: missing description, using humanized name` });
304
- }
305
- const sideEffect = getEffect(host);
306
- const onWarn = (msg) => warnings.push({ file: fileName, message: `${name}: ${msg}` });
307
- const { schema } = buildInputSchemaFromParams(func, typeChecker, onWarn);
308
- const inputSchema = Object.keys(schema.properties ?? {}).length > 0 ? schema : { type: "object", properties: {} };
309
- const outputSchema = buildOutputSchemaFromReturnType(func, typeChecker, onWarn);
310
- const sourcePath = path__namespace.relative(projectPath, fileName) || path__namespace.basename(fileName);
311
- const toolName = pathToToolName(sourcePath, name);
312
- specs.push({
313
- kind: FUNCTION_KIND,
314
- name: toolName,
315
- description: description || humanize(name),
316
- inputSchema,
317
- outputSchema,
318
- _meta: { hitl: { sideEffect } },
319
- sourcePath,
320
- exportName: name
309
+ const spec = toFunctionToolSpec({
310
+ node,
311
+ fileName,
312
+ projectPath: input.projectPath,
313
+ typeChecker: input.typeChecker,
314
+ warnings: input.warnings
321
315
  });
316
+ if (spec) input.specs.push(spec);
322
317
  });
323
318
  }
324
- return { specs, errors, warnings };
319
+ }
320
+ function toFunctionToolSpec(input) {
321
+ const decl = getExportedFunctionDeclaration(input.node);
322
+ if (!decl || !decl.name) return null;
323
+ const host = getJSDocHost(decl.func);
324
+ if (!hasToolTag(host)) return null;
325
+ const jsDoc = getJSDocComments(host);
326
+ const description = getDescription(jsDoc, decl.name);
327
+ if (!description) {
328
+ input.warnings.push({
329
+ file: input.fileName,
330
+ message: `Tool ${decl.name}: missing description, using humanized name`
331
+ });
332
+ }
333
+ const sideEffect = getEffect(host);
334
+ const onWarn = (msg) => input.warnings.push({ file: input.fileName, message: `${decl.name}: ${msg}` });
335
+ const { schema } = buildInputSchemaFromParams(decl.func, input.typeChecker, onWarn);
336
+ const outputSchema = buildOutputSchemaFromReturnType(decl.func, input.typeChecker, onWarn);
337
+ const sourcePath = path__namespace.relative(input.projectPath, input.fileName) || path__namespace.basename(input.fileName);
338
+ const toolName = pathToToolName(sourcePath, decl.name);
339
+ return {
340
+ kind: FUNCTION_KIND,
341
+ name: toolName,
342
+ description: description || humanize(decl.name),
343
+ inputSchema: normalizeInputSchema(schema),
344
+ outputSchema,
345
+ _meta: { hitl: { sideEffect } },
346
+ sourcePath,
347
+ exportName: decl.name
348
+ };
349
+ }
350
+ function normalizeInputSchema(schema) {
351
+ return Object.keys(schema.properties ?? {}).length > 0 ? schema : { type: "object", properties: {} };
325
352
  }
326
353
  function resolveGlob(projectPath, patterns) {
327
354
  const result = [];
@@ -490,5 +517,5 @@ exports.mcpSpecToToolSpec = mcpSpecToToolSpec;
490
517
  exports.pathToToolName = pathToToolName;
491
518
  exports.scan = scan;
492
519
  exports.scanForTools = scanForTools;
493
- //# sourceMappingURL=chunk-JNIWNSCQ.cjs.map
494
- //# sourceMappingURL=chunk-JNIWNSCQ.cjs.map
520
+ //# sourceMappingURL=chunk-LHKEJNKL.cjs.map
521
+ //# sourceMappingURL=chunk-LHKEJNKL.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tools/util/scanUtil.ts","../src/tools/function/schemaFromTs.ts","../src/tools/function/types.ts","../src/tools/skill/types.ts","../src/tools/n8n/types.ts","../src/tools/mcp/mcpSpecToToolSpec.ts","../src/tools/function/scanner.ts"],"names":["readdir","join","ts","DEFAULT_OUTPUT_SCHEMA","path","ts2","fs"],"mappings":"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","file":"chunk-LHKEJNKL.cjs","sourcesContent":["/**\n * Shared scan helpers for tool-type scanners (function, skill, n8n).\n * findDirsContainingFile: recursive dirs that contain a given file name.\n * pathToToolName: build dotted tool name from source path and program name.\n */\n\nimport { readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport async function findDirsContainingFile(\n rootPath: string,\n fileName: string,\n): Promise<string[]> {\n const found: string[] = [];\n await collectDirsWithFile(rootPath, fileName, found);\n return found;\n}\n\nasync function collectDirsWithFile(\n dir: string,\n fileName: string,\n acc: string[],\n): Promise<void> {\n let entries: Array<{ name: string; isDirectory: boolean; isFile: boolean }>;\n try {\n const e = await readdir(dir, { withFileTypes: true });\n entries = e.map((x) => ({\n name: x.name,\n isDirectory: x.isDirectory(),\n isFile: x.isFile(),\n }));\n } catch {\n return;\n }\n if (entries.some((x) => x.isFile && x.name === fileName)) acc.push(dir);\n for (const entry of entries) {\n if (!entry.isDirectory || entry.name === \"node_modules\" || entry.name.startsWith(\".\")) continue;\n await collectDirsWithFile(join(dir, entry.name), fileName, acc);\n }\n}\n\n/** Build dotted tool name from source path (extension stripped) and program name. */\nexport function pathToToolName(sourcePath: string, programName: string): string {\n const normalized = sourcePath\n .replace(/\\\\/g, \"/\")\n .replace(/\\.(ts|tsx|js|mjs|json)$/i, \"\");\n const segments = normalized.split(\"/\").filter(Boolean);\n return segments.length === 0 ? programName : `${segments.join(\".\")}.${programName}`;\n}\n","/**\n * Build JSON Schema from TypeScript parameter types using the compiler API.\n * MVP: primitives, optional, array, object. Complex types fallback to {} with warn.\n */\n\nimport * as ts from \"typescript\";\n\n/**\n * Build output JSON Schema from function return type (unwrap Promise if present).\n * Used by scan when auto-deriving schema.\n */\nexport function buildOutputSchemaFromReturnType(\n node: ts.FunctionDeclaration | ts.ArrowFunction | ts.FunctionExpression,\n typeChecker: ts.TypeChecker,\n onWarn?: (message: string) => void,\n): object {\n const sig = typeChecker.getSignatureFromDeclaration(node as ts.SignatureDeclaration);\n if (!sig) {\n onWarn?.(\"Could not get signature for return type, using object\");\n return { type: \"object\", additionalProperties: true };\n }\n let returnType = typeChecker.getReturnTypeOfSignature(sig);\n // Unwrap Promise<T> to T\n if (returnType.getSymbol?.()?.getName() === \"Promise\") {\n const typeArgs = (returnType as ts.TypeReference).typeArguments;\n if (typeArgs?.[0]) returnType = typeArgs[0];\n }\n const schema = typeToJsonSchema(returnType, typeChecker, onWarn);\n const hasProps =\n typeof schema === \"object\" &&\n (schema as { type?: string; properties?: object }).type === \"object\" &&\n Object.keys((schema as { properties?: object }).properties ?? {}).length > 0;\n return hasProps ? schema : { type: \"object\", additionalProperties: true };\n}\n\n/** Build { type: \"object\", properties, required } from function parameters. */\nexport function buildInputSchemaFromParams(\n node: ts.FunctionDeclaration | ts.ArrowFunction | ts.FunctionExpression,\n typeChecker: ts.TypeChecker,\n onWarn?: (message: string) => void,\n): { schema: object; required: string[] } {\n const properties: Record<string, object> = {};\n const required: string[] = [];\n\n if (!node.parameters.length) {\n return { schema: { type: \"object\", properties: {} }, required: [] };\n }\n\n for (const param of node.parameters) {\n const name = (param.name as ts.Identifier).getText();\n if (name.startsWith(\"_\") && name.length <= 2) continue;\n const sym = (param as ts.ParameterDeclaration & { symbol?: ts.Symbol }).symbol;\n const paramType = sym\n ? typeChecker.getTypeOfSymbolAtLocation(sym, param)\n : typeChecker.getTypeAtLocation(param);\n const isOptional = !!param.questionToken || param.initializer !== undefined;\n const propSchema = typeToJsonSchema(paramType, typeChecker, onWarn);\n properties[name] = propSchema;\n if (!isOptional) required.push(name);\n }\n\n // Flatten: when there is exactly one parameter and it's an object type, emit that object's\n // schema at top level so agents can pass flat params like { path: \".\" } instead of { args: { path: \".\" } }.\n const paramNames = Object.keys(properties);\n if (paramNames.length === 1) {\n const soleName = paramNames[0]!;\n const inner = properties[soleName] as\n | { type?: string; properties?: Record<string, object>; required?: string[]; additionalProperties?: boolean }\n | undefined;\n if (\n inner &&\n typeof inner === \"object\" &&\n inner.type === \"object\" &&\n inner.properties &&\n typeof inner.properties === \"object\"\n ) {\n return {\n schema: {\n type: \"object\",\n properties: inner.properties,\n ...(Array.isArray(inner.required) && inner.required.length > 0 ? { required: inner.required } : {}),\n ...(inner.additionalProperties !== undefined ? { additionalProperties: inner.additionalProperties } : {}),\n },\n required: inner.required ?? [],\n };\n }\n }\n\n return {\n schema: {\n type: \"object\",\n properties,\n ...(required.length > 0 ? { required } : {}),\n },\n required,\n };\n}\n\nfunction typeToJsonSchema(\n type: ts.Type,\n typeChecker: ts.TypeChecker,\n onWarn?: (message: string) => void,\n): object {\n const flags = type.flags;\n if (flags & ts.TypeFlags.String) return { type: \"string\" };\n if (flags & ts.TypeFlags.Number) return { type: \"number\" };\n if (flags & ts.TypeFlags.Boolean) return { type: \"boolean\" };\n if (flags & ts.TypeFlags.BooleanLiteral) return { type: \"boolean\" };\n if (flags & ts.TypeFlags.Null) return { type: \"null\" };\n if (flags & ts.TypeFlags.Undefined || flags & ts.TypeFlags.Void) return {};\n if (flags & ts.TypeFlags.Any || flags & ts.TypeFlags.Unknown) {\n onWarn?.(`Unsupported type: any/unknown, using empty schema`);\n return {};\n }\n\n if (type.isUnion?.()) {\n const union = type as ts.UnionType;\n const types = union.types;\n const withoutUndef = types.filter(\n (t) => !(t.flags & ts.TypeFlags.Undefined) && !(t.flags & ts.TypeFlags.Void),\n );\n if (withoutUndef.length === 1) return typeToJsonSchema(withoutUndef[0]!, typeChecker, onWarn);\n if (withoutUndef.length === 0) return {};\n // Union of string literals -> { type: \"string\", enum: [...] } so we don't fall through to getProperties() (String prototype).\n const stringEnumValues: string[] = [];\n let allStringLiterals = true;\n for (const t of withoutUndef) {\n if (t.flags & ts.TypeFlags.StringLiteral) {\n const lit = t as ts.StringLiteralType;\n if (typeof lit.value === \"string\") stringEnumValues.push(lit.value);\n } else {\n allStringLiterals = false;\n break;\n }\n }\n if (allStringLiterals && stringEnumValues.length > 0) {\n return { type: \"string\", enum: [...new Set(stringEnumValues)] };\n }\n\n // Union of boolean literals (true | false | undefined) should stay boolean.\n let allBooleanLiterals = true;\n for (const t of withoutUndef) {\n if (!(t.flags & ts.TypeFlags.BooleanLiteral)) {\n allBooleanLiterals = false;\n break;\n }\n }\n if (allBooleanLiterals) return { type: \"boolean\" };\n }\n\n // Single string literal (e.g. type: \"file\") -> { type: \"string\", enum: [\"file\"] }, not object with String methods.\n if (flags & ts.TypeFlags.StringLiteral) {\n const lit = type as ts.StringLiteralType;\n if (typeof lit.value === \"string\") {\n return { type: \"string\", enum: [lit.value] };\n }\n return { type: \"string\" };\n }\n\n if (typeChecker.isArrayType(type)) {\n const typeRef = type as ts.TypeReference;\n const typeArgs = typeRef.typeArguments;\n const itemType = typeArgs?.[0];\n const items = itemType ? typeToJsonSchema(itemType, typeChecker, onWarn) : {};\n return { type: \"array\", items: Object.keys(items).length ? items : {} };\n }\n\n const str = typeChecker.typeToString(type);\n if (str === \"string\") return { type: \"string\" };\n if (str === \"number\") return { type: \"number\" };\n if (str === \"boolean\") return { type: \"boolean\" };\n if (str.endsWith(\"[]\")) {\n const inner = str.slice(0, -2).trim();\n const itemType =\n inner === \"string\" ? { type: \"string\" as const } : inner === \"number\" ? { type: \"number\" as const } : {};\n return { type: \"array\", items: itemType };\n }\n\n if (type.getProperties && type.getProperties().length >= 0) {\n const props = type.getProperties();\n const properties: Record<string, object> = {};\n const required: string[] = [];\n for (const p of props) {\n const decl = p.valueDeclaration;\n const propType = decl\n ? typeChecker.getTypeAtLocation(decl)\n : typeChecker.getTypeOfSymbolAtLocation(p, (p as unknown as { valueDeclaration: ts.Node }).valueDeclaration);\n const optional = decl && ts.isPropertySignature(decl) ? !!decl.questionToken : false;\n properties[p.name] = typeToJsonSchema(propType, typeChecker, onWarn);\n if (!optional) required.push(p.name);\n }\n return { type: \"object\", properties, ...(required.length ? { required } : {}) };\n }\n\n onWarn?.(`Unsupported type: ${str}, using object`);\n return { type: \"object\" };\n}\n","/** HITL side-effect classification. */\nexport type SideEffect = \"none\" | \"local_write\" | \"external_write\" | \"destructive\";\n\n/** Kind for @tool function discovery. */\nexport const FUNCTION_KIND = \"function\" as const;\n\n/** Single tool spec from @tool function. */\nexport interface FunctionToolSpec {\n kind: typeof FUNCTION_KIND;\n name: string;\n description: string;\n inputSchema: object;\n outputSchema?: object;\n _meta?: { hitl?: { sideEffect?: SideEffect } };\n sourcePath: string;\n exportName: string;\n}\n","import type { SideEffect } from \"../function/types.js\";\n\n/** Kind for SKILL.md discovery. */\nexport const SKILL_KIND = \"skill\" as const;\n\n/** Conventional directory name for skill tools. */\nexport const SKILL_DIR_NAME = \"skill\" as const;\n\n/** Single tool spec from SKILL.md directory. */\nexport interface SkillToolSpec {\n kind: typeof SKILL_KIND;\n name: string;\n description: string;\n inputSchema: object;\n _meta?: { hitl?: { sideEffect?: SideEffect } };\n sourcePath: string;\n}\n","import type { SideEffect } from \"../function/types.js\";\n\n/** Kind for n8n workflow.json discovery. */\nexport const N8N_KIND = \"n8n\" as const;\n\n/** Single tool spec from n8n workflow.json directory. */\nexport interface N8nToolSpec {\n kind: typeof N8N_KIND;\n name: string;\n description: string;\n inputSchema: object;\n _meta?: { hitl?: { sideEffect?: SideEffect } };\n sourcePath: string;\n webhookUrl?: string;\n}\n","/**\n * Convert MCPToolSpec (function/skill/n8n scan result) to unified ToolSpec.\n * MCP layer: used by function/skill/n8n scanners when exposing unified ToolSpec.\n */\n\nimport type { ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport { DEFAULT_OUTPUT_SCHEMA } from \"../../core/types/ToolSpec.js\";\nimport type { MCPToolSpec } from \"../discoveryFactory.js\";\nimport { FUNCTION_KIND } from \"../function/types.js\";\nimport { SKILL_KIND } from \"../skill/types.js\";\nimport { N8N_KIND } from \"../n8n/types.js\";\n\nconst DEFAULT_OUTPUT = { type: \"object\" as const, additionalProperties: true };\n\nexport function mcpSpecToToolSpec(spec: MCPToolSpec, projectPath?: string): ToolSpec {\n const base: ToolSpec = {\n name: spec.name,\n version: \"1.0.0\",\n kind: spec.kind,\n description: spec.description,\n inputSchema: spec.inputSchema ?? DEFAULT_OUTPUT,\n outputSchema:\n \"outputSchema\" in spec && spec.outputSchema\n ? spec.outputSchema\n : (DEFAULT_OUTPUT_SCHEMA as object),\n capabilities: [],\n _meta: spec._meta,\n ...(spec.kind === N8N_KIND && \"webhookUrl\" in spec && spec.webhookUrl\n ? { endpoint: spec.webhookUrl }\n : {}),\n };\n if (spec.kind === FUNCTION_KIND && \"sourcePath\" in spec && \"exportName\" in spec) {\n base._meta = {\n ...base._meta,\n sourcePath: spec.sourcePath,\n exportName: spec.exportName,\n ...(projectPath && { projectPath }),\n };\n }\n if (spec.kind === SKILL_KIND && \"sourcePath\" in spec && projectPath) {\n base._meta = { ...base._meta, sourcePath: spec.sourcePath, projectPath };\n }\n if (spec.kind === N8N_KIND && \"sourcePath\" in spec && projectPath) {\n base._meta = { ...base._meta, sourcePath: spec.sourcePath, projectPath };\n }\n return base;\n}\n","/**\n * Scan TypeScript source files for exported functions with @tool JSDoc.\n * Extracts description, @effect, and builds inputSchema from param types.\n * Exposes both scanForTools (raw) and scan (unified DiscoverToolsResult).\n */\n\nimport * as path from \"node:path\";\nimport * as fs from \"node:fs\";\nimport * as ts from \"typescript\";\nimport { pathToToolName } from \"../util/scanUtil.js\";\nimport { buildInputSchemaFromParams, buildOutputSchemaFromReturnType } from \"./schemaFromTs.js\";\nimport type { FunctionToolSpec, SideEffect } from \"./types.js\";\nimport { FUNCTION_KIND } from \"./types.js\";\nimport type { DiscoverToolsOptions, DiscoverToolsResult } from \"../discoveryFactory.js\";\nimport { mcpSpecToToolSpec } from \"../mcp/mcpSpecToToolSpec.js\";\n\nconst TOOL_TAG = \"@tool\";\nconst EFFECT_TAG = \"@effect\";\nconst EFFECT_VALUES: SideEffect[] = [\"none\", \"local_write\", \"external_write\", \"destructive\"];\n\nexport interface ScanResult {\n specs: FunctionToolSpec[];\n errors: Array<{ file: string; message: string }>;\n warnings: Array<{ file: string; message: string }>;\n}\n\n/**\n * Scan a project folder for exported functions annotated with @tool.\n */\nexport function scanForTools(options: {\n projectPath: string;\n include?: string[];\n tsconfigPath?: string;\n}): ScanResult {\n const projectPath = path.resolve(options.projectPath);\n const tsconfigPath =\n options.tsconfigPath ?? path.join(projectPath, \"tsconfig.json\");\n const include = options.include ?? [\"**/*.ts\"];\n const errors: Array<{ file: string; message: string }> = [];\n const warnings: Array<{ file: string; message: string }> = [];\n const config = loadParsedCommandLine({\n projectPath,\n tsconfigPath,\n include,\n errors,\n warnings,\n });\n if (!config) return { specs: [], errors, warnings };\n\n const program = ts.createProgram(config.fileNames, config.options);\n const typeChecker = program.getTypeChecker();\n const specs: FunctionToolSpec[] = [];\n const configFileSet = new Set(config.fileNames.map((f) => path.resolve(f)));\n\n collectToolSpecsFromProgram({\n program,\n typeChecker,\n projectPath,\n warnings,\n configFileSet,\n specs,\n });\n\n return { specs, errors, warnings };\n}\n\nfunction loadParsedCommandLine(input: {\n projectPath: string;\n tsconfigPath: string;\n include: string[];\n errors: Array<{ file: string; message: string }>;\n warnings: Array<{ file: string; message: string }>;\n}): ts.ParsedCommandLine | null {\n let configPathResolved = path.resolve(input.projectPath, input.tsconfigPath);\n if (!fs.existsSync(configPathResolved)) {\n configPathResolved = path.join(input.projectPath, \"tsconfig.json\");\n }\n if (!fs.existsSync(configPathResolved)) {\n return {\n options: {\n target: ts.ScriptTarget.ES2022,\n module: ts.ModuleKind.ESNext,\n moduleResolution: ts.ModuleResolutionKind.NodeNext,\n strict: true,\n skipLibCheck: true,\n noEmit: true,\n },\n fileNames: resolveGlob(input.projectPath, input.include),\n errors: [],\n } as ts.ParsedCommandLine;\n }\n\n const configFile = ts.readConfigFile(configPathResolved, ts.sys.readFile);\n if (configFile.error) {\n input.errors.push({ file: configPathResolved, message: String(configFile.error.messageText) });\n return null;\n }\n const parsed = ts.parseJsonConfigFileContent(\n configFile.config,\n ts.sys,\n path.dirname(configPathResolved),\n );\n if (parsed.errors.length === 0) return parsed;\n for (const e of parsed.errors) {\n input.errors.push({ file: e.file?.fileName ?? \"tsconfig\", message: String(e.messageText) });\n }\n return null;\n}\n\nfunction collectToolSpecsFromProgram(input: {\n program: ts.Program;\n typeChecker: ts.TypeChecker;\n projectPath: string;\n warnings: Array<{ file: string; message: string }>;\n configFileSet: Set<string>;\n specs: FunctionToolSpec[];\n}): void {\n for (const sourceFile of input.program.getSourceFiles()) {\n const fileName = sourceFile.fileName;\n if (fileName.includes(\"node_modules\") || fileName.endsWith(\".d.ts\")) continue;\n if (!input.configFileSet.has(path.resolve(fileName))) continue;\n\n ts.forEachChild(sourceFile, (node) => {\n const spec = toFunctionToolSpec({\n node,\n sourceFile,\n fileName,\n projectPath: input.projectPath,\n typeChecker: input.typeChecker,\n warnings: input.warnings,\n });\n if (spec) input.specs.push(spec);\n });\n }\n}\n\nfunction toFunctionToolSpec(input: {\n node: ts.Node;\n sourceFile: ts.SourceFile;\n fileName: string;\n projectPath: string;\n typeChecker: ts.TypeChecker;\n warnings: Array<{ file: string; message: string }>;\n}): FunctionToolSpec | null {\n const decl = getExportedFunctionDeclaration(input.node, input.sourceFile);\n if (!decl || !decl.name) return null;\n const host = getJSDocHost(decl.func);\n if (!hasToolTag(host)) return null;\n const jsDoc = getJSDocComments(host);\n const description = getDescription(jsDoc, decl.name);\n if (!description) {\n input.warnings.push({\n file: input.fileName,\n message: `Tool ${decl.name}: missing description, using humanized name`,\n });\n }\n const sideEffect = getEffect(host);\n const onWarn = (msg: string) =>\n input.warnings.push({ file: input.fileName, message: `${decl.name}: ${msg}` });\n const { schema } = buildInputSchemaFromParams(decl.func, input.typeChecker, onWarn);\n const outputSchema = buildOutputSchemaFromReturnType(decl.func, input.typeChecker, onWarn);\n const sourcePath = path.relative(input.projectPath, input.fileName) || path.basename(input.fileName);\n const toolName = pathToToolName(sourcePath, decl.name);\n\n return {\n kind: FUNCTION_KIND,\n name: toolName,\n description: description || humanize(decl.name),\n inputSchema: normalizeInputSchema(schema),\n outputSchema,\n _meta: { hitl: { sideEffect } },\n sourcePath,\n exportName: decl.name,\n };\n}\n\nfunction normalizeInputSchema(schema: unknown): object {\n return Object.keys((schema as { properties?: object }).properties ?? {}).length > 0\n ? (schema as object)\n : { type: \"object\", properties: {} };\n}\n\nfunction resolveGlob(projectPath: string, patterns: string[]): string[] {\n const result: string[] = [];\n const seen = new Set<string>();\n const add = (f: string) => {\n const abs = path.resolve(f);\n if (f.endsWith(\".ts\") && !f.endsWith(\".d.ts\") && !seen.has(abs)) {\n seen.add(abs);\n result.push(abs);\n }\n };\n for (const p of patterns) {\n const full = path.join(projectPath, p);\n if (full.includes(\"*\")) {\n const baseDir = full.replace(/\\*\\*\\/.*$/, \"\").replace(/\\*.*$/, \"\").replace(/\\/?$/, \"\") || \".\";\n const dir = path.resolve(projectPath, baseDir);\n if (fs.existsSync(dir)) walk(dir, add);\n } else {\n const resolved = path.resolve(projectPath, full);\n if (fs.existsSync(resolved)) {\n if (fs.statSync(resolved).isFile()) add(resolved);\n else walk(resolved, add);\n }\n }\n }\n if (result.length > 0) return result;\n const srcDir = path.join(projectPath, \"src\");\n if (fs.existsSync(srcDir)) return walkCollect(srcDir);\n return [];\n}\n\nfunction walkCollect(dir: string): string[] {\n const out: string[] = [];\n walk(dir, (fullPath) => {\n if (fullPath.endsWith(\".ts\") && !fullPath.endsWith(\".d.ts\")) out.push(path.resolve(fullPath));\n });\n return out;\n}\n\nconst SKIP_DIRS = new Set([\"node_modules\", \"generated\", \"dist\"]);\n\nfunction walk(dir: string, visit: (fullPath: string) => void): void {\n try {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const e of entries) {\n const full = path.join(dir, e.name);\n if (e.isDirectory() && !SKIP_DIRS.has(e.name)) walk(full, visit);\n else if (e.isFile()) visit(full);\n }\n } catch {\n // ignore\n }\n}\n\nfunction getExportedFunctionDeclaration(\n node: ts.Node,\n _sourceFile: ts.SourceFile,\n): { func: ts.FunctionDeclaration | ts.ArrowFunction | ts.FunctionExpression; name: string } | null {\n if (ts.isFunctionDeclaration(node) && node.name) {\n const exported = (ts.getModifiers(node) ?? []).some((m) => m.kind === ts.SyntaxKind.ExportKeyword);\n if (exported) return { func: node, name: node.name.getText() };\n return null;\n }\n if (ts.isVariableStatement(node)) {\n const exported = (ts.getModifiers(node) ?? []).some((m) => m.kind === ts.SyntaxKind.ExportKeyword);\n if (!exported) return null;\n for (const decl of node.declarationList.declarations) {\n let init = decl.initializer;\n while (init && (ts.isParenthesizedExpression(init) || ts.isAsExpression(init)))\n init = init.expression;\n if (init && ts.isArrowFunction(init)) {\n const name = (decl.name as ts.Identifier).getText();\n return { func: init, name };\n }\n if (init && ts.isFunctionExpression(init)) {\n const name = (decl.name as ts.Identifier).getText();\n return { func: init, name };\n }\n }\n }\n return null;\n}\n\nfunction getJSDocHost(node: ts.FunctionDeclaration | ts.ArrowFunction | ts.FunctionExpression): ts.Node {\n const parent = node.parent;\n if (ts.isVariableDeclaration(parent)) {\n const gp = parent.parent;\n if (ts.isVariableDeclarationList(gp) && gp.parent && ts.isVariableStatement(gp.parent)) return gp.parent;\n }\n return node as ts.Node;\n}\n\nfunction getJSDocComments(host: ts.Node): ts.JSDoc[] {\n const all = ts.getJSDocCommentsAndTags(host);\n return all.filter((t): t is ts.JSDoc => ts.isJSDoc(t));\n}\n\nfunction hasToolTag(host: ts.Node): boolean {\n const tags = ts.getJSDocTags(host);\n for (const tag of tags) {\n const name = (tag as { tagName?: ts.Identifier }).tagName?.getText() ?? \"\";\n if (name === \"tool\") return true;\n }\n const all = ts.getJSDocCommentsAndTags(host);\n for (const t of all) {\n if (ts.isJSDoc(t)) {\n const full = t.getFullText();\n if (full.includes(TOOL_TAG)) return true;\n }\n }\n return false;\n}\n\nfunction getDescription(jsDocs: ts.JSDoc[], fallbackName: string): string {\n for (const doc of jsDocs) {\n const comment = doc.comment;\n if (typeof comment === \"string\") {\n const first = comment.split(/\\n/)[0]?.trim() ?? \"\";\n if (first && !first.startsWith(\"@\")) return first;\n }\n if (Array.isArray(comment)) {\n const first = comment[0];\n if (first && typeof first === \"object\" && \"text\" in first) {\n const t = (first as { text: string }).text.trim();\n if (t && !t.startsWith(\"@\")) return t;\n }\n }\n const full = doc.getFullText();\n const match = full.match(/\\*\\s*@tool\\s+(.+?)(?=\\n|$|\\*\\/)/s);\n if (match?.[1]) return match[1].trim();\n }\n return \"\";\n}\n\nfunction getEffect(host: ts.Node): SideEffect {\n const tags = ts.getJSDocTags(host);\n for (const tag of tags) {\n const name = (tag as { tagName?: ts.Identifier }).tagName?.getText() ?? \"\";\n if (name === \"effect\") {\n const comment = (tag as ts.JSDocUnknownTag).comment;\n const v = (typeof comment === \"string\" ? comment : \"\").trim().toLowerCase();\n if (EFFECT_VALUES.includes(v as SideEffect)) return v as SideEffect;\n }\n }\n const all = ts.getJSDocCommentsAndTags(host);\n for (const t of all) {\n if (ts.isJSDoc(t)) {\n const full = t.getFullText();\n const match = full.match(/\\*\\s*@effect\\s+(\\w+)/);\n if (match && EFFECT_VALUES.includes(match[1] as SideEffect)) return match[1] as SideEffect;\n }\n }\n return \"none\";\n}\n\nfunction humanize(name: string): string {\n return name.replace(/([A-Z])/g, \" $1\").replace(/^./, (s) => s.toUpperCase()).trim();\n}\n\n/** Unified scan: (path, options) → DiscoverToolsResult. */\nexport function scan(\n projectPath: string,\n options: DiscoverToolsOptions = {},\n): Promise<DiscoverToolsResult> {\n const root = path.resolve(projectPath);\n const result = scanForTools({\n projectPath: root,\n include: options.include ?? [\"**/*.ts\"],\n tsconfigPath: options.tsconfigPath,\n });\n const specs = result.specs.map((s) => mcpSpecToToolSpec(s, root));\n return Promise.resolve({\n specs,\n errors: result.errors,\n warnings: result.warnings,\n });\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkJNIWNSCQ_cjs = require('./chunk-JNIWNSCQ.cjs');
3
+ var chunkLHKEJNKL_cjs = require('./chunk-LHKEJNKL.cjs');
4
4
  var chunkQEJF3KDV_cjs = require('./chunk-QEJF3KDV.cjs');
5
5
  var async_hooks = require('async_hooks');
6
6
  var path6 = require('path');
@@ -266,7 +266,7 @@ function generateExtensionManifest(projectRoot = process.cwd(), options = {}) {
266
266
  const root = path6__default.default.resolve(projectRoot);
267
267
  const outDir = path6__default.default.resolve(options.outDir ?? path6__default.default.join(root, "dist"));
268
268
  const kind = options.kind ?? "core";
269
- const { specs, errors } = chunkJNIWNSCQ_cjs.scanForTools({
269
+ const { specs, errors } = chunkLHKEJNKL_cjs.scanForTools({
270
270
  projectPath: root,
271
271
  include: options.include ?? ["**/*.ts"],
272
272
  tsconfigPath: options.tsconfigPath
@@ -355,5 +355,5 @@ exports.overrideWithConfig = overrideWithConfig;
355
355
  exports.registerExtension = registerExtension;
356
356
  exports.registerToolsFromManifest = registerToolsFromManifest;
357
357
  exports.resolveExtensionPackageRoot = resolveExtensionPackageRoot;
358
- //# sourceMappingURL=chunk-WO4LZKPQ.cjs.map
359
- //# sourceMappingURL=chunk-WO4LZKPQ.cjs.map
358
+ //# sourceMappingURL=chunk-OKKBKZWK.cjs.map
359
+ //# sourceMappingURL=chunk-OKKBKZWK.cjs.map