void 0.23.0 → 0.24.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 (126) hide show
  1. package/AGENTS_TEMPLATE.md +1 -1
  2. package/dist/{account-cmd-C84Ee8cO.mjs → account-cmd-vJhh5lrb.mjs} +5 -5
  3. package/dist/{auth-CSkdO2Bb.mjs → auth-CQkSDS50.mjs} +22 -49
  4. package/dist/auth-DX3JURcX.mjs +2 -0
  5. package/dist/{auth-link-CioEg6uY.mjs → auth-link-D75t9wO2.mjs} +5 -5
  6. package/dist/{auth-router-BsR981d4.mjs → auth-router-ClfhL1J7.mjs} +7 -7
  7. package/dist/{build-cmd-LzvNJORH.mjs → build-cmd-zMi1iFnS.mjs} +6 -6
  8. package/dist/{cache-C4MvnrMH.mjs → cache-ZtQmyxVV.mjs} +5 -5
  9. package/dist/{cancel-deploy-abUxpP2n.mjs → cancel-deploy-Box0kkEV.mjs} +5 -5
  10. package/dist/{cf-access-P0iZnu0q.mjs → cf-access-BGe5sWXF.mjs} +4 -48
  11. package/dist/{cf-access-DRsQRe6k.mjs → cf-access-TWNzXltp.mjs} +3 -11
  12. package/dist/cli/cli.mjs +47 -44
  13. package/dist/cli/cloudflare-operation-process.mjs +14 -5
  14. package/dist/cli/env-schema-probe.mjs +3 -3
  15. package/dist/client-B9UBI03V.mjs +2 -0
  16. package/dist/{client-RV8NVeB8.mjs → client-DKAsFA4X.mjs} +33 -15
  17. package/dist/{cloudflare-cmd-BcrVyTmJ.mjs → cloudflare-cmd-CmY8dGkd.mjs} +1 -1
  18. package/dist/{cloudflare-connect-B8uPZ4nx.mjs → cloudflare-connect-IiR3ZieC.mjs} +1 -1
  19. package/dist/{cloudflare-operations-AiWashgg.mjs → cloudflare-operations-BCdXSsmo.mjs} +1 -1
  20. package/dist/{cloudflare-operations-fxHb-byx.mjs → cloudflare-operations-DzH-A966.mjs} +1 -1
  21. package/dist/{connect-Bd4kJd9U.mjs → connect-B-usTnlF.mjs} +9 -9
  22. package/dist/{create-project-bMf6ffLZ.mjs → create-project-CYOOAYcn.mjs} +12 -12
  23. package/dist/{create-project-Boczwj5r.mjs → create-project-FWbf5Olo.mjs} +1 -1
  24. package/dist/{db-8uG64XLl.mjs → db-Ck2eZ2iB.mjs} +15 -15
  25. package/dist/{delete-NvbiyeJf.mjs → delete-sK56qtzZ.mjs} +5 -5
  26. package/dist/{deploy-DzAIwqNU.mjs → deploy-gCVaiJbS.mjs} +86 -44
  27. package/dist/{deploy-bjXdFCtn.mjs → deploy-irP5q0-x.mjs} +1 -1
  28. package/dist/{domain-y5Tvydvo.mjs → domain-DFfQE8jg.mjs} +6 -6
  29. package/dist/{email-B3umsW75.mjs → email-CdnhUHvJ.mjs} +7 -7
  30. package/dist/{env-BS6qYHDb.mjs → env-DmGdHi5i.mjs} +8 -8
  31. package/dist/{env-types-C2_bIk_b.mjs → env-types-D5kds_OZ.mjs} +1 -1
  32. package/dist/{env-validation-BPn7vk-V.mjs → env-validation-C_8tPdhs.mjs} +2 -2
  33. package/dist/{env-validation-DbTg7-ar.mjs → env-validation-zZOCcQVZ.mjs} +1 -1
  34. package/dist/{gen-B580--vC.mjs → gen-CshAkukR.mjs} +2 -2
  35. package/dist/gen-DvQTWzDU.mjs +2 -0
  36. package/dist/{github-cmd-v45BdfKX.mjs → github-cmd-DftuEvIt.mjs} +13 -13
  37. package/dist/{headers-DWi2IXWx.mjs → headers-2rKda9Y6.mjs} +1 -1
  38. package/dist/{help-daGKjXGk.mjs → help-Dotbf6iz.mjs} +8 -4
  39. package/dist/help-mabuIV98.mjs +2 -0
  40. package/dist/{inbound-aVHEUhKo.mjs → inbound-fRkqcXaC.mjs} +1 -1
  41. package/dist/index.mjs +16 -20
  42. package/dist/{init-Bvy7zrBo.mjs → init-BTQEZZGJ.mjs} +25 -22
  43. package/dist/{link-CDqqCjFl.mjs → link-B46sYH0K.mjs} +6 -6
  44. package/dist/{list-CZj0dzKY.mjs → list-BnPrIsU_.mjs} +6 -6
  45. package/dist/log-vqY3pqwI.mjs +29 -0
  46. package/dist/{login-UZKFM_u7.mjs → login-BuiMyUrx.mjs} +8 -8
  47. package/dist/login-DIy9Sb-U.mjs +2 -0
  48. package/dist/{logs-CUZ6t9t3.mjs → logs-CZG9d-ic.mjs} +10 -11
  49. package/dist/migrate-BCiJ8w0f.mjs +2 -0
  50. package/dist/{migrate-DHul7PRV.mjs → migrate-q4_njtaW.mjs} +2 -2
  51. package/dist/{operator-args-CLgKGlwU.mjs → operator-args-B3BTmSoi.mjs} +12 -5
  52. package/dist/{operator-auth-8KnOVXVd.mjs → operator-auth-7erYc6Lt.mjs} +2 -2
  53. package/dist/{operator-client-DUwumHpQ.mjs → operator-client-CpHjTd0t.mjs} +3 -3
  54. package/dist/{operator-cmd-DBA6dl0m.mjs → operator-cmd-DGqPJUD3.mjs} +6 -6
  55. package/dist/{output-Dm_A4Tbv.mjs → output-CbM85T4k.mjs} +18 -10
  56. package/dist/pages/index.mjs +1 -1
  57. package/dist/{platform-args-BJdRtlLq.mjs → platform-args-3k8X9-H_.mjs} +11 -3
  58. package/dist/platform-args-DdnM6WIf.mjs +2 -0
  59. package/dist/{platform-auth-config-B56E9YP1.mjs → platform-auth-config-DDrxUy4m.mjs} +6 -6
  60. package/dist/{platform-auth-protection-BDWO_aER.mjs → platform-auth-protection-BLadnnct.mjs} +8 -8
  61. package/dist/{platform-auth-recovery-1gg4CSRe.mjs → platform-auth-recovery-CmCzX2Fl.mjs} +6 -6
  62. package/dist/{platform-cmd-DMcQStSc.mjs → platform-cmd-DMDEc9uS.mjs} +10 -10
  63. package/dist/{platform-cmd-Bt-1w6pY.mjs → platform-cmd-pMTRhvYs.mjs} +1 -1
  64. package/dist/{platform-domain-BNkcz0OB.mjs → platform-domain-Di6EYrQl.mjs} +5 -5
  65. package/dist/{platform-lifecycle-9OyBALhH.mjs → platform-lifecycle-BBoNzojY.mjs} +1264 -407
  66. package/dist/{platform-lifecycle-BE6C_jxh.mjs → platform-lifecycle-BFdSi9Qt.mjs} +1 -1
  67. package/dist/{platform-management-CjwLVQwN.mjs → platform-management-CWOQOWXm.mjs} +5 -5
  68. package/dist/{platform-management-CnyTdcWX.mjs → platform-management-DG47jys8.mjs} +1 -1
  69. package/dist/{platform-plans-config-BNGKGr4P.mjs → platform-plans-config-Vl9BP3H4.mjs} +3 -3
  70. package/dist/{platform-recovery-D6KSpuFm.mjs → platform-recovery-BJnQJEtQ.mjs} +4 -4
  71. package/dist/{platform-registry-QBa4DK32.mjs → platform-registry-DkPPXfp_.mjs} +2 -2
  72. package/dist/{prepare-B5Mkic5u.mjs → prepare-CBLT3CHH.mjs} +3 -3
  73. package/dist/prepare-CnjcTV2s.mjs +2 -0
  74. package/dist/{prepare-DOsL0CC9.mjs → prepare-DnaKBi--.mjs} +1 -1
  75. package/dist/{project-C0Fqu05O.mjs → project-DKG5Ra8p.mjs} +15 -82
  76. package/dist/project-DsblYifa.mjs +2 -0
  77. package/dist/{project-cmd-CNzrqvBv.mjs → project-cmd-DxnXstAq.mjs} +19 -19
  78. package/dist/{project-team-DQOWPfQT.mjs → project-team-BmHcaALJ.mjs} +5 -5
  79. package/dist/{project-token-CTDYU0Cc.mjs → project-token-GionZlBI.mjs} +5 -5
  80. package/dist/{project-zero-trust-BNAkW-_0.mjs → project-zero-trust-JLCjVQA7.mjs} +5 -5
  81. package/dist/prompts-2TGE6oXx.mjs +2 -0
  82. package/dist/prompts-BNUoTiaf.mjs +2044 -0
  83. package/dist/{provision-C4ORE7G7.mjs → provision-CVku1JFU.mjs} +1 -1
  84. package/dist/{provision-CJFgTZY8.mjs → provision-CaoxO_U7.mjs} +1 -1
  85. package/dist/{requests-MhxYnau8.mjs → requests-BOjIVAeF.mjs} +5 -5
  86. package/dist/{rollback-CJ6iSDoU.mjs → rollback-CwR3pLj3.mjs} +6 -6
  87. package/dist/runtime/ai.mjs +3 -5
  88. package/dist/runtime/email/testing.mjs +1 -1
  89. package/dist/runtime/email.mjs +1 -1
  90. package/dist/runtime/remote/index.mjs +2 -2
  91. package/dist/{secret-Dli5fP0B.mjs → secret-ByWJWBUG.mjs} +7 -7
  92. package/dist/{skills-D1II1Juz.mjs → skills-C1PlclPt.mjs} +1 -1
  93. package/dist/{subcommand-prompt-CY1C4fvl.mjs → subcommand-prompt-klFCfcor.mjs} +40 -32
  94. package/package.json +8 -9
  95. package/skills/void/SKILL.md +6 -1
  96. package/skills/void/docs/guide/deployment.md +22 -0
  97. package/skills/void/docs/guide/edge/headers.md +1 -1
  98. package/skills/void/docs/guide/email/domains.md +5 -1
  99. package/skills/void/docs/guide/email/sending.md +1 -1
  100. package/skills/void/docs/guide/platform/administration/zero-trust.md +27 -9
  101. package/skills/void/docs/guide/platform/installation/ci.md +1 -1
  102. package/skills/void/docs/guide/platform/installation/credentials.md +10 -3
  103. package/skills/void/docs/guide/platform/installation/domains.md +8 -3
  104. package/skills/void/docs/guide/platform/installation/first-deployment.md +2 -2
  105. package/skills/void/docs/guide/platform/installation/maintenance.md +12 -0
  106. package/skills/void/docs/guide/platform/installation/prerequisites.md +8 -7
  107. package/skills/void/docs/guide/platform/installation/setup.md +80 -10
  108. package/skills/void/docs/guide/remote-dev.md +1 -1
  109. package/skills/void/docs/reference/cli/auth.md +4 -3
  110. package/skills/void/docs/reference/cli/database.md +1 -1
  111. package/skills/void/docs/reference/cli/deploy.md +20 -0
  112. package/skills/void/docs/reference/cli/platform-installation.md +42 -27
  113. package/skills/void/docs/reference/cli/platform-zero-trust.md +14 -0
  114. package/skills/void/docs/reference/config.md +1 -1
  115. package/dist/auth-CCjt0hcq.mjs +0 -2
  116. package/dist/client-Cu7jWiF1.mjs +0 -2
  117. package/dist/dist-BuDuKZJv.mjs +0 -2
  118. package/dist/dist-CTBk70IR.mjs +0 -1310
  119. package/dist/gen-BVaUUumi.mjs +0 -2
  120. package/dist/help-DofyZuY7.mjs +0 -2
  121. package/dist/log-ChfPKsVd.mjs +0 -26
  122. package/dist/login-DYt_An22.mjs +0 -2
  123. package/dist/migrate-8_2u55MD.mjs +0 -2
  124. package/dist/platform-args-D3RXyR6h.mjs +0 -2
  125. package/dist/prepare-cgvDMtSb.mjs +0 -2
  126. package/dist/project-BuUwfj6f.mjs +0 -2
