@voltro/cli 0.40.0 → 0.42.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.
Files changed (104) hide show
  1. package/CHANGELOG.md +171 -0
  2. package/dist/{apiBuild-C8xBEYbL.js → apiBuild-B_iH24qf.js} +2 -2
  3. package/dist/apiBuild-RM5W5YXk.js +2 -0
  4. package/dist/bin.js +1 -1
  5. package/dist/{build-CkhFGnKA.js → build-DUdi6F_Q.js} +150 -150
  6. package/dist/{checkCommand-QbHshOac.js → checkCommand-B2RWrpWi.js} +1 -1
  7. package/dist/{checkCommand-BcXJa2IS.js → checkCommand-DWL2_PPR.js} +2 -2
  8. package/dist/{codegenCommand-DF2OJh3O.js → codegenCommand-DkjoJ30Q.js} +2 -2
  9. package/dist/{codemodRunner-BcOvi4A2.js → codemodRunner-sFuWDETH.js} +520 -460
  10. package/dist/{commands-7Z7-HOE3.js → commands-DoTClnSk.js} +22 -22
  11. package/dist/{dashboardCommand-CUycH6dR.js → dashboardCommand-Bro7Jwts.js} +5 -5
  12. package/dist/dataCommand-Rj57y1vg.js +669 -0
  13. package/dist/dataProfile-Cm0YVKSy.js +18 -0
  14. package/dist/{dbCommand-DSwGv9wS.js → dbCommand-B237qI-j.js} +343 -316
  15. package/dist/dbCommand-BvQeKQOb.js +2 -0
  16. package/dist/{dev-Dh1NuYx1.js → dev-D4l_YOzI.js} +22 -22
  17. package/dist/{dev-D8JSKlBM.js → dev-DuqBJC7g.js} +1 -1
  18. package/dist/doctorCommand-Bw3V4L1j.js +2 -0
  19. package/dist/{doctorCommand-C-8-Z9D6.js → doctorCommand-TmZTAepc.js} +385 -279
  20. package/dist/{dormancyCommand-A79Odglm.js → dormancyCommand-CUKhRmGG.js} +1 -1
  21. package/dist/{embeddingsCommand-CoiyHfkY.js → embeddingsCommand-Db-iQM3l.js} +1 -1
  22. package/dist/{envCommand-B6d0s-jZ.js → envCommand-DQ_URZq9.js} +12 -12
  23. package/dist/{evolveCommand-BC5a9lxX.js → evolveCommand-CghRPrGO.js} +2 -2
  24. package/dist/index.js +1 -1
  25. package/dist/{infoCommand-ZqSVzJZ4.js → infoCommand-BCs_ZFnl.js} +1 -1
  26. package/dist/{migrate-BnPw2zC8.js → migrate-DN47p2PG.js} +1 -1
  27. package/dist/{runtimeTrace-BslKJjDY.js → runtimeTrace-jFKvOPBz.js} +1 -1
  28. package/dist/{sdkgen-DQ8uEmmn.js → sdkgen-COQqHB9V.js} +1 -1
  29. package/dist/{serveCommand-Dqb9Ku1-.js → serveCommand-C512kzZA.js} +417 -411
  30. package/dist/serveCommand-gj7MsqXY.js +2 -0
  31. package/dist/serveEntry.js +1 -1
  32. package/dist/{start-dkNYKtgQ.js → start-BjcuFME_.js} +379 -343
  33. package/dist/{start-BA7txHhY.js → start-fifc0xpW.js} +1 -1
  34. package/dist/startEntry.js +1 -1
  35. package/dist/updateCommand-B2alql9k.js +2 -0
  36. package/dist/{updateCommand-eoGpZr3E.js → updateCommand-HZQVBU3T.js} +1 -1
  37. package/dist/webDev-D6QeXw3P.js +2 -0
  38. package/dist/{webDev-bybjZA0o.js → webDev-Dk8lFUzf.js} +642 -525
  39. package/dist/{webhooksCommand-DubZWNOx.js → webhooksCommand-D7ZpH7w0.js} +1 -1
  40. package/package.json +23 -17
  41. package/templates/AGENTS.md +1 -1
  42. package/templates/agent-docs/_index.md +1 -1
  43. package/templates/agent-docs/_manifest.json +1 -1
  44. package/templates/agent-docs/cli.md +79 -6
  45. package/templates/agent-docs/data.md +33 -0
  46. package/templates/agent-docs/plugins/governance.md +8 -0
  47. package/templates/agent-docs/routing.md +141 -28
  48. package/templates/agent-docs/security.md +24 -0
  49. package/templates/agent-docs/whats-new.md +48 -109
  50. package/templates/apps/api-ai/package.json +7 -7
  51. package/templates/apps/api-auth/package.json +8 -8
  52. package/templates/apps/api-backend/package.json +7 -7
  53. package/templates/apps/api-backend-deactivation/package.json +7 -7
  54. package/templates/apps/api-backend-mail/package.json +8 -8
  55. package/templates/apps/api-backend-mariadb/package.json +9 -9
  56. package/templates/apps/api-backend-sqlite/package.json +8 -8
  57. package/templates/apps/api-backend-storage/package.json +8 -8
  58. package/templates/apps/api-cms/package.json +10 -10
  59. package/templates/apps/api-collab/package.json +8 -8
  60. package/templates/apps/api-data-advanced/package.json +8 -8
  61. package/templates/apps/api-durable/package.json +8 -8
  62. package/templates/apps/api-feature-flags/package.json +9 -9
  63. package/templates/apps/api-governance/package.json +8 -8
  64. package/templates/apps/api-kv/package.json +8 -8
  65. package/templates/apps/api-moderation/package.json +8 -8
  66. package/templates/apps/api-observability/package.json +8 -8
  67. package/templates/apps/api-ratelimit/package.json +8 -8
  68. package/templates/apps/api-rbac/package.json +8 -8
  69. package/templates/apps/api-rest/package.json +7 -7
  70. package/templates/apps/api-saas/package.json +11 -11
  71. package/templates/apps/api-saas-starter/package.json +10 -10
  72. package/templates/apps/api-search/package.json +8 -8
  73. package/templates/apps/api-status/package.json +8 -8
  74. package/templates/apps/api-versioning/package.json +8 -8
  75. package/templates/apps/api-webhooks/package.json +9 -9
  76. package/templates/apps/changelog/package.json +6 -6
  77. package/templates/apps/edge-functions/package.json +2 -2
  78. package/templates/apps/frontend-admin/package.json +8 -8
  79. package/templates/apps/frontend-app/package.json +9 -9
  80. package/templates/apps/frontend-auth/package.json +8 -8
  81. package/templates/apps/frontend-blank/package.json +7 -7
  82. package/templates/apps/frontend-cms/package.json +9 -9
  83. package/templates/apps/frontend-collab/package.json +10 -10
  84. package/templates/apps/frontend-contact/package.json +7 -7
  85. package/templates/apps/frontend-dashboard/package.json +7 -7
  86. package/templates/apps/frontend-docs/package.json +7 -7
  87. package/templates/apps/frontend-i18n/package.json +6 -6
  88. package/templates/apps/frontend-landing/package.json +7 -7
  89. package/templates/apps/frontend-portal/package.json +8 -8
  90. package/templates/apps/frontend-saas/package.json +8 -8
  91. package/templates/apps/frontend-spa/package.json +7 -7
  92. package/templates/apps/frontend-ssr/package.json +7 -7
  93. package/templates/apps/frontend-ssr-api/package.json +8 -8
  94. package/templates/apps/frontend-static-blog/package.json +6 -6
  95. package/templates/apps/frontend-status/package.json +8 -8
  96. package/templates/apps/mobile-app/package.json +4 -4
  97. package/dist/apiBuild-BIyGkym8.js +0 -2
  98. package/dist/dataCommand-By78lscK.js +0 -540
  99. package/dist/dataProfile-dW-PsfLB.js +0 -15
  100. package/dist/dbCommand-DcqEyxju.js +0 -2
  101. package/dist/doctorCommand-FhQ7EVYL.js +0 -2
  102. package/dist/serveCommand-BmvEQCMS.js +0 -2
  103. package/dist/updateCommand-BauSVxPp.js +0 -2
  104. package/dist/webDev-CBbKs4dZ.js +0 -2
@@ -3,10 +3,10 @@ import { t } from "./frameworkInspectState-CX2250XB.js";
3
3
  import { r as n, t as r } from "./appModuleLoader-C9r9mxZt.js";
4
4
  import { t as i } from "./bootRefusal-pgvDxlrU.js";
5
5
  import { n as a, r as o } from "./startupRunner-CEqQq7ax.js";
6
- import { $ as s, $t as c, A as l, At as u, B as d, C as f, Ct as p, D as ee, Dt as te, E as ne, Et as m, F as re, Ft as h, G as g, Gt as ie, H as _, I as ae, It as oe, J as se, Jt as v, K as ce, Kt as y, L as le, Lt as ue, M as de, Mt as b, N as fe, Nt as pe, O as me, Ot as he, P as ge, Pt as _e, Q as ve, Qt as ye, R as be, Rt as x, S as xe, Sn as Se, St as Ce, T as we, Tt as Te, U as Ee, Ut as S, V as De, Vt as Oe, W as ke, Wt as Ae, X as je, Xt as Me, Y as Ne, Yt as Pe, Z as Fe, Zt as C, _ as Ie, _n as Le, _t as w, an as Re, at as ze, b as Be, bn as Ve, bt as He, c as Ue, cn as T, ct as We, dn as Ge, dt as Ke, en as qe, et as Je, f as Ye, fn as E, ft as Xe, g as Ze, gn as Qe, gt as $e, h as et, ht as tt, i as nt, in as rt, it, j as at, jt as ot, k as st, kt as ct, ln as D, lt, m as ut, mn as dt, mt as O, nn as k, nt as ft, o as A, on as pt, ot as mt, p as ht, pn as gt, pt as _t, q as vt, qt as yt, r as bt, rn as xt, rt as St, sn as Ct, st as wt, t as Tt, tn as Et, tt as Dt, u as Ot, un as kt, ut as At, v as jt, vn as j, vt as M, w as N, wt as Mt, x as Nt, xn as Pt, xt as Ft, y as It, yn as Lt, yt as Rt, zt } from "./dev-Dh1NuYx1.js";
6
+ import { $ as s, $t as ee, A as c, At as l, B as u, C as te, Ct as d, D as ne, Dt as f, E as re, Et as p, F as ie, Ft as m, G as h, Gt as ae, H as oe, I as se, It as ce, J as le, Jt as g, K as ue, Kt as _, L as de, Lt as fe, M as pe, Mt as v, N as me, Nt as he, O as ge, Ot as _e, P as ve, Pt as ye, Q as be, Qt as xe, R as Se, Rt as y, S as Ce, Sn as we, St as Te, T as Ee, Tt as De, U as Oe, Ut as b, V as ke, Vt as Ae, W as je, Wt as Me, X as Ne, Xt as Pe, Y as Fe, Yt as Ie, Z as Le, Zt as x, _ as Re, _n as ze, _t as S, an as Be, at as C, b as Ve, bn as He, bt as Ue, c as We, cn as w, ct as Ge, dn as Ke, dt as qe, en as Je, et as Ye, f as T, fn as E, ft as Xe, g as Ze, gn as Qe, gt as $e, h as et, ht as tt, i as nt, in as rt, it, j as at, jt as ot, k as st, kt as ct, ln as D, lt, m as ut, mn as dt, mt as O, nn as k, nt as ft, o as A, on as pt, ot as mt, p as ht, pn as gt, pt as _t, q as vt, qt as yt, r as bt, rn as xt, rt as St, sn as Ct, st as wt, t as Tt, tn as Et, tt as Dt, u as Ot, un as kt, ut as At, v as jt, vn as j, vt as M, w as N, wt as Mt, x as Nt, xn as Pt, xt as Ft, y as It, yn as Lt, yt as Rt, zt } from "./dev-D4l_YOzI.js";
7
7
  import { n as Bt } from "./cliArgs-D4p8n7EE.js";
8
8
  import { r as Vt } from "./appPort-B_HpJ_ck.js";
9
- import { dt as Ht, lt as P } from "./webDev-bybjZA0o.js";
9
+ import { ht as Ht, pt as P } from "./webDev-Dk8lFUzf.js";
10
10
  import { r as F } from "./dialectDriver-czCHYpeH.js";
11
11
  import { i as Ut, n as Wt } from "./connectionConfig-Bk9IC7D0.js";
12
12
  import { c as Gt, n as Kt, o as qt } from "./seedRunner-IdHEprqf.js";
@@ -16,9 +16,9 @@ import { h as un, o as dn } from "./inspect-B7U7Cl_Z.js";
16
16
  import { n as fn } from "./mssqlClusterPatch-_4cE_nun.js";
17
17
  import { i as pn, n as mn, r as hn, t as gn } from "./webhookDiscovery-CphsQe59.js";
18
18
  import { t as _n } from "./inspectMetrics-CfdKLh6t.js";
19
- import { r as vn, u as yn } from "./apiBuild-C8xBEYbL.js";
19
+ import { r as vn, u as yn } from "./apiBuild-B_iH24qf.js";
20
20
  import { t as bn } from "./bootTiming-BdyP9nYw.js";
21
- import { t as xn } from "./dataProfile-dW-PsfLB.js";
21
+ import { t as xn } from "./dataProfile-Cm0YVKSy.js";
22
22
  import { basename as Sn, join as Cn } from "node:path";
23
23
  import { existsSync as wn } from "node:fs";
24
24
  import { pathToFileURL as Tn } from "node:url";
