@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,42 +1,11 @@
1
1
  import { z } from "zod";
2
+ import { FEATURE_RUNTIME_DEFINITIONS, FEATURE_RUNTIME_KEYS, } from "./feature-lifecycle.js";
2
3
  // Spec plan vocabulary (internal-docs/platform.md "Plans And Limits").
3
4
  // `enterprise` and `internal` are named plans without self-serve pricing.
4
5
  export const PLAN_CODES = ["free", "personal", "work", "enterprise", "internal"];
5
6
  export const planCodeSchema = z.enum(PLAN_CODES).describe("Plan code.");
6
7
  export const DEFAULT_PLAN_CODE = "free";
7
- export const FEATURE_KEYS = [
8
- "plans.paid.available",
9
- "anonymous.publishing",
10
- "beta.enrollment_gate",
11
- "domains.search",
12
- "domains.registration",
13
- "domains.dns_management",
14
- "domains.wpcom_dns",
15
- "domains.domain_connect",
16
- "domains.proxy_bindings",
17
- "collab.preview_loader",
18
- "collab.comments",
19
- "collab.anonymous_commenters",
20
- "collab.cli",
21
- "collab.notices",
22
- "collab.published_comments",
23
- "collab.drawing",
24
- "sites.dedicated_runtime",
25
- "shelf",
26
- "tags",
27
- "zero",
28
- // Access product phases (access-plan §7, X-42): every phase ships behind its
29
- // own dot-namespaced key, born internal-only. The lifecycle registry
30
- // (stage/docsSlug per internal-docs/feature-lifecycle-plan.html) is not
31
- // implemented yet — these use the existing FeatureDefinition shape with
32
- // internal-only defaults until it lands.
33
- "access.share_links",
34
- "access.invites",
35
- "access.firewall_card",
36
- "access.sso_connections",
37
- "access.byo_issuers",
38
- "access.views_panel",
39
- ];
8
+ export const FEATURE_KEYS = FEATURE_RUNTIME_KEYS;
40
9
  export const featureKeySchema = z.enum(FEATURE_KEYS).describe("Feature flag key.");
41
10
  // Feature override states (env `SPACEFAST_FLAG_*` and the feature_overrides
42
11
  // table). `kill_switch` short-circuits every other resolution layer.
@@ -54,7 +23,6 @@ export const planLimitsSchema = z
54
23
  teamMembers: planLimitValueSchema,
55
24
  subTeams: planLimitValueSchema,
56
25
  externalDomainGroups: planLimitValueSchema,
57
- publicImmutableVersionWindowDays: planLimitValueSchema,
58
26
  // Version retention (charter arbitration A3, internal plan data — never on
59
27
  // the PlanPolicyResponse wire shape): `versionRetentionDays` is the included
60
28
  // full-retention window; after it versions stay stored but gated until
@@ -79,12 +47,7 @@ export const planLimitsSchema = z
79
47
  // Queryable analytics history window. Storage retains rollups for everyone
80
48
  // (env-bounded); this only clamps how far back the analytics API serves.
81
49
  analyticsRetentionDays: planLimitValueSchema,
82
- // Access-surface abuse ceilings (access-plan §5.1, X-40): generous by
83
- // default, enterprise unlimited — never upsell levers. Per-plan tightening
84
- // (if ever) happens here, never as constants in route code.
85
- // Cloud-lane rules per space (incl. TTL'd blocks; managed blocks excluded
86
- // from the count).
87
- cloudRulesPerSpace: planLimitValueSchema,
50
+ // Access-surface abuse ceilings: generous by default, enterprise unlimited.
88
51
  // Active (non-revoked, non-expired) share links per space.
89
52
  shareLinksPerSpace: planLimitValueSchema,
90
53
  // Active invites per space (§5.3 — enforced when invites land).
@@ -94,12 +57,6 @@ export const planLimitsSchema = z
94
57
  inviteEmailsPerAccountDaily: planLimitValueSchema,
95
58
  // Pending access requests per space (§5.4).