@@ -10,22 +10,22 @@ import { t as collectMigrations } from "./collect-DiTn9yr6.mjs";
10
10
  import { o as validateSsrEntry } from "./entry-CF5wvH4w.mjs";
11
11
  import { r as hasEmailHandlers } from "./email--tEtMoj_.mjs";
12
12
  import { a as hasSandboxSqliteMigration, c as resolveSandboxConfig, i as assertSandboxNamespaceConfig, l as sandboxContainerConfig, r as SANDBOX_MIGRATION_TAG, s as requiresSandboxPlatformImage } from "./config-C_XRIPx2.mjs";
13
- import { i as trustedCloudflareWorkerAccessHeaders, r as scopedAccessCredentials, t as cfAccessHeaders } from "./cf-access-DRsQRe6k.mjs";
14
- import { a as getApiUrl, c as getToken, l as getTokenSource, o as getProxyUrl, u as isStagingMode } from "./auth-CSkdO2Bb.mjs";
15
- import { r as ensurePlatformProxyAccess, t as ensureCloudflaredToken } from "./cf-access-P0iZnu0q.mjs";
16
- import { d as writeProjectConfig, i as readDeploymentPlatform, l as writeDeploymentPlatform, o as readProjectConfig, t as attachSelectedPlatform } from "./project-C0Fqu05O.mjs";
13
+ import { n as scopedAccessCredentials, r as trustedCloudflareWorkerAccessHeaders, t as cfAccessHeaders } from "./cf-access-TWNzXltp.mjs";
14
+ import { r as ensurePlatformProxyAccess, t as ensureCloudflaredToken } from "./cf-access-BGe5sWXF.mjs";
15
+ import { l as writeProjectConfig, n as readDeploymentPlatform, o as shouldLinkDeployProject, r as readProjectConfig, s as writeDeploymentPlatform, t as attachSelectedPlatform } from "./project-DKG5Ra8p.mjs";
16
+ import { a as getApiUrl, c as getToken, l as getTokenSource, o as getProxyUrl } from "./auth-CQkSDS50.mjs";
17
17
  import { i as persistCloudflareConfig, r as materializeCloudflareConfig, s as stashCloudflareDeployPointer } from "./cloudflare-config-Bktvwtpf.mjs";
18
18
  import { A as writeProvisionedWranglerConfig, C as readWranglerPublishedTrafficSnapshot, D as syncWranglerDurableObjects, E as syncWranglerBindings, O as syncWranglerWebSockets, S as readWranglerManagedQueueCleanupCandidates, T as resolveLiveBindingConfig, _ as readExistingLiveBindingConfig, a as LIVE_MIGRATION_TAG, c as bindingEntriesForField, g as normalizeWranglerCompatibilityFlags, h as nextDurableObjectMigrationTag, j as writeWranglerPublishedTrafficSnapshot, l as bindingNamesForField, m as hasDurableObjectSqliteMigration, o as acknowledgeWranglerManagedQueueRemovals, p as findBindingNameOwner, r as FRIENDLY_BINDING_NAMES, u as ensureWranglerCompat } from "./wrangler-7K-bW_DL.mjs";
