void 1.5.0 → 1.6.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 (178) hide show
  1. package/dist/{account-cmd-ChVKPZ-w.mjs → account-cmd-DRhmCWcm.mjs} +3 -3
  2. package/dist/{application-analysis-2vGZrKzg.mjs → application-analysis-HRFsZOv3.mjs} +3 -3
  3. package/dist/{application-routing-DnUQoOJD.mjs → application-routing-P4TggvWp.mjs} +1 -1
  4. package/dist/{auth-link-D4uMdOsw.mjs → auth-link-CVXP1G6G.mjs} +3 -3
  5. package/dist/{auth-router-62dna450.mjs → auth-router-D1pGdbvB.mjs} +2 -2
  6. package/dist/{better-auth-shared-CiclgPde.mjs → better-auth-shared-C958aM7W.mjs} +28 -3
  7. package/dist/{build-cmd-D93K_4Sa.mjs → build-cmd-DmjbuT6d.mjs} +1 -1
  8. package/dist/{cache-CiIzEED4.mjs → cache-2khBO1MR.mjs} +1 -1
  9. package/dist/{cancel-deploy-BNoGfn2e.mjs → cancel-deploy-_itbbvY3.mjs} +1 -1
  10. package/dist/cli/cli.mjs +27 -27
  11. package/dist/client-CEtr5UOR.mjs +1 -0
  12. package/dist/{client-Qayy9xEh.mjs → client-CoxPEhJq.mjs} +6 -2
  13. package/dist/{cloudflare-cmd-DiFGaLow.mjs → cloudflare-cmd-fZ6AMSWk.mjs} +1 -1
  14. package/dist/{cloudflare-config-Chet188_.mjs → cloudflare-config-eQunqX6A.mjs} +1 -1
  15. package/dist/{cloudflare-connect-BdgAQBc7.mjs → cloudflare-connect-9OZe4XVQ.mjs} +1 -1
  16. package/dist/{cloudflare-operations-CWA24vCh.mjs → cloudflare-operations-CrskD4_O.mjs} +4 -4
  17. package/dist/{cloudflare-operations-D8MoezuN.mjs → cloudflare-operations-oLvAd9Nd.mjs} +1 -1
  18. package/dist/{config-Bt4rw93x.mjs → config-BBlVXZCU.mjs} +1 -1
  19. package/dist/{config-DkA9jYF2.mjs → config-BITKQ3O6.mjs} +2 -1
  20. package/dist/{config-BszFVhpk.mjs → config-BgysUhnm.mjs} +1 -1
  21. package/dist/{config-CzsNzGVH.d.mts → config-CPxJmt4M.d.mts} +2 -0
  22. package/dist/config-entry.d.mts +1 -1
  23. package/dist/{connect-b9mJbb6X.mjs → connect-CKvmkl2R.mjs} +4 -4
  24. package/dist/{create-project-rnjum4_V.mjs → create-project-BiMmR5wA.mjs} +1 -1
  25. package/dist/{create-project-eomwm0wa.mjs → create-project-Bq0M8MtO.mjs} +1 -1
  26. package/dist/{db-UPWmiSk1.mjs → db-cq5RW4Vy.mjs} +17 -17
  27. package/dist/{delete-BeeYi1WO.mjs → delete-CY4L8fi2.mjs} +1 -1
  28. package/dist/deploy-B029oHlE.mjs +2 -0
  29. package/dist/{deploy-CwmCcTlq.mjs → deploy-D_gEojD2.mjs} +79 -42
  30. package/dist/{deploy-managed-static-gPDxyp3v.mjs → deploy-managed-static-BHVbB_-A.mjs} +11 -11
  31. package/dist/{deploy-transport-L6zzPE9T.mjs → deploy-transport-DEyOUfac.mjs} +2 -2
  32. package/dist/deploy.mjs +5 -4
  33. package/dist/{dev-inbox-CwH5VuZj.mjs → dev-inbox-CUUS6iUg.mjs} +1 -1
  34. package/dist/{dispatch-CiJ1Xrba.mjs → dispatch-BNLB5_Gm.mjs} +1 -1
  35. package/dist/{domain-3xdH9p2L.mjs → domain-BlH90Ods.mjs} +2 -2
  36. package/dist/{email-Du3YRnM5.mjs → email-Bkq8ZL1p.mjs} +6 -6
  37. package/dist/{email-cloudflare-CtD8qE13.mjs → email-cloudflare-MvJIxrwx.mjs} +5 -107
  38. package/dist/{env-Cnvp0pGy.mjs → env-AvuCSeCH.mjs} +2 -2
  39. package/dist/{gen-BvVmpZ5f.mjs → gen-BD-dfjxY.mjs} +3 -3
  40. package/dist/gen-CIHXh9I8.mjs +1 -0
  41. package/dist/{github-cmd-X2GKiLi-.mjs → github-cmd-CA-lBdkn.mjs} +1 -1
  42. package/dist/{handler-Drm_lyrV.d.mts → handler-BR6Tvjkp.d.mts} +8 -3
  43. package/dist/{handler-xmzz0U38.mjs → handler-CKeTtYID.mjs} +2 -12
  44. package/dist/headers-CuTEdP9C.mjs +445 -0
  45. package/dist/{help-EWDNxST-.mjs → help-1OCFDsRr.mjs} +9 -1
  46. package/dist/help-Ba8Dq5-r.mjs +1 -0
  47. package/dist/{inbound-DSKSHDUj.d.mts → inbound-BHt4dIlL.d.mts} +16 -5
  48. package/dist/{inbound-DQfekMtz.mjs → inbound-CdO-qY0w.mjs} +2 -76
  49. package/dist/index.d.mts +1 -1
  50. package/dist/index.mjs +65 -37
  51. package/dist/{info-jW8_d3VI.mjs → info-CJxua_db.mjs} +4 -4
  52. package/dist/{init-jDQ5G9QC.mjs → init-B-4CluYx.mjs} +12 -11
  53. package/dist/{isr-config-DhBkzCdY.mjs → isr-config-Czzb4mIq.mjs} +1 -47
  54. package/dist/{link-DOyxX5Xs.mjs → link-DAXOT-G_.mjs} +2 -2
  55. package/dist/{list-C9pTYDtl.mjs → list-BYSOo9fm.mjs} +2 -2
  56. package/dist/{live-CDBHyYiR.d.mts → live-0xrcVpyq.d.mts} +1 -1
  57. package/dist/{local-d1-CKfek6Z4.mjs → local-d1-BLgsNUj9.mjs} +1 -1
  58. package/dist/login-BpbYeu-n.mjs +1 -0
  59. package/dist/{login-koQbjzPd.mjs → login-CJopTWX4.mjs} +2 -2
  60. package/dist/{logs-cTU5TsRW.mjs → logs-DE0weBsR.mjs} +13 -11
  61. package/dist/{migrate-C62pGTfr.mjs → migrate-ChHHZBTi.mjs} +3 -3
  62. package/dist/migrate-HdA6Kh2p.mjs +1 -0
  63. package/dist/{mime-DKkO7ZtA.mjs → mime-CtP6-qAF.mjs} +143 -15
  64. package/dist/nitro.mjs +3 -3
  65. package/dist/{node-BfAt2rz8.mjs → node-CZ6lGNLn.mjs} +1 -1
  66. package/dist/{operator-cmd-CnAvSqJ5.mjs → operator-cmd-BUqsdk2K.mjs} +28 -10
  67. package/dist/operator-cmd-wBYyp8iQ.mjs +1 -0
  68. package/dist/pages/client.d.mts +143 -11
  69. package/dist/pages/client.mjs +173 -12
  70. package/dist/pages/index.d.mts +22 -3
  71. package/dist/pages/index.mjs +18 -4
  72. package/dist/pages/islands-plugin.d.mts +46 -2
  73. package/dist/pages/islands-plugin.mjs +91 -5
  74. package/dist/pages/prefetch.d.mts +2 -2
  75. package/dist/pages/prefetch.mjs +1 -1
  76. package/dist/pages/protocol.d.mts +2 -2
  77. package/dist/pages/protocol.mjs +2 -2
  78. package/dist/platform-args-C7XUw9mw.mjs +1 -0
  79. package/dist/{platform-args-Bv9hoLEL.mjs → platform-args-Cx1M-7bq.mjs} +18 -4
  80. package/dist/{platform-auth-config-CLj0EvnB.mjs → platform-auth-config-K4m_LE8b.mjs} +4 -4
  81. package/dist/{platform-auth-protection-DQDSxVhr.mjs → platform-auth-protection-KF5Vo-1I.mjs} +2 -2
  82. package/dist/{platform-auth-recovery-DD3oLerq.mjs → platform-auth-recovery-BOdFrl7R.mjs} +2 -2
  83. package/dist/{platform-cmd-WnOmdLzR.mjs → platform-cmd-DpCHawGF.mjs} +1 -1
  84. package/dist/{platform-cmd-PLNLg-2N.mjs → platform-cmd-Ds3EAV5t.mjs} +5 -4
  85. package/dist/{platform-domain-Bnq0vg0q.mjs → platform-domain-rWJshybd.mjs} +2 -2
  86. package/dist/{platform-lifecycle-BQiN9HN5.mjs → platform-lifecycle-BH34I0rh.mjs} +1 -1
  87. package/dist/{platform-lifecycle-BCsFg1Tl.mjs → platform-lifecycle-D9RdGub1.mjs} +66 -31
  88. package/dist/{platform-management-nzCDwtiN.mjs → platform-management-BRefdHGD.mjs} +21 -3
  89. package/dist/{platform-management-CMJR8Zi-.mjs → platform-management-BfLW0Zlo.mjs} +1 -1
  90. package/dist/{platform-recovery-DBNoME3I.mjs → platform-recovery-DZuZGJtt.mjs} +2 -2
  91. package/dist/platform-runtime-logs-CdJGnk3f.mjs +68 -0
  92. package/dist/{platform-setup-VEcHu0Vq.mjs → platform-setup-Vw1AaUN8.mjs} +15 -2
  93. package/dist/{plugin-inference-DmwjC3y2.mjs → plugin-inference-CdLbxZL_.mjs} +1 -1
  94. package/dist/{prefetch-L93_1Jk7.mjs → prefetch-Dx2jIbtg.mjs} +19 -1
  95. package/dist/{prefetch-CG0K6JPd.d.mts → prefetch-NdNeubbH.d.mts} +7 -1
  96. package/dist/{prepare-pfl2LIMy.mjs → prepare-BJW-f1f1.mjs} +4 -4
  97. package/dist/{prepare-BPsfLWaW.mjs → prepare-BMGeKL16.mjs} +1 -1
  98. package/dist/prepare-BdxJJCMv.mjs +1 -0
  99. package/dist/{project-cmd-5Izu4Pg3.mjs → project-cmd-B_bUyZ3J.mjs} +15 -15
  100. package/dist/{project-team-DSUyjZFh.mjs → project-team-MjT5K4rQ.mjs} +1 -1
  101. package/dist/{project-token-wj09YQSB.mjs → project-token-BKHGwY3k.mjs} +1 -1
  102. package/dist/{project-zero-trust-BMHf2YF0.mjs → project-zero-trust-Bzdd05-h.mjs} +1 -1
  103. package/dist/{protocol-0-lp9ZYx.mjs → protocol-COyySMki.mjs} +130 -107
  104. package/dist/{protocol-xdrl-In0.d.mts → protocol-CkwjASep.d.mts} +2 -2
  105. package/dist/{provision-CRiNnlfE.mjs → provision-BbCzpbXs.mjs} +1 -1
  106. package/dist/{provision-CxHIGBIZ.mjs → provision-DQF6Kw-6.mjs} +1 -1
  107. package/dist/{requests-DicgB5jU.mjs → requests-daJmVpjk.mjs} +1 -1
  108. package/dist/{rollback-DrDZOKNE.mjs → rollback-BgL0wY1J.mjs} +2 -2
  109. package/dist/{route-types-irZc1txT.mjs → route-types-CZc1YXjF.mjs} +40 -4
  110. package/dist/route-url-C_YIH_zO.d.mts +37 -0
  111. package/dist/routes-stub.d.mts +6 -2
  112. package/dist/runtime/better-auth-mysql.mjs +1 -1
  113. package/dist/runtime/better-auth-pg.mjs +1 -1
  114. package/dist/runtime/better-auth.mjs +1 -1
  115. package/dist/runtime/email/testing.d.mts +1 -1
  116. package/dist/runtime/email/testing.mjs +3 -3
  117. package/dist/runtime/email.d.mts +1 -1
  118. package/dist/runtime/email.mjs +3 -3
  119. package/dist/runtime/handler.d.mts +1 -1
  120. package/dist/runtime/handler.mjs +2 -2
  121. package/dist/runtime/live-client.d.mts +1 -1
  122. package/dist/runtime/live.d.mts +1 -1
  123. package/dist/runtime/route-url.d.mts +2 -2
  124. package/dist/runtime/routing.d.mts +3 -3
  125. package/dist/runtime/routing.mjs +37 -16
  126. package/dist/runtime/validator.d.mts +1 -1
  127. package/dist/runtime/ws-server.d.mts +1 -1
  128. package/dist/runtime/ws.d.mts +1 -1
  129. package/dist/{scan-DSQtH3oS.mjs → scan-X2rDDRNa.mjs} +18 -10
  130. package/dist/{secret-C_QtTzJG.mjs → secret-CPq-B_vp.mjs} +2 -2
  131. package/dist/{static-asset-marker-NR1XS2z5.mjs → static-asset-marker-DsQKz6lt.mjs} +8 -1
  132. package/dist/validation-error-uAAjlsiW.mjs +82 -0
  133. package/dist/{version-metadata-Blf5H9BQ.mjs → version-metadata-C8hLzQkv.mjs} +1 -1
  134. package/dist/{wrangler-p-kLCJqF.mjs → wrangler-DESSbN8L.mjs} +2 -2
  135. package/dist/wrangler-DUB3MGHV.mjs +1 -0
  136. package/dist/{wrapper-iejSJDwL.mjs → wrapper-C9SUxoj7.mjs} +2 -2
  137. package/dist/{ws-DzBD-NUj.d.mts → ws-Dmjg5NH2.d.mts} +1 -1
  138. package/docs/guide/edge/headers.md +2 -0
  139. package/docs/guide/edge/rewrites.md +1 -1
  140. package/docs/guide/email/receiving.md +1 -1
  141. package/docs/guide/email/sending.md +42 -12
  142. package/docs/guide/pages-routing/actions-and-forms.md +21 -1
  143. package/docs/guide/pages-routing/islands.md +3 -3
  144. package/docs/guide/pages-routing/layouts.md +16 -2
  145. package/docs/guide/pages-routing/loaders.md +2 -2
  146. package/docs/guide/pages-routing/markdown.md +1 -1
  147. package/docs/guide/pages-routing/overview.md +103 -0
  148. package/docs/guide/platform/administration/connected-apps.md +4 -2
  149. package/docs/guide/platform/installation/credentials.md +6 -4
  150. package/docs/guide/platform/installation/maintenance.md +13 -0
  151. package/docs/guide/platform/installation/setup.md +22 -1
  152. package/docs/guide/ssg.md +3 -3
  153. package/docs/guide/type-safety.md +42 -1
  154. package/docs/integrations/frameworks/astro.md +17 -12
  155. package/docs/integrations/frameworks/overview.md +2 -2
  156. package/docs/reference/api/pages.md +101 -50
  157. package/docs/reference/api/rewrites.md +4 -1
  158. package/docs/reference/api/types.md +14 -10
  159. package/docs/reference/api.md +1 -1
  160. package/docs/reference/cli/platform-installation.md +4 -1
  161. package/docs/reference/cli/setup.md +1 -1
  162. package/docs/reference/config.md +10 -0
  163. package/package.json +8 -7
  164. package/schema.json +4 -0
  165. package/skills/void/SKILL.md +5 -0
  166. package/dist/client-DVtAKeUm.mjs +0 -1
  167. package/dist/deploy-CfU7CR-b.mjs +0 -2
  168. package/dist/gen-i61rdQgg.mjs +0 -1
  169. package/dist/headers-DEUBAM6W.mjs +0 -225
  170. package/dist/help-BcZDUcTw.mjs +0 -1
  171. package/dist/login-C0MiQrYs.mjs +0 -1
  172. package/dist/migrate-BG09-KOv.mjs +0 -1
  173. package/dist/operator-cmd-BhHXIL2G.mjs +0 -1
  174. package/dist/platform-args-C1kqYUen.mjs +0 -1
  175. package/dist/prepare-BJMmfq3W.mjs +0 -1
  176. package/dist/route-url-BGOiyKNz.d.mts +0 -24
  177. package/dist/validation-error-rDVbUJet.mjs +0 -47
  178. package/dist/wrangler-CPRX2d9A.mjs +0 -1
