@voltro/cli 0.30.2 → 0.31.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 (120) hide show
  1. package/CHANGELOG.md +115 -0
  2. package/dist/apiBuild-BOqL1dlg.js +2 -0
  3. package/dist/{apiBuild-BUS1RfPi.js → apiBuild-CLPt-pX6.js} +2 -2
  4. package/dist/appGraph-CvQCte0z.js +2 -0
  5. package/dist/appGraph-gQ_6GkQQ.js +110 -0
  6. package/dist/bin.js +3 -3
  7. package/dist/checkCommand-ClRvH_SN.js +2 -0
  8. package/dist/{checkCommand-D_wdOFhw.js → checkCommand-D7r6_pk7.js} +309 -453
  9. package/dist/{commands-BgGAUcku.js → commands-CNVVv03h.js} +2566 -2505
  10. package/dist/{dbCommand-CbPRCD1x.js → dbCommand-BH8GAYuf.js} +22 -2
  11. package/dist/dbCommand-BwQ_Jl98.js +2 -0
  12. package/dist/{dev-tPcOmjPJ.js → dev-DOZVMVfi.js} +1 -1
  13. package/dist/{dev-GAOIot9G.js → dev-DdQEn2Ia.js} +1774 -1771
  14. package/dist/index.js +1 -1
  15. package/dist/{inspectMetrics-BM1vrsga.js → inspectMetrics-BeEAnjqw.js} +727 -480
  16. package/dist/{sdkgen-BV4fFucu.js → sdkgen-v9WV8zRi.js} +1 -1
  17. package/dist/{serveCommand-ClqXCX1y.js → serveCommand-KsKXXWn4.js} +289 -289
  18. package/dist/serveEntry.js +2 -2
  19. package/dist/{start-CTnNvKlk.js → start-CI2QdKy9.js} +204 -199
  20. package/dist/startEntry.js +2 -2
  21. package/package.json +17 -17
  22. package/templates/AGENTS.md +43 -43
  23. package/templates/agent-docs/_index.md +43 -43
  24. package/templates/agent-docs/_manifest.json +84 -42
  25. package/templates/agent-docs/database/migrations.md +14 -1
  26. package/templates/agent-docs/internationalization.md +29 -0
  27. package/templates/agent-docs/plugins/ai-flows.md +148 -0
  28. package/templates/agent-docs/plugins/analytics-postgres.md +90 -0
  29. package/templates/agent-docs/plugins/atlassian.md +378 -0
  30. package/templates/agent-docs/plugins/audit.md +324 -0
  31. package/templates/agent-docs/plugins/auth-auth0.md +92 -0
  32. package/templates/agent-docs/plugins/auth-clerk.md +90 -0
  33. package/templates/agent-docs/plugins/auth-kinde.md +88 -0
  34. package/templates/agent-docs/plugins/auth-oidc.md +95 -0
  35. package/templates/agent-docs/plugins/auth-supabase.md +103 -0
  36. package/templates/agent-docs/plugins/auth-workos.md +105 -0
  37. package/templates/agent-docs/plugins/auth.md +227 -0
  38. package/templates/agent-docs/plugins/billing.md +324 -0
  39. package/templates/agent-docs/plugins/broadcast.md +144 -0
  40. package/templates/agent-docs/plugins/cdc-out.md +116 -0
  41. package/templates/agent-docs/plugins/clickhouse.md +91 -0
  42. package/templates/agent-docs/plugins/datadog.md +105 -0
  43. package/templates/agent-docs/plugins/deactivation.md +114 -0
  44. package/templates/agent-docs/plugins/duckdb.md +82 -0
  45. package/templates/agent-docs/plugins/flags.md +146 -0
  46. package/templates/agent-docs/plugins/governance.md +143 -0
  47. package/templates/agent-docs/plugins/licensing.md +74 -0
  48. package/templates/agent-docs/plugins/logship.md +56 -0
  49. package/templates/agent-docs/plugins/mail.md +334 -0
  50. package/templates/agent-docs/plugins/moderation.md +65 -0
  51. package/templates/agent-docs/plugins/multitenancy.md +99 -0
  52. package/templates/agent-docs/plugins/notifications.md +252 -0
  53. package/templates/agent-docs/plugins/openapi.md +94 -0
  54. package/templates/agent-docs/plugins/postgis.md +140 -0
  55. package/templates/agent-docs/plugins/posthog.md +91 -0
  56. package/templates/agent-docs/plugins/presence.md +115 -0
  57. package/templates/agent-docs/plugins/prometheus.md +124 -0
  58. package/templates/agent-docs/plugins/ratelimit.md +274 -0
  59. package/templates/agent-docs/plugins/rbac.md +270 -0
  60. package/templates/agent-docs/plugins/scim.md +63 -0
  61. package/templates/agent-docs/plugins/search.md +116 -0
  62. package/templates/agent-docs/plugins/sentry.md +192 -0
  63. package/templates/agent-docs/plugins/soft-delete.md +72 -0
  64. package/templates/agent-docs/plugins/sso-saml.md +132 -0
  65. package/templates/agent-docs/plugins/storage.md +709 -0
  66. package/templates/agent-docs/plugins/tinybird.md +92 -0
  67. package/templates/agent-docs/plugins/versioning.md +226 -0
  68. package/templates/agent-docs/plugins/webhooks.md +585 -0
  69. package/templates/agent-docs/security.md +12 -1
  70. package/templates/agent-docs/whats-new.md +90 -23
  71. package/templates/apps/api-ai/package.json +7 -7
  72. package/templates/apps/api-auth/package.json +8 -8
  73. package/templates/apps/api-backend/package.json +7 -7
  74. package/templates/apps/api-backend-deactivation/package.json +7 -7
  75. package/templates/apps/api-backend-mail/package.json +8 -8
  76. package/templates/apps/api-backend-mariadb/package.json +9 -9
  77. package/templates/apps/api-backend-sqlite/package.json +8 -8
  78. package/templates/apps/api-backend-storage/package.json +8 -8
  79. package/templates/apps/api-cms/package.json +10 -10
  80. package/templates/apps/api-collab/package.json +8 -8
  81. package/templates/apps/api-data-advanced/package.json +8 -8
  82. package/templates/apps/api-durable/package.json +8 -8
  83. package/templates/apps/api-feature-flags/package.json +9 -9
  84. package/templates/apps/api-governance/package.json +8 -8
  85. package/templates/apps/api-kv/package.json +8 -8
  86. package/templates/apps/api-moderation/package.json +8 -8
  87. package/templates/apps/api-observability/package.json +8 -8
  88. package/templates/apps/api-ratelimit/package.json +8 -8
  89. package/templates/apps/api-rbac/package.json +8 -8
  90. package/templates/apps/api-rest/package.json +7 -7
  91. package/templates/apps/api-saas/package.json +11 -11
  92. package/templates/apps/api-saas-starter/package.json +10 -10
  93. package/templates/apps/api-search/package.json +8 -8
  94. package/templates/apps/api-status/package.json +8 -8
  95. package/templates/apps/api-versioning/package.json +8 -8
  96. package/templates/apps/api-webhooks/package.json +9 -9
  97. package/templates/apps/changelog/package.json +6 -6
  98. package/templates/apps/edge-functions/package.json +2 -2
  99. package/templates/apps/frontend-admin/package.json +8 -8
  100. package/templates/apps/frontend-app/package.json +8 -8
  101. package/templates/apps/frontend-auth/package.json +8 -8
  102. package/templates/apps/frontend-blank/package.json +7 -7
  103. package/templates/apps/frontend-cms/package.json +9 -9
  104. package/templates/apps/frontend-collab/package.json +9 -9
  105. package/templates/apps/frontend-contact/package.json +7 -7
  106. package/templates/apps/frontend-dashboard/package.json +7 -7
  107. package/templates/apps/frontend-docs/package.json +7 -7
  108. package/templates/apps/frontend-i18n/package.json +6 -6
  109. package/templates/apps/frontend-landing/package.json +7 -7
  110. package/templates/apps/frontend-portal/package.json +8 -8
  111. package/templates/apps/frontend-saas/package.json +8 -8
  112. package/templates/apps/frontend-spa/package.json +7 -7
  113. package/templates/apps/frontend-ssr/package.json +7 -7
  114. package/templates/apps/frontend-ssr-api/package.json +8 -8
  115. package/templates/apps/frontend-static-blog/package.json +6 -6
  116. package/templates/apps/frontend-status/package.json +8 -8
  117. package/templates/apps/mobile-app/package.json +2 -2
  118. package/dist/apiBuild-DMlxvL8h.js +0 -2
  119. package/dist/checkCommand-CARZ36Tr.js +0 -2
  120. package/dist/dbCommand-Ht47LrV-.js +0 -2
