void 0.23.0 → 0.25.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 (169) hide show
  1. package/AGENTS_TEMPLATE.md +1 -1
  2. package/README.md +19 -106
  3. package/dist/{account-cmd-C84Ee8cO.mjs → account-cmd-DcR1ywt8.mjs} +5 -5
  4. package/dist/{auth-CSkdO2Bb.mjs → auth-7wuZ5ob8.mjs} +22 -49
  5. package/dist/auth-CdgZ9uag.mjs +2 -0
  6. package/dist/{auth-link-CioEg6uY.mjs → auth-link-Z6E5DYvM.mjs} +5 -6
  7. package/dist/{auth-router-BsR981d4.mjs → auth-router-BdM4avI8.mjs} +7 -7
  8. package/dist/{build-cmd-LzvNJORH.mjs → build-cmd-CEE7D-hM.mjs} +7 -8
  9. package/dist/{cache-C4MvnrMH.mjs → cache-TcZnBLtH.mjs} +6 -7
  10. package/dist/{cancel-deploy-abUxpP2n.mjs → cancel-deploy-CYoZmcmR.mjs} +4 -6
  11. package/dist/{cf-access-P0iZnu0q.mjs → cf-access-AHKBzmuu.mjs} +4 -48
  12. package/dist/{cf-access-DRsQRe6k.mjs → cf-access-TWNzXltp.mjs} +3 -11
  13. package/dist/cf-build-output-ChY6-XWP.mjs +2 -0
  14. package/dist/cli/cli.mjs +49 -46
  15. package/dist/cli/cloudflare-operation-process.mjs +16 -7
  16. package/dist/cli/env-schema-probe.mjs +3 -3
  17. package/dist/client-B4Me-9HE.mjs +2 -0
  18. package/dist/{client-RV8NVeB8.mjs → client-RsPo8wsP.mjs} +129 -33
  19. package/dist/{cloudflare-cmd-BcrVyTmJ.mjs → cloudflare-cmd-bhwCxAN6.mjs} +2 -2
  20. package/dist/{cloudflare-connect-B8uPZ4nx.mjs → cloudflare-connect-CuhRgk3k.mjs} +2 -2
  21. package/dist/{cloudflare-operations-AiWashgg.mjs → cloudflare-operations-BhbK6yTq.mjs} +1 -1
  22. package/dist/{cloudflare-operations-fxHb-byx.mjs → cloudflare-operations-CjaV4lZi.mjs} +2 -2
  23. package/dist/{connect-Bd4kJd9U.mjs → connect-DCvUmPXY.mjs} +13 -10
  24. package/dist/{create-project-Boczwj5r.mjs → create-project-C734I-Mu.mjs} +1 -1
  25. package/dist/{create-project-bMf6ffLZ.mjs → create-project-eAPgYq35.mjs} +13 -13
  26. package/dist/{db-8uG64XLl.mjs → db-C07GEdKF.mjs} +27 -30
  27. package/dist/{delete-NvbiyeJf.mjs → delete-pKMVsrpJ.mjs} +5 -6
  28. package/dist/deploy-BDu1vhSH.mjs +2 -0
  29. package/dist/{deploy-DzAIwqNU.mjs → deploy-DfsAe-T0.mjs} +9567 -9215
  30. package/dist/{dev-inbox-P0u4tM8Y.mjs → dev-inbox-D64ZKUod.mjs} +5 -6
  31. package/dist/{domain-y5Tvydvo.mjs → domain-D3uA9ize.mjs} +8 -8
  32. package/dist/{email-B3umsW75.mjs → email-z3o2cwjH.mjs} +8 -8
  33. package/dist/{env-BS6qYHDb.mjs → env-3Q8-_2IH.mjs} +7 -9
  34. package/dist/{env-types-C2_bIk_b.mjs → env-types-D5kds_OZ.mjs} +1 -1
  35. package/dist/{env-validation-DbTg7-ar.mjs → env-validation-cZBvGWaP.mjs} +1 -1
  36. package/dist/{env-validation-BPn7vk-V.mjs → env-validation-vBSQ8gw5.mjs} +3 -3
  37. package/dist/gen-ById9r2j.mjs +2 -0
  38. package/dist/{gen-B580--vC.mjs → gen-NjwoG9FK.mjs} +2 -4
  39. package/dist/{github-cmd-v45BdfKX.mjs → github-cmd-DquUq-b1.mjs} +15 -24
  40. package/dist/{headers-DWi2IXWx.mjs → headers-2rKda9Y6.mjs} +1 -1
  41. package/dist/help-DPGBwomV.mjs +2 -0
  42. package/dist/{help-daGKjXGk.mjs → help-DRZXC4fj.mjs} +8 -4
  43. package/dist/{inbound-aVHEUhKo.mjs → inbound-fRkqcXaC.mjs} +1 -1
  44. package/dist/index.d.mts +18 -14
  45. package/dist/index.mjs +2176 -2110
  46. package/dist/{info-B97bTX9N.mjs → info-BmA3_IFZ.mjs} +1 -3
  47. package/dist/{init-Bvy7zrBo.mjs → init-DT7yuuyl.mjs} +28 -27
  48. package/dist/{link-CDqqCjFl.mjs → link-CXOlqh2F.mjs} +6 -7
  49. package/dist/{list-CZj0dzKY.mjs → list-eEWVJEPn.mjs} +8 -9
  50. package/dist/{local-d1-2CMnpuW_.mjs → local-d1-Df4XpwhW.mjs} +1 -1
  51. package/dist/log-vqY3pqwI.mjs +29 -0
  52. package/dist/login-C98-sw79.mjs +2 -0
  53. package/dist/{login-UZKFM_u7.mjs → login-pWQHYVu2.mjs} +12 -10
  54. package/dist/{logs-CUZ6t9t3.mjs → logs-DnxVX7TR.mjs} +11 -13
  55. package/dist/migrate-CEu2X5DB.mjs +2 -0
  56. package/dist/{migrate-DHul7PRV.mjs → migrate-CV1on-yJ.mjs} +2 -4
  57. package/dist/{operator-args-CLgKGlwU.mjs → operator-args-CAVcmwUt.mjs} +12 -5
  58. package/dist/{operator-auth-8KnOVXVd.mjs → operator-auth-CkmTE3rt.mjs} +2 -2
  59. package/dist/{operator-client-DUwumHpQ.mjs → operator-client-LmwjxT6q.mjs} +3 -3
  60. package/dist/{operator-cmd-DBA6dl0m.mjs → operator-cmd-d-IEKgNk.mjs} +6 -6
  61. package/dist/{output-Dm_A4Tbv.mjs → output-BBsUwdyT.mjs} +22 -14
  62. package/dist/pages/client.d.mts +3 -0
  63. package/dist/pages/client.mjs +120 -29
  64. package/dist/pages/index.mjs +1 -1
  65. package/dist/{platform-args-BJdRtlLq.mjs → platform-args-Bzf8JPc2.mjs} +11 -3
  66. package/dist/platform-args-Cq6EjQro.mjs +2 -0
  67. package/dist/{platform-auth-config-B56E9YP1.mjs → platform-auth-config-0V0lA3pF.mjs} +7 -7
  68. package/dist/{platform-auth-protection-BDWO_aER.mjs → platform-auth-protection-DFeJ-JkK.mjs} +9 -9
  69. package/dist/{platform-auth-recovery-1gg4CSRe.mjs → platform-auth-recovery-ICy4muq6.mjs} +7 -7
  70. package/dist/{platform-cmd-Bt-1w6pY.mjs → platform-cmd-BPySFOew.mjs} +1 -1
  71. package/dist/{platform-cmd-DMcQStSc.mjs → platform-cmd-D7vSWMvV.mjs} +38 -28
  72. package/dist/platform-discovery-DDDUvnqp.mjs +27 -0
  73. package/dist/{platform-domain-BNkcz0OB.mjs → platform-domain-CUdY064e.mjs} +5 -5
  74. package/dist/{platform-lifecycle-BE6C_jxh.mjs → platform-lifecycle-BaUdTRPU.mjs} +1 -1
  75. package/dist/{platform-lifecycle-9OyBALhH.mjs → platform-lifecycle-Dm09JNkn.mjs} +4404 -3297
  76. package/dist/{platform-management-CjwLVQwN.mjs → platform-management-BSEc_ZeG.mjs} +48 -11
  77. package/dist/platform-management-Bp6aoH2C.mjs +2 -0
  78. package/dist/{platform-plans-config-BNGKGr4P.mjs → platform-plans-config-B0pOVQyW.mjs} +3 -3
  79. package/dist/{platform-recovery-D6KSpuFm.mjs → platform-recovery-WOZ95Uze.mjs} +4 -4
  80. package/dist/{platform-registry-QBa4DK32.mjs → platform-registry-KfNEF84O.mjs} +3 -3
  81. package/dist/{prepare-B5Mkic5u.mjs → prepare-39EvOhI6.mjs} +2 -4
  82. package/dist/prepare-CnjcTV2s.mjs +2 -0
  83. package/dist/{prepare-DOsL0CC9.mjs → prepare-DnaKBi--.mjs} +1 -1
  84. package/dist/{project-C0Fqu05O.mjs → project-BkbfDs0V.mjs} +15 -82
  85. package/dist/project-IOjBU8R6.mjs +2 -0
  86. package/dist/{project-cmd-CNzrqvBv.mjs → project-cmd-Bs5A392E.mjs} +21 -22
  87. package/dist/{project-team-DQOWPfQT.mjs → project-team-ohAWWaew.mjs} +8 -9
  88. package/dist/{project-token-CTDYU0Cc.mjs → project-token-CP01Jna6.mjs} +6 -9
  89. package/dist/{project-zero-trust-BNAkW-_0.mjs → project-zero-trust-BzkVgx35.mjs} +5 -6
  90. package/dist/prompts-6OSVA7DJ.mjs +2087 -0
  91. package/dist/prompts-ZAuJlyCj.mjs +2 -0
  92. package/dist/{provision-C4ORE7G7.mjs → provision-BEv0k-qz.mjs} +1 -1
  93. package/dist/{provision-CJFgTZY8.mjs → provision-Btj1jppf.mjs} +5 -7
  94. package/dist/{requests-MhxYnau8.mjs → requests-B3PBuGlX.mjs} +5 -6
  95. package/dist/{rollback-CJ6iSDoU.mjs → rollback-DDub9GsO.mjs} +9 -10
  96. package/dist/runtime/ai.mjs +3 -5
  97. package/dist/runtime/email/testing.mjs +2 -2
  98. package/dist/runtime/email.mjs +36 -18
  99. package/dist/runtime/remote/index.mjs +2 -2
  100. package/dist/runtime/routing.mjs +1 -1
  101. package/dist/{secret-Dli5fP0B.mjs → secret-3c72lY1U.mjs} +15 -16
  102. package/dist/{skills-D1II1Juz.mjs → skills-BPQUGClu.mjs} +1 -1
  103. package/dist/{subcommand-prompt-CY1C4fvl.mjs → subcommand-prompt-Dhom39bd.mjs} +40 -32
  104. package/dist/sveltekit.d.mts +1 -1
  105. package/dist/sveltekit.mjs +4 -9
  106. package/dist/{wrangler-7K-bW_DL.mjs → wrangler-DhUerFkW.mjs} +10 -15
  107. package/package.json +22 -23
  108. package/sandbox.Dockerfile +1 -1
  109. package/skills/void/SKILL.md +6 -1
  110. package/skills/void/docs/guide/ai.md +24 -86
  111. package/skills/void/docs/guide/auth.md +0 -2
  112. package/skills/void/docs/guide/database/d1.md +7 -7
  113. package/skills/void/docs/guide/deployment.md +58 -102
  114. package/skills/void/docs/guide/edge/headers.md +1 -1
  115. package/skills/void/docs/guide/email/domains.md +5 -1
  116. package/skills/void/docs/guide/email/sending.md +1 -1
  117. package/skills/void/docs/guide/env-vars.md +1 -5
  118. package/skills/void/docs/guide/index.md +19 -18
  119. package/skills/void/docs/guide/kv.md +0 -2
  120. package/skills/void/docs/guide/pages-routing/actions-and-forms.md +49 -47
  121. package/skills/void/docs/guide/pages-routing/overview.md +2 -2
  122. package/skills/void/docs/guide/platform/administration/email.md +0 -2
  123. package/skills/void/docs/guide/platform/administration/operations.md +11 -22
  124. package/skills/void/docs/guide/platform/administration/plans.md +1 -5
  125. package/skills/void/docs/guide/platform/administration/zero-trust.md +24 -9
  126. package/skills/void/docs/guide/platform/development/schema-ci.md +7 -1
  127. package/skills/void/docs/guide/platform/installation/ci.md +1 -1
  128. package/skills/void/docs/guide/platform/installation/credentials.md +10 -3
  129. package/skills/void/docs/guide/platform/installation/domains.md +8 -3
  130. package/skills/void/docs/guide/platform/installation/first-deployment.md +2 -2
  131. package/skills/void/docs/guide/platform/installation/maintenance.md +37 -5
  132. package/skills/void/docs/guide/platform/installation/prerequisites.md +87 -14
  133. package/skills/void/docs/guide/platform/installation/setup.md +80 -10
  134. package/skills/void/docs/guide/quickstart.md +37 -80
  135. package/skills/void/docs/guide/remote-dev.md +1 -1
  136. package/skills/void/docs/guide/sandboxes.md +36 -46
  137. package/skills/void/docs/guide/self-hosted-platform.md +20 -0
  138. package/skills/void/docs/guide/websockets.md +0 -2
  139. package/skills/void/docs/integrations/frameworks/overview.md +2 -2
  140. package/skills/void/docs/integrations/frameworks/sveltekit.md +40 -25
  141. package/skills/void/docs/integrations/nodejs-bun-deno.md +7 -2
  142. package/skills/void/docs/reference/api/resources.md +27 -0
  143. package/skills/void/docs/reference/api.md +1 -1
  144. package/skills/void/docs/reference/cli/auth.md +4 -3
  145. package/skills/void/docs/reference/cli/database.md +1 -1
  146. package/skills/void/docs/reference/cli/deploy.md +21 -1
  147. package/skills/void/docs/reference/cli/platform-installation.md +42 -27
  148. package/skills/void/docs/reference/cli/platform-operations.md +4 -8
  149. package/skills/void/docs/reference/cli/platform-zero-trust.md +14 -0
  150. package/skills/void/docs/reference/cli/platform.md +5 -0
  151. package/skills/void/docs/reference/config.md +1 -1
  152. package/skills/void/docs/reference/resource-inference.md +11 -8
  153. package/dist/auth-CCjt0hcq.mjs +0 -2
  154. package/dist/cf-build-output-_0HNWysu.mjs +0 -2
  155. package/dist/client-Cu7jWiF1.mjs +0 -2
  156. package/dist/deploy-bjXdFCtn.mjs +0 -2
  157. package/dist/dist-BuDuKZJv.mjs +0 -2
  158. package/dist/dist-CTBk70IR.mjs +0 -1310
  159. package/dist/gen-BVaUUumi.mjs +0 -2
  160. package/dist/help-DofyZuY7.mjs +0 -2
  161. package/dist/log-ChfPKsVd.mjs +0 -26
  162. package/dist/login-DYt_An22.mjs +0 -2
  163. package/dist/migrate-8_2u55MD.mjs +0 -2
  164. package/dist/platform-args-D3RXyR6h.mjs +0 -2
  165. package/dist/platform-management-CnyTdcWX.mjs +0 -2
  166. package/dist/prepare-cgvDMtSb.mjs +0 -2
  167. package/dist/project-BuUwfj6f.mjs +0 -2
  168. package/skills/void/docs/guide/env-migration.md +0 -109
  169. package/dist/{cf-build-output-BPqOT964.mjs → cf-build-output-U8o1Gl6X.mjs} +1 -1
