@easynet/agent-tool 1.0.59 → 1.0.61

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 (81) hide show
  1. package/dist/api/expose/index.d.ts +1 -1
  2. package/dist/api/expose/index.d.ts.map +1 -1
  3. package/dist/api/expose/mcp-build/build.d.ts +1 -3
  4. package/dist/api/expose/mcp-build/build.d.ts.map +1 -1
  5. package/dist/api/expose/mcp-build/index.d.ts +2 -2
  6. package/dist/api/expose/mcp-build/index.d.ts.map +1 -1
  7. package/dist/api/expose/mcp-build/run.d.ts +1 -3
  8. package/dist/api/expose/mcp-build/run.d.ts.map +1 -1
  9. package/dist/api/main.cjs +19 -15
  10. package/dist/api/main.js +8 -4
  11. package/dist/build.cjs +31 -0
  12. package/dist/build.cjs.map +1 -0
  13. package/dist/build.d.ts +13 -0
  14. package/dist/build.d.ts.map +1 -0
  15. package/dist/build.js +6 -0
  16. package/dist/build.js.map +1 -0
  17. package/dist/chunk-45S2HPVU.js +463 -0
  18. package/dist/chunk-45S2HPVU.js.map +1 -0
  19. package/dist/{chunk-Y75CRPVF.js → chunk-5J27MF7S.js} +11 -12
  20. package/dist/chunk-5J27MF7S.js.map +1 -0
  21. package/dist/{chunk-JXYANBTH.cjs → chunk-HK4GTFTQ.cjs} +57 -1645
  22. package/dist/chunk-HK4GTFTQ.cjs.map +1 -0
  23. package/dist/chunk-JNIWNSCQ.cjs +494 -0
  24. package/dist/chunk-JNIWNSCQ.cjs.map +1 -0
  25. package/dist/{chunk-DPOLJN7F.cjs → chunk-NMZ4IMEW.cjs} +22 -25
  26. package/dist/chunk-NMZ4IMEW.cjs.map +1 -0
  27. package/dist/{chunk-A5C2MUNA.js → chunk-NVT4X4CB.js} +41 -1600
  28. package/dist/chunk-NVT4X4CB.js.map +1 -0
  29. package/dist/chunk-OG5ZSXQ5.cjs +1099 -0
  30. package/dist/chunk-OG5ZSXQ5.cjs.map +1 -0
  31. package/dist/{chunk-WQMHMPNC.cjs → chunk-PYCCJF7C.cjs} +2 -68
  32. package/dist/chunk-PYCCJF7C.cjs.map +1 -0
  33. package/dist/{chunk-IWM5B5DU.js → chunk-QPKBEU64.js} +4 -3
  34. package/dist/chunk-QPKBEU64.js.map +1 -0
  35. package/dist/chunk-QXQ4477T.js +49 -0
  36. package/dist/chunk-QXQ4477T.js.map +1 -0
  37. package/dist/chunk-RZTTO5MQ.js +65 -0
  38. package/dist/chunk-RZTTO5MQ.js.map +1 -0
  39. package/dist/{chunk-FCYBA7PR.js → chunk-WUMLZERG.js} +3 -62
  40. package/dist/chunk-WUMLZERG.js.map +1 -0
  41. package/dist/chunk-XPGHS4W7.cjs +73 -0
  42. package/dist/chunk-XPGHS4W7.cjs.map +1 -0
  43. package/dist/chunk-YRFUGA3C.js +1072 -0
  44. package/dist/chunk-YRFUGA3C.js.map +1 -0
  45. package/dist/chunk-ZDSZHEQU.cjs +52 -0
  46. package/dist/chunk-ZDSZHEQU.cjs.map +1 -0
  47. package/dist/{chunk-MUBZV65R.cjs → chunk-ZH5MH3AK.cjs} +16 -15
  48. package/dist/chunk-ZH5MH3AK.cjs.map +1 -0
  49. package/dist/core/runtime.cjs +6 -5
  50. package/dist/core/runtime.js +2 -1
  51. package/dist/extension.cjs +359 -0
  52. package/dist/extension.cjs.map +1 -0
  53. package/dist/extension.d.ts +6 -0
  54. package/dist/extension.d.ts.map +1 -0
  55. package/dist/extension.js +341 -0
  56. package/dist/extension.js.map +1 -0
  57. package/dist/index.cjs +17 -609
  58. package/dist/index.cjs.map +1 -1
  59. package/dist/index.d.ts +1 -25
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +8 -520
  62. package/dist/index.js.map +1 -1
  63. package/dist/security.cjs +193 -0
  64. package/dist/security.cjs.map +1 -0
  65. package/dist/security.d.ts +6 -0
  66. package/dist/security.d.ts.map +1 -0
  67. package/dist/security.js +182 -0
  68. package/dist/security.js.map +1 -0
  69. package/dist/utils/cli/index.cjs +25 -21
  70. package/dist/utils/cli/index.cjs.map +1 -1
  71. package/dist/utils/cli/index.js +13 -9
  72. package/dist/utils/cli/index.js.map +1 -1
  73. package/package.json +16 -2
  74. package/dist/chunk-A5C2MUNA.js.map +0 -1
  75. package/dist/chunk-DPOLJN7F.cjs.map +0 -1
  76. package/dist/chunk-FCYBA7PR.js.map +0 -1
  77. package/dist/chunk-IWM5B5DU.js.map +0 -1
  78. package/dist/chunk-JXYANBTH.cjs.map +0 -1
  79. package/dist/chunk-MUBZV65R.cjs.map +0 -1
  80. package/dist/chunk-WQMHMPNC.cjs.map +0 -1
  81. package/dist/chunk-Y75CRPVF.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tools/mcp/types.ts","../src/tools/util/resolveEntry.ts","../src/tools/skill/SkillManifest.ts","../src/tools/skill/SkillMdParser.ts","../src/tools/skill/scanSkill.ts","../src/tools/n8n/N8nLoader.ts","../src/tools/n8n/scanN8n.ts","../src/tools/mcp/scanner.ts","../src/tools/langchain/types.ts","../src/tools/langchain/scanner.ts","../src/tools/langchain/LangChainLoader.ts","../src/tools/skill/SkillLoader.ts","../src/tools/langchain/directoryLoad.ts","../src/tools/mcp/MCPLoader.ts","../src/tools/mcp/directoryApply.ts","../src/tools/langchain/directoryApply.ts","../src/tools/skill/directoryApply.ts","../src/tools/n8n/directoryApply.ts","../src/tools/discoveryFactory.ts"],"names":["join","stat","path","yaml","readdir","extname","relative","readFile","findDirsContainingFile","pathToToolName","SKILL_KIND","scan","mcpSpecToToolSpec","basename","defaultInputSchema","path2","N8N_KIND","path3","path4","pathToFileURL","DEFAULT_EXTENSIONS","entryFile","loaded","applyLoadedToSpec","directoryMarker","path5","SKILL_DIR_NAME","access"],"mappings":"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","file":"chunk-OG5ZSXQ5.cjs","sourcesContent":["/** Kind for MCP directory discovery. */\nexport const MCP_KIND = \"mcp\" as const;\n","/**\n * Resolve entry point file for a tool directory.\n * Used by skill and langchain loaders (each has its own default: handler vs index).\n */\n\nimport { join } from \"node:path\";\nimport { stat } from \"node:fs/promises\";\n\n/** Runtime-executable extensions only (Node runs .js/.mjs; .ts is not needed unless using ts-node/tsx). */\nconst DEFAULT_EXTENSIONS = [\".js\", \".mjs\"];\n\nexport async function resolveEntryPoint(\n dirPath: string,\n baseName: string,\n extensions: string[] = DEFAULT_EXTENSIONS,\n): Promise<string> {\n if (extensions.some((ext) => baseName.endsWith(ext))) {\n const fullPath = join(dirPath, baseName);\n await stat(fullPath);\n return fullPath;\n }\n for (const ext of extensions) {\n const fullPath = join(dirPath, `${baseName}${ext}`);\n try {\n await stat(fullPath);\n return fullPath;\n } catch {\n // try next\n }\n }\n throw new Error(\n `Could not find entry point in ${dirPath}. Tried: ${extensions.map((e) => baseName + e).join(\", \")}`,\n );\n}\n","/**\n * Parsed SKILL.md manifest following Anthropic's Agent Skills specification.\n *\n * A SKILL.md file has:\n * - YAML frontmatter with `name` and `description` (Level 1: metadata, always loaded)\n * - Markdown body with instructions (Level 2: loaded when triggered)\n * - Bundled resource files referenced from the body (Level 3: loaded as needed)\n *\n * @see https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview\n */\n\n/**\n * YAML frontmatter from SKILL.md (Agent Skills spec).\n * Level 1 (metadata) — always loaded at startup for discovery.\n * @see https://agentskills.io/specification\n */\nexport interface SkillFrontmatter {\n /**\n * Skill name identifier (required).\n * - Max 64 characters; lowercase letters, numbers, hyphens only\n * - Must not start or end with hyphen; no consecutive hyphens\n */\n name: string;\n\n /**\n * What the skill does and when to use it (required).\n * - Max 1024 characters\n */\n description: string;\n\n /** Optional: license name or reference (e.g. Apache-2.0, LICENSE.txt). */\n license?: string;\n\n /** Optional: environment requirements, max 500 characters. */\n compatibility?: string;\n\n /** Optional: arbitrary key-value metadata. */\n metadata?: Record<string, string>;\n\n /** Optional: space-delimited list of pre-approved tools (experimental). */\n allowedTools?: string;\n}\n\n/**\n * A resource file bundled with the skill.\n * Resources are Level 3 — loaded only as needed during execution.\n */\nexport interface SkillResource {\n /** Relative path from the skill directory */\n relativePath: string;\n /** Absolute path on disk */\n absolutePath: string;\n /** File extension (e.g., \".md\", \".py\", \".json\") */\n extension: string;\n /** Resource type inferred from extension */\n type: \"instructions\" | \"code\" | \"data\";\n}\n\n/**\n * Full parsed SKILL.md with progressive disclosure levels.\n */\nexport interface SkillDefinition {\n /** Level 1: Metadata from YAML frontmatter (always loaded, ~100 tokens) */\n frontmatter: SkillFrontmatter;\n\n /** Level 2: Markdown body instructions (loaded when skill triggered, <5k tokens recommended) */\n instructions: string;\n\n /** Level 3: Bundled resource files (loaded as needed, effectively unlimited) */\n resources: SkillResource[];\n\n /** Absolute path to the skill directory */\n dirPath: string;\n\n /** Absolute path to the SKILL.md file */\n skillMdPath: string;\n}\n\n/**\n * Validation error for SKILL.md parsing.\n */\nexport class SkillManifestError extends Error {\n constructor(\n public readonly path: string,\n public readonly field: string,\n message: string,\n ) {\n super(`SKILL.md error in ${path}: ${message}`);\n this.name = \"SkillManifestError\";\n }\n}\n\n// --- Validation helpers ---\n\nconst NAME_PATTERN = /^[a-z0-9-]+$/;\nconst NAME_MAX_LENGTH = 64;\nconst DESCRIPTION_MAX_LENGTH = 1024;\nconst COMPATIBILITY_MAX_LENGTH = 500;\nconst RESERVED_WORDS = [\"anthropic\", \"claude\"];\nconst XML_TAG_PATTERN = /<\\/?[a-zA-Z][^>]*>/;\n\n/**\n * Validate a SkillFrontmatter object.\n * Throws SkillManifestError if invalid.\n */\nexport function validateFrontmatter(\n fm: Partial<SkillFrontmatter>,\n filePath: string,\n): asserts fm is SkillFrontmatter {\n // name: required\n if (!fm.name || typeof fm.name !== \"string\") {\n throw new SkillManifestError(filePath, \"name\", \"name is required\");\n }\n if (fm.name.length > NAME_MAX_LENGTH) {\n throw new SkillManifestError(\n filePath,\n \"name\",\n `name must be at most ${NAME_MAX_LENGTH} characters (got ${fm.name.length})`,\n );\n }\n if (!NAME_PATTERN.test(fm.name)) {\n throw new SkillManifestError(\n filePath,\n \"name\",\n \"name must contain only lowercase letters, numbers, and hyphens\",\n );\n }\n if (fm.name.startsWith(\"-\") || fm.name.endsWith(\"-\")) {\n throw new SkillManifestError(\n filePath,\n \"name\",\n \"name must not start or end with a hyphen\",\n );\n }\n if (fm.name.includes(\"--\")) {\n throw new SkillManifestError(\n filePath,\n \"name\",\n \"name must not contain consecutive hyphens\",\n );\n }\n if (XML_TAG_PATTERN.test(fm.name)) {\n throw new SkillManifestError(filePath, \"name\", \"name cannot contain XML tags\");\n }\n for (const reserved of RESERVED_WORDS) {\n if (fm.name.includes(reserved)) {\n throw new SkillManifestError(\n filePath,\n \"name\",\n `name cannot contain reserved word \"${reserved}\"`,\n );\n }\n }\n\n // description: required\n if (!fm.description || typeof fm.description !== \"string\") {\n throw new SkillManifestError(\n filePath,\n \"description\",\n \"description is required and must be non-empty\",\n );\n }\n if (fm.description.length > DESCRIPTION_MAX_LENGTH) {\n throw new SkillManifestError(\n filePath,\n \"description\",\n `description must be at most ${DESCRIPTION_MAX_LENGTH} characters (got ${fm.description.length})`,\n );\n }\n if (XML_TAG_PATTERN.test(fm.description)) {\n throw new SkillManifestError(\n filePath,\n \"description\",\n \"description cannot contain XML tags\",\n );\n }\n\n // Optional: compatibility max 500 characters\n if (fm.compatibility != null && typeof fm.compatibility === \"string\") {\n if (fm.compatibility.length > COMPATIBILITY_MAX_LENGTH) {\n throw new SkillManifestError(\n filePath,\n \"compatibility\",\n `compatibility must be at most ${COMPATIBILITY_MAX_LENGTH} characters (got ${fm.compatibility.length})`,\n );\n }\n }\n}\n","import { readFile, readdir } from \"node:fs/promises\";\nimport { join, extname, relative } from \"node:path\";\nimport yaml from \"js-yaml\";\nimport type {\n SkillDefinition,\n SkillFrontmatter,\n SkillResource,\n} from \"./SkillManifest.js\";\nimport { SkillManifestError, validateFrontmatter } from \"./SkillManifest.js\";\n\n/**\n * File extensions categorized by resource type.\n */\nconst CODE_EXTENSIONS = new Set([\n \".py\", \".js\", \".mjs\", \".ts\", \".sh\", \".bash\", \".rb\", \".go\",\n]);\nconst INSTRUCTION_EXTENSIONS = new Set([\".md\", \".markdown\", \".txt\"]);\n\n/**\n * Files to exclude from resource scanning.\n */\nconst EXCLUDED_FILES = new Set([\"SKILL.md\", \"tool.json\"]);\n\n/**\n * Parse a SKILL.md file into its constituent parts:\n * - YAML frontmatter (metadata)\n * - Markdown body (instructions)\n *\n * Supports the standard YAML frontmatter format:\n * ```\n * ---\n * name: my-skill\n * description: Does something useful\n * ---\n *\n * # Instructions here...\n * ```\n */\nexport function parseSkillMd(\n content: string,\n filePath: string,\n): { frontmatter: SkillFrontmatter; instructions: string } {\n const trimmed = content.trimStart();\n\n if (!trimmed.startsWith(\"---\")) {\n throw new SkillManifestError(\n filePath,\n \"frontmatter\",\n \"SKILL.md must start with YAML frontmatter (---)\",\n );\n }\n\n // Find the closing ---\n const endIndex = trimmed.indexOf(\"\\n---\", 3);\n if (endIndex === -1) {\n throw new SkillManifestError(\n filePath,\n \"frontmatter\",\n \"SKILL.md frontmatter is not closed (missing closing ---)\",\n );\n }\n\n const yamlBlock = trimmed.slice(4, endIndex).trim();\n const body = trimmed.slice(endIndex + 4).trim();\n\n let raw: Record<string, unknown>;\n try {\n const parsed = yaml.load(yamlBlock);\n if (parsed == null || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new SkillManifestError(\n filePath,\n \"frontmatter\",\n \"YAML frontmatter must be an object (key: value)\",\n );\n }\n raw = parsed as Record<string, unknown>;\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n throw new SkillManifestError(\n filePath,\n \"frontmatter\",\n `Invalid YAML frontmatter: ${message}`,\n );\n }\n\n const name = stringField(raw, \"name\", filePath);\n const description = stringField(raw, \"description\", filePath);\n if (!name || !description) {\n throw new SkillManifestError(\n filePath,\n \"frontmatter\",\n !name ? \"name is required\" : \"description is required\",\n );\n }\n\n const license = stringField(raw, \"license\");\n const compatibility = stringField(raw, \"compatibility\");\n const allowedTools = stringField(raw, \"allowed-tools\");\n const metadata = normalizeMetadata(raw.metadata);\n\n const frontmatter: SkillFrontmatter = {\n name,\n description,\n ...(license && { license }),\n ...(compatibility && { compatibility }),\n ...(allowedTools && { allowedTools }),\n ...(metadata && Object.keys(metadata).length > 0 && { metadata }),\n };\n validateFrontmatter(frontmatter, filePath);\n\n return { frontmatter, instructions: body };\n}\n\nfunction stringField(\n raw: Record<string, unknown>,\n key: string,\n filePath?: string,\n): string {\n const v = raw[key];\n if (v == null) return \"\";\n if (typeof v === \"string\") return v;\n if (typeof v === \"number\" || typeof v === \"boolean\") return String(v);\n if (Array.isArray(v)) {\n return v.map((x) => (typeof x === \"string\" ? x : String(x))).join(\"\\n\");\n }\n if (filePath) {\n throw new SkillManifestError(\n filePath,\n \"frontmatter\",\n `Frontmatter field \"${key}\" must be a string, number, boolean, or array`,\n );\n }\n return String(v);\n}\n\n/**\n * Normalize frontmatter `metadata` to Record<string, string>.\n * Supports nested YAML: { author: \"...\", version: \"...\" } → flat string values.\n */\nfunction normalizeMetadata(val: unknown): Record<string, string> | undefined {\n if (val == null) return undefined;\n if (typeof val === \"object\" && !Array.isArray(val)) {\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(val)) {\n if (typeof k === \"string\" && v !== undefined && v !== null) {\n out[k] = typeof v === \"object\" ? JSON.stringify(v) : String(v);\n }\n }\n return Object.keys(out).length ? out : undefined;\n }\n if (typeof val === \"string\" || typeof val === \"number\" || typeof val === \"boolean\") {\n return { value: String(val) };\n }\n return undefined;\n}\n\n\n/**\n * Scan a skill directory for bundled resource files (Level 3).\n * Recursively finds all files except SKILL.md and tool.json.\n */\nexport async function scanSkillResources(dirPath: string): Promise<SkillResource[]> {\n const resources: SkillResource[] = [];\n await scanDir(dirPath, dirPath, resources);\n return resources;\n}\n\nasync function scanDir(\n basePath: string,\n currentPath: string,\n resources: SkillResource[],\n): Promise<void> {\n let entries;\n try {\n entries = await readdir(currentPath, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n const fullPath = join(currentPath, entry.name);\n\n if (entry.isDirectory()) {\n // Skip node_modules and hidden directories\n if (entry.name.startsWith(\".\") || entry.name === \"node_modules\") {\n continue;\n }\n await scanDir(basePath, fullPath, resources);\n } else if (entry.isFile()) {\n // Skip excluded files\n if (EXCLUDED_FILES.has(entry.name)) {\n continue;\n }\n\n const ext = extname(entry.name).toLowerCase();\n const relPath = relative(basePath, fullPath);\n\n resources.push({\n relativePath: relPath,\n absolutePath: fullPath,\n extension: ext,\n type: inferResourceType(ext),\n });\n }\n }\n}\n\nfunction inferResourceType(ext: string): SkillResource[\"type\"] {\n if (CODE_EXTENSIONS.has(ext)) return \"code\";\n if (INSTRUCTION_EXTENSIONS.has(ext)) return \"instructions\";\n return \"data\";\n}\n\n/**\n * Load and parse a complete skill from a directory containing SKILL.md.\n * Returns the full SkillDefinition with all three progressive disclosure levels.\n */\nexport async function loadSkillDefinition(dirPath: string): Promise<SkillDefinition> {\n const skillMdPath = join(dirPath, \"SKILL.md\");\n\n let content: string;\n try {\n content = await readFile(skillMdPath, \"utf-8\");\n } catch (err) {\n throw new SkillManifestError(\n skillMdPath,\n \"file\",\n `Cannot read SKILL.md: ${(err as Error).message}`,\n );\n }\n\n const { frontmatter, instructions } = parseSkillMd(content, skillMdPath);\n const resources = await scanSkillResources(dirPath);\n\n return {\n frontmatter,\n instructions,\n resources,\n dirPath,\n skillMdPath,\n };\n}\n","/**\n * Scan project for SKILL.md directories; produce MCP tool specs.\n * Exposes both scanForSkill (raw) and scan (unified DiscoverToolsResult).\n */\n\nimport * as path from \"node:path\";\nimport { findDirsContainingFile, pathToToolName } from \"../util/scanUtil.js\";\nimport { loadSkillDefinition } from \"./SkillMdParser.js\";\nimport type { SkillToolSpec } from \"./types.js\";\nimport { SKILL_KIND } from \"./types.js\";\nimport type { DiscoverToolsOptions, DiscoverToolsResult } from \"../discoveryFactory.js\";\nimport { mcpSpecToToolSpec } from \"../mcp/mcpSpecToToolSpec.js\";\n\nexport interface ScanSkillResult {\n skills: SkillToolSpec[];\n errors: Array<{ dir: string; message: string }>;\n}\n\nconst defaultInputSchema = { type: \"object\" as const, properties: {}, additionalProperties: true };\n\n/**\n * Scan projectPath for SKILL.md directories; return skill tool specs.\n */\nexport async function scanForSkill(projectPath: string): Promise<ScanSkillResult> {\n const projectRoot = path.resolve(projectPath);\n const dirs = await findDirsContainingFile(projectRoot, \"SKILL.md\");\n\n const skills: SkillToolSpec[] = [];\n const errors: Array<{ dir: string; message: string }> = [];\n\n for (const dirPath of dirs) {\n const relativePath = path.relative(projectRoot, dirPath) || path.basename(dirPath);\n try {\n const skillDef = await loadSkillDefinition(dirPath);\n const name = pathToToolName(relativePath, skillDef.frontmatter.name);\n skills.push({\n kind: SKILL_KIND,\n name,\n description: skillDef.frontmatter.description,\n inputSchema: defaultInputSchema,\n _meta: { hitl: { sideEffect: \"none\" } },\n sourcePath: relativePath.replace(/\\\\/g, \"/\"),\n });\n } catch (err) {\n errors.push({ dir: relativePath, message: err instanceof Error ? err.message : String(err) });\n }\n }\n\n return { skills, errors };\n}\n\n/** Unified scan: (path, options) → DiscoverToolsResult. */\nexport async function scan(\n projectPath: string,\n _options: DiscoverToolsOptions = {},\n): Promise<DiscoverToolsResult> {\n const root = path.resolve(projectPath);\n const result = await scanForSkill(root);\n const specs = result.skills.map((s) => mcpSpecToToolSpec(s, root));\n return {\n specs,\n errors: result.errors.map((e) => ({ file: e.dir, message: e.message })),\n };\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join, basename } from \"node:path\";\nimport type { ToolManifest, LoadedTool } from \"../discoveryFactory.js\";\nimport { DiscoveryError } from \"../discoveryFactory.js\";\n\n/** Metadata extracted from workflow.json for spec building (used by N8nLoader and scan scanN8n). */\nexport interface WorkflowMeta {\n name: string;\n description: string;\n webhookUrl?: string;\n workflowDef: Record<string, unknown>;\n}\n\n/**\n * Read and parse workflow.json in dirPath; return metadata and raw workflow.\n * Shared by loadN8nTool (runtime) and scan scanN8n.\n */\nexport async function readWorkflowMeta(\n dirPath: string,\n workflowFileName: string = \"workflow.json\",\n): Promise<WorkflowMeta> {\n const workflowPath = join(dirPath, workflowFileName);\n let raw: string;\n try {\n raw = await readFile(workflowPath, \"utf-8\");\n } catch (err) {\n throw new DiscoveryError(\n dirPath,\n \"load\",\n `Failed to read workflow: ${workflowPath}`,\n err as Error,\n );\n }\n let workflowDef: Record<string, unknown>;\n try {\n workflowDef = JSON.parse(raw) as Record<string, unknown>;\n } catch (err) {\n throw new DiscoveryError(\n dirPath,\n \"load\",\n `Invalid JSON in ${workflowPath}`,\n err as Error,\n );\n }\n if (!workflowDef.nodes || !Array.isArray(workflowDef.nodes)) {\n throw new DiscoveryError(\n dirPath,\n \"validate\",\n `workflow.json must have a \"nodes\" array`,\n );\n }\n const meta = workflowDef.meta as Record<string, unknown> | undefined;\n const name =\n (workflowDef.name as string) ||\n (meta?.name as string) ||\n basename(dirPath);\n const description =\n (workflowDef.description as string) ||\n (meta?.description as string) ||\n `n8n workflow: ${name}`;\n let webhookUrl: string | undefined;\n const nodes = workflowDef.nodes as Array<Record<string, unknown>> | undefined;\n if (Array.isArray(nodes)) {\n const webhookNode = nodes.find(\n (n) =>\n n.type === \"n8n-nodes-base.webhook\" || (n.type as string)?.includes(\"webhook\"),\n );\n if (webhookNode?.parameters && typeof webhookNode.parameters === \"object\") {\n const params = webhookNode.parameters as Record<string, unknown>;\n const pathVal = params.path ?? params.webhookPath;\n if (typeof pathVal === \"string\" && pathVal.startsWith(\"http\")) {\n webhookUrl = pathVal;\n }\n }\n }\n return { name, description, webhookUrl, workflowDef };\n}\n\n/**\n * Load an n8n tool from its directory.\n * Reads workflow.json and validates it has a \"nodes\" array.\n *\n * Description for the tool spec is taken (in order) from:\n * 1. tool.json \"description\" (if present)\n * 2. workflow.json \"description\" or \"meta.description\"\n * 3. workflow.json \"name\" (n8n workflow name)\n * 4. Fallback: \"n8n tool: <dirName>\"\n */\nexport async function loadN8nTool(\n dirPath: string,\n manifest: ToolManifest,\n): Promise<LoadedTool> {\n const { workflowDef } = await readWorkflowMeta(\n dirPath,\n manifest.entryPoint ?? \"workflow.json\",\n );\n return { manifest, dirPath, workflowDef };\n}\n","/**\n * Scan project for workflow.json (n8n) directories; produce MCP tool specs.\n * Exposes both scanForN8n (raw) and scan (unified DiscoverToolsResult).\n */\n\nimport * as path from \"node:path\";\nimport { findDirsContainingFile, pathToToolName } from \"../util/scanUtil.js\";\nimport { readWorkflowMeta } from \"./N8nLoader.js\";\nimport type { N8nToolSpec } from \"./types.js\";\nimport { N8N_KIND } from \"./types.js\";\nimport type { DiscoverToolsOptions, DiscoverToolsResult } from \"../discoveryFactory.js\";\nimport { mcpSpecToToolSpec } from \"../mcp/mcpSpecToToolSpec.js\";\n\nexport interface ScanN8nResult {\n n8n: N8nToolSpec[];\n errors: Array<{ dir: string; message: string }>;\n}\n\nconst defaultInputSchema = { type: \"object\" as const, properties: {}, additionalProperties: true };\n\n/**\n * Scan projectPath for workflow.json directories; return n8n tool specs.\n */\nexport async function scanForN8n(projectPath: string): Promise<ScanN8nResult> {\n const projectRoot = path.resolve(projectPath);\n const dirs = await findDirsContainingFile(projectRoot, \"workflow.json\");\n\n const n8n: N8nToolSpec[] = [];\n const errors: Array<{ dir: string; message: string }> = [];\n\n for (const dirPath of dirs) {\n const relativePath = path.relative(projectRoot, dirPath) || path.basename(dirPath);\n try {\n const { name: wfName, description: wfDesc, webhookUrl } = await readWorkflowMeta(dirPath);\n const toolName = pathToToolName(relativePath, wfName);\n n8n.push({\n kind: N8N_KIND,\n name: toolName,\n description: wfDesc,\n inputSchema: defaultInputSchema,\n _meta: { hitl: { sideEffect: \"external_write\" } },\n sourcePath: relativePath.replace(/\\\\/g, \"/\"),\n webhookUrl,\n });\n } catch (err) {\n errors.push({ dir: relativePath, message: err instanceof Error ? err.message : String(err) });\n }\n }\n\n return { n8n, errors };\n}\n\n/** Unified scan: (path, options) → DiscoverToolsResult. */\nexport async function scan(\n projectPath: string,\n _options: DiscoverToolsOptions = {},\n): Promise<DiscoverToolsResult> {\n const root = path.resolve(projectPath);\n const result = await scanForN8n(root);\n const specs = result.n8n.map((s) => mcpSpecToToolSpec(s, root));\n return {\n specs,\n errors: result.errors.map((e) => ({ file: e.dir, message: e.message })),\n };\n}\n","/**\n * MCP scan: find dirs with mcp.json, load via DirectoryScanner, return unified DiscoverToolsResult.\n * Exposes scan(path, options) only (no separate raw scanner).\n */\n\nimport * as path from \"node:path\";\nimport type { DiscoverToolsOptions, DiscoverToolsResult } from \"../discoveryFactory.js\";\nimport { DirectoryScanner } from \"../discoveryFactory.js\";\nimport { MCP_KIND } from \"./types.js\";\n\n/** Unified scan: (path, options) → DiscoverToolsResult. */\nexport async function scan(\n projectPath: string,\n options: DiscoverToolsOptions = {},\n): Promise<DiscoverToolsResult> {\n const root = path.resolve(projectPath);\n const namespace = options.namespace ?? \"dir\";\n const errors: Array<{ file: string; message: string }> = [];\n\n const scanner = new DirectoryScanner({\n roots: [root],\n namespace,\n extensions: options.extensions,\n onError: (dir, err) => {\n errors.push({ file: dir, message: err.message });\n options.onError?.(dir, err);\n },\n });\n\n let specs;\n try {\n specs = await scanner.scan();\n } catch (err) {\n errors.push({\n file: root,\n message: err instanceof Error ? err.message : String(err),\n });\n return { specs: [], errors };\n }\n\n const filtered = specs.filter((s) => s.kind === MCP_KIND);\n return { specs: filtered, errors };\n}\n","/** Kind for LangChain directory discovery. */\nexport const LANGCHAIN_KIND = \"langchain\" as const;\n\n/** Conventional directory name for LangChain tools. */\nexport const LANGCHAIN_DIR_NAME = \"langchain\" as const;\n","/**\n * LangChain scan: find langchain dirs / tool.json, load via DirectoryScanner, return unified DiscoverToolsResult.\n * Exposes scan(path, options) only (no separate raw scanner).\n */\n\nimport * as path from \"node:path\";\nimport type { DiscoverToolsOptions, DiscoverToolsResult } from \"../discoveryFactory.js\";\nimport { DirectoryScanner } from \"../discoveryFactory.js\";\nimport { LANGCHAIN_KIND } from \"./types.js\";\n\n/** Unified scan: (path, options) → DiscoverToolsResult. */\nexport async function scan(\n projectPath: string,\n options: DiscoverToolsOptions = {},\n): Promise<DiscoverToolsResult> {\n const root = path.resolve(projectPath);\n const namespace = options.namespace ?? \"dir\";\n const errors: Array<{ file: string; message: string }> = [];\n\n const scanner = new DirectoryScanner({\n roots: [root],\n namespace,\n extensions: options.extensions,\n onError: (dir, err) => {\n errors.push({ file: dir, message: err.message });\n options.onError?.(dir, err);\n },\n });\n\n let specs;\n try {\n specs = await scanner.scan();\n } catch (err) {\n errors.push({\n file: root,\n message: err instanceof Error ? err.message : String(err),\n });\n return { specs: [], errors };\n }\n\n const filtered = specs.filter((s) => s.kind === LANGCHAIN_KIND);\n return { specs: filtered, errors };\n}\n","import { pathToFileURL } from \"node:url\";\nimport type { ToolManifest, LoadedTool } from \"../discoveryFactory.js\";\nimport { DiscoveryError } from \"../discoveryFactory.js\";\nimport { resolveEntryPoint } from \"../util/resolveEntry.js\";\n\n/**\n * Load a LangChain tool from its directory.\n * Dynamically imports the entry point and validates it has an invoke() method.\n */\nexport async function loadLangChainTool(\n dirPath: string,\n manifest: ToolManifest,\n extensions?: string[],\n): Promise<LoadedTool> {\n let entryFile: string;\n try {\n entryFile = await resolveEntryPoint(\n dirPath,\n manifest.entryPoint ?? \"index\",\n extensions,\n );\n } catch (err) {\n throw new DiscoveryError(\n dirPath,\n \"load\",\n `Cannot find LangChain entry point`,\n err as Error,\n );\n }\n\n let mod: Record<string, unknown>;\n try {\n mod = (await import(pathToFileURL(entryFile).href)) as Record<string, unknown>;\n } catch (err) {\n throw new DiscoveryError(\n dirPath,\n \"load\",\n `Failed to import ${entryFile}`,\n err as Error,\n );\n }\n\n // Resolve the tool instance: default export > named \"tool\" > module itself\n const tool = (mod.default ?? mod.tool ?? mod) as Record<string, unknown>;\n\n if (!tool || typeof tool.invoke !== \"function\") {\n throw new DiscoveryError(\n dirPath,\n \"validate\",\n `Entry point must export an object with invoke() method (LangChainToolLike)`,\n );\n }\n\n return { manifest, dirPath, impl: tool };\n}\n","import { readdir } from \"node:fs/promises\";\nimport { pathToFileURL } from \"node:url\";\nimport type { ToolManifest, LoadedTool } from \"../discoveryFactory.js\";\nimport { DiscoveryError } from \"../discoveryFactory.js\";\nimport { resolveEntryPoint } from \"../util/resolveEntry.js\";\nimport { loadSkillDefinition } from \"./SkillMdParser.js\";\nimport type { SkillDefinition } from \"./SkillManifest.js\";\n\nconst DEFAULT_EXTENSIONS = [\".js\", \".mjs\"];\n\n/**\n * List top-level .js/.mjs files in the skill directory (exclude lib/, node_modules/, hidden, test files).\n * Used to auto-discover multiple programs when tool.json has no \"programs\" map.\n */\nasync function listSkillProgramFiles(\n dirPath: string,\n extensions: string[] = DEFAULT_EXTENSIONS,\n): Promise<string[]> {\n let entries: Array<{ name: string; isFile: boolean }>;\n try {\n const dirEntries = await readdir(dirPath, { withFileTypes: true });\n entries = dirEntries.map((entry) => ({\n name: entry.name,\n isFile: entry.isFile(),\n }));\n } catch {\n return [];\n }\n return entries\n .filter((e) => e.isFile)\n .map((e) => e.name)\n .filter((name) => {\n if (name.startsWith(\".\") || name.startsWith(\"_\")) return false;\n if (name.includes(\".test.\") || name.includes(\".spec.\")) return false;\n return extensions.some((ext) => name.endsWith(ext));\n })\n .sort((a, b) => {\n // Prefer handler.js or index.js as first (default program)\n if (a === \"handler.js\" || a === \"index.js\") return -1;\n if (b === \"handler.js\" || b === \"index.js\") return 1;\n return a.localeCompare(b);\n });\n}\n\n/**\n * Check if a value is a LangChain-like tool (object with invoke function).\n * Includes instances of StructuredTool and plain { name?, description?, schema?, invoke }.\n */\nfunction isLangChainLikeTool(val: unknown): val is { name?: string; description?: string; schema?: object; invoke: (args: unknown) => Promise<unknown> } {\n return (\n val != null &&\n typeof val === \"object\" &&\n \"invoke\" in val &&\n typeof (val as { invoke: unknown }).invoke === \"function\"\n );\n}\n\n/**\n * Check if a value is a class (constructor) that can be instantiated.\n * Used to detect \"class Foo extends StructuredTool\" exports.\n */\nfunction isConstructable(val: unknown): val is new (...args: unknown[]) => { invoke?: (args: unknown) => Promise<unknown> } {\n return typeof val === \"function\" && typeof (val as { prototype?: unknown }).prototype === \"object\";\n}\n\n/**\n * Load a single skill program (one entry point) and return a LoadedTool.\n * Supports:\n * - Class extending StructuredTool: loader instantiates with new ToolClass(), uses instance.\n * - LangChain-like object (or instance): { name?, description?, schema?, invoke(args) }.\n * - Function: (args, ctx) => Promise<{ result, evidence? }> — name/description from SKILL.md.\n */\nasync function loadOneSkillProgram(\n dirPath: string,\n manifest: ToolManifest,\n entryFile: string,\n skillDef: SkillDefinition,\n programKey: string | undefined,\n extensions: string[] | undefined,\n): Promise<LoadedTool> {\n let impl: unknown;\n try {\n const fullPath = await resolveEntryPoint(dirPath, entryFile, extensions ?? [\".js\", \".mjs\"]);\n const mod = (await import(pathToFileURL(fullPath).href)) as Record<string, unknown>;\n const fn = mod.default ?? mod.handler ?? mod.Tool;\n if (isLangChainLikeTool(fn)) {\n impl = fn;\n } else if (isConstructable(fn)) {\n const instance = new (fn as new () => { invoke: (args: unknown) => Promise<unknown> })();\n if (isLangChainLikeTool(instance)) impl = instance;\n } else if (typeof fn === \"function\") {\n impl = fn;\n }\n } catch {\n // Handler is optional — skills can be instruction-only\n }\n return {\n manifest,\n dirPath,\n impl,\n skillDefinition: skillDef,\n programKey,\n };\n}\n\n/**\n * Load a Skill tool from its directory following Anthropic's Agent Skills spec.\n *\n * Requires a SKILL.md file with YAML frontmatter (name, description).\n * The SKILL.md body provides instructions (Level 2), and bundled files\n * in the directory provide resources (Level 3).\n *\n * Optionally loads a handler function (handler.js/mjs) for programmatic execution.\n *\n * @see https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview\n */\nexport async function loadSkillTool(\n dirPath: string,\n manifest: ToolManifest,\n extensions?: string[],\n): Promise<LoadedTool> {\n const loaded = await loadSkillTools(dirPath, manifest, extensions);\n if (loaded.length === 0) {\n throw new DiscoveryError(dirPath, \"load\", \"No skill programs loaded\", new Error(\"empty\"));\n }\n return loaded[0]!;\n}\n\n/**\n * Load one or more skill programs from a directory.\n * When manifest.programs is set (e.g. { \"default\": \"handler.js\", \"report\": \"report.js\" }),\n * returns one LoadedTool per program; otherwise returns a single LoadedTool (entryPoint or \"handler\").\n */\nexport async function loadSkillTools(\n dirPath: string,\n manifest: ToolManifest,\n extensions?: string[],\n): Promise<LoadedTool[]> {\n let skillDef: SkillDefinition;\n try {\n skillDef = await loadSkillDefinition(dirPath);\n } catch (err) {\n throw new DiscoveryError(\n dirPath,\n \"load\",\n `Failed to parse SKILL.md: ${(err as Error).message}`,\n err as Error,\n );\n }\n\n const programs = manifest.programs;\n if (programs && typeof programs === \"object\" && Object.keys(programs).length > 0) {\n const result: LoadedTool[] = [];\n for (const [programKey, entryFile] of Object.entries(programs)) {\n const loaded = await loadOneSkillProgram(\n dirPath,\n manifest,\n entryFile,\n skillDef,\n programKey,\n extensions,\n );\n result.push(loaded);\n }\n return result;\n }\n\n // Auto-discover: list top-level .js/.mjs; if multiple, treat each as a program\n const exts = extensions ?? DEFAULT_EXTENSIONS;\n const files = await listSkillProgramFiles(dirPath, exts);\n if (files.length >= 2) {\n const result: LoadedTool[] = [];\n for (let i = 0; i < files.length; i++) {\n const file = files[i]!;\n const programKey = i === 0 ? \"default\" : file.replace(/\\.[^.]+$/, \"\");\n const loaded = await loadOneSkillProgram(\n dirPath,\n manifest,\n file,\n skillDef,\n programKey,\n extensions,\n );\n result.push(loaded);\n }\n return result;\n }\n\n // Single program: entryPoint or \"handler\" (or only one file found)\n const entryFile = manifest.entryPoint ?? files[0] ?? \"handler\";\n const loaded = await loadOneSkillProgram(\n dirPath,\n manifest,\n entryFile,\n skillDef,\n undefined,\n extensions,\n );\n return [loaded];\n}\n","import { readdir } from \"node:fs/promises\";\nimport { join, basename } from \"node:path\";\nimport type { ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport type { ToolManifest, LoadedTool } from \"../discoveryFactory.js\";\nimport { DiscoveryError } from \"../discoveryFactory.js\";\nimport { loadLangChainTool } from \"./LangChainLoader.js\";\n\n/**\n * List entry files (.js/.mjs) in dirPath for LangChain multi-tool dirs.\n * Implementation in langchain, not in factory.\n */\nexport async function listLangchainEntryFiles(\n dirPath: string,\n extensions: string[],\n): Promise<string[]> {\n let entries: Array<{ name: string; isFile: boolean }>;\n try {\n const dirEntries = await readdir(dirPath, { withFileTypes: true });\n entries = dirEntries.map((entry) => ({\n name: entry.name,\n isFile: entry.isFile(),\n }));\n } catch {\n return [];\n }\n return entries\n .filter((e) => e.isFile)\n .map((e) => e.name)\n .filter((name) => {\n if (name.startsWith(\".\") || name.startsWith(\"_\")) return false;\n if (name.endsWith(\".d.ts\")) return false;\n if (name.includes(\".test.\") || name.includes(\".spec.\")) return false;\n return extensions.some((ext) => name.endsWith(ext));\n });\n}\n\n/**\n * Load all LangChain tools from a directory (multiple entry files).\n * Implementation in langchain, not in factory.\n */\nexport async function loadLangChainToolsFromDir(\n dirPath: string,\n dirName: string,\n manifest: ToolManifest,\n strict: boolean,\n namespace: string,\n extensions: string[],\n langchainDirName: string,\n toSpec: (loaded: LoadedTool, nameHint: string, dirPath: string, namespace: string) => ToolSpec,\n onError?: (filePath: string, error: Error) => void,\n): Promise<ToolSpec[]> {\n const entryFiles = await listLangchainEntryFiles(dirPath, extensions);\n if (entryFiles.length === 0) {\n if (strict) {\n throw new DiscoveryError(dirPath, \"load\", \"No LangChain entry files found\");\n }\n return [];\n }\n const specs: ToolSpec[] = [];\n const useDirNameForSingle = dirName !== langchainDirName;\n for (const entryFile of entryFiles) {\n const fileManifest: ToolManifest = { ...manifest, entryPoint: entryFile };\n try {\n const loaded = await loadLangChainTool(dirPath, fileManifest, extensions);\n const fileBase = basename(entryFile).replace(/\\.[^.]+$/, \"\");\n const nameHint =\n entryFiles.length === 1 && useDirNameForSingle ? dirName : fileBase;\n specs.push(toSpec(loaded, nameHint, dirPath, namespace));\n } catch (error) {\n const err = error as Error;\n if (err instanceof DiscoveryError && err.phase === \"validate\") {\n if (strict) throw err;\n continue;\n }\n onError?.(join(dirPath, entryFile), err);\n if (strict) throw err;\n }\n }\n return specs;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { MCPServerConfig, ToolManifest, LoadedTool } from \"../discoveryFactory.js\";\nimport { DiscoveryError } from \"../discoveryFactory.js\";\n\n/**\n * Cursor-compatible mcpServers wrapper format.\n * Example: { \"mcpServers\": { \"server-name\": { \"command\": \"npx\", \"args\": [...] } } }\n */\ninterface CursorMCPConfig {\n mcpServers: Record<string, MCPServerConfig>;\n}\n\n/**\n * Check if the parsed JSON is in Cursor's mcpServers wrapper format.\n */\nfunction isCursorFormat(obj: unknown): obj is CursorMCPConfig {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"mcpServers\" in obj &&\n typeof (obj as CursorMCPConfig).mcpServers === \"object\" &&\n (obj as CursorMCPConfig).mcpServers !== null\n );\n}\n\n/**\n * Extract MCPServerConfig from either Cursor wrapper format or bare format.\n * - Cursor format: { \"mcpServers\": { \"name\": { command/url/args/env } } }\n * Uses the first server entry (or the one matching the tool name).\n * - Bare format: { \"command\": \"...\", \"args\": [...] } or { \"url\": \"...\" }\n */\nfunction extractMCPConfig(\n parsed: unknown,\n toolName: string | undefined,\n): MCPServerConfig {\n if (isCursorFormat(parsed)) {\n const servers = parsed.mcpServers;\n const keys = Object.keys(servers);\n if (keys.length === 0) {\n return {};\n }\n // Prefer server matching tool name, otherwise use first entry\n const name = toolName && keys.includes(toolName) ? toolName : keys[0]!;\n return servers[name]!;\n }\n return parsed as MCPServerConfig;\n}\n\n/**\n * Load an MCP tool from its directory.\n * Reads mcp.json and validates it has either command or url.\n * Supports both Cursor's mcpServers wrapper format and bare server config.\n */\nexport async function loadMCPTool(\n dirPath: string,\n manifest: ToolManifest,\n): Promise<LoadedTool> {\n const mcpPath = join(dirPath, manifest.entryPoint ?? \"mcp.json\");\n\n let raw: string;\n try {\n raw = await readFile(mcpPath, \"utf-8\");\n } catch (err) {\n throw new DiscoveryError(\n dirPath,\n \"load\",\n `Failed to read MCP config: ${mcpPath}`,\n err as Error,\n );\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (err) {\n throw new DiscoveryError(\n dirPath,\n \"load\",\n `Invalid JSON in ${mcpPath}`,\n err as Error,\n );\n }\n\n // Extract server config from Cursor wrapper or bare format\n const baseName = manifest.name?.split(\"/\").pop();\n const config = extractMCPConfig(parsed, baseName);\n\n if (!config.command && !config.url) {\n throw new DiscoveryError(\n dirPath,\n \"validate\",\n `mcp.json must have either \"command\" or \"url\" field`,\n );\n }\n\n return { manifest, dirPath, mcpConfig: config };\n}\n","import type { ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport type { LoadedTool, ToolManifest } from \"../discoveryFactory.js\";\n\n/** Apply MCP-loaded tool to spec (implementation in mcp, not in factory). */\nexport function applyLoadedToSpec(\n spec: ToolSpec,\n loaded: LoadedTool,\n _manifest: ToolManifest,\n _defaultDirName: string,\n _namespace: string,\n): void {\n if (loaded.mcpConfig?.url) spec.endpoint = loaded.mcpConfig.url;\n spec.impl = loaded.mcpConfig;\n}\n\nexport const directoryMarker = {\n kind: \"mcp\" as const,\n markerFile: \"mcp.json\",\n defaultEntryPoint: \"mcp.json\",\n};\n","import type { ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport type { LoadedTool, ToolManifest } from \"../discoveryFactory.js\";\n\n/** Apply LangChain-loaded tool to spec (implementation in langchain, not in factory). */\nexport function applyLoadedToSpec(\n spec: ToolSpec,\n loaded: LoadedTool,\n manifest: ToolManifest,\n _defaultDirName: string,\n namespace: string,\n): void {\n spec.impl = loaded.impl;\n if (!manifest.name && loaded.impl) {\n const toolName = (loaded.impl as { name?: string }).name;\n if (toolName) spec.name = `${namespace}/${toolName}`;\n }\n if (!manifest.description && loaded.impl) {\n const d = (loaded.impl as { description?: string }).description;\n if (d) spec.description = d;\n }\n if (!manifest.inputSchema && loaded.impl) {\n const schema = (loaded.impl as { schema?: object }).schema;\n if (schema) spec.inputSchema = schema;\n }\n}\n","import type { ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport type { LoadedTool, ToolManifest } from \"../discoveryFactory.js\";\n\n/** Apply skill-loaded tool to spec (implementation in skill, not in factory). */\nexport function applyLoadedToSpec(\n spec: ToolSpec,\n loaded: LoadedTool,\n manifest: ToolManifest,\n defaultDirName: string,\n namespace: string,\n): void {\n const skillDef = loaded.skillDefinition as\n | { frontmatter: { name: string; description: string } }\n | undefined;\n if (skillDef) {\n spec.name = manifest.name ?? skillDef.frontmatter.name;\n spec.description = skillDef.frontmatter.description;\n if (loaded.programKey === \"default\") {\n spec.name = `${namespace}/${defaultDirName}`;\n } else if (loaded.programKey) {\n spec.name = `${namespace}/${defaultDirName}/${loaded.programKey}`;\n }\n const impl = loaded.impl as\n | { description?: string; schema?: object; invoke?: unknown }\n | undefined;\n if (impl && typeof impl === \"object\" && typeof impl.invoke === \"function\") {\n if (impl.description != null && impl.description !== \"\")\n spec.description = impl.description;\n if (impl.schema != null && typeof impl.schema === \"object\")\n spec.inputSchema = impl.schema as object;\n }\n spec.impl = { ...skillDef, handler: loaded.impl };\n } else {\n spec.impl = loaded.impl;\n }\n}\n\nexport const directoryMarker = {\n kind: \"skill\" as const,\n markerFile: \"SKILL.md\",\n defaultEntryPoint: \"handler\",\n};\n","import type { ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport type { LoadedTool, ToolManifest } from \"../discoveryFactory.js\";\n\n/** Apply n8n-loaded tool to spec (implementation in n8n, not in factory). */\nexport function applyLoadedToSpec(\n spec: ToolSpec,\n loaded: LoadedTool,\n manifest: ToolManifest,\n _defaultDirName: string,\n _namespace: string,\n): void {\n const workflow = loaded.workflowDef as {\n id?: string;\n name?: string;\n description?: string;\n meta?: { description?: string };\n } | undefined;\n if (workflow?.id) spec.resourceId = String(workflow.id);\n if (!manifest.description && workflow) {\n const d =\n workflow.description ??\n workflow.meta?.description ??\n (typeof workflow.name === \"string\" ? workflow.name : undefined);\n if (d) spec.description = d;\n }\n spec.impl = loaded.workflowDef;\n}\n\nexport const directoryMarker = {\n kind: \"n8n\" as const,\n markerFile: \"workflow.json\",\n defaultEntryPoint: \"workflow.json\",\n};\n","/**\n * Discovery factory: types, discoverTools by kind, directory loaders/markers, and DirectoryScanner.\n * Single place for discovery types, scan-by-type, and filesystem directory scanning.\n */\n\nimport * as path from \"node:path\";\nimport { join, basename } from \"node:path\";\nimport { readdir, readFile, access } from \"node:fs/promises\";\nimport type { ToolSpec, Capability, CostHints } from \"../core/types/ToolSpec.js\";\nimport type { FunctionToolSpec, SideEffect } from \"./function/types.js\";\nimport type { SkillToolSpec } from \"./skill/types.js\";\nimport type { N8nToolSpec } from \"./n8n/types.js\";\nimport { resolveEntryPoint } from \"./util/resolveEntry.js\";\n\n// --- Discovery types (single source of truth) ---\n\nexport type { SideEffect, FunctionToolSpec } from \"./function/types.js\";\nexport type { SkillToolSpec } from \"./skill/types.js\";\nexport type { N8nToolSpec } from \"./n8n/types.js\";\nexport type MCPToolSpec = FunctionToolSpec | SkillToolSpec | N8nToolSpec;\n\nexport type DiscoverableKind = \"function\" | \"skill\" | \"n8n\" | \"mcp\" | \"langchain\";\n\nexport interface DiscoverToolsOptions {\n namespace?: string;\n include?: string[];\n tsconfigPath?: string;\n extensions?: string[];\n onError?: (fileOrDir: string, error: Error) => void;\n}\n\nexport interface DiscoverToolsResult {\n specs: ToolSpec[];\n errors: Array<{ file: string; message: string }>;\n warnings?: Array<{ file: string; message: string }>;\n}\n\nexport interface MCPServerConfig {\n command?: string;\n args?: string[];\n env?: Record<string, string>;\n cwd?: string;\n url?: string;\n}\n\nexport interface ToolManifest {\n kind: DiscoverableKind;\n name?: string;\n version?: string;\n description?: string;\n tags?: string[];\n capabilities?: Capability[];\n costHints?: CostHints;\n entryPoint?: string;\n programs?: Record<string, string>;\n inputSchema?: object;\n outputSchema?: object;\n enabled?: boolean;\n}\n\nexport interface DirectoryScannerOptions {\n roots: Array<string | { path: string; namespace?: string }>;\n namespace?: string;\n extensions?: string[];\n onError?: (toolDir: string, error: Error) => void;\n}\n\nexport interface LoadedTool {\n manifest: ToolManifest;\n dirPath: string;\n impl?: unknown;\n mcpConfig?: MCPServerConfig;\n workflowDef?: unknown;\n skillDefinition?: unknown;\n programKey?: string;\n}\n\nexport class DiscoveryError extends Error {\n readonly toolDir: string;\n readonly phase: \"manifest\" | \"load\" | \"validate\";\n readonly cause?: Error;\n\n constructor(\n toolDir: string,\n phase: \"manifest\" | \"load\" | \"validate\",\n message: string,\n cause?: Error,\n ) {\n super(`[${phase}] ${toolDir}: ${message}`);\n this.name = \"DiscoveryError\";\n this.toolDir = toolDir;\n this.phase = phase;\n this.cause = cause;\n }\n}\nimport { scan as scanFunction } from \"./function/scanner.js\";\nimport { scan as scanSkill } from \"./skill/scanSkill.js\";\nimport { scan as scanN8n } from \"./n8n/scanN8n.js\";\nimport { scan as scanMcp } from \"./mcp/scanner.js\";\nimport { scan as scanLangchain } from \"./langchain/scanner.js\";\nimport { loadLangChainTool } from \"./langchain/LangChainLoader.js\";\nimport { loadSkillTools } from \"./skill/SkillLoader.js\";\nimport { loadLangChainToolsFromDir, listLangchainEntryFiles } from \"./langchain/directoryLoad.js\";\nimport { loadMCPTool } from \"./mcp/MCPLoader.js\";\nimport { applyLoadedToSpec as applyMcp, directoryMarker as markerMcp } from \"./mcp/directoryApply.js\";\nimport { applyLoadedToSpec as applyLangchain } from \"./langchain/directoryApply.js\";\nimport { applyLoadedToSpec as applySkill, directoryMarker as markerSkill } from \"./skill/directoryApply.js\";\nimport { loadN8nTool } from \"./n8n/N8nLoader.js\";\nimport { applyLoadedToSpec as applyN8n, directoryMarker as markerN8n } from \"./n8n/directoryApply.js\";\nimport { LANGCHAIN_DIR_NAME } from \"./langchain/types.js\";\nimport { SKILL_DIR_NAME } from \"./skill/types.js\";\n\n// --- Directory discovery (loaders / markers / apply) ---\n\nconst DIRECTORY_KINDS = [\"mcp\", \"langchain\", \"skill\", \"n8n\"] as const;\n\nexport const DIRECTORY_DISCOVERABLE_KINDS = DIRECTORY_KINDS;\n\nexport const DIRECTORY_KIND_MARKERS = [\n markerSkill,\n markerN8n,\n markerMcp,\n] as const;\n\nexport type DirectoryLoader = (\n dirPath: string,\n manifest: ToolManifest,\n extensions: string[],\n) => Promise<LoadedTool | LoadedTool[]>;\n\nconst DIRECTORY_LOADERS: Record<(typeof DIRECTORY_KINDS)[number], DirectoryLoader> = {\n mcp: async (dirPath, manifest) => [await loadMCPTool(dirPath, manifest)],\n langchain: async (dirPath, manifest, ext) => [await loadLangChainTool(dirPath, manifest, ext)],\n skill: (dirPath, manifest, ext) => loadSkillTools(dirPath, manifest, ext),\n n8n: async (dirPath, manifest) => [await loadN8nTool(dirPath, manifest)],\n};\n\nexport function getDirectoryLoader(kind: (typeof DIRECTORY_KINDS)[number]): DirectoryLoader {\n const loader = DIRECTORY_LOADERS[kind];\n if (!loader) {\n throw new DiscoveryError(\"\", \"manifest\", `Unknown directory tool kind: \"${kind}\"`);\n }\n return loader;\n}\n\nexport function applyDirectoryLoadedToSpec(\n spec: ToolSpec,\n loaded: LoadedTool,\n manifest: ToolManifest,\n defaultDirName: string,\n namespace: string,\n): void {\n switch (manifest.kind) {\n case \"mcp\":\n return applyMcp(spec, loaded, manifest, defaultDirName, namespace);\n case \"langchain\":\n return applyLangchain(spec, loaded, manifest, defaultDirName, namespace);\n case \"skill\":\n return applySkill(spec, loaded, manifest, defaultDirName, namespace);\n case \"n8n\":\n return applyN8n(spec, loaded, manifest, defaultDirName, namespace);\n default:\n break;\n }\n}\n\n// --- discoverTools: dispatch by kind to each type's scanner ---\n\nexport async function discoverTools(\n type: DiscoverableKind,\n projectPath: string,\n options: DiscoverToolsOptions = {},\n): Promise<DiscoverToolsResult> {\n const root = path.resolve(projectPath);\n switch (type) {\n case \"function\":\n return scanFunction(root, options);\n case \"skill\":\n return scanSkill(root, options);\n case \"n8n\":\n return scanN8n(root, options);\n case \"mcp\":\n return scanMcp(root, options);\n case \"langchain\":\n return scanLangchain(root, options);\n default: {\n const _: never = type;\n return _;\n }\n }\n}\n\nexport { LANGCHAIN_DIR_NAME } from \"./langchain/types.js\";\nexport { SKILL_DIR_NAME } from \"./skill/types.js\";\n\n// --- DirectoryScanner ---\n\nconst DEFAULT_EXTENSIONS = [\".js\", \".mjs\"];\n\n/**\n * Scans filesystem directories for tool definitions.\n */\nexport class DirectoryScanner {\n private readonly roots: Array<{ path: string; namespace: string }>;\n private readonly extensions: string[];\n private readonly onError?: (toolDir: string, error: Error) => void;\n\n constructor(options: DirectoryScannerOptions) {\n const defaultNamespace = options.namespace ?? \"dir\";\n this.roots = options.roots.map((root) => {\n if (typeof root === \"string\") {\n return { path: root, namespace: defaultNamespace };\n }\n return {\n path: root.path,\n namespace: root.namespace ?? defaultNamespace,\n };\n });\n this.extensions = options.extensions ?? DEFAULT_EXTENSIONS;\n this.onError = options.onError;\n }\n\n async scan(): Promise<ToolSpec[]> {\n const specs: ToolSpec[] = [];\n for (const root of this.roots) {\n const rootSpecs = await this.scanRoot(root.path, root.namespace);\n specs.push(...rootSpecs);\n }\n return specs;\n }\n\n private async scanRoot(rootPath: string, namespace: string): Promise<ToolSpec[]> {\n return this.scanRecursive(rootPath, namespace);\n }\n\n private async scanRecursive(dirPath: string, namespace: string): Promise<ToolSpec[]> {\n const specs: ToolSpec[] = [];\n let dirEntries: Array<{ name: string; isDirectory: boolean }>;\n try {\n const entries = await readdir(dirPath, { withFileTypes: true });\n dirEntries = entries.map((entry) => ({\n name: entry.name,\n isDirectory: entry.isDirectory(),\n }));\n } catch (error) {\n this.onError?.(dirPath, error as Error);\n return specs;\n }\n\n const dirName = basename(dirPath);\n try {\n const loadedSpecs = await this.loadToolDir(dirPath, dirName, namespace);\n if (loadedSpecs.length > 0) specs.push(...loadedSpecs);\n } catch (error) {\n this.onError?.(dirPath, error as Error);\n }\n\n for (const entry of dirEntries) {\n if (!entry.isDirectory) continue;\n const childPath = join(dirPath, entry.name);\n try {\n const childSpecs = await this.scanRecursive(childPath, namespace);\n specs.push(...childSpecs);\n } catch (error) {\n this.onError?.(childPath, error as Error);\n }\n }\n return specs;\n }\n\n private async loadToolDir(\n dirPath: string,\n dirName: string,\n namespace: string,\n ): Promise<ToolSpec[]> {\n const manifestPath = join(dirPath, \"tool.json\");\n let manifestRaw: string;\n try {\n manifestRaw = await readFile(manifestPath, \"utf-8\");\n } catch {\n const inferred = await this.inferManifest(dirPath, dirName);\n if (!inferred) return [];\n if (inferred.kind === \"langchain\") {\n if (inferred.entryPoint) {\n const loaded = await loadLangChainTool(dirPath, inferred, this.extensions);\n return [this.toToolSpec(loaded, dirName, dirPath, namespace)];\n }\n return loadLangChainToolsFromDir(\n dirPath,\n dirName,\n inferred,\n false,\n namespace,\n this.extensions,\n LANGCHAIN_DIR_NAME,\n (loaded, nameHint, dp, ns) => this.toToolSpec(loaded, nameHint, dp, ns),\n this.onError,\n );\n }\n if (inferred.kind === \"skill\") {\n const loadedList = await loadSkillTools(dirPath, inferred, this.extensions);\n return loadedList.map((loaded: LoadedTool) =>\n this.toToolSpec(loaded, dirName, dirPath, namespace),\n );\n }\n const loaded = await this.loadByKind(dirPath, inferred);\n return [this.toToolSpec(loaded, dirName, dirPath, namespace)];\n }\n\n let manifest: ToolManifest;\n try {\n manifest = JSON.parse(manifestRaw) as ToolManifest;\n } catch (err) {\n throw new DiscoveryError(dirPath, \"manifest\", \"Invalid JSON in tool.json\", err as Error);\n }\n if (!manifest.kind) {\n throw new DiscoveryError(dirPath, \"manifest\", `tool.json must have a \"kind\" field`);\n }\n if (manifest.enabled === false) return [];\n\n if (manifest.kind === \"langchain\") {\n if (manifest.entryPoint) {\n const loaded = await loadLangChainTool(dirPath, manifest, this.extensions);\n return [this.toToolSpec(loaded, dirName, dirPath, namespace)];\n }\n return loadLangChainToolsFromDir(\n dirPath,\n dirName,\n manifest,\n true,\n namespace,\n this.extensions,\n LANGCHAIN_DIR_NAME,\n (loaded, nameHint, dp, ns) => this.toToolSpec(loaded, nameHint, dp, ns),\n this.onError,\n );\n }\n if (manifest.kind === \"skill\") {\n const loadedList = await loadSkillTools(dirPath, manifest, this.extensions);\n return loadedList.map((loaded: LoadedTool) =>\n this.toToolSpec(loaded, dirName, dirPath, namespace),\n );\n }\n const loaded = await this.loadByKind(dirPath, manifest);\n return [this.toToolSpec(loaded, dirName, dirPath, namespace)];\n }\n\n private async inferManifest(dirPath: string, dirName: string): Promise<ToolManifest | null> {\n const kinds: ToolManifest[\"kind\"][] = [];\n\n for (const m of DIRECTORY_KIND_MARKERS) {\n if (await this.fileExists(join(dirPath, m.markerFile))) kinds.push(m.kind);\n }\n\n const isLangchainDir = dirName === LANGCHAIN_DIR_NAME;\n const hasLangchain =\n isLangchainDir\n ? (await listLangchainEntryFiles(dirPath, this.extensions)).length > 0\n : dirName !== SKILL_DIR_NAME && (await this.hasEntryPoint(dirPath, \"index\"));\n if (hasLangchain) kinds.push(\"langchain\");\n\n if (kinds.length === 0) return null;\n if (kinds.length > 1) {\n throw new DiscoveryError(\n dirPath,\n \"manifest\",\n `Ambiguous tool kind (found ${kinds.join(\", \")}). Add tool.json to disambiguate.`,\n );\n }\n const kind = kinds[0]!;\n const manifest: ToolManifest = { kind };\n const marker = DIRECTORY_KIND_MARKERS.find((m) => m.kind === kind);\n if (marker) {\n manifest.entryPoint = marker.defaultEntryPoint;\n }\n if (kind === \"langchain\" && !isLangchainDir) manifest.entryPoint = \"index\";\n return manifest;\n }\n\n private async fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n }\n\n private async hasEntryPoint(dirPath: string, baseName: string): Promise<boolean> {\n try {\n await resolveEntryPoint(dirPath, baseName, this.extensions);\n return true;\n } catch {\n return false;\n }\n }\n\n private async loadByKind(dirPath: string, manifest: ToolManifest): Promise<LoadedTool> {\n const kind = manifest.kind as (typeof DIRECTORY_DISCOVERABLE_KINDS)[number];\n const loader = getDirectoryLoader(kind);\n const result = await loader(dirPath, manifest, this.extensions);\n const list = Array.isArray(result) ? result : [result];\n if (list.length === 0) {\n throw new DiscoveryError(dirPath, \"load\", \"No tools loaded\", new Error(\"empty\"));\n }\n return list[0]!;\n }\n\n private toToolSpec(\n loaded: LoadedTool,\n dirName: string,\n dirPath: string,\n namespace: string,\n ): ToolSpec {\n const { manifest } = loaded;\n const kindDirNames = new Set(DIRECTORY_DISCOVERABLE_KINDS);\n const parentName = basename(join(dirPath, \"..\"));\n const isKindDir = kindDirNames.has(dirName as (typeof DIRECTORY_DISCOVERABLE_KINDS)[number]);\n const defaultDirName = isKindDir ? parentName : dirName;\n const inferredName = isKindDir\n ? `${namespace}/${defaultDirName}-${dirName}`\n : `${namespace}/${defaultDirName}`;\n const name = manifest.name ?? inferredName;\n const spec = this.buildBaseSpec(manifest, name, dirName);\n applyDirectoryLoadedToSpec(spec, loaded, manifest, defaultDirName, namespace);\n return spec;\n }\n\n private buildBaseSpec(\n manifest: ToolManifest,\n name: string,\n dirName: string,\n ): ToolSpec {\n return {\n name,\n version: manifest.version ?? \"1.0.0\",\n kind: manifest.kind,\n description: manifest.description ?? `${manifest.kind} tool: ${dirName}`,\n tags: manifest.tags,\n inputSchema: manifest.inputSchema ?? { type: \"object\", additionalProperties: true },\n outputSchema: manifest.outputSchema ?? { type: \"object\", additionalProperties: true },\n capabilities: manifest.capabilities ?? [],\n costHints: manifest.costHints,\n };\n }\n}\n"]}
