upstream-radar 0.4.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 (92) hide show
  1. package/LICENSE +176 -0
  2. package/README.md +222 -0
  3. package/README.zh-CN.md +170 -0
  4. package/cordis.patch.yml +11 -0
  5. package/dist/src/cli.d.ts +3 -0
  6. package/dist/src/cli.d.ts.map +1 -0
  7. package/dist/src/cli.js +286 -0
  8. package/dist/src/cli.js.map +1 -0
  9. package/dist/src/compatibility.d.ts +12 -0
  10. package/dist/src/compatibility.d.ts.map +1 -0
  11. package/dist/src/compatibility.js +195 -0
  12. package/dist/src/compatibility.js.map +1 -0
  13. package/dist/src/dsh-analysis.d.ts +7 -0
  14. package/dist/src/dsh-analysis.d.ts.map +1 -0
  15. package/dist/src/dsh-analysis.js +53 -0
  16. package/dist/src/dsh-analysis.js.map +1 -0
  17. package/dist/src/dsh-plugin.d.ts +45 -0
  18. package/dist/src/dsh-plugin.d.ts.map +1 -0
  19. package/dist/src/dsh-plugin.js +121 -0
  20. package/dist/src/dsh-plugin.js.map +1 -0
  21. package/dist/src/graph.d.ts +14 -0
  22. package/dist/src/graph.d.ts.map +1 -0
  23. package/dist/src/graph.js +198 -0
  24. package/dist/src/graph.js.map +1 -0
  25. package/dist/src/index.d.ts +19 -0
  26. package/dist/src/index.d.ts.map +1 -0
  27. package/dist/src/index.js +19 -0
  28. package/dist/src/index.js.map +1 -0
  29. package/dist/src/inventory.d.ts +4 -0
  30. package/dist/src/inventory.d.ts.map +1 -0
  31. package/dist/src/inventory.js +182 -0
  32. package/dist/src/inventory.js.map +1 -0
  33. package/dist/src/npm-release.d.ts +24 -0
  34. package/dist/src/npm-release.d.ts.map +1 -0
  35. package/dist/src/npm-release.js +131 -0
  36. package/dist/src/npm-release.js.map +1 -0
  37. package/dist/src/npm.d.ts +36 -0
  38. package/dist/src/npm.d.ts.map +1 -0
  39. package/dist/src/npm.js +803 -0
  40. package/dist/src/npm.js.map +1 -0
  41. package/dist/src/osv.d.ts +18 -0
  42. package/dist/src/osv.d.ts.map +1 -0
  43. package/dist/src/osv.js +238 -0
  44. package/dist/src/osv.js.map +1 -0
  45. package/dist/src/policy.d.ts +5 -0
  46. package/dist/src/policy.d.ts.map +1 -0
  47. package/dist/src/policy.js +32 -0
  48. package/dist/src/policy.js.map +1 -0
  49. package/dist/src/radar-render.d.ts +4 -0
  50. package/dist/src/radar-render.d.ts.map +1 -0
  51. package/dist/src/radar-render.js +50 -0
  52. package/dist/src/radar-render.js.map +1 -0
  53. package/dist/src/radar-state.d.ts +5 -0
  54. package/dist/src/radar-state.d.ts.map +1 -0
  55. package/dist/src/radar-state.js +87 -0
  56. package/dist/src/radar-state.js.map +1 -0
  57. package/dist/src/radar-types.d.ts +163 -0
  58. package/dist/src/radar-types.d.ts.map +1 -0
  59. package/dist/src/radar-types.js +7 -0
  60. package/dist/src/radar-types.js.map +1 -0
  61. package/dist/src/radar.d.ts +24 -0
  62. package/dist/src/radar.d.ts.map +1 -0
  63. package/dist/src/radar.js +234 -0
  64. package/dist/src/radar.js.map +1 -0
  65. package/dist/src/render.d.ts +3 -0
  66. package/dist/src/render.d.ts.map +1 -0
  67. package/dist/src/render.js +58 -0
  68. package/dist/src/render.js.map +1 -0
  69. package/dist/src/scan.d.ts +8 -0
  70. package/dist/src/scan.d.ts.map +1 -0
  71. package/dist/src/scan.js +293 -0
  72. package/dist/src/scan.js.map +1 -0
  73. package/dist/src/semver.d.ts +13 -0
  74. package/dist/src/semver.d.ts.map +1 -0
  75. package/dist/src/semver.js +136 -0
  76. package/dist/src/semver.js.map +1 -0
  77. package/dist/src/tar.d.ts +25 -0
  78. package/dist/src/tar.d.ts.map +1 -0
  79. package/dist/src/tar.js +327 -0
  80. package/dist/src/tar.js.map +1 -0
  81. package/dist/src/types.d.ts +111 -0
  82. package/dist/src/types.d.ts.map +1 -0
  83. package/dist/src/types.js +2 -0
  84. package/dist/src/types.js.map +1 -0
  85. package/dist/src/version.d.ts +2 -0
  86. package/dist/src/version.d.ts.map +1 -0
  87. package/dist/src/version.js +2 -0
  88. package/dist/src/version.js.map +1 -0
  89. package/docs/assets/upstream-radar-hero-mobile.jpg +0 -0
  90. package/docs/assets/upstream-radar-hero.jpg +0 -0
  91. package/package.json +84 -0
  92. package/schemas/analysis-result.schema.json +39 -0
