@edgehero/pi-dispatch-receiver 1.1.0 → 1.2.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@edgehero/pi-dispatch-receiver",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "type": "module",
5
5
  "description": "Webhook receiver for pi-dispatch: the always-on edge that verifies GitHub, GitLab, Forgejo and Azure DevOps deliveries and enqueues (at most) one job per event for the worker.",
6
6
  "keywords": [
@@ -45,7 +45,7 @@
45
45
  },
46
46
  "dependencies": {
47
47
  "@octokit/webhooks": "14.2.0",
48
- "@edgehero/pi-dispatch": "^1.0.0",
48
+ "@edgehero/pi-dispatch": "^1.3.0",
49
49
  "bullmq": "5.80.4",
50
50
  "ioredis": "5.11.1"
51
51
  }
package/src/config.mjs CHANGED
@@ -283,13 +283,13 @@ function loadTriggers(env, readFile, fileExists) {
283
283
  }
284
284
  const group = groups[run.kind];
285
285
  if (on.type === "label") {
286
- group.label.push({ index, predicate: { any: on.any, all: on.all, none: on.none }, flow: run.flow, command: run.command, packages: run.packages, image: run.image, skillsDir: run.skillsDir, instructions: run.instructions, resume: run.resume, replicas: run.replicas, repository: run.repository });
286
+ group.label.push({ index, predicate: { any: on.any, all: on.all, none: on.none }, flow: run.flow, command: run.command, packages: run.packages, image: run.image, skillsDir: run.skillsDir, instructions: run.instructions, resume: run.resume, secrets: run.secrets, secretsProfile: run.secretsProfile, replicas: run.replicas, repository: run.repository });
287
287
  } else if (on.type === "comment") {
288
- group.comment = { index, phrase: on.phrase, defaultFlow: run.flow, command: run.command, packages: run.packages, image: run.image, skillsDir: run.skillsDir, instructions: run.instructions, resume: run.resume, replicas: run.replicas, repository: run.repository }; // parseTriggers guarantees at most one per forge
288
+ group.comment = { index, phrase: on.phrase, defaultFlow: run.flow, command: run.command, packages: run.packages, image: run.image, skillsDir: run.skillsDir, instructions: run.instructions, resume: run.resume, secrets: run.secrets, secretsProfile: run.secretsProfile, replicas: run.replicas, repository: run.repository }; // parseTriggers guarantees at most one per forge
289
289
  } else if (on.type === "pull_request") {
290
290
  // `reviewStates` is null rather than an empty Set when unnarrowed: the filter tests it for
291
291
  // presence, and an empty Set would read as "no verdict matches" and silently refuse everything.
292
- group.pullRequest.push({ index, actions: new Set(on.action), reviewStates: on.reviewState ? new Set(on.reviewState) : null, predicate: { any: on.any, all: on.all, none: on.none }, flow: run.flow, command: run.command, packages: run.packages, image: run.image, skillsDir: run.skillsDir, instructions: run.instructions, resume: run.resume, replicas: run.replicas });
292
+ group.pullRequest.push({ index, actions: new Set(on.action), reviewStates: on.reviewState ? new Set(on.reviewState) : null, predicate: { any: on.any, all: on.all, none: on.none }, flow: run.flow, command: run.command, packages: run.packages, image: run.image, skillsDir: run.skillsDir, instructions: run.instructions, resume: run.resume, secrets: run.secrets, secretsProfile: run.secretsProfile, replicas: run.replicas });
293
293
  }
294
294
  }
295
295
 
