upstream-radar 0.31.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 +400 -45
  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 +97 -11
  22. package/dist/src/dsh-plugin.js.map +1 -1
  23. package/dist/src/dsh-runtime.d.ts +13 -0
  24. package/dist/src/dsh-runtime.d.ts.map +1 -0
  25. package/dist/src/dsh-runtime.js +113 -0
  26. package/dist/src/dsh-runtime.js.map +1 -0
  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 -5
  36. package/dist/src/index.d.ts.map +1 -1
  37. package/dist/src/index.js +13 -4
  38. package/dist/src/index.js.map +1 -1
  39. package/dist/src/init.d.ts +47 -2
  40. package/dist/src/init.d.ts.map +1 -1
  41. package/dist/src/init.js +68 -7
  42. package/dist/src/init.js.map +1 -1
  43. package/dist/src/installed-graph.d.ts +4 -1
  44. package/dist/src/installed-graph.d.ts.map +1 -1
  45. package/dist/src/installed-graph.js +102 -3
  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 +77 -3
  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 +40 -1
  75. package/dist/src/radar-status.d.ts.map +1 -1
  76. package/dist/src/radar-status.js +209 -17
  77. package/dist/src/radar-status.js.map +1 -1
  78. package/dist/src/radar-types.d.ts +130 -4
  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 +397 -41
  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":"AAqCA,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EAErB,KAAK,uBAAuB,EAC5B,KAAK,UAAU,EACf,KAAK,oBAAoB,EAC1B,MAAM,kBAAkB,CAAA;AAMzB,eAAO,MAAM,IAAI,mBAAmB,CAAA;AACpC,eAAO,MAAM,MAAM,UAAa,CAAA;AAEhC,MAAM,WAAW,MAAM;IACrB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,kFAAkF;IAClF,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,oEAAoE;IACpE,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,mEAAmE;IACnE,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,wEAAwE;IACxE,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,wEAAwE;IACxE,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,2FAA2F;IAC3F,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC9C,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ,CAAA;QACd,MAAM,EAAE,gBAAgB,CAAA;QACxB,IAAI,EAAE,QAAQ,CAAA;QACd,OAAO,EAAE,MAAM,CAAA;KAChB,CAAA;CACF;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,MAAM,CAAC,EAAE;QACP,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KACpB,CAAA;IACD,MAAM,CAAC,EAAE,SAAS,mBAAmB,EAAE,CAAA;CACxC;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAAA;IACxC,OAAO,CAAC,EAAE,cAAc,CAAA;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE;QACN,KAAK,IAAI,YAAY,EAAE,CAAA;KACxB,CAAA;IACD,MAAM,EAAE;QACN,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;QAC3B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;KAC5B,CAAA;IACD,MAAM,CAAC,KAAK,EAAE,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9E,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAA;IAC5D,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,mBAAmB,KAAK,IAAI,GAAG,MAAM,IAAI,CAAA;CAChH;AA0BD,6GAA6G;AAC7G,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,GAAG,YAAY,EAAE,EAAE,CAoB1F;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,YAAY,GAAG,eAAe,CAYzE;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,GAAG,eAAe,CAc3F;AA4JD,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,UAAU,CAAA;IACjB,QAAQ,EAAE,oBAAoB,EAAE,CAAA;IAChC,mBAAmB,EAAE,MAAM,EAAE,CAAA;CAC9B;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,mBAAmB,EAC1B,eAAe,GAAE,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAa,EAClE,GAAG,OAAa,GACf,uBAAuB,CAsEzB;AAOD;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,SAAS,YAAY,EAAE,GAC9B,YAAY,GAAG,SAAS,CAS1B;AAED,KAAK,gBAAgB,GAAG,CAAC,QAAQ,EAAE,gBAAgB,EAAE,KAAK,EAAE,QAAQ,GAAG,UAAU,GAAG,UAAU,KAAK,IAAI,CAAA;AAEvG,oFAAoF;AACpF,wBAAgB,mCAAmC,CACjD,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,SAAS,YAAY,EAAE,EAC/B,GAAG,OAAa,EAChB,eAAe,CAAC,EAAE,gBAAgB,EAClC,oBAAoB,GAAE,WAAW,CAAC,MAAM,EAAE,uBAAuB,CAAa,GAC7E,UAAU,CAkCZ;AAED,6FAA6F;AAC7F,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,UAAU,EACjB,KAAK,EAAE,YAAY,EACnB,oBAAoB,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,uBAAuB,CAAC,GAClE,UAAU,CAEZ;AAaD,gHAAgH;AAChH,wBAAgB,KAAK,CAAC,GAAG,EAAE,eAAe,EAAE,MAAM,GAAE,MAAW,GAAG,IAAI,CA6LrE"}
