@easynet/agent-tool 1.0.48 → 1.0.50

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 (42) hide show
  1. package/dist/api/extension/dynamicImportAdapter.d.ts.map +1 -1
  2. package/dist/api/extension/registerFromManifest.d.ts.map +1 -1
  3. package/dist/api/main.cjs +15 -15
  4. package/dist/api/main.js +4 -4
  5. package/dist/api/runtimeFromConfig.d.ts.map +1 -1
  6. package/dist/{chunk-A5B6Q6EG.cjs → chunk-3GK6IK3N.cjs} +72 -38
  7. package/dist/chunk-3GK6IK3N.cjs.map +1 -0
  8. package/dist/{chunk-IAEVDXWS.cjs → chunk-E3JK57SR.cjs} +15 -15
  9. package/dist/{chunk-IAEVDXWS.cjs.map → chunk-E3JK57SR.cjs.map} +1 -1
  10. package/dist/{chunk-ZRHPGW7W.js → chunk-FCYBA7PR.js} +3 -3
  11. package/dist/{chunk-ZRHPGW7W.js.map → chunk-FCYBA7PR.js.map} +1 -1
  12. package/dist/{chunk-KYBIKD5R.js → chunk-H4RZJVNS.js} +3 -3
  13. package/dist/{chunk-KYBIKD5R.js.map → chunk-H4RZJVNS.js.map} +1 -1
  14. package/dist/{chunk-64ZQQV5C.js → chunk-NYUSA2YV.js} +4 -4
  15. package/dist/{chunk-64ZQQV5C.js.map → chunk-NYUSA2YV.js.map} +1 -1
  16. package/dist/{chunk-KDB3MY2H.js → chunk-ODEHUAR4.js} +2 -2
  17. package/dist/chunk-ODEHUAR4.js.map +1 -0
  18. package/dist/{chunk-DYDNPIV2.cjs → chunk-QEJF3KDV.cjs} +2 -2
  19. package/dist/chunk-QEJF3KDV.cjs.map +1 -0
  20. package/dist/{chunk-MDPU7EIO.cjs → chunk-QEZLUBAL.cjs} +11 -11
  21. package/dist/{chunk-MDPU7EIO.cjs.map → chunk-QEZLUBAL.cjs.map} +1 -1
  22. package/dist/{chunk-TOSPHMYU.cjs → chunk-WQMHMPNC.cjs} +7 -7
  23. package/dist/{chunk-TOSPHMYU.cjs.map → chunk-WQMHMPNC.cjs.map} +1 -1
  24. package/dist/{chunk-2ZPDD7ZO.js → chunk-ZWYRMANX.js} +48 -14
  25. package/dist/chunk-ZWYRMANX.js.map +1 -0
  26. package/dist/core/index.cjs +4 -4
  27. package/dist/core/index.js +1 -1
  28. package/dist/core/runtime.cjs +6 -6
  29. package/dist/core/runtime.js +2 -2
  30. package/dist/core/types/ToolSpec.d.ts +2 -0
  31. package/dist/core/types/ToolSpec.d.ts.map +1 -1
  32. package/dist/index.cjs +42 -40
  33. package/dist/index.cjs.map +1 -1
  34. package/dist/index.js +11 -9
  35. package/dist/index.js.map +1 -1
  36. package/dist/utils/cli/index.cjs +18 -18
  37. package/dist/utils/cli/index.js +4 -4
  38. package/package.json +1 -1
  39. package/dist/chunk-2ZPDD7ZO.js.map +0 -1
  40. package/dist/chunk-A5B6Q6EG.cjs.map +0 -1
  41. package/dist/chunk-DYDNPIV2.cjs.map +0 -1
  42. package/dist/chunk-KDB3MY2H.js.map +0 -1
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkDYDNPIV2_cjs = require('./chunk-DYDNPIV2.cjs');
3
+ var chunkQEJF3KDV_cjs = require('./chunk-QEJF3KDV.cjs');
4
4
  var pRetry = require('p-retry');
5
5
 
