@easynet/agent-tool 1.0.34 → 1.0.36

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 (60) hide show
  1. package/dist/api/adapters/LangChainToolsHub.d.ts.map +1 -1
  2. package/dist/api/createAgentTools.d.ts.map +1 -1
  3. package/dist/api/expose/extension-init/index.d.ts +3 -0
  4. package/dist/api/expose/extension-init/index.d.ts.map +1 -0
  5. package/dist/api/expose/extension-init/initExtension.d.ts +19 -0
  6. package/dist/api/expose/extension-init/initExtension.d.ts.map +1 -0
  7. package/dist/api/extension/dynamicImportAdapter.d.ts +6 -2
  8. package/dist/api/extension/dynamicImportAdapter.d.ts.map +1 -1
  9. package/dist/api/extension/generateExtensionManifest.d.ts +2 -2
  10. package/dist/api/extension/generateExtensionManifest.d.ts.map +1 -1
  11. package/dist/api/extension/index.d.ts +1 -0
  12. package/dist/api/extension/index.d.ts.map +1 -1
  13. package/dist/api/extension/loadToolYaml.d.ts +1 -0
  14. package/dist/api/extension/loadToolYaml.d.ts.map +1 -1
  15. package/dist/api/extension/overrideWithConfig.d.ts +6 -0
  16. package/dist/api/extension/overrideWithConfig.d.ts.map +1 -0
  17. package/dist/api/extension/registerExtension.d.ts.map +1 -1
  18. package/dist/api/extension/registerFromManifest.d.ts.map +1 -1
  19. package/dist/api/main.cjs +14 -14
  20. package/dist/api/main.js +3 -3
  21. package/dist/api/runtimeFromConfig.d.ts +8 -0
  22. package/dist/api/runtimeFromConfig.d.ts.map +1 -1
  23. package/dist/{chunk-GYUELFVR.js → chunk-3L7CQ6XP.js} +3 -3
  24. package/dist/{chunk-GYUELFVR.js.map → chunk-3L7CQ6XP.js.map} +1 -1
  25. package/dist/{chunk-ETZKGTTF.cjs → chunk-5LCB63L7.cjs} +7 -7
  26. package/dist/{chunk-ETZKGTTF.cjs.map → chunk-5LCB63L7.cjs.map} +1 -1
  27. package/dist/{chunk-YP6GRCQG.cjs → chunk-6ZGMI6KW.cjs} +53 -16
  28. package/dist/chunk-6ZGMI6KW.cjs.map +1 -0
  29. package/dist/{chunk-UUQGKFSG.js → chunk-7VBJ64YC.js} +308 -141
  30. package/dist/chunk-7VBJ64YC.js.map +1 -0
  31. package/dist/{chunk-FHHD4FSI.js → chunk-HEMWFWSK.js} +3 -3
  32. package/dist/{chunk-FHHD4FSI.js.map → chunk-HEMWFWSK.js.map} +1 -1
  33. package/dist/{chunk-6UOHURU4.js → chunk-JG5T3ZYC.js} +42 -5
  34. package/dist/chunk-JG5T3ZYC.js.map +1 -0
  35. package/dist/{chunk-PKUSCCS6.cjs → chunk-LP7KHBA3.cjs} +310 -140
  36. package/dist/chunk-LP7KHBA3.cjs.map +1 -0
  37. package/dist/{chunk-LOGUQGCL.cjs → chunk-WFRHBW32.cjs} +9 -9
  38. package/dist/{chunk-LOGUQGCL.cjs.map → chunk-WFRHBW32.cjs.map} +1 -1
  39. package/dist/index.cjs +119 -69
  40. package/dist/index.cjs.map +1 -1
  41. package/dist/index.d.ts +2 -2
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +71 -26
  44. package/dist/index.js.map +1 -1
  45. package/dist/tools/util/toolConfig.d.ts +11 -3
  46. package/dist/tools/util/toolConfig.d.ts.map +1 -1
  47. package/dist/tools/util/toolDescriptor.d.ts +32 -7
  48. package/dist/tools/util/toolDescriptor.d.ts.map +1 -1
  49. package/dist/utils/cli/index.cjs +233 -31
  50. package/dist/utils/cli/index.cjs.map +1 -1
  51. package/dist/utils/cli/index.d.ts.map +1 -1
  52. package/dist/utils/cli/index.js +201 -15
  53. package/dist/utils/cli/index.js.map +1 -1
  54. package/dist/utils/npmCache.d.ts +14 -0
  55. package/dist/utils/npmCache.d.ts.map +1 -1
  56. package/package.json +1 -1
  57. package/dist/chunk-6UOHURU4.js.map +0 -1
  58. package/dist/chunk-PKUSCCS6.cjs.map +0 -1
  59. package/dist/chunk-UUQGKFSG.js.map +0 -1
  60. package/dist/chunk-YP6GRCQG.cjs.map +0 -1
@@ -6,7 +6,7 @@ import { bulkhead, circuitBreaker, handleAll, ConsecutiveBreaker } from 'cockati
6
6
  import { EventEmitter } from 'eventemitter3';
7
7
  import { v4 } from 'uuid';
8
8
  import pTimeout from 'p-timeout';
9
- import { readFileSync, existsSync, mkdirSync, readdirSync, rmSync, renameSync } from 'fs';
9
+ import { readFileSync, existsSync, rmSync, mkdirSync, readdirSync, renameSync, statSync } from 'fs';
10
10
  import { join, resolve, dirname, isAbsolute, basename } from 'path';
11
11
  import { homedir } from 'os';