@@ -0,0 +1,163 @@
1
+ export declare const DEPENDENCY_GRAPH_SCHEMA: 'upstream-radar.dependency-graph/v1alpha1';
2
+ export declare const INVENTORY_SCHEMA: 'upstream-radar.inventory/v1alpha1';
3
+ export declare const RADAR_EVENT_SCHEMA: 'upstream-radar.event/v1alpha1';
4
+ export declare const RADAR_STATE_SCHEMA: 'upstream-radar.radar-state/v1alpha1';
5
+ export declare const ANALYSIS_TASK_SCHEMA: 'upstream-radar.analysis-task/v1alpha1';
6
+ export declare const RADAR_CONFIG_SCHEMA: 'upstream-radar.radar-config/v1alpha1';
7
+ export type PackageEcosystem = 'npm';
8
+ export interface PackageCoordinate {
9
+ ecosystem: PackageEcosystem;
10
+ name: string;
11
+ version: string;
12
+ }
13
+ export type DependencyKind = 'runtime' | 'development' | 'optional' | 'peer';
14
+ /** One physical package location. Duplicate name/version pairs remain distinct nodes. */
15
+ export interface DependencyNode {
16
+ id: string;
17
+ name: string;
18
+ version: string;
19
+ }
20
+ export interface DependencyEdge {
21
+ from: string;
22
+ to: string;
23
+ kind: DependencyKind;
24
+ }
25
+ export interface DependencyGraph {
26
+ schema: typeof DEPENDENCY_GRAPH_SCHEMA;
27
+ rootNodeId: string;
28
+ nodes: DependencyNode[];
29
+ edges: DependencyEdge[];
30
+ digest?: string;
31
+ unresolved?: Array<{
32
+ from: string;
33
+ name: string;
34
+ kind: DependencyKind;
35
+ spec: string;
36
+ }>;
37
+ }
38
+ export interface PackageManifestSnapshot {
39
+ name: string;
40
+ version: string;
41
+ type?: string;
42
+ main?: string;
43
+ exports?: unknown;
44
+ engines?: Record<string, string>;
45
+ dependencies?: Record<string, string>;
46
+ optionalDependencies?: Record<string, string>;
47
+ peerDependencies?: Record<string, string>;
48
+ dsh?: unknown;
49
+ }
50
+ export interface PluginInstallation {
51
+ package: PackageCoordinate;
52
+ graph: DependencyGraph;
53
+ manifest?: PackageManifestSnapshot;
54
+ }
55
+ export interface ProjectReference {
56
+ id: string;
57
+ name: string;
58
+ repository?: string;
59
+ workspace?: string;
60
+ owner?: string;
61
+ channels?: string[];
62
+ }
63
+ export interface ProjectInventory {
64
+ schema: typeof INVENTORY_SCHEMA;
65
+ project: ProjectReference;
66
+ environment?: {
67
+ nodeVersion?: string;
68
+ };
69
+ plugins: PluginInstallation[];
70
+ }
71
+ export interface RadarConfig {
72
+ schema: typeof RADAR_CONFIG_SCHEMA;
73
+ projects: ProjectInventory[];
74
+ }
75
+ export type RadarSeverity = 'unknown' | 'info' | 'low' | 'medium' | 'high' | 'critical';
76
+ export interface VulnerabilityAdvisory {
77
+ id: string;
78
+ aliases: string[];
79
+ summary: string;
80
+ details: string;
81
+ severity: RadarSeverity;
82
+ published?: string;
83
+ modified: string;
84
+ withdrawn?: string;
85
+ fixedVersions: string[];
86
+ references: string[];
87
+ }
88
+ export interface AdvisoryMatch {
89
+ package: PackageCoordinate;
90
+ advisory: VulnerabilityAdvisory;
91
+ }
92
+ export interface EventRoute {
93
+ owner?: string;
94
+ channels: string[];
95
+ }
96
+ interface RadarEventBase {
97
+ schema: typeof RADAR_EVENT_SCHEMA;
98
+ id: string;
99
+ /** Stable across new/updated/resolved transitions for one project-specific problem. */
100
+ incidentId: string;
101
+ change: 'new' | 'updated' | 'resolved';
102
+ detectedAt: string;
103
+ project: ProjectReference;
104
+ route: EventRoute;
105
+ plugin: PackageCoordinate;
106
+ }
107
+ export interface VulnerabilityEvent extends RadarEventBase {
108
+ kind: 'vulnerability' | 'malware';
109
+ affected: PackageCoordinate;
110
+ paths: PackageCoordinate[][];
111
+ advisory: VulnerabilityAdvisory;
112
+ }
113
+ export type CompatibilitySignalConfidence = 'confirmed' | 'strong' | 'needs-analysis';
114
+ export interface CompatibilitySignal {
115
+ code: string;
116
+ confidence: CompatibilitySignalConfidence;
117
+ summary: string;
118
+ before?: string;
119
+ after?: string;
120
+ }
121
+ export interface CompatibilityEvent extends RadarEventBase {
122
+ kind: 'compatibility';
123
+ installed: PackageCoordinate;
124
+ candidate: PackageCoordinate;
125
+ signals: CompatibilitySignal[];
126
+ releaseNotes?: string;
127
+ }
128
+ export type RadarEvent = VulnerabilityEvent | CompatibilityEvent;
129
+ export interface StoredVulnerabilityMatch {
130
+ key: string;
131
+ event: VulnerabilityEvent;
132
+ }
133
+ export interface StoredCompatibilityMatch {
134
+ key: string;
135
+ event: CompatibilityEvent;
136
+ }
137
+ export interface RadarState {
138
+ schema: typeof RADAR_STATE_SCHEMA;
139
+ activeVulnerabilities: Record<string, StoredVulnerabilityMatch>;
140
+ activeCompatibility: Record<string, StoredCompatibilityMatch>;
141
+ pendingAnalysisTasks: AnalysisTask[];
142
+ }
143
+ export interface AnalysisTask {
144
+ schema: typeof ANALYSIS_TASK_SCHEMA;
145
+ id: string;
146
+ createdAt: string;
147
+ event: RadarEvent;
148
+ constraints: {
149
+ sourceMaterialIsUntrusted: true;
150
+ readOnly: true;
151
+ requireProjectEvidence: true;
152
+ };
153
+ expectedOutput: {
154
+ project_exposure: 'exposed | likely_exposed | not_exposed | unknown';
155
+ confidence: 'high | medium | low';
156
+ evidence: 'array of repository paths, symbols, configuration, or runtime facts';
157
+ recommended_action: 'project-specific next action';
158
+ urgency: 'immediate | within_24_hours | planned | monitor';
159
+ reasoning_summary: 'short explanation separating deterministic facts from model analysis';
160
+ };
161
+ }
162
+ export {};
163
+ //# sourceMappingURL=radar-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"radar-types.d.ts","sourceRoot":"","sources":["../../src/radar-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export const DEPENDENCY_GRAPH_SCHEMA = 'upstream-radar.dependency-graph/v1alpha1';
2
+ export const INVENTORY_SCHEMA = 'upstream-radar.inventory/v1alpha1';
3
+ export const RADAR_EVENT_SCHEMA = 'upstream-radar.event/v1alpha1';
4
+ export const RADAR_STATE_SCHEMA = 'upstream-radar.radar-state/v1alpha1';
5
+ export const ANALYSIS_TASK_SCHEMA = 'upstream-radar.analysis-task/v1alpha1';
6
+ export const RADAR_CONFIG_SCHEMA = 'upstream-radar.radar-config/v1alpha1';
7
+ //# sourceMappingURL=radar-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"radar-types.js","sourceRoot":"","sources":["../../src/radar-types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,uBAAuB,GAAG,0CAAmD,CAAA;AAC1F,MAAM,CAAC,MAAM,gBAAgB,GAAG,mCAA4C,CAAA;AAC5E,MAAM,CAAC,MAAM,kBAAkB,GAAG,+BAAwC,CAAA;AAC1E,MAAM,CAAC,MAAM,kBAAkB,GAAG,qCAA8C,CAAA;AAChF,MAAM,CAAC,MAAM,oBAAoB,GAAG,uCAAgD,CAAA;AACpF,MAAM,CAAC,MAAM,mBAAmB,GAAG,sCAA+C,CAAA"}
@@ -0,0 +1,24 @@
1
+ import type { NpmReleaseObservation } from './npm-release.js';
2
+ import { type AdvisoryMatch, type AnalysisTask, type PackageCoordinate, type ProjectInventory, type RadarEvent, type RadarState } from './radar-types.js';
3
+ export interface AdvisorySource {
4
+ query(packages: readonly PackageCoordinate[]): Promise<Map<string, AdvisoryMatch[]>>;
5
+ }
6
+ export interface ReleaseSource {
7
+ query(packages: readonly PackageCoordinate[]): Promise<Map<string, NpmReleaseObservation>>;
8
+ }
9
+ export interface RadarPollResult {
10
+ checkedAt: string;
11
+ packagesQueried: number;
12
+ releasePackagesQueried: number;
13
+ events: RadarEvent[];
14
+ analysisTasks: AnalysisTask[];
15
+ sourceErrors: Array<{
16
+ source: 'npm-releases';
17
+ message: string;
18
+ }>;
19
+ state: RadarState;
20
+ }
21
+ export declare function emptyRadarState(): RadarState;
22
+ /** Query exact installed versions, calculate affected paths, and emit state transitions only. */
23
+ export declare function pollRadar(inventories: readonly ProjectInventory[], previousState: RadarState, source: AdvisorySource, now?: Date, releaseSource?: ReleaseSource): Promise<RadarPollResult>;
24
+ //# sourceMappingURL=radar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"radar.d.ts","sourceRoot":"","sources":["../../src/radar.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AAE7D,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,YAAY,EAEjB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,UAAU,EACf,KAAK,UAAU,EAIhB,MAAM,kBAAkB,CAAA;AAEzB,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,QAAQ,EAAE,SAAS,iBAAiB,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC,CAAA;CACrF;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,QAAQ,EAAE,SAAS,iBAAiB,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAAA;CAC3F;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,eAAe,EAAE,MAAM,CAAA;IACvB,sBAAsB,EAAE,MAAM,CAAA;IAC9B,MAAM,EAAE,UAAU,EAAE,CAAA;IACpB,aAAa,EAAE,YAAY,EAAE,CAAA;IAC7B,YAAY,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,cAAc,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAChE,KAAK,EAAE,UAAU,CAAA;CAClB;AAiDD,wBAAgB,eAAe,IAAI,UAAU,CAE5C;AAED,iGAAiG;AACjG,wBAAsB,SAAS,CAC7B,WAAW,EAAE,SAAS,gBAAgB,EAAE,EACxC,aAAa,EAAE,UAAU,EACzB,MAAM,EAAE,cAAc,EACtB,GAAG,OAAa,EAChB,aAAa,CAAC,EAAE,aAAa,GAC5B,OAAO,CAAC,eAAe,CAAC,CAyL1B"}
@@ -0,0 +1,234 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { createAnalysisTask } from './dsh-analysis.js';
3
+ import { assessCompatibilityChanges } from './compatibility.js';
4
+ import { findDependencyPaths } from './graph.js';
5
+ import { packageKey } from './osv.js';
6
+ import { RADAR_EVENT_SCHEMA, RADAR_STATE_SCHEMA, } from './radar-types.js';
7
+ function hash(value) {
8
+ return createHash('sha256').update(value).digest('hex').slice(0, 24);
9
+ }
10
+ function route(inventory) {
11
+ return {
12
+ ...(inventory.project.owner === undefined ? {} : { owner: inventory.project.owner }),
13
+ channels: inventory.project.channels === undefined || inventory.project.channels.length === 0
14
+ ? ['stdout']
15
+ : [...inventory.project.channels],
16
+ };
17
+ }
18
+ function coordinate(name, version) {
19
+ return { ecosystem: 'npm', name, version };
20
+ }
21
+ function matchKey(inventory, plugin, affected, advisoryId) {
22
+ return [inventory.project.id, packageKey(plugin), packageKey(affected), advisoryId].join('\0');
23
+ }
24
+ function eventId(key, change, detectedAt, modified) {
25
+ return `event-${hash(`${key}\0${change}\0${detectedAt}\0${modified}`)}`;
26
+ }
27
+ function eventChanged(previous, current) {
28
+ return JSON.stringify(previous.advisory) !== JSON.stringify(current.advisory)
29
+ || JSON.stringify(previous.paths) !== JSON.stringify(current.paths)
30
+ || JSON.stringify(previous.route) !== JSON.stringify(current.route);
31
+ }
32
+ function compatibilityEventChanged(previous, current) {
33
+ if (previous.kind !== 'compatibility' || current.kind !== 'compatibility')
34
+ return true;
35
+ return JSON.stringify(previous.project) !== JSON.stringify(current.project)
36
+ || JSON.stringify(previous.route) !== JSON.stringify(current.route)
37
+ || JSON.stringify(previous.plugin) !== JSON.stringify(current.plugin)
38
+ || JSON.stringify(previous.installed) !== JSON.stringify(current.installed)
39
+ || JSON.stringify(previous.candidate) !== JSON.stringify(current.candidate)
40
+ || JSON.stringify(previous.signals) !== JSON.stringify(current.signals)
41
+ || previous.releaseNotes !== current.releaseNotes;
42
+ }
43
+ export function emptyRadarState() {
44
+ return { schema: RADAR_STATE_SCHEMA, activeVulnerabilities: {}, activeCompatibility: {}, pendingAnalysisTasks: [] };
45
+ }
46
+ /** Query exact installed versions, calculate affected paths, and emit state transitions only. */
47
+ export async function pollRadar(inventories, previousState, source, now = new Date(), releaseSource) {
48
+ if (previousState.schema !== RADAR_STATE_SCHEMA)
49
+ throw new Error('unsupported radar state schema');
50
+ if (!Number.isFinite(now.getTime()))
51
+ throw new Error('radar check time is invalid');
52
+ const checkedAt = now.toISOString();
53
+ const uniquePackages = new Map();
54
+ for (const inventory of inventories) {
55
+ for (const plugin of inventory.plugins) {
56
+ for (const node of plugin.graph.nodes) {
57
+ const item = coordinate(node.name, node.version);
58
+ uniquePackages.set(packageKey(item), item);
59
+ }
60
+ }
61
+ }
62
+ const matches = await source.query([...uniquePackages.values()]);
63
+ const current = new Map();
64
+ for (const inventory of inventories) {
65
+ for (const plugin of inventory.plugins) {
66
+ const groupedPaths = new Map();
67
+ const groupedMatch = new Map();
68
+ for (const node of plugin.graph.nodes) {
69
+ const affected = coordinate(node.name, node.version);
70
+ for (const match of matches.get(packageKey(affected)) ?? []) {
71
+ const key = matchKey(inventory, plugin.package, affected, match.advisory.id);
72
+ const paths = findDependencyPaths(plugin.graph, node.id).map(path => (path.map(item => coordinate(item.name, item.version))));
73
+ if (paths.length === 0)
74
+ continue;
75
+ const existing = groupedPaths.get(key) ?? [];
76
+ const known = new Set(existing.map(path => JSON.stringify(path)));
77
+ for (const path of paths) {
78
+ const serialized = JSON.stringify(path);
79
+ if (!known.has(serialized)) {
80
+ existing.push(path);
81
+ known.add(serialized);
82
+ }
83
+ }
84
+ groupedPaths.set(key, existing);
85
+ groupedMatch.set(key, match);
86
+ }
87
+ }
88
+ for (const [key, paths] of groupedPaths) {
89
+ const match = groupedMatch.get(key);
90
+ if (match === undefined)
91
+ continue;
92
+ paths.sort((left, right) => JSON.stringify(left).localeCompare(JSON.stringify(right)));
93
+ const event = {
94
+ schema: RADAR_EVENT_SCHEMA,
95
+ id: eventId(key, 'new', checkedAt, match.advisory.modified),
96
+ incidentId: `incident-${hash(key)}`,
97
+ kind: match.advisory.id.startsWith('MAL-') ? 'malware' : 'vulnerability',
98
+ change: 'new',
99
+ detectedAt: checkedAt,
100
+ project: { ...inventory.project },
101
+ route: route(inventory),
102
+ plugin: { ...plugin.package },
103
+ affected: { ...match.package },
104
+ paths,
105
+ advisory: { ...match.advisory },
106
+ };
107
+ current.set(key, { key, event });
108
+ }
109
+ }
110
+ }
111
+ const events = [];
112
+ for (const [key, item] of current) {
113
+ const previous = previousState.activeVulnerabilities[key];
114
+ if (previous === undefined) {
115
+ events.push(item.event);
116
+ continue;
117
+ }
118
+ if (eventChanged(previous.event, item.event)) {
119
+ events.push({
120
+ ...item.event,
121
+ id: eventId(key, 'updated', checkedAt, item.event.advisory.modified),
122
+ change: 'updated',
123
+ });
124
+ }
125
+ }
126
+ for (const [key, previous] of Object.entries(previousState.activeVulnerabilities)) {
127
+ if (current.has(key))
128
+ continue;
129
+ events.push({
130
+ ...previous.event,
131
+ id: eventId(key, 'resolved', checkedAt, previous.event.advisory.modified),
132
+ change: 'resolved',
133
+ detectedAt: checkedAt,
134
+ });
135
+ }
136
+ const releasePackages = new Map();
137
+ if (releaseSource !== undefined) {
138
+ for (const inventory of inventories) {
139
+ for (const plugin of inventory.plugins) {
140
+ releasePackages.set(packageKey(plugin.package), plugin.package);
141
+ for (const node of plugin.graph.nodes) {
142
+ if (!(node.name.startsWith('@deepseek-ai/dsh-') || node.name === '@deepseek-ai/cordis'))
143
+ continue;
144
+ const item = coordinate(node.name, node.version);
145
+ releasePackages.set(packageKey(item), item);
146
+ }
147
+ }
148
+ }
149
+ }
150
+ const sourceErrors = [];
151
+ let activeCompatibility = previousState.activeCompatibility;
152
+ if (releaseSource !== undefined) {
153
+ let releases;
154
+ let releaseCheckSucceeded = false;
155
+ try {
156
+ releases = await releaseSource.query([...releasePackages.values()]);
157
+ releaseCheckSucceeded = true;
158
+ }
159
+ catch (error) {
160
+ const raw = error instanceof Error ? error.message : String(error);
161
+ sourceErrors.push({
162
+ source: 'npm-releases',
163
+ message: raw.replace(/[\u0000-\u001f\u007f-\u009f]/g, '?').slice(0, 2_048),
164
+ });
165
+ releases = new Map();
166
+ }
167
+ if (releaseCheckSucceeded) {
168
+ const currentCompatibility = new Map();
169
+ for (const inventory of inventories) {
170
+ for (const observation of releases.values()) {
171
+ const compatibilityEvents = assessCompatibilityChanges(inventory, {
172
+ previous: observation.previous,
173
+ candidate: observation.candidate,
174
+ detectedAt: checkedAt,
175
+ });
176
+ for (const event of compatibilityEvents) {
177
+ currentCompatibility.set(event.incidentId, { key: event.incidentId, event });
178
+ }
179
+ }
180
+ }
181
+ for (const [key, item] of currentCompatibility) {
182
+ const previous = previousState.activeCompatibility[key];
183
+ if (previous === undefined) {
184
+ events.push(item.event);
185
+ continue;
186
+ }
187
+ if (compatibilityEventChanged(previous.event, item.event)) {
188
+ events.push({
189
+ ...item.event,
190
+ id: `event-${hash(`${key}\0updated\0${checkedAt}\0${item.event.candidate.version}`)}`,
191
+ change: 'updated',
192
+ });
193
+ }
194
+ }
195
+ for (const [key, previous] of Object.entries(previousState.activeCompatibility)) {
196
+ if (currentCompatibility.has(key))
197
+ continue;
198
+ events.push({
199
+ ...previous.event,
200
+ id: `event-${hash(`${key}\0resolved\0${checkedAt}`)}`,
201
+ change: 'resolved',
202
+ detectedAt: checkedAt,
203
+ });
204
+ }
205
+ activeCompatibility = Object.fromEntries(currentCompatibility);
206
+ }
207
+ }
208
+ events.sort((left, right) => left.id.localeCompare(right.id));
209
+ const analysisTasks = events
210
+ .filter(event => event.change !== 'resolved')
211
+ .map(createAnalysisTask);
212
+ const pending = new Map(previousState.pendingAnalysisTasks.map(task => [task.event.incidentId, task]));
213
+ for (const event of events) {
214
+ if (event.change === 'resolved')
215
+ pending.delete(event.incidentId);
216
+ }
217
+ for (const task of analysisTasks)
218
+ pending.set(task.event.incidentId, task);
219
+ return {
220
+ checkedAt,
221
+ packagesQueried: uniquePackages.size,
222
+ releasePackagesQueried: releasePackages.size,
223
+ events,
224
+ analysisTasks,
225
+ sourceErrors,
226
+ state: {
227
+ schema: RADAR_STATE_SCHEMA,
228
+ activeVulnerabilities: Object.fromEntries([...current.entries()]),
229
+ activeCompatibility,
230
+ pendingAnalysisTasks: [...pending.values()],
231
+ },
232
+ };
233
+ }
234
+ //# sourceMappingURL=radar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"radar.js","sourceRoot":"","sources":["../../src/radar.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ScanReport } from './types.js';
2
+ export declare function renderTextReport(report: ScanReport): string;
3
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAS5C,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CA2D3D"}
@@ -0,0 +1,58 @@
1
+ function display(value, maxLength = 512) {
2
+ const escaped = value.replace(/[\u0000-\u001f\u007f-\u009f]/g, character => (`\\u${character.codePointAt(0)?.toString(16).padStart(4, '0') ?? '0000'}`));
3
+ return escaped.length <= maxLength ? escaped : `${escaped.slice(0, maxLength)}…`;
4
+ }
5
+ export function renderTextReport(report) {
6
+ const lines = [
7
+ `Upstream Radar ${report.tool.version}`,
8
+ `Target: ${display(report.target.name)}${report.target.version === null ? '' : `@${display(report.target.version)}`}`,
9
+ `Artifact: ${report.target.artifactDigest}`,
10
+ `DSH bundle: ${report.dsh.isBundle ? `yes (${display(report.dsh.patch ?? 'patch unspecified')})` : 'no'}`,
11
+ `Admission verdict: ${report.verdict.toUpperCase()}`,
12
+ `Risk verdict: ${report.riskVerdict.toUpperCase()}`,
13
+ `Coverage verdict: ${report.coverageVerdict.toUpperCase()}`,
14
+ '',
15
+ 'Coverage:',
16
+ ` static source: ${report.coverage.staticSource}`,
17
+ ` artifact integrity: ${report.coverage.artifactIntegrity}`,
18
+ ` registry signature: ${report.coverage.registrySignature}`,
19
+ ` dependency resolution: ${report.coverage.dependencyResolution}`,
20
+ ` provenance: ${report.coverage.provenance}`,
21
+ ` source/artifact match: ${report.coverage.sourceArtifactMatch}`,
22
+ ` sandbox detonation: ${report.coverage.sandboxDetonation}`,
23
+ '',
24
+ `Evidence: ${report.evidence.filesScanned} ${report.evidence.filesScanned === 1 ? 'file' : 'files'}, ${report.evidence.bytesHashed} bytes, ${report.evidence.dependencies.length} dependency declarations`,
25
+ ];
26
+ if (report.evidence.npm !== undefined) {
27
+ const npm = report.evidence.npm;
28
+ lines.push('', 'npm chain of custody:', ` registry: ${display(npm.registry)}`, ` tarball integrity: ${npm.integrity.status} (${npm.integrity.algorithm})`, ` registry signature: ${npm.registrySignature.status}`, ` provenance: ${npm.provenance.status}`, ` dependency audit: ${npm.dependencyAudit.status}`, ` resolved packages: ${npm.dependencyAudit.packages ?? 'not resolved'}`);
29
+ if (npm.provenance.sourceRepository !== undefined)
30
+ lines.push(` source repository: ${display(npm.provenance.sourceRepository)}`);
31
+ if (npm.provenance.sourceCommit !== undefined)
32
+ lines.push(` source commit: ${display(npm.provenance.sourceCommit)}`);
33
+ if (npm.provenance.workflow !== undefined)
34
+ lines.push(` build workflow: ${display(npm.provenance.workflow)}`);
35
+ if (npm.dependencyAudit.graphDigest !== undefined)
36
+ lines.push(` graph digest: ${npm.dependencyAudit.graphDigest}`);
37
+ if (npm.dependencyAudit.graph?.unresolved !== undefined) {
38
+ lines.push(` unresolved dependency edges: ${npm.dependencyAudit.graph.unresolved.length}`);
39
+ }
40
+ if (npm.dependencyAudit.vulnerabilities !== null) {
41
+ const vulnerabilities = npm.dependencyAudit.vulnerabilities;
42
+ lines.push(` known vulnerabilities: ${vulnerabilities.total} total (${vulnerabilities.critical} critical, ${vulnerabilities.high} high)`);
43
+ }
44
+ }
45
+ if (report.findings.length === 0) {
46
+ lines.push('', 'No findings in the implemented static checks.');
47
+ }
48
+ else {
49
+ lines.push('', `Findings (${report.findings.length}):`);
50
+ for (const finding of report.findings) {
51
+ lines.push(` [${finding.severity.toUpperCase()}] ${display(finding.code)}: ${display(finding.summary)}`);
52
+ lines.push(` ${display(finding.detail, 2_048)}`);
53
+ }
54
+ }
55
+ lines.push('', 'This is a bounded evidence report, not a guarantee that the plugin is safe.');
56
+ return `${lines.join('\n')}\n`;
57
+ }
58
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/render.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { type ScanReport } from './types.js';
2
+ export interface ScanOptions {
3
+ maxFiles?: number;
4
+ maxTotalBytes?: number;
5
+ dependencyGraphResolved?: boolean;
6
+ }
7
+ export declare function scanDirectory(input: string, options?: ScanOptions): Promise<ScanReport>;
8
+ //# sourceMappingURL=scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/scan.ts"],"names":[],"mappings":"AASA,OAAO,EAML,KAAK,UAAU,EAEhB,MAAM,YAAY,CAAA;AAuCnB,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,uBAAuB,CAAC,EAAE,OAAO,CAAA;CAClC;AAuYD,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,CA4DjG"}