@spacefast/common 0.0.23 → 0.0.26

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 (224) hide show
  1. package/brand-assets/LICENSE-Haskoy.txt +93 -0
  2. package/brand-assets/haskoy-latin-variable.woff2 +0 -0
  3. package/brand-assets/spacefast-favicon.svg +4 -4
  4. package/brand-assets/spacefast-sf-full-bleed.svg +3 -3
  5. package/brand-assets/spacefast-wordmark.svg +2 -4
  6. package/dist/agents/connect-targets.js +1 -1
  7. package/dist/agents/private-key-oauth.d.ts +0 -1
  8. package/dist/agents/private-key-oauth.js +46 -63
  9. package/dist/brand-assets-build.js +4 -6
  10. package/dist/brand-assets.d.ts +5 -15
  11. package/dist/brand-assets.js +15 -14
  12. package/dist/config/domains.d.ts +47 -7
  13. package/dist/config/domains.js +66 -10
  14. package/dist/config/index.d.ts +0 -1
  15. package/dist/config/index.js +0 -1
  16. package/dist/contracts/abuse.d.ts +2 -0
  17. package/dist/contracts/abuse.js +12 -0
  18. package/dist/contracts/access.d.ts +124 -12
  19. package/dist/contracts/access.js +73 -9
  20. package/dist/contracts/activity.d.ts +1 -1
  21. package/dist/contracts/activity.js +5 -12
  22. package/dist/contracts/api-keys.d.ts +21 -21
  23. package/dist/contracts/api-keys.js +2 -2
  24. package/dist/contracts/beta.js +1 -1
  25. package/dist/contracts/billing.d.ts +3 -35
  26. package/dist/contracts/billing.js +33 -52
  27. package/dist/contracts/builds.d.ts +30 -18
  28. package/dist/contracts/builds.js +28 -9
  29. package/dist/contracts/channels.js +1 -1
  30. package/dist/contracts/cli.d.ts +10 -0
  31. package/dist/contracts/cli.js +10 -0
  32. package/dist/contracts/collab-public.d.ts +63 -0
  33. package/dist/contracts/collab-public.js +46 -0
  34. package/dist/contracts/comments.d.ts +282 -53
  35. package/dist/contracts/comments.js +173 -52
  36. package/dist/contracts/common.d.ts +3 -3
  37. package/dist/contracts/common.js +5 -5
  38. package/dist/contracts/crons.d.ts +35 -0
  39. package/dist/contracts/crons.js +42 -0
  40. package/dist/contracts/device-auth.d.ts +6 -6
  41. package/dist/contracts/device-auth.js +2 -2
  42. package/dist/contracts/docs.js +2 -2
  43. package/dist/contracts/domains.d.ts +38 -27
  44. package/dist/contracts/domains.js +29 -2
  45. package/dist/contracts/enums.d.ts +34 -30
  46. package/dist/contracts/enums.js +62 -48
  47. package/dist/contracts/error-code-meta.d.ts +50 -125
  48. package/dist/contracts/error-code-meta.js +29 -41
  49. package/dist/contracts/error-codes.d.ts +1 -1
  50. package/dist/contracts/error-codes.js +14 -33
  51. package/dist/contracts/execution.d.ts +47 -66
  52. package/dist/contracts/execution.js +53 -49
  53. package/dist/contracts/feature-lifecycle-core.d.ts +0 -6
  54. package/dist/contracts/feature-lifecycle-core.js +2 -31
  55. package/dist/contracts/feature-lifecycle.d.ts +12 -52
  56. package/dist/contracts/feature-lifecycle.js +16 -59
  57. package/dist/contracts/features.d.ts +48 -60
  58. package/dist/contracts/features.js +59 -51
  59. package/dist/contracts/functions.d.ts +266 -72
  60. package/dist/contracts/functions.js +260 -37
  61. package/dist/contracts/git.d.ts +28 -34
  62. package/dist/contracts/git.js +10 -11
  63. package/dist/contracts/grants.d.ts +9 -5
  64. package/dist/contracts/grants.js +18 -9
  65. package/dist/contracts/ids.js +2 -2
  66. package/dist/contracts/internal.d.ts +8 -6
  67. package/dist/contracts/internal.js +12 -12
  68. package/dist/contracts/mcp.d.ts +11 -0
  69. package/dist/contracts/mcp.js +5 -0
  70. package/dist/contracts/me.js +1 -1
  71. package/dist/contracts/oauth-resources.d.ts +4 -3
  72. package/dist/contracts/oauth-resources.js +12 -3
  73. package/dist/contracts/operations.d.ts +90 -5
  74. package/dist/contracts/operations.js +77 -3
  75. package/dist/contracts/pages.d.ts +12 -7
  76. package/dist/contracts/pages.js +24 -1
  77. package/dist/contracts/plan-policy.d.ts +0 -2
  78. package/dist/contracts/plan-policy.js +2 -3
  79. package/dist/contracts/platform.d.ts +61 -148
  80. package/dist/contracts/platform.js +70 -126
  81. package/dist/contracts/publish-archive.d.ts +508 -0
  82. package/dist/contracts/publish-archive.js +32 -0
  83. package/dist/contracts/push-new.d.ts +4 -4
  84. package/dist/contracts/quotas.js +2 -2
  85. package/dist/contracts/repository-connections.d.ts +43 -30
  86. package/dist/contracts/repository-connections.js +11 -3
  87. package/dist/contracts/resources.d.ts +12 -24
  88. package/dist/contracts/resources.js +36 -16
  89. package/dist/contracts/runtime-api.d.ts +433 -192
  90. package/dist/contracts/runtime-api.js +421 -356
  91. package/dist/contracts/runtime-app.d.ts +127 -120
  92. package/dist/contracts/runtime-app.js +19 -10
  93. package/dist/contracts/runtime-db.d.ts +5 -5
  94. package/dist/contracts/runtime-db.js +2 -2
  95. package/dist/contracts/runtime-purge.d.ts +8 -0
  96. package/dist/contracts/runtime-purge.js +7 -0
  97. package/dist/contracts/runtime-services.d.ts +219 -0
  98. package/dist/contracts/runtime-services.js +437 -0
  99. package/dist/contracts/runtime-storage.d.ts +46 -32
  100. package/dist/contracts/runtime-storage.js +31 -8
  101. package/dist/contracts/sf-config-v1.d.ts +48 -10
  102. package/dist/contracts/space-config.d.ts +69 -18
  103. package/dist/contracts/space-config.js +226 -27
  104. package/dist/contracts/spaces.d.ts +236 -450
  105. package/dist/contracts/spaces.js +131 -151
  106. package/dist/contracts/superadmin-activity.d.ts +57 -4
  107. package/dist/contracts/superadmin-activity.js +48 -2
  108. package/dist/contracts/superadmin-search.d.ts +126 -0
  109. package/dist/contracts/superadmin-search.js +61 -0
  110. package/dist/contracts/superadmin-spaces.d.ts +361 -92
  111. package/dist/contracts/superadmin-spaces.js +97 -24
  112. package/dist/contracts/superadmin-teams.d.ts +28 -10
  113. package/dist/contracts/superadmin-teams.js +5 -8
  114. package/dist/contracts/superadmin-tenants.d.ts +0 -6
  115. package/dist/contracts/superadmin-tenants.js +1 -7
  116. package/dist/contracts/superadmin.d.ts +135 -54
  117. package/dist/contracts/superadmin.js +46 -23
  118. package/dist/contracts/tags.d.ts +12 -12
  119. package/dist/contracts/tags.js +3 -3
  120. package/dist/contracts/teams.d.ts +49 -14
  121. package/dist/contracts/teams.js +40 -22
  122. package/dist/contracts/transfers.d.ts +0 -49
  123. package/dist/contracts/transfers.js +4 -8
  124. package/dist/contracts/usage.d.ts +61 -0
  125. package/dist/contracts/usage.js +64 -0
  126. package/dist/contracts/variables.d.ts +2 -7
  127. package/dist/contracts/variables.js +9 -8
  128. package/dist/contracts/webhooks.d.ts +2 -2
  129. package/dist/contracts/zero.d.ts +102 -73
  130. package/dist/contracts/zero.js +94 -32
  131. package/dist/dashboard-paths/index.d.ts +1 -1
  132. package/dist/dashboard-paths/index.js +1 -0
  133. package/dist/docs/agent-prose.d.ts +2 -2
  134. package/dist/docs/agent-prose.js +63 -70
  135. package/dist/docs/agent-setup.js +45 -15
  136. package/dist/docs/catalog.d.ts +24 -24
  137. package/dist/docs/catalog.js +35 -24
  138. package/dist/docs/error-docs.js +194 -270
  139. package/dist/docs/skills.d.ts +12 -12
  140. package/dist/docs/skills.js +4 -4
  141. package/dist/test-helpers/fetch-stub.d.ts +16 -0
  142. package/dist/test-helpers/fetch-stub.js +25 -0
  143. package/dist/utils/build-settings.d.ts +5 -1
  144. package/dist/utils/build-settings.js +91 -13
  145. package/dist/utils/canonical-json.d.ts +10 -0
  146. package/dist/utils/canonical-json.js +22 -0
  147. package/dist/utils/cast-transport.d.ts +28 -0
  148. package/dist/utils/cast-transport.js +52 -0
  149. package/dist/utils/claim-token.d.ts +0 -8
  150. package/dist/utils/claim-token.js +3 -15
  151. package/dist/utils/concurrency.js +1 -0
  152. package/dist/utils/credential-policy.d.ts +1 -1
  153. package/dist/utils/credential-policy.js +4 -3
  154. package/dist/utils/dns-instructions.js +9 -9
  155. package/dist/utils/env-file.d.ts +17 -0
  156. package/dist/utils/env-file.js +96 -0
  157. package/dist/utils/error-code.d.ts +2 -0
  158. package/dist/utils/error-code.js +8 -0
  159. package/dist/utils/generate-space-name.d.ts +8 -10
  160. package/dist/utils/generate-space-name.js +206 -21
  161. package/dist/utils/grant-decision.fixtures.json +2938 -0
  162. package/dist/utils/grants.d.ts +2 -0
  163. package/dist/utils/grants.js +26 -1
  164. package/dist/utils/gravatar.d.ts +9 -0
  165. package/dist/utils/gravatar.js +31 -0
  166. package/dist/utils/idempotency.d.ts +6 -0
  167. package/dist/utils/idempotency.js +28 -0
  168. package/dist/utils/local-space-state.d.ts +9 -16
  169. package/dist/utils/local-space-state.js +20 -50
  170. package/dist/utils/one-shot-replay.d.ts +4 -1
  171. package/dist/utils/page-colors.d.ts +14 -12
  172. package/dist/utils/page-colors.js +15 -13
  173. package/dist/utils/page-fonts.d.ts +2 -2
  174. package/dist/utils/page-fonts.js +15 -4
  175. package/dist/utils/pages.d.ts +21 -3
  176. package/dist/utils/pages.js +42 -13
  177. package/dist/utils/publish-form-data.d.ts +12 -0
  178. package/dist/utils/publish-form-data.js +10 -0
  179. package/dist/utils/publish-policy.d.ts +27 -0
  180. package/dist/utils/publish-policy.fixtures.json +403 -0
  181. package/dist/utils/publish-policy.js +45 -20
  182. package/dist/utils/push-new.d.ts +7 -0
  183. package/dist/utils/push-new.js +7 -0
  184. package/dist/utils/query-keys.d.ts +4 -5
  185. package/dist/utils/query-keys.js +2 -3
  186. package/dist/utils/runtime-paths.d.ts +5 -0
  187. package/dist/utils/runtime-paths.js +5 -0
  188. package/dist/utils/runtime-upload-batch.d.ts +0 -5
  189. package/dist/utils/runtime-upload-batch.js +1 -27
  190. package/dist/utils/runtime-upload.d.ts +6 -11
  191. package/dist/utils/runtime-upload.js +10 -13
  192. package/dist/utils/secure-local-file.js +5 -16
  193. package/dist/utils/space-config.d.ts +1 -34
  194. package/dist/utils/space-config.js +8 -326
  195. package/dist/utils/static-runtime-policy.d.ts +9 -3
  196. package/dist/utils/static-runtime-policy.fixtures.json +38 -41
  197. package/dist/utils/static-runtime-policy.js +22 -56
  198. package/dist/utils/storage-policy.d.ts +1 -1
  199. package/dist/utils/storage-policy.js +3 -1
  200. package/dist/utils/structured-error.d.ts +14 -0
  201. package/dist/utils/structured-error.js +22 -0
  202. package/dist/utils/upload-session.d.ts +4 -1
  203. package/dist/utils/upload-session.js +33 -5
  204. package/dist/utils/version-path.js +13 -4
  205. package/dist/vocabulary.d.ts +13 -11
  206. package/dist/vocabulary.js +42 -28
  207. package/package.json +7 -17
  208. package/dist/config/postgres-budget.d.ts +0 -129
  209. package/dist/config/postgres-budget.js +0 -140
  210. package/dist/config/postgres-budget.json +0 -51
  211. package/dist/contracts/archives.d.ts +0 -331
  212. package/dist/contracts/archives.js +0 -120
  213. package/dist/contracts/deployments.d.ts +0 -574
  214. package/dist/contracts/deployments.js +0 -97
  215. package/dist/contracts/sites.d.ts +0 -416
  216. package/dist/contracts/sites.js +0 -168
  217. package/dist/contracts/superadmin-queues.d.ts +0 -414
  218. package/dist/contracts/superadmin-queues.js +0 -202
  219. package/dist/contracts/superadmin-runtime.d.ts +0 -27
  220. package/dist/contracts/superadmin-runtime.js +0 -38
  221. package/dist/index.d.ts +0 -1
  222. package/dist/index.js +0 -1
  223. package/dist/utils/api.d.ts +0 -4
  224. package/dist/utils/api.js +0 -13
