@voltro/workflow 0.33.0 → 0.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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,31 +445,31 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
443
445
  releasedAt: e.outcome === "admitted" ? null : new Date(r)
444
446
  });
445
447
  return String(a.id);
446
- }, 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 Oe(e, t, n)).due, Oe = async (e, t, n) => {
450
- let r = (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, [{
451
453
  column: "priority",
452
454
  direction: "desc"
453
455
  }, {
454
456
  column: "firstSeenAt",
455
457
  direction: "asc"
456
- }], n))).map(ve), i;
458
+ }], n))).map(Ee), i;
457
459
  for (let e of r) e.dueAt <= t || (i === void 0 || e.dueAt < i) && (i = e.dueAt);
458
460
  return {
459
- due: r.filter((e) => e.dueAt <= t).sort(he),
461
+ due: r.filter((e) => e.dueAt <= t).sort(Ce),
460
462
  nextDueAt: i
461
463
  };
462
- }, ke = async (e, t) => (await e.query(H(L, void 0, [{
464
+ }, Le = async (e, t) => (await e.query(U(R, void 0, [{
463
465
  column: "firstSeenAt",
464
466
  direction: "asc"
465
- }], t))).map(ve), W = async (e, t) => e.delete(L, t), Ae = async (e, t, n, r) => {
466
- 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];
467
469
  if (i === void 0) return !1;
468
- let a = ve(i);
470
+ let a = Ee(i);
469
471
  try {
470
- await e.insert(R, {
472
+ await e.insert(z, {
471
473
  tenantId: a.tenantId,
472
474
  workflowName: a.workflowName,
473
475
  outcome: "discarded",
@@ -485,36 +487,36 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
485
487
  releasedAt: new Date(r)
486
488
  });
487
489
  } catch {}
488
- return e.delete(L, t);
489
- }, je = async (e, t, n, r) => {
490
- 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, {
491
493
  attempts: t.attempts + 1,
492
494
  lastError: n.slice(0, 500),
493
495
  updatedAt: new Date(r)
494
496
  });
495
- }, G = async (e) => {
496
- let t = await Se({
497
+ }, Be = async (e) => {
498
+ let t = await Ae({
497
499
  store: e.store,
498
500
  control: e.control,
499
501
  keys: e.keys,
500
502
  now: e.now,
501
503
  paused: e.paused
502
504
  });
503
- return de({
505
+ return ye({
504
506
  control: e.control,
505
507
  keys: e.keys,
506
508
  state: t,
507
509
  now: e.now,
508
510
  reconsidering: e.reconsidering
509
511
  });
510
- }, Me = async (e, t, n = 1e3) => {
511
- 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, [{
512
514
  column: "admittedAt",
513
515
  direction: "asc"
514
- }], n)), i = t.getTime(), a = r.filter((e) => e.releasedAt != null && B(e.admittedAt) < i);
515
- return await Promise.all(a.map((t) => e.delete(R, String(t.id)))), a.length;
516
- }, Ne = async (e) => {
517
- 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({
518
520
  store: t,
519
521
  control: n,
520
522
  keys: i,
@@ -522,7 +524,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
522
524
  now: r,
523
525
  reconsidering: !1
524
526
  });
525
- if (a.kind === "drop") return await U({
527
+ if (a.kind === "drop") return await W({
526
528
  store: t,
527
529
  control: n,
528
530
  keys: i,
@@ -539,7 +541,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
539
541
  kind: "dropped",
540
542
  retryAfterMs: a.retryAfterMs
541
543
  };
542
- if (a.kind === "skip") return await U({
544
+ if (a.kind === "skip") return await W({
543
545
  store: t,
544
546
  control: n,
545
547
  keys: i,
@@ -559,7 +561,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
559
561
  };
560
562
  if (a.kind === "defer") return {
561
563
  kind: "queued",
562
- intentId: await we({
564
+ intentId: await Me({
563
565
  store: t,
564
566
  control: n,
565
567
  decision: a,
@@ -573,12 +575,12 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
573
575
  };
574
576
  let o = e.payload, s = [], c = 1;
575
577
  if (n.batch !== void 0 && i.batchKey !== void 0) {
576
- let r = await Pe(t, n.workflowName, i.batchKey, n.batch.maxSize);
578
+ let r = await Ue(t, n.workflowName, i.batchKey, n.batch.maxSize);
577
579
  o = { items: [...r.map((e) => e.payload), e.payload] }, s = r.map((e) => e.id), c = r.length + 1;
578
580
  }
579
581
  return {
580
582
  kind: "start",
581
- ledgerId: await U({
583
+ ledgerId: await W({
582
584
  store: t,
583
585
  control: n,
584
586
  keys: i,
@@ -601,9 +603,9 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
601
603
  runId: a.evict.runId
602
604
  } }
603
605
  };
604
- }, Pe = async (e, t, n, r) => (await e.query({
606
+ }, Ue = async (e, t, n, r) => (await e.query({
605
607
  table: "_voltro_workflow_pending",
606
- predicate: g(v("workflowName", t), v("controlKey", n), v("mode", "batch")),
608
+ predicate: b(x("workflowName", t), x("controlKey", n), x("mode", "batch")),
607
609
  order: [{
608
610
  column: "firstSeenAt",
609
611
  direction: "asc"
@@ -614,22 +616,22 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
614
616
  })).map((e) => ({
615
617
  id: String(e.id),
616
618
  payload: e.payload
617
- })), Fe = async (e, t, n, r) => {
619
+ })), We = async (e, t, n, r) => {
618
620
  await e.update("_voltro_workflow_admissions", t, {
619
621
  executionId: n,
620
622
  runId: r
621
623
  });
622
- }, Ie = O("_voltro_workflow_watermarks", {
623
- id: x({ prefix: "wfwm" }),
624
- positionAt: A(),
625
- updatedAt: A().default("now")
626
- }), Le = (e) => {
624
+ }, Ge = M("_voltro_workflow_watermarks", {
625
+ id: w({ prefix: "wfwm" }),
626
+ positionAt: P(),
627
+ updatedAt: P().default("now")
628
+ }), Ke = (e) => {
627
629
  let t = e instanceof Error ? e.message : String(e);
628
630
  return t.length > 400 ? `${t.slice(0, 400)}…` : t;
629
- }, Re = (e) => {
630
- let t = [], n = [], r = [], i = /* @__PURE__ */ new Set(), a = /* @__PURE__ */ new Set(), o = e.payloadSchema === void 0 ? (e) => d.right(e) : (t) => {
631
- let n = h.decodeUnknownEither(e.payloadSchema)(t);
632
- return d.isRight(n) ? d.right(n.right) : d.left(Le(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));
633
635
  }, s = e.runs.map((e) => ({
634
636
  run: e,
635
637
  decoded: o(e.payload)
@@ -639,19 +641,19 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
639
641
  }));
640
642
  for (let o of e.entries) for (let l of e.events) {
641
643
  if (l.name !== o.event) continue;
642
- let u = h.decodeUnknownEither(o.schema)(l.payload);
643
- if (d.isLeft(u)) {
644
+ let u = y.decodeUnknownEither(o.schema)(l.payload);
645
+ if (h.isLeft(u)) {
644
646
  r.push({
645
647
  kind: "event-decode",
646
648
  workflowName: e.workflowName,
647
649
  event: o.event,
648
650
  subject: l.id,
649
- detail: Le(u.left)
651
+ detail: Ke(u.left)
650
652
  });
651
653
  continue;
652
654
  }
653
- 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) => {
654
- 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({
655
657
  kind: "payload-decode",
656
658
  workflowName: e.workflowName,
657
659
  event: o.event,
@@ -659,25 +661,25 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
659
661
  detail: t.left
660
662
  }), !1;
661
663
  try {
662
- return o.match(f, t.right) === !0;
664
+ return o.match(d, t.right) === !0;
663
665
  } catch (t) {
664
666
  return r.push({
665
667
  kind: "match-threw",
666
668
  workflowName: e.workflowName,
667
669
  event: o.event,
668
670
  subject: n,
669
- detail: Le(t)
671
+ detail: Ke(t)
670
672
  }), !1;
671
673
  }
672
674
  };
673
- 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({
674
676
  runId: e.runId,
675
677
  executionId: e.executionId,
676
678
  reason: o.reason,
677
679
  event: o.event,
678
680
  eventId: l.id
679
681
  }));
680
- for (let { intent: e, decoded: t } of c) a.has(e.intentId) || 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({
681
683
  intentId: e.intentId,
682
684
  reason: o.reason,
683
685
  event: o.event,
@@ -689,26 +691,26 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
689
691
  discards: n,
690
692
  problems: r
691
693
  };
692
- }, ze = (e) => {
694
+ }, Je = (e) => {
693
695
  let t;
694
696
  for (let n of e) (t === void 0 || n.occurredAt.getTime() > t.getTime()) && (t = n.occurredAt);
695
697
  return t;
696
- }, Be = "_voltro_workflow_watermarks", Ve = "_voltro_workflow_events", K = "cancelOn", He = 3600 * 1e3, Ue = 500, q = (e) => {
698
+ }, Ye = "_voltro_workflow_watermarks", Xe = "_voltro_workflow_events", K = "cancelOn", Ze = 3600 * 1e3, Qe = 500, q = (e) => {
697
699
  if (e instanceof Date) return e;
698
700
  if (typeof e == "number") return new Date(e);
699
701
  if (typeof e == "string") {
700
702
  let t = new Date(e);
701
703
  if (!Number.isNaN(t.getTime())) return t;
702
704
  }
703
- }, J = (e) => e instanceof Error ? e.message : String(e), We = async (e, t) => q((await e.query({
704
- table: Be,
705
- 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),
706
708
  order: [],
707
709
  take: 1,
708
710
  skip: void 0,
709
711
  projection: void 0
710
- }))[0]?.positionAt), Ge = async (e, t, n) => {
711
- await e.upsert(Be, {
712
+ }))[0]?.positionAt), et = async (e, t, n) => {
713
+ await e.upsert(Ye, {
712
714
  id: t,
713
715
  positionAt: n,
714
716
  updatedAt: /* @__PURE__ */ new Date()
@@ -725,10 +727,10 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
725
727
  };
726
728
  }
727
729
  });
728
- }, Ke = async (e, t, n) => {
730
+ }, tt = async (e, t, n) => {
729
731
  let r = async (r) => e.query({
730
732
  table: "_voltro_workflow_runs",
731
- predicate: g(v("tag", t), v("status", r)),
733
+ predicate: b(x("tag", t), x("status", r)),
732
734
  order: [{
733
735
  column: "startedAt",
734
736
  direction: "asc"
@@ -746,9 +748,9 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
746
748
  startedAt: n
747
749
  }];
748
750
  });
749
- }, qe = async (e, t, n) => (await e.query({
751
+ }, nt = async (e, t, n) => (await e.query({
750
752
  table: "_voltro_workflow_pending",
751
- predicate: v("workflowName", t),
753
+ predicate: x("workflowName", t),
752
754
  order: [{
753
755
  column: "firstSeenAt",
754
756
  direction: "asc"
@@ -763,7 +765,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
763
765
  payload: t.payload,
764
766
  firstSeenAt: n
765
767
  }];
766
- }), Je = async (e, t) => {
768
+ }), rt = async (e, t) => {
767
769
  let n = t.workflows.filter((e) => e.entries.length > 0);
768
770
  if (n.length === 0) return {
769
771
  examined: !1,
@@ -778,9 +780,9 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
778
780
  };
779
781
  let r = e.now?.() ?? Date.now(), i = t.batch ?? 500, a = t.coldLookbackMs ?? 36e5, o = /* @__PURE__ */ new Set();
780
782
  for (let e of n) for (let t of e.entries) o.add(t.event);
781
- let s = await We(e.store, K), c = s ?? new Date(r - a), l = await e.store.query({
782
- table: Ve,
783
- 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),
784
786
  order: [{
785
787
  column: "occurredAt",
786
788
  direction: "asc"
@@ -804,7 +806,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
804
806
  if (n.length === 0) continue;
805
807
  let r = [], i = [];
806
808
  try {
807
- r = await Ke(e.store, t.workflowName, _), i = await qe(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);
808
810
  } catch (e) {
809
811
  f.push({
810
812
  subject: t.workflowName,
@@ -812,7 +814,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
812
814
  }), g = !0;
813
815
  continue;
814
816
  }
815
- let a = Re({
817
+ let a = qe({
816
818
  workflowName: t.workflowName,
817
819
  entries: t.entries,
818
820
  payloadSchema: t.payloadSchema,
@@ -854,10 +856,10 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
854
856
  });
855
857
  }
856
858
  }
857
- let v = ze(u), y = s;
859
+ let v = Je(u), y = s;
858
860
  if (g) e.log?.warn("workflow.cancelOn: holding the watermark — some workflows could not be evaluated", { failures: f.length });
859
861
  else if (v !== void 0) try {
860
- await Ge(e.store, K, v), y = v;
862
+ await et(e.store, K, v), y = v;
861
863
  } catch (e) {
862
864
  f.push({
863
865
  subject: K,
@@ -865,7 +867,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
865
867
  });
866
868
  }
867
869
  else if (s === void 0) try {
868
- await Ge(e.store, K, c), y = c;
870
+ await et(e.store, K, c), y = c;
869
871
  } catch (e) {
870
872
  f.push({
871
873
  subject: K,
@@ -886,7 +888,163 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
886
888
  failures: f,
887
889
  watermark: y
888
890
  };
889
- }, Ye = {
891
+ }, it = 1800 * 1e3, at = 200, ot = 20, Y = (e) => {
892
+ if (e instanceof Date) return e;
893
+ if (typeof e == "number") return new Date(e);
894
+ if (typeof e == "string") {
895
+ let t = new Date(e);
896
+ if (!Number.isNaN(t.getTime())) return t;
897
+ }
898
+ }, st = (e) => e instanceof Error ? e.message : String(e), ct = async (e, t, n) => (await e.query({
899
+ table: "_voltro_workflow_run_events",
900
+ predicate: x("runId", t),
901
+ order: [{
902
+ column: "occurredAt",
903
+ direction: "desc"
904
+ }],
905
+ take: n,
906
+ skip: void 0,
907
+ projection: void 0
908
+ })).flatMap((e) => {
909
+ let t = e, n = Y(t.occurredAt);
910
+ return typeof t.eventType != "string" || n === void 0 ? [] : [{
911
+ eventType: t.eventType,
912
+ occurredAt: n,
913
+ payload: t.payload
914
+ }];
915
+ }), lt = async (e, t) => {
916
+ let n = (await e.query({
917
+ table: "_voltro_workflow_run_steps",
918
+ predicate: x("runId", t),
919
+ order: [{
920
+ column: "startedAt",
921
+ direction: "desc"
922
+ }],
923
+ take: 1,
924
+ skip: void 0,
925
+ projection: void 0
926
+ }))[0];
927
+ if (n === void 0) return;
928
+ let r = Y(n.startedAt), i = Y(n.completedAt);
929
+ return r === void 0 ? i : i === void 0 ? r : i.getTime() > r.getTime() ? i : r;
930
+ }, ut = (e, t) => {
931
+ for (let n of e) {
932
+ if (n.eventType === "timer-fired") return !1;
933
+ if (n.eventType !== "timer-set") continue;
934
+ let e = Y(n.payload?.scheduledWakeAt);
935
+ return e !== void 0 && e.getTime() > t;
936
+ }
937
+ return !1;
938
+ }, dt = (e, t) => {
939
+ if (e !== "suspended") return "no-progress";
940
+ for (let e of t) {
941
+ if (e.eventType === "signal-received" || e.eventType === "signal-sent") return "suspended";
942
+ if (e.eventType === "signal-awaited") return "awaiting-signal";
943
+ }
944
+ return "suspended";
945
+ }, ft = async (e, t = {}) => {
946
+ let n = e.now?.() ?? Date.now(), r = t.stallAfterMs ?? 18e5, i = t.runPage ?? 200, a = t.eventLookback ?? 20, o = new Date(n - r), s = [], c = [], l = 0, u = 0, d;
947
+ try {
948
+ d = await e.store.query({
949
+ table: "_voltro_workflow_runs",
950
+ predicate: b(ne("status", ["running", "suspended"]), O("startedAt", o)),
951
+ order: [{
952
+ column: "startedAt",
953
+ direction: "asc"
954
+ }],
955
+ take: i,
956
+ skip: void 0,
957
+ projection: void 0
958
+ });
959
+ } catch (e) {
960
+ return {
961
+ examined: 0,
962
+ stalled: [],
963
+ alreadyReported: 0,
964
+ waitingOnTimer: 0,
965
+ sawFullRunPage: !1,
966
+ failures: [{
967
+ subject: "_voltro_workflow_runs",
968
+ detail: st(e)
969
+ }]
970
+ };
971
+ }
972
+ for (let t of d) {
973
+ let i = t, o = Y(i.startedAt);
974
+ if (typeof i.id != "string" || typeof i.tag != "string" || typeof i.executionId != "string" || typeof i.status != "string" || o === void 0) continue;
975
+ let d, f;
976
+ try {
977
+ d = await ct(e.store, i.id, a), f = await lt(e.store, i.id);
978
+ } catch (e) {
979
+ s.push({
980
+ subject: i.id,
981
+ detail: st(e)
982
+ });
983
+ continue;
984
+ }
985
+ if (ut(d, n)) {
986
+ u += 1;
987
+ continue;
988
+ }
989
+ let p = d.find((e) => e.eventType !== "run-stalled")?.occurredAt, m = o;
990
+ for (let e of [f, p]) e !== void 0 && e.getTime() > m.getTime() && (m = e);
991
+ let h = n - m.getTime();
992
+ if (h < r) continue;
993
+ if (d.some((e) => e.eventType === "run-stalled" && e.occurredAt.getTime() > m.getTime())) {
994
+ l += 1;
995
+ continue;
996
+ }
997
+ let g = {
998
+ runId: i.id,
999
+ tag: i.tag,
1000
+ executionId: i.executionId,
1001
+ status: i.status,
1002
+ lastProgressAt: m,
1003
+ idleMs: h,
1004
+ reason: dt(i.status, d)
1005
+ };
1006
+ if (c.push(g), e.log?.warn("workflow.staleness: run has made no progress", {
1007
+ workflow: g.tag,
1008
+ runId: g.runId,
1009
+ idleMs: g.idleMs,
1010
+ reason: g.reason
1011
+ }), e.recordEvent !== void 0) try {
1012
+ await e.recordEvent({
1013
+ runId: g.runId,
1014
+ eventType: "run-stalled",
1015
+ payload: {
1016
+ idleMs: g.idleMs,
1017
+ stallAfterMs: r,
1018
+ lastProgressAt: g.lastProgressAt.toISOString(),
1019
+ reason: g.reason,
1020
+ tag: g.tag,
1021
+ executionId: g.executionId
1022
+ }
1023
+ });
1024
+ } catch (e) {
1025
+ s.push({
1026
+ subject: g.runId,
1027
+ detail: st(e)
1028
+ });
1029
+ }
1030
+ if (e.onStalled !== void 0) try {
1031
+ await e.onStalled(g);
1032
+ } catch (e) {
1033
+ s.push({
1034
+ subject: `${g.runId}:onStalled`,
1035
+ detail: st(e)
1036
+ });
1037
+ }
1038
+ }
1039
+ return {
1040
+ examined: d.length,
1041
+ stalled: c,
1042
+ alreadyReported: l,
1043
+ waitingOnTimer: u,
1044
+ sawFullRunPage: d.length >= i,
1045
+ failures: s
1046
+ };
1047
+ }, pt = {
890
1048
  scanned: 0,
891
1049
  admitted: 0,
892
1050
  deferred: 0,
@@ -897,14 +1055,14 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
897
1055
  failed: 0,
898
1056
  timedOut: 0,
899
1057
  examined: !1
900
- }, Xe = 200, Ze = async (e, t = {}) => {
1058
+ }, mt = 200, ht = async (e, t = {}) => {
901
1059
  let n = e.now ?? (() => Date.now()), r = e.log, i = t.batchSize ?? 200, a, o, s;
902
1060
  try {
903
- a = await ye(e.store);
904
- let t = await Oe(e.store, n(), i);
1061
+ a = await De(e.store);
1062
+ let t = await Ie(e.store, n(), i);
905
1063
  o = t.due, s = t.nextDueAt;
906
1064
  } catch (e) {
907
- return r?.warn?.("workflow flow control: could not read the admission queue", { cause: String(e) }), Ye;
1065
+ return r?.warn?.("workflow flow control: could not read the admission queue", { cause: String(e) }), pt;
908
1066
  }
909
1067
  let c = {
910
1068
  scanned: o.length,
@@ -926,16 +1084,16 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
926
1084
  u.push(e);
927
1085
  }
928
1086
  for (let t of u) try {
929
- await Qe(e, t, a, c, n());
1087
+ await gt(e, t, a, c, n());
930
1088
  } catch (i) {
931
1089
  c.failed++, r?.warn?.("workflow flow control: an intent failed to drain", {
932
1090
  workflow: t.workflowName,
933
1091
  intent: t.id,
934
1092
  cause: String(i)
935
- }), await je(e.store, t, String(i), n()).catch(() => {});
1093
+ }), await ze(e.store, t, String(i), n()).catch(() => {});
936
1094
  }
937
1095
  for (let t of l.values()) try {
938
- await $e(e, t, a, c, n());
1096
+ await _t(e, t, a, c, n());
939
1097
  } catch (i) {
940
1098
  c.failed++;
941
1099
  let a = t[0];
@@ -943,14 +1101,14 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
943
1101
  workflow: a?.workflowName,
944
1102
  size: t.length,
945
1103
  cause: String(i)
946
- }), a !== void 0 && await je(e.store, a, String(i), n()).catch(() => {});
1104
+ }), a !== void 0 && await ze(e.store, a, String(i), n()).catch(() => {});
947
1105
  }
948
- return c.timedOut = await tt(e, n()).catch(() => 0), {
1106
+ return c.timedOut = await yt(e, n()).catch(() => 0), {
949
1107
  ...c,
950
1108
  examined: !0,
951
1109
  ...s === void 0 ? {} : { nextDueAt: s }
952
1110
  };
953
- }, Qe = async (e, t, n, r, i) => {
1111
+ }, gt = async (e, t, n, r, i) => {
954
1112
  let a = e.controls.get(t.workflowName);
955
1113
  if (a === void 0) {
956
1114
  await e.onAbandoned({
@@ -958,14 +1116,14 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
958
1116
  payload: t.payload,
959
1117
  callerContext: t.callerContext,
960
1118
  reason: `workflow '${t.workflowName}' is no longer registered — it was renamed or removed while this start was waiting in the admission queue`
961
- }), await W(e.store, t.id), r.expired++;
1119
+ }), await G(e.store, t.id), r.expired++;
962
1120
  return;
963
1121
  }
964
- if (pe(a, t, i)) {
965
- await U({
1122
+ if (xe(a, t, i)) {
1123
+ await W({
966
1124
  store: e.store,
967
1125
  control: a,
968
- keys: F(a, t.payload),
1126
+ keys: I(a, t.payload),
969
1127
  outcome: "expired",
970
1128
  mode: t.mode,
971
1129
  reason: `timeouts.start elapsed after ${i - t.firstSeenAt}ms`,
@@ -980,14 +1138,14 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
980
1138
  payload: t.payload,
981
1139
  callerContext: t.callerContext,
982
1140
  reason: `timeouts.start (${a.timeouts?.startMs}ms) elapsed while this start waited in the admission queue; ${t.collapsed} start(s) had collapsed into it`
983
- }), await W(e.store, t.id), r.expired++;
1141
+ }), await G(e.store, t.id), r.expired++;
984
1142
  return;
985
1143
  }
986
- let o = F(a, t.payload);
987
- await et(e, {
1144
+ let o = I(a, t.payload);
1145
+ await vt(e, {
988
1146
  control: a,
989
1147
  intent: t,
990
- decision: await G({
1148
+ decision: await Be({
991
1149
  store: e.store,
992
1150
  control: a,
993
1151
  keys: o,
@@ -1000,32 +1158,32 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
1000
1158
  now: i,
1001
1159
  items: void 0
1002
1160
  });
1003
- }, $e = async (e, t, n, r, i) => {
1161
+ }, _t = async (e, t, n, r, i) => {
1004
1162
  let a = t[0];
1005
1163
  if (a === void 0) return;
1006
1164
  let o = e.controls.get(a.workflowName);
1007
1165
  if (o === void 0 || o.batch === void 0) {
1008
- for (let n of t) await W(e.store, n.id);
1166
+ for (let n of t) await G(e.store, n.id);
1009
1167
  r.expired += t.length;
1010
1168
  return;
1011
1169
  }
1012
1170
  let s = [...t].sort((e, t) => e.firstSeenAt - t.firstSeenAt), c = s[0];
1013
- if (pe(o, c, i)) {
1171
+ if (xe(o, c, i)) {
1014
1172
  await e.onAbandoned({
1015
1173
  workflowName: a.workflowName,
1016
1174
  payload: { items: s.map((e) => e.payload) },
1017
1175
  callerContext: c.callerContext,
1018
1176
  reason: `timeouts.start elapsed with ${s.length} item(s) accumulated in the batch`
1019
1177
  });
1020
- for (let t of s) await W(e.store, t.id);
1178
+ for (let t of s) await G(e.store, t.id);
1021
1179
  r.expired += s.length;
1022
1180
  return;
1023
1181
  }
1024
- let l = F(o, c.payload);
1025
- await et(e, {
1182
+ let l = I(o, c.payload);
1183
+ await vt(e, {
1026
1184
  control: o,
1027
1185
  intent: c,
1028
- decision: await G({
1186
+ decision: await Be({
1029
1187
  store: e.store,
1030
1188
  control: o,
1031
1189
  keys: l,
@@ -1038,10 +1196,10 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
1038
1196
  now: i,
1039
1197
  items: s
1040
1198
  });
1041
- }, et = async (e, t) => {
1199
+ }, vt = async (e, t) => {
1042
1200
  let { control: n, intent: r, decision: i, keys: a, counters: o, now: s, items: c } = t;
1043
1201
  if (i.kind === "defer") {
1044
- await we({
1202
+ await Me({
1045
1203
  store: e.store,
1046
1204
  control: n,
1047
1205
  decision: i,
@@ -1054,7 +1212,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
1054
1212
  return;
1055
1213
  }
1056
1214
  if (i.kind === "drop") {
1057
- await U({
1215
+ await W({
1058
1216
  store: e.store,
1059
1217
  control: n,
1060
1218
  keys: a,
@@ -1068,12 +1226,12 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
1068
1226
  tenantId: r.tenantId,
1069
1227
  now: s
1070
1228
  });
1071
- for (let t of c ?? [r]) await W(e.store, t.id);
1229
+ for (let t of c ?? [r]) await G(e.store, t.id);
1072
1230
  o.dropped++;
1073
1231
  return;
1074
1232
  }
1075
1233
  if (i.kind === "skip") {
1076
- await U({
1234
+ await W({
1077
1235
  store: e.store,
1078
1236
  control: n,
1079
1237
  keys: a,
@@ -1087,11 +1245,11 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
1087
1245
  tenantId: r.tenantId,
1088
1246
  now: s
1089
1247
  });
1090
- for (let t of c ?? [r]) await W(e.store, t.id);
1248
+ for (let t of c ?? [r]) await G(e.store, t.id);
1091
1249
  o.skipped++;
1092
1250
  return;
1093
1251
  }
1094
- i.evict !== void 0 && (await e.cancelRun(n.workflowName, i.evict.executionId), await 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({
1095
1253
  store: e.store,
1096
1254
  control: n,
1097
1255
  keys: a,
@@ -1106,7 +1264,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
1106
1264
  now: s
1107
1265
  }), o.evicted++);
1108
1266
  let l = c === void 0 ? r.payload : { items: c.map((e) => e.payload) }, u = c === void 0 ? r.collapsed : c.reduce((e, t) => e + t.collapsed, 0), d = await e.startAdmitted(n.workflowName, l, r.callerContext);
1109
- await U({
1267
+ await W({
1110
1268
  store: e.store,
1111
1269
  control: n,
1112
1270
  keys: a,
@@ -1120,18 +1278,18 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
1120
1278
  tenantId: r.tenantId,
1121
1279
  now: s
1122
1280
  });
1123
- for (let t of c ?? [r]) await W(e.store, t.id);
1281
+ for (let t of c ?? [r]) await G(e.store, t.id);
1124
1282
  o.admitted++;
1125
- }, tt = async (e, t) => {
1283
+ }, yt = async (e, t) => {
1126
1284
  if (e.listRunningRuns === void 0) return 0;
1127
1285
  let n = 0;
1128
1286
  for (let r of e.controls.values()) {
1129
1287
  if (r.timeouts?.finishMs === void 0) continue;
1130
1288
  let i = await e.listRunningRuns(r.workflowName);
1131
- for (let a of i) me(r, {
1289
+ for (let a of i) Se(r, {
1132
1290
  startedAt: a.startedAt,
1133
1291
  terminal: !1
1134
- }, t) && (await e.cancelRun(r.workflowName, a.executionId), await 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({
1135
1293
  workflowName: r.workflowName,
1136
1294
  payload: null,
1137
1295
  callerContext: null,
@@ -1139,82 +1297,82 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
1139
1297
  }), n++);
1140
1298
  }
1141
1299
  return n;
1142
- }, nt = async (e, t) => {
1300
+ }, bt = async (e, t) => {
1143
1301
  if (e) try {
1144
1302
  await e.recordEvent(t);
1145
1303
  } catch {}
1146
- }, rt = (e, n) => {
1147
- let a = u.gen(function* () {
1148
- 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;
1149
- if (s === void 0) return yield* u.die(/* @__PURE__ */ Error("awaitSignal: no active workflow run id in scope"));
1150
- let d = s;
1151
- yield* u.promise(() => nt(l, {
1152
- 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,
1153
1311
  eventType: "signal-awaited",
1154
- payload: { signalName: n.name }
1312
+ payload: { signalName: r.name }
1155
1313
  }));
1156
- let f = Date.now(), p = i;
1314
+ let d = Date.now(), f = i;
1157
1315
  for (;;) {
1158
- let t = Date.now() - f;
1159
- if (t > o) return yield* u.die(/* @__PURE__ */ Error(`awaitSignal('${n.name}') timed out after ${t}ms`));
1160
- 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 = {
1161
1319
  table: "_voltro_workflow_run_events",
1162
1320
  order: [{
1163
1321
  column: "occurredAt",
1164
1322
  direction: "asc"
1165
1323
  }],
1166
- predicate: g(v("runId", d), v("eventType", "signal-sent")),
1324
+ predicate: b(x("runId", u), x("eventType", "signal-sent")),
1167
1325
  projection: void 0,
1168
1326
  skip: void 0,
1169
1327
  take: 1e3
1170
- }, i = (yield* u.tryPromise({
1171
- try: () => e.store.query(r),
1328
+ }, i = (yield* m.tryPromise({
1329
+ try: () => t.store.query(n),
1172
1330
  catch: (e) => e
1173
- })).find((e) => e.payload?.signalName === n.name);
1331
+ })).find((e) => e.payload?.signalName === r.name);
1174
1332
  if (i !== void 0) {
1175
- let e = yield* h.decodeUnknown(n.schema)(i.payload?.value);
1176
- return yield* u.promise(() => nt(l, {
1177
- runId: d,
1333
+ let e = yield* y.decodeUnknown(r.schema)(i.payload?.value);
1334
+ return yield* m.promise(() => bt(l, {
1335
+ runId: u,
1178
1336
  eventType: "signal-received",
1179
1337
  payload: {
1180
- signalName: n.name,
1338
+ signalName: r.name,
1181
1339
  value: i.payload?.value
1182
1340
  }
1183
1341
  })), e;
1184
1342
  }
1185
- yield* u.sleep(`${p} millis`), p = Math.min(p * 2, a);
1343
+ yield* m.sleep(`${f} millis`), f = Math.min(f * 2, a);
1186
1344
  }
1187
1345
  });
1188
- return i.make({
1189
- name: `await-signal:${n.name}`,
1190
- success: n.schema,
1191
- execute: a
1346
+ return c.make({
1347
+ name: `await-signal:${r.name}`,
1348
+ success: r.schema,
1349
+ execute: i
1192
1350
  });
1193
- }, it = async (e, t) => {
1351
+ }, St = async (e, t) => {
1194
1352
  if (e !== void 0) try {
1195
1353
  await e.recordEvent(t);
1196
1354
  } catch {}
1197
- }, at = (e, n) => {
1198
- let a = u.gen(function* () {
1199
- 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;
1200
- if (c === void 0) return yield* u.die(/* @__PURE__ */ Error("awaitEvent: no active workflow run id in scope"));
1201
- let f = c, p = yield* n.since === "run-start" ? ot(e, f) : u.succeed(/* @__PURE__ */ new Date());
1202
- yield* u.promise(() => it(d, {
1203
- 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,
1204
1362
  eventType: "event-awaited",
1205
1363
  payload: {
1206
- event: n.event,
1207
- since: n.since ?? "wait-start",
1208
- cutoff: p.toISOString()
1364
+ event: r.event,
1365
+ since: r.since ?? "wait-start",
1366
+ cutoff: f.toISOString()
1209
1367
  }
1210
1368
  }));
1211
- let m = Date.now(), _ = i, y = 0;
1369
+ let p = Date.now(), h = i, g = 0;
1212
1370
  for (;;) {
1213
- let t = Date.now() - m;
1214
- 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."}`));
1215
- 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 = {
1216
1374
  table: "_voltro_workflow_events",
1217
- predicate: g(v("name", n.event), b("occurredAt", p)),
1375
+ predicate: b(x("name", r.event), te("occurredAt", f)),
1218
1376
  order: [{
1219
1377
  column: "occurredAt",
1220
1378
  direction: "asc"
@@ -1222,35 +1380,35 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
1222
1380
  take: s,
1223
1381
  skip: void 0,
1224
1382
  projection: void 0
1225
- }, i = yield* u.tryPromise({
1226
- try: () => e.store.query(r),
1383
+ }, i = yield* m.tryPromise({
1384
+ try: () => t.store.query(n),
1227
1385
  catch: (e) => e
1228
1386
  });
1229
- y = i.length;
1387
+ g = i.length;
1230
1388
  for (let e of i) {
1231
- let t = yield* h.decodeUnknown(n.schema)(e.payload);
1232
- if (n.match(t)) return yield* u.promise(() => it(d, {
1233
- 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,
1234
1392
  eventType: "event-received",
1235
1393
  payload: {
1236
- event: n.event,
1394
+ event: r.event,
1237
1395
  eventId: e.id
1238
1396
  }
1239
1397
  })), t;
1240
1398
  }
1241
- yield* u.sleep(`${_} millis`), _ = Math.min(_ * 2, a);
1399
+ yield* m.sleep(`${h} millis`), h = Math.min(h * 2, a);
1242
1400
  }
1243
1401
  });
1244
- return i.make({
1245
- name: `awaitEvent:${n.event}`,
1246
- success: n.schema,
1247
- execute: a
1402
+ return c.make({
1403
+ name: `awaitEvent:${r.event}`,
1404
+ success: r.schema,
1405
+ execute: i
1248
1406
  });
1249
- }, ot = (e, t) => u.gen(function* () {
1250
- let n = (yield* u.tryPromise({
1407
+ }, wt = (e, t) => m.gen(function* () {
1408
+ let n = (yield* m.tryPromise({
1251
1409
  try: () => e.store.query({
1252
1410
  table: "_voltro_workflow_runs",
1253
- predicate: v("id", t),
1411
+ predicate: x("id", t),
1254
1412
  order: [],
1255
1413
  take: 1,
1256
1414
  skip: void 0,
@@ -1264,16 +1422,16 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
1264
1422
  if (!Number.isNaN(e.getTime())) return e;
1265
1423
  }
1266
1424
  return /* @__PURE__ */ new Date(0);
1267
- }), st = (e) => new Promise((t) => setTimeout(t, e)), ct = () => {
1425
+ }), Tt = (e) => new Promise((t) => setTimeout(t, e)), Et = () => {
1268
1426
  let e = globalThis.crypto;
1269
1427
  return typeof e?.randomUUID == "function" ? e.randomUUID() : `${Date.now().toString(36)}${Math.random().toString(36).slice(2)}`;
1270
- }, lt = () => `wfu_${ct()}`, Y = async (e, t) => {
1428
+ }, Dt = () => `wfu_${Et()}`, Ot = async (e, t) => {
1271
1429
  let n = t.id ?? t.executionId;
1272
1430
  if (!n) throw Error("workflow message target requires target.id or target.executionId");
1273
1431
  let r = await e.query({
1274
1432
  table: "_voltro_workflow_runs",
1275
1433
  order: [],
1276
- predicate: v("id", n),
1434
+ predicate: x("id", n),
1277
1435
  projection: void 0,
1278
1436
  skip: void 0,
1279
1437
  take: 1
@@ -1282,15 +1440,15 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
1282
1440
  let i = (await e.query({
1283
1441
  table: "_voltro_workflow_runs",
1284
1442
  order: [],
1285
- predicate: v("executionId", n),
1443
+ predicate: x("executionId", n),
1286
1444
  projection: void 0,
1287
1445
  skip: void 0,
1288
1446
  take: 1
1289
1447
  }))[0];
1290
1448
  if (!i) throw Error(`workflow message target not found: ${n}`);
1291
1449
  return i;
1292
- }, ut = async (e) => {
1293
- let t = await Y(e.store, e.target);
1450
+ }, kt = async (e) => {
1451
+ let t = await Ot(e.store, e.target);
1294
1452
  return { eventId: (await e.recorder.recordEvent({
1295
1453
  runId: t.id,
1296
1454
  eventType: "signal-sent",
@@ -1299,8 +1457,8 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
1299
1457
  value: e.payload
1300
1458
  }
1301
1459
  })).id };
1302
- }, dt = async (e) => {
1303
- let t = await Y(e.store, e.target), n = lt(), 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({
1304
1462
  runId: t.id,
1305
1463
  eventType: "update-requested",
1306
1464
  payload: {
@@ -1316,7 +1474,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
1316
1474
  column: "occurredAt",
1317
1475
  direction: "asc"
1318
1476
  }],
1319
- predicate: v("runId", t.id),
1477
+ predicate: x("runId", t.id),
1320
1478
  projection: void 0,
1321
1479
  skip: void 0,
1322
1480
  take: 1e3
@@ -1337,133 +1495,281 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
1337
1495
  }), t;
1338
1496
  }
1339
1497
  if (Date.now() - i >= a) throw Error(`Timed out waiting for workflow update '${e.updateName}' (${n})`);
1340
- await st(o);
1498
+ await Tt(o);
1341
1499
  }
1342
- }, ft = 1440 * 6e4, pt = "voltro/suspending-signal", mt = (e, t) => `${pt}/${e}/${t}`, ht = (e) => o.make(e, { success: h.Unknown }), gt = 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) => {
1343
1501
  if (e) try {
1344
1502
  await e.recordEvent(t);
1345
1503
  } catch {}
1346
- }, _t = (e, n) => u.gen(function* () {
1347
- let e = n.timeoutMs ?? ft, i = ht(mt((yield* c.WorkflowInstance).workflow.name, n.name)), s = yield* r, l = yield* u.serviceOption(t), d = l._tag === "Some" ? l.value : void 0;
1348
- s !== void 0 && (yield* u.promise(() => gt(d, {
1349
- 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,
1350
1508
  eventType: "signal-awaited",
1351
- payload: { signalName: n.name }
1509
+ payload: { signalName: r.name }
1352
1510
  })));
1353
- let f = o.await(i), p = Number.isFinite(e) ? yield* u.race(f, a.sleep({
1354
- name: `await-signal-timeout/${n.name}`,
1355
- duration: `${e} millis`
1356
- }).pipe(u.andThen(u.die(/* @__PURE__ */ Error(`awaitSignalSuspending('${n.name}') timed out after ${e}ms`))))) : yield* f, m = yield* h.decodeUnknown(n.schema)(p);
1357
- return s !== void 0 && (yield* u.promise(() => gt(d, {
1358
- 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,
1359
1517
  eventType: "signal-received",
1360
1518
  payload: {
1361
- signalName: n.name,
1362
- value: m
1519
+ signalName: r.name,
1520
+ value: p
1363
1521
  }
1364
- }))), m;
1365
- }), vt = (e) => u.gen(function* () {
1522
+ }))), p;
1523
+ }), Lt = (e) => m.gen(function* () {
1366
1524
  let t = e.target.executionId, n = e.target.workflowName;
1367
1525
  if (t === void 0 || n === void 0) {
1368
1526
  let r = e.store;
1369
- if (r === void 0) return yield* u.die(/* @__PURE__ */ Error("completeSuspendingSignal: provide a store, or target.executionId AND target.workflowName"));
1370
- let i = yield* u.tryPromise({
1371
- 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),
1372
1530
  catch: (e) => e
1373
1531
  });
1374
1532
  t ??= i.executionId, n ??= i.tag;
1375
1533
  }
1376
1534
  if (t === void 0 || n === void 0) return { completed: !1 };
1377
- let r = mt(n, e.signalName), i = ht(r), a = new o.TokenParsed({
1535
+ let r = Nt(n, e.signalName), i = Pt(r), a = new u.TokenParsed({
1378
1536
  workflowName: n,
1379
1537
  executionId: t,
1380
1538
  deferredName: r
1381
1539
  }).asToken;
1382
- return yield* o.done(i, {
1540
+ return yield* u.done(i, {
1383
1541
  token: a,
1384
- exit: f.succeed(e.payload)
1542
+ exit: g.succeed(e.payload)
1385
1543
  }), { completed: !0 };
1386
- }), X = async (e, t) => {
1544
+ }), X = "_voltro_budget_holds", Rt = "budget-hold", zt = (e) => `${Rt}:${e}`, Bt = (e) => `${e.executionId}/${e.stepName}/${e.budget}#${e.generation}`, Vt = async (e, t) => (await e.query({
1545
+ table: X,
1546
+ predicate: b(x("executionId", t.executionId), x("stepName", t.stepName), x("budget", t.budget)),
1547
+ order: []
1548
+ })).length, Ht = M(X, {
1549
+ id: w({ prefix: "bhd" }),
1550
+ holdKey: N().maxLength(191),
1551
+ budget: N(),
1552
+ tenantId: N().nullable(),
1553
+ executionId: N(),
1554
+ workflowName: N(),
1555
+ signalName: N(),
1556
+ stepName: N(),
1557
+ spentMicroUsd: N().nullable(),
1558
+ limitMicroUsd: N().nullable(),
1559
+ heldAt: P().default("now"),
1560
+ releasedAt: P().nullable(),
1561
+ outcome: N().nullable()
1562
+ }).index(["budget", "releasedAt"]), Ut = () => {
1563
+ re({
1564
+ source: "framework",
1565
+ table: X,
1566
+ timeColumn: "releasedAt",
1567
+ ttlMs: ie(process.env.VOLTRO_BUDGET_HOLDS_TTL_HOURS, 720)
1568
+ });
1569
+ }, Wt = class extends Error {
1570
+ budget;
1571
+ holdKey;
1572
+ constructor(e, t, n) {
1573
+ super(`budget '${e}': the run was suspended waiting for headroom and gave up after ${n}ms (hold ${t}). Nothing was spent. Raise the budget, reset its window, or lift the hold, then re-drive the run.`), this.name = "BudgetHoldExpired", this.budget = e, this.holdKey = t;
1574
+ }
1575
+ }, Gt = 10080 * 6e4, Kt = (e) => m.gen(function* () {
1576
+ Ut();
1577
+ let t = e.timeoutMs ?? 6048e5, n = e.recheckEveryMs ?? 9e5, r = {
1578
+ executionId: e.executionId,
1579
+ stepName: e.stepName,
1580
+ budget: e.budget
1581
+ };
1582
+ for (;;) {
1583
+ let i = yield* m.promise(() => Jt(e.store, r)), a = i.length, o = i.length === 0 ? Date.now() : qt(i[0]?.heldAt), s = Number.isFinite(t) ? t - (Date.now() - o) : Infinity, c = Bt({
1584
+ ...r,
1585
+ generation: a
1586
+ });
1587
+ if (s <= 0) return yield* m.promise(() => Yt(e.store, r, "expired")), yield* m.fail(new Wt(e.budget, c, t));
1588
+ let l = zt(c);
1589
+ yield* m.promise(() => e.store.insertIgnore(X, {
1590
+ id: S({
1591
+ kind: "typeid",
1592
+ prefix: "bhd"
1593
+ }, X),
1594
+ holdKey: c,
1595
+ budget: e.budget,
1596
+ tenantId: e.tenantId,
1597
+ executionId: e.executionId,
1598
+ workflowName: e.workflowName,
1599
+ signalName: l,
1600
+ stepName: e.stepName,
1601
+ spentMicroUsd: e.spentMicroUsd === void 0 ? null : String(Math.round(e.spentMicroUsd)),
1602
+ limitMicroUsd: e.limitMicroUsd === void 0 ? null : String(Math.round(e.limitMicroUsd)),
1603
+ heldAt: /* @__PURE__ */ new Date(),
1604
+ releasedAt: null,
1605
+ outcome: null
1606
+ }, { conflictColumns: ["holdKey"] }));
1607
+ let u = Math.min(n, s);
1608
+ if (yield* It({ store: e.store }, {
1609
+ name: l,
1610
+ schema: y.Unknown,
1611
+ timeoutMs: u
1612
+ }).pipe(m.catchAllCause((e) => p.isInterruptedOnly(e) ? m.failCause(e) : m.void)), yield* m.promise(() => e.store.updateMany(X, {
1613
+ releasedAt: /* @__PURE__ */ new Date(),
1614
+ outcome: "recheck"
1615
+ }, { where: b(x("holdKey", c), E("releasedAt")) })), yield* e.hasHeadroom) return;
1616
+ }
1617
+ }), qt = (e) => e instanceof Date ? e.getTime() : typeof e == "string" ? Date.parse(e) : Date.now(), Jt = async (e, t) => [...await e.query({
1618
+ table: X,
1619
+ predicate: b(x("executionId", t.executionId), x("stepName", t.stepName), x("budget", t.budget)),
1620
+ order: []
1621
+ })].sort((e, t) => String(e.id).localeCompare(String(t.id))), Yt = async (e, t, n) => {
1622
+ await e.updateMany(X, {
1623
+ releasedAt: /* @__PURE__ */ new Date(),
1624
+ outcome: n
1625
+ }, { where: b(x("executionId", t.executionId), x("stepName", t.stepName), x("budget", t.budget), E("releasedAt")) });
1626
+ }, Xt = (e) => m.gen(function* () {
1627
+ let t = e.tenantId === void 0 ? b(x("budget", e.budget), E("releasedAt")) : b(x("budget", e.budget), x("tenantId", e.tenantId), E("releasedAt")), n = yield* m.promise(() => e.store.query({
1628
+ table: X,
1629
+ predicate: t,
1630
+ order: []
1631
+ })), r = 0;
1632
+ for (let t of n) (yield* m.promise(() => e.store.updateMany("_voltro_budget_holds", {
1633
+ releasedAt: /* @__PURE__ */ new Date(),
1634
+ outcome: e.outcome ?? "released"
1635
+ }, { where: b(x("id", String(t.id)), E("releasedAt")) }))) === 1 && (yield* Lt({
1636
+ target: {
1637
+ executionId: String(t.executionId),
1638
+ workflowName: String(t.workflowName)
1639
+ },
1640
+ signalName: String(t.signalName),
1641
+ payload: {
1642
+ released: !0,
1643
+ budget: e.budget
1644
+ }
1645
+ }).pipe(m.catchAll(() => m.succeed({ completed: !1 }))), r += 1);
1646
+ return { released: r };
1647
+ }), Zt = async (e, t) => {
1648
+ let n = t?.budget === void 0 ? E("releasedAt") : b(x("budget", t.budget), E("releasedAt"));
1649
+ return (await e.query({
1650
+ table: X,
1651
+ predicate: n,
1652
+ order: []
1653
+ })).map((e) => ({
1654
+ id: String(e.id),
1655
+ holdKey: String(e.holdKey),
1656
+ budget: String(e.budget),
1657
+ tenantId: e.tenantId ?? null,
1658
+ executionId: String(e.executionId),
1659
+ workflowName: String(e.workflowName),
1660
+ stepName: String(e.stepName),
1661
+ heldAt: e.heldAt instanceof Date ? e.heldAt.toISOString() : String(e.heldAt ?? "")
1662
+ }));
1663
+ }, Qt = async (e) => {
1664
+ let t = await Zt(e), n = /* @__PURE__ */ new Map();
1665
+ for (let e of t) {
1666
+ let t = `${e.budget}\u0000${e.tenantId ?? ""}`;
1667
+ n.has(t) || n.set(t, {
1668
+ budget: e.budget,
1669
+ tenantId: e.tenantId
1670
+ });
1671
+ }
1672
+ return [...n.values()];
1673
+ }, $t = async (e, t) => {
1387
1674
  if (e) try {
1388
1675
  await e.recordEvent(t);
1389
1676
  } catch {}
1390
- }, yt = (e) => {
1391
- 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);
1392
1679
  return {
1393
1680
  errorTag: r && typeof r == "object" && "_tag" in r ? String(r._tag) : null,
1394
1681
  errorMessage: r?.message ?? String(r)
1395
1682
  };
1396
- }, bt = (e, n) => {
1397
- let a = u.gen(function* () {
1398
- 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;
1399
- if (s === void 0) return yield* u.die(/* @__PURE__ */ Error("awaitUpdate: no active workflow run id in scope"));
1400
- 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;
1401
1688
  for (;;) {
1402
- let t = Date.now() - f;
1403
- if (t > o) return yield* u.die(/* @__PURE__ */ Error(`awaitUpdate('${n.name}') timed out after ${t}ms`));
1404
- 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 = {
1405
1692
  table: "_voltro_workflow_run_events",
1406
1693
  order: [{
1407
1694
  column: "occurredAt",
1408
1695
  direction: "asc"
1409
1696
  }],
1410
- predicate: v("runId", d),
1697
+ predicate: x("runId", u),
1411
1698
  projection: void 0,
1412
1699
  skip: void 0,
1413
1700
  take: 1e3
1414
- }, i = yield* u.tryPromise({
1415
- try: () => e.store.query(r),
1701
+ }, i = yield* m.tryPromise({
1702
+ try: () => t.store.query(n),
1416
1703
  catch: (e) => e
1417
- }), s = new Set(i.filter((e) => e.eventType === "update-completed" || e.eventType === "update-failed").map((e) => e.payload?.updateId).filter((e) => typeof e == "string" && e.length > 0)), c = i.find((e) => e.eventType === "update-requested" && e.payload?.updateName === 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));
1418
1705
  if (c !== void 0) {
1419
1706
  let e = c.payload.updateId;
1420
- yield* u.promise(() => X(l, {
1421
- runId: d,
1707
+ yield* m.promise(() => $t(l, {
1708
+ runId: u,
1422
1709
  eventType: "update-received",
1423
1710
  payload: {
1424
1711
  updateId: e,
1425
- updateName: n.name
1712
+ updateName: r.name
1426
1713
  }
1427
1714
  }));
1428
- let t = yield* h.decodeUnknown(n.schema)(c.payload?.value).pipe(u.tapErrorCause((t) => u.promise(() => X(l, {
1429
- runId: d,
1715
+ let t = yield* y.decodeUnknown(r.schema)(c.payload?.value).pipe(m.tapErrorCause((t) => m.promise(() => $t(l, {
1716
+ runId: u,
1430
1717
  eventType: "update-failed",
1431
1718
  payload: {
1432
1719
  updateId: e,
1433
- updateName: n.name,
1434
- ...yt(t)
1720
+ updateName: r.name,
1721
+ ...en(t)
1435
1722
  }
1436
- })))), 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, {
1437
- 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,
1438
1725
  eventType: "update-failed",
1439
1726
  payload: {
1440
1727
  updateId: e,
1441
- updateName: n.name,
1442
- ...yt(t)
1728
+ updateName: r.name,
1729
+ ...en(t)
1443
1730
  }
1444
1731
  }))));
1445
- return yield* u.promise(() => X(l, {
1446
- runId: d,
1732
+ return yield* m.promise(() => $t(l, {
1733
+ runId: u,
1447
1734
  eventType: "update-completed",
1448
1735
  payload: {
1449
1736
  updateId: e,
1450
- updateName: n.name,
1451
- result: r
1737
+ updateName: r.name,
1738
+ result: n
1452
1739
  }
1453
- })), r;
1740
+ })), n;
1454
1741
  }
1455
- yield* u.sleep(`${p} millis`), p = Math.min(p * 2, a);
1742
+ yield* m.sleep(`${f} millis`), f = Math.min(f * 2, a);
1456
1743
  }
1457
1744
  });
1458
- return i.make({
1459
- name: `await-update:${n.name}`,
1460
- success: n.success ?? n.schema,
1461
- execute: a
1745
+ return c.make({
1746
+ name: `await-update:${r.name}`,
1747
+ success: r.success ?? r.schema,
1748
+ execute: i
1462
1749
  });
1463
- }, xt = 8 * 1024, St = () => {
1750
+ }, nn = 8 * 1024, rn = 3, an = 2e3, on = () => {
1751
+ let e = (e) => {
1752
+ if (e === void 0) return;
1753
+ let t = Number(e);
1754
+ return Number.isFinite(t) && t > 0 ? Math.floor(t) : void 0;
1755
+ }, t = e(process.env.VOLTRO_WORKFLOW_MAX_RECLAIMS), n = e(process.env.VOLTRO_WORKFLOW_REPLAY_SHAPE_LIMIT);
1756
+ return {
1757
+ ...t === void 0 ? {} : { maxRunReclaims: t },
1758
+ ...n === void 0 ? {} : { replayShapeLimit: n }
1759
+ };
1760
+ }, sn = (e) => {
1761
+ let t = typeof e == "string" ? (() => {
1762
+ try {
1763
+ return JSON.parse(e);
1764
+ } catch {
1765
+ return;
1766
+ }
1767
+ })() : e;
1768
+ if (Array.isArray(t)) return t.filter((e) => typeof e == "string");
1769
+ }, cn = () => {
1464
1770
  let e = globalThis.crypto;
1465
1771
  return typeof e?.randomUUID == "function" ? e.randomUUID() : `${Date.now().toString(36)}${Math.random().toString(36).slice(2)}`;
1466
- }, Ct = (e) => `${e}_${St()}`, Z = (e, t = xt) => {
1772
+ }, ln = (e) => `${e}_${cn()}`, Z = (e, t = nn) => {
1467
1773
  if (e == null) return e;
1468
1774
  try {
1469
1775
  let n = JSON.stringify(e);
@@ -1479,8 +1785,8 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
1479
1785
  let t = {};
1480
1786
  for (let [n, r] of Object.entries(e)) t[n] = r instanceof Date ? r.toISOString() : r;
1481
1787
  return t;
1482
- }, wt = (e) => {
1483
- let t = e.truncateBytes ?? xt, n = e.makeId ?? Ct, 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;
1484
1790
  return {
1485
1791
  startStep: async ({ runId: o, stepName: s, attempt: c, stepInput: l, retryPolicy: u }) => {
1486
1792
  try {
@@ -1583,8 +1889,38 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
1583
1889
  return { id: l };
1584
1890
  }
1585
1891
  };
1586
- }, Tt = (i, a) => {
1587
- let o = i.truncateBytes ?? xt, c = i.makeId ?? Ct, d = i.recorder ?? wt(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 () => {
1588
1924
  if (i.onParentClose) try {
1589
1925
  await i.onParentClose({
1590
1926
  workflowName: i.name,
@@ -1593,14 +1929,14 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
1593
1929
  status: t
1594
1930
  });
1595
1931
  } catch (n) {
1596
- m("failed to apply workflow parent-close policy", {
1932
+ h("failed to apply workflow parent-close policy", {
1597
1933
  tag: i.name,
1598
1934
  executionId: e,
1599
1935
  status: t,
1600
1936
  reason: n?.message ?? String(n)
1601
1937
  });
1602
1938
  }
1603
- }), _ = (e, t, n) => u.promise(async () => {
1939
+ }), b = (e, t, n) => m.promise(async () => {
1604
1940
  if (i.onTerminal) try {
1605
1941
  await i.onTerminal({
1606
1942
  workflowName: i.name,
@@ -1609,7 +1945,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
1609
1945
  status: t
1610
1946
  });
1611
1947
  } catch (n) {
1612
- m("failed to release the workflow admission lease", {
1948
+ h("failed to release the workflow admission lease", {
1613
1949
  tag: i.name,
1614
1950
  executionId: e,
1615
1951
  status: t,
@@ -1617,33 +1953,34 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
1617
1953
  });
1618
1954
  }
1619
1955
  });
1620
- return (y, b) => u.gen(function* () {
1621
- 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(() => {
1622
- let n = l.squash(t);
1623
- 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, {
1624
1960
  tag: i.name,
1625
- executionId: b,
1961
+ executionId: S,
1626
1962
  reason: n?.message ?? String(n)
1627
1963
  });
1628
- }))), D = (i.store.query ? yield* u.promise(() => i.store.query({
1964
+ }))), D = (i.store.query ? yield* m.promise(() => i.store.query({
1629
1965
  table: "_voltro_workflow_runs",
1630
1966
  order: [],
1631
- predicate: v("executionId", b),
1967
+ predicate: x("executionId", S),
1632
1968
  projection: void 0,
1633
1969
  skip: void 0,
1634
1970
  take: 1
1635
1971
  })) : [])[0], O = D?.workflowVersion ?? null;
1636
1972
  if (D?.id !== void 0 && O !== null && i.workflowCompatibleVersions !== void 0 && i.workflowCompatibleVersions !== null && !i.workflowCompatibleVersions.includes(O)) {
1637
- let e = `Workflow '${i.name}' run '${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, {
1638
1974
  status: "failed",
1639
1975
  errorTag: "WorkflowVersionIncompatible",
1640
1976
  errorMessage: e,
1641
- completedAt: /* @__PURE__ */ new Date()
1977
+ completedAt: /* @__PURE__ */ new Date(),
1978
+ runnerEnteredAt: null
1642
1979
  }));
1643
- return t && h?.("workflowRuns", {
1980
+ return t && v?.("workflowRuns", {
1644
1981
  op: "update",
1645
1982
  row: Q(t)
1646
- }), yield* u.promise(() => d.recordEvent({
1983
+ }), yield* m.promise(() => f.recordEvent({
1647
1984
  runId: D.id,
1648
1985
  eventType: "run-failed",
1649
1986
  payload: {
@@ -1653,19 +1990,78 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
1653
1990
  compatibleWith: i.workflowCompatibleVersions,
1654
1991
  previousVersion: O
1655
1992
  }
1656
- })), yield* u.sync(() => i.recordRun?.({
1993
+ })), yield* m.sync(() => i.recordRun?.({
1657
1994
  name: i.name,
1658
1995
  status: "failed",
1659
1996
  durationMs: 0
1660
- })), yield* u.fail(Error(e));
1997
+ })), yield* m.fail(Error(e));
1661
1998
  }
1662
- yield* E("failed to record workflow start (continuing)", u.gen(function* () {
1663
- let e = yield* u.promise(() => i.store.insert("_voltro_workflow_runs", {
1664
- 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"),
1665
2061
  tag: i.name,
1666
- executionId: b,
2062
+ executionId: S,
1667
2063
  status: "running",
1668
- payload: y,
2064
+ payload: ee,
1669
2065
  workflowVersion: i.workflowVersion ?? null,
1670
2066
  workflowPatches: i.workflowPatches ?? null,
1671
2067
  output: null,
@@ -1678,55 +2074,58 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
1678
2074
  completedAt: null,
1679
2075
  durationMs: null,
1680
2076
  traceId: i.traceId ?? null,
1681
- parentExecutionId: C,
1682
- parentClosePolicy: w
2077
+ parentExecutionId: w,
2078
+ parentClosePolicy: ne,
2079
+ runnerEnteredAt: /* @__PURE__ */ new Date(),
2080
+ reclaimCount: 0
1683
2081
  }));
1684
- if (T = e.id, h?.("workflowRuns", {
2082
+ if (T = e.id, v?.("workflowRuns", {
1685
2083
  op: "insert",
1686
2084
  row: Q(e)
1687
2085
  }), T) {
1688
2086
  let e = T;
1689
- yield* u.promise(() => d.recordEvent({
2087
+ yield* m.promise(() => f.recordEvent({
1690
2088
  runId: e,
1691
2089
  eventType: "run-started",
1692
2090
  payload: {
1693
2091
  tag: i.name,
1694
- executionId: b,
2092
+ executionId: S,
1695
2093
  source: i.source ?? null,
1696
2094
  workflowVersion: i.workflowVersion ?? null,
1697
2095
  workflowPatches: i.workflowPatches ?? null,
1698
- parentExecutionId: C,
1699
- parentClosePolicy: w
2096
+ parentExecutionId: w,
2097
+ parentClosePolicy: ne
1700
2098
  }
1701
2099
  }));
1702
2100
  }
1703
2101
  }));
1704
- 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);
1705
- if (s.isResult(j) && j._tag === "Suspended") {
1706
- 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;
1707
- 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({
1708
2106
  error: n,
1709
2107
  source: "workflow",
1710
2108
  name: i.name,
1711
2109
  ...i.traceId ? { traceId: i.traceId } : {},
1712
2110
  fields: {
1713
- executionId: b,
2111
+ executionId: S,
1714
2112
  suspendedOnFailure: !0,
1715
2113
  ...r ? { errorTag: r } : {},
1716
2114
  ...T ? { runId: T } : {}
1717
2115
  }
1718
- }))), T && (yield* E("failed to record workflow suspend", u.gen(function* () {
1719
- 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, {
1720
2118
  status: "suspended",
2119
+ runnerEnteredAt: null,
1721
2120
  ...t ? {
1722
2121
  errorTag: r,
1723
2122
  errorMessage: a
1724
2123
  } : {}
1725
2124
  }));
1726
- e && h?.("workflowRuns", {
2125
+ e && v?.("workflowRuns", {
1727
2126
  op: "update",
1728
2127
  row: Q(e)
1729
- }), yield* u.promise(() => d.recordEvent({
2128
+ }), yield* m.promise(() => f.recordEvent({
1730
2129
  runId: T,
1731
2130
  eventType: "run-suspended",
1732
2131
  payload: t ? {
@@ -1736,79 +2135,99 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
1736
2135
  } : { reason: "workflow-suspend" }
1737
2136
  }));
1738
2137
  })));
1739
- let o = yield* te;
1740
- 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
+ }
1741
2159
  }
1742
- let M = j;
1743
- if (f.isFailure(M.exit)) {
1744
- 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);
1745
- return yield* u.sync(() => ne({
2160
+ if (g.isFailure(N.exit)) {
2161
+ let e = N.exit.cause, t = p.failureOption(e), n = t._tag === "Some" ? t.value : p.squash(e), r = n && typeof n == "object" && "_tag" in n ? String(n._tag) : null, a = n?.message ?? String(n);
2162
+ return yield* m.sync(() => se({
1746
2163
  error: n,
1747
2164
  source: "workflow",
1748
2165
  name: i.name,
1749
2166
  ...i.traceId ? { traceId: i.traceId } : {},
1750
2167
  fields: {
1751
- executionId: b,
2168
+ executionId: S,
1752
2169
  ...r ? { errorTag: r } : {},
1753
2170
  ...T ? { runId: T } : {}
1754
2171
  }
1755
- })), T && (yield* E("failed to record workflow failure", u.gen(function* () {
1756
- 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, {
1757
2174
  status: "failed",
1758
2175
  errorTag: r,
1759
2176
  errorMessage: a,
1760
2177
  completedAt: /* @__PURE__ */ new Date(),
1761
- durationMs: Date.now() - x
2178
+ durationMs: Date.now() - C,
2179
+ runnerEnteredAt: null
1762
2180
  }));
1763
- e && h?.("workflowRuns", {
2181
+ e && v?.("workflowRuns", {
1764
2182
  op: "update",
1765
2183
  row: Q(e)
1766
- }), yield* u.promise(() => d.recordEvent({
2184
+ }), yield* m.promise(() => f.recordEvent({
1767
2185
  runId: T,
1768
2186
  eventType: "run-failed",
1769
2187
  payload: {
1770
2188
  errorTag: r,
1771
2189
  errorMessage: a,
1772
- durationMs: Date.now() - x
2190
+ durationMs: Date.now() - C
1773
2191
  }
1774
- })), yield* g(b, "failed", T);
1775
- }))), 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?.({
1776
2194
  name: i.name,
1777
2195
  status: "failed",
1778
- durationMs: Date.now() - x
1779
- })), yield* u.failCause(e);
2196
+ durationMs: Date.now() - C
2197
+ })), yield* m.failCause(e);
1780
2198
  }
1781
- let N = M.exit.value;
1782
- return T && (yield* E("failed to record workflow success", u.gen(function* () {
1783
- 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, {
1784
2202
  status: "succeeded",
1785
- output: Z(N, o),
2203
+ output: Z(P, l),
1786
2204
  completedAt: /* @__PURE__ */ new Date(),
1787
- durationMs: Date.now() - x
2205
+ durationMs: Date.now() - C,
2206
+ runnerEnteredAt: null
1788
2207
  }));
1789
- e && h?.("workflowRuns", {
2208
+ e && v?.("workflowRuns", {
1790
2209
  op: "update",
1791
2210
  row: Q(e)
1792
- }), yield* u.promise(() => d.recordEvent({
2211
+ }), yield* m.promise(() => f.recordEvent({
1793
2212
  runId: T,
1794
2213
  eventType: "run-succeeded",
1795
- payload: { durationMs: Date.now() - x }
1796
- })), yield* g(b, "succeeded", T);
1797
- }))), 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?.({
1798
2217
  name: i.name,
1799
2218
  status: "succeeded",
1800
- durationMs: Date.now() - x,
2219
+ durationMs: Date.now() - C,
1801
2220
  completedAtSec: Date.now() / 1e3
1802
- })), N;
2221
+ })), P;
1803
2222
  });
1804
- }, Et = (e) => e === "cancel" || e === "terminate", Dt = (e) => e === "running" || e === "suspended", Ot = async (e) => {
2223
+ }, pn = (e) => e === "cancel" || e === "terminate", mn = (e) => e === "running" || e === "suspended", hn = async (e) => {
1805
2224
  let t = await e.store.query({
1806
2225
  table: "_voltro_workflow_runs",
1807
2226
  order: [{
1808
2227
  column: "startedAt",
1809
2228
  direction: "asc"
1810
2229
  }],
1811
- predicate: v("parentExecutionId", e.parentExecutionId),
2230
+ predicate: x("parentExecutionId", e.parentExecutionId),
1812
2231
  projection: void 0,
1813
2232
  skip: void 0,
1814
2233
  take: e.limit ?? 1e3
@@ -1827,7 +2246,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
1827
2246
  });
1828
2247
  continue;
1829
2248
  }
1830
- if (!Et(r.parentClosePolicy)) {
2249
+ if (!pn(r.parentClosePolicy)) {
1831
2250
  n.push({
1832
2251
  ...t,
1833
2252
  action: "skipped",
@@ -1835,7 +2254,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
1835
2254
  });
1836
2255
  continue;
1837
2256
  }
1838
- if (!Dt(r.status)) {
2257
+ if (!mn(r.status)) {
1839
2258
  n.push({
1840
2259
  ...t,
1841
2260
  action: "skipped",
@@ -1883,7 +2302,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
1883
2302
  }
1884
2303
  }
1885
2304
  return n;
1886
- }, kt = (e) => {
2305
+ }, gn = (e) => {
1887
2306
  if (e == null) return null;
1888
2307
  if (e instanceof Date) return e;
1889
2308
  if (typeof e == "string" || typeof e == "number") {
@@ -1891,7 +2310,7 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
1891
2310
  return Number.isNaN(t.getTime()) ? null : t;
1892
2311
  }
1893
2312
  return null;
1894
- }, At = (e) => typeof e == "number" ? e : e == null ? null : Number(e), $ = (e) => e == null ? null : String(e), jt = (e) => {
2313
+ }, _n = (e) => typeof e == "number" ? e : e == null ? null : Number(e), $ = (e) => e == null ? null : String(e), vn = (e) => {
1895
2314
  let t = /* @__PURE__ */ new Map();
1896
2315
  for (let n of e) {
1897
2316
  let e = String(n.stepName), r = t.get(e);
@@ -1899,27 +2318,27 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
1899
2318
  }
1900
2319
  let n = [];
1901
2320
  for (let [e, r] of t) {
1902
- r.sort((e, t) => (At(e.attempt) ?? 0) - (At(t.attempt) ?? 0));
2321
+ r.sort((e, t) => (_n(e.attempt) ?? 0) - (_n(t.attempt) ?? 0));
1903
2322
  let t = r[r.length - 1], i = $(t.errorTag), a = $(t.errorMessage), o = i !== null || a !== null ? {
1904
2323
  tag: i,
1905
2324
  message: a ?? ""
1906
2325
  } : null;
1907
2326
  n.push({
1908
2327
  name: e,
1909
- attempt: At(t.attempt) ?? r.length,
2328
+ attempt: _n(t.attempt) ?? r.length,
1910
2329
  attempts: r.length,
1911
2330
  status: t.status ?? "running",
1912
2331
  input: t.input ?? null,
1913
2332
  output: t.output ?? null,
1914
2333
  error: o,
1915
- durationMs: At(t.durationMs)
2334
+ durationMs: _n(t.durationMs)
1916
2335
  });
1917
2336
  }
1918
2337
  return n.sort((t, n) => {
1919
2338
  let r = e.find((e) => String(e.stepName) === t.name), i = e.find((e) => String(e.stepName) === n.name);
1920
- return (kt(r?.startedAt)?.getTime() ?? 0) - (kt(i?.startedAt)?.getTime() ?? 0);
2339
+ return (gn(r?.startedAt)?.getTime() ?? 0) - (gn(i?.startedAt)?.getTime() ?? 0);
1921
2340
  }), n;
1922
- }, Mt = (e) => {
2341
+ }, yn = (e) => {
1923
2342
  if (e == null) return null;
1924
2343
  if (typeof e == "string") try {
1925
2344
  return JSON.parse(e);
@@ -1927,10 +2346,10 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
1927
2346
  return null;
1928
2347
  }
1929
2348
  return typeof e == "object" ? e : null;
1930
- }, Nt = async (e, t) => {
1931
- 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];
1932
2351
  if (r === void 0) return null;
1933
- 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);
1934
2353
  return {
1935
2354
  id: i,
1936
2355
  executionId: $(r.executionId) ?? "",
@@ -1938,19 +2357,19 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
1938
2357
  status: r.status ?? "running",
1939
2358
  input: r.payload ?? null,
1940
2359
  output: r.output ?? null,
1941
- subject: Mt(r.subject),
2360
+ subject: yn(r.subject),
1942
2361
  source: $(r.source),
1943
- steps: jt(o),
1944
- startedAt: kt(r.startedAt) ?? /* @__PURE__ */ new Date(0),
1945
- finishedAt: kt(r.completedAt),
2362
+ steps: vn(o),
2363
+ startedAt: gn(r.startedAt) ?? /* @__PURE__ */ new Date(0),
2364
+ finishedAt: gn(r.completedAt),
1946
2365
  traceId: $(r.traceId),
1947
2366
  parentExecutionId: $(r.parentExecutionId),
1948
2367
  parentClosePolicy: $(r.parentClosePolicy)
1949
2368
  };
1950
- }, Pt = () => {
1951
- let e = [], n = [], r = 0, i = 0;
2369
+ }, xn = () => {
2370
+ let e = [], t = [], r = 0, i = 0;
1952
2371
  return {
1953
- layer: m.succeed(t, {
2372
+ layer: v.succeed(n, {
1954
2373
  startStep: async ({ runId: t, stepName: n, attempt: i, stepInput: a, retryPolicy: o }) => {
1955
2374
  let s = `wfstep_mem_${++r}`;
1956
2375
  return e.push({
@@ -1978,12 +2397,12 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
1978
2397
  let o = e.find((e) => e.id === t);
1979
2398
  o !== void 0 && (o.status = "failed", o.errorTag = n, o.errorMessage = r, o.errorCause = i ?? null, o.completedAt = /* @__PURE__ */ new Date(), o.durationMs = a);
1980
2399
  },
1981
- recordEvent: async ({ runId: e, eventType: t, payload: r, stepName: a, attempt: o }) => {
2400
+ recordEvent: async ({ runId: e, eventType: n, payload: r, stepName: a, attempt: o }) => {
1982
2401
  let s = `wfev_mem_${++i}`;
1983
- return n.push({
2402
+ return t.push({
1984
2403
  id: s,
1985
2404
  runId: e,
1986
- eventType: t,
2405
+ eventType: n,
1987
2406
  payload: r ?? null,
1988
2407
  stepName: a ?? null,
1989
2408
  attempt: o ?? null,
@@ -1992,8 +2411,8 @@ var j = c.layerMemory, M = O("_voltro_workflow_runs", {
1992
2411
  }
1993
2412
  }),
1994
2413
  readSteps: () => e,
1995
- readEvents: () => n
2414
+ readEvents: () => t
1996
2415
  };
1997
2416
  };
1998
2417
  //#endregion
1999
- export { ce as $, Ie as A, De as B, Ve as C, Ge as D, Je as E, z as F, Oe as G, je as H, L as I, Se as J, we as K, ke as L, Fe as M, R as N, ze as O, ge as P, xe as Q, W as R, Ue as S, We as T, be as U, G as V, _e as W, U as X, ye as Y, Ee as Z, rt as _, Q as a, le as at, K as b, bt as c, se as ct, mt as d, re as dt, he as et, lt as f, N as ft, at as g, dt as h, wt as i, ue as it, Ne as j, Re as k, _t as l, ae as lt, ut as m, j as mt, Nt as n, me as nt, Z as o, F as ot, Y as p, M as pt, Me as q, Ot as r, pe as rt, Tt as s, oe as st, Pt as t, de as tt, vt as u, ie as ut, Xe as v, Be as w, He as x, Ze as y, Ae 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 };