19
- import { i as voidWarn, r as voidLog } from "./log-ChfPKsVd.mjs";
20
- import { n as lintDuplicateSources, r as mergeRoutingRules, t as lintDestinationSplats } from "./headers-DWi2IXWx.mjs";
19
+ import { i as voidWarn, r as voidLog } from "./log-vqY3pqwI.mjs";
20
+ import { n as lintDuplicateSources, r as mergeRoutingRules, t as lintDestinationSplats } from "./headers-2rKda9Y6.mjs";
21
21
  import { n as buildMigrationPlanBundle } from "./plan-NPpwZ_kc.mjs";
22
22
  import { r as scanWranglerDotenvKeys } from "./dotenv-VQxupEUv.mjs";
23
23
  import { t as discoverSchema } from "./discover-BcPPiF1o.mjs";
24
24
  import { t as MagicString } from "./dist-AoCzRTJE.mjs";
25
- import { t as findEnvFile } from "./env-types-C2_bIk_b.mjs";
26
- import { d as formatEnvReport, f as listSelfHostSecretNames, g as validateProdEnv, h as selfHostSchemaFailureMessage, i as SelfHostSecretListError, l as dischargeSelfHostEnvContext, n as SelfHostFirstDeployError, p as readEmittedWorkerVars, r as SelfHostSchemaError, s as deriveSelfHostEnvContextFromVars, t as SelfHostEnvValidationError, u as fetchRemoteSecretNames, v as readGeneratedWranglerConfigFile } from "./env-validation-BPn7vk-V.mjs";
25
+ import { t as findEnvFile } from "./env-types-D5kds_OZ.mjs";
26
+ import { d as formatEnvReport, f as listSelfHostSecretNames, g as validateProdEnv, h as selfHostSchemaFailureMessage, i as SelfHostSecretListError, l as dischargeSelfHostEnvContext, n as SelfHostFirstDeployError, p as readEmittedWorkerVars, r as SelfHostSchemaError, s as deriveSelfHostEnvContextFromVars, t as SelfHostEnvValidationError, u as fetchRemoteSecretNames, v as readGeneratedWranglerConfigFile } from "./env-validation-C_8tPdhs.mjs";
27
27
  import { n as CLOUDFLARE_DEPLOY_BUILD_ENV, o as resolveRemoteMode, s as stripInternalEnvKeys } from "./env-_v349JBd.mjs";
28
- import { E as confirm, I as select, N as note, O as intro, P as outro, W as isCancel, j as log$1 } from "./dist-CTBk70IR.mjs";
28
+ import { A as confirm, B as note, H as outro, K as select, L as log$1, N as intro, tt as isCancel } from "./prompts-BNUoTiaf.mjs";
29
29
  import { n as completeApplicationAnalysis, t as analyzeApplication } from "./application-routing-B7QEjqSR.mjs";
30
30
  import { t as writeDrizzleConfig } from "./config-D8MOgiQV.mjs";
31
31
  import { i as runMySqlMigrations } from "./runner-mysql-DmWchSWJ.mjs";
@@ -35,18 +35,18 @@ import { i as validateMigrations, t as assertJournalCoherence } from "./validate
35
35
  import { t as renderPrerenderPaths } from "./prerender-render-D9qbLs2f.mjs";
36
36
  import { i as migrateBuiltWranglerConfig, n as prepareCfFrameworkBuildOutput, r as prepareCfStaticBuildOutput, t as prepareCfBuildOutput } from "./cf-build-output-BPqOT964.mjs";
37
37
  import { n as getPackageDir } from "./agents-B_pX_HmQ.mjs";
38
- import { i as isExpiredTokenError, n as PlatformClient, o as parsePlatformErrorBody, r as isCliOutdatedError, s as platformErrorMessage, t as PlatformApiError } from "./client-RV8NVeB8.mjs";
38
+ import { i as isExpiredTokenError, n as PlatformClient, o as parsePlatformErrorBody, r as isCliOutdatedError, s as platformErrorMessage, t as PlatformApiError } from "./client-DKAsFA4X.mjs";
39
39
  import { a as detectPreset, c as resolveCloudflareOperationArgv, i as FRAMEWORK_PRESETS, l as resolveProjectCommand, o as formatProjectCommand, s as hasBackendFiles, t as createCloudflareProcessRunner } from "./cloudflare-process-B-wekeR6.mjs";
40
40
  import { a as parseCloudflareAuthSession, i as ensureCloudflareAuthentication, n as cloudflareCredentialOverrides, t as CloudflareAuthenticationError } from "./cloudflare-auth-Qdc7tw8F.mjs";
41
41
  import { n as writeVoidProjectConfig } from "./config-write-B1f88wJA.mjs";
42
- import { r as discoverFrameworkWranglerFiles, t as migrateLegacyVoidConfig } from "./migrate-DHul7PRV.mjs";
43
- import { a as createCloudflareEmptyDomainPublisher, i as createCloudflareEmptyCronPublisher } from "./cloudflare-operations-fxHb-byx.mjs";
42
+ import { r as discoverFrameworkWranglerFiles, t as migrateLegacyVoidConfig } from "./migrate-q4_njtaW.mjs";
43
+ import { a as createCloudflareEmptyDomainPublisher, i as createCloudflareEmptyCronPublisher } from "./cloudflare-operations-DzH-A966.mjs";
44
44
  import { t as formatCloudflareUserMessage } from "./cloudflare-user-output-Q-k0QoNQ.mjs";
45
- import { c as import_picocolors$1, i as createSpinner, r as cliTitle } from "./output-Dm_A4Tbv.mjs";
46
- import { a as promptProjectSelection, i as reportProjectCreationWarnings, o as promptProjectSetupAction, r as promptAndCreateProject } from "./create-project-bMf6ffLZ.mjs";
45
+ import { c as import_picocolors$1, i as createSpinner, r as cliTitle } from "./output-CbM85T4k.mjs";
46
+ import { a as promptProjectSelection, i as reportProjectCreationWarnings, o as promptProjectSetupAction, r as promptAndCreateProject } from "./create-project-CYOOAYcn.mjs";
47
47
  import { t as getRequestedProjectSlug } from "./resolve-project-BG5ORGID.mjs";
48
48
  import { t as collectGitDeployMetadata } from "./git-metadata-D-gurjzG.mjs";
49
- import { t as promptForLoginToken } from "./login-UZKFM_u7.mjs";
49
+ import { t as promptForLoginToken } from "./login-BuiMyUrx.mjs";
50
50
  import { createRequire } from "node:module";
51
51
  import { copyFileSync, cpSync, createWriteStream, existsSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, readlinkSync, realpathSync, renameSync, rmSync, statSync, unlinkSync, writeFileSync } from "node:fs";
52
52
  import { fileURLToPath } from "node:url";
@@ -112,6 +112,7 @@ function resolveAssetRoutingPolicy(inputs) {
112
112
  }
113
113
  //#endregion
114
114
  //#region src/cli/email-cloudflare.ts
115
+ var import_picocolors = /* @__PURE__ */ __toESM(require_picocolors(), 1);
115
116
  /** The `send_email` binding name Void provisions and the runtime reads. */
116
117
  const SEND_EMAIL_BINDING = "SEND_EMAIL";
117
118
  /** The root-config `vars` key carrying `void.config.ts` `email.from` into the worker. */
