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