@easynet/agent-tool 1.0.33 → 1.0.35

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 (49) 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/extension/dynamicImportAdapter.d.ts +6 -2
  4. package/dist/api/extension/dynamicImportAdapter.d.ts.map +1 -1
  5. package/dist/api/extension/generateExtensionManifest.d.ts +3 -3
  6. package/dist/api/extension/generateExtensionManifest.d.ts.map +1 -1
  7. package/dist/api/extension/loadToolYaml.d.ts +1 -0
  8. package/dist/api/extension/loadToolYaml.d.ts.map +1 -1
  9. package/dist/api/extension/registerExtension.d.ts.map +1 -1
  10. package/dist/api/extension/registerFromManifest.d.ts.map +1 -1
  11. package/dist/api/main.cjs +14 -14
  12. package/dist/api/main.js +3 -3
  13. package/dist/api/runtimeFromConfig.d.ts +8 -0
  14. package/dist/api/runtimeFromConfig.d.ts.map +1 -1
  15. package/dist/{chunk-PKUSCCS6.cjs → chunk-2WDDJYR7.cjs} +243 -135
  16. package/dist/chunk-2WDDJYR7.cjs.map +1 -0
  17. package/dist/{chunk-GYUELFVR.js → chunk-DDIGAOYI.js} +3 -3
  18. package/dist/{chunk-GYUELFVR.js.map → chunk-DDIGAOYI.js.map} +1 -1
  19. package/dist/{chunk-ETZKGTTF.cjs → chunk-P25NBSPT.cjs} +7 -7
  20. package/dist/{chunk-ETZKGTTF.cjs.map → chunk-P25NBSPT.cjs.map} +1 -1
  21. package/dist/{chunk-UUQGKFSG.js → chunk-PSVSVTHY.js} +241 -136
  22. package/dist/chunk-PSVSVTHY.js.map +1 -0
  23. package/dist/{chunk-6UOHURU4.js → chunk-RRVM6JBA.js} +42 -5
  24. package/dist/chunk-RRVM6JBA.js.map +1 -0
  25. package/dist/{chunk-YP6GRCQG.cjs → chunk-S27O27OH.cjs} +53 -16
  26. package/dist/chunk-S27O27OH.cjs.map +1 -0
  27. package/dist/{chunk-FHHD4FSI.js → chunk-U3CAAURW.js} +3 -3
  28. package/dist/{chunk-FHHD4FSI.js.map → chunk-U3CAAURW.js.map} +1 -1
  29. package/dist/{chunk-LOGUQGCL.cjs → chunk-Z5STQ2JO.cjs} +9 -9
  30. package/dist/{chunk-LOGUQGCL.cjs.map → chunk-Z5STQ2JO.cjs.map} +1 -1
  31. package/dist/index.cjs +111 -72
  32. package/dist/index.cjs.map +1 -1
  33. package/dist/index.d.ts +1 -1
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +63 -28
  36. package/dist/index.js.map +1 -1
  37. package/dist/tools/util/toolConfig.d.ts +11 -3
  38. package/dist/tools/util/toolConfig.d.ts.map +1 -1
  39. package/dist/tools/util/toolDescriptor.d.ts +29 -5
  40. package/dist/tools/util/toolDescriptor.d.ts.map +1 -1
  41. package/dist/utils/cli/index.cjs +17 -17
  42. package/dist/utils/cli/index.js +3 -3
  43. package/dist/utils/npmCache.d.ts +14 -0
  44. package/dist/utils/npmCache.d.ts.map +1 -1
  45. package/package.json +1 -1
  46. package/dist/chunk-6UOHURU4.js.map +0 -1
  47. package/dist/chunk-PKUSCCS6.cjs.map +0 -1
  48. package/dist/chunk-UUQGKFSG.js.map +0 -1
  49. 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,23 @@ function npmDescriptorToRegistryPrefix(descriptor, resolvedVersion) {
1520
1532
  if (!normalized) return "";
1521
1533
  return "npm." + normalized + ".";
1522
1534
  }
