@voltro/cli 0.56.0 → 0.57.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 (115) hide show
  1. package/CHANGELOG.md +194 -0
  2. package/dist/apiBuild-B83Cb2Rv.js +2 -0
  3. package/dist/{apiBuild-Bdaetr37.js → apiBuild-DDr2aNFd.js} +2 -2
  4. package/dist/bin.js +1 -1
  5. package/dist/{build-CI36wL4R.js → build-QKP6Bm0J.js} +191 -187
  6. package/dist/{checkCommand-D0QV_zM_.js → checkCommand-BISqx1OJ.js} +1 -1
  7. package/dist/{checkCommand-CAwFXrxA.js → checkCommand-DUtMWjcR.js} +4 -4
  8. package/dist/{codegenCommand-CidbQzbv.js → codegenCommand-DnVuDxwT.js} +10 -10
  9. package/dist/{commands-CWjfThXv.js → commands-CRbxgxv0.js} +22 -22
  10. package/dist/{dashboardCommand-BekcY5Ls.js → dashboardCommand-Bf_-Ne3P.js} +5 -5
  11. package/dist/{dataCommand-2pccgbIy.js → dataCommand-BoBJJ-Gb.js} +2 -2
  12. package/dist/{dbCommand-DpK_vQET.js → dbCommand-CMAIz-Bf.js} +3 -3
  13. package/dist/dbCommand-DHi_RuDl.js +2 -0
  14. package/dist/dev-Bl9HqtV7.js +3 -0
  15. package/dist/{dev-Dw263KPu.js → dev-DOEJXicj.js} +2109 -2092
  16. package/dist/{doctorCommand-aR_bFmIi.js → doctorCommand-BrWu67JZ.js} +331 -189
  17. package/dist/doctorCommand-DrQv9SL3.js +2 -0
  18. package/dist/{dormancyCommand-eXTQMbHU.js → dormancyCommand-xn2y-pJm.js} +1 -1
  19. package/dist/{embeddingsCommand-CTmiQvwa.js → embeddingsCommand-Cn5MbRDM.js} +1 -1
  20. package/dist/emptyResultHeadline-Csa5fZOF.js +18 -0
  21. package/dist/{envCommand-BDUgV7EM.js → envCommand-UJmJIbs9.js} +8 -8
  22. package/dist/{evolveCommand-YV8qW1LU.js → evolveCommand-Db30twUy.js} +1 -1
  23. package/dist/frameworkTableAssembly-B96WCNJA.js +2 -0
  24. package/dist/{frameworkTableAssembly-DNOFXfEQ.js → frameworkTableAssembly-vfkzuzEo.js} +104 -85
  25. package/dist/index.js +1 -1
  26. package/dist/inspect-B0hL41s0.js +2 -0
  27. package/dist/{inspect-CNYvNXPU.js → inspect-DZnan87F.js} +68 -52
  28. package/dist/{logsCmd-BU8uCdys.js → logsCmd-C5y9HyrG.js} +58 -53
  29. package/dist/{manifestBuild-CEkjfpwc.js → manifestBuild-DnbFKF6w.js} +1 -1
  30. package/dist/manifestBuild-UXrnUcXP.js +2 -0
  31. package/dist/{migrate-SICulyz1.js → migrate-DtC3lu7H.js} +4 -4
  32. package/dist/{probeCommand-6HxEkNDG.js → probeCommand-C5fuN6Z2.js} +1 -1
  33. package/dist/{runtimeTrace-DgYMc09E.js → runtimeTrace-BQL_lfz6.js} +1 -1
  34. package/dist/{sdkgen-PY-umd6O.js → sdkgen-CMUPrDjH.js} +1 -1
  35. package/dist/{serveCommand-DIJ3ma76.js → serveCommand-B_w-Mpb_.js} +1013 -954
  36. package/dist/serveCommand-Dtb48ffg.js +2 -0
  37. package/dist/serveEntry.js +1 -1
  38. package/dist/{start-B9NGB8gn.js → start-YaUehtDV.js} +564 -571
  39. package/dist/{start-BFQQkL1i.js → start-s25GAIgn.js} +1 -1
  40. package/dist/startEntry.js +1 -1
  41. package/dist/{tracesCmd-BWYDqMy6.js → tracesCmd-C1qKa94g.js} +68 -63
  42. package/dist/{webDev-C2dRz9s5.js → webDev-B6ZMX42w.js} +1 -1
  43. package/dist/{webDev-C53hJdcL.js → webDev-BgdkyjP6.js} +881 -774
  44. package/dist/{webhooksCommand-uuPu8qQX.js → webhooksCommand-CYXTNvXq.js} +2 -2
  45. package/package.json +19 -19
  46. package/templates/AGENTS.md +1 -1
  47. package/templates/agent-docs/_index.md +1 -1
  48. package/templates/agent-docs/_manifest.json +1 -1
  49. package/templates/agent-docs/ai.md +1 -1
  50. package/templates/agent-docs/authentication.md +34 -19
  51. package/templates/agent-docs/cli.md +48 -0
  52. package/templates/agent-docs/configuration.md +29 -4
  53. package/templates/agent-docs/database/scaling.md +10 -1
  54. package/templates/agent-docs/deployment.md +22 -0
  55. package/templates/agent-docs/plugins/audit.md +21 -5
  56. package/templates/agent-docs/plugins/billing.md +2 -0
  57. package/templates/agent-docs/reference.md +1 -0
  58. package/templates/agent-docs/scheduling.md +23 -0
  59. package/templates/agent-docs/schema-driven-ui.md +81 -0
  60. package/templates/agent-docs/whats-new.md +100 -403
  61. package/templates/apps/api-ai/package.json +6 -6
  62. package/templates/apps/api-auth/package.json +8 -8
  63. package/templates/apps/api-backend/package.json +7 -7
  64. package/templates/apps/api-backend-deactivation/package.json +7 -7
  65. package/templates/apps/api-backend-mail/package.json +8 -8
  66. package/templates/apps/api-backend-mariadb/package.json +9 -9
  67. package/templates/apps/api-backend-sqlite/package.json +8 -8
  68. package/templates/apps/api-backend-storage/package.json +8 -8
  69. package/templates/apps/api-cms/package.json +9 -9
  70. package/templates/apps/api-collab/package.json +8 -8
  71. package/templates/apps/api-data-advanced/package.json +8 -8
  72. package/templates/apps/api-durable/package.json +8 -8
  73. package/templates/apps/api-feature-flags/package.json +9 -9
  74. package/templates/apps/api-governance/package.json +8 -8
  75. package/templates/apps/api-kv/package.json +8 -8
  76. package/templates/apps/api-moderation/package.json +8 -8
  77. package/templates/apps/api-observability/package.json +8 -8
  78. package/templates/apps/api-ratelimit/package.json +8 -8
  79. package/templates/apps/api-rbac/package.json +8 -8
  80. package/templates/apps/api-rest/package.json +7 -7
  81. package/templates/apps/api-row-history/package.json +8 -8
  82. package/templates/apps/api-saas/package.json +11 -11
  83. package/templates/apps/api-saas-starter/package.json +10 -10
  84. package/templates/apps/api-search/package.json +8 -8
  85. package/templates/apps/api-status/package.json +8 -8
  86. package/templates/apps/api-webhooks/package.json +9 -9
  87. package/templates/apps/changelog/package.json +7 -7
  88. package/templates/apps/edge-functions/package.json +2 -2
  89. package/templates/apps/frontend-admin/package.json +7 -7
  90. package/templates/apps/frontend-app/package.json +8 -8
  91. package/templates/apps/frontend-auth/package.json +7 -7
  92. package/templates/apps/frontend-blank/package.json +6 -6
  93. package/templates/apps/frontend-cms/package.json +8 -8
  94. package/templates/apps/frontend-collab/package.json +9 -9
  95. package/templates/apps/frontend-contact/package.json +7 -7
  96. package/templates/apps/frontend-dashboard/package.json +6 -6
  97. package/templates/apps/frontend-docs/package.json +8 -8
  98. package/templates/apps/frontend-i18n/package.json +6 -6
  99. package/templates/apps/frontend-landing/package.json +7 -7
  100. package/templates/apps/frontend-portal/package.json +7 -7
  101. package/templates/apps/frontend-saas/package.json +7 -7
  102. package/templates/apps/frontend-spa/package.json +6 -6
  103. package/templates/apps/frontend-ssr/package.json +6 -6
  104. package/templates/apps/frontend-ssr-api/package.json +7 -7
  105. package/templates/apps/frontend-static-blog/package.json +8 -8
  106. package/templates/apps/frontend-status/package.json +7 -7
  107. package/templates/apps/mobile-app/package.json +4 -4
  108. package/dist/apiBuild-Vw1figjO.js +0 -2
  109. package/dist/dbCommand-DrycGWWt.js +0 -2
  110. package/dist/dev-B9Gz0k85.js +0 -3
  111. package/dist/doctorCommand-BMWs6aVm.js +0 -2
  112. package/dist/frameworkTableAssembly-CGNC0qr7.js +0 -2
  113. package/dist/inspect-S2rWy1Ys.js +0 -2
  114. package/dist/manifestBuild-DIa_s6u0.js +0 -2
  115. package/dist/serveCommand-BITS8Hpj.js +0 -2
