void 0.10.4 → 0.10.6

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 (217) hide show
  1. package/dist/agents-Bmr5tFFb.mjs +1454 -0
  2. package/dist/{auth-cmd-CblKzAdD.mjs → auth-cmd-DlgNwByu.mjs} +10 -10
  3. package/dist/{better-auth-shared-D0Mbmx5V.mjs → better-auth-shared-BQooDxbw.mjs} +1 -1
  4. package/dist/{better-auth-shared-jkksALri.d.mts → better-auth-shared-BvnM9px6.d.mts} +2 -2
  5. package/dist/{build-cmd-CJQSRupz.mjs → build-cmd-Br8qL0rA.mjs} +15 -17
  6. package/dist/{cache-CMzjhxHh.mjs → cache-wH-mP8UE.mjs} +10 -12
  7. package/dist/{cancel-deploy-S2N8NSv6.mjs → cancel-deploy-BEBOEgtu.mjs} +16 -18
  8. package/dist/cli/cli.mjs +62 -51
  9. package/dist/{client-YIzxv2ZO.mjs → client-Cj96iiBH.mjs} +118 -8
  10. package/dist/{config-8dLIngKW.mjs → config-1twldYCW.mjs} +10 -10
  11. package/dist/{config--wXmVOoe.mjs → config-BdUctCZD.mjs} +6 -6
  12. package/dist/{create-project-pLQdzEPe.mjs → create-project-DD9n8Ho-.mjs} +28 -23
  13. package/dist/{db-hAmBumot.mjs → db-DjKE2-A-.mjs} +151 -150
  14. package/dist/{delete-CfSe3EJO.mjs → delete-D2kr3Kmk.mjs} +13 -15
  15. package/dist/{deploy-DpOdwtla.mjs → deploy-C4PbkFyE.mjs} +114 -119
  16. package/dist/{discover-C8N1I4tK.mjs → discover-BuVVSAum.mjs} +4 -4
  17. package/dist/{dist-5cGIJHQQ.mjs → dist-BuiRJkTd.mjs} +59 -27
  18. package/dist/{domain-CkowysQx.mjs → domain-_luIsM_B.mjs} +14 -16
  19. package/dist/{env-CIwG2y7G.mjs → env-CO5XAS9t.mjs} +23 -25
  20. package/dist/{env-helpers-B_ks681T.d.mts → env-helpers-z4stu8uc.d.mts} +1 -1
  21. package/dist/{env-types-CaJaIRXU.mjs → env-types-D51bnR-c.mjs} +4 -4
  22. package/dist/{env-validation-LH6eoyW-.mjs → env-validation-CeC2FL66.mjs} +4 -4
  23. package/dist/{fetch-error-C6qffTl2.mjs → fetch-error-Dj3crt0e.mjs} +3 -3
  24. package/dist/{gen-q6McxXgE.mjs → gen-Cf79J4aw.mjs} +42 -44
  25. package/dist/{github-cmd-BvEKQmcD.mjs → github-cmd-DnqxyOsb.mjs} +197 -91
  26. package/dist/{handler-B7rCOy21.d.mts → handler-imD0UVDT.d.mts} +4 -5
  27. package/dist/{headers-BNWymgnH.mjs → headers-BwvFGhkx.mjs} +3 -3
  28. package/dist/index.d.mts +3 -3
  29. package/dist/index.mjs +102 -83
  30. package/dist/{init-CZP69LJu.mjs → init-KirOzVDs.mjs} +132 -134
  31. package/dist/link-CUmiosyb.mjs +45 -0
  32. package/dist/{list-B7qXBBjo.mjs → list-3GEw7b6m.mjs} +10 -12
  33. package/dist/{login-B3l_sDwT.mjs → login-DJReaT_Q.mjs} +14 -15
  34. package/dist/{logs-AXm660MB.mjs → logs-D-rQ56Lq.mjs} +9 -11
  35. package/dist/{magic-string.es-C1Fb0uxq.mjs → magic-string.es-ZQjdJFFn.mjs} +3 -3
  36. package/dist/{mcp-D2plINxM.mjs → mcp-D7yc0dXY.mjs} +2 -3
  37. package/dist/{node-B07cZs0d.mjs → node-yFFk626c.mjs} +6 -6
  38. package/dist/{package-json-Bg_GJdJB.mjs → package-json-B0NuUWGd.mjs} +1 -1
  39. package/dist/pages/client.d.mts +1 -1
  40. package/dist/pages/client.mjs +2 -1
  41. package/dist/pages/head-client.d.mts +1 -1
  42. package/dist/pages/head.d.mts +1 -1
  43. package/dist/pages/index.d.mts +2 -2
  44. package/dist/pages/index.mjs +5 -5
  45. package/dist/pages/islands-plugin.d.mts +1 -1
  46. package/dist/pages/islands-plugin.mjs +3 -3
  47. package/dist/pages/protocol.d.mts +2 -2
  48. package/dist/pages/protocol.mjs +5 -2
  49. package/dist/{plugin-inference-C3fLzFvP.mjs → plugin-inference-CJxi_fWI.mjs} +4 -4
  50. package/dist/{prepare-DRRboRqH.mjs → prepare-C_cVurhP.mjs} +15 -18
  51. package/dist/{preset-B7ZQZn0u.mjs → preset-CVvwCeIy.mjs} +4 -4
  52. package/dist/{project-cmd-InegJruy.mjs → project-cmd-DnU7u9QF.mjs} +13 -14
  53. package/dist/{project-paths-CCMrHYQm.mjs → project-paths-tpdR1mJR.mjs} +2 -2
  54. package/dist/{project-tsconfig-BTNuNoJ0.mjs → project-tsconfig-D9uSVVpA.mjs} +4 -4
  55. package/dist/{protocol-6UZCowS1.d.mts → protocol-6hTJ04T1.d.mts} +3 -3
  56. package/dist/{resolve-project-D4O1_fZz.mjs → resolve-project-D2HI3TrG.mjs} +2 -2
  57. package/dist/{rollback-CHVE-DeT.mjs → rollback-Yh7bCKob.mjs} +21 -23
  58. package/dist/{route-types-D03ryMXz.mjs → route-types-CfKfhbIg.mjs} +234 -3
  59. package/dist/{runner-BQyKUqAL.mjs → runner-h272wcPj.mjs} +4 -5
  60. package/dist/{runner-pg-EuhrFW3D.mjs → runner-pg-waxJOnBb.mjs} +1 -1
  61. package/dist/runtime/ai.mjs +2 -2
  62. package/dist/runtime/auth.d.mts +1 -1
  63. package/dist/runtime/better-auth-pg.d.mts +1 -1
  64. package/dist/runtime/better-auth-pg.mjs +3 -3
  65. package/dist/runtime/better-auth.d.mts +1 -1
  66. package/dist/runtime/better-auth.mjs +2 -2
  67. package/dist/runtime/client-react.d.mts +2 -2
  68. package/dist/runtime/client-react.mjs +1 -1
  69. package/dist/runtime/client-solid.d.mts +2 -2
  70. package/dist/runtime/client-solid.mjs +1 -1
  71. package/dist/runtime/client-svelte.d.mts +2 -2
  72. package/dist/runtime/client-svelte.mjs +1 -1
  73. package/dist/runtime/client-vue.d.mts +2 -2
  74. package/dist/runtime/client-vue.mjs +1 -1
  75. package/dist/runtime/client.d.mts +2 -2
  76. package/dist/runtime/client.mjs +1 -1
  77. package/dist/runtime/db-pg.d.mts +1 -1
  78. package/dist/runtime/env-helpers.d.mts +1 -1
  79. package/dist/runtime/env-public-client.d.mts +1 -1
  80. package/dist/runtime/env-public-client.mjs +2 -0
  81. package/dist/runtime/env-public.d.mts +3 -4
  82. package/dist/runtime/env-public.mjs +3 -1
  83. package/dist/runtime/env.mjs +1 -1
  84. package/dist/runtime/fetch-stream.d.mts +1 -1
  85. package/dist/runtime/fetch-stream.mjs +1 -1
  86. package/dist/runtime/fetch.d.mts +1 -1
  87. package/dist/runtime/fetch.mjs +1 -1
  88. package/dist/runtime/handler.d.mts +2 -2
  89. package/dist/runtime/handler.mjs +1 -1
  90. package/dist/runtime/isr.mjs +1 -1
  91. package/dist/runtime/live-server.mjs +2 -0
  92. package/dist/runtime/live.d.mts +2 -2
  93. package/dist/runtime/live.mjs +3 -1
  94. package/dist/runtime/migration-handler-pg.mjs +1 -1
  95. package/dist/runtime/migration-handler.mjs +1 -1
  96. package/dist/runtime/remote/index.mjs +11 -1
  97. package/dist/runtime/sandbox.d.mts +1 -4
  98. package/dist/runtime/sandbox.mjs +1 -1
  99. package/dist/runtime/validator.d.mts +1 -1
  100. package/dist/runtime/ws-server.d.mts +2 -2
  101. package/dist/runtime/ws-server.mjs +2 -0
  102. package/dist/runtime/ws.d.mts +3 -3
  103. package/dist/runtime/ws.mjs +2 -0
  104. package/dist/{scan-VCAM1oh3.mjs → scan-Dp_Gyzs3.mjs} +3 -3
  105. package/dist/{scan-DGEp1-1Q.mjs → scan-i7Yz54fv.mjs} +26 -8
  106. package/dist/{secret-CVKwIOm3.mjs → secret-u7FRvg8d.mjs} +22 -24
  107. package/dist/{skills-Dl3u05da.mjs → skills-DsdNDtX3.mjs} +6 -7
  108. package/dist/{subcommand-prompt-B8ng0FTS.mjs → subcommand-prompt-DtES-oP6.mjs} +34 -35
  109. package/dist/sveltekit.mjs +2 -2
  110. package/dist/validate-DT7nFMlf.mjs +504 -0
  111. package/dist/{yarn-pnp-WLW2IHUY.mjs → yarn-pnp-CW8LB6g_.mjs} +1 -1
  112. package/package.json +19 -19
  113. package/skills/void/docs/node_modules/void/node_modules/@clack/prompts/CHANGELOG.md +94 -0
  114. package/skills/void/docs/node_modules/void/node_modules/@clack/prompts/README.md +32 -11
  115. package/skills/void/docs/node_modules/void/node_modules/@cloudflare/sandbox/README.md +45 -0
  116. package/skills/void/docs/node_modules/void/node_modules/@electric-sql/pglite/README.md +5 -5
  117. package/skills/void/docs/node_modules/void/node_modules/@types/node/README.md +1 -1
  118. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/@types/node/README.md +1 -1
  119. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/markdown-exit/README.md +4 -1
  120. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/markdown-it-attrs/README.md +29 -12
  121. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/tinyglobby/README.md +1 -1
  122. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/AGENTS.md +1 -0
  123. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/README.md +18 -6
  124. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/build.md +1 -1
  125. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/check.md +35 -0
  126. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/create.md +70 -0
  127. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/fmt.md +3 -1
  128. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/index.md +11 -7
  129. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/lint.md +3 -1
  130. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/pack.md +1 -1
  131. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/run.md +141 -26
  132. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/staged.md +1 -1
  133. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/test.md +1 -1
  134. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/automatic-data-tracking.md +145 -0
  135. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/cache.md +16 -28
  136. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/check.md +16 -0
  137. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/ci.md +15 -17
  138. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/commit-hooks.md +9 -0
  139. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/create.md +255 -2
  140. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/docker.md +175 -0
  141. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/env.md +70 -5
  142. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/github-actions-cache.md +165 -0
  143. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/ide-integration.md +2 -2
  144. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/index.md +9 -3
  145. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/install.md +63 -11
  146. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/migrate-rules.md +347 -0
  147. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/migrate.md +27 -3
  148. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/monorepo.md +176 -0
  149. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/pack.md +8 -0
  150. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/run.md +36 -4
  151. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/troubleshooting.md +11 -35
  152. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/upgrade.md +65 -13
  153. package/skills/void/docs/node_modules/void/node_modules/es-module-lexer/README.md +403 -390
  154. package/skills/void/docs/node_modules/void/node_modules/pg/README.md +2 -1
  155. package/skills/void/docs/node_modules/void/node_modules/tinyglobby/README.md +1 -1
  156. package/skills/void/docs/node_modules/void/node_modules/vite-plus/AGENTS.md +1 -0
  157. package/skills/void/docs/node_modules/void/node_modules/vite-plus/README.md +18 -6
  158. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/build.md +1 -1
  159. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/check.md +35 -0
  160. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/create.md +70 -0
  161. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/fmt.md +3 -1
  162. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/index.md +11 -7
  163. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/lint.md +3 -1
  164. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/pack.md +1 -1
  165. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/run.md +141 -26
  166. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/staged.md +1 -1
  167. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/test.md +1 -1
  168. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/automatic-data-tracking.md +145 -0
  169. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/cache.md +16 -28
  170. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/check.md +16 -0
  171. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/ci.md +15 -17
  172. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/commit-hooks.md +9 -0
  173. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/create.md +255 -2
  174. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/docker.md +175 -0
  175. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/env.md +70 -5
  176. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/github-actions-cache.md +165 -0
  177. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/ide-integration.md +2 -2
  178. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/index.md +9 -3
  179. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/install.md +63 -11
  180. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/migrate-rules.md +347 -0
  181. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/migrate.md +27 -3
  182. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/monorepo.md +176 -0
  183. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/pack.md +8 -0
  184. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/run.md +36 -4
  185. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/troubleshooting.md +11 -35
  186. package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/upgrade.md +65 -13
  187. package/skills/void/docs/reference/cli.md +19 -1
  188. package/dist/agents-MhSzNMiC.mjs +0 -151
  189. package/dist/collect-9rO3JFNM.mjs +0 -55
  190. package/dist/config-hhMYPVRT.mjs +0 -21
  191. package/dist/dist-abzUneor.mjs +0 -1287
  192. package/dist/drizzle-DqstQTGq.mjs +0 -232
  193. package/dist/link-BKLElphS.mjs +0 -47
  194. package/dist/output-DeiS4oEX.mjs +0 -139
  195. package/dist/plan-aD3wRDqF.mjs +0 -271
  196. package/dist/project-CH9pdo16.mjs +0 -72
  197. package/dist/project-slug-rX3kTOfY.mjs +0 -10
  198. package/dist/validate-CNWm-PsL.mjs +0 -186
  199. /package/dist/{auth-migrations-BP-hMzYl.mjs → auth-migrations-BTZ-ATvQ.mjs} +0 -0
  200. /package/dist/{auth-Dz2CCn4T.d.mts → auth-qgMlYp7Z.d.mts} +0 -0
  201. /package/dist/{canonical-json-CEyQaVDa.mjs → canonical-json-DuDiiUsQ.mjs} +0 -0
  202. /package/dist/{cf-access-DKDsgwOU.mjs → cf-access-Bqw81xAf.mjs} +0 -0
  203. /package/dist/{defer-C-bdSM_b.mjs → defer-YsYDUoii.mjs} +0 -0
  204. /package/dist/{dotenv-lS94ymhM.mjs → dotenv-D_UbC_vc.mjs} +0 -0
  205. /package/dist/{env-raw-Dtj1UAoK.mjs → env-raw-CoS20LHP.mjs} +0 -0
  206. /package/dist/{fetch-error-B6RaJ-eZ.d.mts → fetch-error-Sp1R4mZv.d.mts} +0 -0
  207. /package/dist/{git-metadata-Ce0AtSZL.mjs → git-metadata-CBKaL0v5.mjs} +0 -0
  208. /package/dist/{head-eOUCWUNy.d.mts → head-nmvOgFjd.d.mts} +0 -0
  209. /package/dist/{log-BdD_Fpms.mjs → log-ChfPKsVd.mjs} +0 -0
  210. /package/dist/{pathe.M-eThtNZ-BrPhGF_K.mjs → pathe.M-eThtNZ-CQzLbt4c.mjs} +0 -0
  211. /package/dist/{pg-CempqvEJ.mjs → pg-J2HbZIkX.mjs} +0 -0
  212. /package/dist/{providers-BJIoduK9.d.mts → providers-BNKRacMr.d.mts} +0 -0
  213. /package/dist/{providers-BwPbdHdi.mjs → providers-CJlNS3kT.mjs} +0 -0
  214. /package/dist/{proxy-M3pxItg2.mjs → proxy-D-3_D-Gl.mjs} +0 -0
  215. /package/dist/{chunk-DJd-R1mw.mjs → rolldown-runtime-DJK8HYOj.mjs} +0 -0
  216. /package/dist/{standard-schema-Cy0lfeWv.d.mts → standard-schema-DJ0HW7QP.d.mts} +0 -0
  217. /package/dist/{types-BodZGegX.d.mts → types-lLjNE9Qp.d.mts} +0 -0
