@spacefast/common 0.0.10 → 0.0.12
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 +42 -24
- package/dist/contracts/access.js +73 -34
- package/dist/contracts/activity.d.ts +1 -1
- package/dist/contracts/activity.js +5 -5
- package/dist/contracts/api-keys.d.ts +53 -45
- package/dist/contracts/api-keys.js +1 -0
- package/dist/contracts/archives.d.ts +8 -8
- 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 +55 -19
- package/dist/contracts/comments.js +56 -17
- package/dist/contracts/common.d.ts +4 -3
- package/dist/contracts/common.js +2 -0
- package/dist/contracts/deployments.d.ts +3 -3
- package/dist/contracts/device-auth.d.ts +14 -12
- 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 +1 -1
- package/dist/contracts/error-code-meta.d.ts +84 -15
- package/dist/contracts/error-code-meta.js +28 -4
- package/dist/contracts/error-codes.d.ts +1 -1
- package/dist/contracts/error-codes.js +24 -6
- package/dist/contracts/events.d.ts +13 -13
- package/dist/contracts/feature-lifecycle.d.ts +644 -2
- package/dist/contracts/feature-lifecycle.js +685 -2
- package/dist/contracts/features.d.ts +236 -24
- package/dist/contracts/features.js +3 -272
- package/dist/contracts/ids.d.ts +1 -2
- package/dist/contracts/ids.js +1 -2
- package/dist/contracts/internal.d.ts +3 -3
- package/dist/contracts/mcp.d.ts +6 -6
- 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 +1 -0
- package/dist/contracts/operations.d.ts +2 -2
- package/dist/contracts/pages.d.ts +2 -2
- package/dist/contracts/pages.js +8 -3
- package/dist/contracts/plan-policy.d.ts +1 -1
- package/dist/contracts/platform.d.ts +3 -3
- package/dist/contracts/resources.d.ts +12 -20
- package/dist/contracts/resources.js +13 -37
- package/dist/contracts/runtime-api.d.ts +330 -16
- package/dist/contracts/runtime-api.js +58 -14
- package/dist/contracts/sf-config-v1.js +1 -1
- package/dist/contracts/sites.d.ts +12 -12
- package/dist/contracts/sites.js +18 -11
- package/dist/contracts/space-config.d.ts +2 -3
- package/dist/contracts/space-config.js +3 -1
- package/dist/contracts/spaces.d.ts +143 -102
- package/dist/contracts/spaces.js +109 -43
- package/dist/contracts/superadmin-emails.d.ts +25 -1
- package/dist/contracts/superadmin-emails.js +10 -15
- package/dist/contracts/superadmin-runtime.d.ts +2 -2
- package/dist/contracts/superadmin-spaces.d.ts +6 -14
- package/dist/contracts/tags.d.ts +43 -13
- package/dist/contracts/tags.js +195 -11
- package/dist/contracts/transfers.d.ts +1 -1
- 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 +329 -7
- package/dist/contracts/zero.js +121 -2
- package/dist/dashboard-paths/index.d.ts +1 -1
- package/dist/docs/agent-setup.d.ts +4 -2
- package/dist/docs/agent-setup.js +15 -7
- package/dist/docs/agent-solutions.js +1 -1
- package/dist/docs/catalog.d.ts +8 -10
- package/dist/docs/catalog.js +8 -10
- package/dist/docs/error-docs.js +86 -18
- package/dist/utils/access-grant.d.ts +14 -0
- package/dist/utils/access-grant.js +88 -0
- package/dist/utils/access-match.d.ts +7 -0
- package/dist/utils/access-match.fixtures.json +513 -0
- package/dist/utils/access-match.js +32 -16
- package/dist/utils/access-verdict.fixtures.json +421 -0
- package/dist/utils/credential-policy.d.ts +1 -1
- 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/id-hints.d.ts +1 -0
- package/dist/utils/id-hints.js +55 -13
- 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 +8 -1
- package/dist/utils/pages.js +123 -37
- package/dist/utils/production-runtime.d.ts +18 -0
- package/dist/utils/production-runtime.js +28 -0
- package/dist/utils/query-keys.d.ts +6 -7
- package/dist/utils/query-keys.js +11 -12
- package/dist/utils/sf-config-v1.fixtures.json +9 -0
- package/dist/utils/sf-config-v1.js +28 -19
- package/dist/utils/source-archive-policy.d.ts +2 -0
- package/dist/utils/source-archive-policy.js +2 -0
- package/dist/utils/static-runtime-policy.fixtures.json +57 -0
- package/dist/utils/static-runtime-policy.js +1 -1
- package/package.json +5 -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
|
@@ -1,6 +1,689 @@
|
|
|
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.comments",
|
|
265
|
+
name: "Comments",
|
|
266
|
+
description: "Enables Cast-backed comments on eligible immutable version URLs.",
|
|
267
|
+
stage: "ga",
|
|
268
|
+
surface: true,
|
|
269
|
+
defaultEnabled: true,
|
|
270
|
+
runtime: {
|
|
271
|
+
enabledInDevelopment: true,
|
|
272
|
+
enabledForA8c: true,
|
|
273
|
+
planDefaults: {},
|
|
274
|
+
},
|
|
275
|
+
assignmentScopes: ["user", "team", "global"],
|
|
276
|
+
docs: {
|
|
277
|
+
channel: "public",
|
|
278
|
+
slug: "/docs/collab",
|
|
279
|
+
feedbackUrl: null,
|
|
280
|
+
},
|
|
281
|
+
owner: "team:collaboration",
|
|
282
|
+
requires: [],
|
|
283
|
+
lifecycleAdoptedAt: "2026-07-12",
|
|
284
|
+
reviewAfter: "2026-08-11",
|
|
285
|
+
removeAfter: "2026-10-10",
|
|
286
|
+
gaAt: "2026-07-23",
|
|
287
|
+
allowedActorPolicies: ["request_actor", "persisted_request_actor", "resource_team"],
|
|
288
|
+
downRamp: {
|
|
289
|
+
code: "comments_stop",
|
|
290
|
+
summary: "Deny every customer comment read/write route and deferred task; internal operator export/cleanup continue.",
|
|
291
|
+
},
|
|
292
|
+
},
|
|
293
|
+
{
|
|
294
|
+
key: "collab.anonymous_commenters",
|
|
295
|
+
name: "Anonymous commenters",
|
|
296
|
+
description: "Allows anyone with the link to comment when space policy allows it.",
|
|
297
|
+
defaultEnabled: true,
|
|
298
|
+
runtime: {
|
|
299
|
+
enabledForA8c: true,
|
|
300
|
+
planDefaults: {},
|
|
301
|
+
},
|
|
302
|
+
},
|
|
303
|
+
{
|
|
304
|
+
cohort: "launch",
|
|
305
|
+
key: "collab.notices",
|
|
306
|
+
name: "Realtime notices",
|
|
307
|
+
description: "Reserved kill-switch for future realtime preview notices.",
|
|
308
|
+
stage: "internal",
|
|
309
|
+
surface: false,
|
|
310
|
+
defaultEnabled: false,
|
|
311
|
+
runtime: {
|
|
312
|
+
enabledForA8c: true,
|
|
313
|
+
planDefaults: {},
|
|
314
|
+
},
|
|
315
|
+
assignmentScopes: ["team", "global"],
|
|
316
|
+
docs: null,
|
|
317
|
+
owner: "team:collaboration",
|
|
318
|
+
requires: [],
|
|
319
|
+
lifecycleAdoptedAt: "2026-07-12",
|
|
320
|
+
reviewAfter: "2026-08-11",
|
|
321
|
+
removeAfter: null,
|
|
322
|
+
gaAt: null,
|
|
323
|
+
allowedActorPolicies: ["resource_team"],
|
|
324
|
+
downRamp: {
|
|
325
|
+
code: "notices_stop",
|
|
326
|
+
summary: "Stop mint/publish; service/operator revoke and cleanup continue.",
|
|
327
|
+
},
|
|
328
|
+
},
|
|
329
|
+
{
|
|
330
|
+
cohort: "launch",
|
|
331
|
+
key: "collab.published_comments",
|
|
332
|
+
name: "Published host comments",
|
|
333
|
+
description: "Allows the Collab overlay to mount comments on a space's live/published host, not just immutable preview URLs.",
|
|
334
|
+
stage: "ga",
|
|
335
|
+
surface: true,
|
|
336
|
+
defaultEnabled: true,
|
|
337
|
+
runtime: {
|
|
338
|
+
enabledInDevelopment: true,
|
|
339
|
+
enabledForA8c: true,
|
|
340
|
+
planDefaults: {},
|
|
341
|
+
},
|
|
342
|
+
assignmentScopes: ["team", "global"],
|
|
343
|
+
docs: {
|
|
344
|
+
channel: "public",
|
|
345
|
+
slug: "/docs/collab/published-comments",
|
|
346
|
+
feedbackUrl: null,
|
|
347
|
+
},
|
|
348
|
+
owner: "team:collaboration",
|
|
349
|
+
requires: ["collab.comments"],
|
|
350
|
+
lifecycleAdoptedAt: "2026-07-12",
|
|
351
|
+
reviewAfter: "2026-08-11",
|
|
352
|
+
removeAfter: "2026-10-10",
|
|
353
|
+
gaAt: "2026-07-23",
|
|
354
|
+
allowedActorPolicies: ["resource_team"],
|
|
355
|
+
downRamp: {
|
|
356
|
+
code: "published_comments_stop",
|
|
357
|
+
summary: "Stop published-host injection; stored data remains only for operator export/cleanup.",
|
|
358
|
+
},
|
|
359
|
+
},
|
|
360
|
+
{
|
|
361
|
+
key: "collab.drawing",
|
|
362
|
+
name: "Collab drawing",
|
|
363
|
+
description: "Enables drawing feedback in the Collab overlay.",
|
|
364
|
+
defaultEnabled: true,
|
|
365
|
+
runtime: {
|
|
366
|
+
enabledInDevelopment: true,
|
|
367
|
+
enabledForA8c: true,
|
|
368
|
+
planDefaults: {},
|
|
369
|
+
},
|
|
370
|
+
},
|
|
371
|
+
{
|
|
372
|
+
cohort: "launch",
|
|
373
|
+
key: "sites.dedicated_runtime",
|
|
374
|
+
name: "Dedicated runtime sites",
|
|
375
|
+
description: "Allows teams to create dedicated WP.Cloud sites and place team spaces on them.",
|
|
376
|
+
stage: "internal",
|
|
377
|
+
surface: true,
|
|
378
|
+
defaultEnabled: false,
|
|
379
|
+
runtime: {
|
|
380
|
+
enabledInDevelopment: true,
|
|
381
|
+
enabledForA8c: true,
|
|
382
|
+
planDefaults: {},
|
|
383
|
+
},
|
|
384
|
+
assignmentScopes: ["team", "global"],
|
|
385
|
+
docs: {
|
|
386
|
+
channel: "handbook",
|
|
387
|
+
slug: "/features/sites/dedicated-runtime",
|
|
388
|
+
feedbackUrl: null,
|
|
389
|
+
},
|
|
390
|
+
owner: "team:runtime",
|
|
391
|
+
requires: [],
|
|
392
|
+
lifecycleAdoptedAt: "2026-07-12",
|
|
393
|
+
reviewAfter: "2026-08-11",
|
|
394
|
+
removeAfter: "2026-10-10",
|
|
395
|
+
gaAt: null,
|
|
396
|
+
allowedActorPolicies: ["request_actor", "resource_team"],
|
|
397
|
+
downRamp: {
|
|
398
|
+
code: "dedicated_runtime_stop",
|
|
399
|
+
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.",
|
|
400
|
+
},
|
|
401
|
+
},
|
|
402
|
+
{
|
|
403
|
+
key: "shelf",
|
|
404
|
+
name: "Shelf",
|
|
405
|
+
description: "Exposes the per-user artifact shelf: dashboard curation and public /shelf/{handle} pages.",
|
|
406
|
+
defaultEnabled: false,
|
|
407
|
+
runtime: {
|
|
408
|
+
enabledInDevelopment: true,
|
|
409
|
+
enabledForA8c: true,
|
|
410
|
+
planDefaults: {},
|
|
411
|
+
},
|
|
412
|
+
},
|
|
413
|
+
{
|
|
414
|
+
cohort: "launch",
|
|
415
|
+
key: "build.content_pipeline",
|
|
416
|
+
name: "Content pipeline",
|
|
417
|
+
description: "Controls publish/finalize use of the content transformation pipeline.",
|
|
418
|
+
stage: "internal",
|
|
419
|
+
surface: true,
|
|
420
|
+
defaultEnabled: false,
|
|
421
|
+
runtime: null,
|
|
422
|
+
assignmentScopes: ["team", "global"],
|
|
423
|
+
docs: {
|
|
424
|
+
channel: "handbook",
|
|
425
|
+
slug: "/features/build/content-pipeline",
|
|
426
|
+
feedbackUrl: null,
|
|
427
|
+
},
|
|
428
|
+
owner: "team:build-platform",
|
|
429
|
+
requires: [],
|
|
430
|
+
lifecycleAdoptedAt: "2026-07-12",
|
|
431
|
+
reviewAfter: "2026-08-11",
|
|
432
|
+
removeAfter: "2026-10-10",
|
|
433
|
+
gaAt: null,
|
|
434
|
+
allowedActorPolicies: ["resource_team"],
|
|
435
|
+
downRamp: {
|
|
436
|
+
code: "content_pipeline_stop",
|
|
437
|
+
summary: "Deny next build/finalize; completed immutable output remains.",
|
|
438
|
+
},
|
|
439
|
+
},
|
|
440
|
+
{
|
|
441
|
+
cohort: "launch",
|
|
442
|
+
key: "tags",
|
|
443
|
+
name: "Spacefast Tag Manager",
|
|
444
|
+
description: "Enables Spacefast Tag Manager command surfaces, SDK configuration, and governed tag workflows.",
|
|
445
|
+
stage: "private_beta",
|
|
446
|
+
surface: true,
|
|
447
|
+
defaultEnabled: false,
|
|
448
|
+
runtime: {
|
|
449
|
+
enabledInDevelopment: true,
|
|
450
|
+
enabledForA8c: true,
|
|
451
|
+
planDefaults: {},
|
|
452
|
+
},
|
|
453
|
+
assignmentScopes: ["team", "global"],
|
|
454
|
+
docs: {
|
|
455
|
+
channel: "public",
|
|
456
|
+
slug: "/docs/tags",
|
|
457
|
+
feedbackUrl: null,
|
|
458
|
+
},
|
|
459
|
+
owner: "team:tag-manager",
|
|
460
|
+
requires: [],
|
|
461
|
+
lifecycleAdoptedAt: "2026-07-12",
|
|
462
|
+
reviewAfter: "2026-08-11",
|
|
463
|
+
removeAfter: "2026-10-10",
|
|
464
|
+
gaAt: null,
|
|
465
|
+
allowedActorPolicies: ["request_actor", "resource_team"],
|
|
466
|
+
downRamp: {
|
|
467
|
+
code: "tags_stop",
|
|
468
|
+
summary: "Deny every customer Tag API and dynamic module delivery; internal operator export/cleanup and platform-generated inert marker bytes remain.",
|
|
469
|
+
},
|
|
470
|
+
},
|
|
471
|
+
{
|
|
472
|
+
cohort: "launch",
|
|
473
|
+
key: "zero",
|
|
474
|
+
name: "Spacefast Zero",
|
|
475
|
+
description: "Enables Spacefast Zero command surfaces and hosted Zero app workflows.",
|
|
476
|
+
stage: "internal",
|
|
477
|
+
surface: true,
|
|
478
|
+
defaultEnabled: false,
|
|
479
|
+
runtime: {
|
|
480
|
+
enabledForA8c: true,
|
|
481
|
+
// Zero capsules can only run on a dedicated site, so the plans that grant
|
|
482
|
+
// `dedicatedRuntime` ARE the ones allowed to use it. Leaving these false
|
|
483
|
+
// made the entitlement and the flag two independent switches for one
|
|
484
|
+
// decision, and a team that paid for dedicated runtime still got
|
|
485
|
+
// `zero_requires_dedicated_plan` at finalize.
|
|
486
|
+
planDefaults: { enterprise: true, internal: true },
|
|
487
|
+
},
|
|
488
|
+
assignmentScopes: ["team", "global"],
|
|
489
|
+
docs: {
|
|
490
|
+
channel: "handbook",
|
|
491
|
+
slug: "/features/zero",
|
|
492
|
+
feedbackUrl: null,
|
|
493
|
+
},
|
|
494
|
+
owner: "team:zero",
|
|
495
|
+
requires: ["sites.dedicated_runtime"],
|
|
496
|
+
lifecycleAdoptedAt: "2026-07-12",
|
|
497
|
+
reviewAfter: "2026-08-11",
|
|
498
|
+
removeAfter: "2026-10-10",
|
|
499
|
+
gaAt: null,
|
|
500
|
+
allowedActorPolicies: ["resource_team"],
|
|
501
|
+
downRamp: {
|
|
502
|
+
code: "zero_stop",
|
|
503
|
+
summary: "Stop activation/invocation; operator export/delete/migration recovery remain.",
|
|
504
|
+
},
|
|
505
|
+
},
|
|
506
|
+
{
|
|
507
|
+
cohort: "launch",
|
|
508
|
+
key: "access.invites",
|
|
509
|
+
name: "Space invites",
|
|
510
|
+
description: "Enables account-less viewer invites with magic-link accept and the request-access loop (access-plan §5.3/§5.4).",
|
|
511
|
+
stage: "internal",
|
|
512
|
+
surface: true,
|
|
513
|
+
defaultEnabled: false,
|
|
514
|
+
runtime: {
|
|
515
|
+
enabledInDevelopment: true,
|
|
516
|
+
enabledForA8c: true,
|
|
517
|
+
planDefaults: {},
|
|
518
|
+
},
|
|
519
|
+
assignmentScopes: ["user", "team", "global"],
|
|
520
|
+
docs: {
|
|
521
|
+
channel: "handbook",
|
|
522
|
+
slug: "/features/access/invites",
|
|
523
|
+
feedbackUrl: null,
|
|
524
|
+
},
|
|
525
|
+
owner: "team:access",
|
|
526
|
+
requires: [],
|
|
527
|
+
lifecycleAdoptedAt: "2026-07-12",
|
|
528
|
+
reviewAfter: "2026-08-11",
|
|
529
|
+
removeAfter: "2026-10-10",
|
|
530
|
+
gaAt: null,
|
|
531
|
+
allowedActorPolicies: ["request_actor", "persisted_request_actor"],
|
|
532
|
+
downRamp: {
|
|
533
|
+
code: "invites_stop",
|
|
534
|
+
summary: "Deny every customer invite route and deferred delivery; internal operator cancel/revoke and service cleanup continue.",
|
|
535
|
+
},
|
|
536
|
+
},
|
|
537
|
+
{
|
|
538
|
+
key: "access.firewall_card",
|
|
539
|
+
name: "Firewall card",
|
|
540
|
+
description: "Enables the managed firewall block card (country/IP/bot rules) in space access settings (access-plan §5.6).",
|
|
541
|
+
defaultEnabled: true,
|
|
542
|
+
runtime: {
|
|
543
|
+
enabledInDevelopment: true,
|
|
544
|
+
enabledForA8c: true,
|
|
545
|
+
planDefaults: {},
|
|
546
|
+
},
|
|
547
|
+
},
|
|
548
|
+
{
|
|
549
|
+
cohort: "launch",
|
|
550
|
+
key: "access.sso_connections",
|
|
551
|
+
name: "Company SSO connections",
|
|
552
|
+
description: "Enables team-level OIDC connections minted at the authorize endpoint (access-plan §6.2, X-18).",
|
|
553
|
+
stage: "internal",
|
|
554
|
+
surface: true,
|
|
555
|
+
defaultEnabled: false,
|
|
556
|
+
runtime: {
|
|
557
|
+
enabledInDevelopment: true,
|
|
558
|
+
enabledForA8c: true,
|
|
559
|
+
planDefaults: {},
|
|
560
|
+
},
|
|
561
|
+
assignmentScopes: ["user", "team", "global"],
|
|
562
|
+
docs: {
|
|
563
|
+
channel: "handbook",
|
|
564
|
+
slug: "/features/access/sso-connections",
|
|
565
|
+
feedbackUrl: null,
|
|
566
|
+
},
|
|
567
|
+
owner: "team:access",
|
|
568
|
+
requires: [],
|
|
569
|
+
lifecycleAdoptedAt: "2026-07-12",
|
|
570
|
+
reviewAfter: "2026-08-11",
|
|
571
|
+
removeAfter: "2026-10-10",
|
|
572
|
+
gaAt: null,
|
|
573
|
+
allowedActorPolicies: ["request_actor", "persisted_request_actor"],
|
|
574
|
+
downRamp: {
|
|
575
|
+
code: "sso_connections_stop",
|
|
576
|
+
summary: "Deny every customer SSO connection route and callback; internal operator revoke/cleanup continue.",
|
|
577
|
+
},
|
|
578
|
+
},
|
|
579
|
+
{
|
|
580
|
+
cohort: "launch",
|
|
581
|
+
key: "access.byo_issuers",
|
|
582
|
+
name: "Bring-your-own issuers",
|
|
583
|
+
description: "Enables owner-held external token issuers with ext:-namespace binding (access-plan §6.3, X-19).",
|
|
584
|
+
stage: "internal",
|
|
585
|
+
surface: true,
|
|
586
|
+
defaultEnabled: false,
|
|
587
|
+
runtime: {
|
|
588
|
+
enabledInDevelopment: true,
|
|
589
|
+
enabledForA8c: true,
|
|
590
|
+
planDefaults: {},
|
|
591
|
+
},
|
|
592
|
+
assignmentScopes: ["user", "team", "global"],
|
|
593
|
+
docs: {
|
|
594
|
+
channel: "handbook",
|
|
595
|
+
slug: "/features/access/byo-issuers",
|
|
596
|
+
feedbackUrl: null,
|
|
597
|
+
},
|
|
598
|
+
owner: "team:access",
|
|
599
|
+
requires: [],
|
|
600
|
+
lifecycleAdoptedAt: "2026-07-12",
|
|
601
|
+
reviewAfter: "2026-08-11",
|
|
602
|
+
removeAfter: "2026-10-10",
|
|
603
|
+
gaAt: null,
|
|
604
|
+
allowedActorPolicies: ["request_actor", "persisted_request_actor"],
|
|
605
|
+
downRamp: {
|
|
606
|
+
code: "byo_issuers_stop",
|
|
607
|
+
summary: "Deny every customer issuer route and callback; internal operator revoke/cleanup continue.",
|
|
608
|
+
},
|
|
609
|
+
},
|
|
610
|
+
{
|
|
611
|
+
key: "access.views_panel",
|
|
612
|
+
name: "Views panel",
|
|
613
|
+
description: "Enables the identified who-viewed-what panel riding the analytics tiers (access-plan §5.6b, X-28).",
|
|
614
|
+
defaultEnabled: true,
|
|
615
|
+
runtime: {
|
|
616
|
+
enabledInDevelopment: true,
|
|
617
|
+
enabledForA8c: true,
|
|
618
|
+
planDefaults: {},
|
|
619
|
+
},
|
|
620
|
+
},
|
|
621
|
+
{
|
|
622
|
+
cohort: "launch",
|
|
623
|
+
key: "spaces.slug_rename",
|
|
624
|
+
name: "Space slug rename",
|
|
625
|
+
description: "Changes mutable space identity metadata while the stable managed hostname and hostname rows remain unchanged.",
|
|
626
|
+
stage: "internal",
|
|
627
|
+
surface: true,
|
|
628
|
+
defaultEnabled: false,
|
|
629
|
+
runtime: null,
|
|
630
|
+
assignmentScopes: ["user", "team", "global"],
|
|
631
|
+
docs: {
|
|
632
|
+
channel: "handbook",
|
|
633
|
+
slug: "/features/spaces/slug-rename",
|
|
634
|
+
feedbackUrl: null,
|
|
635
|
+
},
|
|
636
|
+
owner: "team:spaces",
|
|
637
|
+
requires: [],
|
|
638
|
+
lifecycleAdoptedAt: "2026-07-12",
|
|
639
|
+
reviewAfter: "2026-08-11",
|
|
640
|
+
removeAfter: "2026-10-10",
|
|
641
|
+
gaAt: null,
|
|
642
|
+
allowedActorPolicies: ["request_actor"],
|
|
643
|
+
downRamp: {
|
|
644
|
+
code: "slug_rename_stop",
|
|
645
|
+
summary: "Deny every new stable-host slug rename; the atomic metadata write has no deferred feature continuation.",
|
|
646
|
+
},
|
|
647
|
+
},
|
|
648
|
+
]);
|
|
649
|
+
function isLifecycleFeatureEntry(entry) {
|
|
650
|
+
return "cohort" in entry;
|
|
651
|
+
}
|
|
652
|
+
function isRuntimeFeatureEntry(entry) {
|
|
653
|
+
return entry.runtime !== null;
|
|
654
|
+
}
|
|
655
|
+
const featureLifecycleEntries = Object.freeze(featureEntries.filter(isLifecycleFeatureEntry).map((entry) => {
|
|
656
|
+
const { runtime, ...definition } = entry;
|
|
657
|
+
void runtime;
|
|
658
|
+
return freezeFeatureRegistryEntry(definition);
|
|
659
|
+
}));
|
|
660
|
+
export const FEATURE_LIFECYCLE_REGISTRY = featureLifecycleEntries;
|
|
661
|
+
const runtimeFeatureEntries = featureEntries.filter(isRuntimeFeatureEntry);
|
|
662
|
+
function assertRuntimeDefinitionsComplete(definitions, keys) {
|
|
663
|
+
for (const key of keys) {
|
|
664
|
+
if (!(key in definitions))
|
|
665
|
+
throw new Error(`Missing runtime feature definition for ${key}`);
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
function buildRuntimeDefinitions(entries) {
|
|
669
|
+
const definitions = {};
|
|
670
|
+
for (const { key, name, description, defaultEnabled, runtime } of entries) {
|
|
671
|
+
if (key in definitions)
|
|
672
|
+
throw new Error(`Duplicate runtime feature definition for ${key}`);
|
|
673
|
+
definitions[key] = Object.freeze({
|
|
674
|
+
key,
|
|
675
|
+
name,
|
|
676
|
+
description,
|
|
677
|
+
defaultEnabled,
|
|
678
|
+
...runtime,
|
|
679
|
+
planDefaults: Object.freeze({ ...runtime.planDefaults }),
|
|
680
|
+
});
|
|
681
|
+
}
|
|
682
|
+
assertRuntimeDefinitionsComplete(definitions, entries.map(({ key }) => key));
|
|
683
|
+
return Object.freeze(definitions);
|
|
684
|
+
}
|
|
685
|
+
export const FEATURE_RUNTIME_KEYS = Object.freeze(runtimeFeatureEntries.map(({ key }) => key));
|
|
686
|
+
export const FEATURE_RUNTIME_DEFINITIONS = buildRuntimeDefinitions(runtimeFeatureEntries);
|
|
4
687
|
const featureLifecycleByKey = new Map(FEATURE_LIFECYCLE_REGISTRY.map((definition) => [definition.key, definition]));
|
|
5
688
|
export const FEATURE_LIFECYCLE_BY_KEY = Object.freeze({
|
|
6
689
|
get size() {
|