@@ -1,6 +1,6 @@
1
- import { Cn as e } from "./dev-Dw263KPu.js";
2
- import { B as t, H as n, J as r, S as i, St as a, Tt as o, V as s, Vt as c, Wt as l, X as u, Y as d, _t as f, bt as p, c as m, ct as h, gt as g, h as _, ht as v, jt as y, lt as b, m as x, mt as S, o as C, u as w, ut as ee, vt as T, w as E, wt as te, x as D, xt as O, yt as k } from "./webDev-C53hJdcL.js";
3
- import { d as A, i as j, o as M, s as N } from "./apiBuild-Bdaetr37.js";
1
+ import { kn as e } from "./dev-DOEJXicj.js";
2
+ import { $ as t, At as n, Ct as r, Dt as i, Et as a, G as o, It as s, Kt as c, Q as l, S as u, St as d, Tt as f, U as p, W as m, Yt as h, Z as g, bt as _, c as v, h as y, ht as b, kt as x, m as S, mt as C, o as w, pt as T, u as E, w as D, wt as ee, x as te, xt as O, yt as k } from "./webDev-BgdkyjP6.js";
3
+ import { d as A, i as j, o as M, s as N } from "./apiBuild-DDr2aNFd.js";
4
4
  import { t as P } from "./cliRuntime-Dh7UDinH.js";
5
5
  import { a as F } from "./renderModeScan-43yQ2opo.js";
6
6
  import { o as I } from "./imagePipeline-CBZmjT4i.js";
@@ -15,7 +15,7 @@ import { Effect as K } from "effect";
15
15
  import { createRequire as q } from "node:module";
16
16
  //#region src/webStartBundle.ts