@@ -1,9 +1,7 @@
1
- import { s as import_picocolors } from "./output-DeiS4oEX.mjs";
2
- import { c as createCodeChallenge, f as getToken, h as openBrowser, l as createCodeVerifier, n as PlatformClient, o as parsePlatformErrorBody, s as awaitBrowserCallback, t as PlatformApiError } from "./client-YIzxv2ZO.mjs";
3
- import { _ as me, c as R, i as Ee, l as Re, x as q } from "./dist-abzUneor.mjs";
4
- import { r as readProjectConfig } from "./project-CH9pdo16.mjs";
5
- import { r as resolveProjectBySlug, t as getRequestedProjectSlug } from "./resolve-project-D4O1_fZz.mjs";
6
- import { t as collectGitDeployMetadata } from "./git-metadata-Ce0AtSZL.mjs";
1
+ import { A as text, T as log, j as isCancel, k as select, u as import_picocolors, x as cancel } from "./agents-Bmr5tFFb.mjs";
2
+ import { b as readProjectConfig, c as createCodeChallenge, f as getToken, h as openBrowser, l as createCodeVerifier, n as PlatformClient, o as parsePlatformErrorBody, s as awaitBrowserCallback, t as PlatformApiError } from "./client-Cj96iiBH.mjs";
3
+ import { r as resolveProjectBySlug, t as getRequestedProjectSlug } from "./resolve-project-D2HI3TrG.mjs";
4
+ import { t as collectGitDeployMetadata } from "./git-metadata-CBKaL0v5.mjs";
7
5
  import { randomBytes } from "node:crypto";
