@easynet/agent-tool 1.0.86 → 1.0.87

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 (100) hide show
  1. package/README.md +1 -0
  2. package/dist/build.cjs +8 -9
  3. package/dist/build.js +3 -4
  4. package/dist/{chunk-6ORA3MNX.js → chunk-2YP4Q4BW.js} +4 -4
  5. package/dist/{chunk-6ORA3MNX.js.map → chunk-2YP4Q4BW.js.map} +1 -1
  6. package/dist/{chunk-PYCCJF7C.cjs → chunk-AGLGFQUW.cjs} +118 -7
  7. package/dist/chunk-AGLGFQUW.cjs.map +1 -0
  8. package/dist/{chunk-W2WJOS5Z.js → chunk-BBNQ6AWK.js} +6 -8
  9. package/dist/chunk-BBNQ6AWK.js.map +1 -0
  10. package/dist/{chunk-HEVWKBBQ.js → chunk-BDUSB6GT.js} +36 -6
  11. package/dist/chunk-BDUSB6GT.js.map +1 -0
  12. package/dist/{chunk-NEMGE573.js → chunk-IJVVH4JN.js} +3 -3
  13. package/dist/{chunk-NEMGE573.js.map → chunk-IJVVH4JN.js.map} +1 -1
  14. package/dist/{chunk-WUMLZERG.js → chunk-IVL4TBFB.js} +106 -4
  15. package/dist/chunk-IVL4TBFB.js.map +1 -0
  16. package/dist/{chunk-LHKEJNKL.cjs → chunk-JW4EMVTE.cjs} +38 -6
  17. package/dist/chunk-JW4EMVTE.cjs.map +1 -0
  18. package/dist/{chunk-V2RD4BHT.cjs → chunk-LKE7PMRB.cjs} +13 -13
  19. package/dist/{chunk-V2RD4BHT.cjs.map → chunk-LKE7PMRB.cjs.map} +1 -1
  20. package/dist/{chunk-5HSGVA6S.cjs → chunk-PJDINB7G.cjs} +35 -37
  21. package/dist/chunk-PJDINB7G.cjs.map +1 -0
  22. package/dist/{chunk-F4HS7H7K.cjs → chunk-QYY6PNIB.cjs} +4 -4
  23. package/dist/{chunk-F4HS7H7K.cjs.map → chunk-QYY6PNIB.cjs.map} +1 -1
  24. package/dist/{chunk-3D7XYAZO.js → chunk-SNN4QJ5Z.js} +3 -3
  25. package/dist/{chunk-3D7XYAZO.js.map → chunk-SNN4QJ5Z.js.map} +1 -1
  26. package/dist/{chunk-QCHMXVWZ.cjs → chunk-ZDEQREVL.cjs} +14 -14
  27. package/dist/{chunk-QCHMXVWZ.cjs.map → chunk-ZDEQREVL.cjs.map} +1 -1
  28. package/dist/index.cjs +256 -14
  29. package/dist/index.cjs.map +1 -1
  30. package/dist/index.js +258 -10
  31. package/dist/index.js.map +1 -1
  32. package/dist/{extension.cjs → sdk.cjs} +212 -11
  33. package/dist/sdk.cjs.map +1 -0
  34. package/dist/sdk.d.ts +17 -0
  35. package/dist/sdk.d.ts.map +1 -0
  36. package/dist/{extension.js → sdk.js} +183 -7
  37. package/dist/sdk.js.map +1 -0
  38. package/dist/tools/discoveryFactory.d.ts.map +1 -1
  39. package/dist/tools/function/scanner.d.ts.map +1 -1
  40. package/dist/tools/util/toolDescriptor.d.ts +1 -1
  41. package/dist/tools/util/toolDescriptor.d.ts.map +1 -1
  42. package/dist/utils/cli/index.cjs +23 -26
  43. package/dist/utils/cli/index.cjs.map +1 -1
  44. package/dist/utils/cli/index.js +9 -12
  45. package/dist/utils/cli/index.js.map +1 -1
  46. package/package.json +6 -20
  47. package/dist/api/main.cjs +0 -21
  48. package/dist/api/main.cjs.map +0 -1
  49. package/dist/api/main.d.ts +0 -6
  50. package/dist/api/main.d.ts.map +0 -1
  51. package/dist/api/main.js +0 -12
  52. package/dist/api/main.js.map +0 -1
  53. package/dist/chunk-5HSGVA6S.cjs.map +0 -1
  54. package/dist/chunk-AV7BE52O.cjs +0 -261
  55. package/dist/chunk-AV7BE52O.cjs.map +0 -1
  56. package/dist/chunk-HEVWKBBQ.js.map +0 -1
  57. package/dist/chunk-LHKEJNKL.cjs.map +0 -1
  58. package/dist/chunk-ODEHUAR4.js +0 -33
  59. package/dist/chunk-ODEHUAR4.js.map +0 -1
  60. package/dist/chunk-OPAXCS4C.js +0 -258
  61. package/dist/chunk-OPAXCS4C.js.map +0 -1
  62. package/dist/chunk-PYCCJF7C.cjs.map +0 -1
  63. package/dist/chunk-QEJF3KDV.cjs +0 -38
  64. package/dist/chunk-QEJF3KDV.cjs.map +0 -1
  65. package/dist/chunk-QXQ4477T.js +0 -49
  66. package/dist/chunk-QXQ4477T.js.map +0 -1
  67. package/dist/chunk-RZTTO5MQ.js +0 -65
  68. package/dist/chunk-RZTTO5MQ.js.map +0 -1
  69. package/dist/chunk-W2WJOS5Z.js.map +0 -1
  70. package/dist/chunk-WUMLZERG.js.map +0 -1
  71. package/dist/chunk-XPGHS4W7.cjs +0 -73
  72. package/dist/chunk-XPGHS4W7.cjs.map +0 -1
  73. package/dist/chunk-ZDSZHEQU.cjs +0 -52
  74. package/dist/chunk-ZDSZHEQU.cjs.map +0 -1
  75. package/dist/config/index.d.ts +0 -12
  76. package/dist/config/index.d.ts.map +0 -1
  77. package/dist/config/ref.d.ts +0 -9
  78. package/dist/config/ref.d.ts.map +0 -1
  79. package/dist/core/index.cjs +0 -20
  80. package/dist/core/index.cjs.map +0 -1
  81. package/dist/core/index.d.ts +0 -7
  82. package/dist/core/index.d.ts.map +0 -1
  83. package/dist/core/index.js +0 -3
  84. package/dist/core/index.js.map +0 -1
  85. package/dist/core/runtime.cjs +0 -26
  86. package/dist/core/runtime.cjs.map +0 -1
  87. package/dist/core/runtime.d.ts +0 -12
  88. package/dist/core/runtime.d.ts.map +0 -1
  89. package/dist/core/runtime.js +0 -5
  90. package/dist/core/runtime.js.map +0 -1
  91. package/dist/extension.cjs.map +0 -1
  92. package/dist/extension.d.ts +0 -6
  93. package/dist/extension.d.ts.map +0 -1
  94. package/dist/extension.js.map +0 -1
  95. package/dist/security.cjs +0 -193
  96. package/dist/security.cjs.map +0 -1
  97. package/dist/security.d.ts +0 -6
  98. package/dist/security.d.ts.map +0 -1
  99. package/dist/security.js +0 -182
  100. package/dist/security.js.map +0 -1
