@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
@@ -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,39 @@ function npmDescriptorToRegistryPrefix(descriptor, resolvedVersion) {
1530
1542
  if (!normalized) return "";
1531
1543
  return "npm." + normalized + ".";
1532
1544
  }
1545
+ function npmDescriptorToPackagePrefix(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 slashIdx = scopeAndPackage.indexOf("/");
1554
+ const scope = slashIdx < 0 ? scopeAndPackage : scopeAndPackage.slice(0, slashIdx).replace(/^@/, "");
1555
+ const pkg = slashIdx < 0 ? "" : scopeAndPackage.slice(slashIdx + 1);
1556
+ const segment = [scope, pkg].filter(Boolean).join(".");
1557
+ const normalized = chunkDYDNPIV2_cjs.normalizeToolName(segment);
1558
+ if (!normalized) return "";
1559
+ return "npm." + normalized;
1560
+ }
1561
+ function npmDescriptorToPackagePrefixWithVersion(descriptor) {
1562
+ const s = descriptor.trim();
1563
+ if (typeof s !== "string" || !s.startsWith("npm:")) return "";
1564
+ const rest = s.slice(4).trim();
1565
+ const hashIdx = rest.indexOf("#");
1566
+ const beforeHash = hashIdx < 0 ? rest : rest.slice(0, hashIdx);
1567
+ const lastAt = beforeHash.lastIndexOf("@");
1568
+ const scopeAndPackage = lastAt <= 0 ? beforeHash : beforeHash.slice(0, lastAt);
1569
+ const version = lastAt <= 0 ? "" : beforeHash.slice(lastAt + 1).trim();
1570
+ const slashIdx = scopeAndPackage.indexOf("/");
1571
+ const scope = slashIdx < 0 ? scopeAndPackage : scopeAndPackage.slice(0, slashIdx).replace(/^@/, "");
1572
+ const pkg = slashIdx < 0 ? "" : scopeAndPackage.slice(slashIdx + 1);
1573
+ const segment = [scope, pkg, version].filter(Boolean).join(".");
1574
+ const normalized = chunkDYDNPIV2_cjs.normalizeToolName(segment);
1575
+ if (!normalized) return "";
1576
+ return "npm." + normalized;
1577
+ }
1533
1578
  function isNpmToolDescriptor(descriptor) {
1534
1579
  return isToolPath(descriptor) && parseToolPath(descriptor)?.protocol === "npm";
1535
1580
  }
@@ -1573,6 +1618,30 @@ function expandToolDescriptorsToRegistryNames(descriptors, registryNames) {
1573
1618
  if (registryNames.includes(s) && !seen.has(s)) {
1574
1619
  seen.add(s);
1575
1620
  out.push(s);
1621
+ continue;
1622
+ }
1623
+ const path = parseToolPath(s);
1624
+ if (path) {
1625
+ const packagePrefix = path.protocol === "npm" ? npmDescriptorToPackagePrefix(s) : path.protocol === "file" ? fileDescriptorToPackagePrefix(s) : "";
1626
+ const prefixWithDot = packagePrefix ? packagePrefix + "." : "";
1627
+ if (prefixWithDot) {
1628
+ if (path.toolName) {
1629
+ const suffix = "." + path.toolName;
1630
+ for (const r of registryNames) {
1631
+ if (r.startsWith(prefixWithDot) && r.endsWith(suffix) && !seen.has(r)) {
1632
+ seen.add(r);
1633
+ out.push(r);
1634
+ }
1635
+ }
1636
+ } else {
1637
+ for (const r of registryNames) {
1638
+ if (r.startsWith(prefixWithDot) && !seen.has(r)) {
1639
+ seen.add(r);
1640
+ out.push(r);
1641
+ }
1642
+ }
1643
+ }
1644
+ }
1576
1645
  }
1577
1646
  continue;
1578
1647
  }
@@ -1598,6 +1667,18 @@ function normalizeToolList(descriptors) {
1598
1667
  }
1599
1668
  return out;
1600
1669
  }