8
6
  //#region src/cli/github-cmd.ts
9
7
  /**
@@ -95,7 +93,7 @@ function formatConnection(connection) {
95
93
  async function runGithubCommand(root, args) {
96
94
  const token = getToken(root);
97
95
  if (!token) {
98
- R.error("Not logged in. Run `void auth login` first.");
96
+ log.error("Not logged in. Run `void auth login` first.");
99
97
  process.exit(1);
100
98
  }
101
99
  const client = new PlatformClient(token, { root });
@@ -106,6 +104,7 @@ async function runGithubCommand(root, args) {
106
104
  case "update": return runGithubUpdate(root, client, args);
107
105
  case "status": return runStatus(root, client, args);
108
106
  case "link": return runGithubLink(root, client);
107
+ case "join": return runGithubJoin(root, client);
109
108
  }
110
109
  }
111
110
  /**
@@ -125,23 +124,23 @@ async function runInstall(root, client, linkIdentity = runGithubLink) {
125
124
  ({url} = await client.getGithubInstallUrl());
126
125
  } catch (err) {
127
126
  if (err instanceof PlatformApiError && err.status === 403 && err.code === "github_identity_required") {
128
- R.message("Your Void account needs a linked GitHub identity. Starting the GitHub link…");
127
+ log.message("Your Void account needs a linked GitHub identity. Starting the GitHub link…");
129
128
  await linkIdentity(root, client);
130
129
  try {
131
130
  ({url} = await client.getGithubInstallUrl());
132
131
  } catch (retryErr) {
133
132
  if (retryErr instanceof PlatformApiError && retryErr.status === 403 && retryErr.code === "github_identity_required") {
134
- R.error("Could not start the GitHub App install after linking. Try `void github link`, then `void github install` again.");
133
+ log.error("Could not start the GitHub App install after linking. Try `void github link`, then `void github install` again.");
135
134
  process.exit(1);
136
135
  }
137
136
  throw retryErr;
138
137
  }
139
138
  } else throw err;
140
139
  }
141
- R.message(`Open this URL to install the Void GitHub App:\n${import_picocolors.default.cyan(url)}`);
140
+ log.message(`Open this URL to install the Void GitHub App:\n${import_picocolors.default.cyan(url)}`);
142
141
  const { execFile } = await import("node:child_process");
143
142
  openBrowser(url, execFile);
144
- R.message("After installing, run `void github connect` to link a repository to your project.");
143
+ log.message("After installing, run `void github connect` to link a repository to your project.");
145
144
  }
146
145
  /**
147
146
  * Link the current Void account (the logged-in CLI token holder) to a GitHub
@@ -166,7 +165,7 @@ async function runGithubLink(root, client) {
166
165
  return url;
167
166
  },
168
167
  describeError: (p) => p.get("error") ? "GitHub authorization failed." : null,
169
- onUrl: (url) => R.message(`Open this URL to link your GitHub account:\n${import_picocolors.default.cyan(url)}`),
168
+ onUrl: (url) => log.message(`Open this URL to link your GitHub account:\n${import_picocolors.default.cyan(url)}`),
170
169
  finalize: async (params) => {
171
170
  const linkCode = params.get("link_code");
172
171
  if (!linkCode) throw new Error("github: link callback did not return a link code.");
@@ -175,25 +174,112 @@ async function runGithubLink(root, client) {
175
174
  }));
176
175
  } catch (err) {
177
176
  if (err instanceof PlatformApiError && err.code === "github_already_linked") {
178
- R.error("Your Void account is already linked to a different GitHub account.");
177
+ log.error("Your Void account is already linked to a different GitHub account.");
179
178
  process.exit(1);
180
179
  }
181
180
  if (err instanceof PlatformApiError && (err.status === 409 || err.code === "github_identity_conflict")) {
182
- R.error("This GitHub account is already linked to another Void account.");
181
+ log.error("This GitHub account is already linked to another Void account.");
183
182
  process.exit(1);
184
183
  }
185
184
  throw err;
186
185
  }
187
- if (status === "already_linked") R.success("GitHub account already linked.");
188
- else R.success("GitHub account linked.");
186
+ if (status === "already_linked") log.success("GitHub account already linked.");
187
+ else log.success("GitHub account linked.");
188
+ }
189
+ /**
190
+ * Discover and join the shared GitHub App installations owned by the
191
+ * organizations the logged-in GitHub identity belongs to. Drives the same
192
+ * 3-endpoint localhost + PKCE handshake as {@link runGithubLink}, but against
193
+ * the platform's JOIN routes: membership upsert is idempotent, so unlike link
194
+ * there is no 409/already-linked conflict to map. The only special error is the
195
+ * fail-closed 503 raised when org-installation sharing is not configured on the
196
+ * instance.
197
+ */
198
+ async function runGithubJoin(root, client) {
199
+ const verifier = createCodeVerifier();
200
+ const challenge = createCodeChallenge(verifier);
201
+ const state = randomBytes(32).toString("hex");
202
+ let count;
203
+ try {
204
+ ({count} = await awaitBrowserCallback({
205
+ state,
206
+ buildAuthUrl: async (callback) => {
207
+ callback.searchParams.set("state", state);
208
+ const { url } = await client.getGithubJoinUrl(callback.href, challenge);
209
+ return url;
210
+ },
211
+ describeError: (p) => p.get("error") ? "GitHub authorization failed." : null,
212
+ onUrl: (url) => log.message(`Open this URL to join your organization's shared GitHub App installations:\n${import_picocolors.default.cyan(url)}`),
213
+ finalize: async (params) => {
214
+ const joinCode = params.get("join_code");
215
+ if (!joinCode) throw new Error("github: join callback did not return a join code.");
216
+ return client.completeGithubJoin(joinCode, verifier);
217
+ }
218
+ }));
219
+ } catch (err) {
220
+ if (err instanceof PlatformApiError && err.status === 503 && err.code === "github_oauth_not_configured") {
221
+ log.error("Organization installation sharing is not enabled on this Void instance.");
222
+ process.exit(1);
223
+ }
224
+ throw err;
225
+ }
226
+ if (count === 0) log.info("No new installations to join.");
227
+ else {
228
+ log.success(`Joined ${count} installation${count === 1 ? "" : "s"}.`);
229
+ log.message("Run `void github installations` to see them, then `void github connect`.");
230
+ }
189
231
  }
