@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 +2 -2
- package/src/config.mjs +3 -3
- package/src/filter-azure.mjs +11 -0
- package/src/filter-forgejo.mjs +11 -0
- package/src/filter-gitlab.mjs +11 -0
- package/src/filter.mjs +11 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@edgehero/pi-dispatch-receiver",
|
|
3
|
-
"version": "1.
|
|
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.
|
|
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
|
|
package/src/filter-azure.mjs
CHANGED
|
@@ -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,
|
package/src/filter-forgejo.mjs
CHANGED
|
@@ -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,
|
package/src/filter-gitlab.mjs
CHANGED
|
@@ -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,
|