@@ -107,8 +107,8 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
107
107
  }, Hi = (e) => async (t) => {
108
108
  let n = Ri(t, e.secret);
109
109
  if (n) return n;
110
- let r = t.headers["x-import-mode"], i = t.headers["x-import-on-conflict"], a = t.headers["x-import-atomic"] === "1" || t.headers["x-import-atomic"] === "true", o = t.headers["x-import-force"] === "1" || t.headers["x-import-force"] === "true", s = t.rawBody.byteLength >= 8 && Buffer.from(t.rawBody.subarray(0, 8)).toString("latin1") === Bi, c, l;
111
- if (s) c = Vi(t.rawBody), l = "upload";
110
+ let r = t.headers["x-import-mode"], i = t.headers["x-import-on-conflict"], a = t.headers["x-import-atomic"] === "1" || t.headers["x-import-atomic"] === "true", o = t.headers["x-import-force"] === "1" || t.headers["x-import-force"] === "true", s = t.headers["x-import-dry-run"] === "1" || t.headers["x-import-dry-run"] === "true", ee = (t.headers["x-import-tables"] ?? "").split(",").map((e) => e.trim()).filter(Boolean), c = t.rawBody.byteLength >= 8 && Buffer.from(t.rawBody.subarray(0, 8)).toString("latin1") === Bi, l, u;
111
+ if (c) l = Vi(t.rawBody), u = "upload";
112
112
  else {
113
113
  let n;
114
114
  try {
@@ -118,20 +118,22 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
118
118
  }
119
119
  if (typeof n.bundleKey != "string" || !n.bundleKey) return Q(400, { error: "body.bundleKey (string) is required for the storage transport" });
120
120
  if (!e.openArchive) return Q(501, { error: "storage transport not configured on this instance" });
121
- c = e.openArchive(n.bundleKey), l = "storage";
121
+ l = e.openArchive(n.bundleKey), u = "storage";
122
122
  }
123
- let u = await import("node:os"), d = await import("node:fs/promises"), f = await import("node:path"), p = await d.mkdtemp(f.join(u.tmpdir(), "voltro-admin-import-"));
123
+ let te = await import("node:os"), d = await import("node:fs/promises"), ne = await import("node:path"), f = await d.mkdtemp(ne.join(te.tmpdir(), "voltro-admin-import-"));
124
124
  try {
125
- e.assetSink ? await ki(c, {
126
- dir: p,
125
+ e.assetSink ? await ki(l, {
126
+ dir: f,
127
127
  blobs: e.assetSink
128
- }) : await Ai(c, p);
128
+ }) : await Ai(l, f);
129
129
  let t = await W.runPromiseExit(Ei({
130
130
  store: e.store,
131
- bundleDir: p,
131
+ bundleDir: f,
132
132
  ...r ? { mode: r } : {},
133
133
  ...i ? { onConflict: i } : {},
134
134
  ...a ? { atomic: a } : {},
135
+ ...s ? { dryRun: s } : {},
136
+ ...ee.length > 0 ? { tables: ee } : {},
135
137
  ...e.snapshot ? { targetSnapshot: e.snapshot } : {},
136
138
  force: o,
137
139
  onWarn: (e) => zi.warn("admin.import", { message: e }),
@@ -142,7 +144,7 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
142
144
  if (e && e._tag === "SchemaDriftError") {
143
145
  let t = e;
144
146
  return zi.warn("admin.import refused (schema drift)", {
145
- transport: l,
147
+ transport: u,
146
148
  bundle: t.bundleFingerprint.slice(0, 16),
147
149
  target: t.targetFingerprint.slice(0, 16)
148
150
  }), Q(409, {
@@ -150,33 +152,37 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
150
152
  bundleFingerprint: t.bundleFingerprint,
151
153
  targetFingerprint: t.targetFingerprint,
152
154
  diff: t.diff,
153
- hint: "re-export against the current schema, or resend with x-import-force: 1"
155
+ hint: "each line above would break the load: a table or column the bundle carries that the target cannot take, or a column the target requires that the bundle has no value for. Fix the target schema, re-export against it, or resend with x-import-force: 1 to write anyway."
154
156
  });
155
157
  }
156
158
  throw Error(String(e?.message ?? e ?? "import failed"));
157
159
  }
158
- let n = t.value, s = n.tables.reduce((e, t) => e + t.rowCount, 0);
159
- return zi.info("admin.import", {
160
- transport: l,
160
+ let n = t.value, c = n.tables.reduce((e, t) => e + t.rowCount, 0);
161
+ return zi.info(s ? "admin.import (dry run — nothing written)" : "admin.import", {
162
+ transport: u,
161
163
  tables: n.tables.length,
162
- rows: s,
164
+ rows: c,
163
165
  mode: r ?? "upsert",
164
166
  atomic: a
165
167
  }), Q(200, {
166
168
  tables: n.tables.length,
167
- rows: s,
168
- transport: l
169
+ rows: c,
170
+ transport: u,
171
+ ...s ? {
172
+ dryRun: !0,
173
+ wrote: !1
174
+ } : {}
169
175
  });
170
176
  } catch (e) {
171
177
  return zi.warn("admin.import failed", {
172
- transport: l,
178
+ transport: u,
173
179
  error: e?.message ?? String(e)
174
180
  }), Q(500, {
175
181
  error: "import failed",
176
182
  message: e?.message ?? String(e)
177
183
  });
178
184
  } finally {
179
- await d.rm(p, {
185
+ await d.rm(f, {
180
186
  recursive: !0,
181
187
  force: !0
182
188
  });
@@ -212,13 +218,13 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
212
218
  });
213
219
  }
214
220
  }
215
- let a = r.consistency === "snapshot" ? "snapshot" : i.consistency ?? "live", o = (typeof r.compression == "string" ? r.compression : void 0) ?? i.compression, s = i.scope ?? Gi(r), c = typeof r.bundleKey == "string" && r.bundleKey.length > 0, l = r.assets === !0 && e.assetSource ? { blobs: e.assetSource } : {}, u = await import("node:os"), d = await import("node:fs/promises"), f = await import("node:path"), p = await d.mkdtemp(f.join(u.tmpdir(), "voltro-admin-export-"));
221
+ let a = r.consistency === "snapshot" ? "snapshot" : i.consistency ?? "live", o = (typeof r.compression == "string" ? r.compression : void 0) ?? i.compression, s = i.scope ?? Gi(r), ee = typeof r.bundleKey == "string" && r.bundleKey.length > 0, c = r.assets === !0 && e.assetSource ? { blobs: e.assetSource } : {}, l = await import("node:os"), u = await import("node:fs/promises"), te = await import("node:path"), d = await u.mkdtemp(te.join(l.tmpdir(), "voltro-admin-export-"));
216
222
  try {
217
223
  let t = await W.runPromise(Ti({
218
224
  store: e.store,
219
225
  snapshot: e.snapshot,
220
226
  dialect: e.dialect,
221
- outDir: p,
227
+ outDir: d,
222
228
  ...i.subset ? { subset: i.subset } : {
223
229
  scope: s,
224
230
  ...e.tenantTables && e.tenantTables.length > 0 ? { tenantTables: e.tenantTables } : {}
@@ -226,45 +232,45 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
226
232
  consistency: a,
227
233
  ...o ? { compression: o } : {},
228
234
  ...i.masking ? { masking: i.masking } : {}
229
- })), n = t.tables.reduce((e, t) => e + t.rowCount, 0), u = t.masking?.transformed.length ?? 0;
230
- if (c) {
235
+ })), n = t.tables.reduce((e, t) => e + t.rowCount, 0), l = t.masking?.transformed.length ?? 0;
236
+ if (ee) {
231
237
  if (!e.putArchive) return Q(501, { error: "storage transport not configured on this instance" });
232
238
  let i = r.bundleKey;
233
239
  return await e.putArchive(i, () => wi({
234
- dir: p,
235
- ...l
240
+ dir: d,
241
+ ...c
236
242
  })), Ui.info("admin.export", {
237
243
  transport: "storage",
238
244
  tables: t.tables.length,
239
245
  rows: n,
240
- masked: u,
246
+ masked: l,
241
247
  bundleKey: i
242
248
  }), Q(200, {
243
249
  bundleKey: i,
244
250
  tables: t.tables.length,
245
251
  rows: n,
246
- masked: u,
252
+ masked: l,
247
253
  transport: "storage"
248
254
  });
249
255
  }
250
- let d = await Wi(wi({
251
- dir: p,
252
- ...l
256
+ let u = await Wi(wi({
257
+ dir: d,
258
+ ...c
253
259
  }));
254
260
  return Ui.info("admin.export", {
255
261
  transport: "download",
256
262
  tables: t.tables.length,
257
263
  rows: n,
258
- masked: u,
259
- bytes: d.byteLength
264
+ masked: l,
265
+ bytes: u.byteLength
260
266
  }), {
261
267
  status: 200,
262
268
  contentType: "application/octet-stream",
263
- body: d,
269
+ body: u,
264
270
  headers: {
265
271
  "x-export-tables": String(t.tables.length),
266
272
  "x-export-rows": String(n),
267
- "x-export-masked": String(u)
273
+ "x-export-masked": String(l)
268
274
  }
269
275
  };
270
276
  } catch (e) {
@@ -273,7 +279,7 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
273
279
  message: e?.message ?? String(e)
274
280
  });
275
281
  } finally {
276
- await d.rm(p, {
282
+ await u.rm(d, {
277
283
  recursive: !0,
278
284
  force: !0
279
285
  });
@@ -316,45 +322,45 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
316
322
  durationMs: e.durationMs,
317
323
  rowCount: e.rowCount
318
324
  })
319
- }), i = e.cache ?? Ji, a = e.kv ?? Br, o, c = () => void 0, l, f, p, ee, te, ne, oe, se = ie({
325
+ }), i = e.cache ?? Ji, a = e.kv ?? Br, o, ee = () => void 0, c, te, d, ne, f, re, ce, le = ae({
320
326
  store: e.store,
321
327
  warn: (e, t) => {
322
328
  process.stderr.write(`[workflow] ${e} ${JSON.stringify(t)}\n`);
323
329
  }
324
- }), ce = se.remember, le = se.resolve, ue = y({
330
+ }), ue = le.remember, de = le.resolve, fe = _({
325
331
  authority: e.authority,
326
332
  getStore: () => e.store
327
- }), b = (e.discovered.workflows?.length ?? 0) > 0 ? kr(() => o) : void 0, pe = (e.discovered.workflows?.length ?? 0) > 0 || (e.discovered.eventTriggers?.length ?? 0) > 0, me = pe || (e.discovered.workflowWorkers?.length ?? 0) > 0 || e.scheduleCoordination === "cluster", he = e.tenantIsolation === "namespace", ge = (e.log ?? L({ scope: "voltro:serve" })).child("webhooks"), ye, be, x = e.discovered.webhooks;
328
- if (x && x.outgoing.length > 0 && e.workflowEngineLayer !== void 0) {
333
+ }), v = (e.discovered.workflows?.length ?? 0) > 0 ? kr(() => o) : void 0, he = (e.discovered.workflows?.length ?? 0) > 0 || (e.discovered.eventTriggers?.length ?? 0) > 0, ge = he || (e.discovered.workflowWorkers?.length ?? 0) > 0 || e.scheduleCoordination === "cluster", _e = e.tenantIsolation === "namespace", ve = (e.log ?? L({ scope: "voltro:serve" })).child("webhooks"), xe, Se, y = e.discovered.webhooks;
334
+ if (y && y.outgoing.length > 0 && e.workflowEngineLayer !== void 0) {
329
335
  e.workflowEngineLayer;
330
- let t = T({
336
+ let t = w({
331
337
  store: e.store,
332
338
  schemaRegistry: e.schemaRegistry,
333
339
  cache: i,
334
340
  kv: a
335
- }), n = x.outgoing.map((e) => e.descriptor);
336
- be = _i.toLayer(mi(t, { events: n })), ye = hi(t, async (e) => {
337
- let t = p;
341
+ }), n = y.outgoing.map((e) => e.descriptor);
342
+ Se = _i.toLayer(mi(t, { events: n })), xe = hi(t, async (e) => {
343
+ let t = d;
338
344
  if (t === void 0) {
339
- ge.error("webhook delivery skipped — the workflow runtime was never built. This is a framework defect, not a configuration problem: report it with your engine setting. Deliveries are NOT queued and will not be retried.", {
345
+ ve.error("webhook delivery skipped — the workflow runtime was never built. This is a framework defect, not a configuration problem: report it with your engine setting. Deliveries are NOT queued and will not be retried.", {
340
346
  deliveryId: e.deliveryId,
341
347
  targetId: e.targetId
342
348
  });
343
349
  return;
344
350
  }
345
351
  t.runPromise(_i.execute(e)).catch((t) => {
346
- ge.error("deliverWebhook workflow crashed", {
352
+ ve.error("deliverWebhook workflow crashed", {
347
353
  deliveryId: e.deliveryId,
348
354
  targetId: e.targetId
349
355
  }, t);
350
356
  });
351
357
  }, { events: n });
352
358
  }
353
- let xe = /* @__PURE__ */ new Map();
354
- if (x) for (let e of x.incoming) {
359
+ let Ce = /* @__PURE__ */ new Map();
360
+ if (y) for (let e of y.incoming) {
355
361
  let t = e.descriptor.path ?? gi(e.descriptor.id), n = `VOLTRO_WEBHOOK_SECRET_${e.descriptor.id.toUpperCase().replace(/[^A-Z0-9]/g, "_")}`, r = yi(e.descriptor, {
356
362
  resolveSecret: async () => process.env[n] ?? null,
357
- resolveWorkflows: () => b === void 0 ? void 0 : X(b, {
363
+ resolveWorkflows: () => v === void 0 ? void 0 : X(v, {
358
364
  traceId: `incoming:${e.descriptor.id}`,
359
365
  source: `incoming:${e.descriptor.id}`
360
366
  }),
@@ -366,18 +372,18 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
366
372
  idempotency: e.idempotency,
367
373
  durationMs: e.durationMs
368
374
  };
369
- e.status >= 500 ? ge.error("incoming delivery failed", t) : e.status >= 400 ? ge.warn("incoming delivery rejected", t) : ge.info("incoming delivery handled", t);
375
+ e.status >= 500 ? ve.error("incoming delivery failed", t) : e.status >= 400 ? ve.warn("incoming delivery rejected", t) : ve.info("incoming delivery handled", t);
370
376
  }
371
377
  });
372
- xe.set(t, { handle: r });
378
+ Ce.set(t, { handle: r });
373
379
  }
374
380
  vr(), Wr((t) => yr(e.store, t.subjectId, t.resourceType, t.resourceId)) || L({ scope: "voltro:serve" }).info("policy guards: using the app-registered tuple source");
375
- let Se = [], Ce = [...e.discovered.outboxHandlers ?? [], ...mn((x?.outgoing.length ?? 0) + (x?.incoming.length ?? 0) + (x?.providers.length ?? 0), []) ? [{
381
+ let we = [], Te = [...e.discovered.outboxHandlers ?? [], ...mn((y?.outgoing.length ?? 0) + (y?.incoming.length ?? 0) + (y?.providers.length ?? 0), []) ? [{
376
382
  file: "<framework>/webhooks",
377
383
  id: "voltro-webhook-emit",
378
- definition: vi(() => ye)
379
- }] : []], we = Ce.length > 0 ? Me({
380
- handlers: Ce,
384
+ definition: vi(() => xe)
385
+ }] : []], Ee = Te.length > 0 ? Pe({
386
+ handlers: Te,
381
387
  store: e.store,
382
388
  log: (e.log ?? L({ scope: "voltro:serve" })).child("outbox"),
383
389
  onChange: (t) => e.store.onChange((e) => t({
@@ -385,9 +391,9 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
385
391
  op: e.op
386
392
  })),
387
393
  onShutdown: (e) => {
388
- Se.push(e);
394
+ we.push(e);
389
395
  }
390
- }) : void 0, S = v({
396
+ }) : void 0, b = g({
391
397
  definitions: (e.discovered.connections ?? []).map((e) => e.definition),
392
398
  store: e.store,
393
399
  publicUrl: yt(e.port ?? 4e3),
@@ -402,63 +408,63 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
402
408
  ...(e.discovered.streams ?? []).map((e) => e.descriptor.name)
403
409
  ]
404
410
  });
405
- let Oe = (e.log ?? L({ scope: "voltro:serve" })).child("events"), Ae = e.broadcastNamespace ?? Ze(e.plugins, void 0), Ne = Ie(e.plugins, Ae, Oe), Pe = e.membership?.instanceId ?? process.env.POD_NAME ?? process.env.HOSTNAME ?? `serve-${process.pid}`, Le = e.membership ?? jt(e.plugins, {
406
- instanceId: Pe,
407
- namespace: Ae,
411
+ let Ae = (e.log ?? L({ scope: "voltro:serve" })).child("events"), Me = e.broadcastNamespace ?? Ze(e.plugins, void 0), Fe = Re(e.plugins, Me, Ae), Ie = e.membership?.instanceId ?? process.env.POD_NAME ?? process.env.HOSTNAME ?? `serve-${process.pid}`, ze = e.membership ?? jt(e.plugins, {
412
+ instanceId: Ie,
413
+ namespace: Me,
408
414
  meta: { mode: "serve" },
409
- logger: Oe
410
- }), w = de({
415
+ logger: Ae
416
+ }), S = pe({
411
417
  events: e.discovered.events ?? [],
412
- origin: Pe,
413
- ...Ne.publishRemote === void 0 ? {} : { publishRemote: Ne.publishRemote }
414
- }), Re = (e.discovered.events ?? []).length > 0 ? await Ne.attach(w.bus) : null, ze = Ct({
418
+ origin: Ie,
419
+ ...Fe.publishRemote === void 0 ? {} : { publishRemote: Fe.publishRemote }
420
+ }), Be = (e.discovered.events ?? []).length > 0 ? await Fe.attach(S.bus) : null, C = Ct({
415
421
  store: e.store,
416
422
  schemaRegistry: e.schemaRegistry,
417
423
  cache: i,
418
424
  kv: a,
419
- ...ye === void 0 ? {} : { webhooksService: ye },
420
- ...b === void 0 ? {} : { workflowsProxy: b },
425
+ ...xe === void 0 ? {} : { webhooksService: xe },
426
+ ...v === void 0 ? {} : { workflowsProxy: v },
421
427
  eventTriggers: e.discovered.eventTriggers ?? [],
422
- namespaceIsolationOn: he,
428
+ namespaceIsolationOn: _e,
423
429
  ...e.ensureTenantProvisioned === void 0 ? {} : { ensureTenantProvisioned: e.ensureTenantProvisioned },
424
430
  ...e.resolveResidentStore === void 0 ? {} : { resolveResidentStore: e.resolveResidentStore },
425
- ...we === void 0 ? {} : { outbox: { nudge: we.nudge } },
426
- ...S.active ? { connections: { registry: S.registry } } : {},
427
- eventBus: w.bus
428
- }), Be = G.succeed(Qn, m), Ve = G.succeed(q, He), Ue = G.succeed($n, Rt), Ge = G.succeed(nr, Ft), qe = (t, n) => {
431
+ ...Ee === void 0 ? {} : { outbox: { nudge: Ee.nudge } },
432
+ ...b.active ? { connections: { registry: b.registry } } : {},
433
+ eventBus: S.bus
434
+ }), Ve = G.succeed(Qn, p), He = G.succeed(q, Ue), We = G.succeed($n, Rt), Ke = G.succeed(nr, Ft), Je = (t, n) => {
429
435
  let r = t.pipe(W.provide(Or(n)));
430
- return (e.baseLayer ? r.pipe(W.provide(e.baseLayer)) : r).pipe(W.provide(Be)).pipe(W.provide(Ve)).pipe(W.provide(Ue)).pipe(W.provide(Ge));
431
- }, Je = (e, t) => {
432
- let n = qe(e, t);
436
+ return (e.baseLayer ? r.pipe(W.provide(e.baseLayer)) : r).pipe(W.provide(Ve)).pipe(W.provide(He)).pipe(W.provide(We)).pipe(W.provide(Ke));
437
+ }, Ye = (e, t) => {
438
+ let n = Je(e, t);
433
439
  return qr(n);
434
- }, Ye = _n(), E = vt(e.plugins ?? [], Ye), Xe = d({
440
+ }, T = _n(), E = vt(e.plugins ?? [], T), Xe = u({
435
441
  plugins: e.plugins ?? [],
436
- metrics: Ye,
442
+ metrics: T,
437
443
  log: e.log ?? L({ scope: "voltro:serve" })
438
- }), Qe = g(e.plugins ?? [], Ye), $e = e.security?.defaultDeny ?? !0, et = jr({
444
+ }), Qe = h(e.plugins ?? [], T), $e = e.security?.defaultDeny ?? !0, et = jr({
439
445
  store: e.store,
440
446
  defaultDeny: $e,
441
447
  recordMetric: (e) => {
442
- Ye.record(e);
448
+ T.record(e);
443
449
  },
444
450
  ...E.mutation === void 0 ? {} : { interceptor: E.mutation },
445
- buildContext: (e, t, n) => ze(e, t, n),
446
- runEffect: Je,
447
- undoCapture: ve()
448
- }), nt = Fe();
451
+ buildContext: (e, t, n) => C(e, t, n),
452
+ runEffect: Ye,
453
+ undoCapture: be()
454
+ }), nt = Le();
449
455
  {
450
456
  let t = s();
451
457
  t !== void 0 && (e.log ?? L({ scope: "voltro:serve" })).info(t);
452
458
  }
453
- let rt = je({
459
+ let rt = Ne({
454
460
  store: e.store,
455
461
  ...e.approvals === void 0 ? {} : { defaultExpiryMs: e.approvals.defaultExpiryMs }
456
462
  }), it = br({
457
463
  defaultDeny: $e,
458
- buildContext: (e) => ze(e),
459
- runEffect: Je,
464
+ buildContext: (e) => C(e),
465
+ runEffect: Ye,
460
466
  recordMetric: (e) => {
461
- Ye.record(e);
467
+ T.record(e);
462
468
  },
463
469
  ...E.action === void 0 ? {} : { interceptor: E.action }
464
470
  }), st = Pr({
@@ -466,9 +472,9 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
466
472
  softDeleteScopedTables: e.softDeleteScopedTables
467
473
  }), ct = {
468
474
  defaultDeny: $e,
469
- buildContext: (e) => ze(e),
475
+ buildContext: (e) => C(e),
470
476
  finalize: (e, t) => st(e, t.subject),
471
- provideEffect: qe,
477
+ provideEffect: Je,
472
478
  ...E.query === void 0 ? {} : { interceptor: E.query }
473
479
  }, D = Nr(ct), ut = Mr({
474
480
  ...ct,
@@ -482,18 +488,18 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
482
488
  ...O(e.discovered.queries),
483
489
  ...nt.queries,
484
490
  ...rt.queries,
485
- ...S.queries
491
+ ...b.queries
486
492
  ]) k[t.descriptor.name] = (e) => Y(D(t, e), r, `subscription.${t.descriptor.name}`, void 0, void 0, Fr(t, e));
487
493
  for (let t of [
488
494
  ...O(e.discovered.mutations),
489
495
  ...nt.mutations,
490
496
  ...rt.mutations,
491
- ...S.mutations
497
+ ...b.mutations
492
498
  ]) {
493
499
  let n = Ar(t.descriptor.output);
494
500
  k[t.descriptor.name] = (r) => J(async (e, n) => et(t, e, n), r, `mutation.${t.descriptor.name}`, n, e.idempotency, jn(t.descriptor, "mutation"));
495
501
  }
496
- for (let t of [...O(e.discovered.actions), ...S.actions]) {
502
+ for (let t of [...O(e.discovered.actions), ...b.actions]) {
497
503
  let n = Ar(t.descriptor.output);
498
504
  k[t.descriptor.name] = (r) => J(async (e, n) => it(t, e, n), r, `action.${t.descriptor.name}`, n, e.idempotency, jn(t.descriptor, "action"));
499
505
  }
@@ -524,7 +530,7 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
524
530
  })
525
531
  }))
526
532
  ], mt = {
527
- candidates: h({
533
+ candidates: m({
528
534
  queries: e.discovered.queries,
529
535
  mutations: e.discovered.mutations,
530
536
  actions: e.discovered.actions,
@@ -573,26 +579,26 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
573
579
  ...e.httpRoutes ?? [],
574
580
  ...ht.httpRoutes,
575
581
  ..._t,
576
- ...S.httpRoutes
582
+ ...b.httpRoutes
577
583
  ];
578
- Object.assign(k, w.handlers);
584
+ Object.assign(k, S.handlers);
579
585
  for (let t of O(e.discovered.streams ?? [])) k[t.descriptor.name] = (n) => lr((r) => ni(r, (r) => {
580
- let i = ze(r), a = t.executor(n, i);
586
+ let i = C(r), a = t.executor(n, i);
581
587
  if (W.isEffect(a)) {
582
588
  let t = a.pipe(W.provide(Or(i.store)));
583
- return (e.baseLayer ? t.pipe(W.provide(e.baseLayer)) : t).pipe(W.provide(Be)).pipe(W.provide(Ve)).pipe(W.provide(Ue)).pipe(W.provide(Ge));
589
+ return (e.baseLayer ? t.pipe(W.provide(e.baseLayer)) : t).pipe(W.provide(Ve)).pipe(W.provide(He)).pipe(W.provide(We)).pipe(W.provide(Ke));
584
590
  }
585
591
  return typeof a == "object" && a && typeof a.then == "function" ? W.promise(() => a) : a;
586
592
  }), `stream.${t.descriptor.name}`);
587
593
  for (let t of e.discovered.workflows ?? []) k[t.definition.name] = (e) => J(async (e, n) => {
588
594
  let r = n;
589
- return X(b, {
595
+ return X(v, {
590
596
  subject: r.subject,
591
597
  traceId: r.traceId,
592
598
  source: "workflow-rpc"
593
599
  }).start(t.definition.name, e);
594
600
  }, e, `workflow.${t.definition.name}`);
595
- pe && (k[U.name] = (e) => Y(D({
601
+ he && (k[U.name] = (e) => Y(D({
596
602
  descriptor: U,
597
603
  executor: (e) => {
598
604
  let t = e.id;
@@ -690,16 +696,16 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
690
696
  }
691
697
  }, e), r, `subscription.${Nn.name}`), k[Mn.name] = (t) => J(async (t, n) => {
692
698
  let r = t;
693
- return await pt(e.store, n.subject, { executionId: r.executionId }), await b.cancel(r.workflowName, r.executionId), await Nt(r.workflowName, r.executionId, "workflow.cancel"), { ok: !0 };
699
+ return await pt(e.store, n.subject, { executionId: r.executionId }), await v.cancel(r.workflowName, r.executionId), await Nt(r.workflowName, r.executionId, "workflow.cancel"), { ok: !0 };
694
700
  }, t, `action.${Mn.name}`), k[Pn.name] = (t) => J(async (t, n) => {
695
701
  let r = t;
696
- return await pt(e.store, n.subject, { executionId: r.executionId }), await b.resume(r.workflowName, r.executionId), { ok: !0 };
702
+ return await pt(e.store, n.subject, { executionId: r.executionId }), await v.resume(r.workflowName, r.executionId), { ok: !0 };
697
703
  }, t, `action.${Pn.name}`), k[Ln.name] = (t) => J(async (t, n) => {
698
704
  let r = t;
699
- return await pt(e.store, n.subject, { id: r.id }), b.signal({ id: r.id }, r.signalName, r.payload);
705
+ return await pt(e.store, n.subject, { id: r.id }), v.signal({ id: r.id }, r.signalName, r.payload);
700
706
  }, t, `action.${Ln.name}`), k[Rn.name] = (t) => J(async (t, n) => {
701
707
  let r = t;
702
- return await pt(e.store, n.subject, { id: r.id }), b.update({ id: r.id }, r.updateName, r.payload, r.timeoutMs === void 0 ? void 0 : { timeoutMs: r.timeoutMs });
708
+ return await pt(e.store, n.subject, { id: r.id }), v.update({ id: r.id }, r.updateName, r.payload, r.timeoutMs === void 0 ? void 0 : { timeoutMs: r.timeoutMs });
703
709
  }, t, `action.${Rn.name}`));
704
710
  let St = [
705
711
  ...O(e.discovered.queries).map((e) => B(e.descriptor)),
@@ -709,13 +715,13 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
709
715
  ...nt.mutations.map((e) => z(e.descriptor)),
710
716
  ...rt.queries.map((e) => B(e.descriptor)),
711
717
  ...rt.mutations.map((e) => z(e.descriptor)),
712
- ...S.queries.map((e) => B(e.descriptor)),
713
- ...S.mutations.map((e) => z(e.descriptor)),
714
- ...S.actions.map((e) => R(e.descriptor)),
718
+ ...b.queries.map((e) => B(e.descriptor)),
719
+ ...b.mutations.map((e) => z(e.descriptor)),
720
+ ...b.actions.map((e) => R(e.descriptor)),
715
721
  ...O(e.discovered.streams ?? []).map((e) => An(e.descriptor)),
716
- ...w.rpcs,
722
+ ...S.rpcs,
717
723
  ...(e.discovered.workflows ?? []).map((e) => ri(e.definition)),
718
- ...pe ? [
724
+ ...he ? [
719
725
  B(U),
720
726
  B(In),
721
727
  B(Fn),
@@ -739,7 +745,7 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
739
745
  kind: "workflow",
740
746
  refId: t
741
747
  }).then(() => {})
742
- } : void 0, M = me ? await import("@voltro/workflow") : void 0, N = M?.makeWorkflowRunRecorder({
748
+ } : void 0, M = ge ? await import("@voltro/workflow") : void 0, N = M?.makeWorkflowRunRecorder({
743
749
  store: e.store,
744
750
  ...e.workflowRecording === void 0 ? {} : { recording: e.workflowRecording },
745
751
  ...kt === void 0 ? {} : { wakeups: kt }
@@ -755,8 +761,8 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
755
761
  interruptChild: async (t, n) => {
756
762
  let r = (e.discovered.workflows ?? []).find((e) => e.definition.name === t);
757
763
  if (!r) throw Error(`Unknown child workflow: ${t}`);
758
- if (!p) throw Error("Workflow runtime is not ready");
759
- await p.runPromise(r.definition.interrupt(n));
764
+ if (!d) throw Error("Workflow runtime is not ready");
765
+ await d.runPromise(r.definition.interrupt(n));
760
766
  }
761
767
  });
762
768
  }, Nt = async (t, n, r) => {
@@ -786,12 +792,12 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
786
792
  }), a && await Mt(n, "cancelled");
787
793
  }, Pt = [
788
794
  ...zr(e.discovered.workflows ?? [], {
789
- buildContext: (t, n) => e.buildContextForWorkflow?.(t, n) ?? ze({
795
+ buildContext: (t, n) => e.buildContextForWorkflow?.(t, n) ?? C({
790
796
  subject: t.subject,
791
797
  traceId: t.traceId
792
798
  }, e.store, void 0, `workflow:${n.workflowName}`, { parentExecutionId: n.executionId }),
793
- resolveStartContext: le,
794
- ...ue === void 0 ? {} : { resolveAuthority: ue }
799
+ resolveStartContext: de,
800
+ ...fe === void 0 ? {} : { resolveAuthority: fe }
795
801
  }, (t, n, r) => {
796
802
  let i = M.getWorkflowVersionMetadata(t.definition);
797
803
  return M.wrapWorkflowExecuteWithRunRecording({
@@ -806,9 +812,9 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
806
812
  parentExecutionId: r?.parentExecutionId ?? null,
807
813
  parentClosePolicy: r?.parentClosePolicy ?? null,
808
814
  onParentClose: ({ executionId: e, status: t }) => Mt(e, t),
809
- ...We(t.definition),
815
+ ...Ge(t.definition),
810
816
  onTerminal: async ({ executionId: e }) => {
811
- await f?.gate.release(e);
817
+ await te?.gate.release(e);
812
818
  },
813
819
  recorder: N,
814
820
  pluginWorkflowStepLayer: Qe,
@@ -816,26 +822,26 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
816
822
  }, n);
817
823
  }),
818
824
  ...e.discovered.workflowWorkers ?? [],
819
- ...be === void 0 ? [] : [be]
820
- ], It = [...(e.discovered.workflows ?? []).map((e) => e.definition.name).filter(Boolean), ...be === void 0 ? [] : ["voltro.deliverWebhook"]], Lt = Pt.length > 0 ? G.mergeAll(...Pt) : G.empty;
821
- if (((e.discovered.workflows?.length ?? 0) > 0 || (e.discovered.workflowWorkers?.length ?? 0) > 0 || e.scheduleCoordination === "cluster" || be !== void 0) && e.workflowEngineLayer !== void 0) {
825
+ ...Se === void 0 ? [] : [Se]
826
+ ], It = [...(e.discovered.workflows ?? []).map((e) => e.definition.name).filter(Boolean), ...Se === void 0 ? [] : ["voltro.deliverWebhook"]], Lt = Pt.length > 0 ? G.mergeAll(...Pt) : G.empty;
827
+ if (((e.discovered.workflows?.length ?? 0) > 0 || (e.discovered.workflowWorkers?.length ?? 0) > 0 || e.scheduleCoordination === "cluster" || Se !== void 0) && e.workflowEngineLayer !== void 0) {
822
828
  let t = Lt.pipe(G.provideMerge(e.workflowEngineLayer));
823
- p = Bn.make(e.baseLayer === void 0 ? t : t.pipe(G.provideMerge(e.baseLayer))), await p.runPromise(W.void), (e.log ?? L({ scope: "voltro:serve" })).child("workflow").info(`workflow runtime ready — ${It.length} entity type(s) registered`, { entities: It });
824
- let n = await import("@voltro/workflow/cluster"), r = (e) => p.runPromise(n.redriveFailedRun(e)), i = (e) => p.runPromise(n.resumeRunFromStep(e));
825
- ne = await j({
829
+ d = Bn.make(e.baseLayer === void 0 ? t : t.pipe(G.provideMerge(e.baseLayer))), await d.runPromise(W.void), (e.log ?? L({ scope: "voltro:serve" })).child("workflow").info(`workflow runtime ready — ${It.length} entity type(s) registered`, { entities: It });
830
+ let n = await import("@voltro/workflow/cluster"), r = (e) => d.runPromise(n.redriveFailedRun(e)), i = (e) => d.runPromise(n.resumeRunFromStep(e));
831
+ re = await j({
826
832
  provider: Ci(e.plugins ?? [])?.broadcast?.provider,
827
833
  crossReplica: Ci(e.plugins ?? [])?.broadcast?.crossReplica ?? !1,
828
- namespace: Ae,
834
+ namespace: Me,
829
835
  replicaId: crypto.randomUUID(),
830
- pollStorage: () => p.runPromise(n.pollWorkflowStorage),
836
+ pollStorage: () => d.runPromise(n.pollWorkflowStorage),
831
837
  onChange: (t) => e.store.onChange((e) => t({
832
838
  table: e.table,
833
839
  op: e.op,
834
840
  ...e.origin === void 0 ? {} : { origin: e.origin }
835
841
  })),
836
842
  log: (e.log ?? L({ scope: "voltro:serve" })).child("workflow")
837
- }), ee = async (t) => {
838
- let n = await _({
843
+ }), ne = async (t) => {
844
+ let n = await oe({
839
845
  store: e.store,
840
846
  workflows: e.discovered.workflows ?? [],
841
847
  runRedrive: r
@@ -852,8 +858,8 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
852
858
  activitiesReset: n.outcome.activitiesReset,
853
859
  reason: n.outcome.reason
854
860
  };
855
- }, te = async (t) => {
856
- let n = await Ee({
861
+ }, f = async (t) => {
862
+ let n = await Oe({
857
863
  store: e.store,
858
864
  workflows: e.discovered.workflows ?? [],
859
865
  runResume: i
@@ -876,7 +882,7 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
876
882
  let a = (e.scheduleCoordination ?? "single") === "advisoryLock" ? xr(e.store, e.scheduleReplicaId ?? `pid-${process.pid}`) : Xr, s = Dr({
877
883
  coordinator: a,
878
884
  replicaId: e.scheduleReplicaId ?? `pid-${process.pid}`
879
- }), u = {
885
+ }), l = {
880
886
  info: (e, t) => {
881
887
  process.stdout.write(`[flow-control] ${e} ${t ? JSON.stringify(t) : ""}\n`);
882
888
  },
@@ -886,19 +892,19 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
886
892
  error: (e, t) => {
887
893
  process.stderr.write(`[flow-control] ERROR ${e} ${t ? JSON.stringify(t) : ""}\n`);
888
894
  }
889
- }, d, m = () => {
890
- if (d !== void 0) return d;
891
- if (o !== void 0 && N !== void 0) return d = re({
895
+ }, u, p = () => {
896
+ if (u !== void 0) return u;
897
+ if (o !== void 0 && N !== void 0) return u = ie({
892
898
  store: e.store,
893
899
  log: I,
894
900
  workflows: e.discovered.workflows ?? [],
895
901
  workflowsProxy: o,
896
- workflowRuntime: p,
902
+ workflowRuntime: d,
897
903
  workflowRunRecorder: N,
898
904
  closeChildrenForParent: Mt
899
- }), d;
905
+ }), u;
900
906
  };
901
- c = m, f = tt({
907
+ ee = p, te = tt({
902
908
  store: e.store,
903
909
  onChange: (t) => e.store.onChange((e) => t({
904
910
  table: e.table,
@@ -912,7 +918,7 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
912
918
  },
913
919
  workflows: e.discovered.workflows ?? [],
914
920
  facade: () => o,
915
- cancelRunWithReason: m,
921
+ cancelRunWithReason: p,
916
922
  recordRunEvent: () => N?.recordEvent,
917
923
  ...e.workflowStaleness === void 0 ? {} : { staleness: e.workflowStaleness },
918
924
  ...e.workflowSuspendSignalHintMs === void 0 ? {} : { suspendSignalHintMs: e.workflowSuspendSignalHintMs },
@@ -921,14 +927,14 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
921
927
  await wt({
922
928
  workflows: e.discovered.workflows ?? [],
923
929
  facade: () => o,
924
- log: u,
930
+ log: l,
925
931
  ...t
926
932
  });
927
933
  },
928
- log: u
934
+ log: l
929
935
  });
930
- let h = f;
931
- h !== void 0 && Vr(() => h.stop()), l = Ke({
936
+ let m = te;
937
+ m !== void 0 && Vr(() => m.stop()), c = qe({
932
938
  store: e.store,
933
939
  onChange: (t) => e.store.onChange((e) => t({
934
940
  table: e.table,
@@ -939,29 +945,29 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
939
945
  tickIntervalMs: e.scheduling.inferenceTickMs
940
946
  },
941
947
  enabled: (e.discovered.workflows?.length ?? 0) > 0,
942
- resumeSignal: () => p === void 0 || M === void 0 ? void 0 : async ({ executionId: t, workflowName: n, signalName: r, payload: i }) => {
943
- await p.runPromise(M.completeSuspendingSignal({
948
+ resumeSignal: () => d === void 0 || M === void 0 ? void 0 : async ({ executionId: t, workflowName: n, signalName: r, payload: i }) => {
949
+ await d.runPromise(M.completeSuspendingSignal({
944
950
  store: e.store,
945
951
  target: At(t, n),
946
952
  signalName: r,
947
953
  payload: i
948
954
  }));
949
955
  },
950
- runEffect: (e) => p.runPromise(e),
956
+ runEffect: (e) => d.runPromise(e),
951
957
  scheduleCoordinated: s,
952
- log: u
958
+ log: l
953
959
  });
954
- let g = l;
955
- g !== void 0 && Vr(() => g.stop()), o = (e.discovered.workflows?.length ?? 0) > 0 ? Rr({
960
+ let h = c;
961
+ h !== void 0 && Vr(() => h.stop()), o = (e.discovered.workflows?.length ?? 0) > 0 ? Rr({
956
962
  workflows: e.discovered.workflows ?? [],
957
- runEffect: (e) => p.runPromise(e),
958
- onEnqueue: () => ne?.publishWake(),
959
- ...h === void 0 ? {} : {
960
- admitStart: h.gate.admitStart,
961
- startPayloadSchema: h.gate.startPayloadSchema,
962
- parkDelayedStart: h.gate.parkDelayed
963
+ runEffect: (e) => d.runPromise(e),
964
+ onEnqueue: () => re?.publishWake(),
965
+ ...m === void 0 ? {} : {
966
+ admitStart: m.gate.admitStart,
967
+ startPayloadSchema: m.gate.startPayloadSchema,
968
+ parkDelayedStart: m.gate.parkDelayed
963
969
  },
964
- rememberStartContext: ce,
970
+ rememberStartContext: ue,
965
971
  signal: async (t, n, r) => {
966
972
  let i = await M.sendWorkflowSignal({
967
973
  store: e.store,
@@ -970,7 +976,7 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
970
976
  signalName: n,
971
977
  payload: r
972
978
  });
973
- return await p.runPromise(M.completeSuspendingSignal({
979
+ return await d.runPromise(M.completeSuspendingSignal({
974
980
  store: e.store,
975
981
  target: t,
976
982
  signalName: n,
@@ -985,20 +991,20 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
985
991
  payload: r,
986
992
  ...i === void 0 ? {} : { options: i }
987
993
  }),
988
- listRuns: (t) => De(e.store, t),
989
- retry: (t, n) => ke({
994
+ listRuns: (t) => ke(e.store, t),
995
+ retry: (t, n) => je({
990
996
  store: e.store,
991
997
  workflows: e.discovered.workflows ?? [],
992
- runPromise: (e) => p.runPromise(e)
998
+ runPromise: (e) => d.runPromise(e)
993
999
  }, t, n),
994
- redrive: (t) => _({
1000
+ redrive: (t) => oe({
995
1001
  store: e.store,
996
1002
  workflows: e.discovered.workflows ?? [],
997
1003
  runRedrive: r
998
1004
  }, t).then((e) => e.outcome)
999
1005
  }) : void 0;
1000
1006
  }
1001
- let Bt = G.mergeAll(Tt.toLayer(k), Dt), Vt = xt(k, e.discovered.queries.map((e) => e.descriptor.name), pe), Ht = G.mergeAll(Tt.toLayer(Vt), Dt), P = e.observability, F = await ur({
1007
+ let Bt = G.mergeAll(Tt.toLayer(k), Dt), Vt = xt(k, e.discovered.queries.map((e) => e.descriptor.name), he), Ht = G.mergeAll(Tt.toLayer(Vt), Dt), P = e.observability, F = await ur({
1002
1008
  ...e.appName === void 0 ? {} : { serviceName: e.appName },
1003
1009
  ...P && P.spanProcessors.length > 0 ? { extraSpanProcessors: P.spanProcessors } : {},
1004
1010
  ...P && P.metricReaders.length > 0 ? { extraMetricReaders: P.metricReaders } : {},
@@ -1012,7 +1018,7 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
1012
1018
  ...e.host === void 0 ? {} : { host: e.host },
1013
1019
  path: e.path ?? "/ws",
1014
1020
  tracerLayer: F.layer,
1015
- security: _e(e),
1021
+ security: ye(e),
1016
1022
  ...Xe,
1017
1023
  healthCheck: {
1018
1024
  isReady: () => Ut,
@@ -1020,12 +1026,12 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
1020
1026
  },
1021
1027
  ...bt.length > 0 ? { httpRoutes: bt } : {},
1022
1028
  ...e.getStore === void 0 ? {} : { getStore: e.getStore },
1023
- ...xe.size > 0 ? { webhookRoutes: xe } : {},
1029
+ ...Ce.size > 0 ? { webhookRoutes: Ce } : {},
1024
1030
  ...e.inspectRoute === void 0 ? {} : { inspectRoute: e.inspectRoute }
1025
1031
  }), qt = Ni(Gt);
1026
1032
  if (await cr(Gt), (e.discovered.schedules?.length ?? 0) > 0) {
1027
1033
  let t = (e.scheduleCoordination ?? "single") === "advisoryLock" ? xr(e.store, e.scheduleReplicaId ?? `pid-${process.pid}`) : Xr;
1028
- oe = await Qr(e.discovered.schedules ?? [], {
1034
+ ce = await Qr(e.discovered.schedules ?? [], {
1029
1035
  store: e.store,
1030
1036
  coordinator: t,
1031
1037
  defaultTrigger: e.scheduleDefaultTrigger ?? "self",
@@ -1033,7 +1039,7 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
1033
1039
  armSelf: e.scheduleArmSelf ?? !0,
1034
1040
  dormancy: e.dormancy ?? "always-on",
1035
1041
  ...e.dormancyTenantId === void 0 ? {} : { dormancyTenantId: e.dormancyTenantId },
1036
- buildContext: ({ traceId: t, scheduleName: n, subject: r }) => ze({
1042
+ buildContext: ({ traceId: t, scheduleName: n, subject: r }) => C({
1037
1043
  subject: r,
1038
1044
  traceId: t
1039
1045
  }, e.store, void 0, `schedule:${n}`),
@@ -1051,18 +1057,18 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
1051
1057
  },
1052
1058
  ...e.scheduleFireInterceptor === void 0 ? {} : { interceptFire: e.scheduleFireInterceptor },
1053
1059
  ...e.onScheduleRunEvent === void 0 ? {} : { onRunEvent: e.onScheduleRunEvent }
1054
- }), e.onSchedulerReady?.(oe);
1060
+ }), e.onSchedulerReady?.(ce);
1055
1061
  }
1056
1062
  let I = e.log ?? L({ scope: "voltro:serve" }), Jt, Yt;
1057
- if ((e.discovered.subscribers?.length ?? 0) > 0 && (Jt = C(e.discovered.subscribers ?? [], e.store, I.child("subscribe"), e.schemaRegistry, w.bus)), (e.discovered.reactions?.length ?? 0) > 0) {
1063
+ if ((e.discovered.subscribers?.length ?? 0) > 0 && (Jt = x(e.discovered.subscribers ?? [], e.store, I.child("subscribe"), e.schemaRegistry, S.bus)), (e.discovered.reactions?.length ?? 0) > 0) {
1058
1064
  let t = I.child("reaction"), n = async (n, r) => {
1059
1065
  if (n.kind === "workflow") {
1060
- if (b === void 0) {
1066
+ if (v === void 0) {
1061
1067
  t.warn("reaction workflow act skipped — no workflow engine in this app", { workflow: n.workflow });
1062
1068
  return;
1063
1069
  }
1064
1070
  let e = n.payload === void 0 ? r.new ?? r.old ?? {} : n.payload(r);
1065
- await X(b, {
1071
+ await X(v, {
1066
1072
  traceId: `reaction:${n.workflow}`,
1067
1073
  source: `reaction:${n.workflow}`
1068
1074
  }).start(n.workflow, e);
@@ -1086,69 +1092,69 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
1086
1092
  return t.warn("reaction budget check failed — refusing the act", { tenantId: n }, e), !1;
1087
1093
  }
1088
1094
  }, i = lt(e.store, { onError: (e) => t.warn("reaction: rate-slot claim failed; refusing the act", { cause: String(e) }) });
1089
- Yt = u(e.discovered.reactions ?? [], e.store, {
1095
+ Yt = l(e.discovered.reactions ?? [], e.store, {
1090
1096
  runAct: n,
1091
1097
  checkBudget: r,
1092
1098
  claimRateSlot: (e) => i.claim(e)
1093
1099
  }, t);
1094
1100
  }
1095
1101
  let Xt;
1096
- (e.discovered.aggregates?.length ?? 0) > 0 && (Xt = await Te({
1102
+ (e.discovered.aggregates?.length ?? 0) > 0 && (Xt = await De({
1097
1103
  discovered: e.discovered.aggregates ?? [],
1098
1104
  store: e.store,
1099
1105
  log: I.child("aggregate"),
1100
1106
  ...e.analytics === void 0 ? {} : { analytics: e.analytics },
1101
1107
  ...e.aggregateStorage === void 0 ? {} : { storage: e.aggregateStorage },
1102
1108
  ...e.aggregateCoordinator === void 0 ? {} : { coordinator: e.aggregateCoordinator }
1103
- }), Be = G.succeed(Qn, Xt.registry));
1109
+ }), Ve = G.succeed(Qn, Xt.registry));
1104
1110
  let Zt;
1105
1111
  (e.discovered.expectations?.length ?? 0) > 0 && (Zt = ar({
1106
1112
  discovered: e.discovered.expectations ?? [],
1107
1113
  store: e.store,
1108
1114
  log: I.child("expectation")
1109
- }), Ve = G.succeed(q, Zt.registry)), (e.discovered.budgets?.length ?? 0) > 0 && (n = sr({
1115
+ }), He = G.succeed(q, Zt.registry)), (e.discovered.budgets?.length ?? 0) > 0 && (n = sr({
1110
1116
  discovered: e.discovered.budgets ?? [],
1111
1117
  log: I.child("finops")
1112
- }), Ue = G.succeed($n, n.registry));
1118
+ }), We = G.succeed($n, n.registry));
1113
1119
  let Qt;
1114
1120
  return (e.discovered.experiments?.length ?? 0) > 0 && (Qt = or({
1115
1121
  discovered: e.discovered.experiments ?? [],
1116
1122
  store: e.store,
1117
1123
  log: I.child("experiment")
1118
- }), Ge = G.succeed(nr, Qt.registry)), Ut = !0, e.bootTiming?.mark("ready"), {
1124
+ }), Ke = G.succeed(nr, Qt.registry)), Ut = !0, e.bootTiming?.mark("ready"), {
1119
1125
  dispatcher: r,
1120
1126
  server: Gt,
1121
- scheduler: oe,
1122
- eventsSnapshot: fe(w.bus, w.declared),
1127
+ scheduler: ce,
1128
+ eventsSnapshot: me(S.bus, S.declared),
1123
1129
  membersSnapshot: () => ({
1124
- members: Le.membership.list(),
1130
+ members: ze.membership.list(),
1125
1131
  capturedAt: Date.now()
1126
1132
  }),
1127
1133
  agentTools: () => mt,
1128
- rpcMetrics: () => Ye,
1129
- webhooksService: () => ye,
1130
- runCanceller: () => c(),
1131
- flowControlHealth: () => f?.cancelHealth(),
1132
- inferenceHealth: () => l?.health(),
1133
- workflowWriteActions: () => b === void 0 || N === void 0 ? void 0 : ae({
1134
+ rpcMetrics: () => T,
1135
+ webhooksService: () => xe,
1136
+ runCanceller: () => ee(),
1137
+ flowControlHealth: () => te?.cancelHealth(),
1138
+ inferenceHealth: () => c?.health(),
1139
+ workflowWriteActions: () => v === void 0 || N === void 0 ? void 0 : se({
1134
1140
  store: e.store,
1135
1141
  log: I,
1136
1142
  workflows: e.discovered.workflows ?? [],
1137
1143
  workflowsProxy: o,
1138
- workflowRuntime: p,
1144
+ workflowRuntime: d,
1139
1145
  workflowRunRecorder: N,
1140
1146
  closeChildrenForParent: Mt
1141
1147
  }),
1142
- redriveWorkflowRun: (e) => ee ? ee(e) : Promise.reject(/* @__PURE__ */ Error("redrive: this app registers no workflows")),
1143
- resumeWorkflowRunFromStep: (e) => te ? te(e) : Promise.reject(/* @__PURE__ */ Error("resume-from-step: this app registers no workflows")),
1148
+ redriveWorkflowRun: (e) => ne ? ne(e) : Promise.reject(/* @__PURE__ */ Error("redrive: this app registers no workflows")),
1149
+ resumeWorkflowRunFromStep: (e) => f ? f(e) : Promise.reject(/* @__PURE__ */ Error("resume-from-step: this app registers no workflows")),
1144
1150
  close: async () => {
1145
1151
  Ut = !1, await qt.drainRequests();
1146
- for (let e of Se) try {
1152
+ for (let e of we) try {
1147
1153
  await e();
1148
1154
  } catch (e) {
1149
1155
  I.warn("serve: teardown step failed", {}, e);
1150
1156
  }
1151
- await Re?.detach(), await Le.detach(), Xt?.detach(), Zt?.detach(), n?.detach(), Qt?.detach(), Yt?.(), Jt?.(), await oe?.shutdown(), r.close(), await ne?.detach(), await p?.dispose(), await Kt(), await qt.finish();
1157
+ await Be?.detach(), await ze.detach(), Xt?.detach(), Zt?.detach(), n?.detach(), Qt?.detach(), Yt?.(), Jt?.(), await ce?.shutdown(), r.close(), await re?.detach(), await d?.dispose(), await Kt(), await qt.finish();
1152
1158
  }
1153
1159
  };
1154
1160
  }, $ = L({ scope: "voltro:serve" }), Xi = (e, t, n) => (e === "production" || e === "staging") && t !== "memory" && n !== "0", Zi = Bt, Qi = async (e) => {
@@ -1165,140 +1171,140 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
1165
1171
  }
1166
1172
  return $i(e);
1167
1173
  }, $i = async (s) => {
1168
- let u = bn();
1174
+ let l = bn();
1169
1175
  e("serve");
1170
1176
  try {
1171
1177
  di();
1172
1178
  } catch (e) {
1173
1179
  throw i(e instanceof Error ? e.message : String(e));
1174
1180
  }
1175
- let d = process.cwd(), m = await Ue(d), re = Vt({
1181
+ let u = process.cwd(), p = await We(u), ie = Vt({
1176
1182
  kind: "api",
1177
- configPort: m?.port,
1183
+ configPort: p?.port,
1178
1184
  env: process.env,
1179
1185
  flagPort: Zi(s, "--port")
1180
1186
  });
1181
- for (let e of re.warnings) $.warn(e);
1182
- let h = re.port;
1183
- Jr(Kr(m?.secrets)), await Ht({
1184
- rawEnv: m?.env,
1187
+ for (let e of ie.warnings) $.warn(e);
1188
+ let m = ie.port;
1189
+ Jr(Kr(p?.secrets)), await Ht({
1190
+ rawEnv: p?.env,
1185
1191
  appType: "api",
1186
- root: d,
1192
+ root: u,
1187
1193
  log: $,
1188
1194
  generateTypes: !1
1189
- }), u.mark("config");
1190
- let g = (process.env.DB_DIALECT ?? m?.store ?? "memory").toLowerCase(), ie = (g === "mariadb" || g === "postgres" || g === "mssql") && (process.env.CDC ?? "1") !== "0", _ = g === "mariadb" ? "mariadb" : g === "mssql" ? "mssql" : void 0, ae = vn(d);
1191
- if (!r() && wn(ae)) try {
1192
- let e = await import(Tn(ae).href);
1195
+ }), l.mark("config");
1196
+ let h = (process.env.DB_DIALECT ?? p?.store ?? "memory").toLowerCase(), ae = (h === "mariadb" || h === "postgres" || h === "mssql") && (process.env.CDC ?? "1") !== "0", oe = h === "mariadb" ? "mariadb" : h === "mssql" ? "mssql" : void 0, se = vn(u);
1197
+ if (!r() && wn(se)) try {
1198
+ let e = await import(Tn(se).href);
1193
1199
  if (e.modules) {
1194
1200
  let t = {};
1195
- for (let [n, r] of Object.entries(e.modules)) t[Cn(d, n)] = r;
1201
+ for (let [n, r] of Object.entries(e.modules)) t[Cn(u, n)] = r;
1196
1202
  n(t), $.info("precompiled api bundle loaded", { modules: Object.keys(t).length });
1197
1203
  }
1198
1204
  } catch (e) {
1199
1205
  $.warn("precompiled api bundle failed to load — falling back to source", {}, e);
1200
1206
  }
1201
- let v = await Ye(d), y = await Ot(v, { cdc: ie && _ !== void 0 }), de = x(y);
1207
+ let g = await T(u), _ = await Ot(g, { cdc: ae && oe !== void 0 }), pe = y(_);
1202
1208
  {
1203
1209
  let e = /* @__PURE__ */ new Set([
1204
- ...y.queries.filter((e) => e.descriptor.overridesPlugin === !0).map((e) => e.descriptor.name),
1205
- ...y.mutations.filter((e) => e.descriptor.overridesPlugin === !0).map((e) => e.descriptor.name),
1206
- ...y.actions.filter((e) => e.descriptor.overridesPlugin === !0).map((e) => e.descriptor.name)
1210
+ ..._.queries.filter((e) => e.descriptor.overridesPlugin === !0).map((e) => e.descriptor.name),
1211
+ ..._.mutations.filter((e) => e.descriptor.overridesPlugin === !0).map((e) => e.descriptor.name),
1212
+ ..._.actions.filter((e) => e.descriptor.overridesPlugin === !0).map((e) => e.descriptor.name)
1207
1213
  ]);
1208
- Jt(I(m?.plugins ?? []), [
1209
- ...y.queries.map((e) => e.descriptor.name),
1210
- ...y.mutations.map((e) => e.descriptor.name),
1211
- ...y.actions.map((e) => e.descriptor.name),
1212
- ...y.streams.map((e) => e.descriptor.name)
1214
+ Jt(I(p?.plugins ?? []), [
1215
+ ..._.queries.map((e) => e.descriptor.name),
1216
+ ..._.mutations.map((e) => e.descriptor.name),
1217
+ ..._.actions.map((e) => e.descriptor.name),
1218
+ ..._.streams.map((e) => e.descriptor.name)
1213
1219
  ], e);
1214
- let t = Ae(y.serverOnlyLeaks, S(process.env, "strict"), mr, "`voltro serve`");
1220
+ let t = Me(_.serverOnlyLeaks, b(process.env, "strict"), mr, "`voltro serve`");
1215
1221
  if (t.action === "fail") throw i(t.message ?? "");
1216
1222
  t.action === "warn" && $.warn(t.message ?? "");
1217
1223
  }
1218
- let fe = v.filter((e) => gn.test(e)), ve = fe.length > 0 ? await hn(fe, $.child("webhooks")) : {
1224
+ let me = g.filter((e) => gn.test(e)), be = me.length > 0 ? await hn(me, $.child("webhooks")) : {
1219
1225
  outgoing: [],
1220
1226
  incoming: [],
1221
1227
  providers: []
1222
- }, Te = pn(y.events), Ee = ve.outgoing.length + ve.incoming.length + ve.providers.length + Te.length === 0 ? void 0 : {
1223
- ...ve,
1224
- outgoing: [...ve.outgoing, ...Te]
1225
- }, De = tn({
1228
+ }, De = pn(_.events), Oe = be.outgoing.length + be.incoming.length + be.providers.length + De.length === 0 ? void 0 : {
1229
+ ...be,
1230
+ outgoing: [...be.outgoing, ...De]
1231
+ }, ke = tn({
1226
1232
  nodeEnv: process.env.NODE_ENV,
1227
- cdcDialect: _,
1228
- declared: m?.schema
1229
- }), ke = Xt({
1230
- gates: De,
1233
+ cdcDialect: oe,
1234
+ declared: p?.schema
1235
+ }), je = Xt({
1236
+ gates: ke,
1231
1237
  runtime: {
1232
- traces: ge(),
1238
+ traces: ve(),
1233
1239
  undo: ei()
1234
1240
  }
1235
1241
  });
1236
- if (ke !== void 0) throw i(`serve: ${ke}`);
1237
- let je = en({
1238
- mix: y.featureMix,
1239
- plugins: m?.plugins ?? [],
1240
- gates: De,
1241
- ..._ ? { cdcDialect: _ } : {}
1242
- }), Me = m?.analytics !== void 0 && m.analytics.kind !== "noop" && g !== "memory" ? (await F(g)).makeSqlLayer(A()) : void 0, Fe = await c({
1243
- spec: m?.analytics,
1244
- sqlLayer: Me,
1242
+ if (je !== void 0) throw i(`serve: ${je}`);
1243
+ let Ne = en({
1244
+ mix: _.featureMix,
1245
+ plugins: p?.plugins ?? [],
1246
+ gates: ke,
1247
+ ...oe ? { cdcDialect: oe } : {}
1248
+ }), Pe = p?.analytics !== void 0 && p.analytics.kind !== "noop" && h !== "memory" ? (await F(h)).makeSqlLayer(A()) : void 0, Le = await ee({
1249
+ spec: p?.analytics,
1250
+ sqlLayer: Pe,
1245
1251
  log: $
1246
- }), C = (() => {
1247
- let e = new Set(y.tables.map((e) => e.tableName)), t = [...y.tables];
1248
- for (let n of [...je, ...Fe.tables]) e.has(n.tableName) || (e.add(n.tableName), t.push(n));
1252
+ }), x = (() => {
1253
+ let e = new Set(_.tables.map((e) => e.tableName)), t = [..._.tables];
1254
+ for (let n of [...Ne, ...Le.tables]) e.has(n.tableName) || (e.add(n.tableName), t.push(n));
1249
1255
  return t;
1250
1256
  })();
1251
- for (let e of C) Xn(e);
1257
+ for (let e of x) Xn(e);
1252
1258
  {
1253
- let e = hr(ti(y.queries.map((e) => ({
1259
+ let e = hr(ti(_.queries.map((e) => ({
1254
1260
  name: e.descriptor.name,
1255
1261
  source: e.descriptor.source
1256
- })), new Set(C.flatMap((e) => {
1262
+ })), new Set(x.flatMap((e) => {
1257
1263
  let t = e.tableName;
1258
1264
  return t === void 0 ? [] : [t];
1259
1265
  }))));
1260
1266
  e !== void 0 && $.warn(e);
1261
1267
  }
1262
- let Ie = (process.env.NODE_ENV ?? "").toLowerCase();
1263
- if (Xi(Ie, g, process.env.VOLTRO_AUTO_MIGRATE)) {
1264
- let e = (await F(g)).makeSqlLayer(A()), t = await W.runPromise(Vn.SqlClient.pipe(W.flatMap((e) => Wn(e, d)), W.provide(e), W.catchAll(() => W.succeed([]))));
1268
+ let Re = (process.env.NODE_ENV ?? "").toLowerCase();
1269
+ if (Xi(Re, h, process.env.VOLTRO_AUTO_MIGRATE)) {
1270
+ let e = (await F(h)).makeSqlLayer(A()), t = await W.runPromise(Vn.SqlClient.pipe(W.flatMap((e) => Wn(e, u)), W.provide(e), W.catchAll(() => W.succeed([]))));
1265
1271
  t.length > 0 && ($.error(`serve: refusing to boot — ${t.length} pending file-based migration(s) have never run against this database. They perform the changes a schema diff cannot infer (data moves, backfills, table splits), so the declarative fingerprint check below cannot see them and would have let this process serve un-migrated data.`, { pending: t }), $.error("Run them from your pre-deploy job — `voltro db migrate .` (schema + files) or `voltro db files .` (files alone) — or set VOLTRO_AUTO_MIGRATE=0 to bypass every boot schema check. `voltro serve` never applies them itself: a rolling deploy would start N replicas and each would try."), process.exit(1));
1266
- let n = await W.runPromise(Vn.SqlClient.pipe(W.flatMap((e) => Gn(e, C, {
1267
- appliedBy: `serve:${Ie}`,
1272
+ let n = await W.runPromise(Vn.SqlClient.pipe(W.flatMap((e) => Gn(e, x, {
1273
+ appliedBy: `serve:${Re}`,
1268
1274
  environment: "prod",
1269
- dialectId: g
1275
+ dialectId: h
1270
1276
  })), W.provide(e)));
1271
- n.kind === "prod-mismatch" && ($.error(Un(n, g)), $.error(Qt({
1272
- gates: De,
1277
+ n.kind === "prod-mismatch" && ($.error(Un(n, h)), $.error(Qt({
1278
+ gates: ke,
1273
1279
  nodeEnv: process.env.NODE_ENV,
1274
- cdcDialect: _,
1275
- declared: m?.schema
1276
- })), $.error("serve: refusing to boot — apply the schema first (voltro db apply in a pre-deploy step), or set VOLTRO_AUTO_MIGRATE=0 to bypass this check."), process.exit(1)), $.info(Un(n, g));
1280
+ cdcDialect: oe,
1281
+ declared: p?.schema
1282
+ })), $.error("serve: refusing to boot — apply the schema first (voltro db apply in a pre-deploy step), or set VOLTRO_AUTO_MIGRATE=0 to bypass this check."), process.exit(1)), $.info(Un(n, h));
1277
1283
  }
1278
1284
  await qt({
1279
- dialectId: g,
1280
- tables: C,
1281
- mode: Gt(m?.reactiveTriggers),
1285
+ dialectId: h,
1286
+ tables: x,
1287
+ mode: Gt(p?.reactiveTriggers),
1282
1288
  lockSchema: A().schema,
1283
- makeLayer: async () => (await F(g)).makeSqlLayer(A()),
1289
+ makeLayer: async () => (await F(h)).makeSqlLayer(A()),
1284
1290
  log: {
1285
1291
  info: (e, t) => $.info(e, t ?? {}),
1286
1292
  warn: (e, t) => $.warn(e, t ?? {})
1287
1293
  }
1288
1294
  });
1289
- let He = Lr(C);
1290
- u.mark("discover");
1291
- let T = await nt(m, void 0), We = ii(T, g);
1295
+ let Ue = Lr(x);
1296
+ l.mark("discover");
1297
+ let w = await nt(p, void 0), Ge = ii(w, h);
1292
1298
  for (let e of dt({
1293
- dialect: String(m?.store ?? process.env.DB_DIALECT ?? "postgres"),
1299
+ dialect: String(p?.store ?? process.env.DB_DIALECT ?? "postgres"),
1294
1300
  changeStrategy: (process.env.CDC ?? "1") === "0" ? "inline" : "cdc",
1295
1301
  dbUrl: process.env.DB_URL,
1296
- crossReplicaBus: Ci(m?.plugins ?? [])?.broadcast.crossReplica === !0,
1297
- tables: y.tables.map((e) => ({
1302
+ crossReplicaBus: Ci(p?.plugins ?? [])?.broadcast.crossReplica === !0,
1303
+ tables: _.tables.map((e) => ({
1298
1304
  tableName: e.tableName,
1299
1305
  isReactive: e.isReactive === !0
1300
1306
  })),
1301
- querySources: y.queries.flatMap((e) => {
1307
+ querySources: _.queries.flatMap((e) => {
1302
1308
  let t = e.descriptor.source;
1303
1309
  return t === void 0 ? [] : typeof t == "string" ? [t] : [...t];
1304
1310
  })
@@ -1306,19 +1312,19 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
1306
1312
  {
1307
1313
  let e = E({
1308
1314
  tables: qn().map((e) => ({ tableName: e.tableName })),
1309
- queries: y.queries.map((e) => ({
1315
+ queries: _.queries.map((e) => ({
1310
1316
  name: e.descriptor.name,
1311
1317
  source: e.descriptor.source
1312
1318
  }))
1313
1319
  }), t = gt(e);
1314
1320
  t !== void 0 && $.warn(t);
1315
1321
  }
1316
- m?.cache && !process.env.CACHE_BACKEND && (process.env.CACHE_BACKEND = m.cache), m?.cacheRedisUrl && !process.env.CACHE_REDIS_URL && (process.env.CACHE_REDIS_URL = m.cacheRedisUrl), m?.cacheRedisDriver && !process.env.CACHE_REDIS_DRIVER && (process.env.CACHE_REDIS_DRIVER = m.cacheRedisDriver), m?.cacheKeyPrefix && !process.env.CACHE_KEY_PREFIX && (process.env.CACHE_KEY_PREFIX = m.cacheKeyPrefix);
1317
- let { service: Ke, invalidationBus: tt, snapshotCache: at, cache: ot, semantic: lt, evictSource: pt, backend: vt, stats: yt, dispose: xt } = await Ge({
1322
+ p?.cache && !process.env.CACHE_BACKEND && (process.env.CACHE_BACKEND = p.cache), p?.cacheRedisUrl && !process.env.CACHE_REDIS_URL && (process.env.CACHE_REDIS_URL = p.cacheRedisUrl), p?.cacheRedisDriver && !process.env.CACHE_REDIS_DRIVER && (process.env.CACHE_REDIS_DRIVER = p.cacheRedisDriver), p?.cacheKeyPrefix && !process.env.CACHE_KEY_PREFIX && (process.env.CACHE_KEY_PREFIX = p.cacheKeyPrefix);
1323
+ let { service: qe, invalidationBus: tt, snapshotCache: at, cache: ot, semantic: lt, evictSource: pt, backend: vt, stats: yt, dispose: xt } = await Ke({
1318
1324
  env: process.env,
1319
- semantic: m?.cacheSemantic ?? !1
1325
+ semantic: p?.cacheSemantic ?? !1
1320
1326
  });
1321
- lt !== void 0 && $.info("semantic cache enabled — reactive eviction on live writes"), $.info(`cache backend resolved: ${vt}` + (vt === "redis" ? ` (driver ${process.env.CACHE_REDIS_DRIVER ?? "resp"})` : " — in-process, not cross-instance")), T.onChange((e) => {
1327
+ lt !== void 0 && $.info("semantic cache enabled — reactive eviction on live writes"), $.info(`cache backend resolved: ${vt}` + (vt === "redis" ? ` (driver ${process.env.CACHE_REDIS_DRIVER ?? "resp"})` : " — in-process, not cross-instance")), w.onChange((e) => {
1322
1328
  if (W.runFork(tt.publish(e.table)), pt !== void 0) {
1323
1329
  let t = (e.new ?? e.old)?.id;
1324
1330
  pt({
@@ -1327,41 +1333,41 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
1327
1333
  ...t === void 0 ? {} : { id: t }
1328
1334
  });
1329
1335
  }
1330
- }), m?.kv && !process.env.KV_BACKEND && (process.env.KV_BACKEND = m.kv), m?.kvRedisUrl && !process.env.KV_REDIS_URL && (process.env.KV_REDIS_URL = m.kvRedisUrl), m?.kvKeyPrefix && !process.env.KV_KEY_PREFIX && (process.env.KV_KEY_PREFIX = m.kvKeyPrefix);
1331
- let { kv: Ct, service: wt } = await Tr({ store: T });
1332
- Ve({
1336
+ }), p?.kv && !process.env.KV_BACKEND && (process.env.KV_BACKEND = p.kv), p?.kvRedisUrl && !process.env.KV_REDIS_URL && (process.env.KV_REDIS_URL = p.kvRedisUrl), p?.kvKeyPrefix && !process.env.KV_KEY_PREFIX && (process.env.KV_KEY_PREFIX = p.kvKeyPrefix);
1337
+ let { kv: Ct, service: wt } = await Tr({ store: w });
1338
+ He({
1333
1339
  log: $,
1334
1340
  max: Wt(),
1335
- outOfPool: Lt(g, (process.env.CDC ?? "1") !== "0"),
1341
+ outOfPool: Lt(h, (process.env.CDC ?? "1") !== "0"),
1336
1342
  readPools: t.replicationSnapshot()?.replicaCount ?? 0,
1337
1343
  always: !0
1338
- }), u.mark("store");
1344
+ }), l.mark("store");
1339
1345
  let Et = ir({
1340
- store: T,
1341
- sink: Fe.sink,
1346
+ store: w,
1347
+ sink: Le.sink,
1342
1348
  log: $
1343
1349
  }), At = kt({
1344
- store: T,
1345
- dialect: g,
1350
+ store: w,
1351
+ dialect: h,
1346
1352
  log: { info: (e) => $.info(e) }
1347
- }), j = m?.plugins ?? [], Ft = process.env.POD_NAME ?? process.env.HOSTNAME ?? `serve-${process.pid}`, Rt, zt;
1348
- g !== "memory" && (Rt = Bn.make((await F(g)).makeSqlLayer(A())), zt = await Rt.runPromise(Vn.SqlClient));
1353
+ }), j = p?.plugins ?? [], Ft = process.env.POD_NAME ?? process.env.HOSTNAME ?? `serve-${process.pid}`, Rt, zt;
1354
+ h !== "memory" && (Rt = Bn.make((await F(h)).makeSqlLayer(A())), zt = await Rt.runPromise(Vn.SqlClient));
1349
1355
  let Bt = [
1350
1356
  "postgres",
1351
1357
  "mariadb",
1352
1358
  "mysql",
1353
1359
  "mssql"
1354
- ].includes(g) ? xr(T, Ft, $) : Xr, mn = w(m?.scheduling), yn = Dr({
1360
+ ].includes(h) ? xr(w, Ft, $) : Xr, mn = S(p?.scheduling), yn = Dr({
1355
1361
  maxIdleIntervalMs: mn.pollCeilingMs,
1356
1362
  coordinator: Bt,
1357
1363
  replicaId: Ft,
1358
1364
  log: $
1359
- }), xn = [], L = process.env.POD_NAME ?? process.env.HOSTNAME ?? `serve-${process.pid}`, En = Ci(m?.plugins ?? [])?.broadcast?.provider, Dn = Ze(m?.plugins, m?.name ?? Sn(d));
1365
+ }), xn = [], L = process.env.POD_NAME ?? process.env.HOSTNAME ?? `serve-${process.pid}`, En = Ci(p?.plugins ?? [])?.broadcast?.provider, Dn = Ze(p?.plugins, p?.name ?? Sn(u));
1360
1366
  {
1361
- let e = et(m?.plugins, m?.name ?? Sn(d));
1367
+ let e = et(p?.plugins, p?.name ?? Sn(u));
1362
1368
  e !== void 0 && $.warn(e);
1363
1369
  }
1364
- let R = jt(m?.plugins, {
1370
+ let R = jt(p?.plugins, {
1365
1371
  instanceId: L,
1366
1372
  namespace: Dn,
1367
1373
  meta: { mode: "serve" },
@@ -1377,49 +1383,49 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
1377
1383
  return xn.push(r), r;
1378
1384
  }
1379
1385
  };
1380
- for (let e of j) e.bindDataStore?.(We, On);
1381
- l({
1382
- store: T,
1386
+ for (let e of j) e.bindDataStore?.(Ge, On);
1387
+ c({
1388
+ store: w,
1383
1389
  ...st(),
1384
1390
  log: $
1385
1391
  });
1386
1392
  let kn = j.filter((e) => typeof e.onChangeEvent == "function");
1387
1393
  if (kn.length > 0) {
1388
- let e = T.changeScope ?? "local";
1389
- T.onChange((t) => {
1390
- let n = pe(t, e);
1394
+ let e = w.changeScope ?? "local";
1395
+ w.onChange((t) => {
1396
+ let n = he(t, e);
1391
1397
  for (let e of kn) W.runFork(e.onChangeEvent(n).pipe(W.catchAllCause((t) => W.sync(() => $.warn(`plugin ${e.name} onChangeEvent failed`, { error: zn.pretty(t) })))));
1392
1398
  });
1393
1399
  }
1394
- let z = se({
1400
+ let z = le({
1395
1401
  plugins: j,
1396
- appName: m?.name ?? "voltro-api",
1402
+ appName: p?.name ?? "voltro-api",
1397
1403
  appType: "api",
1398
1404
  voltroVersion: process.env.npm_package_version ?? "0.0.0",
1399
1405
  log: $
1400
1406
  });
1401
- j.length && await z.activate(), u.mark("plugins");
1407
+ j.length && await z.activate(), l.mark("plugins");
1402
1408
  let B = await z.gatherObservability(), An = {
1403
1409
  info: (e, t) => process.stdout.write(`[broadcast] ${e} ${t ? JSON.stringify(t) : ""}\n`),
1404
1410
  warn: (e, t) => process.stderr.write(`[broadcast] ${e} ${t ? JSON.stringify(t) : ""}\n`),
1405
1411
  debug: () => {}
1406
- }, jn, Mn = await ht(T, m, g, Dn, An, (e, t) => {
1412
+ }, jn, Mn = await ht(w, p, h, Dn, An, (e, t) => {
1407
1413
  jn?.refreshAll(`broadcast gap: missed ${t} change(s) from ${e}`);
1408
- }), V = m?.apiKeys, Nn = (typeof V == "object" ? V.prefix : void 0) ?? "voltro_", Pn = V ? pr(T) : void 0, H = Pn ? Cr({ flush: wr(Pn) }) : void 0;
1414
+ }), V = p?.apiKeys, Nn = (typeof V == "object" ? V.prefix : void 0) ?? "voltro_", Pn = V ? pr(w) : void 0, H = Pn ? Cr({ flush: wr(Pn) }) : void 0;
1409
1415
  H && Vr(() => H.shutdown());
1410
1416
  let U = Pn ? Sr(Pn, {
1411
1417
  prefix: Nn,
1412
1418
  ...H ? { usage: H } : {}
1413
- }) : void 0, Fn = U ? [gr(U, { prefix: Nn })] : [], In = bt([...m?.auth?.strategies ?? [], ...Fn], bi(m?.plugins ?? []), m?.auth?.anonymousTenantRequired ?? !1, m?.auth, () => We), Ln = [...m?.restRoutes ?? [], ...U ? rr(U, (typeof V == "object" ? V.managementPath : void 0) ?? "/v1/api-keys") : []], Rn = k(m?.idempotency, T), Kn = j.map((e) => e.services).filter((e) => e !== void 0), Jn = G.mergeAll(Re({
1414
- analyticsLayer: Fe.layer,
1415
- cacheService: Ke,
1419
+ }) : void 0, Fn = U ? [gr(U, { prefix: Nn })] : [], In = bt([...p?.auth?.strategies ?? [], ...Fn], bi(p?.plugins ?? []), p?.auth?.anonymousTenantRequired ?? !1, p?.auth, () => Ge), Ln = [...p?.restRoutes ?? [], ...U ? rr(U, (typeof V == "object" ? V.managementPath : void 0) ?? "/v1/api-keys") : []], Rn = k(p?.idempotency, w), Kn = j.map((e) => e.services).filter((e) => e !== void 0), Jn = G.mergeAll(Be({
1420
+ analyticsLayer: Le.layer,
1421
+ cacheService: qe,
1416
1422
  kvService: wt,
1417
1423
  ...lt === void 0 ? {} : { semanticCache: lt },
1418
1424
  pluginServices: Kn,
1419
- userLayers: m?.layers ?? []
1420
- }), rt(m?.http ?? {})), K = await it({
1421
- files: v,
1422
- store: T,
1425
+ userLayers: p?.layers ?? []
1426
+ }), rt(p?.http ?? {})), K = await it({
1427
+ files: g,
1428
+ store: w,
1423
1429
  log: $,
1424
1430
  seedPolicy: "report",
1425
1431
  seedPattern: ln,
@@ -1427,7 +1433,7 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
1427
1433
  startupPattern: rn,
1428
1434
  loadStartupFiles: a,
1429
1435
  runStartups: o,
1430
- emailPattern: ze,
1436
+ emailPattern: C,
1431
1437
  loadEmailFiles: mt,
1432
1438
  registerEmailTemplates: xi
1433
1439
  });
@@ -1436,29 +1442,29 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
1436
1442
  emailTemplates: K.emailCount
1437
1443
  }), K.startups !== void 0 && Vr(async () => {
1438
1444
  await K.startups.stop();
1439
- }), oe({
1440
- demands: ue(de),
1445
+ }), ce({
1446
+ demands: fe(pe),
1441
1447
  isRegistered: (e) => _r(e) !== void 0
1442
1448
  });
1443
1449
  let Zn = ft({
1444
1450
  schedules: St({
1445
- schedules: y.schedules,
1451
+ schedules: _.schedules,
1446
1452
  seeds: K.seeds,
1447
- store: T,
1453
+ store: w,
1448
1454
  log: $.child("seeds")
1449
1455
  }),
1450
- workflows: y.workflows ?? [],
1456
+ workflows: _.workflows ?? [],
1451
1457
  log: $.child("workflow-schedules")
1452
- }), Qn = m?.scheduling ?? {}, $n = Qn.trigger ?? "self", er = /* @__PURE__ */ new Set([
1458
+ }), Qn = p?.scheduling ?? {}, $n = Qn.trigger ?? "self", er = /* @__PURE__ */ new Set([
1453
1459
  "postgres",
1454
1460
  "mysql",
1455
1461
  "mariadb",
1456
1462
  "mssql"
1457
- ]), tr = Qn.coordination ?? (er.has(g) ? "advisoryLock" : "single"), q = tr === "cluster" && er.has(g), nr = q ? "cluster" : tr === "advisoryLock" && er.has(g) ? "advisoryLock" : "single";
1458
- tr === "cluster" && !q && $.warn("scheduling.coordination=cluster needs a sql-backed store except sqlite — falling back to single"), tr === "advisoryLock" && !er.has(g) && $.warn("scheduling.coordination=advisoryLock needs a SQL store (the claim-row gate) — falling back to single");
1459
- let ar, or = y.workflows.length > 0 || y.workflowWorkers.length > 0 || y.eventTriggers.length > 0 || (Ee?.outgoing.length ?? 0) > 0 || q, sr;
1463
+ ]), tr = Qn.coordination ?? (er.has(h) ? "advisoryLock" : "single"), q = tr === "cluster" && er.has(h), nr = q ? "cluster" : tr === "advisoryLock" && er.has(h) ? "advisoryLock" : "single";
1464
+ tr === "cluster" && !q && $.warn("scheduling.coordination=cluster needs a sql-backed store except sqlite — falling back to single"), tr === "advisoryLock" && !er.has(h) && $.warn("scheduling.coordination=advisoryLock needs a SQL store (the claim-row gate) — falling back to single");
1465
+ let ar, or = _.workflows.length > 0 || _.workflowWorkers.length > 0 || _.eventTriggers.length > 0 || (Oe?.outgoing.length ?? 0) > 0 || q, sr;
1460
1466
  if (or) {
1461
- if (g === "mssql") {
1467
+ if (h === "mssql") {
1462
1468
  let e = await fn(process.cwd());
1463
1469
  e && $.warn(e);
1464
1470
  }
@@ -1469,8 +1475,8 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
1469
1475
  await ar?.fireFromCluster(e.name);
1470
1476
  }
1471
1477
  })) : [];
1472
- sr = g === "memory" ? e.layerMemory : await (async () => {
1473
- let e = await F(g), t = r({ sqliteFamily: e.id === "sqlite" || e.id === "turso" });
1478
+ sr = h === "memory" ? e.layerMemory : await (async () => {
1479
+ let e = await F(h), t = r({ sqliteFamily: e.id === "sqlite" || e.id === "turso" });
1474
1480
  return $.info(`workflow engine: cluster-${t}, dialect=${e.id}` + (t === "memory" ? " — single-process durable replay, no cross-pod shard handoff" + (e.id !== "sqlite" && e.id !== "turso" ? " (VOLTRO_WORKFLOW_RUNNER_STORAGE=memory: SqlRunnerStorage/cluster_runners + GET_LOCK skipped)" : "") : "")), n({
1475
1481
  sqlClientLayer: e.makeSqlLayer(A()),
1476
1482
  runnerStorage: t,
@@ -1481,58 +1487,58 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
1481
1487
  });
1482
1488
  })();
1483
1489
  }
1484
- let cr = ce(j, _n()), J = v.filter((e) => /\.subscribe\.tsx?$/.test(e)), lr = J.length > 0 ? await ye(J, $) : [], Y = v.filter((e) => /\.reaction\.tsx?$/.test(e)), ur = Y.length > 0 ? await b(Y, $) : [], dr = v.filter((e) => sn.test(e)), vr = dr.length > 0 ? await Pe(dr, $) : [], yr = v.filter((e) => /\.aggregate\.tsx?$/.test(e)), br = yr.length > 0 ? await te(yr, $) : [], Er = he();
1485
- if (br.length > 0 && g !== "memory") try {
1486
- let e = (await F(g)).makeSqlLayer(A());
1490
+ let cr = ue(j, _n()), J = g.filter((e) => /\.subscribe\.tsx?$/.test(e)), lr = J.length > 0 ? await xe(J, $) : [], Y = g.filter((e) => /\.reaction\.tsx?$/.test(e)), ur = Y.length > 0 ? await v(Y, $) : [], dr = g.filter((e) => sn.test(e)), vr = dr.length > 0 ? await Ie(dr, $) : [], yr = g.filter((e) => /\.aggregate\.tsx?$/.test(e)), br = yr.length > 0 ? await f(yr, $) : [], Er = _e();
1491
+ if (br.length > 0 && h !== "memory") try {
1492
+ let e = (await F(h)).makeSqlLayer(A());
1487
1493
  Er = ct(e);
1488
1494
  } catch (e) {
1489
1495
  $.warn("aggregate: SQL storage init failed — falling back to in-process", { err: String(e) });
1490
1496
  }
1491
- let Or = g === "memory" ? Xr : xr(T, `aggregate@${process.pid}`, $), kr = v.filter((e) => cn.test(e)), Ar = kr.length > 0 ? await p(kr, $) : [], jr = v.filter((e) => on.test(e)), Mr = jr.length > 0 ? await Ce(jr, $) : [], Nr = v.filter((e) => an.test(e)), Pr = Nr.length > 0 ? await Mt(Nr, $) : [], Fr = [], Ir = [], Rr = v.filter((e) => $t.test(e));
1497
+ let Or = h === "memory" ? Xr : xr(w, `aggregate@${process.pid}`, $), kr = g.filter((e) => cn.test(e)), Ar = kr.length > 0 ? await d(kr, $) : [], jr = g.filter((e) => on.test(e)), Mr = jr.length > 0 ? await Te(jr, $) : [], Nr = g.filter((e) => an.test(e)), Pr = Nr.length > 0 ? await Mt(Nr, $) : [], Fr = [], Ir = [], Rr = g.filter((e) => $t.test(e));
1492
1498
  if (Rr.length > 0) {
1493
- let e = $.child("agent"), t = v.filter((e) => Zt.test(e));
1499
+ let e = $.child("agent"), t = g.filter((e) => Zt.test(e));
1494
1500
  t.length > 0 && await nn(t, e);
1495
1501
  let n = await Yt(Rr, e);
1496
- for (let e of n.agents) for (let t of Je(e)) (t.kind === "action" ? Fr : Ir).push({
1502
+ for (let e of n.agents) for (let t of Ye(e)) (t.kind === "action" ? Fr : Ir).push({
1497
1503
  file: t.file,
1498
1504
  descriptor: t.descriptor,
1499
1505
  executor: t.executor
1500
1506
  });
1501
1507
  n.agents.length > 0 && e.info("synthesized agent routes", { agents: n.agents.map((e) => e.descriptor.name) });
1502
1508
  }
1503
- u.mark("workflow");
1509
+ l.mark("workflow");
1504
1510
  let X = () => {
1505
1511
  let e = Z.workflowWriteActions();
1506
1512
  if (e === void 0) throw Error("workflow actions: this app registers no workflows");
1507
1513
  return e;
1508
1514
  }, zr = Yn({
1509
- dialect: g,
1515
+ dialect: h,
1510
1516
  ...A()
1511
- }), Br = g === "memory" ? void 0 : (await F(g)).makeSqlLayer(A()), Hr = async () => Dt({
1517
+ }), Br = h === "memory" ? void 0 : (await F(h)).makeSqlLayer(A()), Hr = async () => Dt({
1512
1518
  sqlLayer: Br,
1513
- declared: C,
1519
+ declared: x,
1514
1520
  log: $
1515
1521
  }), Ur = {
1516
1522
  kind: "api",
1517
1523
  meta: {
1518
- name: m?.name ?? "voltro-api",
1524
+ name: p?.name ?? "voltro-api",
1519
1525
  voltroVersion: Tt,
1520
- port: h,
1526
+ port: m,
1521
1527
  mode: "start",
1522
- store: g,
1523
- cdc: ie ? "on" : "off",
1528
+ store: h,
1529
+ cdc: ae ? "on" : "off",
1524
1530
  ...zr === void 0 ? {} : { databaseId: zr }
1525
1531
  },
1526
- rpc: Qe(y, d),
1527
- workflows: Le(y, d),
1532
+ rpc: Qe(_, u),
1533
+ workflows: ze(_, u),
1528
1534
  migrations: Hr,
1529
1535
  events: () => Z.eventsSnapshot(),
1530
1536
  agentTools: () => Z.agentTools(),
1531
1537
  invariantChecks: () => ({
1532
1538
  mode: "serve",
1533
- accessGate: de,
1534
- config: m,
1535
- serverOnlyLeaks: y.serverOnlyLeaks,
1539
+ accessGate: pe,
1540
+ config: p,
1541
+ serverOnlyLeaks: _.serverOnlyLeaks,
1536
1542
  migrations: Hr
1537
1543
  }),
1538
1544
  members: () => Z.membersSnapshot(),
@@ -1540,52 +1546,52 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
1540
1546
  if (!ar) throw Error("scheduler not started — this app registers no self-triggered schedules (all schedules are trigger:'external', or there are none).");
1541
1547
  return { runId: await ar.fireNow(e, t) ?? null };
1542
1548
  },
1543
- inspectBackfillSchedule: ne({
1549
+ inspectBackfillSchedule: re({
1544
1550
  getHandle: () => ar,
1545
1551
  getSchedules: () => Zn
1546
1552
  }),
1547
- ...Ee === void 0 ? {} : { webhooks: () => me({
1548
- store: T,
1549
- discoveredWebhooks: Ee
1553
+ ...Oe === void 0 ? {} : { webhooks: () => ge({
1554
+ store: w,
1555
+ discoveredWebhooks: Oe
1550
1556
  }) },
1551
1557
  plugins: () => ({
1552
1558
  plugins: z.snapshot(),
1553
1559
  capturedAt: Date.now()
1554
1560
  }),
1555
- env: () => P(m?.name ?? Sn(d), {
1556
- ...m?.env !== void 0 && ui(m.env) ? { contract: m.env } : {},
1557
- plugins: m?.plugins ?? []
1561
+ env: () => P(p?.name ?? Sn(u), {
1562
+ ...p?.env !== void 0 && ui(p.env) ? { contract: p.env } : {},
1563
+ plugins: p?.plugins ?? []
1558
1564
  }),
1559
- dataCache: () => Be({
1565
+ dataCache: () => Ve({
1560
1566
  stats: yt,
1561
1567
  backendKind: vt
1562
1568
  }),
1563
1569
  subscriptions: () => Nt(() => jn),
1564
- inspectTables: () => le(y.tables),
1565
- inspectRows: be({
1566
- store: T,
1567
- tables: y.tables,
1570
+ inspectTables: () => de(_.tables),
1571
+ inspectRows: Se({
1572
+ store: w,
1573
+ tables: _.tables,
1568
1574
  mask: !0
1569
1575
  }),
1570
1576
  metrics: (e) => Z.rpcMetrics().snapshot(e),
1571
1577
  cluster: () => It({
1572
- store: T,
1573
- dialect: g,
1578
+ store: w,
1579
+ dialect: h,
1574
1580
  useClusterCron: q,
1575
1581
  scheduleCoordChoice: tr
1576
1582
  }),
1577
- inspectSchedules: () => we({
1583
+ inspectSchedules: () => Ee({
1578
1584
  schedules: Zn,
1579
1585
  defaultTrigger: $n,
1580
1586
  coordination: nr
1581
1587
  }),
1582
- inspectScheduleRuns: (e) => N(T, e),
1583
- ...f(T, {
1584
- controls: O(y.workflows ?? []),
1585
- active: (y.workflows?.length ?? 0) > 0,
1588
+ inspectScheduleRuns: (e) => N(w, e),
1589
+ ...te(w, {
1590
+ controls: O(_.workflows ?? []),
1591
+ active: (_.workflows?.length ?? 0) > 0,
1586
1592
  cancellation: () => Z.flowControlHealth()
1587
1593
  }),
1588
- webhookActions: xe(() => Z.webhooksService()),
1594
+ webhookActions: Ce(() => Z.webhooksService()),
1589
1595
  inspectStartWorkflow: (e) => X().inspectStartWorkflow(e),
1590
1596
  inspectCancelWorkflowRun: (e) => X().inspectCancelWorkflowRun(e),
1591
1597
  inspectSuspendWorkflowRun: (e) => X().inspectSuspendWorkflowRun(e),
@@ -1595,12 +1601,12 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
1595
1601
  inspectSignalWorkflowRun: (e) => X().inspectSignalWorkflowRun(e),
1596
1602
  inspectUpdateWorkflowRun: (e) => X().inspectUpdateWorkflowRun(e),
1597
1603
  inspectInferences: (e) => Xe({
1598
- store: T,
1599
- active: (y.workflows?.length ?? 0) > 0,
1604
+ store: w,
1605
+ active: (_.workflows?.length ?? 0) > 0,
1600
1606
  dispatcher: () => Z.inferenceHealth()
1601
1607
  }, e.limit === void 0 ? {} : { limit: e.limit }),
1602
1608
  ..._t({
1603
- store: T,
1609
+ store: w,
1604
1610
  cancelRun: async (e) => await Z.runCanceller()?.(e) ?? !1,
1605
1611
  retryRun: async (e) => X().inspectRetryWorkflowRun({ runId: e }),
1606
1612
  redriveRun: async (e) => Z.redriveWorkflowRun({ runId: e }),
@@ -1608,12 +1614,12 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
1608
1614
  }),
1609
1615
  inspectRedriveWorkflowRun: (e) => Z.redriveWorkflowRun(e),
1610
1616
  inspectResumeWorkflowRunFromStep: (e) => Z.resumeWorkflowRunFromStep(e)
1611
- }, Wr = (process.env.VOLTRO_TENANT_ISOLATION ?? m?.tenancy?.isolation) === "namespace", Gr = Wr && g !== "memory" ? await (async () => {
1612
- let e = await F(g);
1617
+ }, Wr = (process.env.VOLTRO_TENANT_ISOLATION ?? p?.tenancy?.isolation) === "namespace", Gr = Wr && h !== "memory" ? await (async () => {
1618
+ let e = await F(h);
1613
1619
  return D({
1614
- tables: C,
1620
+ tables: x,
1615
1621
  sqlLayer: e.makeSqlLayer(A()),
1616
- dialect: g,
1622
+ dialect: h,
1617
1623
  options: { retryFilter: e.retryFilter },
1618
1624
  log: {
1619
1625
  info: (e, t) => $.info(e, t),
@@ -1621,9 +1627,9 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
1621
1627
  }
1622
1628
  });
1623
1629
  })() : void 0, qr = await ut({
1624
- input: m?.tenancy?.residency,
1630
+ input: p?.tenancy?.residency,
1625
1631
  namespaceIsolationOn: Wr,
1626
- makeStoreForUrl: (e, t) => nt(m, void 0, Ut(A(), t)),
1632
+ makeStoreForUrl: (e, t) => nt(p, void 0, Ut(A(), t)),
1627
1633
  log: {
1628
1634
  info: (e, t) => $.info(e, t),
1629
1635
  warn: (e, t) => $.warn(e, t)
@@ -1633,7 +1639,7 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
1633
1639
  await qr.close();
1634
1640
  });
1635
1641
  let Z = await Yi({
1636
- bootTiming: u,
1642
+ bootTiming: l,
1637
1643
  broadcastNamespace: Dn,
1638
1644
  scheduling: (() => {
1639
1645
  let e = mn;
@@ -1643,84 +1649,84 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
1643
1649
  cancelSweepMs: e.cancelSweepMs,
1644
1650
  stalenessSweepMs: e.stalenessSweepMs,
1645
1651
  disarmWhenIdle: $e({
1646
- changeScope: T.changeScope,
1652
+ changeScope: w.changeScope,
1647
1653
  broadcastAttached: Mn !== void 0
1648
1654
  })
1649
1655
  };
1650
1656
  })(),
1651
- ...m?.workflows?.staleness === void 0 ? {} : { workflowStaleness: m.workflows.staleness },
1652
- ...m?.workflows?.suspendSignalHintMs === void 0 ? {} : { workflowSuspendSignalHintMs: m.workflows.suspendSignalHintMs },
1653
- workflowRecording: M(m?.workflows?.recording),
1657
+ ...p?.workflows?.staleness === void 0 ? {} : { workflowStaleness: p.workflows.staleness },
1658
+ ...p?.workflows?.suspendSignalHintMs === void 0 ? {} : { workflowSuspendSignalHintMs: p.workflows.suspendSignalHintMs },
1659
+ workflowRecording: M(p?.workflows?.recording),
1654
1660
  membership: {
1655
1661
  ...R,
1656
1662
  instanceId: L
1657
1663
  },
1658
1664
  security: {
1659
- defaultDeny: Oe(m),
1660
- ..._e(m)
1665
+ defaultDeny: Ae(p),
1666
+ ...ye(p)
1661
1667
  },
1662
- approvals: { defaultExpiryMs: Ne(m) },
1663
- ...m?.plugins === void 0 ? {} : { plugins: m.plugins },
1668
+ approvals: { defaultExpiryMs: Fe(p) },
1669
+ ...p?.plugins === void 0 ? {} : { plugins: p.plugins },
1664
1670
  ...Rn ? { idempotency: Rn } : {},
1665
1671
  restRoutes: Ln,
1666
- appProcedures: de,
1672
+ appProcedures: pe,
1667
1673
  discovered: {
1668
- queries: [...y.queries, ...Ir],
1669
- mutations: y.mutations,
1670
- actions: [...y.actions, ...Fr],
1671
- streams: y.streams,
1672
- events: y.events,
1673
- workflows: y.workflows,
1674
- workflowWorkers: y.workflowWorkers,
1675
- eventTriggers: y.eventTriggers,
1674
+ queries: [..._.queries, ...Ir],
1675
+ mutations: _.mutations,
1676
+ actions: [..._.actions, ...Fr],
1677
+ streams: _.streams,
1678
+ events: _.events,
1679
+ workflows: _.workflows,
1680
+ workflowWorkers: _.workflowWorkers,
1681
+ eventTriggers: _.eventTriggers,
1676
1682
  schedules: Zn,
1677
1683
  subscribers: lr,
1678
1684
  outboxHandlers: vr,
1679
- connections: y.connections,
1685
+ connections: _.connections,
1680
1686
  reactions: ur,
1681
1687
  aggregates: br,
1682
1688
  expectations: Ar,
1683
1689
  budgets: Mr,
1684
1690
  experiments: Pr,
1685
- ...Ee === void 0 ? {} : { webhooks: Ee }
1691
+ ...Oe === void 0 ? {} : { webhooks: Oe }
1686
1692
  },
1687
1693
  log: $,
1688
- analytics: Fe.sink,
1694
+ analytics: Le.sink,
1689
1695
  aggregateStorage: Er,
1690
1696
  aggregateCoordinator: Or,
1691
- store: T,
1697
+ store: w,
1692
1698
  kv: Ct,
1693
1699
  cache: ot,
1694
1700
  snapshotCache: at,
1695
- ...m?.reactive === void 0 ? {} : { reactive: m.reactive },
1696
- schemaRegistry: He,
1697
- tenantScopedTables: y.tenantScopedTables,
1698
- softDeleteScopedTables: y.softDeleteScopedTables,
1699
- dataTransferSnapshot: Hn(C),
1700
- dataTransferDialect: g,
1701
+ ...p?.reactive === void 0 ? {} : { reactive: p.reactive },
1702
+ schemaRegistry: Ue,
1703
+ tenantScopedTables: _.tenantScopedTables,
1704
+ softDeleteScopedTables: _.softDeleteScopedTables,
1705
+ dataTransferSnapshot: Hn(x),
1706
+ dataTransferDialect: h,
1701
1707
  ...Gr === void 0 ? {} : { ensureTenantProvisioned: Gr.ensure },
1702
1708
  ...qr === void 0 ? {} : { resolveResidentStore: qr.resolveStore },
1703
- tenantIsolation: (process.env.VOLTRO_TENANT_ISOLATION ?? m?.tenancy?.isolation) === "namespace" ? "namespace" : "shared-schema",
1709
+ tenantIsolation: (process.env.VOLTRO_TENANT_ISOLATION ?? p?.tenancy?.isolation) === "namespace" ? "namespace" : "shared-schema",
1704
1710
  resolveSubject: (e, t) => In({
1705
1711
  headers: e,
1706
1712
  clientId: t
1707
1713
  }),
1708
- ...m?.auth === void 0 ? {} : { authority: m.auth },
1709
- ...m?.agents === void 0 ? {} : { agents: m.agents },
1714
+ ...p?.auth === void 0 ? {} : { authority: p.auth },
1715
+ ...p?.agents === void 0 ? {} : { agents: p.agents },
1710
1716
  httpRoutes: j.flatMap((e) => e.httpRoutes ?? []),
1711
- getStore: () => We,
1717
+ getStore: () => Ge,
1712
1718
  ...Jn ? { baseLayer: Jn } : {},
1713
1719
  ...sr === void 0 ? {} : { workflowEngineLayer: sr },
1714
1720
  scheduleDefaultTrigger: $n,
1715
1721
  scheduleCoordination: nr,
1716
1722
  scheduleArmSelf: !q,
1717
- dormancy: process.env.VOLTRO_DORMANCY === "sleep" || process.env.VOLTRO_DORMANCY === "always-on" ? process.env.VOLTRO_DORMANCY : m?.dormancy ?? "always-on",
1723
+ dormancy: process.env.VOLTRO_DORMANCY === "sleep" || process.env.VOLTRO_DORMANCY === "always-on" ? process.env.VOLTRO_DORMANCY : p?.dormancy ?? "always-on",
1718
1724
  scheduleReplicaId: process.env.HOSTNAME ?? `pid-${process.pid}`,
1719
1725
  ...cr === void 0 ? {} : { scheduleFireInterceptor: cr },
1720
1726
  onSchedulerReady: (e) => {
1721
1727
  ar = e;
1722
1728
  },
1723
- inspectRoute: { handle: async (e, t, n, r) => await ee(e, Ur, t, {
1729
+ inspectRoute: { handle: async (e, t, n, r) => await ne(e, Ur, t, {
1724
1730
  method: n,
1725
1731
  ...r === void 0 ? {} : { body: r }
1726
1732
  }) || ((n === "GET" ? await dn(e, Ur, t, { method: n }) : null) ?? un(e, Ur, t, {
@@ -1731,36 +1737,36 @@ var ji = () => Math.max(500, Math.floor(Yr() * .6)), Mi = (e) => new Promise((t)
1731
1737
  contentType: "application/json",
1732
1738
  body: JSON.stringify({ error: "not an inspect route" })
1733
1739
  }) },
1734
- ...m?.name === void 0 ? {} : { appName: m.name },
1740
+ ...p?.name === void 0 ? {} : { appName: p.name },
1735
1741
  observability: B,
1736
- port: h,
1737
- ...m?.transport?.wsPath ? { path: m.transport.wsPath } : {}
1742
+ port: m,
1743
+ ...p?.transport?.wsPath ? { path: p.transport.wsPath } : {}
1738
1744
  });
1739
- return jn = Z.dispatcher, Se(Pt([
1740
- y.queries,
1741
- y.mutations,
1742
- y.actions,
1743
- y.streams
1745
+ return jn = Z.dispatcher, we(Pt([
1746
+ _.queries,
1747
+ _.mutations,
1748
+ _.actions,
1749
+ _.streams
1744
1750
  ]), (e) => {
1745
1751
  $.warn(e);
1746
- }), $.info(`API listening on :${h}`, {
1747
- dialect: g,
1748
- queries: y.queries.length,
1749
- mutations: y.mutations.length,
1750
- actions: y.actions.length,
1751
- streams: y.streams.length,
1752
- workflows: y.workflows.length,
1753
- workflowWorkers: y.workflowWorkers.length,
1752
+ }), $.info(`API listening on :${m}`, {
1753
+ dialect: h,
1754
+ queries: _.queries.length,
1755
+ mutations: _.mutations.length,
1756
+ actions: _.actions.length,
1757
+ streams: _.streams.length,
1758
+ workflows: _.workflows.length,
1759
+ workflowWorkers: _.workflowWorkers.length,
1754
1760
  schedules: Zn.length,
1755
1761
  scheduleCoordination: nr
1756
- }), u.finish($), Vr(async () => {
1762
+ }), l.finish($), Vr(async () => {
1757
1763
  for (let e of xn) e.stop();
1758
1764
  At.stop();
1759
1765
  try {
1760
- await Z.close(), xt(), Rt?.dispose(), await z.deactivate(), await Mn?.close(), await qe({
1766
+ await Z.close(), xt(), Rt?.dispose(), await z.deactivate(), await Mn?.close(), await Je({
1761
1767
  mirror: Et,
1762
1768
  log: $
1763
- }), await Fe.dispose(), await T.close?.();
1769
+ }), await Le.dispose(), await w.close?.();
1764
1770
  } catch (e) {
1765
1771
  console.error("serve: shutdown step failed, exiting anyway:", e);
1766
1772
  }