@@ -1,11 +1,6 @@
1
1
  'use strict';
2
2
 
3
3
  var chunkQEJF3KDV_cjs = require('./chunk-QEJF3KDV.cjs');
4
- var pRetry = require('p-retry');
5
-
6
- function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
7
-
8
- var pRetry__default = /*#__PURE__*/_interopDefault(pRetry);
9
4
 
10
5
  // src/core/registry/ToolRegistry.ts
11
6
  var ToolRegistry = class {
@@ -147,68 +142,7 @@ var ToolRegistry = class {
147
142
  }
148
143
  }
149
144
  };
150
- var NON_RETRYABLE_ERRORS = /* @__PURE__ */ new Set([
151
- "TOOL_NOT_FOUND",
152
- "INPUT_SCHEMA_INVALID",
153
- "POLICY_DENIED",
154
- "HITL_DENIED",
155
- "OUTPUT_SCHEMA_INVALID",
156
- "PATH_OUTSIDE_SANDBOX",
157
- "FILE_TOO_LARGE",
158
- "HTTP_DISALLOWED_HOST",
159
- "HTTP_TOO_LARGE",
160
- "EXEC_INVALID",
161
- "EXEC_SPAWN_ERROR",
162
- "DUCKDUCKGO_INVALID"
163
- ]);
164
- function isRetryable(error) {
165
- if (error instanceof Error) {
166
- const kind = error.kind;
167
- if (kind && NON_RETRYABLE_ERRORS.has(kind)) return false;
168
- }
169
- return true;
170
- }
171
- async function withRetry(fn, options = {}) {
172
- const {
173
- maxRetries = 2,
174
- baseDelayMs = 1e3,
175
- maxDelayMs = 1e4,
176
- jitter = 0.1,
177
- shouldRetry,
178
- onRetry
179
- } = options;
180
- if (maxRetries <= 0) {
181
- return fn();
182
- }
183
- const pRetryOptions = {
184
- retries: maxRetries,
185
- minTimeout: baseDelayMs,
186
- maxTimeout: maxDelayMs,
187
- randomize: true,
188
- factor: 2,
189
- onFailedAttempt: (error) => {
190
- if (jitter > 0 && error.retriesLeft > 0) ;
191
- if (shouldRetry && !shouldRetry(error)) {
192
- throw error;
193
- }
194
- if (!isRetryable(error)) {
195
- throw error;
196
- }
197
- onRetry?.(error, maxRetries - error.retriesLeft);
198
- }
199
- };
200
- return pRetry__default.default(fn, pRetryOptions);
201
- }
202
- function createTaggedError(kind, message, details) {
203
- const error = new Error(message);
204
- error.kind = kind;
205
- error.details = details;
206
- return error;
207
- }
208
145
 
