@voltro/workflow 0.32.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 +2006 -0
- package/dist/clusterTestSuite.js +28 -28
- package/dist/index.d.ts +539 -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-CJr1crqr.js → src-BXObaqb-.js} +935 -506
- package/package.json +5 -4
|
@@ -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,24 +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
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
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, [{
|
|
453
|
+
column: "priority",
|
|
454
|
+
direction: "desc"
|
|
455
|
+
}, {
|
|
456
|
+
column: "firstSeenAt",
|
|
457
|
+
direction: "asc"
|
|
458
|
+
}], n))).map(Ee), i;
|
|
459
|
+
for (let e of r) e.dueAt <= t || (i === void 0 || e.dueAt < i) && (i = e.dueAt);
|
|
460
|
+
return {
|
|
461
|
+
due: r.filter((e) => e.dueAt <= t).sort(Ce),
|
|
462
|
+
nextDueAt: i
|
|
463
|
+
};
|
|
464
|
+
}, Le = async (e, t) => (await e.query(U(R, void 0, [{
|
|
456
465
|
column: "firstSeenAt",
|
|
457
466
|
direction: "asc"
|
|
458
|
-
}], t))).map(
|
|
459
|
-
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];
|
|
460
469
|
if (i === void 0) return !1;
|
|
461
|
-
let a =
|
|
470
|
+
let a = Ee(i);
|
|
462
471
|
try {
|
|
463
|
-
await e.insert(
|
|
472
|
+
await e.insert(z, {
|
|
464
473
|
tenantId: a.tenantId,
|
|
465
474
|
workflowName: a.workflowName,
|
|
466
475
|
outcome: "discarded",
|
|
@@ -478,36 +487,36 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
478
487
|
releasedAt: new Date(r)
|
|
479
488
|
});
|
|
480
489
|
} catch {}
|
|
481
|
-
return e.delete(
|
|
482
|
-
},
|
|
483
|
-
await e.update(
|
|
490
|
+
return e.delete(R, t);
|
|
491
|
+
}, ze = async (e, t, n, r) => {
|
|
492
|
+
await e.update(R, t.id, {
|
|
484
493
|
attempts: t.attempts + 1,
|
|
485
494
|
lastError: n.slice(0, 500),
|
|
486
495
|
updatedAt: new Date(r)
|
|
487
496
|
});
|
|
488
|
-
},
|
|
489
|
-
let t = await
|
|
497
|
+
}, Be = async (e) => {
|
|
498
|
+
let t = await Ae({
|
|
490
499
|
store: e.store,
|
|
491
500
|
control: e.control,
|
|
492
501
|
keys: e.keys,
|
|
493
502
|
now: e.now,
|
|
494
503
|
paused: e.paused
|
|
495
504
|
});
|
|
496
|
-
return
|
|
505
|
+
return ye({
|
|
497
506
|
control: e.control,
|
|
498
507
|
keys: e.keys,
|
|
499
508
|
state: t,
|
|
500
509
|
now: e.now,
|
|
501
510
|
reconsidering: e.reconsidering
|
|
502
511
|
});
|
|
503
|
-
},
|
|
504
|
-
let r = await e.query(
|
|
512
|
+
}, Ve = async (e, t, n = 1e3) => {
|
|
513
|
+
let r = await e.query(U(z, void 0, [{
|
|
505
514
|
column: "admittedAt",
|
|
506
515
|
direction: "asc"
|
|
507
|
-
}], n)), i = t.getTime(), a = r.filter((e) => e.releasedAt != null &&
|
|
508
|
-
return await Promise.all(a.map((t) => e.delete(
|
|
509
|
-
},
|
|
510
|
-
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({
|
|
511
520
|
store: t,
|
|
512
521
|
control: n,
|
|
513
522
|
keys: i,
|
|
@@ -515,7 +524,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
515
524
|
now: r,
|
|
516
525
|
reconsidering: !1
|
|
517
526
|
});
|
|
518
|
-
if (a.kind === "drop") return await
|
|
527
|
+
if (a.kind === "drop") return await W({
|
|
519
528
|
store: t,
|
|
520
529
|
control: n,
|
|
521
530
|
keys: i,
|
|
@@ -532,7 +541,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
532
541
|
kind: "dropped",
|
|
533
542
|
retryAfterMs: a.retryAfterMs
|
|
534
543
|
};
|
|
535
|
-
if (a.kind === "skip") return await
|
|
544
|
+
if (a.kind === "skip") return await W({
|
|
536
545
|
store: t,
|
|
537
546
|
control: n,
|
|
538
547
|
keys: i,
|
|
@@ -552,7 +561,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
552
561
|
};
|
|
553
562
|
if (a.kind === "defer") return {
|
|
554
563
|
kind: "queued",
|
|
555
|
-
intentId: await
|
|
564
|
+
intentId: await Me({
|
|
556
565
|
store: t,
|
|
557
566
|
control: n,
|
|
558
567
|
decision: a,
|
|
@@ -566,12 +575,12 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
566
575
|
};
|
|
567
576
|
let o = e.payload, s = [], c = 1;
|
|
568
577
|
if (n.batch !== void 0 && i.batchKey !== void 0) {
|
|
569
|
-
let r = await
|
|
578
|
+
let r = await Ue(t, n.workflowName, i.batchKey, n.batch.maxSize);
|
|
570
579
|
o = { items: [...r.map((e) => e.payload), e.payload] }, s = r.map((e) => e.id), c = r.length + 1;
|
|
571
580
|
}
|
|
572
581
|
return {
|
|
573
582
|
kind: "start",
|
|
574
|
-
ledgerId: await
|
|
583
|
+
ledgerId: await W({
|
|
575
584
|
store: t,
|
|
576
585
|
control: n,
|
|
577
586
|
keys: i,
|
|
@@ -594,9 +603,9 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
594
603
|
runId: a.evict.runId
|
|
595
604
|
} }
|
|
596
605
|
};
|
|
597
|
-
},
|
|
606
|
+
}, Ue = async (e, t, n, r) => (await e.query({
|
|
598
607
|
table: "_voltro_workflow_pending",
|
|
599
|
-
predicate:
|
|
608
|
+
predicate: b(x("workflowName", t), x("controlKey", n), x("mode", "batch")),
|
|
600
609
|
order: [{
|
|
601
610
|
column: "firstSeenAt",
|
|
602
611
|
direction: "asc"
|
|
@@ -607,22 +616,22 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
607
616
|
})).map((e) => ({
|
|
608
617
|
id: String(e.id),
|
|
609
618
|
payload: e.payload
|
|
610
|
-
})),
|
|
619
|
+
})), We = async (e, t, n, r) => {
|
|
611
620
|
await e.update("_voltro_workflow_admissions", t, {
|
|
612
621
|
executionId: n,
|
|
613
622
|
runId: r
|
|
614
623
|
});
|
|
615
|
-
},
|
|
616
|
-
id:
|
|
617
|
-
positionAt:
|
|
618
|
-
updatedAt:
|
|
619
|
-
}),
|
|
624
|
+
}, Ge = M("_voltro_workflow_watermarks", {
|
|
625
|
+
id: w({ prefix: "wfwm" }),
|
|
626
|
+
positionAt: P(),
|
|
627
|
+
updatedAt: P().default("now")
|
|
628
|
+
}), Ke = (e) => {
|
|
620
629
|
let t = e instanceof Error ? e.message : String(e);
|
|
621
630
|
return t.length > 400 ? `${t.slice(0, 400)}…` : t;
|
|
622
|
-
},
|
|
623
|
-
let t = [], n = [], r = [], i = /* @__PURE__ */ new Set(), a = /* @__PURE__ */ new Set(), o = e.payloadSchema === void 0 ? (e) =>
|
|
624
|
-
let n =
|
|
625
|
-
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));
|
|
626
635
|
}, s = e.runs.map((e) => ({
|
|
627
636
|
run: e,
|
|
628
637
|
decoded: o(e.payload)
|
|
@@ -632,19 +641,19 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
632
641
|
}));
|
|
633
642
|
for (let o of e.entries) for (let l of e.events) {
|
|
634
643
|
if (l.name !== o.event) continue;
|
|
635
|
-
let u =
|
|
636
|
-
if (
|
|
644
|
+
let u = y.decodeUnknownEither(o.schema)(l.payload);
|
|
645
|
+
if (h.isLeft(u)) {
|
|
637
646
|
r.push({
|
|
638
647
|
kind: "event-decode",
|
|
639
648
|
workflowName: e.workflowName,
|
|
640
649
|
event: o.event,
|
|
641
650
|
subject: l.id,
|
|
642
|
-
detail:
|
|
651
|
+
detail: Ke(u.left)
|
|
643
652
|
});
|
|
644
653
|
continue;
|
|
645
654
|
}
|
|
646
|
-
let
|
|
647
|
-
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({
|
|
648
657
|
kind: "payload-decode",
|
|
649
658
|
workflowName: e.workflowName,
|
|
650
659
|
event: o.event,
|
|
@@ -652,25 +661,25 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
652
661
|
detail: t.left
|
|
653
662
|
}), !1;
|
|
654
663
|
try {
|
|
655
|
-
return o.match(
|
|
664
|
+
return o.match(d, t.right) === !0;
|
|
656
665
|
} catch (t) {
|
|
657
666
|
return r.push({
|
|
658
667
|
kind: "match-threw",
|
|
659
668
|
workflowName: e.workflowName,
|
|
660
669
|
event: o.event,
|
|
661
670
|
subject: n,
|
|
662
|
-
detail:
|
|
671
|
+
detail: Ke(t)
|
|
663
672
|
}), !1;
|
|
664
673
|
}
|
|
665
674
|
};
|
|
666
|
-
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({
|
|
667
676
|
runId: e.runId,
|
|
668
677
|
executionId: e.executionId,
|
|
669
678
|
reason: o.reason,
|
|
670
679
|
event: o.event,
|
|
671
680
|
eventId: l.id
|
|
672
681
|
}));
|
|
673
|
-
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({
|
|
674
683
|
intentId: e.intentId,
|
|
675
684
|
reason: o.reason,
|
|
676
685
|
event: o.event,
|
|
@@ -682,26 +691,26 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
682
691
|
discards: n,
|
|
683
692
|
problems: r
|
|
684
693
|
};
|
|
685
|
-
},
|
|
694
|
+
}, Je = (e) => {
|
|
686
695
|
let t;
|
|
687
696
|
for (let n of e) (t === void 0 || n.occurredAt.getTime() > t.getTime()) && (t = n.occurredAt);
|
|
688
697
|
return t;
|
|
689
|
-
},
|
|
698
|
+
}, Ye = "_voltro_workflow_watermarks", Xe = "_voltro_workflow_events", K = "cancelOn", Ze = 3600 * 1e3, Qe = 500, q = (e) => {
|
|
690
699
|
if (e instanceof Date) return e;
|
|
691
700
|
if (typeof e == "number") return new Date(e);
|
|
692
701
|
if (typeof e == "string") {
|
|
693
702
|
let t = new Date(e);
|
|
694
703
|
if (!Number.isNaN(t.getTime())) return t;
|
|
695
704
|
}
|
|
696
|
-
}, J = (e) => e instanceof Error ? e.message : String(e),
|
|
697
|
-
table:
|
|
698
|
-
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),
|
|
699
708
|
order: [],
|
|
700
709
|
take: 1,
|
|
701
710
|
skip: void 0,
|
|
702
711
|
projection: void 0
|
|
703
|
-
}))[0]?.positionAt),
|
|
704
|
-
await e.upsert(
|
|
712
|
+
}))[0]?.positionAt), et = async (e, t, n) => {
|
|
713
|
+
await e.upsert(Ye, {
|
|
705
714
|
id: t,
|
|
706
715
|
positionAt: n,
|
|
707
716
|
updatedAt: /* @__PURE__ */ new Date()
|
|
@@ -718,10 +727,10 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
718
727
|
};
|
|
719
728
|
}
|
|
720
729
|
});
|
|
721
|
-
},
|
|
730
|
+
}, tt = async (e, t, n) => {
|
|
722
731
|
let r = async (r) => e.query({
|
|
723
732
|
table: "_voltro_workflow_runs",
|
|
724
|
-
predicate:
|
|
733
|
+
predicate: b(x("tag", t), x("status", r)),
|
|
725
734
|
order: [{
|
|
726
735
|
column: "startedAt",
|
|
727
736
|
direction: "asc"
|
|
@@ -739,9 +748,9 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
739
748
|
startedAt: n
|
|
740
749
|
}];
|
|
741
750
|
});
|
|
742
|
-
},
|
|
751
|
+
}, nt = async (e, t, n) => (await e.query({
|
|
743
752
|
table: "_voltro_workflow_pending",
|
|
744
|
-
predicate:
|
|
753
|
+
predicate: x("workflowName", t),
|
|
745
754
|
order: [{
|
|
746
755
|
column: "firstSeenAt",
|
|
747
756
|
direction: "asc"
|
|
@@ -756,7 +765,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
756
765
|
payload: t.payload,
|
|
757
766
|
firstSeenAt: n
|
|
758
767
|
}];
|
|
759
|
-
}),
|
|
768
|
+
}), rt = async (e, t) => {
|
|
760
769
|
let n = t.workflows.filter((e) => e.entries.length > 0);
|
|
761
770
|
if (n.length === 0) return {
|
|
762
771
|
examined: !1,
|
|
@@ -771,9 +780,9 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
771
780
|
};
|
|
772
781
|
let r = e.now?.() ?? Date.now(), i = t.batch ?? 500, a = t.coldLookbackMs ?? 36e5, o = /* @__PURE__ */ new Set();
|
|
773
782
|
for (let e of n) for (let t of e.entries) o.add(t.event);
|
|
774
|
-
let s = await
|
|
775
|
-
table:
|
|
776
|
-
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),
|
|
777
786
|
order: [{
|
|
778
787
|
column: "occurredAt",
|
|
779
788
|
direction: "asc"
|
|
@@ -797,7 +806,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
797
806
|
if (n.length === 0) continue;
|
|
798
807
|
let r = [], i = [];
|
|
799
808
|
try {
|
|
800
|
-
r = await
|
|
809
|
+
r = await tt(e.store, t.workflowName, _), i = await nt(e.store, t.workflowName, _), (r.length >= _ || i.length >= _) && (h = !0);
|
|
801
810
|
} catch (e) {
|
|
802
811
|
f.push({
|
|
803
812
|
subject: t.workflowName,
|
|
@@ -805,7 +814,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
805
814
|
}), g = !0;
|
|
806
815
|
continue;
|
|
807
816
|
}
|
|
808
|
-
let a =
|
|
817
|
+
let a = qe({
|
|
809
818
|
workflowName: t.workflowName,
|
|
810
819
|
entries: t.entries,
|
|
811
820
|
payloadSchema: t.payloadSchema,
|
|
@@ -847,10 +856,10 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
847
856
|
});
|
|
848
857
|
}
|
|
849
858
|
}
|
|
850
|
-
let v =
|
|
859
|
+
let v = Je(u), y = s;
|
|
851
860
|
if (g) e.log?.warn("workflow.cancelOn: holding the watermark — some workflows could not be evaluated", { failures: f.length });
|
|
852
861
|
else if (v !== void 0) try {
|
|
853
|
-
await
|
|
862
|
+
await et(e.store, K, v), y = v;
|
|
854
863
|
} catch (e) {
|
|
855
864
|
f.push({
|
|
856
865
|
subject: K,
|
|
@@ -858,7 +867,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
858
867
|
});
|
|
859
868
|
}
|
|
860
869
|
else if (s === void 0) try {
|
|
861
|
-
await
|
|
870
|
+
await et(e.store, K, c), y = c;
|
|
862
871
|
} catch (e) {
|
|
863
872
|
f.push({
|
|
864
873
|
subject: K,
|
|
@@ -879,7 +888,163 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
879
888
|
failures: f,
|
|
880
889
|
watermark: y
|
|
881
890
|
};
|
|
882
|
-
},
|
|
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 = {
|
|
883
1048
|
scanned: 0,
|
|
884
1049
|
admitted: 0,
|
|
885
1050
|
deferred: 0,
|
|
@@ -890,14 +1055,16 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
890
1055
|
failed: 0,
|
|
891
1056
|
timedOut: 0,
|
|
892
1057
|
examined: !1
|
|
893
|
-
},
|
|
894
|
-
let n = e.now ?? (() => Date.now()), r = e.log, i = t.batchSize ?? 200, a, o;
|
|
1058
|
+
}, mt = 200, ht = async (e, t = {}) => {
|
|
1059
|
+
let n = e.now ?? (() => Date.now()), r = e.log, i = t.batchSize ?? 200, a, o, s;
|
|
895
1060
|
try {
|
|
896
|
-
a = await
|
|
1061
|
+
a = await De(e.store);
|
|
1062
|
+
let t = await Ie(e.store, n(), i);
|
|
1063
|
+
o = t.due, s = t.nextDueAt;
|
|
897
1064
|
} catch (e) {
|
|
898
|
-
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;
|
|
899
1066
|
}
|
|
900
|
-
let
|
|
1067
|
+
let c = {
|
|
901
1068
|
scanned: o.length,
|
|
902
1069
|
admitted: 0,
|
|
903
1070
|
deferred: 0,
|
|
@@ -907,40 +1074,41 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
907
1074
|
evicted: 0,
|
|
908
1075
|
failed: 0,
|
|
909
1076
|
timedOut: 0
|
|
910
|
-
},
|
|
1077
|
+
}, l = /* @__PURE__ */ new Map(), u = [];
|
|
911
1078
|
for (let e of o) {
|
|
912
1079
|
if (e.mode === "batch") {
|
|
913
|
-
let t = `${e.workflowName}\u0000${e.controlKey}`, n =
|
|
914
|
-
n === void 0 ?
|
|
1080
|
+
let t = `${e.workflowName}\u0000${e.controlKey}`, n = l.get(t);
|
|
1081
|
+
n === void 0 ? l.set(t, [e]) : n.push(e);
|
|
915
1082
|
continue;
|
|
916
1083
|
}
|
|
917
|
-
|
|
1084
|
+
u.push(e);
|
|
918
1085
|
}
|
|
919
|
-
for (let t of
|
|
920
|
-
await
|
|
1086
|
+
for (let t of u) try {
|
|
1087
|
+
await gt(e, t, a, c, n());
|
|
921
1088
|
} catch (i) {
|
|
922
|
-
|
|
1089
|
+
c.failed++, r?.warn?.("workflow flow control: an intent failed to drain", {
|
|
923
1090
|
workflow: t.workflowName,
|
|
924
1091
|
intent: t.id,
|
|
925
1092
|
cause: String(i)
|
|
926
|
-
}), await
|
|
1093
|
+
}), await ze(e.store, t, String(i), n()).catch(() => {});
|
|
927
1094
|
}
|
|
928
|
-
for (let t of
|
|
929
|
-
await
|
|
1095
|
+
for (let t of l.values()) try {
|
|
1096
|
+
await _t(e, t, a, c, n());
|
|
930
1097
|
} catch (i) {
|
|
931
|
-
|
|
1098
|
+
c.failed++;
|
|
932
1099
|
let a = t[0];
|
|
933
1100
|
r?.warn?.("workflow flow control: a batch failed to drain", {
|
|
934
1101
|
workflow: a?.workflowName,
|
|
935
1102
|
size: t.length,
|
|
936
1103
|
cause: String(i)
|
|
937
|
-
}), a !== void 0 && await
|
|
1104
|
+
}), a !== void 0 && await ze(e.store, a, String(i), n()).catch(() => {});
|
|
938
1105
|
}
|
|
939
|
-
return
|
|
940
|
-
...
|
|
941
|
-
examined: !0
|
|
1106
|
+
return c.timedOut = await yt(e, n()).catch(() => 0), {
|
|
1107
|
+
...c,
|
|
1108
|
+
examined: !0,
|
|
1109
|
+
...s === void 0 ? {} : { nextDueAt: s }
|
|
942
1110
|
};
|
|
943
|
-
},
|
|
1111
|
+
}, gt = async (e, t, n, r, i) => {
|
|
944
1112
|
let a = e.controls.get(t.workflowName);
|
|
945
1113
|
if (a === void 0) {
|
|
946
1114
|
await e.onAbandoned({
|
|
@@ -948,14 +1116,14 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
948
1116
|
payload: t.payload,
|
|
949
1117
|
callerContext: t.callerContext,
|
|
950
1118
|
reason: `workflow '${t.workflowName}' is no longer registered — it was renamed or removed while this start was waiting in the admission queue`
|
|
951
|
-
}), await
|
|
1119
|
+
}), await G(e.store, t.id), r.expired++;
|
|
952
1120
|
return;
|
|
953
1121
|
}
|
|
954
|
-
if (
|
|
955
|
-
await
|
|
1122
|
+
if (xe(a, t, i)) {
|
|
1123
|
+
await W({
|
|
956
1124
|
store: e.store,
|
|
957
1125
|
control: a,
|
|
958
|
-
keys:
|
|
1126
|
+
keys: I(a, t.payload),
|
|
959
1127
|
outcome: "expired",
|
|
960
1128
|
mode: t.mode,
|
|
961
1129
|
reason: `timeouts.start elapsed after ${i - t.firstSeenAt}ms`,
|
|
@@ -970,14 +1138,14 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
970
1138
|
payload: t.payload,
|
|
971
1139
|
callerContext: t.callerContext,
|
|
972
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`
|
|
973
|
-
}), await
|
|
1141
|
+
}), await G(e.store, t.id), r.expired++;
|
|
974
1142
|
return;
|
|
975
1143
|
}
|
|
976
|
-
let o =
|
|
977
|
-
await
|
|
1144
|
+
let o = I(a, t.payload);
|
|
1145
|
+
await vt(e, {
|
|
978
1146
|
control: a,
|
|
979
1147
|
intent: t,
|
|
980
|
-
decision: await
|
|
1148
|
+
decision: await Be({
|
|
981
1149
|
store: e.store,
|
|
982
1150
|
control: a,
|
|
983
1151
|
keys: o,
|
|
@@ -990,32 +1158,32 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
990
1158
|
now: i,
|
|
991
1159
|
items: void 0
|
|
992
1160
|
});
|
|
993
|
-
},
|
|
1161
|
+
}, _t = async (e, t, n, r, i) => {
|
|
994
1162
|
let a = t[0];
|
|
995
1163
|
if (a === void 0) return;
|
|
996
1164
|
let o = e.controls.get(a.workflowName);
|
|
997
1165
|
if (o === void 0 || o.batch === void 0) {
|
|
998
|
-
for (let n of t) await
|
|
1166
|
+
for (let n of t) await G(e.store, n.id);
|
|
999
1167
|
r.expired += t.length;
|
|
1000
1168
|
return;
|
|
1001
1169
|
}
|
|
1002
1170
|
let s = [...t].sort((e, t) => e.firstSeenAt - t.firstSeenAt), c = s[0];
|
|
1003
|
-
if (
|
|
1171
|
+
if (xe(o, c, i)) {
|
|
1004
1172
|
await e.onAbandoned({
|
|
1005
1173
|
workflowName: a.workflowName,
|
|
1006
1174
|
payload: { items: s.map((e) => e.payload) },
|
|
1007
1175
|
callerContext: c.callerContext,
|
|
1008
1176
|
reason: `timeouts.start elapsed with ${s.length} item(s) accumulated in the batch`
|
|
1009
1177
|
});
|
|
1010
|
-
for (let t of s) await
|
|
1178
|
+
for (let t of s) await G(e.store, t.id);
|
|
1011
1179
|
r.expired += s.length;
|
|
1012
1180
|
return;
|
|
1013
1181
|
}
|
|
1014
|
-
let l =
|
|
1015
|
-
await
|
|
1182
|
+
let l = I(o, c.payload);
|
|
1183
|
+
await vt(e, {
|
|
1016
1184
|
control: o,
|
|
1017
1185
|
intent: c,
|
|
1018
|
-
decision: await
|
|
1186
|
+
decision: await Be({
|
|
1019
1187
|
store: e.store,
|
|
1020
1188
|
control: o,
|
|
1021
1189
|
keys: l,
|
|
@@ -1028,10 +1196,10 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1028
1196
|
now: i,
|
|
1029
1197
|
items: s
|
|
1030
1198
|
});
|
|
1031
|
-
},
|
|
1199
|
+
}, vt = async (e, t) => {
|
|
1032
1200
|
let { control: n, intent: r, decision: i, keys: a, counters: o, now: s, items: c } = t;
|
|
1033
1201
|
if (i.kind === "defer") {
|
|
1034
|
-
await
|
|
1202
|
+
await Me({
|
|
1035
1203
|
store: e.store,
|
|
1036
1204
|
control: n,
|
|
1037
1205
|
decision: i,
|
|
@@ -1044,7 +1212,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1044
1212
|
return;
|
|
1045
1213
|
}
|
|
1046
1214
|
if (i.kind === "drop") {
|
|
1047
|
-
await
|
|
1215
|
+
await W({
|
|
1048
1216
|
store: e.store,
|
|
1049
1217
|
control: n,
|
|
1050
1218
|
keys: a,
|
|
@@ -1058,12 +1226,12 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1058
1226
|
tenantId: r.tenantId,
|
|
1059
1227
|
now: s
|
|
1060
1228
|
});
|
|
1061
|
-
for (let t of c ?? [r]) await
|
|
1229
|
+
for (let t of c ?? [r]) await G(e.store, t.id);
|
|
1062
1230
|
o.dropped++;
|
|
1063
1231
|
return;
|
|
1064
1232
|
}
|
|
1065
1233
|
if (i.kind === "skip") {
|
|
1066
|
-
await
|
|
1234
|
+
await W({
|
|
1067
1235
|
store: e.store,
|
|
1068
1236
|
control: n,
|
|
1069
1237
|
keys: a,
|
|
@@ -1077,11 +1245,11 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1077
1245
|
tenantId: r.tenantId,
|
|
1078
1246
|
now: s
|
|
1079
1247
|
});
|
|
1080
|
-
for (let t of c ?? [r]) await
|
|
1248
|
+
for (let t of c ?? [r]) await G(e.store, t.id);
|
|
1081
1249
|
o.skipped++;
|
|
1082
1250
|
return;
|
|
1083
1251
|
}
|
|
1084
|
-
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({
|
|
1085
1253
|
store: e.store,
|
|
1086
1254
|
control: n,
|
|
1087
1255
|
keys: a,
|
|
@@ -1096,7 +1264,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1096
1264
|
now: s
|
|
1097
1265
|
}), o.evicted++);
|
|
1098
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);
|
|
1099
|
-
await
|
|
1267
|
+
await W({
|
|
1100
1268
|
store: e.store,
|
|
1101
1269
|
control: n,
|
|
1102
1270
|
keys: a,
|
|
@@ -1110,18 +1278,18 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1110
1278
|
tenantId: r.tenantId,
|
|
1111
1279
|
now: s
|
|
1112
1280
|
});
|
|
1113
|
-
for (let t of c ?? [r]) await
|
|
1281
|
+
for (let t of c ?? [r]) await G(e.store, t.id);
|
|
1114
1282
|
o.admitted++;
|
|
1115
|
-
},
|
|
1283
|
+
}, yt = async (e, t) => {
|
|
1116
1284
|
if (e.listRunningRuns === void 0) return 0;
|
|
1117
1285
|
let n = 0;
|
|
1118
1286
|
for (let r of e.controls.values()) {
|
|
1119
1287
|
if (r.timeouts?.finishMs === void 0) continue;
|
|
1120
1288
|
let i = await e.listRunningRuns(r.workflowName);
|
|
1121
|
-
for (let a of i)
|
|
1289
|
+
for (let a of i) Se(r, {
|
|
1122
1290
|
startedAt: a.startedAt,
|
|
1123
1291
|
terminal: !1
|
|
1124
|
-
}, 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({
|
|
1125
1293
|
workflowName: r.workflowName,
|
|
1126
1294
|
payload: null,
|
|
1127
1295
|
callerContext: null,
|
|
@@ -1129,82 +1297,82 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1129
1297
|
}), n++);
|
|
1130
1298
|
}
|
|
1131
1299
|
return n;
|
|
1132
|
-
},
|
|
1300
|
+
}, bt = async (e, t) => {
|
|
1133
1301
|
if (e) try {
|
|
1134
1302
|
await e.recordEvent(t);
|
|
1135
1303
|
} catch {}
|
|
1136
|
-
},
|
|
1137
|
-
let
|
|
1138
|
-
let i =
|
|
1139
|
-
if (s === void 0) return yield*
|
|
1140
|
-
let
|
|
1141
|
-
yield*
|
|
1142
|
-
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,
|
|
1143
1311
|
eventType: "signal-awaited",
|
|
1144
|
-
payload: { signalName:
|
|
1312
|
+
payload: { signalName: r.name }
|
|
1145
1313
|
}));
|
|
1146
|
-
let
|
|
1314
|
+
let d = Date.now(), f = i;
|
|
1147
1315
|
for (;;) {
|
|
1148
|
-
let
|
|
1149
|
-
if (
|
|
1150
|
-
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 = {
|
|
1151
1319
|
table: "_voltro_workflow_run_events",
|
|
1152
1320
|
order: [{
|
|
1153
1321
|
column: "occurredAt",
|
|
1154
1322
|
direction: "asc"
|
|
1155
1323
|
}],
|
|
1156
|
-
predicate:
|
|
1324
|
+
predicate: b(x("runId", u), x("eventType", "signal-sent")),
|
|
1157
1325
|
projection: void 0,
|
|
1158
1326
|
skip: void 0,
|
|
1159
1327
|
take: 1e3
|
|
1160
|
-
}, i = (yield*
|
|
1161
|
-
try: () =>
|
|
1328
|
+
}, i = (yield* m.tryPromise({
|
|
1329
|
+
try: () => t.store.query(n),
|
|
1162
1330
|
catch: (e) => e
|
|
1163
|
-
})).find((e) => e.payload?.signalName ===
|
|
1331
|
+
})).find((e) => e.payload?.signalName === r.name);
|
|
1164
1332
|
if (i !== void 0) {
|
|
1165
|
-
let e = yield*
|
|
1166
|
-
return yield*
|
|
1167
|
-
runId:
|
|
1333
|
+
let e = yield* y.decodeUnknown(r.schema)(i.payload?.value);
|
|
1334
|
+
return yield* m.promise(() => bt(l, {
|
|
1335
|
+
runId: u,
|
|
1168
1336
|
eventType: "signal-received",
|
|
1169
1337
|
payload: {
|
|
1170
|
-
signalName:
|
|
1338
|
+
signalName: r.name,
|
|
1171
1339
|
value: i.payload?.value
|
|
1172
1340
|
}
|
|
1173
1341
|
})), e;
|
|
1174
1342
|
}
|
|
1175
|
-
yield*
|
|
1343
|
+
yield* m.sleep(`${f} millis`), f = Math.min(f * 2, a);
|
|
1176
1344
|
}
|
|
1177
1345
|
});
|
|
1178
|
-
return
|
|
1179
|
-
name: `await-signal:${
|
|
1180
|
-
success:
|
|
1181
|
-
execute:
|
|
1346
|
+
return c.make({
|
|
1347
|
+
name: `await-signal:${r.name}`,
|
|
1348
|
+
success: r.schema,
|
|
1349
|
+
execute: i
|
|
1182
1350
|
});
|
|
1183
|
-
},
|
|
1351
|
+
}, St = async (e, t) => {
|
|
1184
1352
|
if (e !== void 0) try {
|
|
1185
1353
|
await e.recordEvent(t);
|
|
1186
1354
|
} catch {}
|
|
1187
|
-
},
|
|
1188
|
-
let
|
|
1189
|
-
let i =
|
|
1190
|
-
if (c === void 0) return yield*
|
|
1191
|
-
let
|
|
1192
|
-
yield*
|
|
1193
|
-
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,
|
|
1194
1362
|
eventType: "event-awaited",
|
|
1195
1363
|
payload: {
|
|
1196
|
-
event:
|
|
1197
|
-
since:
|
|
1198
|
-
cutoff:
|
|
1364
|
+
event: r.event,
|
|
1365
|
+
since: r.since ?? "wait-start",
|
|
1366
|
+
cutoff: f.toISOString()
|
|
1199
1367
|
}
|
|
1200
1368
|
}));
|
|
1201
|
-
let
|
|
1369
|
+
let p = Date.now(), h = i, g = 0;
|
|
1202
1370
|
for (;;) {
|
|
1203
|
-
let
|
|
1204
|
-
if (
|
|
1205
|
-
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 = {
|
|
1206
1374
|
table: "_voltro_workflow_events",
|
|
1207
|
-
predicate:
|
|
1375
|
+
predicate: b(x("name", r.event), te("occurredAt", f)),
|
|
1208
1376
|
order: [{
|
|
1209
1377
|
column: "occurredAt",
|
|
1210
1378
|
direction: "asc"
|
|
@@ -1212,35 +1380,35 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1212
1380
|
take: s,
|
|
1213
1381
|
skip: void 0,
|
|
1214
1382
|
projection: void 0
|
|
1215
|
-
}, i = yield*
|
|
1216
|
-
try: () =>
|
|
1383
|
+
}, i = yield* m.tryPromise({
|
|
1384
|
+
try: () => t.store.query(n),
|
|
1217
1385
|
catch: (e) => e
|
|
1218
1386
|
});
|
|
1219
|
-
|
|
1387
|
+
g = i.length;
|
|
1220
1388
|
for (let e of i) {
|
|
1221
|
-
let t = yield*
|
|
1222
|
-
if (
|
|
1223
|
-
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,
|
|
1224
1392
|
eventType: "event-received",
|
|
1225
1393
|
payload: {
|
|
1226
|
-
event:
|
|
1394
|
+
event: r.event,
|
|
1227
1395
|
eventId: e.id
|
|
1228
1396
|
}
|
|
1229
1397
|
})), t;
|
|
1230
1398
|
}
|
|
1231
|
-
yield*
|
|
1399
|
+
yield* m.sleep(`${h} millis`), h = Math.min(h * 2, a);
|
|
1232
1400
|
}
|
|
1233
1401
|
});
|
|
1234
|
-
return
|
|
1235
|
-
name: `awaitEvent:${
|
|
1236
|
-
success:
|
|
1237
|
-
execute:
|
|
1402
|
+
return c.make({
|
|
1403
|
+
name: `awaitEvent:${r.event}`,
|
|
1404
|
+
success: r.schema,
|
|
1405
|
+
execute: i
|
|
1238
1406
|
});
|
|
1239
|
-
},
|
|
1240
|
-
let n = (yield*
|
|
1407
|
+
}, wt = (e, t) => m.gen(function* () {
|
|
1408
|
+
let n = (yield* m.tryPromise({
|
|
1241
1409
|
try: () => e.store.query({
|
|
1242
1410
|
table: "_voltro_workflow_runs",
|
|
1243
|
-
predicate:
|
|
1411
|
+
predicate: x("id", t),
|
|
1244
1412
|
order: [],
|
|
1245
1413
|
take: 1,
|
|
1246
1414
|
skip: void 0,
|
|
@@ -1254,16 +1422,16 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1254
1422
|
if (!Number.isNaN(e.getTime())) return e;
|
|
1255
1423
|
}
|
|
1256
1424
|
return /* @__PURE__ */ new Date(0);
|
|
1257
|
-
}),
|
|
1425
|
+
}), Tt = (e) => new Promise((t) => setTimeout(t, e)), Et = () => {
|
|
1258
1426
|
let e = globalThis.crypto;
|
|
1259
1427
|
return typeof e?.randomUUID == "function" ? e.randomUUID() : `${Date.now().toString(36)}${Math.random().toString(36).slice(2)}`;
|
|
1260
|
-
},
|
|
1428
|
+
}, Dt = () => `wfu_${Et()}`, Ot = async (e, t) => {
|
|
1261
1429
|
let n = t.id ?? t.executionId;
|
|
1262
1430
|
if (!n) throw Error("workflow message target requires target.id or target.executionId");
|
|
1263
1431
|
let r = await e.query({
|
|
1264
1432
|
table: "_voltro_workflow_runs",
|
|
1265
1433
|
order: [],
|
|
1266
|
-
predicate:
|
|
1434
|
+
predicate: x("id", n),
|
|
1267
1435
|
projection: void 0,
|
|
1268
1436
|
skip: void 0,
|
|
1269
1437
|
take: 1
|
|
@@ -1272,15 +1440,15 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1272
1440
|
let i = (await e.query({
|
|
1273
1441
|
table: "_voltro_workflow_runs",
|
|
1274
1442
|
order: [],
|
|
1275
|
-
predicate:
|
|
1443
|
+
predicate: x("executionId", n),
|
|
1276
1444
|
projection: void 0,
|
|
1277
1445
|
skip: void 0,
|
|
1278
1446
|
take: 1
|
|
1279
1447
|
}))[0];
|
|
1280
1448
|
if (!i) throw Error(`workflow message target not found: ${n}`);
|
|
1281
1449
|
return i;
|
|
1282
|
-
},
|
|
1283
|
-
let t = await
|
|
1450
|
+
}, kt = async (e) => {
|
|
1451
|
+
let t = await Ot(e.store, e.target);
|
|
1284
1452
|
return { eventId: (await e.recorder.recordEvent({
|
|
1285
1453
|
runId: t.id,
|
|
1286
1454
|
eventType: "signal-sent",
|
|
@@ -1289,8 +1457,8 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1289
1457
|
value: e.payload
|
|
1290
1458
|
}
|
|
1291
1459
|
})).id };
|
|
1292
|
-
},
|
|
1293
|
-
let t = await
|
|
1460
|
+
}, At = async (e) => {
|
|
1461
|
+
let t = await Ot(e.store, e.target), n = Dt(), r = await e.recorder.recordEvent({
|
|
1294
1462
|
runId: t.id,
|
|
1295
1463
|
eventType: "update-requested",
|
|
1296
1464
|
payload: {
|
|
@@ -1306,7 +1474,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1306
1474
|
column: "occurredAt",
|
|
1307
1475
|
direction: "asc"
|
|
1308
1476
|
}],
|
|
1309
|
-
predicate:
|
|
1477
|
+
predicate: x("runId", t.id),
|
|
1310
1478
|
projection: void 0,
|
|
1311
1479
|
skip: void 0,
|
|
1312
1480
|
take: 1e3
|
|
@@ -1327,133 +1495,281 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1327
1495
|
}), t;
|
|
1328
1496
|
}
|
|
1329
1497
|
if (Date.now() - i >= a) throw Error(`Timed out waiting for workflow update '${e.updateName}' (${n})`);
|
|
1330
|
-
await
|
|
1498
|
+
await Tt(o);
|
|
1331
1499
|
}
|
|
1332
|
-
},
|
|
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) => {
|
|
1333
1501
|
if (e) try {
|
|
1334
1502
|
await e.recordEvent(t);
|
|
1335
1503
|
} catch {}
|
|
1336
|
-
},
|
|
1337
|
-
let
|
|
1338
|
-
|
|
1339
|
-
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,
|
|
1340
1508
|
eventType: "signal-awaited",
|
|
1341
|
-
payload: { signalName:
|
|
1509
|
+
payload: { signalName: r.name }
|
|
1342
1510
|
})));
|
|
1343
|
-
let
|
|
1344
|
-
name: `await-signal-timeout/${
|
|
1345
|
-
duration: `${
|
|
1346
|
-
}).pipe(
|
|
1347
|
-
return
|
|
1348
|
-
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,
|
|
1349
1517
|
eventType: "signal-received",
|
|
1350
1518
|
payload: {
|
|
1351
|
-
signalName:
|
|
1352
|
-
value:
|
|
1519
|
+
signalName: r.name,
|
|
1520
|
+
value: p
|
|
1353
1521
|
}
|
|
1354
|
-
}))),
|
|
1355
|
-
}),
|
|
1522
|
+
}))), p;
|
|
1523
|
+
}), Lt = (e) => m.gen(function* () {
|
|
1356
1524
|
let t = e.target.executionId, n = e.target.workflowName;
|
|
1357
1525
|
if (t === void 0 || n === void 0) {
|
|
1358
1526
|
let r = e.store;
|
|
1359
|
-
if (r === void 0) return yield*
|
|
1360
|
-
let i = yield*
|
|
1361
|
-
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),
|
|
1362
1530
|
catch: (e) => e
|
|
1363
1531
|
});
|
|
1364
1532
|
t ??= i.executionId, n ??= i.tag;
|
|
1365
1533
|
}
|
|
1366
1534
|
if (t === void 0 || n === void 0) return { completed: !1 };
|
|
1367
|
-
let r =
|
|
1535
|
+
let r = Nt(n, e.signalName), i = Pt(r), a = new u.TokenParsed({
|
|
1368
1536
|
workflowName: n,
|
|
1369
1537
|
executionId: t,
|
|
1370
1538
|
deferredName: r
|
|
1371
1539
|
}).asToken;
|
|
1372
|
-
return yield*
|
|
1540
|
+
return yield* u.done(i, {
|
|
1373
1541
|
token: a,
|
|
1374
|
-
exit:
|
|
1542
|
+
exit: g.succeed(e.payload)
|
|
1375
1543
|
}), { completed: !0 };
|
|
1376
|
-
}), 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) => {
|
|
1377
1674
|
if (e) try {
|
|
1378
1675
|
await e.recordEvent(t);
|
|
1379
1676
|
} catch {}
|
|
1380
|
-
},
|
|
1381
|
-
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);
|
|
1382
1679
|
return {
|
|
1383
1680
|
errorTag: r && typeof r == "object" && "_tag" in r ? String(r._tag) : null,
|
|
1384
1681
|
errorMessage: r?.message ?? String(r)
|
|
1385
1682
|
};
|
|
1386
|
-
},
|
|
1387
|
-
let
|
|
1388
|
-
let i =
|
|
1389
|
-
if (s === void 0) return yield*
|
|
1390
|
-
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;
|
|
1391
1688
|
for (;;) {
|
|
1392
|
-
let
|
|
1393
|
-
if (
|
|
1394
|
-
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 = {
|
|
1395
1692
|
table: "_voltro_workflow_run_events",
|
|
1396
1693
|
order: [{
|
|
1397
1694
|
column: "occurredAt",
|
|
1398
1695
|
direction: "asc"
|
|
1399
1696
|
}],
|
|
1400
|
-
predicate:
|
|
1697
|
+
predicate: x("runId", u),
|
|
1401
1698
|
projection: void 0,
|
|
1402
1699
|
skip: void 0,
|
|
1403
1700
|
take: 1e3
|
|
1404
|
-
}, i = yield*
|
|
1405
|
-
try: () =>
|
|
1701
|
+
}, i = yield* m.tryPromise({
|
|
1702
|
+
try: () => t.store.query(n),
|
|
1406
1703
|
catch: (e) => e
|
|
1407
|
-
}), 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));
|
|
1408
1705
|
if (c !== void 0) {
|
|
1409
1706
|
let e = c.payload.updateId;
|
|
1410
|
-
yield*
|
|
1411
|
-
runId:
|
|
1707
|
+
yield* m.promise(() => $t(l, {
|
|
1708
|
+
runId: u,
|
|
1412
1709
|
eventType: "update-received",
|
|
1413
1710
|
payload: {
|
|
1414
1711
|
updateId: e,
|
|
1415
|
-
updateName:
|
|
1712
|
+
updateName: r.name
|
|
1416
1713
|
}
|
|
1417
1714
|
}));
|
|
1418
|
-
let t = yield*
|
|
1419
|
-
runId:
|
|
1715
|
+
let t = yield* y.decodeUnknown(r.schema)(c.payload?.value).pipe(m.tapErrorCause((t) => m.promise(() => $t(l, {
|
|
1716
|
+
runId: u,
|
|
1420
1717
|
eventType: "update-failed",
|
|
1421
1718
|
payload: {
|
|
1422
1719
|
updateId: e,
|
|
1423
|
-
updateName:
|
|
1424
|
-
...
|
|
1720
|
+
updateName: r.name,
|
|
1721
|
+
...en(t)
|
|
1425
1722
|
}
|
|
1426
|
-
})))),
|
|
1427
|
-
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,
|
|
1428
1725
|
eventType: "update-failed",
|
|
1429
1726
|
payload: {
|
|
1430
1727
|
updateId: e,
|
|
1431
|
-
updateName:
|
|
1432
|
-
...
|
|
1728
|
+
updateName: r.name,
|
|
1729
|
+
...en(t)
|
|
1433
1730
|
}
|
|
1434
1731
|
}))));
|
|
1435
|
-
return yield*
|
|
1436
|
-
runId:
|
|
1732
|
+
return yield* m.promise(() => $t(l, {
|
|
1733
|
+
runId: u,
|
|
1437
1734
|
eventType: "update-completed",
|
|
1438
1735
|
payload: {
|
|
1439
1736
|
updateId: e,
|
|
1440
|
-
updateName:
|
|
1441
|
-
result:
|
|
1737
|
+
updateName: r.name,
|
|
1738
|
+
result: n
|
|
1442
1739
|
}
|
|
1443
|
-
})),
|
|
1740
|
+
})), n;
|
|
1444
1741
|
}
|
|
1445
|
-
yield*
|
|
1742
|
+
yield* m.sleep(`${f} millis`), f = Math.min(f * 2, a);
|
|
1446
1743
|
}
|
|
1447
1744
|
});
|
|
1448
|
-
return
|
|
1449
|
-
name: `await-update:${
|
|
1450
|
-
success:
|
|
1451
|
-
execute:
|
|
1745
|
+
return c.make({
|
|
1746
|
+
name: `await-update:${r.name}`,
|
|
1747
|
+
success: r.success ?? r.schema,
|
|
1748
|
+
execute: i
|
|
1452
1749
|
});
|
|
1453
|
-
},
|
|
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 = () => {
|
|
1454
1770
|
let e = globalThis.crypto;
|
|
1455
1771
|
return typeof e?.randomUUID == "function" ? e.randomUUID() : `${Date.now().toString(36)}${Math.random().toString(36).slice(2)}`;
|
|
1456
|
-
},
|
|
1772
|
+
}, ln = (e) => `${e}_${cn()}`, Z = (e, t = nn) => {
|
|
1457
1773
|
if (e == null) return e;
|
|
1458
1774
|
try {
|
|
1459
1775
|
let n = JSON.stringify(e);
|
|
@@ -1469,8 +1785,8 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1469
1785
|
let t = {};
|
|
1470
1786
|
for (let [n, r] of Object.entries(e)) t[n] = r instanceof Date ? r.toISOString() : r;
|
|
1471
1787
|
return t;
|
|
1472
|
-
},
|
|
1473
|
-
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;
|
|
1474
1790
|
return {
|
|
1475
1791
|
startStep: async ({ runId: o, stepName: s, attempt: c, stepInput: l, retryPolicy: u }) => {
|
|
1476
1792
|
try {
|
|
@@ -1573,8 +1889,38 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1573
1889
|
return { id: l };
|
|
1574
1890
|
}
|
|
1575
1891
|
};
|
|
1576
|
-
},
|
|
1577
|
-
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 () => {
|
|
1578
1924
|
if (i.onParentClose) try {
|
|
1579
1925
|
await i.onParentClose({
|
|
1580
1926
|
workflowName: i.name,
|
|
@@ -1583,14 +1929,14 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1583
1929
|
status: t
|
|
1584
1930
|
});
|
|
1585
1931
|
} catch (n) {
|
|
1586
|
-
|
|
1932
|
+
h("failed to apply workflow parent-close policy", {
|
|
1587
1933
|
tag: i.name,
|
|
1588
1934
|
executionId: e,
|
|
1589
1935
|
status: t,
|
|
1590
1936
|
reason: n?.message ?? String(n)
|
|
1591
1937
|
});
|
|
1592
1938
|
}
|
|
1593
|
-
}),
|
|
1939
|
+
}), b = (e, t, n) => m.promise(async () => {
|
|
1594
1940
|
if (i.onTerminal) try {
|
|
1595
1941
|
await i.onTerminal({
|
|
1596
1942
|
workflowName: i.name,
|
|
@@ -1599,7 +1945,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1599
1945
|
status: t
|
|
1600
1946
|
});
|
|
1601
1947
|
} catch (n) {
|
|
1602
|
-
|
|
1948
|
+
h("failed to release the workflow admission lease", {
|
|
1603
1949
|
tag: i.name,
|
|
1604
1950
|
executionId: e,
|
|
1605
1951
|
status: t,
|
|
@@ -1607,33 +1953,34 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1607
1953
|
});
|
|
1608
1954
|
}
|
|
1609
1955
|
});
|
|
1610
|
-
return (
|
|
1611
|
-
let
|
|
1612
|
-
let n =
|
|
1613
|
-
|
|
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, {
|
|
1614
1960
|
tag: i.name,
|
|
1615
|
-
executionId:
|
|
1961
|
+
executionId: S,
|
|
1616
1962
|
reason: n?.message ?? String(n)
|
|
1617
1963
|
});
|
|
1618
|
-
}))), D = (i.store.query ? yield*
|
|
1964
|
+
}))), D = (i.store.query ? yield* m.promise(() => i.store.query({
|
|
1619
1965
|
table: "_voltro_workflow_runs",
|
|
1620
1966
|
order: [],
|
|
1621
|
-
predicate:
|
|
1967
|
+
predicate: x("executionId", S),
|
|
1622
1968
|
projection: void 0,
|
|
1623
1969
|
skip: void 0,
|
|
1624
1970
|
take: 1
|
|
1625
1971
|
})) : [])[0], O = D?.workflowVersion ?? null;
|
|
1626
1972
|
if (D?.id !== void 0 && O !== null && i.workflowCompatibleVersions !== void 0 && i.workflowCompatibleVersions !== null && !i.workflowCompatibleVersions.includes(O)) {
|
|
1627
|
-
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, {
|
|
1628
1974
|
status: "failed",
|
|
1629
1975
|
errorTag: "WorkflowVersionIncompatible",
|
|
1630
1976
|
errorMessage: e,
|
|
1631
|
-
completedAt: /* @__PURE__ */ new Date()
|
|
1977
|
+
completedAt: /* @__PURE__ */ new Date(),
|
|
1978
|
+
runnerEnteredAt: null
|
|
1632
1979
|
}));
|
|
1633
|
-
return t &&
|
|
1980
|
+
return t && v?.("workflowRuns", {
|
|
1634
1981
|
op: "update",
|
|
1635
1982
|
row: Q(t)
|
|
1636
|
-
}), yield*
|
|
1983
|
+
}), yield* m.promise(() => f.recordEvent({
|
|
1637
1984
|
runId: D.id,
|
|
1638
1985
|
eventType: "run-failed",
|
|
1639
1986
|
payload: {
|
|
@@ -1643,19 +1990,78 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1643
1990
|
compatibleWith: i.workflowCompatibleVersions,
|
|
1644
1991
|
previousVersion: O
|
|
1645
1992
|
}
|
|
1646
|
-
})), yield*
|
|
1993
|
+
})), yield* m.sync(() => i.recordRun?.({
|
|
1647
1994
|
name: i.name,
|
|
1648
1995
|
status: "failed",
|
|
1649
1996
|
durationMs: 0
|
|
1650
|
-
})), yield*
|
|
1997
|
+
})), yield* m.fail(Error(e));
|
|
1651
1998
|
}
|
|
1652
|
-
|
|
1653
|
-
|
|
1654
|
-
|
|
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"),
|
|
1655
2061
|
tag: i.name,
|
|
1656
|
-
executionId:
|
|
2062
|
+
executionId: S,
|
|
1657
2063
|
status: "running",
|
|
1658
|
-
payload:
|
|
2064
|
+
payload: ee,
|
|
1659
2065
|
workflowVersion: i.workflowVersion ?? null,
|
|
1660
2066
|
workflowPatches: i.workflowPatches ?? null,
|
|
1661
2067
|
output: null,
|
|
@@ -1668,55 +2074,58 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1668
2074
|
completedAt: null,
|
|
1669
2075
|
durationMs: null,
|
|
1670
2076
|
traceId: i.traceId ?? null,
|
|
1671
|
-
parentExecutionId:
|
|
1672
|
-
parentClosePolicy:
|
|
2077
|
+
parentExecutionId: w,
|
|
2078
|
+
parentClosePolicy: ne,
|
|
2079
|
+
runnerEnteredAt: /* @__PURE__ */ new Date(),
|
|
2080
|
+
reclaimCount: 0
|
|
1673
2081
|
}));
|
|
1674
|
-
if (T = e.id,
|
|
2082
|
+
if (T = e.id, v?.("workflowRuns", {
|
|
1675
2083
|
op: "insert",
|
|
1676
2084
|
row: Q(e)
|
|
1677
2085
|
}), T) {
|
|
1678
2086
|
let e = T;
|
|
1679
|
-
yield*
|
|
2087
|
+
yield* m.promise(() => f.recordEvent({
|
|
1680
2088
|
runId: e,
|
|
1681
2089
|
eventType: "run-started",
|
|
1682
2090
|
payload: {
|
|
1683
2091
|
tag: i.name,
|
|
1684
|
-
executionId:
|
|
2092
|
+
executionId: S,
|
|
1685
2093
|
source: i.source ?? null,
|
|
1686
2094
|
workflowVersion: i.workflowVersion ?? null,
|
|
1687
2095
|
workflowPatches: i.workflowPatches ?? null,
|
|
1688
|
-
parentExecutionId:
|
|
1689
|
-
parentClosePolicy:
|
|
2096
|
+
parentExecutionId: w,
|
|
2097
|
+
parentClosePolicy: ne
|
|
1690
2098
|
}
|
|
1691
2099
|
}));
|
|
1692
2100
|
}
|
|
1693
2101
|
}));
|
|
1694
|
-
let
|
|
1695
|
-
if (
|
|
1696
|
-
let e =
|
|
1697
|
-
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({
|
|
1698
2106
|
error: n,
|
|
1699
2107
|
source: "workflow",
|
|
1700
2108
|
name: i.name,
|
|
1701
2109
|
...i.traceId ? { traceId: i.traceId } : {},
|
|
1702
2110
|
fields: {
|
|
1703
|
-
executionId:
|
|
2111
|
+
executionId: S,
|
|
1704
2112
|
suspendedOnFailure: !0,
|
|
1705
2113
|
...r ? { errorTag: r } : {},
|
|
1706
2114
|
...T ? { runId: T } : {}
|
|
1707
2115
|
}
|
|
1708
|
-
}))), T && (yield* E("failed to record workflow suspend",
|
|
1709
|
-
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, {
|
|
1710
2118
|
status: "suspended",
|
|
2119
|
+
runnerEnteredAt: null,
|
|
1711
2120
|
...t ? {
|
|
1712
2121
|
errorTag: r,
|
|
1713
2122
|
errorMessage: a
|
|
1714
2123
|
} : {}
|
|
1715
2124
|
}));
|
|
1716
|
-
e &&
|
|
2125
|
+
e && v?.("workflowRuns", {
|
|
1717
2126
|
op: "update",
|
|
1718
2127
|
row: Q(e)
|
|
1719
|
-
}), yield*
|
|
2128
|
+
}), yield* m.promise(() => f.recordEvent({
|
|
1720
2129
|
runId: T,
|
|
1721
2130
|
eventType: "run-suspended",
|
|
1722
2131
|
payload: t ? {
|
|
@@ -1726,79 +2135,99 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1726
2135
|
} : { reason: "workflow-suspend" }
|
|
1727
2136
|
}));
|
|
1728
2137
|
})));
|
|
1729
|
-
let o = yield*
|
|
1730
|
-
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
|
+
}
|
|
1731
2159
|
}
|
|
1732
|
-
|
|
1733
|
-
|
|
1734
|
-
|
|
1735
|
-
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({
|
|
1736
2163
|
error: n,
|
|
1737
2164
|
source: "workflow",
|
|
1738
2165
|
name: i.name,
|
|
1739
2166
|
...i.traceId ? { traceId: i.traceId } : {},
|
|
1740
2167
|
fields: {
|
|
1741
|
-
executionId:
|
|
2168
|
+
executionId: S,
|
|
1742
2169
|
...r ? { errorTag: r } : {},
|
|
1743
2170
|
...T ? { runId: T } : {}
|
|
1744
2171
|
}
|
|
1745
|
-
})), T && (yield* E("failed to record workflow failure",
|
|
1746
|
-
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, {
|
|
1747
2174
|
status: "failed",
|
|
1748
2175
|
errorTag: r,
|
|
1749
2176
|
errorMessage: a,
|
|
1750
2177
|
completedAt: /* @__PURE__ */ new Date(),
|
|
1751
|
-
durationMs: Date.now() -
|
|
2178
|
+
durationMs: Date.now() - C,
|
|
2179
|
+
runnerEnteredAt: null
|
|
1752
2180
|
}));
|
|
1753
|
-
e &&
|
|
2181
|
+
e && v?.("workflowRuns", {
|
|
1754
2182
|
op: "update",
|
|
1755
2183
|
row: Q(e)
|
|
1756
|
-
}), yield*
|
|
2184
|
+
}), yield* m.promise(() => f.recordEvent({
|
|
1757
2185
|
runId: T,
|
|
1758
2186
|
eventType: "run-failed",
|
|
1759
2187
|
payload: {
|
|
1760
2188
|
errorTag: r,
|
|
1761
2189
|
errorMessage: a,
|
|
1762
|
-
durationMs: Date.now() -
|
|
2190
|
+
durationMs: Date.now() - C
|
|
1763
2191
|
}
|
|
1764
|
-
})), yield*
|
|
1765
|
-
}))), yield*
|
|
2192
|
+
})), yield* y(S, "failed", T);
|
|
2193
|
+
}))), yield* b(S, "failed", T), yield* m.sync(() => i.recordRun?.({
|
|
1766
2194
|
name: i.name,
|
|
1767
2195
|
status: "failed",
|
|
1768
|
-
durationMs: Date.now() -
|
|
1769
|
-
})), yield*
|
|
2196
|
+
durationMs: Date.now() - C
|
|
2197
|
+
})), yield* m.failCause(e);
|
|
1770
2198
|
}
|
|
1771
|
-
let
|
|
1772
|
-
return T && (yield* E("failed to record workflow success",
|
|
1773
|
-
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, {
|
|
1774
2202
|
status: "succeeded",
|
|
1775
|
-
output: Z(
|
|
2203
|
+
output: Z(P, l),
|
|
1776
2204
|
completedAt: /* @__PURE__ */ new Date(),
|
|
1777
|
-
durationMs: Date.now() -
|
|
2205
|
+
durationMs: Date.now() - C,
|
|
2206
|
+
runnerEnteredAt: null
|
|
1778
2207
|
}));
|
|
1779
|
-
e &&
|
|
2208
|
+
e && v?.("workflowRuns", {
|
|
1780
2209
|
op: "update",
|
|
1781
2210
|
row: Q(e)
|
|
1782
|
-
}), yield*
|
|
2211
|
+
}), yield* m.promise(() => f.recordEvent({
|
|
1783
2212
|
runId: T,
|
|
1784
2213
|
eventType: "run-succeeded",
|
|
1785
|
-
payload: { durationMs: Date.now() -
|
|
1786
|
-
})), yield*
|
|
1787
|
-
}))), yield*
|
|
2214
|
+
payload: { durationMs: Date.now() - C }
|
|
2215
|
+
})), yield* y(S, "succeeded", T);
|
|
2216
|
+
}))), yield* b(S, "succeeded", T), yield* m.sync(() => i.recordRun?.({
|
|
1788
2217
|
name: i.name,
|
|
1789
2218
|
status: "succeeded",
|
|
1790
|
-
durationMs: Date.now() -
|
|
2219
|
+
durationMs: Date.now() - C,
|
|
1791
2220
|
completedAtSec: Date.now() / 1e3
|
|
1792
|
-
})),
|
|
2221
|
+
})), P;
|
|
1793
2222
|
});
|
|
1794
|
-
},
|
|
2223
|
+
}, pn = (e) => e === "cancel" || e === "terminate", mn = (e) => e === "running" || e === "suspended", hn = async (e) => {
|
|
1795
2224
|
let t = await e.store.query({
|
|
1796
2225
|
table: "_voltro_workflow_runs",
|
|
1797
2226
|
order: [{
|
|
1798
2227
|
column: "startedAt",
|
|
1799
2228
|
direction: "asc"
|
|
1800
2229
|
}],
|
|
1801
|
-
predicate:
|
|
2230
|
+
predicate: x("parentExecutionId", e.parentExecutionId),
|
|
1802
2231
|
projection: void 0,
|
|
1803
2232
|
skip: void 0,
|
|
1804
2233
|
take: e.limit ?? 1e3
|
|
@@ -1817,7 +2246,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1817
2246
|
});
|
|
1818
2247
|
continue;
|
|
1819
2248
|
}
|
|
1820
|
-
if (!
|
|
2249
|
+
if (!pn(r.parentClosePolicy)) {
|
|
1821
2250
|
n.push({
|
|
1822
2251
|
...t,
|
|
1823
2252
|
action: "skipped",
|
|
@@ -1825,7 +2254,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1825
2254
|
});
|
|
1826
2255
|
continue;
|
|
1827
2256
|
}
|
|
1828
|
-
if (!
|
|
2257
|
+
if (!mn(r.status)) {
|
|
1829
2258
|
n.push({
|
|
1830
2259
|
...t,
|
|
1831
2260
|
action: "skipped",
|
|
@@ -1873,7 +2302,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1873
2302
|
}
|
|
1874
2303
|
}
|
|
1875
2304
|
return n;
|
|
1876
|
-
},
|
|
2305
|
+
}, gn = (e) => {
|
|
1877
2306
|
if (e == null) return null;
|
|
1878
2307
|
if (e instanceof Date) return e;
|
|
1879
2308
|
if (typeof e == "string" || typeof e == "number") {
|
|
@@ -1881,7 +2310,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1881
2310
|
return Number.isNaN(t.getTime()) ? null : t;
|
|
1882
2311
|
}
|
|
1883
2312
|
return null;
|
|
1884
|
-
},
|
|
2313
|
+
}, _n = (e) => typeof e == "number" ? e : e == null ? null : Number(e), $ = (e) => e == null ? null : String(e), vn = (e) => {
|
|
1885
2314
|
let t = /* @__PURE__ */ new Map();
|
|
1886
2315
|
for (let n of e) {
|
|
1887
2316
|
let e = String(n.stepName), r = t.get(e);
|
|
@@ -1889,27 +2318,27 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1889
2318
|
}
|
|
1890
2319
|
let n = [];
|
|
1891
2320
|
for (let [e, r] of t) {
|
|
1892
|
-
r.sort((e, t) => (
|
|
2321
|
+
r.sort((e, t) => (_n(e.attempt) ?? 0) - (_n(t.attempt) ?? 0));
|
|
1893
2322
|
let t = r[r.length - 1], i = $(t.errorTag), a = $(t.errorMessage), o = i !== null || a !== null ? {
|
|
1894
2323
|
tag: i,
|
|
1895
2324
|
message: a ?? ""
|
|
1896
2325
|
} : null;
|
|
1897
2326
|
n.push({
|
|
1898
2327
|
name: e,
|
|
1899
|
-
attempt:
|
|
2328
|
+
attempt: _n(t.attempt) ?? r.length,
|
|
1900
2329
|
attempts: r.length,
|
|
1901
2330
|
status: t.status ?? "running",
|
|
1902
2331
|
input: t.input ?? null,
|
|
1903
2332
|
output: t.output ?? null,
|
|
1904
2333
|
error: o,
|
|
1905
|
-
durationMs:
|
|
2334
|
+
durationMs: _n(t.durationMs)
|
|
1906
2335
|
});
|
|
1907
2336
|
}
|
|
1908
2337
|
return n.sort((t, n) => {
|
|
1909
2338
|
let r = e.find((e) => String(e.stepName) === t.name), i = e.find((e) => String(e.stepName) === n.name);
|
|
1910
|
-
return (
|
|
2339
|
+
return (gn(r?.startedAt)?.getTime() ?? 0) - (gn(i?.startedAt)?.getTime() ?? 0);
|
|
1911
2340
|
}), n;
|
|
1912
|
-
},
|
|
2341
|
+
}, yn = (e) => {
|
|
1913
2342
|
if (e == null) return null;
|
|
1914
2343
|
if (typeof e == "string") try {
|
|
1915
2344
|
return JSON.parse(e);
|
|
@@ -1917,10 +2346,10 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1917
2346
|
return null;
|
|
1918
2347
|
}
|
|
1919
2348
|
return typeof e == "object" ? e : null;
|
|
1920
|
-
},
|
|
1921
|
-
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];
|
|
1922
2351
|
if (r === void 0) return null;
|
|
1923
|
-
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);
|
|
1924
2353
|
return {
|
|
1925
2354
|
id: i,
|
|
1926
2355
|
executionId: $(r.executionId) ?? "",
|
|
@@ -1928,19 +2357,19 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1928
2357
|
status: r.status ?? "running",
|
|
1929
2358
|
input: r.payload ?? null,
|
|
1930
2359
|
output: r.output ?? null,
|
|
1931
|
-
subject:
|
|
2360
|
+
subject: yn(r.subject),
|
|
1932
2361
|
source: $(r.source),
|
|
1933
|
-
steps:
|
|
1934
|
-
startedAt:
|
|
1935
|
-
finishedAt:
|
|
2362
|
+
steps: vn(o),
|
|
2363
|
+
startedAt: gn(r.startedAt) ?? /* @__PURE__ */ new Date(0),
|
|
2364
|
+
finishedAt: gn(r.completedAt),
|
|
1936
2365
|
traceId: $(r.traceId),
|
|
1937
2366
|
parentExecutionId: $(r.parentExecutionId),
|
|
1938
2367
|
parentClosePolicy: $(r.parentClosePolicy)
|
|
1939
2368
|
};
|
|
1940
|
-
},
|
|
1941
|
-
let e = [],
|
|
2369
|
+
}, xn = () => {
|
|
2370
|
+
let e = [], t = [], r = 0, i = 0;
|
|
1942
2371
|
return {
|
|
1943
|
-
layer:
|
|
2372
|
+
layer: v.succeed(n, {
|
|
1944
2373
|
startStep: async ({ runId: t, stepName: n, attempt: i, stepInput: a, retryPolicy: o }) => {
|
|
1945
2374
|
let s = `wfstep_mem_${++r}`;
|
|
1946
2375
|
return e.push({
|
|
@@ -1968,12 +2397,12 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1968
2397
|
let o = e.find((e) => e.id === t);
|
|
1969
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);
|
|
1970
2399
|
},
|
|
1971
|
-
recordEvent: async ({ runId: e, eventType:
|
|
2400
|
+
recordEvent: async ({ runId: e, eventType: n, payload: r, stepName: a, attempt: o }) => {
|
|
1972
2401
|
let s = `wfev_mem_${++i}`;
|
|
1973
|
-
return
|
|
2402
|
+
return t.push({
|
|
1974
2403
|
id: s,
|
|
1975
2404
|
runId: e,
|
|
1976
|
-
eventType:
|
|
2405
|
+
eventType: n,
|
|
1977
2406
|
payload: r ?? null,
|
|
1978
2407
|
stepName: a ?? null,
|
|
1979
2408
|
attempt: o ?? null,
|
|
@@ -1982,8 +2411,8 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
|
|
|
1982
2411
|
}
|
|
1983
2412
|
}),
|
|
1984
2413
|
readSteps: () => e,
|
|
1985
|
-
readEvents: () =>
|
|
2414
|
+
readEvents: () => t
|
|
1986
2415
|
};
|
|
1987
2416
|
};
|
|
1988
2417
|
//#endregion
|
|
1989
|
-
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 };
|