@voltro/cli 0.45.0 → 0.46.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 (112) hide show
  1. package/CHANGELOG.md +176 -0
  2. package/dist/{apiBuild-CDQBNRDx.js → apiBuild-BKdd0I1Z.js} +2 -2
  3. package/dist/apiBuild-P2gewrfQ.js +2 -0
  4. package/dist/bin.d.ts +8 -0
  5. package/dist/bin.js +1 -1
  6. package/dist/{build-yvsLG77U.js → build-co6yadYz.js} +7 -7
  7. package/dist/{checkCommand-Boxov8lr.js → checkCommand-B-eiW-G_.js} +3 -3
  8. package/dist/{checkCommand-lrzwOzV1.js → checkCommand-CXAXTjZL.js} +1 -1
  9. package/dist/{codegenCommand-CQOLytL-.js → codegenCommand-CB6_3sX0.js} +15 -15
  10. package/dist/{codemodRunner-5ZhDH3rB.js → codemodRunner-DSZjgyCL.js} +8 -0
  11. package/dist/{commands-CEkVoFM5.js → commands-C-hxgAGr.js} +23 -23
  12. package/dist/{dashboardCommand-0ahyp-zA.js → dashboardCommand-CEVO0GWF.js} +3 -3
  13. package/dist/{dataCommand-D4IlZcih.js → dataCommand-k0ezbQWa.js} +271 -230
  14. package/dist/{dbCommand-B237qI-j.js → dbCommand-BwkyNxn-.js} +110 -110
  15. package/dist/dbCommand-C2XK63Dd.js +2 -0
  16. package/dist/{dev-DAM5CnAa.js → dev-8hTEnN6s.js} +2080 -2057
  17. package/dist/{dev-P4HyeY9W.js → dev-DyoYst4j.js} +1 -1
  18. package/dist/devActivity.d.ts +8 -0
  19. package/dist/{doctorCommand-DW2cwAvC.js → doctorCommand-B6D7HH1-.js} +14 -14
  20. package/dist/doctorCommand-Btl2Jz1a.js +2 -0
  21. package/dist/{dormancyCommand-BqQz7lbM.js → dormancyCommand-CrPAwOgo.js} +1 -1
  22. package/dist/{embeddingsCommand-DJyArpU4.js → embeddingsCommand-DsSxsn_b.js} +1 -1
  23. package/dist/{envCommand-CviRZx1L.js → envCommand-B_NPVGUf.js} +2 -2
  24. package/dist/{evalCommand-6RUfPen4.js → evalCommand-Db01Kbng.js} +24 -24
  25. package/dist/{evolveCommand-qdlP-R9G.js → evolveCommand-DUuaCIyn.js} +2 -2
  26. package/dist/{frameworkTableAssembly-oMPBKqlE.js → frameworkTableAssembly-BPlPfU07.js} +82 -78
  27. package/dist/frameworkTableAssembly-Bob3vj9R.js +2 -0
  28. package/dist/index.d.ts +8 -0
  29. package/dist/index.js +1 -1
  30. package/dist/{infoCommand-CNWPSUcW.js → infoCommand-CuNl9cbh.js} +1 -1
  31. package/dist/inspectState.d.ts +8 -0
  32. package/dist/interruptedReplace-C1ZI84xi.js +27 -0
  33. package/dist/interruptedReplace-DNJ7MKph.js +2 -0
  34. package/dist/{migrate-DN47p2PG.js → migrate-CM1qwalu.js} +27 -27
  35. package/dist/{runtimeTrace-BDZSt9W_.js → runtimeTrace-BRNM06vK.js} +1 -1
  36. package/dist/{sdkgen-sNaD3oZB.js → sdkgen-CRCw_XcR.js} +1 -1
  37. package/dist/{seedRunner-IdHEprqf.js → seedRunner-Dgsiwk_e.js} +59 -59
  38. package/dist/serveCommand-BNHMVXyp.js +2 -0
  39. package/dist/serveCommand-CHOr74WM.js +1928 -0
  40. package/dist/serveEntry.d.ts +8 -0
  41. package/dist/serveEntry.js +1 -1
  42. package/dist/{start-Ds3xyn8R.js → start-7HcSIKEp.js} +1 -1
  43. package/dist/{start-BAlGcjF5.js → start-DvlYDyAr.js} +1 -1
  44. package/dist/startEntry.d.ts +8 -0
  45. package/dist/startEntry.js +1 -1
  46. package/dist/startup.d.ts +8 -0
  47. package/dist/{updateCommand-rCnhaj84.js → updateCommand-BlyXavoG.js} +1 -1
  48. package/dist/updateCommand-CT5AvVg7.js +2 -0
  49. package/dist/{webDev-101csg6Q.js → webDev-B4IEMB0n.js} +6 -6
  50. package/dist/webDev-B79ji8M5.js +2 -0
  51. package/dist/{webhooksCommand-C0iZZfaI.js → webhooksCommand-BRrG_sGf.js} +1 -1
  52. package/package.json +23 -17
  53. package/templates/AGENTS.md +1 -1
  54. package/templates/agent-docs/_index.md +1 -1
  55. package/templates/agent-docs/cli.md +138 -2
  56. package/templates/agent-docs/data.md +70 -4
  57. package/templates/agent-docs/whats-new.md +127 -54
  58. package/templates/apps/api-ai/package.json +7 -7
  59. package/templates/apps/api-auth/package.json +8 -8
  60. package/templates/apps/api-backend/package.json +7 -7
  61. package/templates/apps/api-backend-deactivation/package.json +7 -7
  62. package/templates/apps/api-backend-mail/package.json +8 -8
  63. package/templates/apps/api-backend-mariadb/package.json +9 -9
  64. package/templates/apps/api-backend-sqlite/package.json +8 -8
  65. package/templates/apps/api-backend-storage/package.json +8 -8
  66. package/templates/apps/api-cms/package.json +10 -10
  67. package/templates/apps/api-collab/package.json +8 -8
  68. package/templates/apps/api-data-advanced/package.json +8 -8
  69. package/templates/apps/api-durable/package.json +8 -8
  70. package/templates/apps/api-feature-flags/package.json +9 -9
  71. package/templates/apps/api-governance/package.json +8 -8
  72. package/templates/apps/api-kv/package.json +8 -8
  73. package/templates/apps/api-moderation/package.json +8 -8
  74. package/templates/apps/api-observability/package.json +8 -8
  75. package/templates/apps/api-ratelimit/package.json +8 -8
  76. package/templates/apps/api-rbac/package.json +8 -8
  77. package/templates/apps/api-rest/package.json +7 -7
  78. package/templates/apps/api-saas/package.json +11 -11
  79. package/templates/apps/api-saas-starter/package.json +10 -10
  80. package/templates/apps/api-search/package.json +8 -8
  81. package/templates/apps/api-status/package.json +8 -8
  82. package/templates/apps/api-versioning/package.json +8 -8
  83. package/templates/apps/api-webhooks/package.json +9 -9
  84. package/templates/apps/changelog/package.json +6 -6
  85. package/templates/apps/edge-functions/package.json +2 -2
  86. package/templates/apps/frontend-admin/package.json +8 -8
  87. package/templates/apps/frontend-app/package.json +9 -9
  88. package/templates/apps/frontend-auth/package.json +8 -8
  89. package/templates/apps/frontend-blank/package.json +7 -7
  90. package/templates/apps/frontend-cms/package.json +9 -9
  91. package/templates/apps/frontend-collab/package.json +10 -10
  92. package/templates/apps/frontend-contact/package.json +7 -7
  93. package/templates/apps/frontend-dashboard/package.json +7 -7
  94. package/templates/apps/frontend-docs/package.json +7 -7
  95. package/templates/apps/frontend-i18n/package.json +6 -6
  96. package/templates/apps/frontend-landing/package.json +7 -7
  97. package/templates/apps/frontend-portal/package.json +8 -8
  98. package/templates/apps/frontend-saas/package.json +8 -8
  99. package/templates/apps/frontend-spa/package.json +7 -7
  100. package/templates/apps/frontend-ssr/package.json +7 -7
  101. package/templates/apps/frontend-ssr-api/package.json +8 -8
  102. package/templates/apps/frontend-static-blog/package.json +6 -6
  103. package/templates/apps/frontend-status/package.json +8 -8
  104. package/templates/apps/mobile-app/package.json +4 -4
  105. package/dist/apiBuild-yJCqJYQ8.js +0 -2
  106. package/dist/dbCommand-BvQeKQOb.js +0 -2
  107. package/dist/doctorCommand-2K1dIzYk.js +0 -2
  108. package/dist/frameworkTableAssembly-DgylYh9_.js +0 -2
  109. package/dist/serveCommand-BBhT2U94.js +0 -1885
  110. package/dist/serveCommand-DY2jLy0o.js +0 -2
  111. package/dist/updateCommand-BH6EGuCc.js +0 -2
  112. package/dist/webDev-BLKBO34K.js +0 -2
