@voltro/cli 0.56.0 → 0.58.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 (128) hide show
  1. package/CHANGELOG.md +395 -0
  2. package/dist/apiBuild-CDE4NXNi.js +2 -0
  3. package/dist/{apiBuild-Bdaetr37.js → apiBuild-CkpsCqIu.js} +2 -2
  4. package/dist/bin.js +1 -1
  5. package/dist/build-51qBWfYY.js +981 -0
  6. package/dist/{checkCommand-D0QV_zM_.js → checkCommand-C1EbNmwl.js} +1 -1
  7. package/dist/{checkCommand-CAwFXrxA.js → checkCommand-C30J2F18.js} +4 -4
  8. package/dist/{codegenCommand-CidbQzbv.js → codegenCommand-kS3Twuc9.js} +12 -12
  9. package/dist/{codemodRunner-BlQPfjzA.js → codemodRunner-BKjCwGiN.js} +1127 -895
  10. package/dist/{commands-CWjfThXv.js → commands-DowWkYtd.js} +25 -25
  11. package/dist/{dashboardCommand-BekcY5Ls.js → dashboardCommand-gG1y4PFG.js} +3 -3
  12. package/dist/{dataCommand-2pccgbIy.js → dataCommand-hNOGKz4K.js} +7 -7
  13. package/dist/{dbCommand-DpK_vQET.js → dbCommand-CMAIz-Bf.js} +3 -3
  14. package/dist/dbCommand-DHi_RuDl.js +2 -0
  15. package/dist/{dev-Dw263KPu.js → dev-Ce2gEziv.js} +2411 -2391
  16. package/dist/dev-Dff_pdik.js +3 -0
  17. package/dist/{doctorCommand-aR_bFmIi.js → doctorCommand-5ULMpL10.js} +652 -289
  18. package/dist/doctorCommand-B8H2MYCE.js +2 -0
  19. package/dist/{dormancyCommand-eXTQMbHU.js → dormancyCommand-DYgI0Kf-.js} +3 -3
  20. package/dist/{embeddingsCommand-CTmiQvwa.js → embeddingsCommand-yJivQSrI.js} +2 -2
  21. package/dist/emptyResultHeadline-Csa5fZOF.js +18 -0
  22. package/dist/{envCommand-BDUgV7EM.js → envCommand-ORJUf8r_.js} +2 -2
  23. package/dist/{evolveCommand-YV8qW1LU.js → evolveCommand-DTawtTxf.js} +2 -2
  24. package/dist/frameworkTableAssembly-B96WCNJA.js +2 -0
  25. package/dist/{frameworkTableAssembly-DNOFXfEQ.js → frameworkTableAssembly-vfkzuzEo.js} +104 -85
  26. package/dist/index.js +1 -1
  27. package/dist/{infoCommand-BjVXpMlP.js → infoCommand-BFksHunl.js} +1 -1
  28. package/dist/inspect-CZvsmp8t.js +2 -0
  29. package/dist/{inspect-CNYvNXPU.js → inspect-PcC5J-Dl.js} +74 -59
  30. package/dist/{logsCmd-BU8uCdys.js → logsCmd-C5y9HyrG.js} +58 -53
  31. package/dist/manifestBuild-AUh31bFU.js +2 -0
  32. package/dist/{manifestBuild-CEkjfpwc.js → manifestBuild-BwiS4iYm.js} +1 -1
  33. package/dist/{migrate-SICulyz1.js → migrate-DtC3lu7H.js} +4 -4
  34. package/dist/{probeCommand-6HxEkNDG.js → probeCommand-BUYzc0CT.js} +1 -1
  35. package/dist/{runtimeTrace-DgYMc09E.js → runtimeTrace-BUk5zMXY.js} +1 -1
  36. package/dist/{sdkgen-PY-umd6O.js → sdkgen-CAhmmbjx.js} +1 -1
  37. package/dist/serveCommand-BUXUtSF5.js +2 -0
  38. package/dist/serveCommand-DhtC7WBq.js +2545 -0
  39. package/dist/serveEntry.js +1 -1
  40. package/dist/{start-BFQQkL1i.js → start-C75w6ftA.js} +1 -1
  41. package/dist/{start-B9NGB8gn.js → start-DNtIlBcn.js} +527 -502
  42. package/dist/startEntry.js +1 -1
  43. package/dist/{tracesCmd-BWYDqMy6.js → tracesCmd-C1qKa94g.js} +68 -63
  44. package/dist/{updateCommand-C9n_Z_oG.js → updateCommand-CtuD5r1t.js} +1 -1
  45. package/dist/updateCommand-eVKVHj3N.js +2 -0
  46. package/dist/webDev-Bzb8ZFus.js +2 -0
  47. package/dist/{webDev-C53hJdcL.js → webDev-CBN9KkyQ.js} +949 -834
  48. package/dist/{webhooksCommand-uuPu8qQX.js → webhooksCommand-BPJQOGTe.js} +2 -2
  49. package/package.json +61 -19
  50. package/templates/AGENTS.md +1 -1
  51. package/templates/agent-docs/_index.md +1 -1
  52. package/templates/agent-docs/_manifest.json +2 -2
  53. package/templates/agent-docs/ai.md +175 -1
  54. package/templates/agent-docs/authentication.md +68 -19
  55. package/templates/agent-docs/cli.md +48 -0
  56. package/templates/agent-docs/configuration.md +29 -4
  57. package/templates/agent-docs/data.md +30 -0
  58. package/templates/agent-docs/database/scaling.md +10 -1
  59. package/templates/agent-docs/database/transactions.md +48 -0
  60. package/templates/agent-docs/deployment.md +22 -0
  61. package/templates/agent-docs/observability.md +13 -2
  62. package/templates/agent-docs/plugins/audit.md +21 -5
  63. package/templates/agent-docs/plugins/auth-supabase.md +21 -0
  64. package/templates/agent-docs/plugins/billing.md +2 -0
  65. package/templates/agent-docs/plugins/sentry.md +91 -8
  66. package/templates/agent-docs/reference.md +1 -0
  67. package/templates/agent-docs/scheduling.md +23 -0
  68. package/templates/agent-docs/schema-driven-ui.md +110 -0
  69. package/templates/agent-docs/whats-new.md +103 -399
  70. package/templates/apps/api-ai/package.json +6 -6
  71. package/templates/apps/api-auth/package.json +8 -8
  72. package/templates/apps/api-backend/package.json +7 -7
  73. package/templates/apps/api-backend-deactivation/package.json +7 -7
  74. package/templates/apps/api-backend-mail/package.json +8 -8
  75. package/templates/apps/api-backend-mariadb/package.json +9 -9
  76. package/templates/apps/api-backend-sqlite/package.json +8 -8
  77. package/templates/apps/api-backend-storage/package.json +8 -8
  78. package/templates/apps/api-cms/package.json +9 -9
  79. package/templates/apps/api-collab/package.json +8 -8
  80. package/templates/apps/api-data-advanced/package.json +8 -8
  81. package/templates/apps/api-durable/package.json +8 -8
  82. package/templates/apps/api-feature-flags/package.json +9 -9
  83. package/templates/apps/api-governance/package.json +8 -8
  84. package/templates/apps/api-kv/package.json +8 -8
  85. package/templates/apps/api-moderation/package.json +8 -8
  86. package/templates/apps/api-observability/package.json +8 -8
  87. package/templates/apps/api-ratelimit/package.json +8 -8
  88. package/templates/apps/api-rbac/package.json +8 -8
  89. package/templates/apps/api-rest/package.json +7 -7
  90. package/templates/apps/api-row-history/package.json +8 -8
  91. package/templates/apps/api-saas/package.json +11 -11
  92. package/templates/apps/api-saas-starter/package.json +10 -10
  93. package/templates/apps/api-search/package.json +8 -8
  94. package/templates/apps/api-status/package.json +8 -8
  95. package/templates/apps/api-webhooks/package.json +9 -9
  96. package/templates/apps/changelog/package.json +7 -7
  97. package/templates/apps/edge-functions/package.json +2 -2
  98. package/templates/apps/frontend-admin/package.json +7 -7
  99. package/templates/apps/frontend-app/package.json +8 -8
  100. package/templates/apps/frontend-auth/package.json +7 -7
  101. package/templates/apps/frontend-blank/package.json +6 -6
  102. package/templates/apps/frontend-cms/package.json +8 -8
  103. package/templates/apps/frontend-collab/package.json +9 -9
  104. package/templates/apps/frontend-contact/package.json +7 -7
  105. package/templates/apps/frontend-dashboard/package.json +6 -6
  106. package/templates/apps/frontend-docs/package.json +8 -8
  107. package/templates/apps/frontend-i18n/package.json +6 -6
  108. package/templates/apps/frontend-landing/package.json +7 -7
  109. package/templates/apps/frontend-portal/package.json +7 -7
  110. package/templates/apps/frontend-saas/package.json +7 -7
  111. package/templates/apps/frontend-spa/package.json +6 -6
  112. package/templates/apps/frontend-ssr/package.json +6 -6
  113. package/templates/apps/frontend-ssr-api/package.json +7 -7
  114. package/templates/apps/frontend-static-blog/package.json +8 -8
  115. package/templates/apps/frontend-status/package.json +7 -7
  116. package/templates/apps/mobile-app/package.json +4 -4
  117. package/dist/apiBuild-Vw1figjO.js +0 -2
  118. package/dist/build-CI36wL4R.js +0 -868
  119. package/dist/dbCommand-DrycGWWt.js +0 -2
  120. package/dist/dev-B9Gz0k85.js +0 -3
  121. package/dist/doctorCommand-BMWs6aVm.js +0 -2
  122. package/dist/frameworkTableAssembly-CGNC0qr7.js +0 -2
  123. package/dist/inspect-S2rWy1Ys.js +0 -2
  124. package/dist/manifestBuild-DIa_s6u0.js +0 -2
  125. package/dist/serveCommand-BITS8Hpj.js +0 -2
  126. package/dist/serveCommand-DIJ3ma76.js +0 -2485
  127. package/dist/updateCommand-DsXEAHbd.js +0 -2
  128. package/dist/webDev-C2dRz9s5.js +0 -2