@@ -60,6 +60,103 @@ async function createActionErrorFromResponse(response, url) {
60
60
  });
61
61
  }
62
62
  //#endregion
63
+ //#region src/pages/scroll-restoration.ts
64
+ const STORAGE_PREFIX = "void:scroll:";
65
+ function readKey(state) {
66
+ return typeof state?.__voidScrollKey === "string" ? state.__voidScrollKey : null;
67
+ }
68
+ function readPosition(value) {
69
+ if (!value || typeof value !== "object") return null;
70
+ const { x, y } = value;
71
+ return typeof x === "number" && Number.isFinite(x) && typeof y === "number" && Number.isFinite(y) ? {
72
+ x,
73
+ y
74
+ } : null;
75
+ }
76
+ function newKey() {
77
+ return crypto.getRandomValues(/* @__PURE__ */ new Uint32Array(4)).join("-");
78
+ }
79
+ function currentUrl$1() {
80
+ return window.location.pathname + window.location.search + window.location.hash;
81
+ }
82
+ /** Positions belong to the rendered entry, even after the browser starts a traversal. */
83
+ function createScrollRestoration() {
84
+ const positions = /* @__PURE__ */ new Map();
85
+ let renderedKey = null;
86
+ let renderedUrl = currentUrl$1();
87
+ let ready = false;
88
+ function read(key) {
89
+ if (!key) return null;
90
+ const position = positions.get(key);
91
+ if (position) return position;
92
+ try {
93
+ const saved = readPosition(JSON.parse(sessionStorage.getItem(STORAGE_PREFIX + key) || "null"));
94
+ if (saved) return saved;
95
+ } catch {}
96
+ return null;
97
+ }
98
+ function save() {
99
+ if (!ready || !renderedKey) return;
100
+ const position = {
101
+ x: window.scrollX,
102
+ y: window.scrollY
103
+ };
104
+ positions.set(renderedKey, position);
105
+ try {
106
+ sessionStorage.setItem(STORAGE_PREFIX + renderedKey, JSON.stringify(position));
107
+ } catch {}
108
+ }
109
+ return {
110
+ get ready() {
111
+ return ready;
112
+ },
113
+ start() {
114
+ renderedKey = readKey(history.state);
115
+ if (!renderedKey) {
116
+ renderedKey = newKey();
117
+ history.replaceState({
118
+ ...history.state,
119
+ __voidScrollKey: renderedKey
120
+ }, "");
121
+ }
122
+ history.scrollRestoration = "manual";
123
+ window.addEventListener("pagehide", save);
124
+ return read(renderedKey);
125
+ },
126
+ save,
127
+ writeHistory(url, replace) {
128
+ renderedKey = newKey();
129
+ const state = {
130
+ ...replace ? history.state : {},
131
+ __voidScrollKey: renderedKey
132
+ };
133
+ if (replace) history.replaceState(state, "", url);
134
+ else history.pushState(state, "", url);
135
+ },
136
+ commit() {
137
+ renderedKey = readKey(history.state) ?? renderedKey;
138
+ renderedUrl = currentUrl$1();
139
+ ready = true;
140
+ },
141
+ pop(state) {
142
+ save();
143
+ let key = readKey(state);
144
+ const newFragment = key === renderedKey && currentUrl$1() !== renderedUrl;
145
+ if (!key || newFragment) {
146
+ key = newKey();
147
+ history.replaceState({
148
+ ...state,
149
+ __voidScrollKey: key
150
+ }, "");
151
+ }
152
+ return newFragment ? null : read(key) ?? readPosition({
153
+ x: state?.scrollX,
154
+ y: state?.scrollY
155
+ });
156
+ }
157
+ };
158
+ }
159
+ //#endregion
63
160
  //#region src/pages/navigation-engine.ts
