@voltro/cli 0.9.0 → 0.11.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.
Files changed (59) hide show
  1. package/CHANGELOG.md +394 -7
  2. package/dist/apiBuild-BCv3bekE.js +2 -0
  3. package/dist/{apiBuild-eInHm_bJ.js → apiBuild-BUbgGz73.js} +8 -8
  4. package/dist/bin.js +2 -2
  5. package/dist/{commands-Cxs97AFp.js → commands-C1qBfIBI.js} +1977 -1599
  6. package/dist/dev-DKASElZP.js +2 -0
  7. package/dist/{dev-63Ehpw2p.js → dev-ITlO-epO.js} +1600 -1512
  8. package/dist/index.js +1 -1
  9. package/dist/{inspectMetrics-DVCKKSPk.js → inspectMetrics-BeMjgt8x.js} +1018 -827
  10. package/dist/inspectState.d.ts +6 -2
  11. package/dist/{serveCommand-Cq7BhtpB.js → serveCommand-mpsE3vLY.js} +407 -420
  12. package/dist/serveEntry.js +3 -3
  13. package/dist/{start-CYe-7ueh.js → start-C_M4fGS2.js} +331 -309
  14. package/dist/startEntry.js +2 -2
  15. package/package.json +17 -17
  16. package/templates/agent-docs/cli.md +45 -17
  17. package/templates/agent-docs/data.md +145 -1
  18. package/templates/agent-docs/database/seedsdialects.md +40 -4
  19. package/templates/agent-docs/routing.md +52 -13
  20. package/templates/agent-docs/scheduling.md +32 -0
  21. package/templates/apps/api-ai/package.json +7 -7
  22. package/templates/apps/api-auth/package.json +8 -8
  23. package/templates/apps/api-backend/package.json +7 -7
  24. package/templates/apps/api-backend-deactivation/package.json +7 -7
  25. package/templates/apps/api-backend-mail/package.json +8 -8
  26. package/templates/apps/api-backend-mariadb/package.json +9 -9
  27. package/templates/apps/api-backend-storage/package.json +8 -8
  28. package/templates/apps/api-data-advanced/package.json +8 -8
  29. package/templates/apps/api-durable/package.json +8 -8
  30. package/templates/apps/api-durable/schedules/nightlyReport.cron.tsx +5 -0
  31. package/templates/apps/api-durable/subscribers/orderChanges.subscribe.ts +8 -2
  32. package/templates/apps/api-feature-flags/package.json +9 -9
  33. package/templates/apps/api-governance/package.json +8 -8
  34. package/templates/apps/api-kv/package.json +8 -8
  35. package/templates/apps/api-moderation/package.json +8 -8
  36. package/templates/apps/api-observability/package.json +8 -8
  37. package/templates/apps/api-ratelimit/package.json +8 -8
  38. package/templates/apps/api-rbac/package.json +8 -8
  39. package/templates/apps/api-rest/package.json +7 -7
  40. package/templates/apps/api-saas/package.json +11 -11
  41. package/templates/apps/api-search/package.json +8 -8
  42. package/templates/apps/api-versioning/package.json +8 -8
  43. package/templates/apps/api-webhooks/package.json +8 -8
  44. package/templates/apps/changelog/package.json +6 -6
  45. package/templates/apps/edge-functions/package.json +2 -2
  46. package/templates/apps/frontend-admin/package.json +8 -8
  47. package/templates/apps/frontend-app/package.json +8 -8
  48. package/templates/apps/frontend-blank/package.json +7 -7
  49. package/templates/apps/frontend-contact/package.json +7 -7
  50. package/templates/apps/frontend-dashboard/package.json +7 -7
  51. package/templates/apps/frontend-docs/package.json +7 -7
  52. package/templates/apps/frontend-i18n/package.json +6 -6
  53. package/templates/apps/frontend-landing/package.json +7 -7
  54. package/templates/apps/frontend-spa/package.json +7 -7
  55. package/templates/apps/frontend-ssr/package.json +7 -7
  56. package/templates/apps/frontend-ssr-api/package.json +8 -8
  57. package/templates/apps/frontend-static-blog/package.json +6 -6
  58. package/dist/apiBuild-Ba4njm9m.js +0 -2
  59. package/dist/dev-CXsR8Zgo.js +0 -2
@@ -6,18 +6,18 @@ import { Cause as d, Effect as f, Layer as p } from "effect";
6
6
  import { LoggerLayer as m, addSink as h, createLogger as g, printReadyBlock as _ } from "@voltro/logger";
7
7
  import { closeSync as v, existsSync as y, mkdirSync as b, openSync as x, promises as S, readFileSync as C, readdirSync as w, statSync as T, unlinkSync as E, unwatchFile as ee, watchFile as D, writeSync as te } from "node:fs";
8
8
  import { currentTraceContext as O, lastWriteProvenance as k, recordSample as A, resolveSecret as j } from "@voltro/runtime";
9
- import { mkdir as M, writeFile as N } from "node:fs/promises";
10
- import { FRAMEWORK_ENV_CATALOG as P, appEnvEntries as F, checkEnvNaming as ne, formatEnvErrors as I, installEnvSnapshot as re, isEnvContract as ie, pluginEnvEntries as ae, renderDotEnvExample as L, resolveEnv as oe } from "@voltro/env";
11
- import { __installPublicEnv as se } from "@voltro/env/public";
12
- import { createHash as ce } from "node:crypto";
13
- import { spawn as le } from "node:child_process";
14
- import { timingSafeStringEqual as ue } from "@voltro/protocol/session";
15
- import { homedir as de } from "node:os";
16
- import { createConnection as fe } from "node:net";
17
- import { createRequire as pe } from "node:module";
18
- import { PassThrough as me } from "node:stream";
9
+ import { mkdir as M, readFile as ne, writeFile as N } from "node:fs/promises";
10
+ import { FRAMEWORK_ENV_CATALOG as re, appEnvEntries as P, checkEnvNaming as ie, formatEnvErrors as F, installEnvSnapshot as ae, isEnvContract as oe, pluginEnvEntries as I, renderDotEnvExample as se, resolveEnv as ce } from "@voltro/env";
11
+ import { __installPublicEnv as le } from "@voltro/env/public";
12
+ import { createHash as ue } from "node:crypto";
13
+ import { spawn as de } from "node:child_process";
14
+ import { timingSafeStringEqual as fe } from "@voltro/protocol/session";
15
+ import { homedir as L } from "node:os";
16
+ import { createConnection as pe } from "node:net";
17
+ import { createRequire as me } from "node:module";
18
+ import { PassThrough as he } from "node:stream";
19
19
  //#region src/cliRuntime.ts
