@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.
@@ -1,117 +1,119 @@
1
- import { C as e, E as t, T as n, w as r } from "./primitives-Bp98_F5L.js";
2
- import { Activity as i, DurableClock as a, DurableDeferred as o, Workflow as s, WorkflowEngine as c } from "@effect/workflow";
3
- import { Cause as l, Effect as u, Either as d, Exit as f, FiberRef as p, Layer as m, Schema as h } from "effect";
4
- import { and as g, boolean as _, eq as v, gt as y, gte as b, id as x, integer as S, isNull as C, json as w, or as T, queryFor as E, reference as D, table as O, text as k, timestamp as A } from "@voltro/database";
5
- import { createHash as ee } from "node:crypto";
6
- import { WorkflowInstance as te } from "@effect/workflow/WorkflowEngine";
7
- import { publishServerError as ne } from "@voltro/protocol";
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 j = c.layerMemory, M = O("_voltro_workflow_runs", {
10
- id: x({ prefix: "wfrun" }),
11
- tag: k(),
12
- executionId: k().unique(),
13
- status: k().oneOf([
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: w(),
21
- workflowVersion: k().nullable(),
22
- workflowPatches: w().nullable(),
23
- output: w().nullable(),
24
- subject: w().nullable(),
25
- source: k().nullable(),
26
- errorTag: k().nullable(),
27
- errorMessage: k().nullable(),
28
- cancelled: _().default(!1),
29
- discardedAt: A().nullable(),
30
- discardedBy: k().nullable(),
31
- startedAt: A().default("now"),
32
- completedAt: A().nullable(),
33
- durationMs: S().nullable(),
34
- traceId: k().nullable(),
35
- parentExecutionId: k().nullable(),
36
- parentClosePolicy: k().oneOf([
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"]), N = O("_voltro_workflow_run_steps", {
42
- id: x({ prefix: "wfstep" }),
43
- runId: D(() => M, {
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: k(),
48
- attempt: S().default(1),
49
- status: k().oneOf([
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: w().nullable(),
55
- retryPolicy: w().nullable(),
56
- output: w().nullable(),
57
- errorTag: k().nullable(),
58
- errorMessage: k().nullable(),
59
- errorCause: w().nullable(),
60
- startedAt: A().default("now"),
61
- completedAt: A().nullable(),
62
- durationMs: S().nullable()
63
- }).index(["runId", "stepName"]).index(["startedAt"]), re = O("_voltro_workflow_run_events", {
64
- id: x({ prefix: "wfev" }),
65
- runId: D(() => M, {
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: k(),
70
- payload: w().nullable(),
71
- occurredAt: A().default("now"),
72
- stepName: k().nullable(),
73
- attempt: S().nullable()
74
- }).index(["runId", "occurredAt"]).index(["eventType"]), ie = O("_voltro_workflow_start_contexts", {
75
- id: x({ prefix: "wfctx" }),
76
- workflowName: k(),
77
- executionId: k().unique(),
78
- subject: w().nullable(),
79
- traceId: k().nullable(),
80
- source: k().nullable(),
81
- parentExecutionId: k().nullable(),
82
- parentClosePolicy: k().oneOf([
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: A().default("now")
88
- }).index(["workflowName"]).index(["executionId"]).index(["parentExecutionId"]), ae = O("_voltro_workflow_pending", {
89
- id: x({ prefix: "wfp" }),
90
- tenantId: k().nullable(),
91
- workflowName: k(),
92
- controlKey: k(),
93
- mode: k().oneOf([
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: w(),
101
- callerContext: w().nullable(),
102
- priority: S().default(0),
103
- dueAt: A(),
104
- deadlineAt: A().nullable(),
105
- collapsed: S().default(1),
106
- firstSeenAt: A().default("now"),
107
- updatedAt: A().default("now"),
108
- attempts: S().default(0),
109
- lastError: k().nullable()
110
- }).index(["workflowName", "controlKey"]).index(["dueAt"]).index(["workflowName", "mode"]).index(["tenantId"]), oe = O("_voltro_workflow_admissions", {
111
- id: x({ prefix: "wfadm" }),
112
- tenantId: k().nullable(),
113
- workflowName: k(),
114
- outcome: k().oneOf([
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: k().nullable(),
123
- reason: k().nullable(),
124
- collapsed: S().default(1),
125
- waitedMs: S().nullable(),
126
- executionId: k().nullable(),
127
- runId: k().nullable(),
128
- singletonKey: k().nullable(),
129
- concurrencyKey: k().nullable(),
130
- rateKey: k().nullable(),
131
- admittedAt: A().default("now"),
132
- expiresAt: A().nullable(),
133
- releasedAt: A().nullable()
134
- }).index(["workflowName", "admittedAt"]).index(["concurrencyKey", "releasedAt"]).index(["singletonKey", "releasedAt"]).index(["rateKey", "admittedAt"]).index(["executionId"]).index(["tenantId"]), se = O("_voltro_workflow_pauses", {
135
- id: x({ prefix: "wfpause" }),
136
- pausedAt: A().default("now"),
137
- pausedBy: k().nullable(),
138
- reason: k().nullable()
139
- }), ce = class extends Error {
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
- }, P = (e, t, n, r) => {
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 ce(e, t, n);
153
+ throw new ge(e, t, n);
152
154
  }
153
- }, le = (e, t) => e === void 0 ? t : `pool\u0000${e}\u0000${t}`, F = (e, t) => {
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 ce(n, "priority", e);
162
+ throw new ge(n, "priority", e);
161
163
  }
162
164
  return {
163
- ...e.debounce === void 0 ? {} : { debounceKey: P(n, "debounce.key", e.debounce.key, t) },
164
- ...e.singleton === void 0 ? {} : { singletonKey: P(n, "singleton.key", e.singleton.key, t) },
165
- ...e.concurrency === void 0 ? {} : { concurrencyKey: le(e.concurrency.pool, e.concurrency.key === void 0 ? "" : P(n, "concurrency.key", e.concurrency.key, t)) },
166
- ...e.throttle?.key === void 0 ? e.throttle === void 0 ? {} : { throttleKey: "" } : { throttleKey: P(n, "throttle.key", e.throttle.key, t) },
167
- ...e.rateLimit?.key === void 0 ? e.rateLimit === void 0 ? {} : { rateLimitKey: "" } : { rateLimitKey: P(n, "rateLimit.key", e.rateLimit.key, t) },
168
- ...e.batch?.key === void 0 ? e.batch === void 0 ? {} : { batchKey: "" } : { batchKey: P(n, "batch.key", e.batch.key, t) },
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
- }, ue = (e, t, n, r) => {
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
- }, de = (e) => {
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 = ue(r.recentAdmissions ?? [], t.rateLimit.limit, t.rateLimit.periodMs, i);
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
- ...I(t, r)
207
+ ...L(t, r)
206
208
  } : {
207
209
  kind: "admit",
208
210
  reason: "debounce-elapsed",
209
211
  keys: n,
210
- ...I(t, r)
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
- ...I(t, r)
228
+ ...L(t, r)
227
229
  } : a && i >= s ? {
228
230
  kind: "admit",
229
231
  reason: "batch-timeout",
230
232
  keys: n,
231
- ...I(t, r)
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 = ue(r.recentAdmissions ?? [], t.throttle.limit, t.throttle.periodMs, i);
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: fe(t) ? "under-limits" : "no-controls",
260
+ reason: be(t) ? "under-limits" : "no-controls",
259
261
  keys: n,
260
- ...I(t, r)
262
+ ...L(t, r)
261
263
  };
262
- }, fe = (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, I = (e, t) => e.singleton?.mode === "cancel" && t.singletonHolder !== void 0 ? { evict: t.singletonHolder } : {}, pe = (e, t, n) => {
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
- }, me = (e, t, n) => {
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
- }, he = (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, L = "_voltro_workflow_pending", R = "_voltro_workflow_admissions", z = "_voltro_workflow_pauses", ge = 1440 * 60 * 1e3, _e = (e, t, n) => `wfp_${ee("sha256").update(`${e}\u0000${t}\u0000${n}`).digest("hex").slice(0, 40)}`, B = (e) => {
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
- }, V = (e, t) => {
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
- }, ve = (e) => ({
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: V(e.priority, 0),
285
- dueAt: B(e.dueAt),
286
- deadlineAt: e.deadlineAt === null || e.deadlineAt === void 0 ? void 0 : B(e.deadlineAt),
287
- collapsed: V(e.collapsed, 1),
288
- firstSeenAt: B(e.firstSeenAt),
289
- attempts: V(e.attempts, 0),
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
- }), H = (e, t, n, r) => ({
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
- }), ye = async (e) => {
299
- let t = await e.query(H(z, void 0, [], 1e3));
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
- }, be = async (e, t, n, r) => {
302
- await e.upsert(z, {
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
- }, xe = async (e, t) => e.delete(z, t), Se = async (e) => {
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(H(L, g(v("workflowName", n.workflowName), v("controlKey", r.debounceKey), v("mode", "debounce")), [], 1)))[0];
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 : B(e.deadlineAt);
322
+ let i = e.deadlineAt === null || e.deadlineAt === void 0 ? void 0 : V(e.deadlineAt);
321
323
  a.debouncePending = {
322
- firstSeenAt: B(e.firstSeenAt),
323
- collapsed: V(e.collapsed, 1),
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(H(L, g(v("workflowName", n.workflowName), v("controlKey", r.batchKey), v("mode", "batch")), [{
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: B(e[0].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 Ce(t, n.workflowName, r.singletonKey, i);
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 ? [v("workflowName", n.workflowName)] : [], o = await t.query(H(R, g(...e, v("concurrencyKey", r.concurrencyKey), C("releasedAt"), y("expiresAt", new Date(i))), [], n.concurrency.limit));
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(H(R, g(v("workflowName", n.workflowName), v("rateKey", c), v("outcome", "admitted"), y("admittedAt", new Date(i - s.periodMs))), [{
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) => B(e.admittedAt));
350
+ a.recentAdmissions = e.map((e) => V(e.admittedAt));
349
351
  })()), await Promise.all(o), a;
350
- }, Ce = async (e, t, n, r) => {
351
- let i = (await e.query(H(R, g(v("workflowName", t), v("singletonKey", n), C("releasedAt"), y("expiresAt", new Date(r))), [{
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: B(i.admittedAt)
362
+ admittedAt: V(i.admittedAt)
361
363
  };
362
- }, we = async (e) => {
363
- let { store: t, control: n, decision: r, now: i } = e, a = Te(r.mode, r.keys);
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 ?? _e(n.workflowName, r.mode, a);
366
- return await t.update(L, o, {
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 = _e(n.workflowName, r.mode, a);
373
- return await t.upsert(L, {
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: V(t.collapsed, 1) + 1,
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(L, {
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
- }, Te = (e, t) => {
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
- }, U = async (e) => {
428
- let { control: t, keys: n, now: r } = e, i = t.timeouts?.finishMs ?? 864e5, a = await e.store.insert(R, {
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
- }, Ee = async (e, t, n) => {
447
- let r = await e.query(H(R, g(v("executionId", t), v("outcome", "admitted"), C("releasedAt")), [], 10));
448
- return r.length === 0 ? !1 : (await Promise.all(r.map((t) => e.update(R, String(t.id), { releasedAt: new Date(n) }))), !0);
449
- }, De = async (e, t, n) => (await e.query(H(L, void 0, [{
450
- column: "priority",
451
- direction: "desc"
452
- }, {
453
- column: "firstSeenAt",
454
- direction: "asc"
455
- }], n))).map(ve).filter((e) => e.dueAt <= t).sort(he), Oe = async (e, t) => (await e.query(H(L, void 0, [{
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(ve), W = async (e, t) => e.delete(L, t), ke = async (e, t, n, r) => {
459
- let i = (await e.query(H(L, v("id", t), [], 1)))[0];
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 = ve(i);
470
+ let a = Ee(i);
462
471
  try {
463
- await e.insert(R, {
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(L, t);
482
- }, Ae = async (e, t, n, r) => {
483
- await e.update(L, t.id, {
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
- }, G = async (e) => {
489
- let t = await Se({
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 de({
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
- }, je = async (e, t, n = 1e3) => {
504
- let r = await e.query(H(R, void 0, [{
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 && B(e.admittedAt) < i);
508
- return await Promise.all(a.map((t) => e.delete(R, String(t.id)))), a.length;
509
- }, Me = async (e) => {
510
- let { store: t, control: n, now: r } = e, i = F(n, e.payload), a = await G({
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 U({
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 U({
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 we({
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 Ne(t, n.workflowName, i.batchKey, n.batch.maxSize);
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 U({
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
- }, Ne = async (e, t, n, r) => (await e.query({
606
+ }, Ue = async (e, t, n, r) => (await e.query({
598
607
  table: "_voltro_workflow_pending",
599
- predicate: g(v("workflowName", t), v("controlKey", n), v("mode", "batch")),
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
- })), Pe = async (e, t, n, r) => {
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
- }, Fe = O("_voltro_workflow_watermarks", {
616
- id: x({ prefix: "wfwm" }),
617
- positionAt: A(),
618
- updatedAt: A().default("now")
619
- }), Ie = (e) => {
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
- }, Le = (e) => {
623
- let t = [], n = [], r = [], i = /* @__PURE__ */ new Set(), a = /* @__PURE__ */ new Set(), o = e.payloadSchema === void 0 ? (e) => d.right(e) : (t) => {
624
- let n = h.decodeUnknownEither(e.payloadSchema)(t);
625
- return d.isRight(n) ? d.right(n.right) : d.left(Ie(n.left));
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 = h.decodeUnknownEither(o.schema)(l.payload);
636
- if (d.isLeft(u)) {
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: Ie(u.left)
651
+ detail: Ke(u.left)
643
652
  });
644
653
  continue;
645
654
  }
646
- let f = u.right, p = (e) => e.getTime() > l.occurredAt.getTime() ? !1 : o.withinMs === void 0 || l.occurredAt.getTime() - e.getTime() <= o.withinMs, m = (t, n) => {
647
- if (d.isLeft(t)) return r.push({
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(f, t.right) === !0;
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: Ie(t)
671
+ detail: Ke(t)
663
672
  }), !1;
664
673
  }
665
674
  };
666
- for (let { run: e, decoded: n } of s) i.has(e.runId) || p(e.startedAt) && m(n, e.runId) && (i.add(e.runId), t.push({
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) || p(e.firstSeenAt) && m(t, e.intentId) && (a.add(e.intentId), n.push({
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
- }, Re = (e) => {
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
- }, ze = "_voltro_workflow_watermarks", Be = "_voltro_workflow_events", K = "cancelOn", Ve = 3600 * 1e3, He = 500, q = (e) => {
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), Ue = async (e, t) => q((await e.query({
697
- table: ze,
698
- predicate: v("id", t),
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), We = async (e, t, n) => {
704
- await e.upsert(ze, {
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
- }, Ge = async (e, t, n) => {
730
+ }, tt = async (e, t, n) => {
722
731
  let r = async (r) => e.query({
723
732
  table: "_voltro_workflow_runs",
724
- predicate: g(v("tag", t), v("status", r)),
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
- }, Ke = async (e, t, n) => (await e.query({
751
+ }, nt = async (e, t, n) => (await e.query({
743
752
  table: "_voltro_workflow_pending",
744
- predicate: v("workflowName", t),
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
- }), qe = async (e, t) => {
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 Ue(e.store, K), c = s ?? new Date(r - a), l = await e.store.query({
775
- table: Be,
776
- predicate: b("occurredAt", c),
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 Ge(e.store, t.workflowName, _), i = await Ke(e.store, t.workflowName, _), (r.length >= _ || i.length >= _) && (h = !0);
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 = Le({
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 = Re(u), y = s;
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 We(e.store, K, v), y = v;
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 We(e.store, K, c), y = c;
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
- }, Je = {
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
- }, Ye = 200, Xe = async (e, t = {}) => {
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 ye(e.store), o = await De(e.store, n(), i);
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) }), Je;
1065
+ return r?.warn?.("workflow flow control: could not read the admission queue", { cause: String(e) }), pt;
899
1066
  }
900
- let s = {
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
- }, c = /* @__PURE__ */ new Map(), l = [];
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 = c.get(t);
914
- n === void 0 ? c.set(t, [e]) : n.push(e);
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
- l.push(e);
1084
+ u.push(e);
918
1085
  }
919
- for (let t of l) try {
920
- await Ze(e, t, a, s, n());
1086
+ for (let t of u) try {
1087
+ await gt(e, t, a, c, n());
921
1088
  } catch (i) {
922
- s.failed++, r?.warn?.("workflow flow control: an intent failed to drain", {
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 Ae(e.store, t, String(i), n()).catch(() => {});
1093
+ }), await ze(e.store, t, String(i), n()).catch(() => {});
927
1094
  }
928
- for (let t of c.values()) try {
929
- await Qe(e, t, a, s, n());
1095
+ for (let t of l.values()) try {
1096
+ await _t(e, t, a, c, n());
930
1097
  } catch (i) {
931
- s.failed++;
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 Ae(e.store, a, String(i), n()).catch(() => {});
1104
+ }), a !== void 0 && await ze(e.store, a, String(i), n()).catch(() => {});
938
1105
  }
939
- return s.timedOut = await et(e, n()).catch(() => 0), {
940
- ...s,
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
- }, Ze = async (e, t, n, r, i) => {
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 W(e.store, t.id), r.expired++;
1119
+ }), await G(e.store, t.id), r.expired++;
952
1120
  return;
953
1121
  }
954
- if (pe(a, t, i)) {
955
- await U({
1122
+ if (xe(a, t, i)) {
1123
+ await W({
956
1124
  store: e.store,
957
1125
  control: a,
958
- keys: F(a, t.payload),
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 W(e.store, t.id), r.expired++;
1141
+ }), await G(e.store, t.id), r.expired++;
974
1142
  return;
975
1143
  }
976
- let o = F(a, t.payload);
977
- await $e(e, {
1144
+ let o = I(a, t.payload);
1145
+ await vt(e, {
978
1146
  control: a,
979
1147
  intent: t,
980
- decision: await G({
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
- }, Qe = async (e, t, n, r, i) => {
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 W(e.store, n.id);
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 (pe(o, c, i)) {
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 W(e.store, t.id);
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 = F(o, c.payload);
1015
- await $e(e, {
1182
+ let l = I(o, c.payload);
1183
+ await vt(e, {
1016
1184
  control: o,
1017
1185
  intent: c,
1018
- decision: await G({
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
- }, $e = async (e, t) => {
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 we({
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 U({
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 W(e.store, t.id);
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 U({
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 W(e.store, t.id);
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 Ee(e.store, i.evict.executionId, s), await U({
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 U({
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 W(e.store, t.id);
1281
+ for (let t of c ?? [r]) await G(e.store, t.id);
1114
1282
  o.admitted++;
1115
- }, et = async (e, t) => {
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) me(r, {
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 Ee(e.store, a.executionId, t), await e.onAbandoned({
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
- }, tt = async (e, t) => {
1300
+ }, bt = async (e, t) => {
1133
1301
  if (e) try {
1134
1302
  await e.recordEvent(t);
1135
1303
  } catch {}
1136
- }, nt = (e, n) => {
1137
- let a = u.gen(function* () {
1138
- let i = n.pollIntervalMs ?? 200, a = n.maxPollIntervalMs ?? 5e3, o = n.timeoutMs ?? 1440 * 6e4, s = yield* r, c = yield* u.serviceOption(t), l = c._tag === "Some" ? c.value : void 0;
1139
- if (s === void 0) return yield* u.die(/* @__PURE__ */ Error("awaitSignal: no active workflow run id in scope"));
1140
- let d = s;
1141
- yield* u.promise(() => tt(l, {
1142
- runId: d,
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: n.name }
1312
+ payload: { signalName: r.name }
1145
1313
  }));
1146
- let f = Date.now(), p = i;
1314
+ let d = Date.now(), f = i;
1147
1315
  for (;;) {
1148
- let t = Date.now() - f;
1149
- if (t > o) return yield* u.die(/* @__PURE__ */ Error(`awaitSignal('${n.name}') timed out after ${t}ms`));
1150
- let r = {
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: g(v("runId", d), v("eventType", "signal-sent")),
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* u.tryPromise({
1161
- try: () => e.store.query(r),
1328
+ }, i = (yield* m.tryPromise({
1329
+ try: () => t.store.query(n),
1162
1330
  catch: (e) => e
1163
- })).find((e) => e.payload?.signalName === n.name);
1331
+ })).find((e) => e.payload?.signalName === r.name);
1164
1332
  if (i !== void 0) {
1165
- let e = yield* h.decodeUnknown(n.schema)(i.payload?.value);
1166
- return yield* u.promise(() => tt(l, {
1167
- runId: d,
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: n.name,
1338
+ signalName: r.name,
1171
1339
  value: i.payload?.value
1172
1340
  }
1173
1341
  })), e;
1174
1342
  }
1175
- yield* u.sleep(`${p} millis`), p = Math.min(p * 2, a);
1343
+ yield* m.sleep(`${f} millis`), f = Math.min(f * 2, a);
1176
1344
  }
1177
1345
  });
1178
- return i.make({
1179
- name: `await-signal:${n.name}`,
1180
- success: n.schema,
1181
- execute: a
1346
+ return c.make({
1347
+ name: `await-signal:${r.name}`,
1348
+ success: r.schema,
1349
+ execute: i
1182
1350
  });
1183
- }, rt = async (e, t) => {
1351
+ }, St = async (e, t) => {
1184
1352
  if (e !== void 0) try {
1185
1353
  await e.recordEvent(t);
1186
1354
  } catch {}
1187
- }, it = (e, n) => {
1188
- let a = u.gen(function* () {
1189
- let i = n.pollIntervalMs ?? 200, a = n.maxPollIntervalMs ?? 5e3, o = n.timeoutMs ?? 1440 * 6e4, s = n.take ?? 500, c = yield* r, l = yield* u.serviceOption(t), d = l._tag === "Some" ? l.value : void 0;
1190
- if (c === void 0) return yield* u.die(/* @__PURE__ */ Error("awaitEvent: no active workflow run id in scope"));
1191
- let f = c, p = yield* n.since === "run-start" ? at(e, f) : u.succeed(/* @__PURE__ */ new Date());
1192
- yield* u.promise(() => rt(d, {
1193
- runId: f,
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: n.event,
1197
- since: n.since ?? "wait-start",
1198
- cutoff: p.toISOString()
1364
+ event: r.event,
1365
+ since: r.since ?? "wait-start",
1366
+ cutoff: f.toISOString()
1199
1367
  }
1200
1368
  }));
1201
- let m = Date.now(), _ = i, y = 0;
1369
+ let p = Date.now(), h = i, g = 0;
1202
1370
  for (;;) {
1203
- let t = Date.now() - m;
1204
- if (t > o) return yield* u.die(/* @__PURE__ */ Error(`awaitEvent('${n.event}') timed out after ${t}ms having examined ${y} candidate event(s). ${y === 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."}`));
1205
- let r = {
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: g(v("name", n.event), b("occurredAt", p)),
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* u.tryPromise({
1216
- try: () => e.store.query(r),
1383
+ }, i = yield* m.tryPromise({
1384
+ try: () => t.store.query(n),
1217
1385
  catch: (e) => e
1218
1386
  });
1219
- y = i.length;
1387
+ g = i.length;
1220
1388
  for (let e of i) {
1221
- let t = yield* h.decodeUnknown(n.schema)(e.payload);
1222
- if (n.match(t)) return yield* u.promise(() => rt(d, {
1223
- runId: f,
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: n.event,
1394
+ event: r.event,
1227
1395
  eventId: e.id
1228
1396
  }
1229
1397
  })), t;
1230
1398
  }
1231
- yield* u.sleep(`${_} millis`), _ = Math.min(_ * 2, a);
1399
+ yield* m.sleep(`${h} millis`), h = Math.min(h * 2, a);
1232
1400
  }
1233
1401
  });
1234
- return i.make({
1235
- name: `awaitEvent:${n.event}`,
1236
- success: n.schema,
1237
- execute: a
1402
+ return c.make({
1403
+ name: `awaitEvent:${r.event}`,
1404
+ success: r.schema,
1405
+ execute: i
1238
1406
  });
1239
- }, at = (e, t) => u.gen(function* () {
1240
- let n = (yield* u.tryPromise({
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: v("id", t),
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
- }), ot = (e) => new Promise((t) => setTimeout(t, e)), st = () => {
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
- }, ct = () => `wfu_${st()}`, Y = async (e, t) => {
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: v("id", n),
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: v("executionId", n),
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
- }, lt = async (e) => {
1283
- let t = await Y(e.store, e.target);
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
- }, ut = async (e) => {
1293
- let t = await Y(e.store, e.target), n = ct(), r = await e.recorder.recordEvent({
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: v("runId", t.id),
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 ot(o);
1498
+ await Tt(o);
1331
1499
  }
1332
- }, dt = 1440 * 6e4, ft = "voltro/suspending-signal", pt = (e, t) => `${ft}/${e}/${t}`, mt = (e) => o.make(e, { success: h.Unknown }), ht = async (e, t) => {
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
- }, gt = (e, n) => u.gen(function* () {
1337
- let e = n.timeoutMs ?? dt, i = mt(pt((yield* c.WorkflowInstance).workflow.name, n.name)), s = yield* r, l = yield* u.serviceOption(t), d = l._tag === "Some" ? l.value : void 0;
1338
- s !== void 0 && (yield* u.promise(() => ht(d, {
1339
- runId: s,
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: n.name }
1509
+ payload: { signalName: r.name }
1342
1510
  })));
1343
- let f = o.await(i), p = Number.isFinite(e) ? yield* u.race(f, a.sleep({
1344
- name: `await-signal-timeout/${n.name}`,
1345
- duration: `${e} millis`
1346
- }).pipe(u.andThen(u.die(/* @__PURE__ */ Error(`awaitSignalSuspending('${n.name}') timed out after ${e}ms`))))) : yield* f, m = yield* h.decodeUnknown(n.schema)(p);
1347
- return s !== void 0 && (yield* u.promise(() => ht(d, {
1348
- runId: s,
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: n.name,
1352
- value: m
1519
+ signalName: r.name,
1520
+ value: p
1353
1521
  }
1354
- }))), m;
1355
- }), _t = (e) => u.gen(function* () {
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* u.die(/* @__PURE__ */ Error("completeSuspendingSignal: provide a store, or target.executionId AND target.workflowName"));
1360
- let i = yield* u.tryPromise({
1361
- try: () => Y(r, e.target),
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 = pt(n, e.signalName), i = mt(r), a = new o.TokenParsed({
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* o.done(i, {
1540
+ return yield* u.done(i, {
1373
1541
  token: a,
1374
- exit: f.succeed(e.payload)
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
- }, vt = (e) => {
1381
- let t = l.failureOption(e), n = Array.from(l.defects(e)), r = t._tag === "Some" ? t.value : n[0] ?? l.squash(e);
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
- }, yt = (e, n) => {
1387
- let a = u.gen(function* () {
1388
- let i = n.pollIntervalMs ?? 200, a = n.maxPollIntervalMs ?? 5e3, o = n.timeoutMs ?? 3e4, s = yield* r, c = yield* u.serviceOption(t), l = c._tag === "Some" ? c.value : void 0;
1389
- if (s === void 0) return yield* u.die(/* @__PURE__ */ Error("awaitUpdate: no active workflow run id in scope"));
1390
- let d = s, f = Date.now(), p = i;
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 t = Date.now() - f;
1393
- if (t > o) return yield* u.die(/* @__PURE__ */ Error(`awaitUpdate('${n.name}') timed out after ${t}ms`));
1394
- let r = {
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: v("runId", d),
1697
+ predicate: x("runId", u),
1401
1698
  projection: void 0,
1402
1699
  skip: void 0,
1403
1700
  take: 1e3
1404
- }, i = yield* u.tryPromise({
1405
- try: () => e.store.query(r),
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 === n.name && typeof e.payload.updateId == "string" && !s.has(e.payload.updateId));
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* u.promise(() => X(l, {
1411
- runId: d,
1707
+ yield* m.promise(() => $t(l, {
1708
+ runId: u,
1412
1709
  eventType: "update-received",
1413
1710
  payload: {
1414
1711
  updateId: e,
1415
- updateName: n.name
1712
+ updateName: r.name
1416
1713
  }
1417
1714
  }));
1418
- let t = yield* h.decodeUnknown(n.schema)(c.payload?.value).pipe(u.tapErrorCause((t) => u.promise(() => X(l, {
1419
- runId: d,
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: n.name,
1424
- ...vt(t)
1720
+ updateName: r.name,
1721
+ ...en(t)
1425
1722
  }
1426
- })))), r = yield* (n.handle ? n.handle(t) : u.succeed(t)).pipe(u.flatMap((e) => n.success ? h.decodeUnknown(n.success)(e) : u.succeed(e))).pipe(u.tapErrorCause((t) => u.promise(() => X(l, {
1427
- runId: d,
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: n.name,
1432
- ...vt(t)
1728
+ updateName: r.name,
1729
+ ...en(t)
1433
1730
  }
1434
1731
  }))));
1435
- return yield* u.promise(() => X(l, {
1436
- runId: d,
1732
+ return yield* m.promise(() => $t(l, {
1733
+ runId: u,
1437
1734
  eventType: "update-completed",
1438
1735
  payload: {
1439
1736
  updateId: e,
1440
- updateName: n.name,
1441
- result: r
1737
+ updateName: r.name,
1738
+ result: n
1442
1739
  }
1443
- })), r;
1740
+ })), n;
1444
1741
  }
1445
- yield* u.sleep(`${p} millis`), p = Math.min(p * 2, a);
1742
+ yield* m.sleep(`${f} millis`), f = Math.min(f * 2, a);
1446
1743
  }
1447
1744
  });
1448
- return i.make({
1449
- name: `await-update:${n.name}`,
1450
- success: n.success ?? n.schema,
1451
- execute: a
1745
+ return c.make({
1746
+ name: `await-update:${r.name}`,
1747
+ success: r.success ?? r.schema,
1748
+ execute: i
1452
1749
  });
1453
- }, bt = 8 * 1024, xt = () => {
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
- }, St = (e) => `${e}_${xt()}`, Z = (e, t = bt) => {
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
- }, Ct = (e) => {
1473
- let t = e.truncateBytes ?? bt, n = e.makeId ?? St, r = (t, n) => e.log?.warn(t, n), i = e.encryptStepPayload ?? ((e) => e), a = e.emit;
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
- }, wt = (i, a) => {
1577
- let o = i.truncateBytes ?? bt, c = i.makeId ?? St, d = i.recorder ?? Ct(i), m = (e, t) => i.log?.warn(e, t), h = i.emit, g = (e, t, n) => u.promise(async () => {
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
- m("failed to apply workflow parent-close policy", {
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
- }), _ = (e, t, n) => u.promise(async () => {
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
- m("failed to release the workflow admission lease", {
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 (y, b) => u.gen(function* () {
1611
- let x = Date.now(), S = yield* p.get(e), C = i.parentExecutionId ?? S ?? null, w = i.parentClosePolicy ?? null, T, E = (e, t) => t.pipe(u.catchAllCause((t) => l.isInterrupted(t) ? u.failCause(t) : u.sync(() => {
1612
- let n = l.squash(t);
1613
- m(e, {
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: b,
1961
+ executionId: S,
1616
1962
  reason: n?.message ?? String(n)
1617
1963
  });
1618
- }))), D = (i.store.query ? yield* u.promise(() => i.store.query({
1964
+ }))), D = (i.store.query ? yield* m.promise(() => i.store.query({
1619
1965
  table: "_voltro_workflow_runs",
1620
1966
  order: [],
1621
- predicate: v("executionId", b),
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 '${b}' was started on version ${O}, but current code is compatible with ${i.workflowCompatibleVersions.join(", ")}`, t = yield* u.promise(() => i.store.update("_voltro_workflow_runs", D.id, {
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 && h?.("workflowRuns", {
1980
+ return t && v?.("workflowRuns", {
1634
1981
  op: "update",
1635
1982
  row: Q(t)
1636
- }), yield* u.promise(() => d.recordEvent({
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* u.sync(() => i.recordRun?.({
1993
+ })), yield* m.sync(() => i.recordRun?.({
1647
1994
  name: i.name,
1648
1995
  status: "failed",
1649
1996
  durationMs: 0
1650
- })), yield* u.fail(Error(e));
1997
+ })), yield* m.fail(Error(e));
1651
1998
  }
1652
- yield* E("failed to record workflow start (continuing)", u.gen(function* () {
1653
- let e = yield* u.promise(() => i.store.insert("_voltro_workflow_runs", {
1654
- id: c("wr"),
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: b,
2062
+ executionId: S,
1657
2063
  status: "running",
1658
- payload: y,
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: C,
1672
- parentClosePolicy: w
2077
+ parentExecutionId: w,
2078
+ parentClosePolicy: ne,
2079
+ runnerEnteredAt: /* @__PURE__ */ new Date(),
2080
+ reclaimCount: 0
1673
2081
  }));
1674
- if (T = e.id, h?.("workflowRuns", {
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* u.promise(() => d.recordEvent({
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: b,
2092
+ executionId: S,
1685
2093
  source: i.source ?? null,
1686
2094
  workflowVersion: i.workflowVersion ?? null,
1687
2095
  workflowPatches: i.workflowPatches ?? null,
1688
- parentExecutionId: C,
1689
- parentClosePolicy: w
2096
+ parentExecutionId: w,
2097
+ parentClosePolicy: ne
1690
2098
  }
1691
2099
  }));
1692
2100
  }
1693
2101
  }));
1694
- let k = i.subject?.tenantId, A = a(y, b).pipe(u.locally(r, T), u.locally(e, b), u.locally(n, typeof k == "string" ? k : void 0), u.provideService(t, d)), ee = i.pluginWorkflowStepLayer ? A.pipe(u.provide(i.pluginWorkflowStepLayer)) : A, j = yield* s.intoResult(ee);
1695
- if (s.isResult(j) && j._tag === "Suspended") {
1696
- let e = j.cause, t = e !== void 0 && !l.isEmpty(e), n = t ? l.squash(e) : void 0, r = n && typeof n == "object" && "_tag" in n ? String(n._tag) : null, a = t ? n?.message ?? String(n) : null;
1697
- t && (yield* u.sync(() => ne({
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: b,
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", u.gen(function* () {
1709
- let e = yield* u.promise(() => i.store.update("_voltro_workflow_runs", T, {
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 && h?.("workflowRuns", {
2125
+ e && v?.("workflowRuns", {
1717
2126
  op: "update",
1718
2127
  row: Q(e)
1719
- }), yield* u.promise(() => d.recordEvent({
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* te;
1730
- return yield* s.suspend(o);
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
- let M = j;
1733
- if (f.isFailure(M.exit)) {
1734
- let e = M.exit.cause, t = l.failureOption(e), n = t._tag === "Some" ? t.value : l.squash(e), r = n && typeof n == "object" && "_tag" in n ? String(n._tag) : null, a = n?.message ?? String(n);
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: b,
2168
+ executionId: S,
1742
2169
  ...r ? { errorTag: r } : {},
1743
2170
  ...T ? { runId: T } : {}
1744
2171
  }
1745
- })), T && (yield* E("failed to record workflow failure", u.gen(function* () {
1746
- let e = yield* u.promise(() => i.store.update("_voltro_workflow_runs", T, {
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() - x
2178
+ durationMs: Date.now() - C,
2179
+ runnerEnteredAt: null
1752
2180
  }));
1753
- e && h?.("workflowRuns", {
2181
+ e && v?.("workflowRuns", {
1754
2182
  op: "update",
1755
2183
  row: Q(e)
1756
- }), yield* u.promise(() => d.recordEvent({
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() - x
2190
+ durationMs: Date.now() - C
1763
2191
  }
1764
- })), yield* g(b, "failed", T);
1765
- }))), yield* _(b, "failed", T), yield* u.sync(() => i.recordRun?.({
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() - x
1769
- })), yield* u.failCause(e);
2196
+ durationMs: Date.now() - C
2197
+ })), yield* m.failCause(e);
1770
2198
  }
1771
- let N = M.exit.value;
1772
- return T && (yield* E("failed to record workflow success", u.gen(function* () {
1773
- let e = yield* u.promise(() => i.store.update("_voltro_workflow_runs", T, {
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(N, o),
2203
+ output: Z(P, l),
1776
2204
  completedAt: /* @__PURE__ */ new Date(),
1777
- durationMs: Date.now() - x
2205
+ durationMs: Date.now() - C,
2206
+ runnerEnteredAt: null
1778
2207
  }));
1779
- e && h?.("workflowRuns", {
2208
+ e && v?.("workflowRuns", {
1780
2209
  op: "update",
1781
2210
  row: Q(e)
1782
- }), yield* u.promise(() => d.recordEvent({
2211
+ }), yield* m.promise(() => f.recordEvent({
1783
2212
  runId: T,
1784
2213
  eventType: "run-succeeded",
1785
- payload: { durationMs: Date.now() - x }
1786
- })), yield* g(b, "succeeded", T);
1787
- }))), yield* _(b, "succeeded", T), yield* u.sync(() => i.recordRun?.({
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() - x,
2219
+ durationMs: Date.now() - C,
1791
2220
  completedAtSec: Date.now() / 1e3
1792
- })), N;
2221
+ })), P;
1793
2222
  });
1794
- }, Tt = (e) => e === "cancel" || e === "terminate", Et = (e) => e === "running" || e === "suspended", Dt = async (e) => {
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: v("parentExecutionId", e.parentExecutionId),
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 (!Tt(r.parentClosePolicy)) {
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 (!Et(r.status)) {
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
- }, Ot = (e) => {
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
- }, kt = (e) => typeof e == "number" ? e : e == null ? null : Number(e), $ = (e) => e == null ? null : String(e), At = (e) => {
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) => (kt(e.attempt) ?? 0) - (kt(t.attempt) ?? 0));
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: kt(t.attempt) ?? r.length,
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: kt(t.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 (Ot(r?.startedAt)?.getTime() ?? 0) - (Ot(i?.startedAt)?.getTime() ?? 0);
2339
+ return (gn(r?.startedAt)?.getTime() ?? 0) - (gn(i?.startedAt)?.getTime() ?? 0);
1911
2340
  }), n;
1912
- }, jt = (e) => {
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
- }, Mt = async (e, t) => {
1921
- let n = E(M), r = (await t.query(n.where(T(v("id", e), v("executionId", e))).limit(1).descriptor))[0];
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 = E(N), o = await t.query(a.where(v("runId", i)).descriptor);
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: jt(r.subject),
2360
+ subject: yn(r.subject),
1932
2361
  source: $(r.source),
1933
- steps: At(o),
1934
- startedAt: Ot(r.startedAt) ?? /* @__PURE__ */ new Date(0),
1935
- finishedAt: Ot(r.completedAt),
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
- }, Nt = () => {
1941
- let e = [], n = [], r = 0, i = 0;
2369
+ }, xn = () => {
2370
+ let e = [], t = [], r = 0, i = 0;
1942
2371
  return {
1943
- layer: m.succeed(t, {
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: t, payload: r, stepName: a, attempt: o }) => {
2400
+ recordEvent: async ({ runId: e, eventType: n, payload: r, stepName: a, attempt: o }) => {
1972
2401
  let s = `wfev_mem_${++i}`;
1973
- return n.push({
2402
+ return t.push({
1974
2403
  id: s,
1975
2404
  runId: e,
1976
- eventType: t,
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: () => n
2414
+ readEvents: () => t
1986
2415
  };
1987
2416
  };
1988
2417
  //#endregion
1989
- export { he as $, Fe as A, De as B, Be as C, We as D, qe as E, z as F, we as G, Ae as H, L as I, ye as J, je as K, Oe as L, Pe as M, R as N, Re as O, ge as P, ce as Q, W as R, He as S, Ue as T, be as U, G as V, _e as W, Ee as X, U as Y, xe as Z, nt as _, Q as a, F as at, K as b, yt as c, ae as ct, pt as d, N as dt, de as et, ct as f, M as ft, it as g, ut as h, Ct as i, le as it, Me as j, Le as k, gt as l, ie as lt, lt as m, Mt as n, pe as nt, Z as o, oe as ot, Y as p, j as pt, Se as q, Dt as r, ue as rt, wt as s, se as st, Nt as t, me as tt, _t as u, re as ut, Ye as v, ze as w, Ve as x, Xe as y, ke as z };
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 };