@@ -1,1885 +0,0 @@
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 { $ as s, $t as c, A as l, At as u, B as d, C as ee, Cn as f, Ct as p, D as te, Dt as ne, E as m, Et as h, F as re, Ft as ie, G as g, Gt as ae, H as oe, I as se, It as ce, J as le, Jt as _, K as ue, Kt as v, L as de, Lt as y, M as fe, Mt as pe, N as me, Nt as he, O as ge, Ot as _e, P as ve, Pt as ye, Q as be, Qt as xe, R as b, Rt as Se, S as Ce, Sn as we, St as Te, T as x, Tn as Ee, Tt as De, U as Oe, Ut as ke, V as Ae, Vt as je, W as Me, Wt as Ne, X as Pe, Xt as Fe, Y as Ie, Yt as S, Z as Le, Zt as C, _ as Re, _n as ze, _t as Be, an as Ve, at as He, b as Ue, bn as We, bt as Ge, c as Ke, cn as w, ct as qe, dn as Je, dt as Ye, en as Xe, et as Ze, f as Qe, fn as $e, ft as et, g as tt, gn as nt, gt as rt, h as it, ht as at, i as ot, in as st, it as ct, j as lt, jt as ut, k as T, kt as dt, ln as ft, lt as pt, m as E, mn as D, mt, nn as ht, nt as gt, o as O, on as _t, ot as vt, p as yt, pn as bt, pt as xt, q as St, qt as Ct, r as wt, rn as Tt, rt as Et, sn as Dt, st as Ot, t as kt, tn as At, tt as jt, u as k, un as A, ut as Mt, v as Nt, vn as j, vt as Pt, w as Ft, wn as It, wt as Lt, x as Rt, xt as zt, y as Bt, yn as Vt, yt as Ht, zt as Ut } from "./dev-DAM5CnAa.js";
7
- import { n as Wt } from "./cliArgs-D4p8n7EE.js";
8
- import { r as M } from "./appPort-B_HpJ_ck.js";
9
- import { ht as Gt, pt as Kt } from "./webDev-101csg6Q.js";
10
- import { r as N } from "./dialectDriver-czCHYpeH.js";
11
- import { i as qt, n as Jt } from "./connectionConfig-Bk9IC7D0.js";
12
- import { c as Yt, n as P, o as Xt } from "./seedRunner-IdHEprqf.js";
13
- import { C as Zt, S as Qt, _ as $t, d as en, g as tn, l as nn, m as rn, r as an, u as on, v as sn } from "./frameworkTableAssembly-oMPBKqlE.js";
14
- import { S as cn, c as ln, n as un, p as dn, s as fn, x as pn } from "./fileConventions-Cof68_BL.js";
15
- import { h as mn, o as hn } from "./inspect-B7U7Cl_Z.js";
16
- import { n as gn } from "./mssqlClusterPatch-_4cE_nun.js";
17
- import { i as _n, n as vn, r as yn, t as bn } from "./webhookDiscovery-CphsQe59.js";
18
- import { t as xn } from "./inspectMetrics-CfdKLh6t.js";
19
- import { r as Sn, u as Cn } from "./apiBuild-CDQBNRDx.js";
20
- import { t as wn } from "./bootTiming-BdyP9nYw.js";
21
- import { t as Tn } from "./dataProfile-Cm0YVKSy.js";
22
- import F, { basename as En, join as Dn } from "node:path";
23
- import { createWriteStream as On, existsSync as kn } from "node:fs";
24
- import { pathToFileURL as An } from "node:url";
25
- import { createLogger as I } from "@voltro/logger";
26
- import { AuthMiddleware as jn, ConnectionInfoMiddleware as Mn, actionToRpc as L, anonymousSubject as Nn, isWireReachable as Pn, mutationToRpc as Fn, queryToRpc as R, streamToRpc as In, wireErrorUnion as z, workflowCancelDescriptor as Ln, workflowDomainEventsQueryDescriptor as B, workflowEventDeliveriesQueryDescriptor as V, workflowResumeDescriptor as Rn, workflowRunEventsQueryDescriptor as zn, workflowRunQueryDescriptor as Bn, workflowRunStepsQueryDescriptor as Vn, workflowRunsQueryDescriptor as Hn, workflowSignalDescriptor as Un, workflowUpdateDescriptor as Wn } from "@voltro/protocol";
27
- import { Cause as Gn, Effect as H, Layer as U, ManagedRuntime as Kn } from "effect";
28
- import { SqlClient as qn } from "@effect/sql";
29
- import { declaredSnapshot as Jn, describeOutcome as Yn, pendingFileMigrationIds as Xn, runPlannedMigrations as Zn } from "@voltro/database/sql";
30
- import W from "node:os";
31
- import { RpcGroup as Qn } from "@effect/rpc";
32
- import { allRegisteredTables as $n, and as er, connectionIdentity as tr, ensureTableRegistered as nr, eq as G, or as rr } from "@voltro/database";
33
- import { AggregateRegistry as ir, CostRegistry as K, DORMANCY_WAKEUP_TENANT as ar, Dispatcher as or, ExpectationRegistry as sr, ExperimentRegistry as cr, apiKeyManagementRoutes as lr, attachAnalyticsMirror as ur, attachExpectations as dr, attachExperiments as fr, attachFinops as pr, awaitServerListening as mr, bindMutation as q, bindStream as hr, bindSubscription as J, buildTracingLayer as gr, cancelWakeup as _r, compileCron as vr, dataStoreApiKeyStore as yr, formatServerOnlyLeaks as br, formatUnresolvedSources as xr, frameworkApiKeyStrategy as Sr, getResourcePolicy as Cr, installPolicyGuardResolver as wr, loadResourceTuples as Tr, makeActionRunner as Er, makeAdvisoryLockCoordinator as Dr, makeApiKeyService as Or, makeApiKeyUsageBuffer as kr, makeApiKeyUsageFlusher as Ar, makeAsyncKv as jr, makeAuthMiddlewareLayers as Mr, makeCoordinatedScheduler as Nr, makeEffectStoreLayer as Pr, makeLazyWorkflowFacade as Fr, makeMutationOutputCodec as Ir, makeMutationRunner as Lr, makeOneShotQueryRunner as Rr, makeQueryDescriptorProducer as zr, makeQueryFinalizer as Br, makeQueryReauthorizer as Y, makeQuerySubscriber as Vr, makeSchemaRegistry as Hr, makeWorkflowFacade as Ur, makeWorkflowFacadeWithCallerContext as Wr, makeWorkflowLayers as Gr, noopKv as Kr, onProcessShutdown as qr, recordSubscriptionDelivery as Jr, recordWorkflowRun as Yr, registerDefaultTupleSource as X, registerWakeup as Xr, resolveSecretsBackend as Zr, runProvidedEffect as Qr, setSecretsBackend as $r, setSystemStoreHandle as ei, shutdownGraceMsFromEnv as ti, singleCoordinator as ni, startRpcServer as ri, startScheduler as ii, stripForbiddenForWire as ai, undoCaptureEnabled as oi, unresolvedSources as si, withScopedRequest as ci, workflowToRpc as li, wrapStoreWithBootCodec as ui } from "@voltro/runtime";
34
- import { appStorageProvider as di, fromNodeReadable as fi, getObjectStream as pi, putObjectStream as mi, toNodeReadable as hi } from "@voltro/plugin-storage";
35
- import { isEnvContract as gi } from "@voltro/env";
36
- import { assertProductionSessionSecret as _i } from "@voltro/protocol/session";
37
- import Z from "node:fs/promises";
38
- import { createHash as vi, timingSafeEqual as yi } from "node:crypto";
39
- import { buildDeliverWebhookExecute as bi, buildWebhooksService as xi, defaultIncomingPath as Si, deliverWebhookWorkflow as Ci, makeDeferredEmitHandler as wi, mountIncomingWebhook as Ti } from "@voltro/plugin-webhooks";
40
- import { getAuthSessionStrategy as Ei } from "@voltro/plugin-auth";
41
- import { registerEmailTemplates as Di } from "@voltro/plugin-mail";
42
- import { channelFor as Oi, getBroadcastPlugin as ki } from "@voltro/plugin-broadcast";
43
- import { packBundle as Ai, runExport as ji, runImport as Mi, storageBlobSink as Ni, storageRefsBlobSource as Pi, unpackBundle as Fi, unpackBundleToDir as Ii } from "@voltro/data-transfer";
44
- //#region src/serveDrain.ts
45
- var Li = () => Math.max(500, Math.floor(ti() * .6)), Ri = (e) => new Promise((t) => setTimeout(t, e)), zi = (e) => {
46
- let t = /* @__PURE__ */ new Set(), n = /* @__PURE__ */ new Set(), r = 0;
47
- e.on("connection", (e) => {
48
- t.add(e), e.once("close", () => {
49
- t.delete(e), n.delete(e);
50
- });
51
- }), e.on("upgrade", (e, t) => {
52
- n.add(t);
53
- }), e.on("request", (e, t) => {
54
- r += 1, t.once("close", () => {
55
- --r;
56
- });
57
- });
58
- let i, a = async (t = {}) => {
59
- let n = t.budgetMs ?? Li();
60
- i ??= new Promise((t) => {
61
- e.close(() => {
62
- t();
63
- });
64
- }), e.closeIdleConnections();
65
- let a = Date.now() + n;
66
- for (; r > 0 && Date.now() < a;) await Ri(25), e.closeIdleConnections();
67
- e.closeIdleConnections();
68
- }, o = async () => {
69
- i ??= new Promise((t) => {
70
- e.close(() => {
71
- t();
72
- });
73
- });
74
- for (let e of t) if (n.has(e)) try {
75
- e.write(Buffer.from([
76
- 136,
77
- 2,
78
- 3,
79
- 233
80
- ]));
81
- } catch {}
82
- else e.destroy();
83
- for (let e = 0; t.size > 0 && e < 250; e += 25) await Ri(25);
84
- for (let e of t) e.destroy();
85
- await i;
86
- };
87
- return {
88
- activeRequests: () => r,
89
- drainRequests: a,
90
- finish: o,
91
- drain: async (e = {}) => {
92
- await a(e), await o();
93
- }
94
- };
95
- }, Bi = "/_voltro/admin/import", Vi = "/_voltro/admin/export", Q = (e, t) => ({
96
- status: e,
97
- contentType: "application/json; charset=utf-8",
98
- body: JSON.stringify(t)
99
- }), Hi = (e) => {
100
- let t = e.authorization ?? e.Authorization, n = t ? /^Bearer\s+(.+)$/i.exec(t) : null;
101
- return n ? n[1] : null;
102
- }, Ui = (e, t) => yi(vi("sha256").update(e).digest(), vi("sha256").update(t).digest()), Wi = (e, t) => {
103
- if (e.method.toUpperCase() !== "POST") return Q(405, { error: "method not allowed" });
104
- if (!t || t.length < 16) return Q(503, { error: "data transfer misconfigured (no/weak secret)" });
105
- let n = Hi(e.headers);
106
- return !n || !Ui(n, t) ? Q(401, { error: "unauthorized" }) : null;
107
- }, Gi = /^[A-Za-z0-9_-]{8,64}$/, Ki = (e) => Gi.test(e), qi = () => F.join(W.tmpdir(), "voltro-import-uploads"), Ji = (e) => F.join(qi(), e), Yi = (e) => F.join(Ji(e), "archive.bin"), Xi = (e) => F.join(Ji(e), "meta.json"), Zi = async (e = Date.now()) => {
108
- let t = 0;
109
- try {
110
- for (let n of await Z.readdir(qi())) {
111
- let r = await Z.stat(Ji(n)).catch(() => null);
112
- r !== null && (e - r.mtimeMs <= 864e5 || (await Z.rm(Ji(n), {
113
- recursive: !0,
114
- force: !0
115
- }).catch(() => void 0), t++));
116
- }
117
- } catch {}
118
- return t;
119
- }, Qi = async (e) => {
120
- if (!Ki(e)) return {
121
- bytes: 0,
122
- key: null
123
- };
124
- let t = await Z.stat(Yi(e)).catch(() => null);
125
- if (t === null) return {
126
- bytes: 0,
127
- key: null
128
- };
129
- let n = await Z.readFile(Xi(e), "utf8").then((e) => JSON.parse(e), () => ({}));
130
- return {
131
- bytes: t.size,
132
- key: n.key ?? null
133
- };
134
- }, $i = async (e) => {
135
- if (!Ki(e.id)) return {
136
- reason: "bad-id",
137
- message: `upload id must match ${String(Gi)}`
138
- };
139
- let t = await Qi(e.id);
140
- return t.key !== null && t.key !== e.key ? {
141
- reason: "key-mismatch",
142
- message: "this upload id already holds a different bundle. Use a new upload id, or delete the partial upload."
143
- } : e.offset === t.bytes ? (await Z.mkdir(Ji(e.id), { recursive: !0 }), t.key === null && await Z.writeFile(Xi(e.id), JSON.stringify({
144
- key: e.key,
145
- startedAt: (/* @__PURE__ */ new Date()).toISOString()
146
- })), await new Promise((t, n) => {
147
- let r = On(Yi(e.id), { flags: "a" });
148
- r.on("error", n), r.on("finish", () => t()), r.end(Buffer.from(e.bytes));
149
- }), { total: t.bytes + e.bytes.byteLength }) : {
150
- reason: "offset-mismatch",
151
- message: `chunk starts at ${e.offset} but the server holds ${t.bytes} byte(s)`,
152
- expectedOffset: t.bytes
153
- };
154
- }, ea = async (e) => {
155
- let t = await Z.stat(Yi(e));
156
- return {
157
- path: Yi(e),
158
- bytes: t.size
159
- };
160
- }, ta = async (e) => {
161
- Ki(e) && await Z.rm(Ji(e), {
162
- recursive: !0,
163
- force: !0
164
- }).catch(() => void 0);
165
- }, na = I({ scope: "voltro:admin-import" }), ra = "VBUNDLE2", ia = async function* (e) {
166
- yield e;
167
- }, aa = (e) => async (t) => {
168
- let n = Wi(t, e.secret);
169
- if (n) return n;
170
- let r = t.headers["x-import-mode"], i = t.headers["x-import-on-conflict"], a = t.headers["x-import-atomic"], o = a === "0" || a === "false" ? !1 : a === "1" || a === "true" || r === "replace", s = t.headers["x-import-force"] === "1" || t.headers["x-import-force"] === "true", c = t.headers["x-import-dry-run"] === "1" || t.headers["x-import-dry-run"] === "true", l = (t.headers["x-import-tables"] ?? "").split(",").map((e) => e.trim()).filter(Boolean), u = t.headers["x-import-upload-id"], d;
171
- if (u !== void 0 && u !== "") {
172
- if (Zi(), t.headers["x-import-probe"] === "1") return Q(200, {
173
- uploadId: u,
174
- bytes: (await Qi(u)).bytes
175
- });
176
- let e = t.headers["x-import-upload-key"] ?? "", n = Number(t.headers["x-import-chunk-offset"] ?? "0");
177
- if (e === "" || !Number.isFinite(n) || n < 0) return Q(400, { error: "a chunked upload needs x-import-upload-key and a numeric x-import-chunk-offset" });
178
- let r = await $i({
179
- id: u,
180
- key: e,
181
- offset: n,
182
- bytes: t.rawBody
183
- });
184
- if ("reason" in r) return na.warn("admin.import chunk refused", {
185
- uploadId: u,
186
- reason: r.reason
187
- }), Q(409, {
188
- error: "chunk refused",
189
- reason: r.reason,
190
- message: r.message,
191
- ...r.expectedOffset === void 0 ? {} : { expectedOffset: r.expectedOffset }
192
- });
193
- if (t.headers["x-import-chunk-final"] !== "1") return Q(202, {
194
- uploadId: u,
195
- bytes: r.total
196
- });
197
- d = (await ea(u)).path;
198
- }
199
- let ee = t.rawBody.byteLength >= 8 && Buffer.from(t.rawBody.subarray(0, 8)).toString("latin1") === ra, f, p;
200
- if (d !== void 0) {
201
- let { createReadStream: e } = await import("node:fs");
202
- f = e(d), p = "chunked";
203
- } else if (ee) f = ia(t.rawBody), p = "upload";
204
- else {
205
- let n;
206
- try {
207
- n = JSON.parse(Buffer.from(t.rawBody).toString("utf8") || "{}");
208
- } catch {
209
- return Q(400, { error: "body must be a packed bundle archive or { bundleKey } JSON" });
210
- }
211
- if (typeof n.bundleKey != "string" || !n.bundleKey) return Q(400, { error: "body.bundleKey (string) is required for the storage transport" });
212
- if (!e.openArchive) return Q(501, { error: "storage transport not configured on this instance" });
213
- f = e.openArchive(n.bundleKey), p = "storage";
214
- }
215
- let te = await import("node:os"), ne = await import("node:fs/promises"), m = await import("node:path"), h = await ne.mkdtemp(m.join(te.tmpdir(), "voltro-admin-import-"));
216
- try {
217
- e.assetSink ? await Fi(f, {
218
- dir: h,
219
- blobs: e.assetSink
220
- }) : await Ii(f, h);
221
- let t = await H.runPromiseExit(Mi({
222
- store: e.store,
223
- bundleDir: h,
224
- ...r ? { mode: r } : {},
225
- ...i ? { onConflict: i } : {},
226
- ...o ? { atomic: o } : {},
227
- ...c ? { dryRun: c } : {},
228
- ...l.length > 0 ? { tables: l } : {},
229
- ...e.snapshot ? { targetSnapshot: e.snapshot } : {},
230
- force: s,
231
- onWarn: (e) => na.warn("admin.import", { message: e }),
232
- ...e.assetSink ? { assetsAlreadyRestored: !0 } : {}
233
- }));
234
- if (t._tag === "Failure") {
235
- let e = t.cause._tag === "Fail" ? t.cause.error : void 0;
236
- if (e && e._tag === "SchemaDriftError") {
237
- let t = e;
238
- return na.warn("admin.import refused (schema drift)", {
239
- transport: p,
240
- bundle: t.bundleFingerprint.slice(0, 16),
241
- target: t.targetFingerprint.slice(0, 16)
242
- }), Q(409, {
243
- error: "schema drift",
244
- bundleFingerprint: t.bundleFingerprint,
245
- targetFingerprint: t.targetFingerprint,
246
- diff: t.diff,
247
- 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."
248
- });
249
- }
250
- let n = typeof e?.reason == "string" ? e.reason : void 0;
251
- if (n !== void 0 && e._tag === "ImportModeError") return na.warn("admin.import refused (mode)", {
252
- transport: p,
253
- mode: e.mode
254
- }), Q(409, {
255
- error: "import mode refused",
256
- mode: e.mode,
257
- message: n
258
- });
259
- throw Error(n ?? String(e?.message ?? e ?? "import failed"));
260
- }
261
- let n = t.value, a = n.manifest.tables.reduce((e, t) => e + t.rowCount, 0), u = n.rowsWritten;
262
- return na.info(c ? "admin.import (dry run — nothing written)" : "admin.import", {
263
- transport: p,
264
- tables: n.tablesWritten,
265
- rows: u,
266
- carried: a,
267
- mode: r ?? "upsert",
268
- atomic: o,
269
- ...n.tablesSkipped > 0 ? {
270
- skippedTables: n.tablesSkipped,
271
- skippedRows: n.rowsSkipped
272
- } : {}
273
- }), c || e.refreshSubscriptions?.(`data import: ${n.tablesWritten} table(s), mode ${r ?? "upsert"}`), Q(200, {
274
- tables: n.tablesWritten,
275
- rows: u,
276
- carried: a,
277
- transport: p,
278
- ...n.tablesSkipped > 0 ? {
279
- skippedTables: n.tablesSkipped,
280
- skippedRows: n.rowsSkipped,
281
- fullyResumed: n.fullyResumed
282
- } : {},
283
- ...c ? {
284
- dryRun: !0,
285
- wrote: !1
286
- } : {}
287
- });
288
- } catch (e) {
289
- return na.warn("admin.import failed", {
290
- transport: p,
291
- error: e?.message ?? String(e)
292
- }), Q(500, {
293
- error: "import failed",
294
- message: e?.message ?? String(e)
295
- });
296
- } finally {
297
- await ne.rm(h, {
298
- recursive: !0,
299
- force: !0
300
- }), u !== void 0 && u !== "" && d !== void 0 && await ta(u);
301
- }
302
- }, oa = I({ scope: "voltro:admin-export" }), sa = async (e) => {
303
- let t = [];
304
- for await (let n of e) t.push(Buffer.from(n));
305
- return new Uint8Array(Buffer.concat(t));
306
- }, ca = (e) => typeof e.tenant == "string" && e.tenant ? {
307
- kind: "tenant",
308
- tenantId: e.tenant
309
- } : Array.isArray(e.tables) && e.tables.length ? {
310
- kind: "tables",
311
- tables: e.tables.filter((e) => typeof e == "string")
312
- } : { kind: "all" }, la = (e) => async (t) => {
313
- let n = Wi(t, e.secret);
314
- if (n) return n;
315
- let r;
316
- try {
317
- r = JSON.parse(Buffer.from(t.rawBody).toString("utf8") || "{}");
318
- } catch {
319
- return Q(400, { error: "body must be JSON: { profile?, tenant?, tables?, consistency?, compression?, bundleKey? }" });
320
- }
321
- let i = {};
322
- if (typeof r.profile == "string" && r.profile) {
323
- if (!e.loadProfile) return Q(501, { error: "server-side profiles not configured on this instance" });
324
- try {
325
- i = await e.loadProfile(r.profile);
326
- } catch (e) {
327
- return Q(400, {
328
- error: `profile '${r.profile}' could not be loaded`,
329
- message: e?.message ?? String(e)
330
- });
331
- }
332
- }
333
- let a = r.consistency === "snapshot" ? "snapshot" : i.consistency ?? "live", o = (typeof r.compression == "string" ? r.compression : void 0) ?? i.compression, s = i.scope ?? ca(r), c = typeof r.bundleKey == "string" && r.bundleKey.length > 0, l = r.assets === !0 && e.assetSource ? { blobs: e.assetSource } : {}, u = await import("node:os"), d = await import("node:fs/promises"), ee = await import("node:path"), f = await d.mkdtemp(ee.join(u.tmpdir(), "voltro-admin-export-"));
334
- try {
335
- let t = await H.runPromise(ji({
336
- store: e.store,
337
- snapshot: e.snapshot,
338
- dialect: e.dialect,
339
- outDir: f,
340
- ...i.subset ? { subset: i.subset } : {
341
- scope: s,
342
- ...e.tenantTables && e.tenantTables.length > 0 ? { tenantTables: e.tenantTables } : {}
343
- },
344
- consistency: a,
345
- ...o ? { compression: o } : {},
346
- ...i.masking ? { masking: i.masking } : {}
347
- })), n = t.tables.reduce((e, t) => e + t.rowCount, 0), u = t.masking?.transformed.length ?? 0;
348
- if (c) {
349
- if (!e.putArchive) return Q(501, { error: "storage transport not configured on this instance" });
350
- let i = r.bundleKey;
351
- return await e.putArchive(i, () => Ai({
352
- dir: f,
353
- ...l
354
- })), oa.info("admin.export", {
355
- transport: "storage",
356
- tables: t.tables.length,
357
- rows: n,
358
- masked: u,
359
- bundleKey: i
360
- }), Q(200, {
361
- bundleKey: i,
362
- tables: t.tables.length,
363
- rows: n,
364
- masked: u,
365
- transport: "storage"
366
- });
367
- }
368
- let d = await sa(Ai({
369
- dir: f,
370
- ...l
371
- }));
372
- return oa.info("admin.export", {
373
- transport: "download",
374
- tables: t.tables.length,
375
- rows: n,
376
- masked: u,
377
- bytes: d.byteLength
378
- }), {
379
- status: 200,
380
- contentType: "application/octet-stream",
381
- body: d,
382
- headers: {
383
- "x-export-tables": String(t.tables.length),
384
- "x-export-rows": String(n),
385
- "x-export-masked": String(u)
386
- }
387
- };
388
- } catch (e) {
389
- return oa.warn("admin.export failed", { error: e?.message ?? String(e) }), Q(500, {
390
- error: "export failed",
391
- message: e?.message ?? String(e)
392
- });
393
- } finally {
394
- await d.rm(f, {
395
- recursive: !0,
396
- force: !0
397
- });
398
- }
399
- }, ua = (e, t, n = {}) => (async function* () {
400
- let r = await H.runPromise(pi(e, t).pipe(H.timeout(n.openTimeout ?? "30 seconds"))), i = await hi(r.stream), a = n.stallMs ?? 12e4, o, s = () => {
401
- o && clearTimeout(o), o = setTimeout(() => i.destroy(/* @__PURE__ */ Error(`storage read stalled for ${a}ms reading '${t}'`)), a);
402
- };
403
- try {
404
- s();
405
- for await (let e of i) s(), yield e instanceof Uint8Array ? e : new Uint8Array(e);
406
- } finally {
407
- o && clearTimeout(o), i.destroy();
408
- }
409
- })(), da = {
410
- get: async () => void 0,
411
- set: async () => {},
412
- setWithTags: async () => {},
413
- remove: async () => !1,
414
- has: async () => !1,
415
- clear: async () => {},
416
- invalidateTag: async () => 0,
417
- wrap: async (e, t, n) => n()
418
- }, fa = async (e) => {
419
- Ut(e.appProcedures ?? e.discovered, {
420
- defaultDeny: e.security?.defaultDeny ?? !0,
421
- commandHint: "`voltro serve`"
422
- }), ei({
423
- dataStore: e.store,
424
- schemaRegistry: e.schemaRegistry
425
- });
426
- let t = (e.discovered.budgets?.length ?? 0) > 0, n, r = new or({
427
- store: e.store,
428
- ...e.snapshotCache ? { cache: e.snapshotCache } : {},
429
- ...e.reactive === void 0 ? {} : { reactive: e.reactive },
430
- ...t ? { recordCost: (e) => n?.record(e) } : {},
431
- recordDelivery: (e) => Jr({
432
- label: e.label,
433
- kind: e.kind,
434
- durationMs: e.durationMs,
435
- rowCount: e.rowCount
436
- })
437
- }), i = e.cache ?? da, a = e.kv ?? Kr, o, c = () => void 0, l, ee, f, p, te, ne, m, ce = ae({
438
- store: e.store,
439
- warn: (e, t) => {
440
- process.stderr.write(`[workflow] ${e} ${JSON.stringify(t)}\n`);
441
- }
442
- }), le = ce.remember, ue = ce.resolve, de = v({
443
- authority: e.authority,
444
- getStore: () => e.store
445
- }), y = (e.discovered.workflows?.length ?? 0) > 0 ? Fr(() => o) : void 0, pe = (e.discovered.workflows?.length ?? 0) > 0 || (e.discovered.eventTriggers?.length ?? 0) > 0, he = pe || (e.discovered.workflowWorkers?.length ?? 0) > 0 || e.scheduleCoordination === "cluster", ge = e.tenantIsolation === "namespace", _e = (e.log ?? I({ scope: "voltro:serve" })).child("webhooks"), ve, xe, b = e.discovered.webhooks;
446
- if (b && b.outgoing.length > 0 && e.workflowEngineLayer !== void 0) {
447
- e.workflowEngineLayer;
448
- let t = w({
449
- store: e.store,
450
- schemaRegistry: e.schemaRegistry,
451
- cache: i,
452
- kv: a
453
- }), n = b.outgoing.map((e) => e.descriptor);
454
- xe = Ci.toLayer(bi(t, { events: n })), ve = xi(t, async (e) => {
455
- let t = f;
456
- if (t === void 0) {
457
- _e.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.", {
458
- deliveryId: e.deliveryId,
459
- targetId: e.targetId
460
- });
461
- return;
462
- }
463
- t.runPromise(Ci.execute(e)).catch((t) => {
464
- _e.error("deliverWebhook workflow crashed", {
465
- deliveryId: e.deliveryId,
466
- targetId: e.targetId
467
- }, t);
468
- });
469
- }, { events: n });
470
- }
471
- let Se = /* @__PURE__ */ new Map();
472
- if (b) for (let e of b.incoming) {
473
- let t = e.descriptor.path ?? Si(e.descriptor.id), n = `VOLTRO_WEBHOOK_SECRET_${e.descriptor.id.toUpperCase().replace(/[^A-Z0-9]/g, "_")}`, r = Ti(e.descriptor, {
474
- resolveSecret: async () => process.env[n] ?? null,
475
- resolveWorkflows: () => y === void 0 ? void 0 : Wr(y, {
476
- traceId: `incoming:${e.descriptor.id}`,
477
- source: `incoming:${e.descriptor.id}`
478
- }),
479
- log: (e) => {
480
- let t = {
481
- webhookId: e.webhookId,
482
- status: e.status,
483
- signatureOk: String(e.signatureOk),
484
- idempotency: e.idempotency,
485
- durationMs: e.durationMs
486
- };
487
- e.status >= 500 ? _e.error("incoming delivery failed", t) : e.status >= 400 ? _e.warn("incoming delivery rejected", t) : _e.info("incoming delivery handled", t);
488
- }
489
- });
490
- Se.set(t, { handle: r });
491
- }
492
- wr(), X((t) => Tr(e.store, t.subjectId, t.resourceType, t.resourceId)) || I({ scope: "voltro:serve" }).info("policy guards: using the app-registered tuple source");
493
- let Ce = [], we = [...e.discovered.outboxHandlers ?? [], ...vn((b?.outgoing.length ?? 0) + (b?.incoming.length ?? 0) + (b?.providers.length ?? 0), []) ? [{
494
- file: "<framework>/webhooks",
495
- id: "voltro-webhook-emit",
496
- definition: wi(() => ve)
497
- }] : []], Te = we.length > 0 ? Fe({
498
- handlers: we,
499
- store: e.store,
500
- log: (e.log ?? I({ scope: "voltro:serve" })).child("outbox"),
501
- onChange: (t) => e.store.onChange((e) => t({
502
- table: e.table,
503
- op: e.op
504
- })),
505
- onShutdown: (e) => {
506
- Ce.push(e);
507
- }
508
- }) : void 0, x = _({
509
- definitions: (e.discovered.connections ?? []).map((e) => e.definition),
510
- store: e.store,
511
- publicUrl: Ct(e.port ?? 4e3),
512
- log: (e.log ?? I({ scope: "voltro:serve" })).child("connections")
513
- });
514
- lt({
515
- events: e.discovered.events ?? [],
516
- rpcTags: [
517
- ...e.discovered.queries.map((e) => e.descriptor.name),
518
- ...e.discovered.mutations.map((e) => e.descriptor.name),
519
- ...e.discovered.actions.map((e) => e.descriptor.name),
520
- ...(e.discovered.streams ?? []).map((e) => e.descriptor.name)
521
- ]
522
- });
523
- let Ee = (e.log ?? I({ scope: "voltro:serve" })).child("events"), ke = e.broadcastNamespace ?? tt(e.plugins, void 0), je = Re(e.plugins, ke, Ee), Ne = e.membership?.instanceId ?? process.env.POD_NAME ?? process.env.HOSTNAME ?? `serve-${process.pid}`, Ie = e.membership ?? Nt(e.plugins, {
524
- instanceId: Ne,
525
- namespace: ke,
526
- meta: { mode: "serve" },
527
- logger: Ee
528
- }), S = fe({
529
- events: e.discovered.events ?? [],
530
- origin: Ne,
531
- ...je.publishRemote === void 0 ? {} : { publishRemote: je.publishRemote }
532
- }), ze = (e.discovered.events ?? []).length > 0 ? await je.attach(S.bus) : null, Be = Dt({
533
- store: e.store,
534
- schemaRegistry: e.schemaRegistry,
535
- cache: i,
536
- kv: a,
537
- ...ve === void 0 ? {} : { webhooksService: ve },
538
- ...y === void 0 ? {} : { workflowsProxy: y },
539
- eventTriggers: e.discovered.eventTriggers ?? [],
540
- namespaceIsolationOn: ge,
541
- ...e.ensureTenantProvisioned === void 0 ? {} : { ensureTenantProvisioned: e.ensureTenantProvisioned },
542
- ...e.resolveResidentStore === void 0 ? {} : { resolveResidentStore: e.resolveResidentStore },
543
- ...Te === void 0 ? {} : { outbox: { nudge: Te.nudge } },
544
- ...x.active ? { connections: { registry: x.registry } } : {},
545
- eventBus: S.bus
546
- }), Ve = U.succeed(ir, h), He = U.succeed(sr, Ge), Ue = U.succeed(K, Ht), We = U.succeed(cr, zt), Ke = (t, n) => {
547
- let r = t.pipe(H.provide(Pr(n)));
548
- return (e.baseLayer ? r.pipe(H.provide(e.baseLayer)) : r).pipe(H.provide(Ve)).pipe(H.provide(He)).pipe(H.provide(Ue)).pipe(H.provide(We));
549
- }, Je = (e, t) => {
550
- let n = Ke(e, t);
551
- return Qr(n);
552
- }, Xe = xn(), Ze = St(e.plugins ?? [], Xe), Qe = d({
553
- plugins: e.plugins ?? [],
554
- metrics: Xe,
555
- log: e.log ?? I({ scope: "voltro:serve" })
556
- }), $e = g(e.plugins ?? [], Xe), et = e.security?.defaultDeny ?? !0, nt = Lr({
557
- store: e.store,
558
- defaultDeny: et,
559
- recordMetric: (e) => {
560
- Xe.record(e);
561
- },
562
- ...Ze.mutation === void 0 ? {} : { interceptor: Ze.mutation },
563
- buildContext: (e, t, n) => Be(e, t, n),
564
- runEffect: Je,
565
- undoCapture: be()
566
- }), rt = Le();
567
- {
568
- let t = s();
569
- t !== void 0 && (e.log ?? I({ scope: "voltro:serve" })).info(t);
570
- }
571
- let it = Pe({
572
- store: e.store,
573
- ...e.approvals === void 0 ? {} : { defaultExpiryMs: e.approvals.defaultExpiryMs }
574
- }), ot = Er({
575
- defaultDeny: et,
576
- buildContext: (e) => Be(e),
577
- runEffect: Je,
578
- recordMetric: (e) => {
579
- Xe.record(e);
580
- },
581
- ...Ze.action === void 0 ? {} : { interceptor: Ze.action }
582
- }), st = Br({
583
- tenantScopedTables: e.tenantScopedTables,
584
- softDeleteScopedTables: e.softDeleteScopedTables
585
- }), ct = {
586
- defaultDeny: et,
587
- buildContext: (e) => Be(e),
588
- finalize: (e, t) => st(e, t.subject),
589
- provideEffect: Ke,
590
- ...Ze.query === void 0 ? {} : { interceptor: Ze.query }
591
- }, T = zr(ct), dt = Rr({
592
- ...ct,
593
- queryRows: (t, n) => e.store.query(t).then((e) => ai(t.table, e, n.subject))
594
- }), ft = Vr({
595
- ...ct,
596
- subscribeDescriptor: (e, t, n) => r.subscribe(e, t, n),
597
- subscribeComputed: (e, t, n) => r.subscribeComputed(e, t, n)
598
- }), E = (e) => e.filter((e) => Pn(e.descriptor)), D = {};
599
- for (let t of [
600
- ...E(e.discovered.queries),
601
- ...rt.queries,
602
- ...it.queries,
603
- ...x.queries
604
- ]) D[t.descriptor.name] = (e) => J(T(t, e), r, `subscription.${t.descriptor.name}`, void 0, void 0, Y(t, e));
605
- for (let t of [
606
- ...E(e.discovered.mutations),
607
- ...rt.mutations,
608
- ...it.mutations,
609
- ...x.mutations
610
- ]) {
611
- let n = Ir(t.descriptor.output);
612
- D[t.descriptor.name] = (r) => q(async (e, n) => nt(t, e, n), r, `mutation.${t.descriptor.name}`, n, e.idempotency, z(t.descriptor, "mutation"));
613
- }
614
- for (let t of [...E(e.discovered.actions), ...x.actions]) {
615
- let n = Ir(t.descriptor.output);
616
- D[t.descriptor.name] = (r) => q(async (e, n) => ot(t, e, n), r, `action.${t.descriptor.name}`, n, e.idempotency, z(t.descriptor, "action"));
617
- }
618
- let mt = () => `public-${Math.random().toString(36).slice(2, 10)}`, ht = [
619
- ...e.discovered.queries.filter((e) => e.descriptor.publicApi !== void 0).map((e) => ({
620
- descriptor: e.descriptor,
621
- invoke: (t, n) => dt(e, t, {
622
- subject: n.subject,
623
- traceId: mt()
624
- }),
625
- subscribe: (t, n, r) => ft(e, t, {
626
- subject: n.subject,
627
- traceId: mt()
628
- }, r)
629
- })),
630
- ...e.discovered.mutations.filter((e) => e.descriptor.publicApi !== void 0).map((e) => ({
631
- descriptor: e.descriptor,
632
- invoke: (t, n) => nt(e, t, {
633
- subject: n.subject,
634
- traceId: mt()
635
- })
636
- })),
637
- ...e.discovered.actions.filter((e) => e.descriptor.publicApi !== void 0).map((e) => ({
638
- descriptor: e.descriptor,
639
- invoke: (t, n) => ot(e, t, {
640
- subject: n.subject,
641
- traceId: mt()
642
- })
643
- }))
644
- ], gt = {
645
- candidates: ie({
646
- queries: e.discovered.queries,
647
- mutations: e.discovered.mutations,
648
- actions: e.discovered.actions,
649
- descriptorOf: (e) => e.descriptor,
650
- runQuery: (e, t, n) => Promise.resolve(dt(e, t, n)),
651
- runMutation: (e, t, n) => Promise.resolve(nt(e, t, n)),
652
- runAction: (e, t, n) => Promise.resolve(ot(e, t, n))
653
- }),
654
- policy: e.agents?.tools ?? {},
655
- mcpEnabled: e.agents?.mcp === !0,
656
- resolveSubject: (t) => e.resolveSubject(t, -1).then((e) => e.subject)
657
- }, O = At({
658
- ...e.restRoutes === void 0 ? {} : { restRoutes: e.restRoutes },
659
- publicApiEntries: ht,
660
- store: e.store,
661
- resolveSubject: (t) => e.resolveSubject(t, -1).then((e) => e.subject),
662
- ...e.idempotency === void 0 ? {} : { idempotency: e.idempotency },
663
- log: e.log ?? I({ scope: "voltro:serve" })
664
- }), vt = e.dataTransferSecret ?? process.env.VOLTRO_DATA_TRANSFER_SECRET, yt = vt && vt.length >= 16 ? [{
665
- method: "POST",
666
- path: Bi,
667
- handle: aa({
668
- secret: vt,
669
- store: e.store,
670
- ...e.dataTransferSnapshot ? { snapshot: e.dataTransferSnapshot } : {},
671
- assetSink: Ni(di()),
672
- openArchive: (e) => ua(di(), e),
673
- refreshSubscriptions: (e) => {
674
- r.refreshAll(e);
675
- }
676
- })
677
- }, {
678
- method: "POST",
679
- path: Vi,
680
- handle: la({
681
- secret: vt,
682
- store: e.store,
683
- snapshot: e.dataTransferSnapshot ?? { tables: [] },
684
- dialect: e.dataTransferDialect ?? "memory",
685
- tenantTables: [...e.tenantScopedTables],
686
- loadProfile: Tn,
687
- assetSource: Pi(di(), e.store),
688
- putArchive: async (e, t) => {
689
- let { Readable: n } = await import("node:stream"), r = di(), i = fi("storage", () => n.from(t()));
690
- await H.runPromise(mi(r, e, i, { contentType: "application/octet-stream" }));
691
- }
692
- })
693
- }] : [], bt = [
694
- ...e.httpRoutes ?? [],
695
- ...O.httpRoutes,
696
- ...yt,
697
- ...x.httpRoutes
698
- ];
699
- Object.assign(D, S.handlers);
700
- for (let t of E(e.discovered.streams ?? [])) D[t.descriptor.name] = (n) => hr((r) => ci(r, (r) => {
701
- let i = Be(r), a = t.executor(n, i);
702
- if (H.isEffect(a)) {
703
- let t = a.pipe(H.provide(Pr(i.store)));
704
- return (e.baseLayer ? t.pipe(H.provide(e.baseLayer)) : t).pipe(H.provide(Ve)).pipe(H.provide(He)).pipe(H.provide(Ue)).pipe(H.provide(We));
705
- }
706
- return typeof a == "object" && a && typeof a.then == "function" ? H.promise(() => a) : a;
707
- }), `stream.${t.descriptor.name}`);
708
- for (let t of e.discovered.workflows ?? []) D[t.definition.name] = (e) => q(async (e, n) => {
709
- let r = n;
710
- return Wr(y, {
711
- subject: r.subject,
712
- traceId: r.traceId,
713
- source: "workflow-rpc"
714
- }).start(t.definition.name, e);
715
- }, e, `workflow.${t.definition.name}`);
716
- pe && (D[Bn.name] = (e) => J(T({
717
- descriptor: Bn,
718
- executor: (e) => {
719
- let t = e.id;
720
- return {
721
- table: "_voltro_workflow_runs",
722
- order: [{
723
- column: "startedAt",
724
- direction: "desc"
725
- }],
726
- predicate: rr(G("id", t), G("executionId", t)),
727
- take: 1,
728
- skip: void 0,
729
- projection: void 0
730
- };
731
- }
732
- }, e), r, `subscription.${Bn.name}`), D[Hn.name] = (e) => J(T({
733
- descriptor: Hn,
734
- executor: (e) => {
735
- let t = e, n = [...t.tag === void 0 ? [] : [G("tag", t.tag)], ...t.status === void 0 ? [] : [G("status", t.status)]], r = Number.isFinite(t.limit) && t.limit !== void 0 ? Math.min(Math.max(Math.floor(t.limit), 1), 500) : 100;
736
- return {
737
- table: "_voltro_workflow_runs",
738
- order: [{
739
- column: "startedAt",
740
- direction: "desc"
741
- }],
742
- predicate: n.length === 0 ? void 0 : n.length === 1 ? n[0] : er(...n),
743
- take: r,
744
- skip: void 0,
745
- projection: void 0
746
- };
747
- }
748
- }, e), r, `subscription.${Hn.name}`), D[Vn.name] = (e) => J(T({
749
- descriptor: Vn,
750
- executor: (e) => {
751
- let t = e.runId;
752
- return {
753
- table: "_voltro_workflow_run_steps",
754
- order: [{
755
- column: "startedAt",
756
- direction: "asc"
757
- }],
758
- predicate: G("runId", t),
759
- take: 1e3,
760
- skip: void 0,
761
- projection: void 0
762
- };
763
- }
764
- }, e), r, `subscription.${Vn.name}`), D[zn.name] = (e) => J(T({
765
- descriptor: zn,
766
- executor: (e) => {
767
- let t = e.runId;
768
- return {
769
- table: "_voltro_workflow_run_events",
770
- order: [{
771
- column: "occurredAt",
772
- direction: "asc"
773
- }],
774
- predicate: G("runId", t),
775
- take: 1e3,
776
- skip: void 0,
777
- projection: void 0
778
- };
779
- }
780
- }, e), r, `subscription.${zn.name}`), D[B.name] = (e) => J(T({
781
- descriptor: B,
782
- executor: (e) => {
783
- let t = e;
784
- return {
785
- table: "_voltro_workflow_events",
786
- order: [{
787
- column: "occurredAt",
788
- direction: "desc"
789
- }],
790
- predicate: t.name === void 0 ? void 0 : G("name", t.name),
791
- take: Math.max(1, Math.min(500, t.limit ?? 100)),
792
- skip: void 0,
793
- projection: void 0
794
- };
795
- }
796
- }, e), r, `subscription.${B.name}`), D[V.name] = (e) => J(T({
797
- descriptor: V,
798
- executor: (e) => {
799
- let t = e.eventId;
800
- return {
801
- table: "_voltro_workflow_event_deliveries",
802
- order: [{
803
- column: "createdAt",
804
- direction: "asc"
805
- }],
806
- predicate: G("eventId", t),
807
- take: 500,
808
- skip: void 0,
809
- projection: void 0
810
- };
811
- }
812
- }, e), r, `subscription.${V.name}`), D[Ln.name] = (t) => q(async (t, n) => {
813
- let r = t;
814
- return await _t(e.store, n.subject, { executionId: r.executionId }), await y.cancel(r.workflowName, r.executionId), await Ft(r.workflowName, r.executionId, "workflow.cancel"), { ok: !0 };
815
- }, t, `action.${Ln.name}`), D[Rn.name] = (t) => q(async (t, n) => {
816
- let r = t;
817
- return await _t(e.store, n.subject, { executionId: r.executionId }), await y.resume(r.workflowName, r.executionId), { ok: !0 };
818
- }, t, `action.${Rn.name}`), D[Un.name] = (t) => q(async (t, n) => {
819
- let r = t;
820
- return await _t(e.store, n.subject, { id: r.id }), y.signal({ id: r.id }, r.signalName, r.payload);
821
- }, t, `action.${Un.name}`), D[Wn.name] = (t) => q(async (t, n) => {
822
- let r = t;
823
- return await _t(e.store, n.subject, { id: r.id }), y.update({ id: r.id }, r.updateName, r.payload, r.timeoutMs === void 0 ? void 0 : { timeoutMs: r.timeoutMs });
824
- }, t, `action.${Wn.name}`));
825
- let xt = [
826
- ...E(e.discovered.queries).map((e) => R(e.descriptor)),
827
- ...E(e.discovered.mutations).map((e) => Fn(e.descriptor)),
828
- ...E(e.discovered.actions).map((e) => L(e.descriptor)),
829
- ...rt.queries.map((e) => R(e.descriptor)),
830
- ...rt.mutations.map((e) => Fn(e.descriptor)),
831
- ...it.queries.map((e) => R(e.descriptor)),
832
- ...it.mutations.map((e) => Fn(e.descriptor)),
833
- ...x.queries.map((e) => R(e.descriptor)),
834
- ...x.mutations.map((e) => Fn(e.descriptor)),
835
- ...x.actions.map((e) => L(e.descriptor)),
836
- ...E(e.discovered.streams ?? []).map((e) => In(e.descriptor)),
837
- ...S.rpcs,
838
- ...(e.discovered.workflows ?? []).map((e) => li(e.definition)),
839
- ...pe ? [
840
- R(Bn),
841
- R(Hn),
842
- R(Vn),
843
- R(zn),
844
- R(B),
845
- R(V),
846
- L(Ln),
847
- L(Rn),
848
- L(Un),
849
- L(Wn)
850
- ] : []
851
- ], wt = Qn.make(...xt).middleware(jn).middleware(Mn), Et = Mr({ resolveSubject: ({ headers: t, clientId: n }) => e.resolveSubject(t, n) }), kt = e.dormancyTenantId ?? ar, jt = e.dormancy === "sleep" ? {
852
- register: (t, n, r) => Xr(e.store, {
853
- tenantId: r ?? kt,
854
- kind: "workflow",
855
- refId: t,
856
- wakeAt: n
857
- }),
858
- cancel: (t, n) => _r(e.store, {
859
- tenantId: n ?? kt,
860
- kind: "workflow",
861
- refId: t
862
- }).then(() => {})
863
- } : void 0, k = he ? await import("@voltro/workflow") : void 0, A = k?.makeWorkflowRunRecorder({
864
- store: e.store,
865
- ...e.workflowRecording === void 0 ? {} : { recording: e.workflowRecording },
866
- ...jt === void 0 ? {} : { wakeups: jt }
867
- }), Pt = async (t, n) => {
868
- await k.closeWorkflowChildrenForParent({
869
- store: e.store,
870
- parentExecutionId: t,
871
- parentStatus: n,
872
- recorder: A,
873
- log: { warn: (e, t) => {
874
- process.stderr.write(`[workflow] ${e} ${t ? JSON.stringify(t) : ""}\n`);
875
- } },
876
- interruptChild: async (t, n) => {
877
- let r = (e.discovered.workflows ?? []).find((e) => e.definition.name === t);
878
- if (!r) throw Error(`Unknown child workflow: ${t}`);
879
- if (!f) throw Error("Workflow runtime is not ready");
880
- await f.runPromise(r.definition.interrupt(n));
881
- }
882
- });
883
- }, Ft = async (t, n, r) => {
884
- let i = (await e.store.query({
885
- table: "_voltro_workflow_runs",
886
- order: [],
887
- predicate: G("executionId", n),
888
- projection: void 0,
889
- skip: void 0,
890
- take: 1
891
- }))[0];
892
- if (i === void 0) return;
893
- let a = await e.store.update("_voltro_workflow_runs", i.id, {
894
- status: "cancelled",
895
- cancelled: !0,
896
- completedAt: /* @__PURE__ */ new Date()
897
- }), o = i.subject?.tenantId ?? void 0;
898
- a && await A.recordEvent({
899
- runId: i.id,
900
- eventType: "run-cancelled",
901
- payload: {
902
- reason: r,
903
- workflowName: t,
904
- executionId: n,
905
- ...o == null ? {} : { tenantId: o }
906
- }
907
- }), a && await Pt(n, "cancelled");
908
- }, It = [
909
- ...Gr(e.discovered.workflows ?? [], {
910
- buildContext: (t, n) => e.buildContextForWorkflow?.(t, n) ?? Be({
911
- subject: t.subject,
912
- traceId: t.traceId
913
- }, e.store, void 0, `workflow:${n.workflowName}`, { parentExecutionId: n.executionId }),
914
- resolveStartContext: ue,
915
- ...de === void 0 ? {} : { resolveAuthority: de }
916
- }, (t, n, r) => {
917
- let i = k.getWorkflowVersionMetadata(t.definition);
918
- return k.wrapWorkflowExecuteWithRunRecording({
919
- name: t.definition.name,
920
- store: e.store,
921
- subject: r.subject,
922
- source: r.source ?? null,
923
- traceId: r.traceId,
924
- workflowVersion: i.version,
925
- workflowCompatibleVersions: i.compatibleWith,
926
- workflowPatches: i.patches,
927
- parentExecutionId: r?.parentExecutionId ?? null,
928
- parentClosePolicy: r?.parentClosePolicy ?? null,
929
- onParentClose: ({ executionId: e, status: t }) => Pt(e, t),
930
- ...qe(t.definition),
931
- onTerminal: async ({ executionId: e }) => {
932
- await ee?.gate.release(e);
933
- },
934
- recorder: A,
935
- pluginWorkflowStepLayer: $e,
936
- recordRun: Yr
937
- }, n);
938
- }),
939
- ...e.discovered.workflowWorkers ?? [],
940
- ...xe === void 0 ? [] : [xe]
941
- ], Lt = [...(e.discovered.workflows ?? []).map((e) => e.definition.name).filter(Boolean), ...xe === void 0 ? [] : ["voltro.deliverWebhook"]], Rt = It.length > 0 ? U.mergeAll(...It) : U.empty;
942
- if (((e.discovered.workflows?.length ?? 0) > 0 || (e.discovered.workflowWorkers?.length ?? 0) > 0 || e.scheduleCoordination === "cluster" || xe !== void 0) && e.workflowEngineLayer !== void 0) {
943
- let t = Rt.pipe(U.provideMerge(e.workflowEngineLayer));
944
- f = Kn.make(e.baseLayer === void 0 ? t : t.pipe(U.provideMerge(e.baseLayer))), await f.runPromise(H.void), (e.log ?? I({ scope: "voltro:serve" })).child("workflow").info(`workflow runtime ready — ${Lt.length} entity type(s) registered`, { entities: Lt });
945
- let n = await import("@voltro/workflow/cluster"), r = (e) => f.runPromise(n.redriveFailedRun(e)), i = (e) => f.runPromise(n.resumeRunFromStep(e));
946
- ne = await j({
947
- provider: ki(e.plugins ?? [])?.broadcast?.provider,
948
- crossReplica: ki(e.plugins ?? [])?.broadcast?.crossReplica ?? !1,
949
- namespace: ke,
950
- replicaId: crypto.randomUUID(),
951
- pollStorage: () => f.runPromise(n.pollWorkflowStorage),
952
- onChange: (t) => e.store.onChange((e) => t({
953
- table: e.table,
954
- op: e.op,
955
- ...e.origin === void 0 ? {} : { origin: e.origin }
956
- })),
957
- log: (e.log ?? I({ scope: "voltro:serve" })).child("workflow")
958
- }), p = async (t) => {
959
- let n = await oe({
960
- store: e.store,
961
- workflows: e.discovered.workflows ?? [],
962
- runRedrive: r
963
- }, t.runId);
964
- return n.statusReset && await A.recordEvent({
965
- runId: t.runId,
966
- eventType: "run-redriven",
967
- payload: {
968
- reason: "inspect.redrive",
969
- activitiesReset: n.outcome.activitiesReset
970
- }
971
- }), {
972
- redriven: n.outcome.redriven,
973
- activitiesReset: n.outcome.activitiesReset,
974
- reason: n.outcome.reason
975
- };
976
- }, te = async (t) => {
977
- let n = await Oe({
978
- store: e.store,
979
- workflows: e.discovered.workflows ?? [],
980
- runResume: i
981
- }, t.runId, t.step);
982
- return n.statusReset && await A.recordEvent({
983
- runId: t.runId,
984
- eventType: "run-redriven",
985
- payload: {
986
- reason: "inspect.resume-from-step",
987
- step: n.stepName,
988
- activitiesReset: n.outcome.activitiesReset
989
- }
990
- }), {
991
- redriven: n.outcome.redriven,
992
- stepName: n.stepName,
993
- activitiesReset: n.outcome.activitiesReset,
994
- reason: n.outcome.reason
995
- };
996
- };
997
- let a = (e.scheduleCoordination ?? "single") === "advisoryLock" ? Dr(e.store, e.scheduleReplicaId ?? `pid-${process.pid}`) : ni, s = Nr({
998
- coordinator: a,
999
- replicaId: e.scheduleReplicaId ?? `pid-${process.pid}`
1000
- }), u = {
1001
- info: (e, t) => {
1002
- process.stdout.write(`[flow-control] ${e} ${t ? JSON.stringify(t) : ""}\n`);
1003
- },
1004
- warn: (e, t) => {
1005
- process.stderr.write(`[flow-control] ${e} ${t ? JSON.stringify(t) : ""}\n`);
1006
- },
1007
- error: (e, t) => {
1008
- process.stderr.write(`[flow-control] ERROR ${e} ${t ? JSON.stringify(t) : ""}\n`);
1009
- }
1010
- }, d, m = () => {
1011
- if (d !== void 0) return d;
1012
- if (o !== void 0 && A !== void 0) return d = re({
1013
- store: e.store,
1014
- log: P,
1015
- workflows: e.discovered.workflows ?? [],
1016
- workflowsProxy: o,
1017
- workflowRuntime: f,
1018
- workflowRunRecorder: A,
1019
- closeChildrenForParent: Pt
1020
- }), d;
1021
- };
1022
- c = m, ee = at({
1023
- store: e.store,
1024
- onChange: (t) => e.store.onChange((e) => t({
1025
- table: e.table,
1026
- op: e.op
1027
- })),
1028
- ...e.scheduling === void 0 ? {} : {
1029
- disarmWhenIdle: e.scheduling.disarmWhenIdle,
1030
- drainIntervalMs: e.scheduling.admissionDrainMs,
1031
- cancelSweepIntervalMs: e.scheduling.cancelSweepMs,
1032
- stalenessSweepIntervalMs: e.scheduling.stalenessSweepMs
1033
- },
1034
- workflows: e.discovered.workflows ?? [],
1035
- facade: () => o,
1036
- cancelRunWithReason: m,
1037
- recordRunEvent: () => A?.recordEvent,
1038
- ...e.workflowStaleness === void 0 ? {} : { staleness: e.workflowStaleness },
1039
- ...e.workflowSuspendSignalHintMs === void 0 ? {} : { suspendSignalHintMs: e.workflowSuspendSignalHintMs },
1040
- scheduleCoordinated: s,
1041
- onAbandoned: async (t) => {
1042
- await Ot({
1043
- workflows: e.discovered.workflows ?? [],
1044
- facade: () => o,
1045
- log: u,
1046
- ...t
1047
- });
1048
- },
1049
- log: u
1050
- });
1051
- let h = ee;
1052
- h !== void 0 && qr(() => h.stop()), l = Ye({
1053
- store: e.store,
1054
- onChange: (t) => e.store.onChange((e) => t({
1055
- table: e.table,
1056
- op: e.op
1057
- })),
1058
- ...e.scheduling === void 0 ? {} : {
1059
- disarmWhenIdle: e.scheduling.disarmWhenIdle,
1060
- tickIntervalMs: e.scheduling.inferenceTickMs
1061
- },
1062
- enabled: (e.discovered.workflows?.length ?? 0) > 0,
1063
- resumeSignal: () => f === void 0 || k === void 0 ? void 0 : async ({ executionId: t, workflowName: n, signalName: r, payload: i }) => {
1064
- await f.runPromise(k.completeSuspendingSignal({
1065
- store: e.store,
1066
- target: Mt(t, n),
1067
- signalName: r,
1068
- payload: i
1069
- }));
1070
- },
1071
- runEffect: (e) => f.runPromise(e),
1072
- scheduleCoordinated: s,
1073
- log: u
1074
- });
1075
- let ie = l;
1076
- ie !== void 0 && qr(() => ie.stop()), o = (e.discovered.workflows?.length ?? 0) > 0 ? Ur({
1077
- workflows: e.discovered.workflows ?? [],
1078
- runEffect: (e) => f.runPromise(e),
1079
- onEnqueue: () => ne?.publishWake(),
1080
- ...h === void 0 ? {} : {
1081
- admitStart: h.gate.admitStart,
1082
- startPayloadSchema: h.gate.startPayloadSchema,
1083
- parkDelayedStart: h.gate.parkDelayed
1084
- },
1085
- rememberStartContext: le,
1086
- signal: async (t, n, r) => {
1087
- let i = await k.sendWorkflowSignal({
1088
- store: e.store,
1089
- recorder: A,
1090
- target: t,
1091
- signalName: n,
1092
- payload: r
1093
- });
1094
- return await f.runPromise(k.completeSuspendingSignal({
1095
- store: e.store,
1096
- target: t,
1097
- signalName: n,
1098
- payload: r
1099
- })).catch(() => {}), i;
1100
- },
1101
- update: (t, n, r, i) => k.sendWorkflowUpdate({
1102
- store: e.store,
1103
- recorder: A,
1104
- target: t,
1105
- updateName: n,
1106
- payload: r,
1107
- ...i === void 0 ? {} : { options: i }
1108
- }),
1109
- listRuns: (t) => Ae(e.store, t),
1110
- retry: (t, n) => Me({
1111
- store: e.store,
1112
- workflows: e.discovered.workflows ?? [],
1113
- runPromise: (e) => f.runPromise(e)
1114
- }, t, n),
1115
- redrive: (t) => oe({
1116
- store: e.store,
1117
- workflows: e.discovered.workflows ?? [],
1118
- runRedrive: r
1119
- }, t).then((e) => e.outcome)
1120
- }) : void 0;
1121
- }
1122
- let Bt = U.mergeAll(wt.toLayer(D), Et), Vt = Tt(D, e.discovered.queries.map((e) => e.descriptor.name), pe), Wt = U.mergeAll(wt.toLayer(Vt), Et), M = e.observability, Gt = await gr({
1123
- ...e.appName === void 0 ? {} : { serviceName: e.appName },
1124
- ...M && M.spanProcessors.length > 0 ? { extraSpanProcessors: M.spanProcessors } : {},
1125
- ...M && M.metricReaders.length > 0 ? { extraMetricReaders: M.metricReaders } : {},
1126
- ...M && Object.keys(M.resourceAttributes).length > 0 ? { resourceAttributes: M.resourceAttributes } : {},
1127
- ...M && M.sampler !== void 0 ? { sampler: M.sampler } : {}
1128
- }), Kt = !1, N = e.store.ping ? () => e.store.ping().then(() => !0).catch(() => !1) : void 0, { server: qt, shutdown: Jt } = ri({
1129
- group: wt,
1130
- handlersLayer: Bt,
1131
- httpHandlersLayer: Wt,
1132
- port: e.port ?? 4e3,
1133
- ...e.host === void 0 ? {} : { host: e.host },
1134
- path: e.path ?? "/ws",
1135
- tracerLayer: Gt.layer,
1136
- security: ye(e),
1137
- ...Qe,
1138
- healthCheck: {
1139
- isReady: () => Kt,
1140
- ...N ? { ping: N } : {}
1141
- },
1142
- ...bt.length > 0 ? { httpRoutes: bt } : {},
1143
- ...e.getStore === void 0 ? {} : { getStore: e.getStore },
1144
- ...Se.size > 0 ? { webhookRoutes: Se } : {},
1145
- ...e.inspectRoute === void 0 ? {} : { inspectRoute: e.inspectRoute }
1146
- }), Yt = zi(qt);
1147
- if (await mr(qt), (e.discovered.schedules?.length ?? 0) > 0) {
1148
- let t = (e.scheduleCoordination ?? "single") === "advisoryLock" ? Dr(e.store, e.scheduleReplicaId ?? `pid-${process.pid}`) : ni;
1149
- m = await ii(e.discovered.schedules ?? [], {
1150
- store: e.store,
1151
- coordinator: t,
1152
- defaultTrigger: e.scheduleDefaultTrigger ?? "self",
1153
- replicaId: e.scheduleReplicaId ?? `pid-${process.pid}`,
1154
- armSelf: e.scheduleArmSelf ?? !0,
1155
- dormancy: e.dormancy ?? "always-on",
1156
- ...e.dormancyTenantId === void 0 ? {} : { dormancyTenantId: e.dormancyTenantId },
1157
- buildContext: ({ traceId: t, scheduleName: n, subject: r }) => Be({
1158
- subject: r,
1159
- traceId: t
1160
- }, e.store, void 0, `schedule:${n}`),
1161
- log: {
1162
- info: (e, t) => {
1163
- process.stdout.write(`[schedule] ${e} ${t ? JSON.stringify(t) : ""}\n`);
1164
- },
1165
- warn: (e, t) => {
1166
- process.stderr.write(`[schedule] ${e} ${t ? JSON.stringify(t) : ""}\n`);
1167
- },
1168
- error: (e, t) => {
1169
- process.stderr.write(`[schedule] ERROR ${e} ${t ? JSON.stringify(t) : ""}\n`);
1170
- },
1171
- debug: () => {}
1172
- },
1173
- ...e.scheduleFireInterceptor === void 0 ? {} : { interceptFire: e.scheduleFireInterceptor },
1174
- ...e.onScheduleRunEvent === void 0 ? {} : { onRunEvent: e.onScheduleRunEvent }
1175
- }), e.onSchedulerReady?.(m);
1176
- }
1177
- let P = e.log ?? I({ scope: "voltro:serve" }), Xt, Zt;
1178
- if ((e.discovered.subscribers?.length ?? 0) > 0 && (Xt = C(e.discovered.subscribers ?? [], e.store, P.child("subscribe"), e.schemaRegistry, S.bus)), (e.discovered.reactions?.length ?? 0) > 0) {
1179
- let t = P.child("reaction"), n = async (n, r) => {
1180
- if (n.kind === "workflow") {
1181
- if (y === void 0) {
1182
- t.warn("reaction workflow act skipped — no workflow engine in this app", { workflow: n.workflow });
1183
- return;
1184
- }
1185
- let e = n.payload === void 0 ? r.new ?? r.old ?? {} : n.payload(r);
1186
- await Wr(y, {
1187
- traceId: `reaction:${n.workflow}`,
1188
- source: `reaction:${n.workflow}`
1189
- }).start(n.workflow, e);
1190
- return;
1191
- }
1192
- await ut(n.agent, r, {
1193
- findAgentSend: (t) => e.discovered.actions.find((e) => e.descriptor.name === `${t}.send`),
1194
- runAction: (e, t, n) => Promise.resolve(ot(e, t, n)),
1195
- makeSubject: (e) => Nn(e),
1196
- now: () => Date.now(),
1197
- log: t
1198
- });
1199
- }, r = async (n, r) => {
1200
- try {
1201
- let { requireAiBudget: t } = await import("@voltro/ai");
1202
- return (await H.runPromise(H.either(t(e.store, {
1203
- tenantId: n,
1204
- limitUsd: r
1205
- }))))._tag === "Right";
1206
- } catch (e) {
1207
- return t.warn("reaction budget check failed — refusing the act", { tenantId: n }, e), !1;
1208
- }
1209
- }, i = pt(e.store, { onError: (e) => t.warn("reaction: rate-slot claim failed; refusing the act", { cause: String(e) }) });
1210
- Zt = u(e.discovered.reactions ?? [], e.store, {
1211
- runAct: n,
1212
- checkBudget: r,
1213
- claimRateSlot: (e) => i.claim(e)
1214
- }, t);
1215
- }
1216
- let Qt;
1217
- (e.discovered.aggregates?.length ?? 0) > 0 && (Qt = await De({
1218
- discovered: e.discovered.aggregates ?? [],
1219
- store: e.store,
1220
- log: P.child("aggregate"),
1221
- ...e.analytics === void 0 ? {} : { analytics: e.analytics },
1222
- ...e.aggregateStorage === void 0 ? {} : { storage: e.aggregateStorage },
1223
- ...e.aggregateCoordinator === void 0 ? {} : { coordinator: e.aggregateCoordinator }
1224
- }), Ve = U.succeed(ir, Qt.registry));
1225
- let $t;
1226
- (e.discovered.expectations?.length ?? 0) > 0 && ($t = dr({
1227
- discovered: e.discovered.expectations ?? [],
1228
- store: e.store,
1229
- log: P.child("expectation")
1230
- }), He = U.succeed(sr, $t.registry)), (e.discovered.budgets?.length ?? 0) > 0 && (n = pr({
1231
- discovered: e.discovered.budgets ?? [],
1232
- log: P.child("finops")
1233
- }), Ue = U.succeed(K, n.registry));
1234
- let en;
1235
- return (e.discovered.experiments?.length ?? 0) > 0 && (en = fr({
1236
- discovered: e.discovered.experiments ?? [],
1237
- store: e.store,
1238
- log: P.child("experiment")
1239
- }), We = U.succeed(cr, en.registry)), Kt = !0, e.bootTiming?.mark("ready"), {
1240
- dispatcher: r,
1241
- server: qt,
1242
- scheduler: m,
1243
- eventsSnapshot: me(S.bus, S.declared),
1244
- membersSnapshot: () => ({
1245
- members: Ie.membership.list(),
1246
- capturedAt: Date.now()
1247
- }),
1248
- agentTools: () => gt,
1249
- rpcMetrics: () => Xe,
1250
- webhooksService: () => ve,
1251
- runCanceller: () => c(),
1252
- flowControlHealth: () => ee?.cancelHealth(),
1253
- inferenceHealth: () => l?.health(),
1254
- workflowWriteActions: () => y === void 0 || A === void 0 ? void 0 : se({
1255
- store: e.store,
1256
- log: P,
1257
- workflows: e.discovered.workflows ?? [],
1258
- workflowsProxy: o,
1259
- workflowRuntime: f,
1260
- workflowRunRecorder: A,
1261
- closeChildrenForParent: Pt
1262
- }),
1263
- redriveWorkflowRun: (e) => p ? p(e) : Promise.reject(/* @__PURE__ */ Error("redrive: this app registers no workflows")),
1264
- resumeWorkflowRunFromStep: (e) => te ? te(e) : Promise.reject(/* @__PURE__ */ Error("resume-from-step: this app registers no workflows")),
1265
- close: async () => {
1266
- Kt = !1, await Yt.drainRequests();
1267
- for (let e of Ce) try {
1268
- await e();
1269
- } catch (e) {
1270
- P.warn("serve: teardown step failed", {}, e);
1271
- }
1272
- await ze?.detach(), await Ie.detach(), Qt?.detach(), $t?.detach(), n?.detach(), en?.detach(), Zt?.(), Xt?.(), await m?.shutdown(), r.close(), await ne?.detach(), await f?.dispose(), await Jt(), await Yt.finish();
1273
- }
1274
- };
1275
- }, $ = I({ scope: "voltro:serve" }), pa = (e, t, n) => (e === "production" || e === "staging") && t !== "memory" && n !== "0", ma = Wt, ha = async (e) => {
1276
- let t = Cn(process.cwd());
1277
- if (kn(t)) {
1278
- let n;
1279
- try {
1280
- let e = await import(An(t).href);
1281
- typeof e.runServe == "function" ? n = e.runServe : $.warn("serve bundle has no runServe export — using the standard serve path");
1282
- } catch (e) {
1283
- $.warn("serve bundle failed to load — using the standard serve path", {}, e);
1284
- }
1285
- if (n) return $.info("serve: booting from the precompiled serve bundle"), n(e);
1286
- }
1287
- return ga(e);
1288
- }, ga = async (s) => {
1289
- let u = wn();
1290
- e("serve");
1291
- try {
1292
- _i();
1293
- } catch (e) {
1294
- throw i(e instanceof Error ? e.message : String(e));
1295
- }
1296
- let d = process.cwd(), h = await Ke(d), re = M({
1297
- kind: "api",
1298
- configPort: h?.port,
1299
- env: process.env,
1300
- flagPort: ma(s, "--port")
1301
- });
1302
- for (let e of re.warnings) $.warn(e);
1303
- let ie = re.port;
1304
- $r(Zr(h?.secrets)), await Gt({
1305
- rawEnv: h?.env,
1306
- appType: "api",
1307
- root: d,
1308
- log: $,
1309
- generateTypes: !1
1310
- }), u.mark("config");
1311
- let g = (process.env.DB_DIALECT ?? h?.store ?? "memory").toLowerCase(), ae = (g === "mariadb" || g === "postgres" || g === "mssql") && (process.env.CDC ?? "1") !== "0", oe = g === "mariadb" ? "mariadb" : g === "mssql" ? "mssql" : void 0, se = Sn(d);
1312
- if (!r() && kn(se)) try {
1313
- let e = await import(An(se).href);
1314
- if (e.modules) {
1315
- let t = {};
1316
- for (let [n, r] of Object.entries(e.modules)) t[Dn(d, n)] = r;
1317
- n(t), $.info("precompiled api bundle loaded", { modules: Object.keys(t).length });
1318
- }
1319
- } catch (e) {
1320
- $.warn("precompiled api bundle failed to load — falling back to source", {}, e);
1321
- }
1322
- let _ = await Qe(d), v = await k(_, { cdc: ae && oe !== void 0 }), fe = Se(v);
1323
- {
1324
- let e = /* @__PURE__ */ new Set([
1325
- ...v.queries.filter((e) => e.descriptor.overridesPlugin === !0).map((e) => e.descriptor.name),
1326
- ...v.mutations.filter((e) => e.descriptor.overridesPlugin === !0).map((e) => e.descriptor.name),
1327
- ...v.actions.filter((e) => e.descriptor.overridesPlugin === !0).map((e) => e.descriptor.name)
1328
- ]);
1329
- Qt(Zt(h?.plugins ?? []), [
1330
- ...v.queries.map((e) => e.descriptor.name),
1331
- ...v.mutations.map((e) => e.descriptor.name),
1332
- ...v.actions.map((e) => e.descriptor.name),
1333
- ...v.streams.map((e) => e.descriptor.name)
1334
- ], e);
1335
- let t = Ne(v.serverOnlyLeaks, ke(process.env, "strict"), br, "`voltro serve`");
1336
- if (t.action === "fail") throw i(t.message ?? "");
1337
- t.action === "warn" && $.warn(t.message ?? "");
1338
- }
1339
- let me = _.filter((e) => bn.test(e)), be = me.length > 0 ? await yn(me, $.child("webhooks")) : {
1340
- outgoing: [],
1341
- incoming: [],
1342
- providers: []
1343
- }, De = _n(v.events), Oe = be.outgoing.length + be.incoming.length + be.providers.length + De.length === 0 ? void 0 : {
1344
- ...be,
1345
- outgoing: [...be.outgoing, ...De]
1346
- }, Ae = on({
1347
- nodeEnv: process.env.NODE_ENV,
1348
- cdcDialect: oe,
1349
- declared: h?.schema
1350
- }), Me = en({
1351
- gates: Ae,
1352
- runtime: {
1353
- traces: ve(),
1354
- undo: oi()
1355
- }
1356
- });
1357
- if (Me !== void 0) throw i(`serve: ${Me}`);
1358
- let Pe = an({
1359
- mix: v.featureMix,
1360
- plugins: h?.plugins ?? [],
1361
- gates: Ae,
1362
- ...oe ? { cdcDialect: oe } : {}
1363
- }), Fe = h?.analytics !== void 0 && h.analytics.kind !== "noop" && g !== "memory" ? (await N(g)).makeSqlLayer(O()) : void 0, Le = await c({
1364
- spec: h?.analytics,
1365
- sqlLayer: Fe,
1366
- log: $
1367
- }), C = (() => {
1368
- let e = new Set(v.tables.map((e) => e.tableName)), t = [...v.tables];
1369
- for (let n of [...Pe, ...Le.tables]) e.has(n.tableName) || (e.add(n.tableName), t.push(n));
1370
- return t;
1371
- })();
1372
- for (let e of C) nr(e);
1373
- {
1374
- let e = xr(si(Vt(v), We(C)));
1375
- e !== void 0 && $.warn(e);
1376
- }
1377
- let Re = (process.env.NODE_ENV ?? "").toLowerCase();
1378
- if (pa(Re, g, process.env.VOLTRO_AUTO_MIGRATE)) {
1379
- let e = (await N(g)).makeSqlLayer(O()), t = await H.runPromise(qn.SqlClient.pipe(H.flatMap((e) => Xn(e, d)), H.provide(e), H.catchAll(() => H.succeed([]))));
1380
- 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));
1381
- let n = await H.runPromise(qn.SqlClient.pipe(H.flatMap((e) => Zn(e, C, {
1382
- appliedBy: `serve:${Re}`,
1383
- environment: "prod",
1384
- dialectId: g
1385
- })), H.provide(e)));
1386
- n.kind === "prod-mismatch" && ($.error(Yn(n, g)), $.error(nn({
1387
- gates: Ae,
1388
- nodeEnv: process.env.NODE_ENV,
1389
- cdcDialect: oe,
1390
- declared: h?.schema
1391
- })), $.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(Yn(n, g));
1392
- }
1393
- await Xt({
1394
- dialectId: g,
1395
- tables: C,
1396
- mode: Yt(h?.reactiveTriggers),
1397
- lockSchema: O().schema,
1398
- makeLayer: async () => (await N(g)).makeSqlLayer(O()),
1399
- log: {
1400
- info: (e, t) => $.info(e, t ?? {}),
1401
- warn: (e, t) => $.warn(e, t ?? {})
1402
- }
1403
- });
1404
- let Ge = Hr(C);
1405
- u.mark("discover");
1406
- let w = await ot(h, void 0), qe = ui(w, g);
1407
- for (let e of D({
1408
- dialect: String(h?.store ?? process.env.DB_DIALECT ?? "postgres"),
1409
- changeStrategy: (process.env.CDC ?? "1") === "0" ? "inline" : "cdc",
1410
- dbUrl: process.env.DB_URL,
1411
- crossReplicaBus: ki(h?.plugins ?? [])?.broadcast.crossReplica === !0,
1412
- tables: v.tables.map((e) => ({
1413
- tableName: e.tableName,
1414
- isReactive: e.isReactive === !0
1415
- })),
1416
- querySources: v.queries.flatMap((e) => {
1417
- let t = e.descriptor.source;
1418
- return t === void 0 ? [] : typeof t == "string" ? [t] : [...t];
1419
- })
1420
- })) e.level === "warn" ? $.warn(e.message) : $.info(e.message);
1421
- {
1422
- let e = $e({
1423
- tables: $n().map((e) => ({ tableName: e.tableName })),
1424
- queries: v.queries.map((e) => ({
1425
- name: e.descriptor.name,
1426
- source: e.descriptor.source
1427
- }))
1428
- }), t = bt(e);
1429
- t !== void 0 && $.warn(t);
1430
- }
1431
- h?.cache && !process.env.CACHE_BACKEND && (process.env.CACHE_BACKEND = h.cache), h?.cacheRedisUrl && !process.env.CACHE_REDIS_URL && (process.env.CACHE_REDIS_URL = h.cacheRedisUrl), h?.cacheRedisDriver && !process.env.CACHE_REDIS_DRIVER && (process.env.CACHE_REDIS_DRIVER = h.cacheRedisDriver), h?.cacheKeyPrefix && !process.env.CACHE_KEY_PREFIX && (process.env.CACHE_KEY_PREFIX = h.cacheKeyPrefix);
1432
- let { service: Ye, invalidationBus: at, snapshotCache: lt, cache: ut, semantic: pt, evictSource: _t, backend: St, stats: Ct, dispose: Tt } = await Je({
1433
- env: process.env,
1434
- semantic: h?.cacheSemantic ?? !1
1435
- });
1436
- pt !== void 0 && $.info("semantic cache enabled — reactive eviction on live writes"), $.info(`cache backend resolved: ${St}` + (St === "redis" ? ` (driver ${process.env.CACHE_REDIS_DRIVER ?? "resp"})` : " — in-process, not cross-instance")), w.onChange((e) => {
1437
- if (H.runFork(at.publish(e.table)), _t !== void 0) {
1438
- let t = (e.new ?? e.old)?.id;
1439
- _t({
1440
- table: e.table,
1441
- op: e.op,
1442
- ...t === void 0 ? {} : { id: t }
1443
- });
1444
- }
1445
- }), h?.kv && !process.env.KV_BACKEND && (process.env.KV_BACKEND = h.kv), h?.kvRedisUrl && !process.env.KV_REDIS_URL && (process.env.KV_REDIS_URL = h.kvRedisUrl), h?.kvKeyPrefix && !process.env.KV_KEY_PREFIX && (process.env.KV_KEY_PREFIX = h.kvKeyPrefix);
1446
- let { kv: Dt, service: Ot } = await jr({ store: w });
1447
- f({
1448
- log: $,
1449
- max: Jt(),
1450
- outOfPool: we(g, (process.env.CDC ?? "1") !== "0"),
1451
- readPools: t.replicationSnapshot()?.replicaCount ?? 0,
1452
- always: !0
1453
- }), u.mark("store");
1454
- let At = ur({
1455
- store: w,
1456
- sink: Le.sink,
1457
- log: $
1458
- }), Mt = A({
1459
- store: w,
1460
- dialect: g,
1461
- log: { info: (e) => $.info(e) }
1462
- }), j = h?.plugins ?? [], zt = process.env.POD_NAME ?? process.env.HOSTNAME ?? `serve-${process.pid}`, Ht, Ut;
1463
- g !== "memory" && (Ht = Kn.make((await N(g)).makeSqlLayer(O())), Ut = await Ht.runPromise(qn.SqlClient));
1464
- let Wt = [
1465
- "postgres",
1466
- "mariadb",
1467
- "mysql",
1468
- "mssql"
1469
- ].includes(g) ? Dr(w, zt, $) : ni, vn = Be(h?.scheduling), Cn = Nr({
1470
- maxIdleIntervalMs: vn.pollCeilingMs,
1471
- coordinator: Wt,
1472
- replicaId: zt,
1473
- log: $
1474
- }), Tn = [], F = process.env.POD_NAME ?? process.env.HOSTNAME ?? `serve-${process.pid}`, On = ki(h?.plugins ?? [])?.broadcast?.provider, I = tt(h?.plugins, h?.name ?? En(d));
1475
- {
1476
- let e = it(h?.plugins, h?.name ?? En(d));
1477
- e !== void 0 && $.warn(e);
1478
- }
1479
- let jn = Nt(h?.plugins, {
1480
- instanceId: F,
1481
- namespace: I,
1482
- meta: { mode: "serve" },
1483
- logger: $
1484
- }), Mn = {
1485
- ...Ut ? { sql: Ut } : {},
1486
- instanceId: F,
1487
- membership: jn.membership,
1488
- ...On === void 0 ? {} : { broadcast: On },
1489
- broadcastChannels: { presence: Oi(I, "presence") },
1490
- scheduleCoordinated: (e, t, n) => {
1491
- let r = Cn(e, t, n);
1492
- return Tn.push(r), r;
1493
- }
1494
- };
1495
- for (let e of j) e.bindDataStore?.(qe, Mn);
1496
- l({
1497
- store: w,
1498
- ...T(),
1499
- log: $
1500
- });
1501
- let L = j.filter((e) => typeof e.onChangeEvent == "function");
1502
- if (L.length > 0) {
1503
- let e = w.changeScope ?? "local";
1504
- w.onChange((t) => {
1505
- let n = he(t, e);
1506
- for (let e of L) H.runFork(e.onChangeEvent(n).pipe(H.catchAllCause((t) => H.sync(() => $.warn(`plugin ${e.name} onChangeEvent failed`, { error: Gn.pretty(t) })))));
1507
- });
1508
- }
1509
- let Nn = le({
1510
- plugins: j,
1511
- appName: h?.name ?? "voltro-api",
1512
- appType: "api",
1513
- voltroVersion: process.env.npm_package_version ?? "0.0.0",
1514
- log: $
1515
- });
1516
- j.length && await Nn.activate(), u.mark("plugins");
1517
- let Pn = await Nn.gatherObservability(), Fn = {
1518
- info: (e, t) => process.stdout.write(`[broadcast] ${e} ${t ? JSON.stringify(t) : ""}\n`),
1519
- warn: (e, t) => process.stderr.write(`[broadcast] ${e} ${t ? JSON.stringify(t) : ""}\n`),
1520
- debug: () => {}
1521
- }, R, In = await yt(w, h, g, I, Fn, (e, t) => {
1522
- R?.refreshAll(`broadcast gap: missed ${t} change(s) from ${e}`);
1523
- }), z = h?.apiKeys, Ln = (typeof z == "object" ? z.prefix : void 0) ?? "voltro_", B = z ? yr(w) : void 0, V = B ? kr({ flush: Ar(B) }) : void 0;
1524
- V && qr(() => V.shutdown());
1525
- let Rn = B ? Or(B, {
1526
- prefix: Ln,
1527
- ...V ? { usage: V } : {}
1528
- }) : void 0, zn = Rn ? [Sr(Rn, { prefix: Ln })] : [], Bn = wt([...h?.auth?.strategies ?? [], ...zn], Ei(h?.plugins ?? []), h?.auth?.anonymousTenantRequired ?? !1, h?.auth, () => qe), Vn = [...h?.restRoutes ?? [], ...Rn ? lr(Rn, (typeof z == "object" ? z.managementPath : void 0) ?? "/v1/api-keys") : []], Hn = ht(h?.idempotency, w), Un = j.map((e) => e.services).filter((e) => e !== void 0), Wn = U.mergeAll(Ve({
1529
- analyticsLayer: Le.layer,
1530
- cacheService: Ye,
1531
- kvService: Ot,
1532
- ...pt === void 0 ? {} : { semanticCache: pt },
1533
- pluginServices: Un,
1534
- userLayers: h?.layers ?? []
1535
- }), st(h?.http ?? {})), W = await ct({
1536
- files: _,
1537
- store: w,
1538
- log: $,
1539
- seedPolicy: "report",
1540
- seedPattern: pn,
1541
- loadSeedFiles: P,
1542
- startupPattern: cn,
1543
- loadStartupFiles: a,
1544
- runStartups: o,
1545
- emailPattern: He,
1546
- loadEmailFiles: vt,
1547
- registerEmailTemplates: Di
1548
- });
1549
- (W.startupCount > 0 || W.emailCount > 0) && $.info("boot lifecycle", {
1550
- startups: W.startupCount,
1551
- emailTemplates: W.emailCount
1552
- }), W.startups !== void 0 && qr(async () => {
1553
- await W.startups.stop();
1554
- }), ce({
1555
- demands: y(fe),
1556
- isRegistered: (e) => Cr(e) !== void 0
1557
- });
1558
- let Qn = gt({
1559
- schedules: Et({
1560
- schedules: v.schedules,
1561
- seeds: W.seeds,
1562
- store: w,
1563
- log: $.child("seeds")
1564
- }),
1565
- workflows: v.workflows ?? [],
1566
- log: $.child("workflow-schedules")
1567
- }), er = h?.scheduling ?? {}, G = er.trigger ?? "self", rr = /* @__PURE__ */ new Set([
1568
- "postgres",
1569
- "mysql",
1570
- "mariadb",
1571
- "mssql"
1572
- ]), ir = er.coordination ?? (rr.has(g) ? "advisoryLock" : "single"), K = ir === "cluster" && rr.has(g), ar = K ? "cluster" : ir === "advisoryLock" && rr.has(g) ? "advisoryLock" : "single";
1573
- ir === "cluster" && !K && $.warn("scheduling.coordination=cluster needs a sql-backed store except sqlite — falling back to single"), ir === "advisoryLock" && !rr.has(g) && $.warn("scheduling.coordination=advisoryLock needs a SQL store (the claim-row gate) — falling back to single");
1574
- let or, sr = v.workflows.length > 0 || v.workflowWorkers.length > 0 || v.eventTriggers.length > 0 || (Oe?.outgoing.length ?? 0) > 0 || K, cr;
1575
- if (sr) {
1576
- if (g === "mssql") {
1577
- let e = await gn(process.cwd());
1578
- e && $.warn(e);
1579
- }
1580
- let [{ WorkflowEngine: e }, { makeClusterCronLayer: t, workflowEngineLayer: n, resolveRunnerStorage: r, resolveFailoverTuning: i }] = await Promise.all([import("@effect/workflow"), import("@voltro/workflow/cluster")]), a = K ? Qn.filter((e) => (e.trigger ?? G) === "self").map((e) => t({
1581
- name: e.name,
1582
- cron: vr(e),
1583
- execute: async () => {
1584
- await or?.fireFromCluster(e.name);
1585
- }
1586
- })) : [];
1587
- cr = g === "memory" ? e.layerMemory : await (async () => {
1588
- let e = await N(g), t = r({ sqliteFamily: e.id === "sqlite" || e.id === "turso" });
1589
- 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({
1590
- sqlClientLayer: e.makeSqlLayer(O()),
1591
- runnerStorage: t,
1592
- dialectId: e.id,
1593
- ...process.env.VOLTRO_WORKFLOW_RUNNER_PORT ? { runnerListenPort: Number(process.env.VOLTRO_WORKFLOW_RUNNER_PORT) } : {},
1594
- ...i(),
1595
- ...a.length > 0 ? { extraShardingLayers: a } : {}
1596
- });
1597
- })();
1598
- }
1599
- let dr = ue(j, xn()), fr = _.filter((e) => /\.subscribe\.tsx?$/.test(e)), pr = fr.length > 0 ? await xe(fr, $) : [], mr = _.filter((e) => /\.reaction\.tsx?$/.test(e)), q = mr.length > 0 ? await pe(mr, $) : [], hr = _.filter((e) => dn.test(e)), J = hr.length > 0 ? await S(hr, $) : [], gr = _.filter((e) => /\.aggregate\.tsx?$/.test(e)), _r = gr.length > 0 ? await ne(gr, $) : [], wr = _e();
1600
- if (_r.length > 0 && g !== "memory") try {
1601
- let e = (await N(g)).makeSqlLayer(O());
1602
- wr = dt(e);
1603
- } catch (e) {
1604
- $.warn("aggregate: SQL storage init failed — falling back to in-process", { err: String(e) });
1605
- }
1606
- let Tr = g === "memory" ? ni : Dr(w, `aggregate@${process.pid}`, $), Er = _.filter((e) => fn.test(e)), Mr = Er.length > 0 ? await p(Er, $) : [], Pr = _.filter((e) => un.test(e)), Fr = Pr.length > 0 ? await Te(Pr, $) : [], Ir = _.filter((e) => ln.test(e)), Lr = Ir.length > 0 ? await Lt(Ir, $) : [], Rr = [], zr = [], Br = _.filter((e) => rn.test(e));
1607
- if (Br.length > 0) {
1608
- let e = $.child("agent"), t = _.filter((e) => tn.test(e));
1609
- t.length > 0 && await sn(t, e);
1610
- let n = await $t(Br, e);
1611
- for (let e of n.agents) for (let t of Ze(e)) (t.kind === "action" ? Rr : zr).push({
1612
- file: t.file,
1613
- descriptor: t.descriptor,
1614
- executor: t.executor
1615
- });
1616
- n.agents.length > 0 && e.info("synthesized agent routes", { agents: n.agents.map((e) => e.descriptor.name) });
1617
- }
1618
- u.mark("workflow");
1619
- let Y = () => {
1620
- let e = X.workflowWriteActions();
1621
- if (e === void 0) throw Error("workflow actions: this app registers no workflows");
1622
- return e;
1623
- }, Vr = tr({
1624
- dialect: g,
1625
- ...O()
1626
- }), Ur = g === "memory" ? void 0 : (await N(g)).makeSqlLayer(O()), Wr = async () => jt({
1627
- sqlLayer: Ur,
1628
- declared: C,
1629
- log: $
1630
- }), Gr = {
1631
- kind: "api",
1632
- meta: {
1633
- name: h?.name ?? "voltro-api",
1634
- voltroVersion: kt,
1635
- port: ie,
1636
- mode: "start",
1637
- store: g,
1638
- cdc: ae ? "on" : "off",
1639
- ...Vr === void 0 ? {} : { databaseId: Vr }
1640
- },
1641
- rpc: nt(v, d),
1642
- workflows: ze(v, d),
1643
- migrations: Wr,
1644
- events: () => X.eventsSnapshot(),
1645
- agentTools: () => X.agentTools(),
1646
- invariantChecks: () => ({
1647
- mode: "serve",
1648
- accessGate: fe,
1649
- config: h,
1650
- serverOnlyLeaks: v.serverOnlyLeaks,
1651
- migrations: Wr
1652
- }),
1653
- members: () => X.membersSnapshot(),
1654
- inspectFireSchedule: async ({ name: e, trigger: t }) => {
1655
- if (!or) throw Error("scheduler not started — this app registers no self-triggered schedules (all schedules are trigger:'external', or there are none).");
1656
- return { runId: await or.fireNow(e, t) ?? null };
1657
- },
1658
- inspectBackfillSchedule: m({
1659
- getHandle: () => or,
1660
- getSchedules: () => Qn
1661
- }),
1662
- ...Oe === void 0 ? {} : { webhooks: () => ge({
1663
- store: w,
1664
- discoveredWebhooks: Oe
1665
- }) },
1666
- plugins: () => ({
1667
- plugins: Nn.snapshot(),
1668
- capturedAt: Date.now()
1669
- }),
1670
- env: () => Kt(h?.name ?? En(d), {
1671
- ...h?.env !== void 0 && gi(h.env) ? { contract: h.env } : {},
1672
- plugins: h?.plugins ?? []
1673
- }),
1674
- dataCache: () => Ue({
1675
- stats: Ct,
1676
- backendKind: St
1677
- }),
1678
- subscriptions: () => Rt(() => R),
1679
- inspectTables: () => de(v.tables),
1680
- inspectRows: b({
1681
- store: w,
1682
- tables: v.tables,
1683
- mask: !0
1684
- }),
1685
- metrics: (e) => X.rpcMetrics().snapshot(e),
1686
- cluster: () => Bt({
1687
- store: w,
1688
- dialect: g,
1689
- useClusterCron: K,
1690
- scheduleCoordChoice: ir
1691
- }),
1692
- inspectSchedules: () => x({
1693
- schedules: Qn,
1694
- defaultTrigger: G,
1695
- coordination: ar
1696
- }),
1697
- inspectScheduleRuns: (e) => Ft(w, e),
1698
- ...ee(w, {
1699
- controls: mt(v.workflows ?? []),
1700
- active: (v.workflows?.length ?? 0) > 0,
1701
- cancellation: () => X.flowControlHealth()
1702
- }),
1703
- webhookActions: Ce(() => X.webhooksService()),
1704
- inspectStartWorkflow: (e) => Y().inspectStartWorkflow(e),
1705
- inspectCancelWorkflowRun: (e) => Y().inspectCancelWorkflowRun(e),
1706
- inspectSuspendWorkflowRun: (e) => Y().inspectSuspendWorkflowRun(e),
1707
- inspectResumeWorkflowRun: (e) => Y().inspectResumeWorkflowRun(e),
1708
- inspectDiscardWorkflowRun: (e) => Y().inspectDiscardWorkflowRun(e),
1709
- inspectRetryWorkflowRun: (e) => Y().inspectRetryWorkflowRun(e),
1710
- inspectSignalWorkflowRun: (e) => Y().inspectSignalWorkflowRun(e),
1711
- inspectUpdateWorkflowRun: (e) => Y().inspectUpdateWorkflowRun(e),
1712
- inspectInferences: (e) => et({
1713
- store: w,
1714
- active: (v.workflows?.length ?? 0) > 0,
1715
- dispatcher: () => X.inferenceHealth()
1716
- }, e.limit === void 0 ? {} : { limit: e.limit }),
1717
- ...xt({
1718
- store: w,
1719
- cancelRun: async (e) => await X.runCanceller()?.(e) ?? !1,
1720
- retryRun: async (e) => Y().inspectRetryWorkflowRun({ runId: e }),
1721
- redriveRun: async (e) => X.redriveWorkflowRun({ runId: e }),
1722
- log: $
1723
- }),
1724
- inspectRedriveWorkflowRun: (e) => X.redriveWorkflowRun(e),
1725
- inspectResumeWorkflowRunFromStep: (e) => X.resumeWorkflowRunFromStep(e)
1726
- }, Kr = (process.env.VOLTRO_TENANT_ISOLATION ?? h?.tenancy?.isolation) === "namespace", Jr = Kr && g !== "memory" ? await (async () => {
1727
- let e = await N(g);
1728
- return ft({
1729
- tables: C,
1730
- sqlLayer: e.makeSqlLayer(O()),
1731
- dialect: g,
1732
- options: { retryFilter: e.retryFilter },
1733
- log: {
1734
- info: (e, t) => $.info(e, t),
1735
- error: (e, t, n) => $.error(e, t ?? {}, n)
1736
- }
1737
- });
1738
- })() : void 0, Yr = await E({
1739
- input: h?.tenancy?.residency,
1740
- namespaceIsolationOn: Kr,
1741
- makeStoreForUrl: (e, t) => ot(h, void 0, qt(O(), t)),
1742
- log: {
1743
- info: (e, t) => $.info(e, t),
1744
- warn: (e, t) => $.warn(e, t)
1745
- }
1746
- });
1747
- Yr !== void 0 && qr(async () => {
1748
- await Yr.close();
1749
- });
1750
- let X = await fa({
1751
- bootTiming: u,
1752
- broadcastNamespace: I,
1753
- scheduling: (() => {
1754
- let e = vn;
1755
- return {
1756
- admissionDrainMs: e.admissionDrainMs,
1757
- inferenceTickMs: e.inferenceTickMs,
1758
- cancelSweepMs: e.cancelSweepMs,
1759
- stalenessSweepMs: e.stalenessSweepMs,
1760
- disarmWhenIdle: rt({
1761
- changeScope: w.changeScope,
1762
- broadcastAttached: In !== void 0
1763
- })
1764
- };
1765
- })(),
1766
- ...h?.workflows?.staleness === void 0 ? {} : { workflowStaleness: h.workflows.staleness },
1767
- ...h?.workflows?.suspendSignalHintMs === void 0 ? {} : { workflowSuspendSignalHintMs: h.workflows.suspendSignalHintMs },
1768
- workflowRecording: Pt(h?.workflows?.recording),
1769
- membership: {
1770
- ...jn,
1771
- instanceId: F
1772
- },
1773
- security: {
1774
- defaultDeny: je(h),
1775
- ...ye(h)
1776
- },
1777
- approvals: { defaultExpiryMs: Ie(h) },
1778
- ...h?.plugins === void 0 ? {} : { plugins: h.plugins },
1779
- ...Hn ? { idempotency: Hn } : {},
1780
- restRoutes: Vn,
1781
- appProcedures: fe,
1782
- discovered: {
1783
- queries: [...v.queries, ...zr],
1784
- mutations: v.mutations,
1785
- actions: [...v.actions, ...Rr],
1786
- streams: v.streams,
1787
- events: v.events,
1788
- workflows: v.workflows,
1789
- workflowWorkers: v.workflowWorkers,
1790
- eventTriggers: v.eventTriggers,
1791
- schedules: Qn,
1792
- subscribers: pr,
1793
- outboxHandlers: J,
1794
- connections: v.connections,
1795
- reactions: q,
1796
- aggregates: _r,
1797
- expectations: Mr,
1798
- budgets: Fr,
1799
- experiments: Lr,
1800
- ...Oe === void 0 ? {} : { webhooks: Oe }
1801
- },
1802
- log: $,
1803
- analytics: Le.sink,
1804
- aggregateStorage: wr,
1805
- aggregateCoordinator: Tr,
1806
- store: w,
1807
- kv: Dt,
1808
- cache: ut,
1809
- snapshotCache: lt,
1810
- ...h?.reactive === void 0 ? {} : { reactive: h.reactive },
1811
- schemaRegistry: Ge,
1812
- tenantScopedTables: v.tenantScopedTables,
1813
- softDeleteScopedTables: v.softDeleteScopedTables,
1814
- dataTransferSnapshot: Jn(C, g),
1815
- dataTransferDialect: g,
1816
- ...Jr === void 0 ? {} : { ensureTenantProvisioned: Jr.ensure },
1817
- ...Yr === void 0 ? {} : { resolveResidentStore: Yr.resolveStore },
1818
- tenantIsolation: (process.env.VOLTRO_TENANT_ISOLATION ?? h?.tenancy?.isolation) === "namespace" ? "namespace" : "shared-schema",
1819
- resolveSubject: (e, t) => Bn({
1820
- headers: e,
1821
- clientId: t
1822
- }),
1823
- ...h?.auth === void 0 ? {} : { authority: h.auth },
1824
- ...h?.agents === void 0 ? {} : { agents: h.agents },
1825
- httpRoutes: j.flatMap((e) => e.httpRoutes ?? []),
1826
- getStore: () => qe,
1827
- ...Wn ? { baseLayer: Wn } : {},
1828
- ...cr === void 0 ? {} : { workflowEngineLayer: cr },
1829
- scheduleDefaultTrigger: G,
1830
- scheduleCoordination: ar,
1831
- scheduleArmSelf: !K,
1832
- dormancy: process.env.VOLTRO_DORMANCY === "sleep" || process.env.VOLTRO_DORMANCY === "always-on" ? process.env.VOLTRO_DORMANCY : h?.dormancy ?? "always-on",
1833
- scheduleReplicaId: process.env.HOSTNAME ?? `pid-${process.pid}`,
1834
- ...dr === void 0 ? {} : { scheduleFireInterceptor: dr },
1835
- onSchedulerReady: (e) => {
1836
- or = e;
1837
- },
1838
- inspectRoute: { handle: async (e, t, n, r) => await te(e, Gr, t, {
1839
- method: n,
1840
- ...r === void 0 ? {} : { body: r }
1841
- }) || ((n === "GET" ? await hn(e, Gr, t, { method: n }) : null) ?? mn(e, Gr, t, {
1842
- method: n,
1843
- ...r === void 0 ? {} : { body: r }
1844
- }) ?? {
1845
- status: 404,
1846
- contentType: "application/json",
1847
- body: JSON.stringify({ error: "not an inspect route" })
1848
- }) },
1849
- ...h?.name === void 0 ? {} : { appName: h.name },
1850
- observability: Pn,
1851
- port: ie,
1852
- ...h?.transport?.wsPath ? { path: h.transport.wsPath } : {}
1853
- });
1854
- return R = X.dispatcher, Ee(It([
1855
- v.queries,
1856
- v.mutations,
1857
- v.actions,
1858
- v.streams
1859
- ]), (e) => {
1860
- $.warn(e);
1861
- }), $.info(`API listening on :${ie}`, {
1862
- dialect: g,
1863
- queries: v.queries.length,
1864
- mutations: v.mutations.length,
1865
- actions: v.actions.length,
1866
- streams: v.streams.length,
1867
- workflows: v.workflows.length,
1868
- workflowWorkers: v.workflowWorkers.length,
1869
- schedules: Qn.length,
1870
- scheduleCoordination: ar
1871
- }), u.finish($), qr(async () => {
1872
- for (let e of Tn) e.stop();
1873
- Mt.stop();
1874
- try {
1875
- await X.close(), Tt(), Ht?.dispose(), await Nn.deactivate(), await In?.close(), await Xe({
1876
- mirror: At,
1877
- log: $
1878
- }), await Le.dispose(), await w.close?.();
1879
- } catch (e) {
1880
- console.error("serve: shutdown step failed, exiting anyway:", e);
1881
- }
1882
- }), await new Promise(() => {}), 0;
1883
- };
1884
- //#endregion
1885
- export { ha as n, pa as r, ga as t };