@voltro/workflow 0.33.0 → 0.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1801 -0
- package/dist/clusterTestSuite.js +28 -28
- package/dist/index.d.ts +509 -6
- package/dist/index.js +3 -3
- package/dist/{primitives-Bp98_F5L.js → primitives-oLKOTbvJ.js} +131 -76
- package/dist/primitives.d.ts +145 -5
- package/dist/primitives.js +2 -2
- package/dist/{src-CP61KZ9V.js → src-BXObaqb-.js} +912 -493
- package/package.json +3 -3
|
@@ -1,117 +1,119 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Activity as
|
|
3
|
-
import { Cause as
|
|
4
|
-
import { and as
|
|
5
|
-
import { createHash as
|
|
6
|
-
import { WorkflowInstance as
|
|
7
|
-
import { publishServerError as
|
|
1
|
+
import { A as e, E as t, M as n, O as r, T as i, j as a, k as o, w as s } from "./primitives-oLKOTbvJ.js";
|
|
2
|
+
import { Activity as c, DurableClock as l, DurableDeferred as u, Workflow as d, WorkflowEngine as f } from "@effect/workflow";
|
|
3
|
+
import { Cause as p, Effect as m, Either as h, Exit as g, FiberRef as _, Layer as v, Schema as y } from "effect";
|
|
4
|
+
import { and as b, boolean as ee, eq as x, generateId as S, gt as C, gte as te, id as w, inSet as ne, integer as T, isNull as E, json as D, lt as O, or as k, queryFor as A, reference as j, registerRetention as re, retentionTtlMsFromEnv as ie, table as M, text as N, timestamp as P } from "@voltro/database";
|
|
5
|
+
import { createHash as ae } from "node:crypto";
|
|
6
|
+
import { WorkflowInstance as oe } from "@effect/workflow/WorkflowEngine";
|
|
7
|
+
import { publishServerError as se } from "@voltro/protocol";
|
|
8
8
|
//#region src/inMemoryLayer.ts
|
|
9
|
-
var
|
|
10
|
-
id:
|
|
11
|
-
tag:
|
|
12
|
-
executionId:
|
|
13
|
-
status:
|
|
9
|
+
var ce = f.layerMemory, le = M("_voltro_workflow_runs", {
|
|
10
|
+
id: w({ prefix: "wfrun" }),
|
|
11
|
+
tag: N(),
|
|
12
|
+
executionId: N().unique(),
|
|
13
|
+
status: N().oneOf([
|
|
14
14
|
"running",
|
|
15
15
|
"succeeded",
|
|
16
16
|
"failed",
|
|
17
17
|
"cancelled",
|
|
18
18
|
"suspended"
|
|
19
19
|
]).default("running"),
|
|
20
|
-
payload:
|
|
21
|
-
workflowVersion:
|
|
22
|
-
workflowPatches:
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
20
|
+
payload: D(),
|
|
21
|
+
workflowVersion: N().nullable(),
|
|
22
|
+
workflowPatches: D().nullable(),
|
|
23
|
+
runnerEnteredAt: P().nullable(),
|
|
24
|
+
reclaimCount: T().default(0),
|
|
25
|
+
output: D().nullable(),
|
|
26
|
+
subject: D().nullable(),
|
|
27
|
+
source: N().nullable(),
|
|
28
|
+
errorTag: N().nullable(),
|
|
29
|
+
errorMessage: N().nullable(),
|
|
30
|
+
cancelled: ee().default(!1),
|
|
31
|
+
discardedAt: P().nullable(),
|
|
32
|
+
discardedBy: N().nullable(),
|
|
33
|
+
startedAt: P().default("now"),
|
|
34
|
+
completedAt: P().nullable(),
|
|
35
|
+
durationMs: T().nullable(),
|
|
36
|
+
traceId: N().nullable(),
|
|
37
|
+
parentExecutionId: N().nullable(),
|
|
38
|
+
parentClosePolicy: N().oneOf([
|
|
37
39
|
"cancel",
|
|
38
40
|
"terminate",
|
|
39
41
|
"abandon"
|
|
40
42
|
]).nullable()
|
|
41
|
-
}).index(["tag"]).index(["status"]).index(["source"]).index(["startedAt"]).index(["parentExecutionId"]).index(["parentClosePolicy"]),
|
|
42
|
-
id:
|
|
43
|
-
runId:
|
|
43
|
+
}).index(["tag"]).index(["status"]).index(["source"]).index(["startedAt"]).index(["parentExecutionId"]).index(["parentClosePolicy"]), ue = M("_voltro_workflow_run_steps", {
|
|
44
|
+
id: w({ prefix: "wfstep" }),
|
|
45
|
+
runId: j(() => le, {
|
|
44
46
|
index: !1,
|
|
45
47
|
onDelete: "cascade"
|
|
46
48
|
}),
|
|
47
|
-
stepName:
|
|
48
|
-
attempt:
|
|
49
|
-
status:
|
|
49
|
+
stepName: N(),
|
|
50
|
+
attempt: T().default(1),
|
|
51
|
+
status: N().oneOf([
|
|
50
52
|
"running",
|
|
51
53
|
"succeeded",
|
|
52
54
|
"failed"
|
|
53
55
|
]).default("running"),
|
|
54
|
-
input:
|
|
55
|
-
retryPolicy:
|
|
56
|
-
output:
|
|
57
|
-
errorTag:
|
|
58
|
-
errorMessage:
|
|
59
|
-
errorCause:
|
|
60
|
-
startedAt:
|
|
61
|
-
completedAt:
|
|
62
|
-
durationMs:
|
|
63
|
-
}).index(["runId", "stepName"]).index(["startedAt"]),
|
|
64
|
-
id:
|
|
65
|
-
runId:
|
|
56
|
+
input: D().nullable(),
|
|
57
|
+
retryPolicy: D().nullable(),
|
|
58
|
+
output: D().nullable(),
|
|
59
|
+
errorTag: N().nullable(),
|
|
60
|
+
errorMessage: N().nullable(),
|
|
61
|
+
errorCause: D().nullable(),
|
|
62
|
+
startedAt: P().default("now"),
|
|
63
|
+
completedAt: P().nullable(),
|
|
64
|
+
durationMs: T().nullable()
|
|
65
|
+
}).index(["runId", "stepName"]).index(["startedAt"]), de = M("_voltro_workflow_run_events", {
|
|
66
|
+
id: w({ prefix: "wfev" }),
|
|
67
|
+
runId: j(() => le, {
|
|
66
68
|
index: !1,
|
|
67
69
|
onDelete: "cascade"
|
|
68
70
|
}),
|
|
69
|
-
eventType:
|
|
70
|
-
payload:
|
|
71
|
-
occurredAt:
|
|
72
|
-
stepName:
|
|
73
|
-
attempt:
|
|
74
|
-
}).index(["runId", "occurredAt"]).index(["eventType"]),
|
|
75
|
-
id:
|
|
76
|
-
workflowName:
|
|
77
|
-
executionId:
|
|
78
|
-
subject:
|
|
79
|
-
traceId:
|
|
80
|
-
source:
|
|
81
|
-
parentExecutionId:
|
|
82
|
-
parentClosePolicy:
|
|
71
|
+
eventType: N(),
|
|
72
|
+
payload: D().nullable(),
|
|
73
|
+
occurredAt: P().default("now"),
|
|
74
|
+
stepName: N().nullable(),
|
|
75
|
+
attempt: T().nullable()
|
|
76
|
+
}).index(["runId", "occurredAt"]).index(["eventType"]), fe = M("_voltro_workflow_start_contexts", {
|
|
77
|
+
id: w({ prefix: "wfctx" }),
|
|
78
|
+
workflowName: N(),
|
|
79
|
+
executionId: N().unique(),
|
|
80
|
+
subject: D().nullable(),
|
|
81
|
+
traceId: N().nullable(),
|
|
82
|
+
source: N().nullable(),
|
|
83
|
+
parentExecutionId: N().nullable(),
|
|
84
|
+
parentClosePolicy: N().oneOf([
|
|
83
85
|
"cancel",
|
|
84
86
|
"terminate",
|
|
85
87
|
"abandon"
|
|
86
88
|
]).nullable(),
|
|
87
|
-
createdAt:
|
|
88
|
-
}).index(["workflowName"]).index(["executionId"]).index(["parentExecutionId"]),
|
|
89
|
-
id:
|
|
90
|
-
tenantId:
|
|
91
|
-
workflowName:
|
|
92
|
-
controlKey:
|
|
93
|
-
mode:
|
|
89
|
+
createdAt: P().default("now")
|
|
90
|
+
}).index(["workflowName"]).index(["executionId"]).index(["parentExecutionId"]), pe = M("_voltro_workflow_pending", {
|
|
91
|
+
id: w({ prefix: "wfp" }),
|
|
92
|
+
tenantId: N().nullable(),
|
|
93
|
+
workflowName: N(),
|
|
94
|
+
controlKey: N(),
|
|
95
|
+
mode: N().oneOf([
|
|
94
96
|
"debounce",
|
|
95
97
|
"batch",
|
|
96
98
|
"throttle",
|
|
97
99
|
"concurrency",
|
|
98
100
|
"paused"
|
|
99
101
|
]),
|
|
100
|
-
payload:
|
|
101
|
-
callerContext:
|
|
102
|
-
priority:
|
|
103
|
-
dueAt:
|
|
104
|
-
deadlineAt:
|
|
105
|
-
collapsed:
|
|
106
|
-
firstSeenAt:
|
|
107
|
-
updatedAt:
|
|
108
|
-
attempts:
|
|
109
|
-
lastError:
|
|
110
|
-
}).index(["workflowName", "controlKey"]).index(["dueAt"]).index(["workflowName", "mode"]).index(["tenantId"]),
|
|
111
|
-
id:
|
|
112
|
-
tenantId:
|
|
113
|
-
workflowName:
|
|
114
|
-
outcome:
|
|
102
|
+
payload: D(),
|
|
103
|
+
callerContext: D().nullable(),
|
|
104
|
+
priority: T().default(0),
|
|
105
|
+
dueAt: P(),
|
|
106
|
+
deadlineAt: P().nullable(),
|
|
107
|
+
collapsed: T().default(1),
|
|
108
|
+
firstSeenAt: P().default("now"),
|
|
109
|
+
updatedAt: P().default("now"),
|
|
110
|
+
attempts: T().default(0),
|
|
111
|
+
lastError: N().nullable()
|
|
112
|
+
}).index(["workflowName", "controlKey"]).index(["dueAt"]).index(["workflowName", "mode"]).index(["tenantId"]), me = M("_voltro_workflow_admissions", {
|
|
113
|
+
id: w({ prefix: "wfadm" }),
|
|
114
|
+
tenantId: N().nullable(),
|
|
115
|
+
workflowName: N(),
|
|
116
|
+
outcome: N().oneOf([
|
|
115
117
|
"admitted",
|
|
116
118
|
"dropped",
|
|
117
119
|
"skipped",
|
|
@@ -119,61 +121,61 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
119
121
|
"expired",
|
|
120
122
|
"discarded"
|
|
121
123
|
]),
|
|
122
|
-
mode:
|
|
123
|
-
reason:
|
|
124
|
-
collapsed:
|
|
125
|
-
waitedMs:
|
|
126
|
-
executionId:
|
|
127
|
-
runId:
|
|
128
|
-
singletonKey:
|
|
129
|
-
concurrencyKey:
|
|
130
|
-
rateKey:
|
|
131
|
-
admittedAt:
|
|
132
|
-
expiresAt:
|
|
133
|
-
releasedAt:
|
|
134
|
-
}).index(["workflowName", "admittedAt"]).index(["concurrencyKey", "releasedAt"]).index(["singletonKey", "releasedAt"]).index(["rateKey", "admittedAt"]).index(["executionId"]).index(["tenantId"]),
|
|
135
|
-
id:
|
|
136
|
-
pausedAt:
|
|
137
|
-
pausedBy:
|
|
138
|
-
reason:
|
|
139
|
-
}),
|
|
124
|
+
mode: N().nullable(),
|
|
125
|
+
reason: N().nullable(),
|
|
126
|
+
collapsed: T().default(1),
|
|
127
|
+
waitedMs: T().nullable(),
|
|
128
|
+
executionId: N().nullable(),
|
|
129
|
+
runId: N().nullable(),
|
|
130
|
+
singletonKey: N().nullable(),
|
|
131
|
+
concurrencyKey: N().nullable(),
|
|
132
|
+
rateKey: N().nullable(),
|
|
133
|
+
admittedAt: P().default("now"),
|
|
134
|
+
expiresAt: P().nullable(),
|
|
135
|
+
releasedAt: P().nullable()
|
|
136
|
+
}).index(["workflowName", "admittedAt"]).index(["concurrencyKey", "releasedAt"]).index(["singletonKey", "releasedAt"]).index(["rateKey", "admittedAt"]).index(["executionId"]).index(["tenantId"]), he = M("_voltro_workflow_pauses", {
|
|
137
|
+
id: w({ prefix: "wfpause" }),
|
|
138
|
+
pausedAt: P().default("now"),
|
|
139
|
+
pausedBy: N().nullable(),
|
|
140
|
+
reason: N().nullable()
|
|
141
|
+
}), ge = class extends Error {
|
|
140
142
|
workflowName;
|
|
141
143
|
field;
|
|
142
144
|
constructor(e, t, n) {
|
|
143
145
|
super(`workflow '${e}': ${t}(payload) threw — a flow-control key function must be total over every payload the workflow accepts, because it runs before the run exists and there is nowhere to report a partial failure to. Cause: ${n instanceof Error ? n.message : String(n)}`), this.name = "FlowControlKeyError", this.workflowName = e, this.field = t, this.cause = n;
|
|
144
146
|
}
|
|
145
|
-
},
|
|
147
|
+
}, F = (e, t, n, r) => {
|
|
146
148
|
try {
|
|
147
149
|
let e = n(r);
|
|
148
150
|
if (typeof e != "string" || e.length === 0) throw Error(`returned ${e === "" ? "an empty string" : String(e)}; expected a non-empty string`);
|
|
149
151
|
return e;
|
|
150
152
|
} catch (n) {
|
|
151
|
-
throw new
|
|
153
|
+
throw new ge(e, t, n);
|
|
152
154
|
}
|
|
153
|
-
},
|
|
155
|
+
}, _e = (e, t) => e === void 0 ? t : `pool\u0000${e}\u0000${t}`, I = (e, t) => {
|
|
154
156
|
let n = e.workflowName, r = 0;
|
|
155
157
|
if (e.priority !== void 0) try {
|
|
156
158
|
let n = e.priority(t);
|
|
157
159
|
if (!Number.isFinite(n)) throw Error(`returned ${String(n)}; expected a finite number`);
|
|
158
160
|
r = Math.trunc(n);
|
|
159
161
|
} catch (e) {
|
|
160
|
-
throw new
|
|
162
|
+
throw new ge(n, "priority", e);
|
|
161
163
|
}
|
|
162
164
|
return {
|
|
163
|
-
...e.debounce === void 0 ? {} : { debounceKey:
|
|
164
|
-
...e.singleton === void 0 ? {} : { singletonKey:
|
|
165
|
-
...e.concurrency === void 0 ? {} : { concurrencyKey:
|
|
166
|
-
...e.throttle?.key === void 0 ? e.throttle === void 0 ? {} : { throttleKey: "" } : { throttleKey:
|
|
167
|
-
...e.rateLimit?.key === void 0 ? e.rateLimit === void 0 ? {} : { rateLimitKey: "" } : { rateLimitKey:
|
|
168
|
-
...e.batch?.key === void 0 ? e.batch === void 0 ? {} : { batchKey: "" } : { batchKey:
|
|
165
|
+
...e.debounce === void 0 ? {} : { debounceKey: F(n, "debounce.key", e.debounce.key, t) },
|
|
166
|
+
...e.singleton === void 0 ? {} : { singletonKey: F(n, "singleton.key", e.singleton.key, t) },
|
|
167
|
+
...e.concurrency === void 0 ? {} : { concurrencyKey: _e(e.concurrency.pool, e.concurrency.key === void 0 ? "" : F(n, "concurrency.key", e.concurrency.key, t)) },
|
|
168
|
+
...e.throttle?.key === void 0 ? e.throttle === void 0 ? {} : { throttleKey: "" } : { throttleKey: F(n, "throttle.key", e.throttle.key, t) },
|
|
169
|
+
...e.rateLimit?.key === void 0 ? e.rateLimit === void 0 ? {} : { rateLimitKey: "" } : { rateLimitKey: F(n, "rateLimit.key", e.rateLimit.key, t) },
|
|
170
|
+
...e.batch?.key === void 0 ? e.batch === void 0 ? {} : { batchKey: "" } : { batchKey: F(n, "batch.key", e.batch.key, t) },
|
|
169
171
|
priority: r
|
|
170
172
|
};
|
|
171
|
-
},
|
|
173
|
+
}, ve = (e, t, n, r) => {
|
|
172
174
|
let i = e.filter((e) => e > r - n);
|
|
173
175
|
if (i.length < t) return;
|
|
174
176
|
let a = [...i].sort((e, t) => t - e)[t - 1];
|
|
175
177
|
if (a !== void 0) return a + n;
|
|
176
|
-
},
|
|
178
|
+
}, ye = (e) => {
|
|
177
179
|
let { control: t, keys: n, state: r, now: i, reconsidering: a } = e;
|
|
178
180
|
if (r.paused === !0) return {
|
|
179
181
|
kind: "defer",
|
|
@@ -183,7 +185,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
183
185
|
keys: n
|
|
184
186
|
};
|
|
185
187
|
if (t.rateLimit !== void 0) {
|
|
186
|
-
let e =
|
|
188
|
+
let e = ve(r.recentAdmissions ?? [], t.rateLimit.limit, t.rateLimit.periodMs, i);
|
|
187
189
|
if (e !== void 0) return {
|
|
188
190
|
kind: "drop",
|
|
189
191
|
reason: "rate-limit",
|
|
@@ -202,12 +204,12 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
202
204
|
kind: "admit",
|
|
203
205
|
reason: "debounce-deadline",
|
|
204
206
|
keys: n,
|
|
205
|
-
...
|
|
207
|
+
...L(t, r)
|
|
206
208
|
} : {
|
|
207
209
|
kind: "admit",
|
|
208
210
|
reason: "debounce-elapsed",
|
|
209
211
|
keys: n,
|
|
210
|
-
...
|
|
212
|
+
...L(t, r)
|
|
211
213
|
} : {
|
|
212
214
|
kind: "defer",
|
|
213
215
|
mode: "debounce",
|
|
@@ -223,12 +225,12 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
223
225
|
kind: "admit",
|
|
224
226
|
reason: "batch-full",
|
|
225
227
|
keys: n,
|
|
226
|
-
...
|
|
228
|
+
...L(t, r)
|
|
227
229
|
} : a && i >= s ? {
|
|
228
230
|
kind: "admit",
|
|
229
231
|
reason: "batch-timeout",
|
|
230
232
|
keys: n,
|
|
231
|
-
...
|
|
233
|
+
...L(t, r)
|
|
232
234
|
} : {
|
|
233
235
|
kind: "defer",
|
|
234
236
|
mode: "batch",
|
|
@@ -238,7 +240,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
238
240
|
};
|
|
239
241
|
}
|
|
240
242
|
if (t.throttle !== void 0) {
|
|
241
|
-
let e =
|
|
243
|
+
let e = ve(r.recentAdmissions ?? [], t.throttle.limit, t.throttle.periodMs, i);
|
|
242
244
|
if (e !== void 0) return {
|
|
243
245
|
kind: "defer",
|
|
244
246
|
mode: "throttle",
|
|
@@ -255,25 +257,25 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
255
257
|
keys: n
|
|
256
258
|
} : {
|
|
257
259
|
kind: "admit",
|
|
258
|
-
reason:
|
|
260
|
+
reason: be(t) ? "under-limits" : "no-controls",
|
|
259
261
|
keys: n,
|
|
260
|
-
...
|
|
262
|
+
...L(t, r)
|
|
261
263
|
};
|
|
262
|
-
},
|
|
264
|
+
}, be = (e) => e.debounce !== void 0 || e.singleton !== void 0 || e.concurrency !== void 0 || e.throttle !== void 0 || e.rateLimit !== void 0 || e.batch !== void 0, L = (e, t) => e.singleton?.mode === "cancel" && t.singletonHolder !== void 0 ? { evict: t.singletonHolder } : {}, xe = (e, t, n) => {
|
|
263
265
|
let r = e.timeouts?.startMs;
|
|
264
266
|
return r !== void 0 && n - t.firstSeenAt >= r;
|
|
265
|
-
},
|
|
267
|
+
}, Se = (e, t, n) => {
|
|
266
268
|
let r = e.timeouts?.finishMs;
|
|
267
269
|
return r === void 0 || t.terminal ? !1 : n - t.startedAt >= r;
|
|
268
|
-
},
|
|
270
|
+
}, Ce = (e, t) => e.priority === t.priority ? e.firstSeenAt === t.firstSeenAt ? e.id < t.id ? -1 : +(e.id > t.id) : e.firstSeenAt - t.firstSeenAt : t.priority - e.priority, R = "_voltro_workflow_pending", z = "_voltro_workflow_admissions", B = "_voltro_workflow_pauses", we = 1440 * 60 * 1e3, Te = (e, t, n) => `wfp_${ae("sha256").update(`${e}\u0000${t}\u0000${n}`).digest("hex").slice(0, 40)}`, V = (e) => {
|
|
269
271
|
if (e instanceof Date) return e.getTime();
|
|
270
272
|
if (typeof e == "number") return e;
|
|
271
273
|
let t = Date.parse(String(e));
|
|
272
274
|
return Number.isNaN(t) ? 0 : t;
|
|
273
|
-
},
|
|
275
|
+
}, H = (e, t) => {
|
|
274
276
|
let n = typeof e == "number" ? e : Number(e);
|
|
275
277
|
return Number.isFinite(n) ? Math.trunc(n) : t;
|
|
276
|
-
},
|
|
278
|
+
}, Ee = (e) => ({
|
|
277
279
|
id: String(e.id),
|
|
278
280
|
tenantId: e.tenantId === null || e.tenantId === void 0 ? null : String(e.tenantId),
|
|
279
281
|
workflowName: String(e.workflowName),
|
|
@@ -281,25 +283,25 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
281
283
|
mode: String(e.mode),
|
|
282
284
|
payload: e.payload,
|
|
283
285
|
callerContext: e.callerContext ?? null,
|
|
284
|
-
priority:
|
|
285
|
-
dueAt:
|
|
286
|
-
deadlineAt: e.deadlineAt === null || e.deadlineAt === void 0 ? void 0 :
|
|
287
|
-
collapsed:
|
|
288
|
-
firstSeenAt:
|
|
289
|
-
attempts:
|
|
286
|
+
priority: H(e.priority, 0),
|
|
287
|
+
dueAt: V(e.dueAt),
|
|
288
|
+
deadlineAt: e.deadlineAt === null || e.deadlineAt === void 0 ? void 0 : V(e.deadlineAt),
|
|
289
|
+
collapsed: H(e.collapsed, 1),
|
|
290
|
+
firstSeenAt: V(e.firstSeenAt),
|
|
291
|
+
attempts: H(e.attempts, 0),
|
|
290
292
|
lastError: e.lastError === null || e.lastError === void 0 ? null : String(e.lastError)
|
|
291
|
-
}),
|
|
293
|
+
}), U = (e, t, n, r) => ({
|
|
292
294
|
table: e,
|
|
293
295
|
predicate: t,
|
|
294
296
|
order: n,
|
|
295
297
|
take: r,
|
|
296
298
|
skip: void 0,
|
|
297
299
|
projection: void 0
|
|
298
|
-
}),
|
|
299
|
-
let t = await e.query(
|
|
300
|
+
}), De = async (e) => {
|
|
301
|
+
let t = await e.query(U(B, void 0, [], 1e3));
|
|
300
302
|
return new Set(t.map((e) => String(e.id)));
|
|
301
|
-
},
|
|
302
|
-
await e.upsert(
|
|
303
|
+
}, Oe = async (e, t, n, r) => {
|
|
304
|
+
await e.upsert(B, {
|
|
303
305
|
id: t,
|
|
304
306
|
pausedAt: /* @__PURE__ */ new Date(),
|
|
305
307
|
pausedBy: n,
|
|
@@ -312,43 +314,43 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
312
314
|
"reason"
|
|
313
315
|
]
|
|
314
316
|
});
|
|
315
|
-
},
|
|
317
|
+
}, ke = async (e, t) => e.delete(B, t), Ae = async (e) => {
|
|
316
318
|
let { store: t, control: n, keys: r, now: i } = e, a = { paused: e.paused }, o = [];
|
|
317
319
|
n.debounce !== void 0 && r.debounceKey !== void 0 && o.push((async () => {
|
|
318
|
-
let e = (await t.query(
|
|
320
|
+
let e = (await t.query(U(R, b(x("workflowName", n.workflowName), x("controlKey", r.debounceKey), x("mode", "debounce")), [], 1)))[0];
|
|
319
321
|
if (e === void 0) return;
|
|
320
|
-
let i = e.deadlineAt === null || e.deadlineAt === void 0 ? void 0 :
|
|
322
|
+
let i = e.deadlineAt === null || e.deadlineAt === void 0 ? void 0 : V(e.deadlineAt);
|
|
321
323
|
a.debouncePending = {
|
|
322
|
-
firstSeenAt:
|
|
323
|
-
collapsed:
|
|
324
|
+
firstSeenAt: V(e.firstSeenAt),
|
|
325
|
+
collapsed: H(e.collapsed, 1),
|
|
324
326
|
...i === void 0 ? {} : { deadlineAt: i }
|
|
325
327
|
};
|
|
326
328
|
})()), n.batch !== void 0 && r.batchKey !== void 0 && o.push((async () => {
|
|
327
|
-
let e = await t.query(
|
|
329
|
+
let e = await t.query(U(R, b(x("workflowName", n.workflowName), x("controlKey", r.batchKey), x("mode", "batch")), [{
|
|
328
330
|
column: "firstSeenAt",
|
|
329
331
|
direction: "asc"
|
|
330
332
|
}], n.batch.maxSize + 1));
|
|
331
333
|
e.length !== 0 && (a.batchPending = {
|
|
332
334
|
count: e.length,
|
|
333
|
-
firstSeenAt:
|
|
335
|
+
firstSeenAt: V(e[0].firstSeenAt)
|
|
334
336
|
});
|
|
335
337
|
})()), n.singleton !== void 0 && r.singletonKey !== void 0 && o.push((async () => {
|
|
336
|
-
let e = await
|
|
338
|
+
let e = await je(t, n.workflowName, r.singletonKey, i);
|
|
337
339
|
e !== void 0 && (a.singletonHolder = e);
|
|
338
340
|
})()), n.concurrency !== void 0 && r.concurrencyKey !== void 0 && o.push((async () => {
|
|
339
|
-
let e = n.concurrency.pool === void 0 ? [
|
|
341
|
+
let e = n.concurrency.pool === void 0 ? [x("workflowName", n.workflowName)] : [], o = await t.query(U(z, b(...e, x("concurrencyKey", r.concurrencyKey), E("releasedAt"), C("expiresAt", new Date(i))), [], n.concurrency.limit));
|
|
340
342
|
a.inFlight = o.length;
|
|
341
343
|
})());
|
|
342
344
|
let s = n.rateLimit ?? n.throttle, c = r.rateLimitKey ?? r.throttleKey;
|
|
343
345
|
return s !== void 0 && c !== void 0 && o.push((async () => {
|
|
344
|
-
let e = await t.query(
|
|
346
|
+
let e = await t.query(U(z, b(x("workflowName", n.workflowName), x("rateKey", c), x("outcome", "admitted"), C("admittedAt", new Date(i - s.periodMs))), [{
|
|
345
347
|
column: "admittedAt",
|
|
346
348
|
direction: "desc"
|
|
347
349
|
}], s.limit));
|
|
348
|
-
a.recentAdmissions = e.map((e) =>
|
|
350
|
+
a.recentAdmissions = e.map((e) => V(e.admittedAt));
|
|
349
351
|
})()), await Promise.all(o), a;
|
|
350
|
-
},
|
|
351
|
-
let i = (await e.query(
|
|
352
|
+
}, je = async (e, t, n, r) => {
|
|
353
|
+
let i = (await e.query(U(z, b(x("workflowName", t), x("singletonKey", n), E("releasedAt"), C("expiresAt", new Date(r))), [{
|
|
352
354
|
column: "admittedAt",
|
|
353
355
|
direction: "desc"
|
|
354
356
|
}], 1)))[0];
|
|
@@ -357,20 +359,20 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
357
359
|
if (a != null) return {
|
|
358
360
|
executionId: String(a),
|
|
359
361
|
runId: i.runId === null || i.runId === void 0 ? "" : String(i.runId),
|
|
360
|
-
admittedAt:
|
|
362
|
+
admittedAt: V(i.admittedAt)
|
|
361
363
|
};
|
|
362
|
-
},
|
|
363
|
-
let { store: t, control: n, decision: r, now: i } = e, a =
|
|
364
|
+
}, Me = async (e) => {
|
|
365
|
+
let { store: t, control: n, decision: r, now: i } = e, a = Ne(r.mode, r.keys);
|
|
364
366
|
if (r.collapse === "hold") {
|
|
365
|
-
let o = e.existingId ??
|
|
366
|
-
return await t.update(
|
|
367
|
+
let o = e.existingId ?? Te(n.workflowName, r.mode, a);
|
|
368
|
+
return await t.update(R, o, {
|
|
367
369
|
dueAt: new Date(r.dueAt),
|
|
368
370
|
updatedAt: new Date(i)
|
|
369
371
|
}), o;
|
|
370
372
|
}
|
|
371
373
|
if (r.collapse === "replace") {
|
|
372
|
-
let o =
|
|
373
|
-
return await t.upsert(
|
|
374
|
+
let o = Te(n.workflowName, r.mode, a);
|
|
375
|
+
return await t.upsert(R, {
|
|
374
376
|
id: o,
|
|
375
377
|
tenantId: e.tenantId,
|
|
376
378
|
workflowName: n.workflowName,
|
|
@@ -394,12 +396,12 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
394
396
|
priority: r.keys.priority,
|
|
395
397
|
dueAt: new Date(r.dueAt),
|
|
396
398
|
deadlineAt: r.deadlineAt === void 0 ? t.deadlineAt ?? null : new Date(r.deadlineAt),
|
|
397
|
-
collapsed:
|
|
399
|
+
collapsed: H(t.collapsed, 1) + 1,
|
|
398
400
|
updatedAt: new Date(i)
|
|
399
401
|
})
|
|
400
402
|
}), o;
|
|
401
403
|
}
|
|
402
|
-
let o = await t.insert(
|
|
404
|
+
let o = await t.insert(R, {
|
|
403
405
|
tenantId: e.tenantId,
|
|
404
406
|
workflowName: n.workflowName,
|
|
405
407
|
controlKey: a,
|
|
@@ -416,7 +418,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
416
418
|
lastError: null
|
|
417
419
|
});
|
|
418
420
|
return String(o.id);
|
|
419
|
-
},
|
|
421
|
+
}, Ne = (e, t) => {
|
|
420
422
|
switch (e) {
|
|
421
423
|
case "debounce": return t.debounceKey ?? "";
|
|
422
424
|
case "batch": return t.batchKey ?? "";
|
|
@@ -424,8 +426,8 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
424
426
|
case "concurrency": return t.concurrencyKey ?? "";
|
|
425
427
|
default: return "";
|
|
426
428
|
}
|
|
427
|
-
},
|
|
428
|
-
let { control: t, keys: n, now: r } = e, i = t.timeouts?.finishMs ?? 864e5, a = await e.store.insert(
|
|
429
|
+
}, W = async (e) => {
|
|
430
|
+
let { control: t, keys: n, now: r } = e, i = t.timeouts?.finishMs ?? 864e5, a = await e.store.insert(z, {
|
|
429
431
|
tenantId: e.tenantId,
|
|
430
432
|
workflowName: t.workflowName,
|
|
431
433
|
outcome: e.outcome,
|
|
@@ -443,31 +445,31 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
443
445
|
releasedAt: e.outcome === "admitted" ? null : new Date(r)
|
|
444
446
|
});
|
|
445
447
|
return String(a.id);
|
|
446
|
-
},
|
|
447
|
-
let r = await e.query(
|
|
448
|
-
return r.length === 0 ? !1 : (await Promise.all(r.map((t) => e.update(
|
|
449
|
-
},
|
|
450
|
-
let r = (await e.query(
|
|
448
|
+
}, Pe = async (e, t, n) => {
|
|
449
|
+
let r = await e.query(U(z, b(x("executionId", t), x("outcome", "admitted"), E("releasedAt")), [], 10));
|
|
450
|
+
return r.length === 0 ? !1 : (await Promise.all(r.map((t) => e.update(z, String(t.id), { releasedAt: new Date(n) }))), !0);
|
|
451
|
+
}, Fe = async (e, t, n) => (await Ie(e, t, n)).due, Ie = async (e, t, n) => {
|
|
452
|
+
let r = (await e.query(U(R, void 0, [{
|
|
451
453
|
column: "priority",
|
|
452
454
|
direction: "desc"
|
|
453
455
|
}, {
|
|
454
456
|
column: "firstSeenAt",
|
|
455
457
|
direction: "asc"
|
|
456
|
-
}], n))).map(
|
|
458
|
+
}], n))).map(Ee), i;
|
|
457
459
|
for (let e of r) e.dueAt <= t || (i === void 0 || e.dueAt < i) && (i = e.dueAt);
|
|
458
460
|
return {
|
|
459
|
-
due: r.filter((e) => e.dueAt <= t).sort(
|
|
461
|
+
due: r.filter((e) => e.dueAt <= t).sort(Ce),
|
|
460
462
|
nextDueAt: i
|
|
461
463
|
};
|
|
462
|
-
},
|
|
464
|
+
}, Le = async (e, t) => (await e.query(U(R, void 0, [{
|
|
463
465
|
column: "firstSeenAt",
|
|
464
466
|
direction: "asc"
|
|
465
|
-
}], t))).map(
|
|
466
|
-
let i = (await e.query(
|
|
467
|
+
}], t))).map(Ee), G = async (e, t) => e.delete(R, t), Re = async (e, t, n, r) => {
|
|
468
|
+
let i = (await e.query(U(R, x("id", t), [], 1)))[0];
|
|
467
469
|
if (i === void 0) return !1;
|
|
468
|
-
let a =
|
|
470
|
+
let a = Ee(i);
|
|
469
471
|
try {
|
|
470
|
-
await e.insert(
|
|
472
|
+
await e.insert(z, {
|
|
471
473
|
tenantId: a.tenantId,
|
|
472
474
|
workflowName: a.workflowName,
|
|
473
475
|
outcome: "discarded",
|
|
@@ -485,36 +487,36 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
485
487
|
releasedAt: new Date(r)
|
|
486
488
|
});
|
|
487
489
|
} catch {}
|
|
488
|
-
return e.delete(
|
|
489
|
-
},
|
|
490
|
-
await e.update(
|
|
490
|
+
return e.delete(R, t);
|
|
491
|
+
}, ze = async (e, t, n, r) => {
|
|
492
|
+
await e.update(R, t.id, {
|
|
491
493
|
attempts: t.attempts + 1,
|
|
492
494
|
lastError: n.slice(0, 500),
|
|
493
495
|
updatedAt: new Date(r)
|
|
494
496
|
});
|
|
495
|
-
},
|
|
496
|
-
let t = await
|
|
497
|
+
}, Be = async (e) => {
|
|
498
|
+
let t = await Ae({
|
|
497
499
|
store: e.store,
|
|
498
500
|
control: e.control,
|
|
499
501
|
keys: e.keys,
|
|
500
502
|
now: e.now,
|
|
501
503
|
paused: e.paused
|
|
502
504
|
});
|
|
503
|
-
return
|
|
505
|
+
return ye({
|
|
504
506
|
control: e.control,
|
|
505
507
|
keys: e.keys,
|
|
506
508
|
state: t,
|
|
507
509
|
now: e.now,
|
|
508
510
|
reconsidering: e.reconsidering
|
|
509
511
|
});
|
|
510
|
-
},
|
|
511
|
-
let r = await e.query(
|
|
512
|
+
}, Ve = async (e, t, n = 1e3) => {
|
|
513
|
+
let r = await e.query(U(z, void 0, [{
|
|
512
514
|
column: "admittedAt",
|
|
513
515
|
direction: "asc"
|
|
514
|
-
}], n)), i = t.getTime(), a = r.filter((e) => e.releasedAt != null &&
|
|
515
|
-
return await Promise.all(a.map((t) => e.delete(
|
|
516
|
-
},
|
|
517
|
-
let { store: t, control: n, now: r } = e, i =
|
|
516
|
+
}], n)), i = t.getTime(), a = r.filter((e) => e.releasedAt != null && V(e.admittedAt) < i);
|
|
517
|
+
return await Promise.all(a.map((t) => e.delete(z, String(t.id)))), a.length;
|
|
518
|
+
}, He = async (e) => {
|
|
519
|
+
let { store: t, control: n, now: r } = e, i = I(n, e.payload), a = await Be({
|
|
518
520
|
store: t,
|
|
519
521
|
control: n,
|
|
520
522
|
keys: i,
|
|
@@ -522,7 +524,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
522
524
|
now: r,
|
|
523
525
|
reconsidering: !1
|
|
524
526
|
});
|
|
525
|
-
if (a.kind === "drop") return await
|
|
527
|
+
if (a.kind === "drop") return await W({
|
|
526
528
|
store: t,
|
|
527
529
|
control: n,
|
|
528
530
|
keys: i,
|
|
@@ -539,7 +541,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
539
541
|
kind: "dropped",
|
|
540
542
|
retryAfterMs: a.retryAfterMs
|
|
541
543
|
};
|
|
542
|
-
if (a.kind === "skip") return await
|
|
544
|
+
if (a.kind === "skip") return await W({
|
|
543
545
|
store: t,
|
|
544
546
|
control: n,
|
|
545
547
|
keys: i,
|
|
@@ -559,7 +561,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
559
561
|
};
|
|
560
562
|
if (a.kind === "defer") return {
|
|
561
563
|
kind: "queued",
|
|
562
|
-
intentId: await
|
|
564
|
+
intentId: await Me({
|
|
563
565
|
store: t,
|
|
564
566
|
control: n,
|
|
565
567
|
decision: a,
|
|
@@ -573,12 +575,12 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
573
575
|
};
|
|
574
576
|
let o = e.payload, s = [], c = 1;
|
|
575
577
|
if (n.batch !== void 0 && i.batchKey !== void 0) {
|
|
576
|
-
let r = await
|
|
578
|
+
let r = await Ue(t, n.workflowName, i.batchKey, n.batch.maxSize);
|
|
577
579
|
o = { items: [...r.map((e) => e.payload), e.payload] }, s = r.map((e) => e.id), c = r.length + 1;
|
|
578
580
|
}
|
|
579
581
|
return {
|
|
580
582
|
kind: "start",
|
|
581
|
-
ledgerId: await
|
|
583
|
+
ledgerId: await W({
|
|
582
584
|
store: t,
|
|
583
585
|
control: n,
|
|
584
586
|
keys: i,
|
|
@@ -601,9 +603,9 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
601
603
|
runId: a.evict.runId
|
|
602
604
|
} }
|
|
603
605
|
};
|
|
604
|
-
},
|
|
606
|
+
}, Ue = async (e, t, n, r) => (await e.query({
|
|
605
607
|
table: "_voltro_workflow_pending",
|
|
606
|
-
predicate:
|
|
608
|
+
predicate: b(x("workflowName", t), x("controlKey", n), x("mode", "batch")),
|
|
607
609
|
order: [{
|
|
608
610
|
column: "firstSeenAt",
|
|
609
611
|
direction: "asc"
|
|
@@ -614,22 +616,22 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
614
616
|
})).map((e) => ({
|
|
615
617
|
id: String(e.id),
|
|
616
618
|
payload: e.payload
|
|
617
|
-
})),
|
|
619
|
+
})), We = async (e, t, n, r) => {
|
|
618
620
|
await e.update("_voltro_workflow_admissions", t, {
|
|
619
621
|
executionId: n,
|
|
620
622
|
runId: r
|
|
621
623
|
});
|
|
622
|
-
},
|
|
623
|
-
id:
|
|
624
|
-
positionAt:
|
|
625
|
-
updatedAt:
|
|
626
|
-
}),
|
|
624
|
+
}, Ge = M("_voltro_workflow_watermarks", {
|
|
625
|
+
id: w({ prefix: "wfwm" }),
|
|
626
|
+
positionAt: P(),
|
|
627
|
+
updatedAt: P().default("now")
|
|
628
|
+
}), Ke = (e) => {
|
|
627
629
|
let t = e instanceof Error ? e.message : String(e);
|
|
628
630
|
return t.length > 400 ? `${t.slice(0, 400)}…` : t;
|
|
629
|
-
},
|
|
630
|
-
let t = [], n = [], r = [], i = /* @__PURE__ */ new Set(), a = /* @__PURE__ */ new Set(), o = e.payloadSchema === void 0 ? (e) =>
|
|
631
|
-
let n =
|
|
632
|
-
return
|
|
631
|
+
}, qe = (e) => {
|
|
632
|
+
let t = [], n = [], r = [], i = /* @__PURE__ */ new Set(), a = /* @__PURE__ */ new Set(), o = e.payloadSchema === void 0 ? (e) => h.right(e) : (t) => {
|
|
633
|
+
let n = y.decodeUnknownEither(e.payloadSchema)(t);
|
|
634
|
+
return h.isRight(n) ? h.right(n.right) : h.left(Ke(n.left));
|
|
633
635
|
}, s = e.runs.map((e) => ({
|
|
634
636
|
run: e,
|
|
635
637
|
decoded: o(e.payload)
|
|
@@ -639,19 +641,19 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
639
641
|
}));
|
|
640
642
|
for (let o of e.entries) for (let l of e.events) {
|
|
641
643
|
if (l.name !== o.event) continue;
|
|
642
|
-
let u =
|
|
643
|
-
if (
|
|
644
|
+
let u = y.decodeUnknownEither(o.schema)(l.payload);
|
|
645
|
+
if (h.isLeft(u)) {
|
|
644
646
|
r.push({
|
|
645
647
|
kind: "event-decode",
|
|
646
648
|
workflowName: e.workflowName,
|
|
647
649
|
event: o.event,
|
|
648
650
|
subject: l.id,
|
|
649
|
-
detail:
|
|
651
|
+
detail: Ke(u.left)
|
|
650
652
|
});
|
|
651
653
|
continue;
|
|
652
654
|
}
|
|
653
|
-
let
|
|
654
|
-
if (
|
|
655
|
+
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) => {
|
|
656
|
+
if (h.isLeft(t)) return r.push({
|
|
655
657
|
kind: "payload-decode",
|
|
656
658
|
workflowName: e.workflowName,
|
|
657
659
|
event: o.event,
|
|
@@ -659,25 +661,25 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
659
661
|
detail: t.left
|
|
660
662
|
}), !1;
|
|
661
663
|
try {
|
|
662
|
-
return o.match(
|
|
664
|
+
return o.match(d, t.right) === !0;
|
|
663
665
|
} catch (t) {
|
|
664
666
|
return r.push({
|
|
665
667
|
kind: "match-threw",
|
|
666
668
|
workflowName: e.workflowName,
|
|
667
669
|
event: o.event,
|
|
668
670
|
subject: n,
|
|
669
|
-
detail:
|
|
671
|
+
detail: Ke(t)
|
|
670
672
|
}), !1;
|
|
671
673
|
}
|
|
672
674
|
};
|
|
673
|
-
for (let { run: e, decoded: n } of s) i.has(e.runId) ||
|
|
675
|
+
for (let { run: e, decoded: n } of s) i.has(e.runId) || f(e.startedAt) && p(n, e.runId) && (i.add(e.runId), t.push({
|
|
674
676
|
runId: e.runId,
|
|
675
677
|
executionId: e.executionId,
|
|
676
678
|
reason: o.reason,
|
|
677
679
|
event: o.event,
|
|
678
680
|
eventId: l.id
|
|
679
681
|
}));
|
|
680
|
-
for (let { intent: e, decoded: t } of c) a.has(e.intentId) ||
|
|
682
|
+
for (let { intent: e, decoded: t } of c) a.has(e.intentId) || f(e.firstSeenAt) && p(t, e.intentId) && (a.add(e.intentId), n.push({
|
|
681
683
|
intentId: e.intentId,
|
|
682
684
|
reason: o.reason,
|
|
683
685
|
event: o.event,
|
|
@@ -689,26 +691,26 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
689
691
|
discards: n,
|
|
690
692
|
problems: r
|
|
691
693
|
};
|
|
692
|
-
},
|
|
694
|
+
}, Je = (e) => {
|
|
693
695
|
let t;
|
|
694
696
|
for (let n of e) (t === void 0 || n.occurredAt.getTime() > t.getTime()) && (t = n.occurredAt);
|
|
695
697
|
return t;
|
|
696
|
-
},
|
|
698
|
+
}, Ye = "_voltro_workflow_watermarks", Xe = "_voltro_workflow_events", K = "cancelOn", Ze = 3600 * 1e3, Qe = 500, q = (e) => {
|
|
697
699
|
if (e instanceof Date) return e;
|
|
698
700
|
if (typeof e == "number") return new Date(e);
|
|
699
701
|
if (typeof e == "string") {
|
|
700
702
|
let t = new Date(e);
|
|
701
703
|
if (!Number.isNaN(t.getTime())) return t;
|
|
702
704
|
}
|
|
703
|
-
}, J = (e) => e instanceof Error ? e.message : String(e),
|
|
704
|
-
table:
|
|
705
|
-
predicate:
|
|
705
|
+
}, J = (e) => e instanceof Error ? e.message : String(e), $e = async (e, t) => q((await e.query({
|
|
706
|
+
table: Ye,
|
|
707
|
+
predicate: x("id", t),
|
|
706
708
|
order: [],
|
|
707
709
|
take: 1,
|
|
708
710
|
skip: void 0,
|
|
709
711
|
projection: void 0
|
|
710
|
-
}))[0]?.positionAt),
|
|
711
|
-
await e.upsert(
|
|
712
|
+
}))[0]?.positionAt), et = async (e, t, n) => {
|
|
713
|
+
await e.upsert(Ye, {
|
|
712
714
|
id: t,
|
|
713
715
|
positionAt: n,
|
|
714
716
|
updatedAt: /* @__PURE__ */ new Date()
|
|
@@ -725,10 +727,10 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
725
727
|
};
|
|
726
728
|
}
|
|
727
729
|
});
|
|
728
|
-
},
|
|
730
|
+
}, tt = async (e, t, n) => {
|
|
729
731
|
let r = async (r) => e.query({
|
|
730
732
|
table: "_voltro_workflow_runs",
|
|
731
|
-
predicate:
|
|
733
|
+
predicate: b(x("tag", t), x("status", r)),
|
|
732
734
|
order: [{
|
|
733
735
|
column: "startedAt",
|
|
734
736
|
direction: "asc"
|
|
@@ -746,9 +748,9 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
746
748
|
startedAt: n
|
|
747
749
|
}];
|
|
748
750
|
});
|
|
749
|
-
},
|
|
751
|
+
}, nt = async (e, t, n) => (await e.query({
|
|
750
752
|
table: "_voltro_workflow_pending",
|
|
751
|
-
predicate:
|
|
753
|
+
predicate: x("workflowName", t),
|
|
752
754
|
order: [{
|
|
753
755
|
column: "firstSeenAt",
|
|
754
756
|
direction: "asc"
|
|
@@ -763,7 +765,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
763
765
|
payload: t.payload,
|
|
764
766
|
firstSeenAt: n
|
|
765
767
|
}];
|
|
766
|
-
}),
|
|
768
|
+
}), rt = async (e, t) => {
|
|
767
769
|
let n = t.workflows.filter((e) => e.entries.length > 0);
|
|
768
770
|
if (n.length === 0) return {
|
|
769
771
|
examined: !1,
|
|
@@ -778,9 +780,9 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
778
780
|
};
|
|
779
781
|
let r = e.now?.() ?? Date.now(), i = t.batch ?? 500, a = t.coldLookbackMs ?? 36e5, o = /* @__PURE__ */ new Set();
|
|
780
782
|
for (let e of n) for (let t of e.entries) o.add(t.event);
|
|
781
|
-
let s = await
|
|
782
|
-
table:
|
|
783
|
-
predicate:
|
|
783
|
+
let s = await $e(e.store, K), c = s ?? new Date(r - a), l = await e.store.query({
|
|
784
|
+
table: Xe,
|
|
785
|
+
predicate: te("occurredAt", c),
|
|
784
786
|
order: [{
|
|
785
787
|
column: "occurredAt",
|
|
786
788
|
direction: "asc"
|
|
@@ -804,7 +806,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
804
806
|
if (n.length === 0) continue;
|
|
805
807
|
let r = [], i = [];
|
|
806
808
|
try {
|
|
807
|
-
r = await
|
|
809
|
+
r = await tt(e.store, t.workflowName, _), i = await nt(e.store, t.workflowName, _), (r.length >= _ || i.length >= _) && (h = !0);
|
|
808
810
|
} catch (e) {
|
|
809
811
|
f.push({
|
|
810
812
|
subject: t.workflowName,
|
|
@@ -812,7 +814,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
812
814
|
}), g = !0;
|
|
813
815
|
continue;
|
|
814
816
|
}
|
|
815
|
-
let a =
|
|
817
|
+
let a = qe({
|
|
816
818
|
workflowName: t.workflowName,
|
|
817
819
|
entries: t.entries,
|
|
818
820
|
payloadSchema: t.payloadSchema,
|
|
@@ -854,10 +856,10 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
854
856
|
});
|
|
855
857
|
}
|
|
856
858
|
}
|
|
857
|
-
let v =
|
|
859
|
+
let v = Je(u), y = s;
|
|
858
860
|
if (g) e.log?.warn("workflow.cancelOn: holding the watermark — some workflows could not be evaluated", { failures: f.length });
|
|
859
861
|
else if (v !== void 0) try {
|
|
860
|
-
await
|
|
862
|
+
await et(e.store, K, v), y = v;
|
|
861
863
|
} catch (e) {
|
|
862
864
|
f.push({
|
|
863
865
|
subject: K,
|
|
@@ -865,7 +867,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
865
867
|
});
|
|
866
868
|
}
|
|
867
869
|
else if (s === void 0) try {
|
|
868
|
-
await
|
|
870
|
+
await et(e.store, K, c), y = c;
|
|
869
871
|
} catch (e) {
|
|
870
872
|
f.push({
|
|
871
873
|
subject: K,
|
|
@@ -886,7 +888,163 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
886
888
|
failures: f,
|
|
887
889
|
watermark: y
|
|
888
890
|
};
|
|
889
|
-
},
|
|
891
|
+
}, it = 1800 * 1e3, at = 200, ot = 20, Y = (e) => {
|
|
892
|
+
if (e instanceof Date) return e;
|
|
893
|
+
if (typeof e == "number") return new Date(e);
|
|
894
|
+
if (typeof e == "string") {
|
|
895
|
+
let t = new Date(e);
|
|
896
|
+
if (!Number.isNaN(t.getTime())) return t;
|
|
897
|
+
}
|
|
898
|
+
}, st = (e) => e instanceof Error ? e.message : String(e), ct = async (e, t, n) => (await e.query({
|
|
899
|
+
table: "_voltro_workflow_run_events",
|
|
900
|
+
predicate: x("runId", t),
|
|
901
|
+
order: [{
|
|
902
|
+
column: "occurredAt",
|
|
903
|
+
direction: "desc"
|
|
904
|
+
}],
|
|
905
|
+
take: n,
|
|
906
|
+
skip: void 0,
|
|
907
|
+
projection: void 0
|
|
908
|
+
})).flatMap((e) => {
|
|
909
|
+
let t = e, n = Y(t.occurredAt);
|
|
910
|
+
return typeof t.eventType != "string" || n === void 0 ? [] : [{
|
|
911
|
+
eventType: t.eventType,
|
|
912
|
+
occurredAt: n,
|
|
913
|
+
payload: t.payload
|
|
914
|
+
}];
|
|
915
|
+
}), lt = async (e, t) => {
|
|
916
|
+
let n = (await e.query({
|
|
917
|
+
table: "_voltro_workflow_run_steps",
|
|
918
|
+
predicate: x("runId", t),
|
|
919
|
+
order: [{
|
|
920
|
+
column: "startedAt",
|
|
921
|
+
direction: "desc"
|
|
922
|
+
}],
|
|
923
|
+
take: 1,
|
|
924
|
+
skip: void 0,
|
|
925
|
+
projection: void 0
|
|
926
|
+
}))[0];
|
|
927
|
+
if (n === void 0) return;
|
|
928
|
+
let r = Y(n.startedAt), i = Y(n.completedAt);
|
|
929
|
+
return r === void 0 ? i : i === void 0 ? r : i.getTime() > r.getTime() ? i : r;
|
|
930
|
+
}, ut = (e, t) => {
|
|
931
|
+
for (let n of e) {
|
|
932
|
+
if (n.eventType === "timer-fired") return !1;
|
|
933
|
+
if (n.eventType !== "timer-set") continue;
|
|
934
|
+
let e = Y(n.payload?.scheduledWakeAt);
|
|
935
|
+
return e !== void 0 && e.getTime() > t;
|
|
936
|
+
}
|
|
937
|
+
return !1;
|
|
938
|
+
}, dt = (e, t) => {
|
|
939
|
+
if (e !== "suspended") return "no-progress";
|
|
940
|
+
for (let e of t) {
|
|
941
|
+
if (e.eventType === "signal-received" || e.eventType === "signal-sent") return "suspended";
|
|
942
|
+
if (e.eventType === "signal-awaited") return "awaiting-signal";
|
|
943
|
+
}
|
|
944
|
+
return "suspended";
|
|
945
|
+
}, ft = async (e, t = {}) => {
|
|
946
|
+
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;
|
|
947
|
+
try {
|
|
948
|
+
d = await e.store.query({
|
|
949
|
+
table: "_voltro_workflow_runs",
|
|
950
|
+
predicate: b(ne("status", ["running", "suspended"]), O("startedAt", o)),
|
|
951
|
+
order: [{
|
|
952
|
+
column: "startedAt",
|
|
953
|
+
direction: "asc"
|
|
954
|
+
}],
|
|
955
|
+
take: i,
|
|
956
|
+
skip: void 0,
|
|
957
|
+
projection: void 0
|
|
958
|
+
});
|
|
959
|
+
} catch (e) {
|
|
960
|
+
return {
|
|
961
|
+
examined: 0,
|
|
962
|
+
stalled: [],
|
|
963
|
+
alreadyReported: 0,
|
|
964
|
+
waitingOnTimer: 0,
|
|
965
|
+
sawFullRunPage: !1,
|
|
966
|
+
failures: [{
|
|
967
|
+
subject: "_voltro_workflow_runs",
|
|
968
|
+
detail: st(e)
|
|
969
|
+
}]
|
|
970
|
+
};
|
|
971
|
+
}
|
|
972
|
+
for (let t of d) {
|
|
973
|
+
let i = t, o = Y(i.startedAt);
|
|
974
|
+
if (typeof i.id != "string" || typeof i.tag != "string" || typeof i.executionId != "string" || typeof i.status != "string" || o === void 0) continue;
|
|
975
|
+
let d, f;
|
|
976
|
+
try {
|
|
977
|
+
d = await ct(e.store, i.id, a), f = await lt(e.store, i.id);
|
|
978
|
+
} catch (e) {
|
|
979
|
+
s.push({
|
|
980
|
+
subject: i.id,
|
|
981
|
+
detail: st(e)
|
|
982
|
+
});
|
|
983
|
+
continue;
|
|
984
|
+
}
|
|
985
|
+
if (ut(d, n)) {
|
|
986
|
+
u += 1;
|
|
987
|
+
continue;
|
|
988
|
+
}
|
|
989
|
+
let p = d.find((e) => e.eventType !== "run-stalled")?.occurredAt, m = o;
|
|
990
|
+
for (let e of [f, p]) e !== void 0 && e.getTime() > m.getTime() && (m = e);
|
|
991
|
+
let h = n - m.getTime();
|
|
992
|
+
if (h < r) continue;
|
|
993
|
+
if (d.some((e) => e.eventType === "run-stalled" && e.occurredAt.getTime() > m.getTime())) {
|
|
994
|
+
l += 1;
|
|
995
|
+
continue;
|
|
996
|
+
}
|
|
997
|
+
let g = {
|
|
998
|
+
runId: i.id,
|
|
999
|
+
tag: i.tag,
|
|
1000
|
+
executionId: i.executionId,
|
|
1001
|
+
status: i.status,
|
|
1002
|
+
lastProgressAt: m,
|
|
1003
|
+
idleMs: h,
|
|
1004
|
+
reason: dt(i.status, d)
|
|
1005
|
+
};
|
|
1006
|
+
if (c.push(g), e.log?.warn("workflow.staleness: run has made no progress", {
|
|
1007
|
+
workflow: g.tag,
|
|
1008
|
+
runId: g.runId,
|
|
1009
|
+
idleMs: g.idleMs,
|
|
1010
|
+
reason: g.reason
|
|
1011
|
+
}), e.recordEvent !== void 0) try {
|
|
1012
|
+
await e.recordEvent({
|
|
1013
|
+
runId: g.runId,
|
|
1014
|
+
eventType: "run-stalled",
|
|
1015
|
+
payload: {
|
|
1016
|
+
idleMs: g.idleMs,
|
|
1017
|
+
stallAfterMs: r,
|
|
1018
|
+
lastProgressAt: g.lastProgressAt.toISOString(),
|
|
1019
|
+
reason: g.reason,
|
|
1020
|
+
tag: g.tag,
|
|
1021
|
+
executionId: g.executionId
|
|
1022
|
+
}
|
|
1023
|
+
});
|
|
1024
|
+
} catch (e) {
|
|
1025
|
+
s.push({
|
|
1026
|
+
subject: g.runId,
|
|
1027
|
+
detail: st(e)
|
|
1028
|
+
});
|
|
1029
|
+
}
|
|
1030
|
+
if (e.onStalled !== void 0) try {
|
|
1031
|
+
await e.onStalled(g);
|
|
1032
|
+
} catch (e) {
|
|
1033
|
+
s.push({
|
|
1034
|
+
subject: `${g.runId}:onStalled`,
|
|
1035
|
+
detail: st(e)
|
|
1036
|
+
});
|
|
1037
|
+
}
|
|
1038
|
+
}
|
|
1039
|
+
return {
|
|
1040
|
+
examined: d.length,
|
|
1041
|
+
stalled: c,
|
|
1042
|
+
alreadyReported: l,
|
|
1043
|
+
waitingOnTimer: u,
|
|
1044
|
+
sawFullRunPage: d.length >= i,
|
|
1045
|
+
failures: s
|
|
1046
|
+
};
|
|
1047
|
+
}, pt = {
|
|
890
1048
|
scanned: 0,
|
|
891
1049
|
admitted: 0,
|
|
892
1050
|
deferred: 0,
|
|
@@ -897,14 +1055,14 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
897
1055
|
failed: 0,
|
|
898
1056
|
timedOut: 0,
|
|
899
1057
|
examined: !1
|
|
900
|
-
},
|
|
1058
|
+
}, mt = 200, ht = async (e, t = {}) => {
|
|
901
1059
|
let n = e.now ?? (() => Date.now()), r = e.log, i = t.batchSize ?? 200, a, o, s;
|
|
902
1060
|
try {
|
|
903
|
-
a = await
|
|
904
|
-
let t = await
|
|
1061
|
+
a = await De(e.store);
|
|
1062
|
+
let t = await Ie(e.store, n(), i);
|
|
905
1063
|
o = t.due, s = t.nextDueAt;
|
|
906
1064
|
} catch (e) {
|
|
907
|
-
return r?.warn?.("workflow flow control: could not read the admission queue", { cause: String(e) }),
|
|
1065
|
+
return r?.warn?.("workflow flow control: could not read the admission queue", { cause: String(e) }), pt;
|
|
908
1066
|
}
|
|
909
1067
|
let c = {
|
|
910
1068
|
scanned: o.length,
|
|
@@ -926,16 +1084,16 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
926
1084
|
u.push(e);
|
|
927
1085
|
}
|
|
928
1086
|
for (let t of u) try {
|
|
929
|
-
await
|
|
1087
|
+
await gt(e, t, a, c, n());
|
|
930
1088
|
} catch (i) {
|
|
931
1089
|
c.failed++, r?.warn?.("workflow flow control: an intent failed to drain", {
|
|
932
1090
|
workflow: t.workflowName,
|
|
933
1091
|
intent: t.id,
|
|
934
1092
|
cause: String(i)
|
|
935
|
-
}), await
|
|
1093
|
+
}), await ze(e.store, t, String(i), n()).catch(() => {});
|
|
936
1094
|
}
|
|
937
1095
|
for (let t of l.values()) try {
|
|
938
|
-
await
|
|
1096
|
+
await _t(e, t, a, c, n());
|
|
939
1097
|
} catch (i) {
|
|
940
1098
|
c.failed++;
|
|
941
1099
|
let a = t[0];
|
|
@@ -943,14 +1101,14 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
943
1101
|
workflow: a?.workflowName,
|
|
944
1102
|
size: t.length,
|
|
945
1103
|
cause: String(i)
|
|
946
|
-
}), a !== void 0 && await
|
|
1104
|
+
}), a !== void 0 && await ze(e.store, a, String(i), n()).catch(() => {});
|
|
947
1105
|
}
|
|
948
|
-
return c.timedOut = await
|
|
1106
|
+
return c.timedOut = await yt(e, n()).catch(() => 0), {
|
|
949
1107
|
...c,
|
|
950
1108
|
examined: !0,
|
|
951
1109
|
...s === void 0 ? {} : { nextDueAt: s }
|
|
952
1110
|
};
|
|
953
|
-
},
|
|
1111
|
+
}, gt = async (e, t, n, r, i) => {
|
|
954
1112
|
let a = e.controls.get(t.workflowName);
|
|
955
1113
|
if (a === void 0) {
|
|
956
1114
|
await e.onAbandoned({
|
|
@@ -958,14 +1116,14 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
958
1116
|
payload: t.payload,
|
|
959
1117
|
callerContext: t.callerContext,
|
|
960
1118
|
reason: `workflow '${t.workflowName}' is no longer registered — it was renamed or removed while this start was waiting in the admission queue`
|
|
961
|
-
}), await
|
|
1119
|
+
}), await G(e.store, t.id), r.expired++;
|
|
962
1120
|
return;
|
|
963
1121
|
}
|
|
964
|
-
if (
|
|
965
|
-
await
|
|
1122
|
+
if (xe(a, t, i)) {
|
|
1123
|
+
await W({
|
|
966
1124
|
store: e.store,
|
|
967
1125
|
control: a,
|
|
968
|
-
keys:
|
|
1126
|
+
keys: I(a, t.payload),
|
|
969
1127
|
outcome: "expired",
|
|
970
1128
|
mode: t.mode,
|
|
971
1129
|
reason: `timeouts.start elapsed after ${i - t.firstSeenAt}ms`,
|
|
@@ -980,14 +1138,14 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
980
1138
|
payload: t.payload,
|
|
981
1139
|
callerContext: t.callerContext,
|
|
982
1140
|
reason: `timeouts.start (${a.timeouts?.startMs}ms) elapsed while this start waited in the admission queue; ${t.collapsed} start(s) had collapsed into it`
|
|
983
|
-
}), await
|
|
1141
|
+
}), await G(e.store, t.id), r.expired++;
|
|
984
1142
|
return;
|
|
985
1143
|
}
|
|
986
|
-
let o =
|
|
987
|
-
await
|
|
1144
|
+
let o = I(a, t.payload);
|
|
1145
|
+
await vt(e, {
|
|
988
1146
|
control: a,
|
|
989
1147
|
intent: t,
|
|
990
|
-
decision: await
|
|
1148
|
+
decision: await Be({
|
|
991
1149
|
store: e.store,
|
|
992
1150
|
control: a,
|
|
993
1151
|
keys: o,
|
|
@@ -1000,32 +1158,32 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1000
1158
|
now: i,
|
|
1001
1159
|
items: void 0
|
|
1002
1160
|
});
|
|
1003
|
-
},
|
|
1161
|
+
}, _t = async (e, t, n, r, i) => {
|
|
1004
1162
|
let a = t[0];
|
|
1005
1163
|
if (a === void 0) return;
|
|
1006
1164
|
let o = e.controls.get(a.workflowName);
|
|
1007
1165
|
if (o === void 0 || o.batch === void 0) {
|
|
1008
|
-
for (let n of t) await
|
|
1166
|
+
for (let n of t) await G(e.store, n.id);
|
|
1009
1167
|
r.expired += t.length;
|
|
1010
1168
|
return;
|
|
1011
1169
|
}
|
|
1012
1170
|
let s = [...t].sort((e, t) => e.firstSeenAt - t.firstSeenAt), c = s[0];
|
|
1013
|
-
if (
|
|
1171
|
+
if (xe(o, c, i)) {
|
|
1014
1172
|
await e.onAbandoned({
|
|
1015
1173
|
workflowName: a.workflowName,
|
|
1016
1174
|
payload: { items: s.map((e) => e.payload) },
|
|
1017
1175
|
callerContext: c.callerContext,
|
|
1018
1176
|
reason: `timeouts.start elapsed with ${s.length} item(s) accumulated in the batch`
|
|
1019
1177
|
});
|
|
1020
|
-
for (let t of s) await
|
|
1178
|
+
for (let t of s) await G(e.store, t.id);
|
|
1021
1179
|
r.expired += s.length;
|
|
1022
1180
|
return;
|
|
1023
1181
|
}
|
|
1024
|
-
let l =
|
|
1025
|
-
await
|
|
1182
|
+
let l = I(o, c.payload);
|
|
1183
|
+
await vt(e, {
|
|
1026
1184
|
control: o,
|
|
1027
1185
|
intent: c,
|
|
1028
|
-
decision: await
|
|
1186
|
+
decision: await Be({
|
|
1029
1187
|
store: e.store,
|
|
1030
1188
|
control: o,
|
|
1031
1189
|
keys: l,
|
|
@@ -1038,10 +1196,10 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1038
1196
|
now: i,
|
|
1039
1197
|
items: s
|
|
1040
1198
|
});
|
|
1041
|
-
},
|
|
1199
|
+
}, vt = async (e, t) => {
|
|
1042
1200
|
let { control: n, intent: r, decision: i, keys: a, counters: o, now: s, items: c } = t;
|
|
1043
1201
|
if (i.kind === "defer") {
|
|
1044
|
-
await
|
|
1202
|
+
await Me({
|
|
1045
1203
|
store: e.store,
|
|
1046
1204
|
control: n,
|
|
1047
1205
|
decision: i,
|
|
@@ -1054,7 +1212,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1054
1212
|
return;
|
|
1055
1213
|
}
|
|
1056
1214
|
if (i.kind === "drop") {
|
|
1057
|
-
await
|
|
1215
|
+
await W({
|
|
1058
1216
|
store: e.store,
|
|
1059
1217
|
control: n,
|
|
1060
1218
|
keys: a,
|
|
@@ -1068,12 +1226,12 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1068
1226
|
tenantId: r.tenantId,
|
|
1069
1227
|
now: s
|
|
1070
1228
|
});
|
|
1071
|
-
for (let t of c ?? [r]) await
|
|
1229
|
+
for (let t of c ?? [r]) await G(e.store, t.id);
|
|
1072
1230
|
o.dropped++;
|
|
1073
1231
|
return;
|
|
1074
1232
|
}
|
|
1075
1233
|
if (i.kind === "skip") {
|
|
1076
|
-
await
|
|
1234
|
+
await W({
|
|
1077
1235
|
store: e.store,
|
|
1078
1236
|
control: n,
|
|
1079
1237
|
keys: a,
|
|
@@ -1087,11 +1245,11 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1087
1245
|
tenantId: r.tenantId,
|
|
1088
1246
|
now: s
|
|
1089
1247
|
});
|
|
1090
|
-
for (let t of c ?? [r]) await
|
|
1248
|
+
for (let t of c ?? [r]) await G(e.store, t.id);
|
|
1091
1249
|
o.skipped++;
|
|
1092
1250
|
return;
|
|
1093
1251
|
}
|
|
1094
|
-
i.evict !== void 0 && (await e.cancelRun(n.workflowName, i.evict.executionId), await
|
|
1252
|
+
i.evict !== void 0 && (await e.cancelRun(n.workflowName, i.evict.executionId), await Pe(e.store, i.evict.executionId, s), await W({
|
|
1095
1253
|
store: e.store,
|
|
1096
1254
|
control: n,
|
|
1097
1255
|
keys: a,
|
|
@@ -1106,7 +1264,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1106
1264
|
now: s
|
|
1107
1265
|
}), o.evicted++);
|
|
1108
1266
|
let l = c === void 0 ? r.payload : { items: c.map((e) => e.payload) }, u = c === void 0 ? r.collapsed : c.reduce((e, t) => e + t.collapsed, 0), d = await e.startAdmitted(n.workflowName, l, r.callerContext);
|
|
1109
|
-
await
|
|
1267
|
+
await W({
|
|
1110
1268
|
store: e.store,
|
|
1111
1269
|
control: n,
|
|
1112
1270
|
keys: a,
|
|
@@ -1120,18 +1278,18 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1120
1278
|
tenantId: r.tenantId,
|
|
1121
1279
|
now: s
|
|
1122
1280
|
});
|
|
1123
|
-
for (let t of c ?? [r]) await
|
|
1281
|
+
for (let t of c ?? [r]) await G(e.store, t.id);
|
|
1124
1282
|
o.admitted++;
|
|
1125
|
-
},
|
|
1283
|
+
}, yt = async (e, t) => {
|
|
1126
1284
|
if (e.listRunningRuns === void 0) return 0;
|
|
1127
1285
|
let n = 0;
|
|
1128
1286
|
for (let r of e.controls.values()) {
|
|
1129
1287
|
if (r.timeouts?.finishMs === void 0) continue;
|
|
1130
1288
|
let i = await e.listRunningRuns(r.workflowName);
|
|
1131
|
-
for (let a of i)
|
|
1289
|
+
for (let a of i) Se(r, {
|
|
1132
1290
|
startedAt: a.startedAt,
|
|
1133
1291
|
terminal: !1
|
|
1134
|
-
}, t) && (await e.cancelRun(r.workflowName, a.executionId), await
|
|
1292
|
+
}, t) && (await e.cancelRun(r.workflowName, a.executionId), await Pe(e.store, a.executionId, t), await e.onAbandoned({
|
|
1135
1293
|
workflowName: r.workflowName,
|
|
1136
1294
|
payload: null,
|
|
1137
1295
|
callerContext: null,
|
|
@@ -1139,82 +1297,82 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1139
1297
|
}), n++);
|
|
1140
1298
|
}
|
|
1141
1299
|
return n;
|
|
1142
|
-
},
|
|
1300
|
+
}, bt = async (e, t) => {
|
|
1143
1301
|
if (e) try {
|
|
1144
1302
|
await e.recordEvent(t);
|
|
1145
1303
|
} catch {}
|
|
1146
|
-
},
|
|
1147
|
-
let
|
|
1148
|
-
let i =
|
|
1149
|
-
if (s === void 0) return yield*
|
|
1150
|
-
let
|
|
1151
|
-
yield*
|
|
1152
|
-
runId:
|
|
1304
|
+
}, xt = (t, r) => {
|
|
1305
|
+
let i = m.gen(function* () {
|
|
1306
|
+
let i = r.pollIntervalMs ?? 200, a = r.maxPollIntervalMs ?? 5e3, o = r.timeoutMs ?? 1440 * 6e4, s = yield* e, c = yield* m.serviceOption(n), l = c._tag === "Some" ? c.value : void 0;
|
|
1307
|
+
if (s === void 0) return yield* m.die(/* @__PURE__ */ Error("awaitSignal: no active workflow run id in scope"));
|
|
1308
|
+
let u = s;
|
|
1309
|
+
yield* m.promise(() => bt(l, {
|
|
1310
|
+
runId: u,
|
|
1153
1311
|
eventType: "signal-awaited",
|
|
1154
|
-
payload: { signalName:
|
|
1312
|
+
payload: { signalName: r.name }
|
|
1155
1313
|
}));
|
|
1156
|
-
let
|
|
1314
|
+
let d = Date.now(), f = i;
|
|
1157
1315
|
for (;;) {
|
|
1158
|
-
let
|
|
1159
|
-
if (
|
|
1160
|
-
let
|
|
1316
|
+
let e = Date.now() - d;
|
|
1317
|
+
if (e > o) return yield* m.die(/* @__PURE__ */ Error(`awaitSignal('${r.name}') timed out after ${e}ms`));
|
|
1318
|
+
let n = {
|
|
1161
1319
|
table: "_voltro_workflow_run_events",
|
|
1162
1320
|
order: [{
|
|
1163
1321
|
column: "occurredAt",
|
|
1164
1322
|
direction: "asc"
|
|
1165
1323
|
}],
|
|
1166
|
-
predicate:
|
|
1324
|
+
predicate: b(x("runId", u), x("eventType", "signal-sent")),
|
|
1167
1325
|
projection: void 0,
|
|
1168
1326
|
skip: void 0,
|
|
1169
1327
|
take: 1e3
|
|
1170
|
-
}, i = (yield*
|
|
1171
|
-
try: () =>
|
|
1328
|
+
}, i = (yield* m.tryPromise({
|
|
1329
|
+
try: () => t.store.query(n),
|
|
1172
1330
|
catch: (e) => e
|
|
1173
|
-
})).find((e) => e.payload?.signalName ===
|
|
1331
|
+
})).find((e) => e.payload?.signalName === r.name);
|
|
1174
1332
|
if (i !== void 0) {
|
|
1175
|
-
let e = yield*
|
|
1176
|
-
return yield*
|
|
1177
|
-
runId:
|
|
1333
|
+
let e = yield* y.decodeUnknown(r.schema)(i.payload?.value);
|
|
1334
|
+
return yield* m.promise(() => bt(l, {
|
|
1335
|
+
runId: u,
|
|
1178
1336
|
eventType: "signal-received",
|
|
1179
1337
|
payload: {
|
|
1180
|
-
signalName:
|
|
1338
|
+
signalName: r.name,
|
|
1181
1339
|
value: i.payload?.value
|
|
1182
1340
|
}
|
|
1183
1341
|
})), e;
|
|
1184
1342
|
}
|
|
1185
|
-
yield*
|
|
1343
|
+
yield* m.sleep(`${f} millis`), f = Math.min(f * 2, a);
|
|
1186
1344
|
}
|
|
1187
1345
|
});
|
|
1188
|
-
return
|
|
1189
|
-
name: `await-signal:${
|
|
1190
|
-
success:
|
|
1191
|
-
execute:
|
|
1346
|
+
return c.make({
|
|
1347
|
+
name: `await-signal:${r.name}`,
|
|
1348
|
+
success: r.schema,
|
|
1349
|
+
execute: i
|
|
1192
1350
|
});
|
|
1193
|
-
},
|
|
1351
|
+
}, St = async (e, t) => {
|
|
1194
1352
|
if (e !== void 0) try {
|
|
1195
1353
|
await e.recordEvent(t);
|
|
1196
1354
|
} catch {}
|
|
1197
|
-
},
|
|
1198
|
-
let
|
|
1199
|
-
let i =
|
|
1200
|
-
if (c === void 0) return yield*
|
|
1201
|
-
let
|
|
1202
|
-
yield*
|
|
1203
|
-
runId:
|
|
1355
|
+
}, Ct = (t, r) => {
|
|
1356
|
+
let i = m.gen(function* () {
|
|
1357
|
+
let i = r.pollIntervalMs ?? 200, a = r.maxPollIntervalMs ?? 5e3, o = r.timeoutMs ?? 1440 * 6e4, s = r.take ?? 500, c = yield* e, l = yield* m.serviceOption(n), u = l._tag === "Some" ? l.value : void 0;
|
|
1358
|
+
if (c === void 0) return yield* m.die(/* @__PURE__ */ Error("awaitEvent: no active workflow run id in scope"));
|
|
1359
|
+
let d = c, f = yield* r.since === "run-start" ? wt(t, d) : m.succeed(/* @__PURE__ */ new Date());
|
|
1360
|
+
yield* m.promise(() => St(u, {
|
|
1361
|
+
runId: d,
|
|
1204
1362
|
eventType: "event-awaited",
|
|
1205
1363
|
payload: {
|
|
1206
|
-
event:
|
|
1207
|
-
since:
|
|
1208
|
-
cutoff:
|
|
1364
|
+
event: r.event,
|
|
1365
|
+
since: r.since ?? "wait-start",
|
|
1366
|
+
cutoff: f.toISOString()
|
|
1209
1367
|
}
|
|
1210
1368
|
}));
|
|
1211
|
-
let
|
|
1369
|
+
let p = Date.now(), h = i, g = 0;
|
|
1212
1370
|
for (;;) {
|
|
1213
|
-
let
|
|
1214
|
-
if (
|
|
1215
|
-
let
|
|
1371
|
+
let e = Date.now() - p;
|
|
1372
|
+
if (e > o) return yield* m.die(/* @__PURE__ */ Error(`awaitEvent('${r.event}') timed out after ${e}ms having examined ${g} candidate event(s). ${g === 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."}`));
|
|
1373
|
+
let n = {
|
|
1216
1374
|
table: "_voltro_workflow_events",
|
|
1217
|
-
predicate:
|
|
1375
|
+
predicate: b(x("name", r.event), te("occurredAt", f)),
|
|
1218
1376
|
order: [{
|
|
1219
1377
|
column: "occurredAt",
|
|
1220
1378
|
direction: "asc"
|
|
@@ -1222,35 +1380,35 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1222
1380
|
take: s,
|
|
1223
1381
|
skip: void 0,
|
|
1224
1382
|
projection: void 0
|
|
1225
|
-
}, i = yield*
|
|
1226
|
-
try: () =>
|
|
1383
|
+
}, i = yield* m.tryPromise({
|
|
1384
|
+
try: () => t.store.query(n),
|
|
1227
1385
|
catch: (e) => e
|
|
1228
1386
|
});
|
|
1229
|
-
|
|
1387
|
+
g = i.length;
|
|
1230
1388
|
for (let e of i) {
|
|
1231
|
-
let t = yield*
|
|
1232
|
-
if (
|
|
1233
|
-
runId:
|
|
1389
|
+
let t = yield* y.decodeUnknown(r.schema)(e.payload);
|
|
1390
|
+
if (r.match(t)) return yield* m.promise(() => St(u, {
|
|
1391
|
+
runId: d,
|
|
1234
1392
|
eventType: "event-received",
|
|
1235
1393
|
payload: {
|
|
1236
|
-
event:
|
|
1394
|
+
event: r.event,
|
|
1237
1395
|
eventId: e.id
|
|
1238
1396
|
}
|
|
1239
1397
|
})), t;
|
|
1240
1398
|
}
|
|
1241
|
-
yield*
|
|
1399
|
+
yield* m.sleep(`${h} millis`), h = Math.min(h * 2, a);
|
|
1242
1400
|
}
|
|
1243
1401
|
});
|
|
1244
|
-
return
|
|
1245
|
-
name: `awaitEvent:${
|
|
1246
|
-
success:
|
|
1247
|
-
execute:
|
|
1402
|
+
return c.make({
|
|
1403
|
+
name: `awaitEvent:${r.event}`,
|
|
1404
|
+
success: r.schema,
|
|
1405
|
+
execute: i
|
|
1248
1406
|
});
|
|
1249
|
-
},
|
|
1250
|
-
let n = (yield*
|
|
1407
|
+
}, wt = (e, t) => m.gen(function* () {
|
|
1408
|
+
let n = (yield* m.tryPromise({
|
|
1251
1409
|
try: () => e.store.query({
|
|
1252
1410
|
table: "_voltro_workflow_runs",
|
|
1253
|
-
predicate:
|
|
1411
|
+
predicate: x("id", t),
|
|
1254
1412
|
order: [],
|
|
1255
1413
|
take: 1,
|
|
1256
1414
|
skip: void 0,
|
|
@@ -1264,16 +1422,16 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1264
1422
|
if (!Number.isNaN(e.getTime())) return e;
|
|
1265
1423
|
}
|
|
1266
1424
|
return /* @__PURE__ */ new Date(0);
|
|
1267
|
-
}),
|
|
1425
|
+
}), Tt = (e) => new Promise((t) => setTimeout(t, e)), Et = () => {
|
|
1268
1426
|
let e = globalThis.crypto;
|
|
1269
1427
|
return typeof e?.randomUUID == "function" ? e.randomUUID() : `${Date.now().toString(36)}${Math.random().toString(36).slice(2)}`;
|
|
1270
|
-
},
|
|
1428
|
+
}, Dt = () => `wfu_${Et()}`, Ot = async (e, t) => {
|
|
1271
1429
|
let n = t.id ?? t.executionId;
|
|
1272
1430
|
if (!n) throw Error("workflow message target requires target.id or target.executionId");
|
|
1273
1431
|
let r = await e.query({
|
|
1274
1432
|
table: "_voltro_workflow_runs",
|
|
1275
1433
|
order: [],
|
|
1276
|
-
predicate:
|
|
1434
|
+
predicate: x("id", n),
|
|
1277
1435
|
projection: void 0,
|
|
1278
1436
|
skip: void 0,
|
|
1279
1437
|
take: 1
|
|
@@ -1282,15 +1440,15 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1282
1440
|
let i = (await e.query({
|
|
1283
1441
|
table: "_voltro_workflow_runs",
|
|
1284
1442
|
order: [],
|
|
1285
|
-
predicate:
|
|
1443
|
+
predicate: x("executionId", n),
|
|
1286
1444
|
projection: void 0,
|
|
1287
1445
|
skip: void 0,
|
|
1288
1446
|
take: 1
|
|
1289
1447
|
}))[0];
|
|
1290
1448
|
if (!i) throw Error(`workflow message target not found: ${n}`);
|
|
1291
1449
|
return i;
|
|
1292
|
-
},
|
|
1293
|
-
let t = await
|
|
1450
|
+
}, kt = async (e) => {
|
|
1451
|
+
let t = await Ot(e.store, e.target);
|
|
1294
1452
|
return { eventId: (await e.recorder.recordEvent({
|
|
1295
1453
|
runId: t.id,
|
|
1296
1454
|
eventType: "signal-sent",
|
|
@@ -1299,8 +1457,8 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1299
1457
|
value: e.payload
|
|
1300
1458
|
}
|
|
1301
1459
|
})).id };
|
|
1302
|
-
},
|
|
1303
|
-
let t = await
|
|
1460
|
+
}, At = async (e) => {
|
|
1461
|
+
let t = await Ot(e.store, e.target), n = Dt(), r = await e.recorder.recordEvent({
|
|
1304
1462
|
runId: t.id,
|
|
1305
1463
|
eventType: "update-requested",
|
|
1306
1464
|
payload: {
|
|
@@ -1316,7 +1474,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1316
1474
|
column: "occurredAt",
|
|
1317
1475
|
direction: "asc"
|
|
1318
1476
|
}],
|
|
1319
|
-
predicate:
|
|
1477
|
+
predicate: x("runId", t.id),
|
|
1320
1478
|
projection: void 0,
|
|
1321
1479
|
skip: void 0,
|
|
1322
1480
|
take: 1e3
|
|
@@ -1337,133 +1495,281 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1337
1495
|
}), t;
|
|
1338
1496
|
}
|
|
1339
1497
|
if (Date.now() - i >= a) throw Error(`Timed out waiting for workflow update '${e.updateName}' (${n})`);
|
|
1340
|
-
await
|
|
1498
|
+
await Tt(o);
|
|
1341
1499
|
}
|
|
1342
|
-
},
|
|
1500
|
+
}, jt = 1440 * 6e4, Mt = "voltro/suspending-signal", Nt = (e, t) => `${Mt}/${e}/${t}`, Pt = (e) => u.make(e, { success: y.Unknown }), Ft = async (e, t) => {
|
|
1343
1501
|
if (e) try {
|
|
1344
1502
|
await e.recordEvent(t);
|
|
1345
1503
|
} catch {}
|
|
1346
|
-
},
|
|
1347
|
-
let
|
|
1348
|
-
|
|
1349
|
-
runId:
|
|
1504
|
+
}, It = (t, r) => m.gen(function* () {
|
|
1505
|
+
let t = r.timeoutMs ?? jt, i = Pt(Nt((yield* f.WorkflowInstance).workflow.name, r.name)), a = yield* e, o = yield* m.serviceOption(n), s = o._tag === "Some" ? o.value : void 0;
|
|
1506
|
+
a !== void 0 && (yield* m.promise(() => Ft(s, {
|
|
1507
|
+
runId: a,
|
|
1350
1508
|
eventType: "signal-awaited",
|
|
1351
|
-
payload: { signalName:
|
|
1509
|
+
payload: { signalName: r.name }
|
|
1352
1510
|
})));
|
|
1353
|
-
let
|
|
1354
|
-
name: `await-signal-timeout/${
|
|
1355
|
-
duration: `${
|
|
1356
|
-
}).pipe(
|
|
1357
|
-
return
|
|
1358
|
-
runId:
|
|
1511
|
+
let c = u.await(i), d = Number.isFinite(t) ? yield* m.race(c, l.sleep({
|
|
1512
|
+
name: `await-signal-timeout/${r.name}`,
|
|
1513
|
+
duration: `${t} millis`
|
|
1514
|
+
}).pipe(m.andThen(m.die(/* @__PURE__ */ Error(`awaitSignalSuspending('${r.name}') timed out after ${t}ms`))))) : yield* c, p = yield* y.decodeUnknown(r.schema)(d);
|
|
1515
|
+
return a !== void 0 && (yield* m.promise(() => Ft(s, {
|
|
1516
|
+
runId: a,
|
|
1359
1517
|
eventType: "signal-received",
|
|
1360
1518
|
payload: {
|
|
1361
|
-
signalName:
|
|
1362
|
-
value:
|
|
1519
|
+
signalName: r.name,
|
|
1520
|
+
value: p
|
|
1363
1521
|
}
|
|
1364
|
-
}))),
|
|
1365
|
-
}),
|
|
1522
|
+
}))), p;
|
|
1523
|
+
}), Lt = (e) => m.gen(function* () {
|
|
1366
1524
|
let t = e.target.executionId, n = e.target.workflowName;
|
|
1367
1525
|
if (t === void 0 || n === void 0) {
|
|
1368
1526
|
let r = e.store;
|
|
1369
|
-
if (r === void 0) return yield*
|
|
1370
|
-
let i = yield*
|
|
1371
|
-
try: () =>
|
|
1527
|
+
if (r === void 0) return yield* m.die(/* @__PURE__ */ Error("completeSuspendingSignal: provide a store, or target.executionId AND target.workflowName"));
|
|
1528
|
+
let i = yield* m.tryPromise({
|
|
1529
|
+
try: () => Ot(r, e.target),
|
|
1372
1530
|
catch: (e) => e
|
|
1373
1531
|
});
|
|
1374
1532
|
t ??= i.executionId, n ??= i.tag;
|
|
1375
1533
|
}
|
|
1376
1534
|
if (t === void 0 || n === void 0) return { completed: !1 };
|
|
1377
|
-
let r =
|
|
1535
|
+
let r = Nt(n, e.signalName), i = Pt(r), a = new u.TokenParsed({
|
|
1378
1536
|
workflowName: n,
|
|
1379
1537
|
executionId: t,
|
|
1380
1538
|
deferredName: r
|
|
1381
1539
|
}).asToken;
|
|
1382
|
-
return yield*
|
|
1540
|
+
return yield* u.done(i, {
|
|
1383
1541
|
token: a,
|
|
1384
|
-
exit:
|
|
1542
|
+
exit: g.succeed(e.payload)
|
|
1385
1543
|
}), { completed: !0 };
|
|
1386
|
-
}), X = async (e, t) => {
|
|
1544
|
+
}), X = "_voltro_budget_holds", Rt = "budget-hold", zt = (e) => `${Rt}:${e}`, Bt = (e) => `${e.executionId}/${e.stepName}/${e.budget}#${e.generation}`, Vt = async (e, t) => (await e.query({
|
|
1545
|
+
table: X,
|
|
1546
|
+
predicate: b(x("executionId", t.executionId), x("stepName", t.stepName), x("budget", t.budget)),
|
|
1547
|
+
order: []
|
|
1548
|
+
})).length, Ht = M(X, {
|
|
1549
|
+
id: w({ prefix: "bhd" }),
|
|
1550
|
+
holdKey: N().maxLength(191),
|
|
1551
|
+
budget: N(),
|
|
1552
|
+
tenantId: N().nullable(),
|
|
1553
|
+
executionId: N(),
|
|
1554
|
+
workflowName: N(),
|
|
1555
|
+
signalName: N(),
|
|
1556
|
+
stepName: N(),
|
|
1557
|
+
spentMicroUsd: N().nullable(),
|
|
1558
|
+
limitMicroUsd: N().nullable(),
|
|
1559
|
+
heldAt: P().default("now"),
|
|
1560
|
+
releasedAt: P().nullable(),
|
|
1561
|
+
outcome: N().nullable()
|
|
1562
|
+
}).index(["budget", "releasedAt"]), Ut = () => {
|
|
1563
|
+
re({
|
|
1564
|
+
source: "framework",
|
|
1565
|
+
table: X,
|
|
1566
|
+
timeColumn: "releasedAt",
|
|
1567
|
+
ttlMs: ie(process.env.VOLTRO_BUDGET_HOLDS_TTL_HOURS, 720)
|
|
1568
|
+
});
|
|
1569
|
+
}, Wt = class extends Error {
|
|
1570
|
+
budget;
|
|
1571
|
+
holdKey;
|
|
1572
|
+
constructor(e, t, n) {
|
|
1573
|
+
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;
|
|
1574
|
+
}
|
|
1575
|
+
}, Gt = 10080 * 6e4, Kt = (e) => m.gen(function* () {
|
|
1576
|
+
Ut();
|
|
1577
|
+
let t = e.timeoutMs ?? 6048e5, n = e.recheckEveryMs ?? 9e5, r = {
|
|
1578
|
+
executionId: e.executionId,
|
|
1579
|
+
stepName: e.stepName,
|
|
1580
|
+
budget: e.budget
|
|
1581
|
+
};
|
|
1582
|
+
for (;;) {
|
|
1583
|
+
let i = yield* m.promise(() => Jt(e.store, r)), a = i.length, o = i.length === 0 ? Date.now() : qt(i[0]?.heldAt), s = Number.isFinite(t) ? t - (Date.now() - o) : Infinity, c = Bt({
|
|
1584
|
+
...r,
|
|
1585
|
+
generation: a
|
|
1586
|
+
});
|
|
1587
|
+
if (s <= 0) return yield* m.promise(() => Yt(e.store, r, "expired")), yield* m.fail(new Wt(e.budget, c, t));
|
|
1588
|
+
let l = zt(c);
|
|
1589
|
+
yield* m.promise(() => e.store.insertIgnore(X, {
|
|
1590
|
+
id: S({
|
|
1591
|
+
kind: "typeid",
|
|
1592
|
+
prefix: "bhd"
|
|
1593
|
+
}, X),
|
|
1594
|
+
holdKey: c,
|
|
1595
|
+
budget: e.budget,
|
|
1596
|
+
tenantId: e.tenantId,
|
|
1597
|
+
executionId: e.executionId,
|
|
1598
|
+
workflowName: e.workflowName,
|
|
1599
|
+
signalName: l,
|
|
1600
|
+
stepName: e.stepName,
|
|
1601
|
+
spentMicroUsd: e.spentMicroUsd === void 0 ? null : String(Math.round(e.spentMicroUsd)),
|
|
1602
|
+
limitMicroUsd: e.limitMicroUsd === void 0 ? null : String(Math.round(e.limitMicroUsd)),
|
|
1603
|
+
heldAt: /* @__PURE__ */ new Date(),
|
|
1604
|
+
releasedAt: null,
|
|
1605
|
+
outcome: null
|
|
1606
|
+
}, { conflictColumns: ["holdKey"] }));
|
|
1607
|
+
let u = Math.min(n, s);
|
|
1608
|
+
if (yield* It({ store: e.store }, {
|
|
1609
|
+
name: l,
|
|
1610
|
+
schema: y.Unknown,
|
|
1611
|
+
timeoutMs: u
|
|
1612
|
+
}).pipe(m.catchAllCause((e) => p.isInterruptedOnly(e) ? m.failCause(e) : m.void)), yield* m.promise(() => e.store.updateMany(X, {
|
|
1613
|
+
releasedAt: /* @__PURE__ */ new Date(),
|
|
1614
|
+
outcome: "recheck"
|
|
1615
|
+
}, { where: b(x("holdKey", c), E("releasedAt")) })), yield* e.hasHeadroom) return;
|
|
1616
|
+
}
|
|
1617
|
+
}), qt = (e) => e instanceof Date ? e.getTime() : typeof e == "string" ? Date.parse(e) : Date.now(), Jt = async (e, t) => [...await e.query({
|
|
1618
|
+
table: X,
|
|
1619
|
+
predicate: b(x("executionId", t.executionId), x("stepName", t.stepName), x("budget", t.budget)),
|
|
1620
|
+
order: []
|
|
1621
|
+
})].sort((e, t) => String(e.id).localeCompare(String(t.id))), Yt = async (e, t, n) => {
|
|
1622
|
+
await e.updateMany(X, {
|
|
1623
|
+
releasedAt: /* @__PURE__ */ new Date(),
|
|
1624
|
+
outcome: n
|
|
1625
|
+
}, { where: b(x("executionId", t.executionId), x("stepName", t.stepName), x("budget", t.budget), E("releasedAt")) });
|
|
1626
|
+
}, Xt = (e) => m.gen(function* () {
|
|
1627
|
+
let t = e.tenantId === void 0 ? b(x("budget", e.budget), E("releasedAt")) : b(x("budget", e.budget), x("tenantId", e.tenantId), E("releasedAt")), n = yield* m.promise(() => e.store.query({
|
|
1628
|
+
table: X,
|
|
1629
|
+
predicate: t,
|
|
1630
|
+
order: []
|
|
1631
|
+
})), r = 0;
|
|
1632
|
+
for (let t of n) (yield* m.promise(() => e.store.updateMany("_voltro_budget_holds", {
|
|
1633
|
+
releasedAt: /* @__PURE__ */ new Date(),
|
|
1634
|
+
outcome: e.outcome ?? "released"
|
|
1635
|
+
}, { where: b(x("id", String(t.id)), E("releasedAt")) }))) === 1 && (yield* Lt({
|
|
1636
|
+
target: {
|
|
1637
|
+
executionId: String(t.executionId),
|
|
1638
|
+
workflowName: String(t.workflowName)
|
|
1639
|
+
},
|
|
1640
|
+
signalName: String(t.signalName),
|
|
1641
|
+
payload: {
|
|
1642
|
+
released: !0,
|
|
1643
|
+
budget: e.budget
|
|
1644
|
+
}
|
|
1645
|
+
}).pipe(m.catchAll(() => m.succeed({ completed: !1 }))), r += 1);
|
|
1646
|
+
return { released: r };
|
|
1647
|
+
}), Zt = async (e, t) => {
|
|
1648
|
+
let n = t?.budget === void 0 ? E("releasedAt") : b(x("budget", t.budget), E("releasedAt"));
|
|
1649
|
+
return (await e.query({
|
|
1650
|
+
table: X,
|
|
1651
|
+
predicate: n,
|
|
1652
|
+
order: []
|
|
1653
|
+
})).map((e) => ({
|
|
1654
|
+
id: String(e.id),
|
|
1655
|
+
holdKey: String(e.holdKey),
|
|
1656
|
+
budget: String(e.budget),
|
|
1657
|
+
tenantId: e.tenantId ?? null,
|
|
1658
|
+
executionId: String(e.executionId),
|
|
1659
|
+
workflowName: String(e.workflowName),
|
|
1660
|
+
stepName: String(e.stepName),
|
|
1661
|
+
heldAt: e.heldAt instanceof Date ? e.heldAt.toISOString() : String(e.heldAt ?? "")
|
|
1662
|
+
}));
|
|
1663
|
+
}, Qt = async (e) => {
|
|
1664
|
+
let t = await Zt(e), n = /* @__PURE__ */ new Map();
|
|
1665
|
+
for (let e of t) {
|
|
1666
|
+
let t = `${e.budget}\u0000${e.tenantId ?? ""}`;
|
|
1667
|
+
n.has(t) || n.set(t, {
|
|
1668
|
+
budget: e.budget,
|
|
1669
|
+
tenantId: e.tenantId
|
|
1670
|
+
});
|
|
1671
|
+
}
|
|
1672
|
+
return [...n.values()];
|
|
1673
|
+
}, $t = async (e, t) => {
|
|
1387
1674
|
if (e) try {
|
|
1388
1675
|
await e.recordEvent(t);
|
|
1389
1676
|
} catch {}
|
|
1390
|
-
},
|
|
1391
|
-
let t =
|
|
1677
|
+
}, en = (e) => {
|
|
1678
|
+
let t = p.failureOption(e), n = Array.from(p.defects(e)), r = t._tag === "Some" ? t.value : n[0] ?? p.squash(e);
|
|
1392
1679
|
return {
|
|
1393
1680
|
errorTag: r && typeof r == "object" && "_tag" in r ? String(r._tag) : null,
|
|
1394
1681
|
errorMessage: r?.message ?? String(r)
|
|
1395
1682
|
};
|
|
1396
|
-
},
|
|
1397
|
-
let
|
|
1398
|
-
let i =
|
|
1399
|
-
if (s === void 0) return yield*
|
|
1400
|
-
let
|
|
1683
|
+
}, tn = (t, r) => {
|
|
1684
|
+
let i = m.gen(function* () {
|
|
1685
|
+
let i = r.pollIntervalMs ?? 200, a = r.maxPollIntervalMs ?? 5e3, o = r.timeoutMs ?? 3e4, s = yield* e, c = yield* m.serviceOption(n), l = c._tag === "Some" ? c.value : void 0;
|
|
1686
|
+
if (s === void 0) return yield* m.die(/* @__PURE__ */ Error("awaitUpdate: no active workflow run id in scope"));
|
|
1687
|
+
let u = s, d = Date.now(), f = i;
|
|
1401
1688
|
for (;;) {
|
|
1402
|
-
let
|
|
1403
|
-
if (
|
|
1404
|
-
let
|
|
1689
|
+
let e = Date.now() - d;
|
|
1690
|
+
if (e > o) return yield* m.die(/* @__PURE__ */ Error(`awaitUpdate('${r.name}') timed out after ${e}ms`));
|
|
1691
|
+
let n = {
|
|
1405
1692
|
table: "_voltro_workflow_run_events",
|
|
1406
1693
|
order: [{
|
|
1407
1694
|
column: "occurredAt",
|
|
1408
1695
|
direction: "asc"
|
|
1409
1696
|
}],
|
|
1410
|
-
predicate:
|
|
1697
|
+
predicate: x("runId", u),
|
|
1411
1698
|
projection: void 0,
|
|
1412
1699
|
skip: void 0,
|
|
1413
1700
|
take: 1e3
|
|
1414
|
-
}, i = yield*
|
|
1415
|
-
try: () =>
|
|
1701
|
+
}, i = yield* m.tryPromise({
|
|
1702
|
+
try: () => t.store.query(n),
|
|
1416
1703
|
catch: (e) => e
|
|
1417
|
-
}), s = new Set(i.filter((e) => e.eventType === "update-completed" || e.eventType === "update-failed").map((e) => e.payload?.updateId).filter((e) => typeof e == "string" && e.length > 0)), c = i.find((e) => e.eventType === "update-requested" && e.payload?.updateName ===
|
|
1704
|
+
}), s = new Set(i.filter((e) => e.eventType === "update-completed" || e.eventType === "update-failed").map((e) => e.payload?.updateId).filter((e) => typeof e == "string" && e.length > 0)), c = i.find((e) => e.eventType === "update-requested" && e.payload?.updateName === r.name && typeof e.payload.updateId == "string" && !s.has(e.payload.updateId));
|
|
1418
1705
|
if (c !== void 0) {
|
|
1419
1706
|
let e = c.payload.updateId;
|
|
1420
|
-
yield*
|
|
1421
|
-
runId:
|
|
1707
|
+
yield* m.promise(() => $t(l, {
|
|
1708
|
+
runId: u,
|
|
1422
1709
|
eventType: "update-received",
|
|
1423
1710
|
payload: {
|
|
1424
1711
|
updateId: e,
|
|
1425
|
-
updateName:
|
|
1712
|
+
updateName: r.name
|
|
1426
1713
|
}
|
|
1427
1714
|
}));
|
|
1428
|
-
let t = yield*
|
|
1429
|
-
runId:
|
|
1715
|
+
let t = yield* y.decodeUnknown(r.schema)(c.payload?.value).pipe(m.tapErrorCause((t) => m.promise(() => $t(l, {
|
|
1716
|
+
runId: u,
|
|
1430
1717
|
eventType: "update-failed",
|
|
1431
1718
|
payload: {
|
|
1432
1719
|
updateId: e,
|
|
1433
|
-
updateName:
|
|
1434
|
-
...
|
|
1720
|
+
updateName: r.name,
|
|
1721
|
+
...en(t)
|
|
1435
1722
|
}
|
|
1436
|
-
})))),
|
|
1437
|
-
runId:
|
|
1723
|
+
})))), n = yield* (r.handle ? r.handle(t) : m.succeed(t)).pipe(m.flatMap((e) => r.success ? y.decodeUnknown(r.success)(e) : m.succeed(e))).pipe(m.tapErrorCause((t) => m.promise(() => $t(l, {
|
|
1724
|
+
runId: u,
|
|
1438
1725
|
eventType: "update-failed",
|
|
1439
1726
|
payload: {
|
|
1440
1727
|
updateId: e,
|
|
1441
|
-
updateName:
|
|
1442
|
-
...
|
|
1728
|
+
updateName: r.name,
|
|
1729
|
+
...en(t)
|
|
1443
1730
|
}
|
|
1444
1731
|
}))));
|
|
1445
|
-
return yield*
|
|
1446
|
-
runId:
|
|
1732
|
+
return yield* m.promise(() => $t(l, {
|
|
1733
|
+
runId: u,
|
|
1447
1734
|
eventType: "update-completed",
|
|
1448
1735
|
payload: {
|
|
1449
1736
|
updateId: e,
|
|
1450
|
-
updateName:
|
|
1451
|
-
result:
|
|
1737
|
+
updateName: r.name,
|
|
1738
|
+
result: n
|
|
1452
1739
|
}
|
|
1453
|
-
})),
|
|
1740
|
+
})), n;
|
|
1454
1741
|
}
|
|
1455
|
-
yield*
|
|
1742
|
+
yield* m.sleep(`${f} millis`), f = Math.min(f * 2, a);
|
|
1456
1743
|
}
|
|
1457
1744
|
});
|
|
1458
|
-
return
|
|
1459
|
-
name: `await-update:${
|
|
1460
|
-
success:
|
|
1461
|
-
execute:
|
|
1745
|
+
return c.make({
|
|
1746
|
+
name: `await-update:${r.name}`,
|
|
1747
|
+
success: r.success ?? r.schema,
|
|
1748
|
+
execute: i
|
|
1462
1749
|
});
|
|
1463
|
-
},
|
|
1750
|
+
}, nn = 8 * 1024, rn = 3, an = 2e3, on = () => {
|
|
1751
|
+
let e = (e) => {
|
|
1752
|
+
if (e === void 0) return;
|
|
1753
|
+
let t = Number(e);
|
|
1754
|
+
return Number.isFinite(t) && t > 0 ? Math.floor(t) : void 0;
|
|
1755
|
+
}, t = e(process.env.VOLTRO_WORKFLOW_MAX_RECLAIMS), n = e(process.env.VOLTRO_WORKFLOW_REPLAY_SHAPE_LIMIT);
|
|
1756
|
+
return {
|
|
1757
|
+
...t === void 0 ? {} : { maxRunReclaims: t },
|
|
1758
|
+
...n === void 0 ? {} : { replayShapeLimit: n }
|
|
1759
|
+
};
|
|
1760
|
+
}, sn = (e) => {
|
|
1761
|
+
let t = typeof e == "string" ? (() => {
|
|
1762
|
+
try {
|
|
1763
|
+
return JSON.parse(e);
|
|
1764
|
+
} catch {
|
|
1765
|
+
return;
|
|
1766
|
+
}
|
|
1767
|
+
})() : e;
|
|
1768
|
+
if (Array.isArray(t)) return t.filter((e) => typeof e == "string");
|
|
1769
|
+
}, cn = () => {
|
|
1464
1770
|
let e = globalThis.crypto;
|
|
1465
1771
|
return typeof e?.randomUUID == "function" ? e.randomUUID() : `${Date.now().toString(36)}${Math.random().toString(36).slice(2)}`;
|
|
1466
|
-
},
|
|
1772
|
+
}, ln = (e) => `${e}_${cn()}`, Z = (e, t = nn) => {
|
|
1467
1773
|
if (e == null) return e;
|
|
1468
1774
|
try {
|
|
1469
1775
|
let n = JSON.stringify(e);
|
|
@@ -1479,8 +1785,8 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1479
1785
|
let t = {};
|
|
1480
1786
|
for (let [n, r] of Object.entries(e)) t[n] = r instanceof Date ? r.toISOString() : r;
|
|
1481
1787
|
return t;
|
|
1482
|
-
},
|
|
1483
|
-
let t = e.truncateBytes ??
|
|
1788
|
+
}, un = (e) => {
|
|
1789
|
+
let t = e.truncateBytes ?? nn, n = e.makeId ?? ln, r = (t, n) => e.log?.warn(t, n), i = e.encryptStepPayload ?? ((e) => e), a = e.emit;
|
|
1484
1790
|
return {
|
|
1485
1791
|
startStep: async ({ runId: o, stepName: s, attempt: c, stepInput: l, retryPolicy: u }) => {
|
|
1486
1792
|
try {
|
|
@@ -1583,8 +1889,38 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1583
1889
|
return { id: l };
|
|
1584
1890
|
}
|
|
1585
1891
|
};
|
|
1586
|
-
},
|
|
1587
|
-
let
|
|
1892
|
+
}, dn = (e, t, n) => m.gen(function* () {
|
|
1893
|
+
let r = e.store.query;
|
|
1894
|
+
if (r === void 0) return;
|
|
1895
|
+
let a = e.replayShapeLimit ?? 2e3, o = yield* m.promise(() => r({
|
|
1896
|
+
table: "_voltro_workflow_run_steps",
|
|
1897
|
+
order: [{
|
|
1898
|
+
column: "startedAt",
|
|
1899
|
+
direction: "asc"
|
|
1900
|
+
}],
|
|
1901
|
+
predicate: x("runId", t),
|
|
1902
|
+
projection: ["stepName"],
|
|
1903
|
+
skip: void 0,
|
|
1904
|
+
take: a + 1
|
|
1905
|
+
}).catch((e) => (n("failed to read the replay shape (nondeterminism tripwire disabled for this attempt)", {
|
|
1906
|
+
runId: t,
|
|
1907
|
+
reason: e?.message ?? String(e)
|
|
1908
|
+
}), [])));
|
|
1909
|
+
if (o.length === 0) return;
|
|
1910
|
+
if (o.length > a) {
|
|
1911
|
+
n("replay shape exceeds the step limit — nondeterminism tripwire disabled for this run", {
|
|
1912
|
+
runId: t,
|
|
1913
|
+
limit: a
|
|
1914
|
+
});
|
|
1915
|
+
return;
|
|
1916
|
+
}
|
|
1917
|
+
let s = o.flatMap((e) => {
|
|
1918
|
+
let t = e.stepName;
|
|
1919
|
+
return typeof t == "string" ? [{ stepName: t }] : [];
|
|
1920
|
+
});
|
|
1921
|
+
return s.length === 0 ? void 0 : i(s);
|
|
1922
|
+
}), fn = (i, c) => {
|
|
1923
|
+
let l = i.truncateBytes ?? nn, u = i.makeId ?? ln, f = i.recorder ?? un(i), h = (e, t) => i.log?.warn(e, t), v = i.emit, y = (e, t, n) => m.promise(async () => {
|
|
1588
1924
|
if (i.onParentClose) try {
|
|
1589
1925
|
await i.onParentClose({
|
|
1590
1926
|
workflowName: i.name,
|
|
@@ -1593,14 +1929,14 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1593
1929
|
status: t
|
|
1594
1930
|
});
|
|
1595
1931
|
} catch (n) {
|
|
1596
|
-
|
|
1932
|
+
h("failed to apply workflow parent-close policy", {
|
|
1597
1933
|
tag: i.name,
|
|
1598
1934
|
executionId: e,
|
|
1599
1935
|
status: t,
|
|
1600
1936
|
reason: n?.message ?? String(n)
|
|
1601
1937
|
});
|
|
1602
1938
|
}
|
|
1603
|
-
}),
|
|
1939
|
+
}), b = (e, t, n) => m.promise(async () => {
|
|
1604
1940
|
if (i.onTerminal) try {
|
|
1605
1941
|
await i.onTerminal({
|
|
1606
1942
|
workflowName: i.name,
|
|
@@ -1609,7 +1945,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1609
1945
|
status: t
|
|
1610
1946
|
});
|
|
1611
1947
|
} catch (n) {
|
|
1612
|
-
|
|
1948
|
+
h("failed to release the workflow admission lease", {
|
|
1613
1949
|
tag: i.name,
|
|
1614
1950
|
executionId: e,
|
|
1615
1951
|
status: t,
|
|
@@ -1617,33 +1953,34 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1617
1953
|
});
|
|
1618
1954
|
}
|
|
1619
1955
|
});
|
|
1620
|
-
return (
|
|
1621
|
-
let
|
|
1622
|
-
let n =
|
|
1623
|
-
|
|
1956
|
+
return (ee, S) => m.gen(function* () {
|
|
1957
|
+
let C = Date.now(), te = yield* _.get(r), w = i.parentExecutionId ?? te ?? null, ne = i.parentClosePolicy ?? null, T, E = (e, t) => t.pipe(m.catchAllCause((t) => p.isInterrupted(t) ? m.failCause(t) : m.sync(() => {
|
|
1958
|
+
let n = p.squash(t);
|
|
1959
|
+
h(e, {
|
|
1624
1960
|
tag: i.name,
|
|
1625
|
-
executionId:
|
|
1961
|
+
executionId: S,
|
|
1626
1962
|
reason: n?.message ?? String(n)
|
|
1627
1963
|
});
|
|
1628
|
-
}))), D = (i.store.query ? yield*
|
|
1964
|
+
}))), D = (i.store.query ? yield* m.promise(() => i.store.query({
|
|
1629
1965
|
table: "_voltro_workflow_runs",
|
|
1630
1966
|
order: [],
|
|
1631
|
-
predicate:
|
|
1967
|
+
predicate: x("executionId", S),
|
|
1632
1968
|
projection: void 0,
|
|
1633
1969
|
skip: void 0,
|
|
1634
1970
|
take: 1
|
|
1635
1971
|
})) : [])[0], O = D?.workflowVersion ?? null;
|
|
1636
1972
|
if (D?.id !== void 0 && O !== null && i.workflowCompatibleVersions !== void 0 && i.workflowCompatibleVersions !== null && !i.workflowCompatibleVersions.includes(O)) {
|
|
1637
|
-
let e = `Workflow '${i.name}' run '${
|
|
1973
|
+
let e = `Workflow '${i.name}' run '${S}' was started on version ${O}, but current code is compatible with ${i.workflowCompatibleVersions.join(", ")}`, t = yield* m.promise(() => i.store.update("_voltro_workflow_runs", D.id, {
|
|
1638
1974
|
status: "failed",
|
|
1639
1975
|
errorTag: "WorkflowVersionIncompatible",
|
|
1640
1976
|
errorMessage: e,
|
|
1641
|
-
completedAt: /* @__PURE__ */ new Date()
|
|
1977
|
+
completedAt: /* @__PURE__ */ new Date(),
|
|
1978
|
+
runnerEnteredAt: null
|
|
1642
1979
|
}));
|
|
1643
|
-
return t &&
|
|
1980
|
+
return t && v?.("workflowRuns", {
|
|
1644
1981
|
op: "update",
|
|
1645
1982
|
row: Q(t)
|
|
1646
|
-
}), yield*
|
|
1983
|
+
}), yield* m.promise(() => f.recordEvent({
|
|
1647
1984
|
runId: D.id,
|
|
1648
1985
|
eventType: "run-failed",
|
|
1649
1986
|
payload: {
|
|
@@ -1653,19 +1990,78 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1653
1990
|
compatibleWith: i.workflowCompatibleVersions,
|
|
1654
1991
|
previousVersion: O
|
|
1655
1992
|
}
|
|
1656
|
-
})), yield*
|
|
1993
|
+
})), yield* m.sync(() => i.recordRun?.({
|
|
1657
1994
|
name: i.name,
|
|
1658
1995
|
status: "failed",
|
|
1659
1996
|
durationMs: 0
|
|
1660
|
-
})), yield*
|
|
1997
|
+
})), yield* m.fail(Error(e));
|
|
1661
1998
|
}
|
|
1662
|
-
|
|
1663
|
-
|
|
1664
|
-
|
|
1999
|
+
let k = i.workflowPatches ?? [], A;
|
|
2000
|
+
if (D?.id !== void 0) {
|
|
2001
|
+
T = D.id, k = sn(D.workflowPatches) ?? k;
|
|
2002
|
+
let e = D.runnerEnteredAt !== null && D.runnerEnteredAt !== void 0, t = typeof D.reclaimCount == "number" ? D.reclaimCount : Number(D.reclaimCount ?? 0), n = e ? (Number.isFinite(t) ? t : 0) + 1 : 0, r = i.maxRunReclaims ?? 3;
|
|
2003
|
+
if (e && n >= r) {
|
|
2004
|
+
let e = `Workflow '${i.name}' run '${S}' killed its runner ${n} times in a row; parked instead of reclaimed again (maxRunReclaims=${r}).`;
|
|
2005
|
+
yield* E("failed to record workflow crash-loop park", m.gen(function* () {
|
|
2006
|
+
let t = yield* m.promise(() => i.store.update("_voltro_workflow_runs", T, {
|
|
2007
|
+
status: "suspended",
|
|
2008
|
+
errorTag: "WorkflowCrashLooped",
|
|
2009
|
+
errorMessage: e,
|
|
2010
|
+
reclaimCount: n,
|
|
2011
|
+
runnerEnteredAt: null
|
|
2012
|
+
}));
|
|
2013
|
+
t && v?.("workflowRuns", {
|
|
2014
|
+
op: "update",
|
|
2015
|
+
row: Q(t)
|
|
2016
|
+
}), yield* m.promise(() => f.recordEvent({
|
|
2017
|
+
runId: T,
|
|
2018
|
+
eventType: "run-crashlooped",
|
|
2019
|
+
payload: {
|
|
2020
|
+
reclaimCount: n,
|
|
2021
|
+
maxRunReclaims: r,
|
|
2022
|
+
executionId: S,
|
|
2023
|
+
tag: i.name
|
|
2024
|
+
}
|
|
2025
|
+
}));
|
|
2026
|
+
})), h("workflow run parked after repeated runner deaths", {
|
|
2027
|
+
tag: i.name,
|
|
2028
|
+
executionId: S,
|
|
2029
|
+
runId: T,
|
|
2030
|
+
reclaimCount: n,
|
|
2031
|
+
maxRunReclaims: r
|
|
2032
|
+
});
|
|
2033
|
+
let t = yield* oe;
|
|
2034
|
+
return yield* d.suspend(t);
|
|
2035
|
+
}
|
|
2036
|
+
A = yield* dn(i, T, h), yield* E("failed to record workflow re-entry", m.gen(function* () {
|
|
2037
|
+
let t = yield* m.promise(() => i.store.update("_voltro_workflow_runs", T, {
|
|
2038
|
+
status: "running",
|
|
2039
|
+
errorTag: null,
|
|
2040
|
+
errorMessage: null,
|
|
2041
|
+
completedAt: null,
|
|
2042
|
+
reclaimCount: n,
|
|
2043
|
+
runnerEnteredAt: /* @__PURE__ */ new Date()
|
|
2044
|
+
}));
|
|
2045
|
+
t && v?.("workflowRuns", {
|
|
2046
|
+
op: "update",
|
|
2047
|
+
row: Q(t)
|
|
2048
|
+
}), e && (yield* m.promise(() => f.recordEvent({
|
|
2049
|
+
runId: T,
|
|
2050
|
+
eventType: "run-resumed",
|
|
2051
|
+
payload: {
|
|
2052
|
+
reason: "runner-reclaim",
|
|
2053
|
+
reclaimCount: n,
|
|
2054
|
+
maxRunReclaims: r
|
|
2055
|
+
}
|
|
2056
|
+
})));
|
|
2057
|
+
}));
|
|
2058
|
+
} else yield* E("failed to record workflow start (continuing)", m.gen(function* () {
|
|
2059
|
+
let e = yield* m.promise(() => i.store.insert("_voltro_workflow_runs", {
|
|
2060
|
+
id: u("wr"),
|
|
1665
2061
|
tag: i.name,
|
|
1666
|
-
executionId:
|
|
2062
|
+
executionId: S,
|
|
1667
2063
|
status: "running",
|
|
1668
|
-
payload:
|
|
2064
|
+
payload: ee,
|
|
1669
2065
|
workflowVersion: i.workflowVersion ?? null,
|
|
1670
2066
|
workflowPatches: i.workflowPatches ?? null,
|
|
1671
2067
|
output: null,
|
|
@@ -1678,55 +2074,58 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1678
2074
|
completedAt: null,
|
|
1679
2075
|
durationMs: null,
|
|
1680
2076
|
traceId: i.traceId ?? null,
|
|
1681
|
-
parentExecutionId:
|
|
1682
|
-
parentClosePolicy:
|
|
2077
|
+
parentExecutionId: w,
|
|
2078
|
+
parentClosePolicy: ne,
|
|
2079
|
+
runnerEnteredAt: /* @__PURE__ */ new Date(),
|
|
2080
|
+
reclaimCount: 0
|
|
1683
2081
|
}));
|
|
1684
|
-
if (T = e.id,
|
|
2082
|
+
if (T = e.id, v?.("workflowRuns", {
|
|
1685
2083
|
op: "insert",
|
|
1686
2084
|
row: Q(e)
|
|
1687
2085
|
}), T) {
|
|
1688
2086
|
let e = T;
|
|
1689
|
-
yield*
|
|
2087
|
+
yield* m.promise(() => f.recordEvent({
|
|
1690
2088
|
runId: e,
|
|
1691
2089
|
eventType: "run-started",
|
|
1692
2090
|
payload: {
|
|
1693
2091
|
tag: i.name,
|
|
1694
|
-
executionId:
|
|
2092
|
+
executionId: S,
|
|
1695
2093
|
source: i.source ?? null,
|
|
1696
2094
|
workflowVersion: i.workflowVersion ?? null,
|
|
1697
2095
|
workflowPatches: i.workflowPatches ?? null,
|
|
1698
|
-
parentExecutionId:
|
|
1699
|
-
parentClosePolicy:
|
|
2096
|
+
parentExecutionId: w,
|
|
2097
|
+
parentClosePolicy: ne
|
|
1700
2098
|
}
|
|
1701
2099
|
}));
|
|
1702
2100
|
}
|
|
1703
2101
|
}));
|
|
1704
|
-
let
|
|
1705
|
-
if (
|
|
1706
|
-
let e =
|
|
1707
|
-
t && (yield*
|
|
2102
|
+
let j = i.subject?.tenantId, re = c(ee, S).pipe(m.locally(e, T), m.locally(r, S), m.locally(a, typeof j == "string" ? j : void 0), m.locally(o, k), m.locally(s, A), m.provideService(n, f)), ie = i.pluginWorkflowStepLayer ? re.pipe(m.provide(i.pluginWorkflowStepLayer)) : re, M = yield* d.intoResult(ie);
|
|
2103
|
+
if (d.isResult(M) && M._tag === "Suspended") {
|
|
2104
|
+
let e = M.cause, t = e !== void 0 && !p.isEmpty(e), n = t ? p.squash(e) : void 0, r = n && typeof n == "object" && "_tag" in n ? String(n._tag) : null, a = t ? n?.message ?? String(n) : null;
|
|
2105
|
+
t && (yield* m.sync(() => se({
|
|
1708
2106
|
error: n,
|
|
1709
2107
|
source: "workflow",
|
|
1710
2108
|
name: i.name,
|
|
1711
2109
|
...i.traceId ? { traceId: i.traceId } : {},
|
|
1712
2110
|
fields: {
|
|
1713
|
-
executionId:
|
|
2111
|
+
executionId: S,
|
|
1714
2112
|
suspendedOnFailure: !0,
|
|
1715
2113
|
...r ? { errorTag: r } : {},
|
|
1716
2114
|
...T ? { runId: T } : {}
|
|
1717
2115
|
}
|
|
1718
|
-
}))), T && (yield* E("failed to record workflow suspend",
|
|
1719
|
-
let e = yield*
|
|
2116
|
+
}))), T && (yield* E("failed to record workflow suspend", m.gen(function* () {
|
|
2117
|
+
let e = yield* m.promise(() => i.store.update("_voltro_workflow_runs", T, {
|
|
1720
2118
|
status: "suspended",
|
|
2119
|
+
runnerEnteredAt: null,
|
|
1721
2120
|
...t ? {
|
|
1722
2121
|
errorTag: r,
|
|
1723
2122
|
errorMessage: a
|
|
1724
2123
|
} : {}
|
|
1725
2124
|
}));
|
|
1726
|
-
e &&
|
|
2125
|
+
e && v?.("workflowRuns", {
|
|
1727
2126
|
op: "update",
|
|
1728
2127
|
row: Q(e)
|
|
1729
|
-
}), yield*
|
|
2128
|
+
}), yield* m.promise(() => f.recordEvent({
|
|
1730
2129
|
runId: T,
|
|
1731
2130
|
eventType: "run-suspended",
|
|
1732
2131
|
payload: t ? {
|
|
@@ -1736,79 +2135,99 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1736
2135
|
} : { reason: "workflow-suspend" }
|
|
1737
2136
|
}));
|
|
1738
2137
|
})));
|
|
1739
|
-
let o = yield*
|
|
1740
|
-
return yield*
|
|
2138
|
+
let o = yield* oe;
|
|
2139
|
+
return yield* d.suspend(o);
|
|
2140
|
+
}
|
|
2141
|
+
let N = M;
|
|
2142
|
+
if (A !== void 0 && T !== void 0) {
|
|
2143
|
+
let e = A.settle();
|
|
2144
|
+
if (e.length > 0) {
|
|
2145
|
+
let n = T;
|
|
2146
|
+
h("workflow replay reached a different step shape than this run recorded", {
|
|
2147
|
+
tag: i.name,
|
|
2148
|
+
executionId: S,
|
|
2149
|
+
runId: n,
|
|
2150
|
+
findings: e.map((e) => `${e.kind}:${e.stepName}`)
|
|
2151
|
+
}), yield* E("failed to record nondeterminism findings", m.promise(async () => {
|
|
2152
|
+
for (let r of e) await f.recordEvent({
|
|
2153
|
+
runId: n,
|
|
2154
|
+
eventType: "nondeterminism-suspected",
|
|
2155
|
+
payload: t(r)
|
|
2156
|
+
}).catch(() => void 0);
|
|
2157
|
+
}));
|
|
2158
|
+
}
|
|
1741
2159
|
}
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
return yield* u.sync(() => ne({
|
|
2160
|
+
if (g.isFailure(N.exit)) {
|
|
2161
|
+
let e = N.exit.cause, t = p.failureOption(e), n = t._tag === "Some" ? t.value : p.squash(e), r = n && typeof n == "object" && "_tag" in n ? String(n._tag) : null, a = n?.message ?? String(n);
|
|
2162
|
+
return yield* m.sync(() => se({
|
|
1746
2163
|
error: n,
|
|
1747
2164
|
source: "workflow",
|
|
1748
2165
|
name: i.name,
|
|
1749
2166
|
...i.traceId ? { traceId: i.traceId } : {},
|
|
1750
2167
|
fields: {
|
|
1751
|
-
executionId:
|
|
2168
|
+
executionId: S,
|
|
1752
2169
|
...r ? { errorTag: r } : {},
|
|
1753
2170
|
...T ? { runId: T } : {}
|
|
1754
2171
|
}
|
|
1755
|
-
})), T && (yield* E("failed to record workflow failure",
|
|
1756
|
-
let e = yield*
|
|
2172
|
+
})), T && (yield* E("failed to record workflow failure", m.gen(function* () {
|
|
2173
|
+
let e = yield* m.promise(() => i.store.update("_voltro_workflow_runs", T, {
|
|
1757
2174
|
status: "failed",
|
|
1758
2175
|
errorTag: r,
|
|
1759
2176
|
errorMessage: a,
|
|
1760
2177
|
completedAt: /* @__PURE__ */ new Date(),
|
|
1761
|
-
durationMs: Date.now() -
|
|
2178
|
+
durationMs: Date.now() - C,
|
|
2179
|
+
runnerEnteredAt: null
|
|
1762
2180
|
}));
|
|
1763
|
-
e &&
|
|
2181
|
+
e && v?.("workflowRuns", {
|
|
1764
2182
|
op: "update",
|
|
1765
2183
|
row: Q(e)
|
|
1766
|
-
}), yield*
|
|
2184
|
+
}), yield* m.promise(() => f.recordEvent({
|
|
1767
2185
|
runId: T,
|
|
1768
2186
|
eventType: "run-failed",
|
|
1769
2187
|
payload: {
|
|
1770
2188
|
errorTag: r,
|
|
1771
2189
|
errorMessage: a,
|
|
1772
|
-
durationMs: Date.now() -
|
|
2190
|
+
durationMs: Date.now() - C
|
|
1773
2191
|
}
|
|
1774
|
-
})), yield*
|
|
1775
|
-
}))), yield*
|
|
2192
|
+
})), yield* y(S, "failed", T);
|
|
2193
|
+
}))), yield* b(S, "failed", T), yield* m.sync(() => i.recordRun?.({
|
|
1776
2194
|
name: i.name,
|
|
1777
2195
|
status: "failed",
|
|
1778
|
-
durationMs: Date.now() -
|
|
1779
|
-
})), yield*
|
|
2196
|
+
durationMs: Date.now() - C
|
|
2197
|
+
})), yield* m.failCause(e);
|
|
1780
2198
|
}
|
|
1781
|
-
let
|
|
1782
|
-
return T && (yield* E("failed to record workflow success",
|
|
1783
|
-
let e = yield*
|
|
2199
|
+
let P = N.exit.value;
|
|
2200
|
+
return T && (yield* E("failed to record workflow success", m.gen(function* () {
|
|
2201
|
+
let e = yield* m.promise(() => i.store.update("_voltro_workflow_runs", T, {
|
|
1784
2202
|
status: "succeeded",
|
|
1785
|
-
output: Z(
|
|
2203
|
+
output: Z(P, l),
|
|
1786
2204
|
completedAt: /* @__PURE__ */ new Date(),
|
|
1787
|
-
durationMs: Date.now() -
|
|
2205
|
+
durationMs: Date.now() - C,
|
|
2206
|
+
runnerEnteredAt: null
|
|
1788
2207
|
}));
|
|
1789
|
-
e &&
|
|
2208
|
+
e && v?.("workflowRuns", {
|
|
1790
2209
|
op: "update",
|
|
1791
2210
|
row: Q(e)
|
|
1792
|
-
}), yield*
|
|
2211
|
+
}), yield* m.promise(() => f.recordEvent({
|
|
1793
2212
|
runId: T,
|
|
1794
2213
|
eventType: "run-succeeded",
|
|
1795
|
-
payload: { durationMs: Date.now() -
|
|
1796
|
-
})), yield*
|
|
1797
|
-
}))), yield*
|
|
2214
|
+
payload: { durationMs: Date.now() - C }
|
|
2215
|
+
})), yield* y(S, "succeeded", T);
|
|
2216
|
+
}))), yield* b(S, "succeeded", T), yield* m.sync(() => i.recordRun?.({
|
|
1798
2217
|
name: i.name,
|
|
1799
2218
|
status: "succeeded",
|
|
1800
|
-
durationMs: Date.now() -
|
|
2219
|
+
durationMs: Date.now() - C,
|
|
1801
2220
|
completedAtSec: Date.now() / 1e3
|
|
1802
|
-
})),
|
|
2221
|
+
})), P;
|
|
1803
2222
|
});
|
|
1804
|
-
},
|
|
2223
|
+
}, pn = (e) => e === "cancel" || e === "terminate", mn = (e) => e === "running" || e === "suspended", hn = async (e) => {
|
|
1805
2224
|
let t = await e.store.query({
|
|
1806
2225
|
table: "_voltro_workflow_runs",
|
|
1807
2226
|
order: [{
|
|
1808
2227
|
column: "startedAt",
|
|
1809
2228
|
direction: "asc"
|
|
1810
2229
|
}],
|
|
1811
|
-
predicate:
|
|
2230
|
+
predicate: x("parentExecutionId", e.parentExecutionId),
|
|
1812
2231
|
projection: void 0,
|
|
1813
2232
|
skip: void 0,
|
|
1814
2233
|
take: e.limit ?? 1e3
|
|
@@ -1827,7 +2246,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1827
2246
|
});
|
|
1828
2247
|
continue;
|
|
1829
2248
|
}
|
|
1830
|
-
if (!
|
|
2249
|
+
if (!pn(r.parentClosePolicy)) {
|
|
1831
2250
|
n.push({
|
|
1832
2251
|
...t,
|
|
1833
2252
|
action: "skipped",
|
|
@@ -1835,7 +2254,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1835
2254
|
});
|
|
1836
2255
|
continue;
|
|
1837
2256
|
}
|
|
1838
|
-
if (!
|
|
2257
|
+
if (!mn(r.status)) {
|
|
1839
2258
|
n.push({
|
|
1840
2259
|
...t,
|
|
1841
2260
|
action: "skipped",
|
|
@@ -1883,7 +2302,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1883
2302
|
}
|
|
1884
2303
|
}
|
|
1885
2304
|
return n;
|
|
1886
|
-
},
|
|
2305
|
+
}, gn = (e) => {
|
|
1887
2306
|
if (e == null) return null;
|
|
1888
2307
|
if (e instanceof Date) return e;
|
|
1889
2308
|
if (typeof e == "string" || typeof e == "number") {
|
|
@@ -1891,7 +2310,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1891
2310
|
return Number.isNaN(t.getTime()) ? null : t;
|
|
1892
2311
|
}
|
|
1893
2312
|
return null;
|
|
1894
|
-
},
|
|
2313
|
+
}, _n = (e) => typeof e == "number" ? e : e == null ? null : Number(e), $ = (e) => e == null ? null : String(e), vn = (e) => {
|
|
1895
2314
|
let t = /* @__PURE__ */ new Map();
|
|
1896
2315
|
for (let n of e) {
|
|
1897
2316
|
let e = String(n.stepName), r = t.get(e);
|
|
@@ -1899,27 +2318,27 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1899
2318
|
}
|
|
1900
2319
|
let n = [];
|
|
1901
2320
|
for (let [e, r] of t) {
|
|
1902
|
-
r.sort((e, t) => (
|
|
2321
|
+
r.sort((e, t) => (_n(e.attempt) ?? 0) - (_n(t.attempt) ?? 0));
|
|
1903
2322
|
let t = r[r.length - 1], i = $(t.errorTag), a = $(t.errorMessage), o = i !== null || a !== null ? {
|
|
1904
2323
|
tag: i,
|
|
1905
2324
|
message: a ?? ""
|
|
1906
2325
|
} : null;
|
|
1907
2326
|
n.push({
|
|
1908
2327
|
name: e,
|
|
1909
|
-
attempt:
|
|
2328
|
+
attempt: _n(t.attempt) ?? r.length,
|
|
1910
2329
|
attempts: r.length,
|
|
1911
2330
|
status: t.status ?? "running",
|
|
1912
2331
|
input: t.input ?? null,
|
|
1913
2332
|
output: t.output ?? null,
|
|
1914
2333
|
error: o,
|
|
1915
|
-
durationMs:
|
|
2334
|
+
durationMs: _n(t.durationMs)
|
|
1916
2335
|
});
|
|
1917
2336
|
}
|
|
1918
2337
|
return n.sort((t, n) => {
|
|
1919
2338
|
let r = e.find((e) => String(e.stepName) === t.name), i = e.find((e) => String(e.stepName) === n.name);
|
|
1920
|
-
return (
|
|
2339
|
+
return (gn(r?.startedAt)?.getTime() ?? 0) - (gn(i?.startedAt)?.getTime() ?? 0);
|
|
1921
2340
|
}), n;
|
|
1922
|
-
},
|
|
2341
|
+
}, yn = (e) => {
|
|
1923
2342
|
if (e == null) return null;
|
|
1924
2343
|
if (typeof e == "string") try {
|
|
1925
2344
|
return JSON.parse(e);
|
|
@@ -1927,10 +2346,10 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1927
2346
|
return null;
|
|
1928
2347
|
}
|
|
1929
2348
|
return typeof e == "object" ? e : null;
|
|
1930
|
-
},
|
|
1931
|
-
let n =
|
|
2349
|
+
}, bn = async (e, t) => {
|
|
2350
|
+
let n = A(le), r = (await t.query(n.where(k(x("id", e), x("executionId", e))).limit(1).descriptor))[0];
|
|
1932
2351
|
if (r === void 0) return null;
|
|
1933
|
-
let i = String(r.id), a =
|
|
2352
|
+
let i = String(r.id), a = A(ue), o = await t.query(a.where(x("runId", i)).descriptor);
|
|
1934
2353
|
return {
|
|
1935
2354
|
id: i,
|
|
1936
2355
|
executionId: $(r.executionId) ?? "",
|
|
@@ -1938,19 +2357,19 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1938
2357
|
status: r.status ?? "running",
|
|
1939
2358
|
input: r.payload ?? null,
|
|
1940
2359
|
output: r.output ?? null,
|
|
1941
|
-
subject:
|
|
2360
|
+
subject: yn(r.subject),
|
|
1942
2361
|
source: $(r.source),
|
|
1943
|
-
steps:
|
|
1944
|
-
startedAt:
|
|
1945
|
-
finishedAt:
|
|
2362
|
+
steps: vn(o),
|
|
2363
|
+
startedAt: gn(r.startedAt) ?? /* @__PURE__ */ new Date(0),
|
|
2364
|
+
finishedAt: gn(r.completedAt),
|
|
1946
2365
|
traceId: $(r.traceId),
|
|
1947
2366
|
parentExecutionId: $(r.parentExecutionId),
|
|
1948
2367
|
parentClosePolicy: $(r.parentClosePolicy)
|
|
1949
2368
|
};
|
|
1950
|
-
},
|
|
1951
|
-
let e = [],
|
|
2369
|
+
}, xn = () => {
|
|
2370
|
+
let e = [], t = [], r = 0, i = 0;
|
|
1952
2371
|
return {
|
|
1953
|
-
layer:
|
|
2372
|
+
layer: v.succeed(n, {
|
|
1954
2373
|
startStep: async ({ runId: t, stepName: n, attempt: i, stepInput: a, retryPolicy: o }) => {
|
|
1955
2374
|
let s = `wfstep_mem_${++r}`;
|
|
1956
2375
|
return e.push({
|
|
@@ -1978,12 +2397,12 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1978
2397
|
let o = e.find((e) => e.id === t);
|
|
1979
2398
|
o !== void 0 && (o.status = "failed", o.errorTag = n, o.errorMessage = r, o.errorCause = i ?? null, o.completedAt = /* @__PURE__ */ new Date(), o.durationMs = a);
|
|
1980
2399
|
},
|
|
1981
|
-
recordEvent: async ({ runId: e, eventType:
|
|
2400
|
+
recordEvent: async ({ runId: e, eventType: n, payload: r, stepName: a, attempt: o }) => {
|
|
1982
2401
|
let s = `wfev_mem_${++i}`;
|
|
1983
|
-
return
|
|
2402
|
+
return t.push({
|
|
1984
2403
|
id: s,
|
|
1985
2404
|
runId: e,
|
|
1986
|
-
eventType:
|
|
2405
|
+
eventType: n,
|
|
1987
2406
|
payload: r ?? null,
|
|
1988
2407
|
stepName: a ?? null,
|
|
1989
2408
|
attempt: o ?? null,
|
|
@@ -1992,8 +2411,8 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1992
2411
|
}
|
|
1993
2412
|
}),
|
|
1994
2413
|
readSteps: () => e,
|
|
1995
|
-
readEvents: () =>
|
|
2414
|
+
readEvents: () => t
|
|
1996
2415
|
};
|
|
1997
2416
|
};
|
|
1998
2417
|
//#endregion
|
|
1999
|
-
export {
|
|
2418
|
+
export { we as $, At as A, de as At, Ze as B, Kt as C, ve as Ct, Dt as D, he as Dt, Nt as E, me as Et, it as F, rt as G, Xe as H, ot as I, qe as J, et as K, at as L, xt as M, le as Mt, mt as N, ce as Nt, Ot as O, pe as Ot, ht as P, z as Q, ft as R, Xt as S, xe as St, Lt as T, I as Tt, Ye as U, Qe as V, $e as W, He as X, Ge as Y, We as Z, Vt as _, ke as _t, an as a, Fe as at, Qt as b, ye as bt, on as c, Oe as ct, fn as d, Me as dt, B as et, tn as f, Ve as ft, Ht as g, Pe as gt, Gt as h, W as ht, rn as i, Re as it, Ct as j, ue as jt, kt as k, fe as kt, Q as l, Te as lt, Wt as m, De as mt, bn as n, Le as nt, un as o, Be as ot, X as p, Ae as pt, Je as q, hn as r, G as rt, sn as s, ze as st, xn as t, R as tt, Z as u, Ie as ut, Bt as v, ge as vt, It as w, _e as wt, Zt as x, Se as xt, zt as y, Ce as yt, K as z };
|