void 0.10.10 → 0.10.11

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 (103) hide show
  1. package/AGENT_PROMPT.md +4 -0
  2. package/README.md +1 -1
  3. package/dist/{agents-Bmr5tFFb.mjs → agents-CtgBYqld.mjs} +1 -1
  4. package/dist/{auth-cmd-Cw1edJdZ.mjs → auth-cmd-BqsdZJp5.mjs} +3 -3
  5. package/dist/{better-auth-shared-BvnM9px6.d.mts → better-auth-shared-DealXecJ.d.mts} +1 -1
  6. package/dist/{build-cmd-C6kNDJBv.mjs → build-cmd-Bujrv5q-.mjs} +3 -3
  7. package/dist/{cache-DIUSnIjJ.mjs → cache-C11V8Fxq.mjs} +3 -3
  8. package/dist/{cancel-deploy-BosnzEHC.mjs → cancel-deploy-fwFYF04b.mjs} +2 -2
  9. package/dist/cli/cli.mjs +124 -41
  10. package/dist/cli/env-schema-probe.d.mts +96 -0
  11. package/dist/cli/env-schema-probe.mjs +272 -0
  12. package/dist/{client-C9FG6Vzc.mjs → client-Gb71-XkG.mjs} +12 -2
  13. package/dist/{config-BdUctCZD.mjs → config-CutEMNGJ.mjs} +3 -3
  14. package/dist/{config-BcAeIPe3.mjs → config-E03l1C_h.mjs} +2 -2
  15. package/dist/{create-project-CjYX23M_.mjs → create-project-DsYvl3TB.mjs} +3 -3
  16. package/dist/{db-BvKV34IK.mjs → db-PZBsLSGb.mjs} +27 -27
  17. package/dist/{delete-CThKLXfi.mjs → delete-mh6p-zkQ.mjs} +3 -3
  18. package/dist/deploy-DT8wsPZd.mjs +6990 -0
  19. package/dist/{discover-BuVVSAum.mjs → discover-CJHyvYfR.mjs} +2 -2
  20. package/dist/dist-DaKKDf8D.mjs +41 -0
  21. package/dist/{domain-DMrBabBQ.mjs → domain-DiaNQbrl.mjs} +2 -2
  22. package/dist/entry-D7yy4xVH.mjs +100 -0
  23. package/dist/{env-BfG7O71F.mjs → env-AAHU02L6.mjs} +5 -5
  24. package/dist/env-mask-Dd47NbR6.mjs +90 -0
  25. package/dist/env-public-BfiLcMBk.d.mts +140 -0
  26. package/dist/{env-types-D51bnR-c.mjs → env-types-QBj-ndax.mjs} +2 -2
  27. package/dist/env-validation-BdDlGhbN.mjs +1069 -0
  28. package/dist/{gen-Bee261SV.mjs → gen-oup1xBN0.mjs} +8 -8
  29. package/dist/{github-cmd-DfeFEasr.mjs → github-cmd-BdNaOVNa.mjs} +3 -3
  30. package/dist/{handler-imD0UVDT.d.mts → handler-Cjh8uM3Y.d.mts} +1 -1
  31. package/dist/{headers-CTAjX-UO.mjs → headers-BQknpzkn.mjs} +2 -2
  32. package/dist/index.d.mts +1 -1
  33. package/dist/index.mjs +41 -33
  34. package/dist/{init-xfwW7cLp.mjs → init-Dl2PKuQn.mjs} +13 -14
  35. package/dist/{link-Co136MEs.mjs → link-CdGHSIy-.mjs} +4 -4
  36. package/dist/{list-BKDjA3M5.mjs → list-CPwFDZ_c.mjs} +3 -3
  37. package/dist/{login-CrOTnR_6.mjs → login-BT3H8PN3.mjs} +2 -2
  38. package/dist/{logs-DlAg25ww.mjs → logs-Bt313ax7.mjs} +3 -2
  39. package/dist/{mcp-BNjMGMB0.mjs → mcp-DoM3_nhd.mjs} +7 -2
  40. package/dist/{node-CnE-SZCk.mjs → node-BDx8pmhq.mjs} +5 -5
  41. package/dist/{package-json-B0NuUWGd.mjs → package-json-Cx1osYo6.mjs} +1 -1
  42. package/dist/pages/client.d.mts +1 -1
  43. package/dist/pages/index.d.mts +1 -23
  44. package/dist/pages/index.mjs +5 -5
  45. package/dist/pages/islands-plugin.mjs +2 -2
  46. package/dist/pages/protocol.d.mts +2 -2
  47. package/dist/{plugin-inference-CJxi_fWI.mjs → plugin-inference-DMeavIJ6.mjs} +4 -98
  48. package/dist/{prepare-BRyC4TCC.mjs → prepare-DOBTY0o4.mjs} +10 -10
  49. package/dist/preset-BGrvB4Bl.mjs +539 -0
  50. package/dist/{project-cmd-B2bcKefD.mjs → project-cmd-D_w-4w5B.mjs} +13 -9
  51. package/dist/{project-paths-tpdR1mJR.mjs → project-paths-BQd7OmIo.mjs} +1 -1
  52. package/dist/project-paths-GpziKeQQ.d.mts +25 -0
  53. package/dist/{project-tsconfig-D9uSVVpA.mjs → project-tsconfig-B-QtXjLQ.mjs} +2 -2
  54. package/dist/{protocol-6hTJ04T1.d.mts → protocol-Bnb0LFp3.d.mts} +1 -1
  55. package/dist/provision-BLrCEBbI.mjs +2557 -0
  56. package/dist/requests-B8sZxaFM.mjs +50 -0
  57. package/dist/{resolve-project-D2HI3TrG.mjs → resolve-project-BBMtLLV9.mjs} +1 -1
  58. package/dist/{rollback-9dfmB-YZ.mjs → rollback-CkvTFXx5.mjs} +2 -2
  59. package/dist/{route-types-CfKfhbIg.mjs → route-types-COI2DsZv.mjs} +2 -2
  60. package/dist/{runner-h272wcPj.mjs → runner-kapo9aPs.mjs} +3 -3
  61. package/dist/{runner-pg-waxJOnBb.mjs → runner-pg-CHM76xuC.mjs} +1 -1
  62. package/dist/runtime/better-auth-pg.d.mts +1 -1
  63. package/dist/runtime/better-auth.d.mts +1 -1
  64. package/dist/runtime/env-public.d.mts +1 -139
  65. package/dist/runtime/env-public.mjs +2 -90
  66. package/dist/runtime/handler.d.mts +1 -1
  67. package/dist/runtime/live.d.mts +1 -1
  68. package/dist/runtime/validator.d.mts +1 -1
  69. package/dist/runtime/ws-server.d.mts +1 -1
  70. package/dist/runtime/ws.d.mts +2 -2
  71. package/dist/{scan-Dp_Gyzs3.mjs → scan-DEwlM_Xy.mjs} +2 -2
  72. package/dist/{scan-i7Yz54fv.mjs → scan-DYXkrasO.mjs} +4 -4
  73. package/dist/{secret-DeMnMcV0.mjs → secret-Dt32J6RI.mjs} +3 -3
  74. package/dist/{skills-DsdNDtX3.mjs → skills-CLjN0uUO.mjs} +2 -2
  75. package/dist/{subcommand-prompt-DtES-oP6.mjs → subcommand-prompt-BzV8iQZo.mjs} +1 -1
  76. package/dist/sveltekit.mjs +1 -1
  77. package/dist/{validate-DT7nFMlf.mjs → validate-Cw_RLeTj.mjs} +1 -1
  78. package/dist/{yarn-pnp-CW8LB6g_.mjs → yarn-pnp-DJn3SAHF.mjs} +1 -1
  79. package/getting-started-prompt.txt +3 -1
  80. package/package.json +5 -3
  81. package/skills/void/SKILL.md +34 -33
  82. package/skills/void/docs/guide/auth.md +8 -0
  83. package/skills/void/docs/guide/deployment.md +1 -1
  84. package/skills/void/docs/guide/env-vars.md +14 -6
  85. package/skills/void/docs/guide/queues.md +4 -0
  86. package/skills/void/docs/integrations/cloudflare.md +64 -5
  87. package/skills/void/docs/node_modules/void/AGENT_PROMPT.md +4 -0
  88. package/skills/void/docs/node_modules/void/README.md +1 -1
  89. package/skills/void/docs/node_modules/void/node_modules/@types/proper-lockfile/README.md +51 -0
  90. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/pathslash/README.md +64 -0
  91. package/skills/void/docs/node_modules/void/node_modules/pathslash/README.md +64 -0
  92. package/skills/void/docs/node_modules/void/node_modules/proper-lockfile/CHANGELOG.md +108 -0
  93. package/skills/void/docs/node_modules/void/node_modules/proper-lockfile/README.md +183 -0
  94. package/skills/void/docs/node_modules/void/skills/void/SKILL.md +34 -33
  95. package/skills/void/docs/node_modules/void/test/e2e/README.md +85 -0
  96. package/skills/void/docs/reference/cli.md +74 -14
  97. package/dist/deploy-B02JyKP9.mjs +0 -3748
  98. package/dist/dotenv-D_UbC_vc.mjs +0 -173
  99. package/dist/env-validation-CeC2FL66.mjs +0 -163
  100. package/dist/pathe.M-eThtNZ-CQzLbt4c.mjs +0 -150
  101. package/dist/preset-CVvwCeIy.mjs +0 -208
  102. package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/pathe/README.md +0 -73
  103. package/skills/void/docs/node_modules/void/node_modules/pathe/README.md +0 -73