96
59
  pendingAccessRequestsPerSpace: planLimitValueSchema,
97
- // Service tokens per team (§5.5).
98
- serviceTokensPerTeam: planLimitValueSchema,
99
- // OIDC + external issuer connections per team (§6).
100
- connectionsPerTeam: planLimitValueSchema,
101
- // Team-default rules (X-24).
102
- teamDefaultRules: planLimitValueSchema,
103
60
  })
104
61
  .describe("Named plan limit table.");
105
62
  // Resolved team entitlements: plan limits after add-on grants plus the
@@ -109,9 +66,6 @@ export const teamEntitlementsSchema = z
109
66
  .object({
110
67
  planCode: planCodeSchema,
111
68
  limits: planLimitsSchema,
112
- headersBasicAuth: z
113
- .boolean()
114
- .describe("Whether `_headers` Basic-Auth rules compile on this plan."),
115
69
  externalProxy: z.boolean().describe("Whether external proxy upstreams compile on this plan."),
116
70
  dedicatedRuntime: z.boolean().describe("Whether the team can use dedicated runtime sites."),
117
71
  pagesTemplates: z
@@ -150,7 +104,6 @@ const UNLIMITED_LIMITS = {
150
104
  teamMembers: "unlimited",
151
105
  subTeams: "unlimited",
152
106
  externalDomainGroups: "unlimited",
153
- publicImmutableVersionWindowDays: "unlimited",
154
107
  versionRetentionDays: "unlimited",
155
108
  versionGatedKeepDays: "unlimited",
156
109
  egressBytesPerDay: "unlimited",
@@ -161,29 +114,21 @@ const UNLIMITED_LIMITS = {
161
114
  buildAccessLogRetentionHours: "unlimited",
162
115
  buildsDeploysMonthly: "unlimited",
163
116
  analyticsRetentionDays: "unlimited",
164
- cloudRulesPerSpace: "unlimited",
165
117
  shareLinksPerSpace: "unlimited",
166
118
  invitesPerSpace: "unlimited",
167
119
  inviteEmailsPerSpaceDaily: "unlimited",
168
120
  inviteEmailsPerAccountDaily: "unlimited",
169
121
  pendingAccessRequestsPerSpace: "unlimited",
170
- serviceTokensPerTeam: "unlimited",
171
- connectionsPerTeam: "unlimited",
172
- teamDefaultRules: "unlimited",
173
122
  };
174
123
  // The §5.1 access abuse-ceiling table (X-40): applied verbatim to every
175
124
  // self-serve plan; enterprise/internal stay unlimited. These sit far above
176
125
  // honest use — they are abuse ceilings, not upsell levers.
177
126
  const ACCESS_QUOTA_DEFAULTS = {
178
- cloudRulesPerSpace: 200,
179
127
  shareLinksPerSpace: 100,
180
128
  invitesPerSpace: 500,
181
129
  inviteEmailsPerSpaceDaily: 200,
182
130
  inviteEmailsPerAccountDaily: 500,
183
131
  pendingAccessRequestsPerSpace: 100,
184
- serviceTokensPerTeam: 50,
185
- connectionsPerTeam: 10,
186
- teamDefaultRules: 50,
187
132
  };
188
133
  export const PLAN_DEFINITIONS = {
189
134
  free: {
@@ -195,7 +140,6 @@ export const PLAN_DEFINITIONS = {
195
140
  teamMembers: 3,
196
141
  subTeams: 0,
197
142
  externalDomainGroups: 3,
198
- publicImmutableVersionWindowDays: 7,
199
143
  versionRetentionDays: 30, // included full-retention window (charter A3)
200
144
  versionGatedKeepDays: 183, // kept gated ~6 months from readyAt, then deleted
201
145
  egressBytesPerDay: 100 * GB, // = worst-case ceiling; tunable per plan
@@ -208,7 +152,6 @@ export const PLAN_DEFINITIONS = {
208
152
  analyticsRetentionDays: 30,
209
153
  ...ACCESS_QUOTA_DEFAULTS,
210
154
  },
211
- headersBasicAuth: false,
212
155
  externalProxy: false,
213
156
  dedicatedRuntime: false,
214
157
  pagesTemplates: false,
@@ -234,7 +177,6 @@ export const PLAN_DEFINITIONS = {
234
177
  analyticsRetentionDays: 365,
235
178
  ...ACCESS_QUOTA_DEFAULTS,
236
179
  },
237
- headersBasicAuth: true,
238
180
  externalProxy: true,
239
181
  dedicatedRuntime: false,
240
182
  pagesTemplates: true,
@@ -256,7 +198,6 @@ export const PLAN_DEFINITIONS = {
256
198
  subTeams: 0,
257
199
  ...ACCESS_QUOTA_DEFAULTS,
258
200
  },
259
- headersBasicAuth: true,
260
201
  externalProxy: true,
261
202
  dedicatedRuntime: false,
262
203
  pagesTemplates: true,
@@ -270,7 +211,6 @@ export const PLAN_DEFINITIONS = {
270
211
  name: "Enterprise",
271
212
  monthlyPriceUsd: null,
272
213
  limits: { ...UNLIMITED_LIMITS },
273
- headersBasicAuth: true,
274
214
  externalProxy: true,
275
215
  dedicatedRuntime: true,
276
216
  pagesTemplates: true,
@@ -283,7 +223,6 @@ export const PLAN_DEFINITIONS = {
283
223
  name: "Internal",
284
224
  monthlyPriceUsd: null,
285
225
  limits: { ...UNLIMITED_LIMITS },
286
- headersBasicAuth: true,
287
226
  externalProxy: true,
288
227
  dedicatedRuntime: true,
289
228
  pagesTemplates: true,
@@ -292,245 +231,7 @@ export const PLAN_DEFINITIONS = {
292
231
  analyticsHourlyGranularity: true,
293
232
  },
294
233
  };
295
- export const FEATURE_DEFINITIONS = {
296
- "plans.paid.available": {
297
- key: "plans.paid.available",
298
- name: "Paid plans available",
299
- description: "Controls whether paid plan upgrade and management surfaces are available.",
300
- defaultEnabled: false,
301
- enabledForA8c: true,
302
- planDefaults: {},
303
- },
304
- "anonymous.publishing": {
305
- key: "anonymous.publishing",
306
- name: "Anonymous publishing",
307
- description: "Allows unauthenticated space creation and publishing.",
308
- defaultEnabled: true,
309
- enabledForA8c: true,
310
- planDefaults: {},
311
- },
312
- // Flipped in prod via env (`SPACEFAST_FLAG_BETA_ENROLLMENT_GATE`), so launch
313
- // day is an env flip, not a deploy — exact precedent of anonymous.publishing.
314
- "beta.enrollment_gate": {
315
- key: "beta.enrollment_gate",
316
- name: "Beta enrollment gate",
317
- description: "Gates the whole API behind private-beta enrollment; non-enrolled credentials get 403 not_enrolled.",
318
- defaultEnabled: false,
319
- enabledForA8c: true,
320
- planDefaults: {},
321
- },
322
- "domains.search": {
323
- key: "domains.search",
324
- name: "Domain search",
325
- description: "Allows domain availability search and suggestion surfaces.",
326
- defaultEnabled: false,
327
- enabledInDevelopment: true,
328
- enabledForA8c: true,
329
- planDefaults: {},
330
- },
331
- "domains.registration": {
332
- key: "domains.registration",
333
- name: "Domain registration",
334
- description: "Allows domain registration, purchase, and transfer-in surfaces.",
335
- defaultEnabled: false,
336
- enabledInDevelopment: true,
337
- enabledForA8c: true,
338
- planDefaults: {},
339
- },
340
- "domains.dns_management": {
341
- key: "domains.dns_management",
342
- name: "DNS management",
343
- description: "Allows customer DNS zone, nameserver, and record-management surfaces.",
344
- defaultEnabled: false,
345
- enabledInDevelopment: true,
346
- enabledForA8c: true,
347
- planDefaults: {},
348
- },
349
- "domains.wpcom_dns": {
350
- key: "domains.wpcom_dns",
351
- name: "WordPress.com DNS automation",
352
- description: "Manage a domain's DNS through the owner's WordPress.com account.",
353
- defaultEnabled: false,
354
- enabledForA8c: true,
355
- planDefaults: {},
356
- },
357
- "domains.domain_connect": {
358
- key: "domains.domain_connect",
359
- name: "Domain Connect",
360
- description: "One-click DNS setup at providers that implement Domain Connect.",
361
- defaultEnabled: false,
362
- enabledForA8c: true,
363
- planDefaults: {},
364
- },
365
- "domains.proxy_bindings": {
366
- key: "domains.proxy_bindings",
367
- name: "Domain proxy bindings",
368
- description: "Allow a team to proxy custom-domain traffic to an external HTTP upstream.",
369
- defaultEnabled: false,
370
- enabledForA8c: true,
371
- planDefaults: {
372
- internal: true,
373
- },
374
- },
375
- "collab.preview_loader": {
376
- key: "collab.preview_loader",
377
- name: "Collab preview loader",
378
- description: "Allows immutable version URLs to receive a no-secret preview overlay configuration.",
379
- defaultEnabled: false,
380
- enabledInDevelopment: true,
381
- enabledForA8c: true,
382
- planDefaults: {},
383
- },
384
- "collab.comments": {
385
- key: "collab.comments",
386
- name: "Comments",
387
- description: "Enables Cast-backed comments on eligible immutable version URLs.",
388
- defaultEnabled: false,
389
- enabledInDevelopment: true,
390
- enabledForA8c: true,
391
- planDefaults: {},
392
- },
393
- "collab.anonymous_commenters": {
394
- key: "collab.anonymous_commenters",
395
- name: "Anonymous commenters",
396
- description: "Allows anyone with the link to comment when space policy allows it.",
397
- defaultEnabled: false,
398
- enabledForA8c: true,
399
- planDefaults: {},
400
- },
401
- "collab.cli": {
402
- key: "collab.cli",
403
- name: "Comments CLI access",
404
- description: "Enables scriptable comment read, export, reply, and archive operations.",
405
- defaultEnabled: false,
406
- enabledInDevelopment: true,
407
- enabledForA8c: true,
408
- planDefaults: {},
409
- },
410
- "collab.notices": {
411
- key: "collab.notices",
412
- name: "Realtime notices",
413
- description: "Reserved kill-switch for future realtime preview notices.",
414
- defaultEnabled: false,
415
- enabledForA8c: true,
416
- planDefaults: {},
417
- },
418
- "collab.published_comments": {
419
- key: "collab.published_comments",
420
- name: "Published host comments",
421
- description: "Allows the Collab overlay to mount comments on a space's live/published host, not just immutable preview URLs.",
422
- defaultEnabled: false,
423
- // ON in local dev so the Spacefast-native published path is exercised end-to-end
424
- // alongside collab.comments (which already defaults on in dev).
425
- // Production stays gated behind the per-space toggle.
426
- enabledInDevelopment: true,
427
- enabledForA8c: true,
428
- planDefaults: {},
429
- },
430
- "collab.drawing": {
431
- key: "collab.drawing",
432
- name: "Collab drawing",
433
- description: "Enables drawing feedback in the Collab overlay.",
434
- defaultEnabled: true,
435
- enabledInDevelopment: true,
436
- enabledForA8c: true,
437
- planDefaults: {},
438
- },
439
- "sites.dedicated_runtime": {
440
- key: "sites.dedicated_runtime",
441
- name: "Dedicated runtime sites",
442
- description: "Allows teams to create dedicated WP.Cloud sites and place team spaces on them.",
443
- defaultEnabled: false,
444
- enabledInDevelopment: true,
445
- enabledForA8c: true,
446
- planDefaults: {},
447
- },
448
- shelf: {
449
- key: "shelf",
450
- name: "Shelf",
451
- description: "Exposes the per-user artifact shelf: dashboard curation and public /shelf/{handle} pages.",
452
- defaultEnabled: false,
453
- enabledInDevelopment: true,
454
- enabledForA8c: true,
455
- planDefaults: {},
456
- },
457
- tags: {
458
- key: "tags",
459
- name: "Spacefast Tag Manager",
460
- description: "Enables Spacefast Tag Manager command surfaces, SDK configuration, and governed tag workflows.",
461
- defaultEnabled: false,
462
- enabledInDevelopment: true,
463
- enabledForA8c: true,
464
- planDefaults: {},
465
- },
466
- zero: {
467
- key: "zero",
468
- name: "Spacefast Zero",
469
- description: "Enables Spacefast Zero command surfaces and hosted Zero app workflows.",
470
- defaultEnabled: false,
471
- enabledForA8c: true,
472
- planDefaults: {},
473
- },
474
- // Access product phases (access-plan §7, X-42). Shipped surfaces default on;
475
- // later-stage identity-provider pieces stay override-gated until they are
476
- // ready for the main product path. When the lifecycle registry (stage +
477
- // docsSlug, internal-docs/feature-lifecycle-plan.html) lands, these migrate
478
- // onto it.
479
- "access.share_links": {
480
- key: "access.share_links",
481
- name: "Share links",
482
- description: "Enables the Share modal's sharing projection, the general-access selector, and share-link create/copy/revoke (access-plan §5.1/§5.2).",
483
- defaultEnabled: true,
484
- enabledInDevelopment: true,
485
- enabledForA8c: true,
486
- planDefaults: {},
487
- },
488
- "access.invites": {
489
- key: "access.invites",
490
- name: "Space invites",
491
- description: "Enables account-less viewer invites with magic-link accept and the request-access loop (access-plan §5.3/§5.4).",
492
- defaultEnabled: false,
493
- enabledInDevelopment: true,
494
- enabledForA8c: true,
495
- planDefaults: {},
496
- },
497
- "access.firewall_card": {
498
- key: "access.firewall_card",
499
- name: "Firewall card",
500
- description: "Enables the managed firewall block card (country/IP/bot rules) in space access settings (access-plan §5.6).",
501
- defaultEnabled: true,
502
- enabledInDevelopment: true,
503
- enabledForA8c: true,
504
- planDefaults: {},
505
- },
506
- "access.sso_connections": {
507
- key: "access.sso_connections",
508
- name: "Company SSO connections",
509
- description: "Enables team-level OIDC connections minted at the authorize endpoint (access-plan §6.2, X-18).",
510
- defaultEnabled: false,
511
- enabledInDevelopment: true,
512
- enabledForA8c: true,
513
- planDefaults: {},
514
- },
515
- "access.byo_issuers": {
516
- key: "access.byo_issuers",
517
- name: "Bring-your-own issuers",
518
- description: "Enables owner-held external token issuers with ext:-namespace binding (access-plan §6.3, X-19).",
519
- defaultEnabled: false,
520
- enabledInDevelopment: true,
521
- enabledForA8c: true,
522
- planDefaults: {},
523
- },
524
- "access.views_panel": {
525
- key: "access.views_panel",
526
- name: "Views panel",
527
- description: "Enables the identified who-viewed-what panel riding the analytics tiers (access-plan §5.6b, X-28).",
528
- defaultEnabled: true,
529
- enabledInDevelopment: true,
530
- enabledForA8c: true,
531
- planDefaults: {},
532
- },
533
- };
234
+ export const FEATURE_DEFINITIONS = FEATURE_RUNTIME_DEFINITIONS;
534
235
  export const featureStateSourceSchema = z
535
236
  .enum(["kill_switch", "env", "override", "default"])
536
237
  .describe("Layer that decided the flag: kill_switch (emergency off), env (SPACEFAST_FLAG_* variable), " +