1535
+ function npmDescriptorToPackagePrefixWithVersion(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 version = lastAt <= 0 ? "" : beforeHash.slice(lastAt + 1).trim();
1544
+ const slashIdx = scopeAndPackage.indexOf("/");
1545
+ const scope = slashIdx < 0 ? scopeAndPackage : scopeAndPackage.slice(0, slashIdx).replace(/^@/, "");
1546
+ const pkg = slashIdx < 0 ? "" : scopeAndPackage.slice(slashIdx + 1);
1547
+ const segment = [scope, pkg, version].filter(Boolean).join(".");
1548
+ const normalized = normalizeToolName(segment);
1549
+ if (!normalized) return "";
1550
+ return "npm." + normalized;
1551
+ }
1523
1552
  function isNpmToolDescriptor(descriptor) {
1524
1553
  return isToolPath(descriptor) && parseToolPath(descriptor)?.protocol === "npm";
1525
1554
  }
@@ -1588,6 +1617,18 @@ function normalizeToolList(descriptors) {
1588
1617
  }
1589
1618
  return out;
1590
1619
  }
1620
+ function fileDescriptorToPackagePrefix(descriptor) {
1621
+ const path = parseToolPath(descriptor.trim());
1622
+ if (!path || path.protocol !== "file") return "";
1623
+ const pathPart = `${path.scope}/${path.packageWithVersion}`;
1624
+ const normalized = normalizeToolName(pathPart);
1625
+ if (!normalized) return "";
1626
+ return "file." + normalized;
1627
+ }
1628
+ function fileDescriptorToRegistryPrefix(descriptor) {
1629
+ const prefix = fileDescriptorToPackagePrefix(descriptor);
1630
+ return prefix ? prefix + "." : "";
1631
+ }
1591
1632
  function loadToolConfig(toolYamlPath) {
1592
1633
  const abs = resolve(toolYamlPath);
1593
1634
  const raw = readFileSync(abs, "utf8");
@@ -1595,20 +1636,29 @@ function loadToolConfig(toolYamlPath) {
1595
1636
  if (!parsed || typeof parsed !== "object") return {};
1596
1637
  const toolsBlock = parsed.tools;
1597
1638
  if (toolsBlock != null && typeof toolsBlock === "object" && !Array.isArray(toolsBlock)) {
1639
+ const toolDefaults = toolsBlock.defaults != null && typeof toolsBlock.defaults === "object" && !Array.isArray(toolsBlock.defaults) ? toolsBlock.defaults : void 0;
1640
+ const packageToolDefaults2 = toolsBlock.packages != null && typeof toolsBlock.packages === "object" && !Array.isArray(toolsBlock.packages) ? toolsBlock.packages : void 0;
1641
+ const list2 = Array.isArray(toolsBlock.list) && toolsBlock.list.length > 0 ? toolsBlock.list : void 0;
1598
1642
  return {
1599
- tools: Array.isArray(toolsBlock.list) ? toolsBlock.list : void 0,
1643
+ tools: list2 ?? (packageToolDefaults2 ? Object.keys(packageToolDefaults2) : void 0),
1600
1644
  sandboxedPath: typeof toolsBlock.sandboxedPath === "string" ? toolsBlock.sandboxedPath : parsed.sandboxedPath,
1601
1645
  allowedHosts: Array.isArray(toolsBlock.allowedHosts) ? toolsBlock.allowedHosts : parsed.allowedHosts,
1602
1646
  blockedHosts: Array.isArray(toolsBlock.blockedHosts) ? toolsBlock.blockedHosts : parsed.blockedHosts,
1603
- blockedCidrs: Array.isArray(toolsBlock.blockedCidrs) ? toolsBlock.blockedCidrs : parsed.blockedCidrs
1647
+ blockedCidrs: Array.isArray(toolsBlock.blockedCidrs) ? toolsBlock.blockedCidrs : parsed.blockedCidrs,
1648
+ toolDefaults,
1649
+ packageToolDefaults: packageToolDefaults2
1604
1650
  };
1605
1651
  }
1652
+ const packageToolDefaults = typeof parsed.packageToolDefaults === "object" && !Array.isArray(parsed.packageToolDefaults) ? parsed.packageToolDefaults : void 0;
1653
+ const list = Array.isArray(parsed.tools) && parsed.tools.length > 0 ? parsed.tools : void 0;
1606
1654
  return {
1607
- tools: Array.isArray(parsed.tools) ? parsed.tools : void 0,
1655
+ tools: list ?? (packageToolDefaults ? Object.keys(packageToolDefaults) : void 0),
1608
1656
  sandboxedPath: parsed.sandboxedPath,
1609
1657
  allowedHosts: Array.isArray(parsed.allowedHosts) ? parsed.allowedHosts : void 0,
1610
1658
  blockedHosts: Array.isArray(parsed.blockedHosts) ? parsed.blockedHosts : void 0,
1611
- blockedCidrs: Array.isArray(parsed.blockedCidrs) ? parsed.blockedCidrs : void 0
1659
+ blockedCidrs: Array.isArray(parsed.blockedCidrs) ? parsed.blockedCidrs : void 0,
1660
+ toolDefaults: typeof parsed.toolDefaults === "object" && !Array.isArray(parsed.toolDefaults) ? parsed.toolDefaults : void 0,
1661
+ packageToolDefaults
1612
1662
  };
1613
1663
  }
1614
1664
  function resolveSandboxedPath(toolYamlPath, sandboxedPath) {
@@ -1635,6 +1685,37 @@ function findAndLoadToolConfig(dir) {
1635
1685
  return {};
1636
1686
  }
1637
1687
  var DEFAULT_CACHE_BASE = join(homedir(), ".agent", "cache");
1688
+ function isLatestRequest(version) {
1689
+ const v = (version ?? "").trim().toLowerCase();
1690
+ return v === "" || v === "latest";
1691
+ }
1692
+ function resolveLatestVersionFromRegistry(packageName) {
1693
+ const quoted = packageName.includes(" ") ? `"${packageName}"` : packageName;
1694
+ try {
1695
+ const out = execSync(`npm view ${quoted} version`, {
1696
+ encoding: "utf-8",
1697
+ stdio: ["pipe", "pipe", "pipe"]
1698
+ });
1699
+ const version = (out ?? "").trim();
1700
+ if (!version) {
1701
+ throw new Error(`npm view ${packageName} version returned empty`);
1702
+ }
1703
+ return version;
1704
+ } catch (err) {
1705
+ const msg = err instanceof Error ? err.message : String(err);
1706
+ throw new Error(`Failed to resolve latest version for ${packageName}: ${msg}`);
1707
+ }
1708
+ }
1709
+ function getCachedPackageVersion(cacheDir) {
1710
+ const pkgPath = join(cacheDir, "package.json");
1711
+ if (!existsSync(pkgPath)) return void 0;
1712
+ try {
1713
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
1714
+ return typeof pkg.version === "string" ? pkg.version : void 0;
1715
+ } catch {
1716
+ return void 0;
1717
+ }
1718
+ }
1638
1719
  function packagePathSegments(name) {
1639
1720
  const withoutScope = name.replace(/^@/, "");
1640
1721
  return withoutScope.split("/").filter(Boolean);
@@ -1643,17 +1724,29 @@ function resolveCacheDir(cacheBase, packageName, version) {
1643
1724
  const segments = packagePathSegments(packageName);
1644
1725
  return join(cacheBase, ...segments, version);
1645
1726
  }
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
1727
  function ensurePackageInCache(packageName, version = "latest", options = {}) {
1652
1728
  const cacheBase = options.cacheBase ?? DEFAULT_CACHE_BASE;
1729
+ let resolvedVersion;
1730
+ if (isLatestRequest(version)) {
1731
+ resolvedVersion = resolveLatestVersionFromRegistry(packageName);
1732
+ } else {
1733
+ resolvedVersion = version;
1734
+ }
1735
+ const cacheDir = resolveCacheDir(cacheBase, packageName, resolvedVersion);
1736
+ const packageJsonPath = join(cacheDir, "package.json");
1737
+ const nodeModulesPath = join(cacheDir, "node_modules");
1738
+ if (existsSync(packageJsonPath) && existsSync(nodeModulesPath)) {
1739
+ const cachedVersion = getCachedPackageVersion(cacheDir);
1740
+ if (cachedVersion === resolvedVersion) {
1741
+ options.afterInstall?.(cacheDir, packageName);
1742
+ return cacheDir;
1743
+ }
1744
+ rmSync(cacheDir, { recursive: true, force: true });
1745
+ }
1653
1746
  const packDest = join(cacheBase, ".pack-tmp", packageName.replace(/@/g, "").replace(/\//g, "_"));
1654
1747
  mkdirSync(packDest, { recursive: true });
1655
1748
  try {
1656
- execSync(`npm pack ${packageName}@${version} --pack-destination "${packDest}"`, {
1749
+ execSync(`npm pack ${packageName}@${resolvedVersion} --pack-destination "${packDest}"`, {
1657
1750
  cwd: process.cwd(),
1658
1751
  stdio: "pipe",
1659
1752
  encoding: "utf-8"
@@ -1663,15 +1756,6 @@ function ensurePackageInCache(packageName, version = "latest", options = {}) {
1663
1756
  if (!tgz) {
1664
1757
  throw new Error(`npm pack did not produce a .tgz in ${packDest}`);
1665
1758
  }
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
1759
  const extractDir = join(packDest, "extract");
1676
1760
  mkdirSync(extractDir, { recursive: true });
1677
1761
  execSync(`tar -xzf "${join(packDest, tgz)}" -C "${extractDir}"`, {
@@ -1808,34 +1892,95 @@ function parseNpmDescriptor(entry) {
1808
1892
  const version = rest.slice(at + 1).split("#")[0]?.trim() || "latest";
1809
1893
  return { packageName, version };
1810
1894
  }
1811
- function loadExtensionFromToolYamlNodeModules(configFilePath, stepLog) {
1895
+ function loadExtensionFromFileDescriptorSync(descriptor, configFilePath, stepLog) {
1896
+ const entryStr = descriptor.trim();
1897
+ const path = parseToolPath(entryStr);
1898
+ if (!path || path.protocol !== "file") return null;
1899
+ const localPath = isAbsolute(configFilePath) ? configFilePath : resolve(process.cwd(), configFilePath);
1900
+ const configDir = dirname(localPath);
1901
+ const pathPart = `${path.scope}/${path.packageWithVersion}`;
1902
+ const resolvedPath = resolve(configDir, pathPart);
1903
+ if (!existsSync(resolvedPath) || !statSync(resolvedPath).isDirectory()) return null;
1904
+ try {
1905
+ const entryPath = getPackageEntryPath(resolvedPath);
1906
+ const req = createRequire(join(resolvedPath, "package.json"));
1907
+ const mod = req(entryPath);
1908
+ const fn = getRegisterFn(mod);
1909
+ if (typeof fn === "function") {
1910
+ if (stepLog) stepLog(`Loaded local extension from ${resolvedPath}`);
1911
+ return { register: fn, descriptor: entryStr, resolvedVersion: "local" };
1912
+ }
1913
+ } catch {
1914
+ }
1915
+ return null;
1916
+ }
1917
+ function loadExtensionForDescriptorSync(descriptor, configFilePath, stepLog) {
1918
+ const entryStr = descriptor.trim();
1919
+ const parsed = parseNpmDescriptor(entryStr);
1920
+ if (!parsed) return null;
1812
1921
  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
1922
  const configDir = dirname(localPath);
1818
1923
  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;
1924
+ const useNodeModules = existsSync(packageJsonPath);
1925
+ const configRequire = useNodeModules ? createRequire(packageJsonPath) : null;
1926
+ if (configRequire) {
1826
1927
  try {
1827
1928
  const mod = configRequire(parsed.packageName);
1828
1929
  const fn = getRegisterFn(mod);
1829
1930
  if (typeof fn === "function") {
1830
- const resolvedVersion = getInstalledPackageVersionFromRequire(parsed.packageName, configRequire) ?? "latest";
1931
+ const installed = getInstalledPackageVersionFromRequire(parsed.packageName, configRequire);
1932
+ const requested = parsed.version === "latest" || !parsed.version?.trim() ? null : parsed.version;
1933
+ const resolvedVersion = installed ?? (requested === null ? resolveLatestVersionFromRegistry(parsed.packageName) : requested);
1934
+ if (requested === null || installed === requested) {
1935
+ if (stepLog) stepLog(`Loaded ${parsed.packageName}@${resolvedVersion} from node_modules`);
1936
+ return { register: fn, descriptor: entryStr, resolvedVersion };
1937
+ }
1938
+ }
1939
+ } catch {
1940
+ }
1941
+ }
1942
+ const cacheBase = getCacheBaseFromToolConfig(localPath);
1943
+ const cacheOpts = cacheBase ? { cacheBase } : {};
1944
+ for (const opts of [cacheOpts, {}]) {
1945
+ try {
1946
+ const cacheDir = ensurePackageInCache(parsed.packageName, parsed.version, opts);
1947
+ if (stepLog) stepLog(`Loaded ${parsed.packageName} from cache: ${cacheDir}`);
1948
+ const entryPath = getPackageEntryPath(cacheDir);
1949
+ const req = createRequire(join(cacheDir, "package.json"));
1950
+ const mod = req(entryPath);
1951
+ const fn = getRegisterFn(mod);
1952
+ if (typeof fn === "function") {
1953
+ const resolvedVersion = basename(cacheDir);
1831
1954
  return { register: fn, descriptor: entryStr, resolvedVersion };
1832
1955
  }
1956
+ break;
1833
1957
  } catch {
1834
- continue;
1958
+ if (Object.keys(opts).length > 0) continue;
1959
+ break;
1835
1960
  }
1836
1961
  }
1837
1962
  return null;
1838
1963
  }
1964
+ function loadAllExtensionsFromToolYamlSync(configFilePath, stepLog) {
1965
+ const localPath = isAbsolute(configFilePath) ? configFilePath : resolve(process.cwd(), configFilePath);
1966
+ if (!existsSync(localPath)) return [];
1967
+ const config = loadToolConfig(localPath);
1968
+ const tools = config.tools;
1969
+ if (!Array.isArray(tools) || tools.length === 0) return [];
1970
+ if (stepLog) stepLog("Loading extensions from tool.yaml (npm + file)");
1971
+ const loaded = [];
1972
+ for (const entry of tools) {
1973
+ const entryStr = String(entry).trim();
1974
+ if (entryStr.startsWith("npm:")) {
1975
+ const result = loadExtensionForDescriptorSync(entryStr, configFilePath, stepLog);
1976
+ if (result) loaded.push(result);
1977
+ } else if (entryStr.startsWith("file:")) {
1978
+ const result = loadExtensionFromFileDescriptorSync(entryStr, configFilePath, stepLog);
1979
+ if (result) loaded.push(result);
1980
+ }
1981
+ }
1982
+ return loaded;
1983
+ }
1839
1984
  function getInstalledPackageVersionFromRequire(packageName, req) {
1840
1985
  try {
1841
1986
  const pkgJsonPath = req.resolve(`${packageName}/package.json`);
@@ -1846,114 +1991,84 @@ function getInstalledPackageVersionFromRequire(packageName, req) {
1846
1991
  return null;
1847
1992
  }
1848
1993
  }
1849
- function loadExtensionFromToolYamlCache(configFilePath, stepLog) {
1994
+ async function loadExtensionForDescriptorAsync(descriptor, configFilePath, stepLog) {
1995
+ const syncResult = loadExtensionForDescriptorSync(descriptor, configFilePath, stepLog);
1996
+ if (syncResult) return syncResult;
1997
+ const entryStr = descriptor.trim();
1998
+ const parsed = parseNpmDescriptor(entryStr);
1999
+ if (!parsed) return null;
1850
2000
  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
2001
  const cacheBase = getCacheBaseFromToolConfig(localPath);
1856
2002
  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;
2003
+ for (const opts of [cacheOpts, {}]) {
2004
+ try {
2005
+ const cacheDir = ensurePackageInCache(parsed.packageName, parsed.version, opts);
2006
+ if (stepLog) stepLog(`Loaded ${parsed.packageName} from cache (async): ${cacheDir}`);
2007
+ const mod = await importFromCache(cacheDir);
2008
+ const fn = getRegisterFn(mod);
2009
+ if (typeof fn === "function") {
2010
+ const resolvedVersion = basename(cacheDir);
2011
+ return { register: fn, descriptor: entryStr, resolvedVersion };
1879
2012
  }
2013
+ break;
2014
+ } catch {
2015
+ if (Object.keys(opts).length > 0) continue;
2016
+ break;
1880
2017
  }
1881
2018
  }
1882
2019
  return null;
1883
2020
  }
1884
- async function loadExtensionFromToolYamlCacheAsync(configFilePath, stepLog) {
2021
+ async function loadAllExtensionsFromToolYamlAsync(configFilePath, stepLog) {
1885
2022
  const localPath = isAbsolute(configFilePath) ? configFilePath : resolve(process.cwd(), configFilePath);
1886
- if (!existsSync(localPath)) return null;
2023
+ if (!existsSync(localPath)) return [];
1887
2024
  const config = loadToolConfig(localPath);
1888
2025
  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)");
2026
+ if (!Array.isArray(tools) || tools.length === 0) return [];
2027
+ if (stepLog) stepLog("Loading extensions from tool.yaml (async)");
2028
+ const loaded = [];
1893
2029
  for (const entry of tools) {
1894
2030
  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
- }
2031
+ if (entryStr.startsWith("npm:")) {
2032
+ const result = await loadExtensionForDescriptorAsync(entryStr, configFilePath, stepLog);
2033
+ if (result) loaded.push(result);
2034
+ } else if (entryStr.startsWith("file:")) {
2035
+ const result = loadExtensionFromFileDescriptorSync(entryStr, configFilePath, stepLog);
2036
+ if (result) loaded.push(result);
1913
2037
  }
1914
2038
  }
1915
- return null;
2039
+ return loaded;
1916
2040
  }
1917
2041
  function createRuntimeFromConfigSync(options = {}) {
1918
2042
  const registry = new ToolRegistry();
1919
2043
  const stepLog = options.stepLog;
1920
2044
  if (options.coreTools !== void 0) {
2045
+ if (options.configFilePath) {
2046
+ const all = loadAllExtensionsFromToolYamlSync(options.configFilePath, stepLog);
2047
+ if (all.length > 0) {
2048
+ if (stepLog) stepLog(`Registered ${all.length} extension(s) from tool.yaml`);
2049
+ const runtime3 = new PTCRuntime({ registry });
2050
+ for (const ext of all) {
2051
+ const prefix = ext.descriptor.startsWith("file:") ? fileDescriptorToRegistryPrefix(ext.descriptor) : npmDescriptorToRegistryPrefix(ext.descriptor, ext.resolvedVersion);
2052
+ const reg = prefix ? createPrefixingRegistry(registry, prefix) : registry;
2053
+ const adapter = ext.register(reg, options.coreTools);
2054
+ runtime3.registerAdapter(adapter);
2055
+ }
2056
+ return { runtime: runtime3, registry };
2057
+ }
2058
+ }
1921
2059
  if (stepLog) stepLog("Trying extension from node_modules");
1922
- let extensionNode = loadExtensionFromNodeModules();
2060
+ const extensionNode = loadExtensionFromNodeModules();
1923
2061
  if (extensionNode) {
1924
2062
  if (stepLog) stepLog("Registered extension from node_modules");
1925
2063
  const descriptor = `npm:${extensionNode.packageName}`;
1926
- const resolvedVersion = getInstalledPackageVersion(extensionNode.packageName);
1927
- const prefix = npmDescriptorToRegistryPrefix(descriptor, resolvedVersion ?? void 0);
2064
+ const resolvedVersion = getInstalledPackageVersion(extensionNode.packageName) ?? resolveLatestVersionFromRegistry(extensionNode.packageName);
2065
+ const prefix = npmDescriptorToRegistryPrefix(descriptor, resolvedVersion);
1928
2066
  const reg = prefix ? createPrefixingRegistry(registry, prefix) : registry;
1929
2067
  const coreAdapter = extensionNode.register(reg, options.coreTools);
1930
2068
  const runtime3 = new PTCRuntime({ registry });
1931
2069
  runtime3.registerAdapter(coreAdapter);
1932
2070
  return { runtime: runtime3, registry };
1933
2071
  }
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
2072
  const runtime2 = new PTCRuntime({ registry });
1958
2073
  return { runtime: runtime2, registry };
1959
2074
  }
@@ -1962,27 +2077,17 @@ function createRuntimeFromConfigSync(options = {}) {
1962
2077
  }
1963
2078
  async function createRuntimeFromConfig(options = {}) {
1964
2079
  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)");
2080
+ const all = await loadAllExtensionsFromToolYamlAsync(options.configFilePath, options.stepLog);
2081
+ if (all.length > 0) {
2082
+ if (options.stepLog) options.stepLog(`Registered ${all.length} extension(s) from tool.yaml`);
1968
2083
  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
2084
  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);
2085
+ for (const ext of all) {
2086
+ const prefix = ext.descriptor.startsWith("file:") ? fileDescriptorToRegistryPrefix(ext.descriptor) : npmDescriptorToRegistryPrefix(ext.descriptor, ext.resolvedVersion);
2087
+ const reg = prefix ? createPrefixingRegistry(registry, prefix) : registry;
2088
+ const adapter = ext.register(reg, options.coreTools);
2089
+ runtime.registerAdapter(adapter);
2090
+ }
1986
2091
  return { runtime, registry };
1987
2092
  }
1988
2093
  }
@@ -1996,6 +2101,6 @@ var MCP_KIND = "mcp";
1996
2101
  var LANGCHAIN_KIND = "langchain";
1997
2102
  var LANGCHAIN_DIR_NAME = "langchain";
1998
2103
 
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
2104
+ 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 };
2105
+ //# sourceMappingURL=chunk-PSVSVTHY.js.map
2106
+ //# sourceMappingURL=chunk-PSVSVTHY.js.map