1670
+ function fileDescriptorToPackagePrefix(descriptor) {
1671
+ const path = parseToolPath(descriptor.trim());
1672
+ if (!path || path.protocol !== "file") return "";
1673
+ const pathPart = `${path.scope}/${path.packageWithVersion}`;
1674
+ const normalized = chunkDYDNPIV2_cjs.normalizeToolName(pathPart);
1675
+ if (!normalized) return "";
1676
+ return "file." + normalized;
1677
+ }
1678
+ function fileDescriptorToRegistryPrefix(descriptor) {
1679
+ const prefix = fileDescriptorToPackagePrefix(descriptor);
1680
+ return prefix ? prefix + "." : "";
1681
+ }
1601
1682
  function loadToolConfig(toolYamlPath) {
1602
1683
  const abs = path.resolve(toolYamlPath);
1603
1684
  const raw = fs.readFileSync(abs, "utf8");
@@ -1605,20 +1686,29 @@ function loadToolConfig(toolYamlPath) {
1605
1686
  if (!parsed || typeof parsed !== "object") return {};
1606
1687
  const toolsBlock = parsed.tools;
1607
1688
  if (toolsBlock != null && typeof toolsBlock === "object" && !Array.isArray(toolsBlock)) {
1689
+ const toolDefaults = toolsBlock.defaults != null && typeof toolsBlock.defaults === "object" && !Array.isArray(toolsBlock.defaults) ? toolsBlock.defaults : void 0;
1690
+ const packageToolDefaults2 = toolsBlock.packages != null && typeof toolsBlock.packages === "object" && !Array.isArray(toolsBlock.packages) ? toolsBlock.packages : void 0;
1691
+ const list2 = Array.isArray(toolsBlock.list) && toolsBlock.list.length > 0 ? toolsBlock.list : void 0;
1608
1692
  return {
1609
- tools: Array.isArray(toolsBlock.list) ? toolsBlock.list : void 0,
1693
+ tools: list2 ?? (packageToolDefaults2 ? Object.keys(packageToolDefaults2) : void 0),
1610
1694
  sandboxedPath: typeof toolsBlock.sandboxedPath === "string" ? toolsBlock.sandboxedPath : parsed.sandboxedPath,
1611
1695
  allowedHosts: Array.isArray(toolsBlock.allowedHosts) ? toolsBlock.allowedHosts : parsed.allowedHosts,
1612
1696
  blockedHosts: Array.isArray(toolsBlock.blockedHosts) ? toolsBlock.blockedHosts : parsed.blockedHosts,
1613
- blockedCidrs: Array.isArray(toolsBlock.blockedCidrs) ? toolsBlock.blockedCidrs : parsed.blockedCidrs
1697
+ blockedCidrs: Array.isArray(toolsBlock.blockedCidrs) ? toolsBlock.blockedCidrs : parsed.blockedCidrs,
1698
+ toolDefaults,
1699
+ packageToolDefaults: packageToolDefaults2
1614
1700
  };
1615
1701
  }
1702
+ const packageToolDefaults = typeof parsed.packageToolDefaults === "object" && !Array.isArray(parsed.packageToolDefaults) ? parsed.packageToolDefaults : void 0;
1703
+ const list = Array.isArray(parsed.tools) && parsed.tools.length > 0 ? parsed.tools : void 0;
1616
1704
  return {
1617
- tools: Array.isArray(parsed.tools) ? parsed.tools : void 0,
1705
+ tools: list ?? (packageToolDefaults ? Object.keys(packageToolDefaults) : void 0),
1618
1706
  sandboxedPath: parsed.sandboxedPath,
1619
1707
  allowedHosts: Array.isArray(parsed.allowedHosts) ? parsed.allowedHosts : void 0,
1620
1708
  blockedHosts: Array.isArray(parsed.blockedHosts) ? parsed.blockedHosts : void 0,
1621
- blockedCidrs: Array.isArray(parsed.blockedCidrs) ? parsed.blockedCidrs : void 0
1709
+ blockedCidrs: Array.isArray(parsed.blockedCidrs) ? parsed.blockedCidrs : void 0,
1710
+ toolDefaults: typeof parsed.toolDefaults === "object" && !Array.isArray(parsed.toolDefaults) ? parsed.toolDefaults : void 0,
1711
+ packageToolDefaults
1622
1712
  };
1623
1713
  }
1624
1714
  function resolveSandboxedPath(toolYamlPath, sandboxedPath) {
@@ -1645,6 +1735,37 @@ function findAndLoadToolConfig(dir) {
1645
1735
  return {};
1646
1736
  }
1647
1737
  var DEFAULT_CACHE_BASE = path.join(os.homedir(), ".agent", "cache");
1738
+ function isLatestRequest(version) {
1739
+ const v = (version ?? "").trim().toLowerCase();
1740
+ return v === "" || v === "latest";
1741
+ }
1742
+ function resolveLatestVersionFromRegistry(packageName) {
1743
+ const quoted = packageName.includes(" ") ? `"${packageName}"` : packageName;
1744
+ try {
1745
+ const out = child_process.execSync(`npm view ${quoted} version`, {
1746
+ encoding: "utf-8",
1747
+ stdio: ["pipe", "pipe", "pipe"]
1748
+ });
1749
+ const version = (out ?? "").trim();
1750
+ if (!version) {
1751
+ throw new Error(`npm view ${packageName} version returned empty`);
1752
+ }
1753
+ return version;
1754
+ } catch (err) {
1755
+ const msg = err instanceof Error ? err.message : String(err);
1756
+ throw new Error(`Failed to resolve latest version for ${packageName}: ${msg}`);
1757
+ }
1758
+ }
1759
+ function getCachedPackageVersion(cacheDir) {
1760
+ const pkgPath = path.join(cacheDir, "package.json");
1761
+ if (!fs.existsSync(pkgPath)) return void 0;
1762
+ try {
1763
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
1764
+ return typeof pkg.version === "string" ? pkg.version : void 0;
1765
+ } catch {
1766
+ return void 0;
1767
+ }
1768
+ }
1648
1769
  function packagePathSegments(name) {
1649
1770
  const withoutScope = name.replace(/^@/, "");
1650
1771
  return withoutScope.split("/").filter(Boolean);
@@ -1653,17 +1774,29 @@ function resolveCacheDir(cacheBase, packageName, version) {
1653
1774
  const segments = packagePathSegments(packageName);
1654
1775
  return path.join(cacheBase, ...segments, version);
1655
1776
  }
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
1777
  function ensurePackageInCache(packageName, version = "latest", options = {}) {
1662
1778
  const cacheBase = options.cacheBase ?? DEFAULT_CACHE_BASE;
1779
+ let resolvedVersion;
1780
+ if (isLatestRequest(version)) {
1781
+ resolvedVersion = resolveLatestVersionFromRegistry(packageName);
1782
+ } else {
1783
+ resolvedVersion = version;
1784
+ }
1785
+ const cacheDir = resolveCacheDir(cacheBase, packageName, resolvedVersion);
1786
+ const packageJsonPath = path.join(cacheDir, "package.json");
1787
+ const nodeModulesPath = path.join(cacheDir, "node_modules");
1788
+ if (fs.existsSync(packageJsonPath) && fs.existsSync(nodeModulesPath)) {
1789
+ const cachedVersion = getCachedPackageVersion(cacheDir);
1790
+ if (cachedVersion === resolvedVersion) {
1791
+ options.afterInstall?.(cacheDir, packageName);
1792
+ return cacheDir;
1793
+ }
1794
+ fs.rmSync(cacheDir, { recursive: true, force: true });
1795
+ }
1663
1796
  const packDest = path.join(cacheBase, ".pack-tmp", packageName.replace(/@/g, "").replace(/\//g, "_"));
1664
1797
  fs.mkdirSync(packDest, { recursive: true });
1665
1798
  try {
1666
- child_process.execSync(`npm pack ${packageName}@${version} --pack-destination "${packDest}"`, {
1799
+ child_process.execSync(`npm pack ${packageName}@${resolvedVersion} --pack-destination "${packDest}"`, {
1667
1800
  cwd: process.cwd(),
1668
1801
  stdio: "pipe",
1669
1802
  encoding: "utf-8"
@@ -1673,15 +1806,6 @@ function ensurePackageInCache(packageName, version = "latest", options = {}) {
1673
1806
  if (!tgz) {
1674
1807
  throw new Error(`npm pack did not produce a .tgz in ${packDest}`);
1675
1808
  }
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
1809
  const extractDir = path.join(packDest, "extract");
1686
1810
  fs.mkdirSync(extractDir, { recursive: true });
1687
1811
  child_process.execSync(`tar -xzf "${path.join(packDest, tgz)}" -C "${extractDir}"`, {
@@ -1697,11 +1821,33 @@ function ensurePackageInCache(packageName, version = "latest", options = {}) {
1697
1821
  fs.rmSync(cacheDir, { recursive: true, force: true });
1698
1822
  }
1699
1823
  fs.renameSync(extractedPackage, cacheDir);
1700
- child_process.execSync("npm install", {
1701
- cwd: cacheDir,
1702
- stdio: "pipe",
1703
- encoding: "utf-8"
1704
- });
1824
+ const npmInstallTimeout = 12e4;
1825
+ const maxAttempts = 3;
1826
+ let lastErr;
1827
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
1828
+ try {
1829
+ child_process.execSync("npm install --prefer-offline --no-audit --no-fund", {
1830
+ cwd: cacheDir,
1831
+ stdio: "pipe",
1832
+ encoding: "utf-8",
1833
+ timeout: npmInstallTimeout
1834
+ });
1835
+ lastErr = void 0;
1836
+ break;
1837
+ } catch (err) {
1838
+ lastErr = err instanceof Error ? err : new Error(String(err));
1839
+ if (attempt < maxAttempts) {
1840
+ const delayMs = 5e3 * attempt;
1841
+ const deadline = Date.now() + delayMs;
1842
+ while (Date.now() < deadline) {
1843
+ }
1844
+ } else {
1845
+ throw new Error(
1846
+ `npm install in cache failed after ${maxAttempts} attempts: ${lastErr.message}`
1847
+ );
1848
+ }
1849
+ }
1850
+ }
1705
1851
  options.afterInstall?.(cacheDir, packageName);
1706
1852
  return cacheDir;
1707
1853
  } finally {
@@ -1731,7 +1877,7 @@ async function importFromCache(packageRoot) {
1731
1877
  fileUrl
1732
1878
  );
1733
1879
  }
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)));
1880
+ var requireFromPackage = module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('chunk-LP7KHBA3.cjs', document.baseURI).href)));
1735
1881
  function getProjectRequire() {
1736
1882
  const cwd = process.cwd();
1737
1883
  if (fs.existsSync(path.join(cwd, "package.json"))) return module$1.createRequire(path.join(cwd, "package.json"));
@@ -1818,34 +1964,95 @@ function parseNpmDescriptor(entry) {
1818
1964
  const version = rest.slice(at + 1).split("#")[0]?.trim() || "latest";
1819
1965
  return { packageName, version };
1820
1966
  }
1821
- function loadExtensionFromToolYamlNodeModules(configFilePath, stepLog) {
1967
+ function loadExtensionFromFileDescriptorSync(descriptor, configFilePath, stepLog) {
1968
+ const entryStr = descriptor.trim();
1969
+ const path$1 = parseToolPath(entryStr);
1970
+ if (!path$1 || path$1.protocol !== "file") return null;
1971
+ const localPath = path.isAbsolute(configFilePath) ? configFilePath : path.resolve(process.cwd(), configFilePath);
1972
+ const configDir = path.dirname(localPath);
1973
+ const pathPart = `${path$1.scope}/${path$1.packageWithVersion}`;
1974
+ const resolvedPath = path.resolve(configDir, pathPart);
1975
+ if (!fs.existsSync(resolvedPath) || !fs.statSync(resolvedPath).isDirectory()) return null;
1976
+ try {
1977
+ const entryPath = getPackageEntryPath(resolvedPath);
1978
+ const req = module$1.createRequire(path.join(resolvedPath, "package.json"));
1979
+ const mod = req(entryPath);
1980
+ const fn = getRegisterFn(mod);
1981
+ if (typeof fn === "function") {
1982
+ if (stepLog) stepLog(`Loaded local extension from ${resolvedPath}`);
1983
+ return { register: fn, descriptor: entryStr, resolvedVersion: "local" };
1984
+ }
1985
+ } catch {
1986
+ }
1987
+ return null;
1988
+ }
1989
+ function loadExtensionForDescriptorSync(descriptor, configFilePath, stepLog) {
1990
+ const entryStr = descriptor.trim();
1991
+ const parsed = parseNpmDescriptor(entryStr);
1992
+ if (!parsed) return null;
1822
1993
  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
1994
  const configDir = path.dirname(localPath);
1828
1995
  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;
1996
+ const useNodeModules = fs.existsSync(packageJsonPath);
1997
+ const configRequire = useNodeModules ? module$1.createRequire(packageJsonPath) : null;
1998
+ if (configRequire) {
1836
1999
  try {
1837
2000
  const mod = configRequire(parsed.packageName);
1838
2001
  const fn = getRegisterFn(mod);
1839
2002
  if (typeof fn === "function") {
1840
- const resolvedVersion = getInstalledPackageVersionFromRequire(parsed.packageName, configRequire) ?? "latest";
2003
+ const installed = getInstalledPackageVersionFromRequire(parsed.packageName, configRequire);
2004
+ const requested = parsed.version === "latest" || !parsed.version?.trim() ? null : parsed.version;
2005
+ const resolvedVersion = installed ?? (requested === null ? resolveLatestVersionFromRegistry(parsed.packageName) : requested);
2006
+ if (requested === null || installed === requested) {
2007
+ if (stepLog) stepLog(`Loaded ${parsed.packageName}@${resolvedVersion} from node_modules`);
2008
+ return { register: fn, descriptor: entryStr, resolvedVersion };
2009
+ }
2010
+ }
2011
+ } catch {
2012
+ }
2013
+ }
2014
+ const cacheBase = getCacheBaseFromToolConfig(localPath);
2015
+ const cacheOpts = cacheBase ? { cacheBase } : {};
2016
+ for (const opts of [cacheOpts, {}]) {
2017
+ try {
2018
+ const cacheDir = ensurePackageInCache(parsed.packageName, parsed.version, opts);
2019
+ if (stepLog) stepLog(`Loaded ${parsed.packageName} from cache: ${cacheDir}`);
2020
+ const entryPath = getPackageEntryPath(cacheDir);
2021
+ const req = module$1.createRequire(path.join(cacheDir, "package.json"));
2022
+ const mod = req(entryPath);
2023
+ const fn = getRegisterFn(mod);
2024
+ if (typeof fn === "function") {
2025
+ const resolvedVersion = path.basename(cacheDir);
1841
2026
  return { register: fn, descriptor: entryStr, resolvedVersion };
1842
2027
  }
2028
+ break;
1843
2029
  } catch {
1844
- continue;
2030
+ if (Object.keys(opts).length > 0) continue;
2031
+ break;
1845
2032
  }
1846
2033
  }
1847
2034
  return null;
1848
2035
  }
2036
+ function loadAllExtensionsFromToolYamlSync(configFilePath, stepLog) {
2037
+ const localPath = path.isAbsolute(configFilePath) ? configFilePath : path.resolve(process.cwd(), configFilePath);
2038
+ if (!fs.existsSync(localPath)) return [];
2039
+ const config = loadToolConfig(localPath);
2040
+ const tools = config.tools;
2041
+ if (!Array.isArray(tools) || tools.length === 0) return [];
2042
+ if (stepLog) stepLog("Loading extensions from tool.yaml (npm + file)");
2043
+ const loaded = [];
2044
+ for (const entry of tools) {
2045
+ const entryStr = String(entry).trim();
2046
+ if (entryStr.startsWith("npm:")) {
2047
+ const result = loadExtensionForDescriptorSync(entryStr, configFilePath, stepLog);
2048
+ if (result) loaded.push(result);
2049
+ } else if (entryStr.startsWith("file:")) {
2050
+ const result = loadExtensionFromFileDescriptorSync(entryStr, configFilePath, stepLog);
2051
+ if (result) loaded.push(result);
2052
+ }
2053
+ }
2054
+ return loaded;
2055
+ }
1849
2056
  function getInstalledPackageVersionFromRequire(packageName, req) {
1850
2057
  try {
1851
2058
  const pkgJsonPath = req.resolve(`${packageName}/package.json`);
@@ -1856,114 +2063,84 @@ function getInstalledPackageVersionFromRequire(packageName, req) {
1856
2063
  return null;
1857
2064
  }
1858
2065
  }
1859
- function loadExtensionFromToolYamlCache(configFilePath, stepLog) {
2066
+ async function loadExtensionForDescriptorAsync(descriptor, configFilePath, stepLog) {
2067
+ const syncResult = loadExtensionForDescriptorSync(descriptor, configFilePath, stepLog);
2068
+ if (syncResult) return syncResult;
2069
+ const entryStr = descriptor.trim();
2070
+ const parsed = parseNpmDescriptor(entryStr);
2071
+ if (!parsed) return null;
1860
2072
  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
2073
  const cacheBase = getCacheBaseFromToolConfig(localPath);
1866
2074
  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;
2075
+ for (const opts of [cacheOpts, {}]) {
2076
+ try {
2077
+ const cacheDir = ensurePackageInCache(parsed.packageName, parsed.version, opts);
2078
+ if (stepLog) stepLog(`Loaded ${parsed.packageName} from cache (async): ${cacheDir}`);
2079
+ const mod = await importFromCache(cacheDir);
2080
+ const fn = getRegisterFn(mod);
2081
+ if (typeof fn === "function") {
2082
+ const resolvedVersion = path.basename(cacheDir);
2083
+ return { register: fn, descriptor: entryStr, resolvedVersion };
1889
2084
  }
2085
+ break;
2086
+ } catch {
2087
+ if (Object.keys(opts).length > 0) continue;
2088
+ break;
1890
2089
  }
1891
2090
  }
1892
2091
  return null;
1893
2092
  }
1894
- async function loadExtensionFromToolYamlCacheAsync(configFilePath, stepLog) {
2093
+ async function loadAllExtensionsFromToolYamlAsync(configFilePath, stepLog) {
1895
2094
  const localPath = path.isAbsolute(configFilePath) ? configFilePath : path.resolve(process.cwd(), configFilePath);
1896
- if (!fs.existsSync(localPath)) return null;
2095
+ if (!fs.existsSync(localPath)) return [];
1897
2096
  const config = loadToolConfig(localPath);
1898
2097
  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)");
2098
+ if (!Array.isArray(tools) || tools.length === 0) return [];
2099
+ if (stepLog) stepLog("Loading extensions from tool.yaml (async)");
2100
+ const loaded = [];
1903
2101
  for (const entry of tools) {
1904
2102
  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
- }
2103
+ if (entryStr.startsWith("npm:")) {
2104
+ const result = await loadExtensionForDescriptorAsync(entryStr, configFilePath, stepLog);
2105
+ if (result) loaded.push(result);
2106
+ } else if (entryStr.startsWith("file:")) {
2107
+ const result = loadExtensionFromFileDescriptorSync(entryStr, configFilePath, stepLog);
2108
+ if (result) loaded.push(result);
1923
2109
  }
1924
2110
  }
1925
- return null;
2111
+ return loaded;
1926
2112
  }
1927
2113
  function createRuntimeFromConfigSync(options = {}) {
1928
2114
  const registry = new chunkTOSPHMYU_cjs.ToolRegistry();
1929
2115
  const stepLog = options.stepLog;
1930
2116
  if (options.coreTools !== void 0) {
2117
+ if (options.configFilePath) {
2118
+ const all = loadAllExtensionsFromToolYamlSync(options.configFilePath, stepLog);
2119
+ if (all.length > 0) {
2120
+ if (stepLog) stepLog(`Registered ${all.length} extension(s) from tool.yaml`);
2121
+ const runtime3 = new PTCRuntime({ registry });
2122
+ for (const ext of all) {
2123
+ const prefix = ext.descriptor.startsWith("file:") ? fileDescriptorToRegistryPrefix(ext.descriptor) : npmDescriptorToRegistryPrefix(ext.descriptor, ext.resolvedVersion);
2124
+ const reg = prefix ? createPrefixingRegistry(registry, prefix) : registry;
2125
+ const adapter = ext.register(reg, options.coreTools);
2126
+ runtime3.registerAdapter(adapter);
2127
+ }
2128
+ return { runtime: runtime3, registry };
2129
+ }
2130
+ }
1931
2131
  if (stepLog) stepLog("Trying extension from node_modules");
1932
- let extensionNode = loadExtensionFromNodeModules();
2132
+ const extensionNode = loadExtensionFromNodeModules();
1933
2133
  if (extensionNode) {
1934
2134
  if (stepLog) stepLog("Registered extension from node_modules");
1935
2135
  const descriptor = `npm:${extensionNode.packageName}`;
1936
- const resolvedVersion = getInstalledPackageVersion(extensionNode.packageName);
1937
- const prefix = npmDescriptorToRegistryPrefix(descriptor, resolvedVersion ?? void 0);
2136
+ const resolvedVersion = getInstalledPackageVersion(extensionNode.packageName) ?? resolveLatestVersionFromRegistry(extensionNode.packageName);
2137
+ const prefix = npmDescriptorToRegistryPrefix(descriptor, resolvedVersion);
1938
2138
  const reg = prefix ? createPrefixingRegistry(registry, prefix) : registry;
1939
2139
  const coreAdapter = extensionNode.register(reg, options.coreTools);
1940
2140
  const runtime3 = new PTCRuntime({ registry });
1941
2141
  runtime3.registerAdapter(coreAdapter);
1942
2142
  return { runtime: runtime3, registry };
1943
2143
  }
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
2144
  const runtime2 = new PTCRuntime({ registry });
1968
2145
  return { runtime: runtime2, registry };
1969
2146
  }
@@ -1972,27 +2149,17 @@ function createRuntimeFromConfigSync(options = {}) {
1972
2149
  }
1973
2150
  async function createRuntimeFromConfig(options = {}) {
1974
2151
  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)");
2152
+ const all = await loadAllExtensionsFromToolYamlAsync(options.configFilePath, options.stepLog);
2153
+ if (all.length > 0) {
2154
+ if (options.stepLog) options.stepLog(`Registered ${all.length} extension(s) from tool.yaml`);
1978
2155
  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
2156
  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);
2157
+ for (const ext of all) {
2158
+ const prefix = ext.descriptor.startsWith("file:") ? fileDescriptorToRegistryPrefix(ext.descriptor) : npmDescriptorToRegistryPrefix(ext.descriptor, ext.resolvedVersion);
2159
+ const reg = prefix ? createPrefixingRegistry(registry, prefix) : registry;
2160
+ const adapter = ext.register(reg, options.coreTools);
2161
+ runtime.registerAdapter(adapter);
2162
+ }
1996
2163
  return { runtime, registry };
1997
2164
  }
1998
2165
  }
@@ -2024,6 +2191,7 @@ exports.createRuntimeFromConfig = createRuntimeFromConfig;
2024
2191
  exports.createRuntimeFromConfigSync = createRuntimeFromConfigSync;
2025
2192
  exports.ensurePackageInCache = ensurePackageInCache;
2026
2193
  exports.expandToolDescriptorsToRegistryNames = expandToolDescriptorsToRegistryNames;
2194
+ exports.fileDescriptorToPackagePrefix = fileDescriptorToPackagePrefix;
2027
2195
  exports.findAndLoadToolConfig = findAndLoadToolConfig;
2028
2196
  exports.getDisplayScope = getDisplayScope;
2029
2197
  exports.getPackageEntryPath = getPackageEntryPath;
@@ -2032,12 +2200,14 @@ exports.isBarePackageDescriptor = isBarePackageDescriptor;
2032
2200
  exports.isNpmToolDescriptor = isNpmToolDescriptor;
2033
2201
  exports.loadToolConfig = loadToolConfig;
2034
2202
  exports.normalizeToolList = normalizeToolList;
2203
+ exports.npmDescriptorToPackagePrefixWithVersion = npmDescriptorToPackagePrefixWithVersion;
2035
2204
  exports.npmDescriptorToRegistryPrefix = npmDescriptorToRegistryPrefix;
2036
2205
  exports.parseNpmToolDescriptor = parseNpmToolDescriptor;
2206
+ exports.resolveLatestVersionFromRegistry = resolveLatestVersionFromRegistry;
2037
2207
  exports.resolveNpmToolDescriptor = resolveNpmToolDescriptor;
2038
2208
  exports.resolveSandboxedPath = resolveSandboxedPath;
2039
2209
  exports.resolveToolDescriptor = resolveToolDescriptor;
2040
2210
  exports.sanitizeForLog = sanitizeForLog;
2041
2211
  exports.summarizeForLog = summarizeForLog;
2042
- //# sourceMappingURL=chunk-PKUSCCS6.cjs.map
2043
- //# sourceMappingURL=chunk-PKUSCCS6.cjs.map
2212
+ //# sourceMappingURL=chunk-LP7KHBA3.cjs.map
2213
+ //# sourceMappingURL=chunk-LP7KHBA3.cjs.map