209
146
  exports.ToolRegistry = ToolRegistry;
210
- exports.createTaggedError = createTaggedError;
211
- exports.isRetryable = isRetryable;
212
- exports.withRetry = withRetry;
213
- //# sourceMappingURL=chunk-WQMHMPNC.cjs.map
214
- //# sourceMappingURL=chunk-WQMHMPNC.cjs.map
147
+ //# sourceMappingURL=chunk-PYCCJF7C.cjs.map
148
+ //# sourceMappingURL=chunk-PYCCJF7C.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/registry/ToolRegistry.ts"],"names":["normalizeToolName"],"mappings":"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","file":"chunk-PYCCJF7C.cjs","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"]}
@@ -1,5 +1,6 @@
1
- import { createRuntimeFromConfigSync, loadToolConfig, isBarePackageDescriptor, expandToolDescriptorsToRegistryNames, createRuntimeFromConfig, resolveSandboxedPath, fileDescriptorToPackagePrefix, npmDescriptorToPackagePrefixWithVersion, LANGCHAIN_KIND } from './chunk-A5C2MUNA.js';
1
+ import { createRuntimeFromConfigSync, loadToolConfig, isBarePackageDescriptor, expandToolDescriptorsToRegistryNames, createRuntimeFromConfig, resolveSandboxedPath, fileDescriptorToPackagePrefix, npmDescriptorToPackagePrefixWithVersion } from './chunk-NVT4X4CB.js';
2
2
  import { enrichSpecWithCanonicalSchema } from './chunk-NTWOVFEY.js';