@@ -0,0 +1,2545 @@
1
+ import { t as e } from "./nodeEnvironment-cGFAj1J8.js";
2
+ import { t } from "./frameworkInspectState-CX2250XB.js";
3
+ import { r as n, t as r } from "./appModuleLoader-C9r9mxZt.js";
4
+ import { t as i } from "./bootRefusal-pgvDxlrU.js";
5
+ import { n as a, r as o } from "./startupRunner-CEqQq7ax.js";
6
+ import { n as s, t as c } from "./interruptedReplace-CwnkBb2X.js";
7
+ import { $ as l, $t as u, A as d, At as f, B as ee, Bn as te, Bt as p, C as ne, Cn as m, Ct as re, D as ie, Dn as h, Dt as ae, E as oe, En as se, Et as g, F as _, Fn as ce, Ft as le, G as ue, Gt as de, H as fe, Hn as pe, Ht as me, I as he, In as v, It as ge, Jt as y, K as _e, Kt as ve, L as ye, Lt as b, M as be, Mn as xe, Mt as Se, N as Ce, Nn as we, Nt as Te, O as Ee, On as De, Ot as Oe, P as ke, Pn as Ae, Pt as x, Q as S, Qt as je, R as Me, Rn as Ne, Rt as Pe, S as Fe, Sn as Ie, St as Le, T as Re, Tn as ze, Tt as Be, U as Ve, Un as He, Ut as Ue, Vn as We, Vt as Ge, W as Ke, Wt as qe, X as Je, Xt as Ye, Y as Xe, Z as Ze, _ as Qe, _n as $e, _t as et, a as tt, an as nt, at as C, b as rt, bn as it, bt as at, cn as ot, ct as w, d as st, dn as T, dt as E, en as ct, et as lt, f as ut, fn as dt, ft, g as pt, gn as D, gt as mt, h as ht, hn as gt, ht as _t, i as vt, in as yt, it as bt, j as xt, jn as St, jt as Ct, k as O, kn as k, kt as wt, l as Tt, ln as Et, lt as Dt, m as Ot, mn as kt, mt as At, nn as jt, nt as Mt, on as Nt, ot as Pt, pn as Ft, pt as It, qt as Lt, rn as Rt, rt as zt, s as A, sn as Bt, st as Vt, t as j, tn as Ht, tt as Ut, un as Wt, ut as Gt, v as Kt, vn as qt, vt as Jt, w as Yt, wn as Xt, wt as Zt, x as Qt, xn as $t, xt as M, y as en, yn as tn, yt as nn, z as rn, zn as an, zt as on } from "./dev-Ce2gEziv.js";
8
+ import { Yt as sn, en as cn, ft as ln, ht as un, lt as dn, mt as fn, pt as pn, qt as mn } from "./webDev-CBN9KkyQ.js";
9
+ import { g as hn, s as gn } from "./inspect-PcC5J-Dl.js";
10
+ import { n as _n } from "./cliArgs-D4p8n7EE.js";
11
+ import { r as vn } from "./appPort-B_HpJ_ck.js";
12
+ import { r as yn, u as bn } from "./apiBuild-CkpsCqIu.js";
13
+ import { r as xn } from "./dialectDriver-czCHYpeH.js";
14
+ import { i as Sn, n as Cn } from "./connectionConfig-Bk9IC7D0.js";
15
+ import { c as wn, n as Tn, o as En } from "./seedRunner-DISBKow-.js";
16
+ import { f as Dn, g as On, h as kn, m as An, r as jn } from "./frameworkTableAssembly-vfkzuzEo.js";
17
+ import { n as Mn, r as Nn, t as Pn } from "./declaredSchemaGates-BlcwObhb.js";
18
+ import { C as Fn, a as In, h as Ln, l as Rn, n as zn, u as Bn, w as Vn } from "./fileConventions-l-RIXbx8.js";
19
+ import { i as Hn, n as Un, t as Wn } from "./inspectMetrics-BY0Sjb2F.js";
20
+ import { n as Gn } from "./mssqlClusterPatch-_4cE_nun.js";
21
+ import { i as Kn, n as qn, r as Jn, t as Yn } from "./webhookDiscovery-CphsQe59.js";
22
+ import { t as Xn } from "./bootTiming-BdyP9nYw.js";
23
+ import { a as Zn, o as Qn, t as $n } from "./dataProfile-Du3ztYxv.js";
24
+ import N, { basename as er, join as tr } from "node:path";
25
+ import { createWriteStream as nr, existsSync as rr } from "node:fs";
26
+ import { pathToFileURL as ir } from "node:url";
27
+ import { LoggerLayer as ar, createLogger as P } from "@voltro/logger";
28
+ import { AuthMiddleware as or, ConnectionInfoMiddleware as F, actionToRpc as I, anonymousSubject as sr, isWireReachable as cr, mutationToRpc as lr, queryToRpc as L, streamToRpc as ur, wireErrorUnion as dr, workflowCancelDescriptor as fr, workflowDomainEventsQueryDescriptor as pr, workflowEventDeliveriesQueryDescriptor as mr, workflowResumeDescriptor as hr, workflowRunEventsQueryDescriptor as gr, workflowRunQueryDescriptor as R, workflowRunStepsQueryDescriptor as _r, workflowRunsQueryDescriptor as vr, workflowSignalDescriptor as z, workflowUpdateDescriptor as yr } from "@voltro/protocol";
29
+ import { DATA_TRANSFERS_TABLE as B, _voltroDataTransfersTable as br, allRegisteredTables as xr, and as Sr, connectionIdentity as Cr, derivedRowId as wr, describeTransferRun as Tr, ensureTableRegistered as Er, eq as V, or as Dr } from "@voltro/database";
30
+ import { appMode as Or, frameworkVersion as kr, instanceId as Ar, replicaId as jr, resolveAdvertisedHost as Mr, setProcessAdvertisedAddress as Nr, setProcessBootPath as Pr } from "@voltro/protocol/identity";
31
+ import { AggregateRegistry as Fr, CostRegistry as H, DORMANCY_WAKEUP_TENANT as Ir, Dispatcher as Lr, ExpectationRegistry as Rr, ExperimentRegistry as zr, apiKeyManagementRoutes as Br, attachAnalyticsMirror as Vr, attachExpectations as Hr, attachExperiments as Ur, attachFinops as Wr, awaitServerListening as Gr, bindMutation as U, bindStream as Kr, bindSubscription as W, buildTracingLayer as qr, cancelWakeup as Jr, compileCron as Yr, dataStoreApiKeyStore as Xr, formatServerOnlyLeaks as Zr, formatUnresolvedSources as Qr, frameworkApiKeyStrategy as $r, getResourcePolicy as ei, installPolicyGuardResolver as ti, loadResourceTuples as ni, makeActionRunner as ri, makeAdvisoryLockCoordinator as ii, makeApiKeyService as ai, makeApiKeyUsageBuffer as oi, makeApiKeyUsageFlusher as si, makeAsyncKv as ci, makeAuthMiddlewareLayers as li, makeBufferingSpanProcessor as ui, makeCoordinatedScheduler as di, makeEffectStoreLayer as fi, makeLazyWorkflowFacade as pi, makeMutationOutputCodec as mi, makeMutationRunner as hi, makeOneShotQueryRunner as gi, makeQueryDescriptorProducer as _i, makeQueryFinalizer as vi, makeQueryReauthorizer as yi, makeQuerySubscriber as bi, makeSchemaRegistry as xi, makeWorkflowFacade as Si, makeWorkflowFacadeWithCallerContext as Ci, makeWorkflowLayers as wi, noopKv as Ti, onProcessShutdown as G, recordSubscriptionDelivery as K, recordWorkflowRun as Ei, registerDefaultTupleSource as Di, registerWakeup as Oi, resolveSecretsBackend as ki, runProvidedEffect as Ai, setSecretsBackend as ji, setSystemStoreHandle as Mi, shutdownGraceMsFromEnv as Ni, singleCoordinator as Pi, startRpcServer as Fi, startScheduler as q, stripForbiddenForWire as Ii, undoCaptureEnabled as Li, unresolvedSources as Ri, withScopedRequest as zi, workflowToRpc as Bi, wrapStoreWithBootCodec as Vi } from "@voltro/runtime";
32
+ import { assertProductionSessionSecret as Hi } from "@voltro/protocol/session";
33
+ import { Cause as Ui, Effect as J, Layer as Y, ManagedRuntime as Wi } from "effect";
34
+ import { SqlClient as Gi } from "@effect/sql";
35
+ import { declaredSnapshot as Ki, describeOutcome as qi, pendingFileMigrationIds as Ji, runPlannedMigrations as Yi } from "@voltro/database/sql";
36
+ import Xi, { tmpdir as Zi } from "node:os";
37
+ import { RpcGroup as Qi } from "@effect/rpc";
38
+ import { appStorageProvider as $i, durabilityNotice as ea, fromNodeReadable as ta, getObjectStream as na, putObjectStream as ra, toNodeReadable as ia } from "@voltro/plugin-storage";
39
+ import { isEnvContract as aa } from "@voltro/env";
40
+ import X from "node:fs/promises";
41
+ import { createHash as oa, timingSafeEqual as sa } from "node:crypto";
42
+ import { channelFor as ca, getBroadcastPlugin as la } from "@voltro/plugin-broadcast";
43
+ import { buildDeliverWebhookExecute as ua, buildWebhooksService as da, defaultIncomingPath as fa, deliverWebhookWorkflow as pa, makeDeferredEmitHandler as ma, mountIncomingWebhook as ha } from "@voltro/plugin-webhooks";
44
+ import { getAuthSessionStrategy as ga } from "@voltro/plugin-auth";
45
+ import { registerEmailTemplates as _a } from "@voltro/plugin-mail";
46
+ import { checkSchemaDrift as va, decideStaging as ya, isEnvironmentLocal as ba, packBundle as xa, peekBundle as Sa, runExport as Ca, runImport as wa, storageBlobSink as Ta, storageRefsBlobSource as Ea, unpackBundle as Da, unpackBundleToDir as Oa } from "@voltro/data-transfer";
47
+ //#region \0rolldown/runtime.js
48
+ var ka = /* @__PURE__ */ ((e) => typeof require < "u" ? require : typeof Proxy < "u" ? new Proxy(e, { get: (e, t) => (typeof require < "u" ? require : e)[t] }) : e)(function(e) {
49
+ if (typeof require < "u") return require.apply(this, arguments);
50
+ throw Error("Calling `require` for \"" + e + "\" in an environment that doesn't expose the `require` function. See https://rolldown.rs/in-depth/bundling-cjs#require-external-modules for more details.");
51
+ }), Aa = () => Math.max(500, Math.floor(Ni() * .6)), ja = (e) => new Promise((t) => setTimeout(t, e)), Ma = (e) => {
52
+ let t = /* @__PURE__ */ new Set(), n = /* @__PURE__ */ new Set(), r = 0;
53
+ e.on("connection", (e) => {
54
+ t.add(e), e.once("close", () => {
55
+ t.delete(e), n.delete(e);
56
+ });
57
+ }), e.on("upgrade", (e, t) => {
58
+ n.add(t);
59
+ }), e.on("request", (e, t) => {
60
+ r += 1, t.once("close", () => {
61
+ --r;
62
+ });
63
+ });
64
+ let i, a = async (t = {}) => {
65
+ let n = t.budgetMs ?? Aa();
66
+ i ??= new Promise((t) => {
67
+ e.close(() => {
68
+ t();
69
+ });
70
+ }), e.closeIdleConnections();
71
+ let a = Date.now() + n;
72
+ for (; r > 0 && Date.now() < a;) await ja(25), e.closeIdleConnections();
73
+ e.closeIdleConnections();
74
+ }, o = async () => {
75
+ i ??= new Promise((t) => {
76
+ e.close(() => {
77
+ t();
78
+ });
79
+ });
80
+ for (let e of t) if (n.has(e)) try {
81
+ e.write(Buffer.from([
82
+ 136,
83
+ 2,
84
+ 3,
85
+ 233
86
+ ]));
87
+ } catch {}
88
+ else e.destroy();
89
+ for (let e = 0; t.size > 0 && e < 250; e += 25) await ja(25);
90
+ for (let e of t) e.destroy();
91
+ await i;
92
+ };
93
+ return {
94
+ activeRequests: () => r,
95
+ drainRequests: a,
96
+ finish: o,
97
+ drain: async (e = {}) => {
98
+ await a(e), await o();
99
+ }
100
+ };
101
+ }, Na = "/_voltro/admin/import", Pa = "/_voltro/admin/import/start", Fa = "/_voltro/admin/export", Ia = "/_voltro/admin/export/download", La = "/_voltro/admin/transfers", Z = (e, t) => ({
102
+ status: e,
103
+ contentType: "application/json; charset=utf-8",
104
+ body: JSON.stringify(t)
105
+ }), Ra = (e) => {
106
+ let t = e.authorization ?? e.Authorization, n = t ? /^Bearer\s+(.+)$/i.exec(t) : null;
107
+ return n ? n[1] : null;
108
+ }, za = (e, t) => sa(oa("sha256").update(e).digest(), oa("sha256").update(t).digest()), Ba = (e, t, n = "POST") => {
109
+ if (e.method.toUpperCase() !== n) return Z(405, { error: "method not allowed" });
110
+ if (!t || t.length < 16) return Z(503, { error: "data transfer misconfigured (no/weak secret)" });
111
+ let r = Ra(e.headers);
112
+ return !r || !za(r, t) ? Z(401, { error: "unauthorized" }) : null;
113
+ }, Va = /^[A-Za-z0-9_-]{8,64}$/, Ha = (e) => Va.test(e), Ua = () => process.env.VOLTRO_IMPORT_UPLOAD_DIR ?? N.join(Xi.tmpdir(), "voltro-import-uploads"), Wa = (e) => N.join(Ua(), e), Ga = (e) => N.join(Wa(e), "archive.bin"), Ka = (e) => N.join(Wa(e), "meta.json"), qa = async (e = Date.now()) => {
114
+ let t = 0;
115
+ try {
116
+ for (let n of await X.readdir(Ua())) {
117
+ if (n === ".runs") continue;
118
+ let r = await X.stat(Wa(n)).catch(() => null);
119
+ r !== null && (e - r.mtimeMs <= 864e5 || (await X.rm(Wa(n), {
120
+ recursive: !0,
121
+ force: !0
122
+ }).catch(() => void 0), t++));
123
+ }
124
+ } catch {}
125
+ return t;
126
+ }, Ja = async (e) => {
127
+ if (!Ha(e)) return {
128
+ bytes: 0,
129
+ key: null,
130
+ runId: null
131
+ };
132
+ let t = await X.stat(Ga(e)).catch(() => null);
133
+ if (t === null) return {
134
+ bytes: 0,
135
+ key: null,
136
+ runId: null
137
+ };
138
+ let n = await Ya(e);
139
+ return {
140
+ bytes: t.size,
141
+ key: n.key ?? null,
142
+ runId: n.runId ?? null
143
+ };
144
+ }, Ya = async (e) => {
145
+ try {
146
+ let t = await X.readFile(Ka(e), "utf8");
147
+ return JSON.parse(t);
148
+ } catch {
149
+ return {};
150
+ }
151
+ }, Xa = async (e, t) => {
152
+ let n = Ka(e), r = `${n}.${process.pid}.${Math.random().toString(36).slice(2, 8)}.tmp`;
153
+ await X.writeFile(r, JSON.stringify(t)), await X.rename(r, n);
154
+ }, Za = async (e, t, n) => {
155
+ if (!Ha(e)) return t;
156
+ await X.mkdir(Wa(e), { recursive: !0 });
157
+ let r = await Ya(e), i = typeof r.runId == "string" && r.runId.length > 0 ? r.runId : null;
158
+ return i !== null && n?.takeOver !== !0 ? i : (await Xa(e, {
159
+ ...r,
160
+ runId: t
161
+ }), t);
162
+ }, Qa = async (e) => {
163
+ if (!Ha(e)) return;
164
+ let t = await Ya(e);
165
+ if (t.runId === void 0) return;
166
+ let { runId: n, ...r } = t;
167
+ await Xa(e, r).catch(() => void 0);
168
+ }, $a = async (e, t, n) => (await X.mkdir(Wa(e), { recursive: !0 }), await X.writeFile(Ga(e), Buffer.from(t)), await Xa(e, {
169
+ ...await Ya(e),
170
+ key: n,
171
+ startedAt: (/* @__PURE__ */ new Date()).toISOString()
172
+ }), t.byteLength), eo = (e) => `up-${oa("sha256").update(e).digest("hex").slice(0, 32)}`, to = async (e) => {
173
+ if (!Ha(e.id)) return {
174
+ reason: "bad-id",
175
+ message: `upload id must match ${String(Va)}`
176
+ };
177
+ let t = await Ja(e.id);
178
+ if (t.key !== null && t.key !== e.key) return {
179
+ reason: "key-mismatch",
180
+ message: "this upload id already holds a different bundle. Use a new upload id, or delete the partial upload."
181
+ };
182
+ if (e.offset !== t.bytes) return {
183
+ reason: "offset-mismatch",
184
+ message: `chunk starts at ${e.offset} but the server holds ${t.bytes} byte(s)`,
185
+ expectedOffset: t.bytes
186
+ };
187
+ if (await X.mkdir(Wa(e.id), { recursive: !0 }), t.key === null) {
188
+ let t = await Ya(e.id);
189
+ await Xa(e.id, {
190
+ ...t,
191
+ key: e.key,
192
+ startedAt: (/* @__PURE__ */ new Date()).toISOString()
193
+ });
194
+ }
195
+ return await new Promise((t, n) => {
196
+ let r = nr(Ga(e.id), { flags: "a" });
197
+ r.on("error", n), r.on("finish", () => t()), r.end(Buffer.from(e.bytes));
198
+ }), { total: t.bytes + e.bytes.byteLength };
199
+ }, no = async (e) => {
200
+ let t = await X.stat(Ga(e));
201
+ return {
202
+ path: Ga(e),
203
+ bytes: t.size
204
+ };
205
+ }, ro = () => N.join(Ua(), ".runs"), io = (e) => N.join(ro(), `${e}.bin`), ao = async (e, t) => {
206
+ if (!Ha(e)) return null;
207
+ let n = Ga(e), r = await X.stat(n).catch(() => null);
208
+ if (r === null || r.size === 0) return null;
209
+ await X.mkdir(ro(), { recursive: !0 });
210
+ let i = io(t);
211
+ return await X.rename(n, i), i;
212
+ }, oo = async (e) => {
213
+ await X.rm(io(e), { force: !0 }).catch(() => void 0);
214
+ }, Q = P({ scope: "voltro:admin-import" }), so = "VBUNDLE2", co = (e) => {
215
+ let t = e.req.headers["x-import-rollback-key"];
216
+ if (e.mode !== "replace") return { options: {} };
217
+ if (typeof t != "string" || t.length === 0) return Q.warn("admin.import: no rollback capture — this run empties the target first, and nothing was asked to be kept. Send `x-import-rollback-key: <storage key>` (voltro data import --rollback-key <key>) to have the instance store the target's current rows before deleting them."), { options: {} };
218
+ if (e.deps.putArchive === void 0) return {
219
+ options: {},
220
+ refusal: Z(409, {
221
+ error: "rollback capture requested but this instance has no object storage configured",
222
+ hint: "A capture written to the pod would not survive the failure it exists for. Configure storage (the same one the storage-push export uses), or re-send without `x-import-rollback-key` to accept that a run which does not finish can leave the target emptied. Note that CONFIGURED is not the same question as SURVIVES: a `filesystem` provider pointed at a container directory with no volume behind it passes this check and dies with the pod. The run says so when it can observe it — the capture path being on the same filesystem as `/`."
223
+ })
224
+ };
225
+ let n = tr(Zi(), `voltro-rollback-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`), r = e.deps.putArchive;
226
+ return {
227
+ key: t,
228
+ options: {
229
+ rollbackDir: n,
230
+ onRollbackCaptured: async () => {
231
+ let e = ea(n);
232
+ e !== void 0 && Q.warn(`admin.import: ${e}`), await r(t, () => xa({ dir: n })), Q.info("admin.import: rollback capture stored", { bundleKey: t });
233
+ }
234
+ }
235
+ };
236
+ }, lo = (e) => {
237
+ let t = e["x-import-mode"], n = e["x-import-atomic"];
238
+ return {
239
+ mode: t,
240
+ onConflict: e["x-import-on-conflict"],
241
+ atomic: n === "0" || n === "false" ? !1 : n === "1" || n === "true" || t === "replace",
242
+ force: e["x-import-force"] === "1" || e["x-import-force"] === "true",
243
+ dryRun: e["x-import-dry-run"] === "1" || e["x-import-dry-run"] === "true",
244
+ tables: (e["x-import-tables"] ?? "").split(",").map((e) => e.trim()).filter(Boolean)
245
+ };
246
+ }, uo = async (e, t) => {
247
+ if (typeof t.bundleKey == "string" && t.bundleKey !== "") {
248
+ if (!e.openArchive) return { refusal: Z(501, { error: "storage transport not configured on this instance" }) };
249
+ let n = e.openArchive, r = t.bundleKey;
250
+ return {
251
+ source: () => n(r),
252
+ transport: "storage",
253
+ uploadId: eo(r)
254
+ };
255
+ }
256
+ let n = t.uploadId;
257
+ if (typeof n != "string" || !Ha(n)) return { refusal: Z(400, { error: "start needs { uploadId } from an upload, or { bundleKey } for the storage transport" }) };
258
+ let r = await no(n).catch(() => null);
259
+ return r === null || r.bytes === 0 ? { refusal: Z(409, {
260
+ error: "no such upload",
261
+ message: `this instance holds no bytes for upload '${n}'. Upload the bundle first, or re-upload if it has expired.`
262
+ }) } : {
263
+ source: () => fo(r.path),
264
+ transport: "upload",
265
+ uploadId: n
266
+ };
267
+ }, fo = (e) => {
268
+ let { createReadStream: t } = ka("node:fs");
269
+ return t(e);
270
+ }, po = (e) => async (t) => {
271
+ let n = Ba(t, e.secret);
272
+ if (n) return n;
273
+ let r = lo(t.headers), i = co({
274
+ req: t,
275
+ mode: r.mode,
276
+ deps: e
277
+ });
278
+ if (i.refusal !== void 0) return i.refusal;
279
+ if (t.headers["x-import-preflight"] === "1" || t.headers["x-import-preflight"] === "true") {
280
+ let n;
281
+ try {
282
+ n = JSON.parse(Buffer.from(t.rawBody).toString("utf8") || "{}");
283
+ } catch {
284
+ return Z(400, { error: "a preflight body must be JSON: { tables: string[] } or { bundleKey: string }" });
285
+ }
286
+ let a = Array.isArray(n.tables) ? n.tables.filter((e) => typeof e == "string") : [];
287
+ if (a.length === 0 && typeof n.bundleKey == "string" && n.bundleKey !== "" && e.openArchive && (a = [...await mo(e.openArchive(n.bundleKey))]), a.length === 0) return Z(400, {
288
+ error: "a preflight needs { tables: string[] } — the bundle's table names, so the staging decision can be made against them",
289
+ hint: "or { bundleKey } on an instance with storage configured, where this endpoint reads the table list out of the archive itself"
290
+ });
291
+ let o = ya({
292
+ mode: r.mode ?? "upsert",
293
+ ...e.dialect === void 0 ? {} : { targetDialect: e.dialect },
294
+ ...e.snapshot === void 0 ? {} : { targetSnapshot: e.snapshot },
295
+ bundleTables: a,
296
+ isSkipped: ba,
297
+ canRunSql: !0
298
+ });
299
+ return Z(200, {
300
+ preflight: !0,
301
+ mode: r.mode ?? "upsert",
302
+ atomic: r.atomic,
303
+ staged: o.active,
304
+ ...o.blocker === void 0 ? {} : { reason: o.blocker },
305
+ stagedTables: o.tables.length,
306
+ rollback: i.key === void 0 ? { taken: !1 } : {
307
+ taken: !0,
308
+ key: i.key
309
+ },
310
+ dialect: e.dialect ?? null
311
+ });
312
+ }
313
+ let a = t.headers["x-import-upload-id"];
314
+ if (a !== void 0 && a !== "") {
315
+ if (qa(), t.headers["x-import-probe"] === "1") {
316
+ let e = await Ja(a);
317
+ return Z(200, {
318
+ uploadId: a,
319
+ bytes: e.bytes,
320
+ ...e.runId === null ? {} : { runId: e.runId }
321
+ });
322
+ }
323
+ let e = t.headers["x-import-upload-key"] ?? "", n = Number(t.headers["x-import-chunk-offset"] ?? "0");
324
+ if (e === "" || !Number.isFinite(n) || n < 0) return Z(400, { error: "a chunked upload needs x-import-upload-key and a numeric x-import-chunk-offset" });
325
+ let r = await to({
326
+ id: a,
327
+ key: e,
328
+ offset: n,
329
+ bytes: t.rawBody
330
+ });
331
+ if ("reason" in r) return Q.warn("admin.import chunk refused", {
332
+ uploadId: a,
333
+ reason: r.reason
334
+ }), Z(409, {
335
+ error: "chunk refused",
336
+ reason: r.reason,
337
+ message: r.message,
338
+ ...r.expectedOffset === void 0 ? {} : { expectedOffset: r.expectedOffset }
339
+ });
340
+ let i = t.headers["x-import-chunk-final"] === "1";
341
+ return Z(202, {
342
+ uploadId: a,
343
+ bytes: r.total,
344
+ complete: i
345
+ });
346
+ }
347
+ if (t.rawBody.byteLength >= 8 && Buffer.from(t.rawBody.subarray(0, 8)).toString("latin1") === so) {
348
+ qa();
349
+ let e = oa("sha256").update(Buffer.from(t.rawBody)).digest("hex"), n = eo(e);
350
+ return Z(202, {
351
+ uploadId: n,
352
+ bytes: await $a(n, t.rawBody, e),
353
+ complete: !0
354
+ });
355
+ }
356
+ let o;
357
+ try {
358
+ o = JSON.parse(Buffer.from(t.rawBody).toString("utf8") || "{}");
359
+ } catch {
360
+ return Z(400, { error: "body must be a packed bundle archive or { bundleKey } JSON" });
361
+ }
362
+ return typeof o.bundleKey != "string" || !o.bundleKey ? Z(400, { error: "body.bundleKey (string) is required for the storage transport" }) : e.openArchive ? Z(202, {
363
+ uploadId: eo(o.bundleKey),
364
+ bundleKey: o.bundleKey,
365
+ complete: !0
366
+ }) : Z(501, { error: "storage transport not configured on this instance" });
367
+ }, mo = async (e) => {
368
+ let t = await Sa(e, ["manifest.json"]).then((e) => e.get("manifest.json"), () => void 0);
369
+ if (t === void 0) return [];
370
+ try {
371
+ return (JSON.parse(Buffer.from(t).toString("utf8")).tables ?? []).map((e) => e.name).filter((e) => typeof e == "string");
372
+ } catch {
373
+ return [];
374
+ }
375
+ }, ho = (e) => async (t) => {
376
+ let n = Ba(t, e.secret);
377
+ if (n) return n;
378
+ let r = lo(t.headers), i = co({
379
+ req: t,
380
+ mode: r.mode,
381
+ deps: e
382
+ });
383
+ if (i.refusal !== void 0) return i.refusal;
384
+ let a;
385
+ try {
386
+ a = JSON.parse(Buffer.from(t.rawBody).toString("utf8") || "{}");
387
+ } catch {
388
+ return Z(400, { error: "body must be JSON: { uploadId } or { bundleKey }" });
389
+ }
390
+ let o = typeof a.bundleKey == "string" && a.bundleKey !== "" ? eo(a.bundleKey) : typeof a.uploadId == "string" ? a.uploadId : "";
391
+ if (!Ha(o)) return Z(400, { error: "start needs { uploadId } from an upload, or { bundleKey } for the storage transport" });
392
+ let s = wr("dimp", `${o}-${Date.now()}-${Math.random()}`), c = await Za(o, s);
393
+ if (c !== s) {
394
+ let t = await Zn(e.store, c);
395
+ if (Qn(t) === void 0 && t !== null) return Q.info("admin.import start: already running", {
396
+ uploadId: o,
397
+ runId: c
398
+ }), Z(202, {
399
+ runId: c,
400
+ uploadId: o,
401
+ alreadyStarted: !0
402
+ });
403
+ Q.info("admin.import start: taking over a claim whose run is not running", {
404
+ uploadId: o,
405
+ staleRunId: c,
406
+ outcome: Qn(t) ?? "no record"
407
+ }), c = await Za(o, s, { takeOver: !0 });
408
+ }
409
+ let l = async (e) => (await Qa(o).catch(() => void 0), e), u = await uo(e, {
410
+ ...typeof a.uploadId == "string" ? { uploadId: a.uploadId } : {},
411
+ ...typeof a.bundleKey == "string" ? { bundleKey: a.bundleKey } : {}
412
+ });
413
+ if ("refusal" in u) return l(u.refusal);
414
+ if (e.snapshot !== void 0 && !r.force) {
415
+ let t = await go(u.source());
416
+ if (t !== null) {
417
+ let n = va(t.source?.schemaFingerprint ?? "", e.snapshot, _o(t));
418
+ if (n.drifted) return Q.warn("admin.import refused (schema drift)", {
419
+ transport: u.transport,
420
+ bundle: n.bundleFingerprint.slice(0, 16),
421
+ target: n.targetFingerprint.slice(0, 16)
422
+ }), l(Z(409, {
423
+ error: "schema drift",
424
+ bundleFingerprint: n.bundleFingerprint,
425
+ targetFingerprint: n.targetFingerprint,
426
+ diff: n.diff,
427
+ 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."
428
+ }));
429
+ }
430
+ }
431
+ let d = null;
432
+ if (u.transport === "upload" && (d = await ao(u.uploadId, c), d === null)) return l(Z(409, {
433
+ error: "no such upload",
434
+ message: `the bytes for upload '${u.uploadId}' are gone. Re-upload the bundle.`
435
+ }));
436
+ let f = await vo(e.store, {
437
+ runId: c,
438
+ mode: r.mode ?? "upsert",
439
+ via: "api",
440
+ bundle: u.transport === "storage" ? String(a.bundleKey) : u.uploadId
441
+ });
442
+ return yo({
443
+ deps: e,
444
+ opts: r,
445
+ rollback: i,
446
+ runId: c,
447
+ traced: f,
448
+ resolved: d === null ? u : {
449
+ ...u,
450
+ source: () => fo(d)
451
+ }
452
+ }), Q.info("admin.import started", {
453
+ runId: c,
454
+ uploadId: u.uploadId,
455
+ transport: u.transport,
456
+ mode: r.mode ?? "upsert",
457
+ atomic: r.atomic,
458
+ dryRun: r.dryRun
459
+ }), Z(202, {
460
+ runId: c,
461
+ uploadId: u.uploadId,
462
+ transport: u.transport,
463
+ mode: r.mode ?? "upsert",
464
+ atomic: r.atomic,
465
+ ...r.dryRun ? { dryRun: !0 } : {},
466
+ recorded: f,
467
+ outcome: "poll /_voltro/admin/transfers for this runId — a 202 means started, not finished"
468
+ });
469
+ }, go = async (e) => {
470
+ let t = await Sa(e, ["manifest.json"]).then((e) => e.get("manifest.json"), () => null);
471
+ if (t == null) return null;
472
+ try {
473
+ return JSON.parse(Buffer.from(t).toString("utf8"));
474
+ } catch {
475
+ return null;
476
+ }
477
+ }, _o = (e) => ({ tables: (e.tables ?? []).map((e) => ({
478
+ name: e.name,
479
+ indexes: [],
480
+ columns: Object.entries(e.columnTypes ?? {}).map(([e, t]) => ({
481
+ name: e,
482
+ type: t,
483
+ nullable: !0,
484
+ unique: !1,
485
+ hasDefault: !1
486
+ }))
487
+ })) }), vo = async (e, t) => {
488
+ try {
489
+ return Er(br), await e.insert(B, {
490
+ id: t.runId,
491
+ direction: "import",
492
+ startedAt: /* @__PURE__ */ new Date(),
493
+ finishedAt: null,
494
+ failure: null,
495
+ mode: t.mode,
496
+ via: t.via,
497
+ bundle: t.bundle,
498
+ sourceFingerprint: null,
499
+ tablesWritten: 0,
500
+ rowsWritten: 0,
501
+ staged: null
502
+ }), !0;
503
+ } catch (e) {
504
+ return Q.warn("admin.import: the run could not be recorded", {
505
+ runId: t.runId,
506
+ error: e?.message ?? String(e)
507
+ }), !1;
508
+ }
509
+ }, yo = async (e) => {
510
+ let { deps: t, opts: n, rollback: r, resolved: i, runId: a } = e, o = await import("node:os"), s = await import("node:fs/promises"), c = await import("node:path"), l = await s.mkdtemp(c.join(o.tmpdir(), "voltro-admin-import-")), u = async (n) => {
511
+ Q.warn("admin.import failed", {
512
+ runId: a,
513
+ transport: i.transport,
514
+ error: n
515
+ }), e.traced && await t.store.update(B, a, {
516
+ failure: n,
517
+ finishedAt: null
518
+ }).then(() => void 0, () => void 0);
519
+ };
520
+ try {
521
+ t.assetSink ? await Da(i.source(), {
522
+ dir: l,
523
+ blobs: t.assetSink
524
+ }) : await Oa(i.source(), l);
525
+ let o = await J.runPromiseExit(wa({
526
+ store: t.store,
527
+ bundleDir: l,
528
+ ...n.mode ? { mode: n.mode } : {},
529
+ ...n.onConflict ? { onConflict: n.onConflict } : {},
530
+ atomic: n.atomic,
531
+ ...r.options,
532
+ recordInterruption: !0,
533
+ via: "api",
534
+ ...e.traced ? { traceId: a } : {},
535
+ ...n.dryRun ? { dryRun: n.dryRun } : {},
536
+ ...n.tables.length > 0 ? { tables: [...n.tables] } : {},
537
+ ...t.snapshot ? { targetSnapshot: t.snapshot } : {},
538
+ ...t.dialect ? { targetDialect: t.dialect } : {},
539
+ force: n.force,
540
+ onWarn: (e) => Q.warn("admin.import", {
541
+ runId: a,
542
+ message: e
543
+ }),
544
+ ...t.assetSink ? { assetsAlreadyRestored: !0 } : {}
545
+ }));
546
+ if (o._tag === "Failure") {
547
+ let e = o.cause._tag === "Fail" ? o.cause.error : void 0, t = typeof e?.reason == "string" ? e.reason : void 0, n = e?.diff;
548
+ await u(t ?? (Array.isArray(n) ? `schema drift: ${n.join("; ")}` : void 0) ?? String(e?.message ?? e ?? "import failed"));
549
+ return;
550
+ }
551
+ let s = o.value;
552
+ Q.info(n.dryRun ? "admin.import (dry run — nothing written)" : "admin.import complete", {
553
+ runId: a,
554
+ transport: i.transport,
555
+ tables: s.tablesWritten,
556
+ rows: s.rowsWritten,
557
+ mode: n.mode ?? "upsert",
558
+ atomic: n.atomic,
559
+ ...s.tablesSkipped > 0 ? {
560
+ skippedTables: s.tablesSkipped,
561
+ skippedRows: s.rowsSkipped
562
+ } : {}
563
+ }), n.dryRun || t.refreshSubscriptions?.(`data import: ${s.tablesWritten} table(s), mode ${n.mode ?? "upsert"}`);
564
+ } catch (e) {
565
+ await u(e?.message ?? String(e));
566
+ } finally {
567
+ await s.rm(l, {
568
+ recursive: !0,
569
+ force: !0
570
+ }).catch(() => void 0), await oo(a).catch(() => void 0), await Qa(i.uploadId).catch(() => void 0);
571
+ }
572
+ }, bo = /^[A-Za-z0-9_-]{8,64}$/, xo = (e) => bo.test(e), So = () => process.env.VOLTRO_EXPORT_ARTIFACT_DIR ?? N.join(Xi.tmpdir(), "voltro-export-artifacts"), Co = (e) => N.join(So(), e), wo = (e) => N.join(Co(e), "archive.bin"), To = async (e = Date.now()) => {
573
+ let t = 0;
574
+ try {
575
+ for (let n of await X.readdir(So())) {
576
+ let r = await X.stat(Co(n)).catch(() => null);
577
+ r !== null && (e - r.mtimeMs <= 864e5 || (await X.rm(Co(n), {
578
+ recursive: !0,
579
+ force: !0
580
+ }).catch(() => void 0), t++));
581
+ }
582
+ } catch {}
583
+ return t;
584
+ }, Eo = async (e, t) => {
585
+ if (!xo(e)) throw Error(`invalid run id: ${e}`);
586
+ await X.mkdir(Co(e), { recursive: !0 });
587
+ let { createWriteStream: n } = await import("node:fs"), r = n(wo(e)), i = 0;
588
+ try {
589
+ for await (let e of t) i += e.byteLength, r.write(Buffer.from(e)) || await new Promise((e, t) => {
590
+ r.once("drain", e), r.once("error", t);
591
+ });
592
+ } finally {
593
+ await new Promise((e, t) => {
594
+ r.end(() => e()), r.once("error", t);
595
+ });
596
+ }
597
+ return i;
598
+ }, Do = async (e) => {
599
+ if (!xo(e)) return null;
600
+ let t = await X.stat(wo(e)).catch(() => null);
601
+ return t === null ? null : t.size;
602
+ }, Oo = async (e, t, n) => {
603
+ let r = await Do(e);
604
+ if (r === null) return null;
605
+ if (t >= r) return {
606
+ bytes: Buffer.alloc(0),
607
+ total: r
608
+ };
609
+ let i = await X.open(wo(e), "r");
610
+ try {
611
+ let e = Math.max(0, Math.min(n, r - t)), a = Buffer.alloc(e);
612
+ return await i.read(a, 0, e, t), {
613
+ bytes: a,
614
+ total: r
615
+ };
616
+ } finally {
617
+ await i.close();
618
+ }
619
+ }, ko = async (e) => {
620
+ xo(e) && await X.rm(Co(e), {
621
+ recursive: !0,
622
+ force: !0
623
+ }).catch(() => void 0);
624
+ }, Ao = P({ scope: "voltro:admin-export" }), jo = (e) => Array.isArray(e) ? e.filter((e) => typeof e == "string") : [], Mo = (e) => {
625
+ if (typeof e.tenant == "string" && e.tenant) return {
626
+ kind: "tenant",
627
+ tenantId: e.tenant
628
+ };
629
+ if (Array.isArray(e.tables) && e.tables.length) return {
630
+ kind: "tables",
631
+ tables: jo(e.tables)
632
+ };
633
+ let t = jo(e.exclude);
634
+ return t.length > 0 ? {
635
+ kind: "all",
636
+ exclude: t
637
+ } : { kind: "all" };
638
+ }, No = (e) => async (t) => {
639
+ let n = Ba(t, e.secret);
640
+ if (n) return n;
641
+ let r;
642
+ try {
643
+ r = JSON.parse(Buffer.from(t.rawBody).toString("utf8") || "{}");
644
+ } catch {
645
+ return Z(400, { error: "body must be JSON: { profile?, tenant?, tables?, consistency?, compression?, bundleKey? }" });
646
+ }
647
+ let i = {};
648
+ if (typeof r.profile == "string" && r.profile) {
649
+ if (!e.loadProfile) return Z(501, { error: "server-side profiles not configured on this instance" });
650
+ try {
651
+ i = await e.loadProfile(r.profile);
652
+ } catch (e) {
653
+ return Z(400, {
654
+ error: `profile '${r.profile}' could not be loaded`,
655
+ message: e?.message ?? String(e)
656
+ });
657
+ }
658
+ }
659
+ let a = r.consistency === "snapshot" ? "snapshot" : i.consistency ?? "live", o = (typeof r.compression == "string" ? r.compression : void 0) ?? i.compression, s = i.scope ?? Mo(r), c = typeof r.bundleKey == "string" && r.bundleKey.length > 0, l = r.assets === !0 && e.assetSource ? { blobs: e.assetSource } : {}, u = wr("dexp", `${Date.now()}-${Math.random()}`), d = await Po(e.store, {
660
+ runId: u,
661
+ mode: i.subset ? "subset" : s.kind,
662
+ bundle: c ? String(r.bundleKey) : null
663
+ });
664
+ return Fo({
665
+ deps: e,
666
+ runId: u,
667
+ recorded: d,
668
+ profile: i,
669
+ scope: s,
670
+ consistency: a,
671
+ blobs: l,
672
+ ...o ? { compression: o } : {},
673
+ ...c ? { bundleKey: String(r.bundleKey) } : {}
674
+ }), To(), Ao.info("admin.export started", {
675
+ runId: u,
676
+ scope: s.kind,
677
+ storage: c
678
+ }), Z(202, {
679
+ runId: u,
680
+ transport: c ? "storage" : "download",
681
+ ...c ? { bundleKey: r.bundleKey } : {},
682
+ recorded: d,
683
+ outcome: "poll /_voltro/admin/transfers for this runId; fetch the bytes from /_voltro/admin/export/download"
684
+ });
685
+ }, Po = async (e, t) => {
686
+ try {
687
+ return Er(br), await e.insert(B, {
688
+ id: t.runId,
689
+ direction: "export",
690
+ startedAt: /* @__PURE__ */ new Date(),
691
+ finishedAt: null,
692
+ failure: null,
693
+ mode: t.mode,
694
+ via: "api",
695
+ bundle: t.bundle,
696
+ sourceFingerprint: null,
697
+ tablesWritten: 0,
698
+ rowsWritten: 0,
699
+ staged: null
700
+ }), !0;
701
+ } catch (e) {
702
+ return Ao.warn("admin.export: the run could not be recorded", {
703
+ runId: t.runId,
704
+ error: e?.message ?? String(e)
705
+ }), !1;
706
+ }
707
+ }, Fo = async (e) => {
708
+ let { deps: t, runId: n } = e, r = await import("node:os"), i = await import("node:fs/promises"), a = await import("node:path"), o = await i.mkdtemp(a.join(r.tmpdir(), "voltro-admin-export-")), s = async (r) => {
709
+ e.recorded && await t.store.update(B, n, r).then(() => void 0, () => void 0);
710
+ };
711
+ try {
712
+ let r = await J.runPromise(Ca({
713
+ store: t.store,
714
+ snapshot: t.snapshot,
715
+ dialect: t.dialect,
716
+ outDir: o,
717
+ ...e.profile.subset ? { subset: e.profile.subset } : {
718
+ scope: e.scope,
719
+ ...t.tenantTables && t.tenantTables.length > 0 ? { tenantTables: t.tenantTables } : {}
720
+ },
721
+ consistency: e.consistency,
722
+ ...e.compression ? { compression: e.compression } : {},
723
+ ...e.profile.masking ? { masking: e.profile.masking } : {}
724
+ })), i = r.tables.reduce((e, t) => e + t.rowCount, 0), a = r.masking?.transformed.length ?? 0;
725
+ if (e.bundleKey !== void 0) {
726
+ if (!t.putArchive) throw Error("storage transport not configured on this instance");
727
+ await t.putArchive(e.bundleKey, () => xa({
728
+ dir: o,
729
+ ...e.blobs
730
+ }));
731
+ }
732
+ let c = await Eo(n, xa({
733
+ dir: o,
734
+ ...e.blobs
735
+ }));
736
+ Ao.info("admin.export complete", {
737
+ runId: n,
738
+ tables: r.tables.length,
739
+ rows: i,
740
+ masked: a,
741
+ bytes: c,
742
+ ...e.bundleKey === void 0 ? {} : { bundleKey: e.bundleKey }
743
+ }), await s({
744
+ finishedAt: /* @__PURE__ */ new Date(),
745
+ failure: null,
746
+ tablesWritten: r.tables.length,
747
+ rowsWritten: i,
748
+ sourceFingerprint: r.source?.schemaFingerprint ?? null
749
+ });
750
+ } catch (e) {
751
+ let t = e?.message ?? String(e);
752
+ Ao.warn("admin.export failed", {
753
+ runId: n,
754
+ error: t
755
+ }), await s({
756
+ failure: t,
757
+ finishedAt: null
758
+ }), await ko(n);
759
+ } finally {
760
+ await i.rm(o, {
761
+ recursive: !0,
762
+ force: !0
763
+ }).catch(() => void 0);
764
+ }
765
+ }, Io = (e) => async (t) => {
766
+ let n = Ba(t, e.secret, "GET");
767
+ if (n) return n;
768
+ let r = new URLSearchParams(t.query ?? ""), i = r.get("runId") ?? "";
769
+ if (!xo(i)) return Z(400, { error: "download needs ?runId=<id> from the 202 the export answered with" });
770
+ let a = Math.max(0, Number(r.get("offset") ?? "0") || 0), o = Number(r.get("length") ?? "8388608"), s = await Oo(i, a, Number.isFinite(o) && o > 0 ? Math.min(o, Ro) : Lo);
771
+ return s === null ? Z(404, {
772
+ error: "no artefact",
773
+ message: `this instance holds no produced bundle for run '${i}'. It may have expired, or the export may still be running — poll the run first.`
774
+ }) : {
775
+ status: 200,
776
+ contentType: "application/octet-stream",
777
+ body: new Uint8Array(s.bytes),
778
+ headers: {
779
+ "x-export-total-bytes": String(s.total),
780
+ "x-export-offset": String(a),
781
+ "x-export-length": String(s.bytes.byteLength)
782
+ }
783
+ };
784
+ }, Lo = 8388608, Ro = 33554432, zo = async (e, t) => await e.query({
785
+ table: B,
786
+ order: [{
787
+ column: "startedAt",
788
+ direction: "desc"
789
+ }],
790
+ predicate: void 0,
791
+ projection: void 0,
792
+ skip: 0,
793
+ take: t
794
+ }), Bo = (e) => {
795
+ let t = new Date(e);
796
+ return Number.isFinite(t.getTime()) ? t : /* @__PURE__ */ new Date(0);
797
+ }, Vo = (e) => ({
798
+ ...e,
799
+ startedAt: Bo(e.startedAt),
800
+ finishedAt: e.finishedAt === null || e.finishedAt === void 0 ? null : Bo(e.finishedAt)
801
+ }), Ho = (e) => async (t) => {
802
+ let n = Ba(t, e.secret, "GET");
803
+ if (n) return n;
804
+ let r = Number(new URLSearchParams(t.query ?? "").get("limit") ?? "20"), i = Number.isFinite(r) ? Math.max(1, Math.min(200, Math.trunc(r))) : 20, a;
805
+ try {
806
+ a = (await zo(e.store, i)).map(Vo);
807
+ } catch (e) {
808
+ return Z(409, {
809
+ error: "no import history",
810
+ message: `this instance has no \`${B}\` table, so no import has been recorded. Run \`voltro db apply\` against it; imports themselves are unaffected.`,
811
+ detail: e?.message ?? String(e)
812
+ });
813
+ }
814
+ return Z(200, {
815
+ running: a.filter((e) => e.finishedAt === null && e.failure === null).length,
816
+ runs: a.map((e) => ({
817
+ id: e.id,
818
+ startedAt: e.startedAt.toISOString(),
819
+ finishedAt: e.finishedAt === null ? null : e.finishedAt.toISOString(),
820
+ mode: e.mode,
821
+ via: e.via,
822
+ bundle: e.bundle,
823
+ sourceFingerprint: e.sourceFingerprint,
824
+ tablesWritten: e.tablesWritten,
825
+ rowsWritten: e.rowsWritten,
826
+ direction: e.direction,
827
+ failure: e.failure,
828
+ staged: e.staged,
829
+ line: Tr(e)
830
+ }))
831
+ });
832
+ }, Uo = (e, t, n = {}) => (async function* () {
833
+ let r = await J.runPromise(na(e, t).pipe(J.timeout(n.openTimeout ?? "30 seconds"))), i = await ia(r.stream), a = n.stallMs ?? 12e4, o, s = () => {
834
+ o && clearTimeout(o), o = setTimeout(() => i.destroy(/* @__PURE__ */ Error(`storage read stalled for ${a}ms reading '${t}'`)), a);
835
+ };
836
+ try {
837
+ s();
838
+ for await (let e of i) s(), yield e instanceof Uint8Array ? e : new Uint8Array(e);
839
+ } finally {
840
+ o && clearTimeout(o), i.destroy();
841
+ }
842
+ })(), Wo = {
843
+ get: async () => void 0,
844
+ set: async () => {},
845
+ setWithTags: async () => {},
846
+ remove: async () => !1,
847
+ has: async () => !1,
848
+ clear: async () => {},
849
+ invalidateTag: async () => 0,
850
+ wrap: async (e, t, n) => n()
851
+ }, Go = async (e) => {
852
+ y(e.appProcedures ?? e.discovered, {
853
+ defaultDeny: e.security?.defaultDeny ?? !0,
854
+ commandHint: "`voltro serve`"
855
+ }), Mi({
856
+ dataStore: e.store,
857
+ schemaRegistry: e.schemaRegistry
858
+ });
859
+ let t = (e.discovered.budgets?.length ?? 0) > 0, n, r = new Lr({
860
+ crdtColumnsOf: (t) => e.schemaRegistry.crdtColumns(t),
861
+ store: e.store,
862
+ ...e.snapshotCache ? { cache: e.snapshotCache } : {},
863
+ ...e.reactive === void 0 ? {} : { reactive: e.reactive },
864
+ ...t ? { recordCost: (e) => n?.record(e) } : {},
865
+ recordDelivery: (e) => K({
866
+ label: e.label,
867
+ kind: e.kind,
868
+ durationMs: e.durationMs,
869
+ rowCount: e.rowCount
870
+ })
871
+ }), i = e.cache ?? Wo, a = e.kv ?? Ti, o, s = () => void 0, c, u, d, ee, te, ne, m, re = P({ scope: "voltro:workflow" }), ie = P({ scope: "voltro:schedule" }), h = ct({
872
+ store: e.store,
873
+ warn: (e, t) => re.warn(e, t)
874
+ }), ae = h.remember, oe = h.resolve, se = Ht({
875
+ authority: e.authority,
876
+ getStore: () => e.store
877
+ }), g = (e.discovered.workflows?.length ?? 0) > 0 ? pi(() => o) : void 0, ce = (e.discovered.workflows?.length ?? 0) > 0 || (e.discovered.eventTriggers?.length ?? 0) > 0, ue = ce || (e.discovered.workflowWorkers?.length ?? 0) > 0 || e.scheduleCoordination === "cluster", de = e.tenantIsolation === "namespace", fe = (e.log ?? P({ scope: "voltro:serve" })).child("webhooks"), pe, me, v = e.discovered.webhooks;
878
+ if (v && v.outgoing.length > 0 && e.workflowEngineLayer !== void 0) {
879
+ e.workflowEngineLayer;
880
+ let t = $t({
881
+ store: e.store,
882
+ schemaRegistry: e.schemaRegistry,
883
+ cache: i,
884
+ kv: a
885
+ }), n = v.outgoing.map((e) => e.descriptor);
886
+ me = pa.toLayer(ua(t, { events: n })), pe = da(t, async (e) => {
887
+ let t = d;
888
+ if (t === void 0) {
889
+ fe.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.", {
890
+ deliveryId: e.deliveryId,
891
+ targetId: e.targetId
892
+ });
893
+ return;
894
+ }
895
+ t.runPromise(pa.execute(e)).catch((t) => {
896
+ fe.error("deliverWebhook workflow crashed", {
897
+ deliveryId: e.deliveryId,
898
+ targetId: e.targetId
899
+ }, t);
900
+ });
901
+ }, { events: n });
902
+ }
903
+ let ge = /* @__PURE__ */ new Map();
904
+ if (v) for (let e of v.incoming) {
905
+ let t = e.descriptor.path ?? fa(e.descriptor.id), n = `VOLTRO_WEBHOOK_SECRET_${e.descriptor.id.toUpperCase().replace(/[^A-Z0-9]/g, "_")}`, r = ha(e.descriptor, {
906
+ resolveSecret: async () => process.env[n] ?? null,
907
+ resolveWorkflows: () => g === void 0 ? void 0 : Ci(g, {
908
+ traceId: `incoming:${e.descriptor.id}`,
909
+ source: `incoming:${e.descriptor.id}`
910
+ }),
911
+ log: (e) => {
912
+ let t = {
913
+ webhookId: e.webhookId,
914
+ status: e.status,
915
+ signatureOk: String(e.signatureOk),
916
+ idempotency: e.idempotency,
917
+ durationMs: e.durationMs
918
+ };
919
+ e.status >= 500 ? fe.error("incoming delivery failed", t) : e.status >= 400 ? fe.warn("incoming delivery rejected", t) : fe.info("incoming delivery handled", t);
920
+ }
921
+ });
922
+ ge.set(t, { handle: r });
923
+ }
924
+ ti(), Di((t) => ni(e.store, t.subjectId, t.resourceType, t.resourceId)) || P({ scope: "voltro:serve" }).info("policy guards: using the app-registered tuple source");
925
+ let _e = [], ve = [...e.discovered.outboxHandlers ?? [], ...qn((v?.outgoing.length ?? 0) + (v?.incoming.length ?? 0) + (v?.providers.length ?? 0), []) ? [{
926
+ file: "<framework>/webhooks",
927
+ id: "voltro-webhook-emit",
928
+ definition: ma(() => pe)
929
+ }] : []], ye = ve.length > 0 ? Nt({
930
+ handlers: ve,
931
+ store: e.store,
932
+ log: (e.log ?? P({ scope: "voltro:serve" })).child("outbox"),
933
+ onChange: (t) => e.store.onChange((e) => t({
934
+ table: e.table,
935
+ op: e.op
936
+ })),
937
+ onShutdown: (e) => {
938
+ _e.push(e);
939
+ }
940
+ }) : void 0, b = Rt({
941
+ definitions: (e.discovered.connections ?? []).map((e) => e.definition),
942
+ store: e.store,
943
+ publicUrl: jt(e.port ?? 4e3),
944
+ log: (e.log ?? P({ scope: "voltro:serve" })).child("connections")
945
+ });
946
+ ke({
947
+ events: e.discovered.events ?? [],
948
+ rpcTags: [
949
+ ...e.discovered.queries.map((e) => e.descriptor.name),
950
+ ...e.discovered.mutations.map((e) => e.descriptor.name),
951
+ ...e.discovered.actions.map((e) => e.descriptor.name),
952
+ ...(e.discovered.streams ?? []).map((e) => e.descriptor.name)
953
+ ]
954
+ });
955
+ let be = (e.log ?? P({ scope: "voltro:serve" })).child("events"), xe = e.broadcastNamespace ?? en(e.plugins, void 0), Se = rt(e.plugins, xe, be), Ce = e.membership?.instanceId ?? jr(), we = Ar(), Te = e.membership ?? Qt(e.plugins, {
956
+ instanceId: Ce,
957
+ namespace: xe,
958
+ meta: { mode: "serve" },
959
+ logger: be
960
+ }), Ee = _({
961
+ events: e.discovered.events ?? [],
962
+ origin: we,
963
+ ...Se.publishRemote === void 0 ? {} : { publishRemote: Se.publishRemote }
964
+ }), De = (e.discovered.events ?? []).length > 0 ? await Se.attach(Ee.bus) : null, je = it({
965
+ store: e.store,
966
+ schemaRegistry: e.schemaRegistry,
967
+ cache: i,
968
+ kv: a,
969
+ ...pe === void 0 ? {} : { webhooksService: pe },
970
+ ...g === void 0 ? {} : { workflowsProxy: g },
971
+ eventTriggers: e.discovered.eventTriggers ?? [],
972
+ namespaceIsolationOn: de,
973
+ ...e.ensureTenantProvisioned === void 0 ? {} : { ensureTenantProvisioned: e.ensureTenantProvisioned },
974
+ ...e.resolveResidentStore === void 0 ? {} : { resolveResidentStore: e.resolveResidentStore },
975
+ ...ye === void 0 ? {} : { outbox: { nudge: ye.nudge } },
976
+ ...b.active ? { connections: { registry: b.registry } } : {},
977
+ eventBus: Ee.bus
978
+ }), Me = Y.succeed(Fr, le), Ne = Y.succeed(Rr, wt), Pe = Y.succeed(H, Oe), Fe = Y.succeed(zr, f), Ie = (t, n) => {
979
+ let r = t.pipe(J.provide(fi(n)));
980
+ return (e.baseLayer ? r.pipe(J.provide(e.baseLayer)) : r).pipe(J.provide(Me)).pipe(J.provide(Ne)).pipe(J.provide(Pe)).pipe(J.provide(Fe));
981
+ }, Le = (e, t) => {
982
+ let n = Ie(e, t);
983
+ return Ai(n);
984
+ }, Re = Wn(), ze = Mt(e.plugins ?? [], Re), Be = Xe({
985
+ plugins: e.plugins ?? [],
986
+ metrics: Re,
987
+ log: e.log ?? P({ scope: "voltro:serve" })
988
+ }), He = lt(e.plugins ?? [], Re), We = e.security?.defaultDeny ?? !0, Ge = hi({
989
+ store: e.store,
990
+ defaultDeny: We,
991
+ recordMetric: (e) => {
992
+ Re.record(e);
993
+ },
994
+ ...ze.mutation === void 0 ? {} : { interceptor: ze.mutation },
995
+ buildContext: (e, t, n) => je(e, t, n),
996
+ runEffect: Le,
997
+ undoCapture: w((t) => e.schemaRegistry.crdtColumns(t))
998
+ }), Ye = Vt();
999
+ {
1000
+ let t = Dt();
1001
+ t !== void 0 && (e.log ?? P({ scope: "voltro:serve" })).info(t);
1002
+ }
1003
+ let Qe = Pt({
1004
+ store: e.store,
1005
+ ...e.approvals === void 0 ? {} : { defaultExpiryMs: e.approvals.defaultExpiryMs }
1006
+ }), $e = ri({
1007
+ defaultDeny: We,
1008
+ buildContext: (e) => je(e),
1009
+ runEffect: Le,
1010
+ recordMetric: (e) => {
1011
+ Re.record(e);
1012
+ },
1013
+ ...ze.action === void 0 ? {} : { interceptor: ze.action }
1014
+ }), tt = vi({
1015
+ tenantScopedTables: e.tenantScopedTables,
1016
+ softDeleteScopedTables: e.softDeleteScopedTables
1017
+ }), nt = {
1018
+ defaultDeny: We,
1019
+ buildContext: (e) => je(e),
1020
+ finalize: (e, t) => tt(e, t.subject),
1021
+ provideEffect: Ie,
1022
+ ...ze.query === void 0 ? {} : { interceptor: ze.query }
1023
+ }, C = _i(nt), ot = gi({
1024
+ ...nt,
1025
+ queryRows: (t, n) => e.store.query(t).then((e) => Ii(t.table, e, n.subject))
1026
+ }), st = bi({
1027
+ ...nt,
1028
+ subscribeDescriptor: (e, t, n, i, a) => r.subscribe(e, t, n, void 0, void 0, void 0, i, a),
1029
+ subscribeComputed: (e, t, n) => r.subscribeComputed(e, t, n)
1030
+ }), T = (e) => e.filter((e) => cr(e.descriptor)), E = {};
1031
+ for (let t of [
1032
+ ...T(e.discovered.queries),
1033
+ ...Ye.queries,
1034
+ ...Qe.queries,
1035
+ ...b.queries
1036
+ ]) E[t.descriptor.name] = (e) => W(C(t, e), r, `subscription.${t.descriptor.name}`, void 0, void 0, yi(t, e));
1037
+ for (let t of [
1038
+ ...T(e.discovered.mutations),
1039
+ ...Ye.mutations,
1040
+ ...Qe.mutations,
1041
+ ...b.mutations
1042
+ ]) {
1043
+ let n = mi(t.descriptor.output);
1044
+ E[t.descriptor.name] = (r) => U(async (e, n) => Ge(t, e, n), r, `mutation.${t.descriptor.name}`, n, e.idempotency, dr(t.descriptor, "mutation"));
1045
+ }
1046
+ for (let t of [...T(e.discovered.actions), ...b.actions]) {
1047
+ let n = mi(t.descriptor.output);
1048
+ E[t.descriptor.name] = (r) => U(async (e, n) => $e(t, e, n), r, `action.${t.descriptor.name}`, n, e.idempotency, dr(t.descriptor, "action"));
1049
+ }
1050
+ let ut = () => `public-${Math.random().toString(36).slice(2, 10)}`, dt = [
1051
+ ...e.discovered.queries.filter((e) => e.descriptor.publicApi !== void 0).map((e) => ({
1052
+ descriptor: e.descriptor,
1053
+ invoke: (t, n) => ot(e, t, {
1054
+ subject: n.subject,
1055
+ traceId: ut()
1056
+ }),
1057
+ subscribe: (t, n, r) => st(e, t, {
1058
+ subject: n.subject,
1059
+ traceId: ut()
1060
+ }, r)
1061
+ })),
1062
+ ...e.discovered.mutations.filter((e) => e.descriptor.publicApi !== void 0).map((e) => ({
1063
+ descriptor: e.descriptor,
1064
+ invoke: (t, n) => Ge(e, t, {
1065
+ subject: n.subject,
1066
+ traceId: ut()
1067
+ })
1068
+ })),
1069
+ ...e.discovered.actions.filter((e) => e.descriptor.publicApi !== void 0).map((e) => ({
1070
+ descriptor: e.descriptor,
1071
+ invoke: (t, n) => $e(e, t, {
1072
+ subject: n.subject,
1073
+ traceId: ut()
1074
+ })
1075
+ }))
1076
+ ], ft = {
1077
+ candidates: qe({
1078
+ queries: e.discovered.queries,
1079
+ mutations: e.discovered.mutations,
1080
+ actions: e.discovered.actions,
1081
+ descriptorOf: (e) => e.descriptor,
1082
+ runQuery: (e, t, n) => Promise.resolve(ot(e, t, n)),
1083
+ runMutation: (e, t, n) => Promise.resolve(Ge(e, t, n)),
1084
+ runAction: (e, t, n) => Promise.resolve($e(e, t, n))
1085
+ }),
1086
+ policy: e.agents?.tools ?? {},
1087
+ mcpEnabled: e.agents?.mcp === !0,
1088
+ resolveSubject: (t) => e.resolveSubject(t, -1).then((e) => e.subject)
1089
+ };
1090
+ if (e.grpc !== void 0) {
1091
+ let t = () => `grpc-${Math.random().toString(36).slice(2, 10)}`, n = [
1092
+ ...e.discovered.queries.map((e) => ({
1093
+ tag: e.descriptor.name,
1094
+ kind: "query",
1095
+ input: e.descriptor.input,
1096
+ output: e.descriptor.output,
1097
+ invoke: (n, r, i) => ot(e, n, {
1098
+ subject: r.subject,
1099
+ traceId: t(),
1100
+ signal: i
1101
+ }),
1102
+ subscribe: (n, r, i) => st(e, n, {
1103
+ subject: r.subject,
1104
+ traceId: t()
1105
+ }, i)
1106
+ })),
1107
+ ...e.discovered.mutations.map((e) => ({
1108
+ tag: e.descriptor.name,
1109
+ kind: "mutation",
1110
+ input: e.descriptor.input,
1111
+ output: e.descriptor.output,
1112
+ invoke: (n, r, i) => Ge(e, n, {
1113
+ subject: r.subject,
1114
+ traceId: t(),
1115
+ signal: i
1116
+ })
1117
+ })),
1118
+ ...e.discovered.actions.map((e) => ({
1119
+ tag: e.descriptor.name,
1120
+ kind: "action",
1121
+ input: e.descriptor.input,
1122
+ output: e.descriptor.output,
1123
+ invoke: async (n, r, i) => $e(e, n, {
1124
+ subject: r.subject,
1125
+ traceId: t(),
1126
+ signal: i
1127
+ })
1128
+ }))
1129
+ ];
1130
+ await St({
1131
+ config: e.grpc.config,
1132
+ candidates: n,
1133
+ resolveSubject: async (t) => {
1134
+ let { subject: n } = await e.resolveSubject(t, -1), r = n;
1135
+ return r.type === "anonymous" && r.credentialRejected !== void 0 ? null : {
1136
+ subject: n,
1137
+ anonymous: r.type === "anonymous"
1138
+ };
1139
+ },
1140
+ store: e.store,
1141
+ root: e.grpc.root,
1142
+ log: e.log ?? P({ scope: "voltro:serve" }),
1143
+ onShutdown: (e) => G(e)
1144
+ });
1145
+ }
1146
+ let pt = kt({
1147
+ ...e.restRoutes === void 0 ? {} : { restRoutes: e.restRoutes },
1148
+ publicApiEntries: dt,
1149
+ store: e.store,
1150
+ resolveSubject: (t) => e.resolveSubject(t, -1).then((e) => e.subject),
1151
+ ...e.idempotency === void 0 ? {} : { idempotency: e.idempotency },
1152
+ log: e.log ?? P({ scope: "voltro:serve" })
1153
+ }), mt = e.dataTransferSecret ?? process.env.VOLTRO_DATA_TRANSFER_SECRET, ht = async (e, t) => {
1154
+ let { Readable: n } = await import("node:stream"), r = $i(), i = ta("storage", () => n.from(t()));
1155
+ await J.runPromise(ra(r, e, i, { contentType: "application/octet-stream" }));
1156
+ }, gt = mt && mt.length >= 16 ? [
1157
+ {
1158
+ method: "POST",
1159
+ path: Na,
1160
+ handle: po({
1161
+ secret: mt,
1162
+ store: e.store,
1163
+ ...e.dataTransferSnapshot ? { snapshot: e.dataTransferSnapshot } : {},
1164
+ ...e.dataTransferDialect ? { dialect: e.dataTransferDialect } : {},
1165
+ assetSink: Ta($i()),
1166
+ openArchive: (e) => Uo($i(), e),
1167
+ refreshSubscriptions: (e) => {
1168
+ r.refreshAll(e);
1169
+ },
1170
+ putArchive: ht,
1171
+ ...e.dataTransferDialect ? { dialect: e.dataTransferDialect } : {}
1172
+ })
1173
+ },
1174
+ {
1175
+ method: "POST",
1176
+ path: Pa,
1177
+ handle: ho({
1178
+ secret: mt,
1179
+ store: e.store,
1180
+ ...e.dataTransferSnapshot ? { snapshot: e.dataTransferSnapshot } : {},
1181
+ ...e.dataTransferDialect ? { dialect: e.dataTransferDialect } : {},
1182
+ assetSink: Ta($i()),
1183
+ openArchive: (e) => Uo($i(), e),
1184
+ refreshSubscriptions: (e) => {
1185
+ r.refreshAll(e);
1186
+ },
1187
+ putArchive: ht
1188
+ })
1189
+ },
1190
+ {
1191
+ method: "GET",
1192
+ path: La,
1193
+ handle: Ho({
1194
+ secret: mt,
1195
+ store: e.store
1196
+ })
1197
+ },
1198
+ {
1199
+ method: "GET",
1200
+ path: Ia,
1201
+ handle: Io({ secret: mt })
1202
+ },
1203
+ {
1204
+ method: "POST",
1205
+ path: Fa,
1206
+ handle: No({
1207
+ secret: mt,
1208
+ store: e.store,
1209
+ snapshot: e.dataTransferSnapshot ?? { tables: [] },
1210
+ dialect: e.dataTransferDialect ?? "memory",
1211
+ tenantTables: [...e.tenantScopedTables],
1212
+ loadProfile: $n,
1213
+ assetSource: Ea($i(), e.store),
1214
+ putArchive: ht
1215
+ })
1216
+ }
1217
+ ] : [], _t = [
1218
+ ...e.httpRoutes ?? [],
1219
+ ...pt.httpRoutes,
1220
+ ...gt,
1221
+ ...b.httpRoutes
1222
+ ];
1223
+ Object.assign(E, Ee.handlers);
1224
+ for (let t of T(e.discovered.streams ?? [])) E[t.descriptor.name] = (n) => Kr((r) => zi(r, (r) => {
1225
+ let i = je(r), a = t.executor(n, i);
1226
+ if (J.isEffect(a)) {
1227
+ let t = a.pipe(J.provide(fi(i.store)));
1228
+ return (e.baseLayer ? t.pipe(J.provide(e.baseLayer)) : t).pipe(J.provide(Me)).pipe(J.provide(Ne)).pipe(J.provide(Pe)).pipe(J.provide(Fe));
1229
+ }
1230
+ return typeof a == "object" && a && typeof a.then == "function" ? J.promise(() => a) : a;
1231
+ }), `stream.${t.descriptor.name}`, t.descriptor.guards, n);
1232
+ for (let t of e.discovered.workflows ?? []) E[t.definition.name] = (e) => U(async (e, n) => {
1233
+ let r = n;
1234
+ return Ci(g, {
1235
+ subject: r.subject,
1236
+ traceId: r.traceId,
1237
+ source: "workflow-rpc"
1238
+ }).start(t.definition.name, e);
1239
+ }, e, `workflow.${t.definition.name}`);
1240
+ ce && (E[R.name] = (e) => W(C({
1241
+ descriptor: R,
1242
+ executor: (e) => {
1243
+ let t = e.id;
1244
+ return {
1245
+ table: "_voltro_workflow_runs",
1246
+ order: [{
1247
+ column: "startedAt",
1248
+ direction: "desc"
1249
+ }],
1250
+ predicate: Dr(V("id", t), V("executionId", t)),
1251
+ take: 1,
1252
+ skip: void 0,
1253
+ projection: void 0
1254
+ };
1255
+ }
1256
+ }, e), r, `subscription.${R.name}`), E[vr.name] = (e) => W(C({
1257
+ descriptor: vr,
1258
+ executor: (e) => {
1259
+ let t = e, n = [...t.tag === void 0 ? [] : [V("tag", t.tag)], ...t.status === void 0 ? [] : [V("status", t.status)]], r = Number.isFinite(t.limit) && t.limit !== void 0 ? Math.min(Math.max(Math.floor(t.limit), 1), 500) : 100;
1260
+ return {
1261
+ table: "_voltro_workflow_runs",
1262
+ order: [{
1263
+ column: "startedAt",
1264
+ direction: "desc"
1265
+ }],
1266
+ predicate: n.length === 0 ? void 0 : n.length === 1 ? n[0] : Sr(...n),
1267
+ take: r,
1268
+ skip: void 0,
1269
+ projection: void 0
1270
+ };
1271
+ }
1272
+ }, e), r, `subscription.${vr.name}`), E[_r.name] = (e) => W(C({
1273
+ descriptor: _r,
1274
+ executor: (e) => {
1275
+ let t = e.runId;
1276
+ return {
1277
+ table: "_voltro_workflow_run_steps",
1278
+ order: [{
1279
+ column: "startedAt",
1280
+ direction: "asc"
1281
+ }],
1282
+ predicate: V("runId", t),
1283
+ take: 1e3,
1284
+ skip: void 0,
1285
+ projection: void 0
1286
+ };
1287
+ }
1288
+ }, e), r, `subscription.${_r.name}`), E[gr.name] = (e) => W(C({
1289
+ descriptor: gr,
1290
+ executor: (e) => {
1291
+ let t = e.runId;
1292
+ return {
1293
+ table: "_voltro_workflow_run_events",
1294
+ order: [{
1295
+ column: "occurredAt",
1296
+ direction: "asc"
1297
+ }],
1298
+ predicate: V("runId", t),
1299
+ take: 1e3,
1300
+ skip: void 0,
1301
+ projection: void 0
1302
+ };
1303
+ }
1304
+ }, e), r, `subscription.${gr.name}`), E[pr.name] = (e) => W(C({
1305
+ descriptor: pr,
1306
+ executor: (e) => {
1307
+ let t = e;
1308
+ return {
1309
+ table: "_voltro_workflow_events",
1310
+ order: [{
1311
+ column: "occurredAt",
1312
+ direction: "desc"
1313
+ }],
1314
+ predicate: t.name === void 0 ? void 0 : V("name", t.name),
1315
+ take: Math.max(1, Math.min(500, t.limit ?? 100)),
1316
+ skip: void 0,
1317
+ projection: void 0
1318
+ };
1319
+ }
1320
+ }, e), r, `subscription.${pr.name}`), E[mr.name] = (e) => W(C({
1321
+ descriptor: mr,
1322
+ executor: (e) => {
1323
+ let t = e.eventId;
1324
+ return {
1325
+ table: "_voltro_workflow_event_deliveries",
1326
+ order: [{
1327
+ column: "createdAt",
1328
+ direction: "asc"
1329
+ }],
1330
+ predicate: V("eventId", t),
1331
+ take: 500,
1332
+ skip: void 0,
1333
+ projection: void 0
1334
+ };
1335
+ }
1336
+ }, e), r, `subscription.${mr.name}`), E[fr.name] = (t) => U(async (t, n) => {
1337
+ let r = t;
1338
+ return await tn(e.store, n.subject, { executionId: r.executionId }), await g.cancel(r.workflowName, r.executionId), await Ot(r.workflowName, r.executionId, "workflow.cancel"), { ok: !0 };
1339
+ }, t, `action.${fr.name}`), E[hr.name] = (t) => U(async (t, n) => {
1340
+ let r = t;
1341
+ return await tn(e.store, n.subject, { executionId: r.executionId }), await g.resume(r.workflowName, r.executionId), { ok: !0 };
1342
+ }, t, `action.${hr.name}`), E[z.name] = (t) => U(async (t, n) => {
1343
+ let r = t;
1344
+ return await tn(e.store, n.subject, { id: r.id }), g.signal({ id: r.id }, r.signalName, r.payload);
1345
+ }, t, `action.${z.name}`), E[yr.name] = (t) => U(async (t, n) => {
1346
+ let r = t;
1347
+ return await tn(e.store, n.subject, { id: r.id }), g.update({ id: r.id }, r.updateName, r.payload, r.timeoutMs === void 0 ? void 0 : { timeoutMs: r.timeoutMs });
1348
+ }, t, `action.${yr.name}`));
1349
+ let vt = [
1350
+ ...T(e.discovered.queries).map((e) => L(e.descriptor)),
1351
+ ...T(e.discovered.mutations).map((e) => lr(e.descriptor)),
1352
+ ...T(e.discovered.actions).map((e) => I(e.descriptor)),
1353
+ ...Ye.queries.map((e) => L(e.descriptor)),
1354
+ ...Ye.mutations.map((e) => lr(e.descriptor)),
1355
+ ...Qe.queries.map((e) => L(e.descriptor)),
1356
+ ...Qe.mutations.map((e) => lr(e.descriptor)),
1357
+ ...b.queries.map((e) => L(e.descriptor)),
1358
+ ...b.mutations.map((e) => lr(e.descriptor)),
1359
+ ...b.actions.map((e) => I(e.descriptor)),
1360
+ ...T(e.discovered.streams ?? []).map((e) => ur(e.descriptor)),
1361
+ ...Ee.rpcs,
1362
+ ...(e.discovered.workflows ?? []).map((e) => Bi(e.definition)),
1363
+ ...ce ? [
1364
+ L(R),
1365
+ L(vr),
1366
+ L(_r),
1367
+ L(gr),
1368
+ L(pr),
1369
+ L(mr),
1370
+ I(fr),
1371
+ I(hr),
1372
+ I(z),
1373
+ I(yr)
1374
+ ] : []
1375
+ ], yt = Qi.make(...vt).middleware(or).middleware(F), bt = li({ resolveSubject: ({ headers: t, clientId: n }) => e.resolveSubject(t, n) }), xt = e.dormancyTenantId ?? Ir, Ct = e.dormancy === "sleep" ? {
1376
+ register: (t, n, r) => Oi(e.store, {
1377
+ tenantId: r ?? xt,
1378
+ kind: "workflow",
1379
+ refId: t,
1380
+ wakeAt: n
1381
+ }),
1382
+ cancel: (t, n) => Jr(e.store, {
1383
+ tenantId: n ?? xt,
1384
+ kind: "workflow",
1385
+ refId: t
1386
+ }).then(() => {})
1387
+ } : void 0, O = ue ? await import("@voltro/workflow") : void 0, k = O?.makeWorkflowRunRecorder({
1388
+ store: e.store,
1389
+ ...e.workflowRecording === void 0 ? {} : { recording: e.workflowRecording },
1390
+ ...Ct === void 0 ? {} : { wakeups: Ct }
1391
+ }), Tt = async (t, n) => {
1392
+ await O.closeWorkflowChildrenForParent({
1393
+ store: e.store,
1394
+ parentExecutionId: t,
1395
+ parentStatus: n,
1396
+ recorder: k,
1397
+ log: { warn: (e, t) => re.warn(e, t ?? {}) },
1398
+ interruptChild: async (t, n) => {
1399
+ let r = (e.discovered.workflows ?? []).find((e) => e.definition.name === t);
1400
+ if (!r) throw Error(`Unknown child workflow: ${t}`);
1401
+ if (!d) throw Error("Workflow runtime is not ready");
1402
+ await d.runPromise(r.definition.interrupt(n));
1403
+ }
1404
+ });
1405
+ }, Ot = async (t, n, r) => {
1406
+ let i = (await e.store.query({
1407
+ table: "_voltro_workflow_runs",
1408
+ order: [],
1409
+ predicate: V("executionId", n),
1410
+ projection: void 0,
1411
+ skip: void 0,
1412
+ take: 1
1413
+ }))[0];
1414
+ if (i === void 0) return;
1415
+ let a = await e.store.update("_voltro_workflow_runs", i.id, {
1416
+ status: "cancelled",
1417
+ cancelled: !0,
1418
+ completedAt: /* @__PURE__ */ new Date()
1419
+ }), o = i.subject?.tenantId ?? void 0;
1420
+ a && await k.recordEvent({
1421
+ runId: i.id,
1422
+ eventType: "run-cancelled",
1423
+ payload: {
1424
+ reason: r,
1425
+ workflowName: t,
1426
+ executionId: n,
1427
+ ...o == null ? {} : { tenantId: o }
1428
+ }
1429
+ }), a && await Tt(n, "cancelled");
1430
+ }, At = [
1431
+ ...wi(e.discovered.workflows ?? [], {
1432
+ buildContext: (t, n) => e.buildContextForWorkflow?.(t, n) ?? je({
1433
+ subject: t.subject,
1434
+ traceId: t.traceId,
1435
+ rowFilter: t.rowFilter
1436
+ }, e.store, void 0, `workflow:${n.workflowName}`, { parentExecutionId: n.executionId }),
1437
+ resolveStartContext: oe,
1438
+ ...se === void 0 ? {} : { resolveAuthority: se }
1439
+ }, (t, n, r) => {
1440
+ let i = O.getWorkflowVersionMetadata(t.definition);
1441
+ return O.wrapWorkflowExecuteWithRunRecording({
1442
+ name: t.definition.name,
1443
+ store: e.store,
1444
+ subject: r.subject,
1445
+ source: r.source ?? null,
1446
+ traceId: r.traceId,
1447
+ workflowVersion: i.version,
1448
+ workflowCompatibleVersions: i.compatibleWith,
1449
+ workflowPatches: i.patches,
1450
+ parentExecutionId: r?.parentExecutionId ?? null,
1451
+ parentClosePolicy: r?.parentClosePolicy ?? null,
1452
+ onParentClose: ({ executionId: e, status: t }) => Tt(e, t),
1453
+ ...Jt(t.definition),
1454
+ onTerminal: async ({ executionId: e }) => {
1455
+ await u?.gate.release(e);
1456
+ },
1457
+ recorder: k,
1458
+ pluginWorkflowStepLayer: He,
1459
+ recordRun: Ei
1460
+ }, n);
1461
+ }),
1462
+ ...e.discovered.workflowWorkers ?? [],
1463
+ ...me === void 0 ? [] : [me]
1464
+ ], Ft = [...(e.discovered.workflows ?? []).map((e) => e.definition.name).filter(Boolean), ...me === void 0 ? [] : ["voltro.deliverWebhook"]], It = At.length > 0 ? Y.mergeAll(...At) : Y.empty;
1465
+ if (((e.discovered.workflows?.length ?? 0) > 0 || (e.discovered.workflowWorkers?.length ?? 0) > 0 || e.scheduleCoordination === "cluster" || me !== void 0) && e.workflowEngineLayer !== void 0) {
1466
+ let t = It.pipe(Y.provideMerge(e.workflowEngineLayer));
1467
+ d = Wi.make((e.baseLayer === void 0 ? t : t.pipe(Y.provideMerge(e.baseLayer))).pipe(Y.provideMerge(ar({})))), await d.runPromise(J.void), (e.log ?? P({ scope: "voltro:serve" })).child("workflow").info(`workflow runtime ready — ${Ft.length} entity type(s) registered`, { entities: Ft });
1468
+ let n = await import("@voltro/workflow/cluster"), r = (e) => d.runPromise(n.redriveFailedRun(e)), i = (e) => d.runPromise(n.resumeRunFromStep(e));
1469
+ ne = await Ae({
1470
+ provider: la(e.plugins ?? [])?.broadcast?.provider,
1471
+ crossReplica: la(e.plugins ?? [])?.broadcast?.crossReplica ?? !1,
1472
+ namespace: xe,
1473
+ replicaId: crypto.randomUUID(),
1474
+ pollStorage: () => d.runPromise(n.pollWorkflowStorage),
1475
+ onChange: (t) => e.store.onChange((e) => t({
1476
+ table: e.table,
1477
+ op: e.op,
1478
+ ...e.origin === void 0 ? {} : { origin: e.origin }
1479
+ })),
1480
+ log: (e.log ?? P({ scope: "voltro:serve" })).child("workflow")
1481
+ }), ee = async (t) => {
1482
+ let n = await Ze({
1483
+ store: e.store,
1484
+ workflows: e.discovered.workflows ?? [],
1485
+ runRedrive: r
1486
+ }, t.runId);
1487
+ return n.statusReset && await k.recordEvent({
1488
+ runId: t.runId,
1489
+ eventType: "run-redriven",
1490
+ payload: {
1491
+ reason: "inspect.redrive",
1492
+ activitiesReset: n.outcome.activitiesReset
1493
+ }
1494
+ }), {
1495
+ redriven: n.outcome.redriven,
1496
+ activitiesReset: n.outcome.activitiesReset,
1497
+ reason: n.outcome.reason
1498
+ };
1499
+ }, te = async (t) => {
1500
+ let n = await S({
1501
+ store: e.store,
1502
+ workflows: e.discovered.workflows ?? [],
1503
+ runResume: i
1504
+ }, t.runId, t.step);
1505
+ return n.statusReset && await k.recordEvent({
1506
+ runId: t.runId,
1507
+ eventType: "run-redriven",
1508
+ payload: {
1509
+ reason: "inspect.resume-from-step",
1510
+ step: n.stepName,
1511
+ activitiesReset: n.outcome.activitiesReset
1512
+ }
1513
+ }), {
1514
+ redriven: n.outcome.redriven,
1515
+ stepName: n.stepName,
1516
+ activitiesReset: n.outcome.activitiesReset,
1517
+ reason: n.outcome.reason
1518
+ };
1519
+ };
1520
+ let a = (e.scheduleCoordination ?? "single") === "advisoryLock" ? ii(e.store, e.scheduleReplicaId ?? `pid-${process.pid}`) : Pi, f = di({
1521
+ coordinator: a,
1522
+ replicaId: e.scheduleReplicaId ?? `pid-${process.pid}`
1523
+ }), p = P({ scope: "voltro:flow-control" }), m = {
1524
+ info: (e, t) => {
1525
+ p.info(e, t);
1526
+ },
1527
+ warn: (e, t) => {
1528
+ p.warn(e, t);
1529
+ },
1530
+ error: (e, t) => {
1531
+ p.error(e, t ?? {});
1532
+ }
1533
+ }, re, ie = () => {
1534
+ if (re !== void 0) return re;
1535
+ if (o !== void 0 && k !== void 0) return re = Ve({
1536
+ store: e.store,
1537
+ log: M,
1538
+ workflows: e.discovered.workflows ?? [],
1539
+ workflowsProxy: o,
1540
+ workflowRuntime: d,
1541
+ workflowRunRecorder: k,
1542
+ closeChildrenForParent: Tt
1543
+ }), re;
1544
+ };
1545
+ s = ie, u = Zt({
1546
+ store: e.store,
1547
+ onChange: (t) => e.store.onChange((e) => t({
1548
+ table: e.table,
1549
+ op: e.op
1550
+ })),
1551
+ ...e.scheduling === void 0 ? {} : {
1552
+ disarmWhenIdle: e.scheduling.disarmWhenIdle,
1553
+ drainIntervalMs: e.scheduling.admissionDrainMs,
1554
+ cancelSweepIntervalMs: e.scheduling.cancelSweepMs,
1555
+ stalenessSweepIntervalMs: e.scheduling.stalenessSweepMs
1556
+ },
1557
+ workflows: e.discovered.workflows ?? [],
1558
+ facade: () => o,
1559
+ cancelRunWithReason: ie,
1560
+ recordRunEvent: () => k?.recordEvent,
1561
+ ...e.workflowStaleness === void 0 ? {} : { staleness: e.workflowStaleness },
1562
+ ...e.workflowSuspendSignalHintMs === void 0 ? {} : { suspendSignalHintMs: e.workflowSuspendSignalHintMs },
1563
+ scheduleCoordinated: f,
1564
+ onAbandoned: async (t) => {
1565
+ await et({
1566
+ workflows: e.discovered.workflows ?? [],
1567
+ facade: () => o,
1568
+ log: m,
1569
+ ...t
1570
+ });
1571
+ },
1572
+ log: m
1573
+ });
1574
+ let h = u;
1575
+ h !== void 0 && G(() => h.stop()), c = at({
1576
+ store: e.store,
1577
+ onChange: (t) => e.store.onChange((e) => t({
1578
+ table: e.table,
1579
+ op: e.op
1580
+ })),
1581
+ ...e.scheduling === void 0 ? {} : {
1582
+ disarmWhenIdle: e.scheduling.disarmWhenIdle,
1583
+ tickIntervalMs: e.scheduling.inferenceTickMs
1584
+ },
1585
+ enabled: (e.discovered.workflows?.length ?? 0) > 0,
1586
+ resumeSignal: () => d === void 0 || O === void 0 ? void 0 : async ({ executionId: t, workflowName: n, signalName: r, payload: i }) => {
1587
+ await d.runPromise(O.completeSuspendingSignal({
1588
+ store: e.store,
1589
+ target: nn(t, n),
1590
+ signalName: r,
1591
+ payload: i
1592
+ }));
1593
+ },
1594
+ runEffect: (e) => d.runPromise(e),
1595
+ scheduleCoordinated: f,
1596
+ log: m
1597
+ });
1598
+ let oe = c;
1599
+ oe !== void 0 && G(() => oe.stop()), o = (e.discovered.workflows?.length ?? 0) > 0 ? Si({
1600
+ workflows: e.discovered.workflows ?? [],
1601
+ runEffect: (e) => d.runPromise(e),
1602
+ onEnqueue: () => ne?.publishWake(),
1603
+ ...h === void 0 ? {} : {
1604
+ admitStart: h.gate.admitStart,
1605
+ startPayloadSchema: h.gate.startPayloadSchema,
1606
+ parkDelayedStart: h.gate.parkDelayed
1607
+ },
1608
+ rememberStartContext: ae,
1609
+ signal: async (t, n, r) => {
1610
+ let i = await O.sendWorkflowSignal({
1611
+ store: e.store,
1612
+ recorder: k,
1613
+ target: t,
1614
+ signalName: n,
1615
+ payload: r
1616
+ });
1617
+ return await d.runPromise(O.completeSuspendingSignal({
1618
+ store: e.store,
1619
+ target: t,
1620
+ signalName: n,
1621
+ payload: r
1622
+ })).catch(() => {}), i;
1623
+ },
1624
+ update: (t, n, r, i) => O.sendWorkflowUpdate({
1625
+ store: e.store,
1626
+ recorder: k,
1627
+ target: t,
1628
+ updateName: n,
1629
+ payload: r,
1630
+ ...i === void 0 ? {} : { options: i }
1631
+ }),
1632
+ listRuns: (t) => Je(e.store, t),
1633
+ retry: (t, n) => l({
1634
+ store: e.store,
1635
+ workflows: e.discovered.workflows ?? [],
1636
+ runPromise: (e) => d.runPromise(e)
1637
+ }, t, n),
1638
+ redrive: (t) => Ze({
1639
+ store: e.store,
1640
+ workflows: e.discovered.workflows ?? [],
1641
+ runRedrive: r
1642
+ }, t).then((e) => e.outcome)
1643
+ }) : void 0;
1644
+ }
1645
+ let Lt = Y.mergeAll(yt.toLayer(E), bt), zt = D(E, e.discovered.queries.map((e) => e.descriptor.name), ce), A = Y.mergeAll(yt.toLayer(zt), bt), j = e.observability, Ut = await qr({
1646
+ ...e.traceSink === void 0 ? {} : { traceSink: e.traceSink },
1647
+ ...e.appName === void 0 ? {} : { serviceName: e.appName },
1648
+ ...j && j.spanProcessors.length > 0 ? { extraSpanProcessors: j.spanProcessors } : {},
1649
+ ...j && j.metricReaders.length > 0 ? { extraMetricReaders: j.metricReaders } : {},
1650
+ ...j && Object.keys(j.resourceAttributes).length > 0 ? { resourceAttributes: j.resourceAttributes } : {},
1651
+ ...j && j.sampler !== void 0 ? { sampler: j.sampler } : {}
1652
+ }), Gt = !1, Kt = e.store.ping ? () => e.store.ping().then(() => !0).catch(() => !1) : void 0, { server: qt, shutdown: Yt } = Fi({
1653
+ group: yt,
1654
+ handlersLayer: Lt,
1655
+ httpHandlersLayer: A,
1656
+ port: e.port ?? 4e3,
1657
+ ...e.host === void 0 ? {} : { host: e.host },
1658
+ path: e.path ?? "/ws",
1659
+ tracerLayer: Ut.layer,
1660
+ security: Ue(e),
1661
+ ...Un(e),
1662
+ ...e.discovered.wsGateways !== void 0 && e.discovered.wsGateways.length > 0 ? { webSocketGateways: e.discovered.wsGateways } : {},
1663
+ resolveGatewaySubject: async (t) => {
1664
+ let n = await e.resolveSubject(t, -1);
1665
+ return n.subject.type === "anonymous" ? null : {
1666
+ subject: n.subject,
1667
+ ...n.credentialExpiresAt === void 0 ? {} : { credentialExpiresAt: n.credentialExpiresAt * 1e3 }
1668
+ };
1669
+ },
1670
+ ...Be,
1671
+ healthCheck: (() => {
1672
+ let t = e.health;
1673
+ if (t?.readiness !== void 0) {
1674
+ let e = t.readiness;
1675
+ return {
1676
+ isReady: () => Gt,
1677
+ ping: async () => {
1678
+ try {
1679
+ return await e();
1680
+ } catch {
1681
+ return !1;
1682
+ }
1683
+ }
1684
+ };
1685
+ }
1686
+ return {
1687
+ isReady: () => Gt,
1688
+ ...Kt ? { ping: Kt } : {}
1689
+ };
1690
+ })(),
1691
+ ..._t.length > 0 ? { httpRoutes: _t } : {},
1692
+ ...e.getStore === void 0 ? {} : { getStore: e.getStore },
1693
+ ...ge.size > 0 ? { webhookRoutes: ge } : {},
1694
+ ...e.inspectRoute === void 0 ? {} : { inspectRoute: e.inspectRoute },
1695
+ ...e.inspectStream === void 0 ? {} : { inspectStream: e.inspectStream }
1696
+ }), Xt = Ma(qt);
1697
+ if (await Gr(qt), (e.discovered.schedules?.length ?? 0) > 0) {
1698
+ let t = (e.scheduleCoordination ?? "single") === "advisoryLock" ? ii(e.store, e.scheduleReplicaId ?? `pid-${process.pid}`) : Pi;
1699
+ m = await q(e.discovered.schedules ?? [], {
1700
+ store: e.store,
1701
+ coordinator: t,
1702
+ defaultTrigger: e.scheduleDefaultTrigger ?? "self",
1703
+ replicaId: e.scheduleReplicaId ?? `pid-${process.pid}`,
1704
+ armSelf: e.scheduleArmSelf ?? !0,
1705
+ dormancy: e.dormancy ?? "always-on",
1706
+ ...e.scheduling === void 0 ? {} : { runHeartbeatMs: e.scheduling.scheduleHeartbeatMs },
1707
+ ...e.dormancyTenantId === void 0 ? {} : { dormancyTenantId: e.dormancyTenantId },
1708
+ buildContext: ({ traceId: t, scheduleName: n, subject: r }) => je({
1709
+ subject: r,
1710
+ traceId: t
1711
+ }, e.store, void 0, `schedule:${n}`),
1712
+ log: {
1713
+ info: (e, t) => {
1714
+ ie.info(e, t);
1715
+ },
1716
+ warn: (e, t) => {
1717
+ ie.warn(e, t);
1718
+ },
1719
+ error: (e, t) => {
1720
+ ie.error(e, t ?? {});
1721
+ },
1722
+ debug: () => {}
1723
+ },
1724
+ ...e.scheduleFireInterceptor === void 0 ? {} : { interceptFire: e.scheduleFireInterceptor },
1725
+ ...e.onScheduleRunEvent === void 0 ? {} : { onRunEvent: e.onScheduleRunEvent }
1726
+ }), e.onSchedulerReady?.(m);
1727
+ }
1728
+ let M = e.log ?? P({ scope: "voltro:serve" }), rn, an, sn = e.claimChange;
1729
+ if ((e.discovered.subscribers?.length ?? 0) > 0 && (rn = Bt(e.discovered.subscribers ?? [], e.store, M.child("subscribe"), e.schemaRegistry, {
1730
+ eventBus: Ee.bus,
1731
+ ...sn === void 0 ? {} : { claimOnce: sn }
1732
+ })), (e.discovered.reactions?.length ?? 0) > 0) {
1733
+ let t = M.child("reaction");
1734
+ an = on(e.discovered.reactions ?? [], e.store, {
1735
+ runAct: async (n, r) => {
1736
+ if (n.kind === "workflow") {
1737
+ if (g === void 0) {
1738
+ t.warn("reaction workflow act skipped — no workflow engine in this app", { workflow: n.workflow });
1739
+ return;
1740
+ }
1741
+ let e = n.payload === void 0 ? r.new ?? r.old ?? {} : n.payload(r);
1742
+ await Ci(g, {
1743
+ traceId: `reaction:${n.workflow}`,
1744
+ source: `reaction:${n.workflow}`
1745
+ }).start(n.workflow, e);
1746
+ return;
1747
+ }
1748
+ await p(n.agent, r, {
1749
+ findAgentSend: (t) => e.discovered.actions.find((e) => e.descriptor.name === `${t}.send`),
1750
+ runAction: (e, t, n) => Promise.resolve($e(e, t, n)),
1751
+ makeSubject: (e) => sr(e),
1752
+ now: () => Date.now(),
1753
+ log: t
1754
+ });
1755
+ },
1756
+ checkBudget: async (n, r) => {
1757
+ try {
1758
+ let { requireAiBudget: t } = await import("@voltro/ai");
1759
+ return (await J.runPromise(J.either(t(e.store, {
1760
+ tenantId: n,
1761
+ limitUsd: r
1762
+ }))))._tag === "Right";
1763
+ } catch (e) {
1764
+ return t.warn("reaction budget check failed — refusing the act", { tenantId: n }, e), !1;
1765
+ }
1766
+ },
1767
+ ...sn === void 0 ? {} : { claimRateSlot: (e) => sn(Wt, e) },
1768
+ ...sn === void 0 ? {} : { claimDedupe: (e) => sn(Et, e) }
1769
+ }, t);
1770
+ }
1771
+ let cn;
1772
+ (e.discovered.aggregates?.length ?? 0) > 0 && (cn = await x({
1773
+ discovered: e.discovered.aggregates ?? [],
1774
+ store: e.store,
1775
+ log: M.child("aggregate"),
1776
+ ...e.analytics === void 0 ? {} : { analytics: e.analytics },
1777
+ ...e.aggregateStorage === void 0 ? {} : { storage: e.aggregateStorage },
1778
+ ...e.aggregateCoordinator === void 0 ? {} : { coordinator: e.aggregateCoordinator }
1779
+ }), Me = Y.succeed(Fr, cn.registry));
1780
+ let ln;
1781
+ (e.discovered.expectations?.length ?? 0) > 0 && (ln = Hr({
1782
+ discovered: e.discovered.expectations ?? [],
1783
+ store: e.store,
1784
+ log: M.child("expectation")
1785
+ }), Ne = Y.succeed(Rr, ln.registry)), (e.discovered.budgets?.length ?? 0) > 0 && (n = Wr({
1786
+ discovered: e.discovered.budgets ?? [],
1787
+ log: M.child("finops")
1788
+ }), Pe = Y.succeed(H, n.registry));
1789
+ let un;
1790
+ return (e.discovered.experiments?.length ?? 0) > 0 && (un = Ur({
1791
+ discovered: e.discovered.experiments ?? [],
1792
+ store: e.store,
1793
+ log: M.child("experiment")
1794
+ }), Fe = Y.succeed(zr, un.registry)), Gt = !0, e.bootTiming?.mark("ready"), {
1795
+ dispatcher: r,
1796
+ server: qt,
1797
+ scheduler: m,
1798
+ eventsSnapshot: he(Ee.bus, Ee.declared),
1799
+ membersSnapshot: () => ({
1800
+ members: Te.membership.list(),
1801
+ capturedAt: Date.now()
1802
+ }),
1803
+ agentTools: () => ft,
1804
+ rpcMetrics: () => Re,
1805
+ webhooksService: () => pe,
1806
+ runCanceller: () => s(),
1807
+ flowControlHealth: () => u?.cancelHealth(),
1808
+ inferenceHealth: () => c?.health(),
1809
+ workflowWriteActions: () => g === void 0 || k === void 0 ? void 0 : Ke({
1810
+ store: e.store,
1811
+ log: M,
1812
+ workflows: e.discovered.workflows ?? [],
1813
+ workflowsProxy: o,
1814
+ workflowRuntime: d,
1815
+ workflowRunRecorder: k,
1816
+ closeChildrenForParent: Tt
1817
+ }),
1818
+ redriveWorkflowRun: (e) => ee ? ee(e) : Promise.reject(/* @__PURE__ */ Error("redrive: this app registers no workflows")),
1819
+ resumeWorkflowRunFromStep: (e) => te ? te(e) : Promise.reject(/* @__PURE__ */ Error("resume-from-step: this app registers no workflows")),
1820
+ close: async () => {
1821
+ Gt = !1, await Xt.drainRequests();
1822
+ for (let e of _e) try {
1823
+ await e();
1824
+ } catch (e) {
1825
+ M.warn("serve: teardown step failed", {}, e);
1826
+ }
1827
+ await De?.detach(), await Te.detach(), cn?.detach(), ln?.detach(), n?.detach(), un?.detach(), an?.(), rn?.(), await m?.shutdown(), r.close(), await ne?.detach(), await d?.dispose(), await Yt(), await Xt.finish();
1828
+ }
1829
+ };
1830
+ }, Ko = (e) => {
1831
+ if (e == null || e === "") return;
1832
+ let t = Number(e);
1833
+ return Number.isFinite(t) && t > 0 ? t : void 0;
1834
+ }, qo = (e, t) => {
1835
+ let n = e === void 0 || e === !1 ? {
1836
+ on: !1,
1837
+ size: 500
1838
+ } : {
1839
+ on: !0,
1840
+ size: Ko(e === !0 ? void 0 : e.size) ?? 500
1841
+ };
1842
+ if (t === void 0 || t.trim() === "") return n;
1843
+ let r = t.trim().toLowerCase();
1844
+ if (r === "off" || r === "false" || r === "0") return {
1845
+ on: !1,
1846
+ size: n.size
1847
+ };
1848
+ if (r === "on" || r === "true") return {
1849
+ on: !0,
1850
+ size: n.size
1851
+ };
1852
+ let i = Ko(r);
1853
+ return i === void 0 ? n : {
1854
+ on: !0,
1855
+ size: i
1856
+ };
1857
+ }, Jo = (e, t = process.env) => ({
1858
+ logs: qo(e?.logs, t.VOLTRO_INSPECT_LOGS),
1859
+ traces: qo(e?.traces, t.VOLTRO_INSPECT_TRACES)
1860
+ }), $ = P({ scope: "voltro:serve" }), Yo = (e, t, n) => (e === "production" || e === "staging") && t !== "memory" && n !== "0", Xo = _n, Zo = async (e) => {
1861
+ let t = bn(process.cwd());
1862
+ if (rr(t)) {
1863
+ let n;
1864
+ try {
1865
+ let e = await import(ir(t).href);
1866
+ typeof e.runServe == "function" ? n = e.runServe : $.warn("serve bundle has no runServe export — using the standard serve path");
1867
+ } catch (e) {
1868
+ $.warn("serve bundle failed to load — using the standard serve path", {}, e);
1869
+ }
1870
+ if (n) return $.info("serve: booting from the precompiled serve bundle"), n(e);
1871
+ }
1872
+ return Qo(e);
1873
+ }, Qo = async (l) => {
1874
+ Pr("serve");
1875
+ let f = Xn();
1876
+ e("serve");
1877
+ try {
1878
+ Hi();
1879
+ } catch (e) {
1880
+ throw i(e instanceof Error ? e.message : String(e));
1881
+ }
1882
+ let p = process.cwd(), _ = await Tt(p), le = vn({
1883
+ kind: "api",
1884
+ configPort: _?.port,
1885
+ env: process.env,
1886
+ flagPort: Xo(l, "--port")
1887
+ });
1888
+ for (let e of le.warnings) $.warn(e);
1889
+ let he = le.port;
1890
+ ji(ki(_?.secrets)), await sn({
1891
+ rawEnv: _?.env,
1892
+ appType: "api",
1893
+ root: p,
1894
+ log: $,
1895
+ generateTypes: !1,
1896
+ plugins: _?.plugins ?? []
1897
+ }), f.mark("config");
1898
+ let y = (process.env.DB_DIALECT ?? _?.store ?? "memory").toLowerCase(), Oe = (y === "mariadb" || y === "postgres" || y === "mssql") && (process.env.CDC ?? "1") !== "0", ke = y === "mariadb" ? "mariadb" : y === "mssql" ? "mssql" : void 0, Ae = yn(p);
1899
+ if (!r() && rr(Ae)) try {
1900
+ let e = await import(ir(Ae).href);
1901
+ if (e.modules) {
1902
+ let t = {};
1903
+ for (let [n, r] of Object.entries(e.modules)) t[tr(p, n)] = r;
1904
+ n(t), $.info("precompiled api bundle loaded", { modules: Object.keys(t).length });
1905
+ }
1906
+ } catch (e) {
1907
+ $.warn("precompiled api bundle failed to load — falling back to source", {}, e);
1908
+ }
1909
+ let x = await Ot(p), S = await st(x, {
1910
+ root: p,
1911
+ cdc: Oe && ke !== void 0
1912
+ }), Ve = Lt(S);
1913
+ {
1914
+ ut({
1915
+ plugins: _?.plugins ?? [],
1916
+ queries: S.queries,
1917
+ mutations: S.mutations,
1918
+ actions: S.actions,
1919
+ streams: S.streams,
1920
+ log: $
1921
+ });
1922
+ let e = u(S.serverOnlyLeaks, je(process.env, "strict"), Zr, "`voltro serve`");
1923
+ if (e.action === "fail") throw i(e.message ?? "");
1924
+ e.action === "warn" && $.warn(e.message ?? "");
1925
+ }
1926
+ let Ke = x.filter((e) => Yn.test(e)), qe = Ke.length > 0 ? await Jn(Ke, $.child("webhooks")) : {
1927
+ outgoing: [],
1928
+ incoming: [],
1929
+ providers: []
1930
+ }, Je = Kn(S.events), Xe = qe.outgoing.length + qe.incoming.length + qe.providers.length + Je.length === 0 ? void 0 : {
1931
+ ...qe,
1932
+ outgoing: [...qe.outgoing, ...Je]
1933
+ }, Ze = Mn({
1934
+ nodeEnv: process.env.NODE_ENV,
1935
+ cdcDialect: ke,
1936
+ declared: _?.schema
1937
+ }), et = Nn({
1938
+ gates: Ze,
1939
+ runtime: {
1940
+ traces: ye(),
1941
+ undo: Li()
1942
+ }
1943
+ });
1944
+ if (et !== void 0) throw i(`serve: ${et}`);
1945
+ let rt = jn({
1946
+ mix: S.featureMix,
1947
+ plugins: _?.plugins ?? [],
1948
+ gates: Ze,
1949
+ ...ke ? { cdcDialect: ke } : {}
1950
+ }), it = _?.analytics !== void 0 && _.analytics.kind !== "noop" && y !== "memory" ? (await xn(y)).makeSqlLayer(A()) : void 0, at = await dt({
1951
+ spec: _?.analytics,
1952
+ sqlLayer: it,
1953
+ log: $
1954
+ }), w = (() => {
1955
+ let e = new Set(S.tables.map((e) => e.tableName)), t = [...S.tables];
1956
+ for (let n of [...rt, ...at.tables]) e.has(n.tableName) || (e.add(n.tableName), t.push(n));
1957
+ return t;
1958
+ })();
1959
+ for (let e of w) Er(e);
1960
+ {
1961
+ let e = Qr(Ri(ce(S), v(w)));
1962
+ e !== void 0 && $.warn(e);
1963
+ }
1964
+ let ct = (process.env.NODE_ENV ?? "").toLowerCase();
1965
+ if (Yo(ct, y, process.env.VOLTRO_AUTO_MIGRATE)) {
1966
+ let e = (await xn(y)).makeSqlLayer(A()), t = await J.runPromise(Gi.SqlClient.pipe(J.flatMap((e) => Ji(e, p)), J.provide(e), J.catchAll(() => J.succeed([]))));
1967
+ 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));
1968
+ let n = await J.runPromise(Gi.SqlClient.pipe(J.flatMap((e) => Yi(e, w, {
1969
+ appliedBy: `serve:${ct}`,
1970
+ environment: "prod",
1971
+ dialectId: y
1972
+ })), J.provide(e)));
1973
+ n.kind === "prod-mismatch" && ($.error(qi(n, y)), $.error(Pn({
1974
+ gates: Ze,
1975
+ nodeEnv: process.env.NODE_ENV,
1976
+ cdcDialect: ke,
1977
+ declared: _?.schema
1978
+ })), $.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(qi(n, y));
1979
+ }
1980
+ await En({
1981
+ dialectId: y,
1982
+ tables: w,
1983
+ mode: wn(_?.reactiveTriggers),
1984
+ lockSchema: A().schema,
1985
+ makeLayer: async () => (await xn(y)).makeSqlLayer(A()),
1986
+ log: {
1987
+ info: (e, t) => $.info(e, t ?? {}),
1988
+ warn: (e, t) => $.warn(e, t ?? {})
1989
+ }
1990
+ });
1991
+ let lt = xi(w);
1992
+ f.mark("discover");
1993
+ let D = await tt(_, void 0);
1994
+ {
1995
+ let e = await c(D);
1996
+ if (e !== void 0) throw i(`serve: ${e}`);
1997
+ let t = await s(D, y, _);
1998
+ t !== void 0 && $.warn(t);
1999
+ }
2000
+ let St = Vi(D, y);
2001
+ for (let e of k({
2002
+ dialect: String(_?.store ?? process.env.DB_DIALECT ?? "postgres"),
2003
+ changeStrategy: (process.env.CDC ?? "1") === "0" ? "inline" : "cdc",
2004
+ dbUrl: process.env.DB_URL,
2005
+ crossReplicaBus: la(_?.plugins ?? [])?.broadcast.crossReplica === !0,
2006
+ tables: S.tables.map((e) => ({
2007
+ tableName: e.tableName,
2008
+ isReactive: e.isReactive === !0
2009
+ })),
2010
+ querySources: S.queries.flatMap((e) => {
2011
+ let t = e.descriptor.source;
2012
+ return t === void 0 ? [] : typeof t == "string" ? [t] : [...t];
2013
+ })
2014
+ })) e.level === "warn" ? $.warn(e.message) : $.info(e.message);
2015
+ {
2016
+ let e = h({
2017
+ tables: xr().map((e) => ({ tableName: e.tableName })),
2018
+ queries: S.queries.map((e) => ({
2019
+ name: e.descriptor.name,
2020
+ source: e.descriptor.source
2021
+ }))
2022
+ }), t = De(e);
2023
+ t !== void 0 && $.warn(t);
2024
+ }
2025
+ _?.cache && !process.env.CACHE_BACKEND && (process.env.CACHE_BACKEND = _.cache), _?.cacheRedisUrl && !process.env.CACHE_REDIS_URL && (process.env.CACHE_REDIS_URL = _.cacheRedisUrl), _?.cacheRedisDriver && !process.env.CACHE_REDIS_DRIVER && (process.env.CACHE_REDIS_DRIVER = _.cacheRedisDriver), _?.cacheKeyPrefix && !process.env.CACHE_KEY_PREFIX && (process.env.CACHE_KEY_PREFIX = _.cacheKeyPrefix);
2026
+ let { service: wt, invalidationBus: Et, snapshotCache: Dt, cache: kt, semantic: jt, evictSource: Mt, backend: Nt, stats: Pt, dispose: Rt } = await se({
2027
+ env: process.env,
2028
+ semantic: _?.cacheSemantic ?? !1
2029
+ });
2030
+ jt !== void 0 && $.info("semantic cache enabled — reactive eviction on live writes"), $.info(`cache backend resolved: ${Nt}` + (Nt === "redis" ? ` (driver ${process.env.CACHE_REDIS_DRIVER ?? "resp"})` : " — in-process, not cross-instance"));
2031
+ let Bt = (e) => {
2032
+ J.runFork(Et.publish(e));
2033
+ };
2034
+ D.onChange((e) => {
2035
+ if (J.runFork(Et.publish(e.table)), Mt !== void 0) {
2036
+ let t = (e.new ?? e.old)?.id;
2037
+ Mt({
2038
+ table: e.table,
2039
+ op: e.op,
2040
+ ...t === void 0 ? {} : { id: t }
2041
+ });
2042
+ }
2043
+ }), _?.kv && !process.env.KV_BACKEND && (process.env.KV_BACKEND = _.kv), _?.kvRedisUrl && !process.env.KV_REDIS_URL && (process.env.KV_REDIS_URL = _.kvRedisUrl), _?.kvKeyPrefix && !process.env.KV_KEY_PREFIX && (process.env.KV_KEY_PREFIX = _.kvKeyPrefix);
2044
+ let { kv: Vt, service: Ht } = await ci({ store: D });
2045
+ an({
2046
+ log: $,
2047
+ max: Cn(),
2048
+ outOfPool: Ne(y, (process.env.CDC ?? "1") !== "0"),
2049
+ readPools: t.replicationSnapshot()?.replicaCount ?? 0,
2050
+ always: !0
2051
+ }), f.mark("store");
2052
+ let Wt = Vr({
2053
+ store: D,
2054
+ sink: at.sink,
2055
+ log: $
2056
+ }), Jt = gt(_?.idempotency, D), Zt = ze({
2057
+ store: D,
2058
+ dialect: y,
2059
+ log: { info: (e) => $.info(e) },
2060
+ ...Jt === void 0 ? {} : { idempotencyTtlMs: Jt.ttlMs }
2061
+ }), $t = _?.plugins ?? [], tn = jr(), nn, on;
2062
+ y !== "memory" && (nn = Wi.make((await xn(y)).makeSqlLayer(A()).pipe(Y.provideMerge(ar({})))), on = await nn.runPromise(Gi.SqlClient));
2063
+ let _n = [
2064
+ "postgres",
2065
+ "mariadb",
2066
+ "mysql",
2067
+ "mssql"
2068
+ ].includes(y) ? ii(D, tn, $) : Pi, bn = g(_?.scheduling), Un = di({
2069
+ maxIdleIntervalMs: bn.pollCeilingMs,
2070
+ coordinator: _n,
2071
+ replicaId: tn,
2072
+ log: $
2073
+ }), qn = [], Zn = jr(), Qn = la(_?.plugins ?? [])?.broadcast?.provider, $n = en(_?.plugins, _?.name ?? er(p));
2074
+ {
2075
+ let e = Kt(_?.plugins, _?.name ?? er(p));
2076
+ e !== void 0 && $.warn(e);
2077
+ }
2078
+ let N = Qt(_?.plugins, {
2079
+ instanceId: Zn,
2080
+ namespace: $n,
2081
+ meta: { mode: "serve" },
2082
+ logger: $
2083
+ }), nr = Mr();
2084
+ Nr(`${nr.host}:${he}`, nr.declared);
2085
+ let or = cn(), F = Jo(_?.inspect), I = He({
2086
+ store: D,
2087
+ members: () => N.membership?.list() ?? []
2088
+ }), sr = () => {
2089
+ let e = N.membership?.list().length;
2090
+ return typeof e == "number" && e > 0 ? { fleetSize: e } : {};
2091
+ }, cr = Hn({
2092
+ mode: "serve",
2093
+ dialect: y,
2094
+ ...Qn === void 0 ? {} : { provider: Qn },
2095
+ logger: $
2096
+ });
2097
+ G(async () => {
2098
+ await cr.stop();
2099
+ }), Xt(_?.reactive), m(_);
2100
+ let lr = T(D, {
2101
+ claimedBy: Ar(),
2102
+ onError: (e) => $.warn("change claim failed — the claimed effect is being SKIPPED, not duplicated", { cause: String(e) })
2103
+ }), L = {
2104
+ ...on ? { sql: on } : {},
2105
+ instanceId: Zn,
2106
+ membership: N.membership,
2107
+ ...Qn === void 0 ? {} : { broadcast: Qn },
2108
+ broadcastChannels: { presence: ca($n, "presence") },
2109
+ scheduleCoordinated: (e, t, n) => {
2110
+ let r = Un(e, t, n);
2111
+ return qn.push(r), r;
2112
+ },
2113
+ claimChange: lr.claim
2114
+ };
2115
+ for (let e of $t) e.bindDataStore?.(St, L);
2116
+ Ce({
2117
+ store: D,
2118
+ ...be(),
2119
+ log: $
2120
+ });
2121
+ let ur = $t.filter((e) => typeof e.onChangeEvent == "function");
2122
+ if (ur.length > 0) {
2123
+ let e = D.changeScope ?? "local";
2124
+ D.onChange((t) => {
2125
+ let n = me(t, e);
2126
+ for (let e of ur) J.runFork(e.onChangeEvent(n).pipe(J.catchAllCause((t) => J.sync(() => $.warn(`plugin ${e.name} onChangeEvent failed`, { error: Ui.pretty(t) })))));
2127
+ });
2128
+ }
2129
+ let dr = x.filter((e) => In.test(e));
2130
+ dr.length > 0 && (await yt(dr, $), $.info(`queue: ${dr.length} consumer file(s) loaded`));
2131
+ let fr = zt({
2132
+ plugins: $t,
2133
+ appName: _?.name ?? "voltro-api",
2134
+ appType: "api",
2135
+ voltroVersion: kr() ?? "unknown",
2136
+ log: $
2137
+ });
2138
+ $t.length && await fr.activate(), f.mark("plugins");
2139
+ let pr = await fr.gatherObservability(), mr = P({ scope: "voltro:broadcast" }), hr = {
2140
+ info: (e, t) => {
2141
+ mr.info(e, t);
2142
+ },
2143
+ warn: (e, t) => {
2144
+ mr.warn(e, t);
2145
+ },
2146
+ debug: () => {}
2147
+ };
2148
+ F.logs.on && (un(new pn(F.logs.size)), G(ln(or)), hr.info("inspect: serving /_voltro/inspect/logs", { ring: F.logs.size }));
2149
+ let gr;
2150
+ F.traces.on && (ee(new Me(F.traces.size)), gr = ui(pt({ buffer: rn() })), hr.info("inspect: serving /_voltro/inspect/traces", { ring: F.traces.size }));
2151
+ let R, _r = bt({
2152
+ store: D,
2153
+ dispatcher: () => R,
2154
+ invalidateTable: () => Bt,
2155
+ log: hr
2156
+ }), vr = await ht(D, _, y, $n, hr, _r.onBroadcastGap), z = _?.apiKeys, yr = (typeof z == "object" ? z.prefix : void 0) ?? "voltro_", B = z ? Xr(D) : void 0, br = B ? oi({ flush: si(B) }) : void 0;
2157
+ br && G(() => br.shutdown());
2158
+ let Sr = B ? ai(B, {
2159
+ prefix: yr,
2160
+ ...br ? { usage: br } : {}
2161
+ }) : void 0, wr = Sr ? [$r(Sr, { prefix: yr })] : [], Tr = vt([..._?.auth?.strategies ?? [], ...wr], ga(_?.plugins ?? []), _?.auth?.anonymousTenantRequired ?? !1, _?.auth, () => St), V = [..._?.restRoutes ?? [], ...Sr ? Br(Sr, (typeof z == "object" ? z.managementPath : void 0) ?? "/v1/api-keys") : []], Dr = $t.map((e) => e.services).filter((e) => e !== void 0), Fr = Y.mergeAll(qt({
2162
+ analyticsLayer: at.layer,
2163
+ cacheService: wt,
2164
+ kvService: Ht,
2165
+ ...jt === void 0 ? {} : { semanticCache: jt },
2166
+ pluginServices: Dr,
2167
+ userLayers: _?.layers ?? []
2168
+ }), $e(_?.http ?? {})), H = await At({
2169
+ files: x,
2170
+ store: D,
2171
+ log: $,
2172
+ seedPolicy: "report",
2173
+ seedPattern: Fn,
2174
+ loadSeedFiles: Tn,
2175
+ startupPattern: Vn,
2176
+ loadStartupFiles: a,
2177
+ runStartups: o,
2178
+ emailPattern: _t,
2179
+ loadEmailFiles: mt,
2180
+ registerEmailTemplates: _a
2181
+ });
2182
+ (H.startupCount > 0 || H.emailCount > 0) && $.info("boot lifecycle", {
2183
+ startups: H.startupCount,
2184
+ emailTemplates: H.emailCount
2185
+ }), H.startups !== void 0 && G(async () => {
2186
+ await H.startups.stop();
2187
+ }), de({
2188
+ demands: ve(Ve),
2189
+ isRegistered: (e) => ei(e) !== void 0
2190
+ });
2191
+ let Ir = ft({
2192
+ schedules: It({
2193
+ schedules: S.schedules,
2194
+ seeds: H.seeds,
2195
+ store: D,
2196
+ log: $.child("seeds")
2197
+ }),
2198
+ workflows: S.workflows ?? [],
2199
+ log: $.child("workflow-schedules")
2200
+ }), Lr = _?.scheduling ?? {}, Rr = Lr.trigger ?? "self", zr = /* @__PURE__ */ new Set([
2201
+ "postgres",
2202
+ "mysql",
2203
+ "mariadb",
2204
+ "mssql"
2205
+ ]), Hr = Lr.coordination ?? (zr.has(y) ? "advisoryLock" : "single"), Ur = Hr === "cluster" && zr.has(y), Wr = Ur ? "cluster" : Hr === "advisoryLock" && zr.has(y) ? "advisoryLock" : "single";
2206
+ Hr === "cluster" && !Ur && $.warn("scheduling.coordination=cluster needs a sql-backed store except sqlite — falling back to single"), Hr === "advisoryLock" && !zr.has(y) && $.warn("scheduling.coordination=advisoryLock needs a SQL store (the claim-row gate) — falling back to single");
2207
+ let Gr, U = S.workflows.length > 0 || S.workflowWorkers.length > 0 || S.eventTriggers.length > 0 || (Xe?.outgoing.length ?? 0) > 0 || Ur, Kr;
2208
+ if (U) {
2209
+ if (y === "mssql") {
2210
+ let e = await Gn(process.cwd());
2211
+ e && $.warn(e);
2212
+ }
2213
+ let [{ WorkflowEngine: e }, { makeClusterCronLayer: t, workflowEngineLayer: n, resolveRunnerStorage: r, resolveFailoverTuning: i }] = await Promise.all([import("@effect/workflow"), import("@voltro/workflow/cluster")]), a = Ur ? Ir.filter((e) => (e.trigger ?? Rr) === "self").map((e) => t({
2214
+ name: e.name,
2215
+ cron: Yr(e),
2216
+ execute: async () => {
2217
+ await Gr?.fireFromCluster(e.name);
2218
+ }
2219
+ })) : [];
2220
+ Kr = y === "memory" ? e.layerMemory : await (async () => {
2221
+ let e = await xn(y), t = r({ sqliteFamily: e.id === "sqlite" || e.id === "turso" });
2222
+ 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({
2223
+ sqlClientLayer: e.makeSqlLayer(A()),
2224
+ runnerStorage: t,
2225
+ dialectId: e.id,
2226
+ ...process.env.VOLTRO_WORKFLOW_RUNNER_PORT ? { runnerListenPort: Number(process.env.VOLTRO_WORKFLOW_RUNNER_PORT) } : {},
2227
+ ...i(),
2228
+ ...a.length > 0 ? { extraShardingLayers: a } : {}
2229
+ });
2230
+ })();
2231
+ }
2232
+ let W = Ut($t, Wn()), qr = x.filter((e) => /\.subscribe\.tsx?$/.test(e)), Jr = qr.length > 0 ? await ot(qr, $) : [], ti = x.filter((e) => /\.reaction\.tsx?$/.test(e)), ni = ti.length > 0 ? await Ge(ti, $) : [], ri = x.filter((e) => Ln.test(e)), li = ri.length > 0 ? await nt(ri, $) : [], fi = x.filter((e) => /\.aggregate\.tsx?$/.test(e)), pi = fi.length > 0 ? await ge(fi, $) : [];
2233
+ {
2234
+ let e = Qr(Ri(ce({ aggregates: pi.map((e) => e.definition) }), v(w)));
2235
+ e !== void 0 && $.warn(e);
2236
+ }
2237
+ let mi = b();
2238
+ if (pi.length > 0 && y !== "memory") try {
2239
+ let e = (await xn(y)).makeSqlLayer(A());
2240
+ mi = Pe(e);
2241
+ } catch (e) {
2242
+ $.warn("aggregate: SQL storage init failed — falling back to in-process", { err: String(e) });
2243
+ }
2244
+ let hi = y === "memory" ? Pi : ii(D, `aggregate@${process.pid}`, $), gi = x.filter((e) => Rn.test(e)), _i = gi.length > 0 ? await Se(gi, $) : [], vi = x.filter((e) => zn.test(e)), yi = vi.length > 0 ? await Ct(vi, $) : [], bi = x.filter((e) => Bn.test(e)), Si = bi.length > 0 ? await Te(bi, $) : [], Ci = [], wi = [], Ti = x.filter((e) => Dn.test(e));
2245
+ if (Ti.length > 0) {
2246
+ let e = $.child("agent"), t = x.filter((e) => An.test(e));
2247
+ t.length > 0 && await On(t, e);
2248
+ let n = await kn(Ti, e);
2249
+ for (let e of n.agents) for (let t of Gt(e)) (t.kind === "action" ? Ci : wi).push({
2250
+ file: t.file,
2251
+ descriptor: t.descriptor,
2252
+ executor: t.executor
2253
+ });
2254
+ n.agents.length > 0 && e.info("synthesized agent routes", { agents: n.agents.map((e) => e.descriptor.name) });
2255
+ }
2256
+ f.mark("workflow");
2257
+ let K = () => {
2258
+ let e = q.workflowWriteActions();
2259
+ if (e === void 0) throw Error("workflow actions: this app registers no workflows");
2260
+ return e;
2261
+ }, Ei = Cr({
2262
+ dialect: y,
2263
+ ...A()
2264
+ }), Di = y === "memory" ? void 0 : (await xn(y)).makeSqlLayer(A()), Oi = async () => E({
2265
+ sqlLayer: Di,
2266
+ declared: w,
2267
+ log: $
2268
+ }), Ai = {
2269
+ kind: "api",
2270
+ meta: {
2271
+ name: _?.name ?? "voltro-api",
2272
+ voltroVersion: j,
2273
+ port: he,
2274
+ mode: Or(),
2275
+ store: y,
2276
+ cdc: Oe ? "on" : "off",
2277
+ ...Ei === void 0 ? {} : { databaseId: Ei }
2278
+ },
2279
+ rpc: xe(S, p),
2280
+ workflows: we(S, p),
2281
+ migrations: Oi,
2282
+ events: () => q.eventsSnapshot(),
2283
+ agentTools: () => q.agentTools(),
2284
+ invariantChecks: () => ({
2285
+ mode: "serve",
2286
+ accessGate: Ve,
2287
+ config: _,
2288
+ serverOnlyLeaks: S.serverOnlyLeaks,
2289
+ migrations: Oi
2290
+ }),
2291
+ members: () => q.membersSnapshot(),
2292
+ inspectFireSchedule: async ({ name: e, trigger: t }) => {
2293
+ if (!Gr) throw Error("scheduler not started — this app registers no self-triggered schedules (all schedules are trigger:'external', or there are none).");
2294
+ return { runId: await Gr.fireNow(e, t) ?? null };
2295
+ },
2296
+ inspectBackfillSchedule: O({
2297
+ getHandle: () => Gr,
2298
+ getSchedules: () => Ir
2299
+ }),
2300
+ ...Xe === void 0 ? {} : { webhooks: () => xt({
2301
+ store: D,
2302
+ discoveredWebhooks: Xe
2303
+ }) },
2304
+ plugins: () => ({
2305
+ plugins: fr.snapshot(),
2306
+ capturedAt: Date.now()
2307
+ }),
2308
+ env: () => mn(_?.name ?? er(p), {
2309
+ ..._?.env !== void 0 && aa(_.env) ? { contract: _.env } : {},
2310
+ plugins: _?.plugins ?? []
2311
+ }),
2312
+ dataCache: () => ne({
2313
+ stats: Pt,
2314
+ backendKind: Nt
2315
+ }),
2316
+ subscriptions: () => Yt(() => R),
2317
+ fleetObservations: (e) => I.fleet(e),
2318
+ peerAddress: (e) => I.addressOf(e),
2319
+ inspectTables: () => ue(w),
2320
+ inspectRows: _e({
2321
+ store: D,
2322
+ tables: w,
2323
+ mask: !0
2324
+ }),
2325
+ metrics: (e) => q.rpcMetrics().snapshot(e),
2326
+ cluster: () => Fe({
2327
+ store: D,
2328
+ dialect: y,
2329
+ useClusterCron: Ur,
2330
+ scheduleCoordChoice: Hr
2331
+ }),
2332
+ inspectSchedules: () => Ee({
2333
+ schedules: Ir,
2334
+ defaultTrigger: Rr,
2335
+ coordination: Wr
2336
+ }),
2337
+ inspectScheduleRuns: (e) => ie(D, e),
2338
+ ...oe(D, {
2339
+ controls: re(S.workflows ?? []),
2340
+ active: (S.workflows?.length ?? 0) > 0,
2341
+ cancellation: () => q.flowControlHealth()
2342
+ }),
2343
+ webhookActions: Re(() => q.webhooksService()),
2344
+ inspectStartWorkflow: (e) => K().inspectStartWorkflow(e),
2345
+ inspectCancelWorkflowRun: (e) => K().inspectCancelWorkflowRun(e),
2346
+ inspectSuspendWorkflowRun: (e) => K().inspectSuspendWorkflowRun(e),
2347
+ inspectResumeWorkflowRun: (e) => K().inspectResumeWorkflowRun(e),
2348
+ inspectDiscardWorkflowRun: (e) => K().inspectDiscardWorkflowRun(e),
2349
+ inspectRetryWorkflowRun: (e) => K().inspectRetryWorkflowRun(e),
2350
+ inspectSignalWorkflowRun: (e) => K().inspectSignalWorkflowRun(e),
2351
+ inspectUpdateWorkflowRun: (e) => K().inspectUpdateWorkflowRun(e),
2352
+ inspectInferences: (e) => M({
2353
+ store: D,
2354
+ active: (S.workflows?.length ?? 0) > 0,
2355
+ dispatcher: () => q.inferenceHealth()
2356
+ }, e.limit === void 0 ? {} : { limit: e.limit }),
2357
+ ...Le({
2358
+ store: D,
2359
+ cancelRun: async (e) => await q.runCanceller()?.(e) ?? !1,
2360
+ retryRun: async (e) => K().inspectRetryWorkflowRun({ runId: e }),
2361
+ redriveRun: async (e) => q.redriveWorkflowRun({ runId: e }),
2362
+ log: $
2363
+ }),
2364
+ inspectRedriveWorkflowRun: (e) => q.redriveWorkflowRun(e),
2365
+ inspectResumeWorkflowRunFromStep: (e) => q.resumeWorkflowRunFromStep(e)
2366
+ }, Mi = (process.env.VOLTRO_TENANT_ISOLATION ?? _?.tenancy?.isolation) === "namespace", Ni = Mi && y !== "memory" ? await (async () => {
2367
+ let e = await xn(y);
2368
+ return Ie({
2369
+ tables: w,
2370
+ sqlLayer: e.makeSqlLayer(A()),
2371
+ dialect: y,
2372
+ options: { retryFilter: e.retryFilter },
2373
+ log: {
2374
+ info: (e, t) => $.info(e, t),
2375
+ error: (e, t, n) => $.error(e, t ?? {}, n)
2376
+ }
2377
+ });
2378
+ })() : void 0, Fi = await Qe({
2379
+ input: _?.tenancy?.residency,
2380
+ namespaceIsolationOn: Mi,
2381
+ makeStoreForUrl: (e, t) => tt(_, void 0, Sn(A(), t)),
2382
+ log: {
2383
+ info: (e, t) => $.info(e, t),
2384
+ warn: (e, t) => $.warn(e, t)
2385
+ }
2386
+ });
2387
+ Fi !== void 0 && G(async () => {
2388
+ await Fi.close();
2389
+ });
2390
+ let q = await Go({
2391
+ bootTiming: f,
2392
+ claimChange: lr.claim,
2393
+ broadcastNamespace: $n,
2394
+ scheduling: (() => {
2395
+ let e = bn;
2396
+ return {
2397
+ admissionDrainMs: e.admissionDrainMs,
2398
+ inferenceTickMs: e.inferenceTickMs,
2399
+ cancelSweepMs: e.cancelSweepMs,
2400
+ stalenessSweepMs: e.stalenessSweepMs,
2401
+ scheduleHeartbeatMs: e.scheduleHeartbeatMs,
2402
+ disarmWhenIdle: Be({
2403
+ changeScope: D.changeScope,
2404
+ broadcastAttached: vr !== void 0
2405
+ })
2406
+ };
2407
+ })(),
2408
+ ..._?.workflows?.staleness === void 0 ? {} : { workflowStaleness: _.workflows.staleness },
2409
+ ..._?.workflows?.suspendSignalHintMs === void 0 ? {} : { workflowSuspendSignalHintMs: _.workflows.suspendSignalHintMs },
2410
+ workflowRecording: ae(_?.workflows?.recording),
2411
+ membership: {
2412
+ ...N,
2413
+ instanceId: Zn
2414
+ },
2415
+ security: {
2416
+ defaultDeny: Ye(_),
2417
+ ...Ue(_)
2418
+ },
2419
+ approvals: { defaultExpiryMs: C(_) },
2420
+ ..._?.plugins === void 0 ? {} : { plugins: _.plugins },
2421
+ ...Jt ? { idempotency: Jt } : {},
2422
+ restRoutes: V,
2423
+ ..._?.grpc === void 0 ? {} : { grpc: {
2424
+ config: _.grpc,
2425
+ root: p
2426
+ } },
2427
+ appProcedures: Ve,
2428
+ discovered: {
2429
+ wsGateways: S.wsGateways,
2430
+ queries: [...S.queries, ...wi],
2431
+ mutations: S.mutations,
2432
+ actions: [...S.actions, ...Ci],
2433
+ streams: S.streams,
2434
+ events: S.events,
2435
+ workflows: S.workflows,
2436
+ workflowWorkers: S.workflowWorkers,
2437
+ eventTriggers: S.eventTriggers,
2438
+ schedules: Ir,
2439
+ subscribers: Jr,
2440
+ outboxHandlers: li,
2441
+ connections: S.connections,
2442
+ reactions: ni,
2443
+ aggregates: pi,
2444
+ expectations: _i,
2445
+ budgets: yi,
2446
+ experiments: Si,
2447
+ ...Xe === void 0 ? {} : { webhooks: Xe }
2448
+ },
2449
+ log: $,
2450
+ analytics: at.sink,
2451
+ aggregateStorage: mi,
2452
+ aggregateCoordinator: hi,
2453
+ store: D,
2454
+ kv: Vt,
2455
+ cache: kt,
2456
+ snapshotCache: Dt,
2457
+ ..._?.reactive === void 0 ? {} : { reactive: _.reactive },
2458
+ schemaRegistry: lt,
2459
+ tenantScopedTables: S.tenantScopedTables,
2460
+ softDeleteScopedTables: S.softDeleteScopedTables,
2461
+ dataTransferSnapshot: Ki(w, y),
2462
+ dataTransferDialect: y,
2463
+ ...Ni === void 0 ? {} : { ensureTenantProvisioned: Ni.ensure },
2464
+ ...Fi === void 0 ? {} : { resolveResidentStore: Fi.resolveStore },
2465
+ tenantIsolation: (process.env.VOLTRO_TENANT_ISOLATION ?? _?.tenancy?.isolation) === "namespace" ? "namespace" : "shared-schema",
2466
+ resolveSubject: (e, t) => Tr({
2467
+ headers: e,
2468
+ clientId: t
2469
+ }),
2470
+ ..._?.auth === void 0 ? {} : { authority: _.auth },
2471
+ ..._?.agents === void 0 ? {} : { agents: _.agents },
2472
+ httpRoutes: $t.flatMap((e) => e.httpRoutes ?? []),
2473
+ getStore: () => St,
2474
+ ...Fr ? { baseLayer: Fr } : {},
2475
+ ...Kr === void 0 ? {} : { workflowEngineLayer: Kr },
2476
+ scheduleDefaultTrigger: Rr,
2477
+ scheduleCoordination: Wr,
2478
+ scheduleArmSelf: !Ur,
2479
+ dormancy: process.env.VOLTRO_DORMANCY === "sleep" || process.env.VOLTRO_DORMANCY === "always-on" ? process.env.VOLTRO_DORMANCY : _?.dormancy ?? "always-on",
2480
+ scheduleReplicaId: jr(),
2481
+ ...W === void 0 ? {} : { scheduleFireInterceptor: W },
2482
+ onSchedulerReady: (e) => {
2483
+ Gr = e;
2484
+ },
2485
+ inspectStream: pe(or),
2486
+ inspectRoute: { handle: async (e, t, n, r) => F.logs.on && n === "GET" && (e === "/_voltro/inspect/logs" || e.startsWith("/_voltro/inspect/logs?")) ? dn(e, fn(), t) : F.traces.on && n === "GET" && (e === "/_voltro/inspect/traces" || e.startsWith("/_voltro/inspect/traces?")) ? fe(e, rn()) : await d(e, Ai, t, {
2487
+ method: n,
2488
+ ...r === void 0 ? {} : { body: r },
2489
+ ...sr()
2490
+ }) || ((n === "GET" ? await gn(e, Ai, t, {
2491
+ method: n,
2492
+ ...sr()
2493
+ }) : null) ?? hn(e, Ai, t, {
2494
+ method: n,
2495
+ ...r === void 0 ? {} : { body: r },
2496
+ ...sr()
2497
+ }) ?? {
2498
+ status: 404,
2499
+ contentType: "application/json",
2500
+ body: JSON.stringify({ error: "not an inspect route" })
2501
+ }) },
2502
+ ..._?.name === void 0 ? {} : { appName: _.name },
2503
+ observability: pr,
2504
+ ..._?.health === void 0 ? {} : { health: _.health },
2505
+ ...gr === void 0 ? {} : { traceSink: gr },
2506
+ port: he,
2507
+ ..._?.transport?.wsPath ? { path: _.transport.wsPath } : {},
2508
+ ..._?.http === void 0 ? {} : { http: _.http }
2509
+ });
2510
+ R = q.dispatcher;
2511
+ let Ii = () => {
2512
+ or.emit("subscriptions", Yt(() => R));
2513
+ }, zi = q.dispatcher.onSubscriptionsChange(Ii);
2514
+ return Ii(), We(te([
2515
+ S.queries,
2516
+ S.mutations,
2517
+ S.actions,
2518
+ S.streams
2519
+ ]), (e) => {
2520
+ $.warn(e);
2521
+ }), $.info(`API listening on :${he}`, {
2522
+ dialect: y,
2523
+ queries: S.queries.length,
2524
+ mutations: S.mutations.length,
2525
+ actions: S.actions.length,
2526
+ streams: S.streams.length,
2527
+ workflows: S.workflows.length,
2528
+ workflowWorkers: S.workflowWorkers.length,
2529
+ schedules: Ir.length,
2530
+ scheduleCoordination: Wr
2531
+ }), f.finish($), G(async () => {
2532
+ for (let e of qn) e.stop();
2533
+ Zt.stop(), zi(), I.stop();
2534
+ try {
2535
+ await q.close(), Rt(), nn?.dispose(), await fr.deactivate(), await vr?.close(), await Ft({
2536
+ mirror: Wt,
2537
+ log: $
2538
+ }), await at.dispose(), await D.close?.();
2539
+ } catch (e) {
2540
+ console.error("serve: shutdown step failed, exiting anyway:", e);
2541
+ }
2542
+ }), await new Promise(() => {}), 0;
2543
+ };
2544
+ //#endregion
2545
+ export { Zo as n, Yo as r, Qo as t };