@@ -2,14 +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, discoverDshRuntimePackage, discoverDshRuntimePackageDirectory, } from './dsh-runtime.js';
5
6
  import { GitHubReleaseClient } from './github-release.js';
7
+ import { GitHubAdvisoryClient } from './github-advisory.js';
6
8
  import { parseRadarConfig } from './inventory.js';
7
9
  import { refreshRadarConfigFromDshProfile } from './init.js';
8
10
  import { OsvClient } from './osv.js';
9
11
  import { NpmCandidateGraphClient } from './npm-candidate.js';
10
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';
11
15
  import { pollRadar } from './radar.js';
12
16
  import { loadRadarState, saveRadarState } from './radar-state.js';
17
+ import { eventsForRadarWebhookTarget, markRadarWebhookEventsDelivered, markRadarWebhookEventsDeliveredForRoute, normalizeRadarWebhookUrl, queueRadarWebhookEvents, queueRadarWebhookEventsForRoute, resolveRadarWebhookTargets, sendRadarWebhook, undeliveredRadarWebhookEvents, undeliveredRadarWebhookEventsForRoute, } from './webhook.js';
13
18
  import { ANALYSIS_DELIVERY_SCHEMA, } from './radar-types.js';
14
19
  import { extractAnalysisTaskIds, parseAgentAnalysisResult, } from './dsh-analysis-result.js';
15
20
  export const name = 'upstream-radar';
@@ -32,7 +37,9 @@ function taskSummary(task) {
32
37
  return `${task.event.kind === 'malware' ? 'Malicious package' : 'Vulnerability'} for ${project}`;
33
38
  }
34
39
  function isDshRuntimePackage(name) {
35
- 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-');
36
43
  }
37
44
  /** Keep independent state incidents, but combine one project's DSH runtime updates into one Agent notice. */