@@ -1538,8 +1539,8 @@ function buildPrerenderBindings(input) {
1538
1539
  if (input.voidToken && input.voidProjectId) {
1539
1540
  voidBindings.__VOID_TOKEN = input.voidToken;
1540
1541
  voidBindings.__VOID_PROJECT_ID = input.voidProjectId;
1541
- if (input.voidStaging) voidBindings.__VOID_STAGING = "1";
1542
- voidBindings.__VOID_PROXY_URL = input.voidProxyUrl ?? (input.voidStaging ? "https://proxy.staging.void.cloud" : "https://proxy.void.cloud");
1542
+ if (!input.voidProxyUrl) throw new Error("prerender: No connected platform proxy is available. Run `void connect <url>` first.");
1543
+ voidBindings.__VOID_PROXY_URL = input.voidProxyUrl;
1543
1544
  const access = scopedAccessCredentials(input.accessEnv ?? {}, voidBindings.__VOID_PROXY_URL);
1544
1545
  if (access) voidBindings.__VOID_ACCESS_CREDENTIALS = access;
1545
1546
  if (input.remoteMode) voidBindings.__VOID_REMOTE = "1";
@@ -1567,7 +1568,6 @@ async function createCloudflarePrerenderRunner(options) {
1567
1568
  } catch {}
1568
1569
  }
1569
1570
  const voidToken = voidProjectId ? options.voidToken ?? getToken(root) : null;
1570
- const voidStaging = isStagingMode(root);
1571
1571
  const voidProxyUrl = voidToken && voidProjectId ? getProxyUrl(root) : void 0;
1572
1572
  if (voidProxyUrl) ensurePlatformProxyAccess(getApiUrl(root), voidProxyUrl);
1573
1573
  const bindings = buildPrerenderBindings({
@@ -1577,7 +1577,6 @@ async function createCloudflarePrerenderRunner(options) {
1577
1577
  voidToken,
1578
1578
  voidProjectId,
1579
1579
  voidProxyUrl,
1580
- voidStaging,
1581
1580
  remoteMode
1582
1581
  });
1583
1582
  const { Miniflare, convertV4MiniflareOptions } = await import("miniflare");
@@ -1669,7 +1668,7 @@ async function prerenderPages(options) {
1669
1668
  paths,
1670
1669
  ...await renderPrerenderPaths(paths, options.clientDir, (path) => runner.fetchPath(path), (path) => runner.fetchPageData(path), (path, outputFile, error) => {
1671
1670
  if (error !== void 0) voidWarn(`prerender ${path} failed: ${error}`);
1672
- else voidLog(`prerender \x1b[36m${outputFile}\x1b[39m`);
1671
+ else voidLog(`prerender ${import_picocolors.default.blue(outputFile)}`);
1673
1672
  })
1674
1673
  };
1675
1674
  } finally {
@@ -1775,7 +1774,7 @@ async function prerenderPagesNode(options) {
1775
1774
  ssrDir: options.ssrDir,
1776
1775
  clientDir: options.clientDir
1777
1776
  });
1778
- for (const path of result.rendered) voidLog(`prerender \x1b[36m${outputFileForPath(path)}\x1b[39m`);
1777
+ for (const path of result.rendered) voidLog(`prerender ${import_picocolors.default.blue(outputFileForPath(path))}`);
1779
1778
  for (const { path, error } of result.failed) voidWarn(`prerender ${path} failed: ${error}`);
1780
1779
  return result;
1781
1780
  }
@@ -2894,14 +2893,25 @@ function createCfVersionRunner(options) {
2894
2893
  };
2895
2894
  }
2896
2895
  if (operation.type === "versions.view") {
2897
- const result = await run([
2896
+ const args = [
2898
2897
  "workers",
2899
2898
  "versions",
2900
2899
  "get",
2901
2900
  operation.versionId,
2902
2901
  "--worker-id",
2903
- workerName
2904
- ], true);
2902
+ workerName,
2903
+ ...operation.includeSource ? ["--include", "modules"] : []
2904
+ ];
2905
+ const called = operation.includeSource ? await runCf(args, {
2906
+ cwd: output.directory,
2907
+ capture: true,
2908
+ timeoutMs: 3e4,
2909
+ maxOutputBytes: 1048576
2910
+ }) : await run(args, true);
2911
+ const result = {
2912
+ ...called,
2913
+ data: called.data ?? parseJson(called.stdout)
2914
+ };
2905
2915
  if (result.status !== 0 || result.signal || result.error) return result;
2906
2916
  const version = result.data;
2907
2917
  if (!record(version) || version.id !== operation.versionId || !Array.isArray(version.bindings)) return failed("The Cloudflare Worker version was not readable.");
@@ -3916,9 +3926,6 @@ function openDeployLog(opts) {
3916
3926
  }
3917
3927
  };
3918
3928
  }
3919
- //#endregion
3920
- //#region src/cli/log-summary.ts
3921
- var import_picocolors = /* @__PURE__ */ __toESM(require_picocolors(), 1);
3922
3929
  const FIELD_VALUE_MAX = 80;
3923
3930
  const LINE_MAX = 160;
3924
3931
  const MSG_COLUMN_MAX = 28;
@@ -5209,7 +5216,7 @@ let loadedProvisionModule;
5209
5216
  * so a managed deploy never imports it — and thus never loads `proper-lockfile`.
5210
5217
  */
5211
5218
  async function loadProvisionModule() {
5212
- loadedProvisionModule ??= await import("./provision-C4ORE7G7.mjs");
5219
+ loadedProvisionModule ??= await import("./provision-CVku1JFU.mjs");
5213
5220
  return loadedProvisionModule;
5214
5221
  }
