@voltro/cli 0.28.0 → 0.29.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 (280) hide show
  1. package/CHANGELOG.md +278 -0
  2. package/THIRD-PARTY-NOTICES.md +88 -2
  3. package/dist/{apiBuild-eUM32r1u.js → apiBuild-BESZbTjA.js} +3 -3
  4. package/dist/apiBuild-C8d74T6g.js +2 -0
  5. package/dist/bin.js +3 -3
  6. package/dist/checkCommand-BPAtyWs8.js +2420 -0
  7. package/dist/checkCommand-DBvZvCh1.js +2 -0
  8. package/dist/cliRuntime-Oh517vCV.js +96 -0
  9. package/dist/{commands-CSkrUI1h.js → commands-82BDEktg.js} +6803 -8191
  10. package/dist/dbCommand-CaIVTp-a.js +2 -0
  11. package/dist/{dbCommand-CpYgmSw4.js → dbCommand-bCBbk6tz.js} +2 -2
  12. package/dist/{dev-CEZwJhmb.js → dev-Cg4BKLmi.js} +1801 -1612
  13. package/dist/{dev-DlBWWnJQ.js → dev-DeEJj5T4.js} +1 -1
  14. package/dist/fileConventions-Cof68_BL.js +33 -0
  15. package/dist/{frameworkTableAssembly-BwHU9Euq.js → frameworkTableAssembly-4Db40V23.js} +2 -2
  16. package/dist/frameworkTableAssembly-BTNirAAk.js +2 -0
  17. package/dist/index.js +1 -1
  18. package/dist/{inspect-CUCCzw2I.js → inspect-BMvQpwqy.js} +211 -190
  19. package/dist/inspect-DHeaMZak.js +2 -0
  20. package/dist/{inspectMetrics-BU90mvJN.js → inspectMetrics-DHYygE4s.js} +999 -961
  21. package/dist/{manifestBuild-BnzAxp2O.js → manifestBuild-C4R1EdHn.js} +1 -1
  22. package/dist/manifestBuild-Ck_90gZy.js +2 -0
  23. package/dist/sdkgen-CW5NbYF0.js +582 -0
  24. package/dist/serveCommand-BXl8mhZD.js +1489 -0
  25. package/dist/serveEntry.js +2 -2
  26. package/dist/{start-BGXIf6zT.js → start-CsCIaW4-.js} +282 -269
  27. package/dist/startEntry.js +2 -2
  28. package/package.json +17 -17
  29. package/templates/AGENTS.md +2 -1
  30. package/templates/agent-docs/_index.md +2 -1
  31. package/templates/agent-docs/_manifest.json +10 -1
  32. package/templates/agent-docs/ai.md +135 -0
  33. package/templates/agent-docs/cli.md +124 -6
  34. package/templates/agent-docs/configuration.md +32 -0
  35. package/templates/agent-docs/data.md +282 -0
  36. package/templates/agent-docs/database/migrations.md +47 -0
  37. package/templates/agent-docs/database/misc.md +57 -0
  38. package/templates/agent-docs/database/schema.md +3 -1
  39. package/templates/agent-docs/internationalization.md +161 -1
  40. package/templates/agent-docs/local-first-mobile.md +414 -0
  41. package/templates/agent-docs/routing.md +93 -2
  42. package/templates/agent-docs/schema-driven-ui.md +12 -0
  43. package/templates/agent-docs/templates/apibackends.md +1 -1
  44. package/templates/agent-docs/whats-new.md +162 -181
  45. package/templates/agent-docs/workflows.md +11 -0
  46. package/templates/apps/api-ai/package.json +7 -7
  47. package/templates/apps/api-auth/package.json +8 -8
  48. package/templates/apps/api-backend/package.json +7 -7
  49. package/templates/apps/api-backend-deactivation/package.json +7 -7
  50. package/templates/apps/api-backend-mail/package.json +8 -8
  51. package/templates/apps/api-backend-mariadb/package.json +9 -9
  52. package/templates/apps/api-backend-sqlite/.env.example +19 -0
  53. package/templates/apps/api-backend-sqlite/README.md +38 -0
  54. package/templates/apps/api-backend-sqlite/app.config.ts +35 -0
  55. package/templates/apps/api-backend-sqlite/database/schema.ts +54 -0
  56. package/templates/apps/api-backend-sqlite/mutations/notes.create.mutation.server.ts +19 -0
  57. package/templates/apps/api-backend-sqlite/mutations/notes.create.mutation.ts +37 -0
  58. package/templates/apps/api-backend-sqlite/package.json +30 -0
  59. package/templates/apps/api-backend-sqlite/queries/notes.query.server.ts +14 -0
  60. package/templates/apps/api-backend-sqlite/queries/notes.query.ts +20 -0
  61. package/templates/apps/api-backend-sqlite/template.json +6 -0
  62. package/templates/apps/api-backend-sqlite/tests/notes.create.test.ts +50 -0
  63. package/templates/apps/api-backend-sqlite/tsconfig.json +5 -0
  64. package/templates/apps/api-backend-storage/package.json +8 -8
  65. package/templates/apps/api-cms/README.md +104 -0
  66. package/templates/apps/api-cms/actions/content.get.action.server.ts +27 -0
  67. package/templates/apps/api-cms/actions/content.get.action.ts +19 -0
  68. package/templates/apps/api-cms/actions/content.types.action.server.ts +26 -0
  69. package/templates/apps/api-cms/actions/content.types.action.ts +40 -0
  70. package/templates/apps/api-cms/actions/me.action.server.ts +18 -0
  71. package/templates/apps/api-cms/actions/me.action.ts +16 -0
  72. package/templates/apps/api-cms/app.config.ts +61 -0
  73. package/templates/apps/api-cms/content/blogPost.contentType.ts +39 -0
  74. package/templates/apps/api-cms/content/index.ts +18 -0
  75. package/templates/apps/api-cms/content/page.contentType.ts +24 -0
  76. package/templates/apps/api-cms/database/schema.ts +64 -0
  77. package/templates/apps/api-cms/mutations/content.publish.mutation.server.ts +19 -0
  78. package/templates/apps/api-cms/mutations/content.publish.mutation.ts +15 -0
  79. package/templates/apps/api-cms/mutations/content.saveDraft.mutation.server.ts +36 -0
  80. package/templates/apps/api-cms/mutations/content.saveDraft.mutation.ts +32 -0
  81. package/templates/apps/api-cms/mutations/content.unpublish.mutation.server.ts +19 -0
  82. package/templates/apps/api-cms/mutations/content.unpublish.mutation.ts +11 -0
  83. package/templates/apps/api-cms/package.json +32 -0
  84. package/templates/apps/api-cms/queries/content.list.query.server.ts +0 -0
  85. package/templates/apps/api-cms/queries/content.list.query.ts +27 -0
  86. package/templates/apps/api-cms/template.json +6 -0
  87. package/templates/apps/api-cms/tests/content.descriptors.test.ts +64 -0
  88. package/templates/apps/api-cms/tests/content.write.test.ts +85 -0
  89. package/templates/apps/api-cms/tsconfig.json +5 -0
  90. package/templates/apps/api-data-advanced/package.json +8 -8
  91. package/templates/apps/api-durable/package.json +8 -8
  92. package/templates/apps/api-feature-flags/package.json +9 -9
  93. package/templates/apps/api-governance/package.json +8 -8
  94. package/templates/apps/api-kv/package.json +8 -8
  95. package/templates/apps/api-moderation/package.json +8 -8
  96. package/templates/apps/api-observability/package.json +8 -8
  97. package/templates/apps/api-ratelimit/package.json +8 -8
  98. package/templates/apps/api-rbac/package.json +8 -8
  99. package/templates/apps/api-rest/package.json +7 -7
  100. package/templates/apps/api-saas/package.json +11 -11
  101. package/templates/apps/api-saas-starter/README.md +103 -0
  102. package/templates/apps/api-saas-starter/actions/me.action.server.ts +18 -0
  103. package/templates/apps/api-saas-starter/actions/me.action.ts +20 -0
  104. package/templates/apps/api-saas-starter/app.config.ts +87 -0
  105. package/templates/apps/api-saas-starter/database/schema.ts +57 -0
  106. package/templates/apps/api-saas-starter/mutations/invites.create.mutation.server.ts +26 -0
  107. package/templates/apps/api-saas-starter/mutations/invites.create.mutation.ts +18 -0
  108. package/templates/apps/api-saas-starter/mutations/projects.create.mutation.server.ts +29 -0
  109. package/templates/apps/api-saas-starter/mutations/projects.create.mutation.ts +18 -0
  110. package/templates/apps/api-saas-starter/package.json +32 -0
  111. package/templates/apps/api-saas-starter/queries/invites.list.query.server.ts +14 -0
  112. package/templates/apps/api-saas-starter/queries/invites.list.query.ts +17 -0
  113. package/templates/apps/api-saas-starter/queries/projects.list.query.server.ts +14 -0
  114. package/templates/apps/api-saas-starter/queries/projects.list.query.ts +18 -0
  115. package/templates/apps/api-saas-starter/template.json +6 -0
  116. package/templates/apps/api-saas-starter/tests/projects.create.test.ts +62 -0
  117. package/templates/apps/api-saas-starter/tests/session.test.ts +33 -0
  118. package/templates/apps/api-saas-starter/tsconfig.json +5 -0
  119. package/templates/apps/api-search/package.json +8 -8
  120. package/templates/apps/api-status/README.md +88 -0
  121. package/templates/apps/api-status/app.config.ts +36 -0
  122. package/templates/apps/api-status/authz.ts +33 -0
  123. package/templates/apps/api-status/database/schema.ts +70 -0
  124. package/templates/apps/api-status/mutations/components.create.mutation.server.ts +19 -0
  125. package/templates/apps/api-status/mutations/components.create.mutation.ts +16 -0
  126. package/templates/apps/api-status/mutations/incidents.create.mutation.server.ts +25 -0
  127. package/templates/apps/api-status/mutations/incidents.create.mutation.ts +22 -0
  128. package/templates/apps/api-status/mutations/incidents.resolve.mutation.server.ts +24 -0
  129. package/templates/apps/api-status/mutations/incidents.resolve.mutation.ts +19 -0
  130. package/templates/apps/api-status/mutations/incidents.update.mutation.server.ts +26 -0
  131. package/templates/apps/api-status/mutations/incidents.update.mutation.ts +21 -0
  132. package/templates/apps/api-status/package.json +30 -0
  133. package/templates/apps/api-status/queries/components.list.query.server.ts +14 -0
  134. package/templates/apps/api-status/queries/components.list.query.ts +13 -0
  135. package/templates/apps/api-status/queries/incidents.live.query.server.ts +14 -0
  136. package/templates/apps/api-status/queries/incidents.live.query.ts +20 -0
  137. package/templates/apps/api-status/queries/updates.list.query.server.ts +14 -0
  138. package/templates/apps/api-status/queries/updates.list.query.ts +17 -0
  139. package/templates/apps/api-status/template.json +6 -0
  140. package/templates/apps/api-status/tests/status.test.ts +70 -0
  141. package/templates/apps/api-status/tsconfig.json +5 -0
  142. package/templates/apps/api-versioning/package.json +8 -8
  143. package/templates/apps/api-webhooks/package.json +9 -9
  144. package/templates/apps/changelog/package.json +6 -6
  145. package/templates/apps/edge-functions/package.json +2 -2
  146. package/templates/apps/frontend-admin/package.json +8 -8
  147. package/templates/apps/frontend-app/package.json +8 -8
  148. package/templates/apps/frontend-auth/README.md +78 -0
  149. package/templates/apps/frontend-auth/app.config.ts +34 -0
  150. package/templates/apps/frontend-auth/package.json +32 -0
  151. package/templates/apps/frontend-auth/src/components/AuthShell.tsx +35 -0
  152. package/templates/apps/frontend-auth/src/components/PasswordStrength.tsx +33 -0
  153. package/templates/apps/frontend-auth/src/config.ts +11 -0
  154. package/templates/apps/frontend-auth/src/globals.css +105 -0
  155. package/templates/apps/frontend-auth/src/globals.d.ts +6 -0
  156. package/templates/apps/frontend-auth/src/lib/auth.ts +34 -0
  157. package/templates/apps/frontend-auth/src/lib/redirect.test.ts +24 -0
  158. package/templates/apps/frontend-auth/src/lib/redirect.ts +29 -0
  159. package/templates/apps/frontend-auth/src/locales/de.ts +66 -0
  160. package/templates/apps/frontend-auth/src/locales/en.ts +76 -0
  161. package/templates/apps/frontend-auth/src/locales/index.ts +14 -0
  162. package/templates/apps/frontend-auth/src/pages/forgot/page.tsx +51 -0
  163. package/templates/apps/frontend-auth/src/pages/layout.tsx +12 -0
  164. package/templates/apps/frontend-auth/src/pages/login/page.test.tsx +53 -0
  165. package/templates/apps/frontend-auth/src/pages/login/page.tsx +67 -0
  166. package/templates/apps/frontend-auth/src/pages/logout/page.tsx +28 -0
  167. package/templates/apps/frontend-auth/src/pages/magic/page.tsx +51 -0
  168. package/templates/apps/frontend-auth/src/pages/page.tsx +26 -0
  169. package/templates/apps/frontend-auth/src/pages/reset/page.test.tsx +51 -0
  170. package/templates/apps/frontend-auth/src/pages/reset/page.tsx +63 -0
  171. package/templates/apps/frontend-auth/src/pages/signup/page.tsx +60 -0
  172. package/templates/apps/frontend-auth/src/pages/verify/page.tsx +50 -0
  173. package/templates/apps/frontend-auth/template.json +6 -0
  174. package/templates/apps/frontend-auth/tsconfig.json +5 -0
  175. package/templates/apps/frontend-blank/package.json +7 -7
  176. package/templates/apps/frontend-cms/README.md +47 -0
  177. package/templates/apps/frontend-cms/app.config.ts +37 -0
  178. package/templates/apps/frontend-cms/package.json +33 -0
  179. package/templates/apps/frontend-cms/src/config.ts +8 -0
  180. package/templates/apps/frontend-cms/src/globals.css +105 -0
  181. package/templates/apps/frontend-cms/src/globals.d.ts +6 -0
  182. package/templates/apps/frontend-cms/src/lib/api.ts +58 -0
  183. package/templates/apps/frontend-cms/src/locales/de.ts +50 -0
  184. package/templates/apps/frontend-cms/src/locales/en.ts +55 -0
  185. package/templates/apps/frontend-cms/src/locales/index.ts +14 -0
  186. package/templates/apps/frontend-cms/src/pages/(app)/error.tsx +18 -0
  187. package/templates/apps/frontend-cms/src/pages/(app)/layout.test.tsx +31 -0
  188. package/templates/apps/frontend-cms/src/pages/(app)/layout.tsx +62 -0
  189. package/templates/apps/frontend-cms/src/pages/(app)/not-found.tsx +14 -0
  190. package/templates/apps/frontend-cms/src/pages/(app)/page.test.tsx +110 -0
  191. package/templates/apps/frontend-cms/src/pages/(app)/page.tsx +159 -0
  192. package/templates/apps/frontend-cms/src/pages/layout.tsx +12 -0
  193. package/templates/apps/frontend-cms/src/pages/login/page.test.tsx +58 -0
  194. package/templates/apps/frontend-cms/src/pages/login/page.tsx +93 -0
  195. package/templates/apps/frontend-cms/template.json +6 -0
  196. package/templates/apps/frontend-cms/tsconfig.json +5 -0
  197. package/templates/apps/frontend-contact/package.json +7 -7
  198. package/templates/apps/frontend-dashboard/package.json +7 -7
  199. package/templates/apps/frontend-docs/package.json +7 -7
  200. package/templates/apps/frontend-i18n/package.json +6 -6
  201. package/templates/apps/frontend-landing/package.json +7 -7
  202. package/templates/apps/frontend-portal/README.md +71 -0
  203. package/templates/apps/frontend-portal/app.config.ts +37 -0
  204. package/templates/apps/frontend-portal/package.json +32 -0
  205. package/templates/apps/frontend-portal/src/config.ts +8 -0
  206. package/templates/apps/frontend-portal/src/globals.css +93 -0
  207. package/templates/apps/frontend-portal/src/globals.d.ts +6 -0
  208. package/templates/apps/frontend-portal/src/lib/api.ts +62 -0
  209. package/templates/apps/frontend-portal/src/locales/de.ts +86 -0
  210. package/templates/apps/frontend-portal/src/locales/en.ts +93 -0
  211. package/templates/apps/frontend-portal/src/locales/index.ts +14 -0
  212. package/templates/apps/frontend-portal/src/pages/(portal)/api-keys/page.test.tsx +71 -0
  213. package/templates/apps/frontend-portal/src/pages/(portal)/api-keys/page.tsx +124 -0
  214. package/templates/apps/frontend-portal/src/pages/(portal)/billing/page.test.tsx +86 -0
  215. package/templates/apps/frontend-portal/src/pages/(portal)/billing/page.tsx +97 -0
  216. package/templates/apps/frontend-portal/src/pages/(portal)/error.tsx +19 -0
  217. package/templates/apps/frontend-portal/src/pages/(portal)/invoices/page.tsx +45 -0
  218. package/templates/apps/frontend-portal/src/pages/(portal)/layout.test.tsx +31 -0
  219. package/templates/apps/frontend-portal/src/pages/(portal)/layout.tsx +63 -0
  220. package/templates/apps/frontend-portal/src/pages/(portal)/not-found.tsx +15 -0
  221. package/templates/apps/frontend-portal/src/pages/(portal)/page.tsx +39 -0
  222. package/templates/apps/frontend-portal/src/pages/(portal)/profile/page.tsx +79 -0
  223. package/templates/apps/frontend-portal/src/pages/layout.tsx +12 -0
  224. package/templates/apps/frontend-portal/src/pages/login/page.test.tsx +58 -0
  225. package/templates/apps/frontend-portal/src/pages/login/page.tsx +96 -0
  226. package/templates/apps/frontend-portal/template.json +6 -0
  227. package/templates/apps/frontend-portal/tsconfig.json +5 -0
  228. package/templates/apps/frontend-saas/README.md +73 -0
  229. package/templates/apps/frontend-saas/app.config.ts +46 -0
  230. package/templates/apps/frontend-saas/package.json +32 -0
  231. package/templates/apps/frontend-saas/src/config.ts +8 -0
  232. package/templates/apps/frontend-saas/src/globals.css +85 -0
  233. package/templates/apps/frontend-saas/src/globals.d.ts +6 -0
  234. package/templates/apps/frontend-saas/src/lib/api.ts +47 -0
  235. package/templates/apps/frontend-saas/src/locales/de.ts +72 -0
  236. package/templates/apps/frontend-saas/src/locales/en.ts +81 -0
  237. package/templates/apps/frontend-saas/src/locales/index.ts +14 -0
  238. package/templates/apps/frontend-saas/src/pages/(marketing)/layout.tsx +30 -0
  239. package/templates/apps/frontend-saas/src/pages/(marketing)/login/page.test.tsx +58 -0
  240. package/templates/apps/frontend-saas/src/pages/(marketing)/login/page.tsx +96 -0
  241. package/templates/apps/frontend-saas/src/pages/(marketing)/page.tsx +27 -0
  242. package/templates/apps/frontend-saas/src/pages/dashboard/billing/page.tsx +72 -0
  243. package/templates/apps/frontend-saas/src/pages/dashboard/error.tsx +20 -0
  244. package/templates/apps/frontend-saas/src/pages/dashboard/layout.test.tsx +32 -0
  245. package/templates/apps/frontend-saas/src/pages/dashboard/layout.tsx +69 -0
  246. package/templates/apps/frontend-saas/src/pages/dashboard/not-found.tsx +17 -0
  247. package/templates/apps/frontend-saas/src/pages/dashboard/page.test.tsx +113 -0
  248. package/templates/apps/frontend-saas/src/pages/dashboard/page.tsx +76 -0
  249. package/templates/apps/frontend-saas/src/pages/dashboard/team/page.tsx +73 -0
  250. package/templates/apps/frontend-saas/src/pages/layout.tsx +12 -0
  251. package/templates/apps/frontend-saas/template.json +6 -0
  252. package/templates/apps/frontend-saas/tsconfig.json +5 -0
  253. package/templates/apps/frontend-spa/package.json +7 -7
  254. package/templates/apps/frontend-ssr/package.json +7 -7
  255. package/templates/apps/frontend-ssr-api/package.json +8 -8
  256. package/templates/apps/frontend-static-blog/package.json +6 -6
  257. package/templates/apps/frontend-status/README.md +51 -0
  258. package/templates/apps/frontend-status/app.config.ts +39 -0
  259. package/templates/apps/frontend-status/package.json +32 -0
  260. package/templates/apps/frontend-status/src/config.ts +7 -0
  261. package/templates/apps/frontend-status/src/globals.css +70 -0
  262. package/templates/apps/frontend-status/src/globals.d.ts +6 -0
  263. package/templates/apps/frontend-status/src/lib/status.ts +81 -0
  264. package/templates/apps/frontend-status/src/locales/de.ts +41 -0
  265. package/templates/apps/frontend-status/src/locales/en.ts +45 -0
  266. package/templates/apps/frontend-status/src/locales/index.ts +13 -0
  267. package/templates/apps/frontend-status/src/pages/layout.tsx +27 -0
  268. package/templates/apps/frontend-status/src/pages/page.test.tsx +123 -0
  269. package/templates/apps/frontend-status/src/pages/page.tsx +136 -0
  270. package/templates/apps/frontend-status/template.json +6 -0
  271. package/templates/apps/frontend-status/tsconfig.json +11 -0
  272. package/templates/baselines/compose/docker-compose.prod.yml +15 -0
  273. package/templates/baselines/compose-mariadb/docker-compose.prod.yml +15 -0
  274. package/dist/apiBuild-DgBS9ayv.js +0 -2
  275. package/dist/dbCommand-DvguqlzF.js +0 -2
  276. package/dist/fileConventions-3bffWssN.js +0 -30
  277. package/dist/frameworkTableAssembly-lrjZtk0G.js +0 -2
  278. package/dist/inspect-gt8bq-Tz.js +0 -2
  279. package/dist/manifestBuild-ifczArzr.js +0 -2
  280. package/dist/serveCommand-ZTn-dPFa.js +0 -1425