3
+ import { LANGCHAIN_KIND } from './chunk-YRFUGA3C.js';
3
4
  import { DynamicStructuredTool } from '@langchain/core/tools';
4
5
  import { stripNullishObjectFields } from '@easynet/agent-common';
5
6
 
@@ -201,5 +202,5 @@ async function createLangChainToolsAsync(options = {}) {
201
202
  }
202
203
 
203
204
  export { createAgentTools, createLangChainToolsAsync };
204
- //# sourceMappingURL=chunk-IWM5B5DU.js.map
205
- //# sourceMappingURL=chunk-IWM5B5DU.js.map
205
+ //# sourceMappingURL=chunk-QPKBEU64.js.map
206
+ //# sourceMappingURL=chunk-QPKBEU64.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/api/adapters/LangChainToolsHub.ts","../src/api/createAgentTools.ts"],"names":[],"mappings":"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","file":"chunk-QPKBEU64.js","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() which loads from tools.yaml and returns\n * StructuredTool[]. Use LangChainToolsHub when you need a custom runtime or ctxFactory.\n *\n * Use: new LangChainToolsHub(runtime, ctxFactory).getLangChainTools()\n */\n\nimport { DynamicStructuredTool, type StructuredToolInterface } from \"@langchain/core/tools\";\nimport { stripNullishObjectFields } from \"@easynet/agent-common\";\nimport type { PTCRuntime } from \"../../core/runtime/PTCRuntime.js\";\nimport type { ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport type { 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 * True when inputSchema wraps all params in a single \"args\" object (manifest convention).\n */\nfunction hasArgsWrapper(inputSchema: object): boolean {\n const s = inputSchema as Record<string, unknown>;\n if (s?.type !== \"object\" || !s.properties || typeof s.properties !== \"object\") return false;\n const args = (s.properties as Record<string, unknown>).args;\n return (\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}\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 s = inputSchema as Record<string, unknown>;\n if (s?.type !== \"object\" || !s.properties || typeof s.properties !== \"object\") {\n return s;\n }\n const props = s.properties as Record<string, unknown>;\n const args = props.args;\n if (hasArgsWrapper(inputSchema)) {\n return args as Record<string, unknown>;\n }\n return s;\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 flat = stripNullishObjectFields(args ?? {}) as Record<string, unknown>;\n const intent: ToolIntent = {\n tool: spec.name,\n args: hasArgsWrapper(enriched.inputSchema) ? { args: flat } : flat,\n purpose: LANGCHAIN_KIND,\n };\n const ctx = ctxFactory();\n const result = await runtime.invoke(intent, ctx);\n\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 });\n }\n}\n","/**\n * Create LangChain tools from config (sync or async). Uses PTCRuntime + registry\n * and exposes tools via LangChainToolsHub. All invokes go through PTC Intent.\n */\n\nimport { loadToolConfig, resolveSandboxedPath } from \"../tools/util/toolConfig.js\";\nimport {\n expandToolDescriptorsToRegistryNames,\n isBarePackageDescriptor,\n npmDescriptorToPackagePrefixWithVersion,\n fileDescriptorToPackagePrefix,\n} from \"../tools/util/toolDescriptor.js\";\nimport { createRuntimeFromConfigSync, createRuntimeFromConfig } from \"./runtimeFromConfig.js\";\nimport type { CreateRuntimeOptions } from \"./runtimeFromConfig.js\";\nimport { LangChainToolsHub } from \"./adapters/LangChainToolsHub.js\";\nimport type { StructuredToolInterface } from \"@langchain/core/tools\";\n\nexport interface CreateAgentToolsOptions extends CreateRuntimeOptions {\n /** Path to tool.yaml; when set, only tools listed there are returned; sandboxedPath from it is used as sandboxRoot */\n configFilePath?: string;\n /** Project path for async loading (use createLangChainToolsAsync) */\n projectPath?: string;\n}\n\n/** Merge host lists from multiple sources (e.g. tool.yaml + programmatic). Union, dedup, preserves order. */\nfunction mergeHostLists(a?: string[], b?: string[]): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const list of [a ?? [], b ?? []]) {\n for (const h of list) {\n if (!seen.has(h)) {\n seen.add(h);\n out.push(h);\n }\n }\n }\n return out;\n}\n\nfunction runtimeOptionsFromConfig(opts: CreateAgentToolsOptions): CreateRuntimeOptions {\n const coreTools = opts.coreTools ?? { sandboxRoot: process.cwd(), allowedHosts: [], enableSandboxValidation: false };\n if (opts.configFilePath) {\n const toolConfig = loadToolConfig(opts.configFilePath);\n const updates: {\n sandboxRoot?: string;\n enableSandboxValidation?: boolean;\n allowedHosts?: string[];\n blockedHosts?: string[];\n blockedCidrs?: string[];\n toolOverrides?: Record<string, Record<string, unknown>>;\n packageDefaults?: Record<string, Record<string, unknown>>;\n } = {};\n if (toolConfig.sandboxedPath && typeof toolConfig.sandboxedPath === \"string\") {\n updates.sandboxRoot = resolveSandboxedPath(opts.configFilePath, toolConfig.sandboxedPath);\n }\n if (typeof toolConfig.enableSandboxValidation === \"boolean\") {\n updates.enableSandboxValidation = toolConfig.enableSandboxValidation;\n } else if (coreTools.enableSandboxValidation == null) {\n updates.enableSandboxValidation = false;\n }\n // Smart merge: union of allowedHosts and blockedHosts from yaml + programmatic (both lists always applied)\n updates.allowedHosts = mergeHostLists(coreTools.allowedHosts, toolConfig.allowedHosts);\n updates.blockedHosts = mergeHostLists(coreTools.blockedHosts, toolConfig.blockedHosts);\n if (Array.isArray(toolConfig.blockedCidrs) && toolConfig.blockedCidrs.length > 0) {\n updates.blockedCidrs = toolConfig.blockedCidrs;\n } else if (coreTools.blockedCidrs?.length) {\n updates.blockedCidrs = coreTools.blockedCidrs;\n }\n let hasToolDefaults = false;\n const flatOverrides: Record<string, Record<string, unknown>> = { ...coreTools.toolOverrides };\n if (toolConfig.toolDefaults != null && Object.keys(toolConfig.toolDefaults).length > 0) {\n Object.assign(flatOverrides, toolConfig.toolDefaults);\n hasToolDefaults = true;\n }\n const packageDefaults: Record<string, Record<string, unknown>> = { ...coreTools.packageDefaults };\n if (toolConfig.packageToolDefaults != null && Object.keys(toolConfig.packageToolDefaults).length > 0) {\n for (const [descriptor, pkgConfig] of Object.entries(toolConfig.packageToolDefaults)) {\n const prefix = descriptor.startsWith(\"file:\")\n ? fileDescriptorToPackagePrefix(descriptor)\n : npmDescriptorToPackagePrefixWithVersion(descriptor);\n if (!prefix) continue;\n const pkgDefaults =\n pkgConfig?.defaults != null && typeof pkgConfig.defaults === \"object\" && !Array.isArray(pkgConfig.defaults)\n ? (pkgConfig.defaults as Record<string, unknown>)\n : {};\n if (Object.keys(pkgDefaults).length > 0) {\n packageDefaults[prefix] = pkgDefaults;\n }\n const toolConfigs = pkgConfig?.tools != null && typeof pkgConfig.tools === \"object\" && !Array.isArray(pkgConfig.tools) ? pkgConfig.tools : {};\n for (const [toolName, config] of Object.entries(toolConfigs)) {\n if (config != null && typeof config === \"object\") {\n hasToolDefaults = true;\n flatOverrides[`${prefix}::${toolName}`] = { ...pkgDefaults, ...(config as Record<string, unknown>) };\n }\n }\n }\n if (Object.keys(packageDefaults).length > 0) {\n updates.packageDefaults = packageDefaults;\n }\n }\n if (hasToolDefaults) {\n updates.toolOverrides = flatOverrides;\n }\n if (Object.keys(updates).length > 0) {\n return { ...opts, coreTools: { ...coreTools, ...updates } };\n }\n }\n return { ...opts, coreTools };\n}\n\n/**\n * Create LangChain tools synchronously. When configFilePath is set, returns only\n * tools listed in that file (and that exist in the registry). If tool.yaml has\n * sandboxedPath, fs tools can only access that directory.\n */\nexport function createAgentTools(\n options?: CreateAgentToolsOptions | string\n): StructuredToolInterface[] {\n const opts: CreateAgentToolsOptions =\n typeof options === \"string\" ? { configFilePath: options } : options ?? {};\n const runtimeOpts = runtimeOptionsFromConfig(opts);\n const { runtime } = createRuntimeFromConfigSync(runtimeOpts);\n const hub = new LangChainToolsHub(runtime);\n\n if (opts.configFilePath) {\n const toolConfig = loadToolConfig(opts.configFilePath);\n const names = Array.isArray(toolConfig.tools) ? toolConfig.tools : [];\n if (names.length > 0) {\n const registryNames = runtime.getRegistry().snapshot().map((s) => s.name);\n const allBarePackages = names.every((n) => isBarePackageDescriptor(String(n)));\n if (allBarePackages) {\n return hub.getLangChainTools();\n }\n const expanded = expandToolDescriptorsToRegistryNames(names, registryNames);\n return hub.getLangChainToolsForNames(expanded);\n }\n }\n\n return hub.getLangChainTools();\n}\n\n/**\n * Create LangChain tools asynchronously. Use when projectPath is set to load\n * tools from the project before building the tool list.\n */\nexport async function createLangChainToolsAsync(\n options: CreateAgentToolsOptions = {}\n): Promise<StructuredToolInterface[]> {\n const runtimeOpts = runtimeOptionsFromConfig(options);\n const { runtime } = await createRuntimeFromConfig(runtimeOpts);\n const hub = new LangChainToolsHub(runtime);\n\n if (options.configFilePath) {\n const toolConfig = loadToolConfig(options.configFilePath);\n const names = Array.isArray(toolConfig.tools) ? toolConfig.tools : [];\n if (names.length > 0) {\n const registryNames = runtime.getRegistry().snapshot().map((s) => s.name);\n const allBarePackages = names.every((n) => isBarePackageDescriptor(String(n)));\n if (allBarePackages) {\n return hub.getLangChainTools();\n }\n const expanded = expandToolDescriptorsToRegistryNames(names, registryNames);\n return hub.getLangChainToolsForNames(expanded);\n }\n }\n\n return hub.getLangChainTools();\n}\n"]}
@@ -0,0 +1,49 @@
1
+ import { createTaggedError } from './chunk-RZTTO5MQ.js';
2
+ import { resolve, normalize, dirname, basename } from 'path';
3
+ import { realpath, access } from 'fs/promises';
4
+
5
+ var sandboxValidationEnabled = false;
6
+ function setSandboxValidationEnabled(enabled) {
7
+ sandboxValidationEnabled = enabled;
8
+ }
9
+ async function resolveSandboxedPath(inputPath, sandboxRoot) {
10
+ let normalizedRoot;
11
+ try {
12
+ normalizedRoot = await realpath(resolve(sandboxRoot));
13
+ } catch {
14
+ normalizedRoot = normalize(resolve(sandboxRoot));
15
+ }
16
+ const resolved = resolve(normalizedRoot, inputPath);
17
+ let real;
18
+ try {
19
+ await access(resolved);
20
+ real = await realpath(resolved);
21
+ } catch {
22
+ const parentDir = dirname(resolved);
23
+ let realParent;
24
+ try {
25
+ await access(parentDir);
26
+ realParent = await realpath(parentDir);
27
+ } catch {
28
+ realParent = normalize(parentDir);
29
+ }
30
+ real = resolve(realParent, basename(resolved));
31
+ }
32
+ if (sandboxValidationEnabled && !isWithinRoot(real, normalizedRoot)) {
33
+ throw createTaggedError(
34
+ "PATH_OUTSIDE_SANDBOX",
35
+ `Path "${inputPath}" resolves to "${real}" which is outside sandbox "${normalizedRoot}"`,
36
+ { inputPath, resolvedPath: real, sandboxRoot: normalizedRoot }
37
+ );
38
+ }
39
+ return real;
40
+ }
41
+ function isWithinRoot(path, root) {
42
+ const normalizedPath = normalize(path);
43
+ const normalizedRoot = normalize(root);
44
+ return normalizedPath === normalizedRoot || normalizedPath.startsWith(normalizedRoot + "/");
45
+ }
46
+
47
+ export { resolveSandboxedPath, setSandboxValidationEnabled };
48
+ //# sourceMappingURL=chunk-QXQ4477T.js.map
49
+ //# sourceMappingURL=chunk-QXQ4477T.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/security/sandbox.ts"],"names":[],"mappings":";;;;AAIA,IAAI,wBAAA,GAA2B,KAAA;AAExB,SAAS,4BAA4B,OAAA,EAAwB;AAClE,EAAA,wBAAA,GAA2B,OAAA;AAC7B;AASA,eAAsB,oBAAA,CACpB,WACA,WAAA,EACiB;AAGjB,EAAA,IAAI,cAAA;AACJ,EAAA,IAAI;AACF,IAAA,cAAA,GAAiB,MAAM,QAAA,CAAS,OAAA,CAAQ,WAAW,CAAC,CAAA;AAAA,EACtD,CAAA,CAAA,MAAQ;AACN,IAAA,cAAA,GAAiB,SAAA,CAAU,OAAA,CAAQ,WAAW,CAAC,CAAA;AAAA,EACjD;AAGA,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,cAAA,EAAgB,SAAS,CAAA;AAElD,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI;AAEF,IAAA,MAAM,OAAO,QAAQ,CAAA;AACrB,IAAA,IAAA,GAAO,MAAM,SAAS,QAAQ,CAAA;AAAA,EAChC,CAAA,CAAA,MAAQ;AAEN,IAAA,MAAM,SAAA,GAAY,QAAQ,QAAQ,CAAA;AAClC,IAAA,IAAI,UAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAM,OAAO,SAAS,CAAA;AACtB,MAAA,UAAA,GAAa,MAAM,SAAS,SAAS,CAAA;AAAA,IACvC,CAAA,CAAA,MAAQ;AAGN,MAAA,UAAA,GAAa,UAAU,SAAS,CAAA;AAAA,IAClC;AACA,IAAA,IAAA,GAAO,OAAA,CAAQ,UAAA,EAAY,QAAA,CAAS,QAAQ,CAAC,CAAA;AAAA,EAC/C;AAEA,EAAA,IAAI,wBAAA,IAA4B,CAAC,YAAA,CAAa,IAAA,EAAM,cAAc,CAAA,EAAG;AACnE,IAAA,MAAM,iBAAA;AAAA,MACJ,sBAAA;AAAA,MACA,CAAA,MAAA,EAAS,SAAS,CAAA,eAAA,EAAkB,IAAI,+BAA+B,cAAc,CAAA,CAAA,CAAA;AAAA,MACrF,EAAE,SAAA,EAAW,YAAA,EAAc,IAAA,EAAM,aAAa,cAAA;AAAe,KAC/D;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,YAAA,CAAa,MAAc,IAAA,EAAuB;AACzD,EAAA,MAAM,cAAA,GAAiB,UAAU,IAAI,CAAA;AACrC,EAAA,MAAM,cAAA,GAAiB,UAAU,IAAI,CAAA;AACrC,EAAA,OAAO,cAAA,KAAmB,cAAA,IAAkB,cAAA,CAAe,UAAA,CAAW,iBAAiB,GAAG,CAAA;AAC5F","file":"chunk-QXQ4477T.js","sourcesContent":["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"]}
@@ -0,0 +1,65 @@
1
+ import pRetry from 'p-retry';
2
+
3
+ // src/core/runtime/Retry.ts
4
+ var NON_RETRYABLE_ERRORS = /* @__PURE__ */ new Set([
5
+ "TOOL_NOT_FOUND",
6
+ "INPUT_SCHEMA_INVALID",
7
+ "POLICY_DENIED",
8
+ "HITL_DENIED",
9
+ "OUTPUT_SCHEMA_INVALID",
10
+ "PATH_OUTSIDE_SANDBOX",
11
+ "FILE_TOO_LARGE",
12
+ "HTTP_DISALLOWED_HOST",
13
+ "HTTP_TOO_LARGE",
14
+ "EXEC_INVALID",
15
+ "EXEC_SPAWN_ERROR",
16
+ "DUCKDUCKGO_INVALID"
17
+ ]);
18
+ function isRetryable(error) {
19
+ if (error instanceof Error) {
20
+ const kind = error.kind;
21
+ if (kind && NON_RETRYABLE_ERRORS.has(kind)) return false;
22
+ }
23
+ return true;
24
+ }
25
+ async function withRetry(fn, options = {}) {
26
+ const {
27
+ maxRetries = 2,
28
+ baseDelayMs = 1e3,
29
+ maxDelayMs = 1e4,
30
+ jitter = 0.1,
31
+ shouldRetry,
32
+ onRetry
33
+ } = options;
34
+ if (maxRetries <= 0) {
35
+ return fn();
36
+ }
37
+ const pRetryOptions = {
38
+ retries: maxRetries,
39
+ minTimeout: baseDelayMs,
40
+ maxTimeout: maxDelayMs,
41
+ randomize: true,
42
+ factor: 2,
43
+ onFailedAttempt: (error) => {
44
+ if (jitter > 0 && error.retriesLeft > 0) ;
45
+ if (shouldRetry && !shouldRetry(error)) {
46
+ throw error;
47
+ }
48
+ if (!isRetryable(error)) {
49
+ throw error;
50
+ }
51
+ onRetry?.(error, maxRetries - error.retriesLeft);
52
+ }
53
+ };
54
+ return pRetry(fn, pRetryOptions);
55
+ }
56
+ function createTaggedError(kind, message, details) {
57
+ const error = new Error(message);
58
+ error.kind = kind;
59
+ error.details = details;
60
+ return error;
61
+ }
62
+
63
+ export { createTaggedError, isRetryable, withRetry };
64
+ //# sourceMappingURL=chunk-RZTTO5MQ.js.map
65
+ //# sourceMappingURL=chunk-RZTTO5MQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/runtime/Retry.ts"],"names":[],"mappings":";;;AAuBA,IAAM,oBAAA,uBAA2B,GAAA,CAAI;AAAA,EACnC,gBAAA;AAAA,EACA,sBAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA,uBAAA;AAAA,EACA,sBAAA;AAAA,EACA,gBAAA;AAAA,EACA,sBAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAA;AAAA,EACA,kBAAA;AAAA,EACA;AACF,CAAC,CAAA;AAKM,SAAS,YAAY,KAAA,EAAyB;AACnD,EAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,IAAA,MAAM,OAAQ,KAAA,CAAoC,IAAA;AAClD,IAAA,IAAI,IAAA,IAAQ,oBAAA,CAAqB,GAAA,CAAI,IAAI,GAAG,OAAO,KAAA;AAAA,EACrD;AACA,EAAA,OAAO,IAAA;AACT;AAKA,eAAsB,SAAA,CACpB,EAAA,EACA,OAAA,GAAwB,EAAC,EACb;AACZ,EAAA,MAAM;AAAA,IACJ,UAAA,GAAa,CAAA;AAAA,IACb,WAAA,GAAc,GAAA;AAAA,IACd,UAAA,GAAa,GAAA;AAAA,IACb,MAAA,GAAS,GAAA;AAAA,IACT,WAAA;AAAA,IACA;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,IAAI,cAAc,CAAA,EAAG;AACnB,IAAA,OAAO,EAAA,EAAG;AAAA,EACZ;AAEA,EAAA,MAAM,aAAA,GAA+B;AAAA,IACnC,OAAA,EAAS,UAAA;AAAA,IACT,UAAA,EAAY,WAAA;AAAA,IACZ,UAAA,EAAY,UAAA;AAAA,IACZ,SAAA,EAAW,IAAA;AAAA,IACX,MAAA,EAAQ,CAAA;AAAA,IACR,eAAA,EAAiB,CAAC,KAAA,KAAU;AAE1B,MAAA,IAAI,MAAA,GAAS,CAAA,IAAK,KAAA,CAAM,WAAA,GAAc,CAAA,EAAG;AAMzC,MAAA,IAAI,WAAA,IAAe,CAAC,WAAA,CAAY,KAAK,CAAA,EAAG;AACtC,QAAA,MAAM,KAAA;AAAA,MACR;AAEA,MAAA,IAAI,CAAC,WAAA,CAAY,KAAK,CAAA,EAAG;AACvB,QAAA,MAAM,KAAA;AAAA,MACR;AAEA,MAAA,OAAA,GAAU,KAAA,EAAO,UAAA,GAAa,KAAA,CAAM,WAAW,CAAA;AAAA,IACjD;AAAA,GACF;AAEA,EAAA,OAAO,MAAA,CAAO,IAAI,aAAa,CAAA;AACjC;AAKO,SAAS,iBAAA,CACd,IAAA,EACA,OAAA,EACA,OAAA,EAC6C;AAC7C,EAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,OAAO,CAAA;AAI/B,EAAA,KAAA,CAAM,IAAA,GAAO,IAAA;AACb,EAAA,KAAA,CAAM,OAAA,GAAU,OAAA;AAChB,EAAA,OAAO,KAAA;AACT","file":"chunk-RZTTO5MQ.js","sourcesContent":["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"]}
@@ -1,5 +1,4 @@
1
1
  import { normalizeToolName } from './chunk-ODEHUAR4.js';