@@ -114,6 +114,11 @@ export function filterAzure(subset, triggers, knownFlows, selfId, authorized, de
114
114
  // /job/event.json, and a worker-host path in an agent-readable file is the leak prepare-local's
115
115
  // basename(folder) restraint already exists to prevent.
116
116
  ...(resolved.skillsDir !== undefined ? { skillsDir: resolved.skillsDir } : {}),
117
+ // REQ-TRIGGER-SECRETS. Conditional exactly like skillsDir above, so a trigger that binds no
118
+ // secret enqueues the job data it always has. The map holds REFERENCES, never values: the
119
+ // receiver has no resolver and reaches no vault -- the worker resolves them pre-spend.
120
+ ...(resolved.secrets !== undefined ? { secrets: resolved.secrets } : {}),
121
+ ...(resolved.secretsProfile !== undefined ? { secretsProfile: resolved.secretsProfile } : {}),
117
122
  ...(resolved.instructions !== undefined ? { instructions: resolved.instructions } : {}),
118
123
  ...(resolved.resume !== undefined ? { resume: resolved.resume } : {}),
119
124
  // How many independent sandboxes race this flow (REQ-REPLICA-RUNS). At JOB level and conditional for the
@@ -181,6 +186,8 @@ function matchLabelRules(subset, triggers, labels, action) {
181
186
  packages: rule.packages,
182
187
  image: rule.image,
183
188
  skillsDir: rule.skillsDir,
189
+ secrets: rule.secrets,
190
+ secretsProfile: rule.secretsProfile,
184
191
  instructions: rule.instructions,
185
192
  resume: rule.resume,
186
193
  replicas: rule.replicas,
@@ -222,6 +229,8 @@ function routeComment(subset, triggers, knownFlows, targetType) {
222
229
  packages: triggers.comment.packages,
223
230
  image: triggers.comment.image,
224
231
  skillsDir: triggers.comment.skillsDir,
232
+ secrets: triggers.comment.secrets,
233
+ secretsProfile: triggers.comment.secretsProfile,
225
234
  instructions: triggers.comment.instructions,
226
235
  resume: triggers.comment.resume,
227
236
  replicas: triggers.comment.replicas,
@@ -252,6 +261,8 @@ function routePullRequest(subset, triggers, action) {
252
261
  packages: rule.packages,
253
262
  image: rule.image,
254
263
  skillsDir: rule.skillsDir,
264
+ secrets: rule.secrets,
265
+ secretsProfile: rule.secretsProfile,
255
266
  instructions: rule.instructions,
256
267
  resume: rule.resume,
257
268
  replicas: rule.replicas,
@@ -116,6 +116,11 @@ export function filterForgejo(eventName, subset, triggers, knownFlows, selfId, a
116
116
  // /job/event.json, and a worker-host path in an agent-readable file is the leak prepare-local's
117
117
  // basename(folder) restraint already exists to prevent.
118
118
  ...(resolved.skillsDir !== undefined ? { skillsDir: resolved.skillsDir } : {}),
119
+ // REQ-TRIGGER-SECRETS. Conditional exactly like skillsDir above, so a trigger that binds no
120
+ // secret enqueues the job data it always has. The map holds REFERENCES, never values: the
121
+ // receiver has no resolver and reaches no vault -- the worker resolves them pre-spend.
122
+ ...(resolved.secrets !== undefined ? { secrets: resolved.secrets } : {}),
123
+ ...(resolved.secretsProfile !== undefined ? { secretsProfile: resolved.secretsProfile } : {}),
119
124
  ...(resolved.instructions !== undefined ? { instructions: resolved.instructions } : {}),
120
125
  ...(resolved.resume !== undefined ? { resume: resolved.resume } : {}),
121
126
  // How many independent sandboxes race this flow (REQ-REPLICA-RUNS). At JOB level and conditional for the
@@ -149,6 +154,8 @@ function routeIssueLabel(subset, triggers) {
149
154
  packages: rule.packages, // the MATCHED rule's fields -- rules in one file may differ on them
150
155
  image: rule.image,
151
156
  skillsDir: rule.skillsDir,
157
+ secrets: rule.secrets,
158
+ secretsProfile: rule.secretsProfile,
152
159
  instructions: rule.instructions,
153
160
  resume: rule.resume,
154
161
  replicas: rule.replicas,
@@ -195,6 +202,8 @@ function routeComment(subset, triggers, knownFlows) {
195
202
  packages: triggers.comment.packages,
196
203
  image: triggers.comment.image,
197
204
  skillsDir: triggers.comment.skillsDir,
205
+ secrets: triggers.comment.secrets,
206
+ secretsProfile: triggers.comment.secretsProfile,
198
207
  instructions: triggers.comment.instructions,
199
208
  resume: triggers.comment.resume,
200
209
  replicas: triggers.comment.replicas,
@@ -223,6 +232,8 @@ function routePullRequest(subset, triggers, action) {
223
232
  packages: rule.packages,
224
233
  image: rule.image,
225
234
  skillsDir: rule.skillsDir,
235
+ secrets: rule.secrets,
236
+ secretsProfile: rule.secretsProfile,
226
237
  instructions: rule.instructions,
227
238
  resume: rule.resume,
228
239
  replicas: rule.replicas,
@@ -107,6 +107,11 @@ export function filterGitLab(subset, triggers, knownFlows, selfId, authorized, d
107
107
  // /job/event.json, and a worker-host path in an agent-readable file is the leak prepare-local's
108
108
  // basename(folder) restraint already exists to prevent.
109
109
  ...(resolved.skillsDir !== undefined ? { skillsDir: resolved.skillsDir } : {}),
110
+ // REQ-TRIGGER-SECRETS. Conditional exactly like skillsDir above, so a trigger that binds no
111
+ // secret enqueues the job data it always has. The map holds REFERENCES, never values: the
112
+ // receiver has no resolver and reaches no vault -- the worker resolves them pre-spend.
113
+ ...(resolved.secrets !== undefined ? { secrets: resolved.secrets } : {}),
114
+ ...(resolved.secretsProfile !== undefined ? { secretsProfile: resolved.secretsProfile } : {}),
110
115
  ...(resolved.instructions !== undefined ? { instructions: resolved.instructions } : {}),
111
116
  // Conditional like packages/image, and for the same reason: an unflagged job's data must stay
112
117
  // byte-identical to today's, so the key is absent rather than present-and-undefined.
@@ -147,6 +152,8 @@ function routeLabel(subset, triggers, targetType) {
147
152
  packages: rule.packages,
148
153
  image: rule.image,
149
154
  skillsDir: rule.skillsDir,
155
+ secrets: rule.secrets,
156
+ secretsProfile: rule.secretsProfile,
150
157
  instructions: rule.instructions,
151
158
  resume: rule.resume,
152
159
  replicas: rule.replicas,
@@ -208,6 +215,8 @@ function mrResult(subset, rule, matched) {
208
215
  packages: rule.packages,
209
216
  image: rule.image,
210
217
  skillsDir: rule.skillsDir,
218
+ secrets: rule.secrets,
219
+ secretsProfile: rule.secretsProfile,
211
220
  instructions: rule.instructions,
212
221
  resume: rule.resume,
213
222
  replicas: rule.replicas,
@@ -255,6 +264,8 @@ function routeNote(subset, triggers, knownFlows) {
255
264
  packages: triggers.comment.packages,
256
265
  image: triggers.comment.image,
257
266
  skillsDir: triggers.comment.skillsDir,
267
+ secrets: triggers.comment.secrets,
268
+ secretsProfile: triggers.comment.secretsProfile,
258
269
  instructions: triggers.comment.instructions,
259
270
  resume: triggers.comment.resume,
260
271
  replicas: triggers.comment.replicas,
package/src/filter.mjs CHANGED
@@ -121,6 +121,11 @@ export function filter(eventName, subset, cfg, selfId, deliveryId) {
121
121
  // /job/event.json, and a worker-host path in an agent-readable file is the leak prepare-local's
122
122
  // basename(folder) restraint already exists to prevent.
123
123
  ...(resolved.skillsDir !== undefined ? { skillsDir: resolved.skillsDir } : {}),
124
+ // REQ-TRIGGER-SECRETS. Conditional exactly like skillsDir above, so a trigger that binds no
125
+ // secret enqueues the job data it always has. The map holds REFERENCES, never values: the
126
+ // receiver has no resolver and reaches no vault -- the worker resolves them pre-spend.
127
+ ...(resolved.secrets !== undefined ? { secrets: resolved.secrets } : {}),
128
+ ...(resolved.secretsProfile !== undefined ? { secretsProfile: resolved.secretsProfile } : {}),
124
129
  ...(resolved.instructions !== undefined ? { instructions: resolved.instructions } : {}),
125
130
  // Conditional like packages/image, and for the same reason: an unflagged job's data must stay
126
131
  // byte-identical to today's, so the key is absent rather than present-and-undefined.
@@ -166,6 +171,8 @@ function routeIssueLabel(subset, triggers) {
166
171
  packages: rule.packages, // the MATCHED rule's fields -- rules in one file may differ on them
167
172
  image: rule.image,
168
173
  skillsDir: rule.skillsDir,
174
+ secrets: rule.secrets,
175
+ secretsProfile: rule.secretsProfile,
169
176
  instructions: rule.instructions,
170
177
  resume: rule.resume,
171
178
  replicas: rule.replicas,
@@ -223,6 +230,8 @@ function routeComment(subset, triggers, knownFlows) {
223
230
  packages: triggers.comment.packages,
224
231
  image: triggers.comment.image,
225
232
  skillsDir: triggers.comment.skillsDir,
233
+ secrets: triggers.comment.secrets,
234
+ secretsProfile: triggers.comment.secretsProfile,
226
235
  instructions: triggers.comment.instructions,
227
236
  resume: triggers.comment.resume,
228
237
  replicas: triggers.comment.replicas,
@@ -318,6 +327,8 @@ function routePullRequest(subset, triggers, action) {
318
327
  packages: rule.packages, // the MATCHED rule's fields -- rules in one file may differ on them
319
328
  image: rule.image,
320
329
  skillsDir: rule.skillsDir,
330
+ secrets: rule.secrets,
331
+ secretsProfile: rule.secretsProfile,
321
332
  instructions: rule.instructions,
322
333
  resume: rule.resume,
323
334
  replicas: rule.replicas,