@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.
Files changed (60) hide show
  1. package/dist/index.d.ts +2 -2
  2. package/dist/index.js +5 -5
  3. package/dist/live/crates-registry.d.ts +18 -0
  4. package/dist/live/crates-registry.d.ts.map +1 -0
  5. package/dist/live/crates-registry.js +133 -0
  6. package/dist/live/crates-registry.js.map +1 -0
  7. package/dist/live/go-registry.d.ts +19 -0
  8. package/dist/live/go-registry.d.ts.map +1 -0
  9. package/dist/live/go-registry.js +127 -0
  10. package/dist/live/go-registry.js.map +1 -0
  11. package/dist/live/http-utils.d.ts +3 -0
  12. package/dist/live/http-utils.d.ts.map +1 -0
  13. package/dist/live/http-utils.js +20 -0
  14. package/dist/live/http-utils.js.map +1 -0
  15. package/dist/live/index.d.ts +7 -2
  16. package/dist/live/index.d.ts.map +1 -1
  17. package/dist/live/index.js +71 -0
  18. package/dist/live/index.js.map +1 -1
  19. package/dist/live/npm-registry.d.ts +19 -0
  20. package/dist/live/npm-registry.d.ts.map +1 -0
  21. package/dist/live/npm-registry.js +132 -0
  22. package/dist/live/npm-registry.js.map +1 -0
  23. package/dist/live/osv-scanner.d.ts.map +1 -1
  24. package/dist/live/osv-scanner.js +1 -10
  25. package/dist/live/osv-scanner.js.map +1 -1
  26. package/dist/live/pypi-registry.d.ts +18 -0
  27. package/dist/live/pypi-registry.d.ts.map +1 -0
  28. package/dist/live/pypi-registry.js +142 -0
  29. package/dist/live/pypi-registry.js.map +1 -0
  30. package/dist/live/rate-limiter.d.ts +12 -0
  31. package/dist/live/rate-limiter.d.ts.map +1 -1
  32. package/dist/live/rate-limiter.js +4 -0
  33. package/dist/live/rate-limiter.js.map +1 -1
  34. package/dist/live/semver-utils.d.ts +5 -0
  35. package/dist/live/semver-utils.d.ts.map +1 -0
  36. package/dist/live/semver-utils.js +28 -0
  37. package/dist/live/semver-utils.js.map +1 -0
  38. package/dist/live/types.d.ts +41 -0
  39. package/dist/live/types.d.ts.map +1 -1
  40. package/dist/schema-registry.d.ts.map +1 -1
  41. package/dist/schema-registry.js +14 -0
  42. package/dist/schema-registry.js.map +1 -1
  43. package/dist/schemas/dependency-health.json +27 -0
  44. package/dist/schemas/upgrade-planner.json +22 -0
  45. package/dist/tool-dispatch.d.ts.map +1 -1
  46. package/dist/tool-dispatch.js +3 -1
  47. package/dist/tool-dispatch.js.map +1 -1
  48. package/dist/tools/dependency-health.d.ts +45 -0
  49. package/dist/tools/dependency-health.d.ts.map +1 -0
  50. package/dist/tools/dependency-health.js +152 -0
  51. package/dist/tools/dependency-health.js.map +1 -0
  52. package/dist/tools/index.d.ts +2 -0
  53. package/dist/tools/index.d.ts.map +1 -1
  54. package/dist/tools/index.js +2 -0
  55. package/dist/tools/index.js.map +1 -1
  56. package/dist/tools/upgrade-planner.d.ts +59 -0
  57. package/dist/tools/upgrade-planner.d.ts.map +1 -0
  58. package/dist/tools/upgrade-planner.js +167 -0
  59. package/dist/tools/upgrade-planner.js.map +1 -0
  60. 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.3.0 — Dependency Intelligence Platform
15
+ * 4DA MCP Server v4.5.0 — Dependency Intelligence Platform
16
16
  *
17
- * 37 tools across 9 categories. Live vulnerability scanning (OSV.dev),
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.3.0 — Dependency Intelligence Platform
16
+ * 4DA MCP Server v4.5.0 — Dependency Intelligence Platform
17
17
  *
18
- * 37 tools across 9 categories. Live vulnerability scanning (OSV.dev),
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.3.0",
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.3.0");
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.3.0 started — ${toolCount} tools, stdio transport`);
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,3 @@
1
+ export declare function fetchWithTimeout(url: string, options?: RequestInit, timeoutMs?: number): Promise<Response>;
2
+ export declare function fetchJson<T>(url: string, options?: RequestInit, timeoutMs?: number): Promise<T>;
3
+ //# sourceMappingURL=http-utils.d.ts.map
@@ -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"}
@@ -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
@@ -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;AAM3C,OAAO,KAAK,EACV,kBAAkB,EAClB,uBAAuB,EACvB,YAAY,EACZ,sBAAsB,EACvB,MAAM,YAAY,CAAC;AAEpB,YAAY,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEpH,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,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;IAQjC;;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;IAIxB,SAAS,IAAI,sBAAsB;CAUpC"}
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"}
@@ -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,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/live/index.ts"],"names":[],"mappings":"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"}
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"}