@@ -1,4 +1,4 @@
1
- import { $ as e, C as t, D as n, E as r, G as i, J as a, K as o, L as s, P as c, Q as l, S as u, V as d, W as ee, _ as f, _t as p, a as m, at as h, b as g, c as _, f as v, g as y, gt as b, h as x, ht as S, i as C, it as te, k as w, m as T, o as ne, ot as re, p as ie, pt as E, q as D, r as ae, rt as O, s as k, st as oe, t as A, ut as j, v as M, vt as N, x as P, y as F } from "./inspectMetrics-BM1vrsga.js";
1
+ import { $ as e, C as t, Ct as n, D as r, E as i, G as a, J as o, K as s, L as c, P as l, Q as u, S as d, St as ee, Tt as f, V as p, W as m, _ as h, _t as g, a as _, b as v, bt as y, c as b, dt as te, f as x, ft as S, g as C, h as w, i as T, k as E, m as D, mt as O, o as ne, p as re, pt as k, q as ie, r as A, s as j, t as M, ut as N, v as ae, wt as oe, x as P, y as F } from "./inspectMetrics-BeEAnjqw.js";
2
2
  import { A as se, E as I, O as ce, a as le, k as L, m as ue } from "./inspect-BUUjt773.js";
3
3
  import { t as de } from "./bootTiming-BdyP9nYw.js";
4
4
  import { dirname as fe, extname as pe, join as R, resolve as z } from "node:path";
@@ -205,11 +205,11 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
205
205
  }
206
206
  return null;
