upstream-radar 0.32.0 → 0.33.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 (106) hide show
  1. package/README.md +396 -43
  2. package/cordis.patch.yml +1 -0
  3. package/dist/src/cli.js +950 -33
  4. package/dist/src/cli.js.map +1 -1
  5. package/dist/src/compatibility.d.ts +3 -1
  6. package/dist/src/compatibility.d.ts.map +1 -1
  7. package/dist/src/compatibility.js +146 -12
  8. package/dist/src/compatibility.js.map +1 -1
  9. package/dist/src/demo.d.ts +13 -0
  10. package/dist/src/demo.d.ts.map +1 -0
  11. package/dist/src/demo.js +85 -0
  12. package/dist/src/demo.js.map +1 -0
  13. package/dist/src/doctor.d.ts.map +1 -1
  14. package/dist/src/doctor.js +62 -0
  15. package/dist/src/doctor.js.map +1 -1
  16. package/dist/src/dsh-analysis.d.ts.map +1 -1
  17. package/dist/src/dsh-analysis.js +2 -1
  18. package/dist/src/dsh-analysis.js.map +1 -1
  19. package/dist/src/dsh-plugin.d.ts +9 -3
  20. package/dist/src/dsh-plugin.d.ts.map +1 -1
  21. package/dist/src/dsh-plugin.js +87 -11
  22. package/dist/src/dsh-plugin.js.map +1 -1
  23. package/dist/src/dsh-runtime.d.ts +7 -0
  24. package/dist/src/dsh-runtime.d.ts.map +1 -1
  25. package/dist/src/dsh-runtime.js +21 -0
  26. package/dist/src/dsh-runtime.js.map +1 -1
  27. package/dist/src/github-advisory.d.ts +25 -0
  28. package/dist/src/github-advisory.d.ts.map +1 -0
  29. package/dist/src/github-advisory.js +335 -0
  30. package/dist/src/github-advisory.js.map +1 -0
  31. package/dist/src/graph.d.ts +2 -0
  32. package/dist/src/graph.d.ts.map +1 -1
  33. package/dist/src/graph.js +600 -4
  34. package/dist/src/graph.js.map +1 -1
  35. package/dist/src/index.d.ts +14 -6
  36. package/dist/src/index.d.ts.map +1 -1
  37. package/dist/src/index.js +13 -5
  38. package/dist/src/index.js.map +1 -1
  39. package/dist/src/init.d.ts +44 -2
  40. package/dist/src/init.d.ts.map +1 -1
  41. package/dist/src/init.js +62 -5
  42. package/dist/src/init.js.map +1 -1
  43. package/dist/src/installed-graph.d.ts +3 -1
  44. package/dist/src/installed-graph.d.ts.map +1 -1
  45. package/dist/src/installed-graph.js +101 -2
  46. package/dist/src/installed-graph.js.map +1 -1
  47. package/dist/src/inventory.d.ts.map +1 -1
  48. package/dist/src/inventory.js +76 -2
  49. package/dist/src/inventory.js.map +1 -1
  50. package/dist/src/notification-policy.d.ts +20 -0
  51. package/dist/src/notification-policy.d.ts.map +1 -0
  52. package/dist/src/notification-policy.js +87 -0
  53. package/dist/src/notification-policy.js.map +1 -0
  54. package/dist/src/npm-release.d.ts.map +1 -1
  55. package/dist/src/npm-release.js +18 -7
  56. package/dist/src/npm-release.js.map +1 -1
  57. package/dist/src/osv.d.ts.map +1 -1
  58. package/dist/src/osv.js +1 -0
  59. package/dist/src/osv.js.map +1 -1
  60. package/dist/src/quickstart.d.ts +31 -0
  61. package/dist/src/quickstart.d.ts.map +1 -0
  62. package/dist/src/quickstart.js +266 -0
  63. package/dist/src/quickstart.js.map +1 -0
  64. package/dist/src/radar-history.d.ts +22 -0
  65. package/dist/src/radar-history.d.ts.map +1 -0
  66. package/dist/src/radar-history.js +80 -0
  67. package/dist/src/radar-history.js.map +1 -0
  68. package/dist/src/radar-render.d.ts.map +1 -1
  69. package/dist/src/radar-render.js +106 -1
  70. package/dist/src/radar-render.js.map +1 -1
  71. package/dist/src/radar-state.d.ts.map +1 -1
  72. package/dist/src/radar-state.js +264 -6
  73. package/dist/src/radar-state.js.map +1 -1
  74. package/dist/src/radar-status.d.ts +36 -1
  75. package/dist/src/radar-status.d.ts.map +1 -1
  76. package/dist/src/radar-status.js +199 -16
  77. package/dist/src/radar-status.js.map +1 -1
  78. package/dist/src/radar-types.d.ts +128 -3
  79. package/dist/src/radar-types.d.ts.map +1 -1
  80. package/dist/src/radar-types.js +4 -0
  81. package/dist/src/radar-types.js.map +1 -1
  82. package/dist/src/radar.d.ts +7 -1
  83. package/dist/src/radar.d.ts.map +1 -1
  84. package/dist/src/radar.js +432 -70
  85. package/dist/src/radar.js.map +1 -1
  86. package/dist/src/render.d.ts.map +1 -1
  87. package/dist/src/render.js +10 -0
  88. package/dist/src/render.js.map +1 -1
  89. package/dist/src/threat-intel.d.ts +46 -0
  90. package/dist/src/threat-intel.d.ts.map +1 -0
  91. package/dist/src/threat-intel.js +243 -0
  92. package/dist/src/threat-intel.js.map +1 -0
  93. package/dist/src/version.d.ts +1 -1
  94. package/dist/src/version.js +1 -1
  95. package/dist/src/vulnerability-priority.d.ts +16 -0
  96. package/dist/src/vulnerability-priority.d.ts.map +1 -0
  97. package/dist/src/vulnerability-priority.js +20 -0
  98. package/dist/src/vulnerability-priority.js.map +1 -0
  99. package/dist/src/webhook.d.ts +84 -0
  100. package/dist/src/webhook.d.ts.map +1 -0
  101. package/dist/src/webhook.js +432 -0
  102. package/dist/src/webhook.js.map +1 -0
  103. package/docs/README.zh-CN.md +394 -40
  104. package/package.json +22 -3
  105. package/schemas/quickstart.schema.json +56 -0
  106. package/schemas/webhook.schema.json +53 -0