@@ -228,6 +228,10 @@ const platformSubcommands = [
228
228
  description: "Safely remove an installed Void platform"
229
229
  }
230
230
  ];
231
+ function parseRuntimeLogs(value) {
232
+ if (value !== "full" && value !== "minimal") throw new Error("platform: --runtime-logs must be full or minimal.");
233
+ return value;
234
+ }
231
235
  function readValue(rest, index, flag) {
232
236
  const value = rest[index + 1];
233
237
  if (!value || value.startsWith("-")) throw new Error(`platform: ${flag} requires a value.`);
@@ -251,6 +255,7 @@ function parseSelector(rest, subcommand, options = {}) {
251
255
  }
252
256
  function parseLifecycleSelector(rest, subcommand) {
253
257
  const positional = [];
258
+ let runtimeLogs;
254
259
  let runtime = "";
255
260
  let fromRuntime = "";
256
261
  let authConfig;
@@ -268,7 +273,11 @@ function parseLifecycleSelector(rest, subcommand) {
268
273
  dashboardUrl = normalizePlatformDashboardUrl(value);
269
274
  index = next;
270
275
  } else if (arg === "--custom-domains" && (subcommand === "upgrade" || subcommand === "repair")) customDomains = true;
271
- else if (arg === "--auth-config" && subcommand === "repair") {
276
+ else if (arg === "--runtime-logs" && subcommand === "upgrade") {
277
+ const [value, next] = readValue(rest, index, arg);
278
+ runtimeLogs = parseRuntimeLogs(value);
279
+ index = next;
280
+ } else if (arg === "--auth-config" && subcommand === "repair") {
272
281
  const [value, next] = readValue(rest, index, arg);
273
282
  authConfig = value;
274
283
  index = next;
@@ -286,7 +295,8 @@ function parseLifecycleSelector(rest, subcommand) {
286
295
  fromRuntime,
287
296
  ...authConfig !== void 0 ? { authConfig } : {},
288
297
  ...dashboardUrl !== void 0 ? { dashboardUrl } : {},
289
- ...customDomains ? { customDomains: true } : {}
298
+ ...customDomains ? { customDomains: true } : {},
299
+ ...runtimeLogs !== void 0 ? { runtimeLogs } : {}
290
300
  };
291
301
  }
292
302
  function parsePlatformArgs(args) {
@@ -379,7 +389,7 @@ function parsePlatformArgs(args) {
379
389
  };
380
390
  }
381
391
  if (subcommand === "upgrade" || subcommand === "rollback" || subcommand === "repair" || subcommand === "disable" || subcommand === "enable") {
382
- const { selector, plan, runtime, fromRuntime, yes, authConfig, dashboardUrl, customDomains } = parseLifecycleSelector(rest, subcommand);
392
+ const { selector, plan, runtime, fromRuntime, yes, authConfig, dashboardUrl, customDomains, runtimeLogs } = parseLifecycleSelector(rest, subcommand);
383
393
  return subcommand === "rollback" ? {
384
394
  subcommand,
385
395
  selector,
@@ -395,7 +405,8 @@ function parsePlatformArgs(args) {
395
405
  yes,
396
406
  ...authConfig !== void 0 ? { authConfig } : {},
397
407
  ...dashboardUrl !== void 0 ? { dashboardUrl } : {},
398
- ...customDomains ? { customDomains } : {}
408
+ ...customDomains ? { customDomains } : {},
409
+ ...runtimeLogs !== void 0 ? { runtimeLogs } : {}
399
410
  };
400
411
  }
401
412
  if (subcommand === "uninstall") {
@@ -434,6 +445,7 @@ function parsePlatformArgs(args) {
434
445
  "--display-name",
435
446
  "--name",
436
447
  "--runtime",
448
+ "--runtime-logs",
437
449
  "--zone"
438
450
  ]);
439
451
  let workersDev = false;
@@ -467,6 +479,7 @@ function parsePlatformArgs(args) {
467
479
  "platform",
468
480
  "custom"
469
481
  ].includes(appAccess)) throw new Error("platform: --app-access accepts public, platform, or custom.");
482
+ const runtimeLogs = values.has("--runtime-logs") ? parseRuntimeLogs(values.get("--runtime-logs")) : void 0;
470
483
  const loginMethods = values.get("--login-methods")?.split(",");
471
484
  if (loginMethods && loginMethods.some((method) => !PLATFORM_LOGIN_KINDS.includes(method))) throw new Error("platform: --login-methods accepts github, google, oidc, and cloudflare-access.");
472
485
  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.");
@@ -481,6 +494,7 @@ function parsePlatformArgs(args) {
481
494
  ...accessProtection !== void 0 ? { accessProtection } : {},
482
495
  ...appAccess !== void 0 ? { appAccess } : {},
483
496
  ...workersDev ? { workersDev: true } : {},
497
+ ...runtimeLogs !== void 0 ? { runtimeLogs } : {},
484
498
  ...values.has("--auth-config") ? { authConfig: values.get("--auth-config") } : {},
485
499
  account: values.get("--account") ?? "",
486
500
  applicationDomain: values.get("--application-domain") ?? "",
@@ -3,8 +3,8 @@ import { A as confirm, K as select, U as password, X as text, z as multiselect }
3
3
  import { l as formatUrl, m as printSuccess } from "./output-BCdLioKP.mjs";
4
4
  import { n as OperatorClient } from "./operator-client-BIY4-N_6.mjs";
5
5
  import { a as resolveOperatorOrigin, r as readOperatorToken } from "./operator-auth-CfDcmzpo.mjs";
6
- import { i as humanLines } from "./operator-cmd-CnAvSqJ5.mjs";
7
- import { o as platformPromptAnswer } from "./platform-setup-VEcHu0Vq.mjs";
6
+ import { i as humanLines } from "./operator-cmd-BUqsdk2K.mjs";
7
+ import { o as platformPromptAnswer } from "./platform-setup-Vw1AaUN8.mjs";
8
8
  import { parsePlatformAdmissionPolicy, parsePlatformLoginConfiguration } from "@void/platform";
9
9
  import { stripVTControlCharacters } from "node:util";
10
10
  import { setTimeout } from "node:timers/promises";
@@ -142,11 +142,11 @@ async function configurationInput(args, existing) {
142
142
  }
143
143
  async function runPlatformAuthConfig(args) {
144
144
  if (args.action === "recover") {
145
- const { runPlatformAuthRecovery } = await import("./platform-auth-recovery-DD3oLerq.mjs");
145
+ const { runPlatformAuthRecovery } = await import("./platform-auth-recovery-BOdFrl7R.mjs");
146
146
  return runPlatformAuthRecovery(args);
147
147
  }
148
148
  if (args.action === "protection") {
149
- const { runPlatformProtectionConfig } = await import("./platform-auth-protection-DQDSxVhr.mjs");
149
+ const { runPlatformProtectionConfig } = await import("./platform-auth-protection-KF5Vo-1I.mjs");
150
150
  return runPlatformProtectionConfig(args);
151
151
  }
152
152
  const origin = resolveOperatorOrigin(args.connection);
@@ -5,8 +5,8 @@ import { A as confirm, tt as isCancel } from "./dist-D23AAMxT.mjs";
5
5
  import { m as printSuccess } from "./output-BCdLioKP.mjs";
6
6
  import { n as OperatorClient } from "./operator-client-BIY4-N_6.mjs";
7
7
  import { a as resolveOperatorOrigin, r as readOperatorToken } from "./operator-auth-CfDcmzpo.mjs";
8
- import { G as checkpointPlatformAccessResources, H as resolvePlatformCloudflareCredential, K as parsePlatformAccessSetupSpec, Y as PlatformCloudflareClient, m as acquirePlatformDatabaseLifecycleLock, n as resolvePlatformInstallDatabaseUrl, q as preparePlatformAccessSetup } from "./platform-lifecycle-BCsFg1Tl.mjs";
9
- import { d as verifyPlatformInstallationOwnership, l as selectAuthoritativePlatformManifest } from "./platform-management-nzCDwtiN.mjs";
8
+ import { G as checkpointPlatformAccessResources, H as resolvePlatformCloudflareCredential, K as parsePlatformAccessSetupSpec, Y as PlatformCloudflareClient, m as acquirePlatformDatabaseLifecycleLock, n as resolvePlatformInstallDatabaseUrl, q as preparePlatformAccessSetup } from "./platform-lifecycle-D9RdGub1.mjs";
9
+ import { d as verifyPlatformInstallationOwnership, l as selectAuthoritativePlatformManifest } from "./platform-management-BRefdHGD.mjs";
10
10
  import { parsePlatformAccessProtection, platformProtectionProofMessage } from "@void/platform";
11
11
  import { createHmac } from "node:crypto";
12
12
  import { readFile } from "node:fs/promises";
@@ -3,8 +3,8 @@ import { u as openBrowser } from "./auth-Dy8svcqQ.mjs";
3
3
  import { A as confirm, tt as isCancel } from "./dist-D23AAMxT.mjs";
4
4
  import { l as formatUrl, m as printSuccess } from "./output-BCdLioKP.mjs";
5
5
  import { a as resolveOperatorOrigin } from "./operator-auth-CfDcmzpo.mjs";
6
- import { H as resolvePlatformCloudflareCredential, Y as PlatformCloudflareClient, g as platformDatabaseClientUrl, h as acquirePlatformDatabaseLifecycleLockConnection, n as resolvePlatformInstallDatabaseUrl } from "./platform-lifecycle-BCsFg1Tl.mjs";
7
- import { d as verifyPlatformInstallationOwnership, l as selectAuthoritativePlatformManifest } from "./platform-management-nzCDwtiN.mjs";
6
+ import { H as resolvePlatformCloudflareCredential, Y as PlatformCloudflareClient, g as platformDatabaseClientUrl, h as acquirePlatformDatabaseLifecycleLockConnection, n as resolvePlatformInstallDatabaseUrl } from "./platform-lifecycle-D9RdGub1.mjs";
7
+ import { d as verifyPlatformInstallationOwnership, l as selectAuthoritativePlatformManifest } from "./platform-management-BRefdHGD.mjs";
8
8
  import { parsePlatformAccessProtection, parsePlatformAdmissionPolicy, parsePlatformLoginConfiguration, platformAuthenticationRecoveryMessage, validatePlatformAdmissionPolicy } from "@void/platform";
9
9
  import { createCipheriv, createDecipheriv, createHash, createHmac, hkdfSync, randomBytes, randomUUID } from "node:crypto";
10
10
  import { setTimeout } from "node:timers/promises";
@@ -1 +1 @@
1
- export { t as discoverPlatform, r as runPlatformCommand } from "./platform-cmd-PLNLg-2N.mjs";
1
+ export { t as discoverPlatform, r as runPlatformCommand } from "./platform-cmd-Ds3EAV5t.mjs";
@@ -96,19 +96,19 @@ async function runPlatformCommand(_root, args) {
96
96
  }]
97
97
  });
98
98
  if (isCancel(group)) return;
99
- const { parsePlatformArgs } = await import("./platform-args-C1kqYUen.mjs");
99
+ const { parsePlatformArgs } = await import("./platform-args-C7XUw9mw.mjs");
100
100
  return runPlatformCommand(_root, parsePlatformArgs(["config", group]));
101
101
  }
102
102
  const { runPlatformPlansConfig } = await import("./platform-plans-config-Dx1agneU.mjs");
103
103
  await runPlatformPlansConfig(args);
104
104
  return;
105
105
  }
