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