190
232
  async function runInstallations(client) {
191
233
  const installations = await client.listGithubInstallations();
192
234
  if (installations.length === 0) {
193
- R.info("No GitHub App installations. Run `void github install` first.");
235
+ log.info("No GitHub App installations. Run `void github install` first.");
194
236
  return;
195
237
  }
196
- R.message(formatInstallations(installations));
238
+ log.message(formatInstallations(installations));
239
+ }
240
+ /**
241
+ * Per-repo connect authorization round-trip for a non-owner org member.
242
+ *
243
+ * When the connect route returns 403 `connect_authorization_required` (Task 8),
244
+ * the member has no proof they can access the specific repo under the shared
245
+ * installation. This drives the same localhost + PKCE handshake as
246
+ * {@link runGithubLink}/{@link runGithubJoin}, but against the platform's
247
+ * connect-authorize route (Task 7): the callback mints and returns the grant IN
248
+ * the redirect URL (`?connect_grant=…`), so there is no separate `/complete`
249
+ * POST — `finalize` just reads the grant out of the callback query. A
250
+ * `?error=repo_not_accessible` callback is mapped to a friendly per-repo message
251
+ * by `describeError`, which rejects out of the handshake (no grant, no retry).
252
+ *
253
+ * Returns the grant plus the PKCE verifier the caller must echo to the connect
254
+ * route so the platform can bind the grant to this exchange.
255
+ */
256
+ async function runGithubConnectAuthorize(client, installationId, repoFullName) {
257
+ const verifier = createCodeVerifier();
258
+ const challenge = createCodeChallenge(verifier);
259
+ const state = randomBytes(32).toString("hex");
260
+ const { connectGrant } = await awaitBrowserCallback({
261
+ state,
262
+ buildAuthUrl: async (callback) => {
263
+ callback.searchParams.set("state", state);
264
+ const { url } = await client.getGithubConnectAuthorizeUrl(callback.href, challenge, installationId, repoFullName);
265
+ return url;
266
+ },
267
+ describeError: (p) => {
268
+ const e = p.get("error");
269
+ if (e === "repo_not_accessible") return `You don't have access to ${repoFullName} under this installation on GitHub.`;
270
+ return e ? "GitHub authorization failed." : null;
271
+ },
272
+ onUrl: (url) => log.message(`Open this URL to authorize access to ${repoFullName}:\n${import_picocolors.default.cyan(url)}`),
273
+ finalize: async (params) => {
274
+ const grant = params.get("connect_grant");
275
+ if (!grant) throw new Error("github: connect authorization did not return a grant.");
276
+ return { connectGrant: grant };
277
+ }
278
+ });
279
+ return {
280
+ connectGrant,
281
+ codeVerifier: verifier
282
+ };
197
283
  }
