@voltro/cli 0.28.0 → 0.30.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 (354) hide show
  1. package/CHANGELOG.md +655 -0
  2. package/THIRD-PARTY-NOTICES.md +90 -4
  3. package/dist/{apiBuild-eUM32r1u.js → apiBuild-BceikpQf.js} +3 -3
  4. package/dist/apiBuild-CxvR1Dwt.js +2 -0
  5. package/dist/bin.js +3 -3
  6. package/dist/checkCommand-BMr-X48w.js +2427 -0
  7. package/dist/checkCommand-BOk9y264.js +2 -0
  8. package/dist/cliRuntime-Oh517vCV.js +96 -0
  9. package/dist/{commands-CSkrUI1h.js → commands-D4Y1-Nlu.js} +8575 -9366
  10. package/dist/{dbCommand-CpYgmSw4.js → dbCommand-C7hbl5pk.js} +345 -266
  11. package/dist/dbCommand-D8nhyppR.js +2 -0
  12. package/dist/{dev-DlBWWnJQ.js → dev-Cr-teYsz.js} +1 -1
  13. package/dist/{dev-CEZwJhmb.js → dev-DmnkH-wr.js} +2939 -1832
  14. package/dist/fileConventions-Cof68_BL.js +33 -0
  15. package/dist/{frameworkTableAssembly-BwHU9Euq.js → frameworkTableAssembly-BzAajuUv.js} +115 -99
  16. package/dist/frameworkTableAssembly-DU0aOxjL.js +2 -0
  17. package/dist/index.d.ts +7 -2
  18. package/dist/index.js +1 -1
  19. package/dist/{inspect-CUCCzw2I.js → inspect-BUUjt773.js} +349 -192
  20. package/dist/inspect-mmBuRXmy.js +2 -0
  21. package/dist/{inspectMetrics-BU90mvJN.js → inspectMetrics-BeJdP_3b.js} +1068 -978
  22. package/dist/{manifestBuild-BnzAxp2O.js → manifestBuild-BLrVuSlM.js} +1 -1
  23. package/dist/manifestBuild-Dj8Jjoto.js +2 -0
  24. package/dist/sdkgen-CqpOq_fy.js +582 -0
  25. package/dist/serveCommand-Ciq_wIY8.js +1577 -0
  26. package/dist/serveEntry.js +2 -2
  27. package/dist/{start-BGXIf6zT.js → start-ocqB1seX.js} +283 -270
  28. package/dist/startEntry.js +2 -2
  29. package/package.json +17 -17
  30. package/templates/AGENTS.core.md +50 -0
  31. package/templates/AGENTS.md +54 -2
  32. package/templates/agent-docs/_index.md +4 -2
  33. package/templates/agent-docs/_manifest.json +26 -5
  34. package/templates/agent-docs/ai.md +191 -0
  35. package/templates/agent-docs/cli.md +143 -6
  36. package/templates/agent-docs/configuration.md +32 -0
  37. package/templates/agent-docs/data.md +282 -0
  38. package/templates/agent-docs/database/migrations.md +47 -0
  39. package/templates/agent-docs/database/misc.md +57 -0
  40. package/templates/agent-docs/database/schema.md +3 -1
  41. package/templates/agent-docs/internationalization.md +169 -8
  42. package/templates/agent-docs/local-first-mobile.md +426 -0
  43. package/templates/agent-docs/routing.md +94 -3
  44. package/templates/agent-docs/schema-driven-ui.md +12 -0
  45. package/templates/agent-docs/security.md +17 -0
  46. package/templates/agent-docs/templates/apibackends.md +210 -1
  47. package/templates/agent-docs/templates/appshells.md +144 -1
  48. package/templates/agent-docs/templates/mobile.md +60 -0
  49. package/templates/agent-docs/templates/overview.md +17 -7
  50. package/templates/agent-docs/whats-new.md +238 -158
  51. package/templates/agent-docs/workflows.md +376 -0
  52. package/templates/apps/api-ai/package.json +7 -7
  53. package/templates/apps/api-auth/package.json +8 -8
  54. package/templates/apps/api-backend/package.json +7 -7
  55. package/templates/apps/api-backend-deactivation/package.json +7 -7
  56. package/templates/apps/api-backend-mail/package.json +8 -8
  57. package/templates/apps/api-backend-mariadb/package.json +9 -9
  58. package/templates/apps/api-backend-sqlite/.env.example +19 -0
  59. package/templates/apps/api-backend-sqlite/README.md +38 -0
  60. package/templates/apps/api-backend-sqlite/app.config.ts +35 -0
  61. package/templates/apps/api-backend-sqlite/database/schema.ts +54 -0
  62. package/templates/apps/api-backend-sqlite/mutations/notes.create.mutation.server.ts +19 -0
  63. package/templates/apps/api-backend-sqlite/mutations/notes.create.mutation.ts +37 -0
  64. package/templates/apps/api-backend-sqlite/package.json +30 -0
  65. package/templates/apps/api-backend-sqlite/queries/notes.query.server.ts +14 -0
  66. package/templates/apps/api-backend-sqlite/queries/notes.query.ts +20 -0
  67. package/templates/apps/api-backend-sqlite/template.json +6 -0
  68. package/templates/apps/api-backend-sqlite/tests/notes.create.test.ts +50 -0
  69. package/templates/apps/api-backend-sqlite/tsconfig.json +5 -0
  70. package/templates/apps/api-backend-storage/package.json +8 -8
  71. package/templates/apps/api-cms/README.md +104 -0
  72. package/templates/apps/api-cms/actions/content.get.action.server.ts +27 -0
  73. package/templates/apps/api-cms/actions/content.get.action.ts +19 -0
  74. package/templates/apps/api-cms/actions/content.types.action.server.ts +26 -0
  75. package/templates/apps/api-cms/actions/content.types.action.ts +40 -0
  76. package/templates/apps/api-cms/actions/me.action.server.ts +18 -0
  77. package/templates/apps/api-cms/actions/me.action.ts +16 -0
  78. package/templates/apps/api-cms/app.config.ts +61 -0
  79. package/templates/apps/api-cms/content/blogPost.contentType.ts +39 -0
  80. package/templates/apps/api-cms/content/index.ts +18 -0
  81. package/templates/apps/api-cms/content/page.contentType.ts +24 -0
  82. package/templates/apps/api-cms/database/schema.ts +64 -0
  83. package/templates/apps/api-cms/mutations/content.publish.mutation.server.ts +19 -0
  84. package/templates/apps/api-cms/mutations/content.publish.mutation.ts +15 -0
  85. package/templates/apps/api-cms/mutations/content.saveDraft.mutation.server.ts +36 -0
  86. package/templates/apps/api-cms/mutations/content.saveDraft.mutation.ts +32 -0
  87. package/templates/apps/api-cms/mutations/content.unpublish.mutation.server.ts +19 -0
  88. package/templates/apps/api-cms/mutations/content.unpublish.mutation.ts +11 -0
  89. package/templates/apps/api-cms/package.json +32 -0
  90. package/templates/apps/api-cms/queries/content.list.query.server.ts +0 -0
  91. package/templates/apps/api-cms/queries/content.list.query.ts +27 -0
  92. package/templates/apps/api-cms/template.json +6 -0
  93. package/templates/apps/api-cms/tests/content.descriptors.test.ts +64 -0
  94. package/templates/apps/api-cms/tests/content.write.test.ts +85 -0
  95. package/templates/apps/api-cms/tsconfig.json +5 -0
  96. package/templates/apps/api-collab/README.md +70 -0
  97. package/templates/apps/api-collab/app.config.ts +28 -0
  98. package/templates/apps/api-collab/database/schema.ts +63 -0
  99. package/templates/apps/api-collab/mutations/documents.create.mutation.server.ts +19 -0
  100. package/templates/apps/api-collab/mutations/documents.create.mutation.ts +36 -0
  101. package/templates/apps/api-collab/mutations/documents.setBody.mutation.server.ts +20 -0
  102. package/templates/apps/api-collab/mutations/documents.setBody.mutation.ts +30 -0
  103. package/templates/apps/api-collab/package.json +30 -0
  104. package/templates/apps/api-collab/queries/documents.query.server.ts +16 -0
  105. package/templates/apps/api-collab/queries/documents.query.ts +23 -0
  106. package/templates/apps/api-collab/template.json +6 -0
  107. package/templates/apps/api-collab/tests/documents.setBody.test.ts +89 -0
  108. package/templates/apps/api-collab/tsconfig.json +5 -0
  109. package/templates/apps/api-data-advanced/package.json +8 -8
  110. package/templates/apps/api-durable/package.json +8 -8
  111. package/templates/apps/api-feature-flags/package.json +9 -9
  112. package/templates/apps/api-governance/package.json +8 -8
  113. package/templates/apps/api-kv/package.json +8 -8
  114. package/templates/apps/api-moderation/package.json +8 -8
  115. package/templates/apps/api-observability/package.json +8 -8
  116. package/templates/apps/api-ratelimit/package.json +8 -8
  117. package/templates/apps/api-rbac/package.json +8 -8
  118. package/templates/apps/api-rest/package.json +7 -7
  119. package/templates/apps/api-saas/package.json +11 -11
  120. package/templates/apps/api-saas-starter/README.md +103 -0
  121. package/templates/apps/api-saas-starter/actions/me.action.server.ts +18 -0
  122. package/templates/apps/api-saas-starter/actions/me.action.ts +20 -0
  123. package/templates/apps/api-saas-starter/app.config.ts +87 -0
  124. package/templates/apps/api-saas-starter/database/schema.ts +57 -0
  125. package/templates/apps/api-saas-starter/mutations/invites.create.mutation.server.ts +26 -0
  126. package/templates/apps/api-saas-starter/mutations/invites.create.mutation.ts +18 -0
  127. package/templates/apps/api-saas-starter/mutations/projects.create.mutation.server.ts +29 -0
  128. package/templates/apps/api-saas-starter/mutations/projects.create.mutation.ts +18 -0
  129. package/templates/apps/api-saas-starter/package.json +32 -0
  130. package/templates/apps/api-saas-starter/queries/invites.list.query.server.ts +14 -0
  131. package/templates/apps/api-saas-starter/queries/invites.list.query.ts +17 -0
  132. package/templates/apps/api-saas-starter/queries/projects.list.query.server.ts +14 -0
  133. package/templates/apps/api-saas-starter/queries/projects.list.query.ts +18 -0
  134. package/templates/apps/api-saas-starter/template.json +6 -0
  135. package/templates/apps/api-saas-starter/tests/projects.create.test.ts +62 -0
  136. package/templates/apps/api-saas-starter/tests/session.test.ts +33 -0
  137. package/templates/apps/api-saas-starter/tsconfig.json +5 -0
  138. package/templates/apps/api-search/package.json +8 -8
  139. package/templates/apps/api-status/README.md +88 -0
  140. package/templates/apps/api-status/app.config.ts +36 -0
  141. package/templates/apps/api-status/authz.ts +33 -0
  142. package/templates/apps/api-status/database/schema.ts +70 -0
  143. package/templates/apps/api-status/mutations/components.create.mutation.server.ts +19 -0
  144. package/templates/apps/api-status/mutations/components.create.mutation.ts +16 -0
  145. package/templates/apps/api-status/mutations/incidents.create.mutation.server.ts +25 -0
  146. package/templates/apps/api-status/mutations/incidents.create.mutation.ts +22 -0
  147. package/templates/apps/api-status/mutations/incidents.resolve.mutation.server.ts +24 -0
  148. package/templates/apps/api-status/mutations/incidents.resolve.mutation.ts +19 -0
  149. package/templates/apps/api-status/mutations/incidents.update.mutation.server.ts +26 -0
  150. package/templates/apps/api-status/mutations/incidents.update.mutation.ts +21 -0
  151. package/templates/apps/api-status/package.json +30 -0
  152. package/templates/apps/api-status/queries/components.list.query.server.ts +14 -0
  153. package/templates/apps/api-status/queries/components.list.query.ts +13 -0
  154. package/templates/apps/api-status/queries/incidents.live.query.server.ts +14 -0
  155. package/templates/apps/api-status/queries/incidents.live.query.ts +20 -0
  156. package/templates/apps/api-status/queries/updates.list.query.server.ts +14 -0
  157. package/templates/apps/api-status/queries/updates.list.query.ts +17 -0
  158. package/templates/apps/api-status/template.json +6 -0
  159. package/templates/apps/api-status/tests/status.test.ts +70 -0
  160. package/templates/apps/api-status/tsconfig.json +5 -0
  161. package/templates/apps/api-versioning/package.json +8 -8
  162. package/templates/apps/api-webhooks/package.json +9 -9
  163. package/templates/apps/changelog/package.json +6 -6
  164. package/templates/apps/edge-functions/package.json +2 -2
  165. package/templates/apps/frontend-admin/app.config.ts +1 -1
  166. package/templates/apps/frontend-admin/package.json +8 -8
  167. package/templates/apps/frontend-admin/src/locales/index.ts +1 -1
  168. package/templates/apps/frontend-app/app.config.ts +1 -1
  169. package/templates/apps/frontend-app/package.json +8 -8
  170. package/templates/apps/frontend-app/src/locales/index.ts +1 -1
  171. package/templates/apps/frontend-app/src/pages/layout.tsx +1 -1
  172. package/templates/apps/frontend-app/src/pages/page.tsx +1 -1
  173. package/templates/apps/frontend-auth/README.md +78 -0
  174. package/templates/apps/frontend-auth/app.config.ts +34 -0
  175. package/templates/apps/frontend-auth/package.json +32 -0
  176. package/templates/apps/frontend-auth/src/components/AuthShell.tsx +35 -0
  177. package/templates/apps/frontend-auth/src/components/PasswordStrength.tsx +33 -0
  178. package/templates/apps/frontend-auth/src/config.ts +11 -0
  179. package/templates/apps/frontend-auth/src/globals.css +105 -0
  180. package/templates/apps/frontend-auth/src/globals.d.ts +6 -0
  181. package/templates/apps/frontend-auth/src/lib/auth.ts +34 -0
  182. package/templates/apps/frontend-auth/src/lib/redirect.test.ts +24 -0
  183. package/templates/apps/frontend-auth/src/lib/redirect.ts +29 -0
  184. package/templates/apps/frontend-auth/src/locales/de.ts +66 -0
  185. package/templates/apps/frontend-auth/src/locales/en.ts +76 -0
  186. package/templates/apps/frontend-auth/src/locales/index.ts +14 -0
  187. package/templates/apps/frontend-auth/src/pages/forgot/page.tsx +51 -0
  188. package/templates/apps/frontend-auth/src/pages/layout.tsx +12 -0
  189. package/templates/apps/frontend-auth/src/pages/login/page.test.tsx +53 -0
  190. package/templates/apps/frontend-auth/src/pages/login/page.tsx +67 -0
  191. package/templates/apps/frontend-auth/src/pages/logout/page.tsx +28 -0
  192. package/templates/apps/frontend-auth/src/pages/magic/page.tsx +51 -0
  193. package/templates/apps/frontend-auth/src/pages/page.tsx +26 -0
  194. package/templates/apps/frontend-auth/src/pages/reset/page.test.tsx +51 -0
  195. package/templates/apps/frontend-auth/src/pages/reset/page.tsx +63 -0
  196. package/templates/apps/frontend-auth/src/pages/signup/page.tsx +60 -0
  197. package/templates/apps/frontend-auth/src/pages/verify/page.tsx +50 -0
  198. package/templates/apps/frontend-auth/template.json +6 -0
  199. package/templates/apps/frontend-auth/tsconfig.json +5 -0
  200. package/templates/apps/frontend-blank/app.config.ts +1 -1
  201. package/templates/apps/frontend-blank/package.json +7 -7
  202. package/templates/apps/frontend-blank/src/locales/index.ts +1 -1
  203. package/templates/apps/frontend-blank/src/pages/layout.tsx +1 -1
  204. package/templates/apps/frontend-blank/src/pages/page.tsx +1 -1
  205. package/templates/apps/frontend-cms/README.md +47 -0
  206. package/templates/apps/frontend-cms/app.config.ts +37 -0
  207. package/templates/apps/frontend-cms/package.json +33 -0
  208. package/templates/apps/frontend-cms/src/config.ts +8 -0
  209. package/templates/apps/frontend-cms/src/globals.css +105 -0
  210. package/templates/apps/frontend-cms/src/globals.d.ts +6 -0
  211. package/templates/apps/frontend-cms/src/lib/api.ts +58 -0
  212. package/templates/apps/frontend-cms/src/locales/de.ts +50 -0
  213. package/templates/apps/frontend-cms/src/locales/en.ts +55 -0
  214. package/templates/apps/frontend-cms/src/locales/index.ts +14 -0
  215. package/templates/apps/frontend-cms/src/pages/(app)/error.tsx +18 -0
  216. package/templates/apps/frontend-cms/src/pages/(app)/layout.test.tsx +31 -0
  217. package/templates/apps/frontend-cms/src/pages/(app)/layout.tsx +62 -0
  218. package/templates/apps/frontend-cms/src/pages/(app)/not-found.tsx +14 -0
  219. package/templates/apps/frontend-cms/src/pages/(app)/page.test.tsx +110 -0
  220. package/templates/apps/frontend-cms/src/pages/(app)/page.tsx +159 -0
  221. package/templates/apps/frontend-cms/src/pages/layout.tsx +12 -0
  222. package/templates/apps/frontend-cms/src/pages/login/page.test.tsx +58 -0
  223. package/templates/apps/frontend-cms/src/pages/login/page.tsx +93 -0
  224. package/templates/apps/frontend-cms/template.json +6 -0
  225. package/templates/apps/frontend-cms/tsconfig.json +5 -0
  226. package/templates/apps/frontend-collab/README.md +80 -0
  227. package/templates/apps/frontend-collab/app.config.ts +38 -0
  228. package/templates/apps/frontend-collab/package.json +33 -0
  229. package/templates/apps/frontend-collab/src/locales/de.ts +29 -0
  230. package/templates/apps/frontend-collab/src/locales/en.ts +31 -0
  231. package/templates/apps/frontend-collab/src/locales/index.ts +15 -0
  232. package/templates/apps/frontend-collab/src/pages/layout.tsx +39 -0
  233. package/templates/apps/frontend-collab/src/pages/page.test.tsx +150 -0
  234. package/templates/apps/frontend-collab/src/pages/page.tsx +186 -0
  235. package/templates/apps/frontend-collab/template.json +6 -0
  236. package/templates/apps/frontend-collab/tsconfig.json +11 -0
  237. package/templates/apps/frontend-contact/package.json +7 -7
  238. package/templates/apps/frontend-dashboard/app.config.ts +1 -1
  239. package/templates/apps/frontend-dashboard/package.json +7 -7
  240. package/templates/apps/frontend-dashboard/src/locales/index.ts +1 -1
  241. package/templates/apps/frontend-docs/package.json +7 -7
  242. package/templates/apps/frontend-i18n/package.json +6 -6
  243. package/templates/apps/frontend-landing/package.json +7 -7
  244. package/templates/apps/frontend-portal/README.md +71 -0
  245. package/templates/apps/frontend-portal/app.config.ts +37 -0
  246. package/templates/apps/frontend-portal/package.json +32 -0
  247. package/templates/apps/frontend-portal/src/config.ts +8 -0
  248. package/templates/apps/frontend-portal/src/globals.css +93 -0
  249. package/templates/apps/frontend-portal/src/globals.d.ts +6 -0
  250. package/templates/apps/frontend-portal/src/lib/api.ts +62 -0
  251. package/templates/apps/frontend-portal/src/locales/de.ts +86 -0
  252. package/templates/apps/frontend-portal/src/locales/en.ts +93 -0
  253. package/templates/apps/frontend-portal/src/locales/index.ts +14 -0
  254. package/templates/apps/frontend-portal/src/pages/(portal)/api-keys/page.test.tsx +71 -0
  255. package/templates/apps/frontend-portal/src/pages/(portal)/api-keys/page.tsx +124 -0
  256. package/templates/apps/frontend-portal/src/pages/(portal)/billing/page.test.tsx +86 -0
  257. package/templates/apps/frontend-portal/src/pages/(portal)/billing/page.tsx +97 -0
  258. package/templates/apps/frontend-portal/src/pages/(portal)/error.tsx +19 -0
  259. package/templates/apps/frontend-portal/src/pages/(portal)/invoices/page.tsx +45 -0
  260. package/templates/apps/frontend-portal/src/pages/(portal)/layout.test.tsx +31 -0
  261. package/templates/apps/frontend-portal/src/pages/(portal)/layout.tsx +63 -0
  262. package/templates/apps/frontend-portal/src/pages/(portal)/not-found.tsx +15 -0
  263. package/templates/apps/frontend-portal/src/pages/(portal)/page.tsx +39 -0
  264. package/templates/apps/frontend-portal/src/pages/(portal)/profile/page.tsx +79 -0
  265. package/templates/apps/frontend-portal/src/pages/layout.tsx +12 -0
  266. package/templates/apps/frontend-portal/src/pages/login/page.test.tsx +58 -0
  267. package/templates/apps/frontend-portal/src/pages/login/page.tsx +96 -0
  268. package/templates/apps/frontend-portal/template.json +6 -0
  269. package/templates/apps/frontend-portal/tsconfig.json +5 -0
  270. package/templates/apps/frontend-saas/README.md +73 -0
  271. package/templates/apps/frontend-saas/app.config.ts +46 -0
  272. package/templates/apps/frontend-saas/package.json +32 -0
  273. package/templates/apps/frontend-saas/src/config.ts +8 -0
  274. package/templates/apps/frontend-saas/src/globals.css +85 -0
  275. package/templates/apps/frontend-saas/src/globals.d.ts +6 -0
  276. package/templates/apps/frontend-saas/src/lib/api.ts +47 -0
  277. package/templates/apps/frontend-saas/src/locales/de.ts +72 -0
  278. package/templates/apps/frontend-saas/src/locales/en.ts +81 -0
  279. package/templates/apps/frontend-saas/src/locales/index.ts +14 -0
  280. package/templates/apps/frontend-saas/src/pages/(marketing)/layout.tsx +30 -0
  281. package/templates/apps/frontend-saas/src/pages/(marketing)/login/page.test.tsx +58 -0
  282. package/templates/apps/frontend-saas/src/pages/(marketing)/login/page.tsx +96 -0
  283. package/templates/apps/frontend-saas/src/pages/(marketing)/page.tsx +27 -0
  284. package/templates/apps/frontend-saas/src/pages/dashboard/billing/page.tsx +72 -0
  285. package/templates/apps/frontend-saas/src/pages/dashboard/error.tsx +20 -0
  286. package/templates/apps/frontend-saas/src/pages/dashboard/layout.test.tsx +32 -0
  287. package/templates/apps/frontend-saas/src/pages/dashboard/layout.tsx +69 -0
  288. package/templates/apps/frontend-saas/src/pages/dashboard/not-found.tsx +17 -0
  289. package/templates/apps/frontend-saas/src/pages/dashboard/page.test.tsx +113 -0
  290. package/templates/apps/frontend-saas/src/pages/dashboard/page.tsx +76 -0
  291. package/templates/apps/frontend-saas/src/pages/dashboard/team/page.tsx +73 -0
  292. package/templates/apps/frontend-saas/src/pages/layout.tsx +12 -0
  293. package/templates/apps/frontend-saas/template.json +6 -0
  294. package/templates/apps/frontend-saas/tsconfig.json +5 -0
  295. package/templates/apps/frontend-spa/app.config.ts +1 -1
  296. package/templates/apps/frontend-spa/package.json +7 -7
  297. package/templates/apps/frontend-spa/src/locales/index.ts +1 -1
  298. package/templates/apps/frontend-spa/src/pages/layout.tsx +1 -1
  299. package/templates/apps/frontend-spa/src/pages/page.tsx +1 -1
  300. package/templates/apps/frontend-ssr/app.config.ts +1 -1
  301. package/templates/apps/frontend-ssr/package.json +7 -7
  302. package/templates/apps/frontend-ssr/src/locales/index.ts +1 -1
  303. package/templates/apps/frontend-ssr/src/pages/layout.tsx +1 -1
  304. package/templates/apps/frontend-ssr/src/pages/page.tsx +1 -1
  305. package/templates/apps/frontend-ssr-api/app.config.ts +1 -1
  306. package/templates/apps/frontend-ssr-api/package.json +8 -8
  307. package/templates/apps/frontend-ssr-api/src/locales/index.ts +1 -1
  308. package/templates/apps/frontend-ssr-api/src/pages/layout.tsx +1 -1
  309. package/templates/apps/frontend-static-blog/package.json +6 -6
  310. package/templates/apps/frontend-status/README.md +51 -0
  311. package/templates/apps/frontend-status/app.config.ts +39 -0
  312. package/templates/apps/frontend-status/package.json +32 -0
  313. package/templates/apps/frontend-status/src/config.ts +7 -0
  314. package/templates/apps/frontend-status/src/globals.css +70 -0
  315. package/templates/apps/frontend-status/src/globals.d.ts +6 -0
  316. package/templates/apps/frontend-status/src/lib/status.ts +81 -0
  317. package/templates/apps/frontend-status/src/locales/de.ts +41 -0
  318. package/templates/apps/frontend-status/src/locales/en.ts +45 -0
  319. package/templates/apps/frontend-status/src/locales/index.ts +13 -0
  320. package/templates/apps/frontend-status/src/pages/layout.tsx +27 -0
  321. package/templates/apps/frontend-status/src/pages/page.test.tsx +123 -0
  322. package/templates/apps/frontend-status/src/pages/page.tsx +136 -0
  323. package/templates/apps/frontend-status/template.json +6 -0
  324. package/templates/apps/frontend-status/tsconfig.json +11 -0
  325. package/templates/apps/mobile-app/README.md +58 -0
  326. package/templates/apps/mobile-app/app.config.ts +33 -0
  327. package/templates/apps/mobile-app/babel.config.js +5 -0
  328. package/templates/apps/mobile-app/metro.config.js +20 -0
  329. package/templates/apps/mobile-app/package.json +33 -0
  330. package/templates/apps/mobile-app/src/app/_layout.tsx +61 -0
  331. package/templates/apps/mobile-app/src/app/index.tsx +62 -0
  332. package/templates/apps/mobile-app/src/app/orders/[id].tsx +19 -0
  333. package/templates/apps/mobile-app/src/app/settings.tsx +51 -0
  334. package/templates/apps/mobile-app/src/client.ts +74 -0
  335. package/templates/apps/mobile-app/src/lib/deeplinks.ts +39 -0
  336. package/templates/apps/mobile-app/src/lib/notifications.ts +31 -0
  337. package/templates/apps/mobile-app/src/lib/sync.ts +29 -0
  338. package/templates/apps/mobile-app/src/persistence.ts +38 -0
  339. package/templates/apps/mobile-app/template.json +6 -0
  340. package/templates/apps/mobile-app/tests/deeplinks.test.ts +32 -0
  341. package/templates/apps/mobile-app/tests/notifications.test.ts +26 -0
  342. package/templates/apps/mobile-app/tests/sync.test.ts +34 -0
  343. package/templates/apps/mobile-app/tsconfig.json +10 -0
  344. package/templates/apps/mobile-app/voltro.mobile.ts +11 -0
  345. package/templates/baselines/compose/docker-compose.prod.yml +15 -0
  346. package/templates/baselines/compose-mariadb/docker-compose.prod.yml +15 -0
  347. package/templates/patches/@effect__cluster@0.60.0.patch +6 -6
  348. package/dist/apiBuild-DgBS9ayv.js +0 -2
  349. package/dist/dbCommand-DvguqlzF.js +0 -2
  350. package/dist/fileConventions-3bffWssN.js +0 -30
  351. package/dist/frameworkTableAssembly-lrjZtk0G.js +0 -2
  352. package/dist/inspect-gt8bq-Tz.js +0 -2
  353. package/dist/manifestBuild-ifczArzr.js +0 -2
  354. 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 { A as i, E as a, O as o, a as s, k as c, m as l } from "./inspect-BUUjt773.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 te, statSync as k, unlinkSync as A, unwatchFile as ne, watchFile as re, writeSync as j } from "node:fs";
