@voltro/workflow 0.75.0 → 0.77.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/CHANGELOG.md +459 -0
- package/THIRD-PARTY-NOTICES.md +1 -1
- package/dist/clusterTestSuite.js +1 -1
- package/dist/index.d.ts +7 -3
- package/dist/index.js +3 -3
- package/dist/{src-BnF1JtbZ.js → src-BvXFdkkW.js} +545 -542
- package/package.json +5 -5
|
@@ -5,9 +5,10 @@ import { Cause as x, Effect as S, Either as C, Exit as ie, Fiber as ae, FiberRef
|
|
|
5
5
|
import { WorkflowQueuedCancellationResultSchema as T, WorkflowStartTerminalOutcomeSchema as E, publishServerError as ce } from "@voltro/protocol";
|
|
6
6
|
import { and as D, boolean as le, derivedRowId as ue, eq as O, generateId as k, gt as A, gte as de, id as j, inSet as fe, integer as M, isNotNull as pe, isNull as N, json as P, lt as me, or as he, queryFor as ge, reference as _e, registerRetention as ve, retentionTtlMsFromEnv as ye, table as F, text as I, timestamp as L } from "@voltro/database";
|
|
7
7
|
import { createHash as be, randomUUID as R } from "node:crypto";
|
|
8
|
-
import {
|
|
8
|
+
import { isDeepStrictEqual as xe } from "node:util";
|
|
9
|
+
import { WorkflowInstance as Se } from "@effect/workflow/WorkflowEngine";
|
|
9
10
|
//#region src/inMemoryLayer.ts
|
|
10
|
-
var
|
|
11
|
+
var Ce = re.layerMemory, we = F("_voltro_workflow_runs", {
|
|
11
12
|
id: j({ prefix: "wfrun" }),
|
|
12
13
|
tag: I(),
|
|
13
14
|
executionId: I().unique(),
|
|
@@ -44,9 +45,9 @@ var Se = re.layerMemory, Ce = F("_voltro_workflow_runs", {
|
|
|
44
45
|
"terminate",
|
|
45
46
|
"abandon"
|
|
46
47
|
]).nullable()
|
|
47
|
-
}).index(["tag"]).index(["status"]).index(["source"]).index(["startedAt"]).index(["parentExecutionId"]).index(["parentClosePolicy"]),
|
|
48
|
+
}).index(["tag"]).index(["status"]).index(["source"]).index(["startedAt"]).index(["parentExecutionId"]).index(["parentClosePolicy"]), Te = F("_voltro_workflow_run_steps", {
|
|
48
49
|
id: j({ prefix: "wfstep" }),
|
|
49
|
-
runId: _e(() =>
|
|
50
|
+
runId: _e(() => we, {
|
|
50
51
|
index: !1,
|
|
51
52
|
onDelete: "cascade"
|
|
52
53
|
}),
|
|
@@ -66,9 +67,9 @@ var Se = re.layerMemory, Ce = F("_voltro_workflow_runs", {
|
|
|
66
67
|
startedAt: L().default("now"),
|
|
67
68
|
completedAt: L().nullable(),
|
|
68
69
|
durationMs: M().nullable()
|
|
69
|
-
}).index(["runId", "stepName"]).index(["startedAt"]),
|
|
70
|
+
}).index(["runId", "stepName"]).index(["startedAt"]), Ee = F("_voltro_workflow_run_events", {
|
|
70
71
|
id: j({ prefix: "wfev" }),
|
|
71
|
-
runId: _e(() =>
|
|
72
|
+
runId: _e(() => we, {
|
|
72
73
|
index: !1,
|
|
73
74
|
onDelete: "cascade"
|
|
74
75
|
}),
|
|
@@ -77,7 +78,7 @@ var Se = re.layerMemory, Ce = F("_voltro_workflow_runs", {
|
|
|
77
78
|
occurredAt: L().default("now"),
|
|
78
79
|
stepName: I().nullable(),
|
|
79
80
|
attempt: M().nullable()
|
|
80
|
-
}).index(["runId", "occurredAt"]).index(["eventType"]),
|
|
81
|
+
}).index(["runId", "occurredAt"]).index(["eventType"]), De = F("_voltro_workflow_start_contexts", {
|
|
81
82
|
id: j({ prefix: "wfctx" }),
|
|
82
83
|
workflowName: I(),
|
|
83
84
|
executionId: I().unique(),
|
|
@@ -92,10 +93,10 @@ var Se = re.layerMemory, Ce = F("_voltro_workflow_runs", {
|
|
|
92
93
|
"abandon"
|
|
93
94
|
]).nullable(),
|
|
94
95
|
createdAt: L().default("now")
|
|
95
|
-
}).index(["workflowName"]).index(["executionId"]).index(["parentExecutionId"]),
|
|
96
|
+
}).index(["workflowName"]).index(["executionId"]).index(["parentExecutionId"]), Oe = F("_voltro_workflow_admission_locks", {
|
|
96
97
|
id: j({ prefix: "wfalk" }),
|
|
97
98
|
nonce: I()
|
|
98
|
-
}).nonReactive(),
|
|
99
|
+
}).nonReactive(), ke = F("_voltro_workflow_parent_closures", {
|
|
99
100
|
id: j({ prefix: "wfpc" }),
|
|
100
101
|
runId: I(),
|
|
101
102
|
workflowName: I(),
|
|
@@ -110,7 +111,7 @@ var Se = re.layerMemory, Ce = F("_voltro_workflow_runs", {
|
|
|
110
111
|
afterChildId: I().nullable(),
|
|
111
112
|
scanHasOpenChildren: le().default(!1),
|
|
112
113
|
completedAt: L().nullable()
|
|
113
|
-
}).index(["executionId"]).index(["completedAt", "id"]).nonReactive(),
|
|
114
|
+
}).index(["executionId"]).index(["completedAt", "id"]).nonReactive(), Ae = F("_voltro_workflow_control_requests", {
|
|
114
115
|
id: j({ prefix: "wfctl" }),
|
|
115
116
|
runId: I(),
|
|
116
117
|
workflowName: I(),
|
|
@@ -128,7 +129,7 @@ var Se = re.layerMemory, Ce = F("_voltro_workflow_runs", {
|
|
|
128
129
|
resumeJournal: P().nullable(),
|
|
129
130
|
dispatchAttempts: M().default(0),
|
|
130
131
|
result: P().nullable()
|
|
131
|
-
}).index(["runId"]).index(["parentClosureId", "id"]).nonReactive(),
|
|
132
|
+
}).index(["runId"]).index(["parentClosureId", "id"]).nonReactive(), je = F("_voltro_workflow_failure_reports", {
|
|
132
133
|
id: j({ prefix: "wffr" }),
|
|
133
134
|
workflowName: I(),
|
|
134
135
|
tenantId: I().nullable(),
|
|
@@ -144,7 +145,7 @@ var Se = re.layerMemory, Ce = F("_voltro_workflow_runs", {
|
|
|
144
145
|
handoffReceiptId: I().nullable(),
|
|
145
146
|
handoffAttempt: M().default(0),
|
|
146
147
|
acceptedExecutionId: I().nullable()
|
|
147
|
-
}).index(["sourceKind", "sourceId"]).nonReactive(),
|
|
148
|
+
}).index(["sourceKind", "sourceId"]).nonReactive(), Me = F("_voltro_workflow_submissions", {
|
|
148
149
|
id: j({ prefix: "wfsub" }),
|
|
149
150
|
workflowName: I(),
|
|
150
151
|
tenantId: I().nullable(),
|
|
@@ -160,14 +161,14 @@ var Se = re.layerMemory, Ce = F("_voltro_workflow_runs", {
|
|
|
160
161
|
callerContext: P().nullable(),
|
|
161
162
|
intentIds: P(),
|
|
162
163
|
eviction: P().nullable()
|
|
163
|
-
}).nonReactive(),
|
|
164
|
+
}).nonReactive(), Ne = F("_voltro_workflow_start_receipts", {
|
|
164
165
|
id: j({ prefix: "wfrc" }),
|
|
165
166
|
workflowName: I(),
|
|
166
167
|
tenantId: I().nullable(),
|
|
167
168
|
pendingId: I().maxLength(64),
|
|
168
169
|
submissionId: I().maxLength(64).nullable(),
|
|
169
170
|
terminal: P().nullable()
|
|
170
|
-
}).index(["pendingId"]).nonReactive(),
|
|
171
|
+
}).index(["pendingId"]).nonReactive(), Pe = F("_voltro_workflow_pending", {
|
|
171
172
|
id: j({ prefix: "wfp" }),
|
|
172
173
|
tenantId: I().nullable(),
|
|
173
174
|
workflowName: I(),
|
|
@@ -193,7 +194,7 @@ var Se = re.layerMemory, Ce = F("_voltro_workflow_runs", {
|
|
|
193
194
|
attempts: M().default(0),
|
|
194
195
|
lastError: I().nullable(),
|
|
195
196
|
deadLetteredAt: L().nullable()
|
|
196
|
-
}).index(["workflowName", "controlKey"]).index(["dueAt"]).index(["workflowName", "mode"]).index(["tenantId"]),
|
|
197
|
+
}).index(["workflowName", "controlKey"]).index(["dueAt"]).index(["workflowName", "mode"]).index(["tenantId"]), Fe = F("_voltro_workflow_admissions", {
|
|
197
198
|
id: j({ prefix: "wfadm" }),
|
|
198
199
|
tenantId: I().nullable(),
|
|
199
200
|
workflowName: I(),
|
|
@@ -218,64 +219,64 @@ var Se = re.layerMemory, Ce = F("_voltro_workflow_runs", {
|
|
|
218
219
|
admittedAt: L().default("now"),
|
|
219
220
|
expiresAt: L().nullable(),
|
|
220
221
|
releasedAt: L().nullable()
|
|
221
|
-
}).index(["workflowName", "admittedAt"]).index(["concurrencyKey", "releasedAt"]).index(["singletonKey", "releasedAt"]).index(["rateKey", "admittedAt"]).index(["executionId"]).index(["tenantId"]),
|
|
222
|
+
}).index(["workflowName", "admittedAt"]).index(["concurrencyKey", "releasedAt"]).index(["singletonKey", "releasedAt"]).index(["rateKey", "admittedAt"]).index(["executionId"]).index(["tenantId"]), Ie = F("_voltro_workflow_pauses", {
|
|
222
223
|
id: j({ prefix: "wfpause" }),
|
|
223
224
|
pausedAt: L().default("now"),
|
|
224
225
|
pausedBy: I().nullable(),
|
|
225
226
|
reason: I().nullable()
|
|
226
|
-
}),
|
|
227
|
-
id:
|
|
227
|
+
}), Le = "_voltro_workflow_admission_locks", Re = "deployment", ze = async (e, t) => (await e.insertIgnoreWithOutcome(Le, {
|
|
228
|
+
id: Re,
|
|
228
229
|
nonce: R()
|
|
229
230
|
}, { conflictColumns: ["id"] }), e.transactional(async (e) => {
|
|
230
231
|
if ((await e.query({
|
|
231
232
|
table: "_voltro_workflow_admission_locks",
|
|
232
|
-
predicate: O("id",
|
|
233
|
+
predicate: O("id", Re),
|
|
233
234
|
lock: "update",
|
|
234
235
|
order: [],
|
|
235
236
|
take: 1,
|
|
236
237
|
skip: void 0,
|
|
237
238
|
projection: void 0
|
|
238
239
|
})).length !== 1) throw Error("Admission coordinator row is missing; refusing an unlocked decision");
|
|
239
|
-
if (await e.update("_voltro_workflow_admission_locks",
|
|
240
|
+
if (await e.update("_voltro_workflow_admission_locks", Re, { nonce: R() }) === null) throw Error("Admission coordinator row disappeared; refusing an unlocked decision");
|
|
240
241
|
return t(e);
|
|
241
|
-
})),
|
|
242
|
+
})), Be = class extends Error {
|
|
242
243
|
workflowName;
|
|
243
244
|
field;
|
|
244
245
|
constructor(e, t, n) {
|
|
245
246
|
super(`workflow '${e}': ${t}(payload) threw — a flow-control key function must be total over every payload the workflow accepts, because it runs before the run exists and there is nowhere to report a partial failure to. Cause: ${n instanceof Error ? n.message : String(n)}`), this.name = "FlowControlKeyError", this.workflowName = e, this.field = t, this.cause = n;
|
|
246
247
|
}
|
|
247
|
-
},
|
|
248
|
+
}, Ve = (e, t, n, r) => {
|
|
248
249
|
try {
|
|
249
250
|
let e = n(r);
|
|
250
251
|
if (typeof e != "string" || e.length === 0) throw Error(`returned ${e === "" ? "an empty string" : String(e)}; expected a non-empty string`);
|
|
251
252
|
return e;
|
|
252
253
|
} catch (n) {
|
|
253
|
-
throw new
|
|
254
|
+
throw new Be(e, t, n);
|
|
254
255
|
}
|
|
255
|
-
},
|
|
256
|
+
}, He = (e, t) => JSON.stringify([e ?? null, t]), Ue = (e, t) => {
|
|
256
257
|
let n = e.workflowName, r = 0;
|
|
257
258
|
if (e.priority !== void 0) try {
|
|
258
259
|
let n = e.priority(t);
|
|
259
260
|
if (!Number.isFinite(n)) throw Error(`returned ${String(n)}; expected a finite number`);
|
|
260
261
|
r = Math.trunc(n);
|
|
261
262
|
} catch (e) {
|
|
262
|
-
throw new
|
|
263
|
+
throw new Be(n, "priority", e);
|
|
263
264
|
}
|
|
264
265
|
return {
|
|
265
|
-
...e.debounce === void 0 ? {} : { debounceKey:
|
|
266
|
-
...e.singleton === void 0 ? {} : { singletonKey:
|
|
267
|
-
...e.concurrency === void 0 ? {} : { concurrencyKey:
|
|
268
|
-
...e.throttle?.key === void 0 ? e.throttle === void 0 ? {} : { throttleKey: "" } : { throttleKey:
|
|
269
|
-
...e.rateLimit?.key === void 0 ? e.rateLimit === void 0 ? {} : { rateLimitKey: "" } : { rateLimitKey:
|
|
270
|
-
...e.batch?.key === void 0 ? e.batch === void 0 ? {} : { batchKey: "" } : { batchKey:
|
|
266
|
+
...e.debounce === void 0 ? {} : { debounceKey: Ve(n, "debounce.key", e.debounce.key, t) },
|
|
267
|
+
...e.singleton === void 0 ? {} : { singletonKey: Ve(n, "singleton.key", e.singleton.key, t) },
|
|
268
|
+
...e.concurrency === void 0 ? {} : { concurrencyKey: He(e.concurrency.pool, e.concurrency.key === void 0 ? "" : Ve(n, "concurrency.key", e.concurrency.key, t)) },
|
|
269
|
+
...e.throttle?.key === void 0 ? e.throttle === void 0 ? {} : { throttleKey: "" } : { throttleKey: Ve(n, "throttle.key", e.throttle.key, t) },
|
|
270
|
+
...e.rateLimit?.key === void 0 ? e.rateLimit === void 0 ? {} : { rateLimitKey: "" } : { rateLimitKey: Ve(n, "rateLimit.key", e.rateLimit.key, t) },
|
|
271
|
+
...e.batch?.key === void 0 ? e.batch === void 0 ? {} : { batchKey: "" } : { batchKey: Ve(n, "batch.key", e.batch.key, t) },
|
|
271
272
|
priority: r
|
|
272
273
|
};
|
|
273
|
-
},
|
|
274
|
+
}, We = (e, t, n, r) => {
|
|
274
275
|
let i = e.filter((e) => e > r - n);
|
|
275
276
|
if (i.length < t) return;
|
|
276
277
|
let a = [...i].sort((e, t) => t - e)[t - 1];
|
|
277
278
|
if (a !== void 0) return a + n;
|
|
278
|
-
},
|
|
279
|
+
}, Ge = (e) => {
|
|
279
280
|
let { control: t, keys: n, state: r, now: i, reconsidering: a } = e;
|
|
280
281
|
if (r.paused === !0) return {
|
|
281
282
|
kind: "defer",
|
|
@@ -285,7 +286,7 @@ var Se = re.layerMemory, Ce = F("_voltro_workflow_runs", {
|
|
|
285
286
|
keys: n
|
|
286
287
|
};
|
|
287
288
|
if (t.rateLimit !== void 0) {
|
|
288
|
-
let e =
|
|
289
|
+
let e = We(r.recentAdmissions ?? [], t.rateLimit.limit, t.rateLimit.periodMs, i);
|
|
289
290
|
if (e !== void 0) return {
|
|
290
291
|
kind: "drop",
|
|
291
292
|
reason: "rate-limit",
|
|
@@ -311,12 +312,12 @@ var Se = re.layerMemory, Ce = F("_voltro_workflow_runs", {
|
|
|
311
312
|
kind: "admit",
|
|
312
313
|
reason: "debounce-deadline",
|
|
313
314
|
keys: n,
|
|
314
|
-
...
|
|
315
|
+
...qe(t, r)
|
|
315
316
|
} : {
|
|
316
317
|
kind: "admit",
|
|
317
318
|
reason: "debounce-elapsed",
|
|
318
319
|
keys: n,
|
|
319
|
-
...
|
|
320
|
+
...qe(t, r)
|
|
320
321
|
} : {
|
|
321
322
|
kind: "defer",
|
|
322
323
|
mode: "debounce",
|
|
@@ -332,12 +333,12 @@ var Se = re.layerMemory, Ce = F("_voltro_workflow_runs", {
|
|
|
332
333
|
kind: "admit",
|
|
333
334
|
reason: "batch-full",
|
|
334
335
|
keys: n,
|
|
335
|
-
...
|
|
336
|
+
...qe(t, r)
|
|
336
337
|
} : a && i >= s ? {
|
|
337
338
|
kind: "admit",
|
|
338
339
|
reason: "batch-timeout",
|
|
339
340
|
keys: n,
|
|
340
|
-
...
|
|
341
|
+
...qe(t, r)
|
|
341
342
|
} : {
|
|
342
343
|
kind: "defer",
|
|
343
344
|
mode: "batch",
|
|
@@ -347,7 +348,7 @@ var Se = re.layerMemory, Ce = F("_voltro_workflow_runs", {
|
|
|
347
348
|
};
|
|
348
349
|
}
|
|
349
350
|
if (t.throttle !== void 0) {
|
|
350
|
-
let e =
|
|
351
|
+
let e = We(r.recentAdmissions ?? [], t.throttle.limit, t.throttle.periodMs, i);
|
|
351
352
|
if (e !== void 0) return {
|
|
352
353
|
kind: "defer",
|
|
353
354
|
mode: "throttle",
|
|
@@ -364,17 +365,17 @@ var Se = re.layerMemory, Ce = F("_voltro_workflow_runs", {
|
|
|
364
365
|
keys: n
|
|
365
366
|
} : {
|
|
366
367
|
kind: "admit",
|
|
367
|
-
reason:
|
|
368
|
+
reason: Ke(t) ? "under-limits" : "no-controls",
|
|
368
369
|
keys: n,
|
|
369
|
-
...
|
|
370
|
+
...qe(t, r)
|
|
370
371
|
};
|
|
371
|
-
},
|
|
372
|
+
}, Ke = (e) => e.debounce !== void 0 || e.singleton !== void 0 || e.concurrency !== void 0 || e.throttle !== void 0 || e.rateLimit !== void 0 || e.batch !== void 0, qe = (e, t) => e.singleton?.mode === "cancel" && t.singletonHolder !== void 0 ? { evict: t.singletonHolder } : {}, Je = (e, t, n) => {
|
|
372
373
|
let r = e.timeouts?.startMs;
|
|
373
374
|
return r !== void 0 && n - t.firstSeenAt >= r;
|
|
374
|
-
},
|
|
375
|
+
}, Ye = (e, t, n) => {
|
|
375
376
|
let r = e.timeouts?.finishMs;
|
|
376
377
|
return r === void 0 || t.terminal ? !1 : n - t.startedAt >= r;
|
|
377
|
-
},
|
|
378
|
+
}, Xe = (e, t) => e.priority === t.priority ? e.firstSeenAt === t.firstSeenAt ? e.id < t.id ? -1 : +(e.id > t.id) : e.firstSeenAt - t.firstSeenAt : t.priority - e.priority, Ze = "_voltro_workflow_failure_reports", Qe = w.Struct({
|
|
378
379
|
id: w.String,
|
|
379
380
|
workflowName: w.String,
|
|
380
381
|
tenantId: w.NullOr(w.String),
|
|
@@ -394,34 +395,34 @@ var Se = re.layerMemory, Ce = F("_voltro_workflow_runs", {
|
|
|
394
395
|
})
|
|
395
396
|
}), z = async (e, t) => {
|
|
396
397
|
let n = await e.query({
|
|
397
|
-
table:
|
|
398
|
+
table: Ze,
|
|
398
399
|
predicate: O("id", t),
|
|
399
400
|
order: [],
|
|
400
401
|
take: 1,
|
|
401
402
|
skip: void 0,
|
|
402
403
|
projection: void 0
|
|
403
404
|
});
|
|
404
|
-
return n[0] === void 0 ? void 0 : w.decodeUnknownSync(
|
|
405
|
-
},
|
|
405
|
+
return n[0] === void 0 ? void 0 : w.decodeUnknownSync(Qe)(n[0]);
|
|
406
|
+
}, $e = async (e, t) => {
|
|
406
407
|
if (t.id.length === 0 || t.sourceId.length === 0) throw Error("Workflow failure requires a stable report and source identity");
|
|
407
408
|
let n = await z(e, t.id);
|
|
408
409
|
if (n !== void 0) {
|
|
409
410
|
if (n.workflowName !== t.workflowName || n.tenantId !== t.tenantId || n.sourceId !== t.sourceId || n.sourceKind !== t.sourceKind) throw Error("Workflow failure identity belongs to a different source, workflow or tenant");
|
|
410
411
|
return n;
|
|
411
412
|
}
|
|
412
|
-
let r = w.decodeUnknownSync(
|
|
413
|
+
let r = w.decodeUnknownSync(Qe)(t);
|
|
413
414
|
if (r.report.workflow !== r.workflowName) throw Error("Workflow failure report does not describe its owning workflow");
|
|
414
|
-
return await e.insert(
|
|
415
|
+
return await e.insert(Ze, {
|
|
415
416
|
...r,
|
|
416
417
|
handoffReceiptId: null,
|
|
417
418
|
handoffAttempt: 0,
|
|
418
419
|
acceptedExecutionId: null
|
|
419
420
|
}), r;
|
|
420
|
-
},
|
|
421
|
+
}, et = async (e, t, n) => {
|
|
421
422
|
let r, i = t === "submissionId" ? O(t, n) : D(O(t, n), N("submissionId"), N("terminal"));
|
|
422
423
|
for (;;) {
|
|
423
424
|
let t = await e.query({
|
|
424
|
-
table:
|
|
425
|
+
table: Ot,
|
|
425
426
|
predicate: r === void 0 ? i : D(i, A("id", r)),
|
|
426
427
|
order: [{
|
|
427
428
|
column: "id",
|
|
@@ -433,8 +434,8 @@ var Se = re.layerMemory, Ce = F("_voltro_workflow_runs", {
|
|
|
433
434
|
});
|
|
434
435
|
if (t.length === 0) return !1;
|
|
435
436
|
for (let n of t) {
|
|
436
|
-
let t =
|
|
437
|
-
table:
|
|
437
|
+
let t = At(n), i = await e.query({
|
|
438
|
+
table: Ze,
|
|
438
439
|
predicate: O("handoffReceiptId", t.id),
|
|
439
440
|
order: [],
|
|
440
441
|
take: 1,
|
|
@@ -448,36 +449,36 @@ var Se = re.layerMemory, Ce = F("_voltro_workflow_runs", {
|
|
|
448
449
|
r = t.id;
|
|
449
450
|
}
|
|
450
451
|
}
|
|
451
|
-
},
|
|
452
|
-
for await (let i of
|
|
452
|
+
}, tt = (e, t) => et(e, "submissionId", t), nt = (e, t) => et(e, "pendingId", t), rt = async (e, t, n, r) => {
|
|
453
|
+
for await (let i of ht(e, t, n)) {
|
|
453
454
|
if (i.tenantId !== r) throw Error("Failure delivery belongs to a different resident tenant");
|
|
454
|
-
if (await
|
|
455
|
+
if (await tt(e, i.id)) return !0;
|
|
455
456
|
}
|
|
456
457
|
return !1;
|
|
457
|
-
},
|
|
458
|
+
}, it = w.Struct({
|
|
458
459
|
handoffReceiptId: w.NullOr(w.String),
|
|
459
460
|
handoffAttempt: w.NonNegativeInt,
|
|
460
461
|
acceptedExecutionId: w.NullOr(w.NonEmptyString)
|
|
461
|
-
}),
|
|
462
|
+
}), at = (e, t) => `wfrc_${be("sha256").update(JSON.stringify([
|
|
462
463
|
"failure",
|
|
463
464
|
e,
|
|
464
465
|
t
|
|
465
|
-
])).digest("hex").slice(0, 40)}`,
|
|
466
|
+
])).digest("hex").slice(0, 40)}`, ot = async (e, t) => {
|
|
466
467
|
let n = await e.query({
|
|
467
|
-
table:
|
|
468
|
+
table: Ze,
|
|
468
469
|
predicate: O("id", t),
|
|
469
470
|
order: [],
|
|
470
471
|
take: 1,
|
|
471
472
|
skip: void 0,
|
|
472
473
|
projection: void 0
|
|
473
|
-
}), r = w.decodeUnknownSync(
|
|
474
|
+
}), r = w.decodeUnknownSync(it)(n[0]);
|
|
474
475
|
if (r.handoffReceiptId === null && (r.handoffAttempt !== 0 || r.acceptedExecutionId !== null)) throw Error("Failure report has contradictory unstarted handoff metadata");
|
|
475
476
|
return r;
|
|
476
|
-
},
|
|
477
|
+
}, st = async (e, t, n, r, i) => {
|
|
477
478
|
if (t.handler === null || t.handler.length === 0) throw Error("Cannot queue an unconfigured failure handler");
|
|
478
479
|
if (!Number.isSafeInteger(n) || n < 0) throw Error("Failure handoff attempt exhausted");
|
|
479
480
|
if (!Number.isFinite(r)) throw Error("Failure handoff retry deadline is invalid");
|
|
480
|
-
let a = await
|
|
481
|
+
let a = await Kt({
|
|
481
482
|
store: e,
|
|
482
483
|
workflowName: t.handler,
|
|
483
484
|
payload: t.report,
|
|
@@ -485,8 +486,8 @@ var Se = re.layerMemory, Ce = F("_voltro_workflow_runs", {
|
|
|
485
486
|
tenantId: t.tenantId,
|
|
486
487
|
at: r,
|
|
487
488
|
now: i
|
|
488
|
-
}), o = await
|
|
489
|
-
id:
|
|
489
|
+
}), o = await Nt(e, {
|
|
490
|
+
id: at(t.id, n),
|
|
490
491
|
workflowName: t.handler,
|
|
491
492
|
tenantId: t.tenantId,
|
|
492
493
|
pendingId: a.intentId
|
|
@@ -504,16 +505,16 @@ var Se = re.layerMemory, Ce = F("_voltro_workflow_runs", {
|
|
|
504
505
|
if (!Number.isFinite(n)) throw Error("Failure handoff requires a finite timestamp");
|
|
505
506
|
let r = await z(e, t);
|
|
506
507
|
if (r === void 0) throw Error("Cannot hand off an unknown workflow failure");
|
|
507
|
-
let { handoffReceiptId: i, handoffAttempt: a, acceptedExecutionId: o } = await
|
|
508
|
+
let { handoffReceiptId: i, handoffAttempt: a, acceptedExecutionId: o } = await ot(e, t);
|
|
508
509
|
if (r.handler === null) {
|
|
509
510
|
if (i !== null || o !== null) throw Error("Unconfigured failure report has a contradictory handoff");
|
|
510
511
|
return { kind: "unconfigured" };
|
|
511
512
|
}
|
|
512
513
|
if (r.handler.length === 0) throw Error("Failure report has an empty handler");
|
|
513
|
-
let s =
|
|
514
|
+
let s = at(t, a);
|
|
514
515
|
if (i !== null) {
|
|
515
516
|
if (i !== s) throw Error("Failure handoff receipt belongs to a different report");
|
|
516
|
-
let t = await
|
|
517
|
+
let t = await jt(e, i);
|
|
517
518
|
if (t === void 0 || t.workflowName !== r.handler || t.tenantId !== r.tenantId) throw Error("Failure report has no matching durable start receipt");
|
|
518
519
|
return {
|
|
519
520
|
kind: "queued",
|
|
@@ -521,16 +522,16 @@ var Se = re.layerMemory, Ce = F("_voltro_workflow_runs", {
|
|
|
521
522
|
intentId: t.pendingId
|
|
522
523
|
};
|
|
523
524
|
}
|
|
524
|
-
return
|
|
525
|
-
},
|
|
525
|
+
return st(e, r, 0, n, n);
|
|
526
|
+
}, ct = class extends Error {
|
|
526
527
|
reason;
|
|
527
528
|
constructor(e) {
|
|
528
529
|
super(`Workflow failure delivery requires reconciliation: ${e}`), this.reason = e;
|
|
529
530
|
}
|
|
530
|
-
},
|
|
531
|
+
}, lt = async (e, t, n) => {
|
|
531
532
|
let r = await B(e, t, n);
|
|
532
533
|
if (r.kind === "unconfigured") return r;
|
|
533
|
-
let i = await
|
|
534
|
+
let i = await ot(e, t), a = await jt(e, r.receiptId);
|
|
534
535
|
if (a === void 0) throw Error("Failure handoff receipt disappeared during reconciliation");
|
|
535
536
|
if (i.acceptedExecutionId !== null) {
|
|
536
537
|
if (a.terminal !== null || a.submissionId === null) throw Error("Accepted failure report has no submitted receipt");
|
|
@@ -546,8 +547,8 @@ var Se = re.layerMemory, Ce = F("_voltro_workflow_runs", {
|
|
|
546
547
|
};
|
|
547
548
|
let r = await z(e, t);
|
|
548
549
|
if (r === void 0) throw Error("Failure report disappeared during retry");
|
|
549
|
-
let o = i.handoffAttempt + 1, s = Math.max(
|
|
550
|
-
return
|
|
550
|
+
let o = i.handoffAttempt + 1, s = Math.max(tn(o, () => 1), a.terminal.kind === "dropped" ? a.terminal.retryAfterMs : 0);
|
|
551
|
+
return st(e, r, o, Math.max(n, a.terminal.at + s), n);
|
|
551
552
|
}
|
|
552
553
|
if (a.submissionId === null) {
|
|
553
554
|
let t = (await e.query({
|
|
@@ -558,20 +559,20 @@ var Se = re.layerMemory, Ce = F("_voltro_workflow_runs", {
|
|
|
558
559
|
skip: void 0,
|
|
559
560
|
projection: void 0
|
|
560
561
|
}))[0];
|
|
561
|
-
if (t === void 0) throw new
|
|
562
|
-
if (t.workflowName !== a.workflowName || t.tenantId !== a.tenantId) throw new
|
|
563
|
-
if (t.deadLetteredAt !== null) throw new
|
|
562
|
+
if (t === void 0) throw new ct("arrival-missing");
|
|
563
|
+
if (t.workflowName !== a.workflowName || t.tenantId !== a.tenantId) throw new ct("arrival-owner-mismatch");
|
|
564
|
+
if (t.deadLetteredAt !== null) throw new ct("arrival-dead-lettered");
|
|
564
565
|
return r;
|
|
565
566
|
}
|
|
566
567
|
let o = await V(e, a.submissionId);
|
|
567
568
|
if (o === void 0 || !o.receiptsBound || o.workflowName !== a.workflowName || o.tenantId !== a.tenantId || !o.intentIds.includes(a.pendingId)) throw Error("Failure handoff receipt has no matching admission submission");
|
|
568
569
|
if (o.failureId !== null) {
|
|
569
570
|
let r = await z(e, o.failureId);
|
|
570
|
-
if (o.executionId !== null || o.dispatchAttempts > 1 || r === void 0 || r.sourceKind !== "submission" || r.sourceId !== o.id || r.workflowName !== o.workflowName || r.tenantId !== o.tenantId || r.report.executionId !== null || r.report.runId !== null) throw new
|
|
571
|
+
if (o.executionId !== null || o.dispatchAttempts > 1 || r === void 0 || r.sourceKind !== "submission" || r.sourceId !== o.id || r.workflowName !== o.workflowName || r.tenantId !== o.tenantId || r.report.executionId !== null || r.report.runId !== null) throw new ct("rejection-proof-invalid");
|
|
571
572
|
let a = await z(e, t);
|
|
572
573
|
if (a === void 0) throw Error("Failure report disappeared during rejected handler retry");
|
|
573
574
|
let s = i.handoffAttempt + 1;
|
|
574
|
-
return
|
|
575
|
+
return st(e, a, s, Math.max(n, r.report.failedAt + tn(s, () => 1)), n);
|
|
575
576
|
}
|
|
576
577
|
if (o.executionId === null) return r;
|
|
577
578
|
if (o.failureId !== null || o.executionId.length === 0 || o.preparedExecutionId !== o.executionId) throw Error("Failure handler acknowledgement contradicts its prepared submission");
|
|
@@ -580,14 +581,14 @@ var Se = re.layerMemory, Ce = F("_voltro_workflow_runs", {
|
|
|
580
581
|
kind: "accepted",
|
|
581
582
|
executionId: o.executionId
|
|
582
583
|
};
|
|
583
|
-
},
|
|
584
|
+
}, ut = w.Struct({
|
|
584
585
|
runId: w.NonEmptyString,
|
|
585
586
|
workflowName: w.NonEmptyString,
|
|
586
587
|
executionId: w.NonEmptyString,
|
|
587
588
|
generation: w.NonEmptyString,
|
|
588
589
|
parentStatus: w.Literal("succeeded", "failed", "cancelled"),
|
|
589
590
|
closedAt: w.DateFromSelf
|
|
590
|
-
}),
|
|
591
|
+
}), dt = async (e, t, n) => {
|
|
591
592
|
let [r] = await e.query({
|
|
592
593
|
table: "_voltro_workflow_runs",
|
|
593
594
|
predicate: O("executionId", n),
|
|
@@ -627,14 +628,14 @@ var Se = re.layerMemory, Ce = F("_voltro_workflow_runs", {
|
|
|
627
628
|
projection: void 0
|
|
628
629
|
});
|
|
629
630
|
if (i === void 0) return;
|
|
630
|
-
let a = w.decodeUnknownSync(
|
|
631
|
+
let a = w.decodeUnknownSync(ut)(i);
|
|
631
632
|
if (a.workflowName !== t || a.executionId !== n) throw Error("Admission acknowledgement belongs to a different resident workflow");
|
|
632
633
|
if (!Number.isFinite(a.closedAt.getTime())) throw Error("Workflow closure has no valid completion timestamp");
|
|
633
634
|
return {
|
|
634
635
|
runId: a.runId,
|
|
635
636
|
completedAt: a.closedAt
|
|
636
637
|
};
|
|
637
|
-
},
|
|
638
|
+
}, ft = "_voltro_workflow_submissions", pt = w.Struct({
|
|
638
639
|
id: w.String,
|
|
639
640
|
workflowName: w.String,
|
|
640
641
|
tenantId: w.NullOr(w.String),
|
|
@@ -658,12 +659,12 @@ var Se = re.layerMemory, Ce = F("_voltro_workflow_runs", {
|
|
|
658
659
|
executionId: w.String,
|
|
659
660
|
runId: w.String
|
|
660
661
|
}))
|
|
661
|
-
}),
|
|
662
|
-
async function*
|
|
662
|
+
}), mt = w.decodeUnknownSync(pt);
|
|
663
|
+
async function* ht(e, t, n) {
|
|
663
664
|
let r;
|
|
664
665
|
for (;;) {
|
|
665
666
|
let i = D(O("preparedExecutionId", t), A("dispatchAttempts", 0)), a = await e.query({
|
|
666
|
-
table:
|
|
667
|
+
table: ft,
|
|
667
668
|
predicate: r === void 0 ? i : D(i, A("id", r)),
|
|
668
669
|
order: [{
|
|
669
670
|
column: "id",
|
|
@@ -675,16 +676,16 @@ async function* mt(e, t, n) {
|
|
|
675
676
|
});
|
|
676
677
|
if (a.length === 0) return;
|
|
677
678
|
for (let e of a) {
|
|
678
|
-
let i =
|
|
679
|
+
let i = mt(e);
|
|
679
680
|
if (i.workflowName !== n || !i.receiptsBound || i.failureId !== null || i.executionId !== null && i.executionId !== t) throw Error("Workflow completion has an inconsistent resident submission owner");
|
|
680
681
|
yield i, r = i.id;
|
|
681
682
|
}
|
|
682
683
|
}
|
|
683
684
|
}
|
|
684
|
-
var
|
|
685
|
+
var gt = async (e, t, n) => (await _t(e, t, n)).map((e) => mt(e)), _t = async (e, t, n) => {
|
|
685
686
|
if (!Number.isSafeInteger(t) || t < 1) throw Error("Submission recovery requires a positive page size");
|
|
686
687
|
return e.query({
|
|
687
|
-
table:
|
|
688
|
+
table: ft,
|
|
688
689
|
predicate: n === void 0 ? D(O("receiptsBound", !0), N("executionId"), N("failureId")) : D(O("receiptsBound", !0), N("executionId"), N("failureId"), A("id", n)),
|
|
689
690
|
order: [{
|
|
690
691
|
column: "id",
|
|
@@ -696,18 +697,18 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
696
697
|
});
|
|
697
698
|
}, V = async (e, t) => {
|
|
698
699
|
let n = await e.query({
|
|
699
|
-
table:
|
|
700
|
+
table: ft,
|
|
700
701
|
predicate: O("id", t),
|
|
701
702
|
order: [],
|
|
702
703
|
take: 1,
|
|
703
704
|
skip: void 0,
|
|
704
705
|
projection: void 0
|
|
705
706
|
});
|
|
706
|
-
return n[0] === void 0 ? void 0 : w.decodeUnknownSync(
|
|
707
|
-
},
|
|
707
|
+
return n[0] === void 0 ? void 0 : w.decodeUnknownSync(pt)(n[0]);
|
|
708
|
+
}, vt = async (e, t) => ze(e, (e) => yt(e, t)), yt = async (e, t) => {
|
|
708
709
|
if (t.id.length === 0) throw Error("Admission submission requires a stable non-empty identity");
|
|
709
710
|
let n = await e.query({
|
|
710
|
-
table:
|
|
711
|
+
table: ft,
|
|
711
712
|
predicate: O("id", t.id),
|
|
712
713
|
order: [],
|
|
713
714
|
take: 1,
|
|
@@ -715,15 +716,17 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
715
716
|
projection: void 0
|
|
716
717
|
});
|
|
717
718
|
if (n[0] !== void 0) {
|
|
718
|
-
let e = w.decodeUnknownSync(
|
|
719
|
+
let e = w.decodeUnknownSync(pt)(n[0]);
|
|
719
720
|
if (e.workflowName !== t.control.workflowName || e.tenantId !== t.tenantId) throw Error("Admission submission identity belongs to a different workflow or tenant");
|
|
721
|
+
let r = JSON.parse(JSON.stringify(e.payload) ?? "null"), i = JSON.parse(JSON.stringify(t.encodedPayload) ?? "null");
|
|
722
|
+
if (!xe(r, i)) throw Error("Admission submission identity is already bound to a different payload");
|
|
720
723
|
return {
|
|
721
724
|
kind: "reserved",
|
|
722
725
|
submission: e,
|
|
723
726
|
reused: !0
|
|
724
727
|
};
|
|
725
728
|
}
|
|
726
|
-
let r =
|
|
729
|
+
let r = Ue(t.control, t.keyPayload), i = await on({
|
|
727
730
|
store: e,
|
|
728
731
|
control: t.control,
|
|
729
732
|
keys: r,
|
|
@@ -752,7 +755,7 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
752
755
|
if (a === void 0) throw Error("Admission reservation has no ledger identity");
|
|
753
756
|
return {
|
|
754
757
|
kind: "reserved",
|
|
755
|
-
submission: await
|
|
758
|
+
submission: await bt(e, {
|
|
756
759
|
id: t.id,
|
|
757
760
|
workflowName: t.control.workflowName,
|
|
758
761
|
tenantId: t.tenantId,
|
|
@@ -764,7 +767,7 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
764
767
|
}),
|
|
765
768
|
reused: !1
|
|
766
769
|
};
|
|
767
|
-
},
|
|
770
|
+
}, bt = async (e, t) => {
|
|
768
771
|
if (t.id.length === 0 || t.ledgerId.length === 0) throw Error("Submission requires its reserved admission identity");
|
|
769
772
|
let n = {
|
|
770
773
|
...t,
|
|
@@ -783,11 +786,11 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
783
786
|
stoppedAt: null
|
|
784
787
|
}
|
|
785
788
|
};
|
|
786
|
-
return await e.insert(
|
|
787
|
-
},
|
|
789
|
+
return await e.insert(ft, n), n;
|
|
790
|
+
}, xt = async (e, t, n) => ze(e, (e) => St(e, t, n)), St = async (e, t, n) => {
|
|
788
791
|
if (n.executionId.length === 0) throw Error("Engine acknowledgement requires an execution identity");
|
|
789
792
|
let r = await e.query({
|
|
790
|
-
table:
|
|
793
|
+
table: ft,
|
|
791
794
|
predicate: O("id", t),
|
|
792
795
|
order: [],
|
|
793
796
|
take: 1,
|
|
@@ -795,11 +798,11 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
795
798
|
projection: void 0
|
|
796
799
|
});
|
|
797
800
|
if (r[0] === void 0) throw Error("Cannot acknowledge an unknown admission submission");
|
|
798
|
-
let i = w.decodeUnknownSync(
|
|
801
|
+
let i = w.decodeUnknownSync(pt)(r[0]);
|
|
799
802
|
if (i.failureId !== null) throw Error("Cannot acknowledge a permanently rejected admission submission");
|
|
800
803
|
if (i.preparedExecutionId !== null && i.preparedExecutionId !== n.executionId) throw Error("Engine acknowledgement contradicts the prepared execution identity");
|
|
801
804
|
if (i.executionId !== null && i.executionId !== n.executionId || i.runId !== null && n.runId !== null && i.runId !== n.runId) throw Error("Admission submission already belongs to a different execution or run");
|
|
802
|
-
let a = await
|
|
805
|
+
let a = await dt(e, i.workflowName, n.executionId), o = i.runId ?? n.runId;
|
|
803
806
|
if (a !== void 0 && o !== null && a.runId !== o) throw Error("Admission acknowledgement belongs to a different resident run");
|
|
804
807
|
let s = {
|
|
805
808
|
executionId: n.executionId,
|
|
@@ -814,7 +817,7 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
814
817
|
...i,
|
|
815
818
|
...s
|
|
816
819
|
};
|
|
817
|
-
},
|
|
820
|
+
}, Ct = async (e, t, n) => {
|
|
818
821
|
if (n.length === 0) throw Error("Prepared submission requires a non-empty execution identity");
|
|
819
822
|
let r = await V(e, t);
|
|
820
823
|
if (r === void 0) throw Error("Cannot prepare an unknown admission submission");
|
|
@@ -831,7 +834,7 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
831
834
|
...r,
|
|
832
835
|
preparedExecutionId: n
|
|
833
836
|
};
|
|
834
|
-
},
|
|
837
|
+
}, wt = async (e, t, n, r, i = !1) => {
|
|
835
838
|
if (i !== !1 && (!Number.isSafeInteger(i) || i < 1)) throw Error("Submission retry limit must be a positive integer or false");
|
|
836
839
|
let a = await V(e, t);
|
|
837
840
|
if (a === void 0) throw Error("Cannot record failure for an unknown submission");
|
|
@@ -839,7 +842,7 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
839
842
|
let o = a.retry.attempts + 1, s = {
|
|
840
843
|
attempts: o,
|
|
841
844
|
lastError: n,
|
|
842
|
-
after: r +
|
|
845
|
+
after: r + tn(o),
|
|
843
846
|
stoppedAt: i !== !1 && o >= i ? r : null
|
|
844
847
|
};
|
|
845
848
|
if (await e.update("_voltro_workflow_submissions", t, { retry: s }) === null) throw Error("Admission submission disappeared while recording failure");
|
|
@@ -847,7 +850,7 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
847
850
|
...a,
|
|
848
851
|
retry: s
|
|
849
852
|
};
|
|
850
|
-
},
|
|
853
|
+
}, Tt = async (e, t, n) => {
|
|
851
854
|
let r = await V(e, t);
|
|
852
855
|
if (r === void 0) throw Error("Cannot dispatch an unknown admission submission");
|
|
853
856
|
if (!r.receiptsBound || r.executionId !== null || r.failureId !== null || r.retry.stoppedAt !== null || r.retry.after > n) return null;
|
|
@@ -858,7 +861,7 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
858
861
|
...r,
|
|
859
862
|
dispatchAttempts: i
|
|
860
863
|
};
|
|
861
|
-
},
|
|
864
|
+
}, Et = async (e, t, n, r) => {
|
|
862
865
|
if (!Number.isSafeInteger(n) || n < 0) throw Error("Invalid submission dispatch attempt");
|
|
863
866
|
let i = await V(e, t);
|
|
864
867
|
if (i === void 0) throw Error("Cannot reject an unknown admission submission");
|
|
@@ -868,13 +871,13 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
868
871
|
return await B(e, n.id, r.now), n;
|
|
869
872
|
}
|
|
870
873
|
if (!i.receiptsBound || i.executionId !== null || i.dispatchAttempts !== n || n > 1) return;
|
|
871
|
-
let a = `wffr_${be("sha256").update(JSON.stringify(["submission", t])).digest("hex").slice(0, 40)}`, o = await
|
|
874
|
+
let a = `wffr_${be("sha256").update(JSON.stringify(["submission", t])).digest("hex").slice(0, 40)}`, o = await $e(e, {
|
|
872
875
|
id: a,
|
|
873
876
|
sourceKind: "submission",
|
|
874
877
|
sourceId: t,
|
|
875
878
|
workflowName: i.workflowName,
|
|
876
879
|
tenantId: i.tenantId,
|
|
877
|
-
handler: await
|
|
880
|
+
handler: await tt(e, t) ? null : r.handler,
|
|
878
881
|
callerContext: i.callerContext,
|
|
879
882
|
report: {
|
|
880
883
|
workflow: i.workflowName,
|
|
@@ -890,30 +893,30 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
890
893
|
if (await e.update("_voltro_workflow_admissions", i.ledgerId, { releasedAt: new Date(r.now) }) === null) throw Error("Rejected admission submission has no lease");
|
|
891
894
|
if (await e.update("_voltro_workflow_submissions", t, { failureId: a }) === null) throw Error("Admission submission disappeared during rejection");
|
|
892
895
|
return await B(e, o.id, r.now), o;
|
|
893
|
-
},
|
|
896
|
+
}, Dt = async (e, t) => {
|
|
894
897
|
if (t.failureId === null) throw Error("Workflow submission has no rejection marker");
|
|
895
898
|
let n = await z(e, t.failureId);
|
|
896
899
|
if (t.executionId !== null || t.dispatchAttempts > 1 || n === void 0 || n.sourceKind !== "submission" || n.sourceId !== t.id || n.workflowName !== t.workflowName || n.tenantId !== t.tenantId || n.report.executionId !== null || n.report.runId !== null) throw Error("Workflow start rejection has contradictory ownership or execution evidence");
|
|
897
900
|
return n.id;
|
|
898
|
-
},
|
|
901
|
+
}, Ot = "_voltro_workflow_start_receipts", kt = w.Struct({
|
|
899
902
|
id: w.String,
|
|
900
903
|
workflowName: w.String,
|
|
901
904
|
tenantId: w.NullOr(w.String),
|
|
902
905
|
pendingId: w.String,
|
|
903
906
|
submissionId: w.NullOr(w.String),
|
|
904
907
|
terminal: w.NullOr(E)
|
|
905
|
-
}).pipe(w.filter((e) => e.submissionId === null || e.terminal === null, { message: () => "A start receipt cannot be both submitted and terminal before admission" })),
|
|
908
|
+
}).pipe(w.filter((e) => e.submissionId === null || e.terminal === null, { message: () => "A start receipt cannot be both submitted and terminal before admission" })), At = w.decodeUnknownSync(kt), jt = async (e, t) => {
|
|
906
909
|
let n = await e.query({
|
|
907
|
-
table:
|
|
910
|
+
table: Ot,
|
|
908
911
|
predicate: O("id", t),
|
|
909
912
|
order: [],
|
|
910
913
|
take: 1,
|
|
911
914
|
skip: void 0,
|
|
912
915
|
projection: void 0
|
|
913
916
|
});
|
|
914
|
-
return n[0] === void 0 ? void 0 :
|
|
915
|
-
},
|
|
916
|
-
let n = await
|
|
917
|
+
return n[0] === void 0 ? void 0 : At(n[0]);
|
|
918
|
+
}, Mt = async (e, t) => {
|
|
919
|
+
let n = await jt(e, t.receiptId);
|
|
917
920
|
if (n === void 0 || n.workflowName !== t.workflowName || n.tenantId !== t.tenantId) throw Error("Workflow start receipt is missing or belongs to another workflow or tenant");
|
|
918
921
|
if (n.terminal !== null) {
|
|
919
922
|
if (n.terminal.kind === "abandoned") {
|
|
@@ -944,7 +947,7 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
944
947
|
if (r === void 0 || !r.receiptsBound || r.workflowName !== n.workflowName || r.tenantId !== n.tenantId || !r.intentIds.includes(n.pendingId)) throw Error("Workflow receipt has no matching admission submission");
|
|
945
948
|
if (r.failureId !== null) return {
|
|
946
949
|
kind: "rejected",
|
|
947
|
-
failureId: await
|
|
950
|
+
failureId: await Dt(e, r)
|
|
948
951
|
};
|
|
949
952
|
if (r.executionId === null) {
|
|
950
953
|
if (r.retry.stoppedAt !== null) throw Error("Workflow start acceptance is unresolved; reconciliation required");
|
|
@@ -955,23 +958,23 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
955
958
|
kind: "accepted",
|
|
956
959
|
executionId: r.executionId
|
|
957
960
|
};
|
|
958
|
-
},
|
|
961
|
+
}, Nt = async (e, t) => {
|
|
959
962
|
if (t.id.length === 0 || t.id === t.pendingId) throw Error("Workflow start receipt requires an identity distinct from its queue slot");
|
|
960
|
-
let n =
|
|
963
|
+
let n = At((await e.insertIgnoreWithOutcome(Ot, {
|
|
961
964
|
...t,
|
|
962
965
|
submissionId: null,
|
|
963
966
|
terminal: null
|
|
964
967
|
}, { conflictColumns: ["id"] })).row);
|
|
965
968
|
if (n.workflowName !== t.workflowName || n.tenantId !== t.tenantId || n.pendingId !== t.pendingId) throw Error("Workflow start receipt identity belongs to a different start");
|
|
966
969
|
return n;
|
|
967
|
-
},
|
|
970
|
+
}, Pt = async (e, t) => {
|
|
968
971
|
let n = await V(e, t);
|
|
969
972
|
if (n === void 0) throw Error("Cannot bind receipts to an unknown admission submission");
|
|
970
973
|
if (n.receiptsBound) return 0;
|
|
971
974
|
let r = 0;
|
|
972
975
|
for (let t of new Set(n.intentIds)) for (;;) {
|
|
973
976
|
let i = await e.query({
|
|
974
|
-
table:
|
|
977
|
+
table: Ot,
|
|
975
978
|
predicate: D(O("pendingId", t), N("submissionId"), N("terminal")),
|
|
976
979
|
order: [{
|
|
977
980
|
column: "id",
|
|
@@ -983,7 +986,7 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
983
986
|
});
|
|
984
987
|
if (i.length === 0) break;
|
|
985
988
|
for (let t of i) {
|
|
986
|
-
let i =
|
|
989
|
+
let i = At(t);
|
|
987
990
|
if (i.workflowName !== n.workflowName || i.tenantId !== n.tenantId) throw Error("Pending receipt belongs to a different workflow or tenant");
|
|
988
991
|
if (await e.update("_voltro_workflow_start_receipts", i.id, { submissionId: n.id }) === null) throw Error("Workflow start receipt disappeared during queue transfer");
|
|
989
992
|
r++;
|
|
@@ -995,7 +998,7 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
995
998
|
let n = w.decodeUnknownSync(E)(t.terminal);
|
|
996
999
|
for (;;) {
|
|
997
1000
|
let r = await e.query({
|
|
998
|
-
table:
|
|
1001
|
+
table: Ot,
|
|
999
1002
|
predicate: D(O("pendingId", t.pendingId), N("submissionId"), N("terminal")),
|
|
1000
1003
|
order: [{
|
|
1001
1004
|
column: "id",
|
|
@@ -1007,17 +1010,17 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
1007
1010
|
});
|
|
1008
1011
|
if (r.length === 0) return;
|
|
1009
1012
|
for (let i of r) {
|
|
1010
|
-
let r =
|
|
1013
|
+
let r = At(i);
|
|
1011
1014
|
if (r.workflowName !== t.workflowName || r.tenantId !== t.tenantId) throw Error("Terminal receipt belongs to a different workflow or tenant");
|
|
1012
1015
|
if (await e.update("_voltro_workflow_start_receipts", r.id, { terminal: n }) === null) throw Error("Start receipt disappeared while recording its terminal outcome");
|
|
1013
1016
|
}
|
|
1014
1017
|
}
|
|
1015
|
-
}, U = "_voltro_workflow_pending", W = "_voltro_workflow_admissions",
|
|
1018
|
+
}, U = "_voltro_workflow_pending", W = "_voltro_workflow_admissions", Ft = "_voltro_workflow_pauses", It = (e, t, n) => e.encodeWorkflowPayload === void 0 ? n : e.encodeWorkflowPayload(t, n), G = (e, t, n) => e.decodeWorkflowPayload === void 0 ? n : e.decodeWorkflowPayload(t, n), Lt = 864e5, Rt = (e, t, n) => `wfp_${be("sha256").update(`${e}\u0000${t}\u0000${n}`).digest("hex").slice(0, 40)}`, K = (e) => {
|
|
1016
1019
|
if (e instanceof Date) return e.getTime();
|
|
1017
1020
|
if (typeof e == "number") return e;
|
|
1018
1021
|
let t = Date.parse(String(e));
|
|
1019
1022
|
return Number.isNaN(t) ? 0 : t;
|
|
1020
|
-
},
|
|
1023
|
+
}, zt = (e, t) => {
|
|
1021
1024
|
let n = typeof e == "number" ? e : Number(e);
|
|
1022
1025
|
return Number.isFinite(n) ? Math.trunc(n) : t;
|
|
1023
1026
|
}, q = (e) => ({
|
|
@@ -1030,12 +1033,12 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
1030
1033
|
callerContext: e.callerContext ?? null,
|
|
1031
1034
|
queuedAppVersion: e.queuedAppVersion === null || e.queuedAppVersion === void 0 ? null : String(e.queuedAppVersion),
|
|
1032
1035
|
queuedSchemaFingerprint: e.queuedSchemaFingerprint === null || e.queuedSchemaFingerprint === void 0 ? null : String(e.queuedSchemaFingerprint),
|
|
1033
|
-
priority:
|
|
1036
|
+
priority: zt(e.priority, 0),
|
|
1034
1037
|
dueAt: K(e.dueAt),
|
|
1035
1038
|
deadlineAt: e.deadlineAt === null || e.deadlineAt === void 0 ? void 0 : K(e.deadlineAt),
|
|
1036
|
-
collapsed:
|
|
1039
|
+
collapsed: zt(e.collapsed, 1),
|
|
1037
1040
|
firstSeenAt: K(e.firstSeenAt),
|
|
1038
|
-
attempts:
|
|
1041
|
+
attempts: zt(e.attempts, 0),
|
|
1039
1042
|
lastError: e.lastError === null || e.lastError === void 0 ? null : String(e.lastError),
|
|
1040
1043
|
deadLetteredAt: e.deadLetteredAt === null || e.deadLetteredAt === void 0 ? void 0 : K(e.deadLetteredAt)
|
|
1041
1044
|
}), J = (e, t, n, r) => ({
|
|
@@ -1045,11 +1048,11 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
1045
1048
|
take: r,
|
|
1046
1049
|
skip: void 0,
|
|
1047
1050
|
projection: void 0
|
|
1048
|
-
}),
|
|
1049
|
-
let t = await e.query(J(
|
|
1051
|
+
}), Bt = async (e) => {
|
|
1052
|
+
let t = await e.query(J(Ft, void 0, [], 1e3));
|
|
1050
1053
|
return new Set(t.map((e) => String(e.id)));
|
|
1051
|
-
},
|
|
1052
|
-
await e.upsert(
|
|
1054
|
+
}, Vt = async (e, t, n, r) => {
|
|
1055
|
+
await e.upsert(Ft, {
|
|
1053
1056
|
id: t,
|
|
1054
1057
|
pausedAt: /* @__PURE__ */ new Date(),
|
|
1055
1058
|
pausedBy: n,
|
|
@@ -1062,7 +1065,7 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
1062
1065
|
"reason"
|
|
1063
1066
|
]
|
|
1064
1067
|
});
|
|
1065
|
-
},
|
|
1068
|
+
}, Ht = async (e, t) => e.delete(Ft, t), Ut = async (e) => {
|
|
1066
1069
|
let { store: t, control: n, keys: r, now: i } = e, a = { paused: e.paused }, o = [];
|
|
1067
1070
|
n.debounce !== void 0 && r.debounceKey !== void 0 && o.push((async () => {
|
|
1068
1071
|
let e = (await t.query(J(U, D(O("workflowName", n.workflowName), O("controlKey", r.debounceKey), O("mode", "debounce")), [], 1)))[0];
|
|
@@ -1070,7 +1073,7 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
1070
1073
|
let i = e.deadlineAt === null || e.deadlineAt === void 0 ? void 0 : K(e.deadlineAt);
|
|
1071
1074
|
a.debouncePending = {
|
|
1072
1075
|
firstSeenAt: K(e.firstSeenAt),
|
|
1073
|
-
collapsed:
|
|
1076
|
+
collapsed: zt(e.collapsed, 1),
|
|
1074
1077
|
...i === void 0 ? {} : { deadlineAt: i }
|
|
1075
1078
|
};
|
|
1076
1079
|
})()), n.batch !== void 0 && r.batchKey !== void 0 && o.push((async () => {
|
|
@@ -1083,7 +1086,7 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
1083
1086
|
firstSeenAt: K(e[0].firstSeenAt)
|
|
1084
1087
|
});
|
|
1085
1088
|
})()), n.singleton !== void 0 && r.singletonKey !== void 0 && o.push((async () => {
|
|
1086
|
-
let e = await
|
|
1089
|
+
let e = await Wt(t, n.workflowName, r.singletonKey, i);
|
|
1087
1090
|
e === "unacknowledged" ? a.singletonUnacknowledged = !0 : e !== void 0 && (a.singletonHolder = e);
|
|
1088
1091
|
})()), n.concurrency !== void 0 && r.concurrencyKey !== void 0 && o.push((async () => {
|
|
1089
1092
|
let e = n.concurrency.pool === void 0 ? [O("workflowName", n.workflowName)] : [], o = await t.query(J(W, D(...e, O("concurrencyKey", r.concurrencyKey), N("releasedAt"), he(N("executionId"), A("expiresAt", new Date(i)))), [], n.concurrency.limit));
|
|
@@ -1097,7 +1100,7 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
1097
1100
|
}], s.limit));
|
|
1098
1101
|
a.recentAdmissions = e.map((e) => K(e.admittedAt));
|
|
1099
1102
|
})()), await Promise.all(o), a;
|
|
1100
|
-
},
|
|
1103
|
+
}, Wt = async (e, t, n, r) => {
|
|
1101
1104
|
if ((await e.query(J("_voltro_workflow_admissions", D(O("workflowName", t), O("singletonKey", n), N("releasedAt"), N("executionId")), [], 1))).length > 0) return "unacknowledged";
|
|
1102
1105
|
let i = (await e.query(J(W, D(O("workflowName", t), O("singletonKey", n), N("releasedAt"), A("expiresAt", new Date(r))), [{
|
|
1103
1106
|
column: "admittedAt",
|
|
@@ -1110,17 +1113,17 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
1110
1113
|
runId: i.runId === null || i.runId === void 0 ? "" : String(i.runId),
|
|
1111
1114
|
admittedAt: K(i.admittedAt)
|
|
1112
1115
|
};
|
|
1113
|
-
},
|
|
1114
|
-
let { store: t, control: n, decision: r, now: i } = e, a =
|
|
1116
|
+
}, Gt = async (e) => {
|
|
1117
|
+
let { store: t, control: n, decision: r, now: i } = e, a = qt(r.mode, r.keys);
|
|
1115
1118
|
if (r.collapse === "hold") {
|
|
1116
|
-
let o = e.existingId ??
|
|
1119
|
+
let o = e.existingId ?? Rt(n.workflowName, r.mode, a);
|
|
1117
1120
|
return await t.update(U, o, {
|
|
1118
1121
|
dueAt: new Date(r.dueAt),
|
|
1119
1122
|
updatedAt: new Date(i)
|
|
1120
1123
|
}), o;
|
|
1121
1124
|
}
|
|
1122
1125
|
if (r.collapse === "replace") {
|
|
1123
|
-
let o =
|
|
1126
|
+
let o = Rt(n.workflowName, r.mode, a);
|
|
1124
1127
|
return await H(t, {
|
|
1125
1128
|
pendingId: o,
|
|
1126
1129
|
workflowName: n.workflowName,
|
|
@@ -1135,7 +1138,7 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
1135
1138
|
workflowName: n.workflowName,
|
|
1136
1139
|
controlKey: a,
|
|
1137
1140
|
mode: r.mode,
|
|
1138
|
-
payload:
|
|
1141
|
+
payload: It(t, n.workflowName, e.payload),
|
|
1139
1142
|
callerContext: e.callerContext ?? null,
|
|
1140
1143
|
queuedAppVersion: e.queuedAppVersion ?? null,
|
|
1141
1144
|
queuedSchemaFingerprint: e.queuedSchemaFingerprint ?? null,
|
|
@@ -1151,14 +1154,14 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
1151
1154
|
}, {
|
|
1152
1155
|
conflictColumns: ["id"],
|
|
1153
1156
|
update: (a) => ({
|
|
1154
|
-
payload:
|
|
1157
|
+
payload: It(t, n.workflowName, e.payload),
|
|
1155
1158
|
callerContext: e.callerContext ?? null,
|
|
1156
1159
|
queuedAppVersion: e.queuedAppVersion ?? null,
|
|
1157
1160
|
queuedSchemaFingerprint: e.queuedSchemaFingerprint ?? null,
|
|
1158
1161
|
priority: r.keys.priority,
|
|
1159
1162
|
dueAt: new Date(r.dueAt),
|
|
1160
1163
|
deadlineAt: r.deadlineAt === void 0 ? a.deadlineAt ?? null : new Date(r.deadlineAt),
|
|
1161
|
-
collapsed:
|
|
1164
|
+
collapsed: zt(a.collapsed, 1) + 1,
|
|
1162
1165
|
updatedAt: new Date(i),
|
|
1163
1166
|
attempts: 0,
|
|
1164
1167
|
lastError: null,
|
|
@@ -1172,7 +1175,7 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
1172
1175
|
workflowName: n.workflowName,
|
|
1173
1176
|
controlKey: a,
|
|
1174
1177
|
mode: r.mode,
|
|
1175
|
-
payload:
|
|
1178
|
+
payload: It(t, n.workflowName, e.payload),
|
|
1176
1179
|
callerContext: e.callerContext ?? null,
|
|
1177
1180
|
queuedAppVersion: e.queuedAppVersion ?? null,
|
|
1178
1181
|
queuedSchemaFingerprint: e.queuedSchemaFingerprint ?? null,
|
|
@@ -1187,14 +1190,14 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
1187
1190
|
deadLetteredAt: null
|
|
1188
1191
|
});
|
|
1189
1192
|
return String(o.id);
|
|
1190
|
-
},
|
|
1193
|
+
}, Kt = async (e) => {
|
|
1191
1194
|
let t = await e.store.insert(U, {
|
|
1192
1195
|
id: `wfpi_${R()}`,
|
|
1193
1196
|
tenantId: e.tenantId,
|
|
1194
1197
|
workflowName: e.workflowName,
|
|
1195
1198
|
controlKey: "",
|
|
1196
1199
|
mode: "delayed",
|
|
1197
|
-
payload:
|
|
1200
|
+
payload: It(e.store, e.workflowName, e.payload),
|
|
1198
1201
|
callerContext: e.callerContext ?? null,
|
|
1199
1202
|
queuedAppVersion: e.queuedAppVersion ?? null,
|
|
1200
1203
|
queuedSchemaFingerprint: e.queuedSchemaFingerprint ?? null,
|
|
@@ -1212,7 +1215,7 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
1212
1215
|
intentId: String(t.id),
|
|
1213
1216
|
dueAt: e.at
|
|
1214
1217
|
};
|
|
1215
|
-
},
|
|
1218
|
+
}, qt = (e, t) => {
|
|
1216
1219
|
switch (e) {
|
|
1217
1220
|
case "debounce": return t.debounceKey ?? "";
|
|
1218
1221
|
case "batch": return t.batchKey ?? "";
|
|
@@ -1246,7 +1249,7 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
1246
1249
|
releasedAt: e.outcome === "admitted" ? null : new Date(r)
|
|
1247
1250
|
});
|
|
1248
1251
|
return String(a.id);
|
|
1249
|
-
},
|
|
1252
|
+
}, Jt = async (e, t, n) => {
|
|
1250
1253
|
let r = !1;
|
|
1251
1254
|
for (;;) {
|
|
1252
1255
|
let i = await e.query(J(W, D(O("executionId", t), O("outcome", "admitted"), N("releasedAt")), [], 10));
|
|
@@ -1254,7 +1257,7 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
1254
1257
|
for (let t of i) if (await e.update("_voltro_workflow_admissions", String(t.id), { releasedAt: new Date(n) }) === null) throw Error("Admission lease disappeared during release");
|
|
1255
1258
|
r = !0;
|
|
1256
1259
|
}
|
|
1257
|
-
},
|
|
1260
|
+
}, Yt = async (e, t, n) => (await Xt(e, t, n)).due, Xt = async (e, t, n) => {
|
|
1258
1261
|
let r = (await e.query(J(U, N("deadLetteredAt"), [{
|
|
1259
1262
|
column: "priority",
|
|
1260
1263
|
direction: "desc"
|
|
@@ -1264,13 +1267,13 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
1264
1267
|
}], n))).map(q), i;
|
|
1265
1268
|
for (let e of r) e.dueAt <= t || (i === void 0 || e.dueAt < i) && (i = e.dueAt);
|
|
1266
1269
|
return {
|
|
1267
|
-
due: r.filter((e) => e.dueAt <= t).sort(
|
|
1270
|
+
due: r.filter((e) => e.dueAt <= t).sort(Xe),
|
|
1268
1271
|
nextDueAt: i
|
|
1269
1272
|
};
|
|
1270
|
-
},
|
|
1273
|
+
}, Zt = async (e, t) => (await e.query(J(U, void 0, [{
|
|
1271
1274
|
column: "firstSeenAt",
|
|
1272
1275
|
direction: "asc"
|
|
1273
|
-
}], t))).map(q),
|
|
1276
|
+
}], t))).map(q), Qt = async (e, t) => e.delete(U, t), $t = async (e, t, n, r) => ze(e, (e) => en(e, t, n, r)), en = async (e, t, n, r) => {
|
|
1274
1277
|
let i = (await e.query(J(U, O("id", t), [], 1)))[0];
|
|
1275
1278
|
if (i === void 0) return !1;
|
|
1276
1279
|
let a = q(i);
|
|
@@ -1301,23 +1304,23 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
1301
1304
|
}
|
|
1302
1305
|
}), !await e.delete("_voltro_workflow_pending", t)) throw Error("Pending intent disappeared during discard");
|
|
1303
1306
|
return !0;
|
|
1304
|
-
},
|
|
1307
|
+
}, tn = (e, t = Math.random) => {
|
|
1305
1308
|
let n = Math.min(1e3 * 2 ** Math.max(0, e - 1), 3e5);
|
|
1306
1309
|
return Math.round(n / 2 + t() * (n / 2));
|
|
1307
|
-
},
|
|
1310
|
+
}, nn = async (e, t, n, r) => {
|
|
1308
1311
|
let i = t.attempts + 1;
|
|
1309
1312
|
await e.update(U, t.id, {
|
|
1310
1313
|
attempts: i,
|
|
1311
1314
|
lastError: n.slice(0, 500),
|
|
1312
|
-
dueAt: new Date(r +
|
|
1315
|
+
dueAt: new Date(r + tn(i)),
|
|
1313
1316
|
updatedAt: new Date(r)
|
|
1314
1317
|
});
|
|
1315
|
-
},
|
|
1318
|
+
}, rn = async (e, t, n, r) => await e.update(U, t.id, {
|
|
1316
1319
|
attempts: t.attempts + 1,
|
|
1317
1320
|
lastError: n.slice(0, 500),
|
|
1318
1321
|
deadLetteredAt: new Date(r),
|
|
1319
1322
|
updatedAt: new Date(r)
|
|
1320
|
-
}) !== null,
|
|
1323
|
+
}) !== null, an = async (e, t, n) => {
|
|
1321
1324
|
let r = (await e.query(J(U, O("id", t), [], 1)))[0];
|
|
1322
1325
|
return r === void 0 || r.deadLetteredAt === null || r.deadLetteredAt === void 0 ? !1 : await e.update(U, t, {
|
|
1323
1326
|
attempts: 0,
|
|
@@ -1326,30 +1329,30 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
1326
1329
|
dueAt: new Date(n),
|
|
1327
1330
|
updatedAt: new Date(n)
|
|
1328
1331
|
}) !== null;
|
|
1329
|
-
},
|
|
1330
|
-
let t = await
|
|
1332
|
+
}, on = async (e) => {
|
|
1333
|
+
let t = await Ut({
|
|
1331
1334
|
store: e.store,
|
|
1332
1335
|
control: e.control,
|
|
1333
1336
|
keys: e.keys,
|
|
1334
1337
|
now: e.now,
|
|
1335
1338
|
paused: e.paused
|
|
1336
1339
|
});
|
|
1337
|
-
return
|
|
1340
|
+
return Ge({
|
|
1338
1341
|
control: e.control,
|
|
1339
1342
|
keys: e.keys,
|
|
1340
1343
|
state: t,
|
|
1341
1344
|
now: e.now,
|
|
1342
1345
|
reconsidering: e.reconsidering
|
|
1343
1346
|
});
|
|
1344
|
-
},
|
|
1347
|
+
}, sn = async (e, t, n = 1e3) => {
|
|
1345
1348
|
let r = await e.query(J(W, void 0, [{
|
|
1346
1349
|
column: "admittedAt",
|
|
1347
1350
|
direction: "asc"
|
|
1348
1351
|
}], n)), i = t.getTime(), a = r.filter((e) => e.releasedAt != null && K(e.admittedAt) < i);
|
|
1349
1352
|
return await Promise.all(a.map((t) => e.delete(W, String(t.id)))), a.length;
|
|
1350
|
-
},
|
|
1353
|
+
}, cn = async (e, t) => {
|
|
1351
1354
|
if (!Number.isFinite(t.now) || !Number.isFinite(new Date(t.now).getTime())) throw Error("Queued cancellation requires a valid timestamp");
|
|
1352
|
-
let n = await
|
|
1355
|
+
let n = await jt(e, t.receiptId);
|
|
1353
1356
|
if (n === void 0 || n.workflowName !== t.workflowName || n.tenantId !== t.tenantId) throw Error("Queued cancellation receipt is missing or belongs to another workflow or tenant");
|
|
1354
1357
|
if (n.terminal !== null) return {
|
|
1355
1358
|
kind: "terminal",
|
|
@@ -1389,7 +1392,7 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
1389
1392
|
kind: "terminal",
|
|
1390
1393
|
outcome: a
|
|
1391
1394
|
};
|
|
1392
|
-
},
|
|
1395
|
+
}, ln = "_voltro_workflow_parent_closures", X = w.NonEmptyString, un = w.Struct({
|
|
1393
1396
|
id: X,
|
|
1394
1397
|
runId: X,
|
|
1395
1398
|
workflowName: X,
|
|
@@ -1400,7 +1403,7 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
1400
1403
|
afterChildId: w.NullOr(X),
|
|
1401
1404
|
scanHasOpenChildren: w.Boolean,
|
|
1402
1405
|
completedAt: w.NullOr(w.DateFromSelf)
|
|
1403
|
-
}),
|
|
1406
|
+
}), dn = w.Struct({
|
|
1404
1407
|
id: X,
|
|
1405
1408
|
tag: X,
|
|
1406
1409
|
executionId: X,
|
|
@@ -1408,11 +1411,11 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
1408
1411
|
runnerGeneration: w.optional(w.NullOr(X)),
|
|
1409
1412
|
parentGeneration: w.optional(w.NullOr(X)),
|
|
1410
1413
|
parentClosePolicy: w.NullOr(w.Literal("cancel", "terminate", "abandon"))
|
|
1411
|
-
}),
|
|
1414
|
+
}), fn = async (e, t, n) => {
|
|
1412
1415
|
if (t.parentClosePolicy !== "cancel" && t.parentClosePolicy !== "terminate") return !1;
|
|
1413
1416
|
if (typeof t.parentExecutionId != "string" || t.parentExecutionId.length === 0 || typeof t.parentGeneration != "string" || t.parentGeneration.length === 0) throw Error("Child entry requires its original parent execution and generation");
|
|
1414
1417
|
let r = n ?? (await e.query({
|
|
1415
|
-
table:
|
|
1418
|
+
table: ln,
|
|
1416
1419
|
predicate: D(O("executionId", t.parentExecutionId), O("generation", t.parentGeneration)),
|
|
1417
1420
|
lock: "update",
|
|
1418
1421
|
order: [],
|
|
@@ -1421,9 +1424,9 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
1421
1424
|
projection: void 0
|
|
1422
1425
|
}))[0];
|
|
1423
1426
|
if (r === void 0) return !1;
|
|
1424
|
-
let i = w.decodeUnknownSync(
|
|
1427
|
+
let i = w.decodeUnknownSync(un)(r);
|
|
1425
1428
|
if (i.executionId !== t.parentExecutionId || i.generation !== t.parentGeneration) return !1;
|
|
1426
|
-
let a = w.decodeUnknownSync(
|
|
1429
|
+
let a = w.decodeUnknownSync(dn)(t), o = ue("wfctl", JSON.stringify([
|
|
1427
1430
|
"parent-close",
|
|
1428
1431
|
i.id,
|
|
1429
1432
|
a.id
|
|
@@ -1455,9 +1458,9 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
1455
1458
|
});
|
|
1456
1459
|
}
|
|
1457
1460
|
return !0;
|
|
1458
|
-
},
|
|
1461
|
+
}, pn = async (e, t, n = Date.now()) => {
|
|
1459
1462
|
let [r] = await e.query({
|
|
1460
|
-
table:
|
|
1463
|
+
table: ln,
|
|
1461
1464
|
predicate: O("id", t),
|
|
1462
1465
|
lock: "update",
|
|
1463
1466
|
order: [],
|
|
@@ -1466,7 +1469,7 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
1466
1469
|
projection: void 0
|
|
1467
1470
|
});
|
|
1468
1471
|
if (r === void 0) throw Error("Parent closure is missing");
|
|
1469
|
-
let i = w.decodeUnknownSync(
|
|
1472
|
+
let i = w.decodeUnknownSync(un)(r);
|
|
1470
1473
|
if (i.completedAt !== null) return {
|
|
1471
1474
|
scanned: 0,
|
|
1472
1475
|
controls: 0,
|
|
@@ -1486,10 +1489,10 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
1486
1489
|
projection: void 0
|
|
1487
1490
|
}), o = 0, s = i.scanHasOpenChildren, c = null;
|
|
1488
1491
|
for (let t of a) {
|
|
1489
|
-
let r = w.decodeUnknownSync(
|
|
1492
|
+
let r = w.decodeUnknownSync(dn)(t);
|
|
1490
1493
|
if (c = r.id, r.parentClosePolicy !== null && r.parentClosePolicy !== "abandon") {
|
|
1491
1494
|
if (r.parentGeneration === void 0 || r.parentGeneration === null) throw Error("Parent closure cannot attribute a child without its parent generation");
|
|
1492
|
-
r.parentGeneration === i.generation && ((r.status === "running" || r.status === "suspended") && (s = !0), await
|
|
1495
|
+
r.parentGeneration === i.generation && ((r.status === "running" || r.status === "suspended") && (s = !0), await fn(e, t, i) && (o++, r.status === "suspended" && typeof r.runnerGeneration == "string" && await Sn(e, {
|
|
1493
1496
|
runId: r.id,
|
|
1494
1497
|
workflowName: r.tag,
|
|
1495
1498
|
executionId: r.executionId,
|
|
@@ -1498,7 +1501,7 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
1498
1501
|
}
|
|
1499
1502
|
}
|
|
1500
1503
|
let l = a.length < 100, u = l && !s && !await _(e, i.id);
|
|
1501
|
-
if (await e.update(
|
|
1504
|
+
if (await e.update(ln, i.id, {
|
|
1502
1505
|
afterChildId: l ? null : c,
|
|
1503
1506
|
scanHasOpenChildren: !l && s,
|
|
1504
1507
|
completedAt: u ? new Date(n) : null
|
|
@@ -1508,7 +1511,7 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
1508
1511
|
controls: o,
|
|
1509
1512
|
wrapped: l
|
|
1510
1513
|
};
|
|
1511
|
-
},
|
|
1514
|
+
}, mn = F("_voltro_workflow_restart_requests", {
|
|
1512
1515
|
id: j({ prefix: "wfrs" }),
|
|
1513
1516
|
runId: I(),
|
|
1514
1517
|
workflowName: I(),
|
|
@@ -1523,10 +1526,10 @@ var ht = async (e, t, n) => (await gt(e, t, n)).map((e) => pt(e)), gt = async (e
|
|
|
1523
1526
|
requestedAt: L(),
|
|
1524
1527
|
dispatchAttempts: M().default(0),
|
|
1525
1528
|
enteredGeneration: I().nullable()
|
|
1526
|
-
}).unique(["runId", "generation"]).unique(["runId", "token"]).nonReactive(), Z = w.NonEmptyString,
|
|
1529
|
+
}).unique(["runId", "generation"]).unique(["runId", "token"]).nonReactive(), Z = w.NonEmptyString, hn = w.Struct({
|
|
1527
1530
|
requestId: Z,
|
|
1528
1531
|
restartToken: w.NullOr(Z)
|
|
1529
|
-
}),
|
|
1532
|
+
}), gn = w.Struct({
|
|
1530
1533
|
requestId: Z,
|
|
1531
1534
|
replyId: Z
|
|
1532
1535
|
});
|
|
@@ -1539,8 +1542,8 @@ w.Struct({
|
|
|
1539
1542
|
token: Z,
|
|
1540
1543
|
ledgerId: Z,
|
|
1541
1544
|
tenantId: w.NullOr(Z),
|
|
1542
|
-
delivery:
|
|
1543
|
-
replies: w.Array(
|
|
1545
|
+
delivery: hn,
|
|
1546
|
+
replies: w.Array(gn),
|
|
1544
1547
|
eviction: w.NullOr(w.Struct({
|
|
1545
1548
|
executionId: Z,
|
|
1546
1549
|
runId: w.String
|
|
@@ -1551,19 +1554,19 @@ w.Struct({
|
|
|
1551
1554
|
});
|
|
1552
1555
|
//#endregion
|
|
1553
1556
|
//#region src/runGeneration.ts
|
|
1554
|
-
var
|
|
1557
|
+
var _n = "_voltro_workflow_runs", vn = w.NullOr(w.Struct({
|
|
1555
1558
|
requestId: w.NonEmptyString,
|
|
1556
1559
|
restartToken: w.NullOr(w.NonEmptyString)
|
|
1557
|
-
})),
|
|
1560
|
+
})), yn = async (e, t, n, r) => {
|
|
1558
1561
|
if (typeof t.id != "string") throw Error("Child entry has no allocated run identity");
|
|
1559
1562
|
let i = {
|
|
1560
1563
|
runId: t.id,
|
|
1561
1564
|
workflowName: n.workflowName,
|
|
1562
1565
|
executionId: n.executionId,
|
|
1563
1566
|
generation: n.generation
|
|
1564
|
-
}, a = await
|
|
1567
|
+
}, a = await Ln(e, i), o = await fn(e, t);
|
|
1565
1568
|
if (!a && !o) return;
|
|
1566
|
-
let s = await
|
|
1569
|
+
let s = await wn(e, {
|
|
1567
1570
|
owner: i,
|
|
1568
1571
|
now: n.now,
|
|
1569
1572
|
durationMs: 0,
|
|
@@ -1576,21 +1579,21 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
1576
1579
|
previous: r,
|
|
1577
1580
|
terminalEvent: s.terminalEvent
|
|
1578
1581
|
};
|
|
1579
|
-
},
|
|
1582
|
+
}, bn = async (e, t) => {
|
|
1580
1583
|
if ([
|
|
1581
1584
|
t.workflowName,
|
|
1582
1585
|
t.executionId,
|
|
1583
1586
|
t.generation
|
|
1584
1587
|
].some((e) => e.length === 0) || typeof t.initialRow.id != "string" || t.initialRow.id.length === 0 || !Number.isFinite(t.now)) throw Error("Workflow entry requires allocated identities and a finite timestamp");
|
|
1585
1588
|
let n = (await e.query({
|
|
1586
|
-
table:
|
|
1589
|
+
table: _n,
|
|
1587
1590
|
predicate: O("executionId", t.executionId),
|
|
1588
1591
|
lock: "update",
|
|
1589
1592
|
order: [],
|
|
1590
1593
|
take: 1,
|
|
1591
1594
|
skip: void 0,
|
|
1592
1595
|
projection: void 0
|
|
1593
|
-
}))[0], r = w.decodeUnknownSync(
|
|
1596
|
+
}))[0], r = w.decodeUnknownSync(vn)(t.delivery ?? null), i = (r) => yn(e, r, t, n);
|
|
1594
1597
|
if (n === void 0) {
|
|
1595
1598
|
if (r !== null && r.restartToken !== null) throw Error("Workflow restart delivery has no resident authorization");
|
|
1596
1599
|
if ((await e.query({
|
|
@@ -1602,7 +1605,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
1602
1605
|
skip: void 0,
|
|
1603
1606
|
projection: ["id"]
|
|
1604
1607
|
})).length !== 0) throw Error("Workflow execution is already terminal; restore its engine journal instead of re-entering the body");
|
|
1605
|
-
let n = await e.insert(
|
|
1608
|
+
let n = await e.insert(_n, {
|
|
1606
1609
|
...t.initialRow,
|
|
1607
1610
|
tag: t.workflowName,
|
|
1608
1611
|
executionId: t.executionId,
|
|
@@ -1619,7 +1622,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
1619
1622
|
};
|
|
1620
1623
|
}
|
|
1621
1624
|
if (n.tag !== t.workflowName || typeof n.id != "string") throw Error("Workflow entry execution belongs to a different resident run");
|
|
1622
|
-
let a = w.decodeUnknownSync(
|
|
1625
|
+
let a = w.decodeUnknownSync(vn)(n.engineDelivery ?? null);
|
|
1623
1626
|
if (a?.requestId !== r?.requestId || a?.restartToken !== r?.restartToken) throw Error("Workflow delivery does not match its resident owner");
|
|
1624
1627
|
if (n.status === "cancelled") return {
|
|
1625
1628
|
kind: "already-cancelled",
|
|
@@ -1635,7 +1638,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
1635
1638
|
generation: n.runnerGeneration
|
|
1636
1639
|
};
|
|
1637
1640
|
if (await f(e, r)) {
|
|
1638
|
-
let i = await
|
|
1641
|
+
let i = await wn(e, {
|
|
1639
1642
|
owner: r,
|
|
1640
1643
|
now: t.now,
|
|
1641
1644
|
durationMs: 0,
|
|
@@ -1659,7 +1662,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
1659
1662
|
if (typeof s != "number" || !Number.isSafeInteger(s) || s < 0) throw Error("Workflow entry has an invalid resident reclaim counter");
|
|
1660
1663
|
let c = o ? s + 1 : 0;
|
|
1661
1664
|
if (!Number.isSafeInteger(c)) throw Error("Workflow reclaim counter exhausted");
|
|
1662
|
-
let l = await e.update(
|
|
1665
|
+
let l = await e.update(_n, n.id, {
|
|
1663
1666
|
runnerGeneration: t.generation,
|
|
1664
1667
|
runnerEnteredAt: new Date(t.now),
|
|
1665
1668
|
reclaimCount: c,
|
|
@@ -1681,7 +1684,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
1681
1684
|
row: l,
|
|
1682
1685
|
previous: n
|
|
1683
1686
|
}) : u;
|
|
1684
|
-
},
|
|
1687
|
+
}, xn = async (e, t) => {
|
|
1685
1688
|
if ([
|
|
1686
1689
|
t.runId,
|
|
1687
1690
|
t.workflowName,
|
|
@@ -1689,7 +1692,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
1689
1692
|
t.generation
|
|
1690
1693
|
].some((e) => e.length === 0)) throw Error("Workflow runner ownership requires non-empty identities");
|
|
1691
1694
|
let n = (await e.query({
|
|
1692
|
-
table:
|
|
1695
|
+
table: _n,
|
|
1693
1696
|
predicate: O("id", t.runId),
|
|
1694
1697
|
lock: "update",
|
|
1695
1698
|
order: [],
|
|
@@ -1699,21 +1702,21 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
1699
1702
|
}))[0];
|
|
1700
1703
|
if (n === void 0 || n.tag !== t.workflowName || n.executionId !== t.executionId) throw Error("Workflow runner ownership does not match its resident run");
|
|
1701
1704
|
return n;
|
|
1702
|
-
},
|
|
1703
|
-
let r = await
|
|
1705
|
+
}, Sn = async (e, t, n) => {
|
|
1706
|
+
let r = await xn(e, t);
|
|
1704
1707
|
if (r.runnerGeneration !== t.generation || r.status !== "suspended" || r.runnerEnteredAt !== null || !await f(e, t)) return !1;
|
|
1705
|
-
if ((await
|
|
1708
|
+
if ((await wn(e, {
|
|
1706
1709
|
owner: t,
|
|
1707
1710
|
now: n,
|
|
1708
1711
|
durationMs: 0,
|
|
1709
1712
|
outcome: { status: "cancelled" }
|
|
1710
1713
|
}, "suspended")).kind !== "committed") throw Error("Suspended cancellation lost its resident owner");
|
|
1711
1714
|
return !0;
|
|
1712
|
-
},
|
|
1713
|
-
let r = await
|
|
1715
|
+
}, Cn = async (e, t, n) => {
|
|
1716
|
+
let r = await xn(e, t);
|
|
1714
1717
|
if (r.runnerGeneration !== t.generation) return { kind: "superseded" };
|
|
1715
1718
|
if (r.status !== "running") return { kind: "not-running" };
|
|
1716
|
-
let i = await e.update(
|
|
1719
|
+
let i = await e.update(_n, t.runId, {
|
|
1717
1720
|
status: "suspended",
|
|
1718
1721
|
runnerEnteredAt: null,
|
|
1719
1722
|
errorTag: n.errorTag,
|
|
@@ -1724,8 +1727,8 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
1724
1727
|
kind: "committed",
|
|
1725
1728
|
row: i
|
|
1726
1729
|
};
|
|
1727
|
-
},
|
|
1728
|
-
let r = await
|
|
1730
|
+
}, wn = async (e, t, n) => {
|
|
1731
|
+
let r = await xn(e, t.owner);
|
|
1729
1732
|
if (r.runnerGeneration !== t.owner.generation) return { kind: "superseded" };
|
|
1730
1733
|
if (r.status !== n) return { kind: "not-running" };
|
|
1731
1734
|
if (!Number.isFinite(t.now) || !Number.isFinite(t.durationMs) || t.durationMs < 0) throw Error("Workflow completion requires finite time and non-negative duration");
|
|
@@ -1735,13 +1738,13 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
1735
1738
|
t.owner.workflowName,
|
|
1736
1739
|
t.owner.runId,
|
|
1737
1740
|
t.owner.generation
|
|
1738
|
-
])).digest("hex").slice(0, 40)}`, await
|
|
1741
|
+
])).digest("hex").slice(0, 40)}`, await $e(e, {
|
|
1739
1742
|
id: a,
|
|
1740
1743
|
sourceKind: "run",
|
|
1741
1744
|
sourceId: t.owner.runId,
|
|
1742
1745
|
workflowName: t.owner.workflowName,
|
|
1743
1746
|
tenantId: i.tenantId,
|
|
1744
|
-
handler: await
|
|
1747
|
+
handler: await rt(e, t.owner.executionId, t.owner.workflowName, i.tenantId) ? null : i.handler,
|
|
1745
1748
|
callerContext: i.callerContext,
|
|
1746
1749
|
report: {
|
|
1747
1750
|
workflow: t.owner.workflowName,
|
|
@@ -1768,13 +1771,13 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
1768
1771
|
t.owner.workflowName,
|
|
1769
1772
|
t.owner.runId,
|
|
1770
1773
|
t.owner.generation
|
|
1771
|
-
])).digest("hex").slice(0, 40)}`, await
|
|
1774
|
+
])).digest("hex").slice(0, 40)}`, await $e(e, {
|
|
1772
1775
|
id: a,
|
|
1773
1776
|
sourceKind: "run",
|
|
1774
1777
|
sourceId: t.owner.runId,
|
|
1775
1778
|
workflowName: t.owner.workflowName,
|
|
1776
1779
|
tenantId: o,
|
|
1777
|
-
handler: await
|
|
1780
|
+
handler: await rt(e, t.owner.executionId, t.owner.workflowName, o) ? null : n.cause.detail.onFailure,
|
|
1778
1781
|
callerContext: {
|
|
1779
1782
|
subject: r.subject ?? null,
|
|
1780
1783
|
traceId: r.traceId ?? null,
|
|
@@ -1796,7 +1799,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
1796
1799
|
}), await B(e, a, t.now);
|
|
1797
1800
|
}
|
|
1798
1801
|
}
|
|
1799
|
-
let o = await e.update(
|
|
1802
|
+
let o = await e.update(_n, t.owner.runId, {
|
|
1800
1803
|
status: i.status,
|
|
1801
1804
|
completedAt: new Date(t.now),
|
|
1802
1805
|
durationMs: t.durationMs,
|
|
@@ -1840,8 +1843,8 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
1840
1843
|
} : {}
|
|
1841
1844
|
}
|
|
1842
1845
|
});
|
|
1843
|
-
await l(e, t), await
|
|
1844
|
-
for await (let n of
|
|
1846
|
+
await l(e, t), await Jt(e, t.owner.executionId, t.now);
|
|
1847
|
+
for await (let n of ht(e, t.owner.executionId, t.owner.workflowName)) {
|
|
1845
1848
|
let [r] = await e.query({
|
|
1846
1849
|
table: W,
|
|
1847
1850
|
predicate: O("id", n.ledgerId),
|
|
@@ -1860,7 +1863,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
1860
1863
|
failureId: a,
|
|
1861
1864
|
terminalEvent: s
|
|
1862
1865
|
};
|
|
1863
|
-
},
|
|
1866
|
+
}, Tn = (e, t) => wn(e, t, "running"), En = F("_voltro_workflow_queued_cancellations", {
|
|
1864
1867
|
id: j({ prefix: "wfqc" }),
|
|
1865
1868
|
receiptId: I(),
|
|
1866
1869
|
workflowName: I(),
|
|
@@ -1869,19 +1872,19 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
1869
1872
|
cause: P().nullable(),
|
|
1870
1873
|
target: P(),
|
|
1871
1874
|
controlBinding: P().nullable()
|
|
1872
|
-
}).index(["receiptId"]).index(["workflowName", "id"]).nonReactive(),
|
|
1875
|
+
}).index(["receiptId"]).index(["workflowName", "id"]).nonReactive(), Dn = w.NullOr(w.Struct({
|
|
1873
1876
|
reason: w.NonEmptyString,
|
|
1874
1877
|
detail: w.optional(w.Record({
|
|
1875
1878
|
key: w.String,
|
|
1876
1879
|
value: w.Unknown
|
|
1877
1880
|
}))
|
|
1878
|
-
})),
|
|
1881
|
+
})), On = w.Struct({
|
|
1879
1882
|
id: w.NonEmptyString,
|
|
1880
1883
|
receiptId: w.NonEmptyString,
|
|
1881
1884
|
workflowName: w.NonEmptyString,
|
|
1882
1885
|
tenantId: w.NullOr(w.String),
|
|
1883
1886
|
requestedAt: w.DateFromSelf,
|
|
1884
|
-
cause:
|
|
1887
|
+
cause: Dn,
|
|
1885
1888
|
controlBinding: w.NullOr(w.Struct({
|
|
1886
1889
|
controlId: w.NonEmptyString,
|
|
1887
1890
|
runId: w.NonEmptyString,
|
|
@@ -1895,14 +1898,14 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
1895
1898
|
kind: w.Literal("terminal"),
|
|
1896
1899
|
receipt: w.Unknown
|
|
1897
1900
|
}))
|
|
1898
|
-
}),
|
|
1899
|
-
let t = w.decodeUnknownSync(
|
|
1901
|
+
}), kn = (e) => {
|
|
1902
|
+
let t = w.decodeUnknownSync(On)(e);
|
|
1900
1903
|
if (!Number.isFinite(t.requestedAt.getTime())) throw Error("Queued cancellation request has an invalid timestamp");
|
|
1901
1904
|
if (t.target.kind === "submission") return {
|
|
1902
1905
|
...t,
|
|
1903
1906
|
target: t.target
|
|
1904
1907
|
};
|
|
1905
|
-
let n =
|
|
1908
|
+
let n = At(t.target.receipt);
|
|
1906
1909
|
if (t.controlBinding !== null) throw Error("A non-executed start cannot have a run control binding");
|
|
1907
1910
|
if (n.id !== t.receiptId || n.workflowName !== t.workflowName || n.tenantId !== t.tenantId || n.terminal === null) throw Error("Queued cancellation terminal evidence belongs to another start or is not terminal");
|
|
1908
1911
|
return {
|
|
@@ -1912,9 +1915,9 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
1912
1915
|
receipt: n
|
|
1913
1916
|
}
|
|
1914
1917
|
};
|
|
1915
|
-
},
|
|
1918
|
+
}, An = async (e, t) => {
|
|
1916
1919
|
let [n] = await e.query({
|
|
1917
|
-
table:
|
|
1920
|
+
table: En.tableName,
|
|
1918
1921
|
predicate: O("id", t),
|
|
1919
1922
|
lock: "update",
|
|
1920
1923
|
order: [],
|
|
@@ -1922,16 +1925,16 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
1922
1925
|
skip: void 0,
|
|
1923
1926
|
projection: void 0
|
|
1924
1927
|
});
|
|
1925
|
-
return n === void 0 ? void 0 :
|
|
1926
|
-
},
|
|
1928
|
+
return n === void 0 ? void 0 : kn(n);
|
|
1929
|
+
}, jn = async (e, t) => {
|
|
1927
1930
|
let n = t.controlBinding;
|
|
1928
1931
|
if (n === null) throw Error("Queued cancellation has no control binding");
|
|
1929
1932
|
let r = await p(e, n.controlId);
|
|
1930
1933
|
if (r === void 0 || r.operation !== "cancel" || r.workflowName !== t.workflowName || r.runId !== n.runId || r.executionId !== n.executionId || r.generation !== n.generation || r.owner?.tenantId !== t.tenantId || r.result?.status === "running") throw Error("Queued cancellation lost its original resident control owner");
|
|
1931
1934
|
return r;
|
|
1932
|
-
},
|
|
1935
|
+
}, Mn = async (e, t, n) => {
|
|
1933
1936
|
if (t.controlBinding === null) return;
|
|
1934
|
-
let r = await
|
|
1937
|
+
let r = await jn(e, t);
|
|
1935
1938
|
if (r.result !== null) return;
|
|
1936
1939
|
let [i] = await e.query({
|
|
1937
1940
|
table: "_voltro_workflow_runs",
|
|
@@ -1942,14 +1945,14 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
1942
1945
|
skip: void 0,
|
|
1943
1946
|
projection: void 0
|
|
1944
1947
|
});
|
|
1945
|
-
i !== void 0 && await
|
|
1948
|
+
i !== void 0 && await Sn(e, {
|
|
1946
1949
|
runId: r.runId,
|
|
1947
1950
|
workflowName: r.workflowName,
|
|
1948
1951
|
executionId: r.executionId,
|
|
1949
1952
|
generation: r.generation
|
|
1950
1953
|
}, n);
|
|
1951
|
-
},
|
|
1952
|
-
let n = await
|
|
1954
|
+
}, Nn = async (e, t) => {
|
|
1955
|
+
let n = await An(e, t.requestId);
|
|
1953
1956
|
if (n === void 0) return {
|
|
1954
1957
|
kind: "unknown",
|
|
1955
1958
|
reason: "missing-request"
|
|
@@ -1965,7 +1968,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
1965
1968
|
};
|
|
1966
1969
|
}
|
|
1967
1970
|
if (n.controlBinding !== null) {
|
|
1968
|
-
let t = await
|
|
1971
|
+
let t = await jn(e, n);
|
|
1969
1972
|
if (t.result !== null) return {
|
|
1970
1973
|
kind: t.result.kind,
|
|
1971
1974
|
request: n,
|
|
@@ -2013,10 +2016,10 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2013
2016
|
request: n,
|
|
2014
2017
|
outcome: {
|
|
2015
2018
|
kind: "rejected",
|
|
2016
|
-
failureId: await
|
|
2019
|
+
failureId: await Dt(e, r)
|
|
2017
2020
|
}
|
|
2018
2021
|
};
|
|
2019
|
-
},
|
|
2022
|
+
}, Pn = (e, t) => {
|
|
2020
2023
|
let n = "request" in t ? t.request : void 0;
|
|
2021
2024
|
if (n !== void 0 && (n.id !== e.requestId || n.receiptId !== e.receiptId || n.workflowName !== e.workflowName)) throw Error("Queued control result belongs to another request or receipt");
|
|
2022
2025
|
let r = {
|
|
@@ -2064,14 +2067,14 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2064
2067
|
...r,
|
|
2065
2068
|
observation: { kind: "pending" }
|
|
2066
2069
|
});
|
|
2067
|
-
},
|
|
2070
|
+
}, Fn = async (e, t) => {
|
|
2068
2071
|
let n = w.decodeUnknownSync(w.Struct({
|
|
2069
2072
|
id: w.NonEmptyString,
|
|
2070
2073
|
receiptId: w.NonEmptyString,
|
|
2071
2074
|
workflowName: w.NonEmptyString,
|
|
2072
2075
|
tenantId: w.NullOr(w.String),
|
|
2073
2076
|
requestedAt: w.DateFromSelf,
|
|
2074
|
-
cause:
|
|
2077
|
+
cause: Dn
|
|
2075
2078
|
}))({
|
|
2076
2079
|
id: t.requestId,
|
|
2077
2080
|
receiptId: t.receiptId,
|
|
@@ -2081,30 +2084,30 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2081
2084
|
cause: t.cause ?? null
|
|
2082
2085
|
});
|
|
2083
2086
|
if (!Number.isFinite(n.requestedAt.getTime())) throw Error("Queued cancellation request requires a valid timestamp");
|
|
2084
|
-
let r = await
|
|
2087
|
+
let r = await An(e, n.id);
|
|
2085
2088
|
if (r !== void 0) {
|
|
2086
2089
|
if (r.receiptId !== n.receiptId || r.workflowName !== n.workflowName || r.tenantId !== n.tenantId) throw Error("Queued cancellation identity belongs to a different start or owner");
|
|
2087
|
-
return await
|
|
2090
|
+
return await Mn(e, r, t.now), r;
|
|
2088
2091
|
}
|
|
2089
|
-
let i = await
|
|
2092
|
+
let i = await cn(e, t), a;
|
|
2090
2093
|
if (i.kind === "submitted") a = {
|
|
2091
2094
|
kind: "submission",
|
|
2092
2095
|
submissionId: i.submissionId
|
|
2093
2096
|
};
|
|
2094
2097
|
else {
|
|
2095
|
-
let n = await
|
|
2098
|
+
let n = await jt(e, t.receiptId);
|
|
2096
2099
|
if (n === void 0) throw Error("Cancelled start receipt disappeared during request acceptance");
|
|
2097
2100
|
a = {
|
|
2098
2101
|
kind: "terminal",
|
|
2099
2102
|
receipt: n
|
|
2100
2103
|
};
|
|
2101
2104
|
}
|
|
2102
|
-
let o =
|
|
2105
|
+
let o = kn({
|
|
2103
2106
|
...n,
|
|
2104
2107
|
target: a,
|
|
2105
2108
|
controlBinding: null
|
|
2106
2109
|
});
|
|
2107
|
-
if (await e.insert(
|
|
2110
|
+
if (await e.insert(En.tableName, o), a.kind === "submission") {
|
|
2108
2111
|
let n = await V(e, a.submissionId);
|
|
2109
2112
|
if (n === void 0) throw Error("Queued cancellation submission disappeared during acceptance");
|
|
2110
2113
|
if (n.preparedExecutionId !== null && n.dispatchAttempts > 0) {
|
|
@@ -2128,14 +2131,14 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2128
2131
|
workflowName: n.tag,
|
|
2129
2132
|
executionId: n.executionId,
|
|
2130
2133
|
generation: n.runnerGeneration
|
|
2131
|
-
}, a = await
|
|
2132
|
-
return await
|
|
2134
|
+
}, a = await In(e, o.id, i);
|
|
2135
|
+
return await Mn(e, a.request, t.now), a.request;
|
|
2133
2136
|
}
|
|
2134
2137
|
}
|
|
2135
2138
|
}
|
|
2136
2139
|
return o;
|
|
2137
|
-
},
|
|
2138
|
-
let r = await
|
|
2140
|
+
}, In = async (e, t, n) => {
|
|
2141
|
+
let r = await An(e, t);
|
|
2139
2142
|
if (r === void 0) throw Error("Queued cancellation request is missing");
|
|
2140
2143
|
if (r.target.kind === "terminal") return {
|
|
2141
2144
|
kind: "terminal",
|
|
@@ -2144,7 +2147,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2144
2147
|
if (r.controlBinding !== null) return {
|
|
2145
2148
|
kind: "bound",
|
|
2146
2149
|
request: r,
|
|
2147
|
-
control: await
|
|
2150
|
+
control: await jn(e, r)
|
|
2148
2151
|
};
|
|
2149
2152
|
let i = await V(e, r.target.submissionId);
|
|
2150
2153
|
if (i === void 0 || i.workflowName !== r.workflowName || i.tenantId !== r.tenantId || !i.receiptsBound || i.failureId !== null || i.dispatchAttempts === 0 || i.preparedExecutionId !== n.executionId || i.executionId !== null && i.executionId !== n.executionId || i.runId !== null && i.runId !== n.runId || n.workflowName !== r.workflowName) throw Error("Queued cancellation has no dispatched submission for this resident execution");
|
|
@@ -2176,7 +2179,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2176
2179
|
requestedAt: r.requestedAt.getTime(),
|
|
2177
2180
|
cause: r.cause
|
|
2178
2181
|
});
|
|
2179
|
-
if (await e.update(
|
|
2182
|
+
if (await e.update(En.tableName, r.id, { controlBinding: s }) === null) throw Error("Queued cancellation request disappeared during run binding");
|
|
2180
2183
|
return {
|
|
2181
2184
|
kind: "bound",
|
|
2182
2185
|
request: {
|
|
@@ -2185,14 +2188,14 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2185
2188
|
},
|
|
2186
2189
|
control: c
|
|
2187
2190
|
};
|
|
2188
|
-
},
|
|
2191
|
+
}, Ln = async (e, t) => {
|
|
2189
2192
|
let n = /* @__PURE__ */ new Set();
|
|
2190
|
-
for await (let r of
|
|
2193
|
+
for await (let r of ht(e, t.executionId, t.workflowName)) n.add(r.id);
|
|
2191
2194
|
if (n.size === 0) return !1;
|
|
2192
2195
|
let r, i = !1;
|
|
2193
2196
|
for (;;) {
|
|
2194
2197
|
let a = await e.query({
|
|
2195
|
-
table:
|
|
2198
|
+
table: En.tableName,
|
|
2196
2199
|
predicate: D(O("workflowName", t.workflowName), ...r === void 0 ? [] : [A("id", r)]),
|
|
2197
2200
|
lock: "update",
|
|
2198
2201
|
order: [{
|
|
@@ -2204,9 +2207,9 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2204
2207
|
projection: void 0
|
|
2205
2208
|
});
|
|
2206
2209
|
for (let o of a) {
|
|
2207
|
-
let a =
|
|
2210
|
+
let a = kn(o);
|
|
2208
2211
|
if (r = a.id, a.target.kind !== "submission" || !n.has(a.target.submissionId)) continue;
|
|
2209
|
-
let s = await
|
|
2212
|
+
let s = await In(e, a.id, t);
|
|
2210
2213
|
if (s.kind === "bound") {
|
|
2211
2214
|
if (s.control.runId !== t.runId || s.control.executionId !== t.executionId || s.control.workflowName !== t.workflowName) throw Error("Queued cancellation entry does not match its original resident execution");
|
|
2212
2215
|
s.control.result === null && (i = !0);
|
|
@@ -2214,22 +2217,22 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2214
2217
|
}
|
|
2215
2218
|
if (a.length < 100) return i;
|
|
2216
2219
|
}
|
|
2217
|
-
},
|
|
2220
|
+
}, Rn = w.Struct({
|
|
2218
2221
|
requestId: w.NonEmptyString,
|
|
2219
2222
|
receiptId: w.NonEmptyString,
|
|
2220
2223
|
workflowName: w.NonEmptyString,
|
|
2221
2224
|
tenantId: w.NullOr(w.String)
|
|
2222
|
-
}),
|
|
2223
|
-
let n = w.decodeUnknownSync(
|
|
2224
|
-
return await
|
|
2225
|
+
}), zn = async (e, t) => {
|
|
2226
|
+
let n = w.decodeUnknownSync(Rn)(t);
|
|
2227
|
+
return await Fn(e, {
|
|
2225
2228
|
...n,
|
|
2226
2229
|
now: t.now,
|
|
2227
2230
|
...t.cause === void 0 ? {} : { cause: t.cause }
|
|
2228
|
-
}),
|
|
2229
|
-
}, zn = async (e, t) => {
|
|
2230
|
-
let n = w.decodeUnknownSync(Ln)(t);
|
|
2231
|
-
return Nn(n, await Mn(e, n));
|
|
2231
|
+
}), Bn(e, n);
|
|
2232
2232
|
}, Bn = async (e, t) => {
|
|
2233
|
+
let n = w.decodeUnknownSync(Rn)(t);
|
|
2234
|
+
return Pn(n, await Nn(e, n));
|
|
2235
|
+
}, Vn = async (e, t) => {
|
|
2233
2236
|
if (new Set(t.intentIds).size !== t.intentIds.length) throw Error("Admitted transfer requires distinct pending identities");
|
|
2234
2237
|
let n = await V(e, t.id);
|
|
2235
2238
|
if (n !== void 0) {
|
|
@@ -2250,14 +2253,14 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2250
2253
|
let i = q(r[0]);
|
|
2251
2254
|
if (i.workflowName !== t.workflowName || i.tenantId !== t.tenantId || i.deadLetteredAt !== void 0) throw Error("Admitted transfer selected a foreign or dead-lettered input");
|
|
2252
2255
|
}
|
|
2253
|
-
let r = await
|
|
2254
|
-
await
|
|
2256
|
+
let r = await bt(e, t);
|
|
2257
|
+
await Pt(e, r.id);
|
|
2255
2258
|
for (let t of r.intentIds) if (!await e.delete("_voltro_workflow_pending", t)) throw Error("Admitted input disappeared during submission transfer");
|
|
2256
2259
|
return {
|
|
2257
2260
|
...r,
|
|
2258
2261
|
receiptsBound: !0
|
|
2259
2262
|
};
|
|
2260
|
-
},
|
|
2263
|
+
}, Hn = async (e, t) => ze(e, (e) => Un(e, t)), Un = async (e, t) => {
|
|
2261
2264
|
if (t.id.length === 0 || t.intentIds.length === 0 || new Set(t.intentIds).size !== t.intentIds.length) throw Error("Queue transfer requires a submission identity and distinct pending identities");
|
|
2262
2265
|
let n = await V(e, t.id);
|
|
2263
2266
|
if (n !== void 0) {
|
|
@@ -2288,7 +2291,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2288
2291
|
}
|
|
2289
2292
|
let i = t.prepare(r);
|
|
2290
2293
|
if (i.control.workflowName !== t.workflowName) throw Error("Prepared submission belongs to a different workflow");
|
|
2291
|
-
let a = await
|
|
2294
|
+
let a = await yt(e, {
|
|
2292
2295
|
...i,
|
|
2293
2296
|
id: t.id,
|
|
2294
2297
|
tenantId: t.tenantId,
|
|
@@ -2296,7 +2299,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2296
2299
|
now: t.now
|
|
2297
2300
|
});
|
|
2298
2301
|
if (a.kind !== "reserved") return a;
|
|
2299
|
-
await
|
|
2302
|
+
await Pt(e, t.id);
|
|
2300
2303
|
for (let t of r) if (!await e.delete("_voltro_workflow_pending", t.id)) throw Error("Pending start disappeared during queue transfer");
|
|
2301
2304
|
return {
|
|
2302
2305
|
...a,
|
|
@@ -2305,8 +2308,8 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2305
2308
|
receiptsBound: !0
|
|
2306
2309
|
}
|
|
2307
2310
|
};
|
|
2308
|
-
},
|
|
2309
|
-
let { store: t, control: n, now: r } = e, i =
|
|
2311
|
+
}, Wn = async (e) => {
|
|
2312
|
+
let { store: t, control: n, now: r } = e, i = Ue(n, e.payload), a = await on({
|
|
2310
2313
|
store: t,
|
|
2311
2314
|
control: n,
|
|
2312
2315
|
keys: i,
|
|
@@ -2351,7 +2354,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2351
2354
|
};
|
|
2352
2355
|
if (a.kind === "defer") return {
|
|
2353
2356
|
kind: "queued",
|
|
2354
|
-
intentId: await
|
|
2357
|
+
intentId: await Gt({
|
|
2355
2358
|
store: t,
|
|
2356
2359
|
control: n,
|
|
2357
2360
|
decision: a,
|
|
@@ -2367,7 +2370,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2367
2370
|
};
|
|
2368
2371
|
let o = e.payload, s = [], c = 1;
|
|
2369
2372
|
if (n.batch !== void 0 && i.batchKey !== void 0) {
|
|
2370
|
-
let r = await
|
|
2373
|
+
let r = await Gn(t, n.workflowName, i.batchKey, n.batch.maxSize);
|
|
2371
2374
|
o = { items: [...r.map((e) => e.payload), e.payload] }, s = r.map((e) => e.id), c = r.length + 1;
|
|
2372
2375
|
}
|
|
2373
2376
|
return {
|
|
@@ -2395,7 +2398,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2395
2398
|
runId: a.evict.runId
|
|
2396
2399
|
} }
|
|
2397
2400
|
};
|
|
2398
|
-
},
|
|
2401
|
+
}, Gn = async (e, t, n, r) => (await e.query({
|
|
2399
2402
|
table: "_voltro_workflow_pending",
|
|
2400
2403
|
predicate: D(O("workflowName", t), O("controlKey", n), O("mode", "batch")),
|
|
2401
2404
|
order: [{
|
|
@@ -2408,22 +2411,22 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2408
2411
|
})).map((n) => ({
|
|
2409
2412
|
id: String(n.id),
|
|
2410
2413
|
payload: G(e, t, n.payload)
|
|
2411
|
-
})),
|
|
2414
|
+
})), Kn = async (e, t, n, r) => {
|
|
2412
2415
|
await e.update("_voltro_workflow_admissions", t, {
|
|
2413
2416
|
executionId: n,
|
|
2414
2417
|
runId: r
|
|
2415
2418
|
});
|
|
2416
|
-
},
|
|
2419
|
+
}, qn = F("_voltro_workflow_watermarks", {
|
|
2417
2420
|
id: j({ prefix: "wfwm" }),
|
|
2418
2421
|
positionAt: L(),
|
|
2419
2422
|
updatedAt: L().default("now")
|
|
2420
|
-
}),
|
|
2423
|
+
}), Jn = (e) => {
|
|
2421
2424
|
let t = e instanceof Error ? e.message : String(e);
|
|
2422
2425
|
return t.length > 400 ? `${t.slice(0, 400)}…` : t;
|
|
2423
|
-
},
|
|
2426
|
+
}, Yn = (e) => {
|
|
2424
2427
|
let t = [], n = [], r = [], i = /* @__PURE__ */ new Set(), a = /* @__PURE__ */ new Set(), o = e.payloadSchema === void 0 ? (e) => C.right(e) : (t) => {
|
|
2425
2428
|
let n = w.decodeUnknownEither(e.payloadSchema)(t);
|
|
2426
|
-
return C.isRight(n) ? C.right(n.right) : C.left(
|
|
2429
|
+
return C.isRight(n) ? C.right(n.right) : C.left(Jn(n.left));
|
|
2427
2430
|
}, s = e.runs.map((e) => ({
|
|
2428
2431
|
run: e,
|
|
2429
2432
|
decoded: o(e.payload)
|
|
@@ -2440,7 +2443,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2440
2443
|
workflowName: e.workflowName,
|
|
2441
2444
|
event: o.event,
|
|
2442
2445
|
subject: l.id,
|
|
2443
|
-
detail:
|
|
2446
|
+
detail: Jn(u.left)
|
|
2444
2447
|
});
|
|
2445
2448
|
continue;
|
|
2446
2449
|
}
|
|
@@ -2460,7 +2463,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2460
2463
|
workflowName: e.workflowName,
|
|
2461
2464
|
event: o.event,
|
|
2462
2465
|
subject: n,
|
|
2463
|
-
detail:
|
|
2466
|
+
detail: Jn(t)
|
|
2464
2467
|
}), !1;
|
|
2465
2468
|
}
|
|
2466
2469
|
};
|
|
@@ -2483,33 +2486,33 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2483
2486
|
discards: n,
|
|
2484
2487
|
problems: r
|
|
2485
2488
|
};
|
|
2486
|
-
},
|
|
2489
|
+
}, Xn = (e) => {
|
|
2487
2490
|
let t;
|
|
2488
2491
|
for (let n of e) (t === void 0 || n.occurredAt.getTime() > t.getTime()) && (t = n.occurredAt);
|
|
2489
2492
|
return t;
|
|
2490
|
-
},
|
|
2493
|
+
}, Zn = "_voltro_workflow_watermarks", Qn = "_voltro_workflow_events", $n = "cancelOn", er = 36e5, tr = 500, nr = (e) => {
|
|
2491
2494
|
if (e instanceof Date) return e;
|
|
2492
2495
|
if (typeof e == "number") return new Date(e);
|
|
2493
2496
|
if (typeof e == "string") {
|
|
2494
2497
|
let t = new Date(e);
|
|
2495
2498
|
if (!Number.isNaN(t.getTime())) return t;
|
|
2496
2499
|
}
|
|
2497
|
-
},
|
|
2498
|
-
table:
|
|
2500
|
+
}, rr = (e) => e instanceof Error ? e.message : String(e), ir = async (e, t) => nr((await e.query({
|
|
2501
|
+
table: Zn,
|
|
2499
2502
|
predicate: O("id", t),
|
|
2500
2503
|
order: [],
|
|
2501
2504
|
take: 1,
|
|
2502
2505
|
skip: void 0,
|
|
2503
2506
|
projection: void 0
|
|
2504
|
-
}))[0]?.positionAt),
|
|
2505
|
-
await e.upsert(
|
|
2507
|
+
}))[0]?.positionAt), ar = async (e, t, n) => {
|
|
2508
|
+
await e.upsert(Zn, {
|
|
2506
2509
|
id: t,
|
|
2507
2510
|
positionAt: n,
|
|
2508
2511
|
updatedAt: /* @__PURE__ */ new Date()
|
|
2509
2512
|
}, {
|
|
2510
2513
|
conflictColumns: ["id"],
|
|
2511
2514
|
update: (e) => {
|
|
2512
|
-
let t =
|
|
2515
|
+
let t = nr(e.positionAt);
|
|
2513
2516
|
return t !== void 0 && t.getTime() >= n.getTime() ? {
|
|
2514
2517
|
positionAt: t,
|
|
2515
2518
|
updatedAt: /* @__PURE__ */ new Date()
|
|
@@ -2519,7 +2522,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2519
2522
|
};
|
|
2520
2523
|
}
|
|
2521
2524
|
});
|
|
2522
|
-
},
|
|
2525
|
+
}, or = async (e, t, n) => {
|
|
2523
2526
|
let r = async (r) => e.query({
|
|
2524
2527
|
table: "_voltro_workflow_runs",
|
|
2525
2528
|
predicate: D(O("tag", t), O("status", r)),
|
|
@@ -2532,7 +2535,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2532
2535
|
projection: void 0
|
|
2533
2536
|
});
|
|
2534
2537
|
return [...await r("running"), ...await r("suspended")].flatMap((e) => {
|
|
2535
|
-
let t = e, n =
|
|
2538
|
+
let t = e, n = nr(t.startedAt);
|
|
2536
2539
|
return typeof t.id != "string" || typeof t.executionId != "string" || n === void 0 ? [] : [{
|
|
2537
2540
|
runId: t.id,
|
|
2538
2541
|
executionId: t.executionId,
|
|
@@ -2540,7 +2543,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2540
2543
|
startedAt: n
|
|
2541
2544
|
}];
|
|
2542
2545
|
});
|
|
2543
|
-
},
|
|
2546
|
+
}, sr = async (e, t, n) => (await e.query({
|
|
2544
2547
|
table: "_voltro_workflow_pending",
|
|
2545
2548
|
predicate: O("workflowName", t),
|
|
2546
2549
|
order: [{
|
|
@@ -2551,13 +2554,13 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2551
2554
|
skip: void 0,
|
|
2552
2555
|
projection: void 0
|
|
2553
2556
|
})).flatMap((e) => {
|
|
2554
|
-
let t = e, n =
|
|
2557
|
+
let t = e, n = nr(t.firstSeenAt);
|
|
2555
2558
|
return typeof t.id != "string" || n === void 0 ? [] : [{
|
|
2556
2559
|
intentId: t.id,
|
|
2557
2560
|
payload: t.payload,
|
|
2558
2561
|
firstSeenAt: n
|
|
2559
2562
|
}];
|
|
2560
|
-
}),
|
|
2563
|
+
}), cr = async (e, t) => {
|
|
2561
2564
|
let n = t.workflows.filter((e) => e.entries.length > 0);
|
|
2562
2565
|
if (n.length === 0) return {
|
|
2563
2566
|
examined: !1,
|
|
@@ -2572,10 +2575,10 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2572
2575
|
};
|
|
2573
2576
|
let r = e.now?.() ?? Date.now(), i = t.batch ?? 500, a = t.coldLookbackMs ?? 36e5, o = /* @__PURE__ */ new Set();
|
|
2574
2577
|
for (let e of n) for (let t of e.entries) o.add(t.event);
|
|
2575
|
-
let s = await
|
|
2576
|
-
s === void 0 && (await
|
|
2578
|
+
let s = await ir(e.store, $n), c = s ?? new Date(r - a);
|
|
2579
|
+
s === void 0 && (await ar(e.store, $n, c), s = c);
|
|
2577
2580
|
let l = await e.store.query({
|
|
2578
|
-
table:
|
|
2581
|
+
table: Qn,
|
|
2579
2582
|
predicate: de("occurredAt", c),
|
|
2580
2583
|
order: [{
|
|
2581
2584
|
column: "occurredAt",
|
|
@@ -2586,7 +2589,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2586
2589
|
projection: void 0
|
|
2587
2590
|
}), u = [];
|
|
2588
2591
|
for (let e of l) {
|
|
2589
|
-
let t = e, n =
|
|
2592
|
+
let t = e, n = nr(t.occurredAt);
|
|
2590
2593
|
typeof t.id == "string" && typeof t.name == "string" && n !== void 0 && o.has(t.name) && u.push({
|
|
2591
2594
|
id: t.id,
|
|
2592
2595
|
name: t.name,
|
|
@@ -2600,15 +2603,15 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2600
2603
|
if (n.length === 0) continue;
|
|
2601
2604
|
let r = [], i = [];
|
|
2602
2605
|
try {
|
|
2603
|
-
r = await
|
|
2606
|
+
r = await or(e.store, t.workflowName, _), i = await sr(e.store, t.workflowName, _), (r.length >= _ || i.length >= _) && (h = !0);
|
|
2604
2607
|
} catch (e) {
|
|
2605
2608
|
f.push({
|
|
2606
2609
|
subject: t.workflowName,
|
|
2607
|
-
detail:
|
|
2610
|
+
detail: rr(e)
|
|
2608
2611
|
}), g = !0;
|
|
2609
2612
|
continue;
|
|
2610
2613
|
}
|
|
2611
|
-
let a =
|
|
2614
|
+
let a = Yn({
|
|
2612
2615
|
workflowName: t.workflowName,
|
|
2613
2616
|
entries: t.entries,
|
|
2614
2617
|
payloadSchema: t.payloadSchema,
|
|
@@ -2630,7 +2633,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2630
2633
|
} catch (e) {
|
|
2631
2634
|
f.push({
|
|
2632
2635
|
subject: n.runId,
|
|
2633
|
-
detail:
|
|
2636
|
+
detail: rr(e)
|
|
2634
2637
|
}), g = !0;
|
|
2635
2638
|
}
|
|
2636
2639
|
for (let n of a.discards) try {
|
|
@@ -2641,18 +2644,18 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2641
2644
|
} catch (e) {
|
|
2642
2645
|
f.push({
|
|
2643
2646
|
subject: n.intentId,
|
|
2644
|
-
detail:
|
|
2647
|
+
detail: rr(e)
|
|
2645
2648
|
}), g = !0;
|
|
2646
2649
|
}
|
|
2647
2650
|
}
|
|
2648
|
-
let v =
|
|
2651
|
+
let v = Xn(u), ee = s;
|
|
2649
2652
|
if (g) e.log?.warn("workflow.cancelOn: holding the watermark — evaluation or delivery remains incomplete", { failures: f.length });
|
|
2650
2653
|
else if (v !== void 0) try {
|
|
2651
|
-
await
|
|
2654
|
+
await ar(e.store, $n, v), ee = v;
|
|
2652
2655
|
} catch (e) {
|
|
2653
2656
|
f.push({
|
|
2654
|
-
subject:
|
|
2655
|
-
detail:
|
|
2657
|
+
subject: $n,
|
|
2658
|
+
detail: rr(e)
|
|
2656
2659
|
});
|
|
2657
2660
|
}
|
|
2658
2661
|
return d.length > 0 && e.log?.warn("workflow.cancelOn: some events could not be evaluated", {
|
|
@@ -2669,14 +2672,14 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2669
2672
|
failures: f,
|
|
2670
2673
|
watermark: ee
|
|
2671
2674
|
};
|
|
2672
|
-
},
|
|
2675
|
+
}, lr = 18e5, ur = 200, dr = 20, fr = (e) => {
|
|
2673
2676
|
if (e instanceof Date) return e;
|
|
2674
2677
|
if (typeof e == "number") return new Date(e);
|
|
2675
2678
|
if (typeof e == "string") {
|
|
2676
2679
|
let t = new Date(e);
|
|
2677
2680
|
if (!Number.isNaN(t.getTime())) return t;
|
|
2678
2681
|
}
|
|
2679
|
-
},
|
|
2682
|
+
}, pr = (e) => e instanceof Error ? e.message : String(e), mr = async (e, t, n) => (await e.query({
|
|
2680
2683
|
table: "_voltro_workflow_run_events",
|
|
2681
2684
|
predicate: O("runId", t),
|
|
2682
2685
|
order: [{
|
|
@@ -2687,13 +2690,13 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2687
2690
|
skip: void 0,
|
|
2688
2691
|
projection: void 0
|
|
2689
2692
|
})).flatMap((e) => {
|
|
2690
|
-
let t = e, n =
|
|
2693
|
+
let t = e, n = fr(t.occurredAt);
|
|
2691
2694
|
return typeof t.eventType != "string" || n === void 0 ? [] : [{
|
|
2692
2695
|
eventType: t.eventType,
|
|
2693
2696
|
occurredAt: n,
|
|
2694
2697
|
payload: t.payload
|
|
2695
2698
|
}];
|
|
2696
|
-
}),
|
|
2699
|
+
}), hr = async (e, t) => {
|
|
2697
2700
|
let n = (await e.query({
|
|
2698
2701
|
table: "_voltro_workflow_run_steps",
|
|
2699
2702
|
predicate: O("runId", t),
|
|
@@ -2706,24 +2709,24 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2706
2709
|
projection: void 0
|
|
2707
2710
|
}))[0];
|
|
2708
2711
|
if (n === void 0) return;
|
|
2709
|
-
let r =
|
|
2712
|
+
let r = fr(n.startedAt), i = fr(n.completedAt);
|
|
2710
2713
|
return r === void 0 ? i : i === void 0 ? r : i.getTime() > r.getTime() ? i : r;
|
|
2711
|
-
},
|
|
2714
|
+
}, gr = (e, t) => {
|
|
2712
2715
|
for (let n of e) {
|
|
2713
2716
|
if (n.eventType === "timer-fired") return !1;
|
|
2714
2717
|
if (n.eventType !== "timer-set") continue;
|
|
2715
|
-
let e =
|
|
2718
|
+
let e = fr(n.payload?.scheduledWakeAt);
|
|
2716
2719
|
return e !== void 0 && e.getTime() > t;
|
|
2717
2720
|
}
|
|
2718
2721
|
return !1;
|
|
2719
|
-
},
|
|
2722
|
+
}, _r = (e, t) => {
|
|
2720
2723
|
if (e !== "suspended") return "no-progress";
|
|
2721
2724
|
for (let e of t) {
|
|
2722
2725
|
if (e.eventType === "signal-received" || e.eventType === "signal-sent") return "suspended";
|
|
2723
2726
|
if (e.eventType === "signal-awaited") return "awaiting-signal";
|
|
2724
2727
|
}
|
|
2725
2728
|
return "suspended";
|
|
2726
|
-
},
|
|
2729
|
+
}, vr = async (e, t = {}) => {
|
|
2727
2730
|
let n = e.now?.() ?? Date.now(), r = t.stallAfterMs ?? 18e5, i = t.runPage ?? 200, a = t.eventLookback ?? 20, o = new Date(n - r), s = [], c = [], l = 0, u = 0, d, f;
|
|
2728
2731
|
try {
|
|
2729
2732
|
if (!Number.isSafeInteger(i) || i < 1) throw Error("Staleness run page must be a positive integer");
|
|
@@ -2745,7 +2748,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2745
2748
|
});
|
|
2746
2749
|
let r = n;
|
|
2747
2750
|
for (let e of d) {
|
|
2748
|
-
let t =
|
|
2751
|
+
let t = fr(e.startedAt);
|
|
2749
2752
|
if (t === void 0 || !Number.isFinite(t.getTime()) || typeof e.id != "string" || e.id.length === 0) throw Error("Staleness candidate has no valid pagination identity");
|
|
2750
2753
|
if (r !== void 0 && (t.getTime() < r.startedAt.getTime() || t.getTime() === r.startedAt.getTime() && e.id <= r.runId)) throw Error("Staleness candidate page did not advance");
|
|
2751
2754
|
r = {
|
|
@@ -2763,24 +2766,24 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2763
2766
|
sawFullRunPage: !1,
|
|
2764
2767
|
failures: [{
|
|
2765
2768
|
subject: "_voltro_workflow_runs",
|
|
2766
|
-
detail:
|
|
2769
|
+
detail: pr(e)
|
|
2767
2770
|
}]
|
|
2768
2771
|
};
|
|
2769
2772
|
}
|
|
2770
2773
|
for (let t of d) {
|
|
2771
|
-
let i = t, o =
|
|
2774
|
+
let i = t, o = fr(i.startedAt);
|
|
2772
2775
|
if (typeof i.id != "string" || typeof i.tag != "string" || typeof i.executionId != "string" || typeof i.status != "string" || o === void 0) continue;
|
|
2773
2776
|
let d, f;
|
|
2774
2777
|
try {
|
|
2775
|
-
d = await
|
|
2778
|
+
d = await mr(e.store, i.id, a), f = await hr(e.store, i.id);
|
|
2776
2779
|
} catch (e) {
|
|
2777
2780
|
s.push({
|
|
2778
2781
|
subject: i.id,
|
|
2779
|
-
detail:
|
|
2782
|
+
detail: pr(e)
|
|
2780
2783
|
});
|
|
2781
2784
|
continue;
|
|
2782
2785
|
}
|
|
2783
|
-
if (
|
|
2786
|
+
if (gr(d, n)) {
|
|
2784
2787
|
u += 1;
|
|
2785
2788
|
continue;
|
|
2786
2789
|
}
|
|
@@ -2799,7 +2802,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2799
2802
|
status: i.status,
|
|
2800
2803
|
lastProgressAt: m,
|
|
2801
2804
|
idleMs: h,
|
|
2802
|
-
reason:
|
|
2805
|
+
reason: _r(i.status, d)
|
|
2803
2806
|
};
|
|
2804
2807
|
c.push(g);
|
|
2805
2808
|
let _ = {};
|
|
@@ -2808,7 +2811,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2808
2811
|
} catch (e) {
|
|
2809
2812
|
s.push({
|
|
2810
2813
|
subject: `${g.runId}:describeRun`,
|
|
2811
|
-
detail:
|
|
2814
|
+
detail: pr(e)
|
|
2812
2815
|
});
|
|
2813
2816
|
}
|
|
2814
2817
|
if (e.log?.warn("workflow.staleness: run has made no progress", {
|
|
@@ -2834,7 +2837,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2834
2837
|
} catch (e) {
|
|
2835
2838
|
s.push({
|
|
2836
2839
|
subject: g.runId,
|
|
2837
|
-
detail:
|
|
2840
|
+
detail: pr(e)
|
|
2838
2841
|
});
|
|
2839
2842
|
}
|
|
2840
2843
|
if (e.onStalled !== void 0) try {
|
|
@@ -2842,7 +2845,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2842
2845
|
} catch (e) {
|
|
2843
2846
|
s.push({
|
|
2844
2847
|
subject: `${g.runId}:onStalled`,
|
|
2845
|
-
detail:
|
|
2848
|
+
detail: pr(e)
|
|
2846
2849
|
});
|
|
2847
2850
|
}
|
|
2848
2851
|
}
|
|
@@ -2855,7 +2858,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2855
2858
|
failures: s,
|
|
2856
2859
|
...f === void 0 ? {} : { nextRun: f }
|
|
2857
2860
|
};
|
|
2858
|
-
},
|
|
2861
|
+
}, yr = async (e, t, n) => {
|
|
2859
2862
|
let r = await e.transaction((e) => V(e, t.id));
|
|
2860
2863
|
if (r === void 0 || r.workflowName !== t.workflowName || r.tenantId !== t.tenantId || r.ledgerId !== t.ledgerId) throw Error("Submission dispatch lost its resident owner");
|
|
2861
2864
|
if (!r.receiptsBound || r.failureId !== null) throw Error("Cannot dispatch an incomplete or rejected submission");
|
|
@@ -2864,26 +2867,26 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2864
2867
|
return r.preparedExecutionId;
|
|
2865
2868
|
}
|
|
2866
2869
|
if (r.dispatchAttempts !== 0 || r.executionId !== null) throw Error("Submission has an unbound prior dispatch; reconciliation required");
|
|
2867
|
-
let i = await e.resolveExecutionId(t.workflowName, n), a = await e.transaction((e) =>
|
|
2870
|
+
let i = await e.resolveExecutionId(t.workflowName, n), a = await e.transaction((e) => Ct(e, t.id, i));
|
|
2868
2871
|
if (a.preparedExecutionId === null) throw Error("Submission preparation returned no execution identity");
|
|
2869
2872
|
return a.preparedExecutionId;
|
|
2870
|
-
},
|
|
2871
|
-
let i =
|
|
2873
|
+
}, br = /* @__PURE__ */ new WeakMap(), xr = async (e, t, n, r) => {
|
|
2874
|
+
let i = br.get(e), a = await _t(e.store, n, i?.afterId), o = 0, s = 0, c = 0, l = 0, u = i?.nextDueAt, d = (e) => {
|
|
2872
2875
|
u = Math.min(u ?? e, e);
|
|
2873
2876
|
};
|
|
2874
2877
|
for (let n of a) {
|
|
2875
2878
|
let i;
|
|
2876
2879
|
try {
|
|
2877
|
-
i =
|
|
2880
|
+
i = mt(n);
|
|
2878
2881
|
} catch {
|
|
2879
|
-
o++, c++, d(t +
|
|
2882
|
+
o++, c++, d(t + tn(1)), e.log?.warn?.("workflow submission metadata is invalid", { submissionId: typeof n.id == "string" ? n.id : null });
|
|
2880
2883
|
continue;
|
|
2881
2884
|
}
|
|
2882
2885
|
o++;
|
|
2883
2886
|
let a = i.dispatchAttempts === 0 ? 0 : void 0;
|
|
2884
2887
|
try {
|
|
2885
2888
|
let n = i.preparedExecutionId, r = n === null || i.dispatchAttempts === 0 ? void 0 : await e.transaction(async (e) => {
|
|
2886
|
-
let t = await
|
|
2889
|
+
let t = await dt(e, i.workflowName, n);
|
|
2887
2890
|
return t === void 0 ? void 0 : {
|
|
2888
2891
|
executionId: n,
|
|
2889
2892
|
runId: t.runId
|
|
@@ -2902,7 +2905,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2902
2905
|
continue;
|
|
2903
2906
|
}
|
|
2904
2907
|
let c = r ?? await (async () => {
|
|
2905
|
-
let n = e.controls.get(i.workflowName)?.batch === void 0 ? G(e.store, i.workflowName, i.payload) : { items: w.decodeUnknownSync(w.Struct({ items: w.Array(w.Unknown) }))(i.payload).items.map((t) => G(e.store, i.workflowName, t)) }, r = await
|
|
2908
|
+
let n = e.controls.get(i.workflowName)?.batch === void 0 ? G(e.store, i.workflowName, i.payload) : { items: w.decodeUnknownSync(w.Struct({ items: w.Array(w.Unknown) }))(i.payload).items.map((t) => G(e.store, i.workflowName, t)) }, r = await yr(e, i, n), o = await e.transaction((e) => Tt(e, i.id, t));
|
|
2906
2909
|
if (o === null) return;
|
|
2907
2910
|
a = o.dispatchAttempts === 1 ? 1 : void 0;
|
|
2908
2911
|
let s = await e.startAdmitted(i.workflowName, n, i.callerContext, r);
|
|
@@ -2918,7 +2921,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2918
2921
|
source: "flow-control",
|
|
2919
2922
|
mode: "singleton"
|
|
2920
2923
|
}
|
|
2921
|
-
}), await
|
|
2924
|
+
}), await Jt(e.store, i.eviction.executionId, t)), await e.transaction((e) => St(e, i.id, {
|
|
2922
2925
|
executionId: c.executionId,
|
|
2923
2926
|
runId: c.runId ?? null
|
|
2924
2927
|
})), s++;
|
|
@@ -2927,7 +2930,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2927
2930
|
let o;
|
|
2928
2931
|
try {
|
|
2929
2932
|
if (a !== void 0 && e.isPermanentStartError?.(n) === !0) {
|
|
2930
|
-
let r = a, o = await e.transaction((a) =>
|
|
2933
|
+
let r = a, o = await e.transaction((a) => Et(a, i.id, r, {
|
|
2931
2934
|
handler: e.controls.get(i.workflowName)?.onFailure ?? null,
|
|
2932
2935
|
errorMessage: String(n),
|
|
2933
2936
|
now: t
|
|
@@ -2941,7 +2944,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2941
2944
|
continue;
|
|
2942
2945
|
}
|
|
2943
2946
|
}
|
|
2944
|
-
o = await e.transaction((e) =>
|
|
2947
|
+
o = await e.transaction((e) => wt(e, i.id, String(n), t, r));
|
|
2945
2948
|
} catch (r) {
|
|
2946
2949
|
d(t), e.log?.warn?.("workflow submission retry state could not be recorded", {
|
|
2947
2950
|
workflow: i.workflowName,
|
|
@@ -2961,7 +2964,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2961
2964
|
}
|
|
2962
2965
|
}
|
|
2963
2966
|
let f = a.at(-1);
|
|
2964
|
-
return a.length === n && f !== void 0 && typeof f.id == "string" ? (
|
|
2967
|
+
return a.length === n && f !== void 0 && typeof f.id == "string" ? (br.set(e, {
|
|
2965
2968
|
afterId: f.id,
|
|
2966
2969
|
nextDueAt: u
|
|
2967
2970
|
}), {
|
|
@@ -2971,7 +2974,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2971
2974
|
rejected: l,
|
|
2972
2975
|
nextDueAt: t,
|
|
2973
2976
|
examined: !0
|
|
2974
|
-
}) : (
|
|
2977
|
+
}) : (br.delete(e), {
|
|
2975
2978
|
scanned: o,
|
|
2976
2979
|
admitted: s,
|
|
2977
2980
|
failed: c,
|
|
@@ -2979,9 +2982,9 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2979
2982
|
nextDueAt: u,
|
|
2980
2983
|
examined: a.length > 0
|
|
2981
2984
|
});
|
|
2982
|
-
},
|
|
2983
|
-
let r =
|
|
2984
|
-
table:
|
|
2985
|
+
}, Sr = /* @__PURE__ */ new WeakMap(), Cr = async (e, t, n) => {
|
|
2986
|
+
let r = Sr.get(e), i = await e.store.query({
|
|
2987
|
+
table: Ze,
|
|
2985
2988
|
predicate: D(pe("handler"), N("acceptedExecutionId"), ...r === void 0 ? [] : [A("id", r.afterId)]),
|
|
2986
2989
|
order: [{
|
|
2987
2990
|
column: "id",
|
|
@@ -2991,21 +2994,21 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
2991
2994
|
skip: void 0,
|
|
2992
2995
|
projection: void 0
|
|
2993
2996
|
}), a = 0, o = !1, s = r?.nextDueAt, c = () => {
|
|
2994
|
-
let e = t +
|
|
2997
|
+
let e = t + tn(1, () => 1);
|
|
2995
2998
|
s = Math.min(s ?? e, e);
|
|
2996
2999
|
};
|
|
2997
3000
|
for (let n of i) try {
|
|
2998
3001
|
if (typeof n.id != "string" || n.id.length === 0) throw Error("Failure report has no identity");
|
|
2999
3002
|
let r = n.id;
|
|
3000
|
-
(await e.transaction((e) =>
|
|
3003
|
+
(await e.transaction((e) => lt(e, r, t))).kind === "queued" && (o = !0, c());
|
|
3001
3004
|
} catch (t) {
|
|
3002
3005
|
a++, c(), e.log?.warn?.("workflow failure delivery could not be reconciled", {
|
|
3003
3006
|
failureId: typeof n.id == "string" ? n.id : null,
|
|
3004
|
-
...t instanceof
|
|
3007
|
+
...t instanceof ct ? { reason: t.reason } : {}
|
|
3005
3008
|
});
|
|
3006
3009
|
}
|
|
3007
3010
|
let l = i.at(-1);
|
|
3008
|
-
return i.length === n && l !== void 0 && typeof l.id == "string" ? (
|
|
3011
|
+
return i.length === n && l !== void 0 && typeof l.id == "string" ? (Sr.set(e, {
|
|
3009
3012
|
afterId: l.id,
|
|
3010
3013
|
nextDueAt: s
|
|
3011
3014
|
}), {
|
|
@@ -3014,16 +3017,16 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3014
3017
|
hasPending: o,
|
|
3015
3018
|
nextDueAt: t,
|
|
3016
3019
|
examined: !0
|
|
3017
|
-
}) : (
|
|
3020
|
+
}) : (Sr.delete(e), {
|
|
3018
3021
|
scanned: i.length,
|
|
3019
3022
|
failed: a,
|
|
3020
3023
|
hasPending: o,
|
|
3021
3024
|
nextDueAt: s,
|
|
3022
3025
|
examined: i.length > 0
|
|
3023
3026
|
});
|
|
3024
|
-
},
|
|
3025
|
-
let r =
|
|
3026
|
-
table:
|
|
3027
|
+
}, wr = "_voltro_workflow_parent_closures", Tr = /* @__PURE__ */ new WeakMap(), Er = async (e, t, n) => {
|
|
3028
|
+
let r = Tr.get(e), i = await e.store.query({
|
|
3029
|
+
table: wr,
|
|
3027
3030
|
predicate: D(N("completedAt"), ...r === void 0 ? [] : [A("id", r.afterId)]),
|
|
3028
3031
|
order: [{
|
|
3029
3032
|
column: "id",
|
|
@@ -3039,9 +3042,9 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3039
3042
|
if (typeof n.id != "string" || n.id.length === 0) throw Error("Parent closure has no identity");
|
|
3040
3043
|
let r = n.id;
|
|
3041
3044
|
await e.transaction(async (e) => {
|
|
3042
|
-
await
|
|
3045
|
+
await pn(e, r, t);
|
|
3043
3046
|
let [n] = await e.query({
|
|
3044
|
-
table:
|
|
3047
|
+
table: wr,
|
|
3045
3048
|
predicate: O("id", r),
|
|
3046
3049
|
order: [],
|
|
3047
3050
|
take: 1,
|
|
@@ -3055,7 +3058,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3055
3058
|
a++, s(), e.log?.warn?.("workflow parent closure could not be reconciled", { closureId: typeof n.id == "string" ? n.id : null });
|
|
3056
3059
|
}
|
|
3057
3060
|
let c = i.at(-1);
|
|
3058
|
-
return i.length === n && typeof c?.id == "string" ? (
|
|
3061
|
+
return i.length === n && typeof c?.id == "string" ? (Tr.set(e, {
|
|
3059
3062
|
afterId: c.id,
|
|
3060
3063
|
nextDueAt: o
|
|
3061
3064
|
}), {
|
|
@@ -3063,13 +3066,13 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3063
3066
|
failed: a,
|
|
3064
3067
|
nextDueAt: t,
|
|
3065
3068
|
examined: !0
|
|
3066
|
-
}) : (
|
|
3069
|
+
}) : (Tr.delete(e), {
|
|
3067
3070
|
scanned: i.length,
|
|
3068
3071
|
failed: a,
|
|
3069
3072
|
nextDueAt: o,
|
|
3070
3073
|
examined: i.length > 0
|
|
3071
3074
|
});
|
|
3072
|
-
},
|
|
3075
|
+
}, Dr = async (e, t) => {
|
|
3073
3076
|
if (t.from === t.to) throw Error("Queue transfer requires distinct source and target");
|
|
3074
3077
|
let n = await e.query({
|
|
3075
3078
|
table: U,
|
|
@@ -3085,7 +3088,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3085
3088
|
if (r.workflowName !== t.workflowName || r.tenantId !== t.tenantId) throw Error("Receipt target belongs to a different workflow or tenant");
|
|
3086
3089
|
for (;;) {
|
|
3087
3090
|
let n = await e.query({
|
|
3088
|
-
table:
|
|
3091
|
+
table: Ot,
|
|
3089
3092
|
predicate: D(O("pendingId", t.from), N("submissionId"), N("terminal")),
|
|
3090
3093
|
order: [{
|
|
3091
3094
|
column: "id",
|
|
@@ -3097,12 +3100,12 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3097
3100
|
});
|
|
3098
3101
|
if (n.length === 0) return;
|
|
3099
3102
|
for (let r of n) {
|
|
3100
|
-
let n =
|
|
3103
|
+
let n = At(r);
|
|
3101
3104
|
if (n.workflowName !== t.workflowName || n.tenantId !== t.tenantId) throw Error("Forwarded receipt belongs to a different workflow or tenant");
|
|
3102
3105
|
if (await e.update("_voltro_workflow_start_receipts", n.id, { pendingId: t.to }) === null) throw Error("Start receipt disappeared during queue transfer");
|
|
3103
3106
|
}
|
|
3104
3107
|
}
|
|
3105
|
-
},
|
|
3108
|
+
}, Or = {
|
|
3106
3109
|
scanned: 0,
|
|
3107
3110
|
admitted: 0,
|
|
3108
3111
|
deferred: 0,
|
|
@@ -3114,24 +3117,24 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3114
3117
|
deadLettered: 0,
|
|
3115
3118
|
timedOut: 0,
|
|
3116
3119
|
examined: !1
|
|
3117
|
-
},
|
|
3120
|
+
}, kr = 200, Ar = class extends Error {
|
|
3118
3121
|
submissionId;
|
|
3119
3122
|
rejected;
|
|
3120
3123
|
constructor(e, t, n = !1) {
|
|
3121
3124
|
super(n ? `Submission ${e} rejected; failure report retained` : `Submission ${e} remains unacknowledged`, { cause: t }), this.submissionId = e, this.rejected = n;
|
|
3122
3125
|
}
|
|
3123
|
-
},
|
|
3126
|
+
}, jr = async (e, t = {}) => {
|
|
3124
3127
|
let n = e.now ?? (() => Date.now()), r = e.log, i = t.batchSize ?? 200, a, o, s, c, l, u;
|
|
3125
3128
|
try {
|
|
3126
|
-
c = await
|
|
3129
|
+
c = await xr(e, n(), i, e.deadLetterAfterAttempts ?? 50), l = await Cr(e, n(), i), u = await Er(e, n(), i), a = await (e.readPauses?.() ?? Bt(e.store));
|
|
3127
3130
|
let r = t.skipPending === !0 && !l.hasPending ? {
|
|
3128
3131
|
due: [],
|
|
3129
3132
|
nextDueAt: void 0
|
|
3130
|
-
} : await
|
|
3133
|
+
} : await Xt(e.store, n(), i);
|
|
3131
3134
|
o = r.due, s = c.nextDueAt === void 0 ? r.nextDueAt : Math.min(r.nextDueAt ?? c.nextDueAt, c.nextDueAt), l.nextDueAt !== void 0 && (s = Math.min(s ?? l.nextDueAt, l.nextDueAt)), u.nextDueAt !== void 0 && (s = Math.min(s ?? u.nextDueAt, u.nextDueAt));
|
|
3132
3135
|
} catch (e) {
|
|
3133
3136
|
return r?.warn?.("workflow flow control: could not read the admission queue", { cause: String(e) }), {
|
|
3134
|
-
...
|
|
3137
|
+
...Or,
|
|
3135
3138
|
scanned: (c?.scanned ?? 0) + (l?.scanned ?? 0) + (u?.scanned ?? 0),
|
|
3136
3139
|
admitted: c?.admitted ?? 0,
|
|
3137
3140
|
deadLettered: c?.rejected ?? 0,
|
|
@@ -3164,9 +3167,9 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3164
3167
|
if (m !== !1 && t.attempts + 1 >= m) return `pending ${r} was dead-lettered after ${t.attempts + 1} failed attempts: ${String(n)}`;
|
|
3165
3168
|
};
|
|
3166
3169
|
for (let t of p) try {
|
|
3167
|
-
await
|
|
3170
|
+
await Fr(e, t, a, d, n());
|
|
3168
3171
|
} catch (i) {
|
|
3169
|
-
if (d.failed++, i instanceof
|
|
3172
|
+
if (d.failed++, i instanceof Ar) {
|
|
3170
3173
|
i.rejected && d.deadLettered++, r?.warn?.(i.message, {
|
|
3171
3174
|
submissionId: i.submissionId,
|
|
3172
3175
|
cause: String(i.cause)
|
|
@@ -3176,7 +3179,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3176
3179
|
let a = h(t, i, "intent");
|
|
3177
3180
|
if (a !== void 0) {
|
|
3178
3181
|
let o = n(), s = String(i);
|
|
3179
|
-
if (await
|
|
3182
|
+
if (await Nr(e, [t], a, s, o, !1).catch((e) => (r?.warn?.("workflow flow control: intent could not be dead-lettered with its report", {
|
|
3180
3183
|
workflow: t.workflowName,
|
|
3181
3184
|
intent: t.id,
|
|
3182
3185
|
cause: String(e)
|
|
@@ -3193,12 +3196,12 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3193
3196
|
workflow: t.workflowName,
|
|
3194
3197
|
intent: t.id,
|
|
3195
3198
|
cause: String(i)
|
|
3196
|
-
}), await
|
|
3199
|
+
}), await nn(e.store, t, String(i), n()).catch(() => {});
|
|
3197
3200
|
}
|
|
3198
3201
|
for (let t of f.values()) try {
|
|
3199
|
-
await
|
|
3202
|
+
await Lr(e, t, a, d, n());
|
|
3200
3203
|
} catch (i) {
|
|
3201
|
-
if (d.failed++, i instanceof
|
|
3204
|
+
if (d.failed++, i instanceof Ar) {
|
|
3202
3205
|
i.rejected && d.deadLettered++, r?.warn?.(i.message, {
|
|
3203
3206
|
submissionId: i.submissionId,
|
|
3204
3207
|
cause: String(i.cause)
|
|
@@ -3208,7 +3211,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3208
3211
|
let a = t[0], o = a === void 0 ? void 0 : h(a, i, "batch");
|
|
3209
3212
|
if (a !== void 0 && o !== void 0) {
|
|
3210
3213
|
let s = n(), c = String(i);
|
|
3211
|
-
if (await
|
|
3214
|
+
if (await Nr(e, t, o, c, s, !0).catch((e) => (r?.warn?.("workflow flow control: batch could not be dead-lettered with its report", {
|
|
3212
3215
|
workflow: a.workflowName,
|
|
3213
3216
|
intents: t.map((e) => e.id),
|
|
3214
3217
|
size: t.length,
|
|
@@ -3246,7 +3249,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3246
3249
|
if (i.workflowName !== r.workflowName || i.tenantId !== r.tenantId || i.mode !== r.mode || i.firstSeenAt !== r.firstSeenAt || i.dueAt !== r.dueAt || i.deadLetteredAt !== void 0) return;
|
|
3247
3250
|
n.push(i);
|
|
3248
3251
|
}
|
|
3249
|
-
let r = new Date(s +
|
|
3252
|
+
let r = new Date(s + tn(Math.max(...n.map((e) => e.attempts + 1)), () => c));
|
|
3250
3253
|
for (let t of n) if (await e.update("_voltro_workflow_pending", t.id, {
|
|
3251
3254
|
attempts: t.attempts + 1,
|
|
3252
3255
|
lastError: String(i).slice(0, 500),
|
|
@@ -3259,13 +3262,13 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3259
3262
|
cause: String(e)
|
|
3260
3263
|
}));
|
|
3261
3264
|
}
|
|
3262
|
-
let g = await
|
|
3265
|
+
let g = await Vr(e, n()).catch(() => ({ cancelled: 0 }));
|
|
3263
3266
|
return d.timedOut = g.cancelled, g.nextDeadlineAt !== void 0 && (s === void 0 || g.nextDeadlineAt < s) && (s = g.nextDeadlineAt), {
|
|
3264
3267
|
...d,
|
|
3265
3268
|
examined: t.skipPending !== !0 || c.examined || l.examined || u.examined,
|
|
3266
3269
|
...s === void 0 ? {} : { nextDueAt: s }
|
|
3267
3270
|
};
|
|
3268
|
-
},
|
|
3271
|
+
}, Mr = async (e, t, n) => {
|
|
3269
3272
|
let r = t.map((e) => ({
|
|
3270
3273
|
intent: e,
|
|
3271
3274
|
failureId: `wff_${R()}`
|
|
@@ -3287,7 +3290,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3287
3290
|
if (o.workflowName !== i.workflowName || o.tenantId !== i.tenantId) throw Error("Abandoned queue selection belongs to another workflow or tenant");
|
|
3288
3291
|
if (o.dueAt > n || o.deadLetteredAt !== void 0) continue;
|
|
3289
3292
|
let s = `workflow '${o.workflowName}' no longer has its queued declaration`;
|
|
3290
|
-
if (await
|
|
3293
|
+
if (await $e(e, {
|
|
3291
3294
|
id: a,
|
|
3292
3295
|
sourceKind: "intent",
|
|
3293
3296
|
sourceId: o.id,
|
|
@@ -3319,7 +3322,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3319
3322
|
}
|
|
3320
3323
|
return t;
|
|
3321
3324
|
});
|
|
3322
|
-
},
|
|
3325
|
+
}, Nr = async (e, t, n, r, i, a) => {
|
|
3323
3326
|
let o = `wff_${R()}`;
|
|
3324
3327
|
return e.transaction(async (s) => {
|
|
3325
3328
|
let c = [];
|
|
@@ -3341,10 +3344,10 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3341
3344
|
}
|
|
3342
3345
|
let l = c[0];
|
|
3343
3346
|
if (l === void 0) return 0;
|
|
3344
|
-
let u = await Promise.all(c.map((e) =>
|
|
3347
|
+
let u = await Promise.all(c.map((e) => nt(s, e.id)));
|
|
3345
3348
|
if (u.some(Boolean) && !u.every(Boolean)) throw Error("Dead-lettered batch mixes failure delivery and ordinary callers; reconciliation required");
|
|
3346
3349
|
let d = e.controls.get(l.workflowName);
|
|
3347
|
-
await
|
|
3350
|
+
await $e(s, {
|
|
3348
3351
|
id: o,
|
|
3349
3352
|
sourceKind: "intent",
|
|
3350
3353
|
sourceId: l.id,
|
|
@@ -3372,10 +3375,10 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3372
3375
|
at: i,
|
|
3373
3376
|
failureId: o
|
|
3374
3377
|
}
|
|
3375
|
-
}), !await
|
|
3378
|
+
}), !await rn(s, e, r, i)) throw Error("Dead-lettered queue row disappeared before marking");
|
|
3376
3379
|
return await B(s, o, i), c.length;
|
|
3377
3380
|
});
|
|
3378
|
-
},
|
|
3381
|
+
}, Pr = async (e, t, n, r, i) => {
|
|
3379
3382
|
let a = `wff_${R()}`;
|
|
3380
3383
|
return e.transaction(async (e) => {
|
|
3381
3384
|
let o = [];
|
|
@@ -3397,11 +3400,11 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3397
3400
|
}
|
|
3398
3401
|
o.sort((e, t) => e.firstSeenAt - t.firstSeenAt || e.id.localeCompare(t.id));
|
|
3399
3402
|
let s = o[0];
|
|
3400
|
-
if (s === void 0 || !
|
|
3401
|
-
let c = await Promise.all(o.map((t) =>
|
|
3403
|
+
if (s === void 0 || !Je(n, s, r)) return 0;
|
|
3404
|
+
let c = await Promise.all(o.map((t) => nt(e, t.id)));
|
|
3402
3405
|
if (c.some(Boolean) && !c.every(Boolean)) throw Error("Expired batch mixes failure delivery and ordinary callers; reconciliation required");
|
|
3403
3406
|
let l = `timeouts.start (${n.timeouts?.startMs}ms) elapsed while ${o.length} queued input(s) waited`;
|
|
3404
|
-
await
|
|
3407
|
+
await $e(e, {
|
|
3405
3408
|
id: a,
|
|
3406
3409
|
sourceKind: "intent",
|
|
3407
3410
|
sourceId: s.id,
|
|
@@ -3422,7 +3425,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3422
3425
|
}), await Y({
|
|
3423
3426
|
store: e,
|
|
3424
3427
|
control: n,
|
|
3425
|
-
keys:
|
|
3428
|
+
keys: Ue(n, G(e, s.workflowName, s.payload)),
|
|
3426
3429
|
outcome: "expired",
|
|
3427
3430
|
mode: s.mode,
|
|
3428
3431
|
reason: l,
|
|
@@ -3445,21 +3448,21 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3445
3448
|
}), !await e.delete("_voltro_workflow_pending", t.id)) throw Error("Expired queue row disappeared before deletion");
|
|
3446
3449
|
return await B(e, a, r), o.length;
|
|
3447
3450
|
});
|
|
3448
|
-
},
|
|
3451
|
+
}, Fr = async (e, t, n, r, i) => {
|
|
3449
3452
|
if (t = {
|
|
3450
3453
|
...t,
|
|
3451
3454
|
payload: G(e.store, t.workflowName, t.payload)
|
|
3452
|
-
}, t.mode === "delayed") return
|
|
3455
|
+
}, t.mode === "delayed") return Ir(e, t, n, r, i);
|
|
3453
3456
|
let a = e.controls.get(t.workflowName);
|
|
3454
3457
|
if (a === void 0) {
|
|
3455
|
-
r.expired += await
|
|
3458
|
+
r.expired += await Mr(e, [t], i);
|
|
3456
3459
|
return;
|
|
3457
3460
|
}
|
|
3458
|
-
if (
|
|
3459
|
-
r.expired += await
|
|
3461
|
+
if (Je(a, t, i)) {
|
|
3462
|
+
r.expired += await Pr(e, [t], a, i, !1);
|
|
3460
3463
|
return;
|
|
3461
3464
|
}
|
|
3462
|
-
let o =
|
|
3465
|
+
let o = Ue(a, t.payload), s = await on({
|
|
3463
3466
|
store: e.store,
|
|
3464
3467
|
control: a,
|
|
3465
3468
|
keys: o,
|
|
@@ -3467,7 +3470,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3467
3470
|
now: i,
|
|
3468
3471
|
reconsidering: !0
|
|
3469
3472
|
});
|
|
3470
|
-
await
|
|
3473
|
+
await Rr(e, {
|
|
3471
3474
|
control: a,
|
|
3472
3475
|
intent: t,
|
|
3473
3476
|
decision: s,
|
|
@@ -3477,9 +3480,9 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3477
3480
|
paused: n,
|
|
3478
3481
|
items: void 0
|
|
3479
3482
|
});
|
|
3480
|
-
},
|
|
3483
|
+
}, Ir = async (e, t, n, r, i) => {
|
|
3481
3484
|
if (e.registeredWorkflows !== void 0 && !e.registeredWorkflows.has(t.workflowName)) {
|
|
3482
|
-
r.expired += await
|
|
3485
|
+
r.expired += await Mr(e, [t], i);
|
|
3483
3486
|
return;
|
|
3484
3487
|
}
|
|
3485
3488
|
let a = e.controls.get(t.workflowName) ?? { workflowName: t.workflowName }, o = `wfsub_${R()}`, s = await e.transaction(async (e) => {
|
|
@@ -3496,7 +3499,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3496
3499
|
let s = q(r[0]);
|
|
3497
3500
|
if (s.workflowName !== t.workflowName || s.tenantId !== t.tenantId) throw Error("Delayed arrival belongs to a different workflow or tenant");
|
|
3498
3501
|
if (s.mode !== "delayed" || s.deadLetteredAt !== void 0 || s.dueAt > i) return;
|
|
3499
|
-
let c = await
|
|
3502
|
+
let c = await Wn({
|
|
3500
3503
|
store: e,
|
|
3501
3504
|
control: a,
|
|
3502
3505
|
payload: G(e, s.workflowName, s.payload),
|
|
@@ -3506,18 +3509,18 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3506
3509
|
now: i,
|
|
3507
3510
|
waiting: !1
|
|
3508
3511
|
});
|
|
3509
|
-
if (c.kind === "queued" && (await
|
|
3512
|
+
if (c.kind === "queued" && (await Dr(e, {
|
|
3510
3513
|
from: s.id,
|
|
3511
3514
|
to: c.intentId,
|
|
3512
3515
|
workflowName: s.workflowName,
|
|
3513
3516
|
tenantId: s.tenantId
|
|
3514
|
-
}), !await
|
|
3517
|
+
}), !await Qt(e, s.id))) throw Error("Delayed arrival disappeared during queue transfer");
|
|
3515
3518
|
if (c.kind === "start") {
|
|
3516
3519
|
if (c.ledgerId === void 0) throw Error("Delayed arrival has no admission reservation");
|
|
3517
|
-
let t = a.batch === void 0 ?
|
|
3520
|
+
let t = a.batch === void 0 ? It(e, s.workflowName, c.payload) : { items: w.decodeUnknownSync(w.Struct({ items: w.Array(w.Unknown) }))(c.payload).items.map((t) => It(e, s.workflowName, t)) };
|
|
3518
3521
|
return {
|
|
3519
3522
|
kind: "submission",
|
|
3520
|
-
submission: await
|
|
3523
|
+
submission: await Vn(e, {
|
|
3521
3524
|
id: o,
|
|
3522
3525
|
workflowName: s.workflowName,
|
|
3523
3526
|
tenantId: s.tenantId,
|
|
@@ -3538,7 +3541,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3538
3541
|
...c,
|
|
3539
3542
|
at: i
|
|
3540
3543
|
}
|
|
3541
|
-
}), !await
|
|
3544
|
+
}), !await Qt(e, s.id))) throw Error("Delayed arrival disappeared while recording its outcome");
|
|
3542
3545
|
return c;
|
|
3543
3546
|
});
|
|
3544
3547
|
if (s !== void 0) {
|
|
@@ -3554,9 +3557,9 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3554
3557
|
r.skipped++;
|
|
3555
3558
|
return;
|
|
3556
3559
|
}
|
|
3557
|
-
await
|
|
3560
|
+
await Br(e, s.submission, a, r, i, a.batch !== void 0, s.keys);
|
|
3558
3561
|
}
|
|
3559
|
-
},
|
|
3562
|
+
}, Lr = async (e, t, n, r, i) => {
|
|
3560
3563
|
t = t.map((t) => ({
|
|
3561
3564
|
...t,
|
|
3562
3565
|
payload: G(e.store, t.workflowName, t.payload)
|
|
@@ -3565,19 +3568,19 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3565
3568
|
if (a === void 0) return;
|
|
3566
3569
|
let o = e.controls.get(a.workflowName);
|
|
3567
3570
|
if (o === void 0 || o.batch === void 0) {
|
|
3568
|
-
r.expired += await
|
|
3571
|
+
r.expired += await Mr(e, t, i);
|
|
3569
3572
|
return;
|
|
3570
3573
|
}
|
|
3571
3574
|
let s = [...t].sort((e, t) => e.firstSeenAt - t.firstSeenAt), c = s[0];
|
|
3572
|
-
if (
|
|
3573
|
-
r.expired += await
|
|
3575
|
+
if (Je(o, c, i)) {
|
|
3576
|
+
r.expired += await Pr(e, s, o, i, !0);
|
|
3574
3577
|
return;
|
|
3575
3578
|
}
|
|
3576
|
-
let l =
|
|
3577
|
-
await
|
|
3579
|
+
let l = Ue(o, c.payload);
|
|
3580
|
+
await Rr(e, {
|
|
3578
3581
|
control: o,
|
|
3579
3582
|
intent: c,
|
|
3580
|
-
decision: await
|
|
3583
|
+
decision: await on({
|
|
3581
3584
|
store: e.store,
|
|
3582
3585
|
control: o,
|
|
3583
3586
|
keys: l,
|
|
@@ -3591,10 +3594,10 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3591
3594
|
paused: n,
|
|
3592
3595
|
items: s
|
|
3593
3596
|
});
|
|
3594
|
-
},
|
|
3597
|
+
}, Rr = async (e, t) => {
|
|
3595
3598
|
let { control: n, intent: r, decision: i, keys: a, counters: o, now: s, items: c, paused: l } = t;
|
|
3596
3599
|
if (i.kind === "defer") {
|
|
3597
|
-
await
|
|
3600
|
+
await Gt({
|
|
3598
3601
|
store: e.store,
|
|
3599
3602
|
control: n,
|
|
3600
3603
|
decision: i,
|
|
@@ -3626,11 +3629,11 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3626
3629
|
t.push(o);
|
|
3627
3630
|
}
|
|
3628
3631
|
t.sort((e, t) => e.firstSeenAt - t.firstSeenAt);
|
|
3629
|
-
let i = t[0], a =
|
|
3632
|
+
let i = t[0], a = Ue(n, G(e, n.workflowName, i.payload)), o = await on({
|
|
3630
3633
|
store: e,
|
|
3631
3634
|
control: n,
|
|
3632
3635
|
keys: a,
|
|
3633
|
-
paused: l.has(n.workflowName) || (await
|
|
3636
|
+
paused: l.has(n.workflowName) || (await Bt(e)).has(n.workflowName),
|
|
3634
3637
|
now: s,
|
|
3635
3638
|
reconsidering: !0
|
|
3636
3639
|
});
|
|
@@ -3664,13 +3667,13 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3664
3667
|
workflowName: n.workflowName,
|
|
3665
3668
|
tenantId: n.tenantId,
|
|
3666
3669
|
terminal: u
|
|
3667
|
-
}), !await
|
|
3670
|
+
}), !await Qt(e, n.id)) throw Error("Queued input disappeared while recording its terminal outcome");
|
|
3668
3671
|
return u.kind;
|
|
3669
3672
|
});
|
|
3670
3673
|
t !== void 0 && o[t]++;
|
|
3671
3674
|
return;
|
|
3672
3675
|
}
|
|
3673
|
-
let u = `wfsub_${R()}`, d = await e.transaction((t) =>
|
|
3676
|
+
let u = `wfsub_${R()}`, d = await e.transaction((t) => Un(t, {
|
|
3674
3677
|
id: u,
|
|
3675
3678
|
workflowName: n.workflowName,
|
|
3676
3679
|
tenantId: r.tenantId,
|
|
@@ -3695,16 +3698,16 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3695
3698
|
o.deferred++;
|
|
3696
3699
|
return;
|
|
3697
3700
|
}
|
|
3698
|
-
await
|
|
3701
|
+
await Br(e, d.submission, n, o, s, c !== void 0, a);
|
|
3699
3702
|
}
|
|
3700
|
-
},
|
|
3703
|
+
}, zr = async (e, t, n, r, i) => {
|
|
3701
3704
|
let a = await e.transaction((e) => V(e, t.id));
|
|
3702
3705
|
if (a === void 0 || !a.receiptsBound || a.workflowName !== n.workflowName || a.workflowName !== t.workflowName || a.tenantId !== t.tenantId || a.ledgerId !== t.ledgerId) throw Error("Admission acceptance callback no longer has its resident submission owner");
|
|
3703
3706
|
if (a.executionId !== null) {
|
|
3704
3707
|
if (a.failureId !== null || a.executionId.length === 0 || a.executionId !== a.preparedExecutionId) throw Error("Admission acceptance has contradictory resident execution evidence");
|
|
3705
3708
|
return a.executionId;
|
|
3706
3709
|
}
|
|
3707
|
-
await
|
|
3710
|
+
await Br(e, a, n, {
|
|
3708
3711
|
admitted: 0,
|
|
3709
3712
|
deferred: 0,
|
|
3710
3713
|
dropped: 0,
|
|
@@ -3715,14 +3718,14 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3715
3718
|
let o = await e.transaction((e) => V(e, t.id));
|
|
3716
3719
|
if (o?.executionId == null || o.executionId !== o.preparedExecutionId) throw Error("Admission submission has no confirmed engine acceptance");
|
|
3717
3720
|
return o.executionId;
|
|
3718
|
-
},
|
|
3721
|
+
}, Br = async (e, t, n, r, i, a, o) => {
|
|
3719
3722
|
let s = t.dispatchAttempts === 0 ? 0 : void 0;
|
|
3720
3723
|
try {
|
|
3721
3724
|
if (e.acquireSubmissionCapacity !== void 0 && !await e.acquireSubmissionCapacity(t)) {
|
|
3722
3725
|
r.deferred++;
|
|
3723
3726
|
return;
|
|
3724
3727
|
}
|
|
3725
|
-
let c = a ? { items: w.decodeUnknownSync(w.Struct({ items: w.Array(w.Unknown) }))(t.payload).items.map((t) => G(e.store, n.workflowName, t)) } : G(e.store, n.workflowName, t.payload), l = await
|
|
3728
|
+
let c = a ? { items: w.decodeUnknownSync(w.Struct({ items: w.Array(w.Unknown) }))(t.payload).items.map((t) => G(e.store, n.workflowName, t)) } : G(e.store, n.workflowName, t.payload), l = await yr(e, t, c), u = await e.transaction((e) => Tt(e, t.id, i));
|
|
3726
3729
|
if (u === null) return;
|
|
3727
3730
|
s = u.dispatchAttempts === 1 ? 1 : void 0;
|
|
3728
3731
|
let d = await e.startAdmitted(n.workflowName, c, t.callerContext, l);
|
|
@@ -3736,7 +3739,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3736
3739
|
source: "flow-control",
|
|
3737
3740
|
mode: "singleton"
|
|
3738
3741
|
}
|
|
3739
|
-
}), await
|
|
3742
|
+
}), await Jt(e.store, t.eviction.executionId, i), await Y({
|
|
3740
3743
|
store: e.store,
|
|
3741
3744
|
control: n,
|
|
3742
3745
|
keys: o,
|
|
@@ -3749,7 +3752,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3749
3752
|
runId: t.eviction.runId || null,
|
|
3750
3753
|
tenantId: t.tenantId,
|
|
3751
3754
|
now: i
|
|
3752
|
-
}), r.evicted++), await e.transaction((e) =>
|
|
3755
|
+
}), r.evicted++), await e.transaction((e) => St(e, t.id, {
|
|
3753
3756
|
executionId: d.executionId,
|
|
3754
3757
|
runId: d.runId ?? null
|
|
3755
3758
|
})), r.admitted++;
|
|
@@ -3758,14 +3761,14 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3758
3761
|
try {
|
|
3759
3762
|
if (s !== void 0 && e.isPermanentStartError?.(r) === !0) {
|
|
3760
3763
|
let o = s;
|
|
3761
|
-
a = await e.transaction((e) =>
|
|
3764
|
+
a = await e.transaction((e) => Et(e, t.id, o, {
|
|
3762
3765
|
handler: n.onFailure ?? null,
|
|
3763
3766
|
errorMessage: String(r),
|
|
3764
3767
|
now: i
|
|
3765
3768
|
})) !== void 0;
|
|
3766
3769
|
}
|
|
3767
3770
|
if (!a) {
|
|
3768
|
-
let n = await e.transaction((n) =>
|
|
3771
|
+
let n = await e.transaction((n) => wt(n, t.id, String(r), i, e.deadLetterAfterAttempts ?? 50));
|
|
3769
3772
|
n.retry.stoppedAt !== null && e.log?.warn?.("workflow submission automatic retry stopped; engine acceptance unknown", {
|
|
3770
3773
|
submissionId: t.id,
|
|
3771
3774
|
workflow: t.workflowName,
|
|
@@ -3773,18 +3776,18 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3773
3776
|
});
|
|
3774
3777
|
}
|
|
3775
3778
|
} catch (e) {
|
|
3776
|
-
throw new
|
|
3779
|
+
throw new Ar(t.id, AggregateError([r, e], "Submission and retry recording failed"));
|
|
3777
3780
|
}
|
|
3778
|
-
throw new
|
|
3781
|
+
throw new Ar(t.id, r, a);
|
|
3779
3782
|
}
|
|
3780
|
-
},
|
|
3783
|
+
}, Vr = async (e, t) => {
|
|
3781
3784
|
if (e.listRunningRuns === void 0) return { cancelled: 0 };
|
|
3782
3785
|
let n = 0, r;
|
|
3783
3786
|
for (let i of e.controls.values()) {
|
|
3784
3787
|
if (i.timeouts?.finishMs === void 0) continue;
|
|
3785
3788
|
let a = await e.listRunningRuns(i.workflowName);
|
|
3786
3789
|
for (let o of a) {
|
|
3787
|
-
if (!
|
|
3790
|
+
if (!Ye(i, {
|
|
3788
3791
|
startedAt: o.startedAt,
|
|
3789
3792
|
terminal: !1
|
|
3790
3793
|
}, t)) {
|
|
@@ -3802,40 +3805,40 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3802
3805
|
...v,
|
|
3803
3806
|
onFailure: i.onFailure ?? null
|
|
3804
3807
|
}
|
|
3805
|
-
}) && (await
|
|
3808
|
+
}) && (await Jt(e.store, o.executionId, t), n++);
|
|
3806
3809
|
}
|
|
3807
3810
|
}
|
|
3808
3811
|
return {
|
|
3809
3812
|
cancelled: n,
|
|
3810
3813
|
...r === void 0 ? {} : { nextDeadlineAt: r }
|
|
3811
3814
|
};
|
|
3812
|
-
},
|
|
3813
|
-
|
|
3814
|
-
},
|
|
3815
|
+
}, Hr = 3e5, Ur, Wr = (e) => {
|
|
3816
|
+
Ur = e !== void 0 && Number.isFinite(e) && e > 0 ? e : void 0;
|
|
3817
|
+
}, Gr = () => {
|
|
3815
3818
|
let e = process.env.VOLTRO_WORKFLOW_SUSPEND_HINT_MS;
|
|
3816
3819
|
if (e !== void 0) {
|
|
3817
3820
|
let t = Number(e);
|
|
3818
3821
|
if (Number.isFinite(t) && t > 0) return t;
|
|
3819
3822
|
}
|
|
3820
|
-
return
|
|
3821
|
-
},
|
|
3822
|
-
|
|
3823
|
-
},
|
|
3824
|
-
let t =
|
|
3823
|
+
return Ur ?? 3e5;
|
|
3824
|
+
}, Kr = /* @__PURE__ */ new Set(), qr = () => {
|
|
3825
|
+
Kr.clear();
|
|
3826
|
+
}, Jr = (e) => {
|
|
3827
|
+
let t = Gr();
|
|
3825
3828
|
if (!(e.timeoutMs > t)) return !1;
|
|
3826
3829
|
let n = `${e.workflowName ?? ""}\u0000${e.signalName}`;
|
|
3827
|
-
if (
|
|
3828
|
-
|
|
3830
|
+
if (Kr.has(n)) return !1;
|
|
3831
|
+
Kr.add(n);
|
|
3829
3832
|
let r = e.workflowName === void 0 ? "" : ` in workflow '${e.workflowName}'`;
|
|
3830
3833
|
return (e.warn ?? ((e) => console.warn(e)))(`awaitSignal('${e.signalName}')${r} declares a ${Math.round(e.timeoutMs / 1e3)}s timeout — a wait that long holds a worker fiber for its whole duration. For human-approval-length waits, awaitSignalSuspending (same call shape, from @voltro/workflow) SUSPENDS the run and frees the slot until the signal arrives. This is a hint, not a behaviour change; it is logged once per workflow. Threshold: workflows.suspendSignalHintMs in app.config.ts, or VOLTRO_WORKFLOW_SUSPEND_HINT_MS.`), !0;
|
|
3831
|
-
},
|
|
3834
|
+
}, Yr = async (e, t) => {
|
|
3832
3835
|
if (e) try {
|
|
3833
3836
|
await e.recordEvent(t);
|
|
3834
3837
|
} catch {}
|
|
3835
|
-
},
|
|
3838
|
+
}, Xr = (e, n) => {
|
|
3836
3839
|
let i = S.gen(function* () {
|
|
3837
|
-
let i = n.pollIntervalMs ?? 200, a = n.maxPollIntervalMs ?? 5e3, o = n.timeoutMs ?? 864e5, s = yield* S.serviceOption(
|
|
3838
|
-
|
|
3840
|
+
let i = n.pollIntervalMs ?? 200, a = n.maxPollIntervalMs ?? 5e3, o = n.timeoutMs ?? 864e5, s = yield* S.serviceOption(Se), c;
|
|
3841
|
+
Jr({
|
|
3839
3842
|
workflowName: s._tag === "Some" ? s.value.workflow.name : void 0,
|
|
3840
3843
|
signalName: n.name,
|
|
3841
3844
|
timeoutMs: o,
|
|
@@ -3846,7 +3849,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3846
3849
|
let l = yield* t, u = yield* S.serviceOption(r), d = u._tag === "Some" ? u.value : void 0;
|
|
3847
3850
|
if (l === void 0) return yield* S.die(/* @__PURE__ */ Error("awaitSignal: no active workflow run id in scope"));
|
|
3848
3851
|
let f = l;
|
|
3849
|
-
yield* S.promise(() =>
|
|
3852
|
+
yield* S.promise(() => Yr(d, {
|
|
3850
3853
|
runId: f,
|
|
3851
3854
|
eventType: "signal-awaited",
|
|
3852
3855
|
payload: { signalName: n.name }
|
|
@@ -3871,7 +3874,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3871
3874
|
})).find((e) => e.payload?.signalName === n.name);
|
|
3872
3875
|
if (i !== void 0) {
|
|
3873
3876
|
let e = yield* w.decodeUnknown(n.schema)(i.payload?.value);
|
|
3874
|
-
return yield* S.promise(() =>
|
|
3877
|
+
return yield* S.promise(() => Yr(d, {
|
|
3875
3878
|
runId: f,
|
|
3876
3879
|
eventType: "signal-received",
|
|
3877
3880
|
payload: {
|
|
@@ -3888,16 +3891,16 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3888
3891
|
success: n.schema,
|
|
3889
3892
|
execute: i
|
|
3890
3893
|
});
|
|
3891
|
-
},
|
|
3894
|
+
}, Zr = async (e, t) => {
|
|
3892
3895
|
if (e !== void 0) try {
|
|
3893
3896
|
await e.recordEvent(t);
|
|
3894
3897
|
} catch {}
|
|
3895
|
-
},
|
|
3898
|
+
}, Qr = (e, n) => {
|
|
3896
3899
|
let i = S.gen(function* () {
|
|
3897
3900
|
let i = n.pollIntervalMs ?? 200, a = n.maxPollIntervalMs ?? 5e3, o = n.timeoutMs ?? 864e5, s = n.take ?? 500, c = yield* t, l = yield* S.serviceOption(r), u = l._tag === "Some" ? l.value : void 0;
|
|
3898
3901
|
if (c === void 0) return yield* S.die(/* @__PURE__ */ Error("awaitEvent: no active workflow run id in scope"));
|
|
3899
|
-
let d = c, f = yield* n.since === "run-start" ?
|
|
3900
|
-
yield* S.promise(() =>
|
|
3902
|
+
let d = c, f = yield* n.since === "run-start" ? $r(e, d) : S.succeed(/* @__PURE__ */ new Date());
|
|
3903
|
+
yield* S.promise(() => Zr(u, {
|
|
3901
3904
|
runId: d,
|
|
3902
3905
|
eventType: "event-awaited",
|
|
3903
3906
|
payload: {
|
|
@@ -3927,7 +3930,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3927
3930
|
h = i.length;
|
|
3928
3931
|
for (let e of i) {
|
|
3929
3932
|
let t = yield* w.decodeUnknown(n.schema)(e.payload);
|
|
3930
|
-
if (n.match(t)) return yield* S.promise(() =>
|
|
3933
|
+
if (n.match(t)) return yield* S.promise(() => Zr(u, {
|
|
3931
3934
|
runId: d,
|
|
3932
3935
|
eventType: "event-received",
|
|
3933
3936
|
payload: {
|
|
@@ -3944,7 +3947,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3944
3947
|
success: n.schema,
|
|
3945
3948
|
execute: i
|
|
3946
3949
|
});
|
|
3947
|
-
},
|
|
3950
|
+
}, $r = (e, t) => S.gen(function* () {
|
|
3948
3951
|
let n = (yield* S.tryPromise({
|
|
3949
3952
|
try: () => e.store.query({
|
|
3950
3953
|
table: "_voltro_workflow_runs",
|
|
@@ -3962,10 +3965,10 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3962
3965
|
if (!Number.isNaN(e.getTime())) return e;
|
|
3963
3966
|
}
|
|
3964
3967
|
return /* @__PURE__ */ new Date(0);
|
|
3965
|
-
}),
|
|
3968
|
+
}), ei = (e) => new Promise((t) => setTimeout(t, e)), ti = () => {
|
|
3966
3969
|
let e = globalThis.crypto;
|
|
3967
3970
|
return typeof e?.randomUUID == "function" ? e.randomUUID() : `${Date.now().toString(36)}${Math.random().toString(36).slice(2)}`;
|
|
3968
|
-
},
|
|
3971
|
+
}, ni = () => `wfu_${ti()}`, ri = async (e, t) => {
|
|
3969
3972
|
let n = t.id ?? t.executionId;
|
|
3970
3973
|
if (!n) throw Error("workflow message target requires target.id or target.executionId");
|
|
3971
3974
|
let r = await e.query({
|
|
@@ -3987,7 +3990,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3987
3990
|
}))[0];
|
|
3988
3991
|
if (!i) throw Error(`workflow message target not found: ${n}`);
|
|
3989
3992
|
return i;
|
|
3990
|
-
},
|
|
3993
|
+
}, ii = class extends Error {
|
|
3991
3994
|
runId;
|
|
3992
3995
|
eventType;
|
|
3993
3996
|
eventId;
|
|
@@ -3995,8 +3998,8 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
3995
3998
|
constructor(e, t, n) {
|
|
3996
3999
|
super(`workflow ${t} for run ${e} was NOT recorded (event ${n}): the run will not see it — the store refused the row, see the recorder's warning`), this.runId = e, this.eventType = t, this.eventId = n, this.name = "WorkflowMessageNotRecorded";
|
|
3997
4000
|
}
|
|
3998
|
-
},
|
|
3999
|
-
let t = await
|
|
4001
|
+
}, ai = async (e) => {
|
|
4002
|
+
let t = await ri(e.store, e.target), n = await e.recorder.recordEvent({
|
|
4000
4003
|
runId: t.id,
|
|
4001
4004
|
eventType: "signal-sent",
|
|
4002
4005
|
payload: {
|
|
@@ -4004,10 +4007,10 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
4004
4007
|
value: e.payload
|
|
4005
4008
|
}
|
|
4006
4009
|
});
|
|
4007
|
-
if (n.recorded === !1) throw new
|
|
4010
|
+
if (n.recorded === !1) throw new ii(t.id, "signal-sent", n.id);
|
|
4008
4011
|
return { eventId: n.id };
|
|
4009
|
-
},
|
|
4010
|
-
let t = await
|
|
4012
|
+
}, oi = async (e) => {
|
|
4013
|
+
let t = await ri(e.store, e.target), n = ni(), r = await e.recorder.recordEvent({
|
|
4011
4014
|
runId: t.id,
|
|
4012
4015
|
eventType: "update-requested",
|
|
4013
4016
|
payload: {
|
|
@@ -4016,7 +4019,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
4016
4019
|
value: e.payload
|
|
4017
4020
|
}
|
|
4018
4021
|
});
|
|
4019
|
-
if (r.recorded === !1) throw new
|
|
4022
|
+
if (r.recorded === !1) throw new ii(t.id, "update-requested", r.id);
|
|
4020
4023
|
let i = Date.now(), a = e.options?.timeoutMs ?? 3e4, o = e.options?.pollIntervalMs ?? 100;
|
|
4021
4024
|
for (;;) {
|
|
4022
4025
|
let s = {
|
|
@@ -4046,44 +4049,44 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
4046
4049
|
}), t;
|
|
4047
4050
|
}
|
|
4048
4051
|
if (Date.now() - i >= a) throw Error(`Timed out waiting for workflow update '${e.updateName}' (${n})`);
|
|
4049
|
-
await
|
|
4052
|
+
await ei(o);
|
|
4050
4053
|
}
|
|
4051
|
-
},
|
|
4054
|
+
}, si = 864e5, ci = "voltro/suspending-signal", li = (e, t) => `${ci}/${e}/${t}`, ui = (e) => te.make(e, { success: w.Unknown }), di = async (e, t) => {
|
|
4052
4055
|
if (e) try {
|
|
4053
4056
|
await e.recordEvent(t);
|
|
4054
4057
|
} catch {}
|
|
4055
|
-
},
|
|
4056
|
-
let e = n.timeoutMs ??
|
|
4057
|
-
|
|
4058
|
-
runId:
|
|
4058
|
+
}, fi = (e, n) => S.gen(function* () {
|
|
4059
|
+
let e = n.timeoutMs ?? si, i = yield* re.WorkflowInstance, a = ui(li(i.workflow.name, n.name)), o = yield* t, s = yield* S.serviceOption(r), c = s._tag === "Some" ? s.value : void 0;
|
|
4060
|
+
o !== void 0 && (yield* S.promise(() => di(c, {
|
|
4061
|
+
runId: o,
|
|
4059
4062
|
eventType: "signal-awaited",
|
|
4060
4063
|
payload: { signalName: n.name }
|
|
4061
4064
|
})));
|
|
4062
|
-
let
|
|
4065
|
+
let l = te.await(a), u = Number.isFinite(e) ? yield* S.race(l, b.sleep({
|
|
4063
4066
|
name: `await-signal-timeout/${n.name}`,
|
|
4064
4067
|
duration: `${e} millis`
|
|
4065
|
-
}).pipe(S.andThen(S.die(/* @__PURE__ */ Error(`awaitSignalSuspending('${n.name}') timed out after ${e}ms`))))) : yield*
|
|
4066
|
-
return
|
|
4067
|
-
runId:
|
|
4068
|
+
}).pipe(S.andThen(S.die(/* @__PURE__ */ Error(`awaitSignalSuspending('${n.name}') timed out after ${e}ms`))))).pipe(S.catchAllCause((e) => i.suspended ? x.isInterruptedOnly(e) ? ne.suspend(i) : S.failCause(x.filter(e, (e) => !x.isInterruptType(e))) : S.failCause(e))) : yield* l, d = yield* w.decodeUnknown(n.schema)(u);
|
|
4069
|
+
return o !== void 0 && (yield* S.promise(() => di(c, {
|
|
4070
|
+
runId: o,
|
|
4068
4071
|
eventType: "signal-received",
|
|
4069
4072
|
payload: {
|
|
4070
4073
|
signalName: n.name,
|
|
4071
|
-
value:
|
|
4074
|
+
value: d
|
|
4072
4075
|
}
|
|
4073
|
-
}))),
|
|
4074
|
-
}),
|
|
4076
|
+
}))), d;
|
|
4077
|
+
}), pi = (e) => S.gen(function* () {
|
|
4075
4078
|
let t = e.target.executionId, n = e.target.workflowName;
|
|
4076
4079
|
if (t === void 0 || n === void 0) {
|
|
4077
4080
|
let r = e.store;
|
|
4078
4081
|
if (r === void 0) return yield* S.die(/* @__PURE__ */ Error("completeSuspendingSignal: provide a store, or target.executionId AND target.workflowName"));
|
|
4079
4082
|
let i = yield* S.tryPromise({
|
|
4080
|
-
try: () =>
|
|
4083
|
+
try: () => ri(r, e.target),
|
|
4081
4084
|
catch: (e) => e
|
|
4082
4085
|
});
|
|
4083
4086
|
t ??= i.executionId, n ??= i.tag;
|
|
4084
4087
|
}
|
|
4085
4088
|
if (t === void 0 || n === void 0) return { completed: !1 };
|
|
4086
|
-
let r =
|
|
4089
|
+
let r = li(n, e.signalName), i = ui(r), a = new te.TokenParsed({
|
|
4087
4090
|
workflowName: n,
|
|
4088
4091
|
executionId: t,
|
|
4089
4092
|
deferredName: r
|
|
@@ -4092,11 +4095,11 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
4092
4095
|
token: a,
|
|
4093
4096
|
exit: ie.succeed(e.payload)
|
|
4094
4097
|
}), { completed: !0 };
|
|
4095
|
-
}), Q = "_voltro_budget_holds",
|
|
4098
|
+
}), Q = "_voltro_budget_holds", mi = "budget-hold", hi = (e) => `${mi}:${e}`, gi = (e) => `${e.executionId}/${e.stepName}/${e.budget}#${e.generation}`, _i = async (e, t) => (await e.query({
|
|
4096
4099
|
table: Q,
|
|
4097
4100
|
predicate: D(O("executionId", t.executionId), O("stepName", t.stepName), O("budget", t.budget)),
|
|
4098
4101
|
order: []
|
|
4099
|
-
})).length,
|
|
4102
|
+
})).length, vi = F(Q, {
|
|
4100
4103
|
id: j({ prefix: "bhd" }),
|
|
4101
4104
|
holdKey: I().maxLength(191),
|
|
4102
4105
|
budget: I(),
|
|
@@ -4110,33 +4113,33 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
4110
4113
|
heldAt: L().default("now"),
|
|
4111
4114
|
releasedAt: L().nullable(),
|
|
4112
4115
|
outcome: I().nullable()
|
|
4113
|
-
}).index(["budget", "releasedAt"]),
|
|
4116
|
+
}).index(["budget", "releasedAt"]), yi = () => {
|
|
4114
4117
|
ve({
|
|
4115
4118
|
source: "framework",
|
|
4116
4119
|
table: Q,
|
|
4117
4120
|
timeColumn: "releasedAt",
|
|
4118
4121
|
ttlMs: ye(process.env.VOLTRO_BUDGET_HOLDS_TTL_HOURS, 720)
|
|
4119
4122
|
});
|
|
4120
|
-
},
|
|
4123
|
+
}, bi = class extends Error {
|
|
4121
4124
|
budget;
|
|
4122
4125
|
holdKey;
|
|
4123
4126
|
constructor(e, t, n) {
|
|
4124
4127
|
super(`budget '${e}': the run was suspended waiting for headroom and gave up after ${n}ms (hold ${t}). Nothing was spent. Raise the budget, reset its window, or lift the hold, then re-drive the run.`), this.name = "BudgetHoldExpired", this.budget = e, this.holdKey = t;
|
|
4125
4128
|
}
|
|
4126
|
-
},
|
|
4127
|
-
|
|
4129
|
+
}, xi = 6048e5, Si = (e) => S.gen(function* () {
|
|
4130
|
+
yi();
|
|
4128
4131
|
let t = e.timeoutMs ?? 6048e5, n = e.recheckEveryMs ?? 9e5, r = {
|
|
4129
4132
|
executionId: e.executionId,
|
|
4130
4133
|
stepName: e.stepName,
|
|
4131
4134
|
budget: e.budget
|
|
4132
4135
|
};
|
|
4133
|
-
for (;;) {
|
|
4134
|
-
let
|
|
4136
|
+
for (let i = 0;; i++) {
|
|
4137
|
+
let a = yield* S.promise(() => wi(e.store, r)), o = a.length === 0 ? Date.now() : Ci(a[0]?.heldAt), s = Number.isFinite(t) ? t - (Date.now() - o) : Infinity, c = gi({
|
|
4135
4138
|
...r,
|
|
4136
|
-
generation:
|
|
4139
|
+
generation: i
|
|
4137
4140
|
});
|
|
4138
|
-
if (s <= 0) return yield* S.promise(() =>
|
|
4139
|
-
let l =
|
|
4141
|
+
if (s <= 0) return yield* S.promise(() => Ti(e.store, r, "expired")), yield* S.fail(new bi(e.budget, c, t));
|
|
4142
|
+
let l = hi(c);
|
|
4140
4143
|
yield* S.promise(() => e.store.insertIgnore(Q, {
|
|
4141
4144
|
id: k({
|
|
4142
4145
|
kind: "typeid",
|
|
@@ -4156,7 +4159,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
4156
4159
|
outcome: null
|
|
4157
4160
|
}, { conflictColumns: ["holdKey"] }));
|
|
4158
4161
|
let u = Math.min(n, s);
|
|
4159
|
-
if (yield*
|
|
4162
|
+
if (yield* fi({ store: e.store }, {
|
|
4160
4163
|
name: l,
|
|
4161
4164
|
schema: w.Unknown,
|
|
4162
4165
|
timeoutMs: u
|
|
@@ -4165,16 +4168,16 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
4165
4168
|
outcome: "recheck"
|
|
4166
4169
|
}, { where: D(O("holdKey", c), N("releasedAt")) })), yield* e.hasHeadroom) return;
|
|
4167
4170
|
}
|
|
4168
|
-
}),
|
|
4171
|
+
}), Ci = (e) => e instanceof Date ? e.getTime() : typeof e == "string" ? Date.parse(e) : Date.now(), wi = async (e, t) => [...await e.query({
|
|
4169
4172
|
table: Q,
|
|
4170
4173
|
predicate: D(O("executionId", t.executionId), O("stepName", t.stepName), O("budget", t.budget)),
|
|
4171
4174
|
order: []
|
|
4172
|
-
})].sort((e, t) => String(e.id).localeCompare(String(t.id))),
|
|
4175
|
+
})].sort((e, t) => String(e.id).localeCompare(String(t.id))), Ti = async (e, t, n) => {
|
|
4173
4176
|
await e.updateMany(Q, {
|
|
4174
4177
|
releasedAt: /* @__PURE__ */ new Date(),
|
|
4175
4178
|
outcome: n
|
|
4176
4179
|
}, { where: D(O("executionId", t.executionId), O("stepName", t.stepName), O("budget", t.budget), N("releasedAt")) });
|
|
4177
|
-
},
|
|
4180
|
+
}, Ei = (e) => S.gen(function* () {
|
|
4178
4181
|
let t = e.tenantId === void 0 ? D(O("budget", e.budget), N("releasedAt")) : D(O("budget", e.budget), O("tenantId", e.tenantId), N("releasedAt")), n = yield* S.promise(() => e.store.query({
|
|
4179
4182
|
table: Q,
|
|
4180
4183
|
predicate: t,
|
|
@@ -4183,7 +4186,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
4183
4186
|
for (let t of n) (yield* S.promise(() => e.store.updateMany("_voltro_budget_holds", {
|
|
4184
4187
|
releasedAt: /* @__PURE__ */ new Date(),
|
|
4185
4188
|
outcome: e.outcome ?? "released"
|
|
4186
|
-
}, { where: D(O("id", String(t.id)), N("releasedAt")) }))) === 1 && (yield*
|
|
4189
|
+
}, { where: D(O("id", String(t.id)), N("releasedAt")) }))) === 1 && (yield* pi({
|
|
4187
4190
|
target: {
|
|
4188
4191
|
executionId: String(t.executionId),
|
|
4189
4192
|
workflowName: String(t.workflowName)
|
|
@@ -4195,7 +4198,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
4195
4198
|
}
|
|
4196
4199
|
}).pipe(S.catchAll(() => S.succeed({ completed: !1 }))), r += 1);
|
|
4197
4200
|
return { released: r };
|
|
4198
|
-
}),
|
|
4201
|
+
}), Di = async (e, t) => {
|
|
4199
4202
|
let n = t?.budget === void 0 ? N("releasedAt") : D(O("budget", t.budget), N("releasedAt"));
|
|
4200
4203
|
return (await e.query({
|
|
4201
4204
|
table: Q,
|
|
@@ -4211,8 +4214,8 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
4211
4214
|
stepName: String(e.stepName),
|
|
4212
4215
|
heldAt: e.heldAt instanceof Date ? e.heldAt.toISOString() : String(e.heldAt ?? "")
|
|
4213
4216
|
}));
|
|
4214
|
-
},
|
|
4215
|
-
let t = await
|
|
4217
|
+
}, Oi = async (e) => {
|
|
4218
|
+
let t = await Di(e), n = /* @__PURE__ */ new Map();
|
|
4216
4219
|
for (let e of t) {
|
|
4217
4220
|
let t = `${e.budget}\u0000${e.tenantId ?? ""}`;
|
|
4218
4221
|
n.has(t) || n.set(t, {
|
|
@@ -4221,17 +4224,17 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
4221
4224
|
});
|
|
4222
4225
|
}
|
|
4223
4226
|
return [...n.values()];
|
|
4224
|
-
},
|
|
4227
|
+
}, ki = async (e, t) => {
|
|
4225
4228
|
if (e) try {
|
|
4226
4229
|
await e.recordEvent(t);
|
|
4227
4230
|
} catch {}
|
|
4228
|
-
},
|
|
4231
|
+
}, Ai = (e) => {
|
|
4229
4232
|
let t = x.failureOption(e), n = Array.from(x.defects(e)), r = t._tag === "Some" ? t.value : n[0] ?? x.squash(e);
|
|
4230
4233
|
return {
|
|
4231
4234
|
errorTag: r && typeof r == "object" && "_tag" in r ? String(r._tag) : null,
|
|
4232
4235
|
errorMessage: r?.message ?? String(r)
|
|
4233
4236
|
};
|
|
4234
|
-
},
|
|
4237
|
+
}, ji = (e, n) => {
|
|
4235
4238
|
let i = S.gen(function* () {
|
|
4236
4239
|
let i = n.pollIntervalMs ?? 200, a = n.maxPollIntervalMs ?? 5e3, o = n.timeoutMs ?? 3e4, s = yield* t, c = yield* S.serviceOption(r), l = c._tag === "Some" ? c.value : void 0;
|
|
4237
4240
|
if (s === void 0) return yield* S.die(/* @__PURE__ */ Error("awaitUpdate: no active workflow run id in scope"));
|
|
@@ -4255,7 +4258,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
4255
4258
|
}), s = new Set(i.filter((e) => e.eventType === "update-completed" || e.eventType === "update-failed").map((e) => e.payload?.updateId).filter((e) => typeof e == "string" && e.length > 0)), c = i.find((e) => e.eventType === "update-requested" && e.payload?.updateName === n.name && typeof e.payload.updateId == "string" && !s.has(e.payload.updateId));
|
|
4256
4259
|
if (c !== void 0) {
|
|
4257
4260
|
let e = c.payload.updateId;
|
|
4258
|
-
yield* S.promise(() =>
|
|
4261
|
+
yield* S.promise(() => ki(l, {
|
|
4259
4262
|
runId: u,
|
|
4260
4263
|
eventType: "update-received",
|
|
4261
4264
|
payload: {
|
|
@@ -4263,24 +4266,24 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
4263
4266
|
updateName: n.name
|
|
4264
4267
|
}
|
|
4265
4268
|
}));
|
|
4266
|
-
let t = yield* w.decodeUnknown(n.schema)(c.payload?.value).pipe(S.tapErrorCause((t) => S.promise(() =>
|
|
4269
|
+
let t = yield* w.decodeUnknown(n.schema)(c.payload?.value).pipe(S.tapErrorCause((t) => S.promise(() => ki(l, {
|
|
4267
4270
|
runId: u,
|
|
4268
4271
|
eventType: "update-failed",
|
|
4269
4272
|
payload: {
|
|
4270
4273
|
updateId: e,
|
|
4271
4274
|
updateName: n.name,
|
|
4272
|
-
...
|
|
4275
|
+
...Ai(t)
|
|
4273
4276
|
}
|
|
4274
|
-
})))), r = yield* (n.handle ? n.handle(t) : S.succeed(t)).pipe(S.flatMap((e) => n.success ? w.decodeUnknown(n.success)(e) : S.succeed(e))).pipe(S.tapErrorCause((t) => S.promise(() =>
|
|
4277
|
+
})))), r = yield* (n.handle ? n.handle(t) : S.succeed(t)).pipe(S.flatMap((e) => n.success ? w.decodeUnknown(n.success)(e) : S.succeed(e))).pipe(S.tapErrorCause((t) => S.promise(() => ki(l, {
|
|
4275
4278
|
runId: u,
|
|
4276
4279
|
eventType: "update-failed",
|
|
4277
4280
|
payload: {
|
|
4278
4281
|
updateId: e,
|
|
4279
4282
|
updateName: n.name,
|
|
4280
|
-
...
|
|
4283
|
+
...Ai(t)
|
|
4281
4284
|
}
|
|
4282
4285
|
}))));
|
|
4283
|
-
return yield* S.promise(() =>
|
|
4286
|
+
return yield* S.promise(() => ki(l, {
|
|
4284
4287
|
runId: u,
|
|
4285
4288
|
eventType: "update-completed",
|
|
4286
4289
|
payload: {
|
|
@@ -4298,7 +4301,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
4298
4301
|
success: n.success ?? n.schema,
|
|
4299
4302
|
execute: i
|
|
4300
4303
|
});
|
|
4301
|
-
},
|
|
4304
|
+
}, Mi = (e) => {
|
|
4302
4305
|
if (e == null) return null;
|
|
4303
4306
|
if (e instanceof Date) return e;
|
|
4304
4307
|
if (typeof e == "string" || typeof e == "number") {
|
|
@@ -4306,7 +4309,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
4306
4309
|
return Number.isNaN(t.getTime()) ? null : t;
|
|
4307
4310
|
}
|
|
4308
4311
|
return null;
|
|
4309
|
-
},
|
|
4312
|
+
}, Ni = (e) => typeof e == "number" ? e : e == null ? null : Number(e), Pi = (e) => e == null ? null : String(e), Fi = (e) => {
|
|
4310
4313
|
let t = /* @__PURE__ */ new Map();
|
|
4311
4314
|
for (let n of e) {
|
|
4312
4315
|
let e = String(n.stepName), r = t.get(e);
|
|
@@ -4314,27 +4317,27 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
4314
4317
|
}
|
|
4315
4318
|
let n = [];
|
|
4316
4319
|
for (let [e, r] of t) {
|
|
4317
|
-
r.sort((e, t) => (
|
|
4318
|
-
let t = r[r.length - 1], i =
|
|
4320
|
+
r.sort((e, t) => (Ni(e.attempt) ?? 0) - (Ni(t.attempt) ?? 0));
|
|
4321
|
+
let t = r[r.length - 1], i = Pi(t.errorTag), a = Pi(t.errorMessage), o = i !== null || a !== null ? {
|
|
4319
4322
|
tag: i,
|
|
4320
4323
|
message: a ?? ""
|
|
4321
4324
|
} : null;
|
|
4322
4325
|
n.push({
|
|
4323
4326
|
name: e,
|
|
4324
|
-
attempt:
|
|
4327
|
+
attempt: Ni(t.attempt) ?? r.length,
|
|
4325
4328
|
attempts: r.length,
|
|
4326
4329
|
status: t.status ?? "running",
|
|
4327
4330
|
input: t.input ?? null,
|
|
4328
4331
|
output: t.output ?? null,
|
|
4329
4332
|
error: o,
|
|
4330
|
-
durationMs:
|
|
4333
|
+
durationMs: Ni(t.durationMs)
|
|
4331
4334
|
});
|
|
4332
4335
|
}
|
|
4333
4336
|
return n.sort((t, n) => {
|
|
4334
4337
|
let r = e.find((e) => String(e.stepName) === t.name), i = e.find((e) => String(e.stepName) === n.name);
|
|
4335
|
-
return (
|
|
4338
|
+
return (Mi(r?.startedAt)?.getTime() ?? 0) - (Mi(i?.startedAt)?.getTime() ?? 0);
|
|
4336
4339
|
}), n;
|
|
4337
|
-
},
|
|
4340
|
+
}, Ii = (e) => {
|
|
4338
4341
|
if (e == null) return null;
|
|
4339
4342
|
if (typeof e == "string") try {
|
|
4340
4343
|
return JSON.parse(e);
|
|
@@ -4342,27 +4345,27 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
4342
4345
|
return null;
|
|
4343
4346
|
}
|
|
4344
4347
|
return typeof e == "object" ? e : null;
|
|
4345
|
-
},
|
|
4346
|
-
let n = ge(
|
|
4348
|
+
}, Li = async (e, t) => {
|
|
4349
|
+
let n = ge(we), r = (await t.query(n.where(he(O("id", e), O("executionId", e))).limit(1).descriptor))[0];
|
|
4347
4350
|
if (r === void 0) return null;
|
|
4348
|
-
let i = String(r.id), a = ge(
|
|
4351
|
+
let i = String(r.id), a = ge(Te), o = await t.query(a.where(O("runId", i)).descriptor);
|
|
4349
4352
|
return {
|
|
4350
4353
|
id: i,
|
|
4351
|
-
executionId:
|
|
4352
|
-
name:
|
|
4354
|
+
executionId: Pi(r.executionId) ?? "",
|
|
4355
|
+
name: Pi(r.tag) ?? "",
|
|
4353
4356
|
status: r.status ?? "running",
|
|
4354
4357
|
input: r.payload ?? null,
|
|
4355
4358
|
output: r.output ?? null,
|
|
4356
|
-
subject:
|
|
4357
|
-
source:
|
|
4358
|
-
steps:
|
|
4359
|
-
startedAt:
|
|
4360
|
-
finishedAt:
|
|
4361
|
-
traceId:
|
|
4362
|
-
parentExecutionId:
|
|
4363
|
-
parentClosePolicy:
|
|
4359
|
+
subject: Ii(r.subject),
|
|
4360
|
+
source: Pi(r.source),
|
|
4361
|
+
steps: Fi(o),
|
|
4362
|
+
startedAt: Mi(r.startedAt) ?? /* @__PURE__ */ new Date(0),
|
|
4363
|
+
finishedAt: Mi(r.completedAt),
|
|
4364
|
+
traceId: Pi(r.traceId),
|
|
4365
|
+
parentExecutionId: Pi(r.parentExecutionId),
|
|
4366
|
+
parentClosePolicy: Pi(r.parentClosePolicy)
|
|
4364
4367
|
};
|
|
4365
|
-
},
|
|
4368
|
+
}, Ri = () => {
|
|
4366
4369
|
let e = [], t = [], n = 0, i = 0;
|
|
4367
4370
|
return {
|
|
4368
4371
|
layer: se.succeed(r, {
|
|
@@ -4412,13 +4415,13 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
4412
4415
|
readSteps: () => e,
|
|
4413
4416
|
readEvents: () => t
|
|
4414
4417
|
};
|
|
4415
|
-
},
|
|
4416
|
-
let r = yield*
|
|
4418
|
+
}, zi = (e, t, n) => S.gen(function* () {
|
|
4419
|
+
let r = yield* Se;
|
|
4417
4420
|
for (;;) {
|
|
4418
4421
|
if (yield* S.tryPromise(() => g(t, e)).pipe(S.catchAll(() => S.sync(() => (n(), !1))))) return r.interrupted = !0, yield* S.interrupt;
|
|
4419
4422
|
yield* S.sleep(1e3);
|
|
4420
4423
|
}
|
|
4421
|
-
}),
|
|
4424
|
+
}), Bi = 8192, Vi = 3, Hi = 2e3, Ui = () => {
|
|
4422
4425
|
let e = (e) => {
|
|
4423
4426
|
if (e === void 0) return;
|
|
4424
4427
|
let t = Number(e);
|
|
@@ -4428,7 +4431,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
4428
4431
|
...t === void 0 ? {} : { maxRunReclaims: t },
|
|
4429
4432
|
...n === void 0 ? {} : { replayShapeLimit: n }
|
|
4430
4433
|
};
|
|
4431
|
-
},
|
|
4434
|
+
}, Wi = (e) => {
|
|
4432
4435
|
let t = typeof e == "string" ? (() => {
|
|
4433
4436
|
try {
|
|
4434
4437
|
return JSON.parse(e);
|
|
@@ -4437,10 +4440,10 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
4437
4440
|
}
|
|
4438
4441
|
})() : e;
|
|
4439
4442
|
if (Array.isArray(t)) return t.filter((e) => typeof e == "string");
|
|
4440
|
-
},
|
|
4443
|
+
}, Gi = () => {
|
|
4441
4444
|
let e = globalThis.crypto;
|
|
4442
4445
|
return typeof e?.randomUUID == "function" ? e.randomUUID() : `${Date.now().toString(36)}${Math.random().toString(36).slice(2)}`;
|
|
4443
|
-
},
|
|
4446
|
+
}, Ki = (e) => `${e}_${Gi()}`, qi = (e, t = Bi) => {
|
|
4444
4447
|
if (e == null) return e;
|
|
4445
4448
|
try {
|
|
4446
4449
|
let n = JSON.stringify(e);
|
|
@@ -4456,8 +4459,8 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
4456
4459
|
let t = {};
|
|
4457
4460
|
for (let [n, r] of Object.entries(e)) t[n] = r instanceof Date ? r.toISOString() : r;
|
|
4458
4461
|
return t;
|
|
4459
|
-
},
|
|
4460
|
-
let t = e.truncateBytes ??
|
|
4462
|
+
}, Ji = (e) => {
|
|
4463
|
+
let t = e.truncateBytes ?? Bi, n = e.makeId ?? Ki, r = (t, n) => e.log?.warn(t, n), i = e.encryptStepPayload ?? ((e) => e), a = e.emit, o = e.recording === "coarse";
|
|
4461
4464
|
return {
|
|
4462
4465
|
startStep: async ({ runId: s, stepName: c, attempt: l, stepInput: u, retryPolicy: d }) => {
|
|
4463
4466
|
if (!o) try {
|
|
@@ -4467,7 +4470,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
4467
4470
|
stepName: c,
|
|
4468
4471
|
attempt: l,
|
|
4469
4472
|
status: "running",
|
|
4470
|
-
input: u === void 0 ? null : i(
|
|
4473
|
+
input: u === void 0 ? null : i(qi(u, t)),
|
|
4471
4474
|
retryPolicy: d ?? null,
|
|
4472
4475
|
output: null,
|
|
4473
4476
|
errorTag: null,
|
|
@@ -4494,7 +4497,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
4494
4497
|
if (!o) try {
|
|
4495
4498
|
let r = await e.store.update("_voltro_workflow_run_steps", n, {
|
|
4496
4499
|
status: "succeeded",
|
|
4497
|
-
output: i(
|
|
4500
|
+
output: i(qi(s, t)),
|
|
4498
4501
|
completedAt: /* @__PURE__ */ new Date(),
|
|
4499
4502
|
durationMs: c
|
|
4500
4503
|
});
|
|
@@ -4515,7 +4518,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
4515
4518
|
status: "failed",
|
|
4516
4519
|
errorTag: s,
|
|
4517
4520
|
errorMessage: c,
|
|
4518
|
-
errorCause: l === void 0 ? null : i(
|
|
4521
|
+
errorCause: l === void 0 ? null : i(qi(l, t)),
|
|
4519
4522
|
completedAt: /* @__PURE__ */ new Date(),
|
|
4520
4523
|
durationMs: u
|
|
4521
4524
|
});
|
|
@@ -4563,7 +4566,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
4563
4566
|
};
|
|
4564
4567
|
}
|
|
4565
4568
|
};
|
|
4566
|
-
},
|
|
4569
|
+
}, Yi = (e, t, n) => S.gen(function* () {
|
|
4567
4570
|
let r = e.store.query;
|
|
4568
4571
|
if (r === void 0) return;
|
|
4569
4572
|
let i = e.replayShapeLimit ?? 2e3, a = yield* S.promise(() => r.call(e.store, {
|
|
@@ -4593,8 +4596,8 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
4593
4596
|
return typeof t == "string" ? [{ stepName: t }] : [];
|
|
4594
4597
|
});
|
|
4595
4598
|
return o.length === 0 ? void 0 : s(o);
|
|
4596
|
-
}),
|
|
4597
|
-
let u = s.truncateBytes ??
|
|
4599
|
+
}), Xi = (s, l) => {
|
|
4600
|
+
let u = s.truncateBytes ?? Bi, d = s.makeId ?? Ki, f = s.recorder ?? Ji(s), p = (e, t) => s.log?.warn(e, t), m = s.emit, g = (e) => S.gen(function* () {
|
|
4598
4601
|
yield* S.sync(() => m?.("workflowEvents", {
|
|
4599
4602
|
op: "insert",
|
|
4600
4603
|
row: $(e)
|
|
@@ -4648,7 +4651,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
4648
4651
|
executionId: y,
|
|
4649
4652
|
reason: n?.message ?? String(n)
|
|
4650
4653
|
});
|
|
4651
|
-
}))), D = `wfrg_${
|
|
4654
|
+
}))), D = `wfrg_${Gi()}`, le = yield* S.serviceOption(h), ue = d("wr"), O = yield* S.sync(() => s.encodePayload === void 0 ? ee : s.encodePayload(ee)), k = yield* S.promise(() => s.transaction((e) => bn(e, {
|
|
4652
4655
|
workflowName: s.name,
|
|
4653
4656
|
executionId: y,
|
|
4654
4657
|
generation: D,
|
|
@@ -4676,7 +4679,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
4676
4679
|
})));
|
|
4677
4680
|
if (typeof k.row.id != "string") return yield* S.die(/* @__PURE__ */ Error("Recorded workflow entry has no run identity"));
|
|
4678
4681
|
if (T = k.row.id, k.kind === "cancelled" || k.kind === "already-cancelled") {
|
|
4679
|
-
let e = yield*
|
|
4682
|
+
let e = yield* Se;
|
|
4680
4683
|
return e.interrupted = !0, k.kind === "cancelled" && (yield* E("failed to observe suspended workflow cancellation", S.gen(function* () {
|
|
4681
4684
|
if (m?.("workflowRuns", {
|
|
4682
4685
|
op: "update",
|
|
@@ -4695,7 +4698,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
4695
4698
|
handler: null,
|
|
4696
4699
|
callerContext: null,
|
|
4697
4700
|
tenantId: null
|
|
4698
|
-
}, n = yield* S.promise(() => s.transaction((n) =>
|
|
4701
|
+
}, n = yield* S.promise(() => s.transaction((n) => Tn(n, {
|
|
4699
4702
|
owner: {
|
|
4700
4703
|
runId: T,
|
|
4701
4704
|
workflowName: s.name,
|
|
@@ -4728,12 +4731,12 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
4728
4731
|
}
|
|
4729
4732
|
let j = s.workflowPatches ?? [], fe;
|
|
4730
4733
|
if (A?.id !== void 0) {
|
|
4731
|
-
T = A.id, j =
|
|
4734
|
+
T = A.id, j = Wi(A.workflowPatches) ?? j;
|
|
4732
4735
|
let e = k.row.reclaimCount;
|
|
4733
4736
|
if (typeof e != "number" || !Number.isSafeInteger(e) || e < 0) return yield* S.die(/* @__PURE__ */ Error("Recorded workflow entry has an invalid reclaim counter"));
|
|
4734
4737
|
let t = e > 0, n = s.maxRunReclaims ?? 3;
|
|
4735
4738
|
if (t && e >= n) {
|
|
4736
|
-
let t = `Workflow '${s.name}' run '${y}' killed its runner ${e} times in a row; parked instead of reclaimed again (maxRunReclaims=${n}).`, r = yield* S.promise(() => s.transaction((e) =>
|
|
4739
|
+
let t = `Workflow '${s.name}' run '${y}' killed its runner ${e} times in a row; parked instead of reclaimed again (maxRunReclaims=${n}).`, r = yield* S.promise(() => s.transaction((e) => Cn(e, {
|
|
4737
4740
|
runId: T,
|
|
4738
4741
|
workflowName: s.name,
|
|
4739
4742
|
executionId: y,
|
|
@@ -4763,10 +4766,10 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
4763
4766
|
reclaimCount: e,
|
|
4764
4767
|
maxRunReclaims: n
|
|
4765
4768
|
}));
|
|
4766
|
-
let i = yield*
|
|
4769
|
+
let i = yield* Se;
|
|
4767
4770
|
return yield* ne.suspend(i);
|
|
4768
4771
|
}
|
|
4769
|
-
fe = yield*
|
|
4772
|
+
fe = yield* Yi(s, T, p), yield* E("failed to record workflow re-entry", S.gen(function* () {
|
|
4770
4773
|
m?.("workflowRuns", {
|
|
4771
4774
|
op: "update",
|
|
4772
4775
|
row: $(k.row)
|
|
@@ -4801,7 +4804,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
4801
4804
|
}));
|
|
4802
4805
|
}
|
|
4803
4806
|
}));
|
|
4804
|
-
let M = s.subject?.tenantId, pe = S.suspend(() => l(ee, y, D)).pipe(S.locally(t, T), S.locally(i, y), S.locally(a, D), S.locally(n, typeof M == "string" ? M : void 0), S.locally(o, j), S.locally(c, fe), S.provideService(r, f)), N = s.pluginWorkflowStepLayer ? pe.pipe(S.provide(s.pluginWorkflowStepLayer)) : pe, P = yield* ne.intoResult(S.raceWith(N,
|
|
4807
|
+
let M = s.subject?.tenantId, pe = S.suspend(() => l(ee, y, D)).pipe(S.locally(t, T), S.locally(i, y), S.locally(a, D), S.locally(n, typeof M == "string" ? M : void 0), S.locally(o, j), S.locally(c, fe), S.provideService(r, f)), N = s.pluginWorkflowStepLayer ? pe.pipe(S.provide(s.pluginWorkflowStepLayer)) : pe, P = yield* ne.intoResult(S.raceWith(N, zi({
|
|
4805
4808
|
runId: T,
|
|
4806
4809
|
workflowName: s.name,
|
|
4807
4810
|
executionId: y,
|
|
@@ -4814,7 +4817,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
4814
4817
|
onOtherDone: (e, t) => ae.interrupt(t).pipe(S.zipRight(e))
|
|
4815
4818
|
}));
|
|
4816
4819
|
if (ne.isResult(P) && P._tag === "Suspended") {
|
|
4817
|
-
let e = P.cause, t = e !== void 0 && !x.isEmpty(e), n = t ? x.squash(e) : void 0, r = n && typeof n == "object" && "_tag" in n ? String(n._tag) : null, i = t ? n?.message ?? String(n) : null, a = yield* S.promise(() => s.transaction((e) =>
|
|
4820
|
+
let e = P.cause, t = e !== void 0 && !x.isEmpty(e), n = t ? x.squash(e) : void 0, r = n && typeof n == "object" && "_tag" in n ? String(n._tag) : null, i = t ? n?.message ?? String(n) : null, a = yield* S.promise(() => s.transaction((e) => Cn(e, {
|
|
4818
4821
|
runId: T,
|
|
4819
4822
|
workflowName: s.name,
|
|
4820
4823
|
executionId: y,
|
|
@@ -4848,7 +4851,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
4848
4851
|
} : { reason: "workflow-suspend" }
|
|
4849
4852
|
}));
|
|
4850
4853
|
})));
|
|
4851
|
-
let o = yield*
|
|
4854
|
+
let o = yield* Se;
|
|
4852
4855
|
return yield* ne.suspend(o);
|
|
4853
4856
|
}
|
|
4854
4857
|
let me = P;
|
|
@@ -4872,8 +4875,8 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
4872
4875
|
}
|
|
4873
4876
|
if (ie.isFailure(me.exit)) {
|
|
4874
4877
|
let e = me.exit.cause;
|
|
4875
|
-
if ((yield*
|
|
4876
|
-
let t = Date.now(), n = yield* S.promise(() => s.transaction((e) =>
|
|
4878
|
+
if ((yield* Se).interrupted && x.isInterruptedOnly(e)) {
|
|
4879
|
+
let t = Date.now(), n = yield* S.promise(() => s.transaction((e) => Tn(e, {
|
|
4877
4880
|
owner: {
|
|
4878
4881
|
runId: T,
|
|
4879
4882
|
workflowName: s.name,
|
|
@@ -4899,7 +4902,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
4899
4902
|
handler: null,
|
|
4900
4903
|
callerContext: null,
|
|
4901
4904
|
tenantId: null
|
|
4902
|
-
}, c = yield* S.promise(() => s.transaction((e) =>
|
|
4905
|
+
}, c = yield* S.promise(() => s.transaction((e) => Tn(e, {
|
|
4903
4906
|
owner: {
|
|
4904
4907
|
runId: T,
|
|
4905
4908
|
workflowName: s.name,
|
|
@@ -4940,7 +4943,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
4940
4943
|
durationMs: Date.now() - b
|
|
4941
4944
|
})), yield* S.failCause(e)) : yield* S.failCause(e);
|
|
4942
4945
|
}
|
|
4943
|
-
let he = me.exit.value, ge = Date.now(), _e = yield* S.promise(() => s.transaction((e) =>
|
|
4946
|
+
let he = me.exit.value, ge = Date.now(), _e = yield* S.promise(() => s.transaction((e) => Tn(e, {
|
|
4944
4947
|
owner: {
|
|
4945
4948
|
runId: T,
|
|
4946
4949
|
workflowName: s.name,
|
|
@@ -4951,7 +4954,7 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
4951
4954
|
durationMs: ge - b,
|
|
4952
4955
|
outcome: {
|
|
4953
4956
|
status: "succeeded",
|
|
4954
|
-
output:
|
|
4957
|
+
output: qi(he, u)
|
|
4955
4958
|
}
|
|
4956
4959
|
})));
|
|
4957
4960
|
return _e.kind === "committed" ? (T && (yield* E("failed to record workflow success", S.gen(function* () {
|
|
@@ -4968,4 +4971,4 @@ var gn = "_voltro_workflow_runs", _n = w.NullOr(w.Struct({
|
|
|
4968
4971
|
});
|
|
4969
4972
|
};
|
|
4970
4973
|
//#endregion
|
|
4971
|
-
export {
|
|
4974
|
+
export { Yn as $, $e as $t, Qr as A, sn as At, lr as B, Mt as Bt, fi as C, on as Ct, ri as D, Rt as Dt, ni as E, Vt as Et, Gr as F, Ht as Ft, er as G, Ct as Gt, ur as H, Tt as Ht, Wr as I, an as It, Zn as J, vt as Jt, tr as K, V as Kt, kr as L, Pt as Lt, Hr as M, Bt as Mt, Jr as N, Y as Nt, ai as O, Xt as Ot, qr as P, Jt as Pt, Xn as Q, z as Qt, zr as R, jt as Rt, Si as S, Ce as Sn, Yt as St, li as T, Kt as Tt, vr as U, wt as Ut, dr as V, xt as Vt, $n as W, gt as Wt, cr as X, B as Xt, ir as Y, yt as Yt, ar as Z, lt as Zt, gi as _, Me as _n, Zt as _t, Ui as a, We as an, zn as at, Di as b, Te as bn, $t as bt, Xi as c, ze as cn, Sn as ct, ji as d, Ae as dn, mn as dt, Be as en, qn as et, Q as f, je as fn, pn as ft, _i as g, Ne as gn, U as gt, vi as h, Pe as hn, Ft as ht, Wi as i, Je as in, Hn as it, Xr as j, Ut as jt, oi as k, Gt as kt, Ri as l, Oe as ln, Tn as lt, xi as m, Ie as mn, Lt as mt, Hi as n, Ge as nn, Kn as nt, $ as o, He as on, Bn as ot, bi as p, ke as pn, W as pt, Qn as q, Et as qt, Ji as r, Ye as rn, Vn as rt, qi as s, Ue as sn, En as st, Vi as t, Xe as tn, Wn as tt, Li as u, Fe as un, bn as ut, hi as v, De as vn, rn as vt, pi as w, nn as wt, Ei as x, we as xn, en as xt, Oi as y, Ee as yn, Qt as yt, jr as z, Nt as zt };
|