@4da/mcp-server 4.3.0 → 4.5.0
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/index.d.ts +2 -2
- package/dist/index.js +5 -5
- package/dist/live/crates-registry.d.ts +18 -0
- package/dist/live/crates-registry.d.ts.map +1 -0
- package/dist/live/crates-registry.js +133 -0
- package/dist/live/crates-registry.js.map +1 -0
- package/dist/live/go-registry.d.ts +19 -0
- package/dist/live/go-registry.d.ts.map +1 -0
- package/dist/live/go-registry.js +127 -0
- package/dist/live/go-registry.js.map +1 -0
- package/dist/live/http-utils.d.ts +3 -0
- package/dist/live/http-utils.d.ts.map +1 -0
- package/dist/live/http-utils.js +20 -0
- package/dist/live/http-utils.js.map +1 -0
- package/dist/live/index.d.ts +7 -2
- package/dist/live/index.d.ts.map +1 -1
- package/dist/live/index.js +71 -0
- package/dist/live/index.js.map +1 -1
- package/dist/live/npm-registry.d.ts +19 -0
- package/dist/live/npm-registry.d.ts.map +1 -0
- package/dist/live/npm-registry.js +132 -0
- package/dist/live/npm-registry.js.map +1 -0
- package/dist/live/osv-scanner.d.ts.map +1 -1
- package/dist/live/osv-scanner.js +1 -10
- package/dist/live/osv-scanner.js.map +1 -1
- package/dist/live/pypi-registry.d.ts +18 -0
- package/dist/live/pypi-registry.d.ts.map +1 -0
- package/dist/live/pypi-registry.js +142 -0
- package/dist/live/pypi-registry.js.map +1 -0
- package/dist/live/rate-limiter.d.ts +12 -0
- package/dist/live/rate-limiter.d.ts.map +1 -1
- package/dist/live/rate-limiter.js +4 -0
- package/dist/live/rate-limiter.js.map +1 -1
- package/dist/live/semver-utils.d.ts +5 -0
- package/dist/live/semver-utils.d.ts.map +1 -0
- package/dist/live/semver-utils.js +28 -0
- package/dist/live/semver-utils.js.map +1 -0
- package/dist/live/types.d.ts +41 -0
- package/dist/live/types.d.ts.map +1 -1
- package/dist/schema-registry.d.ts.map +1 -1
- package/dist/schema-registry.js +14 -0
- package/dist/schema-registry.js.map +1 -1
- package/dist/schemas/dependency-health.json +27 -0
- package/dist/schemas/upgrade-planner.json +22 -0
- package/dist/tool-dispatch.d.ts.map +1 -1
- package/dist/tool-dispatch.js +3 -1
- package/dist/tool-dispatch.js.map +1 -1
- package/dist/tools/dependency-health.d.ts +45 -0
- package/dist/tools/dependency-health.d.ts.map +1 -0
- package/dist/tools/dependency-health.js +152 -0
- package/dist/tools/dependency-health.js.map +1 -0
- package/dist/tools/index.d.ts +2 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +2 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/upgrade-planner.d.ts +59 -0
- package/dist/tools/upgrade-planner.d.ts.map +1 -0
- package/dist/tools/upgrade-planner.js +167 -0
- package/dist/tools/upgrade-planner.js.map +1 -0
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -12,9 +12,9 @@
|
|
|
12
12
|
* Do NOT expose this server over a network without adding proper auth.
|
|
13
13
|
*/
|
|
14
14
|
/**
|
|
15
|
-
* 4DA MCP Server v4.
|
|
15
|
+
* 4DA MCP Server v4.5.0 — Dependency Intelligence Platform
|
|
16
16
|
*
|
|
17
|
-
*
|
|
17
|
+
* 38 tools across 9 categories. Live vulnerability scanning (OSV.dev),
|
|
18
18
|
* ecosystem news, persistent project memory, and tech stack awareness for any MCP host.
|
|
19
19
|
*
|
|
20
20
|
* Categories (canonical — matches schema-registry.ts `ToolCategory`):
|
package/dist/index.js
CHANGED
|
@@ -13,9 +13,9 @@
|
|
|
13
13
|
* Do NOT expose this server over a network without adding proper auth.
|
|
14
14
|
*/
|
|
15
15
|
/**
|
|
16
|
-
* 4DA MCP Server v4.
|
|
16
|
+
* 4DA MCP Server v4.5.0 — Dependency Intelligence Platform
|
|
17
17
|
*
|
|
18
|
-
*
|
|
18
|
+
* 38 tools across 9 categories. Live vulnerability scanning (OSV.dev),
|
|
19
19
|
* ecosystem news, persistent project memory, and tech stack awareness for any MCP host.
|
|
20
20
|
*
|
|
21
21
|
* Categories (canonical — matches schema-registry.ts `ToolCategory`):
|
|
@@ -56,7 +56,7 @@ import { createDatabase, FourDADatabase } from "./db.js";
|
|
|
56
56
|
// =============================================================================
|
|
57
57
|
const server = new Server({
|
|
58
58
|
name: "4da-server",
|
|
59
|
-
version: "4.
|
|
59
|
+
version: "4.5.0",
|
|
60
60
|
}, {
|
|
61
61
|
capabilities: {
|
|
62
62
|
tools: { listChanged: true },
|
|
@@ -273,7 +273,7 @@ async function main() {
|
|
|
273
273
|
const args = process.argv.slice(2);
|
|
274
274
|
// Version
|
|
275
275
|
if (args.includes("--version") || args.includes("-v")) {
|
|
276
|
-
console.log("@4da/mcp-server 4.
|
|
276
|
+
console.log("@4da/mcp-server 4.5.0");
|
|
277
277
|
return;
|
|
278
278
|
}
|
|
279
279
|
// Help
|
|
@@ -362,7 +362,7 @@ async function main() {
|
|
|
362
362
|
process.exit(0);
|
|
363
363
|
});
|
|
364
364
|
const toolCount = getSlimToolList().length;
|
|
365
|
-
console.error(`4DA MCP Server v4.
|
|
365
|
+
console.error(`4DA MCP Server v4.5.0 started — ${toolCount} tools, stdio transport`);
|
|
366
366
|
console.error(" Use --http for Streamable HTTP, --setup to configure editors, --doctor to check health");
|
|
367
367
|
}
|
|
368
368
|
main().catch((error) => {
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* crates.io Registry Fetcher
|
|
3
|
+
*
|
|
4
|
+
* Queries the crates.io sparse index (CDN, no rate limit) for package version
|
|
5
|
+
* data. Avoids the main crates.io API which has a strict 1 req/s rate limit.
|
|
6
|
+
*
|
|
7
|
+
* Privacy: sends only crate names — public manifest data.
|
|
8
|
+
*/
|
|
9
|
+
import type { LiveCache } from "./cache.js";
|
|
10
|
+
import type { RateLimiter } from "./rate-limiter.js";
|
|
11
|
+
import type { RegistryPackageInfo } from "./types.js";
|
|
12
|
+
export declare class CratesRegistry {
|
|
13
|
+
private cache;
|
|
14
|
+
private rateLimiter;
|
|
15
|
+
constructor(cache: LiveCache, rateLimiter: RateLimiter);
|
|
16
|
+
getPackageInfo(name: string, currentVersion: string | null, isDev: boolean): Promise<RegistryPackageInfo>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=crates-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crates-registry.d.ts","sourceRoot":"","sources":["../../src/live/crates-registry.ts"],"names":[],"mappings":"AACA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,KAAK,EAAE,mBAAmB,EAAkB,MAAM,YAAY,CAAC;AAYtE,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAAY;IACzB,OAAO,CAAC,WAAW,CAAc;gBAErB,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW;IAKhD,cAAc,CAClB,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,GAAG,IAAI,EAC7B,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,mBAAmB,CAAC;CAsEhC"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
// SPDX-License-Identifier: FSL-1.1-Apache-2.0
|
|
2
|
+
/**
|
|
3
|
+
* crates.io Registry Fetcher
|
|
4
|
+
*
|
|
5
|
+
* Queries the crates.io sparse index (CDN, no rate limit) for package version
|
|
6
|
+
* data. Avoids the main crates.io API which has a strict 1 req/s rate limit.
|
|
7
|
+
*
|
|
8
|
+
* Privacy: sends only crate names — public manifest data.
|
|
9
|
+
*/
|
|
10
|
+
import { fetchWithTimeout } from "./http-utils.js";
|
|
11
|
+
import { computeSemverDistance, isPreRelease } from "./semver-utils.js";
|
|
12
|
+
const CRATES_TIMEOUT_MS = 8_000;
|
|
13
|
+
const CRATES_CACHE_TTL = 86_400; // 24 hours
|
|
14
|
+
export class CratesRegistry {
|
|
15
|
+
cache;
|
|
16
|
+
rateLimiter;
|
|
17
|
+
constructor(cache, rateLimiter) {
|
|
18
|
+
this.cache = cache;
|
|
19
|
+
this.rateLimiter = rateLimiter;
|
|
20
|
+
}
|
|
21
|
+
async getPackageInfo(name, currentVersion, isDev) {
|
|
22
|
+
const cacheKey = `crates-reg:${name}`;
|
|
23
|
+
const cached = this.cache.get(cacheKey);
|
|
24
|
+
if (cached !== null)
|
|
25
|
+
return cached;
|
|
26
|
+
if (!this.rateLimiter.canProceed("crates")) {
|
|
27
|
+
const stale = this.cache.getStale(cacheKey);
|
|
28
|
+
if (stale)
|
|
29
|
+
return stale.data;
|
|
30
|
+
return errorResult(name, currentVersion, isDev, "Rate limited");
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
this.rateLimiter.consume("crates");
|
|
34
|
+
const url = sparseIndexUrl(name);
|
|
35
|
+
const response = await fetchWithTimeout(url, { headers: { Accept: "application/json" } }, CRATES_TIMEOUT_MS);
|
|
36
|
+
if (!response.ok) {
|
|
37
|
+
throw new Error(`Sparse index HTTP ${response.status}: ${url}`);
|
|
38
|
+
}
|
|
39
|
+
const text = await response.text();
|
|
40
|
+
const entries = parseIndexLines(text);
|
|
41
|
+
if (entries.length === 0) {
|
|
42
|
+
throw new Error(`No versions found for crate: ${name}`);
|
|
43
|
+
}
|
|
44
|
+
// Latest = last entry overall (may be yanked or prerelease)
|
|
45
|
+
const latestEntry = entries[entries.length - 1];
|
|
46
|
+
const latestVersion = latestEntry.vers;
|
|
47
|
+
// Latest stable = last non-yanked, non-prerelease entry
|
|
48
|
+
const latestStable = findLatestStable(entries);
|
|
49
|
+
// Semver distance between current and latest stable (or latest)
|
|
50
|
+
let versionsBehind = null;
|
|
51
|
+
if (currentVersion && (latestStable || latestVersion)) {
|
|
52
|
+
versionsBehind = computeSemverDistance(currentVersion, latestStable || latestVersion);
|
|
53
|
+
}
|
|
54
|
+
const result = {
|
|
55
|
+
name,
|
|
56
|
+
ecosystem: "crates.io",
|
|
57
|
+
currentVersion,
|
|
58
|
+
latestVersion,
|
|
59
|
+
latestStableVersion: latestStable,
|
|
60
|
+
versionsBehind,
|
|
61
|
+
deprecated: false, // sparse index does not carry deprecation info
|
|
62
|
+
deprecationMessage: null,
|
|
63
|
+
lastPublished: null, // sparse index does not carry dates
|
|
64
|
+
license: null, // sparse index does not carry license
|
|
65
|
+
weeklyDownloads: null, // sparse index does not carry downloads
|
|
66
|
+
isDev,
|
|
67
|
+
fetchError: null,
|
|
68
|
+
};
|
|
69
|
+
this.cache.set(cacheKey, result, "crates", CRATES_CACHE_TTL);
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
const stale = this.cache.getStale(cacheKey);
|
|
74
|
+
if (stale)
|
|
75
|
+
return stale.data;
|
|
76
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
77
|
+
return errorResult(name, currentVersion, isDev, message);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function sparseIndexUrl(name) {
|
|
82
|
+
const n = name.toLowerCase();
|
|
83
|
+
switch (n.length) {
|
|
84
|
+
case 1: return `https://index.crates.io/1/${n}`;
|
|
85
|
+
case 2: return `https://index.crates.io/2/${n}`;
|
|
86
|
+
case 3: return `https://index.crates.io/3/${n[0]}/${n}`;
|
|
87
|
+
default: return `https://index.crates.io/${n.slice(0, 2)}/${n.slice(2, 4)}/${n}`;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
function parseIndexLines(text) {
|
|
91
|
+
const entries = [];
|
|
92
|
+
for (const line of text.split("\n")) {
|
|
93
|
+
const trimmed = line.trim();
|
|
94
|
+
if (trimmed.length === 0)
|
|
95
|
+
continue;
|
|
96
|
+
try {
|
|
97
|
+
const entry = JSON.parse(trimmed);
|
|
98
|
+
if (entry.name && entry.vers) {
|
|
99
|
+
entries.push(entry);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
// Skip malformed lines
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return entries;
|
|
107
|
+
}
|
|
108
|
+
function findLatestStable(entries) {
|
|
109
|
+
for (let i = entries.length - 1; i >= 0; i--) {
|
|
110
|
+
if (!entries[i].yanked && !isPreRelease(entries[i].vers)) {
|
|
111
|
+
return entries[i].vers;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
function errorResult(name, currentVersion, isDev, fetchError) {
|
|
117
|
+
return {
|
|
118
|
+
name,
|
|
119
|
+
ecosystem: "crates.io",
|
|
120
|
+
currentVersion,
|
|
121
|
+
latestVersion: null,
|
|
122
|
+
latestStableVersion: null,
|
|
123
|
+
versionsBehind: null,
|
|
124
|
+
deprecated: false,
|
|
125
|
+
deprecationMessage: null,
|
|
126
|
+
lastPublished: null,
|
|
127
|
+
license: null,
|
|
128
|
+
weeklyDownloads: null,
|
|
129
|
+
isDev,
|
|
130
|
+
fetchError,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=crates-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crates-registry.js","sourceRoot":"","sources":["../../src/live/crates-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Go Module Proxy Registry Fetcher
|
|
3
|
+
*
|
|
4
|
+
* Queries the Go module proxy for package metadata (latest version, version
|
|
5
|
+
* list, semver distance). The proxy does not expose deprecation, license, or
|
|
6
|
+
* download data.
|
|
7
|
+
*
|
|
8
|
+
* Privacy: sends only module paths -- public manifest data.
|
|
9
|
+
*/
|
|
10
|
+
import type { LiveCache } from "./cache.js";
|
|
11
|
+
import type { RateLimiter } from "./rate-limiter.js";
|
|
12
|
+
import type { RegistryPackageInfo } from "./types.js";
|
|
13
|
+
export declare class GoRegistry {
|
|
14
|
+
private cache;
|
|
15
|
+
private rateLimiter;
|
|
16
|
+
constructor(cache: LiveCache, rateLimiter: RateLimiter);
|
|
17
|
+
getPackageInfo(name: string, currentVersion: string | null, isDev: boolean): Promise<RegistryPackageInfo>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=go-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"go-registry.d.ts","sourceRoot":"","sources":["../../src/live/go-registry.ts"],"names":[],"mappings":"AACA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAWtD,qBAAa,UAAU;IACrB,OAAO,CAAC,KAAK,CAAY;IACzB,OAAO,CAAC,WAAW,CAAc;gBAErB,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW;IAKhD,cAAc,CAClB,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,GAAG,IAAI,EAC7B,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,mBAAmB,CAAC;CAiFhC"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
// SPDX-License-Identifier: FSL-1.1-Apache-2.0
|
|
2
|
+
/**
|
|
3
|
+
* Go Module Proxy Registry Fetcher
|
|
4
|
+
*
|
|
5
|
+
* Queries the Go module proxy for package metadata (latest version, version
|
|
6
|
+
* list, semver distance). The proxy does not expose deprecation, license, or
|
|
7
|
+
* download data.
|
|
8
|
+
*
|
|
9
|
+
* Privacy: sends only module paths -- public manifest data.
|
|
10
|
+
*/
|
|
11
|
+
import { fetchJson, fetchWithTimeout } from "./http-utils.js";
|
|
12
|
+
import { computeSemverDistance, isPreRelease } from "./semver-utils.js";
|
|
13
|
+
const GO_PROXY_URL = "https://proxy.golang.org";
|
|
14
|
+
const GO_TIMEOUT_MS = 8_000;
|
|
15
|
+
const GO_CACHE_TTL = 86_400; // 24 hours
|
|
16
|
+
export class GoRegistry {
|
|
17
|
+
cache;
|
|
18
|
+
rateLimiter;
|
|
19
|
+
constructor(cache, rateLimiter) {
|
|
20
|
+
this.cache = cache;
|
|
21
|
+
this.rateLimiter = rateLimiter;
|
|
22
|
+
}
|
|
23
|
+
async getPackageInfo(name, currentVersion, isDev) {
|
|
24
|
+
const cacheKey = `go-reg:${name}`;
|
|
25
|
+
const cached = this.cache.get(cacheKey);
|
|
26
|
+
if (cached !== null)
|
|
27
|
+
return cached;
|
|
28
|
+
if (!this.rateLimiter.canProceed("go")) {
|
|
29
|
+
const stale = this.cache.getStale(cacheKey);
|
|
30
|
+
if (stale)
|
|
31
|
+
return stale.data;
|
|
32
|
+
return errorResult(name, currentVersion, isDev, "Rate limited");
|
|
33
|
+
}
|
|
34
|
+
try {
|
|
35
|
+
this.rateLimiter.consume("go");
|
|
36
|
+
const escaped = escapeModulePath(name);
|
|
37
|
+
// Fetch @latest for latest version and timestamp
|
|
38
|
+
const latest = await fetchJson(`${GO_PROXY_URL}/${escaped}/@latest`, {}, GO_TIMEOUT_MS);
|
|
39
|
+
const latestVersion = latest.Version ?? null;
|
|
40
|
+
const lastPublished = latest.Time ?? null;
|
|
41
|
+
// Fetch @v/list for all versions to find latest stable
|
|
42
|
+
let latestStable = null;
|
|
43
|
+
try {
|
|
44
|
+
const listResponse = await fetchWithTimeout(`${GO_PROXY_URL}/${escaped}/@v/list`, {}, GO_TIMEOUT_MS);
|
|
45
|
+
if (listResponse.ok) {
|
|
46
|
+
const text = await listResponse.text();
|
|
47
|
+
const versions = text.trim().split("\n").filter(Boolean);
|
|
48
|
+
latestStable = findLatestStable(versions);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// Version list unavailable -- fall back to @latest if it's stable
|
|
53
|
+
if (latestVersion && !isPreRelease(latestVersion.replace(/^v/, ""))) {
|
|
54
|
+
latestStable = latestVersion;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// Semver distance: strip v prefix for comparison
|
|
58
|
+
let versionsBehind = null;
|
|
59
|
+
const compareTarget = latestStable || latestVersion;
|
|
60
|
+
if (currentVersion && compareTarget) {
|
|
61
|
+
versionsBehind = computeSemverDistance(currentVersion.replace(/^v/, ""), compareTarget.replace(/^v/, ""));
|
|
62
|
+
}
|
|
63
|
+
const result = {
|
|
64
|
+
name,
|
|
65
|
+
ecosystem: "Go",
|
|
66
|
+
currentVersion,
|
|
67
|
+
latestVersion,
|
|
68
|
+
latestStableVersion: latestStable,
|
|
69
|
+
versionsBehind,
|
|
70
|
+
deprecated: false,
|
|
71
|
+
deprecationMessage: null,
|
|
72
|
+
lastPublished,
|
|
73
|
+
license: null, // Go proxy does not expose license info
|
|
74
|
+
weeklyDownloads: null, // Go proxy does not expose download counts
|
|
75
|
+
isDev,
|
|
76
|
+
fetchError: null,
|
|
77
|
+
};
|
|
78
|
+
this.cache.set(cacheKey, result, "go", GO_CACHE_TTL);
|
|
79
|
+
return result;
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
const stale = this.cache.getStale(cacheKey);
|
|
83
|
+
if (stale)
|
|
84
|
+
return stale.data;
|
|
85
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
86
|
+
return errorResult(name, currentVersion, isDev, message);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Escape uppercase letters in Go module paths for the proxy URL.
|
|
92
|
+
* Go proxy convention: uppercase 'X' becomes '!x'.
|
|
93
|
+
*/
|
|
94
|
+
function escapeModulePath(mod) {
|
|
95
|
+
return mod.replace(/[A-Z]/g, (c) => "!" + c.toLowerCase());
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Find the latest stable version from a list of Go module versions.
|
|
99
|
+
* Versions use "v" prefix (v1.2.3) -- strip for prerelease check.
|
|
100
|
+
*/
|
|
101
|
+
function findLatestStable(versions) {
|
|
102
|
+
for (let i = versions.length - 1; i >= 0; i--) {
|
|
103
|
+
const v = versions[i];
|
|
104
|
+
if (!isPreRelease(v.replace(/^v/, ""))) {
|
|
105
|
+
return v;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
function errorResult(name, currentVersion, isDev, fetchError) {
|
|
111
|
+
return {
|
|
112
|
+
name,
|
|
113
|
+
ecosystem: "Go",
|
|
114
|
+
currentVersion,
|
|
115
|
+
latestVersion: null,
|
|
116
|
+
latestStableVersion: null,
|
|
117
|
+
versionsBehind: null,
|
|
118
|
+
deprecated: false,
|
|
119
|
+
deprecationMessage: null,
|
|
120
|
+
lastPublished: null,
|
|
121
|
+
license: null,
|
|
122
|
+
weeklyDownloads: null,
|
|
123
|
+
isDev,
|
|
124
|
+
fetchError,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=go-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"go-registry.js","sourceRoot":"","sources":["../../src/live/go-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-utils.d.ts","sourceRoot":"","sources":["../../src/live/http-utils.ts"],"names":[],"mappings":"AAIA,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,WAAgB,EACzB,SAAS,GAAE,MAA2B,GACrC,OAAO,CAAC,QAAQ,CAAC,CAQnB;AAED,wBAAsB,SAAS,CAAC,CAAC,EAC/B,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,WAAgB,EACzB,SAAS,GAAE,MAA2B,GACrC,OAAO,CAAC,CAAC,CAAC,CAMZ"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// SPDX-License-Identifier: FSL-1.1-Apache-2.0
|
|
2
|
+
const DEFAULT_TIMEOUT_MS = 10_000;
|
|
3
|
+
export async function fetchWithTimeout(url, options = {}, timeoutMs = DEFAULT_TIMEOUT_MS) {
|
|
4
|
+
const controller = new AbortController();
|
|
5
|
+
const timeout = setTimeout(() => controller.abort(), timeoutMs);
|
|
6
|
+
try {
|
|
7
|
+
return await fetch(url, { ...options, signal: controller.signal });
|
|
8
|
+
}
|
|
9
|
+
finally {
|
|
10
|
+
clearTimeout(timeout);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export async function fetchJson(url, options = {}, timeoutMs = DEFAULT_TIMEOUT_MS) {
|
|
14
|
+
const response = await fetchWithTimeout(url, options, timeoutMs);
|
|
15
|
+
if (!response.ok) {
|
|
16
|
+
throw new Error(`HTTP ${response.status}: ${url}`);
|
|
17
|
+
}
|
|
18
|
+
return (await response.json());
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=http-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-utils.js","sourceRoot":"","sources":["../../src/live/http-utils.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAE9C,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAElC,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,GAAW,EACX,UAAuB,EAAE,EACzB,YAAoB,kBAAkB;IAEtC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;IAChE,IAAI,CAAC;QACH,OAAO,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IACrE,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,GAAW,EACX,UAAuB,EAAE,EACzB,YAAoB,kBAAkB;IAEtC,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACjE,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAM,CAAC;AACtC,CAAC"}
|
package/dist/live/index.d.ts
CHANGED
|
@@ -8,13 +8,17 @@
|
|
|
8
8
|
* Set FOURDA_OFFLINE=true to disable all network calls.
|
|
9
9
|
*/
|
|
10
10
|
import type Database from "better-sqlite3";
|
|
11
|
-
import type { ResolvedDependency, VulnerabilityScanResult, LiveHeadline, LiveIntelligenceStatus } from "./types.js";
|
|
12
|
-
export type { VulnerabilityScanResult, VulnerabilityEntry, LiveHeadline, LiveIntelligenceStatus } from "./types.js";
|
|
11
|
+
import type { ResolvedDependency, RegistryPackageInfo, VulnerabilityScanResult, LiveHeadline, LiveIntelligenceStatus } from "./types.js";
|
|
12
|
+
export type { VulnerabilityScanResult, VulnerabilityEntry, LiveHeadline, LiveIntelligenceStatus, RegistryPackageInfo, DependencyHealthResult } from "./types.js";
|
|
13
13
|
export declare class LiveIntelligence {
|
|
14
14
|
private cache;
|
|
15
15
|
private rateLimiter;
|
|
16
16
|
private osvScanner;
|
|
17
17
|
private hnFetcher;
|
|
18
|
+
private npmRegistry;
|
|
19
|
+
private cratesRegistry;
|
|
20
|
+
private pypiRegistry;
|
|
21
|
+
private goRegistry;
|
|
18
22
|
private enabled;
|
|
19
23
|
private lastVulnScan;
|
|
20
24
|
private lastHeadlines;
|
|
@@ -50,6 +54,7 @@ export declare class LiveIntelligence {
|
|
|
50
54
|
getResolvedDeps(): ResolvedDependency[];
|
|
51
55
|
isEnabled(): boolean;
|
|
52
56
|
isInitialized(): boolean;
|
|
57
|
+
fetchRegistryHealth(deps: ResolvedDependency[]): Promise<RegistryPackageInfo[]>;
|
|
53
58
|
getStatus(): LiveIntelligenceStatus;
|
|
54
59
|
}
|
|
55
60
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/live/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/live/index.ts"],"names":[],"mappings":"AACA;;;;;;;;GAQG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/live/index.ts"],"names":[],"mappings":"AACA;;;;;;;;GAQG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAU3C,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EACnB,uBAAuB,EACvB,YAAY,EACZ,sBAAsB,EACvB,MAAM,YAAY,CAAC;AAEpB,YAAY,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,YAAY,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEjK,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,KAAK,CAAY;IACzB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,OAAO,CAAU;IAEzB,OAAO,CAAC,YAAY,CAAwC;IAC5D,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,WAAW,CAAS;gBAEhB,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAYjC;;OAEG;IACH,eAAe,CACb,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE,MAAM,EAAE,EACjB,QAAQ,EAAE,MAAM,GACf,IAAI;IAKP;;OAEG;IACG,mBAAmB,CACvB,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,GACzD,OAAO,CAAC,uBAAuB,CAAC;IA2BnC;;OAEG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAWlE;;OAEG;IACH,kBAAkB,IAAI,uBAAuB,GAAG,IAAI;IAIpD;;OAEG;IACH,YAAY,IAAI,YAAY,EAAE;IAI9B;;OAEG;IACH,eAAe,IAAI,kBAAkB,EAAE;IAIvC,SAAS,IAAI,OAAO;IAIpB,aAAa,IAAI,OAAO;IAIlB,mBAAmB,CAAC,IAAI,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAgErF,SAAS,IAAI,sBAAsB;CAUpC"}
|
package/dist/live/index.js
CHANGED
|
@@ -13,11 +13,19 @@ import { RateLimiter, DEFAULT_RATE_LIMITS } from "./rate-limiter.js";
|
|
|
13
13
|
import { OsvScanner } from "./osv-scanner.js";
|
|
14
14
|
import { HNFetcher } from "./hn-fetcher.js";
|
|
15
15
|
import { resolveVersions } from "./version-resolver.js";
|
|
16
|
+
import { NpmRegistry } from "./npm-registry.js";
|
|
17
|
+
import { CratesRegistry } from "./crates-registry.js";
|
|
18
|
+
import { PyPIRegistry } from "./pypi-registry.js";
|
|
19
|
+
import { GoRegistry } from "./go-registry.js";
|
|
16
20
|
export class LiveIntelligence {
|
|
17
21
|
cache;
|
|
18
22
|
rateLimiter;
|
|
19
23
|
osvScanner;
|
|
20
24
|
hnFetcher;
|
|
25
|
+
npmRegistry;
|
|
26
|
+
cratesRegistry;
|
|
27
|
+
pypiRegistry;
|
|
28
|
+
goRegistry;
|
|
21
29
|
enabled;
|
|
22
30
|
lastVulnScan = null;
|
|
23
31
|
lastHeadlines = [];
|
|
@@ -29,6 +37,10 @@ export class LiveIntelligence {
|
|
|
29
37
|
this.rateLimiter = new RateLimiter(DEFAULT_RATE_LIMITS);
|
|
30
38
|
this.osvScanner = new OsvScanner(this.cache, this.rateLimiter);
|
|
31
39
|
this.hnFetcher = new HNFetcher(this.cache, this.rateLimiter);
|
|
40
|
+
this.npmRegistry = new NpmRegistry(this.cache, this.rateLimiter);
|
|
41
|
+
this.cratesRegistry = new CratesRegistry(this.cache, this.rateLimiter);
|
|
42
|
+
this.pypiRegistry = new PyPIRegistry(this.cache, this.rateLimiter);
|
|
43
|
+
this.goRegistry = new GoRegistry(this.cache, this.rateLimiter);
|
|
32
44
|
}
|
|
33
45
|
/**
|
|
34
46
|
* Initialize with project data. Call once after project scan.
|
|
@@ -102,6 +114,65 @@ export class LiveIntelligence {
|
|
|
102
114
|
isInitialized() {
|
|
103
115
|
return this.initialized;
|
|
104
116
|
}
|
|
117
|
+
async fetchRegistryHealth(deps) {
|
|
118
|
+
if (!this.enabled) {
|
|
119
|
+
return deps.map((d) => ({
|
|
120
|
+
name: d.name, ecosystem: d.ecosystem, currentVersion: d.version,
|
|
121
|
+
latestVersion: null, latestStableVersion: null, versionsBehind: null,
|
|
122
|
+
deprecated: false, deprecationMessage: null, lastPublished: null,
|
|
123
|
+
license: null, weeklyDownloads: null, isDev: d.isDev, fetchError: "Offline mode",
|
|
124
|
+
}));
|
|
125
|
+
}
|
|
126
|
+
const registryForEcosystem = (eco) => {
|
|
127
|
+
switch (eco) {
|
|
128
|
+
case "npm": return this.npmRegistry;
|
|
129
|
+
case "crates.io": return this.cratesRegistry;
|
|
130
|
+
case "PyPI": return this.pypiRegistry;
|
|
131
|
+
case "Go": return this.goRegistry;
|
|
132
|
+
default: return null;
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
const results = await Promise.all(deps.map(async (dep) => {
|
|
136
|
+
const registry = registryForEcosystem(dep.ecosystem);
|
|
137
|
+
if (!registry) {
|
|
138
|
+
return {
|
|
139
|
+
name: dep.name, ecosystem: dep.ecosystem, currentVersion: dep.version,
|
|
140
|
+
latestVersion: null, latestStableVersion: null, versionsBehind: null,
|
|
141
|
+
deprecated: false, deprecationMessage: null, lastPublished: null,
|
|
142
|
+
license: null, weeklyDownloads: null, isDev: dep.isDev,
|
|
143
|
+
fetchError: `No registry fetcher for ${dep.ecosystem}`,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
try {
|
|
147
|
+
return await registry.getPackageInfo(dep.name, dep.version, dep.isDev);
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
return {
|
|
151
|
+
name: dep.name, ecosystem: dep.ecosystem, currentVersion: dep.version,
|
|
152
|
+
latestVersion: null, latestStableVersion: null, versionsBehind: null,
|
|
153
|
+
deprecated: false, deprecationMessage: null, lastPublished: null,
|
|
154
|
+
license: null, weeklyDownloads: null, isDev: dep.isDev,
|
|
155
|
+
fetchError: "Registry fetch failed",
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
}));
|
|
159
|
+
// Bulk fetch npm downloads for npm deps
|
|
160
|
+
const npmDeps = deps.filter((d) => d.ecosystem === "npm");
|
|
161
|
+
if (npmDeps.length > 0) {
|
|
162
|
+
try {
|
|
163
|
+
const downloads = await this.npmRegistry.getBulkDownloads(npmDeps.map((d) => d.name));
|
|
164
|
+
for (const result of results) {
|
|
165
|
+
if (result.ecosystem === "npm" && downloads.has(result.name)) {
|
|
166
|
+
result.weeklyDownloads = downloads.get(result.name) || null;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
// Downloads are nice-to-have, not critical
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return results;
|
|
175
|
+
}
|
|
105
176
|
getStatus() {
|
|
106
177
|
return {
|
|
107
178
|
enabled: this.enabled,
|
package/dist/live/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/live/index.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C;;;;;;;;GAQG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAgB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/live/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* npm Registry Fetcher
|
|
3
|
+
*
|
|
4
|
+
* Queries the npm registry for package metadata (latest version, deprecation
|
|
5
|
+
* status, semver distance) and the npm downloads API for weekly download counts.
|
|
6
|
+
*
|
|
7
|
+
* Privacy: sends only package names — public manifest data.
|
|
8
|
+
*/
|
|
9
|
+
import type { LiveCache } from "./cache.js";
|
|
10
|
+
import type { RateLimiter } from "./rate-limiter.js";
|
|
11
|
+
import type { RegistryPackageInfo } from "./types.js";
|
|
12
|
+
export declare class NpmRegistry {
|
|
13
|
+
private cache;
|
|
14
|
+
private rateLimiter;
|
|
15
|
+
constructor(cache: LiveCache, rateLimiter: RateLimiter);
|
|
16
|
+
getPackageInfo(name: string, currentVersion: string | null, isDev: boolean): Promise<RegistryPackageInfo>;
|
|
17
|
+
getBulkDownloads(names: string[]): Promise<Map<string, number>>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=npm-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npm-registry.d.ts","sourceRoot":"","sources":["../../src/live/npm-registry.ts"],"names":[],"mappings":"AACA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,KAAK,EAAE,mBAAmB,EAAkB,MAAM,YAAY,CAAC;AAmBtE,qBAAa,WAAW;IACtB,OAAO,CAAC,KAAK,CAAY;IACzB,OAAO,CAAC,WAAW,CAAc;gBAErB,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW;IAKhD,cAAc,CAClB,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,GAAG,IAAI,EAC7B,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,mBAAmB,CAAC;IA+DzB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAiCtE"}
|