5215
5222
  /**
@@ -7251,7 +7258,8 @@ async function runCloudflareEmailStep(input) {
7251
7258
  };
7252
7259
  const from = input.voidConfig.email?.from;
7253
7260
  if (!from) {
7254
- log.warn(["deploy: this app uses email, but void.config.ts names no sender.", "Set email.from to \"you@mail.acme.com\" in void.config.ts — deploying without email."].join("\n"));
7261
+ if (Array.isArray(input.rootConfig.send_email) && input.rootConfig.send_email.some((binding) => binding?.name === "SEND_EMAIL") || Array.isArray(input.rootConfig.addresses) && input.rootConfig.addresses.length > 0) log.info("deploy: email.from is unset; skipping automatic email setup. Existing Cloudflare email configuration is preserved.");
7262
+ else log.warn(["deploy: this app uses email, but void.config.ts names no sender.", "Set email.from to \"you@mail.acme.com\" in void.config.ts — automatic email setup skipped."].join("\n"));
7255
7263
  return without;
7256
7264
  }
7257
7265
  const { rootConfig } = input;
@@ -8885,11 +8893,16 @@ async function runDeployInner(root, options, cliLog) {
8885
8893
  }
8886
8894
  }
8887
8895
  async function runManagedDeploy(root, options, cliLog) {
8896
+ const apiUrl = getApiUrl(root);
8897
+ const requestedProjectSlug = getRequestedProjectSlug(options);
8888
8898
  let reauthenticated = false;
8889
8899
  while (true) try {
8900
+ const savedProject = readProjectConfig(root);
8901
+ const linkedProject = savedProject?.platformUrl === apiUrl ? savedProject : null;
8902
+ if (savedProject && !linkedProject && !requestedProjectSlug) throw new Error(`deploy: This project is linked to ${savedProject.platformUrl}. Pass --project <slug> to deploy to ${apiUrl} without changing the saved link.`);
8890
8903
  let token = process.env.VOID_TOKEN ? getToken(root) : null;
8891
8904
  if (!token && isGithubActionsOidcAvailable()) {
8892
- const slug = getRequestedProjectSlug(options) ?? readProjectConfig(root)?.slug;
8905
+ const slug = requestedProjectSlug ?? linkedProject?.slug;
8893
8906
  if (!slug) throw new Error("deploy: running in GitHub Actions but the project is unknown — pass --project <slug> or link the project.");
8894
8907
  cliLog.info("github_oidc_exchange_start", { slug });
8895
8908
  const tokenOrigin = getApiUrl(root);
@@ -8908,8 +8921,6 @@ async function runManagedDeploy(root, options, cliLog) {
8908
8921
  root,
8909
8922
  cliLog
8910
8923
  });
8911
- const requestedProjectSlug = getRequestedProjectSlug(options);
8912
- const linkedProject = readProjectConfig(root);
8913
8924
  let config = null;
8914
8925
  if (requestedProjectSlug) {
8915
8926
  const linked = linkedProject?.slug === requestedProjectSlug ? await client.getProject(linkedProject.projectId) : null;
@@ -9007,24 +9018,31 @@ function assertProjectDeployAccess(project) {
9007
9018
  }
9008
9019
  async function promptDeployProjectConfig(root, client, cliLog) {
9009
9020
  const projects = await client.listProjectChoices();
9021
+ const link = shouldLinkDeployProject(root, client.apiUrl);
9010
9022
  const deployableProjects = projects.filter((project) => project.role !== "reader");
9011
9023
  if (deployableProjects.length !== projects.length) log.warn("Projects with reader access are hidden from deploy selection. Ask a project admin or owner to grant collaborator access to deploy to them.");
9012
- if (await promptProjectSetupAction("Set up a Void project for deploy:", { includeLink: deployableProjects.length > 0 }) === "create") return promptAndCreateProject(root, client);
9024
+ if (await promptProjectSetupAction("Set up a Void project for deploy:", {
9025
+ includeLink: deployableProjects.length > 0,
9026
+ ...link ? {} : { link: false }
9027
+ }) === "create") return promptAndCreateProject(root, client, { link });
9013
9028
  const result = await promptProjectSelection(deployableProjects, "Select a project to deploy to:", root, {
9014
9029
  confirmExisting: true,
9015
- includeCreate: false
9030
+ includeCreate: false,
9031
+ ...link ? {} : { link: false }
9016
9032
  });
9017
9033
  if (result.action === "create") throw new Error("Unexpected project selection result.");
9018
9034
  const config = {
9019
9035
  projectId: result.project.id,
9020
9036
  slug: result.project.slug
9021
9037
  };
9022
- writeProjectConfig(root, attachSelectedPlatform(root, config, client.apiUrl));
9023
- log.step(`Linked to ${import_picocolors$1.default.blue(config.slug)}`);
9024
- cliLog?.info("project_linked", {
9025
- projectId: config.projectId,
9026
- slug: config.slug
9027
- });
9038
+ if (shouldLinkDeployProject(root, client.apiUrl)) {
9039
+ writeProjectConfig(root, attachSelectedPlatform(root, config, client.apiUrl));
9040
+ log.step(`Linked to ${import_picocolors$1.default.blue(config.slug)}`);
9041
+ cliLog?.info("project_linked", {
9042
+ projectId: config.projectId,
9043
+ slug: config.slug
9044
+ });
9045
+ } else log.step(`Using ${import_picocolors$1.default.blue(config.slug)} for this deployment. Saved destination unchanged.`);
9028
9046
  return config;
9029
9047
  }
9030
9048
  function resolveStaticBuildCommand(preset, buildOverride, hasExplicitDir = false) {
@@ -9133,7 +9151,9 @@ function applyDeployEvent(event, s) {
9133
9151
  kind: "start",
9134
9152
  deploymentId: event.deploymentId
9135
9153
  };
9136
- case "heartbeat": return { kind: "continue" };
9154
+ case "heartbeat":
9155
+ if (event.status === "recovering") s.message("Recovering interrupted deployment...");
9156
+ return { kind: "continue" };
9137
9157
  case "asset_upload":
9138
9158
  if (event.new > 0) s.message(`Uploading assets (${event.new} new, ${event.cached} cached)`);
9139
9159
  else s.message(`Uploading assets (${event.total} cached)`);
@@ -9186,6 +9206,8 @@ function applyDeployEvent(event, s) {
9186
9206
  async function streamDeployEvents(projectId, events, s, cliLog) {
9187
9207
  const startedAt = Date.now();
9188
9208
  let deploymentId = null;
9209
+ let lastProgressAt = startedAt;
9210
+ let waitNotice;
9189
9211
  let interrupted = false;
9190
9212
  cliLog?.info("stream_start", { projectId });
9191
9213
  const onSigint = () => {
@@ -9200,6 +9222,26 @@ async function streamDeployEvents(projectId, events, s, cliLog) {
9200
9222
  process.once("SIGINT", onSigint);
9201
9223
  try {
9202
9224
  for await (const event of events) {
9225
+ if (event.event === "heartbeat") {
9226
+ const fields = {
9227
+ deploymentId,
9228
+ step: event.step,
9229
+ status: event.status,
9230
+ recoveryAt: event.recoveryAt
9231
+ };
9232
+ if (event.status === "recovering" && waitNotice !== "recovering") {
9233
+ log.info(`Deployment ${deploymentId ?? event.deploymentId ?? ""} is recovering; waiting for its result.`);
9234
+ cliLog?.info("deploy_recovering", fields);
9235
+ waitNotice = "recovering";
9236
+ } else if (Date.now() - lastProgressAt >= 9e4 && waitNotice === void 0) {
9237
+ log.warn(`Deployment ${deploymentId ?? event.deploymentId ?? ""} has not reported new progress for 90 seconds (last reported progress: ${event.step.replaceAll("_", " ")}).` + (event.recoveryAt ? ` Automatic recovery can start after ${event.recoveryAt} if execution was interrupted.` : "") + " Inspect with `void project status`.");
9238
+ cliLog?.warn("deploy_progress_stalled", fields);
9239
+ waitNotice = "stalled";
9240
+ }
9241
+ } else {
9242
+ lastProgressAt = Date.now();
9243
+ waitNotice = void 0;
9244
+ }
9203
9245
  const result = applyDeployEvent(event, s);
9204
9246
  if (result.kind === "start") {
9205
9247
  deploymentId = result.deploymentId;
@@ -9556,7 +9598,7 @@ async function runFrameworkDeploy(root, config, client, detected, fwPreset, void
9556
9598
  } catch {}
9557
9599
  if (resources) {
9558
9600
  if (!resources.some((resource) => resource.type === "hyperdrive")) {
9559
- const { text: promptText, isCancel: isCancelPrompt } = await import("./dist-BuDuKZJv.mjs");
9601
+ const { text: promptText, isCancel: isCancelPrompt } = await import("./prompts-2TGE6oXx.mjs");
9560
9602
  const connectionString = await promptText({
9561
9603
  message: `Your project uses ${dialect === "mysql" ? "MySQL" : "PostgreSQL"}. Enter your connection string:`,
9562
9604
  placeholder: dialect === "mysql" ? "mysql://user:pass@host:3306/dbname" : "postgresql://user:pass@host:5432/dbname",
@@ -9796,7 +9838,7 @@ async function runFullDeploy(root, config, client, voidConfig, fwPreset, skipBui
9796
9838
  } catch {}
9797
9839
  if (resources) {
9798
9840
  if (!resources.some((resource) => resource.type === "hyperdrive")) {
9799
- const { text: promptText, isCancel: isCancelPrompt } = await import("./dist-BuDuKZJv.mjs");
9841
+ const { text: promptText, isCancel: isCancelPrompt } = await import("./prompts-2TGE6oXx.mjs");
9800
9842
  const connectionString = await promptText({
9801
9843
  message: `Your project uses ${dialect === "mysql" ? "MySQL" : "PostgreSQL"}. Enter your connection string:`,
9802
9844
  placeholder: dialect === "mysql" ? "mysql://user:pass@host:3306/dbname" : "postgresql://user:pass@host:5432/dbname",
@@ -10006,7 +10048,7 @@ async function createProjectFromSlug(root, client, slug, cliLog) {
10006
10048
  projectId: project.id,
10007
10049
  slug: project.slug
10008
10050
  };
10009
- writeProjectConfig(root, attachSelectedPlatform(root, config, client.apiUrl));
10051
+ if (shouldLinkDeployProject(root, client.apiUrl)) writeProjectConfig(root, attachSelectedPlatform(root, config, client.apiUrl));
10010
10052
  log.success(`Project created: ${import_picocolors$1.default.blue(config.slug)}`);
10011
10053
  reportProjectCreationWarnings(project);
10012
10054
  cliLog?.info("project_create_success", {
@@ -1,2 +1,2 @@
1
- import { A as parseRootWranglerConfig, J as runDeploy, f as checkWranglerMigrationApplySet } from "./deploy-DzAIwqNU.mjs";
1
+ import { A as parseRootWranglerConfig, J as runDeploy, f as checkWranglerMigrationApplySet } from "./deploy-gCVaiJbS.mjs";
2
2
  export { checkWranglerMigrationApplySet, parseRootWranglerConfig, runDeploy };
@@ -1,8 +1,8 @@
1
- import { c as getToken } from "./auth-CSkdO2Bb.mjs";
2
- import { i as readDeploymentPlatform, o as readProjectConfig } from "./project-C0Fqu05O.mjs";
3
- import { N as note, j as log } from "./dist-CTBk70IR.mjs";
4
- import { n as PlatformClient } from "./client-RV8NVeB8.mjs";
5
- import { c as import_picocolors } from "./output-Dm_A4Tbv.mjs";
1
+ import { n as readDeploymentPlatform, r as readProjectConfig } from "./project-DKG5Ra8p.mjs";
2
+ import { c as getToken } from "./auth-CQkSDS50.mjs";
3
+ import { B as note, L as log } from "./prompts-BNUoTiaf.mjs";
4
+ import { n as PlatformClient } from "./client-DKAsFA4X.mjs";
5
+ import { c as import_picocolors } from "./output-CbM85T4k.mjs";
6
6
  //#region src/cli/domain.ts
7
7
  async function runDomainCommand(root, args) {
8
8
  const platform = readDeploymentPlatform(root);
@@ -40,7 +40,7 @@ async function runDomainCommand(root, args) {
40
40
  }
41
41
  async function runCloudflareDomainCommand(root, args) {
42
42
  if (args.projectSlug) throw new Error("domain: --project selects a Void platform project and is not used for direct Cloudflare apps.");
43
- const { changeCloudflareDomain, listCloudflareDomains } = await import("./cloudflare-operations-AiWashgg.mjs");
43
+ const { changeCloudflareDomain, listCloudflareDomains } = await import("./cloudflare-operations-BCdXSsmo.mjs");
44
44
  if (args.subcommand === "add") {
45
45
  const result = await changeCloudflareDomain(root, args.hostname, "add");
46
46
  log.success(result.modified ? `Domain ${args.hostname} added and activated on Cloudflare.` : `Domain ${args.hostname} is already configured.`);
@@ -2,13 +2,13 @@ import { a as join } from "./dist-BVqXeR_h.mjs";
2
2
  import { n as readProjectPaths } from "./project-paths-GgcMozYz.mjs";
3
3
  import { m as readConfig } from "./config-Br_JZD6u.mjs";
4
4
  import { a as scanEmailHandlersSync } from "./email--tEtMoj_.mjs";
5
- import { L as resolveDeployTransport, O as isWranglerNonInteractiveOrCI, X as runWranglerAuthToken, _ as deriveWorkerName, _t as createNodeEmailDns, bt as renderAddressMap, gt as applyEmailSetup, h as createDeployWranglerRunner, k as loadProvisionModule, v as discoverRootWranglerConfig, vt as findEmailConfigConflicts, xt as renderEmailChecklist, yt as preflightEmail } from "./deploy-DzAIwqNU.mjs";
6
- import { c as getToken, d as openBrowser } from "./auth-CSkdO2Bb.mjs";
7
- import { o as readProjectConfig } from "./project-C0Fqu05O.mjs";
5
+ import { L as resolveDeployTransport, O as isWranglerNonInteractiveOrCI, X as runWranglerAuthToken, _ as deriveWorkerName, _t as createNodeEmailDns, bt as renderAddressMap, gt as applyEmailSetup, h as createDeployWranglerRunner, k as loadProvisionModule, v as discoverRootWranglerConfig, vt as findEmailConfigConflicts, xt as renderEmailChecklist, yt as preflightEmail } from "./deploy-gCVaiJbS.mjs";
6
+ import { r as readProjectConfig } from "./project-DKG5Ra8p.mjs";
7
+ import { c as getToken, u as openBrowser } from "./auth-CQkSDS50.mjs";
8
8
  import { A as writeProvisionedWranglerConfig } from "./wrangler-7K-bW_DL.mjs";
9
- import { E as confirm, F as password, N as note, W as isCancel, j as log } from "./dist-CTBk70IR.mjs";
10
- import { n as PlatformClient, t as PlatformApiError } from "./client-RV8NVeB8.mjs";
11
- import { c as import_picocolors, i as createSpinner } from "./output-Dm_A4Tbv.mjs";
9
+ import { A as confirm, B as note, L as log, U as password, tt as isCancel } from "./prompts-BNUoTiaf.mjs";
10
+ import { n as PlatformClient, t as PlatformApiError } from "./client-DKAsFA4X.mjs";
11
+ import { c as import_picocolors, i as createSpinner } from "./output-CbM85T4k.mjs";
12
12
  import { existsSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
13
13
  import { tmpdir } from "node:os";
14
14
  import { execSync } from "node:child_process";
@@ -387,7 +387,7 @@ async function emailDomainAdd(client, projectId, rawDomain, subdomain, deps = {}
387
387
  "Create the token in three clicks: Continue to summary → Create Token → Copy.",
388
388
  "Watching the clipboard for it — nothing is read until you copy, and it is cleared afterwards.",
389
389
  "(Enter pastes it yourself instead.)",
390
- `If the browser didn't open, visit:\n${import_picocolors.default.cyan(url)}`
390
+ `If the browser didn't open, visit:\n${import_picocolors.default.blue(url)}`
391
391
  ].join("\n"));
392
392
  const spinner = watchSpinner;
393
393
  const deadline = Date.now() + (deps.watchTimeoutMs ?? 6e5);
@@ -1,11 +1,11 @@
1
1
  import { a as join } from "./dist-BVqXeR_h.mjs";
2
- import { c as getToken } from "./auth-CSkdO2Bb.mjs";
3
- import { i as readDeploymentPlatform, o as readProjectConfig } from "./project-C0Fqu05O.mjs";
4
- import { r as generateEnvTypes, t as findEnvFile } from "./env-types-C2_bIk_b.mjs";
5
- import { d as formatEnvReport, g as validateProdEnv, u as fetchRemoteSecretNames } from "./env-validation-BPn7vk-V.mjs";
6
- import { N as note, O as intro, P as outro, j as log } from "./dist-CTBk70IR.mjs";
7
- import { n as PlatformClient } from "./client-RV8NVeB8.mjs";
8
- import { r as cliTitle } from "./output-Dm_A4Tbv.mjs";
2
+ import { n as readDeploymentPlatform, r as readProjectConfig } from "./project-DKG5Ra8p.mjs";
3
+ import { c as getToken } from "./auth-CQkSDS50.mjs";
4
+ import { r as generateEnvTypes, t as findEnvFile } from "./env-types-D5kds_OZ.mjs";
5
+ import { d as formatEnvReport, g as validateProdEnv, u as fetchRemoteSecretNames } from "./env-validation-C_8tPdhs.mjs";
6
+ import { B as note, H as outro, L as log, N as intro } from "./prompts-BNUoTiaf.mjs";
7
+ import { n as PlatformClient } from "./client-DKAsFA4X.mjs";
8
+ import { r as cliTitle } from "./output-CbM85T4k.mjs";
9
9
  import { mkdirSync, writeFileSync } from "node:fs";
10
10
  //#region src/cli/env.ts
11
11
  async function runEnvCommand(root, args) {
@@ -26,7 +26,7 @@ async function runCheck(root, useRemoteSecrets) {
26
26
  const platform = readDeploymentPlatform(root);
27
27
  if (platform === "none") throw new Error("env: Deployment is disabled. Run `void init` to choose a platform.");
28
28
  if (platform === "cloudflare") {
29
- const { listCloudflareSecrets, resolveCloudflareOperationContext } = await import("./cloudflare-operations-AiWashgg.mjs");
29
+ const { listCloudflareSecrets, resolveCloudflareOperationContext } = await import("./cloudflare-operations-BCdXSsmo.mjs");
30
30
  remoteSecrets = await listCloudflareSecrets(resolveCloudflareOperationContext(root));
31
31
  } else {
32
32
  const token = getToken(root);
@@ -1,6 +1,6 @@
1
1
  import { l as relative } from "./dist-BVqXeR_h.mjs";
2
2
  import { n as readProjectPaths } from "./project-paths-GgcMozYz.mjs";
3
- import { i as voidWarn } from "./log-ChfPKsVd.mjs";
3
+ import { i as voidWarn } from "./log-vqY3pqwI.mjs";
4
4
  import { existsSync } from "node:fs";
5
5
  //#region src/codegen/env-types.ts
6
6
  /** Roots already warned about duplicate env.ts files — dedupes noisy repeat calls. */