@@ -0,0 +1,85 @@
1
+ import { createAnalysisTask } from './dsh-analysis.js';
2
+ import { renderRadarEvent } from './radar-render.js';
3
+ import { RADAR_EVENT_SCHEMA, } from './radar-types.js';
4
+ export const DEMO_SCHEMA = 'upstream-radar.demo/v1alpha1';
5
+ export function createDemoEvent() {
6
+ return {
7
+ schema: RADAR_EVENT_SCHEMA,
8
+ id: 'demo-event-parser-2-9-0',
9
+ incidentId: 'demo-project\u0000parser\u00002.9.0\u0000GHSA-demo-parser',
10
+ kind: 'vulnerability',
11
+ change: 'new',
12
+ detectedAt: '2026-08-16T00:00:00.000Z',
13
+ project: { id: 'demo-project', name: 'Demo project' },
14
+ route: { channels: ['stdout'] },
15
+ plugin: { ecosystem: 'npm', name: 'demo-plugin', version: '1.0.0' },
16
+ affected: { ecosystem: 'npm', name: 'parser', version: '2.9.0' },
17
+ affectedSources: ['profile'],
18
+ paths: [[
19
+ { ecosystem: 'npm', name: 'demo-plugin', version: '1.0.0' },
20
+ { ecosystem: 'npm', name: 'logger', version: '4.0.2' },
21
+ { ecosystem: 'npm', name: 'parser', version: '2.9.0' },
22
+ ]],
23
+ advisory: {
24
+ id: 'GHSA-demo-parser',
25
+ aliases: ['CVE-2026-1234'],
26
+ summary: 'The demo parser advisory is attached to the exact transitive path.',
27
+ details: 'This deterministic local fixture exists only to demonstrate the Radar-to-DSH handoff.',
28
+ severity: 'high',
29
+ published: '2026-08-15T00:00:00.000Z',
30
+ modified: '2026-08-16T00:00:00.000Z',
31
+ fixedVersions: ['3.0.0', '3.1.0'],
32
+ references: ['https://example.test/advisories/GHSA-demo-parser'],
33
+ sources: ['osv', 'github-advisories'],
34
+ conflicts: [{
35
+ field: 'fixed-versions',
36
+ claims: [
37
+ { source: 'osv', value: '3.0.0' },
38
+ { source: 'github-advisories', value: '3.1.0' },
39
+ ],
40
+ }],
41
+ riskSignals: {
42
+ cisaKev: {
43
+ knownExploited: true,
44
+ dateAdded: '2026-08-15',
45
+ dueDate: '2026-08-22',
46
+ },
47
+ epss: {
48
+ score: 0.97224,
49
+ percentile: 0.99999,
50
+ date: '2026-08-16',
51
+ },
52
+ },
53
+ },
54
+ };
55
+ }
56
+ export function createDemoReport() {
57
+ const event = createDemoEvent();
58
+ return {
59
+ schema: DEMO_SCHEMA,
60
+ networkFree: true,
61
+ event,
62
+ analysisTask: createAnalysisTask(event),
63
+ nextCommand: 'npx --yes upstream-radar@latest setup --project-name "My DSH project"',
64
+ };
65
+ }
66
+ export function renderDemo(report = createDemoReport()) {
67
+ return [
68
+ 'Upstream Radar demo — network-free; no DSH profile required',
69
+ '',
70
+ '1. Deterministic fact',
71
+ renderRadarEvent(report.event).trim(),
72
+ '',
73
+ '2. DSH Agent follow-up',
74
+ `Task: ${report.analysisTask.id}`,
75
+ 'Read-only project analysis; advisory text is untrusted data, not an instruction.',
76
+ 'Radar accepts only the strict JSON result bound to this task and event.',
77
+ '',
78
+ 'Try it for real:',
79
+ ` ${report.nextCommand}`,
80
+ '',
81
+ 'This demo uses a local fixture. It does not query OSV, inspect your repository, install packages, or claim that the demo advisory is real.',
82
+ '',
83
+ ].join('\n');
84
+ }
85
+ //# sourceMappingURL=demo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demo.js","sourceRoot":"","sources":["../../src/demo.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/doctor.ts"],"names":[],"mappings":"AAMA,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,mBAAmB,CAAA;AAG1B,eAAO,MAAM,aAAa,EAAG,gCAAyC,CAAA;AAEtE,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;AACxD,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,qBAAqB,GAAG,SAAS,CAAA;AAE7E,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,iBAAiB,CAAA;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,OAAO,aAAa,CAAA;IAC5B,MAAM,EAAE,mBAAmB,CAAA;IAC3B,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,WAAW,EAAE,CAAA;IACrB,WAAW,CAAC,EAAE,iBAAiB,CAAA;CAChC;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AA6KD,iGAAiG;AACjG,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAsGtF;AAQD,8DAA8D;AAC9D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAmB/D"}
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/doctor.ts"],"names":[],"mappings":"AAMA,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,mBAAmB,CAAA;AAS1B,eAAO,MAAM,aAAa,EAAG,gCAAyC,CAAA;AAEtE,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;AACxD,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,qBAAqB,GAAG,SAAS,CAAA;AAE7E,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,iBAAiB,CAAA;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,OAAO,aAAa,CAAA;IAC5B,MAAM,EAAE,mBAAmB,CAAA;IAC3B,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,WAAW,EAAE,CAAA;IACrB,WAAW,CAAC,EAAE,iBAAiB,CAAA;CAChC;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAwSD,iGAAiG;AACjG,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CA0GtF;AAQD,8DAA8D;AAC9D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAmB/D"}
@@ -5,6 +5,7 @@ import { parseRadarConfig } from './inventory.js';
5
5
  import { emptyRadarState } from './radar.js';
