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