@@ -1,8 +1,8 @@
1
- // Error reference content (internal-docs/platform.md "Global API Conventions"):
1
+ // Error reference content (the platform spec "Global API Conventions"):
2
2
  // every problem document `type` points at `https://spacefast.com/docs/errors/{code}`,
3
3
  // and those pages are GENERATED from this table — one entry per member of
4
4
  // `ERROR_CODES`, asserted complete by the conformance suite so links never rot
5
- // and pages never go missing. apps/www renders the HTML pages and writes the
5
+ // and pages never go missing. The standalone website renders the HTML pages and writes the
6
6
  // `.md` twins from the same entries.
7
7
  import { BRAND } from "../brand.js";
8
8
  import { serviceOrigin } from "../config/domains.js";
@@ -15,7 +15,7 @@ export const ERROR_DOCS = {
15
15
  },
16
16
  account_suspended: {
17
17
  summary: "This account is suspended for a policy or abuse violation and cannot be used.",
18
- fix: "Contact support to review the suspension if you believe it is a mistake.",
18
+ fix: "If you believe the suspension is a mistake, contact support to review it.",
19
19
  },
20
20
  abuse_report_rate_limited: {
21
21
  summary: "Too many abuse reports were submitted from this client in a short window.",
@@ -23,7 +23,7 @@ export const ERROR_DOCS = {
23
23
  },
24
24
  abuse_takedown: {
25
25
  summary: "This space was disabled by an abuse takedown and cannot be served or modified.",
26
- fix: "If you believe this is a mistake, contact support with the space id.",
26
+ fix: "If you believe the takedown is a mistake, contact support with the space id.",
27
27
  },
28
28
  access_denied: {
29
29
  summary: "The authorization request was denied by the user.",
@@ -39,7 +39,7 @@ export const ERROR_DOCS = {
39
39
  },
40
40
  agent_handoff_origin_unsupported: {
41
41
  summary: "The dashboard origin this deployment is configured with cannot mint canonical agent handoff links.",
42
- fix: "Point SPACEFAST_DASHBOARD_URL at a valid HTTP(S) origin. If you cannot change it, contact support.",
42
+ fix: "Point SPACEFAST_DASHBOARD_URL at a valid HTTP or HTTPS origin. If you cannot change it, contact support.",
43
43
  },
44
44
  ambiguous_space_slug: {
45
45
  summary: "The slug matches spaces in more than one of your teams, so it cannot be resolved.",
@@ -49,26 +49,18 @@ export const ERROR_DOCS = {
49
49
  summary: "This anonymous space expired before it was claimed.",
50
50
  fix: "Publish a fresh space and share its claim link right away this time. If you meant to update a live space, check .spacefast/ (or your saved receipt) for its spaceId. Publish to that space with its credential instead of creating a new space.",
51
51
  },
52
- anonymous_pool_unavailable: {
53
- summary: "No pooled capacity is available for anonymous publishes right now.",
54
- fix: "Retry shortly. Capacity replenishes automatically.",
55
- },
56
52
  anonymous_publish_rate_limited: {
57
53
  summary: "Too many anonymous publishes came from this network in a short window.",
58
54
  fix: "Wait for the window to pass, or sign in with an API key for higher limits.",
59
55
  },
60
56
  anonymous_space_limit_reached: {
61
- summary: "Too many unclaimed anonymous spaces are already active for this client.",
62
- fix: "Log in to publish into an authenticated space, or claim/delete an existing anonymous space before creating another.",
57
+ summary: "This client already holds the maximum number of unclaimed spaces.",
58
+ fix: "Sign in and publish into your account, or claim or delete one of the unclaimed spaces you already have.",
63
59
  },
64
60
  api_key_scope_underivable: {
65
61
  summary: "A concrete access policy cannot be derived from the requested scope and permissions.",
66
62
  fix: "Point scope at a resource you can already reach (an existing space owned by a team). Request only permissions your credential already has.",
67
63
  },
68
- archive_body_required: {
69
- summary: "This request must carry an archive body but none was provided.",
70
- fix: "Send the zip bytes as the request body with the matching content-type header.",
71
- },
72
64
  archive_too_large: {
73
65
  summary: "The uploaded archive exceeds the maximum allowed size.",
74
66
  fix: "Reduce the archive size or upload files individually through a version upload session.",
@@ -81,33 +73,13 @@ export const ERROR_DOCS = {
81
73
  summary: "The device login is not approved yet.",
82
74
  fix: "Keep polling at the advised interval until the user approves the request.",
83
75
  },
84
- billing_receipt_invalid: {
85
- summary: "The store receipt or notification cannot be verified with the payment provider.",
86
- fix: "Re-check the transaction id or purchase token and retry. Contact support if it persists.",
87
- },
88
- billing_receipt_not_bound_to_team: {
89
- summary: "The store purchase was made under a different account token than this team's.",
90
- fix: "Verify the purchase from the team that initiated it, or contact support to rebind it.",
91
- },
92
- billing_store_not_configured: {
93
- summary: "App Store or Google Play billing is not configured on this deployment.",
94
- fix: "Use another billing method, or configure the store credentials on the server.",
95
- },
96
- billing_subscription_conflict: {
97
- summary: "The team already has an active subscription with another payment provider.",
98
- fix: "Cancel the existing subscription before subscribing through a different provider.",
99
- },
100
- billing_unknown_product: {
101
- summary: "The purchased store product does not map to any plan sold by this deployment.",
102
- fix: "Check the product id against the store catalog returned by the billing endpoints.",
103
- },
104
76
  build_command_missing: {
105
77
  summary: "A build or install command cannot be found during the build run.",
106
78
  fix: "Check the command spelling and ensure its tool is declared in package.json or available in the build image.",
107
79
  },
108
80
  build_execution_unavailable: {
109
81
  summary: "Build execution is not available on this deployment.",
110
- fix: "Publish prebuilt static output instead, or wait for builds to become available.",
82
+ fix: "Publish prebuilt output instead.",
111
83
  },
112
84
  build_failed: {
113
85
  summary: "The build run failed before producing a version.",
@@ -129,6 +101,10 @@ export const ERROR_DOCS = {
129
101
  summary: "The build process was killed, most likely after running out of memory.",
130
102
  fix: "Reduce the build's memory usage or concurrency, then start a new build.",
131
103
  },
104
+ build_output_contains_server_bundle: {
105
+ summary: "The build output contains a compiled server bundle (an OpenNext worker.js), which a file-only publish would expose as a public download.",
106
+ fix: "This app needs the Spacefast Functions pipeline: run `sf publish` in the project with the Spacefast CLI so the worker deploys as a Function, or point the output directory at a browser-ready export.",
107
+ },
132
108
  build_output_dir_missing: {
133
109
  summary: "The build finished but its output directory was not produced.",
134
110
  fix: "Point the output directory setting at the folder your build writes (for example dist, build, out, or public).",
@@ -137,6 +113,14 @@ export const ERROR_DOCS = {
137
113
  summary: "The build exceeded its time limit before producing a version.",
138
114
  fix: "Speed up the build or raise the build timeout in the build settings, then start a new build.",
139
115
  },
116
+ blob_gate_record_missing: {
117
+ summary: "The file behind this download link no longer exists.",
118
+ fix: "The underlying object was deleted. Ask the owner for a fresh link.",
119
+ },
120
+ blob_gate_token_invalid: {
121
+ summary: "The download token is invalid or expired.",
122
+ fix: "Request a fresh download link and use it within its lifetime.",
123
+ },
140
124
  cache_purge_domain_required: {
141
125
  summary: "A purge request must name the domain to purge.",
142
126
  fix: "Pass the domain to purge in the request.",
@@ -159,7 +143,7 @@ export const ERROR_DOCS = {
159
143
  },
160
144
  claim_blocked_takedown: {
161
145
  summary: "This space is under an abuse takedown and cannot be claimed.",
162
- fix: "Contact support if you believe the takedown is a mistake.",
146
+ fix: "If you believe the takedown is a mistake, contact support.",
163
147
  },
164
148
  claim_target_not_found: {
165
149
  summary: "The team or account to claim the space into was not found.",
@@ -167,19 +151,15 @@ export const ERROR_DOCS = {
167
151
  },
168
152
  claimed_space_quota_exceeded: {
169
153
  summary: "Claiming this space would exceed the target team's space quota.",
170
- fix: "Delete unused spaces, then claim again. Still stuck? POST /v1/feedback with the error code and request id.",
154
+ fix: "Delete unused spaces, then claim again. If you are still stuck, POST /v1/feedback with the error code and requestId.",
171
155
  },
172
156
  cli_upgrade_required: {
173
157
  summary: "This CLI version is too old to talk to the API safely.",
174
158
  fix: "Upgrade the CLI to the latest release and retry.",
175
159
  },
176
- comment_screenshot_rate_limited: {
177
- summary: "Too many comment screenshot uploads were attempted.",
178
- fix: "Wait for the one-minute window to reset, then retry the screenshot upload.",
179
- },
180
160
  config_file_too_large: {
181
161
  summary: "The sf.jsonc configuration file exceeds the maximum size.",
182
- fix: "Keep the configuration file under the documented size limit (256 KB).",
162
+ fix: "Keep the configuration file at or under 256 KB.",
183
163
  },
184
164
  config_functions_key_removed: {
185
165
  summary: "The sf.jsonc configuration still uses the removed top-level functions key.",
@@ -199,7 +179,7 @@ export const ERROR_DOCS = {
199
179
  },
200
180
  config_runtime_entry_missing: {
201
181
  summary: "The declared runtime has no entry module to compile.",
202
- fix: "Name the entry in sf.jsonc: runtime.entry for functions, runtime.server and runtime.client for zero. Remove the runtime block to publish static files instead.",
182
+ fix: "Name the entry in sf.jsonc: runtime.entry for functions, runtime.server and runtime.client for zero. Remove the runtime block to publish files without a runtime instead.",
203
183
  },
204
184
  config_runtime_invalid_kind: {
205
185
  summary: "The runtime block in the space configuration declares an unknown kind.",
@@ -207,14 +187,14 @@ export const ERROR_DOCS = {
207
187
  },
208
188
  config_templates_over_limit: {
209
189
  summary: "The configuration declares more template files than the plan allows.",
210
- fix: "Reduce the number of template entries in sf.jsonc. Still stuck? POST /v1/feedback with the error code and request id.",
190
+ fix: "Reduce the number of template entries in sf.jsonc. If you are still stuck, POST /v1/feedback with the error code and requestId.",
211
191
  },
212
192
  continuation_unavailable: {
213
- summary: "This claim token can no longer be exchanged for an API key.",
214
- fix: "If the space is claimed, ask its owner for an API key (dashboard: Account → API keys). If it is still unclaimed, keep using the claim token as bearer auth instead of exchanging it. Still stuck? POST /v1/feedback with the error code and request id.",
193
+ summary: "This space key can no longer be exchanged for an API key.",
194
+ fix: "If the space is claimed, ask its owner for an API key (dashboard: Account → API keys). If it is still unclaimed, keep using the space key as bearer auth instead of exchanging it. If you are still stuck, POST /v1/feedback with the error code and requestId.",
215
195
  },
216
196
  continuation_used: {
217
- summary: "This claim token was already exchanged for a durable API key.",
197
+ summary: "This space key was already exchanged for a durable API key.",
218
198
  fix: "Authenticate with the exchanged API key (check .spacefast/state.json or wherever it was saved). If it was lost, ask the space owner to create a new API key.",
219
199
  },
220
200
  credential_expired: {
@@ -223,7 +203,7 @@ export const ERROR_DOCS = {
223
203
  },
224
204
  credential_not_yet_valid: {
225
205
  summary: "The credential is not valid yet because its start time is in the future.",
226
- fix: "Wait until the credential's notBefore time, or adjust it.",
206
+ fix: "Wait until the credential's notBefore time, or adjust the notBefore value.",
227
207
  },
228
208
  credential_retired: {
229
209
  summary: "This request used a retired Spacefast token format or authentication header.",
@@ -241,10 +221,6 @@ export const ERROR_DOCS = {
241
221
  summary: "CSAM enforcement policy cannot be set below the mandatory account-suspend floor.",
242
222
  fix: "Set the CSAM category enforcement tier to account suspension.",
243
223
  },
244
- custom_certificates_require_dedicated_site: {
245
- summary: "Custom certificates are unavailable while this space uses shared placement.",
246
- fix: "Move the space to dedicated placement before managing custom certificates.",
247
- },
248
224
  data_location_immutable: {
249
225
  summary: "This request tried to change data location through an immutable path.",
250
226
  fix: "Data location is fixed when the space is created and cannot be changed afterwards. Create a new space in the region you want.",
@@ -259,7 +235,7 @@ export const ERROR_DOCS = {
259
235
  },
260
236
  device_verification_rate_limited: {
261
237
  summary: "Too many incorrect device codes were entered in a short window.",
262
- fix: "Wait for the lockout to pass, then enter the code shown by your CLI exactly.",
238
+ fix: "Wait for the lockout to pass, then enter the code exactly as your CLI shows it.",
263
239
  },
264
240
  dns_export_required: {
265
241
  summary: "This operation requires exporting the current DNS records first.",
@@ -271,7 +247,7 @@ export const ERROR_DOCS = {
271
247
  },
272
248
  dns_import_partial_visibility: {
273
249
  summary: "The DNS import cannot see the full zone, so importing would lose records.",
274
- fix: "Verify delegation and retry once the full zone is visible.",
250
+ fix: "Verify delegation. Once the full zone is visible, retry the import.",
275
251
  },
276
252
  dns_provider_auth_expired: {
277
253
  summary: "The connected DNS provider authorization expired or was revoked.",
@@ -279,7 +255,7 @@ export const ERROR_DOCS = {
279
255
  },
280
256
  dns_provider_batch_unsupported: {
281
257
  summary: "The connected DNS provider cannot apply this batch with the required semantics.",
282
- fix: "Split the change or use a provider/zone that supports atomic batch writes.",
258
+ fix: "Split the change, or use a provider or zone that supports atomic batch writes.",
283
259
  },
284
260
  dns_provider_change_pending: {
285
261
  summary: "The DNS provider accepted the change but propagation or provider completion is still pending.",
@@ -351,7 +327,7 @@ export const ERROR_DOCS = {
351
327
  },
352
328
  dns_provider_replace_all_write_strategy: {
353
329
  summary: "This provider applies DNS changes with a replace-all write strategy.",
354
- fix: "Review the full-zone diff carefully so unrelated MX, TXT, CAA, NS, and wildcard records are preserved.",
330
+ fix: "To preserve unrelated MX, TXT, CAA, NS, and wildcard records, review the full-zone diff carefully.",
355
331
  },
356
332
  dns_provider_snapshot_stale: {
357
333
  summary: "The cached DNS provider snapshot is stale.",
@@ -359,7 +335,7 @@ export const ERROR_DOCS = {
359
335
  },
360
336
  dns_provider_snapshot_unavailable: {
361
337
  summary: `${BRAND.productName} cannot cache the latest DNS provider snapshot.`,
362
- fix: "Retry refresh after the cache or provider recovers. Do not edit connected-provider records from stale data.",
338
+ fix: "Retry the refresh after the cache or provider recovers. Do not edit connected-provider records from stale data.",
363
339
  },
364
340
  dns_provider_temporarily_unavailable: {
365
341
  summary: "The DNS provider is rate-limited, degraded, or temporarily unavailable.",
@@ -431,7 +407,7 @@ export const ERROR_DOCS = {
431
407
  },
432
408
  domain_quota_exceeded: {
433
409
  summary: "Adding this domain would exceed the plan's external domain allowance.",
434
- fix: "Remove unused domains. Still stuck? POST /v1/feedback with the error code and request id.",
410
+ fix: "Remove unused domains. If you are still stuck, POST /v1/feedback with the error code and requestId.",
435
411
  },
436
412
  domain_registration_active: {
437
413
  summary: "The domain has an active registration, which blocks this operation.",
@@ -467,23 +443,15 @@ export const ERROR_DOCS = {
467
443
  },
468
444
  enforcement_policy_overlap: {
469
445
  summary: "Enforcement policy severity ranges overlap within a category.",
470
- fix: "Adjust the category ranges so each severity is covered by at most one policy.",
446
+ fix: "Adjust the category ranges so at most one policy covers each severity.",
471
447
  },
472
448
  expired_token: {
473
449
  summary: "The token is expired.",
474
450
  fix: "Request a new token and retry.",
475
451
  },
476
- export_archive_not_ready: {
477
- summary: "The export archive is still being prepared.",
478
- fix: "Poll the export until its status is ready, then download the archive.",
479
- },
480
- export_version_not_found: {
481
- summary: "The version requested for export was not found.",
482
- fix: "List the space's versions and export an existing version id.",
483
- },
484
452
  feature_unavailable: {
485
453
  summary: "This feature is not available on this deployment or plan.",
486
- fix: "Check the feature's availability and try again when it is enabled for your team.",
454
+ fix: "Check the feature's availability. When the feature is enabled for your team, try again.",
487
455
  },
488
456
  files_mode_does_not_support_spa: {
489
457
  summary: "SPA fallback cannot be combined with files-listing mode.",
@@ -495,39 +463,23 @@ export const ERROR_DOCS = {
495
463
  },
496
464
  free_external_proxy_disabled: {
497
465
  summary: "Proxy routes to external upstreams are not available on the Free plan.",
498
- fix: "Remove the proxy rules before publishing. Still stuck? POST /v1/feedback with the error code and request id.",
499
- },
500
- google_play_webhook_identity_not_configured: {
501
- summary: "Google Play Pub/Sub push authentication is not configured on this deployment.",
502
- fix: "Configure the exact push audience and dedicated Pub/Sub service-account email before enabling RTDN delivery.",
466
+ fix: "Remove the proxy rules before publishing. If you are still stuck, POST /v1/feedback with the error code and requestId.",
503
467
  },
504
468
  idempotency_conflict_in_progress: {
505
469
  summary: "Another request with the same Idempotency-Key is still in flight.",
506
- fix: "Wait for the original request to finish. Its response will be replayed.",
470
+ fix: "Wait for the original request to finish. The API will replay that request's response.",
507
471
  },
508
472
  idempotency_key_reused: {
509
473
  summary: "The Idempotency-Key was reused with a different request body.",
510
474
  fix: "Use a fresh key for new requests. Keys bind to one exact request body.",
511
475
  },
512
- import_archive_not_uploaded: {
513
- summary: "The import has no uploaded archive yet.",
514
- fix: "Upload the archive to the import's upload target, then finalize.",
515
- },
516
- import_not_cancelable: {
517
- summary: "The import is past the point where it can be canceled.",
518
- fix: "Wait for the import to finish. Completed imports can be deleted as versions.",
519
- },
520
- import_not_waiting_for_archive: {
521
- summary: "The import is not waiting for an archive upload.",
522
- fix: "Check the import status. If the archive step is complete, continue to the next step.",
523
- },
524
476
  incumbent_controls_dns: {
525
477
  summary: "Another team controls this domain's DNS, so the operation is blocked.",
526
478
  fix: "Prove control by completing domain verification, or coordinate with the incumbent.",
527
479
  },
528
480
  inject_invalid: {
529
481
  summary: "The inject config key is malformed.",
530
- fix: "Make inject an object whose head/bodyStart/bodyEnd/noscript entries are arrays of up to 16 strings.",
482
+ fix: "Make `inject` an object whose `head`, `bodyStart`, `bodyEnd`, and `noscript` entries are arrays of up to 16 strings.",
531
483
  },
532
484
  inject_snippet_too_large: {
533
485
  summary: "An inject snippet exceeds the per-snippet size limit.",
@@ -535,11 +487,11 @@ export const ERROR_DOCS = {
535
487
  },
536
488
  internal_error: {
537
489
  summary: "Something went wrong on our side.",
538
- fix: "Retry the request. If it persists, contact support with the requestId.",
490
+ fix: "Retry the request. If the error persists, contact support with the requestId.",
539
491
  },
540
492
  invalid_claim_token: {
541
- summary: "The claim token is invalid or does not match this space.",
542
- fix: "Use the exact claim URL returned by the publish that created the space.",
493
+ summary: "The space key is invalid or does not match this space.",
494
+ fix: "Use the exact space key or claim link returned by the publish that created the space.",
543
495
  },
544
496
  invalid_continuation_token: {
545
497
  summary: "The continuation token is invalid, expired, or already finished.",
@@ -559,16 +511,12 @@ export const ERROR_DOCS = {
559
511
  },
560
512
  invalid_domain_name: {
561
513
  summary: "The domain name is not a valid registrable hostname.",
562
- fix: "Check the spelling and use a fully-qualified domain name.",
514
+ fix: "Check the spelling and use a fully qualified domain name.",
563
515
  },
564
516
  invalid_file_path: {
565
517
  summary: "A file path in the request is not a valid space path.",
566
518
  fix: "Use forward-slash relative paths without traversal segments.",
567
519
  },
568
- invalid_google_play_webhook_identity: {
569
- summary: "The Google Play notification did not carry a valid Pub/Sub push identity.",
570
- fix: "Send the notification through the configured authenticated Pub/Sub push subscription.",
571
- },
572
520
  invalid_grant: {
573
521
  summary: "The authorization grant is invalid or was already used.",
574
522
  fix: "Restart the login flow to obtain a new grant.",
@@ -607,7 +555,7 @@ export const ERROR_DOCS = {
607
555
  },
608
556
  invalid_user_code: {
609
557
  summary: "The user code does not match a pending device login.",
610
- fix: "Enter the code exactly as shown by your CLI. Codes expire after a few minutes.",
558
+ fix: "Enter the code exactly as your CLI shows it. Codes expire after a few minutes.",
611
559
  },
612
560
  invalid_version_path: {
613
561
  summary: "A file path in the version is not a valid space path.",
@@ -651,15 +599,15 @@ export const ERROR_DOCS = {
651
599
  },
652
600
  invitation_not_pending: {
653
601
  summary: "The invitation is no longer pending.",
654
- fix: "Create a new invitation if the member still needs to join.",
602
+ fix: "If the member still needs to join, create a new invitation.",
655
603
  },
656
604
  ip_blocked: {
657
605
  summary: "Requests from this IP address are blocked for abuse or policy reasons.",
658
- fix: "Contact support with your IP address if you believe this block is in error.",
606
+ fix: "If you believe this block is a mistake, contact support with your IP address.",
659
607
  },
660
608
  job_not_found: {
661
609
  summary: "The background job was not found.",
662
- fix: "Verify the job id. Completed jobs are eventually pruned.",
610
+ fix: "Verify the job id. Spacefast eventually prunes completed jobs.",
663
611
  },
664
612
  job_not_promotable: {
665
613
  summary: "The job cannot be promoted in its current state.",
@@ -691,11 +639,11 @@ export const ERROR_DOCS = {
691
639
  },
692
640
  malware_detected: {
693
641
  summary: "Malware was detected in the uploaded content.",
694
- fix: "Remove the flagged files. Contact support if you believe this is a false positive.",
642
+ fix: "Remove the flagged files. If you believe the detection is a false positive, contact support.",
695
643
  },
696
644
  managed_domain_protected: {
697
645
  summary: "This is a system-managed view.fast hostname and cannot be mutated like a custom domain.",
698
- fix: "Use it as a read-only managed hostname, or add a custom domain if you need editable DNS and binding controls.",
646
+ fix: "Use the hostname as a read-only managed hostname. If you need editable DNS and binding controls, add a custom domain.",
699
647
  },
700
648
  manifest_body_too_large: {
701
649
  summary: "The upload manifest body exceeds the maximum size.",
@@ -703,7 +651,7 @@ export const ERROR_DOCS = {
703
651
  },
704
652
  manifest_duplicate_path: {
705
653
  summary: "The upload manifest declares the same path more than once.",
706
- fix: "Deduplicate paths. Comparisons use the canonical (decoded, NFC) form.",
654
+ fix: "Deduplicate paths. Comparisons use the canonical form: decoded and NFC-normalized.",
707
655
  },
708
656
  manifest_too_many_files: {
709
657
  summary: "The upload manifest declares more files than the allowed ceiling.",
@@ -723,15 +671,15 @@ export const ERROR_DOCS = {
723
671
  },
724
672
  move_target_capacity_lost: {
725
673
  summary: "The selected move target no longer has capacity for the space.",
726
- fix: "Retry the move with a different target or after capacity is freed.",
674
+ fix: "Retry the move with a different target, or retry after capacity is freed.",
727
675
  },
728
676
  name_managed_by_config: {
729
677
  summary: "The space name is managed by sf.jsonc while its live version declares one.",
730
- fix: "Change name in sf.jsonc and publish, or remove name from the file to rename the space through the API.",
678
+ fix: "Change `name` in `sf.jsonc` and publish, or remove `name` from the file to rename the space through the API.",
731
679
  },
732
680
  nameserver_delegation_required: {
733
681
  summary: `This operation requires the domain to be delegated to ${BRAND.productName} nameservers.`,
734
- fix: "Update the domain's nameservers at the registrar, then retry once delegation propagates.",
682
+ fix: "Update the domain's nameservers at the registrar. After delegation propagates, retry.",
735
683
  },
736
684
  nameserver_divergence: {
737
685
  summary: "The domain's observed nameservers diverge from the expected set.",
@@ -739,7 +687,7 @@ export const ERROR_DOCS = {
739
687
  },
740
688
  noop_publish: {
741
689
  summary: "The publish matched the live version exactly, so nothing changed.",
742
- fix: "No action needed. The existing live version already serves this content.",
690
+ fix: "No action is needed. The existing live version already serves this content.",
743
691
  },
744
692
  not_enrolled: {
745
693
  summary: "This account is not enrolled in the private beta, so the API cannot be used yet.",
@@ -747,11 +695,11 @@ export const ERROR_DOCS = {
747
695
  },
748
696
  not_found: {
749
697
  summary: "The requested resource was not found.",
750
- fix: "Verify the id and that your credential can access the resource.",
698
+ fix: "Verify that the id is correct and that your credential can access the resource.",
751
699
  },
752
700
  path_case_collision: {
753
701
  summary: "Two file paths differ only by letter case, which collides on serving.",
754
- fix: "Rename one of the files so paths are unique case-insensitively.",
702
+ fix: "Rename one of the files so that paths are unique case-insensitively.",
755
703
  },
756
704
  path_too_long: {
757
705
  summary: "A file path exceeds the maximum length.",
@@ -763,15 +711,11 @@ export const ERROR_DOCS = {
763
711
  },
764
712
  plan_grant_already_revoked: {
765
713
  summary: "This plan grant was already revoked.",
766
- fix: "Nothing to do. Create a new grant if the team should regain the plan.",
714
+ fix: "No action is needed. If the team should regain the plan, create a new grant.",
767
715
  },
768
716
  placement_invalid_burstable: {
769
717
  summary: "The placement burstable option was used with an unsupported placement mode.",
770
- fix: 'Set placement.mode to "dedicated" before setting placement.burstable, or remove the burstable option.',
771
- },
772
- placement_mode_requires_plan: {
773
- summary: "The requested placement mode requires a plan entitlement.",
774
- fix: "Upgrade the team plan or choose shared placement.",
718
+ fix: 'Set `placement.mode` to `"dedicated"` before setting `placement.burstable`, or remove the burstable option.',
775
719
  },
776
720
  platform_tenant_immutable_client: {
777
721
  summary: "The tenant's provider client cannot be changed.",
@@ -781,13 +725,25 @@ export const ERROR_DOCS = {
781
725
  summary: "The requested key policy grants more than your own credential allows.",
782
726
  fix: "Request a policy that is a subset of the credential creating the key.",
783
727
  },
728
+ prebuilt_metadata_invalid: {
729
+ summary: "The metadata file next to the prebuilt archive exists but cannot be read or parsed, so the build's runtime shape is unknown.",
730
+ fix: "Re-run `sf build` to regenerate the archive and its metadata together. If the archive contains plain files, delete the metadata file.",
731
+ },
732
+ ingest_admission_exceeded: {
733
+ summary: "Too many concurrent uploads for this space.",
734
+ fix: "Wait for the Retry-After window, then resume. At most 4 uploads run per space at once.",
735
+ },
784
736
  principal_space_mismatch: {
785
737
  summary: "The space does not belong to the principal in the request.",
786
738
  fix: "Use the space's owning team or account in the request path.",
787
739
  },
740
+ promote_admission_exceeded: {
741
+ summary: "Too many archived files are being restored for this space right now.",
742
+ fix: "Retry shortly. Spacefast limits restores to protect the host.",
743
+ },
788
744
  provider_error: {
789
- summary: "The hosting provider reported an error.",
790
- fix: "Retry. If the error persists, contact support with the requestId.",
745
+ summary: "WP Cloud reported an error.",
746
+ fix: "Retry. If the error persists, contact support with the `requestId`.",
791
747
  },
792
748
  provider_job_failed: {
793
749
  summary: "A hosting-provider job failed while processing this operation.",
@@ -795,27 +751,35 @@ export const ERROR_DOCS = {
795
751
  },
796
752
  provider_job_timeout: {
797
753
  summary: "A hosting-provider job timed out while processing this operation.",
798
- fix: "Retry the operation. If the provider is slow right now, wait and retry again.",
754
+ fix: "Retry the operation. If the provider is slow, wait and retry again.",
755
+ },
756
+ provider_privilege: {
757
+ summary: "WP Cloud does not grant this client permission to change the setting.",
758
+ fix: "Leave the provider-owned setting unchanged or contact support to request the required provider capability.",
799
759
  },
800
760
  provider_runtime_feature_unsupported: {
801
- summary: "The hosting provider does not support this runtime feature.",
761
+ summary: "WP Cloud does not support this runtime feature.",
802
762
  fix: "Check the feature's availability for this site's runtime.",
803
763
  },
804
764
  provider_site_id_required: {
805
765
  summary: "A provider site id is required for this internal operation.",
806
- fix: "Pass the provider site reference.",
766
+ fix: "Pass the provider site id.",
807
767
  },
808
768
  proxy_upstream_denied: {
809
769
  summary: "The proxy upstream is on a denied network and cannot be used.",
810
- fix: "Proxy only to public HTTPS upstreams. Private and internal addresses are blocked.",
770
+ fix: "Proxy only to public HTTPS upstreams. Spacefast blocks private and internal addresses.",
811
771
  },
812
772
  proxy_upstream_unresolved: {
813
773
  summary: "The proxy upstream hostname cannot be resolved.",
814
- fix: "Verify the upstream DNS name resolves publicly, then publish again.",
774
+ fix: "Verify that the upstream DNS name resolves publicly, then publish again.",
775
+ },
776
+ publish_session_expired: {
777
+ summary: "This publish session expired before it was finalized.",
778
+ fix: "Start a new publish. Spacefast keeps declared uploads for 24 hours only.",
815
779
  },
816
780
  publish_archive_compression_ratio_exceeded: {
817
781
  summary: "The archive's compression ratio is suspiciously high and was rejected.",
818
- fix: "Repackage the content without highly-compressible filler data.",
782
+ fix: "Repackage the content without highly compressible filler data.",
819
783
  },
820
784
  publish_archive_expanded_size_exceeded: {
821
785
  summary: "The archive expands beyond the maximum allowed total size.",
@@ -831,7 +795,7 @@ export const ERROR_DOCS = {
831
795
  },
832
796
  publish_base_changed: {
833
797
  summary: "Someone published new space settings after the base you loaded, so saving would overwrite their change.",
834
- fix: "Reload the latest settings, review the difference, and save again. Pass force only to overwrite deliberately.",
798
+ fix: "Reload the latest settings, review the difference, and save again. Pass `force` only to overwrite deliberately.",
835
799
  },
836
800
  publish_bytes_missing: {
837
801
  summary: "The publish has no complete staged content to materialize.",
@@ -839,7 +803,7 @@ export const ERROR_DOCS = {
839
803
  },
840
804
  publish_config_unsupported: {
841
805
  summary: "The publish carries configuration this endpoint does not support.",
842
- fix: "Move the configuration into sf.jsonc or the space settings.",
806
+ fix: "Move the configuration into `sf.jsonc` or the space settings.",
843
807
  },
844
808
  publish_failed: {
845
809
  summary: "The publish failed before going live.",
@@ -859,11 +823,11 @@ export const ERROR_DOCS = {
859
823
  },
860
824
  publish_not_cancelable: {
861
825
  summary: "The publish is past the point where it can be canceled.",
862
- fix: "Wait for the publish to finish, then roll back by promoting a previous version if needed.",
826
+ fix: "Wait for the publish to finish. To roll back, promote a previous version.",
863
827
  },
864
828
  publish_path_collision: {
865
829
  summary: "Two different artifacts would serve the same URL after directory-index or clean-URL resolution.",
866
- fix: "Rename or remove one artifact so every request route has one owner.",
830
+ fix: "Rename or remove one artifact so that every request route has one owner.",
867
831
  },
868
832
  publish_path_invalid: {
869
833
  summary: "A publish path is not a relative, normalized POSIX path.",
@@ -871,7 +835,7 @@ export const ERROR_DOCS = {
871
835
  },
872
836
  publish_setup_failed: {
873
837
  summary: "Provisioning for this publish failed.",
874
- fix: "Retry the publish. If it persists, contact support with the requestId.",
838
+ fix: "Retry the publish. If the error persists, contact support with the `requestId`.",
875
839
  },
876
840
  publish_snapshot_empty: {
877
841
  summary: "An empty snapshot was sent without an explicit base version.",
@@ -889,6 +853,14 @@ export const ERROR_DOCS = {
889
853
  summary: "The named job queue does not exist.",
890
854
  fix: "Check the queue name against the operator queue list.",
891
855
  },
856
+ response_headers_unservable: {
857
+ summary: "A file needs a response header that the platform cannot deliver for large files.",
858
+ fix: "Reduce the file below 100 MiB or drop the custom header.",
859
+ },
860
+ response_table_too_large: {
861
+ summary: "A compiled response table exceeded the 1 MiB per-file limit.",
862
+ fix: "This version has an unusually dense path set. Contact support with the `requestId`.",
863
+ },
892
864
  rate_limited: {
893
865
  summary: "Too many requests were made in a short window.",
894
866
  fix: "Wait for the window in the Retry-After header to pass, then retry.",
@@ -903,11 +875,15 @@ export const ERROR_DOCS = {
903
875
  },
904
876
  resource_revision_changed: {
905
877
  summary: "The resource changed after you loaded it, so the stale write was rejected.",
906
- fix: "Use the current resource returned in error.details.current, reapply the intended fields, and send its revision as expectedRevision.",
878
+ fix: "Use the current resource returned in `error.details.current`, reapply the intended fields, and send its revision as `expectedRevision`.",
879
+ },
880
+ review_item_claimed: {
881
+ summary: "Another reviewer already claimed this review item.",
882
+ fix: "Pick a different item, or ask the current assignee to release it. The assignee's id is in `error.details.assignedToUserId`.",
907
883
  },
908
884
  routing_rules_over_plan: {
909
885
  summary: "The published _redirects and _headers exceed the plan's routing-rule allowance.",
910
- fix: "Reduce the rule count. Still stuck? POST /v1/feedback with the error code and request id.",
886
+ fix: "Reduce the rule count. If you still need more rules, POST to `/v1/feedback` with the error code and the `requestId`.",
911
887
  },
912
888
  runtime_action_forbidden: {
913
889
  summary: "The runtime credential does not allow this action.",
@@ -915,7 +891,7 @@ export const ERROR_DOCS = {
915
891
  },
916
892
  runtime_api_not_found: {
917
893
  summary: "The runtime management endpoint was not found.",
918
- fix: "Send the request with the management hostname as the Host header. Management routes are not served on public hostnames.",
894
+ fix: "Send the request with the management hostname as the Host header. Spacefast does not serve management routes on public hostnames.",
919
895
  },
920
896
  runtime_callback_forbidden: {
921
897
  summary: "The runtime callback cannot be authenticated.",
@@ -923,23 +899,19 @@ export const ERROR_DOCS = {
923
899
  },
924
900
  runtime_dev_unsupported: {
925
901
  summary: "`sf dev` cannot run this runtime locally yet.",
926
- fix: "Run your framework's own dev server (`next dev`, `vite`, …) and publish with `sf publish` when you are ready.",
927
- },
928
- runtime_engine_zip_missing: {
929
- summary: "The runtime engine artifact is missing from this deployment.",
930
- fix: "Rebuild the control plane so dist/runtime-engine.zip exists.",
902
+ fix: "Run your framework's own dev server, such as `next dev` or `vite`. When you are ready, publish with `sf publish`.",
931
903
  },
932
904
  runtime_hostname_unassigned: {
933
905
  summary: "The hostname is not assigned to a runtime, so the request cannot be routed.",
934
- fix: `Verify the binding is active and DNS points at ${BRAND.productName}.`,
906
+ fix: `Verify that the binding is active and that DNS points at ${BRAND.productName}.`,
935
907
  },
936
908
  runtime_instance_mismatch: {
937
909
  summary: "The request reached a different runtime instance than the one it was issued for.",
938
- fix: "Re-request instructions. The space is on another instance now.",
910
+ fix: "Re-request instructions. The space is on another instance.",
939
911
  },
940
912
  runtime_jti_missing: {
941
913
  summary: "The runtime token is missing its replay-protection id.",
942
- fix: "Mint a fresh runtime token. Tokens must carry a jti claim.",
914
+ fix: "Mint a fresh runtime token. Tokens must carry a `jti` claim.",
943
915
  },
944
916
  runtime_jti_replayed: {
945
917
  summary: "The runtime token was already used. Replays are rejected.",
@@ -951,7 +923,7 @@ export const ERROR_DOCS = {
951
923
  },
952
924
  runtime_kind_mismatch: {
953
925
  summary: "This operation is only available for a different runtime kind.",
954
- fix: "Check `sf runtime status` for what the live version actually runs, then use the surface that runtime supports.",
926
+ fix: "Check `sf runtime status` for what the live version actually runs, then use the operations that runtime supports.",
955
927
  },
956
928
  runtime_management_unavailable: {
957
929
  summary: "The runtime management surface is unavailable for this site.",
@@ -959,19 +931,27 @@ export const ERROR_DOCS = {
959
931
  },
960
932
  runtime_not_provisioned: {
961
933
  summary: "The space does not serve a published version yet, so it has no runtime data to read.",
962
- fix: "Publish a version first. If a publish is already running, wait for it the operation receipt reports progress.",
934
+ fix: "Publish a version first. If a publish is already running, wait for it. The operation receipt reports progress.",
963
935
  },
964
936
  runtime_operation_missing: {
965
937
  summary: "The runtime operation referenced by this request was not found.",
966
938
  fix: "Re-request instructions and retry with a current operation id.",
967
939
  },
940
+ runtime_purge_failed: {
941
+ summary: "Content updated but the edge cache purge did not confirm.",
942
+ fix: "The runtime retries automatically. Recent visitors may briefly see the previous version.",
943
+ },
944
+ runtime_release_unverifiable: {
945
+ summary: "The requested platform release could not be verified at its origin.",
946
+ fix: "Check that the release exists and published its full set of artifacts, then request it again.",
947
+ },
968
948
  runtime_scope_forbidden: {
969
949
  summary: "The runtime token's scope does not cover this path or action.",
970
950
  fix: "Use the token minted for this exact session, space, and step.",
971
951
  },
972
952
  runtime_token_bad_signature: {
973
953
  summary: "The runtime token signature did not verify.",
974
- fix: "Mint a fresh token. Verify clocks and JWKS freshness if it persists.",
954
+ fix: "Mint a fresh runtime token. If the error persists, verify clocks and JWKS freshness.",
975
955
  },
976
956
  runtime_token_expired: {
977
957
  summary: "The runtime token is expired.",
@@ -983,7 +963,7 @@ export const ERROR_DOCS = {
983
963
  },
984
964
  runtime_unauthorized: {
985
965
  summary: "The request to the runtime carried no valid credential.",
986
- fix: "Send the runtime JWT in the Authorization header.",
966
+ fix: "Send the runtime token in the Authorization header.",
987
967
  },
988
968
  runtime_upload_operation_not_supported: {
989
969
  summary: "The runtime upload session does not support this operation.",
@@ -995,7 +975,7 @@ export const ERROR_DOCS = {
995
975
  },
996
976
  scan_pending: {
997
977
  summary: "The content is still being scanned for safety and cannot be served yet.",
998
- fix: "Wait for the scan to finish. Serving resumes automatically once it clears.",
978
+ fix: "Wait for the scan to finish. Serving resumes automatically once the scan clears.",
999
979
  },
1000
980
  secret_variable_in_template: {
1001
981
  summary: "A secret variable was referenced in a template, which is blocked.",
@@ -1003,7 +983,7 @@ export const ERROR_DOCS = {
1003
983
  },
1004
984
  service_booting: {
1005
985
  summary: "The process that received this request is still starting and cannot serve it yet.",
1006
- fix: "Wait for the Retry-After window, then send the same request again.",
986
+ fix: "Wait for the `Retry-After` window, then send the same request again.",
1007
987
  },
1008
988
  service_signature_invalid: {
1009
989
  summary: "The service request signature cannot be verified.",
@@ -1011,7 +991,7 @@ export const ERROR_DOCS = {
1011
991
  },
1012
992
  site_already_deleted: {
1013
993
  summary: "The site was already deleted.",
1014
- fix: "No action needed. The site is gone.",
994
+ fix: "No action is needed. The site is gone.",
1015
995
  },
1016
996
  site_has_live_spaces: {
1017
997
  summary: "The site still has live spaces assigned to it, so it cannot be deleted.",
@@ -1059,27 +1039,23 @@ export const ERROR_DOCS = {
1059
1039
  },
1060
1040
  space_already_claimed: {
1061
1041
  summary: "The space was already claimed. A claim can only succeed once.",
1062
- fix: "If you published this space, exchange your claim token once at POST /v1/anonymous-claim/exchange. Keep publishing to the same spaceId with that durable API key. Otherwise ask the owner for access do not publish a duplicate space.",
1063
- },
1064
- space_capacity_warming: {
1065
- summary: "This space is waiting on serving capacity that is being provisioned in the background.",
1066
- fix: "Wait for the Retry-After window, then send the same publish again. No version was created and no files were uploaded.",
1042
+ fix: "If you published this space, exchange your space key once at `POST /v1/claim/exchange`. Keep publishing to the same `spaceId` with that durable API key. Otherwise ask the owner for access. Do not publish a duplicate space.",
1067
1043
  },
1068
1044
  space_claim_unavailable: {
1069
1045
  summary: "This space cannot be claimed.",
1070
- fix: "Only anonymous, unexpired spaces with a valid claim token can be claimed.",
1046
+ fix: "Only anonymous, unexpired spaces with a valid space key can be claimed.",
1071
1047
  },
1072
1048
  space_claimed_credential_available: {
1073
- summary: "The space was claimed and its owner kept agent publishing enabled; this claim token now works exactly once as an exchange voucher.",
1074
- fix: "POST /v1/anonymous-claim/exchange with this claim token as bearer auth. Save the returned API key (e.g. .spacefast/state.json), then retry the request with it as Authorization: Bearer. Do not publish a new space.",
1049
+ summary: "The space was claimed and its owner kept agent publishing enabled; this space key now works exactly once as an exchange voucher.",
1050
+ fix: "`POST /v1/claim/exchange` with this space key as bearer auth. Save the returned API key (for example in `.spacefast/state.json`), then retry the request with that key as `Authorization: Bearer`. Do not publish a new space.",
1075
1051
  },
1076
1052
  space_disabled: {
1077
1053
  summary: "The space is disabled and cannot be served or modified.",
1078
- fix: "Check the disabled reason on the space. It explains the path to restore it.",
1054
+ fix: "Check the disabled reason on the space. The reason explains how to restore the space.",
1079
1055
  },
1080
1056
  space_expired: {
1081
1057
  summary: "The space expired and is no longer served.",
1082
- fix: "If it is within the recovery window, claim or restore it. Otherwise publish again.",
1058
+ fix: "If the space is within the recovery window, claim or restore it. Otherwise publish again.",
1083
1059
  },
1084
1060
  space_has_active_publish: {
1085
1061
  summary: "The space has a publish in progress, which blocks this operation.",
@@ -1093,37 +1069,13 @@ export const ERROR_DOCS = {
1093
1069
  summary: "The space is missing its persisted default hostname identity.",
1094
1070
  fix: "Contact support. Retrying cannot safely recreate a permanent hostname identity.",
1095
1071
  },
1096
- space_import_archive_invalid: {
1097
- summary: `The import archive is not a valid ${BRAND.productName} export.`,
1098
- fix: "Export the source space again and upload the unmodified archive.",
1099
- },
1100
- space_import_archive_too_large: {
1101
- summary: "The import archive exceeds the maximum allowed size.",
1102
- fix: "Reduce the export size, or import versions individually.",
1103
- },
1104
- space_import_config_only_archive: {
1105
- summary: "The archive contains only configuration and cannot be imported as content.",
1106
- fix: "Include files in the export, or apply the configuration directly.",
1107
- },
1108
- space_import_runtime_schema_unsupported: {
1109
- summary: "The export was produced by an unsupported runtime schema version.",
1110
- fix: "Re-export from a current runtime, or upgrade before exporting.",
1111
- },
1112
- space_move_would_strand_zero_data: {
1113
- summary: "The Space runs Zero, whose database and object storage live on the site the Space is placed on. Relocating it would strand that data on the old site, so the move is refused.",
1114
- fix: "Nothing was moved and no data was lost. Migrating Zero data between sites is not implemented. Contact support if the space genuinely has to be relocated.",
1115
- },
1116
- space_moving: {
1117
- summary: "The space is moving between sites, which blocks this operation.",
1118
- fix: "Wait for the move to finish, then retry.",
1119
- },
1120
1072
  space_no_live_version: {
1121
1073
  summary: "The space has no live version, so this operation has nothing to act on.",
1122
1074
  fix: "Publish a version to the space, then retry.",
1123
1075
  },
1124
1076
  space_not_disabled: {
1125
1077
  summary: "The space is not disabled, so it cannot be restored.",
1126
- fix: "No action needed. The space is already active.",
1078
+ fix: "No action is needed. The space is already active.",
1127
1079
  },
1128
1080
  space_not_restorable: {
1129
1081
  summary: "The space is past its recovery window and cannot be restored.",
@@ -1143,11 +1095,11 @@ export const ERROR_DOCS = {
1143
1095
  },
1144
1096
  space_ref_ambiguous: {
1145
1097
  summary: "The space reference matches more than one accessible space.",
1146
- fix: "Use the spc_ id, or scope the reference with a teamRef.",
1098
+ fix: "Use the `spc_` id, or scope the reference with a `teamRef`.",
1147
1099
  },
1148
1100
  space_ref_required: {
1149
1101
  summary: "A space reference is required for this operation.",
1150
- fix: "Pass a spc_ id, slug, or hostname.",
1102
+ fix: "Pass a `spc_` id, slug, or hostname.",
1151
1103
  },
1152
1104
  space_transferring: {
1153
1105
  summary: "The space has a transfer in progress, which blocks this operation.",
@@ -1174,36 +1126,36 @@ export const ERROR_DOCS = {
1174
1126
  fix: "Target a static-runtime space.",
1175
1127
  },
1176
1128
  storage_auth_required: {
1177
- summary: "This storage operation requires an authenticated Zero user.",
1178
- fix: "Sign in to the hosted Zero app, then retry the storage operation.",
1129
+ summary: "This storage operation requires an authenticated visitor.",
1130
+ fix: "Sign in to the space, then retry the storage operation.",
1179
1131
  },
1180
1132
  storage_bucket_unavailable: {
1181
1133
  summary: "No usable internal storage bucket is configured for this operation.",
1182
1134
  fix: "Check the storage bucket registry and credential environment references, then retry.",
1183
1135
  },
1184
1136
  storage_content_blocked: {
1185
- summary: "The object contains executable or active web content that Zero storage does not serve.",
1137
+ summary: "The object contains executable or active web content that Spacefast storage does not serve.",
1186
1138
  fix: "Upload a passive file type without HTML, script, SVG, PHP, or executable bytes.",
1187
1139
  },
1188
1140
  storage_delete_forbidden: {
1189
- summary: "The current Zero user did not upload this object.",
1141
+ summary: "The current visitor did not upload this object.",
1190
1142
  fix: "Sign in as the original uploader before deleting the object.",
1191
1143
  },
1192
1144
  storage_empty_file: {
1193
- summary: "The Zero storage upload is empty.",
1145
+ summary: "The storage upload is empty.",
1194
1146
  fix: "Upload a file containing at least 1 byte.",
1195
1147
  },
1196
1148
  storage_file_too_large: {
1197
- summary: "The Zero storage object exceeds the 5 MiB file limit.",
1149
+ summary: "The storage object exceeds the 5 MiB file limit.",
1198
1150
  fix: "Upload a smaller object.",
1199
1151
  },
1200
1152
  storage_key_invalid: {
1201
- summary: "The Zero storage key is malformed.",
1202
- fix: "Use the public or private object key returned by storage.upload.",
1153
+ summary: "The storage object id is malformed.",
1154
+ fix: "Use the 32-character object id returned by `storage.upload`.",
1203
1155
  },
1204
1156
  storage_object_not_found: {
1205
- summary: "The requested Zero storage object does not exist.",
1206
- fix: "Check the object key or upload the object again.",
1157
+ summary: "The requested storage object does not exist.",
1158
+ fix: "Check the object id or upload the object again.",
1207
1159
  },
1208
1160
  storage_quota_already_unlimited: {
1209
1161
  summary: "The team already has unlimited storage.",
@@ -1215,23 +1167,19 @@ export const ERROR_DOCS = {
1215
1167
  },
1216
1168
  storage_quota_exceeded: {
1217
1169
  summary: "The operation would exceed its storage allowance.",
1218
- fix: "Delete unused Zero objects or old versions, reduce the upload size, then retry.",
1170
+ fix: "Delete unused storage objects or old versions, reduce the upload size, then retry.",
1219
1171
  },
1220
1172
  storage_unavailable: {
1221
- summary: "The Zero runtime cannot read or persist object storage.",
1222
- fix: "Retry on a healthy runtime. Contact support if the failure persists.",
1223
- },
1224
- storage_usage_unavailable: {
1225
- summary: "Storage usage cannot be computed right now.",
1226
- fix: "Retry shortly.",
1173
+ summary: "The runtime cannot read or persist object storage.",
1174
+ fix: "Retry on a healthy runtime. If the failure persists, contact support.",
1227
1175
  },
1228
1176
  stripe_error: {
1229
1177
  summary: "The billing provider reported an error.",
1230
- fix: "Retry. If it persists, check the team's billing settings.",
1178
+ fix: "Retry. If the error persists, check the team's billing settings.",
1231
1179
  },
1232
1180
  superseded_by_publish: {
1233
1181
  summary: "A newer publish superseded this operation, so it was skipped.",
1234
- fix: "No action needed. The newer publish already carries the change.",
1182
+ fix: "No action is needed. The newer publish already carries the change.",
1235
1183
  },
1236
1184
  takeover_notice_window: {
1237
1185
  summary: "The hostname was recently bound elsewhere. A takeover notice window applies.",
@@ -1263,11 +1211,11 @@ export const ERROR_DOCS = {
1263
1211
  },
1264
1212
  template_file_too_large: {
1265
1213
  summary: "A template file exceeds the maximum size for substitution.",
1266
- fix: "Keep template files under the documented size limit (16 KB).",
1214
+ fix: "Keep template files at or under 16 KB.",
1267
1215
  },
1268
1216
  template_not_in_version: {
1269
1217
  summary: "The configuration names a template file the version does not contain.",
1270
- fix: "Upload the file or remove its templates entry from sf.jsonc.",
1218
+ fix: "Upload the file or remove its `templates` entry from `sf.jsonc`.",
1271
1219
  },
1272
1220
  template_variable_unresolved: {
1273
1221
  summary: "A template references a variable that has no value.",
@@ -1299,23 +1247,19 @@ export const ERROR_DOCS = {
1299
1247
  },
1300
1248
  theme_value_invalid: {
1301
1249
  summary: "A theme value in the configuration is outside the allowed grammar.",
1302
- fix: "Use allowed CSS values. The offending key is dropped with a warning otherwise.",
1250
+ fix: "Use allowed CSS values. Otherwise the offending key is dropped with a warning.",
1303
1251
  },
1304
1252
  transfer_cross_tenant_unsupported: {
1305
1253
  summary: "Spaces cannot be transferred across tenants.",
1306
1254
  fix: "Export the space and import it under the target tenant instead.",
1307
1255
  },
1308
- transfer_move_failed: {
1309
- summary: "The space move backing this transfer failed.",
1310
- fix: "Retry the transfer. If it persists, contact support with the transfer id.",
1311
- },
1312
1256
  transfer_not_cancelable: {
1313
1257
  summary: "The transfer is past the point where it can be canceled.",
1314
1258
  fix: "Wait for the transfer to finish.",
1315
1259
  },
1316
1260
  transfer_push_failed: {
1317
1261
  summary: "The source runtime cannot push the space blobs into the transfer bucket.",
1318
- fix: "Retry the move. If it persists, check the source runtime and bucket configuration.",
1262
+ fix: "Retry the move. If the failure persists, check the source runtime and bucket configuration.",
1319
1263
  },
1320
1264
  transfer_source_changed: {
1321
1265
  summary: "The space changed since the transfer was created, so it must be re-confirmed.",
@@ -1327,7 +1271,7 @@ export const ERROR_DOCS = {
1327
1271
  },
1328
1272
  transfer_verify_failed: {
1329
1273
  summary: "The target runtime cannot verify transferred blob content.",
1330
- fix: "Retry the move. If it persists, check the target runtime and bucket integrity.",
1274
+ fix: "Retry the move. If the failure persists, check the target runtime and bucket integrity.",
1331
1275
  },
1332
1276
  unauthorized: {
1333
1277
  summary: "The request carried no valid credential.",
@@ -1355,15 +1299,11 @@ export const ERROR_DOCS = {
1355
1299
  },
1356
1300
  user_banned: {
1357
1301
  summary: "This user is banned for a policy or abuse violation and cannot perform this action.",
1358
- fix: "Contact support to appeal the ban if you believe it is a mistake.",
1302
+ fix: "If you believe the ban is a mistake, contact support to appeal it.",
1359
1303
  },
1360
1304
  validation_error: {
1361
1305
  summary: "A request field failed validation.",
1362
- fix: "Fix the field referenced by pointer and details, then retry.",
1363
- },
1364
- variable_cascade_failed: {
1365
- summary: "Republishing spaces after a variable change failed.",
1366
- fix: "Check the operation's diagnostics. Live content keeps serving the previous values.",
1306
+ fix: "Fix the field referenced by `pointer` and `details`, then retry.",
1367
1307
  },
1368
1308
  verification_required: {
1369
1309
  summary: "Domain verification is required before this operation.",
@@ -1371,7 +1311,7 @@ export const ERROR_DOCS = {
1371
1311
  },
1372
1312
  version_already_live: {
1373
1313
  summary: "The version is already live on this channel.",
1374
- fix: "No action needed.",
1314
+ fix: "No action is needed.",
1375
1315
  },
1376
1316
  version_artifact_not_found: {
1377
1317
  summary: "The requested version artifact was not found.",
@@ -1415,7 +1355,7 @@ export const ERROR_DOCS = {
1415
1355
  },
1416
1356
  version_in_use: {
1417
1357
  summary: "The version is referenced by one or more channels and cannot be deleted.",
1418
- fix: "Promote another version on those channels first. Details lists them.",
1358
+ fix: "Promote another version on those channels first. The `details` field lists them.",
1419
1359
  },
1420
1360
  version_live: {
1421
1361
  summary: "The version is live and cannot be deleted.",
@@ -1447,7 +1387,7 @@ export const ERROR_DOCS = {
1447
1387
  },
1448
1388
  version_quota_exceeded: {
1449
1389
  summary: "The space is at its version quota.",
1450
- fix: "Delete old versions. Still stuck? POST /v1/feedback with the error code and request id.",
1390
+ fix: "Delete old versions. If the quota error persists, `POST /v1/feedback` with the error code and request id.",
1451
1391
  },
1452
1392
  version_total_bytes_exceeded: {
1453
1393
  summary: "The version exceeds the maximum total size.",
@@ -1461,17 +1401,13 @@ export const ERROR_DOCS = {
1461
1401
  summary: "WHOIS data is unavailable for this domain right now.",
1462
1402
  fix: "Retry later.",
1463
1403
  },
1464
- zero_activating: {
1465
- summary: "Zero endpoints are activating.",
1466
- fix: "Wait for the dedicated runtime move to complete, then retry the request.",
1467
- },
1468
1404
  zero_ai_unavailable: {
1469
1405
  summary: "The local Zero AI service is not configured.",
1470
1406
  fix: "Configure an AI handler in the project, then restart `sf dev` before calling the AI service.",
1471
1407
  },
1472
1408
  zero_artifact_abi_mismatch: {
1473
1409
  summary: "The Zero endpoint artifact was built for a different runner ABI.",
1474
- fix: `Rebuild and republish the Zero project with the current ${BRAND.productName} CLI and runtime.`,
1410
+ fix: `Rebuild the Zero project with the current ${BRAND.productName} CLI and runtime, then publish it again.`,
1475
1411
  },
1476
1412
  zero_artifact_invalid: {
1477
1413
  summary: "The Zero endpoint artifact is missing required runtime metadata.",
@@ -1491,7 +1427,7 @@ export const ERROR_DOCS = {
1491
1427
  },
1492
1428
  zero_auth_unavailable: {
1493
1429
  summary: "Hosted Zero auth is not configured for this deployment.",
1494
- fix: "Finalize the Zero version with hosted auth URLs or use guest/local auth.",
1430
+ fix: "Finalize the Zero version with hosted auth URLs, or use guest or local auth.",
1495
1431
  },
1496
1432
  zero_blob_key_invalid: {
1497
1433
  summary: "The local Zero blob key is invalid.",
@@ -1511,15 +1447,15 @@ export const ERROR_DOCS = {
1511
1447
  },
1512
1448
  zero_bootstrap_encode_failed: {
1513
1449
  summary: "The Zero runner cannot encode the JavaScript bootstrap data.",
1514
- fix: "Retry with valid request metadata. Report the issue if it persists.",
1450
+ fix: "Retry with valid request metadata. If the issue persists, report it.",
1515
1451
  },
1516
1452
  zero_bytecode_hash_mismatch: {
1517
1453
  summary: "The Zero endpoint bytecode hash does not match its artifact metadata.",
1518
- fix: "Rebuild and republish so bytecode and endpoint metadata are from the same build.",
1454
+ fix: "Rebuild and publish again so bytecode and endpoint metadata are from the same build.",
1519
1455
  },
1520
1456
  zero_bytecode_invalid: {
1521
1457
  summary: "The Zero endpoint bytecode cannot be loaded by QuickJS.",
1522
- fix: "Rebuild the project with the current Zero runner and redeploy.",
1458
+ fix: "Rebuild the project with the current Zero runner and publish again.",
1523
1459
  },
1524
1460
  zero_bytecode_path_invalid: {
1525
1461
  summary: "The Zero endpoint bytecode path is invalid.",
@@ -1531,7 +1467,7 @@ export const ERROR_DOCS = {
1531
1467
  },
1532
1468
  zero_capabilities_encode_failed: {
1533
1469
  summary: "The runtime cannot encode the Zero endpoint capabilities.",
1534
- fix: "Rebuild with valid capability metadata. Report the failure if it persists.",
1470
+ fix: "Rebuild with valid capability metadata. If the failure persists, report it.",
1535
1471
  },
1536
1472
  zero_client_bundle_not_loaded: {
1537
1473
  summary: "The local Zero dev client bundle is not generated or loaded.",
@@ -1539,11 +1475,11 @@ export const ERROR_DOCS = {
1539
1475
  },
1540
1476
  zero_db_connect_failed: {
1541
1477
  summary: "The Zero runner cannot connect to the configured database.",
1542
- fix: "Verify DATABASE_URL or the generated MySQL connection variables and retry.",
1478
+ fix: "Verify `DATABASE_URL` or the generated MySQL connection variables and retry.",
1543
1479
  },
1544
1480
  zero_db_execute_failed: {
1545
1481
  summary: "A Zero database write failed.",
1546
- fix: "Inspect the mutation, schema, and database logs, then retry after fixing the SQL issue.",
1482
+ fix: "Inspect the mutation, schema, and database logs. Fix the SQL issue, then retry.",
1547
1483
  },
1548
1484
  zero_db_export_cursor_invalid: {
1549
1485
  summary: "The local database export cursor is invalid or belongs to another export.",
@@ -1571,7 +1507,7 @@ export const ERROR_DOCS = {
1571
1507
  },
1572
1508
  zero_db_host_install_failed: {
1573
1509
  summary: "The Zero runner cannot install the database host bridge.",
1574
- fix: "Rebuild with a current runner and report the failure if it repeats.",
1510
+ fix: "Rebuild with a current runner. If the failure repeats, report it.",
1575
1511
  },
1576
1512
  zero_db_operation_invalid: {
1577
1513
  summary: "The Zero database bridge received an invalid operation payload.",
@@ -1587,7 +1523,7 @@ export const ERROR_DOCS = {
1587
1523
  },
1588
1524
  zero_db_query_failed: {
1589
1525
  summary: "A Zero database read failed.",
1590
- fix: "Inspect the query, schema, and database logs, then retry after fixing the SQL issue.",
1526
+ fix: "Inspect the query, schema, and database logs. Fix the SQL issue, then retry.",
1591
1527
  },
1592
1528
  zero_db_row_invalid: {
1593
1529
  summary: "A database row cannot be converted into a Zero response value.",
@@ -1603,7 +1539,7 @@ export const ERROR_DOCS = {
1603
1539
  },
1604
1540
  zero_db_transaction_active: {
1605
1541
  summary: "The Zero runner tried to start a database transaction while one was already active.",
1606
- fix: "Rebuild with the current Zero runner and report the failure if it repeats.",
1542
+ fix: "Rebuild with the current Zero runner. If the failure repeats, report it.",
1607
1543
  },
1608
1544
  zero_db_transaction_commit_failed: {
1609
1545
  summary: "The Zero database transaction cannot be committed.",
@@ -1615,7 +1551,7 @@ export const ERROR_DOCS = {
1615
1551
  },
1616
1552
  zero_db_transaction_missing: {
1617
1553
  summary: "The Zero runner tried to finish a database transaction that was not active.",
1618
- fix: "Rebuild with the current Zero runner and report the failure if it repeats.",
1554
+ fix: "Rebuild with the current Zero runner. If the failure repeats, report it.",
1619
1555
  },
1620
1556
  zero_db_transaction_rollback_failed: {
1621
1557
  summary: "The Zero database transaction cannot be rolled back cleanly.",
@@ -1635,11 +1571,11 @@ export const ERROR_DOCS = {
1635
1571
  },
1636
1572
  zero_db_url_invalid: {
1637
1573
  summary: "The Zero database URL is malformed.",
1638
- fix: "Set DATABASE_URL or the generated database variables to a valid MySQL connection URL.",
1574
+ fix: "Set `DATABASE_URL` or the generated database variables to a valid MySQL connection URL.",
1639
1575
  },
1640
1576
  zero_db_url_missing: {
1641
1577
  summary: "No Zero database URL is configured.",
1642
- fix: "Configure DATABASE_URL or finalize the version with database connection variables.",
1578
+ fix: "Configure `DATABASE_URL` or finalize the version with database connection variables.",
1643
1579
  },
1644
1580
  zero_dev_endpoint_failed: {
1645
1581
  summary: "A local Zero dev endpoint failed while handling the request.",
@@ -1647,7 +1583,7 @@ export const ERROR_DOCS = {
1647
1583
  },
1648
1584
  zero_dump_query_invalid: {
1649
1585
  summary: "The Zero database dump query parameters are invalid.",
1650
- fix: "Use valid table, limit, and cursor parameters.",
1586
+ fix: "Use valid `table`, `limit`, and `cursor` parameters.",
1651
1587
  },
1652
1588
  zero_endpoint_compile_failed: {
1653
1589
  summary: "The runtime cannot compile the Zero endpoint bytecode.",
@@ -1667,11 +1603,11 @@ export const ERROR_DOCS = {
1667
1603
  },
1668
1604
  zero_endpoint_index_invalid: {
1669
1605
  summary: "The Zero endpoint index does not contain valid endpoint mappings.",
1670
- fix: "Rebuild and republish the Zero project.",
1606
+ fix: "Rebuild the Zero project and publish it again.",
1671
1607
  },
1672
1608
  zero_endpoint_index_malformed: {
1673
1609
  summary: "The Zero endpoint index cannot be parsed.",
1674
- fix: "Rebuild the generated endpoint index and redeploy.",
1610
+ fix: "Rebuild the generated endpoint index and publish again.",
1675
1611
  },
1676
1612
  zero_endpoint_index_path_invalid: {
1677
1613
  summary: "The Zero endpoint index path is invalid.",
@@ -1679,7 +1615,7 @@ export const ERROR_DOCS = {
1679
1615
  },
1680
1616
  zero_endpoint_index_unreadable: {
1681
1617
  summary: "The Zero endpoint index cannot be read.",
1682
- fix: "Verify the version finalized with zero/endpoints-index.json present.",
1618
+ fix: "Verify the version finalized with `zero/endpoints-index.json` present.",
1683
1619
  },
1684
1620
  zero_endpoint_invalid: {
1685
1621
  summary: "A Zero endpoint definition or its database metadata is invalid.",
@@ -1687,7 +1623,7 @@ export const ERROR_DOCS = {
1687
1623
  },
1688
1624
  zero_endpoint_mismatch: {
1689
1625
  summary: "The requested Zero endpoint does not match the endpoint artifact.",
1690
- fix: "Rebuild routes and artifacts together and redeploy the version.",
1626
+ fix: "Rebuild routes and artifacts together, then publish the version again.",
1691
1627
  },
1692
1628
  zero_endpoint_not_found: {
1693
1629
  summary: "No Zero endpoint artifact exists for this endpoint id.",
@@ -1701,13 +1637,9 @@ export const ERROR_DOCS = {
1701
1637
  summary: "The Zero endpoints payload exceeds the supported endpoint count.",
1702
1638
  fix: "Reduce the project to at most 128 Zero endpoints, then publish again.",
1703
1639
  },
1704
- zero_requires_dedicated_plan: {
1705
- summary: "Zero endpoints require a plan with dedicated runtime isolation.",
1706
- fix: "Upgrade the team to a plan that includes Zero and dedicated runtime, then publish again.",
1707
- },
1708
1640
  zero_envelope_encode_failed: {
1709
1641
  summary: "The PHP bridge cannot encode the Zero runner request envelope.",
1710
- fix: "Retry with valid request data. Report the issue if it persists.",
1642
+ fix: "Retry with valid request data. If the issue persists, report it.",
1711
1643
  },
1712
1644
  zero_js_context_init_failed: {
1713
1645
  summary: "The Zero runner cannot initialize a QuickJS context.",
@@ -1723,11 +1655,11 @@ export const ERROR_DOCS = {
1723
1655
  },
1724
1656
  zero_js_globals_failed: {
1725
1657
  summary: "The Zero runner cannot install runtime globals for the endpoint.",
1726
- fix: "Rebuild with a current runner and report the failure if it repeats.",
1658
+ fix: "Rebuild with a current runner. If the failure repeats, report it.",
1727
1659
  },
1728
1660
  zero_js_response_malformed: {
1729
1661
  summary: "The Zero endpoint returned a malformed runner response.",
1730
- fix: "Return a valid Response or supported Zero handler result.",
1662
+ fix: "Return a valid `Response` or supported Zero handler result.",
1731
1663
  },
1732
1664
  zero_js_runtime_init_failed: {
1733
1665
  summary: "The Zero runner cannot initialize QuickJS.",
@@ -1735,7 +1667,7 @@ export const ERROR_DOCS = {
1735
1667
  },
1736
1668
  zero_log_query_invalid: {
1737
1669
  summary: "The Zero log query parameters are invalid.",
1738
- fix: "Use valid cursor, limit, handlerName, and requestId parameters.",
1670
+ fix: "Pass `cursor` exactly as the previous page's `nextCursor`, keep `limit` between 1 and 100, and send `since` and `until` as ISO timestamps.",
1739
1671
  },
1740
1672
  zero_method_not_allowed: {
1741
1673
  summary: "The request method is not allowed for this Zero endpoint.",
@@ -1747,7 +1679,7 @@ export const ERROR_DOCS = {
1747
1679
  },
1748
1680
  zero_query_name_missing: {
1749
1681
  summary: "A Zero realtime query subscription did not include a query name.",
1750
- fix: "Send a query.subscribe frame with a valid query name.",
1682
+ fix: "Send a `query.subscribe` frame with a valid query name.",
1751
1683
  },
1752
1684
  zero_realtime_forbidden: {
1753
1685
  summary: "The Zero realtime event intake credential is invalid.",
@@ -1759,7 +1691,7 @@ export const ERROR_DOCS = {
1759
1691
  },
1760
1692
  zero_realtime_operation_unsupported: {
1761
1693
  summary: "The Zero realtime websocket operation is unsupported.",
1762
- fix: "Use a supported Zero realtime operation such as query.subscribe or query.unsubscribe.",
1694
+ fix: "Use a supported Zero realtime operation such as `query.subscribe` or `query.unsubscribe`.",
1763
1695
  },
1764
1696
  zero_realtime_query_invalid: {
1765
1697
  summary: "The Zero realtime query subscription payload is invalid.",
@@ -1767,7 +1699,7 @@ export const ERROR_DOCS = {
1767
1699
  },
1768
1700
  zero_realtime_space_required: {
1769
1701
  summary: "The Zero realtime request does not identify a space.",
1770
- fix: "Use a /spaces/{spaceId} realtime URL or include a valid spaceId query parameter.",
1702
+ fix: "Use a `/spaces/{spaceId}` realtime URL or include a valid `spaceId` query parameter.",
1771
1703
  },
1772
1704
  zero_realtime_unavailable: {
1773
1705
  summary: "Zero realtime helpers are unavailable for this endpoint.",
@@ -1779,11 +1711,11 @@ export const ERROR_DOCS = {
1779
1711
  },
1780
1712
  zero_replay_failed: {
1781
1713
  summary: "The hosted Zero runtime cannot fetch realtime replay events.",
1782
- fix: "Retry shortly. Check the central realtime and control-plane logs if it persists.",
1714
+ fix: "Retry shortly. If the failure persists, check the central realtime and control-plane logs.",
1783
1715
  },
1784
1716
  zero_replay_query_invalid: {
1785
1717
  summary: "The hosted Zero realtime replay query is invalid.",
1786
- fix: "Use a valid afterEventId cursor and numeric limit.",
1718
+ fix: "Use a valid `afterEventId` cursor and numeric limit.",
1787
1719
  },
1788
1720
  zero_replay_unavailable: {
1789
1721
  summary: "Realtime replay is not configured for this Zero version.",
@@ -1791,7 +1723,7 @@ export const ERROR_DOCS = {
1791
1723
  },
1792
1724
  zero_request_body_too_large: {
1793
1725
  summary: "The Zero request body exceeds the runtime size limit.",
1794
- fix: "Send a smaller request body or move large payloads to blob/object storage.",
1726
+ fix: "Send a smaller request body or move large payloads to blob or object storage.",
1795
1727
  },
1796
1728
  zero_response_header_forbidden: {
1797
1729
  summary: "A Zero endpoint attempted to set a platform-managed response header.",
@@ -1827,7 +1759,7 @@ export const ERROR_DOCS = {
1827
1759
  },
1828
1760
  zero_runner_envelope_invalid: {
1829
1761
  summary: "The Zero runner request envelope is malformed.",
1830
- fix: "Use the generated runtime bridge and redeploy if generated files are stale.",
1762
+ fix: "Use the generated runtime bridge. If generated files are stale, publish again.",
1831
1763
  },
1832
1764
  zero_runner_failed: {
1833
1765
  summary: "The Zero runner process exited without a valid response.",
@@ -1839,15 +1771,15 @@ export const ERROR_DOCS = {
1839
1771
  },
1840
1772
  zero_runner_invalid_response: {
1841
1773
  summary: "The Zero runner output was not valid JSON.",
1842
- fix: "Inspect runner stderr and rebuild the runner if the failure persists.",
1774
+ fix: "Inspect runner stderr. If the failure persists, rebuild the runner.",
1843
1775
  },
1844
1776
  zero_runner_invalid_status: {
1845
1777
  summary: "The Zero runner returned an invalid HTTP status.",
1846
- fix: "Ensure endpoint handlers return a status between 100 and 599.",
1778
+ fix: "Return a status between 100 and 599 from endpoint handlers.",
1847
1779
  },
1848
1780
  zero_runner_protocol_unsupported: {
1849
1781
  summary: "The Zero runner received an unsupported invoke protocol.",
1850
- fix: "Rebuild and redeploy so the PHP bridge and Rust runner versions match.",
1782
+ fix: "Rebuild and publish again so the PHP bridge and Rust runner versions match.",
1851
1783
  },
1852
1784
  zero_runner_response_encode_failed: {
1853
1785
  summary: "The Zero runner cannot encode its response.",
@@ -1855,7 +1787,7 @@ export const ERROR_DOCS = {
1855
1787
  },
1856
1788
  zero_runner_stdin_invalid: {
1857
1789
  summary: "The Zero runner cannot read its request envelope.",
1858
- fix: "Retry. Report the runtime bridge failure if it persists.",
1790
+ fix: "Retry. If the runtime bridge failure persists, report it.",
1859
1791
  },
1860
1792
  zero_runner_stdin_too_large: {
1861
1793
  summary: "The Zero runner request envelope is too large.",
@@ -1877,14 +1809,6 @@ export const ERROR_DOCS = {
1877
1809
  summary: "The Zero run-handler payload exceeds the supported handler count.",
1878
1810
  fix: "Reduce the project to at most 128 Zero run handlers, then publish again.",
1879
1811
  },
1880
- zero_shopify_unavailable: {
1881
- summary: "The local Zero Shopify service is not configured.",
1882
- fix: "Configure a Shopify handler in the project, then restart `sf dev` before calling the Shopify service.",
1883
- },
1884
- wp_cloud_anonymous_pool_required: {
1885
- summary: "This operation requires an anonymous pool site.",
1886
- fix: "Target a pool-class site.",
1887
- },
1888
1812
  wp_cloud_assignment_kind_mismatch: {
1889
1813
  summary: "The domain assignment's kind does not match the site.",
1890
1814
  fix: "Verify the assignment against the site's hosting kind.",