@voltro/workflow 0.82.0 → 0.83.1
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 +361 -0
- package/dist/{cluster-MboOAwcv.js → cluster--WvQZFwk.js} +171 -138
- package/dist/cluster.d.ts +7 -4
- package/dist/cluster.js +1 -1
- package/dist/{clusterDiagnostics-Dc7yBP3b.js → clusterDiagnostics-CGUtnJkX.js} +145 -130
- package/dist/clusterTestSuite.d.ts +1 -1
- package/dist/clusterTestSuite.js +2 -2
- package/dist/index.d.ts +27 -0
- package/dist/index.js +3 -3
- package/dist/{src-BAN5Xovf.js → src-DP-lKqaG.js} +859 -852
- package/package.json +4 -4
|
@@ -1,179 +1,180 @@
|
|
|
1
1
|
import { E as e, F as t, L as n, M as r, N as i, P as a, R as o, T as s, w as c } from "./primitives-Btjhjm8P.js";
|
|
2
2
|
import { S as l, T as u, _ as d, a as f, b as p, g as m, h, i as g, l as _, n as v, u as y, v as ee, x as b } from "./journalEncryption--n5VDdYO.js";
|
|
3
|
-
import { $ as x, A as te, At as ne,
|
|
4
|
-
import { DurableClock as
|
|
5
|
-
import { Cause as
|
|
3
|
+
import { $ as x, A as te, At as ne, C as re, Ct as ie, D as ae, Dt as S, E as C, Et as w, F as oe, Ft as se, H as ce, Ht as T, I as E, It as le, J as ue, Kt as D, L as de, Mt as fe, N as O, Nt as k, O as pe, Pt as me, Q as A, Rt as j, S as he, T as ge, Tt as M, U as _e, Ut as ve, V as ye, Z as be, _t as xe, bt as Se, ct as Ce, ft as N, gt as we, h as Te, i as Ee, it as De, jt as Oe, k as ke, kt as Ae, ot as je, pt as Me, q as Ne, qt as Pe, rt as P, st as Fe, tt as Ie, v as Le, vt as Re, w as ze, wt as Be, xt as Ve, y as He, yt as Ue } from "./clusterDiagnostics-CGUtnJkX.js";
|
|
4
|
+
import { DurableClock as We, DurableDeferred as Ge, Workflow as Ke, WorkflowEngine as qe } from "@effect/workflow";
|
|
5
|
+
import { Cause as F, Context as Je, Effect as I, Either as L, Exit as Ye, Fiber as Xe, FiberRef as Ze, Layer as Qe, Schema as R } from "effect";
|
|
6
6
|
import { WorkflowQueuedCancellationResultSchema as $e, publishServerError as et } from "@voltro/protocol";
|
|
7
|
-
import { and as
|
|
7
|
+
import { and as z, boolean as tt, derivedRowId as nt, eq as B, generateId as rt, gt as V, gte as it, id as H, inSet as at, integer as U, isNotNull as ot, isNull as W, json as G, lt as st, or as ct, queryFor as lt, real as ut, reference as dt, registerRetention as ft, retentionTtlMsFromEnv as pt, table as K, text as q, timestamp as J } from "@voltro/database";
|
|
8
8
|
import { createHash as mt, randomUUID as ht } from "node:crypto";
|
|
9
|
-
import { WorkflowInstance as
|
|
9
|
+
import { WorkflowInstance as Y } from "@effect/workflow/WorkflowEngine";
|
|
10
10
|
//#region src/inMemoryLayer.ts
|
|
11
|
-
var gt =
|
|
12
|
-
id:
|
|
13
|
-
tag:
|
|
14
|
-
executionId:
|
|
15
|
-
status:
|
|
11
|
+
var gt = qe.layerMemory, _t = K("_voltro_workflow_runs", {
|
|
12
|
+
id: H({ prefix: "wfrun" }),
|
|
13
|
+
tag: q(),
|
|
14
|
+
executionId: q().unique(),
|
|
15
|
+
status: q().oneOf([
|
|
16
16
|
"running",
|
|
17
17
|
"succeeded",
|
|
18
18
|
"failed",
|
|
19
19
|
"cancelled",
|
|
20
20
|
"suspended"
|
|
21
21
|
]).default("running"),
|
|
22
|
-
payload:
|
|
23
|
-
workflowVersion:
|
|
24
|
-
workflowPatches:
|
|
25
|
-
runnerEnteredAt:
|
|
26
|
-
runnerGeneration:
|
|
27
|
-
engineDelivery:
|
|
28
|
-
reclaimCount:
|
|
29
|
-
output:
|
|
30
|
-
subject:
|
|
31
|
-
source:
|
|
32
|
-
errorTag:
|
|
33
|
-
errorMessage:
|
|
22
|
+
payload: G(),
|
|
23
|
+
workflowVersion: q().nullable(),
|
|
24
|
+
workflowPatches: G().nullable(),
|
|
25
|
+
runnerEnteredAt: J().nullable(),
|
|
26
|
+
runnerGeneration: q().nullable(),
|
|
27
|
+
engineDelivery: G().nullable(),
|
|
28
|
+
reclaimCount: U().default(0),
|
|
29
|
+
output: G().nullable(),
|
|
30
|
+
subject: G().nullable(),
|
|
31
|
+
source: q().nullable(),
|
|
32
|
+
errorTag: q().nullable(),
|
|
33
|
+
errorMessage: q().nullable(),
|
|
34
34
|
cancelled: tt().default(!1),
|
|
35
|
-
discardedAt:
|
|
36
|
-
discardedBy:
|
|
37
|
-
startedAt:
|
|
38
|
-
completedAt:
|
|
39
|
-
durationMs:
|
|
40
|
-
traceId:
|
|
41
|
-
parentExecutionId:
|
|
42
|
-
parentGeneration:
|
|
43
|
-
parentClosePolicy:
|
|
35
|
+
discardedAt: J().nullable(),
|
|
36
|
+
discardedBy: q().nullable(),
|
|
37
|
+
startedAt: J().default("now"),
|
|
38
|
+
completedAt: J().nullable(),
|
|
39
|
+
durationMs: U().nullable(),
|
|
40
|
+
traceId: q().nullable(),
|
|
41
|
+
parentExecutionId: q().nullable(),
|
|
42
|
+
parentGeneration: q().nullable(),
|
|
43
|
+
parentClosePolicy: q().oneOf([
|
|
44
44
|
"cancel",
|
|
45
45
|
"terminate",
|
|
46
46
|
"abandon"
|
|
47
47
|
]).nullable()
|
|
48
|
-
}).index(["tag"]).index(["status"]).index(["source"]).index(["startedAt"]).index(["parentExecutionId"]).index(["parentClosePolicy"]), vt =
|
|
49
|
-
id:
|
|
48
|
+
}).index(["tag"]).index(["status"]).index(["source"]).index(["startedAt"]).index(["parentExecutionId"]).index(["parentClosePolicy"]), vt = K("_voltro_workflow_run_steps", {
|
|
49
|
+
id: H({ prefix: "wfstep" }),
|
|
50
50
|
runId: dt(() => _t, {
|
|
51
51
|
index: !1,
|
|
52
52
|
onDelete: "cascade"
|
|
53
53
|
}),
|
|
54
|
-
stepName:
|
|
55
|
-
attempt:
|
|
56
|
-
status:
|
|
54
|
+
stepName: q(),
|
|
55
|
+
attempt: U().default(1),
|
|
56
|
+
status: q().oneOf([
|
|
57
57
|
"running",
|
|
58
58
|
"succeeded",
|
|
59
59
|
"failed"
|
|
60
60
|
]).default("running"),
|
|
61
|
-
input:
|
|
62
|
-
retryPolicy:
|
|
63
|
-
output:
|
|
64
|
-
errorTag:
|
|
65
|
-
errorMessage:
|
|
66
|
-
errorCause:
|
|
67
|
-
startedAt:
|
|
68
|
-
completedAt:
|
|
69
|
-
durationMs:
|
|
70
|
-
}).index(["runId", "stepName"]).index(["startedAt"]), yt =
|
|
71
|
-
id:
|
|
61
|
+
input: G().nullable(),
|
|
62
|
+
retryPolicy: G().nullable(),
|
|
63
|
+
output: G().nullable(),
|
|
64
|
+
errorTag: q().nullable(),
|
|
65
|
+
errorMessage: q().nullable(),
|
|
66
|
+
errorCause: G().nullable(),
|
|
67
|
+
startedAt: J().default("now"),
|
|
68
|
+
completedAt: J().nullable(),
|
|
69
|
+
durationMs: U().nullable()
|
|
70
|
+
}).index(["runId", "stepName"]).index(["startedAt"]), yt = K("_voltro_workflow_run_events", {
|
|
71
|
+
id: H({ prefix: "wfev" }),
|
|
72
72
|
runId: dt(() => _t, {
|
|
73
73
|
index: !1,
|
|
74
74
|
onDelete: "cascade"
|
|
75
75
|
}),
|
|
76
|
-
eventType:
|
|
77
|
-
payload:
|
|
78
|
-
occurredAt:
|
|
79
|
-
stepName:
|
|
80
|
-
attempt:
|
|
81
|
-
}).index(["runId", "occurredAt"]).index(["eventType"]), bt =
|
|
82
|
-
id:
|
|
83
|
-
workflowName:
|
|
84
|
-
executionId:
|
|
85
|
-
subject:
|
|
86
|
-
traceId:
|
|
87
|
-
source:
|
|
88
|
-
parentExecutionId:
|
|
89
|
-
parentGeneration:
|
|
90
|
-
parentClosePolicy:
|
|
76
|
+
eventType: q(),
|
|
77
|
+
payload: G().nullable(),
|
|
78
|
+
occurredAt: J().default("now"),
|
|
79
|
+
stepName: q().nullable(),
|
|
80
|
+
attempt: U().nullable()
|
|
81
|
+
}).index(["runId", "occurredAt"]).index(["eventType"]), bt = K("_voltro_workflow_start_contexts", {
|
|
82
|
+
id: H({ prefix: "wfctx" }),
|
|
83
|
+
workflowName: q(),
|
|
84
|
+
executionId: q().unique(),
|
|
85
|
+
subject: G().nullable(),
|
|
86
|
+
traceId: q().nullable(),
|
|
87
|
+
source: q().nullable(),
|
|
88
|
+
parentExecutionId: q().nullable(),
|
|
89
|
+
parentGeneration: q().nullable(),
|
|
90
|
+
parentClosePolicy: q().oneOf([
|
|
91
91
|
"cancel",
|
|
92
92
|
"terminate",
|
|
93
93
|
"abandon"
|
|
94
94
|
]).nullable(),
|
|
95
|
-
createdAt:
|
|
96
|
-
}).index(["workflowName"]).index(["executionId"]).index(["parentExecutionId"]), xt =
|
|
97
|
-
id:
|
|
98
|
-
nonce:
|
|
99
|
-
}).nonReactive(), St =
|
|
100
|
-
id:
|
|
101
|
-
runId:
|
|
102
|
-
workflowName:
|
|
103
|
-
executionId:
|
|
104
|
-
generation:
|
|
105
|
-
parentStatus:
|
|
95
|
+
createdAt: J().default("now")
|
|
96
|
+
}).index(["workflowName"]).index(["executionId"]).index(["parentExecutionId"]), xt = K("_voltro_workflow_admission_locks", {
|
|
97
|
+
id: H({ prefix: "wfalk" }),
|
|
98
|
+
nonce: q()
|
|
99
|
+
}).nonReactive(), St = K("_voltro_workflow_parent_closures", {
|
|
100
|
+
id: H({ prefix: "wfpc" }),
|
|
101
|
+
runId: q(),
|
|
102
|
+
workflowName: q(),
|
|
103
|
+
executionId: q(),
|
|
104
|
+
generation: q(),
|
|
105
|
+
parentStatus: q().oneOf([
|
|
106
106
|
"succeeded",
|
|
107
107
|
"failed",
|
|
108
108
|
"cancelled"
|
|
109
109
|
]),
|
|
110
|
-
closedAt:
|
|
111
|
-
afterChildId:
|
|
110
|
+
closedAt: J(),
|
|
111
|
+
afterChildId: q().nullable(),
|
|
112
112
|
scanHasOpenChildren: tt().default(!1),
|
|
113
|
-
completedAt:
|
|
114
|
-
}).index(["executionId"]).index(["completedAt", "id"]).nonReactive(), Ct =
|
|
115
|
-
id:
|
|
116
|
-
runId:
|
|
117
|
-
workflowName:
|
|
118
|
-
executionId:
|
|
119
|
-
generation:
|
|
120
|
-
operation:
|
|
113
|
+
completedAt: J().nullable()
|
|
114
|
+
}).index(["executionId"]).index(["completedAt", "id"]).nonReactive(), Ct = K("_voltro_workflow_control_requests", {
|
|
115
|
+
id: H({ prefix: "wfctl" }),
|
|
116
|
+
runId: q(),
|
|
117
|
+
workflowName: q(),
|
|
118
|
+
executionId: q(),
|
|
119
|
+
generation: q(),
|
|
120
|
+
operation: q().oneOf([
|
|
121
121
|
"cancel",
|
|
122
122
|
"terminate",
|
|
123
123
|
"resume"
|
|
124
124
|
]),
|
|
125
|
-
requestedAt:
|
|
126
|
-
owner:
|
|
127
|
-
cause:
|
|
128
|
-
parentClosureId:
|
|
129
|
-
resumeJournal:
|
|
130
|
-
dispatchAttempts:
|
|
131
|
-
result:
|
|
132
|
-
}).index(["runId"]).index(["parentClosureId", "id"]).nonReactive(), wt =
|
|
133
|
-
id:
|
|
134
|
-
workflowName:
|
|
135
|
-
tenantId:
|
|
136
|
-
sourceId:
|
|
137
|
-
sourceKind:
|
|
125
|
+
requestedAt: J(),
|
|
126
|
+
owner: G().nullable(),
|
|
127
|
+
cause: G().nullable(),
|
|
128
|
+
parentClosureId: q().nullable(),
|
|
129
|
+
resumeJournal: G().nullable(),
|
|
130
|
+
dispatchAttempts: U().default(0),
|
|
131
|
+
result: G().nullable()
|
|
132
|
+
}).index(["runId"]).index(["parentClosureId", "id"]).nonReactive(), wt = K("_voltro_workflow_failure_reports", {
|
|
133
|
+
id: H({ prefix: "wffr" }),
|
|
134
|
+
workflowName: q(),
|
|
135
|
+
tenantId: q().nullable(),
|
|
136
|
+
sourceId: q(),
|
|
137
|
+
sourceKind: q().oneOf([
|
|
138
138
|
"submission",
|
|
139
139
|
"intent",
|
|
140
140
|
"run"
|
|
141
141
|
]),
|
|
142
|
-
handler:
|
|
143
|
-
callerContext:
|
|
144
|
-
report:
|
|
145
|
-
handoffReceiptId:
|
|
146
|
-
handoffAttempt:
|
|
147
|
-
acceptedExecutionId:
|
|
148
|
-
}).index(["sourceKind", "sourceId"]).nonReactive(), Tt =
|
|
149
|
-
id:
|
|
150
|
-
workflowName:
|
|
151
|
-
tenantId:
|
|
152
|
-
ledgerId:
|
|
153
|
-
executionId:
|
|
154
|
-
runId:
|
|
142
|
+
handler: q().nullable(),
|
|
143
|
+
callerContext: G().nullable(),
|
|
144
|
+
report: G(),
|
|
145
|
+
handoffReceiptId: q().nullable(),
|
|
146
|
+
handoffAttempt: U().default(0),
|
|
147
|
+
acceptedExecutionId: q().nullable()
|
|
148
|
+
}).index(["sourceKind", "sourceId"]).nonReactive(), Tt = K("_voltro_workflow_submissions", {
|
|
149
|
+
id: H({ prefix: "wfsub" }),
|
|
150
|
+
workflowName: q(),
|
|
151
|
+
tenantId: q().nullable(),
|
|
152
|
+
ledgerId: q(),
|
|
153
|
+
executionId: q().nullable(),
|
|
154
|
+
runId: q().nullable(),
|
|
155
155
|
receiptsBound: tt().default(!1),
|
|
156
|
-
preparedExecutionId:
|
|
157
|
-
dispatchAttempts:
|
|
158
|
-
failureId:
|
|
159
|
-
retry:
|
|
160
|
-
payload:
|
|
161
|
-
callerContext:
|
|
162
|
-
intentIds:
|
|
163
|
-
eviction:
|
|
164
|
-
}).nonReactive(), Et =
|
|
165
|
-
id:
|
|
166
|
-
workflowName:
|
|
167
|
-
tenantId:
|
|
168
|
-
pendingId:
|
|
169
|
-
submissionId:
|
|
170
|
-
terminal:
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
156
|
+
preparedExecutionId: q().nullable(),
|
|
157
|
+
dispatchAttempts: U().default(0),
|
|
158
|
+
failureId: q().nullable(),
|
|
159
|
+
retry: G(),
|
|
160
|
+
payload: G(),
|
|
161
|
+
callerContext: G().nullable(),
|
|
162
|
+
intentIds: G(),
|
|
163
|
+
eviction: G().nullable()
|
|
164
|
+
}).nonReactive(), Et = K("_voltro_workflow_start_receipts", {
|
|
165
|
+
id: H({ prefix: "wfrc" }),
|
|
166
|
+
workflowName: q(),
|
|
167
|
+
tenantId: q().nullable(),
|
|
168
|
+
pendingId: q().maxLength(64),
|
|
169
|
+
submissionId: q().maxLength(64).nullable(),
|
|
170
|
+
terminal: G().nullable(),
|
|
171
|
+
requestFingerprint: q().maxLength(64).nullable()
|
|
172
|
+
}).index(["pendingId"]).nonReactive(), Dt = K("_voltro_workflow_pending", {
|
|
173
|
+
id: H({ prefix: "wfp" }),
|
|
174
|
+
tenantId: q().nullable(),
|
|
175
|
+
workflowName: q(),
|
|
176
|
+
controlKey: q(),
|
|
177
|
+
mode: q().oneOf([
|
|
177
178
|
"debounce",
|
|
178
179
|
"batch",
|
|
179
180
|
"throttle",
|
|
@@ -181,24 +182,24 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
181
182
|
"paused",
|
|
182
183
|
"delayed"
|
|
183
184
|
]),
|
|
184
|
-
payload:
|
|
185
|
-
callerContext:
|
|
186
|
-
queuedAppVersion:
|
|
187
|
-
queuedSchemaFingerprint:
|
|
188
|
-
priority:
|
|
189
|
-
dueAt:
|
|
190
|
-
deadlineAt:
|
|
191
|
-
collapsed:
|
|
192
|
-
firstSeenAt:
|
|
193
|
-
updatedAt:
|
|
194
|
-
attempts:
|
|
195
|
-
lastError:
|
|
196
|
-
deadLetteredAt:
|
|
197
|
-
}).index(["workflowName", "controlKey"]).index(["dueAt"]).index(["workflowName", "mode"]).index(["tenantId"]), Ot =
|
|
198
|
-
id:
|
|
199
|
-
tenantId:
|
|
200
|
-
workflowName:
|
|
201
|
-
outcome:
|
|
185
|
+
payload: G(),
|
|
186
|
+
callerContext: G().nullable(),
|
|
187
|
+
queuedAppVersion: q().nullable(),
|
|
188
|
+
queuedSchemaFingerprint: q().nullable(),
|
|
189
|
+
priority: U().default(0),
|
|
190
|
+
dueAt: J(),
|
|
191
|
+
deadlineAt: J().nullable(),
|
|
192
|
+
collapsed: U().default(1),
|
|
193
|
+
firstSeenAt: J().default("now"),
|
|
194
|
+
updatedAt: J().default("now"),
|
|
195
|
+
attempts: U().default(0),
|
|
196
|
+
lastError: q().nullable(),
|
|
197
|
+
deadLetteredAt: J().nullable()
|
|
198
|
+
}).index(["workflowName", "controlKey"]).index(["dueAt"]).index(["workflowName", "mode"]).index(["tenantId"]), Ot = K("_voltro_workflow_admissions", {
|
|
199
|
+
id: H({ prefix: "wfadm" }),
|
|
200
|
+
tenantId: q().nullable(),
|
|
201
|
+
workflowName: q(),
|
|
202
|
+
outcome: q().oneOf([
|
|
202
203
|
"admitted",
|
|
203
204
|
"dropped",
|
|
204
205
|
"skipped",
|
|
@@ -206,34 +207,34 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
206
207
|
"expired",
|
|
207
208
|
"discarded"
|
|
208
209
|
]),
|
|
209
|
-
mode:
|
|
210
|
-
reason:
|
|
211
|
-
collapsed:
|
|
210
|
+
mode: q().nullable(),
|
|
211
|
+
reason: q().nullable(),
|
|
212
|
+
collapsed: U().default(1),
|
|
212
213
|
waitedMs: ut().nullable().narrowedFrom("integer"),
|
|
213
|
-
executionId:
|
|
214
|
-
runId:
|
|
215
|
-
singletonKey:
|
|
216
|
-
concurrencyKey:
|
|
217
|
-
concurrencyReservation:
|
|
218
|
-
rateKey:
|
|
219
|
-
admittedAt:
|
|
220
|
-
expiresAt:
|
|
221
|
-
releasedAt:
|
|
222
|
-
}).index(["workflowName", "admittedAt"]).index(["concurrencyKey", "releasedAt"]).index(["singletonKey", "releasedAt"]).index(["rateKey", "admittedAt"]).index(["executionId"]).index(["tenantId"]), kt =
|
|
223
|
-
id:
|
|
224
|
-
pausedAt:
|
|
225
|
-
pausedBy:
|
|
226
|
-
reason:
|
|
214
|
+
executionId: q().nullable(),
|
|
215
|
+
runId: q().nullable(),
|
|
216
|
+
singletonKey: q().nullable(),
|
|
217
|
+
concurrencyKey: q().nullable(),
|
|
218
|
+
concurrencyReservation: G().nullable(),
|
|
219
|
+
rateKey: q().nullable(),
|
|
220
|
+
admittedAt: J().default("now"),
|
|
221
|
+
expiresAt: J().nullable(),
|
|
222
|
+
releasedAt: J().nullable()
|
|
223
|
+
}).index(["workflowName", "admittedAt"]).index(["concurrencyKey", "releasedAt"]).index(["singletonKey", "releasedAt"]).index(["rateKey", "admittedAt"]).index(["executionId"]).index(["tenantId"]), kt = K("_voltro_workflow_pauses", {
|
|
224
|
+
id: H({ prefix: "wfpause" }),
|
|
225
|
+
pausedAt: J().default("now"),
|
|
226
|
+
pausedBy: q().nullable(),
|
|
227
|
+
reason: q().nullable()
|
|
227
228
|
}), At = async (e, t) => {
|
|
228
229
|
if (!Number.isFinite(t.now) || !Number.isFinite(new Date(t.now).getTime())) throw Error("Queued cancellation requires a valid timestamp");
|
|
229
|
-
let n = await
|
|
230
|
+
let n = await Ce(e, t.receiptId);
|
|
230
231
|
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");
|
|
231
232
|
if (n.terminal !== null) return {
|
|
232
233
|
kind: "terminal",
|
|
233
234
|
outcome: n.terminal
|
|
234
235
|
};
|
|
235
236
|
if (n.submissionId !== null) {
|
|
236
|
-
let t = await
|
|
237
|
+
let t = await M(e, n.submissionId);
|
|
237
238
|
if (t === void 0 || !t.receiptsBound || t.workflowName !== n.workflowName || t.tenantId !== n.tenantId || !t.intentIds.includes(n.pendingId)) throw Error("Queued cancellation receipt has no matching submission");
|
|
238
239
|
return {
|
|
239
240
|
kind: "submitted",
|
|
@@ -241,8 +242,8 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
241
242
|
};
|
|
242
243
|
}
|
|
243
244
|
let [r] = await e.query({
|
|
244
|
-
table:
|
|
245
|
-
predicate:
|
|
245
|
+
table: O,
|
|
246
|
+
predicate: B("id", n.pendingId),
|
|
246
247
|
lock: "update",
|
|
247
248
|
order: [],
|
|
248
249
|
take: 1,
|
|
@@ -250,7 +251,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
250
251
|
projection: void 0
|
|
251
252
|
});
|
|
252
253
|
if (r === void 0) throw Error("Queued cancellation has no pending input or submission");
|
|
253
|
-
let i =
|
|
254
|
+
let i = P(r);
|
|
254
255
|
if (i.workflowName !== n.workflowName || i.tenantId !== n.tenantId || i.deadLetteredAt !== void 0) throw Error("Queued cancellation input has contradictory ownership or is dead-lettered");
|
|
255
256
|
let a = {
|
|
256
257
|
kind: "cancelled",
|
|
@@ -266,31 +267,31 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
266
267
|
kind: "terminal",
|
|
267
268
|
outcome: a
|
|
268
269
|
};
|
|
269
|
-
}, jt = "_voltro_workflow_parent_closures",
|
|
270
|
-
id:
|
|
271
|
-
runId:
|
|
272
|
-
workflowName:
|
|
273
|
-
executionId:
|
|
274
|
-
generation:
|
|
275
|
-
parentStatus:
|
|
276
|
-
closedAt:
|
|
277
|
-
afterChildId:
|
|
278
|
-
scanHasOpenChildren:
|
|
279
|
-
completedAt:
|
|
280
|
-
}), Nt =
|
|
281
|
-
id:
|
|
282
|
-
tag:
|
|
283
|
-
executionId:
|
|
284
|
-
status:
|
|
285
|
-
runnerGeneration:
|
|
286
|
-
parentGeneration:
|
|
287
|
-
parentClosePolicy:
|
|
270
|
+
}, jt = "_voltro_workflow_parent_closures", X = R.NonEmptyString, Mt = R.Struct({
|
|
271
|
+
id: X,
|
|
272
|
+
runId: X,
|
|
273
|
+
workflowName: X,
|
|
274
|
+
executionId: X,
|
|
275
|
+
generation: X,
|
|
276
|
+
parentStatus: R.Literal("succeeded", "failed", "cancelled"),
|
|
277
|
+
closedAt: R.DateFromSelf,
|
|
278
|
+
afterChildId: R.NullOr(X),
|
|
279
|
+
scanHasOpenChildren: R.Boolean,
|
|
280
|
+
completedAt: R.NullOr(R.DateFromSelf)
|
|
281
|
+
}), Nt = R.Struct({
|
|
282
|
+
id: X,
|
|
283
|
+
tag: X,
|
|
284
|
+
executionId: X,
|
|
285
|
+
status: R.Literal("running", "suspended", "succeeded", "failed", "cancelled"),
|
|
286
|
+
runnerGeneration: R.optional(R.NullOr(X)),
|
|
287
|
+
parentGeneration: R.optional(R.NullOr(X)),
|
|
288
|
+
parentClosePolicy: R.NullOr(R.Literal("cancel", "terminate", "abandon"))
|
|
288
289
|
}), Pt = async (e, t, n) => {
|
|
289
290
|
if (t.parentClosePolicy !== "cancel" && t.parentClosePolicy !== "terminate") return !1;
|
|
290
291
|
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");
|
|
291
292
|
let r = n ?? (await e.query({
|
|
292
293
|
table: jt,
|
|
293
|
-
predicate:
|
|
294
|
+
predicate: z(B("executionId", t.parentExecutionId), B("generation", t.parentGeneration)),
|
|
294
295
|
lock: "update",
|
|
295
296
|
order: [],
|
|
296
297
|
take: 1,
|
|
@@ -298,19 +299,19 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
298
299
|
projection: void 0
|
|
299
300
|
}))[0];
|
|
300
301
|
if (r === void 0) return !1;
|
|
301
|
-
let i =
|
|
302
|
+
let i = R.decodeUnknownSync(Mt)(r);
|
|
302
303
|
if (i.executionId !== t.parentExecutionId || i.generation !== t.parentGeneration) return !1;
|
|
303
|
-
let a =
|
|
304
|
+
let a = R.decodeUnknownSync(Nt)(t), o = nt("wfctl", JSON.stringify([
|
|
304
305
|
"parent-close",
|
|
305
306
|
i.id,
|
|
306
307
|
a.id
|
|
307
|
-
])), s = await
|
|
308
|
+
])), s = await ae(e, o);
|
|
308
309
|
if (s !== void 0) {
|
|
309
310
|
if (s.runId !== a.id || s.workflowName !== a.tag || s.executionId !== a.executionId || s.operation === "resume" || s.cause?.reason !== "parent-close" || s.cause.detail?.closureId !== i.id) throw Error("Parent closure receipt belongs to another child");
|
|
310
311
|
} else {
|
|
311
312
|
if (a.status !== "running" && a.status !== "suspended") return !1;
|
|
312
313
|
if (a.runnerGeneration === void 0 || a.runnerGeneration === null) throw Error("Child entry requires its own generation");
|
|
313
|
-
await
|
|
314
|
+
await He(e, {
|
|
314
315
|
id: o,
|
|
315
316
|
runId: a.id,
|
|
316
317
|
workflowName: a.tag,
|
|
@@ -335,7 +336,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
335
336
|
}, Ft = async (e, t, n = Date.now()) => {
|
|
336
337
|
let [r] = await e.query({
|
|
337
338
|
table: jt,
|
|
338
|
-
predicate:
|
|
339
|
+
predicate: B("id", t),
|
|
339
340
|
lock: "update",
|
|
340
341
|
order: [],
|
|
341
342
|
take: 1,
|
|
@@ -343,7 +344,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
343
344
|
projection: void 0
|
|
344
345
|
});
|
|
345
346
|
if (r === void 0) throw Error("Parent closure is missing");
|
|
346
|
-
let i =
|
|
347
|
+
let i = R.decodeUnknownSync(Mt)(r);
|
|
347
348
|
if (i.completedAt !== null) return {
|
|
348
349
|
scanned: 0,
|
|
349
350
|
controls: 0,
|
|
@@ -352,7 +353,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
352
353
|
if (!Number.isFinite(n)) throw Error("Parent closure requires a finite completion timestamp");
|
|
353
354
|
let a = await e.query({
|
|
354
355
|
table: "_voltro_workflow_runs",
|
|
355
|
-
predicate:
|
|
356
|
+
predicate: z(B("parentExecutionId", i.executionId), ...i.afterChildId === null ? [] : [V("id", i.afterChildId)]),
|
|
356
357
|
lock: "update",
|
|
357
358
|
order: [{
|
|
358
359
|
column: "id",
|
|
@@ -363,10 +364,10 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
363
364
|
projection: void 0
|
|
364
365
|
}), o = 0, s = i.scanHasOpenChildren, c = null;
|
|
365
366
|
for (let t of a) {
|
|
366
|
-
let r =
|
|
367
|
+
let r = R.decodeUnknownSync(Nt)(t);
|
|
367
368
|
if (c = r.id, r.parentClosePolicy !== null && r.parentClosePolicy !== "abandon") {
|
|
368
369
|
if (r.parentGeneration === void 0 || r.parentGeneration === null) throw Error("Parent closure cannot attribute a child without its parent generation");
|
|
369
|
-
r.parentGeneration === i.generation && ((r.status === "running" || r.status === "suspended") && (s = !0), await Pt(e, t, i) && (o++, r.status === "suspended" && typeof r.runnerGeneration == "string" && await
|
|
370
|
+
r.parentGeneration === i.generation && ((r.status === "running" || r.status === "suspended") && (s = !0), await Pt(e, t, i) && (o++, r.status === "suspended" && typeof r.runnerGeneration == "string" && await Ht(e, {
|
|
370
371
|
runId: r.id,
|
|
371
372
|
workflowName: r.tag,
|
|
372
373
|
executionId: r.executionId,
|
|
@@ -374,7 +375,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
374
375
|
}, n)));
|
|
375
376
|
}
|
|
376
377
|
}
|
|
377
|
-
let l = a.length < 100, u = l && !s && !await
|
|
378
|
+
let l = a.length < 100, u = l && !s && !await ze(e, i.id);
|
|
378
379
|
if (await e.update(jt, i.id, {
|
|
379
380
|
afterChildId: l ? null : c,
|
|
380
381
|
scanHasOpenChildren: !l && s,
|
|
@@ -385,19 +386,19 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
385
386
|
controls: o,
|
|
386
387
|
wrapped: l
|
|
387
388
|
};
|
|
388
|
-
},
|
|
389
|
-
requestId:
|
|
390
|
-
restartToken:
|
|
391
|
-
})),
|
|
389
|
+
}, It = "_voltro_workflow_runs", Lt = R.NullOr(R.Struct({
|
|
390
|
+
requestId: R.NonEmptyString,
|
|
391
|
+
restartToken: R.NullOr(R.NonEmptyString)
|
|
392
|
+
})), Rt = async (e, t, n, r) => {
|
|
392
393
|
if (typeof t.id != "string") throw Error("Child entry has no allocated run identity");
|
|
393
394
|
let i = {
|
|
394
395
|
runId: t.id,
|
|
395
396
|
workflowName: n.workflowName,
|
|
396
397
|
executionId: n.executionId,
|
|
397
398
|
generation: n.generation
|
|
398
|
-
}, a = await
|
|
399
|
+
}, a = await rn(e, i), o = await Pt(e, t);
|
|
399
400
|
if (!a && !o) return;
|
|
400
|
-
let s = await
|
|
401
|
+
let s = await Wt(e, {
|
|
401
402
|
owner: i,
|
|
402
403
|
now: n.now,
|
|
403
404
|
durationMs: 0,
|
|
@@ -410,43 +411,43 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
410
411
|
previous: r,
|
|
411
412
|
terminalEvent: s.terminalEvent
|
|
412
413
|
};
|
|
413
|
-
},
|
|
414
|
-
let n = await
|
|
414
|
+
}, zt = async (e, t) => {
|
|
415
|
+
let n = await Ee(e, t);
|
|
415
416
|
return {
|
|
416
|
-
...await
|
|
417
|
+
...await Rt(e, n.row, t, n.previous) ?? {
|
|
417
418
|
kind: "entered",
|
|
418
419
|
row: n.row,
|
|
419
420
|
previous: n.previous
|
|
420
421
|
},
|
|
421
422
|
restartEvent: n.event
|
|
422
423
|
};
|
|
423
|
-
},
|
|
424
|
+
}, Bt = async (e, t) => {
|
|
424
425
|
if ([
|
|
425
426
|
t.workflowName,
|
|
426
427
|
t.executionId,
|
|
427
428
|
t.generation
|
|
428
429
|
].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");
|
|
429
430
|
let n = (await e.query({
|
|
430
|
-
table:
|
|
431
|
-
predicate:
|
|
431
|
+
table: It,
|
|
432
|
+
predicate: B("executionId", t.executionId),
|
|
432
433
|
lock: "update",
|
|
433
434
|
order: [],
|
|
434
435
|
take: 1,
|
|
435
436
|
skip: void 0,
|
|
436
437
|
projection: void 0
|
|
437
|
-
}))[0], r =
|
|
438
|
+
}))[0], r = R.decodeUnknownSync(Lt)(t.delivery ?? null), i = (r) => Rt(e, r, t, n);
|
|
438
439
|
if (n === void 0) {
|
|
439
440
|
if (r !== null && r.restartToken !== null) throw Error("Workflow restart delivery has no resident authorization");
|
|
440
441
|
if ((await e.query({
|
|
441
442
|
table: "_voltro_workflow_parent_closures",
|
|
442
|
-
predicate:
|
|
443
|
+
predicate: B("executionId", t.executionId),
|
|
443
444
|
lock: "update",
|
|
444
445
|
order: [],
|
|
445
446
|
take: 1,
|
|
446
447
|
skip: void 0,
|
|
447
448
|
projection: ["id"]
|
|
448
449
|
})).length !== 0) throw Error("Workflow execution is already terminal; restore its engine journal instead of re-entering the body");
|
|
449
|
-
let n = await e.insert(
|
|
450
|
+
let n = await e.insert(It, {
|
|
450
451
|
...t.initialRow,
|
|
451
452
|
tag: t.workflowName,
|
|
452
453
|
executionId: t.executionId,
|
|
@@ -463,9 +464,9 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
463
464
|
};
|
|
464
465
|
}
|
|
465
466
|
if (n.tag !== t.workflowName || typeof n.id != "string") throw Error("Workflow entry execution belongs to a different resident run");
|
|
466
|
-
let a =
|
|
467
|
+
let a = R.decodeUnknownSync(Lt)(n.engineDelivery ?? null);
|
|
467
468
|
if (a?.requestId !== r?.requestId || a?.restartToken !== r?.restartToken) {
|
|
468
|
-
if (n.status === "failed" && r !== null && r.restartToken !== null && a?.requestId === r.requestId) return
|
|
469
|
+
if (n.status === "failed" && r !== null && r.restartToken !== null && a?.requestId === r.requestId) return zt(e, {
|
|
469
470
|
runId: n.id,
|
|
470
471
|
workflowName: t.workflowName,
|
|
471
472
|
executionId: t.executionId,
|
|
@@ -488,8 +489,8 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
488
489
|
executionId: t.executionId,
|
|
489
490
|
generation: n.runnerGeneration
|
|
490
491
|
};
|
|
491
|
-
if (await
|
|
492
|
-
let i = await
|
|
492
|
+
if (await re(e, r)) {
|
|
493
|
+
let i = await Wt(e, {
|
|
493
494
|
owner: r,
|
|
494
495
|
now: t.now,
|
|
495
496
|
durationMs: 0,
|
|
@@ -513,7 +514,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
513
514
|
if (typeof s != "number" || !Number.isSafeInteger(s) || s < 0) throw Error("Workflow entry has an invalid resident reclaim counter");
|
|
514
515
|
let c = o ? s + 1 : 0;
|
|
515
516
|
if (!Number.isSafeInteger(c)) throw Error("Workflow reclaim counter exhausted");
|
|
516
|
-
let l = await e.update(
|
|
517
|
+
let l = await e.update(It, n.id, {
|
|
517
518
|
runnerGeneration: t.generation,
|
|
518
519
|
runnerEnteredAt: new Date(t.now),
|
|
519
520
|
reclaimCount: c,
|
|
@@ -525,7 +526,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
525
526
|
});
|
|
526
527
|
if (l === null) throw Error("Workflow run disappeared while entering its new generation");
|
|
527
528
|
let u = await i(l);
|
|
528
|
-
return u === void 0 ? (n.status === "suspended" && n.runnerEnteredAt === null && typeof n.runnerGeneration == "string" && await
|
|
529
|
+
return u === void 0 ? (n.status === "suspended" && n.runnerEnteredAt === null && typeof n.runnerGeneration == "string" && await ke(e, {
|
|
529
530
|
runId: n.id,
|
|
530
531
|
workflowName: t.workflowName,
|
|
531
532
|
executionId: t.executionId,
|
|
@@ -535,7 +536,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
535
536
|
row: l,
|
|
536
537
|
previous: n
|
|
537
538
|
}) : u;
|
|
538
|
-
},
|
|
539
|
+
}, Vt = async (e, t) => {
|
|
539
540
|
if ([
|
|
540
541
|
t.runId,
|
|
541
542
|
t.workflowName,
|
|
@@ -543,8 +544,8 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
543
544
|
t.generation
|
|
544
545
|
].some((e) => e.length === 0)) throw Error("Workflow runner ownership requires non-empty identities");
|
|
545
546
|
let n = (await e.query({
|
|
546
|
-
table:
|
|
547
|
-
predicate:
|
|
547
|
+
table: It,
|
|
548
|
+
predicate: B("id", t.runId),
|
|
548
549
|
lock: "update",
|
|
549
550
|
order: [],
|
|
550
551
|
take: 1,
|
|
@@ -553,21 +554,21 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
553
554
|
}))[0];
|
|
554
555
|
if (n === void 0 || n.tag !== t.workflowName || n.executionId !== t.executionId) throw Error("Workflow runner ownership does not match its resident run");
|
|
555
556
|
return n;
|
|
556
|
-
},
|
|
557
|
-
let r = await
|
|
558
|
-
if (r.runnerGeneration !== t.generation || r.status !== "suspended" || r.runnerEnteredAt !== null || !await
|
|
559
|
-
if ((await
|
|
557
|
+
}, Ht = async (e, t, n) => {
|
|
558
|
+
let r = await Vt(e, t);
|
|
559
|
+
if (r.runnerGeneration !== t.generation || r.status !== "suspended" || r.runnerEnteredAt !== null || !await re(e, t)) return !1;
|
|
560
|
+
if ((await Wt(e, {
|
|
560
561
|
owner: t,
|
|
561
562
|
now: n,
|
|
562
563
|
durationMs: 0,
|
|
563
564
|
outcome: { status: "cancelled" }
|
|
564
565
|
}, "suspended")).kind !== "committed") throw Error("Suspended cancellation lost its resident owner");
|
|
565
566
|
return !0;
|
|
566
|
-
},
|
|
567
|
-
let r = await
|
|
567
|
+
}, Ut = async (e, t, n) => {
|
|
568
|
+
let r = await Vt(e, t);
|
|
568
569
|
if (r.runnerGeneration !== t.generation) return { kind: "superseded" };
|
|
569
570
|
if (r.status !== "running") return { kind: "not-running" };
|
|
570
|
-
let i = await e.update(
|
|
571
|
+
let i = await e.update(It, t.runId, {
|
|
571
572
|
status: "suspended",
|
|
572
573
|
runnerEnteredAt: null,
|
|
573
574
|
errorTag: n.errorTag,
|
|
@@ -578,8 +579,8 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
578
579
|
kind: "committed",
|
|
579
580
|
row: i
|
|
580
581
|
};
|
|
581
|
-
},
|
|
582
|
-
let r = await
|
|
582
|
+
}, Wt = async (e, t, n) => {
|
|
583
|
+
let r = await Vt(e, t.owner);
|
|
583
584
|
if (r.runnerGeneration !== t.owner.generation) return { kind: "superseded" };
|
|
584
585
|
if (r.status !== n) return { kind: "not-running" };
|
|
585
586
|
if (!Number.isFinite(t.now) || !Number.isFinite(t.durationMs) || t.durationMs < 0) throw Error("Workflow completion requires finite time and non-negative duration");
|
|
@@ -589,13 +590,13 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
589
590
|
t.owner.workflowName,
|
|
590
591
|
t.owner.runId,
|
|
591
592
|
t.owner.generation
|
|
592
|
-
])).digest("hex").slice(0, 40)}`, await
|
|
593
|
+
])).digest("hex").slice(0, 40)}`, await j(e, {
|
|
593
594
|
id: a,
|
|
594
595
|
sourceKind: "run",
|
|
595
596
|
sourceId: t.owner.runId,
|
|
596
597
|
workflowName: t.owner.workflowName,
|
|
597
598
|
tenantId: i.tenantId,
|
|
598
|
-
handler: await
|
|
599
|
+
handler: await k(e, t.owner.executionId, t.owner.workflowName, i.tenantId) ? null : i.handler,
|
|
599
600
|
callerContext: i.callerContext,
|
|
600
601
|
report: {
|
|
601
602
|
workflow: t.owner.workflowName,
|
|
@@ -607,28 +608,28 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
607
608
|
reason: "the run failed",
|
|
608
609
|
failedAt: t.now
|
|
609
610
|
}
|
|
610
|
-
}), await
|
|
611
|
-
let n = (await
|
|
611
|
+
}), await fe(e, a, t.now)), i.status === "cancelled") {
|
|
612
|
+
let n = (await C((t) => e.query({
|
|
612
613
|
...t,
|
|
613
614
|
lock: "update"
|
|
614
615
|
}), t.owner)).map((e) => ({
|
|
615
616
|
request: e,
|
|
616
|
-
cause:
|
|
617
|
+
cause: he(e)
|
|
617
618
|
})).find((e) => e.cause !== void 0);
|
|
618
619
|
if (n !== void 0 && n.cause !== void 0) {
|
|
619
|
-
let i =
|
|
620
|
+
let i = R.decodeUnknownOption(R.Struct({ tenantId: R.NullOr(R.String) }))(r.subject), o = n.request.owner?.tenantId ?? (i._tag === "Some" ? i.value.tenantId : null);
|
|
620
621
|
a = `wffr_${mt("sha256").update(JSON.stringify([
|
|
621
622
|
"finish-timeout",
|
|
622
623
|
t.owner.workflowName,
|
|
623
624
|
t.owner.runId,
|
|
624
625
|
t.owner.generation
|
|
625
|
-
])).digest("hex").slice(0, 40)}`, await
|
|
626
|
+
])).digest("hex").slice(0, 40)}`, await j(e, {
|
|
626
627
|
id: a,
|
|
627
628
|
sourceKind: "run",
|
|
628
629
|
sourceId: t.owner.runId,
|
|
629
630
|
workflowName: t.owner.workflowName,
|
|
630
631
|
tenantId: o,
|
|
631
|
-
handler: await
|
|
632
|
+
handler: await k(e, t.owner.executionId, t.owner.workflowName, o) ? null : n.cause.detail.onFailure,
|
|
632
633
|
callerContext: {
|
|
633
634
|
subject: r.subject ?? null,
|
|
634
635
|
traceId: r.traceId ?? null,
|
|
@@ -647,10 +648,10 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
647
648
|
reason: n.cause.reason,
|
|
648
649
|
failedAt: t.now
|
|
649
650
|
}
|
|
650
|
-
}), await
|
|
651
|
+
}), await fe(e, a, t.now);
|
|
651
652
|
}
|
|
652
653
|
}
|
|
653
|
-
let o = await e.update(
|
|
654
|
+
let o = await e.update(It, t.owner.runId, {
|
|
654
655
|
status: i.status,
|
|
655
656
|
completedAt: new Date(t.now),
|
|
656
657
|
durationMs: t.durationMs,
|
|
@@ -694,11 +695,11 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
694
695
|
} : {}
|
|
695
696
|
}
|
|
696
697
|
});
|
|
697
|
-
await
|
|
698
|
-
for await (let n of
|
|
698
|
+
await pe(e, t), await x(e, t.owner.executionId, t.now);
|
|
699
|
+
for await (let n of Ue(e, t.owner.executionId, t.owner.workflowName)) {
|
|
699
700
|
let [r] = await e.query({
|
|
700
701
|
table: te,
|
|
701
|
-
predicate:
|
|
702
|
+
predicate: B("id", n.ledgerId),
|
|
702
703
|
lock: "update",
|
|
703
704
|
order: [],
|
|
704
705
|
take: 1,
|
|
@@ -714,49 +715,49 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
714
715
|
failureId: a,
|
|
715
716
|
terminalEvent: s
|
|
716
717
|
};
|
|
717
|
-
},
|
|
718
|
-
id:
|
|
719
|
-
receiptId:
|
|
720
|
-
workflowName:
|
|
721
|
-
tenantId:
|
|
722
|
-
requestedAt:
|
|
723
|
-
cause:
|
|
724
|
-
target:
|
|
725
|
-
controlBinding:
|
|
726
|
-
}).index(["receiptId"]).index(["workflowName", "id"]).nonReactive(),
|
|
727
|
-
reason:
|
|
728
|
-
detail:
|
|
729
|
-
key:
|
|
730
|
-
value:
|
|
718
|
+
}, Gt = (e, t) => Wt(e, t, "running"), Kt = K("_voltro_workflow_queued_cancellations", {
|
|
719
|
+
id: H({ prefix: "wfqc" }),
|
|
720
|
+
receiptId: q(),
|
|
721
|
+
workflowName: q(),
|
|
722
|
+
tenantId: q().nullable(),
|
|
723
|
+
requestedAt: J(),
|
|
724
|
+
cause: G().nullable(),
|
|
725
|
+
target: G(),
|
|
726
|
+
controlBinding: G().nullable()
|
|
727
|
+
}).index(["receiptId"]).index(["workflowName", "id"]).nonReactive(), qt = R.NullOr(R.Struct({
|
|
728
|
+
reason: R.NonEmptyString,
|
|
729
|
+
detail: R.optional(R.Record({
|
|
730
|
+
key: R.String,
|
|
731
|
+
value: R.Unknown
|
|
731
732
|
}))
|
|
732
|
-
})),
|
|
733
|
-
id:
|
|
734
|
-
receiptId:
|
|
735
|
-
workflowName:
|
|
736
|
-
tenantId:
|
|
737
|
-
requestedAt:
|
|
738
|
-
cause:
|
|
739
|
-
controlBinding:
|
|
740
|
-
controlId:
|
|
741
|
-
runId:
|
|
742
|
-
executionId:
|
|
743
|
-
generation:
|
|
733
|
+
})), Jt = R.Struct({
|
|
734
|
+
id: R.NonEmptyString,
|
|
735
|
+
receiptId: R.NonEmptyString,
|
|
736
|
+
workflowName: R.NonEmptyString,
|
|
737
|
+
tenantId: R.NullOr(R.String),
|
|
738
|
+
requestedAt: R.DateFromSelf,
|
|
739
|
+
cause: qt,
|
|
740
|
+
controlBinding: R.NullOr(R.Struct({
|
|
741
|
+
controlId: R.NonEmptyString,
|
|
742
|
+
runId: R.NonEmptyString,
|
|
743
|
+
executionId: R.NonEmptyString,
|
|
744
|
+
generation: R.NonEmptyString
|
|
744
745
|
})),
|
|
745
|
-
target:
|
|
746
|
-
kind:
|
|
747
|
-
submissionId:
|
|
748
|
-
}),
|
|
749
|
-
kind:
|
|
750
|
-
receipt:
|
|
746
|
+
target: R.Union(R.Struct({
|
|
747
|
+
kind: R.Literal("submission"),
|
|
748
|
+
submissionId: R.NonEmptyString
|
|
749
|
+
}), R.Struct({
|
|
750
|
+
kind: R.Literal("terminal"),
|
|
751
|
+
receipt: R.Unknown
|
|
751
752
|
}))
|
|
752
|
-
}),
|
|
753
|
-
let t =
|
|
753
|
+
}), Yt = (e) => {
|
|
754
|
+
let t = R.decodeUnknownSync(Jt)(e);
|
|
754
755
|
if (!Number.isFinite(t.requestedAt.getTime())) throw Error("Queued cancellation request has an invalid timestamp");
|
|
755
756
|
if (t.target.kind === "submission") return {
|
|
756
757
|
...t,
|
|
757
758
|
target: t.target
|
|
758
759
|
};
|
|
759
|
-
let n =
|
|
760
|
+
let n = Fe(t.target.receipt);
|
|
760
761
|
if (t.controlBinding !== null) throw Error("A non-executed start cannot have a run control binding");
|
|
761
762
|
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");
|
|
762
763
|
return {
|
|
@@ -766,44 +767,44 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
766
767
|
receipt: n
|
|
767
768
|
}
|
|
768
769
|
};
|
|
769
|
-
},
|
|
770
|
+
}, Xt = async (e, t) => {
|
|
770
771
|
let [n] = await e.query({
|
|
771
|
-
table:
|
|
772
|
-
predicate:
|
|
772
|
+
table: Kt.tableName,
|
|
773
|
+
predicate: B("id", t),
|
|
773
774
|
lock: "update",
|
|
774
775
|
order: [],
|
|
775
776
|
take: 1,
|
|
776
777
|
skip: void 0,
|
|
777
778
|
projection: void 0
|
|
778
779
|
});
|
|
779
|
-
return n === void 0 ? void 0 :
|
|
780
|
-
},
|
|
780
|
+
return n === void 0 ? void 0 : Yt(n);
|
|
781
|
+
}, Zt = async (e, t) => {
|
|
781
782
|
let n = t.controlBinding;
|
|
782
783
|
if (n === null) throw Error("Queued cancellation has no control binding");
|
|
783
|
-
let r = await
|
|
784
|
+
let r = await ae(e, n.controlId);
|
|
784
785
|
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");
|
|
785
786
|
return r;
|
|
786
|
-
},
|
|
787
|
+
}, Qt = async (e, t, n) => {
|
|
787
788
|
if (t.controlBinding === null) return;
|
|
788
|
-
let r = await
|
|
789
|
+
let r = await Zt(e, t);
|
|
789
790
|
if (r.result !== null) return;
|
|
790
791
|
let [i] = await e.query({
|
|
791
792
|
table: "_voltro_workflow_runs",
|
|
792
|
-
predicate:
|
|
793
|
+
predicate: B("id", r.runId),
|
|
793
794
|
lock: "update",
|
|
794
795
|
order: [],
|
|
795
796
|
take: 1,
|
|
796
797
|
skip: void 0,
|
|
797
798
|
projection: void 0
|
|
798
799
|
});
|
|
799
|
-
i !== void 0 && await
|
|
800
|
+
i !== void 0 && await Ht(e, {
|
|
800
801
|
runId: r.runId,
|
|
801
802
|
workflowName: r.workflowName,
|
|
802
803
|
executionId: r.executionId,
|
|
803
804
|
generation: r.generation
|
|
804
805
|
}, n);
|
|
805
|
-
},
|
|
806
|
-
let n = await
|
|
806
|
+
}, $t = async (e, t) => {
|
|
807
|
+
let n = await Xt(e, t.requestId);
|
|
807
808
|
if (n === void 0) return {
|
|
808
809
|
kind: "unknown",
|
|
809
810
|
reason: "missing-request"
|
|
@@ -819,7 +820,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
819
820
|
};
|
|
820
821
|
}
|
|
821
822
|
if (n.controlBinding !== null) {
|
|
822
|
-
let t = await
|
|
823
|
+
let t = await Zt(e, n);
|
|
823
824
|
if (t.result !== null) return {
|
|
824
825
|
kind: t.result.kind,
|
|
825
826
|
request: n,
|
|
@@ -827,7 +828,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
827
828
|
};
|
|
828
829
|
let [r] = await e.query({
|
|
829
830
|
table: "_voltro_workflow_runs",
|
|
830
|
-
predicate:
|
|
831
|
+
predicate: B("id", t.runId),
|
|
831
832
|
lock: "update",
|
|
832
833
|
order: [],
|
|
833
834
|
take: 1,
|
|
@@ -853,7 +854,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
853
854
|
run: r
|
|
854
855
|
};
|
|
855
856
|
}
|
|
856
|
-
let r = await
|
|
857
|
+
let r = await M(e, n.target.submissionId);
|
|
857
858
|
if (r === void 0 || !r.receiptsBound || r.workflowName !== n.workflowName || r.tenantId !== n.tenantId) throw Error("Queued cancellation has no matching submission evidence");
|
|
858
859
|
return r.failureId === null ? r.retry.stoppedAt !== null || r.runId !== null ? {
|
|
859
860
|
kind: "unknown",
|
|
@@ -867,10 +868,10 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
867
868
|
request: n,
|
|
868
869
|
outcome: {
|
|
869
870
|
kind: "rejected",
|
|
870
|
-
failureId: await
|
|
871
|
+
failureId: await Me(e, r)
|
|
871
872
|
}
|
|
872
873
|
};
|
|
873
|
-
},
|
|
874
|
+
}, en = (e, t) => {
|
|
874
875
|
let n = "request" in t ? t.request : void 0;
|
|
875
876
|
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");
|
|
876
877
|
let r = {
|
|
@@ -879,7 +880,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
879
880
|
receiptId: e.receiptId,
|
|
880
881
|
requestId: n?.id ?? null,
|
|
881
882
|
kind: t.kind
|
|
882
|
-
}, i =
|
|
883
|
+
}, i = R.decodeUnknownSync($e);
|
|
883
884
|
if (t.kind === "unknown") return i({
|
|
884
885
|
...r,
|
|
885
886
|
observation: {
|
|
@@ -918,14 +919,14 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
918
919
|
...r,
|
|
919
920
|
observation: { kind: "pending" }
|
|
920
921
|
});
|
|
921
|
-
},
|
|
922
|
-
let n =
|
|
923
|
-
id:
|
|
924
|
-
receiptId:
|
|
925
|
-
workflowName:
|
|
926
|
-
tenantId:
|
|
927
|
-
requestedAt:
|
|
928
|
-
cause:
|
|
922
|
+
}, tn = async (e, t) => {
|
|
923
|
+
let n = R.decodeUnknownSync(R.Struct({
|
|
924
|
+
id: R.NonEmptyString,
|
|
925
|
+
receiptId: R.NonEmptyString,
|
|
926
|
+
workflowName: R.NonEmptyString,
|
|
927
|
+
tenantId: R.NullOr(R.String),
|
|
928
|
+
requestedAt: R.DateFromSelf,
|
|
929
|
+
cause: qt
|
|
929
930
|
}))({
|
|
930
931
|
id: t.requestId,
|
|
931
932
|
receiptId: t.receiptId,
|
|
@@ -935,10 +936,10 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
935
936
|
cause: t.cause ?? null
|
|
936
937
|
});
|
|
937
938
|
if (!Number.isFinite(n.requestedAt.getTime())) throw Error("Queued cancellation request requires a valid timestamp");
|
|
938
|
-
let r = await
|
|
939
|
+
let r = await Xt(e, n.id);
|
|
939
940
|
if (r !== void 0) {
|
|
940
941
|
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");
|
|
941
|
-
return await
|
|
942
|
+
return await Qt(e, r, t.now), r;
|
|
942
943
|
}
|
|
943
944
|
let i = await At(e, t), a;
|
|
944
945
|
if (i.kind === "submitted") a = {
|
|
@@ -946,25 +947,25 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
946
947
|
submissionId: i.submissionId
|
|
947
948
|
};
|
|
948
949
|
else {
|
|
949
|
-
let n = await
|
|
950
|
+
let n = await Ce(e, t.receiptId);
|
|
950
951
|
if (n === void 0) throw Error("Cancelled start receipt disappeared during request acceptance");
|
|
951
952
|
a = {
|
|
952
953
|
kind: "terminal",
|
|
953
954
|
receipt: n
|
|
954
955
|
};
|
|
955
956
|
}
|
|
956
|
-
let o =
|
|
957
|
+
let o = Yt({
|
|
957
958
|
...n,
|
|
958
959
|
target: a,
|
|
959
960
|
controlBinding: null
|
|
960
961
|
});
|
|
961
|
-
if (await e.insert(
|
|
962
|
-
let n = await
|
|
962
|
+
if (await e.insert(Kt.tableName, o), a.kind === "submission") {
|
|
963
|
+
let n = await M(e, a.submissionId);
|
|
963
964
|
if (n === void 0) throw Error("Queued cancellation submission disappeared during acceptance");
|
|
964
965
|
if (n.preparedExecutionId !== null && n.dispatchAttempts > 0) {
|
|
965
966
|
let [r] = await e.query({
|
|
966
967
|
table: "_voltro_workflow_runs",
|
|
967
|
-
predicate:
|
|
968
|
+
predicate: B("executionId", n.preparedExecutionId),
|
|
968
969
|
lock: "update",
|
|
969
970
|
order: [],
|
|
970
971
|
take: 1,
|
|
@@ -972,24 +973,24 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
972
973
|
projection: void 0
|
|
973
974
|
});
|
|
974
975
|
if (r !== void 0) {
|
|
975
|
-
let n =
|
|
976
|
-
id:
|
|
977
|
-
tag:
|
|
978
|
-
executionId:
|
|
979
|
-
runnerGeneration:
|
|
976
|
+
let n = R.decodeUnknownSync(R.Struct({
|
|
977
|
+
id: R.NonEmptyString,
|
|
978
|
+
tag: R.NonEmptyString,
|
|
979
|
+
executionId: R.NonEmptyString,
|
|
980
|
+
runnerGeneration: R.NonEmptyString
|
|
980
981
|
}))(r), i = {
|
|
981
982
|
runId: n.id,
|
|
982
983
|
workflowName: n.tag,
|
|
983
984
|
executionId: n.executionId,
|
|
984
985
|
generation: n.runnerGeneration
|
|
985
|
-
}, a = await
|
|
986
|
-
return await
|
|
986
|
+
}, a = await nn(e, o.id, i);
|
|
987
|
+
return await Qt(e, a.request, t.now), a.request;
|
|
987
988
|
}
|
|
988
989
|
}
|
|
989
990
|
}
|
|
990
991
|
return o;
|
|
991
|
-
},
|
|
992
|
-
let r = await
|
|
992
|
+
}, nn = async (e, t, n) => {
|
|
993
|
+
let r = await Xt(e, t);
|
|
993
994
|
if (r === void 0) throw Error("Queued cancellation request is missing");
|
|
994
995
|
if (r.target.kind === "terminal") return {
|
|
995
996
|
kind: "terminal",
|
|
@@ -998,19 +999,19 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
998
999
|
if (r.controlBinding !== null) return {
|
|
999
1000
|
kind: "bound",
|
|
1000
1001
|
request: r,
|
|
1001
|
-
control: await
|
|
1002
|
+
control: await Zt(e, r)
|
|
1002
1003
|
};
|
|
1003
|
-
let i = await
|
|
1004
|
+
let i = await M(e, r.target.submissionId);
|
|
1004
1005
|
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");
|
|
1005
1006
|
let [a] = await e.query({
|
|
1006
1007
|
table: "_voltro_workflow_runs",
|
|
1007
|
-
predicate:
|
|
1008
|
+
predicate: B("id", n.runId),
|
|
1008
1009
|
lock: "update",
|
|
1009
1010
|
order: [],
|
|
1010
1011
|
take: 1,
|
|
1011
1012
|
skip: void 0,
|
|
1012
1013
|
projection: void 0
|
|
1013
|
-
}), o =
|
|
1014
|
+
}), o = R.decodeUnknownOption(R.Struct({ tenantId: R.NullOr(R.String) }))(a?.subject);
|
|
1014
1015
|
if (a === void 0 || a.tag !== n.workflowName || a.executionId !== n.executionId || a.runnerGeneration !== n.generation || o._tag === "None" || o.value.tenantId !== r.tenantId || ![
|
|
1015
1016
|
"running",
|
|
1016
1017
|
"suspended",
|
|
@@ -1023,14 +1024,14 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1023
1024
|
runId: n.runId,
|
|
1024
1025
|
executionId: n.executionId,
|
|
1025
1026
|
generation: n.generation
|
|
1026
|
-
}, c = await
|
|
1027
|
+
}, c = await He(e, {
|
|
1027
1028
|
id: s.controlId,
|
|
1028
1029
|
...n,
|
|
1029
1030
|
operation: "cancel",
|
|
1030
1031
|
requestedAt: r.requestedAt.getTime(),
|
|
1031
1032
|
cause: r.cause
|
|
1032
1033
|
});
|
|
1033
|
-
if (await e.update(
|
|
1034
|
+
if (await e.update(Kt.tableName, r.id, { controlBinding: s }) === null) throw Error("Queued cancellation request disappeared during run binding");
|
|
1034
1035
|
return {
|
|
1035
1036
|
kind: "bound",
|
|
1036
1037
|
request: {
|
|
@@ -1039,15 +1040,15 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1039
1040
|
},
|
|
1040
1041
|
control: c
|
|
1041
1042
|
};
|
|
1042
|
-
},
|
|
1043
|
+
}, rn = async (e, t) => {
|
|
1043
1044
|
let n = /* @__PURE__ */ new Set();
|
|
1044
|
-
for await (let r of
|
|
1045
|
+
for await (let r of Ue(e, t.executionId, t.workflowName)) n.add(r.id);
|
|
1045
1046
|
if (n.size === 0) return !1;
|
|
1046
1047
|
let r, i = !1;
|
|
1047
1048
|
for (;;) {
|
|
1048
1049
|
let a = await e.query({
|
|
1049
|
-
table:
|
|
1050
|
-
predicate:
|
|
1050
|
+
table: Kt.tableName,
|
|
1051
|
+
predicate: z(B("workflowName", t.workflowName), ...r === void 0 ? [] : [V("id", r)]),
|
|
1051
1052
|
lock: "update",
|
|
1052
1053
|
order: [{
|
|
1053
1054
|
column: "id",
|
|
@@ -1058,9 +1059,9 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1058
1059
|
projection: void 0
|
|
1059
1060
|
});
|
|
1060
1061
|
for (let o of a) {
|
|
1061
|
-
let a =
|
|
1062
|
+
let a = Yt(o);
|
|
1062
1063
|
if (r = a.id, a.target.kind !== "submission" || !n.has(a.target.submissionId)) continue;
|
|
1063
|
-
let s = await
|
|
1064
|
+
let s = await nn(e, a.id, t);
|
|
1064
1065
|
if (s.kind === "bound") {
|
|
1065
1066
|
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");
|
|
1066
1067
|
s.control.result === null && (i = !0);
|
|
@@ -1068,32 +1069,32 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1068
1069
|
}
|
|
1069
1070
|
if (a.length < 100) return i;
|
|
1070
1071
|
}
|
|
1071
|
-
},
|
|
1072
|
-
requestId:
|
|
1073
|
-
receiptId:
|
|
1074
|
-
workflowName:
|
|
1075
|
-
tenantId:
|
|
1076
|
-
}),
|
|
1077
|
-
let n =
|
|
1078
|
-
return await
|
|
1072
|
+
}, an = R.Struct({
|
|
1073
|
+
requestId: R.NonEmptyString,
|
|
1074
|
+
receiptId: R.NonEmptyString,
|
|
1075
|
+
workflowName: R.NonEmptyString,
|
|
1076
|
+
tenantId: R.NullOr(R.String)
|
|
1077
|
+
}), on = async (e, t) => {
|
|
1078
|
+
let n = R.decodeUnknownSync(an)(t);
|
|
1079
|
+
return await tn(e, {
|
|
1079
1080
|
...n,
|
|
1080
1081
|
now: t.now,
|
|
1081
1082
|
...t.cause === void 0 ? {} : { cause: t.cause }
|
|
1082
|
-
}),
|
|
1083
|
-
}, on = async (e, t) => {
|
|
1084
|
-
let n = L.decodeUnknownSync(rn)(t);
|
|
1085
|
-
return $t(n, await Qt(e, n));
|
|
1083
|
+
}), sn(e, n);
|
|
1086
1084
|
}, sn = async (e, t) => {
|
|
1085
|
+
let n = R.decodeUnknownSync(an)(t);
|
|
1086
|
+
return en(n, await $t(e, n));
|
|
1087
|
+
}, cn = async (e, t) => {
|
|
1087
1088
|
if (new Set(t.intentIds).size !== t.intentIds.length) throw Error("Admitted transfer requires distinct pending identities");
|
|
1088
|
-
let n = await
|
|
1089
|
+
let n = await M(e, t.id);
|
|
1089
1090
|
if (n !== void 0) {
|
|
1090
1091
|
if (n.workflowName !== t.workflowName || n.tenantId !== t.tenantId || n.ledgerId !== t.ledgerId || !n.receiptsBound) throw Error("Admitted transfer contradicts its existing submission");
|
|
1091
1092
|
return n;
|
|
1092
1093
|
}
|
|
1093
1094
|
for (let n of t.intentIds) {
|
|
1094
1095
|
let r = await e.query({
|
|
1095
|
-
table:
|
|
1096
|
-
predicate:
|
|
1096
|
+
table: O,
|
|
1097
|
+
predicate: B("id", n),
|
|
1097
1098
|
order: [],
|
|
1098
1099
|
take: 1,
|
|
1099
1100
|
skip: void 0,
|
|
@@ -1101,19 +1102,19 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1101
1102
|
lock: "update"
|
|
1102
1103
|
});
|
|
1103
1104
|
if (r[0] === void 0) throw Error("Admitted transfer lost a selected input");
|
|
1104
|
-
let i =
|
|
1105
|
+
let i = P(r[0]);
|
|
1105
1106
|
if (i.workflowName !== t.workflowName || i.tenantId !== t.tenantId || i.deadLetteredAt !== void 0) throw Error("Admitted transfer selected a foreign or dead-lettered input");
|
|
1106
1107
|
}
|
|
1107
|
-
let r = await
|
|
1108
|
-
await
|
|
1108
|
+
let r = await ie(e, t);
|
|
1109
|
+
await je(e, r.id);
|
|
1109
1110
|
for (let t of r.intentIds) if (!await e.delete("_voltro_workflow_pending", t)) throw Error("Admitted input disappeared during submission transfer");
|
|
1110
1111
|
return {
|
|
1111
1112
|
...r,
|
|
1112
1113
|
receiptsBound: !0
|
|
1113
1114
|
};
|
|
1114
|
-
},
|
|
1115
|
+
}, ln = async (e, t) => Pe(e, (e) => un(e, t)), un = async (e, t) => {
|
|
1115
1116
|
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");
|
|
1116
|
-
let n = await
|
|
1117
|
+
let n = await M(e, t.id);
|
|
1117
1118
|
if (n !== void 0) {
|
|
1118
1119
|
if (n.workflowName !== t.workflowName || n.tenantId !== t.tenantId) throw Error("Admission submission identity belongs to a different workflow or tenant");
|
|
1119
1120
|
if (!n.receiptsBound) throw Error("Submission exists without completed queue transfer");
|
|
@@ -1126,8 +1127,8 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1126
1127
|
let r = [];
|
|
1127
1128
|
for (let n of t.intentIds) {
|
|
1128
1129
|
let i = await e.query({
|
|
1129
|
-
table:
|
|
1130
|
-
predicate:
|
|
1130
|
+
table: O,
|
|
1131
|
+
predicate: B("id", n),
|
|
1131
1132
|
order: [],
|
|
1132
1133
|
take: 1,
|
|
1133
1134
|
skip: void 0,
|
|
@@ -1135,14 +1136,14 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1135
1136
|
lock: "update"
|
|
1136
1137
|
});
|
|
1137
1138
|
if (i[0] === void 0) return { kind: "selection-unavailable" };
|
|
1138
|
-
let a =
|
|
1139
|
+
let a = P(i[0]);
|
|
1139
1140
|
if (a.workflowName !== t.workflowName || a.tenantId !== t.tenantId) throw Error("Selected pending start belongs to a different workflow or tenant");
|
|
1140
1141
|
if (a.deadLetteredAt !== void 0 || a.dueAt > t.now) return { kind: "selection-unavailable" };
|
|
1141
1142
|
r.push(a);
|
|
1142
1143
|
}
|
|
1143
1144
|
let i = t.prepare(r);
|
|
1144
1145
|
if (i.control.workflowName !== t.workflowName) throw Error("Prepared submission belongs to a different workflow");
|
|
1145
|
-
let a = await
|
|
1146
|
+
let a = await Ae(e, {
|
|
1146
1147
|
...i,
|
|
1147
1148
|
id: t.id,
|
|
1148
1149
|
tenantId: t.tenantId,
|
|
@@ -1150,7 +1151,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1150
1151
|
now: t.now
|
|
1151
1152
|
});
|
|
1152
1153
|
if (a.kind !== "reserved") return a;
|
|
1153
|
-
await
|
|
1154
|
+
await je(e, t.id);
|
|
1154
1155
|
for (let t of r) if (!await e.delete("_voltro_workflow_pending", t.id)) throw Error("Pending start disappeared during queue transfer");
|
|
1155
1156
|
return {
|
|
1156
1157
|
...a,
|
|
@@ -1159,8 +1160,8 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1159
1160
|
receiptsBound: !0
|
|
1160
1161
|
}
|
|
1161
1162
|
};
|
|
1162
|
-
},
|
|
1163
|
-
let { store: t, control: n, now: r } = e, i =
|
|
1163
|
+
}, dn = async (e) => {
|
|
1164
|
+
let { store: t, control: n, now: r } = e, i = D(n, e.payload), a = await ce({
|
|
1164
1165
|
store: t,
|
|
1165
1166
|
control: n,
|
|
1166
1167
|
keys: i,
|
|
@@ -1168,7 +1169,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1168
1169
|
now: r,
|
|
1169
1170
|
reconsidering: !1
|
|
1170
1171
|
});
|
|
1171
|
-
if (a.kind === "drop") return await
|
|
1172
|
+
if (a.kind === "drop") return await A({
|
|
1172
1173
|
store: t,
|
|
1173
1174
|
control: n,
|
|
1174
1175
|
keys: i,
|
|
@@ -1185,7 +1186,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1185
1186
|
kind: "dropped",
|
|
1186
1187
|
retryAfterMs: a.retryAfterMs
|
|
1187
1188
|
};
|
|
1188
|
-
if (a.kind === "skip") return await
|
|
1189
|
+
if (a.kind === "skip") return await A({
|
|
1189
1190
|
store: t,
|
|
1190
1191
|
control: n,
|
|
1191
1192
|
keys: i,
|
|
@@ -1205,7 +1206,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1205
1206
|
};
|
|
1206
1207
|
if (a.kind === "defer") return {
|
|
1207
1208
|
kind: "queued",
|
|
1208
|
-
intentId: await
|
|
1209
|
+
intentId: await ue({
|
|
1209
1210
|
store: t,
|
|
1210
1211
|
control: n,
|
|
1211
1212
|
decision: a,
|
|
@@ -1221,12 +1222,12 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1221
1222
|
};
|
|
1222
1223
|
let o = e.payload, s = [], c = 1;
|
|
1223
1224
|
if (n.batch !== void 0 && i.batchKey !== void 0) {
|
|
1224
|
-
let r = await
|
|
1225
|
+
let r = await fn(t, n.workflowName, i.batchKey, n.batch.maxSize);
|
|
1225
1226
|
o = { items: [...r.map((e) => e.payload), e.payload] }, s = r.map((e) => e.id), c = r.length + 1;
|
|
1226
1227
|
}
|
|
1227
1228
|
return {
|
|
1228
1229
|
kind: "start",
|
|
1229
|
-
ledgerId: await
|
|
1230
|
+
ledgerId: await A({
|
|
1230
1231
|
store: t,
|
|
1231
1232
|
control: n,
|
|
1232
1233
|
keys: i,
|
|
@@ -1249,9 +1250,9 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1249
1250
|
runId: a.evict.runId
|
|
1250
1251
|
} }
|
|
1251
1252
|
};
|
|
1252
|
-
},
|
|
1253
|
+
}, fn = async (e, t, n, r) => (await e.query({
|
|
1253
1254
|
table: "_voltro_workflow_pending",
|
|
1254
|
-
predicate:
|
|
1255
|
+
predicate: z(B("workflowName", t), B("controlKey", n), B("mode", "batch")),
|
|
1255
1256
|
order: [{
|
|
1256
1257
|
column: "firstSeenAt",
|
|
1257
1258
|
direction: "asc"
|
|
@@ -1262,22 +1263,22 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1262
1263
|
})).map((n) => ({
|
|
1263
1264
|
id: String(n.id),
|
|
1264
1265
|
payload: E(e, t, n.payload)
|
|
1265
|
-
})),
|
|
1266
|
+
})), pn = async (e, t, n, r) => {
|
|
1266
1267
|
await e.update("_voltro_workflow_admissions", t, {
|
|
1267
1268
|
executionId: n,
|
|
1268
1269
|
runId: r
|
|
1269
1270
|
});
|
|
1270
|
-
},
|
|
1271
|
-
id:
|
|
1272
|
-
positionAt:
|
|
1273
|
-
updatedAt:
|
|
1274
|
-
}),
|
|
1271
|
+
}, mn = K("_voltro_workflow_watermarks", {
|
|
1272
|
+
id: H({ prefix: "wfwm" }),
|
|
1273
|
+
positionAt: J(),
|
|
1274
|
+
updatedAt: J().default("now")
|
|
1275
|
+
}), hn = (e) => {
|
|
1275
1276
|
let t = e instanceof Error ? e.message : String(e);
|
|
1276
1277
|
return t.length > 400 ? `${t.slice(0, 400)}…` : t;
|
|
1277
|
-
},
|
|
1278
|
-
let t = [], n = [], r = [], i = /* @__PURE__ */ new Set(), a = /* @__PURE__ */ new Set(), o = e.payloadSchema === void 0 ? (e) =>
|
|
1279
|
-
let n =
|
|
1280
|
-
return
|
|
1278
|
+
}, gn = (e) => {
|
|
1279
|
+
let t = [], n = [], r = [], i = /* @__PURE__ */ new Set(), a = /* @__PURE__ */ new Set(), o = e.payloadSchema === void 0 ? (e) => L.right(e) : (t) => {
|
|
1280
|
+
let n = R.decodeUnknownEither(e.payloadSchema)(t);
|
|
1281
|
+
return L.isRight(n) ? L.right(n.right) : L.left(hn(n.left));
|
|
1281
1282
|
}, s = e.runs.map((e) => ({
|
|
1282
1283
|
run: e,
|
|
1283
1284
|
decoded: o(e.payload)
|
|
@@ -1287,19 +1288,19 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1287
1288
|
}));
|
|
1288
1289
|
for (let o of e.entries) for (let l of e.events) {
|
|
1289
1290
|
if (l.name !== o.event) continue;
|
|
1290
|
-
let u =
|
|
1291
|
-
if (
|
|
1291
|
+
let u = R.decodeUnknownEither(o.schema)(l.payload);
|
|
1292
|
+
if (L.isLeft(u)) {
|
|
1292
1293
|
r.push({
|
|
1293
1294
|
kind: "event-decode",
|
|
1294
1295
|
workflowName: e.workflowName,
|
|
1295
1296
|
event: o.event,
|
|
1296
1297
|
subject: l.id,
|
|
1297
|
-
detail:
|
|
1298
|
+
detail: hn(u.left)
|
|
1298
1299
|
});
|
|
1299
1300
|
continue;
|
|
1300
1301
|
}
|
|
1301
1302
|
let d = u.right, f = (e) => e.getTime() > l.occurredAt.getTime() ? !1 : o.withinMs === void 0 || l.occurredAt.getTime() - e.getTime() <= o.withinMs, p = (t, n) => {
|
|
1302
|
-
if (
|
|
1303
|
+
if (L.isLeft(t)) return r.push({
|
|
1303
1304
|
kind: "payload-decode",
|
|
1304
1305
|
workflowName: e.workflowName,
|
|
1305
1306
|
event: o.event,
|
|
@@ -1314,7 +1315,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1314
1315
|
workflowName: e.workflowName,
|
|
1315
1316
|
event: o.event,
|
|
1316
1317
|
subject: n,
|
|
1317
|
-
detail:
|
|
1318
|
+
detail: hn(t)
|
|
1318
1319
|
}), !1;
|
|
1319
1320
|
}
|
|
1320
1321
|
};
|
|
@@ -1337,33 +1338,33 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1337
1338
|
discards: n,
|
|
1338
1339
|
problems: r
|
|
1339
1340
|
};
|
|
1340
|
-
},
|
|
1341
|
+
}, _n = (e) => {
|
|
1341
1342
|
let t;
|
|
1342
1343
|
for (let n of e) (t === void 0 || n.occurredAt.getTime() > t.getTime()) && (t = n.occurredAt);
|
|
1343
1344
|
return t;
|
|
1344
|
-
},
|
|
1345
|
+
}, vn = "_voltro_workflow_watermarks", yn = "_voltro_workflow_events", bn = "cancelOn", xn = 36e5, Sn = 500, Cn = (e) => {
|
|
1345
1346
|
if (e instanceof Date) return e;
|
|
1346
1347
|
if (typeof e == "number") return new Date(e);
|
|
1347
1348
|
if (typeof e == "string") {
|
|
1348
1349
|
let t = new Date(e);
|
|
1349
1350
|
if (!Number.isNaN(t.getTime())) return t;
|
|
1350
1351
|
}
|
|
1351
|
-
},
|
|
1352
|
-
table:
|
|
1353
|
-
predicate:
|
|
1352
|
+
}, wn = (e) => e instanceof Error ? e.message : String(e), Tn = async (e, t) => Cn((await e.query({
|
|
1353
|
+
table: vn,
|
|
1354
|
+
predicate: B("id", t),
|
|
1354
1355
|
order: [],
|
|
1355
1356
|
take: 1,
|
|
1356
1357
|
skip: void 0,
|
|
1357
1358
|
projection: void 0
|
|
1358
|
-
}))[0]?.positionAt),
|
|
1359
|
-
await e.upsert(
|
|
1359
|
+
}))[0]?.positionAt), En = async (e, t, n) => {
|
|
1360
|
+
await e.upsert(vn, {
|
|
1360
1361
|
id: t,
|
|
1361
1362
|
positionAt: n,
|
|
1362
1363
|
updatedAt: /* @__PURE__ */ new Date()
|
|
1363
1364
|
}, {
|
|
1364
1365
|
conflictColumns: ["id"],
|
|
1365
1366
|
update: (e) => {
|
|
1366
|
-
let t =
|
|
1367
|
+
let t = Cn(e.positionAt);
|
|
1367
1368
|
return t !== void 0 && t.getTime() >= n.getTime() ? {
|
|
1368
1369
|
positionAt: t,
|
|
1369
1370
|
updatedAt: /* @__PURE__ */ new Date()
|
|
@@ -1373,10 +1374,10 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1373
1374
|
};
|
|
1374
1375
|
}
|
|
1375
1376
|
});
|
|
1376
|
-
},
|
|
1377
|
+
}, Dn = async (e, t, n) => {
|
|
1377
1378
|
let r = async (r) => e.query({
|
|
1378
1379
|
table: "_voltro_workflow_runs",
|
|
1379
|
-
predicate:
|
|
1380
|
+
predicate: z(B("tag", t), B("status", r)),
|
|
1380
1381
|
order: [{
|
|
1381
1382
|
column: "startedAt",
|
|
1382
1383
|
direction: "asc"
|
|
@@ -1386,7 +1387,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1386
1387
|
projection: void 0
|
|
1387
1388
|
});
|
|
1388
1389
|
return [...await r("running"), ...await r("suspended")].flatMap((e) => {
|
|
1389
|
-
let t = e, n =
|
|
1390
|
+
let t = e, n = Cn(t.startedAt);
|
|
1390
1391
|
return typeof t.id != "string" || typeof t.executionId != "string" || n === void 0 ? [] : [{
|
|
1391
1392
|
runId: t.id,
|
|
1392
1393
|
executionId: t.executionId,
|
|
@@ -1394,9 +1395,9 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1394
1395
|
startedAt: n
|
|
1395
1396
|
}];
|
|
1396
1397
|
});
|
|
1397
|
-
},
|
|
1398
|
+
}, On = async (e, t, n) => (await e.query({
|
|
1398
1399
|
table: "_voltro_workflow_pending",
|
|
1399
|
-
predicate:
|
|
1400
|
+
predicate: B("workflowName", t),
|
|
1400
1401
|
order: [{
|
|
1401
1402
|
column: "firstSeenAt",
|
|
1402
1403
|
direction: "asc"
|
|
@@ -1405,13 +1406,13 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1405
1406
|
skip: void 0,
|
|
1406
1407
|
projection: void 0
|
|
1407
1408
|
})).flatMap((e) => {
|
|
1408
|
-
let t = e, n =
|
|
1409
|
+
let t = e, n = Cn(t.firstSeenAt);
|
|
1409
1410
|
return typeof t.id != "string" || n === void 0 ? [] : [{
|
|
1410
1411
|
intentId: t.id,
|
|
1411
1412
|
payload: t.payload,
|
|
1412
1413
|
firstSeenAt: n
|
|
1413
1414
|
}];
|
|
1414
|
-
}),
|
|
1415
|
+
}), kn = async (e, t) => {
|
|
1415
1416
|
let n = t.workflows.filter((e) => e.entries.length > 0);
|
|
1416
1417
|
if (n.length === 0) return {
|
|
1417
1418
|
examined: !1,
|
|
@@ -1426,10 +1427,10 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1426
1427
|
};
|
|
1427
1428
|
let r = e.now?.() ?? Date.now(), i = t.batch ?? 500, a = t.coldLookbackMs ?? 36e5, o = /* @__PURE__ */ new Set();
|
|
1428
1429
|
for (let e of n) for (let t of e.entries) o.add(t.event);
|
|
1429
|
-
let s = await
|
|
1430
|
-
s === void 0 && (await
|
|
1430
|
+
let s = await Tn(e.store, bn), c = s ?? new Date(r - a);
|
|
1431
|
+
s === void 0 && (await En(e.store, bn, c), s = c);
|
|
1431
1432
|
let l = await e.store.query({
|
|
1432
|
-
table:
|
|
1433
|
+
table: yn,
|
|
1433
1434
|
predicate: it("occurredAt", c),
|
|
1434
1435
|
order: [{
|
|
1435
1436
|
column: "occurredAt",
|
|
@@ -1440,7 +1441,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1440
1441
|
projection: void 0
|
|
1441
1442
|
}), u = [];
|
|
1442
1443
|
for (let e of l) {
|
|
1443
|
-
let t = e, n =
|
|
1444
|
+
let t = e, n = Cn(t.occurredAt);
|
|
1444
1445
|
typeof t.id == "string" && typeof t.name == "string" && n !== void 0 && o.has(t.name) && u.push({
|
|
1445
1446
|
id: t.id,
|
|
1446
1447
|
name: t.name,
|
|
@@ -1454,15 +1455,15 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1454
1455
|
if (n.length === 0) continue;
|
|
1455
1456
|
let r = [], i = [];
|
|
1456
1457
|
try {
|
|
1457
|
-
r = await
|
|
1458
|
+
r = await Dn(e.store, t.workflowName, _), i = await On(e.store, t.workflowName, _), (r.length >= _ || i.length >= _) && (h = !0);
|
|
1458
1459
|
} catch (e) {
|
|
1459
1460
|
f.push({
|
|
1460
1461
|
subject: t.workflowName,
|
|
1461
|
-
detail:
|
|
1462
|
+
detail: wn(e)
|
|
1462
1463
|
}), g = !0;
|
|
1463
1464
|
continue;
|
|
1464
1465
|
}
|
|
1465
|
-
let a =
|
|
1466
|
+
let a = gn({
|
|
1466
1467
|
workflowName: t.workflowName,
|
|
1467
1468
|
entries: t.entries,
|
|
1468
1469
|
payloadSchema: t.payloadSchema,
|
|
@@ -1484,7 +1485,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1484
1485
|
} catch (e) {
|
|
1485
1486
|
f.push({
|
|
1486
1487
|
subject: n.runId,
|
|
1487
|
-
detail:
|
|
1488
|
+
detail: wn(e)
|
|
1488
1489
|
}), g = !0;
|
|
1489
1490
|
}
|
|
1490
1491
|
for (let n of a.discards) try {
|
|
@@ -1495,18 +1496,18 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1495
1496
|
} catch (e) {
|
|
1496
1497
|
f.push({
|
|
1497
1498
|
subject: n.intentId,
|
|
1498
|
-
detail:
|
|
1499
|
+
detail: wn(e)
|
|
1499
1500
|
}), g = !0;
|
|
1500
1501
|
}
|
|
1501
1502
|
}
|
|
1502
|
-
let v =
|
|
1503
|
+
let v = _n(u), y = s;
|
|
1503
1504
|
if (g) e.log?.warn("workflow.cancelOn: holding the watermark — evaluation or delivery remains incomplete", { failures: f.length });
|
|
1504
1505
|
else if (v !== void 0) try {
|
|
1505
|
-
await
|
|
1506
|
+
await En(e.store, bn, v), y = v;
|
|
1506
1507
|
} catch (e) {
|
|
1507
1508
|
f.push({
|
|
1508
|
-
subject:
|
|
1509
|
-
detail:
|
|
1509
|
+
subject: bn,
|
|
1510
|
+
detail: wn(e)
|
|
1510
1511
|
});
|
|
1511
1512
|
}
|
|
1512
1513
|
return d.length > 0 && e.log?.warn("workflow.cancelOn: some events could not be evaluated", {
|
|
@@ -1523,16 +1524,16 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1523
1524
|
failures: f,
|
|
1524
1525
|
watermark: y
|
|
1525
1526
|
};
|
|
1526
|
-
},
|
|
1527
|
+
}, An = 18e5, jn = 200, Mn = 20, Nn = (e) => {
|
|
1527
1528
|
if (e instanceof Date) return e;
|
|
1528
1529
|
if (typeof e == "number") return new Date(e);
|
|
1529
1530
|
if (typeof e == "string") {
|
|
1530
1531
|
let t = new Date(e);
|
|
1531
1532
|
if (!Number.isNaN(t.getTime())) return t;
|
|
1532
1533
|
}
|
|
1533
|
-
},
|
|
1534
|
+
}, Pn = (e) => e instanceof Error ? e.message : String(e), Fn = async (e, t, n) => (await e.query({
|
|
1534
1535
|
table: "_voltro_workflow_run_events",
|
|
1535
|
-
predicate:
|
|
1536
|
+
predicate: B("runId", t),
|
|
1536
1537
|
order: [{
|
|
1537
1538
|
column: "occurredAt",
|
|
1538
1539
|
direction: "desc"
|
|
@@ -1541,16 +1542,16 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1541
1542
|
skip: void 0,
|
|
1542
1543
|
projection: void 0
|
|
1543
1544
|
})).flatMap((e) => {
|
|
1544
|
-
let t = e, n =
|
|
1545
|
+
let t = e, n = Nn(t.occurredAt);
|
|
1545
1546
|
return typeof t.eventType != "string" || n === void 0 ? [] : [{
|
|
1546
1547
|
eventType: t.eventType,
|
|
1547
1548
|
occurredAt: n,
|
|
1548
1549
|
payload: t.payload
|
|
1549
1550
|
}];
|
|
1550
|
-
}),
|
|
1551
|
+
}), In = async (e, t) => {
|
|
1551
1552
|
let n = (await e.query({
|
|
1552
1553
|
table: "_voltro_workflow_run_steps",
|
|
1553
|
-
predicate:
|
|
1554
|
+
predicate: B("runId", t),
|
|
1554
1555
|
order: [{
|
|
1555
1556
|
column: "startedAt",
|
|
1556
1557
|
direction: "desc"
|
|
@@ -1560,24 +1561,24 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1560
1561
|
projection: void 0
|
|
1561
1562
|
}))[0];
|
|
1562
1563
|
if (n === void 0) return;
|
|
1563
|
-
let r =
|
|
1564
|
+
let r = Nn(n.startedAt), i = Nn(n.completedAt);
|
|
1564
1565
|
return r === void 0 ? i : i === void 0 ? r : i.getTime() > r.getTime() ? i : r;
|
|
1565
|
-
},
|
|
1566
|
+
}, Ln = (e, t) => {
|
|
1566
1567
|
for (let n of e) {
|
|
1567
1568
|
if (n.eventType === "timer-fired") return !1;
|
|
1568
1569
|
if (n.eventType !== "timer-set") continue;
|
|
1569
|
-
let e =
|
|
1570
|
+
let e = Nn(n.payload?.scheduledWakeAt);
|
|
1570
1571
|
return e !== void 0 && e.getTime() > t;
|
|
1571
1572
|
}
|
|
1572
1573
|
return !1;
|
|
1573
|
-
},
|
|
1574
|
+
}, Rn = (e, t) => {
|
|
1574
1575
|
if (e !== "suspended") return "no-progress";
|
|
1575
1576
|
for (let e of t) {
|
|
1576
1577
|
if (e.eventType === "signal-received" || e.eventType === "signal-sent") return "suspended";
|
|
1577
1578
|
if (e.eventType === "signal-awaited") return "awaiting-signal";
|
|
1578
1579
|
}
|
|
1579
1580
|
return "suspended";
|
|
1580
|
-
},
|
|
1581
|
+
}, zn = async (e, t = {}) => {
|
|
1581
1582
|
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;
|
|
1582
1583
|
try {
|
|
1583
1584
|
if (!Number.isSafeInteger(i) || i < 1) throw Error("Staleness run page must be a positive integer");
|
|
@@ -1585,7 +1586,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1585
1586
|
if (n !== void 0 && (!(n.startedAt instanceof Date) || !Number.isFinite(n.startedAt.getTime()) || typeof n.runId != "string" || n.runId.length === 0)) throw Error("Invalid staleness run cursor");
|
|
1586
1587
|
d = await e.store.query({
|
|
1587
1588
|
table: "_voltro_workflow_runs",
|
|
1588
|
-
predicate:
|
|
1589
|
+
predicate: z(at("status", ["running", "suspended"]), st("startedAt", o), ...n === void 0 ? [] : [ct(V("startedAt", n.startedAt), z(B("startedAt", n.startedAt), V("id", n.runId)))]),
|
|
1589
1590
|
order: [{
|
|
1590
1591
|
column: "startedAt",
|
|
1591
1592
|
direction: "asc"
|
|
@@ -1599,7 +1600,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1599
1600
|
});
|
|
1600
1601
|
let r = n;
|
|
1601
1602
|
for (let e of d) {
|
|
1602
|
-
let t =
|
|
1603
|
+
let t = Nn(e.startedAt);
|
|
1603
1604
|
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");
|
|
1604
1605
|
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");
|
|
1605
1606
|
r = {
|
|
@@ -1617,24 +1618,24 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1617
1618
|
sawFullRunPage: !1,
|
|
1618
1619
|
failures: [{
|
|
1619
1620
|
subject: "_voltro_workflow_runs",
|
|
1620
|
-
detail:
|
|
1621
|
+
detail: Pn(e)
|
|
1621
1622
|
}]
|
|
1622
1623
|
};
|
|
1623
1624
|
}
|
|
1624
1625
|
for (let t of d) {
|
|
1625
|
-
let i = t, o =
|
|
1626
|
+
let i = t, o = Nn(i.startedAt);
|
|
1626
1627
|
if (typeof i.id != "string" || typeof i.tag != "string" || typeof i.executionId != "string" || typeof i.status != "string" || o === void 0) continue;
|
|
1627
1628
|
let d, f;
|
|
1628
1629
|
try {
|
|
1629
|
-
d = await
|
|
1630
|
+
d = await Fn(e.store, i.id, a), f = await In(e.store, i.id);
|
|
1630
1631
|
} catch (e) {
|
|
1631
1632
|
s.push({
|
|
1632
1633
|
subject: i.id,
|
|
1633
|
-
detail:
|
|
1634
|
+
detail: Pn(e)
|
|
1634
1635
|
});
|
|
1635
1636
|
continue;
|
|
1636
1637
|
}
|
|
1637
|
-
if (
|
|
1638
|
+
if (Ln(d, n)) {
|
|
1638
1639
|
u += 1;
|
|
1639
1640
|
continue;
|
|
1640
1641
|
}
|
|
@@ -1653,7 +1654,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1653
1654
|
status: i.status,
|
|
1654
1655
|
lastProgressAt: m,
|
|
1655
1656
|
idleMs: h,
|
|
1656
|
-
reason:
|
|
1657
|
+
reason: Rn(i.status, d)
|
|
1657
1658
|
};
|
|
1658
1659
|
c.push(g);
|
|
1659
1660
|
let _ = {};
|
|
@@ -1662,7 +1663,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1662
1663
|
} catch (e) {
|
|
1663
1664
|
s.push({
|
|
1664
1665
|
subject: `${g.runId}:describeRun`,
|
|
1665
|
-
detail:
|
|
1666
|
+
detail: Pn(e)
|
|
1666
1667
|
});
|
|
1667
1668
|
}
|
|
1668
1669
|
if (e.log?.warn("workflow.staleness: run has made no progress", {
|
|
@@ -1688,7 +1689,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1688
1689
|
} catch (e) {
|
|
1689
1690
|
s.push({
|
|
1690
1691
|
subject: g.runId,
|
|
1691
|
-
detail:
|
|
1692
|
+
detail: Pn(e)
|
|
1692
1693
|
});
|
|
1693
1694
|
}
|
|
1694
1695
|
if (e.onStalled !== void 0) try {
|
|
@@ -1696,7 +1697,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1696
1697
|
} catch (e) {
|
|
1697
1698
|
s.push({
|
|
1698
1699
|
subject: `${g.runId}:onStalled`,
|
|
1699
|
-
detail:
|
|
1700
|
+
detail: Pn(e)
|
|
1700
1701
|
});
|
|
1701
1702
|
}
|
|
1702
1703
|
}
|
|
@@ -1709,8 +1710,8 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1709
1710
|
failures: s,
|
|
1710
1711
|
...f === void 0 ? {} : { nextRun: f }
|
|
1711
1712
|
};
|
|
1712
|
-
},
|
|
1713
|
-
let r = await e.transaction((e) =>
|
|
1713
|
+
}, Bn = async (e, t, n) => {
|
|
1714
|
+
let r = await e.transaction((e) => M(e, t.id));
|
|
1714
1715
|
if (r === void 0 || r.workflowName !== t.workflowName || r.tenantId !== t.tenantId || r.ledgerId !== t.ledgerId) throw Error("Submission dispatch lost its resident owner");
|
|
1715
1716
|
if (!r.receiptsBound || r.failureId !== null) throw Error("Cannot dispatch an incomplete or rejected submission");
|
|
1716
1717
|
if (r.preparedExecutionId !== null) {
|
|
@@ -1718,26 +1719,26 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1718
1719
|
return r.preparedExecutionId;
|
|
1719
1720
|
}
|
|
1720
1721
|
if (r.dispatchAttempts !== 0 || r.executionId !== null) throw Error("Submission has an unbound prior dispatch; reconciliation required");
|
|
1721
|
-
let i = await e.resolveExecutionId(t.workflowName, n), a = await e.transaction((e) =>
|
|
1722
|
+
let i = await e.resolveExecutionId(t.workflowName, n), a = await e.transaction((e) => Be(e, t.id, i));
|
|
1722
1723
|
if (a.preparedExecutionId === null) throw Error("Submission preparation returned no execution identity");
|
|
1723
1724
|
return a.preparedExecutionId;
|
|
1724
|
-
},
|
|
1725
|
-
let i =
|
|
1725
|
+
}, Vn = /* @__PURE__ */ new WeakMap(), Hn = async (e, t, n, r) => {
|
|
1726
|
+
let i = Vn.get(e), a = await w(e.store, n, i?.afterId), o = 0, s = 0, c = 0, l = 0, u = i?.nextDueAt, d = (e) => {
|
|
1726
1727
|
u = Math.min(u ?? e, e);
|
|
1727
1728
|
};
|
|
1728
1729
|
for (let n of a) {
|
|
1729
1730
|
let i;
|
|
1730
1731
|
try {
|
|
1731
|
-
i =
|
|
1732
|
+
i = Re(n);
|
|
1732
1733
|
} catch {
|
|
1733
|
-
o++, c++, d(t +
|
|
1734
|
+
o++, c++, d(t + Ie(1)), e.log?.warn?.("workflow submission metadata is invalid", { submissionId: typeof n.id == "string" ? n.id : null });
|
|
1734
1735
|
continue;
|
|
1735
1736
|
}
|
|
1736
1737
|
o++;
|
|
1737
1738
|
let a = i.dispatchAttempts === 0 ? 0 : void 0;
|
|
1738
1739
|
try {
|
|
1739
1740
|
let n = i.preparedExecutionId, r = n === null || i.dispatchAttempts === 0 ? void 0 : await e.transaction(async (e) => {
|
|
1740
|
-
let t = await
|
|
1741
|
+
let t = await ne(e, i.workflowName, n);
|
|
1741
1742
|
return t === void 0 ? void 0 : {
|
|
1742
1743
|
executionId: n,
|
|
1743
1744
|
runId: t.runId
|
|
@@ -1756,7 +1757,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1756
1757
|
continue;
|
|
1757
1758
|
}
|
|
1758
1759
|
let c = r ?? await (async () => {
|
|
1759
|
-
let n = e.controls.get(i.workflowName)?.batch === void 0 ? E(e.store, i.workflowName, i.payload) : { items:
|
|
1760
|
+
let n = e.controls.get(i.workflowName)?.batch === void 0 ? E(e.store, i.workflowName, i.payload) : { items: R.decodeUnknownSync(R.Struct({ items: R.Array(R.Unknown) }))(i.payload).items.map((t) => E(e.store, i.workflowName, t)) }, r = await Bn(e, i, n), o = await e.transaction((e) => xe(e, i.id, t));
|
|
1760
1761
|
if (o === null) return;
|
|
1761
1762
|
a = o.dispatchAttempts === 1 ? 1 : void 0;
|
|
1762
1763
|
let s = await e.startAdmitted(i.workflowName, n, i.callerContext, r);
|
|
@@ -1772,7 +1773,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1772
1773
|
source: "flow-control",
|
|
1773
1774
|
mode: "singleton"
|
|
1774
1775
|
}
|
|
1775
|
-
}), await x(e.store, i.eviction.executionId, t)), await e.transaction((e) =>
|
|
1776
|
+
}), await x(e.store, i.eviction.executionId, t)), await e.transaction((e) => we(e, i.id, {
|
|
1776
1777
|
executionId: c.executionId,
|
|
1777
1778
|
runId: c.runId ?? null
|
|
1778
1779
|
})), s++;
|
|
@@ -1781,7 +1782,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1781
1782
|
let o;
|
|
1782
1783
|
try {
|
|
1783
1784
|
if (a !== void 0 && e.isPermanentStartError?.(n) === !0) {
|
|
1784
|
-
let r = a, o = await e.transaction((a) =>
|
|
1785
|
+
let r = a, o = await e.transaction((a) => S(a, i.id, r, {
|
|
1785
1786
|
handler: e.controls.get(i.workflowName)?.onFailure ?? null,
|
|
1786
1787
|
errorMessage: String(n),
|
|
1787
1788
|
now: t
|
|
@@ -1795,7 +1796,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1795
1796
|
continue;
|
|
1796
1797
|
}
|
|
1797
1798
|
}
|
|
1798
|
-
o = await e.transaction((e) =>
|
|
1799
|
+
o = await e.transaction((e) => Ve(e, i.id, String(n), t, r));
|
|
1799
1800
|
} catch (r) {
|
|
1800
1801
|
d(t), e.log?.warn?.("workflow submission retry state could not be recorded", {
|
|
1801
1802
|
workflow: i.workflowName,
|
|
@@ -1815,7 +1816,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1815
1816
|
}
|
|
1816
1817
|
}
|
|
1817
1818
|
let f = a.at(-1);
|
|
1818
|
-
return a.length === n && f !== void 0 && typeof f.id == "string" ? (
|
|
1819
|
+
return a.length === n && f !== void 0 && typeof f.id == "string" ? (Vn.set(e, {
|
|
1819
1820
|
afterId: f.id,
|
|
1820
1821
|
nextDueAt: u
|
|
1821
1822
|
}), {
|
|
@@ -1825,7 +1826,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1825
1826
|
rejected: l,
|
|
1826
1827
|
nextDueAt: t,
|
|
1827
1828
|
examined: !0
|
|
1828
|
-
}) : (
|
|
1829
|
+
}) : (Vn.delete(e), {
|
|
1829
1830
|
scanned: o,
|
|
1830
1831
|
admitted: s,
|
|
1831
1832
|
failed: c,
|
|
@@ -1833,10 +1834,10 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1833
1834
|
nextDueAt: u,
|
|
1834
1835
|
examined: a.length > 0
|
|
1835
1836
|
});
|
|
1836
|
-
},
|
|
1837
|
-
let r =
|
|
1838
|
-
table:
|
|
1839
|
-
predicate:
|
|
1837
|
+
}, Un = /* @__PURE__ */ new WeakMap(), Wn = async (e, t, n) => {
|
|
1838
|
+
let r = Un.get(e), i = await e.store.query({
|
|
1839
|
+
table: le,
|
|
1840
|
+
predicate: z(ot("handler"), W("acceptedExecutionId"), ...r === void 0 ? [] : [V("id", r.afterId)]),
|
|
1840
1841
|
order: [{
|
|
1841
1842
|
column: "id",
|
|
1842
1843
|
direction: "asc"
|
|
@@ -1845,21 +1846,21 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1845
1846
|
skip: void 0,
|
|
1846
1847
|
projection: void 0
|
|
1847
1848
|
}), a = 0, o = !1, s = r?.nextDueAt, c = () => {
|
|
1848
|
-
let e = t +
|
|
1849
|
+
let e = t + Ie(1, () => 1);
|
|
1849
1850
|
s = Math.min(s ?? e, e);
|
|
1850
1851
|
};
|
|
1851
1852
|
for (let n of i) try {
|
|
1852
1853
|
if (typeof n.id != "string" || n.id.length === 0) throw Error("Failure report has no identity");
|
|
1853
1854
|
let r = n.id;
|
|
1854
|
-
(await e.transaction((e) =>
|
|
1855
|
+
(await e.transaction((e) => se(e, r, t))).kind === "queued" && (o = !0, c());
|
|
1855
1856
|
} catch (t) {
|
|
1856
1857
|
a++, c(), e.log?.warn?.("workflow failure delivery could not be reconciled", {
|
|
1857
1858
|
failureId: typeof n.id == "string" ? n.id : null,
|
|
1858
|
-
...t instanceof
|
|
1859
|
+
...t instanceof Oe ? { reason: t.reason } : {}
|
|
1859
1860
|
});
|
|
1860
1861
|
}
|
|
1861
1862
|
let l = i.at(-1);
|
|
1862
|
-
return i.length === n && l !== void 0 && typeof l.id == "string" ? (
|
|
1863
|
+
return i.length === n && l !== void 0 && typeof l.id == "string" ? (Un.set(e, {
|
|
1863
1864
|
afterId: l.id,
|
|
1864
1865
|
nextDueAt: s
|
|
1865
1866
|
}), {
|
|
@@ -1868,17 +1869,17 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1868
1869
|
hasPending: o,
|
|
1869
1870
|
nextDueAt: t,
|
|
1870
1871
|
examined: !0
|
|
1871
|
-
}) : (
|
|
1872
|
+
}) : (Un.delete(e), {
|
|
1872
1873
|
scanned: i.length,
|
|
1873
1874
|
failed: a,
|
|
1874
1875
|
hasPending: o,
|
|
1875
1876
|
nextDueAt: s,
|
|
1876
1877
|
examined: i.length > 0
|
|
1877
1878
|
});
|
|
1878
|
-
},
|
|
1879
|
-
let r =
|
|
1880
|
-
table:
|
|
1881
|
-
predicate:
|
|
1879
|
+
}, Gn = "_voltro_workflow_parent_closures", Kn = /* @__PURE__ */ new WeakMap(), qn = async (e, t, n) => {
|
|
1880
|
+
let r = Kn.get(e), i = await e.store.query({
|
|
1881
|
+
table: Gn,
|
|
1882
|
+
predicate: z(W("completedAt"), ...r === void 0 ? [] : [V("id", r.afterId)]),
|
|
1882
1883
|
order: [{
|
|
1883
1884
|
column: "id",
|
|
1884
1885
|
direction: "asc"
|
|
@@ -1895,8 +1896,8 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1895
1896
|
await e.transaction(async (e) => {
|
|
1896
1897
|
await Ft(e, r, t);
|
|
1897
1898
|
let [n] = await e.query({
|
|
1898
|
-
table:
|
|
1899
|
-
predicate:
|
|
1899
|
+
table: Gn,
|
|
1900
|
+
predicate: B("id", r),
|
|
1900
1901
|
order: [],
|
|
1901
1902
|
take: 1,
|
|
1902
1903
|
skip: void 0,
|
|
@@ -1909,7 +1910,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1909
1910
|
a++, s(), e.log?.warn?.("workflow parent closure could not be reconciled", { closureId: typeof n.id == "string" ? n.id : null });
|
|
1910
1911
|
}
|
|
1911
1912
|
let c = i.at(-1);
|
|
1912
|
-
return i.length === n && typeof c?.id == "string" ? (
|
|
1913
|
+
return i.length === n && typeof c?.id == "string" ? (Kn.set(e, {
|
|
1913
1914
|
afterId: c.id,
|
|
1914
1915
|
nextDueAt: o
|
|
1915
1916
|
}), {
|
|
@@ -1917,30 +1918,30 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1917
1918
|
failed: a,
|
|
1918
1919
|
nextDueAt: t,
|
|
1919
1920
|
examined: !0
|
|
1920
|
-
}) : (
|
|
1921
|
+
}) : (Kn.delete(e), {
|
|
1921
1922
|
scanned: i.length,
|
|
1922
1923
|
failed: a,
|
|
1923
1924
|
nextDueAt: o,
|
|
1924
1925
|
examined: i.length > 0
|
|
1925
1926
|
});
|
|
1926
|
-
},
|
|
1927
|
+
}, Jn = async (e, t) => {
|
|
1927
1928
|
if (t.from === t.to) throw Error("Queue transfer requires distinct source and target");
|
|
1928
1929
|
let n = await e.query({
|
|
1929
|
-
table:
|
|
1930
|
-
predicate:
|
|
1930
|
+
table: O,
|
|
1931
|
+
predicate: B("id", t.to),
|
|
1931
1932
|
order: [],
|
|
1932
1933
|
take: 1,
|
|
1933
1934
|
skip: void 0,
|
|
1934
1935
|
projection: void 0
|
|
1935
|
-
}), r =
|
|
1936
|
-
workflowName:
|
|
1937
|
-
tenantId:
|
|
1936
|
+
}), r = R.decodeUnknownSync(R.Struct({
|
|
1937
|
+
workflowName: R.String,
|
|
1938
|
+
tenantId: R.NullOr(R.String)
|
|
1938
1939
|
}))(n[0]);
|
|
1939
1940
|
if (r.workflowName !== t.workflowName || r.tenantId !== t.tenantId) throw Error("Receipt target belongs to a different workflow or tenant");
|
|
1940
1941
|
for (;;) {
|
|
1941
1942
|
let n = await e.query({
|
|
1942
|
-
table:
|
|
1943
|
-
predicate:
|
|
1943
|
+
table: De,
|
|
1944
|
+
predicate: z(B("pendingId", t.from), W("submissionId"), W("terminal")),
|
|
1944
1945
|
order: [{
|
|
1945
1946
|
column: "id",
|
|
1946
1947
|
direction: "asc"
|
|
@@ -1951,12 +1952,12 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1951
1952
|
});
|
|
1952
1953
|
if (n.length === 0) return;
|
|
1953
1954
|
for (let r of n) {
|
|
1954
|
-
let n =
|
|
1955
|
+
let n = Fe(r);
|
|
1955
1956
|
if (n.workflowName !== t.workflowName || n.tenantId !== t.tenantId) throw Error("Forwarded receipt belongs to a different workflow or tenant");
|
|
1956
1957
|
if (await e.update("_voltro_workflow_start_receipts", n.id, { pendingId: t.to }) === null) throw Error("Start receipt disappeared during queue transfer");
|
|
1957
1958
|
}
|
|
1958
1959
|
}
|
|
1959
|
-
},
|
|
1960
|
+
}, Yn = {
|
|
1960
1961
|
scanned: 0,
|
|
1961
1962
|
admitted: 0,
|
|
1962
1963
|
deferred: 0,
|
|
@@ -1968,24 +1969,24 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
1968
1969
|
deadLettered: 0,
|
|
1969
1970
|
timedOut: 0,
|
|
1970
1971
|
examined: !1
|
|
1971
|
-
},
|
|
1972
|
+
}, Xn = 200, Zn = class extends Error {
|
|
1972
1973
|
submissionId;
|
|
1973
1974
|
rejected;
|
|
1974
1975
|
constructor(e, t, n = !1) {
|
|
1975
1976
|
super(n ? `Submission ${e} rejected; failure report retained` : `Submission ${e} remains unacknowledged`, { cause: t }), this.submissionId = e, this.rejected = n;
|
|
1976
1977
|
}
|
|
1977
|
-
},
|
|
1978
|
+
}, Qn = (e) => e instanceof Zn && !e.rejected, $n = async (e, t = {}) => {
|
|
1978
1979
|
let n = e.now ?? (() => Date.now()), r = e.log, i = t.batchSize ?? 200, a, o, s, c, l, u;
|
|
1979
1980
|
try {
|
|
1980
|
-
c = await
|
|
1981
|
+
c = await Hn(e, n(), i, e.deadLetterAfterAttempts ?? 50), l = await Wn(e, n(), i), u = await qn(e, n(), i), a = await (e.readPauses?.() ?? be(e.store));
|
|
1981
1982
|
let r = t.skipPending === !0 && !l.hasPending ? {
|
|
1982
1983
|
due: [],
|
|
1983
1984
|
nextDueAt: void 0
|
|
1984
|
-
} : await
|
|
1985
|
+
} : await Ne(e.store, n(), i);
|
|
1985
1986
|
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));
|
|
1986
1987
|
} catch (e) {
|
|
1987
1988
|
return r?.warn?.("workflow flow control: could not read the admission queue", { cause: String(e) }), {
|
|
1988
|
-
...
|
|
1989
|
+
...Yn,
|
|
1989
1990
|
scanned: (c?.scanned ?? 0) + (l?.scanned ?? 0) + (u?.scanned ?? 0),
|
|
1990
1991
|
admitted: c?.admitted ?? 0,
|
|
1991
1992
|
deadLettered: c?.rejected ?? 0,
|
|
@@ -2018,9 +2019,9 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2018
2019
|
if (h !== !1 && t.attempts + 1 >= h) return `pending ${r} was dead-lettered after ${t.attempts + 1} failed attempts: ${String(n)}`;
|
|
2019
2020
|
};
|
|
2020
2021
|
for (let t of m) try {
|
|
2021
|
-
await
|
|
2022
|
+
await rr(e, t, a, d, n());
|
|
2022
2023
|
} catch (i) {
|
|
2023
|
-
if (d.failed++, i instanceof
|
|
2024
|
+
if (d.failed++, i instanceof Zn) {
|
|
2024
2025
|
i.rejected && d.deadLettered++, r?.warn?.(i.message, {
|
|
2025
2026
|
submissionId: i.submissionId,
|
|
2026
2027
|
cause: y(t.workflowName, i.cause)
|
|
@@ -2030,7 +2031,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2030
2031
|
let a = g(t, i, "intent");
|
|
2031
2032
|
if (a !== void 0) {
|
|
2032
2033
|
let o = n(), s = String(i);
|
|
2033
|
-
if (await
|
|
2034
|
+
if (await tr(e, [t], a, s, o, !1).catch((e) => (r?.warn?.("workflow flow control: intent could not be dead-lettered with its report", {
|
|
2034
2035
|
workflow: t.workflowName,
|
|
2035
2036
|
intent: t.id,
|
|
2036
2037
|
cause: String(e)
|
|
@@ -2050,9 +2051,9 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2050
2051
|
}), await _e(e.store, t, String(i), n()).catch(() => {});
|
|
2051
2052
|
}
|
|
2052
2053
|
for (let t of f.values()) try {
|
|
2053
|
-
await
|
|
2054
|
+
await ar(e, t, a, d, n());
|
|
2054
2055
|
} catch (i) {
|
|
2055
|
-
if (d.failed++, i instanceof
|
|
2056
|
+
if (d.failed++, i instanceof Zn) {
|
|
2056
2057
|
i.rejected && d.deadLettered++, r?.warn?.(i.message, {
|
|
2057
2058
|
submissionId: i.submissionId,
|
|
2058
2059
|
cause: y(t[0]?.workflowName, i.cause)
|
|
@@ -2062,7 +2063,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2062
2063
|
let a = t[0], o = a === void 0 ? void 0 : g(a, i, "batch");
|
|
2063
2064
|
if (a !== void 0 && o !== void 0) {
|
|
2064
2065
|
let s = n(), c = String(i);
|
|
2065
|
-
if (await
|
|
2066
|
+
if (await tr(e, t, o, c, s, !0).catch((e) => (r?.warn?.("workflow flow control: batch could not be dead-lettered with its report", {
|
|
2066
2067
|
workflow: a.workflowName,
|
|
2067
2068
|
intents: t.map((e) => e.id),
|
|
2068
2069
|
size: t.length,
|
|
@@ -2087,8 +2088,8 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2087
2088
|
let n = [];
|
|
2088
2089
|
for (let r of t) {
|
|
2089
2090
|
let t = await e.query({
|
|
2090
|
-
table:
|
|
2091
|
-
predicate:
|
|
2091
|
+
table: O,
|
|
2092
|
+
predicate: B("id", r.id),
|
|
2092
2093
|
order: [],
|
|
2093
2094
|
take: 1,
|
|
2094
2095
|
skip: void 0,
|
|
@@ -2096,11 +2097,11 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2096
2097
|
lock: "update"
|
|
2097
2098
|
});
|
|
2098
2099
|
if (t[0] === void 0) return;
|
|
2099
|
-
let i =
|
|
2100
|
+
let i = P(t[0]);
|
|
2100
2101
|
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;
|
|
2101
2102
|
n.push(i);
|
|
2102
2103
|
}
|
|
2103
|
-
let r = new Date(s +
|
|
2104
|
+
let r = new Date(s + Ie(Math.max(...n.map((e) => e.attempts + 1)), () => c));
|
|
2104
2105
|
for (let t of n) if (await e.update("_voltro_workflow_pending", t.id, {
|
|
2105
2106
|
attempts: t.attempts + 1,
|
|
2106
2107
|
lastError: p(t.workflowName, String(i).slice(0, 500)),
|
|
@@ -2113,13 +2114,13 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2113
2114
|
cause: String(e)
|
|
2114
2115
|
}));
|
|
2115
2116
|
}
|
|
2116
|
-
let _ = await
|
|
2117
|
+
let _ = await lr(e, n()).catch(() => ({ cancelled: 0 }));
|
|
2117
2118
|
return d.timedOut = _.cancelled, _.nextDeadlineAt !== void 0 && (s === void 0 || _.nextDeadlineAt < s) && (s = _.nextDeadlineAt), {
|
|
2118
2119
|
...d,
|
|
2119
2120
|
examined: t.skipPending !== !0 || c.examined || l.examined || u.examined,
|
|
2120
2121
|
...s === void 0 ? {} : { nextDueAt: s }
|
|
2121
2122
|
};
|
|
2122
|
-
},
|
|
2123
|
+
}, er = async (e, t, n) => {
|
|
2123
2124
|
let r = t.map((e) => ({
|
|
2124
2125
|
intent: e,
|
|
2125
2126
|
failureId: `wff_${ht()}`
|
|
@@ -2128,8 +2129,8 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2128
2129
|
let t = 0;
|
|
2129
2130
|
for (let { intent: i, failureId: a } of r) {
|
|
2130
2131
|
let r = (await e.query({
|
|
2131
|
-
table:
|
|
2132
|
-
predicate:
|
|
2132
|
+
table: O,
|
|
2133
|
+
predicate: B("id", i.id),
|
|
2133
2134
|
order: [],
|
|
2134
2135
|
take: 1,
|
|
2135
2136
|
skip: void 0,
|
|
@@ -2137,11 +2138,11 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2137
2138
|
lock: "update"
|
|
2138
2139
|
}))[0];
|
|
2139
2140
|
if (r === void 0) continue;
|
|
2140
|
-
let o =
|
|
2141
|
+
let o = P(r);
|
|
2141
2142
|
if (o.workflowName !== i.workflowName || o.tenantId !== i.tenantId) throw Error("Abandoned queue selection belongs to another workflow or tenant");
|
|
2142
2143
|
if (o.dueAt > n || o.deadLetteredAt !== void 0) continue;
|
|
2143
2144
|
let s = `workflow '${o.workflowName}' no longer has its queued declaration`;
|
|
2144
|
-
if (await
|
|
2145
|
+
if (await j(e, {
|
|
2145
2146
|
id: a,
|
|
2146
2147
|
sourceKind: "intent",
|
|
2147
2148
|
sourceId: o.id,
|
|
@@ -2173,14 +2174,14 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2173
2174
|
}
|
|
2174
2175
|
return t;
|
|
2175
2176
|
});
|
|
2176
|
-
},
|
|
2177
|
+
}, tr = async (e, t, n, r, i, a) => {
|
|
2177
2178
|
let o = `wff_${ht()}`;
|
|
2178
2179
|
return e.transaction(async (s) => {
|
|
2179
2180
|
let c = [];
|
|
2180
2181
|
for (let e of t) {
|
|
2181
2182
|
let t = await s.query({
|
|
2182
|
-
table:
|
|
2183
|
-
predicate:
|
|
2183
|
+
table: O,
|
|
2184
|
+
predicate: B("id", e.id),
|
|
2184
2185
|
order: [],
|
|
2185
2186
|
take: 1,
|
|
2186
2187
|
skip: void 0,
|
|
@@ -2188,17 +2189,17 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2188
2189
|
lock: "update"
|
|
2189
2190
|
});
|
|
2190
2191
|
if (t[0] === void 0) return 0;
|
|
2191
|
-
let n =
|
|
2192
|
+
let n = P(t[0]);
|
|
2192
2193
|
if (n.workflowName !== e.workflowName || n.tenantId !== e.tenantId) throw Error("Dead-letter selection belongs to another workflow or tenant");
|
|
2193
2194
|
if (n.deadLetteredAt !== void 0) return 0;
|
|
2194
2195
|
c.push(n);
|
|
2195
2196
|
}
|
|
2196
2197
|
let l = c[0];
|
|
2197
2198
|
if (l === void 0) return 0;
|
|
2198
|
-
let u = await Promise.all(c.map((e) =>
|
|
2199
|
+
let u = await Promise.all(c.map((e) => me(s, e.id)));
|
|
2199
2200
|
if (u.some(Boolean) && !u.every(Boolean)) throw Error("Dead-lettered batch mixes failure delivery and ordinary callers; reconciliation required");
|
|
2200
2201
|
let d = e.controls.get(l.workflowName);
|
|
2201
|
-
await
|
|
2202
|
+
await j(s, {
|
|
2202
2203
|
id: o,
|
|
2203
2204
|
sourceKind: "intent",
|
|
2204
2205
|
sourceId: l.id,
|
|
@@ -2226,17 +2227,17 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2226
2227
|
at: i,
|
|
2227
2228
|
failureId: o
|
|
2228
2229
|
}
|
|
2229
|
-
}), !await
|
|
2230
|
-
return await
|
|
2230
|
+
}), !await oe(s, e, r, i)) throw Error("Dead-lettered queue row disappeared before marking");
|
|
2231
|
+
return await fe(s, o, i), c.length;
|
|
2231
2232
|
});
|
|
2232
|
-
},
|
|
2233
|
+
}, nr = async (e, t, n, r, i) => {
|
|
2233
2234
|
let a = `wff_${ht()}`;
|
|
2234
2235
|
return e.transaction(async (e) => {
|
|
2235
2236
|
let o = [];
|
|
2236
2237
|
for (let i of t) {
|
|
2237
2238
|
let t = await e.query({
|
|
2238
|
-
table:
|
|
2239
|
-
predicate:
|
|
2239
|
+
table: O,
|
|
2240
|
+
predicate: B("id", i.id),
|
|
2240
2241
|
order: [],
|
|
2241
2242
|
take: 1,
|
|
2242
2243
|
skip: void 0,
|
|
@@ -2244,18 +2245,18 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2244
2245
|
lock: "update"
|
|
2245
2246
|
});
|
|
2246
2247
|
if (t[0] === void 0) return 0;
|
|
2247
|
-
let a =
|
|
2248
|
+
let a = P(t[0]);
|
|
2248
2249
|
if (a.workflowName !== n.workflowName || a.tenantId !== i.tenantId) throw Error("Expired queue selection belongs to another workflow or tenant");
|
|
2249
2250
|
if (a.mode !== i.mode || a.dueAt > r || a.deadLetteredAt !== void 0) return 0;
|
|
2250
2251
|
o.push(a);
|
|
2251
2252
|
}
|
|
2252
2253
|
o.sort((e, t) => e.firstSeenAt - t.firstSeenAt || e.id.localeCompare(t.id));
|
|
2253
2254
|
let s = o[0];
|
|
2254
|
-
if (s === void 0 || !
|
|
2255
|
-
let c = await Promise.all(o.map((t) =>
|
|
2255
|
+
if (s === void 0 || !ve(n, s, r)) return 0;
|
|
2256
|
+
let c = await Promise.all(o.map((t) => me(e, t.id)));
|
|
2256
2257
|
if (c.some(Boolean) && !c.every(Boolean)) throw Error("Expired batch mixes failure delivery and ordinary callers; reconciliation required");
|
|
2257
2258
|
let l = `timeouts.start (${n.timeouts?.startMs}ms) elapsed while ${o.length} queued input(s) waited`;
|
|
2258
|
-
await
|
|
2259
|
+
await j(e, {
|
|
2259
2260
|
id: a,
|
|
2260
2261
|
sourceKind: "intent",
|
|
2261
2262
|
sourceId: s.id,
|
|
@@ -2273,10 +2274,10 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2273
2274
|
runId: null,
|
|
2274
2275
|
executionId: null
|
|
2275
2276
|
}
|
|
2276
|
-
}), await
|
|
2277
|
+
}), await A({
|
|
2277
2278
|
store: e,
|
|
2278
2279
|
control: n,
|
|
2279
|
-
keys:
|
|
2280
|
+
keys: D(n, E(e, s.workflowName, s.payload)),
|
|
2280
2281
|
outcome: "expired",
|
|
2281
2282
|
mode: s.mode,
|
|
2282
2283
|
reason: l,
|
|
@@ -2297,23 +2298,23 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2297
2298
|
failureId: a
|
|
2298
2299
|
}
|
|
2299
2300
|
}), !await e.delete("_voltro_workflow_pending", t.id)) throw Error("Expired queue row disappeared before deletion");
|
|
2300
|
-
return await
|
|
2301
|
+
return await fe(e, a, r), o.length;
|
|
2301
2302
|
});
|
|
2302
|
-
},
|
|
2303
|
+
}, rr = async (e, t, n, r, i) => {
|
|
2303
2304
|
if (t = {
|
|
2304
2305
|
...t,
|
|
2305
2306
|
payload: E(e.store, t.workflowName, t.payload)
|
|
2306
|
-
}, t.mode === "delayed") return
|
|
2307
|
+
}, t.mode === "delayed") return ir(e, t, n, r, i);
|
|
2307
2308
|
let a = e.controls.get(t.workflowName);
|
|
2308
2309
|
if (a === void 0) {
|
|
2309
|
-
r.expired += await
|
|
2310
|
+
r.expired += await er(e, [t], i);
|
|
2310
2311
|
return;
|
|
2311
2312
|
}
|
|
2312
|
-
if (
|
|
2313
|
-
r.expired += await
|
|
2313
|
+
if (ve(a, t, i)) {
|
|
2314
|
+
r.expired += await nr(e, [t], a, i, !1);
|
|
2314
2315
|
return;
|
|
2315
2316
|
}
|
|
2316
|
-
let o =
|
|
2317
|
+
let o = D(a, t.payload), s = await ce({
|
|
2317
2318
|
store: e.store,
|
|
2318
2319
|
control: a,
|
|
2319
2320
|
keys: o,
|
|
@@ -2321,7 +2322,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2321
2322
|
now: i,
|
|
2322
2323
|
reconsidering: !0
|
|
2323
2324
|
});
|
|
2324
|
-
await
|
|
2325
|
+
await or(e, {
|
|
2325
2326
|
control: a,
|
|
2326
2327
|
intent: t,
|
|
2327
2328
|
decision: s,
|
|
@@ -2331,15 +2332,15 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2331
2332
|
paused: n,
|
|
2332
2333
|
items: void 0
|
|
2333
2334
|
});
|
|
2334
|
-
},
|
|
2335
|
+
}, ir = async (e, t, n, r, i) => {
|
|
2335
2336
|
if (e.registeredWorkflows !== void 0 && !e.registeredWorkflows.has(t.workflowName)) {
|
|
2336
|
-
r.expired += await
|
|
2337
|
+
r.expired += await er(e, [t], i);
|
|
2337
2338
|
return;
|
|
2338
2339
|
}
|
|
2339
|
-
let a = e.controls.get(t.workflowName) ?? { workflowName: t.workflowName }, o =
|
|
2340
|
+
let a = e.controls.get(t.workflowName) ?? { workflowName: t.workflowName }, o = Se(), s = await e.transaction(async (e) => {
|
|
2340
2341
|
let r = await e.query({
|
|
2341
|
-
table:
|
|
2342
|
-
predicate:
|
|
2342
|
+
table: O,
|
|
2343
|
+
predicate: B("id", t.id),
|
|
2343
2344
|
lock: "update",
|
|
2344
2345
|
order: [],
|
|
2345
2346
|
take: 1,
|
|
@@ -2347,10 +2348,10 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2347
2348
|
projection: void 0
|
|
2348
2349
|
});
|
|
2349
2350
|
if (r[0] === void 0) return;
|
|
2350
|
-
let s =
|
|
2351
|
+
let s = P(r[0]);
|
|
2351
2352
|
if (s.workflowName !== t.workflowName || s.tenantId !== t.tenantId) throw Error("Delayed arrival belongs to a different workflow or tenant");
|
|
2352
2353
|
if (s.mode !== "delayed" || s.deadLetteredAt !== void 0 || s.dueAt > i) return;
|
|
2353
|
-
let c = await
|
|
2354
|
+
let c = await dn({
|
|
2354
2355
|
store: e,
|
|
2355
2356
|
control: a,
|
|
2356
2357
|
payload: E(e, s.workflowName, s.payload),
|
|
@@ -2360,18 +2361,18 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2360
2361
|
now: i,
|
|
2361
2362
|
waiting: !1
|
|
2362
2363
|
});
|
|
2363
|
-
if (c.kind === "queued" && (await
|
|
2364
|
+
if (c.kind === "queued" && (await Jn(e, {
|
|
2364
2365
|
from: s.id,
|
|
2365
2366
|
to: c.intentId,
|
|
2366
2367
|
workflowName: s.workflowName,
|
|
2367
2368
|
tenantId: s.tenantId
|
|
2368
|
-
}), !await
|
|
2369
|
+
}), !await de(e, s.id))) throw Error("Delayed arrival disappeared during queue transfer");
|
|
2369
2370
|
if (c.kind === "start") {
|
|
2370
2371
|
if (c.ledgerId === void 0) throw Error("Delayed arrival has no admission reservation");
|
|
2371
|
-
let t = a.batch === void 0 ?
|
|
2372
|
+
let t = a.batch === void 0 ? ye(e, s.workflowName, c.payload) : { items: R.decodeUnknownSync(R.Struct({ items: R.Array(R.Unknown) }))(c.payload).items.map((t) => ye(e, s.workflowName, t)) };
|
|
2372
2373
|
return {
|
|
2373
2374
|
kind: "submission",
|
|
2374
|
-
submission: await
|
|
2375
|
+
submission: await cn(e, {
|
|
2375
2376
|
id: o,
|
|
2376
2377
|
workflowName: s.workflowName,
|
|
2377
2378
|
tenantId: s.tenantId,
|
|
@@ -2392,7 +2393,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2392
2393
|
...c,
|
|
2393
2394
|
at: i
|
|
2394
2395
|
}
|
|
2395
|
-
}), !await
|
|
2396
|
+
}), !await de(e, s.id))) throw Error("Delayed arrival disappeared while recording its outcome");
|
|
2396
2397
|
return c;
|
|
2397
2398
|
});
|
|
2398
2399
|
if (s !== void 0) {
|
|
@@ -2408,9 +2409,9 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2408
2409
|
r.skipped++;
|
|
2409
2410
|
return;
|
|
2410
2411
|
}
|
|
2411
|
-
await
|
|
2412
|
+
await cr(e, s.submission, a, r, i, a.batch !== void 0, s.keys);
|
|
2412
2413
|
}
|
|
2413
|
-
},
|
|
2414
|
+
}, ar = async (e, t, n, r, i) => {
|
|
2414
2415
|
t = t.map((t) => ({
|
|
2415
2416
|
...t,
|
|
2416
2417
|
payload: E(e.store, t.workflowName, t.payload)
|
|
@@ -2419,19 +2420,19 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2419
2420
|
if (a === void 0) return;
|
|
2420
2421
|
let o = e.controls.get(a.workflowName);
|
|
2421
2422
|
if (o === void 0 || o.batch === void 0) {
|
|
2422
|
-
r.expired += await
|
|
2423
|
+
r.expired += await er(e, t, i);
|
|
2423
2424
|
return;
|
|
2424
2425
|
}
|
|
2425
2426
|
let s = [...t].sort((e, t) => e.firstSeenAt - t.firstSeenAt), c = s[0];
|
|
2426
|
-
if (
|
|
2427
|
-
r.expired += await
|
|
2427
|
+
if (ve(o, c, i)) {
|
|
2428
|
+
r.expired += await nr(e, s, o, i, !0);
|
|
2428
2429
|
return;
|
|
2429
2430
|
}
|
|
2430
|
-
let l =
|
|
2431
|
-
await
|
|
2431
|
+
let l = D(o, c.payload);
|
|
2432
|
+
await or(e, {
|
|
2432
2433
|
control: o,
|
|
2433
2434
|
intent: c,
|
|
2434
|
-
decision: await
|
|
2435
|
+
decision: await ce({
|
|
2435
2436
|
store: e.store,
|
|
2436
2437
|
control: o,
|
|
2437
2438
|
keys: l,
|
|
@@ -2445,10 +2446,10 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2445
2446
|
paused: n,
|
|
2446
2447
|
items: s
|
|
2447
2448
|
});
|
|
2448
|
-
},
|
|
2449
|
+
}, or = async (e, t) => {
|
|
2449
2450
|
let { control: n, intent: r, decision: i, keys: a, counters: o, now: s, items: c, paused: l } = t;
|
|
2450
2451
|
if (i.kind === "defer") {
|
|
2451
|
-
await
|
|
2452
|
+
await ue({
|
|
2452
2453
|
store: e.store,
|
|
2453
2454
|
control: n,
|
|
2454
2455
|
decision: i,
|
|
@@ -2465,8 +2466,8 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2465
2466
|
let t = [];
|
|
2466
2467
|
for (let i of c ?? [r]) {
|
|
2467
2468
|
let a = await e.query({
|
|
2468
|
-
table:
|
|
2469
|
-
predicate:
|
|
2469
|
+
table: O,
|
|
2470
|
+
predicate: B("id", i.id),
|
|
2470
2471
|
lock: "update",
|
|
2471
2472
|
order: [],
|
|
2472
2473
|
take: 1,
|
|
@@ -2474,17 +2475,17 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2474
2475
|
projection: void 0
|
|
2475
2476
|
});
|
|
2476
2477
|
if (a[0] === void 0) return;
|
|
2477
|
-
let o =
|
|
2478
|
+
let o = P(a[0]);
|
|
2478
2479
|
if (o.workflowName !== n.workflowName || o.tenantId !== r.tenantId) throw Error("Terminal queue selection belongs to a different workflow or tenant");
|
|
2479
2480
|
if (o.dueAt > s || o.deadLetteredAt !== void 0 || o.mode !== i.mode) return;
|
|
2480
2481
|
t.push(o);
|
|
2481
2482
|
}
|
|
2482
2483
|
t.sort((e, t) => e.firstSeenAt - t.firstSeenAt);
|
|
2483
|
-
let i = t[0], a =
|
|
2484
|
+
let i = t[0], a = D(n, E(e, n.workflowName, i.payload)), o = await ce({
|
|
2484
2485
|
store: e,
|
|
2485
2486
|
control: n,
|
|
2486
2487
|
keys: a,
|
|
2487
|
-
paused: l.has(n.workflowName) || (await
|
|
2488
|
+
paused: l.has(n.workflowName) || (await be(e)).has(n.workflowName),
|
|
2488
2489
|
now: s,
|
|
2489
2490
|
reconsidering: !0
|
|
2490
2491
|
});
|
|
@@ -2499,7 +2500,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2499
2500
|
executionId: o.incumbent.executionId,
|
|
2500
2501
|
runId: o.incumbent.runId
|
|
2501
2502
|
};
|
|
2502
|
-
await
|
|
2503
|
+
await A({
|
|
2503
2504
|
store: e,
|
|
2504
2505
|
control: n,
|
|
2505
2506
|
keys: a,
|
|
@@ -2518,13 +2519,13 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2518
2519
|
workflowName: n.workflowName,
|
|
2519
2520
|
tenantId: n.tenantId,
|
|
2520
2521
|
terminal: u
|
|
2521
|
-
}), !await
|
|
2522
|
+
}), !await de(e, n.id)) throw Error("Queued input disappeared while recording its terminal outcome");
|
|
2522
2523
|
return u.kind;
|
|
2523
2524
|
});
|
|
2524
2525
|
t !== void 0 && o[t]++;
|
|
2525
2526
|
return;
|
|
2526
2527
|
}
|
|
2527
|
-
let u =
|
|
2528
|
+
let u = Se(), d = await e.transaction((t) => un(t, {
|
|
2528
2529
|
id: u,
|
|
2529
2530
|
workflowName: n.workflowName,
|
|
2530
2531
|
tenantId: r.tenantId,
|
|
@@ -2549,16 +2550,16 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2549
2550
|
o.deferred++;
|
|
2550
2551
|
return;
|
|
2551
2552
|
}
|
|
2552
|
-
await
|
|
2553
|
+
await cr(e, d.submission, n, o, s, c !== void 0, a);
|
|
2553
2554
|
}
|
|
2554
|
-
},
|
|
2555
|
-
let a = await e.transaction((e) =>
|
|
2555
|
+
}, sr = async (e, t, n, r, i) => {
|
|
2556
|
+
let a = await e.transaction((e) => M(e, t.id));
|
|
2556
2557
|
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");
|
|
2557
2558
|
if (a.executionId !== null) {
|
|
2558
2559
|
if (a.failureId !== null || a.executionId.length === 0 || a.executionId !== a.preparedExecutionId) throw Error("Admission acceptance has contradictory resident execution evidence");
|
|
2559
2560
|
return a.executionId;
|
|
2560
2561
|
}
|
|
2561
|
-
await
|
|
2562
|
+
await cr(e, a, n, {
|
|
2562
2563
|
admitted: 0,
|
|
2563
2564
|
deferred: 0,
|
|
2564
2565
|
dropped: 0,
|
|
@@ -2566,17 +2567,17 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2566
2567
|
expired: 0,
|
|
2567
2568
|
evicted: 0
|
|
2568
2569
|
}, i, n.batch !== void 0, r);
|
|
2569
|
-
let o = await e.transaction((e) =>
|
|
2570
|
+
let o = await e.transaction((e) => M(e, t.id));
|
|
2570
2571
|
if (o?.executionId == null || o.executionId !== o.preparedExecutionId) throw Error("Admission submission has no confirmed engine acceptance");
|
|
2571
2572
|
return o.executionId;
|
|
2572
|
-
},
|
|
2573
|
+
}, cr = async (e, t, n, r, i, a, o) => {
|
|
2573
2574
|
let s = t.dispatchAttempts === 0 ? 0 : void 0;
|
|
2574
2575
|
try {
|
|
2575
2576
|
if (e.acquireSubmissionCapacity !== void 0 && !await e.acquireSubmissionCapacity(t)) {
|
|
2576
2577
|
r.deferred++;
|
|
2577
2578
|
return;
|
|
2578
2579
|
}
|
|
2579
|
-
let c = a ? { items:
|
|
2580
|
+
let c = a ? { items: R.decodeUnknownSync(R.Struct({ items: R.Array(R.Unknown) }))(t.payload).items.map((t) => E(e.store, n.workflowName, t)) } : E(e.store, n.workflowName, t.payload), l = await Bn(e, t, c), u = await e.transaction((e) => xe(e, t.id, i));
|
|
2580
2581
|
if (u === null) return;
|
|
2581
2582
|
s = u.dispatchAttempts === 1 ? 1 : void 0;
|
|
2582
2583
|
let d = await e.startAdmitted(n.workflowName, c, t.callerContext, l);
|
|
@@ -2590,7 +2591,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2590
2591
|
source: "flow-control",
|
|
2591
2592
|
mode: "singleton"
|
|
2592
2593
|
}
|
|
2593
|
-
}), await x(e.store, t.eviction.executionId, i), await
|
|
2594
|
+
}), await x(e.store, t.eviction.executionId, i), await A({
|
|
2594
2595
|
store: e.store,
|
|
2595
2596
|
control: n,
|
|
2596
2597
|
keys: o,
|
|
@@ -2603,7 +2604,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2603
2604
|
runId: t.eviction.runId || null,
|
|
2604
2605
|
tenantId: t.tenantId,
|
|
2605
2606
|
now: i
|
|
2606
|
-
}), r.evicted++), await e.transaction((e) =>
|
|
2607
|
+
}), r.evicted++), await e.transaction((e) => we(e, t.id, {
|
|
2607
2608
|
executionId: d.executionId,
|
|
2608
2609
|
runId: d.runId ?? null
|
|
2609
2610
|
})), r.admitted++;
|
|
@@ -2612,14 +2613,14 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2612
2613
|
try {
|
|
2613
2614
|
if (s !== void 0 && e.isPermanentStartError?.(r) === !0) {
|
|
2614
2615
|
let o = s;
|
|
2615
|
-
a = await e.transaction((e) =>
|
|
2616
|
+
a = await e.transaction((e) => S(e, t.id, o, {
|
|
2616
2617
|
handler: n.onFailure ?? null,
|
|
2617
2618
|
errorMessage: String(r),
|
|
2618
2619
|
now: i
|
|
2619
2620
|
})) !== void 0;
|
|
2620
2621
|
}
|
|
2621
2622
|
if (!a) {
|
|
2622
|
-
let n = await e.transaction((n) =>
|
|
2623
|
+
let n = await e.transaction((n) => Ve(n, t.id, String(r), i, e.deadLetterAfterAttempts ?? 50));
|
|
2623
2624
|
n.retry.stoppedAt !== null && e.log?.warn?.("workflow submission automatic retry stopped; engine acceptance unknown", {
|
|
2624
2625
|
submissionId: t.id,
|
|
2625
2626
|
workflow: t.workflowName,
|
|
@@ -2627,18 +2628,18 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2627
2628
|
});
|
|
2628
2629
|
}
|
|
2629
2630
|
} catch (e) {
|
|
2630
|
-
throw new
|
|
2631
|
+
throw new Zn(t.id, AggregateError([r, e], "Submission and retry recording failed"));
|
|
2631
2632
|
}
|
|
2632
|
-
throw new
|
|
2633
|
+
throw new Zn(t.id, r, a);
|
|
2633
2634
|
}
|
|
2634
|
-
},
|
|
2635
|
+
}, lr = async (e, t) => {
|
|
2635
2636
|
if (e.listRunningRuns === void 0) return { cancelled: 0 };
|
|
2636
2637
|
let n = 0, r;
|
|
2637
2638
|
for (let i of e.controls.values()) {
|
|
2638
2639
|
if (i.timeouts?.finishMs === void 0) continue;
|
|
2639
2640
|
let a = await e.listRunningRuns(i.workflowName);
|
|
2640
2641
|
for (let o of a) {
|
|
2641
|
-
if (!
|
|
2642
|
+
if (!T(i, {
|
|
2642
2643
|
startedAt: o.startedAt,
|
|
2643
2644
|
terminal: !1
|
|
2644
2645
|
}, t)) {
|
|
@@ -2653,7 +2654,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2653
2654
|
executionId: o.executionId,
|
|
2654
2655
|
reason: a,
|
|
2655
2656
|
detail: {
|
|
2656
|
-
...
|
|
2657
|
+
...Le,
|
|
2657
2658
|
onFailure: i.onFailure ?? null
|
|
2658
2659
|
}
|
|
2659
2660
|
}) && (await x(e.store, o.executionId, t), n++);
|
|
@@ -2663,44 +2664,44 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2663
2664
|
cancelled: n,
|
|
2664
2665
|
...r === void 0 ? {} : { nextDeadlineAt: r }
|
|
2665
2666
|
};
|
|
2666
|
-
},
|
|
2667
|
-
|
|
2668
|
-
},
|
|
2667
|
+
}, ur = 3e5, dr, fr = (e) => {
|
|
2668
|
+
dr = e !== void 0 && Number.isFinite(e) && e > 0 ? e : void 0;
|
|
2669
|
+
}, pr = () => {
|
|
2669
2670
|
let e = process.env.VOLTRO_WORKFLOW_SUSPEND_HINT_MS;
|
|
2670
2671
|
if (e !== void 0) {
|
|
2671
2672
|
let t = Number(e);
|
|
2672
2673
|
if (Number.isFinite(t) && t > 0) return t;
|
|
2673
2674
|
}
|
|
2674
|
-
return
|
|
2675
|
-
},
|
|
2676
|
-
|
|
2677
|
-
},
|
|
2678
|
-
let t =
|
|
2675
|
+
return dr ?? 3e5;
|
|
2676
|
+
}, mr = /* @__PURE__ */ new Set(), hr = () => {
|
|
2677
|
+
mr.clear();
|
|
2678
|
+
}, gr = (e) => {
|
|
2679
|
+
let t = pr();
|
|
2679
2680
|
if (!(e.timeoutMs > t)) return !1;
|
|
2680
2681
|
let n = `${e.workflowName ?? ""}\u0000${e.signalName}`;
|
|
2681
|
-
if (
|
|
2682
|
-
|
|
2682
|
+
if (mr.has(n)) return !1;
|
|
2683
|
+
mr.add(n);
|
|
2683
2684
|
let r = e.workflowName === void 0 ? "" : ` in workflow '${e.workflowName}'`;
|
|
2684
2685
|
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;
|
|
2685
|
-
},
|
|
2686
|
+
}, _r = async (e, t) => {
|
|
2686
2687
|
if (e) try {
|
|
2687
2688
|
await e.recordEvent(t);
|
|
2688
2689
|
} catch {}
|
|
2689
|
-
},
|
|
2690
|
-
let r =
|
|
2691
|
-
let r = n.pollIntervalMs ?? 200, i = n.maxPollIntervalMs ?? 5e3, a = n.timeoutMs ?? 864e5, s = yield*
|
|
2692
|
-
|
|
2690
|
+
}, vr = (e, n) => {
|
|
2691
|
+
let r = I.gen(function* () {
|
|
2692
|
+
let r = n.pollIntervalMs ?? 200, i = n.maxPollIntervalMs ?? 5e3, a = n.timeoutMs ?? 864e5, s = yield* I.serviceOption(Y), c;
|
|
2693
|
+
gr({
|
|
2693
2694
|
workflowName: s._tag === "Some" ? s.value.workflow.name : void 0,
|
|
2694
2695
|
signalName: n.name,
|
|
2695
2696
|
timeoutMs: a,
|
|
2696
2697
|
warn: (e) => {
|
|
2697
2698
|
c = e;
|
|
2698
2699
|
}
|
|
2699
|
-
}), c !== void 0 && (yield*
|
|
2700
|
-
let l = yield* t, u = yield*
|
|
2701
|
-
if (l === void 0) return yield*
|
|
2700
|
+
}), c !== void 0 && (yield* I.logWarning(c));
|
|
2701
|
+
let l = yield* t, u = yield* I.serviceOption(o), d = u._tag === "Some" ? u.value : void 0;
|
|
2702
|
+
if (l === void 0) return yield* I.die(/* @__PURE__ */ Error("awaitSignal: no active workflow run id in scope"));
|
|
2702
2703
|
let f = l;
|
|
2703
|
-
yield*
|
|
2704
|
+
yield* I.promise(() => _r(d, {
|
|
2704
2705
|
runId: f,
|
|
2705
2706
|
eventType: "signal-awaited",
|
|
2706
2707
|
payload: { signalName: n.name }
|
|
@@ -2708,24 +2709,24 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2708
2709
|
let p = Date.now(), m = r;
|
|
2709
2710
|
for (;;) {
|
|
2710
2711
|
let t = Date.now() - p;
|
|
2711
|
-
if (t > a) return yield*
|
|
2712
|
+
if (t > a) return yield* I.die(/* @__PURE__ */ Error(`awaitSignal('${n.name}') timed out after ${t}ms`));
|
|
2712
2713
|
let r = {
|
|
2713
2714
|
table: "_voltro_workflow_run_events",
|
|
2714
2715
|
order: [{
|
|
2715
2716
|
column: "occurredAt",
|
|
2716
2717
|
direction: "asc"
|
|
2717
2718
|
}],
|
|
2718
|
-
predicate:
|
|
2719
|
+
predicate: z(B("runId", f), B("eventType", "signal-sent")),
|
|
2719
2720
|
projection: void 0,
|
|
2720
2721
|
skip: void 0,
|
|
2721
2722
|
take: 1e3
|
|
2722
|
-
}, o = (yield*
|
|
2723
|
+
}, o = (yield* I.tryPromise({
|
|
2723
2724
|
try: () => e.store.query(r),
|
|
2724
2725
|
catch: (e) => e
|
|
2725
2726
|
})).find((e) => e.payload?.signalName === n.name);
|
|
2726
2727
|
if (o !== void 0) {
|
|
2727
|
-
let e = h(o.payload)?.value, t = yield*
|
|
2728
|
-
return yield*
|
|
2728
|
+
let e = h(o.payload)?.value, t = yield* R.decodeUnknown(n.schema)(e);
|
|
2729
|
+
return yield* I.promise(() => _r(d, {
|
|
2729
2730
|
runId: f,
|
|
2730
2731
|
eventType: "signal-received",
|
|
2731
2732
|
payload: {
|
|
@@ -2734,7 +2735,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2734
2735
|
}
|
|
2735
2736
|
})), t;
|
|
2736
2737
|
}
|
|
2737
|
-
yield*
|
|
2738
|
+
yield* I.sleep(`${m} millis`), m = Math.min(m * 2, i);
|
|
2738
2739
|
}
|
|
2739
2740
|
});
|
|
2740
2741
|
return f({
|
|
@@ -2742,16 +2743,16 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2742
2743
|
success: n.schema,
|
|
2743
2744
|
execute: r
|
|
2744
2745
|
});
|
|
2745
|
-
},
|
|
2746
|
+
}, yr = async (e, t) => {
|
|
2746
2747
|
if (e !== void 0) try {
|
|
2747
2748
|
await e.recordEvent(t);
|
|
2748
2749
|
} catch {}
|
|
2749
|
-
},
|
|
2750
|
-
let r =
|
|
2751
|
-
let r = n.pollIntervalMs ?? 200, i = n.maxPollIntervalMs ?? 5e3, a = n.timeoutMs ?? 864e5, s = n.take ?? 500, c = yield* t, l = yield*
|
|
2752
|
-
if (c === void 0) return yield*
|
|
2753
|
-
let d = c, f = yield* n.since === "run-start" ?
|
|
2754
|
-
yield*
|
|
2750
|
+
}, br = (e, n) => {
|
|
2751
|
+
let r = I.gen(function* () {
|
|
2752
|
+
let r = n.pollIntervalMs ?? 200, i = n.maxPollIntervalMs ?? 5e3, a = n.timeoutMs ?? 864e5, s = n.take ?? 500, c = yield* t, l = yield* I.serviceOption(o), u = l._tag === "Some" ? l.value : void 0;
|
|
2753
|
+
if (c === void 0) return yield* I.die(/* @__PURE__ */ Error("awaitEvent: no active workflow run id in scope"));
|
|
2754
|
+
let d = c, f = yield* n.since === "run-start" ? xr(e, d) : I.succeed(/* @__PURE__ */ new Date());
|
|
2755
|
+
yield* I.promise(() => yr(u, {
|
|
2755
2756
|
runId: d,
|
|
2756
2757
|
eventType: "event-awaited",
|
|
2757
2758
|
payload: {
|
|
@@ -2763,10 +2764,10 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2763
2764
|
let p = Date.now(), m = r, h = 0;
|
|
2764
2765
|
for (;;) {
|
|
2765
2766
|
let t = Date.now() - p;
|
|
2766
|
-
if (t > a) return yield*
|
|
2767
|
+
if (t > a) return yield* I.die(/* @__PURE__ */ Error(`awaitEvent('${n.event}') timed out after ${t}ms having examined ${h} candidate event(s). ${h === 0 ? "NONE were published under that name in the window — check the spelling against ctx.events.publish, and consider since: 'run-start' if the event may have arrived before this step began." : "The predicate rejected all of them — log one payload and compare it with what `match` expects."}`));
|
|
2767
2768
|
let r = {
|
|
2768
2769
|
table: "_voltro_workflow_events",
|
|
2769
|
-
predicate:
|
|
2770
|
+
predicate: z(B("name", n.event), it("occurredAt", f)),
|
|
2770
2771
|
order: [{
|
|
2771
2772
|
column: "occurredAt",
|
|
2772
2773
|
direction: "asc"
|
|
@@ -2774,14 +2775,14 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2774
2775
|
take: s,
|
|
2775
2776
|
skip: void 0,
|
|
2776
2777
|
projection: void 0
|
|
2777
|
-
}, o = yield*
|
|
2778
|
+
}, o = yield* I.tryPromise({
|
|
2778
2779
|
try: () => e.store.query(r),
|
|
2779
2780
|
catch: (e) => e
|
|
2780
2781
|
});
|
|
2781
2782
|
h = o.length;
|
|
2782
2783
|
for (let e of o) {
|
|
2783
|
-
let t = yield*
|
|
2784
|
-
if (n.match(t)) return yield*
|
|
2784
|
+
let t = yield* R.decodeUnknown(n.schema)(e.payload);
|
|
2785
|
+
if (n.match(t)) return yield* I.promise(() => yr(u, {
|
|
2785
2786
|
runId: d,
|
|
2786
2787
|
eventType: "event-received",
|
|
2787
2788
|
payload: {
|
|
@@ -2790,7 +2791,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2790
2791
|
}
|
|
2791
2792
|
})), t;
|
|
2792
2793
|
}
|
|
2793
|
-
yield*
|
|
2794
|
+
yield* I.sleep(`${m} millis`), m = Math.min(m * 2, i);
|
|
2794
2795
|
}
|
|
2795
2796
|
});
|
|
2796
2797
|
return f({
|
|
@@ -2798,11 +2799,11 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2798
2799
|
success: n.schema,
|
|
2799
2800
|
execute: r
|
|
2800
2801
|
});
|
|
2801
|
-
},
|
|
2802
|
-
let n = (yield*
|
|
2802
|
+
}, xr = (e, t) => I.gen(function* () {
|
|
2803
|
+
let n = (yield* I.tryPromise({
|
|
2803
2804
|
try: () => e.store.query({
|
|
2804
2805
|
table: "_voltro_workflow_runs",
|
|
2805
|
-
predicate:
|
|
2806
|
+
predicate: B("id", t),
|
|
2806
2807
|
order: [],
|
|
2807
2808
|
take: 1,
|
|
2808
2809
|
skip: void 0,
|
|
@@ -2816,16 +2817,20 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2816
2817
|
if (!Number.isNaN(e.getTime())) return e;
|
|
2817
2818
|
}
|
|
2818
2819
|
return /* @__PURE__ */ new Date(0);
|
|
2819
|
-
}),
|
|
2820
|
+
}), Sr = class extends Je.Reference()("@voltro/workflow/SuspensionUnavailable", { defaultValue: () => void 0 }) {}, Cr = class extends Error {
|
|
2821
|
+
constructor(e, t) {
|
|
2822
|
+
super(`${e} cannot wait for a durable result here: ${t}`), this.name = "WorkflowCannotPark";
|
|
2823
|
+
}
|
|
2824
|
+
}, wr = (e) => new Promise((t) => setTimeout(t, e)), Tr = () => {
|
|
2820
2825
|
let e = globalThis.crypto;
|
|
2821
2826
|
return typeof e?.randomUUID == "function" ? e.randomUUID() : `${Date.now().toString(36)}${Math.random().toString(36).slice(2)}`;
|
|
2822
|
-
},
|
|
2827
|
+
}, Er = () => `wfu_${Tr()}`, Dr = async (e, t) => {
|
|
2823
2828
|
let n = t.id ?? t.executionId;
|
|
2824
2829
|
if (!n) throw Error("workflow message target requires target.id or target.executionId");
|
|
2825
2830
|
let r = await e.query({
|
|
2826
2831
|
table: "_voltro_workflow_runs",
|
|
2827
2832
|
order: [],
|
|
2828
|
-
predicate:
|
|
2833
|
+
predicate: B("id", n),
|
|
2829
2834
|
projection: void 0,
|
|
2830
2835
|
skip: void 0,
|
|
2831
2836
|
take: 1
|
|
@@ -2834,14 +2839,14 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2834
2839
|
let i = (await e.query({
|
|
2835
2840
|
table: "_voltro_workflow_runs",
|
|
2836
2841
|
order: [],
|
|
2837
|
-
predicate:
|
|
2842
|
+
predicate: B("executionId", n),
|
|
2838
2843
|
projection: void 0,
|
|
2839
2844
|
skip: void 0,
|
|
2840
2845
|
take: 1
|
|
2841
2846
|
}))[0];
|
|
2842
2847
|
if (!i) throw Error(`workflow message target not found: ${n}`);
|
|
2843
2848
|
return i;
|
|
2844
|
-
},
|
|
2849
|
+
}, Or = class extends Error {
|
|
2845
2850
|
runId;
|
|
2846
2851
|
eventType;
|
|
2847
2852
|
eventId;
|
|
@@ -2849,8 +2854,8 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2849
2854
|
constructor(e, t, n) {
|
|
2850
2855
|
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";
|
|
2851
2856
|
}
|
|
2852
|
-
},
|
|
2853
|
-
let t = await
|
|
2857
|
+
}, kr = async (e) => {
|
|
2858
|
+
let t = await Dr(e.store, e.target), n = await e.recorder.recordEvent({
|
|
2854
2859
|
runId: t.id,
|
|
2855
2860
|
eventType: "signal-sent",
|
|
2856
2861
|
payload: {
|
|
@@ -2858,10 +2863,10 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2858
2863
|
value: e.payload
|
|
2859
2864
|
}
|
|
2860
2865
|
});
|
|
2861
|
-
if (n.recorded === !1) throw new
|
|
2866
|
+
if (n.recorded === !1) throw new Or(t.id, "signal-sent", n.id);
|
|
2862
2867
|
return { eventId: n.id };
|
|
2863
|
-
},
|
|
2864
|
-
let t = await
|
|
2868
|
+
}, Ar = async (e) => {
|
|
2869
|
+
let t = await Dr(e.store, e.target), n = Er(), r = await e.recorder.recordEvent({
|
|
2865
2870
|
runId: t.id,
|
|
2866
2871
|
eventType: "update-requested",
|
|
2867
2872
|
payload: {
|
|
@@ -2870,7 +2875,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2870
2875
|
value: e.payload
|
|
2871
2876
|
}
|
|
2872
2877
|
});
|
|
2873
|
-
if (r.recorded === !1) throw new
|
|
2878
|
+
if (r.recorded === !1) throw new Or(t.id, "update-requested", r.id);
|
|
2874
2879
|
let i = Date.now(), a = e.options?.timeoutMs ?? 3e4, o = e.options?.pollIntervalMs ?? 100;
|
|
2875
2880
|
for (;;) {
|
|
2876
2881
|
let s = {
|
|
@@ -2879,7 +2884,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2879
2884
|
column: "occurredAt",
|
|
2880
2885
|
direction: "asc"
|
|
2881
2886
|
}],
|
|
2882
|
-
predicate:
|
|
2887
|
+
predicate: B("runId", t.id),
|
|
2883
2888
|
projection: void 0,
|
|
2884
2889
|
skip: void 0,
|
|
2885
2890
|
take: 1e3
|
|
@@ -2900,99 +2905,101 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
2900
2905
|
}), t;
|
|
2901
2906
|
}
|
|
2902
2907
|
if (Date.now() - i >= a) throw Error(`Timed out waiting for workflow update '${e.updateName}' (${n})`);
|
|
2903
|
-
await
|
|
2908
|
+
await wr(o);
|
|
2904
2909
|
}
|
|
2905
|
-
},
|
|
2910
|
+
}, jr = 864e5, Mr = "voltro/suspending-signal", Nr = (e, t) => `${Mr}/${e}/${t}`, Pr = (e, t) => Ge.make(e, { success: _(t) ? u(R.Unknown, `signal '${e}' value`) : R.Unknown }), Fr = async (e, t) => {
|
|
2906
2911
|
if (e) try {
|
|
2907
2912
|
await e.recordEvent(t);
|
|
2908
2913
|
} catch {}
|
|
2909
|
-
},
|
|
2910
|
-
let e =
|
|
2911
|
-
|
|
2912
|
-
|
|
2914
|
+
}, Ir = (e, n) => I.gen(function* () {
|
|
2915
|
+
let e = yield* Sr;
|
|
2916
|
+
if (e !== void 0) return yield* I.die(new Cr(`awaitSignalSuspending('${n.name}')`, e));
|
|
2917
|
+
let r = n.timeoutMs ?? jr, i = yield* qe.WorkflowInstance, a = Pr(Nr(i.workflow.name, n.name), i.workflow.name), s = yield* t, c = yield* I.serviceOption(o), l = c._tag === "Some" ? c.value : void 0;
|
|
2918
|
+
s !== void 0 && (yield* I.promise(() => Fr(l, {
|
|
2919
|
+
runId: s,
|
|
2913
2920
|
eventType: "signal-awaited",
|
|
2914
2921
|
payload: { signalName: n.name }
|
|
2915
2922
|
})));
|
|
2916
|
-
let
|
|
2923
|
+
let u = Ge.await(a), d = Number.isFinite(r) ? yield* I.race(u, We.sleep({
|
|
2917
2924
|
name: `await-signal-timeout/${n.name}`,
|
|
2918
2925
|
inMemoryThreshold: "0 millis",
|
|
2919
|
-
duration: `${
|
|
2920
|
-
}).pipe(
|
|
2921
|
-
return
|
|
2922
|
-
runId:
|
|
2926
|
+
duration: `${r} millis`
|
|
2927
|
+
}).pipe(I.andThen(I.die(/* @__PURE__ */ Error(`awaitSignalSuspending('${n.name}') timed out after ${r}ms`))))).pipe(I.catchAllCause((e) => i.suspended ? F.isInterruptedOnly(e) ? Ke.suspend(i) : I.failCause(F.filter(e, (e) => !F.isInterruptType(e))) : I.failCause(e))) : yield* u, f = yield* R.decodeUnknown(n.schema)(d);
|
|
2928
|
+
return s !== void 0 && (yield* I.promise(() => Fr(l, {
|
|
2929
|
+
runId: s,
|
|
2923
2930
|
eventType: "signal-received",
|
|
2924
2931
|
payload: {
|
|
2925
2932
|
signalName: n.name,
|
|
2926
|
-
value:
|
|
2933
|
+
value: f
|
|
2927
2934
|
}
|
|
2928
|
-
}))),
|
|
2929
|
-
}),
|
|
2935
|
+
}))), f;
|
|
2936
|
+
}), Lr = (e) => I.gen(function* () {
|
|
2930
2937
|
let t = e.target.executionId, n = e.target.workflowName;
|
|
2931
2938
|
if (t === void 0 || n === void 0) {
|
|
2932
2939
|
let r = e.store;
|
|
2933
|
-
if (r === void 0) return yield*
|
|
2934
|
-
let i = yield*
|
|
2935
|
-
try: () =>
|
|
2940
|
+
if (r === void 0) return yield* I.die(/* @__PURE__ */ Error("completeSuspendingSignal: provide a store, or target.executionId AND target.workflowName"));
|
|
2941
|
+
let i = yield* I.tryPromise({
|
|
2942
|
+
try: () => Dr(r, e.target),
|
|
2936
2943
|
catch: (e) => e
|
|
2937
2944
|
});
|
|
2938
2945
|
t ??= i.executionId, n ??= i.tag;
|
|
2939
2946
|
}
|
|
2940
2947
|
if (t === void 0 || n === void 0) return { completed: !1 };
|
|
2941
|
-
let r =
|
|
2948
|
+
let r = Nr(n, e.signalName), i = Pr(r, n), a = new Ge.TokenParsed({
|
|
2942
2949
|
workflowName: n,
|
|
2943
2950
|
executionId: t,
|
|
2944
2951
|
deferredName: r
|
|
2945
2952
|
}).asToken;
|
|
2946
|
-
return yield*
|
|
2953
|
+
return yield* Ge.done(i, {
|
|
2947
2954
|
token: a,
|
|
2948
2955
|
exit: Ye.succeed(e.payload)
|
|
2949
2956
|
}), { completed: !0 };
|
|
2950
|
-
}), Z = "_voltro_budget_holds",
|
|
2957
|
+
}), Z = "_voltro_budget_holds", Rr = "budget-hold", zr = (e) => `${Rr}:${e}`, Br = (e) => `${e.executionId}/${e.stepName}/${e.budget}#${e.generation}`, Vr = async (e, t) => (await e.query({
|
|
2951
2958
|
table: Z,
|
|
2952
|
-
predicate:
|
|
2959
|
+
predicate: z(B("executionId", t.executionId), B("stepName", t.stepName), B("budget", t.budget)),
|
|
2953
2960
|
order: []
|
|
2954
|
-
})).length,
|
|
2955
|
-
id:
|
|
2956
|
-
holdKey:
|
|
2957
|
-
budget:
|
|
2958
|
-
tenantId:
|
|
2959
|
-
executionId:
|
|
2960
|
-
workflowName:
|
|
2961
|
-
signalName:
|
|
2962
|
-
stepName:
|
|
2963
|
-
spentMicroUsd:
|
|
2964
|
-
limitMicroUsd:
|
|
2965
|
-
heldAt:
|
|
2966
|
-
releasedAt:
|
|
2967
|
-
outcome:
|
|
2968
|
-
}).index(["budget", "releasedAt"]),
|
|
2961
|
+
})).length, Hr = K(Z, {
|
|
2962
|
+
id: H({ prefix: "bhd" }),
|
|
2963
|
+
holdKey: q().maxLength(191).unique(),
|
|
2964
|
+
budget: q(),
|
|
2965
|
+
tenantId: q().nullable(),
|
|
2966
|
+
executionId: q(),
|
|
2967
|
+
workflowName: q(),
|
|
2968
|
+
signalName: q(),
|
|
2969
|
+
stepName: q(),
|
|
2970
|
+
spentMicroUsd: q().nullable(),
|
|
2971
|
+
limitMicroUsd: q().nullable(),
|
|
2972
|
+
heldAt: J().default("now"),
|
|
2973
|
+
releasedAt: J().nullable(),
|
|
2974
|
+
outcome: q().nullable()
|
|
2975
|
+
}).index(["budget", "releasedAt"]), Ur = () => {
|
|
2969
2976
|
ft({
|
|
2970
2977
|
source: "framework",
|
|
2971
2978
|
table: Z,
|
|
2972
2979
|
timeColumn: "releasedAt",
|
|
2973
2980
|
ttlMs: pt(process.env.VOLTRO_BUDGET_HOLDS_TTL_HOURS, 720)
|
|
2974
2981
|
});
|
|
2975
|
-
},
|
|
2982
|
+
}, Wr = class extends Error {
|
|
2976
2983
|
budget;
|
|
2977
2984
|
holdKey;
|
|
2978
2985
|
constructor(e, t, n) {
|
|
2979
2986
|
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;
|
|
2980
2987
|
}
|
|
2981
|
-
},
|
|
2982
|
-
|
|
2988
|
+
}, Gr = 6048e5, Kr = (e) => I.gen(function* () {
|
|
2989
|
+
Ur();
|
|
2983
2990
|
let t = e.timeoutMs ?? 6048e5, n = e.recheckEveryMs ?? 9e5, r = {
|
|
2984
2991
|
executionId: e.executionId,
|
|
2985
2992
|
stepName: e.stepName,
|
|
2986
2993
|
budget: e.budget
|
|
2987
2994
|
};
|
|
2988
2995
|
for (let i = 0;; i++) {
|
|
2989
|
-
let a = yield*
|
|
2996
|
+
let a = yield* I.promise(() => Jr(e.store, r)), o = a.length === 0 ? Date.now() : qr(a[0]?.heldAt), s = Number.isFinite(t) ? t - (Date.now() - o) : Infinity, c = Br({
|
|
2990
2997
|
...r,
|
|
2991
2998
|
generation: i
|
|
2992
2999
|
});
|
|
2993
|
-
if (s <= 0) return yield*
|
|
2994
|
-
let l =
|
|
2995
|
-
yield*
|
|
3000
|
+
if (s <= 0) return yield* I.promise(() => Yr(e.store, r, "expired")), yield* I.fail(new Wr(e.budget, c, t));
|
|
3001
|
+
let l = zr(c);
|
|
3002
|
+
yield* I.promise(() => e.store.insertIgnore(Z, {
|
|
2996
3003
|
id: rt({
|
|
2997
3004
|
kind: "typeid",
|
|
2998
3005
|
prefix: "bhd"
|
|
@@ -3011,34 +3018,34 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
3011
3018
|
outcome: null
|
|
3012
3019
|
}, { conflictColumns: ["holdKey"] }));
|
|
3013
3020
|
let u = Math.min(n, s);
|
|
3014
|
-
if (yield*
|
|
3021
|
+
if (yield* Ir({ store: e.store }, {
|
|
3015
3022
|
name: l,
|
|
3016
|
-
schema:
|
|
3023
|
+
schema: R.Unknown,
|
|
3017
3024
|
timeoutMs: u
|
|
3018
|
-
}).pipe(
|
|
3025
|
+
}).pipe(I.catchAllCause((e) => F.isInterruptedOnly(e) ? I.failCause(e) : I.void)), yield* I.promise(() => e.store.updateMany(Z, {
|
|
3019
3026
|
releasedAt: /* @__PURE__ */ new Date(),
|
|
3020
3027
|
outcome: "recheck"
|
|
3021
|
-
}, { where:
|
|
3028
|
+
}, { where: z(B("holdKey", c), W("releasedAt")) })), yield* e.hasHeadroom) return;
|
|
3022
3029
|
}
|
|
3023
|
-
}),
|
|
3030
|
+
}), qr = (e) => e instanceof Date ? e.getTime() : typeof e == "string" ? Date.parse(e) : Date.now(), Jr = async (e, t) => [...await e.query({
|
|
3024
3031
|
table: Z,
|
|
3025
|
-
predicate:
|
|
3032
|
+
predicate: z(B("executionId", t.executionId), B("stepName", t.stepName), B("budget", t.budget)),
|
|
3026
3033
|
order: []
|
|
3027
|
-
})].sort((e, t) => String(e.id).localeCompare(String(t.id))),
|
|
3034
|
+
})].sort((e, t) => String(e.id).localeCompare(String(t.id))), Yr = async (e, t, n) => {
|
|
3028
3035
|
await e.updateMany(Z, {
|
|
3029
3036
|
releasedAt: /* @__PURE__ */ new Date(),
|
|
3030
3037
|
outcome: n
|
|
3031
|
-
}, { where:
|
|
3032
|
-
},
|
|
3033
|
-
let t = e.tenantId === void 0 ?
|
|
3038
|
+
}, { where: z(B("executionId", t.executionId), B("stepName", t.stepName), B("budget", t.budget), W("releasedAt")) });
|
|
3039
|
+
}, Xr = (e) => I.gen(function* () {
|
|
3040
|
+
let t = e.tenantId === void 0 ? z(B("budget", e.budget), W("releasedAt")) : z(B("budget", e.budget), B("tenantId", e.tenantId), W("releasedAt")), n = yield* I.promise(() => e.store.query({
|
|
3034
3041
|
table: Z,
|
|
3035
3042
|
predicate: t,
|
|
3036
3043
|
order: []
|
|
3037
3044
|
})), r = 0;
|
|
3038
|
-
for (let t of n) (yield*
|
|
3045
|
+
for (let t of n) (yield* I.promise(() => e.store.updateMany("_voltro_budget_holds", {
|
|
3039
3046
|
releasedAt: /* @__PURE__ */ new Date(),
|
|
3040
3047
|
outcome: e.outcome ?? "released"
|
|
3041
|
-
}, { where:
|
|
3048
|
+
}, { where: z(B("id", String(t.id)), W("releasedAt")) }))) === 1 && (yield* Lr({
|
|
3042
3049
|
target: {
|
|
3043
3050
|
executionId: String(t.executionId),
|
|
3044
3051
|
workflowName: String(t.workflowName)
|
|
@@ -3048,10 +3055,10 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
3048
3055
|
released: !0,
|
|
3049
3056
|
budget: e.budget
|
|
3050
3057
|
}
|
|
3051
|
-
}).pipe(
|
|
3058
|
+
}).pipe(I.catchAll(() => I.succeed({ completed: !1 }))), r += 1);
|
|
3052
3059
|
return { released: r };
|
|
3053
|
-
}),
|
|
3054
|
-
let n = t?.budget === void 0 ?
|
|
3060
|
+
}), Zr = async (e, t) => {
|
|
3061
|
+
let n = t?.budget === void 0 ? W("releasedAt") : z(B("budget", t.budget), W("releasedAt"));
|
|
3055
3062
|
return (await e.query({
|
|
3056
3063
|
table: Z,
|
|
3057
3064
|
predicate: n,
|
|
@@ -3066,8 +3073,8 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
3066
3073
|
stepName: String(e.stepName),
|
|
3067
3074
|
heldAt: e.heldAt instanceof Date ? e.heldAt.toISOString() : String(e.heldAt ?? "")
|
|
3068
3075
|
}));
|
|
3069
|
-
},
|
|
3070
|
-
let t = await
|
|
3076
|
+
}, Qr = async (e) => {
|
|
3077
|
+
let t = await Zr(e), n = /* @__PURE__ */ new Map();
|
|
3071
3078
|
for (let e of t) {
|
|
3072
3079
|
let t = `${e.budget}\u0000${e.tenantId ?? ""}`;
|
|
3073
3080
|
n.has(t) || n.set(t, {
|
|
@@ -3076,41 +3083,41 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
3076
3083
|
});
|
|
3077
3084
|
}
|
|
3078
3085
|
return [...n.values()];
|
|
3079
|
-
},
|
|
3086
|
+
}, $r = async (e, t) => {
|
|
3080
3087
|
if (e) try {
|
|
3081
3088
|
await e.recordEvent(t);
|
|
3082
3089
|
} catch {}
|
|
3083
|
-
},
|
|
3084
|
-
let t =
|
|
3090
|
+
}, ei = (e) => {
|
|
3091
|
+
let t = F.failureOption(e), n = Array.from(F.defects(e)), r = t._tag === "Some" ? t.value : n[0] ?? F.squash(e);
|
|
3085
3092
|
return {
|
|
3086
3093
|
errorTag: r && typeof r == "object" && "_tag" in r ? String(r._tag) : null,
|
|
3087
3094
|
errorMessage: r?.message ?? String(r)
|
|
3088
3095
|
};
|
|
3089
|
-
},
|
|
3090
|
-
let r =
|
|
3091
|
-
let r = n.pollIntervalMs ?? 200, i = n.maxPollIntervalMs ?? 5e3, a = n.timeoutMs ?? 3e4, s = yield* t, c = yield*
|
|
3092
|
-
if (s === void 0) return yield*
|
|
3096
|
+
}, ti = (e, n) => {
|
|
3097
|
+
let r = I.gen(function* () {
|
|
3098
|
+
let r = n.pollIntervalMs ?? 200, i = n.maxPollIntervalMs ?? 5e3, a = n.timeoutMs ?? 3e4, s = yield* t, c = yield* I.serviceOption(o), l = c._tag === "Some" ? c.value : void 0;
|
|
3099
|
+
if (s === void 0) return yield* I.die(/* @__PURE__ */ Error("awaitUpdate: no active workflow run id in scope"));
|
|
3093
3100
|
let u = s, d = Date.now(), f = r;
|
|
3094
3101
|
for (;;) {
|
|
3095
3102
|
let t = Date.now() - d;
|
|
3096
|
-
if (t > a) return yield*
|
|
3103
|
+
if (t > a) return yield* I.die(/* @__PURE__ */ Error(`awaitUpdate('${n.name}') timed out after ${t}ms`));
|
|
3097
3104
|
let r = {
|
|
3098
3105
|
table: "_voltro_workflow_run_events",
|
|
3099
3106
|
order: [{
|
|
3100
3107
|
column: "occurredAt",
|
|
3101
3108
|
direction: "asc"
|
|
3102
3109
|
}],
|
|
3103
|
-
predicate:
|
|
3110
|
+
predicate: B("runId", u),
|
|
3104
3111
|
projection: void 0,
|
|
3105
3112
|
skip: void 0,
|
|
3106
3113
|
take: 1e3
|
|
3107
|
-
}, o = yield*
|
|
3114
|
+
}, o = yield* I.tryPromise({
|
|
3108
3115
|
try: () => e.store.query(r),
|
|
3109
3116
|
catch: (e) => e
|
|
3110
3117
|
}), s = new Set(o.filter((e) => e.eventType === "update-completed" || e.eventType === "update-failed").map((e) => e.payload?.updateId).filter((e) => typeof e == "string" && e.length > 0)), c = o.find((e) => e.eventType === "update-requested" && e.payload?.updateName === n.name && typeof e.payload.updateId == "string" && !s.has(e.payload.updateId));
|
|
3111
3118
|
if (c !== void 0) {
|
|
3112
3119
|
let e = c.payload.updateId;
|
|
3113
|
-
yield*
|
|
3120
|
+
yield* I.promise(() => $r(l, {
|
|
3114
3121
|
runId: u,
|
|
3115
3122
|
eventType: "update-received",
|
|
3116
3123
|
payload: {
|
|
@@ -3118,24 +3125,24 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
3118
3125
|
updateName: n.name
|
|
3119
3126
|
}
|
|
3120
3127
|
}));
|
|
3121
|
-
let t = yield*
|
|
3128
|
+
let t = yield* R.decodeUnknown(n.schema)(h(c.payload)?.value).pipe(I.tapErrorCause((t) => I.promise(() => $r(l, {
|
|
3122
3129
|
runId: u,
|
|
3123
3130
|
eventType: "update-failed",
|
|
3124
3131
|
payload: {
|
|
3125
3132
|
updateId: e,
|
|
3126
3133
|
updateName: n.name,
|
|
3127
|
-
...
|
|
3134
|
+
...ei(t)
|
|
3128
3135
|
}
|
|
3129
|
-
})))), r = yield* (n.handle ? n.handle(t) :
|
|
3136
|
+
})))), r = yield* (n.handle ? n.handle(t) : I.succeed(t)).pipe(I.flatMap((e) => n.success ? R.decodeUnknown(n.success)(e) : I.succeed(e))).pipe(I.tapErrorCause((t) => I.promise(() => $r(l, {
|
|
3130
3137
|
runId: u,
|
|
3131
3138
|
eventType: "update-failed",
|
|
3132
3139
|
payload: {
|
|
3133
3140
|
updateId: e,
|
|
3134
3141
|
updateName: n.name,
|
|
3135
|
-
...
|
|
3142
|
+
...ei(t)
|
|
3136
3143
|
}
|
|
3137
3144
|
}))));
|
|
3138
|
-
return yield*
|
|
3145
|
+
return yield* I.promise(() => $r(l, {
|
|
3139
3146
|
runId: u,
|
|
3140
3147
|
eventType: "update-completed",
|
|
3141
3148
|
payload: {
|
|
@@ -3145,7 +3152,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
3145
3152
|
}
|
|
3146
3153
|
})), r;
|
|
3147
3154
|
}
|
|
3148
|
-
yield*
|
|
3155
|
+
yield* I.sleep(`${f} millis`), f = Math.min(f * 2, i);
|
|
3149
3156
|
}
|
|
3150
3157
|
});
|
|
3151
3158
|
return f({
|
|
@@ -3153,7 +3160,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
3153
3160
|
success: n.success ?? n.schema,
|
|
3154
3161
|
execute: r
|
|
3155
3162
|
});
|
|
3156
|
-
},
|
|
3163
|
+
}, ni = (e) => {
|
|
3157
3164
|
if (e == null) return null;
|
|
3158
3165
|
if (e instanceof Date) return e;
|
|
3159
3166
|
if (typeof e == "string" || typeof e == "number") {
|
|
@@ -3161,7 +3168,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
3161
3168
|
return Number.isNaN(t.getTime()) ? null : t;
|
|
3162
3169
|
}
|
|
3163
3170
|
return null;
|
|
3164
|
-
},
|
|
3171
|
+
}, ri = (e) => typeof e == "number" ? e : e == null ? null : Number(e), Q = (e) => e == null ? null : String(e), ii = (e) => {
|
|
3165
3172
|
let t = /* @__PURE__ */ new Map();
|
|
3166
3173
|
for (let n of e) {
|
|
3167
3174
|
let e = String(n.stepName), r = t.get(e);
|
|
@@ -3169,27 +3176,27 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
3169
3176
|
}
|
|
3170
3177
|
let n = [];
|
|
3171
3178
|
for (let [e, r] of t) {
|
|
3172
|
-
r.sort((e, t) => (
|
|
3179
|
+
r.sort((e, t) => (ri(e.attempt) ?? 0) - (ri(t.attempt) ?? 0));
|
|
3173
3180
|
let t = r[r.length - 1], i = Q(t.errorTag), a = Q(t.errorMessage), o = i !== null || a !== null ? {
|
|
3174
3181
|
tag: i,
|
|
3175
3182
|
message: a ?? ""
|
|
3176
3183
|
} : null;
|
|
3177
3184
|
n.push({
|
|
3178
3185
|
name: e,
|
|
3179
|
-
attempt:
|
|
3186
|
+
attempt: ri(t.attempt) ?? r.length,
|
|
3180
3187
|
attempts: r.length,
|
|
3181
3188
|
status: t.status ?? "running",
|
|
3182
3189
|
input: t.input ?? null,
|
|
3183
3190
|
output: t.output ?? null,
|
|
3184
3191
|
error: o,
|
|
3185
|
-
durationMs:
|
|
3192
|
+
durationMs: ri(t.durationMs)
|
|
3186
3193
|
});
|
|
3187
3194
|
}
|
|
3188
3195
|
return n.sort((t, n) => {
|
|
3189
3196
|
let r = e.find((e) => String(e.stepName) === t.name), i = e.find((e) => String(e.stepName) === n.name);
|
|
3190
|
-
return (
|
|
3197
|
+
return (ni(r?.startedAt)?.getTime() ?? 0) - (ni(i?.startedAt)?.getTime() ?? 0);
|
|
3191
3198
|
}), n;
|
|
3192
|
-
},
|
|
3199
|
+
}, ai = (e) => {
|
|
3193
3200
|
if (e == null) return null;
|
|
3194
3201
|
if (typeof e == "string") try {
|
|
3195
3202
|
return JSON.parse(e);
|
|
@@ -3197,10 +3204,10 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
3197
3204
|
return null;
|
|
3198
3205
|
}
|
|
3199
3206
|
return typeof e == "object" ? e : null;
|
|
3200
|
-
},
|
|
3201
|
-
let n = lt(_t), r = (await t.query(n.where(ct(
|
|
3207
|
+
}, oi = async (e, t) => {
|
|
3208
|
+
let n = lt(_t), r = (await t.query(n.where(ct(B("id", e), B("executionId", e))).limit(1).descriptor))[0];
|
|
3202
3209
|
if (r === void 0) return null;
|
|
3203
|
-
let i = String(r.id), a = lt(vt), o = await t.query(a.where(
|
|
3210
|
+
let i = String(r.id), a = lt(vt), o = await t.query(a.where(B("runId", i)).descriptor);
|
|
3204
3211
|
return {
|
|
3205
3212
|
id: i,
|
|
3206
3213
|
executionId: Q(r.executionId) ?? "",
|
|
@@ -3208,16 +3215,16 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
3208
3215
|
status: r.status ?? "running",
|
|
3209
3216
|
input: d(r.payload ?? null, "workflow run payload"),
|
|
3210
3217
|
output: m(r.output ?? null, "workflow run result"),
|
|
3211
|
-
subject:
|
|
3218
|
+
subject: ai(r.subject),
|
|
3212
3219
|
source: Q(r.source),
|
|
3213
|
-
steps:
|
|
3214
|
-
startedAt:
|
|
3215
|
-
finishedAt:
|
|
3220
|
+
steps: ii(o),
|
|
3221
|
+
startedAt: ni(r.startedAt) ?? /* @__PURE__ */ new Date(0),
|
|
3222
|
+
finishedAt: ni(r.completedAt),
|
|
3216
3223
|
traceId: Q(r.traceId),
|
|
3217
3224
|
parentExecutionId: Q(r.parentExecutionId),
|
|
3218
3225
|
parentClosePolicy: Q(r.parentClosePolicy)
|
|
3219
3226
|
};
|
|
3220
|
-
},
|
|
3227
|
+
}, si = () => {
|
|
3221
3228
|
let e = [], t = [], n = 0, r = 0;
|
|
3222
3229
|
return {
|
|
3223
3230
|
layer: Qe.succeed(o, {
|
|
@@ -3267,13 +3274,13 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
3267
3274
|
readSteps: () => e,
|
|
3268
3275
|
readEvents: () => t
|
|
3269
3276
|
};
|
|
3270
|
-
},
|
|
3271
|
-
let r = yield*
|
|
3277
|
+
}, ci = (e, t, n) => I.gen(function* () {
|
|
3278
|
+
let r = yield* Y;
|
|
3272
3279
|
for (;;) {
|
|
3273
|
-
if (yield*
|
|
3274
|
-
yield*
|
|
3280
|
+
if (yield* I.tryPromise(() => ge(t, e)).pipe(I.catchAll(() => I.sync(() => (n(), !1))))) return r.interrupted = !0, yield* I.interrupt;
|
|
3281
|
+
yield* I.sleep(1e3);
|
|
3275
3282
|
}
|
|
3276
|
-
}),
|
|
3283
|
+
}), li = 8192, ui = 3, di = 2e3, fi = () => {
|
|
3277
3284
|
let e = (e) => {
|
|
3278
3285
|
if (e === void 0) return;
|
|
3279
3286
|
let t = Number(e);
|
|
@@ -3283,7 +3290,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
3283
3290
|
...t === void 0 ? {} : { maxRunReclaims: t },
|
|
3284
3291
|
...n === void 0 ? {} : { replayShapeLimit: n }
|
|
3285
3292
|
};
|
|
3286
|
-
},
|
|
3293
|
+
}, pi = (e) => {
|
|
3287
3294
|
let t = typeof e == "string" ? (() => {
|
|
3288
3295
|
try {
|
|
3289
3296
|
return JSON.parse(e);
|
|
@@ -3292,10 +3299,10 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
3292
3299
|
}
|
|
3293
3300
|
})() : e;
|
|
3294
3301
|
if (Array.isArray(t)) return t.filter((e) => typeof e == "string");
|
|
3295
|
-
},
|
|
3302
|
+
}, mi = () => {
|
|
3296
3303
|
let e = globalThis.crypto;
|
|
3297
3304
|
return typeof e?.randomUUID == "function" ? e.randomUUID() : `${Date.now().toString(36)}${Math.random().toString(36).slice(2)}`;
|
|
3298
|
-
},
|
|
3305
|
+
}, hi = (e) => `${e}_${mi()}`, gi = (e, t = li) => {
|
|
3299
3306
|
if (e == null) return e;
|
|
3300
3307
|
try {
|
|
3301
3308
|
let n = JSON.stringify(e);
|
|
@@ -3307,11 +3314,11 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
3307
3314
|
} catch {
|
|
3308
3315
|
return { __unserialisable: String(e) };
|
|
3309
3316
|
}
|
|
3310
|
-
},
|
|
3317
|
+
}, _i = async (e, t, n) => {
|
|
3311
3318
|
if (n === null || !g() || !("value" in n || "result" in n || "errorMessage" in n) || e.query === void 0) return n;
|
|
3312
3319
|
let [r] = await e.query({
|
|
3313
3320
|
table: "_voltro_workflow_runs",
|
|
3314
|
-
predicate:
|
|
3321
|
+
predicate: B("id", t),
|
|
3315
3322
|
order: [],
|
|
3316
3323
|
take: 1,
|
|
3317
3324
|
skip: void 0,
|
|
@@ -3322,8 +3329,8 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
3322
3329
|
let t = {};
|
|
3323
3330
|
for (let [n, r] of Object.entries(e)) t[n] = r instanceof Date ? r.toISOString() : r;
|
|
3324
3331
|
return ee(t);
|
|
3325
|
-
},
|
|
3326
|
-
let t = e.truncateBytes ??
|
|
3332
|
+
}, vi = (e) => {
|
|
3333
|
+
let t = e.truncateBytes ?? li, n = e.makeId ?? hi, r = (t, n) => e.log?.warn(t, n), i = (e, t) => t === !0 ? l(e, "workflow step value", v) : e, a = e.emit, o = e.recording === "coarse";
|
|
3327
3334
|
return {
|
|
3328
3335
|
startStep: async ({ runId: s, stepName: c, attempt: l, stepInput: u, retryPolicy: d, sealed: f }) => {
|
|
3329
3336
|
if (!o) try {
|
|
@@ -3333,7 +3340,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
3333
3340
|
stepName: c,
|
|
3334
3341
|
attempt: l,
|
|
3335
3342
|
status: "running",
|
|
3336
|
-
input: u === void 0 ? null : i(
|
|
3343
|
+
input: u === void 0 ? null : i(gi(u, t), f),
|
|
3337
3344
|
retryPolicy: d ?? null,
|
|
3338
3345
|
output: null,
|
|
3339
3346
|
errorTag: null,
|
|
@@ -3360,7 +3367,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
3360
3367
|
if (!o) try {
|
|
3361
3368
|
let r = await e.store.update("_voltro_workflow_run_steps", n, {
|
|
3362
3369
|
status: "succeeded",
|
|
3363
|
-
output: i(
|
|
3370
|
+
output: i(gi(s, t), l),
|
|
3364
3371
|
completedAt: /* @__PURE__ */ new Date(),
|
|
3365
3372
|
durationMs: c
|
|
3366
3373
|
});
|
|
@@ -3381,7 +3388,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
3381
3388
|
status: "failed",
|
|
3382
3389
|
errorTag: s,
|
|
3383
3390
|
errorMessage: c == null ? c : i(c, d),
|
|
3384
|
-
errorCause: l === void 0 ? null : i(
|
|
3391
|
+
errorCause: l === void 0 ? null : i(gi(l, t), d),
|
|
3385
3392
|
completedAt: /* @__PURE__ */ new Date(),
|
|
3386
3393
|
durationMs: u
|
|
3387
3394
|
});
|
|
@@ -3403,7 +3410,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
3403
3410
|
id: l,
|
|
3404
3411
|
runId: t,
|
|
3405
3412
|
eventType: i,
|
|
3406
|
-
payload: await
|
|
3413
|
+
payload: await _i(e.store, t, o ?? null),
|
|
3407
3414
|
occurredAt: /* @__PURE__ */ new Date(),
|
|
3408
3415
|
stepName: s ?? null,
|
|
3409
3416
|
attempt: c ?? null
|
|
@@ -3429,16 +3436,16 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
3429
3436
|
};
|
|
3430
3437
|
}
|
|
3431
3438
|
};
|
|
3432
|
-
},
|
|
3439
|
+
}, yi = (e, t, n) => I.gen(function* () {
|
|
3433
3440
|
let r = e.store.query;
|
|
3434
3441
|
if (r === void 0) return;
|
|
3435
|
-
let i = e.replayShapeLimit ?? 2e3, a = yield*
|
|
3442
|
+
let i = e.replayShapeLimit ?? 2e3, a = yield* I.promise(() => r.call(e.store, {
|
|
3436
3443
|
table: "_voltro_workflow_run_steps",
|
|
3437
3444
|
order: [{
|
|
3438
3445
|
column: "startedAt",
|
|
3439
3446
|
direction: "asc"
|
|
3440
3447
|
}],
|
|
3441
|
-
predicate:
|
|
3448
|
+
predicate: B("runId", t),
|
|
3442
3449
|
projection: ["stepName"],
|
|
3443
3450
|
skip: void 0,
|
|
3444
3451
|
take: i + 1
|
|
@@ -3459,20 +3466,20 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
3459
3466
|
return typeof t == "string" ? [{ stepName: t }] : [];
|
|
3460
3467
|
});
|
|
3461
3468
|
return o.length === 0 ? void 0 : s(o);
|
|
3462
|
-
}),
|
|
3463
|
-
let u = s.truncateBytes ??
|
|
3464
|
-
yield*
|
|
3469
|
+
}), bi = (s, l) => {
|
|
3470
|
+
let u = s.truncateBytes ?? li, d = s.makeId ?? hi, f = s.recorder ?? vi(s), p = (e, t) => s.log?.warn(e, t), m = s.emit, h = (e) => I.gen(function* () {
|
|
3471
|
+
yield* I.sync(() => m?.("workflowEvents", {
|
|
3465
3472
|
op: "insert",
|
|
3466
3473
|
row: $(e)
|
|
3467
3474
|
}));
|
|
3468
3475
|
let t = s.wakeups, n = e.runId;
|
|
3469
3476
|
if (t !== void 0 && typeof n == "string") {
|
|
3470
3477
|
let e = s.subject?.tenantId;
|
|
3471
|
-
yield*
|
|
3478
|
+
yield* I.promise(() => t.cancel(n, typeof e == "string" ? e : void 0).catch(() => {
|
|
3472
3479
|
p("failed to clear terminal workflow wakeup", { runId: n });
|
|
3473
3480
|
}));
|
|
3474
3481
|
}
|
|
3475
|
-
}), g = (e, t, n) =>
|
|
3482
|
+
}), g = (e, t, n) => I.promise(async () => {
|
|
3476
3483
|
if (s.onParentClose) try {
|
|
3477
3484
|
await s.onParentClose({
|
|
3478
3485
|
workflowName: s.name,
|
|
@@ -3488,7 +3495,7 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
3488
3495
|
reason: n?.message ?? String(n)
|
|
3489
3496
|
});
|
|
3490
3497
|
}
|
|
3491
|
-
}), v = (e, t, n, r) =>
|
|
3498
|
+
}), v = (e, t, n, r) => I.promise(async () => {
|
|
3492
3499
|
if (s.onTerminal) try {
|
|
3493
3500
|
await s.onTerminal({
|
|
3494
3501
|
workflowName: s.name,
|
|
@@ -3506,23 +3513,23 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
3506
3513
|
});
|
|
3507
3514
|
}
|
|
3508
3515
|
});
|
|
3509
|
-
return (ee, b) =>
|
|
3510
|
-
let x = Date.now(), te = yield* Ze.get(r), ne = yield* Ze.get(i), re = s.parentExecutionId ?? te ?? null, ie = s.parentGeneration ?? (s.parentExecutionId == null ? ne : void 0) ?? null,
|
|
3511
|
-
let n =
|
|
3516
|
+
return (ee, b) => I.gen(function* () {
|
|
3517
|
+
let x = Date.now(), te = yield* Ze.get(r), ne = yield* Ze.get(i), re = s.parentExecutionId ?? te ?? null, ie = s.parentGeneration ?? (s.parentExecutionId == null ? ne : void 0) ?? null, ae = s.parentClosePolicy ?? null, S, C = (e, t) => t.pipe(I.catchAllCause((t) => F.isInterrupted(t) ? I.failCause(t) : I.sync(() => {
|
|
3518
|
+
let n = F.squash(t);
|
|
3512
3519
|
p(e, {
|
|
3513
3520
|
tag: s.name,
|
|
3514
3521
|
executionId: b,
|
|
3515
3522
|
reason: n?.message ?? String(n)
|
|
3516
3523
|
});
|
|
3517
|
-
}))),
|
|
3524
|
+
}))), w = `wfrg_${mi()}`, oe = yield* I.serviceOption(Te), se = d("wr"), ce = yield* I.sync(() => s.encodePayload === void 0 ? ee : s.encodePayload(ee)), T = yield* I.promise(() => s.transaction((e) => Bt(e, {
|
|
3518
3525
|
workflowName: s.name,
|
|
3519
3526
|
executionId: b,
|
|
3520
|
-
generation:
|
|
3527
|
+
generation: w,
|
|
3521
3528
|
now: x,
|
|
3522
|
-
delivery:
|
|
3529
|
+
delivery: oe._tag === "Some" ? oe.value : null,
|
|
3523
3530
|
initialRow: {
|
|
3524
|
-
id:
|
|
3525
|
-
payload:
|
|
3531
|
+
id: se,
|
|
3532
|
+
payload: ce,
|
|
3526
3533
|
workflowVersion: s.workflowVersion ?? null,
|
|
3527
3534
|
workflowPatches: s.workflowPatches ?? null,
|
|
3528
3535
|
output: null,
|
|
@@ -3537,45 +3544,45 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
3537
3544
|
traceId: s.traceId ?? null,
|
|
3538
3545
|
parentExecutionId: re,
|
|
3539
3546
|
parentGeneration: ie,
|
|
3540
|
-
parentClosePolicy:
|
|
3547
|
+
parentClosePolicy: ae
|
|
3541
3548
|
}
|
|
3542
3549
|
})));
|
|
3543
|
-
if (typeof
|
|
3544
|
-
if (
|
|
3545
|
-
let e =
|
|
3546
|
-
yield*
|
|
3550
|
+
if (typeof T.row.id != "string") return yield* I.die(/* @__PURE__ */ Error("Recorded workflow entry has no run identity"));
|
|
3551
|
+
if (S = T.row.id, T.restartEvent !== void 0) {
|
|
3552
|
+
let e = T.restartEvent;
|
|
3553
|
+
yield* C("failed to observe recorded workflow restart", I.sync(() => {
|
|
3547
3554
|
m?.("workflowEvents", {
|
|
3548
3555
|
op: "insert",
|
|
3549
3556
|
row: $(e)
|
|
3550
3557
|
});
|
|
3551
3558
|
}));
|
|
3552
3559
|
}
|
|
3553
|
-
if (
|
|
3554
|
-
let e = yield*
|
|
3555
|
-
return e.interrupted = !0,
|
|
3560
|
+
if (T.kind === "cancelled" || T.kind === "already-cancelled") {
|
|
3561
|
+
let e = yield* Y;
|
|
3562
|
+
return e.interrupted = !0, T.kind === "cancelled" && (yield* C("failed to observe suspended workflow cancellation", I.gen(function* () {
|
|
3556
3563
|
if (m?.("workflowRuns", {
|
|
3557
3564
|
op: "update",
|
|
3558
|
-
row: $(
|
|
3559
|
-
}),
|
|
3560
|
-
yield* h(
|
|
3561
|
-
})), yield* v(b, "cancelled",
|
|
3565
|
+
row: $(T.row)
|
|
3566
|
+
}), T.terminalEvent === void 0) return yield* I.die(/* @__PURE__ */ Error("Cancelled entry has no terminal event"));
|
|
3567
|
+
yield* h(T.terminalEvent), yield* g(b, "cancelled", S);
|
|
3568
|
+
})), yield* v(b, "cancelled", S), yield* I.sync(() => s.recordRun?.({
|
|
3562
3569
|
name: s.name,
|
|
3563
3570
|
status: "cancelled",
|
|
3564
3571
|
durationMs: 0
|
|
3565
|
-
}))), yield*
|
|
3572
|
+
}))), yield* I.interrupt;
|
|
3566
3573
|
}
|
|
3567
|
-
let
|
|
3568
|
-
if (
|
|
3569
|
-
let e = `Workflow '${s.name}' run '${b}' was started on version ${
|
|
3574
|
+
let E = T.previous, le = E?.workflowVersion ?? null;
|
|
3575
|
+
if (E?.id !== void 0 && le !== null && s.workflowCompatibleVersions !== void 0 && s.workflowCompatibleVersions !== null && !s.workflowCompatibleVersions.includes(le)) {
|
|
3576
|
+
let e = `Workflow '${s.name}' run '${b}' was started on version ${le}, but current code is compatible with ${s.workflowCompatibleVersions.join(", ")}`, t = s.failureContext ?? {
|
|
3570
3577
|
handler: null,
|
|
3571
3578
|
callerContext: null,
|
|
3572
3579
|
tenantId: null
|
|
3573
|
-
}, n = yield*
|
|
3580
|
+
}, n = yield* I.promise(() => s.transaction((n) => Gt(n, {
|
|
3574
3581
|
owner: {
|
|
3575
|
-
runId:
|
|
3582
|
+
runId: S,
|
|
3576
3583
|
workflowName: s.name,
|
|
3577
3584
|
executionId: b,
|
|
3578
|
-
generation:
|
|
3585
|
+
generation: w
|
|
3579
3586
|
},
|
|
3580
3587
|
now: Date.now(),
|
|
3581
3588
|
durationMs: 0,
|
|
@@ -3586,49 +3593,49 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
3586
3593
|
...t
|
|
3587
3594
|
}
|
|
3588
3595
|
})));
|
|
3589
|
-
return n.kind === "committed" && (yield*
|
|
3596
|
+
return n.kind === "committed" && (yield* C("failed to observe workflow version rejection", I.gen(function* () {
|
|
3590
3597
|
m?.("workflowRuns", {
|
|
3591
3598
|
op: "update",
|
|
3592
3599
|
row: $(n.row)
|
|
3593
|
-
}), yield* h(n.terminalEvent), yield* g(b, "failed",
|
|
3594
|
-
})), yield* v(b, "failed",
|
|
3595
|
-
payload:
|
|
3600
|
+
}), yield* h(n.terminalEvent), yield* g(b, "failed", S);
|
|
3601
|
+
})), yield* v(b, "failed", S, {
|
|
3602
|
+
payload: T.row.payload,
|
|
3596
3603
|
errorTag: "WorkflowVersionIncompatible",
|
|
3597
3604
|
errorMessage: e
|
|
3598
|
-
}), yield*
|
|
3605
|
+
}), yield* I.sync(() => s.recordRun?.({
|
|
3599
3606
|
name: s.name,
|
|
3600
3607
|
status: "failed",
|
|
3601
3608
|
durationMs: 0
|
|
3602
3609
|
})), p("workflow run failed", {
|
|
3603
3610
|
workflow: s.name,
|
|
3604
3611
|
executionId: b,
|
|
3605
|
-
runId:
|
|
3612
|
+
runId: S,
|
|
3606
3613
|
errorTag: "WorkflowVersionIncompatible",
|
|
3607
3614
|
cause: e
|
|
3608
|
-
})), yield*
|
|
3615
|
+
})), yield* I.fail(Error(e));
|
|
3609
3616
|
}
|
|
3610
|
-
let
|
|
3611
|
-
if (
|
|
3612
|
-
|
|
3613
|
-
let e =
|
|
3614
|
-
if (typeof e != "number" || !Number.isSafeInteger(e) || e < 0) return yield*
|
|
3617
|
+
let ue = s.workflowPatches ?? [], D;
|
|
3618
|
+
if (E?.id !== void 0) {
|
|
3619
|
+
S = E.id, ue = pi(E.workflowPatches) ?? ue;
|
|
3620
|
+
let e = T.row.reclaimCount;
|
|
3621
|
+
if (typeof e != "number" || !Number.isSafeInteger(e) || e < 0) return yield* I.die(/* @__PURE__ */ Error("Recorded workflow entry has an invalid reclaim counter"));
|
|
3615
3622
|
let t = e > 0, n = s.maxRunReclaims ?? 3;
|
|
3616
3623
|
if (t && e >= n) {
|
|
3617
|
-
let t = `Workflow '${s.name}' run '${b}' killed its runner ${e} times in a row; parked instead of reclaimed again (maxRunReclaims=${n}).`, r = yield*
|
|
3618
|
-
runId:
|
|
3624
|
+
let t = `Workflow '${s.name}' run '${b}' killed its runner ${e} times in a row; parked instead of reclaimed again (maxRunReclaims=${n}).`, r = yield* I.promise(() => s.transaction((e) => Ut(e, {
|
|
3625
|
+
runId: S,
|
|
3619
3626
|
workflowName: s.name,
|
|
3620
3627
|
executionId: b,
|
|
3621
|
-
generation:
|
|
3628
|
+
generation: w
|
|
3622
3629
|
}, {
|
|
3623
3630
|
errorTag: "WorkflowCrashLooped",
|
|
3624
3631
|
errorMessage: t
|
|
3625
3632
|
})));
|
|
3626
|
-
r.kind === "committed" && (yield*
|
|
3633
|
+
r.kind === "committed" && (yield* C("failed to observe workflow crash-loop park", I.gen(function* () {
|
|
3627
3634
|
m?.("workflowRuns", {
|
|
3628
3635
|
op: "update",
|
|
3629
3636
|
row: $(r.row)
|
|
3630
|
-
}), yield*
|
|
3631
|
-
runId:
|
|
3637
|
+
}), yield* I.promise(() => f.recordEvent({
|
|
3638
|
+
runId: S,
|
|
3632
3639
|
eventType: "run-crashlooped",
|
|
3633
3640
|
payload: {
|
|
3634
3641
|
reclaimCount: e,
|
|
@@ -3640,19 +3647,19 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
3640
3647
|
})), p("workflow run parked after repeated runner deaths", {
|
|
3641
3648
|
tag: s.name,
|
|
3642
3649
|
executionId: b,
|
|
3643
|
-
runId:
|
|
3650
|
+
runId: S,
|
|
3644
3651
|
reclaimCount: e,
|
|
3645
3652
|
maxRunReclaims: n
|
|
3646
3653
|
}));
|
|
3647
|
-
let i = yield*
|
|
3648
|
-
return yield*
|
|
3654
|
+
let i = yield* Y;
|
|
3655
|
+
return yield* Ke.suspend(i);
|
|
3649
3656
|
}
|
|
3650
|
-
|
|
3657
|
+
D = yield* yi(s, S, p), yield* C("failed to record workflow re-entry", I.gen(function* () {
|
|
3651
3658
|
m?.("workflowRuns", {
|
|
3652
3659
|
op: "update",
|
|
3653
|
-
row: $(
|
|
3654
|
-
}), t && (yield*
|
|
3655
|
-
runId:
|
|
3660
|
+
row: $(T.row)
|
|
3661
|
+
}), t && (yield* I.promise(() => f.recordEvent({
|
|
3662
|
+
runId: S,
|
|
3656
3663
|
eventType: "run-resumed",
|
|
3657
3664
|
payload: {
|
|
3658
3665
|
reason: "runner-reclaim",
|
|
@@ -3661,13 +3668,13 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
3661
3668
|
}
|
|
3662
3669
|
})));
|
|
3663
3670
|
}));
|
|
3664
|
-
} else yield*
|
|
3671
|
+
} else yield* C("failed to emit recorded workflow start", I.gen(function* () {
|
|
3665
3672
|
if (m?.("workflowRuns", {
|
|
3666
3673
|
op: "insert",
|
|
3667
|
-
row: $(
|
|
3668
|
-
}),
|
|
3669
|
-
let e =
|
|
3670
|
-
yield*
|
|
3674
|
+
row: $(T.row)
|
|
3675
|
+
}), S) {
|
|
3676
|
+
let e = S;
|
|
3677
|
+
yield* I.promise(() => f.recordEvent({
|
|
3671
3678
|
runId: e,
|
|
3672
3679
|
eventType: "run-started",
|
|
3673
3680
|
payload: {
|
|
@@ -3677,34 +3684,34 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
3677
3684
|
workflowVersion: s.workflowVersion ?? null,
|
|
3678
3685
|
workflowPatches: s.workflowPatches ?? null,
|
|
3679
3686
|
parentExecutionId: re,
|
|
3680
|
-
parentClosePolicy:
|
|
3687
|
+
parentClosePolicy: ae
|
|
3681
3688
|
}
|
|
3682
3689
|
}));
|
|
3683
3690
|
}
|
|
3684
3691
|
}));
|
|
3685
|
-
let
|
|
3686
|
-
runId:
|
|
3692
|
+
let de = s.subject?.tenantId, fe = I.suspend(() => l(ee, b, w)).pipe(I.locally(t, S), I.locally(r, b), I.locally(i, w), I.locally(n, typeof de == "string" ? de : void 0), I.locally(a, ue), I.locally(c, D), I.provideService(o, f)), O = s.pluginWorkflowStepLayer ? fe.pipe(I.provide(s.pluginWorkflowStepLayer)) : fe, k = yield* Ke.intoResult(I.raceWith(O, ci({
|
|
3693
|
+
runId: S,
|
|
3687
3694
|
workflowName: s.name,
|
|
3688
3695
|
executionId: b,
|
|
3689
|
-
generation:
|
|
3696
|
+
generation: w
|
|
3690
3697
|
}, async (e) => s.store.query(e), () => p("workflow control read failed; retrying without claiming cancellation", {
|
|
3691
3698
|
executionId: b,
|
|
3692
|
-
runId:
|
|
3693
|
-
})).pipe(
|
|
3694
|
-
onSelfDone: (e, t) => Xe.interrupt(t).pipe(
|
|
3695
|
-
onOtherDone: (e, t) => Xe.interrupt(t).pipe(
|
|
3699
|
+
runId: S
|
|
3700
|
+
})).pipe(I.interruptible), {
|
|
3701
|
+
onSelfDone: (e, t) => Xe.interrupt(t).pipe(I.zipRight(e)),
|
|
3702
|
+
onOtherDone: (e, t) => Xe.interrupt(t).pipe(I.zipRight(e))
|
|
3696
3703
|
}));
|
|
3697
|
-
if (
|
|
3698
|
-
let e =
|
|
3699
|
-
runId:
|
|
3704
|
+
if (Ke.isResult(k) && k._tag === "Suspended") {
|
|
3705
|
+
let e = k.cause, t = e !== void 0 && !F.isEmpty(e), n = t ? F.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* I.promise(() => s.transaction((e) => Ut(e, {
|
|
3706
|
+
runId: S,
|
|
3700
3707
|
workflowName: s.name,
|
|
3701
3708
|
executionId: b,
|
|
3702
|
-
generation:
|
|
3709
|
+
generation: w
|
|
3703
3710
|
}, {
|
|
3704
3711
|
errorTag: r,
|
|
3705
3712
|
errorMessage: i
|
|
3706
3713
|
})));
|
|
3707
|
-
a.kind === "committed" && t && (yield*
|
|
3714
|
+
a.kind === "committed" && t && (yield* I.sync(() => et({
|
|
3708
3715
|
error: n,
|
|
3709
3716
|
source: "workflow",
|
|
3710
3717
|
name: s.name,
|
|
@@ -3714,14 +3721,14 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
3714
3721
|
executionId: b,
|
|
3715
3722
|
suspendedOnFailure: !0,
|
|
3716
3723
|
...r ? { errorTag: r } : {},
|
|
3717
|
-
...
|
|
3724
|
+
...S ? { runId: S } : {}
|
|
3718
3725
|
}
|
|
3719
|
-
}))), a.kind === "committed" && (yield*
|
|
3726
|
+
}))), a.kind === "committed" && (yield* C("failed to observe workflow suspend", I.gen(function* () {
|
|
3720
3727
|
m?.("workflowRuns", {
|
|
3721
3728
|
op: "update",
|
|
3722
3729
|
row: $(a.row)
|
|
3723
|
-
}), yield*
|
|
3724
|
-
runId:
|
|
3730
|
+
}), yield* I.promise(() => f.recordEvent({
|
|
3731
|
+
runId: S,
|
|
3725
3732
|
eventType: "run-suspended",
|
|
3726
3733
|
payload: t ? {
|
|
3727
3734
|
reason: "suspend-on-failure",
|
|
@@ -3730,20 +3737,20 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
3730
3737
|
} : { reason: "workflow-suspend" }
|
|
3731
3738
|
}));
|
|
3732
3739
|
})));
|
|
3733
|
-
let o = yield*
|
|
3734
|
-
return yield*
|
|
3740
|
+
let o = yield* Y;
|
|
3741
|
+
return yield* Ke.suspend(o);
|
|
3735
3742
|
}
|
|
3736
|
-
let
|
|
3737
|
-
if (
|
|
3738
|
-
let t =
|
|
3743
|
+
let pe = k;
|
|
3744
|
+
if (D !== void 0 && S !== void 0) {
|
|
3745
|
+
let t = D.settle();
|
|
3739
3746
|
if (t.length > 0) {
|
|
3740
|
-
let n =
|
|
3747
|
+
let n = S;
|
|
3741
3748
|
p("workflow replay reached a different step shape than this run recorded", {
|
|
3742
3749
|
tag: s.name,
|
|
3743
3750
|
executionId: b,
|
|
3744
3751
|
runId: n,
|
|
3745
3752
|
findings: t.map((e) => `${e.kind}:${e.stepName}`)
|
|
3746
|
-
}), yield*
|
|
3753
|
+
}), yield* C("failed to record nondeterminism findings", I.promise(async () => {
|
|
3747
3754
|
for (let r of t) await f.recordEvent({
|
|
3748
3755
|
runId: n,
|
|
3749
3756
|
eventType: "nondeterminism-suspected",
|
|
@@ -3752,41 +3759,41 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
3752
3759
|
}));
|
|
3753
3760
|
}
|
|
3754
3761
|
}
|
|
3755
|
-
if (Ye.isFailure(
|
|
3756
|
-
let e =
|
|
3757
|
-
if ((yield*
|
|
3758
|
-
let t = Date.now(), n = yield*
|
|
3762
|
+
if (Ye.isFailure(pe.exit)) {
|
|
3763
|
+
let e = pe.exit.cause;
|
|
3764
|
+
if ((yield* Y).interrupted && F.isInterruptedOnly(e)) {
|
|
3765
|
+
let t = Date.now(), n = yield* I.promise(() => s.transaction((e) => Gt(e, {
|
|
3759
3766
|
owner: {
|
|
3760
|
-
runId:
|
|
3767
|
+
runId: S,
|
|
3761
3768
|
workflowName: s.name,
|
|
3762
3769
|
executionId: b,
|
|
3763
|
-
generation:
|
|
3770
|
+
generation: w
|
|
3764
3771
|
},
|
|
3765
3772
|
now: t,
|
|
3766
3773
|
durationMs: t - x,
|
|
3767
3774
|
outcome: { status: "cancelled" }
|
|
3768
3775
|
})));
|
|
3769
|
-
return n.kind === "committed" && (yield*
|
|
3776
|
+
return n.kind === "committed" && (yield* C("failed to observe workflow cancellation", I.gen(function* () {
|
|
3770
3777
|
m?.("workflowRuns", {
|
|
3771
3778
|
op: "update",
|
|
3772
3779
|
row: $(n.row)
|
|
3773
|
-
}), yield* h(n.terminalEvent), yield* g(b, "cancelled",
|
|
3774
|
-
})), yield* v(b, "cancelled",
|
|
3780
|
+
}), yield* h(n.terminalEvent), yield* g(b, "cancelled", S);
|
|
3781
|
+
})), yield* v(b, "cancelled", S), yield* I.sync(() => s.recordRun?.({
|
|
3775
3782
|
name: s.name,
|
|
3776
3783
|
status: "cancelled",
|
|
3777
3784
|
durationMs: t - x
|
|
3778
|
-
}))), yield*
|
|
3785
|
+
}))), yield* I.failCause(e);
|
|
3779
3786
|
}
|
|
3780
|
-
let t =
|
|
3787
|
+
let t = F.failureOption(e), n = t._tag === "Some" ? t.value : F.squash(e), r = n && typeof n == "object" && "_tag" in n ? String(n._tag) : null, i = n?.message ?? String(n), a = Date.now(), o = s.failureContext ?? {
|
|
3781
3788
|
handler: null,
|
|
3782
3789
|
callerContext: null,
|
|
3783
3790
|
tenantId: null
|
|
3784
|
-
}, c = yield*
|
|
3791
|
+
}, c = yield* I.promise(() => s.transaction((e) => Gt(e, {
|
|
3785
3792
|
owner: {
|
|
3786
|
-
runId:
|
|
3793
|
+
runId: S,
|
|
3787
3794
|
workflowName: s.name,
|
|
3788
3795
|
executionId: b,
|
|
3789
|
-
generation:
|
|
3796
|
+
generation: w
|
|
3790
3797
|
},
|
|
3791
3798
|
now: a,
|
|
3792
3799
|
durationMs: a - x,
|
|
@@ -3800,10 +3807,10 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
3800
3807
|
return c.kind === "committed" ? (p("workflow run failed", {
|
|
3801
3808
|
workflow: s.name,
|
|
3802
3809
|
executionId: b,
|
|
3803
|
-
runId:
|
|
3810
|
+
runId: S,
|
|
3804
3811
|
...r ? { errorTag: r } : {},
|
|
3805
3812
|
cause: y(s.name, n)
|
|
3806
|
-
}), yield*
|
|
3813
|
+
}), yield* I.sync(() => et({
|
|
3807
3814
|
error: n,
|
|
3808
3815
|
source: "workflow",
|
|
3809
3816
|
name: s.name,
|
|
@@ -3812,49 +3819,49 @@ var gt = Je.layerMemory, _t = G("_voltro_workflow_runs", {
|
|
|
3812
3819
|
fields: {
|
|
3813
3820
|
executionId: b,
|
|
3814
3821
|
...r ? { errorTag: r } : {},
|
|
3815
|
-
...
|
|
3822
|
+
...S ? { runId: S } : {}
|
|
3816
3823
|
}
|
|
3817
|
-
})),
|
|
3824
|
+
})), S && (yield* C("failed to record workflow failure", I.gen(function* () {
|
|
3818
3825
|
m?.("workflowRuns", {
|
|
3819
3826
|
op: "update",
|
|
3820
3827
|
row: $(c.row)
|
|
3821
|
-
}), yield* h(c.terminalEvent), yield* g(b, "failed",
|
|
3822
|
-
}))), yield* v(b, "failed",
|
|
3828
|
+
}), yield* h(c.terminalEvent), yield* g(b, "failed", S);
|
|
3829
|
+
}))), yield* v(b, "failed", S, {
|
|
3823
3830
|
payload: ee,
|
|
3824
3831
|
errorTag: r,
|
|
3825
3832
|
errorMessage: i
|
|
3826
|
-
}), yield*
|
|
3833
|
+
}), yield* I.sync(() => s.recordRun?.({
|
|
3827
3834
|
name: s.name,
|
|
3828
3835
|
status: "failed",
|
|
3829
3836
|
durationMs: Date.now() - x
|
|
3830
|
-
})), yield*
|
|
3837
|
+
})), yield* I.failCause(e)) : yield* I.failCause(e);
|
|
3831
3838
|
}
|
|
3832
|
-
let
|
|
3839
|
+
let me = pe.exit.value, A = Date.now(), j = yield* I.promise(() => s.transaction((e) => Gt(e, {
|
|
3833
3840
|
owner: {
|
|
3834
|
-
runId:
|
|
3841
|
+
runId: S,
|
|
3835
3842
|
workflowName: s.name,
|
|
3836
3843
|
executionId: b,
|
|
3837
|
-
generation:
|
|
3844
|
+
generation: w
|
|
3838
3845
|
},
|
|
3839
|
-
now:
|
|
3840
|
-
durationMs:
|
|
3846
|
+
now: A,
|
|
3847
|
+
durationMs: A - x,
|
|
3841
3848
|
outcome: {
|
|
3842
3849
|
status: "succeeded",
|
|
3843
|
-
output:
|
|
3850
|
+
output: gi(me, u)
|
|
3844
3851
|
}
|
|
3845
3852
|
})));
|
|
3846
|
-
return
|
|
3853
|
+
return j.kind === "committed" ? (S && (yield* C("failed to record workflow success", I.gen(function* () {
|
|
3847
3854
|
m?.("workflowRuns", {
|
|
3848
3855
|
op: "update",
|
|
3849
|
-
row: $(
|
|
3850
|
-
}), yield* h(
|
|
3851
|
-
}))), yield* v(b, "succeeded",
|
|
3856
|
+
row: $(j.row)
|
|
3857
|
+
}), yield* h(j.terminalEvent), yield* g(b, "succeeded", S);
|
|
3858
|
+
}))), yield* v(b, "succeeded", S), yield* I.sync(() => s.recordRun?.({
|
|
3852
3859
|
name: s.name,
|
|
3853
3860
|
status: "succeeded",
|
|
3854
3861
|
durationMs: Date.now() - x,
|
|
3855
3862
|
completedAtSec: Date.now() / 1e3
|
|
3856
|
-
})),
|
|
3863
|
+
})), me) : me;
|
|
3857
3864
|
});
|
|
3858
3865
|
};
|
|
3859
3866
|
//#endregion
|
|
3860
|
-
export {
|
|
3867
|
+
export { kn as $, Sr as A, sr as B, Ir as C, Tt as Ct, Dr as D, _t as Dt, Er as E, vt as Et, gr as F, jn as G, Qn as H, hr as I, xn as J, zn as K, pr as L, br as M, vr as N, kr as O, gt as Ot, ur as P, Tn as Q, fr as R, Kr as S, Et as St, Nr as T, yt as Tt, An as U, $n as V, Mn as W, yn as X, Sn as Y, vn as Z, Br as _, Ct as _t, fi as a, pn as at, Zr as b, kt as bt, bi as c, on as ct, ti as d, Ht as dt, En as et, Z as f, Gt as ft, Vr as g, Ot as gt, Hr as h, xt as ht, pi as i, dn as it, Cr as j, Ar as k, si as l, sn as lt, Gr as m, Ft as mt, di as n, gn as nt, $ as o, cn as ot, Wr as p, Bt as pt, bn as q, vi as r, mn as rt, gi as s, ln as st, ui as t, _n as tt, oi as u, Kt as ut, zr as v, wt as vt, Lr as w, bt as wt, Xr as x, Dt as xt, Qr as y, St as yt, Xn as z };
|