@@ -1,6 +1,6 @@
1
1
  import { a as join, n as dirname, u as resolve } from "./dist-BVqXeR_h.mjs";
2
- import { i as voidWarn } from "./log-ChfPKsVd.mjs";
3
- import { t as findEnvFile } from "./env-types-C2_bIk_b.mjs";
2
+ import { i as voidWarn } from "./log-vqY3pqwI.mjs";
3
+ import { t as findEnvFile } from "./env-types-D5kds_OZ.mjs";
4
4
  import { a as loadLocalEnv, i as isClientEnvKey, r as findLegacyEnvFiles } from "./env-_v349JBd.mjs";
5
5
  import { c as resolveCloudflareOperationArgv, n as decodeCloudflareOperationResult, r as encodeCloudflareOperation } from "./cloudflare-process-B-wekeR6.mjs";
6
6
  import { existsSync, readFileSync } from "node:fs";
@@ -1,2 +1,2 @@
1
- import { a as computeInvalidEmittedKeys, c as deriveSelfHostSchemaFacts, p as readEmittedWorkerVars, r as SelfHostSchemaError } from "./env-validation-BPn7vk-V.mjs";
1
+ import { a as computeInvalidEmittedKeys, c as deriveSelfHostSchemaFacts, p as readEmittedWorkerVars, r as SelfHostSchemaError } from "./env-validation-C_8tPdhs.mjs";
2
2
  export { SelfHostSchemaError, computeInvalidEmittedKeys, deriveSelfHostSchemaFacts, readEmittedWorkerVars };