106
- const { runPlatformAuthConfig } = await import("./platform-auth-config-CLj0EvnB.mjs");
106
+ const { runPlatformAuthConfig } = await import("./platform-auth-config-K4m_LE8b.mjs");
107
107
  await runPlatformAuthConfig(args);
108
108
  return;
109
109
  }
110
110
  if (args.subcommand === "operator") {
111
- const { runOperatorCommand } = await import("./operator-cmd-BhHXIL2G.mjs");
111
+ const { runOperatorCommand } = await import("./operator-cmd-wBYyp8iQ.mjs");
112
112
  await runOperatorCommand(args);
113
113
  return;
114
114
  }
@@ -176,12 +176,13 @@ async function runPlatformCommand(_root, args) {
176
176
  console.log(`Capabilities: ${Object.entries(discovery.capabilities).filter(([, enabled]) => enabled).map(([name]) => name).join(", ")}`);
177
177
  return;
178
178
  }
179
- const { runPlatformLifecycleCommand } = await import("./platform-lifecycle-BQiN9HN5.mjs");
179
+ const { runPlatformLifecycleCommand } = await import("./platform-lifecycle-BH34I0rh.mjs");
180
180
  await runPlatformLifecycleCommand(args);
181
181
  }
182
182
  function showSavedInstallationStatus(manifest) {
183
183
  console.log(`Saved installation: ${manifest.id} (${manifest.status})`);
184
184
  console.log(`Checkpoint: ${manifest.updatedAt}`);
185
+ if (manifest.deployment.runtimeLogs) console.log(`Runtime logs: ${manifest.deployment.runtimeLogs}`);
185
186
  if (manifest.operation) {
186
187
  const operation = manifest.operation;
187
188
  console.log(`Saved operation: ${operation.action} — ${operation.phase}`);
@@ -2,8 +2,8 @@ import { m as readInstallationRecoverySecrets, t as acquirePlatformLifecycleLock
2
2
  import { t as cfAccessHeaders } from "./cf-access-pejlJmuy.mjs";
3
3
  import { A as confirm, X as text, tt as isCancel } from "./dist-D23AAMxT.mjs";
4
4
  import { m as printSuccess, p as note } from "./output-BCdLioKP.mjs";
5
- import { C as createPlatformHealthProbeToken, E as recordResource, H as resolvePlatformCloudflareCredential, O as recordPlatformWorkerTraffic, V as assertPlatformOperatorCredentialCanApplyPlan, Y as PlatformCloudflareClient, k as createPlatformInstallPlan, m as acquirePlatformDatabaseLifecycleLock, n as resolvePlatformInstallDatabaseUrl, t as assertNoninteractivePlatformMutationAcknowledged } from "./platform-lifecycle-BCsFg1Tl.mjs";
6
- import { d as verifyPlatformInstallationOwnership, l as selectAuthoritativePlatformManifest, o as resolveInstalledPlatformManifest } from "./platform-management-nzCDwtiN.mjs";
5
+ import { C as createPlatformHealthProbeToken, E as recordResource, H as resolvePlatformCloudflareCredential, O as recordPlatformWorkerTraffic, V as assertPlatformOperatorCredentialCanApplyPlan, Y as PlatformCloudflareClient, k as createPlatformInstallPlan, m as acquirePlatformDatabaseLifecycleLock, n as resolvePlatformInstallDatabaseUrl, t as assertNoninteractivePlatformMutationAcknowledged } from "./platform-lifecycle-D9RdGub1.mjs";
6
+ import { d as verifyPlatformInstallationOwnership, l as selectAuthoritativePlatformManifest, o as resolveInstalledPlatformManifest } from "./platform-management-BRefdHGD.mjs";
7
7
  import { PLATFORM_HEALTH_HOSTNAME_LABEL, PLATFORM_REMOTE_INSTALLATION_MANIFEST_KEY, createApplicationRoutes, createPlatformDeploymentManifest, normalizeApplicationDomain } from "@void/platform";
8
8
  // src/cli/platform-domain.ts
9
9
  function platformDomainTarget(manifest, domain, zone, dedicatedZone) {
@@ -1 +1 @@
1
- export { r as runPlatformLifecycleCommand } from "./platform-lifecycle-BCsFg1Tl.mjs";
1
+ export { r as runPlatformLifecycleCommand } from "./platform-lifecycle-D9RdGub1.mjs";
@@ -6,10 +6,11 @@ import { t as ensurePlatformAccessToken } from "./cf-access-BmBT2h8_.mjs";
6
6
  import { A as confirm, H as outro, K as select, L as log, U as password, X as text$1, tt as isCancel, z as multiselect } from "./dist-D23AAMxT.mjs";
7
7
  import { f as import_picocolors, l as formatUrl, m as printSuccess, n as cliCommandName, p as note, r as createSpinner, u as getErrorMessage } from "./output-BCdLioKP.mjs";
8
8
  import { l as resolveCloudflareOperationArgv } from "./cloudflare-process-DjJ638A-.mjs";
9
- import { o as createDefaultRunWrangler, v as resolvePinnedApiBaseUrl } from "./provision-CRiNnlfE.mjs";
10
- import { t as parsePlatformArgs } from "./platform-args-Bv9hoLEL.mjs";
9
+ import { o as createDefaultRunWrangler, v as resolvePinnedApiBaseUrl } from "./provision-BbCzpbXs.mjs";
10
+ import { t as parsePlatformArgs } from "./platform-args-Cx1M-7bq.mjs";
11
11
  import { o as runCloudflareAuthCommand } from "./cloudflare-auth-CEu-1Ps_.mjs";
12
- import { a as platformManagementSetupPage, c as platformSetupLink, i as platformInstallCommandArguments, l as platformSetupPages, n as formatPlatformSetupPlan, o as platformPromptAnswer, r as openPlatformSetupPage, s as platformSetupFieldHelp, t as formatPlatformInstallCommand } from "./platform-setup-VEcHu0Vq.mjs";
12
+ import { i as updateProjectWorkerRuntimeLogs, n as assertPlatformRuntimeLogsSupported, r as shouldUpdateProjectWorkerRuntimeLogs } from "./platform-runtime-logs-CdJGnk3f.mjs";
13
+ import { a as platformManagementSetupPage, c as platformSetupLink, d as planWritesDns, i as platformInstallCommandArguments, l as platformSetupPages, n as formatPlatformSetupPlan, o as platformPromptAnswer, r as openPlatformSetupPage, s as platformSetupFieldHelp, t as formatPlatformInstallCommand, u as planCreatesZone } from "./platform-setup-Vw1AaUN8.mjs";
13
14
  import { copyFileSync, cpSync, existsSync, lstatSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, rmSync, writeFileSync } from "node:fs";
14
15
  import { fileURLToPath } from "node:url";
15
16
  import { isRecord } from "@void/deploy-core";
@@ -161,7 +162,7 @@ var PlatformCloudflareClient = class PlatformCloudflareClient {
161
162
  headers: {
162
163
  Accept: "application/json",
163
164
  Authorization: `Bearer ${this.#token}`,
164
- ...init?.body ? { "Content-Type": "application/json" } : {},
165
+ ...typeof init?.body === "string" ? { "Content-Type": "application/json" } : {},
165
166
  ...init?.headers
166
167
  },
167
168
  signal: init?.signal ?? AbortSignal.timeout(3e4),
@@ -733,6 +734,15 @@ var PlatformCloudflareClient = class PlatformCloudflareClient {
733
734
  async listDispatchNamespaceScripts(accountId, namespace) {
734
735
  return (await this.request(`/accounts/${encodeURIComponent(accountId)}/workers/dispatch/namespaces/${encodeURIComponent(namespace)}/scripts`)).map((entry) => requiredString(entry.id, "Dispatch namespace script name"));
735
736
  }
737
+ /** Change settings of one namespace script. Omitted fields, such as bindings, are kept. */
738
+ async patchDispatchNamespaceScriptSettings(accountId, namespace, scriptName, settings) {
739
+ const body = new FormData();
740
+ body.set("settings", new Blob([JSON.stringify(settings)], { type: "application/json" }), "settings.json");
741
+ await this.request(`/accounts/${encodeURIComponent(accountId)}/workers/dispatch/namespaces/${encodeURIComponent(namespace)}/scripts/${encodeURIComponent(scriptName)}/settings`, {
742
+ method: "PATCH",
743
+ body
744
+ });
745
+ }
736
746
  async deleteDispatchNamespaceScript(accountId, namespace, scriptName) {
737
747
  await this.#deleteIfPresent(`/accounts/${encodeURIComponent(accountId)}/workers/dispatch/namespaces/${encodeURIComponent(namespace)}/scripts/${encodeURIComponent(scriptName)}`);
738
748
  }
@@ -1794,12 +1804,6 @@ function assertPlatformOperatorCredentialCanApplyPlan(credential, plan, access)
1794
1804
  function platformOperatorNeedsManagementToken(credential, plan, access) {
1795
1805
  return credential.source === "oauth" && (!!access || planCreatesZone(plan) || planWritesDns(plan));
1796
1806
  }
1797
- function planCreatesZone(plan) {
1798
- return plan.actions.some((action) => action.kind === "zone" && action.action === "create");
1799
- }
1800
- function planWritesDns(plan) {
1801
- return plan.actions.some((action) => action.kind === "dns-record" && action.action !== "reuse");
1802
- }
1803
1807
  async function resolvePlatformCloudflareCredential(dependencies = {}) {
1804
1808
  const { credential } = await resolvePlatformCloudflareCredentialWithInput(async () => void 0, dependencies);
1805
1809
  return credential;
@@ -2425,6 +2429,7 @@ async function createPlatformInstallPlan(client, input, existing, options) {
2425
2429
  if (capabilities.customDomains && (testing || !input.dedicatedZone)) throw new Error("platform: Custom domains need a dedicated application zone. Install with a domain and --dedicated-zone.");
2426
2430
  if (capabilities.email && options?.includeEmailGateway !== false && !enableEmail) throw new Error("platform: Email-enabled installations require VOID_EMAIL_SENDER_DOMAIN and VOID_EMAIL_SHARED_ZONE_ID before deploying this runtime.");
2427
2431
  if (input.appAccess && input.appAccess !== "public" && input.controlPlaneDomain.toLowerCase().replace(/\.$/, "").endsWith(`.${input.applicationDomain.toLowerCase()}`)) throw new Error("platform: The API hostname must be outside the app Access wildcard. Use the application domain apex or workers.dev for the API, then plan again.");
2432
+ const runtimeLogs = input.runtimeLogs === void 0 ? existing?.deployment.runtimeLogs : input.runtimeLogs === "minimal" ? "minimal" : void 0;
2428
2433
  const deployment = createPlatformDeploymentManifest({
2429
2434
  authentication: input.authentication ?? existing?.deployment.authentication,
2430
2435
  appAccess: input.appAccess ?? existing?.deployment.appAccess,
@@ -2446,7 +2451,8 @@ async function createPlatformInstallPlan(client, input, existing, options) {
2446
2451
  ...emailSharedZoneId ? { emailSharedZoneId } : {},
2447
2452
  ...normalizedEmailSenderDomain ? { emailSenderDomain: normalizedEmailSenderDomain } : {},
2448
2453
  installationSlug,
2449
- resources: existing?.deployment.resources ?? createPlatformResourceNames(installationSlug)
2454
+ resources: existing?.deployment.resources ?? createPlatformResourceNames(installationSlug),
2455
+ ...runtimeLogs ? { runtimeLogs } : {}
2450
2456
  });
2451
2457
  const { emailSharedZoneId: configuredEmailZone, emailSenderDomain: configuredSenderDomain, ...deploymentWithoutEmailZone } = deployment;
2452
2458
  const { emailSharedZoneId: recordedEmailZone, emailSenderDomain: recordedSenderDomain, ...existingWithoutEmailZone } = existing?.deployment ?? deployment;
@@ -2472,14 +2478,19 @@ async function createPlatformInstallPlan(client, input, existing, options) {
2472
2478
  customDomains: true
2473
2479
  }
2474
2480
  } : existingWithDashboard;
2475
- const comparableExistingWithoutEmailZone = existing && deployment.capabilities.email && !existing.deployment.capabilities.email ? {
2481
+ const existingWithEmail = existing && deployment.capabilities.email && !existing.deployment.capabilities.email ? {
2476
2482
  ...existingWithCustomDomains,
2477
2483
  capabilities: {
2478
2484
  ...existingWithCustomDomains.capabilities,
2479
2485
  email: true
2480
2486
  }
2481
2487
  } : existingWithCustomDomains;
2482
- if (existing && (JSON.stringify(comparableExistingWithoutEmailZone) !== JSON.stringify(deploymentWithoutEmailZone) || recordedEmailZone !== void 0 && recordedEmailZone !== configuredEmailZone || recordedSenderDomain !== void 0 && recordedSenderDomain !== configuredSenderDomain)) throw new Error(`platform: --resume inputs do not match installation ${existing.id}. Use its recorded configuration.`);
2488
+ const comparable = (value) => {
2489
+ if (!options?.allowRuntimeLogsChange) return JSON.stringify(value);
2490
+ const { runtimeLogs: _runtimeLogs, schemaVersion: _schemaVersion, ...rest } = value;
2491
+ return JSON.stringify(rest);
2492
+ };
2493
+ if (existing && (comparable(existingWithEmail) !== comparable(deploymentWithoutEmailZone) || recordedEmailZone !== void 0 && recordedEmailZone !== configuredEmailZone || recordedSenderDomain !== void 0 && recordedSenderDomain !== configuredSenderDomain)) throw new Error(`platform: --resume inputs do not match installation ${existing.id}. Use its recorded configuration.`);
2483
2494
  const names = deployment.resources;
2484
2495
  const wildcardHostname = `*.${deployment.application.baseDomain}`;
2485
2496
  const zone = testing ? null : await client.findZone(account.id, deployment.application.zoneName);
@@ -3059,7 +3070,10 @@ async function readRemoteOwnership(client, accountId, routingNamespaces, existin
3059
3070
  }
3060
3071
  return null;
3061
3072
  }
3062
- function formatPlatformInstallPlan(plan) {
3073
+ /** `previous` is the installed deployment, so a changed setting shows what it was. */
3074
+ function formatPlatformInstallPlan(plan, previous) {
3075
+ const runtimeLogs = plan.deployment.runtimeLogs ?? "full";
3076
+ const previousRuntimeLogs = previous ? previous.runtimeLogs ?? "full" : runtimeLogs;
3063
3077
  const lines = [
3064
3078
  `${import_picocolors.default.bold(`${plan.deployment.displayName} in ${plan.account.name}`)}`,
3065
3079
  `${import_picocolors.default.bold("Account:")} ${plan.account.id}`,
@@ -3074,6 +3088,7 @@ function formatPlatformInstallPlan(plan) {
3074
3088
  platform: "Same as platform Access policy",
3075
3089
  custom: "Selected Access policy"
3076
3090
  }[plan.deployment.appAccess]}`] : [],
3091
+ ...runtimeLogs !== previousRuntimeLogs ? [`${import_picocolors.default.bold("Runtime logs:")} ${runtimeLogs} (was ${previousRuntimeLogs})`] : plan.deployment.runtimeLogs ? [`${import_picocolors.default.bold("Runtime logs:")} ${plan.deployment.runtimeLogs}`] : [],
3077
3092
  `${import_picocolors.default.bold("Login callback:")} ${plan.apiUrl}/auth/callback`,
3078
3093
  `${import_picocolors.default.bold("Database:")} ${plan.externalHyperdrive?.database || "PostgreSQL"} via Hyperdrive ${plan.deployment.resources.hyperdrive}`,
3079
3094
  ""
@@ -5494,7 +5509,7 @@ async function verifyInstalledPlatformAccessProtection(input) {
5494
5509
  }
5495
5510
  const existingWorkers = input.plan.actions.filter((action) => action.kind === "worker" && action.action === "update").map((action) => action.name);
5496
5511
  if (existingWorkers.length) {
5497
- const { verifyProtectionWorkerOrigins } = await import("./platform-auth-protection-DQDSxVhr.mjs");
5512
+ const { verifyProtectionWorkerOrigins } = await import("./platform-auth-protection-KF5Vo-1I.mjs");
5498
5513
  await verifyProtectionWorkerOrigins({
5499
5514
  request: input.client.request.bind(input.client),
5500
5515
  listWorkerDomains: input.client.listWorkerDomains.bind(input.client),
@@ -6646,6 +6661,7 @@ async function installPlatform(plan, secrets, existing, dependencies) {
6646
6661
  const runtimeDirectory = resolvedRuntime.directory;
6647
6662
  const runtime = resolvedRuntime.manifest;
6648
6663
  if (plan.deployment.appAccess && runtime.appAccessSetup !== 1) throw new Error("platform: This runtime does not support the installation’s app access setup.");
6664
+ assertPlatformRuntimeLogsSupported(plan.deployment, runtime);
6649
6665
  const hasEmailGatewayArtifact = runtime.artifacts.emailGateway !== void 0;
6650
6666
  if (existing?.steps.some((step) => step.key === "private-previews-initialized:v1") && runtime.privatePreviews !== 1) throw new Error("platform: This installation has private previews. Use a runtime with private preview support.");
6651
6667
  if (runtime.emailProtocolVersion !== 1 && plan.deployment.capabilities.email) throw new Error("platform: This runtime cannot serve enabled platform email without email protocol version 1.");
@@ -7804,14 +7820,14 @@ function resolvePlatformInstallDatabaseUrl(checkpoint, manifest = null) {
7804
7820
  }
7805
7821
  async function runPlatformLifecycleCommand(commandArgs) {
7806
7822
  if (commandArgs.subcommand === "domain") {
7807
- const { runPlatformDomainCommand } = await import("./platform-domain-Bnq0vg0q.mjs");
7823
+ const { runPlatformDomainCommand } = await import("./platform-domain-rWJshybd.mjs");
7808
7824
  await runPlatformDomainCommand(commandArgs);
7809
7825
  return;
7810
7826
  }
7811
7827
  if (commandArgs.subcommand === "discover") {
7812
7828
  const client = new PlatformCloudflareClient((await resolvePlatformCloudflareCredential()).token);
7813
7829
  const accountId = await selectAccount(await readAccounts(client), commandArgs.account);
7814
- const { recoverPlatformInstallations } = await import("./platform-recovery-DBNoME3I.mjs");
7830
+ const { recoverPlatformInstallations } = await import("./platform-recovery-DZuZGJtt.mjs");
7815
7831
  const recovered = await recoverPlatformInstallations(client, accountId, void 0, commandArgs.selector);
7816
7832
  if (recovered.length === 0) {
7817
7833
  log.info(`No recoverable Void platform installations were found in ${accountId}.`);
@@ -7822,7 +7838,7 @@ async function runPlatformLifecycleCommand(commandArgs) {
7822
7838
  return;
7823
7839
  }
7824
7840
  if (commandArgs.subcommand !== "install") {
7825
- const { runInstalledPlatformCommand } = await import("./platform-management-CMJR8Zi-.mjs");
7841
+ const { runInstalledPlatformCommand } = await import("./platform-management-BfLW0Zlo.mjs");
7826
7842
  await runInstalledPlatformCommand(commandArgs);
7827
7843
  return;
7828
7844
  }
@@ -7850,7 +7866,7 @@ async function runPlatformLifecycleCommand(commandArgs) {
7850
7866
  if (!args.resume && process.stdin.isTTY) {
7851
7867
  const installs = resumableInstalls().filter((manifest) => !args.name || manifest.deployment.installationSlug === normalizeInstallationSlug(args.name));
7852
7868
  const manifests = listInstallationManifests();
7853
- const savedPlans = !args.applicationDomain && !args.workersDev && !args.zone && !args.displayName && !args.hyperdrive && !args.controlPlaneDomain && !args.noControlPlaneDomain && !args.authConfig && !args.loginMethods && !args.runtime && args.accessProtection === void 0 && args.appAccess === void 0 && !args.dedicatedZoneSpecified && args.dashboardUrl === void 0 && !args.customDomains ? listSavedPlatformInstallPlans().filter((saved) => (!args.name || saved.args.name === normalizeInstallationSlug(args.name)) && (!args.account || saved.args.account === args.account || saved.accountName.toLowerCase() === args.account.toLowerCase()) && !manifests.some((manifest) => manifest.status !== "uninstalled" && manifest.account.id === saved.args.account && manifest.deployment.installationSlug === saved.args.name)) : [];
7869
+ const savedPlans = !args.applicationDomain && !args.workersDev && !args.zone && !args.displayName && !args.hyperdrive && !args.controlPlaneDomain && !args.noControlPlaneDomain && !args.authConfig && !args.loginMethods && !args.runtime && args.accessProtection === void 0 && args.appAccess === void 0 && !args.dedicatedZoneSpecified && args.dashboardUrl === void 0 && !args.customDomains && args.runtimeLogs === void 0 ? listSavedPlatformInstallPlans().filter((saved) => (!args.name || saved.args.name === normalizeInstallationSlug(args.name)) && (!args.account || saved.args.account === args.account || saved.accountName.toLowerCase() === args.account.toLowerCase()) && !manifests.some((manifest) => manifest.status !== "uninstalled" && manifest.account.id === saved.args.account && manifest.deployment.installationSlug === saved.args.name)) : [];
7854
7870
  if (installs.length > 0 || savedPlans.length > 0) {
7855
7871
  const choice = await select({
7856
7872
  message: "Continue a previous platform install?",
@@ -7998,7 +8014,7 @@ async function runPlatformLifecycleCommand(commandArgs) {
7998
8014
  progress?.stop("Read the saved installation.");
7999
8015
  progress = void 0;
8000
8016
  if (authoritative) {
8001
- const { selectAuthoritativePlatformManifest } = await import("./platform-management-CMJR8Zi-.mjs");
8017
+ const { selectAuthoritativePlatformManifest } = await import("./platform-management-BfLW0Zlo.mjs");
8002
8018
  const selected = selectAuthoritativePlatformManifest(existing, authoritative);
8003
8019
  authoritativeProvisionIntents = true;
8004
8020
  if (!args.plan && JSON.stringify(selected) !== JSON.stringify(existing)) writeInstallationManifest(selected);
@@ -8111,6 +8127,7 @@ async function runPlatformLifecycleCommand(commandArgs) {
8111
8127
  ...process.env.VOID_EMAIL_SHARED_ZONE_ID ? { emailSharedZoneId: process.env.VOID_EMAIL_SHARED_ZONE_ID } : {},
8112
8128
  ...process.env.VOID_EMAIL_SENDER_DOMAIN ? { emailSenderDomain: process.env.VOID_EMAIL_SENDER_DOMAIN } : {},
8113
8129
  installationSlug,
8130
+ ...args.runtimeLogs !== void 0 ? { runtimeLogs: args.runtimeLogs } : {},
8114
8131
  zoneName,
8115
8132
  ...workersDev ? { workersDev: true } : {}
8116
8133
  };
@@ -8122,6 +8139,7 @@ async function runPlatformLifecycleCommand(commandArgs) {
8122
8139
  deploymentExecution: runtime.manifest.deploymentExecution === 1
8123
8140
  };
8124
8141
  let plan = await createPlatformInstallPlan(client, planInput, existing, planOptions);
8142
+ assertPlatformRuntimeLogsSupported(plan.deployment, runtime.manifest);
8125
8143
  const commandOptions = {
8126
8144
  commandName: cliCommandName(),
8127
8145
  accountId,
@@ -8139,6 +8157,7 @@ async function runPlatformLifecycleCommand(commandArgs) {
8139
8157
  authentication: authenticationSelection.authentication,
8140
8158
  hyperdrive: !existing || isPlatformSetupDraft(existing) || externalHyperdrive && !recordedHyperdrive ? externalHyperdrive?.id ?? "create" : void 0,
8141
8159
  runtime: args.runtime,
8160
+ ...!existing && plan.deployment.runtimeLogs ? { runtimeLogs: "minimal" } : {},
8142
8161
  ...existing ? { resumeId: existing.id } : {},
8143
8162
  yes: args.yes || process.stdin.isTTY !== true
8144
8163
  };
@@ -8233,7 +8252,7 @@ async function runPlatformLifecycleCommand(commandArgs) {
8233
8252
  Object.assign(values, updates);
8234
8253
  if (credentialSetup) writePendingInstallationSecrets(setupManifest, values);
8235
8254
  };
8236
- const configured = (key, environment) => credentialSetup ? process.env[environment] || values[key] || "" : values[key] || process.env[environment] || "";
8255
+ const configured = (key, environment) => credentialSetup || key === "cloudflareApiToken" ? process.env[environment] || values[key] || "" : values[key] || process.env[environment] || "";
8237
8256
  const collect = async (key, environment, message, masked = true, persist = true, validate) => {
8238
8257
  let value = configured(key, environment);
8239
8258
  if (!value) {
@@ -8248,7 +8267,8 @@ async function runPlatformLifecycleCommand(commandArgs) {
8248
8267
  };
8249
8268
  const pages = platformSetupPages(plan);
8250
8269
  if (!configured("cloudflareApiToken", "VOID_PLATFORM_RUNTIME_CLOUDFLARE_API_TOKEN")) openPlatformSetupPage(pages.runtime);
8251
- const usingSavedRuntimeToken = credentialSetup && !process.env.VOID_PLATFORM_RUNTIME_CLOUDFLARE_API_TOKEN && Boolean(values.cloudflareApiToken);
8270
+ const savedRuntimeToken = checkpoint?.cloudflareApiToken ?? "";
8271
+ const usingSavedRuntimeToken = !process.env.VOID_PLATFORM_RUNTIME_CLOUDFLARE_API_TOKEN && Boolean(values.cloudflareApiToken);
8252
8272
  let runtimeCloudflareApiToken = await collect("cloudflareApiToken", "VOID_PLATFORM_RUNTIME_CLOUDFLARE_API_TOKEN", "Paste runtime API token:", true, false);
8253
8273
  let rejectedSavedRuntimeToken = false;
8254
8274
  const verifyRuntimeToken = async (token) => {
@@ -8267,9 +8287,9 @@ async function runPlatformLifecycleCommand(commandArgs) {
8267
8287
  plan = await verifyPlatformAiGatewayPlan(client, planInput, existing, plan, authoritativeProvisionIntents);
8268
8288
  }
8269
8289
  } catch (error) {
8270
- if (credentialSetup && token === values.cloudflareApiToken && !(error instanceof PlatformRuntimeTokenEmailPermissionError) && isPlatformTokenAuthorizationError(error, checkingRuntimePermissions ? void 0 : "/ai-gateway/")) {
8290
+ if (token === values.cloudflareApiToken && !(error instanceof PlatformRuntimeTokenEmailPermissionError) && isPlatformTokenAuthorizationError(error, checkingRuntimePermissions ? void 0 : "/ai-gateway/")) {
8271
8291
  delete values.cloudflareApiToken;
8272
- writePendingInstallationSecrets(setupManifest, values);
8292
+ if (credentialSetup) writePendingInstallationSecrets(setupManifest, values);
8273
8293
  rejectedSavedRuntimeToken = true;
8274
8294
  }
8275
8295
  throw error;
@@ -8333,22 +8353,26 @@ async function runPlatformLifecycleCommand(commandArgs) {
8333
8353
  const hasFullProjectSecretKeyring = Boolean(checkpoint?.projectSecretKeysJson || checkpoint?.projectSecretActiveKeyVersion || process.env.VOID_PLATFORM_PROJECT_SECRET_KEYS_JSON || process.env.VOID_PLATFORM_PROJECT_SECRET_ACTIVE_KEY_VERSION);
8334
8354
  const generateIdentityKeys = credentialSetup && !!process.stdin.isTTY;
8335
8355
  const generatedKeys = generateIdentityKeys ? [configured("jwtSecret", "VOID_PLATFORM_JWT_SECRET") ? "" : "JWT signing key", configured("projectSecretKey", "VOID_PLATFORM_PROJECT_SECRET_KEY") || hasFullProjectSecretKeyring ? "" : "project encryption key"].filter(Boolean) : [];
8356
+ const replacingRuntimeToken = !credentialSetup && !!savedRuntimeToken && runtimeCloudflareApiToken !== savedRuntimeToken;
8357
+ const updateExistingWorkers = replacingRuntimeToken || !credentialSetup && Boolean(checkpoint?.workerSecretUpdatesJson);
8358
+ const checkpointValue = (value) => updateExistingWorkers ? "" : value;
8336
8359
  const secrets = createPlatformInstallationSecrets({
8337
8360
  configurableAuthentication: !!authenticationSelection.authentication.configurable,
8338
8361
  ...authenticationSecrets,
8339
8362
  bootstrapGitHubId,
8340
8363
  bootstrapGitHubLogin,
8341
- cloudflareApiToken: runtimeCloudflareApiToken,
8364
+ cloudflareApiToken: replacingRuntimeToken ? runtimeCloudflareApiToken : checkpointValue(runtimeCloudflareApiToken),
8342
8365
  checkpoint: values,
8343
8366
  databaseUrl: installationDatabaseUrl,
8344
8367
  emailEnabled: plan.deployment.capabilities.email,
8345
- emailSigningSecret: process.env.VOID_PLATFORM_EMAIL_SIGNING_SECRET || "",
8368
+ emailSigningSecret: updateExistingWorkers && values.emailSigningSecret ? "" : process.env.VOID_PLATFORM_EMAIL_SIGNING_SECRET || "",
8346
8369
  existingEmailEnabled: existing.deployment.capabilities.email,
8347
- githubClientId,
8348
- githubClientSecret,
8349
- r2AccessKeyId,
8350
- r2SecretAccessKey,
8370
+ githubClientId: checkpointValue(githubClientId),
8371
+ githubClientSecret: checkpointValue(githubClientSecret),
8372
+ r2AccessKeyId: checkpointValue(r2AccessKeyId),
8373
+ r2SecretAccessKey: checkpointValue(r2SecretAccessKey),
8351
8374
  existingInstallation: !credentialSetup,
8375
+ updateExistingWorkers,
8352
8376
  generateIdentityKeys,
8353
8377
  jwtSecret: generateIdentityKeys ? configured("jwtSecret", "VOID_PLATFORM_JWT_SECRET") : await collect("jwtSecret", "VOID_PLATFORM_JWT_SECRET", "JWT signing key:", true, true, credentialSetup ? (value) => Buffer.byteLength(value, "utf8") >= 32 ? void 0 : "The JWT signing secret must contain at least 32 random bytes." : void 0),
8354
8378
  projectSecretKey: configured("projectSecretKey", "VOID_PLATFORM_PROJECT_SECRET_KEY") || (hasFullProjectSecretKeyring || generateIdentityKeys ? "" : await collect("projectSecretKey", "VOID_PLATFORM_PROJECT_SECRET_KEY", "Project encryption key:", true, true, credentialSetup ? (value) => {
@@ -8438,7 +8462,7 @@ async function runPlatformLifecycleCommand(commandArgs) {
8438
8462
  })).actions.filter((action) => action.kind === "worker"),
8439
8463
  revalidateBeforeWorkerDeploy: (manifest, action) => revalidatePlatformInstallAction(client, plan, manifest, action),
8440
8464
  verifyExistingOwnership: async (manifest, databaseCheckpointExists) => {
8441
- const { verifyPlatformInstallationOwnership } = await import("./platform-management-CMJR8Zi-.mjs");
8465
+ const { verifyPlatformInstallationOwnership } = await import("./platform-management-BfLW0Zlo.mjs");
8442
8466
  const retainedReplacementKeys = new Set(plan.actions.filter((action) => {
8443
8467
  const previous = manifest.resources.find((resource) => resource.key === action.key);
8444
8468
  return action.action === "create" && previous && previous.name !== action.name;
@@ -8450,7 +8474,18 @@ async function runPlatformLifecycleCommand(commandArgs) {
8450
8474
  });
8451
8475
  }
8452
8476
  });
8477
+ const runtimeLogsWarning = !result.waitingForDns && !result.waitingForSandboxDrain && shouldUpdateProjectWorkerRuntimeLogs({
8478
+ previous: setupManifest.deployment,
8479
+ next: result.manifest.deployment,
8480
+ explicit: args.runtimeLogs !== void 0
8481
+ }) ? await updateProjectWorkerRuntimeLogs(client, {
8482
+ accountId,
8483
+ namespace: result.manifest.deployment.resources.dispatchNamespace,
8484
+ minimal: !!result.manifest.deployment.runtimeLogs,
8485
+ installationId: result.manifest.id
8486
+ }) : void 0;
8453
8487
  progress?.stop(result.waitingForDns || result.waitingForSandboxDrain ? "Installation paused. Progress is saved." : "Platform installed.");
8488
+ if (runtimeLogsWarning) log.warn(runtimeLogsWarning);
8454
8489
  progress = void 0;
8455
8490
  if (result.waitingForDns) {
8456
8491
  note(result.zoneNameServers.length > 0 ? `Update the domain at your registrar to use:\n${result.zoneNameServers.join("\n")}\n\nThen rerun: void platform install --resume --name ${result.manifest.id}` : `Wait for ${zoneName} to become active, then rerun:\nvoid platform install --resume --name ${result.manifest.id}`, import_picocolors.default.bold("Waiting for nameservers"));
@@ -2,7 +2,8 @@ import { S as writePendingInstallationSecrets, _ as removePlatformConnectionForI
2
2
  import { t as ensurePlatformAccessToken } from "./cf-access-BmBT2h8_.mjs";
3
3
  import { A as confirm, H as outro, K as select, L as log, tt as isCancel } from "./dist-D23AAMxT.mjs";
4
4
  import { f as import_picocolors, l as formatUrl, m as printSuccess, p as note, r as createSpinner } from "./output-BCdLioKP.mjs";
5
- import { $ as hyperdriveOriginMatches, A as dnsRecordConfigHash, B as turnOffInstalledProjectZeroTrust, C as createPlatformHealthProbeToken, D as platformTrafficAttachmentWorker, F as platformAdoptionIntentHash, H as resolvePlatformCloudflareCredential, I as r2BucketConfigHash, J as PlatformCloudflareApiError, L as resourceMarkerProblem, M as hasProvisionIntentStep, N as legacyResourceConfigHash, P as matchesRecordedR2Fingerprint, Q as hyperdriveOriginFromConnectionString, R as revalidatePlatformInstallAction, S as loadPlatformRuntime, T as resolveBootstrapGitHubId, U as verifyPlatformCloudflareCredential, V as assertPlatformOperatorCredentialCanApplyPlan, W as activatePlatformAccessCredentials, X as PlatformRuntimeTokenEmailPermissionError, Y as PlatformCloudflareClient, Z as hyperdriveOriginConfigHash, _ as readPlatformProjectSlugs, a as findPlatformWorkerOutsideChanges, b as formatZeroTrustApplications, c as uploadPlatformWorkerOutsideChanges, d as replacePendingInstallationAuthentication, et as verifyPlatformRuntimeTokenEmailPermissions, f as REMOTE_INSTALLATION_MANIFEST_KEY, j as formatPlatformInstallPlan, k as createPlatformInstallPlan, l as authenticationSetupRequestHash, m as acquirePlatformDatabaseLifecycleLock, n as resolvePlatformInstallDatabaseUrl, o as formatPlatformWorkerOutsideChanges, p as installPlatform, s as reviewPlatformWorkerOutsideChanges, t as assertNoninteractivePlatformMutationAcknowledged, tt as verifyPlatformRuntimeTokenPermissions, u as readLoginReplacementFile, v as readPlatformProjectZeroTrustState, w as createPlatformInstallationSecrets, x as readPlatformDatabase, y as assertProjectZeroTrustAllowsUninstall, z as platformDatabaseNameFromOwnerUrl } from "./platform-lifecycle-BCsFg1Tl.mjs";
5
+ import { i as updateProjectWorkerRuntimeLogs, n as assertPlatformRuntimeLogsSupported, r as shouldUpdateProjectWorkerRuntimeLogs } from "./platform-runtime-logs-CdJGnk3f.mjs";
6
+ import { $ as hyperdriveOriginMatches, A as dnsRecordConfigHash, B as turnOffInstalledProjectZeroTrust, C as createPlatformHealthProbeToken, D as platformTrafficAttachmentWorker, F as platformAdoptionIntentHash, H as resolvePlatformCloudflareCredential, I as r2BucketConfigHash, J as PlatformCloudflareApiError, L as resourceMarkerProblem, M as hasProvisionIntentStep, N as legacyResourceConfigHash, P as matchesRecordedR2Fingerprint, Q as hyperdriveOriginFromConnectionString, R as revalidatePlatformInstallAction, S as loadPlatformRuntime, T as resolveBootstrapGitHubId, U as verifyPlatformCloudflareCredential, V as assertPlatformOperatorCredentialCanApplyPlan, W as activatePlatformAccessCredentials, X as PlatformRuntimeTokenEmailPermissionError, Y as PlatformCloudflareClient, Z as hyperdriveOriginConfigHash, _ as readPlatformProjectSlugs, a as findPlatformWorkerOutsideChanges, b as formatZeroTrustApplications, c as uploadPlatformWorkerOutsideChanges, d as replacePendingInstallationAuthentication, et as verifyPlatformRuntimeTokenEmailPermissions, f as REMOTE_INSTALLATION_MANIFEST_KEY, j as formatPlatformInstallPlan, k as createPlatformInstallPlan, l as authenticationSetupRequestHash, m as acquirePlatformDatabaseLifecycleLock, n as resolvePlatformInstallDatabaseUrl, o as formatPlatformWorkerOutsideChanges, p as installPlatform, s as reviewPlatformWorkerOutsideChanges, t as assertNoninteractivePlatformMutationAcknowledged, tt as verifyPlatformRuntimeTokenPermissions, u as readLoginReplacementFile, v as readPlatformProjectZeroTrustState, w as createPlatformInstallationSecrets, x as readPlatformDatabase, y as assertProjectZeroTrustAllowsUninstall, z as platformDatabaseNameFromOwnerUrl } from "./platform-lifecycle-D9RdGub1.mjs";
6
7
  import { PLATFORM_DISABLED_KEY, PLATFORM_DISABLED_VALUE, PLATFORM_R2_OWNERSHIP_MARKER_KEY, parsePlatformInstallationManifest, recordInstallationResource, recordInstallationStep, setInstallationDesiredState, transitionInstallation } from "@void/platform";
7
8
  import { setTimeout } from "node:timers/promises";
8
9
  // src/cli/platform-teardown.ts
@@ -624,6 +625,7 @@ function platformLifecycleResumeCommand(args, installationId) {
624
625
  if (args.subcommand === "rollback" && args.fromRuntime) command.push("--from-runtime", commandArgument(args.fromRuntime));
625
626
  if ("dashboardUrl" in args && args.dashboardUrl) command.push("--dashboard-url", commandArgument(args.dashboardUrl));
626
627
  if ("customDomains" in args && args.customDomains) command.push("--custom-domains");
628
+ if ("runtimeLogs" in args && args.runtimeLogs) command.push("--runtime-logs", args.runtimeLogs);
627
629
  if (args.yes) command.push("--yes");
628
630
  return command.join(" ");
629
631
  }
@@ -715,6 +717,7 @@ async function runInstalledPlatformCommand(args) {
715
717
  controlPlaneDomain: deployment.controlPlane.apiHostname ?? "",
716
718
  ...args.subcommand !== "rollback" && args.dashboardUrl !== void 0 ? { dashboardUrl: args.dashboardUrl } : {},
717
719
  ...args.subcommand !== "rollback" && args.customDomains ? { customDomains: true } : {},
720
+ ...args.subcommand === "upgrade" && args.runtimeLogs !== void 0 ? { runtimeLogs: args.runtimeLogs } : {},
718
721
  dedicatedZone: deployment.application.dedicatedZone,
719
722
  displayName: deployment.displayName,
720
723
  installationSlug: deployment.installationSlug,
@@ -726,10 +729,12 @@ async function runInstalledPlatformCommand(args) {
726
729
  allowUnverifiedAiGateway: args.plan,
727
730
  includeEmailGateway: runtime.manifest.artifacts.emailGateway !== void 0,
728
731
  enableSandbox: runtime.manifest.safetyProtocols.sandboxDrain >= 3,
729
- deploymentExecution: runtime.manifest.deploymentExecution === 1
732
+ deploymentExecution: runtime.manifest.deploymentExecution === 1,
733
+ allowRuntimeLogsChange: args.subcommand === "upgrade"
730
734
  });
735
+ assertPlatformRuntimeLogsSupported(plan.deployment, runtime.manifest);
731
736
  markPhase("plan");
732
- note(formatPlatformInstallPlan(plan), args.subcommand === "upgrade" ? "Upgrade plan" : args.subcommand === "rollback" ? "Rollback plan" : args.subcommand === "enable" ? "Enable plan" : "Repair plan");
737
+ note(formatPlatformInstallPlan(plan, manifest.deployment), args.subcommand === "upgrade" ? "Upgrade plan" : args.subcommand === "rollback" ? "Rollback plan" : args.subcommand === "enable" ? "Enable plan" : "Repair plan");
733
738
  note([
734
739
  `Version: ${manifest.platformVersion} → ${runtime.manifest.platformVersion}`,
735
740
  `Source: ${runtime.source}`,
@@ -872,6 +877,7 @@ async function runInstalledPlatformCommand(args) {
872
877
  runtime,
873
878
  operation: args.subcommand,
874
879
  replanWorkers: async (recoveryManifest) => (await createPlatformInstallPlan(client, planInput, recoveryManifest, {
880
+ allowRuntimeLogsChange: args.subcommand === "upgrade",
875
881
  authoritativeProvisionIntents: true,
876
882
  repairMissing: true,
877
883
  includeEmailGateway: runtime.manifest.artifacts.emailGateway !== void 0,
@@ -887,6 +893,16 @@ async function runInstalledPlatformCommand(args) {
887
893
  });
888
894
  progress.message("Finalizing platform changes");
889
895
  markPhase("installer complete");
896
+ const runtimeLogsWarning = !result.waitingForDns && !result.waitingForSandboxDrain && shouldUpdateProjectWorkerRuntimeLogs({
897
+ previous: manifest.deployment,
898
+ next: result.manifest.deployment,
899
+ explicit: args.subcommand === "upgrade" && args.runtimeLogs !== void 0
900
+ }) ? await updateProjectWorkerRuntimeLogs(client, {
901
+ accountId: manifest.account.id,
902
+ namespace: result.manifest.deployment.resources.dispatchNamespace,
903
+ minimal: !!result.manifest.deployment.runtimeLogs,
904
+ installationId: manifest.id
905
+ }) : void 0;
890
906
  reportResult = () => {
891
907
  progress?.stop(result.waitingForDns || result.waitingForSandboxDrain ? "Platform operation paused; progress is saved." : `Platform ${args.subcommand} complete.`);
892
908
  progress = void 0;
@@ -916,6 +932,7 @@ async function runInstalledPlatformCommand(args) {
916
932
  log.info(`If sign-in fails, run \`void platform repair ${commandArgument(manifest.id)}\` to change the login settings.`);
917
933
  }
918
934
  }
935
+ if (runtimeLogsWarning) log.warn(runtimeLogsWarning);
919
936
  printSuccess(`${deployment.displayName}: runtime ${runtime.manifest.platformVersion} ${args.subcommand === "rollback" ? "restored" : "ready"}.`);
920
937
  };
921
938
  };
@@ -964,6 +981,7 @@ async function runInstalledPlatformCommand(args) {
964
981
  }
965
982
  function assertPlatformRollbackCompatibility(installation, target, source) {
966
983
  if (target.manifest.emailProtocolVersion !== 1 && (installation.deployment.capabilities.email || installation.resources.some((resource) => resource.key === "email-gateway-worker" && resource.state === "ready"))) throw new Error("platform: The rollback target predates the email gateway and cannot safely replace this installation. Use a runtime with email protocol version 1.");
984
+ if (installation.deployment.runtimeLogs && target.manifest.runtimeLogs !== 1) throw new Error("platform: The rollback target cannot keep runtime logs minimal. Run `void platform upgrade --runtime-logs full` first, then roll back.");
967
985
  if (!installation.runtime) throw new Error("platform: The installed runtime has no artifact provenance, so post-success rollback cannot identify its compatibility manifest.");
968
986
  if (source.manifest.platformVersion !== installation.platformVersion || source.manifestSha256 !== installation.runtime.manifestSha256) throw new Error("platform: --from-runtime does not exactly match the installed runtime artifact digest. Supply the runtime used by the current successful deployment.");
969
987
  if (target.manifestSha256 === source.manifestSha256) throw new Error("platform: The rollback target is already the installed runtime artifact.");
@@ -1 +1 @@
1
- export { c as runInstalledPlatformCommand, l as selectAuthoritativePlatformManifest, d as verifyPlatformInstallationOwnership } from "./platform-management-nzCDwtiN.mjs";
1
+ export { c as runInstalledPlatformCommand, l as selectAuthoritativePlatformManifest, d as verifyPlatformInstallationOwnership } from "./platform-management-BRefdHGD.mjs";
@@ -1,7 +1,7 @@
1
1
  import { o as listInstallationManifests, t as acquirePlatformLifecycleLock, x as writeInstallationManifest, y as savePlatformConnection } from "./platform-registry-DZ_2Xuqd.mjs";
2
2
  import { t as cfAccessHeaders } from "./cf-access-pejlJmuy.mjs";
3
- import { f as REMOTE_INSTALLATION_MANIFEST_KEY, k as createPlatformInstallPlan } from "./platform-lifecycle-BCsFg1Tl.mjs";
4
- import { a as recoverDurablyMarkedProvisionIntents, d as verifyPlatformInstallationOwnership, r as isPlatformManifestMonotonicExtension } from "./platform-management-nzCDwtiN.mjs";
3
+ import { f as REMOTE_INSTALLATION_MANIFEST_KEY, k as createPlatformInstallPlan } from "./platform-lifecycle-D9RdGub1.mjs";
4
+ import { a as recoverDurablyMarkedProvisionIntents, d as verifyPlatformInstallationOwnership, r as isPlatformManifestMonotonicExtension } from "./platform-management-BRefdHGD.mjs";
5
5
  import { parsePlatformInstallationManifest, setInstallationEndpoints } from "@void/platform";
6
6
  // src/cli/platform-recovery.ts
7
7
  async function recoverPlatformInstallations(client, accountId, verifyEndpoint = verifyInstallationEndpoint, selector = "") {