11
+ import { currentTraceContext as M, recordSample as ie, resolveSecret as N } from "@voltro/runtime";
12
+ import { homedir as P } from "node:os";
13
+ import { createRequire as F } from "node:module";
14
+ import { FRAMEWORK_ENV_CATALOG as ae, appEnvEntries as I, checkEnvNaming as L, formatEnvErrors as R, installEnvSnapshot as oe, isEnvContract as z, pluginEnvEntries as se, renderDotEnvExample as B, resolveEnv as ce } from "@voltro/env";
15
+ import { __installPublicEnv as le } from "@voltro/env/public";
16
+ import { mkdir as V, readFile as ue, writeFile as de } from "node:fs/promises";
17
+ import { createHash as fe } from "node:crypto";
18
+ import { spawn as pe } from "node:child_process";
19
+ import { createConnection as me } from "node:net";
20
+ import { PassThrough as he } from "node:stream";
21
+ //#region src/agentsMd.ts
22
+ var H = d(g(import.meta.url)), U = [h(H, "..", "templates"), h(H, "..", "..", "templates")], ge = (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
+ }), W = ["AGENTS.md", "CLAUDE.md"], _e = "voltro:agents-md:keep", ve = 2048, G = "<!-- VOLTRO:INDEX -->", K = (e, t) => e.exists(t).pipe(b.orElseSucceed(() => !1)), q = (e, t) => e.readFileString(t).pipe(b.orElseSucceed(() => "")), ye = (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)), J = (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* ye(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, ve).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* J(e), i = null;
192
+ for (let e of U) 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 U) if (yield* K(n, p(e, "AGENTS.md"))) {
198
+ let i = yield* q(n, p(e, "AGENTS.md")), a = [];
199
+ for (let e of W) 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(ge(U.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 = W.map((e) => p(r, e));
208
+ if ((yield* b.forEach(d, (e) => q(n, e).pipe(b.map((e) => e.slice(0, ve))))).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(G) ? a.replace(G, 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(W, (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(P(), ".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 de(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 V(i, { recursive: !0 }), await de(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 V(e, { recursive: !0 }), await de(p(e, "env.public.ts"), n, "utf8");
382
+ }, rt = async (e) => {
383
+ let t = z(e.rawEnv) ? e.rawEnv : void 0, n = await ce({
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: N
386
+ }), r = [...n.errors, ...L(t, e.appType)];
387
+ if (r.length > 0) throw Error(R(r));
388
+ oe(n.values), e.appType === "web" && le(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 = I(e.contract), n = (e.plugins ?? []).flatMap((e) => se(e.name, e.declaredEnv)), r = e.includeFramework === !1 ? [] : ae, 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) => B(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 = k(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 = pe(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) re(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) ne(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,48 @@ __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 = 8e3, Zt = (e, t = Xt) => {
792
+ let n = $t(e);
793
+ return n.length <= t ? n : `${n.slice(0, t)}\n… [voltro] truncated at ${t} chars (${n.length} total)`;
794
+ }, Qt = 4, $t = (e, t = 0, n = /* @__PURE__ */ new Set()) => {
795
+ if (e instanceof Error) {
796
+ let r = e.stack ?? `${e.name}: ${e.message}`;
797
+ if (n.has(e)) return `${r}\n [cycle]`;
798
+ n.add(e);
799
+ let i = [];
800
+ if (t < Qt) if (e instanceof AggregateError && Array.isArray(e.errors)) for (let [r, a] of e.errors.entries()) i.push(`\n [aggregate ${r}] ${en($t(a, t + 1, n))}`);
801
+ else e.cause !== void 0 && e.cause !== null && i.push(`\n [cause] ${en($t(e.cause, t + 1, n))}`);
802
+ return r + i.join("");
803
+ }
804
+ try {
805
+ return String(e);
806
+ } catch {
807
+ return "[unstringifiable thrown value]";
808
+ }
809
+ }, en = (e) => {
810
+ let t = e.split("\n");
811
+ return t.length <= 3 ? e : `${t.slice(0, 3).join("\n")}\n …`;
812
+ }, tn = {
850
813
  trace: 0,
851
814
  debug: 1,
852
815
  info: 2,
853
816
  warn: 3,
854
817
  error: 4,
855
818
  fatal: 5
856
- }, tn = 2e3, nn = 200, rn = class {
819
+ }, nn = 2e3, rn = 200, an = class {
857
820
  capacity;
858
821
  buffer = [];
859
- constructor(e = tn) {
822
+ constructor(e = nn) {
860
823
  this.capacity = e;
861
824
  }
862
825
  append(e) {
863
826
  this.buffer.push(e), this.buffer.length > this.capacity && this.buffer.shift();
864
827
  }
865
828
  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 = [];
829
+ let t = e.since ?? 0, n = e.until ?? Date.now(), r = Math.min(e.max ?? rn, this.capacity), i = e.minLevel === void 0 ? tn.trace : tn[e.minLevel], a = e.scope?.toLowerCase(), o = e.source, s = e.filter?.toLowerCase(), c = e.traceId, l = [];
867
830
  for (let e = this.buffer.length - 1; e >= 0 && l.length < r; e--) {
868
831
  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);
832
+ r.ts < t || r.ts > n || tn[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
833
  }
871
834
  return l.reverse();
872
835
  }
@@ -879,7 +842,7 @@ __installPublicEnv(publicEnvValues)
879
842
  clear() {
880
843
  this.buffer = [];
881
844
  }
882
- }, an = null, on = () => (an === null && (an = new rn()), an), sn = (e) => {
845
+ }, on = null, sn = () => (on === null && (on = new an()), on), cn = (e) => {
883
846
  if (typeof e == "string") return e;
884
847
  if (e instanceof Error) return e.message;
885
848
  try {
@@ -887,18 +850,28 @@ __installPublicEnv(publicEnvValues)
887
850
  } catch {
888
851
  return String(e);
889
852
  }
890
- }, cn = (e) => {
853
+ }, ln = 8e3, un = (e) => typeof e == "string" ? e.length <= ln ? e : `${e.slice(0, ln)}… [voltro: truncated]` : typeof e != "object" || !e ? e : Zt(e, ln), dn = (e, t) => {
854
+ try {
855
+ e(...t);
856
+ } catch (n) {
857
+ try {
858
+ e(...t.map(un)), e(` ↑ [voltro] an argument above was too large for console formatting (${n?.message ?? "inspect failed"}) — printed bounded to ${ln} chars per argument.`);
859
+ } catch {
860
+ e(`[voltro] a console.error argument could not be formatted at all (${t.length} arg(s)).`);
861
+ }
862
+ }
863
+ }, fn = (e) => {
891
864
  let t = {
892
865
  log: console.log.bind(console),
893
866
  info: console.info.bind(console),
894
867
  warn: console.warn.bind(console),
895
868
  error: console.error.bind(console),
896
869
  debug: console.debug.bind(console)
897
- }, n = on(), r = !1, i = (i) => (...a) => {
898
- if (t[i](...a), !r) {
870
+ }, n = sn(), r = !1, i = (i) => (...a) => {
871
+ if (dn(t[i], a), !r) {
899
872
  r = !0;
900
873
  try {
901
- let t = a.length > 0 ? sn(a[0]) : "", r = t.length > 500 ? t.slice(0, 500) + "…" : t, o = I();
874
+ let t = a.length > 0 ? cn(a[0]) : "", r = t.length > 500 ? t.slice(0, 500) + "…" : t, o = M();
902
875
  e.emit("log", {
903
876
  level: i,
904
877
  message: r,
@@ -925,7 +898,7 @@ __installPublicEnv(publicEnvValues)
925
898
  }
926
899
  };
927
900
  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) => {
901
+ let a = x((t) => {
929
902
  if (!r) {
930
903
  r = !0;
931
904
  try {
@@ -936,7 +909,7 @@ __installPublicEnv(publicEnvValues)
936
909
  argsCount: 1,
937
910
  ...t.scope === void 0 ? {} : { scope: t.scope }
938
911
  });
939
- let a = I(), o = a !== void 0 && t.fields.traceId === void 0 ? {
912
+ let a = M(), o = a !== void 0 && t.fields.traceId === void 0 ? {
940
913
  ...t.fields,
941
914
  traceId: a.traceId
942
915
  } : t.fields;
@@ -956,24 +929,24 @@ __installPublicEnv(publicEnvValues)
956
929
  return () => {
957
930
  console.log = t.log, console.info = t.info, console.warn = t.warn, console.error = t.error, console.debug = t.debug, a();
958
931
  };
959
- }, ln = 2e3, un = 8, dn = 1e3, fn = 200, J = (e, t) => e.length > t ? `${e.slice(0, t)}…` : e, pn = (e) => {
932
+ }, pn = 2e3, mn = 8, hn = 1e3, gn = 200, Y = (e, t) => e.length > t ? `${e.slice(0, t)}…` : e, _n = (e) => {
960
933
  switch (e) {
961
934
  case "error": return "error";
962
935
  case "warn": return "warn";
963
936
  case "debug": return "debug";
964
937
  default: return "info";
965
938
  }
966
- }, mn = T({ scope: "client" }), hn = (e, t) => {
939
+ }, vn = S({ scope: "client" }), yn = (e, t) => {
967
940
  let n;
968
941
  try {
969
942
  n = JSON.parse(e);
970
943
  } catch {
971
- return gn(400, { error: "invalid JSON body" });
944
+ return bn(400, { error: "invalid JSON body" });
972
945
  }
973
- if (typeof n != "object" || !n) return gn(400, { error: "body must be a JSON object" });
946
+ if (typeof n != "object" || !n) return bn(400, { error: "body must be a JSON object" });
974
947
  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;
948
+ if (!Array.isArray(r.entries)) return bn(400, { error: "entries must be an array" });
949
+ 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, gn), c = 0;
977
950
  for (let e of s) {
978
951
  if (typeof e != "object" || !e) continue;
979
952
  let n = e;
@@ -984,7 +957,7 @@ __installPublicEnv(publicEnvValues)
984
957
  "warn",
985
958
  "error",
986
959
  "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;
960
+ ].includes(n.level) ? n.level : "log", s = typeof n.ts == "number" && Number.isFinite(n.ts) ? n.ts : Date.now(), l = Y(n.message, pn), u = Array.isArray(n.args) ? n.args.slice(0, mn).filter((e) => typeof e == "string").map((e) => Y(e, hn)) : void 0, d = typeof n.stack == "string" ? Y(n.stack, pn) : void 0;
988
961
  t.emit("clientLog", {
989
962
  ts: s,
990
963
  level: r,
@@ -999,41 +972,41 @@ __installPublicEnv(publicEnvValues)
999
972
  ...i === void 0 ? {} : { app: i },
1000
973
  ...a === void 0 ? {} : { page: a },
1001
974
  ...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, {
975
+ }, p = _n(r);
976
+ (p === "error" || p === "warn") && d !== void 0 ? vn[p](l, f, { stack: d }) : vn[p](l, {
1004
977
  ...f,
1005
978
  ...d === void 0 ? {} : { stack: d }
1006
979
  }), c++;
1007
980
  }
1008
- return gn(202, {
981
+ return bn(202, {
1009
982
  accepted: c,
1010
983
  dropped: r.entries.length - c
1011
984
  });
1012
- }, gn = (e, t) => ({
985
+ }, bn = (e, t) => ({
1013
986
  status: e,
1014
987
  contentType: "application/json; charset=utf-8",
1015
988
  body: JSON.stringify(t)
1016
- }), _n = "/_voltro/inspect/clientLog", vn = [
989
+ }), xn = "/_voltro/inspect/clientLog", Sn = [
1017
990
  "trace",
1018
991
  "debug",
1019
992
  "info",
1020
993
  "warn",
1021
994
  "error",
1022
995
  "fatal"
1023
- ], yn = {
996
+ ], Cn = {
1024
997
  trace: "TRACE",
1025
998
  debug: "DEBUG",
1026
999
  info: "INFO ",
1027
1000
  warn: "WARN ",
1028
1001
  error: "ERROR",
1029
1002
  fatal: "FATAL"
1030
- }, bn = (e) => vn.includes(e), xn = (e, t, n = {}) => {
1031
- if (i()) return {
1003
+ }, wn = (e) => Sn.includes(e), Tn = (e, t, n = {}) => {
1004
+ if (c()) return {
1032
1005
  status: 503,
1033
1006
  contentType: "application/json",
1034
1007
  body: JSON.stringify({ error: "inspect disabled (VOLTRO_INSPECT=off)" })
1035
1008
  };
1036
- let r = o(n, "GET");
1009
+ let r = s(n, "GET");
1037
1010
  if (!r.ok) return {
1038
1011
  status: 401,
1039
1012
  contentType: "application/json",
@@ -1042,36 +1015,36 @@ __installPublicEnv(publicEnvValues)
1042
1015
  reason: r.reason
1043
1016
  })
1044
1017
  };
1045
- let a = e.indexOf("?"), s = a === -1 ? new URLSearchParams() : new URLSearchParams(e.slice(a + 1)), c = {}, l = s.get("since");
1018
+ let i = e.indexOf("?"), a = i === -1 ? new URLSearchParams() : new URLSearchParams(e.slice(i + 1)), o = {}, l = a.get("since");
1046
1019
  if (l !== null) {
1047
1020
  let e = Number(l);
1048
- Number.isFinite(e) && (c.since = e);
1021
+ Number.isFinite(e) && (o.since = e);
1049
1022
  }
1050
- let u = s.get("until");
1023
+ let u = a.get("until");
1051
1024
  if (u !== null) {
1052
1025
  let e = Number(u);
1053
- Number.isFinite(e) && (c.until = e);
1026
+ Number.isFinite(e) && (o.until = e);
1054
1027
  }
1055
- let d = s.get("max");
1028
+ let d = a.get("max");
1056
1029
  if (d !== null) {
1057
1030
  let e = Number(d);
1058
- Number.isFinite(e) && e > 0 && (c.max = Math.floor(e));
1059
- }
1060
- let f = s.get("level");
1061
- f !== null && bn(f) && (c.minLevel = f);
1062
- let p = s.get("source");
1063
- (p === "server" || p === "client") && (c.source = p);
1064
- let m = s.get("scope");
1065
- m !== null && m.length > 0 && (c.scope = m);
1066
- let h = s.get("filter");
1067
- h !== null && h.length > 0 && (c.filter = h);
1068
- let g = s.get("trace");
1069
- g !== null && g.length > 0 && (c.traceId = g);
1070
- let _ = t.query(c);
1071
- if ((s.get("format") ?? "json") === "text") return {
1031
+ Number.isFinite(e) && e > 0 && (o.max = Math.floor(e));
1032
+ }
1033
+ let f = a.get("level");
1034
+ f !== null && wn(f) && (o.minLevel = f);
1035
+ let p = a.get("source");
1036
+ (p === "server" || p === "client") && (o.source = p);
1037
+ let m = a.get("scope");
1038
+ m !== null && m.length > 0 && (o.scope = m);
1039
+ let h = a.get("filter");
1040
+ h !== null && h.length > 0 && (o.filter = h);
1041
+ let g = a.get("trace");
1042
+ g !== null && g.length > 0 && (o.traceId = g);
1043
+ let _ = t.query(o);
1044
+ if ((a.get("format") ?? "json") === "text") return {
1072
1045
  status: 200,
1073
1046
  contentType: "text/plain; charset=utf-8",
1074
- body: _.map(Sn).join("\n") + (_.length > 0 ? "\n" : "")
1047
+ body: _.map(En).join("\n") + (_.length > 0 ? "\n" : "")
1075
1048
  };
1076
1049
  let v = {
1077
1050
  capturedAt: Date.now(),
@@ -1085,40 +1058,40 @@ __installPublicEnv(publicEnvValues)
1085
1058
  contentType: "application/json; charset=utf-8",
1086
1059
  body: JSON.stringify(v)
1087
1060
  };
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) => {
1061
+ }, En = (e) => {
1062
+ 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 = On(e.fields);
1063
+ return `${n}:${r}:${i}.${a} ${Cn[e.level]} ${o} ${e.message}${s}`;
1064
+ }, Dn = 80, On = (e) => {
1092
1065
  let t = Object.entries(e);
1093
1066
  if (t.length === 0) return "";
1094
1067
  let n = [];
1095
1068
  for (let [e, r] of t) {
1096
1069
  if (r === void 0) continue;
1097
- let t = Tn(r);
1070
+ let t = kn(r);
1098
1071
  n.push(`${e}=${t}`);
1099
1072
  }
1100
1073
  return n.length > 0 ? " " + n.join(" ") : "";
1101
- }, Tn = (e) => {
1074
+ }, kn = (e) => {
1102
1075
  if (typeof e == "string") {
1103
- let t = e.length > Cn ? e.slice(0, Cn) + "…" : e;
1076
+ let t = e.length > Dn ? e.slice(0, Dn) + "…" : e;
1104
1077
  return /[\s=]/.test(t) ? `"${t.replace(/"/g, "\\\"")}"` : t;
1105
1078
  }
1106
1079
  if (e === null) return "null";
1107
1080
  if (typeof e == "number" || typeof e == "boolean") return String(e);
1108
1081
  try {
1109
1082
  let t = JSON.stringify(e);
1110
- return t.length > Cn ? t.slice(0, Cn) + "…" : t;
1083
+ return t.length > Dn ? t.slice(0, Dn) + "…" : t;
1111
1084
  } catch {
1112
1085
  return "[unserialisable]";
1113
1086
  }
1114
- }, En = "/_voltro/inspect/logs", Dn = (e, t, n) => {
1087
+ }, An = "/_voltro/inspect/logs", jn = (e, t, n) => {
1115
1088
  if (t.headers.authorization !== void 0) return !1;
1116
1089
  let { token: r } = n;
1117
1090
  if (r === void 0 || r === "" || !n.isLoopback(n.target)) return !1;
1118
1091
  e.setHeader("authorization", `Bearer ${r}`);
1119
1092
  let i = n.writeToken;
1120
1093
  return i !== void 0 && i !== "" && t.headers["x-voltro-inspect-write"] === void 0 && e.setHeader("x-voltro-inspect-write", i), !0;
1121
- }, On = [{
1094
+ }, Mn = [{
1122
1095
  match: (e) => typeof e == "string" && e.startsWith("[BABEL] Note: The code generator has deoptimised"),
1123
1096
  handle: (e, t) => {
1124
1097
  let n = e[0], r = n.match(/deoptimised the styling of (.+?) as it exceeds the max of (\d+\w*B)\.?/);
@@ -1130,13 +1103,13 @@ __installPublicEnv(publicEnvValues)
1130
1103
  });
1131
1104
  } else t.info(n);
1132
1105
  }
1133
- }], kn = () => {
1106
+ }], Nn = () => {
1134
1107
  let e = {
1135
1108
  warn: console.warn.bind(console),
1136
1109
  error: console.error.bind(console)
1137
- }, t = T({ scope: "babel" }), n = !1, r = (r) => (...i) => {
1110
+ }, t = S({ scope: "babel" }), n = !1, r = (r) => (...i) => {
1138
1111
  if (!n) {
1139
- for (let e of On) if (e.match(i[0])) {
1112
+ for (let e of Mn) if (e.match(i[0])) {
1140
1113
  n = !0;
1141
1114
  try {
1142
1115
  e.handle(i, t);
@@ -1151,7 +1124,7 @@ __installPublicEnv(publicEnvValues)
1151
1124
  return console.warn = r("warn"), console.error = r("error"), () => {
1152
1125
  console.warn = e.warn, console.error = e.error;
1153
1126
  };
1154
- }, An = {
1127
+ }, Pn = {
1155
1128
  loader: "it runs on the server, and the router caches its result per route + params",
1156
1129
  renderMode: "it picks the server render strategy",
1157
1130
  dynamic: "it picks the server render strategy",
@@ -1162,7 +1135,7 @@ __installPublicEnv(publicEnvValues)
1162
1135
  cacheInvalidatesOn: "it wires this page into the ISR cache invalidator",
1163
1136
  interactive: "it decides how much client JS the server ships",
1164
1137
  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 = () => `
1138
+ }, Fn = Object.keys(Pn), In = (e) => t.test(e), Ln = (e) => e.replace(/page\.tsx$/, "page.test.tsx"), Rn = "virtual:voltro-route-refresh", zn = `\0${Rn}`, Bn = /(?:^|&)(raw|url|inline|worker|sharedworker|direct)(?:&|=|$)/, Vn = () => `
1166
1139
  // GENERATED by @voltro/cli — the \`voltro dev\` route Fast Refresh runtime.
1167
1140
 
1168
1141
  /** Mirrors react-refresh's own \`isLikelyComponentType\` closely enough for the
@@ -1191,11 +1164,11 @@ const stableForm = (value) => {
1191
1164
  * readers (\`build.ts\` prerender, \`webDev.ts\` dev SSR, \`start.ts\`). A change to
1192
1165
  * one of THESE cannot be hot-applied: the server already ran with the old
1193
1166
  * value. Everything else a page exports is plain client-side data. */
1194
- const serverRelevantExports = ${JSON.stringify(jn)}
1167
+ const serverRelevantExports = ${JSON.stringify(Fn)}
1195
1168
 
1196
1169
  /** Name → the server step that already consumed it, so the reload message can
1197
1170
  * say WHY rather than just WHAT. Injected from the same single source. */
1198
- const serverExportEffect = ${JSON.stringify(An)}
1171
+ const serverExportEffect = ${JSON.stringify(Pn)}
1199
1172
 
1200
1173
  /** The reason \`name\` forces a reload, for the console line. */
1201
1174
  export const serverEffectOf = (name) =>
@@ -1238,7 +1211,7 @@ export const routeUpdateNeedsReload = (prevExports, nextExports) => {
1238
1211
  const previousHook = globalThis.__getReactRefreshIgnoredExports
1239
1212
  globalThis.__getReactRefreshIgnoredExports = (args) =>
1240
1213
  ignoredExports.get(args.id) ?? previousHook?.(args) ?? []
1241
- `, Rn = (e) => `
1214
+ `, Hn = (e) => `
1242
1215
  if (import.meta.hot) {
1243
1216
  // Self-import to read our OWN exports, the same technique the react plugin
1244
1217
  // uses; the namespace is only complete after evaluation, hence the promise.
@@ -1265,57 +1238,57 @@ import {
1265
1238
  registerRouteModule as __voltro_registerRouteModule,
1266
1239
  routeUpdateNeedsReload as __voltro_routeUpdateNeedsReload,
1267
1240
  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) => ({
1241
+ } from '${Rn}'
1242
+ `, Un = (e) => e.replace(/\\/g, "/"), Wn = (e, t) => {
1243
+ let [i = "", a] = Un(e).split("?");
1244
+ if (!i.endsWith(".tsx") || a !== void 0 && Bn.test(a)) return !1;
1245
+ let o = Un(t).replace(/\/$/, "");
1246
+ return i.startsWith(`${o}/`) ? r.test(i) || n.has(i.slice(i.lastIndexOf("/") + 1)) : !1;
1247
+ }, Gn = (e, t, n) => Wn(t, n) ? `${e}${Hn(Un(t).split("?")[0] ?? t)}` : null, Kn = (e) => ({
1275
1248
  name: "voltro:route-fast-refresh",
1276
1249
  enforce: "pre",
1277
- resolveId: (e) => e === "virtual:voltro-route-refresh" ? Fn : void 0,
1278
- load: (e) => e === Fn ? Ln() : void 0,
1250
+ resolveId: (e) => e === "virtual:voltro-route-refresh" ? zn : void 0,
1251
+ load: (e) => e === zn ? Vn() : void 0,
1279
1252
  transform: (t, n, r) => {
1280
1253
  if (r?.ssr === !0) return null;
1281
- let i = Vn(t, n, e);
1254
+ let i = Gn(t, n, e);
1282
1255
  return i === null ? null : {
1283
1256
  code: i,
1284
1257
  map: null
1285
1258
  };
1286
1259
  }
1287
- }), Un = [
1260
+ }), qn = [
1288
1261
  "static",
1289
1262
  "spa",
1290
1263
  "ssr",
1291
1264
  "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 {
1265
+ ], Jn = (e) => typeof e == "string" && qn.includes(e), Yn = qn.map((e) => `'${e}'`).join(" | "), Xn = (e, t) => `[voltro] ${e}: unknown renderMode '${t}'.\n Valid values: ${Yn}.${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)." : ""}`, Zn = class extends Error {
1293
1266
  page;
1294
1267
  value;
1295
1268
  name = "InvalidRenderModeError";
1296
1269
  constructor(e, t) {
1297
- super(Kn(e, t)), this.page = e, this.value = t;
1270
+ super(Xn(e, t)), this.page = e, this.value = t;
1298
1271
  }
1299
- }, Jn = (e, t = "<page>") => {
1272
+ }, Qn = (e, t = "<page>") => {
1300
1273
  if (e.renderMode !== void 0 && e.renderMode !== null) {
1301
- if (!Wn(e.renderMode)) throw new qn(t, String(e.renderMode));
1274
+ if (!Jn(e.renderMode)) throw new Zn(t, String(e.renderMode));
1302
1275
  return e.renderMode;
1303
1276
  }
1304
1277
  return e.dynamic === "force-dynamic" ? "ssr" : (e.dynamic, "static");
1305
- }, Yn = (e, t = "<page>") => ({
1306
- renderMode: Jn(e, t),
1278
+ }, $n = (e, t = "<page>") => ({
1279
+ renderMode: Qn(e, t),
1307
1280
  tenantAware: e.tenantAware === !0,
1308
- revalidateMs: K(e.revalidate),
1309
- staleWhileRevalidateMs: K(e.staleWhileRevalidate) ?? 0,
1281
+ revalidateMs: ct(e.revalidate),
1282
+ staleWhileRevalidateMs: ct(e.staleWhileRevalidate) ?? 0,
1310
1283
  cacheInvalidatesOn: Array.isArray(e.cacheInvalidatesOn) ? e.cacheInvalidatesOn : [],
1311
1284
  interactive: e.interactive ?? "full",
1312
1285
  hasLoader: typeof e.loader == "function",
1313
1286
  hasMeta: e.meta != null,
1314
1287
  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;
1288
+ }), er = /export\s+const\s+renderMode\s*(?::[^=]+)?=\s*['"]([^'"]*)['"]/, tr = (e) => er.exec(e)?.[1] ?? null, nr = /export\s*\{([^}]*)\}\s*from\s*['"]([^'"]+)['"]/g, rr = (e) => {
1289
+ nr.lastIndex = 0;
1317
1290
  let t;
1318
- for (; (t = Qn.exec(e)) !== null;) {
1291
+ for (; (t = nr.exec(e)) !== null;) {
1319
1292
  let e = t[2];
1320
1293
  if (e.startsWith(".")) for (let n of t[1].split(",")) {
1321
1294
  let t = n.lastIndexOf(" as ");
@@ -1323,50 +1296,50 @@ import {
1323
1296
  }
1324
1297
  }
1325
1298
  return null;
1326
- }, er = /export\s*\{([^}]*)\}/g, tr = (e) => {
1299
+ }, ir = /export\s*\{([^}]*)\}/g, ar = (e) => {
1327
1300
  if (/export\s+default\b/.test(e)) return !0;
1328
- er.lastIndex = 0;
1301
+ ir.lastIndex = 0;
1329
1302
  let t;
1330
- for (; (t = er.exec(e)) !== null;) for (let e of t[1].split(",")) {
1303
+ for (; (t = ir.exec(e)) !== null;) for (let e of t[1].split(",")) {
1331
1304
  let t = e.lastIndexOf(" as ");
1332
1305
  if ((t === -1 ? e : e.slice(t + 4)).trim() === "default") return !0;
1333
1306
  }
1334
1307
  return !1;
1335
- }, nr = async (e, t) => {
1308
+ }, or = async (e, t) => {
1336
1309
  let n = (await Promise.all(t.map(async (t) => {
1337
1310
  let n;
1338
1311
  try {
1339
- n = await he(f(e, t.file), "utf8");
1312
+ n = await ue(p(e, t.file), "utf8");
1340
1313
  } catch {
1341
1314
  return null;
1342
1315
  }
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.`;
1316
+ let r = tr(n);
1317
+ return r !== null && !Jn(r) ? Xn(p("src", "pages", t.file), r) : ar(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
1318
  }))).filter((e) => e !== null);
1346
1319
  if (n.length !== 0) throw Error(n.join("\n\n"));
1347
- }, Y = f(re(), ".voltro", "logs"), rr = () => {
1320
+ }, X = p(P(), ".voltro", "logs"), sr = () => {
1348
1321
  let e = Number(process.env.VOLTRO_LOG_FILE_TTL_MS);
1349
1322
  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 = [];
1323
+ }, cr = !1, lr = () => {
1324
+ if (cr) return;
1325
+ cr = !0;
1326
+ let e = Date.now() - sr(), t = [];
1354
1327
  try {
1355
- t = M(Y);
1328
+ t = te(X);
1356
1329
  } catch {
1357
1330
  return;
1358
1331
  }
1359
1332
  for (let n of t) {
1360
1333
  if (!n.endsWith(".log")) continue;
1361
- let t = f(Y, n);
1334
+ let t = p(X, n);
1362
1335
  try {
1363
- N(t).mtimeMs < e && P(t);
1336
+ k(t).mtimeMs < e && A(t);
1364
1337
  } catch {}
1365
1338
  }
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 = [];
1339
+ }, ur = (e) => e.replace(/[^a-zA-Z0-9._-]/g, "_").slice(0, 80), dr = (e, t) => p(X, `${ur(e)}-${t}.log`), fr = (e) => {
1340
+ let t = ur(e), n = [];
1368
1341
  try {
1369
- n = M(Y);
1342
+ n = te(X);
1370
1343
  } catch {
1371
1344
  return;
1372
1345
  }
@@ -1374,19 +1347,19 @@ import {
1374
1347
  if (r.length === 0) return;
1375
1348
  let i, a = -1;
1376
1349
  for (let e of r) {
1377
- let t = f(Y, e);
1350
+ let t = p(X, e);
1378
1351
  try {
1379
- let e = N(t);
1352
+ let e = k(t);
1380
1353
  e.mtimeMs > a && (a = e.mtimeMs, i = t);
1381
1354
  } catch {}
1382
1355
  }
1383
1356
  return i;
1384
- }, lr = (e) => {
1357
+ }, pr = (e) => {
1385
1358
  try {
1386
- O(Y, { recursive: !0 });
1359
+ E(X, { recursive: !0 });
1387
1360
  } catch {}
1388
- ar();
1389
- let t = sr(e, process.pid), n = k(t, "w"), r = (e) => {
1361
+ lr();
1362
+ let t = dr(e, process.pid), n = D(t, "w"), r = (e) => {
1390
1363
  let t = {
1391
1364
  ts: e.ts.getTime(),
1392
1365
  level: e.level,
@@ -1407,15 +1380,15 @@ import {
1407
1380
  ...e.scope === void 0 ? {} : { scope: e.scope }
1408
1381
  }) + "\n";
1409
1382
  }
1410
- }, i = !1, a = w((e) => {
1383
+ }, i = !1, a = x((e) => {
1411
1384
  if (!i) try {
1412
- ne(n, r(e));
1385
+ j(n, r(e));
1413
1386
  } catch {}
1414
1387
  }), o = () => {
1415
1388
  if (!i) {
1416
1389
  i = !0;
1417
1390
  try {
1418
- ee(n);
1391
+ w(n);
1419
1392
  } catch {}
1420
1393
  }
1421
1394
  };
@@ -1427,10 +1400,10 @@ import {
1427
1400
  a(), o(), process.off("exit", o), process.off("uncaughtException", s), process.off("unhandledRejection", s);
1428
1401
  }
1429
1402
  };
1430
- }, ur = async (e, t) => {
1403
+ }, mr = async (e, t) => {
1431
1404
  let n;
1432
1405
  try {
1433
- n = await A.readFile(e, "utf8");
1406
+ n = await O.readFile(e, "utf8");
1434
1407
  } catch {
1435
1408
  return [];
1436
1409
  }
@@ -1441,78 +1414,78 @@ import {
1441
1414
  i.push(t);
1442
1415
  } catch {}
1443
1416
  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) => {
1417
+ }, hr = S({ scope: "voltro:dashboard" }), gr = F(import.meta.url), _r = 5179, vr = (e) => {
1445
1418
  let t = process.env.VOLTRO_DASHBOARD_PATH;
1446
- if (t && D(f(m(t), "app.config.ts"))) return m(t);
1419
+ if (t && T(p(h(t), "app.config.ts"))) return h(t);
1447
1420
  try {
1448
- let e = u(fr.resolve("@voltro/dashboard/package.json"));
1449
- if (D(f(e, "app.config.ts"))) return e;
1421
+ let e = d(gr.resolve("@voltro/dashboard/package.json"));
1422
+ if (T(p(e, "app.config.ts"))) return e;
1450
1423
  } catch {}
1451
- let n = f("voltro-devtools", "apps", "dashboard"), r = m(e);
1424
+ let n = p("voltro-devtools", "apps", "dashboard"), r = h(e);
1452
1425
  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);
1426
+ let e = p(r, n);
1427
+ if (T(p(e, "app.config.ts"))) return e;
1428
+ let t = d(r);
1456
1429
  if (t === r) break;
1457
1430
  r = t;
1458
1431
  }
1459
1432
  return null;
1460
- }, hr = "VOLTRO_IS_DASHBOARD", gr = (e, t = "127.0.0.1", n = 250) => new Promise((r) => {
1461
- let i = ve({
1433
+ }, yr = "VOLTRO_IS_DASHBOARD", br = (e, t = "127.0.0.1", n = 250) => new Promise((r) => {
1434
+ let i = me({
1462
1435
  port: e,
1463
1436
  host: t
1464
1437
  }), a = !1, o = (e) => {
1465
1438
  a || (a = !0, i.destroy(), r(e));
1466
1439
  };
1467
1440
  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 () => {
1441
+ }), xr = () => !!(process.env.VOLTRO_DASHBOARD === "off" || process.argv.includes("--disable-dashboard")), Sr = () => process.env[yr] === "1", Cr = () => process.stdout.isTTY === !0, wr = p(P(), ".voltro", "dashboard-launch.lock"), Tr = 1e4, Er = async () => {
1469
1442
  try {
1470
- await A.mkdir(u(br), { recursive: !0 });
1471
- let e = await A.open(br, "wx");
1443
+ await O.mkdir(d(wr), { recursive: !0 });
1444
+ let e = await O.open(wr, "wx");
1472
1445
  return await e.write(`${process.pid}\n${Date.now()}\n`), await e.close(), !0;
1473
1446
  } catch {
1474
1447
  try {
1475
- let e = await A.stat(br);
1476
- if (Date.now() - e.mtimeMs > xr) return await A.unlink(br).catch(() => void 0), Sr();
1448
+ let e = await O.stat(wr);
1449
+ if (Date.now() - e.mtimeMs > Tr) return await O.unlink(wr).catch(() => void 0), Er();
1477
1450
  } catch {}
1478
1451
  return !1;
1479
1452
  }
1480
- }, Cr = async () => {
1453
+ }, Dr = async () => {
1481
1454
  try {
1482
- await A.unlink(br);
1455
+ await O.unlink(wr);
1483
1456
  } catch {}
1484
- }, wr = async (e) => {
1457
+ }, Or = async (e) => {
1485
1458
  let t = e.port ?? 5179;
1486
- if (_r()) return {
1459
+ if (xr()) return {
1487
1460
  status: "skipped",
1488
1461
  reason: "disabled by flag/env",
1489
1462
  port: t
1490
1463
  };
1491
- if (vr()) return {
1464
+ if (Sr()) return {
1492
1465
  status: "skipped",
1493
1466
  reason: "this process IS the dashboard",
1494
1467
  port: t
1495
1468
  };
1496
- if (!yr()) return {
1469
+ if (!Cr()) return {
1497
1470
  status: "skipped",
1498
1471
  reason: "stdout is not a TTY (CI/smoke)",
1499
1472
  port: t
1500
1473
  };
1501
- if (!await Sr()) return {
1474
+ if (!await Er()) return {
1502
1475
  status: "skipped",
1503
1476
  reason: "another voltro process is currently launching the dashboard",
1504
1477
  port: t
1505
1478
  };
1506
- if (await gr(t)) return await Cr(), {
1479
+ if (await br(t)) return await Dr(), {
1507
1480
  status: "already-running",
1508
1481
  port: t
1509
1482
  };
1510
1483
  let n = e.voltroBin;
1511
1484
  if (!n) {
1512
1485
  let e = process.argv[1];
1513
- n = e && e.endsWith("/src/bin.ts") ? f(u(e), "..", "bin", "voltro.mjs") : e ?? "voltro";
1486
+ n = e && e.endsWith("/src/bin.ts") ? p(d(e), "..", "bin", "voltro.mjs") : e ?? "voltro";
1514
1487
  }
1515
- let r = D(f(e.dashboardAppPath, ".framework", "dist", "index.html")), i = r ? "start" : "dev", a = _e(process.execPath, [
1488
+ let r = T(p(e.dashboardAppPath, ".framework", "dist", "index.html")), i = r ? "start" : "dev", a = pe(process.execPath, [
1516
1489
  n,
1517
1490
  i,
1518
1491
  e.dashboardAppPath
@@ -1520,7 +1493,7 @@ import {
1520
1493
  stdio: "ignore",
1521
1494
  env: {
1522
1495
  ...process.env,
1523
- [hr]: "1",
1496
+ [yr]: "1",
1524
1497
  VOLTRO_DASHBOARD_PORT: String(t)
1525
1498
  }
1526
1499
  });
@@ -1528,22 +1501,22 @@ import {
1528
1501
  if (a.exitCode === null && a.signalCode === null) try {
1529
1502
  a.kill("SIGTERM");
1530
1503
  } catch {}
1531
- }), dr.info(`auto-launching dashboard at http://localhost:${t}`, {
1504
+ }), hr.info(`auto-launching dashboard at http://localhost:${t}`, {
1532
1505
  port: t,
1533
1506
  mode: i,
1534
1507
  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();
1508
+ }), r || hr.debug("no pre-built dashboard — running `voltro dev`. Build with `cd voltro-devtools && pnpm build` for a fast prod boot."), hr.debug("disable via --disable-dashboard or VOLTRO_DASHBOARD=off"), setTimeout(() => {
1509
+ Dr();
1537
1510
  }, 4e3).unref(), {
1538
1511
  status: "launched",
1539
1512
  port: t
1540
1513
  };
1541
- }, Tr = class extends Error {
1514
+ }, kr = class extends Error {
1542
1515
  _voltroDeferral = !0;
1543
1516
  constructor(e) {
1544
1517
  super(e), this.name = "DeferralNotSupportedError";
1545
1518
  }
1546
- }, Er = (e) => typeof e == "object" && !!e && e._voltroDeferral === !0, Dr = (e) => {
1519
+ }, Ar = (e) => typeof e == "object" && !!e && e._voltroDeferral === !0, jr = (e) => {
1547
1520
  if (!(e instanceof Error)) return;
1548
1521
  let t = e._voltroControl;
1549
1522
  if (t === "redirect") {
@@ -1565,7 +1538,7 @@ import {
1565
1538
  },
1566
1539
  body: "not found"
1567
1540
  };
1568
- }, Or = (e) => {
1541
+ }, Mr = (e) => {
1569
1542
  let { helpers: t } = e, n = t.prepareDeferredLoaderData(e.loaderData, "page"), r = {}, i = {}, a = {};
1570
1543
  for (let [n, o] of Object.entries(e.segmentLoaderData)) {
1571
1544
  let e = Number(n), s = t.prepareDeferredLoaderData(o, e);
@@ -1580,7 +1553,7 @@ import {
1580
1553
  ...e.layoutShell ? { layoutShell: e.layoutShell } : {}
1581
1554
  });
1582
1555
  } catch (e) {
1583
- throw new Tr(e instanceof Error ? e.message : String(e));
1556
+ throw new kr(e instanceof Error ? e.message : String(e));
1584
1557
  }
1585
1558
  return {
1586
1559
  loaderData: n.renderData,
@@ -1596,8 +1569,8 @@ import {
1596
1569
  ...Object.keys(a).length > 0 ? { deferredSegmentIds: a } : {}
1597
1570
  }
1598
1571
  };
1599
- }, kr = (e) => {
1600
- let { helpers: t, renderInput: n } = e, r = Or({
1572
+ }, Nr = (e) => {
1573
+ let { helpers: t, renderInput: n } = e, r = Mr({
1601
1574
  helpers: t,
1602
1575
  page: e.page,
1603
1576
  pathname: n.pathname,
@@ -1618,19 +1591,19 @@ import {
1618
1591
  stateScript: t.renderRouterStateScript(r.stateInput),
1619
1592
  hasDeferred: r.hasDeferred
1620
1593
  };
1621
- }, Ar = (e) => {
1594
+ }, Pr = (e) => {
1622
1595
  let { html: t, meta: n } = e.helpers.renderPageToHtml(e.prepared.renderInput);
1623
1596
  return {
1624
1597
  body: t,
1625
1598
  meta: n
1626
1599
  };
1627
- }, jr = (e) => [
1600
+ }, Fr = (e) => [
1628
1601
  ...e.extra ?? [],
1629
1602
  e.helpers.renderMetaToHtml(e.meta),
1630
1603
  `<meta name="voltro-interactive" content="${e.interactive}" />`,
1631
1604
  ...e.prepared.hasDeferred ? [e.helpers.renderDeferredRegistryScript()] : [],
1632
1605
  e.prepared.stateScript
1633
- ].filter((e) => e.length > 0).join("\n "), Mr = (e) => {
1606
+ ].filter((e) => e.length > 0).join("\n "), Ir = (e) => {
1634
1607
  let t = e.indexOf("?");
1635
1608
  return t === -1 ? {
1636
1609
  pathname: e || "/",
@@ -1639,30 +1612,58 @@ import {
1639
1612
  pathname: e.slice(0, t) || "/",
1640
1613
  search: e.slice(t)
1641
1614
  };
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];
1615
+ }, Lr = /Could not find required `intl` object/, Rr = (e) => [
1616
+ "",
1617
+ "── voltro diagnosis ───────────────────────────────────────────────────",
1618
+ `${e} DID wrap this render in <I18nProvider> — the framework`,
1619
+ "resolved a locale for this request and supplied the provider. You are",
1620
+ "seeing this error anyway, which leaves one cause:",
1621
+ "",
1622
+ " TWO PHYSICAL COPIES OF react-intl (or of @voltro/i18n, which owns it).",
1623
+ "",
1624
+ "A React context is identified by object identity. The provider built from",
1625
+ "one copy is invisible to a `useT()` / `useIntl()` from the other, and the",
1626
+ "error is identical to having no provider at all.",
1627
+ "",
1628
+ "Check it:",
1629
+ "",
1630
+ " pnpm ls -r --depth 10 @voltro/i18n react-intl",
1631
+ "",
1632
+ "More than one version of either, anywhere in the workspace, is the cause.",
1633
+ "It usually means one package.json was left behind on an upgrade — the app",
1634
+ "still builds and every other test still passes.",
1635
+ "",
1636
+ "If both resolve to exactly one version, this diagnosis is wrong and the",
1637
+ "framework is at fault. Report it with that output attached.",
1638
+ "───────────────────────────────────────────────────────────────────────"
1639
+ ].join("\n"), zr = (e, t, n) => {
1640
+ if (!t) return;
1641
+ let r = String(e?.message ?? e);
1642
+ return Lr.test(r) ? Rr(n) : void 0;
1643
+ }, Br = "<div id=\"root\"></div>", Vr = "<div id=\"root\">", Hr = "</div>", Ur = /<script\b[^>]*\btype=["']module["'][^>]*><\/script>[ \t]*\n?/gi, Wr = /\bsrc=["']([^"']+)["']/i, Gr = /<script(?![^>]*\basync\b)([^>]*\btype=["']module["'][^>]*)>/gi, Kr = (e) => {
1644
+ let t = e.keepScriptInHead ?? ((e) => e.startsWith("/@")), n = [], r = e.shell.replace(Ur, (e) => {
1645
+ let r = Wr.exec(e)?.[1];
1645
1646
  return r === void 0 || t(r) ? e : (n.push(r), "");
1646
1647
  });
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.`);
1648
+ e.inlineModuleScriptsAsync && (r = r.replace(Gr, "<script async$1>"));
1649
+ let i = r.indexOf(Br);
1650
+ if (i === -1) throw Error(`[voltro] the generated shell has no \`${Br}\` 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
1651
  return {
1651
- head: `${r.slice(0, i)}${Pr}`,
1652
- tail: `${Fr}${r.slice(i + 21)}`,
1652
+ head: `${r.slice(0, i)}${Vr}`,
1653
+ tail: `${Hr}${r.slice(i + 21)}`,
1653
1654
  bootstrapModules: n
1654
1655
  };
1655
- }, Br = (e) => e.head.replace("</head>", ` ${e.headInjection}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${e.htmlLang}"`), Vr = (e) => {
1656
+ }, qr = (e) => e.head.replace("</head>", ` ${e.headInjection}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${e.htmlLang}"`), Jr = (e) => {
1656
1657
  let { res: t, shell: n, htmlLang: r, headInjection: i } = e, a = null, o = !1, s = !1, c = () => {
1657
1658
  if (s || !o || a === null) return;
1658
1659
  s = !0, t.statusCode = e.statusCode ?? 200;
1659
1660
  for (let [n, r] of Object.entries(e.headers ?? {})) t.setHeader(n, r);
1660
- t.flushHeaders?.(), t.write(Br({
1661
+ t.flushHeaders?.(), t.write(qr({
1661
1662
  head: n.head,
1662
1663
  headInjection: i(a.meta),
1663
1664
  htmlLang: r
1664
1665
  }));
1665
- let c = new ye();
1666
+ let c = new he();
1666
1667
  c.pipe(t, { end: !1 }), c.on("end", () => {
1667
1668
  t.end(n.tail);
1668
1669
  }), a.stream.pipe(c);
@@ -1687,23 +1688,42 @@ import {
1687
1688
  return;
1688
1689
  }
1689
1690
  c();
1690
- }, X = T({ scope: "voltro:dev:web" }), Hr = T({ scope: "vite" }), Ur = await (async () => {
1691
+ }, Yr = (e) => Array.isArray(e.preload) && e.preload.length > 0, Xr = (e, t) => typeof e == "string" ? {
1692
+ tag: e,
1693
+ input: {}
1694
+ } : {
1695
+ tag: e.tag,
1696
+ input: e.input?.(t) ?? {}
1697
+ }, Zr = async (e) => {
1698
+ let { pageMod: t, params: n, query: r, apiName: i, seed: a, onError: o } = e;
1699
+ if (Yr(t) && !(r === void 0 || i === void 0)) for (let e of t.preload) {
1700
+ let { tag: t, input: s } = Xr(e, n);
1701
+ try {
1702
+ a(i, t, s, await r(t, s));
1703
+ } catch (e) {
1704
+ o?.({
1705
+ tag: t,
1706
+ apiName: i
1707
+ }, e);
1708
+ }
1709
+ }
1710
+ }, Z = S({ scope: "voltro:dev:web" }), Qr = S({ scope: "vite" }), $r = await (async () => {
1691
1711
  try {
1692
- let e = f(u(h(import.meta.url)), "..", "package.json"), t = await A.readFile(e, "utf8");
1712
+ let e = p(d(g(import.meta.url)), "..", "package.json"), t = await O.readFile(e, "utf8");
1693
1713
  return JSON.parse(t).version ?? "0.0.0";
1694
1714
  } catch {
1695
1715
  return "0.0.0";
1696
1716
  }
1697
- })(), Wr = async () => {
1717
+ })(), ei = async () => {
1698
1718
  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;
1719
+ let e = d(g(import.meta.url)), t = h(e, "..", "..", "devtools");
1720
+ if (T(p(t, "package.json"))) return t;
1721
+ let n = h(e, "..", "..", "..", "devtools");
1722
+ return T(p(n, "package.json")) ? n : null;
1703
1723
  } catch {
1704
1724
  return null;
1705
1725
  }
1706
- }, Gr = (e, t) => e.disableDevtools || !t ? [] : [
1726
+ }, ti = (e, t) => e.disableDevtools || !t ? [] : [
1707
1727
  "",
1708
1728
  "// Dev-only in-page devtools overlay. The `import.meta.env.DEV` guard is a",
1709
1729
  "// compile-time constant, so prod builds strip this whole `if` block — the",
@@ -1713,46 +1733,46 @@ import {
1713
1733
  " await import('@voltro/devtools/styles.css')",
1714
1734
  " Devtools = (await import('@voltro/devtools')).VoltroDevtools",
1715
1735
  "}"
1716
- ], Kr = (e, t) => e.disableDevtools || !t ? [] : [" ...(Devtools ? { Devtools } : {}),"], qr = (e) => e.sentry ? ["import { initSentryBrowser } from '@voltro/plugin-sentry/web'"] : [], Jr = (e) => e.sentry ? [
1736
+ ], ni = (e, t) => e.disableDevtools || !t ? [] : [" ...(Devtools ? { Devtools } : {}),"], ri = (e) => e.sentry ? ["import { initSentryBrowser } from '@voltro/plugin-sentry/web'"] : [], ii = (e) => e.sentry ? [
1717
1737
  "",
1718
1738
  "// Browser-side Sentry (frontend half of the deep integration). Errors +",
1719
1739
  "// browser rpc spans flow to Sentry, sharing the server transactions' trace.",
1720
1740
  `await initSentryBrowser(${JSON.stringify(e.sentry)})`
1721
- ] : [], Yr = (e) => e.env ? ["import './env.public'"] : [], Xr = (e) => {
1722
- let t = [], n = m(e);
1741
+ ] : [], ai = (e) => e.env ? ["import './env.public'"] : [], oi = (e) => {
1742
+ let t = [], n = h(e);
1723
1743
  for (;;) {
1724
- D(f(n, "pnpm-workspace.yaml")) && t.push(n);
1725
- let e = u(n);
1744
+ T(p(n, "pnpm-workspace.yaml")) && t.push(n);
1745
+ let e = d(n);
1726
1746
  if (e === n) break;
1727
1747
  n = e;
1728
1748
  }
1729
1749
  return t;
1730
- }, Zr = Mn, Qr = (e) => {
1750
+ }, si = In, ci = (e) => {
1731
1751
  if (/\/node_modules\/(?:\.pnpm\/[^/]+\/node_modules\/)?(?:react|react-dom|scheduler)\//.test(e)) return "react";
1732
1752
  let t = /\/([^/]+)\.island\.tsx?$/.exec(e);
1733
1753
  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) => {
1754
+ }, li = /export\s+(?:async\s+)?(?:const|function|let|var)\s+loader\b/, ui = (e) => e.startsWith("(") && e.endsWith(")"), di = (e) => e.filter((e) => !ui(e)), fi = (e) => {
1755
+ let t = e.replace(r, "").split("/").filter(Boolean).filter((e) => !ui(e));
1756
+ return t.length === 0 ? "/" : "/" + t.join("/");
1757
+ }, pi = (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) => {
1758
+ let t = [], i = [], a = async (e, o) => {
1739
1759
  let s = [];
1740
1760
  try {
1741
- s = await A.readdir(e, { withFileTypes: !0 });
1761
+ s = await O.readdir(e, { withFileTypes: !0 });
1742
1762
  } catch {
1743
1763
  return;
1744
1764
  }
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("/");
1765
+ let c = s.filter((e) => e.isDirectory()).map((e) => e.name).sort(), l = s.filter((e) => e.isFile() && e.name.endsWith(".tsx") && !si(e.name)).map((e) => e.name).sort(), u = new Set(l), d = o.join("/");
1746
1766
  if (l.some((e) => n.has(e))) {
1747
1767
  let t = u.has("layout.tsx"), r = !1;
1748
1768
  if (t) try {
1749
- let t = await A.readFile(f(e, "layout.tsx"), "utf8");
1750
- r = $r.test(t);
1769
+ let t = await O.readFile(p(e, "layout.tsx"), "utf8");
1770
+ r = li.test(t);
1751
1771
  } catch {}
1752
1772
  i.push({
1753
1773
  dir: d,
1754
1774
  chain: o,
1755
- contributesToUrl: o.length === 0 || !ei(o[o.length - 1]),
1775
+ contributesToUrl: o.length === 0 || !ui(o[o.length - 1]),
1756
1776
  hasLayout: t,
1757
1777
  hasLayoutLoader: r,
1758
1778
  hasError: u.has("error.tsx"),
@@ -1762,38 +1782,38 @@ import {
1762
1782
  });
1763
1783
  }
1764
1784
  for (let e of l) {
1765
- if (!t.test(e)) continue;
1785
+ if (!r.test(e)) continue;
1766
1786
  let n = d ? `${d}/${e}` : e;
1767
- r.push({
1787
+ t.push({
1768
1788
  file: n,
1769
- pattern: ni(n),
1770
- ident: ri(n),
1789
+ pattern: fi(n),
1790
+ ident: pi(n),
1771
1791
  dirChain: o
1772
1792
  });
1773
1793
  }
1774
- for (let t of c) await a(f(e, t), [...o, t]);
1794
+ for (let t of c) await a(p(e, t), [...o, t]);
1775
1795
  };
1776
- await a(e, []), r.sort((e, t) => e.file < t.file ? -1 : 1);
1796
+ await a(e, []), t.sort((e, t) => e.file < t.file ? -1 : 1);
1777
1797
  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("/"));
1798
+ for (let e of t) for (let t = e.dirChain.length; t >= 0; t--) o.add(e.dirChain.slice(0, t).join("/"));
1779
1799
  let s = [], c = [];
1780
1800
  for (let { specialFiles: e, ...t } of i) o.has(t.dir) ? s.push(t) : c.push({
1781
1801
  dir: t.dir,
1782
1802
  files: e
1783
1803
  });
1784
1804
  return {
1785
- pages: r,
1805
+ pages: t,
1786
1806
  dirs: s,
1787
1807
  orphanedSpecials: c
1788
1808
  };
1789
- }, ii = (e, t) => {
1809
+ }, mi = (e, t) => {
1790
1810
  let n = [];
1791
1811
  for (let r = 0; r <= t.length; r++) {
1792
1812
  let i = t.slice(0, r).join("/"), a = e.find((e) => e.dir === i);
1793
1813
  a && n.push(a);
1794
1814
  }
1795
1815
  return n;
1796
- }, ai = async (e) => {
1816
+ }, hi = async (e) => {
1797
1817
  let { entries: t, loadLayout: n, loadError: r, loadPending: i, ctx: a } = e, o = {};
1798
1818
  return {
1799
1819
  chain: await Promise.all(t.map(async (e, t) => {
@@ -1816,10 +1836,10 @@ import {
1816
1836
  })),
1817
1837
  segmentLoaderData: o
1818
1838
  };
1819
- }, oi = (e) => {
1820
- let t = ti(e);
1839
+ }, gi = (e) => {
1840
+ let t = di(e);
1821
1841
  return t.length === 0 ? "" : "/" + t.join("/");
1822
- }, si = [
1842
+ }, _i = [
1823
1843
  "// Hot-reload bridge: keep SSR-injected <link rel=\"stylesheet\"> tags",
1824
1844
  "// in sync with Vite's CSS HMR. Without this, edits to .css files",
1825
1845
  "// only update the JS-injected <style> overlay; the underlying <link>",
@@ -1912,7 +1932,7 @@ import {
1912
1932
  " _vdtErrorStart('Build error')",
1913
1933
  " })",
1914
1934
  "}"
1915
- ].join("\n"), ci = (e) => {
1935
+ ].join("\n"), vi = (e) => {
1916
1936
  let t = [], n = 0, r = e.split("/").filter(Boolean), i = [];
1917
1937
  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
1938
  let a = i.join("/");
@@ -1921,8 +1941,8 @@ import {
1921
1941
  paramNames: t,
1922
1942
  priority: n
1923
1943
  };
1924
- }, li = (e) => e.map((e) => {
1925
- let { regex: t, paramNames: n, priority: r } = ci(e.pattern);
1944
+ }, yi = (e) => e.map((e) => {
1945
+ let { regex: t, paramNames: n, priority: r } = vi(e.pattern);
1926
1946
  return {
1927
1947
  pattern: e.pattern,
1928
1948
  file: e.file,
@@ -1931,7 +1951,7 @@ import {
1931
1951
  paramNames: n,
1932
1952
  priority: r
1933
1953
  };
1934
- }).slice().sort((e, t) => e.priority - t.priority), ui = (e, t) => {
1954
+ }).slice().sort((e, t) => e.priority - t.priority), bi = (e, t) => {
1935
1955
  for (let n of t) {
1936
1956
  let t = n.regex.exec(e);
1937
1957
  if (!t) continue;
@@ -1943,30 +1963,30 @@ import {
1943
1963
  };
1944
1964
  }
1945
1965
  return null;
1946
- }, di = async (e, t) => {
1966
+ }, xi = async (e, t) => {
1947
1967
  let n = e;
1948
1968
  for (;;) {
1949
- let e = f(n, "node_modules", t);
1969
+ let e = p(n, "node_modules", t);
1950
1970
  try {
1951
- if ((await A.stat(e)).isDirectory()) {
1952
- let t = await A.realpath(e);
1971
+ if ((await O.stat(e)).isDirectory()) {
1972
+ let t = await O.realpath(e);
1953
1973
  return t.includes("/node_modules/") ? null : t;
1954
1974
  }
1955
1975
  } catch {}
1956
- let r = u(n);
1976
+ let r = d(n);
1957
1977
  if (r === n) return null;
1958
1978
  n = r;
1959
1979
  }
1960
- }, fi = async (e) => {
1980
+ }, Si = async (e) => {
1961
1981
  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;
1982
+ 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
1983
  return a ? {
1964
1984
  port: r,
1965
1985
  wsPath: a
1966
1986
  } : { port: r };
1967
1987
  } catch {}
1968
1988
  return { port: 4e3 };
1969
- }, pi = (e, t) => ({
1989
+ }, Ci = (e, t) => ({
1970
1990
  name: e,
1971
1991
  pkg: t.package,
1972
1992
  browserWsUrl: t.url,
@@ -1974,7 +1994,7 @@ import {
1974
1994
  ...t.serverUrl ? { serverOrigin: t.serverUrl } : {},
1975
1995
  ...t.headers ? { headers: t.headers } : {},
1976
1996
  ...t.authHeaders ? { hasAuthHeaders: !0 } : {}
1977
- }), mi = (e, t, n) => {
1997
+ }), wi = (e, t, n) => {
1978
1998
  let r = t.transport?.wsPath ?? n.wsPath;
1979
1999
  return {
1980
2000
  name: e,
@@ -1986,7 +2006,7 @@ import {
1986
2006
  ...t.headers ? { headers: t.headers } : {},
1987
2007
  ...t.authHeaders ? { hasAuthHeaders: !0 } : {}
1988
2008
  };
1989
- }, hi = (e) => {
2009
+ }, Ti = (e) => {
1990
2010
  let t = /* @__PURE__ */ new Map();
1991
2011
  for (let n of e) {
1992
2012
  if (n.proxyTarget === void 0) continue;
@@ -1994,43 +2014,43 @@ import {
1994
2014
  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
2015
  t.set(n.browserWsUrl, n.name);
1996
2016
  }
1997
- }, gi = async (e, t) => {
2017
+ }, Ei = async (e, t) => {
1998
2018
  let n = Object.entries(t.apis ?? {}), r = [];
1999
2019
  for (let [t, i] of n) {
2000
2020
  if (i.url) {
2001
- r.push(pi(t, i));
2021
+ r.push(Ci(t, i));
2002
2022
  continue;
2003
2023
  }
2004
- let n = await di(e, i.package);
2024
+ let n = await xi(e, i.package);
2005
2025
  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)));
2026
+ r.push(wi(t, i, await Si(n)));
2007
2027
  }
2008
- return hi(r), r;
2009
- }, _i = (e) => {
2028
+ return Ti(r), r;
2029
+ }, Di = (e) => {
2010
2030
  if (!(!/^wss?:\/\//.test(e) && !/^https?:\/\//.test(e))) try {
2011
2031
  let t = new URL(e);
2012
2032
  return t.protocol = t.protocol === "wss:" || t.protocol === "https:" ? "https:" : "http:", `${t.protocol}//${t.host}`;
2013
2033
  } catch {
2014
2034
  return;
2015
2035
  }
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) => {
2036
+ }, Oi = (e) => `VOLTRO_API_ORIGIN_${e.toUpperCase().replace(/[^A-Z0-9]/g, "_")}`, ki = (e) => process.env[Oi(e)] ?? process.env.VOLTRO_API_ORIGIN, Ai = (e, t) => {
2017
2037
  if (!e) return;
2018
- let n = yi(e.name) ?? e.serverOrigin;
2038
+ let n = ki(e.name) ?? e.serverOrigin;
2019
2039
  if (n) {
2020
- let e = _i(n);
2040
+ let e = Di(n);
2021
2041
  if (e) return e;
2022
2042
  }
2023
2043
  if (t?.allowDevProxy && e.proxyTarget) {
2024
- let t = _i(e.proxyTarget);
2044
+ let t = Di(e.proxyTarget);
2025
2045
  if (t) return t;
2026
2046
  }
2027
- if (!e.proxyTarget && /^wss?:\/\//.test(e.browserWsUrl)) return _i(e.browserWsUrl);
2028
- }, xi = (e, t, n) => {
2047
+ if (!e.proxyTarget && /^wss?:\/\//.test(e.browserWsUrl)) return Di(e.browserWsUrl);
2048
+ }, ji = (e, t, n) => {
2029
2049
  if (!e) {
2030
2050
  if (n?.apiName === void 0) return;
2031
2051
  let e = n.apiName;
2032
2052
  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.`);
2053
+ 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 ${Oi(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
2054
  };
2035
2055
  }
2036
2056
  return async (r, i) => {
@@ -2052,7 +2072,7 @@ import {
2052
2072
  });
2053
2073
  } catch (t) {
2054
2074
  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 });
2075
+ throw Error(`[loader.query] ${r}: could not reach the api at ${e}/rpc (${i}). ${n?.apiName ? `Set ${Oi(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
2076
  }
2057
2077
  if (!o.ok) throw Error(`[loader.query] ${r}: HTTP ${o.status} ${await o.text()}`);
2058
2078
  let s = await o.json();
@@ -2070,8 +2090,8 @@ import {
2070
2090
  }
2071
2091
  if (u) return l;
2072
2092
  };
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" ? [
2093
+ }, Mi = async (e, t, n, r = {}) => {
2094
+ 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 ei() !== null, s = t.theme === "system" ? [
2075
2095
  " <script>",
2076
2096
  " (function () {",
2077
2097
  " var root = document.documentElement",
@@ -2109,9 +2129,9 @@ import {
2109
2129
  " </body>",
2110
2130
  "</html>",
2111
2131
  ""
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.`);
2132
+ ].join("\n"), l = p(e, "src", "pages"), { pages: u, dirs: d, orphanedSpecials: f } = await $(l);
2133
+ await or(l, u);
2134
+ 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
2135
  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
2136
  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
2137
  let _ = n.map((e) => {
@@ -2122,16 +2142,16 @@ import {
2122
2142
  let e = u.map((e) => ` ${JSON.stringify(e.pattern)}: () => import('../src/pages/${e.file}'),`), n = [];
2123
2143
  for (let e of d) {
2124
2144
  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'`);
2145
+ 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
2146
  }
2127
2147
  let r = u.map((e) => {
2128
- let t = ii(d, e.dirChain).map((e) => {
2148
+ let t = mi(d, e.dirChain).map((e) => {
2129
2149
  let t = [`id: ${JSON.stringify(e.dir || "/")}`], n = JSON.stringify(e.dir);
2130
2150
  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
2151
  }).join(",\n");
2132
2152
  return ` makePageRoute(${JSON.stringify(e.pattern)}, ${t.length > 0 ? `[\n${t},\n ]` : "undefined"}),`;
2133
2153
  }), i = d.filter((e) => e.hasNotFound).map((e) => {
2134
- let t = oi(e.chain), n = ii(d, e.chain).map((e) => {
2154
+ let t = gi(e.chain), n = mi(d, e.chain).map((e) => {
2135
2155
  let t = [`id: ${JSON.stringify(e.dir || "/")}`], n = JSON.stringify(e.dir);
2136
2156
  return e.hasLayout && t.push(`Layout: refs.layouts[${n}]`), e.hasError && t.push(`Error: refs.errors[${n}]`), ` { ${t.join(", ")} }`;
2137
2157
  }).join(",\n"), r = n.length > 0 ? `\n chain: [\n${n},\n ],` : "";
@@ -2139,23 +2159,23 @@ import {
2139
2159
  }), a = [], s = [], c = [], l = [], f = [], p = [];
2140
2160
  for (let e of d) {
2141
2161
  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({
2162
+ 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
2163
  relPath: t,
2144
2164
  kind: "layout",
2145
2165
  slotKey: e.dir
2146
- })) : e.hasLayout && (s.push(` ${o}: ${Z(e.dir, "Layout")},`), a.push({
2166
+ })) : e.hasLayout && (s.push(` ${o}: ${Q(e.dir, "Layout")},`), a.push({
2147
2167
  relPath: t,
2148
2168
  kind: "layout",
2149
2169
  slotKey: e.dir
2150
- })), e.hasError && (l.push(` ${o}: ${Z(e.dir, "Error")},`), a.push({
2170
+ })), e.hasError && (l.push(` ${o}: ${Q(e.dir, "Error")},`), a.push({
2151
2171
  relPath: n,
2152
2172
  kind: "error",
2153
2173
  slotKey: e.dir
2154
- })), e.hasPending && (f.push(` ${o}: ${Z(e.dir, "Pending")},`), a.push({
2174
+ })), e.hasPending && (f.push(` ${o}: ${Q(e.dir, "Pending")},`), a.push({
2155
2175
  relPath: r,
2156
2176
  kind: "pending",
2157
2177
  slotKey: e.dir
2158
- })), e.hasNotFound && (p.push(` ${o}: ${Z(e.dir, "NotFound")},`), a.push({
2178
+ })), e.hasNotFound && (p.push(` ${o}: ${Q(e.dir, "NotFound")},`), a.push({
2159
2179
  relPath: i,
2160
2180
  kind: "notFound",
2161
2181
  slotKey: e.dir
@@ -2329,11 +2349,28 @@ import {
2329
2349
  " defaultLocale: I18N_DEFAULT,",
2330
2350
  " })",
2331
2351
  " }",
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.",
2352
+ " // Client-side: ADOPT what the server resolved, from <html lang>.",
2353
+ " //",
2354
+ " // Dropping the Accept-Language signal here is not the same as",
2355
+ " // agreeing with the server about it, and the difference is every",
2356
+ " // FIRST visit: with no cookie yet, the server negotiated",
2357
+ " // Accept-Language while the client fell through to the default, so",
2358
+ " // an English browser on a German-default app hydrated 'de' over an",
2359
+ " // 'en' tree and React discarded the whole server render — exactly",
2360
+ " // what SSR was turned on to avoid. It stops the moment anything",
2361
+ " // writes the cookie, which is why it is invisible after one",
2362
+ " // language switch and reproduces on every new visitor.",
2363
+ " //",
2364
+ " // navigator.languages is still NOT read: it can diverge from what",
2365
+ " // the server saw. The server publishes its answer instead, and the",
2366
+ " // <html lang> attribute is that answer — set from the SAME resolver",
2367
+ " // that built the provider, on the same request.",
2336
2368
  " if (typeof document === 'undefined') return I18N_DEFAULT",
2369
+ " const published = document.documentElement.lang",
2370
+ " if (published && I18N_SUPPORTED.includes(published)) return published",
2371
+ " // No published locale (a page served by something else, or an",
2372
+ " // attribute a consumer overwrote): fall back to the cookie, which",
2373
+ " // both halves can read, and never to a client-only signal.",
2337
2374
  " return resolveLocale({",
2338
2375
  " cookieHeader: document.cookie,",
2339
2376
  " acceptLanguageHeader: null,",
@@ -2370,14 +2407,14 @@ import {
2370
2407
  "// resolved apis map. Side-effect only — no local component definitions —",
2371
2408
  "// so downstream invalidations (user page edits) terminate at app.tsx.",
2372
2409
  "",
2373
- ...Yr(t),
2410
+ ...ai(t),
2374
2411
  "import { mount } from '@voltro/web'",
2375
2412
  ...g,
2376
2413
  "import { App } from './app'",
2377
2414
  "import { preloadCurrentRoute } from './routeTable'",
2378
- ...qr(t),
2379
- ...Gr(t, o),
2380
- ...Jr(t),
2415
+ ...ri(t),
2416
+ ...ti(t, o),
2417
+ ...ii(t),
2381
2418
  "",
2382
2419
  "// Preload the current route's page chunk BEFORE hydration so the first",
2383
2420
  "// client render matches the SSG/SSR-prerendered HTML. Without it, a lazy",
@@ -2394,10 +2431,10 @@ import {
2394
2431
  " apis: {",
2395
2432
  ..._,
2396
2433
  " },",
2397
- ...Kr(t, o),
2434
+ ...ni(t, o),
2398
2435
  "})",
2399
2436
  "",
2400
- si
2437
+ _i
2401
2438
  ].join("\n");
2402
2439
  } else v = "", y = "", b = [
2403
2440
  "// GENERATED BY `voltro dev` — do not edit; will be overwritten on next boot.",
@@ -2405,94 +2442,94 @@ import {
2405
2442
  "// and calls mount(). Side-effect only, no component definitions, so the",
2406
2443
  "// user's component file remains the Fast Refresh boundary.",
2407
2444
  "",
2408
- ...Yr(t),
2445
+ ...ai(t),
2409
2446
  "import { mount } from '@voltro/web'",
2410
2447
  ...g,
2411
2448
  "import App from '../src/App'",
2412
- ...qr(t),
2413
- ...Gr(t, o),
2414
- ...Jr(t),
2449
+ ...ri(t),
2450
+ ...ti(t, o),
2451
+ ...ii(t),
2415
2452
  "",
2416
2453
  "mount(App, {",
2417
2454
  " apis: {",
2418
2455
  ..._,
2419
2456
  " },",
2420
- ...Kr(t, o),
2457
+ ...ni(t, o),
2421
2458
  "})",
2422
2459
  "",
2423
- si
2460
+ _i
2424
2461
  ].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 = "";
2462
+ let x = p(e, ".framework");
2463
+ 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 }));
2464
+ let S = p(e, ".gitignore"), C = "";
2428
2465
  try {
2429
- C = await A.readFile(S, "utf8");
2466
+ C = await O.readFile(S, "utf8");
2430
2467
  } 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) {
2468
+ let w = ["/.framework/"], E = new Set(C.split("\n").map((e) => e.trim())), D = w.filter((e) => !E.has(e));
2469
+ if (D.length > 0) {
2433
2470
  let e = C === "" || C.endsWith("\n") ? "" : "\n";
2434
2471
  try {
2435
- await A.appendFile(S, `${e}${E.join("\n")}\n`, "utf8");
2472
+ await O.appendFile(S, `${e}${D.join("\n")}\n`, "utf8");
2436
2473
  } 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) });
2474
+ 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
2475
  }
2439
2476
  }
2440
- }, Si = async (e, t) => {
2477
+ }, Ni = async (e, t) => {
2441
2478
  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 = [];
2479
+ let n = p(d(e), "project.json");
2480
+ if (!T(n)) return;
2481
+ let r = await O.readFile(n, "utf8"), i = JSON.parse(r).apps ?? {}, a = e.split("/").filter(Boolean).pop() ?? "", o = [];
2445
2482
  for (let [e, n] of Object.entries(i)) e !== a && n.port === t && o.push(e);
2446
2483
  if (o.length === 0) return;
2447
- X.warn("sibling app(s) claim the same port — only one boots", {
2484
+ Z.warn("sibling app(s) claim the same port — only one boots", {
2448
2485
  port: t,
2449
2486
  conflicts: o,
2450
2487
  projectJson: n
2451
2488
  });
2452
2489
  } 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");
2490
+ }, Pi = (e) => p(e, ".framework", "dist", "server", "appConfig.js"), Fi = async (e) => {
2491
+ let t = Pi(e), n = T(t) ? t : p(e, "app.config.ts");
2455
2492
  try {
2456
- let e = (await import(g(n).href)).default;
2493
+ let e = (await import(_(n).href)).default;
2457
2494
  return typeof e == "object" && e && "type" in e && e.type === "web" ? e : null;
2458
2495
  } catch {
2459
2496
  return null;
2460
2497
  }
2461
- }, Ti = async (e) => {
2462
- let t = await wi(e);
2498
+ }, Ii = async (e) => {
2499
+ let t = await Fi(e);
2463
2500
  if (!t) return {
2464
2501
  ran: !1,
2465
2502
  exitCode: 0
2466
2503
  };
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", {
2504
+ Nn();
2505
+ let n = qt();
2506
+ fn(n), Z.info("booting voltro dev (web)", { app: t.name ?? "(unnamed)" });
2507
+ let r = await Ei(e, t);
2508
+ for (let e of r) Z.info("api wired", {
2472
2509
  name: e.name,
2473
2510
  pkg: e.pkg,
2474
2511
  ...e.proxyTarget ? { proxyTo: e.proxyTarget } : { directWs: e.browserWsUrl }
2475
2512
  });
2476
- We(e).then((e) => {
2513
+ Me(e).then((e) => {
2477
2514
  for (let t of e.files) if (t.action === "created") {
2478
2515
  let e = t.path.split("/").pop() ?? t.path;
2479
- X.info(`${e} seeded`, { path: t.path });
2516
+ Z.info(`${e} seeded`, { path: t.path });
2480
2517
  }
2481
2518
  }).catch(() => {});
2482
- let { resolved: d } = await ht({
2519
+ let { resolved: d } = await rt({
2483
2520
  rawEnv: t.env,
2484
2521
  appType: "web",
2485
2522
  root: e,
2486
- log: X,
2523
+ log: Z,
2487
2524
  generateTypes: !0
2488
- }), h = d.publicValues;
2489
- await $(e, t, u, h), X.debug("generated framework entry files", { files: [
2525
+ }), f = d.publicValues;
2526
+ await Mi(e, t, r, f), Z.debug("generated framework entry files", { files: [
2490
2527
  "index.html",
2491
2528
  ".framework/main.tsx",
2492
2529
  ...t.env ? [".framework/env.public.ts"] : []
2493
2530
  ] });
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({
2531
+ 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 = pr(_);
2532
+ await We({
2496
2533
  id: v,
2497
2534
  name: _,
2498
2535
  kind: "web",
@@ -2500,22 +2537,22 @@ import {
2500
2537
  pid: process.pid,
2501
2538
  status: "booting",
2502
2539
  logFile: y.path
2503
- }).catch(() => {}), await Si(e, g);
2504
- let { pages: b, dirs: x } = await Q(f(e, "src", "pages")), S = {
2540
+ }).catch(() => {}), await Ni(e, g);
2541
+ let { pages: b, dirs: x } = await $(p(e, "src", "pages")), S = {
2505
2542
  dirs: x,
2506
- ssrRoutes: li(b)
2507
- }, C = x.map((e) => ({
2543
+ ssrRoutes: yi(b)
2544
+ }, w = x.map((e) => ({
2508
2545
  dir: e.dir,
2509
2546
  hasLayout: e.hasLayout,
2510
2547
  hasError: e.hasError,
2511
2548
  hasPending: e.hasPending,
2512
2549
  hasNotFound: e.hasNotFound
2513
- })), w = await Yt({
2550
+ })), E = await zt({
2514
2551
  appRoot: e,
2515
2552
  pages: b
2516
2553
  });
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([
2554
+ E.wrote && Z.debug("routes codegen wrote", { path: m(e, E.path) });
2555
+ let D = await Xe("vite", () => import("vite")), ee = (await import("@vitejs/plugin-react")).default, te = (await import("@tailwindcss/vite")).default, k = p(e, ".framework"), A = p(e, "src"), ne = /* @__PURE__ */ new Set([
2519
2556
  ".framework",
2520
2557
  "node_modules",
2521
2558
  "dist",
@@ -2523,88 +2560,88 @@ import {
2523
2560
  ".vite",
2524
2561
  ".turbo",
2525
2562
  ".cache"
2526
- ]), N = {
2563
+ ]), re = {
2527
2564
  name: "framework:watch-app-sources",
2528
2565
  async configureServer(t) {
2529
2566
  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));
2532
- n.length === 0 && t.watcher.add(j);
2567
+ let n = (await O.readdir(e, { withFileTypes: !0 })).filter((e) => e.isDirectory() && !ne.has(e.name));
2568
+ for (let r of n) t.watcher.add(p(e, r.name));
2569
+ n.length === 0 && t.watcher.add(A);
2533
2570
  } catch {
2534
- t.watcher.add(j);
2571
+ t.watcher.add(A);
2535
2572
  }
2536
2573
  try {
2537
- let n = await A.readFile(f(e, "package.json"), "utf8"), r = JSON.parse(n), i = Object.keys({
2574
+ let n = await O.readFile(p(e, "package.json"), "utf8"), r = JSON.parse(n), i = Object.keys({
2538
2575
  ...r.dependencies,
2539
2576
  ...r.devDependencies
2540
2577
  });
2541
2578
  await Promise.all(i.map(async (n) => {
2542
- let r = await di(e, n);
2579
+ let r = await xi(e, n);
2543
2580
  if (!r) return;
2544
- let i = f(r, "src");
2581
+ let i = p(r, "src");
2545
2582
  try {
2546
- (await A.stat(i)).isDirectory() && t.watcher.add(i);
2583
+ (await O.stat(i)).isDirectory() && t.watcher.add(i);
2547
2584
  } catch {}
2548
2585
  }));
2549
2586
  } catch {}
2550
2587
  }
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) => {
2588
+ }, j = p(e, "src", "pages"), M = (e) => e.endsWith(".tsx") && (e === j || e.startsWith(j + "/")), ie = (e) => e === j || e.startsWith(j + "/"), N = async (n) => {
2552
2589
  try {
2553
- let r = Date.now();
2554
- await $(e, t, u, h);
2555
- let { pages: i, dirs: a } = await Q(P);
2556
- await Yt({
2590
+ let i = Date.now();
2591
+ await Mi(e, t, r, f);
2592
+ let { pages: a, dirs: o } = await $(j);
2593
+ await zt({
2557
2594
  appRoot: e,
2558
- pages: i
2559
- }), S.dirs = a, S.ssrRoutes = li(i), X.info("page tree regenerated", {
2595
+ pages: a
2596
+ }), S.dirs = o, S.ssrRoutes = yi(a), Z.info("page tree regenerated", {
2560
2597
  reason: n,
2561
- ms: Date.now() - r,
2598
+ ms: Date.now() - i,
2562
2599
  routes: S.ssrRoutes.length
2563
2600
  });
2564
2601
  } catch (e) {
2565
- X.error("page tree regen failed", { reason: n }, e);
2602
+ Z.error("page tree regen failed", { reason: n }, e);
2566
2603
  }
2567
- }, I = {
2604
+ }, P = {
2568
2605
  name: "framework:regenerate-on-page-tree-change",
2569
2606
  configureServer(t) {
2570
2607
  let n = null, r = [], i = (e) => {
2571
2608
  r.push(e), n && clearTimeout(n), n = setTimeout(() => {
2572
2609
  n = null;
2573
2610
  let e = r.length === 1 ? r[0] : `${r.length} events (${r[0]}, …)`;
2574
- r.length = 0, ne(e);
2611
+ r.length = 0, N(e);
2575
2612
  }, 50);
2576
2613
  };
2577
2614
  t.watcher.on("add", (t) => {
2578
- te(t) && i(`add ${p(e, t)}`);
2615
+ M(t) && i(`add ${m(e, t)}`);
2579
2616
  }), t.watcher.on("unlink", (t) => {
2580
- te(t) && i(`unlink ${p(e, t)}`);
2617
+ M(t) && i(`unlink ${m(e, t)}`);
2581
2618
  }), t.watcher.on("addDir", (t) => {
2582
- F(t) && i(`addDir ${p(e, t)}`);
2619
+ ie(t) && i(`addDir ${m(e, t)}`);
2583
2620
  }), t.watcher.on("unlinkDir", (t) => {
2584
- F(t) && i(`unlinkDir ${p(e, t)}`);
2621
+ ie(t) && i(`unlinkDir ${m(e, t)}`);
2585
2622
  });
2586
2623
  }
2587
- }, L = f(e, "app.config.ts"), R = (e) => {
2588
- if (!ue(e.env)) return "";
2624
+ }, F = p(e, "app.config.ts"), ae = (e) => {
2625
+ if (!z(e.env)) return "";
2589
2626
  let t = Object.entries(e.env.vars).map(([e, t]) => `${e}:${t.access}`).sort();
2590
2627
  return `${String(e.env.publicPrefix)}|${t.join(",")}`;
2591
- }, re = (e, t) => {
2628
+ }, I = (e, t) => {
2592
2629
  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 = {
2630
+ 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"), ae(e) !== ae(t) && n.push("env"), n;
2631
+ }, L = t, R = h(F), oe = {
2595
2632
  name: "framework:watch-app-config",
2596
2633
  async configureServer(t) {
2597
- t.watcher.add(L), X.info("watching app.config.ts for changes", { path: p(e, L) });
2634
+ t.watcher.add(F), Z.info("watching app.config.ts for changes", { path: m(e, F) });
2598
2635
  let n = async () => {
2599
2636
  try {
2600
2637
  try {
2601
- let e = t.moduleGraph.getModuleById(L);
2638
+ let e = t.moduleGraph.getModuleById(F);
2602
2639
  e && t.moduleGraph.invalidateModule(e);
2603
2640
  } 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);
2641
+ let e = (await t.ssrLoadModule(F, { fixStacktrace: !0 })).default;
2642
+ 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
2643
  } catch (e) {
2607
- return X.warn("app.config.ts re-load failed — ignoring this change", {}, e), null;
2644
+ return Z.warn("app.config.ts re-load failed — ignoring this change", {}, e), null;
2608
2645
  }
2609
2646
  }, r = null, i = () => {
2610
2647
  r && clearTimeout(r), r = setTimeout(() => {
@@ -2613,24 +2650,24 @@ import {
2613
2650
  }, a = async () => {
2614
2651
  let r = await n();
2615
2652
  if (!r) {
2616
- X.info("app.config.ts onConfigChange: load returned null — skipping");
2653
+ Z.info("app.config.ts onConfigChange: load returned null — skipping");
2617
2654
  return;
2618
2655
  }
2619
- if (X.info("app.config.ts onConfigChange: loaded", {
2656
+ if (Z.info("app.config.ts onConfigChange: loaded", {
2620
2657
  theme: r.theme,
2621
2658
  port: r.port,
2622
2659
  name: r.name
2623
- }), JSON.stringify(r) === JSON.stringify(ie)) {
2624
- X.info("app.config.ts onConfigChange: parsed config unchanged — skipping (no-op edit?)");
2660
+ }), JSON.stringify(r) === JSON.stringify(L)) {
2661
+ Z.info("app.config.ts onConfigChange: parsed config unchanged — skipping (no-op edit?)");
2625
2662
  return;
2626
2663
  }
2627
- let i = re(ie, r);
2664
+ let i = I(L, r);
2628
2665
  if (i.length > 0) {
2629
- X.warn("app.config.ts changed — hard restart required", { fields: i });
2666
+ Z.warn("app.config.ts changed — hard restart required", { fields: i });
2630
2667
  try {
2631
2668
  await t.close();
2632
2669
  } catch {}
2633
- let e = _e(process.execPath, [...process.execArgv, ...process.argv.slice(1)], {
2670
+ let e = pe(process.execPath, [...process.execArgv, ...process.argv.slice(1)], {
2634
2671
  stdio: "inherit",
2635
2672
  env: process.env,
2636
2673
  cwd: process.cwd()
@@ -2640,57 +2677,57 @@ import {
2640
2677
  process.on("SIGINT", r), process.on("SIGTERM", a), e.on("exit", (e, t) => {
2641
2678
  process.off("SIGINT", r), process.off("SIGTERM", a), t ? process.kill(process.pid, t) : process.exit(e ?? 0);
2642
2679
  }), e.on("error", (e) => {
2643
- X.error("restart spawn failed", {}, e), process.exit(1);
2680
+ Z.error("restart spawn failed", {}, e), process.exit(1);
2644
2681
  });
2645
2682
  return;
2646
2683
  }
2647
2684
  try {
2648
2685
  let n = Date.now();
2649
- await $(e, r, await gi(e, r)), ie = r, t.ws && t.ws.send({
2686
+ await Mi(e, r, await Ei(e, r)), L = r, t.ws && t.ws.send({
2650
2687
  type: "full-reload",
2651
2688
  path: "*"
2652
- }), X.info("app.config.ts soft-regen", {
2689
+ }), Z.info("app.config.ts soft-regen", {
2653
2690
  ms: Date.now() - n,
2654
2691
  reload: "full"
2655
2692
  });
2656
2693
  } catch (e) {
2657
- X.error("app.config.ts soft-regen failed", {}, e);
2694
+ Z.error("app.config.ts soft-regen failed", {}, e);
2658
2695
  }
2659
- }, o = (e) => l(e) === "app.config.ts" ? e === L || m(e) === ae : !1;
2696
+ }, o = (e) => u(e) === "app.config.ts" ? e === F || h(e) === R : !1;
2660
2697
  t.watcher.on("change", (e) => {
2661
- o(e) && (X.info("app.config.ts change event (chokidar)", { file: e }), i());
2698
+ o(e) && (Z.info("app.config.ts change event (chokidar)", { file: e }), i());
2662
2699
  }), t.watcher.on("add", (e) => {
2663
- o(e) && (X.info("app.config.ts add event (chokidar)", { file: e }), i());
2700
+ o(e) && (Z.info("app.config.ts add event (chokidar)", { file: e }), i());
2664
2701
  });
2665
2702
  try {
2666
2703
  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 });
2704
+ e(F, { interval: 500 }, (e, t) => {
2705
+ e.mtimeMs !== t.mtimeMs && (Z.info("app.config.ts change event (poll)", { mtime: e.mtimeMs }), i());
2706
+ }), Z.info("app.config.ts polling watcher attached", { intervalMs: 500 });
2670
2707
  } catch (e) {
2671
- X.warn("app.config.ts polling watcher could not attach", {}, e);
2708
+ Z.warn("app.config.ts polling watcher could not attach", {}, e);
2672
2709
  }
2673
- Ot(Tt, X, {
2710
+ _t(mt, Z, {
2674
2711
  root: e,
2675
2712
  onBeforeRestart: () => t.close()
2676
2713
  });
2677
2714
  }
2678
- }, se = /\/apps\/[^/]+\/.*\.(route|mutation|workflow|schema)\.tsx?$/, ce = {
2715
+ }, se = /\/apps\/[^/]+\/.*\.(route|mutation|workflow|schema)\.tsx?$/, B = 0, ce = {
2679
2716
  name: "framework:suppress-api-hmr",
2680
2717
  handleHotUpdate(e) {
2681
- if (se.test(e.file)) return [];
2718
+ if (B += 1, se.test(e.file)) return [];
2682
2719
  }
2683
2720
  }, le = {
2684
2721
  name: "framework:reoptimize-on-rpcgroup-change",
2685
2722
  async configureServer(t) {
2686
2723
  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");
2724
+ for (let i of r) {
2725
+ if (!i.proxyTarget) continue;
2726
+ let r = await xi(e, i.pkg);
2727
+ if (!r) continue;
2728
+ let a = p(r, "rpcGroup.generated.ts");
2692
2729
  try {
2693
- n.set(a, await A.readFile(a, "utf8"));
2730
+ n.set(a, await O.readFile(a, "utf8"));
2694
2731
  } catch {
2695
2732
  n.set(a, "");
2696
2733
  }
@@ -2699,105 +2736,105 @@ import {
2699
2736
  } catch {}
2700
2737
  }
2701
2738
  if (n.size === 0) return;
2702
- let r = null, i = !1, a = async () => {
2703
- if (i) return;
2739
+ let i = null, a = !1, o = async () => {
2740
+ if (a) return;
2704
2741
  let r = null;
2705
2742
  for (let [e, t] of n) {
2706
2743
  let i;
2707
2744
  try {
2708
- i = await A.readFile(e, "utf8");
2745
+ i = await O.readFile(e, "utf8");
2709
2746
  } catch {
2710
2747
  continue;
2711
2748
  }
2712
2749
  i !== t && (n.set(e, i), r = e);
2713
2750
  }
2714
2751
  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)`);
2752
+ a = !0, Z.info(`rpcGroup changed (${m(e, r)}) — re-bundling the api client + reloading (descriptor edits propagate automatically; no manual restart needed)`);
2716
2753
  try {
2717
- await A.rm(f(k, ".vite", "deps"), {
2754
+ await O.rm(p(k, ".vite", "deps"), {
2718
2755
  recursive: !0,
2719
2756
  force: !0
2720
2757
  }), await t.restart(!0);
2721
2758
  } catch (e) {
2722
- i = !1, X.error("rpcGroup re-optimize failed", {}, e);
2759
+ a = !1, Z.error("rpcGroup re-optimize failed", {}, e);
2723
2760
  }
2724
2761
  }
2725
- }, o = (e) => {
2726
- n.has(m(e)) && (r && clearTimeout(r), r = setTimeout(() => {
2727
- a();
2762
+ }, s = (e) => {
2763
+ n.has(h(e)) && (i && clearTimeout(i), i = setTimeout(() => {
2764
+ o();
2728
2765
  }, 120));
2729
2766
  };
2730
- t.watcher.on("change", o), t.watcher.on("add", o);
2767
+ t.watcher.on("change", s), t.watcher.on("add", s);
2731
2768
  }
2732
- }, z = {}, de = (e) => (t) => {
2769
+ }, V = {}, ue = (e) => (t) => {
2733
2770
  t.on("proxyReq", (t, n) => {
2734
- Dn(t, n, {
2771
+ jn(t, n, {
2735
2772
  target: e,
2736
2773
  token: process.env.VOLTRO_INSPECT_TOKEN,
2737
2774
  writeToken: process.env.VOLTRO_INSPECT_WRITE_TOKEN,
2738
- isLoopback: r
2775
+ isLoopback: i
2739
2776
  });
2740
2777
  });
2741
2778
  };
2742
- for (let e of u) {
2779
+ for (let e of r) {
2743
2780
  if (!e.proxyTarget) continue;
2744
- z[e.browserWsUrl] = {
2781
+ V[e.browserWsUrl] = {
2745
2782
  target: e.proxyTarget,
2746
2783
  ws: !0,
2747
2784
  changeOrigin: !0,
2748
2785
  ...e.wsPath ? {} : { rewrite: () => "/ws" }
2749
2786
  };
2750
2787
  let t = e.proxyTarget.replace(/^ws/, "http");
2751
- z[`/_voltro/api/${e.name}`] = {
2788
+ V[`/_voltro/api/${e.name}`] = {
2752
2789
  target: t,
2753
2790
  changeOrigin: !0,
2754
2791
  rewrite: (t) => t.replace(RegExp(`^/_voltro/api/${e.name}`), ""),
2755
- configure: de(t)
2792
+ configure: ue(t)
2756
2793
  };
2757
2794
  }
2758
2795
  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 });
2796
+ if (V[e]) {
2797
+ Z.warn("user proxy ignored — prefix already claimed by an api ws proxy", { prefix: e });
2761
2798
  continue;
2762
2799
  }
2763
- z[e] = {
2800
+ V[e] = {
2764
2801
  target: n.target,
2765
2802
  changeOrigin: n.changeOrigin ?? !0,
2766
2803
  ...n.rewrite === void 0 ? {} : { rewrite: (t) => t.replace(RegExp(`^${e}`), n.rewrite) }
2767
- }, X.info(`proxy ${e} → ${n.target}`, {
2804
+ }, Z.info(`proxy ${e} → ${n.target}`, {
2768
2805
  prefix: e,
2769
2806
  target: n.target,
2770
2807
  ...n.rewrite === void 0 ? {} : { rewrite: n.rewrite }
2771
2808
  });
2772
2809
  }
2773
- let fe = {
2810
+ let de = {
2774
2811
  name: "framework:inspect",
2775
- configureServer(l) {
2812
+ configureServer(r) {
2776
2813
  let u = null, d = async () => {
2777
2814
  if (u !== null) return u;
2778
2815
  let t = [];
2779
2816
  for (let n of b) try {
2780
- let r = await l.ssrLoadModule(f(e, "src", "pages", n.file));
2817
+ let i = await r.ssrLoadModule(p(e, "src", "pages", n.file));
2781
2818
  t.push({
2782
2819
  pattern: n.pattern,
2783
2820
  file: n.file,
2784
2821
  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"
2822
+ renderMode: Qn(i, p("src", "pages", n.file)),
2823
+ interactive: i.interactive ?? "full",
2824
+ tenantAware: i.tenantAware === !0,
2825
+ revalidateMs: ct(i.revalidate),
2826
+ staleWhileRevalidateMs: ct(i.staleWhileRevalidate) ?? 0,
2827
+ cacheInvalidatesOn: Array.isArray(i.cacheInvalidatesOn) ? i.cacheInvalidatesOn : [],
2828
+ hasLoader: typeof i.loader == "function",
2829
+ hasMeta: i.meta != null,
2830
+ hasGetStaticPaths: typeof i.getStaticPaths == "function"
2794
2831
  });
2795
2832
  } catch (e) {
2796
- X.warn("inspect: failed to load page metadata", { pattern: n.pattern }, e);
2833
+ Z.warn("inspect: failed to load page metadata", { pattern: n.pattern }, e);
2797
2834
  }
2798
2835
  return u = t, t;
2799
2836
  };
2800
- l.middlewares.use((e, t, r) => {
2837
+ r.middlewares.use((e, t, r) => {
2801
2838
  let i = e.url ?? "/";
2802
2839
  if (i.startsWith("/_voltro/inspect") || i.startsWith("/api/dashboard/proxy")) return r();
2803
2840
  let a = Date.now(), o = t.end.bind(t);
@@ -2811,33 +2848,38 @@ import {
2811
2848
  } catch {}
2812
2849
  return o(...e);
2813
2850
  }), 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");
2851
+ }), r.middlewares.use((t, n, r) => {
2852
+ if (t.method !== "GET" && t.method !== "HEAD") return r();
2853
+ let { pathname: i } = Ir(t.url ?? "/");
2854
+ if (i !== "/robots.txt" || T(p(e, "public", "robots.txt"))) return r();
2855
+ n.statusCode = 200, n.setHeader("Content-Type", "text/plain; charset=utf-8"), n.end(Gt({ indexable: !1 }));
2856
+ }), t.name === "voltroDashboard" && r.middlewares.use(async (e, t, n) => {
2857
+ let r = e.url ?? "", a = r.split("?")[0];
2858
+ if (a === "/api/dashboard/proxy") {
2859
+ let n = new URL(r, "http://x").searchParams.get("target");
2818
2860
  if (!n) {
2819
2861
  t.statusCode = 400, t.end("missing ?target=");
2820
2862
  return;
2821
2863
  }
2822
- if (!a(n)) {
2864
+ if (!o(n)) {
2823
2865
  t.statusCode = 400, t.end("target not allowed: must be loopback or an origin configured in VOLTRO_DASHBOARD_APPS");
2824
2866
  return;
2825
2867
  }
2826
2868
  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}`);
2869
+ let r = { accept: String(e.headers.accept ?? "application/json") };
2870
+ e.headers.authorization ? r.authorization = String(e.headers.authorization) : i(n) && process.env.VOLTRO_INSPECT_TOKEN && (r.authorization = `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}`);
2829
2871
  let a;
2830
2872
  if (e.method && e.method !== "GET" && e.method !== "HEAD") {
2831
2873
  let t = [];
2832
2874
  for await (let n of e) t.push(n);
2833
2875
  a = Buffer.concat(t);
2834
2876
  let n = e.headers["content-type"];
2835
- n && (i["content-type"] = Array.isArray(n) ? n[0] : String(n));
2877
+ n && (r["content-type"] = Array.isArray(n) ? n[0] : String(n));
2836
2878
  }
2837
2879
  let o = await fetch(n, {
2838
2880
  redirect: "manual",
2839
2881
  ...e.method ? { method: e.method } : {},
2840
- headers: i,
2882
+ headers: r,
2841
2883
  ...a && a.length ? { body: new Uint8Array(a.buffer, a.byteOffset, a.byteLength) } : {}
2842
2884
  }), s = Buffer.from(await o.arrayBuffer());
2843
2885
  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);
@@ -2846,30 +2888,30 @@ import {
2846
2888
  }
2847
2889
  return;
2848
2890
  }
2849
- if (o === "/api/dashboard/proxy/stream") {
2850
- let n = new URL(i, "http://x").searchParams.get("target");
2891
+ if (a === "/api/dashboard/proxy/stream") {
2892
+ let n = new URL(r, "http://x").searchParams.get("target");
2851
2893
  if (!n) {
2852
2894
  t.statusCode = 400, t.end("missing ?target=");
2853
2895
  return;
2854
2896
  }
2855
- if (!a(n)) {
2897
+ if (!o(n)) {
2856
2898
  t.statusCode = 400, t.end("target not allowed: must be loopback or an origin configured in VOLTRO_DASHBOARD_APPS");
2857
2899
  return;
2858
2900
  }
2859
- let o = new AbortController();
2860
- e.on("close", () => o.abort()), t.on("close", () => o.abort());
2901
+ let a = new AbortController();
2902
+ e.on("close", () => a.abort()), t.on("close", () => a.abort());
2861
2903
  try {
2862
- let i = await fetch(n, {
2904
+ let r = await fetch(n, {
2863
2905
  redirect: "manual",
2864
2906
  method: "GET",
2865
2907
  headers: {
2866
2908
  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}` } : {}
2909
+ ...e.headers.authorization ? { authorization: String(e.headers.authorization) } : i(n) && process.env.VOLTRO_INSPECT_TOKEN ? { authorization: `Bearer ${process.env.VOLTRO_INSPECT_TOKEN}` } : {}
2868
2910
  },
2869
- signal: o.signal
2911
+ signal: a.signal
2870
2912
  });
2871
- if (!i.ok || !i.body) {
2872
- t.statusCode = i.status, t.end(`upstream ${i.status}`);
2913
+ if (!r.ok || !r.body) {
2914
+ t.statusCode = r.status, t.end(`upstream ${r.status}`);
2873
2915
  return;
2874
2916
  }
2875
2917
  t.writeHead(200, {
@@ -2878,15 +2920,15 @@ import {
2878
2920
  connection: "keep-alive",
2879
2921
  "x-accel-buffering": "no"
2880
2922
  });
2881
- let a = i.body.getReader();
2923
+ let o = r.body.getReader();
2882
2924
  try {
2883
2925
  for (;;) {
2884
- let { done: e, value: n } = await a.read();
2926
+ let { done: e, value: n } = await o.read();
2885
2927
  if (e) break;
2886
2928
  n && t.write(Buffer.from(n));
2887
2929
  }
2888
2930
  } finally {
2889
- a.releaseLock(), t.end();
2931
+ o.releaseLock(), t.end();
2890
2932
  }
2891
2933
  } catch (e) {
2892
2934
  e.name !== "AbortError" && (t.statusCode = 502, t.end(`proxy stream error: ${e.message}`));
@@ -2894,32 +2936,32 @@ import {
2894
2936
  return;
2895
2937
  }
2896
2938
  n();
2897
- }), l.middlewares.use(async (e, r, a) => {
2898
- let l = e.url ?? "";
2899
- if (!l.startsWith("/_voltro/inspect")) return a();
2939
+ }), r.middlewares.use(async (e, r, i) => {
2940
+ let o = e.url ?? "";
2941
+ if (!o.startsWith("/_voltro/inspect")) return i();
2900
2942
  let u = {};
2901
2943
  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);
2944
+ let f = o.split("?")[0];
2945
+ if (e.method === "GET" && (f === "/_voltro/inspect/logs" || o.startsWith("/_voltro/inspect/logs?"))) {
2946
+ let e = a(u.origin), t = Tn(o, sn(), u);
2905
2947
  r.statusCode = t.status, r.setHeader("content-type", t.contentType);
2906
2948
  for (let [t, n] of Object.entries(e)) r.setHeader(t, n);
2907
2949
  r.end(t.body);
2908
2950
  return;
2909
2951
  }
2910
2952
  if (e.method === "POST" && f === "/_voltro/inspect/clientLog") {
2911
- let t = c(u.origin);
2912
- if (i()) {
2953
+ let t = a(u.origin);
2954
+ if (c()) {
2913
2955
  r.statusCode = 503, r.setHeader("content-type", "application/json");
2914
2956
  for (let [e, n] of Object.entries(t)) r.setHeader(e, n);
2915
2957
  r.end(JSON.stringify({ error: "inspect disabled (VOLTRO_INSPECT=off)" }));
2916
2958
  return;
2917
2959
  }
2918
- let a = "";
2960
+ let i = "";
2919
2961
  e.setEncoding("utf-8"), e.on("data", (e) => {
2920
- a += e;
2962
+ i += e;
2921
2963
  }), e.on("end", () => {
2922
- let e = hn(a, n);
2964
+ let e = yn(i, n);
2923
2965
  r.statusCode = e.status, r.setHeader("content-type", e.contentType);
2924
2966
  for (let [e, n] of Object.entries(t)) r.setHeader(e, n);
2925
2967
  r.end(e.body);
@@ -2929,35 +2971,35 @@ import {
2929
2971
  return;
2930
2972
  }
2931
2973
  if (f === "/_voltro/inspect/stream") {
2932
- let t = c(u.origin);
2933
- if (i()) {
2974
+ let t = a(u.origin);
2975
+ if (c()) {
2934
2976
  r.statusCode = 503, r.setHeader("content-type", "application/json");
2935
2977
  for (let [e, n] of Object.entries(t)) r.setHeader(e, n);
2936
2978
  r.end(JSON.stringify({ error: "inspect disabled (VOLTRO_INSPECT=off)" }));
2937
2979
  return;
2938
2980
  }
2939
- let a = o(u, "GET");
2940
- if (!a.ok) {
2981
+ let i = s(u, "GET");
2982
+ if (!i.ok) {
2941
2983
  r.statusCode = 401, r.setHeader("content-type", "application/json");
2942
2984
  for (let [e, n] of Object.entries(t)) r.setHeader(e, n);
2943
2985
  r.end(JSON.stringify({
2944
2986
  error: "unauthorized",
2945
- reason: a.reason
2987
+ reason: i.reason
2946
2988
  }));
2947
2989
  return;
2948
2990
  }
2949
2991
  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
2992
  for (let [e, n] of Object.entries(t)) r.setHeader(e, n);
2951
2993
  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));
2994
+ let l = o.indexOf("?");
2995
+ if (!(l !== -1 && new URLSearchParams(o.slice(l + 1)).get("live") === "1")) for (let e of n.buffered()) r.write(Jt(e));
2954
2996
  let d = n.subscribe((e) => {
2955
2997
  try {
2956
- r.write(Qt(e));
2998
+ r.write(Jt(e));
2957
2999
  } catch {}
2958
3000
  }), f = setInterval(() => {
2959
3001
  try {
2960
- r.write($t());
3002
+ r.write(Yt());
2961
3003
  } catch {}
2962
3004
  }, 15e3), p = () => {
2963
3005
  clearInterval(f), d();
@@ -2966,11 +3008,11 @@ import {
2966
3008
  return;
2967
3009
  }
2968
3010
  try {
2969
- let n = s(l, {
3011
+ let n = l(o, {
2970
3012
  kind: "web",
2971
3013
  meta: {
2972
3014
  name: t.name ?? "(unnamed)",
2973
- voltroVersion: Ur,
3015
+ voltroVersion: $r,
2974
3016
  port: g,
2975
3017
  mode: "dev",
2976
3018
  apis: Object.entries(t.apis ?? {}).map(([e, t]) => {
@@ -2982,15 +3024,15 @@ import {
2982
3024
  })
2983
3025
  },
2984
3026
  routes: await d(),
2985
- dirs: C,
3027
+ dirs: w,
2986
3028
  cache: () => ({
2987
3029
  backend: "memory",
2988
3030
  size: 0,
2989
3031
  entries: []
2990
3032
  }),
2991
- env: () => _t(t.name ?? "app", { contract: ue(t.env) ? t.env : void 0 })
3033
+ env: () => at(t.name ?? "app", { contract: z(t.env) ? t.env : void 0 })
2992
3034
  }, u, { method: e.method ?? "GET" });
2993
- if (n === null) return a();
3035
+ if (n === null) return i();
2994
3036
  r.statusCode = n.status, r.setHeader("content-type", n.contentType);
2995
3037
  for (let [e, t] of Object.entries(n.headers ?? {})) r.setHeader(e, t);
2996
3038
  r.end(n.body);
@@ -2999,363 +3041,407 @@ import {
2999
3041
  }
3000
3042
  });
3001
3043
  }
3002
- }, pe = t.name === "voltroDashboard" ? {
3044
+ }, me = t.name === "voltroDashboard" ? {
3003
3045
  name: "framework:dashboard-registry",
3004
3046
  configureServer(e) {
3005
3047
  e.middlewares.use(async (e, t, n) => {
3006
3048
  if (!(e.url ?? "").startsWith("/api/dashboard/registry")) return n();
3007
3049
  try {
3008
- let e = await tt();
3050
+ let e = await Ue();
3009
3051
  t.statusCode = 200, t.setHeader("content-type", "application/json; charset=utf-8"), t.end(JSON.stringify(e));
3010
3052
  } catch (e) {
3011
3053
  t.statusCode = 500, t.setHeader("content-type", "text/plain"), t.end(`registry read error: ${e.message}`);
3012
3054
  }
3013
3055
  });
3014
3056
  }
3015
- } : null, me = /* @__PURE__ */ new Set(), he = (e, t, n, r, i) => {
3016
- if (X.error(`${t} render failed`, {
3057
+ } : null, he = /* @__PURE__ */ new Set(), H = (e, t, n, r, i, a = !1) => {
3058
+ let o = zr(i, a, t) ?? "";
3059
+ if (Z.error(`${t} render failed`, {
3017
3060
  pathname: n,
3018
- pattern: r
3019
- }, i), e.headersSent) {
3061
+ pattern: r,
3062
+ cause: Zt(i) + o
3063
+ }), e.headersSent) {
3020
3064
  e.end();
3021
3065
  return;
3022
3066
  }
3023
3067
  e.writeHead(500, {
3024
3068
  "content-type": "text/plain; charset=utf-8",
3025
- "x-voltro-rendered-by": `${t}-failed`
3069
+ "x-voltro-rendered-by": `${t}-failed`,
3070
+ "x-voltro-ssr-generation": String(B)
3026
3071
  });
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`, {
3072
+ let s = B === 0 ? "" : `\n[voltro] this process has absorbed ${B} hot update(s) since boot, so its SSR\nmodule graph may not match the files on disk. Before reporting this — to us or to\nyourself — restart \`voltro dev\` and measure once from a fresh boot.\n`;
3073
+ e.end(`${t} render failed for ${n}\n\n${Zt(i)}\n${o}\n${s}`);
3074
+ }, U = Dt(), ge = kt({
3075
+ limit: U,
3076
+ onColdStart: (e) => Z.debug("ssr cold-compile start", { id: e }),
3077
+ onColdEnd: (e, { durationMs: t, failed: n }) => Z.debug(`ssr cold-compile ${n ? "FAILED" : "end"} ${t}ms`, {
3033
3078
  id: e,
3034
3079
  ms: t,
3035
3080
  ...n ? { failed: !0 } : {}
3036
3081
  })
3037
3082
  });
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 = {
3083
+ Z.debug(`ssr cold-compile concurrency ${U}`, { concurrency: U });
3084
+ let W = null, _e = async () => (W === null && (W = await O.readFile(p(e, ".framework", "index.html"), "utf8")), W), ve = {
3040
3085
  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
3086
+ configureServer(n) {
3087
+ let i = (e) => ge.load(e, async () => await n.ssrLoadModule(e)), a, o = () => {
3088
+ if (a !== void 0) return a;
3089
+ let n = t.locales ?? [], r = t.defaultLocale ?? n[0] ?? "en";
3090
+ return n.length === 0 ? (a = Promise.resolve(() => void 0), a) : (a = (async () => {
3091
+ let [{ makeSsgWrap: t }, { makeSsrI18nResolver: a }] = await Promise.all([i("@voltro/i18n"), i("@voltro/i18n/server")]), o = {};
3092
+ for (let a of n) if (T(p(e, "src", "locales", `${a}.ts`))) try {
3093
+ let n = (await i(p(e, "src", "locales", `${a}.ts`))).default;
3094
+ n !== void 0 && (o[a] = t(a, n, r));
3095
+ } catch (e) {
3096
+ Z.warn("locale catalog failed to load for SSR", { locale: a }, e);
3097
+ }
3098
+ return a({
3099
+ wraps: o,
3100
+ supported: n,
3101
+ defaultLocale: r
3102
+ });
3103
+ })(), a);
3104
+ };
3105
+ n.middlewares.use(async (a, s, c) => {
3106
+ if (a.method !== "GET" && a.method !== "HEAD") return c();
3107
+ let l = a.url ?? "/";
3108
+ l.indexOf("?");
3109
+ let { pathname: u, search: d } = Ir(l);
3110
+ 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();
3111
+ let f = bi(u, S.ssrRoutes);
3112
+ if (!f) return c();
3113
+ let m = !he.has(f.route.pattern), h = Date.now();
3114
+ m && Z.info(`ssr compiling ${f.route.pattern}`, {
3115
+ pattern: f.route.pattern,
3116
+ pathname: u
3055
3117
  });
3056
- let m = {}, h = async (e, t) => {
3118
+ let g = {}, _ = async (e, t) => {
3057
3119
  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)) {
3120
+ return g[e] = (g[e] ?? 0) + (Date.now() - n), r;
3121
+ }, v = async (e, t, r) => {
3122
+ let i = await n.moduleGraph.getModuleById(e);
3123
+ if (!(!i || t.has(e))) {
3124
+ if (t.add(e), i.id && /\.(css|sass|scss|less|stylus|pcss|postcss)(\?|$)/.test(i.id)) {
3063
3125
  let e = i.url.replace(/\?.*$/, "");
3064
3126
  r.includes(e) || r.push(e);
3065
3127
  return;
3066
3128
  }
3067
- for (let e of i.importedModules ?? []) e.id && await g(e.id, n, r);
3129
+ for (let e of i.importedModules ?? []) e.id && await v(e.id, t, r);
3068
3130
  }
3069
- };
3131
+ }, y = !1;
3070
3132
  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 = {};
3133
+ let b = await _("loadPage", async () => await i(p(e, "src", "pages", f.route.file))), x = Qn(b, p("src", "pages", f.route.file)), C = mi(S.dirs, f.route.dirChain), w = x === "spa" && C.some((e) => e.hasLayout);
3134
+ if (x !== "ssr" && x !== "isr" && !w) return c();
3135
+ let T = {};
3136
+ for (let [e, t] of Object.entries(a.headers ?? {})) typeof t == "string" ? T[e] = t : Array.isArray(t) && (T[e] = t.join(", "));
3137
+ let E = ji(Ai(r[0], { allowDevProxy: !0 }), T.cookie, { apiName: r[0]?.name }), D = new AbortController(), O = () => D.abort();
3138
+ s.once("close", O);
3139
+ let ee = null, te = [], k = {};
3078
3140
  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")),
3141
+ (await i("@voltro/web/ssr")).beginStoreSeeds(), {chain: te, segmentLoaderData: k} = await _("loadChain", () => hi({
3142
+ entries: C,
3143
+ loadLayout: (t) => i(p(e, "src", "pages", t.dir, "layout.tsx")),
3144
+ loadError: (t) => i(p(e, "src", "pages", t.dir, "error.tsx")),
3145
+ loadPending: (t) => i(p(e, "src", "pages", t.dir, "loading.tsx")),
3084
3146
  ctx: {
3085
- params: l.params,
3086
- pathname: s,
3087
- search: c,
3088
- signal: w.signal,
3089
- headers: x,
3090
- query: C
3147
+ params: f.params,
3148
+ pathname: u,
3149
+ search: d,
3150
+ signal: D.signal,
3151
+ headers: T,
3152
+ query: E
3091
3153
  }
3092
3154
  }));
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
3155
+ let t = b.loader;
3156
+ typeof t == "function" && !w && (ee = await _("loader", () => t({
3157
+ params: f.params,
3158
+ pathname: u,
3159
+ search: d,
3160
+ signal: D.signal,
3161
+ headers: T,
3162
+ query: E
3101
3163
  })));
3102
3164
  } finally {
3103
- i.off("close", T);
3165
+ s.off("close", O);
3104
3166
  }
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,
3113
- 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}`,
3167
+ let A = await _("loadSsrHelpers", async () => await i("@voltro/web/ssr"));
3168
+ w || await Zr({
3169
+ pageMod: b,
3170
+ params: f.params,
3171
+ query: E,
3172
+ apiName: r[0]?.name,
3173
+ seed: A.seedPreloadedSubscription,
3174
+ onError: ({ tag: e, apiName: t }, n) => Z.warn("preload seed failed", {
3175
+ tag: e,
3176
+ apiName: t,
3177
+ pathname: u
3178
+ }, n)
3179
+ });
3180
+ let ne = {
3181
+ pattern: f.route.pattern,
3182
+ Component: b.default,
3183
+ meta: b.meta,
3184
+ loader: b.loader,
3185
+ ErrorBoundary: b.ErrorBoundary,
3186
+ Pending: b.Pending,
3187
+ renderMode: x,
3188
+ chain: te
3189
+ }, re = {
3190
+ cookies: A.parseCookieHeader(T.cookie),
3191
+ headers: T,
3192
+ url: l
3193
+ }, j = b.interactive ?? "full", M = (await o())(T.cookie, T["accept-language"]);
3194
+ y = M !== void 0;
3195
+ let ie = M ? {
3196
+ outerWrap: M.outerWrap,
3197
+ locale: M.locale
3198
+ } : {}, N = w ? Nr({
3199
+ helpers: A,
3200
+ page: `src/pages/${f.route.file}`,
3121
3201
  interactive: j,
3122
3202
  delivery: "stream",
3123
3203
  renderInput: {
3124
- descriptor: k,
3125
- params: l.params,
3126
- pathname: s,
3127
- segmentLoaderData: D,
3128
- requestContext: A
3204
+ descriptor: ne,
3205
+ params: f.params,
3206
+ pathname: u,
3207
+ segmentLoaderData: k,
3208
+ requestContext: re,
3209
+ ...ie
3129
3210
  }
3130
- }) : null, N = b ? null : Or({
3131
- helpers: O,
3132
- page: `src/pages/${l.route.file}`,
3133
- pathname: s,
3134
- renderMode: v,
3211
+ }) : null, P = w ? null : Mr({
3212
+ helpers: A,
3213
+ page: `src/pages/${f.route.file}`,
3214
+ pathname: u,
3215
+ renderMode: x,
3135
3216
  interactive: j,
3136
- loaderData: E,
3137
- segmentLoaderData: D,
3138
- pageLoaderRan: typeof _.loader == "function"
3139
- }), P = [];
3140
- await h("collectCss", async () => {
3217
+ loaderData: ee,
3218
+ segmentLoaderData: k,
3219
+ pageLoaderRan: typeof b.loader == "function"
3220
+ }), F = [];
3221
+ await _("collectCss", async () => {
3141
3222
  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")] : []
3223
+ p(e, "src", "pages", f.route.file),
3224
+ ...C.flatMap((t) => [
3225
+ ...t.hasLayout ? [p(e, "src", "pages", t.dir, "layout.tsx")] : [],
3226
+ ...t.hasError ? [p(e, "src", "pages", t.dir, "error.tsx")] : [],
3227
+ ...t.hasPending ? [p(e, "src", "pages", t.dir, "loading.tsx")] : []
3147
3228
  ]),
3148
- f(e, ".framework", "main.tsx")
3229
+ p(e, ".framework", "main.tsx")
3149
3230
  ];
3150
- for (let e of n) await g(e, t, P);
3231
+ for (let e of n) await v(e, t, F);
3151
3232
  });
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,
3233
+ let ae = await _("readShell", _e), I = await _("transformShell", () => n.transformIndexHtml(l, ae)), L = F.map((e) => `<link rel="stylesheet" href="${e}?direct" />`).join("\n "), R = M?.locale ?? re.cookies["voltro:locale"] ?? t.defaultLocale ?? (t.locales ?? [])[0] ?? "en", oe = Date.now();
3234
+ if (N) {
3235
+ let e = (e) => Fr({
3236
+ helpers: A,
3237
+ prepared: N,
3157
3238
  meta: e,
3158
3239
  interactive: j,
3159
- extra: [ne]
3240
+ extra: [L]
3160
3241
  });
3161
- if (M.hasDeferred) Vr({
3162
- res: i,
3163
- shell: zr({
3164
- shell: F,
3242
+ if (N.hasDeferred) Jr({
3243
+ res: s,
3244
+ shell: Kr({
3245
+ shell: I,
3165
3246
  inlineModuleScriptsAsync: !0
3166
3247
  }),
3167
- htmlLang: I,
3248
+ htmlLang: R,
3168
3249
  headers: {
3169
3250
  "content-type": "text/html; charset=utf-8",
3170
3251
  "x-voltro-rendered-by": "spa-shell-dev"
3171
3252
  },
3172
3253
  headInjection: e,
3173
- render: (e) => O.renderPageToStream({
3174
- ...M.renderInput,
3254
+ render: (e) => A.renderPageToStream({
3255
+ ...N.renderInput,
3175
3256
  ...e
3176
3257
  }),
3177
3258
  onShellError: (e) => {
3178
- he(i, "spa-shell-dev", s, l.route.pattern, e);
3259
+ H(s, "spa-shell-dev", u, f.route.pattern, e, y);
3179
3260
  }
3180
3261
  });
3181
3262
  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);
3263
+ let t = Pr({
3264
+ helpers: A,
3265
+ prepared: N
3266
+ }), n = I.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="${R}"`);
3267
+ 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
3268
  }
3188
- } else if (N) {
3269
+ } else if (P) {
3189
3270
  let e = (e) => [
3190
- ne,
3191
- O.renderMetaToHtml(e),
3271
+ L,
3272
+ A.renderMetaToHtml(e),
3192
3273
  `<meta name="voltro-interactive" content="${j}" />`,
3193
- ...N.hasDeferred ? [O.renderDeferredRegistryScript()] : [],
3194
- O.renderRouterStateScript(N.stateInput)
3274
+ ...P.hasDeferred ? [A.renderDeferredRegistryScript()] : [],
3275
+ A.renderRouterStateScript(P.stateInput)
3195
3276
  ].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
3277
+ descriptor: ne,
3278
+ params: f.params,
3279
+ pathname: u,
3280
+ loaderData: P.loaderData,
3281
+ segmentLoaderData: P.segmentLoaderData,
3282
+ requestContext: re,
3283
+ ...ie
3202
3284
  };
3203
- if (v === "ssr" && j === "full") Vr({
3204
- res: i,
3205
- shell: zr({
3206
- shell: F,
3285
+ if (x === "ssr" && j === "full") Jr({
3286
+ res: s,
3287
+ shell: Kr({
3288
+ shell: I,
3207
3289
  inlineModuleScriptsAsync: !0
3208
3290
  }),
3209
- htmlLang: I,
3291
+ htmlLang: R,
3210
3292
  headers: {
3211
3293
  "content-type": "text/html; charset=utf-8",
3212
3294
  "x-voltro-rendered-by": "ssr-dev"
3213
3295
  },
3214
3296
  headInjection: e,
3215
- render: (e) => O.renderPageToStream({
3297
+ render: (e) => A.renderPageToStream({
3216
3298
  ...t,
3217
3299
  ...e
3218
3300
  }),
3219
3301
  onShellError: (e) => {
3220
- he(i, "ssr-dev", s, l.route.pattern, e);
3302
+ H(s, "ssr-dev", u, f.route.pattern, e, y);
3221
3303
  }
3222
3304
  });
3223
3305
  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);
3306
+ let { html: n, meta: r } = A.renderPageToHtml(t), i = I.replace("<div id=\"root\"></div>", `<div id="root">${n}</div>`).replace("</head>", ` ${e(r)}\n </head>`).replace(/<html(\s+lang="[^"]*")?/i, `<html lang="${R}"`);
3307
+ s.statusCode = 200, s.setHeader("content-type", "text/html; charset=utf-8"), s.setHeader("x-voltro-rendered-by", "ssr-dev"), s.end(i);
3226
3308
  }
3227
3309
  }
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,
3310
+ g.render = Date.now() - oe;
3311
+ let z = Date.now() - h;
3312
+ m ? (he.add(f.route.pattern), Z.info(`ssr compiled ${f.route.pattern} in ${z}ms`, {
3313
+ pattern: f.route.pattern,
3314
+ pathname: u,
3315
+ elapsedMs: z,
3234
3316
  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,
3317
+ phases: g
3318
+ })) : z > 200 && Z.info(`ssr rendered ${u} in ${z}ms`, {
3319
+ pattern: f.route.pattern,
3320
+ pathname: u,
3321
+ elapsedMs: z,
3240
3322
  cold: !1,
3241
- phases: m
3323
+ phases: g
3242
3324
  });
3243
3325
  } 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);
3326
+ if (Ar(e)) {
3327
+ Z.error("ssr-dev render refused", {
3328
+ pathname: u,
3329
+ pattern: f.route.pattern
3330
+ }, e), s.statusCode = 500, s.setHeader("content-type", "text/plain; charset=utf-8"), s.end(e.message);
3249
3331
  return;
3250
3332
  }
3251
- let t = Dr(e);
3333
+ let t = jr(e);
3252
3334
  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);
3335
+ s.statusCode = t.status;
3336
+ for (let [e, n] of Object.entries(t.headers)) s.setHeader(e, String(n));
3337
+ s.end(t.body);
3256
3338
  return;
3257
3339
  }
3258
- he(i, "ssr-dev", s, l.route.pattern, e);
3340
+ H(s, "ssr-dev", u, f.route.pattern, e, y);
3259
3341
  }
3260
3342
  });
3261
3343
  }
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 () => {
3344
+ }, G = Date.now(), K = D.version ?? "?", q = await ei(), ye = p(e, "node_modules", "@voltro", "ui-shadcn"), J = T(p(ye, "package.json")) ? ye : null, be = [], xe = await (async () => {
3263
3345
  let t = [];
3264
- for (let n of u) {
3346
+ for (let n of r) {
3265
3347
  if (!n.proxyTarget) continue;
3266
- let r = await di(e, n.pkg);
3348
+ let r = await xi(e, n.pkg);
3267
3349
  if (r) try {
3268
- t.push(await A.readFile(f(r, "rpcGroup.generated.ts"), "utf8"));
3350
+ t.push(await O.readFile(p(r, "rpcGroup.generated.ts"), "utf8"));
3269
3351
  } catch {}
3270
3352
  }
3271
3353
  if (t.length === 0) return !1;
3272
- let n = ge("sha1").update(t.join("\0")).digest("hex"), r = f(k, ".voltro-rpcgroup-optimize"), i = "";
3354
+ let n = fe("sha1").update(t.join("\0")).digest("hex"), i = p(k, ".voltro-rpcgroup-optimize"), a = "";
3273
3355
  try {
3274
- i = (await A.readFile(r, "utf8")).trim();
3356
+ a = (await O.readFile(i, "utf8")).trim();
3275
3357
  } catch {}
3276
- if (i === n) return !1;
3358
+ if (a === n) return !1;
3277
3359
  try {
3278
- await A.writeFile(r, n);
3360
+ await O.writeFile(i, n);
3279
3361
  } catch {}
3280
3362
  return !0;
3281
3363
  })();
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({
3364
+ xe && Z.info("rpcGroup changed since last boot — forcing a dep re-optimize so the browser loads the current api client"), await (await D.createServer({
3283
3365
  root: k,
3284
3366
  envPrefix: "__VOLTRO_VITE_ENV_DISABLED__",
3285
3367
  ssr: { noExternal: ["react-intl"] },
3286
3368
  resolve: {
3287
- dedupe: ["react", "react-dom"],
3369
+ dedupe: [
3370
+ "react",
3371
+ "react-dom",
3372
+ "react-intl"
3373
+ ],
3288
3374
  alias: [
3289
- ...H ? [{
3375
+ ...q ? [{
3290
3376
  find: "@voltro/devtools/styles.css",
3291
- replacement: f(H, "src/styles.css")
3377
+ replacement: p(q, "src/styles.css")
3292
3378
  }, {
3293
3379
  find: "@voltro/devtools",
3294
- replacement: f(H, "src/index.ts")
3380
+ replacement: p(q, "src/index.ts")
3295
3381
  }] : [],
3296
- ...U ? [
3382
+ ...J ? [
3297
3383
  {
3298
3384
  find: "@voltro/ui-shadcn/tokens.css",
3299
- replacement: f(U, "src/tokens.css")
3385
+ replacement: p(J, "src/tokens.css")
3300
3386
  },
3301
3387
  {
3302
3388
  find: "@voltro/ui-shadcn/cn",
3303
- replacement: f(U, "src/cn.ts")
3389
+ replacement: p(J, "src/cn.ts")
3304
3390
  },
3305
3391
  {
3306
3392
  find: "@voltro/ui-shadcn/brand",
3307
- replacement: f(U, "src/brand/voltroLogo.tsx")
3393
+ replacement: p(J, "src/brand/voltroLogo.tsx")
3308
3394
  },
3309
3395
  {
3310
3396
  find: "@voltro/ui-shadcn",
3311
- replacement: f(U, "src/index.ts")
3397
+ replacement: p(J, "src/index.ts")
3312
3398
  }
3313
3399
  ] : [],
3314
- ...ot(e)
3400
+ ...Je(e)
3315
3401
  ]
3316
3402
  },
3317
3403
  optimizeDeps: {
3318
- include: [...u.map((e) => `${e.pkg}/rpcGroup`), ...we],
3319
- force: Te
3404
+ include: [...r.map((e) => `${e.pkg}/rpcGroup`), ...be],
3405
+ force: xe
3320
3406
  },
3321
- customLogger: It(),
3407
+ customLogger: Et(),
3322
3408
  plugins: [
3323
- Hn(f(e, "src", "pages")),
3409
+ Kn(p(e, "src", "pages")),
3324
3410
  ee(),
3325
- O(),
3326
- N,
3327
- I,
3411
+ te(),
3412
+ re,
3413
+ P,
3328
3414
  oe,
3329
3415
  ce,
3330
3416
  le,
3331
- fe,
3332
- xe,
3333
- ...pe ? [pe] : []
3417
+ de,
3418
+ ve,
3419
+ ...me ? [me] : []
3334
3420
  ],
3335
3421
  server: {
3336
3422
  port: g,
3337
3423
  strictPort: !0,
3338
3424
  host: !0,
3339
3425
  allowedHosts: t.allowedHosts === !0 || [...t.allowedHosts ?? []],
3340
- proxy: z,
3341
- fs: { allow: [e, ...Xr(e)] }
3426
+ proxy: V,
3427
+ fs: { allow: [e, ...oi(e)] }
3342
3428
  },
3343
3429
  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}`, {
3430
+ cacheDir: p(k, ".vite"),
3431
+ publicDir: p(e, "public")
3432
+ })).listen(), Qr.info(`v${K} ready in ${Date.now() - G}ms`, {
3433
+ version: K,
3434
+ bootMs: Date.now() - G
3435
+ }), Z.info(`listening on http://localhost:${g}`, {
3350
3436
  port: g,
3351
3437
  app: t.name ?? "(unnamed)"
3352
3438
  });
3353
- for (let e of u) e.proxyTarget && (X.info(`proxy /ws/${e.name} → ${e.proxyTarget}`, {
3439
+ for (let e of r) e.proxyTarget && (Z.info(`proxy /ws/${e.name} → ${e.proxyTarget}`, {
3354
3440
  api: e.name,
3355
3441
  target: e.proxyTarget
3356
- }), X.info(`proxy /_voltro/api/${e.name} → ${e.proxyTarget.replace(/^ws/, "http")}/_voltro/inspect`, { api: e.name }));
3442
+ }), Z.info(`proxy /_voltro/api/${e.name} → ${e.proxyTarget.replace(/^ws/, "http")}/_voltro/inspect`, { api: e.name }));
3357
3443
  try {
3358
- await nt({
3444
+ await We({
3359
3445
  id: v,
3360
3446
  name: _,
3361
3447
  kind: "web",
@@ -3364,13 +3450,13 @@ import {
3364
3450
  status: "live",
3365
3451
  logFile: y.path
3366
3452
  });
3367
- let t = mr(e);
3453
+ let t = vr(e);
3368
3454
  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 });
3455
+ let e = await Or({ dashboardAppPath: t });
3456
+ 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
3457
  }
3372
3458
  setInterval(() => {
3373
- nt({
3459
+ We({
3374
3460
  id: v,
3375
3461
  name: _,
3376
3462
  kind: "web",
@@ -3381,52 +3467,56 @@ import {
3381
3467
  }).catch(() => {});
3382
3468
  }, 1e4).unref();
3383
3469
  let n = () => {
3384
- rt(v), y.dispose();
3470
+ Ge(v), y.dispose();
3385
3471
  };
3386
3472
  process.on("SIGINT", n), process.on("SIGTERM", n);
3387
3473
  } catch (e) {
3388
- X.warn("runtime-registry write failed", {}, e);
3474
+ Z.warn("runtime-registry write failed", {}, e);
3389
3475
  }
3390
- return E({
3476
+ return C({
3391
3477
  app: t.name ?? "unnamed",
3392
3478
  kind: "web",
3393
3479
  url: `http://localhost:${g}`,
3394
- bootMs: Date.now() - V
3480
+ bootMs: Date.now() - G
3395
3481
  }), new Promise(() => {});
3396
- }, Ei = async (e) => {
3482
+ }, Li = async (e) => {
3397
3483
  process.env.NODE_ENV || (process.env.NODE_ENV = "production");
3398
- let t = await wi(e);
3484
+ let t = await Fi(e);
3399
3485
  if (!t) return {
3400
3486
  ran: !1,
3401
3487
  exitCode: 0
3402
3488
  };
3403
- let n = Date.now(), r = X.child("serve");
3489
+ let n = Date.now(), r = Z.child("serve");
3404
3490
  r.info("booting voltro serve (preview)", { app: t.name ?? "(unnamed)" });
3405
- let i = await gi(e, t);
3491
+ let i = await Ei(e, t);
3406
3492
  for (let e of i) r.info("api wired", {
3407
3493
  name: e.name,
3408
3494
  pkg: e.pkg
3409
3495
  });
3410
- await $(e, t, i);
3496
+ await Mi(e, t, i);
3411
3497
  {
3412
- let { pages: t } = await Q(f(e, "src", "pages"));
3413
- await Yt({
3498
+ let { pages: t } = await $(p(e, "src", "pages"));
3499
+ await zt({
3414
3500
  appRoot: e,
3415
3501
  pages: t
3416
3502
  });
3417
3503
  }
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({
3504
+ let a = t.port ?? 5173, o = await Xe("vite", () => import("vite")), s = (await import("@vitejs/plugin-react")).default, c = p(e, ".framework");
3505
+ Z.info("running production build"), await o.build({
3420
3506
  root: c,
3421
3507
  envPrefix: "__VOLTRO_VITE_ENV_DISABLED__",
3422
3508
  plugins: [s()],
3423
- customLogger: It(),
3424
- resolve: { dedupe: ["react", "react-dom"] },
3509
+ customLogger: Et(),
3510
+ resolve: { dedupe: [
3511
+ "react",
3512
+ "react-dom",
3513
+ "react-intl"
3514
+ ] },
3425
3515
  build: {
3426
3516
  outDir: "dist",
3427
- rollupOptions: { output: { manualChunks: Qr } }
3517
+ rollupOptions: { output: { manualChunks: ci } }
3428
3518
  },
3429
- publicDir: f(e, "public")
3519
+ publicDir: p(e, "public")
3430
3520
  });
3431
3521
  let l = (await o.preview({
3432
3522
  root: c,
@@ -3437,21 +3527,21 @@ import {
3437
3527
  label: "Local",
3438
3528
  url: e
3439
3529
  })) ?? [];
3440
- return E({
3530
+ return C({
3441
3531
  app: t.name ?? "unnamed",
3442
3532
  kind: "preview",
3443
3533
  url: u,
3444
3534
  extras: d,
3445
3535
  bootMs: Date.now() - n
3446
3536
  }), new Promise(() => {});
3447
- }, Di = 5e3, Oi = 6e4, ki = (e, t) => {
3537
+ }, Ri = 5e3, zi = 6e4, Bi = (e, t) => {
3448
3538
  if (e.length === 0) return 0;
3449
3539
  if (e.length === 1) return e[0];
3450
3540
  let n = t * (e.length - 1), r = Math.floor(n), i = Math.ceil(n);
3451
3541
  if (r === i) return e[r];
3452
3542
  let a = n - r;
3453
3543
  return e[r] * (1 - a) + e[i] * a;
3454
- }, Ai = (e) => {
3544
+ }, Vi = (e) => {
3455
3545
  if (e.length === 0) return {
3456
3546
  p50: 0,
3457
3547
  p95: 0,
@@ -3463,18 +3553,18 @@ import {
3463
3553
  let t = e.slice().sort((e, t) => e - t), n = 0;
3464
3554
  for (let e of t) n += e;
3465
3555
  return {
3466
- p50: ki(t, .5),
3467
- p95: ki(t, .95),
3468
- p99: ki(t, .99),
3556
+ p50: Bi(t, .5),
3557
+ p95: Bi(t, .95),
3558
+ p99: Bi(t, .99),
3469
3559
  mean: n / t.length,
3470
3560
  min: t[0],
3471
3561
  max: t[t.length - 1]
3472
3562
  };
3473
- }, ji = (e = {}) => {
3474
- let t = e.maxSamples ?? Di, n = e.defaultWindowMs ?? Oi, r = [];
3563
+ }, Hi = (e = {}) => {
3564
+ let t = e.maxSamples ?? Ri, n = e.defaultWindowMs ?? zi, r = [];
3475
3565
  return {
3476
3566
  record(e) {
3477
- L(e), r.push({
3567
+ ie(e), r.push({
3478
3568
  ...e,
3479
3569
  ts: Date.now()
3480
3570
  }), r.length > t && r.shift();
@@ -3500,7 +3590,7 @@ import {
3500
3590
  tag: e.tag,
3501
3591
  count: e.samples.length,
3502
3592
  errorCount: n,
3503
- latencyMs: Ai(t)
3593
+ latencyMs: Vi(t)
3504
3594
  });
3505
3595
  }
3506
3596
  return c.sort((e, t) => t.count - e.count), {
@@ -3513,4 +3603,4 @@ import {
3513
3603
  };
3514
3604
  };
3515
3605
  //#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 };
3606
+ export { _t as $, tr as A, Tn as B, yr as C, fr as D, vr as E, Xn as F, Jt as G, yn as H, Qn as I, Gt as J, qt as K, In as L, qn as M, $n as N, pr as O, Jn as P, Dt as Q, Ln as R, Ir as S, Or as T, fn as U, xn as V, sn as W, zt as X, Wt as Y, kt as Z, Ar as _, We as _t, hi as a, st as at, Pr as b, Ei as c, ot as ct, ci as d, et as dt, ht as et, $ as f, Xe as ft, Jr as g, Ge as gt, Kr as h, Ue as ht, ji as i, dt as it, rr as j, mr as k, Ii as l, rt as lt, Zr as m, Ke as mt, li as n, lt as nt, mi as o, ct as ot, Mi as p, Je as pt, Yt as q, Ai as r, ut as rt, Fi as s, at as st, Hi as t, mt as tt, Li as u, tt as ut, Mr as v, Me as vt, _r as w, Fr as x, Nr as y, Ne as yt, An as z };