20
- var he = [
20
+ var ge = [
21
21
  "severity",
22
22
  "code",
23
23
  "detail",
@@ -34,14 +34,14 @@ var he = [
34
34
  "file",
35
35
  "line",
36
36
  "routine"
37
- ], ge = (e, t = 0, n = /* @__PURE__ */ new WeakSet()) => {
37
+ ], R = (e, t = 0, n = /* @__PURE__ */ new WeakSet()) => {
38
38
  if (t > 10 || typeof e != "object" || !e || n.has(e)) return null;
39
39
  n.add(e);
40
40
  let r = e, i = r.message;
41
41
  if (typeof i == "string" && i.length > 0 && i !== "Failed to execute statement") {
42
42
  let e = { message: i };
43
43
  typeof r.stack == "string" && (e.stack = r.stack);
44
- for (let t of he) r[t] !== void 0 && (e[t] = r[t]);
44
+ for (let t of ge) r[t] !== void 0 && (e[t] = r[t]);
45
45
  return e;
46
46
  }
47
47
  for (let e of [
@@ -54,12 +54,12 @@ var he = [
54
54
  ]) {
55
55
  let i = r[e];
56
56
  if (i !== void 0) {
57
- let e = ge(i, t + 1, n);
57
+ let e = R(i, t + 1, n);
58
58
  if (e) return e;
59
59
  }
60
60
  }
61
61
  if (Array.isArray(r.failures)) for (let e of r.failures) {
62
- let r = ge(e, t + 1, n);
62
+ let r = R(e, t + 1, n);
63
63
  if (r) return r;
64
64
  }
65
65
  return null;
@@ -83,7 +83,7 @@ var he = [
83
83
  }
84
84
  let n = null;
85
85
  for (let e of t) {
86
- let t = ge(e);
86
+ let t = R(e);
87
87
  if (t) {
88
88
  n = t;
89
89
  break;
@@ -106,10 +106,10 @@ var he = [
106
106
  }, ye = (e, t = {}) => {
107
107
  let n = e.pipe(f.provide(_e(t)));
108
108
  u.runMain(n, { disableErrorReporting: !1 });
109
- }, be = t(o(import.meta.url)), R = [a(be, "..", "templates"), a(be, "..", "..", "templates")], xe = (e) => ({
109
+ }, z = t(o(import.meta.url)), be = [a(z, "..", "templates"), a(z, "..", "..", "templates")], xe = (e) => ({
110
110
  _tag: "TemplateNotFoundError",
111
111
  searched: e
112
- }), Se = ["AGENTS.md", "CLAUDE.md"], Ce = "voltro:agents-md:keep", we = 2048, Te = "<!-- VOLTRO:INDEX -->", z = (e, t) => e.exists(t).pipe(f.orElseSucceed(() => !1)), B = (e, t) => e.readFileString(t).pipe(f.orElseSucceed(() => "")), Ee = (e, t) => e.readFileString(t).pipe(f.map((e) => {
112
+ }), Se = ["AGENTS.md", "CLAUDE.md"], Ce = "voltro:agents-md:keep", we = 2048, Te = "<!-- VOLTRO:INDEX -->", B = (e, t) => e.exists(t).pipe(f.orElseSucceed(() => !1)), V = (e, t) => e.readFileString(t).pipe(f.orElseSucceed(() => "")), Ee = (e, t) => e.readFileString(t).pipe(f.map((e) => {
113
113
  try {
114
114
  return JSON.parse(e).workspaces !== void 0;
115
115
  } catch {
@@ -118,7 +118,7 @@ var he = [
118
118
  }), f.orElseSucceed(() => !1)), De = (e) => f.gen(function* () {
119
119
  let n = yield* c.FileSystem, i = a(e);
120
120
  for (;;) {
121
- if ((yield* z(n, r(i, ".git"))) || (yield* z(n, r(i, "pnpm-workspace.yaml"))) || (yield* Ee(n, r(i, "package.json")))) return i;
121
+ if ((yield* B(n, r(i, ".git"))) || (yield* B(n, r(i, "pnpm-workspace.yaml"))) || (yield* Ee(n, r(i, "package.json")))) return i;
122
122
  let o = t(i);
123
123
  if (o === i) return a(e);
124
124
  i = o;
@@ -132,12 +132,12 @@ var he = [
132
132
  }
133
133
  }), ke = (e) => typeof e?.name == "string" && e.name.length > 0 ? e.name.split("#")[0] : null, Ae = (e, t) => f.gen(function* () {
134
134
  let n = r(t, "app.config.ts");
135
- if (!(yield* z(e, n))) return null;
135
+ if (!(yield* B(e, n))) return null;
136
136
  let i = (yield* f.tryPromise(() => import(s(n).href)).pipe(f.orElseSucceed(() => null)))?.default;
137
137
  return !i || i.type && i.type !== "api" ? i?.type === "web" ? [] : null : (i.plugins ?? []).map(ke).filter((e) => e !== null);
138
138
  }), je = (e, t) => f.gen(function* () {
139
139
  let n = [], i = [], a = r(t, "apps");
140
- if (!(yield* z(e, a))) return {
140
+ if (!(yield* B(e, a))) return {
141
141
  apis: n,
142
142
  webs: i
143
143
  };
@@ -145,8 +145,8 @@ var he = [
145
145
  let o = r(a, t);
146
146
  if ((yield* e.stat(o).pipe(f.orElseSucceed(() => null)))?.type === "Directory") for (let t of yield* e.readDirectory(o).pipe(f.orElseSucceed(() => []))) {
147
147
  let a = r(o, t), s = r(a, "app.config.ts");
148
- if (!(yield* z(e, s))) continue;
149
- let c = yield* B(e, s);
148
+ if (!(yield* B(e, s))) continue;
149
+ let c = yield* V(e, s);
150
150
  /type:\s*['"]web['"]/.test(c) ? i.push(a) : n.push(a);
151
151
  }
152
152
  }
@@ -259,9 +259,9 @@ Open the full reference and follow the patterns there:
259
259
  Also read the repo-root \`AGENTS.md\` for the always-true rules (browser/server
260
260
  boundary, naming, anti-patterns) before editing.
261
261
  `, Re = (e, n, r, i) => f.gen(function* () {
262
- let a = yield* z(e, n);
262
+ let a = yield* B(e, n);
263
263
  if (a) {
264
- if ((yield* B(e, n)).slice(0, we).includes("voltro:agents-md:keep")) return {
264
+ if ((yield* V(e, n)).slice(0, we).includes("voltro:agents-md:keep")) return {
265
265
  path: n,
266
266
  action: "protected"
267
267
  };
@@ -276,23 +276,23 @@ boundary, naming, anti-patterns) before editing.
276
276
  };
277
277
  }), ze = (e, t = {}) => f.gen(function* () {
278
278
  let n = yield* c.FileSystem, i = yield* De(e), o = null;
279
- for (let e of R) if (yield* z(n, r(e, "AGENTS.core.md"))) {
279
+ for (let e of be) if (yield* B(n, r(e, "AGENTS.core.md"))) {
280
280
  o = e;
281
281
  break;
282
282
  }
283
283
  if (o === null) {
284
- for (let e of R) if (yield* z(n, r(e, "AGENTS.md"))) {
285
- let a = yield* B(n, r(e, "AGENTS.md")), o = [];
284
+ for (let e of be) if (yield* B(n, r(e, "AGENTS.md"))) {
285
+ let a = yield* V(n, r(e, "AGENTS.md")), o = [];
286
286
  for (let e of Se) o.push(yield* Re(n, r(i, e), a, t.force ?? !1));
287
287
  return { files: o };
288
288
  }
289
- return yield* f.fail(xe(R.map((e) => r(e, "AGENTS.core.md"))));
289
+ return yield* f.fail(xe(be.map((e) => r(e, "AGENTS.core.md"))));
290
290
  }
291
- let s = yield* B(n, r(o, "AGENTS.core.md")), l = yield* B(n, r(o, "agent-docs", "_manifest.json")), u = l ? JSON.parse(l) : {
291
+ let s = yield* V(n, r(o, "AGENTS.core.md")), l = yield* V(n, r(o, "agent-docs", "_manifest.json")), u = l ? JSON.parse(l) : {
292
292
  modules: [],
293
293
  plugins: []
294
- }, d = (t.preferPointer ?? !1) || (yield* z(n, r(i, "node_modules/@voltro/cli/templates/agent-docs", "_manifest.json"))), p = d ? "node_modules/@voltro/cli/templates/" : "", m = t.force ?? !1, h = Se.map((e) => r(i, e));
295
- if ((yield* f.forEach(h, (e) => B(n, e).pipe(f.map((e) => e.slice(0, we))))).every((e) => e.includes("voltro:agents-md:keep"))) return { files: h.map((e) => ({
294
+ }, d = (t.preferPointer ?? !1) || (yield* B(n, r(i, "node_modules/@voltro/cli/templates/agent-docs", "_manifest.json"))), p = d ? "node_modules/@voltro/cli/templates/" : "", m = t.force ?? !1, h = Se.map((e) => r(i, e));
295
+ if ((yield* f.forEach(h, (e) => V(n, e).pipe(f.map((e) => e.slice(0, we))))).every((e) => e.includes("voltro:agents-md:keep"))) return { files: h.map((e) => ({
296
296
  path: e,
297
297
  action: "protected"
298
298
  })) };
@@ -311,7 +311,7 @@ boundary, naming, anti-patterns) before editing.
311
311
  let t = w.get(a(e));
312
312
  return t ? Pe(t, u, p) : "";
313
313
  }, E = (e, t) => f.forEach(Se, (i) => Re(n, r(e, i), t, m));
314
- for (let e of g) C.push(...yield* E(e, Fe.api(p, v.get(e) ?? null, T(e)))), (yield* z(n, r(e, "database"))) && C.push(...yield* E(r(e, "database"), Fe.database(p)));
314
+ for (let e of g) C.push(...yield* E(e, Fe.api(p, v.get(e) ?? null, T(e)))), (yield* B(n, r(e, "database"))) && C.push(...yield* E(r(e, "database"), Fe.database(p)));
315
315
  for (let e of _) C.push(...yield* E(e, Fe.web(p, T(e))));
316
316
  for (let e of Ie) C.push(yield* Re(n, r(i, ".claude", "skills", e.name, "SKILL.md"), Le(e, p), m));
317
317
  return { files: C };
@@ -360,8 +360,75 @@ boundary, naming, anti-patterns) before editing.
360
360
  } catch (t) {
361
361
  throw We(t) ? Error(`voltro: the build tool '${e}' is not installed.\n\nIt's an OPTIONAL dependency of @voltro/cli — needed by 'voltro dev' and 'voltro build', but excluded from a serve-only production install (that's how prod images stay lean). If you are building, reinstall WITHOUT '--no-optional' (e.g. 'pnpm install'). A production SERVE container does not need '${e}' — it boots from the precompiled bundle.`) : t;
362
362
  }
363
- }, Ke = "// AUTO-GENERATED by Voltro — DO NOT EDIT.\n// Source: app.config.ts `env` (defineEnv). Regenerated on every `voltro dev` boot.\n", qe = (e, t) => t ? `${e} | undefined` : e, Je = (e, t) => Object.entries(e.vars).filter(([, e]) => t(e.access)).map(([e, t]) => `${t.description ? ` /** ${t.description} */\n` : ""} readonly ${e}: ${qe(t.tsType, t.optional)}`).join("\n"), Ye = async (e, t) => {
364
- let n = Je(t, () => !0), i = `${Ke}
363
+ }, Ke = () => {
364
+ let e = /* @__PURE__ */ new Map();
365
+ return {
366
+ get(t) {
367
+ return e.get(t);
368
+ },
369
+ set(t, n) {
370
+ e.set(t, n);
371
+ },
372
+ invalidate(t) {
373
+ e.delete(t);
374
+ },
375
+ invalidateBy(t) {
376
+ let n = 0;
377
+ for (let r of e.keys()) t(r) && (e.delete(r), n++);
378
+ return n;
379
+ },
380
+ clear() {
381
+ e.clear();
382
+ },
383
+ size() {
384
+ return e.size;
385
+ },
386
+ snapshot() {
387
+ return Array.from(e.entries());
388
+ }
389
+ };
390
+ }, qe = (e) => {
391
+ if (typeof e == "number" && Number.isFinite(e) && e > 0) return e * 1e3;
392
+ if (typeof e != "string") return null;
393
+ let t = /^\s*(\d+)\s*(s|seconds?|m|minutes?|h|hours?|d|days?)\s*$/i.exec(e);
394
+ if (!t) return null;
395
+ let n = parseInt(t[1], 10);
396
+ if (!Number.isFinite(n) || n <= 0) return null;
397
+ let r = t[2].toLowerCase();
398
+ return r === "s" || r.startsWith("second") ? n * 1e3 : r === "m" || r.startsWith("minute") ? n * 6e4 : r === "h" || r.startsWith("hour") ? n * 36e5 : r === "d" || r.startsWith("day") ? n * 864e5 : null;
399
+ }, Je = (e, t = {}) => {
400
+ let n = [e];
401
+ return t.tenant !== void 0 && t.tenant !== "" && n.push(`tenant=${t.tenant}`), t.locale !== void 0 && t.locale !== "" && n.push(`lang=${t.locale}`), n.join("|");
402
+ }, Ye = (e, t) => e.expiresAt > t, Xe = (e, t) => e.expiresAt <= t && e.servableUntil > t, Ze = [
403
+ "static",
404
+ "spa",
405
+ "ssr",
406
+ "isr"
407
+ ], Qe = (e) => typeof e == "string" && Ze.includes(e), $e = Ze.map((e) => `'${e}'`).join(" | "), et = (e, t) => `[voltro] ${e}: unknown renderMode '${t}'.\n Valid values: ${$e}.${t === "client" || t === "csr" || t === "browser" ? "\n A page that renders only in the browser is 'spa': it is skipped by the prerender and mounts on the client. If its route has a layout, that layout still renders server-side as an SSR shell." : t === "server" || t === "dynamic" ? "\n A page rendered per request is 'ssr'." : t === "ssg" || t === "prerender" ? "\n A page rendered once at build time is 'static' (the default)." : ""}`, tt = class extends Error {
408
+ page;
409
+ value;
410
+ name = "InvalidRenderModeError";
411
+ constructor(e, t) {
412
+ super(et(e, t)), this.page = e, this.value = t;
413
+ }
414
+ }, nt = (e, t = "<page>") => {
415
+ if (e.renderMode !== void 0 && e.renderMode !== null) {
416
+ if (!Qe(e.renderMode)) throw new tt(t, String(e.renderMode));
417
+ return e.renderMode;
418
+ }
419
+ return e.dynamic === "force-dynamic" ? "ssr" : (e.dynamic, "static");
420
+ }, rt = (e, t = "<page>") => ({
421
+ renderMode: nt(e, t),
422
+ tenantAware: e.tenantAware === !0,
423
+ revalidateMs: qe(e.revalidate),
424
+ staleWhileRevalidateMs: qe(e.staleWhileRevalidate) ?? 0,
425
+ cacheInvalidatesOn: Array.isArray(e.cacheInvalidatesOn) ? e.cacheInvalidatesOn : [],
426
+ interactive: e.interactive ?? "full",
427
+ hasLoader: typeof e.loader == "function",
428
+ hasMeta: e.meta != null,
429
+ hasGetStaticPaths: typeof e.getStaticPaths == "function"
430
+ }), it = "// AUTO-GENERATED by Voltro — DO NOT EDIT.\n// Source: app.config.ts `env` (defineEnv). Regenerated on every `voltro dev` boot.\n", at = (e, t) => t ? `${e} | undefined` : e, ot = (e, t) => Object.entries(e.vars).filter(([, e]) => t(e.access)).map(([e, t]) => `${t.description ? ` /** ${t.description} */\n` : ""} readonly ${e}: ${at(t.tsType, t.optional)}`).join("\n"), st = async (e, t) => {
431
+ let n = ot(t, () => !0), i = `${it}
365
432
  import '@voltro/env/server'
366
433
 
367
434
  declare module '@voltro/env/server' {
@@ -371,8 +438,8 @@ ${n.length > 0 ? n : " // (no variables declared)"}
371
438
  }
372
439
  `;
373
440
  await N(r(e, "env.generated.d.ts"), i, "utf8");
374
- }, Xe = async (e, t) => {
375
- let n = Je(t, (e) => e === "public"), i = `${Ke}
441
+ }, ct = async (e, t) => {
442
+ let n = ot(t, (e) => e === "public"), i = `${it}
376
443
  import '@voltro/env/public'
377
444
 
378
445
  declare module '@voltro/env/public' {
@@ -382,8 +449,8 @@ ${n.length > 0 ? n : " // (no public variables declared)"}
382
449
  }
383
450
  `, a = r(e, "src");
384
451
  await M(a, { recursive: !0 }), await N(r(a, "voltro-env.d.ts"), i, "utf8");
385
- }, Ze = async (e, t) => {
386
- let n = `${Ke}
452
+ }, lt = async (e, t) => {
453
+ let n = `${it}
387
454
  import { __installPublicEnv } from '@voltro/env/public'
388
455
 
389
456
  export const publicEnvValues = ${JSON.stringify(t, null, 2)} as const
@@ -392,13 +459,13 @@ export const publicEnvValues = ${JSON.stringify(t, null, 2)} as const
392
459
  __installPublicEnv(publicEnvValues)
393
460
  `;
394
461
  await M(e, { recursive: !0 }), await N(r(e, "env.public.ts"), n, "utf8");
395
- }, Qe = async (e) => {
396
- let t = ie(e.rawEnv) ? e.rawEnv : void 0, n = await oe({
462
+ }, ut = async (e) => {
463
+ let t = oe(e.rawEnv) ? e.rawEnv : void 0, n = await ce({
397
464
  contract: t,
398
465
  resolveSecret: j
399
- }), r = [...n.errors, ...ne(t, e.appType)];
400
- if (r.length > 0) throw Error(I(r));
401
- re(n.values), e.appType === "web" && se(n.publicValues);
466
+ }), r = [...n.errors, ...ie(t, e.appType)];
467
+ if (r.length > 0) throw Error(F(r));
468
+ ae(n.values), e.appType === "web" && le(n.publicValues);
402
469
  let i = t ? Object.keys(t.vars).length : 0;
403
470
  if (i > 0) {
404
471
  let r = Object.keys(n.publicValues).length;
@@ -410,57 +477,57 @@ __installPublicEnv(publicEnvValues)
410
477
  n.length > 0 && e.log.warn(`env: ${n.length} secret var(s) declared on a web app — secrets are reachable only from server-side render code and are NEVER bundled. Prefer declaring secrets on the api.`, { keys: n });
411
478
  }
412
479
  }
413
- return e.generateTypes && t && (e.appType === "api" ? await Ye(e.root, t) : await Xe(e.root, t)), {
480
+ return e.generateTypes && t && (e.appType === "api" ? await st(e.root, t) : await ct(e.root, t)), {
414
481
  resolved: n,
415
482
  contract: t
416
483
  };
417
- }, $e = g({ scope: "vite" }), et = /\x1b\[[0-9;]*m/g, tt = /^\s*\[?vite\]?\s*(\([a-z-]+\)\s*)?/, nt = (e) => e.replace(et, "").replace(tt, "").trim(), rt = /proxy error/i, it = [
484
+ }, dt = g({ scope: "vite" }), ft = /\x1b\[[0-9;]*m/g, pt = /^\s*\[?vite\]?\s*(\([a-z-]+\)\s*)?/, mt = (e) => e.replace(ft, "").replace(pt, "").trim(), ht = /proxy error/i, gt = [
418
485
  "ECONNREFUSED",
419
486
  "ECONNRESET",
420
487
  "ECONNABORTED",
421
488
  "EPIPE",
422
489
  "ETIMEDOUT"
423
- ], at = (e, t = 0) => {
490
+ ], _t = (e, t = 0) => {
424
491
  if (e == null || t > 5) return !1;
425
492
  let n = e;
426
- return typeof n.code == "string" && it.includes(n.code) || typeof n.message == "string" && it.some((e) => n.message.includes(e)) || Array.isArray(n.errors) && n.errors.some((e) => at(e, t + 1)) ? !0 : at(n.cause, t + 1);
427
- }, ot = 4e3, st = () => {
493
+ return typeof n.code == "string" && gt.includes(n.code) || typeof n.message == "string" && gt.some((e) => n.message.includes(e)) || Array.isArray(n.errors) && n.errors.some((e) => _t(e, t + 1)) ? !0 : _t(n.cause, t + 1);
494
+ }, vt = 4e3, yt = () => {
428
495
  let e = /* @__PURE__ */ new Set(), t = 0, n = {
429
496
  hasWarned: !1,
430
497
  info: (e) => {
431
- let t = nt(e);
432
- t.length !== 0 && $e.info(t);
498
+ let t = mt(e);
499
+ t.length !== 0 && dt.info(t);
433
500
  },
434
501
  warn: (e) => {
435
502
  n.hasWarned = !0;
436
- let t = nt(e);
437
- t.length !== 0 && $e.warn(t);
503
+ let t = mt(e);
504
+ t.length !== 0 && dt.warn(t);
438
505
  },
439
506
  warnOnce: (t) => {
440
- let r = nt(t);
441
- e.has(r) || (e.add(r), n.hasWarned = !0, r.length !== 0 && $e.warn(r));
507
+ let r = mt(t);
508
+ e.has(r) || (e.add(r), n.hasWarned = !0, r.length !== 0 && dt.warn(r));
442
509
  },
443
510
  error: (e, n) => {
444
- let r = nt(e), i = n?.error;
511
+ let r = mt(e), i = n?.error;
445
512
  if (r.length !== 0) {
446
- if (rt.test(r) && at(i)) {
513
+ if (ht.test(r) && _t(i)) {
447
514
  let e = Date.now();
448
- e - t > ot && (t = e, $e.info("waiting for api — proxy upstream not accepting connections yet (still starting?)"));
515
+ e - t > vt && (t = e, dt.info("waiting for api — proxy upstream not accepting connections yet (still starting?)"));
449
516
  return;
450
517
  }
451
- $e.error(r, {}, i);
518
+ dt.error(r, {}, i);
452
519
  }
453
520
  },
454
521
  clearScreen: () => {},
455
522
  hasErrorLogged: (e) => !1
456
523
  };
457
524
  return n;
458
- }, ct = (e = process.env) => {
525
+ }, bt = (e = process.env) => {
459
526
  let t = e.VOLTRO_DEV_SSR_COMPILE_CONCURRENCY;
460
527
  if (t === void 0 || t.trim() === "") return 4;
461
528
  let n = Number(t);
462
529
  return Number.isFinite(n) && n >= 1 ? Math.floor(n) : 4;
463
- }, lt = (e) => {
530
+ }, xt = (e) => {
464
531
  let t = Math.max(1, Math.floor(e)), n = 0, r = [], i = () => n < t ? (n++, Promise.resolve()) : new Promise((e) => r.push(e)), a = () => {
465
532
  let e = r.shift();
466
533
  e ? e() : n--;
@@ -478,8 +545,8 @@ __installPublicEnv(publicEnvValues)
478
545
  return n;
479
546
  }
480
547
  };
481
- }, ut = (e) => {
482
- let t = lt(e.limit), n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Set();
548
+ }, St = (e) => {
549
+ let t = xt(e.limit), n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Set();
483
550
  return {
484
551
  load: (i, a) => {
485
552
  if (r.has(i)) return a();
@@ -504,7 +571,7 @@ __installPublicEnv(publicEnvValues)
504
571
  return r.size;
505
572
  }
506
573
  };
507
- }, dt = (e) => {
574
+ }, Ct = (e) => {
508
575
  let t = [];
509
576
  for (let n of e.split("/").filter(Boolean)) n.startsWith("[[...") && n.endsWith("]]") ? t.push({
510
577
  name: n.slice(5, -2),
@@ -520,7 +587,7 @@ __installPublicEnv(publicEnvValues)
520
587
  optional: !1
521
588
  });
522
589
  return t;
523
- }, ft = (e) => e.replace(/-([a-z0-9])/g, (e, t) => t.toUpperCase()), pt = async (e) => {
590
+ }, wt = (e) => e.replace(/-([a-z0-9])/g, (e, t) => t.toUpperCase()), Tt = async (e) => {
524
591
  let n = a(e);
525
592
  for (let e = 0; e < 4; e++) {
526
593
  let e = r(n, "project.json");
@@ -538,8 +605,8 @@ __installPublicEnv(publicEnvValues)
538
605
  n = i;
539
606
  }
540
607
  return null;
541
- }, mt = async (t) => {
542
- let n = await pt(t);
608
+ }, Et = async (t) => {
609
+ let n = await Tt(t);
543
610
  if (!n) return [];
544
611
  let { projectDir: i, manifest: a } = n, o = e(t), s = a.apps ?? {}, c = [];
545
612
  for (let [e, t] of Object.entries(s)) {
@@ -548,23 +615,23 @@ __installPublicEnv(publicEnvValues)
548
615
  if (!y(n)) continue;
549
616
  let a;
550
617
  try {
551
- let { pages: e } = await $(n);
618
+ let { pages: e } = await gi(n);
552
619
  a = e.map((e) => ({
553
620
  pattern: e.pattern,
554
- params: dt(e.pattern)
621
+ params: Ct(e.pattern)
555
622
  }));
556
623
  } catch {
557
624
  continue;
558
625
  }
559
626
  c.push({
560
- key: ft(e),
627
+ key: wt(e),
561
628
  origin: `http://localhost:${t.port}`,
562
629
  ...typeof t.origin == "string" && t.origin.length > 0 ? { prodOrigin: t.origin } : {},
563
630
  routes: a
564
631
  });
565
632
  }
566
633
  return c;
567
- }, ht = (e) => {
634
+ }, Dt = (e) => {
568
635
  if (e.params.length === 0) return `'${e.pattern}'`;
569
636
  let t = e.pattern;
570
637
  for (let n of e.params) {
@@ -572,21 +639,21 @@ __installPublicEnv(publicEnvValues)
572
639
  t = t.replace(e, r);
573
640
  }
574
641
  return "`" + t + "`";
575
- }, gt = (e) => e.params.length === 0 ? "EmptyParams" : `{ ${e.params.map((e) => {
642
+ }, Ot = (e) => e.params.length === 0 ? "EmptyParams" : `{ ${e.params.map((e) => {
576
643
  let t = "string";
577
644
  return e.optional ? `readonly ${e.name}?: ${t}` : `readonly ${e.name}: ${t}`;
578
- }).join("; ")} }`, _t = (e, t, n) => {
579
- let r = gt(e), i = ht(e), a = t ? "VoltroExternalUrl" : "VoltroRouteUrl", o = t && n ? `${n} + ` : "";
645
+ }).join("; ")} }`, kt = (e, t, n) => {
646
+ let r = Ot(e), i = Dt(e), a = t ? "VoltroExternalUrl" : "VoltroRouteUrl", o = t && n ? `${n} + ` : "";
580
647
  return e.params.length === 0 ? `() => (${o}${i}) as ${a}` : `({ ${e.params.map((e) => e.name).join(", ")} }: ${r}) => (${o}${i}) as ${a}`;
581
- }, vt = (e) => `{\n${[...e].sort((e, t) => e.pattern.localeCompare(t.pattern)).map((e) => ` ${JSON.stringify(e.pattern)}: ${_t(e, !1)},`).join("\n")}\n}`, yt = (e, t) => {
648
+ }, At = (e) => `{\n${[...e].sort((e, t) => e.pattern.localeCompare(t.pattern)).map((e) => ` ${JSON.stringify(e.pattern)}: ${kt(e, !1)},`).join("\n")}\n}`, jt = (e, t) => {
582
649
  if (e.routes.length === 0) return ` ${e.key}: {} as Record<string, never>,`;
583
- let n = [...e.routes].sort((e, t) => e.pattern.localeCompare(t.pattern)), r = t === "prod" && e.prodOrigin ? e.prodOrigin : e.origin, i = JSON.stringify(r), a = n.map((e) => ` ${JSON.stringify(e.pattern)}: ${_t(e, !0, i)},`);
650
+ let n = [...e.routes].sort((e, t) => e.pattern.localeCompare(t.pattern)), r = t === "prod" && e.prodOrigin ? e.prodOrigin : e.origin, i = JSON.stringify(r), a = n.map((e) => ` ${JSON.stringify(e.pattern)}: ${kt(e, !0, i)},`);
584
651
  return ` ${e.key}: {\n${a.join("\n")}\n },`;
585
- }, bt = async (e) => {
652
+ }, Mt = async (e) => {
586
653
  let n = e.pages.map((e) => ({
587
654
  pattern: e.pattern,
588
- params: dt(e.pattern)
589
- })), i = await mt(e.appRoot), a = [
655
+ params: Ct(e.pattern)
656
+ })), i = await Et(e.appRoot), a = [
590
657
  "// THIS FILE IS GENERATED — DO NOT EDIT BY HAND.",
591
658
  "// Re-emitted by `voltro dev` whenever `src/pages/**` changes.",
592
659
  "// Type-safe route builders consumed by <Link to={...}>.",
@@ -595,7 +662,7 @@ __installPublicEnv(publicEnvValues)
595
662
  "",
596
663
  "type EmptyParams = Record<string, never>",
597
664
  ""
598
- ].join("\n"), o = e.mode ?? "dev", s = `${a}\n${`export const routes = ${vt(n)} as const\n`}\n${i.length === 0 ? "export const siblingApps = {} as Record<string, never>\n" : `export const siblingApps = {\n${i.map((e) => yt(e, o)).join("\n")}\n} as const\n`}`, c = r(e.appRoot, ".framework", "routes.generated.ts");
665
+ ].join("\n"), o = e.mode ?? "dev", s = `${a}\n${`export const routes = ${At(n)} as const\n`}\n${i.length === 0 ? "export const siblingApps = {} as Record<string, never>\n" : `export const siblingApps = {\n${i.map((e) => jt(e, o)).join("\n")}\n} as const\n`}`, c = r(e.appRoot, ".framework", "routes.generated.ts");
599
666
  await S.mkdir(t(c), { recursive: !0 });
600
667
  let l = null;
601
668
  try {
@@ -608,16 +675,16 @@ __installPublicEnv(publicEnvValues)
608
675
  path: c,
609
676
  wrote: !0
610
677
  });
611
- }, xt = (e) => {
612
- let t = F(e.contract), n = (e.plugins ?? []).flatMap((e) => ae(e.name, e.declaredEnv)), r = e.includeFramework === !1 ? [] : P, i = /* @__PURE__ */ new Set(), a = [];
678
+ }, Nt = (e) => {
679
+ let t = P(e.contract), n = (e.plugins ?? []).flatMap((e) => I(e.name, e.declaredEnv)), r = e.includeFramework === !1 ? [] : re, i = /* @__PURE__ */ new Set(), a = [];
613
680
  for (let e of [
614
681
  ...t,
615
682
  ...n,
616
683
  ...r
617
684
  ]) i.has(e.key) || (i.add(e.key), a.push(e));
618
685
  return a;
619
- }, St = (e, t, n = (e) => process.env[e]) => {
620
- let r = xt(t).map((e) => {
686
+ }, Pt = (e, t, n = (e) => process.env[e]) => {
687
+ let r = Nt(t).map((e) => {
621
688
  let t = n(e.key) !== void 0;
622
689
  return {
623
690
  ...e,
@@ -634,17 +701,17 @@ __installPublicEnv(publicEnvValues)
634
701
  missingRequired: r.filter((e) => e.required && !e.isSet && e.default === void 0).length
635
702
  }
636
703
  };
637
- }, Ct = (e, t) => L(xt({
704
+ }, Ft = (e, t) => se(Nt({
638
705
  ...e,
639
706
  includeFramework: !1
640
707
  }), {
641
708
  includeFramework: e.includeFramework !== !1,
642
709
  ...t ? { header: t } : {}
643
- }), V = "/_voltro/inspect", H = () => process.env.VOLTRO_INSPECT === "off", U = (e) => {
710
+ }), H = "/_voltro/inspect", U = () => process.env.VOLTRO_INSPECT === "off", W = (e) => {
644
711
  let t = process.env.VOLTRO_INSPECT_TOKEN;
645
712
  if (!t || t.length === 0) return { ok: !0 };
646
713
  let n = e.authorization ?? e.Authorization;
647
- return n ? n.startsWith("Bearer ") ? ue(n.slice(7).trim(), t) ? { ok: !0 } : {
714
+ return n ? n.startsWith("Bearer ") ? fe(n.slice(7).trim(), t) ? { ok: !0 } : {
648
715
  ok: !1,
649
716
  reason: "token mismatch"
650
717
  } : {
@@ -654,7 +721,7 @@ __installPublicEnv(publicEnvValues)
654
721
  ok: !1,
655
722
  reason: "missing Authorization header"
656
723
  };
657
- }, wt = (e) => {
724
+ }, It = (e) => {
658
725
  if (!Array.isArray(e) || e.length === 0) return;
659
726
  let t = [];
660
727
  for (let n of e) {
@@ -676,25 +743,25 @@ __installPublicEnv(publicEnvValues)
676
743
  });
677
744
  }
678
745
  return t.length > 0 ? t : void 0;
679
- }, W = (e, t, n = {}) => ({
746
+ }, G = (e, t, n = {}) => ({
680
747
  status: e,
681
748
  contentType: "application/json; charset=utf-8",
682
749
  body: JSON.stringify(t),
683
750
  headers: n
684
- }), G = (e) => !e || e.length === 0 ? {} : {
751
+ }), K = (e) => !e || e.length === 0 ? {} : {
685
752
  "access-control-allow-origin": e,
686
753
  "access-control-allow-credentials": "true",
687
754
  "access-control-allow-methods": "GET, POST, OPTIONS",
688
755
  "access-control-allow-headers": "authorization, content-type, accept",
689
756
  "access-control-expose-headers": "content-type, content-length",
690
757
  vary: "Origin"
691
- }, K = (e) => {
758
+ }, q = (e) => {
692
759
  let t = e.indexOf("?");
693
760
  return t === -1 ? e : e.slice(0, t);
694
- }, Tt = (e) => {
761
+ }, Lt = (e) => {
695
762
  let t = e.indexOf("?");
696
763
  return t === -1 ? new URLSearchParams() : new URLSearchParams(e.slice(t + 1));
697
- }, Et = (e) => e === "/_voltro/inspect" || e.startsWith("/_voltro/inspect/"), Dt = [
764
+ }, Rt = (e) => e === "/_voltro/inspect" || e.startsWith("/_voltro/inspect/"), zt = [
698
765
  "text",
699
766
  "textarea",
700
767
  "number",
@@ -710,7 +777,7 @@ __installPublicEnv(publicEnvValues)
710
777
  "file",
711
778
  "hidden",
712
779
  "custom"
713
- ], Ot = (e, t, n = []) => ({
780
+ ], Bt = (e, t, n = []) => ({
714
781
  version: 2,
715
782
  procedures: [...e].sort((e, t) => e.tag.localeCompare(t.tag)).map((e) => ({
716
783
  tag: e.tag,
@@ -724,7 +791,7 @@ __installPublicEnv(publicEnvValues)
724
791
  ...e.exposeAsTool === void 0 ? {} : { exposeAsTool: e.exposeAsTool }
725
792
  })),
726
793
  workflows: [...t].sort((e, t) => e.tag.localeCompare(t.tag)).map((e) => ({ name: e.tag })),
727
- widgets: Dt,
794
+ widgets: zt,
728
795
  tables: [...n].filter((e) => !e.isFrameworkTable).sort((e, t) => e.name.localeCompare(t.name)).map((e) => ({
729
796
  name: e.name,
730
797
  reactive: e.isReactive,
@@ -737,58 +804,58 @@ __installPublicEnv(publicEnvValues)
737
804
  ...e.oneOf === void 0 ? {} : { enum: e.oneOf }
738
805
  }))
739
806
  }))
740
- }), kt = (e, t, n = {}, r = {}) => {
741
- let i = K(e);
742
- if (!Et(i)) return null;
743
- let a = G(n.origin ?? n.Origin);
807
+ }), Vt = (e, t, n = {}, r = {}) => {
808
+ let i = q(e);
809
+ if (!Rt(i)) return null;
810
+ let a = K(n.origin ?? n.Origin);
744
811
  if ((r.method ?? "GET").toUpperCase() === "OPTIONS") return {
745
812
  status: 204,
746
813
  contentType: "text/plain",
747
814
  body: "",
748
815
  headers: a
749
816
  };
750
- if (H()) return W(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, a);
751
- let o = (r.authResolver ?? U)(n);
752
- if (!o.ok) return W(401, {
817
+ if (U()) return G(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, a);
818
+ let o = (r.authResolver ?? W)(n);
819
+ if (!o.ok) return G(401, {
753
820
  error: "unauthorized",
754
821
  reason: o.reason
755
822
  }, a);
756
- if (i === "/_voltro/inspect" || i === "/_voltro/inspect/" || i === "/_voltro/inspect/app") return W(200, {
823
+ if (i === "/_voltro/inspect" || i === "/_voltro/inspect/" || i === "/_voltro/inspect/app") return G(200, {
757
824
  kind: t.kind,
758
825
  ...t.meta
759
826
  }, a);
760
- if (i === "/_voltro/inspect/routes") return t.kind === "web" ? W(200, {
827
+ if (i === "/_voltro/inspect/routes") return t.kind === "web" ? G(200, {
761
828
  pages: t.routes,
762
829
  dirs: t.dirs
763
- }, a) : W(404, { error: "routes endpoint is web-only" }, a);
764
- if (i === "/_voltro/inspect/cache") return t.kind === "web" ? W(200, t.cache(), a) : W(404, { error: "cache endpoint is web-only" }, a);
765
- if (i === "/_voltro/inspect/rpc") return t.kind === "api" ? W(200, {
830
+ }, a) : G(404, { error: "routes endpoint is web-only" }, a);
831
+ if (i === "/_voltro/inspect/cache") return t.kind === "web" ? G(200, t.cache(), a) : G(404, { error: "cache endpoint is web-only" }, a);
832
+ if (i === "/_voltro/inspect/rpc") return t.kind === "api" ? G(200, {
766
833
  procedures: t.rpc,
767
834
  workflows: t.workflows
768
- }, a) : W(404, { error: "rpc endpoint is api-only" }, a);
835
+ }, a) : G(404, { error: "rpc endpoint is api-only" }, a);
769
836
  if (i === "/_voltro/inspect/manifest") {
770
- if (t.kind !== "api") return W(404, { error: "manifest endpoint is api-only" }, a);
837
+ if (t.kind !== "api") return G(404, { error: "manifest endpoint is api-only" }, a);
771
838
  let e = t.inspectTables?.().tables ?? [];
772
- return W(200, Ot(t.rpc, t.workflows, e), a);
839
+ return G(200, Bt(t.rpc, t.workflows, e), a);
773
840
  }
774
- return i === "/_voltro/inspect/metrics" ? t.metrics === void 0 ? W(200, [], a) : W(200, t.metrics(), a) : i === "/_voltro/inspect/subscriptions" ? t.kind === "api" ? t.subscriptions === void 0 ? W(200, {
841
+ return i === "/_voltro/inspect/metrics" ? t.metrics === void 0 ? G(200, [], a) : G(200, t.metrics(), a) : i === "/_voltro/inspect/subscriptions" ? t.kind === "api" ? t.subscriptions === void 0 ? G(200, {
775
842
  subscriptions: [],
776
843
  matcherStats: [],
777
844
  capturedAt: Date.now()
778
- }, a) : W(200, t.subscriptions(), a) : W(404, { error: "subscriptions endpoint is api-only" }, a) : i === "/_voltro/inspect/data-cache" ? t.kind === "api" ? t.dataCache === void 0 ? W(200, {
845
+ }, a) : G(200, t.subscriptions(), a) : G(404, { error: "subscriptions endpoint is api-only" }, a) : i === "/_voltro/inspect/data-cache" ? t.kind === "api" ? t.dataCache === void 0 ? G(200, {
779
846
  backend: "memory",
780
847
  engine: "memory",
781
848
  driver: "resp",
782
849
  hits: 0,
783
850
  misses: 0,
784
851
  hitRate: 0
785
- }, a) : W(200, t.dataCache(), a) : W(404, { error: "data-cache endpoint is api-only" }, a) : i === "/_voltro/inspect/database" ? t.kind === "api" ? t.database === void 0 ? W(200, {
852
+ }, a) : G(200, t.dataCache(), a) : G(404, { error: "data-cache endpoint is api-only" }, a) : i === "/_voltro/inspect/database" ? t.kind === "api" ? t.database === void 0 ? G(200, {
786
853
  migrations: [],
787
854
  seeds: []
788
- }, a) : W(200, t.database(), a) : W(404, { error: "database endpoint is api-only" }, a) : i === "/_voltro/inspect/plugins" ? t.kind === "api" ? t.plugins === void 0 ? W(200, {
855
+ }, a) : G(200, t.database(), a) : G(404, { error: "database endpoint is api-only" }, a) : i === "/_voltro/inspect/plugins" ? t.kind === "api" ? t.plugins === void 0 ? G(200, {
789
856
  plugins: [],
790
857
  capturedAt: Date.now()
791
- }, a) : W(200, t.plugins(), a) : W(404, { error: "plugins endpoint is api-only" }, a) : i === "/_voltro/inspect/env" ? t.env === void 0 ? W(200, {
858
+ }, a) : G(200, t.plugins(), a) : G(404, { error: "plugins endpoint is api-only" }, a) : i === "/_voltro/inspect/env" ? t.env === void 0 ? G(200, {
792
859
  app: t.meta.name ?? "app",
793
860
  entries: [],
794
861
  summary: {
@@ -796,34 +863,34 @@ __installPublicEnv(publicEnvValues)
796
863
  set: 0,
797
864
  missingRequired: 0
798
865
  }
799
- }, a) : W(200, t.env(), a) : i === "/_voltro/inspect/data/tables" ? t.kind === "api" ? t.inspectTables === void 0 ? W(200, { tables: [] }, a) : W(200, t.inspectTables(), a) : W(404, { error: "data viewer is api-only" }, a) : i === "/_voltro/inspect/invoke" ? W(404, { error: "invoke not enabled here — use POST handler" }, a) : W(404, {
866
+ }, a) : G(200, t.env(), a) : i === "/_voltro/inspect/data/tables" ? t.kind === "api" ? t.inspectTables === void 0 ? G(200, { tables: [] }, a) : G(200, t.inspectTables(), a) : G(404, { error: "data viewer is api-only" }, a) : i === "/_voltro/inspect/invoke" ? G(404, { error: "invoke not enabled here — use POST handler" }, a) : G(404, {
800
867
  error: "unknown inspect endpoint",
801
868
  path: i
802
869
  }, a);
803
- }, At = async (e, t, n, r = {}) => {
804
- let i = G(t.origin ?? t.Origin);
805
- if (H()) return W(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, i);
806
- if ((r.method ?? "POST").toUpperCase() !== "POST") return W(405, {
870
+ }, Ht = async (e, t, n, r = {}) => {
871
+ let i = K(t.origin ?? t.Origin);
872
+ if (U()) return G(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, i);
873
+ if ((r.method ?? "POST").toUpperCase() !== "POST") return G(405, {
807
874
  error: "method not allowed",
808
875
  expected: "POST"
809
876
  }, i);
810
- let a = (r.authResolver ?? U)(t);
811
- if (!a.ok) return W(401, {
877
+ let a = (r.authResolver ?? W)(t);
878
+ if (!a.ok) return G(401, {
812
879
  error: "unauthorized",
813
880
  reason: a.reason
814
881
  }, i);
815
- if (e.kind !== "api") return W(404, { error: "invoke endpoint is api-only" }, i);
816
- if (!e.invokers || e.invokers.size === 0) return W(404, { error: "invoke not configured" }, i);
882
+ if (e.kind !== "api") return G(404, { error: "invoke endpoint is api-only" }, i);
883
+ if (!e.invokers || e.invokers.size === 0) return G(404, { error: "invoke not configured" }, i);
817
884
  let o;
818
885
  try {
819
886
  o = JSON.parse(n || "{}");
820
887
  } catch {
821
- return W(400, { error: "body must be JSON" }, i);
888
+ return G(400, { error: "body must be JSON" }, i);
822
889
  }
823
890
  let s = o;
824
- if (typeof s.tag != "string") return W(400, { error: "body.tag must be a string" }, i);
891
+ if (typeof s.tag != "string") return G(400, { error: "body.tag must be a string" }, i);
825
892
  let c = e.invokers.get(s.tag);
826
- if (!c) return W(404, {
893
+ if (!c) return G(404, {
827
894
  error: "unknown tag",
828
895
  tag: s.tag
829
896
  }, i);
@@ -833,167 +900,167 @@ __installPublicEnv(publicEnvValues)
833
900
  let n = e.toLowerCase();
834
901
  n !== "cookie" && (u[n] = t);
835
902
  }
836
- return W(200, await c(s.input, u), i);
837
- }, jt = async (e, t, n, r, i = {}) => {
838
- let a = K(e);
839
- if (!Et(a) || !a.startsWith("/_voltro/inspect/webhooks/")) return null;
840
- let o = G(n.origin ?? n.Origin);
903
+ return G(200, await c(s.input, u), i);
904
+ }, Ut = async (e, t, n, r, i = {}) => {
905
+ let a = q(e);
906
+ if (!Rt(a) || !a.startsWith("/_voltro/inspect/webhooks/")) return null;
907
+ let o = K(n.origin ?? n.Origin);
841
908
  if ((i.method ?? "POST").toUpperCase() !== "POST") return null;
842
- if (H()) return W(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, o);
843
- let s = (i.authResolver ?? U)(n);
844
- if (!s.ok) return W(401, {
909
+ if (U()) return G(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, o);
910
+ let s = (i.authResolver ?? W)(n);
911
+ if (!s.ok) return G(401, {
845
912
  error: "unauthorized",
846
913
  reason: s.reason
847
914
  }, o);
848
- if (t.kind !== "api") return W(404, { error: "webhook actions are api-only" }, o);
849
- if (!t.webhookActions) return W(404, { error: "webhook actions not configured — is @voltro/plugin-webhooks active?" }, o);
915
+ if (t.kind !== "api") return G(404, { error: "webhook actions are api-only" }, o);
916
+ if (!t.webhookActions) return G(404, { error: "webhook actions not configured — is @voltro/plugin-webhooks active?" }, o);
850
917
  let c;
851
918
  try {
852
919
  c = JSON.parse(r || "{}");
853
920
  } catch {
854
- return W(400, { error: "body must be JSON" }, o);
921
+ return G(400, { error: "body must be JSON" }, o);
855
922
  }
856
- let l = a.slice(`${V}/webhooks/`.length);
923
+ let l = a.slice(`${H}/webhooks/`.length);
857
924
  try {
858
925
  switch (l) {
859
926
  case "subscribe": {
860
927
  let e = c;
861
- return typeof e.event != "string" || e.event.length === 0 ? W(400, { error: "event required" }, o) : typeof e.url != "string" || e.url.length === 0 ? W(400, { error: "url required" }, o) : W(200, await t.webhookActions.subscribe(e), o);
928
+ return typeof e.event != "string" || e.event.length === 0 ? G(400, { error: "event required" }, o) : typeof e.url != "string" || e.url.length === 0 ? G(400, { error: "url required" }, o) : G(200, await t.webhookActions.subscribe(e), o);
862
929
  }
863
930
  case "pause": {
864
931
  let e = c.targetId;
865
- return typeof e != "string" || e.length === 0 ? W(400, { error: "targetId required" }, o) : (await t.webhookActions.pause(e), W(200, { ok: !0 }, o));
932
+ return typeof e != "string" || e.length === 0 ? G(400, { error: "targetId required" }, o) : (await t.webhookActions.pause(e), G(200, { ok: !0 }, o));
866
933
  }
867
934
  case "resume": {
868
935
  let e = c.targetId;
869
- return typeof e != "string" || e.length === 0 ? W(400, { error: "targetId required" }, o) : (await t.webhookActions.resume(e), W(200, { ok: !0 }, o));
936
+ return typeof e != "string" || e.length === 0 ? G(400, { error: "targetId required" }, o) : (await t.webhookActions.resume(e), G(200, { ok: !0 }, o));
870
937
  }
871
938
  case "delete": {
872
939
  let e = c.targetId;
873
- return typeof e != "string" || e.length === 0 ? W(400, { error: "targetId required" }, o) : (await t.webhookActions.delete(e), W(200, { ok: !0 }, o));
940
+ return typeof e != "string" || e.length === 0 ? G(400, { error: "targetId required" }, o) : (await t.webhookActions.delete(e), G(200, { ok: !0 }, o));
874
941
  }
875
942
  case "rotateSecret": {
876
943
  let e = c.targetId;
877
- return typeof e != "string" || e.length === 0 ? W(400, { error: "targetId required" }, o) : W(200, await t.webhookActions.rotateSecret(e), o);
944
+ return typeof e != "string" || e.length === 0 ? G(400, { error: "targetId required" }, o) : G(200, await t.webhookActions.rotateSecret(e), o);
878
945
  }
879
946
  case "replay": {
880
947
  let e = c.deliveryId;
881
- return typeof e != "string" || e.length === 0 ? W(400, { error: "deliveryId required" }, o) : (await t.webhookActions.replay(e), W(200, { ok: !0 }, o));
948
+ return typeof e != "string" || e.length === 0 ? G(400, { error: "deliveryId required" }, o) : (await t.webhookActions.replay(e), G(200, { ok: !0 }, o));
882
949
  }
883
950
  case "repinVersion": {
884
951
  let e = c.targetId, n = c.version;
885
- return typeof e != "string" || e.length === 0 ? W(400, { error: "targetId required" }, o) : typeof n != "number" || !Number.isInteger(n) || n < 1 ? W(400, { error: "version must be a positive integer" }, o) : (await t.webhookActions.updateTargetPayloadVersion(e, n), W(200, { ok: !0 }, o));
952
+ return typeof e != "string" || e.length === 0 ? G(400, { error: "targetId required" }, o) : typeof n != "number" || !Number.isInteger(n) || n < 1 ? G(400, { error: "version must be a positive integer" }, o) : (await t.webhookActions.updateTargetPayloadVersion(e, n), G(200, { ok: !0 }, o));
886
953
  }
887
- default: return W(404, { error: `unknown webhook action: ${l}` }, o);
954
+ default: return G(404, { error: `unknown webhook action: ${l}` }, o);
888
955
  }
889
956
  } catch (e) {
890
- return W(500, {
957
+ return G(500, {
891
958
  error: "webhook action failed",
892
959
  message: e?.message ?? String(e)
893
960
  }, o);
894
961
  }
895
- }, Mt = async (e, t, n, r, i = {}) => {
896
- let a = K(e);
897
- if (!Et(a)) return null;
898
- let o = G(n.origin ?? n.Origin);
962
+ }, Wt = async (e, t, n, r, i = {}) => {
963
+ let a = q(e);
964
+ if (!Rt(a)) return null;
965
+ let o = K(n.origin ?? n.Origin);
899
966
  if ((i.method ?? "POST").toUpperCase() !== "POST") return null;
900
- if (H()) return W(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, o);
901
- let s = (i.authResolver ?? U)(n);
902
- if (!s.ok) return W(401, {
967
+ if (U()) return G(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, o);
968
+ let s = (i.authResolver ?? W)(n);
969
+ if (!s.ok) return G(401, {
903
970
  error: "unauthorized",
904
971
  reason: s.reason
905
972
  }, o);
906
- if (t.kind !== "api") return W(404, { error: "framework-action endpoints are api-only" }, o);
907
- let c = `${V}/seeds/run`, l = `${V}/migrations/rollback`, u = `${V}/migrations/squash`, d = `${V}/migrations/restore-snapshot`;
973
+ if (t.kind !== "api") return G(404, { error: "framework-action endpoints are api-only" }, o);
974
+ let c = `${H}/seeds/run`, l = `${H}/migrations/rollback`, u = `${H}/migrations/squash`, d = `${H}/migrations/restore-snapshot`;
908
975
  if (a !== c && a !== l && a !== u && a !== d && a !== "/_voltro/inspect/migrations/compare-env") return null;
909
976
  let f;
910
977
  try {
911
978
  f = JSON.parse(r || "{}");
912
979
  } catch {
913
- return W(400, { error: "body must be JSON" }, o);
980
+ return G(400, { error: "body must be JSON" }, o);
914
981
  }
915
982
  try {
916
- if (a === c) return typeof f.id != "string" || f.id.length === 0 ? W(400, { error: "body.id must be a non-empty string" }, o) : t.runSeed ? W(200, await t.runSeed(f.id), o) : W(404, { error: "runSeed not configured" }, o);
917
- if (a === l) return typeof f.id != "string" || f.id.length === 0 ? W(400, { error: "body.id must be a non-empty string" }, o) : t.rollbackMigration ? W(200, await t.rollbackMigration(f.id), o) : W(404, { error: "rollbackMigration not configured" }, o);
983
+ if (a === c) return typeof f.id != "string" || f.id.length === 0 ? G(400, { error: "body.id must be a non-empty string" }, o) : t.runSeed ? G(200, await t.runSeed(f.id), o) : G(404, { error: "runSeed not configured" }, o);
984
+ if (a === l) return typeof f.id != "string" || f.id.length === 0 ? G(400, { error: "body.id must be a non-empty string" }, o) : t.rollbackMigration ? G(200, await t.rollbackMigration(f.id), o) : G(404, { error: "rollbackMigration not configured" }, o);
918
985
  if (a === u) {
919
- if (typeof f.before != "string" || f.before.length === 0) return W(400, { error: "body.before must be a non-empty ISO date string" }, o);
920
- if (!t.squashMigrationHistory) return W(404, { error: "squashMigrationHistory not configured" }, o);
986
+ if (typeof f.before != "string" || f.before.length === 0) return G(400, { error: "body.before must be a non-empty ISO date string" }, o);
987
+ if (!t.squashMigrationHistory) return G(404, { error: "squashMigrationHistory not configured" }, o);
921
988
  let e = typeof f.note == "string" ? f.note : void 0;
922
- return W(200, await t.squashMigrationHistory({
989
+ return G(200, await t.squashMigrationHistory({
923
990
  before: f.before,
924
991
  note: e
925
992
  }), o);
926
993
  }
927
- return a === d ? typeof f.planId != "string" || f.planId.length === 0 ? W(400, { error: "body.planId must be a non-empty string" }, o) : t.restoreSnapshot ? W(200, await t.restoreSnapshot({ planId: f.planId }), o) : W(404, { error: "restoreSnapshot not configured" }, o) : typeof f.url != "string" || f.url.length === 0 ? W(400, { error: "body.url must be a non-empty URL string" }, o) : t.compareCrossEnv ? (await t.compareCrossEnv({
994
+ return a === d ? typeof f.planId != "string" || f.planId.length === 0 ? G(400, { error: "body.planId must be a non-empty string" }, o) : t.restoreSnapshot ? G(200, await t.restoreSnapshot({ planId: f.planId }), o) : G(404, { error: "restoreSnapshot not configured" }, o) : typeof f.url != "string" || f.url.length === 0 ? G(400, { error: "body.url must be a non-empty URL string" }, o) : t.compareCrossEnv ? (await t.compareCrossEnv({
928
995
  url: f.url,
929
996
  label: typeof f.label == "string" ? f.label : void 0,
930
997
  token: typeof f.token == "string" ? f.token : void 0
931
- }), W(200, { ok: !0 }, o)) : W(404, { error: "compareCrossEnv not configured" }, o);
998
+ }), G(200, { ok: !0 }, o)) : G(404, { error: "compareCrossEnv not configured" }, o);
932
999
  } catch (e) {
933
- return W(500, {
1000
+ return G(500, {
934
1001
  error: "framework action failed",
935
1002
  message: e?.message ?? String(e)
936
1003
  }, o);
937
1004
  }
938
- }, Nt = async (e, t, n, r = {}) => {
939
- if (K(e) !== "/_voltro/inspect/data/rows") return null;
940
- let i = G(n.origin ?? n.Origin);
941
- if ((r.method ?? "GET").toUpperCase() !== "GET") return W(405, {
1005
+ }, Gt = async (e, t, n, r = {}) => {
1006
+ if (q(e) !== "/_voltro/inspect/data/rows") return null;
1007
+ let i = K(n.origin ?? n.Origin);
1008
+ if ((r.method ?? "GET").toUpperCase() !== "GET") return G(405, {
942
1009
  error: "method not allowed",
943
1010
  expected: "GET"
944
1011
  }, i);
945
- if (H()) return W(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, i);
946
- let a = (r.authResolver ?? U)(n);
947
- if (!a.ok) return W(401, {
1012
+ if (U()) return G(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, i);
1013
+ let a = (r.authResolver ?? W)(n);
1014
+ if (!a.ok) return G(401, {
948
1015
  error: "unauthorized",
949
1016
  reason: a.reason
950
1017
  }, i);
951
- if (t.kind !== "api") return W(404, { error: "data viewer is api-only" }, i);
952
- if (t.inspectRows === void 0) return W(404, { error: "inspectRows not configured" }, i);
953
- let o = q(e), s = o.get("table");
954
- if (!s) return W(400, { error: "query.table is required" }, i);
955
- let c = J(o.get("offset")) ?? 0, l = J(o.get("limit")) ?? 50, u = {}, d = o.get("q");
1018
+ if (t.kind !== "api") return G(404, { error: "data viewer is api-only" }, i);
1019
+ if (t.inspectRows === void 0) return G(404, { error: "inspectRows not configured" }, i);
1020
+ let o = J(e), s = o.get("table");
1021
+ if (!s) return G(400, { error: "query.table is required" }, i);
1022
+ let c = Y(o.get("offset")) ?? 0, l = Y(o.get("limit")) ?? 50, u = {}, d = o.get("q");
956
1023
  if (d) {
957
- if (d.length > 8192) return W(400, { error: "query.q too large" }, i);
1024
+ if (d.length > 8192) return G(400, { error: "query.q too large" }, i);
958
1025
  try {
959
1026
  u = JSON.parse(Buffer.from(d, "base64url").toString("utf8"));
960
1027
  } catch {
961
- return W(400, { error: "query.q is not valid base64url JSON" }, i);
1028
+ return G(400, { error: "query.q is not valid base64url JSON" }, i);
962
1029
  }
963
1030
  }
964
1031
  try {
965
- return W(200, await t.inspectRows({
1032
+ return G(200, await t.inspectRows({
966
1033
  table: s,
967
1034
  offset: c,
968
1035
  limit: l,
969
1036
  ...u
970
1037
  }), i);
971
1038
  } catch (e) {
972
- return e?.name === "InspectQueryError" ? W(400, {
1039
+ return e?.name === "InspectQueryError" ? G(400, {
973
1040
  error: "invalid query",
974
1041
  message: e.message
975
- }, i) : W(500, {
1042
+ }, i) : G(500, {
976
1043
  error: "data-rows query failed",
977
1044
  message: e?.message ?? String(e)
978
1045
  }, i);
979
1046
  }
980
- }, Pt = async (e, t, n, r = {}) => {
981
- if (K(e) !== "/_voltro/inspect/provenance") return null;
982
- let i = G(n.origin ?? n.Origin);
983
- if ((r.method ?? "GET").toUpperCase() !== "GET") return W(405, {
1047
+ }, Kt = async (e, t, n, r = {}) => {
1048
+ if (q(e) !== "/_voltro/inspect/provenance") return null;
1049
+ let i = K(n.origin ?? n.Origin);
1050
+ if ((r.method ?? "GET").toUpperCase() !== "GET") return G(405, {
984
1051
  error: "method not allowed",
985
1052
  expected: "GET"
986
1053
  }, i);
987
- if (H()) return W(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, i);
988
- let a = (r.authResolver ?? U)(n);
989
- if (!a.ok) return W(401, {
1054
+ if (U()) return G(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, i);
1055
+ let a = (r.authResolver ?? W)(n);
1056
+ if (!a.ok) return G(401, {
990
1057
  error: "unauthorized",
991
1058
  reason: a.reason
992
1059
  }, i);
993
- if (t.kind !== "api") return W(404, { error: "provenance is api-only" }, i);
994
- if (t.inspectRows === void 0) return W(404, { error: "inspectRows not configured" }, i);
995
- let o = q(e), s = o.get("table"), c = o.get("id"), l = o.get("column") ?? void 0;
996
- if (!s || !c) return W(400, { error: "query.table and query.id are required" }, i);
1060
+ if (t.kind !== "api") return G(404, { error: "provenance is api-only" }, i);
1061
+ if (t.inspectRows === void 0) return G(404, { error: "inspectRows not configured" }, i);
1062
+ let o = J(e), s = o.get("table"), c = o.get("id"), l = o.get("column") ?? void 0;
1063
+ if (!s || !c) return G(400, { error: "query.table and query.id are required" }, i);
997
1064
  try {
998
1065
  let e = (await t.inspectRows({
999
1066
  table: s,
@@ -1005,175 +1072,175 @@ __installPublicEnv(publicEnvValues)
1005
1072
  value: c
1006
1073
  }
1007
1074
  })).rows[0];
1008
- return W(200, k(e, {
1075
+ return G(200, k(e, {
1009
1076
  table: s,
1010
1077
  id: c,
1011
1078
  ...l === void 0 ? {} : { column: l }
1012
1079
  }), i);
1013
1080
  } catch (e) {
1014
- return e?.name === "InspectQueryError" ? W(400, {
1081
+ return e?.name === "InspectQueryError" ? G(400, {
1015
1082
  error: "invalid query",
1016
1083
  message: e.message
1017
- }, i) : W(500, {
1084
+ }, i) : G(500, {
1018
1085
  error: "provenance query failed",
1019
1086
  message: e?.message ?? String(e)
1020
1087
  }, i);
1021
1088
  }
1022
- }, q = (e) => {
1089
+ }, J = (e) => {
1023
1090
  let t = e.indexOf("?");
1024
1091
  return t < 0 ? new URLSearchParams() : new URLSearchParams(e.slice(t + 1));
1025
- }, J = (e) => {
1092
+ }, Y = (e) => {
1026
1093
  if (e === null || e === "") return;
1027
1094
  let t = Number(e);
1028
1095
  return Number.isFinite(t) && t >= 0 ? Math.floor(t) : void 0;
1029
- }, Ft = async (e, t, n, r = {}) => {
1030
- if (K(e) !== "/_voltro/inspect/workflows/runs") return null;
1031
- let i = G(n.origin ?? n.Origin);
1032
- if ((r.method ?? "GET").toUpperCase() !== "GET") return W(405, {
1096
+ }, qt = async (e, t, n, r = {}) => {
1097
+ if (q(e) !== "/_voltro/inspect/workflows/runs") return null;
1098
+ let i = K(n.origin ?? n.Origin);
1099
+ if ((r.method ?? "GET").toUpperCase() !== "GET") return G(405, {
1033
1100
  error: "method not allowed",
1034
1101
  expected: "GET"
1035
1102
  }, i);
1036
- if (H()) return W(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, i);
1037
- let a = (r.authResolver ?? U)(n);
1038
- if (!a.ok) return W(401, {
1103
+ if (U()) return G(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, i);
1104
+ let a = (r.authResolver ?? W)(n);
1105
+ if (!a.ok) return G(401, {
1039
1106
  error: "unauthorized",
1040
1107
  reason: a.reason
1041
1108
  }, i);
1042
- if (t.kind !== "api") return W(404, { error: "workflows endpoint is api-only" }, i);
1043
- if (t.inspectWorkflowRuns === void 0) return W(200, {
1109
+ if (t.kind !== "api") return G(404, { error: "workflows endpoint is api-only" }, i);
1110
+ if (t.inspectWorkflowRuns === void 0) return G(200, {
1044
1111
  runs: [],
1045
1112
  total: 0,
1046
1113
  offset: 0,
1047
1114
  limit: 50
1048
1115
  }, i);
1049
- let o = q(e);
1116
+ let o = J(e);
1050
1117
  try {
1051
- return W(200, await t.inspectWorkflowRuns({
1118
+ return G(200, await t.inspectWorkflowRuns({
1052
1119
  ...o.get("tag") === null ? {} : { tag: o.get("tag") },
1053
1120
  ...o.get("status") === null ? {} : { status: o.get("status") },
1054
- offset: J(o.get("offset")) ?? 0,
1055
- limit: J(o.get("limit")) ?? 50
1121
+ offset: Y(o.get("offset")) ?? 0,
1122
+ limit: Y(o.get("limit")) ?? 50
1056
1123
  }), i);
1057
1124
  } catch (e) {
1058
- return W(500, {
1125
+ return G(500, {
1059
1126
  error: "workflow-runs query failed",
1060
1127
  message: e?.message ?? String(e)
1061
1128
  }, i);
1062
1129
  }
1063
- }, It = async (e, t, n, r, i = {}) => {
1064
- let a = K(e).match(/^\/_voltro\/inspect\/workflows\/start\/([^/]+)$/);
1130
+ }, Jt = async (e, t, n, r, i = {}) => {
1131
+ let a = q(e).match(/^\/_voltro\/inspect\/workflows\/start\/([^/]+)$/);
1065
1132
  if (!a) return null;
1066
- let o = decodeURIComponent(a[1] ?? ""), s = G(n.origin ?? n.Origin);
1067
- if ((i.method ?? "POST").toUpperCase() !== "POST") return W(405, {
1133
+ let o = decodeURIComponent(a[1] ?? ""), s = K(n.origin ?? n.Origin);
1134
+ if ((i.method ?? "POST").toUpperCase() !== "POST") return G(405, {
1068
1135
  error: "method not allowed",
1069
1136
  expected: "POST"
1070
1137
  }, s);
1071
- if (H()) return W(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, s);
1072
- let c = (i.authResolver ?? U)(n);
1073
- if (!c.ok) return W(401, {
1138
+ if (U()) return G(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, s);
1139
+ let c = (i.authResolver ?? W)(n);
1140
+ if (!c.ok) return G(401, {
1074
1141
  error: "unauthorized",
1075
1142
  reason: c.reason
1076
1143
  }, s);
1077
- if (t.kind !== "api") return W(404, { error: "workflow start is api-only" }, s);
1078
- if (t.inspectStartWorkflow === void 0) return W(404, { error: "inspectStartWorkflow not configured" }, s);
1144
+ if (t.kind !== "api") return G(404, { error: "workflow start is api-only" }, s);
1145
+ if (t.inspectStartWorkflow === void 0) return G(404, { error: "inspectStartWorkflow not configured" }, s);
1079
1146
  let l = {};
1080
1147
  if (r.length > 0) try {
1081
1148
  l = JSON.parse(r).payload ?? {};
1082
1149
  } catch {
1083
- return W(400, { error: "start requires JSON body `{ payload?: unknown }`" }, s);
1150
+ return G(400, { error: "start requires JSON body `{ payload?: unknown }`" }, s);
1084
1151
  }
1085
1152
  try {
1086
- return W(200, await t.inspectStartWorkflow({
1153
+ return G(200, await t.inspectStartWorkflow({
1087
1154
  name: o,
1088
1155
  payload: l
1089
1156
  }), s);
1090
1157
  } catch (e) {
1091
- return W(500, {
1158
+ return G(500, {
1092
1159
  error: "workflow start failed",
1093
1160
  message: e?.message ?? String(e)
1094
1161
  }, s);
1095
1162
  }
1096
- }, Lt = async (e, t, n, r = {}) => {
1097
- let i = K(e);
1163
+ }, Yt = async (e, t, n, r = {}) => {
1164
+ let i = q(e);
1098
1165
  if (!i.startsWith("/_voltro/inspect/schedules")) return null;
1099
- let a = G(n.origin ?? n.Origin);
1100
- if (H()) return W(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, a);
1101
- let o = (r.authResolver ?? U)(n);
1102
- if (!o.ok) return W(401, {
1166
+ let a = K(n.origin ?? n.Origin);
1167
+ if (U()) return G(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, a);
1168
+ let o = (r.authResolver ?? W)(n);
1169
+ if (!o.ok) return G(401, {
1103
1170
  error: "unauthorized",
1104
1171
  reason: o.reason
1105
1172
  }, a);
1106
- if (t.kind !== "api") return W(404, { error: "schedules are api-only" }, a);
1173
+ if (t.kind !== "api") return G(404, { error: "schedules are api-only" }, a);
1107
1174
  let s = (r.method ?? "GET").toUpperCase(), c = i.match(/^\/_voltro\/inspect\/schedules\/([^/]+)\/fire$/);
1108
1175
  if (c) {
1109
- if (s !== "POST") return W(405, {
1176
+ if (s !== "POST") return G(405, {
1110
1177
  error: "method not allowed",
1111
1178
  expected: "POST"
1112
1179
  }, a);
1113
- if (!t.inspectFireSchedule) return W(404, { error: "inspectFireSchedule not configured" }, a);
1114
- let n = decodeURIComponent(c[1] ?? ""), r = q(e).get("trigger") === "external" ? "external" : "manual";
1180
+ if (!t.inspectFireSchedule) return G(404, { error: "inspectFireSchedule not configured" }, a);
1181
+ let n = decodeURIComponent(c[1] ?? ""), r = J(e).get("trigger") === "external" ? "external" : "manual";
1115
1182
  try {
1116
- return W(200, await t.inspectFireSchedule({
1183
+ return G(200, await t.inspectFireSchedule({
1117
1184
  name: n,
1118
1185
  trigger: r
1119
1186
  }), a);
1120
1187
  } catch (e) {
1121
- return W(500, {
1188
+ return G(500, {
1122
1189
  error: "fire failed",
1123
1190
  message: e?.message ?? String(e)
1124
1191
  }, a);
1125
1192
  }
1126
1193
  }
1127
1194
  if (i === "/_voltro/inspect/schedules/runs") {
1128
- if (s !== "GET") return W(405, {
1195
+ if (s !== "GET") return G(405, {
1129
1196
  error: "method not allowed",
1130
1197
  expected: "GET"
1131
1198
  }, a);
1132
- if (!t.inspectScheduleRuns) return W(200, {
1199
+ if (!t.inspectScheduleRuns) return G(200, {
1133
1200
  runs: [],
1134
1201
  total: 0,
1135
1202
  offset: 0,
1136
1203
  limit: 50
1137
1204
  }, a);
1138
- let n = q(e);
1205
+ let n = J(e);
1139
1206
  try {
1140
- return W(200, await t.inspectScheduleRuns({
1207
+ return G(200, await t.inspectScheduleRuns({
1141
1208
  ...n.get("name") === null ? {} : { name: n.get("name") },
1142
- offset: J(n.get("offset")) ?? 0,
1143
- limit: J(n.get("limit")) ?? 50
1209
+ offset: Y(n.get("offset")) ?? 0,
1210
+ limit: Y(n.get("limit")) ?? 50
1144
1211
  }), a);
1145
1212
  } catch (e) {
1146
- return W(500, {
1213
+ return G(500, {
1147
1214
  error: "schedule-runs query failed",
1148
1215
  message: e?.message ?? String(e)
1149
1216
  }, a);
1150
1217
  }
1151
1218
  }
1152
- return i === "/_voltro/inspect/schedules" ? s === "GET" ? t.inspectSchedules ? W(200, t.inspectSchedules(), a) : W(200, {
1219
+ return i === "/_voltro/inspect/schedules" ? s === "GET" ? t.inspectSchedules ? G(200, t.inspectSchedules(), a) : G(200, {
1153
1220
  schedules: [],
1154
1221
  coordination: "single"
1155
- }, a) : W(405, {
1222
+ }, a) : G(405, {
1156
1223
  error: "method not allowed",
1157
1224
  expected: "GET"
1158
- }, a) : W(404, {
1225
+ }, a) : G(404, {
1159
1226
  error: "unknown schedules endpoint",
1160
1227
  path: i
1161
1228
  }, a);
1162
- }, Rt = async (e, t, n, r = {}) => {
1163
- if (K(e) !== "/_voltro/inspect/cluster") return null;
1164
- let i = G(n.origin ?? n.Origin);
1165
- if (H()) return W(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, i);
1166
- let a = (r.authResolver ?? U)(n);
1167
- if (!a.ok) return W(401, {
1229
+ }, Xt = async (e, t, n, r = {}) => {
1230
+ if (q(e) !== "/_voltro/inspect/cluster") return null;
1231
+ let i = K(n.origin ?? n.Origin);
1232
+ if (U()) return G(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, i);
1233
+ let a = (r.authResolver ?? W)(n);
1234
+ if (!a.ok) return G(401, {
1168
1235
  error: "unauthorized",
1169
1236
  reason: a.reason
1170
1237
  }, i);
1171
- if (t.kind !== "api") return W(404, { error: "cluster is api-only" }, i);
1172
- if ((r.method ?? "GET").toUpperCase() !== "GET") return W(405, {
1238
+ if (t.kind !== "api") return G(404, { error: "cluster is api-only" }, i);
1239
+ if ((r.method ?? "GET").toUpperCase() !== "GET") return G(405, {
1173
1240
  error: "method not allowed",
1174
1241
  expected: "GET"
1175
1242
  }, i);
1176
- if (!t.cluster) return W(200, {
1243
+ if (!t.cluster) return G(200, {
1177
1244
  instance: {
1178
1245
  replicaId: process.env.POD_NAME ?? process.env.HOSTNAME ?? `dev-${process.pid}`,
1179
1246
  dialect: "memory",
@@ -1198,163 +1265,163 @@ __installPublicEnv(publicEnvValues)
1198
1265
  capturedAt: Date.now()
1199
1266
  }, i);
1200
1267
  try {
1201
- return W(200, await t.cluster(), i);
1268
+ return G(200, await t.cluster(), i);
1202
1269
  } catch (e) {
1203
- return W(500, {
1270
+ return G(500, {
1204
1271
  error: "cluster snapshot failed",
1205
1272
  message: e?.message ?? String(e)
1206
1273
  }, i);
1207
1274
  }
1208
- }, zt = async (e, t, n, r = {}) => {
1209
- let i = K(e).match(/^\/_voltro\/inspect\/workflows\/runs\/([^/]+)\/steps$/);
1275
+ }, Zt = async (e, t, n, r = {}) => {
1276
+ let i = q(e).match(/^\/_voltro\/inspect\/workflows\/runs\/([^/]+)\/steps$/);
1210
1277
  if (!i) return null;
1211
- let a = decodeURIComponent(i[1] ?? ""), o = G(n.origin ?? n.Origin);
1212
- if ((r.method ?? "GET").toUpperCase() !== "GET") return W(405, {
1278
+ let a = decodeURIComponent(i[1] ?? ""), o = K(n.origin ?? n.Origin);
1279
+ if ((r.method ?? "GET").toUpperCase() !== "GET") return G(405, {
1213
1280
  error: "method not allowed",
1214
1281
  expected: "GET"
1215
1282
  }, o);
1216
- if (H()) return W(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, o);
1217
- let s = (r.authResolver ?? U)(n);
1218
- if (!s.ok) return W(401, {
1283
+ if (U()) return G(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, o);
1284
+ let s = (r.authResolver ?? W)(n);
1285
+ if (!s.ok) return G(401, {
1219
1286
  error: "unauthorized",
1220
1287
  reason: s.reason
1221
1288
  }, o);
1222
- if (t.kind !== "api") return W(404, { error: "workflow steps are api-only" }, o);
1223
- if (t.inspectWorkflowRunSteps === void 0) return W(200, { steps: [] }, o);
1289
+ if (t.kind !== "api") return G(404, { error: "workflow steps are api-only" }, o);
1290
+ if (t.inspectWorkflowRunSteps === void 0) return G(200, { steps: [] }, o);
1224
1291
  try {
1225
- return W(200, await t.inspectWorkflowRunSteps({ runId: a }), o);
1292
+ return G(200, await t.inspectWorkflowRunSteps({ runId: a }), o);
1226
1293
  } catch (e) {
1227
- return W(500, {
1294
+ return G(500, {
1228
1295
  error: "steps query failed",
1229
1296
  message: e?.message ?? String(e)
1230
1297
  }, o);
1231
1298
  }
1232
- }, Bt = async (e, t, n, r = {}) => {
1233
- let i = K(e).match(/^\/_voltro\/inspect\/workflows\/runs\/([^/]+)\/events$/);
1299
+ }, Qt = async (e, t, n, r = {}) => {
1300
+ let i = q(e).match(/^\/_voltro\/inspect\/workflows\/runs\/([^/]+)\/events$/);
1234
1301
  if (!i) return null;
1235
- let a = decodeURIComponent(i[1] ?? ""), o = G(n.origin ?? n.Origin);
1236
- if ((r.method ?? "GET").toUpperCase() !== "GET") return W(405, {
1302
+ let a = decodeURIComponent(i[1] ?? ""), o = K(n.origin ?? n.Origin);
1303
+ if ((r.method ?? "GET").toUpperCase() !== "GET") return G(405, {
1237
1304
  error: "method not allowed",
1238
1305
  expected: "GET"
1239
1306
  }, o);
1240
- if (H()) return W(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, o);
1241
- let s = (r.authResolver ?? U)(n);
1242
- if (!s.ok) return W(401, {
1307
+ if (U()) return G(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, o);
1308
+ let s = (r.authResolver ?? W)(n);
1309
+ if (!s.ok) return G(401, {
1243
1310
  error: "unauthorized",
1244
1311
  reason: s.reason
1245
1312
  }, o);
1246
- if (t.kind !== "api") return W(404, { error: "workflow events are api-only" }, o);
1247
- if (t.inspectWorkflowRunEvents === void 0) return W(200, { events: [] }, o);
1313
+ if (t.kind !== "api") return G(404, { error: "workflow events are api-only" }, o);
1314
+ if (t.inspectWorkflowRunEvents === void 0) return G(200, { events: [] }, o);
1248
1315
  try {
1249
- return W(200, await t.inspectWorkflowRunEvents({ runId: a }), o);
1316
+ return G(200, await t.inspectWorkflowRunEvents({ runId: a }), o);
1250
1317
  } catch (e) {
1251
- return W(500, {
1318
+ return G(500, {
1252
1319
  error: "events query failed",
1253
1320
  message: e?.message ?? String(e)
1254
1321
  }, o);
1255
1322
  }
1256
- }, Vt = async (e, t, n, r = {}) => {
1257
- if (K(t) !== "/_voltro/inspect/workflows/events") return null;
1258
- let i = G(n.origin ?? n.Origin);
1259
- if ((r.method ?? "GET").toUpperCase() !== "GET") return W(405, {
1323
+ }, $t = async (e, t, n, r = {}) => {
1324
+ if (q(t) !== "/_voltro/inspect/workflows/events") return null;
1325
+ let i = K(n.origin ?? n.Origin);
1326
+ if ((r.method ?? "GET").toUpperCase() !== "GET") return G(405, {
1260
1327
  error: "method not allowed",
1261
1328
  expected: "GET"
1262
1329
  }, i);
1263
- if (H()) return W(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, i);
1264
- let a = (r.authResolver ?? U)(n);
1265
- if (!a.ok) return W(401, {
1330
+ if (U()) return G(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, i);
1331
+ let a = (r.authResolver ?? W)(n);
1332
+ if (!a.ok) return G(401, {
1266
1333
  error: "unauthorized",
1267
1334
  reason: a.reason
1268
1335
  }, i);
1269
- if (e.kind !== "api") return W(404, { error: "workflow domain events are api-only" }, i);
1270
- if (e.inspectWorkflowDomainEvents === void 0) return W(200, {
1336
+ if (e.kind !== "api") return G(404, { error: "workflow domain events are api-only" }, i);
1337
+ if (e.inspectWorkflowDomainEvents === void 0) return G(200, {
1271
1338
  events: [],
1272
1339
  total: 0,
1273
1340
  offset: 0,
1274
1341
  limit: 100
1275
1342
  }, i);
1276
- let o = Tt(t), s = o.get("name") ?? void 0, c = Number(o.get("offset") ?? "0"), l = Number(o.get("limit") ?? "100");
1343
+ let o = Lt(t), s = o.get("name") ?? void 0, c = Number(o.get("offset") ?? "0"), l = Number(o.get("limit") ?? "100");
1277
1344
  try {
1278
- return W(200, await e.inspectWorkflowDomainEvents({
1345
+ return G(200, await e.inspectWorkflowDomainEvents({
1279
1346
  ...s !== void 0 && s !== "" ? { name: s } : {},
1280
1347
  offset: Number.isFinite(c) ? c : 0,
1281
1348
  limit: Number.isFinite(l) ? l : 100
1282
1349
  }), i);
1283
1350
  } catch (e) {
1284
- return W(500, {
1351
+ return G(500, {
1285
1352
  error: "workflow domain events query failed",
1286
1353
  message: e?.message ?? String(e)
1287
1354
  }, i);
1288
1355
  }
1289
- }, Ht = async (e, t, n, r = {}) => {
1290
- let i = K(t).match(/^\/_voltro\/inspect\/workflows\/events\/([^/]+)\/deliveries$/);
1356
+ }, en = async (e, t, n, r = {}) => {
1357
+ let i = q(t).match(/^\/_voltro\/inspect\/workflows\/events\/([^/]+)\/deliveries$/);
1291
1358
  if (!i) return null;
1292
- let a = decodeURIComponent(i[1] ?? ""), o = G(n.origin ?? n.Origin);
1293
- if ((r.method ?? "GET").toUpperCase() !== "GET") return W(405, {
1359
+ let a = decodeURIComponent(i[1] ?? ""), o = K(n.origin ?? n.Origin);
1360
+ if ((r.method ?? "GET").toUpperCase() !== "GET") return G(405, {
1294
1361
  error: "method not allowed",
1295
1362
  expected: "GET"
1296
1363
  }, o);
1297
- if (H()) return W(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, o);
1298
- let s = (r.authResolver ?? U)(n);
1299
- if (!s.ok) return W(401, {
1364
+ if (U()) return G(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, o);
1365
+ let s = (r.authResolver ?? W)(n);
1366
+ if (!s.ok) return G(401, {
1300
1367
  error: "unauthorized",
1301
1368
  reason: s.reason
1302
1369
  }, o);
1303
- if (e.kind !== "api") return W(404, { error: "workflow event deliveries are api-only" }, o);
1304
- if (e.inspectWorkflowEventDeliveries === void 0) return W(200, { deliveries: [] }, o);
1370
+ if (e.kind !== "api") return G(404, { error: "workflow event deliveries are api-only" }, o);
1371
+ if (e.inspectWorkflowEventDeliveries === void 0) return G(200, { deliveries: [] }, o);
1305
1372
  try {
1306
- return W(200, await e.inspectWorkflowEventDeliveries({ eventId: a }), o);
1373
+ return G(200, await e.inspectWorkflowEventDeliveries({ eventId: a }), o);
1307
1374
  } catch (e) {
1308
- return W(500, {
1375
+ return G(500, {
1309
1376
  error: "workflow event deliveries query failed",
1310
1377
  message: e?.message ?? String(e)
1311
1378
  }, o);
1312
1379
  }
1313
- }, Ut = async (e, t, n, r = {}) => {
1314
- if (K(e) !== "/_voltro/inspect/workflows/children") return null;
1315
- let i = G(n.origin ?? n.Origin);
1316
- if ((r.method ?? "GET").toUpperCase() !== "GET") return W(405, {
1380
+ }, tn = async (e, t, n, r = {}) => {
1381
+ if (q(e) !== "/_voltro/inspect/workflows/children") return null;
1382
+ let i = K(n.origin ?? n.Origin);
1383
+ if ((r.method ?? "GET").toUpperCase() !== "GET") return G(405, {
1317
1384
  error: "method not allowed",
1318
1385
  expected: "GET"
1319
1386
  }, i);
1320
- if (H()) return W(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, i);
1321
- let a = (r.authResolver ?? U)(n);
1322
- if (!a.ok) return W(401, {
1387
+ if (U()) return G(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, i);
1388
+ let a = (r.authResolver ?? W)(n);
1389
+ if (!a.ok) return G(401, {
1323
1390
  error: "unauthorized",
1324
1391
  reason: a.reason
1325
1392
  }, i);
1326
- if (t.kind !== "api") return W(404, { error: "workflow children are api-only" }, i);
1327
- let o = q(e).get("parentExecutionId");
1328
- if (o === null || o === "") return W(400, { error: "parentExecutionId query param required" }, i);
1329
- if (t.inspectWorkflowChildren === void 0) return W(200, {
1393
+ if (t.kind !== "api") return G(404, { error: "workflow children are api-only" }, i);
1394
+ let o = J(e).get("parentExecutionId");
1395
+ if (o === null || o === "") return G(400, { error: "parentExecutionId query param required" }, i);
1396
+ if (t.inspectWorkflowChildren === void 0) return G(200, {
1330
1397
  runs: [],
1331
1398
  total: 0,
1332
1399
  offset: 0,
1333
1400
  limit: 200
1334
1401
  }, i);
1335
1402
  try {
1336
- return W(200, await t.inspectWorkflowChildren({ parentExecutionId: o }), i);
1403
+ return G(200, await t.inspectWorkflowChildren({ parentExecutionId: o }), i);
1337
1404
  } catch (e) {
1338
- return W(500, {
1405
+ return G(500, {
1339
1406
  error: "children query failed",
1340
1407
  message: e?.message ?? String(e)
1341
1408
  }, i);
1342
1409
  }
1343
- }, Wt = async (e, t, n, r, i = {}) => {
1344
- let a = K(e).match(/^\/_voltro\/inspect\/workflows\/runs\/([^/]+)\/(cancel|retry|suspend|resume|signal|update)$/);
1410
+ }, nn = async (e, t, n, r, i = {}) => {
1411
+ let a = q(e).match(/^\/_voltro\/inspect\/workflows\/runs\/([^/]+)\/(cancel|retry|suspend|resume|signal|update)$/);
1345
1412
  if (!a) return null;
1346
- let o = decodeURIComponent(a[1] ?? ""), s = a[2], c = G(n.origin ?? n.Origin);
1347
- if ((i.method ?? "POST").toUpperCase() !== "POST") return W(405, {
1413
+ let o = decodeURIComponent(a[1] ?? ""), s = a[2], c = K(n.origin ?? n.Origin);
1414
+ if ((i.method ?? "POST").toUpperCase() !== "POST") return G(405, {
1348
1415
  error: "method not allowed",
1349
1416
  expected: "POST"
1350
1417
  }, c);
1351
- if (H()) return W(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, c);
1352
- let l = (i.authResolver ?? U)(n);
1353
- if (!l.ok) return W(401, {
1418
+ if (U()) return G(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, c);
1419
+ let l = (i.authResolver ?? W)(n);
1420
+ if (!l.ok) return G(401, {
1354
1421
  error: "unauthorized",
1355
1422
  reason: l.reason
1356
1423
  }, c);
1357
- if (t.kind !== "api") return W(404, { error: "workflow actions are api-only" }, c);
1424
+ if (t.kind !== "api") return G(404, { error: "workflow actions are api-only" }, c);
1358
1425
  let u = {
1359
1426
  cancel: t.inspectCancelWorkflowRun,
1360
1427
  retry: t.inspectRetryWorkflowRun,
@@ -1363,16 +1430,16 @@ __installPublicEnv(publicEnvValues)
1363
1430
  signal: t.inspectSignalWorkflowRun,
1364
1431
  update: t.inspectUpdateWorkflowRun
1365
1432
  }[s];
1366
- if (!u) return W(404, { error: `inspect${s[0]?.toUpperCase() ?? ""}${s.slice(1)}WorkflowRun not configured` }, c);
1433
+ if (!u) return G(404, { error: `inspect${s[0]?.toUpperCase() ?? ""}${s.slice(1)}WorkflowRun not configured` }, c);
1367
1434
  let d, f, p, m, h, g;
1368
1435
  if (r.length > 0) try {
1369
1436
  let e = JSON.parse(r);
1370
1437
  s === "retry" && (d = e.payloadOverride), s === "signal" && (typeof e.signalName == "string" && e.signalName.length > 0 && (f = e.signalName), p = e.payload), s === "update" && (typeof e.updateName == "string" && e.updateName.length > 0 && (m = e.updateName), h = e.payload, typeof e.timeoutMs == "number" && Number.isFinite(e.timeoutMs) && (g = e.timeoutMs));
1371
1438
  } catch {}
1372
- if (s === "signal" && f === void 0) return W(400, { error: "signal requires JSON body `{ signalName: string, payload?: unknown }`" }, c);
1373
- if (s === "update" && m === void 0) return W(400, { error: "update requires JSON body `{ updateName: string, payload?: unknown, timeoutMs?: number }`" }, c);
1439
+ if (s === "signal" && f === void 0) return G(400, { error: "signal requires JSON body `{ signalName: string, payload?: unknown }`" }, c);
1440
+ if (s === "update" && m === void 0) return G(400, { error: "update requires JSON body `{ updateName: string, payload?: unknown, timeoutMs?: number }`" }, c);
1374
1441
  try {
1375
- return W(200, s === "retry" && d !== void 0 ? await u({
1442
+ return G(200, s === "retry" && d !== void 0 ? await u({
1376
1443
  runId: o,
1377
1444
  payloadOverride: d
1378
1445
  }) : s === "signal" ? await u({
@@ -1386,71 +1453,71 @@ __installPublicEnv(publicEnvValues)
1386
1453
  ...g === void 0 ? {} : { timeoutMs: g }
1387
1454
  }) : await u({ runId: o }), c);
1388
1455
  } catch (e) {
1389
- return W(500, {
1456
+ return G(500, {
1390
1457
  error: `${s} failed`,
1391
1458
  message: e?.message ?? String(e)
1392
1459
  }, c);
1393
1460
  }
1394
- }, Gt = async (e, t, n, r, i = {}) => {
1395
- if (K(e) !== "/_voltro/inspect/data/import" || (i.method ?? "POST").toUpperCase() !== "POST") return null;
1396
- let a = G(n.origin ?? n.Origin);
1397
- if (H()) return W(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, a);
1398
- let o = (i.authResolver ?? U)(n);
1399
- if (!o.ok) return W(401, {
1461
+ }, rn = async (e, t, n, r, i = {}) => {
1462
+ if (q(e) !== "/_voltro/inspect/data/import" || (i.method ?? "POST").toUpperCase() !== "POST") return null;
1463
+ let a = K(n.origin ?? n.Origin);
1464
+ if (U()) return G(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, a);
1465
+ let o = (i.authResolver ?? W)(n);
1466
+ if (!o.ok) return G(401, {
1400
1467
  error: "unauthorized",
1401
1468
  reason: o.reason
1402
1469
  }, a);
1403
- if (t.kind !== "api") return W(404, { error: "data import is api-only" }, a);
1404
- if (!t.inspectImport) return W(404, { error: "inspectImport not configured" }, a);
1470
+ if (t.kind !== "api") return G(404, { error: "data import is api-only" }, a);
1471
+ if (!t.inspectImport) return G(404, { error: "inspectImport not configured" }, a);
1405
1472
  let s;
1406
1473
  try {
1407
1474
  s = JSON.parse(r || "{}");
1408
1475
  } catch {
1409
- return W(400, { error: "body must be JSON" }, a);
1476
+ return G(400, { error: "body must be JSON" }, a);
1410
1477
  }
1411
- if (typeof s.bundleDir != "string" || !s.bundleDir) return W(400, { error: "body.bundleDir (string) is required" }, a);
1478
+ if (typeof s.bundleDir != "string" || !s.bundleDir) return G(400, { error: "body.bundleDir (string) is required" }, a);
1412
1479
  try {
1413
- return W(200, await t.inspectImport({
1480
+ return G(200, await t.inspectImport({
1414
1481
  bundleDir: s.bundleDir,
1415
1482
  ...s.mode === "upsert" || s.mode === "append" || s.mode === "replace" ? { mode: s.mode } : {},
1416
1483
  ...s.onConflict === "skip" || s.onConflict === "fail" ? { onConflict: s.onConflict } : {},
1417
1484
  ...typeof s.atomic == "boolean" ? { atomic: s.atomic } : {}
1418
1485
  }), a);
1419
1486
  } catch (e) {
1420
- return W(500, {
1487
+ return G(500, {
1421
1488
  error: "import failed",
1422
1489
  message: e?.message ?? String(e)
1423
1490
  }, a);
1424
1491
  }
1425
- }, Kt = async (e, t, n, r, i = {}) => {
1426
- let a = K(e);
1492
+ }, an = async (e, t, n, r, i = {}) => {
1493
+ let a = q(e);
1427
1494
  if (!a.startsWith("/_voltro/inspect/data/rows")) return null;
1428
1495
  let o = (i.method ?? "POST").toUpperCase();
1429
1496
  if (o === "GET" && a === "/_voltro/inspect/data/rows") return null;
1430
- let s = G(n.origin ?? n.Origin);
1431
- if (H()) return W(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, s);
1432
- let c = (i.authResolver ?? U)(n);
1433
- if (!c.ok) return W(401, {
1497
+ let s = K(n.origin ?? n.Origin);
1498
+ if (U()) return G(503, { error: "inspect disabled (VOLTRO_INSPECT=off)" }, s);
1499
+ let c = (i.authResolver ?? W)(n);
1500
+ if (!c.ok) return G(401, {
1434
1501
  error: "unauthorized",
1435
1502
  reason: c.reason
1436
1503
  }, s);
1437
- if (t.kind !== "api") return W(404, { error: "data viewer is api-only" }, s);
1504
+ if (t.kind !== "api") return G(404, { error: "data viewer is api-only" }, s);
1438
1505
  if (o === "POST" && a === "/_voltro/inspect/data/rows") {
1439
- if (!t.inspectInsertRow) return W(404, { error: "inspectInsertRow not configured" }, s);
1506
+ if (!t.inspectInsertRow) return G(404, { error: "inspectInsertRow not configured" }, s);
1440
1507
  let e;
1441
1508
  try {
1442
1509
  e = JSON.parse(r || "{}");
1443
1510
  } catch {
1444
- return W(400, { error: "body must be JSON" }, s);
1511
+ return G(400, { error: "body must be JSON" }, s);
1445
1512
  }
1446
- if (typeof e.table != "string" || !e.row || typeof e.row != "object") return W(400, { error: "body must be { table: string, row: object }" }, s);
1513
+ if (typeof e.table != "string" || !e.row || typeof e.row != "object") return G(400, { error: "body must be { table: string, row: object }" }, s);
1447
1514
  try {
1448
- return W(200, await t.inspectInsertRow({
1515
+ return G(200, await t.inspectInsertRow({
1449
1516
  table: e.table,
1450
1517
  row: e.row
1451
1518
  }), s);
1452
1519
  } catch (e) {
1453
- return W(500, {
1520
+ return G(500, {
1454
1521
  error: "insert failed",
1455
1522
  message: e?.message ?? String(e)
1456
1523
  }, s);
@@ -1459,50 +1526,50 @@ __installPublicEnv(publicEnvValues)
1459
1526
  let l = a.match(/^\/_voltro\/inspect\/data\/rows\/([^/]+)$/);
1460
1527
  if (!l) return null;
1461
1528
  let u = decodeURIComponent(l[1] ?? "");
1462
- if (!u) return W(400, { error: "row id is required in URL" }, s);
1463
- let d = q(e).get("table") ?? "";
1464
- if (!d) return W(400, { error: "query.table is required" }, s);
1529
+ if (!u) return G(400, { error: "row id is required in URL" }, s);
1530
+ let d = J(e).get("table") ?? "";
1531
+ if (!d) return G(400, { error: "query.table is required" }, s);
1465
1532
  if (o === "PATCH") {
1466
- if (!t.inspectUpdateRow) return W(404, { error: "inspectUpdateRow not configured" }, s);
1533
+ if (!t.inspectUpdateRow) return G(404, { error: "inspectUpdateRow not configured" }, s);
1467
1534
  let e;
1468
1535
  try {
1469
1536
  e = JSON.parse(r || "{}");
1470
1537
  } catch {
1471
- return W(400, { error: "body must be JSON" }, s);
1538
+ return G(400, { error: "body must be JSON" }, s);
1472
1539
  }
1473
- if (!e.patch || typeof e.patch != "object") return W(400, { error: "body.patch must be an object" }, s);
1540
+ if (!e.patch || typeof e.patch != "object") return G(400, { error: "body.patch must be an object" }, s);
1474
1541
  try {
1475
- return W(200, await t.inspectUpdateRow({
1542
+ return G(200, await t.inspectUpdateRow({
1476
1543
  table: d,
1477
1544
  id: u,
1478
1545
  patch: e.patch
1479
1546
  }), s);
1480
1547
  } catch (e) {
1481
- return W(500, {
1548
+ return G(500, {
1482
1549
  error: "update failed",
1483
1550
  message: e?.message ?? String(e)
1484
1551
  }, s);
1485
1552
  }
1486
1553
  }
1487
1554
  if (o === "DELETE") {
1488
- if (!t.inspectDeleteRow) return W(404, { error: "inspectDeleteRow not configured" }, s);
1555
+ if (!t.inspectDeleteRow) return G(404, { error: "inspectDeleteRow not configured" }, s);
1489
1556
  try {
1490
- return W(200, await t.inspectDeleteRow({
1557
+ return G(200, await t.inspectDeleteRow({
1491
1558
  table: d,
1492
1559
  id: u
1493
1560
  }), s);
1494
1561
  } catch (e) {
1495
- return W(500, {
1562
+ return G(500, {
1496
1563
  error: "delete failed",
1497
1564
  message: e?.message ?? String(e)
1498
1565
  }, s);
1499
1566
  }
1500
1567
  }
1501
- return W(405, {
1568
+ return G(405, {
1502
1569
  error: "method not allowed",
1503
1570
  expected: "POST | PATCH | DELETE"
1504
1571
  }, s);
1505
- }, qt = 256, Jt = (e = qt) => {
1572
+ }, on = 256, sn = (e = on) => {
1506
1573
  let t = [], n = /* @__PURE__ */ new Set();
1507
1574
  return {
1508
1575
  emit(r, i) {
@@ -1525,27 +1592,27 @@ __installPublicEnv(publicEnvValues)
1525
1592
  return t.slice();
1526
1593
  }
1527
1594
  };
1528
- }, Yt = (e) => `event: ${e.channel}\ndata: ${JSON.stringify(e)}\n\n`, Xt = () => `: keep-alive ${Date.now()}\n\n`, Zt = {
1595
+ }, cn = (e) => `event: ${e.channel}\ndata: ${JSON.stringify(e)}\n\n`, ln = () => `: keep-alive ${Date.now()}\n\n`, un = {
1529
1596
  trace: 0,
1530
1597
  debug: 1,
1531
1598
  info: 2,
1532
1599
  warn: 3,
1533
1600
  error: 4,
1534
1601
  fatal: 5
1535
- }, Qt = 2e3, $t = 200, en = class {
1602
+ }, dn = 2e3, fn = 200, pn = class {
1536
1603
  capacity;
1537
1604
  buffer = [];
1538
- constructor(e = Qt) {
1605
+ constructor(e = dn) {
1539
1606
  this.capacity = e;
1540
1607
  }
1541
1608
  append(e) {
1542
1609
  this.buffer.push(e), this.buffer.length > this.capacity && this.buffer.shift();
1543
1610
  }
1544
1611
  query(e = {}) {
1545
- let t = e.since ?? 0, n = e.until ?? Date.now(), r = Math.min(e.max ?? $t, this.capacity), i = e.minLevel === void 0 ? Zt.trace : Zt[e.minLevel], a = e.scope?.toLowerCase(), o = e.source, s = e.filter?.toLowerCase(), c = e.traceId, l = [];
1612
+ let t = e.since ?? 0, n = e.until ?? Date.now(), r = Math.min(e.max ?? fn, this.capacity), i = e.minLevel === void 0 ? un.trace : un[e.minLevel], a = e.scope?.toLowerCase(), o = e.source, s = e.filter?.toLowerCase(), c = e.traceId, l = [];
1546
1613
  for (let e = this.buffer.length - 1; e >= 0 && l.length < r; e--) {
1547
1614
  let r = this.buffer[e];
1548
- r.ts < t || r.ts > n || Zt[r.level] < i || o !== void 0 && r.source !== o || a !== void 0 && (r.scope === void 0 || !r.scope.toLowerCase().includes(a)) || s !== void 0 && !r.message.toLowerCase().includes(s) || c !== void 0 && r.fields.traceId !== c || l.push(r);
1615
+ r.ts < t || r.ts > n || un[r.level] < i || o !== void 0 && r.source !== o || a !== void 0 && (r.scope === void 0 || !r.scope.toLowerCase().includes(a)) || s !== void 0 && !r.message.toLowerCase().includes(s) || c !== void 0 && r.fields.traceId !== c || l.push(r);
1549
1616
  }
1550
1617
  return l.reverse();
1551
1618
  }
@@ -1558,7 +1625,7 @@ __installPublicEnv(publicEnvValues)
1558
1625
  clear() {
1559
1626
  this.buffer = [];
1560
1627
  }
1561
- }, tn = null, nn = () => (tn === null && (tn = new en()), tn), rn = (e) => {
1628
+ }, mn = null, hn = () => (mn === null && (mn = new pn()), mn), gn = (e) => {
1562
1629
  if (typeof e == "string") return e;
1563
1630
  if (e instanceof Error) return e.message;
1564
1631
  try {
@@ -1566,18 +1633,18 @@ __installPublicEnv(publicEnvValues)
1566
1633
  } catch {
1567
1634
  return String(e);
1568
1635
  }
1569
- }, an = (e) => {
1636
+ }, _n = (e) => {
1570
1637
  let t = {
1571
1638
  log: console.log.bind(console),
1572
1639
  info: console.info.bind(console),
1573
1640
  warn: console.warn.bind(console),
1574
1641
  error: console.error.bind(console),
1575
1642
  debug: console.debug.bind(console)
1576
- }, n = nn(), r = !1, i = (i) => (...a) => {
1643
+ }, n = hn(), r = !1, i = (i) => (...a) => {
1577
1644
  if (t[i](...a), !r) {
1578
1645
  r = !0;
1579
1646
  try {
1580
- let t = a.length > 0 ? rn(a[0]) : "", r = t.length > 500 ? t.slice(0, 500) + "…" : t, o = O();
1647
+ let t = a.length > 0 ? gn(a[0]) : "", r = t.length > 500 ? t.slice(0, 500) + "…" : t, o = O();
1581
1648
  e.emit("log", {
1582
1649
  level: i,
1583
1650
  message: r,
@@ -1635,24 +1702,24 @@ __installPublicEnv(publicEnvValues)
1635
1702
  return () => {
1636
1703
  console.log = t.log, console.info = t.info, console.warn = t.warn, console.error = t.error, console.debug = t.debug, a();
1637
1704
  };
1638
- }, on = 2e3, sn = 8, cn = 1e3, ln = 200, Y = (e, t) => e.length > t ? `${e.slice(0, t)}…` : e, un = (e) => {
1705
+ }, vn = 2e3, yn = 8, bn = 1e3, xn = 200, X = (e, t) => e.length > t ? `${e.slice(0, t)}…` : e, Sn = (e) => {
1639
1706
  switch (e) {
1640
1707
  case "error": return "error";
1641
1708
  case "warn": return "warn";
1642
1709
  case "debug": return "debug";
1643
1710
  default: return "info";
1644
1711
  }
1645
- }, dn = g({ scope: "client" }), fn = (e, t) => {
1712
+ }, Cn = g({ scope: "client" }), wn = (e, t) => {
1646
1713
  let n;
1647
1714
  try {
1648
1715
  n = JSON.parse(e);
1649
1716
  } catch {
1650
- return pn(400, { error: "invalid JSON body" });
1717
+ return Tn(400, { error: "invalid JSON body" });
1651
1718
  }
1652
- if (typeof n != "object" || !n) return pn(400, { error: "body must be a JSON object" });
1719
+ if (typeof n != "object" || !n) return Tn(400, { error: "body must be a JSON object" });
1653
1720
  let r = n;
1654
- if (!Array.isArray(r.entries)) return pn(400, { error: "entries must be an array" });
1655
- let i = typeof r.app == "string" ? Y(r.app, 120) : void 0, a = typeof r.page == "string" ? Y(r.page, 200) : void 0, o = typeof r.ua == "string" ? Y(r.ua, 200) : void 0, s = r.entries.slice(0, ln), c = 0;
1721
+ if (!Array.isArray(r.entries)) return Tn(400, { error: "entries must be an array" });
1722
+ let i = typeof r.app == "string" ? X(r.app, 120) : void 0, a = typeof r.page == "string" ? X(r.page, 200) : void 0, o = typeof r.ua == "string" ? X(r.ua, 200) : void 0, s = r.entries.slice(0, xn), c = 0;
1656
1723
  for (let e of s) {
1657
1724
  if (typeof e != "object" || !e) continue;
1658
1725
  let n = e;
@@ -1663,7 +1730,7 @@ __installPublicEnv(publicEnvValues)
1663
1730
  "warn",
1664
1731
  "error",
1665
1732
  "debug"
1666
- ].includes(n.level) ? n.level : "log", s = typeof n.ts == "number" && Number.isFinite(n.ts) ? n.ts : Date.now(), l = Y(n.message, on), u = Array.isArray(n.args) ? n.args.slice(0, sn).filter((e) => typeof e == "string").map((e) => Y(e, cn)) : void 0, d = typeof n.stack == "string" ? Y(n.stack, on) : void 0;
1733
+ ].includes(n.level) ? n.level : "log", s = typeof n.ts == "number" && Number.isFinite(n.ts) ? n.ts : Date.now(), l = X(n.message, vn), u = Array.isArray(n.args) ? n.args.slice(0, yn).filter((e) => typeof e == "string").map((e) => X(e, bn)) : void 0, d = typeof n.stack == "string" ? X(n.stack, vn) : void 0;
1667
1734
  t.emit("clientLog", {
1668
1735
  ts: s,
1669
1736
  level: r,
@@ -1678,35 +1745,35 @@ __installPublicEnv(publicEnvValues)
1678
1745
  ...i === void 0 ? {} : { app: i },
1679
1746
  ...a === void 0 ? {} : { page: a },
1680
1747
  ...u !== void 0 && u.length > 0 ? { args: u } : {}
1681
- }, p = un(r);
1682
- (p === "error" || p === "warn") && d !== void 0 ? dn[p](l, f, { stack: d }) : dn[p](l, {
1748
+ }, p = Sn(r);
1749
+ (p === "error" || p === "warn") && d !== void 0 ? Cn[p](l, f, { stack: d }) : Cn[p](l, {
1683
1750
  ...f,
1684
1751
  ...d === void 0 ? {} : { stack: d }
1685
1752
  }), c++;
1686
1753
  }
1687
- return pn(202, {
1754
+ return Tn(202, {
1688
1755
  accepted: c,
1689
1756
  dropped: r.entries.length - c
1690
1757
  });
1691
- }, pn = (e, t) => ({
1758
+ }, Tn = (e, t) => ({
1692
1759
  status: e,
1693
1760
  contentType: "application/json; charset=utf-8",
1694
1761
  body: JSON.stringify(t)
1695
- }), mn = "/_voltro/inspect/clientLog", hn = [
1762
+ }), En = "/_voltro/inspect/clientLog", Dn = [
1696
1763
  "trace",
1697
1764
  "debug",
1698
1765
  "info",
1699
1766
  "warn",
1700
1767
  "error",
1701
1768
  "fatal"
1702
- ], gn = {
1769
+ ], On = {
1703
1770
  trace: "TRACE",
1704
1771
  debug: "DEBUG",
1705
1772
  info: "INFO ",
1706
1773
  warn: "WARN ",
1707
1774
  error: "ERROR",
1708
1775
  fatal: "FATAL"
1709
- }, _n = (e) => hn.includes(e), vn = (e, t) => {
1776
+ }, kn = (e) => Dn.includes(e), An = (e, t) => {
1710
1777
  let n = e.indexOf("?"), r = n === -1 ? new URLSearchParams() : new URLSearchParams(e.slice(n + 1)), i = {}, a = r.get("since");
1711
1778
  if (a !== null) {
1712
1779
  let e = Number(a);
@@ -1723,7 +1790,7 @@ __installPublicEnv(publicEnvValues)
1723
1790
  Number.isFinite(e) && e > 0 && (i.max = Math.floor(e));
1724
1791
  }
1725
1792
  let c = r.get("level");
1726
- c !== null && _n(c) && (i.minLevel = c);
1793
+ c !== null && kn(c) && (i.minLevel = c);
1727
1794
  let l = r.get("source");
1728
1795
  (l === "server" || l === "client") && (i.source = l);
1729
1796
  let u = r.get("scope");
@@ -1736,7 +1803,7 @@ __installPublicEnv(publicEnvValues)
1736
1803
  if ((r.get("format") ?? "json") === "text") return {
1737
1804
  status: 200,
1738
1805
  contentType: "text/plain; charset=utf-8",
1739
- body: p.map(yn).join("\n") + (p.length > 0 ? "\n" : "")
1806
+ body: p.map(jn).join("\n") + (p.length > 0 ? "\n" : "")
1740
1807
  };
1741
1808
  let m = {
1742
1809
  capturedAt: Date.now(),
@@ -1750,34 +1817,34 @@ __installPublicEnv(publicEnvValues)
1750
1817
  contentType: "application/json; charset=utf-8",
1751
1818
  body: JSON.stringify(m)
1752
1819
  };
1753
- }, yn = (e) => {
1754
- let t = new Date(e.ts), n = String(t.getHours()).padStart(2, "0"), r = String(t.getMinutes()).padStart(2, "0"), i = String(t.getSeconds()).padStart(2, "0"), a = String(t.getMilliseconds()).padStart(3, "0"), o = `[${e.scope ?? "?"}/${e.source}]`, s = xn(e.fields);
1755
- return `${n}:${r}:${i}.${a} ${gn[e.level]} ${o} ${e.message}${s}`;
1756
- }, bn = 80, xn = (e) => {
1820
+ }, jn = (e) => {
1821
+ let t = new Date(e.ts), n = String(t.getHours()).padStart(2, "0"), r = String(t.getMinutes()).padStart(2, "0"), i = String(t.getSeconds()).padStart(2, "0"), a = String(t.getMilliseconds()).padStart(3, "0"), o = `[${e.scope ?? "?"}/${e.source}]`, s = Nn(e.fields);
1822
+ return `${n}:${r}:${i}.${a} ${On[e.level]} ${o} ${e.message}${s}`;
1823
+ }, Mn = 80, Nn = (e) => {
1757
1824
  let t = Object.entries(e);
1758
1825
  if (t.length === 0) return "";
1759
1826
  let n = [];
1760
1827
  for (let [e, r] of t) {
1761
1828
  if (r === void 0) continue;
1762
- let t = Sn(r);
1829
+ let t = Pn(r);
1763
1830
  n.push(`${e}=${t}`);
1764
1831
  }
1765
1832
  return n.length > 0 ? " " + n.join(" ") : "";
1766
- }, Sn = (e) => {
1833
+ }, Pn = (e) => {
1767
1834
  if (typeof e == "string") {
1768
- let t = e.length > bn ? e.slice(0, bn) + "…" : e;
1835
+ let t = e.length > Mn ? e.slice(0, Mn) + "…" : e;
1769
1836
  return /[\s=]/.test(t) ? `"${t.replace(/"/g, "\\\"")}"` : t;
1770
1837
  }
1771
1838
  if (e === null) return "null";
1772
1839
  if (typeof e == "number" || typeof e == "boolean") return String(e);
1773
1840
  try {
1774
1841
  let t = JSON.stringify(e);
1775
- return t.length > bn ? t.slice(0, bn) + "…" : t;
1842
+ return t.length > Mn ? t.slice(0, Mn) + "…" : t;
1776
1843
  } catch {
1777
1844
  return "[unserialisable]";
1778
1845
  }
1779
- }, Cn = "/_voltro/inspect/logs", wn = g({ scope: "voltro:cli" }), Tn = [], En = (e) => {
1780
- Tn.length = 0;
1846
+ }, Fn = "/_voltro/inspect/logs", In = g({ scope: "voltro:cli" }), Ln = [], Rn = (e) => {
1847
+ Ln.length = 0;
1781
1848
  let r = e[1] && !e[1].startsWith("-") ? e[1] : void 0, i = r ? n(r) ? r : a(process.cwd(), r) : process.cwd(), o = [], s = i;
1782
1849
  for (;;) {
1783
1850
  o.push(s);
@@ -1788,7 +1855,7 @@ __installPublicEnv(publicEnvValues)
1788
1855
  for (let e of o) for (let t of [".env.local", ".env"]) {
1789
1856
  let n = a(e, t);
1790
1857
  if (y(n)) {
1791
- Tn.push(n);
1858
+ Ln.push(n);
1792
1859
  try {
1793
1860
  let e = C(n, "utf8");
1794
1861
  for (let t of e.split(/\r?\n/)) {
@@ -1800,15 +1867,15 @@ __installPublicEnv(publicEnvValues)
1800
1867
  (i.startsWith("\"") && i.endsWith("\"") || i.startsWith("'") && i.endsWith("'")) && (i = i.slice(1, -1)), process.env[r] === void 0 && (process.env[r] = i);
1801
1868
  }
1802
1869
  } catch (e) {
1803
- wn.warn("failed to load env file (continuing)", { path: n }, e);
1870
+ In.warn("failed to load env file (continuing)", { path: n }, e);
1804
1871
  }
1805
1872
  }
1806
1873
  }
1807
- }, Dn = 500, On = (e, t, n = {}) => {
1874
+ }, zn = 500, Bn = (e, t, n = {}) => {
1808
1875
  if (e.length === 0) return () => {};
1809
1876
  let r = (e) => n.root ? i(n.root, e) : e, a = !1, o = (e) => {
1810
1877
  a || (a = !0, t.warn(`.env changed (${r(e)}) — hard-restarting: process.env is read once at boot, a reload would keep stale values`, { file: r(e) }), Promise.resolve().then(() => n.onBeforeRestart?.()).catch((e) => t.warn(".env restart: onBeforeRestart failed (continuing)", {}, e)).finally(() => {
1811
- let e = le(process.execPath, [...process.execArgv, ...process.argv.slice(1)], {
1878
+ let e = de(process.execPath, [...process.execArgv, ...process.argv.slice(1)], {
1812
1879
  stdio: "inherit",
1813
1880
  env: process.env,
1814
1881
  cwd: n.cwd ?? process.cwd()
@@ -1822,16 +1889,16 @@ __installPublicEnv(publicEnvValues)
1822
1889
  });
1823
1890
  }));
1824
1891
  };
1825
- for (let t of e) D(t, { interval: Dn }, (e, n) => {
1892
+ for (let t of e) D(t, { interval: zn }, (e, n) => {
1826
1893
  e.mtimeMs !== n.mtimeMs && o(t);
1827
1894
  });
1828
1895
  return t.info("watching .env files for changes", {
1829
1896
  files: e.map(r),
1830
- intervalMs: Dn
1897
+ intervalMs: zn
1831
1898
  }), () => {
1832
1899
  for (let t of e) ee(t);
1833
1900
  };
1834
- }, kn = [{
1901
+ }, Vn = [{
1835
1902
  match: (e) => typeof e == "string" && e.startsWith("[BABEL] Note: The code generator has deoptimised"),
1836
1903
  handle: (e, t) => {
1837
1904
  let n = e[0], r = n.match(/deoptimised the styling of (.+?) as it exceeds the max of (\d+\w*B)\.?/);
@@ -1843,13 +1910,13 @@ __installPublicEnv(publicEnvValues)
1843
1910
  });
1844
1911
  } else t.info(n);
1845
1912
  }
1846
- }], An = () => {
1913
+ }], Hn = () => {
1847
1914
  let e = {
1848
1915
  warn: console.warn.bind(console),
1849
1916
  error: console.error.bind(console)
1850
1917
  }, t = g({ scope: "babel" }), n = !1, r = (r) => (...i) => {
1851
1918
  if (!n) {
1852
- for (let e of kn) if (e.match(i[0])) {
1919
+ for (let e of Vn) if (e.match(i[0])) {
1853
1920
  n = !0;
1854
1921
  try {
1855
1922
  e.handle(i, t);
@@ -1864,7 +1931,94 @@ __installPublicEnv(publicEnvValues)
1864
1931
  return console.warn = r("warn"), console.error = r("error"), () => {
1865
1932
  console.warn = e.warn, console.error = e.error;
1866
1933
  };
1867
- }, jn = "virtual:voltro-route-refresh", Mn = `\0${jn}`, Nn = /(?:^|&)(raw|url|inline|worker|sharedworker|direct)(?:&|=|$)/, Pn = () => "\n// GENERATED by @voltro/cli — the `voltro dev` route Fast Refresh runtime.\n\n/** Mirrors react-refresh's own `isLikelyComponentType` closely enough for the\n * decision we make with it: an uppercase-named function, or a React element\n * type object (memo / forwardRef / lazy carry `$$typeof`). */\nconst isComponentLike = (value) => {\n if (typeof value === 'function') {\n const name = value.displayName ?? value.name\n return typeof name === 'string' && /^[A-Z]/.test(name)\n }\n return typeof value === 'object' && value !== null && '$$typeof' in value\n}\n\n/** Value identity that survives module re-evaluation. A function is compared by\n * SOURCE TEXT — a re-evaluated but unedited `loader` is a brand-new object\n * with identical text — and everything else by its JSON form, so a `meta`\n * object literal does not read as changed on every edit. */\nconst stableForm = (value) => {\n if (typeof value === 'function') return 'fn:' + String(value)\n try { return 'js:' + JSON.stringify(value) } catch { return 'st:' + String(value) }\n}\n\n/** id (absolute file path, as react-refresh spells it) → export names that\n * react-refresh must NOT judge. */\nconst ignoredExports = new Map()\n\nexport const registerRouteModule = (id, moduleExports) => {\n const names = []\n for (const key of Object.keys(moduleExports)) {\n if (key === 'default') continue\n if (isComponentLike(moduleExports[key])) continue\n names.push(key)\n }\n ignoredExports.set(id, names)\n}\n\n/** The name of the first non-component export whose VALUE changed, or null when\n * this update is a pure component edit that Fast Refresh can apply in place. */\nexport const routeUpdateNeedsReload = (prevExports, nextExports) => {\n const keys = new Set([...Object.keys(prevExports), ...Object.keys(nextExports)])\n for (const key of keys) {\n if (key === 'default') continue\n const prev = prevExports[key]\n const next = nextExports[key]\n if (isComponentLike(prev) && isComponentLike(next)) continue\n if (stableForm(prev) !== stableForm(next)) return key\n }\n return null\n}\n\n// `globalThis`, not `window`: identical in the browser (which is the only place\n// this module is ever loaded) and it keeps the runtime evaluatable by the unit\n// test, which is what lets the test read the REAL source instead of a copy.\n// Chained rather than overwritten — another plugin may own the hook for its own\n// modules, and ours only answers for ids it registered.\nconst previousHook = globalThis.__getReactRefreshIgnoredExports\nglobalThis.__getReactRefreshIgnoredExports = (args) =>\n ignoredExports.get(args.id) ?? previousHook?.(args) ?? []\n", Fn = (e) => `
1934
+ }, Un = {
1935
+ loader: "it runs on the server, and the router caches its result per route + params",
1936
+ renderMode: "it picks the server render strategy",
1937
+ dynamic: "it picks the server render strategy",
1938
+ meta: "the server rendered it into <head>",
1939
+ getStaticPaths: "it enumerates which paths get prerendered",
1940
+ revalidate: "it sets the ISR cache window",
1941
+ staleWhileRevalidate: "it sets the ISR stale-while-revalidate window",
1942
+ cacheInvalidatesOn: "it wires this page into the ISR cache invalidator",
1943
+ interactive: "it decides how much client JS the server ships",
1944
+ tenantAware: "it is part of the server-side cache key"
1945
+ }, Wn = Object.keys(Un), Gn = "virtual:voltro-route-refresh", Kn = `\0${Gn}`, qn = /(?:^|&)(raw|url|inline|worker|sharedworker|direct)(?:&|=|$)/, Jn = () => `
1946
+ // GENERATED by @voltro/cli — the \`voltro dev\` route Fast Refresh runtime.
1947
+
1948
+ /** Mirrors react-refresh's own \`isLikelyComponentType\` closely enough for the
1949
+ * decision we make with it: an uppercase-named function, or a React element
1950
+ * type object (memo / forwardRef / lazy carry \`$$typeof\`). */
1951
+ const isComponentLike = (value) => {
1952
+ if (typeof value === 'function') {
1953
+ const name = value.displayName ?? value.name
1954
+ return typeof name === 'string' && /^[A-Z]/.test(name)
1955
+ }
1956
+ return typeof value === 'object' && value !== null && '$$typeof' in value
1957
+ }
1958
+
1959
+ /** Value identity that survives module re-evaluation. A function is compared by
1960
+ * SOURCE TEXT — a re-evaluated but unedited \`loader\` is a brand-new object
1961
+ * with identical text — and everything else by its JSON form, so a \`meta\`
1962
+ * object literal does not read as changed on every edit. */
1963
+ const stableForm = (value) => {
1964
+ if (typeof value === 'function') return 'fn:' + String(value)
1965
+ try { return 'js:' + JSON.stringify(value) } catch { return 'st:' + String(value) }
1966
+ }
1967
+
1968
+ /** The route-module exports the SERVER reads to produce the HTML — injected
1969
+ * from \`SERVER_RELEVANT_ROUTE_EXPORTS\`, which is derived from
1970
+ * \`computeRouteMetadata\`'s own parameter type so it cannot drift from the
1971
+ * readers (\`build.ts\` prerender, \`webDev.ts\` dev SSR, \`start.ts\`). A change to
1972
+ * one of THESE cannot be hot-applied: the server already ran with the old
1973
+ * value. Everything else a page exports is plain client-side data. */
1974
+ const serverRelevantExports = ${JSON.stringify(Wn)}
1975
+
1976
+ /** Name → the server step that already consumed it, so the reload message can
1977
+ * say WHY rather than just WHAT. Injected from the same single source. */
1978
+ const serverExportEffect = ${JSON.stringify(Un)}
1979
+
1980
+ /** The reason \`name\` forces a reload, for the console line. */
1981
+ export const serverEffectOf = (name) =>
1982
+ serverExportEffect[name] ?? 'the server reads it off the route module'
1983
+
1984
+ /** id (absolute file path, as react-refresh spells it) → export names that
1985
+ * react-refresh must NOT judge. */
1986
+ const ignoredExports = new Map()
1987
+
1988
+ export const registerRouteModule = (id, moduleExports) => {
1989
+ const names = []
1990
+ for (const key of Object.keys(moduleExports)) {
1991
+ if (key === 'default') continue
1992
+ if (isComponentLike(moduleExports[key])) continue
1993
+ names.push(key)
1994
+ }
1995
+ ignoredExports.set(id, names)
1996
+ }
1997
+
1998
+ /** The name of the first SERVER-RELEVANT export whose VALUE changed, or null
1999
+ * when this update is one Fast Refresh can apply in place — a component edit,
2000
+ * or a change to a page-local value the server never read.
2001
+ *
2002
+ * Only the server-relevant names are inspected. A plain value export
2003
+ * (\`const COLUMNS = [...]\`) changing is NOT a reason to throw the page away:
2004
+ * the module re-evaluates, the component renders with the new value, and any
2005
+ * other importer is Vite's own graph propagation to resolve. */
2006
+ export const routeUpdateNeedsReload = (prevExports, nextExports) => {
2007
+ for (const key of serverRelevantExports) {
2008
+ if (stableForm(prevExports[key]) !== stableForm(nextExports[key])) return key
2009
+ }
2010
+ return null
2011
+ }
2012
+
2013
+ // \`globalThis\`, not \`window\`: identical in the browser (which is the only place
2014
+ // this module is ever loaded) and it keeps the runtime evaluatable by the unit
2015
+ // test, which is what lets the test read the REAL source instead of a copy.
2016
+ // Chained rather than overwritten — another plugin may own the hook for its own
2017
+ // modules, and ours only answers for ids it registered.
2018
+ const previousHook = globalThis.__getReactRefreshIgnoredExports
2019
+ globalThis.__getReactRefreshIgnoredExports = (args) =>
2020
+ ignoredExports.get(args.id) ?? previousHook?.(args) ?? []
2021
+ `, Yn = (e) => `
1868
2022
  if (import.meta.hot) {
1869
2023
  // Self-import to read our OWN exports, the same technique the react plugin
1870
2024
  // uses; the namespace is only complete after evaluation, hence the promise.
@@ -1878,8 +2032,10 @@ if (import.meta.hot) {
1878
2032
  return
1879
2033
  }
1880
2034
  console.info(
1881
- '[voltro] full reload: non-component export \`' + changed + '\` changed in ' +
1882
- ${JSON.stringify(e)} + ' (a loader runs on the server too, so its result must be re-rendered)',
2035
+ '[voltro] full reload: \`' + changed + '\` changed in ' + ${JSON.stringify(e)} +
2036
+ ' the server READS that export (' + __voltro_serverEffect(changed) +
2037
+ '), and the page in front of you was produced from the old value, so it ' +
2038
+ 'must be re-rendered. Other exports of this module hot-update in place.',
1883
2039
  )
1884
2040
  window.location.reload()
1885
2041
  })
@@ -1888,72 +2044,49 @@ if (import.meta.hot) {
1888
2044
  import {
1889
2045
  registerRouteModule as __voltro_registerRouteModule,
1890
2046
  routeUpdateNeedsReload as __voltro_routeUpdateNeedsReload,
1891
- } from '${jn}'
1892
- `, In = (e) => e.replace(/\\/g, "/"), Ln = (e, t) => {
1893
- let [n = "", r] = In(e).split("?");
1894
- if (!n.endsWith(".tsx") || r !== void 0 && Nn.test(r)) return !1;
1895
- let i = In(t).replace(/\/$/, "");
2047
+ serverEffectOf as __voltro_serverEffect,
2048
+ } from '${Gn}'
2049
+ `, Xn = (e) => e.replace(/\\/g, "/"), Zn = (e, t) => {
2050
+ let [n = "", r] = Xn(e).split("?");
2051
+ if (!n.endsWith(".tsx") || r !== void 0 && qn.test(r)) return !1;
2052
+ let i = Xn(t).replace(/\/$/, "");
1896
2053
  return n.startsWith(`${i}/`);
1897
- }, Rn = (e, t, n) => Ln(t, n) ? `${e}${Fn(In(t).split("?")[0] ?? t)}` : null, zn = (e) => ({
2054
+ }, Qn = (e, t, n) => Zn(t, n) ? `${e}${Yn(Xn(t).split("?")[0] ?? t)}` : null, $n = (e) => ({
1898
2055
  name: "voltro:route-fast-refresh",
1899
2056
  enforce: "pre",
1900
- resolveId: (e) => e === "virtual:voltro-route-refresh" ? Mn : void 0,
1901
- load: (e) => e === Mn ? Pn() : void 0,
2057
+ resolveId: (e) => e === "virtual:voltro-route-refresh" ? Kn : void 0,
2058
+ load: (e) => e === Kn ? Jn() : void 0,
1902
2059
  transform: (t, n, r) => {
1903
2060
  if (r?.ssr === !0) return null;
1904
- let i = Rn(t, n, e);
2061
+ let i = Qn(t, n, e);
1905
2062
  return i === null ? null : {
1906
2063
  code: i,
1907
2064
  map: null
1908
2065
  };
1909
2066
  }
1910
- }), Bn = () => {
1911
- let e = /* @__PURE__ */ new Map();
1912
- return {
1913
- get(t) {
1914
- return e.get(t);
1915
- },
1916
- set(t, n) {
1917
- e.set(t, n);
1918
- },
1919
- invalidate(t) {
1920
- e.delete(t);
1921
- },
1922
- invalidateBy(t) {
1923
- let n = 0;
1924
- for (let r of e.keys()) t(r) && (e.delete(r), n++);
1925
- return n;
1926
- },
1927
- clear() {
1928
- e.clear();
1929
- },
1930
- size() {
1931
- return e.size;
1932
- },
1933
- snapshot() {
1934
- return Array.from(e.entries());
2067
+ }), er = /export\s+const\s+renderMode\s*(?::[^=]+)?=\s*['"]([^'"]*)['"]/, tr = (e) => er.exec(e)?.[1] ?? null, nr = async (e, t) => {
2068
+ let n = (await Promise.all(t.map(async (t) => {
2069
+ let n;
2070
+ try {
2071
+ n = await ne(r(e, t.file), "utf8");
2072
+ } catch {
2073
+ return null;
1935
2074
  }
1936
- };
1937
- }, Vn = (e) => {
1938
- if (typeof e == "number" && Number.isFinite(e) && e > 0) return e * 1e3;
1939
- if (typeof e != "string") return null;
1940
- let t = /^\s*(\d+)\s*(s|seconds?|m|minutes?|h|hours?|d|days?)\s*$/i.exec(e);
1941
- if (!t) return null;
1942
- let n = parseInt(t[1], 10);
1943
- if (!Number.isFinite(n) || n <= 0) return null;
1944
- let r = t[2].toLowerCase();
1945
- return r === "s" || r.startsWith("second") ? n * 1e3 : r === "m" || r.startsWith("minute") ? n * 6e4 : r === "h" || r.startsWith("hour") ? n * 36e5 : r === "d" || r.startsWith("day") ? n * 864e5 : null;
1946
- }, Hn = (e, t = {}) => {
1947
- let n = [e];
1948
- return t.tenant !== void 0 && t.tenant !== "" && n.push(`tenant=${t.tenant}`), t.locale !== void 0 && t.locale !== "" && n.push(`lang=${t.locale}`), n.join("|");
1949
- }, Un = (e, t) => e.expiresAt > t, Wn = (e, t) => e.expiresAt <= t && e.servableUntil > t, Gn = r(de(), ".voltro"), Kn = r(Gn, "runtime-registry.json"), qn = 3e4, Jn = () => {
2075
+ let i = tr(n);
2076
+ return i === null || Qe(i) ? null : {
2077
+ file: t.file,
2078
+ value: i
2079
+ };
2080
+ }))).filter((e) => e !== null);
2081
+ if (n.length !== 0) throw Error(n.map((e) => et(r("src", "pages", e.file), e.value)).join("\n\n"));
2082
+ }, rr = r(L(), ".voltro"), ir = r(rr, "runtime-registry.json"), ar = 3e4, or = () => {
1950
2083
  let e = Math.random().toString(36).slice(2, 10);
1951
- return `${Kn}.${process.pid}.${Date.now()}.${e}.tmp`;
1952
- }, Yn = async () => {
1953
- await S.mkdir(Gn, { recursive: !0 });
1954
- }, Xn = async () => {
2084
+ return `${ir}.${process.pid}.${Date.now()}.${e}.tmp`;
2085
+ }, sr = async () => {
2086
+ await S.mkdir(rr, { recursive: !0 });
2087
+ }, cr = async () => {
1955
2088
  try {
1956
- let e = await S.readFile(Kn, "utf8"), t = JSON.parse(e);
2089
+ let e = await S.readFile(ir, "utf8"), t = JSON.parse(e);
1957
2090
  return t.version !== 1 || !Array.isArray(t.apps) ? {
1958
2091
  version: 1,
1959
2092
  apps: []
@@ -1964,31 +2097,31 @@ import {
1964
2097
  apps: []
1965
2098
  };
1966
2099
  }
1967
- }, Zn = async (e) => {
1968
- await Yn();
1969
- let t = Jn();
2100
+ }, lr = async (e) => {
2101
+ await sr();
2102
+ let t = or();
1970
2103
  try {
1971
- await S.writeFile(t, JSON.stringify(e, null, 2), "utf8"), await S.rename(t, Kn);
2104
+ await S.writeFile(t, JSON.stringify(e, null, 2), "utf8"), await S.rename(t, ir);
1972
2105
  } catch (e) {
1973
2106
  try {
1974
2107
  await S.unlink(t);
1975
2108
  } catch {}
1976
2109
  throw e;
1977
2110
  }
1978
- }, Qn = (e) => {
2111
+ }, ur = (e) => {
1979
2112
  try {
1980
2113
  return process.kill(e, 0), !0;
1981
2114
  } catch {
1982
2115
  return !1;
1983
2116
  }
1984
- }, $n = (e) => {
2117
+ }, dr = (e) => {
1985
2118
  let t = Date.now();
1986
- return e.filter((e) => Qn(e.pid) ? t - new Date(e.heartbeatAt).getTime() < qn : !1);
1987
- }, er = async () => {
1988
- let e = await Xn(), t = $n(e.apps);
2119
+ return e.filter((e) => ur(e.pid) ? t - new Date(e.heartbeatAt).getTime() < ar : !1);
2120
+ }, fr = async () => {
2121
+ let e = await cr(), t = dr(e.apps);
1989
2122
  if (t.length === e.apps.length) return e;
1990
2123
  try {
1991
- await Zn({
2124
+ await lr({
1992
2125
  version: 1,
1993
2126
  apps: t
1994
2127
  });
@@ -1997,48 +2130,48 @@ import {
1997
2130
  version: 1,
1998
2131
  apps: t
1999
2132
  };
2000
- }, tr = async (e) => {
2001
- let t = await Xn(), n = (/* @__PURE__ */ new Date()).toISOString(), r = t.apps.findIndex((t) => t.id === e.id), i = {
2133
+ }, pr = async (e) => {
2134
+ let t = await cr(), n = (/* @__PURE__ */ new Date()).toISOString(), r = t.apps.findIndex((t) => t.id === e.id), i = {
2002
2135
  ...e,
2003
2136
  registeredAt: r >= 0 ? t.apps[r].registeredAt : n,
2004
2137
  heartbeatAt: n
2005
2138
  };
2006
- await Zn({
2139
+ await lr({
2007
2140
  version: 1,
2008
2141
  apps: r >= 0 ? t.apps.map((e, t) => t === r ? i : e) : [...t.apps, i]
2009
2142
  });
2010
- }, nr = async (e) => {
2143
+ }, mr = async (e) => {
2011
2144
  try {
2012
- let t = await Xn(), n = t.apps.filter((t) => t.id !== e);
2145
+ let t = await cr(), n = t.apps.filter((t) => t.id !== e);
2013
2146
  if (n.length === t.apps.length) return;
2014
- await Zn({
2147
+ await lr({
2015
2148
  version: 1,
2016
2149
  apps: n
2017
2150
  });
2018
2151
  } catch {}
2019
- }, rr = (e, t, n) => `${e}:${t}:${n}`, X = r(de(), ".voltro", "logs"), ir = () => {
2152
+ }, hr = (e, t, n) => `${e}:${t}:${n}`, Z = r(L(), ".voltro", "logs"), gr = () => {
2020
2153
  let e = Number(process.env.VOLTRO_LOG_FILE_TTL_MS);
2021
2154
  return Number.isFinite(e) && e > 0 ? e : 3600 * 1e3;
2022
- }, ar = !1, or = () => {
2023
- if (ar) return;
2024
- ar = !0;
2025
- let e = Date.now() - ir(), t = [];
2155
+ }, _r = !1, vr = () => {
2156
+ if (_r) return;
2157
+ _r = !0;
2158
+ let e = Date.now() - gr(), t = [];
2026
2159
  try {
2027
- t = w(X);
2160
+ t = w(Z);
2028
2161
  } catch {
2029
2162
  return;
2030
2163
  }
2031
2164
  for (let n of t) {
2032
2165
  if (!n.endsWith(".log")) continue;
2033
- let t = r(X, n);
2166
+ let t = r(Z, n);
2034
2167
  try {
2035
2168
  T(t).mtimeMs < e && E(t);
2036
2169
  } catch {}
2037
2170
  }
2038
- }, sr = (e) => e.replace(/[^a-zA-Z0-9._-]/g, "_").slice(0, 80), cr = (e, t) => r(X, `${sr(e)}-${t}.log`), lr = (e) => {
2039
- let t = sr(e), n = [];
2171
+ }, yr = (e) => e.replace(/[^a-zA-Z0-9._-]/g, "_").slice(0, 80), br = (e, t) => r(Z, `${yr(e)}-${t}.log`), xr = (e) => {
2172
+ let t = yr(e), n = [];
2040
2173
  try {
2041
- n = w(X);
2174
+ n = w(Z);
2042
2175
  } catch {
2043
2176
  return;
2044
2177
  }
@@ -2046,19 +2179,19 @@ import {
2046
2179
  if (i.length === 0) return;
2047
2180
  let a, o = -1;
2048
2181
  for (let e of i) {
2049
- let t = r(X, e);
2182
+ let t = r(Z, e);
2050
2183
  try {
2051
2184
  let e = T(t);
2052
2185
  e.mtimeMs > o && (o = e.mtimeMs, a = t);
2053
2186
  } catch {}
2054
2187
  }
2055
2188
  return a;
2056
- }, ur = (e) => {
2189
+ }, Sr = (e) => {
2057
2190
  try {
2058
- b(X, { recursive: !0 });
2191
+ b(Z, { recursive: !0 });
2059
2192
  } catch {}
2060
- or();
2061
- let t = cr(e, process.pid), n = x(t, "w"), r = (e) => {
2193
+ vr();
2194
+ let t = br(e, process.pid), n = x(t, "w"), r = (e) => {
2062
2195
  let t = {
2063
2196
  ts: e.ts.getTime(),
2064
2197
  level: e.level,
@@ -2099,7 +2232,7 @@ import {
2099
2232
  a(), o(), process.off("exit", o), process.off("uncaughtException", s), process.off("unhandledRejection", s);
2100
2233
  }
2101
2234
  };
2102
- }, dr = async (e, t) => {
2235
+ }, Cr = async (e, t) => {
2103
2236
  let n;
2104
2237
  try {
2105
2238
  n = await S.readFile(e, "utf8");
@@ -2113,11 +2246,11 @@ import {
2113
2246
  i.push(t);
2114
2247
  } catch {}
2115
2248
  return t?.max !== void 0 && i.length > t.max ? i.slice(i.length - t.max) : i;
2116
- }, fr = g({ scope: "voltro:dashboard" }), pr = pe(import.meta.url), mr = 5179, hr = (e) => {
2249
+ }, wr = g({ scope: "voltro:dashboard" }), Tr = me(import.meta.url), Er = 5179, Dr = (e) => {
2117
2250
  let n = process.env.VOLTRO_DASHBOARD_PATH;
2118
2251
  if (n && y(r(a(n), "app.config.ts"))) return a(n);
2119
2252
  try {
2120
- let e = t(pr.resolve("@voltro/dashboard/package.json"));
2253
+ let e = t(Tr.resolve("@voltro/dashboard/package.json"));
2121
2254
  if (y(r(e, "app.config.ts"))) return e;
2122
2255
  } catch {}
2123
2256
  let i = r("voltro-devtools", "apps", "dashboard"), o = a(e);
@@ -2129,53 +2262,53 @@ import {
2129
2262
  o = n;
2130
2263
  }
2131
2264
  return null;
2132
- }, gr = "VOLTRO_IS_DASHBOARD", _r = (e, t = "127.0.0.1", n = 250) => new Promise((r) => {
2133
- let i = fe({
2265
+ }, Or = "VOLTRO_IS_DASHBOARD", kr = (e, t = "127.0.0.1", n = 250) => new Promise((r) => {
2266
+ let i = pe({
2134
2267
  port: e,
2135
2268
  host: t
2136
2269
  }), a = !1, o = (e) => {
2137
2270
  a || (a = !0, i.destroy(), r(e));
2138
2271
  };
2139
2272
  i.once("connect", () => o(!0)), i.once("error", () => o(!1)), setTimeout(() => o(!1), n);
2140
- }), vr = () => !!(process.env.VOLTRO_DASHBOARD === "off" || process.argv.includes("--disable-dashboard")), yr = () => process.env[gr] === "1", br = () => process.stdout.isTTY === !0, xr = r(de(), ".voltro", "dashboard-launch.lock"), Sr = 1e4, Cr = async () => {
2273
+ }), Ar = () => !!(process.env.VOLTRO_DASHBOARD === "off" || process.argv.includes("--disable-dashboard")), jr = () => process.env[Or] === "1", Mr = () => process.stdout.isTTY === !0, Nr = r(L(), ".voltro", "dashboard-launch.lock"), Pr = 1e4, Fr = async () => {
2141
2274
  try {
2142
- await S.mkdir(t(xr), { recursive: !0 });
2143
- let e = await S.open(xr, "wx");
2275
+ await S.mkdir(t(Nr), { recursive: !0 });
2276
+ let e = await S.open(Nr, "wx");
2144
2277
  return await e.write(`${process.pid}\n${Date.now()}\n`), await e.close(), !0;
2145
2278
  } catch {
2146
2279
  try {
2147
- let e = await S.stat(xr);
2148
- if (Date.now() - e.mtimeMs > Sr) return await S.unlink(xr).catch(() => void 0), Cr();
2280
+ let e = await S.stat(Nr);
2281
+ if (Date.now() - e.mtimeMs > Pr) return await S.unlink(Nr).catch(() => void 0), Fr();
2149
2282
  } catch {}
2150
2283
  return !1;
2151
2284
  }
2152
- }, wr = async () => {
2285
+ }, Ir = async () => {
2153
2286
  try {
2154
- await S.unlink(xr);
2287
+ await S.unlink(Nr);
2155
2288
  } catch {}
2156
- }, Tr = async (e) => {
2289
+ }, Lr = async (e) => {
2157
2290
  let n = e.port ?? 5179;
2158
- if (vr()) return {
2291
+ if (Ar()) return {
2159
2292
  status: "skipped",
2160
2293
  reason: "disabled by flag/env",
2161
2294
  port: n
2162
2295
  };
2163
- if (yr()) return {
2296
+ if (jr()) return {
2164
2297
  status: "skipped",
2165
2298
  reason: "this process IS the dashboard",
2166
2299
  port: n
2167
2300
  };
2168
- if (!br()) return {
2301
+ if (!Mr()) return {
2169
2302
  status: "skipped",
2170
2303
  reason: "stdout is not a TTY (CI/smoke)",
2171
2304
  port: n
2172
2305
  };
2173
- if (!await Cr()) return {
2306
+ if (!await Fr()) return {
2174
2307
  status: "skipped",
2175
2308
  reason: "another voltro process is currently launching the dashboard",
2176
2309
  port: n
2177
2310
  };
2178
- if (await _r(n)) return await wr(), {
2311
+ if (await kr(n)) return await Ir(), {
2179
2312
  status: "already-running",
2180
2313
  port: n
2181
2314
  };
@@ -2184,7 +2317,7 @@ import {
2184
2317
  let e = process.argv[1];
2185
2318
  i = e && e.endsWith("/src/bin.ts") ? r(t(e), "..", "bin", "voltro.mjs") : e ?? "voltro";
2186
2319
  }
2187
- let a = y(r(e.dashboardAppPath, ".framework", "dist", "index.html")), o = a ? "start" : "dev", s = le(process.execPath, [
2320
+ let a = y(r(e.dashboardAppPath, ".framework", "dist", "index.html")), o = a ? "start" : "dev", s = de(process.execPath, [
2188
2321
  i,
2189
2322
  o,
2190
2323
  e.dashboardAppPath
@@ -2192,7 +2325,7 @@ import {
2192
2325
  stdio: "ignore",
2193
2326
  env: {
2194
2327
  ...process.env,
2195
- [gr]: "1",
2328
+ [Or]: "1",
2196
2329
  VOLTRO_DASHBOARD_PORT: String(n)
2197
2330
  }
2198
2331
  });
@@ -2200,22 +2333,22 @@ import {
2200
2333
  if (s.exitCode === null && s.signalCode === null) try {
2201
2334
  s.kill("SIGTERM");
2202
2335
  } catch {}
2203
- }), fr.info(`auto-launching dashboard at http://localhost:${n}`, {
2336
+ }), wr.info(`auto-launching dashboard at http://localhost:${n}`, {
2204
2337
  port: n,
2205
2338
  mode: o,
2206
2339
  prebuilt: a
2207
- }), a || fr.debug("no pre-built dashboard — running `voltro dev`. Build with `cd voltro-devtools && pnpm build` for a fast prod boot."), fr.debug("disable via --disable-dashboard or VOLTRO_DASHBOARD=off"), setTimeout(() => {
2208
- wr();
2340
+ }), a || wr.debug("no pre-built dashboard — running `voltro dev`. Build with `cd voltro-devtools && pnpm build` for a fast prod boot."), wr.debug("disable via --disable-dashboard or VOLTRO_DASHBOARD=off"), setTimeout(() => {
2341
+ Ir();
2209
2342
  }, 4e3).unref(), {
2210
2343
  status: "launched",
2211
2344
  port: n
2212
2345
  };
2213
- }, Er = class extends Error {
2346
+ }, Rr = class extends Error {
2214
2347
  _voltroDeferral = !0;
2215
2348
  constructor(e) {
2216
2349
  super(e), this.name = "DeferralNotSupportedError";
2217
2350
  }
2218
- }, Dr = (e) => typeof e == "object" && !!e && e._voltroDeferral === !0, Or = (e) => {
2351
+ }, zr = (e) => typeof e == "object" && !!e && e._voltroDeferral === !0, Br = (e) => {
2219
2352
  let { helpers: t } = e, n = t.prepareDeferredLoaderData(e.loaderData, "page"), r = {}, i = {}, a = {};
2220
2353
  for (let [n, o] of Object.entries(e.segmentLoaderData)) {
2221
2354
  let e = Number(n), s = t.prepareDeferredLoaderData(o, e);
@@ -2226,62 +2359,84 @@ import {
2226
2359
  t.assertDeferralSupported({
2227
2360
  page: e.page,
2228
2361
  renderMode: e.renderMode,
2229
- interactive: e.interactive
2362
+ interactive: e.interactive,
2363
+ ...e.layoutShell ? { layoutShell: e.layoutShell } : {}
2230
2364
  });
2231
2365
  } catch (e) {
2232
- throw new Er(e instanceof Error ? e.message : String(e));
2366
+ throw new Rr(e instanceof Error ? e.message : String(e));
2233
2367
  }
2234
2368
  return {
2235
2369
  loaderData: n.renderData,
2236
2370
  segmentLoaderData: r,
2237
2371
  hasDeferred: o,
2238
2372
  stateInput: {
2373
+ path: e.pathname,
2239
2374
  loaderData: n.stateData,
2240
2375
  segmentLoaderData: i,
2241
2376
  pageLoaderRan: e.pageLoaderRan,
2377
+ ...e.layoutShell ? { pageClientOnly: !0 } : {},
2242
2378
  ...n.deferredIds ? { deferredPageIds: n.deferredIds } : {},
2243
2379
  ...Object.keys(a).length > 0 ? { deferredSegmentIds: a } : {}
2244
2380
  }
2245
2381
  };
2246
- }, kr = (e) => {
2247
- let { helpers: t, renderInput: n } = e, { html: r, meta: i } = t.renderPageToHtml({
2248
- ...n,
2249
- pageSlot: !0
2382
+ }, Vr = (e) => {
2383
+ let { helpers: t, renderInput: n } = e, r = Br({
2384
+ helpers: t,
2385
+ page: e.page,
2386
+ pathname: n.pathname,
2387
+ renderMode: "spa",
2388
+ interactive: e.interactive,
2389
+ loaderData: null,
2390
+ segmentLoaderData: n.segmentLoaderData ?? {},
2391
+ pageLoaderRan: !1,
2392
+ layoutShell: e.delivery
2250
2393
  });
2251
2394
  return {
2252
- body: r,
2253
- meta: i,
2254
- stateScript: t.renderRouterStateScript({
2395
+ renderInput: {
2396
+ ...n,
2397
+ pageSlot: !0,
2255
2398
  loaderData: null,
2256
- segmentLoaderData: n.segmentLoaderData ?? {},
2257
- pageLoaderRan: !1,
2258
- pageClientOnly: !0
2259
- })
2399
+ segmentLoaderData: r.segmentLoaderData
2400
+ },
2401
+ stateScript: t.renderRouterStateScript(r.stateInput),
2402
+ hasDeferred: r.hasDeferred
2260
2403
  };
2261
- }, Ar = "<div id=\"root\"></div>", jr = "<div id=\"root\">", Mr = "</div>", Nr = /<script\b[^>]*\btype=["']module["'][^>]*><\/script>[ \t]*\n?/gi, Pr = /\bsrc=["']([^"']+)["']/i, Fr = /<script(?![^>]*\basync\b)([^>]*\btype=["']module["'][^>]*)>/gi, Ir = (e) => {
2262
- let t = e.keepScriptInHead ?? ((e) => e.startsWith("/@")), n = [], r = e.shell.replace(Nr, (e) => {
2263
- let r = Pr.exec(e)?.[1];
2404
+ }, Hr = (e) => {
2405
+ let { html: t, meta: n } = e.helpers.renderPageToHtml(e.prepared.renderInput);
2406
+ return {
2407
+ body: t,
2408
+ meta: n
2409
+ };
2410
+ }, Ur = (e) => [
2411
+ ...e.extra ?? [],
2412
+ e.helpers.renderMetaToHtml(e.meta),
2413
+ `<meta name="voltro-interactive" content="${e.interactive}" />`,
2414
+ ...e.prepared.hasDeferred ? [e.helpers.renderDeferredRegistryScript()] : [],
2415
+ e.prepared.stateScript
2416
+ ].filter((e) => e.length > 0).join("\n "), Wr = "<div id=\"root\"></div>", Gr = "<div id=\"root\">", Kr = "</div>", qr = /<script\b[^>]*\btype=["']module["'][^>]*><\/script>[ \t]*\n?/gi, Jr = /\bsrc=["']([^"']+)["']/i, Yr = /<script(?![^>]*\basync\b)([^>]*\btype=["']module["'][^>]*)>/gi, Xr = (e) => {
2417
+ let t = e.keepScriptInHead ?? ((e) => e.startsWith("/@")), n = [], r = e.shell.replace(qr, (e) => {
2418
+ let r = Jr.exec(e)?.[1];
2264
2419
  return r === void 0 || t(r) ? e : (n.push(r), "");
2265
2420
  });
2266
- e.inlineModuleScriptsAsync && (r = r.replace(Fr, "<script async$1>"));
2267
- let i = r.indexOf(Ar);
2268
- if (i === -1) throw Error(`[voltro] the generated shell has no \`${Ar}\` element, so a streamed response cannot be split around the page body. This is a framework bug unless the app overrode \`.framework/index.html\` by hand.`);
2421
+ e.inlineModuleScriptsAsync && (r = r.replace(Yr, "<script async$1>"));
2422
+ let i = r.indexOf(Wr);
2423
+ if (i === -1) throw Error(`[voltro] the generated shell has no \`${Wr}\` element, so a streamed response cannot be split around the page body. This is a framework bug unless the app overrode \`.framework/index.html\` by hand.`);
2269
2424
  return {
2270
- head: `${r.slice(0, i)}${jr}`,
2271
- tail: `${Mr}${r.slice(i + 21)}`,
2425
+ head: `${r.slice(0, i)}${Gr}`,
2426
+ tail: `${Kr}${r.slice(i + 21)}`,
2272
2427
  bootstrapModules: n
2273
2428
  };
2274
- }, Lr = (e) => e.head.replace("</head>", ` ${e.headInjection}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${e.htmlLang}"`), Rr = (e) => {
2429
+ }, Zr = (e) => e.head.replace("</head>", ` ${e.headInjection}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${e.htmlLang}"`), Qr = (e) => {
2275
2430
  let { res: t, shell: n, htmlLang: r, headInjection: i } = e, a = null, o = !1, s = !1, c = () => {
2276
2431
  if (s || !o || a === null) return;
2277
2432
  s = !0, t.statusCode = e.statusCode ?? 200;
2278
2433
  for (let [n, r] of Object.entries(e.headers ?? {})) t.setHeader(n, r);
2279
- t.flushHeaders?.(), t.write(Lr({
2434
+ t.flushHeaders?.(), t.write(Zr({
2280
2435
  head: n.head,
2281
2436
  headInjection: i(a.meta),
2282
2437
  htmlLang: r
2283
2438
  }));
2284
- let c = new me();
2439
+ let c = new he();
2285
2440
  c.pipe(t, { end: !1 }), c.on("end", () => {
2286
2441
  t.end(n.tail);
2287
2442
  }), a.stream.pipe(c);
@@ -2306,14 +2461,14 @@ import {
2306
2461
  return;
2307
2462
  }
2308
2463
  c();
2309
- }, Z = g({ scope: "voltro:dev:web" }), zr = g({ scope: "vite" }), Br = await (async () => {
2464
+ }, Q = g({ scope: "voltro:dev:web" }), $r = g({ scope: "vite" }), ei = await (async () => {
2310
2465
  try {
2311
2466
  let e = r(t(o(import.meta.url)), "..", "package.json"), n = await S.readFile(e, "utf8");
2312
2467
  return JSON.parse(n).version ?? "0.0.0";
2313
2468
  } catch {
2314
2469
  return "0.0.0";
2315
2470
  }
2316
- })(), Vr = async () => {
2471
+ })(), ti = async () => {
2317
2472
  try {
2318
2473
  let e = t(o(import.meta.url)), n = a(e, "..", "..", "devtools");
2319
2474
  if (y(r(n, "package.json"))) return n;
@@ -2322,7 +2477,7 @@ import {
2322
2477
  } catch {
2323
2478
  return null;
2324
2479
  }
2325
- }, Hr = (e, t) => e.disableDevtools || !t ? [] : [
2480
+ }, ni = (e, t) => e.disableDevtools || !t ? [] : [
2326
2481
  "",
2327
2482
  "// Dev-only in-page devtools overlay. The `import.meta.env.DEV` guard is a",
2328
2483
  "// compile-time constant, so prod builds strip this whole `if` block — the",
@@ -2332,12 +2487,12 @@ import {
2332
2487
  " await import('@voltro/devtools/styles.css')",
2333
2488
  " Devtools = (await import('@voltro/devtools')).VoltroDevtools",
2334
2489
  "}"
2335
- ], Ur = (e, t) => e.disableDevtools || !t ? [] : [" ...(Devtools ? { Devtools } : {}),"], Wr = (e) => e.sentry ? ["import { initSentryBrowser } from '@voltro/plugin-sentry/web'"] : [], Gr = (e) => e.sentry ? [
2490
+ ], ri = (e, t) => e.disableDevtools || !t ? [] : [" ...(Devtools ? { Devtools } : {}),"], ii = (e) => e.sentry ? ["import { initSentryBrowser } from '@voltro/plugin-sentry/web'"] : [], ai = (e) => e.sentry ? [
2336
2491
  "",
2337
2492
  "// Browser-side Sentry (frontend half of the deep integration). Errors +",
2338
2493
  "// browser rpc spans flow to Sentry, sharing the server transactions' trace.",
2339
2494
  `await initSentryBrowser(${JSON.stringify(e.sentry)})`
2340
- ] : [], Kr = (e) => e.env ? ["import './env.public'"] : [], qr = (e) => {
2495
+ ] : [], oi = (e) => e.env ? ["import './env.public'"] : [], si = (e) => {
2341
2496
  let n = [], i = a(e);
2342
2497
  for (;;) {
2343
2498
  y(r(i, "pnpm-workspace.yaml")) && n.push(i);
@@ -2346,19 +2501,19 @@ import {
2346
2501
  i = e;
2347
2502
  }
2348
2503
  return n;
2349
- }, Jr = /* @__PURE__ */ new Set([
2504
+ }, ci = /* @__PURE__ */ new Set([
2350
2505
  "layout.tsx",
2351
2506
  "error.tsx",
2352
2507
  "loading.tsx",
2353
2508
  "not-found.tsx"
2354
- ]), Yr = (e) => /\.(test|spec)\.tsx$/.test(e), Xr = (e) => {
2509
+ ]), li = (e) => /\.(test|spec)\.tsx$/.test(e), ui = (e) => {
2355
2510
  if (/\/node_modules\/(?:\.pnpm\/[^/]+\/node_modules\/)?(?:react|react-dom|scheduler)\//.test(e)) return "react";
2356
2511
  let t = /\/([^/]+)\.island\.tsx?$/.exec(e);
2357
2512
  if (t) return `island-${t[1]}`;
2358
- }, Zr = /export\s+(?:async\s+)?(?:const|function|let|var)\s+loader\b/, Qr = (e) => e.startsWith("(") && e.endsWith(")"), $r = (e) => e.filter((e) => !Qr(e)), ei = (e) => {
2359
- let t = e.replace(/\.tsx$/, "").split("/").filter(Boolean).filter((e) => !Qr(e)), n = t.length > 0 && t[t.length - 1] === "index" ? t.slice(0, -1) : t;
2513
+ }, di = /export\s+(?:async\s+)?(?:const|function|let|var)\s+loader\b/, fi = (e) => e.startsWith("(") && e.endsWith(")"), pi = (e) => e.filter((e) => !fi(e)), mi = (e) => {
2514
+ let t = e.replace(/\.tsx$/, "").split("/").filter(Boolean).filter((e) => !fi(e)), n = t.length > 0 && t[t.length - 1] === "index" ? t.slice(0, -1) : t;
2360
2515
  return n.length === 0 ? "/" : "/" + n.join("/");
2361
- }, ti = (e) => `${e.replace(/\.tsx$/, "").split("/").filter(Boolean).map((e) => e.replace(/[()]/g, "").replace(/\[\.\.\./g, "_rest_").replace(/[[\]]/g, "_")).map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join("").replace(/[^A-Za-z0-9_]/g, "_") || "Index"}Page`, Q = (e, t) => e === "" ? `Root${t}` : `${e.split("/").filter(Boolean).map((e) => e.replace(/[()]/g, "").replace(/\[\.\.\./g, "_rest_").replace(/[[\]]/g, "_")).map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join("").replace(/[^A-Za-z0-9_]/g, "_") || "Root"}${t}`, $ = async (e) => {
2516
+ }, hi = (e) => `${e.replace(/\.tsx$/, "").split("/").filter(Boolean).map((e) => e.replace(/[()]/g, "").replace(/\[\.\.\./g, "_rest_").replace(/[[\]]/g, "_")).map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join("").replace(/[^A-Za-z0-9_]/g, "_") || "Index"}Page`, $ = (e, t) => e === "" ? `Root${t}` : `${e.split("/").filter(Boolean).map((e) => e.replace(/[()]/g, "").replace(/\[\.\.\./g, "_rest_").replace(/[[\]]/g, "_")).map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join("").replace(/[^A-Za-z0-9_]/g, "_") || "Root"}${t}`, gi = async (e) => {
2362
2517
  let t = [], n = [], i = async (e, a) => {
2363
2518
  let o = [];
2364
2519
  try {
@@ -2366,17 +2521,17 @@ import {
2366
2521
  } catch {
2367
2522
  return;
2368
2523
  }
2369
- let s = o.filter((e) => e.isDirectory()).map((e) => e.name).sort(), c = o.filter((e) => e.isFile() && e.name.endsWith(".tsx") && !Yr(e.name)).map((e) => e.name).sort(), l = new Set(c), u = a.join("/");
2370
- if (c.some((e) => Jr.has(e))) {
2524
+ let s = o.filter((e) => e.isDirectory()).map((e) => e.name).sort(), c = o.filter((e) => e.isFile() && e.name.endsWith(".tsx") && !li(e.name)).map((e) => e.name).sort(), l = new Set(c), u = a.join("/");
2525
+ if (c.some((e) => ci.has(e))) {
2371
2526
  let t = l.has("layout.tsx"), i = !1;
2372
2527
  if (t) try {
2373
2528
  let t = await S.readFile(r(e, "layout.tsx"), "utf8");
2374
- i = Zr.test(t);
2529
+ i = di.test(t);
2375
2530
  } catch {}
2376
2531
  n.push({
2377
2532
  dir: u,
2378
2533
  chain: a,
2379
- contributesToUrl: a.length === 0 || !Qr(a[a.length - 1]),
2534
+ contributesToUrl: a.length === 0 || !fi(a[a.length - 1]),
2380
2535
  hasLayout: t,
2381
2536
  hasLayoutLoader: i,
2382
2537
  hasError: l.has("error.tsx"),
@@ -2385,12 +2540,12 @@ import {
2385
2540
  });
2386
2541
  }
2387
2542
  for (let e of c) {
2388
- if (Jr.has(e)) continue;
2543
+ if (ci.has(e)) continue;
2389
2544
  let n = u ? `${u}/${e}` : e;
2390
2545
  t.push({
2391
2546
  file: n,
2392
- pattern: ei(n),
2393
- ident: ti(n),
2547
+ pattern: mi(n),
2548
+ ident: hi(n),
2394
2549
  dirChain: a
2395
2550
  });
2396
2551
  }
@@ -2400,14 +2555,14 @@ import {
2400
2555
  pages: t,
2401
2556
  dirs: n
2402
2557
  };
2403
- }, ni = (e, t) => {
2558
+ }, _i = (e, t) => {
2404
2559
  let n = [];
2405
2560
  for (let r = 0; r <= t.length; r++) {
2406
2561
  let i = t.slice(0, r).join("/"), a = e.find((e) => e.dir === i);
2407
2562
  a && n.push(a);
2408
2563
  }
2409
2564
  return n;
2410
- }, ri = async (e) => {
2565
+ }, vi = async (e) => {
2411
2566
  let { entries: t, loadLayout: n, loadError: r, loadPending: i, ctx: a } = e, o = {};
2412
2567
  return {
2413
2568
  chain: await Promise.all(t.map(async (e, t) => {
@@ -2429,10 +2584,10 @@ import {
2429
2584
  })),
2430
2585
  segmentLoaderData: o
2431
2586
  };
2432
- }, ii = (e) => {
2433
- let t = $r(e);
2587
+ }, yi = (e) => {
2588
+ let t = pi(e);
2434
2589
  return t.length === 0 ? "" : "/" + t.join("/");
2435
- }, ai = [
2590
+ }, bi = [
2436
2591
  "// Hot-reload bridge: keep SSR-injected <link rel=\"stylesheet\"> tags",
2437
2592
  "// in sync with Vite's CSS HMR. Without this, edits to .css files",
2438
2593
  "// only update the JS-injected <style> overlay; the underlying <link>",
@@ -2525,7 +2680,7 @@ import {
2525
2680
  " _vdtErrorStart('Build error')",
2526
2681
  " })",
2527
2682
  "}"
2528
- ].join("\n"), oi = (e) => {
2683
+ ].join("\n"), xi = (e) => {
2529
2684
  let t = [], n = 0, r = e.split("/").filter(Boolean), i = [];
2530
2685
  for (let e of r) e.startsWith("[[...") && e.endsWith("]]") ? (i.push("(.*)"), t.push(e.slice(5, -2)), n += 2) : e.startsWith("[...") && e.endsWith("]") ? (i.push("(.+)"), t.push(e.slice(4, -1)), n += 3) : e.startsWith("[") && e.endsWith("]") ? (i.push("([^/]+)"), t.push(e.slice(1, -1)), n += 1) : i.push(e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"));
2531
2686
  let a = i.join("/");
@@ -2534,8 +2689,8 @@ import {
2534
2689
  paramNames: t,
2535
2690
  priority: n
2536
2691
  };
2537
- }, si = (e) => e.map((e) => {
2538
- let { regex: t, paramNames: n, priority: r } = oi(e.pattern);
2692
+ }, Si = (e) => e.map((e) => {
2693
+ let { regex: t, paramNames: n, priority: r } = xi(e.pattern);
2539
2694
  return {
2540
2695
  pattern: e.pattern,
2541
2696
  file: e.file,
@@ -2544,7 +2699,7 @@ import {
2544
2699
  paramNames: n,
2545
2700
  priority: r
2546
2701
  };
2547
- }).slice().sort((e, t) => e.priority - t.priority), ci = (e, t) => {
2702
+ }).slice().sort((e, t) => e.priority - t.priority), Ci = (e, t) => {
2548
2703
  for (let n of t) {
2549
2704
  let t = n.regex.exec(e);
2550
2705
  if (!t) continue;
@@ -2556,7 +2711,7 @@ import {
2556
2711
  };
2557
2712
  }
2558
2713
  return null;
2559
- }, li = async (e, n) => {
2714
+ }, wi = async (e, n) => {
2560
2715
  let i = e;
2561
2716
  for (;;) {
2562
2717
  let e = r(i, "node_modules", n);
@@ -2570,7 +2725,7 @@ import {
2570
2725
  if (a === i) return null;
2571
2726
  i = a;
2572
2727
  }
2573
- }, ui = async (e) => {
2728
+ }, Ti = async (e) => {
2574
2729
  try {
2575
2730
  let t = await import(s(r(e, "app.config.ts")).href), n = t.default?.port, i = typeof n == "number" ? n : 4e3, a = t.default?.transport?.wsPath, o = typeof a == "string" && a.startsWith("/") ? a : void 0;
2576
2731
  return o ? {
@@ -2579,13 +2734,13 @@ import {
2579
2734
  } : { port: i };
2580
2735
  } catch {}
2581
2736
  return { port: 4e3 };
2582
- }, di = (e, t) => ({
2737
+ }, Ei = (e, t) => ({
2583
2738
  name: e,
2584
2739
  pkg: t.package,
2585
2740
  browserWsUrl: t.url,
2586
2741
  proxyTarget: void 0,
2587
2742
  ...t.headers ? { headers: t.headers } : {}
2588
- }), fi = (e, t, n) => {
2743
+ }), Di = (e, t, n) => {
2589
2744
  let r = t.transport?.wsPath ?? n.wsPath;
2590
2745
  return {
2591
2746
  name: e,
@@ -2595,7 +2750,7 @@ import {
2595
2750
  ...r ? { wsPath: r } : {},
2596
2751
  ...t.headers ? { headers: t.headers } : {}
2597
2752
  };
2598
- }, pi = (e) => {
2753
+ }, Oi = (e) => {
2599
2754
  let t = /* @__PURE__ */ new Map();
2600
2755
  for (let n of e) {
2601
2756
  if (n.proxyTarget === void 0) continue;
@@ -2603,19 +2758,19 @@ import {
2603
2758
  if (e) throw Error(`[voltro] api ${JSON.stringify(n.name)} and ${JSON.stringify(e)} both resolve the same-origin WS path ${JSON.stringify(n.browserWsUrl)}. A custom transport.wsPath must be unique per origin (one api per origin may use a fixed path). Give each a distinct wsPath, or drop the override to use the default /ws/<name>.`);
2604
2759
  t.set(n.browserWsUrl, n.name);
2605
2760
  }
2606
- }, mi = async (e, t) => {
2761
+ }, ki = async (e, t) => {
2607
2762
  let n = Object.entries(t.apis ?? {}), r = [];
2608
2763
  for (let [t, i] of n) {
2609
2764
  if (i.url) {
2610
- r.push(di(t, i));
2765
+ r.push(Ei(t, i));
2611
2766
  continue;
2612
2767
  }
2613
- let n = await li(e, i.package);
2768
+ let n = await wi(e, i.package);
2614
2769
  if (!n) throw Error(`[voltro dev] api ${JSON.stringify(t)} (package ${JSON.stringify(i.package)}) is not a workspace dep and has no \`url\` set in app.config.ts. External apis need an explicit \`url\` because the framework can't discover their dev port.`);
2615
- r.push(fi(t, i, await ui(n)));
2770
+ r.push(Di(t, i, await Ti(n)));
2616
2771
  }
2617
- return pi(r), r;
2618
- }, hi = (e) => {
2772
+ return Oi(r), r;
2773
+ }, Ai = (e) => {
2619
2774
  if (!e) return;
2620
2775
  let t = e.proxyTarget ?? e.browserWsUrl;
2621
2776
  if (t && !(!/^wss?:\/\//.test(t) && !/^https?:\/\//.test(t))) try {
@@ -2624,7 +2779,7 @@ import {
2624
2779
  } catch {
2625
2780
  return;
2626
2781
  }
2627
- }, gi = (e, t) => {
2782
+ }, ji = (e, t) => {
2628
2783
  if (e) return async (n, r) => {
2629
2784
  let i = {
2630
2785
  _tag: "Request",
@@ -2656,8 +2811,8 @@ import {
2656
2811
  }
2657
2812
  if (l) return c;
2658
2813
  };
2659
- }, _i = async (e, t, n, i = {}) => {
2660
- let a = t.title ?? t.name ?? "app", o = t.theme === "dark" ? " class=\"dark\"" : t.theme === "light" ? " class=\"light\"" : "", s = y(r(e, "node_modules", "@voltro", "devtools", "package.json")) || await Vr() !== null, c = t.theme === "system" ? [
2814
+ }, Mi = async (e, t, n, i = {}) => {
2815
+ let a = t.title ?? t.name ?? "app", o = t.theme === "dark" ? " class=\"dark\"" : t.theme === "light" ? " class=\"light\"" : "", s = y(r(e, "node_modules", "@voltro", "devtools", "package.json")) || await ti() !== null, c = t.theme === "system" ? [
2661
2816
  " <script>",
2662
2817
  " (function () {",
2663
2818
  " var root = document.documentElement",
@@ -2695,59 +2850,61 @@ import {
2695
2850
  " </body>",
2696
2851
  "</html>",
2697
2852
  ""
2698
- ].join("\n"), { pages: u, dirs: d } = await $(r(e, "src", "pages")), f = (e) => `${e.replace(/[^a-zA-Z0-9]/g, "_")}AppGroup`, p = (e) => `${e.replace(/[^a-zA-Z0-9]/g, "_")}AppDescriptors`, m = n.map((e) => `import { appGroup as ${f(e.name)}, appDescriptors as ${p(e.name)} } from '${e.pkg}/rpcGroup'`), h = n.map((e) => {
2699
- let t = [`group: ${f(e.name)}`];
2700
- return t.push(`descriptors: ${p(e.name)}`), t.push(`wsUrl: ${JSON.stringify(e.browserWsUrl)}`), e.headers && t.push(`headers: ${JSON.stringify(e.headers)}`), ` ${JSON.stringify(e.name)}: { ${t.join(", ")} },`;
2701
- }), g, _, v;
2702
- if (u.length > 0) {
2703
- let e = u.map((e) => ` ${JSON.stringify(e.pattern)}: () => import('../src/pages/${e.file}'),`), n = [];
2704
- for (let e of d) {
2853
+ ].join("\n"), u = r(e, "src", "pages"), { pages: d, dirs: f } = await gi(u);
2854
+ await nr(u, d);
2855
+ let p = (e) => `${e.replace(/[^a-zA-Z0-9]/g, "_")}AppGroup`, m = (e) => `${e.replace(/[^a-zA-Z0-9]/g, "_")}AppDescriptors`, h = n.map((e) => `import { appGroup as ${p(e.name)}, appDescriptors as ${m(e.name)} } from '${e.pkg}/rpcGroup'`), g = n.map((e) => {
2856
+ let t = [`group: ${p(e.name)}`];
2857
+ return t.push(`descriptors: ${m(e.name)}`), t.push(`wsUrl: ${JSON.stringify(e.browserWsUrl)}`), e.headers && t.push(`headers: ${JSON.stringify(e.headers)}`), ` ${JSON.stringify(e.name)}: { ${t.join(", ")} },`;
2858
+ }), _, v, b;
2859
+ if (d.length > 0) {
2860
+ let e = d.map((e) => ` ${JSON.stringify(e.pattern)}: () => import('../src/pages/${e.file}'),`), n = [];
2861
+ for (let e of f) {
2705
2862
  let t = e.dir === "" ? "../src/pages" : `../src/pages/${e.dir}`;
2706
- e.hasLayout && e.hasLayoutLoader ? n.push(`import * as ${Q(e.dir, "Layout")}Mod from '${t}/layout.tsx'`) : e.hasLayout && n.push(`import ${Q(e.dir, "Layout")} from '${t}/layout.tsx'`), e.hasError && n.push(`import ${Q(e.dir, "Error")} from '${t}/error.tsx'`), e.hasPending && n.push(`import ${Q(e.dir, "Pending")} from '${t}/loading.tsx'`), e.hasNotFound && n.push(`import ${Q(e.dir, "NotFound")} from '${t}/not-found.tsx'`);
2863
+ e.hasLayout && e.hasLayoutLoader ? n.push(`import * as ${$(e.dir, "Layout")}Mod from '${t}/layout.tsx'`) : e.hasLayout && n.push(`import ${$(e.dir, "Layout")} from '${t}/layout.tsx'`), e.hasError && n.push(`import ${$(e.dir, "Error")} from '${t}/error.tsx'`), e.hasPending && n.push(`import ${$(e.dir, "Pending")} from '${t}/loading.tsx'`), e.hasNotFound && n.push(`import ${$(e.dir, "NotFound")} from '${t}/not-found.tsx'`);
2707
2864
  }
2708
- let r = u.map((e) => {
2709
- let t = ni(d, e.dirChain).map((e) => {
2865
+ let r = d.map((e) => {
2866
+ let t = _i(f, e.dirChain).map((e) => {
2710
2867
  let t = [`id: ${JSON.stringify(e.dir || "/")}`], n = JSON.stringify(e.dir);
2711
2868
  return e.hasLayout && t.push(`Layout: refs.layouts[${n}]`), e.hasLayoutLoader && t.push(`loader: refs.layoutLoaders[${n}]`), e.hasError && t.push(`Error: refs.errors[${n}]`), e.hasPending && t.push(`Pending: refs.pendings[${n}]`), ` { ${t.join(", ")} }`;
2712
2869
  }).join(",\n");
2713
2870
  return ` makePageRoute(${JSON.stringify(e.pattern)}, ${t.length > 0 ? `[\n${t},\n ]` : "undefined"}),`;
2714
- }), i = d.filter((e) => e.hasNotFound).map((e) => {
2715
- let t = ii(e.chain), n = ni(d, e.chain).map((e) => {
2871
+ }), i = f.filter((e) => e.hasNotFound).map((e) => {
2872
+ let t = yi(e.chain), n = _i(f, e.chain).map((e) => {
2716
2873
  let t = [`id: ${JSON.stringify(e.dir || "/")}`], n = JSON.stringify(e.dir);
2717
2874
  return e.hasLayout && t.push(`Layout: refs.layouts[${n}]`), e.hasError && t.push(`Error: refs.errors[${n}]`), ` { ${t.join(", ")} }`;
2718
2875
  }).join(",\n"), r = n.length > 0 ? `\n chain: [\n${n},\n ],` : "";
2719
2876
  return ` {\n prefix: ${JSON.stringify(t)},\n Component: refs.notFounds[${JSON.stringify(e.dir)}],${r}\n },`;
2720
- }), a = [], o = [], c = [], l = [], f = [], p = [];
2721
- for (let e of d) {
2877
+ }), a = [], o = [], c = [], l = [], u = [], p = [];
2878
+ for (let e of f) {
2722
2879
  let t = e.dir === "" ? "../src/pages/layout.tsx" : `../src/pages/${e.dir}/layout.tsx`, n = e.dir === "" ? "../src/pages/error.tsx" : `../src/pages/${e.dir}/error.tsx`, r = e.dir === "" ? "../src/pages/loading.tsx" : `../src/pages/${e.dir}/loading.tsx`, i = e.dir === "" ? "../src/pages/not-found.tsx" : `../src/pages/${e.dir}/not-found.tsx`, s = JSON.stringify(e.dir);
2723
- e.hasLayout && e.hasLayoutLoader ? (o.push(` ${s}: ${Q(e.dir, "Layout")}Mod.default,`), c.push(` ${s}: ${Q(e.dir, "Layout")}Mod.loader,`), a.push({
2880
+ e.hasLayout && e.hasLayoutLoader ? (o.push(` ${s}: ${$(e.dir, "Layout")}Mod.default,`), c.push(` ${s}: ${$(e.dir, "Layout")}Mod.loader,`), a.push({
2724
2881
  relPath: t,
2725
2882
  kind: "layout",
2726
2883
  slotKey: e.dir
2727
- })) : e.hasLayout && (o.push(` ${s}: ${Q(e.dir, "Layout")},`), a.push({
2884
+ })) : e.hasLayout && (o.push(` ${s}: ${$(e.dir, "Layout")},`), a.push({
2728
2885
  relPath: t,
2729
2886
  kind: "layout",
2730
2887
  slotKey: e.dir
2731
- })), e.hasError && (l.push(` ${s}: ${Q(e.dir, "Error")},`), a.push({
2888
+ })), e.hasError && (l.push(` ${s}: ${$(e.dir, "Error")},`), a.push({
2732
2889
  relPath: n,
2733
2890
  kind: "error",
2734
2891
  slotKey: e.dir
2735
- })), e.hasPending && (f.push(` ${s}: ${Q(e.dir, "Pending")},`), a.push({
2892
+ })), e.hasPending && (u.push(` ${s}: ${$(e.dir, "Pending")},`), a.push({
2736
2893
  relPath: r,
2737
2894
  kind: "pending",
2738
2895
  slotKey: e.dir
2739
- })), e.hasNotFound && (p.push(` ${s}: ${Q(e.dir, "NotFound")},`), a.push({
2896
+ })), e.hasNotFound && (p.push(` ${s}: ${$(e.dir, "NotFound")},`), a.push({
2740
2897
  relPath: i,
2741
2898
  kind: "notFound",
2742
2899
  slotKey: e.dir
2743
2900
  }));
2744
2901
  }
2745
- for (let e of u) a.push({
2902
+ for (let e of d) a.push({
2746
2903
  relPath: `../src/pages/${e.file}`,
2747
2904
  kind: "page",
2748
2905
  slotKey: e.pattern
2749
2906
  });
2750
- let y = a.map((e) => ` ${JSON.stringify(e.relPath)},`), b = a.map((e, t) => {
2907
+ let m = a.map((e) => ` ${JSON.stringify(e.relPath)},`), y = a.map((e, t) => {
2751
2908
  let n = JSON.stringify(e.slotKey);
2752
2909
  return e.kind === "page" ? ` if (newMods[${t}] && refs.pages[${n}] !== undefined) { refs.pages[${n}] = newMods[${t}]; changed = true }` : ` if (newMods[${t}]?.default) { refs.${e.kind === "layout" ? "layouts" : e.kind === "error" ? "errors" : e.kind === "pending" ? "pendings" : "notFounds"}[${n}] = newMods[${t}].default;${e.kind === "layout" ? ` refs.layoutLoaders[${n}] = newMods[${t}].loader;` : ""} changed = true }`;
2753
2910
  }), x = t.locales ?? [], S = x.length > 0, C = t.defaultLocale ?? x[0] ?? "en";
@@ -2758,7 +2915,7 @@ import {
2758
2915
  "import { useServerRequest } from '@voltro/web'",
2759
2916
  ...x.map((e) => `import i18nCatalog_${e} from '../src/locales/${e}'`)
2760
2917
  ] : [];
2761
- _ = [
2918
+ v = [
2762
2919
  "// GENERATED BY `voltro dev` — do not edit; will be overwritten on next boot.",
2763
2920
  "// Routes + per-page chain + not-found scopes assembled from src/pages/.",
2764
2921
  "//",
@@ -2801,7 +2958,7 @@ import {
2801
2958
  ...l,
2802
2959
  " },",
2803
2960
  " pendings: {",
2804
- ...f,
2961
+ ...u,
2805
2962
  " },",
2806
2963
  " notFounds: {",
2807
2964
  ...p,
@@ -2869,17 +3026,17 @@ import {
2869
3026
  "if (import.meta.hot) {",
2870
3027
  " import.meta.hot.accept(",
2871
3028
  " [",
2872
- ...y,
3029
+ ...m,
2873
3030
  " ],",
2874
3031
  " (newMods: Array<Record<string, unknown> | undefined>) => {",
2875
3032
  " let changed = false",
2876
- ...b,
3033
+ ...y,
2877
3034
  " if (changed) bump()",
2878
3035
  " },",
2879
3036
  " )",
2880
3037
  "}",
2881
3038
  ""
2882
- ].join("\n"), g = [
3039
+ ].join("\n"), _ = [
2883
3040
  "// GENERATED BY `voltro dev` — do not edit; will be overwritten on next boot.",
2884
3041
  "// The app's root component. It exports `App` and NOTHING ELSE: react-refresh",
2885
3042
  "// only accepts a module whose every export is a component, and a module it",
@@ -2945,20 +3102,20 @@ import {
2945
3102
  ] : [" return <Router routes={routes} notFounds={notFounds} />"],
2946
3103
  "}",
2947
3104
  ""
2948
- ].join("\n"), v = [
3105
+ ].join("\n"), b = [
2949
3106
  "// GENERATED BY `voltro dev` — do not edit; will be overwritten on next boot.",
2950
3107
  "// Entry: imports the generated App component and calls mount() with the",
2951
3108
  "// resolved apis map. Side-effect only — no local component definitions —",
2952
3109
  "// so downstream invalidations (user page edits) terminate at app.tsx.",
2953
3110
  "",
2954
- ...Kr(t),
3111
+ ...oi(t),
2955
3112
  "import { mount } from '@voltro/web'",
2956
- ...m,
3113
+ ...h,
2957
3114
  "import { App } from './app'",
2958
3115
  "import { preloadCurrentRoute } from './routeTable'",
2959
- ...Wr(t),
2960
- ...Hr(t, s),
2961
- ...Gr(t),
3116
+ ...ii(t),
3117
+ ...ni(t, s),
3118
+ ...ai(t),
2962
3119
  "",
2963
3120
  "// Preload the current route's page chunk BEFORE hydration so the first",
2964
3121
  "// client render matches the SSG/SSR-prerendered HTML. Without it, a lazy",
@@ -2973,77 +3130,77 @@ import {
2973
3130
  "",
2974
3131
  "mount(App, {",
2975
3132
  " apis: {",
2976
- ...h,
3133
+ ...g,
2977
3134
  " },",
2978
- ...Ur(t, s),
3135
+ ...ri(t, s),
2979
3136
  "})",
2980
3137
  "",
2981
- ai
3138
+ bi
2982
3139
  ].join("\n");
2983
- } else g = "", _ = "", v = [
3140
+ } else _ = "", v = "", b = [
2984
3141
  "// GENERATED BY `voltro dev` — do not edit; will be overwritten on next boot.",
2985
3142
  "// The user's root component lives at ../src/App.tsx; this file imports it",
2986
3143
  "// and calls mount(). Side-effect only, no component definitions, so the",
2987
3144
  "// user's component file remains the Fast Refresh boundary.",
2988
3145
  "",
2989
- ...Kr(t),
3146
+ ...oi(t),
2990
3147
  "import { mount } from '@voltro/web'",
2991
- ...m,
3148
+ ...h,
2992
3149
  "import App from '../src/App'",
2993
- ...Wr(t),
2994
- ...Hr(t, s),
2995
- ...Gr(t),
3150
+ ...ii(t),
3151
+ ...ni(t, s),
3152
+ ...ai(t),
2996
3153
  "",
2997
3154
  "mount(App, {",
2998
3155
  " apis: {",
2999
- ...h,
3156
+ ...g,
3000
3157
  " },",
3001
- ...Ur(t, s),
3158
+ ...ri(t, s),
3002
3159
  "})",
3003
3160
  "",
3004
- ai
3161
+ bi
3005
3162
  ].join("\n");
3006
- let b = r(e, ".framework");
3007
- await S.mkdir(b, { recursive: !0 }), t.env ? await Ze(b, i) : await S.rm(r(b, "env.public.ts"), { force: !0 }), await S.writeFile(r(b, "index.html"), l, "utf8"), await S.writeFile(r(b, "main.tsx"), v, "utf8"), g ? (await S.writeFile(r(b, "app.tsx"), g, "utf8"), await S.writeFile(r(b, "routeTable.ts"), _, "utf8")) : (await S.rm(r(b, "app.tsx"), { force: !0 }), await S.rm(r(b, "routeTable.ts"), { force: !0 }));
3008
- let x = r(e, ".gitignore"), C = "";
3163
+ let x = r(e, ".framework");
3164
+ await S.mkdir(x, { recursive: !0 }), t.env ? await lt(x, i) : await S.rm(r(x, "env.public.ts"), { force: !0 }), await S.writeFile(r(x, "index.html"), l, "utf8"), await S.writeFile(r(x, "main.tsx"), b, "utf8"), _ ? (await S.writeFile(r(x, "app.tsx"), _, "utf8"), await S.writeFile(r(x, "routeTable.ts"), v, "utf8")) : (await S.rm(r(x, "app.tsx"), { force: !0 }), await S.rm(r(x, "routeTable.ts"), { force: !0 }));
3165
+ let C = r(e, ".gitignore"), w = "";
3009
3166
  try {
3010
- C = await S.readFile(x, "utf8");
3167
+ w = await S.readFile(C, "utf8");
3011
3168
  } catch {}
3012
- let w = ["/.framework/"], T = C.split("\n").filter((e) => e.trim() !== "");
3013
- for (let e of w) T.includes(e) || T.push(e);
3014
- await S.writeFile(x, T.join("\n") + "\n", "utf8");
3015
- }, vi = async (e, n) => {
3169
+ let T = ["/.framework/"], E = w.split("\n").filter((e) => e.trim() !== "");
3170
+ for (let e of T) E.includes(e) || E.push(e);
3171
+ await S.writeFile(C, E.join("\n") + "\n", "utf8");
3172
+ }, Ni = async (e, n) => {
3016
3173
  try {
3017
3174
  let i = r(t(e), "project.json");
3018
3175
  if (!y(i)) return;
3019
3176
  let a = await S.readFile(i, "utf8"), o = JSON.parse(a).apps ?? {}, s = e.split("/").filter(Boolean).pop() ?? "", c = [];
3020
3177
  for (let [e, t] of Object.entries(o)) e !== s && t.port === n && c.push(e);
3021
3178
  if (c.length === 0) return;
3022
- Z.warn("sibling app(s) claim the same port — only one boots", {
3179
+ Q.warn("sibling app(s) claim the same port — only one boots", {
3023
3180
  port: n,
3024
3181
  conflicts: c,
3025
3182
  projectJson: i
3026
3183
  });
3027
3184
  } catch {}
3028
- }, yi = (e) => r(e, ".framework", "dist", "server", "appConfig.js"), bi = async (e) => {
3029
- let t = yi(e), n = y(t) ? t : r(e, "app.config.ts");
3185
+ }, Pi = (e) => r(e, ".framework", "dist", "server", "appConfig.js"), Fi = async (e) => {
3186
+ let t = Pi(e), n = y(t) ? t : r(e, "app.config.ts");
3030
3187
  try {
3031
3188
  let e = (await import(s(n).href)).default;
3032
3189
  return typeof e == "object" && e && "type" in e && e.type === "web" ? e : null;
3033
3190
  } catch {
3034
3191
  return null;
3035
3192
  }
3036
- }, xi = async (t) => {
3037
- let n = await bi(t);
3193
+ }, Ii = async (t) => {
3194
+ let n = await Fi(t);
3038
3195
  if (!n) return {
3039
3196
  ran: !1,
3040
3197
  exitCode: 0
3041
3198
  };
3042
- An();
3043
- let o = Jt();
3044
- an(o), Z.info("booting voltro dev (web)", { app: n.name ?? "(unnamed)" });
3045
- let s = await mi(t, n);
3046
- for (let e of s) Z.info("api wired", {
3199
+ Hn();
3200
+ let o = sn();
3201
+ _n(o), Q.info("booting voltro dev (web)", { app: n.name ?? "(unnamed)" });
3202
+ let s = await ki(t, n);
3203
+ for (let e of s) Q.info("api wired", {
3047
3204
  name: e.name,
3048
3205
  pkg: e.pkg,
3049
3206
  ...e.proxyTarget ? { proxyTo: e.proxyTarget } : { directWs: e.browserWsUrl }
@@ -3051,23 +3208,23 @@ import {
3051
3208
  Be(t).then((e) => {
3052
3209
  for (let t of e.files) if (t.action === "created") {
3053
3210
  let e = t.path.split("/").pop() ?? t.path;
3054
- Z.info(`${e} seeded`, { path: t.path });
3211
+ Q.info(`${e} seeded`, { path: t.path });
3055
3212
  }
3056
3213
  }).catch(() => {});
3057
- let { resolved: c } = await Qe({
3214
+ let { resolved: c } = await ut({
3058
3215
  rawEnv: n.env,
3059
3216
  appType: "web",
3060
3217
  root: t,
3061
- log: Z,
3218
+ log: Q,
3062
3219
  generateTypes: !0
3063
3220
  }), l = c.publicValues;
3064
- await _i(t, n, s, l), Z.debug("generated framework entry files", { files: [
3221
+ await Mi(t, n, s, l), Q.debug("generated framework entry files", { files: [
3065
3222
  "index.html",
3066
3223
  ".framework/main.tsx",
3067
3224
  ...n.env ? [".framework/env.public.ts"] : []
3068
3225
  ] });
3069
- let u = process.env.VOLTRO_IS_DASHBOARD === "1" && process.env.VOLTRO_DASHBOARD_PORT ? Number(process.env.VOLTRO_DASHBOARD_PORT) : n.port ?? 5173, d = n.name ?? "unnamed", f = rr("web", d, u), p = ur(d);
3070
- await tr({
3226
+ let u = process.env.VOLTRO_IS_DASHBOARD === "1" && process.env.VOLTRO_DASHBOARD_PORT ? Number(process.env.VOLTRO_DASHBOARD_PORT) : n.port ?? 5173, d = n.name ?? "unnamed", f = hr("web", d, u), p = Sr(d);
3227
+ await pr({
3071
3228
  id: f,
3072
3229
  name: d,
3073
3230
  kind: "web",
@@ -3075,18 +3232,18 @@ import {
3075
3232
  pid: process.pid,
3076
3233
  status: "booting",
3077
3234
  logFile: p.path
3078
- }).catch(() => {}), await vi(t, u);
3079
- let { pages: m, dirs: h } = await $(r(t, "src", "pages")), g = h.map((e) => ({
3235
+ }).catch(() => {}), await Ni(t, u);
3236
+ let { pages: m, dirs: h } = await gi(r(t, "src", "pages")), g = h.map((e) => ({
3080
3237
  dir: e.dir,
3081
3238
  hasLayout: e.hasLayout,
3082
3239
  hasError: e.hasError,
3083
3240
  hasPending: e.hasPending,
3084
3241
  hasNotFound: e.hasNotFound
3085
- })), v = await bt({
3242
+ })), v = await Mt({
3086
3243
  appRoot: t,
3087
3244
  pages: m
3088
3245
  });
3089
- v.wrote && Z.debug("routes codegen wrote", { path: i(t, v.path) });
3246
+ v.wrote && Q.debug("routes codegen wrote", { path: i(t, v.path) });
3090
3247
  let b = await Ge("vite", () => import("vite")), x = (await import("@vitejs/plugin-react")).default, C = (await import("@tailwindcss/vite")).default, w = r(t, ".framework"), T = r(t, "src"), E = /* @__PURE__ */ new Set([
3091
3248
  ".framework",
3092
3249
  "node_modules",
@@ -3111,7 +3268,7 @@ import {
3111
3268
  ...i.devDependencies
3112
3269
  });
3113
3270
  await Promise.all(a.map(async (n) => {
3114
- let i = await li(t, n);
3271
+ let i = await wi(t, n);
3115
3272
  if (!i) return;
3116
3273
  let a = r(i, "src");
3117
3274
  try {
@@ -3123,17 +3280,17 @@ import {
3123
3280
  }, D = r(t, "src", "pages"), te = (e) => e.endsWith(".tsx") && (e === D || e.startsWith(D + "/")), O = (e) => e === D || e.startsWith(D + "/"), k = async (e) => {
3124
3281
  try {
3125
3282
  let r = Date.now();
3126
- await _i(t, n, s, l);
3127
- let { pages: i } = await $(D);
3128
- await bt({
3283
+ await Mi(t, n, s, l);
3284
+ let { pages: i } = await gi(D);
3285
+ await Mt({
3129
3286
  appRoot: t,
3130
3287
  pages: i
3131
- }), Z.info("page tree regenerated", {
3288
+ }), Q.info("page tree regenerated", {
3132
3289
  reason: e,
3133
3290
  ms: Date.now() - r
3134
3291
  });
3135
3292
  } catch (t) {
3136
- Z.error("page tree regen failed", { reason: e }, t);
3293
+ Q.error("page tree regen failed", { reason: e }, t);
3137
3294
  }
3138
3295
  }, A = {
3139
3296
  name: "framework:regenerate-on-page-tree-change",
@@ -3156,16 +3313,16 @@ import {
3156
3313
  });
3157
3314
  }
3158
3315
  }, j = r(t, "app.config.ts"), M = (e) => {
3159
- if (!ie(e.env)) return "";
3316
+ if (!oe(e.env)) return "";
3160
3317
  let t = Object.entries(e.env.vars).map(([e, t]) => `${e}:${t.access}`).sort();
3161
3318
  return `${String(e.env.publicPrefix)}|${t.join(",")}`;
3162
- }, N = (e, t) => {
3319
+ }, ne = (e, t) => {
3163
3320
  let n = [];
3164
3321
  return e.port !== t.port && n.push(`port ${e.port ?? "(default)"} → ${t.port ?? "(default)"}`), JSON.stringify(e.proxies) !== JSON.stringify(t.proxies) && n.push("proxies"), JSON.stringify(e.allowedHosts) !== JSON.stringify(t.allowedHosts) && n.push("allowedHosts"), JSON.stringify(e.apis) !== JSON.stringify(t.apis) && n.push("apis"), M(e) !== M(t) && n.push("env"), n;
3165
- }, P = n, F = a(j), ne = {
3322
+ }, N = n, re = a(j), P = {
3166
3323
  name: "framework:watch-app-config",
3167
3324
  async configureServer(n) {
3168
- n.watcher.add(j), Z.info("watching app.config.ts for changes", { path: i(t, j) });
3325
+ n.watcher.add(j), Q.info("watching app.config.ts for changes", { path: i(t, j) });
3169
3326
  let r = async () => {
3170
3327
  try {
3171
3328
  try {
@@ -3173,9 +3330,9 @@ import {
3173
3330
  e && n.moduleGraph.invalidateModule(e);
3174
3331
  } catch {}
3175
3332
  let e = (await n.ssrLoadModule(j, { fixStacktrace: !0 })).default;
3176
- return typeof e == "object" && e && "type" in e && e.type === "web" ? e : (Z.warn("app.config.ts re-load returned wrong shape", { hasDefault: e !== void 0 }), null);
3333
+ return typeof e == "object" && e && "type" in e && e.type === "web" ? e : (Q.warn("app.config.ts re-load returned wrong shape", { hasDefault: e !== void 0 }), null);
3177
3334
  } catch (e) {
3178
- return Z.warn("app.config.ts re-load failed — ignoring this change", {}, e), null;
3335
+ return Q.warn("app.config.ts re-load failed — ignoring this change", {}, e), null;
3179
3336
  }
3180
3337
  }, o = null, s = () => {
3181
3338
  o && clearTimeout(o), o = setTimeout(() => {
@@ -3184,24 +3341,24 @@ import {
3184
3341
  }, c = async () => {
3185
3342
  let e = await r();
3186
3343
  if (!e) {
3187
- Z.info("app.config.ts onConfigChange: load returned null — skipping");
3344
+ Q.info("app.config.ts onConfigChange: load returned null — skipping");
3188
3345
  return;
3189
3346
  }
3190
- if (Z.info("app.config.ts onConfigChange: loaded", {
3347
+ if (Q.info("app.config.ts onConfigChange: loaded", {
3191
3348
  theme: e.theme,
3192
3349
  port: e.port,
3193
3350
  name: e.name
3194
- }), JSON.stringify(e) === JSON.stringify(P)) {
3195
- Z.info("app.config.ts onConfigChange: parsed config unchanged — skipping (no-op edit?)");
3351
+ }), JSON.stringify(e) === JSON.stringify(N)) {
3352
+ Q.info("app.config.ts onConfigChange: parsed config unchanged — skipping (no-op edit?)");
3196
3353
  return;
3197
3354
  }
3198
- let i = N(P, e);
3355
+ let i = ne(N, e);
3199
3356
  if (i.length > 0) {
3200
- Z.warn("app.config.ts changed — hard restart required", { fields: i });
3357
+ Q.warn("app.config.ts changed — hard restart required", { fields: i });
3201
3358
  try {
3202
3359
  await n.close();
3203
3360
  } catch {}
3204
- let e = le(process.execPath, [...process.execArgv, ...process.argv.slice(1)], {
3361
+ let e = de(process.execPath, [...process.execArgv, ...process.argv.slice(1)], {
3205
3362
  stdio: "inherit",
3206
3363
  env: process.env,
3207
3364
  cwd: process.cwd()
@@ -3211,45 +3368,45 @@ import {
3211
3368
  process.on("SIGINT", r), process.on("SIGTERM", a), e.on("exit", (e, t) => {
3212
3369
  process.off("SIGINT", r), process.off("SIGTERM", a), t ? process.kill(process.pid, t) : process.exit(e ?? 0);
3213
3370
  }), e.on("error", (e) => {
3214
- Z.error("restart spawn failed", {}, e), process.exit(1);
3371
+ Q.error("restart spawn failed", {}, e), process.exit(1);
3215
3372
  });
3216
3373
  return;
3217
3374
  }
3218
3375
  try {
3219
3376
  let r = Date.now();
3220
- await _i(t, e, await mi(t, e)), P = e, n.ws && n.ws.send({
3377
+ await Mi(t, e, await ki(t, e)), N = e, n.ws && n.ws.send({
3221
3378
  type: "full-reload",
3222
3379
  path: "*"
3223
- }), Z.info("app.config.ts soft-regen", {
3380
+ }), Q.info("app.config.ts soft-regen", {
3224
3381
  ms: Date.now() - r,
3225
3382
  reload: "full"
3226
3383
  });
3227
3384
  } catch (e) {
3228
- Z.error("app.config.ts soft-regen failed", {}, e);
3385
+ Q.error("app.config.ts soft-regen failed", {}, e);
3229
3386
  }
3230
- }, l = (t) => e(t) === "app.config.ts" ? t === j || a(t) === F : !1;
3387
+ }, l = (t) => e(t) === "app.config.ts" ? t === j || a(t) === re : !1;
3231
3388
  n.watcher.on("change", (e) => {
3232
- l(e) && (Z.info("app.config.ts change event (chokidar)", { file: e }), s());
3389
+ l(e) && (Q.info("app.config.ts change event (chokidar)", { file: e }), s());
3233
3390
  }), n.watcher.on("add", (e) => {
3234
- l(e) && (Z.info("app.config.ts add event (chokidar)", { file: e }), s());
3391
+ l(e) && (Q.info("app.config.ts add event (chokidar)", { file: e }), s());
3235
3392
  });
3236
3393
  try {
3237
3394
  let { watchFile: e } = await import("node:fs");
3238
3395
  e(j, { interval: 500 }, (e, t) => {
3239
- e.mtimeMs !== t.mtimeMs && (Z.info("app.config.ts change event (poll)", { mtime: e.mtimeMs }), s());
3240
- }), Z.info("app.config.ts polling watcher attached", { intervalMs: 500 });
3396
+ e.mtimeMs !== t.mtimeMs && (Q.info("app.config.ts change event (poll)", { mtime: e.mtimeMs }), s());
3397
+ }), Q.info("app.config.ts polling watcher attached", { intervalMs: 500 });
3241
3398
  } catch (e) {
3242
- Z.warn("app.config.ts polling watcher could not attach", {}, e);
3399
+ Q.warn("app.config.ts polling watcher could not attach", {}, e);
3243
3400
  }
3244
- On(Tn, Z, {
3401
+ Bn(Ln, Q, {
3245
3402
  root: t,
3246
3403
  onBeforeRestart: () => n.close()
3247
3404
  });
3248
3405
  }
3249
- }, I = /\/apps\/[^/]+\/.*\.(route|mutation|workflow|schema)\.tsx?$/, re = {
3406
+ }, ie = /\/apps\/[^/]+\/.*\.(route|mutation|workflow|schema)\.tsx?$/, F = {
3250
3407
  name: "framework:suppress-api-hmr",
3251
3408
  handleHotUpdate(e) {
3252
- if (I.test(e.file)) return [];
3409
+ if (ie.test(e.file)) return [];
3253
3410
  }
3254
3411
  }, ae = {
3255
3412
  name: "framework:reoptimize-on-rpcgroup-change",
@@ -3257,7 +3414,7 @@ import {
3257
3414
  let n = /* @__PURE__ */ new Map();
3258
3415
  for (let i of s) {
3259
3416
  if (!i.proxyTarget) continue;
3260
- let a = await li(t, i.pkg);
3417
+ let a = await wi(t, i.pkg);
3261
3418
  if (!a) continue;
3262
3419
  let o = r(a, "rpcGroup.generated.ts");
3263
3420
  try {
@@ -3283,14 +3440,14 @@ import {
3283
3440
  r !== t && (n.set(e, r), a = e);
3284
3441
  }
3285
3442
  if (a !== null) {
3286
- c = !0, Z.info(`rpcGroup changed (${i(t, a)}) — re-bundling the api client + reloading (descriptor edits propagate automatically; no manual restart needed)`);
3443
+ c = !0, Q.info(`rpcGroup changed (${i(t, a)}) — re-bundling the api client + reloading (descriptor edits propagate automatically; no manual restart needed)`);
3287
3444
  try {
3288
3445
  await S.rm(r(w, ".vite", "deps"), {
3289
3446
  recursive: !0,
3290
3447
  force: !0
3291
3448
  }), await e.restart(!0);
3292
3449
  } catch (e) {
3293
- c = !1, Z.error("rpcGroup re-optimize failed", {}, e);
3450
+ c = !1, Q.error("rpcGroup re-optimize failed", {}, e);
3294
3451
  }
3295
3452
  }
3296
3453
  }, u = (e) => {
@@ -3300,38 +3457,38 @@ import {
3300
3457
  };
3301
3458
  e.watcher.on("change", u), e.watcher.on("add", u);
3302
3459
  }
3303
- }, L = {};
3460
+ }, I = {};
3304
3461
  for (let e of s) {
3305
3462
  if (!e.proxyTarget) continue;
3306
- L[e.browserWsUrl] = {
3463
+ I[e.browserWsUrl] = {
3307
3464
  target: e.proxyTarget,
3308
3465
  ws: !0,
3309
3466
  changeOrigin: !0,
3310
3467
  ...e.wsPath ? {} : { rewrite: () => "/ws" }
3311
3468
  };
3312
3469
  let t = e.proxyTarget.replace(/^ws/, "http");
3313
- L[`/_voltro/api/${e.name}`] = {
3470
+ I[`/_voltro/api/${e.name}`] = {
3314
3471
  target: t,
3315
3472
  changeOrigin: !0,
3316
3473
  rewrite: (t) => t.replace(RegExp(`^/_voltro/api/${e.name}`), "")
3317
3474
  };
3318
3475
  }
3319
3476
  for (let [e, t] of Object.entries(n.proxies ?? {})) {
3320
- if (L[e]) {
3321
- Z.warn("user proxy ignored — prefix already claimed by an api ws proxy", { prefix: e });
3477
+ if (I[e]) {
3478
+ Q.warn("user proxy ignored — prefix already claimed by an api ws proxy", { prefix: e });
3322
3479
  continue;
3323
3480
  }
3324
- L[e] = {
3481
+ I[e] = {
3325
3482
  target: t.target,
3326
3483
  changeOrigin: t.changeOrigin ?? !0,
3327
3484
  ...t.rewrite === void 0 ? {} : { rewrite: (n) => n.replace(RegExp(`^${e}`), t.rewrite) }
3328
- }, Z.info(`proxy ${e} → ${t.target}`, {
3485
+ }, Q.info(`proxy ${e} → ${t.target}`, {
3329
3486
  prefix: e,
3330
3487
  target: t.target,
3331
3488
  ...t.rewrite === void 0 ? {} : { rewrite: t.rewrite }
3332
3489
  });
3333
3490
  }
3334
- let oe = {
3491
+ let se = {
3335
3492
  name: "framework:inspect",
3336
3493
  configureServer(e) {
3337
3494
  let i = null, a = async () => {
@@ -3343,18 +3500,18 @@ import {
3343
3500
  pattern: i.pattern,
3344
3501
  file: i.file,
3345
3502
  dirChain: i.dirChain,
3346
- renderMode: a.renderMode ?? "static",
3503
+ renderMode: nt(a, r("src", "pages", i.file)),
3347
3504
  interactive: a.interactive ?? "full",
3348
3505
  tenantAware: a.tenantAware === !0,
3349
- revalidateMs: Vn(a.revalidate),
3350
- staleWhileRevalidateMs: Vn(a.staleWhileRevalidate) ?? 0,
3506
+ revalidateMs: qe(a.revalidate),
3507
+ staleWhileRevalidateMs: qe(a.staleWhileRevalidate) ?? 0,
3351
3508
  cacheInvalidatesOn: Array.isArray(a.cacheInvalidatesOn) ? a.cacheInvalidatesOn : [],
3352
3509
  hasLoader: typeof a.loader == "function",
3353
3510
  hasMeta: a.meta != null,
3354
3511
  hasGetStaticPaths: typeof a.getStaticPaths == "function"
3355
3512
  });
3356
3513
  } catch (e) {
3357
- Z.warn("inspect: failed to load page metadata", { pattern: i.pattern }, e);
3514
+ Q.warn("inspect: failed to load page metadata", { pattern: i.pattern }, e);
3358
3515
  }
3359
3516
  return i = n, n;
3360
3517
  };
@@ -3452,22 +3609,22 @@ import {
3452
3609
  for (let [t, n] of Object.entries(e.headers ?? {})) n !== void 0 && (s[String(t).toLowerCase()] = Array.isArray(n) ? n.join(", ") : String(n));
3453
3610
  let c = i.split("?")[0];
3454
3611
  if (e.method === "GET" && (c === "/_voltro/inspect/logs" || i.startsWith("/_voltro/inspect/logs?"))) {
3455
- let e = G(s.origin);
3456
- if (H()) {
3612
+ let e = K(s.origin);
3613
+ if (U()) {
3457
3614
  t.statusCode = 503, t.setHeader("content-type", "application/json");
3458
3615
  for (let [n, r] of Object.entries(e)) t.setHeader(n, r);
3459
3616
  t.end(JSON.stringify({ error: "inspect disabled (VOLTRO_INSPECT=off)" }));
3460
3617
  return;
3461
3618
  }
3462
- let n = vn(i, nn());
3619
+ let n = An(i, hn());
3463
3620
  t.statusCode = n.status, t.setHeader("content-type", n.contentType);
3464
3621
  for (let [n, r] of Object.entries(e)) t.setHeader(n, r);
3465
3622
  t.end(n.body);
3466
3623
  return;
3467
3624
  }
3468
3625
  if (e.method === "POST" && c === "/_voltro/inspect/clientLog") {
3469
- let n = G(s.origin);
3470
- if (H()) {
3626
+ let n = K(s.origin);
3627
+ if (U()) {
3471
3628
  t.statusCode = 503, t.setHeader("content-type", "application/json");
3472
3629
  for (let [e, r] of Object.entries(n)) t.setHeader(e, r);
3473
3630
  t.end(JSON.stringify({ error: "inspect disabled (VOLTRO_INSPECT=off)" }));
@@ -3477,7 +3634,7 @@ import {
3477
3634
  e.setEncoding("utf-8"), e.on("data", (e) => {
3478
3635
  r += e;
3479
3636
  }), e.on("end", () => {
3480
- let e = fn(r, o);
3637
+ let e = wn(r, o);
3481
3638
  t.statusCode = e.status, t.setHeader("content-type", e.contentType);
3482
3639
  for (let [e, r] of Object.entries(n)) t.setHeader(e, r);
3483
3640
  t.end(e.body);
@@ -3487,14 +3644,14 @@ import {
3487
3644
  return;
3488
3645
  }
3489
3646
  if (c === "/_voltro/inspect/stream") {
3490
- let n = G(s.origin);
3491
- if (H()) {
3647
+ let n = K(s.origin);
3648
+ if (U()) {
3492
3649
  t.statusCode = 503, t.setHeader("content-type", "application/json");
3493
3650
  for (let [e, r] of Object.entries(n)) t.setHeader(e, r);
3494
3651
  t.end(JSON.stringify({ error: "inspect disabled (VOLTRO_INSPECT=off)" }));
3495
3652
  return;
3496
3653
  }
3497
- let r = U(s);
3654
+ let r = W(s);
3498
3655
  if (!r.ok) {
3499
3656
  t.statusCode = 401, t.setHeader("content-type", "application/json");
3500
3657
  for (let [e, r] of Object.entries(n)) t.setHeader(e, r);
@@ -3508,14 +3665,14 @@ import {
3508
3665
  for (let [e, r] of Object.entries(n)) t.setHeader(e, r);
3509
3666
  t.flushHeaders?.(), t.write("retry: 5000\n\n");
3510
3667
  let a = i.indexOf("?");
3511
- if (!(a !== -1 && new URLSearchParams(i.slice(a + 1)).get("live") === "1")) for (let e of o.buffered()) t.write(Yt(e));
3668
+ if (!(a !== -1 && new URLSearchParams(i.slice(a + 1)).get("live") === "1")) for (let e of o.buffered()) t.write(cn(e));
3512
3669
  let c = o.subscribe((e) => {
3513
3670
  try {
3514
- t.write(Yt(e));
3671
+ t.write(cn(e));
3515
3672
  } catch {}
3516
3673
  }), l = setInterval(() => {
3517
3674
  try {
3518
- t.write(Xt());
3675
+ t.write(ln());
3519
3676
  } catch {}
3520
3677
  }, 15e3), u = () => {
3521
3678
  clearInterval(l), c();
@@ -3524,11 +3681,11 @@ import {
3524
3681
  return;
3525
3682
  }
3526
3683
  try {
3527
- let o = kt(i, {
3684
+ let o = Vt(i, {
3528
3685
  kind: "web",
3529
3686
  meta: {
3530
3687
  name: n.name ?? "(unnamed)",
3531
- voltroVersion: Br,
3688
+ voltroVersion: ei,
3532
3689
  port: u,
3533
3690
  mode: "dev",
3534
3691
  apis: Object.entries(n.apis ?? {}).map(([e, t]) => {
@@ -3546,7 +3703,7 @@ import {
3546
3703
  size: 0,
3547
3704
  entries: []
3548
3705
  }),
3549
- env: () => St(n.name ?? "app", { contract: ie(n.env) ? n.env : void 0 })
3706
+ env: () => Pt(n.name ?? "app", { contract: oe(n.env) ? n.env : void 0 })
3550
3707
  }, s, { method: e.method ?? "GET" });
3551
3708
  if (o === null) return r();
3552
3709
  t.statusCode = o.status, t.setHeader("content-type", o.contentType);
@@ -3557,25 +3714,25 @@ import {
3557
3714
  }
3558
3715
  });
3559
3716
  }
3560
- }, se = n.name === "voltroDashboard" ? {
3717
+ }, ce = n.name === "voltroDashboard" ? {
3561
3718
  name: "framework:dashboard-registry",
3562
3719
  configureServer(e) {
3563
3720
  e.middlewares.use(async (e, t, n) => {
3564
3721
  if (!(e.url ?? "").startsWith("/api/dashboard/registry")) return n();
3565
3722
  try {
3566
- let e = await er();
3723
+ let e = await fr();
3567
3724
  t.statusCode = 200, t.setHeader("content-type", "application/json; charset=utf-8"), t.end(JSON.stringify(e));
3568
3725
  } catch (e) {
3569
3726
  t.statusCode = 500, t.setHeader("content-type", "text/plain"), t.end(`registry read error: ${e.message}`);
3570
3727
  }
3571
3728
  });
3572
3729
  }
3573
- } : null, ue = si(m), de = /* @__PURE__ */ new Set(), fe = ct(), pe = ut({
3574
- limit: fe,
3575
- onColdStart: (e) => Z.debug("ssr cold-compile start", { id: e }),
3576
- onColdEnd: (e) => Z.debug("ssr cold-compile end", { id: e })
3730
+ } : null, le = Si(m), fe = /* @__PURE__ */ new Set(), L = bt(), pe = St({
3731
+ limit: L,
3732
+ onColdStart: (e) => Q.debug("ssr cold-compile start", { id: e }),
3733
+ onColdEnd: (e) => Q.debug("ssr cold-compile end", { id: e })
3577
3734
  });
3578
- Z.debug(`ssr cold-compile concurrency ${fe}`, { concurrency: fe });
3735
+ Q.debug(`ssr cold-compile concurrency ${L}`, { concurrency: L });
3579
3736
  let me = null, he = async () => (me === null && (me = await S.readFile(r(t, ".framework", "index.html"), "utf8")), me), ge = {
3580
3737
  name: "framework:ssr",
3581
3738
  configureServer(e) {
@@ -3584,10 +3741,10 @@ import {
3584
3741
  if (i.method !== "GET" && i.method !== "HEAD") return o();
3585
3742
  let c = i.url ?? "/", l = c.indexOf("?"), u = (l === -1 ? c : c.slice(0, l)) || "/";
3586
3743
  if (u.startsWith("/@") || u.startsWith("/node_modules/") || u.startsWith("/.framework/") || u.startsWith("/_voltro/") || u === "/main.tsx" || u === "/index.html" || u === "/sw.js" || u === "/favicon.ico" || u === "/robots.txt" || /\.[a-z0-9]+$/i.test(u)) return o();
3587
- let d = ci(u, ue);
3744
+ let d = Ci(u, le);
3588
3745
  if (!d) return o();
3589
- let f = !de.has(d.route.pattern), p = Date.now();
3590
- f && Z.info(`ssr compiling ${d.route.pattern}`, {
3746
+ let f = !fe.has(d.route.pattern), p = Date.now();
3747
+ f && Q.info(`ssr compiling ${d.route.pattern}`, {
3591
3748
  pattern: d.route.pattern,
3592
3749
  pathname: u
3593
3750
  });
@@ -3606,15 +3763,15 @@ import {
3606
3763
  }
3607
3764
  };
3608
3765
  try {
3609
- let l = await g("loadPage", async () => await n(r(t, "src", "pages", d.route.file))), v = l.renderMode ?? "static", y = ni(h, d.route.dirChain), b = v === "spa" && y.some((e) => e.hasLayout);
3766
+ let l = await g("loadPage", async () => await n(r(t, "src", "pages", d.route.file))), v = nt(l, r("src", "pages", d.route.file)), y = _i(h, d.route.dirChain), b = v === "spa" && y.some((e) => e.hasLayout);
3610
3767
  if (v !== "ssr" && v !== "isr" && !b) return o();
3611
3768
  let x = {};
3612
3769
  for (let [e, t] of Object.entries(i.headers ?? {})) typeof t == "string" ? x[e] = t : Array.isArray(t) && (x[e] = t.join(", "));
3613
- let S = gi(hi(s[0]), x.cookie), C = new AbortController(), w = () => C.abort();
3770
+ let S = ji(Ai(s[0]), x.cookie), C = new AbortController(), w = () => C.abort();
3614
3771
  a.once("close", w);
3615
3772
  let T = null, E = [], ee = {};
3616
3773
  try {
3617
- ({chain: E, segmentLoaderData: ee} = await g("loadChain", () => ri({
3774
+ ({chain: E, segmentLoaderData: ee} = await g("loadChain", () => vi({
3618
3775
  entries: y,
3619
3776
  loadLayout: (e) => n(r(t, "src", "pages", e.dir, "layout.tsx")),
3620
3777
  loadError: (e) => n(r(t, "src", "pages", e.dir, "error.tsx")),
@@ -3651,15 +3808,28 @@ import {
3651
3808
  cookies: D.parseCookieHeader(x.cookie),
3652
3809
  headers: x,
3653
3810
  url: c
3654
- }, k = l.interactive ?? "full", A = b ? null : Or({
3811
+ }, k = l.interactive ?? "full", A = b ? Vr({
3655
3812
  helpers: D,
3656
3813
  page: `src/pages/${d.route.file}`,
3814
+ interactive: k,
3815
+ delivery: "stream",
3816
+ renderInput: {
3817
+ descriptor: te,
3818
+ params: d.params,
3819
+ pathname: u,
3820
+ segmentLoaderData: ee,
3821
+ requestContext: O
3822
+ }
3823
+ }) : null, j = b ? null : Br({
3824
+ helpers: D,
3825
+ page: `src/pages/${d.route.file}`,
3826
+ pathname: u,
3657
3827
  renderMode: v,
3658
3828
  interactive: k,
3659
3829
  loaderData: T,
3660
3830
  segmentLoaderData: ee,
3661
3831
  pageLoaderRan: typeof l.loader == "function"
3662
- }), j = [];
3832
+ }), M = [];
3663
3833
  await g("collectCss", async () => {
3664
3834
  let e = /* @__PURE__ */ new Set(), n = [
3665
3835
  r(t, "src", "pages", d.route.file),
@@ -3670,48 +3840,69 @@ import {
3670
3840
  ]),
3671
3841
  r(t, ".framework", "main.tsx")
3672
3842
  ];
3673
- for (let t of n) await _(t, e, j);
3843
+ for (let t of n) await _(t, e, M);
3674
3844
  });
3675
- let M = await g("readShell", he), N = await g("transformShell", () => e.transformIndexHtml(c, M)), P = j.map((e) => `<link rel="stylesheet" href="${e}?direct" />`).join("\n "), F = O.cookies["voltro:locale"] ?? "en", ne = Date.now();
3676
- if (b) {
3677
- let e = kr({
3845
+ let ne = await g("readShell", he), N = await g("transformShell", () => e.transformIndexHtml(c, ne)), re = M.map((e) => `<link rel="stylesheet" href="${e}?direct" />`).join("\n "), P = O.cookies["voltro:locale"] ?? "en", ie = Date.now();
3846
+ if (A) {
3847
+ let e = (e) => Ur({
3678
3848
  helpers: D,
3679
- renderInput: {
3680
- descriptor: te,
3681
- params: d.params,
3682
- pathname: u,
3683
- segmentLoaderData: ee,
3684
- requestContext: O
3849
+ prepared: A,
3850
+ meta: e,
3851
+ interactive: k,
3852
+ extra: [re]
3853
+ });
3854
+ if (A.hasDeferred) Qr({
3855
+ res: a,
3856
+ shell: Xr({
3857
+ shell: N,
3858
+ inlineModuleScriptsAsync: !0
3859
+ }),
3860
+ htmlLang: P,
3861
+ headers: {
3862
+ "content-type": "text/html; charset=utf-8",
3863
+ "x-voltro-rendered-by": "spa-shell-dev"
3864
+ },
3865
+ headInjection: e,
3866
+ render: (e) => D.renderPageToStream({
3867
+ ...A.renderInput,
3868
+ ...e
3869
+ }),
3870
+ onShellError: (e) => {
3871
+ Q.warn("spa-shell-dev shell render failed; falling back to SPA shell", {
3872
+ pathname: u,
3873
+ pattern: d.route.pattern
3874
+ }, e), o();
3685
3875
  }
3686
- }), t = [
3687
- P,
3688
- D.renderMetaToHtml(e.meta),
3689
- `<meta name="voltro-interactive" content="${k}" />`,
3690
- e.stateScript
3691
- ].filter((e) => e.length > 0).join("\n "), n = N.replace("<div id=\"root\"></div>", `<div id="root">${e.body}</div>`).replace("</head>", ` ${t}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${F}"`);
3692
- a.statusCode = 200, a.setHeader("content-type", "text/html; charset=utf-8"), a.setHeader("x-voltro-rendered-by", "spa-shell-dev"), a.end(n);
3693
- } else if (A) {
3876
+ });
3877
+ else {
3878
+ let t = Hr({
3879
+ helpers: D,
3880
+ prepared: A
3881
+ }), n = N.replace("<div id=\"root\"></div>", `<div id="root">${t.body}</div>`).replace("</head>", ` ${e(t.meta)}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${P}"`);
3882
+ a.statusCode = 200, a.setHeader("content-type", "text/html; charset=utf-8"), a.setHeader("x-voltro-rendered-by", "spa-shell-dev"), a.end(n);
3883
+ }
3884
+ } else if (j) {
3694
3885
  let e = (e) => [
3695
- P,
3886
+ re,
3696
3887
  D.renderMetaToHtml(e),
3697
3888
  `<meta name="voltro-interactive" content="${k}" />`,
3698
- ...A.hasDeferred ? [D.renderDeferredRegistryScript()] : [],
3699
- D.renderRouterStateScript(A.stateInput)
3889
+ ...j.hasDeferred ? [D.renderDeferredRegistryScript()] : [],
3890
+ D.renderRouterStateScript(j.stateInput)
3700
3891
  ].filter((e) => e.length > 0).join("\n "), t = {
3701
3892
  descriptor: te,
3702
3893
  params: d.params,
3703
3894
  pathname: u,
3704
- loaderData: A.loaderData,
3705
- segmentLoaderData: A.segmentLoaderData,
3895
+ loaderData: j.loaderData,
3896
+ segmentLoaderData: j.segmentLoaderData,
3706
3897
  requestContext: O
3707
3898
  };
3708
- if (v === "ssr" && k === "full") Rr({
3899
+ if (v === "ssr" && k === "full") Qr({
3709
3900
  res: a,
3710
- shell: Ir({
3901
+ shell: Xr({
3711
3902
  shell: N,
3712
3903
  inlineModuleScriptsAsync: !0
3713
3904
  }),
3714
- htmlLang: F,
3905
+ htmlLang: P,
3715
3906
  headers: {
3716
3907
  "content-type": "text/html; charset=utf-8",
3717
3908
  "x-voltro-rendered-by": "ssr-dev"
@@ -3722,58 +3913,58 @@ import {
3722
3913
  ...e
3723
3914
  }),
3724
3915
  onShellError: (e) => {
3725
- Z.warn("ssr-dev shell render failed; falling back to SPA shell", {
3916
+ Q.warn("ssr-dev shell render failed; falling back to SPA shell", {
3726
3917
  pathname: u,
3727
3918
  pattern: d.route.pattern
3728
3919
  }, e), o();
3729
3920
  }
3730
3921
  });
3731
3922
  else {
3732
- let { html: n, meta: r } = D.renderPageToHtml(t), i = N.replace("<div id=\"root\"></div>", `<div id="root">${n}</div>`).replace("</head>", ` ${e(r)}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${F}"`);
3923
+ let { html: n, meta: r } = D.renderPageToHtml(t), i = N.replace("<div id=\"root\"></div>", `<div id="root">${n}</div>`).replace("</head>", ` ${e(r)}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${P}"`);
3733
3924
  a.statusCode = 200, a.setHeader("content-type", "text/html; charset=utf-8"), a.setHeader("x-voltro-rendered-by", "ssr-dev"), a.end(i);
3734
3925
  }
3735
3926
  }
3736
- m.render = Date.now() - ne;
3737
- let I = Date.now() - p;
3738
- f ? (de.add(d.route.pattern), Z.info(`ssr compiled ${d.route.pattern} in ${I}ms`, {
3927
+ m.render = Date.now() - ie;
3928
+ let F = Date.now() - p;
3929
+ f ? (fe.add(d.route.pattern), Q.info(`ssr compiled ${d.route.pattern} in ${F}ms`, {
3739
3930
  pattern: d.route.pattern,
3740
3931
  pathname: u,
3741
- elapsedMs: I,
3932
+ elapsedMs: F,
3742
3933
  cold: !0,
3743
3934
  phases: m
3744
- })) : I > 200 && Z.info(`ssr rendered ${u} in ${I}ms`, {
3935
+ })) : F > 200 && Q.info(`ssr rendered ${u} in ${F}ms`, {
3745
3936
  pattern: d.route.pattern,
3746
3937
  pathname: u,
3747
- elapsedMs: I,
3938
+ elapsedMs: F,
3748
3939
  cold: !1,
3749
3940
  phases: m
3750
3941
  });
3751
3942
  } catch (e) {
3752
- if (Dr(e)) {
3753
- Z.error("ssr-dev render refused", {
3943
+ if (zr(e)) {
3944
+ Q.error("ssr-dev render refused", {
3754
3945
  pathname: u,
3755
3946
  pattern: d.route.pattern
3756
3947
  }, e), a.statusCode = 500, a.setHeader("content-type", "text/plain; charset=utf-8"), a.end(e.message);
3757
3948
  return;
3758
3949
  }
3759
- Z.warn("ssr-dev render failed; falling back to SPA shell", {
3950
+ Q.warn("ssr-dev render failed; falling back to SPA shell", {
3760
3951
  pathname: u,
3761
3952
  pattern: d.route.pattern
3762
3953
  }, e), o();
3763
3954
  }
3764
3955
  });
3765
3956
  }
3766
- }, _e = Date.now(), ve = b.version ?? "?", ye = await Vr(), be = r(t, "node_modules", "@voltro", "ui-shadcn"), R = y(r(be, "package.json")) ? be : null, xe = [], Se = await (async () => {
3957
+ }, R = Date.now(), _e = b.version ?? "?", ve = await ti(), ye = r(t, "node_modules", "@voltro", "ui-shadcn"), z = y(r(ye, "package.json")) ? ye : null, be = [], xe = await (async () => {
3767
3958
  let e = [];
3768
3959
  for (let n of s) {
3769
3960
  if (!n.proxyTarget) continue;
3770
- let i = await li(t, n.pkg);
3961
+ let i = await wi(t, n.pkg);
3771
3962
  if (i) try {
3772
3963
  e.push(await S.readFile(r(i, "rpcGroup.generated.ts"), "utf8"));
3773
3964
  } catch {}
3774
3965
  }
3775
3966
  if (e.length === 0) return !1;
3776
- let n = ce("sha1").update(e.join("\0")).digest("hex"), i = r(w, ".voltro-rpcgroup-optimize"), a = "";
3967
+ let n = ue("sha1").update(e.join("\0")).digest("hex"), i = r(w, ".voltro-rpcgroup-optimize"), a = "";
3777
3968
  try {
3778
3969
  a = (await S.readFile(i, "utf8")).trim();
3779
3970
  } catch {}
@@ -3783,83 +3974,83 @@ import {
3783
3974
  } catch {}
3784
3975
  return !0;
3785
3976
  })();
3786
- Se && Z.info("rpcGroup changed since last boot — forcing a dep re-optimize so the browser loads the current api client"), await (await b.createServer({
3977
+ xe && Q.info("rpcGroup changed since last boot — forcing a dep re-optimize so the browser loads the current api client"), await (await b.createServer({
3787
3978
  root: w,
3788
3979
  envPrefix: "__VOLTRO_VITE_ENV_DISABLED__",
3789
3980
  ssr: { noExternal: ["react-intl"] },
3790
3981
  resolve: {
3791
3982
  dedupe: ["react", "react-dom"],
3792
3983
  alias: [
3793
- ...ye ? [{
3984
+ ...ve ? [{
3794
3985
  find: "@voltro/devtools/styles.css",
3795
- replacement: r(ye, "src/styles.css")
3986
+ replacement: r(ve, "src/styles.css")
3796
3987
  }, {
3797
3988
  find: "@voltro/devtools",
3798
- replacement: r(ye, "src/index.ts")
3989
+ replacement: r(ve, "src/index.ts")
3799
3990
  }] : [],
3800
- ...R ? [
3991
+ ...z ? [
3801
3992
  {
3802
3993
  find: "@voltro/ui-shadcn/tokens.css",
3803
- replacement: r(R, "src/tokens.css")
3994
+ replacement: r(z, "src/tokens.css")
3804
3995
  },
3805
3996
  {
3806
3997
  find: "@voltro/ui-shadcn/cn",
3807
- replacement: r(R, "src/cn.ts")
3998
+ replacement: r(z, "src/cn.ts")
3808
3999
  },
3809
4000
  {
3810
4001
  find: "@voltro/ui-shadcn/brand",
3811
- replacement: r(R, "src/brand/voltroLogo.tsx")
4002
+ replacement: r(z, "src/brand/voltroLogo.tsx")
3812
4003
  },
3813
4004
  {
3814
4005
  find: "@voltro/ui-shadcn",
3815
- replacement: r(R, "src/index.ts")
4006
+ replacement: r(z, "src/index.ts")
3816
4007
  }
3817
4008
  ] : [],
3818
4009
  ...Ue(t)
3819
4010
  ]
3820
4011
  },
3821
4012
  optimizeDeps: {
3822
- include: [...s.map((e) => `${e.pkg}/rpcGroup`), ...xe],
3823
- force: Se
4013
+ include: [...s.map((e) => `${e.pkg}/rpcGroup`), ...be],
4014
+ force: xe
3824
4015
  },
3825
- customLogger: st(),
4016
+ customLogger: yt(),
3826
4017
  plugins: [
3827
- zn(r(t, "src", "pages")),
4018
+ $n(r(t, "src", "pages")),
3828
4019
  x(),
3829
4020
  C(),
3830
4021
  ee,
3831
4022
  A,
3832
- ne,
3833
- re,
4023
+ P,
4024
+ F,
3834
4025
  ae,
3835
- oe,
4026
+ se,
3836
4027
  ge,
3837
- ...se ? [se] : []
4028
+ ...ce ? [ce] : []
3838
4029
  ],
3839
4030
  server: {
3840
4031
  port: u,
3841
4032
  strictPort: !0,
3842
4033
  host: !0,
3843
4034
  allowedHosts: n.allowedHosts === !0 || [...n.allowedHosts ?? []],
3844
- proxy: L,
3845
- fs: { allow: [t, ...qr(t)] }
4035
+ proxy: I,
4036
+ fs: { allow: [t, ...si(t)] }
3846
4037
  },
3847
4038
  appType: "spa",
3848
4039
  cacheDir: r(w, ".vite"),
3849
4040
  publicDir: r(t, "public")
3850
- })).listen(), zr.info(`v${ve} ready in ${Date.now() - _e}ms`, {
3851
- version: ve,
3852
- bootMs: Date.now() - _e
3853
- }), Z.info(`listening on http://localhost:${u}`, {
4041
+ })).listen(), $r.info(`v${_e} ready in ${Date.now() - R}ms`, {
4042
+ version: _e,
4043
+ bootMs: Date.now() - R
4044
+ }), Q.info(`listening on http://localhost:${u}`, {
3854
4045
  port: u,
3855
4046
  app: n.name ?? "(unnamed)"
3856
4047
  });
3857
- for (let e of s) e.proxyTarget && (Z.info(`proxy /ws/${e.name} → ${e.proxyTarget}`, {
4048
+ for (let e of s) e.proxyTarget && (Q.info(`proxy /ws/${e.name} → ${e.proxyTarget}`, {
3858
4049
  api: e.name,
3859
4050
  target: e.proxyTarget
3860
- }), Z.info(`proxy /_voltro/api/${e.name} → ${e.proxyTarget.replace(/^ws/, "http")}/_voltro/inspect`, { api: e.name }));
4051
+ }), Q.info(`proxy /_voltro/api/${e.name} → ${e.proxyTarget.replace(/^ws/, "http")}/_voltro/inspect`, { api: e.name }));
3861
4052
  try {
3862
- await tr({
4053
+ await pr({
3863
4054
  id: f,
3864
4055
  name: d,
3865
4056
  kind: "web",
@@ -3868,13 +4059,13 @@ import {
3868
4059
  status: "live",
3869
4060
  logFile: p.path
3870
4061
  });
3871
- let e = hr(t);
4062
+ let e = Dr(t);
3872
4063
  if (e) {
3873
- let t = await Tr({ dashboardAppPath: e });
3874
- t.status === "launched" ? Z.info(`dashboard launched at http://localhost:${t.port}`, { port: t.port }) : t.status === "already-running" && Z.debug(`dashboard already running on :${t.port}`, { port: t.port });
4064
+ let t = await Lr({ dashboardAppPath: e });
4065
+ t.status === "launched" ? Q.info(`dashboard launched at http://localhost:${t.port}`, { port: t.port }) : t.status === "already-running" && Q.debug(`dashboard already running on :${t.port}`, { port: t.port });
3875
4066
  }
3876
4067
  setInterval(() => {
3877
- tr({
4068
+ pr({
3878
4069
  id: f,
3879
4070
  name: d,
3880
4071
  kind: "web",
@@ -3885,50 +4076,50 @@ import {
3885
4076
  }).catch(() => {});
3886
4077
  }, 1e4).unref();
3887
4078
  let n = () => {
3888
- nr(f), p.dispose();
4079
+ mr(f), p.dispose();
3889
4080
  };
3890
4081
  process.on("SIGINT", n), process.on("SIGTERM", n);
3891
4082
  } catch (e) {
3892
- Z.warn("runtime-registry write failed", {}, e);
4083
+ Q.warn("runtime-registry write failed", {}, e);
3893
4084
  }
3894
4085
  return _({
3895
4086
  app: n.name ?? "unnamed",
3896
4087
  kind: "web",
3897
4088
  url: `http://localhost:${u}`,
3898
- bootMs: Date.now() - _e
4089
+ bootMs: Date.now() - R
3899
4090
  }), new Promise(() => {});
3900
- }, Si = async (e) => {
4091
+ }, Li = async (e) => {
3901
4092
  process.env.NODE_ENV || (process.env.NODE_ENV = "production");
3902
- let t = await bi(e);
4093
+ let t = await Fi(e);
3903
4094
  if (!t) return {
3904
4095
  ran: !1,
3905
4096
  exitCode: 0
3906
4097
  };
3907
- let n = Date.now(), i = Z.child("serve");
4098
+ let n = Date.now(), i = Q.child("serve");
3908
4099
  i.info("booting voltro serve (preview)", { app: t.name ?? "(unnamed)" });
3909
- let a = await mi(e, t);
4100
+ let a = await ki(e, t);
3910
4101
  for (let e of a) i.info("api wired", {
3911
4102
  name: e.name,
3912
4103
  pkg: e.pkg
3913
4104
  });
3914
- await _i(e, t, a);
4105
+ await Mi(e, t, a);
3915
4106
  {
3916
- let { pages: t } = await $(r(e, "src", "pages"));
3917
- await bt({
4107
+ let { pages: t } = await gi(r(e, "src", "pages"));
4108
+ await Mt({
3918
4109
  appRoot: e,
3919
4110
  pages: t
3920
4111
  });
3921
4112
  }
3922
4113
  let o = t.port ?? 5173, s = await Ge("vite", () => import("vite")), c = (await import("@vitejs/plugin-react")).default, l = r(e, ".framework");
3923
- Z.info("running production build"), await s.build({
4114
+ Q.info("running production build"), await s.build({
3924
4115
  root: l,
3925
4116
  envPrefix: "__VOLTRO_VITE_ENV_DISABLED__",
3926
4117
  plugins: [c()],
3927
- customLogger: st(),
4118
+ customLogger: yt(),
3928
4119
  resolve: { dedupe: ["react", "react-dom"] },
3929
4120
  build: {
3930
4121
  outDir: "dist",
3931
- rollupOptions: { output: { manualChunks: Xr } }
4122
+ rollupOptions: { output: { manualChunks: ui } }
3932
4123
  },
3933
4124
  publicDir: r(e, "public")
3934
4125
  });
@@ -3948,14 +4139,14 @@ import {
3948
4139
  extras: f,
3949
4140
  bootMs: Date.now() - n
3950
4141
  }), new Promise(() => {});
3951
- }, Ci = 5e3, wi = 6e4, Ti = (e, t) => {
4142
+ }, Ri = 5e3, zi = 6e4, Bi = (e, t) => {
3952
4143
  if (e.length === 0) return 0;
3953
4144
  if (e.length === 1) return e[0];
3954
4145
  let n = t * (e.length - 1), r = Math.floor(n), i = Math.ceil(n);
3955
4146
  if (r === i) return e[r];
3956
4147
  let a = n - r;
3957
4148
  return e[r] * (1 - a) + e[i] * a;
3958
- }, Ei = (e) => {
4149
+ }, Vi = (e) => {
3959
4150
  if (e.length === 0) return {
3960
4151
  p50: 0,
3961
4152
  p95: 0,
@@ -3967,15 +4158,15 @@ import {
3967
4158
  let t = e.slice().sort((e, t) => e - t), n = 0;
3968
4159
  for (let e of t) n += e;
3969
4160
  return {
3970
- p50: Ti(t, .5),
3971
- p95: Ti(t, .95),
3972
- p99: Ti(t, .99),
4161
+ p50: Bi(t, .5),
4162
+ p95: Bi(t, .95),
4163
+ p99: Bi(t, .99),
3973
4164
  mean: n / t.length,
3974
4165
  min: t[0],
3975
4166
  max: t[t.length - 1]
3976
4167
  };
3977
- }, Di = (e = {}) => {
3978
- let t = e.maxSamples ?? Ci, n = e.defaultWindowMs ?? wi, r = [];
4168
+ }, Hi = (e = {}) => {
4169
+ let t = e.maxSamples ?? Ri, n = e.defaultWindowMs ?? zi, r = [];
3979
4170
  return {
3980
4171
  record(e) {
3981
4172
  A(e), r.push({
@@ -4004,7 +4195,7 @@ import {
4004
4195
  tag: e.tag,
4005
4196
  count: e.samples.length,
4006
4197
  errorCount: n,
4007
- latencyMs: Ei(t)
4198
+ latencyMs: Vi(t)
4008
4199
  });
4009
4200
  }
4010
4201
  return c.sort((e, t) => t.count - e.count), {
@@ -4017,4 +4208,4 @@ import {
4017
4208
  };
4018
4209
  };
4019
4210
  //#endregion
4020
- export { Kt as $, Hn as A, ye as At, mn as B, lr as C, Xe as Ct, er as D, Be as Dt, rr as E, Ue as Et, On as F, Jt as G, an as H, En as I, Ot as J, Xt as K, Tn as L, Wn as M, Bn as N, nr as O, Ve as Ot, Vn as P, Nt as Q, Cn as R, hr as S, Qe as St, dr as T, Ge as Tt, nn as U, fn as V, Yt as W, Rt as X, U as Y, Gt as Z, Or as _, St as _t, ri as a, jt as at, mr as b, ut as bt, mi as c, Vt as ct, Xr as d, zt as dt, Mt as et, $ as f, Ft as ft, Dr as g, wt as gt, Rr as h, H as ht, gi as i, Lt as it, Un as j, tr as k, ve as kt, xi as l, Ht as lt, Ir as m, G as mt, Zr as n, Pt as nt, ni as o, Wt as ot, _i as p, It as pt, V as q, hi as r, kt as rt, bi as s, Ut as st, Di as t, At as tt, Si as u, Bt as ut, kr as v, Ct as vt, ur as w, Ye as wt, Tr as x, ct as xt, gr as y, bt as yt, vn as z };
4211
+ export { Kt as $, mr as A, Ke as At, hn as B, Lr as C, rt as Ct, Cr as D, Je as Dt, Sr as E, nt as Et, Fn as F, Ve as Ft, Bt as G, sn as H, An as I, ve as It, rn as J, W as K, En as L, ye as Lt, Bn as M, Ge as Mt, Rn as N, Ue as Nt, hr as O, Ye as Ot, Ln as P, Be as Pt, Ht as Q, wn as R, Er as S, Ze as St, xr as T, et as Tt, ln as U, cn as V, H as W, an as X, Gt as Y, Wt as Z, Br as _, St as _t, vi as a, $t as at, Ur as b, ct as bt, ki as c, Zt as ct, ui as d, K as dt, Vt as et, gi as f, U as ft, zr as g, Mt as gt, Qr as h, Ft as ht, ji as i, tn as it, pr as j, qe as jt, fr as k, Xe as kt, Ii as l, qt as lt, Xr as m, Pt as mt, di as n, Ut as nt, _i as o, en as ot, Mi as p, It as pt, Xt as q, Ai as r, nn as rt, Fi as s, Qt as st, Hi as t, Yt as tt, Li as u, Jt as ut, Vr as v, bt as vt, Dr as w, Qe as wt, Or as x, st as xt, Hr as y, ut as yt, _n as z };