@@ -1,153 +1,65 @@
1
- import { S as e, d as t, f as n } from "./fileConventions-3bffWssN.js";
2
- import { D as r, E as i, T as a, a as o, p as s, w as c } from "./inspect-CUCCzw2I.js";
3
- import { basename as l, dirname as u, isAbsolute as d, join as f, relative as p, resolve as m } from "node:path";
4
- import { fileURLToPath as h, pathToFileURL as g } from "node:url";
5
- import { FileSystem as _ } from "@effect/platform";
6
- import { NodeContext as v, NodeRuntime as y } from "@effect/platform-node";
7
- import { Cause as b, Effect as x, Layer as S } from "effect";
8
- import { LoggerLayer as C, addSink as w, createLogger as T, printReadyBlock as E } from "@voltro/logger";
9
- import { closeSync as ee, existsSync as D, mkdirSync as O, openSync as k, promises as A, readFileSync as j, readdirSync as M, statSync as N, unlinkSync as P, unwatchFile as te, watchFile as F, writeSync as ne } from "node:fs";
10
- import { currentTraceContext as I, recordSample as L, resolveSecret as R } from "@voltro/runtime";
11
- import { homedir as re } from "node:os";
12
- import { createRequire as ie } from "node:module";
13
- import { FRAMEWORK_ENV_CATALOG as ae, appEnvEntries as oe, checkEnvNaming as se, formatEnvErrors as ce, installEnvSnapshot as le, isEnvContract as ue, pluginEnvEntries as z, renderDotEnvExample as de, resolveEnv as fe } from "@voltro/env";
14
- import { __installPublicEnv as pe } from "@voltro/env/public";
15
- import { mkdir as me, readFile as he, writeFile as B } from "node:fs/promises";
16
- import { createHash as ge } from "node:crypto";
17
- import { spawn as _e } from "node:child_process";
18
- import { createConnection as ve } from "node:net";
19
- import { PassThrough as ye } from "node:stream";
20
- //#region src/cliRuntime.ts
21
- var be = [
22
- "severity",
23
- "code",
24
- "detail",
25
- "hint",
26
- "position",
27
- "internalPosition",
28
- "internalQuery",
29
- "where",
30
- "schema",
31
- "table",
32
- "column",
33
- "dataType",
34
- "constraint",
35
- "file",
36
- "line",
37
- "routine"
38
- ], xe = (e, t = 0, n = /* @__PURE__ */ new WeakSet()) => {
39
- if (t > 10 || typeof e != "object" || !e || n.has(e)) return null;
40
- n.add(e);
41
- let r = e, i = r.message;
42
- if (typeof i == "string" && i.length > 0 && i !== "Failed to execute statement") {
43
- let e = { message: i };
44
- typeof r.stack == "string" && (e.stack = r.stack);
45
- for (let t of be) r[t] !== void 0 && (e[t] = r[t]);
46
- return e;
47
- }
48
- for (let e of [
49
- "cause",
50
- "defect",
51
- "left",
52
- "right",
53
- "failure",
54
- "failures"
55
- ]) {
56
- let i = r[e];
57
- if (i !== void 0) {
58
- let e = xe(i, t + 1, n);
59
- if (e) return e;
60
- }
61
- }
62
- if (Array.isArray(r.failures)) for (let e of r.failures) {
63
- let r = xe(e, t + 1, n);
64
- if (r) return r;
65
- }
66
- return null;
67
- }, V = (e) => ({
68
- ...e.scope ? { defaultScope: e.scope } : {},
69
- ...e.logger
70
- }), Se = (e = {}) => S.merge(v.layer, C(V(e))), H = async (e, t = {}) => {
71
- let n = e.pipe(x.provide(v.layer));
72
- return await x.runPromise(x.matchCauseEffect(n, {
73
- onSuccess: (e) => x.succeed(e),
74
- onFailure: (e) => {
75
- let t = [...b.defects(e)];
76
- if (process.env.VOLTRO_CAUSE_DEBUG === "1") for (let [e, n] of t.entries()) {
77
- let t = Object.getOwnPropertyNames(n);
78
- process.stderr.write(`[VOLTRO_CAUSE_DEBUG] defect[${e}] ctor=${n?.constructor?.name} props=${JSON.stringify(t)}\n`);
79
- let r = n;
80
- if (r.message && process.stderr.write(` message: ${String(r.message)}\n`), r.cause) {
81
- let e = r.cause;
82
- process.stderr.write(` cause.ctor=${e.constructor?.name} cause.message=${String(e.message)} cause.code=${String(e.code)}\n`);
83
- }
84
- }
85
- let n = null;
86
- for (let e of t) {
87
- let t = xe(e);
88
- if (t) {
89
- n = t;
90
- break;
91
- }
92
- }
93
- let r = n ? {
94
- pgMessage: n.message,
95
- ...n.code ? { pgCode: n.code } : {},
96
- ...n.detail ? { pgDetail: n.detail } : {},
97
- ...n.hint ? { pgHint: n.hint } : {},
98
- ...n.table ? { pgTable: n.table } : {},
99
- ...n.column ? { pgColumn: n.column } : {},
100
- ...n.constraint ? { pgConstraint: n.constraint } : {},
101
- ...n.routine ? { pgRoutine: n.routine } : {},
102
- causePretty: b.pretty(e)
103
- } : { causePretty: b.pretty(e) };
104
- return x.zipRight(x.logError("cli command failed", r), x.succeed(1));
105
- }
106
- }).pipe(x.provide(C(V(t)))));
107
- }, Ce = (e, t = {}) => {
108
- let n = e.pipe(x.provide(Se(t)));
109
- y.runMain(n, { disableErrorReporting: !1 });
110
- }, U = u(h(import.meta.url)), we = [m(U, "..", "templates"), m(U, "..", "..", "templates")], Te = (e) => ({
1
+ import { t as e } from "./cliRuntime-Oh517vCV.js";
2
+ import { T as t, h as n, m as r } from "./fileConventions-Cof68_BL.js";
3
+ import { D as i, E as a, O as o, a as s, p as c, w as l } from "./inspect-BMvQpwqy.js";
4
+ import { basename as u, dirname as d, isAbsolute as f, join as p, relative as m, resolve as h } from "node:path";
5
+ import { fileURLToPath as g, pathToFileURL as _ } from "node:url";
6
+ import { FileSystem as v } from "@effect/platform";
7
+ import { NodeContext as y } from "@effect/platform-node";
8
+ import { Effect as b } from "effect";
9
+ import { addSink as x, createLogger as S, printReadyBlock as C } from "@voltro/logger";
10
+ import { closeSync as w, existsSync as T, mkdirSync as E, openSync as D, promises as O, readFileSync as ee, readdirSync as k, statSync as A, unlinkSync as j, unwatchFile as M, watchFile as N, writeSync as P } from "node:fs";
11
+ import { currentTraceContext as F, recordSample as I, resolveSecret as L } from "@voltro/runtime";
12
+ import { homedir as R } from "node:os";
13
+ import { createRequire as z } from "node:module";
14
+ import { FRAMEWORK_ENV_CATALOG as B, appEnvEntries as te, checkEnvNaming as V, formatEnvErrors as ne, installEnvSnapshot as H, isEnvContract as re, pluginEnvEntries as ie, renderDotEnvExample as ae, resolveEnv as oe } from "@voltro/env";
15
+ import { __installPublicEnv as U } from "@voltro/env/public";
16
+ import { mkdir as se, readFile as ce, writeFile as W } from "node:fs/promises";
17
+ import { createHash as le } from "node:crypto";
18
+ import { spawn as ue } from "node:child_process";
19
+ import { createConnection as de } from "node:net";
20
+ import { PassThrough as fe } from "node:stream";
21
+ //#region src/agentsMd.ts
22
+ var pe = d(g(import.meta.url)), me = [h(pe, "..", "templates"), h(pe, "..", "..", "templates")], he = (e) => ({
111
23
  _tag: "TemplateNotFoundError",
112
24
  searched: e
113
- }), Ee = ["AGENTS.md", "CLAUDE.md"], De = "voltro:agents-md:keep", Oe = 2048, ke = "<!-- VOLTRO:INDEX -->", W = (e, t) => e.exists(t).pipe(x.orElseSucceed(() => !1)), G = (e, t) => e.readFileString(t).pipe(x.orElseSucceed(() => "")), Ae = (e, t) => e.readFileString(t).pipe(x.map((e) => {
25
+ }), ge = ["AGENTS.md", "CLAUDE.md"], _e = "voltro:agents-md:keep", G = 2048, ve = "<!-- VOLTRO:INDEX -->", K = (e, t) => e.exists(t).pipe(b.orElseSucceed(() => !1)), q = (e, t) => e.readFileString(t).pipe(b.orElseSucceed(() => "")), J = (e, t) => e.readFileString(t).pipe(b.map((e) => {
114
26
  try {
115
27
  return JSON.parse(e).workspaces !== void 0;
116
28
  } catch {
117
29
  return !1;
118
30
  }
119
- }), x.orElseSucceed(() => !1)), je = (e) => x.gen(function* () {
120
- let t = yield* _.FileSystem, n = m(e);
31
+ }), b.orElseSucceed(() => !1)), ye = (e) => b.gen(function* () {
32
+ let t = yield* v.FileSystem, n = h(e);
121
33
  for (;;) {
122
- if ((yield* W(t, f(n, ".git"))) || (yield* W(t, f(n, "pnpm-workspace.yaml"))) || (yield* Ae(t, f(n, "package.json")))) return n;
123
- let r = u(n);
124
- if (r === n) return m(e);
34
+ if ((yield* K(t, p(n, ".git"))) || (yield* K(t, p(n, "pnpm-workspace.yaml"))) || (yield* J(t, p(n, "package.json")))) return n;
35
+ let r = d(n);
36
+ if (r === n) return h(e);
125
37
  n = r;
126
38
  }
127
- }), Me = (e, t, n) => x.gen(function* () {
128
- yield* e.makeDirectory(n, { recursive: !0 }).pipe(x.orElseSucceed(() => void 0));
129
- let r = yield* e.readDirectory(t).pipe(x.orElseSucceed(() => []));
39
+ }), be = (e, t, n) => b.gen(function* () {
40
+ yield* e.makeDirectory(n, { recursive: !0 }).pipe(b.orElseSucceed(() => void 0));
41
+ let r = yield* e.readDirectory(t).pipe(b.orElseSucceed(() => []));
130
42
  for (let i of r) {
131
- let r = f(t, i), a = f(n, i);
132
- (yield* e.stat(r).pipe(x.orElseSucceed(() => null)))?.type === "Directory" ? yield* Me(e, r, a) : yield* e.copyFile(r, a).pipe(x.orElseSucceed(() => void 0));
133
- }
134
- }), Ne = (e) => typeof e?.name == "string" && e.name.length > 0 ? e.name.split("#")[0] : null, Pe = (e, t) => x.gen(function* () {
135
- let n = f(t, "app.config.ts");
136
- if (!(yield* W(e, n))) return null;
137
- let r = (yield* x.tryPromise(() => import(g(n).href)).pipe(x.orElseSucceed(() => null)))?.default;
138
- return !r || r.type && r.type !== "api" ? r?.type === "web" ? [] : null : (r.plugins ?? []).map(Ne).filter((e) => e !== null);
139
- }), Fe = (e, t) => x.gen(function* () {
140
- let n = [], r = [], i = f(t, "apps");
141
- if (!(yield* W(e, i))) return {
43
+ let r = p(t, i), a = p(n, i);
44
+ (yield* e.stat(r).pipe(b.orElseSucceed(() => null)))?.type === "Directory" ? yield* be(e, r, a) : yield* e.copyFile(r, a).pipe(b.orElseSucceed(() => void 0));
45
+ }
46
+ }), xe = (e) => typeof e?.name == "string" && e.name.length > 0 ? e.name.split("#")[0] : null, Se = (e, t) => b.gen(function* () {
47
+ let n = p(t, "app.config.ts");
48
+ if (!(yield* K(e, n))) return null;
49
+ let r = (yield* b.tryPromise(() => import(_(n).href)).pipe(b.orElseSucceed(() => null)))?.default;
50
+ return !r || r.type && r.type !== "api" ? r?.type === "web" ? [] : null : (r.plugins ?? []).map(xe).filter((e) => e !== null);
51
+ }), Ce = (e, t) => b.gen(function* () {
52
+ let n = [], r = [], i = p(t, "apps");
53
+ if (!(yield* K(e, i))) return {
142
54
  apis: n,
143
55
  webs: r
144
56
  };
145
- for (let t of yield* e.readDirectory(i).pipe(x.orElseSucceed(() => []))) {
146
- let a = f(i, t);
147
- if ((yield* e.stat(a).pipe(x.orElseSucceed(() => null)))?.type === "Directory") for (let t of yield* e.readDirectory(a).pipe(x.orElseSucceed(() => []))) {
148
- let i = f(a, t), o = f(i, "app.config.ts");
149
- if (!(yield* W(e, o))) continue;
150
- let s = yield* G(e, o);
57
+ for (let t of yield* e.readDirectory(i).pipe(b.orElseSucceed(() => []))) {
58
+ let a = p(i, t);
59
+ if ((yield* e.stat(a).pipe(b.orElseSucceed(() => null)))?.type === "Directory") for (let t of yield* e.readDirectory(a).pipe(b.orElseSucceed(() => []))) {
60
+ let i = p(a, t), o = p(i, "app.config.ts");
61
+ if (!(yield* K(e, o))) continue;
62
+ let s = yield* q(e, o);
151
63
  /type:\s*['"]web['"]/.test(s) ? r.push(i) : n.push(i);
152
64
  }
153
65
  }
@@ -155,7 +67,7 @@ var be = [
155
67
  apis: n,
156
68
  webs: r
157
69
  };
158
- }), Ie = (e) => e.replace(/\|/g, "\\|").replace(/\n/g, " ").trim(), Le = (e, t, n) => {
70
+ }), we = (e) => e.replace(/\|/g, "\\|").replace(/\n/g, " ").trim(), Te = (e, t, n) => {
159
71
  let r = [
160
72
  "<!-- voltro agent-docs index — regenerated at seed time -->",
161
73
  "## Deep reference (read on demand)",
@@ -167,17 +79,17 @@ var be = [
167
79
  "",
168
80
  "| Topic | Open | Summary |",
169
81
  "|---|---|---|",
170
- ...e.modules.map((e) => `| ${e.title} | \`${n}${e.path}\` | ${Ie(e.description)} |`),
82
+ ...e.modules.map((e) => `| ${e.title} | \`${n}${e.path}\` | ${we(e.description)} |`),
171
83
  ""
172
- ], i = new Map(e.plugins.map((e) => [e.pkg, e])), a = t === null ? e.plugins.map((e) => `| ${e.slug} | \`node_modules/${e.pkg}/README.md\` | ${Ie(e.description)} |`) : t.map((e) => {
84
+ ], i = new Map(e.plugins.map((e) => [e.pkg, e])), a = t === null ? e.plugins.map((e) => `| ${e.slug} | \`node_modules/${e.pkg}/README.md\` | ${we(e.description)} |`) : t.map((e) => {
173
85
  let t = i.get(e);
174
- return t ? `| ${t.slug} | \`node_modules/${e}/README.md\` | ${Ie(t.description)} |` : `| ${e.replace(/^@[^/]+\//, "")} | \`node_modules/${e}/README.md\` | (see plugin README) |`;
86
+ return t ? `| ${t.slug} | \`node_modules/${e}/README.md\` | ${we(t.description)} |` : `| ${e.replace(/^@[^/]+\//, "")} | \`node_modules/${e}/README.md\` | (see plugin README) |`;
175
87
  });
176
88
  return r.push(`### Plugins${t === null ? "" : " (installed)"}`, "", "| Plugin | Open | Summary |", "|---|---|---|"), r.push(a.length ? a.join("\n") : "| _(none installed)_ | | |", ""), r.join("\n");
177
- }, Re = (e, t, n) => {
89
+ }, Ee = (e, t, n) => {
178
90
  let r = t.templates?.[e] ?? t.templates?.[e.replace(/^frontend-/, "")];
179
91
  return `\nScaffolded from the \`${e}\` template — see \`${r ? `${n}${r}` : `${n}agent-docs/templates/overview.md`}\`.\n`;
180
- }, ze = {
92
+ }, De = {
181
93
  api: (e, t, n = "") => `# api — agent notes
182
94
 
183
95
  You are in a Voltro **api** app. Server primitives live here: \`queries/\`,
@@ -217,7 +129,7 @@ You are in a Voltro **web** app. File-based routing under \`src/pages/**\`.
217
129
  Deep reference (paths from the repo root): \`${e}agent-docs/routing.md\`,
218
130
  \`${e}agent-docs/schema-driven-ui.md\`, \`${e}agent-docs/internationalization.md\`.
219
131
  ${t}`
220
- }, Be = [
132
+ }, Oe = [
221
133
  {
222
134
  name: "voltro-schema",
223
135
  description: "Define or change a Voltro database table/schema (columns, mixins, indexes, relations).",
@@ -248,7 +160,7 @@ ${t}`
248
160
  description: "Export/import + backup/restore Voltro data & assets, and copy prod→dev/stage SAFELY with fail-closed masking/anonymization (.sensitive()/.safe()) + referential subsetting. Use for data takeout, seeding lower envs, backups, or cross-dialect moves.",
249
161
  module: "cli.md"
250
162
  }
251
- ], Ve = (e, t) => `---
163
+ ], ke = (e, t) => `---
252
164
  name: ${e.name}
253
165
  description: ${e.description}
254
166
  ---
@@ -259,10 +171,10 @@ Open the full reference and follow the patterns there:
259
171
 
260
172
  Also read the repo-root \`AGENTS.md\` for the always-true rules (browser/server
261
173
  boundary, naming, anti-patterns) before editing.
262
- `, He = (e, t, n, r) => x.gen(function* () {
263
- let i = yield* W(e, t);
174
+ `, Ae = (e, t, n, r) => b.gen(function* () {
175
+ let i = yield* K(e, t);
264
176
  if (i) {
265
- if ((yield* G(e, t)).slice(0, Oe).includes("voltro:agents-md:keep")) return {
177
+ if ((yield* q(e, t)).slice(0, G).includes("voltro:agents-md:keep")) return {
266
178
  path: t,
267
179
  action: "protected"
268
180
  };
@@ -271,71 +183,71 @@ boundary, naming, anti-patterns) before editing.
271
183
  action: "present"
272
184
  };
273
185
  }
274
- return yield* e.makeDirectory(u(t), { recursive: !0 }).pipe(x.orElseSucceed(() => void 0)), yield* e.writeFileString(t, n).pipe(x.orDie), {
186
+ return yield* e.makeDirectory(d(t), { recursive: !0 }).pipe(b.orElseSucceed(() => void 0)), yield* e.writeFileString(t, n).pipe(b.orDie), {
275
187
  path: t,
276
188
  action: i ? "overwritten" : "created"
277
189
  };
278
- }), Ue = (e, t = {}) => x.gen(function* () {
279
- let n = yield* _.FileSystem, r = yield* je(e), i = null;
280
- for (let e of we) if (yield* W(n, f(e, "AGENTS.core.md"))) {
190
+ }), je = (e, t = {}) => b.gen(function* () {
191
+ let n = yield* v.FileSystem, r = yield* ye(e), i = null;
192
+ for (let e of me) if (yield* K(n, p(e, "AGENTS.core.md"))) {
281
193
  i = e;
282
194
  break;
283
195
  }
284
196
  if (i === null) {
285
- for (let e of we) if (yield* W(n, f(e, "AGENTS.md"))) {
286
- let i = yield* G(n, f(e, "AGENTS.md")), a = [];
287
- for (let e of Ee) a.push(yield* He(n, f(r, e), i, t.force ?? !1));
197
+ for (let e of me) if (yield* K(n, p(e, "AGENTS.md"))) {
198
+ let i = yield* q(n, p(e, "AGENTS.md")), a = [];
199
+ for (let e of ge) a.push(yield* Ae(n, p(r, e), i, t.force ?? !1));
288
200
  return { files: a };
289
201
  }
290
- return yield* x.fail(Te(we.map((e) => f(e, "AGENTS.core.md"))));
202
+ return yield* b.fail(he(me.map((e) => p(e, "AGENTS.core.md"))));
291
203
  }
292
- let a = yield* G(n, f(i, "AGENTS.core.md")), o = yield* G(n, f(i, "agent-docs", "_manifest.json")), s = o ? JSON.parse(o) : {
204
+ let a = yield* q(n, p(i, "AGENTS.core.md")), o = yield* q(n, p(i, "agent-docs", "_manifest.json")), s = o ? JSON.parse(o) : {
293
205
  modules: [],
294
206
  plugins: []
295
- }, c = (t.preferPointer ?? !1) || (yield* W(n, f(r, "node_modules/@voltro/cli/templates/agent-docs", "_manifest.json"))), l = c ? "node_modules/@voltro/cli/templates/" : "", u = t.force ?? !1, d = Ee.map((e) => f(r, e));
296
- if ((yield* x.forEach(d, (e) => G(n, e).pipe(x.map((e) => e.slice(0, Oe))))).every((e) => e.includes("voltro:agents-md:keep"))) return { files: d.map((e) => ({
207
+ }, c = (t.preferPointer ?? !1) || (yield* K(n, p(r, "node_modules/@voltro/cli/templates/agent-docs", "_manifest.json"))), l = c ? "node_modules/@voltro/cli/templates/" : "", u = t.force ?? !1, d = ge.map((e) => p(r, e));
208
+ if ((yield* b.forEach(d, (e) => q(n, e).pipe(b.map((e) => e.slice(0, G))))).every((e) => e.includes("voltro:agents-md:keep"))) return { files: d.map((e) => ({
297
209
  path: e,
298
210
  action: "protected"
299
211
  })) };
300
- let { apis: p, webs: h } = yield* Fe(n, r), g = /* @__PURE__ */ new Map(), v = /* @__PURE__ */ new Set(), y = !1;
301
- for (let e of p) {
302
- let t = yield* Pe(n, e);
212
+ let { apis: f, webs: m } = yield* Ce(n, r), g = /* @__PURE__ */ new Map(), _ = /* @__PURE__ */ new Set(), y = !1;
213
+ for (let e of f) {
214
+ let t = yield* Se(n, e);
303
215
  if (g.set(e, t), t !== null) {
304
216
  y = !0;
305
- for (let e of t) v.add(e);
217
+ for (let e of t) _.add(e);
306
218
  }
307
219
  }
308
- let b = t.plugins ? t.plugins.map(Ne).filter((e) => e !== null) : y ? [...v] : null, S = a.includes(ke) ? a.replace(ke, Le(s, b, l)) : a, C = [];
309
- for (let e of d) C.push(yield* He(n, e, S, u));
310
- c || (yield* Me(n, f(i, "agent-docs"), f(r, "agent-docs")));
311
- let w = new Map((t.appTemplates ?? []).map((e) => [m(e.dir), e.template])), T = (e) => {
312
- let t = w.get(m(e));
313
- return t ? Re(t, s, l) : "";
314
- }, E = (e, t) => x.forEach(Ee, (r) => He(n, f(e, r), t, u));
315
- for (let e of p) C.push(...yield* E(e, ze.api(l, g.get(e) ?? null, T(e)))), (yield* W(n, f(e, "database"))) && C.push(...yield* E(f(e, "database"), ze.database(l)));
316
- for (let e of h) C.push(...yield* E(e, ze.web(l, T(e))));
317
- for (let e of Be) C.push(yield* He(n, f(r, ".claude", "skills", e.name, "SKILL.md"), Ve(e, l), u));
220
+ let x = t.plugins ? t.plugins.map(xe).filter((e) => e !== null) : y ? [..._] : null, S = a.includes(ve) ? a.replace(ve, Te(s, x, l)) : a, C = [];
221
+ for (let e of d) C.push(yield* Ae(n, e, S, u));
222
+ c || (yield* be(n, p(i, "agent-docs"), p(r, "agent-docs")));
223
+ let w = new Map((t.appTemplates ?? []).map((e) => [h(e.dir), e.template])), T = (e) => {
224
+ let t = w.get(h(e));
225
+ return t ? Ee(t, s, l) : "";
226
+ }, E = (e, t) => b.forEach(ge, (r) => Ae(n, p(e, r), t, u));
227
+ for (let e of f) C.push(...yield* E(e, De.api(l, g.get(e) ?? null, T(e)))), (yield* K(n, p(e, "database"))) && C.push(...yield* E(p(e, "database"), De.database(l)));
228
+ for (let e of m) C.push(...yield* E(e, De.web(l, T(e))));
229
+ for (let e of Oe) C.push(yield* Ae(n, p(r, ".claude", "skills", e.name, "SKILL.md"), ke(e, l), u));
318
230
  return { files: C };
319
- }), We = (e, t = {}) => x.runPromise(Ue(e, t).pipe(x.provide(v.layer))), Ge = async (e) => {
320
- let t = e.includes("--force"), n = e.find((e) => !e.startsWith("-")) ?? process.cwd();
321
- return H(x.gen(function* () {
322
- let e = yield* Ue(n, { force: t });
231
+ }), Me = (e, t = {}) => b.runPromise(je(e, t).pipe(b.provide(y.layer))), Ne = async (t) => {
232
+ let n = t.includes("--force"), r = t.find((e) => !e.startsWith("-")) ?? process.cwd();
233
+ return e(b.gen(function* () {
234
+ let e = yield* je(r, { force: n });
323
235
  for (let t of e.files) {
324
- let e = t.action === "created" ? "wrote" : t.action === "overwritten" ? "overwrote" : t.action === "protected" ? `protected (hand-maintained — has "${De}")` : "present (use --force to overwrite)";
325
- yield* x.logInfo(`${t.path.split("/").slice(-2).join("/")} ${e}`, { action: t.action });
236
+ let e = t.action === "created" ? "wrote" : t.action === "overwritten" ? "overwrote" : t.action === "protected" ? `protected (hand-maintained — has "${_e}")` : "present (use --force to overwrite)";
237
+ yield* b.logInfo(`${t.path.split("/").slice(-2).join("/")} ${e}`, { action: t.action });
326
238
  }
327
239
  return 0;
328
- }).pipe(x.catchTag("TemplateNotFoundError", (e) => x.gen(function* () {
329
- return yield* x.logError("AGENTS.md template not found", { searched: e.searched }), 1;
240
+ }).pipe(b.catchTag("TemplateNotFoundError", (e) => b.gen(function* () {
241
+ return yield* b.logError("AGENTS.md template not found", { searched: e.searched }), 1;
330
242
  }))), { scope: "voltro:agents-md" });
331
- }, Ke = f(re(), ".voltro"), qe = f(Ke, "runtime-registry.json"), Je = 3e4, Ye = () => {
243
+ }, Pe = p(R(), ".voltro"), Fe = p(Pe, "runtime-registry.json"), Ie = 3e4, Le = () => {
332
244
  let e = Math.random().toString(36).slice(2, 10);
333
- return `${qe}.${process.pid}.${Date.now()}.${e}.tmp`;
334
- }, Xe = async () => {
335
- await A.mkdir(Ke, { recursive: !0 });
336
- }, Ze = async () => {
245
+ return `${Fe}.${process.pid}.${Date.now()}.${e}.tmp`;
246
+ }, Re = async () => {
247
+ await O.mkdir(Pe, { recursive: !0 });
248
+ }, ze = async () => {
337
249
  try {
338
- let e = await A.readFile(qe, "utf8"), t = JSON.parse(e);
250
+ let e = await O.readFile(Fe, "utf8"), t = JSON.parse(e);
339
251
  return t.version !== 1 || !Array.isArray(t.apps) ? {
340
252
  version: 1,
341
253
  apps: []
@@ -346,34 +258,34 @@ boundary, naming, anti-patterns) before editing.
346
258
  apps: []
347
259
  };
348
260
  }
349
- }, Qe = async (e) => {
350
- await Xe();
351
- let t = Ye();
261
+ }, Be = async (e) => {
262
+ await Re();
263
+ let t = Le();
352
264
  try {
353
- await A.writeFile(t, JSON.stringify(e, null, 2), {
265
+ await O.writeFile(t, JSON.stringify(e, null, 2), {
354
266
  encoding: "utf8",
355
267
  mode: 384
356
- }), await A.rename(t, qe), await A.chmod(qe, 384).catch(() => {});
268
+ }), await O.rename(t, Fe), await O.chmod(Fe, 384).catch(() => {});
357
269
  } catch (e) {
358
270
  try {
359
- await A.unlink(t);
271
+ await O.unlink(t);
360
272
  } catch {}
361
273
  throw e;
362
274
  }
363
- }, $e = (e) => {
275
+ }, Ve = (e) => {
364
276
  try {
365
277
  return process.kill(e, 0), !0;
366
278
  } catch {
367
279
  return !1;
368
280
  }
369
- }, et = (e) => {
281
+ }, He = (e) => {
370
282
  let t = Date.now();
371
- return e.filter((e) => $e(e.pid) ? t - new Date(e.heartbeatAt).getTime() < Je : !1);
372
- }, tt = async () => {
373
- let e = await Ze(), t = et(e.apps);
283
+ return e.filter((e) => Ve(e.pid) ? t - new Date(e.heartbeatAt).getTime() < Ie : !1);
284
+ }, Ue = async () => {
285
+ let e = await ze(), t = He(e.apps);
374
286
  if (t.length === e.apps.length) return e;
375
287
  try {
376
- await Qe({
288
+ await Be({
377
289
  version: 1,
378
290
  apps: t
379
291
  });
@@ -382,31 +294,31 @@ boundary, naming, anti-patterns) before editing.
382
294
  version: 1,
383
295
  apps: t
384
296
  };
385
- }, nt = async (e) => {
386
- let t = await Ze(), n = (/* @__PURE__ */ new Date()).toISOString(), r = t.apps.findIndex((t) => t.id === e.id), i = e.inspectToken ?? process.env.VOLTRO_INSPECT_TOKEN, a = {
297
+ }, We = async (e) => {
298
+ let t = await ze(), n = (/* @__PURE__ */ new Date()).toISOString(), r = t.apps.findIndex((t) => t.id === e.id), i = e.inspectToken ?? process.env.VOLTRO_INSPECT_TOKEN, a = {
387
299
  ...e,
388
300
  ...i !== void 0 && i !== "" ? { inspectToken: i } : {},
389
301
  registeredAt: r >= 0 ? t.apps[r].registeredAt : n,
390
302
  heartbeatAt: n
391
303
  };
392
- await Qe({
304
+ await Be({
393
305
  version: 1,
394
306
  apps: r >= 0 ? t.apps.map((e, t) => t === r ? a : e) : [...t.apps, a]
395
307
  });
396
- }, rt = async (e) => {
308
+ }, Ge = async (e) => {
397
309
  try {
398
- let t = await Ze(), n = t.apps.filter((t) => t.id !== e);
310
+ let t = await ze(), n = t.apps.filter((t) => t.id !== e);
399
311
  if (n.length === t.apps.length) return;
400
- await Qe({
312
+ await Be({
401
313
  version: 1,
402
314
  apps: n
403
315
  });
404
316
  } catch {}
405
- }, it = (e, t, n) => `${e}:${t}:${n}`, at = (e) => e.replace(/\\"|"(?:[^"\\]|\\.)*"|(\/\/[^\n]*|\/\*[\s\S]*?\*\/)/g, (e, t) => t ? "" : e), ot = (e) => {
317
+ }, Ke = (e, t, n) => `${e}:${t}:${n}`, qe = (e) => e.replace(/\\"|"(?:[^"\\]|\\.)*"|(\/\/[^\n]*|\/\*[\s\S]*?\*\/)/g, (e, t) => t ? "" : e), Je = (e) => {
406
318
  try {
407
- let t = f(e, "tsconfig.json");
408
- if (!D(t)) return [];
409
- let n = JSON.parse(at(j(t, "utf8"))).compilerOptions ?? {}, r = n.paths ?? {}, i = m(e, n.baseUrl ?? "."), a = [];
319
+ let t = p(e, "tsconfig.json");
320
+ if (!T(t)) return [];
321
+ let n = JSON.parse(qe(ee(t, "utf8"))).compilerOptions ?? {}, r = n.paths ?? {}, i = h(e, n.baseUrl ?? "."), a = [];
410
322
  for (let [e, t] of Object.entries(r)) {
411
323
  let n = t[0];
412
324
  if (!n) continue;
@@ -415,28 +327,28 @@ boundary, naming, anti-patterns) before editing.
415
327
  let t = e.slice(0, -2).replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
416
328
  a.push({
417
329
  find: RegExp(`^${t}/(.*)$`),
418
- replacement: `${f(i, n.slice(0, -2))}/$1`
330
+ replacement: `${p(i, n.slice(0, -2))}/$1`
419
331
  });
420
332
  } else a.push({
421
333
  find: e,
422
- replacement: f(i, n)
334
+ replacement: p(i, n)
423
335
  });
424
336
  }
425
337
  return a;
426
338
  } catch {
427
339
  return [];
428
340
  }
429
- }, st = (e) => {
341
+ }, Ye = (e) => {
430
342
  let t = e;
431
343
  return t?.code === "ERR_MODULE_NOT_FOUND" || /Cannot find (package|module)/.test(String(t?.message ?? ""));
432
- }, ct = async (e, t) => {
344
+ }, Xe = async (e, t) => {
433
345
  try {
434
346
  return await t();
435
347
  } catch (t) {
436
- throw st(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;
348
+ throw Ye(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;
437
349
  }
438
- }, lt = "// AUTO-GENERATED by Voltro — DO NOT EDIT.\n// Source: app.config.ts `env` (defineEnv). Regenerated on every `voltro dev` boot.\n", ut = (e, t) => t ? `${e} | undefined` : e, dt = (e, t) => Object.entries(e.vars).filter(([, e]) => t(e.access)).map(([e, t]) => `${t.description ? ` /** ${t.description} */\n` : ""} readonly ${e}: ${ut(t.tsType, t.optional)}`).join("\n"), ft = async (e, t) => {
439
- let n = dt(t, () => !0), r = `${lt}
350
+ }, Ze = "// 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, $e = (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"), et = async (e, t) => {
351
+ let n = $e(t, () => !0), r = `${Ze}
440
352
  import '@voltro/env/server'
441
353
 
442
354
  declare module '@voltro/env/server' {
@@ -445,9 +357,9 @@ ${n.length > 0 ? n : " // (no variables declared)"}
445
357
  }
446
358
  }
447
359
  `;
448
- await B(f(e, "env.generated.d.ts"), r, "utf8");
449
- }, pt = async (e, t) => {
450
- let n = dt(t, (e) => e === "public"), r = `${lt}
360
+ await W(p(e, "env.generated.d.ts"), r, "utf8");
361
+ }, tt = async (e, t) => {
362
+ let n = $e(t, (e) => e === "public"), r = `${Ze}
451
363
  import '@voltro/env/public'
452
364
 
453
365
  declare module '@voltro/env/public' {
@@ -455,10 +367,10 @@ declare module '@voltro/env/public' {
455
367
  ${n.length > 0 ? n : " // (no public variables declared)"}
456
368
  }
457
369
  }
458
- `, i = f(e, "src");
459
- await me(i, { recursive: !0 }), await B(f(i, "voltro-env.d.ts"), r, "utf8");
460
- }, mt = async (e, t) => {
461
- let n = `${lt}
370
+ `, i = p(e, "src");
371
+ await se(i, { recursive: !0 }), await W(p(i, "voltro-env.d.ts"), r, "utf8");
372
+ }, nt = async (e, t) => {
373
+ let n = `${Ze}
462
374
  import { __installPublicEnv } from '@voltro/env/public'
463
375
 
464
376
  export const publicEnvValues = ${JSON.stringify(t, null, 2)} as const
@@ -466,14 +378,14 @@ export const publicEnvValues = ${JSON.stringify(t, null, 2)} as const
466
378
  // Set the browser/SSR-shared global the \`publicEnv\` accessor reads.
467
379
  __installPublicEnv(publicEnvValues)
468
380
  `;
469
- await me(e, { recursive: !0 }), await B(f(e, "env.public.ts"), n, "utf8");
470
- }, ht = async (e) => {
471
- let t = ue(e.rawEnv) ? e.rawEnv : void 0, n = await fe({
381
+ await se(e, { recursive: !0 }), await W(p(e, "env.public.ts"), n, "utf8");
382
+ }, rt = async (e) => {
383
+ let t = re(e.rawEnv) ? e.rawEnv : void 0, n = await oe({
472
384
  contract: t,
473
- resolveSecret: R
474
- }), r = [...n.errors, ...se(t, e.appType)];
475
- if (r.length > 0) throw Error(ce(r));
476
- le(n.values), e.appType === "web" && pe(n.publicValues);
385
+ resolveSecret: L
386
+ }), r = [...n.errors, ...V(t, e.appType)];
387
+ if (r.length > 0) throw Error(ne(r));
388
+ H(n.values), e.appType === "web" && U(n.publicValues);
477
389
  let i = t ? Object.keys(t.vars).length : 0;
478
390
  if (i > 0) {
479
391
  let r = Object.keys(n.publicValues).length;
@@ -485,20 +397,20 @@ __installPublicEnv(publicEnvValues)
485
397
  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 });
486
398
  }
487
399
  }
488
- return e.generateTypes && t && (e.appType === "api" ? await ft(e.root, t) : await pt(e.root, t)), {
400
+ return e.generateTypes && t && (e.appType === "api" ? await et(e.root, t) : await tt(e.root, t)), {
489
401
  resolved: n,
490
402
  contract: t
491
403
  };
492
- }, gt = (e) => {
493
- let t = oe(e.contract), n = (e.plugins ?? []).flatMap((e) => z(e.name, e.declaredEnv)), r = e.includeFramework === !1 ? [] : ae, i = /* @__PURE__ */ new Set(), a = [];
404
+ }, it = (e) => {
405
+ let t = te(e.contract), n = (e.plugins ?? []).flatMap((e) => ie(e.name, e.declaredEnv)), r = e.includeFramework === !1 ? [] : B, i = /* @__PURE__ */ new Set(), a = [];
494
406
  for (let e of [
495
407
  ...t,
496
408
  ...n,
497
409
  ...r
498
410
  ]) i.has(e.key) || (i.add(e.key), a.push(e));
499
411
  return a;
500
- }, _t = (e, t, n = (e) => process.env[e]) => {
501
- let r = gt(t).map((e) => {
412
+ }, at = (e, t, n = (e) => process.env[e]) => {
413
+ let r = it(t).map((e) => {
502
414
  let t = n(e.key) !== void 0;
503
415
  return {
504
416
  ...e,
@@ -515,13 +427,13 @@ __installPublicEnv(publicEnvValues)
515
427
  missingRequired: r.filter((e) => e.required && !e.isSet && e.default === void 0).length
516
428
  }
517
429
  };
518
- }, vt = (e, t) => de(gt({
430
+ }, ot = (e, t) => ae(it({
519
431
  ...e,
520
432
  includeFramework: !1
521
433
  }), {
522
434
  includeFramework: e.includeFramework !== !1,
523
435
  ...t ? { header: t } : {}
524
- }), yt = () => {
436
+ }), st = () => {
525
437
  let e = /* @__PURE__ */ new Map();
526
438
  return {
527
439
  get(t) {
@@ -548,7 +460,7 @@ __installPublicEnv(publicEnvValues)
548
460
  return Array.from(e.entries());
549
461
  }
550
462
  };
551
- }, K = (e) => {
463
+ }, ct = (e) => {
552
464
  if (typeof e == "number" && Number.isFinite(e) && e > 0) return e * 1e3;
553
465
  if (typeof e != "string") return null;
554
466
  let t = /^\s*(\d+)\s*(s|seconds?|m|minutes?|h|hours?|d|days?)\s*$/i.exec(e);
@@ -557,33 +469,33 @@ __installPublicEnv(publicEnvValues)
557
469
  if (!Number.isFinite(n) || n <= 0) return null;
558
470
  let r = t[2].toLowerCase();
559
471
  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;
560
- }, bt = (e, t = {}) => {
472
+ }, lt = (e, t = {}) => {
561
473
  let n = [e];
562
474
  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("|");
563
- }, xt = (e, t) => e.expiresAt > t, St = (e, t) => e.expiresAt <= t && e.servableUntil > t, Ct = T({ scope: "voltro:cli" }), wt = (e, t) => {
475
+ }, ut = (e, t) => e.expiresAt > t, dt = (e, t) => e.expiresAt <= t && e.servableUntil > t, ft = S({ scope: "voltro:cli" }), pt = (e, t) => {
564
476
  if (t?.code !== "EACCES") return "";
565
477
  if (typeof process.getuid != "function") return " — permission denied";
566
478
  try {
567
- let t = N(e);
479
+ let t = A(e);
568
480
  return ` — permission denied: the file is owned by uid ${t.uid} (mode ${(t.mode & 511).toString(8)}) and this process is uid ${process.getuid()}. A container running as root with the workspace bind-mounted writes files the host user cannot read; run it as \`--user <your-uid>:<your-gid>\`, or delete the file and let the owning user recreate it.`;
569
481
  } catch {
570
482
  return " — permission denied (and the file could not be stat-ed either)";
571
483
  }
572
- }, Tt = [], Et = (e) => {
573
- Tt.length = 0;
574
- let t = e[1] && !e[1].startsWith("-") ? e[1] : void 0, n = t ? d(t) ? t : m(process.cwd(), t) : process.cwd(), r = [], i = n;
484
+ }, mt = [], ht = (e) => {
485
+ mt.length = 0;
486
+ let t = e[1] && !e[1].startsWith("-") ? e[1] : void 0, n = t ? f(t) ? t : h(process.cwd(), t) : process.cwd(), r = [], i = n;
575
487
  for (;;) {
576
488
  r.push(i);
577
- let e = u(i);
489
+ let e = d(i);
578
490
  if (e === i) break;
579
491
  i = e;
580
492
  }
581
493
  for (let e of r) for (let t of [".env.local", ".env"]) {
582
- let n = m(e, t);
583
- if (D(n)) {
584
- Tt.push(n);
494
+ let n = h(e, t);
495
+ if (T(n)) {
496
+ mt.push(n);
585
497
  try {
586
- let e = j(n, "utf8");
498
+ let e = ee(n, "utf8");
587
499
  for (let t of e.split(/\r?\n/)) {
588
500
  let e = t.trim();
589
501
  if (e === "" || e.startsWith("#")) continue;
@@ -593,15 +505,15 @@ __installPublicEnv(publicEnvValues)
593
505
  (i.startsWith("\"") && i.endsWith("\"") || i.startsWith("'") && i.endsWith("'")) && (i = i.slice(1, -1)), process.env[r] === void 0 && (process.env[r] = i);
594
506
  }
595
507
  } catch (e) {
596
- Ct.warn(`failed to load env file (continuing)${wt(n, e)}`, { path: n }, e);
508
+ ft.warn(`failed to load env file (continuing)${pt(n, e)}`, { path: n }, e);
597
509
  }
598
510
  }
599
511
  }
600
- }, Dt = 500, Ot = (e, t, n = {}) => {
512
+ }, gt = 500, _t = (e, t, n = {}) => {
601
513
  if (e.length === 0) return () => {};
602
- let r = (e) => n.root ? p(n.root, e) : e, i = !1, a = (e) => {
514
+ let r = (e) => n.root ? m(n.root, e) : e, i = !1, a = (e) => {
603
515
  i || (i = !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(() => {
604
- let e = _e(process.execPath, [...process.execArgv, ...process.argv.slice(1)], {
516
+ let e = ue(process.execPath, [...process.execArgv, ...process.argv.slice(1)], {
605
517
  stdio: "inherit",
606
518
  env: process.env,
607
519
  cwd: n.cwd ?? process.cwd()
@@ -615,62 +527,62 @@ __installPublicEnv(publicEnvValues)
615
527
  });
616
528
  }));
617
529
  };
618
- for (let t of e) F(t, { interval: Dt }, (e, n) => {
530
+ for (let t of e) N(t, { interval: gt }, (e, n) => {
619
531
  e.mtimeMs !== n.mtimeMs && a(t);
620
532
  });
621
533
  return t.info("watching .env files for changes", {
622
534
  files: e.map(r),
623
- intervalMs: Dt
535
+ intervalMs: gt
624
536
  }), () => {
625
- for (let t of e) te(t);
537
+ for (let t of e) M(t);
626
538
  };
627
- }, q = T({ scope: "vite" }), kt = /\x1b\[[0-9;]*m/g, At = /^\s*\[?vite\]?\s*(\([a-z-]+\)\s*)?/, jt = (e) => e.replace(kt, "").replace(At, "").trim(), Mt = /proxy error/i, Nt = [
539
+ }, vt = S({ scope: "vite" }), yt = /\x1b\[[0-9;]*m/g, bt = /^\s*\[?vite\]?\s*(\([a-z-]+\)\s*)?/, xt = (e) => e.replace(yt, "").replace(bt, "").trim(), St = /proxy error/i, Ct = [
628
540
  "ECONNREFUSED",
629
541
  "ECONNRESET",
630
542
  "ECONNABORTED",
631
543
  "EPIPE",
632
544
  "ETIMEDOUT"
633
- ], Pt = (e, t = 0) => {
545
+ ], wt = (e, t = 0) => {
634
546
  if (e == null || t > 5) return !1;
635
547
  let n = e;
636
- return typeof n.code == "string" && Nt.includes(n.code) || typeof n.message == "string" && Nt.some((e) => n.message.includes(e)) || Array.isArray(n.errors) && n.errors.some((e) => Pt(e, t + 1)) ? !0 : Pt(n.cause, t + 1);
637
- }, Ft = 4e3, It = () => {
548
+ return typeof n.code == "string" && Ct.includes(n.code) || typeof n.message == "string" && Ct.some((e) => n.message.includes(e)) || Array.isArray(n.errors) && n.errors.some((e) => wt(e, t + 1)) ? !0 : wt(n.cause, t + 1);
549
+ }, Tt = 4e3, Et = () => {
638
550
  let e = /* @__PURE__ */ new Set(), t = 0, n = {
639
551
  hasWarned: !1,
640
552
  info: (e) => {
641
- let t = jt(e);
642
- t.length !== 0 && q.info(t);
553
+ let t = xt(e);
554
+ t.length !== 0 && vt.info(t);
643
555
  },
644
556
  warn: (e) => {
645
557
  n.hasWarned = !0;
646
- let t = jt(e);
647
- t.length !== 0 && q.warn(t);
558
+ let t = xt(e);
559
+ t.length !== 0 && vt.warn(t);
648
560
  },
649
561
  warnOnce: (t) => {
650
- let r = jt(t);
651
- e.has(r) || (e.add(r), n.hasWarned = !0, r.length !== 0 && q.warn(r));
562
+ let r = xt(t);
563
+ e.has(r) || (e.add(r), n.hasWarned = !0, r.length !== 0 && vt.warn(r));
652
564
  },
653
565
  error: (e, n) => {
654
- let r = jt(e), i = n?.error;
566
+ let r = xt(e), i = n?.error;
655
567
  if (r.length !== 0) {
656
- if (Mt.test(r) && Pt(i)) {
568
+ if (St.test(r) && wt(i)) {
657
569
  let e = Date.now();
658
- e - t > Ft && (t = e, q.info("waiting for api — proxy upstream not accepting connections yet (still starting?)"));
570
+ e - t > Tt && (t = e, vt.info("waiting for api — proxy upstream not accepting connections yet (still starting?)"));
659
571
  return;
660
572
  }
661
- q.error(r, {}, i);
573
+ vt.error(r, {}, i);
662
574
  }
663
575
  },
664
576
  clearScreen: () => {},
665
577
  hasErrorLogged: (e) => !1
666
578
  };
667
579
  return n;
668
- }, Lt = (e = process.env) => {
580
+ }, Dt = (e = process.env) => {
669
581
  let t = e.VOLTRO_DEV_SSR_COMPILE_CONCURRENCY;
670
582
  if (t === void 0 || t.trim() === "") return 4;
671
583
  let n = Number(t);
672
584
  return Number.isFinite(n) && n >= 1 ? Math.floor(n) : 4;
673
- }, Rt = (e) => {
585
+ }, Ot = (e) => {
674
586
  let t = Math.max(1, Math.floor(e)), n = 0, r = [], i = () => n < t ? (n++, Promise.resolve()) : new Promise((e) => r.push(e)), a = () => {
675
587
  let e = r.shift();
676
588
  e ? e() : n--;
@@ -688,8 +600,8 @@ __installPublicEnv(publicEnvValues)
688
600
  return n;
689
601
  }
690
602
  };
691
- }, zt = (e) => {
692
- let t = Rt(e.limit), n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Set();
603
+ }, kt = (e) => {
604
+ let t = Ot(e.limit), n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Set();
693
605
  return {
694
606
  load: (i, a) => {
695
607
  if (r.has(i)) return a();
@@ -719,7 +631,7 @@ __installPublicEnv(publicEnvValues)
719
631
  return r.size;
720
632
  }
721
633
  };
722
- }, Bt = (e) => {
634
+ }, At = (e) => {
723
635
  let t = [];
724
636
  for (let n of e.split("/").filter(Boolean)) n.startsWith("[[...") && n.endsWith("]]") ? t.push({
725
637
  name: n.slice(5, -2),
@@ -735,12 +647,12 @@ __installPublicEnv(publicEnvValues)
735
647
  optional: !1
736
648
  });
737
649
  return t;
738
- }, Vt = (e) => e.replace(/-([a-z0-9])/g, (e, t) => t.toUpperCase()), Ht = async (e) => {
739
- let t = m(e);
650
+ }, jt = (e) => e.replace(/-([a-z0-9])/g, (e, t) => t.toUpperCase()), Mt = async (e) => {
651
+ let t = h(e);
740
652
  for (let e = 0; e < 4; e++) {
741
- let e = f(t, "project.json");
742
- if (D(e)) try {
743
- let n = await A.readFile(e, "utf8");
653
+ let e = p(t, "project.json");
654
+ if (T(e)) try {
655
+ let n = await O.readFile(e, "utf8");
744
656
  return {
745
657
  projectDir: t,
746
658
  manifest: JSON.parse(n)
@@ -748,38 +660,38 @@ __installPublicEnv(publicEnvValues)
748
660
  } catch {
749
661
  return null;
750
662
  }
751
- let n = u(t);
663
+ let n = d(t);
752
664
  if (n === t) break;
753
665
  t = n;
754
666
  }
755
667
  return null;
756
- }, Ut = async (e) => {
757
- let t = await Ht(e);
668
+ }, Nt = async (e) => {
669
+ let t = await Mt(e);
758
670
  if (!t) return [];
759
- let { projectDir: n, manifest: r } = t, i = l(e), a = r.apps ?? {}, o = [];
671
+ let { projectDir: n, manifest: r } = t, i = u(e), a = r.apps ?? {}, o = [];
760
672
  for (let [e, t] of Object.entries(a)) {
761
673
  if (e === i || t.kind !== "web" || typeof t.port != "number") continue;
762
- let r = f(f(n, t.path ?? e), "src", "pages");
763
- if (!D(r)) continue;
674
+ let r = p(p(n, t.path ?? e), "src", "pages");
675
+ if (!T(r)) continue;
764
676
  let a;
765
677
  try {
766
- let { pages: e } = await Q(r);
678
+ let { pages: e } = await $(r);
767
679
  a = e.map((e) => ({
768
680
  pattern: e.pattern,
769
- params: Bt(e.pattern)
681
+ params: At(e.pattern)
770
682
  }));
771
683
  } catch {
772
684
  continue;
773
685
  }
774
686
  o.push({
775
- key: Vt(e),
687
+ key: jt(e),
776
688
  origin: `http://localhost:${t.port}`,
777
689
  ...typeof t.origin == "string" && t.origin.length > 0 ? { prodOrigin: t.origin } : {},
778
690
  routes: a
779
691
  });
780
692
  }
781
693
  return o;
782
- }, Wt = (e) => {
694
+ }, Pt = (e) => {
783
695
  if (e.params.length === 0) return `'${e.pattern}'`;
784
696
  let t = e.pattern;
785
697
  for (let n of e.params) {
@@ -787,21 +699,21 @@ __installPublicEnv(publicEnvValues)
787
699
  t = t.replace(e, r);
788
700
  }
789
701
  return "`" + t + "`";
790
- }, Gt = (e) => e.params.length === 0 ? "EmptyParams" : `{ ${e.params.map((e) => {
702
+ }, Ft = (e) => e.params.length === 0 ? "EmptyParams" : `{ ${e.params.map((e) => {
791
703
  let t = "string";
792
704
  return e.optional ? `readonly ${e.name}?: ${t}` : `readonly ${e.name}: ${t}`;
793
- }).join("; ")} }`, Kt = (e, t, n) => {
794
- let r = Gt(e), i = Wt(e), a = t ? "VoltroExternalUrl" : "VoltroRouteUrl", o = t && n ? `${n} + ` : "";
705
+ }).join("; ")} }`, It = (e, t, n) => {
706
+ let r = Ft(e), i = Pt(e), a = t ? "VoltroExternalUrl" : "VoltroRouteUrl", o = t && n ? `${n} + ` : "";
795
707
  return e.params.length === 0 ? `() => (${o}${i}) as ${a}` : `({ ${e.params.map((e) => e.name).join(", ")} }: ${r}) => (${o}${i}) as ${a}`;
796
- }, qt = (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) => {
708
+ }, Lt = (e) => `{\n${[...e].sort((e, t) => e.pattern.localeCompare(t.pattern)).map((e) => ` ${JSON.stringify(e.pattern)}: ${It(e, !1)},`).join("\n")}\n}`, Rt = (e, t) => {
797
709
  if (e.routes.length === 0) return ` ${e.key}: {} as Record<string, never>,`;
798
- 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)},`);
710
+ 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)}: ${It(e, !0, i)},`);
799
711
  return ` ${e.key}: {\n${a.join("\n")}\n },`;
800
- }, Yt = async (e) => {
712
+ }, zt = async (e) => {
801
713
  let t = e.pages.map((e) => ({
802
714
  pattern: e.pattern,
803
- params: Bt(e.pattern)
804
- })), n = await Ut(e.appRoot), r = [
715
+ params: At(e.pattern)
716
+ })), n = await Nt(e.appRoot), r = [
805
717
  "// THIS FILE IS GENERATED — DO NOT EDIT BY HAND.",
806
718
  "// Re-emitted by `voltro dev` whenever `src/pages/**` changes.",
807
719
  "// Type-safe route builders consumed by <Link to={...}>.",
@@ -810,20 +722,50 @@ __installPublicEnv(publicEnvValues)
810
722
  "",
811
723
  "type EmptyParams = Record<string, never>",
812
724
  ""
813
- ].join("\n"), i = e.mode ?? "dev", a = `${r}\n${`export const routes = ${qt(t)} as const\n`}\n${n.length === 0 ? "export const siblingApps = {} as Record<string, never>\n" : `export const siblingApps = {\n${n.map((e) => Jt(e, i)).join("\n")}\n} as const\n`}`, o = f(e.appRoot, ".framework", "routes.generated.ts");
814
- await A.mkdir(u(o), { recursive: !0 });
725
+ ].join("\n"), i = e.mode ?? "dev", a = `${r}\n${`export const routes = ${Lt(t)} as const\n`}\n${n.length === 0 ? "export const siblingApps = {} as Record<string, never>\n" : `export const siblingApps = {\n${n.map((e) => Rt(e, i)).join("\n")}\n} as const\n`}`, o = p(e.appRoot, ".framework", "routes.generated.ts");
726
+ await O.mkdir(d(o), { recursive: !0 });
815
727
  let s = null;
816
728
  try {
817
- s = await A.readFile(o, "utf8");
729
+ s = await O.readFile(o, "utf8");
818
730
  } catch {}
819
731
  return s === a ? {
820
732
  path: o,
821
733
  wrote: !1
822
- } : (await A.writeFile(o, a, "utf8"), {
734
+ } : (await O.writeFile(o, a, "utf8"), {
823
735
  path: o,
824
736
  wrote: !0
825
737
  });
826
- }, Xt = 256, Zt = (e = Xt) => {
738
+ }, Bt = (e) => {
739
+ if (e === "" || e === "/") return "/";
740
+ let t = e.startsWith("/") ? e : `/${e}`;
741
+ return t.endsWith("/") ? t.slice(0, -1) : t;
742
+ }, Vt = (e, t) => {
743
+ let n = e.endsWith("/") ? e.slice(0, -1) : e, r = Bt(t);
744
+ return r === "/" ? `${n}/` : `${n}${r}`;
745
+ }, Ht = (e, t, n) => {
746
+ let r = Bt(e);
747
+ return t === n ? r : r === "/" ? `/${t}` : `/${t}${r}`;
748
+ }, Ut = (e) => e.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;"), Wt = (e) => {
749
+ let { siteUrl: t, entries: n } = e, r = e.locales && e.locales.length > 1 ? e.locales : void 0, i = e.defaultLocale ?? r?.[0] ?? "en", a = r !== void 0, o = /* @__PURE__ */ new Map(), s = (e) => {
750
+ if (!r) return "";
751
+ let n = r.map((n) => ` <xhtml:link rel="alternate" hreflang="${Ut(n)}" href="${Ut(Vt(t, Ht(e, n, i)))}" />`);
752
+ return n.push(` <xhtml:link rel="alternate" hreflang="x-default" href="${Ut(Vt(t, Ht(e, i, i)))}" />`), `\n${n.join("\n")}`;
753
+ };
754
+ for (let e of n) {
755
+ let n = r ?? [i];
756
+ for (let r of n) {
757
+ let n = Vt(t, Ht(e.path, r, i)), a = e.lastmod ? `\n <lastmod>${Ut(e.lastmod)}</lastmod>` : "";
758
+ o.set(n, ` <url>\n <loc>${Ut(n)}</loc>${a}${s(e.path)}\n </url>`);
759
+ }
760
+ }
761
+ let c = [...o.keys()].sort().map((e) => o.get(e)).join("\n");
762
+ return `<?xml version="1.0" encoding="UTF-8"?>\n<urlset${a ? " xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\" xmlns:xhtml=\"http://www.w3.org/1999/xhtml\"" : " xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\""}>\n${c}\n</urlset>\n`;
763
+ }, Gt = (e) => {
764
+ if (!e.indexable) return "User-agent: *\nDisallow: /\n";
765
+ let t = ["User-agent: *", "Allow: /"];
766
+ for (let n of e.disallow ?? []) t.push(`Disallow: ${Bt(n)}`);
767
+ return e.sitemapUrl && t.push("", `Sitemap: ${e.sitemapUrl}`), `${t.join("\n")}\n`;
768
+ }, Kt = 256, qt = (e = Kt) => {
827
769
  let t = [], n = /* @__PURE__ */ new Set();
828
770
  return {
829
771
  emit(r, i) {
@@ -846,27 +788,27 @@ __installPublicEnv(publicEnvValues)
846
788
  return t.slice();
847
789
  }
848
790
  };
849
- }, Qt = (e) => `event: ${e.channel}\ndata: ${JSON.stringify(e)}\n\n`, $t = () => `: keep-alive ${Date.now()}\n\n`, en = {
791
+ }, Jt = (e) => `event: ${e.channel}\ndata: ${JSON.stringify(e)}\n\n`, Yt = () => `: keep-alive ${Date.now()}\n\n`, Xt = {
850
792
  trace: 0,
851
793
  debug: 1,
852
794
  info: 2,
853
795
  warn: 3,
854
796
  error: 4,
855
797
  fatal: 5
856
- }, tn = 2e3, nn = 200, rn = class {
798
+ }, Zt = 2e3, Qt = 200, $t = class {
857
799
  capacity;
858
800
  buffer = [];
859
- constructor(e = tn) {
801
+ constructor(e = Zt) {
860
802
  this.capacity = e;
861
803
  }
862
804
  append(e) {
863
805
  this.buffer.push(e), this.buffer.length > this.capacity && this.buffer.shift();
864
806
  }
865
807
  query(e = {}) {
866
- let t = e.since ?? 0, n = e.until ?? Date.now(), r = Math.min(e.max ?? nn, this.capacity), i = e.minLevel === void 0 ? en.trace : en[e.minLevel], a = e.scope?.toLowerCase(), o = e.source, s = e.filter?.toLowerCase(), c = e.traceId, l = [];
808
+ let t = e.since ?? 0, n = e.until ?? Date.now(), r = Math.min(e.max ?? Qt, this.capacity), i = e.minLevel === void 0 ? Xt.trace : Xt[e.minLevel], a = e.scope?.toLowerCase(), o = e.source, s = e.filter?.toLowerCase(), c = e.traceId, l = [];
867
809
  for (let e = this.buffer.length - 1; e >= 0 && l.length < r; e--) {
868
810
  let r = this.buffer[e];
869
- r.ts < t || r.ts > n || en[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);
811
+ r.ts < t || r.ts > n || Xt[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);
870
812
  }
871
813
  return l.reverse();
872
814
  }
@@ -879,7 +821,7 @@ __installPublicEnv(publicEnvValues)
879
821
  clear() {
880
822
  this.buffer = [];
881
823
  }
882
- }, an = null, on = () => (an === null && (an = new rn()), an), sn = (e) => {
824
+ }, en = null, tn = () => (en === null && (en = new $t()), en), nn = (e) => {
883
825
  if (typeof e == "string") return e;
884
826
  if (e instanceof Error) return e.message;
885
827
  try {
@@ -887,18 +829,18 @@ __installPublicEnv(publicEnvValues)
887
829
  } catch {
888
830
  return String(e);
889
831
  }
890
- }, cn = (e) => {
832
+ }, rn = (e) => {
891
833
  let t = {
892
834
  log: console.log.bind(console),
893
835
  info: console.info.bind(console),
894
836
  warn: console.warn.bind(console),
895
837
  error: console.error.bind(console),
896
838
  debug: console.debug.bind(console)
897
- }, n = on(), r = !1, i = (i) => (...a) => {
839
+ }, n = tn(), r = !1, i = (i) => (...a) => {
898
840
  if (t[i](...a), !r) {
899
841
  r = !0;
900
842
  try {
901
- let t = a.length > 0 ? sn(a[0]) : "", r = t.length > 500 ? t.slice(0, 500) + "…" : t, o = I();
843
+ let t = a.length > 0 ? nn(a[0]) : "", r = t.length > 500 ? t.slice(0, 500) + "…" : t, o = F();
902
844
  e.emit("log", {
903
845
  level: i,
904
846
  message: r,
@@ -925,7 +867,7 @@ __installPublicEnv(publicEnvValues)
925
867
  }
926
868
  };
927
869
  console.log = i("log"), console.info = i("info"), console.warn = i("warn"), console.error = i("error"), console.debug = i("debug");
928
- let a = w((t) => {
870
+ let a = x((t) => {
929
871
  if (!r) {
930
872
  r = !0;
931
873
  try {
@@ -936,7 +878,7 @@ __installPublicEnv(publicEnvValues)
936
878
  argsCount: 1,
937
879
  ...t.scope === void 0 ? {} : { scope: t.scope }
938
880
  });
939
- let a = I(), o = a !== void 0 && t.fields.traceId === void 0 ? {
881
+ let a = F(), o = a !== void 0 && t.fields.traceId === void 0 ? {
940
882
  ...t.fields,
941
883
  traceId: a.traceId
942
884
  } : t.fields;
@@ -956,24 +898,24 @@ __installPublicEnv(publicEnvValues)
956
898
  return () => {
957
899
  console.log = t.log, console.info = t.info, console.warn = t.warn, console.error = t.error, console.debug = t.debug, a();
958
900
  };
959
- }, ln = 2e3, un = 8, dn = 1e3, fn = 200, J = (e, t) => e.length > t ? `${e.slice(0, t)}…` : e, pn = (e) => {
901
+ }, an = 2e3, on = 8, sn = 1e3, cn = 200, Y = (e, t) => e.length > t ? `${e.slice(0, t)}…` : e, ln = (e) => {
960
902
  switch (e) {
961
903
  case "error": return "error";
962
904
  case "warn": return "warn";
963
905
  case "debug": return "debug";
964
906
  default: return "info";
965
907
  }
966
- }, mn = T({ scope: "client" }), hn = (e, t) => {
908
+ }, un = S({ scope: "client" }), dn = (e, t) => {
967
909
  let n;
968
910
  try {
969
911
  n = JSON.parse(e);
970
912
  } catch {
971
- return gn(400, { error: "invalid JSON body" });
913
+ return fn(400, { error: "invalid JSON body" });
972
914
  }
973
- if (typeof n != "object" || !n) return gn(400, { error: "body must be a JSON object" });
915
+ if (typeof n != "object" || !n) return fn(400, { error: "body must be a JSON object" });
974
916
  let r = n;
975
- if (!Array.isArray(r.entries)) return gn(400, { error: "entries must be an array" });
976
- let i = typeof r.app == "string" ? J(r.app, 120) : void 0, a = typeof r.page == "string" ? J(r.page, 200) : void 0, o = typeof r.ua == "string" ? J(r.ua, 200) : void 0, s = r.entries.slice(0, fn), c = 0;
917
+ if (!Array.isArray(r.entries)) return fn(400, { error: "entries must be an array" });
918
+ 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, cn), c = 0;
977
919
  for (let e of s) {
978
920
  if (typeof e != "object" || !e) continue;
979
921
  let n = e;
@@ -984,7 +926,7 @@ __installPublicEnv(publicEnvValues)
984
926
  "warn",
985
927
  "error",
986
928
  "debug"
987
- ].includes(n.level) ? n.level : "log", s = typeof n.ts == "number" && Number.isFinite(n.ts) ? n.ts : Date.now(), l = J(n.message, ln), u = Array.isArray(n.args) ? n.args.slice(0, un).filter((e) => typeof e == "string").map((e) => J(e, dn)) : void 0, d = typeof n.stack == "string" ? J(n.stack, ln) : void 0;
929
+ ].includes(n.level) ? n.level : "log", s = typeof n.ts == "number" && Number.isFinite(n.ts) ? n.ts : Date.now(), l = Y(n.message, an), u = Array.isArray(n.args) ? n.args.slice(0, on).filter((e) => typeof e == "string").map((e) => Y(e, sn)) : void 0, d = typeof n.stack == "string" ? Y(n.stack, an) : void 0;
988
930
  t.emit("clientLog", {
989
931
  ts: s,
990
932
  level: r,
@@ -999,41 +941,41 @@ __installPublicEnv(publicEnvValues)
999
941
  ...i === void 0 ? {} : { app: i },
1000
942
  ...a === void 0 ? {} : { page: a },
1001
943
  ...u !== void 0 && u.length > 0 ? { args: u } : {}
1002
- }, p = pn(r);
1003
- (p === "error" || p === "warn") && d !== void 0 ? mn[p](l, f, { stack: d }) : mn[p](l, {
944
+ }, p = ln(r);
945
+ (p === "error" || p === "warn") && d !== void 0 ? un[p](l, f, { stack: d }) : un[p](l, {
1004
946
  ...f,
1005
947
  ...d === void 0 ? {} : { stack: d }
1006
948
  }), c++;
1007
949
  }
1008
- return gn(202, {
950
+ return fn(202, {
1009
951
  accepted: c,
1010
952
  dropped: r.entries.length - c
1011
953
  });
1012
- }, gn = (e, t) => ({
954
+ }, fn = (e, t) => ({
1013
955
  status: e,
1014
956
  contentType: "application/json; charset=utf-8",
1015
957
  body: JSON.stringify(t)
1016
- }), _n = "/_voltro/inspect/clientLog", vn = [
958
+ }), pn = "/_voltro/inspect/clientLog", mn = [
1017
959
  "trace",
1018
960
  "debug",
1019
961
  "info",
1020
962
  "warn",
1021
963
  "error",
1022
964
  "fatal"
1023
- ], yn = {
965
+ ], hn = {
1024
966
  trace: "TRACE",
1025
967
  debug: "DEBUG",
1026
968
  info: "INFO ",
1027
969
  warn: "WARN ",
1028
970
  error: "ERROR",
1029
971
  fatal: "FATAL"
1030
- }, bn = (e) => vn.includes(e), xn = (e, t, n = {}) => {
972
+ }, gn = (e) => mn.includes(e), _n = (e, t, n = {}) => {
1031
973
  if (i()) return {
1032
974
  status: 503,
1033
975
  contentType: "application/json",
1034
976
  body: JSON.stringify({ error: "inspect disabled (VOLTRO_INSPECT=off)" })
1035
977
  };
1036
- let r = o(n, "GET");
978
+ let r = s(n, "GET");
1037
979
  if (!r.ok) return {
1038
980
  status: 401,
1039
981
  contentType: "application/json",
@@ -1042,36 +984,36 @@ __installPublicEnv(publicEnvValues)
1042
984
  reason: r.reason
1043
985
  })
1044
986
  };
1045
- let a = e.indexOf("?"), s = a === -1 ? new URLSearchParams() : new URLSearchParams(e.slice(a + 1)), c = {}, l = s.get("since");
987
+ let a = e.indexOf("?"), o = a === -1 ? new URLSearchParams() : new URLSearchParams(e.slice(a + 1)), c = {}, l = o.get("since");
1046
988
  if (l !== null) {
1047
989
  let e = Number(l);
1048
990
  Number.isFinite(e) && (c.since = e);
1049
991
  }
1050
- let u = s.get("until");
992
+ let u = o.get("until");
1051
993
  if (u !== null) {
1052
994
  let e = Number(u);
1053
995
  Number.isFinite(e) && (c.until = e);
1054
996
  }
1055
- let d = s.get("max");
997
+ let d = o.get("max");
1056
998
  if (d !== null) {
1057
999
  let e = Number(d);
1058
1000
  Number.isFinite(e) && e > 0 && (c.max = Math.floor(e));
1059
1001
  }
1060
- let f = s.get("level");
1061
- f !== null && bn(f) && (c.minLevel = f);
1062
- let p = s.get("source");
1002
+ let f = o.get("level");
1003
+ f !== null && gn(f) && (c.minLevel = f);
1004
+ let p = o.get("source");
1063
1005
  (p === "server" || p === "client") && (c.source = p);
1064
- let m = s.get("scope");
1006
+ let m = o.get("scope");
1065
1007
  m !== null && m.length > 0 && (c.scope = m);
1066
- let h = s.get("filter");
1008
+ let h = o.get("filter");
1067
1009
  h !== null && h.length > 0 && (c.filter = h);
1068
- let g = s.get("trace");
1010
+ let g = o.get("trace");
1069
1011
  g !== null && g.length > 0 && (c.traceId = g);
1070
1012
  let _ = t.query(c);
1071
- if ((s.get("format") ?? "json") === "text") return {
1013
+ if ((o.get("format") ?? "json") === "text") return {
1072
1014
  status: 200,
1073
1015
  contentType: "text/plain; charset=utf-8",
1074
- body: _.map(Sn).join("\n") + (_.length > 0 ? "\n" : "")
1016
+ body: _.map(vn).join("\n") + (_.length > 0 ? "\n" : "")
1075
1017
  };
1076
1018
  let v = {
1077
1019
  capturedAt: Date.now(),
@@ -1085,40 +1027,40 @@ __installPublicEnv(publicEnvValues)
1085
1027
  contentType: "application/json; charset=utf-8",
1086
1028
  body: JSON.stringify(v)
1087
1029
  };
1088
- }, Sn = (e) => {
1089
- 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 = wn(e.fields);
1090
- return `${n}:${r}:${i}.${a} ${yn[e.level]} ${o} ${e.message}${s}`;
1091
- }, Cn = 80, wn = (e) => {
1030
+ }, vn = (e) => {
1031
+ 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 = bn(e.fields);
1032
+ return `${n}:${r}:${i}.${a} ${hn[e.level]} ${o} ${e.message}${s}`;
1033
+ }, yn = 80, bn = (e) => {
1092
1034
  let t = Object.entries(e);
1093
1035
  if (t.length === 0) return "";
1094
1036
  let n = [];
1095
1037
  for (let [e, r] of t) {
1096
1038
  if (r === void 0) continue;
1097
- let t = Tn(r);
1039
+ let t = xn(r);
1098
1040
  n.push(`${e}=${t}`);
1099
1041
  }
1100
1042
  return n.length > 0 ? " " + n.join(" ") : "";
1101
- }, Tn = (e) => {
1043
+ }, xn = (e) => {
1102
1044
  if (typeof e == "string") {
1103
- let t = e.length > Cn ? e.slice(0, Cn) + "…" : e;
1045
+ let t = e.length > yn ? e.slice(0, yn) + "…" : e;
1104
1046
  return /[\s=]/.test(t) ? `"${t.replace(/"/g, "\\\"")}"` : t;
1105
1047
  }
1106
1048
  if (e === null) return "null";
1107
1049
  if (typeof e == "number" || typeof e == "boolean") return String(e);
1108
1050
  try {
1109
1051
  let t = JSON.stringify(e);
1110
- return t.length > Cn ? t.slice(0, Cn) + "…" : t;
1052
+ return t.length > yn ? t.slice(0, yn) + "…" : t;
1111
1053
  } catch {
1112
1054
  return "[unserialisable]";
1113
1055
  }
1114
- }, En = "/_voltro/inspect/logs", Dn = (e, t, n) => {
1056
+ }, Sn = "/_voltro/inspect/logs", Cn = (e, t, n) => {
1115
1057
  if (t.headers.authorization !== void 0) return !1;
1116
1058
  let { token: r } = n;
1117
1059
  if (r === void 0 || r === "" || !n.isLoopback(n.target)) return !1;
1118
1060
  e.setHeader("authorization", `Bearer ${r}`);
1119
1061
  let i = n.writeToken;
1120
1062
  return i !== void 0 && i !== "" && t.headers["x-voltro-inspect-write"] === void 0 && e.setHeader("x-voltro-inspect-write", i), !0;
1121
- }, On = [{
1063
+ }, wn = [{
1122
1064
  match: (e) => typeof e == "string" && e.startsWith("[BABEL] Note: The code generator has deoptimised"),
1123
1065
  handle: (e, t) => {
1124
1066
  let n = e[0], r = n.match(/deoptimised the styling of (.+?) as it exceeds the max of (\d+\w*B)\.?/);
@@ -1130,13 +1072,13 @@ __installPublicEnv(publicEnvValues)
1130
1072
  });
1131
1073
  } else t.info(n);
1132
1074
  }
1133
- }], kn = () => {
1075
+ }], Tn = () => {
1134
1076
  let e = {
1135
1077
  warn: console.warn.bind(console),
1136
1078
  error: console.error.bind(console)
1137
- }, t = T({ scope: "babel" }), n = !1, r = (r) => (...i) => {
1079
+ }, t = S({ scope: "babel" }), n = !1, r = (r) => (...i) => {
1138
1080
  if (!n) {
1139
- for (let e of On) if (e.match(i[0])) {
1081
+ for (let e of wn) if (e.match(i[0])) {
1140
1082
  n = !0;
1141
1083
  try {
1142
1084
  e.handle(i, t);
@@ -1151,7 +1093,7 @@ __installPublicEnv(publicEnvValues)
1151
1093
  return console.warn = r("warn"), console.error = r("error"), () => {
1152
1094
  console.warn = e.warn, console.error = e.error;
1153
1095
  };
1154
- }, An = {
1096
+ }, En = {
1155
1097
  loader: "it runs on the server, and the router caches its result per route + params",
1156
1098
  renderMode: "it picks the server render strategy",
1157
1099
  dynamic: "it picks the server render strategy",
@@ -1162,7 +1104,7 @@ __installPublicEnv(publicEnvValues)
1162
1104
  cacheInvalidatesOn: "it wires this page into the ISR cache invalidator",
1163
1105
  interactive: "it decides how much client JS the server ships",
1164
1106
  tenantAware: "it is part of the server-side cache key"
1165
- }, jn = Object.keys(An), Mn = (t) => e.test(t), Nn = (e) => e.replace(/page\.tsx$/, "page.test.tsx"), Pn = "virtual:voltro-route-refresh", Fn = `\0${Pn}`, In = /(?:^|&)(raw|url|inline|worker|sharedworker|direct)(?:&|=|$)/, Ln = () => `
1107
+ }, Dn = Object.keys(En), On = (e) => t.test(e), kn = (e) => e.replace(/page\.tsx$/, "page.test.tsx"), An = "virtual:voltro-route-refresh", jn = `\0${An}`, Mn = /(?:^|&)(raw|url|inline|worker|sharedworker|direct)(?:&|=|$)/, Nn = () => `
1166
1108
  // GENERATED by @voltro/cli — the \`voltro dev\` route Fast Refresh runtime.
1167
1109
 
1168
1110
  /** Mirrors react-refresh's own \`isLikelyComponentType\` closely enough for the
@@ -1191,11 +1133,11 @@ const stableForm = (value) => {
1191
1133
  * readers (\`build.ts\` prerender, \`webDev.ts\` dev SSR, \`start.ts\`). A change to
1192
1134
  * one of THESE cannot be hot-applied: the server already ran with the old
1193
1135
  * value. Everything else a page exports is plain client-side data. */
1194
- const serverRelevantExports = ${JSON.stringify(jn)}
1136
+ const serverRelevantExports = ${JSON.stringify(Dn)}
1195
1137
 
1196
1138
  /** Name → the server step that already consumed it, so the reload message can
1197
1139
  * say WHY rather than just WHAT. Injected from the same single source. */
1198
- const serverExportEffect = ${JSON.stringify(An)}
1140
+ const serverExportEffect = ${JSON.stringify(En)}
1199
1141
 
1200
1142
  /** The reason \`name\` forces a reload, for the console line. */
1201
1143
  export const serverEffectOf = (name) =>
@@ -1238,7 +1180,7 @@ export const routeUpdateNeedsReload = (prevExports, nextExports) => {
1238
1180
  const previousHook = globalThis.__getReactRefreshIgnoredExports
1239
1181
  globalThis.__getReactRefreshIgnoredExports = (args) =>
1240
1182
  ignoredExports.get(args.id) ?? previousHook?.(args) ?? []
1241
- `, Rn = (e) => `
1183
+ `, Pn = (e) => `
1242
1184
  if (import.meta.hot) {
1243
1185
  // Self-import to read our OWN exports, the same technique the react plugin
1244
1186
  // uses; the namespace is only complete after evaluation, hence the promise.
@@ -1265,57 +1207,57 @@ import {
1265
1207
  registerRouteModule as __voltro_registerRouteModule,
1266
1208
  routeUpdateNeedsReload as __voltro_routeUpdateNeedsReload,
1267
1209
  serverEffectOf as __voltro_serverEffect,
1268
- } from '${Pn}'
1269
- `, zn = (e) => e.replace(/\\/g, "/"), Bn = (e, r) => {
1270
- let [i = "", a] = zn(e).split("?");
1271
- if (!i.endsWith(".tsx") || a !== void 0 && In.test(a)) return !1;
1272
- let o = zn(r).replace(/\/$/, "");
1273
- return i.startsWith(`${o}/`) ? t.test(i) || n.has(i.slice(i.lastIndexOf("/") + 1)) : !1;
1274
- }, Vn = (e, t, n) => Bn(t, n) ? `${e}${Rn(zn(t).split("?")[0] ?? t)}` : null, Hn = (e) => ({
1210
+ } from '${An}'
1211
+ `, Fn = (e) => e.replace(/\\/g, "/"), In = (e, t) => {
1212
+ let [i = "", a] = Fn(e).split("?");
1213
+ if (!i.endsWith(".tsx") || a !== void 0 && Mn.test(a)) return !1;
1214
+ let o = Fn(t).replace(/\/$/, "");
1215
+ return i.startsWith(`${o}/`) ? r.test(i) || n.has(i.slice(i.lastIndexOf("/") + 1)) : !1;
1216
+ }, Ln = (e, t, n) => In(t, n) ? `${e}${Pn(Fn(t).split("?")[0] ?? t)}` : null, Rn = (e) => ({
1275
1217
  name: "voltro:route-fast-refresh",
1276
1218
  enforce: "pre",
1277
- resolveId: (e) => e === "virtual:voltro-route-refresh" ? Fn : void 0,
1278
- load: (e) => e === Fn ? Ln() : void 0,
1219
+ resolveId: (e) => e === "virtual:voltro-route-refresh" ? jn : void 0,
1220
+ load: (e) => e === jn ? Nn() : void 0,
1279
1221
  transform: (t, n, r) => {
1280
1222
  if (r?.ssr === !0) return null;
1281
- let i = Vn(t, n, e);
1223
+ let i = Ln(t, n, e);
1282
1224
  return i === null ? null : {
1283
1225
  code: i,
1284
1226
  map: null
1285
1227
  };
1286
1228
  }
1287
- }), Un = [
1229
+ }), zn = [
1288
1230
  "static",
1289
1231
  "spa",
1290
1232
  "ssr",
1291
1233
  "isr"
1292
- ], Wn = (e) => typeof e == "string" && Un.includes(e), Gn = Un.map((e) => `'${e}'`).join(" | "), Kn = (e, t) => `[voltro] ${e}: unknown renderMode '${t}'.\n Valid values: ${Gn}.${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)." : ""}`, qn = class extends Error {
1234
+ ], Bn = (e) => typeof e == "string" && zn.includes(e), Vn = zn.map((e) => `'${e}'`).join(" | "), Hn = (e, t) => `[voltro] ${e}: unknown renderMode '${t}'.\n Valid values: ${Vn}.${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)." : ""}`, Un = class extends Error {
1293
1235
  page;
1294
1236
  value;
1295
1237
  name = "InvalidRenderModeError";
1296
1238
  constructor(e, t) {
1297
- super(Kn(e, t)), this.page = e, this.value = t;
1239
+ super(Hn(e, t)), this.page = e, this.value = t;
1298
1240
  }
1299
- }, Jn = (e, t = "<page>") => {
1241
+ }, Wn = (e, t = "<page>") => {
1300
1242
  if (e.renderMode !== void 0 && e.renderMode !== null) {
1301
- if (!Wn(e.renderMode)) throw new qn(t, String(e.renderMode));
1243
+ if (!Bn(e.renderMode)) throw new Un(t, String(e.renderMode));
1302
1244
  return e.renderMode;
1303
1245
  }
1304
1246
  return e.dynamic === "force-dynamic" ? "ssr" : (e.dynamic, "static");
1305
- }, Yn = (e, t = "<page>") => ({
1306
- renderMode: Jn(e, t),
1247
+ }, Gn = (e, t = "<page>") => ({
1248
+ renderMode: Wn(e, t),
1307
1249
  tenantAware: e.tenantAware === !0,
1308
- revalidateMs: K(e.revalidate),
1309
- staleWhileRevalidateMs: K(e.staleWhileRevalidate) ?? 0,
1250
+ revalidateMs: ct(e.revalidate),
1251
+ staleWhileRevalidateMs: ct(e.staleWhileRevalidate) ?? 0,
1310
1252
  cacheInvalidatesOn: Array.isArray(e.cacheInvalidatesOn) ? e.cacheInvalidatesOn : [],
1311
1253
  interactive: e.interactive ?? "full",
1312
1254
  hasLoader: typeof e.loader == "function",
1313
1255
  hasMeta: e.meta != null,
1314
1256
  hasGetStaticPaths: typeof e.getStaticPaths == "function"
1315
- }), Xn = /export\s+const\s+renderMode\s*(?::[^=]+)?=\s*['"]([^'"]*)['"]/, Zn = (e) => Xn.exec(e)?.[1] ?? null, Qn = /export\s*\{([^}]*)\}\s*from\s*['"]([^'"]+)['"]/g, $n = (e) => {
1316
- Qn.lastIndex = 0;
1257
+ }), Kn = /export\s+const\s+renderMode\s*(?::[^=]+)?=\s*['"]([^'"]*)['"]/, qn = (e) => Kn.exec(e)?.[1] ?? null, Jn = /export\s*\{([^}]*)\}\s*from\s*['"]([^'"]+)['"]/g, Yn = (e) => {
1258
+ Jn.lastIndex = 0;
1317
1259
  let t;
1318
- for (; (t = Qn.exec(e)) !== null;) {
1260
+ for (; (t = Jn.exec(e)) !== null;) {
1319
1261
  let e = t[2];
1320
1262
  if (e.startsWith(".")) for (let n of t[1].split(",")) {
1321
1263
  let t = n.lastIndexOf(" as ");
@@ -1323,50 +1265,50 @@ import {
1323
1265
  }
1324
1266
  }
1325
1267
  return null;
1326
- }, er = /export\s*\{([^}]*)\}/g, tr = (e) => {
1268
+ }, Xn = /export\s*\{([^}]*)\}/g, Zn = (e) => {
1327
1269
  if (/export\s+default\b/.test(e)) return !0;
1328
- er.lastIndex = 0;
1270
+ Xn.lastIndex = 0;
1329
1271
  let t;
1330
- for (; (t = er.exec(e)) !== null;) for (let e of t[1].split(",")) {
1272
+ for (; (t = Xn.exec(e)) !== null;) for (let e of t[1].split(",")) {
1331
1273
  let t = e.lastIndexOf(" as ");
1332
1274
  if ((t === -1 ? e : e.slice(t + 4)).trim() === "default") return !0;
1333
1275
  }
1334
1276
  return !1;
1335
- }, nr = async (e, t) => {
1277
+ }, Qn = async (e, t) => {
1336
1278
  let n = (await Promise.all(t.map(async (t) => {
1337
1279
  let n;
1338
1280
  try {
1339
- n = await he(f(e, t.file), "utf8");
1281
+ n = await ce(p(e, t.file), "utf8");
1340
1282
  } catch {
1341
1283
  return null;
1342
1284
  }
1343
- let r = Zn(n);
1344
- return r !== null && !Wn(r) ? Kn(f("src", "pages", t.file), r) : tr(n) ? null : `${f("src", "pages", t.file)} is a route (a \`page.tsx\` under src/pages/) but exports no default.\n\n A page's default export IS its component — the router has nothing to render without it,\n and the failure would otherwise surface only in \`voltro build\`'s prerender as\n "SSR received a descriptor with no Component", long after the file was written.\n\n Fix: \`export default function Page() { … }\`, or re-export another page's component\n (\`export { default } from '../page'\`). If this file is NOT a route, rename it —\n only the reserved names route, and anything else under src/pages/ is ordinary code\n that may live beside the page that uses it.`;
1285
+ let r = qn(n);
1286
+ return r !== null && !Bn(r) ? Hn(p("src", "pages", t.file), r) : Zn(n) ? null : `${p("src", "pages", t.file)} is a route (a \`page.tsx\` under src/pages/) but exports no default.\n\n A page's default export IS its component — the router has nothing to render without it,\n and the failure would otherwise surface only in \`voltro build\`'s prerender as\n "SSR received a descriptor with no Component", long after the file was written.\n\n Fix: \`export default function Page() { … }\`, or re-export another page's component\n (\`export { default } from '../page'\`). If this file is NOT a route, rename it —\n only the reserved names route, and anything else under src/pages/ is ordinary code\n that may live beside the page that uses it.`;
1345
1287
  }))).filter((e) => e !== null);
1346
1288
  if (n.length !== 0) throw Error(n.join("\n\n"));
1347
- }, Y = f(re(), ".voltro", "logs"), rr = () => {
1289
+ }, X = p(R(), ".voltro", "logs"), $n = () => {
1348
1290
  let e = Number(process.env.VOLTRO_LOG_FILE_TTL_MS);
1349
1291
  return Number.isFinite(e) && e > 0 ? e : 3600 * 1e3;
1350
- }, ir = !1, ar = () => {
1351
- if (ir) return;
1352
- ir = !0;
1353
- let e = Date.now() - rr(), t = [];
1292
+ }, er = !1, tr = () => {
1293
+ if (er) return;
1294
+ er = !0;
1295
+ let e = Date.now() - $n(), t = [];
1354
1296
  try {
1355
- t = M(Y);
1297
+ t = k(X);
1356
1298
  } catch {
1357
1299
  return;
1358
1300
  }
1359
1301
  for (let n of t) {
1360
1302
  if (!n.endsWith(".log")) continue;
1361
- let t = f(Y, n);
1303
+ let t = p(X, n);
1362
1304
  try {
1363
- N(t).mtimeMs < e && P(t);
1305
+ A(t).mtimeMs < e && j(t);
1364
1306
  } catch {}
1365
1307
  }
1366
- }, or = (e) => e.replace(/[^a-zA-Z0-9._-]/g, "_").slice(0, 80), sr = (e, t) => f(Y, `${or(e)}-${t}.log`), cr = (e) => {
1367
- let t = or(e), n = [];
1308
+ }, nr = (e) => e.replace(/[^a-zA-Z0-9._-]/g, "_").slice(0, 80), rr = (e, t) => p(X, `${nr(e)}-${t}.log`), ir = (e) => {
1309
+ let t = nr(e), n = [];
1368
1310
  try {
1369
- n = M(Y);
1311
+ n = k(X);
1370
1312
  } catch {
1371
1313
  return;
1372
1314
  }
@@ -1374,19 +1316,19 @@ import {
1374
1316
  if (r.length === 0) return;
1375
1317
  let i, a = -1;
1376
1318
  for (let e of r) {
1377
- let t = f(Y, e);
1319
+ let t = p(X, e);
1378
1320
  try {
1379
- let e = N(t);
1321
+ let e = A(t);
1380
1322
  e.mtimeMs > a && (a = e.mtimeMs, i = t);
1381
1323
  } catch {}
1382
1324
  }
1383
1325
  return i;
1384
- }, lr = (e) => {
1326
+ }, ar = (e) => {
1385
1327
  try {
1386
- O(Y, { recursive: !0 });
1328
+ E(X, { recursive: !0 });
1387
1329
  } catch {}
1388
- ar();
1389
- let t = sr(e, process.pid), n = k(t, "w"), r = (e) => {
1330
+ tr();
1331
+ let t = rr(e, process.pid), n = D(t, "w"), r = (e) => {
1390
1332
  let t = {
1391
1333
  ts: e.ts.getTime(),
1392
1334
  level: e.level,
@@ -1407,15 +1349,15 @@ import {
1407
1349
  ...e.scope === void 0 ? {} : { scope: e.scope }
1408
1350
  }) + "\n";
1409
1351
  }
1410
- }, i = !1, a = w((e) => {
1352
+ }, i = !1, a = x((e) => {
1411
1353
  if (!i) try {
1412
- ne(n, r(e));
1354
+ P(n, r(e));
1413
1355
  } catch {}
1414
1356
  }), o = () => {
1415
1357
  if (!i) {
1416
1358
  i = !0;
1417
1359
  try {
1418
- ee(n);
1360
+ w(n);
1419
1361
  } catch {}
1420
1362
  }
1421
1363
  };
@@ -1427,10 +1369,10 @@ import {
1427
1369
  a(), o(), process.off("exit", o), process.off("uncaughtException", s), process.off("unhandledRejection", s);
1428
1370
  }
1429
1371
  };
1430
- }, ur = async (e, t) => {
1372
+ }, or = async (e, t) => {
1431
1373
  let n;
1432
1374
  try {
1433
- n = await A.readFile(e, "utf8");
1375
+ n = await O.readFile(e, "utf8");
1434
1376
  } catch {
1435
1377
  return [];
1436
1378
  }
@@ -1441,78 +1383,78 @@ import {
1441
1383
  i.push(t);
1442
1384
  } catch {}
1443
1385
  return t?.max !== void 0 && i.length > t.max ? i.slice(i.length - t.max) : i;
1444
- }, dr = T({ scope: "voltro:dashboard" }), fr = ie(import.meta.url), pr = 5179, mr = (e) => {
1386
+ }, sr = S({ scope: "voltro:dashboard" }), cr = z(import.meta.url), lr = 5179, ur = (e) => {
1445
1387
  let t = process.env.VOLTRO_DASHBOARD_PATH;
1446
- if (t && D(f(m(t), "app.config.ts"))) return m(t);
1388
+ if (t && T(p(h(t), "app.config.ts"))) return h(t);
1447
1389
  try {
1448
- let e = u(fr.resolve("@voltro/dashboard/package.json"));
1449
- if (D(f(e, "app.config.ts"))) return e;
1390
+ let e = d(cr.resolve("@voltro/dashboard/package.json"));
1391
+ if (T(p(e, "app.config.ts"))) return e;
1450
1392
  } catch {}
1451
- let n = f("voltro-devtools", "apps", "dashboard"), r = m(e);
1393
+ let n = p("voltro-devtools", "apps", "dashboard"), r = h(e);
1452
1394
  for (let e = 0; e < 10; e++) {
1453
- let e = f(r, n);
1454
- if (D(f(e, "app.config.ts"))) return e;
1455
- let t = u(r);
1395
+ let e = p(r, n);
1396
+ if (T(p(e, "app.config.ts"))) return e;
1397
+ let t = d(r);
1456
1398
  if (t === r) break;
1457
1399
  r = t;
1458
1400
  }
1459
1401
  return null;
1460
- }, hr = "VOLTRO_IS_DASHBOARD", gr = (e, t = "127.0.0.1", n = 250) => new Promise((r) => {
1461
- let i = ve({
1402
+ }, dr = "VOLTRO_IS_DASHBOARD", fr = (e, t = "127.0.0.1", n = 250) => new Promise((r) => {
1403
+ let i = de({
1462
1404
  port: e,
1463
1405
  host: t
1464
1406
  }), a = !1, o = (e) => {
1465
1407
  a || (a = !0, i.destroy(), r(e));
1466
1408
  };
1467
1409
  i.once("connect", () => o(!0)), i.once("error", () => o(!1)), setTimeout(() => o(!1), n);
1468
- }), _r = () => !!(process.env.VOLTRO_DASHBOARD === "off" || process.argv.includes("--disable-dashboard")), vr = () => process.env[hr] === "1", yr = () => process.stdout.isTTY === !0, br = f(re(), ".voltro", "dashboard-launch.lock"), xr = 1e4, Sr = async () => {
1410
+ }), pr = () => !!(process.env.VOLTRO_DASHBOARD === "off" || process.argv.includes("--disable-dashboard")), mr = () => process.env[dr] === "1", hr = () => process.stdout.isTTY === !0, gr = p(R(), ".voltro", "dashboard-launch.lock"), _r = 1e4, vr = async () => {
1469
1411
  try {
1470
- await A.mkdir(u(br), { recursive: !0 });
1471
- let e = await A.open(br, "wx");
1412
+ await O.mkdir(d(gr), { recursive: !0 });
1413
+ let e = await O.open(gr, "wx");
1472
1414
  return await e.write(`${process.pid}\n${Date.now()}\n`), await e.close(), !0;
1473
1415
  } catch {
1474
1416
  try {
1475
- let e = await A.stat(br);
1476
- if (Date.now() - e.mtimeMs > xr) return await A.unlink(br).catch(() => void 0), Sr();
1417
+ let e = await O.stat(gr);
1418
+ if (Date.now() - e.mtimeMs > _r) return await O.unlink(gr).catch(() => void 0), vr();
1477
1419
  } catch {}
1478
1420
  return !1;
1479
1421
  }
1480
- }, Cr = async () => {
1422
+ }, yr = async () => {
1481
1423
  try {
1482
- await A.unlink(br);
1424
+ await O.unlink(gr);
1483
1425
  } catch {}
1484
- }, wr = async (e) => {
1426
+ }, br = async (e) => {
1485
1427
  let t = e.port ?? 5179;
1486
- if (_r()) return {
1428
+ if (pr()) return {
1487
1429
  status: "skipped",
1488
1430
  reason: "disabled by flag/env",
1489
1431
  port: t
1490
1432
  };
1491
- if (vr()) return {
1433
+ if (mr()) return {
1492
1434
  status: "skipped",
1493
1435
  reason: "this process IS the dashboard",
1494
1436
  port: t
1495
1437
  };
1496
- if (!yr()) return {
1438
+ if (!hr()) return {
1497
1439
  status: "skipped",
1498
1440
  reason: "stdout is not a TTY (CI/smoke)",
1499
1441
  port: t
1500
1442
  };
1501
- if (!await Sr()) return {
1443
+ if (!await vr()) return {
1502
1444
  status: "skipped",
1503
1445
  reason: "another voltro process is currently launching the dashboard",
1504
1446
  port: t
1505
1447
  };
1506
- if (await gr(t)) return await Cr(), {
1448
+ if (await fr(t)) return await yr(), {
1507
1449
  status: "already-running",
1508
1450
  port: t
1509
1451
  };
1510
1452
  let n = e.voltroBin;
1511
1453
  if (!n) {
1512
1454
  let e = process.argv[1];
1513
- n = e && e.endsWith("/src/bin.ts") ? f(u(e), "..", "bin", "voltro.mjs") : e ?? "voltro";
1455
+ n = e && e.endsWith("/src/bin.ts") ? p(d(e), "..", "bin", "voltro.mjs") : e ?? "voltro";
1514
1456
  }
1515
- let r = D(f(e.dashboardAppPath, ".framework", "dist", "index.html")), i = r ? "start" : "dev", a = _e(process.execPath, [
1457
+ let r = T(p(e.dashboardAppPath, ".framework", "dist", "index.html")), i = r ? "start" : "dev", a = ue(process.execPath, [
1516
1458
  n,
1517
1459
  i,
1518
1460
  e.dashboardAppPath
@@ -1520,7 +1462,7 @@ import {
1520
1462
  stdio: "ignore",
1521
1463
  env: {
1522
1464
  ...process.env,
1523
- [hr]: "1",
1465
+ [dr]: "1",
1524
1466
  VOLTRO_DASHBOARD_PORT: String(t)
1525
1467
  }
1526
1468
  });
@@ -1528,22 +1470,22 @@ import {
1528
1470
  if (a.exitCode === null && a.signalCode === null) try {
1529
1471
  a.kill("SIGTERM");
1530
1472
  } catch {}
1531
- }), dr.info(`auto-launching dashboard at http://localhost:${t}`, {
1473
+ }), sr.info(`auto-launching dashboard at http://localhost:${t}`, {
1532
1474
  port: t,
1533
1475
  mode: i,
1534
1476
  prebuilt: r
1535
- }), r || dr.debug("no pre-built dashboard — running `voltro dev`. Build with `cd voltro-devtools && pnpm build` for a fast prod boot."), dr.debug("disable via --disable-dashboard or VOLTRO_DASHBOARD=off"), setTimeout(() => {
1536
- Cr();
1477
+ }), r || sr.debug("no pre-built dashboard — running `voltro dev`. Build with `cd voltro-devtools && pnpm build` for a fast prod boot."), sr.debug("disable via --disable-dashboard or VOLTRO_DASHBOARD=off"), setTimeout(() => {
1478
+ yr();
1537
1479
  }, 4e3).unref(), {
1538
1480
  status: "launched",
1539
1481
  port: t
1540
1482
  };
1541
- }, Tr = class extends Error {
1483
+ }, xr = class extends Error {
1542
1484
  _voltroDeferral = !0;
1543
1485
  constructor(e) {
1544
1486
  super(e), this.name = "DeferralNotSupportedError";
1545
1487
  }
1546
- }, Er = (e) => typeof e == "object" && !!e && e._voltroDeferral === !0, Dr = (e) => {
1488
+ }, Sr = (e) => typeof e == "object" && !!e && e._voltroDeferral === !0, Cr = (e) => {
1547
1489
  if (!(e instanceof Error)) return;
1548
1490
  let t = e._voltroControl;
1549
1491
  if (t === "redirect") {
@@ -1565,7 +1507,7 @@ import {
1565
1507
  },
1566
1508
  body: "not found"
1567
1509
  };
1568
- }, Or = (e) => {
1510
+ }, wr = (e) => {
1569
1511
  let { helpers: t } = e, n = t.prepareDeferredLoaderData(e.loaderData, "page"), r = {}, i = {}, a = {};
1570
1512
  for (let [n, o] of Object.entries(e.segmentLoaderData)) {
1571
1513
  let e = Number(n), s = t.prepareDeferredLoaderData(o, e);
@@ -1580,7 +1522,7 @@ import {
1580
1522
  ...e.layoutShell ? { layoutShell: e.layoutShell } : {}
1581
1523
  });
1582
1524
  } catch (e) {
1583
- throw new Tr(e instanceof Error ? e.message : String(e));
1525
+ throw new xr(e instanceof Error ? e.message : String(e));
1584
1526
  }
1585
1527
  return {
1586
1528
  loaderData: n.renderData,
@@ -1596,8 +1538,8 @@ import {
1596
1538
  ...Object.keys(a).length > 0 ? { deferredSegmentIds: a } : {}
1597
1539
  }
1598
1540
  };
1599
- }, kr = (e) => {
1600
- let { helpers: t, renderInput: n } = e, r = Or({
1541
+ }, Tr = (e) => {
1542
+ let { helpers: t, renderInput: n } = e, r = wr({
1601
1543
  helpers: t,
1602
1544
  page: e.page,
1603
1545
  pathname: n.pathname,
@@ -1618,19 +1560,19 @@ import {
1618
1560
  stateScript: t.renderRouterStateScript(r.stateInput),
1619
1561
  hasDeferred: r.hasDeferred
1620
1562
  };
1621
- }, Ar = (e) => {
1563
+ }, Er = (e) => {
1622
1564
  let { html: t, meta: n } = e.helpers.renderPageToHtml(e.prepared.renderInput);
1623
1565
  return {
1624
1566
  body: t,
1625
1567
  meta: n
1626
1568
  };
1627
- }, jr = (e) => [
1569
+ }, Dr = (e) => [
1628
1570
  ...e.extra ?? [],
1629
1571
  e.helpers.renderMetaToHtml(e.meta),
1630
1572
  `<meta name="voltro-interactive" content="${e.interactive}" />`,
1631
1573
  ...e.prepared.hasDeferred ? [e.helpers.renderDeferredRegistryScript()] : [],
1632
1574
  e.prepared.stateScript
1633
- ].filter((e) => e.length > 0).join("\n "), Mr = (e) => {
1575
+ ].filter((e) => e.length > 0).join("\n "), Or = (e) => {
1634
1576
  let t = e.indexOf("?");
1635
1577
  return t === -1 ? {
1636
1578
  pathname: e || "/",
@@ -1639,30 +1581,51 @@ import {
1639
1581
  pathname: e.slice(0, t) || "/",
1640
1582
  search: e.slice(t)
1641
1583
  };
1642
- }, Nr = "<div id=\"root\"></div>", Pr = "<div id=\"root\">", Fr = "</div>", Ir = /<script\b[^>]*\btype=["']module["'][^>]*><\/script>[ \t]*\n?/gi, Lr = /\bsrc=["']([^"']+)["']/i, Rr = /<script(?![^>]*\basync\b)([^>]*\btype=["']module["'][^>]*)>/gi, zr = (e) => {
1643
- let t = e.keepScriptInHead ?? ((e) => e.startsWith("/@")), n = [], r = e.shell.replace(Ir, (e) => {
1644
- let r = Lr.exec(e)?.[1];
1584
+ }, kr = 8e3, Ar = (e, t = kr) => {
1585
+ let n = Mr(e);
1586
+ return n.length <= t ? n : `${n.slice(0, t)}\n… [voltro] truncated at ${t} chars (${n.length} total)`;
1587
+ }, jr = 4, Mr = (e, t = 0, n = /* @__PURE__ */ new Set()) => {
1588
+ if (e instanceof Error) {
1589
+ let r = e.stack ?? `${e.name}: ${e.message}`;
1590
+ if (n.has(e)) return `${r}\n [cycle]`;
1591
+ n.add(e);
1592
+ let i = [];
1593
+ if (t < jr) if (e instanceof AggregateError && Array.isArray(e.errors)) for (let [r, a] of e.errors.entries()) i.push(`\n [aggregate ${r}] ${Nr(Mr(a, t + 1, n))}`);
1594
+ else e.cause !== void 0 && e.cause !== null && i.push(`\n [cause] ${Nr(Mr(e.cause, t + 1, n))}`);
1595
+ return r + i.join("");
1596
+ }
1597
+ try {
1598
+ return String(e);
1599
+ } catch {
1600
+ return "[unstringifiable thrown value]";
1601
+ }
1602
+ }, Nr = (e) => {
1603
+ let t = e.split("\n");
1604
+ return t.length <= 3 ? e : `${t.slice(0, 3).join("\n")}\n …`;
1605
+ }, Pr = "<div id=\"root\"></div>", Fr = "<div id=\"root\">", Ir = "</div>", Lr = /<script\b[^>]*\btype=["']module["'][^>]*><\/script>[ \t]*\n?/gi, Rr = /\bsrc=["']([^"']+)["']/i, zr = /<script(?![^>]*\basync\b)([^>]*\btype=["']module["'][^>]*)>/gi, Br = (e) => {
1606
+ let t = e.keepScriptInHead ?? ((e) => e.startsWith("/@")), n = [], r = e.shell.replace(Lr, (e) => {
1607
+ let r = Rr.exec(e)?.[1];
1645
1608
  return r === void 0 || t(r) ? e : (n.push(r), "");
1646
1609
  });
1647
- e.inlineModuleScriptsAsync && (r = r.replace(Rr, "<script async$1>"));
1648
- let i = r.indexOf(Nr);
1649
- if (i === -1) throw Error(`[voltro] the generated shell has no \`${Nr}\` 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.`);
1610
+ e.inlineModuleScriptsAsync && (r = r.replace(zr, "<script async$1>"));
1611
+ let i = r.indexOf(Pr);
1612
+ if (i === -1) throw Error(`[voltro] the generated shell has no \`${Pr}\` 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.`);
1650
1613
  return {
1651
- head: `${r.slice(0, i)}${Pr}`,
1652
- tail: `${Fr}${r.slice(i + 21)}`,
1614
+ head: `${r.slice(0, i)}${Fr}`,
1615
+ tail: `${Ir}${r.slice(i + 21)}`,
1653
1616
  bootstrapModules: n
1654
1617
  };
1655
- }, Br = (e) => e.head.replace("</head>", ` ${e.headInjection}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${e.htmlLang}"`), Vr = (e) => {
1618
+ }, Vr = (e) => e.head.replace("</head>", ` ${e.headInjection}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${e.htmlLang}"`), Hr = (e) => {
1656
1619
  let { res: t, shell: n, htmlLang: r, headInjection: i } = e, a = null, o = !1, s = !1, c = () => {
1657
1620
  if (s || !o || a === null) return;
1658
1621
  s = !0, t.statusCode = e.statusCode ?? 200;
1659
1622
  for (let [n, r] of Object.entries(e.headers ?? {})) t.setHeader(n, r);
1660
- t.flushHeaders?.(), t.write(Br({
1623
+ t.flushHeaders?.(), t.write(Vr({
1661
1624
  head: n.head,
1662
1625
  headInjection: i(a.meta),
1663
1626
  htmlLang: r
1664
1627
  }));
1665
- let c = new ye();
1628
+ let c = new fe();
1666
1629
  c.pipe(t, { end: !1 }), c.on("end", () => {
1667
1630
  t.end(n.tail);
1668
1631
  }), a.stream.pipe(c);
@@ -1687,23 +1650,42 @@ import {
1687
1650
  return;
1688
1651
  }
1689
1652
  c();
1690
- }, X = T({ scope: "voltro:dev:web" }), Hr = T({ scope: "vite" }), Ur = await (async () => {
1653
+ }, Ur = (e) => Array.isArray(e.preload) && e.preload.length > 0, Wr = (e, t) => typeof e == "string" ? {
1654
+ tag: e,
1655
+ input: {}
1656
+ } : {
1657
+ tag: e.tag,
1658
+ input: e.input?.(t) ?? {}
1659
+ }, Gr = async (e) => {
1660
+ let { pageMod: t, params: n, query: r, apiName: i, seed: a, onError: o } = e;
1661
+ if (Ur(t) && !(r === void 0 || i === void 0)) for (let e of t.preload) {
1662
+ let { tag: t, input: s } = Wr(e, n);
1663
+ try {
1664
+ a(i, t, s, await r(t, s));
1665
+ } catch (e) {
1666
+ o?.({
1667
+ tag: t,
1668
+ apiName: i
1669
+ }, e);
1670
+ }
1671
+ }
1672
+ }, Z = S({ scope: "voltro:dev:web" }), Kr = S({ scope: "vite" }), qr = await (async () => {
1691
1673
  try {
1692
- let e = f(u(h(import.meta.url)), "..", "package.json"), t = await A.readFile(e, "utf8");
1674
+ let e = p(d(g(import.meta.url)), "..", "package.json"), t = await O.readFile(e, "utf8");
1693
1675
  return JSON.parse(t).version ?? "0.0.0";
1694
1676
  } catch {
1695
1677
  return "0.0.0";
1696
1678
  }
1697
- })(), Wr = async () => {
1679
+ })(), Jr = async () => {
1698
1680
  try {
1699
- let e = u(h(import.meta.url)), t = m(e, "..", "..", "devtools");
1700
- if (D(f(t, "package.json"))) return t;
1701
- let n = m(e, "..", "..", "..", "devtools");
1702
- return D(f(n, "package.json")) ? n : null;
1681
+ let e = d(g(import.meta.url)), t = h(e, "..", "..", "devtools");
1682
+ if (T(p(t, "package.json"))) return t;
1683
+ let n = h(e, "..", "..", "..", "devtools");
1684
+ return T(p(n, "package.json")) ? n : null;
1703
1685
  } catch {
1704
1686
  return null;
1705
1687
  }
1706
- }, Gr = (e, t) => e.disableDevtools || !t ? [] : [
1688
+ }, Yr = (e, t) => e.disableDevtools || !t ? [] : [
1707
1689
  "",
1708
1690
  "// Dev-only in-page devtools overlay. The `import.meta.env.DEV` guard is a",
1709
1691
  "// compile-time constant, so prod builds strip this whole `if` block — the",
@@ -1713,46 +1695,46 @@ import {
1713
1695
  " await import('@voltro/devtools/styles.css')",
1714
1696
  " Devtools = (await import('@voltro/devtools')).VoltroDevtools",
1715
1697
  "}"
1716
- ], Kr = (e, t) => e.disableDevtools || !t ? [] : [" ...(Devtools ? { Devtools } : {}),"], qr = (e) => e.sentry ? ["import { initSentryBrowser } from '@voltro/plugin-sentry/web'"] : [], Jr = (e) => e.sentry ? [
1698
+ ], Xr = (e, t) => e.disableDevtools || !t ? [] : [" ...(Devtools ? { Devtools } : {}),"], Zr = (e) => e.sentry ? ["import { initSentryBrowser } from '@voltro/plugin-sentry/web'"] : [], Qr = (e) => e.sentry ? [
1717
1699
  "",
1718
1700
  "// Browser-side Sentry (frontend half of the deep integration). Errors +",
1719
1701
  "// browser rpc spans flow to Sentry, sharing the server transactions' trace.",
1720
1702
  `await initSentryBrowser(${JSON.stringify(e.sentry)})`
1721
- ] : [], Yr = (e) => e.env ? ["import './env.public'"] : [], Xr = (e) => {
1722
- let t = [], n = m(e);
1703
+ ] : [], $r = (e) => e.env ? ["import './env.public'"] : [], ei = (e) => {
1704
+ let t = [], n = h(e);
1723
1705
  for (;;) {
1724
- D(f(n, "pnpm-workspace.yaml")) && t.push(n);
1725
- let e = u(n);
1706
+ T(p(n, "pnpm-workspace.yaml")) && t.push(n);
1707
+ let e = d(n);
1726
1708
  if (e === n) break;
1727
1709
  n = e;
1728
1710
  }
1729
1711
  return t;
1730
- }, Zr = Mn, Qr = (e) => {
1712
+ }, ti = On, ni = (e) => {
1731
1713
  if (/\/node_modules\/(?:\.pnpm\/[^/]+\/node_modules\/)?(?:react|react-dom|scheduler)\//.test(e)) return "react";
1732
1714
  let t = /\/([^/]+)\.island\.tsx?$/.exec(e);
1733
1715
  if (t) return `island-${t[1]}`;
1734
- }, $r = /export\s+(?:async\s+)?(?:const|function|let|var)\s+loader\b/, ei = (e) => e.startsWith("(") && e.endsWith(")"), ti = (e) => e.filter((e) => !ei(e)), ni = (e) => {
1735
- let n = e.replace(t, "").split("/").filter(Boolean).filter((e) => !ei(e));
1736
- return n.length === 0 ? "/" : "/" + n.join("/");
1737
- }, ri = (e) => `${e.replace(t, "").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`, Z = (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}`, Q = async (e) => {
1738
- let r = [], i = [], a = async (e, o) => {
1716
+ }, ri = /export\s+(?:async\s+)?(?:const|function|let|var)\s+loader\b/, ii = (e) => e.startsWith("(") && e.endsWith(")"), ai = (e) => e.filter((e) => !ii(e)), oi = (e) => {
1717
+ let t = e.replace(r, "").split("/").filter(Boolean).filter((e) => !ii(e));
1718
+ return t.length === 0 ? "/" : "/" + t.join("/");
1719
+ }, si = (e) => `${e.replace(r, "").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) => {
1720
+ let t = [], i = [], a = async (e, o) => {
1739
1721
  let s = [];
1740
1722
  try {
1741
- s = await A.readdir(e, { withFileTypes: !0 });
1723
+ s = await O.readdir(e, { withFileTypes: !0 });
1742
1724
  } catch {
1743
1725
  return;
1744
1726
  }
1745
- let c = s.filter((e) => e.isDirectory()).map((e) => e.name).sort(), l = s.filter((e) => e.isFile() && e.name.endsWith(".tsx") && !Zr(e.name)).map((e) => e.name).sort(), u = new Set(l), d = o.join("/");
1727
+ let c = s.filter((e) => e.isDirectory()).map((e) => e.name).sort(), l = s.filter((e) => e.isFile() && e.name.endsWith(".tsx") && !ti(e.name)).map((e) => e.name).sort(), u = new Set(l), d = o.join("/");
1746
1728
  if (l.some((e) => n.has(e))) {
1747
1729
  let t = u.has("layout.tsx"), r = !1;
1748
1730
  if (t) try {
1749
- let t = await A.readFile(f(e, "layout.tsx"), "utf8");
1750
- r = $r.test(t);
1731
+ let t = await O.readFile(p(e, "layout.tsx"), "utf8");
1732
+ r = ri.test(t);
1751
1733
  } catch {}
1752
1734
  i.push({
1753
1735
  dir: d,
1754
1736
  chain: o,
1755
- contributesToUrl: o.length === 0 || !ei(o[o.length - 1]),
1737
+ contributesToUrl: o.length === 0 || !ii(o[o.length - 1]),
1756
1738
  hasLayout: t,
1757
1739
  hasLayoutLoader: r,
1758
1740
  hasError: u.has("error.tsx"),
@@ -1762,38 +1744,38 @@ import {
1762
1744
  });
1763
1745
  }
1764
1746
  for (let e of l) {
1765
- if (!t.test(e)) continue;
1747
+ if (!r.test(e)) continue;
1766
1748
  let n = d ? `${d}/${e}` : e;
1767
- r.push({
1749
+ t.push({
1768
1750
  file: n,
1769
- pattern: ni(n),
1770
- ident: ri(n),
1751
+ pattern: oi(n),
1752
+ ident: si(n),
1771
1753
  dirChain: o
1772
1754
  });
1773
1755
  }
1774
- for (let t of c) await a(f(e, t), [...o, t]);
1756
+ for (let t of c) await a(p(e, t), [...o, t]);
1775
1757
  };
1776
- await a(e, []), r.sort((e, t) => e.file < t.file ? -1 : 1);
1758
+ await a(e, []), t.sort((e, t) => e.file < t.file ? -1 : 1);
1777
1759
  let o = /* @__PURE__ */ new Set();
1778
- for (let e of r) for (let t = e.dirChain.length; t >= 0; t--) o.add(e.dirChain.slice(0, t).join("/"));
1760
+ for (let e of t) for (let t = e.dirChain.length; t >= 0; t--) o.add(e.dirChain.slice(0, t).join("/"));
1779
1761
  let s = [], c = [];
1780
1762
  for (let { specialFiles: e, ...t } of i) o.has(t.dir) ? s.push(t) : c.push({
1781
1763
  dir: t.dir,
1782
1764
  files: e
1783
1765
  });
1784
1766
  return {
1785
- pages: r,
1767
+ pages: t,
1786
1768
  dirs: s,
1787
1769
  orphanedSpecials: c
1788
1770
  };
1789
- }, ii = (e, t) => {
1771
+ }, ci = (e, t) => {
1790
1772
  let n = [];
1791
1773
  for (let r = 0; r <= t.length; r++) {
1792
1774
  let i = t.slice(0, r).join("/"), a = e.find((e) => e.dir === i);
1793
1775
  a && n.push(a);
1794
1776
  }
1795
1777
  return n;
1796
- }, ai = async (e) => {
1778
+ }, li = async (e) => {
1797
1779
  let { entries: t, loadLayout: n, loadError: r, loadPending: i, ctx: a } = e, o = {};
1798
1780
  return {
1799
1781
  chain: await Promise.all(t.map(async (e, t) => {
@@ -1816,10 +1798,10 @@ import {
1816
1798
  })),
1817
1799
  segmentLoaderData: o
1818
1800
  };
1819
- }, oi = (e) => {
1820
- let t = ti(e);
1801
+ }, ui = (e) => {
1802
+ let t = ai(e);
1821
1803
  return t.length === 0 ? "" : "/" + t.join("/");
1822
- }, si = [
1804
+ }, di = [
1823
1805
  "// Hot-reload bridge: keep SSR-injected <link rel=\"stylesheet\"> tags",
1824
1806
  "// in sync with Vite's CSS HMR. Without this, edits to .css files",
1825
1807
  "// only update the JS-injected <style> overlay; the underlying <link>",
@@ -1912,7 +1894,7 @@ import {
1912
1894
  " _vdtErrorStart('Build error')",
1913
1895
  " })",
1914
1896
  "}"
1915
- ].join("\n"), ci = (e) => {
1897
+ ].join("\n"), fi = (e) => {
1916
1898
  let t = [], n = 0, r = e.split("/").filter(Boolean), i = [];
1917
1899
  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, "\\$&"));
1918
1900
  let a = i.join("/");
@@ -1921,8 +1903,8 @@ import {
1921
1903
  paramNames: t,
1922
1904
  priority: n
1923
1905
  };
1924
- }, li = (e) => e.map((e) => {
1925
- let { regex: t, paramNames: n, priority: r } = ci(e.pattern);
1906
+ }, pi = (e) => e.map((e) => {
1907
+ let { regex: t, paramNames: n, priority: r } = fi(e.pattern);
1926
1908
  return {
1927
1909
  pattern: e.pattern,
1928
1910
  file: e.file,
@@ -1931,7 +1913,7 @@ import {
1931
1913
  paramNames: n,
1932
1914
  priority: r
1933
1915
  };
1934
- }).slice().sort((e, t) => e.priority - t.priority), ui = (e, t) => {
1916
+ }).slice().sort((e, t) => e.priority - t.priority), mi = (e, t) => {
1935
1917
  for (let n of t) {
1936
1918
  let t = n.regex.exec(e);
1937
1919
  if (!t) continue;
@@ -1943,30 +1925,30 @@ import {
1943
1925
  };
1944
1926
  }
1945
1927
  return null;
1946
- }, di = async (e, t) => {
1928
+ }, hi = async (e, t) => {
1947
1929
  let n = e;
1948
1930
  for (;;) {
1949
- let e = f(n, "node_modules", t);
1931
+ let e = p(n, "node_modules", t);
1950
1932
  try {
1951
- if ((await A.stat(e)).isDirectory()) {
1952
- let t = await A.realpath(e);
1933
+ if ((await O.stat(e)).isDirectory()) {
1934
+ let t = await O.realpath(e);
1953
1935
  return t.includes("/node_modules/") ? null : t;
1954
1936
  }
1955
1937
  } catch {}
1956
- let r = u(n);
1938
+ let r = d(n);
1957
1939
  if (r === n) return null;
1958
1940
  n = r;
1959
1941
  }
1960
- }, fi = async (e) => {
1942
+ }, gi = async (e) => {
1961
1943
  try {
1962
- let t = await import(g(f(e, "app.config.ts")).href), n = t.default?.port, r = typeof n == "number" ? n : 4e3, i = t.default?.transport?.wsPath, a = typeof i == "string" && i.startsWith("/") ? i : void 0;
1944
+ let t = await import(_(p(e, "app.config.ts")).href), n = t.default?.port, r = typeof n == "number" ? n : 4e3, i = t.default?.transport?.wsPath, a = typeof i == "string" && i.startsWith("/") ? i : void 0;
1963
1945
  return a ? {
1964
1946
  port: r,
1965
1947
  wsPath: a
1966
1948
  } : { port: r };
1967
1949
  } catch {}
1968
1950
  return { port: 4e3 };
1969
- }, pi = (e, t) => ({
1951
+ }, _i = (e, t) => ({
1970
1952
  name: e,
1971
1953
  pkg: t.package,
1972
1954
  browserWsUrl: t.url,
@@ -1974,7 +1956,7 @@ import {
1974
1956
  ...t.serverUrl ? { serverOrigin: t.serverUrl } : {},
1975
1957
  ...t.headers ? { headers: t.headers } : {},
1976
1958
  ...t.authHeaders ? { hasAuthHeaders: !0 } : {}
1977
- }), mi = (e, t, n) => {
1959
+ }), vi = (e, t, n) => {
1978
1960
  let r = t.transport?.wsPath ?? n.wsPath;
1979
1961
  return {
1980
1962
  name: e,
@@ -1986,7 +1968,7 @@ import {
1986
1968
  ...t.headers ? { headers: t.headers } : {},
1987
1969
  ...t.authHeaders ? { hasAuthHeaders: !0 } : {}
1988
1970
  };
1989
- }, hi = (e) => {
1971
+ }, yi = (e) => {
1990
1972
  let t = /* @__PURE__ */ new Map();
1991
1973
  for (let n of e) {
1992
1974
  if (n.proxyTarget === void 0) continue;
@@ -1994,43 +1976,43 @@ import {
1994
1976
  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>.`);
1995
1977
  t.set(n.browserWsUrl, n.name);
1996
1978
  }
1997
- }, gi = async (e, t) => {
1979
+ }, bi = async (e, t) => {
1998
1980
  let n = Object.entries(t.apis ?? {}), r = [];
1999
1981
  for (let [t, i] of n) {
2000
1982
  if (i.url) {
2001
- r.push(pi(t, i));
1983
+ r.push(_i(t, i));
2002
1984
  continue;
2003
1985
  }
2004
- let n = await di(e, i.package);
1986
+ let n = await hi(e, i.package);
2005
1987
  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.`);
2006
- r.push(mi(t, i, await fi(n)));
1988
+ r.push(vi(t, i, await gi(n)));
2007
1989
  }
2008
- return hi(r), r;
2009
- }, _i = (e) => {
1990
+ return yi(r), r;
1991
+ }, xi = (e) => {
2010
1992
  if (!(!/^wss?:\/\//.test(e) && !/^https?:\/\//.test(e))) try {
2011
1993
  let t = new URL(e);
2012
1994
  return t.protocol = t.protocol === "wss:" || t.protocol === "https:" ? "https:" : "http:", `${t.protocol}//${t.host}`;
2013
1995
  } catch {
2014
1996
  return;
2015
1997
  }
2016
- }, vi = (e) => `VOLTRO_API_ORIGIN_${e.toUpperCase().replace(/[^A-Z0-9]/g, "_")}`, yi = (e) => process.env[vi(e)] ?? process.env.VOLTRO_API_ORIGIN, bi = (e, t) => {
1998
+ }, Si = (e) => `VOLTRO_API_ORIGIN_${e.toUpperCase().replace(/[^A-Z0-9]/g, "_")}`, Ci = (e) => process.env[Si(e)] ?? process.env.VOLTRO_API_ORIGIN, wi = (e, t) => {
2017
1999
  if (!e) return;
2018
- let n = yi(e.name) ?? e.serverOrigin;
2000
+ let n = Ci(e.name) ?? e.serverOrigin;
2019
2001
  if (n) {
2020
- let e = _i(n);
2002
+ let e = xi(n);
2021
2003
  if (e) return e;
2022
2004
  }
2023
2005
  if (t?.allowDevProxy && e.proxyTarget) {
2024
- let t = _i(e.proxyTarget);
2006
+ let t = xi(e.proxyTarget);
2025
2007
  if (t) return t;
2026
2008
  }
2027
- if (!e.proxyTarget && /^wss?:\/\//.test(e.browserWsUrl)) return _i(e.browserWsUrl);
2028
- }, xi = (e, t, n) => {
2009
+ if (!e.proxyTarget && /^wss?:\/\//.test(e.browserWsUrl)) return xi(e.browserWsUrl);
2010
+ }, Ti = (e, t, n) => {
2029
2011
  if (!e) {
2030
2012
  if (n?.apiName === void 0) return;
2031
2013
  let e = n.apiName;
2032
2014
  return async () => {
2033
- throw Error(`[loader.query] api '${e}' has no server-side origin for SSR. In a split web/api deployment the web pod reaches the api by internal DNS, not the browser's relative wsPath — set ${vi(e)} (or VOLTRO_API_ORIGIN, or apis.${e}.serverUrl in app.config.ts) to the api's internal origin, e.g. http://api.<namespace>.svc.cluster.local. The browser transport is unaffected.`);
2015
+ throw Error(`[loader.query] api '${e}' has no server-side origin for SSR. In a split web/api deployment the web pod reaches the api by internal DNS, not the browser's relative wsPath — set ${Si(e)} (or VOLTRO_API_ORIGIN, or apis.${e}.serverUrl in app.config.ts) to the api's internal origin, e.g. http://api.<namespace>.svc.cluster.local. The browser transport is unaffected.`);
2034
2016
  };
2035
2017
  }
2036
2018
  return async (r, i) => {
@@ -2052,7 +2034,7 @@ import {
2052
2034
  });
2053
2035
  } catch (t) {
2054
2036
  let i = t?.cause?.code ?? String(t?.message ?? t);
2055
- throw Error(`[loader.query] ${r}: could not reach the api at ${e}/rpc (${i}). ${n?.apiName ? `Set ${vi(n.apiName)} / VOLTRO_API_ORIGIN` : "Set the api server origin"} to the api's SSR-reachable origin (internal cluster DNS in a split deployment).`, { cause: t });
2037
+ throw Error(`[loader.query] ${r}: could not reach the api at ${e}/rpc (${i}). ${n?.apiName ? `Set ${Si(n.apiName)} / VOLTRO_API_ORIGIN` : "Set the api server origin"} to the api's SSR-reachable origin (internal cluster DNS in a split deployment).`, { cause: t });
2056
2038
  }
2057
2039
  if (!o.ok) throw Error(`[loader.query] ${r}: HTTP ${o.status} ${await o.text()}`);
2058
2040
  let s = await o.json();
@@ -2070,8 +2052,8 @@ import {
2070
2052
  }
2071
2053
  if (u) return l;
2072
2054
  };
2073
- }, $ = async (e, t, n, r = {}) => {
2074
- let i = t.title ?? t.name ?? "app", a = t.theme === "dark" ? " class=\"dark\"" : t.theme === "light" ? " class=\"light\"" : "", o = D(f(e, "node_modules", "@voltro", "devtools", "package.json")) || await Wr() !== null, s = t.theme === "system" ? [
2055
+ }, Ei = async (e, t, n, r = {}) => {
2056
+ let i = t.title ?? t.name ?? "app", a = t.theme === "dark" ? " class=\"dark\"" : t.theme === "light" ? " class=\"light\"" : "", o = T(p(e, "node_modules", "@voltro", "devtools", "package.json")) || await Jr() !== null, s = t.theme === "system" ? [
2075
2057
  " <script>",
2076
2058
  " (function () {",
2077
2059
  " var root = document.documentElement",
@@ -2109,9 +2091,9 @@ import {
2109
2091
  " </body>",
2110
2092
  "</html>",
2111
2093
  ""
2112
- ].join("\n"), l = f(e, "src", "pages"), { pages: u, dirs: d, orphanedSpecials: p } = await Q(l);
2113
- await nr(l, u);
2114
- for (let e of p) X.warn(`src/pages/${e.dir || "."}/ contains ${e.files.join(", ")} but no page.tsx at or below it — ${e.files.length > 1 ? "those files are" : "that file is"} inert. A layout/error/loading/not-found file only applies to routes in its own directory tree; if this is an ordinary component, rename it so it does not read as a route boundary.`);
2094
+ ].join("\n"), l = p(e, "src", "pages"), { pages: u, dirs: d, orphanedSpecials: f } = await $(l);
2095
+ await Qn(l, u);
2096
+ for (let e of f) Z.warn(`src/pages/${e.dir || "."}/ contains ${e.files.join(", ")} but no page.tsx at or below it — ${e.files.length > 1 ? "those files are" : "that file is"} inert. A layout/error/loading/not-found file only applies to routes in its own directory tree; if this is an ordinary component, rename it so it does not read as a route boundary.`);
2115
2097
  let m = (e) => `${e.replace(/[^a-zA-Z0-9]/g, "_")}AppGroup`, h = (e) => `${e.replace(/[^a-zA-Z0-9]/g, "_")}AppDescriptors`, g = n.map((e) => `import { appGroup as ${m(e.name)}, appDescriptors as ${h(e.name)} } from '${e.pkg}/rpcGroup'`);
2116
2098
  n.some((e) => e.hasAuthHeaders) && (g.push("import __voltroAppConfig from '../app.config'"), g.push("const __voltroAuthHeaders = (__voltroAppConfig as { readonly apis?: Record<string, { readonly authHeaders?: () => Record<string, string> | Promise<Record<string, string>> }> }).apis"));
2117
2099
  let _ = n.map((e) => {
@@ -2122,16 +2104,16 @@ import {
2122
2104
  let e = u.map((e) => ` ${JSON.stringify(e.pattern)}: () => import('../src/pages/${e.file}'),`), n = [];
2123
2105
  for (let e of d) {
2124
2106
  let t = e.dir === "" ? "../src/pages" : `../src/pages/${e.dir}`;
2125
- e.hasLayout && e.hasLayoutLoader ? n.push(`import * as ${Z(e.dir, "Layout")}Mod from '${t}/layout.tsx'`) : e.hasLayout && n.push(`import ${Z(e.dir, "Layout")} from '${t}/layout.tsx'`), e.hasError && n.push(`import ${Z(e.dir, "Error")} from '${t}/error.tsx'`), e.hasPending && n.push(`import ${Z(e.dir, "Pending")} from '${t}/loading.tsx'`), e.hasNotFound && n.push(`import ${Z(e.dir, "NotFound")} from '${t}/not-found.tsx'`);
2107
+ 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'`);
2126
2108
  }
2127
2109
  let r = u.map((e) => {
2128
- let t = ii(d, e.dirChain).map((e) => {
2110
+ let t = ci(d, e.dirChain).map((e) => {
2129
2111
  let t = [`id: ${JSON.stringify(e.dir || "/")}`], n = JSON.stringify(e.dir);
2130
2112
  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(", ")} }`;
2131
2113
  }).join(",\n");
2132
2114
  return ` makePageRoute(${JSON.stringify(e.pattern)}, ${t.length > 0 ? `[\n${t},\n ]` : "undefined"}),`;
2133
2115
  }), i = d.filter((e) => e.hasNotFound).map((e) => {
2134
- let t = oi(e.chain), n = ii(d, e.chain).map((e) => {
2116
+ let t = ui(e.chain), n = ci(d, e.chain).map((e) => {
2135
2117
  let t = [`id: ${JSON.stringify(e.dir || "/")}`], n = JSON.stringify(e.dir);
2136
2118
  return e.hasLayout && t.push(`Layout: refs.layouts[${n}]`), e.hasError && t.push(`Error: refs.errors[${n}]`), ` { ${t.join(", ")} }`;
2137
2119
  }).join(",\n"), r = n.length > 0 ? `\n chain: [\n${n},\n ],` : "";
@@ -2139,23 +2121,23 @@ import {
2139
2121
  }), a = [], s = [], c = [], l = [], f = [], p = [];
2140
2122
  for (let e of d) {
2141
2123
  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`, o = JSON.stringify(e.dir);
2142
- e.hasLayout && e.hasLayoutLoader ? (s.push(` ${o}: ${Z(e.dir, "Layout")}Mod.default,`), c.push(` ${o}: ${Z(e.dir, "Layout")}Mod.loader,`), a.push({
2124
+ e.hasLayout && e.hasLayoutLoader ? (s.push(` ${o}: ${Q(e.dir, "Layout")}Mod.default,`), c.push(` ${o}: ${Q(e.dir, "Layout")}Mod.loader,`), a.push({
2143
2125
  relPath: t,
2144
2126
  kind: "layout",
2145
2127
  slotKey: e.dir
2146
- })) : e.hasLayout && (s.push(` ${o}: ${Z(e.dir, "Layout")},`), a.push({
2128
+ })) : e.hasLayout && (s.push(` ${o}: ${Q(e.dir, "Layout")},`), a.push({
2147
2129
  relPath: t,
2148
2130
  kind: "layout",
2149
2131
  slotKey: e.dir
2150
- })), e.hasError && (l.push(` ${o}: ${Z(e.dir, "Error")},`), a.push({
2132
+ })), e.hasError && (l.push(` ${o}: ${Q(e.dir, "Error")},`), a.push({
2151
2133
  relPath: n,
2152
2134
  kind: "error",
2153
2135
  slotKey: e.dir
2154
- })), e.hasPending && (f.push(` ${o}: ${Z(e.dir, "Pending")},`), a.push({
2136
+ })), e.hasPending && (f.push(` ${o}: ${Q(e.dir, "Pending")},`), a.push({
2155
2137
  relPath: r,
2156
2138
  kind: "pending",
2157
2139
  slotKey: e.dir
2158
- })), e.hasNotFound && (p.push(` ${o}: ${Z(e.dir, "NotFound")},`), a.push({
2140
+ })), e.hasNotFound && (p.push(` ${o}: ${Q(e.dir, "NotFound")},`), a.push({
2159
2141
  relPath: i,
2160
2142
  kind: "notFound",
2161
2143
  slotKey: e.dir
@@ -2329,11 +2311,28 @@ import {
2329
2311
  " defaultLocale: I18N_DEFAULT,",
2330
2312
  " })",
2331
2313
  " }",
2332
- " // Client-side: cookie only. Accept-Language sniffing is",
2333
- " // server-exclusive — navigator.languages can diverge from",
2334
- " // what the server saw and would produce a hydration",
2335
- " // mismatch on first paint.",
2314
+ " // Client-side: ADOPT what the server resolved, from <html lang>.",
2315
+ " //",
2316
+ " // Dropping the Accept-Language signal here is not the same as",
2317
+ " // agreeing with the server about it, and the difference is every",
2318
+ " // FIRST visit: with no cookie yet, the server negotiated",
2319
+ " // Accept-Language while the client fell through to the default, so",
2320
+ " // an English browser on a German-default app hydrated 'de' over an",
2321
+ " // 'en' tree and React discarded the whole server render — exactly",
2322
+ " // what SSR was turned on to avoid. It stops the moment anything",
2323
+ " // writes the cookie, which is why it is invisible after one",
2324
+ " // language switch and reproduces on every new visitor.",
2325
+ " //",
2326
+ " // navigator.languages is still NOT read: it can diverge from what",
2327
+ " // the server saw. The server publishes its answer instead, and the",
2328
+ " // <html lang> attribute is that answer — set from the SAME resolver",
2329
+ " // that built the provider, on the same request.",
2336
2330
  " if (typeof document === 'undefined') return I18N_DEFAULT",
2331
+ " const published = document.documentElement.lang",
2332
+ " if (published && I18N_SUPPORTED.includes(published)) return published",
2333
+ " // No published locale (a page served by something else, or an",
2334
+ " // attribute a consumer overwrote): fall back to the cookie, which",
2335
+ " // both halves can read, and never to a client-only signal.",
2337
2336
  " return resolveLocale({",
2338
2337
  " cookieHeader: document.cookie,",
2339
2338
  " acceptLanguageHeader: null,",
@@ -2370,14 +2369,14 @@ import {
2370
2369
  "// resolved apis map. Side-effect only — no local component definitions —",
2371
2370
  "// so downstream invalidations (user page edits) terminate at app.tsx.",
2372
2371
  "",
2373
- ...Yr(t),
2372
+ ...$r(t),
2374
2373
  "import { mount } from '@voltro/web'",
2375
2374
  ...g,
2376
2375
  "import { App } from './app'",
2377
2376
  "import { preloadCurrentRoute } from './routeTable'",
2378
- ...qr(t),
2379
- ...Gr(t, o),
2380
- ...Jr(t),
2377
+ ...Zr(t),
2378
+ ...Yr(t, o),
2379
+ ...Qr(t),
2381
2380
  "",
2382
2381
  "// Preload the current route's page chunk BEFORE hydration so the first",
2383
2382
  "// client render matches the SSG/SSR-prerendered HTML. Without it, a lazy",
@@ -2394,10 +2393,10 @@ import {
2394
2393
  " apis: {",
2395
2394
  ..._,
2396
2395
  " },",
2397
- ...Kr(t, o),
2396
+ ...Xr(t, o),
2398
2397
  "})",
2399
2398
  "",
2400
- si
2399
+ di
2401
2400
  ].join("\n");
2402
2401
  } else v = "", y = "", b = [
2403
2402
  "// GENERATED BY `voltro dev` — do not edit; will be overwritten on next boot.",
@@ -2405,94 +2404,94 @@ import {
2405
2404
  "// and calls mount(). Side-effect only, no component definitions, so the",
2406
2405
  "// user's component file remains the Fast Refresh boundary.",
2407
2406
  "",
2408
- ...Yr(t),
2407
+ ...$r(t),
2409
2408
  "import { mount } from '@voltro/web'",
2410
2409
  ...g,
2411
2410
  "import App from '../src/App'",
2412
- ...qr(t),
2413
- ...Gr(t, o),
2414
- ...Jr(t),
2411
+ ...Zr(t),
2412
+ ...Yr(t, o),
2413
+ ...Qr(t),
2415
2414
  "",
2416
2415
  "mount(App, {",
2417
2416
  " apis: {",
2418
2417
  ..._,
2419
2418
  " },",
2420
- ...Kr(t, o),
2419
+ ...Xr(t, o),
2421
2420
  "})",
2422
2421
  "",
2423
- si
2422
+ di
2424
2423
  ].join("\n");
2425
- let x = f(e, ".framework");
2426
- await A.mkdir(x, { recursive: !0 }), t.env ? await mt(x, r) : await A.rm(f(x, "env.public.ts"), { force: !0 }), await A.writeFile(f(x, "index.html"), c, "utf8"), await A.writeFile(f(x, "main.tsx"), b, "utf8"), v ? (await A.writeFile(f(x, "app.tsx"), v, "utf8"), await A.writeFile(f(x, "routeTable.ts"), y, "utf8")) : (await A.rm(f(x, "app.tsx"), { force: !0 }), await A.rm(f(x, "routeTable.ts"), { force: !0 }));
2427
- let S = f(e, ".gitignore"), C = "";
2424
+ let x = p(e, ".framework");
2425
+ await O.mkdir(x, { recursive: !0 }), t.env ? await nt(x, r) : await O.rm(p(x, "env.public.ts"), { force: !0 }), await O.writeFile(p(x, "index.html"), c, "utf8"), await O.writeFile(p(x, "main.tsx"), b, "utf8"), v ? (await O.writeFile(p(x, "app.tsx"), v, "utf8"), await O.writeFile(p(x, "routeTable.ts"), y, "utf8")) : (await O.rm(p(x, "app.tsx"), { force: !0 }), await O.rm(p(x, "routeTable.ts"), { force: !0 }));
2426
+ let S = p(e, ".gitignore"), C = "";
2428
2427
  try {
2429
- C = await A.readFile(S, "utf8");
2428
+ C = await O.readFile(S, "utf8");
2430
2429
  } catch {}
2431
- let w = ["/.framework/"], T = new Set(C.split("\n").map((e) => e.trim())), E = w.filter((e) => !T.has(e));
2432
- if (E.length > 0) {
2430
+ let w = ["/.framework/"], E = new Set(C.split("\n").map((e) => e.trim())), D = w.filter((e) => !E.has(e));
2431
+ if (D.length > 0) {
2433
2432
  let e = C === "" || C.endsWith("\n") ? "" : "\n";
2434
2433
  try {
2435
- await A.appendFile(S, `${e}${E.join("\n")}\n`, "utf8");
2434
+ await O.appendFile(S, `${e}${D.join("\n")}\n`, "utf8");
2436
2435
  } catch (e) {
2437
- X.warn(`could not add ${E.join(", ")} to ${S} — add it by hand so the generated directory stays out of git. The build is unaffected.`, { reason: e?.message ?? String(e) });
2436
+ Z.warn(`could not add ${D.join(", ")} to ${S} — add it by hand so the generated directory stays out of git. The build is unaffected.`, { reason: e?.message ?? String(e) });
2438
2437
  }
2439
2438
  }
2440
- }, Si = async (e, t) => {
2439
+ }, Di = async (e, t) => {
2441
2440
  try {
2442
- let n = f(u(e), "project.json");
2443
- if (!D(n)) return;
2444
- let r = await A.readFile(n, "utf8"), i = JSON.parse(r).apps ?? {}, a = e.split("/").filter(Boolean).pop() ?? "", o = [];
2441
+ let n = p(d(e), "project.json");
2442
+ if (!T(n)) return;
2443
+ let r = await O.readFile(n, "utf8"), i = JSON.parse(r).apps ?? {}, a = e.split("/").filter(Boolean).pop() ?? "", o = [];
2445
2444
  for (let [e, n] of Object.entries(i)) e !== a && n.port === t && o.push(e);
2446
2445
  if (o.length === 0) return;
2447
- X.warn("sibling app(s) claim the same port — only one boots", {
2446
+ Z.warn("sibling app(s) claim the same port — only one boots", {
2448
2447
  port: t,
2449
2448
  conflicts: o,
2450
2449
  projectJson: n
2451
2450
  });
2452
2451
  } catch {}
2453
- }, Ci = (e) => f(e, ".framework", "dist", "server", "appConfig.js"), wi = async (e) => {
2454
- let t = Ci(e), n = D(t) ? t : f(e, "app.config.ts");
2452
+ }, Oi = (e) => p(e, ".framework", "dist", "server", "appConfig.js"), ki = async (e) => {
2453
+ let t = Oi(e), n = T(t) ? t : p(e, "app.config.ts");
2455
2454
  try {
2456
- let e = (await import(g(n).href)).default;
2455
+ let e = (await import(_(n).href)).default;
2457
2456
  return typeof e == "object" && e && "type" in e && e.type === "web" ? e : null;
2458
2457
  } catch {
2459
2458
  return null;
2460
2459
  }
2461
- }, Ti = async (e) => {
2462
- let t = await wi(e);
2460
+ }, Ai = async (e) => {
2461
+ let t = await ki(e);
2463
2462
  if (!t) return {
2464
2463
  ran: !1,
2465
2464
  exitCode: 0
2466
2465
  };
2467
- kn();
2468
- let n = Zt();
2469
- cn(n), X.info("booting voltro dev (web)", { app: t.name ?? "(unnamed)" });
2470
- let u = await gi(e, t);
2471
- for (let e of u) X.info("api wired", {
2466
+ Tn();
2467
+ let n = qt();
2468
+ rn(n), Z.info("booting voltro dev (web)", { app: t.name ?? "(unnamed)" });
2469
+ let r = await bi(e, t);
2470
+ for (let e of r) Z.info("api wired", {
2472
2471
  name: e.name,
2473
2472
  pkg: e.pkg,
2474
2473
  ...e.proxyTarget ? { proxyTo: e.proxyTarget } : { directWs: e.browserWsUrl }
2475
2474
  });
2476
- We(e).then((e) => {
2475
+ Me(e).then((e) => {
2477
2476
  for (let t of e.files) if (t.action === "created") {
2478
2477
  let e = t.path.split("/").pop() ?? t.path;
2479
- X.info(`${e} seeded`, { path: t.path });
2478
+ Z.info(`${e} seeded`, { path: t.path });
2480
2479
  }
2481
2480
  }).catch(() => {});
2482
- let { resolved: d } = await ht({
2481
+ let { resolved: d } = await rt({
2483
2482
  rawEnv: t.env,
2484
2483
  appType: "web",
2485
2484
  root: e,
2486
- log: X,
2485
+ log: Z,
2487
2486
  generateTypes: !0
2488
- }), h = d.publicValues;
2489
- await $(e, t, u, h), X.debug("generated framework entry files", { files: [
2487
+ }), f = d.publicValues;
2488
+ await Ei(e, t, r, f), Z.debug("generated framework entry files", { files: [
2490
2489
  "index.html",
2491
2490
  ".framework/main.tsx",
2492
2491
  ...t.env ? [".framework/env.public.ts"] : []
2493
2492
  ] });
2494
- let g = process.env.VOLTRO_IS_DASHBOARD === "1" && process.env.VOLTRO_DASHBOARD_PORT ? Number(process.env.VOLTRO_DASHBOARD_PORT) : t.port ?? 5173, _ = t.name ?? "unnamed", v = it("web", _, g), y = lr(_);
2495
- await nt({
2493
+ let g = process.env.VOLTRO_IS_DASHBOARD === "1" && process.env.VOLTRO_DASHBOARD_PORT ? Number(process.env.VOLTRO_DASHBOARD_PORT) : t.port ?? 5173, _ = t.name ?? "unnamed", v = Ke("web", _, g), y = ar(_);
2494
+ await We({
2496
2495
  id: v,
2497
2496
  name: _,
2498
2497
  kind: "web",
@@ -2500,22 +2499,22 @@ import {
2500
2499
  pid: process.pid,
2501
2500
  status: "booting",
2502
2501
  logFile: y.path
2503
- }).catch(() => {}), await Si(e, g);
2504
- let { pages: b, dirs: x } = await Q(f(e, "src", "pages")), S = {
2502
+ }).catch(() => {}), await Di(e, g);
2503
+ let { pages: b, dirs: x } = await $(p(e, "src", "pages")), S = {
2505
2504
  dirs: x,
2506
- ssrRoutes: li(b)
2507
- }, C = x.map((e) => ({
2505
+ ssrRoutes: pi(b)
2506
+ }, w = x.map((e) => ({
2508
2507
  dir: e.dir,
2509
2508
  hasLayout: e.hasLayout,
2510
2509
  hasError: e.hasError,
2511
2510
  hasPending: e.hasPending,
2512
2511
  hasNotFound: e.hasNotFound
2513
- })), w = await Yt({
2512
+ })), E = await zt({
2514
2513
  appRoot: e,
2515
2514
  pages: b
2516
2515
  });
2517
- w.wrote && X.debug("routes codegen wrote", { path: p(e, w.path) });
2518
- let T = await ct("vite", () => import("vite")), ee = (await import("@vitejs/plugin-react")).default, O = (await import("@tailwindcss/vite")).default, k = f(e, ".framework"), j = f(e, "src"), M = /* @__PURE__ */ new Set([
2516
+ E.wrote && Z.debug("routes codegen wrote", { path: m(e, E.path) });
2517
+ let D = await Xe("vite", () => import("vite")), ee = (await import("@vitejs/plugin-react")).default, k = (await import("@tailwindcss/vite")).default, A = p(e, ".framework"), j = p(e, "src"), M = /* @__PURE__ */ new Set([
2519
2518
  ".framework",
2520
2519
  "node_modules",
2521
2520
  "dist",
@@ -2527,84 +2526,84 @@ import {
2527
2526
  name: "framework:watch-app-sources",
2528
2527
  async configureServer(t) {
2529
2528
  try {
2530
- let n = (await A.readdir(e, { withFileTypes: !0 })).filter((e) => e.isDirectory() && !M.has(e.name));
2531
- for (let r of n) t.watcher.add(f(e, r.name));
2529
+ let n = (await O.readdir(e, { withFileTypes: !0 })).filter((e) => e.isDirectory() && !M.has(e.name));
2530
+ for (let r of n) t.watcher.add(p(e, r.name));
2532
2531
  n.length === 0 && t.watcher.add(j);
2533
2532
  } catch {
2534
2533
  t.watcher.add(j);
2535
2534
  }
2536
2535
  try {
2537
- let n = await A.readFile(f(e, "package.json"), "utf8"), r = JSON.parse(n), i = Object.keys({
2536
+ let n = await O.readFile(p(e, "package.json"), "utf8"), r = JSON.parse(n), i = Object.keys({
2538
2537
  ...r.dependencies,
2539
2538
  ...r.devDependencies
2540
2539
  });
2541
2540
  await Promise.all(i.map(async (n) => {
2542
- let r = await di(e, n);
2541
+ let r = await hi(e, n);
2543
2542
  if (!r) return;
2544
- let i = f(r, "src");
2543
+ let i = p(r, "src");
2545
2544
  try {
2546
- (await A.stat(i)).isDirectory() && t.watcher.add(i);
2545
+ (await O.stat(i)).isDirectory() && t.watcher.add(i);
2547
2546
  } catch {}
2548
2547
  }));
2549
2548
  } catch {}
2550
2549
  }
2551
- }, P = f(e, "src", "pages"), te = (e) => e.endsWith(".tsx") && (e === P || e.startsWith(P + "/")), F = (e) => e === P || e.startsWith(P + "/"), ne = async (n) => {
2550
+ }, P = p(e, "src", "pages"), F = (e) => e.endsWith(".tsx") && (e === P || e.startsWith(P + "/")), I = (e) => e === P || e.startsWith(P + "/"), L = async (n) => {
2552
2551
  try {
2553
- let r = Date.now();
2554
- await $(e, t, u, h);
2555
- let { pages: i, dirs: a } = await Q(P);
2556
- await Yt({
2552
+ let i = Date.now();
2553
+ await Ei(e, t, r, f);
2554
+ let { pages: a, dirs: o } = await $(P);
2555
+ await zt({
2557
2556
  appRoot: e,
2558
- pages: i
2559
- }), S.dirs = a, S.ssrRoutes = li(i), X.info("page tree regenerated", {
2557
+ pages: a
2558
+ }), S.dirs = o, S.ssrRoutes = pi(a), Z.info("page tree regenerated", {
2560
2559
  reason: n,
2561
- ms: Date.now() - r,
2560
+ ms: Date.now() - i,
2562
2561
  routes: S.ssrRoutes.length
2563
2562
  });
2564
2563
  } catch (e) {
2565
- X.error("page tree regen failed", { reason: n }, e);
2564
+ Z.error("page tree regen failed", { reason: n }, e);
2566
2565
  }
2567
- }, I = {
2566
+ }, R = {
2568
2567
  name: "framework:regenerate-on-page-tree-change",
2569
2568
  configureServer(t) {
2570
2569
  let n = null, r = [], i = (e) => {
2571
2570
  r.push(e), n && clearTimeout(n), n = setTimeout(() => {
2572
2571
  n = null;
2573
2572
  let e = r.length === 1 ? r[0] : `${r.length} events (${r[0]}, …)`;
2574
- r.length = 0, ne(e);
2573
+ r.length = 0, L(e);
2575
2574
  }, 50);
2576
2575
  };
2577
2576
  t.watcher.on("add", (t) => {
2578
- te(t) && i(`add ${p(e, t)}`);
2577
+ F(t) && i(`add ${m(e, t)}`);
2579
2578
  }), t.watcher.on("unlink", (t) => {
2580
- te(t) && i(`unlink ${p(e, t)}`);
2579
+ F(t) && i(`unlink ${m(e, t)}`);
2581
2580
  }), t.watcher.on("addDir", (t) => {
2582
- F(t) && i(`addDir ${p(e, t)}`);
2581
+ I(t) && i(`addDir ${m(e, t)}`);
2583
2582
  }), t.watcher.on("unlinkDir", (t) => {
2584
- F(t) && i(`unlinkDir ${p(e, t)}`);
2583
+ I(t) && i(`unlinkDir ${m(e, t)}`);
2585
2584
  });
2586
2585
  }
2587
- }, L = f(e, "app.config.ts"), R = (e) => {
2588
- if (!ue(e.env)) return "";
2586
+ }, z = p(e, "app.config.ts"), B = (e) => {
2587
+ if (!re(e.env)) return "";
2589
2588
  let t = Object.entries(e.env.vars).map(([e, t]) => `${e}:${t.access}`).sort();
2590
2589
  return `${String(e.env.publicPrefix)}|${t.join(",")}`;
2591
- }, re = (e, t) => {
2590
+ }, te = (e, t) => {
2592
2591
  let n = [];
2593
- 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"), R(e) !== R(t) && n.push("env"), n;
2594
- }, ie = t, ae = m(L), oe = {
2592
+ 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"), B(e) !== B(t) && n.push("env"), n;
2593
+ }, V = t, ne = h(z), H = {
2595
2594
  name: "framework:watch-app-config",
2596
2595
  async configureServer(t) {
2597
- t.watcher.add(L), X.info("watching app.config.ts for changes", { path: p(e, L) });
2596
+ t.watcher.add(z), Z.info("watching app.config.ts for changes", { path: m(e, z) });
2598
2597
  let n = async () => {
2599
2598
  try {
2600
2599
  try {
2601
- let e = t.moduleGraph.getModuleById(L);
2600
+ let e = t.moduleGraph.getModuleById(z);
2602
2601
  e && t.moduleGraph.invalidateModule(e);
2603
2602
  } catch {}
2604
- let e = (await t.ssrLoadModule(L, { fixStacktrace: !0 })).default;
2605
- return typeof e == "object" && e && "type" in e && e.type === "web" ? e : (X.warn("app.config.ts re-load returned wrong shape", { hasDefault: e !== void 0 }), null);
2603
+ let e = (await t.ssrLoadModule(z, { fixStacktrace: !0 })).default;
2604
+ 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);
2606
2605
  } catch (e) {
2607
- return X.warn("app.config.ts re-load failed — ignoring this change", {}, e), null;
2606
+ return Z.warn("app.config.ts re-load failed — ignoring this change", {}, e), null;
2608
2607
  }
2609
2608
  }, r = null, i = () => {
2610
2609
  r && clearTimeout(r), r = setTimeout(() => {
@@ -2613,24 +2612,24 @@ import {
2613
2612
  }, a = async () => {
2614
2613
  let r = await n();
2615
2614
  if (!r) {
2616
- X.info("app.config.ts onConfigChange: load returned null — skipping");
2615
+ Z.info("app.config.ts onConfigChange: load returned null — skipping");
2617
2616
  return;
2618
2617
  }
2619
- if (X.info("app.config.ts onConfigChange: loaded", {
2618
+ if (Z.info("app.config.ts onConfigChange: loaded", {
2620
2619
  theme: r.theme,
2621
2620
  port: r.port,
2622
2621
  name: r.name
2623
- }), JSON.stringify(r) === JSON.stringify(ie)) {
2624
- X.info("app.config.ts onConfigChange: parsed config unchanged — skipping (no-op edit?)");
2622
+ }), JSON.stringify(r) === JSON.stringify(V)) {
2623
+ Z.info("app.config.ts onConfigChange: parsed config unchanged — skipping (no-op edit?)");
2625
2624
  return;
2626
2625
  }
2627
- let i = re(ie, r);
2626
+ let i = te(V, r);
2628
2627
  if (i.length > 0) {
2629
- X.warn("app.config.ts changed — hard restart required", { fields: i });
2628
+ Z.warn("app.config.ts changed — hard restart required", { fields: i });
2630
2629
  try {
2631
2630
  await t.close();
2632
2631
  } catch {}
2633
- let e = _e(process.execPath, [...process.execArgv, ...process.argv.slice(1)], {
2632
+ let e = ue(process.execPath, [...process.execArgv, ...process.argv.slice(1)], {
2634
2633
  stdio: "inherit",
2635
2634
  env: process.env,
2636
2635
  cwd: process.cwd()
@@ -2640,57 +2639,57 @@ import {
2640
2639
  process.on("SIGINT", r), process.on("SIGTERM", a), e.on("exit", (e, t) => {
2641
2640
  process.off("SIGINT", r), process.off("SIGTERM", a), t ? process.kill(process.pid, t) : process.exit(e ?? 0);
2642
2641
  }), e.on("error", (e) => {
2643
- X.error("restart spawn failed", {}, e), process.exit(1);
2642
+ Z.error("restart spawn failed", {}, e), process.exit(1);
2644
2643
  });
2645
2644
  return;
2646
2645
  }
2647
2646
  try {
2648
2647
  let n = Date.now();
2649
- await $(e, r, await gi(e, r)), ie = r, t.ws && t.ws.send({
2648
+ await Ei(e, r, await bi(e, r)), V = r, t.ws && t.ws.send({
2650
2649
  type: "full-reload",
2651
2650
  path: "*"
2652
- }), X.info("app.config.ts soft-regen", {
2651
+ }), Z.info("app.config.ts soft-regen", {
2653
2652
  ms: Date.now() - n,
2654
2653
  reload: "full"
2655
2654
  });
2656
2655
  } catch (e) {
2657
- X.error("app.config.ts soft-regen failed", {}, e);
2656
+ Z.error("app.config.ts soft-regen failed", {}, e);
2658
2657
  }
2659
- }, o = (e) => l(e) === "app.config.ts" ? e === L || m(e) === ae : !1;
2658
+ }, o = (e) => u(e) === "app.config.ts" ? e === z || h(e) === ne : !1;
2660
2659
  t.watcher.on("change", (e) => {
2661
- o(e) && (X.info("app.config.ts change event (chokidar)", { file: e }), i());
2660
+ o(e) && (Z.info("app.config.ts change event (chokidar)", { file: e }), i());
2662
2661
  }), t.watcher.on("add", (e) => {
2663
- o(e) && (X.info("app.config.ts add event (chokidar)", { file: e }), i());
2662
+ o(e) && (Z.info("app.config.ts add event (chokidar)", { file: e }), i());
2664
2663
  });
2665
2664
  try {
2666
2665
  let { watchFile: e } = await import("node:fs");
2667
- e(L, { interval: 500 }, (e, t) => {
2668
- e.mtimeMs !== t.mtimeMs && (X.info("app.config.ts change event (poll)", { mtime: e.mtimeMs }), i());
2669
- }), X.info("app.config.ts polling watcher attached", { intervalMs: 500 });
2666
+ e(z, { interval: 500 }, (e, t) => {
2667
+ e.mtimeMs !== t.mtimeMs && (Z.info("app.config.ts change event (poll)", { mtime: e.mtimeMs }), i());
2668
+ }), Z.info("app.config.ts polling watcher attached", { intervalMs: 500 });
2670
2669
  } catch (e) {
2671
- X.warn("app.config.ts polling watcher could not attach", {}, e);
2670
+ Z.warn("app.config.ts polling watcher could not attach", {}, e);
2672
2671
  }
2673
- Ot(Tt, X, {
2672
+ _t(mt, Z, {
2674
2673
  root: e,
2675
2674
  onBeforeRestart: () => t.close()
2676
2675
  });
2677
2676
  }
2678
- }, se = /\/apps\/[^/]+\/.*\.(route|mutation|workflow|schema)\.tsx?$/, ce = {
2677
+ }, ie = /\/apps\/[^/]+\/.*\.(route|mutation|workflow|schema)\.tsx?$/, ae = {
2679
2678
  name: "framework:suppress-api-hmr",
2680
2679
  handleHotUpdate(e) {
2681
- if (se.test(e.file)) return [];
2680
+ if (ie.test(e.file)) return [];
2682
2681
  }
2683
- }, le = {
2682
+ }, oe = {
2684
2683
  name: "framework:reoptimize-on-rpcgroup-change",
2685
2684
  async configureServer(t) {
2686
2685
  let n = /* @__PURE__ */ new Map();
2687
- for (let r of u) {
2688
- if (!r.proxyTarget) continue;
2689
- let i = await di(e, r.pkg);
2690
- if (!i) continue;
2691
- let a = f(i, "rpcGroup.generated.ts");
2686
+ for (let i of r) {
2687
+ if (!i.proxyTarget) continue;
2688
+ let r = await hi(e, i.pkg);
2689
+ if (!r) continue;
2690
+ let a = p(r, "rpcGroup.generated.ts");
2692
2691
  try {
2693
- n.set(a, await A.readFile(a, "utf8"));
2692
+ n.set(a, await O.readFile(a, "utf8"));
2694
2693
  } catch {
2695
2694
  n.set(a, "");
2696
2695
  }
@@ -2699,105 +2698,105 @@ import {
2699
2698
  } catch {}
2700
2699
  }
2701
2700
  if (n.size === 0) return;
2702
- let r = null, i = !1, a = async () => {
2703
- if (i) return;
2701
+ let i = null, a = !1, o = async () => {
2702
+ if (a) return;
2704
2703
  let r = null;
2705
2704
  for (let [e, t] of n) {
2706
2705
  let i;
2707
2706
  try {
2708
- i = await A.readFile(e, "utf8");
2707
+ i = await O.readFile(e, "utf8");
2709
2708
  } catch {
2710
2709
  continue;
2711
2710
  }
2712
2711
  i !== t && (n.set(e, i), r = e);
2713
2712
  }
2714
2713
  if (r !== null) {
2715
- i = !0, X.info(`rpcGroup changed (${p(e, r)}) — re-bundling the api client + reloading (descriptor edits propagate automatically; no manual restart needed)`);
2714
+ a = !0, Z.info(`rpcGroup changed (${m(e, r)}) — re-bundling the api client + reloading (descriptor edits propagate automatically; no manual restart needed)`);
2716
2715
  try {
2717
- await A.rm(f(k, ".vite", "deps"), {
2716
+ await O.rm(p(A, ".vite", "deps"), {
2718
2717
  recursive: !0,
2719
2718
  force: !0
2720
2719
  }), await t.restart(!0);
2721
2720
  } catch (e) {
2722
- i = !1, X.error("rpcGroup re-optimize failed", {}, e);
2721
+ a = !1, Z.error("rpcGroup re-optimize failed", {}, e);
2723
2722
  }
2724
2723
  }
2725
- }, o = (e) => {
2726
- n.has(m(e)) && (r && clearTimeout(r), r = setTimeout(() => {
2727
- a();
2724
+ }, s = (e) => {
2725
+ n.has(h(e)) && (i && clearTimeout(i), i = setTimeout(() => {
2726
+ o();
2728
2727
  }, 120));
2729
2728
  };
2730
- t.watcher.on("change", o), t.watcher.on("add", o);
2729
+ t.watcher.on("change", s), t.watcher.on("add", s);
2731
2730
  }
2732
- }, z = {}, de = (e) => (t) => {
2731
+ }, U = {}, se = (e) => (t) => {
2733
2732
  t.on("proxyReq", (t, n) => {
2734
- Dn(t, n, {
2733
+ Cn(t, n, {
2735
2734
  target: e,
2736
2735
  token: process.env.VOLTRO_INSPECT_TOKEN,
2737
2736
  writeToken: process.env.VOLTRO_INSPECT_WRITE_TOKEN,
2738
- isLoopback: r
2737
+ isLoopback: o
2739
2738
  });
2740
2739
  });
2741
2740
  };
2742
- for (let e of u) {
2741
+ for (let e of r) {
2743
2742
  if (!e.proxyTarget) continue;
2744
- z[e.browserWsUrl] = {
2743
+ U[e.browserWsUrl] = {
2745
2744
  target: e.proxyTarget,
2746
2745
  ws: !0,
2747
2746
  changeOrigin: !0,
2748
2747
  ...e.wsPath ? {} : { rewrite: () => "/ws" }
2749
2748
  };
2750
2749
  let t = e.proxyTarget.replace(/^ws/, "http");
2751
- z[`/_voltro/api/${e.name}`] = {
2750
+ U[`/_voltro/api/${e.name}`] = {
2752
2751
  target: t,
2753
2752
  changeOrigin: !0,
2754
2753
  rewrite: (t) => t.replace(RegExp(`^/_voltro/api/${e.name}`), ""),
2755
- configure: de(t)
2754
+ configure: se(t)
2756
2755
  };
2757
2756
  }
2758
2757
  for (let [e, n] of Object.entries(t.proxies ?? {})) {
2759
- if (z[e]) {
2760
- X.warn("user proxy ignored — prefix already claimed by an api ws proxy", { prefix: e });
2758
+ if (U[e]) {
2759
+ Z.warn("user proxy ignored — prefix already claimed by an api ws proxy", { prefix: e });
2761
2760
  continue;
2762
2761
  }
2763
- z[e] = {
2762
+ U[e] = {
2764
2763
  target: n.target,
2765
2764
  changeOrigin: n.changeOrigin ?? !0,
2766
2765
  ...n.rewrite === void 0 ? {} : { rewrite: (t) => t.replace(RegExp(`^${e}`), n.rewrite) }
2767
- }, X.info(`proxy ${e} → ${n.target}`, {
2766
+ }, Z.info(`proxy ${e} → ${n.target}`, {
2768
2767
  prefix: e,
2769
2768
  target: n.target,
2770
2769
  ...n.rewrite === void 0 ? {} : { rewrite: n.rewrite }
2771
2770
  });
2772
2771
  }
2773
- let fe = {
2772
+ let ce = {
2774
2773
  name: "framework:inspect",
2775
- configureServer(l) {
2774
+ configureServer(r) {
2776
2775
  let u = null, d = async () => {
2777
2776
  if (u !== null) return u;
2778
2777
  let t = [];
2779
2778
  for (let n of b) try {
2780
- let r = await l.ssrLoadModule(f(e, "src", "pages", n.file));
2779
+ let i = await r.ssrLoadModule(p(e, "src", "pages", n.file));
2781
2780
  t.push({
2782
2781
  pattern: n.pattern,
2783
2782
  file: n.file,
2784
2783
  dirChain: n.dirChain,
2785
- renderMode: Jn(r, f("src", "pages", n.file)),
2786
- interactive: r.interactive ?? "full",
2787
- tenantAware: r.tenantAware === !0,
2788
- revalidateMs: K(r.revalidate),
2789
- staleWhileRevalidateMs: K(r.staleWhileRevalidate) ?? 0,
2790
- cacheInvalidatesOn: Array.isArray(r.cacheInvalidatesOn) ? r.cacheInvalidatesOn : [],
2791
- hasLoader: typeof r.loader == "function",
2792
- hasMeta: r.meta != null,
2793
- hasGetStaticPaths: typeof r.getStaticPaths == "function"
2784
+ renderMode: Wn(i, p("src", "pages", n.file)),
2785
+ interactive: i.interactive ?? "full",
2786
+ tenantAware: i.tenantAware === !0,
2787
+ revalidateMs: ct(i.revalidate),
2788
+ staleWhileRevalidateMs: ct(i.staleWhileRevalidate) ?? 0,
2789
+ cacheInvalidatesOn: Array.isArray(i.cacheInvalidatesOn) ? i.cacheInvalidatesOn : [],
2790
+ hasLoader: typeof i.loader == "function",
2791
+ hasMeta: i.meta != null,
2792
+ hasGetStaticPaths: typeof i.getStaticPaths == "function"
2794
2793
  });
2795
2794
  } catch (e) {
2796
- X.warn("inspect: failed to load page metadata", { pattern: n.pattern }, e);
2795
+ Z.warn("inspect: failed to load page metadata", { pattern: n.pattern }, e);
2797
2796
  }
2798
2797
  return u = t, t;
2799
2798
  };
2800
- l.middlewares.use((e, t, r) => {
2799
+ r.middlewares.use((e, t, r) => {
2801
2800
  let i = e.url ?? "/";
2802
2801
  if (i.startsWith("/_voltro/inspect") || i.startsWith("/api/dashboard/proxy")) return r();
2803
2802
  let a = Date.now(), o = t.end.bind(t);
@@ -2811,10 +2810,15 @@ import {
2811
2810
  } catch {}
2812
2811
  return o(...e);
2813
2812
  }), r();
2814
- }), t.name === "voltroDashboard" && l.middlewares.use(async (e, t, n) => {
2815
- let i = e.url ?? "", o = i.split("?")[0];
2816
- if (o === "/api/dashboard/proxy") {
2817
- let n = new URL(i, "http://x").searchParams.get("target");
2813
+ }), r.middlewares.use((t, n, r) => {
2814
+ if (t.method !== "GET" && t.method !== "HEAD") return r();
2815
+ let { pathname: i } = Or(t.url ?? "/");
2816
+ if (i !== "/robots.txt" || T(p(e, "public", "robots.txt"))) return r();
2817
+ n.statusCode = 200, n.setHeader("Content-Type", "text/plain; charset=utf-8"), n.end(Gt({ indexable: !1 }));
2818
+ }), t.name === "voltroDashboard" && r.middlewares.use(async (e, t, n) => {
2819
+ let r = e.url ?? "", i = r.split("?")[0];
2820
+ if (i === "/api/dashboard/proxy") {
2821
+ let n = new URL(r, "http://x").searchParams.get("target");
2818
2822
  if (!n) {
2819
2823
  t.statusCode = 400, t.end("missing ?target=");
2820
2824
  return;
@@ -2824,30 +2828,30 @@ import {
2824
2828
  return;
2825
2829
  }
2826
2830
  try {
2827
- let i = { accept: String(e.headers.accept ?? "application/json") };
2828
- e.headers.authorization ? i.authorization = String(e.headers.authorization) : r(n) && process.env.VOLTRO_INSPECT_TOKEN && (i.authorization = `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}`);
2829
- let a;
2831
+ let r = { accept: String(e.headers.accept ?? "application/json") };
2832
+ e.headers.authorization ? r.authorization = String(e.headers.authorization) : o(n) && process.env.VOLTRO_INSPECT_TOKEN && (r.authorization = `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}`);
2833
+ let i;
2830
2834
  if (e.method && e.method !== "GET" && e.method !== "HEAD") {
2831
2835
  let t = [];
2832
2836
  for await (let n of e) t.push(n);
2833
- a = Buffer.concat(t);
2837
+ i = Buffer.concat(t);
2834
2838
  let n = e.headers["content-type"];
2835
- n && (i["content-type"] = Array.isArray(n) ? n[0] : String(n));
2839
+ n && (r["content-type"] = Array.isArray(n) ? n[0] : String(n));
2836
2840
  }
2837
- let o = await fetch(n, {
2841
+ let a = await fetch(n, {
2838
2842
  redirect: "manual",
2839
2843
  ...e.method ? { method: e.method } : {},
2840
- headers: i,
2841
- ...a && a.length ? { body: new Uint8Array(a.buffer, a.byteOffset, a.byteLength) } : {}
2842
- }), s = Buffer.from(await o.arrayBuffer());
2843
- t.statusCode = o.status, t.setHeader("content-type", o.headers.get("content-type") ?? "application/octet-stream"), t.setHeader("content-length", String(s.length)), t.end(s);
2844
+ headers: r,
2845
+ ...i && i.length ? { body: new Uint8Array(i.buffer, i.byteOffset, i.byteLength) } : {}
2846
+ }), s = Buffer.from(await a.arrayBuffer());
2847
+ t.statusCode = a.status, t.setHeader("content-type", a.headers.get("content-type") ?? "application/octet-stream"), t.setHeader("content-length", String(s.length)), t.end(s);
2844
2848
  } catch (e) {
2845
2849
  t.statusCode = 502, t.end(`proxy error: ${e.message}`);
2846
2850
  }
2847
2851
  return;
2848
2852
  }
2849
- if (o === "/api/dashboard/proxy/stream") {
2850
- let n = new URL(i, "http://x").searchParams.get("target");
2853
+ if (i === "/api/dashboard/proxy/stream") {
2854
+ let n = new URL(r, "http://x").searchParams.get("target");
2851
2855
  if (!n) {
2852
2856
  t.statusCode = 400, t.end("missing ?target=");
2853
2857
  return;
@@ -2856,20 +2860,20 @@ import {
2856
2860
  t.statusCode = 400, t.end("target not allowed: must be loopback or an origin configured in VOLTRO_DASHBOARD_APPS");
2857
2861
  return;
2858
2862
  }
2859
- let o = new AbortController();
2860
- e.on("close", () => o.abort()), t.on("close", () => o.abort());
2863
+ let i = new AbortController();
2864
+ e.on("close", () => i.abort()), t.on("close", () => i.abort());
2861
2865
  try {
2862
- let i = await fetch(n, {
2866
+ let r = await fetch(n, {
2863
2867
  redirect: "manual",
2864
2868
  method: "GET",
2865
2869
  headers: {
2866
2870
  accept: "text/event-stream",
2867
- ...e.headers.authorization ? { authorization: String(e.headers.authorization) } : r(n) && process.env.VOLTRO_INSPECT_TOKEN ? { authorization: `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}` } : {}
2871
+ ...e.headers.authorization ? { authorization: String(e.headers.authorization) } : o(n) && process.env.VOLTRO_INSPECT_TOKEN ? { authorization: `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}` } : {}
2868
2872
  },
2869
- signal: o.signal
2873
+ signal: i.signal
2870
2874
  });
2871
- if (!i.ok || !i.body) {
2872
- t.statusCode = i.status, t.end(`upstream ${i.status}`);
2875
+ if (!r.ok || !r.body) {
2876
+ t.statusCode = r.status, t.end(`upstream ${r.status}`);
2873
2877
  return;
2874
2878
  }
2875
2879
  t.writeHead(200, {
@@ -2878,7 +2882,7 @@ import {
2878
2882
  connection: "keep-alive",
2879
2883
  "x-accel-buffering": "no"
2880
2884
  });
2881
- let a = i.body.getReader();
2885
+ let a = r.body.getReader();
2882
2886
  try {
2883
2887
  for (;;) {
2884
2888
  let { done: e, value: n } = await a.read();
@@ -2894,21 +2898,21 @@ import {
2894
2898
  return;
2895
2899
  }
2896
2900
  n();
2897
- }), l.middlewares.use(async (e, r, a) => {
2898
- let l = e.url ?? "";
2899
- if (!l.startsWith("/_voltro/inspect")) return a();
2901
+ }), r.middlewares.use(async (e, r, a) => {
2902
+ let o = e.url ?? "";
2903
+ if (!o.startsWith("/_voltro/inspect")) return a();
2900
2904
  let u = {};
2901
2905
  for (let [t, n] of Object.entries(e.headers ?? {})) n !== void 0 && (u[String(t).toLowerCase()] = Array.isArray(n) ? n.join(", ") : String(n));
2902
- let f = l.split("?")[0];
2903
- if (e.method === "GET" && (f === "/_voltro/inspect/logs" || l.startsWith("/_voltro/inspect/logs?"))) {
2904
- let e = c(u.origin), t = xn(l, on(), u);
2906
+ let f = o.split("?")[0];
2907
+ if (e.method === "GET" && (f === "/_voltro/inspect/logs" || o.startsWith("/_voltro/inspect/logs?"))) {
2908
+ let e = l(u.origin), t = _n(o, tn(), u);
2905
2909
  r.statusCode = t.status, r.setHeader("content-type", t.contentType);
2906
2910
  for (let [t, n] of Object.entries(e)) r.setHeader(t, n);
2907
2911
  r.end(t.body);
2908
2912
  return;
2909
2913
  }
2910
2914
  if (e.method === "POST" && f === "/_voltro/inspect/clientLog") {
2911
- let t = c(u.origin);
2915
+ let t = l(u.origin);
2912
2916
  if (i()) {
2913
2917
  r.statusCode = 503, r.setHeader("content-type", "application/json");
2914
2918
  for (let [e, n] of Object.entries(t)) r.setHeader(e, n);
@@ -2919,7 +2923,7 @@ import {
2919
2923
  e.setEncoding("utf-8"), e.on("data", (e) => {
2920
2924
  a += e;
2921
2925
  }), e.on("end", () => {
2922
- let e = hn(a, n);
2926
+ let e = dn(a, n);
2923
2927
  r.statusCode = e.status, r.setHeader("content-type", e.contentType);
2924
2928
  for (let [e, n] of Object.entries(t)) r.setHeader(e, n);
2925
2929
  r.end(e.body);
@@ -2929,14 +2933,14 @@ import {
2929
2933
  return;
2930
2934
  }
2931
2935
  if (f === "/_voltro/inspect/stream") {
2932
- let t = c(u.origin);
2936
+ let t = l(u.origin);
2933
2937
  if (i()) {
2934
2938
  r.statusCode = 503, r.setHeader("content-type", "application/json");
2935
2939
  for (let [e, n] of Object.entries(t)) r.setHeader(e, n);
2936
2940
  r.end(JSON.stringify({ error: "inspect disabled (VOLTRO_INSPECT=off)" }));
2937
2941
  return;
2938
2942
  }
2939
- let a = o(u, "GET");
2943
+ let a = s(u, "GET");
2940
2944
  if (!a.ok) {
2941
2945
  r.statusCode = 401, r.setHeader("content-type", "application/json");
2942
2946
  for (let [e, n] of Object.entries(t)) r.setHeader(e, n);
@@ -2949,15 +2953,15 @@ import {
2949
2953
  r.statusCode = 200, r.setHeader("content-type", "text/event-stream; charset=utf-8"), r.setHeader("cache-control", "no-cache, no-transform"), r.setHeader("connection", "keep-alive"), r.setHeader("x-accel-buffering", "no");
2950
2954
  for (let [e, n] of Object.entries(t)) r.setHeader(e, n);
2951
2955
  r.flushHeaders?.(), r.write("retry: 5000\n\n");
2952
- let s = l.indexOf("?");
2953
- if (!(s !== -1 && new URLSearchParams(l.slice(s + 1)).get("live") === "1")) for (let e of n.buffered()) r.write(Qt(e));
2956
+ let c = o.indexOf("?");
2957
+ if (!(c !== -1 && new URLSearchParams(o.slice(c + 1)).get("live") === "1")) for (let e of n.buffered()) r.write(Jt(e));
2954
2958
  let d = n.subscribe((e) => {
2955
2959
  try {
2956
- r.write(Qt(e));
2960
+ r.write(Jt(e));
2957
2961
  } catch {}
2958
2962
  }), f = setInterval(() => {
2959
2963
  try {
2960
- r.write($t());
2964
+ r.write(Yt());
2961
2965
  } catch {}
2962
2966
  }, 15e3), p = () => {
2963
2967
  clearInterval(f), d();
@@ -2966,11 +2970,11 @@ import {
2966
2970
  return;
2967
2971
  }
2968
2972
  try {
2969
- let n = s(l, {
2973
+ let n = c(o, {
2970
2974
  kind: "web",
2971
2975
  meta: {
2972
2976
  name: t.name ?? "(unnamed)",
2973
- voltroVersion: Ur,
2977
+ voltroVersion: qr,
2974
2978
  port: g,
2975
2979
  mode: "dev",
2976
2980
  apis: Object.entries(t.apis ?? {}).map(([e, t]) => {
@@ -2982,13 +2986,13 @@ import {
2982
2986
  })
2983
2987
  },
2984
2988
  routes: await d(),
2985
- dirs: C,
2989
+ dirs: w,
2986
2990
  cache: () => ({
2987
2991
  backend: "memory",
2988
2992
  size: 0,
2989
2993
  entries: []
2990
2994
  }),
2991
- env: () => _t(t.name ?? "app", { contract: ue(t.env) ? t.env : void 0 })
2995
+ env: () => at(t.name ?? "app", { contract: re(t.env) ? t.env : void 0 })
2992
2996
  }, u, { method: e.method ?? "GET" });
2993
2997
  if (n === null) return a();
2994
2998
  r.statusCode = n.status, r.setHeader("content-type", n.contentType);
@@ -2999,363 +3003,397 @@ import {
2999
3003
  }
3000
3004
  });
3001
3005
  }
3002
- }, pe = t.name === "voltroDashboard" ? {
3006
+ }, W = t.name === "voltroDashboard" ? {
3003
3007
  name: "framework:dashboard-registry",
3004
3008
  configureServer(e) {
3005
3009
  e.middlewares.use(async (e, t, n) => {
3006
3010
  if (!(e.url ?? "").startsWith("/api/dashboard/registry")) return n();
3007
3011
  try {
3008
- let e = await tt();
3012
+ let e = await Ue();
3009
3013
  t.statusCode = 200, t.setHeader("content-type", "application/json; charset=utf-8"), t.end(JSON.stringify(e));
3010
3014
  } catch (e) {
3011
3015
  t.statusCode = 500, t.setHeader("content-type", "text/plain"), t.end(`registry read error: ${e.message}`);
3012
3016
  }
3013
3017
  });
3014
3018
  }
3015
- } : null, me = /* @__PURE__ */ new Set(), he = (e, t, n, r, i) => {
3016
- if (X.error(`${t} render failed`, {
3019
+ } : null, de = /* @__PURE__ */ new Set(), fe = (e, t, n, r, i) => {
3020
+ if (Z.error(`${t} render failed`, {
3017
3021
  pathname: n,
3018
- pattern: r
3019
- }, i), e.headersSent) {
3022
+ pattern: r,
3023
+ cause: Ar(i)
3024
+ }), e.headersSent) {
3020
3025
  e.end();
3021
3026
  return;
3022
3027
  }
3023
3028
  e.writeHead(500, {
3024
3029
  "content-type": "text/plain; charset=utf-8",
3025
3030
  "x-voltro-rendered-by": `${t}-failed`
3026
- });
3027
- let a = i instanceof Error ? i.stack ?? i.message : String(i);
3028
- e.end(`${t} render failed for ${n}\n\n${a}\n`);
3029
- }, B = Lt(), ve = zt({
3030
- limit: B,
3031
- onColdStart: (e) => X.debug("ssr cold-compile start", { id: e }),
3032
- onColdEnd: (e, { durationMs: t, failed: n }) => X.debug(`ssr cold-compile ${n ? "FAILED" : "end"} ${t}ms`, {
3031
+ }), e.end(`${t} render failed for ${n}\n\n${Ar(i)}\n`);
3032
+ }, pe = Dt(), me = kt({
3033
+ limit: pe,
3034
+ onColdStart: (e) => Z.debug("ssr cold-compile start", { id: e }),
3035
+ onColdEnd: (e, { durationMs: t, failed: n }) => Z.debug(`ssr cold-compile ${n ? "FAILED" : "end"} ${t}ms`, {
3033
3036
  id: e,
3034
3037
  ms: t,
3035
3038
  ...n ? { failed: !0 } : {}
3036
3039
  })
3037
3040
  });
3038
- X.debug(`ssr cold-compile concurrency ${B}`, { concurrency: B });
3039
- let ye = null, be = async () => (ye === null && (ye = await A.readFile(f(e, ".framework", "index.html"), "utf8")), ye), xe = {
3041
+ Z.debug(`ssr cold-compile concurrency ${pe}`, { concurrency: pe });
3042
+ let he = null, ge = async () => (he === null && (he = await O.readFile(p(e, ".framework", "index.html"), "utf8")), he), _e = {
3040
3043
  name: "framework:ssr",
3041
- configureServer(t) {
3042
- let n = (e) => ve.load(e, async () => await t.ssrLoadModule(e));
3043
- t.middlewares.use(async (r, i, a) => {
3044
- if (r.method !== "GET" && r.method !== "HEAD") return a();
3045
- let o = r.url ?? "/";
3046
- o.indexOf("?");
3047
- let { pathname: s, search: c } = Mr(o);
3048
- if (s.startsWith("/@") || s.startsWith("/node_modules/") || s.startsWith("/.framework/") || s.startsWith("/_voltro/") || s === "/main.tsx" || s === "/index.html" || s === "/sw.js" || s === "/favicon.ico" || s === "/robots.txt" || /\.[a-z0-9]+$/i.test(s)) return a();
3049
- let l = ui(s, S.ssrRoutes);
3050
- if (!l) return a();
3051
- let d = !me.has(l.route.pattern), p = Date.now();
3052
- d && X.info(`ssr compiling ${l.route.pattern}`, {
3053
- pattern: l.route.pattern,
3054
- pathname: s
3044
+ configureServer(n) {
3045
+ let i = (e) => me.load(e, async () => await n.ssrLoadModule(e)), a, o = () => {
3046
+ if (a !== void 0) return a;
3047
+ let n = t.locales ?? [], r = t.defaultLocale ?? n[0] ?? "en";
3048
+ return n.length === 0 ? (a = Promise.resolve(() => void 0), a) : (a = (async () => {
3049
+ let [{ makeSsgWrap: t }, { makeSsrI18nResolver: a }] = await Promise.all([i("@voltro/i18n"), i("@voltro/i18n/server")]), o = {};
3050
+ for (let a of n) if (T(p(e, "src", "locales", `${a}.ts`))) try {
3051
+ let n = (await i(p(e, "src", "locales", `${a}.ts`))).default;
3052
+ n !== void 0 && (o[a] = t(a, n, r));
3053
+ } catch (e) {
3054
+ Z.warn("locale catalog failed to load for SSR", { locale: a }, e);
3055
+ }
3056
+ return a({
3057
+ wraps: o,
3058
+ supported: n,
3059
+ defaultLocale: r
3060
+ });
3061
+ })(), a);
3062
+ };
3063
+ n.middlewares.use(async (a, s, c) => {
3064
+ if (a.method !== "GET" && a.method !== "HEAD") return c();
3065
+ let l = a.url ?? "/";
3066
+ l.indexOf("?");
3067
+ let { pathname: u, search: d } = Or(l);
3068
+ 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 c();
3069
+ let f = mi(u, S.ssrRoutes);
3070
+ if (!f) return c();
3071
+ let m = !de.has(f.route.pattern), h = Date.now();
3072
+ m && Z.info(`ssr compiling ${f.route.pattern}`, {
3073
+ pattern: f.route.pattern,
3074
+ pathname: u
3055
3075
  });
3056
- let m = {}, h = async (e, t) => {
3076
+ let g = {}, _ = async (e, t) => {
3057
3077
  let n = Date.now(), r = await t();
3058
- return m[e] = (m[e] ?? 0) + (Date.now() - n), r;
3059
- }, g = async (e, n, r) => {
3060
- let i = await t.moduleGraph.getModuleById(e);
3061
- if (!(!i || n.has(e))) {
3062
- if (n.add(e), i.id && /\.(css|sass|scss|less|stylus|pcss|postcss)(\?|$)/.test(i.id)) {
3078
+ return g[e] = (g[e] ?? 0) + (Date.now() - n), r;
3079
+ }, v = async (e, t, r) => {
3080
+ let i = await n.moduleGraph.getModuleById(e);
3081
+ if (!(!i || t.has(e))) {
3082
+ if (t.add(e), i.id && /\.(css|sass|scss|less|stylus|pcss|postcss)(\?|$)/.test(i.id)) {
3063
3083
  let e = i.url.replace(/\?.*$/, "");
3064
3084
  r.includes(e) || r.push(e);
3065
3085
  return;
3066
3086
  }
3067
- for (let e of i.importedModules ?? []) e.id && await g(e.id, n, r);
3087
+ for (let e of i.importedModules ?? []) e.id && await v(e.id, t, r);
3068
3088
  }
3069
3089
  };
3070
3090
  try {
3071
- let _ = await h("loadPage", async () => await n(f(e, "src", "pages", l.route.file))), v = Jn(_, f("src", "pages", l.route.file)), y = ii(S.dirs, l.route.dirChain), b = v === "spa" && y.some((e) => e.hasLayout);
3072
- if (v !== "ssr" && v !== "isr" && !b) return a();
3073
- let x = {};
3074
- for (let [e, t] of Object.entries(r.headers ?? {})) typeof t == "string" ? x[e] = t : Array.isArray(t) && (x[e] = t.join(", "));
3075
- let C = xi(bi(u[0], { allowDevProxy: !0 }), x.cookie, { apiName: u[0]?.name }), w = new AbortController(), T = () => w.abort();
3076
- i.once("close", T);
3077
- let E = null, ee = [], D = {};
3091
+ let y = await _("loadPage", async () => await i(p(e, "src", "pages", f.route.file))), b = Wn(y, p("src", "pages", f.route.file)), x = ci(S.dirs, f.route.dirChain), C = b === "spa" && x.some((e) => e.hasLayout);
3092
+ if (b !== "ssr" && b !== "isr" && !C) return c();
3093
+ let w = {};
3094
+ for (let [e, t] of Object.entries(a.headers ?? {})) typeof t == "string" ? w[e] = t : Array.isArray(t) && (w[e] = t.join(", "));
3095
+ let T = Ti(wi(r[0], { allowDevProxy: !0 }), w.cookie, { apiName: r[0]?.name }), E = new AbortController(), D = () => E.abort();
3096
+ s.once("close", D);
3097
+ let O = null, ee = [], k = {};
3078
3098
  try {
3079
- (await n("@voltro/web/ssr")).beginStoreSeeds(), {chain: ee, segmentLoaderData: D} = await h("loadChain", () => ai({
3080
- entries: y,
3081
- loadLayout: (t) => n(f(e, "src", "pages", t.dir, "layout.tsx")),
3082
- loadError: (t) => n(f(e, "src", "pages", t.dir, "error.tsx")),
3083
- loadPending: (t) => n(f(e, "src", "pages", t.dir, "loading.tsx")),
3099
+ (await i("@voltro/web/ssr")).beginStoreSeeds(), {chain: ee, segmentLoaderData: k} = await _("loadChain", () => li({
3100
+ entries: x,
3101
+ loadLayout: (t) => i(p(e, "src", "pages", t.dir, "layout.tsx")),
3102
+ loadError: (t) => i(p(e, "src", "pages", t.dir, "error.tsx")),
3103
+ loadPending: (t) => i(p(e, "src", "pages", t.dir, "loading.tsx")),
3084
3104
  ctx: {
3085
- params: l.params,
3086
- pathname: s,
3087
- search: c,
3088
- signal: w.signal,
3089
- headers: x,
3090
- query: C
3105
+ params: f.params,
3106
+ pathname: u,
3107
+ search: d,
3108
+ signal: E.signal,
3109
+ headers: w,
3110
+ query: T
3091
3111
  }
3092
3112
  }));
3093
- let t = _.loader;
3094
- typeof t == "function" && !b && (E = await h("loader", () => t({
3095
- params: l.params,
3096
- pathname: s,
3097
- search: c,
3098
- signal: w.signal,
3099
- headers: x,
3100
- query: C
3113
+ let t = y.loader;
3114
+ typeof t == "function" && !C && (O = await _("loader", () => t({
3115
+ params: f.params,
3116
+ pathname: u,
3117
+ search: d,
3118
+ signal: E.signal,
3119
+ headers: w,
3120
+ query: T
3101
3121
  })));
3102
3122
  } finally {
3103
- i.off("close", T);
3123
+ s.off("close", D);
3104
3124
  }
3105
- let O = await h("loadSsrHelpers", async () => await n("@voltro/web/ssr")), k = {
3106
- pattern: l.route.pattern,
3107
- Component: _.default,
3108
- meta: _.meta,
3109
- loader: _.loader,
3110
- ErrorBoundary: _.ErrorBoundary,
3111
- Pending: _.Pending,
3112
- renderMode: v,
3125
+ let A = await _("loadSsrHelpers", async () => await i("@voltro/web/ssr"));
3126
+ C || await Gr({
3127
+ pageMod: y,
3128
+ params: f.params,
3129
+ query: T,
3130
+ apiName: r[0]?.name,
3131
+ seed: A.seedPreloadedSubscription,
3132
+ onError: ({ tag: e, apiName: t }, n) => Z.warn("preload seed failed", {
3133
+ tag: e,
3134
+ apiName: t,
3135
+ pathname: u
3136
+ }, n)
3137
+ });
3138
+ let j = {
3139
+ pattern: f.route.pattern,
3140
+ Component: y.default,
3141
+ meta: y.meta,
3142
+ loader: y.loader,
3143
+ ErrorBoundary: y.ErrorBoundary,
3144
+ Pending: y.Pending,
3145
+ renderMode: b,
3113
3146
  chain: ee
3114
- }, A = {
3115
- cookies: O.parseCookieHeader(x.cookie),
3116
- headers: x,
3117
- url: o
3118
- }, j = _.interactive ?? "full", M = b ? kr({
3119
- helpers: O,
3120
- page: `src/pages/${l.route.file}`,
3121
- interactive: j,
3147
+ }, M = {
3148
+ cookies: A.parseCookieHeader(w.cookie),
3149
+ headers: w,
3150
+ url: l
3151
+ }, N = y.interactive ?? "full", P = (await o())(w.cookie, w["accept-language"]), F = P ? {
3152
+ outerWrap: P.outerWrap,
3153
+ locale: P.locale
3154
+ } : {}, I = C ? Tr({
3155
+ helpers: A,
3156
+ page: `src/pages/${f.route.file}`,
3157
+ interactive: N,
3122
3158
  delivery: "stream",
3123
3159
  renderInput: {
3124
- descriptor: k,
3125
- params: l.params,
3126
- pathname: s,
3127
- segmentLoaderData: D,
3128
- requestContext: A
3160
+ descriptor: j,
3161
+ params: f.params,
3162
+ pathname: u,
3163
+ segmentLoaderData: k,
3164
+ requestContext: M,
3165
+ ...F
3129
3166
  }
3130
- }) : null, N = b ? null : Or({
3131
- helpers: O,
3132
- page: `src/pages/${l.route.file}`,
3133
- pathname: s,
3134
- renderMode: v,
3135
- interactive: j,
3136
- loaderData: E,
3137
- segmentLoaderData: D,
3138
- pageLoaderRan: typeof _.loader == "function"
3139
- }), P = [];
3140
- await h("collectCss", async () => {
3167
+ }) : null, L = C ? null : wr({
3168
+ helpers: A,
3169
+ page: `src/pages/${f.route.file}`,
3170
+ pathname: u,
3171
+ renderMode: b,
3172
+ interactive: N,
3173
+ loaderData: O,
3174
+ segmentLoaderData: k,
3175
+ pageLoaderRan: typeof y.loader == "function"
3176
+ }), R = [];
3177
+ await _("collectCss", async () => {
3141
3178
  let t = /* @__PURE__ */ new Set(), n = [
3142
- f(e, "src", "pages", l.route.file),
3143
- ...y.flatMap((t) => [
3144
- ...t.hasLayout ? [f(e, "src", "pages", t.dir, "layout.tsx")] : [],
3145
- ...t.hasError ? [f(e, "src", "pages", t.dir, "error.tsx")] : [],
3146
- ...t.hasPending ? [f(e, "src", "pages", t.dir, "loading.tsx")] : []
3179
+ p(e, "src", "pages", f.route.file),
3180
+ ...x.flatMap((t) => [
3181
+ ...t.hasLayout ? [p(e, "src", "pages", t.dir, "layout.tsx")] : [],
3182
+ ...t.hasError ? [p(e, "src", "pages", t.dir, "error.tsx")] : [],
3183
+ ...t.hasPending ? [p(e, "src", "pages", t.dir, "loading.tsx")] : []
3147
3184
  ]),
3148
- f(e, ".framework", "main.tsx")
3185
+ p(e, ".framework", "main.tsx")
3149
3186
  ];
3150
- for (let e of n) await g(e, t, P);
3187
+ for (let e of n) await v(e, t, R);
3151
3188
  });
3152
- let te = await h("readShell", be), F = await h("transformShell", () => t.transformIndexHtml(o, te)), ne = P.map((e) => `<link rel="stylesheet" href="${e}?direct" />`).join("\n "), I = A.cookies["voltro:locale"] ?? "en", L = Date.now();
3153
- if (M) {
3154
- let e = (e) => jr({
3155
- helpers: O,
3156
- prepared: M,
3189
+ let z = await _("readShell", ge), B = await _("transformShell", () => n.transformIndexHtml(l, z)), te = R.map((e) => `<link rel="stylesheet" href="${e}?direct" />`).join("\n "), V = P?.locale ?? M.cookies["voltro:lang"] ?? t.defaultLocale ?? (t.locales ?? [])[0] ?? "en", ne = Date.now();
3190
+ if (I) {
3191
+ let e = (e) => Dr({
3192
+ helpers: A,
3193
+ prepared: I,
3157
3194
  meta: e,
3158
- interactive: j,
3159
- extra: [ne]
3195
+ interactive: N,
3196
+ extra: [te]
3160
3197
  });
3161
- if (M.hasDeferred) Vr({
3162
- res: i,
3163
- shell: zr({
3164
- shell: F,
3198
+ if (I.hasDeferred) Hr({
3199
+ res: s,
3200
+ shell: Br({
3201
+ shell: B,
3165
3202
  inlineModuleScriptsAsync: !0
3166
3203
  }),
3167
- htmlLang: I,
3204
+ htmlLang: V,
3168
3205
  headers: {
3169
3206
  "content-type": "text/html; charset=utf-8",
3170
3207
  "x-voltro-rendered-by": "spa-shell-dev"
3171
3208
  },
3172
3209
  headInjection: e,
3173
- render: (e) => O.renderPageToStream({
3174
- ...M.renderInput,
3210
+ render: (e) => A.renderPageToStream({
3211
+ ...I.renderInput,
3175
3212
  ...e
3176
3213
  }),
3177
3214
  onShellError: (e) => {
3178
- he(i, "spa-shell-dev", s, l.route.pattern, e);
3215
+ fe(s, "spa-shell-dev", u, f.route.pattern, e);
3179
3216
  }
3180
3217
  });
3181
3218
  else {
3182
- let t = Ar({
3183
- helpers: O,
3184
- prepared: M
3185
- }), n = F.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="${I}"`);
3186
- i.statusCode = 200, i.setHeader("content-type", "text/html; charset=utf-8"), i.setHeader("x-voltro-rendered-by", "spa-shell-dev"), i.end(n);
3219
+ let t = Er({
3220
+ helpers: A,
3221
+ prepared: I
3222
+ }), n = B.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="${V}"`);
3223
+ s.statusCode = 200, s.setHeader("content-type", "text/html; charset=utf-8"), s.setHeader("x-voltro-rendered-by", "spa-shell-dev"), s.end(n);
3187
3224
  }
3188
- } else if (N) {
3225
+ } else if (L) {
3189
3226
  let e = (e) => [
3190
- ne,
3191
- O.renderMetaToHtml(e),
3192
- `<meta name="voltro-interactive" content="${j}" />`,
3193
- ...N.hasDeferred ? [O.renderDeferredRegistryScript()] : [],
3194
- O.renderRouterStateScript(N.stateInput)
3227
+ te,
3228
+ A.renderMetaToHtml(e),
3229
+ `<meta name="voltro-interactive" content="${N}" />`,
3230
+ ...L.hasDeferred ? [A.renderDeferredRegistryScript()] : [],
3231
+ A.renderRouterStateScript(L.stateInput)
3195
3232
  ].filter((e) => e.length > 0).join("\n "), t = {
3196
- descriptor: k,
3197
- params: l.params,
3198
- pathname: s,
3199
- loaderData: N.loaderData,
3200
- segmentLoaderData: N.segmentLoaderData,
3201
- requestContext: A
3233
+ descriptor: j,
3234
+ params: f.params,
3235
+ pathname: u,
3236
+ loaderData: L.loaderData,
3237
+ segmentLoaderData: L.segmentLoaderData,
3238
+ requestContext: M,
3239
+ ...F
3202
3240
  };
3203
- if (v === "ssr" && j === "full") Vr({
3204
- res: i,
3205
- shell: zr({
3206
- shell: F,
3241
+ if (b === "ssr" && N === "full") Hr({
3242
+ res: s,
3243
+ shell: Br({
3244
+ shell: B,
3207
3245
  inlineModuleScriptsAsync: !0
3208
3246
  }),
3209
- htmlLang: I,
3247
+ htmlLang: V,
3210
3248
  headers: {
3211
3249
  "content-type": "text/html; charset=utf-8",
3212
3250
  "x-voltro-rendered-by": "ssr-dev"
3213
3251
  },
3214
3252
  headInjection: e,
3215
- render: (e) => O.renderPageToStream({
3253
+ render: (e) => A.renderPageToStream({
3216
3254
  ...t,
3217
3255
  ...e
3218
3256
  }),
3219
3257
  onShellError: (e) => {
3220
- he(i, "ssr-dev", s, l.route.pattern, e);
3258
+ fe(s, "ssr-dev", u, f.route.pattern, e);
3221
3259
  }
3222
3260
  });
3223
3261
  else {
3224
- let { html: n, meta: r } = O.renderPageToHtml(t), a = F.replace("<div id=\"root\"></div>", `<div id="root">${n}</div>`).replace("</head>", ` ${e(r)}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${I}"`);
3225
- i.statusCode = 200, i.setHeader("content-type", "text/html; charset=utf-8"), i.setHeader("x-voltro-rendered-by", "ssr-dev"), i.end(a);
3262
+ let { html: n, meta: r } = A.renderPageToHtml(t), i = B.replace("<div id=\"root\"></div>", `<div id="root">${n}</div>`).replace("</head>", ` ${e(r)}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${V}"`);
3263
+ s.statusCode = 200, s.setHeader("content-type", "text/html; charset=utf-8"), s.setHeader("x-voltro-rendered-by", "ssr-dev"), s.end(i);
3226
3264
  }
3227
3265
  }
3228
- m.render = Date.now() - L;
3229
- let R = Date.now() - p;
3230
- d ? (me.add(l.route.pattern), X.info(`ssr compiled ${l.route.pattern} in ${R}ms`, {
3231
- pattern: l.route.pattern,
3232
- pathname: s,
3233
- elapsedMs: R,
3266
+ g.render = Date.now() - ne;
3267
+ let H = Date.now() - h;
3268
+ m ? (de.add(f.route.pattern), Z.info(`ssr compiled ${f.route.pattern} in ${H}ms`, {
3269
+ pattern: f.route.pattern,
3270
+ pathname: u,
3271
+ elapsedMs: H,
3234
3272
  cold: !0,
3235
- phases: m
3236
- })) : R > 200 && X.info(`ssr rendered ${s} in ${R}ms`, {
3237
- pattern: l.route.pattern,
3238
- pathname: s,
3239
- elapsedMs: R,
3273
+ phases: g
3274
+ })) : H > 200 && Z.info(`ssr rendered ${u} in ${H}ms`, {
3275
+ pattern: f.route.pattern,
3276
+ pathname: u,
3277
+ elapsedMs: H,
3240
3278
  cold: !1,
3241
- phases: m
3279
+ phases: g
3242
3280
  });
3243
3281
  } catch (e) {
3244
- if (Er(e)) {
3245
- X.error("ssr-dev render refused", {
3246
- pathname: s,
3247
- pattern: l.route.pattern
3248
- }, e), i.statusCode = 500, i.setHeader("content-type", "text/plain; charset=utf-8"), i.end(e.message);
3282
+ if (Sr(e)) {
3283
+ Z.error("ssr-dev render refused", {
3284
+ pathname: u,
3285
+ pattern: f.route.pattern
3286
+ }, e), s.statusCode = 500, s.setHeader("content-type", "text/plain; charset=utf-8"), s.end(e.message);
3249
3287
  return;
3250
3288
  }
3251
- let t = Dr(e);
3289
+ let t = Cr(e);
3252
3290
  if (t) {
3253
- i.statusCode = t.status;
3254
- for (let [e, n] of Object.entries(t.headers)) i.setHeader(e, String(n));
3255
- i.end(t.body);
3291
+ s.statusCode = t.status;
3292
+ for (let [e, n] of Object.entries(t.headers)) s.setHeader(e, String(n));
3293
+ s.end(t.body);
3256
3294
  return;
3257
3295
  }
3258
- he(i, "ssr-dev", s, l.route.pattern, e);
3296
+ fe(s, "ssr-dev", u, f.route.pattern, e);
3259
3297
  }
3260
3298
  });
3261
3299
  }
3262
- }, V = Date.now(), Se = T.version ?? "?", H = await Wr(), Ce = f(e, "node_modules", "@voltro", "ui-shadcn"), U = D(f(Ce, "package.json")) ? Ce : null, we = [], Te = await (async () => {
3300
+ }, G = Date.now(), ve = D.version ?? "?", K = await Jr(), q = p(e, "node_modules", "@voltro", "ui-shadcn"), J = T(p(q, "package.json")) ? q : null, ye = [], be = await (async () => {
3263
3301
  let t = [];
3264
- for (let n of u) {
3302
+ for (let n of r) {
3265
3303
  if (!n.proxyTarget) continue;
3266
- let r = await di(e, n.pkg);
3304
+ let r = await hi(e, n.pkg);
3267
3305
  if (r) try {
3268
- t.push(await A.readFile(f(r, "rpcGroup.generated.ts"), "utf8"));
3306
+ t.push(await O.readFile(p(r, "rpcGroup.generated.ts"), "utf8"));
3269
3307
  } catch {}
3270
3308
  }
3271
3309
  if (t.length === 0) return !1;
3272
- let n = ge("sha1").update(t.join("\0")).digest("hex"), r = f(k, ".voltro-rpcgroup-optimize"), i = "";
3310
+ let n = le("sha1").update(t.join("\0")).digest("hex"), i = p(A, ".voltro-rpcgroup-optimize"), a = "";
3273
3311
  try {
3274
- i = (await A.readFile(r, "utf8")).trim();
3312
+ a = (await O.readFile(i, "utf8")).trim();
3275
3313
  } catch {}
3276
- if (i === n) return !1;
3314
+ if (a === n) return !1;
3277
3315
  try {
3278
- await A.writeFile(r, n);
3316
+ await O.writeFile(i, n);
3279
3317
  } catch {}
3280
3318
  return !0;
3281
3319
  })();
3282
- Te && X.info("rpcGroup changed since last boot — forcing a dep re-optimize so the browser loads the current api client"), await (await T.createServer({
3283
- root: k,
3320
+ be && Z.info("rpcGroup changed since last boot — forcing a dep re-optimize so the browser loads the current api client"), await (await D.createServer({
3321
+ root: A,
3284
3322
  envPrefix: "__VOLTRO_VITE_ENV_DISABLED__",
3285
3323
  ssr: { noExternal: ["react-intl"] },
3286
3324
  resolve: {
3287
3325
  dedupe: ["react", "react-dom"],
3288
3326
  alias: [
3289
- ...H ? [{
3327
+ ...K ? [{
3290
3328
  find: "@voltro/devtools/styles.css",
3291
- replacement: f(H, "src/styles.css")
3329
+ replacement: p(K, "src/styles.css")
3292
3330
  }, {
3293
3331
  find: "@voltro/devtools",
3294
- replacement: f(H, "src/index.ts")
3332
+ replacement: p(K, "src/index.ts")
3295
3333
  }] : [],
3296
- ...U ? [
3334
+ ...J ? [
3297
3335
  {
3298
3336
  find: "@voltro/ui-shadcn/tokens.css",
3299
- replacement: f(U, "src/tokens.css")
3337
+ replacement: p(J, "src/tokens.css")
3300
3338
  },
3301
3339
  {
3302
3340
  find: "@voltro/ui-shadcn/cn",
3303
- replacement: f(U, "src/cn.ts")
3341
+ replacement: p(J, "src/cn.ts")
3304
3342
  },
3305
3343
  {
3306
3344
  find: "@voltro/ui-shadcn/brand",
3307
- replacement: f(U, "src/brand/voltroLogo.tsx")
3345
+ replacement: p(J, "src/brand/voltroLogo.tsx")
3308
3346
  },
3309
3347
  {
3310
3348
  find: "@voltro/ui-shadcn",
3311
- replacement: f(U, "src/index.ts")
3349
+ replacement: p(J, "src/index.ts")
3312
3350
  }
3313
3351
  ] : [],
3314
- ...ot(e)
3352
+ ...Je(e)
3315
3353
  ]
3316
3354
  },
3317
3355
  optimizeDeps: {
3318
- include: [...u.map((e) => `${e.pkg}/rpcGroup`), ...we],
3319
- force: Te
3356
+ include: [...r.map((e) => `${e.pkg}/rpcGroup`), ...ye],
3357
+ force: be
3320
3358
  },
3321
- customLogger: It(),
3359
+ customLogger: Et(),
3322
3360
  plugins: [
3323
- Hn(f(e, "src", "pages")),
3361
+ Rn(p(e, "src", "pages")),
3324
3362
  ee(),
3325
- O(),
3363
+ k(),
3326
3364
  N,
3327
- I,
3365
+ R,
3366
+ H,
3367
+ ae,
3328
3368
  oe,
3329
3369
  ce,
3330
- le,
3331
- fe,
3332
- xe,
3333
- ...pe ? [pe] : []
3370
+ _e,
3371
+ ...W ? [W] : []
3334
3372
  ],
3335
3373
  server: {
3336
3374
  port: g,
3337
3375
  strictPort: !0,
3338
3376
  host: !0,
3339
3377
  allowedHosts: t.allowedHosts === !0 || [...t.allowedHosts ?? []],
3340
- proxy: z,
3341
- fs: { allow: [e, ...Xr(e)] }
3378
+ proxy: U,
3379
+ fs: { allow: [e, ...ei(e)] }
3342
3380
  },
3343
3381
  appType: "spa",
3344
- cacheDir: f(k, ".vite"),
3345
- publicDir: f(e, "public")
3346
- })).listen(), Hr.info(`v${Se} ready in ${Date.now() - V}ms`, {
3347
- version: Se,
3348
- bootMs: Date.now() - V
3349
- }), X.info(`listening on http://localhost:${g}`, {
3382
+ cacheDir: p(A, ".vite"),
3383
+ publicDir: p(e, "public")
3384
+ })).listen(), Kr.info(`v${ve} ready in ${Date.now() - G}ms`, {
3385
+ version: ve,
3386
+ bootMs: Date.now() - G
3387
+ }), Z.info(`listening on http://localhost:${g}`, {
3350
3388
  port: g,
3351
3389
  app: t.name ?? "(unnamed)"
3352
3390
  });
3353
- for (let e of u) e.proxyTarget && (X.info(`proxy /ws/${e.name} → ${e.proxyTarget}`, {
3391
+ for (let e of r) e.proxyTarget && (Z.info(`proxy /ws/${e.name} → ${e.proxyTarget}`, {
3354
3392
  api: e.name,
3355
3393
  target: e.proxyTarget
3356
- }), X.info(`proxy /_voltro/api/${e.name} → ${e.proxyTarget.replace(/^ws/, "http")}/_voltro/inspect`, { api: e.name }));
3394
+ }), Z.info(`proxy /_voltro/api/${e.name} → ${e.proxyTarget.replace(/^ws/, "http")}/_voltro/inspect`, { api: e.name }));
3357
3395
  try {
3358
- await nt({
3396
+ await We({
3359
3397
  id: v,
3360
3398
  name: _,
3361
3399
  kind: "web",
@@ -3364,13 +3402,13 @@ import {
3364
3402
  status: "live",
3365
3403
  logFile: y.path
3366
3404
  });
3367
- let t = mr(e);
3405
+ let t = ur(e);
3368
3406
  if (t) {
3369
- let e = await wr({ dashboardAppPath: t });
3370
- e.status === "launched" ? X.info(`dashboard launched at http://localhost:${e.port}`, { port: e.port }) : e.status === "already-running" && X.debug(`dashboard already running on :${e.port}`, { port: e.port });
3407
+ let e = await br({ dashboardAppPath: t });
3408
+ e.status === "launched" ? Z.info(`dashboard launched at http://localhost:${e.port}`, { port: e.port }) : e.status === "already-running" && Z.debug(`dashboard already running on :${e.port}`, { port: e.port });
3371
3409
  }
3372
3410
  setInterval(() => {
3373
- nt({
3411
+ We({
3374
3412
  id: v,
3375
3413
  name: _,
3376
3414
  kind: "web",
@@ -3381,52 +3419,52 @@ import {
3381
3419
  }).catch(() => {});
3382
3420
  }, 1e4).unref();
3383
3421
  let n = () => {
3384
- rt(v), y.dispose();
3422
+ Ge(v), y.dispose();
3385
3423
  };
3386
3424
  process.on("SIGINT", n), process.on("SIGTERM", n);
3387
3425
  } catch (e) {
3388
- X.warn("runtime-registry write failed", {}, e);
3426
+ Z.warn("runtime-registry write failed", {}, e);
3389
3427
  }
3390
- return E({
3428
+ return C({
3391
3429
  app: t.name ?? "unnamed",
3392
3430
  kind: "web",
3393
3431
  url: `http://localhost:${g}`,
3394
- bootMs: Date.now() - V
3432
+ bootMs: Date.now() - G
3395
3433
  }), new Promise(() => {});
3396
- }, Ei = async (e) => {
3434
+ }, ji = async (e) => {
3397
3435
  process.env.NODE_ENV || (process.env.NODE_ENV = "production");
3398
- let t = await wi(e);
3436
+ let t = await ki(e);
3399
3437
  if (!t) return {
3400
3438
  ran: !1,
3401
3439
  exitCode: 0
3402
3440
  };
3403
- let n = Date.now(), r = X.child("serve");
3441
+ let n = Date.now(), r = Z.child("serve");
3404
3442
  r.info("booting voltro serve (preview)", { app: t.name ?? "(unnamed)" });
3405
- let i = await gi(e, t);
3443
+ let i = await bi(e, t);
3406
3444
  for (let e of i) r.info("api wired", {
3407
3445
  name: e.name,
3408
3446
  pkg: e.pkg
3409
3447
  });
3410
- await $(e, t, i);
3448
+ await Ei(e, t, i);
3411
3449
  {
3412
- let { pages: t } = await Q(f(e, "src", "pages"));
3413
- await Yt({
3450
+ let { pages: t } = await $(p(e, "src", "pages"));
3451
+ await zt({
3414
3452
  appRoot: e,
3415
3453
  pages: t
3416
3454
  });
3417
3455
  }
3418
- let a = t.port ?? 5173, o = await ct("vite", () => import("vite")), s = (await import("@vitejs/plugin-react")).default, c = f(e, ".framework");
3419
- X.info("running production build"), await o.build({
3456
+ let a = t.port ?? 5173, o = await Xe("vite", () => import("vite")), s = (await import("@vitejs/plugin-react")).default, c = p(e, ".framework");
3457
+ Z.info("running production build"), await o.build({
3420
3458
  root: c,
3421
3459
  envPrefix: "__VOLTRO_VITE_ENV_DISABLED__",
3422
3460
  plugins: [s()],
3423
- customLogger: It(),
3461
+ customLogger: Et(),
3424
3462
  resolve: { dedupe: ["react", "react-dom"] },
3425
3463
  build: {
3426
3464
  outDir: "dist",
3427
- rollupOptions: { output: { manualChunks: Qr } }
3465
+ rollupOptions: { output: { manualChunks: ni } }
3428
3466
  },
3429
- publicDir: f(e, "public")
3467
+ publicDir: p(e, "public")
3430
3468
  });
3431
3469
  let l = (await o.preview({
3432
3470
  root: c,
@@ -3437,21 +3475,21 @@ import {
3437
3475
  label: "Local",
3438
3476
  url: e
3439
3477
  })) ?? [];
3440
- return E({
3478
+ return C({
3441
3479
  app: t.name ?? "unnamed",
3442
3480
  kind: "preview",
3443
3481
  url: u,
3444
3482
  extras: d,
3445
3483
  bootMs: Date.now() - n
3446
3484
  }), new Promise(() => {});
3447
- }, Di = 5e3, Oi = 6e4, ki = (e, t) => {
3485
+ }, Mi = 5e3, Ni = 6e4, Pi = (e, t) => {
3448
3486
  if (e.length === 0) return 0;
3449
3487
  if (e.length === 1) return e[0];
3450
3488
  let n = t * (e.length - 1), r = Math.floor(n), i = Math.ceil(n);
3451
3489
  if (r === i) return e[r];
3452
3490
  let a = n - r;
3453
3491
  return e[r] * (1 - a) + e[i] * a;
3454
- }, Ai = (e) => {
3492
+ }, Fi = (e) => {
3455
3493
  if (e.length === 0) return {
3456
3494
  p50: 0,
3457
3495
  p95: 0,
@@ -3463,18 +3501,18 @@ import {
3463
3501
  let t = e.slice().sort((e, t) => e - t), n = 0;
3464
3502
  for (let e of t) n += e;
3465
3503
  return {
3466
- p50: ki(t, .5),
3467
- p95: ki(t, .95),
3468
- p99: ki(t, .99),
3504
+ p50: Pi(t, .5),
3505
+ p95: Pi(t, .95),
3506
+ p99: Pi(t, .99),
3469
3507
  mean: n / t.length,
3470
3508
  min: t[0],
3471
3509
  max: t[t.length - 1]
3472
3510
  };
3473
- }, ji = (e = {}) => {
3474
- let t = e.maxSamples ?? Di, n = e.defaultWindowMs ?? Oi, r = [];
3511
+ }, Ii = (e = {}) => {
3512
+ let t = e.maxSamples ?? Mi, n = e.defaultWindowMs ?? Ni, r = [];
3475
3513
  return {
3476
3514
  record(e) {
3477
- L(e), r.push({
3515
+ I(e), r.push({
3478
3516
  ...e,
3479
3517
  ts: Date.now()
3480
3518
  }), r.length > t && r.shift();
@@ -3500,7 +3538,7 @@ import {
3500
3538
  tag: e.tag,
3501
3539
  count: e.samples.length,
3502
3540
  errorCount: n,
3503
- latencyMs: Ai(t)
3541
+ latencyMs: Fi(t)
3504
3542
  });
3505
3543
  }
3506
3544
  return c.sort((e, t) => t.count - e.count), {
@@ -3513,4 +3551,4 @@ import {
3513
3551
  };
3514
3552
  };
3515
3553
  //#endregion
3516
- export { bt as $, $n as A, _n as B, pr as C, lr as D, cr as E, Jn as F, Zt as G, cn as H, Mn as I, zt as J, $t as K, Nn as L, Yn as M, Wn as N, ur as O, Kn as P, Tt as Q, En as R, hr as S, mr as T, on as U, hn as V, Qt as W, Ot as X, Lt as Y, Et as Z, Or as _, H as _t, ai as a, vt as at, jr as b, gi as c, ft as ct, Qr as d, it as dt, xt as et, Q as f, tt as ft, Er as g, Ge as gt, Vr as h, We as ht, xi as i, _t as it, Un as j, Zn as k, Ti as l, ct as lt, zr as m, nt as mt, $r as n, yt as nt, ii as o, ht as ot, $ as p, rt as pt, Yt as q, bi as r, K as rt, wi as s, pt as st, ji as t, St as tt, Ei as u, ot as ut, kr as v, Ce as vt, wr as w, Mr as x, Ar as y, xn as z };
3554
+ export { _t as $, qn as A, _n as B, dr as C, ir as D, ur as E, Hn as F, Jt as G, dn as H, Wn as I, Gt as J, qt as K, On as L, zn as M, Gn as N, ar as O, Bn as P, Dt as Q, kn as R, Or as S, br as T, rn as U, pn as V, tn as W, zt as X, Wt as Y, kt as Z, Sr as _, We as _t, li as a, st as at, Er as b, bi as c, ot as ct, ni as d, et as dt, ht as et, $ as f, Xe as ft, Hr as g, Ge as gt, Br as h, Ue as ht, Ti as i, dt as it, Yn as j, or as k, Ai as l, rt as lt, Gr as m, Ke as mt, ri as n, lt as nt, ci as o, ct as ot, Ei as p, Je as pt, Yt as q, wi as r, ut as rt, ki as s, at as st, Ii as t, mt as tt, ji as u, tt as ut, wr as v, Me as vt, lr as w, Dr as x, Tr as y, Ne as yt, Sn as z };