@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,5 +1,5 @@
1
1
  import { freezeFeatureRegistryEntry } from "./feature-lifecycle-core.js";
2
- export { FEATURE_ASSIGNMENT_SCOPES, FEATURE_EXECUTION_ACTOR_POLICIES, FEATURE_OWNER_IDS, FEATURE_STAGES, freezeFeatureRegistryEntry, validateFeatureLifecycleRegistry, } from "./feature-lifecycle-core.js";
2
+ export { FEATURE_OWNER_IDS, FEATURE_STAGES, freezeFeatureRegistryEntry, validateFeatureLifecycleRegistry, } from "./feature-lifecycle-core.js";
3
3
  const featureEntries = Object.freeze([
4
4
  {
5
5
  cohort: "launch",
@@ -13,7 +13,6 @@ const featureEntries = Object.freeze([
13
13
  enabledForA8c: true,
14
14
  planDefaults: {},
15
15
  },
16
- assignmentScopes: ["team", "global"],
17
16
  docs: null,
18
17
  owner: "team:commerce",
19
18
  requires: [],
@@ -21,7 +20,6 @@ const featureEntries = Object.freeze([
21
20
  reviewAfter: "2026-08-11",
22
21
  removeAfter: null,
23
22
  gaAt: null,
24
- allowedActorPolicies: ["request_actor"],
25
23
  downRamp: {
26
24
  code: "paid_acquisition_stop",
27
25
  summary: "Deny new acquisition; allow cancel, portal, provider reconciliation and purchase recovery.",
@@ -39,7 +37,6 @@ const featureEntries = Object.freeze([
39
37
  enabledForA8c: true,
40
38
  planDefaults: {},
41
39
  },
42
- assignmentScopes: ["global"],
43
40
  docs: {
44
41
  channel: "public",
45
42
  slug: "/docs/publishing/anonymous",
@@ -51,7 +48,6 @@ const featureEntries = Object.freeze([
51
48
  reviewAfter: "2026-07-26",
52
49
  removeAfter: "2026-08-11",
53
50
  gaAt: "2026-07-12",
54
- allowedActorPolicies: ["request_actor", "global_policy"],
55
51
  downRamp: {
56
52
  code: "anonymous_publish_stop",
57
53
  summary: "Deny new anonymous content/version/upload authorization or commit/finalize/promote/push side effects; already-issued bounded staging ingress stays quarantined, while static serving and service cleanup remain.",
@@ -87,7 +83,6 @@ const featureEntries = Object.freeze([
87
83
  surface: true,
88
84
  defaultEnabled: false,
89
85
  runtime: null,
90
- assignmentScopes: ["user", "team", "global"],
91
86
  docs: {
92
87
  channel: "handbook",
93
88
  slug: "/features/domains/catalog",
@@ -99,7 +94,6 @@ const featureEntries = Object.freeze([
99
94
  reviewAfter: "2026-08-11",
100
95
  removeAfter: "2026-10-10",
101
96
  gaAt: null,
102
- allowedActorPolicies: ["request_actor"],
103
97
  downRamp: {
104
98
  code: "domain_catalog_hide",
105
99
  summary: "Hide authenticated catalog; public suggestions, availability and WHOIS remain.",
@@ -118,7 +112,6 @@ const featureEntries = Object.freeze([
118
112
  enabledForA8c: true,
119
113
  planDefaults: {},
120
114
  },
121
- assignmentScopes: ["user", "team", "global"],
122
115
  docs: {
123
116
  channel: "handbook",
124
117
  slug: "/features/domains/registration",
@@ -130,7 +123,6 @@ const featureEntries = Object.freeze([
130
123
  reviewAfter: "2026-08-11",
131
124
  removeAfter: "2026-10-10",
132
125
  gaAt: null,
133
- allowedActorPolicies: ["request_actor", "persisted_request_actor"],
134
126
  downRamp: {
135
127
  code: "domain_registration_stop",
136
128
  summary: "Deny new customer mutations and unstarted provider submits; generic existing-domain read plus service-only reconciliation/compensation for externally committed work continue.",
@@ -149,7 +141,6 @@ const featureEntries = Object.freeze([
149
141
  enabledForA8c: true,
150
142
  planDefaults: {},
151
143
  },
152
- assignmentScopes: ["user", "team", "global"],
153
144
  docs: {
154
145
  channel: "handbook",
155
146
  slug: "/features/domains/dns-management",
@@ -161,7 +152,6 @@ const featureEntries = Object.freeze([
161
152
  reviewAfter: "2026-08-11",
162
153
  removeAfter: "2026-10-10",
163
154
  gaAt: null,
164
- allowedActorPolicies: ["request_actor", "persisted_request_actor"],
165
155
  downRamp: {
166
156
  code: "dns_management_stop",
167
157
  summary: "Deny customer mutation and unstarted provider apply; generic authoritative read plus service-only rollback/reconciliation for externally committed work continue.",
@@ -179,7 +169,6 @@ const featureEntries = Object.freeze([
179
169
  enabledForA8c: true,
180
170
  planDefaults: {},
181
171
  },
182
- assignmentScopes: ["team", "global"],
183
172
  docs: {
184
173
  channel: "handbook",
185
174
  slug: "/features/domains/wpcom-dns",
@@ -191,7 +180,6 @@ const featureEntries = Object.freeze([
191
180
  reviewAfter: "2026-08-11",
192
181
  removeAfter: "2026-10-10",
193
182
  gaAt: null,
194
- allowedActorPolicies: ["request_actor"],
195
183
  downRamp: {
196
184
  code: "wpcom_dns_stop",
197
185
  summary: "Deny new automation; service/operator detach and reconciliation continue.",
@@ -209,7 +197,6 @@ const featureEntries = Object.freeze([
209
197
  enabledForA8c: true,
210
198
  planDefaults: {},
211
199
  },
212
- assignmentScopes: ["user", "team", "global"],
213
200
  docs: {
214
201
  channel: "handbook",
215
202
  slug: "/features/domains/domain-connect",
@@ -221,7 +208,6 @@ const featureEntries = Object.freeze([
221
208
  reviewAfter: "2026-08-11",
222
209
  removeAfter: "2026-10-10",
223
210
  gaAt: null,
224
- allowedActorPolicies: ["request_actor", "persisted_request_actor"],
225
211
  downRamp: {
226
212
  code: "domain_connect_stop",
227
213
  summary: "Deny new setup and every uncommitted callback; after an authenticated external commit, narrowly typed service-only reconciliation or compensation continues idempotently.",
@@ -241,7 +227,6 @@ const featureEntries = Object.freeze([
241
227
  internal: true,
242
228
  },
243
229
  },
244
- assignmentScopes: ["team", "global"],
245
230
  docs: {
246
231
  channel: "public",
247
232
  slug: "/docs/spaces/proxy-routes",
@@ -253,7 +238,6 @@ const featureEntries = Object.freeze([
253
238
  reviewAfter: "2026-08-11",
254
239
  removeAfter: "2026-10-10",
255
240
  gaAt: null,
256
- allowedActorPolicies: ["resource_team"],
257
241
  downRamp: {
258
242
  code: "proxy_binding_stop",
259
243
  summary: "Deny new binds; discoverable authenticated read/detach plus service reconciliation continue.",
@@ -263,7 +247,7 @@ const featureEntries = Object.freeze([
263
247
  cohort: "launch",
264
248
  key: "collab.notices",
265
249
  name: "Realtime notices",
266
- description: "Reserved kill-switch for future realtime preview notices.",
250
+ description: "Live: the Space notice room. Turns on the dashboard's realtime comment feed and the overlay's notice chips. Not an authorization — who may watch a Space's feed is decided by its Grants.",
267
251
  stage: "internal",
268
252
  surface: false,
269
253
  defaultEnabled: false,
@@ -271,7 +255,6 @@ const featureEntries = Object.freeze([
271
255
  enabledForA8c: true,
272
256
  planDefaults: {},
273
257
  },
274
- assignmentScopes: ["team", "global"],
275
258
  docs: null,
276
259
  owner: "team:collaboration",
277
260
  requires: [],
@@ -279,7 +262,6 @@ const featureEntries = Object.freeze([
279
262
  reviewAfter: "2026-08-11",
280
263
  removeAfter: null,
281
264
  gaAt: null,
282
- allowedActorPolicies: ["resource_team"],
283
265
  downRamp: {
284
266
  code: "notices_stop",
285
267
  summary: "Stop mint/publish; service/operator revoke and cleanup continue.",
@@ -301,9 +283,8 @@ const featureEntries = Object.freeze([
301
283
  key: "sites.dedicated_runtime",
302
284
  name: "Dedicated runtime sites",
303
285
  description: "Allows teams to create dedicated WP.Cloud sites and place team spaces on them.",
304
- // Availability and billing are separate decisions: the public surface is
305
- // on, while the dedicatedRuntime entitlement still decides which teams may
306
- // allocate the isolated infrastructure it exposes.
286
+ // Every Space owns its runtime site. The flag remains only as the
287
+ // operational down-ramp for new placement and materialization.
307
288
  stage: "ga",
308
289
  surface: true,
309
290
  defaultEnabled: true,
@@ -312,7 +293,6 @@ const featureEntries = Object.freeze([
312
293
  enabledForA8c: true,
313
294
  planDefaults: {},
314
295
  },
315
- assignmentScopes: ["team", "global"],
316
296
  docs: {
317
297
  channel: "public",
318
298
  slug: "/docs/apps",
@@ -324,23 +304,11 @@ const featureEntries = Object.freeze([
324
304
  reviewAfter: null,
325
305
  removeAfter: "2026-11-01",
326
306
  gaAt: "2026-08-05",
327
- allowedActorPolicies: ["request_actor", "resource_team"],
328
307
  downRamp: {
329
308
  code: "dedicated_runtime_stop",
330
309
  summary: "Deny customer mutation and new placement/materialization immediately; serve-time revocation of already-materialized output lands with the deferred runtime-proof slice; operator recovery/export/delete remain; downloaded bytes cannot be recalled.",
331
310
  },
332
311
  },
333
- {
334
- key: "shelf",
335
- name: "Shelf",
336
- description: "Exposes the per-user artifact shelf: dashboard curation and public /shelf/{handle} pages.",
337
- defaultEnabled: false,
338
- runtime: {
339
- enabledInDevelopment: true,
340
- enabledForA8c: true,
341
- planDefaults: {},
342
- },
343
- },
344
312
  {
345
313
  cohort: "launch",
346
314
  key: "build.content_pipeline",
@@ -350,7 +318,6 @@ const featureEntries = Object.freeze([
350
318
  surface: true,
351
319
  defaultEnabled: false,
352
320
  runtime: null,
353
- assignmentScopes: ["team", "global"],
354
321
  docs: {
355
322
  channel: "handbook",
356
323
  slug: "/features/build/content-pipeline",
@@ -362,7 +329,6 @@ const featureEntries = Object.freeze([
362
329
  reviewAfter: "2026-08-11",
363
330
  removeAfter: "2026-10-10",
364
331
  gaAt: null,
365
- allowedActorPolicies: ["resource_team"],
366
332
  downRamp: {
367
333
  code: "content_pipeline_stop",
368
334
  summary: "Deny next build/finalize; completed immutable output remains.",
@@ -381,7 +347,6 @@ const featureEntries = Object.freeze([
381
347
  enabledForA8c: true,
382
348
  planDefaults: {},
383
349
  },
384
- assignmentScopes: ["team", "global"],
385
350
  docs: {
386
351
  channel: "public",
387
352
  slug: "/docs/tags",
@@ -393,7 +358,6 @@ const featureEntries = Object.freeze([
393
358
  reviewAfter: "2026-08-11",
394
359
  removeAfter: "2026-10-10",
395
360
  gaAt: null,
396
- allowedActorPolicies: ["request_actor", "resource_team"],
397
361
  downRamp: {
398
362
  code: "tags_stop",
399
363
  summary: "Deny every customer Tag API and dynamic module delivery; internal operator export/cleanup and platform-generated inert marker bytes remain.",
@@ -404,8 +368,8 @@ const featureEntries = Object.freeze([
404
368
  key: "zero",
405
369
  name: "Spacefast Zero",
406
370
  description: "Enables Spacefast Zero command surfaces and hosted Zero app workflows.",
407
- // Zero is public. The flag remains only as the canonical operational
408
- // down-ramp; dedicatedRuntime is the one customer eligibility decision.
371
+ // Zero is public on every plan. The flag remains only as the canonical
372
+ // operational down-ramp.
409
373
  stage: "ga",
410
374
  surface: true,
411
375
  defaultEnabled: true,
@@ -413,19 +377,17 @@ const featureEntries = Object.freeze([
413
377
  enabledForA8c: true,
414
378
  planDefaults: {},
415
379
  },
416
- assignmentScopes: ["team", "global"],
417
380
  docs: {
418
381
  channel: "public",
419
382
  slug: "/docs/apps/zero",
420
383
  feedbackUrl: null,
421
384
  },
422
385
  owner: "team:zero",
423
- requires: ["sites.dedicated_runtime"],
386
+ requires: [],
424
387
  lifecycleAdoptedAt: "2026-07-12",
425
388
  reviewAfter: null,
426
389
  removeAfter: "2026-11-01",
427
390
  gaAt: "2026-08-05",
428
- allowedActorPolicies: ["resource_team"],
429
391
  downRamp: {
430
392
  code: "zero_stop",
431
393
  summary: "Stop activation/invocation; operator export/delete/migration recovery remain.",
@@ -437,32 +399,29 @@ const featureEntries = Object.freeze([
437
399
  name: "Spacefast Functions",
438
400
  description: "Dispatches a version's dynamic requests to the execution host. Compiling the worker at publish is not gated: " +
439
401
  "the CLI always ships the bundle, and this flag decides whether anything runs it.",
440
- // Functions remains a private beta: public docs carry the badge and this
441
- // flag still decides who dispatches.
442
- stage: "private_beta",
402
+ // Functions is public on every plan. The flag remains only as the
403
+ // operational down-ramp for dispatch.
404
+ stage: "ga",
443
405
  surface: true,
444
- defaultEnabled: false,
406
+ defaultEnabled: true,
445
407
  runtime: {
446
408
  enabledForA8c: true,
447
409
  planDefaults: {},
448
410
  },
449
- assignmentScopes: ["team", "global"],
450
411
  docs: {
451
412
  channel: "public",
452
413
  slug: "/docs/apps/functions",
453
414
  feedbackUrl: null,
454
415
  },
455
416
  owner: "team:zero",
456
- // Deliberately no `sites.dedicated_runtime` requirement, unlike Zero: a
457
- // worker executes on Cloudflare rather than on the space's box, and reaches
458
- // the database only through the broker. Shared placement is safe here in a
459
- // way it is not for a capsule.
417
+ // A worker executes on Cloudflare rather than on the space's box and
418
+ // reaches the database only through the broker, so dispatch has no
419
+ // dedicated-runtime lifecycle dependency.
460
420
  requires: [],
461
421
  lifecycleAdoptedAt: "2026-07-27",
462
- reviewAfter: "2026-09-02",
422
+ reviewAfter: null,
463
423
  removeAfter: "2026-11-01",
464
- gaAt: null,
465
- allowedActorPolicies: ["resource_team"],
424
+ gaAt: "2026-08-12",
466
425
  downRamp: {
467
426
  code: "functions_stop",
468
427
  summary: "Stop emitting dispatch configuration at finalize; published bundles stay on disk as inert content and the " +
@@ -483,7 +442,6 @@ const featureEntries = Object.freeze([
483
442
  enabledForA8c: true,
484
443
  planDefaults: {},
485
444
  },
486
- assignmentScopes: ["user", "team", "global"],
487
445
  docs: {
488
446
  channel: "public",
489
447
  slug: "/docs/spaces/rename",
@@ -495,7 +453,6 @@ const featureEntries = Object.freeze([
495
453
  reviewAfter: "2026-08-11",
496
454
  removeAfter: "2026-10-10",
497
455
  gaAt: "2026-07-27",
498
- allowedActorPolicies: ["request_actor"],
499
456
  downRamp: {
500
457
  code: "slug_rename_stop",
501
458
  summary: "Deny new slug renames while already-committed hostname redirects and runtime convergence continue.",
@@ -10,9 +10,13 @@ export declare const planCodeSchema: z.ZodEnum<{
10
10
  }>;
11
11
  export type PlanCode = z.infer<typeof planCodeSchema>;
12
12
  export declare const DEFAULT_PLAN_CODE: PlanCode;
13
- export declare const FEATURE_KEYS: readonly ("zero" | "plans.paid.available" | "anonymous.publishing" | "beta.enrollment_gate" | "domains.search" | "domains.registration" | "domains.dns_management" | "domains.wpcom_dns" | "domains.domain_connect" | "domains.proxy_bindings" | "collab.notices" | "collab.drawing" | "sites.dedicated_runtime" | "shelf" | "tags" | "functions" | "spaces.slug_rename")[];
13
+ export declare const SELF_SERVE_PLAN_CODES: readonly ["personal", "work"];
14
+ export declare const PUBLIC_PLAN_CODES: readonly ["free", "personal", "work", "enterprise"];
15
+ export declare const FEATURE_KEYS: readonly ("zero" | "tags" | "functions" | "plans.paid.available" | "anonymous.publishing" | "beta.enrollment_gate" | "domains.search" | "domains.registration" | "domains.dns_management" | "domains.wpcom_dns" | "domains.domain_connect" | "domains.proxy_bindings" | "collab.notices" | "collab.drawing" | "sites.dedicated_runtime" | "spaces.slug_rename")[];
14
16
  export declare const featureKeySchema: z.ZodEnum<{
15
17
  zero: "zero";
18
+ tags: "tags";
19
+ functions: "functions";
16
20
  "plans.paid.available": "plans.paid.available";
17
21
  "anonymous.publishing": "anonymous.publishing";
18
22
  "beta.enrollment_gate": "beta.enrollment_gate";
@@ -25,9 +29,6 @@ export declare const featureKeySchema: z.ZodEnum<{
25
29
  "collab.notices": "collab.notices";
26
30
  "collab.drawing": "collab.drawing";
27
31
  "sites.dedicated_runtime": "sites.dedicated_runtime";
28
- shelf: "shelf";
29
- tags: "tags";
30
- functions: "functions";
31
32
  "spaces.slug_rename": "spaces.slug_rename";
32
33
  }>;
33
34
  export type FeatureKey = RuntimeFeatureKey;
@@ -45,8 +46,6 @@ export declare const planLimitsSchema: z.ZodObject<{
45
46
  teamMembers: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
46
47
  subTeams: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
47
48
  externalDomainGroups: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
48
- versionRetentionDays: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
49
- versionGatedKeepDays: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
50
49
  egressBytesPerDay: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
51
50
  maxFileBytes: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
52
51
  maxVersionFiles: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
@@ -54,7 +53,6 @@ export declare const planLimitsSchema: z.ZodObject<{
54
53
  auditLogRetentionHours: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
55
54
  buildAccessLogRetentionHours: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
56
55
  buildsDeploysMonthly: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
57
- analyticsRetentionDays: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
58
56
  shareLinksPerSpace: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
59
57
  invitesPerSpace: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
60
58
  inviteEmailsPerSpaceDaily: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
@@ -75,8 +73,6 @@ export declare const teamEntitlementsSchema: z.ZodObject<{
75
73
  teamMembers: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
76
74
  subTeams: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
77
75
  externalDomainGroups: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
78
- versionRetentionDays: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
79
- versionGatedKeepDays: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
80
76
  egressBytesPerDay: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
81
77
  maxFileBytes: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
82
78
  maxVersionFiles: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
@@ -84,7 +80,6 @@ export declare const teamEntitlementsSchema: z.ZodObject<{
84
80
  auditLogRetentionHours: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
85
81
  buildAccessLogRetentionHours: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
86
82
  buildsDeploysMonthly: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
87
- analyticsRetentionDays: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
88
83
  shareLinksPerSpace: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
89
84
  invitesPerSpace: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
90
85
  inviteEmailsPerSpaceDaily: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
@@ -92,11 +87,10 @@ export declare const teamEntitlementsSchema: z.ZodObject<{
92
87
  pendingAccessRequestsPerSpace: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
93
88
  }, z.core.$strip>;
94
89
  externalProxy: z.ZodBoolean;
95
- dedicatedRuntime: z.ZodBoolean;
90
+ dedicatedRuntime: z.ZodLiteral<true>;
96
91
  pagesTemplates: z.ZodBoolean;
97
92
  hideSpacefastBranding: z.ZodBoolean;
98
93
  runtimePhpWorkers: z.ZodNumber;
99
- analyticsHourlyGranularity: z.ZodBoolean;
100
94
  versionDiagnosticsIncluded: z.ZodBoolean;
101
95
  }, z.core.$strip>;
102
96
  export type TeamEntitlements = z.infer<typeof teamEntitlementsSchema>;
@@ -109,16 +103,15 @@ export declare const teamEntitlementsResponseSchema: z.ZodObject<{
109
103
  enterprise: "enterprise";
110
104
  }>;
111
105
  externalProxy: z.ZodBoolean;
112
- dedicatedRuntime: z.ZodBoolean;
106
+ dedicatedRuntime: z.ZodLiteral<true>;
113
107
  pagesTemplates: z.ZodBoolean;
114
108
  hideSpacefastBranding: z.ZodBoolean;
115
109
  runtimePhpWorkers: z.ZodNumber;
116
- analyticsHourlyGranularity: z.ZodBoolean;
117
110
  versionDiagnosticsIncluded: z.ZodBoolean;
118
111
  limits: z.ZodObject<{
112
+ storageBytes: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
119
113
  teamMembers: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
120
114
  subTeams: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
121
- storageBytes: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
122
115
  externalDomainGroups: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
123
116
  maxFileBytes: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
124
117
  maxVersionFiles: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
@@ -126,7 +119,6 @@ export declare const teamEntitlementsResponseSchema: z.ZodObject<{
126
119
  auditLogRetentionHours: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
127
120
  buildAccessLogRetentionHours: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
128
121
  buildsDeploysMonthly: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
129
- analyticsRetentionDays: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
130
122
  shareLinksPerSpace: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
131
123
  invitesPerSpace: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
132
124
  inviteEmailsPerSpaceDaily: z.ZodUnion<readonly [z.ZodNumber, z.ZodLiteral<"unlimited">]>;
@@ -138,15 +130,21 @@ export type PlanDefinition = {
138
130
  code: PlanCode;
139
131
  name: string;
140
132
  monthlyPriceUsd: number | null;
133
+ yearlyPriceUsd: number | null;
134
+ /** Editor memberships included in the base plan price. */
135
+ includedSeats: number | "unlimited";
136
+ /** Additional editor price by interval; null means the plan never meters seats. */
137
+ extraSeatPriceUsd: {
138
+ monthly: number;
139
+ yearly: number;
140
+ } | null;
141
141
  limits: PlanLimits;
142
142
  externalProxy: boolean;
143
- dedicatedRuntime: boolean;
144
143
  /** Paid full-page takeover templates under _pages/. */
145
144
  pagesTemplates: boolean;
146
145
  /** Paid removal of the tasteful Spacefast badge from designed defaults. */
147
146
  hideSpacefastBranding: boolean;
148
147
  runtimePhpWorkers: number;
149
- analyticsHourlyGranularity: boolean;
150
148
  };
151
149
  export type FeatureDefinition = RuntimeFeatureDefinition;
152
150
  export declare const PLAN_DEFINITIONS: Record<PlanCode, PlanDefinition>;
@@ -161,6 +159,26 @@ export declare const FEATURE_DEFINITIONS: Readonly<{
161
159
  readonly enabledForA8c: boolean;
162
160
  readonly planDefaults: Readonly<Partial<Record<PlanCode, boolean>>>;
163
161
  };
162
+ readonly tags: {
163
+ readonly key: "tags";
164
+ readonly name: string;
165
+ readonly description: string;
166
+ readonly defaultEnabled: boolean;
167
+ } & {
168
+ readonly enabledInDevelopment?: boolean;
169
+ readonly enabledForA8c: boolean;
170
+ readonly planDefaults: Readonly<Partial<Record<PlanCode, boolean>>>;
171
+ };
172
+ readonly functions: {
173
+ readonly key: "functions";
174
+ readonly name: string;
175
+ readonly description: string;
176
+ readonly defaultEnabled: boolean;
177
+ } & {
178
+ readonly enabledInDevelopment?: boolean;
179
+ readonly enabledForA8c: boolean;
180
+ readonly planDefaults: Readonly<Partial<Record<PlanCode, boolean>>>;
181
+ };
164
182
  readonly "plans.paid.available": {
165
183
  readonly key: "plans.paid.available";
166
184
  readonly name: string;
@@ -281,36 +299,6 @@ export declare const FEATURE_DEFINITIONS: Readonly<{
281
299
  readonly enabledForA8c: boolean;
282
300
  readonly planDefaults: Readonly<Partial<Record<PlanCode, boolean>>>;
283
301
  };
284
- readonly shelf: {
285
- readonly key: "shelf";
286
- readonly name: string;
287
- readonly description: string;
288
- readonly defaultEnabled: boolean;
289
- } & {
290
- readonly enabledInDevelopment?: boolean;
291
- readonly enabledForA8c: boolean;
292
- readonly planDefaults: Readonly<Partial<Record<PlanCode, boolean>>>;
293
- };
294
- readonly tags: {
295
- readonly key: "tags";
296
- readonly name: string;
297
- readonly description: string;
298
- readonly defaultEnabled: boolean;
299
- } & {
300
- readonly enabledInDevelopment?: boolean;
301
- readonly enabledForA8c: boolean;
302
- readonly planDefaults: Readonly<Partial<Record<PlanCode, boolean>>>;
303
- };
304
- readonly functions: {
305
- readonly key: "functions";
306
- readonly name: string;
307
- readonly description: string;
308
- readonly defaultEnabled: boolean;
309
- } & {
310
- readonly enabledInDevelopment?: boolean;
311
- readonly enabledForA8c: boolean;
312
- readonly planDefaults: Readonly<Partial<Record<PlanCode, boolean>>>;
313
- };
314
302
  readonly "spaces.slug_rename": {
315
303
  readonly key: "spaces.slug_rename";
316
304
  readonly name: string;
@@ -325,12 +313,14 @@ export declare const FEATURE_DEFINITIONS: Readonly<{
325
313
  export declare const featureStateSourceSchema: z.ZodEnum<{
326
314
  default: "default";
327
315
  override: "override";
328
- kill_switch: "kill_switch";
329
316
  env: "env";
317
+ kill_switch: "kill_switch";
330
318
  }>;
331
319
  export declare const FeatureStateSchema: z.ZodObject<{
332
320
  key: z.ZodEnum<{
333
321
  zero: "zero";
322
+ tags: "tags";
323
+ functions: "functions";
334
324
  "plans.paid.available": "plans.paid.available";
335
325
  "anonymous.publishing": "anonymous.publishing";
336
326
  "beta.enrollment_gate": "beta.enrollment_gate";
@@ -343,17 +333,14 @@ export declare const FeatureStateSchema: z.ZodObject<{
343
333
  "collab.notices": "collab.notices";
344
334
  "collab.drawing": "collab.drawing";
345
335
  "sites.dedicated_runtime": "sites.dedicated_runtime";
346
- shelf: "shelf";
347
- tags: "tags";
348
- functions: "functions";
349
336
  "spaces.slug_rename": "spaces.slug_rename";
350
337
  }>;
351
338
  enabled: z.ZodBoolean;
352
339
  source: z.ZodEnum<{
353
340
  default: "default";
354
341
  override: "override";
355
- kill_switch: "kill_switch";
356
342
  env: "env";
343
+ kill_switch: "kill_switch";
357
344
  }>;
358
345
  }, z.core.$strip>;
359
346
  export declare const FeatureStateResponseSchema: z.ZodObject<{
@@ -366,6 +353,8 @@ export declare const FeatureStateResponseSchema: z.ZodObject<{
366
353
  }>;
367
354
  features: z.ZodRecord<z.ZodEnum<{
368
355
  zero: "zero";
356
+ tags: "tags";
357
+ functions: "functions";
369
358
  "plans.paid.available": "plans.paid.available";
370
359
  "anonymous.publishing": "anonymous.publishing";
371
360
  "beta.enrollment_gate": "beta.enrollment_gate";
@@ -378,13 +367,12 @@ export declare const FeatureStateResponseSchema: z.ZodObject<{
378
367
  "collab.notices": "collab.notices";
379
368
  "collab.drawing": "collab.drawing";
380
369
  "sites.dedicated_runtime": "sites.dedicated_runtime";
381
- shelf: "shelf";
382
- tags: "tags";
383
- functions: "functions";
384
370
  "spaces.slug_rename": "spaces.slug_rename";
385
371
  }>, z.ZodObject<{
386
372
  key: z.ZodEnum<{
387
373
  zero: "zero";
374
+ tags: "tags";
375
+ functions: "functions";
388
376
  "plans.paid.available": "plans.paid.available";
389
377
  "anonymous.publishing": "anonymous.publishing";
390
378
  "beta.enrollment_gate": "beta.enrollment_gate";
@@ -397,17 +385,14 @@ export declare const FeatureStateResponseSchema: z.ZodObject<{
397
385
  "collab.notices": "collab.notices";
398
386
  "collab.drawing": "collab.drawing";
399
387
  "sites.dedicated_runtime": "sites.dedicated_runtime";
400
- shelf: "shelf";
401
- tags: "tags";
402
- functions: "functions";
403
388
  "spaces.slug_rename": "spaces.slug_rename";
404
389
  }>;
405
390
  enabled: z.ZodBoolean;
406
391
  source: z.ZodEnum<{
407
392
  default: "default";
408
393
  override: "override";
409
- kill_switch: "kill_switch";
410
394
  env: "env";
395
+ kill_switch: "kill_switch";
411
396
  }>;
412
397
  }, z.core.$strip>>;
413
398
  }, z.core.$strip>;
@@ -417,3 +402,6 @@ export declare function normalizePlanCode(planCode: string | null | undefined):
417
402
  export declare function featureDefaultForPlan(key: FeatureKey, planCode: string | null | undefined): boolean;
418
403
  /** Numeric value of a plan limit; `null` means unlimited. */
419
404
  export declare function planLimitNumber(value: PlanLimitValue): number | null;
405
+ /** Extra editor quantity billed on a paid Stripe subscription. */
406
+ export declare function extraSeatQuantity(editorMemberships: number, includedSeats: number | "unlimited"): number;
407
+ export declare function planPriceUsd(plan: PlanDefinition, interval: "monthly" | "yearly"): number | null;