6
6
  import { loadRadarState } from './radar-state.js';
7
7
  import { createRadarStatus, renderRadarStatus, } from './radar-status.js';
8
+ import { isFeishuV2WebhookUrl, isLegacyFeishuWebhookUrl, normalizeRadarWebhookUrl, resolveRadarWebhookTargets, } from './webhook.js';
8
9
  export const DOCTOR_SCHEMA = 'upstream-radar.doctor/v1alpha1';
9
10
  const MAX_CONFIG_BYTES = 8 * 1024 * 1024;
10
11
  const MAX_PATCH_BYTES = 1 * 1024 * 1024;
@@ -104,6 +105,62 @@ async function inspectPatch(checks, patchFile, configFile, stateFile, profile) {
104
105
  addCheck(checks, 'dsh-overlay', 'fail', '无法读取 DSH overlay', errorText(error), `确认文件存在且可读:${output}`);
105
106
  }
106
107
  }
108
+ /**
109
+ * Check the environment-based delivery route without contacting the endpoint.
110
+ * The URL itself is deliberately never included in the report because webhook
111
+ * query strings commonly contain a credential.
112
+ */
113
+ function inspectWebhookEnvironment(checks) {
114
+ const configuredUrl = process.env.UPSTREAM_RADAR_WEBHOOK_URL?.trim();
115
+ const configuredSecret = process.env.UPSTREAM_RADAR_FEISHU_SECRET?.trim();
116
+ if (configuredUrl === undefined || configuredUrl.length === 0) {
117
+ if (configuredSecret !== undefined && configuredSecret.length > 0) {
118
+ addCheck(checks, 'webhook-secret', 'warn', '发现飞书密钥,但没有配置 webhook 地址', 'UPSTREAM_RADAR_FEISHU_SECRET 只会用于飞书/Lark V2 自定义机器人;当前没有可用的 webhook,因此密钥会被忽略。', '设置 UPSTREAM_RADAR_WEBHOOK_URL,或清除 UPSTREAM_RADAR_FEISHU_SECRET。');
119
+ }
120
+ return;
121
+ }
122
+ let endpoint;
123
+ try {
124
+ endpoint = normalizeRadarWebhookUrl(configuredUrl);
125
+ }
126
+ catch (error) {
127
+ addCheck(checks, 'webhook', 'fail', 'webhook 地址不可用', errorText(error), '设置一个不带账号密码、fragment 且使用 HTTPS 的 webhook 地址。');
128
+ return;
129
+ }
130
+ if (isLegacyFeishuWebhookUrl(endpoint)) {
131
+ addCheck(checks, 'webhook', 'fail', '配置的是不再支持的飞书/Lark V1 webhook', 'Radar 只向 /open-apis/bot/v2/hook/… 地址发送原生飞书文本消息。', '把机器人地址替换为 /open-apis/bot/v2/hook/…;不要把旧 V1 地址继续交给 DSH。');
132
+ return;
133
+ }
134
+ if (isFeishuV2WebhookUrl(endpoint)) {
135
+ if (configuredSecret !== undefined && configuredSecret.length > 4_096) {
136
+ addCheck(checks, 'webhook', 'fail', '飞书 webhook 密钥过长', 'UPSTREAM_RADAR_FEISHU_SECRET 超过 4096 个字符,发送时会被拒绝。', '更换为不超过 4096 个字符的飞书签名密钥。');
137
+ return;
138
+ }
139
+ addCheck(checks, 'webhook', 'pass', '已识别飞书/Lark V2 webhook', configuredSecret === undefined
140
+ ? '使用原生 text 消息;未设置签名密钥时不会生成签名。密钥只从环境变量读取,不写入状态文件。'
141
+ : '使用原生 text 消息和环境变量中的签名密钥;地址与密钥都不会写入状态文件。');
142
+ return;
143
+ }
144
+ addCheck(checks, 'webhook', 'pass', 'HTTPS webhook 配置有效', configuredSecret === undefined
145
+ ? '使用通用 Radar JSON 消息;地址不会写入状态文件。'
146
+ : '使用通用 Radar JSON 消息;飞书密钥不会用于该地址,也不会写入状态文件。');
147
+ if (configuredSecret !== undefined) {
148
+ addCheck(checks, 'webhook-secret', 'warn', '飞书密钥不会用于当前 webhook', '只有飞书/Lark V2 自定义机器人地址会使用 UPSTREAM_RADAR_FEISHU_SECRET。', '如果目标是飞书,请改用 /open-apis/bot/v2/hook/… 地址;否则清除这个多余的环境变量。');
149
+ }
150
+ }
151
+ /** Check project-specific webhook environment routes without contacting them. */
152
+ function inspectProjectWebhookEnvironment(checks, config) {
153
+ const routedProjects = config.projects.filter(project => project.project.webhookUrlEnv !== undefined);
154
+ if (routedProjects.length === 0)
155
+ return;
156
+ try {
157
+ const targets = resolveRadarWebhookTargets(config.projects);
158
+ addCheck(checks, 'project-webhooks', 'pass', `已检查 ${routedProjects.length} 个项目级 webhook 路由`, `${targets.length} 个 endpoint;URL 和签名密钥只从环境变量读取,不写入配置或状态文件。`);
159
+ }
160
+ catch (error) {
161
+ addCheck(checks, 'project-webhooks', 'fail', '项目级 webhook 路由不可用', errorText(error), '设置配置中声明的 URL 环境变量,并确认地址使用 HTTPS;如果是飞书,使用 V2 webhook 地址。');
162
+ }
163
+ }
107
164
  function reportStatus(checks) {
108
165
  if (checks.some(check => check.status === 'fail'))
109
166
  return 'blocked';
@@ -170,6 +227,8 @@ export async function createDoctorReport(options) {
170
227
  addCheck(checks, 'monitoring', 'warn', '尚未完成第一次监控', undefined, `启动 DSH 或运行 upstream-radar radar check ${configFile} --state ${stateFile}。`);
171
228
  }
172
229
  await inspectPatch(checks, options.patchFile, configFile, stateFile, profile);
230
+ inspectWebhookEnvironment(checks);
231
+ inspectProjectWebhookEnvironment(checks, config);
173
232
  const report = {
174
233
  schema: DOCTOR_SCHEMA,
175
234
  status: reportStatus(checks),
@@ -184,6 +243,9 @@ export async function createDoctorReport(options) {
184
243
  return report;
185
244
  }
186
245
  await inspectPatch(checks, options.patchFile, configFile, stateFile, profile);
246
+ inspectWebhookEnvironment(checks);
247
+ if (config !== undefined)
248
+ inspectProjectWebhookEnvironment(checks, config);
187
249
  await inspectDshProfile(checks, profile, options.dshHome);
188
250
  return {
189
251
  schema: DOCTOR_SCHEMA,
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/doctor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/doctor.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"dsh-analysis.d.ts","sourceRoot":"","sources":["../../src/dsh-analysis.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAA;AAOzB,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,GAAG,YAAY,CAoBlE;AA2CD,6DAA6D;AAC7D,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAEpE;AAED,oFAAoF;AACpF,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,GAAG,MAAM,CAIrF;AAED,0FAA0F;AAC1F,eAAO,MAAM,uBAAuB,kCAA4B,CAAA"}
1
+ {"version":3,"file":"dsh-analysis.d.ts","sourceRoot":"","sources":["../../src/dsh-analysis.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAA;AAOzB,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,GAAG,YAAY,CAoBlE;AA4CD,6DAA6D;AAC7D,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAEpE;AAED,oFAAoF;AACpF,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,GAAG,MAAM,CAIrF;AAED,0FAA0F;AAC1F,eAAO,MAAM,uBAAuB,kCAA4B,CAAA"}
@@ -51,7 +51,8 @@ function renderAnalysisPrompt(task, events, taskIds = [task.id]) {
51
51
  7. 如果 upgradePath.vulnerabilityStatus 是 unavailable,不得推荐任何候选版本为安全或可升级;应先恢复 OSV 监控并说明当前判断不完整。
52
52
  8. 如果 upgradePath.dependencyStatus 是 unavailable,不得推荐任何候选版本;如果是 partial,只能把 firstCandidate 理解为“已检查的最早一小段中的候选”,不能推断后续版本没有风险。
53
53
  9. 如果候选的 dependencyCheck.status 是 incomplete 或 unavailable,必须把传递依赖风险写成 unknown,并说明缺少哪类检查;不要把“没有发现”写成“安全”。
54
- 10. 返回一个 JSON 对象,字段严格为 project_exposure、confidence、evidence、recommended_action、urgency、reasoning_summary。${groupedInstruction}
54
+ 10. 如果 event_json 含有 upgradePath.remediationCoverage 和 firstCandidateRemovingAllPaths,它们只表示“已查询的漏洞源和候选图中没有发现这些已知路径”;仍要检查项目兼容性,不得把它写成“安全”或“已验证”。如果 remediationCoverage 是 partial、unavailable 或 not-requested,不得推荐候选已经消除了漏洞;应说明缺失的检查。
55
+ 11. 返回一个 JSON 对象,字段严格为 project_exposure、confidence、evidence、recommended_action、urgency、reasoning_summary。${groupedInstruction}
55
56
 
56
57
  expected_output:
57
58
  ${JSON.stringify(task.expectedOutput, null, 2)}
@@ -1 +1 @@
1
- {"version":3,"file":"dsh-analysis.js","sourceRoot":"","sources":["../../src/dsh-analysis.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dsh-analysis.js","sourceRoot":"","sources":["../../src/dsh-analysis.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { type AnalysisDelivery, type AnalysisTask, type ProjectReference, type RadarState, type StoredAnalysisResult } from './radar-types.js';
1
+ import { type AnalysisDelivery, type AnalysisTask, type ProjectReference, type RadarNotificationPolicy, type RadarState, type StoredAnalysisResult } from './radar-types.js';
2
2
  export declare const name = "upstream-radar";
3
3
  export declare const inject: string[];
4
4
  export interface Config {
@@ -13,6 +13,12 @@ export interface Config {
13
13
  registry?: string;
14
14
  /** Set false to skip bounded transitive candidate graph checks. */
15
15
  deepCandidates?: boolean;
16
+ /** Set false to skip the independent GitHub Advisory Database check. */
17
+ githubAdvisories?: boolean;
18
+ /** Set false to skip CISA KEV and FIRST EPSS prioritization signals. */
19
+ threatIntel?: boolean;
20
+ /** Optional HTTPS endpoint for changed-event notifications; the URL is never persisted. */
21
+ webhookUrl?: string;
16
22
  runOnStart?: boolean;
17
23
  }
18
24
  export interface DshRadarMessage {
@@ -84,9 +90,9 @@ export declare function applyDshAnalysisSessionEvent(state: RadarState, session:
84
90
  export declare function selectDshAgentForProject(project: ProjectReference, agents: readonly DshAgentLike[]): DshAgentLike | undefined;
85
91
  type DeliveryObserver = (delivery: AnalysisDelivery, phase: 'before' | 'accepted' | 'rejected') => void;
86
92
  /** Deliver grouped tasks to the matching DSH root; unroutable tasks stay queued. */
87
- export declare function deliverPendingAnalysisTasksToAgents(state: RadarState, agents: readonly DshAgentLike[], now?: Date, observeDelivery?: DeliveryObserver): RadarState;
93
+ export declare function deliverPendingAnalysisTasksToAgents(state: RadarState, agents: readonly DshAgentLike[], now?: Date, observeDelivery?: DeliveryObserver, notificationPolicies?: ReadonlyMap<string, RadarNotificationPolicy>): RadarState;
88
94
  /** Synchronous follow-up admission is the acknowledgement boundary; failures stay queued. */
89
- export declare function deliverPendingAnalysisTasks(state: RadarState, agent: DshAgentLike): RadarState;
95
+ export declare function deliverPendingAnalysisTasks(state: RadarState, agent: DshAgentLike, notificationPolicies?: ReadonlyMap<string, RadarNotificationPolicy>): RadarState;
90
96
  /** Cordis function-plugin entrypoint. The polling loop stays deterministic; DSH receives only matched tasks. */
91
97
  export declare function apply(ctx: DshRadarContext, config?: Config): void;
92
98
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"dsh-plugin.d.ts","sourceRoot":"","sources":["../../src/dsh-plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dsh-plugin.d.ts","sourceRoot":"","sources":["../../src/dsh-plugin.ts"],"names":[],"mappings":"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"}
@@ -2,15 +2,19 @@ import { randomUUID } from 'node:crypto';
2
2
  import { readFile } from 'node:fs/promises';
3
3
  import { resolve } from 'node:path';
4
4
  import { renderAgentAnalysisGroupPrompt, renderAgentAnalysisPrompt } from './dsh-analysis.js';
5
- import { discoverDshRuntimeNodeModulesDirectory } from './dsh-runtime.js';
5
+ import { discoverDshRuntimeNodeModulesDirectory, discoverDshRuntimePackage, discoverDshRuntimePackageDirectory, } from './dsh-runtime.js';
6
6
  import { GitHubReleaseClient } from './github-release.js';
7
+ import { GitHubAdvisoryClient } from './github-advisory.js';
7
8
  import { parseRadarConfig } from './inventory.js';
8
9
  import { refreshRadarConfigFromDshProfile } from './init.js';
9
10
  import { OsvClient } from './osv.js';
10
11
  import { NpmCandidateGraphClient } from './npm-candidate.js';
11
12
  import { NpmReleaseClient } from './npm-release.js';
13
+ import { CisaKevClient, EpssClient } from './threat-intel.js';
14
+ import { createNotificationPolicyMap, decideProjectRadarNotification, filterNotifiableRadarEvents, isRadarIncidentMuted, } from './notification-policy.js';
12
15
  import { pollRadar } from './radar.js';
13
16
  import { loadRadarState, saveRadarState } from './radar-state.js';
17
+ import { eventsForRadarWebhookTarget, markRadarWebhookEventsDelivered, markRadarWebhookEventsDeliveredForRoute, normalizeRadarWebhookUrl, queueRadarWebhookEvents, queueRadarWebhookEventsForRoute, resolveRadarWebhookTargets, sendRadarWebhook, undeliveredRadarWebhookEvents, undeliveredRadarWebhookEventsForRoute, } from './webhook.js';
14
18
  import { ANALYSIS_DELIVERY_SCHEMA, } from './radar-types.js';
15
19
  import { extractAnalysisTaskIds, parseAgentAnalysisResult, } from './dsh-analysis-result.js';
16
20
  export const name = 'upstream-radar';
@@ -33,7 +37,9 @@ function taskSummary(task) {
33
37
  return `${task.event.kind === 'malware' ? 'Malicious package' : 'Vulnerability'} for ${project}`;
34
38
  }
35
39
  function isDshRuntimePackage(name) {
36
- return name === '@deepseek-ai/cordis' || name.startsWith('@deepseek-ai/dsh-');
40
+ return name === '@deepseek-ai/dsh'
41
+ || name === '@deepseek-ai/cordis'
42
+ || name.startsWith('@deepseek-ai/dsh-');
37
43
  }
38
44
  /** Keep independent state incidents, but combine one project's DSH runtime updates into one Agent notice. */
39
45
  export function groupPendingAnalysisTasks(tasks) {
@@ -332,26 +338,31 @@ export function selectDshAgentForProject(project, agents) {
332
338
  return matches.length === 1 ? matches[0] : undefined;
333
339
  }
334
340
  /** Deliver grouped tasks to the matching DSH root; unroutable tasks stay queued. */
335
- export function deliverPendingAnalysisTasksToAgents(state, agents, now = new Date(), observeDelivery) {
341
+ export function deliverPendingAnalysisTasksToAgents(state, agents, now = new Date(), observeDelivery, notificationPolicies = new Map()) {
336
342
  if (!Number.isFinite(now.getTime()))
337
343
  throw new Error('analysis delivery time is invalid');
338
344
  const deliveredIds = new Set();
339
345
  const deliveries = { ...(state.analysisDeliveries ?? {}) };
340
346
  for (const group of groupPendingAnalysisTasks(state.pendingAnalysisTasks)) {
341
- const first = group[0];
347
+ const deliverableGroup = group.filter(task => !isRadarIncidentMuted(state, task.event, now));
348
+ const first = deliverableGroup[0];
342
349
  if (first === undefined)
343
350
  continue;
351
+ if (deliverableGroup.some(task => !decideProjectRadarNotification(task.event, notificationPolicies, now).deliver))
352
+ continue;
344
353
  const agent = selectDshAgentForProject(first.event.project, agents);
345
354
  if (agent === undefined)
346
355
  continue;
347
- const message = group.length === 1 ? createDshRadarMessage(group[0]) : createDshRadarFamilyMessage(group);
348
- const delivery = createAnalysisDelivery(message, group, agent, now.toISOString());
356
+ const message = deliverableGroup.length === 1
357
+ ? createDshRadarMessage(deliverableGroup[0])
358
+ : createDshRadarFamilyMessage(deliverableGroup);
359
+ const delivery = createAnalysisDelivery(message, deliverableGroup, agent, now.toISOString());
349
360
  observeDelivery?.(delivery, 'before');
350
361
  try {
351
362
  agent.followup(message);
352
363
  observeDelivery?.(delivery, 'accepted');
353
364
  deliveries[delivery.id] = delivery;
354
- for (const task of group)
365
+ for (const task of deliverableGroup)
355
366
  deliveredIds.add(task.id);
356
367
  }
357
368
  catch {
@@ -370,8 +381,8 @@ export function deliverPendingAnalysisTasksToAgents(state, agents, now = new Dat
370
381
  };
371
382
  }
372
383
  /** Synchronous follow-up admission is the acknowledgement boundary; failures stay queued. */
373
- export function deliverPendingAnalysisTasks(state, agent) {
374
- return deliverPendingAnalysisTasksToAgents(state, [agent]);
384
+ export function deliverPendingAnalysisTasks(state, agent, notificationPolicies) {
385
+ return deliverPendingAnalysisTasksToAgents(state, [agent], new Date(), undefined, notificationPolicies);
375
386
  }
376
387
  async function readConfig(path) {
377
388
  const contents = await readFile(path, 'utf8');
@@ -404,9 +415,29 @@ export function apply(ctx, config = {}) {
404
415
  ? undefined
405
416
  : new NpmCandidateGraphClient({ ...(config.registry === undefined ? {} : { registry: config.registry }) });
406
417
  const releaseNotes = new GitHubReleaseClient();
418
+ const githubAdvisories = config.githubAdvisories === false
419
+ ? undefined
420
+ : new GitHubAdvisoryClient({ ...(process.env.GITHUB_TOKEN === undefined ? {} : { token: process.env.GITHUB_TOKEN }) });
421
+ const threatIntelSources = config.threatIntel === false
422
+ ? []
423
+ : [
424
+ { name: 'cisa-kev', source: new CisaKevClient() },
425
+ { name: 'epss', source: new EpssClient() },
426
+ ];
427
+ const configuredWebhookUrl = config.webhookUrl ?? process.env.UPSTREAM_RADAR_WEBHOOK_URL;
428
+ const webhookUrl = configuredWebhookUrl === undefined || configuredWebhookUrl.trim() === ''
429
+ ? undefined
430
+ : normalizeRadarWebhookUrl(configuredWebhookUrl);
431
+ const feishuSecret = process.env.UPSTREAM_RADAR_FEISHU_SECRET?.trim() || undefined;
407
432
  const dshHostNodeModulesDirectory = config.profile === undefined || config.refreshProfile === false
408
433
  ? undefined
409
434
  : discoverDshRuntimeNodeModulesDirectory();
435
+ const dshHostRuntimePackage = config.profile === undefined || config.refreshProfile === false
436
+ ? undefined
437
+ : discoverDshRuntimePackage();
438
+ const dshHostRuntimePackageDirectory = config.profile === undefined || config.refreshProfile === false
439
+ ? undefined
440
+ : discoverDshRuntimePackageDirectory();
410
441
  if (dshHostNodeModulesDirectory !== undefined) {
411
442
  ctx.logger.info('upstream-radar: DSH runtime dependency plane discovered for exact graph refresh');
412
443
  }
@@ -414,6 +445,8 @@ export function apply(ctx, config = {}) {
414
445
  let stopped = false;
415
446
  let serial = Promise.resolve();
416
447
  const inFlightDeliveries = new Map();
448
+ let activeNotificationPolicies = new Map();
449
+ let notificationPoliciesLoaded = false;
417
450
  const onSessionEvent = (session, event) => {
418
451
  serial = serial.then(async () => {
419
452
  const state = await loadRadarState(stateFile);
@@ -434,6 +467,7 @@ export function apply(ctx, config = {}) {
434
467
  if (stopped)
435
468
  return;
436
469
  let state = await loadRadarState(stateFile);
470
+ let notificationPolicies = activeNotificationPolicies;
437
471
  if (poll) {
438
472
  const configured = await readConfig(configFile);
439
473
  const radarConfig = config.profile === undefined || config.refreshProfile === false
@@ -441,14 +475,50 @@ export function apply(ctx, config = {}) {
441
475
  : await refreshRadarConfigFromDshProfile(configured, config.profile, undefined, dshHostNodeModulesDirectory === undefined ? {} : {
442
476
  hostNodeModulesDirectory: dshHostNodeModulesDirectory,
443
477
  hostRuntimeSource: 'dsh-process',
478
+ ...(dshHostRuntimePackage === undefined ? {} : { hostRuntimePackage: dshHostRuntimePackage }),
479
+ ...(dshHostRuntimePackageDirectory === undefined ? {} : { hostRuntimePackageDirectory: dshHostRuntimePackageDirectory }),
444
480
  });
445
481
  if (radarConfig !== configured && JSON.stringify(radarConfig.projects) !== JSON.stringify(configured.projects)) {
446
482
  ctx.logger.info(`upstream-radar: refreshed installed DSH profile ${config.profile}`);
447
483
  }
448
- const result = await pollRadar(radarConfig.projects, state, source, new Date(), releases, releaseNotes, candidateGraphs);
484
+ notificationPolicies = createNotificationPolicyMap(radarConfig.projects);
485
+ activeNotificationPolicies = notificationPolicies;
486
+ notificationPoliciesLoaded = true;
487
+ const result = await pollRadar(radarConfig.projects, state, source, new Date(), releases, releaseNotes, candidateGraphs, githubAdvisories === undefined ? [] : [{ name: 'github-advisories', source: githubAdvisories }], threatIntelSources);
449
488
  state = result.state;
450
489
  // Persist before model delivery. A crash may duplicate a task, but cannot silently lose it.
451
490
  await saveRadarState(stateFile, state);
491
+ const webhookTargets = resolveRadarWebhookTargets(radarConfig.projects, {
492
+ ...(webhookUrl === undefined ? {} : { globalUrl: webhookUrl }),
493
+ ...(feishuSecret === undefined ? {} : { globalFeishuSecret: feishuSecret }),
494
+ });
495
+ for (const target of webhookTargets) {
496
+ const targetEvents = eventsForRadarWebhookTarget(result.events, target);
497
+ const isLegacyGlobal = webhookUrl !== undefined && target.projectIds === undefined;
498
+ const queuedState = isLegacyGlobal
499
+ ? queueRadarWebhookEvents(state, target.endpointHash, targetEvents)
500
+ : queueRadarWebhookEventsForRoute(state, target.endpointHash, targetEvents);
501
+ state = queuedState;
502
+ await saveRadarState(stateFile, state);
503
+ const pendingWebhookEvents = filterNotifiableRadarEvents(isLegacyGlobal
504
+ ? undeliveredRadarWebhookEvents(state, target.endpointHash, targetEvents)
505
+ : undeliveredRadarWebhookEventsForRoute(state, target.endpointHash, targetEvents), notificationPolicies, new Date(), state);
506
+ if (pendingWebhookEvents.length === 0)
507
+ continue;
508
+ try {
509
+ const payload = await sendRadarWebhook(target.url, pendingWebhookEvents, target.feishuSecret === undefined ? {} : { feishuSecret: target.feishuSecret });
510
+ const deliveredIds = new Set(payload.events.map(event => event.id));
511
+ const deliveredEvents = pendingWebhookEvents.filter(event => deliveredIds.has(event.id));
512
+ state = isLegacyGlobal
513
+ ? markRadarWebhookEventsDelivered(state, target.endpointHash, deliveredEvents)
514
+ : markRadarWebhookEventsDeliveredForRoute(state, target.endpointHash, deliveredEvents);
515
+ await saveRadarState(stateFile, state);
516
+ ctx.logger.info(`upstream-radar: delivered ${deliveredEvents.length} changed event(s) to the configured webhook route`);
517
+ }
518
+ catch (error) {
519
+ ctx.logger.warn(`upstream-radar: webhook delivery failed; will retry: ${safeMessage(error)}`);
520
+ }
521
+ }
452
522
  if (result.events.length > 0) {
453
523
  ctx.logger.info(`upstream-radar: ${result.events.length} change(s), ${result.analysisTasks.length} analysis task(s)`);
454
524
  }
@@ -456,6 +526,12 @@ export function apply(ctx, config = {}) {
456
526
  ctx.logger.warn(`upstream-radar: ${error.source}: ${safeMessage(error.message)}`);
457
527
  }
458
528
  }
529
+ else if (!notificationPoliciesLoaded) {
530
+ const configured = await readConfig(configFile);
531
+ activeNotificationPolicies = createNotificationPolicyMap(configured.projects);
532
+ notificationPolicies = activeNotificationPolicies;
533
+ notificationPoliciesLoaded = true;
534
+ }
459
535
  const agents = ctx.agents.roots();
460
536
  if (agents.length === 0 || state.pendingAnalysisTasks.length === 0)
461
537
  return;
@@ -464,7 +540,7 @@ export function apply(ctx, config = {}) {
464
540
  inFlightDeliveries.delete(delivery.id);
465
541
  else
466
542
  inFlightDeliveries.set(delivery.id, delivery);
467
- });
543
+ }, notificationPolicies);
468
544
  if (next !== state)
469
545
  await saveRadarState(stateFile, next);
470
546
  const unrouted = groupPendingAnalysisTasks(next.pendingAnalysisTasks).find((group) => {