6
6
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
@@ -20,7 +20,7 @@ var ToolRegistry = class {
20
20
  */
21
21
  register(spec) {
22
22
  this.validateSpec(spec);
23
- const name = chunkDYDNPIV2_cjs.normalizeToolName(spec.name);
23
+ const name = chunkQEJF3KDV_cjs.normalizeToolName(spec.name);
24
24
  const normalized = { ...spec, name };
25
25
  this.tools.set(name, normalized);
26
26
  this.indexTool(normalized);
@@ -37,7 +37,7 @@ var ToolRegistry = class {
37
37
  * Unregister a tool by name.
38
38
  */
39
39
  unregister(name) {
40
- const key = chunkDYDNPIV2_cjs.normalizeToolName(name);
40
+ const key = chunkQEJF3KDV_cjs.normalizeToolName(name);
41
41
  const spec = this.tools.get(key);
42
42
  if (!spec) return false;
43
43
  this.tools.delete(key);
@@ -48,13 +48,13 @@ var ToolRegistry = class {
48
48
  * Get a tool spec by name (name is normalized before lookup).
49
49
  */
50
50
  get(name) {
51
- return this.tools.get(chunkDYDNPIV2_cjs.normalizeToolName(name));
51
+ return this.tools.get(chunkQEJF3KDV_cjs.normalizeToolName(name));
52
52
  }
53
53
  /**
54
54
  * Check if a tool exists (name is normalized before lookup).
55
55
  */
56
56
  has(name) {
57
- return this.tools.has(chunkDYDNPIV2_cjs.normalizeToolName(name));
57
+ return this.tools.has(chunkQEJF3KDV_cjs.normalizeToolName(name));
58
58
  }
59
59
  /**
60
60
  * Search tools by query.
@@ -210,5 +210,5 @@ exports.ToolRegistry = ToolRegistry;
210
210
  exports.createTaggedError = createTaggedError;
211
211
  exports.isRetryable = isRetryable;
212
212
  exports.withRetry = withRetry;
213
- //# sourceMappingURL=chunk-TOSPHMYU.cjs.map
214
- //# sourceMappingURL=chunk-TOSPHMYU.cjs.map
213
+ //# sourceMappingURL=chunk-WQMHMPNC.cjs.map
214
+ //# sourceMappingURL=chunk-WQMHMPNC.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/registry/ToolRegistry.ts","../src/core/runtime/Retry.ts"],"names":["normalizeToolName","pRetry"],"mappings":"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","file":"chunk-TOSPHMYU.cjs","sourcesContent":["import type { Capability, ToolKind, ToolSpec } from \"../types/ToolSpec.js\";\nimport { normalizeToolName } from \"../types/ToolSpec.js\";\n\n/**\n * Search query for tools.\n */\nexport interface ToolSearchQuery {\n /** Text search in name/description/tags */\n text?: string;\n /** Filter by tool kind */\n kind?: ToolKind;\n /** Filter by required capabilities */\n capabilities?: Capability[];\n /** Filter by tags */\n tags?: string[];\n}\n\n/**\n * Tool Registry: manages tool registration, lookup, and search.\n * Supports both static registration and dynamic discovery via adapters.\n */\nexport class ToolRegistry {\n private readonly tools = new Map<string, ToolSpec>();\n private readonly tagIndex = new Map<string, Set<string>>(); // tag → tool names\n private readonly kindIndex = new Map<ToolKind, Set<string>>(); // kind → tool names\n\n /**\n * Register a single tool spec.\n * Overwrites if same name already exists.\n */\n register(spec: ToolSpec): void {\n this.validateSpec(spec);\n const name = normalizeToolName(spec.name);\n const normalized = { ...spec, name };\n this.tools.set(name, normalized);\n this.indexTool(normalized);\n }\n\n /**\n * Register multiple tool specs at once.\n */\n bulkRegister(specs: ToolSpec[]): void {\n for (const spec of specs) {\n this.register(spec);\n }\n }\n\n /**\n * Unregister a tool by name.\n */\n unregister(name: string): boolean {\n const key = normalizeToolName(name);\n const spec = this.tools.get(key);\n if (!spec) return false;\n this.tools.delete(key);\n this.deindexTool(spec);\n return true;\n }\n\n /**\n * Get a tool spec by name (name is normalized before lookup).\n */\n get(name: string): ToolSpec | undefined {\n return this.tools.get(normalizeToolName(name));\n }\n\n /**\n * Check if a tool exists (name is normalized before lookup).\n */\n has(name: string): boolean {\n return this.tools.has(normalizeToolName(name));\n }\n\n /**\n * Search tools by query.\n */\n search(query: ToolSearchQuery): ToolSpec[] {\n let candidates: ToolSpec[];\n\n // Start with kind filter if specified (uses index)\n if (query.kind) {\n const names = this.kindIndex.get(query.kind);\n if (!names || names.size === 0) return [];\n candidates = [...names]\n .map((n) => this.tools.get(n))\n .filter((s): s is ToolSpec => s !== undefined);\n } else {\n candidates = [...this.tools.values()];\n }\n\n // Filter by tags (uses index for initial candidates if no kind filter)\n if (query.tags && query.tags.length > 0) {\n candidates = candidates.filter((spec) =>\n query.tags!.some((tag) => spec.tags?.includes(tag)),\n );\n }\n\n // Filter by capabilities\n if (query.capabilities && query.capabilities.length > 0) {\n candidates = candidates.filter((spec) =>\n query.capabilities!.every((cap) => spec.capabilities.includes(cap)),\n );\n }\n\n // Filter by text (name, description, tags)\n if (query.text) {\n const lower = query.text.toLowerCase();\n candidates = candidates.filter(\n (spec) =>\n spec.name.toLowerCase().includes(lower) ||\n spec.description?.toLowerCase().includes(lower) ||\n spec.tags?.some((t) => t.toLowerCase().includes(lower)),\n );\n }\n\n return candidates;\n }\n\n /**\n * List all registered tool names.\n */\n list(): string[] {\n return [...this.tools.keys()];\n }\n\n /**\n * Get count of registered tools.\n */\n get size(): number {\n return this.tools.size;\n }\n\n /**\n * Export a snapshot of all registered tools (for debugging/routing).\n */\n snapshot(): ToolSpec[] {\n return [...this.tools.values()];\n }\n\n /**\n * Clear all registered tools.\n */\n clear(): void {\n this.tools.clear();\n this.tagIndex.clear();\n this.kindIndex.clear();\n }\n\n private validateSpec(spec: ToolSpec): void {\n if (!spec.name) throw new Error(\"ToolSpec.name is required\");\n if (!spec.version) throw new Error(\"ToolSpec.version is required\");\n if (!spec.kind) throw new Error(\"ToolSpec.kind is required\");\n if (!spec.inputSchema) throw new Error(\"ToolSpec.inputSchema is required\");\n if (!spec.outputSchema) throw new Error(\"ToolSpec.outputSchema is required\");\n if (!spec.capabilities) throw new Error(\"ToolSpec.capabilities is required\");\n }\n\n private indexTool(spec: ToolSpec): void {\n // Kind index\n let kindSet = this.kindIndex.get(spec.kind);\n if (!kindSet) {\n kindSet = new Set();\n this.kindIndex.set(spec.kind, kindSet);\n }\n kindSet.add(spec.name);\n\n // Tag index\n if (spec.tags) {\n for (const tag of spec.tags) {\n let tagSet = this.tagIndex.get(tag);\n if (!tagSet) {\n tagSet = new Set();\n this.tagIndex.set(tag, tagSet);\n }\n tagSet.add(spec.name);\n }\n }\n }\n\n private deindexTool(spec: ToolSpec): void {\n this.kindIndex.get(spec.kind)?.delete(spec.name);\n if (spec.tags) {\n for (const tag of spec.tags) {\n this.tagIndex.get(tag)?.delete(spec.name);\n }\n }\n }\n}\n","import pRetry, { type Options as PRetryOptions } from \"p-retry\";\n\n/**\n * Retry configuration.\n */\nexport interface RetryOptions {\n /** Maximum number of retries (default: 2) */\n maxRetries?: number;\n /** Base delay in ms for exponential backoff (default: 1000) */\n baseDelayMs?: number;\n /** Maximum delay in ms (default: 10000) */\n maxDelayMs?: number;\n /** Jitter factor 0-1 (default: 0.1) */\n jitter?: number;\n /** Error filter: return true to retry, false to abort */\n shouldRetry?: (error: Error) => boolean;\n /** Callback on each retry attempt */\n onRetry?: (error: Error, attempt: number) => void;\n}\n\n/**\n * Default errors that should NOT be retried (deterministic failures).\n */\nconst NON_RETRYABLE_ERRORS = new Set([\n \"TOOL_NOT_FOUND\",\n \"INPUT_SCHEMA_INVALID\",\n \"POLICY_DENIED\",\n \"HITL_DENIED\",\n \"OUTPUT_SCHEMA_INVALID\",\n \"PATH_OUTSIDE_SANDBOX\",\n \"FILE_TOO_LARGE\",\n \"HTTP_DISALLOWED_HOST\",\n \"HTTP_TOO_LARGE\",\n \"EXEC_INVALID\",\n \"EXEC_SPAWN_ERROR\",\n \"DUCKDUCKGO_INVALID\",\n]);\n\n/**\n * Determine if an error is retryable.\n */\nexport function isRetryable(error: unknown): boolean {\n if (error instanceof Error) {\n const kind = (error as Error & { kind?: string }).kind;\n if (kind && NON_RETRYABLE_ERRORS.has(kind)) return false;\n }\n return true;\n}\n\n/**\n * Execute a function with retry logic using exponential backoff.\n */\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n options: RetryOptions = {},\n): Promise<T> {\n const {\n maxRetries = 2,\n baseDelayMs = 1000,\n maxDelayMs = 10_000,\n jitter = 0.1,\n shouldRetry,\n onRetry,\n } = options;\n\n if (maxRetries <= 0) {\n return fn();\n }\n\n const pRetryOptions: PRetryOptions = {\n retries: maxRetries,\n minTimeout: baseDelayMs,\n maxTimeout: maxDelayMs,\n randomize: true,\n factor: 2,\n onFailedAttempt: (error) => {\n // Apply jitter\n if (jitter > 0 && error.retriesLeft > 0) {\n // jitterMs calculated but p-retry handles backoff internally\n void (Math.random() * jitter * baseDelayMs);\n }\n\n // Check if should retry\n if (shouldRetry && !shouldRetry(error)) {\n throw error; // Abort retry\n }\n\n if (!isRetryable(error)) {\n throw error; // Non-retryable error kind\n }\n\n onRetry?.(error, maxRetries - error.retriesLeft);\n },\n };\n\n return pRetry(fn, pRetryOptions);\n}\n\n/**\n * Create a tagged error with a kind field for retry classification.\n */\nexport function createTaggedError(\n kind: string,\n message: string,\n details?: unknown,\n): Error & { kind: string; details?: unknown } {\n const error = new Error(message) as Error & {\n kind: string;\n details?: unknown;\n };\n error.kind = kind;\n error.details = details;\n return error;\n}\n"]}
1
+ {"version":3,"sources":["../src/core/registry/ToolRegistry.ts","../src/core/runtime/Retry.ts"],"names":["normalizeToolName","pRetry"],"mappings":"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","file":"chunk-WQMHMPNC.cjs","sourcesContent":["import type { Capability, ToolKind, ToolSpec } from \"../types/ToolSpec.js\";\nimport { normalizeToolName } from \"../types/ToolSpec.js\";\n\n/**\n * Search query for tools.\n */\nexport interface ToolSearchQuery {\n /** Text search in name/description/tags */\n text?: string;\n /** Filter by tool kind */\n kind?: ToolKind;\n /** Filter by required capabilities */\n capabilities?: Capability[];\n /** Filter by tags */\n tags?: string[];\n}\n\n/**\n * Tool Registry: manages tool registration, lookup, and search.\n * Supports both static registration and dynamic discovery via adapters.\n */\nexport class ToolRegistry {\n private readonly tools = new Map<string, ToolSpec>();\n private readonly tagIndex = new Map<string, Set<string>>(); // tag → tool names\n private readonly kindIndex = new Map<ToolKind, Set<string>>(); // kind → tool names\n\n /**\n * Register a single tool spec.\n * Overwrites if same name already exists.\n */\n register(spec: ToolSpec): void {\n this.validateSpec(spec);\n const name = normalizeToolName(spec.name);\n const normalized = { ...spec, name };\n this.tools.set(name, normalized);\n this.indexTool(normalized);\n }\n\n /**\n * Register multiple tool specs at once.\n */\n bulkRegister(specs: ToolSpec[]): void {\n for (const spec of specs) {\n this.register(spec);\n }\n }\n\n /**\n * Unregister a tool by name.\n */\n unregister(name: string): boolean {\n const key = normalizeToolName(name);\n const spec = this.tools.get(key);\n if (!spec) return false;\n this.tools.delete(key);\n this.deindexTool(spec);\n return true;\n }\n\n /**\n * Get a tool spec by name (name is normalized before lookup).\n */\n get(name: string): ToolSpec | undefined {\n return this.tools.get(normalizeToolName(name));\n }\n\n /**\n * Check if a tool exists (name is normalized before lookup).\n */\n has(name: string): boolean {\n return this.tools.has(normalizeToolName(name));\n }\n\n /**\n * Search tools by query.\n */\n search(query: ToolSearchQuery): ToolSpec[] {\n let candidates: ToolSpec[];\n\n // Start with kind filter if specified (uses index)\n if (query.kind) {\n const names = this.kindIndex.get(query.kind);\n if (!names || names.size === 0) return [];\n candidates = [...names]\n .map((n) => this.tools.get(n))\n .filter((s): s is ToolSpec => s !== undefined);\n } else {\n candidates = [...this.tools.values()];\n }\n\n // Filter by tags (uses index for initial candidates if no kind filter)\n if (query.tags && query.tags.length > 0) {\n candidates = candidates.filter((spec) =>\n query.tags!.some((tag) => spec.tags?.includes(tag)),\n );\n }\n\n // Filter by capabilities\n if (query.capabilities && query.capabilities.length > 0) {\n candidates = candidates.filter((spec) =>\n query.capabilities!.every((cap) => spec.capabilities.includes(cap)),\n );\n }\n\n // Filter by text (name, description, tags)\n if (query.text) {\n const lower = query.text.toLowerCase();\n candidates = candidates.filter(\n (spec) =>\n spec.name.toLowerCase().includes(lower) ||\n spec.description?.toLowerCase().includes(lower) ||\n spec.tags?.some((t) => t.toLowerCase().includes(lower)),\n );\n }\n\n return candidates;\n }\n\n /**\n * List all registered tool names.\n */\n list(): string[] {\n return [...this.tools.keys()];\n }\n\n /**\n * Get count of registered tools.\n */\n get size(): number {\n return this.tools.size;\n }\n\n /**\n * Export a snapshot of all registered tools (for debugging/routing).\n */\n snapshot(): ToolSpec[] {\n return [...this.tools.values()];\n }\n\n /**\n * Clear all registered tools.\n */\n clear(): void {\n this.tools.clear();\n this.tagIndex.clear();\n this.kindIndex.clear();\n }\n\n private validateSpec(spec: ToolSpec): void {\n if (!spec.name) throw new Error(\"ToolSpec.name is required\");\n if (!spec.version) throw new Error(\"ToolSpec.version is required\");\n if (!spec.kind) throw new Error(\"ToolSpec.kind is required\");\n if (!spec.inputSchema) throw new Error(\"ToolSpec.inputSchema is required\");\n if (!spec.outputSchema) throw new Error(\"ToolSpec.outputSchema is required\");\n if (!spec.capabilities) throw new Error(\"ToolSpec.capabilities is required\");\n }\n\n private indexTool(spec: ToolSpec): void {\n // Kind index\n let kindSet = this.kindIndex.get(spec.kind);\n if (!kindSet) {\n kindSet = new Set();\n this.kindIndex.set(spec.kind, kindSet);\n }\n kindSet.add(spec.name);\n\n // Tag index\n if (spec.tags) {\n for (const tag of spec.tags) {\n let tagSet = this.tagIndex.get(tag);\n if (!tagSet) {\n tagSet = new Set();\n this.tagIndex.set(tag, tagSet);\n }\n tagSet.add(spec.name);\n }\n }\n }\n\n private deindexTool(spec: ToolSpec): void {\n this.kindIndex.get(spec.kind)?.delete(spec.name);\n if (spec.tags) {\n for (const tag of spec.tags) {\n this.tagIndex.get(tag)?.delete(spec.name);\n }\n }\n }\n}\n","import pRetry, { type Options as PRetryOptions } from \"p-retry\";\n\n/**\n * Retry configuration.\n */\nexport interface RetryOptions {\n /** Maximum number of retries (default: 2) */\n maxRetries?: number;\n /** Base delay in ms for exponential backoff (default: 1000) */\n baseDelayMs?: number;\n /** Maximum delay in ms (default: 10000) */\n maxDelayMs?: number;\n /** Jitter factor 0-1 (default: 0.1) */\n jitter?: number;\n /** Error filter: return true to retry, false to abort */\n shouldRetry?: (error: Error) => boolean;\n /** Callback on each retry attempt */\n onRetry?: (error: Error, attempt: number) => void;\n}\n\n/**\n * Default errors that should NOT be retried (deterministic failures).\n */\nconst NON_RETRYABLE_ERRORS = new Set([\n \"TOOL_NOT_FOUND\",\n \"INPUT_SCHEMA_INVALID\",\n \"POLICY_DENIED\",\n \"HITL_DENIED\",\n \"OUTPUT_SCHEMA_INVALID\",\n \"PATH_OUTSIDE_SANDBOX\",\n \"FILE_TOO_LARGE\",\n \"HTTP_DISALLOWED_HOST\",\n \"HTTP_TOO_LARGE\",\n \"EXEC_INVALID\",\n \"EXEC_SPAWN_ERROR\",\n \"DUCKDUCKGO_INVALID\",\n]);\n\n/**\n * Determine if an error is retryable.\n */\nexport function isRetryable(error: unknown): boolean {\n if (error instanceof Error) {\n const kind = (error as Error & { kind?: string }).kind;\n if (kind && NON_RETRYABLE_ERRORS.has(kind)) return false;\n }\n return true;\n}\n\n/**\n * Execute a function with retry logic using exponential backoff.\n */\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n options: RetryOptions = {},\n): Promise<T> {\n const {\n maxRetries = 2,\n baseDelayMs = 1000,\n maxDelayMs = 10_000,\n jitter = 0.1,\n shouldRetry,\n onRetry,\n } = options;\n\n if (maxRetries <= 0) {\n return fn();\n }\n\n const pRetryOptions: PRetryOptions = {\n retries: maxRetries,\n minTimeout: baseDelayMs,\n maxTimeout: maxDelayMs,\n randomize: true,\n factor: 2,\n onFailedAttempt: (error) => {\n // Apply jitter\n if (jitter > 0 && error.retriesLeft > 0) {\n // jitterMs calculated but p-retry handles backoff internally\n void (Math.random() * jitter * baseDelayMs);\n }\n\n // Check if should retry\n if (shouldRetry && !shouldRetry(error)) {\n throw error; // Abort retry\n }\n\n if (!isRetryable(error)) {\n throw error; // Non-retryable error kind\n }\n\n onRetry?.(error, maxRetries - error.retriesLeft);\n },\n };\n\n return pRetry(fn, pRetryOptions);\n}\n\n/**\n * Create a tagged error with a kind field for retry classification.\n */\nexport function createTaggedError(\n kind: string,\n message: string,\n details?: unknown,\n): Error & { kind: string; details?: unknown } {\n const error = new Error(message) as Error & {\n kind: string;\n details?: unknown;\n };\n error.kind = kind;\n error.details = details;\n return error;\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { ToolRegistry, createTaggedError, withRetry } from './chunk-ZRHPGW7W.js';
2
- import { normalizeToolName } from './chunk-KDB3MY2H.js';
1
+ import { ToolRegistry, createTaggedError, withRetry } from './chunk-FCYBA7PR.js';
2
+ import { normalizeToolName } from './chunk-ODEHUAR4.js';
3
3
  import { enrichSpecWithCanonicalSchema } from './chunk-NTWOVFEY.js';
4
4
  import { readFileSync, existsSync, statSync } from 'fs';
5
5
  import { resolve, dirname, join, normalize, basename, isAbsolute } from 'path';
@@ -12,6 +12,7 @@ import { v4 } from 'uuid';
12
12
  import pTimeout from 'p-timeout';
13
13
  import { realpath, access } from 'fs/promises';
14
14
  import { createRequire } from 'module';
15
+ import { pathToFileURL } from 'url';
15
16
  import { resolveLatestVersionFromRegistry, ensurePackageInCache, getPackageEntryPath, importFromCache } from '@easynet/agent-common/npm';
16
17
  import { createServer } from 'http';
17
18
 
@@ -1753,6 +1754,16 @@ function getProjectRequire() {
1753
1754
  if (existsSync(join(cwd, "tool.yaml"))) return createRequire(join(cwd, "tool.yaml"));
1754
1755
  return null;
1755
1756
  }
1757
+ function findNearestPackageJson(startDir) {
1758
+ let dir = resolve(startDir);
1759
+ while (true) {
1760
+ const pkg = join(dir, "package.json");
1761
+ if (existsSync(pkg)) return pkg;
1762
+ const parent = dirname(dir);
1763
+ if (parent === dir) return null;
1764
+ dir = parent;
1765
+ }
1766
+ }
1756
1767
  var DEFAULT_EXTENSION_PACKAGES = [];
1757
1768
  function getInstalledPackageVersion(packageName) {
1758
1769
  const projectRequire = getProjectRequire();
@@ -1861,9 +1872,9 @@ function loadExtensionForDescriptorSync(descriptor, configFilePath, stepLog) {
1861
1872
  if (!parsed) return null;
1862
1873
  const localPath = isAbsolute(configFilePath) ? configFilePath : resolve(process.cwd(), configFilePath);
1863
1874
  const configDir = dirname(localPath);
1864
- const packageJsonPath = join(configDir, "package.json");
1865
- const useNodeModules = existsSync(packageJsonPath);
1866
- const configRequire = useNodeModules ? createRequire(packageJsonPath) : null;
1875
+ const packageJsonPath = findNearestPackageJson(configDir);
1876
+ const configRequire = packageJsonPath ? createRequire(packageJsonPath) : null;
1877
+ const npmCwd = packageJsonPath ? dirname(packageJsonPath) : configDir;
1867
1878
  if (configRequire) {
1868
1879
  try {
1869
1880
  const mod = configRequire(parsed.packageName);
@@ -1871,7 +1882,7 @@ function loadExtensionForDescriptorSync(descriptor, configFilePath, stepLog) {
1871
1882
  if (typeof fn === "function") {
1872
1883
  const installed = getInstalledPackageVersionFromRequire(parsed.packageName, configRequire);
1873
1884
  const requested = parsed.version === "latest" || !parsed.version?.trim() ? null : parsed.version;
1874
- const resolvedVersion = requested === null ? resolveLatestVersionFromRegistry(parsed.packageName) : requested;
1885
+ const resolvedVersion = requested === null ? resolveLatestVersionFromRegistry(parsed.packageName, { cwd: npmCwd }) : requested;
1875
1886
  if (installed === resolvedVersion) {
1876
1887
  if (stepLog) stepLog(`Loaded ${parsed.packageName}@${resolvedVersion} from node_modules`);
1877
1888
  return { register: fn, descriptor: entryStr, resolvedVersion };
@@ -1881,8 +1892,8 @@ function loadExtensionForDescriptorSync(descriptor, configFilePath, stepLog) {
1881
1892
  }
1882
1893
  }
1883
1894
  const cacheBase = getCacheBaseFromToolConfig(localPath);
1884
- const cacheOpts = cacheBase ? { cacheBase } : {};
1885
- for (const opts of [cacheOpts, {}]) {
1895
+ const cacheOptions = cacheBase ? [{ cacheBase, cwd: npmCwd }, { cwd: npmCwd }] : [{ cwd: npmCwd }];
1896
+ for (const opts of cacheOptions) {
1886
1897
  try {
1887
1898
  const cacheDir = ensurePackageInCache(parsed.packageName, parsed.version, opts);
1888
1899
  if (stepLog) stepLog(`Loaded ${parsed.packageName} from cache: ${cacheDir}`);
@@ -1896,7 +1907,7 @@ function loadExtensionForDescriptorSync(descriptor, configFilePath, stepLog) {
1896
1907
  }
1897
1908
  break;
1898
1909
  } catch {
1899
- if (Object.keys(opts).length > 0) continue;
1910
+ if (cacheBase && "cacheBase" in opts) continue;
1900
1911
  break;
1901
1912
  }
1902
1913
  }
@@ -1939,9 +1950,32 @@ async function loadExtensionForDescriptorAsync(descriptor, configFilePath, stepL
1939
1950
  const parsed = parseNpmDescriptor(entryStr);
1940
1951
  if (!parsed) return null;
1941
1952
  const localPath = isAbsolute(configFilePath) ? configFilePath : resolve(process.cwd(), configFilePath);
1953
+ const configDir = dirname(localPath);
1954
+ const packageJsonPath = findNearestPackageJson(configDir);
1955
+ const configRequire = packageJsonPath ? createRequire(packageJsonPath) : null;
1956
+ const npmCwd = packageJsonPath ? dirname(packageJsonPath) : configDir;
1957
+ if (configRequire) {
1958
+ try {
1959
+ const installed = getInstalledPackageVersionFromRequire(parsed.packageName, configRequire);
1960
+ const requested = parsed.version === "latest" || !parsed.version?.trim() ? null : parsed.version;
1961
+ const resolvedVersion = requested === null ? resolveLatestVersionFromRegistry(parsed.packageName, { cwd: npmCwd }) : requested;
1962
+ if (installed === resolvedVersion) {
1963
+ const pkgJsonResolved = configRequire.resolve(`${parsed.packageName}/package.json`);
1964
+ const packageRoot = dirname(pkgJsonResolved);
1965
+ const entryPath = getPackageEntryPath(packageRoot);
1966
+ const mod = await import(pathToFileURL(entryPath).href);
1967
+ const fn = getRegisterFn(mod);
1968
+ if (typeof fn === "function") {
1969
+ if (stepLog) stepLog(`Loaded ${parsed.packageName}@${resolvedVersion} from node_modules (async import)`);
1970
+ return { register: fn, descriptor: entryStr, resolvedVersion };
1971
+ }
1972
+ }
1973
+ } catch {
1974
+ }
1975
+ }
1942
1976
  const cacheBase = getCacheBaseFromToolConfig(localPath);
1943
- const cacheOpts = cacheBase ? { cacheBase } : {};
1944
- for (const opts of [cacheOpts, {}]) {
1977
+ const cacheOptions = cacheBase ? [{ cacheBase, cwd: npmCwd }, { cwd: npmCwd }] : [{ cwd: npmCwd }];
1978
+ for (const opts of cacheOptions) {
1945
1979
  try {
1946
1980
  const cacheDir = ensurePackageInCache(parsed.packageName, parsed.version, opts);
1947
1981
  if (stepLog) stepLog(`Loaded ${parsed.packageName} from cache (async): ${cacheDir}`);
@@ -1953,7 +1987,7 @@ async function loadExtensionForDescriptorAsync(descriptor, configFilePath, stepL
1953
1987
  }
1954
1988
  break;
1955
1989
  } catch {
1956
- if (Object.keys(opts).length > 0) continue;
1990
+ if (cacheBase && "cacheBase" in opts) continue;
1957
1991
  break;
1958
1992
  }
1959
1993
  }
@@ -2511,5 +2545,5 @@ var LANGCHAIN_KIND = "langchain";
2511
2545
  var LANGCHAIN_DIR_NAME = "langchain";
2512
2546
 
2513
2547
  export { LANGCHAIN_DIR_NAME, LANGCHAIN_KIND, MCP_KIND, PTCRuntime, createHttpService, createMCPServer, createMCPServerStreamableHttp, createMCPStreamableHttpHandler, createRuntimeFromConfig, createRuntimeFromConfigSync, expandToolDescriptorsToRegistryNames, fileDescriptorToPackagePrefix, findAndLoadToolConfig, getDisplayScope, isBarePackageDescriptor, loadToolConfig, npmDescriptorToPackagePrefixWithVersion, resolveSandboxedPath, resolveSandboxedPath2, resolveToolDescriptor, runMCPServerOverStdio, setSandboxValidationEnabled };
2514
- //# sourceMappingURL=chunk-2ZPDD7ZO.js.map
2515
- //# sourceMappingURL=chunk-2ZPDD7ZO.js.map
2548
+ //# sourceMappingURL=chunk-ZWYRMANX.js.map
2549
+ //# sourceMappingURL=chunk-ZWYRMANX.js.map