@voltro/cli 0.11.0 → 0.11.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 +50 -0
- package/THIRD-PARTY-NOTICES.md +1047 -22
- package/bin/voltro.mjs +16 -7
- package/dist/apiBuild-BGd-BnHq.js +2 -0
- package/dist/{apiBuild-BUbgGz73.js → apiBuild-D_kEJTxc.js} +10 -10
- package/dist/bin.js +2 -2
- package/dist/bootTiming-BdyP9nYw.js +38 -0
- package/dist/{commands-C1qBfIBI.js → commands-BiQsbV50.js} +2162 -2039
- package/dist/dev-DH13Ysgs.js +2 -0
- package/dist/{dev-ITlO-epO.js → dev-zJGsTTNb.js} +2202 -2189
- package/dist/index.js +1 -1
- package/dist/{inspectMetrics-BeMjgt8x.js → inspectMetrics-BuBwg1yW.js} +1169 -1137
- package/dist/{serveCommand-mpsE3vLY.js → serveCommand-BU454-ay.js} +312 -340
- package/dist/serveEntry.js +3 -3
- package/dist/{start-C_M4fGS2.js → start-ChN6PO-c.js} +338 -323
- package/dist/startEntry.js +2 -2
- package/package.json +23 -17
- package/templates/agent-docs/data.md +72 -1
- package/templates/agent-docs/deployment.md +49 -0
- package/templates/agent-docs/internationalization.md +36 -0
- package/templates/agent-docs/multi-tenancy.md +33 -0
- 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 +8 -8
- 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-BCv3bekE.js +0 -2
- package/dist/dev-DKASElZP.js +0 -2
|
@@ -1,74 +1,46 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { $ as n, A as r, C as i, D as a, E as o, F as s, G as c, H as l, I as u, J as d,
|
|
1
|
+
import { kt as e, t } from "./inspectMetrics-BuBwg1yW.js";
|
|
2
|
+
import { $ as n, A as r, C as i, D as a, E as o, F as s, G as c, H as l, I as u, J as d, M as f, N as p, O as ee, P as m, Q as h, S as g, T as te, U as ne, W as re, X as _, Y as ie, Z as ae, _ as oe, at as v, b as se, d as ce, et as y, f as b, g as le, h as ue, i as x, it as de, j as S, k as C, m as fe, n as pe, nt as me, o as w, ot as T, q as he, s as ge, st as _e, t as ve, ut as E, v as ye, w as be, x as xe, y as D } from "./dev-zJGsTTNb.js";
|
|
3
3
|
import { a as Se, r as Ce } from "./startupRunner-DhlX9nqd.js";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
4
|
+
import { n as we, s as O } from "./apiBuild-D_kEJTxc.js";
|
|
5
|
+
import { t as Te } from "./bootTiming-BdyP9nYw.js";
|
|
6
|
+
import { join as Ee } from "node:path";
|
|
7
|
+
import { pathToFileURL as De } from "node:url";
|
|
8
|
+
import { Cause as k, Effect as A, Layer as j, ManagedRuntime as Oe } from "effect";
|
|
9
|
+
import { createLogger as M } from "@voltro/logger";
|
|
10
|
+
import { existsSync as N } from "node:fs";
|
|
11
|
+
import { AggregateRegistry as ke, Dispatcher as P, apiKeyManagementRoutes as Ae, applySoftDeleteScope as je, applyTenantScope as Me, attachAnalyticsMirror as Ne, awaitServerListening as Pe, bindMutation as F, bindStream as Fe, bindSubscription as I, buildTracingLayer as Ie, cancelWakeup as Le, compileCron as Re, dataStoreApiKeyStore as ze, dataStoreIdempotencyStore as Be, frameworkApiKeyStrategy as Ve, installPolicyGuardResolver as He, loadResourceTuples as Ue, makeActionRunner as L, makeAdvisoryLockCoordinator as We, makeApiKeyService as Ge, makeAsyncKv as R, makeCoordinatedScheduler as Ke, makeEffectStoreLayer as qe, makeLazyWorkflowFacade as Je, makeMutationRunner as Ye, makeQueryDescriptorProducer as Xe, makeQueryReauthorizer as Ze, makeSchemaRegistry as Qe, makeWorkflowFacade as $e, makeWorkflowFacadeWithCallerContext as et, makeWorkflowLayers as tt, noopKv as nt, recordSubscriptionDelivery as rt, registerWakeup as z, resolveSecretsBackend as it, runProvidedEffect as at, setSecretsBackend as ot, setSystemStoreHandle as st, setTupleSource as ct, singleCoordinator as lt, startRpcServer as ut, startScheduler as dt, workflowToRpc as B } from "@voltro/runtime";
|
|
12
|
+
import { RpcGroup as ft } from "@effect/rpc";
|
|
13
|
+
import { SqlClient as pt } from "@effect/sql";
|
|
14
|
+
import { and as mt, ensureTableRegistered as ht, eq as V, or as gt } from "@voltro/database";
|
|
15
|
+
import { fromNodeReadable as _t, getObjectStream as vt, putObjectStream as yt, resolveStorageProvider as H, toNodeReadable as U } from "@voltro/plugin-storage";
|
|
16
|
+
import { AuthMiddleware as bt, ConnectionInfoMiddleware as xt, actionToRpc as W, anonymousSubject as St, mutationToRpc as Ct, queryToRpc as G, streamToRpc as wt, workflowCancelDescriptor as Tt, workflowDomainEventsQueryDescriptor as Et, workflowEventDeliveriesQueryDescriptor as K, workflowResumeDescriptor as Dt, workflowRunEventsQueryDescriptor as q, workflowRunQueryDescriptor as J, workflowRunStepsQueryDescriptor as Y, workflowRunsQueryDescriptor as Ot, workflowSignalDescriptor as X, workflowUpdateDescriptor as kt } from "@voltro/protocol";
|
|
17
|
+
import { createHash as Z, timingSafeEqual as At } from "node:crypto";
|
|
18
18
|
import { declaredSnapshot as jt, describeOutcome as Mt, runPlannedMigrations as Nt } from "@voltro/database/sql";
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
return e === "1" || e === "true";
|
|
27
|
-
}, Xt = () => {
|
|
28
|
-
let e = [{
|
|
29
|
-
name: "modules",
|
|
30
|
-
at: performance.now()
|
|
31
|
-
}];
|
|
32
|
-
return {
|
|
33
|
-
mark: (t) => {
|
|
34
|
-
e.push({
|
|
35
|
-
name: t,
|
|
36
|
-
at: performance.now()
|
|
37
|
-
});
|
|
38
|
-
},
|
|
39
|
-
finish: (t) => {
|
|
40
|
-
let n = Math.round(e[e.length - 1].at);
|
|
41
|
-
if (!Yt()) {
|
|
42
|
-
t.info(`serve: ready in ${n}ms`);
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
let r = {}, i = 0;
|
|
46
|
-
for (let t of e) r[t.name] = Math.round(t.at - i), i = t.at;
|
|
47
|
-
t.info(`serve: ready in ${n}ms`, {
|
|
48
|
-
bootMs: n,
|
|
49
|
-
phases: r
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
};
|
|
53
|
-
}, Zt = "/_voltro/admin/import", Qt = "/_voltro/admin/export", Q = (e, t) => ({
|
|
19
|
+
import { assertProductionSessionSecret as Pt } from "@voltro/protocol/session";
|
|
20
|
+
import { getAuthSessionStrategy as Ft } from "@voltro/plugin-auth";
|
|
21
|
+
import { collectPublicApiRoutes as It, restRoutesToHttpRoutes as Lt } from "@voltro/protocol/rest";
|
|
22
|
+
import { buildDeliverWebhookExecute as Rt, buildWebhooksService as zt, defaultIncomingPath as Bt, deliverWebhookWorkflow as Vt, mountIncomingWebhook as Ht } from "@voltro/plugin-webhooks";
|
|
23
|
+
import { packBundle as Ut, runExport as Wt, runImport as Gt, storageBlobSink as Kt, storageRefsBlobSource as qt, unpackBundle as Jt, unpackBundleToDir as Yt } from "@voltro/data-transfer";
|
|
24
|
+
//#region src/adminAuth.ts
|
|
25
|
+
var Xt = "/_voltro/admin/import", Zt = "/_voltro/admin/export", Q = (e, t) => ({
|
|
54
26
|
status: e,
|
|
55
27
|
contentType: "application/json; charset=utf-8",
|
|
56
28
|
body: JSON.stringify(t)
|
|
57
|
-
}),
|
|
29
|
+
}), Qt = (e) => {
|
|
58
30
|
let t = e.authorization ?? e.Authorization, n = t ? /^Bearer\s+(.+)$/i.exec(t) : null;
|
|
59
31
|
return n ? n[1] : null;
|
|
60
|
-
},
|
|
32
|
+
}, $t = (e, t) => At(Z("sha256").update(e).digest(), Z("sha256").update(t).digest()), en = (e, t) => {
|
|
61
33
|
if (e.method.toUpperCase() !== "POST") return Q(405, { error: "method not allowed" });
|
|
62
34
|
if (!t || t.length < 16) return Q(503, { error: "data transfer misconfigured (no/weak secret)" });
|
|
63
|
-
let n =
|
|
64
|
-
return !n ||
|
|
65
|
-
},
|
|
35
|
+
let n = Qt(e.headers);
|
|
36
|
+
return !n || !$t(n, t) ? Q(401, { error: "unauthorized" }) : null;
|
|
37
|
+
}, tn = M({ scope: "voltro:admin-import" }), nn = "VBUNDLE2", rn = async function* (e) {
|
|
66
38
|
yield e;
|
|
67
|
-
},
|
|
68
|
-
let n =
|
|
39
|
+
}, an = (e) => async (t) => {
|
|
40
|
+
let n = en(t, e.secret);
|
|
69
41
|
if (n) return n;
|
|
70
|
-
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") ===
|
|
71
|
-
if (s) c =
|
|
42
|
+
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") === nn, c, l;
|
|
43
|
+
if (s) c = rn(t.rawBody), l = "upload";
|
|
72
44
|
else {
|
|
73
45
|
let n;
|
|
74
46
|
try {
|
|
@@ -82,11 +54,11 @@ var Yt = () => {
|
|
|
82
54
|
}
|
|
83
55
|
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-"));
|
|
84
56
|
try {
|
|
85
|
-
e.assetSink ? await
|
|
57
|
+
e.assetSink ? await Jt(c, {
|
|
86
58
|
dir: p,
|
|
87
59
|
blobs: e.assetSink
|
|
88
|
-
}) : await
|
|
89
|
-
let t = await
|
|
60
|
+
}) : await Yt(c, p);
|
|
61
|
+
let t = await A.runPromiseExit(Gt({
|
|
90
62
|
store: e.store,
|
|
91
63
|
bundleDir: p,
|
|
92
64
|
...r ? { mode: r } : {},
|
|
@@ -94,14 +66,14 @@ var Yt = () => {
|
|
|
94
66
|
...a ? { atomic: a } : {},
|
|
95
67
|
...e.snapshot ? { targetSnapshot: e.snapshot } : {},
|
|
96
68
|
force: o,
|
|
97
|
-
onWarn: (e) =>
|
|
69
|
+
onWarn: (e) => tn.warn("admin.import", { message: e }),
|
|
98
70
|
...e.assetSink ? { assetsAlreadyRestored: !0 } : {}
|
|
99
71
|
}));
|
|
100
72
|
if (t._tag === "Failure") {
|
|
101
73
|
let e = t.cause._tag === "Fail" ? t.cause.error : void 0;
|
|
102
74
|
if (e && e._tag === "SchemaDriftError") {
|
|
103
75
|
let t = e;
|
|
104
|
-
return
|
|
76
|
+
return tn.warn("admin.import refused (schema drift)", {
|
|
105
77
|
transport: l,
|
|
106
78
|
bundle: t.bundleFingerprint.slice(0, 16),
|
|
107
79
|
target: t.targetFingerprint.slice(0, 16)
|
|
@@ -116,7 +88,7 @@ var Yt = () => {
|
|
|
116
88
|
throw Error(String(e?.message ?? e ?? "import failed"));
|
|
117
89
|
}
|
|
118
90
|
let n = t.value, s = n.tables.reduce((e, t) => e + t.rowCount, 0);
|
|
119
|
-
return
|
|
91
|
+
return tn.info("admin.import", {
|
|
120
92
|
transport: l,
|
|
121
93
|
tables: n.tables.length,
|
|
122
94
|
rows: s,
|
|
@@ -128,7 +100,7 @@ var Yt = () => {
|
|
|
128
100
|
transport: l
|
|
129
101
|
});
|
|
130
102
|
} catch (e) {
|
|
131
|
-
return
|
|
103
|
+
return tn.warn("admin.import failed", {
|
|
132
104
|
transport: l,
|
|
133
105
|
error: e?.message ?? String(e)
|
|
134
106
|
}), Q(500, {
|
|
@@ -141,18 +113,18 @@ var Yt = () => {
|
|
|
141
113
|
force: !0
|
|
142
114
|
});
|
|
143
115
|
}
|
|
144
|
-
},
|
|
116
|
+
}, on = M({ scope: "voltro:admin-export" }), sn = async (e) => {
|
|
145
117
|
let t = [];
|
|
146
118
|
for await (let n of e) t.push(Buffer.from(n));
|
|
147
119
|
return new Uint8Array(Buffer.concat(t));
|
|
148
|
-
},
|
|
120
|
+
}, cn = (e) => typeof e.tenant == "string" && e.tenant ? {
|
|
149
121
|
kind: "tenant",
|
|
150
122
|
tenantId: e.tenant
|
|
151
123
|
} : Array.isArray(e.tables) && e.tables.length ? {
|
|
152
124
|
kind: "tables",
|
|
153
125
|
tables: e.tables.filter((e) => typeof e == "string")
|
|
154
|
-
} : { kind: "all" },
|
|
155
|
-
let n =
|
|
126
|
+
} : { kind: "all" }, ln = (e) => async (t) => {
|
|
127
|
+
let n = en(t, e.secret);
|
|
156
128
|
if (n) return n;
|
|
157
129
|
let r;
|
|
158
130
|
try {
|
|
@@ -172,9 +144,9 @@ var Yt = () => {
|
|
|
172
144
|
});
|
|
173
145
|
}
|
|
174
146
|
}
|
|
175
|
-
let a = r.consistency === "snapshot" ? "snapshot" : i.consistency ?? "live", o = (typeof r.compression == "string" ? r.compression : void 0) ?? i.compression, s = i.scope ??
|
|
147
|
+
let a = r.consistency === "snapshot" ? "snapshot" : i.consistency ?? "live", o = (typeof r.compression == "string" ? r.compression : void 0) ?? i.compression, s = i.scope ?? cn(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-"));
|
|
176
148
|
try {
|
|
177
|
-
let t = await
|
|
149
|
+
let t = await A.runPromise(Wt({
|
|
178
150
|
store: e.store,
|
|
179
151
|
snapshot: e.snapshot,
|
|
180
152
|
dialect: e.dialect,
|
|
@@ -190,10 +162,10 @@ var Yt = () => {
|
|
|
190
162
|
if (c) {
|
|
191
163
|
if (!e.putArchive) return Q(501, { error: "storage transport not configured on this instance" });
|
|
192
164
|
let i = r.bundleKey;
|
|
193
|
-
return await e.putArchive(i, () =>
|
|
165
|
+
return await e.putArchive(i, () => Ut({
|
|
194
166
|
dir: p,
|
|
195
167
|
...l
|
|
196
|
-
})),
|
|
168
|
+
})), on.info("admin.export", {
|
|
197
169
|
transport: "storage",
|
|
198
170
|
tables: t.tables.length,
|
|
199
171
|
rows: n,
|
|
@@ -207,11 +179,11 @@ var Yt = () => {
|
|
|
207
179
|
transport: "storage"
|
|
208
180
|
});
|
|
209
181
|
}
|
|
210
|
-
let d = await
|
|
182
|
+
let d = await sn(Ut({
|
|
211
183
|
dir: p,
|
|
212
184
|
...l
|
|
213
185
|
}));
|
|
214
|
-
return
|
|
186
|
+
return on.info("admin.export", {
|
|
215
187
|
transport: "download",
|
|
216
188
|
tables: t.tables.length,
|
|
217
189
|
rows: n,
|
|
@@ -228,7 +200,7 @@ var Yt = () => {
|
|
|
228
200
|
}
|
|
229
201
|
};
|
|
230
202
|
} catch (e) {
|
|
231
|
-
return
|
|
203
|
+
return on.warn("admin.export failed", { error: e?.message ?? String(e) }), Q(500, {
|
|
232
204
|
error: "export failed",
|
|
233
205
|
message: e?.message ?? String(e)
|
|
234
206
|
});
|
|
@@ -238,7 +210,7 @@ var Yt = () => {
|
|
|
238
210
|
force: !0
|
|
239
211
|
});
|
|
240
212
|
}
|
|
241
|
-
},
|
|
213
|
+
}, un = async (e) => {
|
|
242
214
|
let { resolve: t } = await import("node:path"), { existsSync: n } = await import("node:fs"), r = [
|
|
243
215
|
e,
|
|
244
216
|
`${e}.profile.ts`,
|
|
@@ -249,7 +221,7 @@ var Yt = () => {
|
|
|
249
221
|
let a = await import(i), o = a.default ?? a.profile;
|
|
250
222
|
if (!o) throw Error(`data profile '${i}' has no default export`);
|
|
251
223
|
return o;
|
|
252
|
-
},
|
|
224
|
+
}, dn = {
|
|
253
225
|
get: async () => void 0,
|
|
254
226
|
set: async () => {},
|
|
255
227
|
setWithTags: async () => {},
|
|
@@ -258,21 +230,21 @@ var Yt = () => {
|
|
|
258
230
|
clear: async () => {},
|
|
259
231
|
invalidateTag: async () => 0,
|
|
260
232
|
wrap: async (e, t, n) => n()
|
|
261
|
-
},
|
|
262
|
-
|
|
233
|
+
}, fn = async (e) => {
|
|
234
|
+
st({
|
|
263
235
|
dataStore: e.store,
|
|
264
236
|
schemaRegistry: e.schemaRegistry
|
|
265
237
|
});
|
|
266
|
-
let t = new
|
|
238
|
+
let t = new P({
|
|
267
239
|
store: e.store,
|
|
268
240
|
...e.snapshotCache ? { cache: e.snapshotCache } : {},
|
|
269
|
-
recordDelivery: (e) =>
|
|
241
|
+
recordDelivery: (e) => rt({
|
|
270
242
|
label: e.label,
|
|
271
243
|
kind: e.kind,
|
|
272
244
|
durationMs: e.durationMs,
|
|
273
245
|
rowCount: e.rowCount
|
|
274
246
|
})
|
|
275
|
-
}), n = e.cache ??
|
|
247
|
+
}), n = e.cache ?? dn, r = e.kv ?? nt, a, o, c, l = /* @__PURE__ */ new Map(), u = () => `wfctx_${globalThis.crypto?.randomUUID?.() ?? `${Date.now().toString(36)}${Math.random().toString(36).slice(2)}`}`, d = async (t, n, r) => {
|
|
276
248
|
let i = {
|
|
277
249
|
...r,
|
|
278
250
|
source: r.source ?? `workflow:${t}`
|
|
@@ -282,7 +254,7 @@ var Yt = () => {
|
|
|
282
254
|
let r = await e.store.query({
|
|
283
255
|
table: "_voltro_workflow_start_contexts",
|
|
284
256
|
order: [],
|
|
285
|
-
predicate:
|
|
257
|
+
predicate: V("executionId", n),
|
|
286
258
|
projection: ["id"],
|
|
287
259
|
skip: void 0,
|
|
288
260
|
take: 1
|
|
@@ -303,14 +275,14 @@ var Yt = () => {
|
|
|
303
275
|
} catch (e) {
|
|
304
276
|
process.stderr.write(`[workflow] failed to persist start context for ${t}/${n}: ${e?.message ?? String(e)}\n`);
|
|
305
277
|
}
|
|
306
|
-
},
|
|
278
|
+
}, p = async (t, n) => {
|
|
307
279
|
let r = l.get(n);
|
|
308
280
|
if (r !== void 0) return r;
|
|
309
281
|
try {
|
|
310
282
|
let t = (await e.store.query({
|
|
311
283
|
table: "_voltro_workflow_start_contexts",
|
|
312
284
|
order: [],
|
|
313
|
-
predicate:
|
|
285
|
+
predicate: V("executionId", n),
|
|
314
286
|
projection: void 0,
|
|
315
287
|
skip: void 0,
|
|
316
288
|
take: 1
|
|
@@ -328,17 +300,17 @@ var Yt = () => {
|
|
|
328
300
|
process.stderr.write(`[workflow] failed to load start context for ${n}: ${e?.message ?? String(e)}\n`);
|
|
329
301
|
return;
|
|
330
302
|
}
|
|
331
|
-
}, g = (e.discovered.workflows?.length ?? 0) > 0 ?
|
|
303
|
+
}, g = (e.discovered.workflows?.length ?? 0) > 0 ? Je(() => a) : void 0, te = (e.discovered.workflows?.length ?? 0) > 0 || (e.discovered.eventTriggers?.length ?? 0) > 0, ne = te || (e.discovered.workflowWorkers?.length ?? 0) > 0 || e.scheduleCoordination === "cluster", re = e.tenantIsolation === "namespace", ie = (e.log ?? M({ scope: "voltro:serve" })).child("webhooks"), oe, v = e.discovered.webhooks;
|
|
332
304
|
if (v && v.outgoing.length > 0 && e.workflowEngineLayer !== void 0) {
|
|
333
|
-
let t = e.workflowEngineLayer, i =
|
|
305
|
+
let t = e.workflowEngineLayer, i = h({
|
|
334
306
|
store: e.store,
|
|
335
307
|
schemaRegistry: e.schemaRegistry,
|
|
336
308
|
cache: n,
|
|
337
309
|
kv: r
|
|
338
310
|
}), a = v.outgoing.map((e) => e.descriptor);
|
|
339
|
-
|
|
340
|
-
let n =
|
|
341
|
-
|
|
311
|
+
oe = zt(i, async (e) => {
|
|
312
|
+
let n = Vt.execute(e).pipe(A.provide(Vt.toLayer(Rt(i, { events: a })).pipe(j.provideMerge(t))));
|
|
313
|
+
A.runPromise(n).catch((t) => {
|
|
342
314
|
ie.error("deliverWebhook workflow crashed", {
|
|
343
315
|
deliveryId: e.deliveryId,
|
|
344
316
|
targetId: e.targetId
|
|
@@ -346,11 +318,11 @@ var Yt = () => {
|
|
|
346
318
|
});
|
|
347
319
|
}, { events: a });
|
|
348
320
|
}
|
|
349
|
-
let
|
|
321
|
+
let se = /* @__PURE__ */ new Map();
|
|
350
322
|
if (v) for (let e of v.incoming) {
|
|
351
|
-
let t = e.descriptor.path ??
|
|
323
|
+
let t = e.descriptor.path ?? Bt(e.descriptor.id), n = `VOLTRO_WEBHOOK_SECRET_${e.descriptor.id.toUpperCase().replace(/[^A-Z0-9]/g, "_")}`, r = Ht(e.descriptor, {
|
|
352
324
|
resolveSecret: async () => process.env[n] ?? null,
|
|
353
|
-
resolveWorkflows: () => g === void 0 ? void 0 :
|
|
325
|
+
resolveWorkflows: () => g === void 0 ? void 0 : et(g, {
|
|
354
326
|
traceId: `incoming:${e.descriptor.id}`,
|
|
355
327
|
source: `incoming:${e.descriptor.id}`
|
|
356
328
|
}),
|
|
@@ -365,124 +337,124 @@ var Yt = () => {
|
|
|
365
337
|
e.status >= 500 ? ie.error("incoming delivery failed", t) : e.status >= 400 ? ie.warn("incoming delivery rejected", t) : ie.info("incoming delivery handled", t);
|
|
366
338
|
}
|
|
367
339
|
});
|
|
368
|
-
|
|
340
|
+
se.set(t, { handle: r });
|
|
369
341
|
}
|
|
370
|
-
|
|
371
|
-
let
|
|
342
|
+
He(), ct((t) => Ue(e.store, t.subjectId, t.resourceType, t.resourceId));
|
|
343
|
+
let ce = (e.discovered.outboxHandlers?.length ?? 0) > 0 ? m({
|
|
372
344
|
handlers: e.discovered.outboxHandlers ?? [],
|
|
373
345
|
store: e.store,
|
|
374
|
-
log: (e.log ??
|
|
375
|
-
}) : void 0, y =
|
|
346
|
+
log: (e.log ?? M({ scope: "voltro:serve" })).child("outbox")
|
|
347
|
+
}) : void 0, y = f({
|
|
376
348
|
definitions: (e.discovered.connections ?? []).map((e) => e.definition),
|
|
377
349
|
store: e.store,
|
|
378
|
-
publicUrl:
|
|
379
|
-
log: (e.log ??
|
|
350
|
+
publicUrl: S(e.port ?? 4e3),
|
|
351
|
+
log: (e.log ?? M({ scope: "voltro:serve" })).child("connections")
|
|
380
352
|
}), b = ae({
|
|
381
353
|
store: e.store,
|
|
382
354
|
schemaRegistry: e.schemaRegistry,
|
|
383
355
|
cache: n,
|
|
384
356
|
kv: r,
|
|
385
|
-
...
|
|
357
|
+
...oe === void 0 ? {} : { webhooksService: oe },
|
|
386
358
|
...g === void 0 ? {} : { workflowsProxy: g },
|
|
387
359
|
eventTriggers: e.discovered.eventTriggers ?? [],
|
|
388
360
|
namespaceIsolationOn: re,
|
|
389
|
-
...
|
|
361
|
+
...ce === void 0 ? {} : { outbox: { nudge: ce.nudge } },
|
|
390
362
|
...y.active ? { connections: { registry: y.registry } } : {}
|
|
391
|
-
}),
|
|
392
|
-
let r = t.pipe(
|
|
393
|
-
return
|
|
394
|
-
},
|
|
363
|
+
}), le = j.succeed(ke, be), x = (t, n) => {
|
|
364
|
+
let r = t.pipe(A.provide(qe(n)));
|
|
365
|
+
return at((e.baseLayer ? r.pipe(A.provide(e.baseLayer)) : r).pipe(A.provide(le)));
|
|
366
|
+
}, de = Ye({
|
|
395
367
|
store: e.store,
|
|
396
368
|
buildContext: (e, t, n) => b(e, t, n),
|
|
397
|
-
runEffect:
|
|
369
|
+
runEffect: x,
|
|
398
370
|
undoCapture: D()
|
|
399
371
|
}), pe = ye(), me = L({
|
|
400
372
|
buildContext: (e) => b(e),
|
|
401
|
-
runEffect:
|
|
402
|
-
}),
|
|
373
|
+
runEffect: x
|
|
374
|
+
}), w = Xe({
|
|
403
375
|
buildContext: (e) => b(e),
|
|
404
|
-
finalize: (t, n) =>
|
|
405
|
-
provideEffect: (e, t) => e.pipe(
|
|
406
|
-
}),
|
|
376
|
+
finalize: (t, n) => je(Me(t, e.tenantScopedTables, n.subject.tenantId), e.softDeleteScopedTables),
|
|
377
|
+
provideEffect: (e, t) => e.pipe(A.provide(qe(t)))
|
|
378
|
+
}), T = {};
|
|
407
379
|
for (let n of [
|
|
408
380
|
...e.discovered.queries,
|
|
409
381
|
...pe.queries,
|
|
410
382
|
...y.queries
|
|
411
|
-
])
|
|
383
|
+
]) T[n.descriptor.name] = (e) => I(w(n, e), t, `subscription.${n.descriptor.name}`, void 0, void 0, Ze(n, e));
|
|
412
384
|
for (let t of [
|
|
413
385
|
...e.discovered.mutations,
|
|
414
386
|
...pe.mutations,
|
|
415
387
|
...y.mutations
|
|
416
|
-
])
|
|
417
|
-
for (let t of [...e.discovered.actions, ...y.actions])
|
|
418
|
-
let
|
|
388
|
+
]) T[t.descriptor.name] = (e) => F(async (e, n) => de(t, e, n), e, `mutation.${t.descriptor.name}`);
|
|
389
|
+
for (let t of [...e.discovered.actions, ...y.actions]) T[t.descriptor.name] = (e) => F(async (e, n) => me(t, e, n), e, `action.${t.descriptor.name}`);
|
|
390
|
+
let ge = () => `public-${Math.random().toString(36).slice(2, 10)}`, _e = [...e.discovered.mutations.filter((e) => e.descriptor.publicApi !== void 0).map((e) => ({
|
|
419
391
|
descriptor: e.descriptor,
|
|
420
|
-
invoke: (t, n) =>
|
|
392
|
+
invoke: (t, n) => de(e, t, {
|
|
421
393
|
subject: n.subject,
|
|
422
|
-
traceId:
|
|
394
|
+
traceId: ge()
|
|
423
395
|
})
|
|
424
396
|
})), ...e.discovered.actions.filter((e) => e.descriptor.publicApi !== void 0).map((e) => ({
|
|
425
397
|
descriptor: e.descriptor,
|
|
426
398
|
invoke: (t, n) => me(e, t, {
|
|
427
399
|
subject: n.subject,
|
|
428
|
-
traceId:
|
|
400
|
+
traceId: ge()
|
|
429
401
|
})
|
|
430
|
-
}))],
|
|
402
|
+
}))], ve = _e.length > 0 ? Lt(It(_e), {
|
|
431
403
|
store: e.store,
|
|
432
404
|
resolveSubject: (t) => e.resolveSubject(t, -1)
|
|
433
|
-
}) : [],
|
|
405
|
+
}) : [], E = e.dataTransferSecret ?? process.env.VOLTRO_DATA_TRANSFER_SECRET, xe = E && E.length >= 16 ? [{
|
|
434
406
|
method: "POST",
|
|
435
|
-
path:
|
|
436
|
-
handle:
|
|
437
|
-
secret:
|
|
407
|
+
path: Xt,
|
|
408
|
+
handle: an({
|
|
409
|
+
secret: E,
|
|
438
410
|
store: e.store,
|
|
439
411
|
...e.dataTransferSnapshot ? { snapshot: e.dataTransferSnapshot } : {},
|
|
440
|
-
assetSink:
|
|
412
|
+
assetSink: Kt(H({})),
|
|
441
413
|
openArchive: (e) => (async function* () {
|
|
442
|
-
let t =
|
|
414
|
+
let t = H({}), n = await U((await A.runPromise(vt(t, e))).stream);
|
|
443
415
|
for await (let e of n) yield e instanceof Uint8Array ? e : new Uint8Array(e);
|
|
444
416
|
})()
|
|
445
417
|
})
|
|
446
418
|
}, {
|
|
447
419
|
method: "POST",
|
|
448
|
-
path:
|
|
449
|
-
handle:
|
|
450
|
-
secret:
|
|
420
|
+
path: Zt,
|
|
421
|
+
handle: ln({
|
|
422
|
+
secret: E,
|
|
451
423
|
store: e.store,
|
|
452
424
|
snapshot: e.dataTransferSnapshot ?? { tables: [] },
|
|
453
425
|
dialect: e.dataTransferDialect ?? "memory",
|
|
454
426
|
tenantTables: [...e.tenantScopedTables],
|
|
455
|
-
loadProfile:
|
|
456
|
-
assetSource:
|
|
427
|
+
loadProfile: un,
|
|
428
|
+
assetSource: qt(H({}), e.store),
|
|
457
429
|
putArchive: async (e, t) => {
|
|
458
|
-
let { Readable: n } = await import("node:stream"), r =
|
|
459
|
-
await
|
|
430
|
+
let { Readable: n } = await import("node:stream"), r = H({}), i = _t("storage", () => n.from(t()));
|
|
431
|
+
await A.runPromise(yt(r, e, i, { contentType: "application/octet-stream" }));
|
|
460
432
|
}
|
|
461
433
|
})
|
|
462
434
|
}] : [], Se = [
|
|
463
435
|
...e.httpRoutes ?? [],
|
|
464
|
-
...
|
|
436
|
+
...ve,
|
|
465
437
|
...xe,
|
|
466
438
|
...y.httpRoutes
|
|
467
439
|
];
|
|
468
|
-
for (let t of e.discovered.streams ?? [])
|
|
440
|
+
for (let t of e.discovered.streams ?? []) T[t.descriptor.name] = (n) => Fe((r) => {
|
|
469
441
|
let i = b(r), a = t.executor(n, i);
|
|
470
|
-
if (
|
|
471
|
-
let t = a.pipe(
|
|
472
|
-
return (e.baseLayer ? t.pipe(
|
|
442
|
+
if (A.isEffect(a)) {
|
|
443
|
+
let t = a.pipe(A.provide(qe(i.store)));
|
|
444
|
+
return (e.baseLayer ? t.pipe(A.provide(e.baseLayer)) : t).pipe(A.provide(le));
|
|
473
445
|
}
|
|
474
|
-
return typeof a == "object" && a && typeof a.then == "function" ?
|
|
446
|
+
return typeof a == "object" && a && typeof a.then == "function" ? A.promise(() => a) : a;
|
|
475
447
|
}, `stream.${t.descriptor.name}`);
|
|
476
|
-
for (let t of e.discovered.workflows ?? [])
|
|
448
|
+
for (let t of e.discovered.workflows ?? []) T[t.definition.name] = (e) => F(async (e, n) => {
|
|
477
449
|
let r = n;
|
|
478
|
-
return
|
|
450
|
+
return et(g, {
|
|
479
451
|
subject: r.subject,
|
|
480
452
|
traceId: r.traceId,
|
|
481
453
|
source: "workflow-rpc"
|
|
482
454
|
}).start(t.definition.name, e);
|
|
483
455
|
}, e, `workflow.${t.definition.name}`);
|
|
484
|
-
te && (
|
|
485
|
-
descriptor:
|
|
456
|
+
te && (T[J.name] = (e) => I(w({
|
|
457
|
+
descriptor: J,
|
|
486
458
|
executor: (e) => {
|
|
487
459
|
let t = e.id;
|
|
488
460
|
return {
|
|
@@ -491,30 +463,30 @@ var Yt = () => {
|
|
|
491
463
|
column: "startedAt",
|
|
492
464
|
direction: "desc"
|
|
493
465
|
}],
|
|
494
|
-
predicate:
|
|
466
|
+
predicate: gt(V("id", t), V("executionId", t)),
|
|
495
467
|
take: 1,
|
|
496
468
|
skip: void 0,
|
|
497
469
|
projection: void 0
|
|
498
470
|
};
|
|
499
471
|
}
|
|
500
|
-
}, e), t, `subscription.${
|
|
501
|
-
descriptor:
|
|
472
|
+
}, e), t, `subscription.${J.name}`), T[Ot.name] = (e) => I(w({
|
|
473
|
+
descriptor: Ot,
|
|
502
474
|
executor: (e) => {
|
|
503
|
-
let t = e, n = [...t.tag === void 0 ? [] : [
|
|
475
|
+
let t = e, n = [...t.tag === void 0 ? [] : [V("tag", t.tag)], ...t.status === void 0 ? [] : [V("status", t.status)]], r = Number.isFinite(t.limit) && t.limit !== void 0 ? Math.min(Math.max(Math.floor(t.limit), 1), 500) : 100;
|
|
504
476
|
return {
|
|
505
477
|
table: "_voltro_workflow_runs",
|
|
506
478
|
order: [{
|
|
507
479
|
column: "startedAt",
|
|
508
480
|
direction: "desc"
|
|
509
481
|
}],
|
|
510
|
-
predicate: n.length === 0 ? void 0 : n.length === 1 ? n[0] :
|
|
482
|
+
predicate: n.length === 0 ? void 0 : n.length === 1 ? n[0] : mt(...n),
|
|
511
483
|
take: r,
|
|
512
484
|
skip: void 0,
|
|
513
485
|
projection: void 0
|
|
514
486
|
};
|
|
515
487
|
}
|
|
516
|
-
}, e), t, `subscription.${
|
|
517
|
-
descriptor:
|
|
488
|
+
}, e), t, `subscription.${Ot.name}`), T[Y.name] = (e) => I(w({
|
|
489
|
+
descriptor: Y,
|
|
518
490
|
executor: (e) => {
|
|
519
491
|
let t = e.runId;
|
|
520
492
|
return {
|
|
@@ -523,14 +495,14 @@ var Yt = () => {
|
|
|
523
495
|
column: "startedAt",
|
|
524
496
|
direction: "asc"
|
|
525
497
|
}],
|
|
526
|
-
predicate:
|
|
498
|
+
predicate: V("runId", t),
|
|
527
499
|
take: 1e3,
|
|
528
500
|
skip: void 0,
|
|
529
501
|
projection: void 0
|
|
530
502
|
};
|
|
531
503
|
}
|
|
532
|
-
}, e), t, `subscription.${
|
|
533
|
-
descriptor:
|
|
504
|
+
}, e), t, `subscription.${Y.name}`), T[q.name] = (e) => I(w({
|
|
505
|
+
descriptor: q,
|
|
534
506
|
executor: (e) => {
|
|
535
507
|
let t = e.runId;
|
|
536
508
|
return {
|
|
@@ -539,13 +511,13 @@ var Yt = () => {
|
|
|
539
511
|
column: "occurredAt",
|
|
540
512
|
direction: "asc"
|
|
541
513
|
}],
|
|
542
|
-
predicate:
|
|
514
|
+
predicate: V("runId", t),
|
|
543
515
|
take: 1e3,
|
|
544
516
|
skip: void 0,
|
|
545
517
|
projection: void 0
|
|
546
518
|
};
|
|
547
519
|
}
|
|
548
|
-
}, e), t, `subscription.${
|
|
520
|
+
}, e), t, `subscription.${q.name}`), T[Et.name] = (e) => I(w({
|
|
549
521
|
descriptor: Et,
|
|
550
522
|
executor: (e) => {
|
|
551
523
|
let t = e;
|
|
@@ -555,14 +527,14 @@ var Yt = () => {
|
|
|
555
527
|
column: "occurredAt",
|
|
556
528
|
direction: "desc"
|
|
557
529
|
}],
|
|
558
|
-
predicate: t.name === void 0 ? void 0 :
|
|
530
|
+
predicate: t.name === void 0 ? void 0 : V("name", t.name),
|
|
559
531
|
take: Math.max(1, Math.min(500, t.limit ?? 100)),
|
|
560
532
|
skip: void 0,
|
|
561
533
|
projection: void 0
|
|
562
534
|
};
|
|
563
535
|
}
|
|
564
|
-
}, e), t, `subscription.${Et.name}`),
|
|
565
|
-
descriptor:
|
|
536
|
+
}, e), t, `subscription.${Et.name}`), T[K.name] = (e) => I(w({
|
|
537
|
+
descriptor: K,
|
|
566
538
|
executor: (e) => {
|
|
567
539
|
let t = e.eventId;
|
|
568
540
|
return {
|
|
@@ -571,69 +543,69 @@ var Yt = () => {
|
|
|
571
543
|
column: "createdAt",
|
|
572
544
|
direction: "asc"
|
|
573
545
|
}],
|
|
574
|
-
predicate:
|
|
546
|
+
predicate: V("eventId", t),
|
|
575
547
|
take: 500,
|
|
576
548
|
skip: void 0,
|
|
577
549
|
projection: void 0
|
|
578
550
|
};
|
|
579
551
|
}
|
|
580
|
-
}, e), t, `subscription.${
|
|
552
|
+
}, e), t, `subscription.${K.name}`), T[Tt.name] = (t) => F(async (t, n) => {
|
|
581
553
|
let r = t;
|
|
582
|
-
return await _(e.store, n.subject, { executionId: r.executionId }), await g.cancel(r.workflowName, r.executionId), await
|
|
583
|
-
}, t, `action.${Tt.name}`),
|
|
554
|
+
return await _(e.store, n.subject, { executionId: r.executionId }), await g.cancel(r.workflowName, r.executionId), await Ne(r.workflowName, r.executionId, "workflow.cancel"), { ok: !0 };
|
|
555
|
+
}, t, `action.${Tt.name}`), T[Dt.name] = (t) => F(async (t, n) => {
|
|
584
556
|
let r = t;
|
|
585
557
|
return await _(e.store, n.subject, { executionId: r.executionId }), await g.resume(r.workflowName, r.executionId), { ok: !0 };
|
|
586
|
-
}, t, `action.${Dt.name}`),
|
|
558
|
+
}, t, `action.${Dt.name}`), T[X.name] = (t) => F(async (t, n) => {
|
|
587
559
|
let r = t;
|
|
588
560
|
return await _(e.store, n.subject, { id: r.id }), g.signal({ id: r.id }, r.signalName, r.payload);
|
|
589
|
-
}, t, `action.${
|
|
561
|
+
}, t, `action.${X.name}`), T[kt.name] = (t) => F(async (t, n) => {
|
|
590
562
|
let r = t;
|
|
591
563
|
return await _(e.store, n.subject, { id: r.id }), g.update({ id: r.id }, r.updateName, r.payload, r.timeoutMs === void 0 ? void 0 : { timeoutMs: r.timeoutMs });
|
|
592
|
-
}, t, `action.${
|
|
564
|
+
}, t, `action.${kt.name}`));
|
|
593
565
|
let Ce = [
|
|
594
|
-
...e.discovered.queries.map((e) =>
|
|
566
|
+
...e.discovered.queries.map((e) => G(e.descriptor)),
|
|
595
567
|
...e.discovered.mutations.map((e) => Ct(e.descriptor)),
|
|
596
|
-
...e.discovered.actions.map((e) =>
|
|
597
|
-
...pe.queries.map((e) =>
|
|
568
|
+
...e.discovered.actions.map((e) => W(e.descriptor)),
|
|
569
|
+
...pe.queries.map((e) => G(e.descriptor)),
|
|
598
570
|
...pe.mutations.map((e) => Ct(e.descriptor)),
|
|
599
|
-
...y.queries.map((e) =>
|
|
571
|
+
...y.queries.map((e) => G(e.descriptor)),
|
|
600
572
|
...y.mutations.map((e) => Ct(e.descriptor)),
|
|
601
|
-
...y.actions.map((e) =>
|
|
573
|
+
...y.actions.map((e) => W(e.descriptor)),
|
|
602
574
|
...(e.discovered.streams ?? []).map((e) => wt(e.descriptor)),
|
|
603
575
|
...(e.discovered.workflows ?? []).map((e) => B(e.definition)),
|
|
604
576
|
...te ? [
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
q
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
577
|
+
G(J),
|
|
578
|
+
G(Ot),
|
|
579
|
+
G(Y),
|
|
580
|
+
G(q),
|
|
581
|
+
G(Et),
|
|
582
|
+
G(K),
|
|
583
|
+
W(Tt),
|
|
584
|
+
W(Dt),
|
|
585
|
+
W(X),
|
|
586
|
+
W(kt)
|
|
615
587
|
] : []
|
|
616
|
-
],
|
|
588
|
+
], we = ft.make(...Ce).middleware(bt).middleware(xt), O = j.succeed(bt, bt.of(({ headers: t, clientId: n }) => A.promise(() => e.resolveSubject(t, n)))), Te = j.succeed(xt, xt.of(({ clientId: e }) => A.succeed({ clientId: e }))), Ee = e.dormancyTenantId ?? "default", De = e.dormancy === "sleep" ? {
|
|
617
589
|
register: (t, n, r) => z(e.store, {
|
|
618
590
|
tenantId: r ?? Ee,
|
|
619
591
|
kind: "workflow",
|
|
620
592
|
refId: t,
|
|
621
593
|
wakeAt: n
|
|
622
594
|
}),
|
|
623
|
-
cancel: (t, n) =>
|
|
595
|
+
cancel: (t, n) => Le(e.store, {
|
|
624
596
|
tenantId: n ?? Ee,
|
|
625
597
|
kind: "workflow",
|
|
626
598
|
refId: t
|
|
627
599
|
}).then(() => {})
|
|
628
|
-
} : void 0,
|
|
600
|
+
} : void 0, k = ne ? await import("@voltro/workflow") : void 0, N = k?.makeWorkflowRunRecorder({
|
|
629
601
|
store: e.store,
|
|
630
602
|
...De === void 0 ? {} : { wakeups: De }
|
|
631
|
-
}),
|
|
632
|
-
await
|
|
603
|
+
}), Ae = async (t, n) => {
|
|
604
|
+
await k.closeWorkflowChildrenForParent({
|
|
633
605
|
store: e.store,
|
|
634
606
|
parentExecutionId: t,
|
|
635
607
|
parentStatus: n,
|
|
636
|
-
recorder:
|
|
608
|
+
recorder: N,
|
|
637
609
|
log: { warn: (e, t) => {
|
|
638
610
|
process.stderr.write(`[workflow] ${e} ${t ? JSON.stringify(t) : ""}\n`);
|
|
639
611
|
} },
|
|
@@ -644,11 +616,11 @@ var Yt = () => {
|
|
|
644
616
|
await o.runPromise(r.definition.interrupt(n));
|
|
645
617
|
}
|
|
646
618
|
});
|
|
647
|
-
},
|
|
619
|
+
}, Ne = async (t, n, r) => {
|
|
648
620
|
let i = (await e.store.query({
|
|
649
621
|
table: "_voltro_workflow_runs",
|
|
650
622
|
order: [],
|
|
651
|
-
predicate:
|
|
623
|
+
predicate: V("executionId", n),
|
|
652
624
|
projection: void 0,
|
|
653
625
|
skip: void 0,
|
|
654
626
|
take: 1
|
|
@@ -659,7 +631,7 @@ var Yt = () => {
|
|
|
659
631
|
cancelled: !0,
|
|
660
632
|
completedAt: /* @__PURE__ */ new Date()
|
|
661
633
|
}), o = i.subject?.tenantId ?? void 0;
|
|
662
|
-
a && await
|
|
634
|
+
a && await N.recordEvent({
|
|
663
635
|
runId: i.id,
|
|
664
636
|
eventType: "run-cancelled",
|
|
665
637
|
payload: {
|
|
@@ -668,16 +640,16 @@ var Yt = () => {
|
|
|
668
640
|
executionId: n,
|
|
669
641
|
...o == null ? {} : { tenantId: o }
|
|
670
642
|
}
|
|
671
|
-
}), a && await
|
|
672
|
-
}, Re = [...
|
|
643
|
+
}), a && await Ae(n, "cancelled");
|
|
644
|
+
}, Re = [...tt(e.discovered.workflows ?? [], {
|
|
673
645
|
buildContext: (t, n) => e.buildContextForWorkflow?.(t, n) ?? b({
|
|
674
646
|
subject: t.subject,
|
|
675
647
|
traceId: t.traceId
|
|
676
648
|
}, e.store, void 0, `workflow:${n.workflowName}`, { parentExecutionId: n.executionId }),
|
|
677
|
-
resolveStartContext:
|
|
649
|
+
resolveStartContext: p
|
|
678
650
|
}, (t, n, r) => {
|
|
679
|
-
let i =
|
|
680
|
-
return
|
|
651
|
+
let i = k.getWorkflowVersionMetadata(t.definition);
|
|
652
|
+
return k.wrapWorkflowExecuteWithRunRecording({
|
|
681
653
|
name: t.definition.name,
|
|
682
654
|
store: e.store,
|
|
683
655
|
subject: r.subject,
|
|
@@ -688,66 +660,66 @@ var Yt = () => {
|
|
|
688
660
|
workflowPatches: i.patches,
|
|
689
661
|
parentExecutionId: r?.parentExecutionId ?? null,
|
|
690
662
|
parentClosePolicy: r?.parentClosePolicy ?? null,
|
|
691
|
-
onParentClose: ({ executionId: e, status: t }) =>
|
|
692
|
-
recorder:
|
|
663
|
+
onParentClose: ({ executionId: e, status: t }) => Ae(e, t),
|
|
664
|
+
recorder: N
|
|
693
665
|
}, n);
|
|
694
|
-
}), ...e.discovered.workflowWorkers ?? []], ze = Re.length > 0 ?
|
|
695
|
-
((e.discovered.workflows?.length ?? 0) > 0 || (e.discovered.workflowWorkers?.length ?? 0) > 0 || e.scheduleCoordination === "cluster") && e.workflowEngineLayer !== void 0 && (o = Oe.make(ze.pipe(
|
|
666
|
+
}), ...e.discovered.workflowWorkers ?? []], ze = Re.length > 0 ? j.mergeAll(...Re) : j.empty;
|
|
667
|
+
((e.discovered.workflows?.length ?? 0) > 0 || (e.discovered.workflowWorkers?.length ?? 0) > 0 || e.scheduleCoordination === "cluster") && e.workflowEngineLayer !== void 0 && (o = Oe.make(ze.pipe(j.provideMerge(e.workflowEngineLayer))), await o.runPromise(A.void), a = (e.discovered.workflows?.length ?? 0) > 0 ? $e({
|
|
696
668
|
workflows: e.discovered.workflows ?? [],
|
|
697
669
|
runEffect: (e) => o.runPromise(e),
|
|
698
670
|
rememberStartContext: d,
|
|
699
671
|
signal: async (t, n, r) => {
|
|
700
|
-
let i = await
|
|
672
|
+
let i = await k.sendWorkflowSignal({
|
|
701
673
|
store: e.store,
|
|
702
|
-
recorder:
|
|
674
|
+
recorder: N,
|
|
703
675
|
target: t,
|
|
704
676
|
signalName: n,
|
|
705
677
|
payload: r
|
|
706
678
|
});
|
|
707
|
-
return await o.runPromise(
|
|
679
|
+
return await o.runPromise(k.completeSuspendingSignal({
|
|
708
680
|
store: e.store,
|
|
709
681
|
target: t,
|
|
710
682
|
signalName: n,
|
|
711
683
|
payload: r
|
|
712
684
|
})).catch(() => {}), i;
|
|
713
685
|
},
|
|
714
|
-
update: (t, n, r, i) =>
|
|
686
|
+
update: (t, n, r, i) => k.sendWorkflowUpdate({
|
|
715
687
|
store: e.store,
|
|
716
|
-
recorder:
|
|
688
|
+
recorder: N,
|
|
717
689
|
target: t,
|
|
718
690
|
updateName: n,
|
|
719
691
|
payload: r,
|
|
720
692
|
...i === void 0 ? {} : { options: i }
|
|
721
693
|
}),
|
|
722
694
|
listRuns: (t) => fe(e.store, t),
|
|
723
|
-
retry: (t, n) =>
|
|
695
|
+
retry: (t, n) => ue({
|
|
724
696
|
store: e.store,
|
|
725
697
|
workflows: e.discovered.workflows ?? [],
|
|
726
698
|
runPromise: (e) => o.runPromise(e)
|
|
727
699
|
}, t, n)
|
|
728
700
|
}) : void 0);
|
|
729
|
-
let Be =
|
|
701
|
+
let Be = j.mergeAll(we.toLayer(T), O, Te), Ve = he(T, e.discovered.queries.map((e) => e.descriptor.name), te), Ge = j.mergeAll(we.toLayer(Ve), O, Te), R = e.observability, Ke = await Ie({
|
|
730
702
|
...R && R.spanProcessors.length > 0 ? { extraSpanProcessors: R.spanProcessors } : {},
|
|
731
703
|
...R && R.metricReaders.length > 0 ? { extraMetricReaders: R.metricReaders } : {},
|
|
732
704
|
...R && Object.keys(R.resourceAttributes).length > 0 ? { resourceAttributes: R.resourceAttributes } : {},
|
|
733
705
|
...R && R.sampler !== void 0 ? { sampler: R.sampler } : {}
|
|
734
|
-
}),
|
|
735
|
-
group:
|
|
706
|
+
}), Qe = !1, it = e.store.ping ? () => e.store.ping().then(() => !0).catch(() => !1) : void 0, ot = ut({
|
|
707
|
+
group: we,
|
|
736
708
|
handlersLayer: Be,
|
|
737
709
|
httpHandlersLayer: Ge,
|
|
738
710
|
port: e.port ?? 4e3,
|
|
739
711
|
path: e.path ?? "/ws",
|
|
740
|
-
tracerLayer:
|
|
712
|
+
tracerLayer: Ke.layer,
|
|
741
713
|
healthCheck: {
|
|
742
|
-
isReady: () =>
|
|
743
|
-
...
|
|
714
|
+
isReady: () => Qe,
|
|
715
|
+
...it ? { ping: it } : {}
|
|
744
716
|
},
|
|
745
717
|
...Se.length > 0 ? { httpRoutes: Se } : {},
|
|
746
|
-
...
|
|
718
|
+
...se.size > 0 ? { webhookRoutes: se } : {}
|
|
747
719
|
});
|
|
748
|
-
if (await
|
|
749
|
-
let t = (e.scheduleCoordination ?? "single") === "advisoryLock" ?
|
|
750
|
-
c = await
|
|
720
|
+
if (await Pe(ot), (e.discovered.schedules?.length ?? 0) > 0) {
|
|
721
|
+
let t = (e.scheduleCoordination ?? "single") === "advisoryLock" ? We(e.store, e.scheduleReplicaId ?? `pid-${process.pid}`) : lt;
|
|
722
|
+
c = await dt(e.discovered.schedules ?? [], {
|
|
751
723
|
store: e.store,
|
|
752
724
|
coordinator: t,
|
|
753
725
|
defaultTrigger: e.scheduleDefaultTrigger ?? "self",
|
|
@@ -772,10 +744,10 @@ var Yt = () => {
|
|
|
772
744
|
...e.onScheduleRunEvent === void 0 ? {} : { onRunEvent: e.onScheduleRunEvent }
|
|
773
745
|
}), e.onSchedulerReady?.(c);
|
|
774
746
|
}
|
|
775
|
-
let
|
|
776
|
-
if ((e.discovered.subscribers?.length ?? 0) > 0 && (
|
|
777
|
-
let t =
|
|
778
|
-
|
|
747
|
+
let pt = e.log ?? M({ scope: "voltro:serve" }), ht, Z;
|
|
748
|
+
if ((e.discovered.subscribers?.length ?? 0) > 0 && (ht = s(e.discovered.subscribers ?? [], e.store, pt.child("subscribe"), e.schemaRegistry)), (e.discovered.reactions?.length ?? 0) > 0) {
|
|
749
|
+
let t = pt.child("reaction");
|
|
750
|
+
Z = ee(e.discovered.reactions ?? [], e.store, {
|
|
779
751
|
runAct: async (n, r) => {
|
|
780
752
|
if (n.kind === "workflow") {
|
|
781
753
|
if (g === void 0) {
|
|
@@ -783,13 +755,13 @@ var Yt = () => {
|
|
|
783
755
|
return;
|
|
784
756
|
}
|
|
785
757
|
let e = r.new ?? r.old ?? {};
|
|
786
|
-
await
|
|
758
|
+
await et(g, {
|
|
787
759
|
traceId: `reaction:${n.workflow}`,
|
|
788
760
|
source: `reaction:${n.workflow}`
|
|
789
761
|
}).start(n.workflow, e);
|
|
790
762
|
return;
|
|
791
763
|
}
|
|
792
|
-
await
|
|
764
|
+
await C(n.agent, r, {
|
|
793
765
|
findAgentSend: (t) => e.discovered.actions.find((e) => e.descriptor.name === `${t}.send`),
|
|
794
766
|
runAction: (e, t, n) => Promise.resolve(me(e, t, n)),
|
|
795
767
|
makeSubject: (e) => St(e),
|
|
@@ -800,7 +772,7 @@ var Yt = () => {
|
|
|
800
772
|
checkBudget: async (n, r) => {
|
|
801
773
|
try {
|
|
802
774
|
let { requireAiBudget: t } = await import("@voltro/ai");
|
|
803
|
-
return (await
|
|
775
|
+
return (await A.runPromise(A.either(t(e.store, {
|
|
804
776
|
tenantId: n,
|
|
805
777
|
limitUsd: r
|
|
806
778
|
}))))._tag === "Right";
|
|
@@ -810,66 +782,66 @@ var Yt = () => {
|
|
|
810
782
|
}
|
|
811
783
|
}, t);
|
|
812
784
|
}
|
|
813
|
-
let
|
|
814
|
-
return (e.discovered.aggregates?.length ?? 0) > 0 && (
|
|
785
|
+
let At;
|
|
786
|
+
return (e.discovered.aggregates?.length ?? 0) > 0 && (At = await i({
|
|
815
787
|
discovered: e.discovered.aggregates ?? [],
|
|
816
788
|
store: e.store,
|
|
817
|
-
log:
|
|
789
|
+
log: pt.child("aggregate"),
|
|
818
790
|
...e.analytics === void 0 ? {} : { analytics: e.analytics },
|
|
819
791
|
...e.aggregateStorage === void 0 ? {} : { storage: e.aggregateStorage },
|
|
820
792
|
...e.aggregateCoordinator === void 0 ? {} : { coordinator: e.aggregateCoordinator }
|
|
821
|
-
}),
|
|
793
|
+
}), le = j.succeed(ke, At.registry)), Qe = !0, e.bootTiming?.mark("ready"), {
|
|
822
794
|
dispatcher: t,
|
|
823
|
-
server:
|
|
795
|
+
server: ot,
|
|
824
796
|
scheduler: c,
|
|
825
797
|
close: async () => {
|
|
826
|
-
|
|
798
|
+
Qe = !1, At?.detach(), Z?.(), ht?.(), await c?.shutdown(), t.close(), await o?.dispose(), await new Promise((e) => ot.close(() => e()));
|
|
827
799
|
}
|
|
828
800
|
};
|
|
829
|
-
}, $ =
|
|
801
|
+
}, $ = M({ scope: "voltro:serve" }), pn = (e, t, n) => (e === "production" || e === "staging") && t !== "memory" && n !== "0", mn = (e, t) => {
|
|
830
802
|
let n = e.indexOf(t);
|
|
831
803
|
return n >= 0 ? e[n + 1] : void 0;
|
|
832
|
-
},
|
|
804
|
+
}, hn = async (e) => {
|
|
833
805
|
let t = O(process.cwd());
|
|
834
|
-
if (
|
|
806
|
+
if (N(t)) {
|
|
835
807
|
let n;
|
|
836
808
|
try {
|
|
837
|
-
let e = await import(
|
|
809
|
+
let e = await import(De(t).href);
|
|
838
810
|
typeof e.runServe == "function" ? n = e.runServe : $.warn("serve bundle has no runServe export — using the standard serve path");
|
|
839
811
|
} catch (e) {
|
|
840
812
|
$.warn("serve bundle failed to load — using the standard serve path", {}, e);
|
|
841
813
|
}
|
|
842
814
|
if (n) return $.info("serve: booting from the precompiled serve bundle"), n(e);
|
|
843
815
|
}
|
|
844
|
-
return
|
|
845
|
-
},
|
|
846
|
-
let s =
|
|
847
|
-
process.env.NODE_ENV || (process.env.NODE_ENV = "production"),
|
|
848
|
-
let f = process.cwd(),
|
|
849
|
-
|
|
816
|
+
return gn(e);
|
|
817
|
+
}, gn = async (i) => {
|
|
818
|
+
let s = Te();
|
|
819
|
+
process.env.NODE_ENV || (process.env.NODE_ENV = "production"), Pt();
|
|
820
|
+
let f = process.cwd(), ee = Number(process.env.PORT ?? mn(i, "--port") ?? 4e3), m = await w(f);
|
|
821
|
+
ot(it(m?.secrets)), await e({
|
|
850
822
|
rawEnv: m?.env,
|
|
851
823
|
appType: "api",
|
|
852
824
|
root: f,
|
|
853
825
|
log: $,
|
|
854
826
|
generateTypes: !1
|
|
855
827
|
}), s.mark("config");
|
|
856
|
-
let h = (process.env.DB_DIALECT ?? m?.store ?? "memory").toLowerCase(),
|
|
857
|
-
if (!Ce() &&
|
|
858
|
-
let e = await import(
|
|
828
|
+
let h = (process.env.DB_DIALECT ?? m?.store ?? "memory").toLowerCase(), _ = (h === "mariadb" || h === "postgres" || h === "mssql") && (process.env.CDC ?? "1") !== "0", ae = h === "mariadb" ? "mariadb" : h === "mssql" ? "mssql" : void 0, ue = we(f);
|
|
829
|
+
if (!Ce() && N(ue)) try {
|
|
830
|
+
let e = await import(De(ue).href);
|
|
859
831
|
if (e.modules) {
|
|
860
832
|
let t = {};
|
|
861
|
-
for (let [n, r] of Object.entries(e.modules)) t[
|
|
833
|
+
for (let [n, r] of Object.entries(e.modules)) t[Ee(f, n)] = r;
|
|
862
834
|
Se(t), $.info("precompiled api bundle loaded", { modules: Object.keys(t).length });
|
|
863
835
|
}
|
|
864
836
|
} catch (e) {
|
|
865
837
|
$.warn("precompiled api bundle failed to load — falling back to source", {}, e);
|
|
866
838
|
}
|
|
867
|
-
let
|
|
839
|
+
let S = await ce(f), C = await ge(S, { cdc: _ && ae !== void 0 }), fe = S.filter((e) => xe.test(e)), he = fe.length > 0 ? await g(fe, $.child("webhooks")) : void 0, ye = me({
|
|
868
840
|
mix: C.featureMix,
|
|
869
841
|
plugins: m?.plugins ?? [],
|
|
870
|
-
cdc:
|
|
871
|
-
...
|
|
872
|
-
}), be = m?.analytics !== void 0 && m.analytics.kind !== "noop" && h !== "memory" ? (await
|
|
842
|
+
cdc: _ && ae !== void 0,
|
|
843
|
+
...ae ? { cdcDialect: ae } : {}
|
|
844
|
+
}), be = m?.analytics !== void 0 && m.analytics.kind !== "noop" && h !== "memory" ? (await E(h)).makeSqlLayer(x()) : void 0, D = await ne({
|
|
873
845
|
spec: m?.analytics,
|
|
874
846
|
sqlLayer: be,
|
|
875
847
|
log: $
|
|
@@ -878,56 +850,56 @@ var Yt = () => {
|
|
|
878
850
|
for (let n of [...ye, ...D.tables]) e.has(n.tableName) || (e.add(n.tableName), t.push(n));
|
|
879
851
|
return t;
|
|
880
852
|
})();
|
|
881
|
-
for (let e of O)
|
|
882
|
-
let
|
|
883
|
-
if (
|
|
884
|
-
let e = (await
|
|
885
|
-
appliedBy: `serve:${
|
|
853
|
+
for (let e of O) ht(e);
|
|
854
|
+
let M = (process.env.NODE_ENV ?? "").toLowerCase();
|
|
855
|
+
if (pn(M, h, process.env.VOLTRO_AUTO_MIGRATE)) {
|
|
856
|
+
let e = (await E(h)).makeSqlLayer(x()), t = await A.runPromise(pt.SqlClient.pipe(A.flatMap((e) => Nt(e, O, {
|
|
857
|
+
appliedBy: `serve:${M}`,
|
|
886
858
|
environment: "prod",
|
|
887
859
|
dialectId: h
|
|
888
|
-
})),
|
|
860
|
+
})), A.provide(e)));
|
|
889
861
|
t.kind === "prod-mismatch" && ($.error(Mt(t, h)), $.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(Mt(t, h));
|
|
890
862
|
}
|
|
891
|
-
let ke =
|
|
863
|
+
let ke = Qe(O);
|
|
892
864
|
s.mark("discover");
|
|
893
|
-
let
|
|
865
|
+
let P = await pe(m, void 0);
|
|
894
866
|
m?.cache && !process.env.CACHE_BACKEND && (process.env.CACHE_BACKEND = m.cache), m?.cacheRedisUrl && !process.env.CACHE_REDIS_URL && (process.env.CACHE_REDIS_URL = m.cacheRedisUrl), m?.cacheRedisDriver && !process.env.CACHE_REDIS_DRIVER && (process.env.CACHE_REDIS_DRIVER = m.cacheRedisDriver), m?.cacheKeyPrefix && !process.env.CACHE_KEY_PREFIX && (process.env.CACHE_KEY_PREFIX = m.cacheKeyPrefix);
|
|
895
|
-
let { service:
|
|
896
|
-
$.info(`cache backend resolved: ${
|
|
897
|
-
|
|
867
|
+
let { service: je, invalidationBus: Me, snapshotCache: Pe, cache: F, backend: Fe, dispose: I } = await y({ env: process.env });
|
|
868
|
+
$.info(`cache backend resolved: ${Fe}` + (Fe === "redis" ? ` (driver ${process.env.CACHE_REDIS_DRIVER ?? "resp"})` : " — in-process, not cross-instance")), P.onChange((e) => {
|
|
869
|
+
A.runFork(Me.publish(e.table));
|
|
898
870
|
}), m?.kv && !process.env.KV_BACKEND && (process.env.KV_BACKEND = m.kv), m?.kvRedisUrl && !process.env.KV_REDIS_URL && (process.env.KV_REDIS_URL = m.kvRedisUrl), m?.kvKeyPrefix && !process.env.KV_KEY_PREFIX && (process.env.KV_KEY_PREFIX = m.kvKeyPrefix);
|
|
899
|
-
let { kv:
|
|
871
|
+
let { kv: Ie, service: Le } = await R({ store: P });
|
|
900
872
|
s.mark("store");
|
|
901
|
-
let
|
|
902
|
-
store:
|
|
873
|
+
let He = Ne({
|
|
874
|
+
store: P,
|
|
903
875
|
sink: D.sink,
|
|
904
876
|
log: $
|
|
905
|
-
}),
|
|
906
|
-
store:
|
|
877
|
+
}), Ue = n({
|
|
878
|
+
store: P,
|
|
907
879
|
dialect: h
|
|
908
|
-
}), L = m?.plugins ?? [],
|
|
909
|
-
h !== "memory" && (
|
|
910
|
-
let
|
|
880
|
+
}), L = m?.plugins ?? [], qe = process.env.POD_NAME ?? process.env.HOSTNAME ?? `serve-${process.pid}`, Je, Ye;
|
|
881
|
+
h !== "memory" && (Je = Oe.make((await E(h)).makeSqlLayer(x())), Ye = await Je.runPromise(pt.SqlClient));
|
|
882
|
+
let Xe = Ke({
|
|
911
883
|
coordinator: [
|
|
912
884
|
"postgres",
|
|
913
885
|
"mariadb",
|
|
914
886
|
"mysql",
|
|
915
887
|
"mssql"
|
|
916
|
-
].includes(h) ?
|
|
917
|
-
replicaId:
|
|
888
|
+
].includes(h) ? We(P, qe, $) : lt,
|
|
889
|
+
replicaId: qe,
|
|
918
890
|
log: $
|
|
919
|
-
}),
|
|
920
|
-
...
|
|
891
|
+
}), Ze = [], $e = {
|
|
892
|
+
...Ye ? { sql: Ye } : {},
|
|
921
893
|
scheduleCoordinated: (e, t, n) => {
|
|
922
|
-
let r =
|
|
923
|
-
return
|
|
894
|
+
let r = Xe(e, t, n);
|
|
895
|
+
return Ze.push(r), r;
|
|
924
896
|
}
|
|
925
897
|
};
|
|
926
|
-
for (let e of L) e.bindDataStore?.(
|
|
927
|
-
let
|
|
928
|
-
if (
|
|
929
|
-
let e =
|
|
930
|
-
|
|
898
|
+
for (let e of L) e.bindDataStore?.(P, $e);
|
|
899
|
+
let et = L.filter((e) => typeof e.onChangeEvent == "function");
|
|
900
|
+
if (et.length > 0) {
|
|
901
|
+
let e = P.changeScope ?? "local";
|
|
902
|
+
P.onChange((t) => {
|
|
931
903
|
let n = {
|
|
932
904
|
table: t.table,
|
|
933
905
|
op: t.op,
|
|
@@ -936,62 +908,62 @@ var Yt = () => {
|
|
|
936
908
|
...t.origin === void 0 ? {} : { origin: t.origin },
|
|
937
909
|
changeScope: e
|
|
938
910
|
};
|
|
939
|
-
for (let e of
|
|
911
|
+
for (let e of et) A.runFork(e.onChangeEvent(n).pipe(A.catchAllCause((t) => A.sync(() => $.warn(`plugin ${e.name} onChangeEvent failed`, { error: k.pretty(t) })))));
|
|
940
912
|
});
|
|
941
913
|
}
|
|
942
|
-
let
|
|
914
|
+
let tt = oe({
|
|
943
915
|
plugins: L,
|
|
944
916
|
appName: m?.name ?? "voltro-api",
|
|
945
917
|
appType: "api",
|
|
946
918
|
voltroVersion: process.env.npm_package_version ?? "0.0.0",
|
|
947
919
|
log: $
|
|
948
920
|
});
|
|
949
|
-
L.length && await
|
|
950
|
-
let
|
|
921
|
+
L.length && await tt.activate(), s.mark("plugins");
|
|
922
|
+
let nt = await tt.gatherObservability(), rt = await b(P, m, h, {
|
|
951
923
|
info: (e, t) => process.stdout.write(`[broadcast] ${e} ${t ? JSON.stringify(t) : ""}\n`),
|
|
952
924
|
warn: (e, t) => process.stderr.write(`[broadcast] ${e} ${t ? JSON.stringify(t) : ""}\n`),
|
|
953
925
|
debug: () => {}
|
|
954
|
-
}), z = m?.apiKeys,
|
|
955
|
-
store:
|
|
926
|
+
}), z = m?.apiKeys, at = (typeof z == "object" ? z.prefix : void 0) ?? "voltro_", st = z ? Ge(ze(P), { prefix: at }) : void 0, ct = st ? [Ve(st, { prefix: at })] : [], ut = ve([...m?.auth?.strategies ?? [], ...ct], Ft(m?.plugins ?? []), m?.auth?.anonymousTenantRequired ?? !1), dt = [...m?.restRoutes ?? [], ...st ? Ae(st, (typeof z == "object" ? z.managementPath : void 0) ?? "/v1/api-keys") : []], B = m?.idempotency, ft = B ? {
|
|
927
|
+
store: Be(P),
|
|
956
928
|
header: (typeof B == "object" ? B.header : void 0) ?? "Idempotency-Key",
|
|
957
929
|
ttlMs: (typeof B == "object" ? B.ttlMs : void 0) ?? 864e5
|
|
958
|
-
} : void 0,
|
|
959
|
-
store:
|
|
960
|
-
resolveSubject: (e) =>
|
|
930
|
+
} : void 0, mt = dt.length > 0 ? Lt(dt, {
|
|
931
|
+
store: P,
|
|
932
|
+
resolveSubject: (e) => ut({
|
|
961
933
|
headers: e,
|
|
962
934
|
clientId: -1
|
|
963
935
|
}),
|
|
964
|
-
...
|
|
965
|
-
}) : [],
|
|
936
|
+
...ft ? { idempotency: ft } : {}
|
|
937
|
+
}) : [], V = L.map((e) => e.services).filter((e) => e !== void 0), gt = j.mergeAll(ie({
|
|
966
938
|
analyticsLayer: D.layer,
|
|
967
|
-
cacheService:
|
|
968
|
-
kvService:
|
|
969
|
-
pluginServices:
|
|
939
|
+
cacheService: je,
|
|
940
|
+
kvService: Le,
|
|
941
|
+
pluginServices: V,
|
|
970
942
|
userLayers: m?.layers ?? []
|
|
971
|
-
}),
|
|
943
|
+
}), d), _t = m?.scheduling ?? {}, vt = _t.trigger ?? "self", yt = /* @__PURE__ */ new Set([
|
|
972
944
|
"postgres",
|
|
973
945
|
"mysql",
|
|
974
946
|
"mariadb",
|
|
975
947
|
"mssql"
|
|
976
|
-
]),
|
|
977
|
-
|
|
978
|
-
let
|
|
979
|
-
if (
|
|
948
|
+
]), H = _t.coordination ?? (yt.has(h) ? "advisoryLock" : "single"), U = H === "cluster" && yt.has(h), bt = U ? "cluster" : H === "advisoryLock" && yt.has(h) ? "advisoryLock" : "single";
|
|
949
|
+
H === "cluster" && !U && $.warn("scheduling.coordination=cluster needs a sql-backed store except sqlite — falling back to single"), H === "advisoryLock" && !yt.has(h) && $.warn("scheduling.coordination=advisoryLock needs a SQL store (the claim-row gate) — falling back to single");
|
|
950
|
+
let xt, W = C.workflows.length > 0 || C.workflowWorkers.length > 0 || C.eventTriggers.length > 0 || (he?.outgoing.length ?? 0) > 0 || U, St;
|
|
951
|
+
if (W) {
|
|
980
952
|
if (h === "mssql") {
|
|
981
953
|
let e = await l(process.cwd());
|
|
982
954
|
e && $.warn(e);
|
|
983
955
|
}
|
|
984
|
-
let [{ WorkflowEngine: e }, { makeClusterCronLayer: t, workflowEngineLayer: n, resolveRunnerStorage: r }] = await Promise.all([import("@effect/workflow"), import("@voltro/workflow/cluster")]), i = U ? C.schedules.filter((e) => (e.trigger ??
|
|
956
|
+
let [{ WorkflowEngine: e }, { makeClusterCronLayer: t, workflowEngineLayer: n, resolveRunnerStorage: r }] = await Promise.all([import("@effect/workflow"), import("@voltro/workflow/cluster")]), i = U ? C.schedules.filter((e) => (e.trigger ?? vt) === "self").map((e) => t({
|
|
985
957
|
name: e.name,
|
|
986
|
-
cron:
|
|
958
|
+
cron: Re(e),
|
|
987
959
|
execute: async () => {
|
|
988
|
-
await
|
|
960
|
+
await xt?.fireFromCluster(e.name);
|
|
989
961
|
}
|
|
990
962
|
})) : [];
|
|
991
|
-
|
|
992
|
-
let e = await
|
|
963
|
+
St = h === "memory" ? e.layerMemory : await (async () => {
|
|
964
|
+
let e = await E(h), t = r({ sqliteFamily: e.id === "sqlite" || e.id === "turso" });
|
|
993
965
|
return $.info(`workflow engine: cluster-${t}, dialect=${e.id}` + (t === "memory" ? " — single-process durable replay, no cross-pod shard handoff" + (e.id !== "sqlite" && e.id !== "turso" ? " (VOLTRO_WORKFLOW_RUNNER_STORAGE=memory: SqlRunnerStorage/cluster_runners + GET_LOCK skipped)" : "") : "")), n({
|
|
994
|
-
sqlClientLayer: e.makeSqlLayer(
|
|
966
|
+
sqlClientLayer: e.makeSqlLayer(x()),
|
|
995
967
|
runnerStorage: t,
|
|
996
968
|
dialectId: e.id,
|
|
997
969
|
...process.env.VOLTRO_WORKFLOW_RUNNER_PORT ? { runnerListenPort: Number(process.env.VOLTRO_WORKFLOW_RUNNER_PORT) } : {},
|
|
@@ -999,18 +971,18 @@ var Yt = () => {
|
|
|
999
971
|
});
|
|
1000
972
|
})();
|
|
1001
973
|
}
|
|
1002
|
-
let
|
|
1003
|
-
if (
|
|
1004
|
-
Y = a((await
|
|
974
|
+
let Ct = le(L, t()), G = S.filter((e) => /\.subscribe\.tsx?$/.test(e)), wt = G.length > 0 ? await u(G, $) : [], Tt = S.filter((e) => /\.reaction\.tsx?$/.test(e)), Et = Tt.length > 0 ? await r(Tt, $) : [], K = S.filter((e) => /\.outbox\.tsx?$/.test(e)), Dt = K.length > 0 ? await p(K, $) : [], q = S.filter((e) => /\.aggregate\.tsx?$/.test(e)), J = q.length > 0 ? await te(q, $) : [], Y = o();
|
|
975
|
+
if (J.length > 0 && h !== "memory") try {
|
|
976
|
+
Y = a((await E(h)).makeSqlLayer(x()));
|
|
1005
977
|
} catch (e) {
|
|
1006
978
|
$.warn("aggregate: SQL storage init failed — falling back to in-process", { err: String(e) });
|
|
1007
979
|
}
|
|
1008
|
-
let Ot = h === "memory" ?
|
|
1009
|
-
if (
|
|
1010
|
-
let e = $.child("agent"), t =
|
|
1011
|
-
t.length > 0 && await
|
|
1012
|
-
let n = await
|
|
1013
|
-
for (let e of n.agents) for (let t of
|
|
980
|
+
let Ot = h === "memory" ? lt : We(P, `aggregate@${process.pid}`, $), X = [], kt = [], Z = S.filter((e) => de.test(e));
|
|
981
|
+
if (Z.length > 0) {
|
|
982
|
+
let e = $.child("agent"), t = S.filter((e) => v.test(e));
|
|
983
|
+
t.length > 0 && await _e(t, e);
|
|
984
|
+
let n = await T(Z, e);
|
|
985
|
+
for (let e of n.agents) for (let t of se(e)) (t.kind === "action" ? X : kt).push({
|
|
1014
986
|
file: t.file,
|
|
1015
987
|
descriptor: t.descriptor,
|
|
1016
988
|
executor: t.executor
|
|
@@ -1018,10 +990,10 @@ var Yt = () => {
|
|
|
1018
990
|
n.agents.length > 0 && e.info("synthesized agent routes", { agents: n.agents.map((e) => e.descriptor.name) });
|
|
1019
991
|
}
|
|
1020
992
|
s.mark("workflow");
|
|
1021
|
-
let At = await
|
|
993
|
+
let At = await fn({
|
|
1022
994
|
bootTiming: s,
|
|
1023
995
|
discovered: {
|
|
1024
|
-
queries: [...C.queries, ...
|
|
996
|
+
queries: [...C.queries, ...kt],
|
|
1025
997
|
mutations: C.mutations,
|
|
1026
998
|
actions: [...C.actions, ...X],
|
|
1027
999
|
streams: C.streams,
|
|
@@ -1029,55 +1001,55 @@ var Yt = () => {
|
|
|
1029
1001
|
workflowWorkers: C.workflowWorkers,
|
|
1030
1002
|
eventTriggers: C.eventTriggers,
|
|
1031
1003
|
schedules: C.schedules,
|
|
1032
|
-
subscribers:
|
|
1033
|
-
outboxHandlers:
|
|
1004
|
+
subscribers: wt,
|
|
1005
|
+
outboxHandlers: Dt,
|
|
1034
1006
|
connections: C.connections,
|
|
1035
|
-
reactions:
|
|
1036
|
-
aggregates:
|
|
1037
|
-
...
|
|
1007
|
+
reactions: Et,
|
|
1008
|
+
aggregates: J,
|
|
1009
|
+
...he === void 0 ? {} : { webhooks: he }
|
|
1038
1010
|
},
|
|
1039
1011
|
log: $,
|
|
1040
1012
|
analytics: D.sink,
|
|
1041
1013
|
aggregateStorage: Y,
|
|
1042
1014
|
aggregateCoordinator: Ot,
|
|
1043
|
-
store:
|
|
1044
|
-
kv:
|
|
1015
|
+
store: P,
|
|
1016
|
+
kv: Ie,
|
|
1045
1017
|
cache: F,
|
|
1046
|
-
snapshotCache:
|
|
1018
|
+
snapshotCache: Pe,
|
|
1047
1019
|
schemaRegistry: ke,
|
|
1048
1020
|
tenantScopedTables: C.tenantScopedTables,
|
|
1049
1021
|
softDeleteScopedTables: C.softDeleteScopedTables,
|
|
1050
1022
|
dataTransferSnapshot: jt(O),
|
|
1051
1023
|
dataTransferDialect: h,
|
|
1052
1024
|
tenantIsolation: (process.env.VOLTRO_TENANT_ISOLATION ?? m?.tenancy?.isolation) === "namespace" ? "namespace" : "shared-schema",
|
|
1053
|
-
resolveSubject: (e, t) =>
|
|
1025
|
+
resolveSubject: (e, t) => ut({
|
|
1054
1026
|
headers: e,
|
|
1055
1027
|
clientId: t
|
|
1056
1028
|
}),
|
|
1057
|
-
httpRoutes: [...L.flatMap((e) => e.httpRoutes ?? []), ...
|
|
1058
|
-
...
|
|
1059
|
-
...
|
|
1060
|
-
scheduleDefaultTrigger:
|
|
1061
|
-
scheduleCoordination:
|
|
1029
|
+
httpRoutes: [...L.flatMap((e) => e.httpRoutes ?? []), ...mt],
|
|
1030
|
+
...gt ? { baseLayer: gt } : {},
|
|
1031
|
+
...St === void 0 ? {} : { workflowEngineLayer: St },
|
|
1032
|
+
scheduleDefaultTrigger: vt,
|
|
1033
|
+
scheduleCoordination: bt,
|
|
1062
1034
|
scheduleArmSelf: !U,
|
|
1063
1035
|
dormancy: process.env.VOLTRO_DORMANCY === "sleep" || process.env.VOLTRO_DORMANCY === "always-on" ? process.env.VOLTRO_DORMANCY : m?.dormancy ?? "always-on",
|
|
1064
1036
|
scheduleReplicaId: process.env.HOSTNAME ?? `pid-${process.pid}`,
|
|
1065
|
-
...
|
|
1037
|
+
...Ct === void 0 ? {} : { scheduleFireInterceptor: Ct },
|
|
1066
1038
|
onSchedulerReady: (e) => {
|
|
1067
|
-
|
|
1039
|
+
xt = e;
|
|
1068
1040
|
},
|
|
1069
|
-
observability:
|
|
1070
|
-
port:
|
|
1041
|
+
observability: nt,
|
|
1042
|
+
port: ee,
|
|
1071
1043
|
...m?.transport?.wsPath ? { path: m.transport.wsPath } : {}
|
|
1072
1044
|
});
|
|
1073
|
-
c(
|
|
1045
|
+
c(re([
|
|
1074
1046
|
C.queries,
|
|
1075
1047
|
C.mutations,
|
|
1076
1048
|
C.actions,
|
|
1077
1049
|
C.streams
|
|
1078
1050
|
]), (e) => {
|
|
1079
1051
|
$.warn(e);
|
|
1080
|
-
}), $.info(`API listening on :${
|
|
1052
|
+
}), $.info(`API listening on :${ee}`, {
|
|
1081
1053
|
dialect: h,
|
|
1082
1054
|
queries: C.queries.length,
|
|
1083
1055
|
mutations: C.mutations.length,
|
|
@@ -1086,13 +1058,13 @@ var Yt = () => {
|
|
|
1086
1058
|
workflows: C.workflows.length,
|
|
1087
1059
|
workflowWorkers: C.workflowWorkers.length,
|
|
1088
1060
|
schedules: C.schedules.length,
|
|
1089
|
-
scheduleCoordination:
|
|
1061
|
+
scheduleCoordination: bt
|
|
1090
1062
|
}), s.finish($);
|
|
1091
|
-
let
|
|
1092
|
-
for (let e of
|
|
1093
|
-
|
|
1063
|
+
let It = () => {
|
|
1064
|
+
for (let e of Ze) e.stop();
|
|
1065
|
+
He.detach(), Ue.stop(), I(), Je?.dispose(), Promise.resolve(tt.deactivate()).then(() => rt?.close()).then(() => D.dispose()).then(() => At.close()).then(() => P.close?.()).then(() => process.exit(0));
|
|
1094
1066
|
};
|
|
1095
|
-
return process.on("SIGINT",
|
|
1067
|
+
return process.on("SIGINT", It), process.on("SIGTERM", It), await new Promise(() => {}), 0;
|
|
1096
1068
|
};
|
|
1097
1069
|
//#endregion
|
|
1098
|
-
export {
|
|
1070
|
+
export { hn as n, un as r, gn as t };
|