upstream-radar 0.26.0 → 0.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -157,7 +157,7 @@ The generated graph is the actual installed profile graph. DSH also maintains a
157
157
 
158
158
  For a hand-written or CI fixture, use [the example inventory](examples/radar/config.json). If neither a generated `--patch` overlay nor `UPSTREAM_RADAR_CONFIG` is provided, the bundle stays dormant and performs no polling.
159
159
 
160
- Once running, Radar polls OSV, npm, and public GitHub Releases, persists incident state before delivery, and submits only changed incidents to the first live root DSH Agent. If a source is temporarily unavailable, Radar keeps the last confirmed state instead of claiming that the project is clean, continues delivering already queued tasks, and creates one source-health notice after three consecutive failures.
160
+ Once running, Radar polls OSV, npm, and public GitHub Releases, persists incident state before delivery, and submits only changed incidents to the matching DSH project session. With one root Agent, delivery remains automatic; with multiple roots, Radar requires an exact match between `project.workspace` and `Agent.session.header.cwd`, and keeps the task queued when it cannot prove the route. If a source is temporarily unavailable, Radar keeps the last confirmed state instead of claiming that the project is clean, continues delivering already queued tasks, and creates one source-health notice after three consecutive failures.
161
161
 
162
162
  Each release cycle also checks a bounded prefix of candidate dependency graphs. This is enabled by default in the DSH adapter and CLI; use `--no-deep-candidates` only when you deliberately want manifest-only compatibility checks. The graph resolver is isolated in a temporary directory and uses `package-lock-only` plus `ignore-scripts`, so candidate package code is not loaded or executed.
163
163
 