207
207
  }, De = async (e) => {
208
- let { provider: n, route: r, params: i, pathname: a, dirs: o, shellTemplate: c, requestHeaders: l, requestUrl: d = "", apiOrigin: ee, apiName: p } = e, { search: h } = t(d), _ = C(ee, l.cookie, { apiName: p }), v = await n.getPage(r.pattern, r.file), b = s(v, r.file), S = b === "spa" && ne(o, r.dirChain).some((e) => e.hasLayout);
209
- if (b !== "ssr" && b !== "isr" && !S) return null;
210
- let te = ne(o, r.dirChain), w = {}, re = null, ie, E = new AbortController();
208
+ let { provider: n, route: r, params: i, pathname: a, dirs: o, shellTemplate: s, requestHeaders: l, requestUrl: u = "", apiOrigin: ee, apiName: f } = e, { search: p } = t(u), m = T(ee, l.cookie, { apiName: f }), g = await n.getPage(r.pattern, r.file), y = c(g, r.file), b = y === "spa" && ne(o, r.dirChain).some((e) => e.hasLayout);
209
+ if (y !== "ssr" && y !== "isr" && !b) return null;
210
+ let te = ne(o, r.dirChain), x = {}, S = null, E, re = new AbortController();
211
211
  try {
212
- (await n.getHelpers()).beginStoreSeeds(), {chain: ie, segmentLoaderData: w} = await m({
212
+ (await n.getHelpers()).beginStoreSeeds(), {chain: E, segmentLoaderData: x} = await _({
213
213
  entries: te,
214
214
  loadLayout: (e) => n.getLayout(e.dir),
215
215
  loadError: (e) => n.getError(e.dir),
@@ -217,18 +217,18 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
217
217
  ctx: {
218
218
  params: i,
219
219
  pathname: a,
220
- search: h,
221
- signal: E.signal,
220
+ search: p,
221
+ signal: re.signal,
222
222
  headers: l,
223
- query: _
223
+ query: m
224
224
  }
225
- }), typeof v.loader == "function" && !S && (re = await v.loader({
225
+ }), typeof g.loader == "function" && !b && (S = await g.loader({
226
226
  params: i,
227
227
  pathname: a,
228
- search: h,
229
- signal: E.signal,
228
+ search: p,
229
+ signal: re.signal,
230
230
  headers: l,
231
- query: _
231
+ query: m
232
232
  }));
233
233
  } catch (e) {
234
234
  if (Y(e)) return {
@@ -239,62 +239,62 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
239
239
  if (X(e)) return { control: "not-found" };
240
240
  throw e;
241
241
  }
242
- let D = await n.getHelpers();
243
- S || await T({
244
- pageMod: v,
242
+ let k = await n.getHelpers();
243
+ b || await D({
244
+ pageMod: g,
245
245
  params: i,
246
- query: _,
247
- apiName: p,
248
- seed: D.seedPreloadedSubscription,
246
+ query: m,
247
+ apiName: f,
248
+ seed: k.seedPreloadedSubscription,
249
249
  onError: ({ tag: e, apiName: t }, n) => J.warn("preload seed failed", {
250
250
  tag: e,
251
251
  apiName: t,
252
252
  pathname: a
253
253
  }, n)
254
254
  });
255
- let ae = {
255
+ let ie = {
256
256
  pattern: r.pattern,
257
- Component: v.default,
258
- meta: v.meta,
259
- loader: v.loader,
260
- ErrorBoundary: v.ErrorBoundary,
261
- Pending: v.Pending,
262
- renderMode: b,
263
- chain: ie
264
- }, O = {
265
- cookies: D.parseCookieHeader(l.cookie),
257
+ Component: g.default,
258
+ meta: g.meta,
259
+ loader: g.loader,
260
+ ErrorBoundary: g.ErrorBoundary,
261
+ Pending: g.Pending,
262
+ renderMode: y,
263
+ chain: E
264
+ }, A = {
265
+ cookies: k.parseCookieHeader(l.cookie),
266
266
  headers: l,
267
- url: d
268
- }, k = D.i18n?.resolve(l.cookie, l["accept-language"]), A = v.interactive ?? "full";
269
- if (S) {
270
- let e = g({
271
- helpers: D,
267
+ url: u
268
+ }, j = k.i18n?.resolve(l.cookie, l["accept-language"]), M = g.interactive ?? "full";
269
+ if (b) {
270
+ let e = v({
271
+ helpers: k,
272
272
  page: r.pattern,
273
- interactive: A,
273
+ interactive: M,
274
274
  delivery: "stream",
275
275
  renderInput: {
276
- descriptor: ae,
276
+ descriptor: ie,
277
277
  params: i,
278
278
  pathname: a,
279
- search: h,
280
- segmentLoaderData: w,
281
- requestContext: O,
282
- ...k ? {
283
- outerWrap: k.outerWrap,
284
- locale: k.locale
279
+ search: p,
280
+ segmentLoaderData: x,
281
+ requestContext: A,
282
+ ...j ? {
283
+ outerWrap: j.outerWrap,
284
+ locale: j.locale
285
285
  } : {}
286
286
  }
287
- }), t = k?.locale ?? O.cookies["voltro:locale"] ?? "en", n = (t) => u({
288
- helpers: D,
287
+ }), t = j?.locale ?? A.cookies["voltro:locale"] ?? "en", n = (t) => d({
288
+ helpers: k,
289
289
  prepared: e,
290
290
  meta: t,
291
- interactive: A
291
+ interactive: M
292
292
  });
293
293
  if (e.hasDeferred) {
294
- let r = y({ shell: c });
294
+ let r = C({ shell: s });
295
295
  return {
296
296
  renderMode: "spa",
297
- stream: (i) => f({
297
+ stream: (i) => h({
298
298
  res: i,
299
299
  shell: r,
300
300
  htmlLang: t,
@@ -303,7 +303,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
303
303
  "x-voltro-rendered-by": "spa"
304
304
  },
305
305
  headInjection: n,
306
- render: (t) => D.renderPageToStream({
306
+ render: (t) => k.renderPageToStream({
307
307
  ...e.renderInput,
308
308
  ...t
309
309
  }),
@@ -314,47 +314,47 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
314
314
  };
315
315
  }
316
316
  let o = P({
317
- helpers: D,
317
+ helpers: k,
318
318
  prepared: e
319
319
  });
320
320
  return {
321
- html: x(c.replace("<div id=\"root\"></div>", `<div id="root">${o.body}</div>`), n(o.meta)).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${t}"`),
321
+ html: w(s.replace("<div id=\"root\"></div>", `<div id="root">${o.body}</div>`), n(o.meta)).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${t}"`),
322
322
  renderMode: "spa",
323
323
  revalidateMs: null
324
324
  };
325
325
  }
326
- let j = F({
327
- helpers: D,
326
+ let N = F({
327
+ helpers: k,
328
328
  page: r.pattern,
329
329
  pathname: a,
330
- renderMode: b,
331
- interactive: A,
332
- loaderData: re,
333
- segmentLoaderData: w,
334
- pageLoaderRan: typeof v.loader == "function"
335
- }), M = {
336
- descriptor: ae,
330
+ renderMode: y,
331
+ interactive: M,
332
+ loaderData: S,
333
+ segmentLoaderData: x,
334
+ pageLoaderRan: typeof g.loader == "function"
335
+ }), ae = {
336
+ descriptor: ie,
337
337
  params: i,
338
338
  pathname: a,
339
- search: h,
340
- loaderData: j.loaderData,
341
- segmentLoaderData: j.segmentLoaderData,
342
- requestContext: O,
343
- ...k ? {
344
- outerWrap: k.outerWrap,
345
- locale: k.locale
339
+ search: p,
340
+ loaderData: N.loaderData,
341
+ segmentLoaderData: N.segmentLoaderData,
342
+ requestContext: A,
343
+ ...j ? {
344
+ outerWrap: j.outerWrap,
345
+ locale: j.locale
346
346
  } : {}
347
- }, N = (e) => [
348
- D.renderMetaToHtml(e),
349
- `<meta name="voltro-interactive" content="${A}" />`,
350
- ...j.hasDeferred ? [D.renderDeferredRegistryScript()] : [],
351
- D.renderRouterStateScript(j.stateInput)
347
+ }, oe = (e) => [
348
+ k.renderMetaToHtml(e),
349
+ `<meta name="voltro-interactive" content="${M}" />`,
350
+ ...N.hasDeferred ? [k.renderDeferredRegistryScript()] : [],
351
+ k.renderRouterStateScript(N.stateInput)
352
352
  ].filter((e) => e.length > 0).join("\n ");
353
- if (b === "ssr" && A === "full" && e.buffered !== !0) {
354
- let e = k?.locale ?? O.cookies["voltro:locale"] ?? "en", t = y({ shell: c });
353
+ if (y === "ssr" && M === "full" && e.buffered !== !0) {
354
+ let e = j?.locale ?? A.cookies["voltro:locale"] ?? "en", t = C({ shell: s });
355
355
  return {
356
356
  renderMode: "ssr",
357
- stream: (n) => f({
357
+ stream: (n) => h({
358
358
  res: n,
359
359
  shell: t,
360
360
  htmlLang: e,
@@ -362,9 +362,9 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
362
362
  "content-type": "text/html; charset=utf-8",
363
363
  "x-voltro-rendered-by": "ssr"
364
364
  },
365
- headInjection: N,
366
- render: (e) => D.renderPageToStream({
367
- ...M,
365
+ headInjection: oe,
366
+ render: (e) => k.renderPageToStream({
367
+ ...ae,
368
368
  ...e
369
369
  }),
370
370
  onShellError: (e) => {
@@ -373,12 +373,12 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
373
373
  })
374
374
  };
375
375
  }
376
- let { html: se, meta: I } = D.renderPageToHtml(M), ce = N(I), le = k?.locale ?? O.cookies["voltro:locale"] ?? "en", L = x(c.replace("<div id=\"root\"></div>", `<div id="root">${se}</div>`), ce).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${le}"`);
377
- A === "none" && (L = we(L));
378
- let ue = b === "isr" ? oe(v.revalidate) : null;
376
+ let { html: se, meta: I } = k.renderPageToHtml(ae), ce = oe(I), le = j?.locale ?? A.cookies["voltro:locale"] ?? "en", L = w(s.replace("<div id=\"root\"></div>", `<div id="root">${se}</div>`), ce).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${le}"`);
377
+ M === "none" && (L = we(L));
378
+ let ue = y === "isr" ? O(g.revalidate) : null;
379
379
  return {
380
380
  html: L,
381
- renderMode: b,
381
+ renderMode: y,
382
382
  revalidateMs: ue
383
383
  };
384
384
  }, $ = (e) => e === "" ? "/" : e, Oe = async (e) => {
@@ -412,19 +412,24 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
412
412
  async close() {}
413
413
  };
414
414
  }, ke = async (t, n) => {
415
- let r = await E("vite", () => import("vite")), i = (await import("@vitejs/plugin-react")).default, a = (await import("@tailwindcss/vite")).default, o = await r.createServer({
415
+ let r = await y("vite", () => import("vite")), i = (await import("@vitejs/plugin-react")).default, a = (await import("@tailwindcss/vite")).default, o = await r.createServer({
416
416
  root: n,
417
417
  envPrefix: "__VOLTRO_VITE_ENV_DISABLED__",
418
418
  plugins: [i(), a()],
419
- resolve: { dedupe: ["react", "react-dom"] },
420
- ssr: { noExternal: ["react-intl"] },
419
+ resolve: { dedupe: [
420
+ "react",
421
+ "react-dom",
422
+ "react-intl",
423
+ "@voltro/i18n"
424
+ ] },
425
+ ssr: { noExternal: ["react-intl", "@voltro/i18n"] },
421
426
  server: {
422
427
  middlewareMode: !0,
423
428
  hmr: !1
424
429
  },
425
430
  appType: "custom",
426
431
  logLevel: "warn"
427
- }), s = R(t, "src", "pages"), c = (e) => e === "" ? s : R(s, e), u = l({
432
+ }), s = R(t, "src", "pages"), c = (e) => e === "" ? s : R(s, e), l = u({
428
433
  limit: e(),
429
434
  onColdStart: (e) => J.debug("ssr cold-compile start", { id: e }),
430
435
  onColdEnd: (e, { durationMs: t, failed: n }) => J.debug(`ssr cold-compile ${n ? "FAILED" : "end"} ${t}ms`, {
@@ -432,7 +437,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
432
437
  ms: t,
433
438
  ...n ? { failed: !0 } : {}
434
439
  })
435
- }), d = (e) => u.load(e, async () => await o.ssrLoadModule(e));
440
+ }), d = (e) => l.load(e, async () => await o.ssrLoadModule(e));
436
441
  return {
437
442
  kind: "middleware",
438
443
  async getPage(e, t) {
@@ -455,60 +460,60 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
455
460
  }
456
461
  };
457
462
  }, Ae = async (e) => {
458
- let t = de(), s = await k(e);
459
- if (!s) return {
463
+ let t = de(), c = await j(e);
464
+ if (!c) return {
460
465
  ran: !1,
461
466
  exitCode: 0
462
467
  };
463
- if (s.type !== "web") return J.error("only web apps are supported by `voltro start`"), {
468
+ if (c.type !== "web") return J.error("only web apps are supported by `voltro start`"), {
464
469
  ran: !0,
465
470
  exitCode: 1
466
471
  };
467
- let { resolved: l } = await j({
468
- rawEnv: s.env,
472
+ let { resolved: u } = await g({
473
+ rawEnv: c.env,
469
474
  appType: "web",
470
475
  root: e,
471
476
  log: J,
472
477
  generateTypes: !1
473
- }), u = l.publicValues;
478
+ }), d = u.publicValues;
474
479
  t.mark("config");
475
- let f = D();
476
- ee(f), J.info("booting voltro start", { app: s.name ?? "(unnamed)" });
477
- let m = (() => {
480
+ let h = ie();
481
+ m(h), J.info("booting voltro start", { app: c.name ?? "(unnamed)" });
482
+ let _ = (() => {
478
483
  if (process.env.VOLTRO_IS_DASHBOARD === "1" && process.env.VOLTRO_DASHBOARD_PORT) return Number(process.env.VOLTRO_DASHBOARD_PORT);
479
484
  if (process.env.PORT) {
480
485
  let e = Number(process.env.PORT);
481
486
  if (Number.isFinite(e) && e > 0) return e;
482
487
  }
483
- return s.port ?? 5173;
484
- })(), g = R(e, ".framework"), y = R(g, "dist"), x = R(y, "index.html");
485
- if (!await Z(x)) return J.error("no built dist found — run `voltro build` first", { distDir: y }), {
488
+ return c.port ?? 5173;
489
+ })(), v = R(e, ".framework"), y = R(v, "dist"), C = R(y, "index.html");
490
+ if (!await Z(C)) return J.error("no built dist found — run `voltro build` first", { distDir: y }), {
486
491
  ran: !0,
487
492
  exitCode: 1
488
493
  };
489
- let C = s.name ?? "unnamed", T = S("web", C, m), E = w(C);
490
- await N({
494
+ let w = c.name ?? "unnamed", T = ee("web", w, _), D = E(w);
495
+ await f({
491
496
  id: T,
492
- name: C,
497
+ name: w,
493
498
  kind: "web",
494
- url: `http://localhost:${m}`,
499
+ url: `http://localhost:${_}`,
495
500
  pid: process.pid,
496
501
  status: "booting",
497
- logFile: E.path
502
+ logFile: D.path
498
503
  }).catch(() => {});
499
- let oe = R(y, "_voltro", "shell.html"), P = await Z(oe) ? await U.readFile(oe, "utf8") : await U.readFile(x, "utf8"), F = await _(e, s), fe = ae(F[0]), pe = F[0]?.name, z, B = null;
504
+ let O = R(y, "_voltro", "shell.html"), P = await Z(O) ? await U.readFile(O, "utf8") : await U.readFile(C, "utf8"), F = await b(e, c), fe = A(F[0]), pe = F[0]?.name, z, B = null;
500
505
  process.env.SSR_CACHE === "postgres" && process.env.PG_HOST ? (B = new (await (import("pg"))).default.Client({
501
506
  host: process.env.PG_HOST,
502
507
  port: Number(process.env.PG_PORT ?? 5432),
503
508
  user: process.env.PG_USER ?? "app",
504
509
  password: process.env.PG_PASSWORD ?? "app",
505
510
  database: process.env.PG_DATABASE ?? "app"
506
- }), await B.connect(), z = be({ client: B }), J.info("isr cache backend: postgres", { table: "voltro_isr_cache" })) : (z = re(), J.info("isr cache backend: memory (per-process)", { hint: "set SSR_CACHE=postgres for persistent storage" })), await ie(e, s, F, u);
507
- let { pages: V, dirs: H } = await v(R(e, "src", "pages")), W = Te(V);
511
+ }), await B.connect(), z = be({ client: B }), J.info("isr cache backend: postgres", { table: "voltro_isr_cache" })) : (z = k(), J.info("isr cache backend: memory (per-process)", { hint: "set SSR_CACHE=postgres for persistent storage" })), await re(e, c, F, d);
512
+ let { pages: V, dirs: H } = await x(R(e, "src", "pages")), W = Te(V);
508
513
  t.mark("scan");
509
514
  let G = R(y, "server", "ssrEntry.js"), _e = await Z(G);
510
515
  if (!_e && process.env.NODE_ENV === "production") throw J.fatal(`production \`voltro start\` requires a precompiled SSR bundle at ${G} but it is missing. Run \`voltro build\` before serving — production renders from the bundle and never compiles on demand.`), Error(`[voltro start] missing SSR bundle at ${G}`);
511
- let K = _e ? await Oe(G) : await ke(e, g);
516
+ let K = _e ? await Oe(G) : await ke(e, v);
512
517
  J.info(`ssr loader: ${K.kind}`, {
513
518
  kind: K.kind,
514
519
  ...K.kind === "middleware" ? { hint: "no pre-built SSR bundle found; run `voltro build` to enable bundle mode" } : {}
@@ -522,7 +527,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
522
527
  }
523
528
  try {
524
529
  let t = await K.getPage(e.pattern, e.file);
525
- q.set(e.pattern, c(t, e.file)), Y++;
530
+ q.set(e.pattern, l(t, e.file)), Y++;
526
531
  } catch (t) {
527
532
  J.warn("failed to load page metadata", { pattern: e.pattern }, t);
528
533
  }
@@ -545,7 +550,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
545
550
  regexByPattern: we
546
551
  });
547
552
  await Q.start(), t.mark("cdc");
548
- let $ = A(), Ae = V.map((e) => {
553
+ let $ = M(), Ae = V.map((e) => {
549
554
  let t = q.get(e.pattern);
550
555
  return {
551
556
  pattern: e.pattern,
@@ -570,11 +575,11 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
570
575
  })), Me = B ? "postgres" : "memory", Ne = {
571
576
  kind: "web",
572
577
  meta: {
573
- name: s.name ?? "(unnamed)",
578
+ name: c.name ?? "(unnamed)",
574
579
  voltroVersion: xe,
575
- port: m,
580
+ port: _,
576
581
  mode: "start",
577
- apis: Object.entries(s.apis ?? {}).map(([e, t]) => {
582
+ apis: Object.entries(c.apis ?? {}).map(([e, t]) => {
578
583
  let n = {
579
584
  name: e,
580
585
  package: t.package
@@ -602,10 +607,10 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
602
607
  };
603
608
  },
604
609
  metrics: () => he()
605
- }, Pe = async (t, n) => {
606
- let r = t.split("?")[0] ?? "/";
607
- if (s.name === "voltroDashboard" && r === "/api/dashboard/registry") try {
608
- let e = await b();
610
+ }, Pe = async (t, r) => {
611
+ let i = t.split("?")[0] ?? "/";
612
+ if (c.name === "voltroDashboard" && i === "/api/dashboard/registry") try {
613
+ let e = await n();
609
614
  return {
610
615
  status: 200,
611
616
  headers: { "content-type": "application/json; charset=utf-8" },
@@ -618,7 +623,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
618
623
  body: `registry read error: ${e.message}`
619
624
  };
620
625
  }
621
- if (s.name === "voltroDashboard" && r === "/api/dashboard/config") {
626
+ if (c.name === "voltroDashboard" && i === "/api/dashboard/config") {
622
627
  let e = process.env.VOLTRO_DASHBOARD_APPS, t = [];
623
628
  if (e && e.trim().length > 0) {
624
629
  let n;
@@ -647,19 +652,19 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
647
652
  body: JSON.stringify({ apps: t })
648
653
  };
649
654
  }
650
- if (r === "/_voltro/inspect/logs") {
651
- let e = d(t, i(), n);
655
+ if (i === "/_voltro/inspect/logs") {
656
+ let e = p(t, a(), r);
652
657
  return {
653
658
  status: e.status,
654
659
  headers: {
655
660
  "content-type": e.contentType,
656
- ...I(n.origin)
661
+ ...I(r.origin)
657
662
  },
658
663
  body: e.body
659
664
  };
660
665
  }
661
- if (r !== "/_voltro/inspect/stream") {
662
- let e = ue(t, Ne, n);
666
+ if (i !== "/_voltro/inspect/stream") {
667
+ let e = ue(t, Ne, r);
663
668
  if (e !== null) return {
664
669
  status: e.status,
665
670
  headers: {
@@ -669,14 +674,14 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
669
674
  body: e.body
670
675
  };
671
676
  }
672
- let a = Ee(r, W), o = a ? q.get(a.route.pattern)?.renderMode : void 0, c = o === "ssr" || o === "isr" || (a ? X.has(a.route.pattern) : !1), l = r === "/" ? R(y, "index.html") : R(y, r.replace(/^\//, ""), "index.html");
673
- if (!c && await Z(l)) return {
677
+ let o = Ee(i, W), s = o ? q.get(o.route.pattern)?.renderMode : void 0, l = s === "ssr" || s === "isr" || (o ? X.has(o.route.pattern) : !1), u = i === "/" ? R(y, "index.html") : R(y, i.replace(/^\//, ""), "index.html");
678
+ if (!l && await Z(u)) return {
674
679
  status: 200,
675
680
  headers: { "content-type": "text/html; charset=utf-8" },
676
- body: await U.readFile(l)
681
+ body: await U.readFile(u)
677
682
  };
678
- if (/\.[a-z0-9]+$/i.test(r)) {
679
- let e = R(y, r.replace(/^\//, ""));
683
+ if (/\.[a-z0-9]+$/i.test(i)) {
684
+ let e = R(y, i.replace(/^\//, ""));
680
685
  if (await Z(e)) {
681
686
  let t = await U.readFile(e);
682
687
  return {
@@ -686,17 +691,17 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
686
691
  };
687
692
  }
688
693
  }
689
- let u = Ee(r, W);
690
- if (!u) return {
694
+ let d = Ee(i, W);
695
+ if (!d) return {
691
696
  status: 404,
692
697
  headers: { "content-type": "text/plain" },
693
698
  body: "not found"
694
699
  };
695
- let ee = q.get(u.route.pattern), p = n["x-tenant"] ?? "anonymous", m = (await K.getHelpers()).i18n?.resolve(n.cookie, n["accept-language"])?.locale, g = O(r, {
696
- ...ee?.tenantAware ? { tenant: p } : {},
700
+ let ee = q.get(d.route.pattern), f = r["x-tenant"] ?? "anonymous", m = (await K.getHelpers()).i18n?.resolve(r.cookie, r["accept-language"])?.locale, g = N(i, {
701
+ ...ee?.tenantAware ? { tenant: f } : {},
697
702
  ...m ? { locale: m } : {}
698
703
  }), _ = z.get(g), v = Date.now();
699
- if (_ && te(_, v)) return f.emit("cache", {
704
+ if (_ && te(_, v)) return h.emit("cache", {
700
705
  kind: "HIT",
701
706
  key: g,
702
707
  ageMs: v - _.renderedAt
@@ -711,39 +716,39 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
711
716
  },
712
717
  body: _.html
713
718
  };
714
- if (_ && h(_, v)) return f.emit("cache", {
719
+ if (_ && S(_, v)) return h.emit("cache", {
715
720
  kind: "STALE",
716
721
  key: g,
717
722
  ageMs: v - _.renderedAt
718
723
  }), (async () => {
719
724
  try {
720
- let i = await De({
725
+ let n = await De({
721
726
  provider: K,
722
727
  root: e,
723
- route: u.route,
724
- params: u.params,
725
- pathname: r,
728
+ route: d.route,
729
+ params: d.params,
730
+ pathname: i,
726
731
  dirs: H,
727
732
  shellTemplate: P,
728
- requestHeaders: n,
733
+ requestHeaders: r,
729
734
  apiOrigin: fe,
730
735
  apiName: pe,
731
736
  requestUrl: t,
732
737
  buffered: !0
733
738
  });
734
- if (i && "html" in i && i.renderMode === "isr" && i.revalidateMs !== null) {
735
- let e = q.get(u.route.pattern)?.staleWhileRevalidateMs ?? 0, t = Date.now();
739
+ if (n && "html" in n && n.renderMode === "isr" && n.revalidateMs !== null) {
740
+ let e = q.get(d.route.pattern)?.staleWhileRevalidateMs ?? 0, t = Date.now();
736
741
  z.set(g, {
737
- html: i.html,
742
+ html: n.html,
738
743
  renderedAt: t,
739
- expiresAt: t + i.revalidateMs,
740
- servableUntil: t + i.revalidateMs + e,
741
- revalidateMs: i.revalidateMs,
744
+ expiresAt: t + n.revalidateMs,
745
+ servableUntil: t + n.revalidateMs + e,
746
+ revalidateMs: n.revalidateMs,
742
747
  staleWhileRevalidateMs: e
743
748
  });
744
749
  }
745
750
  } catch (e) {
746
- J.warn("background SWR refresh failed", { url: r }, e);
751
+ J.warn("background SWR refresh failed", { url: i }, e);
747
752
  }
748
753
  })(), {
749
754
  status: 200,
@@ -757,20 +762,20 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
757
762
  body: _.html
758
763
  };
759
764
  try {
760
- let i = await De({
765
+ let n = await De({
761
766
  provider: K,
762
767
  root: e,
763
- route: u.route,
764
- params: u.params,
765
- pathname: r,
768
+ route: d.route,
769
+ params: d.params,
770
+ pathname: i,
766
771
  dirs: H,
767
772
  shellTemplate: P,
768
- requestHeaders: n,
773
+ requestHeaders: r,
769
774
  apiOrigin: fe,
770
775
  apiName: pe,
771
776
  requestUrl: t
772
777
  });
773
- if (!i) return {
778
+ if (!n) return {
774
779
  status: 200,
775
780
  headers: {
776
781
  "content-type": "text/html; charset=utf-8",
@@ -778,16 +783,16 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
778
783
  },
779
784
  body: P
780
785
  };
781
- if ("stream" in i) return {
786
+ if ("stream" in n) return {
782
787
  status: 200,
783
- headers: { "x-voltro-rendered-by": i.renderMode },
788
+ headers: { "x-voltro-rendered-by": n.renderMode },
784
789
  body: "",
785
- stream: i.stream
790
+ stream: n.stream
786
791
  };
787
- if ("control" in i) return i.control === "redirect" ? {
788
- status: i.status,
792
+ if ("control" in n) return n.control === "redirect" ? {
793
+ status: n.status,
789
794
  headers: {
790
- location: i.location,
795
+ location: n.location,
791
796
  "x-voltro-rendered-by": "loader-redirect"
792
797
  },
793
798
  body: ""
@@ -801,34 +806,34 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
801
806
  };
802
807
  let a = {
803
808
  "content-type": "text/html; charset=utf-8",
804
- "x-voltro-rendered-by": i.renderMode
809
+ "x-voltro-rendered-by": n.renderMode
805
810
  };
806
- if (i.renderMode === "isr" && i.revalidateMs !== null) {
807
- let e = Date.now(), t = q.get(u.route.pattern)?.staleWhileRevalidateMs ?? 0;
811
+ if (n.renderMode === "isr" && n.revalidateMs !== null) {
812
+ let e = Date.now(), t = q.get(d.route.pattern)?.staleWhileRevalidateMs ?? 0;
808
813
  z.set(g, {
809
- html: i.html,
814
+ html: n.html,
810
815
  renderedAt: e,
811
- expiresAt: e + i.revalidateMs,
812
- servableUntil: e + i.revalidateMs + t,
813
- revalidateMs: i.revalidateMs,
816
+ expiresAt: e + n.revalidateMs,
817
+ servableUntil: e + n.revalidateMs + t,
818
+ revalidateMs: n.revalidateMs,
814
819
  staleWhileRevalidateMs: t
815
- }), a["x-voltro-cache"] = "MISS", a["x-voltro-cache-key"] = g, a["x-voltro-cache-revalidate-ms"] = String(i.revalidateMs), t > 0 && (a["x-voltro-cache-swr-ms"] = String(t)), f.emit("cache", {
820
+ }), a["x-voltro-cache"] = "MISS", a["x-voltro-cache-key"] = g, a["x-voltro-cache-revalidate-ms"] = String(n.revalidateMs), t > 0 && (a["x-voltro-cache-swr-ms"] = String(t)), h.emit("cache", {
816
821
  kind: "MISS",
817
822
  key: g,
818
- revalidateMs: i.revalidateMs,
823
+ revalidateMs: n.revalidateMs,
819
824
  swrMs: t
820
825
  });
821
- } else i.renderMode === "isr" && (a["x-voltro-cache"] = "BYPASS", f.emit("cache", {
826
+ } else n.renderMode === "isr" && (a["x-voltro-cache"] = "BYPASS", h.emit("cache", {
822
827
  kind: "BYPASS",
823
828
  key: g
824
829
  }));
825
830
  return {
826
831
  status: 200,
827
832
  headers: a,
828
- body: i.html
833
+ body: n.html
829
834
  };
830
835
  } catch (e) {
831
- return J.error("render error", { url: r }, e), M(e) ? {
836
+ return J.error("render error", { url: i }, e), ae(e) ? {
832
837
  status: 500,
833
838
  headers: {
834
839
  "content-type": "text/plain; charset=utf-8",
@@ -844,15 +849,15 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
844
849
  }, Fe = !1, Ie = ge(async (e, t) => {
845
850
  let n = e.url ?? "/", r = Date.now(), i = {};
846
851
  for (let [t, n] of Object.entries(e.headers)) n !== void 0 && (i[t.toLowerCase()] = Array.isArray(n) ? n.join(", ") : n);
847
- let c = n.split("?")[0] ?? "/", l = (e.method ?? "GET").toUpperCase();
848
- if (c === "/internal/liveness") {
852
+ let a = n.split("?")[0] ?? "/", l = (e.method ?? "GET").toUpperCase();
853
+ if (a === "/internal/liveness") {
849
854
  t.writeHead(200, {
850
855
  "content-type": "text/plain",
851
856
  "cache-control": "no-store"
852
857
  }), t.end("ok");
853
858
  return;
854
859
  }
855
- if (c === "/internal/readiness") {
860
+ if (a === "/internal/readiness") {
856
861
  let e = Fe ? 200 : 503;
857
862
  t.writeHead(e, {
858
863
  "content-type": "text/plain",
@@ -860,12 +865,12 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
860
865
  }), t.end(Fe ? "ready" : "not-ready");
861
866
  return;
862
867
  }
863
- if (l === "OPTIONS" && c.startsWith("/_voltro/inspect")) {
868
+ if (l === "OPTIONS" && a.startsWith("/_voltro/inspect")) {
864
869
  let e = I(i.origin);
865
870
  t.writeHead(204, e), t.end();
866
871
  return;
867
872
  }
868
- if (s.name === "voltroDashboard" && c === "/api/dashboard/proxy") {
873
+ if (c.name === "voltroDashboard" && a === "/api/dashboard/proxy") {
869
874
  let r = new URL(n, "http://x").searchParams.get("target");
870
875
  if (!r) {
871
876
  t.writeHead(400, { "content-type": "text/plain" }), t.end("missing ?target=");
@@ -901,7 +906,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
901
906
  }
902
907
  return;
903
908
  }
904
- if (s.name === "voltroDashboard" && c === "/api/dashboard/proxy/stream") {
909
+ if (c.name === "voltroDashboard" && a === "/api/dashboard/proxy/stream") {
905
910
  let r = new URL(n, "http://x").searchParams.get("target");
906
911
  if (!r) {
907
912
  t.writeHead(400, { "content-type": "text/plain" }), t.end("missing ?target=");
@@ -948,7 +953,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
948
953
  }
949
954
  return;
950
955
  }
951
- if (c === "/_voltro/inspect/stream") {
956
+ if (a === "/_voltro/inspect/stream") {
952
957
  let n = I(i.origin);
953
958
  if (L()) {
954
959
  t.writeHead(503, {
@@ -975,29 +980,29 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
975
980
  "x-accel-buffering": "no",
976
981
  ...n
977
982
  }), t.flushHeaders(), t.write("retry: 5000\n\n");
978
- for (let e of f.buffered()) t.write(o(e));
979
- let s = f.subscribe((e) => {
980
- t.write(o(e));
983
+ for (let e of h.buffered()) t.write(s(e));
984
+ let a = h.subscribe((e) => {
985
+ t.write(s(e));
981
986
  }), c = setInterval(() => {
982
- t.write(a());
987
+ t.write(o());
983
988
  }, 15e3), l = () => {
984
- clearInterval(c), s();
989
+ clearInterval(c), a();
985
990
  };
986
991
  e.on("close", l), t.on("close", l);
987
992
  return;
988
993
  }
989
994
  try {
990
995
  let e = await Pe(n, i);
991
- if (e.stream ? e.stream(t) : (t.writeHead(e.status, e.headers), t.end(e.body)), !c.startsWith("/_voltro/inspect")) {
996
+ if (e.stream ? e.stream(t) : (t.writeHead(e.status, e.headers), t.end(e.body)), !a.startsWith("/_voltro/inspect")) {
992
997
  let t = Date.now() - r;
993
- f.emit("request", {
994
- url: c,
998
+ h.emit("request", {
999
+ url: a,
995
1000
  status: e.status,
996
1001
  durationMs: t,
997
1002
  renderedBy: e.headers["x-voltro-rendered-by"],
998
1003
  cache: e.headers["x-voltro-cache"]
999
1004
  });
1000
- let n = Ee(c, W)?.route.pattern ?? (e.status === 404 ? "<unmatched>" : "<asset>");
1005
+ let n = Ee(a, W)?.route.pattern ?? (e.status === 404 ? "<unmatched>" : "<asset>");
1001
1006
  $.record({
1002
1007
  kind: "request",
1003
1008
  tag: n,
@@ -1009,43 +1014,43 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
1009
1014
  t.writeHead(500, { "content-type": "text/plain" }), t.end(`internal error: ${e.message}`);
1010
1015
  }
1011
1016
  });
1012
- await new Promise((e) => Ie.listen(m, "::", e)), Fe = !0, t.mark("ready"), J.info(`listening on http://localhost:${m}`, {
1013
- port: m,
1017
+ await new Promise((e) => Ie.listen(_, "::", e)), Fe = !0, t.mark("ready"), J.info(`listening on http://localhost:${_}`, {
1018
+ port: _,
1014
1019
  distDir: y
1015
1020
  }), J.debug("dynamic + ssr/isr routes resolve via SSR loader");
1016
1021
  try {
1017
- await N({
1022
+ await f({
1018
1023
  id: T,
1019
- name: C,
1024
+ name: w,
1020
1025
  kind: "web",
1021
- url: `http://localhost:${m}`,
1026
+ url: `http://localhost:${_}`,
1022
1027
  pid: process.pid,
1023
1028
  status: "live",
1024
- logFile: E.path
1029
+ logFile: D.path
1025
1030
  });
1026
- let t = n(e);
1031
+ let t = r(e);
1027
1032
  if (t) {
1028
- let e = await r({ dashboardAppPath: t });
1033
+ let e = await i({ dashboardAppPath: t });
1029
1034
  e.status === "launched" ? J.info(`dashboard launched at http://localhost:${e.port}`, { port: e.port }) : e.status === "already-running" && J.debug(`dashboard already running on :${e.port}`, { port: e.port });
1030
1035
  }
1031
1036
  setInterval(() => {
1032
- N({
1037
+ f({
1033
1038
  id: T,
1034
- name: C,
1039
+ name: w,
1035
1040
  kind: "web",
1036
- url: `http://localhost:${m}`,
1041
+ url: `http://localhost:${_}`,
1037
1042
  pid: process.pid,
1038
1043
  status: "live",
1039
- logFile: E.path
1044
+ logFile: D.path
1040
1045
  }).catch(() => {});
1041
1046
  }, 1e4).unref();
1042
1047
  } catch (e) {
1043
1048
  J.warn("runtime-registry write failed", {}, e);
1044
1049
  }
1045
1050
  me({
1046
- app: s.name ?? "unnamed",
1051
+ app: c.name ?? "unnamed",
1047
1052
  kind: "web",
1048
- url: `http://localhost:${m}`,
1053
+ url: `http://localhost:${_}`,
1049
1054
  bootMs: t.total()
1050
1055
  });
1051
1056
  let Le = t.phaseBreakdown();
@@ -1058,7 +1063,7 @@ CREATE INDEX IF NOT EXISTS ${e}_servable_until_idx ON ${e} (servable_until);
1058
1063
  if (Re = !0, J.info(`received ${e}, shutting down`, { signal: e }), Ie.close(), await Q.stop(), B) try {
1059
1064
  await B.end();
1060
1065
  } catch {}
1061
- await K.close(), await p(T), await E.dispose(), process.exit(0);
1066
+ await K.close(), await oe(T), await D.dispose(), process.exit(0);
1062
1067
  }
1063
1068
  };
1064
1069
  process.on("SIGINT", ze("SIGINT")), process.on("SIGTERM", ze("SIGTERM"));