@spacefast/common 0.0.11 → 0.0.13

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 (160) hide show
  1. package/dist/agents/connect-targets.d.ts +4 -4
  2. package/dist/agents/connect-targets.js +3 -3
  3. package/dist/agents/private-key-oauth.d.ts +37 -0
  4. package/dist/agents/private-key-oauth.js +158 -0
  5. package/dist/config/domains.js +1 -1
  6. package/dist/config/index.d.ts +1 -0
  7. package/dist/config/index.js +1 -0
  8. package/dist/config/postgres-budget.d.ts +126 -0
  9. package/dist/config/postgres-budget.js +135 -0
  10. package/dist/config/postgres-budget.json +50 -0
  11. package/dist/contracts/access.d.ts +386 -1183
  12. package/dist/contracts/access.js +240 -1018
  13. package/dist/contracts/activity.d.ts +1 -1
  14. package/dist/contracts/activity.js +11 -19
  15. package/dist/contracts/api-keys.d.ts +69 -45
  16. package/dist/contracts/api-keys.js +3 -0
  17. package/dist/contracts/archives.d.ts +9 -10
  18. package/dist/contracts/archives.js +4 -6
  19. package/dist/contracts/builds.d.ts +8 -8
  20. package/dist/contracts/builds.js +28 -48
  21. package/dist/contracts/channels.js +1 -2
  22. package/dist/contracts/comments.d.ts +102 -93
  23. package/dist/contracts/comments.js +121 -63
  24. package/dist/contracts/common.d.ts +4 -3
  25. package/dist/contracts/common.js +2 -0
  26. package/dist/contracts/countries.js +2 -7
  27. package/dist/contracts/data-source-routes.d.ts +20 -0
  28. package/dist/contracts/data-source-routes.js +15 -0
  29. package/dist/contracts/deployments.d.ts +3 -3
  30. package/dist/contracts/device-auth.d.ts +21 -15
  31. package/dist/contracts/docs.d.ts +5 -5
  32. package/dist/contracts/domains.d.ts +261 -1330
  33. package/dist/contracts/domains.js +39 -301
  34. package/dist/contracts/email-preferences.d.ts +50 -0
  35. package/dist/contracts/email-preferences.js +44 -0
  36. package/dist/contracts/enums.d.ts +3 -5
  37. package/dist/contracts/enums.js +3 -8
  38. package/dist/contracts/error-code-meta.d.ts +99 -33
  39. package/dist/contracts/error-code-meta.js +36 -9
  40. package/dist/contracts/error-codes.d.ts +1 -1
  41. package/dist/contracts/error-codes.js +28 -11
  42. package/dist/contracts/execution.d.ts +212 -0
  43. package/dist/contracts/execution.js +288 -0
  44. package/dist/contracts/feature-lifecycle.d.ts +498 -2
  45. package/dist/contracts/feature-lifecycle.js +539 -2
  46. package/dist/contracts/features.d.ts +184 -74
  47. package/dist/contracts/features.js +4 -303
  48. package/dist/contracts/functions.d.ts +729 -0
  49. package/dist/contracts/functions.js +485 -0
  50. package/dist/contracts/git.d.ts +1 -1
  51. package/dist/contracts/grants.d.ts +1158 -0
  52. package/dist/contracts/grants.js +696 -0
  53. package/dist/contracts/ids.d.ts +6 -5
  54. package/dist/contracts/ids.js +6 -5
  55. package/dist/contracts/internal.d.ts +3 -3
  56. package/dist/contracts/mcp.d.ts +12 -12
  57. package/dist/contracts/me.js +1 -1
  58. package/dist/contracts/mounts.d.ts +142 -0
  59. package/dist/contracts/mounts.js +56 -0
  60. package/dist/contracts/oauth-resources.d.ts +5 -5
  61. package/dist/contracts/oauth-resources.js +2 -0
  62. package/dist/contracts/operations.d.ts +4 -4
  63. package/dist/contracts/pages.d.ts +6 -14
  64. package/dist/contracts/pages.js +11 -23
  65. package/dist/contracts/plan-policy.d.ts +2 -9
  66. package/dist/contracts/plan-policy.js +1 -4
  67. package/dist/contracts/platform.d.ts +80 -32
  68. package/dist/contracts/platform.js +59 -12
  69. package/dist/contracts/push-new.d.ts +26 -2
  70. package/dist/contracts/push-new.js +8 -0
  71. package/dist/contracts/quotas.d.ts +0 -1
  72. package/dist/contracts/quotas.js +0 -5
  73. package/dist/contracts/repository-connections.d.ts +1 -1
  74. package/dist/contracts/resources.d.ts +21 -85
  75. package/dist/contracts/resources.js +17 -47
  76. package/dist/contracts/runtime-api.d.ts +799 -192
  77. package/dist/contracts/runtime-api.js +231 -100
  78. package/dist/contracts/runtime-app.d.ts +138 -0
  79. package/dist/contracts/runtime-app.js +21 -0
  80. package/dist/contracts/sf-config-v1.d.ts +5 -0
  81. package/dist/contracts/sf-config-v1.js +1 -1
  82. package/dist/contracts/sites.d.ts +17 -12
  83. package/dist/contracts/sites.js +30 -12
  84. package/dist/contracts/space-config.d.ts +46 -117
  85. package/dist/contracts/space-config.js +323 -25
  86. package/dist/contracts/spaces.d.ts +392 -256
  87. package/dist/contracts/spaces.js +163 -83
  88. package/dist/contracts/superadmin-emails.d.ts +27 -3
  89. package/dist/contracts/superadmin-emails.js +10 -15
  90. package/dist/contracts/superadmin-runtime.d.ts +2 -2
  91. package/dist/contracts/superadmin-spaces.d.ts +19 -142
  92. package/dist/contracts/superadmin-spaces.js +7 -0
  93. package/dist/contracts/tags.d.ts +66 -36
  94. package/dist/contracts/tags.js +195 -11
  95. package/dist/contracts/teams.d.ts +9 -9
  96. package/dist/contracts/transfers.d.ts +1 -2
  97. package/dist/contracts/variables.d.ts +4 -4
  98. package/dist/contracts/variables.js +4 -3
  99. package/dist/contracts/webhooks.d.ts +2 -2
  100. package/dist/contracts/zero.d.ts +437 -193
  101. package/dist/contracts/zero.js +149 -158
  102. package/dist/dashboard-paths/index.d.ts +3 -3
  103. package/dist/dashboard-paths/index.js +1 -0
  104. package/dist/docs/agent-prose.js +10 -8
  105. package/dist/docs/agent-setup.d.ts +6 -4
  106. package/dist/docs/agent-setup.js +26 -16
  107. package/dist/docs/agent-solutions.js +1 -1
  108. package/dist/docs/catalog.d.ts +35 -37
  109. package/dist/docs/catalog.js +36 -38
  110. package/dist/docs/error-docs.js +108 -44
  111. package/dist/utils/asset-fingerprint.d.ts +11 -0
  112. package/dist/utils/asset-fingerprint.js +46 -0
  113. package/dist/utils/auth-redirect.d.ts +1 -3
  114. package/dist/utils/auth-redirect.js +1 -21
  115. package/dist/utils/build-settings.d.ts +2 -0
  116. package/dist/utils/build-settings.js +61 -9
  117. package/dist/utils/credential-policy.d.ts +1 -1
  118. package/dist/utils/credential-policy.js +4 -0
  119. package/dist/utils/dns-instructions.d.ts +29 -0
  120. package/dist/utils/dns-instructions.js +78 -0
  121. package/dist/utils/domain-diagnostics.d.ts +29 -0
  122. package/dist/utils/domain-diagnostics.js +63 -0
  123. package/dist/utils/egress-policy.fixtures.json +51 -0
  124. package/dist/utils/grants.d.ts +53 -0
  125. package/dist/utils/grants.js +160 -0
  126. package/dist/utils/id-hints.d.ts +1 -0
  127. package/dist/utils/id-hints.js +55 -13
  128. package/dist/utils/local-space-state.js +1 -0
  129. package/dist/utils/page-colors.d.ts +50 -0
  130. package/dist/utils/page-colors.js +167 -0
  131. package/dist/utils/page-fonts.d.ts +2 -0
  132. package/dist/utils/page-fonts.js +4 -0
  133. package/dist/utils/pages.d.ts +19 -6
  134. package/dist/utils/pages.js +122 -49
  135. package/dist/utils/production-runtime.d.ts +18 -0
  136. package/dist/utils/production-runtime.js +28 -0
  137. package/dist/utils/publish-policy.d.ts +34 -4
  138. package/dist/utils/publish-policy.js +132 -61
  139. package/dist/utils/query-keys.d.ts +7 -13
  140. package/dist/utils/query-keys.js +12 -18
  141. package/dist/utils/source-archive-policy.d.ts +2 -0
  142. package/dist/utils/source-archive-policy.js +2 -0
  143. package/dist/utils/space-config.d.ts +5 -1
  144. package/dist/utils/space-config.js +35 -0
  145. package/dist/utils/static-runtime-policy.d.ts +5 -0
  146. package/dist/utils/static-runtime-policy.fixtures.json +57 -0
  147. package/dist/utils/static-runtime-policy.js +54 -10
  148. package/dist/utils/upload-session.d.ts +3 -0
  149. package/dist/utils/upload-session.js +31 -0
  150. package/package.json +6 -4
  151. package/dist/contracts/annotations.d.ts +0 -327
  152. package/dist/contracts/annotations.js +0 -235
  153. package/dist/contracts/generated-feature-launch-entries.d.ts +0 -2
  154. package/dist/contracts/generated-feature-launch-entries.js +0 -518
  155. package/dist/contracts/publishes.d.ts +0 -135
  156. package/dist/contracts/publishes.js +0 -162
  157. package/dist/utils/access-match.d.ts +0 -39
  158. package/dist/utils/access-match.js +0 -296
  159. package/dist/utils/sf-config-v1.d.ts +0 -2
  160. package/dist/utils/sf-config-v1.js +0 -542