198
284
  async function runConnect(root, client, args) {
199
285
  const isTTY = process.stdin.isTTY === true;
@@ -202,7 +288,7 @@ async function runConnect(root, client, args) {
202
288
  if (requestedSlug) {
203
289
  const resolved = resolveProjectBySlug(await client.listProjects(), requestedSlug);
204
290
  if (!resolved) {
205
- R.error(`connect: No project found with slug '${requestedSlug}'.`);
291
+ log.error(`connect: No project found with slug '${requestedSlug}'.`);
206
292
  process.exit(1);
207
293
  }
208
294
  projectId = resolved.projectId;
@@ -210,23 +296,23 @@ async function runConnect(root, client, args) {
210
296
  const linked = readProjectConfig(root);
211
297
  if (linked) projectId = linked.projectId;
212
298
  else if (!isTTY) {
213
- R.error("connect: No project specified. Pass a project name or --project <name>, set VOID_PROJECT, or link one with `void project link`.");
299
+ log.error("connect: No project specified. Pass a project name or --project <name>, set VOID_PROJECT, or link one with `void project link`.");
214
300
  process.exit(1);
215
301
  } else {
216
302
  const projects = await client.listProjects();
217
303
  if (projects.length === 0) {
218
- R.error("No projects found. Create one first with `void deploy`.");
304
+ log.error("No projects found. Create one first with `void deploy`.");
219
305
  process.exit(1);
220
306
  }
221
- const picked = await Ee({
307
+ const picked = await select({
222
308
  message: "Select a project:",
223
309
  options: projects.map((p) => ({
224
310
  value: p.id,
225
311
  label: p.slug
226
312
  }))
227
313
  });
228
- if (q(picked)) {
229
- me("Cancelled.");
314
+ if (isCancel(picked)) {
315
+ cancel("Cancelled.");
230
316
  process.exit(0);
231
317
  }
232
318
  projectId = picked;
@@ -234,31 +320,31 @@ async function runConnect(root, client, args) {
234
320
  }
235
321
  const installations = (await client.listGithubInstallations()).filter((i) => i.status === "active");
236
322
  if (installations.length === 0) {
237
- R.error("No active GitHub App installation. Run `void github install` first.");
323
+ log.error("No active GitHub App installation. Run `void github install` first.");
238
324
  process.exit(1);
239
325
  }
240
326
  let installation;
241
327
  if (args.installationId) {
242
328
  const found = installations.find((i) => i.installation_id === args.installationId);
243
329
  if (!found) {
244
- R.error(`connect: No active installation found with id '${args.installationId}'.`);
330
+ log.error(`connect: No active installation found with id '${args.installationId}'.`);
245
331
  process.exit(1);
246
332
  }
247
333
  installation = found;
248
334
  } else if (installations.length === 1) installation = installations[0];
249
335
  else if (!isTTY) {
250
- R.error("connect: Multiple installations found. Pass --installation <id>.");
336
+ log.error("connect: Multiple installations found. Pass --installation <id>.");
251
337
  process.exit(1);
252
338
  } else {
253
- const picked = await Ee({
339
+ const picked = await select({
254
340
  message: "Select a GitHub App installation:",
255
341
  options: installations.map((i) => ({
256
342
  value: i.installation_id,
257
343
  label: `${i.account_login} (${i.account_type}) [id: ${i.installation_id}]`
258
344
  }))
259
345
  });
260
- if (q(picked)) {
261
- me("Cancelled.");
346
+ if (isCancel(picked)) {
347
+ cancel("Cancelled.");
262
348
  process.exit(0);
263
349
  }
264
350
  installation = installations.find((i) => i.installation_id === picked);
@@ -266,44 +352,44 @@ async function runConnect(root, client, args) {
266
352
  let repoFullName;
267
353
  if (args.repo) repoFullName = args.repo;
268
354
  else if (installation.repository_selection === "selected") if (installation.repositories.length === 0) {
269
- R.error("connect: The installation has no accessible repositories. Update the GitHub App install to grant access.");
355
+ log.error("connect: The installation has no accessible repositories. Update the GitHub App install to grant access.");
270
356
  process.exit(1);
271
357
  } else if (installation.repositories.length === 1) repoFullName = installation.repositories[0].full_name;
272
358
  else if (!isTTY) {
273
- R.error("connect: Multiple repositories available. Pass --repo <owner/repo>.");
359
+ log.error("connect: Multiple repositories available. Pass --repo <owner/repo>.");
274
360
  process.exit(1);
275
361
  } else {
276
- const picked = await Ee({
362
+ const picked = await select({
277
363
  message: "Select a repository:",
278
364
  options: installation.repositories.map((r) => ({
279
365
  value: r.full_name,
280
366
  label: r.full_name
281
367
  }))
282
368
  });
283
- if (q(picked)) {
284
- me("Cancelled.");
369
+ if (isCancel(picked)) {
370
+ cancel("Cancelled.");
285
371
  process.exit(0);
286
372
  }
287
373
  repoFullName = picked;
288
374
  }
289
375
  else {
290
376
  if (!isTTY) {
291
- R.error("connect: --repo <owner/repo> is required in non-interactive mode for an all-repositories installation.");
377
+ log.error("connect: --repo <owner/repo> is required in non-interactive mode for an all-repositories installation.");
292
378
  process.exit(1);
293
379
  }
294
380
  const gitDefault = parseGithubRepoFullName(collectGitDeployMetadata(root, null).repositoryUrl);
295
- const input = await Re({
381
+ const input = await text({
296
382
  message: "Repository (owner/repo):",
297
383
  placeholder: gitDefault ?? "owner/repo",
298
384
  initialValue: gitDefault ?? ""
299
385
  });
300
- if (q(input)) {
301
- me("Cancelled.");
386
+ if (isCancel(input)) {
387
+ cancel("Cancelled.");
302
388
  process.exit(0);
303
389
  }
304
390
  repoFullName = input.trim();
305
391
  if (!repoFullName) {
306
- R.error("connect: Repository is required.");
392
+ log.error("connect: Repository is required.");
307
393
  process.exit(1);
308
394
  }
309
395
  }
@@ -311,16 +397,16 @@ async function runConnect(root, client, args) {
311
397
  let branch;
312
398
  if (args.branch) branch = args.branch;
313
399
  else if (!isTTY) {
314
- R.error("connect: --branch is required in non-interactive mode. Pass --branch <name>.");
400
+ log.error("connect: --branch is required in non-interactive mode. Pass --branch <name>.");
315
401
  process.exit(1);
316
402
  } else {
317
- const input = await Re({
403
+ const input = await text({
318
404
  message: "Branch to deploy from:",
319
405
  placeholder: branchDefault,
320
406
  initialValue: branchDefault
321
407
  });
322
- if (q(input)) {
323
- me("Cancelled.");
408
+ if (isCancel(input)) {
409
+ cancel("Cancelled.");
324
410
  process.exit(0);
325
411
  }
326
412
  branch = input.trim() || branchDefault;
@@ -329,7 +415,7 @@ async function runConnect(root, client, args) {
329
415
  if (args.executor !== void 0) executor = args.executor;
330
416
  else if (!isTTY) executor = "container";
331
417
  else {
332
- const picked = await Ee({
418
+ const picked = await select({
333
419
  message: "Build executor:",
334
420
  options: [{
335
421
  value: "container",
@@ -342,15 +428,15 @@ async function runConnect(root, client, args) {
342
428
  }],
343
429
  initialValue: "container"
344
430
  });
345
- if (q(picked)) {
346
- me("Cancelled.");
431
+ if (isCancel(picked)) {
432
+ cancel("Cancelled.");
347
433
  process.exit(0);
348
434
  }
349
435
  executor = picked;
350
436
  }
351
437
  let workflowPath = args.workflowPath;
352
438
  if (executor === "github_actions" && args.workflowPath === void 0 && isTTY) {
353
- const input = await Re({
439
+ const input = await text({
354
440
  message: "Deploy workflow file:",
355
441
  placeholder: DEFAULT_WORKFLOW_PATH,
356
442
  initialValue: DEFAULT_WORKFLOW_PATH,
@@ -360,45 +446,65 @@ async function runConnect(root, client, args) {
360
446
  return "Must be under .github/workflows/, end in .yml/.yaml, and not contain \"..\".";
361
447
  }
362
448
  });
363
- if (q(input)) {
364
- me("Cancelled.");
449
+ if (isCancel(input)) {
450
+ cancel("Cancelled.");
365
451
  process.exit(0);
366
452
  }
367
453
  const chosen = input.trim() || ".github/workflows/void-deploy.yml";
368
454
  if (chosen !== ".github/workflows/void-deploy.yml") workflowPath = chosen;
369
455
  }
456
+ const attemptConnect = (extra) => client.connectGithub(projectId, {
457
+ installationId: installation.installation_id,
458
+ repoFullName,
459
+ branch,
460
+ buildExecutor: executor,
461
+ workflowPath,
462
+ ...extra
463
+ });
370
464
  let connection;
371
465
  try {
372
- connection = await client.connectGithub(projectId, {
373
- installationId: installation.installation_id,
374
- repoFullName,
375
- branch,
376
- buildExecutor: executor,
377
- workflowPath
378
- });
466
+ connection = await attemptConnect();
379
467
  } catch (err) {
380
- if (err instanceof PlatformApiError) {
468
+ if (!(err instanceof PlatformApiError)) throw err;
469
+ if (err.status === 403 && err.code === "connect_authorization_required") {
470
+ if (!isTTY) {
471
+ log.error("connect: this installation requires per-repo authorization, which needs an interactive browser sign-in. Run `void github connect` locally to authorize, then retry.");
472
+ process.exit(1);
473
+ }
474
+ const grant = await runGithubConnectAuthorize(client, installation.installation_id, repoFullName);
475
+ try {
476
+ connection = await attemptConnect({
477
+ connectGrant: grant.connectGrant,
478
+ codeVerifier: grant.codeVerifier
479
+ });
480
+ } catch (retryErr) {
481
+ if (retryErr instanceof PlatformApiError && retryErr.status === 403) {
482
+ log.error("connect: GitHub authorization failed or expired. Run `void github connect` again.");
483
+ process.exit(1);
484
+ }
485
+ throw retryErr;
486
+ }
487
+ } else {
381
488
  const body = parsePlatformErrorBody(err.body);
382
489
  const code = body?.error ?? body?.message ?? "";
383
490
  const message = describeConnectError(err.status, code);
384
491
  if (message !== null) {
385
- R.error(`connect: ${message}`);
492
+ log.error(`connect: ${message}`);
386
493
  process.exit(1);
387
494
  }
388
495
  throw err;
389
496
  }
390
- throw err;
391
497
  }
392
498
  if (workflowPath !== void 0 && connection.workflow_path !== workflowPath) {
393
- R.error(`connect: server did not apply workflow path ${workflowPath} (got ${connection.workflow_path ?? "none"}). The platform may be too old to support a custom workflow path.`);
499
+ log.error(`connect: server did not apply workflow path ${workflowPath} (got ${connection.workflow_path ?? "none"}). The platform may be too old to support a custom workflow path.`);
394
500
  process.exit(1);
395
501
  }
396
- R.success(`Connected ${repoFullName} (${branch}) → project. Push to ${branch} to deploy.`);
502
+ log.success(`Connected ${repoFullName} (${branch}) → project. Push to ${branch} to deploy.`);
397
503
  }
398
504
  async function runGithubUpdate(root, client, args) {
399
505
  const isTTY = process.stdin.isTTY === true;
400
506
  if (!isTTY && args.branch === void 0 && args.executor === void 0 && args.workflowPath === void 0) {
401
- R.error("update: Nothing to update. Pass --branch <name>, --executor <container|github_actions>, and/or --workflow <.github/workflows/...>.");
507
+ log.error("update: Nothing to update. Pass --branch <name>, --executor <container|github_actions>, and/or --workflow <.github/workflows/...>.");
402
508
  process.exit(1);
403
509
  }
404
510
  let projectId;
@@ -406,7 +512,7 @@ async function runGithubUpdate(root, client, args) {
406
512
  if (requestedSlug) {
407
513
  const resolved = resolveProjectBySlug(await client.listProjects(), requestedSlug);
408
514
  if (!resolved) {
409
- R.error(`update: No project found with slug '${requestedSlug}'.`);
515
+ log.error(`update: No project found with slug '${requestedSlug}'.`);
410
516
  process.exit(1);
411
517
  }
412
518
  projectId = resolved.projectId;
@@ -414,23 +520,23 @@ async function runGithubUpdate(root, client, args) {
414
520
  const linked = readProjectConfig(root);
415
521
  if (linked) projectId = linked.projectId;
416
522
  else if (!isTTY) {
417
- R.error("update: No project specified. Pass a project name or --project <name>, set VOID_PROJECT, or link one with `void project link`.");
523
+ log.error("update: No project specified. Pass a project name or --project <name>, set VOID_PROJECT, or link one with `void project link`.");
418
524
  process.exit(1);
419
525
  } else {
420
526
  const projects = await client.listProjects();
421
527
  if (projects.length === 0) {
422
- R.error("No projects found. Create one first with `void deploy`.");
528
+ log.error("No projects found. Create one first with `void deploy`.");
423
529
  process.exit(1);
424
530
  }
425
- const picked = await Ee({
531
+ const picked = await select({
426
532
  message: "Select a project:",
427
533
  options: projects.map((p) => ({
428
534
  value: p.id,
429
535
  label: p.slug
430
536
  }))
431
537
  });
432
- if (q(picked)) {
433
- me("Cancelled.");
538
+ if (isCancel(picked)) {
539
+ cancel("Cancelled.");
434
540
  process.exit(0);
435
541
  }
436
542
  projectId = picked;
@@ -445,7 +551,7 @@ async function runGithubUpdate(root, client, args) {
445
551
  const code = body?.error ?? body?.message ?? "";
446
552
  const message = describeUpdateError(err.status, code);
447
553
  if (message !== null) {
448
- R.error(`update: ${message}`);
554
+ log.error(`update: ${message}`);
449
555
  process.exit(1);
450
556
  }
451
557
  }
@@ -457,20 +563,20 @@ async function runGithubUpdate(root, client, args) {
457
563
  if (isTTY) {
458
564
  if (args.branch !== void 0) branch = args.branch;
459
565
  else {
460
- const input = await Re({
566
+ const input = await text({
461
567
  message: "Branch to deploy from:",
462
568
  placeholder: current.branch,
463
569
  initialValue: current.branch
464
570
  });
465
- if (q(input)) {
466
- me("Cancelled.");
571
+ if (isCancel(input)) {
572
+ cancel("Cancelled.");
467
573
  process.exit(0);
468
574
  }
469
575
  branch = input.trim() || current.branch;
470
576
  }
471
577
  if (args.executor !== void 0) executor = args.executor;
472
578
  else {
473
- const picked = await Ee({
579
+ const picked = await select({
474
580
  message: "Build executor:",
475
581
  options: [{
476
582
  value: "container",
@@ -481,14 +587,14 @@ async function runGithubUpdate(root, client, args) {
481
587
  }],
482
588
  initialValue: current.build_executor
483
589
  });
484
- if (q(picked)) {
485
- me("Cancelled.");
590
+ if (isCancel(picked)) {
591
+ cancel("Cancelled.");
486
592
  process.exit(0);
487
593
  }
488
594
  executor = picked;
489
595
  }
490
596
  if (executor === "github_actions" && args.workflowPath === void 0) {
491
- const input = await Re({
597
+ const input = await text({
492
598
  message: "Deploy workflow file:",
493
599
  placeholder: current.workflow_path,
494
600
  initialValue: current.workflow_path,
@@ -498,8 +604,8 @@ async function runGithubUpdate(root, client, args) {
498
604
  return "Must be under .github/workflows/, end in .yml/.yaml, and not contain \"..\".";
499
605
  }
500
606
  });
501
- if (q(input)) {
502
- me("Cancelled.");
607
+ if (isCancel(input)) {
608
+ cancel("Cancelled.");
503
609
  process.exit(0);
504
610
  }
505
611
  workflowPath = input.trim() || current.workflow_path;
@@ -513,7 +619,7 @@ async function runGithubUpdate(root, client, args) {
513
619
  if (executor !== current.build_executor) patch.buildExecutor = executor;
514
620
  if (workflowPath !== current.workflow_path) patch.workflowPath = workflowPath;
515
621
  if (patch.branch === void 0 && patch.buildExecutor === void 0 && patch.workflowPath === void 0) {
516
- R.info(`No changes. ${current.repo_full_name} already deploys from ${current.branch} via ${current.build_executor}.`);
622
+ log.info(`No changes. ${current.repo_full_name} already deploys from ${current.branch} via ${current.build_executor}.`);
517
623
  return;
518
624
  }
519
625
  let updated;
@@ -525,7 +631,7 @@ async function runGithubUpdate(root, client, args) {
525
631
  const code = body?.error ?? body?.message ?? "";
526
632
  const message = describeUpdateError(err.status, code);
527
633
  if (message !== null) {
528
- R.error(`update: ${message}`);
634
+ log.error(`update: ${message}`);
529
635
  process.exit(1);
530
636
  }
531
637
  throw err;
@@ -533,10 +639,10 @@ async function runGithubUpdate(root, client, args) {
533
639
  throw err;
534
640
  }
535
641
  if (patch.workflowPath !== void 0 && updated.workflow_path !== patch.workflowPath) {
536
- R.error(`update: server did not apply workflow path ${patch.workflowPath} (got ${updated.workflow_path ?? "none"}). The platform may be too old to support a custom workflow path.`);
642
+ log.error(`update: server did not apply workflow path ${patch.workflowPath} (got ${updated.workflow_path ?? "none"}). The platform may be too old to support a custom workflow path.`);
537
643
  process.exit(1);
538
644
  }
539
- R.success(`Updated ${updated.repo_full_name} → branch ${updated.branch}, executor ${updated.build_executor}, workflow ${updated.workflow_path}.`);
645
+ log.success(`Updated ${updated.repo_full_name} → branch ${updated.branch}, executor ${updated.build_executor}, workflow ${updated.workflow_path}.`);
540
646
  }
541
647
  /**
542
648
  * `void github status [project]` — print the current GitHub connection (repo,
@@ -551,7 +657,7 @@ async function runStatus(root, client, args) {
551
657
  if (requestedSlug) {
552
658
  const resolved = resolveProjectBySlug(await client.listProjects(), requestedSlug);
553
659
  if (!resolved) {
554
- R.error(`status: No project found with slug '${requestedSlug}'.`);
660
+ log.error(`status: No project found with slug '${requestedSlug}'.`);
555
661
  process.exit(1);
556
662
  }
557
663
  projectId = resolved.projectId;
@@ -559,23 +665,23 @@ async function runStatus(root, client, args) {
559
665
  const linked = readProjectConfig(root);
560
666
  if (linked) projectId = linked.projectId;
561
667
  else if (!isTTY) {
562
- R.error("status: No project specified. Pass a project name or --project <name>, set VOID_PROJECT, or link one with `void project link`.");
668
+ log.error("status: No project specified. Pass a project name or --project <name>, set VOID_PROJECT, or link one with `void project link`.");
563
669
  process.exit(1);
564
670
  } else {
565
671
  const projects = await client.listProjects();
566
672
  if (projects.length === 0) {
567
- R.error("No projects found. Create one first with `void deploy`.");
673
+ log.error("No projects found. Create one first with `void deploy`.");
568
674
  process.exit(1);
569
675
  }
570
- const picked = await Ee({
676
+ const picked = await select({
571
677
  message: "Select a project:",
572
678
  options: projects.map((p) => ({
573
679
  value: p.id,
574
680
  label: p.slug
575
681
  }))
576
682
  });
577
- if (q(picked)) {
578
- me("Cancelled.");
683
+ if (isCancel(picked)) {
684
+ cancel("Cancelled.");
579
685
  process.exit(0);
580
686
  }
581
687
  projectId = picked;
@@ -590,13 +696,13 @@ async function runStatus(root, client, args) {
590
696
  const code = body?.error ?? body?.message ?? "";
591
697
  const message = describeUpdateError(err.status, code);
592
698
  if (message !== null) {
593
- R.error(`status: ${message}`);
699
+ log.error(`status: ${message}`);
594
700
  process.exit(1);
595
701
  }
596
702
  }
597
703
  throw err;
598
704
  }
599
- R.message(formatConnection(connection));
705
+ log.message(formatConnection(connection));
600
706
  }
601
707
  //#endregion
602
708
  export { runGithubCommand };
@@ -1,7 +1,6 @@
1
- import { n as HeadDescriptor } from "./head-eOUCWUNy.mjs";
2
- import { r as AuthUser, t as AuthSession } from "./auth-Dz2CCn4T.mjs";
3
- import { t as StandardSchemaV1 } from "./standard-schema-Cy0lfeWv.mjs";
4
- import * as _$_cloudflare_sandbox0 from "@cloudflare/sandbox";
1
+ import { n as HeadDescriptor } from "./head-nmvOgFjd.mjs";
2
+ import { r as AuthUser, t as AuthSession } from "./auth-qgMlYp7Z.mjs";
3
+ import { t as StandardSchemaV1 } from "./standard-schema-DJ0HW7QP.mjs";
5
4
  import { Context, Env, MiddlewareHandler } from "hono";
6
5
  import { RewriteDestination } from "void/routes";
7
6
 
@@ -95,7 +94,7 @@ interface CloudBindings {
95
94
  KV: KVNamespace;
96
95
  STORAGE: R2Bucket;
97
96
  AI: Ai;
98
- SANDBOX: DurableObjectNamespace<_$_cloudflare_sandbox0.Sandbox>;
97
+ SANDBOX: DurableObjectNamespace<import("@cloudflare/sandbox").Sandbox>;
99
98
  [key: string]: unknown;
100
99
  }
101
100
  type CloudEnv = Env & {
@@ -1,6 +1,6 @@
1
- import { a as join } from "./pathe.M-eThtNZ-BrPhGF_K.mjs";
2
- import { a as convertRedirectsConfig, d as parseHostPrefixedSource, i as convertHeadersConfig, o as convertRewritesConfig, r as convertFallbacksConfig, s as countSplats, t as VALID_REDIRECT_STATUSES, u as isProtocolRelative } from "./config-8dLIngKW.mjs";
3
- import { i as voidWarn } from "./log-BdD_Fpms.mjs";
1
+ import { a as join } from "./pathe.M-eThtNZ-CQzLbt4c.mjs";
2
+ import { a as convertRedirectsConfig, d as parseHostPrefixedSource, i as convertHeadersConfig, o as convertRewritesConfig, r as convertFallbacksConfig, s as countSplats, t as VALID_REDIRECT_STATUSES, u as isProtocolRelative } from "./config-1twldYCW.mjs";
3
+ import { i as voidWarn } from "./log-ChfPKsVd.mjs";
4
4
  import { existsSync, readFileSync } from "node:fs";
5
5
  //#region src/cli/headers.ts
6
6
  /**
package/dist/index.d.mts CHANGED
@@ -1,6 +1,6 @@
1
- import { n as HeadDescriptor } from "./head-eOUCWUNy.mjs";
2
- import { r as AuthUser } from "./auth-Dz2CCn4T.mjs";
3
- import { C as defer, E as ValidatorSlots, S as InferProps, T as HandlerInput, _ as defineQueue, a as CloudEnv, b as Deferred, c as QueueRetryOptions, d as TypedQueueHandler, f as VoidAssetRewriteError, g as defineMiddleware, h as defineHead, i as CloudContextVariables, l as RenderAssetTags, m as defineHandler, o as QueueBatch, p as basicAuth, r as CloudContext, s as QueueMessage, t as BasicAuthOptions, u as TypedHandler, v as defineRender, x as DeferredState, y as defineScheduled } from "./handler-B7rCOy21.mjs";
1
+ import { n as HeadDescriptor } from "./head-nmvOgFjd.mjs";
2
+ import { r as AuthUser } from "./auth-qgMlYp7Z.mjs";
3
+ import { C as defer, E as ValidatorSlots, S as InferProps, T as HandlerInput, _ as defineQueue, a as CloudEnv, b as Deferred, c as QueueRetryOptions, d as TypedQueueHandler, f as VoidAssetRewriteError, g as defineMiddleware, h as defineHead, i as CloudContextVariables, l as RenderAssetTags, m as defineHandler, o as QueueBatch, p as basicAuth, r as CloudContext, s as QueueMessage, t as BasicAuthOptions, u as TypedHandler, v as defineRender, x as DeferredState, y as defineScheduled } from "./handler-imD0UVDT.mjs";
4
4
  import { QueueMap } from "./runtime/queues.mjs";
5
5
  import { PluginConfig } from "@cloudflare/vite-plugin";
6
6
  import { Plugin } from "vite";