@@ -1,261 +0,0 @@
1
- 'use strict';
2
-
3
- var chunkF4HS7H7K_cjs = require('./chunk-F4HS7H7K.cjs');
4
- var chunk5HSGVA6S_cjs = require('./chunk-5HSGVA6S.cjs');
5
- var chunkUUNG3GL3_cjs = require('./chunk-UUNG3GL3.cjs');
6
- var chunkV2RD4BHT_cjs = require('./chunk-V2RD4BHT.cjs');
7
- var agentCommon = require('@easynet/agent-common');
8
- var tools = require('@langchain/core/tools');
9
- var url = require('url');
10
- var path = require('path');
11
- var fs = require('fs');
12
-
13
- var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
14
- function getArgsSchemaIfWrapped(inputSchema) {
15
- const s = inputSchema;
16
- if (s?.type !== "object" || !s.properties || typeof s.properties !== "object") return null;
17
- const args = s.properties.args;
18
- if (args != null && typeof args === "object" && args.type === "object" && args.properties != null) {
19
- return args;
20
- }
21
- return null;
22
- }
23
- function hasArgsWrapper(inputSchema) {
24
- return getArgsSchemaIfWrapped(inputSchema) !== null;
25
- }
26
- function schemaForLangChain(inputSchema) {
27
- const wrapped = getArgsSchemaIfWrapped(inputSchema);
28
- if (wrapped !== null) return wrapped;
29
- return inputSchema;
30
- }
31
- function buildIntent(toolName, inputSchema, args) {
32
- return {
33
- tool: toolName,
34
- args: hasArgsWrapper(inputSchema) ? { args } : args,
35
- purpose: chunkV2RD4BHT_cjs.LANGCHAIN_KIND
36
- };
37
- }
38
- function normalizeArgs(args) {
39
- return agentCommon.stripNullishObjectFields(args ?? {});
40
- }
41
- function serializeToolResult(result) {
42
- if (result.ok) {
43
- return typeof result.result === "string" ? result.result : JSON.stringify(result.result);
44
- }
45
- const err = result.error;
46
- const message = err?.message ?? "Tool failed";
47
- const details = err?.details;
48
- return JSON.stringify(
49
- details != null ? { error: message, details } : { error: message }
50
- );
51
- }
52
- var DEFAULT_CTX_FACTORY = () => ({
53
- requestId: `lc-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,
54
- taskId: `task-${Date.now()}`,
55
- permissions: [
56
- "read:web",
57
- "read:fs",
58
- "write:fs",
59
- "read:db",
60
- "write:db",
61
- "network",
62
- "workflow",
63
- "danger:destructive"
64
- ]
65
- });
66
- var LangChainToolsHub = class {
67
- constructor(runtime, ctxFactory = DEFAULT_CTX_FACTORY) {
68
- this.runtime = runtime;
69
- this.ctxFactory = ctxFactory;
70
- }
71
- /**
72
- * Returns all registered tools as LangChain StructuredTool[].
73
- * Each tool invokes the runtime through the full pipeline (policy, HITL, etc.).
74
- */
75
- getLangChainTools() {
76
- const registry = this.runtime.getRegistry();
77
- const specs = registry.snapshot();
78
- return specs.map((spec) => this.specToLangChainTool(spec));
79
- }
80
- /**
81
- * Returns LangChain tools for a subset of tools (by name or query).
82
- */
83
- getLangChainToolsForNames(toolNames) {
84
- const registry = this.runtime.getRegistry();
85
- const set = new Set(toolNames);
86
- const specs = registry.snapshot().filter((s) => set.has(s.name));
87
- return specs.map((spec) => this.specToLangChainTool(spec));
88
- }
89
- specToLangChainTool(spec) {
90
- const runtime = this.runtime;
91
- const ctxFactory = this.ctxFactory;
92
- const enriched = chunkUUNG3GL3_cjs.enrichSpecWithCanonicalSchema(spec);
93
- const schema = schemaForLangChain(enriched.inputSchema);
94
- return new tools.DynamicStructuredTool({
95
- name: spec.name,
96
- description: spec.description ?? `Tool: ${spec.name}`,
97
- schema,
98
- func: async (args) => {
99
- const normalizedArgs = normalizeArgs(args);
100
- const intent = buildIntent(spec.name, enriched.inputSchema, normalizedArgs);
101
- const ctx = ctxFactory();
102
- const result = await runtime.invoke(intent, ctx);
103
- return serializeToolResult(result);
104
- }
105
- });
106
- }
107
- };
108
- function mergeHostLists(a, b) {
109
- const seen = /* @__PURE__ */ new Set();
110
- const out = [];
111
- for (const list of [a ?? [], b ?? []]) {
112
- for (const h of list) {
113
- if (!seen.has(h)) {
114
- seen.add(h);
115
- out.push(h);
116
- }
117
- }
118
- }
119
- return out;
120
- }
121
- function resolveEmbeddedToolConfigPath() {
122
- const moduleDir = path.dirname(url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('chunk-AV7BE52O.cjs', document.baseURI).href))));
123
- const candidates = [
124
- path.resolve(moduleDir, "../../config/tool.yaml"),
125
- // src/api -> config
126
- path.resolve(moduleDir, "../config/tool.yaml"),
127
- // dist/* -> config
128
- path.resolve(process.cwd(), "config/tool.yaml")
129
- // fallback for local app runtime
130
- ];
131
- for (const candidate of candidates) {
132
- if (fs.existsSync(candidate)) return candidate;
133
- }
134
- return candidates[0];
135
- }
136
- var EMBEDDED_TOOL_CONFIG_PATH = resolveEmbeddedToolConfigPath();
137
- function collectExtensionEmbeddedDefaults(exts) {
138
- const merged = {};
139
- for (const ext of exts) {
140
- const configPath = [path.resolve(ext.packageRoot, "dist/config/tool.yaml"), path.resolve(ext.packageRoot, "config/tool.yaml")].find(
141
- fs.existsSync
142
- ) ?? "";
143
- if (!configPath) continue;
144
- try {
145
- const toolDefaults = chunk5HSGVA6S_cjs.loadToolConfig(configPath).toolDefaults ?? {};
146
- if (Object.keys(toolDefaults).length === 0) continue;
147
- const manifest = chunkF4HS7H7K_cjs.loadExtensionManifest(ext.packageRoot);
148
- const ownToolNames = /* @__PURE__ */ new Set();
149
- for (const e of manifest.entries) {
150
- if (e.name) ownToolNames.add(e.name);
151
- if (e.sourcePath) {
152
- ownToolNames.add(e.sourcePath.replace(/^src\//, "").replace(/\//g, "."));
153
- }
154
- }
155
- for (const [k, v] of Object.entries(toolDefaults)) {
156
- if (ownToolNames.has(k)) {
157
- merged[k] = v;
158
- }
159
- }
160
- } catch {
161
- }
162
- }
163
- return merged;
164
- }
165
- function loadMergedToolConfig(overridePath) {
166
- const baseConfig = chunk5HSGVA6S_cjs.loadToolConfig(EMBEDDED_TOOL_CONFIG_PATH);
167
- if (!overridePath) return baseConfig;
168
- const overrideConfig = chunk5HSGVA6S_cjs.loadToolConfig(overridePath);
169
- return agentCommon.deepMerge({}, baseConfig, overrideConfig);
170
- }
171
- function runtimeOptionsFromConfig(opts, toolConfig, configPathForResolve, extensionEmbeddedDefaults) {
172
- const coreTools = opts.coreTools ?? { sandboxRoot: process.cwd(), allowedHosts: [], enableSandboxValidation: false };
173
- {
174
- const updates = {};
175
- if (toolConfig.sandboxedPath && typeof toolConfig.sandboxedPath === "string") {
176
- updates.sandboxRoot = chunk5HSGVA6S_cjs.resolveSandboxedPath(configPathForResolve, toolConfig.sandboxedPath);
177
- }
178
- if (typeof toolConfig.enableSandboxValidation === "boolean") {
179
- updates.enableSandboxValidation = toolConfig.enableSandboxValidation;
180
- } else if (coreTools.enableSandboxValidation == null) {
181
- updates.enableSandboxValidation = false;
182
- }
183
- updates.allowedHosts = mergeHostLists(coreTools.allowedHosts, toolConfig.allowedHosts);
184
- updates.blockedHosts = mergeHostLists(coreTools.blockedHosts, toolConfig.blockedHosts);
185
- if (Array.isArray(toolConfig.blockedCidrs) && toolConfig.blockedCidrs.length > 0) {
186
- updates.blockedCidrs = toolConfig.blockedCidrs;
187
- } else if (coreTools.blockedCidrs?.length) {
188
- updates.blockedCidrs = coreTools.blockedCidrs;
189
- }
190
- let hasToolDefaults = false;
191
- const flatOverrides = {
192
- ...extensionEmbeddedDefaults,
193
- ...coreTools.toolOverrides
194
- };
195
- if (Object.keys(extensionEmbeddedDefaults).length > 0) hasToolDefaults = true;
196
- if (toolConfig.toolDefaults != null && Object.keys(toolConfig.toolDefaults).length > 0) {
197
- Object.assign(flatOverrides, toolConfig.toolDefaults);
198
- hasToolDefaults = true;
199
- }
200
- const packageDefaults = { ...coreTools.packageDefaults };
201
- if (toolConfig.packageToolDefaults != null && Object.keys(toolConfig.packageToolDefaults).length > 0) {
202
- for (const [descriptor, pkgConfig] of Object.entries(toolConfig.packageToolDefaults)) {
203
- const prefix = descriptor.startsWith("file:") ? chunk5HSGVA6S_cjs.fileDescriptorToPackagePrefix(descriptor) : chunk5HSGVA6S_cjs.npmDescriptorToPackagePrefixWithVersion(descriptor);
204
- if (!prefix) continue;
205
- const pkgDefaults = pkgConfig?.defaults != null && typeof pkgConfig.defaults === "object" && !Array.isArray(pkgConfig.defaults) ? pkgConfig.defaults : {};
206
- if (Object.keys(pkgDefaults).length > 0) {
207
- packageDefaults[prefix] = pkgDefaults;
208
- }
209
- const toolConfigs = pkgConfig?.tools != null && typeof pkgConfig.tools === "object" && !Array.isArray(pkgConfig.tools) ? pkgConfig.tools : {};
210
- for (const [toolName, config] of Object.entries(toolConfigs)) {
211
- if (config != null && typeof config === "object") {
212
- hasToolDefaults = true;
213
- flatOverrides[`${prefix}::${toolName}`] = { ...pkgDefaults, ...config };
214
- }
215
- }
216
- }
217
- if (Object.keys(packageDefaults).length > 0) {
218
- updates.packageDefaults = packageDefaults;
219
- }
220
- }
221
- if (hasToolDefaults) {
222
- updates.toolOverrides = flatOverrides;
223
- }
224
- if (Object.keys(updates).length > 0) return { ...opts, coreTools: { ...coreTools, ...updates } };
225
- }
226
- return { ...opts, coreTools };
227
- }
228
- function buildRuntimeAndHub(options = {}) {
229
- const configPathForResolve = options.configFilePath ?? EMBEDDED_TOOL_CONFIG_PATH;
230
- const mergedToolConfig = loadMergedToolConfig(options.configFilePath);
231
- const extensionEmbeddedDefaults = collectExtensionEmbeddedDefaults(
232
- chunk5HSGVA6S_cjs.loadAllExtensionsFromToolYamlSync(configPathForResolve)
233
- );
234
- const runtimeOpts = runtimeOptionsFromConfig(options, mergedToolConfig, configPathForResolve, extensionEmbeddedDefaults);
235
- const { runtime } = chunk5HSGVA6S_cjs.createRuntimeFromConfigSync(runtimeOpts);
236
- const hub = new LangChainToolsHub(runtime);
237
- return { runtime, hub, mergedToolConfig };
238
- }
239
- function createLangChainAgentTools(options) {
240
- const opts = typeof options === "string" ? { configFilePath: options } : options ?? {};
241
- const { runtime, hub, mergedToolConfig } = buildRuntimeAndHub(opts);
242
- const names = Array.isArray(mergedToolConfig.tools) ? mergedToolConfig.tools : [];
243
- if (names.length > 0) {
244
- const registryNames = runtime.getRegistry().snapshot().map((s) => s.name);
245
- const allBarePackages = names.every((n) => chunk5HSGVA6S_cjs.isBarePackageDescriptor(String(n)));
246
- if (allBarePackages) return hub.getLangChainTools();
247
- return hub.getLangChainToolsForNames(chunk5HSGVA6S_cjs.expandToolDescriptorsToRegistryNames(names, registryNames));
248
- }
249
- return hub.getLangChainTools();
250
- }
251
-
252
- // src/api/register-tools.ts
253
- function createAgentTools(options) {
254
- const tools = createLangChainAgentTools(options);
255
- agentCommon.getDefaultAgentContext().set(agentCommon.AgentContextTokens.Tools, tools);
256
- return tools;
257
- }
258
-
259
- exports.createAgentTools = createAgentTools;
260
- //# sourceMappingURL=chunk-AV7BE52O.cjs.map
261
- //# sourceMappingURL=chunk-AV7BE52O.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/api/adapters/LangChainToolsHub.ts","../src/api/createAgentTools.ts","../src/api/register-tools.ts"],"names":["LANGCHAIN_KIND","stripNullishObjectFields","enrichSpecWithCanonicalSchema","DynamicStructuredTool","dirname","fileURLToPath","resolve","existsSync","loadToolConfig","loadExtensionManifest","deepMerge","resolveSandboxedPath","fileDescriptorToPackagePrefix","npmDescriptorToPackagePrefixWithVersion","loadAllExtensionsFromToolYamlSync","createRuntimeFromConfigSync","isBarePackageDescriptor","expandToolDescriptorsToRegistryNames","getDefaultAgentContext","AgentContextTokens"],"mappings":"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","file":"chunk-AV7BE52O.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 createAgentTools() from @easynet/agent-tool, which loads from tool.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 * Standalone tool creation functions. Each function:\n * - Uses the embedded config/tool.yaml as the default base.\n * - If a configFilePath is provided, merges it on top of the default.\n * - If no options are provided at all, behaves as if only the embedded default is used.\n *\n * Public module API uses createAgentTools() in register-tools.ts.\n * This file keeps internal builders for LangChain / MCP / OpenAPI outputs.\n */\n\nimport { loadToolConfig, resolveSandboxedPath } from \"../tools/util/toolConfig.js\";\nimport type { ToolYamlShape } from \"../tools/util/toolConfig.js\";\nimport { loadExtensionManifest } from \"./extension/registerFromManifest.js\";\nimport {\n expandToolDescriptorsToRegistryNames,\n isBarePackageDescriptor,\n npmDescriptorToPackagePrefixWithVersion,\n fileDescriptorToPackagePrefix,\n} from \"../tools/util/toolDescriptor.js\";\nimport { deepMerge } from \"@easynet/agent-common\";\nimport { createRuntimeFromConfigSync, loadAllExtensionsFromToolYamlSync } from \"./runtimeFromConfig.js\";\nimport type { CreateRuntimeOptions, LoadedExtension } from \"./runtimeFromConfig.js\";\nimport { LangChainToolsHub } from \"./adapters/LangChainToolsHub.js\";\nimport { createMCPServer, type MCPServerOptions, type McpServer } from \"./expose/mcpServer.js\";\nimport {\n createOpenAPIHttpServer,\n type OpenAPIExpressApp,\n type OpenAPIHttpServerOptions,\n} from \"./expose/openapiHttp.js\";\nimport type { StructuredToolInterface } from \"@langchain/core/tools\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, resolve } from \"node:path\";\nimport { existsSync } from \"node:fs\";\n\nexport interface CreateAgentToolsOptions extends CreateRuntimeOptions {\n /** Path to an override tool.yaml; its values are merged on top of the embedded default config/tool.yaml */\n configFilePath?: string;\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 resolveEmbeddedToolConfigPath(): string {\n const moduleDir = dirname(fileURLToPath(import.meta.url));\n const candidates = [\n resolve(moduleDir, \"../../config/tool.yaml\"), // src/api -> config\n resolve(moduleDir, \"../config/tool.yaml\"), // dist/* -> config\n resolve(process.cwd(), \"config/tool.yaml\"), // fallback for local app runtime\n ];\n for (const candidate of candidates) {\n if (existsSync(candidate)) return candidate;\n }\n return candidates[0]!;\n}\n\nconst EMBEDDED_TOOL_CONFIG_PATH = resolveEmbeddedToolConfigPath();\n\n/**\n * For each loaded extension, load its embedded config/tool.yaml (layer 2) and collect\n * the toolDefaults into a flat map. Later entries in the list win over earlier ones.\n *\n * Security constraint: each extension's embedded config may only set defaults for tools\n * that belong to that extension (verified against its own manifest). Keys that reference\n * tools from other extensions or global config fields are silently ignored.\n */\nfunction collectExtensionEmbeddedDefaults(\n exts: LoadedExtension[],\n): Record<string, Record<string, unknown>> {\n const merged: Record<string, Record<string, unknown>> = {};\n for (const ext of exts) {\n // Prefer dist/config/tool.yaml (published package); fall back to config/tool.yaml (local dev).\n const configPath =\n [resolve(ext.packageRoot, \"dist/config/tool.yaml\"), resolve(ext.packageRoot, \"config/tool.yaml\")].find(\n existsSync,\n ) ?? \"\";\n if (!configPath) continue;\n try {\n const toolDefaults = loadToolConfig(configPath).toolDefaults ?? {};\n if (Object.keys(toolDefaults).length === 0) continue;\n\n // Build the set of short names this extension owns from its manifest.\n // Include both the explicit name field and the dot-path derived from sourcePath\n // (e.g. \"listDir\" and \"fs.listDir\" for src/fs/listDir) so that config keys in\n // either format are accepted.\n const manifest = loadExtensionManifest(ext.packageRoot);\n const ownToolNames = new Set<string>();\n for (const e of manifest.entries) {\n if (e.name) ownToolNames.add(e.name);\n if (e.sourcePath) {\n ownToolNames.add(e.sourcePath.replace(/^src\\//, \"\").replace(/\\//g, \".\"));\n }\n }\n\n for (const [k, v] of Object.entries(toolDefaults)) {\n // Only allow keys that are short names of tools this extension registers.\n if (ownToolNames.has(k)) {\n merged[k] = v;\n }\n }\n } catch {\n // skip malformed extension config or missing manifest\n }\n }\n return merged;\n}\n\nfunction loadMergedToolConfig(overridePath?: string): ToolYamlShape {\n const baseConfig = loadToolConfig(EMBEDDED_TOOL_CONFIG_PATH);\n if (!overridePath) return baseConfig;\n const overrideConfig = loadToolConfig(overridePath);\n return deepMerge({} as ToolYamlShape, baseConfig, overrideConfig);\n}\n\nfunction runtimeOptionsFromConfig(\n opts: CreateAgentToolsOptions,\n toolConfig: ToolYamlShape,\n configPathForResolve: string,\n extensionEmbeddedDefaults: Record<string, Record<string, unknown>>,\n): CreateRuntimeOptions {\n const coreTools = opts.coreTools ?? { sandboxRoot: process.cwd(), allowedHosts: [], enableSandboxValidation: false };\n {\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(configPathForResolve, 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 // Priority (low → high): extension embedded (layer 2) < programmatic coreTools < layer 1+3 toolDefaults\n const flatOverrides: Record<string, Record<string, unknown>> = {\n ...extensionEmbeddedDefaults,\n ...coreTools.toolOverrides,\n };\n if (Object.keys(extensionEmbeddedDefaults).length > 0) hasToolDefaults = true;\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) return { ...opts, coreTools: { ...coreTools, ...updates } };\n }\n return { ...opts, coreTools };\n}\n\n/**\n * Build a ready-to-use runtime + hub from options.\n * - No options → embedded default config/tool.yaml only.\n * - options.configFilePath → override merged on top of embedded default.\n */\nfunction buildRuntimeAndHub(options: CreateAgentToolsOptions = {}): {\n runtime: ReturnType<typeof createRuntimeFromConfigSync>[\"runtime\"];\n hub: LangChainToolsHub;\n mergedToolConfig: ToolYamlShape;\n} {\n const configPathForResolve = options.configFilePath ?? EMBEDDED_TOOL_CONFIG_PATH;\n const mergedToolConfig = loadMergedToolConfig(options.configFilePath);\n // Collect layer-2 defaults from each extension's embedded config/tool.yaml.\n // loadAllExtensionsFromToolYamlSync is cheap here (require() is cached by Node.js).\n const extensionEmbeddedDefaults = collectExtensionEmbeddedDefaults(\n loadAllExtensionsFromToolYamlSync(configPathForResolve),\n );\n const runtimeOpts = runtimeOptionsFromConfig(options, mergedToolConfig, configPathForResolve, extensionEmbeddedDefaults);\n const { runtime } = createRuntimeFromConfigSync(runtimeOpts);\n const hub = new LangChainToolsHub(runtime);\n return { runtime, hub, mergedToolConfig };\n}\n\n/**\n * Internal: create LangChain tools from config/runtime.\n *\n * - No argument → uses embedded default config/tool.yaml.\n * - options.configFilePath → merged on top of embedded default.\n * - All other CreateAgentToolsOptions (coreTools, etc.) are applied as programmatic overrides.\n *\n * @example\n * Internal helper consumed by createAgentTools().\n */\nexport function createLangChainAgentTools(\n options?: CreateAgentToolsOptions | string,\n): StructuredToolInterface[] {\n const opts: CreateAgentToolsOptions =\n typeof options === \"string\" ? { configFilePath: options } : options ?? {};\n const { runtime, hub, mergedToolConfig } = buildRuntimeAndHub(opts);\n\n const names = Array.isArray(mergedToolConfig.tools) ? mergedToolConfig.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) return hub.getLangChainTools();\n return hub.getLangChainToolsForNames(expandToolDescriptorsToRegistryNames(names, registryNames));\n }\n return hub.getLangChainTools();\n}\n\n/**\n * Internal: create an MCP server from tool config.\n *\n * - No argument → uses embedded default config/tool.yaml.\n * - options.configFilePath → merged on top of embedded default.\n * - options.mcp → passed to the MCP server (name, version, execContextFactory).\n *\n * @example\n * Internal helper consumed by createAgentTools() expose flows.\n */\nexport async function createMcpServer(\n options?: (CreateAgentToolsOptions & MCPServerOptions) | string,\n): Promise<McpServer> {\n const opts: CreateAgentToolsOptions & MCPServerOptions =\n typeof options === \"string\" ? { configFilePath: options } : options ?? {};\n const { runtime, mergedToolConfig } = buildRuntimeAndHub(opts);\n const serverOpts: MCPServerOptions = {\n name: opts.name ?? mergedToolConfig.mcp?.name,\n version: opts.version ?? mergedToolConfig.mcp?.version,\n execContextFactory: opts.execContextFactory,\n };\n const { server } = await createMCPServer(runtime, serverOpts);\n return server;\n}\n\n/**\n * Internal: create an OpenAPI / Swagger HTTP server from tool config.\n *\n * - No argument → uses embedded default config/tool.yaml.\n * - options.configFilePath → merged on top of embedded default.\n * - options.port, host, basePath → passed to the HTTP server; tool.yaml openapi: section provides defaults.\n *\n * @example\n * Internal helper consumed by createAgentTools() expose flows.\n */\nexport async function createOpenAPIServer(\n options?: (CreateAgentToolsOptions & OpenAPIHttpServerOptions) | string,\n): Promise<OpenAPIExpressApp> {\n const opts: CreateAgentToolsOptions & OpenAPIHttpServerOptions =\n typeof options === \"string\" ? { configFilePath: options } : options ?? {};\n const { runtime, mergedToolConfig } = buildRuntimeAndHub(opts);\n const serverOpts: OpenAPIHttpServerOptions = {\n host: opts.host ?? mergedToolConfig.openapi?.host,\n port: opts.port ?? mergedToolConfig.openapi?.port,\n basePath: opts.basePath ?? mergedToolConfig.openapi?.basePath,\n execContextFactory: opts.execContextFactory,\n };\n return createOpenAPIHttpServer(runtime, serverOpts);\n}\n","import { AgentContextTokens, getDefaultAgentContext } from \"@easynet/agent-common\";\nimport { createLangChainAgentTools, type CreateAgentToolsOptions } from \"./createAgentTools.js\";\nimport type { StructuredToolInterface } from \"@langchain/core/tools\";\n\nexport interface CreateAgentToolsModuleOptions extends CreateAgentToolsOptions {}\n\n/**\n * Initialize LangChain agent tools and register them into the process-level singleton AgentContext.\n *\n * Sets:\n * - AgentContextTokens.Tools → StructuredToolInterface[]\n *\n * @example\n * ```ts\n * createAgentTools({ configFilePath: \"config/tool.yaml\" });\n * ```\n */\nexport function createAgentTools(options?: CreateAgentToolsModuleOptions): StructuredToolInterface[] {\n const tools = createLangChainAgentTools(options);\n getDefaultAgentContext().set(AgentContextTokens.Tools, tools);\n return tools;\n}\n"]}
@@ -1 +0,0 @@
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":["ts"],"mappings":";;;;;;;AASA,eAAsB,sBAAA,CACpB,UACA,QAAA,EACmB;AACnB,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,mBAAA,CAAoB,QAAA,EAAU,QAAA,EAAU,KAAK,CAAA;AACnD,EAAA,OAAO,KAAA;AACT;AAEA,eAAe,mBAAA,CACb,GAAA,EACA,QAAA,EACA,GAAA,EACe;AACf,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAM,IAAI,MAAM,OAAA,CAAQ,KAAK,EAAE,aAAA,EAAe,MAAM,CAAA;AACpD,IAAA,OAAA,GAAU,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACtB,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,WAAA,EAAa,EAAE,WAAA,EAAY;AAAA,MAC3B,MAAA,EAAQ,EAAE,MAAA;AAAO,KACnB,CAAE,CAAA;AAAA,EACJ,CAAA,CAAA,MAAQ;AACN,IAAA;AAAA,EACF;AACA,EAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,IAAA,KAAS,QAAQ,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA;AACtE,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,IAAI,CAAC,KAAA,CAAM,WAAA,IAAe,KAAA,CAAM,IAAA,KAAS,kBAAkB,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AACvF,IAAA,MAAM,oBAAoB,IAAA,CAAK,GAAA,EAAK,MAAM,IAAI,CAAA,EAAG,UAAU,GAAG,CAAA;AAAA,EAChE;AACF;AAGO,SAAS,cAAA,CAAe,YAAoB,WAAA,EAA6B;AAC9E,EAAA,MAAM,UAAA,GAAa,WAChB,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,CAClB,OAAA,CAAQ,4BAA4B,EAAE,CAAA;AACzC,EAAA,MAAM,WAAW,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA,CAAE,OAAO,OAAO,CAAA;AACrD,EAAA,OAAO,QAAA,CAAS,MAAA,KAAW,CAAA,GAAI,WAAA,GAAc,CAAA,EAAG,SAAS,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA;AACnF;ACrCO,SAAS,+BAAA,CACd,IAAA,EACA,WAAA,EACA,MAAA,EACQ;AACR,EAAA,MAAM,GAAA,GAAM,WAAA,CAAY,2BAAA,CAA4B,IAA+B,CAAA;AACnF,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAA,GAAS,uDAAuD,CAAA;AAChE,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,oBAAA,EAAsB,IAAA,EAAK;AAAA,EACtD;AACA,EAAA,IAAI,UAAA,GAAa,WAAA,CAAY,wBAAA,CAAyB,GAAG,CAAA;AAEzD,EAAA,IAAI,UAAA,CAAW,SAAA,IAAY,EAAG,OAAA,OAAc,SAAA,EAAW;AACrD,IAAA,MAAM,WAAY,UAAA,CAAgC,aAAA;AAClD,IAAA,IAAI,QAAA,GAAW,CAAC,CAAA,EAAG,UAAA,GAAa,SAAS,CAAC,CAAA;AAAA,EAC5C;AACA,EAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,UAAA,EAAY,WAAA,EAAa,MAAM,CAAA;AAC/D,EAAA,MAAM,QAAA,GACJ,OAAO,MAAA,KAAW,QAAA,IACjB,OAAkD,IAAA,KAAS,QAAA,IAC5D,MAAA,CAAO,IAAA,CAAM,MAAA,CAAmC,UAAA,IAAc,EAAE,EAAE,MAAA,GAAS,CAAA;AAC7E,EAAA,OAAO,WAAW,MAAA,GAAS,EAAE,IAAA,EAAM,QAAA,EAAU,sBAAsB,IAAA,EAAK;AAC1E;AAGO,SAAS,0BAAA,CACd,IAAA,EACA,WAAA,EACA,MAAA,EACwC;AACxC,EAAA,MAAM,aAAqC,EAAC;AAC5C,EAAA,MAAM,WAAqB,EAAC;AAE5B,EAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ;AAC3B,IAAA,OAAO,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,UAAA,EAAY,EAAC,EAAE,EAAG,QAAA,EAAU,EAAC,EAAE;AAAA,EACpE;AAEA,EAAA,KAAA,MAAW,KAAA,IAAS,KAAK,UAAA,EAAY;AACnC,IAAA,MAAM,IAAA,GAAQ,KAAA,CAAM,IAAA,CAAuB,OAAA,EAAQ;AACnD,IAAA,IAAI,KAAK,UAAA,CAAW,GAAG,CAAA,IAAK,IAAA,CAAK,UAAU,CAAA,EAAG;AAC9C,IAAA,MAAM,MAAO,KAAA,CAA2D,MAAA;AACxE,IAAA,MAAM,SAAA,GAAY,MACd,WAAA,CAAY,yBAAA,CAA0B,KAAK,KAAK,CAAA,GAChD,WAAA,CAAY,iBAAA,CAAkB,KAAK,CAAA;AACvC,IAAA,MAAM,aAAa,CAAC,CAAC,KAAA,CAAM,aAAA,IAAiB,MAAM,WAAA,KAAgB,MAAA;AAClE,IAAA,MAAM,UAAA,GAAa,gBAAA,CAAiB,SAAA,EAAW,WAAA,EAAa,MAAM,CAAA;AAClE,IAAA,UAAA,CAAW,IAAI,CAAA,GAAI,UAAA;AACnB,IAAA,IAAI,CAAC,UAAA,EAAY,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAAA,EACrC;AAIA,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AACzC,EAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,IAAA,MAAM,QAAA,GAAW,WAAW,CAAC,CAAA;AAC7B,IAAA,MAAM,KAAA,GAAQ,WAAW,QAAQ,CAAA;AAGjC,IAAA,IACE,KAAA,IACA,OAAO,KAAA,KAAU,QAAA,IACjB,KAAA,CAAM,IAAA,KAAS,QAAA,IACf,KAAA,CAAM,UAAA,IACN,OAAO,KAAA,CAAM,UAAA,KAAe,QAAA,EAC5B;AACA,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ;AAAA,UACN,IAAA,EAAM,QAAA;AAAA,UACN,YAAY,KAAA,CAAM,UAAA;AAAA,UAClB,GAAI,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,QAAQ,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,MAAA,GAAS,IAAI,EAAE,QAAA,EAAU,KAAA,CAAM,QAAA,KAAa,EAAC;AAAA,UACjG,GAAI,MAAM,oBAAA,KAAyB,MAAA,GAAY,EAAE,oBAAA,EAAsB,KAAA,CAAM,oBAAA,EAAqB,GAAI;AAAC,SACzG;AAAA,QACA,QAAA,EAAU,KAAA,CAAM,QAAA,IAAY;AAAC,OAC/B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,UAAA;AAAA,MACA,GAAI,QAAA,CAAS,MAAA,GAAS,IAAI,EAAE,QAAA,KAAa;AAAC,KAC5C;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,gBAAA,CACP,IAAA,EACA,WAAA,EACA,MAAA,EACQ;AACR,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,EAAA,IAAI,QAAWA,GAAA,CAAA,SAAA,CAAU,MAAA,EAAQ,OAAO,EAAE,MAAM,QAAA,EAAS;AACzD,EAAA,IAAI,QAAWA,GAAA,CAAA,SAAA,CAAU,MAAA,EAAQ,OAAO,EAAE,MAAM,QAAA,EAAS;AACzD,EAAA,IAAI,QAAWA,GAAA,CAAA,SAAA,CAAU,OAAA,EAAS,OAAO,EAAE,MAAM,SAAA,EAAU;AAC3D,EAAA,IAAI,QAAWA,GAAA,CAAA,SAAA,CAAU,cAAA,EAAgB,OAAO,EAAE,MAAM,SAAA,EAAU;AAClE,EAAA,IAAI,QAAWA,GAAA,CAAA,SAAA,CAAU,IAAA,EAAM,OAAO,EAAE,MAAM,MAAA,EAAO;AACrD,EAAA,IAAI,QAAWA,GAAA,CAAA,SAAA,CAAU,SAAA,IAAa,QAAWA,GAAA,CAAA,SAAA,CAAU,IAAA,SAAa,EAAC;AACzE,EAAA,IAAI,KAAA,GAAWA,GAAA,CAAA,SAAA,CAAU,GAAA,IAAO,KAAA,GAAWA,cAAU,OAAA,EAAS;AAC5D,IAAA,MAAA,GAAS,CAAA,iDAAA,CAAmD,CAAA;AAC5D,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,IAAI,IAAA,CAAK,WAAU,EAAG;AACpB,IAAA,MAAM,KAAA,GAAQ,IAAA;AACd,IAAA,MAAM,QAAQ,KAAA,CAAM,KAAA;AACpB,IAAA,MAAM,eAAe,KAAA,CAAM,MAAA;AAAA,MACzB,CAAC,CAAA,KAAM,EAAE,CAAA,CAAE,KAAA,GAAWA,cAAU,SAAA,CAAA,IAAc,EAAE,CAAA,CAAE,KAAA,GAAWA,GAAA,CAAA,SAAA,CAAU,IAAA;AAAA,KACzE;AACA,IAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG,OAAO,iBAAiB,YAAA,CAAa,CAAC,CAAA,EAAI,WAAA,EAAa,MAAM,CAAA;AAC5F,IAAA,IAAI,YAAA,CAAa,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAEvC,IAAA,MAAM,mBAA6B,EAAC;AACpC,IAAA,IAAI,iBAAA,GAAoB,IAAA;AACxB,IAAA,KAAA,MAAW,KAAK,YAAA,EAAc;AAC5B,MAAA,IAAI,CAAA,CAAE,KAAA,GAAWA,GAAA,CAAA,SAAA,CAAU,aAAA,EAAe;AACxC,QAAA,MAAM,GAAA,GAAM,CAAA;AACZ,QAAA,IAAI,OAAO,GAAA,CAAI,KAAA,KAAU,UAAU,gBAAA,CAAiB,IAAA,CAAK,IAAI,KAAK,CAAA;AAAA,MACpE,CAAA,MAAO;AACL,QAAA,iBAAA,GAAoB,KAAA;AACpB,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,iBAAA,IAAqB,gBAAA,CAAiB,MAAA,GAAS,CAAA,EAAG;AACpD,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,CAAC,GAAG,IAAI,GAAA,CAAI,gBAAgB,CAAC,CAAA,EAAE;AAAA,IAChE;AAGA,IAAA,IAAI,kBAAA,GAAqB,IAAA;AACzB,IAAA,KAAA,MAAW,KAAK,YAAA,EAAc;AAC5B,MAAA,IAAI,EAAE,CAAA,CAAE,KAAA,GAAWA,GAAA,CAAA,SAAA,CAAU,cAAA,CAAA,EAAiB;AAC5C,QAAA,kBAAA,GAAqB,KAAA;AACrB,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,kBAAA,EAAoB,OAAO,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,EACnD;AAGA,EAAA,IAAI,KAAA,GAAWA,cAAU,aAAA,EAAe;AACtC,IAAA,MAAM,GAAA,GAAM,IAAA;AACZ,IAAA,IAAI,OAAO,GAAA,CAAI,KAAA,KAAU,QAAA,EAAU;AACjC,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,MAAM,CAAC,GAAA,CAAI,KAAK,CAAA,EAAE;AAAA,IAC7C;AACA,IAAA,OAAO,EAAE,MAAM,QAAA,EAAS;AAAA,EAC1B;AAEA,EAAA,IAAI,WAAA,CAAY,WAAA,CAAY,IAAI,CAAA,EAAG;AACjC,IAAA,MAAM,OAAA,GAAU,IAAA;AAChB,IAAA,MAAM,WAAW,OAAA,CAAQ,aAAA;AACzB,IAAA,MAAM,QAAA,GAAW,WAAW,CAAC,CAAA;AAC7B,IAAA,MAAM,QAAQ,QAAA,GAAW,gBAAA,CAAiB,UAAU,WAAA,EAAa,MAAM,IAAI,EAAC;AAC5E,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,MAAA,GAAS,KAAA,GAAQ,EAAC,EAAE;AAAA,EACxE;AAEA,EAAA,MAAM,GAAA,GAAM,WAAA,CAAY,YAAA,CAAa,IAAI,CAAA;AACzC,EAAA,IAAI,GAAA,KAAQ,QAAA,EAAU,OAAO,EAAE,MAAM,QAAA,EAAS;AAC9C,EAAA,IAAI,GAAA,KAAQ,QAAA,EAAU,OAAO,EAAE,MAAM,QAAA,EAAS;AAC9C,EAAA,IAAI,GAAA,KAAQ,SAAA,EAAW,OAAO,EAAE,MAAM,SAAA,EAAU;AAChD,EAAA,IAAI,GAAA,CAAI,QAAA,CAAS,IAAI,CAAA,EAAG;AACtB,IAAA,MAAM,QAAQ,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,EAAE,EAAE,IAAA,EAAK;AACpC,IAAA,MAAM,QAAA,GACJ,KAAA,KAAU,QAAA,GAAW,EAAE,IAAA,EAAM,QAAA,EAAkB,GAAI,KAAA,KAAU,QAAA,GAAW,EAAE,IAAA,EAAM,QAAA,KAAsB,EAAC;AACzG,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,QAAA,EAAS;AAAA,EAC1C;AAEA,EAAA,IAAI,KAAK,aAAA,IAAiB,IAAA,CAAK,aAAA,EAAc,CAAE,UAAU,CAAA,EAAG;AAC1D,IAAA,MAAM,KAAA,GAAQ,KAAK,aAAA,EAAc;AACjC,IAAA,MAAM,aAAqC,EAAC;AAC5C,IAAA,MAAM,WAAqB,EAAC;AAC5B,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,MAAM,OAAO,CAAA,CAAE,gBAAA;AACf,MAAA,MAAM,QAAA,GAAW,IAAA,GACb,WAAA,CAAY,iBAAA,CAAkB,IAAI,IAClC,WAAA,CAAY,yBAAA,CAA0B,CAAA,EAAI,CAAA,CAA+C,gBAAgB,CAAA;AAC7G,MAAA,MAAM,QAAA,GAAW,QAAWA,GAAA,CAAA,mBAAA,CAAoB,IAAI,IAAI,CAAC,CAAC,KAAK,aAAA,GAAgB,KAAA;AAC/E,MAAA,UAAA,CAAW,EAAE,IAAI,CAAA,GAAI,gBAAA,CAAiB,QAAA,EAAU,aAAa,MAAM,CAAA;AACnE,MAAA,IAAI,CAAC,QAAA,EAAU,QAAA,CAAS,IAAA,CAAK,EAAE,IAAI,CAAA;AAAA,IACrC;AACA,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,UAAA,EAAY,GAAI,QAAA,CAAS,MAAA,GAAS,EAAE,QAAA,EAAS,GAAI,EAAC,EAAG;AAAA,EAChF;AAEA,EAAA,MAAA,GAAS,CAAA,kBAAA,EAAqB,GAAG,CAAA,cAAA,CAAgB,CAAA;AACjD,EAAA,OAAO,EAAE,MAAM,QAAA,EAAS;AAC1B;;;AChMO,IAAM,aAAA,GAAgB;;;ACDtB,IAAM,UAAA,GAAa;AAGnB,IAAM,cAAA,GAAiB;;;ACHvB,IAAM,QAAA,GAAW;;;ACSxB,IAAM,cAAA,GAAiB,EAAE,IAAA,EAAM,QAAA,EAAmB,sBAAsB,IAAA,EAAK;AAEtE,SAAS,iBAAA,CAAkB,MAAmB,WAAA,EAAgC;AACnF,EAAA,MAAM,IAAA,GAAiB;AAAA,IACrB,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,OAAA,EAAS,OAAA;AAAA,IACT,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,WAAA,EAAa,KAAK,WAAA,IAAe,cAAA;AAAA,IACjC,cACE,cAAA,IAAkB,IAAA,IAAQ,IAAA,CAAK,YAAA,GAC3B,KAAK,YAAA,GACJ,qBAAA;AAAA,IACP,cAAc,EAAC;AAAA,IACf,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,GAAI,IAAA,CAAK,IAAA,KAAS,QAAA,IAAY,YAAA,IAAgB,IAAA,IAAQ,IAAA,CAAK,UAAA,GACvD,EAAE,QAAA,EAAU,IAAA,CAAK,UAAA,KACjB;AAAC,GACP;AACA,EAAA,IAAI,KAAK,IAAA,KAAS,aAAA,IAAiB,YAAA,IAAgB,IAAA,IAAQ,gBAAgB,IAAA,EAAM;AAC/E,IAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,MACX,GAAG,IAAA,CAAK,KAAA;AAAA,MACR,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,GAAI,WAAA,IAAe,EAAE,WAAA;AAAY,KACnC;AAAA,EACF;AACA,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,UAAA,IAAc,YAAA,IAAgB,QAAQ,WAAA,EAAa;AACnE,IAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,GAAG,IAAA,CAAK,OAAO,UAAA,EAAY,IAAA,CAAK,YAAY,WAAA,EAAY;AAAA,EACzE;AACA,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,QAAA,IAAY,YAAA,IAAgB,QAAQ,WAAA,EAAa;AACjE,IAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,GAAG,IAAA,CAAK,OAAO,UAAA,EAAY,IAAA,CAAK,YAAY,WAAA,EAAY;AAAA,EACzE;AACA,EAAA,OAAO,IAAA;AACT;;;AC9BA,IAAM,QAAA,GAAW,OAAA;AAEjB,IAAM,aAAA,GAA8B,CAAC,MAAA,EAAQ,aAAA,EAAe,kBAAkB,aAAa,CAAA;AAWpF,SAAS,aAAa,OAAA,EAId;AACb,EAAA,MAAM,WAAA,GAAmB,IAAA,CAAA,OAAA,CAAQ,OAAA,CAAQ,WAAW,CAAA;AACpD,EAAA,MAAM,YAAA,GACJ,OAAA,CAAQ,YAAA,IAAqB,IAAA,CAAA,IAAA,CAAK,aAAa,eAAe,CAAA;AAChE,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,CAAC,SAAS,CAAA;AAC7C,EAAA,MAAM,SAAmD,EAAC;AAC1D,EAAA,MAAM,WAAqD,EAAC;AAC5D,EAAA,MAAM,SAAS,qBAAA,CAAsB;AAAA,IACnC,WAAA;AAAA,IACA,YAAA;AAAA,IACA,OAAA;AAAA,IACA,MAEF,CAAC,CAAA;AACD,EAAA,IAAI,CAAC,QAAQ,OAAO,EAAE,OAAO,EAAC,EAAG,QAAQ,QAAA,EAAS;AAElD,EAAA,MAAM,OAAA,GAAa,GAAA,CAAA,aAAA,CAAc,MAAA,CAAO,SAAA,EAAW,OAAO,OAAO,CAAA;AACjE,EAAA,MAAM,WAAA,GAAc,QAAQ,cAAA,EAAe;AAC3C,EAAA,MAAM,QAA4B,EAAC;AACnC,EAAA,MAAM,aAAA,GAAgB,IAAI,GAAA,CAAI,MAAA,CAAO,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAAW,IAAA,CAAA,OAAA,CAAQ,CAAC,CAAC,CAAC,CAAA;AAE1E,EAAA,2BAAA,CAA4B;AAAA,IAC1B,OAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAS;AACnC;AAEA,SAAS,sBAAsB,KAAA,EAMC;AAC9B,EAAA,IAAI,kBAAA,GAA0B,IAAA,CAAA,OAAA,CAAQ,KAAA,CAAM,WAAA,EAAa,MAAM,YAAY,CAAA;AAC3E,EAAA,IAAI,CAAI,EAAA,CAAA,UAAA,CAAW,kBAAkB,CAAA,EAAG;AACtC,IAAA,kBAAA,GAA0B,IAAA,CAAA,IAAA,CAAK,KAAA,CAAM,WAAA,EAAa,eAAe,CAAA;AAAA,EACnE;AACA,EAAA,IAAI,CAAI,EAAA,CAAA,UAAA,CAAW,kBAAkB,CAAA,EAAG;AACtC,IAAA,OAAO;AAAA,MACL,OAAA,EAAS;AAAA,QACP,QAAW,GAAA,CAAA,YAAA,CAAa,MAAA;AAAA,QACxB,QAAW,GAAA,CAAA,UAAA,CAAW,MAAA;AAAA,QACtB,kBAAqB,GAAA,CAAA,oBAAA,CAAqB,QAAA;AAAA,QAC1C,MAAA,EAAQ,IAAA;AAAA,QACR,YAAA,EAAc,IAAA;AAAA,QACd,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,SAAA,EAAW,WAAA,CAAY,KAAA,CAAM,WAAA,EAAa,MAAM,OAAO,CAAA;AAAA,MACvD,QAAQ;AAAC,KACX;AAAA,EACF;AAEA,EAAA,MAAM,UAAA,GAAgB,GAAA,CAAA,cAAA,CAAe,kBAAA,EAAuB,GAAA,CAAA,GAAA,CAAI,QAAQ,CAAA;AACxE,EAAA,IAAI,WAAW,KAAA,EAAO;AACpB,IAAA,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,kBAAA,EAAoB,OAAA,EAAS,MAAA,CAAO,UAAA,CAAW,KAAA,CAAM,WAAW,CAAA,EAAG,CAAA;AAC7F,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAA,GAAY,GAAA,CAAA,0BAAA;AAAA,IAChB,UAAA,CAAW,MAAA;AAAA,IACR,GAAA,CAAA,GAAA;AAAA,IACE,aAAQ,kBAAkB;AAAA,GACjC;AACA,EAAA,IAAI,MAAA,CAAO,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AACvC,EAAA,KAAA,MAAW,CAAA,IAAK,OAAO,MAAA,EAAQ;AAC7B,IAAA,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,QAAA,IAAY,UAAA,EAAY,OAAA,EAAS,MAAA,CAAO,CAAA,CAAE,WAAW,GAAG,CAAA;AAAA,EAC5F;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,4BAA4B,KAAA,EAO5B;AACP,EAAA,KAAA,MAAW,UAAA,IAAc,KAAA,CAAM,OAAA,CAAQ,cAAA,EAAe,EAAG;AACvD,IAAA,MAAM,WAAW,UAAA,CAAW,QAAA;AAC5B,IAAA,IAAI,SAAS,QAAA,CAAS,cAAc,KAAK,QAAA,CAAS,QAAA,CAAS,OAAO,CAAA,EAAG;AACrE,IAAA,IAAI,CAAC,KAAA,CAAM,aAAA,CAAc,IAAS,IAAA,CAAA,OAAA,CAAQ,QAAQ,CAAC,CAAA,EAAG;AAEtD,IAAG,GAAA,CAAA,YAAA,CAAa,UAAA,EAAY,CAAC,IAAA,KAAS;AACpC,MAAA,MAAM,OAAO,kBAAA,CAAmB;AAAA,QAC9B,IAAA;AAAA,QAEA,QAAA;AAAA,QACA,aAAa,KAAA,CAAM,WAAA;AAAA,QACnB,aAAa,KAAA,CAAM,WAAA;AAAA,QACnB,UAAU,KAAA,CAAM;AAAA,OACjB,CAAA;AACD,MAAA,IAAI,IAAA,EAAM,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAAA,IACjC,CAAC,CAAA;AAAA,EACH;AACF;AAEA,SAAS,mBAAmB,KAAA,EAOA;AAC1B,EAAA,MAAM,IAAA,GAAO,8BAAA,CAA+B,KAAA,CAAM,IAAsB,CAAA;AACxE,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,CAAK,MAAM,OAAO,IAAA;AAChC,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AACnC,EAAA,IAAI,CAAC,UAAA,CAAW,IAAI,CAAA,EAAG,OAAO,IAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,iBAAiB,IAAI,CAAA;AACnC,EAAA,MAAM,WAAA,GAAc,cAAA,CAAe,KAAA,EAAO,IAAA,CAAK,IAAI,CAAA;AACnD,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,KAAA,CAAM,SAAS,IAAA,CAAK;AAAA,MAClB,MAAM,KAAA,CAAM,QAAA;AAAA,MACZ,OAAA,EAAS,CAAA,KAAA,EAAQ,IAAA,CAAK,IAAI,CAAA,2CAAA;AAAA,KAC3B,CAAA;AAAA,EACH;AACA,EAAA,MAAM,UAAA,GAAa,UAAU,IAAI,CAAA;AACjC,EAAA,MAAM,SAAS,CAAC,GAAA,KACd,KAAA,CAAM,QAAA,CAAS,KAAK,EAAE,IAAA,EAAM,KAAA,CAAM,QAAA,EAAU,SAAS,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAA,EAAK,GAAG,IAAI,CAAA;AAC/E,EAAA,MAAM,EAAE,QAAO,GAAI,0BAAA,CAA2B,KAAK,IAAA,EAAM,KAAA,CAAM,aAAa,MAAM,CAAA;AAClF,EAAA,MAAM,eAAe,+BAAA,CAAgC,IAAA,CAAK,IAAA,EAAM,KAAA,CAAM,aAAa,MAAM,CAAA;AACzF,EAAA,MAAM,UAAA,GAAkB,cAAS,KAAA,CAAM,WAAA,EAAa,MAAM,QAAQ,CAAA,IAAU,IAAA,CAAA,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAA;AACnG,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,UAAA,EAAY,IAAA,CAAK,IAAI,CAAA;AAErD,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,aAAA;AAAA,IACN,IAAA,EAAM,QAAA;AAAA,IACN,WAAA,EAAa,WAAA,IAAe,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAAA,IAC9C,WAAA,EAAa,qBAAqB,MAAM,CAAA;AAAA,IACxC,YAAA;AAAA,IACA,KAAA,EAAO,EAAE,IAAA,EAAM,EAAE,YAAW,EAAE;AAAA,IAC9B,UAAA;AAAA,IACA,YAAY,IAAA,CAAK;AAAA,GACnB;AACF;AAEA,SAAS,qBAAqB,MAAA,EAAyB;AACrD,EAAA,OAAO,MAAA,CAAO,IAAA,CAAM,MAAA,CAAmC,UAAA,IAAc,EAAE,CAAA,CAAE,MAAA,GAAS,CAAA,GAC7E,SACD,EAAE,IAAA,EAAM,QAAA,EAAU,UAAA,EAAY,EAAC,EAAE;AACvC;AAEA,SAAS,WAAA,CAAY,aAAqB,QAAA,EAA8B;AACtE,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,GAAA,GAAM,CAAC,CAAA,KAAc;AACzB,IAAA,MAAM,GAAA,GAAW,aAAQ,CAAC,CAAA;AAC1B,IAAA,IAAI,CAAA,CAAE,QAAA,CAAS,KAAK,CAAA,IAAK,CAAC,CAAA,CAAE,QAAA,CAAS,OAAO,CAAA,IAAK,CAAC,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AAC/D,MAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,MAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,IACjB;AAAA,EACF,CAAA;AACA,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,MAAM,IAAA,GAAY,IAAA,CAAA,IAAA,CAAK,WAAA,EAAa,CAAC,CAAA;AACrC,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AACtB,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAa,EAAE,CAAA,CAAE,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA,CAAE,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA,IAAK,GAAA;AAC1F,MAAA,MAAM,GAAA,GAAW,IAAA,CAAA,OAAA,CAAQ,WAAA,EAAa,OAAO,CAAA;AAC7C,MAAA,IAAO,EAAA,CAAA,UAAA,CAAW,GAAG,CAAA,EAAG,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,IACvC,CAAA,MAAO;AACL,MAAA,MAAM,QAAA,GAAgB,IAAA,CAAA,OAAA,CAAQ,WAAA,EAAa,IAAI,CAAA;AAC/C,MAAA,IAAO,EAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC3B,QAAA,IAAO,YAAS,QAAQ,CAAA,CAAE,MAAA,EAAO,MAAO,QAAQ,CAAA;AAAA,aAC3C,IAAA,CAAK,UAAU,GAAG,CAAA;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AACA,EAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,MAAA;AAC9B,EAAA,MAAM,MAAA,GAAc,IAAA,CAAA,IAAA,CAAK,WAAA,EAAa,KAAK,CAAA;AAC3C,EAAA,IAAO,EAAA,CAAA,UAAA,CAAW,MAAM,CAAA,EAAG,OAAO,YAAY,MAAM,CAAA;AACpD,EAAA,OAAO,EAAC;AACV;AAEA,SAAS,YAAY,GAAA,EAAuB;AAC1C,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,IAAA,CAAK,GAAA,EAAK,CAAC,QAAA,KAAa;AACtB,IAAA,IAAI,QAAA,CAAS,QAAA,CAAS,KAAK,CAAA,IAAK,CAAC,QAAA,CAAS,QAAA,CAAS,OAAO,CAAA,EAAG,GAAA,CAAI,IAAA,CAAU,IAAA,CAAA,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAAA,EAC9F,CAAC,CAAA;AACD,EAAA,OAAO,GAAA;AACT;AAEA,IAAM,4BAAY,IAAI,GAAA,CAAI,CAAC,cAAA,EAAgB,WAAA,EAAa,MAAM,CAAC,CAAA;AAE/D,SAAS,IAAA,CAAK,KAAa,KAAA,EAAyC;AAClE,EAAA,IAAI;AACF,IAAA,MAAM,UAAa,EAAA,CAAA,WAAA,CAAY,GAAA,EAAK,EAAE,aAAA,EAAe,MAAM,CAAA;AAC3D,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,MAAM,IAAA,GAAY,IAAA,CAAA,IAAA,CAAK,GAAA,EAAK,CAAA,CAAE,IAAI,CAAA;AAClC,MAAA,IAAI,CAAA,CAAE,WAAA,EAAY,IAAK,CAAC,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,EAAG,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAAA,WAAA,IACtD,CAAA,CAAE,MAAA,EAAO,EAAG,KAAA,CAAM,IAAI,CAAA;AAAA,IACjC;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAEA,SAAS,8BAAA,CACP,MACA,WAAA,EACkG;AAClG,EAAA,IAAO,GAAA,CAAA,qBAAA,CAAsB,IAAI,CAAA,IAAK,IAAA,CAAK,IAAA,EAAM;AAC/C,IAAA,MAAM,QAAA,GAAA,CAAe,GAAA,CAAA,YAAA,CAAa,IAAI,CAAA,IAAK,EAAC,EAAG,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAY,GAAA,CAAA,UAAA,CAAW,aAAa,CAAA;AACjG,IAAA,IAAI,QAAA,SAAiB,EAAE,IAAA,EAAM,MAAM,IAAA,EAAM,IAAA,CAAK,IAAA,CAAK,OAAA,EAAQ,EAAE;AAC7D,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAO,GAAA,CAAA,mBAAA,CAAoB,IAAI,CAAA,EAAG;AAChC,IAAA,MAAM,QAAA,GAAA,CAAe,GAAA,CAAA,YAAA,CAAa,IAAI,CAAA,IAAK,EAAC,EAAG,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAY,GAAA,CAAA,UAAA,CAAW,aAAa,CAAA;AACjG,IAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,eAAA,CAAgB,YAAA,EAAc;AACpD,MAAA,IAAI,OAAO,IAAA,CAAK,WAAA;AAChB,MAAA,OAAO,IAAA,KAAY,GAAA,CAAA,yBAAA,CAA0B,IAAI,CAAA,IAAQ,mBAAe,IAAI,CAAA,CAAA;AAC1E,QAAA,IAAA,GAAO,IAAA,CAAK,UAAA;AACd,MAAA,IAAI,IAAA,IAAW,GAAA,CAAA,eAAA,CAAgB,IAAI,CAAA,EAAG;AACpC,QAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAuB,OAAA,EAAQ;AAClD,QAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAK;AAAA,MAC5B;AACA,MAAA,IAAI,IAAA,IAAW,GAAA,CAAA,oBAAA,CAAqB,IAAI,CAAA,EAAG;AACzC,QAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAuB,OAAA,EAAQ;AAClD,QAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAK;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,aAAa,IAAA,EAAkF;AACtG,EAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,EAAA,IAAO,GAAA,CAAA,qBAAA,CAAsB,MAAM,CAAA,EAAG;AACpC,IAAA,MAAM,KAAK,MAAA,CAAO,MAAA;AAClB,IAAA,IAAO,GAAA,CAAA,yBAAA,CAA0B,EAAE,CAAA,IAAK,EAAA,CAAG,MAAA,IAAa,wBAAoB,EAAA,CAAG,MAAM,CAAA,EAAG,OAAO,EAAA,CAAG,MAAA;AAAA,EACpG;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,iBAAiB,IAAA,EAA2B;AACnD,EAAA,MAAM,GAAA,GAAS,4BAAwB,IAAI,CAAA;AAC3C,EAAA,OAAO,IAAI,MAAA,CAAO,CAAC,CAAA,KAAwB,GAAA,CAAA,OAAA,CAAQ,CAAC,CAAC,CAAA;AACvD;AAEA,SAAS,WAAW,IAAA,EAAwB;AAC1C,EAAA,MAAM,IAAA,GAAU,iBAAa,IAAI,CAAA;AACjC,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,IAAA,GAAQ,GAAA,CAAoC,OAAA,EAAS,OAAA,EAAQ,IAAK,EAAA;AACxE,IAAA,IAAI,IAAA,KAAS,QAAQ,OAAO,IAAA;AAAA,EAC9B;AACA,EAAA,MAAM,GAAA,GAAS,4BAAwB,IAAI,CAAA;AAC3C,EAAA,KAAA,MAAW,KAAK,GAAA,EAAK;AACnB,IAAA,IAAO,GAAA,CAAA,OAAA,CAAQ,CAAC,CAAA,EAAG;AACjB,MAAA,MAAM,IAAA,GAAO,EAAE,WAAA,EAAY;AAC3B,MAAA,IAAI,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAG,OAAO,IAAA;AAAA,IACtC;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,cAAA,CAAe,QAAoB,YAAA,EAA8B;AACxE,EAAA,KAAA,MAAW,OAAO,MAAA,EAAQ;AACxB,IAAA,MAAM,UAAU,GAAA,CAAI,OAAA;AACpB,IAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,MAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,CAAM,IAAI,EAAE,CAAC,CAAA,EAAG,MAAK,IAAK,EAAA;AAChD,MAAA,IAAI,SAAS,CAAC,KAAA,CAAM,UAAA,CAAW,GAAG,GAAG,OAAO,KAAA;AAAA,IAC9C;AACA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,MAAA,MAAM,KAAA,GAAQ,QAAQ,CAAC,CAAA;AACvB,MAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,UAAU,KAAA,EAAO;AACzD,QAAA,MAAM,CAAA,GAAK,KAAA,CAA2B,IAAA,CAAK,IAAA,EAAK;AAChD,QAAA,IAAI,KAAK,CAAC,CAAA,CAAE,UAAA,CAAW,GAAG,GAAG,OAAO,CAAA;AAAA,MACtC;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,IAAI,WAAA,EAAY;AAC7B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,kCAAkC,CAAA;AAC3D,IAAA,IAAI,QAAQ,CAAC,CAAA,SAAU,KAAA,CAAM,CAAC,EAAE,IAAA,EAAK;AAAA,EACvC;AACA,EAAA,OAAO,EAAA;AACT;AAEA,SAAS,UAAU,IAAA,EAA2B;AAC5C,EAAA,MAAM,IAAA,GAAU,iBAAa,IAAI,CAAA;AACjC,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,IAAA,GAAQ,GAAA,CAAoC,OAAA,EAAS,OAAA,EAAQ,IAAK,EAAA;AACxE,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,MAAM,UAAW,GAAA,CAA2B,OAAA;AAC5C,MAAA,MAAM,CAAA,GAAA,CAAK,OAAO,OAAA,KAAY,QAAA,GAAW,UAAU,EAAA,EAAI,IAAA,GAAO,WAAA,EAAY;AAC1E,MAAA,IAAI,aAAA,CAAc,QAAA,CAAS,CAAe,CAAA,EAAG,OAAO,CAAA;AAAA,IACtD;AAAA,EACF;AACA,EAAA,MAAM,GAAA,GAAS,4BAAwB,IAAI,CAAA;AAC3C,EAAA,KAAA,MAAW,KAAK,GAAA,EAAK;AACnB,IAAA,IAAO,GAAA,CAAA,OAAA,CAAQ,CAAC,CAAA,EAAG;AACjB,MAAA,MAAM,IAAA,GAAO,EAAE,WAAA,EAAY;AAC3B,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,sBAAsB,CAAA;AAC/C,MAAA,IAAI,KAAA,IAAS,cAAc,QAAA,CAAS,KAAA,CAAM,CAAC,CAAe,CAAA,EAAG,OAAO,KAAA,CAAM,CAAC,CAAA;AAAA,IAC7E;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,SAAS,IAAA,EAAsB;AACtC,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,UAAA,EAAY,KAAK,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,EAAa,EAAE,IAAA,EAAK;AACpF;AAGO,SAAS,IAAA,CACd,WAAA,EACA,OAAA,GAAgC,EAAC,EACH;AAC9B,EAAA,MAAM,IAAA,GAAY,aAAQ,WAAW,CAAA;AACrC,EAAA,MAAM,SAAS,YAAA,CAAa;AAAA,IAC1B,WAAA,EAAa,IAAA;AAAA,IACb,OAAA,EAAS,OAAA,CAAQ,OAAA,IAAW,CAAC,SAAS,CAAA;AAAA,IACtC,cAAc,OAAA,CAAQ;AAAA,GACvB,CAAA;AACD,EAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,iBAAA,CAAkB,CAAA,EAAG,IAAI,CAAC,CAAA;AAChE,EAAA,OAAO,QAAQ,OAAA,CAAQ;AAAA,IACrB,KAAA;AAAA,IACA,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,UAAU,MAAA,CAAO;AAAA,GAClB,CAAA;AACH","file":"chunk-HEVWKBBQ.js","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 +0,0 @@
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,33 +0,0 @@
1
- // src/core/types/ToolSpec.ts
2
- function normalizeToolName(name) {
3
- if (typeof name !== "string" || !name) return name;
4
- return name.replace(/[^a-zA-Z0-9]/g, ".").replace(/\.+/g, ".");
5
- }
6
- var DEFAULT_INPUT_SCHEMA = {
7
- type: "object",
8
- additionalProperties: true
9
- };
10
- var DEFAULT_OUTPUT_SCHEMA = {
11
- type: "object",
12
- additionalProperties: true
13
- };
14
- function createToolSpec(opts) {
15
- const sideEffect = opts.sideEffect ?? "none";
16
- const name = normalizeToolName(opts.name);
17
- return {
18
- name,
19
- version: opts.version ?? "1.0.0",
20
- kind: opts.kind,
21
- description: opts.description,
22
- tags: opts.tags,
23
- inputSchema: opts.inputSchema ?? DEFAULT_INPUT_SCHEMA,
24
- outputSchema: opts.outputSchema ?? DEFAULT_OUTPUT_SCHEMA,
25
- capabilities: opts.capabilities,
26
- costHints: opts.costHints,
27
- _meta: { hitl: { sideEffect } }
28
- };
29
- }
30
-
31
- export { DEFAULT_INPUT_SCHEMA, DEFAULT_OUTPUT_SCHEMA, createToolSpec, normalizeToolName };
32
- //# sourceMappingURL=chunk-ODEHUAR4.js.map
33
- //# sourceMappingURL=chunk-ODEHUAR4.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core/types/ToolSpec.ts"],"names":[],"mappings":";AAwFO,SAAS,kBAAkB,IAAA,EAAsB;AACtD,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,CAAC,MAAM,OAAO,IAAA;AAC9C,EAAA,OAAO,KACJ,OAAA,CAAQ,eAAA,EAAiB,GAAG,CAAA,CAC5B,OAAA,CAAQ,QAAQ,GAAG,CAAA;AACxB;AAGO,IAAM,oBAAA,GAA+B;AAAA,EAC1C,IAAA,EAAM,QAAA;AAAA,EACN,oBAAA,EAAsB;AACxB;AAGO,IAAM,qBAAA,GAAgC;AAAA,EAC3C,IAAA,EAAM,QAAA;AAAA,EACN,oBAAA,EAAsB;AACxB;AA2BO,SAAS,eAAe,IAAA,EAAuC;AACpE,EAAA,MAAM,UAAA,GAAa,KAAK,UAAA,IAAc,MAAA;AACtC,EAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA;AACxC,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,OAAA,EAAS,KAAK,OAAA,IAAW,OAAA;AAAA,IACzB,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,WAAA,EAAa,KAAK,WAAA,IAAe,oBAAA;AAAA,IACjC,YAAA,EAAc,KAAK,YAAA,IAAgB,qBAAA;AAAA,IACnC,cAAc,IAAA,CAAK,YAAA;AAAA,IACnB,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,KAAA,EAAO,EAAE,IAAA,EAAM,EAAE,YAAW;AAAE,GAChC;AACF","file":"chunk-ODEHUAR4.js","sourcesContent":["/**\n * Unified tool kinds supported by the tools package.\n */\nexport type ToolKind = \"mcp\" | \"langchain\" | \"n8n\" | \"comfyui\" | \"skill\" | \"function\" | \"core\" | \"example\";\n\n/**\n * Capability declarations for tools.\n * Used by PolicyEngine for permission gating.\n */\nexport type Capability =\n | \"read:web\"\n | \"read:fs\"\n | \"write:fs\"\n | \"read:db\"\n | \"write:db\"\n | \"network\"\n | \"gpu\"\n | \"workflow\"\n | \"danger:destructive\"\n | \"exec\";\n\n/**\n * HITL (Human-in-the-Loop) side-effect classification.\n * Used to gate execution: external_write / destructive require human approval when onApprovalRequired is set.\n */\nexport type HitlSideEffect = \"none\" | \"local_write\" | \"external_write\" | \"destructive\";\n\n/**\n * Cost hints for tools, used by Budget and routing.\n */\nexport interface CostHints {\n latencyMsP50?: number;\n latencyMsP95?: number;\n isAsync?: boolean;\n}\n\n/**\n * Unified tool specification.\n * All tool types (MCP, LangChain, n8n, SKILL) are described by this interface.\n *\n * Safety: each tool declares capabilities (permission gating) and _meta.hitl.sideEffect\n * (HITL approval for external_write/destructive). Caller uses these to decide handling.\n */\nexport interface ToolSpec {\n /** Globally unique name, recommended format: namespace/name */\n name: string;\n /** Semver version */\n version: string;\n /** Tool kind determines which adapter handles execution */\n kind: ToolKind;\n\n description?: string;\n tags?: string[];\n\n /** JSON Schema for input validation */\n inputSchema: object;\n /** JSON Schema for output validation */\n outputSchema: object;\n\n /** Required capabilities for this tool (safety: PolicyEngine gates by ExecContext.permissions) */\n capabilities: Capability[];\n costHints?: CostHints;\n\n /** HITL and adapter-specific metadata. Adapters may use _meta.sourcePath, _meta.exportName, _meta.projectPath (function), etc. */\n _meta?: {\n hitl?: { sideEffect?: HitlSideEffect };\n /** Function kind: path to source file relative to projectPath */\n sourcePath?: string;\n /** Function kind: export name of the handler */\n exportName?: string;\n /** Function/skill kind: project root for resolving sourcePath */\n projectPath?: string;\n /** Extension kind: package root for resolving sourcePath */\n packageRoot?: string;\n };\n\n /** Adapter-specific: endpoint URL (MCP/n8n) */\n endpoint?: string;\n /** Adapter-specific: resource identifier (workflowId, promptId, etc.) */\n resourceId?: string;\n /** Adapter-specific: implementation reference (LangChain Tool instance, skill handler) */\n impl?: unknown;\n}\n\n/**\n * Normalize tool name: only [a-zA-Z0-9] and \".\" allowed; all other characters become \".\".\n * Consecutive dots are collapsed to one. Used for registry lookup and storage.\n */\nexport function normalizeToolName(name: string): string {\n if (typeof name !== \"string\" || !name) return name;\n return name\n .replace(/[^a-zA-Z0-9]/g, \".\")\n .replace(/\\.+/g, \".\");\n}\n\n/** Default permissive input schema when not provided (framework supports auto-derived schema). */\nexport const DEFAULT_INPUT_SCHEMA: object = {\n type: \"object\",\n additionalProperties: true,\n};\n\n/** Default permissive output schema when not provided (framework supports auto-derived schema). */\nexport const DEFAULT_OUTPUT_SCHEMA: object = {\n type: \"object\",\n additionalProperties: true,\n};\n\n/**\n * Minimal options to build a ToolSpec. Use with @effect in JSDoc for HITL sideEffect.\n * Framework fills _meta.hitl.sideEffect from the sideEffect parameter (matches @effect annotation).\n * inputSchema/outputSchema are optional: when omitted, permissive defaults are used (framework supports auto-derived schema at build time in scan/mcp-build).\n */\nexport interface CreateToolSpecOptions {\n name: string;\n version?: string;\n kind: ToolKind;\n description?: string;\n tags?: string[];\n /** Optional: when omitted, DEFAULT_INPUT_SCHEMA is used. Codegen can derive from handler params. */\n inputSchema?: object;\n /** Optional: when omitted, DEFAULT_OUTPUT_SCHEMA is used. Codegen can derive from handler return type. */\n outputSchema?: object;\n capabilities: Capability[];\n costHints?: CostHints;\n /** HITL: from @effect annotation (none | local_write | external_write | destructive). Default \"none\". */\n sideEffect?: HitlSideEffect;\n}\n\n/**\n * Build a ToolSpec from minimal options. Use @effect in handler JSDoc as annotation; pass same value as sideEffect.\n * When inputSchema/outputSchema are omitted, permissive defaults are used (schema can be auto-derived at build time).\n */\nexport function createToolSpec(opts: CreateToolSpecOptions): ToolSpec {\n const sideEffect = opts.sideEffect ?? \"none\";\n const name = normalizeToolName(opts.name);\n return {\n name,\n version: opts.version ?? \"1.0.0\",\n kind: opts.kind,\n description: opts.description,\n tags: opts.tags,\n inputSchema: opts.inputSchema ?? DEFAULT_INPUT_SCHEMA,\n outputSchema: opts.outputSchema ?? DEFAULT_OUTPUT_SCHEMA,\n capabilities: opts.capabilities,\n costHints: opts.costHints,\n _meta: { hitl: { sideEffect } },\n };\n}\n\n/**\n * Unified adapter interface.\n * PTCRuntime looks up adapter by spec.kind and calls adapter.invoke(spec, args, ctx).\n * spec.name is always the single canonical name (the long name); there is no short name.\n */\nexport interface ToolAdapter {\n kind: ToolKind;\n /** Optional: supports dynamic tool discovery */\n listTools?(): Promise<ToolSpec[]>;\n /** Execute the tool with validated args. spec.name is the canonical (long) name. */\n invoke(\n spec: ToolSpec,\n args: unknown,\n ctx: import(\"./ToolIntent.js\").ExecContext,\n ): Promise<{ result: unknown; raw?: unknown }>;\n}\n"]}