@easynet/agent-tool 1.0.83 → 1.0.85

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.
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var chunkF4HS7H7K_cjs = require('./chunk-F4HS7H7K.cjs');
4
- var chunkXPQZLO4A_cjs = require('./chunk-XPQZLO4A.cjs');
4
+ var chunk5HSGVA6S_cjs = require('./chunk-5HSGVA6S.cjs');
5
5
  var chunkUUNG3GL3_cjs = require('./chunk-UUNG3GL3.cjs');
6
6
  var chunkV2RD4BHT_cjs = require('./chunk-V2RD4BHT.cjs');
7
7
  var agentCommon = require('@easynet/agent-common');
@@ -119,7 +119,7 @@ function mergeHostLists(a, b) {
119
119
  return out;
120
120
  }
121
121
  function resolveEmbeddedToolConfigPath() {
122
- const moduleDir = path.dirname(url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('chunk-6NBQAFVB.cjs', document.baseURI).href))));
122
+ const moduleDir = path.dirname(url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('chunk-XW52LOLP.cjs', document.baseURI).href))));
123
123
  const candidates = [
124
124
  path.resolve(moduleDir, "../../config/tool.yaml"),
125
125
  // src/api -> config
@@ -142,7 +142,7 @@ function collectExtensionEmbeddedDefaults(exts) {
142
142
  ) ?? "";
143
143
  if (!configPath) continue;
144
144
  try {
145
- const toolDefaults = chunkXPQZLO4A_cjs.loadToolConfig(configPath).toolDefaults ?? {};
145
+ const toolDefaults = chunk5HSGVA6S_cjs.loadToolConfig(configPath).toolDefaults ?? {};
146
146
  if (Object.keys(toolDefaults).length === 0) continue;
147
147
  const manifest = chunkF4HS7H7K_cjs.loadExtensionManifest(ext.packageRoot);
148
148
  const ownToolNames = /* @__PURE__ */ new Set();
@@ -163,9 +163,9 @@ function collectExtensionEmbeddedDefaults(exts) {
163
163
  return merged;
164
164
  }
165
165
  function loadMergedToolConfig(overridePath) {
166
- const baseConfig = chunkXPQZLO4A_cjs.loadToolConfig(EMBEDDED_TOOL_CONFIG_PATH);
166
+ const baseConfig = chunk5HSGVA6S_cjs.loadToolConfig(EMBEDDED_TOOL_CONFIG_PATH);
167
167
  if (!overridePath) return baseConfig;
168
- const overrideConfig = chunkXPQZLO4A_cjs.loadToolConfig(overridePath);
168
+ const overrideConfig = chunk5HSGVA6S_cjs.loadToolConfig(overridePath);
169
169
  return agentCommon.deepMerge({}, baseConfig, overrideConfig);
170
170
  }
171
171
  function runtimeOptionsFromConfig(opts, toolConfig, configPathForResolve, extensionEmbeddedDefaults) {
@@ -173,7 +173,7 @@ function runtimeOptionsFromConfig(opts, toolConfig, configPathForResolve, extens
173
173
  {
174
174
  const updates = {};
175
175
  if (toolConfig.sandboxedPath && typeof toolConfig.sandboxedPath === "string") {
176
- updates.sandboxRoot = chunkXPQZLO4A_cjs.resolveSandboxedPath(configPathForResolve, toolConfig.sandboxedPath);
176
+ updates.sandboxRoot = chunk5HSGVA6S_cjs.resolveSandboxedPath(configPathForResolve, toolConfig.sandboxedPath);
177
177
  }
178
178
  if (typeof toolConfig.enableSandboxValidation === "boolean") {
179
179
  updates.enableSandboxValidation = toolConfig.enableSandboxValidation;
@@ -200,7 +200,7 @@ function runtimeOptionsFromConfig(opts, toolConfig, configPathForResolve, extens
200
200
  const packageDefaults = { ...coreTools.packageDefaults };
201
201
  if (toolConfig.packageToolDefaults != null && Object.keys(toolConfig.packageToolDefaults).length > 0) {
202
202
  for (const [descriptor, pkgConfig] of Object.entries(toolConfig.packageToolDefaults)) {
203
- const prefix = descriptor.startsWith("file:") ? chunkXPQZLO4A_cjs.fileDescriptorToPackagePrefix(descriptor) : chunkXPQZLO4A_cjs.npmDescriptorToPackagePrefixWithVersion(descriptor);
203
+ const prefix = descriptor.startsWith("file:") ? chunk5HSGVA6S_cjs.fileDescriptorToPackagePrefix(descriptor) : chunk5HSGVA6S_cjs.npmDescriptorToPackagePrefixWithVersion(descriptor);
204
204
  if (!prefix) continue;
205
205
  const pkgDefaults = pkgConfig?.defaults != null && typeof pkgConfig.defaults === "object" && !Array.isArray(pkgConfig.defaults) ? pkgConfig.defaults : {};
206
206
  if (Object.keys(pkgDefaults).length > 0) {
@@ -229,10 +229,10 @@ function buildRuntimeAndHub(options = {}) {
229
229
  const configPathForResolve = options.configFilePath ?? EMBEDDED_TOOL_CONFIG_PATH;
230
230
  const mergedToolConfig = loadMergedToolConfig(options.configFilePath);
231
231
  const extensionEmbeddedDefaults = collectExtensionEmbeddedDefaults(
232
- chunkXPQZLO4A_cjs.loadAllExtensionsFromToolYamlSync(configPathForResolve)
232
+ chunk5HSGVA6S_cjs.loadAllExtensionsFromToolYamlSync(configPathForResolve)
233
233
  );
234
234
  const runtimeOpts = runtimeOptionsFromConfig(options, mergedToolConfig, configPathForResolve, extensionEmbeddedDefaults);
235
- const { runtime } = chunkXPQZLO4A_cjs.createRuntimeFromConfigSync(runtimeOpts);
235
+ const { runtime } = chunk5HSGVA6S_cjs.createRuntimeFromConfigSync(runtimeOpts);
236
236
  const hub = new LangChainToolsHub(runtime);
237
237
  return { runtime, hub, mergedToolConfig };
238
238
  }
@@ -242,37 +242,20 @@ function createLangChainAgentTools(options) {
242
242
  const names = Array.isArray(mergedToolConfig.tools) ? mergedToolConfig.tools : [];
243
243
  if (names.length > 0) {
244
244
  const registryNames = runtime.getRegistry().snapshot().map((s) => s.name);
245
- const allBarePackages = names.every((n) => chunkXPQZLO4A_cjs.isBarePackageDescriptor(String(n)));
245
+ const allBarePackages = names.every((n) => chunk5HSGVA6S_cjs.isBarePackageDescriptor(String(n)));
246
246
  if (allBarePackages) return hub.getLangChainTools();
247
- return hub.getLangChainToolsForNames(chunkXPQZLO4A_cjs.expandToolDescriptorsToRegistryNames(names, registryNames));
247
+ return hub.getLangChainToolsForNames(chunk5HSGVA6S_cjs.expandToolDescriptorsToRegistryNames(names, registryNames));
248
248
  }
249
249
  return hub.getLangChainTools();
250
250
  }
251
- async function createMcpServer(options) {
252
- const opts = typeof options === "string" ? { configFilePath: options } : options ?? {};
253
- const { runtime, mergedToolConfig } = buildRuntimeAndHub(opts);
254
- const serverOpts = {
255
- name: opts.name ?? mergedToolConfig.mcp?.name,
256
- version: opts.version ?? mergedToolConfig.mcp?.version,
257
- execContextFactory: opts.execContextFactory
258
- };
259
- const { server } = await chunkXPQZLO4A_cjs.createMCPServer(runtime, serverOpts);
260
- return server;
261
- }
262
- async function createOpenAPIServer(options) {
263
- const opts = typeof options === "string" ? { configFilePath: options } : options ?? {};
264
- const { runtime, mergedToolConfig } = buildRuntimeAndHub(opts);
265
- const serverOpts = {
266
- host: opts.host ?? mergedToolConfig.openapi?.host,
267
- port: opts.port ?? mergedToolConfig.openapi?.port,
268
- basePath: opts.basePath ?? mergedToolConfig.openapi?.basePath,
269
- execContextFactory: opts.execContextFactory
270
- };
271
- return chunkXPQZLO4A_cjs.createOpenAPIHttpServer(runtime, serverOpts);
251
+
252
+ // src/api/register-tools.ts
253
+ function createAgentTools(options) {
254
+ const tools = createLangChainAgentTools(options);
255
+ agentCommon.getDefaultAgentContext().set(agentCommon.AgentContextTokens.Tools, tools);
256
+ return tools;
272
257
  }
273
258
 
274
- exports.createLangChainAgentTools = createLangChainAgentTools;
275
- exports.createMcpServer = createMcpServer;
276
- exports.createOpenAPIServer = createOpenAPIServer;
277
- //# sourceMappingURL=chunk-6NBQAFVB.cjs.map
278
- //# sourceMappingURL=chunk-6NBQAFVB.cjs.map
259
+ exports.createAgentTools = createAgentTools;
260
+ //# sourceMappingURL=chunk-XW52LOLP.cjs.map
261
+ //# sourceMappingURL=chunk-XW52LOLP.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/api/adapters/LangChainToolsHub.ts","../src/api/createAgentTools.ts","../src/api/register-tools.ts"],"names":["LANGCHAIN_KIND","stripNullishObjectFields","enrichSpecWithCanonicalSchema","DynamicStructuredTool","dirname","fileURLToPath","resolve","existsSync","loadToolConfig","loadExtensionManifest","deepMerge","resolveSandboxedPath","fileDescriptorToPackagePrefix","npmDescriptorToPackagePrefixWithVersion","loadAllExtensionsFromToolYamlSync","createRuntimeFromConfigSync","isBarePackageDescriptor","expandToolDescriptorsToRegistryNames","getDefaultAgentContext","AgentContextTokens"],"mappings":"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","file":"chunk-XW52LOLP.cjs","sourcesContent":["/**\n * Exposes all tools from a ToolRegistry + PTCRuntime as LangChain tools\n * for local agent use (e.g. with createReactAgent, AgentExecutor).\n *\n * For most users, use createAgentTools() from @easynet/agent-tool, which loads from tool.yaml and returns\n * StructuredTool[]. Use LangChainToolsHub when you need a custom runtime or ctxFactory.\n *\n * Use: new LangChainToolsHub(runtime, ctxFactory).getLangChainTools()\n */\n\nimport { DynamicStructuredTool, type StructuredToolInterface } from \"@langchain/core/tools\";\nimport { stripNullishObjectFields } from \"@easynet/agent-common\";\nimport type { PTCRuntime } from \"../../core/runtime/PTCRuntime.js\";\nimport type { ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport type { ToolResult } from \"../../core/types/ToolResult.js\";\nimport type { ExecContext } from \"../../core/types/ToolIntent.js\";\nimport type { ToolIntent } from \"../../core/types/ToolIntent.js\";\nimport { enrichSpecWithCanonicalSchema } from \"../../tools/util/canonicalCoreSchemas.js\";\nimport { LANGCHAIN_KIND } from \"../../tools/langchain/types.js\";\n\n/**\n * If inputSchema wraps all params in a single \"args\" object (manifest convention),\n * returns that inner args schema; otherwise returns null.\n */\nfunction getArgsSchemaIfWrapped(inputSchema: object): Record<string, unknown> | null {\n const s = inputSchema as Record<string, unknown>;\n if (s?.type !== \"object\" || !s.properties || typeof s.properties !== \"object\") return null;\n const args = (s.properties as Record<string, unknown>).args;\n if (\n args != null &&\n typeof args === \"object\" &&\n (args as Record<string, unknown>).type === \"object\" &&\n (args as Record<string, unknown>).properties != null\n ) {\n return args as Record<string, unknown>;\n }\n return null;\n}\n\n/**\n * True when inputSchema wraps all params in a single \"args\" object (manifest convention).\n */\nfunction hasArgsWrapper(inputSchema: object): boolean {\n return getArgsSchemaIfWrapped(inputSchema) !== null;\n}\n\n/**\n * If inputSchema is { type: \"object\", properties: { args: { type: \"object\", properties: {...} } } },\n * return the inner args schema so the LLM can pass { path: \".\" } instead of { args: { path: \".\" } }.\n */\nfunction schemaForLangChain(inputSchema: object): Record<string, unknown> {\n const wrapped = getArgsSchemaIfWrapped(inputSchema);\n if (wrapped !== null) return wrapped;\n return inputSchema as Record<string, unknown>;\n}\n\nfunction buildIntent(\n toolName: string,\n inputSchema: object,\n args: Record<string, unknown>,\n): ToolIntent {\n return {\n tool: toolName,\n args: hasArgsWrapper(inputSchema) ? { args } : args,\n purpose: LANGCHAIN_KIND,\n };\n}\n\nfunction normalizeArgs(args: Record<string, unknown> | undefined): Record<string, unknown> {\n return stripNullishObjectFields(args ?? {}) as Record<string, unknown>;\n}\n\nfunction serializeToolResult(result: ToolResult): string {\n if (result.ok) {\n return typeof result.result === \"string\"\n ? result.result\n : JSON.stringify(result.result);\n }\n\n const err = result.error;\n const message = err?.message ?? \"Tool failed\";\n const details = err?.details;\n return JSON.stringify(\n details != null ? { error: message, details } : { error: message },\n );\n}\n\nexport type ExecContextFactory = () => ExecContext;\n\nconst DEFAULT_CTX_FACTORY: ExecContextFactory = () => ({\n requestId: `lc-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n taskId: `task-${Date.now()}`,\n permissions: [\n \"read:web\",\n \"read:fs\",\n \"write:fs\",\n \"read:db\",\n \"write:db\",\n \"network\",\n \"workflow\",\n \"danger:destructive\",\n ],\n});\n\n/**\n * Hub that wraps PTCRuntime and exposes every registered tool as a LangChain\n * StructuredTool (DynamicStructuredTool), so local agents (LangChain AgentExecutor,\n * createReactAgent, etc.) can use the same tools as MCP and OpenAPI.\n */\nexport class LangChainToolsHub {\n constructor(\n private readonly runtime: PTCRuntime,\n private readonly ctxFactory: ExecContextFactory = DEFAULT_CTX_FACTORY,\n ) {}\n\n /**\n * Returns all registered tools as LangChain StructuredTool[].\n * Each tool invokes the runtime through the full pipeline (policy, HITL, etc.).\n */\n getLangChainTools(): StructuredToolInterface[] {\n const registry = this.runtime.getRegistry();\n const specs = registry.snapshot();\n\n return specs.map((spec) => this.specToLangChainTool(spec));\n }\n\n /**\n * Returns LangChain tools for a subset of tools (by name or query).\n */\n getLangChainToolsForNames(toolNames: string[]): StructuredToolInterface[] {\n const registry = this.runtime.getRegistry();\n const set = new Set(toolNames);\n const specs = registry.snapshot().filter((s) => set.has(s.name));\n return specs.map((spec) => this.specToLangChainTool(spec));\n }\n\n private specToLangChainTool(spec: ToolSpec): DynamicStructuredTool {\n const runtime = this.runtime;\n const ctxFactory = this.ctxFactory;\n const enriched = enrichSpecWithCanonicalSchema(spec);\n\n const schema = schemaForLangChain(enriched.inputSchema);\n return new DynamicStructuredTool({\n name: spec.name,\n description: spec.description ?? `Tool: ${spec.name}`,\n schema,\n func: async (args: Record<string, unknown>): Promise<string> => {\n const normalizedArgs = normalizeArgs(args);\n const intent = buildIntent(spec.name, enriched.inputSchema, normalizedArgs);\n const ctx = ctxFactory();\n const result = await runtime.invoke(intent, ctx);\n return serializeToolResult(result);\n },\n });\n }\n}\n","/**\n * Standalone tool creation functions. Each function:\n * - Uses the embedded config/tool.yaml as the default base.\n * - If a configFilePath is provided, merges it on top of the default.\n * - If no options are provided at all, behaves as if only the embedded default is used.\n *\n * Public module API uses createAgentTools() in register-tools.ts.\n * This file keeps internal builders for LangChain / MCP / OpenAPI outputs.\n */\n\nimport { loadToolConfig, resolveSandboxedPath } from \"../tools/util/toolConfig.js\";\nimport type { ToolYamlShape } from \"../tools/util/toolConfig.js\";\nimport { loadExtensionManifest } from \"./extension/registerFromManifest.js\";\nimport {\n expandToolDescriptorsToRegistryNames,\n isBarePackageDescriptor,\n npmDescriptorToPackagePrefixWithVersion,\n fileDescriptorToPackagePrefix,\n} from \"../tools/util/toolDescriptor.js\";\nimport { deepMerge } from \"@easynet/agent-common\";\nimport { createRuntimeFromConfigSync, loadAllExtensionsFromToolYamlSync } from \"./runtimeFromConfig.js\";\nimport type { CreateRuntimeOptions, LoadedExtension } from \"./runtimeFromConfig.js\";\nimport { LangChainToolsHub } from \"./adapters/LangChainToolsHub.js\";\nimport { createMCPServer, type MCPServerOptions, type McpServer } from \"./expose/mcpServer.js\";\nimport {\n createOpenAPIHttpServer,\n type OpenAPIExpressApp,\n type OpenAPIHttpServerOptions,\n} from \"./expose/openapiHttp.js\";\nimport type { StructuredToolInterface } from \"@langchain/core/tools\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, resolve } from \"node:path\";\nimport { existsSync } from \"node:fs\";\n\nexport interface CreateAgentToolsOptions extends CreateRuntimeOptions {\n /** Path to an override tool.yaml; its values are merged on top of the embedded default config/tool.yaml */\n configFilePath?: string;\n}\n\n/** Merge host lists from multiple sources (e.g. tool.yaml + programmatic). Union, dedup, preserves order. */\nfunction mergeHostLists(a?: string[], b?: string[]): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const list of [a ?? [], b ?? []]) {\n for (const h of list) {\n if (!seen.has(h)) {\n seen.add(h);\n out.push(h);\n }\n }\n }\n return out;\n}\n\nfunction resolveEmbeddedToolConfigPath(): string {\n const moduleDir = dirname(fileURLToPath(import.meta.url));\n const candidates = [\n resolve(moduleDir, \"../../config/tool.yaml\"), // src/api -> config\n resolve(moduleDir, \"../config/tool.yaml\"), // dist/* -> config\n resolve(process.cwd(), \"config/tool.yaml\"), // fallback for local app runtime\n ];\n for (const candidate of candidates) {\n if (existsSync(candidate)) return candidate;\n }\n return candidates[0]!;\n}\n\nconst EMBEDDED_TOOL_CONFIG_PATH = resolveEmbeddedToolConfigPath();\n\n/**\n * For each loaded extension, load its embedded config/tool.yaml (layer 2) and collect\n * the toolDefaults into a flat map. Later entries in the list win over earlier ones.\n *\n * Security constraint: each extension's embedded config may only set defaults for tools\n * that belong to that extension (verified against its own manifest). Keys that reference\n * tools from other extensions or global config fields are silently ignored.\n */\nfunction collectExtensionEmbeddedDefaults(\n exts: LoadedExtension[],\n): Record<string, Record<string, unknown>> {\n const merged: Record<string, Record<string, unknown>> = {};\n for (const ext of exts) {\n // Prefer dist/config/tool.yaml (published package); fall back to config/tool.yaml (local dev).\n const configPath =\n [resolve(ext.packageRoot, \"dist/config/tool.yaml\"), resolve(ext.packageRoot, \"config/tool.yaml\")].find(\n existsSync,\n ) ?? \"\";\n if (!configPath) continue;\n try {\n const toolDefaults = loadToolConfig(configPath).toolDefaults ?? {};\n if (Object.keys(toolDefaults).length === 0) continue;\n\n // Build the set of short names this extension owns from its manifest.\n // Include both the explicit name field and the dot-path derived from sourcePath\n // (e.g. \"listDir\" and \"fs.listDir\" for src/fs/listDir) so that config keys in\n // either format are accepted.\n const manifest = loadExtensionManifest(ext.packageRoot);\n const ownToolNames = new Set<string>();\n for (const e of manifest.entries) {\n if (e.name) ownToolNames.add(e.name);\n if (e.sourcePath) {\n ownToolNames.add(e.sourcePath.replace(/^src\\//, \"\").replace(/\\//g, \".\"));\n }\n }\n\n for (const [k, v] of Object.entries(toolDefaults)) {\n // Only allow keys that are short names of tools this extension registers.\n if (ownToolNames.has(k)) {\n merged[k] = v;\n }\n }\n } catch {\n // skip malformed extension config or missing manifest\n }\n }\n return merged;\n}\n\nfunction loadMergedToolConfig(overridePath?: string): ToolYamlShape {\n const baseConfig = loadToolConfig(EMBEDDED_TOOL_CONFIG_PATH);\n if (!overridePath) return baseConfig;\n const overrideConfig = loadToolConfig(overridePath);\n return deepMerge({} as ToolYamlShape, baseConfig, overrideConfig);\n}\n\nfunction runtimeOptionsFromConfig(\n opts: CreateAgentToolsOptions,\n toolConfig: ToolYamlShape,\n configPathForResolve: string,\n extensionEmbeddedDefaults: Record<string, Record<string, unknown>>,\n): CreateRuntimeOptions {\n const coreTools = opts.coreTools ?? { sandboxRoot: process.cwd(), allowedHosts: [], enableSandboxValidation: false };\n {\n const updates: {\n sandboxRoot?: string;\n enableSandboxValidation?: boolean;\n allowedHosts?: string[];\n blockedHosts?: string[];\n blockedCidrs?: string[];\n toolOverrides?: Record<string, Record<string, unknown>>;\n packageDefaults?: Record<string, Record<string, unknown>>;\n } = {};\n if (toolConfig.sandboxedPath && typeof toolConfig.sandboxedPath === \"string\") {\n updates.sandboxRoot = resolveSandboxedPath(configPathForResolve, toolConfig.sandboxedPath);\n }\n if (typeof toolConfig.enableSandboxValidation === \"boolean\") {\n updates.enableSandboxValidation = toolConfig.enableSandboxValidation;\n } else if (coreTools.enableSandboxValidation == null) {\n updates.enableSandboxValidation = false;\n }\n // Smart merge: union of allowedHosts and blockedHosts from yaml + programmatic (both lists always applied)\n updates.allowedHosts = mergeHostLists(coreTools.allowedHosts, toolConfig.allowedHosts);\n updates.blockedHosts = mergeHostLists(coreTools.blockedHosts, toolConfig.blockedHosts);\n if (Array.isArray(toolConfig.blockedCidrs) && toolConfig.blockedCidrs.length > 0) {\n updates.blockedCidrs = toolConfig.blockedCidrs;\n } else if (coreTools.blockedCidrs?.length) {\n updates.blockedCidrs = coreTools.blockedCidrs;\n }\n let hasToolDefaults = false;\n // Priority (low → high): extension embedded (layer 2) < programmatic coreTools < layer 1+3 toolDefaults\n const flatOverrides: Record<string, Record<string, unknown>> = {\n ...extensionEmbeddedDefaults,\n ...coreTools.toolOverrides,\n };\n if (Object.keys(extensionEmbeddedDefaults).length > 0) hasToolDefaults = true;\n if (toolConfig.toolDefaults != null && Object.keys(toolConfig.toolDefaults).length > 0) {\n Object.assign(flatOverrides, toolConfig.toolDefaults);\n hasToolDefaults = true;\n }\n const packageDefaults: Record<string, Record<string, unknown>> = { ...coreTools.packageDefaults };\n if (toolConfig.packageToolDefaults != null && Object.keys(toolConfig.packageToolDefaults).length > 0) {\n for (const [descriptor, pkgConfig] of Object.entries(toolConfig.packageToolDefaults)) {\n const prefix = descriptor.startsWith(\"file:\")\n ? fileDescriptorToPackagePrefix(descriptor)\n : npmDescriptorToPackagePrefixWithVersion(descriptor);\n if (!prefix) continue;\n const pkgDefaults =\n pkgConfig?.defaults != null && typeof pkgConfig.defaults === \"object\" && !Array.isArray(pkgConfig.defaults)\n ? (pkgConfig.defaults as Record<string, unknown>)\n : {};\n if (Object.keys(pkgDefaults).length > 0) {\n packageDefaults[prefix] = pkgDefaults;\n }\n const toolConfigs = pkgConfig?.tools != null && typeof pkgConfig.tools === \"object\" && !Array.isArray(pkgConfig.tools) ? pkgConfig.tools : {};\n for (const [toolName, config] of Object.entries(toolConfigs)) {\n if (config != null && typeof config === \"object\") {\n hasToolDefaults = true;\n flatOverrides[`${prefix}::${toolName}`] = { ...pkgDefaults, ...(config as Record<string, unknown>) };\n }\n }\n }\n if (Object.keys(packageDefaults).length > 0) {\n updates.packageDefaults = packageDefaults;\n }\n }\n if (hasToolDefaults) {\n updates.toolOverrides = flatOverrides;\n }\n if (Object.keys(updates).length > 0) return { ...opts, coreTools: { ...coreTools, ...updates } };\n }\n return { ...opts, coreTools };\n}\n\n/**\n * Build a ready-to-use runtime + hub from options.\n * - No options → embedded default config/tool.yaml only.\n * - options.configFilePath → override merged on top of embedded default.\n */\nfunction buildRuntimeAndHub(options: CreateAgentToolsOptions = {}): {\n runtime: ReturnType<typeof createRuntimeFromConfigSync>[\"runtime\"];\n hub: LangChainToolsHub;\n mergedToolConfig: ToolYamlShape;\n} {\n const configPathForResolve = options.configFilePath ?? EMBEDDED_TOOL_CONFIG_PATH;\n const mergedToolConfig = loadMergedToolConfig(options.configFilePath);\n // Collect layer-2 defaults from each extension's embedded config/tool.yaml.\n // loadAllExtensionsFromToolYamlSync is cheap here (require() is cached by Node.js).\n const extensionEmbeddedDefaults = collectExtensionEmbeddedDefaults(\n loadAllExtensionsFromToolYamlSync(configPathForResolve),\n );\n const runtimeOpts = runtimeOptionsFromConfig(options, mergedToolConfig, configPathForResolve, extensionEmbeddedDefaults);\n const { runtime } = createRuntimeFromConfigSync(runtimeOpts);\n const hub = new LangChainToolsHub(runtime);\n return { runtime, hub, mergedToolConfig };\n}\n\n/**\n * Internal: create LangChain tools from config/runtime.\n *\n * - No argument → uses embedded default config/tool.yaml.\n * - options.configFilePath → merged on top of embedded default.\n * - All other CreateAgentToolsOptions (coreTools, etc.) are applied as programmatic overrides.\n *\n * @example\n * Internal helper consumed by createAgentTools().\n */\nexport function createLangChainAgentTools(\n options?: CreateAgentToolsOptions | string,\n): StructuredToolInterface[] {\n const opts: CreateAgentToolsOptions =\n typeof options === \"string\" ? { configFilePath: options } : options ?? {};\n const { runtime, hub, mergedToolConfig } = buildRuntimeAndHub(opts);\n\n const names = Array.isArray(mergedToolConfig.tools) ? mergedToolConfig.tools : [];\n if (names.length > 0) {\n const registryNames = runtime.getRegistry().snapshot().map((s) => s.name);\n const allBarePackages = names.every((n) => isBarePackageDescriptor(String(n)));\n if (allBarePackages) return hub.getLangChainTools();\n return hub.getLangChainToolsForNames(expandToolDescriptorsToRegistryNames(names, registryNames));\n }\n return hub.getLangChainTools();\n}\n\n/**\n * Internal: create an MCP server from tool config.\n *\n * - No argument → uses embedded default config/tool.yaml.\n * - options.configFilePath → merged on top of embedded default.\n * - options.mcp → passed to the MCP server (name, version, execContextFactory).\n *\n * @example\n * Internal helper consumed by createAgentTools() expose flows.\n */\nexport async function createMcpServer(\n options?: (CreateAgentToolsOptions & MCPServerOptions) | string,\n): Promise<McpServer> {\n const opts: CreateAgentToolsOptions & MCPServerOptions =\n typeof options === \"string\" ? { configFilePath: options } : options ?? {};\n const { runtime, mergedToolConfig } = buildRuntimeAndHub(opts);\n const serverOpts: MCPServerOptions = {\n name: opts.name ?? mergedToolConfig.mcp?.name,\n version: opts.version ?? mergedToolConfig.mcp?.version,\n execContextFactory: opts.execContextFactory,\n };\n const { server } = await createMCPServer(runtime, serverOpts);\n return server;\n}\n\n/**\n * Internal: create an OpenAPI / Swagger HTTP server from tool config.\n *\n * - No argument → uses embedded default config/tool.yaml.\n * - options.configFilePath → merged on top of embedded default.\n * - options.port, host, basePath → passed to the HTTP server; tool.yaml openapi: section provides defaults.\n *\n * @example\n * Internal helper consumed by createAgentTools() expose flows.\n */\nexport async function createOpenAPIServer(\n options?: (CreateAgentToolsOptions & OpenAPIHttpServerOptions) | string,\n): Promise<OpenAPIExpressApp> {\n const opts: CreateAgentToolsOptions & OpenAPIHttpServerOptions =\n typeof options === \"string\" ? { configFilePath: options } : options ?? {};\n const { runtime, mergedToolConfig } = buildRuntimeAndHub(opts);\n const serverOpts: OpenAPIHttpServerOptions = {\n host: opts.host ?? mergedToolConfig.openapi?.host,\n port: opts.port ?? mergedToolConfig.openapi?.port,\n basePath: opts.basePath ?? mergedToolConfig.openapi?.basePath,\n execContextFactory: opts.execContextFactory,\n };\n return createOpenAPIHttpServer(runtime, serverOpts);\n}\n","import { AgentContextTokens, getDefaultAgentContext } from \"@easynet/agent-common\";\nimport { createLangChainAgentTools, type CreateAgentToolsOptions } from \"./createAgentTools.js\";\n\nexport interface CreateAgentToolsModuleOptions extends CreateAgentToolsOptions {}\n\n/**\n * Initialize LangChain agent tools and register them into the process-level singleton AgentContext.\n *\n * Sets:\n * - AgentContextTokens.Tools → StructuredToolInterface[]\n *\n * @example\n * ```ts\n * createAgentTools({ configFilePath: \"config/tool.yaml\" });\n * ```\n */\nexport function createAgentTools(options?: CreateAgentToolsModuleOptions): unknown[] {\n const tools = createLangChainAgentTools(options);\n getDefaultAgentContext().set(AgentContextTokens.Tools, tools);\n return tools;\n}\n"]}
package/dist/index.cjs CHANGED
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
- var chunk6NBQAFVB_cjs = require('./chunk-6NBQAFVB.cjs');
3
+ var chunkXW52LOLP_cjs = require('./chunk-XW52LOLP.cjs');
4
4
  require('./chunk-F4HS7H7K.cjs');
5
- require('./chunk-XPQZLO4A.cjs');
5
+ require('./chunk-5HSGVA6S.cjs');
6
6
  require('./chunk-UUNG3GL3.cjs');
7
7
  require('./chunk-V2RD4BHT.cjs');
8
8
  require('./chunk-LHKEJNKL.cjs');
@@ -13,13 +13,9 @@ require('./chunk-QEJF3KDV.cjs');
13
13
 
14
14
 
15
15
 
16
- Object.defineProperty(exports, "createMcpServer", {
16
+ Object.defineProperty(exports, "createAgentTools", {
17
17
  enumerable: true,
18
- get: function () { return chunk6NBQAFVB_cjs.createMcpServer; }
19
- });
20
- Object.defineProperty(exports, "createOpenAPIServer", {
21
- enumerable: true,
22
- get: function () { return chunk6NBQAFVB_cjs.createOpenAPIServer; }
18
+ get: function () { return chunkXW52LOLP_cjs.createAgentTools; }
23
19
  });
24
20
  //# sourceMappingURL=index.cjs.map
25
21
  //# sourceMappingURL=index.cjs.map
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Minimal public API for @easynet/agent-tool.
3
- * Only expose standalone server factories.
3
+ * Expose only module initializer for framework assembly.
4
4
  */
5
- export { createMcpServer, createOpenAPIServer } from "./api/createAgentTools.js";
5
+ export { createAgentTools, type CreateAgentToolsModuleOptions, } from "./api/register-tools.js";
6
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EACL,gBAAgB,EAChB,KAAK,6BAA6B,GACnC,MAAM,yBAAyB,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
- export { createMcpServer, createOpenAPIServer } from './chunk-GYN3JAMK.js';
1
+ export { createAgentTools } from './chunk-ACSGEQAY.js';
2
2
  import './chunk-NEMGE573.js';
3
- import './chunk-EHFXS4WP.js';
3
+ import './chunk-W2WJOS5Z.js';
4
4
  import './chunk-NTWOVFEY.js';
5
5
  import './chunk-3D7XYAZO.js';
6
6
  import './chunk-HEVWKBBQ.js';
@@ -2,7 +2,7 @@
2
2
  'use strict';
3
3
 
4
4
  var chunkQCHMXVWZ_cjs = require('../../chunk-QCHMXVWZ.cjs');
5
- var chunkXPQZLO4A_cjs = require('../../chunk-XPQZLO4A.cjs');
5
+ var chunk5HSGVA6S_cjs = require('../../chunk-5HSGVA6S.cjs');
6
6
  var chunkUUNG3GL3_cjs = require('../../chunk-UUNG3GL3.cjs');
7
7
  require('../../chunk-V2RD4BHT.cjs');
8
8
  require('../../chunk-LHKEJNKL.cjs');
@@ -274,10 +274,10 @@ async function getRuntimeWithTools(pathOpt, verbose = false) {
274
274
  const stepLog = verbose ? (msg) => process.stderr.write(`[agent-tool] ${msg}
275
275
  `) : void 0;
276
276
  if (stepLog) stepLog(`Loading tool config from ${searchDir}`);
277
- const config = chunkXPQZLO4A_cjs.findAndLoadToolConfig(searchDir);
277
+ const config = chunk5HSGVA6S_cjs.findAndLoadToolConfig(searchDir);
278
278
  let sandboxRoot = cwd;
279
279
  if (config.sandboxedPath && typeof config.sandboxedPath === "string" && config.configPath) {
280
- sandboxRoot = chunkXPQZLO4A_cjs.resolveSandboxedPath(config.configPath, config.sandboxedPath);
280
+ sandboxRoot = chunk5HSGVA6S_cjs.resolveSandboxedPath(config.configPath, config.sandboxedPath);
281
281
  }
282
282
  if (stepLog) {
283
283
  if (config.configPath) {
@@ -292,7 +292,7 @@ async function getRuntimeWithTools(pathOpt, verbose = false) {
292
292
  enableSandboxValidation: config.enableSandboxValidation ?? DEFAULT_CORE_CONFIG.enableSandboxValidation,
293
293
  allowedHosts: []
294
294
  };
295
- const result = await chunkXPQZLO4A_cjs.createRuntimeFromConfig({
295
+ const result = await chunk5HSGVA6S_cjs.createRuntimeFromConfig({
296
296
  coreTools: coreConfig,
297
297
  configFilePath: config.configPath,
298
298
  stepLog
@@ -456,7 +456,7 @@ var LS_DESC_MAX = 72;
456
456
  function formatLsOutput(specs) {
457
457
  const rows = specs.map((spec) => {
458
458
  const { name } = parseToolName(spec.name);
459
- const scope = chunkXPQZLO4A_cjs.getDisplayScope(spec.name, spec.kind, spec.version);
459
+ const scope = chunk5HSGVA6S_cjs.getDisplayScope(spec.name, spec.kind, spec.version);
460
460
  const desc = (spec.description ?? "").replace(/\n/g, " ").trim().slice(0, LS_DESC_MAX);
461
461
  return { scope, name, description: desc || "(no description)" };
462
462
  });
@@ -483,7 +483,7 @@ function formatLsOutput(specs) {
483
483
  }
484
484
  function formatDescribeOutput(spec) {
485
485
  const { name: localName } = parseToolName(spec.name);
486
- const scope = chunkXPQZLO4A_cjs.getDisplayScope(spec.name, spec.kind, spec.version);
486
+ const scope = chunk5HSGVA6S_cjs.getDisplayScope(spec.name, spec.kind, spec.version);
487
487
  const sections = [];
488
488
  sections.push("\u250C\u2500 Tool");
489
489
  sections.push(`\u2502 name: ${spec.name}`);
@@ -519,7 +519,7 @@ async function cmdLs(pathOpt, verbose = false) {
519
519
  process.stdout.write("No tools registered.\n");
520
520
  const cwd = process.cwd();
521
521
  const searchDir = path2__namespace.default.resolve(cwd, pathOpt ?? ".");
522
- const config = chunkXPQZLO4A_cjs.findAndLoadToolConfig(searchDir);
522
+ const config = chunk5HSGVA6S_cjs.findAndLoadToolConfig(searchDir);
523
523
  const hasNpmTools = Array.isArray(config.tools) && config.tools.some((t) => typeof t === "string" && t.startsWith("npm:"));
524
524
  if (hasNpmTools) {
525
525
  process.stdout.write(
@@ -544,7 +544,7 @@ async function cmdDescribe(toolName, pathOpt, verbose = false) {
544
544
  }
545
545
  try {
546
546
  const { registry } = await getRuntimeWithTools(pathOpt, verbose);
547
- const registryName = chunkXPQZLO4A_cjs.resolveToolDescriptor(toolName.trim());
547
+ const registryName = chunk5HSGVA6S_cjs.resolveToolDescriptor(toolName.trim());
548
548
  const spec = registry.get(registryName);
549
549
  if (!spec) {
550
550
  process.stderr.write(`Tool not found: ${toolName}
@@ -593,7 +593,7 @@ async function cmdRun(toolName, toolArgsJson, pathOpt, verbose = false) {
593
593
  }
594
594
  try {
595
595
  const { runtime, registry } = await getRuntimeWithTools(pathOpt, verbose);
596
- const registryName = chunkXPQZLO4A_cjs.resolveToolDescriptor(toolName.trim());
596
+ const registryName = chunk5HSGVA6S_cjs.resolveToolDescriptor(toolName.trim());
597
597
  if (!registry.get(registryName)) {
598
598
  process.stderr.write(`Tool not found: ${toolName}
599
599
  `);
@@ -621,10 +621,10 @@ async function cmdStartMcp(pathOpt, verbose = false, stdio = false, port = 3e3,
621
621
  try {
622
622
  const { runtime } = await getRuntimeWithTools(pathOpt, verbose);
623
623
  if (stdio) {
624
- await chunkXPQZLO4A_cjs.runMCPServerOverStdio(runtime);
624
+ await chunk5HSGVA6S_cjs.runMCPServerOverStdio(runtime);
625
625
  return 0;
626
626
  }
627
- const streamable = await chunkXPQZLO4A_cjs.createMCPServerStreamableHttp(runtime, { port, host, path: "/mcp" });
627
+ const streamable = await chunk5HSGVA6S_cjs.createMCPServerStreamableHttp(runtime, { port, host, path: "/mcp" });
628
628
  const { url, port: actualPort } = await streamable.listen(port, host);
629
629
  process.stdout.write(`MCP Streamable HTTP: ${url}
630
630
  `);
@@ -640,7 +640,7 @@ async function cmdStartMcp(pathOpt, verbose = false, stdio = false, port = 3e3,
640
640
  async function cmdStartHttp(port, host, pathOpt, verbose = false) {
641
641
  try {
642
642
  const { runtime } = await getRuntimeWithTools(pathOpt, verbose);
643
- const http = await chunkXPQZLO4A_cjs.createHttpService(runtime);
643
+ const http = await chunk5HSGVA6S_cjs.createHttpService(runtime);
644
644
  const { port: actualPort, host: actualHost } = await http.listen({ port, host });
645
645
  const base = `http://${actualHost}:${actualPort}`;
646
646
  process.stdout.write(`API: ${base}/invoke (POST), ${base}/tools (GET)
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { initProject, buildMCPPackage, runMCPServer } from '../../chunk-6ORA3MNX.js';
3
- import { findAndLoadToolConfig, resolveToolDescriptor, runMCPServerOverStdio, createMCPServerStreamableHttp, createHttpService, resolveSandboxedPath, createRuntimeFromConfig, getDisplayScope } from '../../chunk-EHFXS4WP.js';
3
+ import { findAndLoadToolConfig, resolveToolDescriptor, runMCPServerOverStdio, createMCPServerStreamableHttp, createHttpService, resolveSandboxedPath, createRuntimeFromConfig, getDisplayScope } from '../../chunk-W2WJOS5Z.js';
4
4
  import { enrichSpecWithCanonicalSchema } from '../../chunk-NTWOVFEY.js';
5
5
  import '../../chunk-3D7XYAZO.js';
6
6
  import '../../chunk-HEVWKBBQ.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@easynet/agent-tool",
3
- "version": "1.0.83",
3
+ "version": "1.0.85",
4
4
  "description": "MCP build: init → build → run. Turn your project (@tool, SKILL, n8n) into a standalone MCP npm server (no framework embedding, no package conflict).",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -14,6 +14,26 @@
14
14
  "types": "./dist/index.d.ts",
15
15
  "import": "./dist/index.js",
16
16
  "require": "./dist/index.cjs"
17
+ },
18
+ "./runtime": {
19
+ "types": "./dist/core/runtime.d.ts",
20
+ "import": "./dist/core/runtime.js",
21
+ "require": "./dist/core/runtime.cjs"
22
+ },
23
+ "./core": {
24
+ "types": "./dist/core/index.d.ts",
25
+ "import": "./dist/core/index.js",
26
+ "require": "./dist/core/index.cjs"
27
+ },
28
+ "./extension": {
29
+ "types": "./dist/extension.d.ts",
30
+ "import": "./dist/extension.js",
31
+ "require": "./dist/extension.cjs"
32
+ },
33
+ "./security": {
34
+ "types": "./dist/security.d.ts",
35
+ "import": "./dist/security.js",
36
+ "require": "./dist/security.cjs"
17
37
  }
18
38
  },
19
39
  "files": [
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/api/adapters/LangChainToolsHub.ts","../src/api/createAgentTools.ts"],"names":["LANGCHAIN_KIND","stripNullishObjectFields","enrichSpecWithCanonicalSchema","DynamicStructuredTool","dirname","fileURLToPath","resolve","existsSync","loadToolConfig","loadExtensionManifest","deepMerge","resolveSandboxedPath","fileDescriptorToPackagePrefix","npmDescriptorToPackagePrefixWithVersion","loadAllExtensionsFromToolYamlSync","createRuntimeFromConfigSync","isBarePackageDescriptor","expandToolDescriptorsToRegistryNames","createMCPServer","createOpenAPIHttpServer"],"mappings":"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","file":"chunk-6NBQAFVB.cjs","sourcesContent":["/**\n * Exposes all tools from a ToolRegistry + PTCRuntime as LangChain tools\n * for local agent use (e.g. with createReactAgent, AgentExecutor).\n *\n * For most users, use createAgentTools() from @easynet/agent-tool, which loads from tool.yaml and returns\n * StructuredTool[]. Use LangChainToolsHub when you need a custom runtime or ctxFactory.\n *\n * Use: new LangChainToolsHub(runtime, ctxFactory).getLangChainTools()\n */\n\nimport { DynamicStructuredTool, type StructuredToolInterface } from \"@langchain/core/tools\";\nimport { stripNullishObjectFields } from \"@easynet/agent-common\";\nimport type { PTCRuntime } from \"../../core/runtime/PTCRuntime.js\";\nimport type { ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport type { ToolResult } from \"../../core/types/ToolResult.js\";\nimport type { ExecContext } from \"../../core/types/ToolIntent.js\";\nimport type { ToolIntent } from \"../../core/types/ToolIntent.js\";\nimport { enrichSpecWithCanonicalSchema } from \"../../tools/util/canonicalCoreSchemas.js\";\nimport { LANGCHAIN_KIND } from \"../../tools/langchain/types.js\";\n\n/**\n * If inputSchema wraps all params in a single \"args\" object (manifest convention),\n * returns that inner args schema; otherwise returns null.\n */\nfunction getArgsSchemaIfWrapped(inputSchema: object): Record<string, unknown> | null {\n const s = inputSchema as Record<string, unknown>;\n if (s?.type !== \"object\" || !s.properties || typeof s.properties !== \"object\") return null;\n const args = (s.properties as Record<string, unknown>).args;\n if (\n args != null &&\n typeof args === \"object\" &&\n (args as Record<string, unknown>).type === \"object\" &&\n (args as Record<string, unknown>).properties != null\n ) {\n return args as Record<string, unknown>;\n }\n return null;\n}\n\n/**\n * True when inputSchema wraps all params in a single \"args\" object (manifest convention).\n */\nfunction hasArgsWrapper(inputSchema: object): boolean {\n return getArgsSchemaIfWrapped(inputSchema) !== null;\n}\n\n/**\n * If inputSchema is { type: \"object\", properties: { args: { type: \"object\", properties: {...} } } },\n * return the inner args schema so the LLM can pass { path: \".\" } instead of { args: { path: \".\" } }.\n */\nfunction schemaForLangChain(inputSchema: object): Record<string, unknown> {\n const wrapped = getArgsSchemaIfWrapped(inputSchema);\n if (wrapped !== null) return wrapped;\n return inputSchema as Record<string, unknown>;\n}\n\nfunction buildIntent(\n toolName: string,\n inputSchema: object,\n args: Record<string, unknown>,\n): ToolIntent {\n return {\n tool: toolName,\n args: hasArgsWrapper(inputSchema) ? { args } : args,\n purpose: LANGCHAIN_KIND,\n };\n}\n\nfunction normalizeArgs(args: Record<string, unknown> | undefined): Record<string, unknown> {\n return stripNullishObjectFields(args ?? {}) as Record<string, unknown>;\n}\n\nfunction serializeToolResult(result: ToolResult): string {\n if (result.ok) {\n return typeof result.result === \"string\"\n ? result.result\n : JSON.stringify(result.result);\n }\n\n const err = result.error;\n const message = err?.message ?? \"Tool failed\";\n const details = err?.details;\n return JSON.stringify(\n details != null ? { error: message, details } : { error: message },\n );\n}\n\nexport type ExecContextFactory = () => ExecContext;\n\nconst DEFAULT_CTX_FACTORY: ExecContextFactory = () => ({\n requestId: `lc-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n taskId: `task-${Date.now()}`,\n permissions: [\n \"read:web\",\n \"read:fs\",\n \"write:fs\",\n \"read:db\",\n \"write:db\",\n \"network\",\n \"workflow\",\n \"danger:destructive\",\n ],\n});\n\n/**\n * Hub that wraps PTCRuntime and exposes every registered tool as a LangChain\n * StructuredTool (DynamicStructuredTool), so local agents (LangChain AgentExecutor,\n * createReactAgent, etc.) can use the same tools as MCP and OpenAPI.\n */\nexport class LangChainToolsHub {\n constructor(\n private readonly runtime: PTCRuntime,\n private readonly ctxFactory: ExecContextFactory = DEFAULT_CTX_FACTORY,\n ) {}\n\n /**\n * Returns all registered tools as LangChain StructuredTool[].\n * Each tool invokes the runtime through the full pipeline (policy, HITL, etc.).\n */\n getLangChainTools(): StructuredToolInterface[] {\n const registry = this.runtime.getRegistry();\n const specs = registry.snapshot();\n\n return specs.map((spec) => this.specToLangChainTool(spec));\n }\n\n /**\n * Returns LangChain tools for a subset of tools (by name or query).\n */\n getLangChainToolsForNames(toolNames: string[]): StructuredToolInterface[] {\n const registry = this.runtime.getRegistry();\n const set = new Set(toolNames);\n const specs = registry.snapshot().filter((s) => set.has(s.name));\n return specs.map((spec) => this.specToLangChainTool(spec));\n }\n\n private specToLangChainTool(spec: ToolSpec): DynamicStructuredTool {\n const runtime = this.runtime;\n const ctxFactory = this.ctxFactory;\n const enriched = enrichSpecWithCanonicalSchema(spec);\n\n const schema = schemaForLangChain(enriched.inputSchema);\n return new DynamicStructuredTool({\n name: spec.name,\n description: spec.description ?? `Tool: ${spec.name}`,\n schema,\n func: async (args: Record<string, unknown>): Promise<string> => {\n const normalizedArgs = normalizeArgs(args);\n const intent = buildIntent(spec.name, enriched.inputSchema, normalizedArgs);\n const ctx = ctxFactory();\n const result = await runtime.invoke(intent, ctx);\n return serializeToolResult(result);\n },\n });\n }\n}\n","/**\n * Standalone tool creation functions. Each function:\n * - Uses the embedded config/tool.yaml as the default base.\n * - If a configFilePath is provided, merges it on top of the default.\n * - If no options are provided at all, behaves as if only the embedded default is used.\n *\n * Public module API uses createAgentTools() in register-tools.ts.\n * This file keeps internal builders for LangChain / MCP / OpenAPI outputs.\n */\n\nimport { loadToolConfig, resolveSandboxedPath } from \"../tools/util/toolConfig.js\";\nimport type { ToolYamlShape } from \"../tools/util/toolConfig.js\";\nimport { loadExtensionManifest } from \"./extension/registerFromManifest.js\";\nimport {\n expandToolDescriptorsToRegistryNames,\n isBarePackageDescriptor,\n npmDescriptorToPackagePrefixWithVersion,\n fileDescriptorToPackagePrefix,\n} from \"../tools/util/toolDescriptor.js\";\nimport { deepMerge } from \"@easynet/agent-common\";\nimport { createRuntimeFromConfigSync, loadAllExtensionsFromToolYamlSync } from \"./runtimeFromConfig.js\";\nimport type { CreateRuntimeOptions, LoadedExtension } from \"./runtimeFromConfig.js\";\nimport { LangChainToolsHub } from \"./adapters/LangChainToolsHub.js\";\nimport { createMCPServer, type MCPServerOptions, type McpServer } from \"./expose/mcpServer.js\";\nimport {\n createOpenAPIHttpServer,\n type OpenAPIExpressApp,\n type OpenAPIHttpServerOptions,\n} from \"./expose/openapiHttp.js\";\nimport type { StructuredToolInterface } from \"@langchain/core/tools\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, resolve } from \"node:path\";\nimport { existsSync } from \"node:fs\";\n\nexport interface CreateAgentToolsOptions extends CreateRuntimeOptions {\n /** Path to an override tool.yaml; its values are merged on top of the embedded default config/tool.yaml */\n configFilePath?: string;\n}\n\n/** Merge host lists from multiple sources (e.g. tool.yaml + programmatic). Union, dedup, preserves order. */\nfunction mergeHostLists(a?: string[], b?: string[]): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const list of [a ?? [], b ?? []]) {\n for (const h of list) {\n if (!seen.has(h)) {\n seen.add(h);\n out.push(h);\n }\n }\n }\n return out;\n}\n\nfunction resolveEmbeddedToolConfigPath(): string {\n const moduleDir = dirname(fileURLToPath(import.meta.url));\n const candidates = [\n resolve(moduleDir, \"../../config/tool.yaml\"), // src/api -> config\n resolve(moduleDir, \"../config/tool.yaml\"), // dist/* -> config\n resolve(process.cwd(), \"config/tool.yaml\"), // fallback for local app runtime\n ];\n for (const candidate of candidates) {\n if (existsSync(candidate)) return candidate;\n }\n return candidates[0]!;\n}\n\nconst EMBEDDED_TOOL_CONFIG_PATH = resolveEmbeddedToolConfigPath();\n\n/**\n * For each loaded extension, load its embedded config/tool.yaml (layer 2) and collect\n * the toolDefaults into a flat map. Later entries in the list win over earlier ones.\n *\n * Security constraint: each extension's embedded config may only set defaults for tools\n * that belong to that extension (verified against its own manifest). Keys that reference\n * tools from other extensions or global config fields are silently ignored.\n */\nfunction collectExtensionEmbeddedDefaults(\n exts: LoadedExtension[],\n): Record<string, Record<string, unknown>> {\n const merged: Record<string, Record<string, unknown>> = {};\n for (const ext of exts) {\n // Prefer dist/config/tool.yaml (published package); fall back to config/tool.yaml (local dev).\n const configPath =\n [resolve(ext.packageRoot, \"dist/config/tool.yaml\"), resolve(ext.packageRoot, \"config/tool.yaml\")].find(\n existsSync,\n ) ?? \"\";\n if (!configPath) continue;\n try {\n const toolDefaults = loadToolConfig(configPath).toolDefaults ?? {};\n if (Object.keys(toolDefaults).length === 0) continue;\n\n // Build the set of short names this extension owns from its manifest.\n // Include both the explicit name field and the dot-path derived from sourcePath\n // (e.g. \"listDir\" and \"fs.listDir\" for src/fs/listDir) so that config keys in\n // either format are accepted.\n const manifest = loadExtensionManifest(ext.packageRoot);\n const ownToolNames = new Set<string>();\n for (const e of manifest.entries) {\n if (e.name) ownToolNames.add(e.name);\n if (e.sourcePath) {\n ownToolNames.add(e.sourcePath.replace(/^src\\//, \"\").replace(/\\//g, \".\"));\n }\n }\n\n for (const [k, v] of Object.entries(toolDefaults)) {\n // Only allow keys that are short names of tools this extension registers.\n if (ownToolNames.has(k)) {\n merged[k] = v;\n }\n }\n } catch {\n // skip malformed extension config or missing manifest\n }\n }\n return merged;\n}\n\nfunction loadMergedToolConfig(overridePath?: string): ToolYamlShape {\n const baseConfig = loadToolConfig(EMBEDDED_TOOL_CONFIG_PATH);\n if (!overridePath) return baseConfig;\n const overrideConfig = loadToolConfig(overridePath);\n return deepMerge({} as ToolYamlShape, baseConfig, overrideConfig);\n}\n\nfunction runtimeOptionsFromConfig(\n opts: CreateAgentToolsOptions,\n toolConfig: ToolYamlShape,\n configPathForResolve: string,\n extensionEmbeddedDefaults: Record<string, Record<string, unknown>>,\n): CreateRuntimeOptions {\n const coreTools = opts.coreTools ?? { sandboxRoot: process.cwd(), allowedHosts: [], enableSandboxValidation: false };\n {\n const updates: {\n sandboxRoot?: string;\n enableSandboxValidation?: boolean;\n allowedHosts?: string[];\n blockedHosts?: string[];\n blockedCidrs?: string[];\n toolOverrides?: Record<string, Record<string, unknown>>;\n packageDefaults?: Record<string, Record<string, unknown>>;\n } = {};\n if (toolConfig.sandboxedPath && typeof toolConfig.sandboxedPath === \"string\") {\n updates.sandboxRoot = resolveSandboxedPath(configPathForResolve, toolConfig.sandboxedPath);\n }\n if (typeof toolConfig.enableSandboxValidation === \"boolean\") {\n updates.enableSandboxValidation = toolConfig.enableSandboxValidation;\n } else if (coreTools.enableSandboxValidation == null) {\n updates.enableSandboxValidation = false;\n }\n // Smart merge: union of allowedHosts and blockedHosts from yaml + programmatic (both lists always applied)\n updates.allowedHosts = mergeHostLists(coreTools.allowedHosts, toolConfig.allowedHosts);\n updates.blockedHosts = mergeHostLists(coreTools.blockedHosts, toolConfig.blockedHosts);\n if (Array.isArray(toolConfig.blockedCidrs) && toolConfig.blockedCidrs.length > 0) {\n updates.blockedCidrs = toolConfig.blockedCidrs;\n } else if (coreTools.blockedCidrs?.length) {\n updates.blockedCidrs = coreTools.blockedCidrs;\n }\n let hasToolDefaults = false;\n // Priority (low → high): extension embedded (layer 2) < programmatic coreTools < layer 1+3 toolDefaults\n const flatOverrides: Record<string, Record<string, unknown>> = {\n ...extensionEmbeddedDefaults,\n ...coreTools.toolOverrides,\n };\n if (Object.keys(extensionEmbeddedDefaults).length > 0) hasToolDefaults = true;\n if (toolConfig.toolDefaults != null && Object.keys(toolConfig.toolDefaults).length > 0) {\n Object.assign(flatOverrides, toolConfig.toolDefaults);\n hasToolDefaults = true;\n }\n const packageDefaults: Record<string, Record<string, unknown>> = { ...coreTools.packageDefaults };\n if (toolConfig.packageToolDefaults != null && Object.keys(toolConfig.packageToolDefaults).length > 0) {\n for (const [descriptor, pkgConfig] of Object.entries(toolConfig.packageToolDefaults)) {\n const prefix = descriptor.startsWith(\"file:\")\n ? fileDescriptorToPackagePrefix(descriptor)\n : npmDescriptorToPackagePrefixWithVersion(descriptor);\n if (!prefix) continue;\n const pkgDefaults =\n pkgConfig?.defaults != null && typeof pkgConfig.defaults === \"object\" && !Array.isArray(pkgConfig.defaults)\n ? (pkgConfig.defaults as Record<string, unknown>)\n : {};\n if (Object.keys(pkgDefaults).length > 0) {\n packageDefaults[prefix] = pkgDefaults;\n }\n const toolConfigs = pkgConfig?.tools != null && typeof pkgConfig.tools === \"object\" && !Array.isArray(pkgConfig.tools) ? pkgConfig.tools : {};\n for (const [toolName, config] of Object.entries(toolConfigs)) {\n if (config != null && typeof config === \"object\") {\n hasToolDefaults = true;\n flatOverrides[`${prefix}::${toolName}`] = { ...pkgDefaults, ...(config as Record<string, unknown>) };\n }\n }\n }\n if (Object.keys(packageDefaults).length > 0) {\n updates.packageDefaults = packageDefaults;\n }\n }\n if (hasToolDefaults) {\n updates.toolOverrides = flatOverrides;\n }\n if (Object.keys(updates).length > 0) return { ...opts, coreTools: { ...coreTools, ...updates } };\n }\n return { ...opts, coreTools };\n}\n\n/**\n * Build a ready-to-use runtime + hub from options.\n * - No options → embedded default config/tool.yaml only.\n * - options.configFilePath → override merged on top of embedded default.\n */\nfunction buildRuntimeAndHub(options: CreateAgentToolsOptions = {}): {\n runtime: ReturnType<typeof createRuntimeFromConfigSync>[\"runtime\"];\n hub: LangChainToolsHub;\n mergedToolConfig: ToolYamlShape;\n} {\n const configPathForResolve = options.configFilePath ?? EMBEDDED_TOOL_CONFIG_PATH;\n const mergedToolConfig = loadMergedToolConfig(options.configFilePath);\n // Collect layer-2 defaults from each extension's embedded config/tool.yaml.\n // loadAllExtensionsFromToolYamlSync is cheap here (require() is cached by Node.js).\n const extensionEmbeddedDefaults = collectExtensionEmbeddedDefaults(\n loadAllExtensionsFromToolYamlSync(configPathForResolve),\n );\n const runtimeOpts = runtimeOptionsFromConfig(options, mergedToolConfig, configPathForResolve, extensionEmbeddedDefaults);\n const { runtime } = createRuntimeFromConfigSync(runtimeOpts);\n const hub = new LangChainToolsHub(runtime);\n return { runtime, hub, mergedToolConfig };\n}\n\n/**\n * Internal: create LangChain tools from config/runtime.\n *\n * - No argument → uses embedded default config/tool.yaml.\n * - options.configFilePath → merged on top of embedded default.\n * - All other CreateAgentToolsOptions (coreTools, etc.) are applied as programmatic overrides.\n *\n * @example\n * Internal helper consumed by createAgentTools().\n */\nexport function createLangChainAgentTools(\n options?: CreateAgentToolsOptions | string,\n): StructuredToolInterface[] {\n const opts: CreateAgentToolsOptions =\n typeof options === \"string\" ? { configFilePath: options } : options ?? {};\n const { runtime, hub, mergedToolConfig } = buildRuntimeAndHub(opts);\n\n const names = Array.isArray(mergedToolConfig.tools) ? mergedToolConfig.tools : [];\n if (names.length > 0) {\n const registryNames = runtime.getRegistry().snapshot().map((s) => s.name);\n const allBarePackages = names.every((n) => isBarePackageDescriptor(String(n)));\n if (allBarePackages) return hub.getLangChainTools();\n return hub.getLangChainToolsForNames(expandToolDescriptorsToRegistryNames(names, registryNames));\n }\n return hub.getLangChainTools();\n}\n\n/**\n * Internal: create an MCP server from tool config.\n *\n * - No argument → uses embedded default config/tool.yaml.\n * - options.configFilePath → merged on top of embedded default.\n * - options.mcp → passed to the MCP server (name, version, execContextFactory).\n *\n * @example\n * Internal helper consumed by createAgentTools() expose flows.\n */\nexport async function createMcpServer(\n options?: (CreateAgentToolsOptions & MCPServerOptions) | string,\n): Promise<McpServer> {\n const opts: CreateAgentToolsOptions & MCPServerOptions =\n typeof options === \"string\" ? { configFilePath: options } : options ?? {};\n const { runtime, mergedToolConfig } = buildRuntimeAndHub(opts);\n const serverOpts: MCPServerOptions = {\n name: opts.name ?? mergedToolConfig.mcp?.name,\n version: opts.version ?? mergedToolConfig.mcp?.version,\n execContextFactory: opts.execContextFactory,\n };\n const { server } = await createMCPServer(runtime, serverOpts);\n return server;\n}\n\n/**\n * Internal: create an OpenAPI / Swagger HTTP server from tool config.\n *\n * - No argument → uses embedded default config/tool.yaml.\n * - options.configFilePath → merged on top of embedded default.\n * - options.port, host, basePath → passed to the HTTP server; tool.yaml openapi: section provides defaults.\n *\n * @example\n * Internal helper consumed by createAgentTools() expose flows.\n */\nexport async function createOpenAPIServer(\n options?: (CreateAgentToolsOptions & OpenAPIHttpServerOptions) | string,\n): Promise<OpenAPIExpressApp> {\n const opts: CreateAgentToolsOptions & OpenAPIHttpServerOptions =\n typeof options === \"string\" ? { configFilePath: options } : options ?? {};\n const { runtime, mergedToolConfig } = buildRuntimeAndHub(opts);\n const serverOpts: OpenAPIHttpServerOptions = {\n host: opts.host ?? mergedToolConfig.openapi?.host,\n port: opts.port ?? mergedToolConfig.openapi?.port,\n basePath: opts.basePath ?? mergedToolConfig.openapi?.basePath,\n execContextFactory: opts.execContextFactory,\n };\n return createOpenAPIHttpServer(runtime, serverOpts);\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/api/adapters/LangChainToolsHub.ts","../src/api/createAgentTools.ts"],"names":[],"mappings":";;;;;;;;;;AAwBA,SAAS,uBAAuB,WAAA,EAAqD;AACnF,EAAA,MAAM,CAAA,GAAI,WAAA;AACV,EAAA,IAAI,CAAA,EAAG,IAAA,KAAS,QAAA,IAAY,CAAC,CAAA,CAAE,cAAc,OAAO,CAAA,CAAE,UAAA,KAAe,QAAA,EAAU,OAAO,IAAA;AACtF,EAAA,MAAM,IAAA,GAAQ,EAAE,UAAA,CAAuC,IAAA;AACvD,EAAA,IACE,IAAA,IAAQ,IAAA,IACR,OAAO,IAAA,KAAS,QAAA,IACf,KAAiC,IAAA,KAAS,QAAA,IAC1C,IAAA,CAAiC,UAAA,IAAc,IAAA,EAChD;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;AAKA,SAAS,eAAe,WAAA,EAA8B;AACpD,EAAA,OAAO,sBAAA,CAAuB,WAAW,CAAA,KAAM,IAAA;AACjD;AAMA,SAAS,mBAAmB,WAAA,EAA8C;AACxE,EAAA,MAAM,OAAA,GAAU,uBAAuB,WAAW,CAAA;AAClD,EAAA,IAAI,OAAA,KAAY,MAAM,OAAO,OAAA;AAC7B,EAAA,OAAO,WAAA;AACT;AAEA,SAAS,WAAA,CACP,QAAA,EACA,WAAA,EACA,IAAA,EACY;AACZ,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,MAAM,cAAA,CAAe,WAAW,CAAA,GAAI,EAAE,MAAK,GAAI,IAAA;AAAA,IAC/C,OAAA,EAAS;AAAA,GACX;AACF;AAEA,SAAS,cAAc,IAAA,EAAoE;AACzF,EAAA,OAAO,wBAAA,CAAyB,IAAA,IAAQ,EAAE,CAAA;AAC5C;AAEA,SAAS,oBAAoB,MAAA,EAA4B;AACvD,EAAA,IAAI,OAAO,EAAA,EAAI;AACb,IAAA,OAAO,OAAO,OAAO,MAAA,KAAW,QAAA,GAC5B,OAAO,MAAA,GACP,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,MAAM,CAAA;AAAA,EAClC;AAEA,EAAA,MAAM,MAAM,MAAA,CAAO,KAAA;AACnB,EAAA,MAAM,OAAA,GAAU,KAAK,OAAA,IAAW,aAAA;AAChC,EAAA,MAAM,UAAU,GAAA,EAAK,OAAA;AACrB,EAAA,OAAO,IAAA,CAAK,SAAA;AAAA,IACV,OAAA,IAAW,OAAO,EAAE,KAAA,EAAO,SAAS,OAAA,EAAQ,GAAI,EAAE,KAAA,EAAO,OAAA;AAAQ,GACnE;AACF;AAIA,IAAM,sBAA0C,OAAO;AAAA,EACrD,SAAA,EAAW,CAAA,GAAA,EAAM,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,EACrE,MAAA,EAAQ,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAAA,EAC1B,WAAA,EAAa;AAAA,IACX,UAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA;AAEJ,CAAA,CAAA;AAOO,IAAM,oBAAN,MAAwB;AAAA,EAC7B,WAAA,CACmB,OAAA,EACA,UAAA,GAAiC,mBAAA,EAClD;AAFiB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMH,iBAAA,GAA+C;AAC7C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAY;AAC1C,IAAA,MAAM,KAAA,GAAQ,SAAS,QAAA,EAAS;AAEhC,IAAA,OAAO,MAAM,GAAA,CAAI,CAAC,SAAS,IAAA,CAAK,mBAAA,CAAoB,IAAI,CAAC,CAAA;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA,EAKA,0BAA0B,SAAA,EAAgD;AACxE,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAY;AAC1C,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,SAAS,CAAA;AAC7B,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,QAAA,EAAS,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,GAAA,CAAI,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA;AAC/D,IAAA,OAAO,MAAM,GAAA,CAAI,CAAC,SAAS,IAAA,CAAK,mBAAA,CAAoB,IAAI,CAAC,CAAA;AAAA,EAC3D;AAAA,EAEQ,oBAAoB,IAAA,EAAuC;AACjE,IAAA,MAAM,UAAU,IAAA,CAAK,OAAA;AACrB,IAAA,MAAM,aAAa,IAAA,CAAK,UAAA;AACxB,IAAA,MAAM,QAAA,GAAW,8BAA8B,IAAI,CAAA;AAEnD,IAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,QAAA,CAAS,WAAW,CAAA;AACtD,IAAA,OAAO,IAAI,qBAAA,CAAsB;AAAA,MAC/B,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,WAAA,EAAa,IAAA,CAAK,WAAA,IAAe,CAAA,MAAA,EAAS,KAAK,IAAI,CAAA,CAAA;AAAA,MACnD,MAAA;AAAA,MACA,IAAA,EAAM,OAAO,IAAA,KAAmD;AAC9D,QAAA,MAAM,cAAA,GAAiB,cAAc,IAAI,CAAA;AACzC,QAAA,MAAM,SAAS,WAAA,CAAY,IAAA,CAAK,IAAA,EAAM,QAAA,CAAS,aAAa,cAAc,CAAA;AAC1E,QAAA,MAAM,MAAM,UAAA,EAAW;AACvB,QAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,MAAA,CAAO,QAAQ,GAAG,CAAA;AAC/C,QAAA,OAAO,oBAAoB,MAAM,CAAA;AAAA,MACnC;AAAA,KACD,CAAA;AAAA,EACH;AACF,CAAA;ACnHA,SAAS,cAAA,CAAe,GAAc,CAAA,EAAwB;AAC5D,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,KAAA,MAAW,IAAA,IAAQ,CAAC,CAAA,IAAK,IAAI,CAAA,IAAK,EAAE,CAAA,EAAG;AACrC,IAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,MAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG;AAChB,QAAA,IAAA,CAAK,IAAI,CAAC,CAAA;AACV,QAAA,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,6BAAA,GAAwC;AAC/C,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAC,CAAA;AACxD,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,OAAA,CAAQ,WAAW,wBAAwB,CAAA;AAAA;AAAA,IAC3C,OAAA,CAAQ,WAAW,qBAAqB,CAAA;AAAA;AAAA,IACxC,OAAA,CAAQ,OAAA,CAAQ,GAAA,EAAI,EAAG,kBAAkB;AAAA;AAAA,GAC3C;AACA,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG,OAAO,SAAA;AAAA,EACpC;AACA,EAAA,OAAO,WAAW,CAAC,CAAA;AACrB;AAEA,IAAM,4BAA4B,6BAAA,EAA8B;AAUhE,SAAS,iCACP,IAAA,EACyC;AACzC,EAAA,MAAM,SAAkD,EAAC;AACzD,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AAEtB,IAAA,MAAM,UAAA,GACJ,CAAC,OAAA,CAAQ,GAAA,CAAI,WAAA,EAAa,uBAAuB,CAAA,EAAG,OAAA,CAAQ,GAAA,CAAI,WAAA,EAAa,kBAAkB,CAAC,CAAA,CAAE,IAAA;AAAA,MAChG;AAAA,KACF,IAAK,EAAA;AACP,IAAA,IAAI,CAAC,UAAA,EAAY;AACjB,IAAA,IAAI;AACF,MAAA,MAAM,YAAA,GAAe,cAAA,CAAe,UAAU,CAAA,CAAE,gBAAgB,EAAC;AACjE,MAAA,IAAI,MAAA,CAAO,IAAA,CAAK,YAAY,CAAA,CAAE,WAAW,CAAA,EAAG;AAM5C,MAAA,MAAM,QAAA,GAAW,qBAAA,CAAsB,GAAA,CAAI,WAAW,CAAA;AACtD,MAAA,MAAM,YAAA,uBAAmB,GAAA,EAAY;AACrC,MAAA,KAAA,MAAW,CAAA,IAAK,SAAS,OAAA,EAAS;AAChC,QAAA,IAAI,CAAA,CAAE,IAAA,EAAM,YAAA,CAAa,GAAA,CAAI,EAAE,IAAI,CAAA;AACnC,QAAA,IAAI,EAAE,UAAA,EAAY;AAChB,UAAA,YAAA,CAAa,GAAA,CAAI,CAAA,CAAE,UAAA,CAAW,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAC,CAAA;AAAA,QACzE;AAAA,MACF;AAEA,MAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA,EAAG;AAEjD,QAAA,IAAI,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,EAAG;AACvB,UAAA,MAAA,CAAO,CAAC,CAAA,GAAI,CAAA;AAAA,QACd;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,qBAAqB,YAAA,EAAsC;AAClE,EAAA,MAAM,UAAA,GAAa,eAAe,yBAAyB,CAAA;AAC3D,EAAA,IAAI,CAAC,cAAc,OAAO,UAAA;AAC1B,EAAA,MAAM,cAAA,GAAiB,eAAe,YAAY,CAAA;AAClD,EAAA,OAAO,SAAA,CAAU,EAAC,EAAoB,UAAA,EAAY,cAAc,CAAA;AAClE;AAEA,SAAS,wBAAA,CACP,IAAA,EACA,UAAA,EACA,oBAAA,EACA,yBAAA,EACsB;AACtB,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,IAAa,EAAE,WAAA,EAAa,OAAA,CAAQ,GAAA,EAAI,EAAG,YAAA,EAAc,EAAC,EAAG,uBAAA,EAAyB,KAAA,EAAM;AACnH,EAAA;AACE,IAAA,MAAM,UAQF,EAAC;AACL,IAAA,IAAI,UAAA,CAAW,aAAA,IAAiB,OAAO,UAAA,CAAW,kBAAkB,QAAA,EAAU;AAC5E,MAAA,OAAA,CAAQ,WAAA,GAAc,oBAAA,CAAqB,oBAAA,EAAsB,UAAA,CAAW,aAAa,CAAA;AAAA,IAC3F;AACA,IAAA,IAAI,OAAO,UAAA,CAAW,uBAAA,KAA4B,SAAA,EAAW;AAC3D,MAAA,OAAA,CAAQ,0BAA0B,UAAA,CAAW,uBAAA;AAAA,IAC/C,CAAA,MAAA,IAAW,SAAA,CAAU,uBAAA,IAA2B,IAAA,EAAM;AACpD,MAAA,OAAA,CAAQ,uBAAA,GAA0B,KAAA;AAAA,IACpC;AAEA,IAAA,OAAA,CAAQ,YAAA,GAAe,cAAA,CAAe,SAAA,CAAU,YAAA,EAAc,WAAW,YAAY,CAAA;AACrF,IAAA,OAAA,CAAQ,YAAA,GAAe,cAAA,CAAe,SAAA,CAAU,YAAA,EAAc,WAAW,YAAY,CAAA;AACrF,IAAA,IAAI,KAAA,CAAM,QAAQ,UAAA,CAAW,YAAY,KAAK,UAAA,CAAW,YAAA,CAAa,SAAS,CAAA,EAAG;AAChF,MAAA,OAAA,CAAQ,eAAe,UAAA,CAAW,YAAA;AAAA,IACpC,CAAA,MAAA,IAAW,SAAA,CAAU,YAAA,EAAc,MAAA,EAAQ;AACzC,MAAA,OAAA,CAAQ,eAAe,SAAA,CAAU,YAAA;AAAA,IACnC;AACA,IAAA,IAAI,eAAA,GAAkB,KAAA;AAEtB,IAAA,MAAM,aAAA,GAAyD;AAAA,MAC7D,GAAG,yBAAA;AAAA,MACH,GAAG,SAAA,CAAU;AAAA,KACf;AACA,IAAA,IAAI,OAAO,IAAA,CAAK,yBAAyB,CAAA,CAAE,MAAA,GAAS,GAAG,eAAA,GAAkB,IAAA;AACzE,IAAA,IAAI,UAAA,CAAW,gBAAgB,IAAA,IAAQ,MAAA,CAAO,KAAK,UAAA,CAAW,YAAY,CAAA,CAAE,MAAA,GAAS,CAAA,EAAG;AACtF,MAAA,MAAA,CAAO,MAAA,CAAO,aAAA,EAAe,UAAA,CAAW,YAAY,CAAA;AACpD,MAAA,eAAA,GAAkB,IAAA;AAAA,IACpB;AACA,IAAA,MAAM,eAAA,GAA2D,EAAE,GAAG,SAAA,CAAU,eAAA,EAAgB;AAChG,IAAA,IAAI,UAAA,CAAW,uBAAuB,IAAA,IAAQ,MAAA,CAAO,KAAK,UAAA,CAAW,mBAAmB,CAAA,CAAE,MAAA,GAAS,CAAA,EAAG;AACpG,MAAA,KAAA,MAAW,CAAC,YAAY,SAAS,CAAA,IAAK,OAAO,OAAA,CAAQ,UAAA,CAAW,mBAAmB,CAAA,EAAG;AACpF,QAAA,MAAM,MAAA,GAAS,WAAW,UAAA,CAAW,OAAO,IACxC,6BAAA,CAA8B,UAAU,CAAA,GACxC,uCAAA,CAAwC,UAAU,CAAA;AACtD,QAAA,IAAI,CAAC,MAAA,EAAQ;AACb,QAAA,MAAM,cACJ,SAAA,EAAW,QAAA,IAAY,IAAA,IAAQ,OAAO,UAAU,QAAA,KAAa,QAAA,IAAY,CAAC,KAAA,CAAM,QAAQ,SAAA,CAAU,QAAQ,CAAA,GACrG,SAAA,CAAU,WACX,EAAC;AACP,QAAA,IAAI,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,CAAE,SAAS,CAAA,EAAG;AACvC,UAAA,eAAA,CAAgB,MAAM,CAAA,GAAI,WAAA;AAAA,QAC5B;AACA,QAAA,MAAM,cAAc,SAAA,EAAW,KAAA,IAAS,IAAA,IAAQ,OAAO,UAAU,KAAA,KAAU,QAAA,IAAY,CAAC,KAAA,CAAM,QAAQ,SAAA,CAAU,KAAK,CAAA,GAAI,SAAA,CAAU,QAAQ,EAAC;AAC5I,QAAA,KAAA,MAAW,CAAC,QAAA,EAAU,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC5D,UAAA,IAAI,MAAA,IAAU,IAAA,IAAQ,OAAO,MAAA,KAAW,QAAA,EAAU;AAChD,YAAA,eAAA,GAAkB,IAAA;AAClB,YAAA,aAAA,CAAc,CAAA,EAAG,MAAM,CAAA,EAAA,EAAK,QAAQ,CAAA,CAAE,IAAI,EAAE,GAAG,WAAA,EAAa,GAAI,MAAA,EAAmC;AAAA,UACrG;AAAA,QACF;AAAA,MACF;AACA,MAAA,IAAI,MAAA,CAAO,IAAA,CAAK,eAAe,CAAA,CAAE,SAAS,CAAA,EAAG;AAC3C,QAAA,OAAA,CAAQ,eAAA,GAAkB,eAAA;AAAA,MAC5B;AAAA,IACF;AACA,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,OAAA,CAAQ,aAAA,GAAgB,aAAA;AAAA,IAC1B;AACA,IAAA,IAAI,OAAO,IAAA,CAAK,OAAO,CAAA,CAAE,MAAA,GAAS,GAAG,OAAO,EAAE,GAAG,IAAA,EAAM,WAAW,EAAE,GAAG,SAAA,EAAW,GAAG,SAAQ,EAAE;AAAA,EACjG;AACA,EAAA,OAAO,EAAE,GAAG,IAAA,EAAM,SAAA,EAAU;AAC9B;AAOA,SAAS,kBAAA,CAAmB,OAAA,GAAmC,EAAC,EAI9D;AACA,EAAA,MAAM,oBAAA,GAAuB,QAAQ,cAAA,IAAkB,yBAAA;AACvD,EAAA,MAAM,gBAAA,GAAmB,oBAAA,CAAqB,OAAA,CAAQ,cAAc,CAAA;AAGpE,EAAA,MAAM,yBAAA,GAA4B,gCAAA;AAAA,IAChC,kCAAkC,oBAAoB;AAAA,GACxD;AACA,EAAA,MAAM,WAAA,GAAc,wBAAA,CAAyB,OAAA,EAAS,gBAAA,EAAkB,sBAAsB,yBAAyB,CAAA;AACvH,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,2BAAA,CAA4B,WAAW,CAAA;AAC3D,EAAA,MAAM,GAAA,GAAM,IAAI,iBAAA,CAAkB,OAAO,CAAA;AACzC,EAAA,OAAO,EAAE,OAAA,EAAS,GAAA,EAAK,gBAAA,EAAiB;AAC1C;AAYO,SAAS,0BACd,OAAA,EAC2B;AAC3B,EAAA,MAAM,IAAA,GACJ,OAAO,OAAA,KAAY,QAAA,GAAW,EAAE,cAAA,EAAgB,OAAA,EAAQ,GAAI,OAAA,IAAW,EAAC;AAC1E,EAAA,MAAM,EAAE,OAAA,EAAS,GAAA,EAAK,gBAAA,EAAiB,GAAI,mBAAmB,IAAI,CAAA;AAElE,EAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,gBAAA,CAAiB,KAAK,CAAA,GAAI,gBAAA,CAAiB,QAAQ,EAAC;AAChF,EAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,IAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,WAAA,EAAY,CAAE,QAAA,GAAW,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA;AACxE,IAAA,MAAM,eAAA,GAAkB,MAAM,KAAA,CAAM,CAAC,MAAM,uBAAA,CAAwB,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA;AAC7E,IAAA,IAAI,eAAA,EAAiB,OAAO,GAAA,CAAI,iBAAA,EAAkB;AAClD,IAAA,OAAO,GAAA,CAAI,yBAAA,CAA0B,oCAAA,CAAqC,KAAA,EAAO,aAAa,CAAC,CAAA;AAAA,EACjG;AACA,EAAA,OAAO,IAAI,iBAAA,EAAkB;AAC/B;AAYA,eAAsB,gBACpB,OAAA,EACoB;AACpB,EAAA,MAAM,IAAA,GACJ,OAAO,OAAA,KAAY,QAAA,GAAW,EAAE,cAAA,EAAgB,OAAA,EAAQ,GAAI,OAAA,IAAW,EAAC;AAC1E,EAAA,MAAM,EAAE,OAAA,EAAS,gBAAA,EAAiB,GAAI,mBAAmB,IAAI,CAAA;AAC7D,EAAA,MAAM,UAAA,GAA+B;AAAA,IACnC,IAAA,EAAM,IAAA,CAAK,IAAA,IAAQ,gBAAA,CAAiB,GAAA,EAAK,IAAA;AAAA,IACzC,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW,gBAAA,CAAiB,GAAA,EAAK,OAAA;AAAA,IAC/C,oBAAoB,IAAA,CAAK;AAAA,GAC3B;AACA,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAM,eAAA,CAAgB,SAAS,UAAU,CAAA;AAC5D,EAAA,OAAO,MAAA;AACT;AAYA,eAAsB,oBACpB,OAAA,EAC4B;AAC5B,EAAA,MAAM,IAAA,GACJ,OAAO,OAAA,KAAY,QAAA,GAAW,EAAE,cAAA,EAAgB,OAAA,EAAQ,GAAI,OAAA,IAAW,EAAC;AAC1E,EAAA,MAAM,EAAE,OAAA,EAAS,gBAAA,EAAiB,GAAI,mBAAmB,IAAI,CAAA;AAC7D,EAAA,MAAM,UAAA,GAAuC;AAAA,IAC3C,IAAA,EAAM,IAAA,CAAK,IAAA,IAAQ,gBAAA,CAAiB,OAAA,EAAS,IAAA;AAAA,IAC7C,IAAA,EAAM,IAAA,CAAK,IAAA,IAAQ,gBAAA,CAAiB,OAAA,EAAS,IAAA;AAAA,IAC7C,QAAA,EAAU,IAAA,CAAK,QAAA,IAAY,gBAAA,CAAiB,OAAA,EAAS,QAAA;AAAA,IACrD,oBAAoB,IAAA,CAAK;AAAA,GAC3B;AACA,EAAA,OAAO,uBAAA,CAAwB,SAAS,UAAU,CAAA;AACpD","file":"chunk-GYN3JAMK.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() from @easynet/agent-tool, which loads from tool.yaml and returns\n * StructuredTool[]. Use LangChainToolsHub when you need a custom runtime or ctxFactory.\n *\n * Use: new LangChainToolsHub(runtime, ctxFactory).getLangChainTools()\n */\n\nimport { DynamicStructuredTool, type StructuredToolInterface } from \"@langchain/core/tools\";\nimport { stripNullishObjectFields } from \"@easynet/agent-common\";\nimport type { PTCRuntime } from \"../../core/runtime/PTCRuntime.js\";\nimport type { ToolSpec } from \"../../core/types/ToolSpec.js\";\nimport type { ToolResult } from \"../../core/types/ToolResult.js\";\nimport type { ExecContext } from \"../../core/types/ToolIntent.js\";\nimport type { ToolIntent } from \"../../core/types/ToolIntent.js\";\nimport { enrichSpecWithCanonicalSchema } from \"../../tools/util/canonicalCoreSchemas.js\";\nimport { LANGCHAIN_KIND } from \"../../tools/langchain/types.js\";\n\n/**\n * If inputSchema wraps all params in a single \"args\" object (manifest convention),\n * returns that inner args schema; otherwise returns null.\n */\nfunction getArgsSchemaIfWrapped(inputSchema: object): Record<string, unknown> | null {\n const s = inputSchema as Record<string, unknown>;\n if (s?.type !== \"object\" || !s.properties || typeof s.properties !== \"object\") return null;\n const args = (s.properties as Record<string, unknown>).args;\n if (\n args != null &&\n typeof args === \"object\" &&\n (args as Record<string, unknown>).type === \"object\" &&\n (args as Record<string, unknown>).properties != null\n ) {\n return args as Record<string, unknown>;\n }\n return null;\n}\n\n/**\n * True when inputSchema wraps all params in a single \"args\" object (manifest convention).\n */\nfunction hasArgsWrapper(inputSchema: object): boolean {\n return getArgsSchemaIfWrapped(inputSchema) !== null;\n}\n\n/**\n * If inputSchema is { type: \"object\", properties: { args: { type: \"object\", properties: {...} } } },\n * return the inner args schema so the LLM can pass { path: \".\" } instead of { args: { path: \".\" } }.\n */\nfunction schemaForLangChain(inputSchema: object): Record<string, unknown> {\n const wrapped = getArgsSchemaIfWrapped(inputSchema);\n if (wrapped !== null) return wrapped;\n return inputSchema as Record<string, unknown>;\n}\n\nfunction buildIntent(\n toolName: string,\n inputSchema: object,\n args: Record<string, unknown>,\n): ToolIntent {\n return {\n tool: toolName,\n args: hasArgsWrapper(inputSchema) ? { args } : args,\n purpose: LANGCHAIN_KIND,\n };\n}\n\nfunction normalizeArgs(args: Record<string, unknown> | undefined): Record<string, unknown> {\n return stripNullishObjectFields(args ?? {}) as Record<string, unknown>;\n}\n\nfunction serializeToolResult(result: ToolResult): string {\n if (result.ok) {\n return typeof result.result === \"string\"\n ? result.result\n : JSON.stringify(result.result);\n }\n\n const err = result.error;\n const message = err?.message ?? \"Tool failed\";\n const details = err?.details;\n return JSON.stringify(\n details != null ? { error: message, details } : { error: message },\n );\n}\n\nexport type ExecContextFactory = () => ExecContext;\n\nconst DEFAULT_CTX_FACTORY: ExecContextFactory = () => ({\n requestId: `lc-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n taskId: `task-${Date.now()}`,\n permissions: [\n \"read:web\",\n \"read:fs\",\n \"write:fs\",\n \"read:db\",\n \"write:db\",\n \"network\",\n \"workflow\",\n \"danger:destructive\",\n ],\n});\n\n/**\n * Hub that wraps PTCRuntime and exposes every registered tool as a LangChain\n * StructuredTool (DynamicStructuredTool), so local agents (LangChain AgentExecutor,\n * createReactAgent, etc.) can use the same tools as MCP and OpenAPI.\n */\nexport class LangChainToolsHub {\n constructor(\n private readonly runtime: PTCRuntime,\n private readonly ctxFactory: ExecContextFactory = DEFAULT_CTX_FACTORY,\n ) {}\n\n /**\n * Returns all registered tools as LangChain StructuredTool[].\n * Each tool invokes the runtime through the full pipeline (policy, HITL, etc.).\n */\n getLangChainTools(): StructuredToolInterface[] {\n const registry = this.runtime.getRegistry();\n const specs = registry.snapshot();\n\n return specs.map((spec) => this.specToLangChainTool(spec));\n }\n\n /**\n * Returns LangChain tools for a subset of tools (by name or query).\n */\n getLangChainToolsForNames(toolNames: string[]): StructuredToolInterface[] {\n const registry = this.runtime.getRegistry();\n const set = new Set(toolNames);\n const specs = registry.snapshot().filter((s) => set.has(s.name));\n return specs.map((spec) => this.specToLangChainTool(spec));\n }\n\n private specToLangChainTool(spec: ToolSpec): DynamicStructuredTool {\n const runtime = this.runtime;\n const ctxFactory = this.ctxFactory;\n const enriched = enrichSpecWithCanonicalSchema(spec);\n\n const schema = schemaForLangChain(enriched.inputSchema);\n return new DynamicStructuredTool({\n name: spec.name,\n description: spec.description ?? `Tool: ${spec.name}`,\n schema,\n func: async (args: Record<string, unknown>): Promise<string> => {\n const normalizedArgs = normalizeArgs(args);\n const intent = buildIntent(spec.name, enriched.inputSchema, normalizedArgs);\n const ctx = ctxFactory();\n const result = await runtime.invoke(intent, ctx);\n return serializeToolResult(result);\n },\n });\n }\n}\n","/**\n * Standalone tool creation functions. Each function:\n * - Uses the embedded config/tool.yaml as the default base.\n * - If a configFilePath is provided, merges it on top of the default.\n * - If no options are provided at all, behaves as if only the embedded default is used.\n *\n * Public module API uses createAgentTools() in register-tools.ts.\n * This file keeps internal builders for LangChain / MCP / OpenAPI outputs.\n */\n\nimport { loadToolConfig, resolveSandboxedPath } from \"../tools/util/toolConfig.js\";\nimport type { ToolYamlShape } from \"../tools/util/toolConfig.js\";\nimport { loadExtensionManifest } from \"./extension/registerFromManifest.js\";\nimport {\n expandToolDescriptorsToRegistryNames,\n isBarePackageDescriptor,\n npmDescriptorToPackagePrefixWithVersion,\n fileDescriptorToPackagePrefix,\n} from \"../tools/util/toolDescriptor.js\";\nimport { deepMerge } from \"@easynet/agent-common\";\nimport { createRuntimeFromConfigSync, loadAllExtensionsFromToolYamlSync } from \"./runtimeFromConfig.js\";\nimport type { CreateRuntimeOptions, LoadedExtension } from \"./runtimeFromConfig.js\";\nimport { LangChainToolsHub } from \"./adapters/LangChainToolsHub.js\";\nimport { createMCPServer, type MCPServerOptions, type McpServer } from \"./expose/mcpServer.js\";\nimport {\n createOpenAPIHttpServer,\n type OpenAPIExpressApp,\n type OpenAPIHttpServerOptions,\n} from \"./expose/openapiHttp.js\";\nimport type { StructuredToolInterface } from \"@langchain/core/tools\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, resolve } from \"node:path\";\nimport { existsSync } from \"node:fs\";\n\nexport interface CreateAgentToolsOptions extends CreateRuntimeOptions {\n /** Path to an override tool.yaml; its values are merged on top of the embedded default config/tool.yaml */\n configFilePath?: string;\n}\n\n/** Merge host lists from multiple sources (e.g. tool.yaml + programmatic). Union, dedup, preserves order. */\nfunction mergeHostLists(a?: string[], b?: string[]): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const list of [a ?? [], b ?? []]) {\n for (const h of list) {\n if (!seen.has(h)) {\n seen.add(h);\n out.push(h);\n }\n }\n }\n return out;\n}\n\nfunction resolveEmbeddedToolConfigPath(): string {\n const moduleDir = dirname(fileURLToPath(import.meta.url));\n const candidates = [\n resolve(moduleDir, \"../../config/tool.yaml\"), // src/api -> config\n resolve(moduleDir, \"../config/tool.yaml\"), // dist/* -> config\n resolve(process.cwd(), \"config/tool.yaml\"), // fallback for local app runtime\n ];\n for (const candidate of candidates) {\n if (existsSync(candidate)) return candidate;\n }\n return candidates[0]!;\n}\n\nconst EMBEDDED_TOOL_CONFIG_PATH = resolveEmbeddedToolConfigPath();\n\n/**\n * For each loaded extension, load its embedded config/tool.yaml (layer 2) and collect\n * the toolDefaults into a flat map. Later entries in the list win over earlier ones.\n *\n * Security constraint: each extension's embedded config may only set defaults for tools\n * that belong to that extension (verified against its own manifest). Keys that reference\n * tools from other extensions or global config fields are silently ignored.\n */\nfunction collectExtensionEmbeddedDefaults(\n exts: LoadedExtension[],\n): Record<string, Record<string, unknown>> {\n const merged: Record<string, Record<string, unknown>> = {};\n for (const ext of exts) {\n // Prefer dist/config/tool.yaml (published package); fall back to config/tool.yaml (local dev).\n const configPath =\n [resolve(ext.packageRoot, \"dist/config/tool.yaml\"), resolve(ext.packageRoot, \"config/tool.yaml\")].find(\n existsSync,\n ) ?? \"\";\n if (!configPath) continue;\n try {\n const toolDefaults = loadToolConfig(configPath).toolDefaults ?? {};\n if (Object.keys(toolDefaults).length === 0) continue;\n\n // Build the set of short names this extension owns from its manifest.\n // Include both the explicit name field and the dot-path derived from sourcePath\n // (e.g. \"listDir\" and \"fs.listDir\" for src/fs/listDir) so that config keys in\n // either format are accepted.\n const manifest = loadExtensionManifest(ext.packageRoot);\n const ownToolNames = new Set<string>();\n for (const e of manifest.entries) {\n if (e.name) ownToolNames.add(e.name);\n if (e.sourcePath) {\n ownToolNames.add(e.sourcePath.replace(/^src\\//, \"\").replace(/\\//g, \".\"));\n }\n }\n\n for (const [k, v] of Object.entries(toolDefaults)) {\n // Only allow keys that are short names of tools this extension registers.\n if (ownToolNames.has(k)) {\n merged[k] = v;\n }\n }\n } catch {\n // skip malformed extension config or missing manifest\n }\n }\n return merged;\n}\n\nfunction loadMergedToolConfig(overridePath?: string): ToolYamlShape {\n const baseConfig = loadToolConfig(EMBEDDED_TOOL_CONFIG_PATH);\n if (!overridePath) return baseConfig;\n const overrideConfig = loadToolConfig(overridePath);\n return deepMerge({} as ToolYamlShape, baseConfig, overrideConfig);\n}\n\nfunction runtimeOptionsFromConfig(\n opts: CreateAgentToolsOptions,\n toolConfig: ToolYamlShape,\n configPathForResolve: string,\n extensionEmbeddedDefaults: Record<string, Record<string, unknown>>,\n): CreateRuntimeOptions {\n const coreTools = opts.coreTools ?? { sandboxRoot: process.cwd(), allowedHosts: [], enableSandboxValidation: false };\n {\n const updates: {\n sandboxRoot?: string;\n enableSandboxValidation?: boolean;\n allowedHosts?: string[];\n blockedHosts?: string[];\n blockedCidrs?: string[];\n toolOverrides?: Record<string, Record<string, unknown>>;\n packageDefaults?: Record<string, Record<string, unknown>>;\n } = {};\n if (toolConfig.sandboxedPath && typeof toolConfig.sandboxedPath === \"string\") {\n updates.sandboxRoot = resolveSandboxedPath(configPathForResolve, toolConfig.sandboxedPath);\n }\n if (typeof toolConfig.enableSandboxValidation === \"boolean\") {\n updates.enableSandboxValidation = toolConfig.enableSandboxValidation;\n } else if (coreTools.enableSandboxValidation == null) {\n updates.enableSandboxValidation = false;\n }\n // Smart merge: union of allowedHosts and blockedHosts from yaml + programmatic (both lists always applied)\n updates.allowedHosts = mergeHostLists(coreTools.allowedHosts, toolConfig.allowedHosts);\n updates.blockedHosts = mergeHostLists(coreTools.blockedHosts, toolConfig.blockedHosts);\n if (Array.isArray(toolConfig.blockedCidrs) && toolConfig.blockedCidrs.length > 0) {\n updates.blockedCidrs = toolConfig.blockedCidrs;\n } else if (coreTools.blockedCidrs?.length) {\n updates.blockedCidrs = coreTools.blockedCidrs;\n }\n let hasToolDefaults = false;\n // Priority (low → high): extension embedded (layer 2) < programmatic coreTools < layer 1+3 toolDefaults\n const flatOverrides: Record<string, Record<string, unknown>> = {\n ...extensionEmbeddedDefaults,\n ...coreTools.toolOverrides,\n };\n if (Object.keys(extensionEmbeddedDefaults).length > 0) hasToolDefaults = true;\n if (toolConfig.toolDefaults != null && Object.keys(toolConfig.toolDefaults).length > 0) {\n Object.assign(flatOverrides, toolConfig.toolDefaults);\n hasToolDefaults = true;\n }\n const packageDefaults: Record<string, Record<string, unknown>> = { ...coreTools.packageDefaults };\n if (toolConfig.packageToolDefaults != null && Object.keys(toolConfig.packageToolDefaults).length > 0) {\n for (const [descriptor, pkgConfig] of Object.entries(toolConfig.packageToolDefaults)) {\n const prefix = descriptor.startsWith(\"file:\")\n ? fileDescriptorToPackagePrefix(descriptor)\n : npmDescriptorToPackagePrefixWithVersion(descriptor);\n if (!prefix) continue;\n const pkgDefaults =\n pkgConfig?.defaults != null && typeof pkgConfig.defaults === \"object\" && !Array.isArray(pkgConfig.defaults)\n ? (pkgConfig.defaults as Record<string, unknown>)\n : {};\n if (Object.keys(pkgDefaults).length > 0) {\n packageDefaults[prefix] = pkgDefaults;\n }\n const toolConfigs = pkgConfig?.tools != null && typeof pkgConfig.tools === \"object\" && !Array.isArray(pkgConfig.tools) ? pkgConfig.tools : {};\n for (const [toolName, config] of Object.entries(toolConfigs)) {\n if (config != null && typeof config === \"object\") {\n hasToolDefaults = true;\n flatOverrides[`${prefix}::${toolName}`] = { ...pkgDefaults, ...(config as Record<string, unknown>) };\n }\n }\n }\n if (Object.keys(packageDefaults).length > 0) {\n updates.packageDefaults = packageDefaults;\n }\n }\n if (hasToolDefaults) {\n updates.toolOverrides = flatOverrides;\n }\n if (Object.keys(updates).length > 0) return { ...opts, coreTools: { ...coreTools, ...updates } };\n }\n return { ...opts, coreTools };\n}\n\n/**\n * Build a ready-to-use runtime + hub from options.\n * - No options → embedded default config/tool.yaml only.\n * - options.configFilePath → override merged on top of embedded default.\n */\nfunction buildRuntimeAndHub(options: CreateAgentToolsOptions = {}): {\n runtime: ReturnType<typeof createRuntimeFromConfigSync>[\"runtime\"];\n hub: LangChainToolsHub;\n mergedToolConfig: ToolYamlShape;\n} {\n const configPathForResolve = options.configFilePath ?? EMBEDDED_TOOL_CONFIG_PATH;\n const mergedToolConfig = loadMergedToolConfig(options.configFilePath);\n // Collect layer-2 defaults from each extension's embedded config/tool.yaml.\n // loadAllExtensionsFromToolYamlSync is cheap here (require() is cached by Node.js).\n const extensionEmbeddedDefaults = collectExtensionEmbeddedDefaults(\n loadAllExtensionsFromToolYamlSync(configPathForResolve),\n );\n const runtimeOpts = runtimeOptionsFromConfig(options, mergedToolConfig, configPathForResolve, extensionEmbeddedDefaults);\n const { runtime } = createRuntimeFromConfigSync(runtimeOpts);\n const hub = new LangChainToolsHub(runtime);\n return { runtime, hub, mergedToolConfig };\n}\n\n/**\n * Internal: create LangChain tools from config/runtime.\n *\n * - No argument → uses embedded default config/tool.yaml.\n * - options.configFilePath → merged on top of embedded default.\n * - All other CreateAgentToolsOptions (coreTools, etc.) are applied as programmatic overrides.\n *\n * @example\n * Internal helper consumed by createAgentTools().\n */\nexport function createLangChainAgentTools(\n options?: CreateAgentToolsOptions | string,\n): StructuredToolInterface[] {\n const opts: CreateAgentToolsOptions =\n typeof options === \"string\" ? { configFilePath: options } : options ?? {};\n const { runtime, hub, mergedToolConfig } = buildRuntimeAndHub(opts);\n\n const names = Array.isArray(mergedToolConfig.tools) ? mergedToolConfig.tools : [];\n if (names.length > 0) {\n const registryNames = runtime.getRegistry().snapshot().map((s) => s.name);\n const allBarePackages = names.every((n) => isBarePackageDescriptor(String(n)));\n if (allBarePackages) return hub.getLangChainTools();\n return hub.getLangChainToolsForNames(expandToolDescriptorsToRegistryNames(names, registryNames));\n }\n return hub.getLangChainTools();\n}\n\n/**\n * Internal: create an MCP server from tool config.\n *\n * - No argument → uses embedded default config/tool.yaml.\n * - options.configFilePath → merged on top of embedded default.\n * - options.mcp → passed to the MCP server (name, version, execContextFactory).\n *\n * @example\n * Internal helper consumed by createAgentTools() expose flows.\n */\nexport async function createMcpServer(\n options?: (CreateAgentToolsOptions & MCPServerOptions) | string,\n): Promise<McpServer> {\n const opts: CreateAgentToolsOptions & MCPServerOptions =\n typeof options === \"string\" ? { configFilePath: options } : options ?? {};\n const { runtime, mergedToolConfig } = buildRuntimeAndHub(opts);\n const serverOpts: MCPServerOptions = {\n name: opts.name ?? mergedToolConfig.mcp?.name,\n version: opts.version ?? mergedToolConfig.mcp?.version,\n execContextFactory: opts.execContextFactory,\n };\n const { server } = await createMCPServer(runtime, serverOpts);\n return server;\n}\n\n/**\n * Internal: create an OpenAPI / Swagger HTTP server from tool config.\n *\n * - No argument → uses embedded default config/tool.yaml.\n * - options.configFilePath → merged on top of embedded default.\n * - options.port, host, basePath → passed to the HTTP server; tool.yaml openapi: section provides defaults.\n *\n * @example\n * Internal helper consumed by createAgentTools() expose flows.\n */\nexport async function createOpenAPIServer(\n options?: (CreateAgentToolsOptions & OpenAPIHttpServerOptions) | string,\n): Promise<OpenAPIExpressApp> {\n const opts: CreateAgentToolsOptions & OpenAPIHttpServerOptions =\n typeof options === \"string\" ? { configFilePath: options } : options ?? {};\n const { runtime, mergedToolConfig } = buildRuntimeAndHub(opts);\n const serverOpts: OpenAPIHttpServerOptions = {\n host: opts.host ?? mergedToolConfig.openapi?.host,\n port: opts.port ?? mergedToolConfig.openapi?.port,\n basePath: opts.basePath ?? mergedToolConfig.openapi?.basePath,\n execContextFactory: opts.execContextFactory,\n };\n return createOpenAPIHttpServer(runtime, serverOpts);\n}\n"]}