@@ -3,10 +3,10 @@ import { n as readProjectPaths } from "./project-paths-GgcMozYz.mjs";
3
3
  import { m as readConfig, u as getDatabaseDialect } from "./config-Br_JZD6u.mjs";
4
4
  import { n as readJournal, t as collectMigrations } from "./collect-DiTn9yr6.mjs";
5
5
  import { n as ensureProjectTsconfig } from "./project-tsconfig-B8GeM0RM.mjs";
6
- import { I as select, O as intro, P as outro, T as cancel, W as isCancel, j as log } from "./dist-CTBk70IR.mjs";
6
+ import { H as outro, K as select, L as log, N as intro, O as cancel, tt as isCancel } from "./prompts-BNUoTiaf.mjs";
7
7
  import { t as writeDrizzleConfig } from "./config-D8MOgiQV.mjs";
8
8
  import { r as listDrizzleArtifacts, t as assertJournalCoherence } from "./validate-ctOrgiS3.mjs";
9
- import { r as cliTitle } from "./output-Dm_A4Tbv.mjs";
9
+ import { r as cliTitle } from "./output-CbM85T4k.mjs";
10
10
  import { t as buildDrizzleKitSpawnEnv } from "./yarn-pnp-BV4AzNul.mjs";
11
11
  import { existsSync, mkdirSync, readFileSync, readdirSync, unlinkSync, writeFileSync } from "node:fs";
12
12
  import { fileURLToPath } from "node:url";
@@ -0,0 +1,2 @@
1
+ import { r as runGenCommand } from "./gen-CshAkukR.mjs";
2
+ export { runGenCommand };
@@ -1,8 +1,8 @@
1
- import { c as getToken, d as openBrowser, n as createCodeChallenge, r as createCodeVerifier, t as awaitBrowserCallback } from "./auth-CSkdO2Bb.mjs";
2
- import { o as readProjectConfig } from "./project-C0Fqu05O.mjs";
3
- import { B as text, E as confirm, I as select, T as cancel, W as isCancel, j as log } from "./dist-CTBk70IR.mjs";
4
- import { n as PlatformClient, o as parsePlatformErrorBody, s as platformErrorMessage, t as PlatformApiError } from "./client-RV8NVeB8.mjs";
5
- import { c as import_picocolors } from "./output-Dm_A4Tbv.mjs";
1
+ import { r as readProjectConfig } from "./project-DKG5Ra8p.mjs";
2
+ import { c as getToken, n as createCodeChallenge, r as createCodeVerifier, t as awaitBrowserCallback, u as openBrowser } from "./auth-CQkSDS50.mjs";
3
+ import { A as confirm, K as select, L as log, O as cancel, X as text, tt as isCancel } from "./prompts-BNUoTiaf.mjs";
4
+ import { n as PlatformClient, o as parsePlatformErrorBody, s as platformErrorMessage, t as PlatformApiError } from "./client-DKAsFA4X.mjs";
5
+ import { c as import_picocolors } from "./output-CbM85T4k.mjs";
6
6
  import { r as resolveProjectBySlug, t as getRequestedProjectSlug } from "./resolve-project-BG5ORGID.mjs";
7
7
  import { t as collectGitDeployMetadata } from "./git-metadata-D-gurjzG.mjs";
8
8
  import { randomBytes } from "node:crypto";
@@ -145,7 +145,7 @@ async function runInstall(root, client, linkIdentity = runGithubLink) {
145
145
  }
146
146
  } else throw err;
147
147
  }
148
- log.message(`Open this URL to install the Void GitHub App:\n${import_picocolors.default.cyan(url)}`);
148
+ log.message(`Open this URL to install the Void GitHub App:\n${import_picocolors.default.blue(url)}`);
149
149
  const { execFile } = await import("node:child_process");
150
150
  openBrowser(url, execFile);
151
151
  log.message("After installing, run `void github connect` to link a repository to your project.");
@@ -173,7 +173,7 @@ async function runGithubLink(root, client) {
173
173
  return url;
174
174
  },
175
175
  describeError: (p) => p.get("error") ? "GitHub authorization failed." : null,
