@voltro/cli 0.21.0 → 0.22.1
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.
- package/CHANGELOG.md +316 -0
- package/dist/apiBuild-COyPDf3R.js +2 -0
- package/dist/{apiBuild-BHOtsQkp.js → apiBuild-DiWxVz-M.js} +2 -2
- package/dist/bin.js +3 -3
- package/dist/{commands-BZoimvvS.js → commands-BxRaIOBG.js} +1548 -1246
- package/dist/dbCommand-CO3eSAZR.js +2 -0
- package/dist/{dbCommand-CDBbZ-Ac.js → dbCommand-DVASmZj2.js} +295 -253
- package/dist/{dev-DKb92NYX.js → dev-BRiPgbKw.js} +1738 -1702
- package/dist/{dev-CZQ73Yoh.js → dev-Dd3EZzj5.js} +1 -1
- package/dist/index.js +1 -1
- package/dist/inspect-BA67TF6v.js +2 -0
- package/dist/inspect-_ldwsAwH.js +945 -0
- package/dist/{inspectMetrics-DMjWBQif.js → inspectMetrics-9ZSuDeqD.js} +148 -115
- package/dist/{manifestBuild-P9yuCY2d.js → manifestBuild-Bs1Uw22_.js} +1 -1
- package/dist/manifestBuild-i-fRHg_H.js +2 -0
- package/dist/{serveCommand-qHJCs0cX.js → serveCommand-DXJOARkO.js} +305 -306
- package/dist/serveEntry.js +2 -2
- package/dist/{start-B1x6Z60h.js → start-CsIjcOi-.js} +3 -3
- package/dist/startEntry.js +2 -2
- package/package.json +17 -17
- package/templates/AGENTS.md +1 -1
- package/templates/agent-docs/_index.md +1 -1
- package/templates/agent-docs/cli.md +118 -5
- package/templates/agent-docs/data.md +58 -0
- package/templates/agent-docs/database/migrations.md +142 -20
- package/templates/agent-docs/plugins.md +1 -1
- package/templates/agent-docs/schema-driven-ui.md +2 -2
- package/templates/agent-docs/templates/apibackends.md +1 -1
- package/templates/agent-docs/whats-new.md +32 -114
- package/templates/apps/api-ai/package.json +7 -7
- package/templates/apps/api-auth/package.json +8 -8
- package/templates/apps/api-backend/package.json +7 -7
- package/templates/apps/api-backend-deactivation/package.json +7 -7
- package/templates/apps/api-backend-mail/package.json +8 -8
- package/templates/apps/api-backend-mariadb/package.json +9 -9
- package/templates/apps/api-backend-storage/package.json +8 -8
- package/templates/apps/api-data-advanced/package.json +8 -8
- package/templates/apps/api-durable/package.json +8 -8
- package/templates/apps/api-feature-flags/package.json +9 -9
- package/templates/apps/api-governance/package.json +8 -8
- package/templates/apps/api-kv/package.json +8 -8
- package/templates/apps/api-moderation/package.json +8 -8
- package/templates/apps/api-observability/package.json +8 -8
- package/templates/apps/api-ratelimit/package.json +8 -8
- package/templates/apps/api-rbac/package.json +8 -8
- package/templates/apps/api-rest/package.json +7 -7
- package/templates/apps/api-saas/package.json +11 -11
- package/templates/apps/api-search/package.json +8 -8
- package/templates/apps/api-versioning/package.json +8 -8
- package/templates/apps/api-webhooks/package.json +9 -9
- package/templates/apps/changelog/package.json +6 -6
- package/templates/apps/edge-functions/package.json +2 -2
- package/templates/apps/frontend-admin/package.json +8 -8
- package/templates/apps/frontend-app/package.json +8 -8
- package/templates/apps/frontend-blank/package.json +7 -7
- package/templates/apps/frontend-contact/package.json +7 -7
- package/templates/apps/frontend-dashboard/package.json +7 -7
- package/templates/apps/frontend-docs/package.json +7 -7
- package/templates/apps/frontend-i18n/package.json +6 -6
- package/templates/apps/frontend-landing/package.json +7 -7
- package/templates/apps/frontend-spa/package.json +7 -7
- package/templates/apps/frontend-ssr/package.json +7 -7
- package/templates/apps/frontend-ssr-api/package.json +8 -8
- package/templates/apps/frontend-static-blog/package.json +6 -6
- package/dist/apiBuild-K7M6Rt0U.js +0 -2
- package/dist/dbCommand-oADAj6ez.js +0 -2
- package/dist/inspect-DcZ04OME.js +0 -2
- package/dist/inspect-Dwx0_tUj.js +0 -921
- package/dist/manifestBuild-D1MzJAiQ.js +0 -2
|
@@ -1,54 +1,54 @@
|
|
|
1
|
-
import { at as e, t } from "./inspectMetrics-
|
|
1
|
+
import { at as e, t } from "./inspectMetrics-9ZSuDeqD.js";
|
|
2
2
|
import { s as n } from "./seedRunner-D6eu-u5U.js";
|
|
3
3
|
import { r, t as i } from "./appModuleLoader-C9r9mxZt.js";
|
|
4
4
|
import { f as a, m as o, n as s, p as c, u as l } from "./frameworkTableAssembly-sg41s14F.js";
|
|
5
5
|
import { l as u } from "./fileConventions-CBNPZVOV.js";
|
|
6
|
-
import { p as d } from "./inspect-
|
|
7
|
-
import { $ as ee, A as f, B as p, C as te, D as m, E as ne, F as re, G as ie, H as ae, I as h, K as oe, L as g, M as _, N as se, O as v, P as y, R as ce, S as le, T as ue, V as de, W as fe, _ as b, at as pe, b as me, c as he, et as ge, h as
|
|
8
|
-
import { l as
|
|
9
|
-
import { t as
|
|
10
|
-
import { n as
|
|
11
|
-
import { join as
|
|
12
|
-
import { pathToFileURL as
|
|
13
|
-
import { Cause as
|
|
14
|
-
import { createLogger as
|
|
15
|
-
import { existsSync as
|
|
16
|
-
import { AggregateRegistry as
|
|
6
|
+
import { p as d } from "./inspect-_ldwsAwH.js";
|
|
7
|
+
import { $ as ee, A as f, B as p, C as te, D as m, E as ne, F as re, G as ie, H as ae, I as h, K as oe, L as g, M as _, N as se, O as v, P as y, R as ce, S as le, T as ue, V as de, W as fe, _ as b, at as pe, b as me, c as he, et as ge, h as _e, i as x, it as S, j as ve, k as ye, lt as be, m as C, nt as w, o as T, ot as xe, q as Se, r as Ce, rt as we, st as Te, t as Ee, tt as De, u as Oe, ut as ke, v as Ae, w as je, x as E, y as Me, z as Ne } from "./dev-BRiPgbKw.js";
|
|
8
|
+
import { l as D, r as O } from "./apiBuild-DiWxVz-M.js";
|
|
9
|
+
import { t as k } from "./bootTiming-BdyP9nYw.js";
|
|
10
|
+
import { n as Pe } from "./cliArgs-qdZSElM3.js";
|
|
11
|
+
import { join as Fe } from "node:path";
|
|
12
|
+
import { pathToFileURL as Ie } from "node:url";
|
|
13
|
+
import { Cause as Le, Effect as A, Layer as j, ManagedRuntime as Re } from "effect";
|
|
14
|
+
import { createLogger as M } from "@voltro/logger";
|
|
15
|
+
import { existsSync as ze } from "node:fs";
|
|
16
|
+
import { AggregateRegistry as N, Dispatcher as Be, apiKeyManagementRoutes as Ve, applySoftDeleteScope as He, applyTenantScope as Ue, attachAnalyticsMirror as We, awaitServerListening as Ge, bindMutation as P, bindStream as Ke, bindSubscription as F, buildTracingLayer as qe, cancelWakeup as Je, compileCron as I, dataStoreApiKeyStore as Ye, dataStoreIdempotencyStore as Xe, formatServerOnlyLeaks as Ze, frameworkApiKeyStrategy as Qe, installPolicyGuardResolver as $e, loadResourceTuples as et, makeActionRunner as L, makeAdvisoryLockCoordinator as tt, makeApiKeyService as nt, makeApiKeyUsageBuffer as rt, makeApiKeyUsageFlusher as it, makeAsyncKv as at, makeCoordinatedScheduler as ot, makeEffectStoreLayer as st, makeLazyWorkflowFacade as ct, makeMutationRunner as lt, makeOneShotQueryRunner as ut, makeQueryDescriptorProducer as dt, makeQueryReauthorizer as ft, makeQuerySubscriber as pt, makeSchemaRegistry as mt, makeWorkflowFacade as ht, makeWorkflowFacadeWithCallerContext as gt, makeWorkflowLayers as _t, noopKv as R, onProcessShutdown as vt, recordSubscriptionDelivery as yt, registerWakeup as z, resolveSecretsBackend as bt, runProvidedEffect as B, setSecretsBackend as xt, setSystemStoreHandle as St, setTupleSource as Ct, singleCoordinator as wt, startRpcServer as Tt, startScheduler as Et, workflowToRpc as V, wrapStoreWithBootCodec as Dt } from "@voltro/runtime";
|
|
17
17
|
import { RpcGroup as Ot } from "@effect/rpc";
|
|
18
18
|
import { SqlClient as kt } from "@effect/sql";
|
|
19
|
-
import { and as At, ensureTableRegistered as jt, eq as
|
|
20
|
-
import { appStorageProvider as
|
|
21
|
-
import { AuthMiddleware as
|
|
22
|
-
import { assertProductionSessionSecret as
|
|
23
|
-
import { createHash as
|
|
24
|
-
import { declaredSnapshot as
|
|
25
|
-
import { getAuthSessionStrategy as
|
|
26
|
-
import { collectPublicApiRoutes as
|
|
27
|
-
import { buildDeliverWebhookExecute as
|
|
28
|
-
import { packBundle as
|
|
19
|
+
import { and as At, ensureTableRegistered as jt, eq as H, or as Mt } from "@voltro/database";
|
|
20
|
+
import { appStorageProvider as U, fromNodeReadable as Nt, getObjectStream as Pt, putObjectStream as Ft, toNodeReadable as W } from "@voltro/plugin-storage";
|
|
21
|
+
import { AuthMiddleware as It, ConnectionInfoMiddleware as G, actionToRpc as K, anonymousSubject as Lt, isWireReachable as Rt, mutationToRpc as zt, queryToRpc as q, streamToRpc as Bt, workflowCancelDescriptor as Vt, workflowDomainEventsQueryDescriptor as J, workflowEventDeliveriesQueryDescriptor as Ht, workflowResumeDescriptor as Ut, workflowRunEventsQueryDescriptor as Y, workflowRunQueryDescriptor as X, workflowRunStepsQueryDescriptor as Wt, workflowRunsQueryDescriptor as Z, workflowSignalDescriptor as Gt, workflowUpdateDescriptor as Kt } from "@voltro/protocol";
|
|
22
|
+
import { assertProductionSessionSecret as qt } from "@voltro/protocol/session";
|
|
23
|
+
import { createHash as Jt, timingSafeEqual as Yt } from "node:crypto";
|
|
24
|
+
import { declaredSnapshot as Xt, describeOutcome as Zt, runPlannedMigrations as Qt } from "@voltro/database/sql";
|
|
25
|
+
import { getAuthSessionStrategy as $t } from "@voltro/plugin-auth";
|
|
26
|
+
import { collectPublicApiRoutes as en, restRoutesToHttpRoutes as tn } from "@voltro/protocol/rest";
|
|
27
|
+
import { buildDeliverWebhookExecute as nn, buildWebhooksService as rn, defaultIncomingPath as an, deliverWebhookWorkflow as on, mountIncomingWebhook as sn } from "@voltro/plugin-webhooks";
|
|
28
|
+
import { packBundle as cn, runExport as ln, runImport as un, storageBlobSink as dn, storageRefsBlobSource as fn, unpackBundle as pn, unpackBundleToDir as mn } from "@voltro/data-transfer";
|
|
29
29
|
//#region src/bootRefusal.ts
|
|
30
|
-
var
|
|
30
|
+
var hn = "VoltroBootRefusal", gn = (e) => {
|
|
31
31
|
let t = Error(e);
|
|
32
|
-
return t.name =
|
|
33
|
-
},
|
|
32
|
+
return t.name = hn, t;
|
|
33
|
+
}, _n = "/_voltro/admin/import", vn = "/_voltro/admin/export", Q = (e, t) => ({
|
|
34
34
|
status: e,
|
|
35
35
|
contentType: "application/json; charset=utf-8",
|
|
36
36
|
body: JSON.stringify(t)
|
|
37
|
-
}),
|
|
37
|
+
}), yn = (e) => {
|
|
38
38
|
let t = e.authorization ?? e.Authorization, n = t ? /^Bearer\s+(.+)$/i.exec(t) : null;
|
|
39
39
|
return n ? n[1] : null;
|
|
40
|
-
},
|
|
40
|
+
}, bn = (e, t) => Yt(Jt("sha256").update(e).digest(), Jt("sha256").update(t).digest()), xn = (e, t) => {
|
|
41
41
|
if (e.method.toUpperCase() !== "POST") return Q(405, { error: "method not allowed" });
|
|
42
42
|
if (!t || t.length < 16) return Q(503, { error: "data transfer misconfigured (no/weak secret)" });
|
|
43
|
-
let n =
|
|
44
|
-
return !n || !
|
|
45
|
-
},
|
|
43
|
+
let n = yn(e.headers);
|
|
44
|
+
return !n || !bn(n, t) ? Q(401, { error: "unauthorized" }) : null;
|
|
45
|
+
}, Sn = M({ scope: "voltro:admin-import" }), Cn = "VBUNDLE2", wn = async function* (e) {
|
|
46
46
|
yield e;
|
|
47
|
-
},
|
|
48
|
-
let n =
|
|
47
|
+
}, Tn = (e) => async (t) => {
|
|
48
|
+
let n = xn(t, e.secret);
|
|
49
49
|
if (n) return n;
|
|
50
|
-
let r = t.headers["x-import-mode"], i = t.headers["x-import-on-conflict"], a = t.headers["x-import-atomic"] === "1" || t.headers["x-import-atomic"] === "true", o = t.headers["x-import-force"] === "1" || t.headers["x-import-force"] === "true", s = t.rawBody.byteLength >= 8 && Buffer.from(t.rawBody.subarray(0, 8)).toString("latin1") ===
|
|
51
|
-
if (s) c =
|
|
50
|
+
let r = t.headers["x-import-mode"], i = t.headers["x-import-on-conflict"], a = t.headers["x-import-atomic"] === "1" || t.headers["x-import-atomic"] === "true", o = t.headers["x-import-force"] === "1" || t.headers["x-import-force"] === "true", s = t.rawBody.byteLength >= 8 && Buffer.from(t.rawBody.subarray(0, 8)).toString("latin1") === Cn, c, l;
|
|
51
|
+
if (s) c = wn(t.rawBody), l = "upload";
|
|
52
52
|
else {
|
|
53
53
|
let n;
|
|
54
54
|
try {
|
|
@@ -62,11 +62,11 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
62
62
|
}
|
|
63
63
|
let 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-import-"));
|
|
64
64
|
try {
|
|
65
|
-
e.assetSink ? await
|
|
65
|
+
e.assetSink ? await pn(c, {
|
|
66
66
|
dir: f,
|
|
67
67
|
blobs: e.assetSink
|
|
68
|
-
}) : await
|
|
69
|
-
let t = await
|
|
68
|
+
}) : await mn(c, f);
|
|
69
|
+
let t = await A.runPromiseExit(un({
|
|
70
70
|
store: e.store,
|
|
71
71
|
bundleDir: f,
|
|
72
72
|
...r ? { mode: r } : {},
|
|
@@ -74,14 +74,14 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
74
74
|
...a ? { atomic: a } : {},
|
|
75
75
|
...e.snapshot ? { targetSnapshot: e.snapshot } : {},
|
|
76
76
|
force: o,
|
|
77
|
-
onWarn: (e) =>
|
|
77
|
+
onWarn: (e) => Sn.warn("admin.import", { message: e }),
|
|
78
78
|
...e.assetSink ? { assetsAlreadyRestored: !0 } : {}
|
|
79
79
|
}));
|
|
80
80
|
if (t._tag === "Failure") {
|
|
81
81
|
let e = t.cause._tag === "Fail" ? t.cause.error : void 0;
|
|
82
82
|
if (e && e._tag === "SchemaDriftError") {
|
|
83
83
|
let t = e;
|
|
84
|
-
return
|
|
84
|
+
return Sn.warn("admin.import refused (schema drift)", {
|
|
85
85
|
transport: l,
|
|
86
86
|
bundle: t.bundleFingerprint.slice(0, 16),
|
|
87
87
|
target: t.targetFingerprint.slice(0, 16)
|
|
@@ -96,7 +96,7 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
96
96
|
throw Error(String(e?.message ?? e ?? "import failed"));
|
|
97
97
|
}
|
|
98
98
|
let n = t.value, s = n.tables.reduce((e, t) => e + t.rowCount, 0);
|
|
99
|
-
return
|
|
99
|
+
return Sn.info("admin.import", {
|
|
100
100
|
transport: l,
|
|
101
101
|
tables: n.tables.length,
|
|
102
102
|
rows: s,
|
|
@@ -108,7 +108,7 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
108
108
|
transport: l
|
|
109
109
|
});
|
|
110
110
|
} catch (e) {
|
|
111
|
-
return
|
|
111
|
+
return Sn.warn("admin.import failed", {
|
|
112
112
|
transport: l,
|
|
113
113
|
error: e?.message ?? String(e)
|
|
114
114
|
}), Q(500, {
|
|
@@ -121,18 +121,18 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
121
121
|
force: !0
|
|
122
122
|
});
|
|
123
123
|
}
|
|
124
|
-
},
|
|
124
|
+
}, En = M({ scope: "voltro:admin-export" }), Dn = async (e) => {
|
|
125
125
|
let t = [];
|
|
126
126
|
for await (let n of e) t.push(Buffer.from(n));
|
|
127
127
|
return new Uint8Array(Buffer.concat(t));
|
|
128
|
-
},
|
|
128
|
+
}, On = (e) => typeof e.tenant == "string" && e.tenant ? {
|
|
129
129
|
kind: "tenant",
|
|
130
130
|
tenantId: e.tenant
|
|
131
131
|
} : Array.isArray(e.tables) && e.tables.length ? {
|
|
132
132
|
kind: "tables",
|
|
133
133
|
tables: e.tables.filter((e) => typeof e == "string")
|
|
134
|
-
} : { kind: "all" },
|
|
135
|
-
let n =
|
|
134
|
+
} : { kind: "all" }, kn = (e) => async (t) => {
|
|
135
|
+
let n = xn(t, e.secret);
|
|
136
136
|
if (n) return n;
|
|
137
137
|
let r;
|
|
138
138
|
try {
|
|
@@ -152,9 +152,9 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
152
152
|
});
|
|
153
153
|
}
|
|
154
154
|
}
|
|
155
|
-
let a = r.consistency === "snapshot" ? "snapshot" : i.consistency ?? "live", o = (typeof r.compression == "string" ? r.compression : void 0) ?? i.compression, s = i.scope ??
|
|
155
|
+
let a = r.consistency === "snapshot" ? "snapshot" : i.consistency ?? "live", o = (typeof r.compression == "string" ? r.compression : void 0) ?? i.compression, s = i.scope ?? On(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-"));
|
|
156
156
|
try {
|
|
157
|
-
let t = await
|
|
157
|
+
let t = await A.runPromise(ln({
|
|
158
158
|
store: e.store,
|
|
159
159
|
snapshot: e.snapshot,
|
|
160
160
|
dialect: e.dialect,
|
|
@@ -170,10 +170,10 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
170
170
|
if (c) {
|
|
171
171
|
if (!e.putArchive) return Q(501, { error: "storage transport not configured on this instance" });
|
|
172
172
|
let i = r.bundleKey;
|
|
173
|
-
return await e.putArchive(i, () =>
|
|
173
|
+
return await e.putArchive(i, () => cn({
|
|
174
174
|
dir: f,
|
|
175
175
|
...l
|
|
176
|
-
})),
|
|
176
|
+
})), En.info("admin.export", {
|
|
177
177
|
transport: "storage",
|
|
178
178
|
tables: t.tables.length,
|
|
179
179
|
rows: n,
|
|
@@ -187,11 +187,11 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
187
187
|
transport: "storage"
|
|
188
188
|
});
|
|
189
189
|
}
|
|
190
|
-
let d = await
|
|
190
|
+
let d = await Dn(cn({
|
|
191
191
|
dir: f,
|
|
192
192
|
...l
|
|
193
193
|
}));
|
|
194
|
-
return
|
|
194
|
+
return En.info("admin.export", {
|
|
195
195
|
transport: "download",
|
|
196
196
|
tables: t.tables.length,
|
|
197
197
|
rows: n,
|
|
@@ -208,7 +208,7 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
208
208
|
}
|
|
209
209
|
};
|
|
210
210
|
} catch (e) {
|
|
211
|
-
return
|
|
211
|
+
return En.warn("admin.export failed", { error: e?.message ?? String(e) }), Q(500, {
|
|
212
212
|
error: "export failed",
|
|
213
213
|
message: e?.message ?? String(e)
|
|
214
214
|
});
|
|
@@ -218,7 +218,7 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
218
218
|
force: !0
|
|
219
219
|
});
|
|
220
220
|
}
|
|
221
|
-
},
|
|
221
|
+
}, An = async (e) => {
|
|
222
222
|
let { resolve: t } = await import("node:path"), { existsSync: n } = await import("node:fs"), r = [
|
|
223
223
|
e,
|
|
224
224
|
`${e}.profile.ts`,
|
|
@@ -229,8 +229,8 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
229
229
|
let a = await import(i), o = a.default ?? a.profile;
|
|
230
230
|
if (!o) throw Error(`data profile '${i}' has no default export`);
|
|
231
231
|
return o;
|
|
232
|
-
},
|
|
233
|
-
let r = await W((await
|
|
232
|
+
}, jn = (e, t, n = {}) => (async function* () {
|
|
233
|
+
let r = await W((await A.runPromise(Pt(e, t).pipe(A.timeout(n.openTimeout ?? "30 seconds")))).stream), i = n.stallMs ?? 12e4, a, o = () => {
|
|
234
234
|
a && clearTimeout(a), a = setTimeout(() => r.destroy(/* @__PURE__ */ Error(`storage read stalled for ${i}ms reading '${t}'`)), i);
|
|
235
235
|
};
|
|
236
236
|
try {
|
|
@@ -239,7 +239,7 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
239
239
|
} finally {
|
|
240
240
|
a && clearTimeout(a), r.destroy();
|
|
241
241
|
}
|
|
242
|
-
})(),
|
|
242
|
+
})(), Mn = {
|
|
243
243
|
get: async () => void 0,
|
|
244
244
|
set: async () => {},
|
|
245
245
|
setWithTags: async () => {},
|
|
@@ -248,21 +248,21 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
248
248
|
clear: async () => {},
|
|
249
249
|
invalidateTag: async () => 0,
|
|
250
250
|
wrap: async (e, t, n) => n()
|
|
251
|
-
},
|
|
251
|
+
}, Nn = async (e) => {
|
|
252
252
|
St({
|
|
253
253
|
dataStore: e.store,
|
|
254
254
|
schemaRegistry: e.schemaRegistry
|
|
255
255
|
});
|
|
256
|
-
let t = new
|
|
256
|
+
let t = new Be({
|
|
257
257
|
store: e.store,
|
|
258
258
|
...e.snapshotCache ? { cache: e.snapshotCache } : {},
|
|
259
|
-
recordDelivery: (e) =>
|
|
259
|
+
recordDelivery: (e) => yt({
|
|
260
260
|
label: e.label,
|
|
261
261
|
kind: e.kind,
|
|
262
262
|
durationMs: e.durationMs,
|
|
263
263
|
rowCount: e.rowCount
|
|
264
264
|
})
|
|
265
|
-
}), n = e.cache ??
|
|
265
|
+
}), n = e.cache ?? Mn, r = e.kv ?? R, i, a, o, s = /* @__PURE__ */ new Map(), c = () => `wfctx_${globalThis.crypto?.randomUUID?.() ?? `${Date.now().toString(36)}${Math.random().toString(36).slice(2)}`}`, l = async (t, n, r) => {
|
|
266
266
|
let i = {
|
|
267
267
|
...r,
|
|
268
268
|
source: r.source ?? `workflow:${t}`
|
|
@@ -272,7 +272,7 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
272
272
|
let r = await e.store.query({
|
|
273
273
|
table: "_voltro_workflow_start_contexts",
|
|
274
274
|
order: [],
|
|
275
|
-
predicate:
|
|
275
|
+
predicate: H("executionId", n),
|
|
276
276
|
projection: ["id"],
|
|
277
277
|
skip: void 0,
|
|
278
278
|
take: 1
|
|
@@ -300,7 +300,7 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
300
300
|
let t = (await e.store.query({
|
|
301
301
|
table: "_voltro_workflow_start_contexts",
|
|
302
302
|
order: [],
|
|
303
|
-
predicate:
|
|
303
|
+
predicate: H("executionId", n),
|
|
304
304
|
projection: void 0,
|
|
305
305
|
skip: void 0,
|
|
306
306
|
take: 1
|
|
@@ -318,7 +318,7 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
318
318
|
process.stderr.write(`[workflow] failed to load start context for ${n}: ${e?.message ?? String(e)}\n`);
|
|
319
319
|
return;
|
|
320
320
|
}
|
|
321
|
-
}, d = (e.discovered.workflows?.length ?? 0) > 0 ? ct(() => i) : void 0, f = (e.discovered.workflows?.length ?? 0) > 0 || (e.discovered.eventTriggers?.length ?? 0) > 0, te = f || (e.discovered.workflowWorkers?.length ?? 0) > 0 || e.scheduleCoordination === "cluster", re = e.tenantIsolation === "namespace", ie = (e.log ??
|
|
321
|
+
}, d = (e.discovered.workflows?.length ?? 0) > 0 ? ct(() => i) : void 0, f = (e.discovered.workflows?.length ?? 0) > 0 || (e.discovered.eventTriggers?.length ?? 0) > 0, te = f || (e.discovered.workflowWorkers?.length ?? 0) > 0 || e.scheduleCoordination === "cluster", re = e.tenantIsolation === "namespace", ie = (e.log ?? M({ scope: "voltro:serve" })).child("webhooks"), ae, h = e.discovered.webhooks;
|
|
322
322
|
if (h && h.outgoing.length > 0 && e.workflowEngineLayer !== void 0) {
|
|
323
323
|
let t = e.workflowEngineLayer, i = S({
|
|
324
324
|
store: e.store,
|
|
@@ -326,9 +326,9 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
326
326
|
cache: n,
|
|
327
327
|
kv: r
|
|
328
328
|
}), a = h.outgoing.map((e) => e.descriptor);
|
|
329
|
-
ae =
|
|
330
|
-
let n =
|
|
331
|
-
|
|
329
|
+
ae = rn(i, async (e) => {
|
|
330
|
+
let n = on.execute(e).pipe(A.provide(on.toLayer(nn(i, { events: a })).pipe(j.provideMerge(t))));
|
|
331
|
+
A.runPromise(n).catch((t) => {
|
|
332
332
|
ie.error("deliverWebhook workflow crashed", {
|
|
333
333
|
deliveryId: e.deliveryId,
|
|
334
334
|
targetId: e.targetId
|
|
@@ -338,7 +338,7 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
338
338
|
}
|
|
339
339
|
let oe = /* @__PURE__ */ new Map();
|
|
340
340
|
if (h) for (let e of h.incoming) {
|
|
341
|
-
let t = e.descriptor.path ??
|
|
341
|
+
let t = e.descriptor.path ?? an(e.descriptor.id), n = `VOLTRO_WEBHOOK_SECRET_${e.descriptor.id.toUpperCase().replace(/[^A-Z0-9]/g, "_")}`, r = sn(e.descriptor, {
|
|
342
342
|
resolveSecret: async () => process.env[n] ?? null,
|
|
343
343
|
resolveWorkflows: () => d === void 0 ? void 0 : gt(d, {
|
|
344
344
|
traceId: `incoming:${e.descriptor.id}`,
|
|
@@ -357,16 +357,16 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
357
357
|
});
|
|
358
358
|
oe.set(t, { handle: r });
|
|
359
359
|
}
|
|
360
|
-
|
|
360
|
+
$e(), Ct((t) => et(e.store, t.subjectId, t.resourceType, t.resourceId));
|
|
361
361
|
let se = (e.discovered.outboxHandlers?.length ?? 0) > 0 ? p({
|
|
362
362
|
handlers: e.discovered.outboxHandlers ?? [],
|
|
363
363
|
store: e.store,
|
|
364
|
-
log: (e.log ??
|
|
364
|
+
log: (e.log ?? M({ scope: "voltro:serve" })).child("outbox")
|
|
365
365
|
}) : void 0, v = ce({
|
|
366
366
|
definitions: (e.discovered.connections ?? []).map((e) => e.definition),
|
|
367
367
|
store: e.store,
|
|
368
368
|
publicUrl: g(e.port ?? 4e3),
|
|
369
|
-
log: (e.log ??
|
|
369
|
+
log: (e.log ?? M({ scope: "voltro:serve" })).child("connections")
|
|
370
370
|
}), y = we({
|
|
371
371
|
store: e.store,
|
|
372
372
|
schemaRegistry: e.schemaRegistry,
|
|
@@ -378,108 +378,108 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
378
378
|
namespaceIsolationOn: re,
|
|
379
379
|
...se === void 0 ? {} : { outbox: { nudge: se.nudge } },
|
|
380
380
|
...v.active ? { connections: { registry: v.registry } } : {}
|
|
381
|
-
}), ue =
|
|
382
|
-
let r = t.pipe(
|
|
383
|
-
return
|
|
384
|
-
}, pe = lt({
|
|
381
|
+
}), ue = j.succeed(N, m), fe = (t, n) => {
|
|
382
|
+
let r = t.pipe(A.provide(st(n)));
|
|
383
|
+
return (e.baseLayer ? r.pipe(A.provide(e.baseLayer)) : r).pipe(A.provide(ue));
|
|
384
|
+
}, pe = (e, t) => B(fe(e, t)), me = lt({
|
|
385
385
|
store: e.store,
|
|
386
386
|
buildContext: (e, t, n) => y(e, t, n),
|
|
387
|
-
runEffect:
|
|
387
|
+
runEffect: pe,
|
|
388
388
|
undoCapture: le()
|
|
389
|
-
}),
|
|
389
|
+
}), he = E(), ge = L({
|
|
390
390
|
buildContext: (e) => y(e),
|
|
391
|
-
runEffect:
|
|
392
|
-
}),
|
|
391
|
+
runEffect: pe
|
|
392
|
+
}), _e = {
|
|
393
393
|
buildContext: (e) => y(e),
|
|
394
394
|
finalize: (t, n) => He(Ue(t, e.tenantScopedTables, n.subject.tenantId), e.softDeleteScopedTables),
|
|
395
|
-
provideEffect:
|
|
396
|
-
}, x = dt(
|
|
397
|
-
...
|
|
395
|
+
provideEffect: fe
|
|
396
|
+
}, x = dt(_e), ye = ut({
|
|
397
|
+
..._e,
|
|
398
398
|
queryRows: (t) => e.store.query(t)
|
|
399
|
-
}),
|
|
400
|
-
...
|
|
399
|
+
}), be = pt({
|
|
400
|
+
..._e,
|
|
401
401
|
subscribeDescriptor: (e, n, r) => t.subscribe(e, n, r),
|
|
402
402
|
subscribeComputed: (e, n, r) => t.subscribeComputed(e, n, r)
|
|
403
403
|
}), C = {};
|
|
404
404
|
for (let n of [
|
|
405
405
|
...e.discovered.queries,
|
|
406
|
-
...
|
|
406
|
+
...he.queries,
|
|
407
407
|
...v.queries
|
|
408
408
|
]) C[n.descriptor.name] = (e) => F(x(n, e), t, `subscription.${n.descriptor.name}`, void 0, void 0, ft(n, e));
|
|
409
409
|
for (let t of [
|
|
410
410
|
...e.discovered.mutations,
|
|
411
|
-
...
|
|
411
|
+
...he.mutations,
|
|
412
412
|
...v.mutations
|
|
413
|
-
]) C[t.descriptor.name] = (e) => P(async (e, n) =>
|
|
414
|
-
for (let t of [...e.discovered.actions, ...v.actions]) C[t.descriptor.name] = (e) => P(async (e, n) =>
|
|
415
|
-
let
|
|
413
|
+
]) C[t.descriptor.name] = (e) => P(async (e, n) => me(t, e, n), e, `mutation.${t.descriptor.name}`);
|
|
414
|
+
for (let t of [...e.discovered.actions, ...v.actions]) C[t.descriptor.name] = (e) => P(async (e, n) => ge(t, e, n), e, `action.${t.descriptor.name}`);
|
|
415
|
+
let T = () => `public-${Math.random().toString(36).slice(2, 10)}`, xe = [
|
|
416
416
|
...e.discovered.queries.filter((e) => e.descriptor.publicApi !== void 0).map((e) => ({
|
|
417
417
|
descriptor: e.descriptor,
|
|
418
|
-
invoke: (t, n) =>
|
|
418
|
+
invoke: (t, n) => ye(e, t, {
|
|
419
419
|
subject: n.subject,
|
|
420
|
-
traceId:
|
|
420
|
+
traceId: T()
|
|
421
421
|
}),
|
|
422
|
-
subscribe: (t, n, r) =>
|
|
422
|
+
subscribe: (t, n, r) => be(e, t, {
|
|
423
423
|
subject: n.subject,
|
|
424
|
-
traceId:
|
|
424
|
+
traceId: T()
|
|
425
425
|
}, r)
|
|
426
426
|
})),
|
|
427
427
|
...e.discovered.mutations.filter((e) => e.descriptor.publicApi !== void 0).map((e) => ({
|
|
428
428
|
descriptor: e.descriptor,
|
|
429
|
-
invoke: (t, n) =>
|
|
429
|
+
invoke: (t, n) => me(e, t, {
|
|
430
430
|
subject: n.subject,
|
|
431
|
-
traceId:
|
|
431
|
+
traceId: T()
|
|
432
432
|
})
|
|
433
433
|
})),
|
|
434
434
|
...e.discovered.actions.filter((e) => e.descriptor.publicApi !== void 0).map((e) => ({
|
|
435
435
|
descriptor: e.descriptor,
|
|
436
|
-
invoke: (t, n) =>
|
|
436
|
+
invoke: (t, n) => ge(e, t, {
|
|
437
437
|
subject: n.subject,
|
|
438
|
-
traceId:
|
|
438
|
+
traceId: T()
|
|
439
439
|
})
|
|
440
440
|
}))
|
|
441
|
-
],
|
|
441
|
+
], Se = xe.length > 0 ? tn(en(xe), {
|
|
442
442
|
store: e.store,
|
|
443
443
|
resolveSubject: (t) => e.resolveSubject(t, -1)
|
|
444
|
-
}) : [],
|
|
444
|
+
}) : [], Ce = e.dataTransferSecret ?? process.env.VOLTRO_DATA_TRANSFER_SECRET, Te = Ce && Ce.length >= 16 ? [{
|
|
445
445
|
method: "POST",
|
|
446
|
-
path:
|
|
447
|
-
handle:
|
|
448
|
-
secret:
|
|
446
|
+
path: _n,
|
|
447
|
+
handle: Tn({
|
|
448
|
+
secret: Ce,
|
|
449
449
|
store: e.store,
|
|
450
450
|
...e.dataTransferSnapshot ? { snapshot: e.dataTransferSnapshot } : {},
|
|
451
|
-
assetSink:
|
|
452
|
-
openArchive: (e) =>
|
|
451
|
+
assetSink: dn(U()),
|
|
452
|
+
openArchive: (e) => jn(U(), e)
|
|
453
453
|
})
|
|
454
454
|
}, {
|
|
455
455
|
method: "POST",
|
|
456
|
-
path:
|
|
457
|
-
handle:
|
|
458
|
-
secret:
|
|
456
|
+
path: vn,
|
|
457
|
+
handle: kn({
|
|
458
|
+
secret: Ce,
|
|
459
459
|
store: e.store,
|
|
460
460
|
snapshot: e.dataTransferSnapshot ?? { tables: [] },
|
|
461
461
|
dialect: e.dataTransferDialect ?? "memory",
|
|
462
462
|
tenantTables: [...e.tenantScopedTables],
|
|
463
|
-
loadProfile:
|
|
464
|
-
assetSource:
|
|
463
|
+
loadProfile: An,
|
|
464
|
+
assetSource: fn(U(), e.store),
|
|
465
465
|
putArchive: async (e, t) => {
|
|
466
|
-
let { Readable: n } = await import("node:stream"), r =
|
|
467
|
-
await
|
|
466
|
+
let { Readable: n } = await import("node:stream"), r = U(), i = Nt("storage", () => n.from(t()));
|
|
467
|
+
await A.runPromise(Ft(r, e, i, { contentType: "application/octet-stream" }));
|
|
468
468
|
}
|
|
469
469
|
})
|
|
470
|
-
}] : [],
|
|
470
|
+
}] : [], Ee = [
|
|
471
471
|
...e.httpRoutes ?? [],
|
|
472
|
-
...
|
|
473
|
-
...
|
|
472
|
+
...Se,
|
|
473
|
+
...Te,
|
|
474
474
|
...v.httpRoutes
|
|
475
475
|
];
|
|
476
476
|
for (let t of e.discovered.streams ?? []) C[t.descriptor.name] = (n) => Ke((r) => {
|
|
477
477
|
let i = y(r), a = t.executor(n, i);
|
|
478
|
-
if (
|
|
479
|
-
let t = a.pipe(
|
|
480
|
-
return (e.baseLayer ? t.pipe(
|
|
478
|
+
if (A.isEffect(a)) {
|
|
479
|
+
let t = a.pipe(A.provide(st(i.store)));
|
|
480
|
+
return (e.baseLayer ? t.pipe(A.provide(e.baseLayer)) : t).pipe(A.provide(ue));
|
|
481
481
|
}
|
|
482
|
-
return typeof a == "object" && a && typeof a.then == "function" ?
|
|
482
|
+
return typeof a == "object" && a && typeof a.then == "function" ? A.promise(() => a) : a;
|
|
483
483
|
}, `stream.${t.descriptor.name}`);
|
|
484
484
|
for (let t of e.discovered.workflows ?? []) C[t.definition.name] = (e) => P(async (e, n) => {
|
|
485
485
|
let r = n;
|
|
@@ -499,16 +499,16 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
499
499
|
column: "startedAt",
|
|
500
500
|
direction: "desc"
|
|
501
501
|
}],
|
|
502
|
-
predicate: Mt(
|
|
502
|
+
predicate: Mt(H("id", t), H("executionId", t)),
|
|
503
503
|
take: 1,
|
|
504
504
|
skip: void 0,
|
|
505
505
|
projection: void 0
|
|
506
506
|
};
|
|
507
507
|
}
|
|
508
|
-
}, e), t, `subscription.${X.name}`), C[
|
|
509
|
-
descriptor:
|
|
508
|
+
}, e), t, `subscription.${X.name}`), C[Z.name] = (e) => F(x({
|
|
509
|
+
descriptor: Z,
|
|
510
510
|
executor: (e) => {
|
|
511
|
-
let t = e, n = [...t.tag === void 0 ? [] : [
|
|
511
|
+
let t = e, n = [...t.tag === void 0 ? [] : [H("tag", t.tag)], ...t.status === void 0 ? [] : [H("status", t.status)]], r = Number.isFinite(t.limit) && t.limit !== void 0 ? Math.min(Math.max(Math.floor(t.limit), 1), 500) : 100;
|
|
512
512
|
return {
|
|
513
513
|
table: "_voltro_workflow_runs",
|
|
514
514
|
order: [{
|
|
@@ -521,8 +521,8 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
521
521
|
projection: void 0
|
|
522
522
|
};
|
|
523
523
|
}
|
|
524
|
-
}, e), t, `subscription.${
|
|
525
|
-
descriptor:
|
|
524
|
+
}, e), t, `subscription.${Z.name}`), C[Wt.name] = (e) => F(x({
|
|
525
|
+
descriptor: Wt,
|
|
526
526
|
executor: (e) => {
|
|
527
527
|
let t = e.runId;
|
|
528
528
|
return {
|
|
@@ -531,13 +531,13 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
531
531
|
column: "startedAt",
|
|
532
532
|
direction: "asc"
|
|
533
533
|
}],
|
|
534
|
-
predicate:
|
|
534
|
+
predicate: H("runId", t),
|
|
535
535
|
take: 1e3,
|
|
536
536
|
skip: void 0,
|
|
537
537
|
projection: void 0
|
|
538
538
|
};
|
|
539
539
|
}
|
|
540
|
-
}, e), t, `subscription.${
|
|
540
|
+
}, e), t, `subscription.${Wt.name}`), C[Y.name] = (e) => F(x({
|
|
541
541
|
descriptor: Y,
|
|
542
542
|
executor: (e) => {
|
|
543
543
|
let t = e.runId;
|
|
@@ -547,14 +547,14 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
547
547
|
column: "occurredAt",
|
|
548
548
|
direction: "asc"
|
|
549
549
|
}],
|
|
550
|
-
predicate:
|
|
550
|
+
predicate: H("runId", t),
|
|
551
551
|
take: 1e3,
|
|
552
552
|
skip: void 0,
|
|
553
553
|
projection: void 0
|
|
554
554
|
};
|
|
555
555
|
}
|
|
556
|
-
}, e), t, `subscription.${Y.name}`), C[
|
|
557
|
-
descriptor:
|
|
556
|
+
}, e), t, `subscription.${Y.name}`), C[J.name] = (e) => F(x({
|
|
557
|
+
descriptor: J,
|
|
558
558
|
executor: (e) => {
|
|
559
559
|
let t = e;
|
|
560
560
|
return {
|
|
@@ -563,14 +563,14 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
563
563
|
column: "occurredAt",
|
|
564
564
|
direction: "desc"
|
|
565
565
|
}],
|
|
566
|
-
predicate: t.name === void 0 ? void 0 :
|
|
566
|
+
predicate: t.name === void 0 ? void 0 : H("name", t.name),
|
|
567
567
|
take: Math.max(1, Math.min(500, t.limit ?? 100)),
|
|
568
568
|
skip: void 0,
|
|
569
569
|
projection: void 0
|
|
570
570
|
};
|
|
571
571
|
}
|
|
572
|
-
}, e), t, `subscription.${
|
|
573
|
-
descriptor:
|
|
572
|
+
}, e), t, `subscription.${J.name}`), C[Ht.name] = (e) => F(x({
|
|
573
|
+
descriptor: Ht,
|
|
574
574
|
executor: (e) => {
|
|
575
575
|
let t = e.eventId;
|
|
576
576
|
return {
|
|
@@ -579,69 +579,69 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
579
579
|
column: "createdAt",
|
|
580
580
|
direction: "asc"
|
|
581
581
|
}],
|
|
582
|
-
predicate:
|
|
582
|
+
predicate: H("eventId", t),
|
|
583
583
|
take: 500,
|
|
584
584
|
skip: void 0,
|
|
585
585
|
projection: void 0
|
|
586
586
|
};
|
|
587
587
|
}
|
|
588
|
-
}, e), t, `subscription.${
|
|
588
|
+
}, e), t, `subscription.${Ht.name}`), C[Vt.name] = (t) => P(async (t, n) => {
|
|
589
589
|
let r = t;
|
|
590
|
-
return await w(e.store, n.subject, { executionId: r.executionId }), await d.cancel(r.workflowName, r.executionId), await
|
|
591
|
-
}, t, `action.${
|
|
590
|
+
return await w(e.store, n.subject, { executionId: r.executionId }), await d.cancel(r.workflowName, r.executionId), await Fe(r.workflowName, r.executionId, "workflow.cancel"), { ok: !0 };
|
|
591
|
+
}, t, `action.${Vt.name}`), C[Ut.name] = (t) => P(async (t, n) => {
|
|
592
592
|
let r = t;
|
|
593
593
|
return await w(e.store, n.subject, { executionId: r.executionId }), await d.resume(r.workflowName, r.executionId), { ok: !0 };
|
|
594
|
-
}, t, `action.${
|
|
594
|
+
}, t, `action.${Ut.name}`), C[Gt.name] = (t) => P(async (t, n) => {
|
|
595
595
|
let r = t;
|
|
596
596
|
return await w(e.store, n.subject, { id: r.id }), d.signal({ id: r.id }, r.signalName, r.payload);
|
|
597
|
-
}, t, `action.${
|
|
597
|
+
}, t, `action.${Gt.name}`), C[Kt.name] = (t) => P(async (t, n) => {
|
|
598
598
|
let r = t;
|
|
599
599
|
return await w(e.store, n.subject, { id: r.id }), d.update({ id: r.id }, r.updateName, r.payload, r.timeoutMs === void 0 ? void 0 : { timeoutMs: r.timeoutMs });
|
|
600
|
-
}, t, `action.${
|
|
601
|
-
let
|
|
602
|
-
...e.discovered.queries.map((e) => q(e.descriptor)),
|
|
603
|
-
...e.discovered.mutations.map((e) =>
|
|
604
|
-
...e.discovered.actions.map((e) => K(e.descriptor)),
|
|
605
|
-
...
|
|
606
|
-
...
|
|
600
|
+
}, t, `action.${Kt.name}`));
|
|
601
|
+
let De = (e) => e.filter((e) => Rt(e.descriptor)), Oe = [
|
|
602
|
+
...De(e.discovered.queries).map((e) => q(e.descriptor)),
|
|
603
|
+
...De(e.discovered.mutations).map((e) => zt(e.descriptor)),
|
|
604
|
+
...De(e.discovered.actions).map((e) => K(e.descriptor)),
|
|
605
|
+
...he.queries.map((e) => q(e.descriptor)),
|
|
606
|
+
...he.mutations.map((e) => zt(e.descriptor)),
|
|
607
607
|
...v.queries.map((e) => q(e.descriptor)),
|
|
608
|
-
...v.mutations.map((e) =>
|
|
608
|
+
...v.mutations.map((e) => zt(e.descriptor)),
|
|
609
609
|
...v.actions.map((e) => K(e.descriptor)),
|
|
610
|
-
...(e.discovered.streams ?? []).map((e) =>
|
|
611
|
-
...(e.discovered.workflows ?? []).map((e) =>
|
|
610
|
+
...(e.discovered.streams ?? []).map((e) => Bt(e.descriptor)),
|
|
611
|
+
...(e.discovered.workflows ?? []).map((e) => V(e.definition)),
|
|
612
612
|
...f ? [
|
|
613
613
|
q(X),
|
|
614
|
-
q(Ht),
|
|
615
614
|
q(Z),
|
|
615
|
+
q(Wt),
|
|
616
616
|
q(Y),
|
|
617
|
-
q(Bt),
|
|
618
617
|
q(J),
|
|
619
|
-
|
|
618
|
+
q(Ht),
|
|
620
619
|
K(Vt),
|
|
621
620
|
K(Ut),
|
|
622
|
-
K(
|
|
621
|
+
K(Gt),
|
|
622
|
+
K(Kt)
|
|
623
623
|
] : []
|
|
624
|
-
],
|
|
625
|
-
register: (t, n, r) =>
|
|
626
|
-
tenantId: r ??
|
|
624
|
+
], ke = Ot.make(...Oe).middleware(It).middleware(G), je = j.succeed(It, It.of(({ headers: t, clientId: n }) => A.promise(() => e.resolveSubject(t, n)))), Me = j.succeed(G, G.of(({ clientId: e }) => A.succeed({ clientId: e }))), Ne = e.dormancyTenantId ?? "default", D = e.dormancy === "sleep" ? {
|
|
625
|
+
register: (t, n, r) => z(e.store, {
|
|
626
|
+
tenantId: r ?? Ne,
|
|
627
627
|
kind: "workflow",
|
|
628
628
|
refId: t,
|
|
629
629
|
wakeAt: n
|
|
630
630
|
}),
|
|
631
631
|
cancel: (t, n) => Je(e.store, {
|
|
632
|
-
tenantId: n ??
|
|
632
|
+
tenantId: n ?? Ne,
|
|
633
633
|
kind: "workflow",
|
|
634
634
|
refId: t
|
|
635
635
|
}).then(() => {})
|
|
636
|
-
} : void 0,
|
|
636
|
+
} : void 0, O = te ? await import("@voltro/workflow") : void 0, k = O?.makeWorkflowRunRecorder({
|
|
637
637
|
store: e.store,
|
|
638
|
-
...
|
|
639
|
-
}),
|
|
640
|
-
await
|
|
638
|
+
...D === void 0 ? {} : { wakeups: D }
|
|
639
|
+
}), Pe = async (t, n) => {
|
|
640
|
+
await O.closeWorkflowChildrenForParent({
|
|
641
641
|
store: e.store,
|
|
642
642
|
parentExecutionId: t,
|
|
643
643
|
parentStatus: n,
|
|
644
|
-
recorder:
|
|
644
|
+
recorder: k,
|
|
645
645
|
log: { warn: (e, t) => {
|
|
646
646
|
process.stderr.write(`[workflow] ${e} ${t ? JSON.stringify(t) : ""}\n`);
|
|
647
647
|
} },
|
|
@@ -652,11 +652,11 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
652
652
|
await a.runPromise(r.definition.interrupt(n));
|
|
653
653
|
}
|
|
654
654
|
});
|
|
655
|
-
},
|
|
655
|
+
}, Fe = async (t, n, r) => {
|
|
656
656
|
let i = (await e.store.query({
|
|
657
657
|
table: "_voltro_workflow_runs",
|
|
658
658
|
order: [],
|
|
659
|
-
predicate:
|
|
659
|
+
predicate: H("executionId", n),
|
|
660
660
|
projection: void 0,
|
|
661
661
|
skip: void 0,
|
|
662
662
|
take: 1
|
|
@@ -667,7 +667,7 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
667
667
|
cancelled: !0,
|
|
668
668
|
completedAt: /* @__PURE__ */ new Date()
|
|
669
669
|
}), o = i.subject?.tenantId ?? void 0;
|
|
670
|
-
a && await
|
|
670
|
+
a && await k.recordEvent({
|
|
671
671
|
runId: i.id,
|
|
672
672
|
eventType: "run-cancelled",
|
|
673
673
|
payload: {
|
|
@@ -676,16 +676,16 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
676
676
|
executionId: n,
|
|
677
677
|
...o == null ? {} : { tenantId: o }
|
|
678
678
|
}
|
|
679
|
-
}), a && await
|
|
680
|
-
},
|
|
679
|
+
}), a && await Pe(n, "cancelled");
|
|
680
|
+
}, Ie = [..._t(e.discovered.workflows ?? [], {
|
|
681
681
|
buildContext: (t, n) => e.buildContextForWorkflow?.(t, n) ?? y({
|
|
682
682
|
subject: t.subject,
|
|
683
683
|
traceId: t.traceId
|
|
684
684
|
}, e.store, void 0, `workflow:${n.workflowName}`, { parentExecutionId: n.executionId }),
|
|
685
685
|
resolveStartContext: u
|
|
686
686
|
}, (t, n, r) => {
|
|
687
|
-
let i =
|
|
688
|
-
return
|
|
687
|
+
let i = O.getWorkflowVersionMetadata(t.definition);
|
|
688
|
+
return O.wrapWorkflowExecuteWithRunRecording({
|
|
689
689
|
name: t.definition.name,
|
|
690
690
|
store: e.store,
|
|
691
691
|
subject: r.subject,
|
|
@@ -696,34 +696,34 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
696
696
|
workflowPatches: i.patches,
|
|
697
697
|
parentExecutionId: r?.parentExecutionId ?? null,
|
|
698
698
|
parentClosePolicy: r?.parentClosePolicy ?? null,
|
|
699
|
-
onParentClose: ({ executionId: e, status: t }) =>
|
|
700
|
-
recorder:
|
|
699
|
+
onParentClose: ({ executionId: e, status: t }) => Pe(e, t),
|
|
700
|
+
recorder: k
|
|
701
701
|
}, n);
|
|
702
|
-
}), ...e.discovered.workflowWorkers ?? []],
|
|
702
|
+
}), ...e.discovered.workflowWorkers ?? []], Le = Ie.length > 0 ? j.mergeAll(...Ie) : j.empty;
|
|
703
703
|
if (((e.discovered.workflows?.length ?? 0) > 0 || (e.discovered.workflowWorkers?.length ?? 0) > 0 || e.scheduleCoordination === "cluster") && e.workflowEngineLayer !== void 0) {
|
|
704
|
-
let t =
|
|
705
|
-
a =
|
|
704
|
+
let t = Le.pipe(j.provideMerge(e.workflowEngineLayer));
|
|
705
|
+
a = Re.make(e.baseLayer === void 0 ? t : t.pipe(j.provideMerge(e.baseLayer))), await a.runPromise(A.void), i = (e.discovered.workflows?.length ?? 0) > 0 ? ht({
|
|
706
706
|
workflows: e.discovered.workflows ?? [],
|
|
707
707
|
runEffect: (e) => a.runPromise(e),
|
|
708
708
|
rememberStartContext: l,
|
|
709
709
|
signal: async (t, n, r) => {
|
|
710
|
-
let i = await
|
|
710
|
+
let i = await O.sendWorkflowSignal({
|
|
711
711
|
store: e.store,
|
|
712
|
-
recorder:
|
|
712
|
+
recorder: k,
|
|
713
713
|
target: t,
|
|
714
714
|
signalName: n,
|
|
715
715
|
payload: r
|
|
716
716
|
});
|
|
717
|
-
return await a.runPromise(
|
|
717
|
+
return await a.runPromise(O.completeSuspendingSignal({
|
|
718
718
|
store: e.store,
|
|
719
719
|
target: t,
|
|
720
720
|
signalName: n,
|
|
721
721
|
payload: r
|
|
722
722
|
})).catch(() => {}), i;
|
|
723
723
|
},
|
|
724
|
-
update: (t, n, r, i) =>
|
|
724
|
+
update: (t, n, r, i) => O.sendWorkflowUpdate({
|
|
725
725
|
store: e.store,
|
|
726
|
-
recorder:
|
|
726
|
+
recorder: k,
|
|
727
727
|
target: t,
|
|
728
728
|
updateName: n,
|
|
729
729
|
payload: r,
|
|
@@ -737,29 +737,29 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
737
737
|
}, t, n)
|
|
738
738
|
}) : void 0;
|
|
739
739
|
}
|
|
740
|
-
let
|
|
741
|
-
...
|
|
742
|
-
...
|
|
743
|
-
...
|
|
744
|
-
...
|
|
745
|
-
}),
|
|
746
|
-
group:
|
|
747
|
-
handlersLayer:
|
|
748
|
-
httpHandlersLayer:
|
|
740
|
+
let ze = j.mergeAll(ke.toLayer(C), je, Me), Ve = ee(C, e.discovered.queries.map((e) => e.descriptor.name), f), We = j.mergeAll(ke.toLayer(Ve), je, Me), I = e.observability, Ye = await qe({
|
|
741
|
+
...I && I.spanProcessors.length > 0 ? { extraSpanProcessors: I.spanProcessors } : {},
|
|
742
|
+
...I && I.metricReaders.length > 0 ? { extraMetricReaders: I.metricReaders } : {},
|
|
743
|
+
...I && Object.keys(I.resourceAttributes).length > 0 ? { resourceAttributes: I.resourceAttributes } : {},
|
|
744
|
+
...I && I.sampler !== void 0 ? { sampler: I.sampler } : {}
|
|
745
|
+
}), Xe = !1, Ze = e.store.ping ? () => e.store.ping().then(() => !0).catch(() => !1) : void 0, { server: Qe, shutdown: nt } = Tt({
|
|
746
|
+
group: ke,
|
|
747
|
+
handlersLayer: ze,
|
|
748
|
+
httpHandlersLayer: We,
|
|
749
749
|
port: e.port ?? 4e3,
|
|
750
750
|
path: e.path ?? "/ws",
|
|
751
|
-
tracerLayer:
|
|
751
|
+
tracerLayer: Ye.layer,
|
|
752
752
|
healthCheck: {
|
|
753
|
-
isReady: () =>
|
|
754
|
-
...
|
|
753
|
+
isReady: () => Xe,
|
|
754
|
+
...Ze ? { ping: Ze } : {}
|
|
755
755
|
},
|
|
756
|
-
...
|
|
756
|
+
...Ee.length > 0 ? { httpRoutes: Ee } : {},
|
|
757
757
|
...e.getStore === void 0 ? {} : { getStore: e.getStore },
|
|
758
758
|
...oe.size > 0 ? { webhookRoutes: oe } : {},
|
|
759
759
|
...e.inspectRoute === void 0 ? {} : { inspectRoute: e.inspectRoute }
|
|
760
760
|
});
|
|
761
|
-
if (await Ge(
|
|
762
|
-
let t = (e.scheduleCoordination ?? "single") === "advisoryLock" ?
|
|
761
|
+
if (await Ge(Qe), (e.discovered.schedules?.length ?? 0) > 0) {
|
|
762
|
+
let t = (e.scheduleCoordination ?? "single") === "advisoryLock" ? tt(e.store, e.scheduleReplicaId ?? `pid-${process.pid}`) : wt;
|
|
763
763
|
o = await Et(e.discovered.schedules ?? [], {
|
|
764
764
|
store: e.store,
|
|
765
765
|
coordinator: t,
|
|
@@ -788,10 +788,10 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
788
788
|
...e.onScheduleRunEvent === void 0 ? {} : { onRunEvent: e.onScheduleRunEvent }
|
|
789
789
|
}), e.onSchedulerReady?.(o);
|
|
790
790
|
}
|
|
791
|
-
let
|
|
792
|
-
if ((e.discovered.subscribers?.length ?? 0) > 0 && (
|
|
793
|
-
let t =
|
|
794
|
-
|
|
791
|
+
let rt = e.log ?? M({ scope: "voltro:serve" }), it, at;
|
|
792
|
+
if ((e.discovered.subscribers?.length ?? 0) > 0 && (it = de(e.discovered.subscribers ?? [], e.store, rt.child("subscribe"), e.schemaRegistry)), (e.discovered.reactions?.length ?? 0) > 0) {
|
|
793
|
+
let t = rt.child("reaction");
|
|
794
|
+
at = ve(e.discovered.reactions ?? [], e.store, {
|
|
795
795
|
runAct: async (n, r) => {
|
|
796
796
|
if (n.kind === "workflow") {
|
|
797
797
|
if (d === void 0) {
|
|
@@ -807,8 +807,8 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
807
807
|
}
|
|
808
808
|
await _(n.agent, r, {
|
|
809
809
|
findAgentSend: (t) => e.discovered.actions.find((e) => e.descriptor.name === `${t}.send`),
|
|
810
|
-
runAction: (e, t, n) => Promise.resolve(
|
|
811
|
-
makeSubject: (e) =>
|
|
810
|
+
runAction: (e, t, n) => Promise.resolve(ge(e, t, n)),
|
|
811
|
+
makeSubject: (e) => Lt(e),
|
|
812
812
|
now: () => Date.now(),
|
|
813
813
|
log: t
|
|
814
814
|
});
|
|
@@ -816,7 +816,7 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
816
816
|
checkBudget: async (n, r) => {
|
|
817
817
|
try {
|
|
818
818
|
let { requireAiBudget: t } = await import("@voltro/ai");
|
|
819
|
-
return (await
|
|
819
|
+
return (await A.runPromise(A.either(t(e.store, {
|
|
820
820
|
tenantId: n,
|
|
821
821
|
limitUsd: r
|
|
822
822
|
}))))._tag === "Right";
|
|
@@ -826,44 +826,44 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
826
826
|
}
|
|
827
827
|
}, t);
|
|
828
828
|
}
|
|
829
|
-
let
|
|
830
|
-
return (e.discovered.aggregates?.length ?? 0) > 0 && (
|
|
829
|
+
let ot;
|
|
830
|
+
return (e.discovered.aggregates?.length ?? 0) > 0 && (ot = await ne({
|
|
831
831
|
discovered: e.discovered.aggregates ?? [],
|
|
832
832
|
store: e.store,
|
|
833
|
-
log:
|
|
833
|
+
log: rt.child("aggregate"),
|
|
834
834
|
...e.analytics === void 0 ? {} : { analytics: e.analytics },
|
|
835
835
|
...e.aggregateStorage === void 0 ? {} : { storage: e.aggregateStorage },
|
|
836
836
|
...e.aggregateCoordinator === void 0 ? {} : { coordinator: e.aggregateCoordinator }
|
|
837
|
-
}), ue =
|
|
837
|
+
}), ue = j.succeed(N, ot.registry)), Xe = !0, e.bootTiming?.mark("ready"), {
|
|
838
838
|
dispatcher: t,
|
|
839
|
-
server:
|
|
839
|
+
server: Qe,
|
|
840
840
|
scheduler: o,
|
|
841
841
|
close: async () => {
|
|
842
|
-
|
|
842
|
+
Xe = !1, ot?.detach(), at?.(), it?.(), await o?.shutdown(), t.close(), await a?.dispose(), await new Promise((e) => Qe.close(() => e())), await nt();
|
|
843
843
|
}
|
|
844
844
|
};
|
|
845
|
-
}, $ =
|
|
846
|
-
let t =
|
|
847
|
-
if (
|
|
845
|
+
}, $ = M({ scope: "voltro:serve" }), Pn = (e, t, n) => (e === "production" || e === "staging") && t !== "memory" && n !== "0", Fn = Pe, In = async (e) => {
|
|
846
|
+
let t = D(process.cwd());
|
|
847
|
+
if (ze(t)) {
|
|
848
848
|
let n;
|
|
849
849
|
try {
|
|
850
|
-
let e = await import(
|
|
850
|
+
let e = await import(Ie(t).href);
|
|
851
851
|
typeof e.runServe == "function" ? n = e.runServe : $.warn("serve bundle has no runServe export — using the standard serve path");
|
|
852
852
|
} catch (e) {
|
|
853
853
|
$.warn("serve bundle failed to load — using the standard serve path", {}, e);
|
|
854
854
|
}
|
|
855
855
|
if (n) return $.info("serve: booting from the precompiled serve bundle"), n(e);
|
|
856
856
|
}
|
|
857
|
-
return
|
|
858
|
-
},
|
|
859
|
-
let p =
|
|
857
|
+
return Ln(e);
|
|
858
|
+
}, Ln = async (ee) => {
|
|
859
|
+
let p = k();
|
|
860
860
|
process.env.NODE_ENV || (process.env.NODE_ENV = "production");
|
|
861
861
|
try {
|
|
862
|
-
|
|
862
|
+
qt();
|
|
863
863
|
} catch (e) {
|
|
864
|
-
throw
|
|
864
|
+
throw gn(e instanceof Error ? e.message : String(e));
|
|
865
865
|
}
|
|
866
|
-
let m = process.cwd(), ne = Number(process.env.PORT ??
|
|
866
|
+
let m = process.cwd(), ne = Number(process.env.PORT ?? Fn(ee, "--port") ?? 4e3), g = await he(m);
|
|
867
867
|
xt(bt(g?.secrets)), await e({
|
|
868
868
|
rawEnv: g?.env,
|
|
869
869
|
appType: "api",
|
|
@@ -871,21 +871,21 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
871
871
|
log: $,
|
|
872
872
|
generateTypes: !1
|
|
873
873
|
}), p.mark("config");
|
|
874
|
-
let _ = (process.env.DB_DIALECT ?? g?.store ?? "memory").toLowerCase(), ce = (_ === "mariadb" || _ === "postgres" || _ === "mssql") && (process.env.CDC ?? "1") !== "0", le = _ === "mariadb" ? "mariadb" : _ === "mssql" ? "mssql" : void 0, de =
|
|
875
|
-
if (!i() &&
|
|
876
|
-
let e = await import(
|
|
874
|
+
let _ = (process.env.DB_DIALECT ?? g?.store ?? "memory").toLowerCase(), ce = (_ === "mariadb" || _ === "postgres" || _ === "mssql") && (process.env.CDC ?? "1") !== "0", le = _ === "mariadb" ? "mariadb" : _ === "mssql" ? "mssql" : void 0, de = O(m);
|
|
875
|
+
if (!i() && ze(de)) try {
|
|
876
|
+
let e = await import(Ie(de).href);
|
|
877
877
|
if (e.modules) {
|
|
878
878
|
let t = {};
|
|
879
|
-
for (let [n, r] of Object.entries(e.modules)) t[
|
|
879
|
+
for (let [n, r] of Object.entries(e.modules)) t[Fe(m, n)] = r;
|
|
880
880
|
r(t), $.info("precompiled api bundle loaded", { modules: Object.keys(t).length });
|
|
881
881
|
}
|
|
882
882
|
} catch (e) {
|
|
883
883
|
$.warn("precompiled api bundle failed to load — falling back to source", {}, e);
|
|
884
884
|
}
|
|
885
|
-
let b = await
|
|
885
|
+
let b = await C(m), S = await Oe(b, { cdc: ce && le !== void 0 });
|
|
886
886
|
{
|
|
887
|
-
let e = h(S.serverOnlyLeaks, re(process.env, "strict"),
|
|
888
|
-
if (e.action === "fail") throw
|
|
887
|
+
let e = h(S.serverOnlyLeaks, re(process.env, "strict"), Ze, "`voltro serve`");
|
|
888
|
+
if (e.action === "fail") throw gn(e.message ?? "");
|
|
889
889
|
e.action === "warn" && $.warn(e.message ?? "");
|
|
890
890
|
}
|
|
891
891
|
let ve = b.filter((e) => je.test(e)), w = ve.length > 0 ? await ue(ve, $.child("webhooks")) : void 0, we = s({
|
|
@@ -897,24 +897,24 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
897
897
|
spec: g?.analytics,
|
|
898
898
|
sqlLayer: Ae,
|
|
899
899
|
log: $
|
|
900
|
-
}),
|
|
900
|
+
}), D = (() => {
|
|
901
901
|
let e = new Set(S.tables.map((e) => e.tableName)), t = [...S.tables];
|
|
902
902
|
for (let n of [...we, ...E.tables]) e.has(n.tableName) || (e.add(n.tableName), t.push(n));
|
|
903
903
|
return t;
|
|
904
904
|
})();
|
|
905
|
-
for (let e of
|
|
906
|
-
let
|
|
907
|
-
if (
|
|
908
|
-
let e = (await n(_)).makeSqlLayer(T()), t = await
|
|
909
|
-
appliedBy: `serve:${
|
|
905
|
+
for (let e of D) jt(e);
|
|
906
|
+
let Pe = (process.env.NODE_ENV ?? "").toLowerCase();
|
|
907
|
+
if (Pn(Pe, _, process.env.VOLTRO_AUTO_MIGRATE)) {
|
|
908
|
+
let e = (await n(_)).makeSqlLayer(T()), t = await A.runPromise(kt.SqlClient.pipe(A.flatMap((e) => Qt(e, D, {
|
|
909
|
+
appliedBy: `serve:${Pe}`,
|
|
910
910
|
environment: "prod",
|
|
911
911
|
dialectId: _
|
|
912
|
-
})),
|
|
913
|
-
t.kind === "prod-mismatch" && ($.error(
|
|
912
|
+
})), A.provide(e)));
|
|
913
|
+
t.kind === "prod-mismatch" && ($.error(Zt(t, _)), $.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(Zt(t, _));
|
|
914
914
|
}
|
|
915
|
-
let
|
|
915
|
+
let M = mt(D);
|
|
916
916
|
p.mark("discover");
|
|
917
|
-
let
|
|
917
|
+
let N = await x(g, void 0), Be = Dt(N, _);
|
|
918
918
|
for (let e of Te({
|
|
919
919
|
dialect: String(g?.store ?? process.env.DB_DIALECT ?? "postgres"),
|
|
920
920
|
changeStrategy: (process.env.CDC ?? "1") === "0" ? "inline" : "cdc",
|
|
@@ -930,28 +930,28 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
930
930
|
})) e.level === "warn" ? $.warn(e.message) : $.info(e.message);
|
|
931
931
|
g?.cache && !process.env.CACHE_BACKEND && (process.env.CACHE_BACKEND = g.cache), g?.cacheRedisUrl && !process.env.CACHE_REDIS_URL && (process.env.CACHE_REDIS_URL = g.cacheRedisUrl), g?.cacheRedisDriver && !process.env.CACHE_REDIS_DRIVER && (process.env.CACHE_REDIS_DRIVER = g.cacheRedisDriver), g?.cacheKeyPrefix && !process.env.CACHE_KEY_PREFIX && (process.env.CACHE_KEY_PREFIX = g.cacheKeyPrefix);
|
|
932
932
|
let { service: He, invalidationBus: Ue, snapshotCache: Ge, cache: P, backend: Ke, dispose: F } = await xe({ env: process.env });
|
|
933
|
-
$.info(`cache backend resolved: ${Ke}` + (Ke === "redis" ? ` (driver ${process.env.CACHE_REDIS_DRIVER ?? "resp"})` : " — in-process, not cross-instance")),
|
|
934
|
-
|
|
933
|
+
$.info(`cache backend resolved: ${Ke}` + (Ke === "redis" ? ` (driver ${process.env.CACHE_REDIS_DRIVER ?? "resp"})` : " — in-process, not cross-instance")), N.onChange((e) => {
|
|
934
|
+
A.runFork(Ue.publish(e.table));
|
|
935
935
|
}), g?.kv && !process.env.KV_BACKEND && (process.env.KV_BACKEND = g.kv), g?.kvRedisUrl && !process.env.KV_REDIS_URL && (process.env.KV_REDIS_URL = g.kvRedisUrl), g?.kvKeyPrefix && !process.env.KV_KEY_PREFIX && (process.env.KV_KEY_PREFIX = g.kvKeyPrefix);
|
|
936
|
-
let { kv: qe, service: Je } = await
|
|
936
|
+
let { kv: qe, service: Je } = await at({ store: N });
|
|
937
937
|
p.mark("store");
|
|
938
|
-
let
|
|
939
|
-
store:
|
|
938
|
+
let $e = We({
|
|
939
|
+
store: N,
|
|
940
940
|
sink: E.sink,
|
|
941
941
|
log: $
|
|
942
|
-
}),
|
|
943
|
-
store:
|
|
942
|
+
}), et = pe({
|
|
943
|
+
store: N,
|
|
944
944
|
dialect: _
|
|
945
|
-
}),
|
|
946
|
-
_ !== "memory" && (ct =
|
|
947
|
-
let ut =
|
|
945
|
+
}), L = g?.plugins ?? [], st = process.env.POD_NAME ?? process.env.HOSTNAME ?? `serve-${process.pid}`, ct, lt;
|
|
946
|
+
_ !== "memory" && (ct = Re.make((await n(_)).makeSqlLayer(T())), lt = await ct.runPromise(kt.SqlClient));
|
|
947
|
+
let ut = ot({
|
|
948
948
|
coordinator: [
|
|
949
949
|
"postgres",
|
|
950
950
|
"mariadb",
|
|
951
951
|
"mysql",
|
|
952
952
|
"mssql"
|
|
953
|
-
].includes(_) ?
|
|
954
|
-
replicaId:
|
|
953
|
+
].includes(_) ? tt(N, st, $) : wt,
|
|
954
|
+
replicaId: st,
|
|
955
955
|
log: $
|
|
956
956
|
}), dt = [], ft = {
|
|
957
957
|
...lt ? { sql: lt } : {},
|
|
@@ -960,59 +960,57 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
960
960
|
return dt.push(r), r;
|
|
961
961
|
}
|
|
962
962
|
};
|
|
963
|
-
for (let e of
|
|
964
|
-
let pt =
|
|
963
|
+
for (let e of L) e.bindDataStore?.(N, ft);
|
|
964
|
+
let pt = L.filter((e) => typeof e.onChangeEvent == "function");
|
|
965
965
|
if (pt.length > 0) {
|
|
966
|
-
let e =
|
|
967
|
-
|
|
966
|
+
let e = N.changeScope ?? "local";
|
|
967
|
+
N.onChange((t) => {
|
|
968
968
|
let n = y(t, e);
|
|
969
|
-
for (let e of pt)
|
|
969
|
+
for (let e of pt) A.runFork(e.onChangeEvent(n).pipe(A.catchAllCause((t) => A.sync(() => $.warn(`plugin ${e.name} onChangeEvent failed`, { error: Le.pretty(t) })))));
|
|
970
970
|
});
|
|
971
971
|
}
|
|
972
972
|
let ht = me({
|
|
973
|
-
plugins:
|
|
973
|
+
plugins: L,
|
|
974
974
|
appName: g?.name ?? "voltro-api",
|
|
975
975
|
appType: "api",
|
|
976
976
|
voltroVersion: process.env.npm_package_version ?? "0.0.0",
|
|
977
977
|
log: $
|
|
978
978
|
});
|
|
979
|
-
|
|
980
|
-
let gt = await ht.gatherObservability(), _t = await
|
|
979
|
+
L.length && await ht.activate(), p.mark("plugins");
|
|
980
|
+
let gt = await ht.gatherObservability(), _t = await _e(N, g, _, {
|
|
981
981
|
info: (e, t) => process.stdout.write(`[broadcast] ${e} ${t ? JSON.stringify(t) : ""}\n`),
|
|
982
982
|
warn: (e, t) => process.stderr.write(`[broadcast] ${e} ${t ? JSON.stringify(t) : ""}\n`),
|
|
983
983
|
debug: () => {}
|
|
984
|
-
}), R = g?.apiKeys,
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
} : void 0, At = Et.length > 0 ? $t(Et, {
|
|
996
|
-
store: M,
|
|
984
|
+
}), R = g?.apiKeys, yt = (typeof R == "object" ? R.prefix : void 0) ?? "voltro_", z = R ? Ye(N) : void 0, B = z ? rt({ flush: it(z) }) : void 0;
|
|
985
|
+
B && vt(() => B.shutdown());
|
|
986
|
+
let St = z ? nt(z, {
|
|
987
|
+
prefix: yt,
|
|
988
|
+
...B ? { usage: B } : {}
|
|
989
|
+
}) : void 0, Ct = St ? [Qe(St, { prefix: yt })] : [], Tt = Ce([...g?.auth?.strategies ?? [], ...Ct], $t(g?.plugins ?? []), g?.auth?.anonymousTenantRequired ?? !1, g?.auth?.resolveScopes, () => Be), Et = [...g?.restRoutes ?? [], ...St ? Ve(St, (typeof R == "object" ? R.managementPath : void 0) ?? "/v1/api-keys") : []], V = g?.idempotency, Ot = V ? {
|
|
990
|
+
store: Xe(N),
|
|
991
|
+
header: (typeof V == "object" ? V.header : void 0) ?? "Idempotency-Key",
|
|
992
|
+
ttlMs: (typeof V == "object" ? V.ttlMs : void 0) ?? 864e5
|
|
993
|
+
} : void 0, At = Et.length > 0 ? tn(Et, {
|
|
994
|
+
store: N,
|
|
997
995
|
resolveSubject: (e) => Tt({
|
|
998
996
|
headers: e,
|
|
999
997
|
clientId: -1
|
|
1000
998
|
}),
|
|
1001
999
|
...Ot ? { idempotency: Ot } : {}
|
|
1002
|
-
}) : [],
|
|
1000
|
+
}) : [], H = L.map((e) => e.services).filter((e) => e !== void 0), Mt = j.mergeAll(De({
|
|
1003
1001
|
analyticsLayer: E.layer,
|
|
1004
1002
|
cacheService: He,
|
|
1005
1003
|
kvService: Je,
|
|
1006
|
-
pluginServices:
|
|
1004
|
+
pluginServices: H,
|
|
1007
1005
|
userLayers: g?.layers ?? []
|
|
1008
|
-
}), ge(g?.http ?? {})),
|
|
1006
|
+
}), ge(g?.http ?? {})), U = g?.scheduling ?? {}, Nt = U.trigger ?? "self", Pt = /* @__PURE__ */ new Set([
|
|
1009
1007
|
"postgres",
|
|
1010
1008
|
"mysql",
|
|
1011
1009
|
"mariadb",
|
|
1012
1010
|
"mssql"
|
|
1013
|
-
]),
|
|
1014
|
-
|
|
1015
|
-
let G, K = S.workflows.length > 0 || S.workflowWorkers.length > 0 || S.eventTriggers.length > 0 || (w?.outgoing.length ?? 0) > 0 || W,
|
|
1011
|
+
]), Ft = U.coordination ?? (Pt.has(_) ? "advisoryLock" : "single"), W = Ft === "cluster" && Pt.has(_), It = W ? "cluster" : Ft === "advisoryLock" && Pt.has(_) ? "advisoryLock" : "single";
|
|
1012
|
+
Ft === "cluster" && !W && $.warn("scheduling.coordination=cluster needs a sql-backed store except sqlite — falling back to single"), Ft === "advisoryLock" && !Pt.has(_) && $.warn("scheduling.coordination=advisoryLock needs a SQL store (the claim-row gate) — falling back to single");
|
|
1013
|
+
let G, K = S.workflows.length > 0 || S.workflowWorkers.length > 0 || S.eventTriggers.length > 0 || (w?.outgoing.length ?? 0) > 0 || W, Lt;
|
|
1016
1014
|
if (K) {
|
|
1017
1015
|
if (_ === "mssql") {
|
|
1018
1016
|
let e = await fe(process.cwd());
|
|
@@ -1020,12 +1018,12 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
1020
1018
|
}
|
|
1021
1019
|
let [{ WorkflowEngine: e }, { makeClusterCronLayer: t, workflowEngineLayer: r, resolveRunnerStorage: i }] = await Promise.all([import("@effect/workflow"), import("@voltro/workflow/cluster")]), a = W ? S.schedules.filter((e) => (e.trigger ?? Nt) === "self").map((e) => t({
|
|
1022
1020
|
name: e.name,
|
|
1023
|
-
cron:
|
|
1021
|
+
cron: I(e),
|
|
1024
1022
|
execute: async () => {
|
|
1025
1023
|
await G?.fireFromCluster(e.name);
|
|
1026
1024
|
}
|
|
1027
1025
|
})) : [];
|
|
1028
|
-
|
|
1026
|
+
Lt = _ === "memory" ? e.layerMemory : await (async () => {
|
|
1029
1027
|
let e = await n(_), t = i({ sqliteFamily: e.id === "sqlite" || e.id === "turso" });
|
|
1030
1028
|
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)" : "") : "")), r({
|
|
1031
1029
|
sqlClientLayer: e.makeSqlLayer(T()),
|
|
@@ -1036,18 +1034,18 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
1036
1034
|
});
|
|
1037
1035
|
})();
|
|
1038
1036
|
}
|
|
1039
|
-
let
|
|
1040
|
-
if (
|
|
1041
|
-
|
|
1037
|
+
let Rt = Me(L, t()), zt = b.filter((e) => /\.subscribe\.tsx?$/.test(e)), q = zt.length > 0 ? await ae(zt, $) : [], Bt = b.filter((e) => /\.reaction\.tsx?$/.test(e)), Vt = Bt.length > 0 ? await se(Bt, $) : [], J = b.filter((e) => u.test(e)), Ht = J.length > 0 ? await Ne(J, $) : [], Ut = b.filter((e) => /\.aggregate\.tsx?$/.test(e)), Y = Ut.length > 0 ? await v(Ut, $) : [], X = ye();
|
|
1038
|
+
if (Y.length > 0 && _ !== "memory") try {
|
|
1039
|
+
X = f((await n(_)).makeSqlLayer(T()));
|
|
1042
1040
|
} catch (e) {
|
|
1043
1041
|
$.warn("aggregate: SQL storage init failed — falling back to in-process", { err: String(e) });
|
|
1044
1042
|
}
|
|
1045
|
-
let
|
|
1043
|
+
let Wt = _ === "memory" ? wt : tt(N, `aggregate@${process.pid}`, $), Z = [], Gt = [], Kt = b.filter((e) => l.test(e));
|
|
1046
1044
|
if (Kt.length > 0) {
|
|
1047
1045
|
let e = $.child("agent"), t = b.filter((e) => a.test(e));
|
|
1048
1046
|
t.length > 0 && await o(t, e);
|
|
1049
1047
|
let n = await c(Kt, e);
|
|
1050
|
-
for (let e of n.agents) for (let t of te(e)) (t.kind === "action" ?
|
|
1048
|
+
for (let e of n.agents) for (let t of te(e)) (t.kind === "action" ? Z : Gt).push({
|
|
1051
1049
|
file: t.file,
|
|
1052
1050
|
descriptor: t.descriptor,
|
|
1053
1051
|
executor: t.executor
|
|
@@ -1055,52 +1053,52 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
1055
1053
|
n.agents.length > 0 && e.info("synthesized agent routes", { agents: n.agents.map((e) => e.descriptor.name) });
|
|
1056
1054
|
}
|
|
1057
1055
|
p.mark("workflow");
|
|
1058
|
-
let
|
|
1056
|
+
let Jt = await Nn({
|
|
1059
1057
|
bootTiming: p,
|
|
1060
1058
|
discovered: {
|
|
1061
|
-
queries: [...S.queries, ...
|
|
1059
|
+
queries: [...S.queries, ...Gt],
|
|
1062
1060
|
mutations: S.mutations,
|
|
1063
|
-
actions: [...S.actions, ...
|
|
1061
|
+
actions: [...S.actions, ...Z],
|
|
1064
1062
|
streams: S.streams,
|
|
1065
1063
|
workflows: S.workflows,
|
|
1066
1064
|
workflowWorkers: S.workflowWorkers,
|
|
1067
1065
|
eventTriggers: S.eventTriggers,
|
|
1068
1066
|
schedules: S.schedules,
|
|
1069
|
-
subscribers:
|
|
1070
|
-
outboxHandlers:
|
|
1067
|
+
subscribers: q,
|
|
1068
|
+
outboxHandlers: Ht,
|
|
1071
1069
|
connections: S.connections,
|
|
1072
|
-
reactions:
|
|
1073
|
-
aggregates:
|
|
1070
|
+
reactions: Vt,
|
|
1071
|
+
aggregates: Y,
|
|
1074
1072
|
...w === void 0 ? {} : { webhooks: w }
|
|
1075
1073
|
},
|
|
1076
1074
|
log: $,
|
|
1077
1075
|
analytics: E.sink,
|
|
1078
|
-
aggregateStorage:
|
|
1079
|
-
aggregateCoordinator:
|
|
1080
|
-
store:
|
|
1076
|
+
aggregateStorage: X,
|
|
1077
|
+
aggregateCoordinator: Wt,
|
|
1078
|
+
store: N,
|
|
1081
1079
|
kv: qe,
|
|
1082
1080
|
cache: P,
|
|
1083
1081
|
snapshotCache: Ge,
|
|
1084
|
-
schemaRegistry:
|
|
1082
|
+
schemaRegistry: M,
|
|
1085
1083
|
tenantScopedTables: S.tenantScopedTables,
|
|
1086
1084
|
softDeleteScopedTables: S.softDeleteScopedTables,
|
|
1087
|
-
dataTransferSnapshot:
|
|
1085
|
+
dataTransferSnapshot: Xt(D),
|
|
1088
1086
|
dataTransferDialect: _,
|
|
1089
1087
|
tenantIsolation: (process.env.VOLTRO_TENANT_ISOLATION ?? g?.tenancy?.isolation) === "namespace" ? "namespace" : "shared-schema",
|
|
1090
1088
|
resolveSubject: (e, t) => Tt({
|
|
1091
1089
|
headers: e,
|
|
1092
1090
|
clientId: t
|
|
1093
1091
|
}),
|
|
1094
|
-
httpRoutes: [...
|
|
1095
|
-
getStore: () =>
|
|
1092
|
+
httpRoutes: [...L.flatMap((e) => e.httpRoutes ?? []), ...At],
|
|
1093
|
+
getStore: () => Be,
|
|
1096
1094
|
...Mt ? { baseLayer: Mt } : {},
|
|
1097
|
-
...
|
|
1095
|
+
...Lt === void 0 ? {} : { workflowEngineLayer: Lt },
|
|
1098
1096
|
scheduleDefaultTrigger: Nt,
|
|
1099
|
-
scheduleCoordination:
|
|
1097
|
+
scheduleCoordination: It,
|
|
1100
1098
|
scheduleArmSelf: !W,
|
|
1101
1099
|
dormancy: process.env.VOLTRO_DORMANCY === "sleep" || process.env.VOLTRO_DORMANCY === "always-on" ? process.env.VOLTRO_DORMANCY : g?.dormancy ?? "always-on",
|
|
1102
1100
|
scheduleReplicaId: process.env.HOSTNAME ?? `pid-${process.pid}`,
|
|
1103
|
-
...
|
|
1101
|
+
...Rt === void 0 ? {} : { scheduleFireInterceptor: Rt },
|
|
1104
1102
|
onSchedulerReady: (e) => {
|
|
1105
1103
|
G = e;
|
|
1106
1104
|
},
|
|
@@ -1114,7 +1112,7 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
1114
1112
|
store: _,
|
|
1115
1113
|
cdc: ce ? "on" : "off"
|
|
1116
1114
|
},
|
|
1117
|
-
rpc:
|
|
1115
|
+
rpc: be(S, m),
|
|
1118
1116
|
workflows: ke(S, m),
|
|
1119
1117
|
inspectFireSchedule: async ({ name: e, trigger: t }) => {
|
|
1120
1118
|
if (!G) throw Error("scheduler not started — this app registers no self-triggered schedules (all schedules are trigger:'external', or there are none).");
|
|
@@ -1132,7 +1130,7 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
1132
1130
|
port: ne,
|
|
1133
1131
|
...g?.transport?.wsPath ? { path: g.transport.wsPath } : {}
|
|
1134
1132
|
});
|
|
1135
|
-
Se(oe([
|
|
1133
|
+
return Se(oe([
|
|
1136
1134
|
S.queries,
|
|
1137
1135
|
S.mutations,
|
|
1138
1136
|
S.actions,
|
|
@@ -1148,15 +1146,16 @@ var pn = "VoltroBootRefusal", mn = (e) => {
|
|
|
1148
1146
|
workflows: S.workflows.length,
|
|
1149
1147
|
workflowWorkers: S.workflowWorkers.length,
|
|
1150
1148
|
schedules: S.schedules.length,
|
|
1151
|
-
scheduleCoordination:
|
|
1152
|
-
}), p.finish($)
|
|
1153
|
-
let Qt = () => {
|
|
1149
|
+
scheduleCoordination: It
|
|
1150
|
+
}), p.finish($), vt(async () => {
|
|
1154
1151
|
for (let e of dt) e.stop();
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1152
|
+
$e.detach(), et.stop(), F(), ct?.dispose();
|
|
1153
|
+
try {
|
|
1154
|
+
await ht.deactivate(), await _t?.close(), await E.dispose(), await Jt.close(), await N.close?.();
|
|
1155
|
+
} catch (e) {
|
|
1156
|
+
console.error("serve: shutdown step failed, exiting anyway:", e);
|
|
1157
|
+
}
|
|
1158
|
+
}), await new Promise(() => {}), 0;
|
|
1160
1159
|
};
|
|
1161
1160
|
//#endregion
|
|
1162
|
-
export {
|
|
1161
|
+
export { In as n, An as r, Ln as t };
|