12
12
  import yaml from 'js-yaml';
@@ -1509,8 +1509,20 @@ function npmDescriptorToRegistryPrefix(descriptor, resolvedVersion) {
1509
1509
  const lastAt = beforeHash.lastIndexOf("@");
1510
1510
  const scopeAndPackage = lastAt <= 0 ? beforeHash : beforeHash.slice(0, lastAt);
1511
1511
  let version = lastAt <= 0 ? "latest" : beforeHash.slice(lastAt + 1).trim() || "latest";
1512
- if ((version === "latest" || !version) && resolvedVersion != null && resolvedVersion !== "") {
1513
- version = resolvedVersion;
1512
+ if (version === "latest" || !version) {
1513
+ const resolved = (resolvedVersion ?? "").trim();
1514
+ if (resolved !== "" && resolved.toLowerCase() !== "latest") {
1515
+ version = resolved;
1516
+ } else {
1517
+ throw new Error(
1518
+ `Registry prefix requires a concrete version when descriptor uses latest (${descriptor}). Resolve version from registry (e.g. resolveLatestVersionFromRegistry) and pass as resolvedVersion.`
1519
+ );
1520
+ }
1521
+ }
1522
+ if (!version || version.toLowerCase() === "latest") {
1523
+ throw new Error(
1524
+ `Registry never uses "latest"; pass resolved concrete version for npm descriptor: ${descriptor}`
1525
+ );
1514
1526
  }
1515
1527
  const slashIdx = scopeAndPackage.indexOf("/");
1516
1528
  const scope = slashIdx < 0 ? scopeAndPackage : scopeAndPackage.slice(0, slashIdx).replace(/^@/, "");
@@ -1520,6 +1532,39 @@ function npmDescriptorToRegistryPrefix(descriptor, resolvedVersion) {
1520
1532
  if (!normalized) return "";
1521
1533
  return "npm." + normalized + ".";
1522
1534
  }
1535
+ function npmDescriptorToPackagePrefix(descriptor) {
1536
+ const s = descriptor.trim();
1537
+ if (typeof s !== "string" || !s.startsWith("npm:")) return "";
1538
+ const rest = s.slice(4).trim();
1539
+ const hashIdx = rest.indexOf("#");
1540
+ const beforeHash = hashIdx < 0 ? rest : rest.slice(0, hashIdx);
1541
+ const lastAt = beforeHash.lastIndexOf("@");
1542
+ const scopeAndPackage = lastAt <= 0 ? beforeHash : beforeHash.slice(0, lastAt);
1543
+ const slashIdx = scopeAndPackage.indexOf("/");
1544
+ const scope = slashIdx < 0 ? scopeAndPackage : scopeAndPackage.slice(0, slashIdx).replace(/^@/, "");
1545
+ const pkg = slashIdx < 0 ? "" : scopeAndPackage.slice(slashIdx + 1);
1546
+ const segment = [scope, pkg].filter(Boolean).join(".");
1547
+ const normalized = normalizeToolName(segment);
1548
+ if (!normalized) return "";
1549
+ return "npm." + normalized;
1550
+ }
1551
+ function npmDescriptorToPackagePrefixWithVersion(descriptor) {
1552
+ const s = descriptor.trim();
1553
+ if (typeof s !== "string" || !s.startsWith("npm:")) return "";
1554
+ const rest = s.slice(4).trim();
1555
+ const hashIdx = rest.indexOf("#");
1556
+ const beforeHash = hashIdx < 0 ? rest : rest.slice(0, hashIdx);
1557
+ const lastAt = beforeHash.lastIndexOf("@");
1558
+ const scopeAndPackage = lastAt <= 0 ? beforeHash : beforeHash.slice(0, lastAt);
1559
+ const version = lastAt <= 0 ? "" : beforeHash.slice(lastAt + 1).trim();
1560
+ const slashIdx = scopeAndPackage.indexOf("/");
1561
+ const scope = slashIdx < 0 ? scopeAndPackage : scopeAndPackage.slice(0, slashIdx).replace(/^@/, "");
1562
+ const pkg = slashIdx < 0 ? "" : scopeAndPackage.slice(slashIdx + 1);
1563
+ const segment = [scope, pkg, version].filter(Boolean).join(".");
1564
+ const normalized = normalizeToolName(segment);
1565
+ if (!normalized) return "";
1566
+ return "npm." + normalized;
1567
+ }
1523
1568
  function isNpmToolDescriptor(descriptor) {
1524
1569
  return isToolPath(descriptor) && parseToolPath(descriptor)?.protocol === "npm";
1525
1570
  }
@@ -1563,6 +1608,30 @@ function expandToolDescriptorsToRegistryNames(descriptors, registryNames) {
1563
1608
  if (registryNames.includes(s) && !seen.has(s)) {
1564
1609
  seen.add(s);
1565
1610
  out.push(s);
1611
+ continue;
1612
+ }
1613
+ const path = parseToolPath(s);
1614
+ if (path) {
1615
+ const packagePrefix = path.protocol === "npm" ? npmDescriptorToPackagePrefix(s) : path.protocol === "file" ? fileDescriptorToPackagePrefix(s) : "";
1616
+ const prefixWithDot = packagePrefix ? packagePrefix + "." : "";
1617
+ if (prefixWithDot) {
1618
+ if (path.toolName) {
1619
+ const suffix = "." + path.toolName;
1620
+ for (const r of registryNames) {
1621
+ if (r.startsWith(prefixWithDot) && r.endsWith(suffix) && !seen.has(r)) {
1622
+ seen.add(r);
1623
+ out.push(r);
1624
+ }
1625
+ }
1626
+ } else {
1627
+ for (const r of registryNames) {
1628
+ if (r.startsWith(prefixWithDot) && !seen.has(r)) {
1629
+ seen.add(r);
1630
+ out.push(r);
1631
+ }
1632
+ }
1633
+ }
1634
+ }
1566
1635
  }
1567
1636
  continue;
1568
1637
  }
@@ -1588,6 +1657,18 @@ function normalizeToolList(descriptors) {
1588
1657
  }
1589
1658
  return out;
1590
1659
  }
1660
+ function fileDescriptorToPackagePrefix(descriptor) {
1661
+ const path = parseToolPath(descriptor.trim());
1662
+ if (!path || path.protocol !== "file") return "";
1663
+ const pathPart = `${path.scope}/${path.packageWithVersion}`;
1664
+ const normalized = normalizeToolName(pathPart);
1665
+ if (!normalized) return "";
1666
+ return "file." + normalized;
1667
+ }
1668
+ function fileDescriptorToRegistryPrefix(descriptor) {
1669
+ const prefix = fileDescriptorToPackagePrefix(descriptor);
1670
+ return prefix ? prefix + "." : "";
1671
+ }
1591
1672
  function loadToolConfig(toolYamlPath) {
1592
1673
  const abs = resolve(toolYamlPath);
1593
1674
  const raw = readFileSync(abs, "utf8");
@@ -1595,20 +1676,29 @@ function loadToolConfig(toolYamlPath) {
1595
1676
  if (!parsed || typeof parsed !== "object") return {};
1596
1677
  const toolsBlock = parsed.tools;
1597
1678
  if (toolsBlock != null && typeof toolsBlock === "object" && !Array.isArray(toolsBlock)) {
1679
+ const toolDefaults = toolsBlock.defaults != null && typeof toolsBlock.defaults === "object" && !Array.isArray(toolsBlock.defaults) ? toolsBlock.defaults : void 0;
1680
+ const packageToolDefaults2 = toolsBlock.packages != null && typeof toolsBlock.packages === "object" && !Array.isArray(toolsBlock.packages) ? toolsBlock.packages : void 0;
1681
+ const list2 = Array.isArray(toolsBlock.list) && toolsBlock.list.length > 0 ? toolsBlock.list : void 0;
1598
1682
  return {
1599
- tools: Array.isArray(toolsBlock.list) ? toolsBlock.list : void 0,
1683
+ tools: list2 ?? (packageToolDefaults2 ? Object.keys(packageToolDefaults2) : void 0),
1600
1684
  sandboxedPath: typeof toolsBlock.sandboxedPath === "string" ? toolsBlock.sandboxedPath : parsed.sandboxedPath,
1601
1685
  allowedHosts: Array.isArray(toolsBlock.allowedHosts) ? toolsBlock.allowedHosts : parsed.allowedHosts,
1602
1686
  blockedHosts: Array.isArray(toolsBlock.blockedHosts) ? toolsBlock.blockedHosts : parsed.blockedHosts,
1603
- blockedCidrs: Array.isArray(toolsBlock.blockedCidrs) ? toolsBlock.blockedCidrs : parsed.blockedCidrs
1687
+ blockedCidrs: Array.isArray(toolsBlock.blockedCidrs) ? toolsBlock.blockedCidrs : parsed.blockedCidrs,
1688
+ toolDefaults,
1689
+ packageToolDefaults: packageToolDefaults2
1604
1690
  };
1605
1691
  }
1692
+ const packageToolDefaults = typeof parsed.packageToolDefaults === "object" && !Array.isArray(parsed.packageToolDefaults) ? parsed.packageToolDefaults : void 0;
1693
+ const list = Array.isArray(parsed.tools) && parsed.tools.length > 0 ? parsed.tools : void 0;
1606
1694
  return {
1607
- tools: Array.isArray(parsed.tools) ? parsed.tools : void 0,
1695
+ tools: list ?? (packageToolDefaults ? Object.keys(packageToolDefaults) : void 0),
1608
1696
  sandboxedPath: parsed.sandboxedPath,
1609
1697
  allowedHosts: Array.isArray(parsed.allowedHosts) ? parsed.allowedHosts : void 0,
1610
1698
  blockedHosts: Array.isArray(parsed.blockedHosts) ? parsed.blockedHosts : void 0,
1611
- blockedCidrs: Array.isArray(parsed.blockedCidrs) ? parsed.blockedCidrs : void 0
1699
+ blockedCidrs: Array.isArray(parsed.blockedCidrs) ? parsed.blockedCidrs : void 0,
1700
+ toolDefaults: typeof parsed.toolDefaults === "object" && !Array.isArray(parsed.toolDefaults) ? parsed.toolDefaults : void 0,
1701
+ packageToolDefaults
1612
1702
  };
1613
1703
  }
1614
1704
  function resolveSandboxedPath(toolYamlPath, sandboxedPath) {
@@ -1635,6 +1725,37 @@ function findAndLoadToolConfig(dir) {
1635
1725
  return {};
1636
1726
  }
1637
1727
  var DEFAULT_CACHE_BASE = join(homedir(), ".agent", "cache");
1728
+ function isLatestRequest(version) {
1729
+ const v = (version ?? "").trim().toLowerCase();
1730
+ return v === "" || v === "latest";
1731
+ }
1732
+ function resolveLatestVersionFromRegistry(packageName) {
1733
+ const quoted = packageName.includes(" ") ? `"${packageName}"` : packageName;
1734
+ try {
1735
+ const out = execSync(`npm view ${quoted} version`, {
1736
+ encoding: "utf-8",
1737
+ stdio: ["pipe", "pipe", "pipe"]
1738
+ });
1739
+ const version = (out ?? "").trim();
1740
+ if (!version) {
1741
+ throw new Error(`npm view ${packageName} version returned empty`);
1742
+ }
1743
+ return version;
1744
+ } catch (err) {
1745
+ const msg = err instanceof Error ? err.message : String(err);
1746
+ throw new Error(`Failed to resolve latest version for ${packageName}: ${msg}`);
1747
+ }
1748
+ }
1749
+ function getCachedPackageVersion(cacheDir) {
1750
+ const pkgPath = join(cacheDir, "package.json");
1751
+ if (!existsSync(pkgPath)) return void 0;
1752
+ try {
1753
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
1754
+ return typeof pkg.version === "string" ? pkg.version : void 0;
1755
+ } catch {
1756
+ return void 0;
1757
+ }
1758
+ }
1638
1759
  function packagePathSegments(name) {
1639
1760
  const withoutScope = name.replace(/^@/, "");
1640
1761
  return withoutScope.split("/").filter(Boolean);
@@ -1643,17 +1764,29 @@ function resolveCacheDir(cacheBase, packageName, version) {
1643
1764
  const segments = packagePathSegments(packageName);
1644
1765
  return join(cacheBase, ...segments, version);
1645
1766
  }
1646
- function getVersionFromTarball(tgzName) {
1647
- const base = tgzName.replace(/\.tgz$/i, "");
1648
- const match = base.match(/-(\d+\.\d+\.\d+(-[a-zA-Z0-9.-]+)?)$/);
1649
- return match ? match[1] : base;
1650
- }
1651
1767
  function ensurePackageInCache(packageName, version = "latest", options = {}) {
1652
1768
  const cacheBase = options.cacheBase ?? DEFAULT_CACHE_BASE;
1769
+ let resolvedVersion;
1770
+ if (isLatestRequest(version)) {
1771
+ resolvedVersion = resolveLatestVersionFromRegistry(packageName);
1772
+ } else {
1773
+ resolvedVersion = version;
1774
+ }
1775
+ const cacheDir = resolveCacheDir(cacheBase, packageName, resolvedVersion);
1776
+ const packageJsonPath = join(cacheDir, "package.json");
1777
+ const nodeModulesPath = join(cacheDir, "node_modules");
1778
+ if (existsSync(packageJsonPath) && existsSync(nodeModulesPath)) {
1779
+ const cachedVersion = getCachedPackageVersion(cacheDir);
1780
+ if (cachedVersion === resolvedVersion) {
1781
+ options.afterInstall?.(cacheDir, packageName);
1782
+ return cacheDir;
1783
+ }
1784
+ rmSync(cacheDir, { recursive: true, force: true });
1785
+ }
1653
1786
  const packDest = join(cacheBase, ".pack-tmp", packageName.replace(/@/g, "").replace(/\//g, "_"));
1654
1787
  mkdirSync(packDest, { recursive: true });
1655
1788
  try {
1656
- execSync(`npm pack ${packageName}@${version} --pack-destination "${packDest}"`, {
1789
+ execSync(`npm pack ${packageName}@${resolvedVersion} --pack-destination "${packDest}"`, {
1657
1790
  cwd: process.cwd(),
1658
1791
  stdio: "pipe",
1659
1792
  encoding: "utf-8"
@@ -1663,15 +1796,6 @@ function ensurePackageInCache(packageName, version = "latest", options = {}) {
1663
1796
  if (!tgz) {
1664
1797
  throw new Error(`npm pack did not produce a .tgz in ${packDest}`);
1665
1798
  }
1666
- const resolvedVersion = getVersionFromTarball(tgz);
1667
- const cacheDir = resolveCacheDir(cacheBase, packageName, resolvedVersion);
1668
- const packageJsonPath = join(cacheDir, "package.json");
1669
- const nodeModulesPath = join(cacheDir, "node_modules");
1670
- if (existsSync(packageJsonPath) && existsSync(nodeModulesPath)) {
1671
- options.afterInstall?.(cacheDir, packageName);
1672
- rmSync(packDest, { recursive: true, force: true });
1673
- return cacheDir;
1674
- }
1675
1799
  const extractDir = join(packDest, "extract");
1676
1800
  mkdirSync(extractDir, { recursive: true });
1677
1801
  execSync(`tar -xzf "${join(packDest, tgz)}" -C "${extractDir}"`, {
@@ -1687,11 +1811,33 @@ function ensurePackageInCache(packageName, version = "latest", options = {}) {
1687
1811
  rmSync(cacheDir, { recursive: true, force: true });
1688
1812
  }
1689
1813
  renameSync(extractedPackage, cacheDir);
1690
- execSync("npm install", {
1691
- cwd: cacheDir,
1692
- stdio: "pipe",
1693
- encoding: "utf-8"
1694
- });
1814
+ const npmInstallTimeout = 12e4;
1815
+ const maxAttempts = 3;
1816
+ let lastErr;
1817
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
1818
+ try {
1819
+ execSync("npm install --prefer-offline --no-audit --no-fund", {
1820
+ cwd: cacheDir,
1821
+ stdio: "pipe",
1822
+ encoding: "utf-8",
1823
+ timeout: npmInstallTimeout
1824
+ });
1825
+ lastErr = void 0;
1826
+ break;
1827
+ } catch (err) {
1828
+ lastErr = err instanceof Error ? err : new Error(String(err));
1829
+ if (attempt < maxAttempts) {
1830
+ const delayMs = 5e3 * attempt;
1831
+ const deadline = Date.now() + delayMs;
1832
+ while (Date.now() < deadline) {
1833
+ }
1834
+ } else {
1835
+ throw new Error(
1836
+ `npm install in cache failed after ${maxAttempts} attempts: ${lastErr.message}`
1837
+ );
1838
+ }
1839
+ }
1840
+ }
1695
1841
  options.afterInstall?.(cacheDir, packageName);
1696
1842
  return cacheDir;
1697
1843
  } finally {
@@ -1808,34 +1954,95 @@ function parseNpmDescriptor(entry) {
1808
1954
  const version = rest.slice(at + 1).split("#")[0]?.trim() || "latest";
1809
1955
  return { packageName, version };
1810
1956
  }
1811
- function loadExtensionFromToolYamlNodeModules(configFilePath, stepLog) {
1957
+ function loadExtensionFromFileDescriptorSync(descriptor, configFilePath, stepLog) {
1958
+ const entryStr = descriptor.trim();
1959
+ const path = parseToolPath(entryStr);
1960
+ if (!path || path.protocol !== "file") return null;
1961
+ const localPath = isAbsolute(configFilePath) ? configFilePath : resolve(process.cwd(), configFilePath);
1962
+ const configDir = dirname(localPath);
1963
+ const pathPart = `${path.scope}/${path.packageWithVersion}`;
1964
+ const resolvedPath = resolve(configDir, pathPart);
1965
+ if (!existsSync(resolvedPath) || !statSync(resolvedPath).isDirectory()) return null;
1966
+ try {
1967
+ const entryPath = getPackageEntryPath(resolvedPath);
1968
+ const req = createRequire(join(resolvedPath, "package.json"));
1969
+ const mod = req(entryPath);
1970
+ const fn = getRegisterFn(mod);
1971
+ if (typeof fn === "function") {
1972
+ if (stepLog) stepLog(`Loaded local extension from ${resolvedPath}`);
1973
+ return { register: fn, descriptor: entryStr, resolvedVersion: "local" };
1974
+ }
1975
+ } catch {
1976
+ }
1977
+ return null;
1978
+ }
1979
+ function loadExtensionForDescriptorSync(descriptor, configFilePath, stepLog) {
1980
+ const entryStr = descriptor.trim();
1981
+ const parsed = parseNpmDescriptor(entryStr);
1982
+ if (!parsed) return null;
1812
1983
  const localPath = isAbsolute(configFilePath) ? configFilePath : resolve(process.cwd(), configFilePath);
1813
- if (!existsSync(localPath)) return null;
1814
- const config = loadToolConfig(localPath);
1815
- const tools = config.tools;
1816
- if (!Array.isArray(tools) || tools.length === 0) return null;
1817
1984
  const configDir = dirname(localPath);
1818
1985
  const packageJsonPath = join(configDir, "package.json");
1819
- if (!existsSync(packageJsonPath)) return null;
1820
- const configRequire = createRequire(packageJsonPath);
1821
- if (stepLog) stepLog("Trying tool.yaml npm entries from node_modules");
1822
- for (const entry of tools) {
1823
- const entryStr = String(entry).trim();
1824
- const parsed = parseNpmDescriptor(entryStr);
1825
- if (!parsed) continue;
1986
+ const useNodeModules = existsSync(packageJsonPath);
1987
+ const configRequire = useNodeModules ? createRequire(packageJsonPath) : null;
1988
+ if (configRequire) {
1826
1989
  try {
1827
1990
  const mod = configRequire(parsed.packageName);
1828
1991
  const fn = getRegisterFn(mod);
1829
1992
  if (typeof fn === "function") {
1830
- const resolvedVersion = getInstalledPackageVersionFromRequire(parsed.packageName, configRequire) ?? "latest";
1993
+ const installed = getInstalledPackageVersionFromRequire(parsed.packageName, configRequire);
1994
+ const requested = parsed.version === "latest" || !parsed.version?.trim() ? null : parsed.version;
1995
+ const resolvedVersion = installed ?? (requested === null ? resolveLatestVersionFromRegistry(parsed.packageName) : requested);
1996
+ if (requested === null || installed === requested) {
1997
+ if (stepLog) stepLog(`Loaded ${parsed.packageName}@${resolvedVersion} from node_modules`);
1998
+ return { register: fn, descriptor: entryStr, resolvedVersion };
1999
+ }
2000
+ }
2001
+ } catch {
2002
+ }
2003
+ }
2004
+ const cacheBase = getCacheBaseFromToolConfig(localPath);
2005
+ const cacheOpts = cacheBase ? { cacheBase } : {};
2006
+ for (const opts of [cacheOpts, {}]) {
2007
+ try {
2008
+ const cacheDir = ensurePackageInCache(parsed.packageName, parsed.version, opts);
2009
+ if (stepLog) stepLog(`Loaded ${parsed.packageName} from cache: ${cacheDir}`);
2010
+ const entryPath = getPackageEntryPath(cacheDir);
2011
+ const req = createRequire(join(cacheDir, "package.json"));
2012
+ const mod = req(entryPath);
2013
+ const fn = getRegisterFn(mod);
2014
+ if (typeof fn === "function") {
2015
+ const resolvedVersion = basename(cacheDir);
1831
2016
  return { register: fn, descriptor: entryStr, resolvedVersion };
1832
2017
  }
2018
+ break;
1833
2019
  } catch {
1834
- continue;
2020
+ if (Object.keys(opts).length > 0) continue;
2021
+ break;
1835
2022
  }
1836
2023
  }
1837
2024
  return null;
1838
2025
  }
2026
+ function loadAllExtensionsFromToolYamlSync(configFilePath, stepLog) {
2027
+ const localPath = isAbsolute(configFilePath) ? configFilePath : resolve(process.cwd(), configFilePath);
2028
+ if (!existsSync(localPath)) return [];
2029
+ const config = loadToolConfig(localPath);
2030
+ const tools = config.tools;
2031
+ if (!Array.isArray(tools) || tools.length === 0) return [];
2032
+ if (stepLog) stepLog("Loading extensions from tool.yaml (npm + file)");
2033
+ const loaded = [];
2034
+ for (const entry of tools) {
2035
+ const entryStr = String(entry).trim();
2036
+ if (entryStr.startsWith("npm:")) {
2037
+ const result = loadExtensionForDescriptorSync(entryStr, configFilePath, stepLog);
2038
+ if (result) loaded.push(result);
2039
+ } else if (entryStr.startsWith("file:")) {
2040
+ const result = loadExtensionFromFileDescriptorSync(entryStr, configFilePath, stepLog);
2041
+ if (result) loaded.push(result);
2042
+ }
2043
+ }
2044
+ return loaded;
2045
+ }
1839
2046
  function getInstalledPackageVersionFromRequire(packageName, req) {
1840
2047
  try {
1841
2048
  const pkgJsonPath = req.resolve(`${packageName}/package.json`);
@@ -1846,114 +2053,84 @@ function getInstalledPackageVersionFromRequire(packageName, req) {
1846
2053
  return null;
1847
2054
  }
1848
2055
  }
1849
- function loadExtensionFromToolYamlCache(configFilePath, stepLog) {
2056
+ async function loadExtensionForDescriptorAsync(descriptor, configFilePath, stepLog) {
2057
+ const syncResult = loadExtensionForDescriptorSync(descriptor, configFilePath, stepLog);
2058
+ if (syncResult) return syncResult;
2059
+ const entryStr = descriptor.trim();
2060
+ const parsed = parseNpmDescriptor(entryStr);
2061
+ if (!parsed) return null;
1850
2062
  const localPath = isAbsolute(configFilePath) ? configFilePath : resolve(process.cwd(), configFilePath);
1851
- if (!existsSync(localPath)) return null;
1852
- const config = loadToolConfig(localPath);
1853
- const tools = config.tools;
1854
- if (!Array.isArray(tools)) return null;
1855
2063
  const cacheBase = getCacheBaseFromToolConfig(localPath);
1856
2064
  const cacheOpts = cacheBase ? { cacheBase } : {};
1857
- if (stepLog) stepLog(`Loading extension from tool.yaml cache (cacheBase: ${cacheBase ?? "~/.agent/cache"})`);
1858
- for (const entry of tools) {
1859
- const entryStr = String(entry).trim();
1860
- const parsed = parseNpmDescriptor(entryStr);
1861
- if (!parsed) continue;
1862
- for (const opts of [cacheOpts, {}]) {
1863
- try {
1864
- if (stepLog && Object.keys(opts).length === 0 && cacheBase) stepLog("Falling back to default cache ~/.agent/cache");
1865
- const cacheDir = ensurePackageInCache(parsed.packageName, parsed.version, opts);
1866
- if (stepLog) stepLog(`Using cache: ${cacheDir}`);
1867
- const entryPath = getPackageEntryPath(cacheDir);
1868
- const req = createRequire(join(cacheDir, "package.json"));
1869
- const mod = req(entryPath);
1870
- const fn = getRegisterFn(mod);
1871
- if (typeof fn === "function") {
1872
- const resolvedVersion = basename(cacheDir);
1873
- return { register: fn, descriptor: entryStr, resolvedVersion };
1874
- }
1875
- break;
1876
- } catch {
1877
- if (Object.keys(opts).length > 0) continue;
1878
- break;
2065
+ for (const opts of [cacheOpts, {}]) {
2066
+ try {
2067
+ const cacheDir = ensurePackageInCache(parsed.packageName, parsed.version, opts);
2068
+ if (stepLog) stepLog(`Loaded ${parsed.packageName} from cache (async): ${cacheDir}`);
2069
+ const mod = await importFromCache(cacheDir);
2070
+ const fn = getRegisterFn(mod);
2071
+ if (typeof fn === "function") {
2072
+ const resolvedVersion = basename(cacheDir);
2073
+ return { register: fn, descriptor: entryStr, resolvedVersion };
1879
2074
  }
2075
+ break;
2076
+ } catch {
2077
+ if (Object.keys(opts).length > 0) continue;
2078
+ break;
1880
2079
  }
1881
2080
  }
1882
2081
  return null;
1883
2082
  }
1884
- async function loadExtensionFromToolYamlCacheAsync(configFilePath, stepLog) {
2083
+ async function loadAllExtensionsFromToolYamlAsync(configFilePath, stepLog) {
1885
2084
  const localPath = isAbsolute(configFilePath) ? configFilePath : resolve(process.cwd(), configFilePath);
1886
- if (!existsSync(localPath)) return null;
2085
+ if (!existsSync(localPath)) return [];
1887
2086
  const config = loadToolConfig(localPath);
1888
2087
  const tools = config.tools;
1889
- if (!Array.isArray(tools)) return null;
1890
- const cacheBase = getCacheBaseFromToolConfig(localPath);
1891
- const cacheOpts = cacheBase ? { cacheBase } : {};
1892
- if (stepLog) stepLog("Loading extension from tool.yaml cache (async)");
2088
+ if (!Array.isArray(tools) || tools.length === 0) return [];
2089
+ if (stepLog) stepLog("Loading extensions from tool.yaml (async)");
2090
+ const loaded = [];
1893
2091
  for (const entry of tools) {
1894
2092
  const entryStr = String(entry).trim();
1895
- const parsed = parseNpmDescriptor(entryStr);
1896
- if (!parsed) continue;
1897
- for (const opts of [cacheOpts, {}]) {
1898
- try {
1899
- if (stepLog && Object.keys(opts).length === 0 && cacheBase) stepLog("Falling back to default cache ~/.agent/cache");
1900
- const cacheDir = ensurePackageInCache(parsed.packageName, parsed.version, opts);
1901
- if (stepLog) stepLog(`Using cache: ${cacheDir}`);
1902
- const mod = await importFromCache(cacheDir);
1903
- const fn = getRegisterFn(mod);
1904
- if (typeof fn === "function") {
1905
- const resolvedVersion = basename(cacheDir);
1906
- return { register: fn, descriptor: entryStr, resolvedVersion };
1907
- }
1908
- break;
1909
- } catch {
1910
- if (Object.keys(opts).length > 0) continue;
1911
- break;
1912
- }
2093
+ if (entryStr.startsWith("npm:")) {
2094
+ const result = await loadExtensionForDescriptorAsync(entryStr, configFilePath, stepLog);
2095
+ if (result) loaded.push(result);
2096
+ } else if (entryStr.startsWith("file:")) {
2097
+ const result = loadExtensionFromFileDescriptorSync(entryStr, configFilePath, stepLog);
2098
+ if (result) loaded.push(result);
1913
2099
  }
1914
2100
  }
1915
- return null;
2101
+ return loaded;
1916
2102
  }
1917
2103
  function createRuntimeFromConfigSync(options = {}) {
1918
2104
  const registry = new ToolRegistry();
1919
2105
  const stepLog = options.stepLog;
1920
2106
  if (options.coreTools !== void 0) {
2107
+ if (options.configFilePath) {
2108
+ const all = loadAllExtensionsFromToolYamlSync(options.configFilePath, stepLog);
2109
+ if (all.length > 0) {
2110
+ if (stepLog) stepLog(`Registered ${all.length} extension(s) from tool.yaml`);
2111
+ const runtime3 = new PTCRuntime({ registry });
2112
+ for (const ext of all) {
2113
+ const prefix = ext.descriptor.startsWith("file:") ? fileDescriptorToRegistryPrefix(ext.descriptor) : npmDescriptorToRegistryPrefix(ext.descriptor, ext.resolvedVersion);
2114
+ const reg = prefix ? createPrefixingRegistry(registry, prefix) : registry;
2115
+ const adapter = ext.register(reg, options.coreTools);
2116
+ runtime3.registerAdapter(adapter);
2117
+ }
2118
+ return { runtime: runtime3, registry };
2119
+ }
2120
+ }
1921
2121
  if (stepLog) stepLog("Trying extension from node_modules");
1922
- let extensionNode = loadExtensionFromNodeModules();
2122
+ const extensionNode = loadExtensionFromNodeModules();
1923
2123
  if (extensionNode) {
1924
2124
  if (stepLog) stepLog("Registered extension from node_modules");
1925
2125
  const descriptor = `npm:${extensionNode.packageName}`;
1926
- const resolvedVersion = getInstalledPackageVersion(extensionNode.packageName);
1927
- const prefix = npmDescriptorToRegistryPrefix(descriptor, resolvedVersion ?? void 0);
2126
+ const resolvedVersion = getInstalledPackageVersion(extensionNode.packageName) ?? resolveLatestVersionFromRegistry(extensionNode.packageName);
2127
+ const prefix = npmDescriptorToRegistryPrefix(descriptor, resolvedVersion);
1928
2128
  const reg = prefix ? createPrefixingRegistry(registry, prefix) : registry;
1929
2129
  const coreAdapter = extensionNode.register(reg, options.coreTools);
1930
2130
  const runtime3 = new PTCRuntime({ registry });
1931
2131
  runtime3.registerAdapter(coreAdapter);
1932
2132
  return { runtime: runtime3, registry };
1933
2133
  }
1934
- if (options.configFilePath) {
1935
- const extensionFromNodeModules = loadExtensionFromToolYamlNodeModules(options.configFilePath, stepLog);
1936
- if (extensionFromNodeModules) {
1937
- if (stepLog) stepLog("Registered extension from tool.yaml list (node_modules)");
1938
- const prefix = npmDescriptorToRegistryPrefix(extensionFromNodeModules.descriptor, extensionFromNodeModules.resolvedVersion);
1939
- const reg = prefix ? createPrefixingRegistry(registry, prefix) : registry;
1940
- const coreAdapter = extensionFromNodeModules.register(reg, options.coreTools);
1941
- const runtime3 = new PTCRuntime({ registry });
1942
- runtime3.registerAdapter(coreAdapter);
1943
- return { runtime: runtime3, registry };
1944
- }
1945
- if (stepLog) stepLog("No extension in node_modules, loading from tool.yaml cache");
1946
- const extensionCache = loadExtensionFromToolYamlCache(options.configFilePath, stepLog);
1947
- if (extensionCache) {
1948
- if (stepLog) stepLog("Registered extension from cache");
1949
- const prefix = npmDescriptorToRegistryPrefix(extensionCache.descriptor, extensionCache.resolvedVersion);
1950
- const reg = prefix ? createPrefixingRegistry(registry, prefix) : registry;
1951
- const coreAdapter = extensionCache.register(reg, options.coreTools);
1952
- const runtime3 = new PTCRuntime({ registry });
1953
- runtime3.registerAdapter(coreAdapter);
1954
- return { runtime: runtime3, registry };
1955
- }
1956
- }
1957
2134
  const runtime2 = new PTCRuntime({ registry });
1958
2135
  return { runtime: runtime2, registry };
1959
2136
  }
@@ -1962,27 +2139,17 @@ function createRuntimeFromConfigSync(options = {}) {
1962
2139
  }
1963
2140
  async function createRuntimeFromConfig(options = {}) {
1964
2141
  if (options.coreTools !== void 0 && options.configFilePath) {
1965
- const fromNodeModules = loadExtensionFromToolYamlNodeModules(options.configFilePath, options.stepLog);
1966
- if (fromNodeModules) {
1967
- if (options.stepLog) options.stepLog("Registered extension from tool.yaml list (node_modules)");
2142
+ const all = await loadAllExtensionsFromToolYamlAsync(options.configFilePath, options.stepLog);
2143
+ if (all.length > 0) {
2144
+ if (options.stepLog) options.stepLog(`Registered ${all.length} extension(s) from tool.yaml`);
1968
2145
  const registry = new ToolRegistry();
1969
- const prefix = npmDescriptorToRegistryPrefix(fromNodeModules.descriptor, fromNodeModules.resolvedVersion);
1970
- const reg = prefix ? createPrefixingRegistry(registry, prefix) : registry;
1971
- const coreAdapter = fromNodeModules.register(reg, options.coreTools);
1972
2146
  const runtime = new PTCRuntime({ registry });
1973
- runtime.registerAdapter(coreAdapter);
1974
- return { runtime, registry };
1975
- }
1976
- if (options.stepLog) options.stepLog("Loading extension from tool.yaml cache (dynamic: npm pack + import)");
1977
- const fromCache = await loadExtensionFromToolYamlCacheAsync(options.configFilePath, options.stepLog);
1978
- if (fromCache) {
1979
- if (options.stepLog) options.stepLog("Registered extension from cache");
1980
- const registry = new ToolRegistry();
1981
- const prefix = npmDescriptorToRegistryPrefix(fromCache.descriptor, fromCache.resolvedVersion);
1982
- const reg = prefix ? createPrefixingRegistry(registry, prefix) : registry;
1983
- const coreAdapter = fromCache.register(reg, options.coreTools);
1984
- const runtime = new PTCRuntime({ registry });
1985
- runtime.registerAdapter(coreAdapter);
2147
+ for (const ext of all) {
2148
+ const prefix = ext.descriptor.startsWith("file:") ? fileDescriptorToRegistryPrefix(ext.descriptor) : npmDescriptorToRegistryPrefix(ext.descriptor, ext.resolvedVersion);
2149
+ const reg = prefix ? createPrefixingRegistry(registry, prefix) : registry;
2150
+ const adapter = ext.register(reg, options.coreTools);
2151
+ runtime.registerAdapter(adapter);
2152
+ }
1986
2153
  return { runtime, registry };
1987
2154
  }
1988
2155
  }
@@ -1996,6 +2163,6 @@ var MCP_KIND = "mcp";
1996
2163
  var LANGCHAIN_KIND = "langchain";
1997
2164
  var LANGCHAIN_DIR_NAME = "langchain";
1998
2165
 
1999
- export { BudgetManager, EventLog, LANGCHAIN_DIR_NAME, LANGCHAIN_KIND, MCP_KIND, Metrics, PTCRuntime, PolicyDeniedError, PolicyEngine, SchemaValidationError, SchemaValidator, Tracing, buildEvidence, createLogger, createRuntimeFromConfig, createRuntimeFromConfigSync, ensurePackageInCache, expandToolDescriptorsToRegistryNames, findAndLoadToolConfig, getDisplayScope, getPackageEntryPath, importFromCache, isBarePackageDescriptor, isNpmToolDescriptor, loadToolConfig, normalizeToolList, npmDescriptorToRegistryPrefix, parseNpmToolDescriptor, resolveNpmToolDescriptor, resolveSandboxedPath, resolveToolDescriptor, sanitizeForLog, summarizeForLog };
2000
- //# sourceMappingURL=chunk-UUQGKFSG.js.map
2001
- //# sourceMappingURL=chunk-UUQGKFSG.js.map
2166
+ export { BudgetManager, EventLog, LANGCHAIN_DIR_NAME, LANGCHAIN_KIND, MCP_KIND, Metrics, PTCRuntime, PolicyDeniedError, PolicyEngine, SchemaValidationError, SchemaValidator, Tracing, buildEvidence, createLogger, createRuntimeFromConfig, createRuntimeFromConfigSync, ensurePackageInCache, expandToolDescriptorsToRegistryNames, fileDescriptorToPackagePrefix, findAndLoadToolConfig, getDisplayScope, getPackageEntryPath, importFromCache, isBarePackageDescriptor, isNpmToolDescriptor, loadToolConfig, normalizeToolList, npmDescriptorToPackagePrefixWithVersion, npmDescriptorToRegistryPrefix, parseNpmToolDescriptor, resolveLatestVersionFromRegistry, resolveNpmToolDescriptor, resolveSandboxedPath, resolveToolDescriptor, sanitizeForLog, summarizeForLog };
2167
+ //# sourceMappingURL=chunk-7VBJ64YC.js.map
2168
+ //# sourceMappingURL=chunk-7VBJ64YC.js.map