@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":["path","join","scan","readFile","basename","defaultInputSchema","path2","path3","path4","DEFAULT_EXTENSIONS","readdir","pathToFileURL","entryFile","loaded","applyLoadedToSpec","directoryMarker","path5"],"mappings":"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","file":"chunk-YRFUGA3C.js","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"]}
@@ -0,0 +1,52 @@
1
+ 'use strict';
2
+
3
+ var chunkXPGHS4W7_cjs = require('./chunk-XPGHS4W7.cjs');
4
+ var path = require('path');
5
+ var promises = require('fs/promises');
6
+
7
+ var sandboxValidationEnabled = false;
8
+ function setSandboxValidationEnabled(enabled) {
9
+ sandboxValidationEnabled = enabled;
10
+ }
11
+ async function resolveSandboxedPath(inputPath, sandboxRoot) {
12
+ let normalizedRoot;
13
+ try {
14
+ normalizedRoot = await promises.realpath(path.resolve(sandboxRoot));
15
+ } catch {
16
+ normalizedRoot = path.normalize(path.resolve(sandboxRoot));
17
+ }
18
+ const resolved = path.resolve(normalizedRoot, inputPath);
19
+ let real;
20
+ try {
21
+ await promises.access(resolved);
22
+ real = await promises.realpath(resolved);
23
+ } catch {
24
+ const parentDir = path.dirname(resolved);
25
+ let realParent;
26
+ try {
27
+ await promises.access(parentDir);
28
+ realParent = await promises.realpath(parentDir);
29
+ } catch {
30
+ realParent = path.normalize(parentDir);
31
+ }
32
+ real = path.resolve(realParent, path.basename(resolved));
33
+ }
34
+ if (sandboxValidationEnabled && !isWithinRoot(real, normalizedRoot)) {
35
+ throw chunkXPGHS4W7_cjs.createTaggedError(
36
+ "PATH_OUTSIDE_SANDBOX",
37
+ `Path "${inputPath}" resolves to "${real}" which is outside sandbox "${normalizedRoot}"`,
38
+ { inputPath, resolvedPath: real, sandboxRoot: normalizedRoot }
39
+ );
40
+ }
41
+ return real;
42
+ }
43
+ function isWithinRoot(path$1, root) {
44
+ const normalizedPath = path.normalize(path$1);
45
+ const normalizedRoot = path.normalize(root);
46
+ return normalizedPath === normalizedRoot || normalizedPath.startsWith(normalizedRoot + "/");
47
+ }
48
+
49
+ exports.resolveSandboxedPath = resolveSandboxedPath;
50
+ exports.setSandboxValidationEnabled = setSandboxValidationEnabled;
51
+ //# sourceMappingURL=chunk-ZDSZHEQU.cjs.map
52
+ //# sourceMappingURL=chunk-ZDSZHEQU.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/security/sandbox.ts"],"names":["realpath","resolve","normalize","access","dirname","basename","createTaggedError","path"],"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,MAAMA,iBAAA,CAASC,YAAA,CAAQ,WAAW,CAAC,CAAA;AAAA,EACtD,CAAA,CAAA,MAAQ;AACN,IAAA,cAAA,GAAiBC,cAAA,CAAUD,YAAA,CAAQ,WAAW,CAAC,CAAA;AAAA,EACjD;AAGA,EAAA,MAAM,QAAA,GAAWA,YAAA,CAAQ,cAAA,EAAgB,SAAS,CAAA;AAElD,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI;AAEF,IAAA,MAAME,gBAAO,QAAQ,CAAA;AACrB,IAAA,IAAA,GAAO,MAAMH,kBAAS,QAAQ,CAAA;AAAA,EAChC,CAAA,CAAA,MAAQ;AAEN,IAAA,MAAM,SAAA,GAAYI,aAAQ,QAAQ,CAAA;AAClC,IAAA,IAAI,UAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAMD,gBAAO,SAAS,CAAA;AACtB,MAAA,UAAA,GAAa,MAAMH,kBAAS,SAAS,CAAA;AAAA,IACvC,CAAA,CAAA,MAAQ;AAGN,MAAA,UAAA,GAAaE,eAAU,SAAS,CAAA;AAAA,IAClC;AACA,IAAA,IAAA,GAAOD,YAAA,CAAQ,UAAA,EAAYI,aAAA,CAAS,QAAQ,CAAC,CAAA;AAAA,EAC/C;AAEA,EAAA,IAAI,wBAAA,IAA4B,CAAC,YAAA,CAAa,IAAA,EAAM,cAAc,CAAA,EAAG;AACnE,IAAA,MAAMC,mCAAA;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,CAAaC,QAAc,IAAA,EAAuB;AACzD,EAAA,MAAM,cAAA,GAAiBL,eAAUK,MAAI,CAAA;AACrC,EAAA,MAAM,cAAA,GAAiBL,eAAU,IAAI,CAAA;AACrC,EAAA,OAAO,cAAA,KAAmB,cAAA,IAAkB,cAAA,CAAe,UAAA,CAAW,iBAAiB,GAAG,CAAA;AAC5F","file":"chunk-ZDSZHEQU.cjs","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"]}
@@ -1,7 +1,8 @@
1
1
  'use strict';