package/AGENT_PROMPT.md CHANGED
@@ -12,4 +12,8 @@ Rewrites and redirects: declare static rules in `void.json` under `routing.redir
12
12
 
13
13
  Logs: surface app-level errors that should show up under `void project logs --level error` via `import { logger } from "void/log"` and `logger.error(msg, fields?)` (also `.warn` / `.info`). Anything caught and only persisted to your own DB is invisible to Cloudflare Tail; route it through `logger.*` or `console.*` so the platform can see it.
14
14
 
15
+ Requests: `void project logs` only has rows when a worker actually ran. 5xx generated by the edge router, and every request to a static/SPA project, produce no log line at all. Use `void project requests --status 5xx --range 12h` to see those — it lists status, method, and duration for every request the edge served, whether or not a worker was invoked.
16
+
17
+ Self-host deploy: `void deploy` targets the Void platform; to deploy to the user's OWN Cloudflare account instead, use `void deploy --backend cloudflare` (add `--provision` on the first deploy to create the D1/KV/R2/Queues/Hyperdrive resources the source needs). It uses local wrangler auth, so pin an account (`account_id` in `wrangler.jsonc` or `CLOUDFLARE_ACCOUNT_ID`) and keep real secrets in `wrangler secret put` — every `.env*` file this backend loads (`.env`, `.env.local`, `.env.production`, `.env.production.local`) ships as plaintext worker vars, `.local` included. Provisioning a Hyperdrive config reads `DATABASE_URL` from the shell, not from `.env*`. v1 supports full Void apps on the Cloudflare Workers target only (D1/KV/R2/Queues/Hyperdrive; auth and ISR on D1/SQLite); framework SSR of every kind (TanStack Start, React Router, vinext, SvelteKit, Nuxt, Analog, Astro), static/SPA/SSG apps (including `output: "static"`), WebSocket/Durable Object apps (`*.ws.ts`), a custom `migrations_pattern`, node/bun/deno targets, and PostgreSQL apps with auth all fail closed with guidance. Auth apps must ship checked-in migrations that produce the Better Auth schema. `--provision` is a single-operator, dev-machine step and is disabled in CI.
18
+
15
19
  Full docs are in `node_modules/void/docs/`. If you have the `void` skill available, use it for a complete API reference covering project structure, routing, pages mode, database, auth, typed fetch, KV, storage, queues, cron jobs, CLI, configuration, and deployment.
package/README.md CHANGED
@@ -42,7 +42,7 @@ export default defineConfig({
42
42
  - `void auth login` — platform auth
43
43
  - `void deploy` — build and deploy
44
44
  - `void db *` — local DB and migration commands
45
- - `void project *` — link, status, logs, rollback, delete
45
+ - `void project *` — link, status, logs, requests, rollback, delete
46
46
 
47
47
  Runtime helpers include:
48
48
 
@@ -1,5 +1,5 @@
1
1
  import { n as __exportAll, r as __toESM, t as __commonJSMin } from "./rolldown-runtime-DJK8HYOj.mjs";
2
- import { a as join } from "./pathe.M-eThtNZ-CQzLbt4c.mjs";
2
+ import { a as join } from "./dist-DaKKDf8D.mjs";
3
3
  import { existsSync, readFileSync } from "node:fs";
4
4
  import { fileURLToPath } from "node:url";
5
5
  import { styleText } from "node:util";
@@ -1,6 +1,6 @@
1
- import { T as log } from "./agents-Bmr5tFFb.mjs";
2
- import { f as getToken, g as removeToken, n as PlatformClient } from "./client-C9FG6Vzc.mjs";
3
- import { n as runLoginCommand } from "./login-CrOTnR_6.mjs";
1
+ import { T as log } from "./agents-CtgBYqld.mjs";
2
+ import { f as getToken, g as removeToken, n as PlatformClient } from "./client-Gb71-XkG.mjs";
3
+ import { n as runLoginCommand } from "./login-BT3H8PN3.mjs";
4
4
  import { execSync } from "node:child_process";
5
5
  //#region src/cli/auth-cmd.ts
6
6
  async function runAuthCommand(root, args) {
@@ -1,5 +1,5 @@
1
- import { i as VoidAuthConfig, n as AuthState } from "./auth-qgMlYp7Z.mjs";
2
1
  import { t as VoidAuthProvider } from "./providers-BNKRacMr.mjs";
2
+ import { i as VoidAuthConfig, n as AuthState } from "./auth-qgMlYp7Z.mjs";
3
3
  import { DBFieldAttribute } from "better-auth/db";
4
4
  import { BetterAuthOptions, betterAuth } from "better-auth";
5
5
  import { Context } from "hono";
@@ -1,6 +1,6 @@
1
- import { D as outro, T as log, a as cliTitle, s as dim, u as import_picocolors, w as intro } from "./agents-Bmr5tFFb.mjs";
2
- import { b as readProjectConfig, f as getToken, n as PlatformClient, t as PlatformApiError } from "./client-C9FG6Vzc.mjs";
3
- import { r as resolveProjectBySlug, t as getRequestedProjectSlug } from "./resolve-project-D2HI3TrG.mjs";
1
+ import { D as outro, T as log, a as cliTitle, s as dim, u as import_picocolors, w as intro } from "./agents-CtgBYqld.mjs";
2
+ import { b as readProjectConfig, f as getToken, n as PlatformClient, t as PlatformApiError } from "./client-Gb71-XkG.mjs";
3
+ import { r as resolveProjectBySlug, t as getRequestedProjectSlug } from "./resolve-project-BBMtLLV9.mjs";
4
4
  import { appendFileSync, writeFileSync } from "node:fs";
5
5
  //#region src/cli/build-cmd.ts
6
6
  const POLL_MS = 1e3;
@@ -1,6 +1,6 @@
1
- import { D as outro, T as log, a as cliTitle, o as createSpinner, s as dim, w as intro } from "./agents-Bmr5tFFb.mjs";
2
- import { b as readProjectConfig, f as getToken, n as PlatformClient } from "./client-C9FG6Vzc.mjs";
3
- import { r as resolveProjectBySlug, t as getRequestedProjectSlug } from "./resolve-project-D2HI3TrG.mjs";
1
+ import { D as outro, T as log, a as cliTitle, o as createSpinner, s as dim, w as intro } from "./agents-CtgBYqld.mjs";
2
+ import { b as readProjectConfig, f as getToken, n as PlatformClient } from "./client-Gb71-XkG.mjs";
3
+ import { r as resolveProjectBySlug, t as getRequestedProjectSlug } from "./resolve-project-BBMtLLV9.mjs";
4
4
  //#region src/cli/cache.ts
5
5
  async function runPurgeCacheCommand(root, projectSlug) {
6
6
  console.log();
@@ -1,5 +1,5 @@
1
- import { D as outro, S as confirm, T as log, a as cliTitle, j as isCancel, w as intro } from "./agents-Bmr5tFFb.mjs";
2
- import { b as readProjectConfig, f as getToken, n as PlatformClient } from "./client-C9FG6Vzc.mjs";
1
+ import { D as outro, S as confirm, T as log, a as cliTitle, j as isCancel, w as intro } from "./agents-CtgBYqld.mjs";
2
+ import { b as readProjectConfig, f as getToken, n as PlatformClient } from "./client-Gb71-XkG.mjs";
3
3
  //#region src/cli/cancel-deploy.ts
4
4
  const ACTIVE_STATUSES = /* @__PURE__ */ new Set([
5
5
  "pending",
package/dist/cli/cli.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import { a as join } from "../pathe.M-eThtNZ-CQzLbt4c.mjs";
3
- import { D as outro, E as note, T as log, d as sectionTitle, i as categoryTitle, l as helpLine, r as getPackageDir, u as import_picocolors } from "../agents-Bmr5tFFb.mjs";
2
+ import { a as join } from "../dist-DaKKDf8D.mjs";
3
+ import { D as outro, E as note, T as log, d as sectionTitle, i as categoryTitle, l as helpLine, r as getPackageDir, u as import_picocolors } from "../agents-CtgBYqld.mjs";
4
4
  import { readFileSync } from "node:fs";
5
5
  import { parseArgs } from "node:util";
6
6
  //#region src/cli/args.ts
@@ -14,7 +14,9 @@ function parseDeployArgs(args) {
14
14
  dir: { type: "string" },
15
15
  spa: { type: "boolean" },
16
16
  "skip-build": { type: "boolean" },
17
- debug: { type: "boolean" }
17
+ debug: { type: "boolean" },
18
+ backend: { type: "string" },
19
+ provision: { type: "boolean" }
18
20
  },
19
21
  allowPositionals: true,
20
22
  strict: true,
@@ -22,22 +24,43 @@ function parseDeployArgs(args) {
22
24
  });
23
25
  } catch (error) {
24
26
  const message = error instanceof Error ? error.message : String(error);
25
- if (message.includes("argument missing") || message.includes("argument is ambiguous")) throw new Error("deploy: --project requires a slug.");
27
+ if (message.includes("argument missing") || message.includes("argument is ambiguous")) {
28
+ if (message.match(/Option '(--[a-z-]+)/)?.[1] === "--backend") throw new Error("deploy: --backend requires a value ('cloudflare').");
29
+ throw new Error("deploy: --project requires a slug.");
30
+ }
26
31
  const unknownOptionMatch = message.match(/Unknown option '([^']+)'/);
27
32
  if (unknownOptionMatch) throw new Error(`deploy: Unknown option '${unknownOptionMatch[1]}'.`);
28
33
  throw new Error(`deploy: ${message}.`);
29
34
  }
30
- if ((parsed.tokens ?? []).filter((token) => token.kind === "option" && token.name === "project").length > 1) throw new Error("deploy: --project can only be specified once.");
35
+ const tokens = parsed.tokens ?? [];
36
+ if (tokens.filter((token) => token.kind === "option" && token.name === "project").length > 1) throw new Error("deploy: --project can only be specified once.");
37
+ if (tokens.filter((token) => token.kind === "option" && token.name === "backend").length > 1) throw new Error("deploy: --backend can only be specified once.");
31
38
  if (parsed.positionals.length > 0) throw new Error(`deploy: Unexpected argument '${parsed.positionals[0]}'.`);
32
39
  const projectValue = parsed.values.project;
33
40
  const projectSlug = typeof projectValue === "string" ? projectValue : void 0;
34
41
  if (typeof projectSlug === "string" && projectSlug.startsWith("-")) throw new Error("deploy: --project requires a slug.");
42
+ const dir = typeof parsed.values.dir === "string" ? parsed.values.dir : void 0;
43
+ const spa = parsed.values.spa === true ? true : void 0;
44
+ const skipBuild = parsed.values["skip-build"] === true ? true : void 0;
45
+ const debug = parsed.values.debug === true ? true : void 0;
46
+ const backendValue = typeof parsed.values.backend === "string" ? parsed.values.backend : void 0;
47
+ if (backendValue !== void 0 && backendValue !== "cloudflare") throw new Error("deploy: --backend must be 'cloudflare'.");
48
+ const backend = backendValue;
49
+ const provision = parsed.values.provision === true ? true : void 0;
50
+ if (provision && backend !== "cloudflare") throw new Error("deploy: --provision requires --backend cloudflare.");
51
+ if (backend === "cloudflare") {
52
+ if (projectSlug !== void 0) throw new Error("deploy: --project is not supported with --backend cloudflare — this backend deploys to your own Cloudflare account and no Void project is involved.");
53
+ if (dir !== void 0) throw new Error("deploy: --dir is not supported with --backend cloudflare — this backend uploads the worker your build emits, not a static directory.");
54
+ if (spa) throw new Error("deploy: --spa is not supported with --backend cloudflare — this backend uploads the worker your build emits, not a static SPA.");
55
+ }
35
56
  return {
36
57
  projectSlug,
37
- dir: typeof parsed.values.dir === "string" ? parsed.values.dir : void 0,
38
- spa: parsed.values.spa === true ? true : void 0,
39
- skipBuild: parsed.values["skip-build"] === true ? true : void 0,
40
- debug: parsed.values.debug === true ? true : void 0
58
+ dir,
59
+ spa,
60
+ skipBuild,
61
+ debug,
62
+ backend,
63
+ provision
41
64
  };
42
65
  }
43
66
  //#endregion
@@ -884,7 +907,15 @@ const HELP_TREE = {
884
907
  },
885
908
  {
886
909
  command: "--skip-build",
887
- description: "Skip the build step and use existing output"
910
+ description: "Skip the build step and use existing output (not with --backend cloudflare)"
911
+ },
912
+ {
913
+ command: "--backend cloudflare",
914
+ description: "Deploy to your own Cloudflare account instead of the Void platform"
915
+ },
916
+ {
917
+ command: "--provision",
918
+ description: "Create missing D1/KV/R2/Queue/Hyperdrive resources (with --backend cloudflare)"
888
919
  },
889
920
  {
890
921
  command: "--debug",
@@ -903,6 +934,14 @@ const HELP_TREE = {
903
934
  {
904
935
  command: "void deploy --dir dist --spa",
905
936
  description: "Deploy a static SPA directory"
937
+ },
938
+ {
939
+ command: "void deploy --backend cloudflare",
940
+ description: "Deploy to your own Cloudflare account"
941
+ },
942
+ {
943
+ command: "void deploy --backend cloudflare --provision",
944
+ description: "Provision missing resources, then deploy to Cloudflare"
906
945
  }
907
946
  ]
908
947
  },
@@ -954,6 +993,10 @@ const HELP_TREE = {
954
993
  command: "logs",
955
994
  description: "Show runtime logs from the deployed project"
956
995
  },
996
+ {
997
+ command: "requests",
998
+ description: "Show request-level traffic (status, method, timing)"
999
+ },
957
1000
  {
958
1001
  command: "rollback [deployId]",
959
1002
  description: "Roll back to a previous deployment"
@@ -1011,6 +1054,24 @@ const HELP_TREE = {
1011
1054
  }
1012
1055
  ]
1013
1056
  },
1057
+ requests: {
1058
+ summary: "Show request-level traffic (status, method, type, timing). Surfaces 5xx that the edge router generated itself and requests to static/SPA projects that never invoke a worker — neither of which appears in `project logs`.",
1059
+ usage: ["void project requests [options]"],
1060
+ options: [{
1061
+ command: "--status <filter>",
1062
+ description: "Filter by status: a class like 5xx or an exact code like 500"
1063
+ }, {
1064
+ command: "--range <range>",
1065
+ description: "Time range to query (default: 1h)"
1066
+ }],
1067
+ examples: [{
1068
+ command: "void project requests --status 5xx",
1069
+ description: "Show recent server-error responses, including edge-generated ones"
1070
+ }, {
1071
+ command: "void project requests --range 24h",
1072
+ description: "Show all request traffic in the last day"
1073
+ }]
1074
+ },
1014
1075
  rollback: basicSubcommand("Roll back to a previous deployment.", "void project rollback [deployId]"),
1015
1076
  cancel: basicSubcommand("Cancel an active deployment.", "void project cancel [deployId]"),
1016
1077
  delete: {
@@ -1741,6 +1802,7 @@ const LOG_LEVELS = /* @__PURE__ */ new Set([
1741
1802
  "debug",
1742
1803
  "all"
1743
1804
  ]);
1805
+ const STATUS_FILTER = /^([1-5]xx|[1-5]\d{2}|all)$/;
1744
1806
  const projectSubcommands = [
1745
1807
  {
1746
1808
  name: "status",
@@ -1760,6 +1822,10 @@ const projectSubcommands = [
1760
1822
  name: "logs",
1761
1823
  description: "Show runtime logs from the deployed project"
1762
1824
  },
1825
+ {
1826
+ name: "requests",
1827
+ description: "Show request-level traffic (status, method, timing)"
1828
+ },
1763
1829
  {
1764
1830
  name: "rollback",
1765
1831
  arg: "[deployId]",
@@ -1825,6 +1891,21 @@ function parseProjectArgs(args) {
1825
1891
  level
1826
1892
  };
1827
1893
  }
1894
+ if (subcommand === "requests") {
1895
+ let status = "";
1896
+ let range = "1h";
1897
+ for (let i = 0; i < rest.length; i++) if (rest[i] === "--status" && rest[i + 1]) {
1898
+ const value = rest[++i];
1899
+ if (!STATUS_FILTER.test(value)) throw new Error(`project: Invalid --status '${value}'. Use a class like 5xx or an exact code like 500.`);
1900
+ status = value;
1901
+ } else if (rest[i] === "--range" && rest[i + 1]) range = rest[++i];
1902
+ else throw new Error(`project: Unexpected argument '${rest[i]}'.`);
1903
+ return {
1904
+ subcommand,
1905
+ status,
1906
+ range
1907
+ };
1908
+ }
1828
1909
  if (subcommand === "rollback") {
1829
1910
  const [deployId, extra] = rest;
1830
1911
  if (deployId?.startsWith("-")) throw new Error(`project: Unknown flag '${deployId}'.`);
@@ -1865,7 +1946,7 @@ function parseProjectArgs(args) {
1865
1946
  projectSlug
1866
1947
  };
1867
1948
  }
1868
- throw new Error("project: Usage: void project <status|link|list|logs|rollback|cancel|delete|purge-cache>.");
1949
+ throw new Error("project: Usage: void project <status|link|list|logs|requests|rollback|cancel|delete|purge-cache>.");
1869
1950
  }
1870
1951
  //#endregion
1871
1952
  //#region src/cli/secret-args.ts
@@ -1968,7 +2049,7 @@ async function runSubcommandGroup(command, subcommands, parse, run) {
1968
2049
  const sub = args[1];
1969
2050
  try {
1970
2051
  if ((!sub || sub.startsWith("-")) && process.stdin.isTTY) {
1971
- const { promptSubcommand } = await import("../subcommand-prompt-DtES-oP6.mjs");
2052
+ const { promptSubcommand } = await import("../subcommand-prompt-BzV8iQZo.mjs");
1972
2053
  const result = await promptSubcommand(command, subcommands);
1973
2054
  if (!result) process.exit(0);
1974
2055
  await run(root, parse(buildArgs(result, args.slice(1))));
@@ -1997,27 +2078,29 @@ else if (command === "deploy") {
1997
2078
  log.error(err instanceof Error ? err.message : String(err));
1998
2079
  process.exit(1);
1999
2080
  }
2000
- import("../deploy-B02JyKP9.mjs").then((n) => n.t).then(({ runDeploy }) => {
2081
+ import("../deploy-DT8wsPZd.mjs").then((n) => n.t).then(({ runDeploy }) => {
2001
2082
  runDeploy(root, {
2002
2083
  projectSlug: deployArgs.projectSlug,
2003
2084
  dir: deployArgs.dir,
2004
2085
  spa: deployArgs.spa,
2005
2086
  skipBuild: deployArgs.skipBuild,
2006
- debug: deployArgs.debug
2087
+ debug: deployArgs.debug,
2088
+ backend: deployArgs.backend,
2089
+ provision: deployArgs.provision
2007
2090
  }).catch((err) => {
2008
2091
  log.error(err.message ?? err);
2009
2092
  process.exit(1);
2010
2093
  });
2011
2094
  });
2012
- } else if (command === "auth") runSubcommandGroup("auth", authSubcommands, parseAuthArgs, (root, parsed) => import("../auth-cmd-Cw1edJdZ.mjs").then(({ runAuthCommand }) => runAuthCommand(root, parsed)));
2013
- else if (command === "project") runSubcommandGroup("project", projectSubcommands, parseProjectArgs, (root, parsed) => import("../project-cmd-B2bcKefD.mjs").then(({ runProjectCommand }) => runProjectCommand(root, parsed)));
2014
- else if (command === "secret") runSubcommandGroup("secret", secretSubcommands, parseSecretArgs, (root, parsed) => import("../secret-DeMnMcV0.mjs").then(({ runSecretCommand }) => runSecretCommand(root, parsed)));
2015
- else if (command === "domain") runSubcommandGroup("domain", domainSubcommands, parseDomainArgs, (root, parsed) => import("../domain-DMrBabBQ.mjs").then(({ runDomainCommand }) => runDomainCommand(root, parsed)));
2016
- else if (command === "db") runSubcommandGroup("db", dbSubcommands, parseDbArgs, (root, parsed) => import("../db-BvKV34IK.mjs").then(({ runDbCommand }) => runDbCommand(root, parsed)));
2017
- else if (command === "env") runSubcommandGroup("env", envSubcommands, parseEnvArgs, (root, parsed) => import("../env-BfG7O71F.mjs").then(({ runEnvCommand }) => runEnvCommand(root, parsed)));
2018
- else if (command === "gen") runSubcommandGroup("gen", genSubcommands, parseGenArgs, (root, parsed) => import("../gen-Bee261SV.mjs").then(({ runGenCommand }) => runGenCommand(root, parsed)));
2019
- else if (command === "github") runSubcommandGroup("github", githubSubcommands, parseGithubArgs, (root, parsed) => import("../github-cmd-DfeFEasr.mjs").then(({ runGithubCommand }) => runGithubCommand(root, parsed)));
2020
- else if (command === "build") runSubcommandGroup("build", buildSubcommands, parseBuildArgs, (root, parsed) => import("../build-cmd-C6kNDJBv.mjs").then(({ runBuildCommand }) => runBuildCommand(root, parsed)));
2095
+ } else if (command === "auth") runSubcommandGroup("auth", authSubcommands, parseAuthArgs, (root, parsed) => import("../auth-cmd-BqsdZJp5.mjs").then(({ runAuthCommand }) => runAuthCommand(root, parsed)));
2096
+ else if (command === "project") runSubcommandGroup("project", projectSubcommands, parseProjectArgs, (root, parsed) => import("../project-cmd-D_w-4w5B.mjs").then(({ runProjectCommand }) => runProjectCommand(root, parsed)));
2097
+ else if (command === "secret") runSubcommandGroup("secret", secretSubcommands, parseSecretArgs, (root, parsed) => import("../secret-Dt32J6RI.mjs").then(({ runSecretCommand }) => runSecretCommand(root, parsed)));
2098
+ else if (command === "domain") runSubcommandGroup("domain", domainSubcommands, parseDomainArgs, (root, parsed) => import("../domain-DiaNQbrl.mjs").then(({ runDomainCommand }) => runDomainCommand(root, parsed)));
2099
+ else if (command === "db") runSubcommandGroup("db", dbSubcommands, parseDbArgs, (root, parsed) => import("../db-PZBsLSGb.mjs").then(({ runDbCommand }) => runDbCommand(root, parsed)));
2100
+ else if (command === "env") runSubcommandGroup("env", envSubcommands, parseEnvArgs, (root, parsed) => import("../env-AAHU02L6.mjs").then(({ runEnvCommand }) => runEnvCommand(root, parsed)));
2101
+ else if (command === "gen") runSubcommandGroup("gen", genSubcommands, parseGenArgs, (root, parsed) => import("../gen-oup1xBN0.mjs").then(({ runGenCommand }) => runGenCommand(root, parsed)));
2102
+ else if (command === "github") runSubcommandGroup("github", githubSubcommands, parseGithubArgs, (root, parsed) => import("../github-cmd-BdNaOVNa.mjs").then(({ runGithubCommand }) => runGithubCommand(root, parsed)));
2103
+ else if (command === "build") runSubcommandGroup("build", buildSubcommands, parseBuildArgs, (root, parsed) => import("../build-cmd-Bujrv5q-.mjs").then(({ runBuildCommand }) => runBuildCommand(root, parsed)));
2021
2104
  else if (command === "prepare") {
2022
2105
  const root = process.cwd();
2023
2106
  let prepareArgs;
@@ -2027,7 +2110,7 @@ else if (command === "prepare") {
2027
2110
  log.error(err instanceof Error ? err.message : String(err));
2028
2111
  process.exit(1);
2029
2112
  }
2030
- import("../prepare-BRyC4TCC.mjs").then(({ runPrepareCommand }) => {
2113
+ import("../prepare-DOBTY0o4.mjs").then(({ runPrepareCommand }) => {
2031
2114
  runPrepareCommand(root, prepareArgs).catch((err) => {
2032
2115
  log.error(err.message ?? err);
2033
2116
  process.exit(1);
@@ -2035,7 +2118,7 @@ else if (command === "prepare") {
2035
2118
  });
2036
2119
  } else if (command === "init") {
2037
2120
  const root = process.cwd();
2038
- import("../init-xfwW7cLp.mjs").then(({ runInitCommand, parseInitArgs }) => {
2121
+ import("../init-Dl2PKuQn.mjs").then(({ runInitCommand, parseInitArgs }) => {
2039
2122
  let initArgs;
2040
2123
  try {
2041
2124
  initArgs = parseInitArgs(args.slice(1));
@@ -2048,7 +2131,7 @@ else if (command === "prepare") {
2048
2131
  process.exit(1);
2049
2132
  });
2050
2133
  });
2051
- } else if (command === "mcp") import("../mcp-BNjMGMB0.mjs").then(({ runMcp }) => {
2134
+ } else if (command === "mcp") import("../mcp-DoM3_nhd.mjs").then(({ runMcp }) => {
2052
2135
  runMcp();
2053
2136
  });
2054
2137
  else if (command === "-v" || command === "--version") {
@@ -2074,7 +2157,7 @@ else if (command === "-v" || command === "--version") {
2074
2157
  },
2075
2158
  {
2076
2159
  name: "project",
2077
- hint: "status | link | list | logs | rollback | cancel | delete | purge-cache",
2160
+ hint: "status | link | list | logs | requests | rollback | cancel | delete | purge-cache",
2078
2161
  description: "Manage projects and deployments"
2079
2162
  },
2080
2163
  {
@@ -2127,38 +2210,38 @@ else if (command === "-v" || command === "--version") {
2127
2210
  ];
2128
2211
  (async () => {
2129
2212
  printVoidHeader();
2130
- const { promptSubcommand } = await import("../subcommand-prompt-DtES-oP6.mjs");
2213
+ const { promptSubcommand } = await import("../subcommand-prompt-BzV8iQZo.mjs");
2131
2214
  const result = await promptSubcommand("", topLevelCommands);
2132
2215
  if (!result) process.exit(0);
2133
2216
  const cmd = result.subcommand;
2134
2217
  const root = process.cwd();
2135
2218
  switch (cmd) {
2136
2219
  case "init": {
2137
- const { runInitCommand, parseInitArgs } = await import("../init-xfwW7cLp.mjs");
2220
+ const { runInitCommand, parseInitArgs } = await import("../init-Dl2PKuQn.mjs");
2138
2221
  await runInitCommand(root, parseInitArgs([]));
2139
2222
  return;
2140
2223
  }
2141
2224
  case "deploy": {
2142
- const { runDeploy } = await import("../deploy-B02JyKP9.mjs").then((n) => n.t);
2225
+ const { runDeploy } = await import("../deploy-DT8wsPZd.mjs").then((n) => n.t);
2143
2226
  await runDeploy(root);
2144
2227
  return;
2145
2228
  }
2146
2229
  case "mcp": {
2147
- const { runMcp } = await import("../mcp-BNjMGMB0.mjs");
2230
+ const { runMcp } = await import("../mcp-DoM3_nhd.mjs");
2148
2231
  runMcp();
2149
2232
  return;
2150
2233
  }
2151
- case "auth": return runSubcommandGroup("auth", authSubcommands, parseAuthArgs, (r, p) => import("../auth-cmd-Cw1edJdZ.mjs").then(({ runAuthCommand }) => runAuthCommand(r, p)));
2152
- case "project": return runSubcommandGroup("project", projectSubcommands, parseProjectArgs, (r, p) => import("../project-cmd-B2bcKefD.mjs").then(({ runProjectCommand }) => runProjectCommand(r, p)));
2153
- case "secret": return runSubcommandGroup("secret", secretSubcommands, parseSecretArgs, (r, p) => import("../secret-DeMnMcV0.mjs").then(({ runSecretCommand }) => runSecretCommand(r, p)));
2154
- case "domain": return runSubcommandGroup("domain", domainSubcommands, parseDomainArgs, (r, p) => import("../domain-DMrBabBQ.mjs").then(({ runDomainCommand }) => runDomainCommand(r, p)));
2155
- case "github": return runSubcommandGroup("github", githubSubcommands, parseGithubArgs, (r, p) => import("../github-cmd-DfeFEasr.mjs").then(({ runGithubCommand }) => runGithubCommand(r, p)));
2156
- case "build": return runSubcommandGroup("build", buildSubcommands, parseBuildArgs, (r, p) => import("../build-cmd-C6kNDJBv.mjs").then(({ runBuildCommand }) => runBuildCommand(r, p)));
2157
- case "db": return runSubcommandGroup("db", dbSubcommands, parseDbArgs, (r, p) => import("../db-BvKV34IK.mjs").then(({ runDbCommand }) => runDbCommand(r, p)));
2158
- case "env": return runSubcommandGroup("env", envSubcommands, parseEnvArgs, (r, p) => import("../env-BfG7O71F.mjs").then(({ runEnvCommand }) => runEnvCommand(r, p)));
2159
- case "gen": return runSubcommandGroup("gen", genSubcommands, parseGenArgs, (r, p) => import("../gen-Bee261SV.mjs").then(({ runGenCommand }) => runGenCommand(r, p)));
2234
+ case "auth": return runSubcommandGroup("auth", authSubcommands, parseAuthArgs, (r, p) => import("../auth-cmd-BqsdZJp5.mjs").then(({ runAuthCommand }) => runAuthCommand(r, p)));
2235
+ case "project": return runSubcommandGroup("project", projectSubcommands, parseProjectArgs, (r, p) => import("../project-cmd-D_w-4w5B.mjs").then(({ runProjectCommand }) => runProjectCommand(r, p)));
2236
+ case "secret": return runSubcommandGroup("secret", secretSubcommands, parseSecretArgs, (r, p) => import("../secret-Dt32J6RI.mjs").then(({ runSecretCommand }) => runSecretCommand(r, p)));
2237
+ case "domain": return runSubcommandGroup("domain", domainSubcommands, parseDomainArgs, (r, p) => import("../domain-DiaNQbrl.mjs").then(({ runDomainCommand }) => runDomainCommand(r, p)));
2238
+ case "github": return runSubcommandGroup("github", githubSubcommands, parseGithubArgs, (r, p) => import("../github-cmd-BdNaOVNa.mjs").then(({ runGithubCommand }) => runGithubCommand(r, p)));
2239
+ case "build": return runSubcommandGroup("build", buildSubcommands, parseBuildArgs, (r, p) => import("../build-cmd-Bujrv5q-.mjs").then(({ runBuildCommand }) => runBuildCommand(r, p)));
2240
+ case "db": return runSubcommandGroup("db", dbSubcommands, parseDbArgs, (r, p) => import("../db-PZBsLSGb.mjs").then(({ runDbCommand }) => runDbCommand(r, p)));
2241
+ case "env": return runSubcommandGroup("env", envSubcommands, parseEnvArgs, (r, p) => import("../env-AAHU02L6.mjs").then(({ runEnvCommand }) => runEnvCommand(r, p)));
2242
+ case "gen": return runSubcommandGroup("gen", genSubcommands, parseGenArgs, (r, p) => import("../gen-oup1xBN0.mjs").then(({ runGenCommand }) => runGenCommand(r, p)));
2160
2243
  case "prepare": {
2161
- const { runPrepareCommand } = await import("../prepare-BRyC4TCC.mjs");
2244
+ const { runPrepareCommand } = await import("../prepare-DOBTY0o4.mjs");
2162
2245
  await runPrepareCommand(root, parsePrepareArgs([]));
2163
2246
  return;
2164
2247
  }
@@ -0,0 +1,96 @@
1
+ //#region src/cli/env-validation.d.ts
2
+ /**
3
+ * The stable, values-free classification of a self-host schema failure.
4
+ * env.ts evaluation and Standard-Schema validators run ARBITRARY user code that
5
+ * can embed an env value in a thrown/rejected error (its `message`, `stack`, or
6
+ * `cause`), and `VOID_ENV_UNMASK` disables redaction — so the original error is
7
+ * never surfaced. Every {@link SelfHostSchemaError} instead carries only one of
8
+ * these codes plus fixed text, so neither its message, its `reason` field, nor
9
+ * its JSON serialization can echo a value.
10
+ * - `schema-load-failed` — importing/evaluating the user's env.ts threw.
11
+ * - `schema-validation-error` — a registered validator threw or rejected while
12
+ * checking a production value.
13
+ */
14
+ type SelfHostSchemaFailureReason = "schema-load-failed" | "schema-validation-error";
15
+ /**
16
+ * The env-INSENSITIVE structural facts the self-host secret gate needs from the
17
+ * project's env schema: whether a schema is registered, the REQUIRED key names (a
18
+ * validator that rejects the ABSENT value — {@link requiredSchemaKeys}), and the
19
+ * keys the schema flags `.secret()` ({@link getSecretOverride} === 'secret').
20
+ * NONE of these depend on which `.env` file the build reads — they are fixed by
21
+ * env.ts's structure — so this needs no `loadEnv` and no build env, and the result
22
+ * is the SAME regardless of the build's mode/envDir. That is precisely why the old
23
+ * probe-vs-build divergence class is gone: nothing derived here can diverge from
24
+ * the build over which `.env*` set was loaded.
25
+ */
26
+ type SelfHostSchemaFacts = {
27
+ /** Whether the project registered an env schema at all (no schema → nothing to gate). */hasSchema: boolean; /** Required key NAMES — validator rejects `undefined`. Values-free. */
28
+ requiredKeys: Array<string>; /** Keys the schema flags `.secret()`. Values-free. */
29
+ secretKeys: Array<string>;
30
+ };
31
+ //#endregion
32
+ //#region src/cli/env-schema-probe.d.ts
33
+ /** Input handed to the child (JSON in argv[3]). Path only — no env values cross here. */
34
+ type EnvSchemaProbeInput = {
35
+ root: string;
36
+ };
37
+ /** The reason the `facts` probe rejected the app as unsupported (values-free). */
38
+ type EnvSchemaProbeRejectReason = "custom-envdir" | "non-production-mode";
39
+ /**
40
+ * The structured result of the `facts` operation. `ok` carries the env-insensitive
41
+ * schema facts; `reject` fails the deploy closed pre-account with clear v1-scope
42
+ * guidance; `schema-error` surfaces a values-free env.ts/validator failure.
43
+ *
44
+ * `reject` crosses the process boundary as a FIXED reason CODE only — never the raw
45
+ * resolved `mode` / `envDir` strings. Those are arbitrary Vite-config-derived values
46
+ * (a config could set `envDir`/`mode` from any inherited secret), so echoing them
47
+ * over fd 3 or into a parent log would break the values-free boundary; the parent
48
+ * renders fixed guidance from the code alone.
49
+ */
50
+ type EnvSchemaProbeResult = {
51
+ kind: "ok";
52
+ facts: SelfHostSchemaFacts;
53
+ } | {
54
+ kind: "reject";
55
+ reason: EnvSchemaProbeRejectReason;
56
+ } | {
57
+ kind: "schema-error";
58
+ reason: SelfHostSchemaFailureReason;
59
+ };
60
+ /**
61
+ * The structured result of the `validate-emitted` operation. `invalid-keys` carries
62
+ * the FAILING key NAMES only (never a value); `schema-error` surfaces a values-free
63
+ * env.ts/validator failure.
64
+ */
65
+ type EnvSchemaValidateResult = {
66
+ kind: "invalid-keys";
67
+ invalidKeys: Array<string>;
68
+ } | {
69
+ kind: "schema-error";
70
+ reason: SelfHostSchemaFailureReason;
71
+ };
72
+ /** Minimal structural shape of a `spawnSync`-style result (injectable in tests). */
73
+ type EnvSchemaProbeSpawnResult = {
74
+ status: number | null; /** The fd-3 buffer (the framed result) — dedicated so stdout noise can't truncate it. */
75
+ fd3: string | null;
76
+ error?: Error | null;
77
+ signal?: NodeJS.Signals | null;
78
+ };
79
+ type EnvSchemaProbeSpawn = (command: string, args: Array<string>, options: {
80
+ cwd: string;
81
+ env: NodeJS.ProcessEnv;
82
+ }) => EnvSchemaProbeSpawnResult;
83
+ /**
84
+ * PARENT side (`facts`): return the env-insensitive schema facts + the v1 envDir/mode
85
+ * narrowing. Runs pre-build so a custom envDir / non-production mode / broken env.ts
86
+ * fails fast, before any account op.
87
+ */
88
+ declare function resolveEnvSchemaFactsViaSubprocess(input: EnvSchemaProbeInput, env: NodeJS.ProcessEnv, spawn?: EnvSchemaProbeSpawn): Promise<EnvSchemaProbeResult>;
89
+ /**
90
+ * PARENT side (`validate-emitted`): validate the REAL emitted worker `vars` against
91
+ * the schema validators and return the FAILING key NAMES only. Runs post-build so
92
+ * the values validated are exactly what the worker ships.
93
+ */
94
+ declare function validateEmittedVarsViaSubprocess(input: EnvSchemaProbeInput, env: NodeJS.ProcessEnv, spawn?: EnvSchemaProbeSpawn): Promise<EnvSchemaValidateResult>;
95
+ //#endregion
96
+ export { EnvSchemaProbeInput, EnvSchemaProbeRejectReason, EnvSchemaProbeResult, EnvSchemaProbeSpawn, EnvSchemaProbeSpawnResult, EnvSchemaValidateResult, resolveEnvSchemaFactsViaSubprocess, validateEmittedVarsViaSubprocess };