@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.
- package/dist/agents/connect-targets.d.ts +4 -4
- package/dist/agents/connect-targets.js +3 -3
- package/dist/agents/private-key-oauth.d.ts +37 -0
- package/dist/agents/private-key-oauth.js +158 -0
- package/dist/config/domains.js +1 -1
- package/dist/config/index.d.ts +1 -0
- package/dist/config/index.js +1 -0
- package/dist/config/postgres-budget.d.ts +126 -0
- package/dist/config/postgres-budget.js +135 -0
- package/dist/config/postgres-budget.json +50 -0
- package/dist/contracts/access.d.ts +386 -1183
- package/dist/contracts/access.js +240 -1018
- package/dist/contracts/activity.d.ts +1 -1
- package/dist/contracts/activity.js +11 -19
- package/dist/contracts/api-keys.d.ts +69 -45
- package/dist/contracts/api-keys.js +3 -0
- package/dist/contracts/archives.d.ts +9 -10
- package/dist/contracts/archives.js +4 -6
- package/dist/contracts/builds.d.ts +8 -8
- package/dist/contracts/builds.js +28 -48
- package/dist/contracts/channels.js +1 -2
- package/dist/contracts/comments.d.ts +102 -93
- package/dist/contracts/comments.js +121 -63
- package/dist/contracts/common.d.ts +4 -3
- package/dist/contracts/common.js +2 -0
- package/dist/contracts/countries.js +2 -7
- package/dist/contracts/data-source-routes.d.ts +20 -0
- package/dist/contracts/data-source-routes.js +15 -0
- package/dist/contracts/deployments.d.ts +3 -3
- package/dist/contracts/device-auth.d.ts +21 -15
- package/dist/contracts/docs.d.ts +5 -5
- package/dist/contracts/domains.d.ts +261 -1330
- package/dist/contracts/domains.js +39 -301
- package/dist/contracts/email-preferences.d.ts +50 -0
- package/dist/contracts/email-preferences.js +44 -0
- package/dist/contracts/enums.d.ts +3 -5
- package/dist/contracts/enums.js +3 -8
- package/dist/contracts/error-code-meta.d.ts +99 -33
- package/dist/contracts/error-code-meta.js +36 -9
- package/dist/contracts/error-codes.d.ts +1 -1
- package/dist/contracts/error-codes.js +28 -11
- package/dist/contracts/execution.d.ts +212 -0
- package/dist/contracts/execution.js +288 -0
- package/dist/contracts/feature-lifecycle.d.ts +498 -2
- package/dist/contracts/feature-lifecycle.js +539 -2
- package/dist/contracts/features.d.ts +184 -74
- package/dist/contracts/features.js +4 -303
- package/dist/contracts/functions.d.ts +729 -0
- package/dist/contracts/functions.js +485 -0
- package/dist/contracts/git.d.ts +1 -1
- package/dist/contracts/grants.d.ts +1158 -0
- package/dist/contracts/grants.js +696 -0
- package/dist/contracts/ids.d.ts +6 -5
- package/dist/contracts/ids.js +6 -5
- package/dist/contracts/internal.d.ts +3 -3
- package/dist/contracts/mcp.d.ts +12 -12
- package/dist/contracts/me.js +1 -1
- package/dist/contracts/mounts.d.ts +142 -0
- package/dist/contracts/mounts.js +56 -0
- package/dist/contracts/oauth-resources.d.ts +5 -5
- package/dist/contracts/oauth-resources.js +2 -0
- package/dist/contracts/operations.d.ts +4 -4
- package/dist/contracts/pages.d.ts +6 -14
- package/dist/contracts/pages.js +11 -23
- package/dist/contracts/plan-policy.d.ts +2 -9
- package/dist/contracts/plan-policy.js +1 -4
- package/dist/contracts/platform.d.ts +80 -32
- package/dist/contracts/platform.js +59 -12
- package/dist/contracts/push-new.d.ts +26 -2
- package/dist/contracts/push-new.js +8 -0
- package/dist/contracts/quotas.d.ts +0 -1
- package/dist/contracts/quotas.js +0 -5
- package/dist/contracts/repository-connections.d.ts +1 -1
- package/dist/contracts/resources.d.ts +21 -85
- package/dist/contracts/resources.js +17 -47
- package/dist/contracts/runtime-api.d.ts +799 -192
- package/dist/contracts/runtime-api.js +231 -100
- package/dist/contracts/runtime-app.d.ts +138 -0
- package/dist/contracts/runtime-app.js +21 -0
- package/dist/contracts/sf-config-v1.d.ts +5 -0
- package/dist/contracts/sf-config-v1.js +1 -1
- package/dist/contracts/sites.d.ts +17 -12
- package/dist/contracts/sites.js +30 -12
- package/dist/contracts/space-config.d.ts +46 -117
- package/dist/contracts/space-config.js +323 -25
- package/dist/contracts/spaces.d.ts +392 -256
- package/dist/contracts/spaces.js +163 -83
- package/dist/contracts/superadmin-emails.d.ts +27 -3
- package/dist/contracts/superadmin-emails.js +10 -15
- package/dist/contracts/superadmin-runtime.d.ts +2 -2
- package/dist/contracts/superadmin-spaces.d.ts +19 -142
- package/dist/contracts/superadmin-spaces.js +7 -0
- package/dist/contracts/tags.d.ts +66 -36
- package/dist/contracts/tags.js +195 -11
- package/dist/contracts/teams.d.ts +9 -9
- package/dist/contracts/transfers.d.ts +1 -2
- package/dist/contracts/variables.d.ts +4 -4
- package/dist/contracts/variables.js +4 -3
- package/dist/contracts/webhooks.d.ts +2 -2
- package/dist/contracts/zero.d.ts +437 -193
- package/dist/contracts/zero.js +149 -158
- package/dist/dashboard-paths/index.d.ts +3 -3
- package/dist/dashboard-paths/index.js +1 -0
- package/dist/docs/agent-prose.js +10 -8
- package/dist/docs/agent-setup.d.ts +6 -4
- package/dist/docs/agent-setup.js +26 -16
- package/dist/docs/agent-solutions.js +1 -1
- package/dist/docs/catalog.d.ts +35 -37
- package/dist/docs/catalog.js +36 -38
- package/dist/docs/error-docs.js +108 -44
- package/dist/utils/asset-fingerprint.d.ts +11 -0
- package/dist/utils/asset-fingerprint.js +46 -0
- package/dist/utils/auth-redirect.d.ts +1 -3
- package/dist/utils/auth-redirect.js +1 -21
- package/dist/utils/build-settings.d.ts +2 -0
- package/dist/utils/build-settings.js +61 -9
- package/dist/utils/credential-policy.d.ts +1 -1
- package/dist/utils/credential-policy.js +4 -0
- package/dist/utils/dns-instructions.d.ts +29 -0
- package/dist/utils/dns-instructions.js +78 -0
- package/dist/utils/domain-diagnostics.d.ts +29 -0
- package/dist/utils/domain-diagnostics.js +63 -0
- package/dist/utils/egress-policy.fixtures.json +51 -0
- package/dist/utils/grants.d.ts +53 -0
- package/dist/utils/grants.js +160 -0
- package/dist/utils/id-hints.d.ts +1 -0
- package/dist/utils/id-hints.js +55 -13
- package/dist/utils/local-space-state.js +1 -0
- package/dist/utils/page-colors.d.ts +50 -0
- package/dist/utils/page-colors.js +167 -0
- package/dist/utils/page-fonts.d.ts +2 -0
- package/dist/utils/page-fonts.js +4 -0
- package/dist/utils/pages.d.ts +19 -6
- package/dist/utils/pages.js +122 -49
- package/dist/utils/production-runtime.d.ts +18 -0
- package/dist/utils/production-runtime.js +28 -0
- package/dist/utils/publish-policy.d.ts +34 -4
- package/dist/utils/publish-policy.js +132 -61
- package/dist/utils/query-keys.d.ts +7 -13
- package/dist/utils/query-keys.js +12 -18
- package/dist/utils/source-archive-policy.d.ts +2 -0
- package/dist/utils/source-archive-policy.js +2 -0
- package/dist/utils/space-config.d.ts +5 -1
- package/dist/utils/space-config.js +35 -0
- package/dist/utils/static-runtime-policy.d.ts +5 -0
- package/dist/utils/static-runtime-policy.fixtures.json +57 -0
- package/dist/utils/static-runtime-policy.js +54 -10
- package/dist/utils/upload-session.d.ts +3 -0
- package/dist/utils/upload-session.js +31 -0
- package/package.json +6 -4
- package/dist/contracts/annotations.d.ts +0 -327
- package/dist/contracts/annotations.js +0 -235
- package/dist/contracts/generated-feature-launch-entries.d.ts +0 -2
- package/dist/contracts/generated-feature-launch-entries.js +0 -518
- package/dist/contracts/publishes.d.ts +0 -135
- package/dist/contracts/publishes.js +0 -162
- package/dist/utils/access-match.d.ts +0 -39
- package/dist/utils/access-match.js +0 -296
- package/dist/utils/sf-config-v1.d.ts +0 -2
- package/dist/utils/sf-config-v1.js +0 -542
|
@@ -1,6 +1,543 @@
|
|
|
1
|
-
import {
|
|
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
|
-
|
|
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() {
|