176
- onUrl: (url) => log.message(`Open this URL to link your GitHub account:\n${import_picocolors.default.cyan(url)}`),
176
+ onUrl: (url) => log.message(`Open this URL to link your GitHub account:\n${import_picocolors.default.blue(url)}`),
177
177
  finalize: async (params) => {
178
178
  const linkCode = params.get("link_code");
179
179
  if (!linkCode) throw new Error("github: link callback did not return a link code.");
@@ -214,7 +214,7 @@ async function performGithubJoin(client) {
214
214
  return url;
215
215
  },
216
216
  describeError: (p) => p.get("error") ? "GitHub authorization failed." : null,
217
- onUrl: (url) => log.message(`Open this URL to join your organization's shared GitHub App installations:\n${import_picocolors.default.cyan(url)}`),
217
+ onUrl: (url) => log.message(`Open this URL to join your organization's shared GitHub App installations:\n${import_picocolors.default.blue(url)}`),
218
218
  finalize: async (params) => {
219
219
  const joinCode = params.get("join_code");
220
220
  if (!joinCode) throw new Error("github: join callback did not return a join code.");
@@ -280,7 +280,7 @@ async function runGithubConnectAuthorize(client, installationId, repoFullName) {
280
280
  if (e === "repo_not_accessible") return `You don't have access to ${repoFullName} under this installation on GitHub.`;
281
281
  return e ? "GitHub authorization failed." : null;
282
282
  },
283
- onUrl: (url) => log.message(`Open this URL to authorize access to ${repoFullName}:\n${import_picocolors.default.cyan(url)}`),
283
+ onUrl: (url) => log.message(`Open this URL to authorize access to ${repoFullName}:\n${import_picocolors.default.blue(url)}`),
284
284
  finalize: async (params) => {
285
285
  const grant = params.get("connect_grant");
286
286
  if (!grant) throw new Error("github: connect authorization did not return a grant.");
@@ -303,8 +303,8 @@ async function promptRepoFullName(root) {
303
303
  const input = await text({
304
304
  message: "Repository (owner/repo):",
305
305
  placeholder: gitDefault ?? "owner/repo",
306
- initialValue: gitDefault ?? "",
307
- validate: (value) => /^[^/\s]+\/[^/\s]+$/.test((value ?? "").trim()) ? void 0 : "Enter the repository as owner/repo."
306
+ defaultValue: gitDefault ?? void 0,
307
+ validate: (value) => /^[^/\s]+\/[^/\s]+$/.test((value || gitDefault || "").trim()) ? void 0 : "Enter the repository as owner/repo."
308
308
  });
309
309
  if (isCancel(input)) {
310
310
  cancel("Cancelled.");
@@ -447,7 +447,7 @@ async function runConnect(root, client, args) {
447
447
  const input = await text({
448
448
  message: "Branch to deploy from:",
449
449
  placeholder: branchDefault,
450
- initialValue: branchDefault
450
+ defaultValue: branchDefault
451
451
  });
452
452
  if (isCancel(input)) {
453
453
  cancel("Cancelled.");
@@ -483,7 +483,7 @@ async function runConnect(root, client, args) {
483
483
  const input = await text({
484
484
  message: "Deploy workflow file:",
485
485
  placeholder: DEFAULT_WORKFLOW_PATH,
486
- initialValue: DEFAULT_WORKFLOW_PATH,
486
+ defaultValue: DEFAULT_WORKFLOW_PATH,
487
487
  validate(value) {
488
488
  const v = (value ?? "").trim();
489
489
  if (v.length === 0 || isValidWorkflowPath(v)) return;
@@ -1,6 +1,6 @@
1
1
  import { a as join } from "./dist-BVqXeR_h.mjs";
2
2
  import { a as convertFallbacksConfig, c as convertRewritesConfig, f as isProtocolRelative, l as countSplats, n as VALID_REDIRECT_STATUSES, o as convertHeadersConfig, p as parseHostPrefixedSource, s as convertRedirectsConfig } from "./config-Br_JZD6u.mjs";
3
- import { i as voidWarn } from "./log-ChfPKsVd.mjs";
3
+ import { i as voidWarn } from "./log-vqY3pqwI.mjs";
4
4
  import { existsSync, readFileSync } from "node:fs";
5
5
  //#region src/cli/headers.ts
6
6
  /**
@@ -1,8 +1,8 @@
1
1
  import { a as join } from "./dist-BVqXeR_h.mjs";
2
- import { N as note, P as outro } from "./dist-CTBk70IR.mjs";
2
+ import { B as note, H as outro } from "./prompts-BNUoTiaf.mjs";
3
3
  import { n as getPackageDir } from "./agents-B_pX_HmQ.mjs";
4
- import { c as import_picocolors, s as helpLine, t as categoryTitle, u as sectionTitle } from "./output-Dm_A4Tbv.mjs";
5
- import { n as operatorGroups, t as operatorCommands } from "./operator-args-CLgKGlwU.mjs";
4
+ import { c as import_picocolors, s as helpLine, t as categoryTitle, u as sectionTitle } from "./output-CbM85T4k.mjs";
5
+ import { n as operatorGroups, t as operatorCommands } from "./operator-args-B3BTmSoi.mjs";
6
6
  import { readFileSync } from "node:fs";
7
7
  //#region src/cli/ascii.ts
8
8
  const asciiArts = [
@@ -82,7 +82,7 @@ function operatorHelpTree() {
82
82
  })),
83
83
  ...(entry.booleans ?? []).map((flag) => ({
84
84
  command: `--${flag}`,
85
- description: flag === "follow" ? "Poll new logs until interrupted or the build ends" : flag === "ended" ? "Attest that the original provider execution has ended" : flag === "protect-new-projects" ? "Protect newly created projects by default" : flag === "check" && group === "zero-trust" ? "Also check the saved settings against Cloudflare Access (several API calls)" : flag === "token-stdin" && group === "zero-trust" ? "Read the Access management API token from stdin" : flag === "token-stdin" && group === "email" ? entry.action === "domain-remove" ? "Read a replacement Cloudflare token for blocked project cleanup from stdin" : "Read a scoped Cloudflare API token from stdin" : "Read a full API session from stdin for explicit operator session exchange"
85
+ description: flag === "follow" ? "Poll new logs until interrupted or the build ends" : flag === "ended" ? "Attest that the original provider execution has ended" : flag === "public-apps" ? "Manage public app rules without identity policies" : flag === "protect-new-projects" ? "Protect newly created projects by default" : flag === "check" && group === "zero-trust" ? "Also check the saved settings against Cloudflare Access (several API calls)" : flag === "token-stdin" && group === "zero-trust" ? "Read the Access management API token from stdin" : flag === "token-stdin" && group === "email" ? entry.action === "domain-remove" ? "Read a replacement Cloudflare token for blocked project cleanup from stdin" : "Read a scoped Cloudflare API token from stdin" : "Read a full API session from stdin for explicit operator session exchange"
86
86
  }))
87
87
  ]
88
88
  }]))
@@ -607,6 +607,10 @@ const HELP_TREE = {
607
607
  command: "--no-access-protection",
608
608
  description: "Skip Cloudflare Access protection"
609
609
  },
610
+ {
611
+ command: "--app-access <public|platform|custom>",
612
+ description: "Choose public apps, reuse platform Access, or select separate app policies"
613
+ },
610
614
  {
611
615
  command: "--hyperdrive <create|id>",
612
616
  description: "Create Hyperdrive or use the specified existing configuration"
@@ -0,0 +1,2 @@
1
+ import { r as printHelpPage } from "./help-Dotbf6iz.mjs";
2
+ export { printHelpPage };
@@ -91,7 +91,7 @@ async function parseEmail(message) {
91
91
  const proxyRawCache = /* @__PURE__ */ new WeakMap();
92
92
  /**
93
93
  * Remove the platform-injected `<slug>+` prefix from a recipient address.
94
- * The platform's shared sender (e.g. `mail.void.cloud`) rewrites every recipient to
94
+ * The platform's shared sender (e.g. `mail.example.com`) rewrites every recipient to
95
95
  * `<slug>+<tag>@<domain>`; user handlers expect `<tag>@<domain>`. If the
96
96
  * slug is unknown, missing, or doesn't match the local-part prefix, the
97
97
  * address is returned unchanged so callers without slug context (e.g. the