2
- import pRetry from 'p-retry';
3
2
 
4
3
  // src/core/registry/ToolRegistry.ts
5
4
  var ToolRegistry = class {
@@ -141,65 +140,7 @@ var ToolRegistry = class {
141
140
  }
142
141
  }
143
142
  };
144
- var NON_RETRYABLE_ERRORS = /* @__PURE__ */ new Set([
145
- "TOOL_NOT_FOUND",
146
- "INPUT_SCHEMA_INVALID",
147
- "POLICY_DENIED",
148
- "HITL_DENIED",
149
- "OUTPUT_SCHEMA_INVALID",
150
- "PATH_OUTSIDE_SANDBOX",
151
- "FILE_TOO_LARGE",
152
- "HTTP_DISALLOWED_HOST",
153
- "HTTP_TOO_LARGE",
154
- "EXEC_INVALID",
155
- "EXEC_SPAWN_ERROR",
156
- "DUCKDUCKGO_INVALID"
157
- ]);
158
- function isRetryable(error) {
159
- if (error instanceof Error) {
160
- const kind = error.kind;
161
- if (kind && NON_RETRYABLE_ERRORS.has(kind)) return false;
162
- }
163
- return true;
164
- }
165
- async function withRetry(fn, options = {}) {
166
- const {
167
- maxRetries = 2,
168
- baseDelayMs = 1e3,
169
- maxDelayMs = 1e4,
170
- jitter = 0.1,
171
- shouldRetry,
172
- onRetry
173
- } = options;
174
- if (maxRetries <= 0) {
175
- return fn();
176
- }
177
- const pRetryOptions = {
178
- retries: maxRetries,
179
- minTimeout: baseDelayMs,
180
- maxTimeout: maxDelayMs,
181
- randomize: true,
182
- factor: 2,
183
- onFailedAttempt: (error) => {
184
- if (jitter > 0 && error.retriesLeft > 0) ;
185
- if (shouldRetry && !shouldRetry(error)) {
186
- throw error;
187
- }
188
- if (!isRetryable(error)) {
189
- throw error;
190
- }
191
- onRetry?.(error, maxRetries - error.retriesLeft);
192
- }
193
- };
194
- return pRetry(fn, pRetryOptions);
195
- }
196
- function createTaggedError(kind, message, details) {
197
- const error = new Error(message);
198
- error.kind = kind;
199
- error.details = details;
200
- return error;
201
- }
202
143
 
203
- export { ToolRegistry, createTaggedError, isRetryable, withRetry };
204
- //# sourceMappingURL=chunk-FCYBA7PR.js.map
205
- //# sourceMappingURL=chunk-FCYBA7PR.js.map
144
+ export { ToolRegistry };
145
+ //# sourceMappingURL=chunk-WUMLZERG.js.map
146
+ //# sourceMappingURL=chunk-WUMLZERG.js.map