@@ -1,6 +1,543 @@
1
- import { launchEntries as compiledLaunchEntries } from "./generated-feature-launch-entries.js";
1
+ import { freezeFeatureRegistryEntry } from "./feature-lifecycle-core.js";
2
2
  export { FEATURE_ASSIGNMENT_SCOPES, FEATURE_EXECUTION_ACTOR_POLICIES, FEATURE_OWNER_IDS, FEATURE_STAGES, freezeFeatureRegistryEntry, validateFeatureLifecycleRegistry, } from "./feature-lifecycle-core.js";
3
- export const FEATURE_LIFECYCLE_REGISTRY = compiledLaunchEntries;
3
+ const featureEntries = Object.freeze([
4
+ {
5
+ cohort: "launch",
6
+ key: "plans.paid.available",
7
+ name: "Paid plans available",
8
+ description: "Controls whether paid plan upgrade and management surfaces are available.",
9
+ stage: "internal",
10
+ surface: false,
11
+ defaultEnabled: false,
12
+ runtime: {
13
+ enabledForA8c: true,
14
+ planDefaults: {},
15
+ },
16
+ assignmentScopes: ["team", "global"],
17
+ docs: null,
18
+ owner: "team:commerce",
19
+ requires: [],
20
+ lifecycleAdoptedAt: "2026-07-12",
21
+ reviewAfter: "2026-08-11",
22
+ removeAfter: null,
23
+ gaAt: null,
24
+ allowedActorPolicies: ["request_actor"],
25
+ downRamp: {
26
+ code: "paid_acquisition_stop",
27
+ summary: "Deny new acquisition; allow cancel, portal, provider reconciliation and purchase recovery.",
28
+ },
29
+ },
30
+ {
31
+ cohort: "launch",
32
+ key: "anonymous.publishing",
33
+ name: "Anonymous publishing",
34
+ description: "Allows unauthenticated space creation and publishing.",
35
+ stage: "ga",
36
+ surface: true,
37
+ defaultEnabled: true,
38
+ runtime: {
39
+ enabledForA8c: true,
40
+ planDefaults: {},
41
+ },
42
+ assignmentScopes: ["global"],
43
+ docs: {
44
+ channel: "public",
45
+ slug: "/docs/publishing/anonymous",
46
+ feedbackUrl: null,
47
+ },
48
+ owner: "team:publishing",
49
+ requires: [],
50
+ lifecycleAdoptedAt: "2026-07-12",
51
+ reviewAfter: "2026-07-26",
52
+ removeAfter: "2026-08-11",
53
+ gaAt: "2026-07-12",
54
+ allowedActorPolicies: ["request_actor", "global_policy"],
55
+ downRamp: {
56
+ code: "anonymous_publish_stop",
57
+ 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.",
58
+ },
59
+ },
60
+ {
61
+ key: "beta.enrollment_gate",
62
+ name: "Beta enrollment gate",
63
+ description: "Gates the whole API behind private-beta enrollment; non-enrolled credentials get 403 not_enrolled.",
64
+ defaultEnabled: false,
65
+ runtime: {
66
+ enabledForA8c: true,
67
+ planDefaults: {},
68
+ },
69
+ },
70
+ {
71
+ key: "domains.search",
72
+ name: "Domain search",
73
+ description: "Allows domain availability search and suggestion surfaces.",
74
+ defaultEnabled: false,
75
+ runtime: {
76
+ enabledInDevelopment: true,
77
+ enabledForA8c: true,
78
+ planDefaults: {},
79
+ },
80
+ },
81
+ {
82
+ cohort: "launch",
83
+ key: "domains.catalog",
84
+ name: "Domain catalog",
85
+ description: "Controls authenticated domain product/catalog operations; public suggestions, availability and WHOIS remain unflagged.",
86
+ stage: "internal",
87
+ surface: true,
88
+ defaultEnabled: false,
89
+ runtime: null,
90
+ assignmentScopes: ["user", "team", "global"],
91
+ docs: {
92
+ channel: "handbook",
93
+ slug: "/features/domains/catalog",
94
+ feedbackUrl: null,
95
+ },
96
+ owner: "team:domains",
97
+ requires: [],
98
+ lifecycleAdoptedAt: "2026-07-12",
99
+ reviewAfter: "2026-08-11",
100
+ removeAfter: "2026-10-10",
101
+ gaAt: null,
102
+ allowedActorPolicies: ["request_actor"],
103
+ downRamp: {
104
+ code: "domain_catalog_hide",
105
+ summary: "Hide authenticated catalog; public suggestions, availability and WHOIS remain.",
106
+ },
107
+ },
108
+ {
109
+ cohort: "launch",
110
+ key: "domains.registration",
111
+ name: "Domain registration",
112
+ description: "Allows domain registration, purchase, and transfer-in surfaces.",
113
+ stage: "internal",
114
+ surface: true,
115
+ defaultEnabled: false,
116
+ runtime: {
117
+ enabledInDevelopment: true,
118
+ enabledForA8c: true,
119
+ planDefaults: {},
120
+ },
121
+ assignmentScopes: ["user", "team", "global"],
122
+ docs: {
123
+ channel: "handbook",
124
+ slug: "/features/domains/registration",
125
+ feedbackUrl: null,
126
+ },
127
+ owner: "team:domains",
128
+ requires: [],
129
+ lifecycleAdoptedAt: "2026-07-12",
130
+ reviewAfter: "2026-08-11",
131
+ removeAfter: "2026-10-10",
132
+ gaAt: null,
133
+ allowedActorPolicies: ["request_actor", "persisted_request_actor"],
134
+ downRamp: {
135
+ code: "domain_registration_stop",
136
+ summary: "Deny new customer mutations and unstarted provider submits; generic existing-domain read plus service-only reconciliation/compensation for externally committed work continue.",
137
+ },
138
+ },
139
+ {
140
+ cohort: "launch",
141
+ key: "domains.dns_management",
142
+ name: "DNS management",
143
+ description: "Allows customer DNS zone, nameserver, and record-management surfaces.",
144
+ stage: "internal",
145
+ surface: true,
146
+ defaultEnabled: false,
147
+ runtime: {
148
+ enabledInDevelopment: true,
149
+ enabledForA8c: true,
150
+ planDefaults: {},
151
+ },
152
+ assignmentScopes: ["user", "team", "global"],
153
+ docs: {
154
+ channel: "handbook",
155
+ slug: "/features/domains/dns-management",
156
+ feedbackUrl: null,
157
+ },
158
+ owner: "team:domains",
159
+ requires: [],
160
+ lifecycleAdoptedAt: "2026-07-12",
161
+ reviewAfter: "2026-08-11",
162
+ removeAfter: "2026-10-10",
163
+ gaAt: null,
164
+ allowedActorPolicies: ["request_actor", "persisted_request_actor"],
165
+ downRamp: {
166
+ code: "dns_management_stop",
167
+ summary: "Deny customer mutation and unstarted provider apply; generic authoritative read plus service-only rollback/reconciliation for externally committed work continue.",
168
+ },
169
+ },
170
+ {
171
+ cohort: "launch",
172
+ key: "domains.wpcom_dns",
173
+ name: "WordPress.com DNS automation",
174
+ description: "Manage a domain's DNS through the owner's WordPress.com account.",
175
+ stage: "internal",
176
+ surface: true,
177
+ defaultEnabled: false,
178
+ runtime: {
179
+ enabledForA8c: true,
180
+ planDefaults: {},
181
+ },
182
+ assignmentScopes: ["team", "global"],
183
+ docs: {
184
+ channel: "handbook",
185
+ slug: "/features/domains/wpcom-dns",
186
+ feedbackUrl: null,
187
+ },
188
+ owner: "team:domains",
189
+ requires: [],
190
+ lifecycleAdoptedAt: "2026-07-12",
191
+ reviewAfter: "2026-08-11",
192
+ removeAfter: "2026-10-10",
193
+ gaAt: null,
194
+ allowedActorPolicies: ["request_actor"],
195
+ downRamp: {
196
+ code: "wpcom_dns_stop",
197
+ summary: "Deny new automation; service/operator detach and reconciliation continue.",
198
+ },
199
+ },
200
+ {
201
+ cohort: "launch",
202
+ key: "domains.domain_connect",
203
+ name: "Domain Connect",
204
+ description: "One-click DNS setup at providers that implement Domain Connect.",
205
+ stage: "internal",
206
+ surface: true,
207
+ defaultEnabled: false,
208
+ runtime: {
209
+ enabledForA8c: true,
210
+ planDefaults: {},
211
+ },
212
+ assignmentScopes: ["user", "team", "global"],
213
+ docs: {
214
+ channel: "handbook",
215
+ slug: "/features/domains/domain-connect",
216
+ feedbackUrl: null,
217
+ },
218
+ owner: "team:domains",
219
+ requires: [],
220
+ lifecycleAdoptedAt: "2026-07-12",
221
+ reviewAfter: "2026-08-11",
222
+ removeAfter: "2026-10-10",
223
+ gaAt: null,
224
+ allowedActorPolicies: ["request_actor", "persisted_request_actor"],
225
+ downRamp: {
226
+ code: "domain_connect_stop",
227
+ summary: "Deny new setup and every uncommitted callback; after an authenticated external commit, narrowly typed service-only reconciliation or compensation continues idempotently.",
228
+ },
229
+ },
230
+ {
231
+ cohort: "launch",
232
+ key: "domains.proxy_bindings",
233
+ name: "Domain proxy bindings",
234
+ description: "Allow a team to proxy custom-domain traffic to an external HTTP upstream.",
235
+ stage: "private_beta",
236
+ surface: true,
237
+ defaultEnabled: false,
238
+ runtime: {
239
+ enabledForA8c: true,
240
+ planDefaults: {
241
+ internal: true,
242
+ },
243
+ },
244
+ assignmentScopes: ["team", "global"],
245
+ docs: {
246
+ channel: "public",
247
+ slug: "/docs/domains/proxy-bindings",
248
+ feedbackUrl: null,
249
+ },
250
+ owner: "team:domains",
251
+ requires: [],
252
+ lifecycleAdoptedAt: "2026-07-12",
253
+ reviewAfter: "2026-08-11",
254
+ removeAfter: "2026-10-10",
255
+ gaAt: null,
256
+ allowedActorPolicies: ["resource_team"],
257
+ downRamp: {
258
+ code: "proxy_binding_stop",
259
+ summary: "Deny new binds; discoverable authenticated read/detach plus service reconciliation continue.",
260
+ },
261
+ },
262
+ {
263
+ cohort: "launch",
264
+ key: "collab.notices",
265
+ name: "Realtime notices",
266
+ description: "Reserved kill-switch for future realtime preview notices.",
267
+ stage: "internal",
268
+ surface: false,
269
+ defaultEnabled: false,
270
+ runtime: {
271
+ enabledForA8c: true,
272
+ planDefaults: {},
273
+ },
274
+ assignmentScopes: ["team", "global"],
275
+ docs: null,
276
+ owner: "team:collaboration",
277
+ requires: [],
278
+ lifecycleAdoptedAt: "2026-07-12",
279
+ reviewAfter: "2026-08-11",
280
+ removeAfter: null,
281
+ gaAt: null,
282
+ allowedActorPolicies: ["resource_team"],
283
+ downRamp: {
284
+ code: "notices_stop",
285
+ summary: "Stop mint/publish; service/operator revoke and cleanup continue.",
286
+ },
287
+ },
288
+ {
289
+ key: "collab.drawing",
290
+ name: "Collab drawing",
291
+ description: "Enables drawing feedback in the Collab overlay.",
292
+ defaultEnabled: true,
293
+ runtime: {
294
+ enabledInDevelopment: true,
295
+ enabledForA8c: true,
296
+ planDefaults: {},
297
+ },
298
+ },
299
+ {
300
+ cohort: "launch",
301
+ key: "sites.dedicated_runtime",
302
+ name: "Dedicated runtime sites",
303
+ description: "Allows teams to create dedicated WP.Cloud sites and place team spaces on them.",
304
+ stage: "internal",
305
+ surface: true,
306
+ defaultEnabled: false,
307
+ runtime: {
308
+ enabledInDevelopment: true,
309
+ enabledForA8c: true,
310
+ planDefaults: {},
311
+ },
312
+ assignmentScopes: ["team", "global"],
313
+ docs: {
314
+ channel: "handbook",
315
+ slug: "/features/sites/dedicated-runtime",
316
+ feedbackUrl: null,
317
+ },
318
+ owner: "team:runtime",
319
+ requires: [],
320
+ lifecycleAdoptedAt: "2026-07-12",
321
+ reviewAfter: "2026-08-11",
322
+ removeAfter: "2026-10-10",
323
+ gaAt: null,
324
+ allowedActorPolicies: ["request_actor", "resource_team"],
325
+ downRamp: {
326
+ code: "dedicated_runtime_stop",
327
+ 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.",
328
+ },
329
+ },
330
+ {
331
+ key: "shelf",
332
+ name: "Shelf",
333
+ description: "Exposes the per-user artifact shelf: dashboard curation and public /shelf/{handle} pages.",
334
+ defaultEnabled: false,
335
+ runtime: {
336
+ enabledInDevelopment: true,
337
+ enabledForA8c: true,
338
+ planDefaults: {},
339
+ },
340
+ },
341
+ {
342
+ cohort: "launch",
343
+ key: "build.content_pipeline",
344
+ name: "Content pipeline",
345
+ description: "Controls publish/finalize use of the content transformation pipeline.",
346
+ stage: "internal",
347
+ surface: true,
348
+ defaultEnabled: false,
349
+ runtime: null,
350
+ assignmentScopes: ["team", "global"],
351
+ docs: {
352
+ channel: "handbook",
353
+ slug: "/features/build/content-pipeline",
354
+ feedbackUrl: null,
355
+ },
356
+ owner: "team:build-platform",
357
+ requires: [],
358
+ lifecycleAdoptedAt: "2026-07-12",
359
+ reviewAfter: "2026-08-11",
360
+ removeAfter: "2026-10-10",
361
+ gaAt: null,
362
+ allowedActorPolicies: ["resource_team"],
363
+ downRamp: {
364
+ code: "content_pipeline_stop",
365
+ summary: "Deny next build/finalize; completed immutable output remains.",
366
+ },
367
+ },
368
+ {
369
+ cohort: "launch",
370
+ key: "tags",
371
+ name: "Spacefast Tag Manager",
372
+ description: "Enables Spacefast Tag Manager command surfaces, SDK configuration, and governed tag workflows.",
373
+ stage: "private_beta",
374
+ surface: true,
375
+ defaultEnabled: false,
376
+ runtime: {
377
+ enabledInDevelopment: true,
378
+ enabledForA8c: true,
379
+ planDefaults: {},
380
+ },
381
+ assignmentScopes: ["team", "global"],
382
+ docs: {
383
+ channel: "public",
384
+ slug: "/docs/tags",
385
+ feedbackUrl: null,
386
+ },
387
+ owner: "team:tag-manager",
388
+ requires: [],
389
+ lifecycleAdoptedAt: "2026-07-12",
390
+ reviewAfter: "2026-08-11",
391
+ removeAfter: "2026-10-10",
392
+ gaAt: null,
393
+ allowedActorPolicies: ["request_actor", "resource_team"],
394
+ downRamp: {
395
+ code: "tags_stop",
396
+ summary: "Deny every customer Tag API and dynamic module delivery; internal operator export/cleanup and platform-generated inert marker bytes remain.",
397
+ },
398
+ },
399
+ {
400
+ cohort: "launch",
401
+ key: "zero",
402
+ name: "Spacefast Zero",
403
+ description: "Enables Spacefast Zero command surfaces and hosted Zero app workflows.",
404
+ stage: "internal",
405
+ surface: true,
406
+ defaultEnabled: false,
407
+ runtime: {
408
+ enabledForA8c: true,
409
+ // Zero capsules can only run on a dedicated site, so the plans that grant
410
+ // `dedicatedRuntime` ARE the ones allowed to use it. Leaving these false
411
+ // made the entitlement and the flag two independent switches for one
412
+ // decision, and a team that paid for dedicated runtime still got
413
+ // `zero_requires_dedicated_plan` at finalize.
414
+ planDefaults: { enterprise: true, internal: true },
415
+ },
416
+ assignmentScopes: ["team", "global"],
417
+ docs: {
418
+ channel: "handbook",
419
+ slug: "/features/zero",
420
+ feedbackUrl: null,
421
+ },
422
+ owner: "team:zero",
423
+ requires: ["sites.dedicated_runtime"],
424
+ lifecycleAdoptedAt: "2026-07-12",
425
+ reviewAfter: "2026-08-11",
426
+ removeAfter: "2026-10-10",
427
+ gaAt: null,
428
+ allowedActorPolicies: ["resource_team"],
429
+ downRamp: {
430
+ code: "zero_stop",
431
+ summary: "Stop activation/invocation; operator export/delete/migration recovery remain.",
432
+ },
433
+ },
434
+ {
435
+ cohort: "launch",
436
+ key: "functions",
437
+ name: "Spacefast Functions",
438
+ description: "Dispatches a version's dynamic requests to the execution host. Compiling the worker at publish is not gated: " +
439
+ "the CLI always ships the bundle, and this flag decides whether anything runs it.",
440
+ stage: "internal",
441
+ surface: true,
442
+ defaultEnabled: false,
443
+ runtime: {
444
+ enabledForA8c: true,
445
+ planDefaults: {},
446
+ },
447
+ assignmentScopes: ["team", "global"],
448
+ docs: {
449
+ channel: "handbook",
450
+ slug: "/features/functions",
451
+ feedbackUrl: null,
452
+ },
453
+ owner: "team:zero",
454
+ // Deliberately no `sites.dedicated_runtime` requirement, unlike Zero: a
455
+ // worker executes on Cloudflare rather than on the space's box, and reaches
456
+ // the database only through the broker. Shared placement is safe here in a
457
+ // way it is not for a capsule.
458
+ requires: [],
459
+ lifecycleAdoptedAt: "2026-07-27",
460
+ reviewAfter: "2026-08-26",
461
+ removeAfter: "2026-10-25",
462
+ gaAt: null,
463
+ allowedActorPolicies: ["resource_team"],
464
+ downRamp: {
465
+ code: "functions_stop",
466
+ summary: "Stop emitting dispatch configuration at finalize; published bundles stay on disk as inert content and the " +
467
+ "version serves statically. Versions already carrying a config keep dispatching until they are replaced — " +
468
+ "unsetting the runtime's dispatch token is the immediate kill.",
469
+ },
470
+ },
471
+ {
472
+ cohort: "launch",
473
+ key: "spaces.slug_rename",
474
+ name: "Space slug rename",
475
+ description: "Renames a space and its managed hostname while retained former hostnames temporarily redirect to the current address.",
476
+ stage: "ga",
477
+ surface: true,
478
+ defaultEnabled: true,
479
+ runtime: {
480
+ enabledInDevelopment: true,
481
+ enabledForA8c: true,
482
+ planDefaults: {},
483
+ },
484
+ assignmentScopes: ["user", "team", "global"],
485
+ docs: {
486
+ channel: "public",
487
+ slug: "/docs/spaces/rename",
488
+ feedbackUrl: null,
489
+ },
490
+ owner: "team:spaces",
491
+ requires: [],
492
+ lifecycleAdoptedAt: "2026-07-12",
493
+ reviewAfter: "2026-08-11",
494
+ removeAfter: "2026-10-10",
495
+ gaAt: "2026-07-27",
496
+ allowedActorPolicies: ["request_actor"],
497
+ downRamp: {
498
+ code: "slug_rename_stop",
499
+ summary: "Deny new slug renames while already-committed hostname redirects and runtime convergence continue.",
500
+ },
501
+ },
502
+ ]);
503
+ function isLifecycleFeatureEntry(entry) {
504
+ return "cohort" in entry;
505
+ }
506
+ function isRuntimeFeatureEntry(entry) {
507
+ return entry.runtime !== null;
508
+ }
509
+ const featureLifecycleEntries = Object.freeze(featureEntries.filter(isLifecycleFeatureEntry).map((entry) => {
510
+ const { runtime, ...definition } = entry;
511
+ void runtime;
512
+ return freezeFeatureRegistryEntry(definition);
513
+ }));
514
+ export const FEATURE_LIFECYCLE_REGISTRY = featureLifecycleEntries;
515
+ const runtimeFeatureEntries = featureEntries.filter(isRuntimeFeatureEntry);
516
+ function assertRuntimeDefinitionsComplete(definitions, keys) {
517
+ for (const key of keys) {
518
+ if (!(key in definitions))
519
+ throw new Error(`Missing runtime feature definition for ${key}`);
520
+ }
521
+ }
522
+ function buildRuntimeDefinitions(entries) {
523
+ const definitions = {};
524
+ for (const { key, name, description, defaultEnabled, runtime } of entries) {
525
+ if (key in definitions)
526
+ throw new Error(`Duplicate runtime feature definition for ${key}`);
527
+ definitions[key] = Object.freeze({
528
+ key,
529
+ name,
530
+ description,
531
+ defaultEnabled,
532
+ ...runtime,
533
+ planDefaults: Object.freeze({ ...runtime.planDefaults }),
534
+ });
535
+ }
536
+ assertRuntimeDefinitionsComplete(definitions, entries.map(({ key }) => key));
537
+ return Object.freeze(definitions);
538
+ }
539
+ export const FEATURE_RUNTIME_KEYS = Object.freeze(runtimeFeatureEntries.map(({ key }) => key));
540
+ export const FEATURE_RUNTIME_DEFINITIONS = buildRuntimeDefinitions(runtimeFeatureEntries);
4
541
  const featureLifecycleByKey = new Map(FEATURE_LIFECYCLE_REGISTRY.map((definition) => [definition.key, definition]));
5
542
  export const FEATURE_LIFECYCLE_BY_KEY = Object.freeze({
6
543
  get size() {