@easynet/agent-tool 1.0.34 → 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 +2 -2
  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 +106 -69
  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 +58 -25
  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
@@ -1519,8 +1519,20 @@ function npmDescriptorToRegistryPrefix(descriptor, resolvedVersion) {
1519
1519
  const lastAt = beforeHash.lastIndexOf("@");
1520
1520
  const scopeAndPackage = lastAt <= 0 ? beforeHash : beforeHash.slice(0, lastAt);
1521
1521
  let version = lastAt <= 0 ? "latest" : beforeHash.slice(lastAt + 1).trim() || "latest";
1522
- if ((version === "latest" || !version) && resolvedVersion != null && resolvedVersion !== "") {
1523
- version = resolvedVersion;
1522
+ if (version === "latest" || !version) {
1523
+ const resolved = (resolvedVersion ?? "").trim();
1524
+ if (resolved !== "" && resolved.toLowerCase() !== "latest") {
1525
+ version = resolved;
1526
+ } else {
1527
+ throw new Error(
1528
+ `Registry prefix requires a concrete version when descriptor uses latest (${descriptor}). Resolve version from registry (e.g. resolveLatestVersionFromRegistry) and pass as resolvedVersion.`
1529
+ );
1530
+ }
1531
+ }
1532
+ if (!version || version.toLowerCase() === "latest") {
1533
+ throw new Error(
1534
+ `Registry never uses "latest"; pass resolved concrete version for npm descriptor: ${descriptor}`
1535
+ );
1524
1536
  }
1525
1537
  const slashIdx = scopeAndPackage.indexOf("/");
1526
1538
  const scope = slashIdx < 0 ? scopeAndPackage : scopeAndPackage.slice(0, slashIdx).replace(/^@/, "");
@@ -1530,6 +1542,23 @@ function npmDescriptorToRegistryPrefix(descriptor, resolvedVersion) {
1530
1542
  if (!normalized) return "";
1531
1543
  return "npm." + normalized + ".";
1532
1544
  }
1545
+ function npmDescriptorToPackagePrefixWithVersion(descriptor) {
1546
+ const s = descriptor.trim();
1547
+ if (typeof s !== "string" || !s.startsWith("npm:")) return "";
1548
+ const rest = s.slice(4).trim();
1549
+ const hashIdx = rest.indexOf("#");
1550
+ const beforeHash = hashIdx < 0 ? rest : rest.slice(0, hashIdx);
1551
+ const lastAt = beforeHash.lastIndexOf("@");
1552
+ const scopeAndPackage = lastAt <= 0 ? beforeHash : beforeHash.slice(0, lastAt);
1553
+ const version = lastAt <= 0 ? "" : beforeHash.slice(lastAt + 1).trim();
1554
+ const slashIdx = scopeAndPackage.indexOf("/");
1555
+ const scope = slashIdx < 0 ? scopeAndPackage : scopeAndPackage.slice(0, slashIdx).replace(/^@/, "");
1556
+ const pkg = slashIdx < 0 ? "" : scopeAndPackage.slice(slashIdx + 1);
1557
+ const segment = [scope, pkg, version].filter(Boolean).join(".");
1558
+ const normalized = chunkDYDNPIV2_cjs.normalizeToolName(segment);
1559
+ if (!normalized) return "";
1560
+ return "npm." + normalized;
1561
+ }
1533
1562
  function isNpmToolDescriptor(descriptor) {
1534
1563
  return isToolPath(descriptor) && parseToolPath(descriptor)?.protocol === "npm";
1535
1564
  }
@@ -1598,6 +1627,18 @@ function normalizeToolList(descriptors) {
1598
1627
  }
1599
1628
  return out;
1600
1629
  }
1630
+ function fileDescriptorToPackagePrefix(descriptor) {
1631
+ const path = parseToolPath(descriptor.trim());
1632
+ if (!path || path.protocol !== "file") return "";
1633
+ const pathPart = `${path.scope}/${path.packageWithVersion}`;
1634
+ const normalized = chunkDYDNPIV2_cjs.normalizeToolName(pathPart);
1635
+ if (!normalized) return "";
1636
+ return "file." + normalized;
1637
+ }
1638
+ function fileDescriptorToRegistryPrefix(descriptor) {
1639
+ const prefix = fileDescriptorToPackagePrefix(descriptor);
1640
+ return prefix ? prefix + "." : "";
1641
+ }
1601
1642
  function loadToolConfig(toolYamlPath) {
1602
1643
  const abs = path.resolve(toolYamlPath);
1603
1644
  const raw = fs.readFileSync(abs, "utf8");
@@ -1605,20 +1646,29 @@ function loadToolConfig(toolYamlPath) {
1605
1646
  if (!parsed || typeof parsed !== "object") return {};
1606
1647
  const toolsBlock = parsed.tools;
1607
1648
  if (toolsBlock != null && typeof toolsBlock === "object" && !Array.isArray(toolsBlock)) {
1649
+ const toolDefaults = toolsBlock.defaults != null && typeof toolsBlock.defaults === "object" && !Array.isArray(toolsBlock.defaults) ? toolsBlock.defaults : void 0;
1650
+ const packageToolDefaults2 = toolsBlock.packages != null && typeof toolsBlock.packages === "object" && !Array.isArray(toolsBlock.packages) ? toolsBlock.packages : void 0;
1651
+ const list2 = Array.isArray(toolsBlock.list) && toolsBlock.list.length > 0 ? toolsBlock.list : void 0;
1608
1652
  return {
1609
- tools: Array.isArray(toolsBlock.list) ? toolsBlock.list : void 0,
1653
+ tools: list2 ?? (packageToolDefaults2 ? Object.keys(packageToolDefaults2) : void 0),
1610
1654
  sandboxedPath: typeof toolsBlock.sandboxedPath === "string" ? toolsBlock.sandboxedPath : parsed.sandboxedPath,
1611
1655
  allowedHosts: Array.isArray(toolsBlock.allowedHosts) ? toolsBlock.allowedHosts : parsed.allowedHosts,
1612
1656
  blockedHosts: Array.isArray(toolsBlock.blockedHosts) ? toolsBlock.blockedHosts : parsed.blockedHosts,
1613
- blockedCidrs: Array.isArray(toolsBlock.blockedCidrs) ? toolsBlock.blockedCidrs : parsed.blockedCidrs
1657
+ blockedCidrs: Array.isArray(toolsBlock.blockedCidrs) ? toolsBlock.blockedCidrs : parsed.blockedCidrs,
1658
+ toolDefaults,
1659
+ packageToolDefaults: packageToolDefaults2
1614
1660
  };
1615
1661
  }
1662
+ const packageToolDefaults = typeof parsed.packageToolDefaults === "object" && !Array.isArray(parsed.packageToolDefaults) ? parsed.packageToolDefaults : void 0;
1663
+ const list = Array.isArray(parsed.tools) && parsed.tools.length > 0 ? parsed.tools : void 0;
1616
1664
  return {
1617
- tools: Array.isArray(parsed.tools) ? parsed.tools : void 0,
1665
+ tools: list ?? (packageToolDefaults ? Object.keys(packageToolDefaults) : void 0),
1618
1666
  sandboxedPath: parsed.sandboxedPath,
1619
1667
  allowedHosts: Array.isArray(parsed.allowedHosts) ? parsed.allowedHosts : void 0,
1620
1668
  blockedHosts: Array.isArray(parsed.blockedHosts) ? parsed.blockedHosts : void 0,
1621
- blockedCidrs: Array.isArray(parsed.blockedCidrs) ? parsed.blockedCidrs : void 0
1669
+ blockedCidrs: Array.isArray(parsed.blockedCidrs) ? parsed.blockedCidrs : void 0,
1670
+ toolDefaults: typeof parsed.toolDefaults === "object" && !Array.isArray(parsed.toolDefaults) ? parsed.toolDefaults : void 0,
1671
+ packageToolDefaults
1622
1672
  };
1623
1673
  }
1624
1674
  function resolveSandboxedPath(toolYamlPath, sandboxedPath) {
@@ -1645,6 +1695,37 @@ function findAndLoadToolConfig(dir) {
1645
1695
  return {};
1646
1696
  }
1647
1697
  var DEFAULT_CACHE_BASE = path.join(os.homedir(), ".agent", "cache");
1698
+ function isLatestRequest(version) {
1699
+ const v = (version ?? "").trim().toLowerCase();
1700
+ return v === "" || v === "latest";
1701
+ }
1702
+ function resolveLatestVersionFromRegistry(packageName) {
1703
+ const quoted = packageName.includes(" ") ? `"${packageName}"` : packageName;
1704
+ try {
1705
+ const out = child_process.execSync(`npm view ${quoted} version`, {
1706
+ encoding: "utf-8",
1707
+ stdio: ["pipe", "pipe", "pipe"]
1708
+ });
1709
+ const version = (out ?? "").trim();
1710
+ if (!version) {
1711
+ throw new Error(`npm view ${packageName} version returned empty`);
1712
+ }
1713
+ return version;
1714
+ } catch (err) {
1715
+ const msg = err instanceof Error ? err.message : String(err);
1716
+ throw new Error(`Failed to resolve latest version for ${packageName}: ${msg}`);
1717
+ }
1718
+ }
1719
+ function getCachedPackageVersion(cacheDir) {
1720
+ const pkgPath = path.join(cacheDir, "package.json");
1721
+ if (!fs.existsSync(pkgPath)) return void 0;
1722
+ try {
1723
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
1724
+ return typeof pkg.version === "string" ? pkg.version : void 0;
1725
+ } catch {
1726
+ return void 0;
1727
+ }
1728
+ }
1648
1729
  function packagePathSegments(name) {
1649
1730
  const withoutScope = name.replace(/^@/, "");
1650
1731
  return withoutScope.split("/").filter(Boolean);
@@ -1653,17 +1734,29 @@ function resolveCacheDir(cacheBase, packageName, version) {
1653
1734
  const segments = packagePathSegments(packageName);
1654
1735
  return path.join(cacheBase, ...segments, version);
1655
1736
  }
1656
- function getVersionFromTarball(tgzName) {
1657
- const base = tgzName.replace(/\.tgz$/i, "");
1658
- const match = base.match(/-(\d+\.\d+\.\d+(-[a-zA-Z0-9.-]+)?)$/);
1659
- return match ? match[1] : base;
1660
- }
1661
1737
  function ensurePackageInCache(packageName, version = "latest", options = {}) {
1662
1738
  const cacheBase = options.cacheBase ?? DEFAULT_CACHE_BASE;
1739
+ let resolvedVersion;
1740
+ if (isLatestRequest(version)) {
1741
+ resolvedVersion = resolveLatestVersionFromRegistry(packageName);
1742
+ } else {
1743
+ resolvedVersion = version;
1744
+ }
1745
+ const cacheDir = resolveCacheDir(cacheBase, packageName, resolvedVersion);
1746
+ const packageJsonPath = path.join(cacheDir, "package.json");
1747
+ const nodeModulesPath = path.join(cacheDir, "node_modules");
1748
+ if (fs.existsSync(packageJsonPath) && fs.existsSync(nodeModulesPath)) {
1749
+ const cachedVersion = getCachedPackageVersion(cacheDir);
1750
+ if (cachedVersion === resolvedVersion) {
1751
+ options.afterInstall?.(cacheDir, packageName);
1752
+ return cacheDir;
1753
+ }
1754
+ fs.rmSync(cacheDir, { recursive: true, force: true });
1755
+ }
1663
1756
  const packDest = path.join(cacheBase, ".pack-tmp", packageName.replace(/@/g, "").replace(/\//g, "_"));
1664
1757
  fs.mkdirSync(packDest, { recursive: true });
1665
1758
  try {
1666
- child_process.execSync(`npm pack ${packageName}@${version} --pack-destination "${packDest}"`, {
1759
+ child_process.execSync(`npm pack ${packageName}@${resolvedVersion} --pack-destination "${packDest}"`, {
1667
1760
  cwd: process.cwd(),
1668
1761
  stdio: "pipe",
1669
1762
  encoding: "utf-8"
@@ -1673,15 +1766,6 @@ function ensurePackageInCache(packageName, version = "latest", options = {}) {
1673
1766
  if (!tgz) {
1674
1767
  throw new Error(`npm pack did not produce a .tgz in ${packDest}`);
1675
1768
  }
1676
- const resolvedVersion = getVersionFromTarball(tgz);
1677
- const cacheDir = resolveCacheDir(cacheBase, packageName, resolvedVersion);
1678
- const packageJsonPath = path.join(cacheDir, "package.json");
1679
- const nodeModulesPath = path.join(cacheDir, "node_modules");
1680
- if (fs.existsSync(packageJsonPath) && fs.existsSync(nodeModulesPath)) {
1681
- options.afterInstall?.(cacheDir, packageName);
1682
- fs.rmSync(packDest, { recursive: true, force: true });
1683
- return cacheDir;
1684
- }
1685
1769
  const extractDir = path.join(packDest, "extract");
1686
1770
  fs.mkdirSync(extractDir, { recursive: true });
1687
1771
  child_process.execSync(`tar -xzf "${path.join(packDest, tgz)}" -C "${extractDir}"`, {
@@ -1731,7 +1815,7 @@ async function importFromCache(packageRoot) {
1731
1815
  fileUrl
1732
1816
  );
1733
1817
  }
1734
- var requireFromPackage = module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('chunk-PKUSCCS6.cjs', document.baseURI).href)));
1818
+ var requireFromPackage = module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('chunk-2WDDJYR7.cjs', document.baseURI).href)));
1735
1819
  function getProjectRequire() {
1736
1820
  const cwd = process.cwd();
1737
1821
  if (fs.existsSync(path.join(cwd, "package.json"))) return module$1.createRequire(path.join(cwd, "package.json"));
@@ -1818,34 +1902,95 @@ function parseNpmDescriptor(entry) {
1818
1902
  const version = rest.slice(at + 1).split("#")[0]?.trim() || "latest";
1819
1903
  return { packageName, version };
1820
1904
  }
1821
- function loadExtensionFromToolYamlNodeModules(configFilePath, stepLog) {
1905
+ function loadExtensionFromFileDescriptorSync(descriptor, configFilePath, stepLog) {
1906
+ const entryStr = descriptor.trim();
1907
+ const path$1 = parseToolPath(entryStr);
1908
+ if (!path$1 || path$1.protocol !== "file") return null;
1909
+ const localPath = path.isAbsolute(configFilePath) ? configFilePath : path.resolve(process.cwd(), configFilePath);
1910
+ const configDir = path.dirname(localPath);
1911
+ const pathPart = `${path$1.scope}/${path$1.packageWithVersion}`;
1912
+ const resolvedPath = path.resolve(configDir, pathPart);
1913
+ if (!fs.existsSync(resolvedPath) || !fs.statSync(resolvedPath).isDirectory()) return null;
1914
+ try {
1915
+ const entryPath = getPackageEntryPath(resolvedPath);
1916
+ const req = module$1.createRequire(path.join(resolvedPath, "package.json"));
1917
+ const mod = req(entryPath);
1918
+ const fn = getRegisterFn(mod);
1919
+ if (typeof fn === "function") {
1920
+ if (stepLog) stepLog(`Loaded local extension from ${resolvedPath}`);
1921
+ return { register: fn, descriptor: entryStr, resolvedVersion: "local" };
1922
+ }
1923
+ } catch {
1924
+ }
1925
+ return null;
1926
+ }
1927
+ function loadExtensionForDescriptorSync(descriptor, configFilePath, stepLog) {
1928
+ const entryStr = descriptor.trim();
1929
+ const parsed = parseNpmDescriptor(entryStr);
1930
+ if (!parsed) return null;
1822
1931
  const localPath = path.isAbsolute(configFilePath) ? configFilePath : path.resolve(process.cwd(), configFilePath);
1823
- if (!fs.existsSync(localPath)) return null;
1824
- const config = loadToolConfig(localPath);
1825
- const tools = config.tools;
1826
- if (!Array.isArray(tools) || tools.length === 0) return null;
1827
1932
  const configDir = path.dirname(localPath);
1828
1933
  const packageJsonPath = path.join(configDir, "package.json");
1829
- if (!fs.existsSync(packageJsonPath)) return null;
1830
- const configRequire = module$1.createRequire(packageJsonPath);
1831
- if (stepLog) stepLog("Trying tool.yaml npm entries from node_modules");
1832
- for (const entry of tools) {
1833
- const entryStr = String(entry).trim();
1834
- const parsed = parseNpmDescriptor(entryStr);
1835
- if (!parsed) continue;
1934
+ const useNodeModules = fs.existsSync(packageJsonPath);
1935
+ const configRequire = useNodeModules ? module$1.createRequire(packageJsonPath) : null;
1936
+ if (configRequire) {
1836
1937
  try {
1837
1938
  const mod = configRequire(parsed.packageName);
1838
1939
  const fn = getRegisterFn(mod);
1839
1940
  if (typeof fn === "function") {
1840
- const resolvedVersion = getInstalledPackageVersionFromRequire(parsed.packageName, configRequire) ?? "latest";
1941
+ const installed = getInstalledPackageVersionFromRequire(parsed.packageName, configRequire);
1942
+ const requested = parsed.version === "latest" || !parsed.version?.trim() ? null : parsed.version;
1943
+ const resolvedVersion = installed ?? (requested === null ? resolveLatestVersionFromRegistry(parsed.packageName) : requested);
1944
+ if (requested === null || installed === requested) {
1945
+ if (stepLog) stepLog(`Loaded ${parsed.packageName}@${resolvedVersion} from node_modules`);
1946
+ return { register: fn, descriptor: entryStr, resolvedVersion };
1947
+ }
1948
+ }
1949
+ } catch {
1950
+ }
1951
+ }
1952
+ const cacheBase = getCacheBaseFromToolConfig(localPath);
1953
+ const cacheOpts = cacheBase ? { cacheBase } : {};
1954
+ for (const opts of [cacheOpts, {}]) {
1955
+ try {
1956
+ const cacheDir = ensurePackageInCache(parsed.packageName, parsed.version, opts);
1957
+ if (stepLog) stepLog(`Loaded ${parsed.packageName} from cache: ${cacheDir}`);
1958
+ const entryPath = getPackageEntryPath(cacheDir);
1959
+ const req = module$1.createRequire(path.join(cacheDir, "package.json"));
1960
+ const mod = req(entryPath);
1961
+ const fn = getRegisterFn(mod);
1962
+ if (typeof fn === "function") {
1963
+ const resolvedVersion = path.basename(cacheDir);
1841
1964
  return { register: fn, descriptor: entryStr, resolvedVersion };
1842
1965
  }
1966
+ break;
1843
1967
  } catch {
1844
- continue;
1968
+ if (Object.keys(opts).length > 0) continue;
1969
+ break;
1845
1970
  }
1846
1971
  }
1847
1972
  return null;
1848
1973
  }
1974
+ function loadAllExtensionsFromToolYamlSync(configFilePath, stepLog) {
1975
+ const localPath = path.isAbsolute(configFilePath) ? configFilePath : path.resolve(process.cwd(), configFilePath);
1976
+ if (!fs.existsSync(localPath)) return [];
1977
+ const config = loadToolConfig(localPath);
1978
+ const tools = config.tools;
1979
+ if (!Array.isArray(tools) || tools.length === 0) return [];
1980
+ if (stepLog) stepLog("Loading extensions from tool.yaml (npm + file)");
1981
+ const loaded = [];
1982
+ for (const entry of tools) {
1983
+ const entryStr = String(entry).trim();
1984
+ if (entryStr.startsWith("npm:")) {
1985
+ const result = loadExtensionForDescriptorSync(entryStr, configFilePath, stepLog);
1986
+ if (result) loaded.push(result);
1987
+ } else if (entryStr.startsWith("file:")) {
1988
+ const result = loadExtensionFromFileDescriptorSync(entryStr, configFilePath, stepLog);
1989
+ if (result) loaded.push(result);
1990
+ }
1991
+ }
1992
+ return loaded;
1993
+ }
1849
1994
  function getInstalledPackageVersionFromRequire(packageName, req) {
1850
1995
  try {
1851
1996
  const pkgJsonPath = req.resolve(`${packageName}/package.json`);
@@ -1856,114 +2001,84 @@ function getInstalledPackageVersionFromRequire(packageName, req) {
1856
2001
  return null;
1857
2002
  }
1858
2003
  }
1859
- function loadExtensionFromToolYamlCache(configFilePath, stepLog) {
2004
+ async function loadExtensionForDescriptorAsync(descriptor, configFilePath, stepLog) {
2005
+ const syncResult = loadExtensionForDescriptorSync(descriptor, configFilePath, stepLog);
2006
+ if (syncResult) return syncResult;
2007
+ const entryStr = descriptor.trim();
2008
+ const parsed = parseNpmDescriptor(entryStr);
2009
+ if (!parsed) return null;
1860
2010
  const localPath = path.isAbsolute(configFilePath) ? configFilePath : path.resolve(process.cwd(), configFilePath);
1861
- if (!fs.existsSync(localPath)) return null;
1862
- const config = loadToolConfig(localPath);
1863
- const tools = config.tools;
1864
- if (!Array.isArray(tools)) return null;
1865
2011
  const cacheBase = getCacheBaseFromToolConfig(localPath);
1866
2012
  const cacheOpts = cacheBase ? { cacheBase } : {};
1867
- if (stepLog) stepLog(`Loading extension from tool.yaml cache (cacheBase: ${cacheBase ?? "~/.agent/cache"})`);
1868
- for (const entry of tools) {
1869
- const entryStr = String(entry).trim();
1870
- const parsed = parseNpmDescriptor(entryStr);
1871
- if (!parsed) continue;
1872
- for (const opts of [cacheOpts, {}]) {
1873
- try {
1874
- if (stepLog && Object.keys(opts).length === 0 && cacheBase) stepLog("Falling back to default cache ~/.agent/cache");
1875
- const cacheDir = ensurePackageInCache(parsed.packageName, parsed.version, opts);
1876
- if (stepLog) stepLog(`Using cache: ${cacheDir}`);
1877
- const entryPath = getPackageEntryPath(cacheDir);
1878
- const req = module$1.createRequire(path.join(cacheDir, "package.json"));
1879
- const mod = req(entryPath);
1880
- const fn = getRegisterFn(mod);
1881
- if (typeof fn === "function") {
1882
- const resolvedVersion = path.basename(cacheDir);
1883
- return { register: fn, descriptor: entryStr, resolvedVersion };
1884
- }
1885
- break;
1886
- } catch {
1887
- if (Object.keys(opts).length > 0) continue;
1888
- break;
2013
+ for (const opts of [cacheOpts, {}]) {
2014
+ try {
2015
+ const cacheDir = ensurePackageInCache(parsed.packageName, parsed.version, opts);
2016
+ if (stepLog) stepLog(`Loaded ${parsed.packageName} from cache (async): ${cacheDir}`);
2017
+ const mod = await importFromCache(cacheDir);
2018
+ const fn = getRegisterFn(mod);
2019
+ if (typeof fn === "function") {
2020
+ const resolvedVersion = path.basename(cacheDir);
2021
+ return { register: fn, descriptor: entryStr, resolvedVersion };
1889
2022
  }
2023
+ break;
2024
+ } catch {
2025
+ if (Object.keys(opts).length > 0) continue;
2026
+ break;
1890
2027
  }
1891
2028
  }
1892
2029
  return null;
1893
2030
  }
1894
- async function loadExtensionFromToolYamlCacheAsync(configFilePath, stepLog) {
2031
+ async function loadAllExtensionsFromToolYamlAsync(configFilePath, stepLog) {
1895
2032
  const localPath = path.isAbsolute(configFilePath) ? configFilePath : path.resolve(process.cwd(), configFilePath);
1896
- if (!fs.existsSync(localPath)) return null;
2033
+ if (!fs.existsSync(localPath)) return [];
1897
2034
  const config = loadToolConfig(localPath);
1898
2035
  const tools = config.tools;
1899
- if (!Array.isArray(tools)) return null;
1900
- const cacheBase = getCacheBaseFromToolConfig(localPath);
1901
- const cacheOpts = cacheBase ? { cacheBase } : {};
1902
- if (stepLog) stepLog("Loading extension from tool.yaml cache (async)");
2036
+ if (!Array.isArray(tools) || tools.length === 0) return [];
2037
+ if (stepLog) stepLog("Loading extensions from tool.yaml (async)");
2038
+ const loaded = [];
1903
2039
  for (const entry of tools) {
1904
2040
  const entryStr = String(entry).trim();
1905
- const parsed = parseNpmDescriptor(entryStr);
1906
- if (!parsed) continue;
1907
- for (const opts of [cacheOpts, {}]) {
1908
- try {
1909
- if (stepLog && Object.keys(opts).length === 0 && cacheBase) stepLog("Falling back to default cache ~/.agent/cache");
1910
- const cacheDir = ensurePackageInCache(parsed.packageName, parsed.version, opts);
1911
- if (stepLog) stepLog(`Using cache: ${cacheDir}`);
1912
- const mod = await importFromCache(cacheDir);
1913
- const fn = getRegisterFn(mod);
1914
- if (typeof fn === "function") {
1915
- const resolvedVersion = path.basename(cacheDir);
1916
- return { register: fn, descriptor: entryStr, resolvedVersion };
1917
- }
1918
- break;
1919
- } catch {
1920
- if (Object.keys(opts).length > 0) continue;
1921
- break;
1922
- }
2041
+ if (entryStr.startsWith("npm:")) {
2042
+ const result = await loadExtensionForDescriptorAsync(entryStr, configFilePath, stepLog);
2043
+ if (result) loaded.push(result);
2044
+ } else if (entryStr.startsWith("file:")) {
2045
+ const result = loadExtensionFromFileDescriptorSync(entryStr, configFilePath, stepLog);
2046
+ if (result) loaded.push(result);
1923
2047
  }
1924
2048
  }
1925
- return null;
2049
+ return loaded;
1926
2050
  }
1927
2051
  function createRuntimeFromConfigSync(options = {}) {
1928
2052
  const registry = new chunkTOSPHMYU_cjs.ToolRegistry();
1929
2053
  const stepLog = options.stepLog;
1930
2054
  if (options.coreTools !== void 0) {
2055
+ if (options.configFilePath) {
2056
+ const all = loadAllExtensionsFromToolYamlSync(options.configFilePath, stepLog);
2057
+ if (all.length > 0) {
2058
+ if (stepLog) stepLog(`Registered ${all.length} extension(s) from tool.yaml`);
2059
+ const runtime3 = new PTCRuntime({ registry });
2060
+ for (const ext of all) {
2061
+ const prefix = ext.descriptor.startsWith("file:") ? fileDescriptorToRegistryPrefix(ext.descriptor) : npmDescriptorToRegistryPrefix(ext.descriptor, ext.resolvedVersion);
2062
+ const reg = prefix ? createPrefixingRegistry(registry, prefix) : registry;
2063
+ const adapter = ext.register(reg, options.coreTools);
2064
+ runtime3.registerAdapter(adapter);
2065
+ }
2066
+ return { runtime: runtime3, registry };
2067
+ }
2068
+ }
1931
2069
  if (stepLog) stepLog("Trying extension from node_modules");
1932
- let extensionNode = loadExtensionFromNodeModules();
2070
+ const extensionNode = loadExtensionFromNodeModules();
1933
2071
  if (extensionNode) {
1934
2072
  if (stepLog) stepLog("Registered extension from node_modules");
1935
2073
  const descriptor = `npm:${extensionNode.packageName}`;
1936
- const resolvedVersion = getInstalledPackageVersion(extensionNode.packageName);
1937
- const prefix = npmDescriptorToRegistryPrefix(descriptor, resolvedVersion ?? void 0);
2074
+ const resolvedVersion = getInstalledPackageVersion(extensionNode.packageName) ?? resolveLatestVersionFromRegistry(extensionNode.packageName);
2075
+ const prefix = npmDescriptorToRegistryPrefix(descriptor, resolvedVersion);
1938
2076
  const reg = prefix ? createPrefixingRegistry(registry, prefix) : registry;
1939
2077
  const coreAdapter = extensionNode.register(reg, options.coreTools);
1940
2078
  const runtime3 = new PTCRuntime({ registry });
1941
2079
  runtime3.registerAdapter(coreAdapter);
1942
2080
  return { runtime: runtime3, registry };
1943
2081
  }
1944
- if (options.configFilePath) {
1945
- const extensionFromNodeModules = loadExtensionFromToolYamlNodeModules(options.configFilePath, stepLog);
1946
- if (extensionFromNodeModules) {
1947
- if (stepLog) stepLog("Registered extension from tool.yaml list (node_modules)");
1948
- const prefix = npmDescriptorToRegistryPrefix(extensionFromNodeModules.descriptor, extensionFromNodeModules.resolvedVersion);
1949
- const reg = prefix ? createPrefixingRegistry(registry, prefix) : registry;
1950
- const coreAdapter = extensionFromNodeModules.register(reg, options.coreTools);
1951
- const runtime3 = new PTCRuntime({ registry });
1952
- runtime3.registerAdapter(coreAdapter);
1953
- return { runtime: runtime3, registry };
1954
- }
1955
- if (stepLog) stepLog("No extension in node_modules, loading from tool.yaml cache");
1956
- const extensionCache = loadExtensionFromToolYamlCache(options.configFilePath, stepLog);
1957
- if (extensionCache) {
1958
- if (stepLog) stepLog("Registered extension from cache");
1959
- const prefix = npmDescriptorToRegistryPrefix(extensionCache.descriptor, extensionCache.resolvedVersion);
1960
- const reg = prefix ? createPrefixingRegistry(registry, prefix) : registry;
1961
- const coreAdapter = extensionCache.register(reg, options.coreTools);
1962
- const runtime3 = new PTCRuntime({ registry });
1963
- runtime3.registerAdapter(coreAdapter);
1964
- return { runtime: runtime3, registry };
1965
- }
1966
- }
1967
2082
  const runtime2 = new PTCRuntime({ registry });
1968
2083
  return { runtime: runtime2, registry };
1969
2084
  }
@@ -1972,27 +2087,17 @@ function createRuntimeFromConfigSync(options = {}) {
1972
2087
  }
1973
2088
  async function createRuntimeFromConfig(options = {}) {
1974
2089
  if (options.coreTools !== void 0 && options.configFilePath) {
1975
- const fromNodeModules = loadExtensionFromToolYamlNodeModules(options.configFilePath, options.stepLog);
1976
- if (fromNodeModules) {
1977
- if (options.stepLog) options.stepLog("Registered extension from tool.yaml list (node_modules)");
2090
+ const all = await loadAllExtensionsFromToolYamlAsync(options.configFilePath, options.stepLog);
2091
+ if (all.length > 0) {
2092
+ if (options.stepLog) options.stepLog(`Registered ${all.length} extension(s) from tool.yaml`);
1978
2093
  const registry = new chunkTOSPHMYU_cjs.ToolRegistry();
1979
- const prefix = npmDescriptorToRegistryPrefix(fromNodeModules.descriptor, fromNodeModules.resolvedVersion);
1980
- const reg = prefix ? createPrefixingRegistry(registry, prefix) : registry;
1981
- const coreAdapter = fromNodeModules.register(reg, options.coreTools);
1982
2094
  const runtime = new PTCRuntime({ registry });
1983
- runtime.registerAdapter(coreAdapter);
1984
- return { runtime, registry };
1985
- }
1986
- if (options.stepLog) options.stepLog("Loading extension from tool.yaml cache (dynamic: npm pack + import)");
1987
- const fromCache = await loadExtensionFromToolYamlCacheAsync(options.configFilePath, options.stepLog);
1988
- if (fromCache) {
1989
- if (options.stepLog) options.stepLog("Registered extension from cache");
1990
- const registry = new chunkTOSPHMYU_cjs.ToolRegistry();
1991
- const prefix = npmDescriptorToRegistryPrefix(fromCache.descriptor, fromCache.resolvedVersion);
1992
- const reg = prefix ? createPrefixingRegistry(registry, prefix) : registry;
1993
- const coreAdapter = fromCache.register(reg, options.coreTools);
1994
- const runtime = new PTCRuntime({ registry });
1995
- runtime.registerAdapter(coreAdapter);
2095
+ for (const ext of all) {
2096
+ const prefix = ext.descriptor.startsWith("file:") ? fileDescriptorToRegistryPrefix(ext.descriptor) : npmDescriptorToRegistryPrefix(ext.descriptor, ext.resolvedVersion);
2097
+ const reg = prefix ? createPrefixingRegistry(registry, prefix) : registry;
2098
+ const adapter = ext.register(reg, options.coreTools);
2099
+ runtime.registerAdapter(adapter);
2100
+ }
1996
2101
  return { runtime, registry };
1997
2102
  }
1998
2103
  }
@@ -2024,6 +2129,7 @@ exports.createRuntimeFromConfig = createRuntimeFromConfig;
2024
2129
  exports.createRuntimeFromConfigSync = createRuntimeFromConfigSync;
2025
2130
  exports.ensurePackageInCache = ensurePackageInCache;
2026
2131
  exports.expandToolDescriptorsToRegistryNames = expandToolDescriptorsToRegistryNames;
2132
+ exports.fileDescriptorToPackagePrefix = fileDescriptorToPackagePrefix;
2027
2133
  exports.findAndLoadToolConfig = findAndLoadToolConfig;
2028
2134
  exports.getDisplayScope = getDisplayScope;
2029
2135
  exports.getPackageEntryPath = getPackageEntryPath;
@@ -2032,12 +2138,14 @@ exports.isBarePackageDescriptor = isBarePackageDescriptor;
2032
2138
  exports.isNpmToolDescriptor = isNpmToolDescriptor;
2033
2139
  exports.loadToolConfig = loadToolConfig;
2034
2140
  exports.normalizeToolList = normalizeToolList;
2141
+ exports.npmDescriptorToPackagePrefixWithVersion = npmDescriptorToPackagePrefixWithVersion;
2035
2142
  exports.npmDescriptorToRegistryPrefix = npmDescriptorToRegistryPrefix;
2036
2143
  exports.parseNpmToolDescriptor = parseNpmToolDescriptor;
2144
+ exports.resolveLatestVersionFromRegistry = resolveLatestVersionFromRegistry;
2037
2145
  exports.resolveNpmToolDescriptor = resolveNpmToolDescriptor;
2038
2146
  exports.resolveSandboxedPath = resolveSandboxedPath;
2039
2147
  exports.resolveToolDescriptor = resolveToolDescriptor;
2040
2148
  exports.sanitizeForLog = sanitizeForLog;
2041
2149
  exports.summarizeForLog = summarizeForLog;
2042
- //# sourceMappingURL=chunk-PKUSCCS6.cjs.map
2043
- //# sourceMappingURL=chunk-PKUSCCS6.cjs.map
2150
+ //# sourceMappingURL=chunk-2WDDJYR7.cjs.map
2151
+ //# sourceMappingURL=chunk-2WDDJYR7.cjs.map