64
161
  const PAGE_DATA_SCRIPT_ID = "__VOID_PAGE_DATA__";
65
162
  const STATIC_PAGE_DATA_PREFIX = "/_void/pages";
@@ -138,6 +235,9 @@ async function createPageNavigationEngine(config) {
138
235
  let _htmlDeferredRegistry = null;
139
236
  let _currentFetchUrl = window.location.pathname + window.location.search;
140
237
  let popStateHandler = null;
238
+ let initialScrollPosition = null;
239
+ const initialUrl = window.location.pathname + window.location.search + window.location.hash;
240
+ const scrollRestoration = createScrollRestoration();
141
241
  function getPageDataCacheKey(url, method = "GET") {
142
242
  return `${method}:${url}`;
143
243
  }
@@ -329,16 +429,8 @@ async function createPageNavigationEngine(config) {
329
429
  deferredWindow.__rejectDeferred = (group, error) => _htmlDeferredRegistry?.resolve(group, void 0, error);
330
430
  function commitHashNavigation(effectiveFetchUrl, hash, options, writeHistory) {
331
431
  _currentFetchUrl = effectiveFetchUrl;
332
- if (writeHistory) {
333
- if (options.replace) history.replaceState({}, "", effectiveFetchUrl + hash);
334
- else {
335
- history.replaceState({
336
- scrollX: window.scrollX,
337
- scrollY: window.scrollY
338
- }, "");
339
- history.pushState({}, "", effectiveFetchUrl + hash);
340
- }
341
- }
432
+ if (writeHistory) scrollRestoration.writeHistory(effectiveFetchUrl + hash, !!options.replace);
433
+ scrollRestoration.commit();
342
434
  if (options._scrollPosition) {
343
435
  window.scrollTo(options._scrollPosition.x, options._scrollPosition.y);
344
436
  return;
@@ -536,15 +628,9 @@ async function createPageNavigationEngine(config) {
536
628
  _currentFetchUrl = commitTarget.fetchUrl;
537
629
  if (!options.preserveState) {
538
630
  const historyUrl = commitTarget.fetchUrl + commitTarget.hash;
539
- if (options.replace) history.replaceState({}, "", historyUrl);
540
- else {
541
- history.replaceState({
542
- scrollX: window.scrollX,
543
- scrollY: window.scrollY
544
- }, "");
545
- history.pushState({}, "", historyUrl);
546
- }
631
+ scrollRestoration.writeHistory(historyUrl, !!options.replace);
547
632
  }
633
+ scrollRestoration.commit();
548
634
  const doScroll = () => {
549
635
  if (options.preserveScroll) return;
550
636
  if (options._scrollPosition) window.scrollTo(options._scrollPosition.x, options._scrollPosition.y);
@@ -570,6 +656,7 @@ async function createPageNavigationEngine(config) {
570
656
  initialComponent,
571
657
  initialLayouts,
572
658
  prepareVisit(url, options = {}) {
659
+ if (!options._popstate) scrollRestoration.save();
573
660
  const hashIndex = url.indexOf("#");
574
661
  const hash = hashIndex !== -1 ? url.slice(hashIndex) : "";
575
662
  const fetchUrl = hashIndex !== -1 ? url.slice(0, hashIndex) : url;
@@ -686,12 +773,14 @@ async function createPageNavigationEngine(config) {
686
773
  setPopStateHandler(handler) {
687
774
  popStateHandler = handler;
688
775
  },
776
+ commitInitialRender() {
777
+ const saved = initialScrollPosition;
778
+ initialScrollPosition = null;
779
+ scrollRestoration.commit();
780
+ if (saved && _nextNavigationId === 0) window.scrollTo(saved.x, saved.y);
781
+ },
689
782
  start() {
690
- history.scrollRestoration = "manual";
691
- history.replaceState({
692
- scrollX: window.scrollX,
693
- scrollY: window.scrollY
694
- }, "");
783
+ initialScrollPosition = scrollRestoration.start();
695
784
  initClientHead(initialPageData.head);
696
785
  if (deferredWindow.__deferredQueue) {
697
786
  for (const entry of deferredWindow.__deferredQueue) if (entry.length === 3) _htmlDeferredRegistry?.resolve(entry[0], void 0, entry[2]);
@@ -699,14 +788,15 @@ async function createPageNavigationEngine(config) {
699
788
  delete deferredWindow.__deferredQueue;
700
789
  }
701
790
  window.addEventListener("popstate", (e) => {
702
- const saved = e.state;
703
791
  const url = window.location.pathname + window.location.search + window.location.hash;
792
+ const saved = scrollRestoration.pop(e.state);
793
+ if (!scrollRestoration.ready && url === initialUrl) {
794
+ initialScrollPosition = saved;
795
+ return;
796
+ }
704
797
  const options = {
705
798
  preserveState: true,
706
- _scrollPosition: saved ? {
707
- x: saved.scrollX ?? 0,
708
- y: saved.scrollY ?? 0
709
- } : null,
799
+ _scrollPosition: saved,
710
800
  _popstate: true
711
801
  };
712
802
  if (popStateHandler) popStateHandler(url, options);
@@ -1020,7 +1110,8 @@ async function createVoidRouter(config) {
1020
1110
  initialPageData: engine.initialPageData,
1021
1111
  initialComponent: engine.initialComponent,
1022
1112
  initialLayouts: engine.initialLayouts,
1023
- start: engine.start
1113
+ start: engine.start,
1114
+ commitInitialRender: engine.commitInitialRender
1024
1115
  };
1025
1116
  }
1026
1117
  }
@@ -2,7 +2,7 @@ import { a as join } from "../dist-BVqXeR_h.mjs";
2
2
  import { r as resolvePagesDir } from "../project-paths-GgcMozYz.mjs";
3
3
  import { m as readConfig } from "../config-Br_JZD6u.mjs";
4
4
  import { a as resolveNamedLayout, i as resolveLayoutIds, n as resolveEffectiveLayoutChain, r as resolveLayoutChain, t as scanPages } from "../scan-C7okrLyM.mjs";
5
- import { i as parseRedirectsFile } from "../headers-DWi2IXWx.mjs";
5
+ import { i as parseRedirectsFile } from "../headers-2rKda9Y6.mjs";
6
6
  import { i as resolveHead, n as renderHeadToString, r as renderHtmlAttrs, t as renderBodyAttrs } from "../head-D_QRR5Yd.mjs";
7
7
  import { t as serializePageData } from "../serialize-BPvnNQuA.mjs";
8
8
  //#region src/pages/manifest.ts
@@ -1,4 +1,4 @@
1
- import { n as operatorGroups, r as parseOperatorArgs } from "./operator-args-CLgKGlwU.mjs";
1
+ import { n as operatorGroups, r as parseOperatorArgs } from "./operator-args-CAVcmwUt.mjs";
2
2
  import { PLATFORM_LOGIN_KINDS, normalizePlatformDashboardUrl, parsePlatformLoginId } from "@void/platform";
3
3
  import { parsePlatformPlanId } from "@void/platform/plans";
4
4
  //#region src/cli/platform-config-args.ts
@@ -212,8 +212,8 @@ const platformSubcommands = [
212
212
  },
213
213
  {
214
214
  name: "install",
215
- hint: "Preview choices with --plan, then run the printed install command",
216
- description: "Install a Void platform with a domain or workers.dev for testing"
215
+ hint: "Preview and save choices with --plan, then select the saved plan to install",
216
+ description: "Install a Void platform and choose who can access its apps"
217
217
  },
218
218
  {
219
219
  name: "upgrade",
@@ -442,6 +442,7 @@ function parsePlatformArgs(args) {
442
442
  "--account",
443
443
  "--auth-config",
444
444
  "--login-methods",
445
+ "--app-access",
445
446
  "--hyperdrive",
446
447
  "--application-domain",
447
448
  "--control-plane-domain",
@@ -474,6 +475,12 @@ function parsePlatformArgs(args) {
474
475
  if (noControlPlaneDomain && values.has("--control-plane-domain")) throw new Error("platform: Choose either --control-plane-domain or --no-control-plane-domain.");
475
476
  if (noDedicatedZone && dedicatedZone) throw new Error("platform: Choose either --dedicated-zone or --no-dedicated-zone.");
476
477
  if (values.has("--auth-config") && (values.has("--login-methods") || accessProtection !== void 0)) throw new Error("platform: --auth-config cannot be combined with login or Access protection options.");
478
+ const appAccess = values.get("--app-access");
479
+ if (appAccess !== void 0 && ![
480
+ "public",
481
+ "platform",
482
+ "custom"
483
+ ].includes(appAccess)) throw new Error("platform: --app-access accepts public, platform, or custom.");
477
484
  const loginMethods = values.get("--login-methods")?.split(",");
478
485
  if (loginMethods && loginMethods.some((method) => !PLATFORM_LOGIN_KINDS.includes(method))) throw new Error("platform: --login-methods accepts github, google, oidc, and cloudflare-access.");
479
486
  if (workersDev && (values.has("--application-domain") || values.has("--zone") || dedicatedZone)) throw new Error("platform: --workers-dev cannot be combined with a domain, zone, or --dedicated-zone.");
@@ -484,6 +491,7 @@ function parsePlatformArgs(args) {
484
491
  ...values.has("--hyperdrive") ? { hyperdrive: values.get("--hyperdrive") } : {},
485
492
  ...loginMethods ? { loginMethods: [...new Set(loginMethods)] } : {},
486
493
  ...accessProtection !== void 0 ? { accessProtection } : {},
494
+ ...appAccess !== void 0 ? { appAccess } : {},
487
495
  ...workersDev ? { workersDev: true } : {},
488
496
  ...values.has("--auth-config") ? { authConfig: values.get("--auth-config") } : {},
489
497
  account: values.get("--account") ?? "",
@@ -0,0 +1,2 @@
1
+ import { t as parsePlatformArgs } from "./platform-args-Bzf8JPc2.mjs";
2
+ export { parsePlatformArgs };
@@ -1,10 +1,10 @@
1
- import { d as openBrowser } from "./auth-CSkdO2Bb.mjs";
2
- import { B as text, E as confirm, F as password, I as select, M as multiselect, W as isCancel } from "./dist-CTBk70IR.mjs";
3
- import { n as OperatorClient } from "./operator-client-DUwumHpQ.mjs";
4
- import { a as resolveOperatorOrigin, r as readOperatorToken } from "./operator-auth-8KnOVXVd.mjs";
5
- import { execFile } from "node:child_process";
1
+ import { u as openBrowser } from "./auth-7wuZ5ob8.mjs";
2
+ import { A as confirm, K as select, U as password, X as text, tt as isCancel, z as multiselect } from "./prompts-6OSVA7DJ.mjs";
3
+ import { n as OperatorClient } from "./operator-client-LmwjxT6q.mjs";
4
+ import { a as resolveOperatorOrigin, r as readOperatorToken } from "./operator-auth-CkmTE3rt.mjs";
6
5
  import { parsePlatformAdmissionPolicy, parsePlatformLoginConfiguration } from "@void/platform";
7
6
  import { stripVTControlCharacters } from "node:util";
7
+ import { execFile } from "node:child_process";
8
8
  import { setTimeout } from "node:timers/promises";
9
9
  import { readFile } from "node:fs/promises";
10
10
  //#region src/cli/platform-auth-config.ts
@@ -140,11 +140,11 @@ async function configurationInput(args, existing) {
140
140
  }
141
141
  async function runPlatformAuthConfig(args) {
142
142
  if (args.action === "recover") {
143
- const { runPlatformAuthRecovery } = await import("./platform-auth-recovery-1gg4CSRe.mjs");
143
+ const { runPlatformAuthRecovery } = await import("./platform-auth-recovery-ICy4muq6.mjs");
144
144
  return runPlatformAuthRecovery(args);
145
145
  }
146
146
  if (args.action === "protection") {
147
- const { runPlatformProtectionConfig } = await import("./platform-auth-protection-BDWO_aER.mjs");
147
+ const { runPlatformProtectionConfig } = await import("./platform-auth-protection-DFeJ-JkK.mjs");
148
148
  return runPlatformProtectionConfig(args);
149
149
  }
150
150
  const origin = resolveOperatorOrigin(args.connection);
@@ -1,13 +1,13 @@
1
- import { t as cfAccessHeaders } from "./cf-access-DRsQRe6k.mjs";
2
- import { d as readInstallationRecoverySecrets, h as resolveInstallationManifest, s as normalizePlatformApiUrl, t as acquirePlatformLifecycleLock, u as promoteInstallationSecrets, v as writeInstallationManifest, y as writePendingInstallationSecrets } from "./platform-registry-QBa4DK32.mjs";
3
- import { n as ensurePlatformAccessToken } from "./cf-access-P0iZnu0q.mjs";
4
- import { E as confirm, W as isCancel } from "./dist-CTBk70IR.mjs";
5
- import { n as OperatorClient } from "./operator-client-DUwumHpQ.mjs";
6
- import { a as resolveOperatorOrigin, r as readOperatorToken } from "./operator-auth-8KnOVXVd.mjs";
7
- import { A as PlatformCloudflareClient, D as checkpointPlatformAccessResources, E as resolvePlatformCloudflareCredential, O as parsePlatformAccessSetupSpec, k as preparePlatformAccessSetup, n as resolvePlatformInstallDatabaseUrl, o as acquirePlatformDatabaseLifecycleLock } from "./platform-lifecycle-9OyBALhH.mjs";
8
- import { c as selectAuthoritativePlatformManifest, u as verifyPlatformInstallationOwnership } from "./platform-management-CjwLVQwN.mjs";
9
- import { createHmac } from "node:crypto";
1
+ import { b as writePendingInstallationSecrets, d as promoteInstallationSecrets, f as readInstallationRecoverySecrets, g as resolveInstallationManifest, s as normalizePlatformApiUrl, t as acquirePlatformLifecycleLock, y as writeInstallationManifest } from "./platform-registry-KfNEF84O.mjs";
2
+ import { t as cfAccessHeaders } from "./cf-access-TWNzXltp.mjs";
3
+ import { n as ensurePlatformAccessToken } from "./cf-access-AHKBzmuu.mjs";
4
+ import { A as confirm, tt as isCancel } from "./prompts-6OSVA7DJ.mjs";
5
+ import { n as OperatorClient } from "./operator-client-LmwjxT6q.mjs";
6
+ import { a as resolveOperatorOrigin, r as readOperatorToken } from "./operator-auth-CkmTE3rt.mjs";
7
+ import { A as PlatformCloudflareClient, D as checkpointPlatformAccessResources, E as resolvePlatformCloudflareCredential, O as parsePlatformAccessSetupSpec, k as preparePlatformAccessSetup, n as resolvePlatformInstallDatabaseUrl, s as acquirePlatformDatabaseLifecycleLock } from "./platform-lifecycle-Dm09JNkn.mjs";
8
+ import { d as verifyPlatformInstallationOwnership, l as selectAuthoritativePlatformManifest } from "./platform-management-BSEc_ZeG.mjs";
10
9
  import { parsePlatformAccessProtection, platformProtectionProofMessage } from "@void/platform";
10
+ import { createHmac } from "node:crypto";
11
11
  import { readFile } from "node:fs/promises";
12
12
  //#region src/cli/platform-auth-protection.ts
13
13
  /** Read every externally routed control-plane Worker before changing its preview settings. */
@@ -1,12 +1,12 @@
1
- import { d as openBrowser } from "./auth-CSkdO2Bb.mjs";
2
- import { d as readInstallationRecoverySecrets, h as resolveInstallationManifest, t as acquirePlatformLifecycleLock } from "./platform-registry-QBa4DK32.mjs";
3
- import { E as confirm, W as isCancel } from "./dist-CTBk70IR.mjs";
4
- import { a as resolveOperatorOrigin } from "./operator-auth-8KnOVXVd.mjs";
5
- import { A as PlatformCloudflareClient, E as resolvePlatformCloudflareCredential, f as platformDatabaseClientUrl, n as resolvePlatformInstallDatabaseUrl, s as acquirePlatformDatabaseLifecycleLockConnection } from "./platform-lifecycle-9OyBALhH.mjs";
6
- import { c as selectAuthoritativePlatformManifest, u as verifyPlatformInstallationOwnership } from "./platform-management-CjwLVQwN.mjs";
1
+ import { f as readInstallationRecoverySecrets, g as resolveInstallationManifest, t as acquirePlatformLifecycleLock } from "./platform-registry-KfNEF84O.mjs";
2
+ import { u as openBrowser } from "./auth-7wuZ5ob8.mjs";
3
+ import { A as confirm, tt as isCancel } from "./prompts-6OSVA7DJ.mjs";
4
+ import { a as resolveOperatorOrigin } from "./operator-auth-CkmTE3rt.mjs";
5
+ import { A as PlatformCloudflareClient, E as resolvePlatformCloudflareCredential, c as acquirePlatformDatabaseLifecycleLockConnection, l as platformDatabaseClientUrl, n as resolvePlatformInstallDatabaseUrl } from "./platform-lifecycle-Dm09JNkn.mjs";
6
+ import { d as verifyPlatformInstallationOwnership, l as selectAuthoritativePlatformManifest } from "./platform-management-BSEc_ZeG.mjs";
7
+ import { parsePlatformAccessProtection, parsePlatformAdmissionPolicy, parsePlatformLoginConfiguration, platformAuthenticationRecoveryMessage, validatePlatformAdmissionPolicy } from "@void/platform";
7
8
  import { createCipheriv, createDecipheriv, createHash, createHmac, hkdfSync, randomBytes, randomUUID } from "node:crypto";
8
9
  import { execFile } from "node:child_process";
9
- import { parsePlatformAccessProtection, parsePlatformAdmissionPolicy, parsePlatformLoginConfiguration, platformAuthenticationRecoveryMessage, validatePlatformAdmissionPolicy } from "@void/platform";
10
10
  import { setTimeout } from "node:timers/promises";
11
11
  import { readFile } from "node:fs/promises";
12
12
  //#region src/cli/platform-auth-recovery-core.ts
@@ -1,2 +1,2 @@
1
- import { r as runPlatformCommand, t as discoverPlatform } from "./platform-cmd-DMcQStSc.mjs";
1
+ import { r as runPlatformCommand, t as discoverPlatform } from "./platform-cmd-D7vSWMvV.mjs";
2
2
  export { discoverPlatform, runPlatformCommand };
@@ -1,9 +1,9 @@
1
- import { t as cfAccessHeaders } from "./cf-access-DRsQRe6k.mjs";
2
- import { _ as selectPlatformConnection, g as savePlatformConnection, o as listPlatformConnections, r as getActivePlatformConnection, s as normalizePlatformApiUrl } from "./platform-registry-QBa4DK32.mjs";
3
- import { i as isCloudflareAccessChallenge, n as ensurePlatformAccessToken, t as ensureCloudflaredToken } from "./cf-access-P0iZnu0q.mjs";
4
- import { B as text, I as select, W as isCancel, j as log } from "./dist-CTBk70IR.mjs";
5
- import { c as import_picocolors } from "./output-Dm_A4Tbv.mjs";
6
- import { parsePlatformDiscoveryDocument } from "@void/platform";
1
+ import { _ as savePlatformConnection, a as listInstallationManifests, o as listPlatformConnections, r as getActivePlatformConnection, s as normalizePlatformApiUrl, v as selectPlatformConnection } from "./platform-registry-KfNEF84O.mjs";
2
+ import { t as cfAccessHeaders } from "./cf-access-TWNzXltp.mjs";
3
+ import { i as isCloudflareAccessChallenge, n as ensurePlatformAccessToken, t as ensureCloudflaredToken } from "./cf-access-AHKBzmuu.mjs";
4
+ import { K as select, L as log, X as text, tt as isCancel } from "./prompts-6OSVA7DJ.mjs";
5
+ import { t as readPlatformDiscoveryResponse } from "./platform-discovery-DDDUvnqp.mjs";
6
+ import { c as import_picocolors } from "./output-BBsUwdyT.mjs";
7
7
  //#region src/cli/platform-cmd.ts
8
8
  async function discoverPlatform(input, fetcher = fetch) {
9
9
  const apiUrl = normalizePlatformApiUrl(input);
@@ -22,22 +22,7 @@ async function discoverPlatform(input, fetcher = fetch) {
22
22
  ensurePlatformAccessToken(apiUrl, true);
23
23
  response = await request();
24
24
  }
25
- if (!response.ok) throw new Error(`platform: Discovery failed at ${apiUrl} (HTTP ${response.status}).`);
26
- let value;
27
- try {
28
- value = await response.json();
29
- } catch {
30
- throw new Error(`platform: ${apiUrl} returned invalid discovery metadata.`);
31
- }
32
- let discovery;
33
- try {
34
- discovery = parsePlatformDiscoveryDocument(value);
35
- } catch (error) {
36
- throw new Error(`platform: ${apiUrl} returned invalid discovery metadata: ${error instanceof Error ? error.message : String(error)}`);
37
- }
38
- const finalOrigin = normalizePlatformApiUrl(response.url ? new URL(response.url).origin : apiUrl);
39
- if (discovery.apiUrl !== finalOrigin) throw new Error(`platform: Discovery origin mismatch. The response came from ${finalOrigin}, but identifies ${discovery.apiUrl}.`);
40
- return discovery;
25
+ return readPlatformDiscoveryResponse(apiUrl, response);
41
26
  }
42
27
  async function promptPlatformUrl() {
43
28
  if (!process.stdin.isTTY) throw new Error("platform: A platform URL is required in non-interactive mode.");
@@ -106,19 +91,19 @@ async function runPlatformCommand(_root, args) {
106
91
  }]
107
92
  });
108
93
  if (isCancel(group)) return;
109
- const { parsePlatformArgs } = await import("./platform-args-D3RXyR6h.mjs");
94
+ const { parsePlatformArgs } = await import("./platform-args-Cq6EjQro.mjs");
110
95
  return runPlatformCommand(_root, parsePlatformArgs(["config", group]));
111
96
  }
112
- const { runPlatformPlansConfig } = await import("./platform-plans-config-BNGKGr4P.mjs");
97
+ const { runPlatformPlansConfig } = await import("./platform-plans-config-B0pOVQyW.mjs");
113
98
  await runPlatformPlansConfig(args);
114
99
  return;
115
100
  }
116
- const { runPlatformAuthConfig } = await import("./platform-auth-config-B56E9YP1.mjs");
101
+ const { runPlatformAuthConfig } = await import("./platform-auth-config-0V0lA3pF.mjs");
117
102
  await runPlatformAuthConfig(args);
118
103
  return;
119
104
  }
120
105
  if (args.subcommand === "operator") {
121
- const { runOperatorCommand } = await import("./operator-cmd-DBA6dl0m.mjs");
106
+ const { runOperatorCommand } = await import("./operator-cmd-d-IEKgNk.mjs");
122
107
  await runOperatorCommand(args);
123
108
  return;
124
109
  }
@@ -138,7 +123,22 @@ async function runPlatformCommand(_root, args) {
138
123
  return;
139
124
  }
140
125
  if (args.subcommand === "status") {
141
- const discovery = await discoverPlatform((await resolveConnection(args.selector)).apiUrl);
126
+ const local = args.selector ? listInstallationManifests().find((manifest) => manifest.id === args.selector && manifest.status !== "uninstalled") : void 0;
127
+ const connection = local ? null : await resolveConnection(args.selector);
128
+ const saved = local ?? (connection?.installationId ? listInstallationManifests().find((manifest) => manifest.id === connection.installationId) : void 0);
129
+ if (saved) showSavedInstallationStatus(saved);
130
+ const apiUrl = local?.endpoints.apiUrl ?? connection?.apiUrl;
131
+ if (!apiUrl) {
132
+ log.info("No verified API endpoint is saved yet. Live traffic availability is unknown.");
133
+ return;
134
+ }
135
+ let discovery;
136
+ try {
137
+ discovery = await discoverPlatform(apiUrl);
138
+ } catch (error) {
139
+ if (saved) log.info("Live availability could not be confirmed. The saved checkpoint above may be out of date.");
140
+ throw error;
141
+ }
142
142
  log.success(`${discovery.displayName} is reachable.`);
143
143
  console.log(`API: ${discovery.apiUrl}`);
144
144
  console.log(`Proxy: ${discovery.proxyUrl}`);
@@ -150,8 +150,18 @@ async function runPlatformCommand(_root, args) {
150
150
  console.log(`Capabilities: ${Object.entries(discovery.capabilities).filter(([, enabled]) => enabled).map(([name]) => name).join(", ")}`);
151
151
  return;
152
152
  }
153
- const { runPlatformLifecycleCommand } = await import("./platform-lifecycle-BE6C_jxh.mjs");
153
+ const { runPlatformLifecycleCommand } = await import("./platform-lifecycle-BaUdTRPU.mjs");
154
154
  await runPlatformLifecycleCommand(args);
155
155
  }
156
+ function showSavedInstallationStatus(manifest) {
157
+ console.log(`Saved installation: ${manifest.id} (${manifest.status})`);
158
+ console.log(`Checkpoint: ${manifest.updatedAt}`);
159
+ if (manifest.operation) {
160
+ const operation = manifest.operation;
161
+ console.log(`Saved operation: ${operation.action} — ${operation.phase}`);
162
+ console.log(`Runtime: ${operation.fromVersion ?? "new installation"} → ${operation.toVersion}`);
163
+ }
164
+ if (manifest.endpoints.apiUrl) console.log(`Administrator status: ${manifest.endpoints.apiUrl}/admin/status`);
165
+ }
156
166
  //#endregion
157
167
  export { saveDiscoveredPlatform as i, promptPlatformUrl as n, runPlatformCommand as r, discoverPlatform as t };
@@ -0,0 +1,27 @@
1
+ import { s as normalizePlatformApiUrl } from "./platform-registry-KfNEF84O.mjs";
2
+ import { parsePlatformDiscoveryDocument } from "@void/platform";
3
+ //#region src/cli/platform-discovery.ts
4
+ /** Validates a `GET /.well-known/void-platform` response from `apiUrl`. */
5
+ async function readPlatformDiscoveryResponse(apiUrl, response) {
6
+ if (!response.ok) {
7
+ await response.body?.cancel();
8
+ throw new Error(`platform: Discovery failed at ${apiUrl} (HTTP ${response.status}).`);
9
+ }
10
+ let value;
11
+ try {
12
+ value = await response.json();
13
+ } catch {
14
+ throw new Error(`platform: ${apiUrl} returned invalid discovery metadata.`);
15
+ }
16
+ let discovery;
17
+ try {
18
+ discovery = parsePlatformDiscoveryDocument(value);
19
+ } catch (error) {
20
+ throw new Error(`platform: ${apiUrl} returned invalid discovery metadata: ${error instanceof Error ? error.message : String(error)}`);
21
+ }
22
+ const finalOrigin = normalizePlatformApiUrl(response.url ? new URL(response.url).origin : apiUrl);
23
+ if (discovery.apiUrl !== finalOrigin) throw new Error(`platform: Discovery origin mismatch. The response came from ${finalOrigin}, but identifies ${discovery.apiUrl}.`);
24
+ return discovery;
25
+ }
26
+ //#endregion
27
+ export { readPlatformDiscoveryResponse as t };
@@ -1,8 +1,8 @@
1
- import { t as cfAccessHeaders } from "./cf-access-DRsQRe6k.mjs";
2
- import { d as readInstallationRecoverySecrets, g as savePlatformConnection, t as acquirePlatformLifecycleLock, v as writeInstallationManifest } from "./platform-registry-QBa4DK32.mjs";
3
- import { B as text, E as confirm, N as note, W as isCancel, j as log } from "./dist-CTBk70IR.mjs";
4
- import { A as PlatformCloudflareClient, E as resolvePlatformCloudflareCredential, T as assertPlatformOperatorCredentialCanApplyPlan, _ as recordPlatformWorkerTraffic, c as createPlatformHealthProbeToken, m as recordResource, n as resolvePlatformInstallDatabaseUrl, o as acquirePlatformDatabaseLifecycleLock, t as assertNoninteractivePlatformMutationAcknowledged, y as createPlatformInstallPlan } from "./platform-lifecycle-9OyBALhH.mjs";
5
- import { a as resolveInstalledPlatformManifest, c as selectAuthoritativePlatformManifest, u as verifyPlatformInstallationOwnership } from "./platform-management-CjwLVQwN.mjs";
1
+ import { _ as savePlatformConnection, f as readInstallationRecoverySecrets, t as acquirePlatformLifecycleLock, y as writeInstallationManifest } from "./platform-registry-KfNEF84O.mjs";
2
+ import { t as cfAccessHeaders } from "./cf-access-TWNzXltp.mjs";
3
+ import { A as confirm, B as note, L as log, X as text, tt as isCancel } from "./prompts-6OSVA7DJ.mjs";
4
+ import { A as PlatformCloudflareClient, E as resolvePlatformCloudflareCredential, T as assertPlatformOperatorCredentialCanApplyPlan, _ as recordPlatformWorkerTraffic, g as recordResource, n as resolvePlatformInstallDatabaseUrl, p as createPlatformHealthProbeToken, s as acquirePlatformDatabaseLifecycleLock, t as assertNoninteractivePlatformMutationAcknowledged, y as createPlatformInstallPlan } from "./platform-lifecycle-Dm09JNkn.mjs";
5
+ import { d as verifyPlatformInstallationOwnership, l as selectAuthoritativePlatformManifest, o as resolveInstalledPlatformManifest } from "./platform-management-BSEc_ZeG.mjs";
6
6
  import { PLATFORM_HEALTH_HOSTNAME_LABEL, PLATFORM_REMOTE_INSTALLATION_MANIFEST_KEY, createApplicationRoutes, createPlatformDeploymentManifest, normalizeApplicationDomain } from "@void/platform";
7
7
  //#region src/cli/platform-domain.ts
8
8
  function platformDomainTarget(manifest, domain, zone, dedicatedZone) {
@@ -1,2 +1,2 @@
1
- import { r as runPlatformLifecycleCommand } from "./platform-lifecycle-9OyBALhH.mjs";
1
+ import { r as runPlatformLifecycleCommand } from "./platform-lifecycle-Dm09JNkn.mjs";
2
2
  export { runPlatformLifecycleCommand };