2
2
 
3
- var chunkJXYANBTH_cjs = require('./chunk-JXYANBTH.cjs');
3
+ var chunkHK4GTFTQ_cjs = require('./chunk-HK4GTFTQ.cjs');
4
4
  var chunkUUNG3GL3_cjs = require('./chunk-UUNG3GL3.cjs');
5
+ var chunkOG5ZSXQ5_cjs = require('./chunk-OG5ZSXQ5.cjs');
5
6
  var tools = require('@langchain/core/tools');
6
7
  var agentCommon = require('@easynet/agent-common');
7
8
 
@@ -74,7 +75,7 @@ var LangChainToolsHub = class {
74
75
  const intent = {
75
76
  tool: spec.name,
76
77
  args: hasArgsWrapper(enriched.inputSchema) ? { args: flat } : flat,
77
- purpose: chunkJXYANBTH_cjs.LANGCHAIN_KIND
78
+ purpose: chunkOG5ZSXQ5_cjs.LANGCHAIN_KIND
78
79
  };
79
80
  const ctx = ctxFactory();
80
81
  const result = await runtime.invoke(intent, ctx);
@@ -109,10 +110,10 @@ function mergeHostLists(a, b) {
109
110
  function runtimeOptionsFromConfig(opts) {
110
111
  const coreTools = opts.coreTools ?? { sandboxRoot: process.cwd(), allowedHosts: [], enableSandboxValidation: false };
111
112
  if (opts.configFilePath) {
112
- const toolConfig = chunkJXYANBTH_cjs.loadToolConfig(opts.configFilePath);
113
+ const toolConfig = chunkHK4GTFTQ_cjs.loadToolConfig(opts.configFilePath);
113
114
  const updates = {};
114
115
  if (toolConfig.sandboxedPath && typeof toolConfig.sandboxedPath === "string") {
115
- updates.sandboxRoot = chunkJXYANBTH_cjs.resolveSandboxedPath(opts.configFilePath, toolConfig.sandboxedPath);
116
+ updates.sandboxRoot = chunkHK4GTFTQ_cjs.resolveSandboxedPath(opts.configFilePath, toolConfig.sandboxedPath);
116
117
  }
117
118
  if (typeof toolConfig.enableSandboxValidation === "boolean") {
118
119
  updates.enableSandboxValidation = toolConfig.enableSandboxValidation;
@@ -135,7 +136,7 @@ function runtimeOptionsFromConfig(opts) {
135
136
  const packageDefaults = { ...coreTools.packageDefaults };
136
137
  if (toolConfig.packageToolDefaults != null && Object.keys(toolConfig.packageToolDefaults).length > 0) {
137
138
  for (const [descriptor, pkgConfig] of Object.entries(toolConfig.packageToolDefaults)) {
138
- const prefix = descriptor.startsWith("file:") ? chunkJXYANBTH_cjs.fileDescriptorToPackagePrefix(descriptor) : chunkJXYANBTH_cjs.npmDescriptorToPackagePrefixWithVersion(descriptor);
139
+ const prefix = descriptor.startsWith("file:") ? chunkHK4GTFTQ_cjs.fileDescriptorToPackagePrefix(descriptor) : chunkHK4GTFTQ_cjs.npmDescriptorToPackagePrefixWithVersion(descriptor);
139
140
  if (!prefix) continue;
140
141
  const pkgDefaults = pkgConfig?.defaults != null && typeof pkgConfig.defaults === "object" && !Array.isArray(pkgConfig.defaults) ? pkgConfig.defaults : {};
141
142
  if (Object.keys(pkgDefaults).length > 0) {
@@ -165,18 +166,18 @@ function runtimeOptionsFromConfig(opts) {
165
166
  function createAgentTools(options) {
166
167
  const opts = typeof options === "string" ? { configFilePath: options } : options ?? {};
167
168
  const runtimeOpts = runtimeOptionsFromConfig(opts);
168
- const { runtime } = chunkJXYANBTH_cjs.createRuntimeFromConfigSync(runtimeOpts);
169
+ const { runtime } = chunkHK4GTFTQ_cjs.createRuntimeFromConfigSync(runtimeOpts);
169
170
  const hub = new LangChainToolsHub(runtime);
170
171
  if (opts.configFilePath) {
171
- const toolConfig = chunkJXYANBTH_cjs.loadToolConfig(opts.configFilePath);
172
+ const toolConfig = chunkHK4GTFTQ_cjs.loadToolConfig(opts.configFilePath);
172
173
  const names = Array.isArray(toolConfig.tools) ? toolConfig.tools : [];
173
174
  if (names.length > 0) {
174
175
  const registryNames = runtime.getRegistry().snapshot().map((s) => s.name);
175
- const allBarePackages = names.every((n) => chunkJXYANBTH_cjs.isBarePackageDescriptor(String(n)));
176
+ const allBarePackages = names.every((n) => chunkHK4GTFTQ_cjs.isBarePackageDescriptor(String(n)));
176
177
  if (allBarePackages) {
177
178
  return hub.getLangChainTools();
178
179
  }
179
- const expanded = chunkJXYANBTH_cjs.expandToolDescriptorsToRegistryNames(names, registryNames);
180
+ const expanded = chunkHK4GTFTQ_cjs.expandToolDescriptorsToRegistryNames(names, registryNames);
180
181
  return hub.getLangChainToolsForNames(expanded);
181
182
  }
182
183
  }
@@ -184,18 +185,18 @@ function createAgentTools(options) {
184
185
  }
185
186
  async function createLangChainToolsAsync(options = {}) {
186
187
  const runtimeOpts = runtimeOptionsFromConfig(options);
187
- const { runtime } = await chunkJXYANBTH_cjs.createRuntimeFromConfig(runtimeOpts);
188
+ const { runtime } = await chunkHK4GTFTQ_cjs.createRuntimeFromConfig(runtimeOpts);
188
189
  const hub = new LangChainToolsHub(runtime);
189
190
  if (options.configFilePath) {
190
- const toolConfig = chunkJXYANBTH_cjs.loadToolConfig(options.configFilePath);
191
+ const toolConfig = chunkHK4GTFTQ_cjs.loadToolConfig(options.configFilePath);
191
192
  const names = Array.isArray(toolConfig.tools) ? toolConfig.tools : [];
192
193
  if (names.length > 0) {
193
194
  const registryNames = runtime.getRegistry().snapshot().map((s) => s.name);
194
- const allBarePackages = names.every((n) => chunkJXYANBTH_cjs.isBarePackageDescriptor(String(n)));
195
+ const allBarePackages = names.every((n) => chunkHK4GTFTQ_cjs.isBarePackageDescriptor(String(n)));
195
196
  if (allBarePackages) {
196
197
  return hub.getLangChainTools();
197
198
  }
198
- const expanded = chunkJXYANBTH_cjs.expandToolDescriptorsToRegistryNames(names, registryNames);
199
+ const expanded = chunkHK4GTFTQ_cjs.expandToolDescriptorsToRegistryNames(names, registryNames);
199
200
  return hub.getLangChainToolsForNames(expanded);
200
201
  }
201
202
  }
@@ -204,5 +205,5 @@ async function createLangChainToolsAsync(options = {}) {
204
205
 
205
206
  exports.createAgentTools = createAgentTools;
206
207
  exports.createLangChainToolsAsync = createLangChainToolsAsync;
207
- //# sourceMappingURL=chunk-MUBZV65R.cjs.map
208
- //# sourceMappingURL=chunk-MUBZV65R.cjs.map
208
+ //# sourceMappingURL=chunk-ZH5MH3AK.cjs.map
209
+ //# sourceMappingURL=chunk-ZH5MH3AK.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/api/adapters/LangChainToolsHub.ts","../src/api/createAgentTools.ts"],"names":["enrichSpecWithCanonicalSchema","DynamicStructuredTool","stripNullishObjectFields","LANGCHAIN_KIND","loadToolConfig","resolveSandboxedPath","fileDescriptorToPackagePrefix","npmDescriptorToPackagePrefixWithVersion","createRuntimeFromConfigSync","isBarePackageDescriptor","expandToolDescriptorsToRegistryNames","createRuntimeFromConfig"],"mappings":"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","file":"chunk-ZH5MH3AK.cjs","sourcesContent":["/**\n * Exposes all tools from a ToolRegistry + PTCRuntime as LangChain tools\n * for local agent use (e.g. with createReactAgent, AgentExecutor).\n *\n * For most users, use createAgentTools() 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"]}
@@ -1,25 +1,26 @@
1
1
  'use strict';
2
2
 
3
- var chunkWQMHMPNC_cjs = require('../chunk-WQMHMPNC.cjs');
3
+ var chunkPYCCJF7C_cjs = require('../chunk-PYCCJF7C.cjs');
4
+ var chunkXPGHS4W7_cjs = require('../chunk-XPGHS4W7.cjs');
4
5
  require('../chunk-QEJF3KDV.cjs');
5
6
 
6
7
 
7
8
 
8
9
  Object.defineProperty(exports, "ToolRegistry", {
9
10
  enumerable: true,
10
- get: function () { return chunkWQMHMPNC_cjs.ToolRegistry; }
11
+ get: function () { return chunkPYCCJF7C_cjs.ToolRegistry; }
11
12
  });
12
13
  Object.defineProperty(exports, "createTaggedError", {
13
14
  enumerable: true,
14
- get: function () { return chunkWQMHMPNC_cjs.createTaggedError; }
15
+ get: function () { return chunkXPGHS4W7_cjs.createTaggedError; }
15
16
  });
16
17
  Object.defineProperty(exports, "isRetryable", {
17
18
  enumerable: true,
18
- get: function () { return chunkWQMHMPNC_cjs.isRetryable; }
19
+ get: function () { return chunkXPGHS4W7_cjs.isRetryable; }
19
20
  });
20
21
  Object.defineProperty(exports, "withRetry", {
21
22
  enumerable: true,
22
- get: function () { return chunkWQMHMPNC_cjs.withRetry; }
23
+ get: function () { return chunkXPGHS4W7_cjs.withRetry; }
23
24
  });
24
25
  //# sourceMappingURL=runtime.cjs.map
25
26
  //# sourceMappingURL=runtime.cjs.map
@@ -1,4 +1,5 @@
1
- export { ToolRegistry, createTaggedError, isRetryable, withRetry } from '../chunk-FCYBA7PR.js';
1
+ export { ToolRegistry } from '../chunk-WUMLZERG.js';
2
+ export { createTaggedError, isRetryable, withRetry } from '../chunk-RZTTO5MQ.js';
2
3
  import '../chunk-ODEHUAR4.js';
3
4
  //# sourceMappingURL=runtime.js.map
4
5
  //# sourceMappingURL=runtime.js.map