@@ -193,7 +193,7 @@ This proof runs in CI on Node.js 22. See the executable [showcase contract](exam
193
193
  Before wiring a project into a compatibility gate, run the offline rule benchmark:
194
194
 
195
195
  ```bash
196
- pnpm dlx --package=upstream-radar@0.26.0 upstream-radar benchmark compatibility
196
+ pnpm dlx --package=upstream-radar@0.28.0 upstream-radar benchmark compatibility
197
197
  ```
198
198
 
199
199
  It covers six contracts: a safe patch, a change that only needs project analysis, an incompatible DSH peer, a publisher-declared breaking release, a vulnerable candidate dependency, and an incomplete candidate graph. The command does not access the network, install a package, load a plugin, or start DSH. It checks the behavior of Radar's deterministic rules and the `breaking`/`any` gates; it is not a runtime compatibility proof.
@@ -206,7 +206,7 @@ When you have an exact plugin artifact and want to know whether one exact DSH re
206
206
  # Pack an exact npm release without running its lifecycle scripts.
207
207
  npm pack --ignore-scripts dsh-plugin@1.2.3
208
208
 
209
- pnpm dlx --package=upstream-radar@0.26.0 upstream-radar probe dsh-load \
209
+ pnpm dlx --package=upstream-radar@0.28.0 upstream-radar probe dsh-load \
210
210
  ./dsh-plugin-1.2.3.tgz \
211
211
  --dsh-version 0.1.0-rc.6
212
212
  ```
@@ -232,7 +232,7 @@ It exercises a loadable bundle, a bundle patch DSH rejects, and a package that r
232
232
  To compare a plugin against more than one DSH release, use the matrix form:
233
233
 
234
234
  ```bash
235
- pnpm dlx --package=upstream-radar@0.26.0 upstream-radar probe dsh-matrix \
235
+ pnpm dlx --package=upstream-radar@0.28.0 upstream-radar probe dsh-matrix \
236
236
  ./dsh-plugin-1.2.3.tgz \
237
237
  --dsh-version 0.1.0-rc.3 \
238
238
  --dsh-version 0.1.0-rc.6 \
@@ -243,12 +243,12 @@ The matrix runs versions one at a time in separate temporary profiles and evalua
243
243
 
244
244
  ## Run it in GitHub Actions
245
245
 
246
- If your team wants a scheduled CI gate before wiring a machine to a live DSH profile, commit the reviewed `upstream-radar.config.json` and copy [the example workflow](examples/github-actions/upstream-radar.yml). The reusable Action keeps the workflow to two meaningful steps:
246
+ If your team wants a scheduled CI gate before wiring a machine to a live DSH profile, commit the reviewed `upstream-radar.config.json` and copy [the example workflow](examples/github-actions/upstream-radar.yml). The reusable Action keeps the workflow to two meaningful steps, with an optional third step for DSH load compatibility:
247
247
 
248
248
  ```yaml
249
249
  steps:
250
250
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
251
- - uses: MicroMilo/upstream-radar@v0.26.0
251
+ - uses: MicroMilo/upstream-radar@v0.28.0
252
252
  with:
253
253
  config: upstream-radar.config.json
254
254
  fail-on: high
@@ -256,16 +256,30 @@ steps:
256
256
  fail-on-compatibility: breaking
257
257
  ```
258
258
 
259
- The Action is a thin wrapper around `radar check --frozen --state :memory: --fail-on high --json`; when the optional compatibility input is enabled, it also passes `--fail-on-compatibility breaking` or `any`. `--frozen` is deliberate: it uses the graph in the reviewed config and does not try to read a developer's local DSH profile. Each run is independent, exits `2` when an active vulnerability or opted-in compatibility change meets its threshold, and exits `1` for an operational or source error. `breaking` catches confirmed or strong incompatibility signals; `any` catches every active compatibility event. The default is `never`, so vulnerability-only behavior stays unchanged. The Action does not deliver a DSH Agent task or modify a branch; the native DSH bundle remains the always-on analysis path. Pin the Action to a release tag such as `v0.26.0`, and pin the checkout Action in your workflow according to your repository's policy.
259
+ The Action is a thin wrapper around `radar check --frozen --state :memory: --fail-on high --json`; when the optional compatibility input is enabled, it also passes `--fail-on-compatibility breaking` or `any`. `--frozen` is deliberate: it uses the graph in the reviewed config and does not try to read a developer's local DSH profile. Each run is independent, exits `2` when an active vulnerability or opted-in compatibility change meets its threshold, and exits `1` for an operational or source error. `breaking` catches confirmed or strong incompatibility signals; `any` catches every active compatibility event. The default is `never`, so vulnerability-only behavior stays unchanged. The Action does not deliver a DSH Agent task or modify a branch; the native DSH bundle remains the always-on analysis path. Pin the Action to a release tag such as `v0.28.0`, and pin the checkout Action in your workflow according to your repository's policy.
260
260
 
261
261
  The Action requires the caller to check out the repository first. It does not install the project's dependencies or run their lifecycle scripts; it only reads the committed graph and queries the configured upstream sources. For a fully explicit, lower-level invocation, the equivalent command is:
262
262
 
263
263
  ```bash
264
- pnpm dlx --package=upstream-radar@0.26.0 upstream-radar radar check \
264
+ pnpm dlx --package=upstream-radar@0.28.0 upstream-radar radar check \
265
265
  ./upstream-radar.config.json --frozen --state :memory: --fail-on high \
266
266
  --fail-on-compatibility breaking --json
267
267
  ```
268
268
 
269
+ To add the optional DSH load matrix for a published plugin, provide an exact npm package and at least two exact DSH versions:
270
+
271
+ ```yaml
272
+ - uses: MicroMilo/upstream-radar@v0.28.0
273
+ id: radar
274
+ with:
275
+ config: upstream-radar.config.json
276
+ fail-on: high
277
+ probe-package: dsh-cloudflare-browser-run@0.1.1
278
+ probe-dsh-versions: 0.1.0-rc.3,0.1.0-rc.6
279
+ ```
280
+
281
+ The Action packs the exact package with `--ignore-scripts`, runs `probe dsh-matrix`, exposes `probe-result`, and fails with the probe's exit code when the result is `incompatible` or `unknown`. This extra step downloads and loads the DSH bundle in temporary profiles; it is a compatibility signal, not a security sandbox or a capability test.
282
+
269
283
  For a runnable consumer example using the real [`dsh-cloudflare-browser-run@0.1.1`](examples/github-actions/consumer/upstream-radar.config.json) graph, see the [consumer smoke README](examples/github-actions/consumer/README.md) and its [copyable workflow](examples/github-actions/consumer/upstream-radar.yml).
270
284
 
271
285
  Run the same released Action locally from this repository with:
@@ -283,7 +297,7 @@ For a local or self-hosted DSH machine, omit `--frozen` so Radar refreshes the s
283
297
  3. Watch npm releases for the installed plugin and DSH/Cordis packages.
284
298
  4. Create or update one durable incident with the exact dependency path.
285
299
  5. Persist a constrained analysis task before delivery.
286
- 6. Send a plugin-originated follow-up to the first live root DSH Agent.
300
+ 6. Route a plugin-originated follow-up to the DSH root whose session workspace matches the project.
287
301
  7. Keep the task on disk when no Agent is available; cancel it when the incident resolves.
288
302
 
289
303
  For a local process or a scheduled runner, the same loop is available as:
@@ -371,6 +385,7 @@ Advisories, release notes, links, package names, and repository strings remain u
371
385
  - automatic selection of the only DSH profile with third-party bundles, plus a network-free `radar status` snapshot;
372
386
  - commit-friendly `init` output that records the project workspace as `.` by default;
373
387
  - a reusable GitHub Action that turns the reviewed graph into a two-step, frozen CI gate;
388
+ - an opt-in GitHub Action DSH load matrix for exact published plugin versions and exact DSH versions;
374
389
  - a real DSH plugin consumer smoke that runs the published Action against 18 exact package versions;
375
390
  - an actionable, network-free `radar status` summary with exact active paths, candidate signals, and next steps;
376
391
  - a network-free `doctor` command that checks local DSH registration, overlay/config alignment, state readability, and dependency coverage;
@@ -402,7 +417,7 @@ pnpm dlx --package=upstream-radar@latest upstream-radar inspect npm:dsh-cloudfla
402
417
  - OSV, npm `latest`, and public GitHub Release notes are live sources; changelog, comparison-diff, and migration-guide ingestion are deferred.
403
418
  - A failed OSV check preserves confirmed matches and returns a visible source warning; source health is durable and routed through DSH after three consecutive failures, while source-claim conflict handling and external health destinations are not implemented yet.
404
419
  - `radar watch` is a CLI monitoring fallback; it does not deliver tasks into DSH by itself.
405
- - Delivery currently targets the first live root Agent rather than a project-specific session.
420
+ - Delivery uses one root Agent as the simple default; when several roots exist, it requires an exact project-workspace match and leaves ambiguous tasks queued instead of guessing.
406
421
  - Agent conclusions stay in the DSH Session; Radar does not ingest them back into incident state yet.
407
422
  - No Issue, branch, Pull Request, dependency override, or merge is created automatically.
408
423
 
@@ -1,4 +1,4 @@
1
- import type { AnalysisTask, RadarState } from './radar-types.js';
1
+ import type { AnalysisTask, ProjectReference, RadarState } from './radar-types.js';
2
2
  export declare const name = "upstream-radar";
3
3
  export declare const inject: string[];
4
4
  export interface Config {
@@ -31,6 +31,11 @@ export interface DshRadarMessage {
31
31
  }
32
32
  interface DshAgentLike {
33
33
  followup(message: DshRadarMessage): void;
34
+ session?: {
35
+ header?: {
36
+ cwd?: string | null;
37
+ };
38
+ };
34
39
  }
35
40
  interface DshRadarContext {
36
41
  agents: {
@@ -47,6 +52,16 @@ interface DshRadarContext {
47
52
  export declare function groupPendingAnalysisTasks(tasks: readonly AnalysisTask[]): AnalysisTask[][];
48
53
  export declare function createDshRadarMessage(task: AnalysisTask): DshRadarMessage;
49
54
  export declare function createDshRadarFamilyMessage(tasks: readonly AnalysisTask[]): DshRadarMessage;
55
+ /**
56
+ * Match one project to a DSH root by the session's working directory.
57
+ *
58
+ * A single root remains the backwards-compatible default. With multiple roots,
59
+ * an exact workspace match is required; guessing would deliver a security
60
+ * notice to the wrong project session.
61
+ */
62
+ export declare function selectDshAgentForProject(project: ProjectReference, agents: readonly DshAgentLike[]): DshAgentLike | undefined;
63
+ /** Deliver grouped tasks to the matching DSH root; unroutable tasks stay queued. */
64
+ export declare function deliverPendingAnalysisTasksToAgents(state: RadarState, agents: readonly DshAgentLike[]): RadarState;
50
65
  /** Synchronous follow-up admission is the acknowledgement boundary; failures stay queued. */
51
66
  export declare function deliverPendingAnalysisTasks(state: RadarState, agent: DshAgentLike): RadarState;
52
67
  /** Cordis function-plugin entrypoint. The polling loop stays deterministic; DSH receives only matched tasks. */
@@ -1 +1 @@
1
- {"version":3,"file":"dsh-plugin.d.ts","sourceRoot":"","sources":["../../src/dsh-plugin.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAEhE,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,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,UAAU,YAAY;IACpB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAAA;CACzC;AAED,UAAU,eAAe;IACvB,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;CAC7D;AAwBD,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;AAED,6FAA6F;AAC7F,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,GAAG,UAAU,CAe9F;AAaD,gHAAgH;AAChH,wBAAgB,KAAK,CAAC,GAAG,EAAE,eAAe,EAAE,MAAM,GAAE,MAAW,GAAG,IAAI,CA+DrE"}
1
+ {"version":3,"file":"dsh-plugin.d.ts","sourceRoot":"","sources":["../../src/dsh-plugin.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAElF,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,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,UAAU,YAAY;IACpB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAAA;IACxC,OAAO,CAAC,EAAE;QACR,MAAM,CAAC,EAAE;YACP,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;SACpB,CAAA;KACF,CAAA;CACF;AAED,UAAU,eAAe;IACvB,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;CAC7D;AAwBD,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;AAOD;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,SAAS,YAAY,EAAE,GAC9B,YAAY,GAAG,SAAS,CAS1B;AAED,oFAAoF;AACpF,wBAAgB,mCAAmC,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,YAAY,EAAE,GAAG,UAAU,CAqBlH;AAED,6FAA6F;AAC7F,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,GAAG,UAAU,CAE9F;AAaD,gHAAgH;AAChH,wBAAgB,KAAK,CAAC,GAAG,EAAE,eAAe,EAAE,MAAM,GAAE,MAAW,GAAG,IAAI,CAyErE"}
@@ -83,17 +83,49 @@ export function createDshRadarFamilyMessage(tasks) {
83
83
  },
84
84
  });
85
85
  }
86
- /** Synchronous follow-up admission is the acknowledgement boundary; failures stay queued. */
87
- export function deliverPendingAnalysisTasks(state, agent) {
86
+ function normalizedWorkspace(workspace) {
87
+ if (workspace === undefined || workspace.trim() === '')
88
+ return undefined;
89
+ return resolve(workspace);
90
+ }
91
+ /**
92
+ * Match one project to a DSH root by the session's working directory.
93
+ *
94
+ * A single root remains the backwards-compatible default. With multiple roots,
95
+ * an exact workspace match is required; guessing would deliver a security
96
+ * notice to the wrong project session.
97
+ */
98
+ export function selectDshAgentForProject(project, agents) {
99
+ if (agents.length === 1)
100
+ return agents[0];
101
+ const workspace = normalizedWorkspace(project.workspace);
102
+ if (workspace === undefined)
103
+ return undefined;
104
+ const matches = agents.filter((agent) => {
105
+ const cwd = agent.session?.header?.cwd;
106
+ return typeof cwd === 'string' && normalizedWorkspace(cwd) === workspace;
107
+ });
108
+ return matches.length === 1 ? matches[0] : undefined;
109
+ }
110
+ /** Deliver grouped tasks to the matching DSH root; unroutable tasks stay queued. */
111
+ export function deliverPendingAnalysisTasksToAgents(state, agents) {
88
112
  const deliveredIds = new Set();
89
113
  for (const group of groupPendingAnalysisTasks(state.pendingAnalysisTasks)) {
114
+ const first = group[0];
115
+ if (first === undefined)
116
+ continue;
117
+ const agent = selectDshAgentForProject(first.event.project, agents);
118
+ if (agent === undefined)
119
+ continue;
90
120
  try {
91
121
  agent.followup(group.length === 1 ? createDshRadarMessage(group[0]) : createDshRadarFamilyMessage(group));
92
122
  for (const task of group)
93
123
  deliveredIds.add(task.id);
94
124
  }
95
125
  catch {
96
- break;
126
+ // Admission failed for this project only; unrelated project tasks may
127
+ // still be delivered, while this group remains durable for retry.
128
+ continue;
97
129
  }
98
130
  }
99
131
  if (deliveredIds.size === 0)
@@ -103,6 +135,10 @@ export function deliverPendingAnalysisTasks(state, agent) {
103
135
  pendingAnalysisTasks: state.pendingAnalysisTasks.filter(task => !deliveredIds.has(task.id)),
104
136
  };
105
137
  }
138
+ /** Synchronous follow-up admission is the acknowledgement boundary; failures stay queued. */
139
+ export function deliverPendingAnalysisTasks(state, agent) {
140
+ return deliverPendingAnalysisTasksToAgents(state, [agent]);
141
+ }
106
142
  async function readConfig(path) {
107
143
  const contents = await readFile(path, 'utf8');
108
144
  if (Buffer.byteLength(contents) > 256 * 1024 * 1024)
@@ -161,12 +197,22 @@ export function apply(ctx, config = {}) {
161
197
  ctx.logger.warn(`upstream-radar: ${error.source}: ${safeMessage(error.message)}`);
162
198
  }
163
199
  }
164
- const agent = ctx.agents.roots()[0];
165
- if (agent === undefined || state.pendingAnalysisTasks.length === 0)
200
+ const agents = ctx.agents.roots();
201
+ if (agents.length === 0 || state.pendingAnalysisTasks.length === 0)
166
202
  return;
167
- const next = deliverPendingAnalysisTasks(state, agent);
203
+ const next = deliverPendingAnalysisTasksToAgents(state, agents);
168
204
  if (next !== state)
169
205
  await saveRadarState(stateFile, next);
206
+ const unrouted = groupPendingAnalysisTasks(next.pendingAnalysisTasks).find((group) => {
207
+ const first = group[0];
208
+ return first !== undefined && selectDshAgentForProject(first.event.project, agents) === undefined;
209
+ });
210
+ if (unrouted !== undefined) {
211
+ const first = unrouted[0];
212
+ if (first !== undefined) {
213
+ ctx.logger.warn(`upstream-radar: kept ${unrouted.length} analysis task(s) queued; no DSH root matches project ${first.event.project.name} workspace ${first.event.project.workspace ?? '(not configured)'}`);
214
+ }
215
+ }
170
216
  }).catch((error) => {
171
217
  ctx.logger.warn(`upstream-radar: cycle failed: ${safeMessage(error)}`);
172
218
  });
@@ -1 +1 @@
1
- {"version":3,"file":"dsh-plugin.js","sourceRoot":"","sources":["../../src/dsh-plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dsh-plugin.js","sourceRoot":"","sources":["../../src/dsh-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,8BAA8B,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAA;AAC7F,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,EAAE,gCAAgC,EAAE,MAAM,WAAW,CAAA;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACpC,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAA;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAGjE,MAAM,CAAC,MAAM,IAAI,GAAG,gBAAgB,CAAA;AACpC,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAA;AAkDhC,SAAS,WAAW,CAAC,KAAc;IACjC,MAAM,KAAK,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACpE,OAAO,KAAK,CAAC,OAAO,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;AAC5E,CAAC;AAED,SAAS,WAAW,CAAC,IAAkB;IACrC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IACpD,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;QACxC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAA;QAC7C,IAAI,WAAW,KAAK,qBAAqB,IAAI,WAAW,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;YACzF,OAAO,wCAAwC,OAAO,EAAE,CAAA;QAC1D,CAAC;QACD,OAAO,4BAA4B,OAAO,EAAE,CAAA;IAC9C,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,eAAe;QAAE,OAAO,kCAAkC,OAAO,EAAE,CAAA;IAC3F,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,eAAe,QAAQ,OAAO,EAAE,CAAA;AAClG,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY;IACvC,OAAO,IAAI,KAAK,qBAAqB,IAAI,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAA;AAC/E,CAAC;AAED,6GAA6G;AAC7G,MAAM,UAAU,yBAAyB,CAAC,KAA8B;IACtE,MAAM,MAAM,GAAqB,EAAE,CAAA;IACnC,MAAM,SAAS,GAAG,IAAI,GAAG,EAA0B,CAAA;IACnD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;QACxB,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YACjF,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;YACnB,SAAQ;QACV,CAAC;QACD,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,EAAE,kBAAkB,KAAK,CAAC,UAAU,EAAE,CAAA;QACnE,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACnC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACnB,SAAQ;QACV,CAAC;QACD,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,CAAA;QACpB,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QACzB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACpB,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAkB;IACtD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,EAAE,EAAE,UAAU,EAAE;QAChB,IAAI,EAAE,MAAe;QACrB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,yBAAyB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3E,MAAM,EAAE;YACN,IAAI,EAAE,QAAiB;YACvB,MAAM,EAAE,gBAAyB;YACjC,IAAI,EAAE,QAAiB;YACvB,OAAO,EAAE,WAAW,CAAC,IAAI,CAAC;SAC3B;KACF,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,KAA8B;IACxE,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;IACtB,IAAI,KAAK,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAA;IAC5F,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,EAAE,EAAE,UAAU,EAAE;QAChB,IAAI,EAAE,MAAe;QACrB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,8BAA8B,CAAC,KAAK,CAAC,EAAE,CAAC;QACjF,MAAM,EAAE;YACN,IAAI,EAAE,QAAiB;YACvB,MAAM,EAAE,gBAAyB;YACjC,IAAI,EAAE,QAAiB;YACvB,OAAO,EAAE,sCAAsC,KAAK,CAAC,MAAM,SAAS,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;SAC5G;KACF,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,SAA6B;IACxD,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,SAAS,CAAA;IACxE,OAAO,OAAO,CAAC,SAAS,CAAC,CAAA;AAC3B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CACtC,OAAyB,EACzB,MAA+B;IAE/B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAA;IACzC,MAAM,SAAS,GAAG,mBAAmB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IACxD,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QACtC,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAA;QACtC,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,mBAAmB,CAAC,GAAG,CAAC,KAAK,SAAS,CAAA;IAC1E,CAAC,CAAC,CAAA;IACF,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;AACtD,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,mCAAmC,CAAC,KAAiB,EAAE,MAA+B;IACpG,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAA;IACtC,KAAK,MAAM,KAAK,IAAI,yBAAyB,CAAC,KAAK,CAAC,oBAAoB,CAAC,EAAE,CAAC;QAC1E,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;QACtB,IAAI,KAAK,KAAK,SAAS;YAAE,SAAQ;QACjC,MAAM,KAAK,GAAG,wBAAwB,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QACnE,IAAI,KAAK,KAAK,SAAS;YAAE,SAAQ;QACjC,IAAI,CAAC;YACH,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,2BAA2B,CAAC,KAAK,CAAC,CAAC,CAAA;YAC1G,KAAK,MAAM,IAAI,IAAI,KAAK;gBAAE,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACrD,CAAC;QAAC,MAAM,CAAC;YACP,sEAAsE;YACtE,kEAAkE;YAClE,SAAQ;QACV,CAAC;IACH,CAAC;IACD,IAAI,YAAY,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,KAAK,CAAA;IACzC,OAAO;QACL,GAAG,KAAK;QACR,oBAAoB,EAAE,KAAK,CAAC,oBAAoB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;KAC5F,CAAA;AACH,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,2BAA2B,CAAC,KAAiB,EAAE,KAAmB;IAChF,OAAO,mCAAmC,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,CAAA;AAC5D,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,IAAY;IACpC,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IAC7C,IAAI,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAA;IAChH,IAAI,CAAC;QACH,OAAO,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAY,CAAC,CAAA;IAC1D,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,IAAI,KAAK,YAAY,WAAW;YAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;QACnF,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC;AAED,gHAAgH;AAChH,MAAM,UAAU,KAAK,CAAC,GAAoB,EAAE,MAAM,GAAW,EAAE;IAC7D,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACvE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,yEAAyE,CAAC,CAAA;QAC1F,OAAM;IACR,CAAC;IACD,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;IAC7C,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,IAAI,GAAG,UAAU,aAAa,CAAC,CAAA;IACzE,MAAM,eAAe,GAAG,MAAM,CAAC,eAAe,IAAI,KAAK,CAAA;IACvD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,eAAe,CAAC,IAAI,eAAe,GAAG,GAAG,IAAI,eAAe,GAAG,MAAM,EAAE,CAAC;QAChG,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAA;IACjF,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,CAAA;IAC5G,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAA;IAClH,MAAM,eAAe,GAAG,MAAM,CAAC,cAAc,KAAK,KAAK;QACrD,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,IAAI,uBAAuB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAA;IAC5G,MAAM,YAAY,GAAG,IAAI,mBAAmB,EAAE,CAAA;IAE9C,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE;QACd,IAAI,OAAO,GAAG,KAAK,CAAA;QACnB,IAAI,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAA;QAC9B,MAAM,GAAG,GAAG,CAAC,IAAa,EAAQ,EAAE;YAClC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;gBAC9B,IAAI,OAAO;oBAAE,OAAM;gBACnB,IAAI,KAAK,GAAG,MAAM,cAAc,CAAC,SAAS,CAAC,CAAA;gBAC3C,IAAI,IAAI,EAAE,CAAC;oBACT,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,CAAA;oBAC/C,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,cAAc,KAAK,KAAK;wBACjF,CAAC,CAAC,UAAU;wBACZ,CAAC,CAAC,MAAM,gCAAgC,CAAC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;oBACtE,IAAI,WAAW,KAAK,UAAU,IAAI,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAC/G,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,mDAAmD,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA;oBACtF,CAAC;oBACD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,WAAW,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,IAAI,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,CAAC,CAAA;oBACxH,KAAK,GAAG,MAAM,CAAC,KAAK,CAAA;oBACpB,4FAA4F;oBAC5F,MAAM,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;oBACtC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC7B,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,MAAM,CAAC,MAAM,eAAe,MAAM,CAAC,aAAa,CAAC,MAAM,mBAAmB,CAAC,CAAA;oBACvH,CAAC;oBACD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;wBACxC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,KAAK,CAAC,MAAM,KAAK,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;oBACnF,CAAC;gBACH,CAAC;gBACD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;gBACjC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,oBAAoB,CAAC,MAAM,KAAK,CAAC;oBAAE,OAAM;gBAC1E,MAAM,IAAI,GAAG,mCAAmC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;gBAC/D,IAAI,IAAI,KAAK,KAAK;oBAAE,MAAM,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;gBACzD,MAAM,QAAQ,GAAG,yBAAyB,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;oBACnF,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;oBACtB,OAAO,KAAK,KAAK,SAAS,IAAI,wBAAwB,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,SAAS,CAAA;gBACnG,CAAC,CAAC,CAAA;gBACF,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;oBAC3B,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;oBACzB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;wBACxB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,QAAQ,CAAC,MAAM,yDAAyD,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,cAAc,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,IAAI,kBAAkB,EAAE,CAAC,CAAA;oBAC9M,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;gBAC1B,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,iCAAiC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;YACxE,CAAC,CAAC,CAAA;QACJ,CAAC,CAAA;QAED,MAAM,WAAW,GAAG,GAAG,CAAC,EAAE,CAAC,eAAe,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAA,CAAC,CAAC,CAAC,CAAA;QACjE,IAAI,MAAM,CAAC,UAAU,KAAK,KAAK;YAAE,GAAG,CAAC,IAAI,CAAC,CAAA;QAC1C,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC,CAAA,CAAC,CAAC,EAAE,eAAe,GAAG,KAAK,CAAC,CAAA;QACvE,OAAO,KAAK,IAAI,EAAE;YAChB,OAAO,GAAG,IAAI,CAAA;YACd,aAAa,CAAC,KAAK,CAAC,CAAA;YACpB,WAAW,EAAE,CAAA;YACb,MAAM,MAAM,CAAA;QACd,CAAC,CAAA;IACH,CAAC,EAAE,4BAA4B,CAAC,CAAA;AAClC,CAAC"}
@@ -1,2 +1,2 @@
1
- export declare const TOOL_VERSION = "0.26.0";
1
+ export declare const TOOL_VERSION = "0.28.0";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1,2 +1,2 @@
1
- export const TOOL_VERSION = '0.26.0';
1
+ export const TOOL_VERSION = '0.28.0';
2
2
  //# sourceMappingURL=version.js.map
@@ -147,7 +147,7 @@ pnpm dlx --package=upstream-radar@latest upstream-radar doctor ./upstream-radar.
147
147
 
148
148
  如果需要手写配置或制作 CI fixture,可以参考[示例清单](../examples/radar/config.json)。如果既没有 `--patch` overlay,也没有设置 `UPSTREAM_RADAR_CONFIG`,插件会保持休眠,不发起轮询。
149
149
 
150
- 启动后,Radar 会轮询 OSV 与 npm,先把事件状态持久化,再把有变化的事件交给第一个在线的根 DSH Agent
150
+ 启动后,Radar 会轮询 OSV 与 npm,先把事件状态持久化,再把有变化的事件交给项目 workspace 对应的根 DSH Agent。只有一个 root 时保持自动投递;有多个 root 且无法精确匹配 workspace 时,任务会留在队列中,不会误投给另一个项目。
151
151
 
152
152
  每轮发现新版本时,默认还会检查最早的一小段候选依赖图。CLI 可以用 `--no-deep-candidates` 显式关闭;原生 DSH 配置可以设置 `deepCandidates: false`。这项解析在临时目录中运行 `npm install --package-lock-only --ignore-scripts`,只解析 manifest 和 lockfile,不加载或执行候选代码。
153
153
 
@@ -181,7 +181,7 @@ pnpm run try:dsh
181
181
  在把项目接入兼容性门禁前,可以先运行离线规则 benchmark:
182
182
 
183
183
  ```bash
184
- pnpm dlx --package=upstream-radar@0.26.0 upstream-radar benchmark compatibility
184
+ pnpm dlx --package=upstream-radar@0.28.0 upstream-radar benchmark compatibility
185
185
  ```
186
186
 
187
187
  它覆盖六类契约:安全补丁、只需要项目分析的变化、不兼容的 DSH peer、发布者明确声明 breaking、候选传递依赖漏洞,以及候选依赖图不完整。这个命令不会联网、安装包、加载插件或启动 DSH;它验证的是 Radar 的确定性规则以及 `breaking`/`any` 门禁行为,不是运行时兼容性证明。
@@ -194,7 +194,7 @@ pnpm dlx --package=upstream-radar@0.26.0 upstream-radar benchmark compatibility
194
194
  # 打包精确版本,并明确不运行它的 lifecycle script。
195
195
  npm pack --ignore-scripts dsh-plugin@1.2.3
196
196
 
197
- pnpm dlx --package=upstream-radar@0.26.0 upstream-radar probe dsh-load \
197
+ pnpm dlx --package=upstream-radar@0.28.0 upstream-radar probe dsh-load \
198
198
  ./dsh-plugin-1.2.3.tgz \
199
199
  --dsh-version 0.1.0-rc.6
200
200
  ```
@@ -220,7 +220,7 @@ pnpm run showcase:dsh-probe
220
220
  如果要比较多个 DSH 版本,可以使用矩阵入口:
221
221
 
222
222
  ```bash
223
- pnpm dlx --package=upstream-radar@0.26.0 upstream-radar probe dsh-matrix \
223
+ pnpm dlx --package=upstream-radar@0.28.0 upstream-radar probe dsh-matrix \
224
224
  ./dsh-plugin-1.2.3.tgz \
225
225
  --dsh-version 0.1.0-rc.3 \
226
226
  --dsh-version 0.1.0-rc.6 \
@@ -233,12 +233,12 @@ JSON 结果结构见[矩阵结果 schema](../schemas/dsh-load-matrix.schema.json
233
233
 
234
234
  ## 在 GitHub Actions 中运行
235
235
 
236
- 如果团队想先用定时 CI 检查,而不是马上在 runner 里安装 DSH,可以把审查过的 `upstream-radar.config.json` 提交到仓库,然后复制[示例 workflow](../examples/github-actions/upstream-radar.yml)。现在可以直接使用可复用的 GitHub Action,workflow 只需要两个关键步骤:
236
+ 如果团队想先用定时 CI 检查,而不是马上在 runner 里安装 DSH,可以把审查过的 `upstream-radar.config.json` 提交到仓库,然后复制[示例 workflow](../examples/github-actions/upstream-radar.yml)。现在可以直接使用可复用的 GitHub Action,workflow 只需要两个关键步骤;需要时再增加一个 DSH 加载兼容性步骤:
237
237
 
238
238
  ```yaml
239
239
  steps:
240
240
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
241
- - uses: MicroMilo/upstream-radar@v0.26.0
241
+ - uses: MicroMilo/upstream-radar@v0.28.0
242
242
  with:
243
243
  config: upstream-radar.config.json
244
244
  fail-on: high
@@ -246,16 +246,30 @@ steps:
246
246
  fail-on-compatibility: breaking
247
247
  ```
248
248
 
249
- 这个 Action 只是 `radar check --frozen --state :memory: --fail-on high --fail-on-compatibility breaking --json` 的薄封装。`--frozen` 是有意的:它只使用配置文件里的依赖图,不会尝试读取 runner 上不存在的本地 DSH profile。每次运行彼此独立;发现达到阈值的漏洞或选择的兼容性变化时返回 `2`,运行或漏洞源出错时返回 `1`。`breaking` 只拦截有 confirmed/strong 信号的兼容性事件,`any` 会拦截所有活动兼容性事件,默认值是 `never`。这个入口不会投递 DSH Agent 任务,也不会修改分支;需要持续监控和项目级分析时,仍使用原生 DSH bundle。建议把 Action 固定到类似 `v0.26.0` 的发布标签,并根据团队策略固定 checkout Action。
249
+ 这个 Action 只是 `radar check --frozen --state :memory: --fail-on high --fail-on-compatibility breaking --json` 的薄封装。`--frozen` 是有意的:它只使用配置文件里的依赖图,不会尝试读取 runner 上不存在的本地 DSH profile。每次运行彼此独立;发现达到阈值的漏洞或选择的兼容性变化时返回 `2`,运行或漏洞源出错时返回 `1`。`breaking` 只拦截有 confirmed/strong 信号的兼容性事件,`any` 会拦截所有活动兼容性事件,默认值是 `never`。这个入口不会投递 DSH Agent 任务,也不会修改分支;需要持续监控和项目级分析时,仍使用原生 DSH bundle。建议把 Action 固定到类似 `v0.28.0` 的发布标签,并根据团队策略固定 checkout Action。
250
250
 
251
251
  调用方需要先 checkout 仓库。这个 Action 不会安装项目依赖,也不会执行项目的 lifecycle script;它只读取提交到仓库的依赖图并查询配置中的上游漏洞源。如果需要完全显式的底层命令,等价写法是:
252
252
 
253
253
  ```bash
254
- pnpm dlx --package=upstream-radar@0.26.0 upstream-radar radar check \
254
+ pnpm dlx --package=upstream-radar@0.28.0 upstream-radar radar check \
255
255
  ./upstream-radar.config.json --frozen --state :memory: --fail-on high \
256
256
  --fail-on-compatibility breaking --json
257
257
  ```
258
258
 
259
+ 如果还要检查一个已发布插件能否跨多个 DSH 版本加载,可以增加三个 input:
260
+
261
+ ```yaml
262
+ - uses: MicroMilo/upstream-radar@v0.28.0
263
+ id: radar
264
+ with:
265
+ config: upstream-radar.config.json
266
+ fail-on: high
267
+ probe-package: dsh-cloudflare-browser-run@0.1.1
268
+ probe-dsh-versions: 0.1.0-rc.3,0.1.0-rc.6
269
+ ```
270
+
271
+ Action 会用 `--ignore-scripts` 打包精确 npm 版本,运行 `probe dsh-matrix`,并暴露 `probe-result`。如果结果是 `incompatible` 或 `unknown`,Action 会失败。这个步骤会下载并加载 DSH bundle 到临时 profile;它是兼容性信号,不是安全沙箱,也不是能力测试。
272
+
259
273
  如果想先跑一个真实消费者样例,可以参考使用真实 [`dsh-cloudflare-browser-run@0.1.1`](../examples/github-actions/consumer/upstream-radar.config.json) 依赖图的[consumer smoke 说明](../examples/github-actions/consumer/README.md)和[可复制 workflow](../examples/github-actions/consumer/upstream-radar.yml)。
260
274
 
261
275
  在本仓库中也可以直接运行同一个已发布 Action:
@@ -332,11 +346,11 @@ DSH Agent 收到的任务要求:只读分析、引用项目证据、保留不
332
346
 
333
347
  ## 当前能力与边界
334
348
 
335
- 已经支持:DSH profile 实际安装树和 npm lock 依赖图、重复版本路径、未解析依赖的覆盖提示、OSV 精确版本匹配、恶意包记录、npm release 监听(只接受高于当前安装版本的候选;npm 的 `latest` 回退不会制造 breaking 告警;最新版本有确定性阻断时会检查历史候选的 OSV 状态和最早一小段传递依赖图,并筛出第一个没有确定性阻断且没有已知漏洞路径、值得交给 DSH 分析的候选;图不完整、图解析或 OSV 失败时不推荐候选)、公开 GitHub Release 说明、OSV 故障时保留已确认状态、连续失败后的 source-health DSH notice、持久事件、DSH 原生投递,以及 Node/peer/exports/入口/bundle/版本边界检查;还包括不联网的 `doctor` 接线检查、默认可提交的相对 workspace、把审查过的图接入 CI 的可复用 GitHub Action、可选的 breaking/any 兼容性门禁、离线的 `benchmark compatibility` 规则契约检查,以及基于真实 DSH 插件的 consumer smoke。
349
+ 已经支持:DSH profile 实际安装树和 npm lock 依赖图、重复版本路径、未解析依赖的覆盖提示、OSV 精确版本匹配、恶意包记录、npm release 监听(只接受高于当前安装版本的候选;npm 的 `latest` 回退不会制造 breaking 告警;最新版本有确定性阻断时会检查历史候选的 OSV 状态和最早一小段传递依赖图,并筛出第一个没有确定性阻断且没有已知漏洞路径、值得交给 DSH 分析的候选;图不完整、图解析或 OSV 失败时不推荐候选)、公开 GitHub Release 说明、OSV 故障时保留已确认状态、连续失败后的 source-health DSH notice、持久事件、按项目 workspace 精确路由到 DSH Agent、DSH 原生投递,以及 Node/peer/exports/入口/bundle/版本边界检查;还包括不联网的 `doctor` 接线检查、默认可提交的相对 workspace、把审查过的图接入 CI 的可复用 GitHub Action、可选的 breaking/any 兼容性门禁、可选的 DSH 版本加载矩阵、离线的 `benchmark compatibility` 规则契约检查,以及基于真实 DSH 插件的 consumer smoke。
336
350
 
337
351
  此外支持一次性的 `probe dsh-load` 和有界的 `probe dsh-matrix`:在临时 DSH profile 中针对一个或多个精确 DSH 版本加载一个精确 tarball,并返回 `compatible`、`incompatible` 或 `unknown`。它是加载兼容性证据,不是安全准入,也不是插件能力 benchmark。
338
352
 
339
- `init` 在省略 `--profile` 时可以自动选择唯一一个含第三方 bundle 的 DSH profile;多个候选仍要求显式指定。默认读取实际安装树,因此 pnpm override 和本地解析选择会被纳入;原生解析 pnpm lockfile 以支持安装前/CI 检查仍未实现。加上 `--dsh-patch <path>` 可以生成不依赖环境变量的 DSH overlay。`radar status` 提供离线的首次运行检查、活动事件摘要和下一步提示,但不会替你刷新漏洞源,也不会自动升级插件。暂未支持 Yarn 图适配、changelog/比较 diff/迁移文档源、项目级 Session 精确路由、把 Agent 结论写回事件,以及自动创建 Issue 或 PR
353
+ `init` 在省略 `--profile` 时可以自动选择唯一一个含第三方 bundle 的 DSH profile;多个候选仍要求显式指定。默认读取实际安装树,因此 pnpm override 和本地解析选择会被纳入;原生解析 pnpm lockfile 以支持安装前/CI 检查仍未实现。加上 `--dsh-patch <path>` 可以生成不依赖环境变量的 DSH overlay。`radar status` 提供离线的首次运行检查、活动事件摘要和下一步提示,但不会替你刷新漏洞源,也不会自动升级插件。暂未支持 Yarn 图适配、changelog/比较 diff/迁移文档源、把 Agent 结论写回事件,以及自动创建 Issue 或 PR。多 root Agent 场景下,只有 `project.workspace` 与 DSH 会话的 `cwd` 精确一致才会投递;无法确认时任务会留在队列中。
340
354
 
341
355
  `radar watch` 是 CLI 监控入口,本身不会把任务投递给 DSH;需要 Agent 分析时应使用原生 DSH bundle。
342
356
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "upstream-radar",
3
- "version": "0.26.0",
3
+ "version": "0.28.0",
4
4
  "description": "Always-on dependency security monitoring for DeepSeek Harness (DSH) plugins: find exact installed or candidate transitive vulnerable paths and breaking updates, then route evidence to a DSH Agent.",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",