@voltro/cli 0.22.1 → 0.23.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 +316 -0
- package/dist/apiBuild-CD-4JLLA.js +2 -0
- package/dist/{apiBuild-DiWxVz-M.js → apiBuild-JQtIhZPy.js} +2 -2
- package/dist/bin.js +3 -3
- package/dist/{commands-BxRaIOBG.js → commands-Bsu9Buln.js} +1767 -1501
- package/dist/dbCommand-CSguuUQn.js +2 -0
- package/dist/{dbCommand-DVASmZj2.js → dbCommand-GI7-BVZt.js} +440 -259
- package/dist/{dev-Dd3EZzj5.js → dev-DRxF_qOB.js} +1 -1
- package/dist/{dev-BRiPgbKw.js → dev-jM07kq_D.js} +1479 -1479
- package/dist/index.js +1 -1
- package/dist/{inspectMetrics-9ZSuDeqD.js → inspectMetrics-dcC7gnxu.js} +566 -552
- package/dist/{serveCommand-DXJOARkO.js → serveCommand-Cl8sicD5.js} +280 -279
- 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/caching.md +21 -5
- package/templates/agent-docs/cli.md +44 -0
- package/templates/agent-docs/data.md +23 -5
- package/templates/agent-docs/database/migrations.md +94 -0
- 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/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/app.config.ts +6 -4
- package/templates/apps/api-versioning/package.json +8 -8
- package/templates/apps/api-webhooks/package.json +9 -9
- package/templates/apps/changelog/package.json +6 -6
- package/templates/apps/edge-functions/package.json +2 -2
- package/templates/apps/frontend-admin/package.json +8 -8
- package/templates/apps/frontend-app/package.json +8 -8
- package/templates/apps/frontend-blank/package.json +7 -7
- package/templates/apps/frontend-contact/package.json +7 -7
- package/templates/apps/frontend-dashboard/package.json +7 -7
- package/templates/apps/frontend-docs/package.json +7 -7
- package/templates/apps/frontend-i18n/package.json +6 -6
- package/templates/apps/frontend-landing/package.json +7 -7
- package/templates/apps/frontend-spa/package.json +7 -7
- package/templates/apps/frontend-ssr/package.json +7 -7
- package/templates/apps/frontend-ssr-api/package.json +8 -8
- package/templates/apps/frontend-static-blog/package.json +6 -6
- package/dist/apiBuild-COyPDf3R.js +0 -2
- package/dist/dbCommand-CO3eSAZR.js +0 -2
|
@@ -1,24 +1,24 @@
|
|
|
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 { $ as ee, A as f, B as p, C as te, D as m, E as ne, F as re, G as ie, H as ae, I as h, K as oe, L as g, M as _, N as se, O as v, P as y, R as ce, S as le, T as ue, V as de, W as fe, _ as b, at as pe, b as me, c as he, et as ge, h as _e, i as x, it as S, j as ve, k as ye, lt as be, m as C, nt as w, o as T, ot as xe, q as Se, r as Ce, rt as we, st as
|
|
8
|
-
import { l as
|
|
9
|
-
import { t as
|
|
10
|
-
import { n as
|
|
11
|
-
import { join as
|
|
12
|
-
import { pathToFileURL as
|
|
13
|
-
import { Cause as
|
|
14
|
-
import { createLogger as
|
|
15
|
-
import { existsSync as
|
|
16
|
-
import { AggregateRegistry as
|
|
17
|
-
import { RpcGroup as
|
|
18
|
-
import { SqlClient as
|
|
19
|
-
import { and as
|
|
20
|
-
import { appStorageProvider as
|
|
21
|
-
import { AuthMiddleware as
|
|
7
|
+
import { $ as ee, A as f, B as p, C as te, D as m, E as ne, F as re, G as ie, H as ae, I as h, K as oe, L as g, M as _, N as se, O as v, P as y, R as ce, S as le, T as ue, V as de, W as fe, _ as b, at as pe, b as me, c as he, et as ge, h as _e, i as x, it as S, j as ve, k as ye, lt as be, m as C, nt as w, o as T, ot as xe, q as Se, r as Ce, rt as we, st as E, t as Te, tt as Ee, u as De, ut as Oe, v as ke, w as Ae, x as D, y as je, z as Me } from "./dev-jM07kq_D.js";
|
|
8
|
+
import { l as O, r as k } from "./apiBuild-JQtIhZPy.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, makeMutationRunner as ct, makeOneShotQueryRunner as lt, makeQueryDescriptorProducer as ut, makeQueryReauthorizer as dt, makeQuerySubscriber as ft, makeSchemaRegistry as pt, makeWorkflowFacade as mt, makeWorkflowFacadeWithCallerContext as ht, makeWorkflowLayers as gt, noopKv as z, onProcessShutdown as _t, recordSubscriptionDelivery as vt, registerWakeup as yt, resolveSecretsBackend as bt, runProvidedEffect as xt, setSecretsBackend as St, setSystemStoreHandle as Ct, setTupleSource as wt, singleCoordinator as Tt, startRpcServer as Et, startScheduler as Dt, workflowToRpc as B, 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 V, or as Nt } from "@voltro/database";
|
|
20
|
+
import { appStorageProvider as H, fromNodeReadable as Pt, getObjectStream as Ft, putObjectStream as It, toNodeReadable as U } from "@voltro/plugin-storage";
|
|
21
|
+
import { AuthMiddleware as Lt, ConnectionInfoMiddleware as W, actionToRpc as G, anonymousSubject as Rt, isWireReachable as zt, mutationToRpc as Bt, queryToRpc as K, streamToRpc as Vt, workflowCancelDescriptor as Ht, workflowDomainEventsQueryDescriptor as q, workflowEventDeliveriesQueryDescriptor as Ut, workflowResumeDescriptor as J, workflowRunEventsQueryDescriptor as Y, workflowRunQueryDescriptor as X, workflowRunStepsQueryDescriptor as Wt, workflowRunsQueryDescriptor as Z, workflowSignalDescriptor as Gt, workflowUpdateDescriptor as Kt } from "@voltro/protocol";
|
|
22
22
|
import { assertProductionSessionSecret as qt } from "@voltro/protocol/session";
|
|
23
23
|
import { createHash as Jt, timingSafeEqual as Yt } from "node:crypto";
|
|
24
24
|
import { declaredSnapshot as Xt, describeOutcome as Zt, runPlannedMigrations as Qt } from "@voltro/database/sql";
|
|
@@ -42,7 +42,7 @@ var hn = "VoltroBootRefusal", gn = (e) => {
|
|
|
42
42
|
if (!t || t.length < 16) return Q(503, { error: "data transfer misconfigured (no/weak secret)" });
|
|
43
43
|
let n = yn(e.headers);
|
|
44
44
|
return !n || !bn(n, t) ? Q(401, { error: "unauthorized" }) : null;
|
|
45
|
-
}, Sn =
|
|
45
|
+
}, Sn = N({ scope: "voltro:admin-import" }), Cn = "VBUNDLE2", wn = async function* (e) {
|
|
46
46
|
yield e;
|
|
47
47
|
}, Tn = (e) => async (t) => {
|
|
48
48
|
let n = xn(t, e.secret);
|
|
@@ -66,7 +66,7 @@ var hn = "VoltroBootRefusal", gn = (e) => {
|
|
|
66
66
|
dir: f,
|
|
67
67
|
blobs: e.assetSink
|
|
68
68
|
}) : await mn(c, f);
|
|
69
|
-
let t = await
|
|
69
|
+
let t = await j.runPromiseExit(un({
|
|
70
70
|
store: e.store,
|
|
71
71
|
bundleDir: f,
|
|
72
72
|
...r ? { mode: r } : {},
|
|
@@ -121,7 +121,7 @@ var hn = "VoltroBootRefusal", gn = (e) => {
|
|
|
121
121
|
force: !0
|
|
122
122
|
});
|
|
123
123
|
}
|
|
124
|
-
}, En =
|
|
124
|
+
}, En = N({ scope: "voltro:admin-export" }), Dn = async (e) => {
|
|
125
125
|
let t = [];
|
|
126
126
|
for await (let n of e) t.push(Buffer.from(n));
|
|
127
127
|
return new Uint8Array(Buffer.concat(t));
|
|
@@ -154,7 +154,7 @@ var hn = "VoltroBootRefusal", gn = (e) => {
|
|
|
154
154
|
}
|
|
155
155
|
let a = r.consistency === "snapshot" ? "snapshot" : i.consistency ?? "live", o = (typeof r.compression == "string" ? r.compression : void 0) ?? i.compression, s = i.scope ?? On(r), c = typeof r.bundleKey == "string" && r.bundleKey.length > 0, l = r.assets === !0 && e.assetSource ? { blobs: e.assetSource } : {}, u = await import("node:os"), d = await import("node:fs/promises"), ee = await import("node:path"), f = await d.mkdtemp(ee.join(u.tmpdir(), "voltro-admin-export-"));
|
|
156
156
|
try {
|
|
157
|
-
let t = await
|
|
157
|
+
let t = await j.runPromise(ln({
|
|
158
158
|
store: e.store,
|
|
159
159
|
snapshot: e.snapshot,
|
|
160
160
|
dialect: e.dialect,
|
|
@@ -230,7 +230,7 @@ var hn = "VoltroBootRefusal", gn = (e) => {
|
|
|
230
230
|
if (!o) throw Error(`data profile '${i}' has no default export`);
|
|
231
231
|
return o;
|
|
232
232
|
}, jn = (e, t, n = {}) => (async function* () {
|
|
233
|
-
let r = await
|
|
233
|
+
let r = await U((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 {
|
|
@@ -249,20 +249,20 @@ var hn = "VoltroBootRefusal", gn = (e) => {
|
|
|
249
249
|
invalidateTag: async () => 0,
|
|
250
250
|
wrap: async (e, t, n) => n()
|
|
251
251
|
}, Nn = async (e) => {
|
|
252
|
-
|
|
252
|
+
Ct({
|
|
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
|
-
recordDelivery: (e) =>
|
|
259
|
+
recordDelivery: (e) => vt({
|
|
260
260
|
label: e.label,
|
|
261
261
|
kind: e.kind,
|
|
262
262
|
durationMs: e.durationMs,
|
|
263
263
|
rowCount: e.rowCount
|
|
264
264
|
})
|
|
265
|
-
}), n = e.cache ?? Mn, r = e.kv ??
|
|
265
|
+
}), n = e.cache ?? Mn, r = e.kv ?? z, i, a, o, s = /* @__PURE__ */ new Map(), c = () => `wfctx_${globalThis.crypto?.randomUUID?.() ?? `${Date.now().toString(36)}${Math.random().toString(36).slice(2)}`}`, l = async (t, n, r) => {
|
|
266
266
|
let i = {
|
|
267
267
|
...r,
|
|
268
268
|
source: r.source ?? `workflow:${t}`
|
|
@@ -272,7 +272,7 @@ var hn = "VoltroBootRefusal", gn = (e) => {
|
|
|
272
272
|
let r = await e.store.query({
|
|
273
273
|
table: "_voltro_workflow_start_contexts",
|
|
274
274
|
order: [],
|
|
275
|
-
predicate:
|
|
275
|
+
predicate: V("executionId", n),
|
|
276
276
|
projection: ["id"],
|
|
277
277
|
skip: void 0,
|
|
278
278
|
take: 1
|
|
@@ -300,7 +300,7 @@ var hn = "VoltroBootRefusal", gn = (e) => {
|
|
|
300
300
|
let t = (await e.store.query({
|
|
301
301
|
table: "_voltro_workflow_start_contexts",
|
|
302
302
|
order: [],
|
|
303
|
-
predicate:
|
|
303
|
+
predicate: V("executionId", n),
|
|
304
304
|
projection: void 0,
|
|
305
305
|
skip: void 0,
|
|
306
306
|
take: 1
|
|
@@ -318,7 +318,7 @@ 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 ?
|
|
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, te = f || (e.discovered.workflowWorkers?.length ?? 0) > 0 || e.scheduleCoordination === "cluster", re = e.tenantIsolation === "namespace", ie = (e.log ?? N({ scope: "voltro:serve" })).child("webhooks"), ae, h = e.discovered.webhooks;
|
|
322
322
|
if (h && h.outgoing.length > 0 && e.workflowEngineLayer !== void 0) {
|
|
323
323
|
let t = e.workflowEngineLayer, i = S({
|
|
324
324
|
store: e.store,
|
|
@@ -327,8 +327,8 @@ var hn = "VoltroBootRefusal", gn = (e) => {
|
|
|
327
327
|
kv: r
|
|
328
328
|
}), a = h.outgoing.map((e) => e.descriptor);
|
|
329
329
|
ae = rn(i, async (e) => {
|
|
330
|
-
let n = on.execute(e).pipe(
|
|
331
|
-
|
|
330
|
+
let n = on.execute(e).pipe(j.provide(on.toLayer(nn(i, { events: a })).pipe(M.provideMerge(t))));
|
|
331
|
+
j.runPromise(n).catch((t) => {
|
|
332
332
|
ie.error("deliverWebhook workflow crashed", {
|
|
333
333
|
deliveryId: e.deliveryId,
|
|
334
334
|
targetId: e.targetId
|
|
@@ -340,7 +340,7 @@ var hn = "VoltroBootRefusal", gn = (e) => {
|
|
|
340
340
|
if (h) for (let e of h.incoming) {
|
|
341
341
|
let t = e.descriptor.path ?? an(e.descriptor.id), n = `VOLTRO_WEBHOOK_SECRET_${e.descriptor.id.toUpperCase().replace(/[^A-Z0-9]/g, "_")}`, r = sn(e.descriptor, {
|
|
342
342
|
resolveSecret: async () => process.env[n] ?? null,
|
|
343
|
-
resolveWorkflows: () => d === void 0 ? void 0 :
|
|
343
|
+
resolveWorkflows: () => d === void 0 ? void 0 : ht(d, {
|
|
344
344
|
traceId: `incoming:${e.descriptor.id}`,
|
|
345
345
|
source: `incoming:${e.descriptor.id}`
|
|
346
346
|
}),
|
|
@@ -357,16 +357,16 @@ var hn = "VoltroBootRefusal", gn = (e) => {
|
|
|
357
357
|
});
|
|
358
358
|
oe.set(t, { handle: r });
|
|
359
359
|
}
|
|
360
|
-
|
|
360
|
+
Qe(), wt((t) => $e(e.store, t.subjectId, t.resourceType, t.resourceId));
|
|
361
361
|
let se = (e.discovered.outboxHandlers?.length ?? 0) > 0 ? p({
|
|
362
362
|
handlers: e.discovered.outboxHandlers ?? [],
|
|
363
363
|
store: e.store,
|
|
364
|
-
log: (e.log ??
|
|
364
|
+
log: (e.log ?? N({ scope: "voltro:serve" })).child("outbox")
|
|
365
365
|
}) : void 0, v = ce({
|
|
366
366
|
definitions: (e.discovered.connections ?? []).map((e) => e.definition),
|
|
367
367
|
store: e.store,
|
|
368
368
|
publicUrl: g(e.port ?? 4e3),
|
|
369
|
-
log: (e.log ??
|
|
369
|
+
log: (e.log ?? N({ scope: "voltro:serve" })).child("connections")
|
|
370
370
|
}), y = we({
|
|
371
371
|
store: e.store,
|
|
372
372
|
schemaRegistry: e.schemaRegistry,
|
|
@@ -378,118 +378,118 @@ var hn = "VoltroBootRefusal", gn = (e) => {
|
|
|
378
378
|
namespaceIsolationOn: re,
|
|
379
379
|
...se === void 0 ? {} : { outbox: { nudge: se.nudge } },
|
|
380
380
|
...v.active ? { connections: { registry: v.registry } } : {}
|
|
381
|
-
}), ue =
|
|
382
|
-
let r = t.pipe(
|
|
383
|
-
return (e.baseLayer ? r.pipe(
|
|
384
|
-
}, pe = (e, t) =>
|
|
381
|
+
}), ue = M.succeed(P, m), fe = (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(ue));
|
|
384
|
+
}, pe = (e, t) => xt(fe(e, t)), me = ct({
|
|
385
385
|
store: e.store,
|
|
386
386
|
buildContext: (e, t, n) => y(e, t, n),
|
|
387
387
|
runEffect: pe,
|
|
388
388
|
undoCapture: le()
|
|
389
|
-
}), he =
|
|
389
|
+
}), he = D(), ge = R({
|
|
390
390
|
buildContext: (e) => y(e),
|
|
391
391
|
runEffect: pe
|
|
392
392
|
}), _e = {
|
|
393
393
|
buildContext: (e) => y(e),
|
|
394
|
-
finalize: (t, n) => He(
|
|
394
|
+
finalize: (t, n) => Ve(He(t, e.tenantScopedTables, n.subject.tenantId), e.softDeleteScopedTables),
|
|
395
395
|
provideEffect: fe
|
|
396
|
-
}, x =
|
|
396
|
+
}, x = ut(_e), ye = lt({
|
|
397
397
|
..._e,
|
|
398
398
|
queryRows: (t) => e.store.query(t)
|
|
399
|
-
}), be =
|
|
399
|
+
}), be = ft({
|
|
400
400
|
..._e,
|
|
401
401
|
subscribeDescriptor: (e, n, r) => t.subscribe(e, n, r),
|
|
402
402
|
subscribeComputed: (e, n, r) => t.subscribeComputed(e, n, r)
|
|
403
|
-
}), C = {};
|
|
403
|
+
}), C = (e) => e.filter((e) => zt(e.descriptor)), T = {};
|
|
404
404
|
for (let n of [
|
|
405
|
-
...e.discovered.queries,
|
|
405
|
+
...C(e.discovered.queries),
|
|
406
406
|
...he.queries,
|
|
407
407
|
...v.queries
|
|
408
|
-
])
|
|
408
|
+
]) T[n.descriptor.name] = (e) => I(x(n, e), t, `subscription.${n.descriptor.name}`, void 0, void 0, dt(n, e));
|
|
409
409
|
for (let t of [
|
|
410
|
-
...e.discovered.mutations,
|
|
410
|
+
...C(e.discovered.mutations),
|
|
411
411
|
...he.mutations,
|
|
412
412
|
...v.mutations
|
|
413
|
-
])
|
|
414
|
-
for (let t of [...e.discovered.actions, ...v.actions])
|
|
415
|
-
let
|
|
413
|
+
]) T[t.descriptor.name] = (e) => F(async (e, n) => me(t, e, n), e, `mutation.${t.descriptor.name}`);
|
|
414
|
+
for (let t of [...C(e.discovered.actions), ...v.actions]) T[t.descriptor.name] = (e) => F(async (e, n) => ge(t, e, n), e, `action.${t.descriptor.name}`);
|
|
415
|
+
let xe = () => `public-${Math.random().toString(36).slice(2, 10)}`, Se = [
|
|
416
416
|
...e.discovered.queries.filter((e) => e.descriptor.publicApi !== void 0).map((e) => ({
|
|
417
417
|
descriptor: e.descriptor,
|
|
418
418
|
invoke: (t, n) => ye(e, t, {
|
|
419
419
|
subject: n.subject,
|
|
420
|
-
traceId:
|
|
420
|
+
traceId: xe()
|
|
421
421
|
}),
|
|
422
422
|
subscribe: (t, n, r) => be(e, t, {
|
|
423
423
|
subject: n.subject,
|
|
424
|
-
traceId:
|
|
424
|
+
traceId: xe()
|
|
425
425
|
}, r)
|
|
426
426
|
})),
|
|
427
427
|
...e.discovered.mutations.filter((e) => e.descriptor.publicApi !== void 0).map((e) => ({
|
|
428
428
|
descriptor: e.descriptor,
|
|
429
429
|
invoke: (t, n) => me(e, t, {
|
|
430
430
|
subject: n.subject,
|
|
431
|
-
traceId:
|
|
431
|
+
traceId: xe()
|
|
432
432
|
})
|
|
433
433
|
})),
|
|
434
434
|
...e.discovered.actions.filter((e) => e.descriptor.publicApi !== void 0).map((e) => ({
|
|
435
435
|
descriptor: e.descriptor,
|
|
436
436
|
invoke: (t, n) => ge(e, t, {
|
|
437
437
|
subject: n.subject,
|
|
438
|
-
traceId:
|
|
438
|
+
traceId: xe()
|
|
439
439
|
})
|
|
440
440
|
}))
|
|
441
|
-
],
|
|
441
|
+
], Ce = Se.length > 0 ? tn(en(Se), {
|
|
442
442
|
store: e.store,
|
|
443
443
|
resolveSubject: (t) => e.resolveSubject(t, -1)
|
|
444
|
-
}) : [],
|
|
444
|
+
}) : [], E = e.dataTransferSecret ?? process.env.VOLTRO_DATA_TRANSFER_SECRET, Te = E && E.length >= 16 ? [{
|
|
445
445
|
method: "POST",
|
|
446
446
|
path: _n,
|
|
447
447
|
handle: Tn({
|
|
448
|
-
secret:
|
|
448
|
+
secret: E,
|
|
449
449
|
store: e.store,
|
|
450
450
|
...e.dataTransferSnapshot ? { snapshot: e.dataTransferSnapshot } : {},
|
|
451
|
-
assetSink: dn(
|
|
452
|
-
openArchive: (e) => jn(
|
|
451
|
+
assetSink: dn(H()),
|
|
452
|
+
openArchive: (e) => jn(H(), e)
|
|
453
453
|
})
|
|
454
454
|
}, {
|
|
455
455
|
method: "POST",
|
|
456
456
|
path: vn,
|
|
457
457
|
handle: kn({
|
|
458
|
-
secret:
|
|
458
|
+
secret: E,
|
|
459
459
|
store: e.store,
|
|
460
460
|
snapshot: e.dataTransferSnapshot ?? { tables: [] },
|
|
461
461
|
dialect: e.dataTransferDialect ?? "memory",
|
|
462
462
|
tenantTables: [...e.tenantScopedTables],
|
|
463
463
|
loadProfile: An,
|
|
464
|
-
assetSource: fn(
|
|
464
|
+
assetSource: fn(H(), e.store),
|
|
465
465
|
putArchive: async (e, t) => {
|
|
466
|
-
let { Readable: n } = await import("node:stream"), r =
|
|
467
|
-
await
|
|
466
|
+
let { Readable: n } = await import("node:stream"), r = H(), i = Pt("storage", () => n.from(t()));
|
|
467
|
+
await j.runPromise(It(r, e, i, { contentType: "application/octet-stream" }));
|
|
468
468
|
}
|
|
469
469
|
})
|
|
470
470
|
}] : [], Ee = [
|
|
471
471
|
...e.httpRoutes ?? [],
|
|
472
|
-
...
|
|
472
|
+
...Ce,
|
|
473
473
|
...Te,
|
|
474
474
|
...v.httpRoutes
|
|
475
475
|
];
|
|
476
|
-
for (let t of e.discovered.streams ?? [])
|
|
476
|
+
for (let t of C(e.discovered.streams ?? [])) T[t.descriptor.name] = (n) => Ge((r) => {
|
|
477
477
|
let i = y(r), a = t.executor(n, i);
|
|
478
|
-
if (
|
|
479
|
-
let t = a.pipe(
|
|
480
|
-
return (e.baseLayer ? t.pipe(
|
|
478
|
+
if (j.isEffect(a)) {
|
|
479
|
+
let t = a.pipe(j.provide(ot(i.store)));
|
|
480
|
+
return (e.baseLayer ? t.pipe(j.provide(e.baseLayer)) : t).pipe(j.provide(ue));
|
|
481
481
|
}
|
|
482
|
-
return typeof a == "object" && a && typeof a.then == "function" ?
|
|
482
|
+
return typeof a == "object" && a && typeof a.then == "function" ? j.promise(() => a) : a;
|
|
483
483
|
}, `stream.${t.descriptor.name}`);
|
|
484
|
-
for (let t of e.discovered.workflows ?? [])
|
|
484
|
+
for (let t of e.discovered.workflows ?? []) T[t.definition.name] = (e) => F(async (e, n) => {
|
|
485
485
|
let r = n;
|
|
486
|
-
return
|
|
486
|
+
return ht(d, {
|
|
487
487
|
subject: r.subject,
|
|
488
488
|
traceId: r.traceId,
|
|
489
489
|
source: "workflow-rpc"
|
|
490
490
|
}).start(t.definition.name, e);
|
|
491
491
|
}, e, `workflow.${t.definition.name}`);
|
|
492
|
-
f && (
|
|
492
|
+
f && (T[X.name] = (e) => I(x({
|
|
493
493
|
descriptor: X,
|
|
494
494
|
executor: (e) => {
|
|
495
495
|
let t = e.id;
|
|
@@ -499,29 +499,29 @@ var hn = "VoltroBootRefusal", gn = (e) => {
|
|
|
499
499
|
column: "startedAt",
|
|
500
500
|
direction: "desc"
|
|
501
501
|
}],
|
|
502
|
-
predicate:
|
|
502
|
+
predicate: Nt(V("id", t), V("executionId", t)),
|
|
503
503
|
take: 1,
|
|
504
504
|
skip: void 0,
|
|
505
505
|
projection: void 0
|
|
506
506
|
};
|
|
507
507
|
}
|
|
508
|
-
}, e), t, `subscription.${X.name}`),
|
|
508
|
+
}, e), t, `subscription.${X.name}`), T[Z.name] = (e) => I(x({
|
|
509
509
|
descriptor: Z,
|
|
510
510
|
executor: (e) => {
|
|
511
|
-
let t = e, n = [...t.tag === void 0 ? [] : [
|
|
511
|
+
let t = e, n = [...t.tag === void 0 ? [] : [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;
|
|
512
512
|
return {
|
|
513
513
|
table: "_voltro_workflow_runs",
|
|
514
514
|
order: [{
|
|
515
515
|
column: "startedAt",
|
|
516
516
|
direction: "desc"
|
|
517
517
|
}],
|
|
518
|
-
predicate: n.length === 0 ? void 0 : n.length === 1 ? n[0] :
|
|
518
|
+
predicate: n.length === 0 ? void 0 : n.length === 1 ? n[0] : jt(...n),
|
|
519
519
|
take: r,
|
|
520
520
|
skip: void 0,
|
|
521
521
|
projection: void 0
|
|
522
522
|
};
|
|
523
523
|
}
|
|
524
|
-
}, e), t, `subscription.${Z.name}`),
|
|
524
|
+
}, e), t, `subscription.${Z.name}`), T[Wt.name] = (e) => I(x({
|
|
525
525
|
descriptor: Wt,
|
|
526
526
|
executor: (e) => {
|
|
527
527
|
let t = e.runId;
|
|
@@ -531,13 +531,13 @@ var hn = "VoltroBootRefusal", gn = (e) => {
|
|
|
531
531
|
column: "startedAt",
|
|
532
532
|
direction: "asc"
|
|
533
533
|
}],
|
|
534
|
-
predicate:
|
|
534
|
+
predicate: V("runId", t),
|
|
535
535
|
take: 1e3,
|
|
536
536
|
skip: void 0,
|
|
537
537
|
projection: void 0
|
|
538
538
|
};
|
|
539
539
|
}
|
|
540
|
-
}, e), t, `subscription.${Wt.name}`),
|
|
540
|
+
}, e), t, `subscription.${Wt.name}`), T[Y.name] = (e) => I(x({
|
|
541
541
|
descriptor: Y,
|
|
542
542
|
executor: (e) => {
|
|
543
543
|
let t = e.runId;
|
|
@@ -547,14 +547,14 @@ var hn = "VoltroBootRefusal", gn = (e) => {
|
|
|
547
547
|
column: "occurredAt",
|
|
548
548
|
direction: "asc"
|
|
549
549
|
}],
|
|
550
|
-
predicate:
|
|
550
|
+
predicate: V("runId", t),
|
|
551
551
|
take: 1e3,
|
|
552
552
|
skip: void 0,
|
|
553
553
|
projection: void 0
|
|
554
554
|
};
|
|
555
555
|
}
|
|
556
|
-
}, e), t, `subscription.${Y.name}`),
|
|
557
|
-
descriptor:
|
|
556
|
+
}, e), t, `subscription.${Y.name}`), T[q.name] = (e) => I(x({
|
|
557
|
+
descriptor: q,
|
|
558
558
|
executor: (e) => {
|
|
559
559
|
let t = e;
|
|
560
560
|
return {
|
|
@@ -563,14 +563,14 @@ var hn = "VoltroBootRefusal", gn = (e) => {
|
|
|
563
563
|
column: "occurredAt",
|
|
564
564
|
direction: "desc"
|
|
565
565
|
}],
|
|
566
|
-
predicate: t.name === void 0 ? void 0 :
|
|
566
|
+
predicate: t.name === void 0 ? void 0 : V("name", t.name),
|
|
567
567
|
take: Math.max(1, Math.min(500, t.limit ?? 100)),
|
|
568
568
|
skip: void 0,
|
|
569
569
|
projection: void 0
|
|
570
570
|
};
|
|
571
571
|
}
|
|
572
|
-
}, e), t, `subscription.${
|
|
573
|
-
descriptor:
|
|
572
|
+
}, e), t, `subscription.${q.name}`), T[Ut.name] = (e) => I(x({
|
|
573
|
+
descriptor: Ut,
|
|
574
574
|
executor: (e) => {
|
|
575
575
|
let t = e.eventId;
|
|
576
576
|
return {
|
|
@@ -579,69 +579,69 @@ var hn = "VoltroBootRefusal", gn = (e) => {
|
|
|
579
579
|
column: "createdAt",
|
|
580
580
|
direction: "asc"
|
|
581
581
|
}],
|
|
582
|
-
predicate:
|
|
582
|
+
predicate: V("eventId", t),
|
|
583
583
|
take: 500,
|
|
584
584
|
skip: void 0,
|
|
585
585
|
projection: void 0
|
|
586
586
|
};
|
|
587
587
|
}
|
|
588
|
-
}, e), t, `subscription.${
|
|
588
|
+
}, e), t, `subscription.${Ut.name}`), T[Ht.name] = (t) => F(async (t, n) => {
|
|
589
589
|
let r = t;
|
|
590
|
-
return await w(e.store, n.subject, { executionId: r.executionId }), await d.cancel(r.workflowName, r.executionId), await
|
|
591
|
-
}, t, `action.${
|
|
590
|
+
return await w(e.store, n.subject, { executionId: r.executionId }), await d.cancel(r.workflowName, r.executionId), await Pe(r.workflowName, r.executionId, "workflow.cancel"), { ok: !0 };
|
|
591
|
+
}, t, `action.${Ht.name}`), T[J.name] = (t) => F(async (t, n) => {
|
|
592
592
|
let r = t;
|
|
593
593
|
return await w(e.store, n.subject, { executionId: r.executionId }), await d.resume(r.workflowName, r.executionId), { ok: !0 };
|
|
594
|
-
}, t, `action.${
|
|
594
|
+
}, t, `action.${J.name}`), T[Gt.name] = (t) => F(async (t, n) => {
|
|
595
595
|
let r = t;
|
|
596
596
|
return await w(e.store, n.subject, { id: r.id }), d.signal({ id: r.id }, r.signalName, r.payload);
|
|
597
|
-
}, t, `action.${Gt.name}`),
|
|
597
|
+
}, t, `action.${Gt.name}`), T[Kt.name] = (t) => F(async (t, n) => {
|
|
598
598
|
let r = t;
|
|
599
599
|
return await w(e.store, n.subject, { id: r.id }), d.update({ id: r.id }, r.updateName, r.payload, r.timeoutMs === void 0 ? void 0 : { timeoutMs: r.timeoutMs });
|
|
600
600
|
}, t, `action.${Kt.name}`));
|
|
601
|
-
let De =
|
|
602
|
-
...
|
|
603
|
-
...
|
|
604
|
-
...
|
|
605
|
-
...he.queries.map((e) =>
|
|
606
|
-
...he.mutations.map((e) =>
|
|
607
|
-
...v.queries.map((e) =>
|
|
608
|
-
...v.mutations.map((e) =>
|
|
609
|
-
...v.actions.map((e) =>
|
|
610
|
-
...(e.discovered.streams ?? []).map((e) =>
|
|
611
|
-
...(e.discovered.workflows ?? []).map((e) =>
|
|
601
|
+
let De = [
|
|
602
|
+
...C(e.discovered.queries).map((e) => K(e.descriptor)),
|
|
603
|
+
...C(e.discovered.mutations).map((e) => Bt(e.descriptor)),
|
|
604
|
+
...C(e.discovered.actions).map((e) => G(e.descriptor)),
|
|
605
|
+
...he.queries.map((e) => K(e.descriptor)),
|
|
606
|
+
...he.mutations.map((e) => Bt(e.descriptor)),
|
|
607
|
+
...v.queries.map((e) => K(e.descriptor)),
|
|
608
|
+
...v.mutations.map((e) => Bt(e.descriptor)),
|
|
609
|
+
...v.actions.map((e) => G(e.descriptor)),
|
|
610
|
+
...C(e.discovered.streams ?? []).map((e) => Vt(e.descriptor)),
|
|
611
|
+
...(e.discovered.workflows ?? []).map((e) => B(e.definition)),
|
|
612
612
|
...f ? [
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
q
|
|
618
|
-
q(Ht),
|
|
619
|
-
K(Vt),
|
|
613
|
+
K(X),
|
|
614
|
+
K(Z),
|
|
615
|
+
K(Wt),
|
|
616
|
+
K(Y),
|
|
617
|
+
K(q),
|
|
620
618
|
K(Ut),
|
|
621
|
-
|
|
622
|
-
|
|
619
|
+
G(Ht),
|
|
620
|
+
G(J),
|
|
621
|
+
G(Gt),
|
|
622
|
+
G(Kt)
|
|
623
623
|
] : []
|
|
624
|
-
],
|
|
625
|
-
register: (t, n, r) =>
|
|
626
|
-
tenantId: r ??
|
|
624
|
+
], Oe = kt.make(...De).middleware(Lt).middleware(W), Ae = M.succeed(Lt, Lt.of(({ headers: t, clientId: n }) => j.promise(() => e.resolveSubject(t, n)))), je = M.succeed(W, W.of(({ clientId: e }) => j.succeed({ clientId: e }))), Me = e.dormancyTenantId ?? "default", O = e.dormancy === "sleep" ? {
|
|
625
|
+
register: (t, n, r) => yt(e.store, {
|
|
626
|
+
tenantId: r ?? Me,
|
|
627
627
|
kind: "workflow",
|
|
628
628
|
refId: t,
|
|
629
629
|
wakeAt: n
|
|
630
630
|
}),
|
|
631
|
-
cancel: (t, n) =>
|
|
632
|
-
tenantId: n ??
|
|
631
|
+
cancel: (t, n) => qe(e.store, {
|
|
632
|
+
tenantId: n ?? Me,
|
|
633
633
|
kind: "workflow",
|
|
634
634
|
refId: t
|
|
635
635
|
}).then(() => {})
|
|
636
|
-
} : void 0,
|
|
636
|
+
} : void 0, k = te ? await import("@voltro/workflow") : void 0, A = k?.makeWorkflowRunRecorder({
|
|
637
637
|
store: e.store,
|
|
638
|
-
...
|
|
639
|
-
}),
|
|
640
|
-
await
|
|
638
|
+
...O === void 0 ? {} : { wakeups: O }
|
|
639
|
+
}), Ne = async (t, n) => {
|
|
640
|
+
await k.closeWorkflowChildrenForParent({
|
|
641
641
|
store: e.store,
|
|
642
642
|
parentExecutionId: t,
|
|
643
643
|
parentStatus: n,
|
|
644
|
-
recorder:
|
|
644
|
+
recorder: A,
|
|
645
645
|
log: { warn: (e, t) => {
|
|
646
646
|
process.stderr.write(`[workflow] ${e} ${t ? JSON.stringify(t) : ""}\n`);
|
|
647
647
|
} },
|
|
@@ -652,11 +652,11 @@ var hn = "VoltroBootRefusal", gn = (e) => {
|
|
|
652
652
|
await a.runPromise(r.definition.interrupt(n));
|
|
653
653
|
}
|
|
654
654
|
});
|
|
655
|
-
},
|
|
655
|
+
}, Pe = async (t, n, r) => {
|
|
656
656
|
let i = (await e.store.query({
|
|
657
657
|
table: "_voltro_workflow_runs",
|
|
658
658
|
order: [],
|
|
659
|
-
predicate:
|
|
659
|
+
predicate: V("executionId", n),
|
|
660
660
|
projection: void 0,
|
|
661
661
|
skip: void 0,
|
|
662
662
|
take: 1
|
|
@@ -667,7 +667,7 @@ var hn = "VoltroBootRefusal", gn = (e) => {
|
|
|
667
667
|
cancelled: !0,
|
|
668
668
|
completedAt: /* @__PURE__ */ new Date()
|
|
669
669
|
}), o = i.subject?.tenantId ?? void 0;
|
|
670
|
-
a && await
|
|
670
|
+
a && await A.recordEvent({
|
|
671
671
|
runId: i.id,
|
|
672
672
|
eventType: "run-cancelled",
|
|
673
673
|
payload: {
|
|
@@ -676,16 +676,16 @@ var hn = "VoltroBootRefusal", gn = (e) => {
|
|
|
676
676
|
executionId: n,
|
|
677
677
|
...o == null ? {} : { tenantId: o }
|
|
678
678
|
}
|
|
679
|
-
}), a && await
|
|
680
|
-
},
|
|
679
|
+
}), a && await Ne(n, "cancelled");
|
|
680
|
+
}, Fe = [...gt(e.discovered.workflows ?? [], {
|
|
681
681
|
buildContext: (t, n) => e.buildContextForWorkflow?.(t, n) ?? y({
|
|
682
682
|
subject: t.subject,
|
|
683
683
|
traceId: t.traceId
|
|
684
684
|
}, e.store, void 0, `workflow:${n.workflowName}`, { parentExecutionId: n.executionId }),
|
|
685
685
|
resolveStartContext: u
|
|
686
686
|
}, (t, n, r) => {
|
|
687
|
-
let i =
|
|
688
|
-
return
|
|
687
|
+
let i = k.getWorkflowVersionMetadata(t.definition);
|
|
688
|
+
return k.wrapWorkflowExecuteWithRunRecording({
|
|
689
689
|
name: t.definition.name,
|
|
690
690
|
store: e.store,
|
|
691
691
|
subject: r.subject,
|
|
@@ -696,71 +696,72 @@ var hn = "VoltroBootRefusal", gn = (e) => {
|
|
|
696
696
|
workflowPatches: i.patches,
|
|
697
697
|
parentExecutionId: r?.parentExecutionId ?? null,
|
|
698
698
|
parentClosePolicy: r?.parentClosePolicy ?? null,
|
|
699
|
-
onParentClose: ({ executionId: e, status: t }) =>
|
|
700
|
-
recorder:
|
|
699
|
+
onParentClose: ({ executionId: e, status: t }) => Ne(e, t),
|
|
700
|
+
recorder: A
|
|
701
701
|
}, n);
|
|
702
|
-
}), ...e.discovered.workflowWorkers ?? []],
|
|
702
|
+
}), ...e.discovered.workflowWorkers ?? []], Ie = Fe.length > 0 ? M.mergeAll(...Fe) : M.empty;
|
|
703
703
|
if (((e.discovered.workflows?.length ?? 0) > 0 || (e.discovered.workflowWorkers?.length ?? 0) > 0 || e.scheduleCoordination === "cluster") && e.workflowEngineLayer !== void 0) {
|
|
704
|
-
let t =
|
|
705
|
-
a =
|
|
704
|
+
let t = Ie.pipe(M.provideMerge(e.workflowEngineLayer));
|
|
705
|
+
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 ? mt({
|
|
706
706
|
workflows: e.discovered.workflows ?? [],
|
|
707
707
|
runEffect: (e) => a.runPromise(e),
|
|
708
708
|
rememberStartContext: l,
|
|
709
709
|
signal: async (t, n, r) => {
|
|
710
|
-
let i = await
|
|
710
|
+
let i = await k.sendWorkflowSignal({
|
|
711
711
|
store: e.store,
|
|
712
|
-
recorder:
|
|
712
|
+
recorder: A,
|
|
713
713
|
target: t,
|
|
714
714
|
signalName: n,
|
|
715
715
|
payload: r
|
|
716
716
|
});
|
|
717
|
-
return await a.runPromise(
|
|
717
|
+
return await a.runPromise(k.completeSuspendingSignal({
|
|
718
718
|
store: e.store,
|
|
719
719
|
target: t,
|
|
720
720
|
signalName: n,
|
|
721
721
|
payload: r
|
|
722
722
|
})).catch(() => {}), i;
|
|
723
723
|
},
|
|
724
|
-
update: (t, n, r, i) =>
|
|
724
|
+
update: (t, n, r, i) => k.sendWorkflowUpdate({
|
|
725
725
|
store: e.store,
|
|
726
|
-
recorder:
|
|
726
|
+
recorder: A,
|
|
727
727
|
target: t,
|
|
728
728
|
updateName: n,
|
|
729
729
|
payload: r,
|
|
730
730
|
...i === void 0 ? {} : { options: i }
|
|
731
731
|
}),
|
|
732
732
|
listRuns: (t) => b(e.store, t),
|
|
733
|
-
retry: (t, n) =>
|
|
733
|
+
retry: (t, n) => ke({
|
|
734
734
|
store: e.store,
|
|
735
735
|
workflows: e.discovered.workflows ?? [],
|
|
736
736
|
runPromise: (e) => a.runPromise(e)
|
|
737
737
|
}, t, n)
|
|
738
738
|
}) : void 0;
|
|
739
739
|
}
|
|
740
|
-
let
|
|
741
|
-
...
|
|
742
|
-
...
|
|
743
|
-
...
|
|
744
|
-
...
|
|
745
|
-
}),
|
|
746
|
-
group:
|
|
747
|
-
handlersLayer:
|
|
748
|
-
httpHandlersLayer:
|
|
740
|
+
let Re = M.mergeAll(Oe.toLayer(T), Ae, je), Be = ee(T, e.discovered.queries.map((e) => e.descriptor.name), f), Ue = M.mergeAll(Oe.toLayer(Be), Ae, je), L = e.observability, Je = await Ke({
|
|
741
|
+
...L && L.spanProcessors.length > 0 ? { extraSpanProcessors: L.spanProcessors } : {},
|
|
742
|
+
...L && L.metricReaders.length > 0 ? { extraMetricReaders: L.metricReaders } : {},
|
|
743
|
+
...L && Object.keys(L.resourceAttributes).length > 0 ? { resourceAttributes: L.resourceAttributes } : {},
|
|
744
|
+
...L && L.sampler !== void 0 ? { sampler: L.sampler } : {}
|
|
745
|
+
}), Ye = !1, Xe = e.store.ping ? () => e.store.ping().then(() => !0).catch(() => !1) : void 0, { server: Ze, shutdown: tt } = Et({
|
|
746
|
+
group: Oe,
|
|
747
|
+
handlersLayer: Re,
|
|
748
|
+
httpHandlersLayer: Ue,
|
|
749
749
|
port: e.port ?? 4e3,
|
|
750
|
+
...e.host === void 0 ? {} : { host: e.host },
|
|
750
751
|
path: e.path ?? "/ws",
|
|
751
|
-
tracerLayer:
|
|
752
|
+
tracerLayer: Je.layer,
|
|
752
753
|
healthCheck: {
|
|
753
|
-
isReady: () =>
|
|
754
|
-
...
|
|
754
|
+
isReady: () => Ye,
|
|
755
|
+
...Xe ? { ping: Xe } : {}
|
|
755
756
|
},
|
|
756
757
|
...Ee.length > 0 ? { httpRoutes: Ee } : {},
|
|
757
758
|
...e.getStore === void 0 ? {} : { getStore: e.getStore },
|
|
758
759
|
...oe.size > 0 ? { webhookRoutes: oe } : {},
|
|
759
760
|
...e.inspectRoute === void 0 ? {} : { inspectRoute: e.inspectRoute }
|
|
760
761
|
});
|
|
761
|
-
if (await
|
|
762
|
-
let t = (e.scheduleCoordination ?? "single") === "advisoryLock" ?
|
|
763
|
-
o = await
|
|
762
|
+
if (await We(Ze), (e.discovered.schedules?.length ?? 0) > 0) {
|
|
763
|
+
let t = (e.scheduleCoordination ?? "single") === "advisoryLock" ? et(e.store, e.scheduleReplicaId ?? `pid-${process.pid}`) : Tt;
|
|
764
|
+
o = await Dt(e.discovered.schedules ?? [], {
|
|
764
765
|
store: e.store,
|
|
765
766
|
coordinator: t,
|
|
766
767
|
defaultTrigger: e.scheduleDefaultTrigger ?? "self",
|
|
@@ -788,10 +789,10 @@ var hn = "VoltroBootRefusal", gn = (e) => {
|
|
|
788
789
|
...e.onScheduleRunEvent === void 0 ? {} : { onRunEvent: e.onScheduleRunEvent }
|
|
789
790
|
}), e.onSchedulerReady?.(o);
|
|
790
791
|
}
|
|
791
|
-
let
|
|
792
|
-
if ((e.discovered.subscribers?.length ?? 0) > 0 && (
|
|
793
|
-
let t =
|
|
794
|
-
|
|
792
|
+
let nt = e.log ?? N({ scope: "voltro:serve" }), rt, it;
|
|
793
|
+
if ((e.discovered.subscribers?.length ?? 0) > 0 && (rt = de(e.discovered.subscribers ?? [], e.store, nt.child("subscribe"), e.schemaRegistry)), (e.discovered.reactions?.length ?? 0) > 0) {
|
|
794
|
+
let t = nt.child("reaction");
|
|
795
|
+
it = ve(e.discovered.reactions ?? [], e.store, {
|
|
795
796
|
runAct: async (n, r) => {
|
|
796
797
|
if (n.kind === "workflow") {
|
|
797
798
|
if (d === void 0) {
|
|
@@ -799,7 +800,7 @@ var hn = "VoltroBootRefusal", gn = (e) => {
|
|
|
799
800
|
return;
|
|
800
801
|
}
|
|
801
802
|
let e = r.new ?? r.old ?? {};
|
|
802
|
-
await
|
|
803
|
+
await ht(d, {
|
|
803
804
|
traceId: `reaction:${n.workflow}`,
|
|
804
805
|
source: `reaction:${n.workflow}`
|
|
805
806
|
}).start(n.workflow, e);
|
|
@@ -808,7 +809,7 @@ var hn = "VoltroBootRefusal", gn = (e) => {
|
|
|
808
809
|
await _(n.agent, r, {
|
|
809
810
|
findAgentSend: (t) => e.discovered.actions.find((e) => e.descriptor.name === `${t}.send`),
|
|
810
811
|
runAction: (e, t, n) => Promise.resolve(ge(e, t, n)),
|
|
811
|
-
makeSubject: (e) =>
|
|
812
|
+
makeSubject: (e) => Rt(e),
|
|
812
813
|
now: () => Date.now(),
|
|
813
814
|
log: t
|
|
814
815
|
});
|
|
@@ -816,7 +817,7 @@ var hn = "VoltroBootRefusal", gn = (e) => {
|
|
|
816
817
|
checkBudget: async (n, r) => {
|
|
817
818
|
try {
|
|
818
819
|
let { requireAiBudget: t } = await import("@voltro/ai");
|
|
819
|
-
return (await
|
|
820
|
+
return (await j.runPromise(j.either(t(e.store, {
|
|
820
821
|
tenantId: n,
|
|
821
822
|
limitUsd: r
|
|
822
823
|
}))))._tag === "Right";
|
|
@@ -826,28 +827,28 @@ var hn = "VoltroBootRefusal", gn = (e) => {
|
|
|
826
827
|
}
|
|
827
828
|
}, t);
|
|
828
829
|
}
|
|
829
|
-
let
|
|
830
|
-
return (e.discovered.aggregates?.length ?? 0) > 0 && (
|
|
830
|
+
let at;
|
|
831
|
+
return (e.discovered.aggregates?.length ?? 0) > 0 && (at = await ne({
|
|
831
832
|
discovered: e.discovered.aggregates ?? [],
|
|
832
833
|
store: e.store,
|
|
833
|
-
log:
|
|
834
|
+
log: nt.child("aggregate"),
|
|
834
835
|
...e.analytics === void 0 ? {} : { analytics: e.analytics },
|
|
835
836
|
...e.aggregateStorage === void 0 ? {} : { storage: e.aggregateStorage },
|
|
836
837
|
...e.aggregateCoordinator === void 0 ? {} : { coordinator: e.aggregateCoordinator }
|
|
837
|
-
}), ue =
|
|
838
|
+
}), ue = M.succeed(P, at.registry)), Ye = !0, e.bootTiming?.mark("ready"), {
|
|
838
839
|
dispatcher: t,
|
|
839
|
-
server:
|
|
840
|
+
server: Ze,
|
|
840
841
|
scheduler: o,
|
|
841
842
|
close: async () => {
|
|
842
|
-
|
|
843
|
+
Ye = !1, at?.detach(), it?.(), rt?.(), await o?.shutdown(), t.close(), await a?.dispose(), await new Promise((e) => Ze.close(() => e())), await tt();
|
|
843
844
|
}
|
|
844
845
|
};
|
|
845
|
-
}, $ =
|
|
846
|
-
let t =
|
|
847
|
-
if (
|
|
846
|
+
}, $ = N({ scope: "voltro:serve" }), Pn = (e, t, n) => (e === "production" || e === "staging") && t !== "memory" && n !== "0", Fn = Ne, In = async (e) => {
|
|
847
|
+
let t = O(process.cwd());
|
|
848
|
+
if (Re(t)) {
|
|
848
849
|
let n;
|
|
849
850
|
try {
|
|
850
|
-
let e = await import(
|
|
851
|
+
let e = await import(Fe(t).href);
|
|
851
852
|
typeof e.runServe == "function" ? n = e.runServe : $.warn("serve bundle has no runServe export — using the standard serve path");
|
|
852
853
|
} catch (e) {
|
|
853
854
|
$.warn("serve bundle failed to load — using the standard serve path", {}, e);
|
|
@@ -856,7 +857,7 @@ var hn = "VoltroBootRefusal", gn = (e) => {
|
|
|
856
857
|
}
|
|
857
858
|
return Ln(e);
|
|
858
859
|
}, Ln = async (ee) => {
|
|
859
|
-
let p =
|
|
860
|
+
let p = A();
|
|
860
861
|
process.env.NODE_ENV || (process.env.NODE_ENV = "production");
|
|
861
862
|
try {
|
|
862
863
|
qt();
|
|
@@ -864,58 +865,58 @@ var hn = "VoltroBootRefusal", gn = (e) => {
|
|
|
864
865
|
throw gn(e instanceof Error ? e.message : String(e));
|
|
865
866
|
}
|
|
866
867
|
let m = process.cwd(), ne = Number(process.env.PORT ?? Fn(ee, "--port") ?? 4e3), g = await he(m);
|
|
867
|
-
|
|
868
|
+
St(bt(g?.secrets)), await e({
|
|
868
869
|
rawEnv: g?.env,
|
|
869
870
|
appType: "api",
|
|
870
871
|
root: m,
|
|
871
872
|
log: $,
|
|
872
873
|
generateTypes: !1
|
|
873
874
|
}), p.mark("config");
|
|
874
|
-
let _ = (process.env.DB_DIALECT ?? g?.store ?? "memory").toLowerCase(), ce = (_ === "mariadb" || _ === "postgres" || _ === "mssql") && (process.env.CDC ?? "1") !== "0", le = _ === "mariadb" ? "mariadb" : _ === "mssql" ? "mssql" : void 0, de =
|
|
875
|
-
if (!i() &&
|
|
876
|
-
let e = await import(
|
|
875
|
+
let _ = (process.env.DB_DIALECT ?? g?.store ?? "memory").toLowerCase(), ce = (_ === "mariadb" || _ === "postgres" || _ === "mssql") && (process.env.CDC ?? "1") !== "0", le = _ === "mariadb" ? "mariadb" : _ === "mssql" ? "mssql" : void 0, de = k(m);
|
|
876
|
+
if (!i() && Re(de)) try {
|
|
877
|
+
let e = await import(Fe(de).href);
|
|
877
878
|
if (e.modules) {
|
|
878
879
|
let t = {};
|
|
879
|
-
for (let [n, r] of Object.entries(e.modules)) t[
|
|
880
|
+
for (let [n, r] of Object.entries(e.modules)) t[Pe(m, n)] = r;
|
|
880
881
|
r(t), $.info("precompiled api bundle loaded", { modules: Object.keys(t).length });
|
|
881
882
|
}
|
|
882
883
|
} catch (e) {
|
|
883
884
|
$.warn("precompiled api bundle failed to load — falling back to source", {}, e);
|
|
884
885
|
}
|
|
885
|
-
let b = await C(m), S = await
|
|
886
|
+
let b = await C(m), S = await De(b, { cdc: ce && le !== void 0 });
|
|
886
887
|
{
|
|
887
|
-
let e = h(S.serverOnlyLeaks, re(process.env, "strict"),
|
|
888
|
+
let e = h(S.serverOnlyLeaks, re(process.env, "strict"), Xe, "`voltro serve`");
|
|
888
889
|
if (e.action === "fail") throw gn(e.message ?? "");
|
|
889
890
|
e.action === "warn" && $.warn(e.message ?? "");
|
|
890
891
|
}
|
|
891
|
-
let ve = b.filter((e) =>
|
|
892
|
+
let ve = b.filter((e) => Ae.test(e)), w = ve.length > 0 ? await ue(ve, $.child("webhooks")) : void 0, we = s({
|
|
892
893
|
mix: S.featureMix,
|
|
893
894
|
plugins: g?.plugins ?? [],
|
|
894
895
|
cdc: ce && le !== void 0,
|
|
895
896
|
...le ? { cdcDialect: le } : {}
|
|
896
|
-
}),
|
|
897
|
+
}), ke = g?.analytics !== void 0 && g.analytics.kind !== "noop" && _ !== "memory" ? (await n(_)).makeSqlLayer(T()) : void 0, D = await ie({
|
|
897
898
|
spec: g?.analytics,
|
|
898
|
-
sqlLayer:
|
|
899
|
+
sqlLayer: ke,
|
|
899
900
|
log: $
|
|
900
|
-
}),
|
|
901
|
+
}), O = (() => {
|
|
901
902
|
let e = new Set(S.tables.map((e) => e.tableName)), t = [...S.tables];
|
|
902
|
-
for (let n of [...we, ...
|
|
903
|
+
for (let n of [...we, ...D.tables]) e.has(n.tableName) || (e.add(n.tableName), t.push(n));
|
|
903
904
|
return t;
|
|
904
905
|
})();
|
|
905
|
-
for (let e of
|
|
906
|
-
let
|
|
907
|
-
if (Pn(
|
|
908
|
-
let e = (await n(_)).makeSqlLayer(T()), t = await
|
|
909
|
-
appliedBy: `serve:${
|
|
906
|
+
for (let e of O) Mt(e);
|
|
907
|
+
let Ne = (process.env.NODE_ENV ?? "").toLowerCase();
|
|
908
|
+
if (Pn(Ne, _, process.env.VOLTRO_AUTO_MIGRATE)) {
|
|
909
|
+
let e = (await n(_)).makeSqlLayer(T()), t = await j.runPromise(At.SqlClient.pipe(j.flatMap((e) => Qt(e, O, {
|
|
910
|
+
appliedBy: `serve:${Ne}`,
|
|
910
911
|
environment: "prod",
|
|
911
912
|
dialectId: _
|
|
912
|
-
})),
|
|
913
|
+
})), j.provide(e)));
|
|
913
914
|
t.kind === "prod-mismatch" && ($.error(Zt(t, _)), $.error("serve: refusing to boot — apply the schema first (voltro db apply in a pre-deploy step), or set VOLTRO_AUTO_MIGRATE=0 to bypass this check."), process.exit(1)), $.info(Zt(t, _));
|
|
914
915
|
}
|
|
915
|
-
let
|
|
916
|
+
let N = pt(O);
|
|
916
917
|
p.mark("discover");
|
|
917
|
-
let
|
|
918
|
-
for (let e of
|
|
918
|
+
let P = await x(g, void 0), ze = Ot(P, _);
|
|
919
|
+
for (let e of E({
|
|
919
920
|
dialect: String(g?.store ?? process.env.DB_DIALECT ?? "postgres"),
|
|
920
921
|
changeStrategy: (process.env.CDC ?? "1") === "0" ? "inline" : "cdc",
|
|
921
922
|
dbUrl: process.env.DB_URL,
|
|
@@ -929,101 +930,101 @@ var hn = "VoltroBootRefusal", gn = (e) => {
|
|
|
929
930
|
})
|
|
930
931
|
})) e.level === "warn" ? $.warn(e.message) : $.info(e.message);
|
|
931
932
|
g?.cache && !process.env.CACHE_BACKEND && (process.env.CACHE_BACKEND = g.cache), g?.cacheRedisUrl && !process.env.CACHE_REDIS_URL && (process.env.CACHE_REDIS_URL = g.cacheRedisUrl), g?.cacheRedisDriver && !process.env.CACHE_REDIS_DRIVER && (process.env.CACHE_REDIS_DRIVER = g.cacheRedisDriver), g?.cacheKeyPrefix && !process.env.CACHE_KEY_PREFIX && (process.env.CACHE_KEY_PREFIX = g.cacheKeyPrefix);
|
|
932
|
-
let { service:
|
|
933
|
-
$.info(`cache backend resolved: ${
|
|
934
|
-
|
|
933
|
+
let { service: Ve, invalidationBus: He, snapshotCache: We, cache: F, backend: Ge, dispose: I } = await xe({ env: process.env });
|
|
934
|
+
$.info(`cache backend resolved: ${Ge}` + (Ge === "redis" ? ` (driver ${process.env.CACHE_REDIS_DRIVER ?? "resp"})` : " — in-process, not cross-instance")), P.onChange((e) => {
|
|
935
|
+
j.runFork(He.publish(e.table));
|
|
935
936
|
}), g?.kv && !process.env.KV_BACKEND && (process.env.KV_BACKEND = g.kv), g?.kvRedisUrl && !process.env.KV_REDIS_URL && (process.env.KV_REDIS_URL = g.kvRedisUrl), g?.kvKeyPrefix && !process.env.KV_KEY_PREFIX && (process.env.KV_KEY_PREFIX = g.kvKeyPrefix);
|
|
936
|
-
let { kv:
|
|
937
|
+
let { kv: Ke, service: qe } = await it({ store: P });
|
|
937
938
|
p.mark("store");
|
|
938
|
-
let
|
|
939
|
-
store:
|
|
940
|
-
sink:
|
|
939
|
+
let Qe = Ue({
|
|
940
|
+
store: P,
|
|
941
|
+
sink: D.sink,
|
|
941
942
|
log: $
|
|
942
|
-
}),
|
|
943
|
-
store:
|
|
943
|
+
}), $e = pe({
|
|
944
|
+
store: P,
|
|
944
945
|
dialect: _
|
|
945
|
-
}),
|
|
946
|
-
_ !== "memory" && (
|
|
947
|
-
let
|
|
946
|
+
}), R = g?.plugins ?? [], ot = process.env.POD_NAME ?? process.env.HOSTNAME ?? `serve-${process.pid}`, st, ct;
|
|
947
|
+
_ !== "memory" && (st = Le.make((await n(_)).makeSqlLayer(T())), ct = await st.runPromise(At.SqlClient));
|
|
948
|
+
let lt = at({
|
|
948
949
|
coordinator: [
|
|
949
950
|
"postgres",
|
|
950
951
|
"mariadb",
|
|
951
952
|
"mysql",
|
|
952
953
|
"mssql"
|
|
953
|
-
].includes(_) ?
|
|
954
|
-
replicaId:
|
|
954
|
+
].includes(_) ? et(P, ot, $) : Tt,
|
|
955
|
+
replicaId: ot,
|
|
955
956
|
log: $
|
|
956
|
-
}),
|
|
957
|
-
...
|
|
957
|
+
}), ut = [], dt = {
|
|
958
|
+
...ct ? { sql: ct } : {},
|
|
958
959
|
scheduleCoordinated: (e, t, n) => {
|
|
959
|
-
let r =
|
|
960
|
-
return
|
|
960
|
+
let r = lt(e, t, n);
|
|
961
|
+
return ut.push(r), r;
|
|
961
962
|
}
|
|
962
963
|
};
|
|
963
|
-
for (let e of
|
|
964
|
-
let
|
|
965
|
-
if (
|
|
966
|
-
let e =
|
|
967
|
-
|
|
964
|
+
for (let e of R) e.bindDataStore?.(P, dt);
|
|
965
|
+
let ft = R.filter((e) => typeof e.onChangeEvent == "function");
|
|
966
|
+
if (ft.length > 0) {
|
|
967
|
+
let e = P.changeScope ?? "local";
|
|
968
|
+
P.onChange((t) => {
|
|
968
969
|
let n = y(t, e);
|
|
969
|
-
for (let e of
|
|
970
|
+
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
971
|
});
|
|
971
972
|
}
|
|
972
|
-
let
|
|
973
|
-
plugins:
|
|
973
|
+
let mt = me({
|
|
974
|
+
plugins: R,
|
|
974
975
|
appName: g?.name ?? "voltro-api",
|
|
975
976
|
appType: "api",
|
|
976
977
|
voltroVersion: process.env.npm_package_version ?? "0.0.0",
|
|
977
978
|
log: $
|
|
978
979
|
});
|
|
979
|
-
|
|
980
|
-
let
|
|
980
|
+
R.length && await mt.activate(), p.mark("plugins");
|
|
981
|
+
let ht = await mt.gatherObservability(), gt = await _e(P, g, _, {
|
|
981
982
|
info: (e, t) => process.stdout.write(`[broadcast] ${e} ${t ? JSON.stringify(t) : ""}\n`),
|
|
982
983
|
warn: (e, t) => process.stderr.write(`[broadcast] ${e} ${t ? JSON.stringify(t) : ""}\n`),
|
|
983
984
|
debug: () => {}
|
|
984
|
-
}),
|
|
985
|
-
|
|
986
|
-
let
|
|
987
|
-
prefix:
|
|
988
|
-
...
|
|
989
|
-
}) : void 0,
|
|
990
|
-
store:
|
|
991
|
-
header: (typeof
|
|
992
|
-
ttlMs: (typeof
|
|
993
|
-
} : void 0,
|
|
994
|
-
store:
|
|
995
|
-
resolveSubject: (e) =>
|
|
985
|
+
}), z = g?.apiKeys, vt = (typeof z == "object" ? z.prefix : void 0) ?? "voltro_", yt = z ? Je(P) : void 0, xt = yt ? nt({ flush: rt(yt) }) : void 0;
|
|
986
|
+
xt && _t(() => xt.shutdown());
|
|
987
|
+
let Ct = yt ? tt(yt, {
|
|
988
|
+
prefix: vt,
|
|
989
|
+
...xt ? { usage: xt } : {}
|
|
990
|
+
}) : void 0, wt = Ct ? [Ze(Ct, { prefix: vt })] : [], Et = Ce([...g?.auth?.strategies ?? [], ...wt], $t(g?.plugins ?? []), g?.auth?.anonymousTenantRequired ?? !1, g?.auth?.resolveScopes, () => ze), Dt = [...g?.restRoutes ?? [], ...Ct ? Be(Ct, (typeof z == "object" ? z.managementPath : void 0) ?? "/v1/api-keys") : []], B = g?.idempotency, kt = B ? {
|
|
991
|
+
store: Ye(P),
|
|
992
|
+
header: (typeof B == "object" ? B.header : void 0) ?? "Idempotency-Key",
|
|
993
|
+
ttlMs: (typeof B == "object" ? B.ttlMs : void 0) ?? 864e5
|
|
994
|
+
} : void 0, jt = Dt.length > 0 ? tn(Dt, {
|
|
995
|
+
store: P,
|
|
996
|
+
resolveSubject: (e) => Et({
|
|
996
997
|
headers: e,
|
|
997
998
|
clientId: -1
|
|
998
999
|
}),
|
|
999
|
-
...
|
|
1000
|
-
}) : [],
|
|
1001
|
-
analyticsLayer:
|
|
1002
|
-
cacheService:
|
|
1003
|
-
kvService:
|
|
1004
|
-
pluginServices:
|
|
1000
|
+
...kt ? { idempotency: kt } : {}
|
|
1001
|
+
}) : [], V = R.map((e) => e.services).filter((e) => e !== void 0), Nt = M.mergeAll(Ee({
|
|
1002
|
+
analyticsLayer: D.layer,
|
|
1003
|
+
cacheService: Ve,
|
|
1004
|
+
kvService: qe,
|
|
1005
|
+
pluginServices: V,
|
|
1005
1006
|
userLayers: g?.layers ?? []
|
|
1006
|
-
}), ge(g?.http ?? {})),
|
|
1007
|
+
}), ge(g?.http ?? {})), H = g?.scheduling ?? {}, Pt = H.trigger ?? "self", Ft = /* @__PURE__ */ new Set([
|
|
1007
1008
|
"postgres",
|
|
1008
1009
|
"mysql",
|
|
1009
1010
|
"mariadb",
|
|
1010
1011
|
"mssql"
|
|
1011
|
-
]),
|
|
1012
|
-
|
|
1013
|
-
let
|
|
1014
|
-
if (
|
|
1012
|
+
]), It = H.coordination ?? (Ft.has(_) ? "advisoryLock" : "single"), U = It === "cluster" && Ft.has(_), Lt = U ? "cluster" : It === "advisoryLock" && Ft.has(_) ? "advisoryLock" : "single";
|
|
1013
|
+
It === "cluster" && !U && $.warn("scheduling.coordination=cluster needs a sql-backed store except sqlite — falling back to single"), It === "advisoryLock" && !Ft.has(_) && $.warn("scheduling.coordination=advisoryLock needs a SQL store (the claim-row gate) — falling back to single");
|
|
1014
|
+
let W, G = S.workflows.length > 0 || S.workflowWorkers.length > 0 || S.eventTriggers.length > 0 || (w?.outgoing.length ?? 0) > 0 || U, Rt;
|
|
1015
|
+
if (G) {
|
|
1015
1016
|
if (_ === "mssql") {
|
|
1016
1017
|
let e = await fe(process.cwd());
|
|
1017
1018
|
e && $.warn(e);
|
|
1018
1019
|
}
|
|
1019
|
-
let [{ WorkflowEngine: e }, { makeClusterCronLayer: t, workflowEngineLayer: r, resolveRunnerStorage: i }] = await Promise.all([import("@effect/workflow"), import("@voltro/workflow/cluster")]), a =
|
|
1020
|
+
let [{ WorkflowEngine: e }, { makeClusterCronLayer: t, workflowEngineLayer: r, resolveRunnerStorage: i }] = await Promise.all([import("@effect/workflow"), import("@voltro/workflow/cluster")]), a = U ? S.schedules.filter((e) => (e.trigger ?? Pt) === "self").map((e) => t({
|
|
1020
1021
|
name: e.name,
|
|
1021
|
-
cron:
|
|
1022
|
+
cron: L(e),
|
|
1022
1023
|
execute: async () => {
|
|
1023
|
-
await
|
|
1024
|
+
await W?.fireFromCluster(e.name);
|
|
1024
1025
|
}
|
|
1025
1026
|
})) : [];
|
|
1026
|
-
|
|
1027
|
+
Rt = _ === "memory" ? e.layerMemory : await (async () => {
|
|
1027
1028
|
let e = await n(_), t = i({ sqliteFamily: e.id === "sqlite" || e.id === "turso" });
|
|
1028
1029
|
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
1030
|
sqlClientLayer: e.makeSqlLayer(T()),
|
|
@@ -1034,13 +1035,13 @@ var hn = "VoltroBootRefusal", gn = (e) => {
|
|
|
1034
1035
|
});
|
|
1035
1036
|
})();
|
|
1036
1037
|
}
|
|
1037
|
-
let
|
|
1038
|
+
let zt = je(R, t()), Bt = b.filter((e) => /\.subscribe\.tsx?$/.test(e)), K = Bt.length > 0 ? await ae(Bt, $) : [], Vt = b.filter((e) => /\.reaction\.tsx?$/.test(e)), Ht = Vt.length > 0 ? await se(Vt, $) : [], q = b.filter((e) => u.test(e)), Ut = q.length > 0 ? await Me(q, $) : [], J = b.filter((e) => /\.aggregate\.tsx?$/.test(e)), Y = J.length > 0 ? await v(J, $) : [], X = ye();
|
|
1038
1039
|
if (Y.length > 0 && _ !== "memory") try {
|
|
1039
1040
|
X = f((await n(_)).makeSqlLayer(T()));
|
|
1040
1041
|
} catch (e) {
|
|
1041
1042
|
$.warn("aggregate: SQL storage init failed — falling back to in-process", { err: String(e) });
|
|
1042
1043
|
}
|
|
1043
|
-
let Wt = _ === "memory" ?
|
|
1044
|
+
let Wt = _ === "memory" ? Tt : et(P, `aggregate@${process.pid}`, $), Z = [], Gt = [], Kt = b.filter((e) => l.test(e));
|
|
1044
1045
|
if (Kt.length > 0) {
|
|
1045
1046
|
let e = $.child("agent"), t = b.filter((e) => a.test(e));
|
|
1046
1047
|
t.length > 0 && await o(t, e);
|
|
@@ -1064,59 +1065,59 @@ var hn = "VoltroBootRefusal", gn = (e) => {
|
|
|
1064
1065
|
workflowWorkers: S.workflowWorkers,
|
|
1065
1066
|
eventTriggers: S.eventTriggers,
|
|
1066
1067
|
schedules: S.schedules,
|
|
1067
|
-
subscribers:
|
|
1068
|
-
outboxHandlers:
|
|
1068
|
+
subscribers: K,
|
|
1069
|
+
outboxHandlers: Ut,
|
|
1069
1070
|
connections: S.connections,
|
|
1070
|
-
reactions:
|
|
1071
|
+
reactions: Ht,
|
|
1071
1072
|
aggregates: Y,
|
|
1072
1073
|
...w === void 0 ? {} : { webhooks: w }
|
|
1073
1074
|
},
|
|
1074
1075
|
log: $,
|
|
1075
|
-
analytics:
|
|
1076
|
+
analytics: D.sink,
|
|
1076
1077
|
aggregateStorage: X,
|
|
1077
1078
|
aggregateCoordinator: Wt,
|
|
1078
|
-
store:
|
|
1079
|
-
kv:
|
|
1080
|
-
cache:
|
|
1081
|
-
snapshotCache:
|
|
1082
|
-
schemaRegistry:
|
|
1079
|
+
store: P,
|
|
1080
|
+
kv: Ke,
|
|
1081
|
+
cache: F,
|
|
1082
|
+
snapshotCache: We,
|
|
1083
|
+
schemaRegistry: N,
|
|
1083
1084
|
tenantScopedTables: S.tenantScopedTables,
|
|
1084
1085
|
softDeleteScopedTables: S.softDeleteScopedTables,
|
|
1085
|
-
dataTransferSnapshot: Xt(
|
|
1086
|
+
dataTransferSnapshot: Xt(O),
|
|
1086
1087
|
dataTransferDialect: _,
|
|
1087
1088
|
tenantIsolation: (process.env.VOLTRO_TENANT_ISOLATION ?? g?.tenancy?.isolation) === "namespace" ? "namespace" : "shared-schema",
|
|
1088
|
-
resolveSubject: (e, t) =>
|
|
1089
|
+
resolveSubject: (e, t) => Et({
|
|
1089
1090
|
headers: e,
|
|
1090
1091
|
clientId: t
|
|
1091
1092
|
}),
|
|
1092
|
-
httpRoutes: [...
|
|
1093
|
-
getStore: () =>
|
|
1094
|
-
...
|
|
1095
|
-
...
|
|
1096
|
-
scheduleDefaultTrigger:
|
|
1097
|
-
scheduleCoordination:
|
|
1098
|
-
scheduleArmSelf: !
|
|
1093
|
+
httpRoutes: [...R.flatMap((e) => e.httpRoutes ?? []), ...jt],
|
|
1094
|
+
getStore: () => ze,
|
|
1095
|
+
...Nt ? { baseLayer: Nt } : {},
|
|
1096
|
+
...Rt === void 0 ? {} : { workflowEngineLayer: Rt },
|
|
1097
|
+
scheduleDefaultTrigger: Pt,
|
|
1098
|
+
scheduleCoordination: Lt,
|
|
1099
|
+
scheduleArmSelf: !U,
|
|
1099
1100
|
dormancy: process.env.VOLTRO_DORMANCY === "sleep" || process.env.VOLTRO_DORMANCY === "always-on" ? process.env.VOLTRO_DORMANCY : g?.dormancy ?? "always-on",
|
|
1100
1101
|
scheduleReplicaId: process.env.HOSTNAME ?? `pid-${process.pid}`,
|
|
1101
|
-
...
|
|
1102
|
+
...zt === void 0 ? {} : { scheduleFireInterceptor: zt },
|
|
1102
1103
|
onSchedulerReady: (e) => {
|
|
1103
|
-
|
|
1104
|
+
W = e;
|
|
1104
1105
|
},
|
|
1105
1106
|
inspectRoute: { handle: (e, t, n, r) => d(e, {
|
|
1106
1107
|
kind: "api",
|
|
1107
1108
|
meta: {
|
|
1108
1109
|
name: g?.name ?? "voltro-api",
|
|
1109
|
-
voltroVersion:
|
|
1110
|
+
voltroVersion: Te,
|
|
1110
1111
|
port: ne,
|
|
1111
1112
|
mode: "start",
|
|
1112
1113
|
store: _,
|
|
1113
1114
|
cdc: ce ? "on" : "off"
|
|
1114
1115
|
},
|
|
1115
1116
|
rpc: be(S, m),
|
|
1116
|
-
workflows:
|
|
1117
|
+
workflows: Oe(S, m),
|
|
1117
1118
|
inspectFireSchedule: async ({ name: e, trigger: t }) => {
|
|
1118
|
-
if (!
|
|
1119
|
-
return { runId: await
|
|
1119
|
+
if (!W) throw Error("scheduler not started — this app registers no self-triggered schedules (all schedules are trigger:'external', or there are none).");
|
|
1120
|
+
return { runId: await W.fireNow(e, t) ?? null };
|
|
1120
1121
|
}
|
|
1121
1122
|
}, t, {
|
|
1122
1123
|
method: n,
|
|
@@ -1126,7 +1127,7 @@ var hn = "VoltroBootRefusal", gn = (e) => {
|
|
|
1126
1127
|
contentType: "application/json",
|
|
1127
1128
|
body: JSON.stringify({ error: "not an inspect route" })
|
|
1128
1129
|
} },
|
|
1129
|
-
observability:
|
|
1130
|
+
observability: ht,
|
|
1130
1131
|
port: ne,
|
|
1131
1132
|
...g?.transport?.wsPath ? { path: g.transport.wsPath } : {}
|
|
1132
1133
|
});
|
|
@@ -1146,12 +1147,12 @@ var hn = "VoltroBootRefusal", gn = (e) => {
|
|
|
1146
1147
|
workflows: S.workflows.length,
|
|
1147
1148
|
workflowWorkers: S.workflowWorkers.length,
|
|
1148
1149
|
schedules: S.schedules.length,
|
|
1149
|
-
scheduleCoordination:
|
|
1150
|
-
}), p.finish($),
|
|
1151
|
-
for (let e of
|
|
1152
|
-
|
|
1150
|
+
scheduleCoordination: Lt
|
|
1151
|
+
}), p.finish($), _t(async () => {
|
|
1152
|
+
for (let e of ut) e.stop();
|
|
1153
|
+
Qe.detach(), $e.stop(), I(), st?.dispose();
|
|
1153
1154
|
try {
|
|
1154
|
-
await
|
|
1155
|
+
await mt.deactivate(), await gt?.close(), await D.dispose(), await Jt.close(), await P.close?.();
|
|
1155
1156
|
} catch (e) {
|
|
1156
1157
|
console.error("serve: shutdown step failed, exiting anyway:", e);
|
|
1157
1158
|
}
|