38
45
  export function groupPendingAnalysisTasks(tasks) {
@@ -331,26 +338,31 @@ export function selectDshAgentForProject(project, agents) {
331
338
  return matches.length === 1 ? matches[0] : undefined;
332
339
  }
333
340
  /** Deliver grouped tasks to the matching DSH root; unroutable tasks stay queued. */
334
- export function deliverPendingAnalysisTasksToAgents(state, agents, now = new Date(), observeDelivery) {
341
+ export function deliverPendingAnalysisTasksToAgents(state, agents, now = new Date(), observeDelivery, notificationPolicies = new Map()) {
335
342
  if (!Number.isFinite(now.getTime()))
336
343
  throw new Error('analysis delivery time is invalid');
337
344
  const deliveredIds = new Set();
338
345
  const deliveries = { ...(state.analysisDeliveries ?? {}) };
339
346
  for (const group of groupPendingAnalysisTasks(state.pendingAnalysisTasks)) {
340
- const first = group[0];
347
+ const deliverableGroup = group.filter(task => !isRadarIncidentMuted(state, task.event, now));
348
+ const first = deliverableGroup[0];
341
349
  if (first === undefined)
342
350
  continue;
351
+ if (deliverableGroup.some(task => !decideProjectRadarNotification(task.event, notificationPolicies, now).deliver))
352
+ continue;
343
353
  const agent = selectDshAgentForProject(first.event.project, agents);
344
354
  if (agent === undefined)
345
355
  continue;
346
- const message = group.length === 1 ? createDshRadarMessage(group[0]) : createDshRadarFamilyMessage(group);
347
- 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());
348
360
  observeDelivery?.(delivery, 'before');
349
361
  try {
350
362
  agent.followup(message);
351
363
  observeDelivery?.(delivery, 'accepted');
352
364
  deliveries[delivery.id] = delivery;
353
- for (const task of group)
365
+ for (const task of deliverableGroup)
354
366
  deliveredIds.add(task.id);
355
367
  }
356
368
  catch {
@@ -369,8 +381,8 @@ export function deliverPendingAnalysisTasksToAgents(state, agents, now = new Dat
369
381
  };
370
382
  }
371
383
  /** Synchronous follow-up admission is the acknowledgement boundary; failures stay queued. */
372
- export function deliverPendingAnalysisTasks(state, agent) {
373
- return deliverPendingAnalysisTasksToAgents(state, [agent]);
384
+ export function deliverPendingAnalysisTasks(state, agent, notificationPolicies) {
385
+ return deliverPendingAnalysisTasksToAgents(state, [agent], new Date(), undefined, notificationPolicies);
374
386
  }
375
387
  async function readConfig(path) {
376
388
  const contents = await readFile(path, 'utf8');
@@ -403,10 +415,38 @@ export function apply(ctx, config = {}) {
403
415
  ? undefined
404
416
  : new NpmCandidateGraphClient({ ...(config.registry === undefined ? {} : { registry: config.registry }) });
405
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;
432
+ const dshHostNodeModulesDirectory = config.profile === undefined || config.refreshProfile === false
433
+ ? undefined
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();
441
+ if (dshHostNodeModulesDirectory !== undefined) {
442
+ ctx.logger.info('upstream-radar: DSH runtime dependency plane discovered for exact graph refresh');
443
+ }
406
444
  ctx.effect(() => {
407
445
  let stopped = false;
408
446
  let serial = Promise.resolve();
409
447
  const inFlightDeliveries = new Map();
448
+ let activeNotificationPolicies = new Map();
449
+ let notificationPoliciesLoaded = false;
410
450
  const onSessionEvent = (session, event) => {
411
451
  serial = serial.then(async () => {
412
452
  const state = await loadRadarState(stateFile);
@@ -427,18 +467,58 @@ export function apply(ctx, config = {}) {
427
467
  if (stopped)
428
468
  return;
429
469
  let state = await loadRadarState(stateFile);
470
+ let notificationPolicies = activeNotificationPolicies;
430
471
  if (poll) {
431
472
  const configured = await readConfig(configFile);
432
473
  const radarConfig = config.profile === undefined || config.refreshProfile === false
433
474
  ? configured
434
- : await refreshRadarConfigFromDshProfile(configured, config.profile);
475
+ : await refreshRadarConfigFromDshProfile(configured, config.profile, undefined, dshHostNodeModulesDirectory === undefined ? {} : {
476
+ hostNodeModulesDirectory: dshHostNodeModulesDirectory,
477
+ hostRuntimeSource: 'dsh-process',
478
+ ...(dshHostRuntimePackage === undefined ? {} : { hostRuntimePackage: dshHostRuntimePackage }),
479
+ ...(dshHostRuntimePackageDirectory === undefined ? {} : { hostRuntimePackageDirectory: dshHostRuntimePackageDirectory }),
480
+ });
435
481
  if (radarConfig !== configured && JSON.stringify(radarConfig.projects) !== JSON.stringify(configured.projects)) {
436
482
  ctx.logger.info(`upstream-radar: refreshed installed DSH profile ${config.profile}`);
437
483
  }
438
- 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);
439
488
  state = result.state;
440
489
  // Persist before model delivery. A crash may duplicate a task, but cannot silently lose it.
441
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
+ }
442
522
  if (result.events.length > 0) {
443
523
  ctx.logger.info(`upstream-radar: ${result.events.length} change(s), ${result.analysisTasks.length} analysis task(s)`);
444
524
  }
@@ -446,6 +526,12 @@ export function apply(ctx, config = {}) {
446
526
  ctx.logger.warn(`upstream-radar: ${error.source}: ${safeMessage(error.message)}`);
447
527
  }
448
528
  }
529
+ else if (!notificationPoliciesLoaded) {
530
+ const configured = await readConfig(configFile);
531
+ activeNotificationPolicies = createNotificationPolicyMap(configured.projects);
532
+ notificationPolicies = activeNotificationPolicies;
533
+ notificationPoliciesLoaded = true;
534
+ }
449
535
  const agents = ctx.agents.roots();
450
536
  if (agents.length === 0 || state.pendingAnalysisTasks.length === 0)
451
537
  return;
@@ -454,7 +540,7 @@ export function apply(ctx, config = {}) {
454
540
  inFlightDeliveries.delete(delivery.id);
455
541
  else
456
542
  inFlightDeliveries.set(delivery.id, delivery);
457
- });
543
+ }, notificationPolicies);
458
544
  if (next !== state)
459
545
  await saveRadarState(stateFile, next);
460
546
  const unrouted = groupPendingAnalysisTasks(next.pendingAnalysisTasks).find((group) => {