@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,10 +1,10 @@
1
- import { DEFAULT_OUTPUT_SCHEMA } from './chunk-ODEHUAR4.js';
2
1
  import * as path from 'path';
3
2
  import { join } from 'path';
4
3
  import * as fs from 'fs';
5
4
  import * as ts2 from 'typescript';
6
5
  import { readdir } from 'fs/promises';
7
6
 
7
+ // src/tools/function/scanner.ts
8
8
  async function findDirsContainingFile(rootPath, fileName) {
9
9
  const found = [];
10
10
  await collectDirsWithFile(rootPath, fileName, found);
@@ -175,6 +175,36 @@ function typeToJsonSchema(type, typeChecker, onWarn) {
175
175
  // src/tools/function/types.ts
176
176
  var FUNCTION_KIND = "function";
177
177
 
178
+ // src/core/types/ToolSpec.ts
179
+ function normalizeToolName(name) {
180
+ if (typeof name !== "string" || !name) return name;
181
+ return name.replace(/[^a-zA-Z0-9]/g, ".").replace(/\.+/g, ".");
182
+ }
183
+ var DEFAULT_INPUT_SCHEMA = {
184
+ type: "object",
185
+ additionalProperties: true
186
+ };
187
+ var DEFAULT_OUTPUT_SCHEMA = {
188
+ type: "object",
189
+ additionalProperties: true
190
+ };
191
+ function createToolSpec(opts) {
192
+ const sideEffect = opts.sideEffect ?? "none";
193
+ const name = normalizeToolName(opts.name);
194
+ return {
195
+ name,
196
+ version: opts.version ?? "1.0.0",
197
+ kind: opts.kind,
198
+ description: opts.description,
199
+ tags: opts.tags,
200
+ inputSchema: opts.inputSchema ?? DEFAULT_INPUT_SCHEMA,
201
+ outputSchema: opts.outputSchema ?? DEFAULT_OUTPUT_SCHEMA,
202
+ capabilities: opts.capabilities,
203
+ costHints: opts.costHints,
204
+ _meta: { hitl: { sideEffect } }
205
+ };
206
+ }
207
+
178
208
  // src/tools/skill/types.ts
179
209
  var SKILL_KIND = "skill";
180
210
  var SKILL_DIR_NAME = "skill";
@@ -300,7 +330,7 @@ function toFunctionToolSpec(input) {
300
330
  const host = getJSDocHost(decl.func);
301
331
  if (!hasToolTag(host)) return null;
302
332
  const jsDoc = getJSDocComments(host);
303
- const description = getDescription(jsDoc, decl.name);
333
+ const description = getDescription(jsDoc);
304
334
  if (!description) {
305
335
  input.warnings.push({
306
336
  file: input.fileName,
@@ -427,7 +457,7 @@ function hasToolTag(host) {
427
457
  }
428
458
  return false;
429
459
  }
430
- function getDescription(jsDocs, fallbackName) {
460
+ function getDescription(jsDocs) {
431
461
  for (const doc of jsDocs) {
432
462
  const comment = doc.comment;
433
463
  if (typeof comment === "string") {
@@ -485,6 +515,6 @@ function scan(projectPath, options = {}) {
485
515
  });
486
516
  }
487
517
 
488
- export { FUNCTION_KIND, N8N_KIND, SKILL_DIR_NAME, SKILL_KIND, findDirsContainingFile, mcpSpecToToolSpec, pathToToolName, scan, scanForTools };
489
- //# sourceMappingURL=chunk-HEVWKBBQ.js.map
490
- //# sourceMappingURL=chunk-HEVWKBBQ.js.map
518
+ export { FUNCTION_KIND, N8N_KIND, SKILL_DIR_NAME, SKILL_KIND, createToolSpec, findDirsContainingFile, mcpSpecToToolSpec, normalizeToolName, pathToToolName, scan, scanForTools };
519
+ //# sourceMappingURL=chunk-BDUSB6GT.js.map
520
+ //# sourceMappingURL=chunk-BDUSB6GT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tools/util/scanUtil.ts","../src/tools/function/schemaFromTs.ts","../src/tools/function/types.ts","../src/core/types/ToolSpec.ts","../src/tools/skill/types.ts","../src/tools/n8n/types.ts","../src/tools/mcp/mcpSpecToToolSpec.ts","../src/tools/function/scanner.ts"],"names":["ts"],"mappings":"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","file":"chunk-BDUSB6GT.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","/**\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","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_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);\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[]): 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,4 +1,4 @@
1
- import { createToolSpec } from './chunk-ODEHUAR4.js';
1
+ import { createToolSpec } from './chunk-BDUSB6GT.js';
2
2
  import { existsSync, readFileSync, statSync } from 'fs';
3
3
  import path from 'path';
4
4
  import { parseYamlContent } from '@easynet/agent-common';
@@ -88,5 +88,5 @@ function registerToolsFromManifest(registry, options) {
88
88
  }
89
89
 
90
90
  export { loadExtensionManifest, loadToolYaml, registerToolsFromManifest };
91
- //# sourceMappingURL=chunk-NEMGE573.js.map
92
- //# sourceMappingURL=chunk-NEMGE573.js.map
91
+ //# sourceMappingURL=chunk-IJVVH4JN.js.map
92
+ //# sourceMappingURL=chunk-IJVVH4JN.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api/extension/loadToolYaml.ts","../src/api/extension/registerFromManifest.ts"],"names":["path","existsSync","readFileSync"],"mappings":"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","file":"chunk-NEMGE573.js","sourcesContent":["/**\n * Load per-tool default args/config from <base>.tool.yaml (framework-defined format).\n *\n * Supported YAML format:\n * tool:\n * defaults: # optional; same level as list; merged into every tool's defaultArgs\n * sandboxRoot: \"\"\n * maxBytes: 5242880\n * list:\n * - name: fetchText\n * timeoutMs: 5000\n * maxBytes: 1048576\n * (find item where name === tool base name; result = { ...defaults, ...item } minus name)\n */\nimport { readFileSync, existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { parseYamlContent } from \"@easynet/agent-common\";\n\n/**\n * Load tool.yaml for a given tool. Path: packageRoot / dirname(sourcePath) / basename(sourcePath).tool.yaml\n * Returns default args (and config) for the tool, or undefined if file missing or no matching entry.\n * If tool.defaults exists (same level as tool.list), it is merged first; list item fields override.\n */\nexport function loadToolYaml(\n packageRoot: string,\n sourcePath: string,\n): Record<string, unknown> | undefined {\n const dir = path.dirname(sourcePath);\n const base = path.basename(sourcePath);\n const dirPath = path.join(packageRoot, dir);\n const yamlPath = existsSync(path.join(dirPath, `${base}.tool.yaml`))\n ? path.join(dirPath, `${base}.tool.yaml`)\n : path.join(dirPath, `${base}.example.yaml`);\n if (!existsSync(yamlPath)) return undefined;\n try {\n const raw = readFileSync(yamlPath, \"utf-8\");\n const data = parseYamlContent<unknown>(raw, { substituteEnv: false });\n if (data == null || typeof data !== \"object\" || Array.isArray(data)) return undefined;\n const obj = data as Record<string, unknown>;\n const toolBlock = obj?.tool as Record<string, unknown> | undefined;\n const arr = toolBlock?.list;\n if (!Array.isArray(arr)) return undefined;\n const defaults =\n toolBlock?.defaults != null &&\n typeof toolBlock.defaults === \"object\" &&\n !Array.isArray(toolBlock.defaults)\n ? (toolBlock.defaults as Record<string, unknown>)\n : {};\n const item = arr.find(\n (e: unknown) => e != null && typeof e === \"object\" && (e as Record<string, unknown>).name === base,\n ) as Record<string, unknown> | undefined;\n if (!item || typeof item !== \"object\") return undefined;\n const { name: _n, ...rest } = item;\n const merged = { ...defaults, ...rest };\n if (Object.keys(merged).length === 0) return undefined;\n return merged;\n } catch {\n return undefined;\n }\n}\n","/**\n * Generic manifest-based registration for extensions.\n * Reads a pre-built JSON manifest (extension produces it at build time; agent-tool does not scan @tool).\n * Registers ToolSpecs with the registry. When packageRoot is provided, loads <base>.tool.yaml per tool and sets defaultArgs in _meta.\n */\nimport { readFileSync, existsSync, statSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { createToolSpec } from \"../../core/types/ToolSpec.js\";\nimport type { ToolSpec, HitlSideEffect } from \"../../core/types/ToolSpec.js\";\nimport type { ToolRegistry } from \"../../core/registry/ToolRegistry.js\";\nimport { loadToolYaml } from \"./loadToolYaml.js\";\n\n/** Manifest entry shape (convention: extension build emits this, e.g. from @tool scan). */\nexport interface ExtensionManifestEntry {\n /** Tool name (e.g. \"exec.runCommand\"). Legacy manifests may have coreName instead. */\n name?: string;\n /** @deprecated Use name instead. Legacy: e.g. \"core/src.exec.runCommand\". */\n coreName?: string;\n description: string;\n inputSchema: object;\n outputSchema: object;\n sourcePath: string;\n exportName: string;\n sideEffect: HitlSideEffect;\n}\n\n/** Loaded manifest: entries + optional kind from manifest file. */\nexport interface LoadedExtensionManifest {\n kind?: string;\n entries: ExtensionManifestEntry[];\n}\n\nexport interface RegisterFromManifestOptions {\n /** Path to manifest JSON (or directory containing core-tools-manifest.json). */\n manifestPathOrDir: string;\n /** Tool kind; if omitted, uses manifest.kind or \"extension\". */\n kind?: string;\n /** Filter: only register these tool names. */\n only?: string[];\n /** Filter: only register tools whose name starts with one of these prefixes. */\n namePrefixes?: string[];\n /** Extension package root (e.g. dist); when set, loads <base>.tool.yaml per tool and sets defaultArgs in _meta. */\n packageRoot?: string;\n}\n\n/**\n * Load manifest from path. Supports array or { kind?, tools: ExtensionManifestEntry[] }.\n * Returns entries + optional kind so framework can use dynamic kind from manifest.\n */\nexport function loadExtensionManifest(manifestPathOrDir: string): LoadedExtensionManifest {\n const p = path.resolve(manifestPathOrDir);\n let manifestPath: string;\n if (existsSync(p) && statSync(p).isFile()) {\n manifestPath = p;\n } else {\n const inDir = path.join(p, \"core-tools-manifest.json\");\n const inDist = path.join(p, \"dist\", \"core-tools-manifest.json\");\n manifestPath = existsSync(inDir) ? inDir : inDist;\n }\n const raw = readFileSync(manifestPath, \"utf-8\");\n const parsed = JSON.parse(raw) as ExtensionManifestEntry[] | { kind?: string; tools: ExtensionManifestEntry[] };\n if (Array.isArray(parsed)) {\n return { entries: parsed };\n }\n return { kind: parsed.kind, entries: parsed.tools ?? [] };\n}\n\n/**\n * Register tools from a manifest with the registry. Returns the list of registered specs.\n * Extension packages call this from their register (or equivalent) with their package root.\n */\nexport function registerToolsFromManifest(\n registry: ToolRegistry,\n options: RegisterFromManifestOptions,\n): ToolSpec[] {\n const { manifestPathOrDir, kind: kindOpt, only, namePrefixes, packageRoot } = options;\n const loaded = loadExtensionManifest(manifestPathOrDir);\n const kind = (kindOpt ?? loaded.kind ?? \"extension\") as ToolSpec[\"kind\"];\n const entries = loaded.entries;\n const onlySet = only?.length ? new Set(only) : null;\n const registered: ToolSpec[] = [];\n\n for (const entry of entries) {\n const toolName =\n entry.name ??\n (entry.coreName != null\n ? entry.coreName.replace(/^[^/]+\\//, \"\").replace(/^src\\./, \"\")\n : entry.sourcePath.replace(/^src\\//, \"\").replace(/\\//g, \".\"));\n let spec = createToolSpec({\n name: toolName,\n kind,\n description: entry.description,\n inputSchema: entry.inputSchema,\n outputSchema: entry.outputSchema,\n capabilities: [],\n sideEffect: entry.sideEffect,\n });\n if (onlySet && !onlySet.has(spec.name)) continue;\n if (namePrefixes?.length && !namePrefixes.some((prefix) => spec.name.startsWith(prefix))) {\n continue;\n }\n const defaultArgs =\n packageRoot != null ? loadToolYaml(packageRoot, entry.sourcePath) : undefined;\n spec = {\n ...spec,\n _meta: {\n ...spec._meta,\n sourcePath: entry.sourcePath,\n exportName: entry.exportName,\n shortName: toolName,\n ...(packageRoot != null && { packageRoot }),\n ...(defaultArgs != null && Object.keys(defaultArgs).length > 0 && { defaultArgs }),\n },\n } as ToolSpec;\n registry.register(spec);\n registered.push(spec);\n }\n return registered;\n}\n"]}
1
+ {"version":3,"sources":["../src/api/extension/loadToolYaml.ts","../src/api/extension/registerFromManifest.ts"],"names":["path","existsSync","readFileSync"],"mappings":"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","file":"chunk-IJVVH4JN.js","sourcesContent":["/**\n * Load per-tool default args/config from <base>.tool.yaml (framework-defined format).\n *\n * Supported YAML format:\n * tool:\n * defaults: # optional; same level as list; merged into every tool's defaultArgs\n * sandboxRoot: \"\"\n * maxBytes: 5242880\n * list:\n * - name: fetchText\n * timeoutMs: 5000\n * maxBytes: 1048576\n * (find item where name === tool base name; result = { ...defaults, ...item } minus name)\n */\nimport { readFileSync, existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { parseYamlContent } from \"@easynet/agent-common\";\n\n/**\n * Load tool.yaml for a given tool. Path: packageRoot / dirname(sourcePath) / basename(sourcePath).tool.yaml\n * Returns default args (and config) for the tool, or undefined if file missing or no matching entry.\n * If tool.defaults exists (same level as tool.list), it is merged first; list item fields override.\n */\nexport function loadToolYaml(\n packageRoot: string,\n sourcePath: string,\n): Record<string, unknown> | undefined {\n const dir = path.dirname(sourcePath);\n const base = path.basename(sourcePath);\n const dirPath = path.join(packageRoot, dir);\n const yamlPath = existsSync(path.join(dirPath, `${base}.tool.yaml`))\n ? path.join(dirPath, `${base}.tool.yaml`)\n : path.join(dirPath, `${base}.example.yaml`);\n if (!existsSync(yamlPath)) return undefined;\n try {\n const raw = readFileSync(yamlPath, \"utf-8\");\n const data = parseYamlContent<unknown>(raw, { substituteEnv: false });\n if (data == null || typeof data !== \"object\" || Array.isArray(data)) return undefined;\n const obj = data as Record<string, unknown>;\n const toolBlock = obj?.tool as Record<string, unknown> | undefined;\n const arr = toolBlock?.list;\n if (!Array.isArray(arr)) return undefined;\n const defaults =\n toolBlock?.defaults != null &&\n typeof toolBlock.defaults === \"object\" &&\n !Array.isArray(toolBlock.defaults)\n ? (toolBlock.defaults as Record<string, unknown>)\n : {};\n const item = arr.find(\n (e: unknown) => e != null && typeof e === \"object\" && (e as Record<string, unknown>).name === base,\n ) as Record<string, unknown> | undefined;\n if (!item || typeof item !== \"object\") return undefined;\n const { name: _n, ...rest } = item;\n const merged = { ...defaults, ...rest };\n if (Object.keys(merged).length === 0) return undefined;\n return merged;\n } catch {\n return undefined;\n }\n}\n","/**\n * Generic manifest-based registration for extensions.\n * Reads a pre-built JSON manifest (extension produces it at build time; agent-tool does not scan @tool).\n * Registers ToolSpecs with the registry. When packageRoot is provided, loads <base>.tool.yaml per tool and sets defaultArgs in _meta.\n */\nimport { readFileSync, existsSync, statSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { createToolSpec } from \"../../core/types/ToolSpec.js\";\nimport type { ToolSpec, HitlSideEffect } from \"../../core/types/ToolSpec.js\";\nimport type { ToolRegistry } from \"../../core/registry/ToolRegistry.js\";\nimport { loadToolYaml } from \"./loadToolYaml.js\";\n\n/** Manifest entry shape (convention: extension build emits this, e.g. from @tool scan). */\nexport interface ExtensionManifestEntry {\n /** Tool name (e.g. \"exec.runCommand\"). Legacy manifests may have coreName instead. */\n name?: string;\n /** @deprecated Use name instead. Legacy: e.g. \"core/src.exec.runCommand\". */\n coreName?: string;\n description: string;\n inputSchema: object;\n outputSchema: object;\n sourcePath: string;\n exportName: string;\n sideEffect: HitlSideEffect;\n}\n\n/** Loaded manifest: entries + optional kind from manifest file. */\nexport interface LoadedExtensionManifest {\n kind?: string;\n entries: ExtensionManifestEntry[];\n}\n\nexport interface RegisterFromManifestOptions {\n /** Path to manifest JSON (or directory containing core-tools-manifest.json). */\n manifestPathOrDir: string;\n /** Tool kind; if omitted, uses manifest.kind or \"extension\". */\n kind?: string;\n /** Filter: only register these tool names. */\n only?: string[];\n /** Filter: only register tools whose name starts with one of these prefixes. */\n namePrefixes?: string[];\n /** Extension package root (e.g. dist); when set, loads <base>.tool.yaml per tool and sets defaultArgs in _meta. */\n packageRoot?: string;\n}\n\n/**\n * Load manifest from path. Supports array or { kind?, tools: ExtensionManifestEntry[] }.\n * Returns entries + optional kind so framework can use dynamic kind from manifest.\n */\nexport function loadExtensionManifest(manifestPathOrDir: string): LoadedExtensionManifest {\n const p = path.resolve(manifestPathOrDir);\n let manifestPath: string;\n if (existsSync(p) && statSync(p).isFile()) {\n manifestPath = p;\n } else {\n const inDir = path.join(p, \"core-tools-manifest.json\");\n const inDist = path.join(p, \"dist\", \"core-tools-manifest.json\");\n manifestPath = existsSync(inDir) ? inDir : inDist;\n }\n const raw = readFileSync(manifestPath, \"utf-8\");\n const parsed = JSON.parse(raw) as ExtensionManifestEntry[] | { kind?: string; tools: ExtensionManifestEntry[] };\n if (Array.isArray(parsed)) {\n return { entries: parsed };\n }\n return { kind: parsed.kind, entries: parsed.tools ?? [] };\n}\n\n/**\n * Register tools from a manifest with the registry. Returns the list of registered specs.\n * Extension packages call this from their register (or equivalent) with their package root.\n */\nexport function registerToolsFromManifest(\n registry: ToolRegistry,\n options: RegisterFromManifestOptions,\n): ToolSpec[] {\n const { manifestPathOrDir, kind: kindOpt, only, namePrefixes, packageRoot } = options;\n const loaded = loadExtensionManifest(manifestPathOrDir);\n const kind = (kindOpt ?? loaded.kind ?? \"extension\") as ToolSpec[\"kind\"];\n const entries = loaded.entries;\n const onlySet = only?.length ? new Set(only) : null;\n const registered: ToolSpec[] = [];\n\n for (const entry of entries) {\n const toolName =\n entry.name ??\n (entry.coreName != null\n ? entry.coreName.replace(/^[^/]+\\//, \"\").replace(/^src\\./, \"\")\n : entry.sourcePath.replace(/^src\\//, \"\").replace(/\\//g, \".\"));\n let spec = createToolSpec({\n name: toolName,\n kind,\n description: entry.description,\n inputSchema: entry.inputSchema,\n outputSchema: entry.outputSchema,\n capabilities: [],\n sideEffect: entry.sideEffect,\n });\n if (onlySet && !onlySet.has(spec.name)) continue;\n if (namePrefixes?.length && !namePrefixes.some((prefix) => spec.name.startsWith(prefix))) {\n continue;\n }\n const defaultArgs =\n packageRoot != null ? loadToolYaml(packageRoot, entry.sourcePath) : undefined;\n spec = {\n ...spec,\n _meta: {\n ...spec._meta,\n sourcePath: entry.sourcePath,\n exportName: entry.exportName,\n shortName: toolName,\n ...(packageRoot != null && { packageRoot }),\n ...(defaultArgs != null && Object.keys(defaultArgs).length > 0 && { defaultArgs }),\n },\n } as ToolSpec;\n registry.register(spec);\n registered.push(spec);\n }\n return registered;\n}\n"]}
@@ -1,4 +1,7 @@
1
- import { normalizeToolName } from './chunk-ODEHUAR4.js';
1
+ import { normalizeToolName } from './chunk-BDUSB6GT.js';
2
+ import pRetry from 'p-retry';
3
+ import { resolve, normalize, dirname, basename } from 'path';
4
+ import { realpath, access } from 'fs/promises';
2
5
 
3
6
  // src/core/registry/ToolRegistry.ts
4
7
  var ToolRegistry = class {
@@ -140,7 +143,106 @@ var ToolRegistry = class {
140
143
  }
141
144
  }
142
145
  };
146
+ var NON_RETRYABLE_ERRORS = /* @__PURE__ */ new Set([
147
+ "TOOL_NOT_FOUND",
148
+ "INPUT_SCHEMA_INVALID",
149
+ "POLICY_DENIED",
150
+ "HITL_DENIED",
151
+ "OUTPUT_SCHEMA_INVALID",
152
+ "PATH_OUTSIDE_SANDBOX",
153
+ "FILE_TOO_LARGE",
154
+ "HTTP_DISALLOWED_HOST",
155
+ "HTTP_TOO_LARGE",
156
+ "EXEC_INVALID",
157
+ "EXEC_SPAWN_ERROR",
158
+ "DUCKDUCKGO_INVALID"
159
+ ]);
160
+ function isRetryable(error) {
161
+ if (error instanceof Error) {
162
+ const kind = error.kind;
163
+ if (kind && NON_RETRYABLE_ERRORS.has(kind)) return false;
164
+ }
165
+ return true;
166
+ }
167
+ async function withRetry(fn, options = {}) {
168
+ const {
169
+ maxRetries = 2,
170
+ baseDelayMs = 1e3,
171
+ maxDelayMs = 1e4,
172
+ jitter = 0.1,
173
+ shouldRetry,
174
+ onRetry
175
+ } = options;
176
+ if (maxRetries <= 0) {
177
+ return fn();
178
+ }
179
+ const pRetryOptions = {
180
+ retries: maxRetries,
181
+ minTimeout: baseDelayMs,
182
+ maxTimeout: maxDelayMs,
183
+ randomize: true,
184
+ factor: 2,
185
+ onFailedAttempt: (error) => {
186
+ if (jitter > 0 && error.retriesLeft > 0) ;
187
+ if (shouldRetry && !shouldRetry(error)) {
188
+ throw error;
189
+ }
190
+ if (!isRetryable(error)) {
191
+ throw error;
192
+ }
193
+ onRetry?.(error, maxRetries - error.retriesLeft);
194
+ }
195
+ };
196
+ return pRetry(fn, pRetryOptions);
197
+ }
198
+ function createTaggedError(kind, message, details) {
199
+ const error = new Error(message);
200
+ error.kind = kind;
201
+ error.details = details;
202
+ return error;
203
+ }
204
+ var sandboxValidationEnabled = false;
205
+ function setSandboxValidationEnabled(enabled) {
206
+ sandboxValidationEnabled = enabled;
207
+ }
208
+ async function resolveSandboxedPath(inputPath, sandboxRoot) {
209
+ let normalizedRoot;
210
+ try {
211
+ normalizedRoot = await realpath(resolve(sandboxRoot));
212
+ } catch {
213
+ normalizedRoot = normalize(resolve(sandboxRoot));
214
+ }
215
+ const resolved = resolve(normalizedRoot, inputPath);
216
+ let real;
217
+ try {
218
+ await access(resolved);
219
+ real = await realpath(resolved);
220
+ } catch {
221
+ const parentDir = dirname(resolved);
222
+ let realParent;
223
+ try {
224
+ await access(parentDir);
225
+ realParent = await realpath(parentDir);
226
+ } catch {
227
+ realParent = normalize(parentDir);
228
+ }
229
+ real = resolve(realParent, basename(resolved));
230
+ }
231
+ if (sandboxValidationEnabled && !isWithinRoot(real, normalizedRoot)) {
232
+ throw createTaggedError(
233
+ "PATH_OUTSIDE_SANDBOX",
234
+ `Path "${inputPath}" resolves to "${real}" which is outside sandbox "${normalizedRoot}"`,
235
+ { inputPath, resolvedPath: real, sandboxRoot: normalizedRoot }
236
+ );
237
+ }
238
+ return real;
239
+ }
240
+ function isWithinRoot(path, root) {
241
+ const normalizedPath = normalize(path);
242
+ const normalizedRoot = normalize(root);
243
+ return normalizedPath === normalizedRoot || normalizedPath.startsWith(normalizedRoot + "/");
244
+ }
143
245
 
144
- export { ToolRegistry };
145
- //# sourceMappingURL=chunk-WUMLZERG.js.map
146
- //# sourceMappingURL=chunk-WUMLZERG.js.map
246
+ export { ToolRegistry, createTaggedError, isRetryable, resolveSandboxedPath, setSandboxValidationEnabled, withRetry };
247
+ //# sourceMappingURL=chunk-IVL4TBFB.js.map
248
+ //# sourceMappingURL=chunk-IVL4TBFB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/registry/ToolRegistry.ts","../src/core/runtime/Retry.ts","../src/security/sandbox.ts"],"names":[],"mappings":"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","file":"chunk-IVL4TBFB.js","sourcesContent":["import type { Capability, ToolKind, ToolSpec } from \"../types/ToolSpec.js\";\nimport { normalizeToolName } from \"../types/ToolSpec.js\";\n\n/**\n * Search query for tools.\n */\nexport interface ToolSearchQuery {\n /** Text search in name/description/tags */\n text?: string;\n /** Filter by tool kind */\n kind?: ToolKind;\n /** Filter by required capabilities */\n capabilities?: Capability[];\n /** Filter by tags */\n tags?: string[];\n}\n\n/**\n * Tool Registry: manages tool registration, lookup, and search.\n * Supports both static registration and dynamic discovery via adapters.\n */\nexport class ToolRegistry {\n private readonly tools = new Map<string, ToolSpec>();\n private readonly tagIndex = new Map<string, Set<string>>(); // tag → tool names\n private readonly kindIndex = new Map<ToolKind, Set<string>>(); // kind → tool names\n\n /**\n * Register a single tool spec.\n * Overwrites if same name already exists.\n */\n register(spec: ToolSpec): void {\n this.validateSpec(spec);\n const name = normalizeToolName(spec.name);\n const normalized = { ...spec, name };\n this.tools.set(name, normalized);\n this.indexTool(normalized);\n }\n\n /**\n * Register multiple tool specs at once.\n */\n bulkRegister(specs: ToolSpec[]): void {\n for (const spec of specs) {\n this.register(spec);\n }\n }\n\n /**\n * Unregister a tool by name.\n */\n unregister(name: string): boolean {\n const key = normalizeToolName(name);\n const spec = this.tools.get(key);\n if (!spec) return false;\n this.tools.delete(key);\n this.deindexTool(spec);\n return true;\n }\n\n /**\n * Get a tool spec by name (name is normalized before lookup).\n */\n get(name: string): ToolSpec | undefined {\n return this.tools.get(normalizeToolName(name));\n }\n\n /**\n * Check if a tool exists (name is normalized before lookup).\n */\n has(name: string): boolean {\n return this.tools.has(normalizeToolName(name));\n }\n\n /**\n * Search tools by query.\n */\n search(query: ToolSearchQuery): ToolSpec[] {\n let candidates: ToolSpec[];\n\n // Start with kind filter if specified (uses index)\n if (query.kind) {\n const names = this.kindIndex.get(query.kind);\n if (!names || names.size === 0) return [];\n candidates = [...names]\n .map((n) => this.tools.get(n))\n .filter((s): s is ToolSpec => s !== undefined);\n } else {\n candidates = [...this.tools.values()];\n }\n\n // Filter by tags (uses index for initial candidates if no kind filter)\n if (query.tags && query.tags.length > 0) {\n candidates = candidates.filter((spec) =>\n query.tags!.some((tag) => spec.tags?.includes(tag)),\n );\n }\n\n // Filter by capabilities\n if (query.capabilities && query.capabilities.length > 0) {\n candidates = candidates.filter((spec) =>\n query.capabilities!.every((cap) => spec.capabilities.includes(cap)),\n );\n }\n\n // Filter by text (name, description, tags)\n if (query.text) {\n const lower = query.text.toLowerCase();\n candidates = candidates.filter(\n (spec) =>\n spec.name.toLowerCase().includes(lower) ||\n spec.description?.toLowerCase().includes(lower) ||\n spec.tags?.some((t) => t.toLowerCase().includes(lower)),\n );\n }\n\n return candidates;\n }\n\n /**\n * List all registered tool names.\n */\n list(): string[] {\n return [...this.tools.keys()];\n }\n\n /**\n * Get count of registered tools.\n */\n get size(): number {\n return this.tools.size;\n }\n\n /**\n * Export a snapshot of all registered tools (for debugging/routing).\n */\n snapshot(): ToolSpec[] {\n return [...this.tools.values()];\n }\n\n /**\n * Clear all registered tools.\n */\n clear(): void {\n this.tools.clear();\n this.tagIndex.clear();\n this.kindIndex.clear();\n }\n\n private validateSpec(spec: ToolSpec): void {\n if (!spec.name) throw new Error(\"ToolSpec.name is required\");\n if (!spec.version) throw new Error(\"ToolSpec.version is required\");\n if (!spec.kind) throw new Error(\"ToolSpec.kind is required\");\n if (!spec.inputSchema) throw new Error(\"ToolSpec.inputSchema is required\");\n if (!spec.outputSchema) throw new Error(\"ToolSpec.outputSchema is required\");\n if (!spec.capabilities) throw new Error(\"ToolSpec.capabilities is required\");\n }\n\n private indexTool(spec: ToolSpec): void {\n // Kind index\n let kindSet = this.kindIndex.get(spec.kind);\n if (!kindSet) {\n kindSet = new Set();\n this.kindIndex.set(spec.kind, kindSet);\n }\n kindSet.add(spec.name);\n\n // Tag index\n if (spec.tags) {\n for (const tag of spec.tags) {\n let tagSet = this.tagIndex.get(tag);\n if (!tagSet) {\n tagSet = new Set();\n this.tagIndex.set(tag, tagSet);\n }\n tagSet.add(spec.name);\n }\n }\n }\n\n private deindexTool(spec: ToolSpec): void {\n this.kindIndex.get(spec.kind)?.delete(spec.name);\n if (spec.tags) {\n for (const tag of spec.tags) {\n this.tagIndex.get(tag)?.delete(spec.name);\n }\n }\n }\n}\n","import pRetry, { type Options as PRetryOptions } from \"p-retry\";\n\n/**\n * Retry configuration.\n */\nexport interface RetryOptions {\n /** Maximum number of retries (default: 2) */\n maxRetries?: number;\n /** Base delay in ms for exponential backoff (default: 1000) */\n baseDelayMs?: number;\n /** Maximum delay in ms (default: 10000) */\n maxDelayMs?: number;\n /** Jitter factor 0-1 (default: 0.1) */\n jitter?: number;\n /** Error filter: return true to retry, false to abort */\n shouldRetry?: (error: Error) => boolean;\n /** Callback on each retry attempt */\n onRetry?: (error: Error, attempt: number) => void;\n}\n\n/**\n * Default errors that should NOT be retried (deterministic failures).\n */\nconst NON_RETRYABLE_ERRORS = new Set([\n \"TOOL_NOT_FOUND\",\n \"INPUT_SCHEMA_INVALID\",\n \"POLICY_DENIED\",\n \"HITL_DENIED\",\n \"OUTPUT_SCHEMA_INVALID\",\n \"PATH_OUTSIDE_SANDBOX\",\n \"FILE_TOO_LARGE\",\n \"HTTP_DISALLOWED_HOST\",\n \"HTTP_TOO_LARGE\",\n \"EXEC_INVALID\",\n \"EXEC_SPAWN_ERROR\",\n \"DUCKDUCKGO_INVALID\",\n]);\n\n/**\n * Determine if an error is retryable.\n */\nexport function isRetryable(error: unknown): boolean {\n if (error instanceof Error) {\n const kind = (error as Error & { kind?: string }).kind;\n if (kind && NON_RETRYABLE_ERRORS.has(kind)) return false;\n }\n return true;\n}\n\n/**\n * Execute a function with retry logic using exponential backoff.\n */\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n options: RetryOptions = {},\n): Promise<T> {\n const {\n maxRetries = 2,\n baseDelayMs = 1000,\n maxDelayMs = 10_000,\n jitter = 0.1,\n shouldRetry,\n onRetry,\n } = options;\n\n if (maxRetries <= 0) {\n return fn();\n }\n\n const pRetryOptions: PRetryOptions = {\n retries: maxRetries,\n minTimeout: baseDelayMs,\n maxTimeout: maxDelayMs,\n randomize: true,\n factor: 2,\n onFailedAttempt: (error) => {\n // Apply jitter\n if (jitter > 0 && error.retriesLeft > 0) {\n // jitterMs calculated but p-retry handles backoff internally\n void (Math.random() * jitter * baseDelayMs);\n }\n\n // Check if should retry\n if (shouldRetry && !shouldRetry(error)) {\n throw error; // Abort retry\n }\n\n if (!isRetryable(error)) {\n throw error; // Non-retryable error kind\n }\n\n onRetry?.(error, maxRetries - error.retriesLeft);\n },\n };\n\n return pRetry(fn, pRetryOptions);\n}\n\n/**\n * Create a tagged error with a kind field for retry classification.\n */\nexport function createTaggedError(\n kind: string,\n message: string,\n details?: unknown,\n): Error & { kind: string; details?: unknown } {\n const error = new Error(message) as Error & {\n kind: string;\n details?: unknown;\n };\n error.kind = kind;\n error.details = details;\n return error;\n}\n","import { resolve, normalize, dirname, basename } from \"node:path\";\nimport { realpath, access } from \"node:fs/promises\";\nimport { createTaggedError } from \"../core/runtime/Retry.js\";\n\nlet sandboxValidationEnabled = false;\n\nexport function setSandboxValidationEnabled(enabled: boolean): void {\n sandboxValidationEnabled = enabled;\n}\n\n/**\n * Resolve an input path to an absolute path within the sandbox.\n * Throws PATH_OUTSIDE_SANDBOX if the resolved path escapes the sandbox root.\n *\n * For existing files: uses realpath to resolve symlinks.\n * For non-existing files (write targets): resolves the parent directory.\n */\nexport async function resolveSandboxedPath(\n inputPath: string,\n sandboxRoot: string,\n): Promise<string> {\n // Resolve the sandbox root itself with realpath to handle platform symlinks\n // (e.g. macOS /var -> /private/var)\n let normalizedRoot: string;\n try {\n normalizedRoot = await realpath(resolve(sandboxRoot));\n } catch {\n normalizedRoot = normalize(resolve(sandboxRoot));\n }\n\n // Resolve against sandbox root\n const resolved = resolve(normalizedRoot, inputPath);\n\n let real: string;\n try {\n // Try to resolve symlinks for existing paths\n await access(resolved);\n real = await realpath(resolved);\n } catch {\n // Path does not exist — resolve parent to check containment\n const parentDir = dirname(resolved);\n let realParent: string;\n try {\n await access(parentDir);\n realParent = await realpath(parentDir);\n } catch {\n // Parent also doesn't exist — use normalized resolved path\n // (will fail at actual FS operation if truly invalid)\n realParent = normalize(parentDir);\n }\n real = resolve(realParent, basename(resolved));\n }\n\n if (sandboxValidationEnabled && !isWithinRoot(real, normalizedRoot)) {\n throw createTaggedError(\n \"PATH_OUTSIDE_SANDBOX\",\n `Path \"${inputPath}\" resolves to \"${real}\" which is outside sandbox \"${normalizedRoot}\"`,\n { inputPath, resolvedPath: real, sandboxRoot: normalizedRoot },\n );\n }\n\n return real;\n}\n\nfunction isWithinRoot(path: string, root: string): boolean {\n const normalizedPath = normalize(path);\n const normalizedRoot = normalize(root);\n return normalizedPath === normalizedRoot || normalizedPath.startsWith(normalizedRoot + \"/\");\n}\n"]}
@@ -1,6 +1,5 @@
1
1
  'use strict';
2
2
 
3
- var chunkQEJF3KDV_cjs = require('./chunk-QEJF3KDV.cjs');
4
3
  var path = require('path');
5
4
  var fs = require('fs');
6
5
  var ts2 = require('typescript');
@@ -28,6 +27,7 @@ var path__namespace = /*#__PURE__*/_interopNamespace(path);
28
27
  var fs__namespace = /*#__PURE__*/_interopNamespace(fs);
29
28
  var ts2__namespace = /*#__PURE__*/_interopNamespace(ts2);
30
29
 
30
+ // src/tools/function/scanner.ts
31
31
  async function findDirsContainingFile(rootPath, fileName) {
32
32
  const found = [];
33
33
  await collectDirsWithFile(rootPath, fileName, found);
@@ -198,6 +198,36 @@ function typeToJsonSchema(type, typeChecker, onWarn) {
198
198
  // src/tools/function/types.ts
199
199
  var FUNCTION_KIND = "function";
200
200
 
201
+ // src/core/types/ToolSpec.ts
202
+ function normalizeToolName(name) {
203
+ if (typeof name !== "string" || !name) return name;
204
+ return name.replace(/[^a-zA-Z0-9]/g, ".").replace(/\.+/g, ".");
205
+ }
206
+ var DEFAULT_INPUT_SCHEMA = {
207
+ type: "object",
208
+ additionalProperties: true
209
+ };
210
+ var DEFAULT_OUTPUT_SCHEMA = {
211
+ type: "object",
212
+ additionalProperties: true
213
+ };
214
+ function createToolSpec(opts) {
215
+ const sideEffect = opts.sideEffect ?? "none";
216
+ const name = normalizeToolName(opts.name);
217
+ return {
218
+ name,
219
+ version: opts.version ?? "1.0.0",
220
+ kind: opts.kind,
221
+ description: opts.description,
222
+ tags: opts.tags,
223
+ inputSchema: opts.inputSchema ?? DEFAULT_INPUT_SCHEMA,
224
+ outputSchema: opts.outputSchema ?? DEFAULT_OUTPUT_SCHEMA,
225
+ capabilities: opts.capabilities,
226
+ costHints: opts.costHints,
227
+ _meta: { hitl: { sideEffect } }
228
+ };
229
+ }
230
+
201
231
  // src/tools/skill/types.ts
202
232
  var SKILL_KIND = "skill";
203
233
  var SKILL_DIR_NAME = "skill";
@@ -214,7 +244,7 @@ function mcpSpecToToolSpec(spec, projectPath) {
214
244
  kind: spec.kind,
215
245
  description: spec.description,
216
246
  inputSchema: spec.inputSchema ?? DEFAULT_OUTPUT,
217
- outputSchema: "outputSchema" in spec && spec.outputSchema ? spec.outputSchema : chunkQEJF3KDV_cjs.DEFAULT_OUTPUT_SCHEMA,
247
+ outputSchema: "outputSchema" in spec && spec.outputSchema ? spec.outputSchema : DEFAULT_OUTPUT_SCHEMA,
218
248
  capabilities: [],
219
249
  _meta: spec._meta,
220
250
  ...spec.kind === N8N_KIND && "webhookUrl" in spec && spec.webhookUrl ? { endpoint: spec.webhookUrl } : {}
@@ -323,7 +353,7 @@ function toFunctionToolSpec(input) {
323
353
  const host = getJSDocHost(decl.func);
324
354
  if (!hasToolTag(host)) return null;
325
355
  const jsDoc = getJSDocComments(host);
326
- const description = getDescription(jsDoc, decl.name);
356
+ const description = getDescription(jsDoc);
327
357
  if (!description) {
328
358
  input.warnings.push({
329
359
  file: input.fileName,
@@ -450,7 +480,7 @@ function hasToolTag(host) {
450
480
  }
451
481
  return false;
452
482
  }
453
- function getDescription(jsDocs, fallbackName) {
483
+ function getDescription(jsDocs) {
454
484
  for (const doc of jsDocs) {
455
485
  const comment = doc.comment;
456
486
  if (typeof comment === "string") {
@@ -512,10 +542,12 @@ exports.FUNCTION_KIND = FUNCTION_KIND;
512
542
  exports.N8N_KIND = N8N_KIND;
513
543
  exports.SKILL_DIR_NAME = SKILL_DIR_NAME;
514
544
  exports.SKILL_KIND = SKILL_KIND;
545
+ exports.createToolSpec = createToolSpec;
515
546
  exports.findDirsContainingFile = findDirsContainingFile;
516
547
  exports.mcpSpecToToolSpec = mcpSpecToToolSpec;
548
+ exports.normalizeToolName = normalizeToolName;
517
549
  exports.pathToToolName = pathToToolName;
518
550
  exports.scan = scan;
519
551
  exports.scanForTools = scanForTools;
520
- //# sourceMappingURL=chunk-LHKEJNKL.cjs.map
521
- //# sourceMappingURL=chunk-LHKEJNKL.cjs.map
552
+ //# sourceMappingURL=chunk-JW4EMVTE.cjs.map
553
+ //# sourceMappingURL=chunk-JW4EMVTE.cjs.map