17
17
  var J = W({ scope: "voltro:build" }), ne = async (e) => {
18
- let t = await l("esbuild", () => import("esbuild")), n = B(e, ".framework"), r = B(n, "dist-web", "startBundle");
18
+ let t = await h("esbuild", () => import("esbuild")), n = B(e, ".framework"), r = B(n, "dist-web", "startBundle");
19
19
  await U.mkdir(n, { recursive: !0 });
20
20
  let i = Date.now(), a = B(e, "tsconfig.json"), o = /* @__PURE__ */ new Set(), s = B(n, "startEntry.ts");
21
21
  await U.writeFile(s, [
@@ -105,76 +105,76 @@ var J = W({ scope: "voltro:build" }), ne = async (e) => {
105
105
  let n = t.replace(/^\//, "").split("/");
106
106
  return B(e, ...n, "index.html");
107
107
  }, ie = (e) => e.replace(/<script\b(?=[^>]*\btype="module")(?:(?!<\/script>).)*<\/script>/gi, "").replace(/<script\b(?=[^>]*\bsrc=)(?:(?!<\/script>).)*<\/script>/gi, "").replace(/<link\b[^>]*\brel="modulepreload"[^>]*>/gi, ""), ae = (e, t) => {
108
- let r = e.replace("<div id=\"root\"></div>", `<div id="root">${t.body}</div>`), i = [
108
+ let n = e.replace("<div id=\"root\"></div>", `<div id="root">${t.body}</div>`), r = [
109
109
  t.metaHtml,
110
110
  `<meta name="voltro-interactive" content="${t.interactive}" />`,
111
111
  t.stateScript
112
112
  ].filter((e) => e.length > 0).join("\n ");
113
- return r = s(n(r, i), t.documentAttrs), t.interactive === "none" && (r = ie(r)), r;
113
+ return n = m(o(n, r), t.documentAttrs), t.interactive === "none" && (n = ie(n)), n;
114
114
  }, oe = async (e) => {
115
- let { page: t, chainEntries: i, pageMod: a, helpers: o } = e, s = i.filter((e) => e.hasLayout);
115
+ let { page: n, chainEntries: r, pageMod: i, helpers: a } = e, s = r.filter((e) => e.hasLayout);
116
116
  if (s.length === 0) return Y.debug("skip page", {
117
- pattern: t.pattern,
117
+ pattern: n.pattern,
118
118
  reason: "renderMode=spa with no layout — nothing to shell"
119
119
  }), null;
120
- if (Z(t.pattern)) return Y.debug("skip page", {
121
- pattern: t.pattern,
120
+ if (Z(n.pattern)) return Y.debug("skip page", {
121
+ pattern: n.pattern,
122
122
  reason: "renderMode=spa with a dynamic pattern"
123
123
  }), null;
124
- let c = await Promise.all(s.map(e.loadLayout)), l = s.filter((e, t) => typeof c[t]?.loader == "function").map((e) => e.dir || "/");
125
- if (l.length > 0) return Y.info(`spa shell for ${t.pattern} left to on-demand rendering — its layout chain has a loader (${l.join(", ")}), whose output may be per-request`, {
126
- pattern: t.pattern,
127
- layouts: l
124
+ let c = await Promise.all(s.map(e.loadLayout)), u = s.filter((e, t) => typeof c[t]?.loader == "function").map((e) => e.dir || "/");
125
+ if (u.length > 0) return Y.info(`spa shell for ${n.pattern} left to on-demand rendering — its layout chain has a loader (${u.join(", ")}), whose output may be per-request`, {
126
+ pattern: n.pattern,
127
+ layouts: u
128
128
  }), null;
129
- let { chain: f, segmentLoaderData: p } = await m({
130
- entries: i,
129
+ let { chain: d, segmentLoaderData: f } = await v({
130
+ entries: r,
131
131
  loadLayout: e.loadLayout,
132
132
  loadError: e.loadError,
133
133
  loadPending: e.loadPending,
134
134
  ctx: e.ctx
135
- }), h = {
136
- pattern: t.pattern,
137
- Component: a.default,
138
- meta: a.meta,
139
- ErrorBoundary: a.ErrorBoundary,
140
- Pending: a.Pending,
135
+ }), p = {
136
+ pattern: n.pattern,
137
+ Component: i.default,
138
+ meta: i.meta,
139
+ ErrorBoundary: i.ErrorBoundary,
140
+ Pending: i.Pending,
141
141
  renderMode: "spa",
142
- chain: f
143
- }, g = a.interactive ?? "full", _ = r({
144
- helpers: o,
145
- page: t.pattern,
146
- interactive: g,
142
+ chain: d
143
+ }, m = i.interactive ?? "full", h = g({
144
+ helpers: a,
145
+ page: n.pattern,
146
+ interactive: m,
147
147
  delivery: "artefact",
148
148
  renderInput: {
149
- descriptor: h,
149
+ descriptor: p,
150
150
  params: {},
151
- pathname: t.pattern,
152
- segmentLoaderData: p,
151
+ pathname: n.pattern,
152
+ segmentLoaderData: f,
153
153
  ...e.outerWrap ? { outerWrap: e.outerWrap } : {},
154
154
  ...e.locale ? { locale: e.locale } : {}
155
155
  }
156
- }), v = d({
157
- helpers: o,
158
- prepared: _
159
- }), y = u({
160
- helpers: o,
161
- prepared: _,
162
- meta: v.meta,
163
- interactive: g
164
- }), b = n(e.shellTemplate.replace("<div id=\"root\"></div>", `<div id="root">${v.body}</div>`), y), x = $(e.distDir, t.pattern);
165
- return await U.mkdir(z(x), { recursive: !0 }), await U.writeFile(x, b, "utf8"), Y.debug("prerendered spa layout shell", { pattern: t.pattern }), {
166
- pattern: t.pattern,
156
+ }), _ = l({
157
+ helpers: a,
158
+ prepared: h
159
+ }), y = t({
160
+ helpers: a,
161
+ prepared: h,
162
+ meta: _.meta,
163
+ interactive: m
164
+ }), b = o(e.shellTemplate.replace("<div id=\"root\"></div>", `<div id="root">${_.body}</div>`), y), x = $(e.distDir, n.pattern);
165
+ return await U.mkdir(z(x), { recursive: !0 }), await U.writeFile(x, b, "utf8"), Y.debug("prerendered spa layout shell", { pattern: n.pattern }), {
166
+ pattern: n.pattern,
167
167
  outPath: x
168
168
  };
169
169
  }, se = async (e) => {
170
- let { root: n, distDir: r, pages: i, dirs: a, vite: s } = e, c = B(r, "index.html"), l = await U.readFile(c, "utf8"), u = B(r, "_voltro", "shell.html");
170
+ let { root: t, distDir: r, pages: i, dirs: a, vite: o } = e, c = B(r, "index.html"), l = await U.readFile(c, "utf8"), u = B(r, "_voltro", "shell.html");
171
171
  await U.mkdir(z(u), { recursive: !0 }), await U.writeFile(u, l, "utf8");
172
172
  let d = /* @__PURE__ */ new Map();
173
173
  for (let t of e.islandsPlans ?? []) {
174
174
  let e = B(r, "island-shells", `${t.name}.html`);
175
175
  try {
176
- let n = o(await U.readFile(e, "utf8"), l);
177
- await U.writeFile(e, n, "utf8"), d.set(t.pattern, n);
176
+ let r = n(await U.readFile(e, "utf8"), l);
177
+ await U.writeFile(e, r, "utf8"), d.set(t.pattern, r);
178
178
  } catch {
179
179
  Y.warn("islands shell missing — page ships the full entry", {
180
180
  pattern: t.pattern,
@@ -182,7 +182,7 @@ var J = W({ scope: "voltro:build" }), ne = async (e) => {
182
182
  });
183
183
  }
184
184
  }
185
- let f = B(n, "node_modules", "@voltro", "ui-shadcn"), h = H(B(f, "package.json")) ? f : null, g = [...h ? [
185
+ let m = B(t, "node_modules", "@voltro", "ui-shadcn"), h = H(B(m, "package.json")) ? m : null, g = [...h ? [
186
186
  {
187
187
  find: "@voltro/ui-shadcn/tokens.css",
188
188
  replacement: B(h, "src/tokens.css")
@@ -199,14 +199,14 @@ var J = W({ scope: "voltro:build" }), ne = async (e) => {
199
199
  find: "@voltro/ui-shadcn",
200
200
  replacement: B(h, "src/index.ts")
201
201
  }
202
- ] : [], ...y(n)], _ = await s.createServer({
203
- root: B(n, ".framework"),
202
+ ] : [], ...s(t)], y = await o.createServer({
203
+ root: B(t, ".framework"),
204
204
  envPrefix: "__VOLTRO_VITE_ENV_DISABLED__",
205
205
  plugins: [
206
206
  (await import("@vitejs/plugin-react")).default(),
207
207
  (await import("@tailwindcss/vite")).default(),
208
- p({
209
- root: n,
208
+ f({
209
+ root: t,
210
210
  config: I(e.images),
211
211
  urlMode: "build-urls"
212
212
  }),
@@ -229,27 +229,27 @@ var J = W({ scope: "voltro:build" }), ne = async (e) => {
229
229
  },
230
230
  appType: "custom",
231
231
  logLevel: "warn"
232
- }), b = await _.ssrLoadModule("@voltro/web/ssr"), { renderPageToHtml: x, renderMetaToHtml: C, renderRouterStateScript: ee, isDeferredLoaderResult: T, assertDeferralSupported: E, beginStoreSeeds: te, seedPreloadedSubscription: D, seedPreloadedSubscriptionFailure: O } = b, k, A = /* @__PURE__ */ new Map();
232
+ }), b = await y.ssrLoadModule("@voltro/web/ssr"), { renderPageToHtml: x, renderMetaToHtml: S, renderRouterStateScript: C, isDeferredLoaderResult: w, assertDeferralSupported: T, beginStoreSeeds: D, seedPreloadedSubscription: ee, seedPreloadedSubscriptionFailure: te } = b, O, A = /* @__PURE__ */ new Map();
233
233
  if (e.locales && e.locales.length > 0 && e.defaultLocale) try {
234
- let t = await _.ssrLoadModule("@voltro/i18n");
234
+ let n = await y.ssrLoadModule("@voltro/i18n");
235
235
  try {
236
- k = (await _.ssrLoadModule("@voltro/i18n/server")).resolveTimeZone?.({
236
+ O = (await y.ssrLoadModule("@voltro/i18n/server")).resolveTimeZone?.({
237
237
  configured: e.timeZone ?? null,
238
238
  defaultTimeZone: e.defaultTimeZone ?? null
239
239
  });
240
240
  } catch {}
241
- let r = t.makeSsgWrap;
241
+ let r = n.makeSsgWrap;
242
242
  if (typeof r != "function") throw Error("@voltro/i18n is installed but missing the `makeSsgWrap` export — upgrade @voltro/i18n to a version that ships SSG support.");
243
- for (let t of e.locales) try {
244
- let i = await _.ssrLoadModule(B(n, "src", "locales", `${t}.ts`)), a = i.default ?? i;
245
- A.set(t, r(t, a, e.defaultLocale));
243
+ for (let n of e.locales) try {
244
+ let i = await y.ssrLoadModule(B(t, "src", "locales", `${n}.ts`)), a = i.default ?? i;
245
+ A.set(n, r(n, a, e.defaultLocale));
246
246
  } catch (e) {
247
- Y.warn(`i18n catalog missing for locale '${t}' — pages rendered at /${t}/* will crash. Add src/locales/${t}.ts.`, {}, e);
247
+ Y.warn(`i18n catalog missing for locale '${n}' — pages rendered at /${n}/* will crash. Add src/locales/${n}.ts.`, {}, e);
248
248
  }
249
249
  } catch (e) {
250
250
  Y.warn("i18n wrapper unavailable for SSG — pages that call useT() will fail. Check that @voltro/i18n is installed.", {}, e);
251
251
  }
252
- let j = [], M = {}, N = (e) => e.dir === "" ? B(n, "src", "pages") : B(n, "src", "pages", e.dir), P = async (e) => await _.ssrLoadModule(B(N(e), "layout.tsx")), R = async (e) => await _.ssrLoadModule(B(N(e), "error.tsx")), V = async (e) => await _.ssrLoadModule(B(N(e), "loading.tsx")), W = (e, t) => ({
252
+ let j = [], M = {}, N = (e) => e.dir === "" ? B(t, "src", "pages") : B(t, "src", "pages", e.dir), P = async (e) => await y.ssrLoadModule(B(N(e), "layout.tsx")), R = async (e) => await y.ssrLoadModule(B(N(e), "error.tsx")), V = async (e) => await y.ssrLoadModule(B(N(e), "loading.tsx")), W = (e, t) => ({
253
253
  params: e.params,
254
254
  pathname: e.pathname,
255
255
  search: "",
@@ -258,15 +258,15 @@ var J = W({ scope: "voltro:build" }), ne = async (e) => {
258
258
  query: void 0,
259
259
  isServer: !0
260
260
  });
261
- for (let o of i) {
262
- let i = `${B(n, "src", "pages", o.file)}`, s = await _.ssrLoadModule(i), c = F(s, B("src", "pages", o.file));
263
- M[o.pattern] = c;
264
- let u = c.renderMode, f = w(a, o.dirChain);
265
- if (u === "spa") {
261
+ for (let n of i) {
262
+ let i = `${B(t, "src", "pages", n.file)}`, o = await y.ssrLoadModule(i), s = F(o, B("src", "pages", n.file));
263
+ M[n.pattern] = s;
264
+ let c = s.renderMode, u = E(a, n.dirChain);
265
+ if (c === "spa") {
266
266
  let t = await oe({
267
- page: o,
268
- chainEntries: f,
269
- pageMod: s,
267
+ page: n,
268
+ chainEntries: u,
269
+ pageMod: o,
270
270
  shellTemplate: l,
271
271
  distDir: r,
272
272
  helpers: b,
@@ -275,7 +275,7 @@ var J = W({ scope: "voltro:build" }), ne = async (e) => {
275
275
  loadPending: V,
276
276
  ctx: W({
277
277
  params: {},
278
- pathname: o.pattern
278
+ pathname: n.pattern
279
279
  }, new AbortController().signal),
280
280
  outerWrap: A.get(e.defaultLocale ?? ""),
281
281
  locale: e.defaultLocale
@@ -283,58 +283,58 @@ var J = W({ scope: "voltro:build" }), ne = async (e) => {
283
283
  t && j.push(t);
284
284
  continue;
285
285
  }
286
- if (u !== "static") {
286
+ if (c !== "static") {
287
287
  Y.debug("skip page", {
288
- pattern: o.pattern,
289
- reason: `renderMode=${u}`
288
+ pattern: n.pattern,
289
+ reason: `renderMode=${c}`
290
290
  });
291
291
  continue;
292
292
  }
293
- let p;
294
- if (Z(o.pattern)) {
295
- if (typeof s.getStaticPaths != "function") {
293
+ let f;
294
+ if (Z(n.pattern)) {
295
+ if (typeof o.getStaticPaths != "function") {
296
296
  Y.debug("skip page", {
297
- pattern: o.pattern,
297
+ pattern: n.pattern,
298
298
  reason: "no getStaticPaths export"
299
299
  });
300
300
  continue;
301
301
  }
302
302
  try {
303
- let e = await s.getStaticPaths();
303
+ let e = await o.getStaticPaths();
304
304
  if (!Array.isArray(e)) {
305
- Y.warn("skip page — getStaticPaths did not return an array", { pattern: o.pattern });
305
+ Y.warn("skip page — getStaticPaths did not return an array", { pattern: n.pattern });
306
306
  continue;
307
307
  }
308
- p = e.map((e) => ({
308
+ f = e.map((e) => ({
309
309
  params: e.params,
310
- pathname: Q(o.pattern, e.params)
310
+ pathname: Q(n.pattern, e.params)
311
311
  }));
312
312
  } catch (e) {
313
- Y.warn("skip page — getStaticPaths threw", { pattern: o.pattern }, e);
313
+ Y.warn("skip page — getStaticPaths threw", { pattern: n.pattern }, e);
314
314
  continue;
315
315
  }
316
- if (p.length === 0) {
316
+ if (f.length === 0) {
317
317
  Y.debug("skip page", {
318
- pattern: o.pattern,
318
+ pattern: n.pattern,
319
319
  reason: "getStaticPaths returned []"
320
320
  });
321
321
  continue;
322
322
  }
323
- } else p = [{
323
+ } else f = [{
324
324
  params: {},
325
- pathname: o.pattern
325
+ pathname: n.pattern
326
326
  }];
327
- let h = s.interactive ?? "full";
328
- for (let i of p) {
329
- te();
330
- let a, c, p = new AbortController();
327
+ let m = o.interactive ?? "full";
328
+ for (let i of f) {
329
+ D();
330
+ let a, s, f = new AbortController();
331
331
  try {
332
- ({chain: a, segmentLoaderData: c} = await m({
333
- entries: f,
332
+ ({chain: a, segmentLoaderData: s} = await v({
333
+ entries: u,
334
334
  loadLayout: P,
335
335
  loadError: R,
336
336
  loadPending: V,
337
- ctx: W(i, p.signal)
337
+ ctx: W(i, f.signal)
338
338
  }));
339
339
  } catch (e) {
340
340
  let t = e?._voltroControl;
@@ -345,20 +345,20 @@ var J = W({ scope: "voltro:build" }), ne = async (e) => {
345
345
  }
346
346
  throw Error(`Static page "${i.pathname}": a LAYOUT loader threw at build time — the page would prerender without its layout data. Fix the loader (cause below) or throw NotFoundError to skip this path.\ncause: ${e instanceof Error ? e.stack ?? e.message : String(e)}`);
347
347
  }
348
- let g = {
349
- pattern: o.pattern,
350
- Component: s.default,
351
- meta: s.meta,
352
- loader: s.loader,
353
- ErrorBoundary: s.ErrorBoundary,
354
- Pending: s.Pending,
355
- renderMode: u,
348
+ let h = {
349
+ pattern: n.pattern,
350
+ Component: o.default,
351
+ meta: o.meta,
352
+ loader: o.loader,
353
+ ErrorBoundary: o.ErrorBoundary,
354
+ Pending: o.Pending,
355
+ renderMode: c,
356
356
  chain: a
357
- }, _ = null;
358
- if (typeof s.loader == "function") {
357
+ }, g = null;
358
+ if (typeof o.loader == "function") {
359
359
  let e = new AbortController();
360
360
  try {
361
- _ = await s.loader({
361
+ g = await o.loader({
362
362
  params: i.params,
363
363
  pathname: i.pathname,
364
364
  search: "",
@@ -376,65 +376,65 @@ var J = W({ scope: "voltro:build" }), ne = async (e) => {
376
376
  throw Error(`Static page "${i.pathname}": its loader threw at build time — the page would prerender EMPTY. Fix the loader (cause below) or throw NotFoundError to skip this path.\ncause: ${e instanceof Error ? e.stack ?? e.message : String(e)}`);
377
377
  }
378
378
  }
379
- T(_) && E({
379
+ w(g) && T({
380
380
  page: i.pathname,
381
- renderMode: u,
382
- interactive: h
381
+ renderMode: c,
382
+ interactive: m
383
383
  });
384
- for (let e of Object.values(c)) T(e) && E({
384
+ for (let e of Object.values(s)) w(e) && T({
385
385
  page: i.pathname,
386
- renderMode: u,
387
- interactive: h
386
+ renderMode: c,
387
+ interactive: m
388
388
  });
389
- await t({
390
- pageMod: s,
389
+ await p({
390
+ pageMod: o,
391
391
  params: i.params,
392
392
  query: void 0,
393
393
  apiName: void 0,
394
- seed: D,
395
- seedFailure: O
394
+ seed: ee,
395
+ seedFailure: te
396
396
  });
397
- let y = i.params.locale ?? e.defaultLocale ?? "en", b = A.get(y) ?? A.get(e.defaultLocale ?? ""), w = Date.now(), M = b ? (e) => b(e, {
398
- timeZone: k,
399
- renderedAt: w
397
+ let y = i.params.locale ?? e.defaultLocale ?? "en", b = A.get(y) ?? A.get(e.defaultLocale ?? ""), E = Date.now(), M = b ? (e) => b(e, {
398
+ timeZone: O,
399
+ renderedAt: E
400
400
  }) : void 0, { html: N, meta: F } = x({
401
- descriptor: g,
401
+ descriptor: h,
402
402
  params: i.params,
403
403
  pathname: i.pathname,
404
- loaderData: _,
405
- segmentLoaderData: c,
404
+ loaderData: g,
405
+ segmentLoaderData: s,
406
406
  ...M ? { outerWrap: M } : {},
407
407
  locale: y
408
408
  }), I = "";
409
- if (typeof s.ogImage == "function") {
410
- let t = await s.ogImage({
409
+ if (typeof o.ogImage == "function") {
410
+ let n = await o.ogImage({
411
411
  params: i.params,
412
- loaderData: _,
412
+ loaderData: g,
413
413
  locale: y
414
- }), a = await S(n, e.fonts), { png: o } = await v({
415
- element: t,
414
+ }), a = await k(t, e.fonts), { png: s } = await _({
415
+ element: n,
416
416
  fonts: a
417
- }), c = `assets/og/${L(o)}.png`;
418
- await U.mkdir(B(r, "assets", "og"), { recursive: !0 }), await U.writeFile(B(r, c), Buffer.from(o));
417
+ }), c = `assets/og/${L(s)}.png`;
418
+ await U.mkdir(B(r, "assets", "og"), { recursive: !0 }), await U.writeFile(B(r, c), Buffer.from(s));
419
419
  let l = e.siteUrl === void 0 ? `/${c}` : `${e.siteUrl.replace(/\/$/, "")}/${c}`;
420
- I = C(F).includes("og:image") ? "" : `<meta property="og:image" content="${l}" /><meta name="twitter:image" content="${l}" /><meta name="twitter:card" content="summary_large_image" />`;
420
+ I = S(F).includes("og:image") ? "" : `<meta property="og:image" content="${l}" /><meta name="twitter:image" content="${l}" /><meta name="twitter:card" content="summary_large_image" />`;
421
421
  }
422
- let H = h === "islands" ? d.get(o.pattern) : void 0;
423
- h === "islands" && H === void 0 && Y.warn("islands page has no per-page entry (non-literal `interactive`?) — shipping the full app entry", { pattern: o.pattern });
422
+ let H = m === "islands" ? d.get(n.pattern) : void 0;
423
+ m === "islands" && H === void 0 && Y.warn("islands page has no per-page entry (non-literal `interactive`?) — shipping the full app entry", { pattern: n.pattern });
424
424
  let G = ae(H ?? l, {
425
425
  body: N,
426
- metaHtml: C(F) + I,
427
- stateScript: ee({
426
+ metaHtml: S(F) + I,
427
+ stateScript: C({
428
428
  path: i.pathname,
429
- loaderData: _,
430
- segmentLoaderData: c,
431
- pageLoaderRan: typeof s.loader == "function"
429
+ loaderData: g,
430
+ segmentLoaderData: s,
431
+ pageLoaderRan: typeof o.loader == "function"
432
432
  }),
433
- interactive: h,
433
+ interactive: m,
434
434
  documentAttrs: {
435
435
  lang: y,
436
- ...k === void 0 ? {} : { timeZone: k },
437
- renderedAt: w
436
+ ...O === void 0 ? {} : { timeZone: O },
437
+ renderedAt: E
438
438
  }
439
439
  }), K = $(r, i.pathname);
440
440
  await U.mkdir(z(K), { recursive: !0 }), await U.writeFile(K, G, "utf8"), j.push({
@@ -444,7 +444,7 @@ var J = W({ scope: "voltro:build" }), ne = async (e) => {
444
444
  });
445
445
  }
446
446
  }
447
- return await _.close(), {
447
+ return await y.close(), {
448
448
  rendered: j,
449
449
  pageMeta: M
450
450
  };
@@ -544,7 +544,7 @@ var J = W({ scope: "voltro:build" }), ne = async (e) => {
544
544
  file: n.file,
545
545
  reason: n.reason
546
546
  });
547
- let { regenerateRpcGroup: r } = await import("./codegenCommand-CidbQzbv.js"), i = await r(e);
547
+ let { regenerateRpcGroup: r } = await import("./codegenCommand-DnVuDxwT.js"), i = await r(e);
548
548
  if (i.kind === "refused") {
549
549
  Y.warn("could not regenerate the rpc group — building against what is on disk", { reason: i.reason });
550
550
  return;
@@ -554,15 +554,19 @@ var J = W({ scope: "voltro:build" }), ne = async (e) => {
554
554
  routes: i.routes
555
555
  });
556
556
  }, ue = async (e) => {
557
- let t = await x(e, { preferSource: !0 });
557
+ let t = await S(e, { preferSource: !0 });
558
558
  if (!t) {
559
- let { loadApiConfig: t } = await import("./dev-B9Gz0k85.js"), n = await t(e);
560
- if (n) {
561
- Y.info("building api app", { app: n.name ?? "(unnamed)" }), await le(e);
562
- let { runApiBuild: t, runServeBundleBuild: r } = await import("./apiBuild-Vw1figjO.js");
559
+ let { loadApiConfigDiagnosed: t } = await import("./dev-Bl9HqtV7.js"), n = await t(e), r = n.config;
560
+ if (!r && n.present) return Y.error("app.config.ts is present but could not be loaded — this is NOT a statement about the app's type", { path: B(e, "app.config.ts") }, n.error), {
561
+ ran: !0,
562
+ exitCode: 1
563
+ };
564
+ if (r) {
565
+ Y.info("building api app", { app: r.name ?? "(unnamed)" }), await le(e);
566
+ let { runApiBuild: t, runServeBundleBuild: n } = await import("./apiBuild-B83Cb2Rv.js");
563
567
  await t(e);
564
568
  try {
565
- await r(e);
569
+ await n(e);
566
570
  } catch (e) {
567
571
  return Y.fatal("serve bundle build FAILED — refusing to ship a bundle-less image. Fix the error above (production serves from the bundle, never tsx).", {}, e), {
568
572
  ran: !0,
@@ -586,31 +590,31 @@ var J = W({ scope: "voltro:build" }), ne = async (e) => {
586
590
  root: e,
587
591
  log: Y,
588
592
  generateTypes: !0
589
- }), r = await _(e, t);
590
- await E(e, t, r, n.publicValues);
591
- let { pages: o } = await i(B(e, "src", "pages")), s = [];
592
- for (let t of o) {
593
- let n = await U.readFile(B(e, "src", "pages", t.file), "utf8").catch(() => ""), r = te(n);
594
- n.includes("<Script") && (r === "none" || r === "islands") && Y.warn(r === "none" ? `page '${t.pattern}' uses <Script> but declares interactive: 'none' — zero-JS strips every script, so it will NEVER load. Remove the <Script>, or raise the page to islands/full.` : `page '${t.pattern}' uses <Script> in its STATIC part (the page file) while interactive: 'islands' — outside an island nothing mounts, so it will NEVER load. Move the <Script> into an *.island.tsx component (it fires when that island hydrates).`), r === "islands" && s.push({
593
+ }), o = await y(e, t);
594
+ await D(e, t, o, n.publicValues);
595
+ let { pages: l } = await u(B(e, "src", "pages")), p = [];
596
+ for (let t of l) {
597
+ let n = await U.readFile(B(e, "src", "pages", t.file), "utf8").catch(() => ""), r = x(n);
598
+ n.includes("<Script") && (r === "none" || r === "islands") && Y.warn(r === "none" ? `page '${t.pattern}' uses <Script> but declares interactive: 'none' — zero-JS strips every script, so it will NEVER load. Remove the <Script>, or raise the page to islands/full.` : `page '${t.pattern}' uses <Script> in its STATIC part (the page file) while interactive: 'islands' — outside an island nothing mounts, so it will NEVER load. Move the <Script> into an *.island.tsx component (it fires when that island hydrates).`), r === "islands" && p.push({
595
599
  pattern: t.pattern,
596
600
  file: t.file
597
601
  });
598
602
  }
599
- let u = C(r, "../../app.config"), d = await O({
603
+ let m = w(o, "../../app.config"), g = await a({
600
604
  webRoot: e,
601
- pages: s,
602
- headSnippets: a(await U.readFile(B(e, ".framework", "index.html"), "utf8").catch(() => "")),
603
- apiImports: u.imports,
604
- apiEntriesLiteral: `[\n${u.providerEntryLines.join("\n")}\n ]`
605
+ pages: p,
606
+ headSnippets: i(await U.readFile(B(e, ".framework", "index.html"), "utf8").catch(() => "")),
607
+ apiImports: m.imports,
608
+ apiEntriesLiteral: `[\n${m.providerEntryLines.join("\n")}\n ]`
605
609
  });
606
- d.length > 0 && Y.info("per-page islands entries", { pages: d.map((e) => `${e.pattern}${e.usesClient ? " (client boot)" : ""}`) });
607
- let { pages: m } = await i(B(e, "src", "pages"));
608
- await ee({
610
+ g.length > 0 && Y.info("per-page islands entries", { pages: g.map((e) => `${e.pattern}${e.usesClient ? " (client boot)" : ""}`) });
611
+ let { pages: _ } = await u(B(e, "src", "pages"));
612
+ await b({
609
613
  appRoot: e,
610
- pages: m,
614
+ pages: _,
611
615
  mode: "prod"
612
616
  });
613
- let v = B(e, ".framework"), S = B(v, "dist"), w = B(e, "node_modules", "@voltro", "ui-shadcn"), j = H(B(w, "package.json")) ? w : null, N = [...j ? [
617
+ let v = B(e, ".framework"), E = B(v, "dist"), k = B(e, "node_modules", "@voltro", "ui-shadcn"), j = H(B(k, "package.json")) ? k : null, N = [...j ? [
614
618
  {
615
619
  find: "@voltro/ui-shadcn/tokens.css",
616
620
  replacement: B(j, "src/tokens.css")
@@ -627,9 +631,9 @@ var J = W({ scope: "voltro:build" }), ne = async (e) => {
627
631
  find: "@voltro/ui-shadcn",
628
632
  replacement: B(j, "src/index.ts")
629
633
  }
630
- ] : [], ...y(e)];
634
+ ] : [], ...s(e)];
631
635
  Y.info("running vite build");
632
- let P = await l("vite", () => import("vite")), F = (await import("@vitejs/plugin-react")).default, L = (await import("@tailwindcss/vite")).default, V = t.web?.sourcemaps, W = t.web?.assetPrefix;
636
+ let P = await h("vite", () => import("vite")), F = (await import("@vitejs/plugin-react")).default, L = (await import("@tailwindcss/vite")).default, V = t.web?.sourcemaps, W = t.web?.assetPrefix;
633
637
  if (W !== void 0 && !/^https?:\/\/|^\//.test(W)) return Y.fatal(`web.assetPrefix must be an absolute URL or a root-relative path — got ${JSON.stringify(W)}. A bare host would be resolved against the page URL and 404 on every route but one.`), {
634
638
  ran: !0,
635
639
  exitCode: 1
@@ -641,7 +645,7 @@ var J = W({ scope: "voltro:build" }), ne = async (e) => {
641
645
  plugins: [
642
646
  F(),
643
647
  L(),
644
- p({
648
+ f({
645
649
  root: e,
646
650
  config: I(t.images)
647
651
  }),
@@ -664,39 +668,39 @@ var J = W({ scope: "voltro:build" }), ne = async (e) => {
664
668
  rollupOptions: {
665
669
  input: {
666
670
  index: B(v, "index.html"),
667
- ...Object.fromEntries(d.map((e) => [`island_${e.name}`, B(v, e.htmlFile)]))
671
+ ...Object.fromEntries(g.map((e) => [`island_${e.name}`, B(v, e.htmlFile)]))
668
672
  },
669
- output: { manualChunks: D }
673
+ output: { manualChunks: te }
670
674
  }
671
675
  },
672
676
  logLevel: "warn"
673
677
  });
674
- let G = B(e, "src", "pages"), { pages: K, dirs: q } = await i(G);
678
+ let G = B(e, "src", "pages"), { pages: K, dirs: q } = await u(G);
675
679
  if (K.length === 0) return Y.info("no pages found — client-only bundle written", {
676
680
  pagesDir: G,
677
- distDir: S
681
+ distDir: E
678
682
  }), {
679
683
  ran: !0,
680
684
  exitCode: 0
681
685
  };
682
686
  {
683
- let n = await k(e, t.fonts);
687
+ let n = await ee(e, t.fonts);
684
688
  if (n !== null) {
685
689
  for (let e of n.files) {
686
- let t = B(S, e.fileName);
690
+ let t = B(E, e.fileName);
687
691
  await U.mkdir(z(t), { recursive: !0 }), await U.writeFile(t, Buffer.from(e.bytes));
688
692
  }
689
693
  Y.info(`fonts: ${n.files.length} hashed file(s) into dist/assets/fonts`);
690
694
  }
691
695
  }
692
- T(e);
696
+ r(e);
693
697
  let { rendered: J, pageMeta: Z } = await se({
694
698
  root: e,
695
- distDir: S,
699
+ distDir: E,
696
700
  pages: K,
697
701
  dirs: q,
698
702
  vite: P,
699
- islandsPlans: d,
703
+ islandsPlans: g,
700
704
  ...t.locales ? { locales: t.locales } : {},
701
705
  ...t.defaultLocale ? { defaultLocale: t.defaultLocale } : {},
702
706
  ...t.timeZone ? { timeZone: t.timeZone } : {},
@@ -705,10 +709,10 @@ var J = W({ scope: "voltro:build" }), ne = async (e) => {
705
709
  ...t.fonts === void 0 ? {} : { fonts: t.fonts },
706
710
  ...t.seo?.siteUrl === void 0 ? {} : { siteUrl: t.seo.siteUrl }
707
711
  });
708
- await g(S), await f(S, t.feeds ?? [], t.seo?.siteUrl), Y.info("generating .framework/ssrEntry.ts"), await ce(e, K, q, t.locales, t.defaultLocale, Z, {
712
+ await O(E), await d(E, t.feeds ?? [], t.seo?.siteUrl), Y.info("generating .framework/ssrEntry.ts"), await ce(e, K, q, t.locales, t.defaultLocale, Z, {
709
713
  ...t.timeZone ? { timeZone: t.timeZone } : {},
710
714
  ...t.defaultTimeZone ? { defaultTimeZone: t.defaultTimeZone } : {}
711
- }, r.map((e) => ({
715
+ }, o.map((e) => ({
712
716
  name: e.name,
713
717
  pkg: e.pkg
714
718
  }))), Y.info("vite build --ssr → dist/server/");
@@ -720,7 +724,7 @@ var J = W({ scope: "voltro:build" }), ne = async (e) => {
720
724
  plugins: [
721
725
  F(),
722
726
  L(),
723
- p({
727
+ f({
724
728
  root: e,
725
729
  config: I(t.images)
726
730
  }),
@@ -760,9 +764,9 @@ var J = W({ scope: "voltro:build" }), ne = async (e) => {
760
764
  if (H($)) {
761
765
  Y.info("precompiling app.config.ts → dist/server/appConfig.js");
762
766
  try {
763
- await (await l("esbuild", () => import("esbuild"))).build({
767
+ await (await h("esbuild", () => import("esbuild"))).build({
764
768
  entryPoints: [$],
765
- outfile: B(S, "server", "appConfig.js"),
769
+ outfile: B(E, "server", "appConfig.js"),
766
770
  bundle: !0,
767
771
  format: "esm",
768
772
  platform: "node",
@@ -793,31 +797,31 @@ var J = W({ scope: "voltro:build" }), ne = async (e) => {
793
797
  });
794
798
  try {
795
799
  let e = process.env.VOLTRO_SEO_NOINDEX !== "1", n = t.seo?.siteUrl, r = t.locales ?? [], i = t.defaultLocale ?? r[0];
796
- if (n && !H(B(S, "sitemap.xml"))) {
800
+ if (n && !H(B(E, "sitemap.xml"))) {
797
801
  let t = new Set(r.filter((e) => e !== i)), a = J.filter((e) => !e.noIndex).map((e) => e.pattern).filter((e) => {
798
802
  let n = e.split("/").filter(Boolean)[0];
799
803
  return n === void 0 || !t.has(n);
800
- }).filter((e) => !e.includes("[")).map((e) => ({ path: e })), o = b({
804
+ }).filter((e) => !e.includes("[")).map((e) => ({ path: e })), o = C({
801
805
  siteUrl: n,
802
806
  entries: a,
803
807
  ...r.length > 1 ? { locales: r } : {},
804
808
  ...i ? { defaultLocale: i } : {}
805
809
  });
806
- await U.writeFile(B(S, "sitemap.xml"), o, "utf8"), Y.info("wrote dist/sitemap.xml", {
810
+ await U.writeFile(B(E, "sitemap.xml"), o, "utf8"), Y.info("wrote dist/sitemap.xml", {
807
811
  urls: a.length,
808
812
  indexable: e
809
813
  });
810
814
  }
811
- if (!H(B(S, "robots.txt"))) {
812
- let r = h({
815
+ if (!H(B(E, "robots.txt"))) {
816
+ let r = T({
813
817
  indexable: e,
814
818
  ...e && n ? { sitemapUrl: `${n.replace(/\/$/, "")}/sitemap.xml` } : {},
815
819
  ...t.seo?.disallow ? { disallow: t.seo.disallow } : {}
816
820
  });
817
- await U.writeFile(B(S, "robots.txt"), r, "utf8"), Y.info("wrote dist/robots.txt", { indexable: e });
821
+ await U.writeFile(B(E, "robots.txt"), r, "utf8"), Y.info("wrote dist/robots.txt", { indexable: e });
818
822
  }
819
823
  {
820
- let { precompressAssets: e } = await import("./precompressAssets-YhTi1aWp.js"), t = await e(S);
824
+ let { precompressAssets: e } = await import("./precompressAssets-YhTi1aWp.js"), t = await e(E);
821
825
  t.files > 0 && Y.info("pre-compressed assets", {
822
826
  files: t.files,
823
827
  raw: t.originalBytes,
@@ -830,7 +834,7 @@ var J = W({ scope: "voltro:build" }), ne = async (e) => {
830
834
  }
831
835
  try {
832
836
  let t = await R(e);
833
- await U.writeFile(B(S, ".voltro-build.json"), JSON.stringify({
837
+ await U.writeFile(B(E, ".voltro-build.json"), JSON.stringify({
834
838
  version: 1,
835
839
  profile: t
836
840
  }, null, 2), "utf8"), Y.info("wrote deploy profile manifest", {
@@ -841,7 +845,7 @@ var J = W({ scope: "voltro:build" }), ne = async (e) => {
841
845
  } catch (e) {
842
846
  Y.warn("could not write .voltro-build.json deploy manifest", {}, e);
843
847
  }
844
- return Y.info("build complete", { distDir: S }), {
848
+ return Y.info("build complete", { distDir: E }), {
845
849
  ran: !0,
846
850
  exitCode: 0
847
851
  };
@@ -850,10 +854,10 @@ var J = W({ scope: "voltro:build" }), ne = async (e) => {
850
854
  try: () => ue(V(e)),
851
855
  catch: (e) => e
852
856
  }).pipe(K.orDie);
853
- return t.ran ? t.exitCode : (yield* K.logError("no web app found at this path", { hint: "looked for app.config.ts with `type: 'web'`" }), 1);
857
+ return t.ran ? t.exitCode : (yield* K.logError("no voltro app found at this path", { hint: "looked for an app.config.ts with `type: 'web'` or `type: 'api'` — a web app gets the vite build + prerender + start bundle, an api gets the precompiled serve bundle" }), 1);
854
858
  }), fe = async (t) => {
855
859
  if (G("build"), t.includes("--target")) {
856
- let { runSdkBuildCommand: e } = await import("./sdkgen-PY-umd6O.js");
860
+ let { runSdkBuildCommand: e } = await import("./sdkgen-CMUPrDjH.js");
857
861
  return e(t);
858
862
  }
859
863
  let n = t.find((e) => !e.startsWith("-")) ?? process.cwd(), r = await P(de(n), { scope: "voltro:build" });